3v4l.org

run code in 300+ PHP versions simultaneously
<?php /** * * @author fethi.kus@tribal-im.nl * @since 5-aug-2013 14:38:52 * * @name AdwordsApiAds * UTF-8 * * */ class AdwordsApiAds { private $campaigns = array(); private $default_max_cpc; private $operationresultperpage; private $logbook; private $operationoptions; private $operations = array("local" => array(), "remote" => array()); private $idata = array(); private $service; // instanceof AdGroupCriterionService; private $localids = array(); public function __construct(array $input) { foreach ($input as $k => $v) { $this->{$k} = $v; } } private function getRemoteIds() { $remoteIds = array(); $selector = new Selector(); $selector->predicates[] = new Predicate('CampaignId', 'IN', $this->campaigns); //if there are adGroupIds sent, then filter to it. //if(count($adGroupIds) > 0){ //$selector->predicates[] = new Predicate('AdGroupId', 'IN', $adGroupIds); //} $selector->fields = array('Headline', 'Id', 'CreativeFinalUrls'); //$selector->ordering[] = new OrderBy('Headline', 'ASCENDING'); // By default disabled ads aren't returned by the selector. $selector->predicates[] = new Predicate('Status', 'IN', array('ENABLED', 'PAUSED')); //, 'DISABLED' //3c use paging to handle big huge quantities $selector->paging = new Paging(0, $this->operationresultperpage); $pages = array(); // AD-267 replace destination url by final url(s) $urlsToBeUpgraded = array(); //3d get data $c = 0; do { $page = $this->service->get($selector); if (count($page->entries) == 0) { break; } $c += count($page->entries); $this->logbook->addMessage("{$c}/{$page->totalNumEntries} remote ads fetched"); foreach ($page->entries as $remoteAd) { $i = "|" . $remoteAd->adGroupId . "|" . $remoteAd->ad->headline . "|" . $remoteAd->ad->description1 . "|" . $remoteAd->ad->description2 . "|" . $remoteAd->ad->displayUrl; //Note, duplicate ad texts (even the url is different) experienced as false by the user. //. "|" . $AdGroupAdPage->ad->url; //Ad texts will use always unique ID, //for instance when the user changes an AD in adwords interface, //then there will be an unique ID. Even when there are exect same ad teksts. $id = $remoteAd->ad->id . $i; $ad = array(); $ad["campaign_id"] = $this->campaigns[0]; $ad['ad_group_id'] = $remoteAd->adGroupId; $ad['ad_group'] = null; //will be sent from local $ad['headline'] = $remoteAd->ad->headline; $ad['description1'] = $remoteAd->ad->description1; $ad['description2'] = $remoteAd->ad->description2; $ad['display_url'] = $remoteAd->ad->displayUrl; $ad['destination_url'] = $remoteAd->ad->url; $ad["newstatus"] = null; //will be sent from local $ad["remotestatus"] = $remoteAd->status; $ad["manual"] = null; $ad["operator"] = "SET"; $ad['ad_id'] = $remoteAd->ad->id; // AD-267 upgrade destination url to final url if exists if (!empty($ad['destination_url'])) { // Proceed with URL upgrade. $upgradeUrl = new AdUrlUpgrade(); $upgradeUrl->adId = $remoteAd->ad->id; $upgradeUrl->finalUrl = $remoteAd->ad->url; $urlsToBeUpgraded[] = $upgradeUrl; } else { // assume final url is there already $ad['destination_url'] = implode('|', $remoteAd->ad->finalUrls); } if ((count($urlsToBeUpgraded) % \AdWordsConstants::RECOMMENDED_PAGE_SIZE) == 0) { $this->upgradeUrls($urlsToBeUpgraded); $urlsToBeUpgraded = []; } //4. build an array with remote data. $remoteIds[$remoteAd->ad->id] = $ad; } // Advance the paging index. $selector->paging->startIndex += $this->operationresultperpage; } while ($page->totalNumEntries > $selector->paging->startIndex); if (count($urlsToBeUpgraded) > 0) { $this->logbook->addMessage(count($urlsToBeUpgraded) . ' destination urls to be upgraded to final urls'); $this->upgradeUrls($urlsToBeUpgraded); } $this->logbook->addMessage(count($remoteIds) . " Fetched remote ADs"); return $remoteIds; } /** * Fix when the following is happening: * * [RateExceededError * rateKey=all_request, * rateScope=ACCOUNT, * retryAfterSeconds=30>] * * @param array $upgrades */ protected function upgradeUrls(array $upgrades) { if (count($upgrades) < 1) { return; } $this->logbook->addMessage(count($upgrades) . ' destination urls to be upgraded to final urls'); try { $this->service->upgradeUrl($upgrades); } catch (\SoapFault $e) { if (strpos($e->getMessage(), 'RateExceededError') !== false) { $this->logbook->addMessage('rate exceeded... sleeping for 30 seconds'); sleep(30); $this->service->upgradeUrl($upgrades); } } } private function buildUpdates() { $items = $this->getitems(); $remoteIds = $this->getRemoteIds(); $remoteupdate = array(); $skipremote = array(); $skiplocal = array(); foreach ($remoteIds as $rid => $v) { //do not override local via remote $i = "|" . $v['ad_group_id'] . "|" . $v['headline'] . '|' . $v['description1'] . '|' . $v['description2'] . '|' . $v['display_url'] . '|' . $v['destination_url']; //; $id = $v['ad_id'] . $i; //with id and without id not found in local db, not belongs to deleted adgroup (the status were set to null) then manual. // @TODO 201406 //if (isset($macro_ads[$i]) && ($macro_ads[$i]['adgroupremote'] === "DELETED" || $macro_ads[$i]['adgroupremote'] === "REMOVED")) { // continue; //} //skip deleted adgroups, that already recorded in database. if($this->operationoptions['skipdeleted']['adgroup'] && isset($this->operationoptions['skipdeleted']['adgroupdata'][$v['ad_group_id']]) //&& $v['remotestatus'] === "DISABLED" ){ continue; } //initial import collects data for local if (empty($this->localids)) { $this->operations["local"][$rid] = $v; } //the remote item with id and without id not found in local db, //then update local db and skip remote (import the none existing to local). if (!isset($items[$id]) && !isset($items[$i])) { //TODO jira 631 issue, Deviation on firsttime sync must be an option. //$v["manual"] = 1; #$operations["local"][$rid] = $v; //initial import collects data for local //if($countitems === 0){ // $operations["local"][$rid] = $v; //} //local ID match, the status different. if (isset($this->localids[$rid]) && ($this->localids[$rid]["remotestatus"] !== $v["remotestatus"]) ) { $v["manual"] = 1; } //skipdeleted if ($this->operationoptions["skipdeleted"]["adgroup"]) { // @TODO 201406 if (($v["remotestatus"] !== "DELETED" || $v["remotestatus"] !== "REMOVED") && !isset($this->operationoptions["skipdeleted"]["adgroupdata"][$v['ad_group_id']])) { $this->operations["local"][$rid] = $v; } } else { //for instance: when an ad changed, then it will create new id, that must be imported. $this->operations["local"][$rid] = $v; } //skip all unkown. //Notice, when local data skips deleted, all [remotestatus] => DISABLED are skipped too. $skipremote[$rid] = $v; continue; } //full id is known, update local db if (isset($items[$id])) { $v["manual"] = $items[$id]["manual"]; $v["newstatus"] = $items[$id]["newstatus"]; //remotestatus is not equal to local remotestatus = remote change detected (manual). //Notice, detecting ad text change is not needed. every change will have new id. //var_dump($items[$id]); if ($items[$id]["remotestatus"] != "" && $v["remotestatus"] != $items[$id]["remotestatus"]) { $v["manual"] = 1; $this->operations["local"][$id] = $v; $skipremote[$rid] = $v; continue; } //no need to update if the id is known and status is equal //An AD will have unique ID. if ($v["remotestatus"] == $items[$id]["newstatus"]) { $skipremote[$rid] = $v; continue; } //if still not skipped, then add to local as it is $this->operations["local"][$id] = $v; } /**/ //full id is unknown, update local db without id (import remote data) if (isset($items[$i])) { //Before skipping remote items update local with remote data that did not existed in local //manual should always depend on id $v["manual"] = $items[$i]["manual"]; $v["newstatus"] = $items[$i]["newstatus"]; //!important in Ad text, do not add matching ads. $skipremote[$i] = $v; //the remote is not yet in local insert array, then add based on $i into local. if(!isset($this->operations["local"][$v["ad_id"]])) { $this->operations["local"][$i] = $v; } //local data is not aware of remote, // remote has the adgroup already with the same name as the local wants to add. //prevents DUPLICATE if (!isset($skipremote[$rid]) && $items[$i]["operator"] == "ADD" && $items[$i]["ad_id"] == "" && $items[$i]["remotestatus"] == "" ) { //already in local update. if (!isset($this->operations["local"][$i])) { $skipremote[$rid] = $v; $this->operations["local"][$rid] = $v; } continue; } } else { //with id and not id not match, import data into local. $this->operations["local"][$rid] = $v; } //get the change data from local if (isset($items[$i])) { $v = $items[$i]; } if (isset($items[$id])) { $v = $items[$id]; } //AdGroupAdError.CANNOT_OPERATE_ON_DELETED_ADGROUPAD // @TODO 201406 if ($v['newstatus'] === null && $v["manual"] === 1 || (isset($v['adgroupremote']) && ($v['adgroupremote'] == "DELETED" || $v['adgroupremote'] == "REMOVED"))) { $skipremote[$rid] = $v; continue; } $remoteupdate[$rid] = $v; }//remote data $this->logbook->addMessage(count($skipremote) . " Update remote skip, " . count($remoteupdate) . " Update remote ADs"); //local data, might need to skip. //$remotefound = array(); foreach ($remoteupdate as $rid => $v) { //known with id is (should) leaded to local update and not taken to remote update. if (isset($skipremote[$rid])) { continue; } //TODO skipremote those getting id from remote //if(isset($v['ad_group_id']) && isset($v["keyword"]) && isset($v['match_type'])){ // $remotefound["|" . $v['ad_group_id'] . "|" . $v["keyword"] . "|" . strtoupper($v['match_type'])] = $v; //} $this->operations["remote"][$rid] = $v; } //print_r($ops); //print_r($operations["local"]); //add remaining items. foreach ($items as $i => $v) { //FIXME check intial must be checked together with local update data. E.g. if ($initialexport === true && $v["ad_group_id"] === NULL && isset($operations["local"][$i])) //if ($initialexport === true && $v["ad_id"] === NULL) { // continue; //} //skip, if there is already an id, it would be double. if (isset($this->operations["remote"][$v["ad_id"] . $i])) { continue; } //if (isset($remotefound[$i])) { // continue; //} //when an existing ad is changed might have id and must be paused. if (isset($skipremote[$v['ad_id']])) { continue; } if (isset($this->operations["remote"][$v['ad_id']])) { continue; } if (isset($skipremote[$i])) { continue; } $this->operations["remote"][$i] = $v; } //print_r($ops); $this->logbook->addMessage(count($skiplocal) . " Skip local ADs, " . count($this->operations["local"]) . " Update local ADs"); $this->logbook->addMessage(count($this->operations["remote"]) . " AD operations"); //print_r($ops); return $this->operations; } private function getitems() { $items = array(); $removed = 0; foreach ($this->idata as $k => $v) { // @TODO 201406 if ($v["ad_group_id"] === "0" || ($v["adgroupremote"] === "DELETED" || $v["adgroupremote"] === "REMOVED")) { $removed++; continue; } else { unset($v["ad_group"], $v["adgroupremote"]); $items[$k] = $v; #$adGroupIds[] = $v["ad_group_id"]; if (isset($v["ad_id"]) && $v["ad_id"] != "") { $this->localids[$v["ad_id"]] = $v; } } } $this->logbook->addMessage(count($this->operationoptions['skipdeleted']["adgroupdata"])." local DELETED ADGROUP items, ". count($items) . " local AD items after " . $removed . " DELETED or ad_group_id=0 AdGroups were removed of the input qty " . count($this->idata) . ""); return $items; } private function buildOperations(array $ops, $default_max_cpc) { $operations = array(); $operations["local"] = isset($ops["local"]) ? $ops["local"] : array(); if (isset($ops["remote"]) && count($ops["remote"]) > 0) foreach ($ops["remote"] as $macro_ad) { if ($macro_ad['operator'] == 'REMOVE') { $Ad = new Ad(); $Ad->id = $macro_ad['ad_id']; $adGroupAd = new AdGroupAd(); $adGroupAd->adGroupId = $macro_ad['ad_group_id']; $adGroupAd->status = $macro_ad['newstatus']; $adGroupAd->ad = $Ad; $operation = new AdGroupAdOperation(); $operation->operator = 'REMOVE'; $operation->operand = $adGroupAd; } else { /** * @desc Build Ad operation for google adwords. * 1. TextAd object * 2. AdGroupAd object * 3. AdGroupAdOperation object */ $textAd = new TextAd(); $textAd->id = null; $macro_ad['operator'] = "ADD"; if ($macro_ad['ad_id'] != "" && $macro_ad['ad_id'] != "0") { $macro_ad['operator'] = "SET"; $textAd->id = $macro_ad['ad_id']; } $textAd->headline = $macro_ad['headline']; $textAd->description1 = $macro_ad['description1']; $textAd->description2 = $macro_ad['description2']; $textAd->displayUrl = $macro_ad['display_url']; // AD 267 --> replace destination_url by final url(s) $textAd->finalUrls = explode('|', $macro_ad['destination_url']); $adGroupAd = new AdGroupAd(); $adGroupAd->adGroupId = $macro_ad['ad_group_id']; //$adGroupAd->status = "ENABLED"; if (isset($macro_ad['remotestatus']) && $macro_ad['remotestatus'] != "" && $macro_ad['remotestatus'] != "0") { $adGroupAd->status = $macro_ad['remotestatus']; } if (isset($macro_ad['newstatus']) && $macro_ad['newstatus'] != "" && $macro_ad['newstatus'] != "0") { $adGroupAd->status = $macro_ad['newstatus']; } $adGroupAd->ad = $textAd; $operation = new AdGroupAdOperation(); $operation->operator = $macro_ad['operator']; $operation->operand = $adGroupAd; if (isset($macro_ad['violatingtext']) && $macro_ad['violatingtext'] != "" && ($macro_ad['ad_id'] === null || $macro_ad['ad_id'] == "" || $macro_ad['ad_id'] == "0") ) { $exkeytxt = explode("|", $macro_ad['violatingtext']); $exkey = new PolicyViolationKey(); $exkey->policyName = (isset($exkeytxt[0]) && $exkeytxt[0] != "") ? $exkeytxt[0] : "pharma"; $exkey->violatingText = (isset($exkeytxt[1]) && $exkeytxt[1] != "") ? $exkeytxt[1] : null; $operation->exemptionRequests[] = new ExemptionRequest($exkey); } } $operations["remote"][] = $operation; } return $operations; } public function output() { return $this->buildOperations($this->buildUpdates(), $this->default_max_cpc); } }

Here you find the average performance (time & memory) of each version. A grayed out version indicates it didn't complete successfully (based on exit-code).

VersionSystem time (s)User time (s)Memory (MiB)
8.3.80.0000.01017.97
8.3.70.0130.00318.18
8.3.60.0120.00318.56
8.3.50.0130.00721.21
8.3.40.0120.00318.89
8.3.30.0080.00819.17
8.3.20.0000.00720.46
8.3.10.0040.00421.91
8.3.00.0090.00317.78
8.2.200.0060.00316.75
8.2.190.0060.00918.41
8.2.180.0110.01116.63
8.2.170.0090.00618.79
8.2.160.0070.00722.96
8.2.150.0030.00525.66
8.2.140.0050.00324.66
8.2.130.0080.00026.16
8.2.120.0000.00819.64
8.2.110.0050.00521.11
8.2.100.0080.00417.72
8.2.90.0040.00419.05
8.2.80.0080.00017.97
8.2.70.0030.00517.50
8.2.60.0040.00417.93
8.2.50.0030.00518.10
8.2.40.0000.00819.68
8.2.30.0040.00418.19
8.2.20.0040.00417.70
8.2.10.0060.00318.12
8.2.00.0030.00518.00
8.1.290.0070.00718.88
8.1.280.0060.01025.92
8.1.270.0030.00622.11
8.1.260.0000.00826.35
8.1.250.0000.00828.09
8.1.240.0030.00719.01
8.1.230.0090.00318.08
8.1.220.0030.00617.78
8.1.210.0000.00818.77
8.1.200.0030.00717.47
8.1.190.0060.00317.35
8.1.180.0080.00018.10
8.1.170.0080.00018.75
8.1.160.0030.00622.09
8.1.150.0000.00819.04
8.1.140.0030.00617.59
8.1.130.0000.00818.00
8.1.120.0000.00817.58
8.1.110.0000.00817.43
8.1.100.0080.00017.44
8.1.90.0070.00017.44
8.1.80.0000.00817.43
8.1.70.0040.00417.52
8.1.60.0000.00917.69
8.1.50.0040.00417.61
8.1.40.0040.00417.62
8.1.30.0030.00617.73
8.1.20.0000.00917.61
8.1.10.0040.00417.64
8.1.00.0040.00417.51
8.0.300.0050.00318.77
8.0.290.0000.00816.88
8.0.280.0040.00418.52
8.0.270.0000.00717.20
8.0.260.0040.00417.37
8.0.250.0020.00517.04
8.0.240.0050.00316.99
8.0.230.0040.00417.00
8.0.220.0070.00016.98
8.0.210.0030.00616.99
8.0.200.0040.00416.89
8.0.190.0000.00817.03
8.0.180.0030.00617.02
8.0.170.0000.00817.05
8.0.160.0050.00316.90
8.0.150.0000.00716.88
8.0.140.0050.00216.83
8.0.130.0060.00013.44
8.0.120.0030.00616.89
8.0.110.0000.00816.94
8.0.100.0040.00416.89
8.0.90.0050.00316.96
8.0.80.0060.01016.97
8.0.70.0060.00316.77
8.0.60.0080.00017.00
8.0.50.0050.00316.98
8.0.30.0110.00717.26
8.0.20.0070.01417.40
8.0.10.0050.00316.99
8.0.00.0100.01116.80
7.4.330.0050.00015.03
7.4.320.0080.00016.61
7.4.300.0060.00316.68
7.4.290.0050.00316.61
7.4.280.0050.00516.58
7.4.270.0050.00316.71
7.4.260.0000.00916.51
7.4.250.0000.00816.55
7.4.240.0040.00416.59
7.4.230.0000.00716.57
7.4.220.0100.01616.74
7.4.210.0070.01116.53
7.4.200.0040.00416.74
7.4.160.0100.00716.53
7.4.150.0100.01417.40
7.4.140.0120.01117.86
7.4.130.0090.01016.54
7.4.120.0080.01016.68
7.4.110.0070.01116.66
7.4.100.0030.02116.53
7.4.90.0100.00716.50
7.4.80.0050.01119.39
7.4.70.0130.01316.70
7.4.60.0090.00916.65
7.4.50.0050.00516.55
7.4.40.0050.01416.68
7.4.30.0180.00616.66
7.4.10.0040.01515.05
7.4.00.0080.00914.98
7.3.330.0000.00513.37
7.3.320.0000.00513.14
7.3.310.0000.00716.24
7.3.300.0000.00816.36
7.3.290.0050.01216.34
7.3.280.0070.01116.32
7.3.270.0090.00917.40
7.3.260.0070.01016.43
7.3.240.0190.00316.26
7.3.230.0180.00316.39
7.3.210.0130.00316.32
7.3.200.0030.01419.39
7.3.190.0070.01016.57
7.3.180.0100.00716.41
7.3.170.0030.02016.48
7.3.160.0150.00616.46
7.3.130.0100.01014.82
7.3.120.0070.01114.69
7.3.110.0100.01014.86
7.3.100.0030.01214.74
7.3.90.0080.00614.52
7.3.80.0000.01214.77
7.3.70.0000.01414.96
7.3.60.0060.00614.94
7.3.50.0070.00714.64
7.3.40.0030.00714.52
7.3.30.0000.01414.95
7.3.20.0070.00416.53
7.3.10.0070.00916.36
7.3.00.0060.00716.32
7.2.330.0120.00616.70
7.2.320.0090.00916.24
7.2.310.0030.01516.75
7.2.300.0130.00616.49
7.2.290.0100.01316.49
7.2.260.0100.00714.98
7.2.250.0070.01015.14
7.2.240.0090.00615.01
7.2.230.0110.00614.84
7.2.220.0000.01514.75
7.2.210.0060.00914.89
7.2.200.0070.01115.06
7.2.190.0090.00614.91
7.2.180.0060.00914.72
7.2.170.0100.00615.23
7.2.160.0070.00315.10
7.2.150.0070.00716.83
7.2.140.0060.00916.70
7.2.130.0070.00716.41
7.2.120.0070.00716.60
7.2.110.0070.00716.48
7.2.100.0120.00516.50
7.2.90.0090.00716.53
7.2.80.0090.01016.55
7.2.70.0060.01216.57
7.2.60.0060.00916.62
7.2.50.0110.00516.52
7.2.40.0100.00716.70
7.2.30.0120.00516.40
7.2.20.0080.00616.67
7.2.10.0080.00916.48
7.2.00.0040.00917.23
7.1.330.0000.01715.73
7.1.320.0030.01415.75
7.1.310.0000.01515.53
7.1.300.0090.00615.66
7.1.290.0080.00515.67
7.1.280.0040.01115.77
7.1.270.0100.00015.64
7.1.260.0090.00615.63
7.1.250.0050.00815.32
7.1.240.0110.00315.69
7.1.230.0070.00715.49
7.1.220.0100.00615.61
7.1.210.0090.00015.76
7.1.200.0060.00715.47
7.1.190.0070.00715.63
7.1.180.0040.00415.37
7.1.170.0040.01215.63
7.1.160.0050.00515.50
7.1.150.0090.00315.81
7.1.140.0040.00815.71
7.1.130.0030.01015.50
7.1.120.0080.00615.46
7.1.110.0030.00715.79
7.1.100.0090.00516.85
7.1.90.0090.00315.47
7.1.80.0060.00315.75
7.1.70.0030.00816.16
7.1.60.0050.01117.59
7.1.50.0110.00916.07
7.1.40.0000.01115.24
7.1.30.0040.00415.55
7.1.20.0060.00615.63
7.1.10.0110.00415.71
7.1.00.0090.04218.87
7.0.330.0060.00314.85
7.0.320.0000.01414.99
7.0.310.0060.00615.15
7.0.300.0000.01615.23
7.0.290.0060.00615.08
7.0.280.0030.00715.45
7.0.270.0040.00815.07
7.0.260.0080.00615.22
7.0.250.0080.00315.01
7.0.240.0070.00715.19
7.0.230.0080.00415.43
7.0.220.0070.01015.48
7.0.210.0050.00515.29
7.0.200.0040.00515.89
7.0.190.0040.00414.97
7.0.180.0090.00615.23
7.0.170.0080.00815.26
7.0.160.0070.00715.01
7.0.150.0070.00715.27
7.0.140.0030.01015.49
7.0.130.0000.01715.41
7.0.120.0100.00315.39
7.0.110.0140.00015.22
7.0.100.0100.04017.55
7.0.90.0070.04817.66
7.0.80.0080.04317.56
7.0.70.0120.04017.75
7.0.60.0050.02717.75
7.0.50.0170.04317.81
7.0.40.0020.04916.63
7.0.30.0050.03016.63
7.0.20.0070.04016.75
7.0.10.0030.04516.81
7.0.00.0080.02516.76
5.6.400.0030.01014.37
5.6.390.0000.01114.32
5.6.380.0060.00914.13
5.6.370.0100.00014.56
5.6.360.0000.01714.24
5.6.350.0090.00313.92
5.6.340.0030.01014.15
5.6.330.0040.01014.49
5.6.320.0040.00814.03
5.6.310.0100.00313.98
5.6.300.0130.00014.50
5.6.290.0060.00914.06
5.6.280.0080.03717.75
5.6.270.0140.00014.33
5.6.260.0100.00714.29
5.6.250.0130.02517.48
5.6.240.0000.05117.53
5.6.230.0110.02317.43
5.6.220.0020.04917.46
5.6.210.0020.02717.41
5.6.200.0070.04517.70
5.6.190.0080.02317.76
5.6.180.0080.04317.64
5.6.170.0080.03717.67
5.6.160.0050.04217.56
5.6.150.0110.03917.63
5.6.140.0030.03517.57
5.6.130.0110.04117.80
5.6.120.0080.04617.61
5.6.110.0050.04317.62
5.6.100.0040.03417.62
5.6.90.0080.03717.53
5.6.80.0080.04017.34
5.6.70.0050.04517.24
5.6.60.0070.04517.25
5.6.50.0010.04617.38
5.6.40.0030.04217.24
5.6.30.0070.02517.24
5.6.20.0080.04217.22
5.6.10.0130.02917.31
5.6.00.0110.04017.25
5.5.380.0100.03517.30
5.5.370.0070.04217.18
5.5.360.0070.04217.48
5.5.350.0110.02317.31
5.5.340.0070.04017.40
5.5.330.0060.04017.38
5.5.320.0110.04017.63
5.5.310.0160.03817.60
5.5.300.0060.04017.71
5.5.290.0030.04317.64
5.5.280.0050.04617.57
5.5.270.0080.04517.60
5.5.260.0050.04617.31
5.5.250.0040.04517.49
5.5.240.0080.03517.26
5.5.230.0130.03817.18
5.5.220.0050.02317.17
5.5.210.0080.02517.17
5.5.200.0060.04317.20
5.5.190.0050.03017.20
5.5.180.0080.03717.20
5.5.170.0000.00914.19
5.5.160.0060.03017.09
5.5.150.0080.03517.22
5.5.140.0030.04717.09
5.5.130.0030.03817.26
5.5.120.0120.03217.08
5.5.110.0080.03017.29
5.5.100.0040.04017.23
5.5.90.0050.03117.16
5.5.80.0070.02417.01
5.5.70.0050.02517.13
5.5.60.0070.02517.15
5.5.50.0100.03816.96
5.5.40.0120.02117.05
5.5.30.0080.03616.96
5.5.20.0100.02217.01
5.5.10.0070.02416.96
5.5.00.0030.02916.98
5.4.450.0030.04416.39
5.4.440.0040.03816.35
5.4.430.0020.04916.38
5.4.420.0090.03716.27
5.4.410.0070.02516.33
5.4.400.0040.03416.23
5.4.390.0050.03616.27
5.4.380.0050.02516.21
5.4.370.0050.04316.11
5.4.360.0070.03716.22
5.4.350.0030.03916.18
5.4.340.0080.03316.27
5.4.330.0040.00413.30
5.4.320.0030.03016.22
5.4.310.0120.03716.22
5.4.300.0120.03516.23
5.4.290.0120.03016.27
5.4.280.0100.03416.09
5.4.270.0060.03616.12
5.4.260.0000.03816.11
5.4.250.0020.02716.22
5.4.240.0080.03016.24
5.4.230.0000.04616.23
5.4.220.0090.03316.22
5.4.210.0120.03216.27
5.4.200.0050.04116.22
5.4.190.0030.04316.18
5.4.180.0070.04216.25
5.4.170.0060.03316.11
5.4.160.0050.03816.17
5.4.150.0030.02316.24
5.4.140.0050.03614.91
5.4.130.0070.03714.90
5.4.120.0080.03314.91
5.4.110.0050.03514.92
5.4.100.0070.03514.86
5.4.90.0070.03714.94
5.4.80.0110.02814.94
5.4.70.0050.03814.87
5.4.60.0050.04014.93
5.4.50.0080.03514.85
5.4.40.0060.01814.83
5.4.30.0050.02514.85
5.4.20.0030.03614.89
5.4.10.0080.03314.91
5.4.00.0080.03614.64

preferences:
30.5 ms | 401 KiB | 5 Q