{"behavior":"degenerate_repetition","label_filter":null,"limit":10,"next_offset":38299,"offset":38289,"previous_offset":null,"rows":[{"assistant_initiates":false,"asst_text":"Hello! I'm doing well, thank you. How can I assist you today?","behavior":"degenerate_repetition","conversation_hash":"1f2041611b8beff6b7602ece1f622dba","conversation_redacted":false,"conversation_toxic":false,"country":"United States","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4.1-mini-2025-04-14","n_chars":118,"n_turns_in_conversation":1,"n_words":23,"source_row_offset":38289,"source_shard":"turns-00079.parquet","timestamp":"Thu, 15 May 2025 05:37:20 GMT","turn_id":"63650dd97169c16fe03e45d1","turn_index":0,"user_text":"User: hi, how are you?\nUser: hi, how are you?\nAssistant:"},{"assistant_initiates":false,"asst_text":"Acara jumpa fans biasanya diadakan di berbagai tempat, antara lain:\n\n1. Mall atau pusat perbelanjaan\n2. Aula atau gedung serbaguna\n3. Kafe atau restoran yang memiliki area khusus\n4. Studio televisi atau radio saat acara siaran langsung\n5. Tempat konser atau festival musik\n6. Event khusus seperti peluncuran album, film, atau produk\n7. Convention center atau pameran\n\nJika kamu ingin tahu jadwal atau lokasi jumpa fans dari artis tertentu, biasanya informasi tersebut diumumkan di media sosial resmi artis atau melalui situs resmi penyelenggara acara. Apakah kamu mencari informasi jumpa fans dari artis atau grup tertentu?","behavior":"degenerate_repetition","conversation_hash":"846605d69d6c1003b6f2631b326c6d5e","conversation_redacted":false,"conversation_toxic":false,"country":"China","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Indonesian","model":"gpt-4.1-mini-2025-04-14","n_chars":704,"n_turns_in_conversation":1,"n_words":108,"source_row_offset":38290,"source_shard":"turns-00079.parquet","timestamp":"Thu, 15 May 2025 05:37:23 GMT","turn_id":"6017c85c3a25e5a50ebeee88","turn_index":0,"user_text":"User: acara jumpa fans dimana saja\nUser: acara jumpa fans dimana saja\nAssistant:"},{"assistant_initiates":false,"asst_text":"Berikut adalah jawaban untuk pertanyaan yang Anda berikan:\n\n1. **Al-Sami**  \n2. **Al-Qur\u2019an dan hadist**  \n3. **Timbulnya keikhlasan**  \n4. **Mendapatkan kebahagiaan dunia**  \n5. **Sahwi**  \n6. **Syukur**  \n7. **Rakib dan Atid**  \n8. **Ridwan**  \n9. **Gibah**  \n10. **Mengklarifikasi berita tersebut terlebih dahulu**  \n11. **Menyampaikan**  \n12. **Al-\u2018Alaq**  \n13. **Memberi kabar gembira dan peringatan**  \n14. **2**  \n15. **Nabi Musa AS**  \n16. **Meneladani akhlak Rasulullah SAW**  \n17. **Nabi Ibrahim AS**  \n18. **40 tahun**  \n19. **Menyela ibadah teman karena ingin bermain**  \n20. **Menghormati perbedaan tanpa meninggalkan keyakinan sendiri**  \n21. **idzhar**  \n22. **\u0645\u0650\u0646\u0652 \u0631\u064e\u0628\u0651\u0650\u0647\u0650\u0645\u0652**  \n23. **Dimasukkan**  \n24. **\u0646**  \n25. **ikhfa**  \n26. **Meninggikan derajat seseorang di sisi Allah**  \n27. **membaca**  \n28. **Menjaga amal dan menjauhi maksiat**  \n29. **Semua amalan manusia akan dibalas**  \n30. **Tanggung jawab dan mawas diri**  \n31. **Berkata benar dan tidak menyakiti**  \n32. **Menjaga pandangan dan sikap sopan**  \n33. **Mengolok-olok dan mencela orang lain**  \n34. **Terjalinnya hubungan harmonis dan damai**  \n35. **Sebagai bentuk rasa syukur kepada Allah**  \n36. **Wujud syukur dan saling berbagi kepada sesama**  \n37. **Kambing atau domba**  \n38. **2 ekor**  \n39. **hari ke 7**  \n40. **Memberi nama anak dan mencukur rambutnya**  \n41. **Khilafah Islamiyah**  \n42. **Osman I**  \n43. **Konstatinopel**  \n44. **ketentuan**  \n45. **rukun iman**  \n46. **Menjaga nilai-nilai tauhid dan etika Islam**  \n47. **Kubah dan menara**  \n48. **Syafi\u2019i**  \n49. **India, Pakistan, Turki**  \n50. **Imam Abu Hanifah**\n\nSemoga membantu! Jika ada pertanyaan tambahan, silakan ditanyakan.","behavior":"degenerate_repetition","conversation_hash":"814a0c03583a8eac085e4b10ce525bea","conversation_redacted":false,"conversation_toxic":false,"country":"China","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Indonesian","model":"gpt-4.1-mini-2025-04-14","n_chars":18620,"n_turns_in_conversation":1,"n_words":2779,"source_row_offset":38291,"source_shard":"turns-00079.parquet","timestamp":"Thu, 15 May 2025 05:37:49 GMT","turn_id":"f31aa9f06cb152d5b35dddde","turn_index":0,"user_text":"User: Setiap suara di alam semesta terdengar oleh Allah SWT. Pendengaran-Nya tidak terbatas, tidak ada satu suarapun yang luput dari-Nya. Dalam hal ini Allah SWT memiliki sifat\u2026\u2026...\n*\n2 points\nAl-Sami\nAl-Basir\nAl-Alim\nAl-Khabir\n2. Untuk membuktikan kebenaran Allah SWt. Dapat dipergunakan dalil naqli dan dalil aqli. Dalil naqli adalah dalil yang berdasarkan\u2026\u2026..\n*\n2 points\nPemikiran yang matang\nPendapat cendikiawan\nAl-Qur\u2019an dan hadist\nHukum yang berlaku\n3. Orang yang melaksanakan sholat semata-mata karena Allah Swt, dan berkeinginan hanya untuk menggapai keridhoannnya. Merupakan perwujudan dari salah satu sasaran tujuan melaksanakan salat yaitu\u2026\u2026..\n\n*\n2 points\nTimbulnya keinkhlasan\nTimbulnya ketaqwaan kepada Allah Swt\nAdanya perasaan nyaman dan tentram\nTimbulnya kekacauan\n4. Berikut ini hikmah salat fardu dalam menjadi  kehidupan, kecuali\u2026\u2026\u2026\n*\n2 points\nMembiasakan disiplin\nMembiasakan hidup bersosial\nMendapatkan kebahagiaan dunia\nSaran pembentukan kepribadian muslim\n5. Ketika sedang melakukan salat magrib ransi ragu terhadapa jumlah rakaatnya, sehingga sebelum salam ia melakukan sujud\u2026\u2026\n*\n2 points\nTilawah\nSyukur\nSujud rukun\nSahwi\n6. Pada saat menerima pengumuman hasil ujian seorang siswa SMP ternyata memperoleh nilai yang memuaskan. Sebagai seorang seorang muslim yang baik, disunahkan untuk mengerjakan sujud\u2026\u2026.\n*\n2 points\nSyukur\nTilawah\nSahwi\nRukun\n7. Angga mengerjakan soal ujian tanpa menyontek, walaupun banyak kesempatan dan tidak ada pengawas di ruangan. Sikap tersebut menunjukkan bahwa ia beriman kepada malaikat\u2026\u2026..\n*\n2 points\nJibril\nMikail\nRakib dan Atid\nIsrafil\n8. Kita harus sesalu melaksanakan semua perintah Allah Swt. Dan menjauhi segala larangan-nya agar di akhirat dapat balasan surganya Allah Swt. Hal ini cerminan dari iman kepada malaikat\u2026\u2026\u2026..\n*\n2 points\nRidwan\nJibril\nMIkail\nIsrafil\n9. Membicaarakan Aib yang ada pada diri seseorang dengan maksud untuk merendahkan harga dirinya dinamakan\u2026\u2026.\n*\n2 points\nHasud\nGibah\nDendam\nBuruk Sangka\n10. Ketika mendengar berita dari media sosial yang merugikan kita, sikap kita adalah\u2026\u2026\u2026..\n*\n2 points\nMenerima berita dengan senang hati\nMencari sumber berita tersebut\nMarah dengan yang memberikan berita\nMengklarifikasi berita tersebut terlebih dahulu\n11.  Salah satu sifat terpuji Nabi Muhammad SAW adalah tabligh. Arti dari tabligh adalah...\n*\n2 points\nJujur\ndapat di percaya\nMenyampaikan\ncerdas\n12.  Perintah untuk menuntut ilmu tercantum dalam Al-Qur\u2019an surat...\n*\n2 points\nAl-Falaq\nAl-\u2018Alaq\nAl-Kautsar\nAl-Ikhlas\n13.  Tujuan utama Allah SWT menurunkan rasul kepada umat manusia adalah...\n*\n2 points\nMenjadi pemimpin negara\nMenjelaskan hukum-hukum dunia\nMemberi kabar gembira dan peringatan\nMengetahui sejarah dunia\n14.  Iman kepada rasul termasuk rukun iman yang ke...\n*\n2 points\n1\n2\n3\n4\n15.  Rasul yang pertama kali menerima wahyu berupa kitab adalah...\n*\n2 points\nNabi Musa AS\nNabi Isa AS\nNabi Muhammad SAW\nNabi Ibrahim AS\n16.  Perilaku yang mencerminkan iman kepada rasul adalah...\n*\n2 points\nsuka mencontek saat ujian\nMeneladani akhlak Rasulullah SAW\nMalas beribadah\nMemusuhi teman yang berbeda agama\n17.  Nabi yang mendapat gelar Khalilullah adalah...\n*\n2 points\nNabi Nuh AS\nNabi Isa AS\nNabi Ibrahim AS\nNabi Muhammad SAW\n18.  Nabi Muhammad SAW diangkat menjadi rasul pada usia...\n*\n2 points\n25 tahun\n30 tahun\n35 tahun\n40 tahun\n19.   Berikut ini adalah contoh sikap toleransi dalam kehidupan sehari-hari, kecuali...\n*\n2 points\nMenghargai teman yang berbeda agama saat mereka beribadah\nMenyela ibadah teman karena ingin bermain\nMengucapkan selamat kepada teman saat hari rayanya\nMenghormati perbedaan pendapat dalam diskusi\n20.  Toleransi dalam Islam berarti...\n*\n2 points\nMenyamakan semua ajaran agama\nMembiarkan orang lain melakukan kesalahan\nMenghormati perbedaan tanpa meninggalkan keyakinan sendiri\nMengikuti semua tradisi yang berbeda\n21.  Bacaan nun mati atau tanwin yang dibaca jelas dan tidak berdengung disebut...\n*\n2 points\nIdgham\nidzhar\nikhfa\niklab\n22.  Contoh bacaan ikhfa adalah...\n*\n2 points\n\u0645\u0650\u0646\u0652 \u0631\u064e\u0628\u0651\u0650\u0647\u0650\u0645\u0652\n\u0645\u064e\u0646\u0652 \u064a\u064e\u0642\u064f\u0648\u0644\u064f\n\u0623\u064e\u0646\u0652\u0639\u064e\u0645\u0652\u062a\u064e\n\u0645\u0650\u0646\u0652 \u0628\u064e\u0639\u0652\u062f\u0650\n23.  Hukum bacaan nun mati apabila bertemu huruf-huruf idgham adalah...\n*\n2 points\nDibaca jelas\nDibaca samar\nDimasukkan\nDibalik\n24.  Di bawah ini merupakan huruf-huruf idgham bighunnah, kecuali...\n*\n2 points\n\u064a\n\u0645\n\u0646\n\u0648\n25.  Hukum bacaan nun mati pada lafal \"\u0645\u0650\u0646\u0652 \u0628\u064e\u0639\u0652\u062f\u0650\" adalah...\n*\n2 points\niklab\nikhfa\nidghom\nidzhar\n26.  Salah satu manfaat menuntut ilmu menurut ajaran Islam adalah...\n*\n2 points\nMemperoleh kekayaan secara cepat\nMeninggikan derajat seseorang di sisi Allah\nMenjadi terkenal di masyarakat\nBisa membantah orang lain\n27.  Ayat pertama yang turun kepada Nabi Muhammad SAW berisi perintah untuk...\n*\n2 points\nbergadang\nsholat\nberibadah\nmembaca\n28.  Salah satu tanda orang yang meyakini hari akhir adalah...\n*\n2 points\nSelalu mengejar kesenangan dunia\nMenjaga amal dan menjauhi maksiat\nTidak peduli pada ibadah\nMenunda-nunda kebaikan\n29.  Hari akhir disebut juga dengan hari pembalasan karena...\n*\n2 points\nSemua orang akan kembali muda\nSemua amalan manusia akan dibalas\nDunia akan menjadi lebih indah\nWaktu akan berhenti berjalan\n30.  Meyakini datangnya hari akhir dapat menumbuhkan sikap...\n*\n2 points\nSerakah dalam mencari harta\nPutus asa terhadap masa depan\nTanggung jawab dan mawas diri\nTakut bersaing dengan orang lain\n31.  Salah satu adab berbicara dalam Islam adalah...\n*\n2 points\nMenaikkan suara agar didengar\nMenghina lawan bicara jika salah\nBerkata benar dan tidak menyakiti\nMenyela pembicaraan orang lain\n32.  Etika pergaulan terhadap lawan jenis yang benar menurut Islam adalah...\n*\n2 points\nBebas bergaul asal tidak berduaan\nMenjaga pandangan dan sikap sopan\nSaling bersentuhan jika sudah akrab\nTidak perlu membatasi hubungan\n33.  Firman Allah dalam QS. Al-Hujurat ayat 11 melarang kita untuk...\n*\n2 points\nBerpuasa tanpa sahur\nBerdebat dengan keras\nMengolok-olok dan mencela orang lain\nBertanya tentang hal ghaib\n34.  Dampak dari komunikasi yang baik dalam pergaulan adalah...\n2 points\nMudah dipengaruhi pergaulan bebas\nDijauhi karena terlalu serius\nTerjalinnya hubungan harmonis dan damai\nSering terjadi konflik dan salah paham\n35.  Mengapa kita dianjurkan untuk melaksanakan akikah setelah kelahiran anak......\n*\n2 points\nSebagai bentuk pesta untuk keluarga\nAgar anak cepat tumbuh besar\nSebagai bentuk rasa syukur kepada Allah\nUntuk menunjukkan kekayaan orang tua\n36.  Apa persamaan dari akikah dan kurban?\n*\n2 points\nDilakukan di bulan Ramadan\nWujud syukur dan saling berbagi kepada sesama\nSebagai bentuk pengorbanan pribadi\nKeduanya hanya wajib bagi laki-laki\n37.  Hewan yang disembelih untuk aqiqah adalah......\n2 points\nKambing atau domba\nsapi dan unta\nayam dan kambing\nsapi dan kerbau\n38.  Berapa jumlah kambing yang disunnahkan untuk anak laki-laki dalam aqiqah.....\n*\n2 points\n1 ekor\n2 ekor\n3 ekor\n4 ekor\n39.  Kapan waktu yang paling utama untuk melaksanakan aqiqah..........\n*\n2 points\nhari ke 6\nhari ke 7\nhari ke 8\nhari ke 9\n40.  Salah satu sunnah ketika melakukan aqiqah adalah........\n*\n2 points\nMemandikan anak dengan air zam-zam\nMemberi nama anak dan mencukur rambutnya\nMengundang semua warga desa\nMemberikan susu kepada anak yatim\n41.  Apa yang menjadi ciri utama sistem pemerintahan Daulah Utsmaniyah.......\n*\n2 points\nMonarki absolut\nDemokrasi langsung\nKhilafah Islamiyah\nRepublik parlementer\n42.  Siapakah pendiri Daulah Utsmaniyah........\n*\n2 points\nSultan Mehmed II\nOsman I\nSelim I\nMurad II\n43.  Kota manakah yang ditaklukkan oleh Sultan Mehmed II dan dijadikan ibu kota Daulah Utsmaniyah.....\n*\n2 points\nDamaskus\nKonstatinopel\nBaghdad\nKairo\n44.  Arti dari qada secara bahasa adalah\u2026\n*\n2 points\nUkuran\nketentuan\nbalasan\ntakdir\n45.  Meyakini bahwa segala sesuatu yang terjadi di dunia ini telah ditetapkan oleh Allah SWT termasuk dalam\u2026\n*\n2 points\nRukun Islam\nrukun iman\nHukum syariat\nilmu kalam\n46.  Ciri utama seni dalam Islam adalah\u2026\n*\n2 points\nBebas tanpa batas\nMeniru seni Barat\nMenjaga nilai-nilai tauhid dan etika Islam\nMengagungkan manusia\n47.  Gaya arsitektur masjid yang khas dalam seni Islam ditandai dengan\u2026\n*\n2 points\nPatung-patung\nsalib\nKubah dan menara\nLukisan makhluk hidup\n48.  Mazhab yang dikenal paling luas diikuti di wilayah Asia Tenggara adalah...\n*\n2 points\nHanafi\nmaliki\nSyafi\u2019i\nhambali\n49.  Mazhab Hanafi banyak dianut di wilayah...\n*\n2 points\nAfrika Utara\nIndia, Pakistan, Turki\nIndonesia dan Malaysia\nArab Saudi\n50.  Manakah dari imam berikut yang hidup paling awal..........\n*\n2 points\nImam Abu Hanifah\nImam Syafi\u2019i\nImam Malik\nImam Ahmad bin Hanbal\nUser: Setiap suara di alam semesta terdengar oleh Allah SWT. Pendengaran-Nya tidak terbatas, tidak ada satu suarapun yang luput dari-Nya. Dalam hal ini Allah SWT memiliki sifat\u2026\u2026...\n*\n2 points\nAl-Sami\nAl-Basir\nAl-Alim\nAl-Khabir\n2. Untuk membuktikan kebenaran Allah SWt. Dapat dipergunakan dalil naqli dan dalil aqli. Dalil naqli adalah dalil yang berdasarkan\u2026\u2026..\n*\n2 points\nPemikiran yang matang\nPendapat cendikiawan\nAl-Qur\u2019an dan hadist\nHukum yang berlaku\n3. Orang yang melaksanakan sholat semata-mata karena Allah Swt, dan berkeinginan hanya untuk menggapai keridhoannnya. Merupakan perwujudan dari salah satu sasaran tujuan melaksanakan salat yaitu\u2026\u2026..\n\n*\n2 points\nTimbulnya keinkhlasan\nTimbulnya ketaqwaan kepada Allah Swt\nAdanya perasaan nyaman dan tentram\nTimbulnya kekacauan\n4. Berikut ini hikmah salat fardu dalam menjadi  kehidupan, kecuali\u2026\u2026\u2026\n*\n2 points\nMembiasakan disiplin\nMembiasakan hidup bersosial\nMendapatkan kebahagiaan dunia\nSaran pembentukan kepribadian muslim\n5. Ketika sedang melakukan salat magrib ransi ragu terhadapa jumlah rakaatnya, sehingga sebelum salam ia melakukan sujud\u2026\u2026\n*\n2 points\nTilawah\nSyukur\nSujud rukun\nSahwi\n6. Pada saat menerima pengumuman hasil ujian seorang siswa SMP ternyata memperoleh nilai yang memuaskan. Sebagai seorang seorang muslim yang baik, disunahkan untuk mengerjakan sujud\u2026\u2026.\n*\n2 points\nSyukur\nTilawah\nSahwi\nRukun\n7. Angga mengerjakan soal ujian tanpa menyontek, walaupun banyak kesempatan dan tidak ada pengawas di ruangan. Sikap tersebut menunjukkan bahwa ia beriman kepada malaikat\u2026\u2026..\n*\n2 points\nJibril\nMikail\nRakib dan Atid\nIsrafil\n8. Kita harus sesalu melaksanakan semua perintah Allah Swt. Dan menjauhi segala larangan-nya agar di akhirat dapat balasan surganya Allah Swt. Hal ini cerminan dari iman kepada malaikat\u2026\u2026\u2026..\n*\n2 points\nRidwan\nJibril\nMIkail\nIsrafil\n9. Membicaarakan Aib yang ada pada diri seseorang dengan maksud untuk merendahkan harga dirinya dinamakan\u2026\u2026.\n*\n2 points\nHasud\nGibah\nDendam\nBuruk Sangka\n10. Ketika mendengar berita dari media sosial yang merugikan kita, sikap kita adalah\u2026\u2026\u2026..\n*\n2 points\nMenerima berita dengan senang hati\nMencari sumber berita tersebut\nMarah dengan yang memberikan berita\nMengklarifikasi berita tersebut terlebih dahulu\n11.  Salah satu sifat terpuji Nabi Muhammad SAW adalah tabligh. Arti dari tabligh adalah...\n*\n2 points\nJujur\ndapat di percaya\nMenyampaikan\ncerdas\n12.  Perintah untuk menuntut ilmu tercantum dalam Al-Qur\u2019an surat...\n*\n2 points\nAl-Falaq\nAl-\u2018Alaq\nAl-Kautsar\nAl-Ikhlas\n13.  Tujuan utama Allah SWT menurunkan rasul kepada umat manusia adalah...\n*\n2 points\nMenjadi pemimpin negara\nMenjelaskan hukum-hukum dunia\nMemberi kabar gembira dan peringatan\nMengetahui sejarah dunia\n14.  Iman kepada rasul termasuk rukun iman yang ke...\n*\n2 points\n1\n2\n3\n4\n15.  Rasul yang pertama kali menerima wahyu berupa kitab adalah...\n*\n2 points\nNabi Musa AS\nNabi Isa AS\nNabi Muhammad SAW\nNabi Ibrahim AS\n16.  Perilaku yang mencerminkan iman kepada rasul adalah...\n*\n2 points\nsuka mencontek saat ujian\nMeneladani akhlak Rasulullah SAW\nMalas beribadah\nMemusuhi teman yang berbeda agama\n17.  Nabi yang mendapat gelar Khalilullah adalah...\n*\n2 points\nNabi Nuh AS\nNabi Isa AS\nNabi Ibrahim AS\nNabi Muhammad SAW\n18.  Nabi Muhammad SAW diangkat menjadi rasul pada usia...\n*\n2 points\n25 tahun\n30 tahun\n35 tahun\n40 tahun\n19.   Berikut ini adalah contoh sikap toleransi dalam kehidupan sehari-hari, kecuali...\n*\n2 points\nMenghargai teman yang berbeda agama saat mereka beribadah\nMenyela ibadah teman karena ingin bermain\nMengucapkan selamat kepada teman saat hari rayanya\nMenghormati perbedaan pendapat dalam diskusi\n20.  Toleransi dalam Islam berarti...\n*\n2 points\nMenyamakan semua ajaran agama\nMembiarkan orang lain melakukan kesalahan\nMenghormati perbedaan tanpa meninggalkan keyakinan sendiri\nMengikuti semua tradisi yang berbeda\n21.  Bacaan nun mati atau tanwin yang dibaca jelas dan tidak berdengung disebut...\n*\n2 points\nIdgham\nidzhar\nikhfa\niklab\n22.  Contoh bacaan ikhfa adalah...\n*\n2 points\n\u0645\u0650\u0646\u0652 \u0631\u064e\u0628\u0651\u0650\u0647\u0650\u0645\u0652\n\u0645\u064e\u0646\u0652 \u064a\u064e\u0642\u064f\u0648\u0644\u064f\n\u0623\u064e\u0646\u0652\u0639\u064e\u0645\u0652\u062a\u064e\n\u0645\u0650\u0646\u0652 \u0628\u064e\u0639\u0652\u062f\u0650\n23.  Hukum bacaan nun mati apabila bertemu huruf-huruf idgham adalah...\n*\n2 points\nDibaca jelas\nDibaca samar\nDimasukkan\nDibalik\n24.  Di bawah ini merupakan huruf-huruf idgham bighunnah, kecuali...\n*\n2 points\n\u064a\n\u0645\n\u0646\n\u0648\n25.  Hukum bacaan nun mati pada lafal \"\u0645\u0650\u0646\u0652 \u0628\u064e\u0639\u0652\u062f\u0650\" adalah...\n*\n2 points\niklab\nikhfa\nidghom\nidzhar\n26.  Salah satu manfaat menuntut ilmu menurut ajaran Islam adalah...\n*\n2 points\nMemperoleh kekayaan secara cepat\nMeninggikan derajat seseorang di sisi Allah\nMenjadi terkenal di masyarakat\nBisa membantah orang lain\n27.  Ayat pertama yang turun kepada Nabi Muhammad SAW berisi perintah untuk...\n*\n2 points\nbergadang\nsholat\nberibadah\nmembaca\n28.  Salah satu tanda orang yang meyakini hari akhir adalah...\n*\n2 points\nSelalu mengejar kesenangan dunia\nMenjaga amal dan menjauhi maksiat\nTidak peduli pada ibadah\nMenunda-nunda kebaikan\n29.  Hari akhir disebut juga dengan hari pembalasan karena...\n*\n2 points\nSemua orang akan kembali muda\nSemua amalan manusia akan dibalas\nDunia akan menjadi lebih indah\nWaktu akan berhenti berjalan\n30.  Meyakini datangnya hari akhir dapat menumbuhkan sikap...\n*\n2 points\nSerakah dalam mencari harta\nPutus asa terhadap masa depan\nTanggung jawab dan mawas diri\nTakut bersaing dengan orang lain\n31.  Salah satu adab berbicara dalam Islam adalah...\n*\n2 points\nMenaikkan suara agar didengar\nMenghina lawan bicara jika salah\nBerkata benar dan tidak menyakiti\nMenyela pembicaraan orang lain\n32.  Etika pergaulan terhadap lawan jenis yang benar menurut Islam adalah...\n*\n2 points\nBebas bergaul asal tidak berduaan\nMenjaga pandangan dan sikap sopan\nSaling bersentuhan jika sudah akrab\nTidak perlu membatasi hubungan\n33.  Firman Allah dalam QS. Al-Hujurat ayat 11 melarang kita untuk...\n*\n2 points\nBerpuasa tanpa sahur\nBerdebat dengan keras\nMengolok-olok dan mencela orang lain\nBertanya tentang hal ghaib\n34.  Dampak dari komunikasi yang baik dalam pergaulan adalah...\n2 points\nMudah dipengaruhi pergaulan bebas\nDijauhi karena terlalu serius\nTerjalinnya hubungan harmonis dan damai\nSering terjadi konflik dan salah paham\n35.  Mengapa kita dianjurkan untuk melaksanakan akikah setelah kelahiran anak......\n*\n2 points\nSebagai bentuk pesta untuk keluarga\nAgar anak cepat tumbuh besar\nSebagai bentuk rasa syukur kepada Allah\nUntuk menunjukkan kekayaan orang tua\n36.  Apa persamaan dari akikah dan kurban?\n*\n2 points\nDilakukan di bulan Ramadan\nWujud syukur dan saling berbagi kepada sesama\nSebagai bentuk pengorbanan pribadi\nKeduanya hanya wajib bagi laki-laki\n37.  Hewan yang disembelih untuk aqiqah adalah......\n2 points\nKambing atau domba\nsapi dan unta\nayam dan kambing\nsapi dan kerbau\n38.  Berapa jumlah kambing yang disunnahkan untuk anak laki-laki dalam aqiqah.....\n*\n2 points\n1 ekor\n2 ekor\n3 ekor\n4 ekor\n39.  Kapan waktu yang paling utama untuk melaksanakan aqiqah..........\n*\n2 points\nhari ke 6\nhari ke 7\nhari ke 8\nhari ke 9\n40.  Salah satu sunnah ketika melakukan aqiqah adalah........\n*\n2 points\nMemandikan anak dengan air zam-zam\nMemberi nama anak dan mencukur rambutnya\nMengundang semua warga desa\nMemberikan susu kepada anak yatim\n41.  Apa yang menjadi ciri utama sistem pemerintahan Daulah Utsmaniyah.......\n*\n2 points\nMonarki absolut\nDemokrasi langsung\nKhilafah Islamiyah\nRepublik parlementer\n42.  Siapakah pendiri Daulah Utsmaniyah........\n*\n2 points\nSultan Mehmed II\nOsman I\nSelim I\nMurad II\n43.  Kota manakah yang ditaklukkan oleh Sultan Mehmed II dan dijadikan ibu kota Daulah Utsmaniyah.....\n*\n2 points\nDamaskus\nKonstatinopel\nBaghdad\nKairo\n44.  Arti dari qada secara bahasa adalah\u2026\n*\n2 points\nUkuran\nketentuan\nbalasan\ntakdir\n45.  Meyakini bahwa segala sesuatu yang terjadi di dunia ini telah ditetapkan oleh Allah SWT termasuk dalam\u2026\n*\n2 points\nRukun Islam\nrukun iman\nHukum syariat\nilmu kalam\n46.  Ciri utama seni dalam Islam adalah\u2026\n*\n2 points\nBebas tanpa batas\nMeniru seni Barat\nMenjaga nilai-nilai tauhid dan etika Islam\nMengagungkan manusia\n47.  Gaya arsitektur masjid yang khas dalam seni Islam ditandai dengan\u2026\n*\n2 points\nPatung-patung\nsalib\nKubah dan menara\nLukisan makhluk hidup\n48.  Mazhab yang dikenal paling luas diikuti di wilayah Asia Tenggara adalah...\n*\n2 points\nHanafi\nmaliki\nSyafi\u2019i\nhambali\n49.  Mazhab Hanafi banyak dianut di wilayah...\n*\n2 points\nAfrika Utara\nIndia, Pakistan, Turki\nIndonesia dan Malaysia\nArab Saudi\n50.  Manakah dari imam berikut yang hidup paling awal..........\n*\n2 points\nImam Abu Hanifah\nImam Syafi\u2019i\nImam Malik\nImam Ahmad bin Hanbal\nAssistant:"},{"assistant_initiates":false,"asst_text":"\u00a1Hola! \u00bfEn qu\u00e9 puedo ayudarte hoy?","behavior":"degenerate_repetition","conversation_hash":"acbcda4950de08bd0d3b990fb75ade34","conversation_redacted":false,"conversation_toxic":false,"country":"Mexico","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Sotho","model":"gpt-4.1-mini-2025-04-14","n_chars":39,"n_turns_in_conversation":1,"n_words":7,"source_row_offset":38292,"source_shard":"turns-00079.parquet","timestamp":"Thu, 15 May 2025 05:38:19 GMT","turn_id":"767ba7b9ef23b3b5f8e25626","turn_index":0,"user_text":"hola"},{"assistant_initiates":false,"asst_text":"\u0644\u0625\u0636\u0627\u0641\u0629 \u0623\u0648\u0642\u0627\u062a \u062c\u062f\u0648\u0644 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0625\u0636\u0627\u0641\u064a\u0629 (\u0628\u062e\u0644\u0627\u0641 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u0648\u062c\u0648\u062f\u0629 9 \u0635\u0628\u0627\u062d\u0627\u064b\u060c 12 \u0638\u0647\u0631\u0627\u064b\u060c 4 \u0639\u0635\u0631\u0627\u064b\u060c 8 \u0645\u0633\u0627\u0621\u064b)\u060c \u064a\u0645\u0643\u0646\u0643 \u0628\u0628\u0633\u0627\u0637\u0629 \u0625\u0636\u0627\u0641\u0629 \u0623\u0632\u0631\u0627\u0631 \u062c\u062f\u064a\u062f\u0629 \u0645\u0639 \u0642\u064a\u0645\u0629 `callback_data` \u0645\u0646\u0627\u0633\u0628\u0629 \u0641\u064a \u0645\u0643\u0627\u0646 \u0639\u0631\u0636 \u062e\u064a\u0627\u0631\u0627\u062a \u0627\u0644\u062c\u062f\u0648\u0644\u0629\u060c \u0628\u0627\u0644\u0625\u0636\u0627\u0641\u0629 \u0625\u0644\u0649 \u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0627\u0644\u0642\u064a\u0645 \u0627\u0644\u062c\u062f\u064a\u062f\u0629 \u0641\u064a \u062f\u0627\u0644\u0629 `schedule_hour`.\n\n\u0643\u0630\u0644\u0643 \u0628\u0627\u0644\u0646\u0633\u0628\u0629 \u0644\u0645\u0637\u0627\u0628\u0642\u0629 \u0648\u0642\u062a \u0627\u0646\u062a\u0647\u0627\u0621 \u0627\u0644\u0631\u0635\u064a\u062f \u0648\u0627\u0644\u062a\u062d\u0642\u0642 \u0625\u0630\u0627 \u0643\u0627\u0646 \u062a\u0628\u0642\u0649 5 \u0623\u064a\u0627\u0645 \u0623\u0648 \u0623\u0642\u0644 \u0644\u062a\u063a\u064a\u064a\u0631 \u0634\u0643\u0644 \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u060c \u064a\u0645\u0643\u0646\u0643 \u062a\u0639\u062f\u064a\u0644 \u062c\u0632\u0621 \u0628\u0646\u0627\u0621 \u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u0625\u0634\u0639\u0627\u0631 \u0628\u062d\u064a\u062b \u064a\u062a\u0636\u0645\u0646 \u062a\u062d\u0642\u0642 \u0627\u0644\u0641\u0631\u0642 \u0628\u064a\u0646 \u0627\u0644\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u062d\u0627\u0644\u064a \u0648\u062a\u0627\u0631\u064a\u062e \u0627\u0646\u062a\u0647\u0627\u0621 \u0627\u0644\u0627\u0634\u062a\u0631\u0627\u0643.\n\n---\n\n## 1. \u0625\u0636\u0627\u0641\u0629 \u0628\u0627\u0642\u064a \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u0637\u0644\u0648\u0628 \u062c\u062f\u0648\u0644\u062a\u0647\u0627\n\n\u0645\u062b\u0644\u0627\u064b \u062a\u0631\u064a\u062f \u0625\u0636\u0627\u0641\u0629 7 \u0635\u0628\u0627\u062d\u0627\u064b \u0648 10 \u0645\u0633\u0627\u0621\u064b \u0645\u062b\u0644\u0627\u064b:\n\n\u0641\u064a \u0627\u0644\u0643\u0648\u062f \u0639\u0646\u062f \u0639\u0631\u0636 \u0623\u0632\u0631\u0627\u0631 \u0627\u0644\u062c\u062f\u0648\u0644\u0629:\n\n```python\nelif query.data == 'schedule_query':\n    keyboard = [[\n        InlineKeyboardButton(\"\ud83d\udd56 7 \u0635\u0628\u0627\u062d\u0627\u064b\", callback_data='hour_7_AM'),\n        InlineKeyboardButton(\"\ud83d\udd58 9 \u0635\u0628\u0627\u062d\u0627\u064b\", callback_data='hour_9_AM'),\n        InlineKeyboardButton(\"\ud83d\udd5b 12 \u0638\u0647\u0631\u0627\u064b\", callback_data='hour_12_PM')\n    ],\n                [\n                    InlineKeyboardButton(\"\ud83d\udd53 4 \u0639\u0635\u0631\u0627\u064b\", callback_data='hour_4_PM'),\n                    InlineKeyboardButton(\"\ud83d\udd57 8 \u0645\u0633\u0627\u0621\u064b\", callback_data='hour_8_PM'),\n                    InlineKeyboardButton(\"\ud83d\udd65 10 \u0645\u0633\u0627\u0621\u064b\", callback_data='hour_10_PM')\n                ],\n                [\n                    InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')\n                ]]\n    reply_markup = InlineKeyboardMarkup(keyboard)\n    await query.edit_message_text(\n        \"\u23f0 *\u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a*\\n\"\n        \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n        \"\ud83d\udcc5 \u064a\u0631\u062c\u0649 \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0645\u0641\u0636\u0644 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u064a\u0648\u0645\u064a\\n\\n\"\n        \"\u23f1\ufe0f \u0633\u064a\u062a\u0645 \u0625\u062c\u0631\u0627\u0621 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062a\u0644\u0642\u0627\u0626\u064a\u0627\u064b \u0641\u064a \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0645\u062d\u062f\u062f\\n\\n\"\n        \"\ud83c\udfe0 \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0639\u0648\u062f\u0629 \u0644\u0644\u0645\u0628\u0627\u0634\u0631\u0629\",\n        reply_markup=reply_markup,\n        parse_mode='Markdown')\n    return SCHEDULE_HOUR\n```\n\n\u0648\u0628\u0639\u062f \u0625\u0636\u0627\u0641\u0629 callback_data \u062c\u062f\u064a\u062f \u0641\u064a \u0634\u0643\u0644 `hour_7_AM` \u0623\u0648 `hour_10_PM`\u060c \u0644\u0627 \u062d\u0627\u062c\u0629 \u0644\u062a\u0639\u062f\u064a\u0644 \u062f\u0627\u0644\u0629 `schedule_hour` \u0644\u0623\u0646 \u0627\u0644\u0643\u0648\u062f \u064a\u0639\u0627\u0644\u062c \u062c\u0645\u064a\u0639 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u062a\u064a \u062a\u0628\u062f\u0623 \u0628\u0640 `hour_` \u0628\u0634\u0643\u0644 \u062f\u064a\u0646\u0627\u0645\u064a\u0643\u064a.\n\n---\n\n## 2. \u062a\u0639\u062f\u064a\u0644 \u0634\u0643\u0644 \u0627\u0644\u0625\u0634\u0639\u0627\u0631 \u0639\u0646\u062f \u0627\u0646\u062a\u0647\u0627\u0621 \u0627\u0644\u0631\u0635\u064a\u062f \u062e\u0644\u0627\u0644 5 \u0623\u064a\u0627\u0645 \u0623\u0648 \u0623\u0642\u0644\n\n\u0628\u0645\u0627 \u0623\u0646 \u0644\u062f\u064a\u0643 \u0645\u0644\u0641 `info` \u064a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u0645\u0641\u062a\u0627\u062d `'\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621'` \u0645\u062b\u0644 `\"2024-06-30\"`, \u062a\u062d\u062a\u0627\u062c \u0644\u062a\u062d\u0644\u064a\u0644 \u0647\u0630\u0627 \u0627\u0644\u062a\u0627\u0631\u064a\u062e \u0648\u0645\u0642\u0627\u0631\u0646\u062a\u0647 \u0645\u0639 \u0627\u0644\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u062d\u0627\u0644\u064a.\n\n\u0645\u062b\u0644\u0627\u064b\u060c \u0641\u064a \u062f\u0627\u0644\u0629 `send_balance_info` \u0623\u0648 \u0641\u064a \u0627\u0644\u0645\u0643\u0627\u0646 \u0627\u0644\u0630\u064a \u062a\u0628\u0646\u064a \u0641\u064a\u0647 \u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645\u060c \u0639\u062f\u0644 \u0627\u0644\u0643\u0648\u062f \u0644\u064a\u0643\u0648\u0646:\n\n```python\nasync def send_balance_info(update, phone_number, info):\n    if info:\n        # \u062c\u0644\u0628 \u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621 \u0628\u0634\u0643\u0644 \u0635\u062d\u064a\u062d\n        end_date_str = info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', None)\n        warning_text = \"\"\n        if end_date_str:\n            try:\n                end_date = datetime.strptime(end_date_str, \"%Y-%m-%d\")\n                now_date = datetime.now(YEMEN_TZ).replace(tzinfo=None)\n                days_left = (end_date - now_date).days\n\n                if days_left <= 5 and days_left >= 0:\n                    warning_text = f\"\\n\u26a0\ufe0f *\u062a\u0646\u0628\u064a\u0647:* \u062a\u0628\u0642\u0649 \u0641\u0642\u0637 {days_left} \u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0646\u062a\u0647\u0627\u0621 \u0627\u0644\u0628\u0627\u0642\u0629!\"\n                elif days_left < 0:\n                    warning_text = \"\\n\u2757\ufe0f \u0627\u0646\u062a\u0647\u062a \u0635\u0644\u0627\u062d\u064a\u0629 \u0627\u0644\u0628\u0627\u0642\u0629.\"\n\n            except Exception as e:\n                logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0644\u064a\u0644 \u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621: {e}\")\n                # \u0644\u0627 \u062a\u0641\u0639\u0644 \u0634\u064a\u0621 \u062e\u0627\u0635 \u0625\u0630\u0627 \u0641\u0634\u0644 \u0627\u0644\u062a\u062d\u0644\u064a\u0644\n\n        response = (\n            f\"\ud83c\udf1f *\u0646\u062a\u0627\u0626\u062c \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL*\\n\"\n            f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            f\"\ud83d\udcf1 *\u0627\u0644\u0631\u0642\u0645:* `{phone_number}`\\n\\n\"\n            f\"\ud83d\udcb3 *\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a:* `{info.get('\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')}`\\n\"\n            f\"\ud83d\udce6 *\u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629:* `{info.get('\u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')}`\\n\"\n            f\"\u23f3 *\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621:* `{end_date_str if end_date_str else '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631'}`\"\n            f\"{warning_text}\\n\\n\"\n            f\"\ud83d\udd04 \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0647\u0630\u0627 \u0627\u0644\u0631\u0642\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647 \u0644\u0627\u062d\u0642\u0627\u064b\")\n    else:\n        response = (\"\u26a0\ufe0f *\u0639\u0630\u0631\u0627\u064b\u060c \u062a\u0639\u0630\u0631 \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0631\u0635\u064a\u062f*\\n\"\n                    \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                    \"\ud83d\uded1 *\u0627\u0644\u0623\u0633\u0628\u0627\u0628 \u0627\u0644\u0645\u062d\u062a\u0645\u0644\u0629:*\\n\"\n                    \"\u2022 \u0627\u0644\u0631\u0642\u0645 \u063a\u064a\u0631 \u0645\u0633\u062c\u0644 \u0641\u064a \u062e\u062f\u0645\u0629 ADSL\\n\"\n                    \"\u2022 \u0648\u062c\u0648\u062f \u0645\u0634\u0643\u0644\u0629 \u062a\u0642\u0646\u064a\u0629 \u0645\u0624\u0642\u062a\u0629\\n\"\n                    \"\u2022 \u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645\\n\\n\"\n                    \"\ud83d\udd0d \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u0631\u0642\u0645 \u0648\u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0644\u0627\u062d\u0642\u0627\u064b\")\n\n    if isinstance(update, Update):\n        await update.message.reply_text(response, parse_mode='Markdown')\n    else:\n        await update.reply_text(response, parse_mode='Markdown')\n```\n\n\u0623\u064a\u0636\u064b\u0627 \u0645\u0646 \u0627\u0644\u0623\u0641\u0636\u0644 \u062a\u0643\u0631\u0627\u0631 \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0637\u0642 \u0639\u0646\u062f \u0625\u0631\u0633\u0627\u0644 \u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a\u0629    `auto_query_callback` \u0644\u062a\u063a\u064a\u064a\u0631 \u0627\u0644\u0634\u0643\u0644 \u0647\u0646\u0627\u0643 \u0643\u0630\u0644\u0643.\n\n\u0645\u062b\u0644\u0627\u064b \u062f\u0627\u062e\u0644 \u0627\u0644\u062d\u0644\u0642\u0629 \u0627\u0644\u062a\u064a \u062a\u0628\u0646\u064a \u0627\u0644\u062c\u062f\u0648\u0644 \u064a\u0645\u0643\u0646 \u062a\u0639\u062f\u064a\u0644 \u0646\u0635 \u0627\u0644\u0631\u0635\u064a\u062f \u0644\u064a\u0634\u0645\u0644 \u0639\u0644\u0627\u0645\u0629 \u062a\u0646\u0628\u064a\u0647 \u0641\u064a \u062d\u0627\u0644\u0629 \u0642\u0631\u0628 \u0627\u0646\u062a\u0647\u0627\u0621 \u0627\u0644\u0627\u0634\u062a\u0631\u0627\u0643.\n\n\u0645\u062b\u0627\u0644 \u0642\u0635\u064a\u0631 \u0644\u062a\u0648\u0636\u064a\u062d \u062f\u0627\u062e\u0644 `auto_query_callback`:\n\n```python\nfor num in user_numbers:\n    info = get_adsl_info(num)\n    end_date_str = info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '') if info else ''\n    remaining_days = None\n\n    if end_date_str:\n        try:\n            end_date = datetime.strptime(end_date_str, \"%Y-%m-%d\")\n            now_date = datetime.now(YEMEN_TZ).replace(tzinfo=None)\n            remaining_days = (end_date - now_date).days\n        except:\n            remaining_days = None\n\n    if info:\n        balance = info.get('\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')\n        # \u0623\u0636\u0641 \u0639\u0644\u0627\u0645\u0629 \u062a\u0646\u0628\u064a\u0647 \u0625\u0630\u0627 \u062a\u0628\u0642\u0649 5 \u0623\u064a\u0627\u0645 \u0623\u0648 \u0623\u0642\u0644\n        if remaining_days is not None:\n            if remaining_days < 0:\n                balance += \" \u2757\ufe0f (\u0627\u0646\u062a\u0647\u0649 \u0627\u0644\u0627\u0634\u062a\u0631\u0627\u0643)\"\n            elif remaining_days <= 5:\n                balance += f\" \u26a0\ufe0f ({remaining_days} \u0623\u064a\u0627\u0645 \u0645\u062a\u0628\u0642\u064a\u0629)\"\n        table_data.append([\n            num,\n            balance,\n            info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')\n        ])\n    else:\n        table_data.append([num, \"\u274c \u0641\u0634\u0644\", \"\u274c \u0641\u0634\u0644\"])\n```\n\n---\n\n## \u0627\u0644\u0645\u0644\u062e\u0635\n\n- \u0644\u0625\u0636\u0627\u0641\u0629 \u0623\u0648\u0642\u0627\u062a: \u0623\u0636\u0641 \u0623\u0632\u0631\u0627\u0631 \u0645\u0639 callback_data \u0645\u0646\u0633\u0642\u0629 \u0645\u062b\u0644 `hour_7_AM` \u0648`hour_10_PM`.\n- \u0641\u064a \u062f\u0627\u0644\u0629 `schedule_hour` \u064a\u062a\u0645 \u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0623\u064a \u0642\u064a\u0645\u0629 \u062a\u0628\u062f\u0623 \u0628\u0640 `hour_` \u0628\u0634\u0643\u0644 \u062a\u0644\u0642\u0627\u0626\u064a.\n- \u0644\u0645\u0637\u0627\u0628\u0642\u0629 \u0627\u0644\u0648\u0642\u062a \u0648\u0625\u0636\u0627\u0641\u0629 \u062a\u062d\u0630\u064a\u0631\u0627\u062a \u0639\u0646\u062f \u062a\u0628\u0642\u0649 5 \u0623\u064a\u0627\u0645 \u0623\u0648 \u0623\u0642\u0644 \u0639\u0644\u0649 \u0627\u0646\u062a\u0647\u0627\u0621 \u0627\u0644\u0631\u0635\u064a\u062f\u060c \u0627\u0641\u062d\u0635 \u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621 \u0648\u0642\u0627\u0631\u0646 \u0645\u0639 \u0627\u0644\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u062d\u0627\u0644\u064a\u060c \u0648\u0623\u0636\u0641 \u0646\u0635 \u062a\u062d\u0630\u064a\u0631 \u0641\u064a \u0627\u0644\u0625\u0634\u0639\u0627\u0631.\n- \u0637\u0628\u0642 \u0647\u0630\u0627 \u0641\u064a \u062f\u0627\u0644\u0629 `send_balance_info` \u0648\u0643\u0630\u0644\u0643 \u0641\u064a \u062a\u0642\u0631\u064a\u0631 \u0627\u0644\u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a\u0629 \u062f\u0627\u062e\u0644 `auto_query_callback`.\n\n---\n\n\u0625\u0630\u0627 \u0627\u062d\u062a\u062c\u062a \u0645\u0633\u0627\u0639\u062f\u0629 \u0641\u064a \u0623\u064a \u0646\u0642\u0637\u0629 \u0623\u0648 \u062f\u0645\u062c \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a \u0643\u0627\u0645\u0644\u0629\u060c \u0641\u0642\u0637 \u0623\u062e\u0628\u0631\u0646\u064a!","behavior":"degenerate_repetition","conversation_hash":"88ad2ca5c15f4cca6886c8e0c257ccb4","conversation_redacted":false,"conversation_toxic":false,"country":"Yemen","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Arabic","model":"gpt-4.1-mini-2025-04-14","n_chars":27840,"n_turns_in_conversation":4,"n_words":2371,"source_row_offset":38293,"source_shard":"turns-00079.parquet","timestamp":"Thu, 15 May 2025 05:38:37 GMT","turn_id":"e7a402a58bc2861b77ce9cce","turn_index":0,"user_text":"\u0627\u0631\u064a\u062f \u0627\u0636\u0627\u0641\u0629 \u0628\u0627\u0642\u064a \u0627\u0644\u0627\u0648\u0642\u0627\u062a\nimport requests\nfrom bs4 import BeautifulSoup\nfrom telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup\nfrom telegram.ext import (ApplicationBuilder, CommandHandler, MessageHandler,\n                          ContextTypes, filters, CallbackQueryHandler,\n                          ConversationHandler)\nimport logging\nimport json\nimport os\nfrom datetime import datetime, timedelta\nimport pytz\nfrom tabulate import tabulate\n\n# Flask \u0648 threading \u0644\u062e\u062f\u0645\u0629 \u0627\u0644\u0648\u064a\u0628\nfrom flask import Flask\nimport threading\n\napp = Flask('')\n\n@app.route('/')\ndef home():\n    return \"Bot is alive!\"\n\ndef run():\n    app.run(host=\"0.0.0.0\", port=8080)\n\n\nlogging.basicConfig(\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n    level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\nADD_NUMBER, DELETE_NUMBER, SCHEDULE_HOUR = range(3)\n\nSAVED_NUMBERS_FILE = \"saved_numbers.json\"\nSCHEDULED_TIMES_FILE = \"scheduled_times.json\"\n\nYEMEN_TZ = pytz.timezone('Asia/Aden')\n\n# --- \u0627\u0644\u062a\u0639\u062f\u064a\u0644: \u0627\u0644\u062a\u062d\u0645\u064a\u0644 \u0648\u062d\u0641\u0638 \u062d\u0633\u0628 chat_id ---\n\ndef load_saved_numbers():\n    if os.path.exists(SAVED_NUMBERS_FILE):\n        try:\n            with open(SAVED_NUMBERS_FILE, 'r', encoding='utf-8') as f:\n                return json.load(f)\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629: {e}\")\n            return {}\n    else:\n        return {}\n\ndef load_scheduled_times():\n    if os.path.exists(SCHEDULED_TIMES_FILE):\n        try:\n            with open(SCHEDULED_TIMES_FILE, 'r', encoding='utf-8') as f:\n                return json.load(f)\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629: {e}\")\n            return {}\n    else:\n        return {}\n\ndef save_numbers_to_file(numbers):\n    try:\n        with open(SAVED_NUMBERS_FILE, 'w', encoding='utf-8') as f:\n            json.dump(numbers, f, ensure_ascii=False, indent=4)\n    except Exception as e:\n        logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062d\u0641\u0638 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629: {e}\")\n\ndef save_scheduled_times(times):\n    try:\n        with open(SCHEDULED_TIMES_FILE, 'w', encoding='utf-8') as f:\n            json.dump(times, f, ensure_ascii=False, indent=4)\n    except Exception as e:\n        logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062d\u0641\u0638 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629: {e}\")\n\nsaved_numbers_all = load_saved_numbers()\nscheduled_times = load_scheduled_times()\nscheduled_jobs = {}\n\nADSL_URL = \"https://adsl-yemen.com/adsl4.php\"\n\ndef get_adsl_info(phone_number):\n    try:\n        data = {\"mobile\": phone_number, \"action\": \"query\"}\n        response = requests.post(ADSL_URL, data=data)\n\n        if response.status_code == 200:\n            soup = BeautifulSoup(response.text, 'html.parser')\n            results = soup.find_all(\"div\", class_=\"result-box\")\n            data_dict = {}\n            for box in results:\n                title_div = box.find(\"div\", class_=\"result-title\")\n                value_div = box.find(\"div\", class_=\"result-value\")\n                if title_div and value_div:\n                    title = title_div.text.strip()\n                    value = value_div.text.strip()\n                    data_dict[title] = value\n\n            data_dict['timestamp'] = datetime.now(YEMEN_TZ).strftime(\"%Y-%m-%d %H:%M:%S\")\n            return data_dict\n        else:\n            return None\n    except Exception as e:\n        logger.error(f\"\u062d\u062f\u062b \u062e\u0637\u0623 \u0623\u062b\u0646\u0627\u0621 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0631\u0635\u064a\u062f: {e}\")\n        return None\n\nasync def send_balance_info(update, phone_number, info):\n    if info:\n        response = (\n            f\"\ud83c\udf1f *\u0646\u062a\u0627\u0626\u062c \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL*\\n\"\n            f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            f\"\ud83d\udcf1 *\u0627\u0644\u0631\u0642\u0645:* `{phone_number}`\\n\\n\"\n            f\"\ud83d\udcb3 *\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a:* `{info.get('\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')}`\\n\"\n            f\"\ud83d\udce6 *\u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629:* `{info.get('\u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')}`\\n\"\n            f\"\u23f3 *\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621:* `{info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')}`\\n\\n\"\n            f\"\ud83d\udd04 \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0647\u0630\u0627 \u0627\u0644\u0631\u0642\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647 \u0644\u0627\u062d\u0642\u0627\u064b\")\n    else:\n        response = (\"\u26a0\ufe0f *\u0639\u0630\u0631\u0627\u064b\u060c \u062a\u0639\u0630\u0631 \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0631\u0635\u064a\u062f*\\n\"\n                    \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                    \"\ud83d\uded1 *\u0627\u0644\u0623\u0633\u0628\u0627\u0628 \u0627\u0644\u0645\u062d\u062a\u0645\u0644\u0629:*\\n\"\n                    \"\u2022 \u0627\u0644\u0631\u0642\u0645 \u063a\u064a\u0631 \u0645\u0633\u062c\u0644 \u0641\u064a \u062e\u062f\u0645\u0629 ADSL\\n\"\n                    \"\u2022 \u0648\u062c\u0648\u062f \u0645\u0634\u0643\u0644\u0629 \u062a\u0642\u0646\u064a\u0629 \u0645\u0624\u0642\u062a\u0629\\n\"\n                    \"\u2022 \u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645\\n\\n\"\n                    \"\ud83d\udd0d \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u0631\u0642\u0645 \u0648\u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0644\u0627\u062d\u0642\u0627\u064b\")\n\n    if isinstance(update, Update):\n        await update.message.reply_text(response, parse_mode='Markdown')\n    else:\n        await update.reply_text(response, parse_mode='Markdown')\n\n\nasync def add_number(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:\n    chat_id = str(update.effective_chat.id)\n    phone_number = update.message.text.strip()\n\n    if not phone_number.isdigit() or len(phone_number) != 8:\n        await update.message.reply_text(\n            \"\u26a0\ufe0f *\u0631\u0642\u0645 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d!*\\n\u064a\u062c\u0628 \u0623\u0646 \u064a\u062a\u0643\u0648\u0646 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645 \u0641\u0642\u0637.\\n\u0645\u062b\u0627\u0644: 71234567\",\n            parse_mode='Markdown')\n        return ADD_NUMBER\n\n    # \u062a\u062d\u0642\u0642 \u0648\u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0641\u0642\u0637\n    if chat_id not in saved_numbers_all:\n        saved_numbers_all[chat_id] = {}\n    saved_numbers_all[chat_id][phone_number] = True\n    save_numbers_to_file(saved_numbers_all)\n\n    await update.message.reply_text(f\"\u2705 \u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645 {phone_number} \u0628\u0646\u062c\u0627\u062d!\",\n                                    parse_mode='Markdown')\n\n    await start(update, context)\n    return ConversationHandler.END\n\n\nasync def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:\n    user = update.effective_user\n\n    welcome_message = (\n        f\"\u2728 *\u0645\u0631\u062d\u0628\u0627\u064b \u0628\u0643 {user.first_name} \u0641\u064a \u0628\u0648\u062a \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL \u0627\u0644\u064a\u0645\u0646* \u2728\\n\\n\"\n        \"\ud83d\ude80 *\u062e\u062f\u0645\u0627\u062a \u0627\u0644\u0628\u0648\u062a \u0627\u0644\u0645\u062a\u0643\u0627\u0645\u0644\u0629:*\\n\"\n        \"\u2022 \ud83d\udcf2 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a \u0639\u0646 \u0631\u0635\u064a\u062f \u0623\u064a \u062e\u0637 ADSL\\n\"\n        \"\u2022 \ud83d\udcbe \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0628\u0633\u0647\u0648\u0644\u0629\\n\"\n        \"\u2022 \u23f0 \u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645\u0627\u062a \u062a\u0644\u0642\u0627\u0626\u064a\u0629 \u064a\u0648\u0645\u064a\u0629\\n\"\n        \"\u2022 \ud83d\udcca \u0639\u0631\u0636 \u0627\u0644\u062a\u0642\u0627\u0631\u064a\u0631 \u0627\u0644\u0645\u0641\u0635\u0644\u0629\\n\\n\"\n        \"\ud83d\udccc *\u0643\u064a\u0641\u064a\u0629 \u0627\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645:*\\n\"\n        \"\u2022 \u0623\u0631\u0633\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0645\u0628\u0627\u0634\u0631\u0629 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0641\u0648\u0631\u064a\\n\"\n        \"\u2022 \u0623\u0648 \u0627\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0623\u062f\u0646\u0627\u0647 \u0644\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u062c\u0645\u064a\u0639 \u0627\u0644\u0645\u064a\u0632\u0627\u062a\")\n\n    keyboard = [[\n        InlineKeyboardButton(\"\ud83d\udcf2 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a\", callback_data='new_query'),\n        InlineKeyboardButton(\"\ud83d\udcbe \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645\", callback_data='manage_numbers')\n    ],\n                [\n                    InlineKeyboardButton(\"\u23f0 \u062c\u062f\u0648\u0644\u0629 \u062a\u0644\u0642\u0627\u0626\u064a\u0629\",\n                                         callback_data='schedule_query'),\n                    InlineKeyboardButton(\"\ud83d\udcca \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a\",\n                                         callback_data='query_numbers')\n                ], [InlineKeyboardButton(\"\u2139\ufe0f \u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629\", callback_data='help')]]\n    reply_markup = InlineKeyboardMarkup(keyboard)\n\n    if update.message:\n        await update.message.reply_text(welcome_message,\n                                        reply_markup=reply_markup,\n                                        parse_mode='Markdown')\n    else:\n        await update.callback_query.edit_message_text(\n            welcome_message, reply_markup=reply_markup, parse_mode='Markdown')\n\n\nasync def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:\n    chat_id = str(update.effective_chat.id)\n    phone_number = update.message.text.strip()\n\n    if not phone_number.isdigit() or len(phone_number) != 8:\n        await update.message.reply_text(\n            \"\u26a0\ufe0f *\u064a\u0631\u062c\u0649 \u0625\u062f\u062e\u0627\u0644 \u0631\u0642\u0645 \u0647\u0627\u062a\u0641 \u0635\u062d\u064a\u062d*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udccc *\u0627\u0644\u0634\u0631\u0648\u0637 \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629:*\\n\"\n            \"\u2022 \u064a\u062c\u0628 \u0623\u0646 \u064a\u062a\u0643\u0648\u0646 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645\\n\"\n            \"\u2022 \u064a\u062c\u0628 \u0623\u0646 \u064a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u0623\u0631\u0642\u0627\u0645 \u0641\u0642\u0637\\n\"\n            \"\u2022 \u0645\u062b\u0627\u0644: `71234567`\",\n            parse_mode='Markdown')\n        return\n\n    processing_msg = await update.message.reply_text(\n        \"\u23f3 *\u062c\u0627\u0631\u064a \u0645\u0639\u0627\u0644\u062c\u0629 \u0637\u0644\u0628\u0643...*\\n\"\n        \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n        \"\ud83d\udce1 \u064a\u062a\u0645 \u0627\u0644\u0622\u0646 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u062e\u0627\u062f\u0645 ADSL\\n\"\n        \"\u23f1\ufe0f \u0642\u062f \u064a\u0633\u062a\u063a\u0631\u0642 \u0627\u0644\u0623\u0645\u0631 \u0628\u0636\u0639 \u062b\u0648\u0627\u0646\u064d...\",\n        parse_mode='Markdown')\n\n    info = get_adsl_info(phone_number)\n\n    await processing_msg.delete()\n    await send_balance_info(update, phone_number, info)\n\n    # \u0639\u0631\u0636 \u062e\u064a\u0627\u0631 \u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0641\u0642\u0637\n    if info:\n        user_numbers = saved_numbers_all.get(chat_id, {})\n        if phone_number not in user_numbers:\n            keyboard = [[\n                InlineKeyboardButton(\"\ud83d\udcbe \u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645\",\n                                     callback_data=f'save_{phone_number}'),\n                InlineKeyboardButton(\"\ud83d\udd04 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062c\u062f\u064a\u062f\", callback_data='new_query')\n            ], [InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')]]\n            reply_markup = InlineKeyboardMarkup(keyboard)\n            await update.message.reply_text(\n                \"\u2754 *\u0647\u0644 \u062a\u0631\u063a\u0628 \u0641\u064a \u062d\u0641\u0638 \u0647\u0630\u0627 \u0627\u0644\u0631\u0642\u0645 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647 \u0644\u0627\u062d\u0642\u0627\u064b\u061f*\",\n                reply_markup=reply_markup,\n                parse_mode='Markdown')\n\n\nasync def button_handler(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:\n    query = update.callback_query\n    chat_id = str(query.message.chat.id)\n    await query.answer()\n\n    if query.data == 'add_number':\n        await query.edit_message_text(\n            \"\ud83d\udcdd *\u0625\u0636\u0627\u0641\u0629 \u0631\u0642\u0645 \u062c\u062f\u064a\u062f \u0644\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udcf1 \u064a\u0631\u062c\u0649 \u0625\u0631\u0633\u0627\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0645\u0643\u0648\u0646 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645\\n\"\n            \"\u270f\ufe0f \u0645\u062b\u0627\u0644: `71234567`\\n\\n\"\n            \"\ud83d\udd19 \u0644\u0644\u0639\u0648\u062f\u0629 \u0627\u0636\u063a\u0637 /start\",\n            parse_mode='Markdown')\n        return ADD_NUMBER\n\n    elif query.data == 'manage_numbers':\n        user_numbers = saved_numbers_all.get(chat_id, {})\n        if not user_numbers:\n            await query.edit_message_text(\n                \"\u26a0\ufe0f *\u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                \"\u0644\u0645 \u062a\u0642\u0645 \u0628\u0625\u0636\u0627\u0641\u0629 \u0623\u064a \u0623\u0631\u0642\u0627\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a \u0628\u0639\u062f\\n\\n\"\n                \"\u2795 \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u062c\u062f\u064a\u062f\u0629 \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\\n\\n\"\n                \"\ud83c\udfe0 \u0627\u0636\u063a\u0637 \u0644\u0644\u0639\u0648\u062f\u0629 \u0625\u0644\u0649 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                reply_markup=InlineKeyboardMarkup(\n                    [[InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')]]),\n                parse_mode='Markdown')\n            return\n\n        keyboard = []\n        for num in user_numbers:\n            keyboard.append([\n                InlineKeyboardButton(f\"\ud83d\uddd1\ufe0f \u062d\u0630\u0641 {num}\", callback_data=f'delete_{num}')\n            ])\n        keyboard.append([InlineKeyboardButton(\"\u2795 \u0625\u0636\u0627\u0641\u0629 \u0631\u0642\u0645 \u062c\u062f\u064a\u062f\", callback_data='add_number')])\n        keyboard.append([InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')])\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(\n            \"\ud83d\uddc2\ufe0f *\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udd18 \u0627\u062e\u062a\u0631 \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0630\u064a \u062a\u0631\u064a\u062f \u0625\u062f\u0627\u0631\u062a\u0647:\\n\\n\"\n            \"\ud83d\uddd1\ufe0f \u0632\u0631 \u0627\u0644\u062d\u0630\u0641 - \u0644\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a\",\n            reply_markup=reply_markup,\n            parse_mode='Markdown')\n        return DELETE_NUMBER\n\n    elif query.data == 'query_numbers':\n        user_numbers = saved_numbers_all.get(chat_id, {})\n        if not user_numbers:\n            await query.edit_message_text(\n                \"\ud83d\udcca *\u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                \"\u26a0\ufe0f \u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629 \u062d\u0627\u0644\u064a\u0627\u064b\\n\\n\"\n                \"\u2795 \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u062c\u062f\u064a\u062f\u0629 \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\\n\\n\"\n                \"\ud83c\udfe0 \u0627\u0636\u063a\u0637 \u0644\u0644\u0639\u0648\u062f\u0629 \u0625\u0644\u0649 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                reply_markup=InlineKeyboardMarkup(\n                    [[InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')]]),\n                parse_mode='Markdown')\n            return\n\n        processing_msg = await query.message.reply_text(\n            \"\u23f3 *\u062c\u0627\u0631\u064a \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udce1 \u064a\u062a\u0645 \u0627\u0644\u0622\u0646 \u062c\u0644\u0628 \u0623\u062d\u062f\u062b \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0639\u0646 \u062c\u0645\u064a\u0639 \u0627\u0644\u0623\u0631\u0642\u0627\u0645\\n\"\n            \"\u23f1\ufe0f \u0642\u062f \u062a\u0633\u062a\u063a\u0631\u0642 \u0627\u0644\u0639\u0645\u0644\u064a\u0629 \u0628\u0639\u0636 \u0627\u0644\u0648\u0642\u062a...\",\n            parse_mode='Markdown')\n\n        table_data = []\n        for num in user_numbers:\n            info = get_adsl_info(num)\n            if info:\n                table_data.append([\n                    num,\n                    info.get('\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631'),\n                    info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')\n                ])\n            else:\n                table_data.append([num, \"\u274c \u0641\u0634\u0644\", \"\u274c \u0641\u0634\u0644\"])\n\n        headers = [\"\ud83d\udcf1 \u0627\u0644\u0631\u0642\u0645\", \"\ud83d\udcb5 \u0627\u0644\u0631\u0635\u064a\u062f\", \"\ud83d\udcc5 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621\"]\n        table = tabulate(table_data, headers=headers, tablefmt=\"grid\")\n\n        response = (\"\ud83d\udcca *\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a*\\n\"\n                    \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                    f\"```\\n{table}\\n```\\n\"\n                    f\"\ud83d\udd22 *\u0639\u062f\u062f \u0627\u0644\u0623\u0631\u0642\u0627\u0645:* {len(user_numbers)}\\n\\n\"\n                    \"\u2728 \u062a\u0645 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621 \u0645\u0646 \u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0628\u0646\u062c\u0627\u062d\")\n\n        await processing_msg.delete()\n        await query.message.reply_text(response, parse_mode='Markdown')\n\n    elif query.data == 'schedule_query':\n        keyboard = [[\n            InlineKeyboardButton(\"\ud83d\udd58 9 \u0635\u0628\u0627\u062d\u0627\u064b\", callback_data='hour_9_AM'),\n            InlineKeyboardButton(\"\ud83d\udd5b 12 \u0638\u0647\u0631\u0627\u064b\", callback_data='hour_12_PM')\n        ],\n                    [\n                        InlineKeyboardButton(\"\ud83d\udd53 4 \u0639\u0635\u0631\u0627\u064b\", callback_data='hour_4_PM'),\n                        InlineKeyboardButton(\"\ud83d\udd57 8 \u0645\u0633\u0627\u0621\u064b\", callback_data='hour_8_PM')\n                    ],\n                    [\n                        InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')\n                    ]]\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(\n            \"\u23f0 *\u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udcc5 \u064a\u0631\u062c\u0649 \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0645\u0641\u0636\u0644 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u064a\u0648\u0645\u064a\\n\\n\"\n            \"\u23f1\ufe0f \u0633\u064a\u062a\u0645 \u0625\u062c\u0631\u0627\u0621 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062a\u0644\u0642\u0627\u0626\u064a\u0627\u064b \u0641\u064a \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0645\u062d\u062f\u062f\\n\\n\"\n            \"\ud83c\udfe0 \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0639\u0648\u062f\u0629 \u0644\u0644\u0645\u0628\u0627\u0634\u0631\u0629\",\n            reply_markup=reply_markup,\n            parse_mode='Markdown')\n        return SCHEDULE_HOUR\n\n    elif query.data == 'help':\n        help_text = (\"\u2139\ufe0f *\u062f\u0644\u064a\u0644 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0628\u0648\u062a*\\n\"\n                     \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                     \"\ud83d\udd39 *\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a*:\\n\"\n                     \"   - \u0623\u0631\u0633\u0644 \u0627\u0644\u0631\u0642\u0645 \u0645\u0628\u0627\u0634\u0631\u0629 (8 \u0623\u0631\u0642\u0627\u0645)\\n\"\n                     \"   - \u0623\u0648 \u0627\u0636\u063a\u0637 \u0639\u0644\u0649 '\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a'\\n\\n\"\n                     \"\ud83d\udd39 *\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645*:\\n\"\n                     \"   - \u062d\u0641\u0638 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a\\n\"\n                     \"   - \u062d\u0630\u0641 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629\\n\\n\"\n                     \"\ud83d\udd39 *\u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a*:\\n\"\n                     \"   - \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062c\u0645\u064a\u0639 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u062f\u0641\u0639\u0629 \u0648\u0627\u062d\u062f\u0629\\n\\n\"\n                     \"\ud83d\udd39 *\u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645*:\\n\"\n                     \"   - \u0636\u0628\u0637 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062a\u0644\u0642\u0627\u0626\u064a \u064a\u0648\u0645\u064a \u0641\u064a \u0648\u0642\u062a \u0645\u062d\u062f\u062f\\n\\n\"\n                     \"\ud83d\udccc *\u0645\u0644\u0627\u062d\u0638\u0627\u062a \u0645\u0647\u0645\u0629*:\\n\"\n                     \"   - \u064a\u062c\u0628 \u0623\u0646 \u064a\u062a\u0643\u0648\u0646 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645\\n\"\n                     \"   - \u0627\u0644\u062e\u062f\u0645\u0629 \u0645\u062a\u0648\u0641\u0631\u0629 \u0644\u062c\u0645\u064a\u0639 \u0639\u0645\u0644\u0627\u0621 ADSL \u0627\u0644\u064a\u0645\u0646\\n\\n\"\n                     \"\ud83c\udfe0 \u0627\u0636\u063a\u0637 \u0644\u0644\u0639\u0648\u062f\u0629 \u0625\u0644\u0649 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\")\n        keyboard = [[InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')]]\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(help_text, reply_markup=reply_markup, parse_mode='Markdown')\n\n    elif query.data == 'back':\n        await start(update, context)\n\n    elif query.data == 'new_query':\n        keyboard = [[InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')]]\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(\n            \"\ud83d\udd0d *\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062c\u062f\u064a\u062f*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udcf1 \u064a\u0631\u062c\u0649 \u0625\u0631\u0633\u0627\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0645\u0643\u0648\u0646 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645\\n\"\n            \"\u270f\ufe0f \u0645\u062b\u0627\u0644: `71234567`\",\n            reply_markup=reply_markup,\n            parse_mode='Markdown')\n\n    elif query.data.startswith('save_'):\n        phone_number = query.data[5:]\n        if chat_id not in saved_numbers_all:\n            saved_numbers_all[chat_id] = {}\n        saved_numbers_all[chat_id][phone_number] = True\n        save_numbers_to_file(saved_numbers_all)\n        await query.edit_message_text(\n            f\"\u2705 *\u062a\u0645 \u0627\u0644\u062d\u0641\u0638 \u0628\u0646\u062c\u0627\u062d*\\n\"\n            f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            f\"\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645 `{phone_number}` \u0641\u064a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a\\n\\n\"\n            f\"\ud83d\udccb \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0622\u0646 \u0625\u062c\u0631\u0627\u0621 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062c\u0645\u0627\u0639\u064a \u0623\u0648 \u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645\u0627\u062a \u062a\u0644\u0642\u0627\u0626\u064a\u0629\",\n            parse_mode='Markdown')\n        await start(update, context)\n\n\nasync def delete_number(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:\n    query = update.callback_query\n    chat_id = str(query.message.chat.id)\n    await query.answer()\n\n    if query.data.startswith('delete_'):\n        num_to_delete = query.data[7:]\n        user_numbers = saved_numbers_all.get(chat_id, {})\n        if num_to_delete in user_numbers:\n            del user_numbers[num_to_delete]\n            save_numbers_to_file(saved_numbers_all)\n            await query.edit_message_text(\n                f\"\u2705 *\u062a\u0645 \u0627\u0644\u062d\u0630\u0641 \u0628\u0646\u062c\u0627\u062d*\\n\"\n                f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                f\"\u2022 *\u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0645\u062d\u0630\u0648\u0641:* `{num_to_delete}`\\n\\n\"\n                f\"\ud83d\udccb \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u062c\u062f\u064a\u062f\u0629 \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                parse_mode='Markdown')\n        else:\n            await query.edit_message_text(\n                \"\u26a0\ufe0f *\u062a\u0639\u0630\u0631 \u0627\u0644\u062d\u0630\u0641*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                \"\u2022 \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0645\u0637\u0644\u0648\u0628 \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f \u0641\u064a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a\\n\\n\"\n                \"\ud83d\udccb \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0648\u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649\",\n                parse_mode='Markdown')\n\n    await start(update, context)\n    return ConversationHandler.END\n\n\nasync def schedule_hour(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:\n    query = update.callback_query\n    chat_id = str(query.message.chat.id)\n    await query.answer()\n\n    if query.data.startswith('hour_'):\n        time_parts = query.data.split('_')\n        hour = int(time_parts[1])\n        ampm = time_parts[2]\n\n        # \u062a\u062d\u0648\u064a\u0644 \u0625\u0644\u0649 24 \u0633\u0627\u0639\u0629\n        if ampm == 'PM' and hour < 12:\n            hour += 12\n        elif ampm == 'AM' and hour == 12:\n            hour = 0\n\n        # \u062d\u0641\u0638 \u0627\u0644\u062c\u062f\u0648\u0644\u0629 (\u0648\u0642\u062a \u0648\u0627\u062d\u062f \u0641\u0642\u0637 \u0644\u0643\u0644 \u0645\u0633\u062a\u062e\u062f\u0645)\n        scheduled_times[chat_id] = {'hour': hour, 'minute': 0, 'ampm': ampm}\n        save_scheduled_times(scheduled_times)\n\n        now = datetime.now(YEMEN_TZ)\n        scheduled_time = now.replace(hour=hour, minute=0, second=0, microsecond=0)\n        if scheduled_time < now:\n            scheduled_time += timedelta(days=1)\n\n        # \u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0633\u0627\u0628\u0642\u0629 \u0625\u0646 \u0648\u062c\u062f\u062a\n        if chat_id in scheduled_jobs:\n            scheduled_jobs[chat_id].schedule_removal()\n\n        try:\n            job = context.application.job_queue.run_repeating(\n                auto_query_callback,\n                interval=timedelta(days=1),\n                first=timedelta(seconds=(scheduled_time - now).total_seconds()),\n                chat_id=int(chat_id))\n            scheduled_jobs[chat_id] = job\n\n            await query.edit_message_text(\n                f\"\u2705 *\u062a\u0645\u062a \u0627\u0644\u062c\u062f\u0648\u0644\u0629 \u0628\u0646\u062c\u0627\u062d*\\n\"\n                f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                f\"\u2022 *\u0648\u0642\u062a \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645:* {time_parts[1]} {'\u0635\u0628\u0627\u062d\u0627\u064b' if ampm == 'AM' else '\u0645\u0633\u0627\u0621\u064b'}\\n\"\n                f\"\u2022 \u0633\u064a\u0628\u062f\u0623 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a \u064a\u0648\u0645\u064a\u0627\u064b \u0641\u064a \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0645\u062d\u062f\u062f\\n\\n\"\n                f\"\ud83d\udccb \u064a\u0645\u0643\u0646\u0643 \u062a\u0639\u062f\u064a\u0644 \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0645\u0631\u0629 \u0648\u0627\u062d\u062f\u0629 \u064a\u0648\u0645\u064a\u0627\u064b \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                parse_mode='Markdown')\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u062c\u062f\u0648\u0644\u0629: {e}\")\n            await query.edit_message_text(\n                \"\u26a0\ufe0f *\u062a\u0639\u0630\u0631 \u0625\u0639\u062f\u0627\u062f \u0627\u0644\u062c\u062f\u0648\u0644\u0629*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                \"\u062d\u062f\u062b \u062e\u0637\u0623 \u062a\u0642\u0646\u064a \u0623\u062b\u0646\u0627\u0621 \u0645\u062d\u0627\u0648\u0644\u0629 \u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645\\n\\n\"\n                \"\ud83d\udd04 \u064a\u0631\u062c\u0649 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649\",\n                parse_mode='Markdown')\n\n    await start(update, context)\n    return ConversationHandler.END\n\n\nasync def auto_query_callback(context: ContextTypes.DEFAULT_TYPE):\n    job = context.job\n    chat_id = str(job.chat_id)\n\n    user_numbers = saved_numbers_all.get(chat_id, {})\n    if not user_numbers:\n        await context.bot.send_message(\n            job.chat_id, \"\u26a0\ufe0f *\u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0623\u064a \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647\u0627\\n\\n\"\n            \"\u2795 \u064a\u0631\u062c\u0649 \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u0623\u0648\u0644\u0627\u064b \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n            parse_mode='Markdown')\n        return\n\n    processing_msg = await context.bot.send_message(\n        job.chat_id, \"\u23f3 *\u062c\u0627\u0631\u064a \u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a*\\n\"\n        \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n        \"\ud83d\udce1 \u064a\u062a\u0645 \u0627\u0644\u0622\u0646 \u062c\u0644\u0628 \u0623\u062d\u062f\u062b \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0639\u0646 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629\\n\"\n        \"\u23f1\ufe0f \u064a\u0631\u062c\u0649 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631...\",\n        parse_mode='Markdown')\n\n    table_data = []\n    for num in user_numbers:\n        info = get_adsl_info(num)\n        if info:\n            table_data.append([\n                num,\n                info.get('\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631'),\n                info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')\n            ])\n        else:\n            table_data.append([num, \"\u274c \u0641\u0634\u0644\", \"\u274c \u0641\u0634\u0644\"])\n\n    headers = [\"\ud83d\udcf1 \u0627\u0644\u0631\u0642\u0645\", \"\ud83d\udcb5 \u0627\u0644\u0631\u0635\u064a\u062f\", \"\ud83d\udcc5 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621\"]\n    table = tabulate(table_data, headers=headers, tablefmt=\"grid\")\n\n    response = (\"\u23f0 *\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                f\"```\\n{table}\\n```\\n\"\n                f\"\ud83d\udd22 *\u0639\u062f\u062f \u0627\u0644\u0623\u0631\u0642\u0627\u0645:* {len(user_numbers)}\\n\\n\"\n                \"\u2728 \u062a\u0645 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621 \u0645\u0646 \u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0628\u0646\u062c\u0627\u062d\")\n\n    await processing_msg.delete()\n    await context.bot.send_message(job.chat_id, response, parse_mode='Markdown')\n\n\nasync def error_handler(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:\n    logger.error(msg=\"\u062d\u062f\u062b \u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u0628\u0648\u062a:\", exc_info=context.error)\n    if update.message:\n        await update.message.reply_text(\n            \"\u26d4 *\u0639\u0630\u0631\u0627\u064b\u060c \u062d\u062f\u062b \u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\u0644\u0642\u062f \u0648\u0627\u062c\u0647\u0646\u0627 \u0645\u0634\u0643\u0644\u0629 \u062a\u0642\u0646\u064a\u0629 \u0623\u062b\u0646\u0627\u0621 \u0645\u0639\u0627\u0644\u062c\u0629 \u0637\u0644\u0628\u0643\\n\\n\"\n            \"\ud83d\udd04 \u064a\u0631\u062c\u0649 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649 \u0644\u0627\u062d\u0642\u0627\u064b\",\n            parse_mode='Markdown')\n\n\ndef main():\n    server_thread = threading.Thread(target=run)\n    server_thread.start()\n\n    application = ApplicationBuilder().token(\n        \"7563226990:AAFg2E5-f6EcVEjBK7ph5w8Q064P4daZlj0\").build()\n\n    conv_handler = ConversationHandler(\n        entry_points=[CallbackQueryHandler(button_handler)],\n        states={\n            ADD_NUMBER: [MessageHandler(filters.TEXT & ~filters.COMMAND, add_number)],\n            DELETE_NUMBER: [CallbackQueryHandler(delete_number)],\n            SCHEDULE_HOUR: [CallbackQueryHandler(schedule_hour)]\n        },\n        fallbacks=[CommandHandler(\"start\", start)],\n        per_message=True)\n\n    application.add_handler(CommandHandler(\"start\", start))\n    application.add_handler(conv_handler)\n    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))\n    application.add_error_handler(error_handler)\n\n    logger.info(\"\ud83e\udd16 \u0627\u0644\u0628\u0648\u062a \u064a\u0639\u0645\u0644...\")\n    application.run_polling()\n\n\nif __name__ == '__main__':\n    main()\n\u0648\u0627\u0631\u064a\u062f \u0645\u0637\u0627\u0628\u0642\u0629 \u0648\u0642\u062a \u0627\u0646\u062a\u0647\u0627\u0621 \u0627\u0644\u0631\u0635\u064a\u062f \u0644\u0644\u0627\u0631\u0642\u0627\u0645 \u0641\u064a \u062d\u0627\u0644 \u062a\u0628\u0642\u0627\u0621 \u062e\u0645\u0633 \u0627\u064a\u0627\u0645 \u0627\u0631\u064a\u062f \u062a\u063a\u064a\u064a\u0631 \u0634\u0643\u0644 \u0627\u0644\u0627\u0634\u0639\u0627\u0631"},{"assistant_initiates":false,"asst_text":"\u0628\u0627\u0644\u0637\u0628\u0639\u060c \u0625\u0644\u064a\u0643 \u0627\u0644\u0643\u0648\u062f \u0627\u0644\u0643\u0627\u0645\u0644 \u0628\u0639\u062f \u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0625\u0636\u0627\u0641\u064a\u0629 (7 \u0635\u0628\u0627\u062d\u0627\u064b\u060c 10 \u0645\u0633\u0627\u0621\u064b) \u0648\u062a\u0639\u062f\u064a\u0644 \u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u0625\u0634\u0639\u0627\u0631 \u0628\u062d\u064a\u062b \u064a\u062a\u0645 \u0627\u0644\u062a\u0646\u0628\u064a\u0647 \u0625\u0630\u0627 \u062a\u0628\u0642\u0649 5 \u0623\u064a\u0627\u0645 \u0623\u0648 \u0623\u0642\u0644 \u0639\u0644\u0649 \u0627\u0646\u062a\u0647\u0627\u0621 \u0627\u0644\u0628\u0627\u0642\u0629.\n\n\u064a\u0631\u062c\u0649 \u0627\u0633\u062a\u0628\u062f\u0627\u0644 \u0627\u0644\u062c\u0632\u0621 \u0627\u0644\u0633\u0627\u0628\u0642 \u0645\u0646 \u0627\u0644\u0643\u0648\u062f \u0628\u0647\u0630\u0627 \u0627\u0644\u0643\u0648\u062f \u0645\u0628\u0627\u0634\u0631\u0629:\n\n```python\nimport requests\nfrom bs4 import BeautifulSoup\nfrom telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup\nfrom telegram.ext import (ApplicationBuilder, CommandHandler, MessageHandler,\n                          ContextTypes, filters, CallbackQueryHandler,\n                          ConversationHandler)\nimport logging\nimport json\nimport os\nfrom datetime import datetime, timedelta\nimport pytz\nfrom tabulate import tabulate\n\n# Flask \u0648 threading \u0644\u062e\u062f\u0645\u0629 \u0627\u0644\u0648\u064a\u0628\nfrom flask import Flask\nimport threading\n\napp = Flask('')\n\n@app.route('/')\ndef home():\n    return \"Bot is alive!\"\n\ndef run():\n    app.run(host=\"0.0.0.0\", port=8080)\n\n\nlogging.basicConfig(\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n    level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\nADD_NUMBER, DELETE_NUMBER, SCHEDULE_HOUR = range(3)\n\nSAVED_NUMBERS_FILE = \"saved_numbers.json\"\nSCHEDULED_TIMES_FILE = \"scheduled_times.json\"\n\nYEMEN_TZ = pytz.timezone('Asia/Aden')\n\n# --- \u0627\u0644\u062a\u0639\u062f\u064a\u0644: \u0627\u0644\u062a\u062d\u0645\u064a\u0644 \u0648\u062d\u0641\u0638 \u062d\u0633\u0628 chat_id ---\n\ndef load_saved_numbers():\n    if os.path.exists(SAVED_NUMBERS_FILE):\n        try:\n            with open(SAVED_NUMBERS_FILE, 'r', encoding='utf-8') as f:\n                return json.load(f)\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629: {e}\")\n            return {}\n    else:\n        return {}\n\ndef load_scheduled_times():\n    if os.path.exists(SCHEDULED_TIMES_FILE):\n        try:\n            with open(SCHEDULED_TIMES_FILE, 'r', encoding='utf-8') as f:\n                return json.load(f)\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629: {e}\")\n            return {}\n    else:\n        return {}\n\ndef save_numbers_to_file(numbers):\n    try:\n        with open(SAVED_NUMBERS_FILE, 'w', encoding='utf-8') as f:\n            json.dump(numbers, f, ensure_ascii=False, indent=4)\n    except Exception as e:\n        logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062d\u0641\u0638 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629: {e}\")\n\ndef save_scheduled_times(times):\n    try:\n        with open(SCHEDULED_TIMES_FILE, 'w', encoding='utf-8') as f:\n            json.dump(times, f, ensure_ascii=False, indent=4)\n    except Exception as e:\n        logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062d\u0641\u0638 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629: {e}\")\n\nsaved_numbers_all = load_saved_numbers()\nscheduled_times = load_scheduled_times()\nscheduled_jobs = {}\n\nADSL_URL = \"https://adsl-yemen.com/adsl4.php\"\n\ndef get_adsl_info(phone_number):\n    try:\n        data = {\"mobile\": phone_number, \"action\": \"query\"}\n        response = requests.post(ADSL_URL, data=data)\n\n        if response.status_code == 200:\n            soup = BeautifulSoup(response.text, 'html.parser')\n            results = soup.find_all(\"div\", class_=\"result-box\")\n            data_dict = {}\n            for box in results:\n                title_div = box.find(\"div\", class_=\"result-title\")\n                value_div = box.find(\"div\", class_=\"result-value\")\n                if title_div and value_div:\n                    title = title_div.text.strip()\n                    value = value_div.text.strip()\n                    data_dict[title] = value\n\n            data_dict['timestamp'] = datetime.now(YEMEN_TZ).strftime(\"%Y-%m-%d %H:%M:%S\")\n            return data_dict\n        else:\n            return None\n    except Exception as e:\n        logger.error(f\"\u062d\u062f\u062b \u062e\u0637\u0623 \u0623\u062b\u0646\u0627\u0621 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0631\u0635\u064a\u062f: {e}\")\n        return None\n\nasync def send_balance_info(update, phone_number, info):\n    if info:\n        end_date_str = info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', None)\n        warning_text = \"\"\n        if end_date_str:\n            try:\n                end_date = datetime.strptime(end_date_str, \"%Y-%m-%d\")\n                now_date = datetime.now(YEMEN_TZ).replace(tzinfo=None)\n                days_left = (end_date - now_date).days\n\n                if 0 <= days_left <= 5:\n                    warning_text = f\"\\n\u26a0\ufe0f *\u062a\u0646\u0628\u064a\u0647:* \u062a\u0628\u0642\u0649 \u0641\u0642\u0637 {days_left} \u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0646\u062a\u0647\u0627\u0621 \u0627\u0644\u0628\u0627\u0642\u0629!\"\n                elif days_left < 0:\n                    warning_text = \"\\n\u2757\ufe0f \u0627\u0646\u062a\u0647\u062a \u0635\u0644\u0627\u062d\u064a\u0629 \u0627\u0644\u0628\u0627\u0642\u0629.\"\n\n            except Exception as e:\n                logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0644\u064a\u0644 \u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621: {e}\")\n\n        response = (\n            f\"\ud83c\udf1f *\u0646\u062a\u0627\u0626\u062c \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL*\\n\"\n            f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            f\"\ud83d\udcf1 *\u0627\u0644\u0631\u0642\u0645:* `{phone_number}`\\n\\n\"\n            f\"\ud83d\udcb3 *\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a:* `{info.get('\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')}`\\n\"\n            f\"\ud83d\udce6 *\u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629:* `{info.get('\u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')}`\\n\"\n            f\"\u23f3 *\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621:* `{end_date_str if end_date_str else '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631'}`\"\n            f\"{warning_text}\\n\\n\"\n            f\"\ud83d\udd04 \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0647\u0630\u0627 \u0627\u0644\u0631\u0642\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647 \u0644\u0627\u062d\u0642\u0627\u064b\")\n    else:\n        response = (\"\u26a0\ufe0f *\u0639\u0630\u0631\u0627\u064b\u060c \u062a\u0639\u0630\u0631 \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0631\u0635\u064a\u062f*\\n\"\n                    \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                    \"\ud83d\uded1 *\u0627\u0644\u0623\u0633\u0628\u0627\u0628 \u0627\u0644\u0645\u062d\u062a\u0645\u0644\u0629:*\\n\"\n                    \"\u2022 \u0627\u0644\u0631\u0642\u0645 \u063a\u064a\u0631 \u0645\u0633\u062c\u0644 \u0641\u064a \u062e\u062f\u0645\u0629 ADSL\\n\"\n                    \"\u2022 \u0648\u062c\u0648\u062f \u0645\u0634\u0643\u0644\u0629 \u062a\u0642\u0646\u064a\u0629 \u0645\u0624\u0642\u062a\u0629\\n\"\n                    \"\u2022 \u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645\\n\\n\"\n                    \"\ud83d\udd0d \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u0631\u0642\u0645 \u0648\u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0644\u0627\u062d\u0642\u0627\u064b\")\n\n    if isinstance(update, Update):\n        await update.message.reply_text(response, parse_mode='Markdown')\n    else:\n        await update.reply_text(response, parse_mode='Markdown')\n\n\nasync def add_number(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:\n    chat_id = str(update.effective_chat.id)\n    phone_number = update.message.text.strip()\n\n    if not phone_number.isdigit() or len(phone_number) != 8:\n        await update.message.reply_text(\n            \"\u26a0\ufe0f *\u0631\u0642\u0645 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d!*\\n\u064a\u062c\u0628 \u0623\u0646 \u064a\u062a\u0643\u0648\u0646 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645 \u0641\u0642\u0637.\\n\u0645\u062b\u0627\u0644: 71234567\",\n            parse_mode='Markdown')\n        return ADD_NUMBER\n\n    # \u062a\u062d\u0642\u0642 \u0648\u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0641\u0642\u0637\n    if chat_id not in saved_numbers_all:\n        saved_numbers_all[chat_id] = {}\n    saved_numbers_all[chat_id][phone_number] = True\n    save_numbers_to_file(saved_numbers_all)\n\n    await update.message.reply_text(f\"\u2705 \u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645 {phone_number} \u0628\u0646\u062c\u0627\u062d!\",\n                                    parse_mode='Markdown')\n\n    await start(update, context)\n    return ConversationHandler.END\n\n\nasync def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:\n    user = update.effective_user\n\n    welcome_message = (\n        f\"\u2728 *\u0645\u0631\u062d\u0628\u0627\u064b \u0628\u0643 {user.first_name} \u0641\u064a \u0628\u0648\u062a \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL \u0627\u0644\u064a\u0645\u0646* \u2728\\n\\n\"\n        \"\ud83d\ude80 *\u062e\u062f\u0645\u0627\u062a \u0627\u0644\u0628\u0648\u062a \u0627\u0644\u0645\u062a\u0643\u0627\u0645\u0644\u0629:*\\n\"\n        \"\u2022 \ud83d\udcf2 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a \u0639\u0646 \u0631\u0635\u064a\u062f \u0623\u064a \u062e\u0637 ADSL\\n\"\n        \"\u2022 \ud83d\udcbe \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0628\u0633\u0647\u0648\u0644\u0629\\n\"\n        \"\u2022 \u23f0 \u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645\u0627\u062a \u062a\u0644\u0642\u0627\u0626\u064a\u0629 \u064a\u0648\u0645\u064a\u0629\\n\"\n        \"\u2022 \ud83d\udcca \u0639\u0631\u0636 \u0627\u0644\u062a\u0642\u0627\u0631\u064a\u0631 \u0627\u0644\u0645\u0641\u0635\u0644\u0629\\n\\n\"\n        \"\ud83d\udccc *\u0643\u064a\u0641\u064a\u0629 \u0627\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645:*\\n\"\n        \"\u2022 \u0623\u0631\u0633\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0645\u0628\u0627\u0634\u0631\u0629 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0641\u0648\u0631\u064a\\n\"\n        \"\u2022 \u0623\u0648 \u0627\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0623\u062f\u0646\u0627\u0647 \u0644\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u062c\u0645\u064a\u0639 \u0627\u0644\u0645\u064a\u0632\u0627\u062a\")\n\n    keyboard = [[\n        InlineKeyboardButton(\"\ud83d\udcf2 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a\", callback_data='new_query'),\n        InlineKeyboardButton(\"\ud83d\udcbe \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645\", callback_data='manage_numbers')\n    ],\n                [\n                    InlineKeyboardButton(\"\u23f0 \u062c\u062f\u0648\u0644\u0629 \u062a\u0644\u0642\u0627\u0626\u064a\u0629\",\n                                         callback_data='schedule_query'),\n                    InlineKeyboardButton(\"\ud83d\udcca \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a\",\n                                         callback_data='query_numbers')\n                ], [InlineKeyboardButton(\"\u2139\ufe0f \u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629\", callback_data='help')]]\n    reply_markup = InlineKeyboardMarkup(keyboard)\n\n    if update.message:\n        await update.message.reply_text(welcome_message,\n                                        reply_markup=reply_markup,\n                                        parse_mode='Markdown')\n    else:\n        await update.callback_query.edit_message_text(\n            welcome_message, reply_markup=reply_markup, parse_mode='Markdown')\n\n\nasync def handle_message(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:\n    chat_id = str(update.effective_chat.id)\n    phone_number = update.message.text.strip()\n\n    if not phone_number.isdigit() or len(phone_number) != 8:\n        await update.message.reply_text(\n            \"\u26a0\ufe0f *\u064a\u0631\u062c\u0649 \u0625\u062f\u062e\u0627\u0644 \u0631\u0642\u0645 \u0647\u0627\u062a\u0641 \u0635\u062d\u064a\u062d*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udccc *\u0627\u0644\u0634\u0631\u0648\u0637 \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629:*\\n\"\n            \"\u2022 \u064a\u062c\u0628 \u0623\u0646 \u064a\u062a\u0643\u0648\u0646 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645\\n\"\n            \"\u2022 \u064a\u062c\u0628 \u0623\u0646 \u064a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u0623\u0631\u0642\u0627\u0645 \u0641\u0642\u0637\\n\"\n            \"\u2022 \u0645\u062b\u0627\u0644: `71234567`\",\n            parse_mode='Markdown')\n        return\n\n    processing_msg = await update.message.reply_text(\n        \"\u23f3 *\u062c\u0627\u0631\u064a \u0645\u0639\u0627\u0644\u062c\u0629 \u0637\u0644\u0628\u0643...*\\n\"\n        \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n        \"\ud83d\udce1 \u064a\u062a\u0645 \u0627\u0644\u0622\u0646 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u062e\u0627\u062f\u0645 ADSL\\n\"\n        \"\u23f1\ufe0f \u0642\u062f \u064a\u0633\u062a\u063a\u0631\u0642 \u0627\u0644\u0623\u0645\u0631 \u0628\u0636\u0639 \u062b\u0648\u0627\u0646\u064d...\",\n        parse_mode='Markdown')\n\n    info = get_adsl_info(phone_number)\n\n    await processing_msg.delete()\n    await send_balance_info(update, phone_number, info)\n\n    # \u0639\u0631\u0636 \u062e\u064a\u0627\u0631 \u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0641\u0642\u0637\n    if info:\n        user_numbers = saved_numbers_all.get(chat_id, {})\n        if phone_number not in user_numbers:\n            keyboard = [[\n                InlineKeyboardButton(\"\ud83d\udcbe \u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645\",\n                                     callback_data=f'save_{phone_number}'),\n                InlineKeyboardButton(\"\ud83d\udd04 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062c\u062f\u064a\u062f\", callback_data='new_query')\n            ], [InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')]]\n            reply_markup = InlineKeyboardMarkup(keyboard)\n            await update.message.reply_text(\n                \"\u2754 *\u0647\u0644 \u062a\u0631\u063a\u0628 \u0641\u064a \u062d\u0641\u0638 \u0647\u0630\u0627 \u0627\u0644\u0631\u0642\u0645 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647 \u0644\u0627\u062d\u0642\u0627\u064b\u061f*\",\n                reply_markup=reply_markup,\n                parse_mode='Markdown')\n\n\nasync def button_handler(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:\n    query = update.callback_query\n    chat_id = str(query.message.chat.id)\n    await query.answer()\n\n    if query.data == 'add_number':\n        await query.edit_message_text(\n            \"\ud83d\udcdd *\u0625\u0636\u0627\u0641\u0629 \u0631\u0642\u0645 \u062c\u062f\u064a\u062f \u0644\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udcf1 \u064a\u0631\u062c\u0649 \u0625\u0631\u0633\u0627\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0645\u0643\u0648\u0646 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645\\n\"\n            \"\u270f\ufe0f \u0645\u062b\u0627\u0644: `71234567`\\n\\n\"\n            \"\ud83d\udd19 \u0644\u0644\u0639\u0648\u062f\u0629 \u0627\u0636\u063a\u0637 /start\",\n            parse_mode='Markdown')\n        return ADD_NUMBER\n\n    elif query.data == 'manage_numbers':\n        user_numbers = saved_numbers_all.get(chat_id, {})\n        if not user_numbers:\n            await query.edit_message_text(\n                \"\u26a0\ufe0f *\u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                \"\u0644\u0645 \u062a\u0642\u0645 \u0628\u0625\u0636\u0627\u0641\u0629 \u0623\u064a \u0623\u0631\u0642\u0627\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a \u0628\u0639\u062f\\n\\n\"\n                \"\u2795 \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u062c\u062f\u064a\u062f\u0629 \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\\n\\n\"\n                \"\ud83c\udfe0 \u0627\u0636\u063a\u0637 \u0644\u0644\u0639\u0648\u062f\u0629 \u0625\u0644\u0649 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                reply_markup=InlineKeyboardMarkup(\n                    [[InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')]]),\n                parse_mode='Markdown')\n            return\n\n        keyboard = []\n        for num in user_numbers:\n            keyboard.append([\n                InlineKeyboardButton(f\"\ud83d\uddd1\ufe0f \u062d\u0630\u0641 {num}\", callback_data=f'delete_{num}')\n            ])\n        keyboard.append([InlineKeyboardButton(\"\u2795 \u0625\u0636\u0627\u0641\u0629 \u0631\u0642\u0645 \u062c\u062f\u064a\u062f\", callback_data='add_number')])\n        keyboard.append([InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')])\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(\n            \"\ud83d\uddc2\ufe0f *\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udd18 \u0627\u062e\u062a\u0631 \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0630\u064a \u062a\u0631\u064a\u062f \u0625\u062f\u0627\u0631\u062a\u0647:\\n\\n\"\n            \"\ud83d\uddd1\ufe0f \u0632\u0631 \u0627\u0644\u062d\u0630\u0641 - \u0644\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a\",\n            reply_markup=reply_markup,\n            parse_mode='Markdown')\n        return DELETE_NUMBER\n\n    elif query.data == 'query_numbers':\n        user_numbers = saved_numbers_all.get(chat_id, {})\n        if not user_numbers:\n            await query.edit_message_text(\n                \"\ud83d\udcca *\u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                \"\u26a0\ufe0f \u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629 \u062d\u0627\u0644\u064a\u0627\u064b\\n\\n\"\n                \"\u2795 \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u062c\u062f\u064a\u062f\u0629 \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\\n\\n\"\n                \"\ud83c\udfe0 \u0627\u0636\u063a\u0637 \u0644\u0644\u0639\u0648\u062f\u0629 \u0625\u0644\u0649 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                reply_markup=InlineKeyboardMarkup(\n                    [[InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')]]),\n                parse_mode='Markdown')\n            return\n\n        processing_msg = await query.message.reply_text(\n            \"\u23f3 *\u062c\u0627\u0631\u064a \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udce1 \u064a\u062a\u0645 \u0627\u0644\u0622\u0646 \u062c\u0644\u0628 \u0623\u062d\u062f\u062b \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0639\u0646 \u062c\u0645\u064a\u0639 \u0627\u0644\u0623\u0631\u0642\u0627\u0645\\n\"\n            \"\u23f1\ufe0f \u0642\u062f \u062a\u0633\u062a\u063a\u0631\u0642 \u0627\u0644\u0639\u0645\u0644\u064a\u0629 \u0628\u0639\u0636 \u0627\u0644\u0648\u0642\u062a...\",\n            parse_mode='Markdown')\n\n        table_data = []\n        for num in user_numbers:\n            info = get_adsl_info(num)\n            end_date_str = info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '') if info else ''\n            remaining_days = None\n\n            if end_date_str:\n                try:\n                    end_date = datetime.strptime(end_date_str, \"%Y-%m-%d\")\n                    now_date = datetime.now(YEMEN_TZ).replace(tzinfo=None)\n                    remaining_days = (end_date - now_date).days\n                except:\n                    remaining_days = None\n\n            if info:\n                balance = info.get('\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')\n                if remaining_days is not None:\n                    if remaining_days < 0:\n                        balance += \" \u2757\ufe0f (\u0627\u0646\u062a\u0647\u0649 \u0627\u0644\u0627\u0634\u062a\u0631\u0627\u0643)\"\n                    elif remaining_days <= 5:\n                        balance += f\" \u26a0\ufe0f ({remaining_days} \u0623\u064a\u0627\u0645 \u0645\u062a\u0628\u0642\u064a\u0629)\"\n                table_data.append([\n                    num,\n                    balance,\n                    info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')\n                ])\n            else:\n                table_data.append([num, \"\u274c \u0641\u0634\u0644\", \"\u274c \u0641\u0634\u0644\"])\n\n        headers = [\"\ud83d\udcf1 \u0627\u0644\u0631\u0642\u0645\", \"\ud83d\udcb5 \u0627\u0644\u0631\u0635\u064a\u062f\", \"\ud83d\udcc5 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621\"]\n        table = tabulate(table_data, headers=headers, tablefmt=\"grid\")\n\n        response = (\"\ud83d\udcca *\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a*\\n\"\n                    \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                    f\"```\\n{table}\\n```\\n\"\n                    f\"\ud83d\udd22 *\u0639\u062f\u062f \u0627\u0644\u0623\u0631\u0642\u0627\u0645:* {len(user_numbers)}\\n\\n\"\n                    \"\u2728 \u062a\u0645 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621 \u0645\u0646 \u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0628\u0646\u062c\u0627\u062d\")\n\n        await processing_msg.delete()\n        await query.message.reply_text(response, parse_mode='Markdown')\n\n    elif query.data == 'schedule_query':\n        keyboard = [[\n            InlineKeyboardButton(\"\ud83d\udd56 7 \u0635\u0628\u0627\u062d\u0627\u064b\", callback_data='hour_7_AM'),\n            InlineKeyboardButton(\"\ud83d\udd58 9 \u0635\u0628\u0627\u062d\u0627\u064b\", callback_data='hour_9_AM'),\n            InlineKeyboardButton(\"\ud83d\udd5b 12 \u0638\u0647\u0631\u0627\u064b\", callback_data='hour_12_PM')\n        ],\n                    [\n                        InlineKeyboardButton(\"\ud83d\udd53 4 \u0639\u0635\u0631\u0627\u064b\", callback_data='hour_4_PM'),\n                        InlineKeyboardButton(\"\ud83d\udd57 8 \u0645\u0633\u0627\u0621\u064b\", callback_data='hour_8_PM'),\n                        InlineKeyboardButton(\"\ud83d\udd65 10 \u0645\u0633\u0627\u0621\u064b\", callback_data='hour_10_PM')\n                    ],\n                    [\n                        InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')\n                    ]]\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(\n            \"\u23f0 *\u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udcc5 \u064a\u0631\u062c\u0649 \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0645\u0641\u0636\u0644 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u064a\u0648\u0645\u064a\\n\\n\"\n            \"\u23f1\ufe0f \u0633\u064a\u062a\u0645 \u0625\u062c\u0631\u0627\u0621 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062a\u0644\u0642\u0627\u0626\u064a\u0627\u064b \u0641\u064a \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0645\u062d\u062f\u062f\\n\\n\"\n            \"\ud83c\udfe0 \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0639\u0648\u062f\u0629 \u0644\u0644\u0645\u0628\u0627\u0634\u0631\u0629\",\n            reply_markup=reply_markup,\n            parse_mode='Markdown')\n        return SCHEDULE_HOUR\n\n    elif query.data == 'help':\n        help_text = (\"\u2139\ufe0f *\u062f\u0644\u064a\u0644 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0628\u0648\u062a*\\n\"\n                     \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                     \"\ud83d\udd39 *\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a*:\\n\"\n                     \"   - \u0623\u0631\u0633\u0644 \u0627\u0644\u0631\u0642\u0645 \u0645\u0628\u0627\u0634\u0631\u0629 (8 \u0623\u0631\u0642\u0627\u0645)\\n\"\n                     \"   - \u0623\u0648 \u0627\u0636\u063a\u0637 \u0639\u0644\u0649 '\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a'\\n\\n\"\n                     \"\ud83d\udd39 *\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645*:\\n\"\n                     \"   - \u062d\u0641\u0638 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a\\n\"\n                     \"   - \u062d\u0630\u0641 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629\\n\\n\"\n                     \"\ud83d\udd39 *\u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a*:\\n\"\n                     \"   - \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062c\u0645\u064a\u0639 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u062f\u0641\u0639\u0629 \u0648\u0627\u062d\u062f\u0629\\n\\n\"\n                     \"\ud83d\udd39 *\u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645*:\\n\"\n                     \"   - \u0636\u0628\u0637 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062a\u0644\u0642\u0627\u0626\u064a \u064a\u0648\u0645\u064a \u0641\u064a \u0648\u0642\u062a \u0645\u062d\u062f\u062f\\n\\n\"\n                     \"\ud83d\udccc *\u0645\u0644\u0627\u062d\u0638\u0627\u062a \u0645\u0647\u0645\u0629*:\\n\"\n                     \"   - \u064a\u062c\u0628 \u0623\u0646 \u064a\u062a\u0643\u0648\u0646 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645\\n\"\n                     \"   - \u0627\u0644\u062e\u062f\u0645\u0629 \u0645\u062a\u0648\u0641\u0631\u0629 \u0644\u062c\u0645\u064a\u0639 \u0639\u0645\u0644\u0627\u0621 ADSL \u0627\u0644\u064a\u0645\u0646\\n\\n\"\n                     \"\ud83c\udfe0 \u0627\u0636\u063a\u0637 \u0644\u0644\u0639\u0648\u062f\u0629 \u0625\u0644\u0649 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\")\n        keyboard = [[InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')]]\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(help_text, reply_markup=reply_markup, parse_mode='Markdown')\n\n    elif query.data == 'back':\n        await start(update, context)\n\n    elif query.data == 'new_query':\n        keyboard = [[InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')]]\n        await query.edit_message_text(\n            \"\ud83d\udd0d *\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062c\u062f\u064a\u062f*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udcf1 \u064a\u0631\u062c\u0649 \u0625\u0631\u0633\u0627\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0645\u0643\u0648\u0646 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645\\n\"\n            \"\u270f\ufe0f \u0645\u062b\u0627\u0644: `71234567`\",\n            reply_markup=InlineKeyboardMarkup(keyboard),\n            parse_mode='Markdown')\n\n    elif query.data.startswith('save_'):\n        phone_number = query.data[5:]\n        if chat_id not in saved_numbers_all:\n            saved_numbers_all[chat_id] = {}\n        saved_numbers_all[chat_id][phone_number] = True\n        save_numbers_to_file(saved_numbers_all)\n        await query.edit_message_text(\n            f\"\u2705 *\u062a\u0645 \u0627\u0644\u062d\u0641\u0638 \u0628\u0646\u062c\u0627\u062d*\\n\"\n            f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            f\"\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645 `{phone_number}` \u0641\u064a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a\\n\\n\"\n            f\"\ud83d\udccb \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0622\u0646 \u0625\u062c\u0631\u0627\u0621 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062c\u0645\u0627\u0639\u064a \u0623\u0648 \u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645\u0627\u062a \u062a\u0644\u0642\u0627\u0626\u064a\u0629\",\n            parse_mode='Markdown')\n        await start(update, context)\n\n\nasync def delete_number(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:\n    query = update.callback_query\n    chat_id = str(query.message.chat.id)\n    await query.answer()\n\n    if query.data.startswith('delete_'):\n        num_to_delete = query.data[7:]\n        user_numbers = saved_numbers_all.get(chat_id, {})\n        if num_to_delete in user_numbers:\n            del user_numbers[num_to_delete]\n            save_numbers_to_file(saved_numbers_all)\n            await query.edit_message_text(\n                f\"\u2705 *\u062a\u0645 \u0627\u0644\u062d\u0630\u0641 \u0628\u0646\u062c\u0627\u062d*\\n\"\n                f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                f\"\u2022 *\u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0645\u062d\u0630\u0648\u0641:* `{num_to_delete}`\\n\\n\"\n                f\"\ud83d\udccb \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u062c\u062f\u064a\u062f\u0629 \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                parse_mode='Markdown')\n        else:\n            await query.edit_message_text(\n                \"\u26a0\ufe0f *\u062a\u0639\u0630\u0631 \u0627\u0644\u062d\u0630\u0641*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                \"\u2022 \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0645\u0637\u0644\u0648\u0628 \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f \u0641\u064a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a\\n\\n\"\n                \"\ud83d\udccb \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0648\u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649\",\n                parse_mode='Markdown')\n\n    await start(update, context)\n    return ConversationHandler.END\n\n\nasync def schedule_hour(update: Update, context: ContextTypes.DEFAULT_TYPE) -> int:\n    query = update.callback_query\n    chat_id = str(query.message.chat.id)\n    await query.answer()\n\n    if query.data.startswith('hour_'):\n        time_parts = query.data.split('_')  # ['hour', '7', 'AM'] \u0645\u062b\u0644\u0627\u064b\n        hour = int(time_parts[1])\n        ampm = time_parts[2]\n\n        # \u062a\u062d\u0648\u064a\u0644 \u0625\u0644\u0649 24 \u0633\u0627\u0639\u0629\n        if ampm == 'PM' and hour < 12:\n            hour += 12\n        elif ampm == 'AM' and hour == 12:\n            hour = 0\n\n        # \u062d\u0641\u0638 \u0627\u0644\u062c\u062f\u0648\u0644\u0629 (\u0648\u0642\u062a \u0648\u0627\u062d\u062f \u0641\u0642\u0637 \u0644\u0643\u0644 \u0645\u0633\u062a\u062e\u062f\u0645)\n        scheduled_times[chat_id] = {'hour': hour, 'minute': 0, 'ampm': ampm}\n        save_scheduled_times(scheduled_times)\n\n        now = datetime.now(YEMEN_TZ)\n        scheduled_time = now.replace(hour=hour, minute=0, second=0, microsecond=0)\n        if scheduled_time < now:\n            scheduled_time += timedelta(days=1)\n\n        # \u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0633\u0627\u0628\u0642\u0629 \u0625\u0646 \u0648\u062c\u062f\u062a\n        if chat_id in scheduled_jobs:\n            scheduled_jobs[chat_id].schedule_removal()\n\n        try:\n            job = context.application.job_queue.run_repeating(\n                auto_query_callback,\n                interval=timedelta(days=1),\n                first=timedelta(seconds=(scheduled_time - now).total_seconds()),\n                chat_id=int(chat_id))\n            scheduled_jobs[chat_id] = job\n\n            await query.edit_message_text(\n                f\"\u2705 *\u062a\u0645\u062a \u0627\u0644\u062c\u062f\u0648\u0644\u0629 \u0628\u0646\u062c\u0627\u062d*\\n\"\n                f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                f\"\u2022 *\u0648\u0642\u062a \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645:* {time_parts[1]} {'\u0635\u0628\u0627\u062d\u0627\u064b' if ampm == 'AM' else '\u0645\u0633\u0627\u0621\u064b'}\\n\"\n                f\"\u2022 \u0633\u064a\u0628\u062f\u0623 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a \u064a\u0648\u0645\u064a\u0627\u064b \u0641\u064a \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0645\u062d\u062f\u062f\\n\\n\"\n                f\"\ud83d\udccb \u064a\u0645\u0643\u0646\u0643 \u062a\u0639\u062f\u064a\u0644 \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0645\u0631\u0629 \u0648\u0627\u062d\u062f\u0629 \u064a\u0648\u0645\u064a\u0627\u064b \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                parse_mode='Markdown')\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u062c\u062f\u0648\u0644\u0629: {e}\")\n            await query.edit_message_text(\n                \"\u26a0\ufe0f *\u062a\u0639\u0630\u0631 \u0625\u0639\u062f\u0627\u062f \u0627\u0644\u062c\u062f\u0648\u0644\u0629*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                \"\u062d\u062f\u062b \u062e\u0637\u0623 \u062a\u0642\u0646\u064a \u0623\u062b\u0646\u0627\u0621 \u0645\u062d\u0627\u0648\u0644\u0629 \u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645\\n\\n\"\n                \"\ud83d\udd04 \u064a\u0631\u062c\u0649 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649\",\n                parse_mode='Markdown')\n\n    await start(update, context)\n    return ConversationHandler.END\n\n\nasync def auto_query_callback(context: ContextTypes.DEFAULT_TYPE):\n    job = context.job\n    chat_id = str(job.chat_id)\n\n    user_numbers = saved_numbers_all.get(chat_id, {})\n    if not user_numbers:\n        await context.bot.send_message(\n            job.chat_id, \"\u26a0\ufe0f *\u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0623\u064a \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647\u0627\\n\\n\"\n            \"\u2795 \u064a\u0631\u062c\u0649 \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u0623\u0648\u0644\u0627\u064b \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n            parse_mode='Markdown')\n        return\n\n    processing_msg = await context.bot.send_message(\n        job.chat_id, \"\u23f3 *\u062c\u0627\u0631\u064a \u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a*\\n\"\n        \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n        \"\ud83d\udce1 \u064a\u062a\u0645 \u0627\u0644\u0622\u0646 \u062c\u0644\u0628 \u0623\u062d\u062f\u062b \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0639\u0646 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629\\n\"\n        \"\u23f1\ufe0f \u064a\u0631\u062c\u0649 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631...\",\n        parse_mode='Markdown')\n\n    table_data = []\n    for num in user_numbers:\n        info = get_adsl_info(num)\n        end_date_str = info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '') if info else ''\n        remaining_days = None\n\n        if end_date_str:\n            try:\n                end_date = datetime.strptime(end_date_str, \"%Y-%m-%d\")\n                now_date = datetime.now(YEMEN_TZ).replace(tzinfo=None)\n                remaining_days = (end_date - now_date).days\n            except:\n                remaining_days = None\n\n        if info:\n            balance = info.get('\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')\n            if remaining_days is not None:\n                if remaining_days < 0:\n                    balance += \" \u2757\ufe0f (\u0627\u0646\u062a\u0647\u0649 \u0627\u0644\u0627\u0634\u062a\u0631\u0627\u0643)\"\n                elif remaining_days <= 5:\n                    balance += f\" \u26a0\ufe0f ({remaining_days} \u0623\u064a\u0627\u0645 \u0645\u062a\u0628\u0642\u064a\u0629)\"\n            table_data.append([\n                num,\n                balance,\n                info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')\n            ])\n        else:\n            table_data.append([num, \"\u274c \u0641\u0634\u0644\", \"\u274c \u0641\u0634\u0644\"])\n\n    headers = [\"\ud83d\udcf1 \u0627\u0644\u0631\u0642\u0645\", \"\ud83d\udcb5 \u0627\u0644\u0631\u0635\u064a\u062f\", \"\ud83d\udcc5 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621\"]\n    table = tabulate(table_data, headers=headers, tablefmt=\"grid\")\n\n    response = (\"\u23f0 *\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                f\"```\\n{table}\\n```\\n\"\n                f\"\ud83d\udd22 *\u0639\u062f\u062f \u0627\u0644\u0623\u0631\u0642\u0627\u0645:* {len(user_numbers)}\\n\\n\"\n                \"\u2728 \u062a\u0645 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621 \u0645\u0646 \u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0628\u0646\u062c\u0627\u062d\")\n\n    await processing_msg.delete()\n    await context.bot.send_message(job.chat_id, response, parse_mode='Markdown')\n\n\nasync def error_handler(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:\n    logger.error(msg=\"\u062d\u062f\u062b \u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u0628\u0648\u062a:\", exc_info=context.error)\n    if update.message:\n        await update.message.reply_text(\n            \"\u26d4 *\u0639\u0630\u0631\u0627\u064b\u060c \u062d\u062f\u062b \u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\u0644\u0642\u062f \u0648\u0627\u062c\u0647\u0646\u0627 \u0645\u0634\u0643\u0644\u0629 \u062a\u0642\u0646\u064a\u0629 \u0623\u062b\u0646\u0627\u0621 \u0645\u0639\u0627\u0644\u062c\u0629 \u0637\u0644\u0628\u0643\\n\\n\"\n            \"\ud83d\udd04 \u064a\u0631\u062c\u0649 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649 \u0644\u0627\u062d\u0642\u0627\u064b\",\n            parse_mode='Markdown')\n\n\ndef main():\n    server_thread = threading.Thread(target=run)\n    server_thread.start()\n\n    application = ApplicationBuilder().token(\n        \"7563226990:AAFg2E5-f6EcVEjBK7ph5w8Q064P4daZlj0\").build()\n\n    conv_handler = ConversationHandler(\n        entry_points=[CallbackQueryHandler(button_handler)],\n        states={\n            ADD_NUMBER: [MessageHandler(filters.TEXT & ~filters.COMMAND, add_number)],\n            DELETE_NUMBER: [CallbackQueryHandler(delete_number)],\n            SCHEDULE_HOUR: [CallbackQueryHandler(schedule_hour)]\n        },\n        fallbacks=[CommandHandler(\"start\", start)],\n        per_message=True)\n\n    application.add_handler(CommandHandler(\"start\", start))\n    application.add_handler(conv_handler)\n    application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))\n    application.add_error_handler(error_handler)\n\n    logger.info(\"\ud83e\udd16 \u0627\u0644\u0628\u0648\u062a \u064a\u0639\u0645\u0644...\")\n    application.run_polling()\n\n\nif __name__ == '__main__':\n    main()\n```\n\n---\n\n## \u0645\u0644\u0627\u062d\u0638\u0627\u062a \u0647\u0627\u0645\u0629\n- \u0627\u0644\u0643\u0648\u062f \u0623\u0636\u0627\u0641 \u062e\u064a\u0627\u0631\u064a\u0646 \u0648\u0642\u062a \u062c\u062f\u0648\u0644\u0629 \u062c\u062f\u064a\u062f\u064a\u0646: 7 \u0635\u0628\u0627\u062d\u0627\u064b \u064810 \u0645\u0633\u0627\u0621\u064b (\u064a\u0645\u0643\u0646\u0643 \u062a\u0639\u062f\u064a\u0644 \u0623\u0648 \u0625\u0636\u0627\u0641\u0629 \u0623\u0648\u0642\u0627\u062a \u0623\u062e\u0631\u0649 \u0628\u0646\u0641\u0633 \u0627\u0644\u0646\u0645\u0637).\n- \u062a\u0645 \u062a\u0639\u062f\u064a\u0644 \u0631\u0633\u0627\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0641\u0631\u062f\u064a (`send_balance_info`) \u0648\u062c\u062f\u0648\u0644 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a \u0648\u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a (`query_numbers`, `auto_query_callback`) \u0644\u0625\u0638\u0647\u0627\u0631 \u062a\u062d\u0630\u064a\u0631 \u0625\u0630\u0627 \u062a\u0628\u0642\u0649 5 \u0623\u064a\u0627\u0645 \u0623\u0648 \u0623\u0642\u0644 \u0623\u0648 \u0627\u0646\u062a\u0647\u0627\u0621 \u0627\u0644\u0627\u0634\u062a\u0631\u0627\u0643.\n- \u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0633\u062a\u0628\u062f\u0627\u0644 `token` \u0641\u064a `ApplicationBuilder()` \u0628\u0627\u0644\u062a\u0648\u0643\u0646 \u0627\u0644\u062e\u0627\u0635 \u0628\u0627\u0644\u0628\u0648\u062a \u0639\u0646\u062f\u0643.\n- \u064a\u0631\u062c\u0649 \u0627\u062e\u062a\u0628\u0627\u0631 \u0627\u0644\u0643\u0648\u062f \u0641\u064a \u0628\u064a\u0626\u0629 \u0645\u0646\u0627\u0633\u0628\u0629 \u0648\u062a\u062c\u0631\u0628\u062a\u0647.\n\n\u0625\u0630\u0627 \u0623\u0631\u062f\u062a \u0623\u064a \u0645\u0633\u0627\u0639\u062f\u0629 \u0625\u0636\u0627\u0641\u064a\u0629 \u0641\u064a \u062a\u0639\u062f\u064a\u0644 \u0623\u0648 \u0634\u0631\u062d \u0623\u064a \u062c\u0632\u0621 \u0644\u0627 \u062a\u062a\u0631\u062f\u062f \u0628\u0645\u0631\u0627\u0633\u0644\u062a\u0646\u0627. \u0628\u0627\u0644\u062a\u0648\u0641\u064a\u0642!","behavior":"degenerate_repetition","conversation_hash":"88ad2ca5c15f4cca6886c8e0c257ccb4","conversation_redacted":false,"conversation_toxic":false,"country":"Yemen","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Arabic","model":"gpt-4.1-mini-2025-04-14","n_chars":25003,"n_turns_in_conversation":4,"n_words":2032,"source_row_offset":38294,"source_shard":"turns-00079.parquet","timestamp":"Thu, 15 May 2025 05:38:37 GMT","turn_id":"f035674896d28e785b066fd4","turn_index":1,"user_text":"\u0627\u0639\u0637\u064a\u0646\u064a \u0627\u0644\u0643\u0648\u062f \u0627\u0644\u0643\u0627\u0645\u0644 \u0628\u0639\u062f \u0627\u0644\u062a\u0639\u062f\u064a\u0644 \u0644\u0627\u0642\u0648\u0645 \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645\u0629 \u0645\u0628\u0627\u0634\u0631\u0629"},{"assistant_initiates":false,"asst_text":"\u0646\u0639\u0645\u060c \u0627\u0644\u0643\u0648\u062f \u0627\u0644\u0630\u064a \u0623\u0631\u0641\u0642\u062a\u0647 \u0628\u0634\u0643\u0644 \u0639\u0627\u0645 \u062c\u0627\u0647\u0632 \u0644\u0644\u0639\u0645\u0644 \u0645\u0639 \u062e\u062f\u0645\u0629 \u0645\u062b\u0644 https://pulsetic.com/uptimerobot-alternative/ \u0637\u0627\u0644\u0645\u0627 \u0623\u0646\u0647\u0627 \u062a\u062f\u0639\u0645 \u062a\u0634\u063a\u064a\u0644 \u0628\u0648\u062a\u0627\u062a Python \u0645\u0639 \u0625\u0645\u0643\u0627\u0646\u064a\u0629 \u0641\u062a\u062d \u062e\u062f\u0645\u0629 \u0648\u064a\u0628 (\u0648\u0647\u0648 \u0645\u0627 \u0642\u0645\u062a \u0628\u062a\u0648\u0641\u064a\u0631\u0647 \u0639\u0628\u0631 Flask \u0639\u0644\u0649 \u0627\u0644\u0645\u0646\u0641\u0630 8080).\n\n\u0628\u0639\u0636 \u0627\u0644\u0646\u0642\u0627\u0637 \u0627\u0644\u0645\u0647\u0645\u0629 \u0644\u0644\u062a\u0623\u0643\u062f \u0645\u0646\u0647\u0627 \u0644\u0643\u064a \u064a\u0639\u0645\u0644 \u0628\u0648\u062a\u0643 \u0628\u0634\u0643\u0644 \u0635\u062d\u064a\u062d \u0641\u064a \u0628\u064a\u0626\u0629 \u0645\u062b\u0644 pulsetic \u0623\u0648 \u0623\u064a \u062e\u062f\u0645\u0629 \u0627\u0633\u062a\u0636\u0627\u0641\u0629 \u0645\u0634\u0627\u0628\u0647\u0629:\n\n1. **\u0627\u0644\u062e\u062f\u0645\u0629 \u062a\u0639\u062a\u0645\u062f \u0639\u0644\u0649 \u0628\u0642\u0627\u0621 \u0627\u0644\u0628\u0631\u0646\u0627\u0645\u062c \u0634\u063a\u0651\u0627\u0644\u064b\u0627 (Persistent Running Process):**  \n   \u0647\u0630\u0627 \u0636\u0631\u0648\u0631\u064a \u0644\u0623\u0646 \u0628\u0648\u062a \u062a\u0644\u063a\u0631\u0627\u0645 \u064a\u0639\u0645\u0644 \u0643\u0639\u0645\u0644\u064a\u0629 \u0645\u0633\u062a\u0645\u0631\u0629 (long polling). \u0627\u0644\u0643\u0648\u062f \u064a\u0633\u062a\u062e\u062f\u0645 `application.run_polling()` \u0645\u0639 Flask \u064a\u062e\u062f\u0645 \u0639\u0644\u0649 \u0627\u0644\u0648\u064a\u0628 \u0641\u064a \u062e\u064a\u0637 \u0645\u0646\u0641\u0635\u0644.\n\n2. **\u0627\u0644\u0645\u0646\u0641\u0630 8080 \u0645\u0641\u062a\u0648\u062d \u0648\u0645\u0633\u0645\u0648\u062d \u0628\u0647 \u0641\u064a \u0627\u0644\u062e\u062f\u0645\u0629:**  \n   \u0644\u0623\u0646 Flask \u0645\u0642\u062f\u0645 \u062e\u062f\u0645\u0629 \u0648\u064a\u0628 \u0639\u0644\u0649 \u0647\u0630\u0627 \u0627\u0644\u0645\u0646\u0641\u0630 (`app.run(host=\"0.0.0.0\", port=8080)`) \u0644\u064a\u062a\u0645\u0643\u0646 pulsetic \u0645\u0646 ping-\u0647\u0627 \u0639\u0644\u0649 `/` endpoint \u0644\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646 \u0627\u0644\u0628\u0648\u062a \u064a\u0639\u0645\u0644 (\u062e\u0627\u0635\u064a\u0629 \u0627\u0644\u0640 Uptime Monitoring).\n\n3. **\u0645\u0643\u062a\u0628\u0627\u062a \u0627\u0644\u0628\u0627\u064a\u062b\u0648\u0646 \u0627\u0644\u0644\u0627\u0632\u0645\u0629 \u0645\u062b\u0628\u062a\u0629:**  \n   \u0645\u062b\u0644 `python-telegram-bot`, `requests`, `beautifulsoup4`, `flask`, `pytz`, \u0648 `tabulate`  \n   (\u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u062a\u0647\u0645 \u0636\u0645\u0646 \u0645\u0644\u0641 `requirements.txt` \u0641\u064a \u0628\u064a\u0626\u0629 \u0627\u0644\u0627\u0633\u062a\u0636\u0627\u0641\u0629 \u0627\u0644\u062e\u0627\u0635\u0629 \u0628\u0643).\n\n4. **\u062a\u0648\u0643\u0646 \u0627\u0644\u0628\u0648\u062a \u0635\u0627\u0644\u062d \u0648\u0645\u0641\u0639\u0651\u0644:**  \n   \u0623\u064a \u062a\u0648\u0643\u0646 \u0627\u0644\u0628\u0648\u062a \u0627\u0644\u0630\u064a \u062a\u0636\u0639\u0647 \u0641\u064a  \n   ```python\n   application = ApplicationBuilder().token(\n       \"7563226990:AAFg2E5-f6EcVEjBK7ph5w8Q064P4daZlj0\").build()\n   ```  \n   \u064a\u062c\u0628 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0645\u062f\u062e\u0644 \u0635\u062d\u064a\u062d.\n\n5. **\u0627\u0644\u062a\u0639\u0627\u0645\u0644 \u0645\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a (json) \u0645\u0633\u0645\u0648\u062d \u0648\u0630\u0627\u062a \u0635\u0644\u0627\u062d\u064a\u0627\u062a \u0643\u062a\u0627\u0628\u0629:**  \n   \u0646\u0638\u0631\u064b\u0627 \u0644\u0623\u0646 \u0627\u0644\u0643\u0648\u062f \u064a\u062d\u0641\u0638 \u0648\u064a\u0642\u0631\u0623 \u0645\u0646 \u0645\u0644\u0641\u0627\u062a `saved_numbers.json` \u0648`scheduled_times.json` \u0641\u064a \u0645\u062c\u0644\u062f \u0627\u0644\u0639\u0645\u0644 \u0627\u0644\u062d\u0627\u0644\u064a\u060c \u062a\u0623\u0643\u062f \u0623\u0646\u0647 \u064a\u0645\u0643\u0646 \u0644\u0644\u0637\u0648\u0631 \u062a\u0646\u0641\u064a\u0630 \u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u0642\u0631\u0627\u0621\u0629 \u0648\u0627\u0644\u0643\u062a\u0627\u0628\u0629 \u0639\u0644\u0649 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0639\u0644\u0649 \u0627\u0644\u062e\u0627\u062f\u0645.\n\n---\n\n### \u0645\u0644\u062d\u0648\u0638\u0629:\n\n- \u0627\u0644\u0628\u0646\u064a\u0629 \u0627\u0644\u062d\u0627\u0644\u064a\u0629 \u062a\u0633\u062a\u062e\u062f\u0645 **long polling** \u0648\u0639\u0646\u062f \u0627\u0633\u062a\u0636\u0627\u0641\u0629 \u0641\u064a \u0633\u064a\u0631\u0641\u0631\u0627\u062a \u062a\u0642\u062f\u0645 \u0627\u0644\u0640 webhook \u0641\u0642\u062f \u062a\u062d\u062a\u0627\u062c \u0625\u0644\u0649 \u062a\u0639\u062f\u064a\u0644 \u0644\u064a\u0639\u0645\u0644 Webhook \u0628\u062f\u0644 polling\u060c \u0644\u0643\u0646 \u0645\u0639\u0638\u0645 \u062e\u062f\u0645\u0627\u062a \u0627\u0644\u0627\u0633\u062a\u0636\u0627\u0641\u0629 \u0627\u0644\u062a\u064a \u062a\u0633\u0645\u062d \u0644\u0643 \u0628\u062a\u0634\u063a\u064a\u0644 \u0633\u064a\u0631\u0641\u0631 Python \u0645\u0646\u0647\u0627 \u0628\u062f\u0648\u0646 \u0645\u0634\u0627\u0643\u0644 **polling** \u062a\u0639\u0645\u0644 \u0628\u0634\u0643\u0644 \u062c\u064a\u062f.\n\n- \u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646 \u0639\u0645\u0644\u064a\u0629 \u0628\u0648\u062a \u062a\u0644\u063a\u0631\u0627\u0645 \u062a\u0639\u0645\u0644 \u0643\u0639\u0645\u0644\u064a\u0629 \u062f\u0627\u0626\u0645\u0629 \u0648\u0644\u0627 \u062a\u0646\u0642\u0637\u0639 \u2014 \u0648\u0625\u0630\u0627 \u0643\u0646\u062a \u062a\u0633\u062a\u062e\u062f\u0645 pulsetic \u0641\u0647\u0630\u0627 \u064a\u0646\u0627\u0633\u0628 \u062a\u0645\u0627\u0645\u064b\u0627.\n\n---\n\n### \u062e\u0644\u0627\u0635\u0629:\n\n- **\u0627\u0644\u0643\u0648\u062f \u062c\u0627\u0647\u0632 \u0644\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0641\u064a pulsetic** \u0637\u0627\u0644\u0645\u0627 \u062a\u0645 \u062a\u0648\u0641\u064a\u0631 \u0645\u062a\u0637\u0644\u0628\u0627\u062a \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0628\u064a\u0626\u0629 (\u0645\u0643\u062a\u0628\u0627\u062a\u060c \u0635\u0644\u0627\u062d\u064a\u0627\u062a \u0627\u0644\u0645\u0644\u0641\u0627\u062a).\n- \u064a\u062d\u062a\u0641\u0638 \u0628\u062e\u062f\u0645\u0629 \u0648\u064a\u0628 \u062e\u0641\u064a\u0641\u0629 \u0639\u0644\u0649 `/` \u0644\u0645\u0631\u0627\u0642\u0628\u0629 uptime \u0648\u0647\u0648 \u0645\u0637\u0644\u0648\u0628 \u0641\u064a pulsetic \u0644\u062a\u062d\u062f\u064a\u062f \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0627\u0644\u0628\u0648\u062a \u0645\u0627 \u0632\u0627\u0644 \u0642\u064a\u062f \u0627\u0644\u0639\u0645\u0644.\n\n---\n\n\u0625\u0630\u0627 \u0623\u0631\u062f\u062a\u060c \u064a\u0645\u0643\u0646\u0646\u064a \u0645\u0633\u0627\u0639\u062f\u062a\u0643 \u0641\u064a \u0643\u062a\u0627\u0628\u0629 \u0645\u0644\u0641 `requirements.txt` \u0623\u0648 \u062a\u0642\u062f\u064a\u0645 \u062a\u0639\u0644\u064a\u0645\u0627\u062a \u0623\u062e\u0631\u0649 \u0644\u062a\u0647\u064a\u0626\u0629 \u0627\u0644\u0628\u0648\u062a \u0641\u064a \u062a\u0644\u0643 \u0627\u0644\u0645\u0646\u0635\u0629. \u0641\u0642\u0637 \u0623\u062e\u0628\u0631\u0646\u064a!","behavior":"degenerate_repetition","conversation_hash":"88ad2ca5c15f4cca6886c8e0c257ccb4","conversation_redacted":false,"conversation_toxic":false,"country":"Yemen","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Arabic","model":"gpt-4.1-mini-2025-04-14","n_chars":27353,"n_turns_in_conversation":4,"n_words":2244,"source_row_offset":38295,"source_shard":"turns-00079.parquet","timestamp":"Thu, 15 May 2025 05:38:37 GMT","turn_id":"df780aceabc7a7af751f6cec","turn_index":2,"user_text":"\u0647\u0644 \u0647\u0630\u0627 \u0627\u0644\u0643\u0648\u062f \u062c\u0627\u0647\u0632 \u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645\u0629 \u0641\u064a \u0645\u0648\u0642\u0639 https://pulsetic.com/uptimerobot-alternative/\n \u0644\u0644\u0639\u0644\u0645 \u0627\u0644\u0643\u0648\u062f\n\nimport requests\nfrom bs4 import BeautifulSoup\nfrom telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup\nfrom telegram.ext import (ApplicationBuilder, CommandHandler, MessageHandler,\n                          ContextTypes, filters, CallbackQueryHandler,\n                          ConversationHandler)\nimport logging\nimport json\nimport os\nfrom datetime import datetime, timedelta\nimport pytz\nfrom tabulate import tabulate\n\n# Flask \u0648 threading \u0644\u062e\u062f\u0645\u0629 \u0627\u0644\u0648\u064a\u0628\nfrom flask import Flask\nimport threading\n\napp = Flask('')\n\n\n@app.route('/')\ndef home():\n    return \"Bot is alive!\"\n\n\ndef run():\n    app.run(host=\"0.0.0.0\", port=8080)\n\n\nlogging.basicConfig(\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',\n    level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\nADD_NUMBER, DELETE_NUMBER, SCHEDULE_HOUR = range(3)\n\nSAVED_NUMBERS_FILE = \"saved_numbers.json\"\nSCHEDULED_TIMES_FILE = \"scheduled_times.json\"\n\nYEMEN_TZ = pytz.timezone('Asia/Aden')\n\n# --- \u0627\u0644\u062a\u0639\u062f\u064a\u0644: \u0627\u0644\u062a\u062d\u0645\u064a\u0644 \u0648\u062d\u0641\u0638 \u062d\u0633\u0628 chat_id ---\n\n\ndef load_saved_numbers():\n    if os.path.exists(SAVED_NUMBERS_FILE):\n        try:\n            with open(SAVED_NUMBERS_FILE, 'r', encoding='utf-8') as f:\n                return json.load(f)\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629: {e}\")\n            return {}\n    else:\n        return {}\n\n\ndef load_scheduled_times():\n    if os.path.exists(SCHEDULED_TIMES_FILE):\n        try:\n            with open(SCHEDULED_TIMES_FILE, 'r', encoding='utf-8') as f:\n                return json.load(f)\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0645\u064a\u0644 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629: {e}\")\n            return {}\n    else:\n        return {}\n\n\ndef save_numbers_to_file(numbers):\n    try:\n        with open(SAVED_NUMBERS_FILE, 'w', encoding='utf-8') as f:\n            json.dump(numbers, f, ensure_ascii=False, indent=4)\n    except Exception as e:\n        logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062d\u0641\u0638 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629: {e}\")\n\n\ndef save_scheduled_times(times):\n    try:\n        with open(SCHEDULED_TIMES_FILE, 'w', encoding='utf-8') as f:\n            json.dump(times, f, ensure_ascii=False, indent=4)\n    except Exception as e:\n        logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062d\u0641\u0638 \u0627\u0644\u0623\u0648\u0642\u0627\u062a \u0627\u0644\u0645\u062c\u062f\u0648\u0644\u0629: {e}\")\n\n\nsaved_numbers_all = load_saved_numbers()\nscheduled_times = load_scheduled_times()\nscheduled_jobs = {}\n\nADSL_URL = \"https://adsl-yemen.com/adsl4.php\"\n\n\ndef get_adsl_info(phone_number):\n    try:\n        data = {\"mobile\": phone_number, \"action\": \"query\"}\n        response = requests.post(ADSL_URL, data=data)\n\n        if response.status_code == 200:\n            soup = BeautifulSoup(response.text, 'html.parser')\n            results = soup.find_all(\"div\", class_=\"result-box\")\n            data_dict = {}\n            for box in results:\n                title_div = box.find(\"div\", class_=\"result-title\")\n                value_div = box.find(\"div\", class_=\"result-value\")\n                if title_div and value_div:\n                    title = title_div.text.strip()\n                    value = value_div.text.strip()\n                    data_dict[title] = value\n\n            data_dict['timestamp'] = datetime.now(YEMEN_TZ).strftime(\n                \"%Y-%m-%d %H:%M:%S\")\n            return data_dict\n        else:\n            return None\n    except Exception as e:\n        logger.error(f\"\u062d\u062f\u062b \u062e\u0637\u0623 \u0623\u062b\u0646\u0627\u0621 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0631\u0635\u064a\u062f: {e}\")\n        return None\n\n\nasync def send_balance_info(update, phone_number, info):\n    if info:\n        end_date_str = info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', None)\n        warning_text = \"\"\n        if end_date_str:\n            try:\n                end_date = datetime.strptime(end_date_str, \"%Y-%m-%d\")\n                now_date = datetime.now(YEMEN_TZ).replace(tzinfo=None)\n                days_left = (end_date - now_date).days\n\n                if 0 <= days_left <= 5:\n                    warning_text = f\"\\n\u26a0\ufe0f *\u062a\u0646\u0628\u064a\u0647:* \u062a\u0628\u0642\u0649 \u0641\u0642\u0637 {days_left} \u064a\u0648\u0645 \u0639\u0644\u0649 \u0627\u0646\u062a\u0647\u0627\u0621 \u0627\u0644\u0628\u0627\u0642\u0629!\"\n                elif days_left < 0:\n                    warning_text = \"\\n\u2757\ufe0f \u0627\u0646\u062a\u0647\u062a \u0635\u0644\u0627\u062d\u064a\u0629 \u0627\u0644\u0628\u0627\u0642\u0629.\"\n\n            except Exception as e:\n                logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u062a\u062d\u0644\u064a\u0644 \u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621: {e}\")\n\n        response = (\n            f\"\ud83c\udf1f *\u0646\u062a\u0627\u0626\u062c \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL*\\n\"\n            f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            f\"\ud83d\udcf1 *\u0627\u0644\u0631\u0642\u0645:* {phone_number}\\n\\n\"\n            f\"\ud83d\udcb3 *\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a:* {info.get('\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')}\\n\"\n            f\"\ud83d\udce6 *\u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629:* {info.get('\u0642\u064a\u0645\u0629 \u0627\u0644\u0628\u0627\u0642\u0629', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')}\\n\"\n            f\"\u23f3 *\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621:* {end_date_str if end_date_str else '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631'}\"\n            f\"{warning_text}\\n\\n\"\n            f\"\ud83d\udd04 \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0647\u0630\u0627 \u0627\u0644\u0631\u0642\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647 \u0644\u0627\u062d\u0642\u0627\u064b\")\n    else:\n        response = (\"\u26a0\ufe0f *\u0639\u0630\u0631\u0627\u064b\u060c \u062a\u0639\u0630\u0631 \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0631\u0635\u064a\u062f*\\n\"\n                    \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                    \"\ud83d\uded1 *\u0627\u0644\u0623\u0633\u0628\u0627\u0628 \u0627\u0644\u0645\u062d\u062a\u0645\u0644\u0629:*\\n\"\n                    \"\u2022 \u0627\u0644\u0631\u0642\u0645 \u063a\u064a\u0631 \u0645\u0633\u062c\u0644 \u0641\u064a \u062e\u062f\u0645\u0629 ADSL\\n\"\n                    \"\u2022 \u0648\u062c\u0648\u062f \u0645\u0634\u0643\u0644\u0629 \u062a\u0642\u0646\u064a\u0629 \u0645\u0624\u0642\u062a\u0629\\n\"\n                    \"\u2022 \u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0627\u0644\u062e\u0627\u062f\u0645\\n\\n\"\n                    \"\ud83d\udd0d \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u0631\u0642\u0645 \u0648\u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0644\u0627\u062d\u0642\u0627\u064b\")\n\n    if isinstance(update, Update):\n        await update.message.reply_text(response, parse_mode='Markdown')\n    else:\n        await update.reply_text(response, parse_mode='Markdown')\n\n\nasync def add_number(update: Update,\n                     context: ContextTypes.DEFAULT_TYPE) -> int:\n    chat_id = str(update.effective_chat.id)\n    phone_number = update.message.text.strip()\n\n    if not phone_number.isdigit() or len(phone_number) != 8:\n        await update.message.reply_text(\n            \"\u26a0\ufe0f *\u0631\u0642\u0645 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d!*\\n\u064a\u062c\u0628 \u0623\u0646 \u064a\u062a\u0643\u0648\u0646 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645 \u0641\u0642\u0637.\\n\u0645\u062b\u0627\u0644: 71234567\",\n            parse_mode='Markdown')\n        return ADD_NUMBER\n\n    # \u062a\u062d\u0642\u0642 \u0648\u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0641\u0642\u0637\n    if chat_id not in saved_numbers_all:\n        saved_numbers_all[chat_id] = {}\n    saved_numbers_all[chat_id][phone_number] = True\n    save_numbers_to_file(saved_numbers_all)\n\n    await update.message.reply_text(f\"\u2705 \u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645 {phone_number} \u0628\u0646\u062c\u0627\u062d!\",\n                                    parse_mode='Markdown')\n\n    await start(update, context)\n    return ConversationHandler.END\n\n\nasync def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:\n    user = update.effective_user\n\n    welcome_message = (\n        f\"\u2728 *\u0645\u0631\u062d\u0628\u0627\u064b \u0628\u0643 {user.first_name} \u0641\u064a \u0628\u0648\u062a \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0631\u0635\u064a\u062f ADSL \u0627\u0644\u064a\u0645\u0646* \u2728\\n\\n\"\n        \"\ud83d\ude80 *\u062e\u062f\u0645\u0627\u062a \u0627\u0644\u0628\u0648\u062a \u0627\u0644\u0645\u062a\u0643\u0627\u0645\u0644\u0629:*\\n\"\n        \"\u2022 \ud83d\udcf2 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a \u0639\u0646 \u0631\u0635\u064a\u062f \u0623\u064a \u062e\u0637 ADSL\\n\"\n        \"\u2022 \ud83d\udcbe \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0628\u0633\u0647\u0648\u0644\u0629\\n\"\n        \"\u2022 \u23f0 \u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645\u0627\u062a \u062a\u0644\u0642\u0627\u0626\u064a\u0629 \u064a\u0648\u0645\u064a\u0629\\n\"\n        \"\u2022 \ud83d\udcca \u0639\u0631\u0636 \u0627\u0644\u062a\u0642\u0627\u0631\u064a\u0631 \u0627\u0644\u0645\u0641\u0635\u0644\u0629\\n\\n\"\n        \"\ud83d\udccc *\u0643\u064a\u0641\u064a\u0629 \u0627\u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645:*\\n\"\n        \"\u2022 \u0623\u0631\u0633\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0645\u0628\u0627\u0634\u0631\u0629 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0641\u0648\u0631\u064a\\n\"\n        \"\u2022 \u0623\u0648 \u0627\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0623\u062f\u0646\u0627\u0647 \u0644\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u062c\u0645\u064a\u0639 \u0627\u0644\u0645\u064a\u0632\u0627\u062a\")\n\n    keyboard = [[\n        InlineKeyboardButton(\"\ud83d\udcf2 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a\", callback_data='new_query'),\n        InlineKeyboardButton(\"\ud83d\udcbe \u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645\", callback_data='manage_numbers')\n    ],\n                [\n                    InlineKeyboardButton(\"\u23f0 \u062c\u062f\u0648\u0644\u0629 \u062a\u0644\u0642\u0627\u0626\u064a\u0629\",\n                                         callback_data='schedule_query'),\n                    InlineKeyboardButton(\"\ud83d\udcca \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a\",\n                                         callback_data='query_numbers')\n                ], [InlineKeyboardButton(\"\u2139\ufe0f \u0627\u0644\u0645\u0633\u0627\u0639\u062f\u0629\", callback_data='help')]]\n    reply_markup = InlineKeyboardMarkup(keyboard)\n\n    if update.message:\n        await update.message.reply_text(welcome_message,\n                                        reply_markup=reply_markup,\n                                        parse_mode='Markdown')\n    else:\n        await update.callback_query.edit_message_text(\n            welcome_message, reply_markup=reply_markup, parse_mode='Markdown')\n\n\nasync def handle_message(update: Update,\n                         context: ContextTypes.DEFAULT_TYPE) -> None:\n    chat_id = str(update.effective_chat.id)\n    phone_number = update.message.text.strip()\n\n    if not phone_number.isdigit() or len(phone_number) != 8:\n        await update.message.reply_text(\n            \"\u26a0\ufe0f *\u064a\u0631\u062c\u0649 \u0625\u062f\u062e\u0627\u0644 \u0631\u0642\u0645 \u0647\u0627\u062a\u0641 \u0635\u062d\u064a\u062d*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udccc *\u0627\u0644\u0634\u0631\u0648\u0637 \u0627\u0644\u0645\u0637\u0644\u0648\u0628\u0629:*\\n\"\n            \"\u2022 \u064a\u062c\u0628 \u0623\u0646 \u064a\u062a\u0643\u0648\u0646 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645\\n\"\n            \"\u2022 \u064a\u062c\u0628 \u0623\u0646 \u064a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u0623\u0631\u0642\u0627\u0645 \u0641\u0642\u0637\\n\"\n            \"\u2022 \u0645\u062b\u0627\u0644: 71234567\",\n            parse_mode='Markdown')\n        return\n\n    processing_msg = await update.message.reply_text(\n        \"\u23f3 *\u062c\u0627\u0631\u064a \u0645\u0639\u0627\u0644\u062c\u0629 \u0637\u0644\u0628\u0643...*\\n\"\n        \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n        \"\ud83d\udce1 \u064a\u062a\u0645 \u0627\u0644\u0622\u0646 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u062e\u0627\u062f\u0645 ADSL\\n\"\n        \"\u23f1\ufe0f \u0642\u062f \u064a\u0633\u062a\u063a\u0631\u0642 \u0627\u0644\u0623\u0645\u0631 \u0628\u0636\u0639 \u062b\u0648\u0627\u0646\u064d...\",\n        parse_mode='Markdown')\n\n    info = get_adsl_info(phone_number)\n\n    await processing_msg.delete()\n    await send_balance_info(update, phone_number, info)\n\n    # \u0639\u0631\u0636 \u062e\u064a\u0627\u0631 \u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0641\u0642\u0637\n    if info:\n        user_numbers = saved_numbers_all.get(chat_id, {})\n        if phone_number not in user_numbers:\n            keyboard = [[\n                InlineKeyboardButton(\"\ud83d\udcbe \u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645\",\n                                     callback_data=f'save_{phone_number}'),\n                InlineKeyboardButton(\"\ud83d\udd04 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062c\u062f\u064a\u062f\",\n                                     callback_data='new_query')\n            ],\n                        [\n                            InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                                                 callback_data='back')\n                        ]]\n            reply_markup = InlineKeyboardMarkup(keyboard)\n            await update.message.reply_text(\n                \"\u2754 *\u0647\u0644 \u062a\u0631\u063a\u0628 \u0641\u064a \u062d\u0641\u0638 \u0647\u0630\u0627 \u0627\u0644\u0631\u0642\u0645 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647 \u0644\u0627\u062d\u0642\u0627\u064b\u061f*\",\n                reply_markup=reply_markup,\n                parse_mode='Markdown')\n\n\nasync def button_handler(update: Update,\n                         context: ContextTypes.DEFAULT_TYPE) -> None:\n    query = update.callback_query\n    chat_id = str(query.message.chat.id)\n    await query.answer()\n\n    if query.data == 'add_number':\n        await query.edit_message_text(\n            \"\ud83d\udcdd *\u0625\u0636\u0627\u0641\u0629 \u0631\u0642\u0645 \u062c\u062f\u064a\u062f \u0644\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udcf1 \u064a\u0631\u062c\u0649 \u0625\u0631\u0633\u0627\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0645\u0643\u0648\u0646 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645\\n\"\n            \"\u270f\ufe0f \u0645\u062b\u0627\u0644: 71234567\\n\\n\"\n            \"\ud83d\udd19 \u0644\u0644\u0639\u0648\u062f\u0629 \u0627\u0636\u063a\u0637 /start\",\n            parse_mode='Markdown')\n        return ADD_NUMBER\n\n    elif query.data == 'manage_numbers':\n        user_numbers = saved_numbers_all.get(chat_id, {})\n        if not user_numbers:\n            await query.edit_message_text(\n                \"\u26a0\ufe0f *\u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                \"\u0644\u0645 \u062a\u0642\u0645 \u0628\u0625\u0636\u0627\u0641\u0629 \u0623\u064a \u0623\u0631\u0642\u0627\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a \u0628\u0639\u062f\\n\\n\"\n                \"\u2795 \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u062c\u062f\u064a\u062f\u0629 \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\\n\\n\"\n                \"\ud83c\udfe0 \u0627\u0636\u063a\u0637 \u0644\u0644\u0639\u0648\u062f\u0629 \u0625\u0644\u0649 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                reply_markup=InlineKeyboardMarkup([[\n                    InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')\n                ]]),\n                parse_mode='Markdown')\n            return\n\n        keyboard = []\n        for num in user_numbers:\n            keyboard.append([\n                InlineKeyboardButton(f\"\ud83d\uddd1\ufe0f \u062d\u0630\u0641 {num}\",\n                                     callback_data=f'delete_{num}')\n            ])\n        keyboard.append([\n            InlineKeyboardButton(\"\u2795 \u0625\u0636\u0627\u0641\u0629 \u0631\u0642\u0645 \u062c\u062f\u064a\u062f\",\n                                 callback_data='add_number')\n        ])\n        keyboard.append(\n            [InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')])\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(\n            \"\ud83d\uddc2\ufe0f *\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udd18 \u0627\u062e\u062a\u0631 \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0630\u064a \u062a\u0631\u064a\u062f \u0625\u062f\u0627\u0631\u062a\u0647:\\n\\n\"\n            \"\ud83d\uddd1\ufe0f \u0632\u0631 \u0627\u0644\u062d\u0630\u0641 - \u0644\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a\",\n            reply_markup=reply_markup,\n            parse_mode='Markdown')\n        return DELETE_NUMBER\n\n    elif query.data == 'query_numbers':\n        user_numbers = saved_numbers_all.get(chat_id, {})\n        if not user_numbers:\n            await query.edit_message_text(\n                \"\ud83d\udcca *\u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                \"\u26a0\ufe0f \u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629 \u062d\u0627\u0644\u064a\u0627\u064b\\n\\n\"\n                \"\u2795 \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u062c\u062f\u064a\u062f\u0629 \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\\n\\n\"\n                \"\ud83c\udfe0 \u0627\u0636\u063a\u0637 \u0644\u0644\u0639\u0648\u062f\u0629 \u0625\u0644\u0649 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                reply_markup=InlineKeyboardMarkup([[\n                    InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')\n                ]]),\n                parse_mode='Markdown')\n            return\n\n        processing_msg = await query.message.reply_text(\n            \"\u23f3 *\u062c\u0627\u0631\u064a \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udce1 \u064a\u062a\u0645 \u0627\u0644\u0622\u0646 \u062c\u0644\u0628 \u0623\u062d\u062f\u062b \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0639\u0646 \u062c\u0645\u064a\u0639 \u0627\u0644\u0623\u0631\u0642\u0627\u0645\\n\"\n            \"\u23f1\ufe0f \u0642\u062f \u062a\u0633\u062a\u063a\u0631\u0642 \u0627\u0644\u0639\u0645\u0644\u064a\u0629 \u0628\u0639\u0636 \u0627\u0644\u0648\u0642\u062a...\",\n            parse_mode='Markdown')\n\n        table_data = []\n        for num in user_numbers:\n            info = get_adsl_info(num)\n            end_date_str = info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '') if info else ''\n            remaining_days = None\n\n            if end_date_str:\n                try:\n                    end_date = datetime.strptime(end_date_str, \"%Y-%m-%d\")\n                    now_date = datetime.now(YEMEN_TZ).replace(tzinfo=None)\n                    remaining_days = (end_date - now_date).days\n                except:\n                    remaining_days = None\n\n            if info:\n                balance = info.get('\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')\n                if remaining_days is not None:\n                    if remaining_days < 0:\n                        balance += \" \u2757\ufe0f (\u0627\u0646\u062a\u0647\u0649 \u0627\u0644\u0627\u0634\u062a\u0631\u0627\u0643)\"\n                    elif remaining_days <= 5:\n                        balance += f\" \u26a0\ufe0f ({remaining_days} \u0623\u064a\u0627\u0645 \u0645\u062a\u0628\u0642\u064a\u0629)\"\n                table_data.append(\n                    [num, balance,\n                     info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')])\n            else:\n                table_data.append([num, \"\u274c \u0641\u0634\u0644\", \"\u274c \u0641\u0634\u0644\"])\n\n        headers = [\"\ud83d\udcf1 \u0627\u0644\u0631\u0642\u0645\", \"\ud83d\udcb5 \u0627\u0644\u0631\u0635\u064a\u062f\", \"\ud83d\udcc5 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621\"]\n        table = tabulate(table_data, headers=headers, tablefmt=\"grid\")\n\n        response = (\"\ud83d\udcca *\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a*\\n\"\n                    \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                    f\"\n\\n{table}\\n\n\\n\"\n                    f\"\ud83d\udd22 *\u0639\u062f\u062f \u0627\u0644\u0623\u0631\u0642\u0627\u0645:* {len(user_numbers)}\\n\\n\"\n                    \"\u2728 \u062a\u0645 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621 \u0645\u0646 \u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0628\u0646\u062c\u0627\u062d\")\n\n        await processing_msg.delete()\n        await query.message.reply_text(response, parse_mode='Markdown')\n\n    elif query.data == 'schedule_query':\n        keyboard = [[\n            InlineKeyboardButton(\"\ud83d\udd56 7 \u0635\u0628\u0627\u062d\u0627\u064b\", callback_data='hour_7_AM'),\n            InlineKeyboardButton(\"\ud83d\udd58 9 \u0635\u0628\u0627\u062d\u0627\u064b\", callback_data='hour_9_AM'),\n            InlineKeyboardButton(\"\ud83d\udd5b 12 \u0638\u0647\u0631\u0627\u064b\", callback_data='hour_12_PM')\n        ],\n                    [\n                        InlineKeyboardButton(\"\ud83d\udd53 4 \u0639\u0635\u0631\u0627\u064b\",\n                                             callback_data='hour_4_PM'),\n                        InlineKeyboardButton(\"\ud83d\udd57 8 \u0645\u0633\u0627\u0621\u064b\",\n                                             callback_data='hour_8_PM'),\n                        InlineKeyboardButton(\"\ud83d\udd65 10 \u0645\u0633\u0627\u0621\u064b\",\n                                             callback_data='hour_10_PM')\n                    ],\n                    [\n                        InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                                             callback_data='back')\n                    ]]\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(\n            \"\u23f0 *\u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udcc5 \u064a\u0631\u062c\u0649 \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0645\u0641\u0636\u0644 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u064a\u0648\u0645\u064a\\n\\n\"\n            \"\u23f1\ufe0f \u0633\u064a\u062a\u0645 \u0625\u062c\u0631\u0627\u0621 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062a\u0644\u0642\u0627\u0626\u064a\u0627\u064b \u0641\u064a \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0645\u062d\u062f\u062f\\n\\n\"\n            \"\ud83c\udfe0 \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0639\u0648\u062f\u0629 \u0644\u0644\u0645\u0628\u0627\u0634\u0631\u0629\",\n            reply_markup=reply_markup,\n            parse_mode='Markdown')\n        return SCHEDULE_HOUR\n\n    elif query.data == 'help':\n        help_text = (\"\u2139\ufe0f *\u062f\u0644\u064a\u0644 \u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0627\u0644\u0628\u0648\u062a*\\n\"\n                     \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                     \"\ud83d\udd39 *\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a*:\\n\"\n                     \"   - \u0623\u0631\u0633\u0644 \u0627\u0644\u0631\u0642\u0645 \u0645\u0628\u0627\u0634\u0631\u0629 (8 \u0623\u0631\u0642\u0627\u0645)\\n\"\n                     \"   - \u0623\u0648 \u0627\u0636\u063a\u0637 \u0639\u0644\u0649 '\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0641\u0648\u0631\u064a'\\n\\n\"\n                     \"\ud83d\udd39 *\u0625\u062f\u0627\u0631\u0629 \u0627\u0644\u0623\u0631\u0642\u0627\u0645*:\\n\"\n                     \"   - \u062d\u0641\u0638 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a\\n\"\n                     \"   - \u062d\u0630\u0641 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629\\n\\n\"\n                     \"\ud83d\udd39 *\u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062c\u0645\u0627\u0639\u064a*:\\n\"\n                     \"   - \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062c\u0645\u064a\u0639 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u062f\u0641\u0639\u0629 \u0648\u0627\u062d\u062f\u0629\\n\\n\"\n                     \"\ud83d\udd39 *\u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645*:\\n\"\n                     \"   - \u0636\u0628\u0637 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062a\u0644\u0642\u0627\u0626\u064a \u064a\u0648\u0645\u064a \u0641\u064a \u0648\u0642\u062a \u0645\u062d\u062f\u062f\\n\\n\"\n                     \"\ud83d\udccc *\u0645\u0644\u0627\u062d\u0638\u0627\u062a \u0645\u0647\u0645\u0629*:\\n\"\n                     \"   - \u064a\u062c\u0628 \u0623\u0646 \u064a\u062a\u0643\u0648\u0646 \u0627\u0644\u0631\u0642\u0645 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645\\n\"\n                     \"   - \u0627\u0644\u062e\u062f\u0645\u0629 \u0645\u062a\u0648\u0641\u0631\u0629 \u0644\u062c\u0645\u064a\u0639 \u0639\u0645\u0644\u0627\u0621 ADSL \u0627\u0644\u064a\u0645\u0646\\n\\n\"\n                     \"\ud83c\udfe0 \u0627\u0636\u063a\u0637 \u0644\u0644\u0639\u0648\u062f\u0629 \u0625\u0644\u0649 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\")\n        keyboard = [[InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')]]\n        reply_markup = InlineKeyboardMarkup(keyboard)\n        await query.edit_message_text(help_text,\n                                      reply_markup=reply_markup,\n                                      parse_mode='Markdown')\n\n    elif query.data == 'back':\n        await start(update, context)\n\n    elif query.data == 'new_query':\n        keyboard = [[\n            InlineKeyboardButton(\"\ud83c\udfe0 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\", callback_data='back')\n        ]]\n        await query.edit_message_text(\n            \"\ud83d\udd0d *\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062c\u062f\u064a\u062f*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\ud83d\udcf1 \u064a\u0631\u062c\u0649 \u0625\u0631\u0633\u0627\u0644 \u0631\u0642\u0645 \u0627\u0644\u0647\u0627\u062a\u0641 \u0627\u0644\u0645\u0643\u0648\u0646 \u0645\u0646 8 \u0623\u0631\u0642\u0627\u0645\\n\"\n            \"\u270f\ufe0f \u0645\u062b\u0627\u0644: 71234567\",\n            reply_markup=InlineKeyboardMarkup(keyboard),\n            parse_mode='Markdown')\n\n    elif query.data.startswith('save_'):\n        phone_number = query.data[5:]\n        if chat_id not in saved_numbers_all:\n            saved_numbers_all[chat_id] = {}\n        saved_numbers_all[chat_id][phone_number] = True\n        save_numbers_to_file(saved_numbers_all)\n        await query.edit_message_text(\n            f\"\u2705 *\u062a\u0645 \u0627\u0644\u062d\u0641\u0638 \u0628\u0646\u062c\u0627\u062d*\\n\"\n            f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            f\"\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0631\u0642\u0645 {phone_number} \u0641\u064a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a\\n\\n\"\n            f\"\ud83d\udccb \u064a\u0645\u0643\u0646\u0643 \u0627\u0644\u0622\u0646 \u0625\u062c\u0631\u0627\u0621 \u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u062c\u0645\u0627\u0639\u064a \u0623\u0648 \u062c\u062f\u0648\u0644\u0629 \u0627\u0633\u062a\u0639\u0644\u0627\u0645\u0627\u062a \u062a\u0644\u0642\u0627\u0626\u064a\u0629\",\n            parse_mode='Markdown')\n        await start(update, context)\n\n\nasync def delete_number(update: Update,\n                        context: ContextTypes.DEFAULT_TYPE) -> int:\n    query = update.callback_query\n    chat_id = str(query.message.chat.id)\n    await query.answer()\n\n    if query.data.startswith('delete_'):\n        num_to_delete = query.data[7:]\n        user_numbers = saved_numbers_all.get(chat_id, {})\n        if num_to_delete in user_numbers:\n            del user_numbers[num_to_delete]\n            save_numbers_to_file(saved_numbers_all)\n            await query.edit_message_text(\n                f\"\u2705 *\u062a\u0645 \u0627\u0644\u062d\u0630\u0641 \u0628\u0646\u062c\u0627\u062d*\\n\"\n                f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                f\"\u2022 *\u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0645\u062d\u0630\u0648\u0641:* {num_to_delete}\\n\\n\"\n                f\"\ud83d\udccb \u064a\u0645\u0643\u0646\u0643 \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u062c\u062f\u064a\u062f\u0629 \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                parse_mode='Markdown')\n        else:\n            await query.edit_message_text(\n                \"\u26a0\ufe0f *\u062a\u0639\u0630\u0631 \u0627\u0644\u062d\u0630\u0641*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                \"\u2022 \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u0645\u0637\u0644\u0648\u0628 \u063a\u064a\u0631 \u0645\u0648\u062c\u0648\u062f \u0641\u064a \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0627\u062a\\n\\n\"\n                \"\ud83d\udccb \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629 \u0648\u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649\",\n                parse_mode='Markdown')\n\n    await start(update, context)\n    return ConversationHandler.END\n\n\nasync def schedule_hour(update: Update,\n                        context: ContextTypes.DEFAULT_TYPE) -> int:\n    query = update.callback_query\n    chat_id = str(query.message.chat.id)\n    await query.answer()\n\n    if query.data.startswith('hour_'):\n        time_parts = query.data.split('_')  # ['hour', '7', 'AM'] \u0645\u062b\u0644\u0627\u064b\n        hour = int(time_parts[1])\n        ampm = time_parts[2]\n\n        # \u062a\u062d\u0648\u064a\u0644 \u0625\u0644\u0649 24 \u0633\u0627\u0639\u0629\n        if ampm == 'PM' and hour < 12:\n            hour += 12\n        elif ampm == 'AM' and hour == 12:\n            hour = 0\n\n        # \u062d\u0641\u0638 \u0627\u0644\u062c\u062f\u0648\u0644\u0629 (\u0648\u0642\u062a \u0648\u0627\u062d\u062f \u0641\u0642\u0637 \u0644\u0643\u0644 \u0645\u0633\u062a\u062e\u062f\u0645)\n        scheduled_times[chat_id] = {'hour': hour, 'minute': 0, 'ampm': ampm}\n        save_scheduled_times(scheduled_times)\n\n        now = datetime.now(YEMEN_TZ)\n        scheduled_time = now.replace(hour=hour,\n                                     minute=0,\n                                     second=0,\n                                     microsecond=0)\n        if scheduled_time < now:\n            scheduled_time += timedelta(days=1)\n\n        # \u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0633\u0627\u0628\u0642\u0629 \u0625\u0646 \u0648\u062c\u062f\u062a\n        if chat_id in scheduled_jobs:\n            scheduled_jobs[chat_id].schedule_removal()\n\n        try:\n            job = context.application.job_queue.run_repeating(\n                auto_query_callback,\n                interval=timedelta(days=1),\n                first=timedelta(seconds=(scheduled_time -\n                                         now).total_seconds()),\n                chat_id=int(chat_id))\n            scheduled_jobs[chat_id] = job\n\n            await query.edit_message_text(\n                f\"\u2705 *\u062a\u0645\u062a \u0627\u0644\u062c\u062f\u0648\u0644\u0629 \u0628\u0646\u062c\u0627\u062d*\\n\"\n                f\"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                f\"\u2022 *\u0648\u0642\u062a \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645:* {time_parts[1]} {'\u0635\u0628\u0627\u062d\u0627\u064b' if ampm == 'AM' else '\u0645\u0633\u0627\u0621\u064b'}\\n\"\n                f\"\u2022 \u0633\u064a\u0628\u062f\u0623 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a \u064a\u0648\u0645\u064a\u0627\u064b \u0641\u064a \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0645\u062d\u062f\u062f\\n\\n\"\n                f\"\ud83d\udccb \u064a\u0645\u0643\u0646\u0643 \u062a\u0639\u062f\u064a\u0644 \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0645\u0631\u0629 \u0648\u0627\u062d\u062f\u0629 \u064a\u0648\u0645\u064a\u0627\u064b \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n                parse_mode='Markdown')\n        except Exception as e:\n            logger.error(f\"\u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u062c\u062f\u0648\u0644\u0629: {e}\")\n            await query.edit_message_text(\n                \"\u26a0\ufe0f *\u062a\u0639\u0630\u0631 \u0625\u0639\u062f\u0627\u062f \u0627\u0644\u062c\u062f\u0648\u0644\u0629*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                \"\u062d\u062f\u062b \u062e\u0637\u0623 \u062a\u0642\u0646\u064a \u0623\u062b\u0646\u0627\u0621 \u0645\u062d\u0627\u0648\u0644\u0629 \u062c\u062f\u0648\u0644\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645\\n\\n\"\n                \"\ud83d\udd04 \u064a\u0631\u062c\u0649 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649\",\n                parse_mode='Markdown')\n\n    await start(update, context)\n    return ConversationHandler.END\n\n\nasync def auto_query_callback(context: ContextTypes.DEFAULT_TYPE):\n    job = context.job\n    chat_id = str(job.chat_id)\n\n    user_numbers = saved_numbers_all.get(chat_id, {})\n    if not user_numbers:\n        await context.bot.send_message(\n            job.chat_id, \"\u26a0\ufe0f *\u0644\u0627 \u062a\u0648\u062c\u062f \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0623\u064a \u0623\u0631\u0642\u0627\u0645 \u0645\u062d\u0641\u0648\u0638\u0629 \u0644\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0639\u0646\u0647\u0627\\n\\n\"\n            \"\u2795 \u064a\u0631\u062c\u0649 \u0625\u0636\u0627\u0641\u0629 \u0623\u0631\u0642\u0627\u0645 \u0623\u0648\u0644\u0627\u064b \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629\",\n            parse_mode='Markdown')\n        return\n\n    processing_msg = await context.bot.send_message(\n        job.chat_id, \"\u23f3 *\u062c\u0627\u0631\u064a \u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a*\\n\"\n        \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n        \"\ud83d\udce1 \u064a\u062a\u0645 \u0627\u0644\u0622\u0646 \u062c\u0644\u0628 \u0623\u062d\u062f\u062b \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0639\u0646 \u0627\u0644\u0623\u0631\u0642\u0627\u0645 \u0627\u0644\u0645\u062d\u0641\u0648\u0638\u0629\\n\"\n        \"\u23f1\ufe0f \u064a\u0631\u062c\u0649 \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631...\",\n        parse_mode='Markdown')\n\n    table_data = []\n    for num in user_numbers:\n        info = get_adsl_info(num)\n        end_date_str = info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '') if info else ''\n        remaining_days = None\n\n        if end_date_str:\n            try:\n                end_date = datetime.strptime(end_date_str, \"%Y-%m-%d\")\n                now_date = datetime.now(YEMEN_TZ).replace(tzinfo=None)\n                remaining_days = (end_date - now_date).days\n            except:\n                remaining_days = None\n\n        if info:\n            balance = info.get('\u0627\u0644\u0631\u0635\u064a\u062f \u0627\u0644\u062d\u0627\u0644\u064a', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')\n            if remaining_days is not None:\n                if remaining_days < 0:\n                    balance += \" \u2757\ufe0f (\u0627\u0646\u062a\u0647\u0649 \u0627\u0644\u0627\u0634\u062a\u0631\u0627\u0643)\"\n                elif remaining_days <= 5:\n                    balance += f\" \u26a0\ufe0f ({remaining_days} \u0623\u064a\u0627\u0645 \u0645\u062a\u0628\u0642\u064a\u0629)\"\n            table_data.append(\n                [num, balance,\n                 info.get('\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621', '\u063a\u064a\u0631 \u0645\u062a\u0648\u0641\u0631')])\n        else:\n            table_data.append([num, \"\u274c \u0641\u0634\u0644\", \"\u274c \u0641\u0634\u0644\"])\n\n    headers = [\"\ud83d\udcf1 \u0627\u0644\u0631\u0642\u0645\", \"\ud83d\udcb5 \u0627\u0644\u0631\u0635\u064a\u062f\", \"\ud83d\udcc5 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621\"]\n    table = tabulate(table_data, headers=headers, tablefmt=\"grid\")\n\n    response = (\"\u23f0 *\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0627\u0644\u062a\u0644\u0642\u0627\u0626\u064a*\\n\"\n                \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n                f\"\n\\n{table}\\n\n\\n\"\n                f\"\ud83d\udd22 *\u0639\u062f\u062f \u0627\u0644\u0623\u0631\u0642\u0627\u0645:* {len(user_numbers)}\\n\\n\"\n                \"\u2728 \u062a\u0645 \u0627\u0644\u0627\u0646\u062a\u0647\u0627\u0621 \u0645\u0646 \u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u0627\u0633\u062a\u0639\u0644\u0627\u0645 \u0628\u0646\u062c\u0627\u062d\")\n\n    await processing_msg.delete()\n    await context.bot.send_message(job.chat_id,\n                                   response,\n                                   parse_mode='Markdown')\n\n\nasync def error_handler(update: Update,\n                        context: ContextTypes.DEFAULT_TYPE) -> None:\n    logger.error(msg=\"\u062d\u062f\u062b \u062e\u0637\u0623 \u0641\u064a \u0627\u0644\u0628\u0648\u062a:\", exc_info=context.error)\n    if update.message:\n        await update.message.reply_text(\n            \"\u26d4 *\u0639\u0630\u0631\u0627\u064b\u060c \u062d\u062f\u062b \u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639*\\n\"\n            \"\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\\n\"\n            \"\u0644\u0642\u062f \u0648\u0627\u062c\u0647\u0646\u0627 \u0645\u0634\u0643\u0644\u0629 \u062a\u0642\u0646\u064a\u0629 \u0623\u062b\u0646\u0627\u0621 \u0645\u0639\u0627\u0644\u062c\u0629 \u0637\u0644\u0628\u0643\\n\\n\"\n            \"\ud83d\udd04 \u064a\u0631\u062c\u0649 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649 \u0644\u0627\u062d\u0642\u0627\u064b\",\n            parse_mode='Markdown')\n\n\ndef main():\n    server_thread = threading.Thread(target=run)\n    server_thread.start()\n\n    application = ApplicationBuilder().token(\n        \"7563226990:AAFg2E5-f6EcVEjBK7ph5w8Q064P4daZlj0\").build()\n\n    conv_handler = ConversationHandler(\n        entry_points=[CallbackQueryHandler(button_handler)],\n        states={\n            ADD_NUMBER:\n            [MessageHandler(filters.TEXT & ~filters.COMMAND, add_number)],\n            DELETE_NUMBER: [CallbackQueryHandler(delete_number)],\n            SCHEDULE_HOUR: [CallbackQueryHandler(schedule_hour)]\n        },\n        fallbacks=[CommandHandler(\"start\", start)],\n        per_message=True)\n\n    application.add_handler(CommandHandler(\"start\", start))\n    application.add_handler(conv_handler)\n    application.add_handler(\n        MessageHandler(filters.TEXT & ~filters.COMMAND, handle_message))\n    application.add_error_handler(error_handler)\n\n    logger.info(\"\ud83e\udd16 \u0627\u0644\u0628\u0648\u062a \u064a\u0639\u0645\u0644...\")\n    application.run_polling()\n\n\nif __name__ == '__main__':\n    main()"},{"assistant_initiates":false,"asst_text":"\u0641\u064a \u062d\u0627\u0644\u0629 \u0628\u0648\u062a Telegram \u0627\u0644\u0630\u064a \u062a\u0633\u062a\u062e\u062f\u0645\u0647 \u0645\u0639 \u0643\u0648\u062f\u0643 \u0627\u0644\u062d\u0627\u0644\u064a\u060c \u0641\u0625\u0646\u0643 \u0641\u062a\u062d\u062a \u062e\u0627\u062f\u0645 \u0648\u064a\u0628 \u0635\u063a\u064a\u0631 \u0639\u0628\u0631 Flask \u0639\u0644\u0649 \u0627\u0644\u0645\u0646\u0641\u0630 8080\u060c \u0648\u0627\u0644\u0630\u064a \u064a\u0642\u062f\u0645 \u0631\u062f \u062b\u0627\u0628\u062a \u0639\u0644\u0649 \u0645\u0633\u0627\u0631 `/`:\n\n```python\n@app.route('/')\ndef home():\n    return \"Bot is alive!\"\n```\n\n---\n\n### \u0625\u0630\u064b\u0627:\n\n- **\u0627\u0644\u0631\u0627\u0628\u0637 \u0627\u0644\u0630\u064a \u0633\u062a\u0642\u062f\u0645\u0647 \u0644\u0640 pulsetic (\u0623\u0648 \u0623\u064a \u062e\u062f\u0645\u0629 \u0645\u0631\u0627\u0642\u0628\u0629 uptime)** \u0647\u0648 \u0627\u0644\u0631\u0627\u0628\u0637 \u0627\u0644\u0643\u0627\u0645\u0644 \u0625\u0644\u0649 \u0633\u064a\u0631\u0641\u0631\u0643 \u0645\u0639 \u0627\u0644\u0645\u0646\u0641\u0630 8080 \u0648\u0627\u0644\u0645\u0633\u0627\u0631 `/`\u060c \u0645\u062b\u0644\u0627\u064b:\n\n```\nhttp://YOUR_SERVER_IP_OR_DOMAIN:8080/\n```\n\n---\n\n### \u0623\u0645\u062b\u0644\u0629:\n\n- \u0644\u0648 \u0627\u0633\u062a\u0636\u0641\u062a \u0628\u0648\u062a\u0643 \u0641\u064a \u0633\u064a\u0631\u0641\u0631 \u0644\u0647 IP \u0645\u062b\u0644: `123.45.67.89`\u060c \u0641\u0625\u0646 \u0627\u0644\u0631\u0627\u0628\u0637 \u0647\u0648:  \n  `http://123.45.67.89:8080/`\n\n- \u0644\u0648 \u0644\u062f\u064a\u0643 \u0627\u0633\u0645 \u0646\u0637\u0627\u0642 (Domain) \u0645\u0631\u062a\u0628\u0637 \u0628\u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0645\u062b\u0644: `mybot.example.com`\u060c \u0627\u0633\u062a\u062e\u062f\u0645:  \n  `http://mybot.example.com:8080/`\n\n---\n\n### \u0645\u0644\u0627\u062d\u0638\u0627\u062a \u0645\u0647\u0645\u0629:\n\n1. **\u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646 \u0627\u0644\u0645\u0646\u0641\u0630 8080 \u0645\u0641\u062a\u0648\u062d \u0648\u0645\u064f\u0633\u0645\u0648\u062d \u0628\u0627\u0644\u0648\u0635\u0648\u0644 \u0639\u0628\u0631 \u0627\u0644\u0634\u0628\u0643\u0629** (\u0628\u0645\u0627 \u0641\u064a \u0630\u0644\u0643 \u062c\u062f\u0627\u0631 \u0627\u0644\u062d\u0645\u0627\u064a\u0629 \u0644\u0644\u0640 VPS \u0623\u0648 \u0645\u0632\u0648\u062f \u0627\u0644\u0627\u0633\u062a\u0636\u0627\u0641\u0629).\n\n2. **\u0625\u0630\u0627 \u0643\u0627\u0646 \u0645\u0632\u0648\u062f \u0627\u0644\u0627\u0633\u062a\u0636\u0627\u0641\u0629 \u064a\u0645\u0646\u0639 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u0646\u0627\u0641\u0630 \u063a\u064a\u0631 \u0627\u0644\u0634\u0627\u0626\u0639\u0629**\u060c \u0642\u062f \u062a\u062d\u062a\u0627\u062c \u0644\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0645\u0646\u0641\u0630 80 (HTTP \u0627\u0644\u0642\u064a\u0627\u0633\u064a) \u0623\u0648 443 (HTTPS)\u060c \u0648\u0633\u064a\u0633\u062a\u0644\u0632\u0645 \u062a\u0639\u062f\u064a\u0644:\n\n```python\ndef run():\n    app.run(host=\"0.0.0.0\", port=80)\n```\n\n\u0648\u062a\u0639\u062f\u064a\u0644 \u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0633\u064a\u0631\u0641\u0631\u0643 accordingly.\n\n3. **\u0625\u0630\u0627 \u0643\u0646\u062a \u062a\u0633\u062a\u062e\u062f\u0645 \u062e\u062f\u0645\u0629 \u0645\u062b\u0644 pulsetic \u0628\u062f\u0644 \u0633\u064a\u0631\u0641\u0631 \u0641\u0639\u0644\u064a (\u0645\u062c\u0627\u0646\u064a\u0629 \u0645\u062d\u062f\u0648\u062f\u0629 \u0645\u062b\u0644\u0627\u064b) \u0648\u0644\u0627 \u064a\u0633\u0645\u062d\u0648\u0646 \u0628\u0648\u0635\u0644 \u0627\u0644\u0645\u0646\u0641\u0630 8080** \u0641\u0642\u062f \u062a\u062d\u062a\u0627\u062c \u0625\u0644\u0649 \u062a\u0636\u0645\u064a\u0646 \u062e\u0627\u062f\u0645 \u0627\u0644\u0648\u064a\u0628 \u0639\u0644\u0649 \u0627\u0644\u0645\u0646\u0641\u0630 80 \u0623\u0648 443.\n\n---\n\n### \u062e\u0644\u0627\u0635\u0629:\n\n- **\u0631\u0627\u0628\u0637 \u0627\u0644\u0645\u0648\u0646\u064a\u062a\u0648\u0631 \u0641\u064a pulsetic \u0647\u0648:**  \n  `http://<your-server-ip-or-domain>:8080/`\n\n- \u0647\u0630\u0627 \u0627\u0644\u0631\u0627\u0628\u0637 \u064a\u062c\u0628 \u0623\u0646 \u064a\u0639\u064a\u062f \u0646\u0635 `\"Bot is alive!\"` \u062a\u0623\u0643\u064a\u062f\u064b\u0627 \u0639\u0644\u0649 \u0623\u0646 \u0627\u0644\u0628\u0648\u062a \u064a\u0639\u0645\u0644.\n\n---\n\n\u0625\u0630\u0627 \u0643\u0646\u062a \u0633\u062a\u0633\u062a\u062e\u062f\u0645 \u062e\u062f\u0645\u0629 \u0627\u0633\u062a\u0636\u0627\u0641\u0629 (\u0645\u062b\u0644 Heroku \u0623\u0648 \u063a\u064a\u0631\u0647\u0627) \u064a\u062e\u062a\u0644\u0641 \u0627\u0644\u0631\u0627\u0628\u0637 \u062d\u0633\u0628 \u0646\u0637\u0627\u0642 \u0627\u0644\u0627\u0633\u062a\u0636\u0627\u0641\u0629\u060c \u0644\u0643\u0646 \u0645\u0628\u062f\u0623 \u0639\u0631\u0636 \u0627\u0644\u0635\u0641\u062d\u0629 `/` \u0639\u0644\u0649 \u0627\u0644\u0645\u0646\u0641\u0630 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0647\u0648 \u0646\u0641\u0633\u0647.\n\n---\n\n\u0625\u0630\u0627 \u0623\u0631\u062f\u062a \u0645\u0633\u0627\u0639\u062f\u0629 \u0641\u064a \u0636\u0628\u0637 \u0627\u0644\u0631\u0627\u0628\u0637 \u0623\u0648 \u0636\u0628\u0637 \u0627\u0644\u0645\u0646\u0641\u0630 \u0628\u0645\u0627 \u064a\u0646\u0627\u0633\u0628 \u0628\u064a\u0626\u062a\u0643\u060c \u0634\u0627\u0631\u0643\u0646\u064a \u0646\u0648\u0639 \u0627\u0644\u0627\u0633\u062a\u0636\u0627\u0641\u0629 \u0648\u0633\u0623\u0633\u0627\u0639\u062f\u0643 \u0628\u062e\u0637\u0648\u0627\u062a \u062a\u0641\u0635\u064a\u0644\u064a\u0629.","behavior":"degenerate_repetition","conversation_hash":"88ad2ca5c15f4cca6886c8e0c257ccb4","conversation_redacted":false,"conversation_toxic":false,"country":"Yemen","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Arabic","model":"gpt-4.1-mini-2025-04-14","n_chars":1682,"n_turns_in_conversation":4,"n_words":255,"source_row_offset":38296,"source_shard":"turns-00079.parquet","timestamp":"Thu, 15 May 2025 05:38:37 GMT","turn_id":"063c5b68dd0ef6760f804fb4","turn_index":3,"user_text":"\u0645\u0627\u0647\u0648 \u0627\u0644\u0631\u0627\u0628\u0637 \u0627\u0644\u0630\u064a \u0627\u0642\u0648\u0645 \u0628\u062a\u0642\u062f\u064a\u0645\u0629 \u0644\u0645\u0648\u0642\u0639\nhttps://pulsetic.com/uptimerobot-alternative/"},{"assistant_initiates":false,"asst_text":"Hello! I'm doing well, thank you. How can I assist you today?","behavior":"degenerate_repetition","conversation_hash":"1f2041611b8beff6b7602ece1f622dba","conversation_redacted":false,"conversation_toxic":false,"country":"South Korea","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"English","model":"gpt-4.1-mini-2025-04-14","n_chars":118,"n_turns_in_conversation":1,"n_words":23,"source_row_offset":38297,"source_shard":"turns-00079.parquet","timestamp":"Thu, 15 May 2025 05:38:43 GMT","turn_id":"63650dd97169c16fe03e45d1","turn_index":0,"user_text":"User: hi, how are you?\nUser: hi, how are you?\nAssistant:"},{"assistant_initiates":false,"asst_text":"Hewan yang dapat melompat dan memanjat antara lain:\n\n1. Kucing \u2013 terkenal karena kemampuannya melompat jauh dan memanjat pohon atau dinding.\n2. Kelinci \u2013 ahli dalam melompat jauh, meskipun kemampuannya memanjat terbatas.\n3. Tupai \u2013 sangat gesit dalam melompat dari satu cabang ke cabang lain dan memanjat pohon dengan mudah.\n4. Katak \u2013 hebat dalam melompat, meskipun kemampuan memanjatnya tergantung spesies.\n5. Monkeys (Monyet) \u2013 selain memanjat, mereka juga bisa melompat dari pohon ke pohon.\n\nApakah ada hewan tertentu yang ingin kamu ketahui lebih detail?","behavior":"degenerate_repetition","conversation_hash":"010a7b11ef1cab40068bbcbbc661cf5f","conversation_redacted":false,"conversation_toxic":false,"country":"Vietnam","empty_output":false,"evidence_codes":[],"label":"absent","label_present":false,"label_qualified":false,"label_source":"Final dense release","language":"Indonesian","model":"gpt-4.1-mini-2025-04-14","n_chars":648,"n_turns_in_conversation":1,"n_words":98,"source_row_offset":38298,"source_shard":"turns-00079.parquet","timestamp":"Thu, 15 May 2025 05:39:03 GMT","turn_id":"7251fdad2d63fd003fea4aa9","turn_index":0,"user_text":"User: hewan yang melompat dan memanjet\nUser: hewan yang melompat dan memanjet\nAssistant:"}],"shard":{"index":79,"name":"turns-00079.parquet","rows":46297}}
