import 'dart:convert'; import 'dart:io'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; import 'package:jwt_decoder/jwt_decoder.dart'; import 'package:secure_string_operations/secure_string_operations.dart'; import '../../constant/api_key.dart'; import '../../constant/box_name.dart'; import '../../constant/char_map.dart'; import '../../constant/info.dart'; import '../../constant/links.dart'; import '../../env/env.dart'; import '../../main.dart'; import '../../print.dart'; import 'device_info.dart'; import 'security_checks.dart'; class CRUD { var dev = ''; getJWT() async { dev = Platform.isAndroid ? 'android' : 'ios'; var payload = { 'id': 'admin', 'password': AK.passnpassenger, 'aud': '${AK.allowed}$dev', }; Log.print('payload: ${payload}'); var response1 = await http.post( Uri.parse(AppLink.loginJwtDriver), body: payload, ); if (response1.statusCode == 200) { final decodedResponse1 = jsonDecode(response1.body); final jwt = decodedResponse1['jwt']; Log.print('jwt: ${jwt}'); await box.write(BoxName.jwt, X.c(X.c(X.c(jwt, cn), cC), cs)); // await AppInitializer().getKey(); } } Future get({ required String link, Map? payload, }) async { if (box.read(BoxName.jwt) == null) { await getJWT(); } bool isTokenExpired = JwtDecoder.isExpired(X .r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs) .toString() .split(AppInformation.addd)[0]); if (isTokenExpired) { await getJWT(); } // await Get.put(LoginDriverController()).getJWT(); var url = Uri.parse( link, ); var response = await http.post( url, body: payload, headers: { "Content-Type": "application/x-www-form-urlencoded", 'Authorization': 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}' }, ); print(response.request); Log.print('response.body: ${response.body}'); print(payload); if (response.statusCode == 200) { Log.print('response: ${response.body}'); var jsonData = jsonDecode(response.body); if (jsonData['status'] == 'success') { return response.body; } return jsonData['status']; } else if (response.statusCode == 401) { // Specifically handle 401 Unauthorized var jsonData = jsonDecode(response.body); if (jsonData['error'] == 'Token expired') { // Show snackbar prompting to re-login // await Get.put(LoginDriverController()).getJWT(); // mySnackbarSuccess('please order now'.tr); return 'token_expired'; // Return a specific value for token expiration } else { // Other 401 errors // addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401'); return 'failure'; } } else { // addError('Non-200 response code: ${response.statusCode}', // 'crud().post - Other'); return 'failure'; } } // Future getWallet({ // required String link, // Map? payload, // }) async { // var s = await getJwtWallet(); // var url = Uri.parse( // link, // ); // var response = await http.post( // url, // body: payload, // headers: { // "Content-Type": "application/x-www-form-urlencoded", // 'Authorization': 'Bearer $s' // }, // ); // if (response.statusCode == 200) { // var jsonData = jsonDecode(response.body); // if (jsonData['status'] == 'success') { // return response.body; // } // return jsonData['status']; // } else if (response.statusCode == 401) { // // Specifically handle 401 Unauthorized // var jsonData = jsonDecode(response.body); // if (jsonData['error'] == 'Token expired') { // // Show snackbar prompting to re-login // // await Get.put(LoginDriverController()).getJwtWallet(); // return 'token_expired'; // Return a specific value for token expiration // } else { // // Other 401 errors // addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401'); // return 'failure'; // } // } else { // addError('Non-200 response code: ${response.statusCode}', // 'crud().post - Other'); // return 'failure'; // } // } Future post( {required String link, Map? payload}) async { var url = Uri.parse(link); try { bool isTokenExpired = JwtDecoder.isExpired(X .r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs) .toString() .split(AppInformation.addd)[0]); if (isTokenExpired) { await getJWT(); } var response = await http.post( url, body: payload, headers: { "Content-Type": "application/x-www-form-urlencoded", 'Authorization': 'Bearer ${X.r(X.r(X.r(box.read(BoxName.jwt), cn), cC), cs).toString().split(AppInformation.addd)[0]}' // 'Authorization': 'Bearer ${box.read(BoxName.jwt)}' }, ); print(response.request); Log.print('response.body: ${response.body}'); print(payload); if (response.statusCode == 200) { try { var jsonData = jsonDecode(response.body); if (jsonData['status'] == 'success') { return jsonData; } else { return jsonData['status']; } } catch (e) { // addError(e.toString(), 'crud().post - JSON decoding'); return 'failure'; } } else if (response.statusCode == 401) { // Specifically handle 401 Unauthorized var jsonData = jsonDecode(response.body); if (jsonData['error'] == 'Token expired') { // Show snackbar prompting to re-login await getJWT(); // MyDialog().getDialog( // 'Session expired. Please log in again.'.tr, // '', // () { // Get.put(LoginController()).loginUsingCredentials( // box.read(BoxName.passengerID), box.read(BoxName.email)); // Get.back(); // }, // ); return 'token_expired'; // Return a specific value for token expiration } else { // Other 401 errors // addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401'); return 'failure'; } } else { // addError('Non-200 response code: ${response.statusCode}', // 'crud().post - Other'); return 'failure'; } } catch (e) { // addError('HTTP request error: $e', 'crud().post - HTTP'); return 'failure'; } } getJwtWallet() async { String fingerPrint = await DeviceHelper.getDeviceFingerprint(); print('fingerPrint: ${fingerPrint}'); //await SecurityChecks.isDeviceRootedFromNative(Get.context!); dev = Platform.isAndroid ? 'android' : 'ios'; var payload = { 'id': '1', 'password': AK.passnpassenger, 'aud': '${Env.allowedWallet}$dev', 'fingerPrint': fingerPrint }; // Log.print('payload: ${payload}'); var response1 = await http.post( Uri.parse(AppLink.loginWalletAdmin), body: payload, ); Log.print('response.request: ${response1.request}'); Log.print('response.body: ${response1.body}'); print(payload); Log.print( 'jsonDecode(response1.body)["jwt"]: ${jsonDecode(response1.body)['jwt']}'); await box.write(BoxName.hmac, jsonDecode(response1.body)['hmac']); return jsonDecode(response1.body)['jwt'].toString(); } Future postWallet( {required String link, Map? payload}) async { var s = await getJwtWallet(); Log.print('jwt: ${s}'); final hmac = box.read(BoxName.hmac); Log.print('hmac: ${hmac}'); var url = Uri.parse(link); Log.print('url: ${url}'); try { // await LoginDriverController().getJWT(); var response = await http.post( url, body: payload, headers: { "Content-Type": "application/x-www-form-urlencoded", 'Authorization': 'Bearer $s', 'X-HMAC-Auth': hmac.toString(), }, ); // Log.print('response.request:${response.request}'); // Log.print('response.body: ${response.body}'); // Log.print('payload:$payload'); if (response.statusCode == 200) { try { var jsonData = jsonDecode(response.body); if (jsonData['status'] == 'success') { return jsonData; } else { return jsonData['status']; } } catch (e) { // addError(e.toString(), 'crud().post - JSON decoding'); return 'failure'; } } else if (response.statusCode == 401) { // Specifically handle 401 Unauthorized var jsonData = jsonDecode(response.body); if (jsonData['error'] == 'Token expired') { return 'token_expired'; // Return a specific value for token expiration } else { // Other 401 errors // addError('Unauthorized: ${jsonData['error']}', 'crud().post - 401'); return 'failure'; } } else { // addError('Non-200 response code: ${response.statusCode}', // 'crud().post - Other'); return 'failure'; } } catch (e) { // addError('HTTP request error: $e', 'crud().post - HTTP'); return 'failure'; } } // } Future sendWhatsAppAuth(String to, message) async { var res = await CRUD().post( link: AppLink.send_whatsapp_message, payload: {'receiver': to, 'message': message}); if (res != 'failure') { Get.snackbar('Success', 'Message sent successfully'); } else { Get.snackbar('Error', 'Failed to send message'); } } Future getAgoraToken({ required String channelName, required String uid, }) async { var uid = box.read(BoxName.phone) ?? box.read(BoxName.phoneDriver); var res = await http.get( Uri.parse( 'https://repulsive-pig-rugby-shirt.cyclic.app/token?channelName=$channelName'), headers: {'Authorization': 'Bearer ${AK.agoraAppCertificate}'}); if (res.statusCode == 200) { var response = jsonDecode(res.body); return response['token']; } else {} } Future getLlama({ required String link, required String payload, required String prompt, }) async { var url = Uri.parse( link, ); var headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer LL-X5lJ0Px9CzKK0HTuVZ3u2u4v3tGWkImLTG7okGRk4t25zrsLqJ0qNoUzZ2x4ciPy' // 'Authorization': 'Bearer ${Env.llamaKey}' }; var data = json.encode({ "model": "Llama-3-70b-Inst-FW", // "model": "llama-13b-chat", "messages": [ { "role": "user", "content": "Extract the desired information from the following passage as json decoded like $prompt just in this:\n\n$payload" } ], "temperature": 0.9 }); var response = await http.post( url, body: data, headers: headers, ); if (response.statusCode == 200) { return response.body; } return response.statusCode; } Future allMethodForAI(String prompt, driverID, imagePath) async { // await ImageController().choosImage(linkPHP, imagePath); Future.delayed(const Duration(seconds: 2)); var extractedString = await arabicTextExtractByVisionAndAI( imagePath: imagePath, driverID: driverID); var json = jsonDecode(extractedString); var textValues = getAllTextValuesWithLineNumbers(json); // List textValues = getAllTextValues(json); // await AI().geminiAiExtraction(prompt, textValues); } Map>> getAllTextValuesWithLineNumbers( Map json) { Map>> output = {}; int lineNumber = 1; if (json.containsKey('regions')) { List regions = json['regions']; for (Map region in regions) { if (region.containsKey('lines')) { List lines = region['lines']; List> linesWithText = []; for (Map line in lines) { if (line.containsKey('words')) { List words = line['words']; String lineText = ""; for (Map word in words) { if (word.containsKey('text')) { lineText += word['text'] + " "; } } lineText = lineText.trim(); linesWithText.add( {"line_number": lineNumber.toString(), "text": lineText}); lineNumber++; } } output["region_${region.hashCode}"] = linesWithText; } } } return output; } // List getAllTextValues(Map json) { // List textValues = []; // if (json.containsKey('regions')) { // List regions = json['regions']; // for (Map region in regions) { // if (region.containsKey('lines')) { // List lines = region['lines']; // for (Map line in lines) { // if (line.containsKey('words')) { // List words = line['words']; // for (Map word in words) { // if (word.containsKey('text')) { // textValues.add(word['text']); // } // } // } // } // } // } // } // return textValues; // } Future arabicTextExtractByVisionAndAI({ required String imagePath, required String driverID, }) async { var headers = { 'Content-Type': 'application/json', 'Ocp-Apim-Subscription-Key': AK.ocpApimSubscriptionKey }; String imagePathFull = '${AppLink.server}/card_image/$imagePath-$driverID.jpg'; var request = http.Request( 'POST', Uri.parse( 'https://eastus.api.cognitive.microsoft.com/computervision/imageanalysis:analyze?features=caption,read&model-version=latest&language=en&api-version=2024-02-01')); request.body = json.encode({"url": imagePathFull}); request.headers.addAll(headers); http.StreamedResponse response = await request.send(); if (response.statusCode == 200) { return await response.stream.bytesToString(); } else {} } Future getChatGPT({ required String link, required String payload, }) async { var url = Uri.parse( link, ); var headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer ${Env.chatGPTkeySeferNew}' }; var data = json.encode({ "model": "gpt-3.5-turbo", "messages": [ { "role": "user", "content": "Extract the desired information from the following passage as json decoded like vin,make,made,year,expiration_date,color,owner,registration_date just in this:\n\n$payload" } ], "temperature": 0.9 }); var response = await http.post( url, body: data, headers: headers, ); if (response.statusCode == 200) { return response.body; } return response.statusCode; } Future postStripe({ required String link, Map? payload, }) async { // String? secretKey = await storage.read(key: BoxName.secretKey); var url = Uri.parse( link, ); var response = await http.post( url, body: payload, headers: { "Content-Type": "application/x-www-form-urlencoded", 'Authorization': 'Bearer ${AK.secretKey}', }, ); if (response.statusCode == 200) { return response.body; } else {} } Future kazumiSMS({ required String link, Map? payload, }) async { var url = Uri.parse( link, ); var headers = {'Content-Type': 'application/json'}; var request = http.Request('POST', url); request.body = json.encode({ "username": "Sefer", "password": AK.smsPasswordEgypt, }); request.headers.addAll(headers); http.StreamedResponse response = await request.send(); if (response.statusCode == 200) { var responseBody = await response.stream.bytesToString(); var data = json.decode(responseBody); return data; } else {} } Future sendSmsEgypt(String phone, otp) async { // String sender = await getSender(); var headers = {'Content-Type': 'application/json'}; var body = jsonEncode({ "username": "Sefer", "password": "E)Pu=an/@Z", "message": otp, "language": "e", "sender": "Sefer Egy", "receiver": phone }); var res = await http.post( Uri.parse(AppLink.sendSms), body: body, headers: headers, ); } Future postPayMob({ required String link, Map? payload, }) async { // String? basicAuthCredentials = // await storage.read(key: BoxName.basicAuthCredentials); var url = Uri.parse( link, ); var response = await http.post(url, body: payload, headers: {'Content-Type': 'application/json'}); var jsonData = jsonDecode(response.body); if (response.statusCode == 200) { if (jsonData['status'] == 'success') { return response.body; } else { return (jsonData['status']); } } else { return response.statusCode; } } sendEmail( String link, Map? payload, ) async { var headers = { "Content-Type": "application/x-www-form-urlencoded", 'Authorization': 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', }; var request = http.Request('POST', Uri.parse(link)); request.bodyFields = payload!; request.headers.addAll(headers); http.StreamedResponse response = await request.send(); if (response.statusCode == 200) { } else {} } Future postFromDialogue({ required String link, Map? payload, }) async { // String? basicAuthCredentials = // await storage.read(key: BoxName.basicAuthCredentials); var url = Uri.parse( link, ); var response = await http.post( url, body: payload, headers: { "Content-Type": "application/x-www-form-urlencoded", 'Authorization': 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', }, ); if (response.body.isNotEmpty) { var jsonData = jsonDecode(response.body); if (response.statusCode == 200) { if (jsonData['status'] == 'success') { Get.back(); // Get.snackbar( // jsonData['status'], // jsonData['message'], // ); return response.body; } } return (jsonData['status']); } } Future sendVerificationRequest(String phoneNumber) async { final accountSid = AK.accountSIDTwillo; final authToken = AK.authTokenTwillo; final verifySid = AK.twilloRecoveryCode; final Uri verificationUri = Uri.parse( 'https://verify.twilio.com/v2/Services/$verifySid/Verifications'); // Send the verification request final response = await http.post( verificationUri, headers: { 'Authorization': 'Basic ${base64Encode(utf8.encode('$accountSid:$authToken'))}', 'Content-Type': 'application/x-www-form-urlencoded', }, body: { 'To': phoneNumber, 'Channel': 'sms', }, ); if (response.statusCode == 201) { } else {} // Prompt the user to enter the OTP const otpCode = "123456"; // Replace with user input // Check the verification code final checkUri = Uri.parse( 'https://verify.twilio.com/v2/Services/$verifySid/VerificationCheck'); final checkResponse = await http.post( checkUri, headers: { 'Authorization': 'Basic ${base64Encode(utf8.encode('$accountSid:$authToken'))}', 'Content-Type': 'application/x-www-form-urlencoded', }, body: { 'To': phoneNumber, 'Code': otpCode, }, ); if (checkResponse.statusCode == 201) { } else {} } Future getGoogleApi({ required String link, Map? payload, }) async { var url = Uri.parse( link, ); var response = await http.post( url, body: payload, ); var jsonData = jsonDecode(response.body); if (jsonData['status'] == 'OK') { return jsonData; } return (jsonData['status']); } Future update({ required String endpoint, required Map data, required String id, }) async { // String? basicAuthCredentials = // await storage.read(key: BoxName.basicAuthCredentials); var url = Uri.parse('$endpoint/$id'); var response = await http.put( url, body: json.encode(data), headers: { 'Authorization': 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', }, ); return json.decode(response.body); } Future delete({ required String endpoint, required String id, }) async { // String? basicAuthCredentials = // await storage.read(key: BoxName.basicAuthCredentials); var url = Uri.parse('$endpoint/$id'); var response = await http.delete( url, headers: { 'Authorization': 'Basic ${base64Encode(utf8.encode(AK.basicAuthCredentials))}', }, ); return json.decode(response.body); } List phoneDriversTest = [ 201023248456, 201023248456, ]; List phoneDrivers = [ 201000038159, 201000038736, 201000064464, 201000091230, 201000136570, 201000151861, 201000198736, 201000228580, 201000237951, 201000255720, 201000287614, 201000292939, 201000304215, 201000332271, 201000392607, 201000405678, 201000426363, 201000435451, 201000480175, 201000669808, 201000692012, 201000892261, 201000927483, 201001022044, 201001088358, 201001195138, 201001216083, 201001227223, 201001231343, 201001281229, 201001324045, 201001372270, 201001448413, 201001456101, 201001460169, 201001484302, 201001486990, 201001609106, 201001614305, 201001616098, 201001695782, 201001741428, 201001868999, 201001880988, 201001917872, 201001974843, 201002026121, 201002034349, 201002050890, 201002205527, 201002211383, 201002220298, 201002380874, 201002507461, 201002524889, 201002559121, 201002593666, 201002726223, 201002757121, 201002772429, 201002831939, 201002918886, 201003008890, 201003093029, 201003111434, 201003247072, 201003284035, 201003312497, 201003322933, 201003335753, 201003395388, 201003454075, 201003457552, 201003464748, 201003516746, 201003519354, 201003562562, 201003624502, 201003660350, 201003698426, 201003732688, 201003758852, 201003769330, 201003970205, 201003973327, 201004008170, 201004034125, 201004361687, 201004362477, 201004378446, 201004508215, 201004519539, 201004558484, 201004625077, 201004658742, 201004663695, 201004712116, 201004754688, 201004770495, 201004771729, 201004800479, 201004848413, 201004965744, 201005004603, 201005094804, 201005126645, 201005145830, 201005170670, 201005215092, 201005259664, 201005285496, 201005308188, 201005315146, 201005457333, 201005457388, 201005464946, 201005467997, 201005496502, 201005591720, 201005655832, 201005748724, 201005778338, 201005802822, 201005804981, 201005840296, 201005857716, 201005894006, 201006098594, 201006119945, 201006261655, 201006336012, 201006373310, 201006399505, 201006529560, 201006550621, 201006566057, 201006568992, 201006576933, 201006642448, 201006681860, 201006701396, 201006775356, 201006833930, 201006841969, 201006874127, 201006886819, 201006905156, 201006911892, 201006953238, 201006997521, 201007006197, 201007126077, 201007135060, 201007174032, 201007210871, 201007251945, 201007420153, 201007431781, 201007436392, 201007467887, 201007526078, 201007532774, 201007536613, 201007573334, 201007581968, 201007737308, 201007740820, 201007901024, 201007910121, 201008018110, 201008053391, 201008073697, 201008235676, 201008269802, 201008306697, 201008330262, 201008360039, 201008527428, 201008529970, 201008597171, 201008698488, 201008864162, 201008872941, 201008900034, 201008940080, 201008968686, 201009033817, 201009089217, 201009120576, 201009150184, 201009171151, 201009190006, 201009225265, 201009440993, 201009752899, 201009759313, 201009793301, 201009797500, 201009804581, 201009869329, 201009886308, 201009939077, 201009945537, 201009969727, 201010025269, 201010041236, 201010107223, 201010259482, 201010376273, 201010382250, 201010490869, 201010684229, 201010743158, 201010789827, 201010866363, 201010885870, 201010887621, 201010887705, 201011205708, 201011492446, 201011508900, 201011604297, 201011723604, 201011936165, 201011953955, 201011999310, 201012036826, 201012338391, 201012342004, 201012475707, 201012530826, 201012574024, 201012775059, 201012856677, 201012962316, 201013004000, 201013135258, 201013248449, 201013327761, 201013331683, 201013725067, 201014063641, 201014242962, 201014446768, 201014626816, 201014687816, 201014714084, 201014781950, 201014786553, 201015084707, 201015162969, 201015264416, 201015328382, 201015493716, 201015554008, 201015555050, 201015654885, 201015665467, 201015736460, 201015817826, 201015994940, 201016388436, 201016408801, 201016497939, 201016565911, 201016636646, 201016748176, 201017035902, 201017062590, 201017212144, 201017435616, 201017505135, 201017567245, 201017580860, 201017650550, 201017672180, 201017690285, 201017815188, 201018042320, 201018180201, 201018416878, 201018518723, 201018861694, 201018933273, 201018984078, 201019023091, 201019069097, 201019217036, 201019266797, 201019502290, 201019782128, 201019785811, 201019859988, 201020007540, 201020060588, 201020093997, 201020170343, 201020172859, 201020178391, 201020184220, 201020235190, 201020301781, 201020335329, 201020555412, 201020649148, 201020695352, 201020847945, 201020969782, 201021017211, 201021160682, 201021222549, 201021235129, 201021394443, 201021655556, 201021736217, 201021875274, 201022226451, 201022246204, 201022265083, 201022329267, 201022446211, 201022518181, 201022660026, 201023005090, 201023069002, 201023069907, 201023095063, 201023118846, 201023130711, 201023247045, 201023248455, 201023248456, 201023248457, 201023248488, 201023626140, 201023674737, 201023790070, 201023848787, 201024052053, 201024181778, 201024420162, 201024470224, 201024501874, 201024769948, 201025075574, 201025227216, 201025255404, 201025393959, 201025412613, 201025432017, 201025463793, 201025500060, 201025581505, 201025647745, 201025737661, 201025767385, 201025887117, 201026191863, 201026200067, 201026264611, 201026300904, 201026440737, 201026773473, 201026798518, 201026807264, 201027030168, 201027234885, 201027316763, 201027481133, 201027605557, 201027719574, 201027774092, 201027775432, 201027788822, 201027994009, 201028258757, 201028313498, 201028340666, 201028603589, 201028885144, 201028912082, 201029116604, 201029135123, 201029139900, 201029296526, 201029362080, 201029484514, 201029602004, 201029777011, 201029885806, 201029929017, 201029950342, 201030014226, 201030039804, 201030047331, 201030096464, 201030145357, 201030282895, 201030356606, 201030367702, 201030382740, 201030499449, 201030530211, 201030596294, 201030673353, 201030751777, 201030806901, 201030812036, 201030885983, 201030985581, 201032073723, 201032080240, 201032197354, 201032215558, 201032599049, 201032900804, 201032960990, 201032995929, 201033006950, 201033014117, 201033053068, 201033054527, 201033087547, 201033159408, 201033499971, 201033552484, 201033598513, 201033854635, 201033970821, 201040535096, 201040873577, 201050048044, 201050774777, 201050797017, 201050894194, 201050916243, 201050923423, 201060037563, 201060040065, 201060090105, 201060156231, 201060163215, 201060208601, 201060371260, 201060444330, 201060525792, 201060577208, 201060686267, 201060794536, 201060896771, 201060906267, 201060974333, 201061099914, 201061131720, 201061337043, 201061350410, 201061489820, 201061973544, 201062031886, 201062166038, 201062319321, 201062415502, 201062603244, 201062702907, 201062718466, 201062981863, 201063103737, 201063141018, 201063251961, 201063308303, 201063525249, 201063556251, 201063600748, 201063688477, 201063831389, 201063923914, 201063955559, 201064026674, 201064054511, 201064101887, 201064153512, 201064178167, 201064312767, 201064334558, 201064468695, 201064626776, 201064630354, 201064644619, 201064684185, 201064921214, 201064982002, 201065048819, 201065050067, 201065161321, 201065286286, 201065451010, 201065601203, 201065635907, 201066228870, 201066229104, 201066253365, 201066292351, 201066465787, 201066596220, 201066730578, 201067611319, 201067696612, 201067788258, 201067791624, 201067859062, 201067889013, 201067970457, 201067986841, 201068212833, 201068640092, 201068653978, 201069074613, 201069133688, 201069483289, 201069766969, 201069938005, 201070021630, 201070076171, 201070129941, 201070290269, 201070641133, 201070665752, 201080058399, 201080068372, 201080076746, 201080269149, 201080322306, 201080351275, 201080454035, 201080688081, 201080827009, 201080931721, 201080979919, 201090009131, 201090090088, 201090119050, 201090213039, 201090333810, 201090744905, 201090809381, 201091029772, 201091467068, 201091677319, 201091729780, 201091951144, 201092955061, 201092977597, 201093030032, 201093092520, 201093122561, 201093359914, 201093594953, 201093882353, 201093981308, 201094057691, 201094186227, 201094255708, 201094584806, 201094688043, 201094688644, 201094769303, 201094924486, 201094960584, 201095032754, 201095288771, 201095667357, 201095782382, 201095956669, 201096133443, 201096148124, 201096351318, 201096567961, 201096662301, 201096725050, 201096776146, 201097229576, 201097267405, 201097761778, 201097765410, 201097846083, 201097919136, 201098123666, 201098127395, 201098166776, 201098386668, 201098582216, 201098700882, 201098957440, 201099336257, 201099412985, 201099420820, 201099530964, 201099550606, 201099600846, 201099670072, 201099785084, 201099907868, 201099915861, 201099924551, 201099981747, 201099997143, 201100038956, 201100040727, 201100074027, 201100082801, 201100170600, 201100245413, 201100316991, 201100485561, 201100583911, 201100588511, 201100667988, 201100680306, 201100711857, 201100721522, 201100726360, 201101163626, 201101371471, 201101474377, 201101512699, 201101626410, 201101795866, 201101986128, 201102192489, 201102432276, 201102563435, 201102660856, 201102752569, 201102766374, 201102779987, 201104429778, 201110110495, 201110121075, 201110144858, 201110333451, 201110600956, 201110668338, 201110797333, 201110868027, 201110921077, 201111047616, 201111105976, 201111250676, 201111282490, 201111300613, 201111512106, 201111522040, 201111528707, 201111667567, 201111697961, 201111715992, 201111716562, 201111718210, 201111751166, 201111751446, 201111754283, 201111951209, 201111981450, 201112000443, 201112022291, 201112044799, 201112105588, 201112215276, 201112235547, 201112299884, 201112524534, 201112539202, 201112591953, 201112861834, 201113001950, 201113024717, 201113305615, 201113328519, 201113512958, 201113617737, 201113701121, 201113931993, 201113999375, 201114202318, 201114211410, 201114384428, 201114568129, 201114729635, 201114776641, 201114801155, 201114988892, 201115232474, 201115299186, 201115307275, 201115440591, 201115553247, 201115605581, 201115691406, 201115790410, 201115794827, 201115801585, 201115892867, 201115934957, 201115997592, 201116036599, 201116062390, 201116155328, 201116195736, 201116360444, 201116362464, 201116397705, 201116410122, 201116646518, 201116661682, 201116662263, 201116669877, 201116684607, 201116787624, 201116951169, 201116985014, 201117008885, 201117059617, 201117246068, 201117265855, 201117558213, 201117651958, 201117663059, 201117685256, 201117730892, 201117745888, 201117937985, 201118001729, 201118002160, 201118175123, 201118243930, 201118313079, 201118331500, 201118342702, 201118636820, 201118653148, 201118674734, 201118689666, 201118706518, 201118787900, 201118882012, 201118886390, 201118970961, 201119044711, 201119079364, 201119100748, 201119137787, 201119159545, 201119187827, 201119256418, 201119298768, 201119490066, 201119499018, 201119557005, 201119601947, 201119905035, 201119928400, 201119993654, 201120071355, 201120086686, 201120161089, 201120194397, 201120272743, 201120357820, 201120732419, 201120760088, 201120777527, 201120803031, 201120840502, 201120917643, 201121000454, 201121104000, 201121115920, 201121218416, 201121262634, 201121537458, 201121539342, 201121641905, 201121645943, 201121676093, 201121721649, 201121738274, 201121833893, 201121880293, 201121904651, 201121999951, 201122130454, 201122277009, 201122352926, 201122352929, 201122441260, 201122453889, 201122466640, 201122681852, 201123138354, 201123200082, 201123237473, 201123338071, 201123355123, 201123386341, 201123606787, 201123850040, 201124166622, 201124215002, 201124355455, 201124484309, 201124525303, 201124535519, 201124554413, 201124585917, 201124868717, 201124939986, 201125111045, 201125308780, 201125388876, 201125811384, 201125869973, 201126002027, 201126047174, 201126255847, 201126312269, 201126442254, 201126625122, 201126636750, 201126659891, 201126669098, 201126946975, 201127000498, 201127009293, 201127010150, 201127029020, 201127040489, 201127068159, 201127100040, 201127233460, 201127301093, 201127315881, 201128008500, 201128144862, 201128293924, 201128316869, 201128399780, 201128482002, 201128652929, 201128716058, 201128852395, 201128872000, 201128932455, 201129157079, 201129158922, 201129706750, 201129808001, 201140276818, 201140490935, 201140823736, 201140826987, 201141094583, 201141191135, 201141231122, 201141307507, 201141385551, 201141438922, 201141473992, 201141549347, 201141573088, 201141614543, 201141675135, 201141679102, 201141679162, 201141696200, 201141724381, 201141761526, 201141822739, 201141941402, 201142001090, 201142088851, 201142136063, 201142224902, 201142381399, 201142394076, 201142461102, 201142492474, 201142783738, 201142877782, 201142889397, 201142985578, 201143123876, 201143283485, 201143335405, 201143490888, 201143631229, 201143730080, 201143791394, 201143915554, 201144038991, 201144129961, 201144175633, 201144224787, 201144294246, 201144338541, 201144352678, 201144601683, 201144626239, 201144707747, 201145000373, 201145579943, 201145611618, 201145621795, 201145809497, 201145814704, 201145828830, 201145922310, 201146055558, 201146207812, 201146445021, 201146448910, 201146461695, 201146628267, 201146791090, 201147155402, 201147181768, 201147333047, 201147429209, 201147504941, 201147769989, 201147912222, 201147965344, 201148073829, 201148140582, 201148163794, 201148283337, 201148460674, 201148504650, 201148581664, 201148656049, 201149228245, 201149363795, 201149492463, 201149518708, 201150259592, 201150300052, 201150304075, 201150343503, 201150352022, 201150451768, 201150516739, 201150533289, 201150548146, 201150647985, 201150650378, 201150793312, 201150872150, 201150921271, 201151296487, 201151458889, 201151510446, 201151593953, 201151616245, 201151845956, 201151869870, 201152054617, 201152154482, 201152184337, 201152228476, 201152336491, 201152636067, 201152851954, 201152994061, 201153086752, 201153094925, 201153260339, 201153506778, 201153508619, 201153590337, 201154004771, 201154322032, 201154404977, 201154505875, 201154554795, 201154558329, 201154566231, 201154962800, 201155018765, 201155072426, 201155110000, 201155215891, 201155394107, 201155449375, 201155465556, 201155512282, 201155540425, 201155581701, 201155617074, 201155633622, 201155705126, 201155883321, 201156012567, 201156265716, 201156422481, 201156839185, 201156894666, 201156941320, 201157009020, 201157055175, 201157121939, 201157347771, 201157566765, 201157693835, 201158232008, 201158313756, 201158342680, 201158601956, 201158680006, 201158913381, 201158937603, 201159109401, 201159430166, 201159519690, 201159555233, 201159775543, 201200008264, 201200205662, 201200225120, 201200240122, 201200360155, 201200395648, 201200520512, 201200622072, 201200622129, 201200678667, 201200751933, 201200757011, 201200811161, 201200999580, 201201025700, 201201155000, 201201294180, 201201312691, 201201383512, 201201421326, 201201491025, 201201621622, 201201840871, 201202000888, 201202211450, 201202530513, 201202665435, 201202912341, 201203014151, 201203039750, 201203181372, 201203456879, 201203477332, 201204023121, 201204281981, 201204514017, 201204688081, 201204855400, 201204977751, 201205000292, 201205031905, 201205686247, 201205759040, 201206017464, 201206600861, 201206975332, 201207121802, 201207372344, 201207616444, 201207750441, 201208085263, 201208414347, 201208977177, 201210023938, 201210583591, 201210588038, 201210732122, 201210818176, 201210945113, 201211066299, 201211079908, 201211161032, 201211795422, 201211986162, 201212145380, 201212258721, 201212479538, 201220444133, 201220612822, 201220724766, 201220820976, 201220914219, 201221041254, 201221138834, 201221212426, 201221212824, 201221278704, 201221280828, 201221328517, 201221408219, 201221732389, 201221800122, 201221954550, 201222143516, 201222278308, 201222282205, 201222332047, 201222517257, 201222620610, 201222695023, 201222748994, 201222781707, 201222967787, 201222971467, 201223234257, 201223336884, 201223376686, 201223401519, 201223456731, 201223521664, 201223596905, 201223671633, 201223705456, 201223838760, 201223874421, 201223940650, 201224050760, 201224053907, 201224213162, 201224217248, 201224236042, 201224353363, 201224380088, 201224483706, 201224508493, 201224535248, 201224661061, 201224752065, 201224825057, 201224911013, 201224927485, 201224970278, 201224971527, 201225001313, 201225015388, 201225294141, 201225301553, 201225328559, 201225460762, 201225570507, 201225656181, 201225958509, 201226262906, 201226291683, 201226315730, 201226416059, 201226461243, 201226595175, 201226655253, 201226672939, 201226757626, 201226782942, 201226790797, 201226965492, 201226994629, 201227070538, 201227314954, 201227757571, 201227831100, 201227885100, 201228030501, 201228216918, 201228781347, 201228922343, 201228946285, 201229082850, 201229123460, 201229974967, 201270550493, 201270565699, 201270626113, 201271122314, 201271132209, 201271133956, 201271160173, 201271401468, 201272021184, 201272072854, 201272336635, 201272649581, 201272939093, 201273024547, 201273073912, 201273114754, 201273170033, 201273273705, 201273808399, 201273888510, 201273943548, 201274050210, 201274206995, 201274302911, 201274527249, 201274768678, 201274793455, 201274842863, 201275200924, 201275298194, 201275610030, 201275624989, 201275662461, 201275668382, 201275901512, 201276330019, 201276624302, 201276766553, 201277014277, 201277117926, 201277131373, 201277606290, 201277740069, 201277773181, 201277855345, 201277862323, 201278119893, 201278324075, 201278378190, 201278539943, 201278956638, 201279236054, 201279296936, 201279803133, 201279872337, 201279920962, 201280024389, 201280256821, 201280433297, 201280832425, 201280838169, 201281011857, 201281181008, 201281659132, 201281802541, 201281898421, 201282199565, 201282427635, 201283170305, 201283329751, 201283991212, 201284350745, 201284436627, 201284601547, 201285060920, 201285686701, 201285980741, 201286065056, 201286254841, 201287277734, 201287585360, 201287839817, 201288006876, 201288090780, 201288199133, 201288326620, 201288446043, 201288496608, 201288863470, 201289006333, 201289354010, 201289488182, 201289723337, 201289723730, 201289920270, 201500085192, 201500263335, 201500567444, 201500791104, 201500888614, 201501355877, 201501538118, 201501602948, 201501877880, 201503227949, 201507255344, 201507416444, 201508325183, 201550132936, 201550707584, 201550801300, 201550817512, 201550861194, 201550919395, 201551141835, 201551233318, 201551418313, 201551421493, 201551465551, 201551500674, 201551630844, 201551980169, 201553022775, 201553077785, 201553222768, 201553324455, 201553335619, 201553540894, 201553684030, 201553806016, 201553996793, 201554435301, 201554666842, 201554752044, 201555000205, 201555116452, 201555181159, 201555310975, 201555320344, 201555402805, 201555408958, 201555577228, 201555583558, 201555604325, 201555791055, 201555888091, 201555944650, 201556206194, 201556754333, 201557454447, 201557567007, 201557770122, 201558550454, 201559170967, 201559975610, 21142703233 ]; }