TeamCity LabkeyTrunk :: Git postgres 9.4 [Build 602](https://teamcity.labkey.org/viewLog.html?buildId=271786&buildTypeId=LabkeyTrunk_GitPostgres) outcome was **FAILURE**
Summary: Tests failed: 30, passed: 9 Build time: 00:26:21
### Failed tests
```
org.labkey.test.tests.CDSVisualizationTest.verifyAntigenScatterPlot: <no details avaliable>

org.labkey.test.tests.CDSVisualizationTest.verifyBoxPlots: <no details avaliable>

org.labkey.test.tests.CDSVisualizationTest.verifySubjectCountsWithFilters: <no details avaliable>

org.labkey.test.tests.CDSVisualizationTest.verifyTimeAxisWithMultipleSchedules: <no details avaliable>

org.labkey.test.tests.CDSVisualizationTest.verifySubjectCountsWithFiltersAdvancedOptions: <no details avaliable>

org.labkey.test.tests.CDSVisualizationTest.verifyScatterPlotColorAxis: <no details avaliable>

org.labkey.test.tests.CDSVisualizationTest.verifyAntigenBoxPlot: <no details avaliable>

org.labkey.test.tests.CDSVisualizationTest.verifyBinnedPlot: <no details avaliable>

org.labkey.test.tests.CDSVisualizationTest.verifyScatterPlot: <no details avaliable>

org.labkey.test.tests.CDSVisualizationTest.verifyGutterPlotBasic: <no details avaliable>

org.labkey.test.tests.CDSVisualizationTest.verifyTimeAxisBasic: <no details avaliable>

##### there are 20 more failed tests, see build details
```


@testcode77 오류를 발견해서 수정합니다. [3febc0f](https://github.com/envicase/ReactiveMvvm/commit/3febc0f8165c7f3c203655afe92bfc63c50eb06f)


You do


102941444_CorrectBSDFs (rpg777) - x86_64-Linux-Ubuntu-14.04-cppcheck-1.61: OK (0 of 0 tests passed)

![Build Badge](http://img.shields.io/badge/build%20status-warnings-yellow.svg)


works like a charm, great!
check also new colorized output, used colors are open for discussion :)


このコミットは57d3eadに戻してPushする前のコミットになるためブランチには反映されていないコミットである
最新からの順として下記になる

commit b0b0ae2c2490f0f7d9a7795670e58da7072c0ecd
Author: 五十嵐翔 <igara1119@gmail.com>
Date:   Sun Sep 13 16:51:31 2015 +0900

    #1 Studyの削除

commit 57d3ead65fe123781c5ee44f57ba5d30a0f1f03e
Author: 五十嵐翔 <igara1119@gmail.com>
Date:   Sun Sep 13 16:30:04 2015 +0900

    #1 前回のファイル名を編集

    ファイルの内容としてデータ型と条件分岐の学習を行ったもの

commit 334f1e9d4dbf010a68df959e711b915876a1a5aa
Author: 五十嵐翔 <igara1119@gmail.com>
Date:   Sun Aug 9 23:34:23 2015 +0900

    #1 StudySwiftFromPlayGround Swiftの学習

    ・変数、定数の型宣言、型推測の例題記載
    ・型パラメータ（ジェネリクス）について記載
    ・制御構文の記載

#### バージョンを戻してcommit&pushする方法
git reset --hard ハッジュタグ
（今回の対応では57d3ead65fe123781c5ee44f57ba5d30a0f1f03eのファイル名編集のバージョンに戻る）
### Study.playgroundのdelete&commit
git rm Study.playgroundがあったパス -r
git commit -m "#1 Studyの削除"
git push
なぜかこれでpushしたらissueにプッシュのコメントが反映されなかった。


What did you change here?


企鹅企鹅去


Its not even KitKat, its CyanogenMod 10.2 Jelly Bean. Most of it will probably have to be recoded entirely.


New introduced by VS2015 maybe?
I have no other option in the combobox, its the only one available (Platform 8.1)
You can found it at http://i.imgur.com/62lzXfv.png


测试1


I tryed to fix some comiler warning i probably forget to reset this.


测试2


Yea I recognized the CM commits but didn't realize it was that far back. The code fits up to lollipop.  From what i saw on the surface It doesn't look like that big of a rewrite just conflicts in batterystatsimpl related to plug state being refactored.   What you have is clean though. Nicely done, regardless.


Was hoping to expand the NC board drawing to allow for boards other than 3x3 but didn't have time tonight. I broke out the NC specific calls from the update functions and created a refresh in case the display is out of sync with the data. This also allows bulk update of the data.


We will update the pull request.


Does anyone have an idea about why the two pvpstats_* tables are placed into the world database, instead of characters DB?


What


Basically will revert this section to original and then add the new CQM stuff to it.


You're right.


This is what it looks like:

![image](https://cloud.githubusercontent.com/assets/1924134/9835913/7e19ea5e-59b6-11e5-8a20-e2cc97c81d07.png)


TeamCity LabkeyTrunk :: Git postgres 9.4 [Build 603](https://teamcity.labkey.org/viewLog.html?buildId=271789&buildTypeId=LabkeyTrunk_GitPostgres) outcome was **FAILURE**
Summary: Tests failed: 30, passed: 9 Build time: 00:22:38
### Failed tests
```
org.labkey.test.tests.CDSMeasureStoreTest.testDemoMeasureStore: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyFilterDisplays: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyGrid: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyGroups: <no details avaliable>

org.labkey.test.tests.CDSTest.testLearnAboutStudyProducts: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyFilters: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyGridColumnSelector: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyHomePage: <no details avaliable>

org.labkey.test.tests.CDSTest.clickOnLearnAboutStudyItem: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyGridCheckerboarding: <no details avaliable>

org.labkey.test.tests.CDSTest.clickOnLearnAboutStudyProductsItem: <no details avaliable>

##### there are 20 more failed tests, see build details
```


你的这个图片文件路径对么……


还有这个


运行有大量的资源404的问题


j'ai pas le réflexe "argument" avec les fonctions encore, je vais tester ça. Ce sera mieux que 3 lignes de sed.

Et je vais défoncer juste en dessous le config.php avec les mêmes arguments qui se répète 3 fois aussi.

p'tain, vous êtes pas des clients faciles quand même ^^


说了要用2空格作为缩进，全是tab


animate.css为什么不是应该写在bower的依赖里面的么？
为什么还是用这样的裸糙的方式


所有文件的缩进都不对。外部依赖应该都用bower。
请改


The Go app is the api and it contains the client as well. So I need to be able to marshal and unmarshal the payload but I still have some issues with unmarshalling a many payload. Looking forward to the latest version.


/*
 Leaflet.markercluster, Provides Beautiful Animated Marker Clustering functionality for Leaflet, a JS library for interactive maps.
 https://github.com/Leaflet/Leaflet.markercluster
 (c) 2012-2013, Dave Leaver, smartrak
*/
(function (window, document, undefined) {/*
 * L.MarkerClusterGroup extends L.FeatureGroup by clustering the markers contained within
 */

L.MarkerClusterGroup = L.FeatureGroup.extend({

	options: {
		maxClusterRadius: 80, //A cluster will cover at most this many pixels from its center
		iconCreateFunction: null,

		spiderfyOnMaxZoom: true,
		showCoverageOnHover: true,
		zoomToBoundsOnClick: true,
		singleMarkerMode: false,

		disableClusteringAtZoom: null,

		// Setting this to false prevents the removal of any clusters outside of the viewpoint, which
		// is the default behaviour for performance reasons.
		removeOutsideVisibleBounds: true,

		//Whether to animate adding markers after adding the MarkerClusterGroup to the map
		// If you are adding individual markers set to true, if adding bulk markers leave false for massive performance gains.
		animateAddingMarkers: false,

		//Increase to increase the distance away that spiderfied markers appear from the center
		spiderfyDistanceMultiplier: 1,

		// When bulk adding layers, adds markers in chunks. Means addLayers may not add all the layers in the call, others will be loaded during setTimeouts
		chunkedLoading: false,
		chunkInterval: 200, // process markers for a maximum of ~ n milliseconds (then trigger the chunkProgress callback)
		chunkDelay: 50, // at the end of each interval, give n milliseconds back to system/browser
		chunkProgress: null, // progress callback: function(processed, total, elapsed) (e.g. for a progress indicator)

		//Options to pass to the L.Polygon constructor
		polygonOptions: {}
	},

	initialize: function (options) {
		L.Util.setOptions(this, options);
		if (!this.options.iconCreateFunction) {
			this.options.iconCreateFunction = this._defaultIconCreateFunction;
		}

		this._featureGroup = L.featureGroup();
		this._featureGroup.addEventParent(this);

		this._nonPointGroup = L.featureGroup();
		this._nonPointGroup.addEventParent(this);

		this._inZoomAnimation = 0;
		this._needsClustering = [];
		this._needsRemoving = []; //Markers removed while we aren't on the map need to be kept track of
		//The bounds of the currently shown area (from _getExpandedVisibleBounds) Updated on zoom/move
		this._currentShownBounds = null;

		this._queue = [];
	},

	addLayer: function (layer) {

		if (layer instanceof L.LayerGroup) {
			var array = [];
			for (var i in layer._layers) {
				array.push(layer._layers[i]);
			}
			return this.addLayers(array);
		}

		//Don't cluster non point data
		if (!layer.getLatLng) {
			this._nonPointGroup.addLayer(layer);
			return this;
		}

		if (!this._map) {
			this._needsClustering.push(layer);
			return this;
		}

		if (this.hasLayer(layer)) {
			return this;
		}

		//If we have already clustered we'll need to add this one to a cluster

		if (this._unspiderfy) {
			this._unspiderfy();
		}

		this._addLayer(layer, this._maxZoom);

		//Work out what is visible
		var visibleLayer = layer,
			currentZoom = this._map.getZoom();
		if (layer.__parent) {
			while (visibleLayer.__parent._zoom >= currentZoom) {
				visibleLayer = visibleLayer.__parent;
			}
		}

		if (this._currentShownBounds.contains(visibleLayer.getLatLng())) {
			if (this.options.animateAddingMarkers) {
				this._animationAddLayer(layer, visibleLayer);
			} else {
				this._animationAddLayerNonAnimated(layer, visibleLayer);
			}
		}
		return this;
	},

	removeLayer: function (layer) {

		if (layer instanceof L.LayerGroup)
		{
			var array = [];
			for (var i in layer._layers) {
				array.push(layer._layers[i]);
			}
			return this.removeLayers(array);
		}

		//Non point layers
		if (!layer.getLatLng) {
			this._nonPointGroup.removeLayer(layer);
			return this;
		}

		if (!this._map) {
			if (!this._arraySplice(this._needsClustering, layer) && this.hasLayer(layer)) {
				this._needsRemoving.push(layer);
			}
			return this;
		}

		if (!layer.__parent) {
			return this;
		}

		if (this._unspiderfy) {
			this._unspiderfy();
			this._unspiderfyLayer(layer);
		}

		//Remove the marker from clusters
		this._removeLayer(layer, true);

		layer.off('move', this._childMarkerMoved, this);

		if (this._featureGroup.hasLayer(layer)) {
			this._featureGroup.removeLayer(layer);
			if (layer.setOpacity) {
				layer.setOpacity(1);
			}
		}

		return this;
	},

	//Takes an array of markers and adds them in bulk
	addLayers: function (layersArray) {
		var fg = this._featureGroup,
			npg = this._nonPointGroup,
			chunked = this.options.chunkedLoading,
			chunkInterval = this.options.chunkInterval,
			chunkProgress = this.options.chunkProgress,
			newMarkers, i, l, m;

		if (this._map) {
			var offset = 0,
				started = (new Date()).getTime();
			var process = L.bind(function () {
				var start = (new Date()).getTime();
				for (; offset < layersArray.length; offset++) {
					if (chunked && offset % 200 === 0) {
						// every couple hundred markers, instrument the time elapsed since processing started:
						var elapsed = (new Date()).getTime() - start;
						if (elapsed > chunkInterval) {
							break; // been working too hard, time to take a break :-)
						}
					}

					m = layersArray[offset];

					//Not point data, can't be clustered
					if (!m.getLatLng) {
						npg.addLayer(m);
						continue;
					}

					if (this.hasLayer(m)) {
						continue;
					}

					this._addLayer(m, this._maxZoom);

					//If we just made a cluster of size 2 then we need to remove the other marker from the map (if it is) or we never will
					if (m.__parent) {
						if (m.__parent.getChildCount() === 2) {
							var markers = m.__parent.getAllChildMarkers(),
								otherMarker = markers[0] === m ? markers[1] : markers[0];
							fg.removeLayer(otherMarker);
						}
					}
				}

				if (chunkProgress) {
					// report progress and time elapsed:
					chunkProgress(offset, layersArray.length, (new Date()).getTime() - started);
				}

				if (offset === layersArray.length) {
					//Update the icons of all those visible clusters that were affected
					this._featureGroup.eachLayer(function (c) {
						if (c instanceof L.MarkerCluster && c._iconNeedsUpdate) {
							c._updateIcon();
						}
					});

					this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);
				} else {
					setTimeout(process, this.options.chunkDelay);
				}
			}, this);

			process();
		} else {
			newMarkers = [];
			for (i = 0, l = layersArray.length; i < l; i++) {
				m = layersArray[i];

				//Not point data, can't be clustered
				if (!m.getLatLng) {
					npg.addLayer(m);
					continue;
				}

				if (this.hasLayer(m)) {
					continue;
				}

				newMarkers.push(m);
			}
			this._needsClustering = this._needsClustering.concat(newMarkers);
		}
		return this;
	},

	//Takes an array of markers and removes them in bulk
	removeLayers: function (layersArray) {
		var i, l, m,
			fg = this._featureGroup,
			npg = this._nonPointGroup;

		if (!this._map) {
			for (i = 0, l = layersArray.length; i < l; i++) {
				m = layersArray[i];
				this._arraySplice(this._needsClustering, m);
				npg.removeLayer(m);
			}
			return this;
		}

		for (i = 0, l = layersArray.length; i < l; i++) {
			m = layersArray[i];

			if (!m.__parent) {
				npg.removeLayer(m);
				continue;
			}

			this._removeLayer(m, true, true);

			if (fg.hasLayer(m)) {
				fg.removeLayer(m);
				if (m.setOpacity) {
					m.setOpacity(1);
				}
			}
		}

		//Fix up the clusters and markers on the map
		this._topClusterLevel._recursivelyAddChildrenToMap(null, this._zoom, this._currentShownBounds);

		fg.eachLayer(function (c) {
			if (c instanceof L.MarkerCluster) {
				c._updateIcon();
			}
		});

		return this;
	},

	//Removes all layers from the MarkerClusterGroup
	clearLayers: function () {
		//Need our own special implementation as the LayerGroup one doesn't work for us

		//If we aren't on the map (yet), blow away the markers we know of
		if (!this._map) {
			this._needsClustering = [];
			delete this._gridClusters;
			delete this._gridUnclustered;
		}

		if (this._noanimationUnspiderfy) {
			this._noanimationUnspiderfy();
		}

		//Remove all the visible layers
		this._featureGroup.clearLayers();
		this._nonPointGroup.clearLayers();

		this.eachLayer(function (marker) {
			marker.off('move', this._childMarkerMoved, this);
			delete marker.__parent;
		});

		if (this._map) {
			//Reset _topClusterLevel and the DistanceGrids
			this._generateInitialClusters();
		}

		return this;
	},

	//Override FeatureGroup.getBounds as it doesn't work
	getBounds: function () {
		var bounds = new L.LatLngBounds();
		if (this._topClusterLevel) {
			bounds.extend(this._topClusterLevel._bounds);
		} else {
			for (var i = this._needsClustering.length - 1; i >= 0; i--) {
				bounds.extend(this._needsClustering[i].getLatLng());
			}
		}

		bounds.extend(this._nonPointGroup.getBounds());

		return bounds;
	},

	//Overrides LayerGroup.eachLayer
	eachLayer: function (method, context) {
		var markers = this._needsClustering.slice(),
			i;

		if (this._topClusterLevel) {
			this._topClusterLevel.getAllChildMarkers(markers);
		}

		for (i = markers.length - 1; i >= 0; i--) {
			method.call(context, markers[i]);
		}

		this._nonPointGroup.eachLayer(method, context);
	},

	//Overrides LayerGroup.getLayers
	getLayers: function () {
		var layers = [];
		this.eachLayer(function (l) {
			layers.push(l);
		});
		return layers;
	},

	//Overrides LayerGroup.getLayer, WARNING: Really bad performance
	getLayer: function (id) {
		var result = null;

		this.eachLayer(function (l) {
			if (L.stamp(l) === id) {
				result = l;
			}
		});

		return result;
	},

	//Returns true if the given layer is in this MarkerClusterGroup
	hasLayer: function (layer) {
		if (!layer) {
			return false;
		}

		var i, anArray = this._needsClustering;

		for (i = anArray.length - 1; i >= 0; i--) {
			if (anArray[i] === layer) {
				return true;
			}
		}

		anArray = this._needsRemoving;
		for (i = anArray.length - 1; i >= 0; i--) {
			if (anArray[i] === layer) {
				return false;
			}
		}

		return !!(layer.__parent && layer.__parent._group === this) || this._nonPointGroup.hasLayer(layer);
	},

	//Zoom down to show the given layer (spiderfying if necessary) then calls the callback
	zoomToShowLayer: function (layer, callback) {

		var showMarker = function () {
			if ((layer._icon || layer.__parent._icon) && !this._inZoomAnimation) {
				this._map.off('moveend', showMarker, this);
				this.off('animationend', showMarker, this);

				if (layer._icon) {
					callback();
				} else if (layer.__parent._icon) {
					var afterSpiderfy = function () {
						this.off('spiderfied', afterSpiderfy, this);
						callback();
					};

					this.on('spiderfied', afterSpiderfy, this);
					layer.__parent.spiderfy();
				}
			}
		};

		if (layer._icon && this._map.getBounds().contains(layer.getLatLng())) {
			callback();
		} else if (layer.__parent._zoom < this._map.getZoom()) {
			//Layer should be visible now but isn't on screen, just pan over to it
			this._map.on('moveend', showMarker, this);
			this._map.panTo(layer.getLatLng());
		} else {
			this._map.on('moveend', showMarker, this);
			this.on('animationend', showMarker, this);
			this._map.setView(layer.getLatLng(), layer.__parent._zoom + 1);
			layer.__parent.zoomToBounds();
		}
	},

	//Overrides FeatureGroup.onAdd
	onAdd: function (map) {
		this._map = map;
		var i, l, layer;

		if (!isFinite(this._map.getMaxZoom())) {
			throw "Map has no maxZoom specified";
		}

		this._featureGroup.addTo(map);
		this._nonPointGroup.addTo(map);

		if (!this._gridClusters) {
			this._generateInitialClusters();
		}

		for (i = 0, l = this._needsRemoving.length; i < l; i++) {
			layer = this._needsRemoving[i];
			this._removeLayer(layer, true);
		}
		this._needsRemoving = [];

		//Remember the current zoom level and bounds
		this._zoom = this._map.getZoom();
		this._currentShownBounds = this._getExpandedVisibleBounds();

		this._map.on('zoomend', this._zoomEnd, this);
		this._map.on('moveend', this._moveEnd, this);

		if (this._spiderfierOnAdd) { //TODO FIXME: Not sure how to have spiderfier add something on here nicely
			this._spiderfierOnAdd();
		}

		this._bindEvents();

		//Actually add our markers to the map:
		l = this._needsClustering;
		this._needsClustering = [];
		this.addLayers(l);
	},

	//Overrides FeatureGroup.onRemove
	onRemove: function (map) {
		map.off('zoomend', this._zoomEnd, this);
		map.off('moveend', this._moveEnd, this);

		this._unbindEvents();

		//In case we are in a cluster animation
		this._map._mapPane.className = this._map._mapPane.className.replace(' leaflet-cluster-anim', '');

		if (this._spiderfierOnRemove) { //TODO FIXME: Not sure how to have spiderfier add something on here nicely
			this._spiderfierOnRemove();
		}

		//Clean up all the layers we added to the map
		this._hideCoverage();
		this._featureGroup.remove();
		this._nonPointGroup.remove();

		this._featureGroup.clearLayers();

		this._map = null;
	},

	getVisibleParent: function (marker) {
		var vMarker = marker;
		while (vMarker && !vMarker._icon) {
			vMarker = vMarker.__parent;
		}
		return vMarker || null;
	},

	//Remove the given object from the given array
	_arraySplice: function (anArray, obj) {
		for (var i = anArray.length - 1; i >= 0; i--) {
			if (anArray[i] === obj) {
				anArray.splice(i, 1);
				return true;
			}
		}
	},

	_childMarkerMoved: function (e) {
		if (!this._ignoreMove) {
			e.target._latlng = e.oldLatLng;
			this.removeLayer(e.target);

			e.target._latlng = e.latlng;
			this.addLayer(e.target);
		}
		return;
	},

	//Internal function for removing a marker from everything.
	//dontUpdateMap: set to true if you will handle updating the map manually (for bulk functions)
	_removeLayer: function (marker, removeFromDistanceGrid, dontUpdateMap) {
		var gridClusters = this._gridClusters,
			gridUnclustered = this._gridUnclustered,
			fg = this._featureGroup,
			map = this._map;

		//Remove the marker from distance clusters it might be in
		if (removeFromDistanceGrid) {
			for (var z = this._maxZoom; z >= 0; z--) {
				if (!gridUnclustered[z].removeObject(marker, map.project(marker.getLatLng(), z))) {
					break;
				}
			}
		}

		//Work our way up the clusters removing them as we go if required
		var cluster = marker.__parent,
			markers = cluster._markers,
			otherMarker;

		//Remove the marker from the immediate parents marker list
		this._arraySplice(markers, marker);

		while (cluster) {
			cluster._childCount--;

			if (cluster._zoom < 0) {
				//Top level, do nothing
				break;
			} else if (removeFromDistanceGrid && cluster._childCount <= 1) { //Cluster no longer required
				//We need to push the other marker up to the parent
				otherMarker = cluster._markers[0] === marker ? cluster._markers[1] : cluster._markers[0];

				//Update distance grid
				gridClusters[cluster._zoom].removeObject(cluster, map.project(cluster._cLatLng, cluster._zoom));
				gridUnclustered[cluster._zoom].addObject(otherMarker, map.project(otherMarker.getLatLng(), cluster._zoom));

				//Move otherMarker up to parent
				this._arraySplice(cluster.__parent._childClusters, cluster);
				cluster.__parent._markers.push(otherMarker);
				otherMarker.__parent = cluster.__parent;

				if (cluster._icon) {
					//Cluster is currently on the map, need to put the marker on the map instead
					fg.removeLayer(cluster);
					if (!dontUpdateMap) {
						fg.addLayer(otherMarker);
					}
				}
			} else {
				cluster._recalculateBounds();
				if (!dontUpdateMap || !cluster._icon) {
					cluster._updateIcon();
				}
			}

			cluster = cluster.__parent;
		}

		delete marker.__parent;
	},

	_isOrIsParent: function (el, oel) {
		while (oel) {
			if (el === oel) {
				return true;
			}
			oel = oel.parentNode;
		}
		return false;
	},

	//Override L.Evented.fire
	fire: function (type, data, propagate) {
		if (data && data.layer instanceof L.MarkerCluster) {
			//Prevent multiple clustermouseover/off events if the icon is made up of stacked divs (Doesn't work in ie <= 8, no relatedTarget)
			if (data.originalEvent && this._isOrIsParent(data.layer._icon, data.originalEvent.relatedTarget)) {
				return;
			}
			type = 'cluster' + type;
		}

		L.FeatureGroup.prototype.fire.call(this, type, data, propagate);
	},

	//Override L.Evented.listens
	listens: function (type, propagate) {
		return L.FeatureGroup.prototype.listens.call(this, type, propagate) || L.FeatureGroup.prototype.listens.call(this, 'cluster' + type, propagate);
	},

	//Default functionality
	_defaultIconCreateFunction: function (cluster) {
		var childCount = cluster.getChildCount();

		var c = ' marker-cluster-';
		if (childCount < 10) {
			c += 'small';
		} else if (childCount < 100) {
			c += 'medium';
		} else {
			c += 'large';
		}

		return new L.DivIcon({ html: '
' + childCount + '
', className: 'marker-cluster' + c, iconSize: new L.Point(40, 40) });
	},

	_bindEvents: function () {
		var map = this._map,
		    spiderfyOnMaxZoom = this.options.spiderfyOnMaxZoom,
		    showCoverageOnHover = this.options.showCoverageOnHover,
		    zoomToBoundsOnClick = this.options.zoomToBoundsOnClick;

		//Zoom on cluster click or spiderfy if we are at the lowest level
		if (spiderfyOnMaxZoom || zoomToBoundsOnClick) {
			this.on('clusterclick', this._zoomOrSpiderfy, this);
		}

		//Show convex hull (boundary) polygon on mouse over
		if (showCoverageOnHover) {
			this.on('clustermouseover', this._showCoverage, this);
			this.on('clustermouseout', this._hideCoverage, this);
			map.on('zoomend', this._hideCoverage, this);
		}
	},

	_zoomOrSpiderfy: function (e) {
		var map = this._map;
		if (map.getMaxZoom() === map.getZoom()) {
			if (this.options.spiderfyOnMaxZoom) {
				e.layer.spiderfy();
			}
		} else if (this.options.zoomToBoundsOnClick) {
			e.layer.zoomToBounds();
		}

		// Focus the map again for keyboard users.
		if (e.originalEvent && e.originalEvent.keyCode === 13) {
			map._container.focus();
		}
	},

	_showCoverage: function (e) {
		var map = this._map;
		if (this._inZoomAnimation) {
			return;
		}
		if (this._shownPolygon) {
			map.removeLayer(this._shownPolygon);
		}
		if (e.layer.getChildCount() > 2 && e.layer !== this._spiderfied) {
			this._shownPolygon = new L.Polygon(e.layer.getConvexHull(), this.options.polygonOptions);
			map.addLayer(this._shownPolygon);
		}
	},

	_hideCoverage: function () {
		if (this._shownPolygon) {
			this._map.removeLayer(this._shownPolygon);
			this._shownPolygon = null;
		}
	},

	_unbindEvents: function () {
		var spiderfyOnMaxZoom = this.options.spiderfyOnMaxZoom,
			showCoverageOnHover = this.options.showCoverageOnHover,
			zoomToBoundsOnClick = this.options.zoomToBoundsOnClick,
			map = this._map;

		if (spiderfyOnMaxZoom || zoomToBoundsOnClick) {
			this.off('clusterclick', this._zoomOrSpiderfy, this);
		}
		if (showCoverageOnHover) {
			this.off('clustermouseover', this._showCoverage, this);
			this.off('clustermouseout', this._hideCoverage, this);
			map.off('zoomend', this._hideCoverage, this);
		}
	},

	_zoomEnd: function () {
		if (!this._map) { //May have been removed from the map by a zoomEnd handler
			return;
		}
		this._mergeSplitClusters();

		this._zoom = this._map._zoom;
		this._currentShownBounds = this._getExpandedVisibleBounds();
	},

	_moveEnd: function () {
		if (this._inZoomAnimation) {
			return;
		}

		var newBounds = this._getExpandedVisibleBounds();

		this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, this._zoom, newBounds);
		this._topClusterLevel._recursivelyAddChildrenToMap(null, this._map._zoom, newBounds);

		this._currentShownBounds = newBounds;
		return;
	},

	_generateInitialClusters: function () {
		var maxZoom = this._map.getMaxZoom(),
			radius = this.options.maxClusterRadius,
			radiusFn = radius;

		//If we just set maxClusterRadius to a single number, we need to create
		//a simple function to return that number. Otherwise, we just have to
		//use the function we've passed in.
		if (typeof radius !== "function") {
			radiusFn = function () { return radius; };
		}

		if (this.options.disableClusteringAtZoom) {
			maxZoom = this.options.disableClusteringAtZoom - 1;
		}
		this._maxZoom = maxZoom;
		this._gridClusters = {};
		this._gridUnclustered = {};

		//Set up DistanceGrids for each zoom
		for (var zoom = maxZoom; zoom >= 0; zoom--) {
			this._gridClusters[zoom] = new L.DistanceGrid(radiusFn(zoom));
			this._gridUnclustered[zoom] = new L.DistanceGrid(radiusFn(zoom));
		}

		this._topClusterLevel = new L.MarkerCluster(this, -1);
	},

	//Zoom: Zoom to start adding at (Pass this._maxZoom to start at the bottom)
	_addLayer: function (layer, zoom) {
		var gridClusters = this._gridClusters,
		    gridUnclustered = this._gridUnclustered,
		    markerPoint, z;

		if (this.options.singleMarkerMode) {
			layer.options.icon = this.options.iconCreateFunction({
				getChildCount: function () {
					return 1;
				},
				getAllChildMarkers: function () {
					return [layer];
				}
			});
		}

		layer.on('move', this._childMarkerMoved, this);

		//Find the lowest zoom level to slot this one in
		for (; zoom >= 0; zoom--) {
			markerPoint = this._map.project(layer.getLatLng(), zoom); // calculate pixel position

			//Try find a cluster close by
			var closest = gridClusters[zoom].getNearObject(markerPoint);
			if (closest) {
				closest._addChild(layer);
				layer.__parent = closest;
				return;
			}

			//Try find a marker close by to form a new cluster with
			closest = gridUnclustered[zoom].getNearObject(markerPoint);
			if (closest) {
				var parent = closest.__parent;
				if (parent) {
					this._removeLayer(closest, false);
				}

				//Create new cluster with these 2 in it

				var newCluster = new L.MarkerCluster(this, zoom, closest, layer);
				gridClusters[zoom].addObject(newCluster, this._map.project(newCluster._cLatLng, zoom));
				closest.__parent = newCluster;
				layer.__parent = newCluster;

				//First create any new intermediate parent clusters that don't exist
				var lastParent = newCluster;
				for (z = zoom - 1; z > parent._zoom; z--) {
					lastParent = new L.MarkerCluster(this, z, lastParent);
					gridClusters[z].addObject(lastParent, this._map.project(closest.getLatLng(), z));
				}
				parent._addChild(lastParent);

				//Remove closest from this zoom level and any above that it is in, replace with newCluster
				for (z = zoom; z >= 0; z--) {
					if (!gridUnclustered[z].removeObject(closest, this._map.project(closest.getLatLng(), z))) {
						break;
					}
				}

				return;
			}

			//Didn't manage to cluster in at this zoom, record us as a marker here and continue upwards
			gridUnclustered[zoom].addObject(layer, markerPoint);
		}

		//Didn't get in anything, add us to the top
		this._topClusterLevel._addChild(layer);
		layer.__parent = this._topClusterLevel;
		return;
	},

	//Enqueue code to fire after the marker expand/contract has happened
	_enqueue: function (fn) {
		this._queue.push(fn);
		if (!this._queueTimeout) {
			this._queueTimeout = setTimeout(L.bind(this._processQueue, this), 300);
		}
	},
	_processQueue: function () {
		for (var i = 0; i < this._queue.length; i++) {
			this._queue[i].call(this);
		}
		this._queue.length = 0;
		clearTimeout(this._queueTimeout);
		this._queueTimeout = null;
	},

	//Merge and split any existing clusters that are too big or small
	_mergeSplitClusters: function () {

		//Incase we are starting to split before the animation finished
		this._processQueue();

		if (this._zoom < this._map._zoom && this._currentShownBounds.contains(this._getExpandedVisibleBounds())) { //Zoom in, split
			this._animationStart();
			//Remove clusters now off screen
			this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, this._zoom, this._getExpandedVisibleBounds());

			this._animationZoomIn(this._zoom, this._map._zoom);

		} else if (this._zoom > this._map._zoom) { //Zoom out, merge
			this._animationStart();

			this._animationZoomOut(this._zoom, this._map._zoom);
		} else {
			this._moveEnd();
		}
	},

	//Gets the maps visible bounds expanded in each direction by the size of the screen (so the user cannot see an area we do not cover in one pan)
	_getExpandedVisibleBounds: function () {
		if (!this.options.removeOutsideVisibleBounds) {
			return this.getBounds();
		}

		var map = this._map,
			bounds = map.getBounds(),
			sw = bounds._southWest,
			ne = bounds._northEast,
			latDiff = L.Browser.mobile ? 0 : Math.abs(sw.lat - ne.lat),
			lngDiff = L.Browser.mobile ? 0 : Math.abs(sw.lng - ne.lng);

		return new L.LatLngBounds(
			new L.LatLng(sw.lat - latDiff, sw.lng - lngDiff, true),
			new L.LatLng(ne.lat + latDiff, ne.lng + lngDiff, true));
	},

	//Shared animation code
	_animationAddLayerNonAnimated: function (layer, newCluster) {
		if (newCluster === layer) {
			this._featureGroup.addLayer(layer);
		} else if (newCluster._childCount === 2) {
			newCluster._addToMap();

			var markers = newCluster.getAllChildMarkers();
			this._featureGroup.removeLayer(markers[0]);
			this._featureGroup.removeLayer(markers[1]);
		} else {
			newCluster._updateIcon();
		}
	}
});

L.MarkerClusterGroup.include(!L.DomUtil.TRANSITION ? {

	//Non Animated versions of everything
	_animationStart: function () {
		//Do nothing...
	},
	_animationZoomIn: function (previousZoomLevel, newZoomLevel) {
		this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, previousZoomLevel);
		this._topClusterLevel._recursivelyAddChildrenToMap(null, newZoomLevel, this._getExpandedVisibleBounds());

		//We didn't actually animate, but we use this event to mean "clustering animations have finished"
		this.fire('animationend');
	},
	_animationZoomOut: function (previousZoomLevel, newZoomLevel) {
		this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, previousZoomLevel);
		this._topClusterLevel._recursivelyAddChildrenToMap(null, newZoomLevel, this._getExpandedVisibleBounds());

		//We didn't actually animate, but we use this event to mean "clustering animations have finished"
		this.fire('animationend');
	},
	_animationAddLayer: function (layer, newCluster) {
		this._animationAddLayerNonAnimated(layer, newCluster);
	}
} : {

	//Animated versions here
	_animationStart: function () {
		this._map._mapPane.className += ' leaflet-cluster-anim';
		this._inZoomAnimation++;
	},
	_animationEnd: function () {
		if (this._map) {
			this._map._mapPane.className = this._map._mapPane.className.replace(' leaflet-cluster-anim', '');
		}
		this._inZoomAnimation--;
		this.fire('animationend');
	},
	_animationZoomIn: function (previousZoomLevel, newZoomLevel) {
		var bounds = this._getExpandedVisibleBounds(),
		    fg = this._featureGroup,
		    i;

		this._ignoreMove = true;

		//Add all children of current clusters to map and remove those clusters from map
		this._topClusterLevel._recursively(bounds, previousZoomLevel, 0, function (c) {
			var startPos = c._latlng,
				markers = c._markers,
				m;

			if (!bounds.contains(startPos)) {
				startPos = null;
			}

			if (c._isSingleParent() && previousZoomLevel + 1 === newZoomLevel) { //Immediately add the new child and remove us
				fg.removeLayer(c);
				c._recursivelyAddChildrenToMap(null, newZoomLevel, bounds);
			} else {
				//Fade out old cluster
				c.setOpacity(0);
				c._recursivelyAddChildrenToMap(startPos, newZoomLevel, bounds);
			}

			//Remove all markers that aren't visible any more
			//TODO: Do we actually need to do this on the higher levels too?
			for (i = markers.length - 1; i >= 0; i--) {
				m = markers[i];
				if (!bounds.contains(m._latlng)) {
					fg.removeLayer(m);
				}
			}

		});

		this._forceLayout();

		//Update opacities
		this._topClusterLevel._recursivelyBecomeVisible(bounds, newZoomLevel);
		//TODO Maybe? Update markers in _recursivelyBecomeVisible
		fg.eachLayer(function (n) {
			if (!(n instanceof L.MarkerCluster) && n._icon) {
				n.setOpacity(1);
			}
		});

		//update the positions of the just added clusters/markers
		this._topClusterLevel._recursively(bounds, previousZoomLevel, newZoomLevel, function (c) {
			c._recursivelyRestoreChildPositions(newZoomLevel);
		});

		this._ignoreMove = false;

		//Remove the old clusters and close the zoom animation
		this._enqueue(function () {
			//update the positions of the just added clusters/markers
			this._topClusterLevel._recursively(bounds, previousZoomLevel, 0, function (c) {
				fg.removeLayer(c);
				c.setOpacity(1);
			});

			this._animationEnd();
		});
	},

	_animationZoomOut: function (previousZoomLevel, newZoomLevel) {
		this._animationZoomOutSingle(this._topClusterLevel, previousZoomLevel - 1, newZoomLevel);

		//Need to add markers for those that weren't on the map before but are now
		this._topClusterLevel._recursivelyAddChildrenToMap(null, newZoomLevel, this._getExpandedVisibleBounds());
		//Remove markers that were on the map before but won't be now
		this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds, previousZoomLevel, this._getExpandedVisibleBounds());
	},
	_animationZoomOutSingle: function (cluster, previousZoomLevel, newZoomLevel) {
		var bounds = this._getExpandedVisibleBounds();

		//Animate all of the markers in the clusters to move to their cluster center point
		cluster._recursivelyAnimateChildrenInAndAddSelfToMap(bounds, previousZoomLevel + 1, newZoomLevel);

		var me = this;

		//Update the opacity (If we immediately set it they won't animate)
		this._forceLayout();
		cluster._recursivelyBecomeVisible(bounds, newZoomLevel);

		//TODO: Maybe use the transition timing stuff to make this more reliable
		//When the animations are done, tidy up
		this._enqueue(function () {

			//This cluster stopped being a cluster before the timeout fired
			if (cluster._childCount === 1) {
				var m = cluster._markers[0];
				//If we were in a cluster animation at the time then the opacity and position of our child could be wrong now, so fix it
				this._ignoreMove = true;
				m.setLatLng(m.getLatLng());
				this._ignoreMove = false;
				if (m.setOpacity) {
					m.setOpacity(1);
				}
			} else {
				cluster._recursively(bounds, newZoomLevel, 0, function (c) {
					c._recursivelyRemoveChildrenFromMap(bounds, previousZoomLevel + 1);
				});
			}
			me._animationEnd();
		});
	},
	_animationAddLayer: function (layer, newCluster) {
		var me = this,
			fg = this._featureGroup;

		fg.addLayer(layer);
		if (newCluster !== layer) {
			if (newCluster._childCount > 2) { //Was already a cluster

				newCluster._updateIcon();
				this._forceLayout();
				this._animationStart();

				layer._setPos(this._map.latLngToLayerPoint(newCluster.getLatLng()));
				layer.setOpacity(0);

				this._enqueue(function () {
					fg.removeLayer(layer);
					layer.setOpacity(1);

					me._animationEnd();
				});

			} else { //Just became a cluster
				this._forceLayout();

				me._animationStart();
				me._animationZoomOutSingle(newCluster, this._map.getMaxZoom(), this._map.getZoom());
			}
		}
	},

	//Force a browser layout of stuff in the map
	// Should apply the current opacity and location to all elements so we can update them again for an animation
	_forceLayout: function () {
		//In my testing this works, infact offsetWidth of any element seems to work.
		//Could loop all this._layers and do this for each _icon if it stops working

		L.Util.falseFn(document.body.offsetWidth);
	}
});

L.markerClusterGroup = function (options) {
	return new L.MarkerClusterGroup(options);
};

L.MarkerCluster = L.Marker.extend({
	initialize: function (group, zoom, a, b) {

		L.Marker.prototype.initialize.call(this, a ? (a._cLatLng || a.getLatLng()) : new L.LatLng(0, 0), { icon: this });

		this._group = group;
		this._zoom = zoom;

		this._markers = [];
		this._childClusters = [];
		this._childCount = 0;
		this._iconNeedsUpdate = true;

		this._bounds = new L.LatLngBounds();

		if (a) {
			this._addChild(a);
		}
		if (b) {
			this._addChild(b);
		}
	},

	//Recursively retrieve all child markers of this cluster
	getAllChildMarkers: function (storageArray) {
		storageArray = storageArray || [];

		for (var i = this._childClusters.length - 1; i >= 0; i--) {
			this._childClusters[i].getAllChildMarkers(storageArray);
		}

		for (var j = this._markers.length - 1; j >= 0; j--) {
			storageArray.push(this._markers[j]);
		}

		return storageArray;
	},

	//Returns the count of how many child markers we have
	getChildCount: function () {
		return this._childCount;
	},

	//Zoom to the minimum of showing all of the child markers, or the extents of this cluster
	zoomToBounds: function () {
		var childClusters = this._childClusters.slice(),
			map = this._group._map,
			boundsZoom = map.getBoundsZoom(this._bounds),
			zoom = this._zoom + 1,
			mapZoom = map.getZoom(),
			i;

		//calculate how fare we need to zoom down to see all of the markers
		while (childClusters.length > 0 && boundsZoom > zoom) {
			zoom++;
			var newClusters = [];
			for (i = 0; i < childClusters.length; i++) {
				newClusters = newClusters.concat(childClusters[i]._childClusters);
			}
			childClusters = newClusters;
		}

		if (boundsZoom > zoom) {
			this._group._map.setView(this._latlng, zoom);
		} else if (boundsZoom <= mapZoom) { //If fitBounds wouldn't zoom us down, zoom us down instead
			this._group._map.setView(this._latlng, mapZoom + 1);
		} else {
			this._group._map.fitBounds(this._bounds);
		}
	},

	getBounds: function () {
		var bounds = new L.LatLngBounds();
		bounds.extend(this._bounds);
		return bounds;
	},

	_updateIcon: function () {
		this._iconNeedsUpdate = true;
		if (this._icon) {
			this.setIcon(this);
		}
	},

	//Cludge for Icon, we pretend to be an icon for performance
	createIcon: function () {
		if (this._iconNeedsUpdate) {
			this._iconObj = this._group.options.iconCreateFunction(this);
			this._iconNeedsUpdate = false;
		}
		return this._iconObj.createIcon();
	},
	createShadow: function () {
		return this._iconObj.createShadow();
	},

	_addChild: function (new1, isNotificationFromChild) {

		this._iconNeedsUpdate = true;
		this._expandBounds(new1);

		if (new1 instanceof L.MarkerCluster) {
			if (!isNotificationFromChild) {
				this._childClusters.push(new1);
				new1.__parent = this;
			}
			this._childCount += new1._childCount;
		} else {
			if (!isNotificationFromChild) {
				this._markers.push(new1);
			}
			this._childCount++;
		}

		if (this.__parent) {
			this.__parent._addChild(new1, true);
		}
	},

	//Expand our bounds and tell our parent to
	_expandBounds: function (marker) {
		var addedCount,
		    addedLatLng = marker._wLatLng || marker._latlng;

		if (marker instanceof L.MarkerCluster) {
			this._bounds.extend(marker._bounds);
			addedCount = marker._childCount;
		} else {
			this._bounds.extend(addedLatLng);
			addedCount = 1;
		}

		if (!this._cLatLng) {
			// when clustering, take position of the first point as the cluster center
			this._cLatLng = marker._cLatLng || addedLatLng;
		}

		// when showing clusters, take weighted average of all points as cluster center
		var totalCount = this._childCount + addedCount;

		//Calculate weighted latlng for display
		if (!this._wLatLng) {
			this._latlng = this._wLatLng = new L.LatLng(addedLatLng.lat, addedLatLng.lng);
		} else {
			this._wLatLng.lat = (addedLatLng.lat * addedCount + this._wLatLng.lat * this._childCount) / totalCount;
			this._wLatLng.lng = (addedLatLng.lng * addedCount + this._wLatLng.lng * this._childCount) / totalCount;
		}
	},

	//Set our markers position as given and add it to the map
	_addToMap: function (startPos) {
		if (startPos) {
			this._backupLatlng = this._latlng;
			this.setLatLng(startPos);
		}
		this._group._featureGroup.addLayer(this);
	},

	_recursivelyAnimateChildrenIn: function (bounds, center, maxZoom) {
		this._recursively(bounds, 0, maxZoom - 1,
			function (c) {
				var markers = c._markers,
					i, m;
				for (i = markers.length - 1; i >= 0; i--) {
					m = markers[i];

					//Only do it if the icon is still on the map
					if (m._icon) {
						m._setPos(center);
						m.setOpacity(0);
					}
				}
			},
			function (c) {
				var childClusters = c._childClusters,
					j, cm;
				for (j = childClusters.length - 1; j >= 0; j--) {
					cm = childClusters[j];
					if (cm._icon) {
						cm._setPos(center);
						cm.setOpacity(0);
					}
				}
			}
		);
	},

	_recursivelyAnimateChildrenInAndAddSelfToMap: function (bounds, previousZoomLevel, newZoomLevel) {
		this._recursively(bounds, newZoomLevel, 0,
			function (c) {
				c._recursivelyAnimateChildrenIn(bounds, c._group._map.latLngToLayerPoint(c.getLatLng()).round(), previousZoomLevel);

				//TODO: depthToAnimateIn affects _isSingleParent, if there is a multizoom we may/may not be.
				//As a hack we only do a animation free zoom on a single level zoom, if someone does multiple levels then we always animate
				if (c._isSingleParent() && previousZoomLevel - 1 === newZoomLevel) {
					c.setOpacity(1);
					c._recursivelyRemoveChildrenFromMap(bounds, previousZoomLevel); //Immediately remove our children as we are replacing them. TODO previousBounds not bounds
				} else {
					c.setOpacity(0);
				}

				c._addToMap();
			}
		);
	},

	_recursivelyBecomeVisible: function (bounds, zoomLevel) {
		this._recursively(bounds, 0, zoomLevel, null, function (c) {
			c.setOpacity(1);
		});
	},

	_recursivelyAddChildrenToMap: function (startPos, zoomLevel, bounds) {
		this._recursively(bounds, -1, zoomLevel,
			function (c) {
				if (zoomLevel === c._zoom) {
					return;
				}

				//Add our child markers at startPos (so they can be animated out)
				for (var i = c._markers.length - 1; i >= 0; i--) {
					var nm = c._markers[i];

					if (!bounds.contains(nm._latlng)) {
						continue;
					}

					if (startPos) {
						nm._backupLatlng = nm.getLatLng();

						nm.setLatLng(startPos);
						if (nm.setOpacity) {
							nm.setOpacity(0);
						}
					}

					c._group._featureGroup.addLayer(nm);
				}
			},
			function (c) {
				c._addToMap(startPos);
			}
		);
	},

	_recursivelyRestoreChildPositions: function (zoomLevel) {
		//Fix positions of child markers
		for (var i = this._markers.length - 1; i >= 0; i--) {
			var nm = this._markers[i];
			if (nm._backupLatlng) {
				nm.setLatLng(nm._backupLatlng);
				delete nm._backupLatlng;
			}
		}

		if (zoomLevel - 1 === this._zoom) {
			//Reposition child clusters
			for (var j = this._childClusters.length - 1; j >= 0; j--) {
				this._childClusters[j]._restorePosition();
			}
		} else {
			for (var k = this._childClusters.length - 1; k >= 0; k--) {
				this._childClusters[k]._recursivelyRestoreChildPositions(zoomLevel);
			}
		}
	},

	_restorePosition: function () {
		if (this._backupLatlng) {
			this.setLatLng(this._backupLatlng);
			delete this._backupLatlng;
		}
	},

	//exceptBounds: If set, don't remove any markers/clusters in it
	_recursivelyRemoveChildrenFromMap: function (previousBounds, zoomLevel, exceptBounds) {
		var m, i;
		this._recursively(previousBounds, -1, zoomLevel - 1,
			function (c) {
				//Remove markers at every level
				for (i = c._markers.length - 1; i >= 0; i--) {
					m = c._markers[i];
					if (!exceptBounds || !exceptBounds.contains(m._latlng)) {
						c._group._featureGroup.removeLayer(m);
						if (m.setOpacity) {
							m.setOpacity(1);
						}
					}
				}
			},
			function (c) {
				//Remove child clusters at just the bottom level
				for (i = c._childClusters.length - 1; i >= 0; i--) {
					m = c._childClusters[i];
					if (!exceptBounds || !exceptBounds.contains(m._latlng)) {
						c._group._featureGroup.removeLayer(m);
						if (m.setOpacity) {
							m.setOpacity(1);
						}
					}
				}
			}
		);
	},

	//Run the given functions recursively to this and child clusters
	// boundsToApplyTo: a L.LatLngBounds representing the bounds of what clusters to recurse in to
	// zoomLevelToStart: zoom level to start running functions (inclusive)
	// zoomLevelToStop: zoom level to stop running functions (inclusive)
	// runAtEveryLevel: function that takes an L.MarkerCluster as an argument that should be applied on every level
	// runAtBottomLevel: function that takes an L.MarkerCluster as an argument that should be applied at only the bottom level
	_recursively: function (boundsToApplyTo, zoomLevelToStart, zoomLevelToStop, runAtEveryLevel, runAtBottomLevel) {
		var childClusters = this._childClusters,
		    zoom = this._zoom,
			i, c;

		if (zoomLevelToStart > zoom) { //Still going down to required depth, just recurse to child clusters
			for (i = childClusters.length - 1; i >= 0; i--) {
				c = childClusters[i];
				if (boundsToApplyTo.intersects(c._bounds)) {
					c._recursively(boundsToApplyTo, zoomLevelToStart, zoomLevelToStop, runAtEveryLevel, runAtBottomLevel);
				}
			}
		} else { //In required depth

			if (runAtEveryLevel) {
				runAtEveryLevel(this);
			}
			if (runAtBottomLevel && this._zoom === zoomLevelToStop) {
				runAtBottomLevel(this);
			}

			//TODO: This loop is almost the same as above
			if (zoomLevelToStop > zoom) {
				for (i = childClusters.length - 1; i >= 0; i--) {
					c = childClusters[i];
					if (boundsToApplyTo.intersects(c._bounds)) {
						c._recursively(boundsToApplyTo, zoomLevelToStart, zoomLevelToStop, runAtEveryLevel, runAtBottomLevel);
					}
				}
			}
		}
	},

	_recalculateBounds: function () {
		var markers = this._markers,
			childClusters = this._childClusters,
			i;

		this._bounds = new L.LatLngBounds();
		delete this._wLatLng;

		for (i = markers.length - 1; i >= 0; i--) {
			this._expandBounds(markers[i]);
		}
		for (i = childClusters.length - 1; i >= 0; i--) {
			this._expandBounds(childClusters[i]);
		}
	},

	//Returns true if we are the parent of only one cluster and that cluster is the same as us
	_isSingleParent: function () {
		//Don't need to check this._markers as the rest won't work if there are any
		return this._childClusters.length > 0 && this._childClusters[0]._childCount === this._childCount;
	}
});

L.DistanceGrid = function (cellSize) {
	this._cellSize = cellSize;
	this._sqCellSize = cellSize * cellSize;
	this._grid = {};
	this._objectPoint = { };
};

L.DistanceGrid.prototype = {

	addObject: function (obj, point) {
		var x = this._getCoord(point.x),
		    y = this._getCoord(point.y),
		    grid = this._grid,
		    row = grid[y] = grid[y] || {},
		    cell = row[x] = row[x] || [],
		    stamp = L.Util.stamp(obj);

		this._objectPoint[stamp] = point;

		cell.push(obj);
	},

	updateObject: function (obj, point) {
		this.removeObject(obj);
		this.addObject(obj, point);
	},

	//Returns true if the object was found
	removeObject: function (obj, point) {
		var x = this._getCoord(point.x),
		    y = this._getCoord(point.y),
		    grid = this._grid,
		    row = grid[y] = grid[y] || {},
		    cell = row[x] = row[x] || [],
		    i, len;

		delete this._objectPoint[L.Util.stamp(obj)];

		for (i = 0, len = cell.length; i < len; i++) {
			if (cell[i] === obj) {

				cell.splice(i, 1);

				if (len === 1) {
					delete row[x];
				}

				return true;
			}
		}

	},

	eachObject: function (fn, context) {
		var i, j, k, len, row, cell, removed,
		    grid = this._grid;

		for (i in grid) {
			row = grid[i];

			for (j in row) {
				cell = row[j];

				for (k = 0, len = cell.length; k < len; k++) {
					removed = fn.call(context, cell[k]);
					if (removed) {
						k--;
						len--;
					}
				}
			}
		}
	},

	getNearObject: function (point) {
		var x = this._getCoord(point.x),
		    y = this._getCoord(point.y),
		    i, j, k, row, cell, len, obj, dist,
		    objectPoint = this._objectPoint,
		    closestDistSq = this._sqCellSize,
		    closest = null;

		for (i = y - 1; i <= y + 1; i++) {
			row = this._grid[i];
			if (row) {

				for (j = x - 1; j <= x + 1; j++) {
					cell = row[j];
					if (cell) {

						for (k = 0, len = cell.length; k < len; k++) {
							obj = cell[k];
							dist = this._sqDist(objectPoint[L.Util.stamp(obj)], point);
							if (dist < closestDistSq) {
								closestDistSq = dist;
								closest = obj;
							}
						}
					}
				}
			}
		}
		return closest;
	},

	_getCoord: function (x) {
		return Math.floor(x / this._cellSize);
	},

	_sqDist: function (p, p2) {
		var dx = p2.x - p.x,
		    dy = p2.y - p.y;
		return dx * dx + dy * dy;
	}
};

/* Copyright (c) 2012 the authors listed at the following URL, and/or
the authors of referenced articles or incorporated external code:
http://en.literateprograms.org/Quickhull_(Javascript)?action=history&offset=20120410175256

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

Retrieved from: http://en.literateprograms.org/Quickhull_(Javascript)?oldid=18434
*/

(function () {
	L.QuickHull = {

		/*
		 * @param {Object} cpt a point to be measured from the baseline
		 * @param {Array} bl the baseline, as represented by a two-element
		 *   array of latlng objects.
		 * @returns {Number} an approximate distance measure
		 */
		getDistant: function (cpt, bl) {
			var vY = bl[1].lat - bl[0].lat,
				vX = bl[0].lng - bl[1].lng;
			return (vX * (cpt.lat - bl[0].lat) + vY * (cpt.lng - bl[0].lng));
		},

		/*
		 * @param {Array} baseLine a two-element array of latlng objects
		 *   representing the baseline to project from
		 * @param {Array} latLngs an array of latlng objects
		 * @returns {Object} the maximum point and all new points to stay
		 *   in consideration for the hull.
		 */
		findMostDistantPointFromBaseLine: function (baseLine, latLngs) {
			var maxD = 0,
				maxPt = null,
				newPoints = [],
				i, pt, d;

			for (i = latLngs.length - 1; i >= 0; i--) {
				pt = latLngs[i];
				d = this.getDistant(pt, baseLine);

				if (d > 0) {
					newPoints.push(pt);
				} else {
					continue;
				}

				if (d > maxD) {
					maxD = d;
					maxPt = pt;
				}
			}

			return { maxPoint: maxPt, newPoints: newPoints };
		},

		/*
		 * Given a baseline, compute the convex hull of latLngs as an array
		 * of latLngs.
		 *
		 * @param {Array} latLngs
		 * @returns {Array}
		 */
		buildConvexHull: function (baseLine, latLngs) {
			var convexHullBaseLines = [],
				t = this.findMostDistantPointFromBaseLine(baseLine, latLngs);

			if (t.maxPoint) { // if there is still a point "outside" the base line
				convexHullBaseLines =
					convexHullBaseLines.concat(
						this.buildConvexHull([baseLine[0], t.maxPoint], t.newPoints)
					);
				convexHullBaseLines =
					convexHullBaseLines.concat(
						this.buildConvexHull([t.maxPoint, baseLine[1]], t.newPoints)
					);
				return convexHullBaseLines;
			} else {  // if there is no more point "outside" the base line, the current base line is part of the convex hull
				return [baseLine[0]];
			}
		},

		/*
		 * Given an array of latlngs, compute a convex hull as an array
		 * of latlngs
		 *
		 * @param {Array} latLngs
		 * @returns {Array}
		 */
		getConvexHull: function (latLngs) {
			// find first baseline
			var maxLat = false, minLat = false,
				maxPt = null, minPt = null,
				i;

			for (i = latLngs.length - 1; i >= 0; i--) {
				var pt = latLngs[i];
				if (maxLat === false || pt.lat > maxLat) {
					maxPt = pt;
					maxLat = pt.lat;
				}
				if (minLat === false || pt.lat < minLat) {
					minPt = pt;
					minLat = pt.lat;
				}
			}
			var ch = [].concat(this.buildConvexHull([minPt, maxPt], latLngs),
								this.buildConvexHull([maxPt, minPt], latLngs));
			return ch;
		}
	};
}());

L.MarkerCluster.include({
	getConvexHull: function () {
		var childMarkers = this.getAllChildMarkers(),
			points = [],
			p, i;

		for (i = childMarkers.length - 1; i >= 0; i--) {
			p = childMarkers[i].getLatLng();
			points.push(p);
		}

		return L.QuickHull.getConvexHull(points);
	}
});

//This code is 100% based on https://github.com/jawj/OverlappingMarkerSpiderfier-Leaflet
//Huge thanks to jawj for implementing it first to make my job easy :-)

L.MarkerCluster.include({

	_2PI: Math.PI * 2,
	_circleFootSeparation: 25, //related to circumference of circle
	_circleStartAngle: Math.PI / 6,

	_spiralFootSeparation:  28, //related to size of spiral (experiment!)
	_spiralLengthStart: 11,
	_spiralLengthFactor: 5,

	_circleSpiralSwitchover: 9, //show spiral instead of circle from this marker count upwards.
								// 0 -> always spiral; Infinity -> always circle

	spiderfy: function () {
		if (this._group._spiderfied === this || this._group._inZoomAnimation) {
			return;
		}

		var childMarkers = this.getAllChildMarkers(),
			group = this._group,
			map = group._map,
			center = map.latLngToLayerPoint(this._latlng),
			positions;

		this._group._unspiderfy();
		this._group._spiderfied = this;

		//TODO Maybe: childMarkers order by distance to center

		if (childMarkers.length >= this._circleSpiralSwitchover) {
			positions = this._generatePointsSpiral(childMarkers.length, center);
		} else {
			center.y += 10; //Otherwise circles look wrong
			positions = this._generatePointsCircle(childMarkers.length, center);
		}

		this._animationSpiderfy(childMarkers, positions);
	},

	unspiderfy: function (zoomDetails) {
		/// <param Name="zoomDetails">Argument from zoomanim if being called in a zoom animation or null otherwise</param>
		if (this._group._inZoomAnimation) {
			return;
		}
		this._animationUnspiderfy(zoomDetails);

		this._group._spiderfied = null;
	},

	_generatePointsCircle: function (count, centerPt) {
		var circumference = this._group.options.spiderfyDistanceMultiplier * this._circleFootSeparation * (2 + count),
			legLength = circumference / this._2PI,  //radius from circumference
			angleStep = this._2PI / count,
			res = [],
			i, angle;

		res.length = count;

		for (i = count - 1; i >= 0; i--) {
			angle = this._circleStartAngle + i * angleStep;
			res[i] = new L.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle))._round();
		}

		return res;
	},

	_generatePointsSpiral: function (count, centerPt) {
		var legLength = this._group.options.spiderfyDistanceMultiplier * this._spiralLengthStart,
			separation = this._group.options.spiderfyDistanceMultiplier * this._spiralFootSeparation,
			lengthFactor = this._group.options.spiderfyDistanceMultiplier * this._spiralLengthFactor,
			angle = 0,
			res = [],
			i;

		res.length = count;

		for (i = count - 1; i >= 0; i--) {
			angle += separation / legLength + i * 0.0005;
			res[i] = new L.Point(centerPt.x + legLength * Math.cos(angle), centerPt.y + legLength * Math.sin(angle))._round();
			legLength += this._2PI * lengthFactor / angle;
		}
		return res;
	},

	_noanimationUnspiderfy: function () {
		var group = this._group,
			map = group._map,
			fg = group._featureGroup,
			childMarkers = this.getAllChildMarkers(),
			m, i;

		group._ignoreMove = true;

		this.setOpacity(1);
		for (i = childMarkers.length - 1; i >= 0; i--) {
			m = childMarkers[i];

			fg.removeLayer(m);

			if (m._preSpiderfyLatlng) {
				m.setLatLng(m._preSpiderfyLatlng);
				delete m._preSpiderfyLatlng;
			}
			if (m.setZIndexOffset) {
				m.setZIndexOffset(0);
			}

			if (m._spiderLeg) {
				map.removeLayer(m._spiderLeg);
				delete m._spiderLeg;
			}
		}

		group._ignoreMove = false;
		group._spiderfied = null;
	}
});

