function save($saveClose = 0) { $jinput = JFactory::getApplication()->input; $cur_post = $jinput->post; $sku = $cur_post->get('sku', '', "RAW"); $sku = trim($sku); global $mainframe; $mainframe = JFactory::getApplication(); $current_store = $cur_post->get('current_store'); if (!empty($current_store)) { $mainframe->setUserState('current_store', $current_store); } $item_name = $jinput->get('item_name', '', 'STRING'); //$currencydata = $cur_post['multi_cur']; $pid = $jinput->get('pid', 0, 'INT'); $client = 'com_quick2cart'; $stock = $jinput->get('itemstock', '', 'INTEGER'); $min_qty = $jinput->get('min_item'); $max_qty = $jinput->get('max_item'); $cat = $jinput->get('prod_cat', '', 'INTEGER'); //$sku=$jinput->get('sku'); $params = JComponentHelper::getParams('com_quick2cart'); $on_editor = $params->get('enable_editor', 0); $youtubleLink = $jinput->get('youtube_link', '', "RAW"); $store_id = $jinput->get('current_store'); //1; // @TODO hard coded for now store // @if store id is empty then calculate from item_id $data = array(); //get currency field count $multi_curArray = $cur_post->get('multi_cur', array(), 'ARRAY'); $originalCount = count($multi_curArray); $filtered_curr = array_filter($multi_curArray, 'strlen'); // remove empty currencies from multi_curr //get currency field count after filter enpty allow 0 $filter_count = count($filtered_curr); if ($item_name && $originalCount == $filter_count) { //load Attributes model $comquick2cartHelper = new comquick2cartHelper(); $path = JPATH_SITE . DS . 'components' . DS . 'com_quick2cart' . DS . 'models' . DS . 'attributes.php'; $attri_model = $comquick2cartHelper->loadqtcClass($path, "quick2cartModelAttributes"); $cur_post->set('saveAttri', 1); // whether have to save attributes or not $cur_post->set('saveMedia', 1); $item_id = $comquick2cartHelper->saveProduct($cur_post); if (is_numeric($item_id)) { //load product model $path = JPATH_SITE . DS . 'components' . DS . 'com_quick2cart' . DS . 'models' . DS . 'product.php'; $prodmodel = $comquick2cartHelper->loadqtcClass($path, 'quick2cartModelProduct'); if ($saveClose == 1) { return 1; } $mainframe->setUserState('item_id', $item_id); $this->setRedirect(JUri::base() . "index.php?option=com_quick2cart&view=products&layout=new&item_id=" . $item_id, JText::_('COM_QUICK2CART_SAVE_SUCCESS')); } else { //save attribute if any $msg = JText::_( 'C_SAVE_M_NS' ); $this->setRedirect(JUri::base() . "index.php?option=com_quick2cart&view=products&layout=new", JText::_('C_SAVE_M_NS')); } } else { $this->setRedirect(JUri::base() . "index.php?option=com_quick2cart&view=products&layout=new", JText::_('C_FILL_COMPULSORY_FIELDS')); } }
var tem=''; } } }); } } } </script> <?php if (!empty($store_id)) { if (empty($itemDetail)) { $itemDetail['taxprofile_id'] = ''; } $user = JFactory::getUser(); $storeHelper = $comquick2cartHelper->loadqtcClass(JPATH_SITE . "/components/com_quick2cart/helpers/storeHelper.php", "storeHelper"); //$storeList=(array)$storeHelper->getUserStore($user->id); $js_currency .= "\n\t\tvar qtc_base_url='" . $qtc_base_url . "';\n\t\tvar firstStoreId = '" . $storeList[0]['store_id'] . "';\n\n\t\tfunction getTaxprofile()\n\t\t{\n\t\t\tvar isTaxationEnabled = " . $isTaxationEnabled . ";\n\t\t\tvar qtc_shipping_opt_status = " . $qtc_shipping_opt_status . ";\n\t\t\tvar store_id = techjoomla.jQuery('#current_store_id').val();\n\t\t\tif (store_id == null)\n\t\t\t{\n\t\t\t\tstore_id = firstStoreId;\n\t\t\t}\n\t\t\tvar selected_taxid = '" . $itemDetail['taxprofile_id'] . "';\n\n\t\t\tif (isTaxationEnabled == 1)\n\t\t\t{\n\t\t\t\tqtcLoadTaxprofileList(store_id, selected_taxid);\n\t\t\t}\n\n\t\t\t/* Now update ship profiles */\n\n\t\t\tif (qtc_shipping_opt_status == 1)\n\t\t\t{\n\t\t\t\tqtcUpdateShipProfileList(store_id);\n\t\t\t}\n\t\t}\n\t\twindow.onload = function ()\n\t\t{\n\t\t\tvar isTaxationEnabled = " . $isTaxationEnabled . ";\n\t\t\tvar qtc_shipping_opt_status = " . $qtc_shipping_opt_status . ";\n\t\t\tvar store_id = techjoomla.jQuery('#current_store_id').val();\n\t\t\tif (store_id == null)\n\t\t\t{\n\t\t\t\tstore_id = firstStoreId;\n\t\t\t}\n\t\t\tvar selected_taxid = '" . $itemDetail['taxprofile_id'] . "';\n\t\t\t// Get tax profile list\n\n\t\t\tif (isTaxationEnabled == 1)\n\t\t\t{\n\t\t\t\tqtcLoadTaxprofileList(store_id, selected_taxid);\n\t\t\t}\n\t\t}\n\t\t"; $js_currency .= "\n\tfunction savecurrency(pid,client)\n\t{\n\t\tvar store_id = techjoomla.jQuery('#current_store_id').val();\n\t\tif (store_id == null)\n\t\t{\n\t\t\tstore_id = firstStoreId;\n\t\t}\n\n\t\tvar multicurr = techjoomla.jQuery('.currtext').serializeArray();\n\t\tconsole.log(multicurr);\n\t\tvar item_name=techjoomla.jQuery('#item_name').val();\n\t\tvar isCurrFilled=1;\n\t\ttechjoomla.jQuery('.qtc_requiredoption').each(function()\n\t\t{\n\t\t\tvar val=techjoomla.jQuery(this).val();\n\t\t\tif (val=='' || val==null)\n\t\t\t{\n\t\t\t\tisCurrFilled=0;\n\t\t\t}\n\t\t});\n\n\t\tif (isCurrFilled == 0 || item_name.length==0)\n\t\t{\n\t\t\talert(\"" . JText::_('QTC_OPTIONS_REQUIRED') . "\");\n\t\t\treturn( false );\n\t\t}\n\n\t\t// sku check\n\t\tvar qtc_sku = techjoomla.jQuery('#sku').val();\n\t\tif (qtc_sku == '' || qtc_sku == null)\n\t\t{\n\t\t\talert(\"" . JText::_('QTC_OPTIONS_REQUIRED') . "\");\n\t\t\treturn( false );\n\t\t}\n\t\t//var attdata = techjoomla.jQuery('#qtcCCK_prodDetail').serialize();\n\t\tvar attdata = techjoomla.jQuery('#qtcCCK_prodDetail :input').serialize();\n\n\t\ttechjoomla.jQuery.ajax({\n\t\t\turl: '" . $qtc_base_url . "index.php?option=com_quick2cart&controller=attributes&task=attributes.addcurrency',\n\t\t\ttype: 'POST',\n\t\t\tdata: attdata,\n\t\t\tdataType: 'json',\n\t\t\tsuccess: function(msg)\n\t\t\t{\n\t\t\t\tif (msg[0]==0){\n\t\t\t\t\talert(msg[1]);\n\t\t\t\t}\n\t\t\t\telse if (msg[1]==1)\n\t\t\t\t{\n\t\t\t\t\talert(msg[1]);\n\t\t\t\t\t//window.location.reload();\n\t\t\t\t}\n\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction qtcUpdateProdFieldClasses()\n\t{\n\t\tif (document.getElementById('qtcEnableQtcProd').checked)\n\t\t{\n\t\t\t/* Add required class*/\n\t\t\ttechjoomla.jQuery('#qtcOptionsWraper').show();\n\t\t\ttechjoomla.jQuery('#item_name').addClass('required');\n\t\t\ttechjoomla.jQuery('#sku').addClass('required');\n\n\t\t\t/* Price related things */\n\t\t\ttechjoomla.jQuery('#qtc_price_currencey_textbox').find('.currtext').each(function()\n\t\t\t{\n\t\t\t\ttechjoomla.jQuery(this).addClass('required');\n\t\t\t});\n\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttechjoomla.jQuery('#qtcOptionsWraper').hide();\n\t\t\t/*Remove required classes*/\n\t\t\ttechjoomla.jQuery('#item_name').removeClass('required');\n\t\t\ttechjoomla.jQuery('#sku').removeClass('required');\n\n\t\t\t/* Price related things */\n\t\t\ttechjoomla.jQuery('#qtc_price_currencey_textbox').find('.currtext').each(function()\n\t\t\t{\n\t\t\t\ttechjoomla.jQuery(this).removeClass('required');\n\t\t\t});\n\t\t}\n\t}\n\t"; } $document->addScriptDeclaration($js_currency); //$document->addScript(JUri::root().'components/com_quick2cart/assets/js/order.js'); if (version_compare(JVERSION, '3.0', 'lt')) { // Define wrapper class define('Q2C_WRAPPER_CLASS', "q2c-wrapper techjoomla-bootstrap"); } else { // Define wrapper class define('Q2C_WRAPPER_CLASS', "q2c-wrapper"); } ?>
/** * $res is an object * */ function addPayoutEntry($order_id, $txnid, $status, $pg_plugin) { // GET BUSINESS EMAIL $plugin = JPluginHelper::getPlugin('payment', $pg_plugin); $pluginParams = json_decode($plugin->params); $businessPayEmial = ""; if (property_exists($pluginParams, 'business')) { $businessPayEmial = trim($pluginParams->business); } else { return array(); } $params = JComponentHelper::getParams('com_quick2cart'); $send_payments_to_owner = $params->get('send_payments_to_owner', 0); if ($pg_plugin == 'adaptive_paypal') { $comquick2cartHelper = new comquick2cartHelper(); $storeHelper = new storeHelper(); $adaptiveDetails = $storeHelper->getorderItemsStoreInfo($order_id); $Quick2cartModelReports = $comquick2cartHelper->loadqtcClass(JPATH_SITE . "/components/com_quick2cart/models/reports.php", 'Quick2cartModelReports'); $reportStatus = $status == 'C' ? 1 : 0; foreach ($adaptiveDetails as $userReport) { $Quick2cartModelpayment = new Quick2cartModelpayment(); $payDetail = $Quick2cartModelpayment->getPayoutId($txnid, $userReport['owner']); if (!empty($payDetail) && $payDetail['status'] == $reportStatus) { // payout already present mean $payDetail will not empty AND STATUS is same then dont process. // for new payout,thisl will not process break; } $post = array(); $post['id'] = empty($payDetail['id']) ? '' : $payDetail['id']; $post['user_id'] = $userReport['owner']; $post['payee_name'] = $comquick2cartHelper->getUserName($post['user_id']); $post['paypal_email'] = $userReport['store_email']; $post['transaction_id'] = $txnid; $post['payment_amount'] = $userReport['commissonCutPrice']; $post['payout_date'] = date('Y-m-d'); $post['status'] = $reportStatus; $post['payment_comment'] = "adaptive pay"; $Quick2cartModelReports->savePayout($post); } } }
/** * public function to insert/update item info table ie product table. TODO REMOVE ALL PARAMETER * AND SEND FORMATEED POST DATA SO THAT IT will be managabl * * @param MIXED $cur_post cur_post * * @return product id */ public function saveProduct($cur_post) { $app = JFactory::getApplication(); // Load language file as require from backend add product. $lang = JFactory::getLanguage(); $lang->load('com_quick2cart', JPATH_SITE); $item_name = $cur_post->get('item_name', '', 'STRING'); if ($item_name) { // OnBeforeq2cProductSave $dispatcher = JDispatcher::getInstance(); JPluginHelper::importPlugin('system'); $sku = ''; $client = ''; $dispatcher->trigger('OnBeforeq2cProductSave', array(&$cur_post)); $att_detail = $cur_post->get('att_detail', array(), 'ARRAY'); $multi_cur = $cur_post->get('multi_cur', array(), 'ARRAY'); // If called from content there will not find att_detail if (empty($att_detail)) { $att_detail = array(); } // Get currency field count && // Remove empty currencies from multi_curr $originalCount = count($multi_cur); $filtered_curr = array_filter($multi_cur, 'strlen'); // Get currency field count after filter enpty allow 0 $filter_count = count($filtered_curr); $comquick2cartHelper = new comquick2cartHelper(); $path = JPATH_SITE . '/components/com_quick2cart/models/attributes.php'; $attri_model = $comquick2cartHelper->loadqtcClass($path, "quick2cartModelAttributes"); // Save products basic option $pid = $cur_post->get('pid', '', 'STRING'); if (empty($pid)) { // For native product manager $pid = $cur_post->get('item_id', '', 'STRING'); } $client = $cur_post->get('client', '', 'STRING'); $isUpdadateItemOperation = $attri_model->getitemid($pid, $client); $item_id = $attri_model->storecurrency($cur_post); $saveAttri = $cur_post->get('saveAttri'); if (is_numeric($item_id) && !empty($saveAttri)) { $path = JPATH_SITE . '/components/com_quick2cart/models/product.php'; $prodmodel = $comquick2cartHelper->loadqtcClass($path, 'quick2cartModelProduct'); $prodmodel->StoreAllAttribute($item_id, $att_detail, $sku, $client); } // SAVE PRODUCT MEDIA FILE $media_detail = $cur_post->get('prodMedia', array(), 'ARRAY'); $saveMedia = $cur_post->get('saveMedia'); if (is_numeric($item_id) && !empty($saveMedia)) { $productHelper = new productHelper(); $productHelper->saveProdMediaDetails($media_detail, $item_id); } if ($app->isSite()) { $this->sendApprovalMail($cur_post, $item_id, $isUpdadateItemOperation); } // TART Q2C Sample development $dispatcher = JDispatcher::getInstance(); JPluginHelper::importPlugin('system'); $sku = ''; $client = ''; $result = $dispatcher->trigger('OnAfterq2cProductSave', array($item_id, $att_detail, $sku, $client)); return $item_id; } }
/** * Function: updatecart updates the cart and also calculates the tax and shipping charges * * @return json * * @since 1.0.0 */ public function update_cart_item() { $comquick2cartHelper = new comquick2cartHelper(); $input = JFactory::getApplication()->input; $post = $input->post; $data = $post->get('formData', '', 'STRING'); $cart_item_id = $post->get('cart_item_id', '', 'INT'); $item_id = $post->get('item_id', '', 'INT'); // Get parsed form data parse_str($post->get('formData', '', 'STRING'), $formData); // Load cart model /*$item = Array ( [id] => 17 [parent] => com_quick2cart [item_id] => 8 if item_id present then no need of id and parent fields [count] => 1 [options] => 24,23,22,19 ) <pre>$userdata = Array ( [23] => Array ( [itemattributeoption_id] => 23 [type] => Textbox [value] => qqq ) [24] => Array ( [itemattributeoption_id] => 24 [type] => Textbox [value] => www ) ) * */ $itemFromattedDet = array(); $itemFromattedDet['item_id'] = $item_id; $userdata = array(); if (!empty($formData['cartDetail']) && !empty($cart_item_id)) { $newItemDetails = $formData['cartDetail'][$cart_item_id]; $itemFromattedDet['count'] = $newItemDetails['cart_count']; $itemFromattedDet['options'] = ''; // If not empty attribute details if (!empty($newItemDetails['attrDetail'])) { $attrDetail = $newItemDetails['attrDetail']; foreach ($attrDetail as $key => $attr) { if ($attr['type'] == 'Textbox' && !empty($attr['value'])) { $userkey = $attr['itemattributeoption_id']; $userdata[$userkey] = $attr; $itemFromattedDet['options'] .= $attr['itemattributeoption_id'] . ','; } else { $itemFromattedDet['options'] .= $attr['value'] . ','; } } } } $path = JPATH_SITE . "/components/com_quick2cart/models/cart.php"; $comquick2cartHelper->loadqtcClass($path, 'Quick2cartModelcart'); $Quick2cartModelcart = new Quick2cartModelcart(); // Remove last comma if (!empty($itemFromattedDet['options'])) { $tempArray = explode(',', $itemFromattedDet['options']); $tempArray = array_filter($tempArray, "strlen"); $itemFromattedDet['options'] = implode(',', $tempArray); } // Get formated product details (internal) $prod_details = $Quick2cartModelcart->getProd($itemFromattedDet); // If option present if (!empty($prod_details[1])) { // Add user field detail to options $AttrOptions = $prod_details[1]; $prod_details[1] = $comquick2cartHelper->AddUserFieldDetail($AttrOptions, $userdata); } // Update the cart $result = $Quick2cartModelcart->putCartitem('', $prod_details, $cart_item_id); // Validate Result. If added successfully. if (is_numeric($result) && $result == 1) { $msg['status'] = true; $msg['successCode'] = 1; //$msg['message'] = JText::sprintf('COM_QUICK2CART_COMPACT_MSG', $prod_details[0]['name'], $item_count); } else { $msg['status'] = false; $msg['successCode'] = 0; $msg['message'] = $result; } echo json_encode($msg); jexit(); }
/** * Save the product basic option. * * @param object $curr_post Post objec. * * @since 2.2 * @return null */ function storecurrency($curr_post) { $itemname = $curr_post->get('item_name', '', 'STRING'); $store_id = $curr_post->get('store_id', '', 'STRING'); $pid = $curr_post->get('pid', '', 'STRING'); //@TODO check - ^sanjivani if (empty($pid)) { // For native product manager $pid = $curr_post->get('item_id', '', 'STRING'); } //@TODO check - ^sanjivani $client = $curr_post->get('client', '', 'STRING'); $sku = $curr_post->get('sku', '', 'RAW'); $res = ''; $message = ''; $comquick2cartHelper = new comquick2cartHelper(); $db = JFactory::getDbo(); $params = JComponentHelper::getParams('com_quick2cart'); $kart_curr_param = $params->get('addcurrency'); // used to store in kart_item table $kart_curr_param_array = explode(',', $kart_curr_param); $kart_item_curr = $kart_curr_param_array[0]; $quick2cartModelAttributes = new quick2cartModelAttributes(); //@TODO check - ^sanjivani //$item_id = $quick2cartModelAttributes->getitemid($pid, $client, $sku); $item_id = $quick2cartModelAttributes->getitemid($pid, $client); $img_dimensions = array(); $img_dimensions[] = 'small'; $img_dimensions[] = 'medium'; $img_dimensions[] = 'large'; $image_path = array(); // STORING ALL IMAGES images upladed (on new or edit) foreach ($_FILES as $key => $imgfile) { if (!empty($imgfile['name'])) { $image_path[] = $comquick2cartHelper->imageupload($key, $img_dimensions); //$imgfile['name']); } } $qtc_prodImgs = $curr_post->get('qtc_prodImg', array(), 'ARRAY'); // ON EDIT if (!empty($qtc_prodImgs)) { foreach ($image_path as $newImg) { $qtc_prodImgs[] = $newImg; } //$image_path = $curr_post->get('qtc_prodImg', array(), 'ARRAY'); //$curr_post['qtc_prodImg']; $image_path = array_filter($qtc_prodImgs, "trim"); } if (!empty($image_path)) { $image_path = json_encode($image_path); } else { $image_path = ''; } //@TODO save images and store in DB $images = ""; //GETTING ATTRIBUTE DETAILS,multi currency and discount details $att_detail = $curr_post->get('att_detail', array(), 'ARRAY'); $multi_cur = $curr_post->get('multi_cur', array(), 'ARRAY'); $multi_dis_cur = $curr_post->get('multi_dis_cur', array(), 'ARRAY'); if (!$item_id) { $state = $curr_post->get('state'); if (empty($state)) { $state = 0; } // Call the trigger to add extra field in product page. $dispatcher = JDispatcher::getInstance(); JPluginHelper::importPlugin("system"); $result = $dispatcher->trigger("beforeSavingProductBasicDetail", array($curr_post, 'insert')); // Save new product $item_id = $this->storeInKartItem('insert', $image_path, $multi_cur[$kart_item_curr], $curr_post); } else { $state = $curr_post->get('state'); // dont set default value as 1 (require for unpublish) if (isset($state)) { $state = $state; } $productHelper = $comquick2cartHelper->loadqtcClass(JPATH_SITE . DS . "components" . DS . "com_quick2cart" . DS . "helpers" . DS . "product.php", "productHelper"); $productHelper->deleteNotReqProdImages($item_id, $image_path); // Call the trigger to add extra field in product page. $dispatcher = JDispatcher::getInstance(); JPluginHelper::importPlugin("system"); $result = $dispatcher->trigger("beforeSavingProductBasicDetail", array($curr_post, 'update')); $item_id = $this->storeInKartItem('update', $image_path, $multi_cur[$kart_item_curr], $curr_post); } $message = $item_id; $query = "SELECT * FROM #__kart_base_currency WHERE item_id = " . (int) $item_id; $db->setQuery($query); $res = $db->loadAssocList(); //if there is a entry in kart_base_currency table if ($res) { foreach ($multi_cur as $cur_name => $cur_value) { $db = JFactory::getDBO(); $flag = 0; foreach ($res as $k => $v) { if ($cur_name == $v['currency']) { $flag = 1; // take currency value frm post and match whith Db currency break; } } if ($flag == 1) { $dis_curr = !empty($multi_dis_cur[$cur_name]) ? (double) $multi_dis_cur[$cur_name] : 'NULL'; //if (isset( $curr_post['multi_dis_cur'][$cur_name]) && $curr_post['multi_dis_cur'][$cur_name] != '' ){ $dis_curr = " , discount_price=" . $dis_curr; //} $query = "UPDATE #__kart_base_currency SET price=" . (double) $cur_value . " " . $dis_curr . " WHERE `item_id`=" . (int) $item_id . " AND `currency`='" . $cur_name . "'"; $db->setQuery($query); $update = $db->execute(); /*if ($update) print"UPDATE"; else print"NOT UPDATE";*/ } else { $items = new stdClass(); $items->item_id = $item_id; $items->currency = $cur_name; // eg INR,usd $items->price = $cur_value; //if (isset( $curr_post['multi_dis_cur'][$cur_name]) && $curr_post['multi_dis_cur'][$cur_name] != '' ){ $items->discount_price = !empty($multi_dis_cur[$cur_name]) ? (double) $multi_dis_cur[$cur_name] : 'NULL'; //} if (!$db->insertObject('#__kart_base_currency', $items)) { $messagetype = 'notice'; $message = JText::_('QTC_PARAMS_SAVE_FAIL') . " - " . $db->stderr(); } } } } else { //insert query foreach ($multi_cur as $cur_name => $cur_value) { $items = new stdClass(); $items->item_id = $item_id; $items->currency = $cur_name; // eg INR,usd $items->price = $cur_value; // currencey value if (isset($multi_dis_cur[$cur_name]) && $multi_dis_cur[$cur_name] != '') { $items->discount_price = $multi_dis_cur[$cur_name]; } if (!$db->insertObject('#__kart_base_currency', $items)) { $messagetype = 'notice'; $message = JText::_('QTC_PARAMS_SAVE_FAIL') . " - " . $db->stderr(); } } } return $message; }
<table class="table table-striped "> <tbody > <tr> <th class="" width="20%" align="left"><?php echo JText::_('COM_QUICK2CART_PROD_NAME'); ?> </th> <th class="" width="" align="left"><?php echo JText::_('COM_QUICK2CART_CKOUT_SHIP_METHODS'); ?> </th> </tr> <?php //load Attributes model $attri_model = $comquick2cartHelper->loadqtcClass($path = JPATH_SITE . '/components/com_quick2cart/models/attributes.php', "quick2cartModelAttributes"); foreach ($itemWiseShipDetail as $item) { $itemDetail = $item['itemDetail']; $item_id = $itemDetail['item_id']; $shippingMeths = $item['shippingMeths']; // Some product doesn't want shipping if (!empty($shippingMeths)) { ?> <tr> <td width="40%"> <div class=""> <?php // GET ITEM DETAIL // converting to array $data = (array) ($itemDetail = $attri_model->getItemDetail(0, '', $item_id)); $product_link = $comquick2cartHelper->getProductLink($data['item_id'], 'detailsLink');
/** * This functio upload product media file called via ajax * */ function mediaUpload() { $comquick2cartHelper = new comquick2cartHelper(); $path = JPATH_SITE . DS . "components" . DS . "com_quick2cart" . DS . "helpers" . DS . "media.php"; $mediaHelper = $comquick2cartHelper->loadqtcClass($path, 'qtc_mediaHelper'); $mediaHelper->uploadProdFiles(); }