L.MarkerCluster.include(!L.DomUtil.TRANSITION ? {
	//Non Animated versions of everything
	_animationSpiderfy: function (childMarkers, positions) {
		var group = this._group,
			map = group._map,
			fg = group._featureGroup,
			i, m, leg, newPos;

		group._ignoreMove = true;

		for (i = childMarkers.length - 1; i >= 0; i--) {
			newPos = map.layerPointToLatLng(positions[i]);
			m = childMarkers[i];

			m._preSpiderfyLatlng = m._latlng;
			m.setLatLng(newPos);
			if (m.setZIndexOffset) {
				m.setZIndexOffset(1000000); //Make these appear on top of EVERYTHING
			}

			fg.addLayer(m);

			leg = new L.Polyline([this._latlng, newPos], { weight: 1.5, color: '#222' });
			map.addLayer(leg);
			m._spiderLeg = leg;
		}
		this.setOpacity(0.3);

		group._ignoreMove = false;
		group.fire('spiderfied');
	},

	_animationUnspiderfy: function () {
		this._noanimationUnspiderfy();
	}
} : {
	//Animated versions here
	SVG_ANIMATION: (function () {
		return document.createElementNS('http://www.w3.org/2000/svg', 'animate').toString().indexOf('SVGAnimate') > -1;
	}()),

	_animationSpiderfy: function (childMarkers, positions) {
		var me = this,
			group = this._group,
			map = group._map,
			fg = group._featureGroup,
			thisLayerPos = map.latLngToLayerPoint(this._latlng),
			xmlns = 'http://www.w3.org/2000/svg',
			i, m, leg, newPos;

		group._ignoreMove = true;

		//Add markers to map hidden at our center point
		for (i = childMarkers.length - 1; i >= 0; i--) {
			m = childMarkers[i];

			//If it is a marker, add it now and we'll animate it out
			if (m.setOpacity) {
				m.setZIndexOffset(1000000); //Make these appear on top of EVERYTHING
				m.setOpacity(0);

				fg.addLayer(m);

				m._setPos(thisLayerPos);
			} else {
				//Vectors just get immediately added
				fg.addLayer(m);
			}
		}

		group._forceLayout();
		group._animationStart();

		var initialLegOpacity = this.SVG_ANIMATION ? 0 : 0.3;

		for (i = childMarkers.length - 1; i >= 0; i--) {
			newPos = map.layerPointToLatLng(positions[i]);
			m = childMarkers[i];

			//Move marker to new position
			m._preSpiderfyLatlng = m._latlng;
			m.setLatLng(newPos);

			if (m.setOpacity) {
				m.setOpacity(1);
			}

			//Add Legs. Force the SVG renderer so we can animate
			leg = new L.Polyline([me._latlng, newPos], { weight: 1.5, color: '#222', opacity: initialLegOpacity });
			map.addLayer(leg);
			m._spiderLeg = leg;

			//Following animations don't work for canvas or browsers that don't support animated svg
			if (this.SVG_ANIMATION) {
				//How this works:
				//http://stackoverflow.com/questions/5924238/how-do-you-animate-an-svg-path-in-ios
				//http://dev.opera.com/articles/view/advanced-svg-animation-techniques/

				//Animate length
				var length = leg._path.getTotalLength();
				leg._path.setAttribute("stroke-dasharray", length + "," + length);

				var anim = document.createElementNS(xmlns, "animate");
				anim.setAttribute("attributeName", "stroke-dashoffset");
				anim.setAttribute("begin", "indefinite");
				anim.setAttribute("from", length);
				anim.setAttribute("to", 0);
				anim.setAttribute("dur", 0.25);
				leg._path.appendChild(anim);
				anim.beginElement();

				//Animate opacity
				anim = document.createElementNS(xmlns, "animate");
				anim.setAttribute("attributeName", "stroke-opacity");
				anim.setAttribute("attributeName", "stroke-opacity");
				anim.setAttribute("begin", "indefinite");
				anim.setAttribute("from", 0);
				anim.setAttribute("to", 0.3);
				anim.setAttribute("dur", 0.25);
				leg._path.appendChild(anim);
				anim.beginElement();
			}
		}
		me.setOpacity(0.3);

		//Set the opacity of the spiderLegs back to their correct value
		// The animations above override this until they complete.
		// If the initial opacity of the spiderlegs isn't 0 then they appear before the animation starts.
		this._group._forceLayout();

		for (i = childMarkers.length - 1; i >= 0; i--) {
			m = childMarkers[i]._spiderLeg;

			m.options.opacity = 0.5;
			m._path.setAttribute('stroke-opacity', 0.5);
		}

		group._ignoreMove = false;

		setTimeout(function () {
			group._animationEnd();
			group.fire('spiderfied');
		}, 200);
	},

	_animationUnspiderfy: function (zoomDetails) {
		var group = this._group,
			map = group._map,
			fg = group._featureGroup,
			thisLayerPos = zoomDetails ? map._latLngToNewLayerPoint(this._latlng, zoomDetails.zoom, zoomDetails.center) : map.latLngToLayerPoint(this._latlng),
			childMarkers = this.getAllChildMarkers(),
			m, i, a;

		group._ignoreMove = true;
		group._animationStart();

		//Make us visible and bring the child markers back in
		this.setOpacity(1);
		for (i = childMarkers.length - 1; i >= 0; i--) {
			m = childMarkers[i];

			//Marker was added to us after we were spidified
			if (!m._preSpiderfyLatlng) {
				continue;
			}

			//Fix up the location to the real one
			m.setLatLng(m._preSpiderfyLatlng);
			delete m._preSpiderfyLatlng;
			//Hack override the location to be our center
			if (m.setOpacity) {
				m._setPos(thisLayerPos);
				m.setOpacity(0);
			} else {
				fg.removeLayer(m);
			}

			//Animate the spider legs back in
			if (this.SVG_ANIMATION) {
				a = m._spiderLeg._path.childNodes[0];
				a.setAttribute('to', a.getAttribute('from'));
				a.setAttribute('from', 0);
				a.beginElement();

				a = m._spiderLeg._path.childNodes[1];
				a.setAttribute('from', 0.5);
				a.setAttribute('to', 0);
				a.setAttribute('stroke-opacity', 0);
				a.beginElement();

				m._spiderLeg._path.setAttribute('stroke-opacity', 0);
			}
		}

		group._ignoreMove = false;

		setTimeout(function () {
			//If we have only <= one child left then that marker will be shown on the map so don't remove it!
			var stillThereChildCount = 0;
			for (i = childMarkers.length - 1; i >= 0; i--) {
				m = childMarkers[i];
				if (m._spiderLeg) {
					stillThereChildCount++;
				}
			}

			for (i = childMarkers.length - 1; i >= 0; i--) {
				m = childMarkers[i];

				if (!m._spiderLeg) { //Has already been unspiderfied
					continue;
				}

				if (m.setOpacity) {
					m.setOpacity(1);
					m.setZIndexOffset(0);
				}

				if (stillThereChildCount > 1) {
					fg.removeLayer(m);
				}

				map.removeLayer(m._spiderLeg);
				delete m._spiderLeg;
			}
			group._animationEnd();
		}, 200);
	}
});

L.MarkerClusterGroup.include({
	//The MarkerCluster currently spiderfied (if any)
	_spiderfied: null,

	_spiderfierOnAdd: function () {
		this._map.on('click', this._unspiderfyWrapper, this);

		if (this._map.options.zoomAnimation) {
			this._map.on('zoomstart', this._unspiderfyZoomStart, this);
		}
		//Browsers without zoomAnimation or a big zoom don't fire zoomstart
		this._map.on('zoomend', this._noanimationUnspiderfy, this);

		if (!L.Browser.touch) {
			this._map.getRenderer(this);
			//Needs to happen in the pageload, not after, or animations don't work in webkit
			//  http://stackoverflow.com/questions/8455200/svg-animate-with-dynamically-added-elements
			//Disable on touch browsers as the animation messes up on a touch zoom and isn't very noticable
		}
	},

	_spiderfierOnRemove: function () {
		this._map.off('click', this._unspiderfyWrapper, this);
		this._map.off('zoomstart', this._unspiderfyZoomStart, this);
		this._map.off('zoomanim', this._unspiderfyZoomAnim, this);

		this._unspiderfy(); //Ensure that markers are back where they should be
	},

	//On zoom start we add a zoomanim handler so that we are guaranteed to be last (after markers are animated)
	//This means we can define the animation they do rather than Markers doing an animation to their actual location
	_unspiderfyZoomStart: function () {
		if (!this._map) { //May have been removed from the map by a zoomEnd handler
			return;
		}

		this._map.on('zoomanim', this._unspiderfyZoomAnim, this);
	},
	_unspiderfyZoomAnim: function (zoomDetails) {
		//Wait until the first zoomanim after the user has finished touch-zooming before running the animation
		if (L.DomUtil.hasClass(this._map._mapPane, 'leaflet-touching')) {
			return;
		}

		this._map.off('zoomanim', this._unspiderfyZoomAnim, this);
		this._unspiderfy(zoomDetails);
	},

	_unspiderfyWrapper: function () {
		/// _unspiderfy but passes no arguments
		this._unspiderfy();
	},

	_unspiderfy: function (zoomDetails) {
		if (this._spiderfied) {
			this._spiderfied.unspiderfy(zoomDetails);
		}
	},

	_noanimationUnspiderfy: function () {
		if (this._spiderfied) {
			this._spiderfied._noanimationUnspiderfy();
		}
	},

	//If the given layer is currently being spiderfied then we unspiderfy it so it isn't on the map anymore etc
	_unspiderfyLayer: function (layer) {
		if (layer._spiderLeg) {
			this._featureGroup.removeLayer(layer);

			layer.setOpacity(1);
			//Position will be fixed up immediately in _animationUnspiderfy
			layer.setZIndexOffset(0);

			this._map.removeLayer(layer._spiderLeg);
			delete layer._spiderLeg;
		}
	}
});

}(window, document));


TeamCity LabkeyTrunk :: Git postgres 9.4 [Build 604](https://teamcity.labkey.org/viewLog.html?buildId=271792&buildTypeId=LabkeyTrunk_GitPostgres) outcome was **FAILURE**
Summary: Tests failed: 30, passed: 9 Build time: 00:25:08
### Failed tests
```
org.labkey.test.tests.CDSTest.verifyFilterDisplays: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyGrid: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyGroups: <no details avaliable>

org.labkey.test.tests.CDSTest.testLearnAboutStudyProducts: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyFilters: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyGridColumnSelector: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyHomePage: <no details avaliable>

org.labkey.test.tests.CDSTest.clickOnLearnAboutStudyItem: <no details avaliable>

org.labkey.test.tests.CDSTest.verifyGridCheckerboarding: <no details avaliable>

org.labkey.test.tests.CDSTest.clickOnLearnAboutStudyProductsItem: <no details avaliable>

org.labkey.test.tests.CDSTest.testLearnAboutStudies: <no details avaliable>

##### there are 20 more failed tests, see build details
```


我明明写的有editorconfig，你们的编辑器都不支持？


之前为了方便修改 都是单独写的...路径那些还没仔细调整...Orz


There are only 3 button in the index and I set 15, so it didn't work


Rename file in public/.htaccess before use this configuration.


I also changed the source of the tile images in the map file.


Try not to add new features in an existing PR / branch. You should use another new branch, otherwise it's very hard for the reviewer to keep track of fixes and new changes.


My main goal with coding is always maintainability... I didn't need to support slow processors. But maybe the "only if you moved or changed light items" code can be copied to the globalstep function.

So do you want to join the code tree so it's easier to merge features?

For git reasons, I already made a branch with our common unpacked 0.6 with your changes only, called myoung008 (and just pushed it to github). https://github.com/petermaloney/walking_light/tree/myoung008. So that way the code is the same but git understands how to cherry pick, merge, etc.

And for code reasons, what can we do so I can keep functions, and you can keep inlining everything but it can merge easily still? (merging your code to my master branch was lots of manual work... merge tools had no idea how to work properly, showing me "changes" in 2 different functions as if they are the same line of code)


Have you tested these changes against all of the listed playlists, in the PR?


変数 `bmi` に `w / h ^ 2` という式を束縛している


hhomo


Use JavaDoc for opening the comment /**


Use */ to end the comment


Do so for all method-level comments.


Se reubican los códigos de los Generadores al interior de la carpeta Taller1_Generadores_de_números_Pseudoaleatorios.


Это не правильное изменение. Не хочу подсказывать, попробуй сначала разобраться сам.


WHY would you not check the version instead of the mod name? :/

https://github.com/Chisel-Team/Chisel/issues/18


You do realize in 99% of the provider code we don't verify the SSL cert anyway....

Would you prefer ```requests.packages.urllib3.disable_warnings(InsecureRequestWarning)```?

Or is it that I'm disabling insecure warnings all together?

The problem stems from sites that either
a) weird root ca signed certs.
b) expired cert.
c) self signed.

urllib3 triggers a warning if it can't verify the cert... refer https://urllib3.readthedocs.org/en/latest/security.html#insecurerequestwarning

Tell me what your issue is and I'll try work with you to resolve.


変数 bmi は `|` より前と定義した let より後ろがスコープの範囲。

```haskell
bmi | (w, h) <- xs, let bmi = w / h ^ 2
```

この場合 `(w, h) <- xs` の部分は `bmi` という変数より前に定義されているので `bmi` を見ることができない。
`(w,h) <- xs`  は **ジェネレータ** と呼ばれる


I don't think you thought this through


I don't think that strings.xml, menu_main.xml or activity_main.xml are relevant for this tutorial. Remove from overview.xml


Capitalize "Android"


Hallo,

ich setzet diesen hier ein (http://www.amazon.de/gp/product/B00G8BLET6?psc=1&redirect=true&ref_=oh_aui_detailpage_o05_s00). Mit sehr gutem Ergebnissen. Einen anderen habe ich aus einer Wetterstation LogiLink WS0001 (https://www.pollin.de/shop/dt/MzI0OTYxOTk-/Haustechnik/Wetterstationen_Thermometer/Funk_Wetterstation_LOGILINK_WS0001.html). Dieser ist auch gut.

Den ersten Empfänger den ich hatte, kann man vergessen (http://www.amazon.de/gp/product/B00KHJB5BC?psc=1&redirect=true&ref_=oh_aui_detailpage_o03_s00). Da muß der Sender schon daneben stehen.

Jörg


@jigkoxsee อันนี้คือไรอะ


ehm ... pushoff is unsigned, right?


Fix indentation.


ok sorry.
Was half way through. will create new branch.

> On Sep 13, 2015, at 4:38 PM, Harry Chen <notifications@github.com> wrote:
>
> Try not to add new features in an existing PR / branch. You should use another new branch, otherwise it's very hard for the reviewer to keep track of fixes and new changes.
>
> —
> Reply to this email directly or view it on GitHub <https://github.com/WDI-HK-8/VALA-app-valet/commit/2a89a31ee3d4247e807d8ce10c07c3e5068f5965#commitcomment-13200028>.
>


我又来问了，一个demo项目上PG, 图啥？


Yeah, I have comments that I'll leave once I get up in the morning.

On Sat, Sep 12, 2015, 18:26 Jaka Hudoklin <notifications@github.com> wrote:

> @edolstra <https://github.com/edolstra> I think you should write policy
> how packages should be organized. Currently there's a bit of confusion.
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/NixOS/nixpkgs/commit/d0179b917ee24e4735051f06a65c908d622c7a96#commitcomment-13199197>
> .
>


Hola, Comparto lo que hice para sacar solo el envío de dos días

foreach ($respuesta->costos as $pproducto )
{
    if($pproducto->producto == "2 Dias"){
		$envios += $pproducto->costo_total;
	}
}


What is this different from validateName?


and regarding the clear+air vs just air thing... I noticed lots of bugs like:
- light isn't removed ... unknown why, but code was bad, many copies of similar code with different bugs, so that seemed fixed with my one consistently used function
- cobblestone was sometimes placed on top of blocks, destroying them, like the travelnet elevator and teleporters (especially on logout+login I think, or maybe that was a bug I added and removed later)

so I could also try and see if I can remove the clear block code without these coming back.

and regarding the "why not one brighter light", the game has a max light that is very low (13 or 14; you can see it used at 13 in walking_light), and if you set a light higher than the max, it sorta works but not like in real life... and when you remove the light, it leaves behind the extra light above the max. (like if max is 14 and you set 20, then remove the torch, you might have 6 light still.) And light in real life goes infinite distance but is dimmer proportional to the square of the distance... minetest doesn't do that. It has a fixed distance, so a super bright light would never light up more of the area. So without modifying the C++ of minetest itself, I could only add multiple light points (which on our server with 3 players, is perfectly fine... lights up huge holes made using the technics mod quarry for example, but was very slow before I used the 'align to grid' idea so the light doesn't move every square you walk). And it seems that every attempt people try to add such proper physics to minetest is rejected by the team since it would require proper video cards, etc. to use shaders for that, and apparently they have a goal to support really weak machines. (does your kid's slow machine have at least a decent low end video card?  the slowest I tested is a Radeon HD 6770 passed through to a linux virtual machine)


Looks good :)


结合着看 d529ba5cb45c14acc4d3440745ad15886e3ba4af 和这个 commit, 我建议把 http://ruby-doc.org/gettingstarted/ 挑着读一遍， http://guides.rubyonrails.org/ 完整看一遍，不然这种坑以后还会继续栽。

另外，如果你有写单元测试，就算犯一些人之常情的失误，至少不会 commit 到 github 上。万一哪天小孩少壮不努力长大学IT，还可能被小孩看到。


Yeah, looks all good.

Thanks for your contribution.


I'm pretty sure we had reasons :wink:


Agree, I think that the repository should validate only cases that cannot be handled by the api validator.


y si o si va a ser llamada solo de aca ya que es una declaracion. y declarar 2 veces seria algo muy "feo". además faltan para mi los comentarios doxygen de lo que hace la funcion. :)


An invalid request format could mean that any of the following data is parsed incorrectly (who knows if it was just a badly formatted header field or something else), with the risk of triggering bad behavior in either the HTTP server or at the application level. On the other hand I just see no value in supporting non-compliant HTTP implementations (if there would be a popular implementation that behaves oddly, that would be a reason, though).


/cc @eksperimental @Dignifiedquire @milmazz anything I should add/remove/change?


DONE


I think the way it's written now is much simpler. We'd have to check if it's CLI, if the ID is set *and* the Joomla! version. No point doing so :)


What if a number in config uses comma and current culture uses dot as a decimal separator? In this case neither invariant nor current culture will handle this number.


not sure i follow here - firstly there is no `options` in local scope. At least currently there is no delete defined in the kwargs "options". Also kwargs use dict attributes.

What was the correction?


Will bump version to 0.2 with your changes :-)


... In favor of `:extras` (`mix.exs`), in the command-line is `--extra` or `-e` (can be specified multiple times)


See #17 :)


Nit: we're most likely losing the sort order from `invoice.getPayments()` - should we re-sort the payments afterwards (so the UI doesn't have to do it)?


Thanks.
Yes, that sounds good. The code could do with some more documentation as well.

I don't have any other W1 devices but the ServiceLoader approach should allow adding new devices in library jars without adding to the core.

I'll have a look at the WatchService - should be relatively easy to implement.


Even if it's just one option do you prefer to use the `in`?... just taking notes :grin:


ボタンとラベルの追加でした。


Danger! Danger!


Will move to CONTRIBUTORS.txt if that's not a problem


I think adding two build files could be confusing to some users/developers, including myself. I wouldn't be able to maintain the build for sbt later on. So if you agree, will remove the build.sbt when merging.


mvn release:prepare && mvn release:perform will take care to update the version


@Noor-Ahsan, thanks for pointing this out. I've updated the PR accordingly.
Kindly review again.


Ok, I see your point, the `map` will absorb this, even if `config.extras` is empty :+1:


ouch, thanks. Hadn't notice we were using such an old version


Will fix spaces/tabs later after merging :-)


Did I have it wrong?
Le 13 sept. 2015 08:07, "Bozhidar Batsov" <notifications@github.com> a
écrit :

> Didn't @malabarba <https://github.com/malabarba> change the indentation
> spec here?
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/turbopape/cider/commit/39515d8e831f0e0672551e5faaea06e1ee187f56#commitcomment-13199796>
> .
>


I'm fine with both upper case or lower case. But any reason for this change? Did overthere change as well?


Nice catch!


Copy paste error :)


"then it mounts the ${POUDRIERED}/ports/default/category/port (nullfs) "

Is it correct? I think ${POUDRIERED}/ports/default/www/firefox (for example) doesn't mount.


Same here


Oh I remember @malabarba told me to load cider-utils.el before hitting
tabs, I probably forgot this in this commit. Do you want le to resubmit
after I do that ?
Le 13 sept. 2015 10:19, "Rafik NACCACHE" <rafik.naccache@gmail.com> a
écrit :

> Did I have it wrong?
> Le 13 sept. 2015 08:07, "Bozhidar Batsov" <notifications@github.com> a
> écrit :
>
>> Didn't @malabarba <https://github.com/malabarba> change the indentation
>> spec here?
>>
>> —
>> Reply to this email directly or view it on GitHub
>> <https://github.com/turbopape/cider/commit/39515d8e831f0e0672551e5faaea06e1ee187f56#commitcomment-13199796>
>> .
>>
>


Ok, reading this seems that it's recommended to use the pipeline operator whenever we can... Got it!

![pipelines](https://cloud.githubusercontent.com/assets/34700/9836039/f5e805d0-59ce-11e5-85a4-974162c5f134.jpg)


@josevalim I think we're ready to release :D can you think of anything that is missing?


Thanks for you review! Learning a lot in the process!


Thanks! Will probably add cpd, pmd, checkstyle, to work on duplication. Specially since we are creating so many strings, and evaluating commands' output.


Hi  @kevyin ! Your code looks great, thanks for fixing code duplication and a missing string/constant substitution.

I've added a few comments, please take your time to review as well.

Feel free to propose further changes, and let me know if you'd like to update the pull request, or if you prefer that I massage the code after it has been merged and we agreed on the changes.

All the best
Bruno


Rebased for final testing here:
https://github.com/bradymiller/openemr/commits/integrate-cqm-amc_3


Here is a screenshot showing the hangs/crashes of the **nabildanial-32cores** machine. The block 12 has been reaffected to patzak-7cores, but the original crashes were by nabildanial.
http://cassio.free.fr/divers/nabildanial-32cores.png


(list :modules modules-list)


`(list :modules modules-list)`


Still GitHub for Windows ships an outdated version of git. Most recent version of git being 2.5.2.2.


Is event type of Function correct here? How is it used?


Nice simplification :D


"Wooden Bridge" sounds more natural for the PlayerVisible string no?


kbd replaced with inline code spans in 1868a5cbc04674044486f8f61cf65389a351b6da.


3-space indentation :P
</Evil Lich Reviewer>


Mod names are not reliable or constant. They should not be used in such a way, this is broken.


Ah nevermind I think it's normal here :)


Yes.

On 13 September 2015 at 12:21, Rafik NACCACHE <notifications@github.com>
wrote:

> Oh I remember @malabarba told me to load cider-utils.el before hitting
> tabs, I probably forgot this in this commit. Do you want le to resubmit
> after I do that ?
> Le 13 sept. 2015 10:19, "Rafik NACCACHE" <rafik.naccache@gmail.com> a
> écrit :
>
>
> > Did I have it wrong?
> > Le 13 sept. 2015 08:07, "Bozhidar Batsov" <notifications@github.com> a
> > écrit :
> >
> >> Didn't @malabarba <https://github.com/malabarba> change the indentation
> >> spec here?
> >>
> >> —
> >> Reply to this email directly or view it on GitHub
> >> <
> https://github.com/turbopape/cider/commit/39515d8e831f0e0672551e5faaea06e1ee187f56#commitcomment-13199796
> >
> >> .
> >>
> >
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/turbopape/cider/commit/39515d8e831f0e0672551e5faaea06e1ee187f56#commitcomment-13200163>
> .
>

--
Best Regards,
Bozhidar Batsov

http://www.batsov.com


haha thanks @DizzyCode


Thanks, good catch!


Maybe add some links to the issues to provide some context?


@bep I changed the arg type to interface. Should I change the test function too by testing differrent inputs?


vddfdv


I like `in` here because it means we may support other formats in the future. :D Otherwise `==` is the way to go. :)


s/do net exists/does not exist/


Same here


I wasn't aware it was possible to do that. So yes your solution is better.
I'll do the test on Altera and Lattice designs to see if all toolchains are able initializing flipflop to value different from zero.


Shouldn't this be multiplied by CLAIMED_VALUE_PER_TILE in theory?


+ intégration du template createSociety


I don't like a single pipeline. So I either remove it or make it grow a bit :P


Good core functionality, concentrate on some interface work and design


Bit strange that you committed the node test, it's basically a quick / very hacky demo blurb of code!


删除不需要的配置文件


Or else please fix this for me, it should say `"UnrecognizedIPv6Option"` (code 2).


Looking at it now, I think maybe this should just raise an error or return #f.


啊啊啊


中兄次之


1k!
1024th commit :)


阿斯达是的


[Chrome 45 launches without NPAPI plugin support](http://www.ghacks.net/2015/09/02/chrome-45-launches-without-npapi-plugin-support/)
Doesn't work for Chrome 45.


def duplicates(a):
    return len(a) != len(set(a))


This commit should not contain this file.


Congratulations @Dignifiedquire, @milmazz and @eksperimental! YOU DID IT! :D


Code looks good, though I'll admit I skipped through the RoomBridgeWooden code after having read the RoomBridge one; proofreading takes long! :-O


看来 @Anticristum 还需要 @hqythu 多多调教啊


I think we may need a DSL to tag this situation. e.g. `bottle :stop` or something.


撒大声地啊


去把 rails 的 guides 看一遍再继续写吧，不然在部署到生产环境那一步，你要在这儿栽坑。
除非，你有啥秘密武器准备用在这个地方.


aaa


> It will be the length of first test vector, but capped to 8

Sorry, that was not correct. The length will be the format's max. length, but capped to 8. How could that ever end up as zero?


@improvi Thank you for your help. It seems you have written the code but the default image needs to be 100% optional. All must do is be set only if specified just before the image download is started.


Fixed in f832cbf8b763d2f482b1706b437552bae6522ee2, which makes the APIs that WinPcap offers for OID get/set request operations a little cleaner (no need to fill in a PACKET_OID_DATA structure).


Partially tested with limited checksumming:

Between gbsdb.0.0.93.txt and gbsdb.0.0.93-26-g35de6bc.txt, output changed for files:
(name, rom data crc32, output md5sum)
-"Adventures of Lolo"	0x022182b3	25a059d0c43d765fe35ffaa0f45011cb
+"Adventures of Lolo"	0x022182b3	941093e2cd706b1597c1737a24912991
-"Aladdin"	0x8c76fdd7	17dcdee69ac382ac08fc5c79b19cd6bb
+"Aladdin"	0x8c76fdd7	4f6acab31fae8e842e4ca9000981d5ad
-"Altered Space"	0xc9324078	48eba2cbff1db677799506ac7f3ea841
+"Altered Space"	0xc9324078	155a3929699c905ee522eab8778310ae
-"Animal Breeder"	0x21f94ee3	abf624ca92f7f91bb6f90c797053a46f
+"Animal Breeder"	0x21f94ee3	a1fce868de2ffe6673ce6adc2be5cd54
-"Batman"	0x14cfcbcf	3b80c1c53b17933f7176f5e723aa9af8
+"Batman"	0x14cfcbcf	aceee947bd29ac7d798833498c5e279a
-"Batman-Return of The Joker"	0x44d664eb	1f6bdd2d9d668ec3892a8e305167f59b
+"Batman-Return of The Joker"	0x44d664eb	3c4d53703d954fd1a0053d7f88731dce
-"Commander Keen"	0x19732cf3	62451565bbc9e3f7f858e5017b1ffb43
+"Commander Keen"	0x19732cf3	3e493ee5f7c5b367d492a0a2897aa0e4
-"Daffy Duck-The Marvin Missions"	0x694e42a4	450dff797d7ae918882cc864d42e3698
+"Daffy Duck-The Marvin Missions"	0x694e42a4	2856b469833842242bc3dc2a1c82cba2
-"Donkey Kong Land"	0x52c76e02	ac3c4ee73d76e7a94ed59b9df2f14014
+"Donkey Kong Land"	0x52c76e02	c23cb4efc429c257e1a5167bb681b84e
-"Duck Tales 2"	0xfa8809cf	34858e21c495a161336adfd392dbab32
+"Duck Tales 2"	0xfa8809cf	6ab3b2978ce271d6085fbe8ee5926c6c
-"Furai no Siren"	0x8af0c3d5	8d0b54834e14a2a47ccca4213c587af5
+"Furai no Siren"	0x8af0c3d5	d29b227e8dd1e4436e51b9ae47564cb6
-"Grandia - Parallel Trippers"	0xb922bbd9	8be8c28e5d1618de308d0409983dd8c9
+"Grandia - Parallel Trippers"	0xb922bbd9	0e9fbab96cdabea3b5ee9712319aa4f8
-"Gremlins 2-The New Batch"	0x11c323bc	0739dd7fff96a5121509056fe93437ee
+"Gremlins 2-The New Batch"	0x11c323bc	6e69c2b4a48337d2137dd595a6d3706c
-"Kirby's Dream Land 2"	0x4d1f5b06	c95a9877bb735f2b3928bf4e7531a51b
+"Kirby's Dream Land 2"	0x4d1f5b06	9575b1c65b2c94c3ff7ca2f75fbd5eda
-"Kirby's Dreamland"	0xd71ad649	acdf8823037680c381aede983113a0be
+"Kirby's Dreamland"	0xd71ad649	947d913fc5c67f06407311556bbce22c
-"Mega Man 2"	0x85885b54	d084afdc8312bd420e502d1a685008f3
+"Mega Man 2"	0x85885b54	a98a5166af7414d0ee4c916f7195a7c8
-"Metal Gear Solid"	0x22bc6c82	2a95c264c60dd492b015b816ca267d7d
+"Metal Gear Solid"	0x22bc6c82	7bfec166fe94bc0ed57f76ef327f0654
-"Pokemon Blue"	0x4c00cbbd	cabf87eff283b437e604a09d57b4e818
+"Pokemon Blue"	0x4c00cbbd	ec4fc33cb8a401a5f6f1b98fa0fe281b
-"Pokemon Trading Card Game"	0x8c76eb5a	785d5cf3a96d185565ef499cdff53ab5
+"Pokemon Trading Card Game"	0x8c76eb5a	92eb296e7487b532efe18f29ac8881df
-"Rolan's Curse 2"	0xb7e81892	0a47ebfede043616a1f02bc022a873aa
+"Rolan's Curse 2"	0xb7e81892	d12684809bd7601e1949f3798406ca65
-"Rolan's Curse"	0xe1e2b075	07baed5ff62b3102d80ad4bd6a8a969f
+"Rolan's Curse"	0xe1e2b075	4d78fdece7b92fb2f9c2e88c3a35cf9f
-"Super Mario Land 3-Wario Land"	0x9b3b7f84	8c1ee8f953d4570b622839d29200b2b6
+"Super Mario Land 3-Wario Land"	0x9b3b7f84	d41d8cd98f00b204e9800998ecf8427e
-"Tiny Toon Adventures 2"	0x760808d6	35fe0e592dae4b2dd939d9e2ba67c362
+"Tiny Toon Adventures 2"	0x760808d6	4a03c28d5d5611ddd47de7e7fcc8243e
-"Trip World"	0xb844910f	158c44a3599f68322d5dede3107c5f30
+"Trip World"	0xb844910f	c52d1471d19effcdefd96e573b716fc7
-"Wonders"	0x97d6687d	58801b0002d18b1f972af46f8999a955
+"Wonders"	0x97d6687d	7e2e78bbd7ad6282aea474e0d04ab829


should always be = a->get_r() + b->get_r() yeah?


Yeah looks good!


Can I ask for the reason of this perm network? Since we got mod checking now we no longer need this...


Why?


You should change the Language mark, from Lokalize.


Woops, sorry about that. I had noticed that quadratic-character as I wrote the docs that used that return type and figured being more precise with the types wouldn't hurt.

Shall I make the type an Integer or the union?


Just noted that I missed that. Sorry, will fix it now.


@reshama I looked at the student's example you sent me and I was able to do Q6 again, but modified the student's code slightly. I added the key if it did not exist and appended to the current key if it does exist. Is this an alternative to the 'defaultdict' option?

You can see my ipython notebook here:

https://github.com/jkeung/dsp/blob/master/python/Question%206%20Dictionary%20from%20CSV.ipynb


Ok I've fixed it, I would love to hear the full explanation as to why this isn't good practice however!


seems my benchmark cnf is quite sensitive to ```var_decay``` which is driven by line 961. Original value of ```num_conflicts``` when var_decay is bumped was 500, now it has value ```0xfff``` == 4095.
I changed 0xfff to 0x1ff is my benchmark slowed down back to its previous numbers.


Ok


hows about you use some of that reference params we learned about :stuck_out_tongue_winking_eye:
Circle &a, Circle &b
This will remove the need for the ampersands in the calling code.


curious if it can introduce regression for other users.


Done and understood!


Lol this is a c++ thing that's not in c, right? Whoops got too used to c I guess


Oops! fixed it.
I've had a tendency to do this haven't it....


This passes editorial review.


maybe wrong spell = 7973 and right spell 79733
source: http://www.wowhead.com/npc=3051
``` sql
UPDATE `smart_scripts` SET `action_param1`=79733 WHERE `entryorguid`=3051 AND `id`=0 AND `source_type`=0
```


I am not sure what you meant by this. I will have to wait and ask you in person.


And a fix to the previous fix in 426e936aaa97d0bf631e6f12011f8e1361c67195.


Thank you. And could you please confirm whether I understood the true
meaning of mc variable:
Is this a position of the move in the current move ordering?

On Mon, Sep 14, 2015 at 1:29 AM, VoyagerOne <notifications@github.com>
wrote:

> Good luck on your first test...
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/IIvec/Stockfish/commit/99b41ce4594b5dfde4595ae648562fe099da156a#commitcomment-13203172>
> .
>

--
IQ World <http://www.ultimaiq.net/>


To be honest, we do need span.nbsp. Left span.nbsp inside and merged this.


Edge case:

oci8po solution produce incorrect result in this case:
```sql
SELECT * FROM users WHERE user_code = 'ABC?DEF-QUESTIONMARK-'
```


Yes.
mc means moveCount


So something we don't want to bottle would be `keg_only`, right? :trollface:


C is out man, gotta get into the C++ mindset, then later python and beyond...


do you really review all this? well open up an issue for it, so it can be fixed


Remove this zero arg constructor and try to compile. It will give you very crazy errors that don't seem to say "you need a zero arg constructor for this class".


develop (mjwitte) - x86_64-Linux-Ubuntu-14.04-gcc-4.8-IntegrationCoverage-Debug: OK (1330 of 1330 tests passed)

![Build Badge](http://img.shields.io/badge/build%20status-passing-green.svg) ![Test Badge](http://img.shields.io/badge/tests%20passed-100.0%25-green.svg) ![Coverage Badge](http://img.shields.io/badge/coverage%20status-70.2%25-green.svg)


talking stuff in pushed commits in totally unneeded - open a new ticket, or noone will ever fix it


Oddly enough, it did compile all the way until I needed to make the array of circles in the all_circles class. But yeah, it was a butt when I added that code


Приведу к одному формату


@sasrin I've pushed the changes to one of my dev forks there: https://github.com/jsdelfino/d-abacus/commit/ae52c0df7729a612d59c6dab5af95c823e09aa37. Let me know what you think.


why...


Can you re-do the exercise without using `==`, `===`, `!=`, `!==`. Remembering that truthy values are values that convert to `true`


А все согласны его использовать?
Я не возражаю (хотя и не со всем согласен), просто я CSS не хочу заниматься, но важно чтобы все были согласны.


lol no idea hahahaha


A few times for this assignment. What is the commit ID that fixes this please?


17 is a magic number? Make it a constant with a reasonable name


Guessing this is a bunch of GUI stuff that you copied and pasted...


don't use file for a variable name, it's a keyword!


Alright, let me know when you push again and I'll take a look. From the looks of things, it looks like there's much to be done :stuck_out_tongue_closed_eyes: but this is good progress.


Basically - I do understand what's going on, but if I needed to write it up on my own I'd spend a while figuring out how to do it again...


Permissions on the client != mod checking.


Cool! Thanks for looking through all of this code. Yeah, a lot of work still to be, but the framework is there now so a lot of what remains isn't so bad.


So Math.max() expects a set in its brackets... but you can't just pass it an array reference, you have to actually list the items. Unless you something like .apply() which passes all the items of an array into whatever arg you assign it into.
Conversely, a even easier way I just found is by using the SPREAD OPERATOR!
var arr = [1, 2, 3];
var max = Math.max(...arr);

spread operator ... will essentially PASTE in all the values of an array for you into the place of ...arr
powerful stuff


& не лишние, в оригинале есть


LGTM


@jkeung do you mean Q6 or Q2?


I will go over the details tomorrow but in short, in JavaScript mostly everything is an object -- meaning it can have name/value pairs. Here is a tonicdev notebook explaining this:

https://tonicdev.com/ziad-saab/for-in-arrays


This should be:

{{ invitedUser | displayName }}


Hehe, I am glad I never found a level 17 (Elite?) Deviate Viper inside the Venture Co. mine in Mulgore alongside Supervisor Fizsprocket in the 3.3.5 branch. Would have freaked me completely out, at least the first time. :smiling_imp:


Please use some type of return statement here to prevent having such a massive else case


@neobuddy89 must have been very proud.. **sniff**


Cool stuff. The spread operator is nice, but it's an upcoming feature. Next week if we have time I'll show a demo of how to use some of the upcoming features of ES6 right now, and explain the pitfalls.

Regarding the `.apply`, OK. I'd like to try something. If I ask you to read this [Function.prototype.bind](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind) would you be able to read this page of documentation and tell me what's going on in it? Have fun!


I don't see any kind of sleep happening.  Adding a simple call to `Sleep(0);` somewhere in your loop will drastically reduce the amount of CPU usage.


I've made the tweaks on my side. I just need you to look into a failing test before I can merge:

    SpawnProcessTaskSpec."should not write the pid lock file if the process exits abnormally"


@reshama Question6 in Python Advanced


opened https://github.com/TheLudd/mocha-gwt/issues/8 against mocha-gwt to see if we can get it browser-compatible (underlying issue might be with mocha itself, unsure)


take your time.

Meanwhile pwmgen-v2 is instantiable. v2 pins are the last thing left.

I played with jitter-correction; the new funct API passes actual period besides nominal. I added a pin jitter-correct which will tell make_pulses() to use the actual instead of the nominal period for updating timers.

In theory that would generate a less noisy PWM signal, I'll see if I can FFT that on some box with/without correction. On vbox it is clearly visible in halscope; if it is actually an improvement is to be seen.

But that enables something else as well, namely experiment with throwing a core at a particular job. What we can do now is this:

   `newthread busy 1000 posix nowait cpu=2`

this thread busy loops through the thread function, and it's a non-RT thread. So it doesnt have a `cycle time` (the period parameter is ignored if the nowait flag is given),  it would just loop.. and still pass actual times to the thread funct; and if the comp can make use of actual time, this might actually work better than a cyclic RT thread for this type of job.

But that's just the theory, we'll find out. Who knows, maybe soft stepping is back ;) AAARGH


This is a cool feature in es2015 called "Enhanced Object Literals". In this, you can create your functions as above.


You probably don't want to return 0 in this case anyway.  Consider:
```
std::cerr << "Failed to initialize!\n";
return 10;
```


This commit Closes #6168


oh ok!


I think better to create an interface within the module than the global namespace: http://goo.gl/rpr2Vn


I see what you mean. I think that's a very personal thing though. Its exactly the same except the order of operation is reversed.


@jkeung
OK, looks good.
defaultdict is an alternative.  not necessary for this exercise, but good to read up on since it will be helpful for exercises in the bootcamp.


OK, I'm more optimistic about LTC test. I hope that STC test will be
succesful enough to try LTC also.
I guess I should first pass STC to try LTC. Am I right?

On Mon, Sep 14, 2015 at 2:18 AM, VoyagerOne <notifications@github.com>
wrote:

> Yes.
> mc means moveCount
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/IIvec/Stockfish/commit/99b41ce4594b5dfde4595ae648562fe099da156a#commitcomment-13203401>
> .
>

--
IQ World <http://www.ultimaiq.net/>


ok


It's not mocha's fault. I configured a custom UI fine (and -given set one)
On Sun, Sep 13, 2015 at 20:38 Jason Karns <notifications@github.com> wrote:

> opened TheLudd/mocha-gwt#8 <https://github.com/TheLudd/mocha-gwt/issues/8>
> against mocha-gwt to see if we can get it browser-compatible (underlying
> issue might be with mocha itself, unsure)
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/testdouble/testdouble.js/commit/17abbda3ae06e87402e27dce5c1e86556d57d0f2#commitcomment-13203514>
> .
>


wonderful,I never used keyword async and await.
where you learn the knowledge about this?
I have seen some article on msdn like this
https://msdn.microsoft.com/en-us/library/hh191443(v=vs.110).aspx


yikes! Thanks for the heads up.


Ok, is cool!


Oh ok!


Can you point to the main change in the package.
Also if there's an issue you can always raise it on the [lodash issue tracker](https://github.com/lodash/lodash/issues).


:beers:


"Now is not possible to* fight *in perpendicular direction to forward
vector."  We are building a fight computer game. I want my character to me
Mandel_Man, protector of the universe with unlimited super powers and
health. Sebastian can be my turtle with some pretty cool super powers too!.
LOL

On Mon, Sep 14, 2015 at 7:55 AM, Krzysztof Marczak <notifications@github.com
> wrote:

> I'm not sure if this change is good. Now is not possible to fight in
> perpendicular direction to forward vector. For instance you will be not
> able to go left (only 45 degrees left, not 90 degrees). What you think to
> add use of SHIFT button to switch between use forward vector as initial
> value or not? With shift it can go left/right/top/bottom without moving
> forward.
>
> —
> Reply to this email directly or view it on GitHub
> <https://github.com/buddhi1980/mandelbulber2/commit/65c251165c8e0f53d363e258066a45124edfa638#commitcomment-13202305>
> .
>


_URL_ import dialog, sigh.


왜 대문자로 바꿔요


@reshama Thanks!


Thanks, that helps.  This fix, that I haven't tested yet, would explain why the SWCAN never turns on as it would have been sent 0xF1 instead of 0x10 or 0xFF