{"version":3,"sources":["webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/classCallCheck.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/createClass.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/createForOfIteratorHelper.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/slicedToArray.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack:///./node_modules/babel-preset-react-app/node_modules/@babel/runtime/regenerator/index.js","webpack:///./node_modules/d3/d3.js","webpack:///./node_modules/moment/moment.js","webpack:///./node_modules/pikaday/pikaday.js","webpack:///./node_modules/regenerator-runtime/runtime.js","webpack:///(webpack)/buildin/module.js"],"names":["_arrayLikeToArray","arr","len","length","i","arr2","Array","asyncGeneratorStep","gen","resolve","reject","_next","_throw","key","arg","info","value","error","done","Promise","then","_asyncToGenerator","fn","self","this","args","arguments","apply","err","undefined","_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","descriptor","enumerable","configurable","writable","Object","defineProperty","_createClass","protoProps","staticProps","prototype","_createForOfIteratorHelper","o","Symbol","iterator","isArray","F","s","n","e","_e","f","it","normalCompletion","didErr","step","next","_e2","_slicedToArray","_arrayWithHoles","_iterableToArrayLimit","_arr","_n","_d","_s","_i","push","unsupportedIterableToArray","_nonIterableRest","_toConsumableArray","_arrayWithoutHoles","arrayLikeToArray","_iterableToArray","iter","from","_nonIterableSpread","_unsupportedIterableToArray","minLen","toString","call","slice","constructor","name","test","module","exports","d3","version","d3_arraySlice","d3_array","list","d3_document","document","d3_documentElement","node","ownerDocument","documentElement","d3_window","defaultView","childNodes","nodeType","array","Date","now","createElement","style","setProperty","d3_element_prototype","Element","d3_element_setAttribute","setAttribute","d3_element_setAttributeNS","setAttributeNS","d3_style_prototype","CSSStyleDeclaration","d3_style_setProperty","space","local","priority","d3_ascending","a","b","NaN","d3_number","x","d3_numeric","isNaN","d3_bisector","compare","left","lo","hi","mid","right","ascending","descending","min","max","extent","c","sum","mean","j","quantile","values","p","H","h","Math","floor","v","median","numbers","sort","variance","d","m","deviation","sqrt","d3_bisect","d3_transposeLength","bisectLeft","bisect","bisectRight","bisector","shuffle","i0","i1","t","random","permute","indexes","permutes","pairs","p1","transpose","matrix","row","zip","keys","map","entries","merge","arrays","merged","abs","d3_range_integerScale","k","d3_class","ctor","properties","d3_Map","_","create","range","start","stop","Infinity","Error","object","forEach","set","d3_map_escape","d3_map_unescape","d3_map_has","d3_map_remove","d3_map_keys","d3_map_size","size","d3_map_empty","d3_Set","d3_identity","d3_rebind","source","method","d3_vendorSymbol","charAt","toUpperCase","d3_vendorPrefixes","prefixName","has","get","remove","empty","nest","sortValues","rollup","sortKeys","mapType","depth","keyValue","setter","valuesByKey","sortKey","keyMap","order","add","behavior","rebind","d3_noop","d3_dispatch","d3_dispatch_event","dispatch","listeners","listenerByName","event","l","z","on","listener","indexOf","concat","d3_eventPreventDefault","preventDefault","d3_eventSource","sourceEvent","d3_eventDispatch","of","thiz","argumentz","e1","e0","type","hasOwnProperty","requote","replace","d3_requote_re","d3_subclass","__proto__","property","d3_selection","groups","d3_selectionPrototype","d3_select","querySelector","d3_selectAll","querySelectorAll","d3_selectMatches","d3_selectMatcher","matches","Sizzle","matchesSelector","selection","select","d3_selection_selector","selector","d3_selection_selectorAll","subgroup","subnode","group","subgroups","parentNode","__data__","selectAll","d3_nsXhtml","d3_nsPrefix","svg","xhtml","xlink","xml","xmlns","d3_selection_attr","ns","qualify","attrNullNS","removeAttributeNS","attrNull","removeAttribute","attrFunctionNS","attrFunction","attrConstantNS","attrConstant","d3_collapse","trim","d3_selection_classedRe","RegExp","d3_selection_classes","split","d3_selection_classed","d3_selection_classedName","classedFunction","classedConstant","re","classList","getAttribute","lastIndex","d3_selection_style","styleNull","removeProperty","styleFunction","styleConstant","d3_selection_property","propertyNull","propertyFunction","propertyConstant","d3_selection_creator","createNS","createElementNS","namespace","namespaceURI","d3_selectionRemove","parent","removeChild","d3_selection_dataNode","data","d3_selection_filter","d3_selection_sortComparator","comparator","d3_selection_each","callback","d3_selection_enter","d3_selection_enterPrototype","prefix","attr","getAttributeNS","each","classed","contains","getComputedStyle","getPropertyValue","text","textContent","html","innerHTML","append","appendChild","insert","before","insertBefore","bind","groupData","nodeData","n0","updateNodes","enterNodes","exitNodes","nodeByKeyValue","keyValues","update","enter","exit","datum","filter","nextSibling","d3_selection_enterInsertBefore","j0","d3_selection_on","capture","wrap","d3_selection_onListener","d3_selection_onFilters","onRemove","removeEventListener","$","d3_selection_onFilter","onAdd","addEventListener","removeAll","match","upgroup","nodes","mouseenter","mouseleave","related","relatedTarget","compareDocumentPosition","d3_event_dragSelect","d3_event_dragId","d3_event_dragSuppress","click","w","suppressClick","off","setTimeout","mouse","container","d3_mousePoint","d3_mouse_bug44083","navigator","userAgent","changedTouches","ownerSVGElement","createSVGPoint","point","window","scrollX","scrollY","ctm","position","top","margin","padding","border","getScreenCTM","pageX","y","pageY","clientX","clientY","matrixTransform","inverse","rect","getBoundingClientRect","clientLeft","clientTop","d3_behavior_dragTouchId","identifier","touch","touches","drag","origin","mousedown","dragstart","touchstart","id","subject","move","end","dragOffset","that","correspondingElement","dragged","dragId","dragName","dragSubject","moved","ended","dragRestore","position0","dx","dy","position1","PI","d3_radians","d3_degrees","d3_sgn","d3_cross2d","d3_acos","acos","d3_asin","asin","d3_cosh","exp","d3_haversin","sin","SQRT2","interpolateZoom","p0","S","ux0","uy0","w0","ux1","uy1","w1","d2","log","d1","b0","b1","r0","r1","coshr0","u","d3_tanh","d3_sinh","duration","zoom","translate0","center0","center","mousewheelTimer","touchtime","x0","x1","y0","y1","view","scaleExtent","d3_behavior_zoomInfinity","zooming","mousemove","mouseup","g","mousedowned","d3_behavior_zoomWheel","mousewheeled","dblclicked","touchstarted","location","scaleTo","translateTo","zoomTo","__chart__","pow","transition","rescale","domain","invert","zoomstarted","zoomed","scale","translate","zoomended","location0","d3_selection_interrupt","scale0","locations0","distance0","zoomName","touchmove","touchend","targets","relocate","started","changed","LN2","q","l0","l1","distance1","scale1","clearTimeout","d3_behavior_zoomDelta","shiftKey","ceil","deltaY","deltaMode","wheelDelta","detail","view1","d3_transitionInheritId","tween","cx","cy","copy","d3_color","d3_hsl","d3_rgb_parse","d3_rgb_hsl","color","rgb","hsl","d3_hslPrototype","d3_hsl_rgb","m1","m2","vv","round","d3_rgb","d3_hcl","d3_lab_hcl","d3_lab","d3_rgb_lab","r","brighter","darker","hcl","d3_hclPrototype","d3_hcl_lab","cos","d3_lab_K","lab","d3_labPrototype","d3_lab_rgb","d3_xyz_rgb","d3_lab_xyz","atan2","d3_xyz_lab","d3_rgbNumber","d3_rgbString","d3_rgbPrototype","d3_rgb_hex","format","exec","toLowerCase","parseFloat","d3_rgb_parseNumber","d3_rgb_names","parseInt","d3_rgb_xyz","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","d3_functor","d3_xhrType","response","url","mimeType","d3_xhr","xhr","headers","request","XMLHttpRequest","responseType","respond","result","status","d3_xhrHasResponse","responseText","load","XDomainRequest","onload","onerror","onreadystatechange","readyState","onprogress","progress","header","send","open","setRequestHeader","overrideMimeType","beforesend","abort","d3_xhr_fixCallback","functor","dsv","delimiter","reFormat","delimiterCode","charCodeAt","typedResponse","parse","formatRow","formatValue","join","parseRows","Function","JSON","stringify","eol","EOL","EOF","rows","N","I","token","formatRows","fieldSet","fields","field","csv","tsv","d3_timer_queueHead","d3_timer_queueTail","d3_timer_interval","d3_timer_timeout","d3_timer_frame","d3_timer","delay","time","timer","d3_timer_step","d3_timer_mark","d3_timer_sweep","isFinite","t0","t1","d3_format_precision","LN10","flush","d3_formatPrefixes","d3_formatPrefix","symbol","d3_locale_numberFormat","locale","locale_decimal","decimal","locale_thousands","thousands","locale_grouping","grouping","locale_currency","currency","formatGroup","width","substring","reverse","specifier","d3_format_re","fill","align","sign","zfill","comma","precision","suffix","integer","exponent","d3_format_types","d3_format_typeDefault","zcomma","fullSuffix","negative","unit","formatPrefix","after","lastIndexOf","String","fromCharCode","X","toPrecision","toExponential","toFixed","d3_time","d3_date","d3_date_utc","UTC","getDate","getUTCDate","getDay","getUTCDay","getFullYear","getUTCFullYear","getHours","getUTCHours","getMilliseconds","getUTCMilliseconds","getMinutes","getUTCMinutes","getMonth","getUTCMonth","getSeconds","getUTCSeconds","getTime","getTimezoneOffset","valueOf","setDate","d3_time_prototype","setUTCDate","setDay","setUTCDay","setFullYear","setUTCFullYear","setHours","setUTCHours","setMilliseconds","setUTCMilliseconds","setMinutes","setUTCMinutes","setMonth","setUTCMonth","setSeconds","setUTCSeconds","setTime","d3_time_interval","number","date","d0","offset","dt","times","utc","d3_time_interval_utc","range_utc","d3_locale_timeFormat","locale_dateTime","dateTime","locale_date","locale_time","locale_periods","periods","locale_days","days","locale_shortDays","shortDays","locale_months","months","locale_shortMonths","shortMonths","d3_time_format","template","string","d3_time_formatPads","d3_time_formats","M","L","Z","d3_time_parse","localZ","W","U","d3_time_parsers","multi","d3_time_formatMulti","d3_time_periodLookup","d3_time_dayRe","d3_time_formatRe","d3_time_dayLookup","d3_time_formatLookup","d3_time_dayAbbrevRe","d3_time_dayAbbrevLookup","d3_time_monthRe","d3_time_monthLookup","d3_time_monthAbbrevRe","d3_time_monthAbbrevLookup","A","B","d3_time_formatPad","dayOfYear","sundayOfYear","mondayOfYear","Y","d3_time_zone","d3_time_parseWeekdayAbbrev","d3_time_parseWeekday","d3_time_parseMonthAbbrev","d3_time_parseMonth","d3_time_parseLocaleFull","d3_time_parseDay","d3_time_parseHour24","d3_time_parseDayOfYear","d3_time_parseMilliseconds","d3_time_parseMonthNumber","d3_time_parseMinutes","d3_time_parseAmPm","d3_time_parseSeconds","d3_time_parseWeekNumberSunday","d3_time_parseWeekdayNumber","d3_time_parseWeekNumberMonday","d3_time_parseLocaleDate","d3_time_parseLocaleTime","d3_time_parseYear","d3_time_parseFullYear","d3_time_parseZone","d3_time_parseLiteralPercent","year","day","years","interval","week","sunday","weeks","weekOfYear","d3_time_numberRe","d3_time_percentRe","names","d3_time_expandYear","zs","zh","zm","formats","numberFormat","timeFormat","d3_locale_enUS","d3_adder","geo","d3_adderSum","d3_adderTemp","reset","bv","av","d3_geo_streamGeometry","geometry","d3_geo_streamGeometryType","stream","d3_geo_streamObjectType","Feature","feature","FeatureCollection","features","Sphere","sphere","Point","coordinates","MultiPoint","LineString","d3_geo_streamLine","MultiLineString","Polygon","d3_geo_streamPolygon","MultiPolygon","GeometryCollection","geometries","closed","coordinate","lineStart","lineEnd","polygonStart","polygonEnd","area","d3_geo_areaSum","d3_geo_area","d3_geo_centroidW0","d3_geo_centroidW1","d3_geo_centroidX0","d3_geo_centroidY0","d3_geo_centroidZ0","d3_geo_centroidX1","d3_geo_centroidY1","d3_geo_centroidZ1","d3_geo_centroidX2","d3_geo_centroidY2","d3_geo_centroidZ2","d3_geo_areaRingSum","d3_geo_areaRingStart","nextPoint","d3_geo_cartesian","spherical","d3_geo_cartesianDot","d3_geo_cartesianCross","d3_geo_cartesianAdd","d3_geo_cartesianScale","vector","d3_geo_cartesianNormalize","d3_geo_spherical","cartesian","d3_geo_sphericalEqual","bounds","ranges","bound","ringPoint","ringStart","ringEnd","linePoint","normal","inflection","antimeridian","angle","compareRanges","withinRange","best","centroid","d3_geo_centroid","d3_geo_centroidPoint","d3_geo_centroidLineStart","d3_geo_centroidLineEnd","d3_geo_centroidRingStart","d3_geo_centroidPointXYZ","z0","cz","d3_geo_compose","compose","d3_true","d3_geo_clipPolygon","segments","clipStartInside","interpolate","clip","segment","d3_geo_clipPolygonIntersection","d3_geo_clipPolygonLinkCircular","entry","points","current","isSubject","other","d3_geo_clip","pointVisible","clipLine","clipStart","rotate","line","rotatedClipStart","pointRing","polygon","d3_geo_pointInPolygon","meridian","parallel","meridianNormal","polarAngle","winding","ring","point0","arc","intersection","polygonStarted","d3_geo_clipSort","pointLine","buffer","d3_geo_clipBufferListener","ringListener","clean","ringSegments","pop","shift","d3_geo_clipSegmentLength1","lines","rejoin","d3_geo_clipAntimeridian","d3_geo_clipAntimeridianLine","d3_geo_clipAntimeridianIntersect","atan","d3_geo_clipAntimeridianInterpolate","to","direction","d3_geo_clipCircle","radius","cr","smallRadius","notHemisphere","visible","c0","v0","v00","point2","point1","code","intersect","d3_geo_circleInterpolate","two","n1","n2","n2n2","n1n2","determinant","c1","c2","n1xn2","uu","t2","polar","q1","d3_geom_clipLine","ax","ay","d3_geo_clipExtent","x__","y__","v__","x_","y_","v_","first","listener_","bufferListener","insidePolygon","wn","inside","a1","corner","comparePoints","ca","cb","d3_geo_conic","projectAt","d3_geo_projectionMutator","parallels","d3_geo_conicEqualArea","C","forward","clipExtent","output","valid","conicEqualArea","raw","albers","albersUsa","lower48Point","alaskaPoint","hawaiiPoint","lower48","alaska","hawaii","pointStream","lower48Stream","alaskaStream","hawaiiStream","d3_geo_pathAreaSum","d3_geo_pathAreaPolygon","d3_geo_pathBoundsX0","d3_geo_pathBoundsY0","d3_geo_pathBoundsX1","d3_geo_pathBoundsY1","d3_geo_pathArea","d3_geo_pathAreaRingStart","x00","y00","d3_geo_pathBounds","d3_geo_pathBoundsPoint","d3_geo_pathBuffer","pointCircle","d3_geo_pathBufferCircle","pointLineStart","lineEndPolygon","pointRadius","d3_geo_lengthSum","d3_geo_pathCentroid","d3_geo_pathCentroidPoint","d3_geo_pathCentroidLineStart","d3_geo_pathCentroidLineEnd","d3_geo_pathCentroidRingStart","d3_geo_pathContext","context","moveTo","lineTo","closePath","d3_geo_resample","project","cosMinDistance","maxDepth","resample","resampleRecursive","resampleNone","d3_geo_transformPoint","a00","b00","c00","a0","resampleLineTo","x2","y2","dx2","dy2","dz","d3_geo_pathProjectStream","d3_geo_projectionRadians","d3_geo_transform","d3_geo_projection","projectRotate","projectResample","preclip","postclip","clipAngle","projection","d3_geo_rotation","invalidate","d3_geo_equirectangular","d3_geo_identityRotation","rotation","sr","d3_geo_circleAngle","d3_geo_graticuleX","d3_geo_graticuleY","d3_source","d3_target","path","projectStream","contextStream","cacheStream","transform","methods","projectionMutator","equirectangular","circle","distance","graticule","X1","X0","Y1","Y0","DX","DY","outline","majorExtent","minorExtent","majorStep","minorStep","greatArc","source_","target_","d3_geo_interpolate","cy0","sy0","cy1","sy1","kx0","ky0","kx1","ky1","d3_geo_length","d3_geo_lengthLineStart","d3_geo_azimuthal","azimuthal","sinc","cosc","d3_geo_azimuthalEqualArea","azimuthalEqualArea","d3_geo_azimuthalEquidistant","d3_geo_conicConformal","d3_geo_mercator","d3_geo_conicEquidistant","G","azimuthalEquidistant","conicConformal","conicEquidistant","d3_geo_gnomonic","d3_geo_mercatorProjection","clipAuto","gnomonic","mercator","d3_geo_orthographic","orthographic","d3_geo_stereographic","d3_geo_transverseMercator","d3_geom_pointX","d3_geom_pointY","d3_geom_hullUpper","hull","hs","d3_geom_hullOrder","stereographic","transverseMercator","geom","vertices","fx","fy","flippedPoints","upper","lower","skipLeft","skipRight","d3_geom_polygonPrototype","d3_geom_polygonInside","d3_geom_polygonIntersect","x3","x21","x43","y3","y21","y43","ua","d3_geom_polygonClosed","input","d3_geom_voronoiEdges","d3_geom_voronoiCells","d3_geom_voronoiBeaches","d3_geom_voronoiFirstCircle","d3_geom_voronoiCircles","d3_geom_voronoiBeachPool","d3_geom_voronoiCirclePool","d3_geom_voronoiBeach","d3_geom_voronoiRedBlackNode","edge","site","d3_geom_voronoiCreateBeach","beach","d3_geom_voronoiDetachBeach","d3_geom_voronoiDetachCircle","d3_geom_voronoiRemoveBeach","vertex","previous","P","disappearing","lArc","unshift","rArc","iArc","nArcs","d3_geom_voronoiSetEdgeEnd","d3_geom_voronoiCreateEdge","d3_geom_voronoiAttachCircle","d3_geom_voronoiAddBeach","dxl","dxr","directrix","d3_geom_voronoiLeftBreakPoint","d3_geom_voronoiRightBreakPoint","R","newArc","lSite","bx","by","rSite","hb","hc","rfocx","rfocy","pby2","lfocx","lfocy","plby2","hl","aby2","d3_geom_voronoiCell","edges","d3_geom_voronoiHalfEdgeOrder","d3_geom_voronoiCircle","cSite","ha","d3_geom_voronoiConnectEdge","vb","fm","fb","va","lx","ly","rx","ry","d3_geom_voronoiEdge","d3_geom_voronoiHalfEdge","d3_geom_voronoiCreateBorderEdge","d3_geom_voronoiRedBlackTree","d3_geom_voronoiRedBlackRotateLeft","tree","d3_geom_voronoiRedBlackRotateRight","d3_geom_voronoiRedBlackFirst","d3_geom_voronoi","sites","bbox","d3_geom_voronoiVertexOrder","d3_geom_voronoiClipEdges","splice","d3_geom_voronoiCloseCells","cell","iHalfEdge","halfEdges","nHalfEdges","cells","iCell","prepare","diagram","grandpa","uncle","sibling","voronoi","d3_geom_voronoiClipExtent","polygons","links","triangles","s0","s1","d3_geom_quadtreeCompatX","d3_geom_quadtreeCompatY","d3_geom_quadtreeVisit","sx","sy","children","d3_geom_quadtreeFind","root","closestPoint","minDistance2","find","distance2","xm","ym","d3_interpolateRgb","ar","ag","ab","br","bg","bb","d3_interpolateObject","d3_interpolate","d3_interpolateNumber","d3_interpolateString","am","bm","bs","bi","d3_interpolate_numberA","d3_interpolate_numberB","index","delaunay","quadtree","compat","xs","ys","x1_","y1_","x2_","y2_","leaf","nx","ny","insertChild","nPoint","below","interpolateRgb","interpolateObject","interpolateNumber","interpolateString","interpolators","d3_interpolateArray","na","nb","interpolateArray","d3_ease_default","d3_ease","linear","poly","d3_ease_poly","quad","d3_ease_quad","cubic","d3_ease_cubic","d3_ease_sin","d3_ease_exp","d3_ease_circle","elastic","d3_ease_elastic","back","d3_ease_back","bounce","d3_ease_bounce","d3_ease_mode","out","d3_ease_reverse","d3_ease_reflect","d3_ease_clamp","d3_ease_cubicInOut","t3","d3_interpolateRound","d3_transform","kx","d3_transformNormalize","kz","d3_transformDot","ky","d3_transformCombine","skew","ease","interpolateHcl","d3_interpolateHcl","ah","ac","al","bh","bc","bl","interpolateHsl","d3_interpolateHsl","as","interpolateLab","d3_interpolateLab","aa","ba","interpolateRound","baseVal","consolidate","d3_transformIdentity","d3_interpolateTransformPop","d3_interpolateTransform","d3_interpolateTranslate","ta","tb","d3_interpolateRotate","ra","rb","d3_interpolateSkew","wa","wb","d3_interpolateScale","ka","kb","d3_uninterpolateNumber","d3_uninterpolateClamp","d3_layout_bundlePath","link","lca","d3_layout_bundleLeastCommonAncestor","aNodes","d3_layout_bundleAncestors","bNodes","aNode","bNode","sharedNode","ancestors","d3_layout_forceDragstart","fixed","d3_layout_forceDragend","d3_layout_forceMouseover","px","py","d3_layout_forceMouseout","d3_layout_forceAccumulate","alpha","charges","charge","pointCharge","interpolateTransform","layout","bundle","paths","chord","chords","sortGroups","sortSubgroups","sortChords","relayout","groupSums","groupIndex","subgroupIndex","di","dj","subindex","startAngle","endAngle","resort","force","distances","strengths","friction","linkDistance","d3_layout_forceLinkDistance","linkStrength","d3_layout_forceLinkStrength","chargeDistance2","d3_layout_forceChargeDistance2","gravity","theta2","repulse","dw","dn","dragmove","resume","tick","weight","visit","chargeDistance","theta","neighbors","dimension","candidates","d3_layout_hierarchyRebind","hierarchy","d3_layout_hierarchyLinks","d3_layout_hierarchyVisitBefore","d3_layout_hierarchyVisitAfter","nodes2","d3_layout_hierarchyChildren","d3_layout_hierarchyValue","d3_layout_hierarchySort","child","stack","childs","revalue","partition","pie","Number","d3_layout_pieSortByValue","padAngle","da","pa","arcs","d3_layout_stackX","d3_layout_stackY","d3_layout_stackOut","d3_layout_stackOrderDefault","d3_layout_stackOffsetZero","series","orders","offsets","d3_layout_stackOrders","d3_layout_stackOffsets","d3_layout_stackMaxIndex","sums","d3_layout_stackReduceSum","bottom","tops","bottoms","silhouette","wiggle","s2","s3","o0","expand","zero","reduce","d3_layout_stackSum","d3_layout_histogramBinSturges","d3_layout_histogramBinFixed","d3_layout_histogramRange","d3_layout_packSort","d3_layout_packInsert","_pack_next","_pack_prev","d3_layout_packSplice","d3_layout_packIntersects","dr","d3_layout_packSiblings","xMin","xMax","yMin","yMax","d3_layout_packLink","d3_layout_packPlace","isect","d3_layout_packUnlink","d3_layout_packTransform","db","dc","d3_layout_treeSeparation","d3_layout_treeLeft","d3_layout_treeRight","d3_layout_treeMove","wm","wp","change","d3_layout_treeAncestor","vim","ancestor","d3_layout_clusterLeft","d3_layout_clusterRight","d3_layout_treemapPadNull","d3_layout_treemapPad","d3_scaleExtent","d3_scaleRange","rangeExtent","d3_scale_bilinear","uninterpolate","d3_scale_nice","nice","d3_scale_niceStep","d3_scale_niceIdentity","histogram","frequency","valuer","ranger","binner","bin","bins","thresholds","pack","separation","nodeSize","root0","root1","wrapTree","node1","queue","firstWalk","secondWalk","sizeNode","tx","siblings","d3_layout_treeShift","midpoint","apportion","vip","vop","vom","sip","sop","sim","som","cluster","previousNode","d3_layout_clusterX","d3_layout_clusterY","treemap","stickies","pad","sticky","mode","ratio","squarify","score","remaining","worst","stickify","rmax","rmin","padFunction","padConstant","logNormal","bates","irwinHall","d3_scale_polylinear","d3_scale_linear","clamp","rangeRound","ticks","d3_scale_linearTicks","tickFormat","d3_scale_linearTickFormat","d3_scale_linearNice","d3_scale_linearRebind","d3_scale_linearTickRange","span","d3_scale_linearPrecision","d3_scale_linearFormatPrecision","d3_scale_linearFormatSignificant","d3_scale_log","base","positive","niced","d3_scale_logNiceNegative","d3_scale_logFormat","d3_scale_pow","powp","d3_scale_powPow","powb","d3_scale_ordinal","rangeBand","steps","xi","rangePoints","rangeRoundPoints","rangeBands","outerPadding","rangeRoundBands","ordinal","category10","d3_category10","category20","d3_category20","category20b","d3_category20b","category20c","d3_category20c","d3_scale_quantile","quantiles","invertExtent","d3_scale_quantize","d3_scale_threshold","d3_scale_identity","identity","d3_zero","quantize","threshold","innerRadius","d3_svg_arcInnerRadius","outerRadius","d3_svg_arcOuterRadius","cornerRadius","padRadius","d3_svg_arcAuto","d3_svg_arcStartAngle","d3_svg_arcEndAngle","d3_svg_arcPadAngle","cw","rc","circleSegment","rp","ap","d3_svg_arcSweep","h1","h0","rc1","rc0","oc","kc","lc","t30","d3_svg_arcCornerTangents","t12","t03","t21","x01","y01","ox","oy","D","cx0","cx1","dx0","dy0","dx1","dy1","d3_svg_line","defined","d3_svg_lineLinear","interpolateKey","tension","d3_svg_lineInterpolators","d3_svg_lineLinearClosed","d3_svg_lineStep","d3_svg_lineStepBefore","d3_svg_lineStepAfter","basis","d3_svg_lineBasis","d3_svg_lineBasisOpen","pi","d3_svg_lineDot4","d3_svg_lineBasisBezier3","d3_svg_lineBasisBezier","d3_svg_lineBasisClosed","d3_svg_lineBundle","cardinal","d3_svg_lineCardinal","d3_svg_lineHermite","d3_svg_lineCardinalTangents","d3_svg_lineCardinalOpen","d3_svg_lineCardinalClosed","monotone","d3_svg_lineMonotone","d3_svg_lineMonotoneTangents","tangents","d3_svg_lineFiniteDifferences","d3_svg_lineSlope","lp","p2","d3_svg_lineBasisBezier1","d3_svg_lineBasisBezier2","d3_svg_lineRadial","d3_svg_area","interpolateReverse","points0","points1","fx0","fy0","fx1","fy1","d3_svg_chordRadius","d3_svg_diagonalProjection","d3_svg_diagonalRadialProjection","d3_svg_symbolSize","d3_svg_symbolType","d3_svg_symbolCircle","radial","equals","curve","diagonal","p3","projection_","d3_svg_symbols","cross","diamond","d3_svg_symbolTan30","square","d3_svg_symbolSqrt3","symbolTypes","d3_transitionId","d3_transitionNamespace","d3_transitionInherit","d3_transitionNode","d3_transition","interrupt","d3_selection_interruptNS","lock","activeId","active","count","d3_transitionPrototype","d3_transition_tween","d3_transition_text","inherit","tweens","elapsed","cancelId","cancel","schedule","subnodes","nameNS","attrTween","attrTweenNS","styleString","styleTween","inheritId","id0","id1","axis","tickFormat_","orient","d3_svg_axisDefaultOrient","innerTickSize","outerTickSize","tickPadding","tickArguments_","tickValues","tickTransform","tickEnter","tickExit","tickUpdate","tickSpacing","pathUpdate","lineEnter","lineUpdate","textEnter","textUpdate","d3_svg_axisX","d3_svg_axisY","d3_svg_axisOrients","tickSize","tickSubdivide","brush","xExtentDomain","yExtentDomain","xExtent","yExtent","xClamp","yClamp","resizes","d3_svg_brushResizes","brushstart","background","resize","d3_svg_brushCursor","gUpdate","backgroundUpdate","redrawX","redrawY","redraw","eventTarget","event_","resizing","resizingX","resizingY","dragging","keydown","keyup","brushmove","brushend","ex","ey","altKey","keyCode","move1","extent1","extent0","yi","clear","nw","ne","se","sw","d3_time_formatUtc","d3_time_formatIso","d3_time_formatIsoNative","toISOString","d3_time_scale","tickMethod","d3_time_scaleSteps","d3_time_scaleMilliseconds","d3_time_scaleDate","skip","skipped","iso","second","seconds","minute","minutes","hour","timezone","hours","month","d3_time_scaleLocalMethods","d3_time_scaleLocalFormat","d3_time_scaleUtcMethods","d3_time_scaleUtcFormat","d3_json","d3_html","createRange","selectNode","body","createContextualFragment","json","responseXML","hookCallback","some","hooks","setHookCallback","isObject","hasOwnProp","isObjectEmpty","obj","getOwnPropertyNames","isUndefined","isNumber","isDate","res","arrLen","extend","createUTC","strict","createLocalOrUTC","defaultParsingFlags","unusedTokens","unusedInput","overflow","charsLeftOver","nullInput","invalidEra","invalidMonth","invalidFormat","userInvalidated","parsedDateParts","era","meridiem","rfc2822","weekdayMismatch","getParsingFlags","_pf","isValid","_isValid","flags","parsedParts","isNowValid","invalidWeekday","_strict","bigHour","isFrozen","createInvalid","fun","momentProperties","updateInProgress","copyConfig","prop","val","momentPropertiesLen","_isAMomentObject","_f","_l","_tzm","_isUTC","_offset","_locale","Moment","config","updateOffset","isMoment","warn","msg","suppressDeprecationWarnings","console","deprecate","firstTime","deprecationHandler","argLen","deprecations","deprecateSimple","isFunction","_config","_dayOfMonthOrdinalParseLenient","_dayOfMonthOrdinalParse","_ordinalParse","mergeConfigs","parentConfig","childConfig","Locale","defaultCalendar","sameDay","nextDay","nextWeek","lastDay","lastWeek","sameElse","calendar","mom","_calendar","zeroFill","targetLength","forceSign","absNumber","zerosToFill","substr","formattingTokens","localFormattingTokens","formatFunctions","formatTokenFunctions","addFormatToken","padded","func","localeData","removeFormattingTokens","makeFormatFunction","formatMoment","expandFormat","invalidDate","replaceLongDateFormatTokens","longDateFormat","defaultLongDateFormat","LTS","LT","LL","LLL","LLLL","_longDateFormat","formatUpper","tok","defaultInvalidDate","_invalidDate","defaultOrdinal","defaultDayOfMonthOrdinalParse","_ordinal","defaultRelativeTime","future","past","ss","mm","hh","dd","ww","MM","yy","relativeTime","withoutSuffix","isFuture","_relativeTime","pastFuture","diff","aliases","addUnitAlias","shorthand","lowerCase","normalizeUnits","units","normalizeObjectUnits","inputObject","normalizedProp","normalizedInput","priorities","addUnitPriority","getPrioritizedUnits","unitsObj","isLeapYear","absFloor","toInt","argumentForCoercion","coercedNumber","makeGetSet","keepTime","set$1","daysInMonth","stringGet","stringSet","prioritized","prioritizedLen","regexes","match1","match2","match3","match4","match6","match1to2","match3to4","match5to6","match1to3","match1to4","match1to6","matchUnsigned","matchSigned","matchOffset","matchShortOffset","matchTimestamp","matchWord","addRegexToken","regex","strictRegex","isStrict","getParseRegexForToken","unescapeFormat","regexEscape","matched","p4","tokens","addParseToken","tokenLen","addWeekParseToken","_w","addTimeToArrayFromToken","_a","YEAR","MONTH","DATE","HOUR","MINUTE","SECOND","MILLISECOND","WEEK","WEEKDAY","mod","modMonth","monthsShort","monthsShortRegex","monthsRegex","monthsParse","defaultLocaleMonths","defaultLocaleMonthsShort","MONTHS_IN_FORMAT","defaultMonthsShortRegex","defaultMonthsRegex","localeMonths","_months","isFormat","localeMonthsShort","_monthsShort","handleStrictParse","monthName","ii","llc","toLocaleLowerCase","_monthsParse","_longMonthsParse","_shortMonthsParse","localeMonthsParse","_monthsParseExact","dayOfMonth","getSetMonth","getDaysInMonth","computeMonthsParse","_monthsShortStrictRegex","_monthsShortRegex","_monthsStrictRegex","_monthsRegex","cmpLenRev","shortPieces","longPieces","mixedPieces","daysInYear","parseTwoDigitYear","getSetYear","getIsLeapYear","createDate","ms","createUTCDate","firstWeekOffset","dow","doy","fwd","dayOfYearFromWeeks","weekday","resYear","resDayOfYear","resWeek","weekOffset","weeksInYear","weekOffsetNext","localeWeek","_week","defaultLocaleWeek","localeFirstDayOfWeek","localeFirstDayOfYear","getSetWeek","getSetISOWeek","parseWeekday","weekdaysParse","parseIsoWeekday","shiftWeekdays","ws","weekdaysMin","weekdaysShort","weekdays","weekdaysMinRegex","weekdaysShortRegex","weekdaysRegex","defaultLocaleWeekdays","defaultLocaleWeekdaysShort","defaultLocaleWeekdaysMin","defaultWeekdaysRegex","defaultWeekdaysShortRegex","defaultWeekdaysMinRegex","localeWeekdays","_weekdays","localeWeekdaysShort","_weekdaysShort","localeWeekdaysMin","_weekdaysMin","handleStrictParse$1","weekdayName","_weekdaysParse","_shortWeekdaysParse","_minWeekdaysParse","localeWeekdaysParse","_weekdaysParseExact","_fullWeekdaysParse","getSetDayOfWeek","getSetLocaleDayOfWeek","getSetISODayOfWeek","computeWeekdaysParse","_weekdaysStrictRegex","_weekdaysRegex","_weekdaysShortStrictRegex","_weekdaysShortRegex","_weekdaysMinStrictRegex","_weekdaysMinRegex","minp","shortp","longp","minPieces","hFormat","kFormat","lowercase","matchMeridiem","_meridiemParse","localeIsPM","kInput","_isPm","isPM","_meridiem","pos","pos1","pos2","defaultLocaleMeridiemParse","getSetHour","localeMeridiem","isLower","globalLocale","baseConfig","dayOfMonthOrdinalParse","meridiemParse","locales","localeFamilies","commonPrefix","arr1","minl","normalizeLocale","chooseLocale","loadLocale","isLocaleNameSane","oldLocale","_abbr","getSetGlobalLocale","getLocale","defineLocale","abbr","parentLocale","updateLocale","tmpLocale","listLocales","checkOverflow","_overflowDayOfYear","_overflowWeeks","_overflowWeekday","extendedIsoRegex","basicIsoRegex","tzRegex","isoDates","isoTimes","aspNetJsonRegex","obsOffsets","UT","GMT","EDT","EST","CDT","CST","MDT","MST","PDT","PST","configFromISO","allowTime","dateFormat","tzFormat","isoDatesLen","isoTimesLen","configFromStringAndFormat","extractFromRFC2822Strings","yearStr","monthStr","dayStr","hourStr","minuteStr","secondStr","untruncateYear","preprocessRFC2822","checkWeekday","weekdayStr","parsedInput","calculateOffset","obsOffset","militaryOffset","numOffset","hm","configFromRFC2822","parsedArray","configFromString","createFromInputFallback","defaults","currentDateArray","nowValue","_useUTC","configFromArray","currentDate","expectedWeekday","yearToUse","dayOfYearFromWeekInfo","_dayOfYear","_nextDay","weekYear","temp","weekdayOverflow","curWeek","GG","E","createLocal","gg","ISO_8601","RFC_2822","stringLength","totalParsedInputLength","meridiemFixWrap","erasConvertYear","isPm","meridiemHour","configFromStringAndArray","tempConfig","bestMoment","scoreToBeat","currentScore","validFormatFound","bestFormatIsValid","configfLen","configFromObject","dayOrDate","millisecond","createFromConfig","prepareConfig","preparse","configFromInput","isUTC","prototypeMin","prototypeMax","pickBy","moments","ordering","isDurationValid","unitHasDecimal","orderLen","isValid$1","createInvalid$1","createDuration","Duration","quarters","quarter","isoWeek","milliseconds","_milliseconds","_days","_data","_bubble","isDuration","absRound","compareArrays","array1","array2","dontConvert","lengthDiff","diffs","separator","utcOffset","offsetFromString","chunkOffset","matcher","parts","cloneWithOffset","model","clone","getDateOffset","getSetOffset","keepLocalTime","keepMinutes","localAdjust","_changeInProgress","addSubtract","getSetZone","setOffsetToUTC","setOffsetToLocal","subtract","setOffsetToParsedOffset","tZone","hasAlignedHourOffset","isDaylightSavingTime","isDaylightSavingTimeShifted","_isDSTShifted","toArray","isLocal","isUtcOffset","isUtc","aspNetRegex","isoRegex","ret","diffRes","parseIso","momentsDifference","inp","positiveMomentsDifference","isAfter","isBefore","createAdder","period","tmp","isAdding","invalid","isString","isMomentInput","isNumberOrStringArray","isMomentInputObject","objectTest","propertyTest","propertyLen","arrayTest","dataTypeTest","item","isCalendarSpec","getCalendarFormat","myMoment","calendar$1","sod","startOf","calendarFormat","localInput","endOf","isBetween","inclusivity","localFrom","localTo","isSame","inputMs","isSameOrAfter","isSameOrBefore","asFloat","zoneDelta","monthDiff","wholeMonthDiff","anchor","keepOffset","toDate","inspect","datetime","zone","inputString","defaultFormatUtc","defaultFormat","postformat","humanize","fromNow","toNow","newLocaleData","lang","MS_PER_SECOND","MS_PER_MINUTE","MS_PER_HOUR","MS_PER_400_YEARS","mod$1","dividend","divisor","localStartOfDate","utcStartOfDate","startOfDate","isoWeekday","unix","toObject","toJSON","isValid$2","parsingFlags","invalidAt","creationData","localeEras","eras","_eras","since","until","localeErasParse","eraName","narrow","localeErasConvertYear","dir","getEraName","getEraNarrow","getEraAbbr","getEraYear","erasNameRegex","computeErasParse","_erasNameRegex","_erasRegex","erasAbbrRegex","_erasAbbrRegex","erasNarrowRegex","_erasNarrowRegex","matchEraAbbr","matchEraName","matchEraNarrow","matchEraYearOrdinal","_eraYearOrdinalRegex","abbrPieces","namePieces","narrowPieces","addWeekYearFormatToken","getter","getSetWeekYear","getSetWeekYearHelper","getSetISOWeekYear","getISOWeeksInYear","getISOWeeksInISOWeekYear","isoWeekYear","getWeeksInYear","weekInfo","getWeeksInWeekYear","weeksTarget","setWeekAll","dayOfYearData","getSetQuarter","erasParse","eraYearOrdinalParse","getSetDayOfMonth","getSetDayOfYear","getSetMinute","getSetMillisecond","getSetSecond","parseMs","getZoneAbbr","getZoneName","proto","createUnix","createInZone","parseZone","preParsePostFormat","for","eraNarrow","eraAbbr","eraYear","isoWeeks","weeksInWeekYear","isoWeeksInYear","isoWeeksInISOWeekYear","isDST","zoneAbbr","zoneName","dates","isDSTShifted","proto$1","get$1","listMonthsImpl","listWeekdaysImpl","localeSorted","listMonths","listMonthsShort","listWeekdays","listWeekdaysShort","listWeekdaysMin","firstDayOfYear","firstDayOfWeek","langData","mathAbs","addSubtract$1","add$1","subtract$1","absCeil","bubble","monthsFromDays","monthsToDays","daysToMonths","valueOf$1","makeAs","alias","asMilliseconds","asSeconds","asMinutes","asHours","asDays","asWeeks","asMonths","asQuarters","asYears","clone$1","get$2","makeGetter","substituteTimeAgo","relativeTime$1","posNegDuration","getSetRelativeTimeRounding","roundingFunction","getSetRelativeTimeThreshold","limit","argWithSuffix","argThresholds","withSuffix","th","assign","abs$1","toISOString$1","totalSign","ymSign","daysSign","hmsSign","total","proto$2","toIsoString","relativeTimeRounding","relativeTimeThreshold","HTML5_FMT","DATETIME_LOCAL","DATETIME_LOCAL_SECONDS","DATETIME_LOCAL_MS","TIME","TIME_SECONDS","TIME_MS","factory","moment","hasMoment","hasEventListeners","sto","addEvent","el","attachEvent","removeEvent","detachEvent","str","hasClass","cn","className","addClass","removeClass","isWeekend","setToStartOfDay","compareDates","overwrite","hasProp","nodeName","fireEvent","eventName","ev","createEvent","initEvent","dispatchEvent","createEventObject","adjustCalendar","ariaLabel","reposition","defaultDate","setDefaultDate","firstDay","firstWeekOfYearMinDays","formatStrict","minDate","maxDate","yearRange","showWeekNumber","pickWholeWeek","minYear","maxYear","minMonth","maxMonth","startRange","endRange","isRTL","yearSuffix","showMonthAfterYear","showDaysInNextAndPreviousMonths","enableSelectionDaysInNextAndPreviousMonths","numberOfMonths","mainCalendar","blurFieldOnSelect","i18n","previousMonth","nextMonth","theme","events","onSelect","onOpen","onClose","onDraw","keyboardInput","renderDayName","opts","renderDay","ariaSelected","isEmpty","isDisabled","isToday","isSelected","hasEvent","isInRange","isStartRange","isEndRange","yearDay","weekDay","dayInFirstWeek","dayShift","daysPerWeek","prevWeekDay","jan4th","msPerDay","daysBetween","renderWeek","renderRow","isRowSelected","renderBody","renderHead","renderTitle","refYear","randId","monthHtml","yearHtml","_o","isMinYear","isMaxYear","prev","renderTable","Pikaday","options","_onMouseDown","_v","srcElement","prevMonth","hide","blur","_c","returnValue","_onChange","gotoMonth","gotoYear","_onKeyChange","isVisible","adjustDate","_parseFieldValue","_onInputChange","firedBy","show","_onInputFocus","_onInputClick","_onInputBlur","pEl","activeElement","_b","_onClick","onchange","trigger","defDate","gotoDate","disableWeekends","disableDayFn","nom","setMinDate","setMaxDate","fallback","toDateString","getMoment","setMoment","preventOnSelect","draw","newCalendar","calendars","firstVisibleDate","lastVisibleDate","visibleDate","adjustCalendars","newDay","difference","gotoToday","setStartRange","setEndRange","_y","_m","render","focus","adjustPosition","height","viewportWidth","viewportHeight","scrollTop","clientRect","leftAligned","bottomAligned","offsetWidth","offsetHeight","innerWidth","clientWidth","innerHeight","clientHeight","pageYOffset","pageXOffset","offsetLeft","offsetTop","offsetParent","yearOfPreviousMonth","yearOfNextMonth","daysInPreviousMonth","isWeekSelected","dayNumber","monthNumber","yearNumber","dayConfig","destroy","runtime","Op","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","Context","_invoke","makeInvokeMethod","state","invoke","doneResult","delegate","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","record","tryCatch","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","getPrototypeOf","NativeIteratorPrototype","Gp","defineIteratorMethods","AsyncIterator","PromiseImpl","__await","unwrapped","previousPromise","enqueue","callInvokeWithMethodAndArg","resultName","nextLoc","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iterable","iteratorMethod","displayName","isGeneratorFunction","genFun","mark","setPrototypeOf","awrap","async","skipTempReset","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","globalThis","webpackPolyfill"],"mappings":"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","file":"vendors~main~scripts.1c8ae8ab.iframe.bundle.js","sourcesContent":["export default function _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) {\n    arr2[i] = arr[i];\n  }\n\n  return arr2;\n}","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n  try {\n    var info = gen[key](arg);\n    var value = info.value;\n  } catch (error) {\n    reject(error);\n    return;\n  }\n\n  if (info.done) {\n    resolve(value);\n  } else {\n    Promise.resolve(value).then(_next, _throw);\n  }\n}\n\nexport default function _asyncToGenerator(fn) {\n  return function () {\n    var self = this,\n        args = arguments;\n    return new Promise(function (resolve, reject) {\n      var gen = fn.apply(self, args);\n\n      function _next(value) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n      }\n\n      function _throw(err) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n      }\n\n      _next(undefined);\n    });\n  };\n}","export default function _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}","function _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nexport default function _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}","import unsupportedIterableToArray from \"./unsupportedIterableToArray\";\nexport default function _createForOfIteratorHelper(o) {\n  if (typeof Symbol === \"undefined\" || o[Symbol.iterator] == null) {\n    if (Array.isArray(o) || (o = unsupportedIterableToArray(o))) {\n      var i = 0;\n\n      var F = function F() {};\n\n      return {\n        s: F,\n        n: function n() {\n          if (i >= o.length) return {\n            done: true\n          };\n          return {\n            done: false,\n            value: o[i++]\n          };\n        },\n        e: function e(_e) {\n          throw _e;\n        },\n        f: F\n      };\n    }\n\n    throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n\n  var it,\n      normalCompletion = true,\n      didErr = false,\n      err;\n  return {\n    s: function s() {\n      it = o[Symbol.iterator]();\n    },\n    n: function n() {\n      var step = it.next();\n      normalCompletion = step.done;\n      return step;\n    },\n    e: function e(_e2) {\n      didErr = true;\n      err = _e2;\n    },\n    f: function f() {\n      try {\n        if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n      } finally {\n        if (didErr) throw err;\n      }\n    }\n  };\n}","import arrayWithHoles from \"./arrayWithHoles\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray\";\nimport nonIterableRest from \"./nonIterableRest\";\nexport default function _slicedToArray(arr, i) {\n  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n  if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _e = undefined;\n\n  try {\n    for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n\n  return _arr;\n}","export default function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayWithoutHoles from \"./arrayWithoutHoles\";\nimport iterableToArray from \"./iterableToArray\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray\";\nimport nonIterableSpread from \"./nonIterableSpread\";\nexport default function _toConsumableArray(arr) {\n  return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray\";\nexport default function _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayLikeToArray from \"./arrayLikeToArray\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(n);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","module.exports = require(\"regenerator-runtime\");\n","!function() {\n  var d3 = {\n    version: \"3.5.17\"\n  };\n  var d3_arraySlice = [].slice, d3_array = function(list) {\n    return d3_arraySlice.call(list);\n  };\n  var d3_document = this.document;\n  function d3_documentElement(node) {\n    return node && (node.ownerDocument || node.document || node).documentElement;\n  }\n  function d3_window(node) {\n    return node && (node.ownerDocument && node.ownerDocument.defaultView || node.document && node || node.defaultView);\n  }\n  if (d3_document) {\n    try {\n      d3_array(d3_document.documentElement.childNodes)[0].nodeType;\n    } catch (e) {\n      d3_array = function(list) {\n        var i = list.length, array = new Array(i);\n        while (i--) array[i] = list[i];\n        return array;\n      };\n    }\n  }\n  if (!Date.now) Date.now = function() {\n    return +new Date();\n  };\n  if (d3_document) {\n    try {\n      d3_document.createElement(\"DIV\").style.setProperty(\"opacity\", 0, \"\");\n    } catch (error) {\n      var d3_element_prototype = this.Element.prototype, d3_element_setAttribute = d3_element_prototype.setAttribute, d3_element_setAttributeNS = d3_element_prototype.setAttributeNS, d3_style_prototype = this.CSSStyleDeclaration.prototype, d3_style_setProperty = d3_style_prototype.setProperty;\n      d3_element_prototype.setAttribute = function(name, value) {\n        d3_element_setAttribute.call(this, name, value + \"\");\n      };\n      d3_element_prototype.setAttributeNS = function(space, local, value) {\n        d3_element_setAttributeNS.call(this, space, local, value + \"\");\n      };\n      d3_style_prototype.setProperty = function(name, value, priority) {\n        d3_style_setProperty.call(this, name, value + \"\", priority);\n      };\n    }\n  }\n  d3.ascending = d3_ascending;\n  function d3_ascending(a, b) {\n    return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n  }\n  d3.descending = function(a, b) {\n    return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n  };\n  d3.min = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null && a > b) a = b;\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && a > b) a = b;\n    }\n    return a;\n  };\n  d3.max = function(array, f) {\n    var i = -1, n = array.length, a, b;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null && b > a) a = b;\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b > a) a = b;\n    }\n    return a;\n  };\n  d3.extent = function(array, f) {\n    var i = -1, n = array.length, a, b, c;\n    if (arguments.length === 1) {\n      while (++i < n) if ((b = array[i]) != null && b >= b) {\n        a = c = b;\n        break;\n      }\n      while (++i < n) if ((b = array[i]) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    } else {\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null && b >= b) {\n        a = c = b;\n        break;\n      }\n      while (++i < n) if ((b = f.call(array, array[i], i)) != null) {\n        if (a > b) a = b;\n        if (c < b) c = b;\n      }\n    }\n    return [ a, c ];\n  };\n  function d3_number(x) {\n    return x === null ? NaN : +x;\n  }\n  function d3_numeric(x) {\n    return !isNaN(x);\n  }\n  d3.sum = function(array, f) {\n    var s = 0, n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = +array[i])) s += a;\n    } else {\n      while (++i < n) if (d3_numeric(a = +f.call(array, array[i], i))) s += a;\n    }\n    return s;\n  };\n  d3.mean = function(array, f) {\n    var s = 0, n = array.length, a, i = -1, j = n;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) s += a; else --j;\n    } else {\n      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) s += a; else --j;\n    }\n    if (j) return s / j;\n  };\n  d3.quantile = function(values, p) {\n    var H = (values.length - 1) * p + 1, h = Math.floor(H), v = +values[h - 1], e = H - h;\n    return e ? v + e * (values[h] - v) : v;\n  };\n  d3.median = function(array, f) {\n    var numbers = [], n = array.length, a, i = -1;\n    if (arguments.length === 1) {\n      while (++i < n) if (d3_numeric(a = d3_number(array[i]))) numbers.push(a);\n    } else {\n      while (++i < n) if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) numbers.push(a);\n    }\n    if (numbers.length) return d3.quantile(numbers.sort(d3_ascending), .5);\n  };\n  d3.variance = function(array, f) {\n    var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;\n    if (arguments.length === 1) {\n      while (++i < n) {\n        if (d3_numeric(a = d3_number(array[i]))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    } else {\n      while (++i < n) {\n        if (d3_numeric(a = d3_number(f.call(array, array[i], i)))) {\n          d = a - m;\n          m += d / ++j;\n          s += d * (a - m);\n        }\n      }\n    }\n    if (j > 1) return s / (j - 1);\n  };\n  d3.deviation = function() {\n    var v = d3.variance.apply(this, arguments);\n    return v ? Math.sqrt(v) : v;\n  };\n  function d3_bisector(compare) {\n    return {\n      left: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) < 0) lo = mid + 1; else hi = mid;\n        }\n        return lo;\n      },\n      right: function(a, x, lo, hi) {\n        if (arguments.length < 3) lo = 0;\n        if (arguments.length < 4) hi = a.length;\n        while (lo < hi) {\n          var mid = lo + hi >>> 1;\n          if (compare(a[mid], x) > 0) hi = mid; else lo = mid + 1;\n        }\n        return lo;\n      }\n    };\n  }\n  var d3_bisect = d3_bisector(d3_ascending);\n  d3.bisectLeft = d3_bisect.left;\n  d3.bisect = d3.bisectRight = d3_bisect.right;\n  d3.bisector = function(f) {\n    return d3_bisector(f.length === 1 ? function(d, x) {\n      return d3_ascending(f(d), x);\n    } : f);\n  };\n  d3.shuffle = function(array, i0, i1) {\n    if ((m = arguments.length) < 3) {\n      i1 = array.length;\n      if (m < 2) i0 = 0;\n    }\n    var m = i1 - i0, t, i;\n    while (m) {\n      i = Math.random() * m-- | 0;\n      t = array[m + i0], array[m + i0] = array[i + i0], array[i + i0] = t;\n    }\n    return array;\n  };\n  d3.permute = function(array, indexes) {\n    var i = indexes.length, permutes = new Array(i);\n    while (i--) permutes[i] = array[indexes[i]];\n    return permutes;\n  };\n  d3.pairs = function(array) {\n    var i = 0, n = array.length - 1, p0, p1 = array[0], pairs = new Array(n < 0 ? 0 : n);\n    while (i < n) pairs[i] = [ p0 = p1, p1 = array[++i] ];\n    return pairs;\n  };\n  d3.transpose = function(matrix) {\n    if (!(n = matrix.length)) return [];\n    for (var i = -1, m = d3.min(matrix, d3_transposeLength), transpose = new Array(m); ++i < m; ) {\n      for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n; ) {\n        row[j] = matrix[j][i];\n      }\n    }\n    return transpose;\n  };\n  function d3_transposeLength(d) {\n    return d.length;\n  }\n  d3.zip = function() {\n    return d3.transpose(arguments);\n  };\n  d3.keys = function(map) {\n    var keys = [];\n    for (var key in map) keys.push(key);\n    return keys;\n  };\n  d3.values = function(map) {\n    var values = [];\n    for (var key in map) values.push(map[key]);\n    return values;\n  };\n  d3.entries = function(map) {\n    var entries = [];\n    for (var key in map) entries.push({\n      key: key,\n      value: map[key]\n    });\n    return entries;\n  };\n  d3.merge = function(arrays) {\n    var n = arrays.length, m, i = -1, j = 0, merged, array;\n    while (++i < n) j += arrays[i].length;\n    merged = new Array(j);\n    while (--n >= 0) {\n      array = arrays[n];\n      m = array.length;\n      while (--m >= 0) {\n        merged[--j] = array[m];\n      }\n    }\n    return merged;\n  };\n  var abs = Math.abs;\n  d3.range = function(start, stop, step) {\n    if (arguments.length < 3) {\n      step = 1;\n      if (arguments.length < 2) {\n        stop = start;\n        start = 0;\n      }\n    }\n    if ((stop - start) / step === Infinity) throw new Error(\"infinite range\");\n    var range = [], k = d3_range_integerScale(abs(step)), i = -1, j;\n    start *= k, stop *= k, step *= k;\n    if (step < 0) while ((j = start + step * ++i) > stop) range.push(j / k); else while ((j = start + step * ++i) < stop) range.push(j / k);\n    return range;\n  };\n  function d3_range_integerScale(x) {\n    var k = 1;\n    while (x * k % 1) k *= 10;\n    return k;\n  }\n  function d3_class(ctor, properties) {\n    for (var key in properties) {\n      Object.defineProperty(ctor.prototype, key, {\n        value: properties[key],\n        enumerable: false\n      });\n    }\n  }\n  d3.map = function(object, f) {\n    var map = new d3_Map();\n    if (object instanceof d3_Map) {\n      object.forEach(function(key, value) {\n        map.set(key, value);\n      });\n    } else if (Array.isArray(object)) {\n      var i = -1, n = object.length, o;\n      if (arguments.length === 1) while (++i < n) map.set(i, object[i]); else while (++i < n) map.set(f.call(object, o = object[i], i), o);\n    } else {\n      for (var key in object) map.set(key, object[key]);\n    }\n    return map;\n  };\n  function d3_Map() {\n    this._ = Object.create(null);\n  }\n  var d3_map_proto = \"__proto__\", d3_map_zero = \"\\x00\";\n  d3_class(d3_Map, {\n    has: d3_map_has,\n    get: function(key) {\n      return this._[d3_map_escape(key)];\n    },\n    set: function(key, value) {\n      return this._[d3_map_escape(key)] = value;\n    },\n    remove: d3_map_remove,\n    keys: d3_map_keys,\n    values: function() {\n      var values = [];\n      for (var key in this._) values.push(this._[key]);\n      return values;\n    },\n    entries: function() {\n      var entries = [];\n      for (var key in this._) entries.push({\n        key: d3_map_unescape(key),\n        value: this._[key]\n      });\n      return entries;\n    },\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this._) f.call(this, d3_map_unescape(key), this._[key]);\n    }\n  });\n  function d3_map_escape(key) {\n    return (key += \"\") === d3_map_proto || key[0] === d3_map_zero ? d3_map_zero + key : key;\n  }\n  function d3_map_unescape(key) {\n    return (key += \"\")[0] === d3_map_zero ? key.slice(1) : key;\n  }\n  function d3_map_has(key) {\n    return d3_map_escape(key) in this._;\n  }\n  function d3_map_remove(key) {\n    return (key = d3_map_escape(key)) in this._ && delete this._[key];\n  }\n  function d3_map_keys() {\n    var keys = [];\n    for (var key in this._) keys.push(d3_map_unescape(key));\n    return keys;\n  }\n  function d3_map_size() {\n    var size = 0;\n    for (var key in this._) ++size;\n    return size;\n  }\n  function d3_map_empty() {\n    for (var key in this._) return false;\n    return true;\n  }\n  d3.nest = function() {\n    var nest = {}, keys = [], sortKeys = [], sortValues, rollup;\n    function map(mapType, array, depth) {\n      if (depth >= keys.length) return rollup ? rollup.call(nest, array) : sortValues ? array.sort(sortValues) : array;\n      var i = -1, n = array.length, key = keys[depth++], keyValue, object, setter, valuesByKey = new d3_Map(), values;\n      while (++i < n) {\n        if (values = valuesByKey.get(keyValue = key(object = array[i]))) {\n          values.push(object);\n        } else {\n          valuesByKey.set(keyValue, [ object ]);\n        }\n      }\n      if (mapType) {\n        object = mapType();\n        setter = function(keyValue, values) {\n          object.set(keyValue, map(mapType, values, depth));\n        };\n      } else {\n        object = {};\n        setter = function(keyValue, values) {\n          object[keyValue] = map(mapType, values, depth);\n        };\n      }\n      valuesByKey.forEach(setter);\n      return object;\n    }\n    function entries(map, depth) {\n      if (depth >= keys.length) return map;\n      var array = [], sortKey = sortKeys[depth++];\n      map.forEach(function(key, keyMap) {\n        array.push({\n          key: key,\n          values: entries(keyMap, depth)\n        });\n      });\n      return sortKey ? array.sort(function(a, b) {\n        return sortKey(a.key, b.key);\n      }) : array;\n    }\n    nest.map = function(array, mapType) {\n      return map(mapType, array, 0);\n    };\n    nest.entries = function(array) {\n      return entries(map(d3.map, array, 0), 0);\n    };\n    nest.key = function(d) {\n      keys.push(d);\n      return nest;\n    };\n    nest.sortKeys = function(order) {\n      sortKeys[keys.length - 1] = order;\n      return nest;\n    };\n    nest.sortValues = function(order) {\n      sortValues = order;\n      return nest;\n    };\n    nest.rollup = function(f) {\n      rollup = f;\n      return nest;\n    };\n    return nest;\n  };\n  d3.set = function(array) {\n    var set = new d3_Set();\n    if (array) for (var i = 0, n = array.length; i < n; ++i) set.add(array[i]);\n    return set;\n  };\n  function d3_Set() {\n    this._ = Object.create(null);\n  }\n  d3_class(d3_Set, {\n    has: d3_map_has,\n    add: function(key) {\n      this._[d3_map_escape(key += \"\")] = true;\n      return key;\n    },\n    remove: d3_map_remove,\n    values: d3_map_keys,\n    size: d3_map_size,\n    empty: d3_map_empty,\n    forEach: function(f) {\n      for (var key in this._) f.call(this, d3_map_unescape(key));\n    }\n  });\n  d3.behavior = {};\n  function d3_identity(d) {\n    return d;\n  }\n  d3.rebind = function(target, source) {\n    var i = 1, n = arguments.length, method;\n    while (++i < n) target[method = arguments[i]] = d3_rebind(target, source, source[method]);\n    return target;\n  };\n  function d3_rebind(target, source, method) {\n    return function() {\n      var value = method.apply(source, arguments);\n      return value === source ? target : value;\n    };\n  }\n  function d3_vendorSymbol(object, name) {\n    if (name in object) return name;\n    name = name.charAt(0).toUpperCase() + name.slice(1);\n    for (var i = 0, n = d3_vendorPrefixes.length; i < n; ++i) {\n      var prefixName = d3_vendorPrefixes[i] + name;\n      if (prefixName in object) return prefixName;\n    }\n  }\n  var d3_vendorPrefixes = [ \"webkit\", \"ms\", \"moz\", \"Moz\", \"o\", \"O\" ];\n  function d3_noop() {}\n  d3.dispatch = function() {\n    var dispatch = new d3_dispatch(), i = -1, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    return dispatch;\n  };\n  function d3_dispatch() {}\n  d3_dispatch.prototype.on = function(type, listener) {\n    var i = type.indexOf(\".\"), name = \"\";\n    if (i >= 0) {\n      name = type.slice(i + 1);\n      type = type.slice(0, i);\n    }\n    if (type) return arguments.length < 2 ? this[type].on(name) : this[type].on(name, listener);\n    if (arguments.length === 2) {\n      if (listener == null) for (type in this) {\n        if (this.hasOwnProperty(type)) this[type].on(name, null);\n      }\n      return this;\n    }\n  };\n  function d3_dispatch_event(dispatch) {\n    var listeners = [], listenerByName = new d3_Map();\n    function event() {\n      var z = listeners, i = -1, n = z.length, l;\n      while (++i < n) if (l = z[i].on) l.apply(this, arguments);\n      return dispatch;\n    }\n    event.on = function(name, listener) {\n      var l = listenerByName.get(name), i;\n      if (arguments.length < 2) return l && l.on;\n      if (l) {\n        l.on = null;\n        listeners = listeners.slice(0, i = listeners.indexOf(l)).concat(listeners.slice(i + 1));\n        listenerByName.remove(name);\n      }\n      if (listener) listeners.push(listenerByName.set(name, {\n        on: listener\n      }));\n      return dispatch;\n    };\n    return event;\n  }\n  d3.event = null;\n  function d3_eventPreventDefault() {\n    d3.event.preventDefault();\n  }\n  function d3_eventSource() {\n    var e = d3.event, s;\n    while (s = e.sourceEvent) e = s;\n    return e;\n  }\n  function d3_eventDispatch(target) {\n    var dispatch = new d3_dispatch(), i = 0, n = arguments.length;\n    while (++i < n) dispatch[arguments[i]] = d3_dispatch_event(dispatch);\n    dispatch.of = function(thiz, argumentz) {\n      return function(e1) {\n        try {\n          var e0 = e1.sourceEvent = d3.event;\n          e1.target = target;\n          d3.event = e1;\n          dispatch[e1.type].apply(thiz, argumentz);\n        } finally {\n          d3.event = e0;\n        }\n      };\n    };\n    return dispatch;\n  }\n  d3.requote = function(s) {\n    return s.replace(d3_requote_re, \"\\\\$&\");\n  };\n  var d3_requote_re = /[\\\\\\^\\$\\*\\+\\?\\|\\[\\]\\(\\)\\.\\{\\}]/g;\n  var d3_subclass = {}.__proto__ ? function(object, prototype) {\n    object.__proto__ = prototype;\n  } : function(object, prototype) {\n    for (var property in prototype) object[property] = prototype[property];\n  };\n  function d3_selection(groups) {\n    d3_subclass(groups, d3_selectionPrototype);\n    return groups;\n  }\n  var d3_select = function(s, n) {\n    return n.querySelector(s);\n  }, d3_selectAll = function(s, n) {\n    return n.querySelectorAll(s);\n  }, d3_selectMatches = function(n, s) {\n    var d3_selectMatcher = n.matches || n[d3_vendorSymbol(n, \"matchesSelector\")];\n    d3_selectMatches = function(n, s) {\n      return d3_selectMatcher.call(n, s);\n    };\n    return d3_selectMatches(n, s);\n  };\n  if (typeof Sizzle === \"function\") {\n    d3_select = function(s, n) {\n      return Sizzle(s, n)[0] || null;\n    };\n    d3_selectAll = Sizzle;\n    d3_selectMatches = Sizzle.matchesSelector;\n  }\n  d3.selection = function() {\n    return d3.select(d3_document.documentElement);\n  };\n  var d3_selectionPrototype = d3.selection.prototype = [];\n  d3_selectionPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, group, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(subnode = selector.call(node, node.__data__, i, j));\n          if (subnode && \"__data__\" in node) subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selector(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_select(selector, this);\n    };\n  }\n  d3_selectionPrototype.selectAll = function(selector) {\n    var subgroups = [], subgroup, node;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroups.push(subgroup = d3_array(selector.call(node, node.__data__, i, j)));\n          subgroup.parentNode = node;\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_selectorAll(selector) {\n    return typeof selector === \"function\" ? selector : function() {\n      return d3_selectAll(selector, this);\n    };\n  }\n  var d3_nsXhtml = \"http://www.w3.org/1999/xhtml\";\n  var d3_nsPrefix = {\n    svg: \"http://www.w3.org/2000/svg\",\n    xhtml: d3_nsXhtml,\n    xlink: \"http://www.w3.org/1999/xlink\",\n    xml: \"http://www.w3.org/XML/1998/namespace\",\n    xmlns: \"http://www.w3.org/2000/xmlns/\"\n  };\n  d3.ns = {\n    prefix: d3_nsPrefix,\n    qualify: function(name) {\n      var i = name.indexOf(\":\"), prefix = name;\n      if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n      return d3_nsPrefix.hasOwnProperty(prefix) ? {\n        space: d3_nsPrefix[prefix],\n        local: name\n      } : name;\n    }\n  };\n  d3_selectionPrototype.attr = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node();\n        name = d3.ns.qualify(name);\n        return name.local ? node.getAttributeNS(name.space, name.local) : node.getAttribute(name);\n      }\n      for (value in name) this.each(d3_selection_attr(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_attr(name, value));\n  };\n  function d3_selection_attr(name, value) {\n    name = d3.ns.qualify(name);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrConstant() {\n      this.setAttribute(name, value);\n    }\n    function attrConstantNS() {\n      this.setAttributeNS(name.space, name.local, value);\n    }\n    function attrFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttribute(name); else this.setAttribute(name, x);\n    }\n    function attrFunctionNS() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.removeAttributeNS(name.space, name.local); else this.setAttributeNS(name.space, name.local, x);\n    }\n    return value == null ? name.local ? attrNullNS : attrNull : typeof value === \"function\" ? name.local ? attrFunctionNS : attrFunction : name.local ? attrConstantNS : attrConstant;\n  }\n  function d3_collapse(s) {\n    return s.trim().replace(/\\s+/g, \" \");\n  }\n  d3_selectionPrototype.classed = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") {\n        var node = this.node(), n = (name = d3_selection_classes(name)).length, i = -1;\n        if (value = node.classList) {\n          while (++i < n) if (!value.contains(name[i])) return false;\n        } else {\n          value = node.getAttribute(\"class\");\n          while (++i < n) if (!d3_selection_classedRe(name[i]).test(value)) return false;\n        }\n        return true;\n      }\n      for (value in name) this.each(d3_selection_classed(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_classed(name, value));\n  };\n  function d3_selection_classedRe(name) {\n    return new RegExp(\"(?:^|\\\\s+)\" + d3.requote(name) + \"(?:\\\\s+|$)\", \"g\");\n  }\n  function d3_selection_classes(name) {\n    return (name + \"\").trim().split(/^|\\s+/);\n  }\n  function d3_selection_classed(name, value) {\n    name = d3_selection_classes(name).map(d3_selection_classedName);\n    var n = name.length;\n    function classedConstant() {\n      var i = -1;\n      while (++i < n) name[i](this, value);\n    }\n    function classedFunction() {\n      var i = -1, x = value.apply(this, arguments);\n      while (++i < n) name[i](this, x);\n    }\n    return typeof value === \"function\" ? classedFunction : classedConstant;\n  }\n  function d3_selection_classedName(name) {\n    var re = d3_selection_classedRe(name);\n    return function(node, value) {\n      if (c = node.classList) return value ? c.add(name) : c.remove(name);\n      var c = node.getAttribute(\"class\") || \"\";\n      if (value) {\n        re.lastIndex = 0;\n        if (!re.test(c)) node.setAttribute(\"class\", d3_collapse(c + \" \" + name));\n      } else {\n        node.setAttribute(\"class\", d3_collapse(c.replace(re, \" \")));\n      }\n    };\n  }\n  d3_selectionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.each(d3_selection_style(priority, name[priority], value));\n        return this;\n      }\n      if (n < 2) {\n        var node = this.node();\n        return d3_window(node).getComputedStyle(node, null).getPropertyValue(name);\n      }\n      priority = \"\";\n    }\n    return this.each(d3_selection_style(name, value, priority));\n  };\n  function d3_selection_style(name, value, priority) {\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleConstant() {\n      this.style.setProperty(name, value, priority);\n    }\n    function styleFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) this.style.removeProperty(name); else this.style.setProperty(name, x, priority);\n    }\n    return value == null ? styleNull : typeof value === \"function\" ? styleFunction : styleConstant;\n  }\n  d3_selectionPrototype.property = function(name, value) {\n    if (arguments.length < 2) {\n      if (typeof name === \"string\") return this.node()[name];\n      for (value in name) this.each(d3_selection_property(value, name[value]));\n      return this;\n    }\n    return this.each(d3_selection_property(name, value));\n  };\n  function d3_selection_property(name, value) {\n    function propertyNull() {\n      delete this[name];\n    }\n    function propertyConstant() {\n      this[name] = value;\n    }\n    function propertyFunction() {\n      var x = value.apply(this, arguments);\n      if (x == null) delete this[name]; else this[name] = x;\n    }\n    return value == null ? propertyNull : typeof value === \"function\" ? propertyFunction : propertyConstant;\n  }\n  d3_selectionPrototype.text = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.textContent = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.textContent = \"\";\n    } : function() {\n      this.textContent = value;\n    }) : this.node().textContent;\n  };\n  d3_selectionPrototype.html = function(value) {\n    return arguments.length ? this.each(typeof value === \"function\" ? function() {\n      var v = value.apply(this, arguments);\n      this.innerHTML = v == null ? \"\" : v;\n    } : value == null ? function() {\n      this.innerHTML = \"\";\n    } : function() {\n      this.innerHTML = value;\n    }) : this.node().innerHTML;\n  };\n  d3_selectionPrototype.append = function(name) {\n    name = d3_selection_creator(name);\n    return this.select(function() {\n      return this.appendChild(name.apply(this, arguments));\n    });\n  };\n  function d3_selection_creator(name) {\n    function create() {\n      var document = this.ownerDocument, namespace = this.namespaceURI;\n      return namespace === d3_nsXhtml && document.documentElement.namespaceURI === d3_nsXhtml ? document.createElement(name) : document.createElementNS(namespace, name);\n    }\n    function createNS() {\n      return this.ownerDocument.createElementNS(name.space, name.local);\n    }\n    return typeof name === \"function\" ? name : (name = d3.ns.qualify(name)).local ? createNS : create;\n  }\n  d3_selectionPrototype.insert = function(name, before) {\n    name = d3_selection_creator(name);\n    before = d3_selection_selector(before);\n    return this.select(function() {\n      return this.insertBefore(name.apply(this, arguments), before.apply(this, arguments) || null);\n    });\n  };\n  d3_selectionPrototype.remove = function() {\n    return this.each(d3_selectionRemove);\n  };\n  function d3_selectionRemove() {\n    var parent = this.parentNode;\n    if (parent) parent.removeChild(this);\n  }\n  d3_selectionPrototype.data = function(value, key) {\n    var i = -1, n = this.length, group, node;\n    if (!arguments.length) {\n      value = new Array(n = (group = this[0]).length);\n      while (++i < n) {\n        if (node = group[i]) {\n          value[i] = node.__data__;\n        }\n      }\n      return value;\n    }\n    function bind(group, groupData) {\n      var i, n = group.length, m = groupData.length, n0 = Math.min(n, m), updateNodes = new Array(m), enterNodes = new Array(m), exitNodes = new Array(n), node, nodeData;\n      if (key) {\n        var nodeByKeyValue = new d3_Map(), keyValues = new Array(n), keyValue;\n        for (i = -1; ++i < n; ) {\n          if (node = group[i]) {\n            if (nodeByKeyValue.has(keyValue = key.call(node, node.__data__, i))) {\n              exitNodes[i] = node;\n            } else {\n              nodeByKeyValue.set(keyValue, node);\n            }\n            keyValues[i] = keyValue;\n          }\n        }\n        for (i = -1; ++i < m; ) {\n          if (!(node = nodeByKeyValue.get(keyValue = key.call(groupData, nodeData = groupData[i], i)))) {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          } else if (node !== true) {\n            updateNodes[i] = node;\n            node.__data__ = nodeData;\n          }\n          nodeByKeyValue.set(keyValue, true);\n        }\n        for (i = -1; ++i < n; ) {\n          if (i in keyValues && nodeByKeyValue.get(keyValues[i]) !== true) {\n            exitNodes[i] = group[i];\n          }\n        }\n      } else {\n        for (i = -1; ++i < n0; ) {\n          node = group[i];\n          nodeData = groupData[i];\n          if (node) {\n            node.__data__ = nodeData;\n            updateNodes[i] = node;\n          } else {\n            enterNodes[i] = d3_selection_dataNode(nodeData);\n          }\n        }\n        for (;i < m; ++i) {\n          enterNodes[i] = d3_selection_dataNode(groupData[i]);\n        }\n        for (;i < n; ++i) {\n          exitNodes[i] = group[i];\n        }\n      }\n      enterNodes.update = updateNodes;\n      enterNodes.parentNode = updateNodes.parentNode = exitNodes.parentNode = group.parentNode;\n      enter.push(enterNodes);\n      update.push(updateNodes);\n      exit.push(exitNodes);\n    }\n    var enter = d3_selection_enter([]), update = d3_selection([]), exit = d3_selection([]);\n    if (typeof value === \"function\") {\n      while (++i < n) {\n        bind(group = this[i], value.call(group, group.parentNode.__data__, i));\n      }\n    } else {\n      while (++i < n) {\n        bind(group = this[i], value);\n      }\n    }\n    update.enter = function() {\n      return enter;\n    };\n    update.exit = function() {\n      return exit;\n    };\n    return update;\n  };\n  function d3_selection_dataNode(data) {\n    return {\n      __data__: data\n    };\n  }\n  d3_selectionPrototype.datum = function(value) {\n    return arguments.length ? this.property(\"__data__\", value) : this.property(\"__data__\");\n  };\n  d3_selectionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = (group = this[j]).parentNode;\n      for (var i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  function d3_selection_filter(selector) {\n    return function() {\n      return d3_selectMatches(this, selector);\n    };\n  }\n  d3_selectionPrototype.order = function() {\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = group.length - 1, next = group[i], node; --i >= 0; ) {\n        if (node = group[i]) {\n          if (next && next !== node.nextSibling) next.parentNode.insertBefore(node, next);\n          next = node;\n        }\n      }\n    }\n    return this;\n  };\n  d3_selectionPrototype.sort = function(comparator) {\n    comparator = d3_selection_sortComparator.apply(this, arguments);\n    for (var j = -1, m = this.length; ++j < m; ) this[j].sort(comparator);\n    return this.order();\n  };\n  function d3_selection_sortComparator(comparator) {\n    if (!arguments.length) comparator = d3_ascending;\n    return function(a, b) {\n      return a && b ? comparator(a.__data__, b.__data__) : !a - !b;\n    };\n  }\n  d3_selectionPrototype.each = function(callback) {\n    return d3_selection_each(this, function(node, i, j) {\n      callback.call(node, node.__data__, i, j);\n    });\n  };\n  function d3_selection_each(groups, callback) {\n    for (var j = 0, m = groups.length; j < m; j++) {\n      for (var group = groups[j], i = 0, n = group.length, node; i < n; i++) {\n        if (node = group[i]) callback(node, i, j);\n      }\n    }\n    return groups;\n  }\n  d3_selectionPrototype.call = function(callback) {\n    var args = d3_array(arguments);\n    callback.apply(args[0] = this, args);\n    return this;\n  };\n  d3_selectionPrototype.empty = function() {\n    return !this.node();\n  };\n  d3_selectionPrototype.node = function() {\n    for (var j = 0, m = this.length; j < m; j++) {\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        var node = group[i];\n        if (node) return node;\n      }\n    }\n    return null;\n  };\n  d3_selectionPrototype.size = function() {\n    var n = 0;\n    d3_selection_each(this, function() {\n      ++n;\n    });\n    return n;\n  };\n  function d3_selection_enter(selection) {\n    d3_subclass(selection, d3_selection_enterPrototype);\n    return selection;\n  }\n  var d3_selection_enterPrototype = [];\n  d3.selection.enter = d3_selection_enter;\n  d3.selection.enter.prototype = d3_selection_enterPrototype;\n  d3_selection_enterPrototype.append = d3_selectionPrototype.append;\n  d3_selection_enterPrototype.empty = d3_selectionPrototype.empty;\n  d3_selection_enterPrototype.node = d3_selectionPrototype.node;\n  d3_selection_enterPrototype.call = d3_selectionPrototype.call;\n  d3_selection_enterPrototype.size = d3_selectionPrototype.size;\n  d3_selection_enterPrototype.select = function(selector) {\n    var subgroups = [], subgroup, subnode, upgroup, group, node;\n    for (var j = -1, m = this.length; ++j < m; ) {\n      upgroup = (group = this[j]).update;\n      subgroups.push(subgroup = []);\n      subgroup.parentNode = group.parentNode;\n      for (var i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          subgroup.push(upgroup[i] = subnode = selector.call(group.parentNode, node.__data__, i, j));\n          subnode.__data__ = node.__data__;\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_selection(subgroups);\n  };\n  d3_selection_enterPrototype.insert = function(name, before) {\n    if (arguments.length < 2) before = d3_selection_enterInsertBefore(this);\n    return d3_selectionPrototype.insert.call(this, name, before);\n  };\n  function d3_selection_enterInsertBefore(enter) {\n    var i0, j0;\n    return function(d, i, j) {\n      var group = enter[j].update, n = group.length, node;\n      if (j != j0) j0 = j, i0 = 0;\n      if (i >= i0) i0 = i + 1;\n      while (!(node = group[i0]) && ++i0 < n) ;\n      return node;\n    };\n  }\n  d3.select = function(node) {\n    var group;\n    if (typeof node === \"string\") {\n      group = [ d3_select(node, d3_document) ];\n      group.parentNode = d3_document.documentElement;\n    } else {\n      group = [ node ];\n      group.parentNode = d3_documentElement(node);\n    }\n    return d3_selection([ group ]);\n  };\n  d3.selectAll = function(nodes) {\n    var group;\n    if (typeof nodes === \"string\") {\n      group = d3_array(d3_selectAll(nodes, d3_document));\n      group.parentNode = d3_document.documentElement;\n    } else {\n      group = d3_array(nodes);\n      group.parentNode = null;\n    }\n    return d3_selection([ group ]);\n  };\n  d3_selectionPrototype.on = function(type, listener, capture) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof type !== \"string\") {\n        if (n < 2) listener = false;\n        for (capture in type) this.each(d3_selection_on(capture, type[capture], listener));\n        return this;\n      }\n      if (n < 2) return (n = this.node()[\"__on\" + type]) && n._;\n      capture = false;\n    }\n    return this.each(d3_selection_on(type, listener, capture));\n  };\n  function d3_selection_on(type, listener, capture) {\n    var name = \"__on\" + type, i = type.indexOf(\".\"), wrap = d3_selection_onListener;\n    if (i > 0) type = type.slice(0, i);\n    var filter = d3_selection_onFilters.get(type);\n    if (filter) type = filter, wrap = d3_selection_onFilter;\n    function onRemove() {\n      var l = this[name];\n      if (l) {\n        this.removeEventListener(type, l, l.$);\n        delete this[name];\n      }\n    }\n    function onAdd() {\n      var l = wrap(listener, d3_array(arguments));\n      onRemove.call(this);\n      this.addEventListener(type, this[name] = l, l.$ = capture);\n      l._ = listener;\n    }\n    function removeAll() {\n      var re = new RegExp(\"^__on([^.]+)\" + d3.requote(type) + \"$\"), match;\n      for (var name in this) {\n        if (match = name.match(re)) {\n          var l = this[name];\n          this.removeEventListener(match[1], l, l.$);\n          delete this[name];\n        }\n      }\n    }\n    return i ? listener ? onAdd : onRemove : listener ? d3_noop : removeAll;\n  }\n  var d3_selection_onFilters = d3.map({\n    mouseenter: \"mouseover\",\n    mouseleave: \"mouseout\"\n  });\n  if (d3_document) {\n    d3_selection_onFilters.forEach(function(k) {\n      if (\"on\" + k in d3_document) d3_selection_onFilters.remove(k);\n    });\n  }\n  function d3_selection_onListener(listener, argumentz) {\n    return function(e) {\n      var o = d3.event;\n      d3.event = e;\n      argumentz[0] = this.__data__;\n      try {\n        listener.apply(this, argumentz);\n      } finally {\n        d3.event = o;\n      }\n    };\n  }\n  function d3_selection_onFilter(listener, argumentz) {\n    var l = d3_selection_onListener(listener, argumentz);\n    return function(e) {\n      var target = this, related = e.relatedTarget;\n      if (!related || related !== target && !(related.compareDocumentPosition(target) & 8)) {\n        l.call(target, e);\n      }\n    };\n  }\n  var d3_event_dragSelect, d3_event_dragId = 0;\n  function d3_event_dragSuppress(node) {\n    var name = \".dragsuppress-\" + ++d3_event_dragId, click = \"click\" + name, w = d3.select(d3_window(node)).on(\"touchmove\" + name, d3_eventPreventDefault).on(\"dragstart\" + name, d3_eventPreventDefault).on(\"selectstart\" + name, d3_eventPreventDefault);\n    if (d3_event_dragSelect == null) {\n      d3_event_dragSelect = \"onselectstart\" in node ? false : d3_vendorSymbol(node.style, \"userSelect\");\n    }\n    if (d3_event_dragSelect) {\n      var style = d3_documentElement(node).style, select = style[d3_event_dragSelect];\n      style[d3_event_dragSelect] = \"none\";\n    }\n    return function(suppressClick) {\n      w.on(name, null);\n      if (d3_event_dragSelect) style[d3_event_dragSelect] = select;\n      if (suppressClick) {\n        var off = function() {\n          w.on(click, null);\n        };\n        w.on(click, function() {\n          d3_eventPreventDefault();\n          off();\n        }, true);\n        setTimeout(off, 0);\n      }\n    };\n  }\n  d3.mouse = function(container) {\n    return d3_mousePoint(container, d3_eventSource());\n  };\n  var d3_mouse_bug44083 = this.navigator && /WebKit/.test(this.navigator.userAgent) ? -1 : 0;\n  function d3_mousePoint(container, e) {\n    if (e.changedTouches) e = e.changedTouches[0];\n    var svg = container.ownerSVGElement || container;\n    if (svg.createSVGPoint) {\n      var point = svg.createSVGPoint();\n      if (d3_mouse_bug44083 < 0) {\n        var window = d3_window(container);\n        if (window.scrollX || window.scrollY) {\n          svg = d3.select(\"body\").append(\"svg\").style({\n            position: \"absolute\",\n            top: 0,\n            left: 0,\n            margin: 0,\n            padding: 0,\n            border: \"none\"\n          }, \"important\");\n          var ctm = svg[0][0].getScreenCTM();\n          d3_mouse_bug44083 = !(ctm.f || ctm.e);\n          svg.remove();\n        }\n      }\n      if (d3_mouse_bug44083) point.x = e.pageX, point.y = e.pageY; else point.x = e.clientX, \n      point.y = e.clientY;\n      point = point.matrixTransform(container.getScreenCTM().inverse());\n      return [ point.x, point.y ];\n    }\n    var rect = container.getBoundingClientRect();\n    return [ e.clientX - rect.left - container.clientLeft, e.clientY - rect.top - container.clientTop ];\n  }\n  d3.touch = function(container, touches, identifier) {\n    if (arguments.length < 3) identifier = touches, touches = d3_eventSource().changedTouches;\n    if (touches) for (var i = 0, n = touches.length, touch; i < n; ++i) {\n      if ((touch = touches[i]).identifier === identifier) {\n        return d3_mousePoint(container, touch);\n      }\n    }\n  };\n  d3.behavior.drag = function() {\n    var event = d3_eventDispatch(drag, \"drag\", \"dragstart\", \"dragend\"), origin = null, mousedown = dragstart(d3_noop, d3.mouse, d3_window, \"mousemove\", \"mouseup\"), touchstart = dragstart(d3_behavior_dragTouchId, d3.touch, d3_identity, \"touchmove\", \"touchend\");\n    function drag() {\n      this.on(\"mousedown.drag\", mousedown).on(\"touchstart.drag\", touchstart);\n    }\n    function dragstart(id, position, subject, move, end) {\n      return function() {\n        var that = this, target = d3.event.target.correspondingElement || d3.event.target, parent = that.parentNode, dispatch = event.of(that, arguments), dragged = 0, dragId = id(), dragName = \".drag\" + (dragId == null ? \"\" : \"-\" + dragId), dragOffset, dragSubject = d3.select(subject(target)).on(move + dragName, moved).on(end + dragName, ended), dragRestore = d3_event_dragSuppress(target), position0 = position(parent, dragId);\n        if (origin) {\n          dragOffset = origin.apply(that, arguments);\n          dragOffset = [ dragOffset.x - position0[0], dragOffset.y - position0[1] ];\n        } else {\n          dragOffset = [ 0, 0 ];\n        }\n        dispatch({\n          type: \"dragstart\"\n        });\n        function moved() {\n          var position1 = position(parent, dragId), dx, dy;\n          if (!position1) return;\n          dx = position1[0] - position0[0];\n          dy = position1[1] - position0[1];\n          dragged |= dx | dy;\n          position0 = position1;\n          dispatch({\n            type: \"drag\",\n            x: position1[0] + dragOffset[0],\n            y: position1[1] + dragOffset[1],\n            dx: dx,\n            dy: dy\n          });\n        }\n        function ended() {\n          if (!position(parent, dragId)) return;\n          dragSubject.on(move + dragName, null).on(end + dragName, null);\n          dragRestore(dragged);\n          dispatch({\n            type: \"dragend\"\n          });\n        }\n      };\n    }\n    drag.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return drag;\n    };\n    return d3.rebind(drag, event, \"on\");\n  };\n  function d3_behavior_dragTouchId() {\n    return d3.event.changedTouches[0].identifier;\n  }\n  d3.touches = function(container, touches) {\n    if (arguments.length < 2) touches = d3_eventSource().touches;\n    return touches ? d3_array(touches).map(function(touch) {\n      var point = d3_mousePoint(container, touch);\n      point.identifier = touch.identifier;\n      return point;\n    }) : [];\n  };\n  var ε = 1e-6, ε2 = ε * ε, π = Math.PI, τ = 2 * π, τε = τ - ε, halfπ = π / 2, d3_radians = π / 180, d3_degrees = 180 / π;\n  function d3_sgn(x) {\n    return x > 0 ? 1 : x < 0 ? -1 : 0;\n  }\n  function d3_cross2d(a, b, c) {\n    return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);\n  }\n  function d3_acos(x) {\n    return x > 1 ? 0 : x < -1 ? π : Math.acos(x);\n  }\n  function d3_asin(x) {\n    return x > 1 ? halfπ : x < -1 ? -halfπ : Math.asin(x);\n  }\n  function d3_sinh(x) {\n    return ((x = Math.exp(x)) - 1 / x) / 2;\n  }\n  function d3_cosh(x) {\n    return ((x = Math.exp(x)) + 1 / x) / 2;\n  }\n  function d3_tanh(x) {\n    return ((x = Math.exp(2 * x)) - 1) / (x + 1);\n  }\n  function d3_haversin(x) {\n    return (x = Math.sin(x / 2)) * x;\n  }\n  var ρ = Math.SQRT2, ρ2 = 2, ρ4 = 4;\n  d3.interpolateZoom = function(p0, p1) {\n    var ux0 = p0[0], uy0 = p0[1], w0 = p0[2], ux1 = p1[0], uy1 = p1[1], w1 = p1[2], dx = ux1 - ux0, dy = uy1 - uy0, d2 = dx * dx + dy * dy, i, S;\n    if (d2 < ε2) {\n      S = Math.log(w1 / w0) / ρ;\n      i = function(t) {\n        return [ ux0 + t * dx, uy0 + t * dy, w0 * Math.exp(ρ * t * S) ];\n      };\n    } else {\n      var d1 = Math.sqrt(d2), b0 = (w1 * w1 - w0 * w0 + ρ4 * d2) / (2 * w0 * ρ2 * d1), b1 = (w1 * w1 - w0 * w0 - ρ4 * d2) / (2 * w1 * ρ2 * d1), r0 = Math.log(Math.sqrt(b0 * b0 + 1) - b0), r1 = Math.log(Math.sqrt(b1 * b1 + 1) - b1);\n      S = (r1 - r0) / ρ;\n      i = function(t) {\n        var s = t * S, coshr0 = d3_cosh(r0), u = w0 / (ρ2 * d1) * (coshr0 * d3_tanh(ρ * s + r0) - d3_sinh(r0));\n        return [ ux0 + u * dx, uy0 + u * dy, w0 * coshr0 / d3_cosh(ρ * s + r0) ];\n      };\n    }\n    i.duration = S * 1e3;\n    return i;\n  };\n  d3.behavior.zoom = function() {\n    var view = {\n      x: 0,\n      y: 0,\n      k: 1\n    }, translate0, center0, center, size = [ 960, 500 ], scaleExtent = d3_behavior_zoomInfinity, duration = 250, zooming = 0, mousedown = \"mousedown.zoom\", mousemove = \"mousemove.zoom\", mouseup = \"mouseup.zoom\", mousewheelTimer, touchstart = \"touchstart.zoom\", touchtime, event = d3_eventDispatch(zoom, \"zoomstart\", \"zoom\", \"zoomend\"), x0, x1, y0, y1;\n    if (!d3_behavior_zoomWheel) {\n      d3_behavior_zoomWheel = \"onwheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n        return -d3.event.deltaY * (d3.event.deltaMode ? 120 : 1);\n      }, \"wheel\") : \"onmousewheel\" in d3_document ? (d3_behavior_zoomDelta = function() {\n        return d3.event.wheelDelta;\n      }, \"mousewheel\") : (d3_behavior_zoomDelta = function() {\n        return -d3.event.detail;\n      }, \"MozMousePixelScroll\");\n    }\n    function zoom(g) {\n      g.on(mousedown, mousedowned).on(d3_behavior_zoomWheel + \".zoom\", mousewheeled).on(\"dblclick.zoom\", dblclicked).on(touchstart, touchstarted);\n    }\n    zoom.event = function(g) {\n      g.each(function() {\n        var dispatch = event.of(this, arguments), view1 = view;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.zoom\", function() {\n            view = this.__chart__ || {\n              x: 0,\n              y: 0,\n              k: 1\n            };\n            zoomstarted(dispatch);\n          }).tween(\"zoom:zoom\", function() {\n            var dx = size[0], dy = size[1], cx = center0 ? center0[0] : dx / 2, cy = center0 ? center0[1] : dy / 2, i = d3.interpolateZoom([ (cx - view.x) / view.k, (cy - view.y) / view.k, dx / view.k ], [ (cx - view1.x) / view1.k, (cy - view1.y) / view1.k, dx / view1.k ]);\n            return function(t) {\n              var l = i(t), k = dx / l[2];\n              this.__chart__ = view = {\n                x: cx - l[0] * k,\n                y: cy - l[1] * k,\n                k: k\n              };\n              zoomed(dispatch);\n            };\n          }).each(\"interrupt.zoom\", function() {\n            zoomended(dispatch);\n          }).each(\"end.zoom\", function() {\n            zoomended(dispatch);\n          });\n        } else {\n          this.__chart__ = view;\n          zoomstarted(dispatch);\n          zoomed(dispatch);\n          zoomended(dispatch);\n        }\n      });\n    };\n    zoom.translate = function(_) {\n      if (!arguments.length) return [ view.x, view.y ];\n      view = {\n        x: +_[0],\n        y: +_[1],\n        k: view.k\n      };\n      rescale();\n      return zoom;\n    };\n    zoom.scale = function(_) {\n      if (!arguments.length) return view.k;\n      view = {\n        x: view.x,\n        y: view.y,\n        k: null\n      };\n      scaleTo(+_);\n      rescale();\n      return zoom;\n    };\n    zoom.scaleExtent = function(_) {\n      if (!arguments.length) return scaleExtent;\n      scaleExtent = _ == null ? d3_behavior_zoomInfinity : [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.center = function(_) {\n      if (!arguments.length) return center;\n      center = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.size = function(_) {\n      if (!arguments.length) return size;\n      size = _ && [ +_[0], +_[1] ];\n      return zoom;\n    };\n    zoom.duration = function(_) {\n      if (!arguments.length) return duration;\n      duration = +_;\n      return zoom;\n    };\n    zoom.x = function(z) {\n      if (!arguments.length) return x1;\n      x1 = z;\n      x0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    zoom.y = function(z) {\n      if (!arguments.length) return y1;\n      y1 = z;\n      y0 = z.copy();\n      view = {\n        x: 0,\n        y: 0,\n        k: 1\n      };\n      return zoom;\n    };\n    function location(p) {\n      return [ (p[0] - view.x) / view.k, (p[1] - view.y) / view.k ];\n    }\n    function point(l) {\n      return [ l[0] * view.k + view.x, l[1] * view.k + view.y ];\n    }\n    function scaleTo(s) {\n      view.k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], s));\n    }\n    function translateTo(p, l) {\n      l = point(l);\n      view.x += p[0] - l[0];\n      view.y += p[1] - l[1];\n    }\n    function zoomTo(that, p, l, k) {\n      that.__chart__ = {\n        x: view.x,\n        y: view.y,\n        k: view.k\n      };\n      scaleTo(Math.pow(2, k));\n      translateTo(center0 = p, l);\n      that = d3.select(that);\n      if (duration > 0) that = that.transition().duration(duration);\n      that.call(zoom.event);\n    }\n    function rescale() {\n      if (x1) x1.domain(x0.range().map(function(x) {\n        return (x - view.x) / view.k;\n      }).map(x0.invert));\n      if (y1) y1.domain(y0.range().map(function(y) {\n        return (y - view.y) / view.k;\n      }).map(y0.invert));\n    }\n    function zoomstarted(dispatch) {\n      if (!zooming++) dispatch({\n        type: \"zoomstart\"\n      });\n    }\n    function zoomed(dispatch) {\n      rescale();\n      dispatch({\n        type: \"zoom\",\n        scale: view.k,\n        translate: [ view.x, view.y ]\n      });\n    }\n    function zoomended(dispatch) {\n      if (!--zooming) dispatch({\n        type: \"zoomend\"\n      }), center0 = null;\n    }\n    function mousedowned() {\n      var that = this, dispatch = event.of(that, arguments), dragged = 0, subject = d3.select(d3_window(that)).on(mousemove, moved).on(mouseup, ended), location0 = location(d3.mouse(that)), dragRestore = d3_event_dragSuppress(that);\n      d3_selection_interrupt.call(that);\n      zoomstarted(dispatch);\n      function moved() {\n        dragged = 1;\n        translateTo(d3.mouse(that), location0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        subject.on(mousemove, null).on(mouseup, null);\n        dragRestore(dragged);\n        zoomended(dispatch);\n      }\n    }\n    function touchstarted() {\n      var that = this, dispatch = event.of(that, arguments), locations0 = {}, distance0 = 0, scale0, zoomName = \".zoom-\" + d3.event.changedTouches[0].identifier, touchmove = \"touchmove\" + zoomName, touchend = \"touchend\" + zoomName, targets = [], subject = d3.select(that), dragRestore = d3_event_dragSuppress(that);\n      started();\n      zoomstarted(dispatch);\n      subject.on(mousedown, null).on(touchstart, started);\n      function relocate() {\n        var touches = d3.touches(that);\n        scale0 = view.k;\n        touches.forEach(function(t) {\n          if (t.identifier in locations0) locations0[t.identifier] = location(t);\n        });\n        return touches;\n      }\n      function started() {\n        var target = d3.event.target;\n        d3.select(target).on(touchmove, moved).on(touchend, ended);\n        targets.push(target);\n        var changed = d3.event.changedTouches;\n        for (var i = 0, n = changed.length; i < n; ++i) {\n          locations0[changed[i].identifier] = null;\n        }\n        var touches = relocate(), now = Date.now();\n        if (touches.length === 1) {\n          if (now - touchtime < 500) {\n            var p = touches[0];\n            zoomTo(that, p, locations0[p.identifier], Math.floor(Math.log(view.k) / Math.LN2) + 1);\n            d3_eventPreventDefault();\n          }\n          touchtime = now;\n        } else if (touches.length > 1) {\n          var p = touches[0], q = touches[1], dx = p[0] - q[0], dy = p[1] - q[1];\n          distance0 = dx * dx + dy * dy;\n        }\n      }\n      function moved() {\n        var touches = d3.touches(that), p0, l0, p1, l1;\n        d3_selection_interrupt.call(that);\n        for (var i = 0, n = touches.length; i < n; ++i, l1 = null) {\n          p1 = touches[i];\n          if (l1 = locations0[p1.identifier]) {\n            if (l0) break;\n            p0 = p1, l0 = l1;\n          }\n        }\n        if (l1) {\n          var distance1 = (distance1 = p1[0] - p0[0]) * distance1 + (distance1 = p1[1] - p0[1]) * distance1, scale1 = distance0 && Math.sqrt(distance1 / distance0);\n          p0 = [ (p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2 ];\n          l0 = [ (l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2 ];\n          scaleTo(scale1 * scale0);\n        }\n        touchtime = null;\n        translateTo(p0, l0);\n        zoomed(dispatch);\n      }\n      function ended() {\n        if (d3.event.touches.length) {\n          var changed = d3.event.changedTouches;\n          for (var i = 0, n = changed.length; i < n; ++i) {\n            delete locations0[changed[i].identifier];\n          }\n          for (var identifier in locations0) {\n            return void relocate();\n          }\n        }\n        d3.selectAll(targets).on(zoomName, null);\n        subject.on(mousedown, mousedowned).on(touchstart, touchstarted);\n        dragRestore();\n        zoomended(dispatch);\n      }\n    }\n    function mousewheeled() {\n      var dispatch = event.of(this, arguments);\n      if (mousewheelTimer) clearTimeout(mousewheelTimer); else d3_selection_interrupt.call(this), \n      translate0 = location(center0 = center || d3.mouse(this)), zoomstarted(dispatch);\n      mousewheelTimer = setTimeout(function() {\n        mousewheelTimer = null;\n        zoomended(dispatch);\n      }, 50);\n      d3_eventPreventDefault();\n      scaleTo(Math.pow(2, d3_behavior_zoomDelta() * .002) * view.k);\n      translateTo(center0, translate0);\n      zoomed(dispatch);\n    }\n    function dblclicked() {\n      var p = d3.mouse(this), k = Math.log(view.k) / Math.LN2;\n      zoomTo(this, p, location(p), d3.event.shiftKey ? Math.ceil(k) - 1 : Math.floor(k) + 1);\n    }\n    return d3.rebind(zoom, event, \"on\");\n  };\n  var d3_behavior_zoomInfinity = [ 0, Infinity ], d3_behavior_zoomDelta, d3_behavior_zoomWheel;\n  d3.color = d3_color;\n  function d3_color() {}\n  d3_color.prototype.toString = function() {\n    return this.rgb() + \"\";\n  };\n  d3.hsl = d3_hsl;\n  function d3_hsl(h, s, l) {\n    return this instanceof d3_hsl ? void (this.h = +h, this.s = +s, this.l = +l) : arguments.length < 2 ? h instanceof d3_hsl ? new d3_hsl(h.h, h.s, h.l) : d3_rgb_parse(\"\" + h, d3_rgb_hsl, d3_hsl) : new d3_hsl(h, s, l);\n  }\n  var d3_hslPrototype = d3_hsl.prototype = new d3_color();\n  d3_hslPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, this.l / k);\n  };\n  d3_hslPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_hsl(this.h, this.s, k * this.l);\n  };\n  d3_hslPrototype.rgb = function() {\n    return d3_hsl_rgb(this.h, this.s, this.l);\n  };\n  function d3_hsl_rgb(h, s, l) {\n    var m1, m2;\n    h = isNaN(h) ? 0 : (h %= 360) < 0 ? h + 360 : h;\n    s = isNaN(s) ? 0 : s < 0 ? 0 : s > 1 ? 1 : s;\n    l = l < 0 ? 0 : l > 1 ? 1 : l;\n    m2 = l <= .5 ? l * (1 + s) : l + s - l * s;\n    m1 = 2 * l - m2;\n    function v(h) {\n      if (h > 360) h -= 360; else if (h < 0) h += 360;\n      if (h < 60) return m1 + (m2 - m1) * h / 60;\n      if (h < 180) return m2;\n      if (h < 240) return m1 + (m2 - m1) * (240 - h) / 60;\n      return m1;\n    }\n    function vv(h) {\n      return Math.round(v(h) * 255);\n    }\n    return new d3_rgb(vv(h + 120), vv(h), vv(h - 120));\n  }\n  d3.hcl = d3_hcl;\n  function d3_hcl(h, c, l) {\n    return this instanceof d3_hcl ? void (this.h = +h, this.c = +c, this.l = +l) : arguments.length < 2 ? h instanceof d3_hcl ? new d3_hcl(h.h, h.c, h.l) : h instanceof d3_lab ? d3_lab_hcl(h.l, h.a, h.b) : d3_lab_hcl((h = d3_rgb_lab((h = d3.rgb(h)).r, h.g, h.b)).l, h.a, h.b) : new d3_hcl(h, c, l);\n  }\n  var d3_hclPrototype = d3_hcl.prototype = new d3_color();\n  d3_hclPrototype.brighter = function(k) {\n    return new d3_hcl(this.h, this.c, Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.darker = function(k) {\n    return new d3_hcl(this.h, this.c, Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)));\n  };\n  d3_hclPrototype.rgb = function() {\n    return d3_hcl_lab(this.h, this.c, this.l).rgb();\n  };\n  function d3_hcl_lab(h, c, l) {\n    if (isNaN(h)) h = 0;\n    if (isNaN(c)) c = 0;\n    return new d3_lab(l, Math.cos(h *= d3_radians) * c, Math.sin(h) * c);\n  }\n  d3.lab = d3_lab;\n  function d3_lab(l, a, b) {\n    return this instanceof d3_lab ? void (this.l = +l, this.a = +a, this.b = +b) : arguments.length < 2 ? l instanceof d3_lab ? new d3_lab(l.l, l.a, l.b) : l instanceof d3_hcl ? d3_hcl_lab(l.h, l.c, l.l) : d3_rgb_lab((l = d3_rgb(l)).r, l.g, l.b) : new d3_lab(l, a, b);\n  }\n  var d3_lab_K = 18;\n  var d3_lab_X = .95047, d3_lab_Y = 1, d3_lab_Z = 1.08883;\n  var d3_labPrototype = d3_lab.prototype = new d3_color();\n  d3_labPrototype.brighter = function(k) {\n    return new d3_lab(Math.min(100, this.l + d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.darker = function(k) {\n    return new d3_lab(Math.max(0, this.l - d3_lab_K * (arguments.length ? k : 1)), this.a, this.b);\n  };\n  d3_labPrototype.rgb = function() {\n    return d3_lab_rgb(this.l, this.a, this.b);\n  };\n  function d3_lab_rgb(l, a, b) {\n    var y = (l + 16) / 116, x = y + a / 500, z = y - b / 200;\n    x = d3_lab_xyz(x) * d3_lab_X;\n    y = d3_lab_xyz(y) * d3_lab_Y;\n    z = d3_lab_xyz(z) * d3_lab_Z;\n    return new d3_rgb(d3_xyz_rgb(3.2404542 * x - 1.5371385 * y - .4985314 * z), d3_xyz_rgb(-.969266 * x + 1.8760108 * y + .041556 * z), d3_xyz_rgb(.0556434 * x - .2040259 * y + 1.0572252 * z));\n  }\n  function d3_lab_hcl(l, a, b) {\n    return l > 0 ? new d3_hcl(Math.atan2(b, a) * d3_degrees, Math.sqrt(a * a + b * b), l) : new d3_hcl(NaN, NaN, l);\n  }\n  function d3_lab_xyz(x) {\n    return x > .206893034 ? x * x * x : (x - 4 / 29) / 7.787037;\n  }\n  function d3_xyz_lab(x) {\n    return x > .008856 ? Math.pow(x, 1 / 3) : 7.787037 * x + 4 / 29;\n  }\n  function d3_xyz_rgb(r) {\n    return Math.round(255 * (r <= .00304 ? 12.92 * r : 1.055 * Math.pow(r, 1 / 2.4) - .055));\n  }\n  d3.rgb = d3_rgb;\n  function d3_rgb(r, g, b) {\n    return this instanceof d3_rgb ? void (this.r = ~~r, this.g = ~~g, this.b = ~~b) : arguments.length < 2 ? r instanceof d3_rgb ? new d3_rgb(r.r, r.g, r.b) : d3_rgb_parse(\"\" + r, d3_rgb, d3_hsl_rgb) : new d3_rgb(r, g, b);\n  }\n  function d3_rgbNumber(value) {\n    return new d3_rgb(value >> 16, value >> 8 & 255, value & 255);\n  }\n  function d3_rgbString(value) {\n    return d3_rgbNumber(value) + \"\";\n  }\n  var d3_rgbPrototype = d3_rgb.prototype = new d3_color();\n  d3_rgbPrototype.brighter = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    var r = this.r, g = this.g, b = this.b, i = 30;\n    if (!r && !g && !b) return new d3_rgb(i, i, i);\n    if (r && r < i) r = i;\n    if (g && g < i) g = i;\n    if (b && b < i) b = i;\n    return new d3_rgb(Math.min(255, r / k), Math.min(255, g / k), Math.min(255, b / k));\n  };\n  d3_rgbPrototype.darker = function(k) {\n    k = Math.pow(.7, arguments.length ? k : 1);\n    return new d3_rgb(k * this.r, k * this.g, k * this.b);\n  };\n  d3_rgbPrototype.hsl = function() {\n    return d3_rgb_hsl(this.r, this.g, this.b);\n  };\n  d3_rgbPrototype.toString = function() {\n    return \"#\" + d3_rgb_hex(this.r) + d3_rgb_hex(this.g) + d3_rgb_hex(this.b);\n  };\n  function d3_rgb_hex(v) {\n    return v < 16 ? \"0\" + Math.max(0, v).toString(16) : Math.min(255, v).toString(16);\n  }\n  function d3_rgb_parse(format, rgb, hsl) {\n    var r = 0, g = 0, b = 0, m1, m2, color;\n    m1 = /([a-z]+)\\((.*)\\)/.exec(format = format.toLowerCase());\n    if (m1) {\n      m2 = m1[2].split(\",\");\n      switch (m1[1]) {\n       case \"hsl\":\n        {\n          return hsl(parseFloat(m2[0]), parseFloat(m2[1]) / 100, parseFloat(m2[2]) / 100);\n        }\n\n       case \"rgb\":\n        {\n          return rgb(d3_rgb_parseNumber(m2[0]), d3_rgb_parseNumber(m2[1]), d3_rgb_parseNumber(m2[2]));\n        }\n      }\n    }\n    if (color = d3_rgb_names.get(format)) {\n      return rgb(color.r, color.g, color.b);\n    }\n    if (format != null && format.charAt(0) === \"#\" && !isNaN(color = parseInt(format.slice(1), 16))) {\n      if (format.length === 4) {\n        r = (color & 3840) >> 4;\n        r = r >> 4 | r;\n        g = color & 240;\n        g = g >> 4 | g;\n        b = color & 15;\n        b = b << 4 | b;\n      } else if (format.length === 7) {\n        r = (color & 16711680) >> 16;\n        g = (color & 65280) >> 8;\n        b = color & 255;\n      }\n    }\n    return rgb(r, g, b);\n  }\n  function d3_rgb_hsl(r, g, b) {\n    var min = Math.min(r /= 255, g /= 255, b /= 255), max = Math.max(r, g, b), d = max - min, h, s, l = (max + min) / 2;\n    if (d) {\n      s = l < .5 ? d / (max + min) : d / (2 - max - min);\n      if (r == max) h = (g - b) / d + (g < b ? 6 : 0); else if (g == max) h = (b - r) / d + 2; else h = (r - g) / d + 4;\n      h *= 60;\n    } else {\n      h = NaN;\n      s = l > 0 && l < 1 ? 0 : h;\n    }\n    return new d3_hsl(h, s, l);\n  }\n  function d3_rgb_lab(r, g, b) {\n    r = d3_rgb_xyz(r);\n    g = d3_rgb_xyz(g);\n    b = d3_rgb_xyz(b);\n    var x = d3_xyz_lab((.4124564 * r + .3575761 * g + .1804375 * b) / d3_lab_X), y = d3_xyz_lab((.2126729 * r + .7151522 * g + .072175 * b) / d3_lab_Y), z = d3_xyz_lab((.0193339 * r + .119192 * g + .9503041 * b) / d3_lab_Z);\n    return d3_lab(116 * y - 16, 500 * (x - y), 200 * (y - z));\n  }\n  function d3_rgb_xyz(r) {\n    return (r /= 255) <= .04045 ? r / 12.92 : Math.pow((r + .055) / 1.055, 2.4);\n  }\n  function d3_rgb_parseNumber(c) {\n    var f = parseFloat(c);\n    return c.charAt(c.length - 1) === \"%\" ? Math.round(f * 2.55) : f;\n  }\n  var d3_rgb_names = d3.map({\n    aliceblue: 15792383,\n    antiquewhite: 16444375,\n    aqua: 65535,\n    aquamarine: 8388564,\n    azure: 15794175,\n    beige: 16119260,\n    bisque: 16770244,\n    black: 0,\n    blanchedalmond: 16772045,\n    blue: 255,\n    blueviolet: 9055202,\n    brown: 10824234,\n    burlywood: 14596231,\n    cadetblue: 6266528,\n    chartreuse: 8388352,\n    chocolate: 13789470,\n    coral: 16744272,\n    cornflowerblue: 6591981,\n    cornsilk: 16775388,\n    crimson: 14423100,\n    cyan: 65535,\n    darkblue: 139,\n    darkcyan: 35723,\n    darkgoldenrod: 12092939,\n    darkgray: 11119017,\n    darkgreen: 25600,\n    darkgrey: 11119017,\n    darkkhaki: 12433259,\n    darkmagenta: 9109643,\n    darkolivegreen: 5597999,\n    darkorange: 16747520,\n    darkorchid: 10040012,\n    darkred: 9109504,\n    darksalmon: 15308410,\n    darkseagreen: 9419919,\n    darkslateblue: 4734347,\n    darkslategray: 3100495,\n    darkslategrey: 3100495,\n    darkturquoise: 52945,\n    darkviolet: 9699539,\n    deeppink: 16716947,\n    deepskyblue: 49151,\n    dimgray: 6908265,\n    dimgrey: 6908265,\n    dodgerblue: 2003199,\n    firebrick: 11674146,\n    floralwhite: 16775920,\n    forestgreen: 2263842,\n    fuchsia: 16711935,\n    gainsboro: 14474460,\n    ghostwhite: 16316671,\n    gold: 16766720,\n    goldenrod: 14329120,\n    gray: 8421504,\n    green: 32768,\n    greenyellow: 11403055,\n    grey: 8421504,\n    honeydew: 15794160,\n    hotpink: 16738740,\n    indianred: 13458524,\n    indigo: 4915330,\n    ivory: 16777200,\n    khaki: 15787660,\n    lavender: 15132410,\n    lavenderblush: 16773365,\n    lawngreen: 8190976,\n    lemonchiffon: 16775885,\n    lightblue: 11393254,\n    lightcoral: 15761536,\n    lightcyan: 14745599,\n    lightgoldenrodyellow: 16448210,\n    lightgray: 13882323,\n    lightgreen: 9498256,\n    lightgrey: 13882323,\n    lightpink: 16758465,\n    lightsalmon: 16752762,\n    lightseagreen: 2142890,\n    lightskyblue: 8900346,\n    lightslategray: 7833753,\n    lightslategrey: 7833753,\n    lightsteelblue: 11584734,\n    lightyellow: 16777184,\n    lime: 65280,\n    limegreen: 3329330,\n    linen: 16445670,\n    magenta: 16711935,\n    maroon: 8388608,\n    mediumaquamarine: 6737322,\n    mediumblue: 205,\n    mediumorchid: 12211667,\n    mediumpurple: 9662683,\n    mediumseagreen: 3978097,\n    mediumslateblue: 8087790,\n    mediumspringgreen: 64154,\n    mediumturquoise: 4772300,\n    mediumvioletred: 13047173,\n    midnightblue: 1644912,\n    mintcream: 16121850,\n    mistyrose: 16770273,\n    moccasin: 16770229,\n    navajowhite: 16768685,\n    navy: 128,\n    oldlace: 16643558,\n    olive: 8421376,\n    olivedrab: 7048739,\n    orange: 16753920,\n    orangered: 16729344,\n    orchid: 14315734,\n    palegoldenrod: 15657130,\n    palegreen: 10025880,\n    paleturquoise: 11529966,\n    palevioletred: 14381203,\n    papayawhip: 16773077,\n    peachpuff: 16767673,\n    peru: 13468991,\n    pink: 16761035,\n    plum: 14524637,\n    powderblue: 11591910,\n    purple: 8388736,\n    rebeccapurple: 6697881,\n    red: 16711680,\n    rosybrown: 12357519,\n    royalblue: 4286945,\n    saddlebrown: 9127187,\n    salmon: 16416882,\n    sandybrown: 16032864,\n    seagreen: 3050327,\n    seashell: 16774638,\n    sienna: 10506797,\n    silver: 12632256,\n    skyblue: 8900331,\n    slateblue: 6970061,\n    slategray: 7372944,\n    slategrey: 7372944,\n    snow: 16775930,\n    springgreen: 65407,\n    steelblue: 4620980,\n    tan: 13808780,\n    teal: 32896,\n    thistle: 14204888,\n    tomato: 16737095,\n    turquoise: 4251856,\n    violet: 15631086,\n    wheat: 16113331,\n    white: 16777215,\n    whitesmoke: 16119285,\n    yellow: 16776960,\n    yellowgreen: 10145074\n  });\n  d3_rgb_names.forEach(function(key, value) {\n    d3_rgb_names.set(key, d3_rgbNumber(value));\n  });\n  function d3_functor(v) {\n    return typeof v === \"function\" ? v : function() {\n      return v;\n    };\n  }\n  d3.functor = d3_functor;\n  d3.xhr = d3_xhrType(d3_identity);\n  function d3_xhrType(response) {\n    return function(url, mimeType, callback) {\n      if (arguments.length === 2 && typeof mimeType === \"function\") callback = mimeType, \n      mimeType = null;\n      return d3_xhr(url, mimeType, response, callback);\n    };\n  }\n  function d3_xhr(url, mimeType, response, callback) {\n    var xhr = {}, dispatch = d3.dispatch(\"beforesend\", \"progress\", \"load\", \"error\"), headers = {}, request = new XMLHttpRequest(), responseType = null;\n    if (this.XDomainRequest && !(\"withCredentials\" in request) && /^(http(s)?:)?\\/\\//.test(url)) request = new XDomainRequest();\n    \"onload\" in request ? request.onload = request.onerror = respond : request.onreadystatechange = function() {\n      request.readyState > 3 && respond();\n    };\n    function respond() {\n      var status = request.status, result;\n      if (!status && d3_xhrHasResponse(request) || status >= 200 && status < 300 || status === 304) {\n        try {\n          result = response.call(xhr, request);\n        } catch (e) {\n          dispatch.error.call(xhr, e);\n          return;\n        }\n        dispatch.load.call(xhr, result);\n      } else {\n        dispatch.error.call(xhr, request);\n      }\n    }\n    request.onprogress = function(event) {\n      var o = d3.event;\n      d3.event = event;\n      try {\n        dispatch.progress.call(xhr, request);\n      } finally {\n        d3.event = o;\n      }\n    };\n    xhr.header = function(name, value) {\n      name = (name + \"\").toLowerCase();\n      if (arguments.length < 2) return headers[name];\n      if (value == null) delete headers[name]; else headers[name] = value + \"\";\n      return xhr;\n    };\n    xhr.mimeType = function(value) {\n      if (!arguments.length) return mimeType;\n      mimeType = value == null ? null : value + \"\";\n      return xhr;\n    };\n    xhr.responseType = function(value) {\n      if (!arguments.length) return responseType;\n      responseType = value;\n      return xhr;\n    };\n    xhr.response = function(value) {\n      response = value;\n      return xhr;\n    };\n    [ \"get\", \"post\" ].forEach(function(method) {\n      xhr[method] = function() {\n        return xhr.send.apply(xhr, [ method ].concat(d3_array(arguments)));\n      };\n    });\n    xhr.send = function(method, data, callback) {\n      if (arguments.length === 2 && typeof data === \"function\") callback = data, data = null;\n      request.open(method, url, true);\n      if (mimeType != null && !(\"accept\" in headers)) headers[\"accept\"] = mimeType + \",*/*\";\n      if (request.setRequestHeader) for (var name in headers) request.setRequestHeader(name, headers[name]);\n      if (mimeType != null && request.overrideMimeType) request.overrideMimeType(mimeType);\n      if (responseType != null) request.responseType = responseType;\n      if (callback != null) xhr.on(\"error\", callback).on(\"load\", function(request) {\n        callback(null, request);\n      });\n      dispatch.beforesend.call(xhr, request);\n      request.send(data == null ? null : data);\n      return xhr;\n    };\n    xhr.abort = function() {\n      request.abort();\n      return xhr;\n    };\n    d3.rebind(xhr, dispatch, \"on\");\n    return callback == null ? xhr : xhr.get(d3_xhr_fixCallback(callback));\n  }\n  function d3_xhr_fixCallback(callback) {\n    return callback.length === 1 ? function(error, request) {\n      callback(error == null ? request : null);\n    } : callback;\n  }\n  function d3_xhrHasResponse(request) {\n    var type = request.responseType;\n    return type && type !== \"text\" ? request.response : request.responseText;\n  }\n  d3.dsv = function(delimiter, mimeType) {\n    var reFormat = new RegExp('[\"' + delimiter + \"\\n]\"), delimiterCode = delimiter.charCodeAt(0);\n    function dsv(url, row, callback) {\n      if (arguments.length < 3) callback = row, row = null;\n      var xhr = d3_xhr(url, mimeType, row == null ? response : typedResponse(row), callback);\n      xhr.row = function(_) {\n        return arguments.length ? xhr.response((row = _) == null ? response : typedResponse(_)) : row;\n      };\n      return xhr;\n    }\n    function response(request) {\n      return dsv.parse(request.responseText);\n    }\n    function typedResponse(f) {\n      return function(request) {\n        return dsv.parse(request.responseText, f);\n      };\n    }\n    dsv.parse = function(text, f) {\n      var o;\n      return dsv.parseRows(text, function(row, i) {\n        if (o) return o(row, i - 1);\n        var a = new Function(\"d\", \"return {\" + row.map(function(name, i) {\n          return JSON.stringify(name) + \": d[\" + i + \"]\";\n        }).join(\",\") + \"}\");\n        o = f ? function(row, i) {\n          return f(a(row), i);\n        } : a;\n      });\n    };\n    dsv.parseRows = function(text, f) {\n      var EOL = {}, EOF = {}, rows = [], N = text.length, I = 0, n = 0, t, eol;\n      function token() {\n        if (I >= N) return EOF;\n        if (eol) return eol = false, EOL;\n        var j = I;\n        if (text.charCodeAt(j) === 34) {\n          var i = j;\n          while (i++ < N) {\n            if (text.charCodeAt(i) === 34) {\n              if (text.charCodeAt(i + 1) !== 34) break;\n              ++i;\n            }\n          }\n          I = i + 2;\n          var c = text.charCodeAt(i + 1);\n          if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(i + 2) === 10) ++I;\n          } else if (c === 10) {\n            eol = true;\n          }\n          return text.slice(j + 1, i).replace(/\"\"/g, '\"');\n        }\n        while (I < N) {\n          var c = text.charCodeAt(I++), k = 1;\n          if (c === 10) eol = true; else if (c === 13) {\n            eol = true;\n            if (text.charCodeAt(I) === 10) ++I, ++k;\n          } else if (c !== delimiterCode) continue;\n          return text.slice(j, I - k);\n        }\n        return text.slice(j);\n      }\n      while ((t = token()) !== EOF) {\n        var a = [];\n        while (t !== EOL && t !== EOF) {\n          a.push(t);\n          t = token();\n        }\n        if (f && (a = f(a, n++)) == null) continue;\n        rows.push(a);\n      }\n      return rows;\n    };\n    dsv.format = function(rows) {\n      if (Array.isArray(rows[0])) return dsv.formatRows(rows);\n      var fieldSet = new d3_Set(), fields = [];\n      rows.forEach(function(row) {\n        for (var field in row) {\n          if (!fieldSet.has(field)) {\n            fields.push(fieldSet.add(field));\n          }\n        }\n      });\n      return [ fields.map(formatValue).join(delimiter) ].concat(rows.map(function(row) {\n        return fields.map(function(field) {\n          return formatValue(row[field]);\n        }).join(delimiter);\n      })).join(\"\\n\");\n    };\n    dsv.formatRows = function(rows) {\n      return rows.map(formatRow).join(\"\\n\");\n    };\n    function formatRow(row) {\n      return row.map(formatValue).join(delimiter);\n    }\n    function formatValue(text) {\n      return reFormat.test(text) ? '\"' + text.replace(/\\\"/g, '\"\"') + '\"' : text;\n    }\n    return dsv;\n  };\n  d3.csv = d3.dsv(\",\", \"text/csv\");\n  d3.tsv = d3.dsv(\"\t\", \"text/tab-separated-values\");\n  var d3_timer_queueHead, d3_timer_queueTail, d3_timer_interval, d3_timer_timeout, d3_timer_frame = this[d3_vendorSymbol(this, \"requestAnimationFrame\")] || function(callback) {\n    setTimeout(callback, 17);\n  };\n  d3.timer = function() {\n    d3_timer.apply(this, arguments);\n  };\n  function d3_timer(callback, delay, then) {\n    var n = arguments.length;\n    if (n < 2) delay = 0;\n    if (n < 3) then = Date.now();\n    var time = then + delay, timer = {\n      c: callback,\n      t: time,\n      n: null\n    };\n    if (d3_timer_queueTail) d3_timer_queueTail.n = timer; else d3_timer_queueHead = timer;\n    d3_timer_queueTail = timer;\n    if (!d3_timer_interval) {\n      d3_timer_timeout = clearTimeout(d3_timer_timeout);\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n    return timer;\n  }\n  function d3_timer_step() {\n    var now = d3_timer_mark(), delay = d3_timer_sweep() - now;\n    if (delay > 24) {\n      if (isFinite(delay)) {\n        clearTimeout(d3_timer_timeout);\n        d3_timer_timeout = setTimeout(d3_timer_step, delay);\n      }\n      d3_timer_interval = 0;\n    } else {\n      d3_timer_interval = 1;\n      d3_timer_frame(d3_timer_step);\n    }\n  }\n  d3.timer.flush = function() {\n    d3_timer_mark();\n    d3_timer_sweep();\n  };\n  function d3_timer_mark() {\n    var now = Date.now(), timer = d3_timer_queueHead;\n    while (timer) {\n      if (now >= timer.t && timer.c(now - timer.t)) timer.c = null;\n      timer = timer.n;\n    }\n    return now;\n  }\n  function d3_timer_sweep() {\n    var t0, t1 = d3_timer_queueHead, time = Infinity;\n    while (t1) {\n      if (t1.c) {\n        if (t1.t < time) time = t1.t;\n        t1 = (t0 = t1).n;\n      } else {\n        t1 = t0 ? t0.n = t1.n : d3_timer_queueHead = t1.n;\n      }\n    }\n    d3_timer_queueTail = t0;\n    return time;\n  }\n  function d3_format_precision(x, p) {\n    return p - (x ? Math.ceil(Math.log(x) / Math.LN10) : 1);\n  }\n  d3.round = function(x, n) {\n    return n ? Math.round(x * (n = Math.pow(10, n))) / n : Math.round(x);\n  };\n  var d3_formatPrefixes = [ \"y\", \"z\", \"a\", \"f\", \"p\", \"n\", \"µ\", \"m\", \"\", \"k\", \"M\", \"G\", \"T\", \"P\", \"E\", \"Z\", \"Y\" ].map(d3_formatPrefix);\n  d3.formatPrefix = function(value, precision) {\n    var i = 0;\n    if (value = +value) {\n      if (value < 0) value *= -1;\n      if (precision) value = d3.round(value, d3_format_precision(value, precision));\n      i = 1 + Math.floor(1e-12 + Math.log(value) / Math.LN10);\n      i = Math.max(-24, Math.min(24, Math.floor((i - 1) / 3) * 3));\n    }\n    return d3_formatPrefixes[8 + i / 3];\n  };\n  function d3_formatPrefix(d, i) {\n    var k = Math.pow(10, abs(8 - i) * 3);\n    return {\n      scale: i > 8 ? function(d) {\n        return d / k;\n      } : function(d) {\n        return d * k;\n      },\n      symbol: d\n    };\n  }\n  function d3_locale_numberFormat(locale) {\n    var locale_decimal = locale.decimal, locale_thousands = locale.thousands, locale_grouping = locale.grouping, locale_currency = locale.currency, formatGroup = locale_grouping && locale_thousands ? function(value, width) {\n      var i = value.length, t = [], j = 0, g = locale_grouping[0], length = 0;\n      while (i > 0 && g > 0) {\n        if (length + g + 1 > width) g = Math.max(1, width - length);\n        t.push(value.substring(i -= g, i + g));\n        if ((length += g + 1) > width) break;\n        g = locale_grouping[j = (j + 1) % locale_grouping.length];\n      }\n      return t.reverse().join(locale_thousands);\n    } : d3_identity;\n    return function(specifier) {\n      var match = d3_format_re.exec(specifier), fill = match[1] || \" \", align = match[2] || \">\", sign = match[3] || \"-\", symbol = match[4] || \"\", zfill = match[5], width = +match[6], comma = match[7], precision = match[8], type = match[9], scale = 1, prefix = \"\", suffix = \"\", integer = false, exponent = true;\n      if (precision) precision = +precision.substring(1);\n      if (zfill || fill === \"0\" && align === \"=\") {\n        zfill = fill = \"0\";\n        align = \"=\";\n      }\n      switch (type) {\n       case \"n\":\n        comma = true;\n        type = \"g\";\n        break;\n\n       case \"%\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"f\";\n        break;\n\n       case \"p\":\n        scale = 100;\n        suffix = \"%\";\n        type = \"r\";\n        break;\n\n       case \"b\":\n       case \"o\":\n       case \"x\":\n       case \"X\":\n        if (symbol === \"#\") prefix = \"0\" + type.toLowerCase();\n\n       case \"c\":\n        exponent = false;\n\n       case \"d\":\n        integer = true;\n        precision = 0;\n        break;\n\n       case \"s\":\n        scale = -1;\n        type = \"r\";\n        break;\n      }\n      if (symbol === \"$\") prefix = locale_currency[0], suffix = locale_currency[1];\n      if (type == \"r\" && !precision) type = \"g\";\n      if (precision != null) {\n        if (type == \"g\") precision = Math.max(1, Math.min(21, precision)); else if (type == \"e\" || type == \"f\") precision = Math.max(0, Math.min(20, precision));\n      }\n      type = d3_format_types.get(type) || d3_format_typeDefault;\n      var zcomma = zfill && comma;\n      return function(value) {\n        var fullSuffix = suffix;\n        if (integer && value % 1) return \"\";\n        var negative = value < 0 || value === 0 && 1 / value < 0 ? (value = -value, \"-\") : sign === \"-\" ? \"\" : sign;\n        if (scale < 0) {\n          var unit = d3.formatPrefix(value, precision);\n          value = unit.scale(value);\n          fullSuffix = unit.symbol + suffix;\n        } else {\n          value *= scale;\n        }\n        value = type(value, precision);\n        var i = value.lastIndexOf(\".\"), before, after;\n        if (i < 0) {\n          var j = exponent ? value.lastIndexOf(\"e\") : -1;\n          if (j < 0) before = value, after = \"\"; else before = value.substring(0, j), after = value.substring(j);\n        } else {\n          before = value.substring(0, i);\n          after = locale_decimal + value.substring(i + 1);\n        }\n        if (!zfill && comma) before = formatGroup(before, Infinity);\n        var length = prefix.length + before.length + after.length + (zcomma ? 0 : negative.length), padding = length < width ? new Array(length = width - length + 1).join(fill) : \"\";\n        if (zcomma) before = formatGroup(padding + before, padding.length ? width - after.length : Infinity);\n        negative += prefix;\n        value = before + after;\n        return (align === \"<\" ? negative + value + padding : align === \">\" ? padding + negative + value : align === \"^\" ? padding.substring(0, length >>= 1) + negative + value + padding.substring(length) : negative + (zcomma ? value : padding + value)) + fullSuffix;\n      };\n    };\n  }\n  var d3_format_re = /(?:([^{])?([<>=^]))?([+\\- ])?([$#])?(0)?(\\d+)?(,)?(\\.-?\\d+)?([a-z%])?/i;\n  var d3_format_types = d3.map({\n    b: function(x) {\n      return x.toString(2);\n    },\n    c: function(x) {\n      return String.fromCharCode(x);\n    },\n    o: function(x) {\n      return x.toString(8);\n    },\n    x: function(x) {\n      return x.toString(16);\n    },\n    X: function(x) {\n      return x.toString(16).toUpperCase();\n    },\n    g: function(x, p) {\n      return x.toPrecision(p);\n    },\n    e: function(x, p) {\n      return x.toExponential(p);\n    },\n    f: function(x, p) {\n      return x.toFixed(p);\n    },\n    r: function(x, p) {\n      return (x = d3.round(x, d3_format_precision(x, p))).toFixed(Math.max(0, Math.min(20, d3_format_precision(x * (1 + 1e-15), p))));\n    }\n  });\n  function d3_format_typeDefault(x) {\n    return x + \"\";\n  }\n  var d3_time = d3.time = {}, d3_date = Date;\n  function d3_date_utc() {\n    this._ = new Date(arguments.length > 1 ? Date.UTC.apply(this, arguments) : arguments[0]);\n  }\n  d3_date_utc.prototype = {\n    getDate: function() {\n      return this._.getUTCDate();\n    },\n    getDay: function() {\n      return this._.getUTCDay();\n    },\n    getFullYear: function() {\n      return this._.getUTCFullYear();\n    },\n    getHours: function() {\n      return this._.getUTCHours();\n    },\n    getMilliseconds: function() {\n      return this._.getUTCMilliseconds();\n    },\n    getMinutes: function() {\n      return this._.getUTCMinutes();\n    },\n    getMonth: function() {\n      return this._.getUTCMonth();\n    },\n    getSeconds: function() {\n      return this._.getUTCSeconds();\n    },\n    getTime: function() {\n      return this._.getTime();\n    },\n    getTimezoneOffset: function() {\n      return 0;\n    },\n    valueOf: function() {\n      return this._.valueOf();\n    },\n    setDate: function() {\n      d3_time_prototype.setUTCDate.apply(this._, arguments);\n    },\n    setDay: function() {\n      d3_time_prototype.setUTCDay.apply(this._, arguments);\n    },\n    setFullYear: function() {\n      d3_time_prototype.setUTCFullYear.apply(this._, arguments);\n    },\n    setHours: function() {\n      d3_time_prototype.setUTCHours.apply(this._, arguments);\n    },\n    setMilliseconds: function() {\n      d3_time_prototype.setUTCMilliseconds.apply(this._, arguments);\n    },\n    setMinutes: function() {\n      d3_time_prototype.setUTCMinutes.apply(this._, arguments);\n    },\n    setMonth: function() {\n      d3_time_prototype.setUTCMonth.apply(this._, arguments);\n    },\n    setSeconds: function() {\n      d3_time_prototype.setUTCSeconds.apply(this._, arguments);\n    },\n    setTime: function() {\n      d3_time_prototype.setTime.apply(this._, arguments);\n    }\n  };\n  var d3_time_prototype = Date.prototype;\n  function d3_time_interval(local, step, number) {\n    function round(date) {\n      var d0 = local(date), d1 = offset(d0, 1);\n      return date - d0 < d1 - date ? d0 : d1;\n    }\n    function ceil(date) {\n      step(date = local(new d3_date(date - 1)), 1);\n      return date;\n    }\n    function offset(date, k) {\n      step(date = new d3_date(+date), k);\n      return date;\n    }\n    function range(t0, t1, dt) {\n      var time = ceil(t0), times = [];\n      if (dt > 1) {\n        while (time < t1) {\n          if (!(number(time) % dt)) times.push(new Date(+time));\n          step(time, 1);\n        }\n      } else {\n        while (time < t1) times.push(new Date(+time)), step(time, 1);\n      }\n      return times;\n    }\n    function range_utc(t0, t1, dt) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = t0;\n        return range(utc, t1, dt);\n      } finally {\n        d3_date = Date;\n      }\n    }\n    local.floor = local;\n    local.round = round;\n    local.ceil = ceil;\n    local.offset = offset;\n    local.range = range;\n    var utc = local.utc = d3_time_interval_utc(local);\n    utc.floor = utc;\n    utc.round = d3_time_interval_utc(round);\n    utc.ceil = d3_time_interval_utc(ceil);\n    utc.offset = d3_time_interval_utc(offset);\n    utc.range = range_utc;\n    return local;\n  }\n  function d3_time_interval_utc(method) {\n    return function(date, k) {\n      try {\n        d3_date = d3_date_utc;\n        var utc = new d3_date_utc();\n        utc._ = date;\n        return method(utc, k)._;\n      } finally {\n        d3_date = Date;\n      }\n    };\n  }\n  d3_time.year = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setMonth(0, 1);\n    return date;\n  }, function(date, offset) {\n    date.setFullYear(date.getFullYear() + offset);\n  }, function(date) {\n    return date.getFullYear();\n  });\n  d3_time.years = d3_time.year.range;\n  d3_time.years.utc = d3_time.year.utc.range;\n  d3_time.day = d3_time_interval(function(date) {\n    var day = new d3_date(2e3, 0);\n    day.setFullYear(date.getFullYear(), date.getMonth(), date.getDate());\n    return day;\n  }, function(date, offset) {\n    date.setDate(date.getDate() + offset);\n  }, function(date) {\n    return date.getDate() - 1;\n  });\n  d3_time.days = d3_time.day.range;\n  d3_time.days.utc = d3_time.day.utc.range;\n  d3_time.dayOfYear = function(date) {\n    var year = d3_time.year(date);\n    return Math.floor((date - year - (date.getTimezoneOffset() - year.getTimezoneOffset()) * 6e4) / 864e5);\n  };\n  [ \"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\" ].forEach(function(day, i) {\n    i = 7 - i;\n    var interval = d3_time[day] = d3_time_interval(function(date) {\n      (date = d3_time.day(date)).setDate(date.getDate() - (date.getDay() + i) % 7);\n      return date;\n    }, function(date, offset) {\n      date.setDate(date.getDate() + Math.floor(offset) * 7);\n    }, function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7) - (day !== i);\n    });\n    d3_time[day + \"s\"] = interval.range;\n    d3_time[day + \"s\"].utc = interval.utc.range;\n    d3_time[day + \"OfYear\"] = function(date) {\n      var day = d3_time.year(date).getDay();\n      return Math.floor((d3_time.dayOfYear(date) + (day + i) % 7) / 7);\n    };\n  });\n  d3_time.week = d3_time.sunday;\n  d3_time.weeks = d3_time.sunday.range;\n  d3_time.weeks.utc = d3_time.sunday.utc.range;\n  d3_time.weekOfYear = d3_time.sundayOfYear;\n  function d3_locale_timeFormat(locale) {\n    var locale_dateTime = locale.dateTime, locale_date = locale.date, locale_time = locale.time, locale_periods = locale.periods, locale_days = locale.days, locale_shortDays = locale.shortDays, locale_months = locale.months, locale_shortMonths = locale.shortMonths;\n    function d3_time_format(template) {\n      var n = template.length;\n      function format(date) {\n        var string = [], i = -1, j = 0, c, p, f;\n        while (++i < n) {\n          if (template.charCodeAt(i) === 37) {\n            string.push(template.slice(j, i));\n            if ((p = d3_time_formatPads[c = template.charAt(++i)]) != null) c = template.charAt(++i);\n            if (f = d3_time_formats[c]) c = f(date, p == null ? c === \"e\" ? \" \" : \"0\" : p);\n            string.push(c);\n            j = i + 1;\n          }\n        }\n        string.push(template.slice(j, i));\n        return string.join(\"\");\n      }\n      format.parse = function(string) {\n        var d = {\n          y: 1900,\n          m: 0,\n          d: 1,\n          H: 0,\n          M: 0,\n          S: 0,\n          L: 0,\n          Z: null\n        }, i = d3_time_parse(d, template, string, 0);\n        if (i != string.length) return null;\n        if (\"p\" in d) d.H = d.H % 12 + d.p * 12;\n        var localZ = d.Z != null && d3_date !== d3_date_utc, date = new (localZ ? d3_date_utc : d3_date)();\n        if (\"j\" in d) date.setFullYear(d.y, 0, d.j); else if (\"W\" in d || \"U\" in d) {\n          if (!(\"w\" in d)) d.w = \"W\" in d ? 1 : 0;\n          date.setFullYear(d.y, 0, 1);\n          date.setFullYear(d.y, 0, \"W\" in d ? (d.w + 6) % 7 + d.W * 7 - (date.getDay() + 5) % 7 : d.w + d.U * 7 - (date.getDay() + 6) % 7);\n        } else date.setFullYear(d.y, d.m, d.d);\n        date.setHours(d.H + (d.Z / 100 | 0), d.M + d.Z % 100, d.S, d.L);\n        return localZ ? date._ : date;\n      };\n      format.toString = function() {\n        return template;\n      };\n      return format;\n    }\n    function d3_time_parse(date, template, string, j) {\n      var c, p, t, i = 0, n = template.length, m = string.length;\n      while (i < n) {\n        if (j >= m) return -1;\n        c = template.charCodeAt(i++);\n        if (c === 37) {\n          t = template.charAt(i++);\n          p = d3_time_parsers[t in d3_time_formatPads ? template.charAt(i++) : t];\n          if (!p || (j = p(date, string, j)) < 0) return -1;\n        } else if (c != string.charCodeAt(j++)) {\n          return -1;\n        }\n      }\n      return j;\n    }\n    d3_time_format.utc = function(template) {\n      var local = d3_time_format(template);\n      function format(date) {\n        try {\n          d3_date = d3_date_utc;\n          var utc = new d3_date();\n          utc._ = date;\n          return local(utc);\n        } finally {\n          d3_date = Date;\n        }\n      }\n      format.parse = function(string) {\n        try {\n          d3_date = d3_date_utc;\n          var date = local.parse(string);\n          return date && date._;\n        } finally {\n          d3_date = Date;\n        }\n      };\n      format.toString = local.toString;\n      return format;\n    };\n    d3_time_format.multi = d3_time_format.utc.multi = d3_time_formatMulti;\n    var d3_time_periodLookup = d3.map(), d3_time_dayRe = d3_time_formatRe(locale_days), d3_time_dayLookup = d3_time_formatLookup(locale_days), d3_time_dayAbbrevRe = d3_time_formatRe(locale_shortDays), d3_time_dayAbbrevLookup = d3_time_formatLookup(locale_shortDays), d3_time_monthRe = d3_time_formatRe(locale_months), d3_time_monthLookup = d3_time_formatLookup(locale_months), d3_time_monthAbbrevRe = d3_time_formatRe(locale_shortMonths), d3_time_monthAbbrevLookup = d3_time_formatLookup(locale_shortMonths);\n    locale_periods.forEach(function(p, i) {\n      d3_time_periodLookup.set(p.toLowerCase(), i);\n    });\n    var d3_time_formats = {\n      a: function(d) {\n        return locale_shortDays[d.getDay()];\n      },\n      A: function(d) {\n        return locale_days[d.getDay()];\n      },\n      b: function(d) {\n        return locale_shortMonths[d.getMonth()];\n      },\n      B: function(d) {\n        return locale_months[d.getMonth()];\n      },\n      c: d3_time_format(locale_dateTime),\n      d: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      e: function(d, p) {\n        return d3_time_formatPad(d.getDate(), p, 2);\n      },\n      H: function(d, p) {\n        return d3_time_formatPad(d.getHours(), p, 2);\n      },\n      I: function(d, p) {\n        return d3_time_formatPad(d.getHours() % 12 || 12, p, 2);\n      },\n      j: function(d, p) {\n        return d3_time_formatPad(1 + d3_time.dayOfYear(d), p, 3);\n      },\n      L: function(d, p) {\n        return d3_time_formatPad(d.getMilliseconds(), p, 3);\n      },\n      m: function(d, p) {\n        return d3_time_formatPad(d.getMonth() + 1, p, 2);\n      },\n      M: function(d, p) {\n        return d3_time_formatPad(d.getMinutes(), p, 2);\n      },\n      p: function(d) {\n        return locale_periods[+(d.getHours() >= 12)];\n      },\n      S: function(d, p) {\n        return d3_time_formatPad(d.getSeconds(), p, 2);\n      },\n      U: function(d, p) {\n        return d3_time_formatPad(d3_time.sundayOfYear(d), p, 2);\n      },\n      w: function(d) {\n        return d.getDay();\n      },\n      W: function(d, p) {\n        return d3_time_formatPad(d3_time.mondayOfYear(d), p, 2);\n      },\n      x: d3_time_format(locale_date),\n      X: d3_time_format(locale_time),\n      y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 100, p, 2);\n      },\n      Y: function(d, p) {\n        return d3_time_formatPad(d.getFullYear() % 1e4, p, 4);\n      },\n      Z: d3_time_zone,\n      \"%\": function() {\n        return \"%\";\n      }\n    };\n    var d3_time_parsers = {\n      a: d3_time_parseWeekdayAbbrev,\n      A: d3_time_parseWeekday,\n      b: d3_time_parseMonthAbbrev,\n      B: d3_time_parseMonth,\n      c: d3_time_parseLocaleFull,\n      d: d3_time_parseDay,\n      e: d3_time_parseDay,\n      H: d3_time_parseHour24,\n      I: d3_time_parseHour24,\n      j: d3_time_parseDayOfYear,\n      L: d3_time_parseMilliseconds,\n      m: d3_time_parseMonthNumber,\n      M: d3_time_parseMinutes,\n      p: d3_time_parseAmPm,\n      S: d3_time_parseSeconds,\n      U: d3_time_parseWeekNumberSunday,\n      w: d3_time_parseWeekdayNumber,\n      W: d3_time_parseWeekNumberMonday,\n      x: d3_time_parseLocaleDate,\n      X: d3_time_parseLocaleTime,\n      y: d3_time_parseYear,\n      Y: d3_time_parseFullYear,\n      Z: d3_time_parseZone,\n      \"%\": d3_time_parseLiteralPercent\n    };\n    function d3_time_parseWeekdayAbbrev(date, string, i) {\n      d3_time_dayAbbrevRe.lastIndex = 0;\n      var n = d3_time_dayAbbrevRe.exec(string.slice(i));\n      return n ? (date.w = d3_time_dayAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseWeekday(date, string, i) {\n      d3_time_dayRe.lastIndex = 0;\n      var n = d3_time_dayRe.exec(string.slice(i));\n      return n ? (date.w = d3_time_dayLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonthAbbrev(date, string, i) {\n      d3_time_monthAbbrevRe.lastIndex = 0;\n      var n = d3_time_monthAbbrevRe.exec(string.slice(i));\n      return n ? (date.m = d3_time_monthAbbrevLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseMonth(date, string, i) {\n      d3_time_monthRe.lastIndex = 0;\n      var n = d3_time_monthRe.exec(string.slice(i));\n      return n ? (date.m = d3_time_monthLookup.get(n[0].toLowerCase()), i + n[0].length) : -1;\n    }\n    function d3_time_parseLocaleFull(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.c.toString(), string, i);\n    }\n    function d3_time_parseLocaleDate(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.x.toString(), string, i);\n    }\n    function d3_time_parseLocaleTime(date, string, i) {\n      return d3_time_parse(date, d3_time_formats.X.toString(), string, i);\n    }\n    function d3_time_parseAmPm(date, string, i) {\n      var n = d3_time_periodLookup.get(string.slice(i, i += 2).toLowerCase());\n      return n == null ? -1 : (date.p = n, i);\n    }\n    return d3_time_format;\n  }\n  var d3_time_formatPads = {\n    \"-\": \"\",\n    _: \" \",\n    \"0\": \"0\"\n  }, d3_time_numberRe = /^\\s*\\d+/, d3_time_percentRe = /^%/;\n  function d3_time_formatPad(value, fill, width) {\n    var sign = value < 0 ? \"-\" : \"\", string = (sign ? -value : value) + \"\", length = string.length;\n    return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);\n  }\n  function d3_time_formatRe(names) {\n    return new RegExp(\"^(?:\" + names.map(d3.requote).join(\"|\") + \")\", \"i\");\n  }\n  function d3_time_formatLookup(names) {\n    var map = new d3_Map(), i = -1, n = names.length;\n    while (++i < n) map.set(names[i].toLowerCase(), i);\n    return map;\n  }\n  function d3_time_parseWeekdayNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 1));\n    return n ? (date.w = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberSunday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i));\n    return n ? (date.U = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseWeekNumberMonday(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i));\n    return n ? (date.W = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseFullYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 4));\n    return n ? (date.y = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.y = d3_time_expandYear(+n[0]), i + n[0].length) : -1;\n  }\n  function d3_time_parseZone(date, string, i) {\n    return /^[+-]\\d{4}$/.test(string = string.slice(i, i + 5)) ? (date.Z = -string, \n    i + 5) : -1;\n  }\n  function d3_time_expandYear(d) {\n    return d + (d > 68 ? 1900 : 2e3);\n  }\n  function d3_time_parseMonthNumber(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.m = n[0] - 1, i + n[0].length) : -1;\n  }\n  function d3_time_parseDay(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.d = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseDayOfYear(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n    return n ? (date.j = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseHour24(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.H = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMinutes(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.M = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseSeconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 2));\n    return n ? (date.S = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_parseMilliseconds(date, string, i) {\n    d3_time_numberRe.lastIndex = 0;\n    var n = d3_time_numberRe.exec(string.slice(i, i + 3));\n    return n ? (date.L = +n[0], i + n[0].length) : -1;\n  }\n  function d3_time_zone(d) {\n    var z = d.getTimezoneOffset(), zs = z > 0 ? \"-\" : \"+\", zh = abs(z) / 60 | 0, zm = abs(z) % 60;\n    return zs + d3_time_formatPad(zh, \"0\", 2) + d3_time_formatPad(zm, \"0\", 2);\n  }\n  function d3_time_parseLiteralPercent(date, string, i) {\n    d3_time_percentRe.lastIndex = 0;\n    var n = d3_time_percentRe.exec(string.slice(i, i + 1));\n    return n ? i + n[0].length : -1;\n  }\n  function d3_time_formatMulti(formats) {\n    var n = formats.length, i = -1;\n    while (++i < n) formats[i][0] = this(formats[i][0]);\n    return function(date) {\n      var i = 0, f = formats[i];\n      while (!f[1](date)) f = formats[++i];\n      return f[0](date);\n    };\n  }\n  d3.locale = function(locale) {\n    return {\n      numberFormat: d3_locale_numberFormat(locale),\n      timeFormat: d3_locale_timeFormat(locale)\n    };\n  };\n  var d3_locale_enUS = d3.locale({\n    decimal: \".\",\n    thousands: \",\",\n    grouping: [ 3 ],\n    currency: [ \"$\", \"\" ],\n    dateTime: \"%a %b %e %X %Y\",\n    date: \"%m/%d/%Y\",\n    time: \"%H:%M:%S\",\n    periods: [ \"AM\", \"PM\" ],\n    days: [ \"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\" ],\n    shortDays: [ \"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\" ],\n    months: [ \"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\" ],\n    shortMonths: [ \"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\" ]\n  });\n  d3.format = d3_locale_enUS.numberFormat;\n  d3.geo = {};\n  function d3_adder() {}\n  d3_adder.prototype = {\n    s: 0,\n    t: 0,\n    add: function(y) {\n      d3_adderSum(y, this.t, d3_adderTemp);\n      d3_adderSum(d3_adderTemp.s, this.s, this);\n      if (this.s) this.t += d3_adderTemp.t; else this.s = d3_adderTemp.t;\n    },\n    reset: function() {\n      this.s = this.t = 0;\n    },\n    valueOf: function() {\n      return this.s;\n    }\n  };\n  var d3_adderTemp = new d3_adder();\n  function d3_adderSum(a, b, o) {\n    var x = o.s = a + b, bv = x - a, av = x - bv;\n    o.t = a - av + (b - bv);\n  }\n  d3.geo.stream = function(object, listener) {\n    if (object && d3_geo_streamObjectType.hasOwnProperty(object.type)) {\n      d3_geo_streamObjectType[object.type](object, listener);\n    } else {\n      d3_geo_streamGeometry(object, listener);\n    }\n  };\n  function d3_geo_streamGeometry(geometry, listener) {\n    if (geometry && d3_geo_streamGeometryType.hasOwnProperty(geometry.type)) {\n      d3_geo_streamGeometryType[geometry.type](geometry, listener);\n    }\n  }\n  var d3_geo_streamObjectType = {\n    Feature: function(feature, listener) {\n      d3_geo_streamGeometry(feature.geometry, listener);\n    },\n    FeatureCollection: function(object, listener) {\n      var features = object.features, i = -1, n = features.length;\n      while (++i < n) d3_geo_streamGeometry(features[i].geometry, listener);\n    }\n  };\n  var d3_geo_streamGeometryType = {\n    Sphere: function(object, listener) {\n      listener.sphere();\n    },\n    Point: function(object, listener) {\n      object = object.coordinates;\n      listener.point(object[0], object[1], object[2]);\n    },\n    MultiPoint: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) object = coordinates[i], listener.point(object[0], object[1], object[2]);\n    },\n    LineString: function(object, listener) {\n      d3_geo_streamLine(object.coordinates, listener, 0);\n    },\n    MultiLineString: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamLine(coordinates[i], listener, 0);\n    },\n    Polygon: function(object, listener) {\n      d3_geo_streamPolygon(object.coordinates, listener);\n    },\n    MultiPolygon: function(object, listener) {\n      var coordinates = object.coordinates, i = -1, n = coordinates.length;\n      while (++i < n) d3_geo_streamPolygon(coordinates[i], listener);\n    },\n    GeometryCollection: function(object, listener) {\n      var geometries = object.geometries, i = -1, n = geometries.length;\n      while (++i < n) d3_geo_streamGeometry(geometries[i], listener);\n    }\n  };\n  function d3_geo_streamLine(coordinates, listener, closed) {\n    var i = -1, n = coordinates.length - closed, coordinate;\n    listener.lineStart();\n    while (++i < n) coordinate = coordinates[i], listener.point(coordinate[0], coordinate[1], coordinate[2]);\n    listener.lineEnd();\n  }\n  function d3_geo_streamPolygon(coordinates, listener) {\n    var i = -1, n = coordinates.length;\n    listener.polygonStart();\n    while (++i < n) d3_geo_streamLine(coordinates[i], listener, 1);\n    listener.polygonEnd();\n  }\n  d3.geo.area = function(object) {\n    d3_geo_areaSum = 0;\n    d3.geo.stream(object, d3_geo_area);\n    return d3_geo_areaSum;\n  };\n  var d3_geo_areaSum, d3_geo_areaRingSum = new d3_adder();\n  var d3_geo_area = {\n    sphere: function() {\n      d3_geo_areaSum += 4 * π;\n    },\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_areaRingSum.reset();\n      d3_geo_area.lineStart = d3_geo_areaRingStart;\n    },\n    polygonEnd: function() {\n      var area = 2 * d3_geo_areaRingSum;\n      d3_geo_areaSum += area < 0 ? 4 * π + area : area;\n      d3_geo_area.lineStart = d3_geo_area.lineEnd = d3_geo_area.point = d3_noop;\n    }\n  };\n  function d3_geo_areaRingStart() {\n    var λ00, φ00, λ0, cosφ0, sinφ0;\n    d3_geo_area.point = function(λ, φ) {\n      d3_geo_area.point = nextPoint;\n      λ0 = (λ00 = λ) * d3_radians, cosφ0 = Math.cos(φ = (φ00 = φ) * d3_radians / 2 + π / 4), \n      sinφ0 = Math.sin(φ);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      φ = φ * d3_radians / 2 + π / 4;\n      var dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, cosφ = Math.cos(φ), sinφ = Math.sin(φ), k = sinφ0 * sinφ, u = cosφ0 * cosφ + k * Math.cos(adλ), v = k * sdλ * Math.sin(adλ);\n      d3_geo_areaRingSum.add(Math.atan2(v, u));\n      λ0 = λ, cosφ0 = cosφ, sinφ0 = sinφ;\n    }\n    d3_geo_area.lineEnd = function() {\n      nextPoint(λ00, φ00);\n    };\n  }\n  function d3_geo_cartesian(spherical) {\n    var λ = spherical[0], φ = spherical[1], cosφ = Math.cos(φ);\n    return [ cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ) ];\n  }\n  function d3_geo_cartesianDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n  }\n  function d3_geo_cartesianCross(a, b) {\n    return [ a[1] * b[2] - a[2] * b[1], a[2] * b[0] - a[0] * b[2], a[0] * b[1] - a[1] * b[0] ];\n  }\n  function d3_geo_cartesianAdd(a, b) {\n    a[0] += b[0];\n    a[1] += b[1];\n    a[2] += b[2];\n  }\n  function d3_geo_cartesianScale(vector, k) {\n    return [ vector[0] * k, vector[1] * k, vector[2] * k ];\n  }\n  function d3_geo_cartesianNormalize(d) {\n    var l = Math.sqrt(d[0] * d[0] + d[1] * d[1] + d[2] * d[2]);\n    d[0] /= l;\n    d[1] /= l;\n    d[2] /= l;\n  }\n  function d3_geo_spherical(cartesian) {\n    return [ Math.atan2(cartesian[1], cartesian[0]), d3_asin(cartesian[2]) ];\n  }\n  function d3_geo_sphericalEqual(a, b) {\n    return abs(a[0] - b[0]) < ε && abs(a[1] - b[1]) < ε;\n  }\n  d3.geo.bounds = function() {\n    var λ0, φ0, λ1, φ1, λ_, λ__, φ__, p0, dλSum, ranges, range;\n    var bound = {\n      point: point,\n      lineStart: lineStart,\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        bound.point = ringPoint;\n        bound.lineStart = ringStart;\n        bound.lineEnd = ringEnd;\n        dλSum = 0;\n        d3_geo_area.polygonStart();\n      },\n      polygonEnd: function() {\n        d3_geo_area.polygonEnd();\n        bound.point = point;\n        bound.lineStart = lineStart;\n        bound.lineEnd = lineEnd;\n        if (d3_geo_areaRingSum < 0) λ0 = -(λ1 = 180), φ0 = -(φ1 = 90); else if (dλSum > ε) φ1 = 90; else if (dλSum < -ε) φ0 = -90;\n        range[0] = λ0, range[1] = λ1;\n      }\n    };\n    function point(λ, φ) {\n      ranges.push(range = [ λ0 = λ, λ1 = λ ]);\n      if (φ < φ0) φ0 = φ;\n      if (φ > φ1) φ1 = φ;\n    }\n    function linePoint(λ, φ) {\n      var p = d3_geo_cartesian([ λ * d3_radians, φ * d3_radians ]);\n      if (p0) {\n        var normal = d3_geo_cartesianCross(p0, p), equatorial = [ normal[1], -normal[0], 0 ], inflection = d3_geo_cartesianCross(equatorial, normal);\n        d3_geo_cartesianNormalize(inflection);\n        inflection = d3_geo_spherical(inflection);\n        var dλ = λ - λ_, s = dλ > 0 ? 1 : -1, λi = inflection[0] * d3_degrees * s, antimeridian = abs(dλ) > 180;\n        if (antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = inflection[1] * d3_degrees;\n          if (φi > φ1) φ1 = φi;\n        } else if (λi = (λi + 360) % 360 - 180, antimeridian ^ (s * λ_ < λi && λi < s * λ)) {\n          var φi = -inflection[1] * d3_degrees;\n          if (φi < φ0) φ0 = φi;\n        } else {\n          if (φ < φ0) φ0 = φ;\n          if (φ > φ1) φ1 = φ;\n        }\n        if (antimeridian) {\n          if (λ < λ_) {\n            if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n          } else {\n            if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n          }\n        } else {\n          if (λ1 >= λ0) {\n            if (λ < λ0) λ0 = λ;\n            if (λ > λ1) λ1 = λ;\n          } else {\n            if (λ > λ_) {\n              if (angle(λ0, λ) > angle(λ0, λ1)) λ1 = λ;\n            } else {\n              if (angle(λ, λ1) > angle(λ0, λ1)) λ0 = λ;\n            }\n          }\n        }\n      } else {\n        point(λ, φ);\n      }\n      p0 = p, λ_ = λ;\n    }\n    function lineStart() {\n      bound.point = linePoint;\n    }\n    function lineEnd() {\n      range[0] = λ0, range[1] = λ1;\n      bound.point = point;\n      p0 = null;\n    }\n    function ringPoint(λ, φ) {\n      if (p0) {\n        var dλ = λ - λ_;\n        dλSum += abs(dλ) > 180 ? dλ + (dλ > 0 ? 360 : -360) : dλ;\n      } else λ__ = λ, φ__ = φ;\n      d3_geo_area.point(λ, φ);\n      linePoint(λ, φ);\n    }\n    function ringStart() {\n      d3_geo_area.lineStart();\n    }\n    function ringEnd() {\n      ringPoint(λ__, φ__);\n      d3_geo_area.lineEnd();\n      if (abs(dλSum) > ε) λ0 = -(λ1 = 180);\n      range[0] = λ0, range[1] = λ1;\n      p0 = null;\n    }\n    function angle(λ0, λ1) {\n      return (λ1 -= λ0) < 0 ? λ1 + 360 : λ1;\n    }\n    function compareRanges(a, b) {\n      return a[0] - b[0];\n    }\n    function withinRange(x, range) {\n      return range[0] <= range[1] ? range[0] <= x && x <= range[1] : x < range[0] || range[1] < x;\n    }\n    return function(feature) {\n      φ1 = λ1 = -(λ0 = φ0 = Infinity);\n      ranges = [];\n      d3.geo.stream(feature, bound);\n      var n = ranges.length;\n      if (n) {\n        ranges.sort(compareRanges);\n        for (var i = 1, a = ranges[0], b, merged = [ a ]; i < n; ++i) {\n          b = ranges[i];\n          if (withinRange(b[0], a) || withinRange(b[1], a)) {\n            if (angle(a[0], b[1]) > angle(a[0], a[1])) a[1] = b[1];\n            if (angle(b[0], a[1]) > angle(a[0], a[1])) a[0] = b[0];\n          } else {\n            merged.push(a = b);\n          }\n        }\n        var best = -Infinity, dλ;\n        for (var n = merged.length - 1, i = 0, a = merged[n], b; i <= n; a = b, ++i) {\n          b = merged[i];\n          if ((dλ = angle(a[1], b[0])) > best) best = dλ, λ0 = b[0], λ1 = a[1];\n        }\n      }\n      ranges = range = null;\n      return λ0 === Infinity || φ0 === Infinity ? [ [ NaN, NaN ], [ NaN, NaN ] ] : [ [ λ0, φ0 ], [ λ1, φ1 ] ];\n    };\n  }();\n  d3.geo.centroid = function(object) {\n    d3_geo_centroidW0 = d3_geo_centroidW1 = d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n    d3.geo.stream(object, d3_geo_centroid);\n    var x = d3_geo_centroidX2, y = d3_geo_centroidY2, z = d3_geo_centroidZ2, m = x * x + y * y + z * z;\n    if (m < ε2) {\n      x = d3_geo_centroidX1, y = d3_geo_centroidY1, z = d3_geo_centroidZ1;\n      if (d3_geo_centroidW1 < ε) x = d3_geo_centroidX0, y = d3_geo_centroidY0, z = d3_geo_centroidZ0;\n      m = x * x + y * y + z * z;\n      if (m < ε2) return [ NaN, NaN ];\n    }\n    return [ Math.atan2(y, x) * d3_degrees, d3_asin(z / Math.sqrt(m)) * d3_degrees ];\n  };\n  var d3_geo_centroidW0, d3_geo_centroidW1, d3_geo_centroidX0, d3_geo_centroidY0, d3_geo_centroidZ0, d3_geo_centroidX1, d3_geo_centroidY1, d3_geo_centroidZ1, d3_geo_centroidX2, d3_geo_centroidY2, d3_geo_centroidZ2;\n  var d3_geo_centroid = {\n    sphere: d3_noop,\n    point: d3_geo_centroidPoint,\n    lineStart: d3_geo_centroidLineStart,\n    lineEnd: d3_geo_centroidLineEnd,\n    polygonStart: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_centroid.lineStart = d3_geo_centroidLineStart;\n    }\n  };\n  function d3_geo_centroidPoint(λ, φ) {\n    λ *= d3_radians;\n    var cosφ = Math.cos(φ *= d3_radians);\n    d3_geo_centroidPointXYZ(cosφ * Math.cos(λ), cosφ * Math.sin(λ), Math.sin(φ));\n  }\n  function d3_geo_centroidPointXYZ(x, y, z) {\n    ++d3_geo_centroidW0;\n    d3_geo_centroidX0 += (x - d3_geo_centroidX0) / d3_geo_centroidW0;\n    d3_geo_centroidY0 += (y - d3_geo_centroidY0) / d3_geo_centroidW0;\n    d3_geo_centroidZ0 += (z - d3_geo_centroidZ0) / d3_geo_centroidW0;\n  }\n  function d3_geo_centroidLineStart() {\n    var x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroid.point = nextPoint;\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), w = Math.atan2(Math.sqrt((w = y0 * z - z0 * y) * w + (w = z0 * x - x0 * z) * w + (w = x0 * y - y0 * x) * w), x0 * x + y0 * y + z0 * z);\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_centroidLineEnd() {\n    d3_geo_centroid.point = d3_geo_centroidPoint;\n  }\n  function d3_geo_centroidRingStart() {\n    var λ00, φ00, x0, y0, z0;\n    d3_geo_centroid.point = function(λ, φ) {\n      λ00 = λ, φ00 = φ;\n      d3_geo_centroid.point = nextPoint;\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians);\n      x0 = cosφ * Math.cos(λ);\n      y0 = cosφ * Math.sin(λ);\n      z0 = Math.sin(φ);\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    };\n    d3_geo_centroid.lineEnd = function() {\n      nextPoint(λ00, φ00);\n      d3_geo_centroid.lineEnd = d3_geo_centroidLineEnd;\n      d3_geo_centroid.point = d3_geo_centroidPoint;\n    };\n    function nextPoint(λ, φ) {\n      λ *= d3_radians;\n      var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), y = cosφ * Math.sin(λ), z = Math.sin(φ), cx = y0 * z - z0 * y, cy = z0 * x - x0 * z, cz = x0 * y - y0 * x, m = Math.sqrt(cx * cx + cy * cy + cz * cz), u = x0 * x + y0 * y + z0 * z, v = m && -d3_acos(u) / m, w = Math.atan2(m, u);\n      d3_geo_centroidX2 += v * cx;\n      d3_geo_centroidY2 += v * cy;\n      d3_geo_centroidZ2 += v * cz;\n      d3_geo_centroidW1 += w;\n      d3_geo_centroidX1 += w * (x0 + (x0 = x));\n      d3_geo_centroidY1 += w * (y0 + (y0 = y));\n      d3_geo_centroidZ1 += w * (z0 + (z0 = z));\n      d3_geo_centroidPointXYZ(x0, y0, z0);\n    }\n  }\n  function d3_geo_compose(a, b) {\n    function compose(x, y) {\n      return x = a(x, y), b(x[0], x[1]);\n    }\n    if (a.invert && b.invert) compose.invert = function(x, y) {\n      return x = b.invert(x, y), x && a.invert(x[0], x[1]);\n    };\n    return compose;\n  }\n  function d3_true() {\n    return true;\n  }\n  function d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener) {\n    var subject = [], clip = [];\n    segments.forEach(function(segment) {\n      if ((n = segment.length - 1) <= 0) return;\n      var n, p0 = segment[0], p1 = segment[n];\n      if (d3_geo_sphericalEqual(p0, p1)) {\n        listener.lineStart();\n        for (var i = 0; i < n; ++i) listener.point((p0 = segment[i])[0], p0[1]);\n        listener.lineEnd();\n        return;\n      }\n      var a = new d3_geo_clipPolygonIntersection(p0, segment, null, true), b = new d3_geo_clipPolygonIntersection(p0, null, a, false);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n      a = new d3_geo_clipPolygonIntersection(p1, segment, null, false);\n      b = new d3_geo_clipPolygonIntersection(p1, null, a, true);\n      a.o = b;\n      subject.push(a);\n      clip.push(b);\n    });\n    clip.sort(compare);\n    d3_geo_clipPolygonLinkCircular(subject);\n    d3_geo_clipPolygonLinkCircular(clip);\n    if (!subject.length) return;\n    for (var i = 0, entry = clipStartInside, n = clip.length; i < n; ++i) {\n      clip[i].e = entry = !entry;\n    }\n    var start = subject[0], points, point;\n    while (1) {\n      var current = start, isSubject = true;\n      while (current.v) if ((current = current.n) === start) return;\n      points = current.z;\n      listener.lineStart();\n      do {\n        current.v = current.o.v = true;\n        if (current.e) {\n          if (isSubject) {\n            for (var i = 0, n = points.length; i < n; ++i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.n.x, 1, listener);\n          }\n          current = current.n;\n        } else {\n          if (isSubject) {\n            points = current.p.z;\n            for (var i = points.length - 1; i >= 0; --i) listener.point((point = points[i])[0], point[1]);\n          } else {\n            interpolate(current.x, current.p.x, -1, listener);\n          }\n          current = current.p;\n        }\n        current = current.o;\n        points = current.z;\n        isSubject = !isSubject;\n      } while (!current.v);\n      listener.lineEnd();\n    }\n  }\n  function d3_geo_clipPolygonLinkCircular(array) {\n    if (!(n = array.length)) return;\n    var n, i = 0, a = array[0], b;\n    while (++i < n) {\n      a.n = b = array[i];\n      b.p = a;\n      a = b;\n    }\n    a.n = b = array[0];\n    b.p = a;\n  }\n  function d3_geo_clipPolygonIntersection(point, points, other, entry) {\n    this.x = point;\n    this.z = points;\n    this.o = other;\n    this.e = entry;\n    this.v = false;\n    this.n = this.p = null;\n  }\n  function d3_geo_clip(pointVisible, clipLine, interpolate, clipStart) {\n    return function(rotate, listener) {\n      var line = clipLine(listener), rotatedClipStart = rotate.invert(clipStart[0], clipStart[1]);\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          clip.point = pointRing;\n          clip.lineStart = ringStart;\n          clip.lineEnd = ringEnd;\n          segments = [];\n          polygon = [];\n        },\n        polygonEnd: function() {\n          clip.point = point;\n          clip.lineStart = lineStart;\n          clip.lineEnd = lineEnd;\n          segments = d3.merge(segments);\n          var clipStartInside = d3_geo_pointInPolygon(rotatedClipStart, polygon);\n          if (segments.length) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            d3_geo_clipPolygon(segments, d3_geo_clipSort, clipStartInside, interpolate, listener);\n          } else if (clipStartInside) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            interpolate(null, null, 1, listener);\n            listener.lineEnd();\n          }\n          if (polygonStarted) listener.polygonEnd(), polygonStarted = false;\n          segments = polygon = null;\n        },\n        sphere: function() {\n          listener.polygonStart();\n          listener.lineStart();\n          interpolate(null, null, 1, listener);\n          listener.lineEnd();\n          listener.polygonEnd();\n        }\n      };\n      function point(λ, φ) {\n        var point = rotate(λ, φ);\n        if (pointVisible(λ = point[0], φ = point[1])) listener.point(λ, φ);\n      }\n      function pointLine(λ, φ) {\n        var point = rotate(λ, φ);\n        line.point(point[0], point[1]);\n      }\n      function lineStart() {\n        clip.point = pointLine;\n        line.lineStart();\n      }\n      function lineEnd() {\n        clip.point = point;\n        line.lineEnd();\n      }\n      var segments;\n      var buffer = d3_geo_clipBufferListener(), ringListener = clipLine(buffer), polygonStarted = false, polygon, ring;\n      function pointRing(λ, φ) {\n        ring.push([ λ, φ ]);\n        var point = rotate(λ, φ);\n        ringListener.point(point[0], point[1]);\n      }\n      function ringStart() {\n        ringListener.lineStart();\n        ring = [];\n      }\n      function ringEnd() {\n        pointRing(ring[0][0], ring[0][1]);\n        ringListener.lineEnd();\n        var clean = ringListener.clean(), ringSegments = buffer.buffer(), segment, n = ringSegments.length;\n        ring.pop();\n        polygon.push(ring);\n        ring = null;\n        if (!n) return;\n        if (clean & 1) {\n          segment = ringSegments[0];\n          var n = segment.length - 1, i = -1, point;\n          if (n > 0) {\n            if (!polygonStarted) listener.polygonStart(), polygonStarted = true;\n            listener.lineStart();\n            while (++i < n) listener.point((point = segment[i])[0], point[1]);\n            listener.lineEnd();\n          }\n          return;\n        }\n        if (n > 1 && clean & 2) ringSegments.push(ringSegments.pop().concat(ringSegments.shift()));\n        segments.push(ringSegments.filter(d3_geo_clipSegmentLength1));\n      }\n      return clip;\n    };\n  }\n  function d3_geo_clipSegmentLength1(segment) {\n    return segment.length > 1;\n  }\n  function d3_geo_clipBufferListener() {\n    var lines = [], line;\n    return {\n      lineStart: function() {\n        lines.push(line = []);\n      },\n      point: function(λ, φ) {\n        line.push([ λ, φ ]);\n      },\n      lineEnd: d3_noop,\n      buffer: function() {\n        var buffer = lines;\n        lines = [];\n        line = null;\n        return buffer;\n      },\n      rejoin: function() {\n        if (lines.length > 1) lines.push(lines.pop().concat(lines.shift()));\n      }\n    };\n  }\n  function d3_geo_clipSort(a, b) {\n    return ((a = a.x)[0] < 0 ? a[1] - halfπ - ε : halfπ - a[1]) - ((b = b.x)[0] < 0 ? b[1] - halfπ - ε : halfπ - b[1]);\n  }\n  var d3_geo_clipAntimeridian = d3_geo_clip(d3_true, d3_geo_clipAntimeridianLine, d3_geo_clipAntimeridianInterpolate, [ -π, -π / 2 ]);\n  function d3_geo_clipAntimeridianLine(listener) {\n    var λ0 = NaN, φ0 = NaN, sλ0 = NaN, clean;\n    return {\n      lineStart: function() {\n        listener.lineStart();\n        clean = 1;\n      },\n      point: function(λ1, φ1) {\n        var sλ1 = λ1 > 0 ? π : -π, dλ = abs(λ1 - λ0);\n        if (abs(dλ - π) < ε) {\n          listener.point(λ0, φ0 = (φ0 + φ1) / 2 > 0 ? halfπ : -halfπ);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          listener.point(λ1, φ0);\n          clean = 0;\n        } else if (sλ0 !== sλ1 && dλ >= π) {\n          if (abs(λ0 - sλ0) < ε) λ0 -= sλ0 * ε;\n          if (abs(λ1 - sλ1) < ε) λ1 -= sλ1 * ε;\n          φ0 = d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1);\n          listener.point(sλ0, φ0);\n          listener.lineEnd();\n          listener.lineStart();\n          listener.point(sλ1, φ0);\n          clean = 0;\n        }\n        listener.point(λ0 = λ1, φ0 = φ1);\n        sλ0 = sλ1;\n      },\n      lineEnd: function() {\n        listener.lineEnd();\n        λ0 = φ0 = NaN;\n      },\n      clean: function() {\n        return 2 - clean;\n      }\n    };\n  }\n  function d3_geo_clipAntimeridianIntersect(λ0, φ0, λ1, φ1) {\n    var cosφ0, cosφ1, sinλ0_λ1 = Math.sin(λ0 - λ1);\n    return abs(sinλ0_λ1) > ε ? Math.atan((Math.sin(φ0) * (cosφ1 = Math.cos(φ1)) * Math.sin(λ1) - Math.sin(φ1) * (cosφ0 = Math.cos(φ0)) * Math.sin(λ0)) / (cosφ0 * cosφ1 * sinλ0_λ1)) : (φ0 + φ1) / 2;\n  }\n  function d3_geo_clipAntimeridianInterpolate(from, to, direction, listener) {\n    var φ;\n    if (from == null) {\n      φ = direction * halfπ;\n      listener.point(-π, φ);\n      listener.point(0, φ);\n      listener.point(π, φ);\n      listener.point(π, 0);\n      listener.point(π, -φ);\n      listener.point(0, -φ);\n      listener.point(-π, -φ);\n      listener.point(-π, 0);\n      listener.point(-π, φ);\n    } else if (abs(from[0] - to[0]) > ε) {\n      var s = from[0] < to[0] ? π : -π;\n      φ = direction * s / 2;\n      listener.point(-s, φ);\n      listener.point(0, φ);\n      listener.point(s, φ);\n    } else {\n      listener.point(to[0], to[1]);\n    }\n  }\n  function d3_geo_pointInPolygon(point, polygon) {\n    var meridian = point[0], parallel = point[1], meridianNormal = [ Math.sin(meridian), -Math.cos(meridian), 0 ], polarAngle = 0, winding = 0;\n    d3_geo_areaRingSum.reset();\n    for (var i = 0, n = polygon.length; i < n; ++i) {\n      var ring = polygon[i], m = ring.length;\n      if (!m) continue;\n      var point0 = ring[0], λ0 = point0[0], φ0 = point0[1] / 2 + π / 4, sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), j = 1;\n      while (true) {\n        if (j === m) j = 0;\n        point = ring[j];\n        var λ = point[0], φ = point[1] / 2 + π / 4, sinφ = Math.sin(φ), cosφ = Math.cos(φ), dλ = λ - λ0, sdλ = dλ >= 0 ? 1 : -1, adλ = sdλ * dλ, antimeridian = adλ > π, k = sinφ0 * sinφ;\n        d3_geo_areaRingSum.add(Math.atan2(k * sdλ * Math.sin(adλ), cosφ0 * cosφ + k * Math.cos(adλ)));\n        polarAngle += antimeridian ? dλ + sdλ * τ : dλ;\n        if (antimeridian ^ λ0 >= meridian ^ λ >= meridian) {\n          var arc = d3_geo_cartesianCross(d3_geo_cartesian(point0), d3_geo_cartesian(point));\n          d3_geo_cartesianNormalize(arc);\n          var intersection = d3_geo_cartesianCross(meridianNormal, arc);\n          d3_geo_cartesianNormalize(intersection);\n          var φarc = (antimeridian ^ dλ >= 0 ? -1 : 1) * d3_asin(intersection[2]);\n          if (parallel > φarc || parallel === φarc && (arc[0] || arc[1])) {\n            winding += antimeridian ^ dλ >= 0 ? 1 : -1;\n          }\n        }\n        if (!j++) break;\n        λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ, point0 = point;\n      }\n    }\n    return (polarAngle < -ε || polarAngle < ε && d3_geo_areaRingSum < -ε) ^ winding & 1;\n  }\n  function d3_geo_clipCircle(radius) {\n    var cr = Math.cos(radius), smallRadius = cr > 0, notHemisphere = abs(cr) > ε, interpolate = d3_geo_circleInterpolate(radius, 6 * d3_radians);\n    return d3_geo_clip(visible, clipLine, interpolate, smallRadius ? [ 0, -radius ] : [ -π, radius - π ]);\n    function visible(λ, φ) {\n      return Math.cos(λ) * Math.cos(φ) > cr;\n    }\n    function clipLine(listener) {\n      var point0, c0, v0, v00, clean;\n      return {\n        lineStart: function() {\n          v00 = v0 = false;\n          clean = 1;\n        },\n        point: function(λ, φ) {\n          var point1 = [ λ, φ ], point2, v = visible(λ, φ), c = smallRadius ? v ? 0 : code(λ, φ) : v ? code(λ + (λ < 0 ? π : -π), φ) : 0;\n          if (!point0 && (v00 = v0 = v)) listener.lineStart();\n          if (v !== v0) {\n            point2 = intersect(point0, point1);\n            if (d3_geo_sphericalEqual(point0, point2) || d3_geo_sphericalEqual(point1, point2)) {\n              point1[0] += ε;\n              point1[1] += ε;\n              v = visible(point1[0], point1[1]);\n            }\n          }\n          if (v !== v0) {\n            clean = 0;\n            if (v) {\n              listener.lineStart();\n              point2 = intersect(point1, point0);\n              listener.point(point2[0], point2[1]);\n            } else {\n              point2 = intersect(point0, point1);\n              listener.point(point2[0], point2[1]);\n              listener.lineEnd();\n            }\n            point0 = point2;\n          } else if (notHemisphere && point0 && smallRadius ^ v) {\n            var t;\n            if (!(c & c0) && (t = intersect(point1, point0, true))) {\n              clean = 0;\n              if (smallRadius) {\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n              } else {\n                listener.point(t[1][0], t[1][1]);\n                listener.lineEnd();\n                listener.lineStart();\n                listener.point(t[0][0], t[0][1]);\n              }\n            }\n          }\n          if (v && (!point0 || !d3_geo_sphericalEqual(point0, point1))) {\n            listener.point(point1[0], point1[1]);\n          }\n          point0 = point1, v0 = v, c0 = c;\n        },\n        lineEnd: function() {\n          if (v0) listener.lineEnd();\n          point0 = null;\n        },\n        clean: function() {\n          return clean | (v00 && v0) << 1;\n        }\n      };\n    }\n    function intersect(a, b, two) {\n      var pa = d3_geo_cartesian(a), pb = d3_geo_cartesian(b);\n      var n1 = [ 1, 0, 0 ], n2 = d3_geo_cartesianCross(pa, pb), n2n2 = d3_geo_cartesianDot(n2, n2), n1n2 = n2[0], determinant = n2n2 - n1n2 * n1n2;\n      if (!determinant) return !two && a;\n      var c1 = cr * n2n2 / determinant, c2 = -cr * n1n2 / determinant, n1xn2 = d3_geo_cartesianCross(n1, n2), A = d3_geo_cartesianScale(n1, c1), B = d3_geo_cartesianScale(n2, c2);\n      d3_geo_cartesianAdd(A, B);\n      var u = n1xn2, w = d3_geo_cartesianDot(A, u), uu = d3_geo_cartesianDot(u, u), t2 = w * w - uu * (d3_geo_cartesianDot(A, A) - 1);\n      if (t2 < 0) return;\n      var t = Math.sqrt(t2), q = d3_geo_cartesianScale(u, (-w - t) / uu);\n      d3_geo_cartesianAdd(q, A);\n      q = d3_geo_spherical(q);\n      if (!two) return q;\n      var λ0 = a[0], λ1 = b[0], φ0 = a[1], φ1 = b[1], z;\n      if (λ1 < λ0) z = λ0, λ0 = λ1, λ1 = z;\n      var δλ = λ1 - λ0, polar = abs(δλ - π) < ε, meridian = polar || δλ < ε;\n      if (!polar && φ1 < φ0) z = φ0, φ0 = φ1, φ1 = z;\n      if (meridian ? polar ? φ0 + φ1 > 0 ^ q[1] < (abs(q[0] - λ0) < ε ? φ0 : φ1) : φ0 <= q[1] && q[1] <= φ1 : δλ > π ^ (λ0 <= q[0] && q[0] <= λ1)) {\n        var q1 = d3_geo_cartesianScale(u, (-w + t) / uu);\n        d3_geo_cartesianAdd(q1, A);\n        return [ q, d3_geo_spherical(q1) ];\n      }\n    }\n    function code(λ, φ) {\n      var r = smallRadius ? radius : π - radius, code = 0;\n      if (λ < -r) code |= 1; else if (λ > r) code |= 2;\n      if (φ < -r) code |= 4; else if (φ > r) code |= 8;\n      return code;\n    }\n  }\n  function d3_geom_clipLine(x0, y0, x1, y1) {\n    return function(line) {\n      var a = line.a, b = line.b, ax = a.x, ay = a.y, bx = b.x, by = b.y, t0 = 0, t1 = 1, dx = bx - ax, dy = by - ay, r;\n      r = x0 - ax;\n      if (!dx && r > 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dx > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = x1 - ax;\n      if (!dx && r < 0) return;\n      r /= dx;\n      if (dx < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dx > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      r = y0 - ay;\n      if (!dy && r > 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      } else if (dy > 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      }\n      r = y1 - ay;\n      if (!dy && r < 0) return;\n      r /= dy;\n      if (dy < 0) {\n        if (r > t1) return;\n        if (r > t0) t0 = r;\n      } else if (dy > 0) {\n        if (r < t0) return;\n        if (r < t1) t1 = r;\n      }\n      if (t0 > 0) line.a = {\n        x: ax + t0 * dx,\n        y: ay + t0 * dy\n      };\n      if (t1 < 1) line.b = {\n        x: ax + t1 * dx,\n        y: ay + t1 * dy\n      };\n      return line;\n    };\n  }\n  var d3_geo_clipExtentMAX = 1e9;\n  d3.geo.clipExtent = function() {\n    var x0, y0, x1, y1, stream, clip, clipExtent = {\n      stream: function(output) {\n        if (stream) stream.valid = false;\n        stream = clip(output);\n        stream.valid = true;\n        return stream;\n      },\n      extent: function(_) {\n        if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n        clip = d3_geo_clipExtent(x0 = +_[0][0], y0 = +_[0][1], x1 = +_[1][0], y1 = +_[1][1]);\n        if (stream) stream.valid = false, stream = null;\n        return clipExtent;\n      }\n    };\n    return clipExtent.extent([ [ 0, 0 ], [ 960, 500 ] ]);\n  };\n  function d3_geo_clipExtent(x0, y0, x1, y1) {\n    return function(listener) {\n      var listener_ = listener, bufferListener = d3_geo_clipBufferListener(), clipLine = d3_geom_clipLine(x0, y0, x1, y1), segments, polygon, ring;\n      var clip = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          listener = bufferListener;\n          segments = [];\n          polygon = [];\n          clean = true;\n        },\n        polygonEnd: function() {\n          listener = listener_;\n          segments = d3.merge(segments);\n          var clipStartInside = insidePolygon([ x0, y1 ]), inside = clean && clipStartInside, visible = segments.length;\n          if (inside || visible) {\n            listener.polygonStart();\n            if (inside) {\n              listener.lineStart();\n              interpolate(null, null, 1, listener);\n              listener.lineEnd();\n            }\n            if (visible) {\n              d3_geo_clipPolygon(segments, compare, clipStartInside, interpolate, listener);\n            }\n            listener.polygonEnd();\n          }\n          segments = polygon = ring = null;\n        }\n      };\n      function insidePolygon(p) {\n        var wn = 0, n = polygon.length, y = p[1];\n        for (var i = 0; i < n; ++i) {\n          for (var j = 1, v = polygon[i], m = v.length, a = v[0], b; j < m; ++j) {\n            b = v[j];\n            if (a[1] <= y) {\n              if (b[1] > y && d3_cross2d(a, b, p) > 0) ++wn;\n            } else {\n              if (b[1] <= y && d3_cross2d(a, b, p) < 0) --wn;\n            }\n            a = b;\n          }\n        }\n        return wn !== 0;\n      }\n      function interpolate(from, to, direction, listener) {\n        var a = 0, a1 = 0;\n        if (from == null || (a = corner(from, direction)) !== (a1 = corner(to, direction)) || comparePoints(from, to) < 0 ^ direction > 0) {\n          do {\n            listener.point(a === 0 || a === 3 ? x0 : x1, a > 1 ? y1 : y0);\n          } while ((a = (a + direction + 4) % 4) !== a1);\n        } else {\n          listener.point(to[0], to[1]);\n        }\n      }\n      function pointVisible(x, y) {\n        return x0 <= x && x <= x1 && y0 <= y && y <= y1;\n      }\n      function point(x, y) {\n        if (pointVisible(x, y)) listener.point(x, y);\n      }\n      var x__, y__, v__, x_, y_, v_, first, clean;\n      function lineStart() {\n        clip.point = linePoint;\n        if (polygon) polygon.push(ring = []);\n        first = true;\n        v_ = false;\n        x_ = y_ = NaN;\n      }\n      function lineEnd() {\n        if (segments) {\n          linePoint(x__, y__);\n          if (v__ && v_) bufferListener.rejoin();\n          segments.push(bufferListener.buffer());\n        }\n        clip.point = point;\n        if (v_) listener.lineEnd();\n      }\n      function linePoint(x, y) {\n        x = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, x));\n        y = Math.max(-d3_geo_clipExtentMAX, Math.min(d3_geo_clipExtentMAX, y));\n        var v = pointVisible(x, y);\n        if (polygon) ring.push([ x, y ]);\n        if (first) {\n          x__ = x, y__ = y, v__ = v;\n          first = false;\n          if (v) {\n            listener.lineStart();\n            listener.point(x, y);\n          }\n        } else {\n          if (v && v_) listener.point(x, y); else {\n            var l = {\n              a: {\n                x: x_,\n                y: y_\n              },\n              b: {\n                x: x,\n                y: y\n              }\n            };\n            if (clipLine(l)) {\n              if (!v_) {\n                listener.lineStart();\n                listener.point(l.a.x, l.a.y);\n              }\n              listener.point(l.b.x, l.b.y);\n              if (!v) listener.lineEnd();\n              clean = false;\n            } else if (v) {\n              listener.lineStart();\n              listener.point(x, y);\n              clean = false;\n            }\n          }\n        }\n        x_ = x, y_ = y, v_ = v;\n      }\n      return clip;\n    };\n    function corner(p, direction) {\n      return abs(p[0] - x0) < ε ? direction > 0 ? 0 : 3 : abs(p[0] - x1) < ε ? direction > 0 ? 2 : 1 : abs(p[1] - y0) < ε ? direction > 0 ? 1 : 0 : direction > 0 ? 3 : 2;\n    }\n    function compare(a, b) {\n      return comparePoints(a.x, b.x);\n    }\n    function comparePoints(a, b) {\n      var ca = corner(a, 1), cb = corner(b, 1);\n      return ca !== cb ? ca - cb : ca === 0 ? b[1] - a[1] : ca === 1 ? a[0] - b[0] : ca === 2 ? a[1] - b[1] : b[0] - a[0];\n    }\n  }\n  function d3_geo_conic(projectAt) {\n    var φ0 = 0, φ1 = π / 3, m = d3_geo_projectionMutator(projectAt), p = m(φ0, φ1);\n    p.parallels = function(_) {\n      if (!arguments.length) return [ φ0 / π * 180, φ1 / π * 180 ];\n      return m(φ0 = _[0] * π / 180, φ1 = _[1] * π / 180);\n    };\n    return p;\n  }\n  function d3_geo_conicEqualArea(φ0, φ1) {\n    var sinφ0 = Math.sin(φ0), n = (sinφ0 + Math.sin(φ1)) / 2, C = 1 + sinφ0 * (2 * n - sinφ0), ρ0 = Math.sqrt(C) / n;\n    function forward(λ, φ) {\n      var ρ = Math.sqrt(C - 2 * n * Math.sin(φ)) / n;\n      return [ ρ * Math.sin(λ *= n), ρ0 - ρ * Math.cos(λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = ρ0 - y;\n      return [ Math.atan2(x, ρ0_y) / n, d3_asin((C - (x * x + ρ0_y * ρ0_y) * n * n) / (2 * n)) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEqualArea = function() {\n    return d3_geo_conic(d3_geo_conicEqualArea);\n  }).raw = d3_geo_conicEqualArea;\n  d3.geo.albers = function() {\n    return d3.geo.conicEqualArea().rotate([ 96, 0 ]).center([ -.6, 38.7 ]).parallels([ 29.5, 45.5 ]).scale(1070);\n  };\n  d3.geo.albersUsa = function() {\n    var lower48 = d3.geo.albers();\n    var alaska = d3.geo.conicEqualArea().rotate([ 154, 0 ]).center([ -2, 58.5 ]).parallels([ 55, 65 ]);\n    var hawaii = d3.geo.conicEqualArea().rotate([ 157, 0 ]).center([ -3, 19.9 ]).parallels([ 8, 18 ]);\n    var point, pointStream = {\n      point: function(x, y) {\n        point = [ x, y ];\n      }\n    }, lower48Point, alaskaPoint, hawaiiPoint;\n    function albersUsa(coordinates) {\n      var x = coordinates[0], y = coordinates[1];\n      point = null;\n      (lower48Point(x, y), point) || (alaskaPoint(x, y), point) || hawaiiPoint(x, y);\n      return point;\n    }\n    albersUsa.invert = function(coordinates) {\n      var k = lower48.scale(), t = lower48.translate(), x = (coordinates[0] - t[0]) / k, y = (coordinates[1] - t[1]) / k;\n      return (y >= .12 && y < .234 && x >= -.425 && x < -.214 ? alaska : y >= .166 && y < .234 && x >= -.214 && x < -.115 ? hawaii : lower48).invert(coordinates);\n    };\n    albersUsa.stream = function(stream) {\n      var lower48Stream = lower48.stream(stream), alaskaStream = alaska.stream(stream), hawaiiStream = hawaii.stream(stream);\n      return {\n        point: function(x, y) {\n          lower48Stream.point(x, y);\n          alaskaStream.point(x, y);\n          hawaiiStream.point(x, y);\n        },\n        sphere: function() {\n          lower48Stream.sphere();\n          alaskaStream.sphere();\n          hawaiiStream.sphere();\n        },\n        lineStart: function() {\n          lower48Stream.lineStart();\n          alaskaStream.lineStart();\n          hawaiiStream.lineStart();\n        },\n        lineEnd: function() {\n          lower48Stream.lineEnd();\n          alaskaStream.lineEnd();\n          hawaiiStream.lineEnd();\n        },\n        polygonStart: function() {\n          lower48Stream.polygonStart();\n          alaskaStream.polygonStart();\n          hawaiiStream.polygonStart();\n        },\n        polygonEnd: function() {\n          lower48Stream.polygonEnd();\n          alaskaStream.polygonEnd();\n          hawaiiStream.polygonEnd();\n        }\n      };\n    };\n    albersUsa.precision = function(_) {\n      if (!arguments.length) return lower48.precision();\n      lower48.precision(_);\n      alaska.precision(_);\n      hawaii.precision(_);\n      return albersUsa;\n    };\n    albersUsa.scale = function(_) {\n      if (!arguments.length) return lower48.scale();\n      lower48.scale(_);\n      alaska.scale(_ * .35);\n      hawaii.scale(_);\n      return albersUsa.translate(lower48.translate());\n    };\n    albersUsa.translate = function(_) {\n      if (!arguments.length) return lower48.translate();\n      var k = lower48.scale(), x = +_[0], y = +_[1];\n      lower48Point = lower48.translate(_).clipExtent([ [ x - .455 * k, y - .238 * k ], [ x + .455 * k, y + .238 * k ] ]).stream(pointStream).point;\n      alaskaPoint = alaska.translate([ x - .307 * k, y + .201 * k ]).clipExtent([ [ x - .425 * k + ε, y + .12 * k + ε ], [ x - .214 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      hawaiiPoint = hawaii.translate([ x - .205 * k, y + .212 * k ]).clipExtent([ [ x - .214 * k + ε, y + .166 * k + ε ], [ x - .115 * k - ε, y + .234 * k - ε ] ]).stream(pointStream).point;\n      return albersUsa;\n    };\n    return albersUsa.scale(1070);\n  };\n  var d3_geo_pathAreaSum, d3_geo_pathAreaPolygon, d3_geo_pathArea = {\n    point: d3_noop,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: function() {\n      d3_geo_pathAreaPolygon = 0;\n      d3_geo_pathArea.lineStart = d3_geo_pathAreaRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathArea.lineStart = d3_geo_pathArea.lineEnd = d3_geo_pathArea.point = d3_noop;\n      d3_geo_pathAreaSum += abs(d3_geo_pathAreaPolygon / 2);\n    }\n  };\n  function d3_geo_pathAreaRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathArea.point = function(x, y) {\n      d3_geo_pathArea.point = nextPoint;\n      x00 = x0 = x, y00 = y0 = y;\n    };\n    function nextPoint(x, y) {\n      d3_geo_pathAreaPolygon += y0 * x - x0 * y;\n      x0 = x, y0 = y;\n    }\n    d3_geo_pathArea.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  var d3_geo_pathBoundsX0, d3_geo_pathBoundsY0, d3_geo_pathBoundsX1, d3_geo_pathBoundsY1;\n  var d3_geo_pathBounds = {\n    point: d3_geo_pathBoundsPoint,\n    lineStart: d3_noop,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_pathBoundsPoint(x, y) {\n    if (x < d3_geo_pathBoundsX0) d3_geo_pathBoundsX0 = x;\n    if (x > d3_geo_pathBoundsX1) d3_geo_pathBoundsX1 = x;\n    if (y < d3_geo_pathBoundsY0) d3_geo_pathBoundsY0 = y;\n    if (y > d3_geo_pathBoundsY1) d3_geo_pathBoundsY1 = y;\n  }\n  function d3_geo_pathBuffer() {\n    var pointCircle = d3_geo_pathBufferCircle(4.5), buffer = [];\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointCircle = d3_geo_pathBufferCircle(_);\n        return stream;\n      },\n      result: function() {\n        if (buffer.length) {\n          var result = buffer.join(\"\");\n          buffer = [];\n          return result;\n        }\n      }\n    };\n    function point(x, y) {\n      buffer.push(\"M\", x, \",\", y, pointCircle);\n    }\n    function pointLineStart(x, y) {\n      buffer.push(\"M\", x, \",\", y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      buffer.push(\"L\", x, \",\", y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      buffer.push(\"Z\");\n    }\n    return stream;\n  }\n  function d3_geo_pathBufferCircle(radius) {\n    return \"m0,\" + radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + -2 * radius + \"a\" + radius + \",\" + radius + \" 0 1,1 0,\" + 2 * radius + \"z\";\n  }\n  var d3_geo_pathCentroid = {\n    point: d3_geo_pathCentroidPoint,\n    lineStart: d3_geo_pathCentroidLineStart,\n    lineEnd: d3_geo_pathCentroidLineEnd,\n    polygonStart: function() {\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidRingStart;\n    },\n    polygonEnd: function() {\n      d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n      d3_geo_pathCentroid.lineStart = d3_geo_pathCentroidLineStart;\n      d3_geo_pathCentroid.lineEnd = d3_geo_pathCentroidLineEnd;\n    }\n  };\n  function d3_geo_pathCentroidPoint(x, y) {\n    d3_geo_centroidX0 += x;\n    d3_geo_centroidY0 += y;\n    ++d3_geo_centroidZ0;\n  }\n  function d3_geo_pathCentroidLineStart() {\n    var x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n  }\n  function d3_geo_pathCentroidLineEnd() {\n    d3_geo_pathCentroid.point = d3_geo_pathCentroidPoint;\n  }\n  function d3_geo_pathCentroidRingStart() {\n    var x00, y00, x0, y0;\n    d3_geo_pathCentroid.point = function(x, y) {\n      d3_geo_pathCentroid.point = nextPoint;\n      d3_geo_pathCentroidPoint(x00 = x0 = x, y00 = y0 = y);\n    };\n    function nextPoint(x, y) {\n      var dx = x - x0, dy = y - y0, z = Math.sqrt(dx * dx + dy * dy);\n      d3_geo_centroidX1 += z * (x0 + x) / 2;\n      d3_geo_centroidY1 += z * (y0 + y) / 2;\n      d3_geo_centroidZ1 += z;\n      z = y0 * x - x0 * y;\n      d3_geo_centroidX2 += z * (x0 + x);\n      d3_geo_centroidY2 += z * (y0 + y);\n      d3_geo_centroidZ2 += z * 3;\n      d3_geo_pathCentroidPoint(x0 = x, y0 = y);\n    }\n    d3_geo_pathCentroid.lineEnd = function() {\n      nextPoint(x00, y00);\n    };\n  }\n  function d3_geo_pathContext(context) {\n    var pointRadius = 4.5;\n    var stream = {\n      point: point,\n      lineStart: function() {\n        stream.point = pointLineStart;\n      },\n      lineEnd: lineEnd,\n      polygonStart: function() {\n        stream.lineEnd = lineEndPolygon;\n      },\n      polygonEnd: function() {\n        stream.lineEnd = lineEnd;\n        stream.point = point;\n      },\n      pointRadius: function(_) {\n        pointRadius = _;\n        return stream;\n      },\n      result: d3_noop\n    };\n    function point(x, y) {\n      context.moveTo(x + pointRadius, y);\n      context.arc(x, y, pointRadius, 0, τ);\n    }\n    function pointLineStart(x, y) {\n      context.moveTo(x, y);\n      stream.point = pointLine;\n    }\n    function pointLine(x, y) {\n      context.lineTo(x, y);\n    }\n    function lineEnd() {\n      stream.point = point;\n    }\n    function lineEndPolygon() {\n      context.closePath();\n    }\n    return stream;\n  }\n  function d3_geo_resample(project) {\n    var δ2 = .5, cosMinDistance = Math.cos(30 * d3_radians), maxDepth = 16;\n    function resample(stream) {\n      return (maxDepth ? resampleRecursive : resampleNone)(stream);\n    }\n    function resampleNone(stream) {\n      return d3_geo_transformPoint(stream, function(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      });\n    }\n    function resampleRecursive(stream) {\n      var λ00, φ00, x00, y00, a00, b00, c00, λ0, x0, y0, a0, b0, c0;\n      var resample = {\n        point: point,\n        lineStart: lineStart,\n        lineEnd: lineEnd,\n        polygonStart: function() {\n          stream.polygonStart();\n          resample.lineStart = ringStart;\n        },\n        polygonEnd: function() {\n          stream.polygonEnd();\n          resample.lineStart = lineStart;\n        }\n      };\n      function point(x, y) {\n        x = project(x, y);\n        stream.point(x[0], x[1]);\n      }\n      function lineStart() {\n        x0 = NaN;\n        resample.point = linePoint;\n        stream.lineStart();\n      }\n      function linePoint(λ, φ) {\n        var c = d3_geo_cartesian([ λ, φ ]), p = project(λ, φ);\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x0 = p[0], y0 = p[1], λ0 = λ, a0 = c[0], b0 = c[1], c0 = c[2], maxDepth, stream);\n        stream.point(x0, y0);\n      }\n      function lineEnd() {\n        resample.point = point;\n        stream.lineEnd();\n      }\n      function ringStart() {\n        lineStart();\n        resample.point = ringPoint;\n        resample.lineEnd = ringEnd;\n      }\n      function ringPoint(λ, φ) {\n        linePoint(λ00 = λ, φ00 = φ), x00 = x0, y00 = y0, a00 = a0, b00 = b0, c00 = c0;\n        resample.point = linePoint;\n      }\n      function ringEnd() {\n        resampleLineTo(x0, y0, λ0, a0, b0, c0, x00, y00, λ00, a00, b00, c00, maxDepth, stream);\n        resample.lineEnd = lineEnd;\n        lineEnd();\n      }\n      return resample;\n    }\n    function resampleLineTo(x0, y0, λ0, a0, b0, c0, x1, y1, λ1, a1, b1, c1, depth, stream) {\n      var dx = x1 - x0, dy = y1 - y0, d2 = dx * dx + dy * dy;\n      if (d2 > 4 * δ2 && depth--) {\n        var a = a0 + a1, b = b0 + b1, c = c0 + c1, m = Math.sqrt(a * a + b * b + c * c), φ2 = Math.asin(c /= m), λ2 = abs(abs(c) - 1) < ε || abs(λ0 - λ1) < ε ? (λ0 + λ1) / 2 : Math.atan2(b, a), p = project(λ2, φ2), x2 = p[0], y2 = p[1], dx2 = x2 - x0, dy2 = y2 - y0, dz = dy * dx2 - dx * dy2;\n        if (dz * dz / d2 > δ2 || abs((dx * dx2 + dy * dy2) / d2 - .5) > .3 || a0 * a1 + b0 * b1 + c0 * c1 < cosMinDistance) {\n          resampleLineTo(x0, y0, λ0, a0, b0, c0, x2, y2, λ2, a /= m, b /= m, c, depth, stream);\n          stream.point(x2, y2);\n          resampleLineTo(x2, y2, λ2, a, b, c, x1, y1, λ1, a1, b1, c1, depth, stream);\n        }\n      }\n    }\n    resample.precision = function(_) {\n      if (!arguments.length) return Math.sqrt(δ2);\n      maxDepth = (δ2 = _ * _) > 0 && 16;\n      return resample;\n    };\n    return resample;\n  }\n  d3.geo.path = function() {\n    var pointRadius = 4.5, projection, context, projectStream, contextStream, cacheStream;\n    function path(object) {\n      if (object) {\n        if (typeof pointRadius === \"function\") contextStream.pointRadius(+pointRadius.apply(this, arguments));\n        if (!cacheStream || !cacheStream.valid) cacheStream = projectStream(contextStream);\n        d3.geo.stream(object, cacheStream);\n      }\n      return contextStream.result();\n    }\n    path.area = function(object) {\n      d3_geo_pathAreaSum = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathArea));\n      return d3_geo_pathAreaSum;\n    };\n    path.centroid = function(object) {\n      d3_geo_centroidX0 = d3_geo_centroidY0 = d3_geo_centroidZ0 = d3_geo_centroidX1 = d3_geo_centroidY1 = d3_geo_centroidZ1 = d3_geo_centroidX2 = d3_geo_centroidY2 = d3_geo_centroidZ2 = 0;\n      d3.geo.stream(object, projectStream(d3_geo_pathCentroid));\n      return d3_geo_centroidZ2 ? [ d3_geo_centroidX2 / d3_geo_centroidZ2, d3_geo_centroidY2 / d3_geo_centroidZ2 ] : d3_geo_centroidZ1 ? [ d3_geo_centroidX1 / d3_geo_centroidZ1, d3_geo_centroidY1 / d3_geo_centroidZ1 ] : d3_geo_centroidZ0 ? [ d3_geo_centroidX0 / d3_geo_centroidZ0, d3_geo_centroidY0 / d3_geo_centroidZ0 ] : [ NaN, NaN ];\n    };\n    path.bounds = function(object) {\n      d3_geo_pathBoundsX1 = d3_geo_pathBoundsY1 = -(d3_geo_pathBoundsX0 = d3_geo_pathBoundsY0 = Infinity);\n      d3.geo.stream(object, projectStream(d3_geo_pathBounds));\n      return [ [ d3_geo_pathBoundsX0, d3_geo_pathBoundsY0 ], [ d3_geo_pathBoundsX1, d3_geo_pathBoundsY1 ] ];\n    };\n    path.projection = function(_) {\n      if (!arguments.length) return projection;\n      projectStream = (projection = _) ? _.stream || d3_geo_pathProjectStream(_) : d3_identity;\n      return reset();\n    };\n    path.context = function(_) {\n      if (!arguments.length) return context;\n      contextStream = (context = _) == null ? new d3_geo_pathBuffer() : new d3_geo_pathContext(_);\n      if (typeof pointRadius !== \"function\") contextStream.pointRadius(pointRadius);\n      return reset();\n    };\n    path.pointRadius = function(_) {\n      if (!arguments.length) return pointRadius;\n      pointRadius = typeof _ === \"function\" ? _ : (contextStream.pointRadius(+_), +_);\n      return path;\n    };\n    function reset() {\n      cacheStream = null;\n      return path;\n    }\n    return path.projection(d3.geo.albersUsa()).context(null);\n  };\n  function d3_geo_pathProjectStream(project) {\n    var resample = d3_geo_resample(function(x, y) {\n      return project([ x * d3_degrees, y * d3_degrees ]);\n    });\n    return function(stream) {\n      return d3_geo_projectionRadians(resample(stream));\n    };\n  }\n  d3.geo.transform = function(methods) {\n    return {\n      stream: function(stream) {\n        var transform = new d3_geo_transform(stream);\n        for (var k in methods) transform[k] = methods[k];\n        return transform;\n      }\n    };\n  };\n  function d3_geo_transform(stream) {\n    this.stream = stream;\n  }\n  d3_geo_transform.prototype = {\n    point: function(x, y) {\n      this.stream.point(x, y);\n    },\n    sphere: function() {\n      this.stream.sphere();\n    },\n    lineStart: function() {\n      this.stream.lineStart();\n    },\n    lineEnd: function() {\n      this.stream.lineEnd();\n    },\n    polygonStart: function() {\n      this.stream.polygonStart();\n    },\n    polygonEnd: function() {\n      this.stream.polygonEnd();\n    }\n  };\n  function d3_geo_transformPoint(stream, point) {\n    return {\n      point: point,\n      sphere: function() {\n        stream.sphere();\n      },\n      lineStart: function() {\n        stream.lineStart();\n      },\n      lineEnd: function() {\n        stream.lineEnd();\n      },\n      polygonStart: function() {\n        stream.polygonStart();\n      },\n      polygonEnd: function() {\n        stream.polygonEnd();\n      }\n    };\n  }\n  d3.geo.projection = d3_geo_projection;\n  d3.geo.projectionMutator = d3_geo_projectionMutator;\n  function d3_geo_projection(project) {\n    return d3_geo_projectionMutator(function() {\n      return project;\n    })();\n  }\n  function d3_geo_projectionMutator(projectAt) {\n    var project, rotate, projectRotate, projectResample = d3_geo_resample(function(x, y) {\n      x = project(x, y);\n      return [ x[0] * k + δx, δy - x[1] * k ];\n    }), k = 150, x = 480, y = 250, λ = 0, φ = 0, δλ = 0, δφ = 0, δγ = 0, δx, δy, preclip = d3_geo_clipAntimeridian, postclip = d3_identity, clipAngle = null, clipExtent = null, stream;\n    function projection(point) {\n      point = projectRotate(point[0] * d3_radians, point[1] * d3_radians);\n      return [ point[0] * k + δx, δy - point[1] * k ];\n    }\n    function invert(point) {\n      point = projectRotate.invert((point[0] - δx) / k, (δy - point[1]) / k);\n      return point && [ point[0] * d3_degrees, point[1] * d3_degrees ];\n    }\n    projection.stream = function(output) {\n      if (stream) stream.valid = false;\n      stream = d3_geo_projectionRadians(preclip(rotate, projectResample(postclip(output))));\n      stream.valid = true;\n      return stream;\n    };\n    projection.clipAngle = function(_) {\n      if (!arguments.length) return clipAngle;\n      preclip = _ == null ? (clipAngle = _, d3_geo_clipAntimeridian) : d3_geo_clipCircle((clipAngle = +_) * d3_radians);\n      return invalidate();\n    };\n    projection.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent;\n      clipExtent = _;\n      postclip = _ ? d3_geo_clipExtent(_[0][0], _[0][1], _[1][0], _[1][1]) : d3_identity;\n      return invalidate();\n    };\n    projection.scale = function(_) {\n      if (!arguments.length) return k;\n      k = +_;\n      return reset();\n    };\n    projection.translate = function(_) {\n      if (!arguments.length) return [ x, y ];\n      x = +_[0];\n      y = +_[1];\n      return reset();\n    };\n    projection.center = function(_) {\n      if (!arguments.length) return [ λ * d3_degrees, φ * d3_degrees ];\n      λ = _[0] % 360 * d3_radians;\n      φ = _[1] % 360 * d3_radians;\n      return reset();\n    };\n    projection.rotate = function(_) {\n      if (!arguments.length) return [ δλ * d3_degrees, δφ * d3_degrees, δγ * d3_degrees ];\n      δλ = _[0] % 360 * d3_radians;\n      δφ = _[1] % 360 * d3_radians;\n      δγ = _.length > 2 ? _[2] % 360 * d3_radians : 0;\n      return reset();\n    };\n    d3.rebind(projection, projectResample, \"precision\");\n    function reset() {\n      projectRotate = d3_geo_compose(rotate = d3_geo_rotation(δλ, δφ, δγ), project);\n      var center = project(λ, φ);\n      δx = x - center[0] * k;\n      δy = y + center[1] * k;\n      return invalidate();\n    }\n    function invalidate() {\n      if (stream) stream.valid = false, stream = null;\n      return projection;\n    }\n    return function() {\n      project = projectAt.apply(this, arguments);\n      projection.invert = project.invert && invert;\n      return reset();\n    };\n  }\n  function d3_geo_projectionRadians(stream) {\n    return d3_geo_transformPoint(stream, function(x, y) {\n      stream.point(x * d3_radians, y * d3_radians);\n    });\n  }\n  function d3_geo_equirectangular(λ, φ) {\n    return [ λ, φ ];\n  }\n  (d3.geo.equirectangular = function() {\n    return d3_geo_projection(d3_geo_equirectangular);\n  }).raw = d3_geo_equirectangular.invert = d3_geo_equirectangular;\n  d3.geo.rotation = function(rotate) {\n    rotate = d3_geo_rotation(rotate[0] % 360 * d3_radians, rotate[1] * d3_radians, rotate.length > 2 ? rotate[2] * d3_radians : 0);\n    function forward(coordinates) {\n      coordinates = rotate(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    }\n    forward.invert = function(coordinates) {\n      coordinates = rotate.invert(coordinates[0] * d3_radians, coordinates[1] * d3_radians);\n      return coordinates[0] *= d3_degrees, coordinates[1] *= d3_degrees, coordinates;\n    };\n    return forward;\n  };\n  function d3_geo_identityRotation(λ, φ) {\n    return [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n  }\n  d3_geo_identityRotation.invert = d3_geo_equirectangular;\n  function d3_geo_rotation(δλ, δφ, δγ) {\n    return δλ ? δφ || δγ ? d3_geo_compose(d3_geo_rotationλ(δλ), d3_geo_rotationφγ(δφ, δγ)) : d3_geo_rotationλ(δλ) : δφ || δγ ? d3_geo_rotationφγ(δφ, δγ) : d3_geo_identityRotation;\n  }\n  function d3_geo_forwardRotationλ(δλ) {\n    return function(λ, φ) {\n      return λ += δλ, [ λ > π ? λ - τ : λ < -π ? λ + τ : λ, φ ];\n    };\n  }\n  function d3_geo_rotationλ(δλ) {\n    var rotation = d3_geo_forwardRotationλ(δλ);\n    rotation.invert = d3_geo_forwardRotationλ(-δλ);\n    return rotation;\n  }\n  function d3_geo_rotationφγ(δφ, δγ) {\n    var cosδφ = Math.cos(δφ), sinδφ = Math.sin(δφ), cosδγ = Math.cos(δγ), sinδγ = Math.sin(δγ);\n    function rotation(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδφ + x * sinδφ;\n      return [ Math.atan2(y * cosδγ - k * sinδγ, x * cosδφ - z * sinδφ), d3_asin(k * cosδγ + y * sinδγ) ];\n    }\n    rotation.invert = function(λ, φ) {\n      var cosφ = Math.cos(φ), x = Math.cos(λ) * cosφ, y = Math.sin(λ) * cosφ, z = Math.sin(φ), k = z * cosδγ - y * sinδγ;\n      return [ Math.atan2(y * cosδγ + z * sinδγ, x * cosδφ + k * sinδφ), d3_asin(k * cosδφ - x * sinδφ) ];\n    };\n    return rotation;\n  }\n  d3.geo.circle = function() {\n    var origin = [ 0, 0 ], angle, precision = 6, interpolate;\n    function circle() {\n      var center = typeof origin === \"function\" ? origin.apply(this, arguments) : origin, rotate = d3_geo_rotation(-center[0] * d3_radians, -center[1] * d3_radians, 0).invert, ring = [];\n      interpolate(null, null, 1, {\n        point: function(x, y) {\n          ring.push(x = rotate(x, y));\n          x[0] *= d3_degrees, x[1] *= d3_degrees;\n        }\n      });\n      return {\n        type: \"Polygon\",\n        coordinates: [ ring ]\n      };\n    }\n    circle.origin = function(x) {\n      if (!arguments.length) return origin;\n      origin = x;\n      return circle;\n    };\n    circle.angle = function(x) {\n      if (!arguments.length) return angle;\n      interpolate = d3_geo_circleInterpolate((angle = +x) * d3_radians, precision * d3_radians);\n      return circle;\n    };\n    circle.precision = function(_) {\n      if (!arguments.length) return precision;\n      interpolate = d3_geo_circleInterpolate(angle * d3_radians, (precision = +_) * d3_radians);\n      return circle;\n    };\n    return circle.angle(90);\n  };\n  function d3_geo_circleInterpolate(radius, precision) {\n    var cr = Math.cos(radius), sr = Math.sin(radius);\n    return function(from, to, direction, listener) {\n      var step = direction * precision;\n      if (from != null) {\n        from = d3_geo_circleAngle(cr, from);\n        to = d3_geo_circleAngle(cr, to);\n        if (direction > 0 ? from < to : from > to) from += direction * τ;\n      } else {\n        from = radius + direction * τ;\n        to = radius - .5 * step;\n      }\n      for (var point, t = from; direction > 0 ? t > to : t < to; t -= step) {\n        listener.point((point = d3_geo_spherical([ cr, -sr * Math.cos(t), -sr * Math.sin(t) ]))[0], point[1]);\n      }\n    };\n  }\n  function d3_geo_circleAngle(cr, point) {\n    var a = d3_geo_cartesian(point);\n    a[0] -= cr;\n    d3_geo_cartesianNormalize(a);\n    var angle = d3_acos(-a[1]);\n    return ((-a[2] < 0 ? -angle : angle) + 2 * Math.PI - ε) % (2 * Math.PI);\n  }\n  d3.geo.distance = function(a, b) {\n    var Δλ = (b[0] - a[0]) * d3_radians, φ0 = a[1] * d3_radians, φ1 = b[1] * d3_radians, sinΔλ = Math.sin(Δλ), cosΔλ = Math.cos(Δλ), sinφ0 = Math.sin(φ0), cosφ0 = Math.cos(φ0), sinφ1 = Math.sin(φ1), cosφ1 = Math.cos(φ1), t;\n    return Math.atan2(Math.sqrt((t = cosφ1 * sinΔλ) * t + (t = cosφ0 * sinφ1 - sinφ0 * cosφ1 * cosΔλ) * t), sinφ0 * sinφ1 + cosφ0 * cosφ1 * cosΔλ);\n  };\n  d3.geo.graticule = function() {\n    var x1, x0, X1, X0, y1, y0, Y1, Y0, dx = 10, dy = dx, DX = 90, DY = 360, x, y, X, Y, precision = 2.5;\n    function graticule() {\n      return {\n        type: \"MultiLineString\",\n        coordinates: lines()\n      };\n    }\n    function lines() {\n      return d3.range(Math.ceil(X0 / DX) * DX, X1, DX).map(X).concat(d3.range(Math.ceil(Y0 / DY) * DY, Y1, DY).map(Y)).concat(d3.range(Math.ceil(x0 / dx) * dx, x1, dx).filter(function(x) {\n        return abs(x % DX) > ε;\n      }).map(x)).concat(d3.range(Math.ceil(y0 / dy) * dy, y1, dy).filter(function(y) {\n        return abs(y % DY) > ε;\n      }).map(y));\n    }\n    graticule.lines = function() {\n      return lines().map(function(coordinates) {\n        return {\n          type: \"LineString\",\n          coordinates: coordinates\n        };\n      });\n    };\n    graticule.outline = function() {\n      return {\n        type: \"Polygon\",\n        coordinates: [ X(X0).concat(Y(Y1).slice(1), X(X1).reverse().slice(1), Y(Y0).reverse().slice(1)) ]\n      };\n    };\n    graticule.extent = function(_) {\n      if (!arguments.length) return graticule.minorExtent();\n      return graticule.majorExtent(_).minorExtent(_);\n    };\n    graticule.majorExtent = function(_) {\n      if (!arguments.length) return [ [ X0, Y0 ], [ X1, Y1 ] ];\n      X0 = +_[0][0], X1 = +_[1][0];\n      Y0 = +_[0][1], Y1 = +_[1][1];\n      if (X0 > X1) _ = X0, X0 = X1, X1 = _;\n      if (Y0 > Y1) _ = Y0, Y0 = Y1, Y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.minorExtent = function(_) {\n      if (!arguments.length) return [ [ x0, y0 ], [ x1, y1 ] ];\n      x0 = +_[0][0], x1 = +_[1][0];\n      y0 = +_[0][1], y1 = +_[1][1];\n      if (x0 > x1) _ = x0, x0 = x1, x1 = _;\n      if (y0 > y1) _ = y0, y0 = y1, y1 = _;\n      return graticule.precision(precision);\n    };\n    graticule.step = function(_) {\n      if (!arguments.length) return graticule.minorStep();\n      return graticule.majorStep(_).minorStep(_);\n    };\n    graticule.majorStep = function(_) {\n      if (!arguments.length) return [ DX, DY ];\n      DX = +_[0], DY = +_[1];\n      return graticule;\n    };\n    graticule.minorStep = function(_) {\n      if (!arguments.length) return [ dx, dy ];\n      dx = +_[0], dy = +_[1];\n      return graticule;\n    };\n    graticule.precision = function(_) {\n      if (!arguments.length) return precision;\n      precision = +_;\n      x = d3_geo_graticuleX(y0, y1, 90);\n      y = d3_geo_graticuleY(x0, x1, precision);\n      X = d3_geo_graticuleX(Y0, Y1, 90);\n      Y = d3_geo_graticuleY(X0, X1, precision);\n      return graticule;\n    };\n    return graticule.majorExtent([ [ -180, -90 + ε ], [ 180, 90 - ε ] ]).minorExtent([ [ -180, -80 - ε ], [ 180, 80 + ε ] ]);\n  };\n  function d3_geo_graticuleX(y0, y1, dy) {\n    var y = d3.range(y0, y1 - ε, dy).concat(y1);\n    return function(x) {\n      return y.map(function(y) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_geo_graticuleY(x0, x1, dx) {\n    var x = d3.range(x0, x1 - ε, dx).concat(x1);\n    return function(y) {\n      return x.map(function(x) {\n        return [ x, y ];\n      });\n    };\n  }\n  function d3_source(d) {\n    return d.source;\n  }\n  function d3_target(d) {\n    return d.target;\n  }\n  d3.geo.greatArc = function() {\n    var source = d3_source, source_, target = d3_target, target_;\n    function greatArc() {\n      return {\n        type: \"LineString\",\n        coordinates: [ source_ || source.apply(this, arguments), target_ || target.apply(this, arguments) ]\n      };\n    }\n    greatArc.distance = function() {\n      return d3.geo.distance(source_ || source.apply(this, arguments), target_ || target.apply(this, arguments));\n    };\n    greatArc.source = function(_) {\n      if (!arguments.length) return source;\n      source = _, source_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.target = function(_) {\n      if (!arguments.length) return target;\n      target = _, target_ = typeof _ === \"function\" ? null : _;\n      return greatArc;\n    };\n    greatArc.precision = function() {\n      return arguments.length ? greatArc : 0;\n    };\n    return greatArc;\n  };\n  d3.geo.interpolate = function(source, target) {\n    return d3_geo_interpolate(source[0] * d3_radians, source[1] * d3_radians, target[0] * d3_radians, target[1] * d3_radians);\n  };\n  function d3_geo_interpolate(x0, y0, x1, y1) {\n    var cy0 = Math.cos(y0), sy0 = Math.sin(y0), cy1 = Math.cos(y1), sy1 = Math.sin(y1), kx0 = cy0 * Math.cos(x0), ky0 = cy0 * Math.sin(x0), kx1 = cy1 * Math.cos(x1), ky1 = cy1 * Math.sin(x1), d = 2 * Math.asin(Math.sqrt(d3_haversin(y1 - y0) + cy0 * cy1 * d3_haversin(x1 - x0))), k = 1 / Math.sin(d);\n    var interpolate = d ? function(t) {\n      var B = Math.sin(t *= d) * k, A = Math.sin(d - t) * k, x = A * kx0 + B * kx1, y = A * ky0 + B * ky1, z = A * sy0 + B * sy1;\n      return [ Math.atan2(y, x) * d3_degrees, Math.atan2(z, Math.sqrt(x * x + y * y)) * d3_degrees ];\n    } : function() {\n      return [ x0 * d3_degrees, y0 * d3_degrees ];\n    };\n    interpolate.distance = d;\n    return interpolate;\n  }\n  d3.geo.length = function(object) {\n    d3_geo_lengthSum = 0;\n    d3.geo.stream(object, d3_geo_length);\n    return d3_geo_lengthSum;\n  };\n  var d3_geo_lengthSum;\n  var d3_geo_length = {\n    sphere: d3_noop,\n    point: d3_noop,\n    lineStart: d3_geo_lengthLineStart,\n    lineEnd: d3_noop,\n    polygonStart: d3_noop,\n    polygonEnd: d3_noop\n  };\n  function d3_geo_lengthLineStart() {\n    var λ0, sinφ0, cosφ0;\n    d3_geo_length.point = function(λ, φ) {\n      λ0 = λ * d3_radians, sinφ0 = Math.sin(φ *= d3_radians), cosφ0 = Math.cos(φ);\n      d3_geo_length.point = nextPoint;\n    };\n    d3_geo_length.lineEnd = function() {\n      d3_geo_length.point = d3_geo_length.lineEnd = d3_noop;\n    };\n    function nextPoint(λ, φ) {\n      var sinφ = Math.sin(φ *= d3_radians), cosφ = Math.cos(φ), t = abs((λ *= d3_radians) - λ0), cosΔλ = Math.cos(t);\n      d3_geo_lengthSum += Math.atan2(Math.sqrt((t = cosφ * Math.sin(t)) * t + (t = cosφ0 * sinφ - sinφ0 * cosφ * cosΔλ) * t), sinφ0 * sinφ + cosφ0 * cosφ * cosΔλ);\n      λ0 = λ, sinφ0 = sinφ, cosφ0 = cosφ;\n    }\n  }\n  function d3_geo_azimuthal(scale, angle) {\n    function azimuthal(λ, φ) {\n      var cosλ = Math.cos(λ), cosφ = Math.cos(φ), k = scale(cosλ * cosφ);\n      return [ k * cosφ * Math.sin(λ), k * Math.sin(φ) ];\n    }\n    azimuthal.invert = function(x, y) {\n      var ρ = Math.sqrt(x * x + y * y), c = angle(ρ), sinc = Math.sin(c), cosc = Math.cos(c);\n      return [ Math.atan2(x * sinc, ρ * cosc), Math.asin(ρ && y * sinc / ρ) ];\n    };\n    return azimuthal;\n  }\n  var d3_geo_azimuthalEqualArea = d3_geo_azimuthal(function(cosλcosφ) {\n    return Math.sqrt(2 / (1 + cosλcosφ));\n  }, function(ρ) {\n    return 2 * Math.asin(ρ / 2);\n  });\n  (d3.geo.azimuthalEqualArea = function() {\n    return d3_geo_projection(d3_geo_azimuthalEqualArea);\n  }).raw = d3_geo_azimuthalEqualArea;\n  var d3_geo_azimuthalEquidistant = d3_geo_azimuthal(function(cosλcosφ) {\n    var c = Math.acos(cosλcosφ);\n    return c && c / Math.sin(c);\n  }, d3_identity);\n  (d3.geo.azimuthalEquidistant = function() {\n    return d3_geo_projection(d3_geo_azimuthalEquidistant);\n  }).raw = d3_geo_azimuthalEquidistant;\n  function d3_geo_conicConformal(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), t = function(φ) {\n      return Math.tan(π / 4 + φ / 2);\n    }, n = φ0 === φ1 ? Math.sin(φ0) : Math.log(cosφ0 / Math.cos(φ1)) / Math.log(t(φ1) / t(φ0)), F = cosφ0 * Math.pow(t(φ0), n) / n;\n    if (!n) return d3_geo_mercator;\n    function forward(λ, φ) {\n      if (F > 0) {\n        if (φ < -halfπ + ε) φ = -halfπ + ε;\n      } else {\n        if (φ > halfπ - ε) φ = halfπ - ε;\n      }\n      var ρ = F / Math.pow(t(φ), n);\n      return [ ρ * Math.sin(n * λ), F - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = F - y, ρ = d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y);\n      return [ Math.atan2(x, ρ0_y) / n, 2 * Math.atan(Math.pow(F / ρ, 1 / n)) - halfπ ];\n    };\n    return forward;\n  }\n  (d3.geo.conicConformal = function() {\n    return d3_geo_conic(d3_geo_conicConformal);\n  }).raw = d3_geo_conicConformal;\n  function d3_geo_conicEquidistant(φ0, φ1) {\n    var cosφ0 = Math.cos(φ0), n = φ0 === φ1 ? Math.sin(φ0) : (cosφ0 - Math.cos(φ1)) / (φ1 - φ0), G = cosφ0 / n + φ0;\n    if (abs(n) < ε) return d3_geo_equirectangular;\n    function forward(λ, φ) {\n      var ρ = G - φ;\n      return [ ρ * Math.sin(n * λ), G - ρ * Math.cos(n * λ) ];\n    }\n    forward.invert = function(x, y) {\n      var ρ0_y = G - y;\n      return [ Math.atan2(x, ρ0_y) / n, G - d3_sgn(n) * Math.sqrt(x * x + ρ0_y * ρ0_y) ];\n    };\n    return forward;\n  }\n  (d3.geo.conicEquidistant = function() {\n    return d3_geo_conic(d3_geo_conicEquidistant);\n  }).raw = d3_geo_conicEquidistant;\n  var d3_geo_gnomonic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / cosλcosφ;\n  }, Math.atan);\n  (d3.geo.gnomonic = function() {\n    return d3_geo_projection(d3_geo_gnomonic);\n  }).raw = d3_geo_gnomonic;\n  function d3_geo_mercator(λ, φ) {\n    return [ λ, Math.log(Math.tan(π / 4 + φ / 2)) ];\n  }\n  d3_geo_mercator.invert = function(x, y) {\n    return [ x, 2 * Math.atan(Math.exp(y)) - halfπ ];\n  };\n  function d3_geo_mercatorProjection(project) {\n    var m = d3_geo_projection(project), scale = m.scale, translate = m.translate, clipExtent = m.clipExtent, clipAuto;\n    m.scale = function() {\n      var v = scale.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.translate = function() {\n      var v = translate.apply(m, arguments);\n      return v === m ? clipAuto ? m.clipExtent(null) : m : v;\n    };\n    m.clipExtent = function(_) {\n      var v = clipExtent.apply(m, arguments);\n      if (v === m) {\n        if (clipAuto = _ == null) {\n          var k = π * scale(), t = translate();\n          clipExtent([ [ t[0] - k, t[1] - k ], [ t[0] + k, t[1] + k ] ]);\n        }\n      } else if (clipAuto) {\n        v = null;\n      }\n      return v;\n    };\n    return m.clipExtent(null);\n  }\n  (d3.geo.mercator = function() {\n    return d3_geo_mercatorProjection(d3_geo_mercator);\n  }).raw = d3_geo_mercator;\n  var d3_geo_orthographic = d3_geo_azimuthal(function() {\n    return 1;\n  }, Math.asin);\n  (d3.geo.orthographic = function() {\n    return d3_geo_projection(d3_geo_orthographic);\n  }).raw = d3_geo_orthographic;\n  var d3_geo_stereographic = d3_geo_azimuthal(function(cosλcosφ) {\n    return 1 / (1 + cosλcosφ);\n  }, function(ρ) {\n    return 2 * Math.atan(ρ);\n  });\n  (d3.geo.stereographic = function() {\n    return d3_geo_projection(d3_geo_stereographic);\n  }).raw = d3_geo_stereographic;\n  function d3_geo_transverseMercator(λ, φ) {\n    return [ Math.log(Math.tan(π / 4 + φ / 2)), -λ ];\n  }\n  d3_geo_transverseMercator.invert = function(x, y) {\n    return [ -y, 2 * Math.atan(Math.exp(x)) - halfπ ];\n  };\n  (d3.geo.transverseMercator = function() {\n    var projection = d3_geo_mercatorProjection(d3_geo_transverseMercator), center = projection.center, rotate = projection.rotate;\n    projection.center = function(_) {\n      return _ ? center([ -_[1], _[0] ]) : (_ = center(), [ _[1], -_[0] ]);\n    };\n    projection.rotate = function(_) {\n      return _ ? rotate([ _[0], _[1], _.length > 2 ? _[2] + 90 : 90 ]) : (_ = rotate(), \n      [ _[0], _[1], _[2] - 90 ]);\n    };\n    return rotate([ 0, 0, 90 ]);\n  }).raw = d3_geo_transverseMercator;\n  d3.geom = {};\n  function d3_geom_pointX(d) {\n    return d[0];\n  }\n  function d3_geom_pointY(d) {\n    return d[1];\n  }\n  d3.geom.hull = function(vertices) {\n    var x = d3_geom_pointX, y = d3_geom_pointY;\n    if (arguments.length) return hull(vertices);\n    function hull(data) {\n      if (data.length < 3) return [];\n      var fx = d3_functor(x), fy = d3_functor(y), i, n = data.length, points = [], flippedPoints = [];\n      for (i = 0; i < n; i++) {\n        points.push([ +fx.call(this, data[i], i), +fy.call(this, data[i], i), i ]);\n      }\n      points.sort(d3_geom_hullOrder);\n      for (i = 0; i < n; i++) flippedPoints.push([ points[i][0], -points[i][1] ]);\n      var upper = d3_geom_hullUpper(points), lower = d3_geom_hullUpper(flippedPoints);\n      var skipLeft = lower[0] === upper[0], skipRight = lower[lower.length - 1] === upper[upper.length - 1], polygon = [];\n      for (i = upper.length - 1; i >= 0; --i) polygon.push(data[points[upper[i]][2]]);\n      for (i = +skipLeft; i < lower.length - skipRight; ++i) polygon.push(data[points[lower[i]][2]]);\n      return polygon;\n    }\n    hull.x = function(_) {\n      return arguments.length ? (x = _, hull) : x;\n    };\n    hull.y = function(_) {\n      return arguments.length ? (y = _, hull) : y;\n    };\n    return hull;\n  };\n  function d3_geom_hullUpper(points) {\n    var n = points.length, hull = [ 0, 1 ], hs = 2;\n    for (var i = 2; i < n; i++) {\n      while (hs > 1 && d3_cross2d(points[hull[hs - 2]], points[hull[hs - 1]], points[i]) <= 0) --hs;\n      hull[hs++] = i;\n    }\n    return hull.slice(0, hs);\n  }\n  function d3_geom_hullOrder(a, b) {\n    return a[0] - b[0] || a[1] - b[1];\n  }\n  d3.geom.polygon = function(coordinates) {\n    d3_subclass(coordinates, d3_geom_polygonPrototype);\n    return coordinates;\n  };\n  var d3_geom_polygonPrototype = d3.geom.polygon.prototype = [];\n  d3_geom_polygonPrototype.area = function() {\n    var i = -1, n = this.length, a, b = this[n - 1], area = 0;\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      area += a[1] * b[0] - a[0] * b[1];\n    }\n    return area * .5;\n  };\n  d3_geom_polygonPrototype.centroid = function(k) {\n    var i = -1, n = this.length, x = 0, y = 0, a, b = this[n - 1], c;\n    if (!arguments.length) k = -1 / (6 * this.area());\n    while (++i < n) {\n      a = b;\n      b = this[i];\n      c = a[0] * b[1] - b[0] * a[1];\n      x += (a[0] + b[0]) * c;\n      y += (a[1] + b[1]) * c;\n    }\n    return [ x * k, y * k ];\n  };\n  d3_geom_polygonPrototype.clip = function(subject) {\n    var input, closed = d3_geom_polygonClosed(subject), i = -1, n = this.length - d3_geom_polygonClosed(this), j, m, a = this[n - 1], b, c, d;\n    while (++i < n) {\n      input = subject.slice();\n      subject.length = 0;\n      b = this[i];\n      c = input[(m = input.length - closed) - 1];\n      j = -1;\n      while (++j < m) {\n        d = input[j];\n        if (d3_geom_polygonInside(d, a, b)) {\n          if (!d3_geom_polygonInside(c, a, b)) {\n            subject.push(d3_geom_polygonIntersect(c, d, a, b));\n          }\n          subject.push(d);\n        } else if (d3_geom_polygonInside(c, a, b)) {\n          subject.push(d3_geom_polygonIntersect(c, d, a, b));\n        }\n        c = d;\n      }\n      if (closed) subject.push(subject[0]);\n      a = b;\n    }\n    return subject;\n  };\n  function d3_geom_polygonInside(p, a, b) {\n    return (b[0] - a[0]) * (p[1] - a[1]) < (b[1] - a[1]) * (p[0] - a[0]);\n  }\n  function d3_geom_polygonIntersect(c, d, a, b) {\n    var x1 = c[0], x3 = a[0], x21 = d[0] - x1, x43 = b[0] - x3, y1 = c[1], y3 = a[1], y21 = d[1] - y1, y43 = b[1] - y3, ua = (x43 * (y1 - y3) - y43 * (x1 - x3)) / (y43 * x21 - x43 * y21);\n    return [ x1 + ua * x21, y1 + ua * y21 ];\n  }\n  function d3_geom_polygonClosed(coordinates) {\n    var a = coordinates[0], b = coordinates[coordinates.length - 1];\n    return !(a[0] - b[0] || a[1] - b[1]);\n  }\n  var d3_geom_voronoiEdges, d3_geom_voronoiCells, d3_geom_voronoiBeaches, d3_geom_voronoiBeachPool = [], d3_geom_voronoiFirstCircle, d3_geom_voronoiCircles, d3_geom_voronoiCirclePool = [];\n  function d3_geom_voronoiBeach() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.edge = this.site = this.circle = null;\n  }\n  function d3_geom_voronoiCreateBeach(site) {\n    var beach = d3_geom_voronoiBeachPool.pop() || new d3_geom_voronoiBeach();\n    beach.site = site;\n    return beach;\n  }\n  function d3_geom_voronoiDetachBeach(beach) {\n    d3_geom_voronoiDetachCircle(beach);\n    d3_geom_voronoiBeaches.remove(beach);\n    d3_geom_voronoiBeachPool.push(beach);\n    d3_geom_voronoiRedBlackNode(beach);\n  }\n  function d3_geom_voronoiRemoveBeach(beach) {\n    var circle = beach.circle, x = circle.x, y = circle.cy, vertex = {\n      x: x,\n      y: y\n    }, previous = beach.P, next = beach.N, disappearing = [ beach ];\n    d3_geom_voronoiDetachBeach(beach);\n    var lArc = previous;\n    while (lArc.circle && abs(x - lArc.circle.x) < ε && abs(y - lArc.circle.cy) < ε) {\n      previous = lArc.P;\n      disappearing.unshift(lArc);\n      d3_geom_voronoiDetachBeach(lArc);\n      lArc = previous;\n    }\n    disappearing.unshift(lArc);\n    d3_geom_voronoiDetachCircle(lArc);\n    var rArc = next;\n    while (rArc.circle && abs(x - rArc.circle.x) < ε && abs(y - rArc.circle.cy) < ε) {\n      next = rArc.N;\n      disappearing.push(rArc);\n      d3_geom_voronoiDetachBeach(rArc);\n      rArc = next;\n    }\n    disappearing.push(rArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var nArcs = disappearing.length, iArc;\n    for (iArc = 1; iArc < nArcs; ++iArc) {\n      rArc = disappearing[iArc];\n      lArc = disappearing[iArc - 1];\n      d3_geom_voronoiSetEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);\n    }\n    lArc = disappearing[0];\n    rArc = disappearing[nArcs - 1];\n    rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, rArc.site, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiAddBeach(site) {\n    var x = site.x, directrix = site.y, lArc, rArc, dxl, dxr, node = d3_geom_voronoiBeaches._;\n    while (node) {\n      dxl = d3_geom_voronoiLeftBreakPoint(node, directrix) - x;\n      if (dxl > ε) node = node.L; else {\n        dxr = x - d3_geom_voronoiRightBreakPoint(node, directrix);\n        if (dxr > ε) {\n          if (!node.R) {\n            lArc = node;\n            break;\n          }\n          node = node.R;\n        } else {\n          if (dxl > -ε) {\n            lArc = node.P;\n            rArc = node;\n          } else if (dxr > -ε) {\n            lArc = node;\n            rArc = node.N;\n          } else {\n            lArc = rArc = node;\n          }\n          break;\n        }\n      }\n    }\n    var newArc = d3_geom_voronoiCreateBeach(site);\n    d3_geom_voronoiBeaches.insert(lArc, newArc);\n    if (!lArc && !rArc) return;\n    if (lArc === rArc) {\n      d3_geom_voronoiDetachCircle(lArc);\n      rArc = d3_geom_voronoiCreateBeach(lArc.site);\n      d3_geom_voronoiBeaches.insert(newArc, rArc);\n      newArc.edge = rArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      d3_geom_voronoiAttachCircle(lArc);\n      d3_geom_voronoiAttachCircle(rArc);\n      return;\n    }\n    if (!rArc) {\n      newArc.edge = d3_geom_voronoiCreateEdge(lArc.site, newArc.site);\n      return;\n    }\n    d3_geom_voronoiDetachCircle(lArc);\n    d3_geom_voronoiDetachCircle(rArc);\n    var lSite = lArc.site, ax = lSite.x, ay = lSite.y, bx = site.x - ax, by = site.y - ay, rSite = rArc.site, cx = rSite.x - ax, cy = rSite.y - ay, d = 2 * (bx * cy - by * cx), hb = bx * bx + by * by, hc = cx * cx + cy * cy, vertex = {\n      x: (cy * hb - by * hc) / d + ax,\n      y: (bx * hc - cx * hb) / d + ay\n    };\n    d3_geom_voronoiSetEdgeEnd(rArc.edge, lSite, rSite, vertex);\n    newArc.edge = d3_geom_voronoiCreateEdge(lSite, site, null, vertex);\n    rArc.edge = d3_geom_voronoiCreateEdge(site, rSite, null, vertex);\n    d3_geom_voronoiAttachCircle(lArc);\n    d3_geom_voronoiAttachCircle(rArc);\n  }\n  function d3_geom_voronoiLeftBreakPoint(arc, directrix) {\n    var site = arc.site, rfocx = site.x, rfocy = site.y, pby2 = rfocy - directrix;\n    if (!pby2) return rfocx;\n    var lArc = arc.P;\n    if (!lArc) return -Infinity;\n    site = lArc.site;\n    var lfocx = site.x, lfocy = site.y, plby2 = lfocy - directrix;\n    if (!plby2) return lfocx;\n    var hl = lfocx - rfocx, aby2 = 1 / pby2 - 1 / plby2, b = hl / plby2;\n    if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;\n    return (rfocx + lfocx) / 2;\n  }\n  function d3_geom_voronoiRightBreakPoint(arc, directrix) {\n    var rArc = arc.N;\n    if (rArc) return d3_geom_voronoiLeftBreakPoint(rArc, directrix);\n    var site = arc.site;\n    return site.y === directrix ? site.x : Infinity;\n  }\n  function d3_geom_voronoiCell(site) {\n    this.site = site;\n    this.edges = [];\n  }\n  d3_geom_voronoiCell.prototype.prepare = function() {\n    var halfEdges = this.edges, iHalfEdge = halfEdges.length, edge;\n    while (iHalfEdge--) {\n      edge = halfEdges[iHalfEdge].edge;\n      if (!edge.b || !edge.a) halfEdges.splice(iHalfEdge, 1);\n    }\n    halfEdges.sort(d3_geom_voronoiHalfEdgeOrder);\n    return halfEdges.length;\n  };\n  function d3_geom_voronoiCloseCells(extent) {\n    var x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], x2, y2, x3, y3, cells = d3_geom_voronoiCells, iCell = cells.length, cell, iHalfEdge, halfEdges, nHalfEdges, start, end;\n    while (iCell--) {\n      cell = cells[iCell];\n      if (!cell || !cell.prepare()) continue;\n      halfEdges = cell.edges;\n      nHalfEdges = halfEdges.length;\n      iHalfEdge = 0;\n      while (iHalfEdge < nHalfEdges) {\n        end = halfEdges[iHalfEdge].end(), x3 = end.x, y3 = end.y;\n        start = halfEdges[++iHalfEdge % nHalfEdges].start(), x2 = start.x, y2 = start.y;\n        if (abs(x3 - x2) > ε || abs(y3 - y2) > ε) {\n          halfEdges.splice(iHalfEdge, 0, new d3_geom_voronoiHalfEdge(d3_geom_voronoiCreateBorderEdge(cell.site, end, abs(x3 - x0) < ε && y1 - y3 > ε ? {\n            x: x0,\n            y: abs(x2 - x0) < ε ? y2 : y1\n          } : abs(y3 - y1) < ε && x1 - x3 > ε ? {\n            x: abs(y2 - y1) < ε ? x2 : x1,\n            y: y1\n          } : abs(x3 - x1) < ε && y3 - y0 > ε ? {\n            x: x1,\n            y: abs(x2 - x1) < ε ? y2 : y0\n          } : abs(y3 - y0) < ε && x3 - x0 > ε ? {\n            x: abs(y2 - y0) < ε ? x2 : x0,\n            y: y0\n          } : null), cell.site, null));\n          ++nHalfEdges;\n        }\n      }\n    }\n  }\n  function d3_geom_voronoiHalfEdgeOrder(a, b) {\n    return b.angle - a.angle;\n  }\n  function d3_geom_voronoiCircle() {\n    d3_geom_voronoiRedBlackNode(this);\n    this.x = this.y = this.arc = this.site = this.cy = null;\n  }\n  function d3_geom_voronoiAttachCircle(arc) {\n    var lArc = arc.P, rArc = arc.N;\n    if (!lArc || !rArc) return;\n    var lSite = lArc.site, cSite = arc.site, rSite = rArc.site;\n    if (lSite === rSite) return;\n    var bx = cSite.x, by = cSite.y, ax = lSite.x - bx, ay = lSite.y - by, cx = rSite.x - bx, cy = rSite.y - by;\n    var d = 2 * (ax * cy - ay * cx);\n    if (d >= -ε2) return;\n    var ha = ax * ax + ay * ay, hc = cx * cx + cy * cy, x = (cy * ha - ay * hc) / d, y = (ax * hc - cx * ha) / d, cy = y + by;\n    var circle = d3_geom_voronoiCirclePool.pop() || new d3_geom_voronoiCircle();\n    circle.arc = arc;\n    circle.site = cSite;\n    circle.x = x + bx;\n    circle.y = cy + Math.sqrt(x * x + y * y);\n    circle.cy = cy;\n    arc.circle = circle;\n    var before = null, node = d3_geom_voronoiCircles._;\n    while (node) {\n      if (circle.y < node.y || circle.y === node.y && circle.x <= node.x) {\n        if (node.L) node = node.L; else {\n          before = node.P;\n          break;\n        }\n      } else {\n        if (node.R) node = node.R; else {\n          before = node;\n          break;\n        }\n      }\n    }\n    d3_geom_voronoiCircles.insert(before, circle);\n    if (!before) d3_geom_voronoiFirstCircle = circle;\n  }\n  function d3_geom_voronoiDetachCircle(arc) {\n    var circle = arc.circle;\n    if (circle) {\n      if (!circle.P) d3_geom_voronoiFirstCircle = circle.N;\n      d3_geom_voronoiCircles.remove(circle);\n      d3_geom_voronoiCirclePool.push(circle);\n      d3_geom_voronoiRedBlackNode(circle);\n      arc.circle = null;\n    }\n  }\n  function d3_geom_voronoiClipEdges(extent) {\n    var edges = d3_geom_voronoiEdges, clip = d3_geom_clipLine(extent[0][0], extent[0][1], extent[1][0], extent[1][1]), i = edges.length, e;\n    while (i--) {\n      e = edges[i];\n      if (!d3_geom_voronoiConnectEdge(e, extent) || !clip(e) || abs(e.a.x - e.b.x) < ε && abs(e.a.y - e.b.y) < ε) {\n        e.a = e.b = null;\n        edges.splice(i, 1);\n      }\n    }\n  }\n  function d3_geom_voronoiConnectEdge(edge, extent) {\n    var vb = edge.b;\n    if (vb) return true;\n    var va = edge.a, x0 = extent[0][0], x1 = extent[1][0], y0 = extent[0][1], y1 = extent[1][1], lSite = edge.l, rSite = edge.r, lx = lSite.x, ly = lSite.y, rx = rSite.x, ry = rSite.y, fx = (lx + rx) / 2, fy = (ly + ry) / 2, fm, fb;\n    if (ry === ly) {\n      if (fx < x0 || fx >= x1) return;\n      if (lx > rx) {\n        if (!va) va = {\n          x: fx,\n          y: y0\n        }; else if (va.y >= y1) return;\n        vb = {\n          x: fx,\n          y: y1\n        };\n      } else {\n        if (!va) va = {\n          x: fx,\n          y: y1\n        }; else if (va.y < y0) return;\n        vb = {\n          x: fx,\n          y: y0\n        };\n      }\n    } else {\n      fm = (lx - rx) / (ry - ly);\n      fb = fy - fm * fx;\n      if (fm < -1 || fm > 1) {\n        if (lx > rx) {\n          if (!va) va = {\n            x: (y0 - fb) / fm,\n            y: y0\n          }; else if (va.y >= y1) return;\n          vb = {\n            x: (y1 - fb) / fm,\n            y: y1\n          };\n        } else {\n          if (!va) va = {\n            x: (y1 - fb) / fm,\n            y: y1\n          }; else if (va.y < y0) return;\n          vb = {\n            x: (y0 - fb) / fm,\n            y: y0\n          };\n        }\n      } else {\n        if (ly < ry) {\n          if (!va) va = {\n            x: x0,\n            y: fm * x0 + fb\n          }; else if (va.x >= x1) return;\n          vb = {\n            x: x1,\n            y: fm * x1 + fb\n          };\n        } else {\n          if (!va) va = {\n            x: x1,\n            y: fm * x1 + fb\n          }; else if (va.x < x0) return;\n          vb = {\n            x: x0,\n            y: fm * x0 + fb\n          };\n        }\n      }\n    }\n    edge.a = va;\n    edge.b = vb;\n    return true;\n  }\n  function d3_geom_voronoiEdge(lSite, rSite) {\n    this.l = lSite;\n    this.r = rSite;\n    this.a = this.b = null;\n  }\n  function d3_geom_voronoiCreateEdge(lSite, rSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, rSite);\n    d3_geom_voronoiEdges.push(edge);\n    if (va) d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, va);\n    if (vb) d3_geom_voronoiSetEdgeEnd(edge, rSite, lSite, vb);\n    d3_geom_voronoiCells[lSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, lSite, rSite));\n    d3_geom_voronoiCells[rSite.i].edges.push(new d3_geom_voronoiHalfEdge(edge, rSite, lSite));\n    return edge;\n  }\n  function d3_geom_voronoiCreateBorderEdge(lSite, va, vb) {\n    var edge = new d3_geom_voronoiEdge(lSite, null);\n    edge.a = va;\n    edge.b = vb;\n    d3_geom_voronoiEdges.push(edge);\n    return edge;\n  }\n  function d3_geom_voronoiSetEdgeEnd(edge, lSite, rSite, vertex) {\n    if (!edge.a && !edge.b) {\n      edge.a = vertex;\n      edge.l = lSite;\n      edge.r = rSite;\n    } else if (edge.l === rSite) {\n      edge.b = vertex;\n    } else {\n      edge.a = vertex;\n    }\n  }\n  function d3_geom_voronoiHalfEdge(edge, lSite, rSite) {\n    var va = edge.a, vb = edge.b;\n    this.edge = edge;\n    this.site = lSite;\n    this.angle = rSite ? Math.atan2(rSite.y - lSite.y, rSite.x - lSite.x) : edge.l === lSite ? Math.atan2(vb.x - va.x, va.y - vb.y) : Math.atan2(va.x - vb.x, vb.y - va.y);\n  }\n  d3_geom_voronoiHalfEdge.prototype = {\n    start: function() {\n      return this.edge.l === this.site ? this.edge.a : this.edge.b;\n    },\n    end: function() {\n      return this.edge.l === this.site ? this.edge.b : this.edge.a;\n    }\n  };\n  function d3_geom_voronoiRedBlackTree() {\n    this._ = null;\n  }\n  function d3_geom_voronoiRedBlackNode(node) {\n    node.U = node.C = node.L = node.R = node.P = node.N = null;\n  }\n  d3_geom_voronoiRedBlackTree.prototype = {\n    insert: function(after, node) {\n      var parent, grandpa, uncle;\n      if (after) {\n        node.P = after;\n        node.N = after.N;\n        if (after.N) after.N.P = node;\n        after.N = node;\n        if (after.R) {\n          after = after.R;\n          while (after.L) after = after.L;\n          after.L = node;\n        } else {\n          after.R = node;\n        }\n        parent = after;\n      } else if (this._) {\n        after = d3_geom_voronoiRedBlackFirst(this._);\n        node.P = null;\n        node.N = after;\n        after.P = after.L = node;\n        parent = after;\n      } else {\n        node.P = node.N = null;\n        this._ = node;\n        parent = null;\n      }\n      node.L = node.R = null;\n      node.U = parent;\n      node.C = true;\n      after = node;\n      while (parent && parent.C) {\n        grandpa = parent.U;\n        if (parent === grandpa.L) {\n          uncle = grandpa.R;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.R) {\n              d3_geom_voronoiRedBlackRotateLeft(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, grandpa);\n          }\n        } else {\n          uncle = grandpa.L;\n          if (uncle && uncle.C) {\n            parent.C = uncle.C = false;\n            grandpa.C = true;\n            after = grandpa;\n          } else {\n            if (after === parent.L) {\n              d3_geom_voronoiRedBlackRotateRight(this, parent);\n              after = parent;\n              parent = after.U;\n            }\n            parent.C = false;\n            grandpa.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, grandpa);\n          }\n        }\n        parent = after.U;\n      }\n      this._.C = false;\n    },\n    remove: function(node) {\n      if (node.N) node.N.P = node.P;\n      if (node.P) node.P.N = node.N;\n      node.N = node.P = null;\n      var parent = node.U, sibling, left = node.L, right = node.R, next, red;\n      if (!left) next = right; else if (!right) next = left; else next = d3_geom_voronoiRedBlackFirst(right);\n      if (parent) {\n        if (parent.L === node) parent.L = next; else parent.R = next;\n      } else {\n        this._ = next;\n      }\n      if (left && right) {\n        red = next.C;\n        next.C = node.C;\n        next.L = left;\n        left.U = next;\n        if (next !== right) {\n          parent = next.U;\n          next.U = node.U;\n          node = next.R;\n          parent.L = node;\n          next.R = right;\n          right.U = next;\n        } else {\n          next.U = parent;\n          parent = next;\n          node = next.R;\n        }\n      } else {\n        red = node.C;\n        node = next;\n      }\n      if (node) node.U = parent;\n      if (red) return;\n      if (node && node.C) {\n        node.C = false;\n        return;\n      }\n      do {\n        if (node === this._) break;\n        if (node === parent.L) {\n          sibling = parent.R;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            sibling = parent.R;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.R || !sibling.R.C) {\n              sibling.L.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateRight(this, sibling);\n              sibling = parent.R;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.R.C = false;\n            d3_geom_voronoiRedBlackRotateLeft(this, parent);\n            node = this._;\n            break;\n          }\n        } else {\n          sibling = parent.L;\n          if (sibling.C) {\n            sibling.C = false;\n            parent.C = true;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            sibling = parent.L;\n          }\n          if (sibling.L && sibling.L.C || sibling.R && sibling.R.C) {\n            if (!sibling.L || !sibling.L.C) {\n              sibling.R.C = false;\n              sibling.C = true;\n              d3_geom_voronoiRedBlackRotateLeft(this, sibling);\n              sibling = parent.L;\n            }\n            sibling.C = parent.C;\n            parent.C = sibling.L.C = false;\n            d3_geom_voronoiRedBlackRotateRight(this, parent);\n            node = this._;\n            break;\n          }\n        }\n        sibling.C = true;\n        node = parent;\n        parent = parent.U;\n      } while (!node.C);\n      if (node) node.C = false;\n    }\n  };\n  function d3_geom_voronoiRedBlackRotateLeft(tree, node) {\n    var p = node, q = node.R, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.R = q.L;\n    if (p.R) p.R.U = p;\n    q.L = p;\n  }\n  function d3_geom_voronoiRedBlackRotateRight(tree, node) {\n    var p = node, q = node.L, parent = p.U;\n    if (parent) {\n      if (parent.L === p) parent.L = q; else parent.R = q;\n    } else {\n      tree._ = q;\n    }\n    q.U = parent;\n    p.U = q;\n    p.L = q.R;\n    if (p.L) p.L.U = p;\n    q.R = p;\n  }\n  function d3_geom_voronoiRedBlackFirst(node) {\n    while (node.L) node = node.L;\n    return node;\n  }\n  function d3_geom_voronoi(sites, bbox) {\n    var site = sites.sort(d3_geom_voronoiVertexOrder).pop(), x0, y0, circle;\n    d3_geom_voronoiEdges = [];\n    d3_geom_voronoiCells = new Array(sites.length);\n    d3_geom_voronoiBeaches = new d3_geom_voronoiRedBlackTree();\n    d3_geom_voronoiCircles = new d3_geom_voronoiRedBlackTree();\n    while (true) {\n      circle = d3_geom_voronoiFirstCircle;\n      if (site && (!circle || site.y < circle.y || site.y === circle.y && site.x < circle.x)) {\n        if (site.x !== x0 || site.y !== y0) {\n          d3_geom_voronoiCells[site.i] = new d3_geom_voronoiCell(site);\n          d3_geom_voronoiAddBeach(site);\n          x0 = site.x, y0 = site.y;\n        }\n        site = sites.pop();\n      } else if (circle) {\n        d3_geom_voronoiRemoveBeach(circle.arc);\n      } else {\n        break;\n      }\n    }\n    if (bbox) d3_geom_voronoiClipEdges(bbox), d3_geom_voronoiCloseCells(bbox);\n    var diagram = {\n      cells: d3_geom_voronoiCells,\n      edges: d3_geom_voronoiEdges\n    };\n    d3_geom_voronoiBeaches = d3_geom_voronoiCircles = d3_geom_voronoiEdges = d3_geom_voronoiCells = null;\n    return diagram;\n  }\n  function d3_geom_voronoiVertexOrder(a, b) {\n    return b.y - a.y || b.x - a.x;\n  }\n  d3.geom.voronoi = function(points) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, fx = x, fy = y, clipExtent = d3_geom_voronoiClipExtent;\n    if (points) return voronoi(points);\n    function voronoi(data) {\n      var polygons = new Array(data.length), x0 = clipExtent[0][0], y0 = clipExtent[0][1], x1 = clipExtent[1][0], y1 = clipExtent[1][1];\n      d3_geom_voronoi(sites(data), clipExtent).cells.forEach(function(cell, i) {\n        var edges = cell.edges, site = cell.site, polygon = polygons[i] = edges.length ? edges.map(function(e) {\n          var s = e.start();\n          return [ s.x, s.y ];\n        }) : site.x >= x0 && site.x <= x1 && site.y >= y0 && site.y <= y1 ? [ [ x0, y1 ], [ x1, y1 ], [ x1, y0 ], [ x0, y0 ] ] : [];\n        polygon.point = data[i];\n      });\n      return polygons;\n    }\n    function sites(data) {\n      return data.map(function(d, i) {\n        return {\n          x: Math.round(fx(d, i) / ε) * ε,\n          y: Math.round(fy(d, i) / ε) * ε,\n          i: i\n        };\n      });\n    }\n    voronoi.links = function(data) {\n      return d3_geom_voronoi(sites(data)).edges.filter(function(edge) {\n        return edge.l && edge.r;\n      }).map(function(edge) {\n        return {\n          source: data[edge.l.i],\n          target: data[edge.r.i]\n        };\n      });\n    };\n    voronoi.triangles = function(data) {\n      var triangles = [];\n      d3_geom_voronoi(sites(data)).cells.forEach(function(cell, i) {\n        var site = cell.site, edges = cell.edges.sort(d3_geom_voronoiHalfEdgeOrder), j = -1, m = edges.length, e0, s0, e1 = edges[m - 1].edge, s1 = e1.l === site ? e1.r : e1.l;\n        while (++j < m) {\n          e0 = e1;\n          s0 = s1;\n          e1 = edges[j].edge;\n          s1 = e1.l === site ? e1.r : e1.l;\n          if (i < s0.i && i < s1.i && d3_geom_voronoiTriangleArea(site, s0, s1) < 0) {\n            triangles.push([ data[i], data[s0.i], data[s1.i] ]);\n          }\n        }\n      });\n      return triangles;\n    };\n    voronoi.x = function(_) {\n      return arguments.length ? (fx = d3_functor(x = _), voronoi) : x;\n    };\n    voronoi.y = function(_) {\n      return arguments.length ? (fy = d3_functor(y = _), voronoi) : y;\n    };\n    voronoi.clipExtent = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent;\n      clipExtent = _ == null ? d3_geom_voronoiClipExtent : _;\n      return voronoi;\n    };\n    voronoi.size = function(_) {\n      if (!arguments.length) return clipExtent === d3_geom_voronoiClipExtent ? null : clipExtent && clipExtent[1];\n      return voronoi.clipExtent(_ && [ [ 0, 0 ], _ ]);\n    };\n    return voronoi;\n  };\n  var d3_geom_voronoiClipExtent = [ [ -1e6, -1e6 ], [ 1e6, 1e6 ] ];\n  function d3_geom_voronoiTriangleArea(a, b, c) {\n    return (a.x - c.x) * (b.y - a.y) - (a.x - b.x) * (c.y - a.y);\n  }\n  d3.geom.delaunay = function(vertices) {\n    return d3.geom.voronoi().triangles(vertices);\n  };\n  d3.geom.quadtree = function(points, x1, y1, x2, y2) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, compat;\n    if (compat = arguments.length) {\n      x = d3_geom_quadtreeCompatX;\n      y = d3_geom_quadtreeCompatY;\n      if (compat === 3) {\n        y2 = y1;\n        x2 = x1;\n        y1 = x1 = 0;\n      }\n      return quadtree(points);\n    }\n    function quadtree(data) {\n      var d, fx = d3_functor(x), fy = d3_functor(y), xs, ys, i, n, x1_, y1_, x2_, y2_;\n      if (x1 != null) {\n        x1_ = x1, y1_ = y1, x2_ = x2, y2_ = y2;\n      } else {\n        x2_ = y2_ = -(x1_ = y1_ = Infinity);\n        xs = [], ys = [];\n        n = data.length;\n        if (compat) for (i = 0; i < n; ++i) {\n          d = data[i];\n          if (d.x < x1_) x1_ = d.x;\n          if (d.y < y1_) y1_ = d.y;\n          if (d.x > x2_) x2_ = d.x;\n          if (d.y > y2_) y2_ = d.y;\n          xs.push(d.x);\n          ys.push(d.y);\n        } else for (i = 0; i < n; ++i) {\n          var x_ = +fx(d = data[i], i), y_ = +fy(d, i);\n          if (x_ < x1_) x1_ = x_;\n          if (y_ < y1_) y1_ = y_;\n          if (x_ > x2_) x2_ = x_;\n          if (y_ > y2_) y2_ = y_;\n          xs.push(x_);\n          ys.push(y_);\n        }\n      }\n      var dx = x2_ - x1_, dy = y2_ - y1_;\n      if (dx > dy) y2_ = y1_ + dx; else x2_ = x1_ + dy;\n      function insert(n, d, x, y, x1, y1, x2, y2) {\n        if (isNaN(x) || isNaN(y)) return;\n        if (n.leaf) {\n          var nx = n.x, ny = n.y;\n          if (nx != null) {\n            if (abs(nx - x) + abs(ny - y) < .01) {\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            } else {\n              var nPoint = n.point;\n              n.x = n.y = n.point = null;\n              insertChild(n, nPoint, nx, ny, x1, y1, x2, y2);\n              insertChild(n, d, x, y, x1, y1, x2, y2);\n            }\n          } else {\n            n.x = x, n.y = y, n.point = d;\n          }\n        } else {\n          insertChild(n, d, x, y, x1, y1, x2, y2);\n        }\n      }\n      function insertChild(n, d, x, y, x1, y1, x2, y2) {\n        var xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym, i = below << 1 | right;\n        n.leaf = false;\n        n = n.nodes[i] || (n.nodes[i] = d3_geom_quadtreeNode());\n        if (right) x1 = xm; else x2 = xm;\n        if (below) y1 = ym; else y2 = ym;\n        insert(n, d, x, y, x1, y1, x2, y2);\n      }\n      var root = d3_geom_quadtreeNode();\n      root.add = function(d) {\n        insert(root, d, +fx(d, ++i), +fy(d, i), x1_, y1_, x2_, y2_);\n      };\n      root.visit = function(f) {\n        d3_geom_quadtreeVisit(f, root, x1_, y1_, x2_, y2_);\n      };\n      root.find = function(point) {\n        return d3_geom_quadtreeFind(root, point[0], point[1], x1_, y1_, x2_, y2_);\n      };\n      i = -1;\n      if (x1 == null) {\n        while (++i < n) {\n          insert(root, data[i], xs[i], ys[i], x1_, y1_, x2_, y2_);\n        }\n        --i;\n      } else data.forEach(root.add);\n      xs = ys = data = d = null;\n      return root;\n    }\n    quadtree.x = function(_) {\n      return arguments.length ? (x = _, quadtree) : x;\n    };\n    quadtree.y = function(_) {\n      return arguments.length ? (y = _, quadtree) : y;\n    };\n    quadtree.extent = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ [ x1, y1 ], [ x2, y2 ] ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = +_[0][0], y1 = +_[0][1], x2 = +_[1][0], \n      y2 = +_[1][1];\n      return quadtree;\n    };\n    quadtree.size = function(_) {\n      if (!arguments.length) return x1 == null ? null : [ x2 - x1, y2 - y1 ];\n      if (_ == null) x1 = y1 = x2 = y2 = null; else x1 = y1 = 0, x2 = +_[0], y2 = +_[1];\n      return quadtree;\n    };\n    return quadtree;\n  };\n  function d3_geom_quadtreeCompatX(d) {\n    return d.x;\n  }\n  function d3_geom_quadtreeCompatY(d) {\n    return d.y;\n  }\n  function d3_geom_quadtreeNode() {\n    return {\n      leaf: true,\n      nodes: [],\n      point: null,\n      x: null,\n      y: null\n    };\n  }\n  function d3_geom_quadtreeVisit(f, node, x1, y1, x2, y2) {\n    if (!f(node, x1, y1, x2, y2)) {\n      var sx = (x1 + x2) * .5, sy = (y1 + y2) * .5, children = node.nodes;\n      if (children[0]) d3_geom_quadtreeVisit(f, children[0], x1, y1, sx, sy);\n      if (children[1]) d3_geom_quadtreeVisit(f, children[1], sx, y1, x2, sy);\n      if (children[2]) d3_geom_quadtreeVisit(f, children[2], x1, sy, sx, y2);\n      if (children[3]) d3_geom_quadtreeVisit(f, children[3], sx, sy, x2, y2);\n    }\n  }\n  function d3_geom_quadtreeFind(root, x, y, x0, y0, x3, y3) {\n    var minDistance2 = Infinity, closestPoint;\n    (function find(node, x1, y1, x2, y2) {\n      if (x1 > x3 || y1 > y3 || x2 < x0 || y2 < y0) return;\n      if (point = node.point) {\n        var point, dx = x - node.x, dy = y - node.y, distance2 = dx * dx + dy * dy;\n        if (distance2 < minDistance2) {\n          var distance = Math.sqrt(minDistance2 = distance2);\n          x0 = x - distance, y0 = y - distance;\n          x3 = x + distance, y3 = y + distance;\n          closestPoint = point;\n        }\n      }\n      var children = node.nodes, xm = (x1 + x2) * .5, ym = (y1 + y2) * .5, right = x >= xm, below = y >= ym;\n      for (var i = below << 1 | right, j = i + 4; i < j; ++i) {\n        if (node = children[i & 3]) switch (i & 3) {\n         case 0:\n          find(node, x1, y1, xm, ym);\n          break;\n\n         case 1:\n          find(node, xm, y1, x2, ym);\n          break;\n\n         case 2:\n          find(node, x1, ym, xm, y2);\n          break;\n\n         case 3:\n          find(node, xm, ym, x2, y2);\n          break;\n        }\n      }\n    })(root, x0, y0, x3, y3);\n    return closestPoint;\n  }\n  d3.interpolateRgb = d3_interpolateRgb;\n  function d3_interpolateRgb(a, b) {\n    a = d3.rgb(a);\n    b = d3.rgb(b);\n    var ar = a.r, ag = a.g, ab = a.b, br = b.r - ar, bg = b.g - ag, bb = b.b - ab;\n    return function(t) {\n      return \"#\" + d3_rgb_hex(Math.round(ar + br * t)) + d3_rgb_hex(Math.round(ag + bg * t)) + d3_rgb_hex(Math.round(ab + bb * t));\n    };\n  }\n  d3.interpolateObject = d3_interpolateObject;\n  function d3_interpolateObject(a, b) {\n    var i = {}, c = {}, k;\n    for (k in a) {\n      if (k in b) {\n        i[k] = d3_interpolate(a[k], b[k]);\n      } else {\n        c[k] = a[k];\n      }\n    }\n    for (k in b) {\n      if (!(k in a)) {\n        c[k] = b[k];\n      }\n    }\n    return function(t) {\n      for (k in i) c[k] = i[k](t);\n      return c;\n    };\n  }\n  d3.interpolateNumber = d3_interpolateNumber;\n  function d3_interpolateNumber(a, b) {\n    a = +a, b = +b;\n    return function(t) {\n      return a * (1 - t) + b * t;\n    };\n  }\n  d3.interpolateString = d3_interpolateString;\n  function d3_interpolateString(a, b) {\n    var bi = d3_interpolate_numberA.lastIndex = d3_interpolate_numberB.lastIndex = 0, am, bm, bs, i = -1, s = [], q = [];\n    a = a + \"\", b = b + \"\";\n    while ((am = d3_interpolate_numberA.exec(a)) && (bm = d3_interpolate_numberB.exec(b))) {\n      if ((bs = bm.index) > bi) {\n        bs = b.slice(bi, bs);\n        if (s[i]) s[i] += bs; else s[++i] = bs;\n      }\n      if ((am = am[0]) === (bm = bm[0])) {\n        if (s[i]) s[i] += bm; else s[++i] = bm;\n      } else {\n        s[++i] = null;\n        q.push({\n          i: i,\n          x: d3_interpolateNumber(am, bm)\n        });\n      }\n      bi = d3_interpolate_numberB.lastIndex;\n    }\n    if (bi < b.length) {\n      bs = b.slice(bi);\n      if (s[i]) s[i] += bs; else s[++i] = bs;\n    }\n    return s.length < 2 ? q[0] ? (b = q[0].x, function(t) {\n      return b(t) + \"\";\n    }) : function() {\n      return b;\n    } : (b = q.length, function(t) {\n      for (var i = 0, o; i < b; ++i) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    });\n  }\n  var d3_interpolate_numberA = /[-+]?(?:\\d+\\.?\\d*|\\.?\\d+)(?:[eE][-+]?\\d+)?/g, d3_interpolate_numberB = new RegExp(d3_interpolate_numberA.source, \"g\");\n  d3.interpolate = d3_interpolate;\n  function d3_interpolate(a, b) {\n    var i = d3.interpolators.length, f;\n    while (--i >= 0 && !(f = d3.interpolators[i](a, b))) ;\n    return f;\n  }\n  d3.interpolators = [ function(a, b) {\n    var t = typeof b;\n    return (t === \"string\" ? d3_rgb_names.has(b.toLowerCase()) || /^(#|rgb\\(|hsl\\()/i.test(b) ? d3_interpolateRgb : d3_interpolateString : b instanceof d3_color ? d3_interpolateRgb : Array.isArray(b) ? d3_interpolateArray : t === \"object\" && isNaN(b) ? d3_interpolateObject : d3_interpolateNumber)(a, b);\n  } ];\n  d3.interpolateArray = d3_interpolateArray;\n  function d3_interpolateArray(a, b) {\n    var x = [], c = [], na = a.length, nb = b.length, n0 = Math.min(a.length, b.length), i;\n    for (i = 0; i < n0; ++i) x.push(d3_interpolate(a[i], b[i]));\n    for (;i < na; ++i) c[i] = a[i];\n    for (;i < nb; ++i) c[i] = b[i];\n    return function(t) {\n      for (i = 0; i < n0; ++i) c[i] = x[i](t);\n      return c;\n    };\n  }\n  var d3_ease_default = function() {\n    return d3_identity;\n  };\n  var d3_ease = d3.map({\n    linear: d3_ease_default,\n    poly: d3_ease_poly,\n    quad: function() {\n      return d3_ease_quad;\n    },\n    cubic: function() {\n      return d3_ease_cubic;\n    },\n    sin: function() {\n      return d3_ease_sin;\n    },\n    exp: function() {\n      return d3_ease_exp;\n    },\n    circle: function() {\n      return d3_ease_circle;\n    },\n    elastic: d3_ease_elastic,\n    back: d3_ease_back,\n    bounce: function() {\n      return d3_ease_bounce;\n    }\n  });\n  var d3_ease_mode = d3.map({\n    \"in\": d3_identity,\n    out: d3_ease_reverse,\n    \"in-out\": d3_ease_reflect,\n    \"out-in\": function(f) {\n      return d3_ease_reflect(d3_ease_reverse(f));\n    }\n  });\n  d3.ease = function(name) {\n    var i = name.indexOf(\"-\"), t = i >= 0 ? name.slice(0, i) : name, m = i >= 0 ? name.slice(i + 1) : \"in\";\n    t = d3_ease.get(t) || d3_ease_default;\n    m = d3_ease_mode.get(m) || d3_identity;\n    return d3_ease_clamp(m(t.apply(null, d3_arraySlice.call(arguments, 1))));\n  };\n  function d3_ease_clamp(f) {\n    return function(t) {\n      return t <= 0 ? 0 : t >= 1 ? 1 : f(t);\n    };\n  }\n  function d3_ease_reverse(f) {\n    return function(t) {\n      return 1 - f(1 - t);\n    };\n  }\n  function d3_ease_reflect(f) {\n    return function(t) {\n      return .5 * (t < .5 ? f(2 * t) : 2 - f(2 - 2 * t));\n    };\n  }\n  function d3_ease_quad(t) {\n    return t * t;\n  }\n  function d3_ease_cubic(t) {\n    return t * t * t;\n  }\n  function d3_ease_cubicInOut(t) {\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n    var t2 = t * t, t3 = t2 * t;\n    return 4 * (t < .5 ? t3 : 3 * (t - t2) + t3 - .75);\n  }\n  function d3_ease_poly(e) {\n    return function(t) {\n      return Math.pow(t, e);\n    };\n  }\n  function d3_ease_sin(t) {\n    return 1 - Math.cos(t * halfπ);\n  }\n  function d3_ease_exp(t) {\n    return Math.pow(2, 10 * (t - 1));\n  }\n  function d3_ease_circle(t) {\n    return 1 - Math.sqrt(1 - t * t);\n  }\n  function d3_ease_elastic(a, p) {\n    var s;\n    if (arguments.length < 2) p = .45;\n    if (arguments.length) s = p / τ * Math.asin(1 / a); else a = 1, s = p / 4;\n    return function(t) {\n      return 1 + a * Math.pow(2, -10 * t) * Math.sin((t - s) * τ / p);\n    };\n  }\n  function d3_ease_back(s) {\n    if (!s) s = 1.70158;\n    return function(t) {\n      return t * t * ((s + 1) * t - s);\n    };\n  }\n  function d3_ease_bounce(t) {\n    return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375;\n  }\n  d3.interpolateHcl = d3_interpolateHcl;\n  function d3_interpolateHcl(a, b) {\n    a = d3.hcl(a);\n    b = d3.hcl(b);\n    var ah = a.h, ac = a.c, al = a.l, bh = b.h - ah, bc = b.c - ac, bl = b.l - al;\n    if (isNaN(bc)) bc = 0, ac = isNaN(ac) ? b.c : ac;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hcl_lab(ah + bh * t, ac + bc * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateHsl = d3_interpolateHsl;\n  function d3_interpolateHsl(a, b) {\n    a = d3.hsl(a);\n    b = d3.hsl(b);\n    var ah = a.h, as = a.s, al = a.l, bh = b.h - ah, bs = b.s - as, bl = b.l - al;\n    if (isNaN(bs)) bs = 0, as = isNaN(as) ? b.s : as;\n    if (isNaN(bh)) bh = 0, ah = isNaN(ah) ? b.h : ah; else if (bh > 180) bh -= 360; else if (bh < -180) bh += 360;\n    return function(t) {\n      return d3_hsl_rgb(ah + bh * t, as + bs * t, al + bl * t) + \"\";\n    };\n  }\n  d3.interpolateLab = d3_interpolateLab;\n  function d3_interpolateLab(a, b) {\n    a = d3.lab(a);\n    b = d3.lab(b);\n    var al = a.l, aa = a.a, ab = a.b, bl = b.l - al, ba = b.a - aa, bb = b.b - ab;\n    return function(t) {\n      return d3_lab_rgb(al + bl * t, aa + ba * t, ab + bb * t) + \"\";\n    };\n  }\n  d3.interpolateRound = d3_interpolateRound;\n  function d3_interpolateRound(a, b) {\n    b -= a;\n    return function(t) {\n      return Math.round(a + b * t);\n    };\n  }\n  d3.transform = function(string) {\n    var g = d3_document.createElementNS(d3.ns.prefix.svg, \"g\");\n    return (d3.transform = function(string) {\n      if (string != null) {\n        g.setAttribute(\"transform\", string);\n        var t = g.transform.baseVal.consolidate();\n      }\n      return new d3_transform(t ? t.matrix : d3_transformIdentity);\n    })(string);\n  };\n  function d3_transform(m) {\n    var r0 = [ m.a, m.b ], r1 = [ m.c, m.d ], kx = d3_transformNormalize(r0), kz = d3_transformDot(r0, r1), ky = d3_transformNormalize(d3_transformCombine(r1, r0, -kz)) || 0;\n    if (r0[0] * r1[1] < r1[0] * r0[1]) {\n      r0[0] *= -1;\n      r0[1] *= -1;\n      kx *= -1;\n      kz *= -1;\n    }\n    this.rotate = (kx ? Math.atan2(r0[1], r0[0]) : Math.atan2(-r1[0], r1[1])) * d3_degrees;\n    this.translate = [ m.e, m.f ];\n    this.scale = [ kx, ky ];\n    this.skew = ky ? Math.atan2(kz, ky) * d3_degrees : 0;\n  }\n  d3_transform.prototype.toString = function() {\n    return \"translate(\" + this.translate + \")rotate(\" + this.rotate + \")skewX(\" + this.skew + \")scale(\" + this.scale + \")\";\n  };\n  function d3_transformDot(a, b) {\n    return a[0] * b[0] + a[1] * b[1];\n  }\n  function d3_transformNormalize(a) {\n    var k = Math.sqrt(d3_transformDot(a, a));\n    if (k) {\n      a[0] /= k;\n      a[1] /= k;\n    }\n    return k;\n  }\n  function d3_transformCombine(a, b, k) {\n    a[0] += k * b[0];\n    a[1] += k * b[1];\n    return a;\n  }\n  var d3_transformIdentity = {\n    a: 1,\n    b: 0,\n    c: 0,\n    d: 1,\n    e: 0,\n    f: 0\n  };\n  d3.interpolateTransform = d3_interpolateTransform;\n  function d3_interpolateTransformPop(s) {\n    return s.length ? s.pop() + \",\" : \"\";\n  }\n  function d3_interpolateTranslate(ta, tb, s, q) {\n    if (ta[0] !== tb[0] || ta[1] !== tb[1]) {\n      var i = s.push(\"translate(\", null, \",\", null, \")\");\n      q.push({\n        i: i - 4,\n        x: d3_interpolateNumber(ta[0], tb[0])\n      }, {\n        i: i - 2,\n        x: d3_interpolateNumber(ta[1], tb[1])\n      });\n    } else if (tb[0] || tb[1]) {\n      s.push(\"translate(\" + tb + \")\");\n    }\n  }\n  function d3_interpolateRotate(ra, rb, s, q) {\n    if (ra !== rb) {\n      if (ra - rb > 180) rb += 360; else if (rb - ra > 180) ra += 360;\n      q.push({\n        i: s.push(d3_interpolateTransformPop(s) + \"rotate(\", null, \")\") - 2,\n        x: d3_interpolateNumber(ra, rb)\n      });\n    } else if (rb) {\n      s.push(d3_interpolateTransformPop(s) + \"rotate(\" + rb + \")\");\n    }\n  }\n  function d3_interpolateSkew(wa, wb, s, q) {\n    if (wa !== wb) {\n      q.push({\n        i: s.push(d3_interpolateTransformPop(s) + \"skewX(\", null, \")\") - 2,\n        x: d3_interpolateNumber(wa, wb)\n      });\n    } else if (wb) {\n      s.push(d3_interpolateTransformPop(s) + \"skewX(\" + wb + \")\");\n    }\n  }\n  function d3_interpolateScale(ka, kb, s, q) {\n    if (ka[0] !== kb[0] || ka[1] !== kb[1]) {\n      var i = s.push(d3_interpolateTransformPop(s) + \"scale(\", null, \",\", null, \")\");\n      q.push({\n        i: i - 4,\n        x: d3_interpolateNumber(ka[0], kb[0])\n      }, {\n        i: i - 2,\n        x: d3_interpolateNumber(ka[1], kb[1])\n      });\n    } else if (kb[0] !== 1 || kb[1] !== 1) {\n      s.push(d3_interpolateTransformPop(s) + \"scale(\" + kb + \")\");\n    }\n  }\n  function d3_interpolateTransform(a, b) {\n    var s = [], q = [];\n    a = d3.transform(a), b = d3.transform(b);\n    d3_interpolateTranslate(a.translate, b.translate, s, q);\n    d3_interpolateRotate(a.rotate, b.rotate, s, q);\n    d3_interpolateSkew(a.skew, b.skew, s, q);\n    d3_interpolateScale(a.scale, b.scale, s, q);\n    a = b = null;\n    return function(t) {\n      var i = -1, n = q.length, o;\n      while (++i < n) s[(o = q[i]).i] = o.x(t);\n      return s.join(\"\");\n    };\n  }\n  function d3_uninterpolateNumber(a, b) {\n    b = (b -= a = +a) || 1 / b;\n    return function(x) {\n      return (x - a) / b;\n    };\n  }\n  function d3_uninterpolateClamp(a, b) {\n    b = (b -= a = +a) || 1 / b;\n    return function(x) {\n      return Math.max(0, Math.min(1, (x - a) / b));\n    };\n  }\n  d3.layout = {};\n  d3.layout.bundle = function() {\n    return function(links) {\n      var paths = [], i = -1, n = links.length;\n      while (++i < n) paths.push(d3_layout_bundlePath(links[i]));\n      return paths;\n    };\n  };\n  function d3_layout_bundlePath(link) {\n    var start = link.source, end = link.target, lca = d3_layout_bundleLeastCommonAncestor(start, end), points = [ start ];\n    while (start !== lca) {\n      start = start.parent;\n      points.push(start);\n    }\n    var k = points.length;\n    while (end !== lca) {\n      points.splice(k, 0, end);\n      end = end.parent;\n    }\n    return points;\n  }\n  function d3_layout_bundleAncestors(node) {\n    var ancestors = [], parent = node.parent;\n    while (parent != null) {\n      ancestors.push(node);\n      node = parent;\n      parent = parent.parent;\n    }\n    ancestors.push(node);\n    return ancestors;\n  }\n  function d3_layout_bundleLeastCommonAncestor(a, b) {\n    if (a === b) return a;\n    var aNodes = d3_layout_bundleAncestors(a), bNodes = d3_layout_bundleAncestors(b), aNode = aNodes.pop(), bNode = bNodes.pop(), sharedNode = null;\n    while (aNode === bNode) {\n      sharedNode = aNode;\n      aNode = aNodes.pop();\n      bNode = bNodes.pop();\n    }\n    return sharedNode;\n  }\n  d3.layout.chord = function() {\n    var chord = {}, chords, groups, matrix, n, padding = 0, sortGroups, sortSubgroups, sortChords;\n    function relayout() {\n      var subgroups = {}, groupSums = [], groupIndex = d3.range(n), subgroupIndex = [], k, x, x0, i, j;\n      chords = [];\n      groups = [];\n      k = 0, i = -1;\n      while (++i < n) {\n        x = 0, j = -1;\n        while (++j < n) {\n          x += matrix[i][j];\n        }\n        groupSums.push(x);\n        subgroupIndex.push(d3.range(n));\n        k += x;\n      }\n      if (sortGroups) {\n        groupIndex.sort(function(a, b) {\n          return sortGroups(groupSums[a], groupSums[b]);\n        });\n      }\n      if (sortSubgroups) {\n        subgroupIndex.forEach(function(d, i) {\n          d.sort(function(a, b) {\n            return sortSubgroups(matrix[i][a], matrix[i][b]);\n          });\n        });\n      }\n      k = (τ - padding * n) / k;\n      x = 0, i = -1;\n      while (++i < n) {\n        x0 = x, j = -1;\n        while (++j < n) {\n          var di = groupIndex[i], dj = subgroupIndex[di][j], v = matrix[di][dj], a0 = x, a1 = x += v * k;\n          subgroups[di + \"-\" + dj] = {\n            index: di,\n            subindex: dj,\n            startAngle: a0,\n            endAngle: a1,\n            value: v\n          };\n        }\n        groups[di] = {\n          index: di,\n          startAngle: x0,\n          endAngle: x,\n          value: groupSums[di]\n        };\n        x += padding;\n      }\n      i = -1;\n      while (++i < n) {\n        j = i - 1;\n        while (++j < n) {\n          var source = subgroups[i + \"-\" + j], target = subgroups[j + \"-\" + i];\n          if (source.value || target.value) {\n            chords.push(source.value < target.value ? {\n              source: target,\n              target: source\n            } : {\n              source: source,\n              target: target\n            });\n          }\n        }\n      }\n      if (sortChords) resort();\n    }\n    function resort() {\n      chords.sort(function(a, b) {\n        return sortChords((a.source.value + a.target.value) / 2, (b.source.value + b.target.value) / 2);\n      });\n    }\n    chord.matrix = function(x) {\n      if (!arguments.length) return matrix;\n      n = (matrix = x) && matrix.length;\n      chords = groups = null;\n      return chord;\n    };\n    chord.padding = function(x) {\n      if (!arguments.length) return padding;\n      padding = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortGroups = function(x) {\n      if (!arguments.length) return sortGroups;\n      sortGroups = x;\n      chords = groups = null;\n      return chord;\n    };\n    chord.sortSubgroups = function(x) {\n      if (!arguments.length) return sortSubgroups;\n      sortSubgroups = x;\n      chords = null;\n      return chord;\n    };\n    chord.sortChords = function(x) {\n      if (!arguments.length) return sortChords;\n      sortChords = x;\n      if (chords) resort();\n      return chord;\n    };\n    chord.chords = function() {\n      if (!chords) relayout();\n      return chords;\n    };\n    chord.groups = function() {\n      if (!groups) relayout();\n      return groups;\n    };\n    return chord;\n  };\n  d3.layout.force = function() {\n    var force = {}, event = d3.dispatch(\"start\", \"tick\", \"end\"), timer, size = [ 1, 1 ], drag, alpha, friction = .9, linkDistance = d3_layout_forceLinkDistance, linkStrength = d3_layout_forceLinkStrength, charge = -30, chargeDistance2 = d3_layout_forceChargeDistance2, gravity = .1, theta2 = .64, nodes = [], links = [], distances, strengths, charges;\n    function repulse(node) {\n      return function(quad, x1, _, x2) {\n        if (quad.point !== node) {\n          var dx = quad.cx - node.x, dy = quad.cy - node.y, dw = x2 - x1, dn = dx * dx + dy * dy;\n          if (dw * dw / theta2 < dn) {\n            if (dn < chargeDistance2) {\n              var k = quad.charge / dn;\n              node.px -= dx * k;\n              node.py -= dy * k;\n            }\n            return true;\n          }\n          if (quad.point && dn && dn < chargeDistance2) {\n            var k = quad.pointCharge / dn;\n            node.px -= dx * k;\n            node.py -= dy * k;\n          }\n        }\n        return !quad.charge;\n      };\n    }\n    force.tick = function() {\n      if ((alpha *= .99) < .005) {\n        timer = null;\n        event.end({\n          type: \"end\",\n          alpha: alpha = 0\n        });\n        return true;\n      }\n      var n = nodes.length, m = links.length, q, i, o, s, t, l, k, x, y;\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        s = o.source;\n        t = o.target;\n        x = t.x - s.x;\n        y = t.y - s.y;\n        if (l = x * x + y * y) {\n          l = alpha * strengths[i] * ((l = Math.sqrt(l)) - distances[i]) / l;\n          x *= l;\n          y *= l;\n          t.x -= x * (k = s.weight + t.weight ? s.weight / (s.weight + t.weight) : .5);\n          t.y -= y * k;\n          s.x += x * (k = 1 - k);\n          s.y += y * k;\n        }\n      }\n      if (k = alpha * gravity) {\n        x = size[0] / 2;\n        y = size[1] / 2;\n        i = -1;\n        if (k) while (++i < n) {\n          o = nodes[i];\n          o.x += (x - o.x) * k;\n          o.y += (y - o.y) * k;\n        }\n      }\n      if (charge) {\n        d3_layout_forceAccumulate(q = d3.geom.quadtree(nodes), alpha, charges);\n        i = -1;\n        while (++i < n) {\n          if (!(o = nodes[i]).fixed) {\n            q.visit(repulse(o));\n          }\n        }\n      }\n      i = -1;\n      while (++i < n) {\n        o = nodes[i];\n        if (o.fixed) {\n          o.x = o.px;\n          o.y = o.py;\n        } else {\n          o.x -= (o.px - (o.px = o.x)) * friction;\n          o.y -= (o.py - (o.py = o.y)) * friction;\n        }\n      }\n      event.tick({\n        type: \"tick\",\n        alpha: alpha\n      });\n    };\n    force.nodes = function(x) {\n      if (!arguments.length) return nodes;\n      nodes = x;\n      return force;\n    };\n    force.links = function(x) {\n      if (!arguments.length) return links;\n      links = x;\n      return force;\n    };\n    force.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return force;\n    };\n    force.linkDistance = function(x) {\n      if (!arguments.length) return linkDistance;\n      linkDistance = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.distance = force.linkDistance;\n    force.linkStrength = function(x) {\n      if (!arguments.length) return linkStrength;\n      linkStrength = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.friction = function(x) {\n      if (!arguments.length) return friction;\n      friction = +x;\n      return force;\n    };\n    force.charge = function(x) {\n      if (!arguments.length) return charge;\n      charge = typeof x === \"function\" ? x : +x;\n      return force;\n    };\n    force.chargeDistance = function(x) {\n      if (!arguments.length) return Math.sqrt(chargeDistance2);\n      chargeDistance2 = x * x;\n      return force;\n    };\n    force.gravity = function(x) {\n      if (!arguments.length) return gravity;\n      gravity = +x;\n      return force;\n    };\n    force.theta = function(x) {\n      if (!arguments.length) return Math.sqrt(theta2);\n      theta2 = x * x;\n      return force;\n    };\n    force.alpha = function(x) {\n      if (!arguments.length) return alpha;\n      x = +x;\n      if (alpha) {\n        if (x > 0) {\n          alpha = x;\n        } else {\n          timer.c = null, timer.t = NaN, timer = null;\n          event.end({\n            type: \"end\",\n            alpha: alpha = 0\n          });\n        }\n      } else if (x > 0) {\n        event.start({\n          type: \"start\",\n          alpha: alpha = x\n        });\n        timer = d3_timer(force.tick);\n      }\n      return force;\n    };\n    force.start = function() {\n      var i, n = nodes.length, m = links.length, w = size[0], h = size[1], neighbors, o;\n      for (i = 0; i < n; ++i) {\n        (o = nodes[i]).index = i;\n        o.weight = 0;\n      }\n      for (i = 0; i < m; ++i) {\n        o = links[i];\n        if (typeof o.source == \"number\") o.source = nodes[o.source];\n        if (typeof o.target == \"number\") o.target = nodes[o.target];\n        ++o.source.weight;\n        ++o.target.weight;\n      }\n      for (i = 0; i < n; ++i) {\n        o = nodes[i];\n        if (isNaN(o.x)) o.x = position(\"x\", w);\n        if (isNaN(o.y)) o.y = position(\"y\", h);\n        if (isNaN(o.px)) o.px = o.x;\n        if (isNaN(o.py)) o.py = o.y;\n      }\n      distances = [];\n      if (typeof linkDistance === \"function\") for (i = 0; i < m; ++i) distances[i] = +linkDistance.call(this, links[i], i); else for (i = 0; i < m; ++i) distances[i] = linkDistance;\n      strengths = [];\n      if (typeof linkStrength === \"function\") for (i = 0; i < m; ++i) strengths[i] = +linkStrength.call(this, links[i], i); else for (i = 0; i < m; ++i) strengths[i] = linkStrength;\n      charges = [];\n      if (typeof charge === \"function\") for (i = 0; i < n; ++i) charges[i] = +charge.call(this, nodes[i], i); else for (i = 0; i < n; ++i) charges[i] = charge;\n      function position(dimension, size) {\n        if (!neighbors) {\n          neighbors = new Array(n);\n          for (j = 0; j < n; ++j) {\n            neighbors[j] = [];\n          }\n          for (j = 0; j < m; ++j) {\n            var o = links[j];\n            neighbors[o.source.index].push(o.target);\n            neighbors[o.target.index].push(o.source);\n          }\n        }\n        var candidates = neighbors[i], j = -1, l = candidates.length, x;\n        while (++j < l) if (!isNaN(x = candidates[j][dimension])) return x;\n        return Math.random() * size;\n      }\n      return force.resume();\n    };\n    force.resume = function() {\n      return force.alpha(.1);\n    };\n    force.stop = function() {\n      return force.alpha(0);\n    };\n    force.drag = function() {\n      if (!drag) drag = d3.behavior.drag().origin(d3_identity).on(\"dragstart.force\", d3_layout_forceDragstart).on(\"drag.force\", dragmove).on(\"dragend.force\", d3_layout_forceDragend);\n      if (!arguments.length) return drag;\n      this.on(\"mouseover.force\", d3_layout_forceMouseover).on(\"mouseout.force\", d3_layout_forceMouseout).call(drag);\n    };\n    function dragmove(d) {\n      d.px = d3.event.x, d.py = d3.event.y;\n      force.resume();\n    }\n    return d3.rebind(force, event, \"on\");\n  };\n  function d3_layout_forceDragstart(d) {\n    d.fixed |= 2;\n  }\n  function d3_layout_forceDragend(d) {\n    d.fixed &= ~6;\n  }\n  function d3_layout_forceMouseover(d) {\n    d.fixed |= 4;\n    d.px = d.x, d.py = d.y;\n  }\n  function d3_layout_forceMouseout(d) {\n    d.fixed &= ~4;\n  }\n  function d3_layout_forceAccumulate(quad, alpha, charges) {\n    var cx = 0, cy = 0;\n    quad.charge = 0;\n    if (!quad.leaf) {\n      var nodes = quad.nodes, n = nodes.length, i = -1, c;\n      while (++i < n) {\n        c = nodes[i];\n        if (c == null) continue;\n        d3_layout_forceAccumulate(c, alpha, charges);\n        quad.charge += c.charge;\n        cx += c.charge * c.cx;\n        cy += c.charge * c.cy;\n      }\n    }\n    if (quad.point) {\n      if (!quad.leaf) {\n        quad.point.x += Math.random() - .5;\n        quad.point.y += Math.random() - .5;\n      }\n      var k = alpha * charges[quad.point.index];\n      quad.charge += quad.pointCharge = k;\n      cx += k * quad.point.x;\n      cy += k * quad.point.y;\n    }\n    quad.cx = cx / quad.charge;\n    quad.cy = cy / quad.charge;\n  }\n  var d3_layout_forceLinkDistance = 20, d3_layout_forceLinkStrength = 1, d3_layout_forceChargeDistance2 = Infinity;\n  d3.layout.hierarchy = function() {\n    var sort = d3_layout_hierarchySort, children = d3_layout_hierarchyChildren, value = d3_layout_hierarchyValue;\n    function hierarchy(root) {\n      var stack = [ root ], nodes = [], node;\n      root.depth = 0;\n      while ((node = stack.pop()) != null) {\n        nodes.push(node);\n        if ((childs = children.call(hierarchy, node, node.depth)) && (n = childs.length)) {\n          var n, childs, child;\n          while (--n >= 0) {\n            stack.push(child = childs[n]);\n            child.parent = node;\n            child.depth = node.depth + 1;\n          }\n          if (value) node.value = 0;\n          node.children = childs;\n        } else {\n          if (value) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          delete node.children;\n        }\n      }\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var childs, parent;\n        if (sort && (childs = node.children)) childs.sort(sort);\n        if (value && (parent = node.parent)) parent.value += node.value;\n      });\n      return nodes;\n    }\n    hierarchy.sort = function(x) {\n      if (!arguments.length) return sort;\n      sort = x;\n      return hierarchy;\n    };\n    hierarchy.children = function(x) {\n      if (!arguments.length) return children;\n      children = x;\n      return hierarchy;\n    };\n    hierarchy.value = function(x) {\n      if (!arguments.length) return value;\n      value = x;\n      return hierarchy;\n    };\n    hierarchy.revalue = function(root) {\n      if (value) {\n        d3_layout_hierarchyVisitBefore(root, function(node) {\n          if (node.children) node.value = 0;\n        });\n        d3_layout_hierarchyVisitAfter(root, function(node) {\n          var parent;\n          if (!node.children) node.value = +value.call(hierarchy, node, node.depth) || 0;\n          if (parent = node.parent) parent.value += node.value;\n        });\n      }\n      return root;\n    };\n    return hierarchy;\n  };\n  function d3_layout_hierarchyRebind(object, hierarchy) {\n    d3.rebind(object, hierarchy, \"sort\", \"children\", \"value\");\n    object.nodes = object;\n    object.links = d3_layout_hierarchyLinks;\n    return object;\n  }\n  function d3_layout_hierarchyVisitBefore(node, callback) {\n    var nodes = [ node ];\n    while ((node = nodes.pop()) != null) {\n      callback(node);\n      if ((children = node.children) && (n = children.length)) {\n        var n, children;\n        while (--n >= 0) nodes.push(children[n]);\n      }\n    }\n  }\n  function d3_layout_hierarchyVisitAfter(node, callback) {\n    var nodes = [ node ], nodes2 = [];\n    while ((node = nodes.pop()) != null) {\n      nodes2.push(node);\n      if ((children = node.children) && (n = children.length)) {\n        var i = -1, n, children;\n        while (++i < n) nodes.push(children[i]);\n      }\n    }\n    while ((node = nodes2.pop()) != null) {\n      callback(node);\n    }\n  }\n  function d3_layout_hierarchyChildren(d) {\n    return d.children;\n  }\n  function d3_layout_hierarchyValue(d) {\n    return d.value;\n  }\n  function d3_layout_hierarchySort(a, b) {\n    return b.value - a.value;\n  }\n  function d3_layout_hierarchyLinks(nodes) {\n    return d3.merge(nodes.map(function(parent) {\n      return (parent.children || []).map(function(child) {\n        return {\n          source: parent,\n          target: child\n        };\n      });\n    }));\n  }\n  d3.layout.partition = function() {\n    var hierarchy = d3.layout.hierarchy(), size = [ 1, 1 ];\n    function position(node, x, dx, dy) {\n      var children = node.children;\n      node.x = x;\n      node.y = node.depth * dy;\n      node.dx = dx;\n      node.dy = dy;\n      if (children && (n = children.length)) {\n        var i = -1, n, c, d;\n        dx = node.value ? dx / node.value : 0;\n        while (++i < n) {\n          position(c = children[i], x, d = c.value * dx, dy);\n          x += d;\n        }\n      }\n    }\n    function depth(node) {\n      var children = node.children, d = 0;\n      if (children && (n = children.length)) {\n        var i = -1, n;\n        while (++i < n) d = Math.max(d, depth(children[i]));\n      }\n      return 1 + d;\n    }\n    function partition(d, i) {\n      var nodes = hierarchy.call(this, d, i);\n      position(nodes[0], 0, size[0], size[1] / depth(nodes[0]));\n      return nodes;\n    }\n    partition.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return partition;\n    };\n    return d3_layout_hierarchyRebind(partition, hierarchy);\n  };\n  d3.layout.pie = function() {\n    var value = Number, sort = d3_layout_pieSortByValue, startAngle = 0, endAngle = τ, padAngle = 0;\n    function pie(data) {\n      var n = data.length, values = data.map(function(d, i) {\n        return +value.call(pie, d, i);\n      }), a = +(typeof startAngle === \"function\" ? startAngle.apply(this, arguments) : startAngle), da = (typeof endAngle === \"function\" ? endAngle.apply(this, arguments) : endAngle) - a, p = Math.min(Math.abs(da) / n, +(typeof padAngle === \"function\" ? padAngle.apply(this, arguments) : padAngle)), pa = p * (da < 0 ? -1 : 1), sum = d3.sum(values), k = sum ? (da - n * pa) / sum : 0, index = d3.range(n), arcs = [], v;\n      if (sort != null) index.sort(sort === d3_layout_pieSortByValue ? function(i, j) {\n        return values[j] - values[i];\n      } : function(i, j) {\n        return sort(data[i], data[j]);\n      });\n      index.forEach(function(i) {\n        arcs[i] = {\n          data: data[i],\n          value: v = values[i],\n          startAngle: a,\n          endAngle: a += v * k + pa,\n          padAngle: p\n        };\n      });\n      return arcs;\n    }\n    pie.value = function(_) {\n      if (!arguments.length) return value;\n      value = _;\n      return pie;\n    };\n    pie.sort = function(_) {\n      if (!arguments.length) return sort;\n      sort = _;\n      return pie;\n    };\n    pie.startAngle = function(_) {\n      if (!arguments.length) return startAngle;\n      startAngle = _;\n      return pie;\n    };\n    pie.endAngle = function(_) {\n      if (!arguments.length) return endAngle;\n      endAngle = _;\n      return pie;\n    };\n    pie.padAngle = function(_) {\n      if (!arguments.length) return padAngle;\n      padAngle = _;\n      return pie;\n    };\n    return pie;\n  };\n  var d3_layout_pieSortByValue = {};\n  d3.layout.stack = function() {\n    var values = d3_identity, order = d3_layout_stackOrderDefault, offset = d3_layout_stackOffsetZero, out = d3_layout_stackOut, x = d3_layout_stackX, y = d3_layout_stackY;\n    function stack(data, index) {\n      if (!(n = data.length)) return data;\n      var series = data.map(function(d, i) {\n        return values.call(stack, d, i);\n      });\n      var points = series.map(function(d) {\n        return d.map(function(v, i) {\n          return [ x.call(stack, v, i), y.call(stack, v, i) ];\n        });\n      });\n      var orders = order.call(stack, points, index);\n      series = d3.permute(series, orders);\n      points = d3.permute(points, orders);\n      var offsets = offset.call(stack, points, index);\n      var m = series[0].length, n, i, j, o;\n      for (j = 0; j < m; ++j) {\n        out.call(stack, series[0][j], o = offsets[j], points[0][j][1]);\n        for (i = 1; i < n; ++i) {\n          out.call(stack, series[i][j], o += points[i - 1][j][1], points[i][j][1]);\n        }\n      }\n      return data;\n    }\n    stack.values = function(x) {\n      if (!arguments.length) return values;\n      values = x;\n      return stack;\n    };\n    stack.order = function(x) {\n      if (!arguments.length) return order;\n      order = typeof x === \"function\" ? x : d3_layout_stackOrders.get(x) || d3_layout_stackOrderDefault;\n      return stack;\n    };\n    stack.offset = function(x) {\n      if (!arguments.length) return offset;\n      offset = typeof x === \"function\" ? x : d3_layout_stackOffsets.get(x) || d3_layout_stackOffsetZero;\n      return stack;\n    };\n    stack.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      return stack;\n    };\n    stack.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      return stack;\n    };\n    stack.out = function(z) {\n      if (!arguments.length) return out;\n      out = z;\n      return stack;\n    };\n    return stack;\n  };\n  function d3_layout_stackX(d) {\n    return d.x;\n  }\n  function d3_layout_stackY(d) {\n    return d.y;\n  }\n  function d3_layout_stackOut(d, y0, y) {\n    d.y0 = y0;\n    d.y = y;\n  }\n  var d3_layout_stackOrders = d3.map({\n    \"inside-out\": function(data) {\n      var n = data.length, i, j, max = data.map(d3_layout_stackMaxIndex), sums = data.map(d3_layout_stackReduceSum), index = d3.range(n).sort(function(a, b) {\n        return max[a] - max[b];\n      }), top = 0, bottom = 0, tops = [], bottoms = [];\n      for (i = 0; i < n; ++i) {\n        j = index[i];\n        if (top < bottom) {\n          top += sums[j];\n          tops.push(j);\n        } else {\n          bottom += sums[j];\n          bottoms.push(j);\n        }\n      }\n      return bottoms.reverse().concat(tops);\n    },\n    reverse: function(data) {\n      return d3.range(data.length).reverse();\n    },\n    \"default\": d3_layout_stackOrderDefault\n  });\n  var d3_layout_stackOffsets = d3.map({\n    silhouette: function(data) {\n      var n = data.length, m = data[0].length, sums = [], max = 0, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o > max) max = o;\n        sums.push(o);\n      }\n      for (j = 0; j < m; ++j) {\n        y0[j] = (max - sums[j]) / 2;\n      }\n      return y0;\n    },\n    wiggle: function(data) {\n      var n = data.length, x = data[0], m = x.length, i, j, k, s1, s2, s3, dx, o, o0, y0 = [];\n      y0[0] = o = o0 = 0;\n      for (j = 1; j < m; ++j) {\n        for (i = 0, s1 = 0; i < n; ++i) s1 += data[i][j][1];\n        for (i = 0, s2 = 0, dx = x[j][0] - x[j - 1][0]; i < n; ++i) {\n          for (k = 0, s3 = (data[i][j][1] - data[i][j - 1][1]) / (2 * dx); k < i; ++k) {\n            s3 += (data[k][j][1] - data[k][j - 1][1]) / dx;\n          }\n          s2 += s3 * data[i][j][1];\n        }\n        y0[j] = o -= s1 ? s2 / s1 * dx : 0;\n        if (o < o0) o0 = o;\n      }\n      for (j = 0; j < m; ++j) y0[j] -= o0;\n      return y0;\n    },\n    expand: function(data) {\n      var n = data.length, m = data[0].length, k = 1 / n, i, j, o, y0 = [];\n      for (j = 0; j < m; ++j) {\n        for (i = 0, o = 0; i < n; i++) o += data[i][j][1];\n        if (o) for (i = 0; i < n; i++) data[i][j][1] /= o; else for (i = 0; i < n; i++) data[i][j][1] = k;\n      }\n      for (j = 0; j < m; ++j) y0[j] = 0;\n      return y0;\n    },\n    zero: d3_layout_stackOffsetZero\n  });\n  function d3_layout_stackOrderDefault(data) {\n    return d3.range(data.length);\n  }\n  function d3_layout_stackOffsetZero(data) {\n    var j = -1, m = data[0].length, y0 = [];\n    while (++j < m) y0[j] = 0;\n    return y0;\n  }\n  function d3_layout_stackMaxIndex(array) {\n    var i = 1, j = 0, v = array[0][1], k, n = array.length;\n    for (;i < n; ++i) {\n      if ((k = array[i][1]) > v) {\n        j = i;\n        v = k;\n      }\n    }\n    return j;\n  }\n  function d3_layout_stackReduceSum(d) {\n    return d.reduce(d3_layout_stackSum, 0);\n  }\n  function d3_layout_stackSum(p, d) {\n    return p + d[1];\n  }\n  d3.layout.histogram = function() {\n    var frequency = true, valuer = Number, ranger = d3_layout_histogramRange, binner = d3_layout_histogramBinSturges;\n    function histogram(data, i) {\n      var bins = [], values = data.map(valuer, this), range = ranger.call(this, values, i), thresholds = binner.call(this, range, values, i), bin, i = -1, n = values.length, m = thresholds.length - 1, k = frequency ? 1 : 1 / n, x;\n      while (++i < m) {\n        bin = bins[i] = [];\n        bin.dx = thresholds[i + 1] - (bin.x = thresholds[i]);\n        bin.y = 0;\n      }\n      if (m > 0) {\n        i = -1;\n        while (++i < n) {\n          x = values[i];\n          if (x >= range[0] && x <= range[1]) {\n            bin = bins[d3.bisect(thresholds, x, 1, m) - 1];\n            bin.y += k;\n            bin.push(data[i]);\n          }\n        }\n      }\n      return bins;\n    }\n    histogram.value = function(x) {\n      if (!arguments.length) return valuer;\n      valuer = x;\n      return histogram;\n    };\n    histogram.range = function(x) {\n      if (!arguments.length) return ranger;\n      ranger = d3_functor(x);\n      return histogram;\n    };\n    histogram.bins = function(x) {\n      if (!arguments.length) return binner;\n      binner = typeof x === \"number\" ? function(range) {\n        return d3_layout_histogramBinFixed(range, x);\n      } : d3_functor(x);\n      return histogram;\n    };\n    histogram.frequency = function(x) {\n      if (!arguments.length) return frequency;\n      frequency = !!x;\n      return histogram;\n    };\n    return histogram;\n  };\n  function d3_layout_histogramBinSturges(range, values) {\n    return d3_layout_histogramBinFixed(range, Math.ceil(Math.log(values.length) / Math.LN2 + 1));\n  }\n  function d3_layout_histogramBinFixed(range, n) {\n    var x = -1, b = +range[0], m = (range[1] - b) / n, f = [];\n    while (++x <= n) f[x] = m * x + b;\n    return f;\n  }\n  function d3_layout_histogramRange(values) {\n    return [ d3.min(values), d3.max(values) ];\n  }\n  d3.layout.pack = function() {\n    var hierarchy = d3.layout.hierarchy().sort(d3_layout_packSort), padding = 0, size = [ 1, 1 ], radius;\n    function pack(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], w = size[0], h = size[1], r = radius == null ? Math.sqrt : typeof radius === \"function\" ? radius : function() {\n        return radius;\n      };\n      root.x = root.y = 0;\n      d3_layout_hierarchyVisitAfter(root, function(d) {\n        d.r = +r(d.value);\n      });\n      d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n      if (padding) {\n        var dr = padding * (radius ? 1 : Math.max(2 * root.r / w, 2 * root.r / h)) / 2;\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r += dr;\n        });\n        d3_layout_hierarchyVisitAfter(root, d3_layout_packSiblings);\n        d3_layout_hierarchyVisitAfter(root, function(d) {\n          d.r -= dr;\n        });\n      }\n      d3_layout_packTransform(root, w / 2, h / 2, radius ? 1 : 1 / Math.max(2 * root.r / w, 2 * root.r / h));\n      return nodes;\n    }\n    pack.size = function(_) {\n      if (!arguments.length) return size;\n      size = _;\n      return pack;\n    };\n    pack.radius = function(_) {\n      if (!arguments.length) return radius;\n      radius = _ == null || typeof _ === \"function\" ? _ : +_;\n      return pack;\n    };\n    pack.padding = function(_) {\n      if (!arguments.length) return padding;\n      padding = +_;\n      return pack;\n    };\n    return d3_layout_hierarchyRebind(pack, hierarchy);\n  };\n  function d3_layout_packSort(a, b) {\n    return a.value - b.value;\n  }\n  function d3_layout_packInsert(a, b) {\n    var c = a._pack_next;\n    a._pack_next = b;\n    b._pack_prev = a;\n    b._pack_next = c;\n    c._pack_prev = b;\n  }\n  function d3_layout_packSplice(a, b) {\n    a._pack_next = b;\n    b._pack_prev = a;\n  }\n  function d3_layout_packIntersects(a, b) {\n    var dx = b.x - a.x, dy = b.y - a.y, dr = a.r + b.r;\n    return .999 * dr * dr > dx * dx + dy * dy;\n  }\n  function d3_layout_packSiblings(node) {\n    if (!(nodes = node.children) || !(n = nodes.length)) return;\n    var nodes, xMin = Infinity, xMax = -Infinity, yMin = Infinity, yMax = -Infinity, a, b, c, i, j, k, n;\n    function bound(node) {\n      xMin = Math.min(node.x - node.r, xMin);\n      xMax = Math.max(node.x + node.r, xMax);\n      yMin = Math.min(node.y - node.r, yMin);\n      yMax = Math.max(node.y + node.r, yMax);\n    }\n    nodes.forEach(d3_layout_packLink);\n    a = nodes[0];\n    a.x = -a.r;\n    a.y = 0;\n    bound(a);\n    if (n > 1) {\n      b = nodes[1];\n      b.x = b.r;\n      b.y = 0;\n      bound(b);\n      if (n > 2) {\n        c = nodes[2];\n        d3_layout_packPlace(a, b, c);\n        bound(c);\n        d3_layout_packInsert(a, c);\n        a._pack_prev = c;\n        d3_layout_packInsert(c, b);\n        b = a._pack_next;\n        for (i = 3; i < n; i++) {\n          d3_layout_packPlace(a, b, c = nodes[i]);\n          var isect = 0, s1 = 1, s2 = 1;\n          for (j = b._pack_next; j !== b; j = j._pack_next, s1++) {\n            if (d3_layout_packIntersects(j, c)) {\n              isect = 1;\n              break;\n            }\n          }\n          if (isect == 1) {\n            for (k = a._pack_prev; k !== j._pack_prev; k = k._pack_prev, s2++) {\n              if (d3_layout_packIntersects(k, c)) {\n                break;\n              }\n            }\n          }\n          if (isect) {\n            if (s1 < s2 || s1 == s2 && b.r < a.r) d3_layout_packSplice(a, b = j); else d3_layout_packSplice(a = k, b);\n            i--;\n          } else {\n            d3_layout_packInsert(a, c);\n            b = c;\n            bound(c);\n          }\n        }\n      }\n    }\n    var cx = (xMin + xMax) / 2, cy = (yMin + yMax) / 2, cr = 0;\n    for (i = 0; i < n; i++) {\n      c = nodes[i];\n      c.x -= cx;\n      c.y -= cy;\n      cr = Math.max(cr, c.r + Math.sqrt(c.x * c.x + c.y * c.y));\n    }\n    node.r = cr;\n    nodes.forEach(d3_layout_packUnlink);\n  }\n  function d3_layout_packLink(node) {\n    node._pack_next = node._pack_prev = node;\n  }\n  function d3_layout_packUnlink(node) {\n    delete node._pack_next;\n    delete node._pack_prev;\n  }\n  function d3_layout_packTransform(node, x, y, k) {\n    var children = node.children;\n    node.x = x += k * node.x;\n    node.y = y += k * node.y;\n    node.r *= k;\n    if (children) {\n      var i = -1, n = children.length;\n      while (++i < n) d3_layout_packTransform(children[i], x, y, k);\n    }\n  }\n  function d3_layout_packPlace(a, b, c) {\n    var db = a.r + c.r, dx = b.x - a.x, dy = b.y - a.y;\n    if (db && (dx || dy)) {\n      var da = b.r + c.r, dc = dx * dx + dy * dy;\n      da *= da;\n      db *= db;\n      var x = .5 + (db - da) / (2 * dc), y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);\n      c.x = a.x + x * dx + y * dy;\n      c.y = a.y + x * dy - y * dx;\n    } else {\n      c.x = a.x + db;\n      c.y = a.y;\n    }\n  }\n  d3.layout.tree = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = null;\n    function tree(d, i) {\n      var nodes = hierarchy.call(this, d, i), root0 = nodes[0], root1 = wrapTree(root0);\n      d3_layout_hierarchyVisitAfter(root1, firstWalk), root1.parent.m = -root1.z;\n      d3_layout_hierarchyVisitBefore(root1, secondWalk);\n      if (nodeSize) d3_layout_hierarchyVisitBefore(root0, sizeNode); else {\n        var left = root0, right = root0, bottom = root0;\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          if (node.x < left.x) left = node;\n          if (node.x > right.x) right = node;\n          if (node.depth > bottom.depth) bottom = node;\n        });\n        var tx = separation(left, right) / 2 - left.x, kx = size[0] / (right.x + separation(right, left) / 2 + tx), ky = size[1] / (bottom.depth || 1);\n        d3_layout_hierarchyVisitBefore(root0, function(node) {\n          node.x = (node.x + tx) * kx;\n          node.y = node.depth * ky;\n        });\n      }\n      return nodes;\n    }\n    function wrapTree(root0) {\n      var root1 = {\n        A: null,\n        children: [ root0 ]\n      }, queue = [ root1 ], node1;\n      while ((node1 = queue.pop()) != null) {\n        for (var children = node1.children, child, i = 0, n = children.length; i < n; ++i) {\n          queue.push((children[i] = child = {\n            _: children[i],\n            parent: node1,\n            children: (child = children[i].children) && child.slice() || [],\n            A: null,\n            a: null,\n            z: 0,\n            m: 0,\n            c: 0,\n            s: 0,\n            t: null,\n            i: i\n          }).a = child);\n        }\n      }\n      return root1.children[0];\n    }\n    function firstWalk(v) {\n      var children = v.children, siblings = v.parent.children, w = v.i ? siblings[v.i - 1] : null;\n      if (children.length) {\n        d3_layout_treeShift(v);\n        var midpoint = (children[0].z + children[children.length - 1].z) / 2;\n        if (w) {\n          v.z = w.z + separation(v._, w._);\n          v.m = v.z - midpoint;\n        } else {\n          v.z = midpoint;\n        }\n      } else if (w) {\n        v.z = w.z + separation(v._, w._);\n      }\n      v.parent.A = apportion(v, w, v.parent.A || siblings[0]);\n    }\n    function secondWalk(v) {\n      v._.x = v.z + v.parent.m;\n      v.m += v.parent.m;\n    }\n    function apportion(v, w, ancestor) {\n      if (w) {\n        var vip = v, vop = v, vim = w, vom = vip.parent.children[0], sip = vip.m, sop = vop.m, sim = vim.m, som = vom.m, shift;\n        while (vim = d3_layout_treeRight(vim), vip = d3_layout_treeLeft(vip), vim && vip) {\n          vom = d3_layout_treeLeft(vom);\n          vop = d3_layout_treeRight(vop);\n          vop.a = v;\n          shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);\n          if (shift > 0) {\n            d3_layout_treeMove(d3_layout_treeAncestor(vim, v, ancestor), v, shift);\n            sip += shift;\n            sop += shift;\n          }\n          sim += vim.m;\n          sip += vip.m;\n          som += vom.m;\n          sop += vop.m;\n        }\n        if (vim && !d3_layout_treeRight(vop)) {\n          vop.t = vim;\n          vop.m += sim - sop;\n        }\n        if (vip && !d3_layout_treeLeft(vom)) {\n          vom.t = vip;\n          vom.m += sip - som;\n          ancestor = v;\n        }\n      }\n      return ancestor;\n    }\n    function sizeNode(node) {\n      node.x *= size[0];\n      node.y = node.depth * size[1];\n    }\n    tree.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return tree;\n    };\n    tree.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null ? sizeNode : null;\n      return tree;\n    };\n    tree.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) == null ? null : sizeNode;\n      return tree;\n    };\n    return d3_layout_hierarchyRebind(tree, hierarchy);\n  };\n  function d3_layout_treeSeparation(a, b) {\n    return a.parent == b.parent ? 1 : 2;\n  }\n  function d3_layout_treeLeft(v) {\n    var children = v.children;\n    return children.length ? children[0] : v.t;\n  }\n  function d3_layout_treeRight(v) {\n    var children = v.children, n;\n    return (n = children.length) ? children[n - 1] : v.t;\n  }\n  function d3_layout_treeMove(wm, wp, shift) {\n    var change = shift / (wp.i - wm.i);\n    wp.c -= change;\n    wp.s += shift;\n    wm.c += change;\n    wp.z += shift;\n    wp.m += shift;\n  }\n  function d3_layout_treeShift(v) {\n    var shift = 0, change = 0, children = v.children, i = children.length, w;\n    while (--i >= 0) {\n      w = children[i];\n      w.z += shift;\n      w.m += shift;\n      shift += w.s + (change += w.c);\n    }\n  }\n  function d3_layout_treeAncestor(vim, v, ancestor) {\n    return vim.a.parent === v.parent ? vim.a : ancestor;\n  }\n  d3.layout.cluster = function() {\n    var hierarchy = d3.layout.hierarchy().sort(null).value(null), separation = d3_layout_treeSeparation, size = [ 1, 1 ], nodeSize = false;\n    function cluster(d, i) {\n      var nodes = hierarchy.call(this, d, i), root = nodes[0], previousNode, x = 0;\n      d3_layout_hierarchyVisitAfter(root, function(node) {\n        var children = node.children;\n        if (children && children.length) {\n          node.x = d3_layout_clusterX(children);\n          node.y = d3_layout_clusterY(children);\n        } else {\n          node.x = previousNode ? x += separation(node, previousNode) : 0;\n          node.y = 0;\n          previousNode = node;\n        }\n      });\n      var left = d3_layout_clusterLeft(root), right = d3_layout_clusterRight(root), x0 = left.x - separation(left, right) / 2, x1 = right.x + separation(right, left) / 2;\n      d3_layout_hierarchyVisitAfter(root, nodeSize ? function(node) {\n        node.x = (node.x - root.x) * size[0];\n        node.y = (root.y - node.y) * size[1];\n      } : function(node) {\n        node.x = (node.x - x0) / (x1 - x0) * size[0];\n        node.y = (1 - (root.y ? node.y / root.y : 1)) * size[1];\n      });\n      return nodes;\n    }\n    cluster.separation = function(x) {\n      if (!arguments.length) return separation;\n      separation = x;\n      return cluster;\n    };\n    cluster.size = function(x) {\n      if (!arguments.length) return nodeSize ? null : size;\n      nodeSize = (size = x) == null;\n      return cluster;\n    };\n    cluster.nodeSize = function(x) {\n      if (!arguments.length) return nodeSize ? size : null;\n      nodeSize = (size = x) != null;\n      return cluster;\n    };\n    return d3_layout_hierarchyRebind(cluster, hierarchy);\n  };\n  function d3_layout_clusterY(children) {\n    return 1 + d3.max(children, function(child) {\n      return child.y;\n    });\n  }\n  function d3_layout_clusterX(children) {\n    return children.reduce(function(x, child) {\n      return x + child.x;\n    }, 0) / children.length;\n  }\n  function d3_layout_clusterLeft(node) {\n    var children = node.children;\n    return children && children.length ? d3_layout_clusterLeft(children[0]) : node;\n  }\n  function d3_layout_clusterRight(node) {\n    var children = node.children, n;\n    return children && (n = children.length) ? d3_layout_clusterRight(children[n - 1]) : node;\n  }\n  d3.layout.treemap = function() {\n    var hierarchy = d3.layout.hierarchy(), round = Math.round, size = [ 1, 1 ], padding = null, pad = d3_layout_treemapPadNull, sticky = false, stickies, mode = \"squarify\", ratio = .5 * (1 + Math.sqrt(5));\n    function scale(children, k) {\n      var i = -1, n = children.length, child, area;\n      while (++i < n) {\n        area = (child = children[i]).value * (k < 0 ? 0 : k);\n        child.area = isNaN(area) || area <= 0 ? 0 : area;\n      }\n    }\n    function squarify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), row = [], remaining = children.slice(), child, best = Infinity, score, u = mode === \"slice\" ? rect.dx : mode === \"dice\" ? rect.dy : mode === \"slice-dice\" ? node.depth & 1 ? rect.dy : rect.dx : Math.min(rect.dx, rect.dy), n;\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while ((n = remaining.length) > 0) {\n          row.push(child = remaining[n - 1]);\n          row.area += child.area;\n          if (mode !== \"squarify\" || (score = worst(row, u)) <= best) {\n            remaining.pop();\n            best = score;\n          } else {\n            row.area -= row.pop().area;\n            position(row, u, rect, false);\n            u = Math.min(rect.dx, rect.dy);\n            row.length = row.area = 0;\n            best = Infinity;\n          }\n        }\n        if (row.length) {\n          position(row, u, rect, true);\n          row.length = row.area = 0;\n        }\n        children.forEach(squarify);\n      }\n    }\n    function stickify(node) {\n      var children = node.children;\n      if (children && children.length) {\n        var rect = pad(node), remaining = children.slice(), child, row = [];\n        scale(remaining, rect.dx * rect.dy / node.value);\n        row.area = 0;\n        while (child = remaining.pop()) {\n          row.push(child);\n          row.area += child.area;\n          if (child.z != null) {\n            position(row, child.z ? rect.dx : rect.dy, rect, !remaining.length);\n            row.length = row.area = 0;\n          }\n        }\n        children.forEach(stickify);\n      }\n    }\n    function worst(row, u) {\n      var s = row.area, r, rmax = 0, rmin = Infinity, i = -1, n = row.length;\n      while (++i < n) {\n        if (!(r = row[i].area)) continue;\n        if (r < rmin) rmin = r;\n        if (r > rmax) rmax = r;\n      }\n      s *= s;\n      u *= u;\n      return s ? Math.max(u * rmax * ratio / s, s / (u * rmin * ratio)) : Infinity;\n    }\n    function position(row, u, rect, flush) {\n      var i = -1, n = row.length, x = rect.x, y = rect.y, v = u ? round(row.area / u) : 0, o;\n      if (u == rect.dx) {\n        if (flush || v > rect.dy) v = rect.dy;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dy = v;\n          x += o.dx = Math.min(rect.x + rect.dx - x, v ? round(o.area / v) : 0);\n        }\n        o.z = true;\n        o.dx += rect.x + rect.dx - x;\n        rect.y += v;\n        rect.dy -= v;\n      } else {\n        if (flush || v > rect.dx) v = rect.dx;\n        while (++i < n) {\n          o = row[i];\n          o.x = x;\n          o.y = y;\n          o.dx = v;\n          y += o.dy = Math.min(rect.y + rect.dy - y, v ? round(o.area / v) : 0);\n        }\n        o.z = false;\n        o.dy += rect.y + rect.dy - y;\n        rect.x += v;\n        rect.dx -= v;\n      }\n    }\n    function treemap(d) {\n      var nodes = stickies || hierarchy(d), root = nodes[0];\n      root.x = root.y = 0;\n      if (root.value) root.dx = size[0], root.dy = size[1]; else root.dx = root.dy = 0;\n      if (stickies) hierarchy.revalue(root);\n      scale([ root ], root.dx * root.dy / root.value);\n      (stickies ? stickify : squarify)(root);\n      if (sticky) stickies = nodes;\n      return nodes;\n    }\n    treemap.size = function(x) {\n      if (!arguments.length) return size;\n      size = x;\n      return treemap;\n    };\n    treemap.padding = function(x) {\n      if (!arguments.length) return padding;\n      function padFunction(node) {\n        var p = x.call(treemap, node, node.depth);\n        return p == null ? d3_layout_treemapPadNull(node) : d3_layout_treemapPad(node, typeof p === \"number\" ? [ p, p, p, p ] : p);\n      }\n      function padConstant(node) {\n        return d3_layout_treemapPad(node, x);\n      }\n      var type;\n      pad = (padding = x) == null ? d3_layout_treemapPadNull : (type = typeof x) === \"function\" ? padFunction : type === \"number\" ? (x = [ x, x, x, x ], \n      padConstant) : padConstant;\n      return treemap;\n    };\n    treemap.round = function(x) {\n      if (!arguments.length) return round != Number;\n      round = x ? Math.round : Number;\n      return treemap;\n    };\n    treemap.sticky = function(x) {\n      if (!arguments.length) return sticky;\n      sticky = x;\n      stickies = null;\n      return treemap;\n    };\n    treemap.ratio = function(x) {\n      if (!arguments.length) return ratio;\n      ratio = x;\n      return treemap;\n    };\n    treemap.mode = function(x) {\n      if (!arguments.length) return mode;\n      mode = x + \"\";\n      return treemap;\n    };\n    return d3_layout_hierarchyRebind(treemap, hierarchy);\n  };\n  function d3_layout_treemapPadNull(node) {\n    return {\n      x: node.x,\n      y: node.y,\n      dx: node.dx,\n      dy: node.dy\n    };\n  }\n  function d3_layout_treemapPad(node, padding) {\n    var x = node.x + padding[3], y = node.y + padding[0], dx = node.dx - padding[1] - padding[3], dy = node.dy - padding[0] - padding[2];\n    if (dx < 0) {\n      x += dx / 2;\n      dx = 0;\n    }\n    if (dy < 0) {\n      y += dy / 2;\n      dy = 0;\n    }\n    return {\n      x: x,\n      y: y,\n      dx: dx,\n      dy: dy\n    };\n  }\n  d3.random = {\n    normal: function(µ, σ) {\n      var n = arguments.length;\n      if (n < 2) σ = 1;\n      if (n < 1) µ = 0;\n      return function() {\n        var x, y, r;\n        do {\n          x = Math.random() * 2 - 1;\n          y = Math.random() * 2 - 1;\n          r = x * x + y * y;\n        } while (!r || r > 1);\n        return µ + σ * x * Math.sqrt(-2 * Math.log(r) / r);\n      };\n    },\n    logNormal: function() {\n      var random = d3.random.normal.apply(d3, arguments);\n      return function() {\n        return Math.exp(random());\n      };\n    },\n    bates: function(m) {\n      var random = d3.random.irwinHall(m);\n      return function() {\n        return random() / m;\n      };\n    },\n    irwinHall: function(m) {\n      return function() {\n        for (var s = 0, j = 0; j < m; j++) s += Math.random();\n        return s;\n      };\n    }\n  };\n  d3.scale = {};\n  function d3_scaleExtent(domain) {\n    var start = domain[0], stop = domain[domain.length - 1];\n    return start < stop ? [ start, stop ] : [ stop, start ];\n  }\n  function d3_scaleRange(scale) {\n    return scale.rangeExtent ? scale.rangeExtent() : d3_scaleExtent(scale.range());\n  }\n  function d3_scale_bilinear(domain, range, uninterpolate, interpolate) {\n    var u = uninterpolate(domain[0], domain[1]), i = interpolate(range[0], range[1]);\n    return function(x) {\n      return i(u(x));\n    };\n  }\n  function d3_scale_nice(domain, nice) {\n    var i0 = 0, i1 = domain.length - 1, x0 = domain[i0], x1 = domain[i1], dx;\n    if (x1 < x0) {\n      dx = i0, i0 = i1, i1 = dx;\n      dx = x0, x0 = x1, x1 = dx;\n    }\n    domain[i0] = nice.floor(x0);\n    domain[i1] = nice.ceil(x1);\n    return domain;\n  }\n  function d3_scale_niceStep(step) {\n    return step ? {\n      floor: function(x) {\n        return Math.floor(x / step) * step;\n      },\n      ceil: function(x) {\n        return Math.ceil(x / step) * step;\n      }\n    } : d3_scale_niceIdentity;\n  }\n  var d3_scale_niceIdentity = {\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  function d3_scale_polylinear(domain, range, uninterpolate, interpolate) {\n    var u = [], i = [], j = 0, k = Math.min(domain.length, range.length) - 1;\n    if (domain[k] < domain[0]) {\n      domain = domain.slice().reverse();\n      range = range.slice().reverse();\n    }\n    while (++j <= k) {\n      u.push(uninterpolate(domain[j - 1], domain[j]));\n      i.push(interpolate(range[j - 1], range[j]));\n    }\n    return function(x) {\n      var j = d3.bisect(domain, x, 1, k) - 1;\n      return i[j](u[j](x));\n    };\n  }\n  d3.scale.linear = function() {\n    return d3_scale_linear([ 0, 1 ], [ 0, 1 ], d3_interpolate, false);\n  };\n  function d3_scale_linear(domain, range, interpolate, clamp) {\n    var output, input;\n    function rescale() {\n      var linear = Math.min(domain.length, range.length) > 2 ? d3_scale_polylinear : d3_scale_bilinear, uninterpolate = clamp ? d3_uninterpolateClamp : d3_uninterpolateNumber;\n      output = linear(domain, range, uninterpolate, interpolate);\n      input = linear(range, domain, uninterpolate, d3_interpolate);\n      return scale;\n    }\n    function scale(x) {\n      return output(x);\n    }\n    scale.invert = function(y) {\n      return input(y);\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(Number);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.rangeRound = function(x) {\n      return scale.range(x).interpolate(d3_interpolateRound);\n    };\n    scale.clamp = function(x) {\n      if (!arguments.length) return clamp;\n      clamp = x;\n      return rescale();\n    };\n    scale.interpolate = function(x) {\n      if (!arguments.length) return interpolate;\n      interpolate = x;\n      return rescale();\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      d3_scale_linearNice(domain, m);\n      return rescale();\n    };\n    scale.copy = function() {\n      return d3_scale_linear(domain, range, interpolate, clamp);\n    };\n    return rescale();\n  }\n  function d3_scale_linearRebind(scale, linear) {\n    return d3.rebind(scale, linear, \"range\", \"rangeRound\", \"interpolate\", \"clamp\");\n  }\n  function d3_scale_linearNice(domain, m) {\n    d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n    d3_scale_nice(domain, d3_scale_niceStep(d3_scale_linearTickRange(domain, m)[2]));\n    return domain;\n  }\n  function d3_scale_linearTickRange(domain, m) {\n    if (m == null) m = 10;\n    var extent = d3_scaleExtent(domain), span = extent[1] - extent[0], step = Math.pow(10, Math.floor(Math.log(span / m) / Math.LN10)), err = m / span * step;\n    if (err <= .15) step *= 10; else if (err <= .35) step *= 5; else if (err <= .75) step *= 2;\n    extent[0] = Math.ceil(extent[0] / step) * step;\n    extent[1] = Math.floor(extent[1] / step) * step + step * .5;\n    extent[2] = step;\n    return extent;\n  }\n  function d3_scale_linearTicks(domain, m) {\n    return d3.range.apply(d3, d3_scale_linearTickRange(domain, m));\n  }\n  function d3_scale_linearTickFormat(domain, m, format) {\n    var range = d3_scale_linearTickRange(domain, m);\n    if (format) {\n      var match = d3_format_re.exec(format);\n      match.shift();\n      if (match[8] === \"s\") {\n        var prefix = d3.formatPrefix(Math.max(abs(range[0]), abs(range[1])));\n        if (!match[7]) match[7] = \".\" + d3_scale_linearPrecision(prefix.scale(range[2]));\n        match[8] = \"f\";\n        format = d3.format(match.join(\"\"));\n        return function(d) {\n          return format(prefix.scale(d)) + prefix.symbol;\n        };\n      }\n      if (!match[7]) match[7] = \".\" + d3_scale_linearFormatPrecision(match[8], range);\n      format = match.join(\"\");\n    } else {\n      format = \",.\" + d3_scale_linearPrecision(range[2]) + \"f\";\n    }\n    return d3.format(format);\n  }\n  var d3_scale_linearFormatSignificant = {\n    s: 1,\n    g: 1,\n    p: 1,\n    r: 1,\n    e: 1\n  };\n  function d3_scale_linearPrecision(value) {\n    return -Math.floor(Math.log(value) / Math.LN10 + .01);\n  }\n  function d3_scale_linearFormatPrecision(type, range) {\n    var p = d3_scale_linearPrecision(range[2]);\n    return type in d3_scale_linearFormatSignificant ? Math.abs(p - d3_scale_linearPrecision(Math.max(abs(range[0]), abs(range[1])))) + +(type !== \"e\") : p - (type === \"%\") * 2;\n  }\n  d3.scale.log = function() {\n    return d3_scale_log(d3.scale.linear().domain([ 0, 1 ]), 10, true, [ 1, 10 ]);\n  };\n  function d3_scale_log(linear, base, positive, domain) {\n    function log(x) {\n      return (positive ? Math.log(x < 0 ? 0 : x) : -Math.log(x > 0 ? 0 : -x)) / Math.log(base);\n    }\n    function pow(x) {\n      return positive ? Math.pow(base, x) : -Math.pow(base, -x);\n    }\n    function scale(x) {\n      return linear(log(x));\n    }\n    scale.invert = function(x) {\n      return pow(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      positive = x[0] >= 0;\n      linear.domain((domain = x.map(Number)).map(log));\n      return scale;\n    };\n    scale.base = function(_) {\n      if (!arguments.length) return base;\n      base = +_;\n      linear.domain(domain.map(log));\n      return scale;\n    };\n    scale.nice = function() {\n      var niced = d3_scale_nice(domain.map(log), positive ? Math : d3_scale_logNiceNegative);\n      linear.domain(niced);\n      domain = niced.map(pow);\n      return scale;\n    };\n    scale.ticks = function() {\n      var extent = d3_scaleExtent(domain), ticks = [], u = extent[0], v = extent[1], i = Math.floor(log(u)), j = Math.ceil(log(v)), n = base % 1 ? 2 : base;\n      if (isFinite(j - i)) {\n        if (positive) {\n          for (;i < j; i++) for (var k = 1; k < n; k++) ticks.push(pow(i) * k);\n          ticks.push(pow(i));\n        } else {\n          ticks.push(pow(i));\n          for (;i++ < j; ) for (var k = n - 1; k > 0; k--) ticks.push(pow(i) * k);\n        }\n        for (i = 0; ticks[i] < u; i++) {}\n        for (j = ticks.length; ticks[j - 1] > v; j--) {}\n        ticks = ticks.slice(i, j);\n      }\n      return ticks;\n    };\n    scale.tickFormat = function(n, format) {\n      if (!arguments.length) return d3_scale_logFormat;\n      if (arguments.length < 2) format = d3_scale_logFormat; else if (typeof format !== \"function\") format = d3.format(format);\n      var k = Math.max(1, base * n / scale.ticks().length);\n      return function(d) {\n        var i = d / pow(Math.round(log(d)));\n        if (i * base < base - .5) i *= base;\n        return i <= k ? format(d) : \"\";\n      };\n    };\n    scale.copy = function() {\n      return d3_scale_log(linear.copy(), base, positive, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  var d3_scale_logFormat = d3.format(\".0e\"), d3_scale_logNiceNegative = {\n    floor: function(x) {\n      return -Math.ceil(-x);\n    },\n    ceil: function(x) {\n      return -Math.floor(-x);\n    }\n  };\n  d3.scale.pow = function() {\n    return d3_scale_pow(d3.scale.linear(), 1, [ 0, 1 ]);\n  };\n  function d3_scale_pow(linear, exponent, domain) {\n    var powp = d3_scale_powPow(exponent), powb = d3_scale_powPow(1 / exponent);\n    function scale(x) {\n      return linear(powp(x));\n    }\n    scale.invert = function(x) {\n      return powb(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      linear.domain((domain = x.map(Number)).map(powp));\n      return scale;\n    };\n    scale.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    scale.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    scale.nice = function(m) {\n      return scale.domain(d3_scale_linearNice(domain, m));\n    };\n    scale.exponent = function(x) {\n      if (!arguments.length) return exponent;\n      powp = d3_scale_powPow(exponent = x);\n      powb = d3_scale_powPow(1 / exponent);\n      linear.domain(domain.map(powp));\n      return scale;\n    };\n    scale.copy = function() {\n      return d3_scale_pow(linear.copy(), exponent, domain);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_scale_powPow(e) {\n    return function(x) {\n      return x < 0 ? -Math.pow(-x, e) : Math.pow(x, e);\n    };\n  }\n  d3.scale.sqrt = function() {\n    return d3.scale.pow().exponent(.5);\n  };\n  d3.scale.ordinal = function() {\n    return d3_scale_ordinal([], {\n      t: \"range\",\n      a: [ [] ]\n    });\n  };\n  function d3_scale_ordinal(domain, ranger) {\n    var index, range, rangeBand;\n    function scale(x) {\n      return range[((index.get(x) || (ranger.t === \"range\" ? index.set(x, domain.push(x)) : NaN)) - 1) % range.length];\n    }\n    function steps(start, step) {\n      return d3.range(domain.length).map(function(i) {\n        return start + step * i;\n      });\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = [];\n      index = new d3_Map();\n      var i = -1, n = x.length, xi;\n      while (++i < n) if (!index.has(xi = x[i])) index.set(xi, domain.push(xi));\n      return scale[ranger.t].apply(scale, ranger.a);\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      rangeBand = 0;\n      ranger = {\n        t: \"range\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangePoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = domain.length < 2 ? (start = (start + stop) / 2, \n      0) : (stop - start) / (domain.length - 1 + padding);\n      range = steps(start + step * padding / 2, step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangePoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundPoints = function(x, padding) {\n      if (arguments.length < 2) padding = 0;\n      var start = x[0], stop = x[1], step = domain.length < 2 ? (start = stop = Math.round((start + stop) / 2), \n      0) : (stop - start) / (domain.length - 1 + padding) | 0;\n      range = steps(start + Math.round(step * padding / 2 + (stop - start - (domain.length - 1 + padding) * step) / 2), step);\n      rangeBand = 0;\n      ranger = {\n        t: \"rangeRoundPoints\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = (stop - start) / (domain.length - padding + 2 * outerPadding);\n      range = steps(start + step * outerPadding, step);\n      if (reverse) range.reverse();\n      rangeBand = step * (1 - padding);\n      ranger = {\n        t: \"rangeBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeRoundBands = function(x, padding, outerPadding) {\n      if (arguments.length < 2) padding = 0;\n      if (arguments.length < 3) outerPadding = padding;\n      var reverse = x[1] < x[0], start = x[reverse - 0], stop = x[1 - reverse], step = Math.floor((stop - start) / (domain.length - padding + 2 * outerPadding));\n      range = steps(start + Math.round((stop - start - (domain.length - padding) * step) / 2), step);\n      if (reverse) range.reverse();\n      rangeBand = Math.round(step * (1 - padding));\n      ranger = {\n        t: \"rangeRoundBands\",\n        a: arguments\n      };\n      return scale;\n    };\n    scale.rangeBand = function() {\n      return rangeBand;\n    };\n    scale.rangeExtent = function() {\n      return d3_scaleExtent(ranger.a[0]);\n    };\n    scale.copy = function() {\n      return d3_scale_ordinal(domain, ranger);\n    };\n    return scale.domain(domain);\n  }\n  d3.scale.category10 = function() {\n    return d3.scale.ordinal().range(d3_category10);\n  };\n  d3.scale.category20 = function() {\n    return d3.scale.ordinal().range(d3_category20);\n  };\n  d3.scale.category20b = function() {\n    return d3.scale.ordinal().range(d3_category20b);\n  };\n  d3.scale.category20c = function() {\n    return d3.scale.ordinal().range(d3_category20c);\n  };\n  var d3_category10 = [ 2062260, 16744206, 2924588, 14034728, 9725885, 9197131, 14907330, 8355711, 12369186, 1556175 ].map(d3_rgbString);\n  var d3_category20 = [ 2062260, 11454440, 16744206, 16759672, 2924588, 10018698, 14034728, 16750742, 9725885, 12955861, 9197131, 12885140, 14907330, 16234194, 8355711, 13092807, 12369186, 14408589, 1556175, 10410725 ].map(d3_rgbString);\n  var d3_category20b = [ 3750777, 5395619, 7040719, 10264286, 6519097, 9216594, 11915115, 13556636, 9202993, 12426809, 15186514, 15190932, 8666169, 11356490, 14049643, 15177372, 8077683, 10834324, 13528509, 14589654 ].map(d3_rgbString);\n  var d3_category20c = [ 3244733, 7057110, 10406625, 13032431, 15095053, 16616764, 16625259, 16634018, 3253076, 7652470, 10607003, 13101504, 7695281, 10394312, 12369372, 14342891, 6513507, 9868950, 12434877, 14277081 ].map(d3_rgbString);\n  d3.scale.quantile = function() {\n    return d3_scale_quantile([], []);\n  };\n  function d3_scale_quantile(domain, range) {\n    var thresholds;\n    function rescale() {\n      var k = 0, q = range.length;\n      thresholds = [];\n      while (++k < q) thresholds[k - 1] = d3.quantile(domain, k / q);\n      return scale;\n    }\n    function scale(x) {\n      if (!isNaN(x = +x)) return range[d3.bisect(thresholds, x)];\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(d3_number).filter(d3_numeric).sort(d3_ascending);\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.quantiles = function() {\n      return thresholds;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return y < 0 ? [ NaN, NaN ] : [ y > 0 ? thresholds[y - 1] : domain[0], y < thresholds.length ? thresholds[y] : domain[domain.length - 1] ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantile(domain, range);\n    };\n    return rescale();\n  }\n  d3.scale.quantize = function() {\n    return d3_scale_quantize(0, 1, [ 0, 1 ]);\n  };\n  function d3_scale_quantize(x0, x1, range) {\n    var kx, i;\n    function scale(x) {\n      return range[Math.max(0, Math.min(i, Math.floor(kx * (x - x0))))];\n    }\n    function rescale() {\n      kx = range.length / (x1 - x0);\n      i = range.length - 1;\n      return scale;\n    }\n    scale.domain = function(x) {\n      if (!arguments.length) return [ x0, x1 ];\n      x0 = +x[0];\n      x1 = +x[x.length - 1];\n      return rescale();\n    };\n    scale.range = function(x) {\n      if (!arguments.length) return range;\n      range = x;\n      return rescale();\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      y = y < 0 ? NaN : y / kx + x0;\n      return [ y, y + 1 / kx ];\n    };\n    scale.copy = function() {\n      return d3_scale_quantize(x0, x1, range);\n    };\n    return rescale();\n  }\n  d3.scale.threshold = function() {\n    return d3_scale_threshold([ .5 ], [ 0, 1 ]);\n  };\n  function d3_scale_threshold(domain, range) {\n    function scale(x) {\n      if (x <= x) return range[d3.bisect(domain, x)];\n    }\n    scale.domain = function(_) {\n      if (!arguments.length) return domain;\n      domain = _;\n      return scale;\n    };\n    scale.range = function(_) {\n      if (!arguments.length) return range;\n      range = _;\n      return scale;\n    };\n    scale.invertExtent = function(y) {\n      y = range.indexOf(y);\n      return [ domain[y - 1], domain[y] ];\n    };\n    scale.copy = function() {\n      return d3_scale_threshold(domain, range);\n    };\n    return scale;\n  }\n  d3.scale.identity = function() {\n    return d3_scale_identity([ 0, 1 ]);\n  };\n  function d3_scale_identity(domain) {\n    function identity(x) {\n      return +x;\n    }\n    identity.invert = identity;\n    identity.domain = identity.range = function(x) {\n      if (!arguments.length) return domain;\n      domain = x.map(identity);\n      return identity;\n    };\n    identity.ticks = function(m) {\n      return d3_scale_linearTicks(domain, m);\n    };\n    identity.tickFormat = function(m, format) {\n      return d3_scale_linearTickFormat(domain, m, format);\n    };\n    identity.copy = function() {\n      return d3_scale_identity(domain);\n    };\n    return identity;\n  }\n  d3.svg = {};\n  function d3_zero() {\n    return 0;\n  }\n  d3.svg.arc = function() {\n    var innerRadius = d3_svg_arcInnerRadius, outerRadius = d3_svg_arcOuterRadius, cornerRadius = d3_zero, padRadius = d3_svg_arcAuto, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle, padAngle = d3_svg_arcPadAngle;\n    function arc() {\n      var r0 = Math.max(0, +innerRadius.apply(this, arguments)), r1 = Math.max(0, +outerRadius.apply(this, arguments)), a0 = startAngle.apply(this, arguments) - halfπ, a1 = endAngle.apply(this, arguments) - halfπ, da = Math.abs(a1 - a0), cw = a0 > a1 ? 0 : 1;\n      if (r1 < r0) rc = r1, r1 = r0, r0 = rc;\n      if (da >= τε) return circleSegment(r1, cw) + (r0 ? circleSegment(r0, 1 - cw) : \"\") + \"Z\";\n      var rc, cr, rp, ap, p0 = 0, p1 = 0, x0, y0, x1, y1, x2, y2, x3, y3, path = [];\n      if (ap = (+padAngle.apply(this, arguments) || 0) / 2) {\n        rp = padRadius === d3_svg_arcAuto ? Math.sqrt(r0 * r0 + r1 * r1) : +padRadius.apply(this, arguments);\n        if (!cw) p1 *= -1;\n        if (r1) p1 = d3_asin(rp / r1 * Math.sin(ap));\n        if (r0) p0 = d3_asin(rp / r0 * Math.sin(ap));\n      }\n      if (r1) {\n        x0 = r1 * Math.cos(a0 + p1);\n        y0 = r1 * Math.sin(a0 + p1);\n        x1 = r1 * Math.cos(a1 - p1);\n        y1 = r1 * Math.sin(a1 - p1);\n        var l1 = Math.abs(a1 - a0 - 2 * p1) <= π ? 0 : 1;\n        if (p1 && d3_svg_arcSweep(x0, y0, x1, y1) === cw ^ l1) {\n          var h1 = (a0 + a1) / 2;\n          x0 = r1 * Math.cos(h1);\n          y0 = r1 * Math.sin(h1);\n          x1 = y1 = null;\n        }\n      } else {\n        x0 = y0 = 0;\n      }\n      if (r0) {\n        x2 = r0 * Math.cos(a1 - p0);\n        y2 = r0 * Math.sin(a1 - p0);\n        x3 = r0 * Math.cos(a0 + p0);\n        y3 = r0 * Math.sin(a0 + p0);\n        var l0 = Math.abs(a0 - a1 + 2 * p0) <= π ? 0 : 1;\n        if (p0 && d3_svg_arcSweep(x2, y2, x3, y3) === 1 - cw ^ l0) {\n          var h0 = (a0 + a1) / 2;\n          x2 = r0 * Math.cos(h0);\n          y2 = r0 * Math.sin(h0);\n          x3 = y3 = null;\n        }\n      } else {\n        x2 = y2 = 0;\n      }\n      if (da > ε && (rc = Math.min(Math.abs(r1 - r0) / 2, +cornerRadius.apply(this, arguments))) > .001) {\n        cr = r0 < r1 ^ cw ? 0 : 1;\n        var rc1 = rc, rc0 = rc;\n        if (da < π) {\n          var oc = x3 == null ? [ x2, y2 ] : x1 == null ? [ x0, y0 ] : d3_geom_polygonIntersect([ x0, y0 ], [ x3, y3 ], [ x1, y1 ], [ x2, y2 ]), ax = x0 - oc[0], ay = y0 - oc[1], bx = x1 - oc[0], by = y1 - oc[1], kc = 1 / Math.sin(Math.acos((ax * bx + ay * by) / (Math.sqrt(ax * ax + ay * ay) * Math.sqrt(bx * bx + by * by))) / 2), lc = Math.sqrt(oc[0] * oc[0] + oc[1] * oc[1]);\n          rc0 = Math.min(rc, (r0 - lc) / (kc - 1));\n          rc1 = Math.min(rc, (r1 - lc) / (kc + 1));\n        }\n        if (x1 != null) {\n          var t30 = d3_svg_arcCornerTangents(x3 == null ? [ x2, y2 ] : [ x3, y3 ], [ x0, y0 ], r1, rc1, cw), t12 = d3_svg_arcCornerTangents([ x1, y1 ], [ x2, y2 ], r1, rc1, cw);\n          if (rc === rc1) {\n            path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t30[1], \"A\", r1, \",\", r1, \" 0 \", 1 - cw ^ d3_svg_arcSweep(t30[1][0], t30[1][1], t12[1][0], t12[1][1]), \",\", cw, \" \", t12[1], \"A\", rc1, \",\", rc1, \" 0 0,\", cr, \" \", t12[0]);\n          } else {\n            path.push(\"M\", t30[0], \"A\", rc1, \",\", rc1, \" 0 1,\", cr, \" \", t12[0]);\n          }\n        } else {\n          path.push(\"M\", x0, \",\", y0);\n        }\n        if (x3 != null) {\n          var t03 = d3_svg_arcCornerTangents([ x0, y0 ], [ x3, y3 ], r0, -rc0, cw), t21 = d3_svg_arcCornerTangents([ x2, y2 ], x1 == null ? [ x0, y0 ] : [ x1, y1 ], r0, -rc0, cw);\n          if (rc === rc0) {\n            path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t21[1], \"A\", r0, \",\", r0, \" 0 \", cw ^ d3_svg_arcSweep(t21[1][0], t21[1][1], t03[1][0], t03[1][1]), \",\", 1 - cw, \" \", t03[1], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n          } else {\n            path.push(\"L\", t21[0], \"A\", rc0, \",\", rc0, \" 0 0,\", cr, \" \", t03[0]);\n          }\n        } else {\n          path.push(\"L\", x2, \",\", y2);\n        }\n      } else {\n        path.push(\"M\", x0, \",\", y0);\n        if (x1 != null) path.push(\"A\", r1, \",\", r1, \" 0 \", l1, \",\", cw, \" \", x1, \",\", y1);\n        path.push(\"L\", x2, \",\", y2);\n        if (x3 != null) path.push(\"A\", r0, \",\", r0, \" 0 \", l0, \",\", 1 - cw, \" \", x3, \",\", y3);\n      }\n      path.push(\"Z\");\n      return path.join(\"\");\n    }\n    function circleSegment(r1, cw) {\n      return \"M0,\" + r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + -r1 + \"A\" + r1 + \",\" + r1 + \" 0 1,\" + cw + \" 0,\" + r1;\n    }\n    arc.innerRadius = function(v) {\n      if (!arguments.length) return innerRadius;\n      innerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.outerRadius = function(v) {\n      if (!arguments.length) return outerRadius;\n      outerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.cornerRadius = function(v) {\n      if (!arguments.length) return cornerRadius;\n      cornerRadius = d3_functor(v);\n      return arc;\n    };\n    arc.padRadius = function(v) {\n      if (!arguments.length) return padRadius;\n      padRadius = v == d3_svg_arcAuto ? d3_svg_arcAuto : d3_functor(v);\n      return arc;\n    };\n    arc.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return arc;\n    };\n    arc.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return arc;\n    };\n    arc.padAngle = function(v) {\n      if (!arguments.length) return padAngle;\n      padAngle = d3_functor(v);\n      return arc;\n    };\n    arc.centroid = function() {\n      var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2, a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - halfπ;\n      return [ Math.cos(a) * r, Math.sin(a) * r ];\n    };\n    return arc;\n  };\n  var d3_svg_arcAuto = \"auto\";\n  function d3_svg_arcInnerRadius(d) {\n    return d.innerRadius;\n  }\n  function d3_svg_arcOuterRadius(d) {\n    return d.outerRadius;\n  }\n  function d3_svg_arcStartAngle(d) {\n    return d.startAngle;\n  }\n  function d3_svg_arcEndAngle(d) {\n    return d.endAngle;\n  }\n  function d3_svg_arcPadAngle(d) {\n    return d && d.padAngle;\n  }\n  function d3_svg_arcSweep(x0, y0, x1, y1) {\n    return (x0 - x1) * y0 - (y0 - y1) * x0 > 0 ? 0 : 1;\n  }\n  function d3_svg_arcCornerTangents(p0, p1, r1, rc, cw) {\n    var x01 = p0[0] - p1[0], y01 = p0[1] - p1[1], lo = (cw ? rc : -rc) / Math.sqrt(x01 * x01 + y01 * y01), ox = lo * y01, oy = -lo * x01, x1 = p0[0] + ox, y1 = p0[1] + oy, x2 = p1[0] + ox, y2 = p1[1] + oy, x3 = (x1 + x2) / 2, y3 = (y1 + y2) / 2, dx = x2 - x1, dy = y2 - y1, d2 = dx * dx + dy * dy, r = r1 - rc, D = x1 * y2 - x2 * y1, d = (dy < 0 ? -1 : 1) * Math.sqrt(Math.max(0, r * r * d2 - D * D)), cx0 = (D * dy - dx * d) / d2, cy0 = (-D * dx - dy * d) / d2, cx1 = (D * dy + dx * d) / d2, cy1 = (-D * dx + dy * d) / d2, dx0 = cx0 - x3, dy0 = cy0 - y3, dx1 = cx1 - x3, dy1 = cy1 - y3;\n    if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;\n    return [ [ cx0 - ox, cy0 - oy ], [ cx0 * r1 / r, cy0 * r1 / r ] ];\n  }\n  function d3_svg_line(projection) {\n    var x = d3_geom_pointX, y = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, tension = .7;\n    function line(data) {\n      var segments = [], points = [], i = -1, n = data.length, d, fx = d3_functor(x), fy = d3_functor(y);\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points), tension));\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points.push([ +fx.call(this, d, i), +fy.call(this, d, i) ]);\n        } else if (points.length) {\n          segment();\n          points = [];\n        }\n      }\n      if (points.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    line.x = function(_) {\n      if (!arguments.length) return x;\n      x = _;\n      return line;\n    };\n    line.y = function(_) {\n      if (!arguments.length) return y;\n      y = _;\n      return line;\n    };\n    line.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return line;\n    };\n    line.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      return line;\n    };\n    line.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return line;\n    };\n    return line;\n  }\n  d3.svg.line = function() {\n    return d3_svg_line(d3_identity);\n  };\n  var d3_svg_lineInterpolators = d3.map({\n    linear: d3_svg_lineLinear,\n    \"linear-closed\": d3_svg_lineLinearClosed,\n    step: d3_svg_lineStep,\n    \"step-before\": d3_svg_lineStepBefore,\n    \"step-after\": d3_svg_lineStepAfter,\n    basis: d3_svg_lineBasis,\n    \"basis-open\": d3_svg_lineBasisOpen,\n    \"basis-closed\": d3_svg_lineBasisClosed,\n    bundle: d3_svg_lineBundle,\n    cardinal: d3_svg_lineCardinal,\n    \"cardinal-open\": d3_svg_lineCardinalOpen,\n    \"cardinal-closed\": d3_svg_lineCardinalClosed,\n    monotone: d3_svg_lineMonotone\n  });\n  d3_svg_lineInterpolators.forEach(function(key, value) {\n    value.key = key;\n    value.closed = /-closed$/.test(key);\n  });\n  function d3_svg_lineLinear(points) {\n    return points.length > 1 ? points.join(\"L\") : points + \"Z\";\n  }\n  function d3_svg_lineLinearClosed(points) {\n    return points.join(\"L\") + \"Z\";\n  }\n  function d3_svg_lineStep(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p[0] + (p = points[i])[0]) / 2, \"V\", p[1]);\n    if (n > 1) path.push(\"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepBefore(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"V\", (p = points[i])[1], \"H\", p[0]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineStepAfter(points) {\n    var i = 0, n = points.length, p = points[0], path = [ p[0], \",\", p[1] ];\n    while (++i < n) path.push(\"H\", (p = points[i])[0], \"V\", p[1]);\n    return path.join(\"\");\n  }\n  function d3_svg_lineCardinalOpen(points, tension) {\n    return points.length < 4 ? d3_svg_lineLinear(points) : points[1] + d3_svg_lineHermite(points.slice(1, -1), d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineCardinalClosed(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinearClosed(points) : points[0] + d3_svg_lineHermite((points.push(points[0]), \n    points), d3_svg_lineCardinalTangents([ points[points.length - 2] ].concat(points, [ points[1] ]), tension));\n  }\n  function d3_svg_lineCardinal(points, tension) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineCardinalTangents(points, tension));\n  }\n  function d3_svg_lineHermite(points, tangents) {\n    if (tangents.length < 1 || points.length != tangents.length && points.length != tangents.length + 2) {\n      return d3_svg_lineLinear(points);\n    }\n    var quad = points.length != tangents.length, path = \"\", p0 = points[0], p = points[1], t0 = tangents[0], t = t0, pi = 1;\n    if (quad) {\n      path += \"Q\" + (p[0] - t0[0] * 2 / 3) + \",\" + (p[1] - t0[1] * 2 / 3) + \",\" + p[0] + \",\" + p[1];\n      p0 = points[1];\n      pi = 2;\n    }\n    if (tangents.length > 1) {\n      t = tangents[1];\n      p = points[pi];\n      pi++;\n      path += \"C\" + (p0[0] + t0[0]) + \",\" + (p0[1] + t0[1]) + \",\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      for (var i = 2; i < tangents.length; i++, pi++) {\n        p = points[pi];\n        t = tangents[i];\n        path += \"S\" + (p[0] - t[0]) + \",\" + (p[1] - t[1]) + \",\" + p[0] + \",\" + p[1];\n      }\n    }\n    if (quad) {\n      var lp = points[pi];\n      path += \"Q\" + (p[0] + t[0] * 2 / 3) + \",\" + (p[1] + t[1] * 2 / 3) + \",\" + lp[0] + \",\" + lp[1];\n    }\n    return path;\n  }\n  function d3_svg_lineCardinalTangents(points, tension) {\n    var tangents = [], a = (1 - tension) / 2, p0, p1 = points[0], p2 = points[1], i = 1, n = points.length;\n    while (++i < n) {\n      p0 = p1;\n      p1 = p2;\n      p2 = points[i];\n      tangents.push([ a * (p2[0] - p0[0]), a * (p2[1] - p0[1]) ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineBasis(points) {\n    if (points.length < 3) return d3_svg_lineLinear(points);\n    var i = 1, n = points.length, pi = points[0], x0 = pi[0], y0 = pi[1], px = [ x0, x0, x0, (pi = points[1])[0] ], py = [ y0, y0, y0, pi[1] ], path = [ x0, \",\", y0, \"L\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    points.push(points[n - 1]);\n    while (++i <= n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    points.pop();\n    path.push(\"L\", pi);\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisOpen(points) {\n    if (points.length < 4) return d3_svg_lineLinear(points);\n    var path = [], i = -1, n = points.length, pi, px = [ 0 ], py = [ 0 ];\n    while (++i < 3) {\n      pi = points[i];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path.push(d3_svg_lineDot4(d3_svg_lineBasisBezier3, px) + \",\" + d3_svg_lineDot4(d3_svg_lineBasisBezier3, py));\n    --i;\n    while (++i < n) {\n      pi = points[i];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBasisClosed(points) {\n    var path, i = -1, n = points.length, m = n + 4, pi, px = [], py = [];\n    while (++i < 4) {\n      pi = points[i % n];\n      px.push(pi[0]);\n      py.push(pi[1]);\n    }\n    path = [ d3_svg_lineDot4(d3_svg_lineBasisBezier3, px), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, py) ];\n    --i;\n    while (++i < m) {\n      pi = points[i % n];\n      px.shift();\n      px.push(pi[0]);\n      py.shift();\n      py.push(pi[1]);\n      d3_svg_lineBasisBezier(path, px, py);\n    }\n    return path.join(\"\");\n  }\n  function d3_svg_lineBundle(points, tension) {\n    var n = points.length - 1;\n    if (n) {\n      var x0 = points[0][0], y0 = points[0][1], dx = points[n][0] - x0, dy = points[n][1] - y0, i = -1, p, t;\n      while (++i <= n) {\n        p = points[i];\n        t = i / n;\n        p[0] = tension * p[0] + (1 - tension) * (x0 + t * dx);\n        p[1] = tension * p[1] + (1 - tension) * (y0 + t * dy);\n      }\n    }\n    return d3_svg_lineBasis(points);\n  }\n  function d3_svg_lineDot4(a, b) {\n    return a[0] * b[0] + a[1] * b[1] + a[2] * b[2] + a[3] * b[3];\n  }\n  var d3_svg_lineBasisBezier1 = [ 0, 2 / 3, 1 / 3, 0 ], d3_svg_lineBasisBezier2 = [ 0, 1 / 3, 2 / 3, 0 ], d3_svg_lineBasisBezier3 = [ 0, 1 / 6, 2 / 3, 1 / 6 ];\n  function d3_svg_lineBasisBezier(path, x, y) {\n    path.push(\"C\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier1, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier2, y), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, x), \",\", d3_svg_lineDot4(d3_svg_lineBasisBezier3, y));\n  }\n  function d3_svg_lineSlope(p0, p1) {\n    return (p1[1] - p0[1]) / (p1[0] - p0[0]);\n  }\n  function d3_svg_lineFiniteDifferences(points) {\n    var i = 0, j = points.length - 1, m = [], p0 = points[0], p1 = points[1], d = m[0] = d3_svg_lineSlope(p0, p1);\n    while (++i < j) {\n      m[i] = (d + (d = d3_svg_lineSlope(p0 = p1, p1 = points[i + 1]))) / 2;\n    }\n    m[i] = d;\n    return m;\n  }\n  function d3_svg_lineMonotoneTangents(points) {\n    var tangents = [], d, a, b, s, m = d3_svg_lineFiniteDifferences(points), i = -1, j = points.length - 1;\n    while (++i < j) {\n      d = d3_svg_lineSlope(points[i], points[i + 1]);\n      if (abs(d) < ε) {\n        m[i] = m[i + 1] = 0;\n      } else {\n        a = m[i] / d;\n        b = m[i + 1] / d;\n        s = a * a + b * b;\n        if (s > 9) {\n          s = d * 3 / Math.sqrt(s);\n          m[i] = s * a;\n          m[i + 1] = s * b;\n        }\n      }\n    }\n    i = -1;\n    while (++i <= j) {\n      s = (points[Math.min(j, i + 1)][0] - points[Math.max(0, i - 1)][0]) / (6 * (1 + m[i] * m[i]));\n      tangents.push([ s || 0, m[i] * s || 0 ]);\n    }\n    return tangents;\n  }\n  function d3_svg_lineMonotone(points) {\n    return points.length < 3 ? d3_svg_lineLinear(points) : points[0] + d3_svg_lineHermite(points, d3_svg_lineMonotoneTangents(points));\n  }\n  d3.svg.line.radial = function() {\n    var line = d3_svg_line(d3_svg_lineRadial);\n    line.radius = line.x, delete line.x;\n    line.angle = line.y, delete line.y;\n    return line;\n  };\n  function d3_svg_lineRadial(points) {\n    var point, i = -1, n = points.length, r, a;\n    while (++i < n) {\n      point = points[i];\n      r = point[0];\n      a = point[1] - halfπ;\n      point[0] = r * Math.cos(a);\n      point[1] = r * Math.sin(a);\n    }\n    return points;\n  }\n  function d3_svg_area(projection) {\n    var x0 = d3_geom_pointX, x1 = d3_geom_pointX, y0 = 0, y1 = d3_geom_pointY, defined = d3_true, interpolate = d3_svg_lineLinear, interpolateKey = interpolate.key, interpolateReverse = interpolate, L = \"L\", tension = .7;\n    function area(data) {\n      var segments = [], points0 = [], points1 = [], i = -1, n = data.length, d, fx0 = d3_functor(x0), fy0 = d3_functor(y0), fx1 = x0 === x1 ? function() {\n        return x;\n      } : d3_functor(x1), fy1 = y0 === y1 ? function() {\n        return y;\n      } : d3_functor(y1), x, y;\n      function segment() {\n        segments.push(\"M\", interpolate(projection(points1), tension), L, interpolateReverse(projection(points0.reverse()), tension), \"Z\");\n      }\n      while (++i < n) {\n        if (defined.call(this, d = data[i], i)) {\n          points0.push([ x = +fx0.call(this, d, i), y = +fy0.call(this, d, i) ]);\n          points1.push([ +fx1.call(this, d, i), +fy1.call(this, d, i) ]);\n        } else if (points0.length) {\n          segment();\n          points0 = [];\n          points1 = [];\n        }\n      }\n      if (points0.length) segment();\n      return segments.length ? segments.join(\"\") : null;\n    }\n    area.x = function(_) {\n      if (!arguments.length) return x1;\n      x0 = x1 = _;\n      return area;\n    };\n    area.x0 = function(_) {\n      if (!arguments.length) return x0;\n      x0 = _;\n      return area;\n    };\n    area.x1 = function(_) {\n      if (!arguments.length) return x1;\n      x1 = _;\n      return area;\n    };\n    area.y = function(_) {\n      if (!arguments.length) return y1;\n      y0 = y1 = _;\n      return area;\n    };\n    area.y0 = function(_) {\n      if (!arguments.length) return y0;\n      y0 = _;\n      return area;\n    };\n    area.y1 = function(_) {\n      if (!arguments.length) return y1;\n      y1 = _;\n      return area;\n    };\n    area.defined = function(_) {\n      if (!arguments.length) return defined;\n      defined = _;\n      return area;\n    };\n    area.interpolate = function(_) {\n      if (!arguments.length) return interpolateKey;\n      if (typeof _ === \"function\") interpolateKey = interpolate = _; else interpolateKey = (interpolate = d3_svg_lineInterpolators.get(_) || d3_svg_lineLinear).key;\n      interpolateReverse = interpolate.reverse || interpolate;\n      L = interpolate.closed ? \"M\" : \"L\";\n      return area;\n    };\n    area.tension = function(_) {\n      if (!arguments.length) return tension;\n      tension = _;\n      return area;\n    };\n    return area;\n  }\n  d3_svg_lineStepBefore.reverse = d3_svg_lineStepAfter;\n  d3_svg_lineStepAfter.reverse = d3_svg_lineStepBefore;\n  d3.svg.area = function() {\n    return d3_svg_area(d3_identity);\n  };\n  d3.svg.area.radial = function() {\n    var area = d3_svg_area(d3_svg_lineRadial);\n    area.radius = area.x, delete area.x;\n    area.innerRadius = area.x0, delete area.x0;\n    area.outerRadius = area.x1, delete area.x1;\n    area.angle = area.y, delete area.y;\n    area.startAngle = area.y0, delete area.y0;\n    area.endAngle = area.y1, delete area.y1;\n    return area;\n  };\n  d3.svg.chord = function() {\n    var source = d3_source, target = d3_target, radius = d3_svg_chordRadius, startAngle = d3_svg_arcStartAngle, endAngle = d3_svg_arcEndAngle;\n    function chord(d, i) {\n      var s = subgroup(this, source, d, i), t = subgroup(this, target, d, i);\n      return \"M\" + s.p0 + arc(s.r, s.p1, s.a1 - s.a0) + (equals(s, t) ? curve(s.r, s.p1, s.r, s.p0) : curve(s.r, s.p1, t.r, t.p0) + arc(t.r, t.p1, t.a1 - t.a0) + curve(t.r, t.p1, s.r, s.p0)) + \"Z\";\n    }\n    function subgroup(self, f, d, i) {\n      var subgroup = f.call(self, d, i), r = radius.call(self, subgroup, i), a0 = startAngle.call(self, subgroup, i) - halfπ, a1 = endAngle.call(self, subgroup, i) - halfπ;\n      return {\n        r: r,\n        a0: a0,\n        a1: a1,\n        p0: [ r * Math.cos(a0), r * Math.sin(a0) ],\n        p1: [ r * Math.cos(a1), r * Math.sin(a1) ]\n      };\n    }\n    function equals(a, b) {\n      return a.a0 == b.a0 && a.a1 == b.a1;\n    }\n    function arc(r, p, a) {\n      return \"A\" + r + \",\" + r + \" 0 \" + +(a > π) + \",1 \" + p;\n    }\n    function curve(r0, p0, r1, p1) {\n      return \"Q 0,0 \" + p1;\n    }\n    chord.radius = function(v) {\n      if (!arguments.length) return radius;\n      radius = d3_functor(v);\n      return chord;\n    };\n    chord.source = function(v) {\n      if (!arguments.length) return source;\n      source = d3_functor(v);\n      return chord;\n    };\n    chord.target = function(v) {\n      if (!arguments.length) return target;\n      target = d3_functor(v);\n      return chord;\n    };\n    chord.startAngle = function(v) {\n      if (!arguments.length) return startAngle;\n      startAngle = d3_functor(v);\n      return chord;\n    };\n    chord.endAngle = function(v) {\n      if (!arguments.length) return endAngle;\n      endAngle = d3_functor(v);\n      return chord;\n    };\n    return chord;\n  };\n  function d3_svg_chordRadius(d) {\n    return d.radius;\n  }\n  d3.svg.diagonal = function() {\n    var source = d3_source, target = d3_target, projection = d3_svg_diagonalProjection;\n    function diagonal(d, i) {\n      var p0 = source.call(this, d, i), p3 = target.call(this, d, i), m = (p0.y + p3.y) / 2, p = [ p0, {\n        x: p0.x,\n        y: m\n      }, {\n        x: p3.x,\n        y: m\n      }, p3 ];\n      p = p.map(projection);\n      return \"M\" + p[0] + \"C\" + p[1] + \" \" + p[2] + \" \" + p[3];\n    }\n    diagonal.source = function(x) {\n      if (!arguments.length) return source;\n      source = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.target = function(x) {\n      if (!arguments.length) return target;\n      target = d3_functor(x);\n      return diagonal;\n    };\n    diagonal.projection = function(x) {\n      if (!arguments.length) return projection;\n      projection = x;\n      return diagonal;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalProjection(d) {\n    return [ d.x, d.y ];\n  }\n  d3.svg.diagonal.radial = function() {\n    var diagonal = d3.svg.diagonal(), projection = d3_svg_diagonalProjection, projection_ = diagonal.projection;\n    diagonal.projection = function(x) {\n      return arguments.length ? projection_(d3_svg_diagonalRadialProjection(projection = x)) : projection;\n    };\n    return diagonal;\n  };\n  function d3_svg_diagonalRadialProjection(projection) {\n    return function() {\n      var d = projection.apply(this, arguments), r = d[0], a = d[1] - halfπ;\n      return [ r * Math.cos(a), r * Math.sin(a) ];\n    };\n  }\n  d3.svg.symbol = function() {\n    var type = d3_svg_symbolType, size = d3_svg_symbolSize;\n    function symbol(d, i) {\n      return (d3_svg_symbols.get(type.call(this, d, i)) || d3_svg_symbolCircle)(size.call(this, d, i));\n    }\n    symbol.type = function(x) {\n      if (!arguments.length) return type;\n      type = d3_functor(x);\n      return symbol;\n    };\n    symbol.size = function(x) {\n      if (!arguments.length) return size;\n      size = d3_functor(x);\n      return symbol;\n    };\n    return symbol;\n  };\n  function d3_svg_symbolSize() {\n    return 64;\n  }\n  function d3_svg_symbolType() {\n    return \"circle\";\n  }\n  function d3_svg_symbolCircle(size) {\n    var r = Math.sqrt(size / π);\n    return \"M0,\" + r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + -r + \"A\" + r + \",\" + r + \" 0 1,1 0,\" + r + \"Z\";\n  }\n  var d3_svg_symbols = d3.map({\n    circle: d3_svg_symbolCircle,\n    cross: function(size) {\n      var r = Math.sqrt(size / 5) / 2;\n      return \"M\" + -3 * r + \",\" + -r + \"H\" + -r + \"V\" + -3 * r + \"H\" + r + \"V\" + -r + \"H\" + 3 * r + \"V\" + r + \"H\" + r + \"V\" + 3 * r + \"H\" + -r + \"V\" + r + \"H\" + -3 * r + \"Z\";\n    },\n    diamond: function(size) {\n      var ry = Math.sqrt(size / (2 * d3_svg_symbolTan30)), rx = ry * d3_svg_symbolTan30;\n      return \"M0,\" + -ry + \"L\" + rx + \",0\" + \" 0,\" + ry + \" \" + -rx + \",0\" + \"Z\";\n    },\n    square: function(size) {\n      var r = Math.sqrt(size) / 2;\n      return \"M\" + -r + \",\" + -r + \"L\" + r + \",\" + -r + \" \" + r + \",\" + r + \" \" + -r + \",\" + r + \"Z\";\n    },\n    \"triangle-down\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + ry + \"L\" + rx + \",\" + -ry + \" \" + -rx + \",\" + -ry + \"Z\";\n    },\n    \"triangle-up\": function(size) {\n      var rx = Math.sqrt(size / d3_svg_symbolSqrt3), ry = rx * d3_svg_symbolSqrt3 / 2;\n      return \"M0,\" + -ry + \"L\" + rx + \",\" + ry + \" \" + -rx + \",\" + ry + \"Z\";\n    }\n  });\n  d3.svg.symbolTypes = d3_svg_symbols.keys();\n  var d3_svg_symbolSqrt3 = Math.sqrt(3), d3_svg_symbolTan30 = Math.tan(30 * d3_radians);\n  d3_selectionPrototype.transition = function(name) {\n    var id = d3_transitionInheritId || ++d3_transitionId, ns = d3_transitionNamespace(name), subgroups = [], subgroup, node, transition = d3_transitionInherit || {\n      time: Date.now(),\n      ease: d3_ease_cubicInOut,\n      delay: 0,\n      duration: 250\n    };\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) d3_transitionNode(node, i, ns, id, transition);\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_selectionPrototype.interrupt = function(name) {\n    return this.each(name == null ? d3_selection_interrupt : d3_selection_interruptNS(d3_transitionNamespace(name)));\n  };\n  var d3_selection_interrupt = d3_selection_interruptNS(d3_transitionNamespace());\n  function d3_selection_interruptNS(ns) {\n    return function() {\n      var lock, activeId, active;\n      if ((lock = this[ns]) && (active = lock[activeId = lock.active])) {\n        active.timer.c = null;\n        active.timer.t = NaN;\n        if (--lock.count) delete lock[activeId]; else delete this[ns];\n        lock.active += .5;\n        active.event && active.event.interrupt.call(this, this.__data__, active.index);\n      }\n    };\n  }\n  function d3_transition(groups, ns, id) {\n    d3_subclass(groups, d3_transitionPrototype);\n    groups.namespace = ns;\n    groups.id = id;\n    return groups;\n  }\n  var d3_transitionPrototype = [], d3_transitionId = 0, d3_transitionInheritId, d3_transitionInherit;\n  d3_transitionPrototype.call = d3_selectionPrototype.call;\n  d3_transitionPrototype.empty = d3_selectionPrototype.empty;\n  d3_transitionPrototype.node = d3_selectionPrototype.node;\n  d3_transitionPrototype.size = d3_selectionPrototype.size;\n  d3.transition = function(selection, name) {\n    return selection && selection.transition ? d3_transitionInheritId ? selection.transition(name) : selection : d3.selection().transition(selection);\n  };\n  d3.transition.prototype = d3_transitionPrototype;\n  d3_transitionPrototype.select = function(selector) {\n    var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnode, node;\n    selector = d3_selection_selector(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if ((node = group[i]) && (subnode = selector.call(node, node.__data__, i, j))) {\n          if (\"__data__\" in node) subnode.__data__ = node.__data__;\n          d3_transitionNode(subnode, i, ns, id, node[ns][id]);\n          subgroup.push(subnode);\n        } else {\n          subgroup.push(null);\n        }\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_transitionPrototype.selectAll = function(selector) {\n    var id = this.id, ns = this.namespace, subgroups = [], subgroup, subnodes, node, subnode, transition;\n    selector = d3_selection_selectorAll(selector);\n    for (var j = -1, m = this.length; ++j < m; ) {\n      for (var group = this[j], i = -1, n = group.length; ++i < n; ) {\n        if (node = group[i]) {\n          transition = node[ns][id];\n          subnodes = selector.call(node, node.__data__, i, j);\n          subgroups.push(subgroup = []);\n          for (var k = -1, o = subnodes.length; ++k < o; ) {\n            if (subnode = subnodes[k]) d3_transitionNode(subnode, k, ns, id, transition);\n            subgroup.push(subnode);\n          }\n        }\n      }\n    }\n    return d3_transition(subgroups, ns, id);\n  };\n  d3_transitionPrototype.filter = function(filter) {\n    var subgroups = [], subgroup, group, node;\n    if (typeof filter !== \"function\") filter = d3_selection_filter(filter);\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if ((node = group[i]) && filter.call(node, node.__data__, i, j)) {\n          subgroup.push(node);\n        }\n      }\n    }\n    return d3_transition(subgroups, this.namespace, this.id);\n  };\n  d3_transitionPrototype.tween = function(name, tween) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 2) return this.node()[ns][id].tween.get(name);\n    return d3_selection_each(this, tween == null ? function(node) {\n      node[ns][id].tween.remove(name);\n    } : function(node) {\n      node[ns][id].tween.set(name, tween);\n    });\n  };\n  function d3_transition_tween(groups, name, value, tween) {\n    var id = groups.id, ns = groups.namespace;\n    return d3_selection_each(groups, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].tween.set(name, tween(value.call(node, node.__data__, i, j)));\n    } : (value = tween(value), function(node) {\n      node[ns][id].tween.set(name, value);\n    }));\n  }\n  d3_transitionPrototype.attr = function(nameNS, value) {\n    if (arguments.length < 2) {\n      for (value in nameNS) this.attr(value, nameNS[value]);\n      return this;\n    }\n    var interpolate = nameNS == \"transform\" ? d3_interpolateTransform : d3_interpolate, name = d3.ns.qualify(nameNS);\n    function attrNull() {\n      this.removeAttribute(name);\n    }\n    function attrNullNS() {\n      this.removeAttributeNS(name.space, name.local);\n    }\n    function attrTween(b) {\n      return b == null ? attrNull : (b += \"\", function() {\n        var a = this.getAttribute(name), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttribute(name, i(t));\n        });\n      });\n    }\n    function attrTweenNS(b) {\n      return b == null ? attrNullNS : (b += \"\", function() {\n        var a = this.getAttributeNS(name.space, name.local), i;\n        return a !== b && (i = interpolate(a, b), function(t) {\n          this.setAttributeNS(name.space, name.local, i(t));\n        });\n      });\n    }\n    return d3_transition_tween(this, \"attr.\" + nameNS, value, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.attrTween = function(nameNS, tween) {\n    var name = d3.ns.qualify(nameNS);\n    function attrTween(d, i) {\n      var f = tween.call(this, d, i, this.getAttribute(name));\n      return f && function(t) {\n        this.setAttribute(name, f(t));\n      };\n    }\n    function attrTweenNS(d, i) {\n      var f = tween.call(this, d, i, this.getAttributeNS(name.space, name.local));\n      return f && function(t) {\n        this.setAttributeNS(name.space, name.local, f(t));\n      };\n    }\n    return this.tween(\"attr.\" + nameNS, name.local ? attrTweenNS : attrTween);\n  };\n  d3_transitionPrototype.style = function(name, value, priority) {\n    var n = arguments.length;\n    if (n < 3) {\n      if (typeof name !== \"string\") {\n        if (n < 2) value = \"\";\n        for (priority in name) this.style(priority, name[priority], value);\n        return this;\n      }\n      priority = \"\";\n    }\n    function styleNull() {\n      this.style.removeProperty(name);\n    }\n    function styleString(b) {\n      return b == null ? styleNull : (b += \"\", function() {\n        var a = d3_window(this).getComputedStyle(this, null).getPropertyValue(name), i;\n        return a !== b && (i = d3_interpolate(a, b), function(t) {\n          this.style.setProperty(name, i(t), priority);\n        });\n      });\n    }\n    return d3_transition_tween(this, \"style.\" + name, value, styleString);\n  };\n  d3_transitionPrototype.styleTween = function(name, tween, priority) {\n    if (arguments.length < 3) priority = \"\";\n    function styleTween(d, i) {\n      var f = tween.call(this, d, i, d3_window(this).getComputedStyle(this, null).getPropertyValue(name));\n      return f && function(t) {\n        this.style.setProperty(name, f(t), priority);\n      };\n    }\n    return this.tween(\"style.\" + name, styleTween);\n  };\n  d3_transitionPrototype.text = function(value) {\n    return d3_transition_tween(this, \"text\", value, d3_transition_text);\n  };\n  function d3_transition_text(b) {\n    if (b == null) b = \"\";\n    return function() {\n      this.textContent = b;\n    };\n  }\n  d3_transitionPrototype.remove = function() {\n    var ns = this.namespace;\n    return this.each(\"end.transition\", function() {\n      var p;\n      if (this[ns].count < 2 && (p = this.parentNode)) p.removeChild(this);\n    });\n  };\n  d3_transitionPrototype.ease = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].ease;\n    if (typeof value !== \"function\") value = d3.ease.apply(d3, arguments);\n    return d3_selection_each(this, function(node) {\n      node[ns][id].ease = value;\n    });\n  };\n  d3_transitionPrototype.delay = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].delay;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].delay = +value.call(node, node.__data__, i, j);\n    } : (value = +value, function(node) {\n      node[ns][id].delay = value;\n    }));\n  };\n  d3_transitionPrototype.duration = function(value) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 1) return this.node()[ns][id].duration;\n    return d3_selection_each(this, typeof value === \"function\" ? function(node, i, j) {\n      node[ns][id].duration = Math.max(1, value.call(node, node.__data__, i, j));\n    } : (value = Math.max(1, value), function(node) {\n      node[ns][id].duration = value;\n    }));\n  };\n  d3_transitionPrototype.each = function(type, listener) {\n    var id = this.id, ns = this.namespace;\n    if (arguments.length < 2) {\n      var inherit = d3_transitionInherit, inheritId = d3_transitionInheritId;\n      try {\n        d3_transitionInheritId = id;\n        d3_selection_each(this, function(node, i, j) {\n          d3_transitionInherit = node[ns][id];\n          type.call(node, node.__data__, i, j);\n        });\n      } finally {\n        d3_transitionInherit = inherit;\n        d3_transitionInheritId = inheritId;\n      }\n    } else {\n      d3_selection_each(this, function(node) {\n        var transition = node[ns][id];\n        (transition.event || (transition.event = d3.dispatch(\"start\", \"end\", \"interrupt\"))).on(type, listener);\n      });\n    }\n    return this;\n  };\n  d3_transitionPrototype.transition = function() {\n    var id0 = this.id, id1 = ++d3_transitionId, ns = this.namespace, subgroups = [], subgroup, group, node, transition;\n    for (var j = 0, m = this.length; j < m; j++) {\n      subgroups.push(subgroup = []);\n      for (var group = this[j], i = 0, n = group.length; i < n; i++) {\n        if (node = group[i]) {\n          transition = node[ns][id0];\n          d3_transitionNode(node, i, ns, id1, {\n            time: transition.time,\n            ease: transition.ease,\n            delay: transition.delay + transition.duration,\n            duration: transition.duration\n          });\n        }\n        subgroup.push(node);\n      }\n    }\n    return d3_transition(subgroups, ns, id1);\n  };\n  function d3_transitionNamespace(name) {\n    return name == null ? \"__transition__\" : \"__transition_\" + name + \"__\";\n  }\n  function d3_transitionNode(node, i, ns, id, inherit) {\n    var lock = node[ns] || (node[ns] = {\n      active: 0,\n      count: 0\n    }), transition = lock[id], time, timer, duration, ease, tweens;\n    function schedule(elapsed) {\n      var delay = transition.delay;\n      timer.t = delay + time;\n      if (delay <= elapsed) return start(elapsed - delay);\n      timer.c = start;\n    }\n    function start(elapsed) {\n      var activeId = lock.active, active = lock[activeId];\n      if (active) {\n        active.timer.c = null;\n        active.timer.t = NaN;\n        --lock.count;\n        delete lock[activeId];\n        active.event && active.event.interrupt.call(node, node.__data__, active.index);\n      }\n      for (var cancelId in lock) {\n        if (+cancelId < id) {\n          var cancel = lock[cancelId];\n          cancel.timer.c = null;\n          cancel.timer.t = NaN;\n          --lock.count;\n          delete lock[cancelId];\n        }\n      }\n      timer.c = tick;\n      d3_timer(function() {\n        if (timer.c && tick(elapsed || 1)) {\n          timer.c = null;\n          timer.t = NaN;\n        }\n        return 1;\n      }, 0, time);\n      lock.active = id;\n      transition.event && transition.event.start.call(node, node.__data__, i);\n      tweens = [];\n      transition.tween.forEach(function(key, value) {\n        if (value = value.call(node, node.__data__, i)) {\n          tweens.push(value);\n        }\n      });\n      ease = transition.ease;\n      duration = transition.duration;\n    }\n    function tick(elapsed) {\n      var t = elapsed / duration, e = ease(t), n = tweens.length;\n      while (n > 0) {\n        tweens[--n].call(node, e);\n      }\n      if (t >= 1) {\n        transition.event && transition.event.end.call(node, node.__data__, i);\n        if (--lock.count) delete lock[id]; else delete node[ns];\n        return 1;\n      }\n    }\n    if (!transition) {\n      time = inherit.time;\n      timer = d3_timer(schedule, 0, time);\n      transition = lock[id] = {\n        tween: new d3_Map(),\n        time: time,\n        timer: timer,\n        delay: inherit.delay,\n        duration: inherit.duration,\n        ease: inherit.ease,\n        index: i\n      };\n      inherit = null;\n      ++lock.count;\n    }\n  }\n  d3.svg.axis = function() {\n    var scale = d3.scale.linear(), orient = d3_svg_axisDefaultOrient, innerTickSize = 6, outerTickSize = 6, tickPadding = 3, tickArguments_ = [ 10 ], tickValues = null, tickFormat_;\n    function axis(g) {\n      g.each(function() {\n        var g = d3.select(this);\n        var scale0 = this.__chart__ || scale, scale1 = this.__chart__ = scale.copy();\n        var ticks = tickValues == null ? scale1.ticks ? scale1.ticks.apply(scale1, tickArguments_) : scale1.domain() : tickValues, tickFormat = tickFormat_ == null ? scale1.tickFormat ? scale1.tickFormat.apply(scale1, tickArguments_) : d3_identity : tickFormat_, tick = g.selectAll(\".tick\").data(ticks, scale1), tickEnter = tick.enter().insert(\"g\", \".domain\").attr(\"class\", \"tick\").style(\"opacity\", ε), tickExit = d3.transition(tick.exit()).style(\"opacity\", ε).remove(), tickUpdate = d3.transition(tick.order()).style(\"opacity\", 1), tickSpacing = Math.max(innerTickSize, 0) + tickPadding, tickTransform;\n        var range = d3_scaleRange(scale1), path = g.selectAll(\".domain\").data([ 0 ]), pathUpdate = (path.enter().append(\"path\").attr(\"class\", \"domain\"), \n        d3.transition(path));\n        tickEnter.append(\"line\");\n        tickEnter.append(\"text\");\n        var lineEnter = tickEnter.select(\"line\"), lineUpdate = tickUpdate.select(\"line\"), text = tick.select(\"text\").text(tickFormat), textEnter = tickEnter.select(\"text\"), textUpdate = tickUpdate.select(\"text\"), sign = orient === \"top\" || orient === \"left\" ? -1 : 1, x1, x2, y1, y2;\n        if (orient === \"bottom\" || orient === \"top\") {\n          tickTransform = d3_svg_axisX, x1 = \"x\", y1 = \"y\", x2 = \"x2\", y2 = \"y2\";\n          text.attr(\"dy\", sign < 0 ? \"0em\" : \".71em\").style(\"text-anchor\", \"middle\");\n          pathUpdate.attr(\"d\", \"M\" + range[0] + \",\" + sign * outerTickSize + \"V0H\" + range[1] + \"V\" + sign * outerTickSize);\n        } else {\n          tickTransform = d3_svg_axisY, x1 = \"y\", y1 = \"x\", x2 = \"y2\", y2 = \"x2\";\n          text.attr(\"dy\", \".32em\").style(\"text-anchor\", sign < 0 ? \"end\" : \"start\");\n          pathUpdate.attr(\"d\", \"M\" + sign * outerTickSize + \",\" + range[0] + \"H0V\" + range[1] + \"H\" + sign * outerTickSize);\n        }\n        lineEnter.attr(y2, sign * innerTickSize);\n        textEnter.attr(y1, sign * tickSpacing);\n        lineUpdate.attr(x2, 0).attr(y2, sign * innerTickSize);\n        textUpdate.attr(x1, 0).attr(y1, sign * tickSpacing);\n        if (scale1.rangeBand) {\n          var x = scale1, dx = x.rangeBand() / 2;\n          scale0 = scale1 = function(d) {\n            return x(d) + dx;\n          };\n        } else if (scale0.rangeBand) {\n          scale0 = scale1;\n        } else {\n          tickExit.call(tickTransform, scale1, scale0);\n        }\n        tickEnter.call(tickTransform, scale0, scale1);\n        tickUpdate.call(tickTransform, scale1, scale1);\n      });\n    }\n    axis.scale = function(x) {\n      if (!arguments.length) return scale;\n      scale = x;\n      return axis;\n    };\n    axis.orient = function(x) {\n      if (!arguments.length) return orient;\n      orient = x in d3_svg_axisOrients ? x + \"\" : d3_svg_axisDefaultOrient;\n      return axis;\n    };\n    axis.ticks = function() {\n      if (!arguments.length) return tickArguments_;\n      tickArguments_ = d3_array(arguments);\n      return axis;\n    };\n    axis.tickValues = function(x) {\n      if (!arguments.length) return tickValues;\n      tickValues = x;\n      return axis;\n    };\n    axis.tickFormat = function(x) {\n      if (!arguments.length) return tickFormat_;\n      tickFormat_ = x;\n      return axis;\n    };\n    axis.tickSize = function(x) {\n      var n = arguments.length;\n      if (!n) return innerTickSize;\n      innerTickSize = +x;\n      outerTickSize = +arguments[n - 1];\n      return axis;\n    };\n    axis.innerTickSize = function(x) {\n      if (!arguments.length) return innerTickSize;\n      innerTickSize = +x;\n      return axis;\n    };\n    axis.outerTickSize = function(x) {\n      if (!arguments.length) return outerTickSize;\n      outerTickSize = +x;\n      return axis;\n    };\n    axis.tickPadding = function(x) {\n      if (!arguments.length) return tickPadding;\n      tickPadding = +x;\n      return axis;\n    };\n    axis.tickSubdivide = function() {\n      return arguments.length && axis;\n    };\n    return axis;\n  };\n  var d3_svg_axisDefaultOrient = \"bottom\", d3_svg_axisOrients = {\n    top: 1,\n    right: 1,\n    bottom: 1,\n    left: 1\n  };\n  function d3_svg_axisX(selection, x0, x1) {\n    selection.attr(\"transform\", function(d) {\n      var v0 = x0(d);\n      return \"translate(\" + (isFinite(v0) ? v0 : x1(d)) + \",0)\";\n    });\n  }\n  function d3_svg_axisY(selection, y0, y1) {\n    selection.attr(\"transform\", function(d) {\n      var v0 = y0(d);\n      return \"translate(0,\" + (isFinite(v0) ? v0 : y1(d)) + \")\";\n    });\n  }\n  d3.svg.brush = function() {\n    var event = d3_eventDispatch(brush, \"brushstart\", \"brush\", \"brushend\"), x = null, y = null, xExtent = [ 0, 0 ], yExtent = [ 0, 0 ], xExtentDomain, yExtentDomain, xClamp = true, yClamp = true, resizes = d3_svg_brushResizes[0];\n    function brush(g) {\n      g.each(function() {\n        var g = d3.select(this).style(\"pointer-events\", \"all\").style(\"-webkit-tap-highlight-color\", \"rgba(0,0,0,0)\").on(\"mousedown.brush\", brushstart).on(\"touchstart.brush\", brushstart);\n        var background = g.selectAll(\".background\").data([ 0 ]);\n        background.enter().append(\"rect\").attr(\"class\", \"background\").style(\"visibility\", \"hidden\").style(\"cursor\", \"crosshair\");\n        g.selectAll(\".extent\").data([ 0 ]).enter().append(\"rect\").attr(\"class\", \"extent\").style(\"cursor\", \"move\");\n        var resize = g.selectAll(\".resize\").data(resizes, d3_identity);\n        resize.exit().remove();\n        resize.enter().append(\"g\").attr(\"class\", function(d) {\n          return \"resize \" + d;\n        }).style(\"cursor\", function(d) {\n          return d3_svg_brushCursor[d];\n        }).append(\"rect\").attr(\"x\", function(d) {\n          return /[ew]$/.test(d) ? -3 : null;\n        }).attr(\"y\", function(d) {\n          return /^[ns]/.test(d) ? -3 : null;\n        }).attr(\"width\", 6).attr(\"height\", 6).style(\"visibility\", \"hidden\");\n        resize.style(\"display\", brush.empty() ? \"none\" : null);\n        var gUpdate = d3.transition(g), backgroundUpdate = d3.transition(background), range;\n        if (x) {\n          range = d3_scaleRange(x);\n          backgroundUpdate.attr(\"x\", range[0]).attr(\"width\", range[1] - range[0]);\n          redrawX(gUpdate);\n        }\n        if (y) {\n          range = d3_scaleRange(y);\n          backgroundUpdate.attr(\"y\", range[0]).attr(\"height\", range[1] - range[0]);\n          redrawY(gUpdate);\n        }\n        redraw(gUpdate);\n      });\n    }\n    brush.event = function(g) {\n      g.each(function() {\n        var event_ = event.of(this, arguments), extent1 = {\n          x: xExtent,\n          y: yExtent,\n          i: xExtentDomain,\n          j: yExtentDomain\n        }, extent0 = this.__chart__ || extent1;\n        this.__chart__ = extent1;\n        if (d3_transitionInheritId) {\n          d3.select(this).transition().each(\"start.brush\", function() {\n            xExtentDomain = extent0.i;\n            yExtentDomain = extent0.j;\n            xExtent = extent0.x;\n            yExtent = extent0.y;\n            event_({\n              type: \"brushstart\"\n            });\n          }).tween(\"brush:brush\", function() {\n            var xi = d3_interpolateArray(xExtent, extent1.x), yi = d3_interpolateArray(yExtent, extent1.y);\n            xExtentDomain = yExtentDomain = null;\n            return function(t) {\n              xExtent = extent1.x = xi(t);\n              yExtent = extent1.y = yi(t);\n              event_({\n                type: \"brush\",\n                mode: \"resize\"\n              });\n            };\n          }).each(\"end.brush\", function() {\n            xExtentDomain = extent1.i;\n            yExtentDomain = extent1.j;\n            event_({\n              type: \"brush\",\n              mode: \"resize\"\n            });\n            event_({\n              type: \"brushend\"\n            });\n          });\n        } else {\n          event_({\n            type: \"brushstart\"\n          });\n          event_({\n            type: \"brush\",\n            mode: \"resize\"\n          });\n          event_({\n            type: \"brushend\"\n          });\n        }\n      });\n    };\n    function redraw(g) {\n      g.selectAll(\".resize\").attr(\"transform\", function(d) {\n        return \"translate(\" + xExtent[+/e$/.test(d)] + \",\" + yExtent[+/^s/.test(d)] + \")\";\n      });\n    }\n    function redrawX(g) {\n      g.select(\".extent\").attr(\"x\", xExtent[0]);\n      g.selectAll(\".extent,.n>rect,.s>rect\").attr(\"width\", xExtent[1] - xExtent[0]);\n    }\n    function redrawY(g) {\n      g.select(\".extent\").attr(\"y\", yExtent[0]);\n      g.selectAll(\".extent,.e>rect,.w>rect\").attr(\"height\", yExtent[1] - yExtent[0]);\n    }\n    function brushstart() {\n      var target = this, eventTarget = d3.select(d3.event.target), event_ = event.of(target, arguments), g = d3.select(target), resizing = eventTarget.datum(), resizingX = !/^(n|s)$/.test(resizing) && x, resizingY = !/^(e|w)$/.test(resizing) && y, dragging = eventTarget.classed(\"extent\"), dragRestore = d3_event_dragSuppress(target), center, origin = d3.mouse(target), offset;\n      var w = d3.select(d3_window(target)).on(\"keydown.brush\", keydown).on(\"keyup.brush\", keyup);\n      if (d3.event.changedTouches) {\n        w.on(\"touchmove.brush\", brushmove).on(\"touchend.brush\", brushend);\n      } else {\n        w.on(\"mousemove.brush\", brushmove).on(\"mouseup.brush\", brushend);\n      }\n      g.interrupt().selectAll(\"*\").interrupt();\n      if (dragging) {\n        origin[0] = xExtent[0] - origin[0];\n        origin[1] = yExtent[0] - origin[1];\n      } else if (resizing) {\n        var ex = +/w$/.test(resizing), ey = +/^n/.test(resizing);\n        offset = [ xExtent[1 - ex] - origin[0], yExtent[1 - ey] - origin[1] ];\n        origin[0] = xExtent[ex];\n        origin[1] = yExtent[ey];\n      } else if (d3.event.altKey) center = origin.slice();\n      g.style(\"pointer-events\", \"none\").selectAll(\".resize\").style(\"display\", null);\n      d3.select(\"body\").style(\"cursor\", eventTarget.style(\"cursor\"));\n      event_({\n        type: \"brushstart\"\n      });\n      brushmove();\n      function keydown() {\n        if (d3.event.keyCode == 32) {\n          if (!dragging) {\n            center = null;\n            origin[0] -= xExtent[1];\n            origin[1] -= yExtent[1];\n            dragging = 2;\n          }\n          d3_eventPreventDefault();\n        }\n      }\n      function keyup() {\n        if (d3.event.keyCode == 32 && dragging == 2) {\n          origin[0] += xExtent[1];\n          origin[1] += yExtent[1];\n          dragging = 0;\n          d3_eventPreventDefault();\n        }\n      }\n      function brushmove() {\n        var point = d3.mouse(target), moved = false;\n        if (offset) {\n          point[0] += offset[0];\n          point[1] += offset[1];\n        }\n        if (!dragging) {\n          if (d3.event.altKey) {\n            if (!center) center = [ (xExtent[0] + xExtent[1]) / 2, (yExtent[0] + yExtent[1]) / 2 ];\n            origin[0] = xExtent[+(point[0] < center[0])];\n            origin[1] = yExtent[+(point[1] < center[1])];\n          } else center = null;\n        }\n        if (resizingX && move1(point, x, 0)) {\n          redrawX(g);\n          moved = true;\n        }\n        if (resizingY && move1(point, y, 1)) {\n          redrawY(g);\n          moved = true;\n        }\n        if (moved) {\n          redraw(g);\n          event_({\n            type: \"brush\",\n            mode: dragging ? \"move\" : \"resize\"\n          });\n        }\n      }\n      function move1(point, scale, i) {\n        var range = d3_scaleRange(scale), r0 = range[0], r1 = range[1], position = origin[i], extent = i ? yExtent : xExtent, size = extent[1] - extent[0], min, max;\n        if (dragging) {\n          r0 -= position;\n          r1 -= size + position;\n        }\n        min = (i ? yClamp : xClamp) ? Math.max(r0, Math.min(r1, point[i])) : point[i];\n        if (dragging) {\n          max = (min += position) + size;\n        } else {\n          if (center) position = Math.max(r0, Math.min(r1, 2 * center[i] - min));\n          if (position < min) {\n            max = min;\n            min = position;\n          } else {\n            max = position;\n          }\n        }\n        if (extent[0] != min || extent[1] != max) {\n          if (i) yExtentDomain = null; else xExtentDomain = null;\n          extent[0] = min;\n          extent[1] = max;\n          return true;\n        }\n      }\n      function brushend() {\n        brushmove();\n        g.style(\"pointer-events\", \"all\").selectAll(\".resize\").style(\"display\", brush.empty() ? \"none\" : null);\n        d3.select(\"body\").style(\"cursor\", null);\n        w.on(\"mousemove.brush\", null).on(\"mouseup.brush\", null).on(\"touchmove.brush\", null).on(\"touchend.brush\", null).on(\"keydown.brush\", null).on(\"keyup.brush\", null);\n        dragRestore();\n        event_({\n          type: \"brushend\"\n        });\n      }\n    }\n    brush.x = function(z) {\n      if (!arguments.length) return x;\n      x = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.y = function(z) {\n      if (!arguments.length) return y;\n      y = z;\n      resizes = d3_svg_brushResizes[!x << 1 | !y];\n      return brush;\n    };\n    brush.clamp = function(z) {\n      if (!arguments.length) return x && y ? [ xClamp, yClamp ] : x ? xClamp : y ? yClamp : null;\n      if (x && y) xClamp = !!z[0], yClamp = !!z[1]; else if (x) xClamp = !!z; else if (y) yClamp = !!z;\n      return brush;\n    };\n    brush.extent = function(z) {\n      var x0, x1, y0, y1, t;\n      if (!arguments.length) {\n        if (x) {\n          if (xExtentDomain) {\n            x0 = xExtentDomain[0], x1 = xExtentDomain[1];\n          } else {\n            x0 = xExtent[0], x1 = xExtent[1];\n            if (x.invert) x0 = x.invert(x0), x1 = x.invert(x1);\n            if (x1 < x0) t = x0, x0 = x1, x1 = t;\n          }\n        }\n        if (y) {\n          if (yExtentDomain) {\n            y0 = yExtentDomain[0], y1 = yExtentDomain[1];\n          } else {\n            y0 = yExtent[0], y1 = yExtent[1];\n            if (y.invert) y0 = y.invert(y0), y1 = y.invert(y1);\n            if (y1 < y0) t = y0, y0 = y1, y1 = t;\n          }\n        }\n        return x && y ? [ [ x0, y0 ], [ x1, y1 ] ] : x ? [ x0, x1 ] : y && [ y0, y1 ];\n      }\n      if (x) {\n        x0 = z[0], x1 = z[1];\n        if (y) x0 = x0[0], x1 = x1[0];\n        xExtentDomain = [ x0, x1 ];\n        if (x.invert) x0 = x(x0), x1 = x(x1);\n        if (x1 < x0) t = x0, x0 = x1, x1 = t;\n        if (x0 != xExtent[0] || x1 != xExtent[1]) xExtent = [ x0, x1 ];\n      }\n      if (y) {\n        y0 = z[0], y1 = z[1];\n        if (x) y0 = y0[1], y1 = y1[1];\n        yExtentDomain = [ y0, y1 ];\n        if (y.invert) y0 = y(y0), y1 = y(y1);\n        if (y1 < y0) t = y0, y0 = y1, y1 = t;\n        if (y0 != yExtent[0] || y1 != yExtent[1]) yExtent = [ y0, y1 ];\n      }\n      return brush;\n    };\n    brush.clear = function() {\n      if (!brush.empty()) {\n        xExtent = [ 0, 0 ], yExtent = [ 0, 0 ];\n        xExtentDomain = yExtentDomain = null;\n      }\n      return brush;\n    };\n    brush.empty = function() {\n      return !!x && xExtent[0] == xExtent[1] || !!y && yExtent[0] == yExtent[1];\n    };\n    return d3.rebind(brush, event, \"on\");\n  };\n  var d3_svg_brushCursor = {\n    n: \"ns-resize\",\n    e: \"ew-resize\",\n    s: \"ns-resize\",\n    w: \"ew-resize\",\n    nw: \"nwse-resize\",\n    ne: \"nesw-resize\",\n    se: \"nwse-resize\",\n    sw: \"nesw-resize\"\n  };\n  var d3_svg_brushResizes = [ [ \"n\", \"e\", \"s\", \"w\", \"nw\", \"ne\", \"se\", \"sw\" ], [ \"e\", \"w\" ], [ \"n\", \"s\" ], [] ];\n  var d3_time_format = d3_time.format = d3_locale_enUS.timeFormat;\n  var d3_time_formatUtc = d3_time_format.utc;\n  var d3_time_formatIso = d3_time_formatUtc(\"%Y-%m-%dT%H:%M:%S.%LZ\");\n  d3_time_format.iso = Date.prototype.toISOString && +new Date(\"2000-01-01T00:00:00.000Z\") ? d3_time_formatIsoNative : d3_time_formatIso;\n  function d3_time_formatIsoNative(date) {\n    return date.toISOString();\n  }\n  d3_time_formatIsoNative.parse = function(string) {\n    var date = new Date(string);\n    return isNaN(date) ? null : date;\n  };\n  d3_time_formatIsoNative.toString = d3_time_formatIso.toString;\n  d3_time.second = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 1e3) * 1e3);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 1e3);\n  }, function(date) {\n    return date.getSeconds();\n  });\n  d3_time.seconds = d3_time.second.range;\n  d3_time.seconds.utc = d3_time.second.utc.range;\n  d3_time.minute = d3_time_interval(function(date) {\n    return new d3_date(Math.floor(date / 6e4) * 6e4);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 6e4);\n  }, function(date) {\n    return date.getMinutes();\n  });\n  d3_time.minutes = d3_time.minute.range;\n  d3_time.minutes.utc = d3_time.minute.utc.range;\n  d3_time.hour = d3_time_interval(function(date) {\n    var timezone = date.getTimezoneOffset() / 60;\n    return new d3_date((Math.floor(date / 36e5 - timezone) + timezone) * 36e5);\n  }, function(date, offset) {\n    date.setTime(date.getTime() + Math.floor(offset) * 36e5);\n  }, function(date) {\n    return date.getHours();\n  });\n  d3_time.hours = d3_time.hour.range;\n  d3_time.hours.utc = d3_time.hour.utc.range;\n  d3_time.month = d3_time_interval(function(date) {\n    date = d3_time.day(date);\n    date.setDate(1);\n    return date;\n  }, function(date, offset) {\n    date.setMonth(date.getMonth() + offset);\n  }, function(date) {\n    return date.getMonth();\n  });\n  d3_time.months = d3_time.month.range;\n  d3_time.months.utc = d3_time.month.utc.range;\n  function d3_time_scale(linear, methods, format) {\n    function scale(x) {\n      return linear(x);\n    }\n    scale.invert = function(x) {\n      return d3_time_scaleDate(linear.invert(x));\n    };\n    scale.domain = function(x) {\n      if (!arguments.length) return linear.domain().map(d3_time_scaleDate);\n      linear.domain(x);\n      return scale;\n    };\n    function tickMethod(extent, count) {\n      var span = extent[1] - extent[0], target = span / count, i = d3.bisect(d3_time_scaleSteps, target);\n      return i == d3_time_scaleSteps.length ? [ methods.year, d3_scale_linearTickRange(extent.map(function(d) {\n        return d / 31536e6;\n      }), count)[2] ] : !i ? [ d3_time_scaleMilliseconds, d3_scale_linearTickRange(extent, count)[2] ] : methods[target / d3_time_scaleSteps[i - 1] < d3_time_scaleSteps[i] / target ? i - 1 : i];\n    }\n    scale.nice = function(interval, skip) {\n      var domain = scale.domain(), extent = d3_scaleExtent(domain), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" && tickMethod(extent, interval);\n      if (method) interval = method[0], skip = method[1];\n      function skipped(date) {\n        return !isNaN(date) && !interval.range(date, d3_time_scaleDate(+date + 1), skip).length;\n      }\n      return scale.domain(d3_scale_nice(domain, skip > 1 ? {\n        floor: function(date) {\n          while (skipped(date = interval.floor(date))) date = d3_time_scaleDate(date - 1);\n          return date;\n        },\n        ceil: function(date) {\n          while (skipped(date = interval.ceil(date))) date = d3_time_scaleDate(+date + 1);\n          return date;\n        }\n      } : interval));\n    };\n    scale.ticks = function(interval, skip) {\n      var extent = d3_scaleExtent(scale.domain()), method = interval == null ? tickMethod(extent, 10) : typeof interval === \"number\" ? tickMethod(extent, interval) : !interval.range && [ {\n        range: interval\n      }, skip ];\n      if (method) interval = method[0], skip = method[1];\n      return interval.range(extent[0], d3_time_scaleDate(+extent[1] + 1), skip < 1 ? 1 : skip);\n    };\n    scale.tickFormat = function() {\n      return format;\n    };\n    scale.copy = function() {\n      return d3_time_scale(linear.copy(), methods, format);\n    };\n    return d3_scale_linearRebind(scale, linear);\n  }\n  function d3_time_scaleDate(t) {\n    return new Date(t);\n  }\n  var d3_time_scaleSteps = [ 1e3, 5e3, 15e3, 3e4, 6e4, 3e5, 9e5, 18e5, 36e5, 108e5, 216e5, 432e5, 864e5, 1728e5, 6048e5, 2592e6, 7776e6, 31536e6 ];\n  var d3_time_scaleLocalMethods = [ [ d3_time.second, 1 ], [ d3_time.second, 5 ], [ d3_time.second, 15 ], [ d3_time.second, 30 ], [ d3_time.minute, 1 ], [ d3_time.minute, 5 ], [ d3_time.minute, 15 ], [ d3_time.minute, 30 ], [ d3_time.hour, 1 ], [ d3_time.hour, 3 ], [ d3_time.hour, 6 ], [ d3_time.hour, 12 ], [ d3_time.day, 1 ], [ d3_time.day, 2 ], [ d3_time.week, 1 ], [ d3_time.month, 1 ], [ d3_time.month, 3 ], [ d3_time.year, 1 ] ];\n  var d3_time_scaleLocalFormat = d3_time_format.multi([ [ \".%L\", function(d) {\n    return d.getMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getDay() && d.getDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  var d3_time_scaleMilliseconds = {\n    range: function(start, stop, step) {\n      return d3.range(Math.ceil(start / step) * step, +stop, step).map(d3_time_scaleDate);\n    },\n    floor: d3_identity,\n    ceil: d3_identity\n  };\n  d3_time_scaleLocalMethods.year = d3_time.year;\n  d3_time.scale = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleLocalMethods, d3_time_scaleLocalFormat);\n  };\n  var d3_time_scaleUtcMethods = d3_time_scaleLocalMethods.map(function(m) {\n    return [ m[0].utc, m[1] ];\n  });\n  var d3_time_scaleUtcFormat = d3_time_formatUtc.multi([ [ \".%L\", function(d) {\n    return d.getUTCMilliseconds();\n  } ], [ \":%S\", function(d) {\n    return d.getUTCSeconds();\n  } ], [ \"%I:%M\", function(d) {\n    return d.getUTCMinutes();\n  } ], [ \"%I %p\", function(d) {\n    return d.getUTCHours();\n  } ], [ \"%a %d\", function(d) {\n    return d.getUTCDay() && d.getUTCDate() != 1;\n  } ], [ \"%b %d\", function(d) {\n    return d.getUTCDate() != 1;\n  } ], [ \"%B\", function(d) {\n    return d.getUTCMonth();\n  } ], [ \"%Y\", d3_true ] ]);\n  d3_time_scaleUtcMethods.year = d3_time.year.utc;\n  d3_time.scale.utc = function() {\n    return d3_time_scale(d3.scale.linear(), d3_time_scaleUtcMethods, d3_time_scaleUtcFormat);\n  };\n  d3.text = d3_xhrType(function(request) {\n    return request.responseText;\n  });\n  d3.json = function(url, callback) {\n    return d3_xhr(url, \"application/json\", d3_json, callback);\n  };\n  function d3_json(request) {\n    return JSON.parse(request.responseText);\n  }\n  d3.html = function(url, callback) {\n    return d3_xhr(url, \"text/html\", d3_html, callback);\n  };\n  function d3_html(request) {\n    var range = d3_document.createRange();\n    range.selectNode(d3_document.body);\n    return range.createContextualFragment(request.responseText);\n  }\n  d3.xml = d3_xhrType(function(request) {\n    return request.responseXML;\n  });\n  if (typeof define === \"function\" && define.amd) this.d3 = d3, define(d3); else if (typeof module === \"object\" && module.exports) module.exports = d3; else this.d3 = d3;\n}();","//! moment.js\n//! version : 2.29.3\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    global.moment = factory()\n}(this, (function () { 'use strict';\n\n    var hookCallback;\n\n    function hooks() {\n        return hookCallback.apply(null, arguments);\n    }\n\n    // This is done to register the method called with moment()\n    // without creating circular dependencies.\n    function setHookCallback(callback) {\n        hookCallback = callback;\n    }\n\n    function isArray(input) {\n        return (\n            input instanceof Array ||\n            Object.prototype.toString.call(input) === '[object Array]'\n        );\n    }\n\n    function isObject(input) {\n        // IE8 will treat undefined and null as object if it wasn't for\n        // input != null\n        return (\n            input != null &&\n            Object.prototype.toString.call(input) === '[object Object]'\n        );\n    }\n\n    function hasOwnProp(a, b) {\n        return Object.prototype.hasOwnProperty.call(a, b);\n    }\n\n    function isObjectEmpty(obj) {\n        if (Object.getOwnPropertyNames) {\n            return Object.getOwnPropertyNames(obj).length === 0;\n        } else {\n            var k;\n            for (k in obj) {\n                if (hasOwnProp(obj, k)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n    }\n\n    function isUndefined(input) {\n        return input === void 0;\n    }\n\n    function isNumber(input) {\n        return (\n            typeof input === 'number' ||\n            Object.prototype.toString.call(input) === '[object Number]'\n        );\n    }\n\n    function isDate(input) {\n        return (\n            input instanceof Date ||\n            Object.prototype.toString.call(input) === '[object Date]'\n        );\n    }\n\n    function map(arr, fn) {\n        var res = [],\n            i,\n            arrLen = arr.length;\n        for (i = 0; i < arrLen; ++i) {\n            res.push(fn(arr[i], i));\n        }\n        return res;\n    }\n\n    function extend(a, b) {\n        for (var i in b) {\n            if (hasOwnProp(b, i)) {\n                a[i] = b[i];\n            }\n        }\n\n        if (hasOwnProp(b, 'toString')) {\n            a.toString = b.toString;\n        }\n\n        if (hasOwnProp(b, 'valueOf')) {\n            a.valueOf = b.valueOf;\n        }\n\n        return a;\n    }\n\n    function createUTC(input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, true).utc();\n    }\n\n    function defaultParsingFlags() {\n        // We need to deep clone this object.\n        return {\n            empty: false,\n            unusedTokens: [],\n            unusedInput: [],\n            overflow: -2,\n            charsLeftOver: 0,\n            nullInput: false,\n            invalidEra: null,\n            invalidMonth: null,\n            invalidFormat: false,\n            userInvalidated: false,\n            iso: false,\n            parsedDateParts: [],\n            era: null,\n            meridiem: null,\n            rfc2822: false,\n            weekdayMismatch: false,\n        };\n    }\n\n    function getParsingFlags(m) {\n        if (m._pf == null) {\n            m._pf = defaultParsingFlags();\n        }\n        return m._pf;\n    }\n\n    var some;\n    if (Array.prototype.some) {\n        some = Array.prototype.some;\n    } else {\n        some = function (fun) {\n            var t = Object(this),\n                len = t.length >>> 0,\n                i;\n\n            for (i = 0; i < len; i++) {\n                if (i in t && fun.call(this, t[i], i, t)) {\n                    return true;\n                }\n            }\n\n            return false;\n        };\n    }\n\n    function isValid(m) {\n        if (m._isValid == null) {\n            var flags = getParsingFlags(m),\n                parsedParts = some.call(flags.parsedDateParts, function (i) {\n                    return i != null;\n                }),\n                isNowValid =\n                    !isNaN(m._d.getTime()) &&\n                    flags.overflow < 0 &&\n                    !flags.empty &&\n                    !flags.invalidEra &&\n                    !flags.invalidMonth &&\n                    !flags.invalidWeekday &&\n                    !flags.weekdayMismatch &&\n                    !flags.nullInput &&\n                    !flags.invalidFormat &&\n                    !flags.userInvalidated &&\n                    (!flags.meridiem || (flags.meridiem && parsedParts));\n\n            if (m._strict) {\n                isNowValid =\n                    isNowValid &&\n                    flags.charsLeftOver === 0 &&\n                    flags.unusedTokens.length === 0 &&\n                    flags.bigHour === undefined;\n            }\n\n            if (Object.isFrozen == null || !Object.isFrozen(m)) {\n                m._isValid = isNowValid;\n            } else {\n                return isNowValid;\n            }\n        }\n        return m._isValid;\n    }\n\n    function createInvalid(flags) {\n        var m = createUTC(NaN);\n        if (flags != null) {\n            extend(getParsingFlags(m), flags);\n        } else {\n            getParsingFlags(m).userInvalidated = true;\n        }\n\n        return m;\n    }\n\n    // Plugins that add properties should also add the key here (null value),\n    // so we can properly clone ourselves.\n    var momentProperties = (hooks.momentProperties = []),\n        updateInProgress = false;\n\n    function copyConfig(to, from) {\n        var i,\n            prop,\n            val,\n            momentPropertiesLen = momentProperties.length;\n\n        if (!isUndefined(from._isAMomentObject)) {\n            to._isAMomentObject = from._isAMomentObject;\n        }\n        if (!isUndefined(from._i)) {\n            to._i = from._i;\n        }\n        if (!isUndefined(from._f)) {\n            to._f = from._f;\n        }\n        if (!isUndefined(from._l)) {\n            to._l = from._l;\n        }\n        if (!isUndefined(from._strict)) {\n            to._strict = from._strict;\n        }\n        if (!isUndefined(from._tzm)) {\n            to._tzm = from._tzm;\n        }\n        if (!isUndefined(from._isUTC)) {\n            to._isUTC = from._isUTC;\n        }\n        if (!isUndefined(from._offset)) {\n            to._offset = from._offset;\n        }\n        if (!isUndefined(from._pf)) {\n            to._pf = getParsingFlags(from);\n        }\n        if (!isUndefined(from._locale)) {\n            to._locale = from._locale;\n        }\n\n        if (momentPropertiesLen > 0) {\n            for (i = 0; i < momentPropertiesLen; i++) {\n                prop = momentProperties[i];\n                val = from[prop];\n                if (!isUndefined(val)) {\n                    to[prop] = val;\n                }\n            }\n        }\n\n        return to;\n    }\n\n    // Moment prototype object\n    function Moment(config) {\n        copyConfig(this, config);\n        this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n        if (!this.isValid()) {\n            this._d = new Date(NaN);\n        }\n        // Prevent infinite loop in case updateOffset creates new moment\n        // objects.\n        if (updateInProgress === false) {\n            updateInProgress = true;\n            hooks.updateOffset(this);\n            updateInProgress = false;\n        }\n    }\n\n    function isMoment(obj) {\n        return (\n            obj instanceof Moment || (obj != null && obj._isAMomentObject != null)\n        );\n    }\n\n    function warn(msg) {\n        if (\n            hooks.suppressDeprecationWarnings === false &&\n            typeof console !== 'undefined' &&\n            console.warn\n        ) {\n            console.warn('Deprecation warning: ' + msg);\n        }\n    }\n\n    function deprecate(msg, fn) {\n        var firstTime = true;\n\n        return extend(function () {\n            if (hooks.deprecationHandler != null) {\n                hooks.deprecationHandler(null, msg);\n            }\n            if (firstTime) {\n                var args = [],\n                    arg,\n                    i,\n                    key,\n                    argLen = arguments.length;\n                for (i = 0; i < argLen; i++) {\n                    arg = '';\n                    if (typeof arguments[i] === 'object') {\n                        arg += '\\n[' + i + '] ';\n                        for (key in arguments[0]) {\n                            if (hasOwnProp(arguments[0], key)) {\n                                arg += key + ': ' + arguments[0][key] + ', ';\n                            }\n                        }\n                        arg = arg.slice(0, -2); // Remove trailing comma and space\n                    } else {\n                        arg = arguments[i];\n                    }\n                    args.push(arg);\n                }\n                warn(\n                    msg +\n                        '\\nArguments: ' +\n                        Array.prototype.slice.call(args).join('') +\n                        '\\n' +\n                        new Error().stack\n                );\n                firstTime = false;\n            }\n            return fn.apply(this, arguments);\n        }, fn);\n    }\n\n    var deprecations = {};\n\n    function deprecateSimple(name, msg) {\n        if (hooks.deprecationHandler != null) {\n            hooks.deprecationHandler(name, msg);\n        }\n        if (!deprecations[name]) {\n            warn(msg);\n            deprecations[name] = true;\n        }\n    }\n\n    hooks.suppressDeprecationWarnings = false;\n    hooks.deprecationHandler = null;\n\n    function isFunction(input) {\n        return (\n            (typeof Function !== 'undefined' && input instanceof Function) ||\n            Object.prototype.toString.call(input) === '[object Function]'\n        );\n    }\n\n    function set(config) {\n        var prop, i;\n        for (i in config) {\n            if (hasOwnProp(config, i)) {\n                prop = config[i];\n                if (isFunction(prop)) {\n                    this[i] = prop;\n                } else {\n                    this['_' + i] = prop;\n                }\n            }\n        }\n        this._config = config;\n        // Lenient ordinal parsing accepts just a number in addition to\n        // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n        // TODO: Remove \"ordinalParse\" fallback in next major release.\n        this._dayOfMonthOrdinalParseLenient = new RegExp(\n            (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) +\n                '|' +\n                /\\d{1,2}/.source\n        );\n    }\n\n    function mergeConfigs(parentConfig, childConfig) {\n        var res = extend({}, parentConfig),\n            prop;\n        for (prop in childConfig) {\n            if (hasOwnProp(childConfig, prop)) {\n                if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n                    res[prop] = {};\n                    extend(res[prop], parentConfig[prop]);\n                    extend(res[prop], childConfig[prop]);\n                } else if (childConfig[prop] != null) {\n                    res[prop] = childConfig[prop];\n                } else {\n                    delete res[prop];\n                }\n            }\n        }\n        for (prop in parentConfig) {\n            if (\n                hasOwnProp(parentConfig, prop) &&\n                !hasOwnProp(childConfig, prop) &&\n                isObject(parentConfig[prop])\n            ) {\n                // make sure changes to properties don't modify parent config\n                res[prop] = extend({}, res[prop]);\n            }\n        }\n        return res;\n    }\n\n    function Locale(config) {\n        if (config != null) {\n            this.set(config);\n        }\n    }\n\n    var keys;\n\n    if (Object.keys) {\n        keys = Object.keys;\n    } else {\n        keys = function (obj) {\n            var i,\n                res = [];\n            for (i in obj) {\n                if (hasOwnProp(obj, i)) {\n                    res.push(i);\n                }\n            }\n            return res;\n        };\n    }\n\n    var defaultCalendar = {\n        sameDay: '[Today at] LT',\n        nextDay: '[Tomorrow at] LT',\n        nextWeek: 'dddd [at] LT',\n        lastDay: '[Yesterday at] LT',\n        lastWeek: '[Last] dddd [at] LT',\n        sameElse: 'L',\n    };\n\n    function calendar(key, mom, now) {\n        var output = this._calendar[key] || this._calendar['sameElse'];\n        return isFunction(output) ? output.call(mom, now) : output;\n    }\n\n    function zeroFill(number, targetLength, forceSign) {\n        var absNumber = '' + Math.abs(number),\n            zerosToFill = targetLength - absNumber.length,\n            sign = number >= 0;\n        return (\n            (sign ? (forceSign ? '+' : '') : '-') +\n            Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) +\n            absNumber\n        );\n    }\n\n    var formattingTokens =\n            /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,\n        localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,\n        formatFunctions = {},\n        formatTokenFunctions = {};\n\n    // token:    'M'\n    // padded:   ['MM', 2]\n    // ordinal:  'Mo'\n    // callback: function () { this.month() + 1 }\n    function addFormatToken(token, padded, ordinal, callback) {\n        var func = callback;\n        if (typeof callback === 'string') {\n            func = function () {\n                return this[callback]();\n            };\n        }\n        if (token) {\n            formatTokenFunctions[token] = func;\n        }\n        if (padded) {\n            formatTokenFunctions[padded[0]] = function () {\n                return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n            };\n        }\n        if (ordinal) {\n            formatTokenFunctions[ordinal] = function () {\n                return this.localeData().ordinal(\n                    func.apply(this, arguments),\n                    token\n                );\n            };\n        }\n    }\n\n    function removeFormattingTokens(input) {\n        if (input.match(/\\[[\\s\\S]/)) {\n            return input.replace(/^\\[|\\]$/g, '');\n        }\n        return input.replace(/\\\\/g, '');\n    }\n\n    function makeFormatFunction(format) {\n        var array = format.match(formattingTokens),\n            i,\n            length;\n\n        for (i = 0, length = array.length; i < length; i++) {\n            if (formatTokenFunctions[array[i]]) {\n                array[i] = formatTokenFunctions[array[i]];\n            } else {\n                array[i] = removeFormattingTokens(array[i]);\n            }\n        }\n\n        return function (mom) {\n            var output = '',\n                i;\n            for (i = 0; i < length; i++) {\n                output += isFunction(array[i])\n                    ? array[i].call(mom, format)\n                    : array[i];\n            }\n            return output;\n        };\n    }\n\n    // format date using native date object\n    function formatMoment(m, format) {\n        if (!m.isValid()) {\n            return m.localeData().invalidDate();\n        }\n\n        format = expandFormat(format, m.localeData());\n        formatFunctions[format] =\n            formatFunctions[format] || makeFormatFunction(format);\n\n        return formatFunctions[format](m);\n    }\n\n    function expandFormat(format, locale) {\n        var i = 5;\n\n        function replaceLongDateFormatTokens(input) {\n            return locale.longDateFormat(input) || input;\n        }\n\n        localFormattingTokens.lastIndex = 0;\n        while (i >= 0 && localFormattingTokens.test(format)) {\n            format = format.replace(\n                localFormattingTokens,\n                replaceLongDateFormatTokens\n            );\n            localFormattingTokens.lastIndex = 0;\n            i -= 1;\n        }\n\n        return format;\n    }\n\n    var defaultLongDateFormat = {\n        LTS: 'h:mm:ss A',\n        LT: 'h:mm A',\n        L: 'MM/DD/YYYY',\n        LL: 'MMMM D, YYYY',\n        LLL: 'MMMM D, YYYY h:mm A',\n        LLLL: 'dddd, MMMM D, YYYY h:mm A',\n    };\n\n    function longDateFormat(key) {\n        var format = this._longDateFormat[key],\n            formatUpper = this._longDateFormat[key.toUpperCase()];\n\n        if (format || !formatUpper) {\n            return format;\n        }\n\n        this._longDateFormat[key] = formatUpper\n            .match(formattingTokens)\n            .map(function (tok) {\n                if (\n                    tok === 'MMMM' ||\n                    tok === 'MM' ||\n                    tok === 'DD' ||\n                    tok === 'dddd'\n                ) {\n                    return tok.slice(1);\n                }\n                return tok;\n            })\n            .join('');\n\n        return this._longDateFormat[key];\n    }\n\n    var defaultInvalidDate = 'Invalid date';\n\n    function invalidDate() {\n        return this._invalidDate;\n    }\n\n    var defaultOrdinal = '%d',\n        defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n\n    function ordinal(number) {\n        return this._ordinal.replace('%d', number);\n    }\n\n    var defaultRelativeTime = {\n        future: 'in %s',\n        past: '%s ago',\n        s: 'a few seconds',\n        ss: '%d seconds',\n        m: 'a minute',\n        mm: '%d minutes',\n        h: 'an hour',\n        hh: '%d hours',\n        d: 'a day',\n        dd: '%d days',\n        w: 'a week',\n        ww: '%d weeks',\n        M: 'a month',\n        MM: '%d months',\n        y: 'a year',\n        yy: '%d years',\n    };\n\n    function relativeTime(number, withoutSuffix, string, isFuture) {\n        var output = this._relativeTime[string];\n        return isFunction(output)\n            ? output(number, withoutSuffix, string, isFuture)\n            : output.replace(/%d/i, number);\n    }\n\n    function pastFuture(diff, output) {\n        var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n        return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n    }\n\n    var aliases = {};\n\n    function addUnitAlias(unit, shorthand) {\n        var lowerCase = unit.toLowerCase();\n        aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit;\n    }\n\n    function normalizeUnits(units) {\n        return typeof units === 'string'\n            ? aliases[units] || aliases[units.toLowerCase()]\n            : undefined;\n    }\n\n    function normalizeObjectUnits(inputObject) {\n        var normalizedInput = {},\n            normalizedProp,\n            prop;\n\n        for (prop in inputObject) {\n            if (hasOwnProp(inputObject, prop)) {\n                normalizedProp = normalizeUnits(prop);\n                if (normalizedProp) {\n                    normalizedInput[normalizedProp] = inputObject[prop];\n                }\n            }\n        }\n\n        return normalizedInput;\n    }\n\n    var priorities = {};\n\n    function addUnitPriority(unit, priority) {\n        priorities[unit] = priority;\n    }\n\n    function getPrioritizedUnits(unitsObj) {\n        var units = [],\n            u;\n        for (u in unitsObj) {\n            if (hasOwnProp(unitsObj, u)) {\n                units.push({ unit: u, priority: priorities[u] });\n            }\n        }\n        units.sort(function (a, b) {\n            return a.priority - b.priority;\n        });\n        return units;\n    }\n\n    function isLeapYear(year) {\n        return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n    }\n\n    function absFloor(number) {\n        if (number < 0) {\n            // -0 -> 0\n            return Math.ceil(number) || 0;\n        } else {\n            return Math.floor(number);\n        }\n    }\n\n    function toInt(argumentForCoercion) {\n        var coercedNumber = +argumentForCoercion,\n            value = 0;\n\n        if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n            value = absFloor(coercedNumber);\n        }\n\n        return value;\n    }\n\n    function makeGetSet(unit, keepTime) {\n        return function (value) {\n            if (value != null) {\n                set$1(this, unit, value);\n                hooks.updateOffset(this, keepTime);\n                return this;\n            } else {\n                return get(this, unit);\n            }\n        };\n    }\n\n    function get(mom, unit) {\n        return mom.isValid()\n            ? mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]()\n            : NaN;\n    }\n\n    function set$1(mom, unit, value) {\n        if (mom.isValid() && !isNaN(value)) {\n            if (\n                unit === 'FullYear' &&\n                isLeapYear(mom.year()) &&\n                mom.month() === 1 &&\n                mom.date() === 29\n            ) {\n                value = toInt(value);\n                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](\n                    value,\n                    mom.month(),\n                    daysInMonth(value, mom.month())\n                );\n            } else {\n                mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function stringGet(units) {\n        units = normalizeUnits(units);\n        if (isFunction(this[units])) {\n            return this[units]();\n        }\n        return this;\n    }\n\n    function stringSet(units, value) {\n        if (typeof units === 'object') {\n            units = normalizeObjectUnits(units);\n            var prioritized = getPrioritizedUnits(units),\n                i,\n                prioritizedLen = prioritized.length;\n            for (i = 0; i < prioritizedLen; i++) {\n                this[prioritized[i].unit](units[prioritized[i].unit]);\n            }\n        } else {\n            units = normalizeUnits(units);\n            if (isFunction(this[units])) {\n                return this[units](value);\n            }\n        }\n        return this;\n    }\n\n    var match1 = /\\d/, //       0 - 9\n        match2 = /\\d\\d/, //      00 - 99\n        match3 = /\\d{3}/, //     000 - 999\n        match4 = /\\d{4}/, //    0000 - 9999\n        match6 = /[+-]?\\d{6}/, // -999999 - 999999\n        match1to2 = /\\d\\d?/, //       0 - 99\n        match3to4 = /\\d\\d\\d\\d?/, //     999 - 9999\n        match5to6 = /\\d\\d\\d\\d\\d\\d?/, //   99999 - 999999\n        match1to3 = /\\d{1,3}/, //       0 - 999\n        match1to4 = /\\d{1,4}/, //       0 - 9999\n        match1to6 = /[+-]?\\d{1,6}/, // -999999 - 999999\n        matchUnsigned = /\\d+/, //       0 - inf\n        matchSigned = /[+-]?\\d+/, //    -inf - inf\n        matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi, // +00:00 -00:00 +0000 -0000 or Z\n        matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi, // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n        matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/, // 123456789 123456789.123\n        // any word (or two) characters or numbers including two/three word month in arabic.\n        // includes scottish gaelic two word and hyphenated months\n        matchWord =\n            /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i,\n        regexes;\n\n    regexes = {};\n\n    function addRegexToken(token, regex, strictRegex) {\n        regexes[token] = isFunction(regex)\n            ? regex\n            : function (isStrict, localeData) {\n                  return isStrict && strictRegex ? strictRegex : regex;\n              };\n    }\n\n    function getParseRegexForToken(token, config) {\n        if (!hasOwnProp(regexes, token)) {\n            return new RegExp(unescapeFormat(token));\n        }\n\n        return regexes[token](config._strict, config._locale);\n    }\n\n    // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n    function unescapeFormat(s) {\n        return regexEscape(\n            s\n                .replace('\\\\', '')\n                .replace(\n                    /\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,\n                    function (matched, p1, p2, p3, p4) {\n                        return p1 || p2 || p3 || p4;\n                    }\n                )\n        );\n    }\n\n    function regexEscape(s) {\n        return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n    }\n\n    var tokens = {};\n\n    function addParseToken(token, callback) {\n        var i,\n            func = callback,\n            tokenLen;\n        if (typeof token === 'string') {\n            token = [token];\n        }\n        if (isNumber(callback)) {\n            func = function (input, array) {\n                array[callback] = toInt(input);\n            };\n        }\n        tokenLen = token.length;\n        for (i = 0; i < tokenLen; i++) {\n            tokens[token[i]] = func;\n        }\n    }\n\n    function addWeekParseToken(token, callback) {\n        addParseToken(token, function (input, array, config, token) {\n            config._w = config._w || {};\n            callback(input, config._w, config, token);\n        });\n    }\n\n    function addTimeToArrayFromToken(token, input, config) {\n        if (input != null && hasOwnProp(tokens, token)) {\n            tokens[token](input, config._a, config, token);\n        }\n    }\n\n    var YEAR = 0,\n        MONTH = 1,\n        DATE = 2,\n        HOUR = 3,\n        MINUTE = 4,\n        SECOND = 5,\n        MILLISECOND = 6,\n        WEEK = 7,\n        WEEKDAY = 8;\n\n    function mod(n, x) {\n        return ((n % x) + x) % x;\n    }\n\n    var indexOf;\n\n    if (Array.prototype.indexOf) {\n        indexOf = Array.prototype.indexOf;\n    } else {\n        indexOf = function (o) {\n            // I know\n            var i;\n            for (i = 0; i < this.length; ++i) {\n                if (this[i] === o) {\n                    return i;\n                }\n            }\n            return -1;\n        };\n    }\n\n    function daysInMonth(year, month) {\n        if (isNaN(year) || isNaN(month)) {\n            return NaN;\n        }\n        var modMonth = mod(month, 12);\n        year += (month - modMonth) / 12;\n        return modMonth === 1\n            ? isLeapYear(year)\n                ? 29\n                : 28\n            : 31 - ((modMonth % 7) % 2);\n    }\n\n    // FORMATTING\n\n    addFormatToken('M', ['MM', 2], 'Mo', function () {\n        return this.month() + 1;\n    });\n\n    addFormatToken('MMM', 0, 0, function (format) {\n        return this.localeData().monthsShort(this, format);\n    });\n\n    addFormatToken('MMMM', 0, 0, function (format) {\n        return this.localeData().months(this, format);\n    });\n\n    // ALIASES\n\n    addUnitAlias('month', 'M');\n\n    // PRIORITY\n\n    addUnitPriority('month', 8);\n\n    // PARSING\n\n    addRegexToken('M', match1to2);\n    addRegexToken('MM', match1to2, match2);\n    addRegexToken('MMM', function (isStrict, locale) {\n        return locale.monthsShortRegex(isStrict);\n    });\n    addRegexToken('MMMM', function (isStrict, locale) {\n        return locale.monthsRegex(isStrict);\n    });\n\n    addParseToken(['M', 'MM'], function (input, array) {\n        array[MONTH] = toInt(input) - 1;\n    });\n\n    addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n        var month = config._locale.monthsParse(input, token, config._strict);\n        // if we didn't find a month name, mark the date as invalid.\n        if (month != null) {\n            array[MONTH] = month;\n        } else {\n            getParsingFlags(config).invalidMonth = input;\n        }\n    });\n\n    // LOCALES\n\n    var defaultLocaleMonths =\n            'January_February_March_April_May_June_July_August_September_October_November_December'.split(\n                '_'\n            ),\n        defaultLocaleMonthsShort =\n            'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n        MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,\n        defaultMonthsShortRegex = matchWord,\n        defaultMonthsRegex = matchWord;\n\n    function localeMonths(m, format) {\n        if (!m) {\n            return isArray(this._months)\n                ? this._months\n                : this._months['standalone'];\n        }\n        return isArray(this._months)\n            ? this._months[m.month()]\n            : this._months[\n                  (this._months.isFormat || MONTHS_IN_FORMAT).test(format)\n                      ? 'format'\n                      : 'standalone'\n              ][m.month()];\n    }\n\n    function localeMonthsShort(m, format) {\n        if (!m) {\n            return isArray(this._monthsShort)\n                ? this._monthsShort\n                : this._monthsShort['standalone'];\n        }\n        return isArray(this._monthsShort)\n            ? this._monthsShort[m.month()]\n            : this._monthsShort[\n                  MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'\n              ][m.month()];\n    }\n\n    function handleStrictParse(monthName, format, strict) {\n        var i,\n            ii,\n            mom,\n            llc = monthName.toLocaleLowerCase();\n        if (!this._monthsParse) {\n            // this is not used\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n            for (i = 0; i < 12; ++i) {\n                mom = createUTC([2000, i]);\n                this._shortMonthsParse[i] = this.monthsShort(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'MMM') {\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._longMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._longMonthsParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortMonthsParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeMonthsParse(monthName, format, strict) {\n        var i, mom, regex;\n\n        if (this._monthsParseExact) {\n            return handleStrictParse.call(this, monthName, format, strict);\n        }\n\n        if (!this._monthsParse) {\n            this._monthsParse = [];\n            this._longMonthsParse = [];\n            this._shortMonthsParse = [];\n        }\n\n        // TODO: add sorting\n        // Sorting makes sure if one month (or abbr) is a prefix of another\n        // see sorting in computeMonthsParse\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, i]);\n            if (strict && !this._longMonthsParse[i]) {\n                this._longMonthsParse[i] = new RegExp(\n                    '^' + this.months(mom, '').replace('.', '') + '$',\n                    'i'\n                );\n                this._shortMonthsParse[i] = new RegExp(\n                    '^' + this.monthsShort(mom, '').replace('.', '') + '$',\n                    'i'\n                );\n            }\n            if (!strict && !this._monthsParse[i]) {\n                regex =\n                    '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n                this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (\n                strict &&\n                format === 'MMMM' &&\n                this._longMonthsParse[i].test(monthName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'MMM' &&\n                this._shortMonthsParse[i].test(monthName)\n            ) {\n                return i;\n            } else if (!strict && this._monthsParse[i].test(monthName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function setMonth(mom, value) {\n        var dayOfMonth;\n\n        if (!mom.isValid()) {\n            // No op\n            return mom;\n        }\n\n        if (typeof value === 'string') {\n            if (/^\\d+$/.test(value)) {\n                value = toInt(value);\n            } else {\n                value = mom.localeData().monthsParse(value);\n                // TODO: Another silent failure?\n                if (!isNumber(value)) {\n                    return mom;\n                }\n            }\n        }\n\n        dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value));\n        mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);\n        return mom;\n    }\n\n    function getSetMonth(value) {\n        if (value != null) {\n            setMonth(this, value);\n            hooks.updateOffset(this, true);\n            return this;\n        } else {\n            return get(this, 'Month');\n        }\n    }\n\n    function getDaysInMonth() {\n        return daysInMonth(this.year(), this.month());\n    }\n\n    function monthsShortRegex(isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsShortStrictRegex;\n            } else {\n                return this._monthsShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsShortRegex')) {\n                this._monthsShortRegex = defaultMonthsShortRegex;\n            }\n            return this._monthsShortStrictRegex && isStrict\n                ? this._monthsShortStrictRegex\n                : this._monthsShortRegex;\n        }\n    }\n\n    function monthsRegex(isStrict) {\n        if (this._monthsParseExact) {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                computeMonthsParse.call(this);\n            }\n            if (isStrict) {\n                return this._monthsStrictRegex;\n            } else {\n                return this._monthsRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_monthsRegex')) {\n                this._monthsRegex = defaultMonthsRegex;\n            }\n            return this._monthsStrictRegex && isStrict\n                ? this._monthsStrictRegex\n                : this._monthsRegex;\n        }\n    }\n\n    function computeMonthsParse() {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var shortPieces = [],\n            longPieces = [],\n            mixedPieces = [],\n            i,\n            mom;\n        for (i = 0; i < 12; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, i]);\n            shortPieces.push(this.monthsShort(mom, ''));\n            longPieces.push(this.months(mom, ''));\n            mixedPieces.push(this.months(mom, ''));\n            mixedPieces.push(this.monthsShort(mom, ''));\n        }\n        // Sorting makes sure if one month (or abbr) is a prefix of another it\n        // will match the longer piece.\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n        for (i = 0; i < 12; i++) {\n            shortPieces[i] = regexEscape(shortPieces[i]);\n            longPieces[i] = regexEscape(longPieces[i]);\n        }\n        for (i = 0; i < 24; i++) {\n            mixedPieces[i] = regexEscape(mixedPieces[i]);\n        }\n\n        this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._monthsShortRegex = this._monthsRegex;\n        this._monthsStrictRegex = new RegExp(\n            '^(' + longPieces.join('|') + ')',\n            'i'\n        );\n        this._monthsShortStrictRegex = new RegExp(\n            '^(' + shortPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    // FORMATTING\n\n    addFormatToken('Y', 0, 0, function () {\n        var y = this.year();\n        return y <= 9999 ? zeroFill(y, 4) : '+' + y;\n    });\n\n    addFormatToken(0, ['YY', 2], 0, function () {\n        return this.year() % 100;\n    });\n\n    addFormatToken(0, ['YYYY', 4], 0, 'year');\n    addFormatToken(0, ['YYYYY', 5], 0, 'year');\n    addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n    // ALIASES\n\n    addUnitAlias('year', 'y');\n\n    // PRIORITIES\n\n    addUnitPriority('year', 1);\n\n    // PARSING\n\n    addRegexToken('Y', matchSigned);\n    addRegexToken('YY', match1to2, match2);\n    addRegexToken('YYYY', match1to4, match4);\n    addRegexToken('YYYYY', match1to6, match6);\n    addRegexToken('YYYYYY', match1to6, match6);\n\n    addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n    addParseToken('YYYY', function (input, array) {\n        array[YEAR] =\n            input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n    });\n    addParseToken('YY', function (input, array) {\n        array[YEAR] = hooks.parseTwoDigitYear(input);\n    });\n    addParseToken('Y', function (input, array) {\n        array[YEAR] = parseInt(input, 10);\n    });\n\n    // HELPERS\n\n    function daysInYear(year) {\n        return isLeapYear(year) ? 366 : 365;\n    }\n\n    // HOOKS\n\n    hooks.parseTwoDigitYear = function (input) {\n        return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n    };\n\n    // MOMENTS\n\n    var getSetYear = makeGetSet('FullYear', true);\n\n    function getIsLeapYear() {\n        return isLeapYear(this.year());\n    }\n\n    function createDate(y, m, d, h, M, s, ms) {\n        // can't just apply() to create a date:\n        // https://stackoverflow.com/q/181348\n        var date;\n        // the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            date = new Date(y + 400, m, d, h, M, s, ms);\n            if (isFinite(date.getFullYear())) {\n                date.setFullYear(y);\n            }\n        } else {\n            date = new Date(y, m, d, h, M, s, ms);\n        }\n\n        return date;\n    }\n\n    function createUTCDate(y) {\n        var date, args;\n        // the Date.UTC function remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            args = Array.prototype.slice.call(arguments);\n            // preserve leap years using a full 400 year cycle, then reset\n            args[0] = y + 400;\n            date = new Date(Date.UTC.apply(null, args));\n            if (isFinite(date.getUTCFullYear())) {\n                date.setUTCFullYear(y);\n            }\n        } else {\n            date = new Date(Date.UTC.apply(null, arguments));\n        }\n\n        return date;\n    }\n\n    // start-of-first-week - start-of-year\n    function firstWeekOffset(year, dow, doy) {\n        var // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n            fwd = 7 + dow - doy,\n            // first-week day local weekday -- which local weekday is fwd\n            fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n\n        return -fwdlw + fwd - 1;\n    }\n\n    // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n    function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n        var localWeekday = (7 + weekday - dow) % 7,\n            weekOffset = firstWeekOffset(year, dow, doy),\n            dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n            resYear,\n            resDayOfYear;\n\n        if (dayOfYear <= 0) {\n            resYear = year - 1;\n            resDayOfYear = daysInYear(resYear) + dayOfYear;\n        } else if (dayOfYear > daysInYear(year)) {\n            resYear = year + 1;\n            resDayOfYear = dayOfYear - daysInYear(year);\n        } else {\n            resYear = year;\n            resDayOfYear = dayOfYear;\n        }\n\n        return {\n            year: resYear,\n            dayOfYear: resDayOfYear,\n        };\n    }\n\n    function weekOfYear(mom, dow, doy) {\n        var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n            week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n            resWeek,\n            resYear;\n\n        if (week < 1) {\n            resYear = mom.year() - 1;\n            resWeek = week + weeksInYear(resYear, dow, doy);\n        } else if (week > weeksInYear(mom.year(), dow, doy)) {\n            resWeek = week - weeksInYear(mom.year(), dow, doy);\n            resYear = mom.year() + 1;\n        } else {\n            resYear = mom.year();\n            resWeek = week;\n        }\n\n        return {\n            week: resWeek,\n            year: resYear,\n        };\n    }\n\n    function weeksInYear(year, dow, doy) {\n        var weekOffset = firstWeekOffset(year, dow, doy),\n            weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n        return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n    }\n\n    // FORMATTING\n\n    addFormatToken('w', ['ww', 2], 'wo', 'week');\n    addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n    // ALIASES\n\n    addUnitAlias('week', 'w');\n    addUnitAlias('isoWeek', 'W');\n\n    // PRIORITIES\n\n    addUnitPriority('week', 5);\n    addUnitPriority('isoWeek', 5);\n\n    // PARSING\n\n    addRegexToken('w', match1to2);\n    addRegexToken('ww', match1to2, match2);\n    addRegexToken('W', match1to2);\n    addRegexToken('WW', match1to2, match2);\n\n    addWeekParseToken(\n        ['w', 'ww', 'W', 'WW'],\n        function (input, week, config, token) {\n            week[token.substr(0, 1)] = toInt(input);\n        }\n    );\n\n    // HELPERS\n\n    // LOCALES\n\n    function localeWeek(mom) {\n        return weekOfYear(mom, this._week.dow, this._week.doy).week;\n    }\n\n    var defaultLocaleWeek = {\n        dow: 0, // Sunday is the first day of the week.\n        doy: 6, // The week that contains Jan 6th is the first week of the year.\n    };\n\n    function localeFirstDayOfWeek() {\n        return this._week.dow;\n    }\n\n    function localeFirstDayOfYear() {\n        return this._week.doy;\n    }\n\n    // MOMENTS\n\n    function getSetWeek(input) {\n        var week = this.localeData().week(this);\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    function getSetISOWeek(input) {\n        var week = weekOfYear(this, 1, 4).week;\n        return input == null ? week : this.add((input - week) * 7, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('d', 0, 'do', 'day');\n\n    addFormatToken('dd', 0, 0, function (format) {\n        return this.localeData().weekdaysMin(this, format);\n    });\n\n    addFormatToken('ddd', 0, 0, function (format) {\n        return this.localeData().weekdaysShort(this, format);\n    });\n\n    addFormatToken('dddd', 0, 0, function (format) {\n        return this.localeData().weekdays(this, format);\n    });\n\n    addFormatToken('e', 0, 0, 'weekday');\n    addFormatToken('E', 0, 0, 'isoWeekday');\n\n    // ALIASES\n\n    addUnitAlias('day', 'd');\n    addUnitAlias('weekday', 'e');\n    addUnitAlias('isoWeekday', 'E');\n\n    // PRIORITY\n    addUnitPriority('day', 11);\n    addUnitPriority('weekday', 11);\n    addUnitPriority('isoWeekday', 11);\n\n    // PARSING\n\n    addRegexToken('d', match1to2);\n    addRegexToken('e', match1to2);\n    addRegexToken('E', match1to2);\n    addRegexToken('dd', function (isStrict, locale) {\n        return locale.weekdaysMinRegex(isStrict);\n    });\n    addRegexToken('ddd', function (isStrict, locale) {\n        return locale.weekdaysShortRegex(isStrict);\n    });\n    addRegexToken('dddd', function (isStrict, locale) {\n        return locale.weekdaysRegex(isStrict);\n    });\n\n    addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n        var weekday = config._locale.weekdaysParse(input, token, config._strict);\n        // if we didn't get a weekday name, mark the date as invalid\n        if (weekday != null) {\n            week.d = weekday;\n        } else {\n            getParsingFlags(config).invalidWeekday = input;\n        }\n    });\n\n    addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n        week[token] = toInt(input);\n    });\n\n    // HELPERS\n\n    function parseWeekday(input, locale) {\n        if (typeof input !== 'string') {\n            return input;\n        }\n\n        if (!isNaN(input)) {\n            return parseInt(input, 10);\n        }\n\n        input = locale.weekdaysParse(input);\n        if (typeof input === 'number') {\n            return input;\n        }\n\n        return null;\n    }\n\n    function parseIsoWeekday(input, locale) {\n        if (typeof input === 'string') {\n            return locale.weekdaysParse(input) % 7 || 7;\n        }\n        return isNaN(input) ? null : input;\n    }\n\n    // LOCALES\n    function shiftWeekdays(ws, n) {\n        return ws.slice(n, 7).concat(ws.slice(0, n));\n    }\n\n    var defaultLocaleWeekdays =\n            'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n        defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n        defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n        defaultWeekdaysRegex = matchWord,\n        defaultWeekdaysShortRegex = matchWord,\n        defaultWeekdaysMinRegex = matchWord;\n\n    function localeWeekdays(m, format) {\n        var weekdays = isArray(this._weekdays)\n            ? this._weekdays\n            : this._weekdays[\n                  m && m !== true && this._weekdays.isFormat.test(format)\n                      ? 'format'\n                      : 'standalone'\n              ];\n        return m === true\n            ? shiftWeekdays(weekdays, this._week.dow)\n            : m\n            ? weekdays[m.day()]\n            : weekdays;\n    }\n\n    function localeWeekdaysShort(m) {\n        return m === true\n            ? shiftWeekdays(this._weekdaysShort, this._week.dow)\n            : m\n            ? this._weekdaysShort[m.day()]\n            : this._weekdaysShort;\n    }\n\n    function localeWeekdaysMin(m) {\n        return m === true\n            ? shiftWeekdays(this._weekdaysMin, this._week.dow)\n            : m\n            ? this._weekdaysMin[m.day()]\n            : this._weekdaysMin;\n    }\n\n    function handleStrictParse$1(weekdayName, format, strict) {\n        var i,\n            ii,\n            mom,\n            llc = weekdayName.toLocaleLowerCase();\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._minWeekdaysParse = [];\n\n            for (i = 0; i < 7; ++i) {\n                mom = createUTC([2000, 1]).day(i);\n                this._minWeekdaysParse[i] = this.weekdaysMin(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._shortWeekdaysParse[i] = this.weekdaysShort(\n                    mom,\n                    ''\n                ).toLocaleLowerCase();\n                this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n            }\n        }\n\n        if (strict) {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        } else {\n            if (format === 'dddd') {\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else if (format === 'ddd') {\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            } else {\n                ii = indexOf.call(this._minWeekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._weekdaysParse, llc);\n                if (ii !== -1) {\n                    return ii;\n                }\n                ii = indexOf.call(this._shortWeekdaysParse, llc);\n                return ii !== -1 ? ii : null;\n            }\n        }\n    }\n\n    function localeWeekdaysParse(weekdayName, format, strict) {\n        var i, mom, regex;\n\n        if (this._weekdaysParseExact) {\n            return handleStrictParse$1.call(this, weekdayName, format, strict);\n        }\n\n        if (!this._weekdaysParse) {\n            this._weekdaysParse = [];\n            this._minWeekdaysParse = [];\n            this._shortWeekdaysParse = [];\n            this._fullWeekdaysParse = [];\n        }\n\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n\n            mom = createUTC([2000, 1]).day(i);\n            if (strict && !this._fullWeekdaysParse[i]) {\n                this._fullWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdays(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n                this._shortWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdaysShort(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n                this._minWeekdaysParse[i] = new RegExp(\n                    '^' + this.weekdaysMin(mom, '').replace('.', '\\\\.?') + '$',\n                    'i'\n                );\n            }\n            if (!this._weekdaysParse[i]) {\n                regex =\n                    '^' +\n                    this.weekdays(mom, '') +\n                    '|^' +\n                    this.weekdaysShort(mom, '') +\n                    '|^' +\n                    this.weekdaysMin(mom, '');\n                this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n            }\n            // test the regex\n            if (\n                strict &&\n                format === 'dddd' &&\n                this._fullWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'ddd' &&\n                this._shortWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (\n                strict &&\n                format === 'dd' &&\n                this._minWeekdaysParse[i].test(weekdayName)\n            ) {\n                return i;\n            } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n                return i;\n            }\n        }\n    }\n\n    // MOMENTS\n\n    function getSetDayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();\n        if (input != null) {\n            input = parseWeekday(input, this.localeData());\n            return this.add(input - day, 'd');\n        } else {\n            return day;\n        }\n    }\n\n    function getSetLocaleDayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n        return input == null ? weekday : this.add(input - weekday, 'd');\n    }\n\n    function getSetISODayOfWeek(input) {\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n\n        // behaves the same as moment#day except\n        // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n        // as a setter, sunday should belong to the previous week.\n\n        if (input != null) {\n            var weekday = parseIsoWeekday(input, this.localeData());\n            return this.day(this.day() % 7 ? weekday : weekday - 7);\n        } else {\n            return this.day() || 7;\n        }\n    }\n\n    function weekdaysRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysStrictRegex;\n            } else {\n                return this._weekdaysRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                this._weekdaysRegex = defaultWeekdaysRegex;\n            }\n            return this._weekdaysStrictRegex && isStrict\n                ? this._weekdaysStrictRegex\n                : this._weekdaysRegex;\n        }\n    }\n\n    function weekdaysShortRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysShortStrictRegex;\n            } else {\n                return this._weekdaysShortRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n                this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n            }\n            return this._weekdaysShortStrictRegex && isStrict\n                ? this._weekdaysShortStrictRegex\n                : this._weekdaysShortRegex;\n        }\n    }\n\n    function weekdaysMinRegex(isStrict) {\n        if (this._weekdaysParseExact) {\n            if (!hasOwnProp(this, '_weekdaysRegex')) {\n                computeWeekdaysParse.call(this);\n            }\n            if (isStrict) {\n                return this._weekdaysMinStrictRegex;\n            } else {\n                return this._weekdaysMinRegex;\n            }\n        } else {\n            if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n                this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n            }\n            return this._weekdaysMinStrictRegex && isStrict\n                ? this._weekdaysMinStrictRegex\n                : this._weekdaysMinRegex;\n        }\n    }\n\n    function computeWeekdaysParse() {\n        function cmpLenRev(a, b) {\n            return b.length - a.length;\n        }\n\n        var minPieces = [],\n            shortPieces = [],\n            longPieces = [],\n            mixedPieces = [],\n            i,\n            mom,\n            minp,\n            shortp,\n            longp;\n        for (i = 0; i < 7; i++) {\n            // make the regex if we don't have it already\n            mom = createUTC([2000, 1]).day(i);\n            minp = regexEscape(this.weekdaysMin(mom, ''));\n            shortp = regexEscape(this.weekdaysShort(mom, ''));\n            longp = regexEscape(this.weekdays(mom, ''));\n            minPieces.push(minp);\n            shortPieces.push(shortp);\n            longPieces.push(longp);\n            mixedPieces.push(minp);\n            mixedPieces.push(shortp);\n            mixedPieces.push(longp);\n        }\n        // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n        // will match the longer piece.\n        minPieces.sort(cmpLenRev);\n        shortPieces.sort(cmpLenRev);\n        longPieces.sort(cmpLenRev);\n        mixedPieces.sort(cmpLenRev);\n\n        this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._weekdaysShortRegex = this._weekdaysRegex;\n        this._weekdaysMinRegex = this._weekdaysRegex;\n\n        this._weekdaysStrictRegex = new RegExp(\n            '^(' + longPieces.join('|') + ')',\n            'i'\n        );\n        this._weekdaysShortStrictRegex = new RegExp(\n            '^(' + shortPieces.join('|') + ')',\n            'i'\n        );\n        this._weekdaysMinStrictRegex = new RegExp(\n            '^(' + minPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    // FORMATTING\n\n    function hFormat() {\n        return this.hours() % 12 || 12;\n    }\n\n    function kFormat() {\n        return this.hours() || 24;\n    }\n\n    addFormatToken('H', ['HH', 2], 0, 'hour');\n    addFormatToken('h', ['hh', 2], 0, hFormat);\n    addFormatToken('k', ['kk', 2], 0, kFormat);\n\n    addFormatToken('hmm', 0, 0, function () {\n        return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('hmmss', 0, 0, function () {\n        return (\n            '' +\n            hFormat.apply(this) +\n            zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2)\n        );\n    });\n\n    addFormatToken('Hmm', 0, 0, function () {\n        return '' + this.hours() + zeroFill(this.minutes(), 2);\n    });\n\n    addFormatToken('Hmmss', 0, 0, function () {\n        return (\n            '' +\n            this.hours() +\n            zeroFill(this.minutes(), 2) +\n            zeroFill(this.seconds(), 2)\n        );\n    });\n\n    function meridiem(token, lowercase) {\n        addFormatToken(token, 0, 0, function () {\n            return this.localeData().meridiem(\n                this.hours(),\n                this.minutes(),\n                lowercase\n            );\n        });\n    }\n\n    meridiem('a', true);\n    meridiem('A', false);\n\n    // ALIASES\n\n    addUnitAlias('hour', 'h');\n\n    // PRIORITY\n    addUnitPriority('hour', 13);\n\n    // PARSING\n\n    function matchMeridiem(isStrict, locale) {\n        return locale._meridiemParse;\n    }\n\n    addRegexToken('a', matchMeridiem);\n    addRegexToken('A', matchMeridiem);\n    addRegexToken('H', match1to2);\n    addRegexToken('h', match1to2);\n    addRegexToken('k', match1to2);\n    addRegexToken('HH', match1to2, match2);\n    addRegexToken('hh', match1to2, match2);\n    addRegexToken('kk', match1to2, match2);\n\n    addRegexToken('hmm', match3to4);\n    addRegexToken('hmmss', match5to6);\n    addRegexToken('Hmm', match3to4);\n    addRegexToken('Hmmss', match5to6);\n\n    addParseToken(['H', 'HH'], HOUR);\n    addParseToken(['k', 'kk'], function (input, array, config) {\n        var kInput = toInt(input);\n        array[HOUR] = kInput === 24 ? 0 : kInput;\n    });\n    addParseToken(['a', 'A'], function (input, array, config) {\n        config._isPm = config._locale.isPM(input);\n        config._meridiem = input;\n    });\n    addParseToken(['h', 'hh'], function (input, array, config) {\n        array[HOUR] = toInt(input);\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('hmmss', function (input, array, config) {\n        var pos1 = input.length - 4,\n            pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n        getParsingFlags(config).bigHour = true;\n    });\n    addParseToken('Hmm', function (input, array, config) {\n        var pos = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos));\n        array[MINUTE] = toInt(input.substr(pos));\n    });\n    addParseToken('Hmmss', function (input, array, config) {\n        var pos1 = input.length - 4,\n            pos2 = input.length - 2;\n        array[HOUR] = toInt(input.substr(0, pos1));\n        array[MINUTE] = toInt(input.substr(pos1, 2));\n        array[SECOND] = toInt(input.substr(pos2));\n    });\n\n    // LOCALES\n\n    function localeIsPM(input) {\n        // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n        // Using charAt should be more compatible.\n        return (input + '').toLowerCase().charAt(0) === 'p';\n    }\n\n    var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i,\n        // Setting the hour should keep the time, because the user explicitly\n        // specified which hour they want. So trying to maintain the same hour (in\n        // a new timezone) makes sense. Adding/subtracting hours does not follow\n        // this rule.\n        getSetHour = makeGetSet('Hours', true);\n\n    function localeMeridiem(hours, minutes, isLower) {\n        if (hours > 11) {\n            return isLower ? 'pm' : 'PM';\n        } else {\n            return isLower ? 'am' : 'AM';\n        }\n    }\n\n    var baseConfig = {\n        calendar: defaultCalendar,\n        longDateFormat: defaultLongDateFormat,\n        invalidDate: defaultInvalidDate,\n        ordinal: defaultOrdinal,\n        dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n        relativeTime: defaultRelativeTime,\n\n        months: defaultLocaleMonths,\n        monthsShort: defaultLocaleMonthsShort,\n\n        week: defaultLocaleWeek,\n\n        weekdays: defaultLocaleWeekdays,\n        weekdaysMin: defaultLocaleWeekdaysMin,\n        weekdaysShort: defaultLocaleWeekdaysShort,\n\n        meridiemParse: defaultLocaleMeridiemParse,\n    };\n\n    // internal storage for locale config files\n    var locales = {},\n        localeFamilies = {},\n        globalLocale;\n\n    function commonPrefix(arr1, arr2) {\n        var i,\n            minl = Math.min(arr1.length, arr2.length);\n        for (i = 0; i < minl; i += 1) {\n            if (arr1[i] !== arr2[i]) {\n                return i;\n            }\n        }\n        return minl;\n    }\n\n    function normalizeLocale(key) {\n        return key ? key.toLowerCase().replace('_', '-') : key;\n    }\n\n    // pick the locale from the array\n    // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n    // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n    function chooseLocale(names) {\n        var i = 0,\n            j,\n            next,\n            locale,\n            split;\n\n        while (i < names.length) {\n            split = normalizeLocale(names[i]).split('-');\n            j = split.length;\n            next = normalizeLocale(names[i + 1]);\n            next = next ? next.split('-') : null;\n            while (j > 0) {\n                locale = loadLocale(split.slice(0, j).join('-'));\n                if (locale) {\n                    return locale;\n                }\n                if (\n                    next &&\n                    next.length >= j &&\n                    commonPrefix(split, next) >= j - 1\n                ) {\n                    //the next array item is better than a shallower substring of this one\n                    break;\n                }\n                j--;\n            }\n            i++;\n        }\n        return globalLocale;\n    }\n\n    function isLocaleNameSane(name) {\n        // Prevent names that look like filesystem paths, i.e contain '/' or '\\'\n        return name.match('^[^/\\\\\\\\]*$') != null;\n    }\n\n    function loadLocale(name) {\n        var oldLocale = null,\n            aliasedRequire;\n        // TODO: Find a better way to register and load all the locales in Node\n        if (\n            locales[name] === undefined &&\n            typeof module !== 'undefined' &&\n            module &&\n            module.exports &&\n            isLocaleNameSane(name)\n        ) {\n            try {\n                oldLocale = globalLocale._abbr;\n                aliasedRequire = require;\n                aliasedRequire('./locale/' + name);\n                getSetGlobalLocale(oldLocale);\n            } catch (e) {\n                // mark as not found to avoid repeating expensive file require call causing high CPU\n                // when trying to find en-US, en_US, en-us for every format call\n                locales[name] = null; // null means not found\n            }\n        }\n        return locales[name];\n    }\n\n    // This function will load locale and then set the global locale.  If\n    // no arguments are passed in, it will simply return the current global\n    // locale key.\n    function getSetGlobalLocale(key, values) {\n        var data;\n        if (key) {\n            if (isUndefined(values)) {\n                data = getLocale(key);\n            } else {\n                data = defineLocale(key, values);\n            }\n\n            if (data) {\n                // moment.duration._locale = moment._locale = data;\n                globalLocale = data;\n            } else {\n                if (typeof console !== 'undefined' && console.warn) {\n                    //warn user if arguments are passed but the locale could not be set\n                    console.warn(\n                        'Locale ' + key + ' not found. Did you forget to load it?'\n                    );\n                }\n            }\n        }\n\n        return globalLocale._abbr;\n    }\n\n    function defineLocale(name, config) {\n        if (config !== null) {\n            var locale,\n                parentConfig = baseConfig;\n            config.abbr = name;\n            if (locales[name] != null) {\n                deprecateSimple(\n                    'defineLocaleOverride',\n                    'use moment.updateLocale(localeName, config) to change ' +\n                        'an existing locale. moment.defineLocale(localeName, ' +\n                        'config) should only be used for creating a new locale ' +\n                        'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'\n                );\n                parentConfig = locales[name]._config;\n            } else if (config.parentLocale != null) {\n                if (locales[config.parentLocale] != null) {\n                    parentConfig = locales[config.parentLocale]._config;\n                } else {\n                    locale = loadLocale(config.parentLocale);\n                    if (locale != null) {\n                        parentConfig = locale._config;\n                    } else {\n                        if (!localeFamilies[config.parentLocale]) {\n                            localeFamilies[config.parentLocale] = [];\n                        }\n                        localeFamilies[config.parentLocale].push({\n                            name: name,\n                            config: config,\n                        });\n                        return null;\n                    }\n                }\n            }\n            locales[name] = new Locale(mergeConfigs(parentConfig, config));\n\n            if (localeFamilies[name]) {\n                localeFamilies[name].forEach(function (x) {\n                    defineLocale(x.name, x.config);\n                });\n            }\n\n            // backwards compat for now: also set the locale\n            // make sure we set the locale AFTER all child locales have been\n            // created, so we won't end up with the child locale set.\n            getSetGlobalLocale(name);\n\n            return locales[name];\n        } else {\n            // useful for testing\n            delete locales[name];\n            return null;\n        }\n    }\n\n    function updateLocale(name, config) {\n        if (config != null) {\n            var locale,\n                tmpLocale,\n                parentConfig = baseConfig;\n\n            if (locales[name] != null && locales[name].parentLocale != null) {\n                // Update existing child locale in-place to avoid memory-leaks\n                locales[name].set(mergeConfigs(locales[name]._config, config));\n            } else {\n                // MERGE\n                tmpLocale = loadLocale(name);\n                if (tmpLocale != null) {\n                    parentConfig = tmpLocale._config;\n                }\n                config = mergeConfigs(parentConfig, config);\n                if (tmpLocale == null) {\n                    // updateLocale is called for creating a new locale\n                    // Set abbr so it will have a name (getters return\n                    // undefined otherwise).\n                    config.abbr = name;\n                }\n                locale = new Locale(config);\n                locale.parentLocale = locales[name];\n                locales[name] = locale;\n            }\n\n            // backwards compat for now: also set the locale\n            getSetGlobalLocale(name);\n        } else {\n            // pass null for config to unupdate, useful for tests\n            if (locales[name] != null) {\n                if (locales[name].parentLocale != null) {\n                    locales[name] = locales[name].parentLocale;\n                    if (name === getSetGlobalLocale()) {\n                        getSetGlobalLocale(name);\n                    }\n                } else if (locales[name] != null) {\n                    delete locales[name];\n                }\n            }\n        }\n        return locales[name];\n    }\n\n    // returns locale data\n    function getLocale(key) {\n        var locale;\n\n        if (key && key._locale && key._locale._abbr) {\n            key = key._locale._abbr;\n        }\n\n        if (!key) {\n            return globalLocale;\n        }\n\n        if (!isArray(key)) {\n            //short-circuit everything else\n            locale = loadLocale(key);\n            if (locale) {\n                return locale;\n            }\n            key = [key];\n        }\n\n        return chooseLocale(key);\n    }\n\n    function listLocales() {\n        return keys(locales);\n    }\n\n    function checkOverflow(m) {\n        var overflow,\n            a = m._a;\n\n        if (a && getParsingFlags(m).overflow === -2) {\n            overflow =\n                a[MONTH] < 0 || a[MONTH] > 11\n                    ? MONTH\n                    : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH])\n                    ? DATE\n                    : a[HOUR] < 0 ||\n                      a[HOUR] > 24 ||\n                      (a[HOUR] === 24 &&\n                          (a[MINUTE] !== 0 ||\n                              a[SECOND] !== 0 ||\n                              a[MILLISECOND] !== 0))\n                    ? HOUR\n                    : a[MINUTE] < 0 || a[MINUTE] > 59\n                    ? MINUTE\n                    : a[SECOND] < 0 || a[SECOND] > 59\n                    ? SECOND\n                    : a[MILLISECOND] < 0 || a[MILLISECOND] > 999\n                    ? MILLISECOND\n                    : -1;\n\n            if (\n                getParsingFlags(m)._overflowDayOfYear &&\n                (overflow < YEAR || overflow > DATE)\n            ) {\n                overflow = DATE;\n            }\n            if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n                overflow = WEEK;\n            }\n            if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n                overflow = WEEKDAY;\n            }\n\n            getParsingFlags(m).overflow = overflow;\n        }\n\n        return m;\n    }\n\n    // iso 8601 regex\n    // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n    var extendedIsoRegex =\n            /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n        basicIsoRegex =\n            /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d|))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n        tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/,\n        isoDates = [\n            ['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/],\n            ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/],\n            ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/],\n            ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false],\n            ['YYYY-DDD', /\\d{4}-\\d{3}/],\n            ['YYYY-MM', /\\d{4}-\\d\\d/, false],\n            ['YYYYYYMMDD', /[+-]\\d{10}/],\n            ['YYYYMMDD', /\\d{8}/],\n            ['GGGG[W]WWE', /\\d{4}W\\d{3}/],\n            ['GGGG[W]WW', /\\d{4}W\\d{2}/, false],\n            ['YYYYDDD', /\\d{7}/],\n            ['YYYYMM', /\\d{6}/, false],\n            ['YYYY', /\\d{4}/, false],\n        ],\n        // iso time formats and regexes\n        isoTimes = [\n            ['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/],\n            ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/],\n            ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/],\n            ['HH:mm', /\\d\\d:\\d\\d/],\n            ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/],\n            ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/],\n            ['HHmmss', /\\d\\d\\d\\d\\d\\d/],\n            ['HHmm', /\\d\\d\\d\\d/],\n            ['HH', /\\d\\d/],\n        ],\n        aspNetJsonRegex = /^\\/?Date\\((-?\\d+)/i,\n        // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n        rfc2822 =\n            /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/,\n        obsOffsets = {\n            UT: 0,\n            GMT: 0,\n            EDT: -4 * 60,\n            EST: -5 * 60,\n            CDT: -5 * 60,\n            CST: -6 * 60,\n            MDT: -6 * 60,\n            MST: -7 * 60,\n            PDT: -7 * 60,\n            PST: -8 * 60,\n        };\n\n    // date from iso format\n    function configFromISO(config) {\n        var i,\n            l,\n            string = config._i,\n            match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n            allowTime,\n            dateFormat,\n            timeFormat,\n            tzFormat,\n            isoDatesLen = isoDates.length,\n            isoTimesLen = isoTimes.length;\n\n        if (match) {\n            getParsingFlags(config).iso = true;\n            for (i = 0, l = isoDatesLen; i < l; i++) {\n                if (isoDates[i][1].exec(match[1])) {\n                    dateFormat = isoDates[i][0];\n                    allowTime = isoDates[i][2] !== false;\n                    break;\n                }\n            }\n            if (dateFormat == null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[3]) {\n                for (i = 0, l = isoTimesLen; i < l; i++) {\n                    if (isoTimes[i][1].exec(match[3])) {\n                        // match[2] should be 'T' or space\n                        timeFormat = (match[2] || ' ') + isoTimes[i][0];\n                        break;\n                    }\n                }\n                if (timeFormat == null) {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            if (!allowTime && timeFormat != null) {\n                config._isValid = false;\n                return;\n            }\n            if (match[4]) {\n                if (tzRegex.exec(match[4])) {\n                    tzFormat = 'Z';\n                } else {\n                    config._isValid = false;\n                    return;\n                }\n            }\n            config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n            configFromStringAndFormat(config);\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    function extractFromRFC2822Strings(\n        yearStr,\n        monthStr,\n        dayStr,\n        hourStr,\n        minuteStr,\n        secondStr\n    ) {\n        var result = [\n            untruncateYear(yearStr),\n            defaultLocaleMonthsShort.indexOf(monthStr),\n            parseInt(dayStr, 10),\n            parseInt(hourStr, 10),\n            parseInt(minuteStr, 10),\n        ];\n\n        if (secondStr) {\n            result.push(parseInt(secondStr, 10));\n        }\n\n        return result;\n    }\n\n    function untruncateYear(yearStr) {\n        var year = parseInt(yearStr, 10);\n        if (year <= 49) {\n            return 2000 + year;\n        } else if (year <= 999) {\n            return 1900 + year;\n        }\n        return year;\n    }\n\n    function preprocessRFC2822(s) {\n        // Remove comments and folding whitespace and replace multiple-spaces with a single space\n        return s\n            .replace(/\\([^)]*\\)|[\\n\\t]/g, ' ')\n            .replace(/(\\s\\s+)/g, ' ')\n            .replace(/^\\s\\s*/, '')\n            .replace(/\\s\\s*$/, '');\n    }\n\n    function checkWeekday(weekdayStr, parsedInput, config) {\n        if (weekdayStr) {\n            // TODO: Replace the vanilla JS Date object with an independent day-of-week check.\n            var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n                weekdayActual = new Date(\n                    parsedInput[0],\n                    parsedInput[1],\n                    parsedInput[2]\n                ).getDay();\n            if (weekdayProvided !== weekdayActual) {\n                getParsingFlags(config).weekdayMismatch = true;\n                config._isValid = false;\n                return false;\n            }\n        }\n        return true;\n    }\n\n    function calculateOffset(obsOffset, militaryOffset, numOffset) {\n        if (obsOffset) {\n            return obsOffsets[obsOffset];\n        } else if (militaryOffset) {\n            // the only allowed military tz is Z\n            return 0;\n        } else {\n            var hm = parseInt(numOffset, 10),\n                m = hm % 100,\n                h = (hm - m) / 100;\n            return h * 60 + m;\n        }\n    }\n\n    // date and time from ref 2822 format\n    function configFromRFC2822(config) {\n        var match = rfc2822.exec(preprocessRFC2822(config._i)),\n            parsedArray;\n        if (match) {\n            parsedArray = extractFromRFC2822Strings(\n                match[4],\n                match[3],\n                match[2],\n                match[5],\n                match[6],\n                match[7]\n            );\n            if (!checkWeekday(match[1], parsedArray, config)) {\n                return;\n            }\n\n            config._a = parsedArray;\n            config._tzm = calculateOffset(match[8], match[9], match[10]);\n\n            config._d = createUTCDate.apply(null, config._a);\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n\n            getParsingFlags(config).rfc2822 = true;\n        } else {\n            config._isValid = false;\n        }\n    }\n\n    // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict\n    function configFromString(config) {\n        var matched = aspNetJsonRegex.exec(config._i);\n        if (matched !== null) {\n            config._d = new Date(+matched[1]);\n            return;\n        }\n\n        configFromISO(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n        } else {\n            return;\n        }\n\n        configFromRFC2822(config);\n        if (config._isValid === false) {\n            delete config._isValid;\n        } else {\n            return;\n        }\n\n        if (config._strict) {\n            config._isValid = false;\n        } else {\n            // Final attempt, use Input Fallback\n            hooks.createFromInputFallback(config);\n        }\n    }\n\n    hooks.createFromInputFallback = deprecate(\n        'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' +\n            'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' +\n            'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.',\n        function (config) {\n            config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n        }\n    );\n\n    // Pick the first defined of two or three arguments.\n    function defaults(a, b, c) {\n        if (a != null) {\n            return a;\n        }\n        if (b != null) {\n            return b;\n        }\n        return c;\n    }\n\n    function currentDateArray(config) {\n        // hooks is actually the exported moment object\n        var nowValue = new Date(hooks.now());\n        if (config._useUTC) {\n            return [\n                nowValue.getUTCFullYear(),\n                nowValue.getUTCMonth(),\n                nowValue.getUTCDate(),\n            ];\n        }\n        return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n    }\n\n    // convert an array to a date.\n    // the array should mirror the parameters below\n    // note: all values past the year are optional and will default to the lowest possible value.\n    // [year, month, day , hour, minute, second, millisecond]\n    function configFromArray(config) {\n        var i,\n            date,\n            input = [],\n            currentDate,\n            expectedWeekday,\n            yearToUse;\n\n        if (config._d) {\n            return;\n        }\n\n        currentDate = currentDateArray(config);\n\n        //compute day of the year from weeks and weekdays\n        if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n            dayOfYearFromWeekInfo(config);\n        }\n\n        //if the day of the year is set, figure out what it is\n        if (config._dayOfYear != null) {\n            yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n\n            if (\n                config._dayOfYear > daysInYear(yearToUse) ||\n                config._dayOfYear === 0\n            ) {\n                getParsingFlags(config)._overflowDayOfYear = true;\n            }\n\n            date = createUTCDate(yearToUse, 0, config._dayOfYear);\n            config._a[MONTH] = date.getUTCMonth();\n            config._a[DATE] = date.getUTCDate();\n        }\n\n        // Default to current date.\n        // * if no year, month, day of month are given, default to today\n        // * if day of month is given, default month and year\n        // * if month is given, default only year\n        // * if year is given, don't default anything\n        for (i = 0; i < 3 && config._a[i] == null; ++i) {\n            config._a[i] = input[i] = currentDate[i];\n        }\n\n        // Zero out whatever was not defaulted, including time\n        for (; i < 7; i++) {\n            config._a[i] = input[i] =\n                config._a[i] == null ? (i === 2 ? 1 : 0) : config._a[i];\n        }\n\n        // Check for 24:00:00.000\n        if (\n            config._a[HOUR] === 24 &&\n            config._a[MINUTE] === 0 &&\n            config._a[SECOND] === 0 &&\n            config._a[MILLISECOND] === 0\n        ) {\n            config._nextDay = true;\n            config._a[HOUR] = 0;\n        }\n\n        config._d = (config._useUTC ? createUTCDate : createDate).apply(\n            null,\n            input\n        );\n        expectedWeekday = config._useUTC\n            ? config._d.getUTCDay()\n            : config._d.getDay();\n\n        // Apply timezone offset from input. The actual utcOffset can be changed\n        // with parseZone.\n        if (config._tzm != null) {\n            config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n        }\n\n        if (config._nextDay) {\n            config._a[HOUR] = 24;\n        }\n\n        // check for mismatching day of week\n        if (\n            config._w &&\n            typeof config._w.d !== 'undefined' &&\n            config._w.d !== expectedWeekday\n        ) {\n            getParsingFlags(config).weekdayMismatch = true;\n        }\n    }\n\n    function dayOfYearFromWeekInfo(config) {\n        var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;\n\n        w = config._w;\n        if (w.GG != null || w.W != null || w.E != null) {\n            dow = 1;\n            doy = 4;\n\n            // TODO: We need to take the current isoWeekYear, but that depends on\n            // how we interpret now (local, utc, fixed offset). So create\n            // a now version of current config (take local/utc/offset flags, and\n            // create now).\n            weekYear = defaults(\n                w.GG,\n                config._a[YEAR],\n                weekOfYear(createLocal(), 1, 4).year\n            );\n            week = defaults(w.W, 1);\n            weekday = defaults(w.E, 1);\n            if (weekday < 1 || weekday > 7) {\n                weekdayOverflow = true;\n            }\n        } else {\n            dow = config._locale._week.dow;\n            doy = config._locale._week.doy;\n\n            curWeek = weekOfYear(createLocal(), dow, doy);\n\n            weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n            // Default to current week.\n            week = defaults(w.w, curWeek.week);\n\n            if (w.d != null) {\n                // weekday -- low day numbers are considered next week\n                weekday = w.d;\n                if (weekday < 0 || weekday > 6) {\n                    weekdayOverflow = true;\n                }\n            } else if (w.e != null) {\n                // local weekday -- counting starts from beginning of week\n                weekday = w.e + dow;\n                if (w.e < 0 || w.e > 6) {\n                    weekdayOverflow = true;\n                }\n            } else {\n                // default to beginning of week\n                weekday = dow;\n            }\n        }\n        if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n            getParsingFlags(config)._overflowWeeks = true;\n        } else if (weekdayOverflow != null) {\n            getParsingFlags(config)._overflowWeekday = true;\n        } else {\n            temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n            config._a[YEAR] = temp.year;\n            config._dayOfYear = temp.dayOfYear;\n        }\n    }\n\n    // constant that refers to the ISO standard\n    hooks.ISO_8601 = function () {};\n\n    // constant that refers to the RFC 2822 form\n    hooks.RFC_2822 = function () {};\n\n    // date from string and format string\n    function configFromStringAndFormat(config) {\n        // TODO: Move this to another part of the creation flow to prevent circular deps\n        if (config._f === hooks.ISO_8601) {\n            configFromISO(config);\n            return;\n        }\n        if (config._f === hooks.RFC_2822) {\n            configFromRFC2822(config);\n            return;\n        }\n        config._a = [];\n        getParsingFlags(config).empty = true;\n\n        // This array is used to make a Date, either with `new Date` or `Date.UTC`\n        var string = '' + config._i,\n            i,\n            parsedInput,\n            tokens,\n            token,\n            skipped,\n            stringLength = string.length,\n            totalParsedInputLength = 0,\n            era,\n            tokenLen;\n\n        tokens =\n            expandFormat(config._f, config._locale).match(formattingTokens) || [];\n        tokenLen = tokens.length;\n        for (i = 0; i < tokenLen; i++) {\n            token = tokens[i];\n            parsedInput = (string.match(getParseRegexForToken(token, config)) ||\n                [])[0];\n            if (parsedInput) {\n                skipped = string.substr(0, string.indexOf(parsedInput));\n                if (skipped.length > 0) {\n                    getParsingFlags(config).unusedInput.push(skipped);\n                }\n                string = string.slice(\n                    string.indexOf(parsedInput) + parsedInput.length\n                );\n                totalParsedInputLength += parsedInput.length;\n            }\n            // don't parse if it's not a known token\n            if (formatTokenFunctions[token]) {\n                if (parsedInput) {\n                    getParsingFlags(config).empty = false;\n                } else {\n                    getParsingFlags(config).unusedTokens.push(token);\n                }\n                addTimeToArrayFromToken(token, parsedInput, config);\n            } else if (config._strict && !parsedInput) {\n                getParsingFlags(config).unusedTokens.push(token);\n            }\n        }\n\n        // add remaining unparsed input length to the string\n        getParsingFlags(config).charsLeftOver =\n            stringLength - totalParsedInputLength;\n        if (string.length > 0) {\n            getParsingFlags(config).unusedInput.push(string);\n        }\n\n        // clear _12h flag if hour is <= 12\n        if (\n            config._a[HOUR] <= 12 &&\n            getParsingFlags(config).bigHour === true &&\n            config._a[HOUR] > 0\n        ) {\n            getParsingFlags(config).bigHour = undefined;\n        }\n\n        getParsingFlags(config).parsedDateParts = config._a.slice(0);\n        getParsingFlags(config).meridiem = config._meridiem;\n        // handle meridiem\n        config._a[HOUR] = meridiemFixWrap(\n            config._locale,\n            config._a[HOUR],\n            config._meridiem\n        );\n\n        // handle era\n        era = getParsingFlags(config).era;\n        if (era !== null) {\n            config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);\n        }\n\n        configFromArray(config);\n        checkOverflow(config);\n    }\n\n    function meridiemFixWrap(locale, hour, meridiem) {\n        var isPm;\n\n        if (meridiem == null) {\n            // nothing to do\n            return hour;\n        }\n        if (locale.meridiemHour != null) {\n            return locale.meridiemHour(hour, meridiem);\n        } else if (locale.isPM != null) {\n            // Fallback\n            isPm = locale.isPM(meridiem);\n            if (isPm && hour < 12) {\n                hour += 12;\n            }\n            if (!isPm && hour === 12) {\n                hour = 0;\n            }\n            return hour;\n        } else {\n            // this is not supposed to happen\n            return hour;\n        }\n    }\n\n    // date from string and array of format strings\n    function configFromStringAndArray(config) {\n        var tempConfig,\n            bestMoment,\n            scoreToBeat,\n            i,\n            currentScore,\n            validFormatFound,\n            bestFormatIsValid = false,\n            configfLen = config._f.length;\n\n        if (configfLen === 0) {\n            getParsingFlags(config).invalidFormat = true;\n            config._d = new Date(NaN);\n            return;\n        }\n\n        for (i = 0; i < configfLen; i++) {\n            currentScore = 0;\n            validFormatFound = false;\n            tempConfig = copyConfig({}, config);\n            if (config._useUTC != null) {\n                tempConfig._useUTC = config._useUTC;\n            }\n            tempConfig._f = config._f[i];\n            configFromStringAndFormat(tempConfig);\n\n            if (isValid(tempConfig)) {\n                validFormatFound = true;\n            }\n\n            // if there is any input that was not parsed add a penalty for that format\n            currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n            //or tokens\n            currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n\n            getParsingFlags(tempConfig).score = currentScore;\n\n            if (!bestFormatIsValid) {\n                if (\n                    scoreToBeat == null ||\n                    currentScore < scoreToBeat ||\n                    validFormatFound\n                ) {\n                    scoreToBeat = currentScore;\n                    bestMoment = tempConfig;\n                    if (validFormatFound) {\n                        bestFormatIsValid = true;\n                    }\n                }\n            } else {\n                if (currentScore < scoreToBeat) {\n                    scoreToBeat = currentScore;\n                    bestMoment = tempConfig;\n                }\n            }\n        }\n\n        extend(config, bestMoment || tempConfig);\n    }\n\n    function configFromObject(config) {\n        if (config._d) {\n            return;\n        }\n\n        var i = normalizeObjectUnits(config._i),\n            dayOrDate = i.day === undefined ? i.date : i.day;\n        config._a = map(\n            [i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond],\n            function (obj) {\n                return obj && parseInt(obj, 10);\n            }\n        );\n\n        configFromArray(config);\n    }\n\n    function createFromConfig(config) {\n        var res = new Moment(checkOverflow(prepareConfig(config)));\n        if (res._nextDay) {\n            // Adding is smart enough around DST\n            res.add(1, 'd');\n            res._nextDay = undefined;\n        }\n\n        return res;\n    }\n\n    function prepareConfig(config) {\n        var input = config._i,\n            format = config._f;\n\n        config._locale = config._locale || getLocale(config._l);\n\n        if (input === null || (format === undefined && input === '')) {\n            return createInvalid({ nullInput: true });\n        }\n\n        if (typeof input === 'string') {\n            config._i = input = config._locale.preparse(input);\n        }\n\n        if (isMoment(input)) {\n            return new Moment(checkOverflow(input));\n        } else if (isDate(input)) {\n            config._d = input;\n        } else if (isArray(format)) {\n            configFromStringAndArray(config);\n        } else if (format) {\n            configFromStringAndFormat(config);\n        } else {\n            configFromInput(config);\n        }\n\n        if (!isValid(config)) {\n            config._d = null;\n        }\n\n        return config;\n    }\n\n    function configFromInput(config) {\n        var input = config._i;\n        if (isUndefined(input)) {\n            config._d = new Date(hooks.now());\n        } else if (isDate(input)) {\n            config._d = new Date(input.valueOf());\n        } else if (typeof input === 'string') {\n            configFromString(config);\n        } else if (isArray(input)) {\n            config._a = map(input.slice(0), function (obj) {\n                return parseInt(obj, 10);\n            });\n            configFromArray(config);\n        } else if (isObject(input)) {\n            configFromObject(config);\n        } else if (isNumber(input)) {\n            // from milliseconds\n            config._d = new Date(input);\n        } else {\n            hooks.createFromInputFallback(config);\n        }\n    }\n\n    function createLocalOrUTC(input, format, locale, strict, isUTC) {\n        var c = {};\n\n        if (format === true || format === false) {\n            strict = format;\n            format = undefined;\n        }\n\n        if (locale === true || locale === false) {\n            strict = locale;\n            locale = undefined;\n        }\n\n        if (\n            (isObject(input) && isObjectEmpty(input)) ||\n            (isArray(input) && input.length === 0)\n        ) {\n            input = undefined;\n        }\n        // object construction must be done this way.\n        // https://github.com/moment/moment/issues/1423\n        c._isAMomentObject = true;\n        c._useUTC = c._isUTC = isUTC;\n        c._l = locale;\n        c._i = input;\n        c._f = format;\n        c._strict = strict;\n\n        return createFromConfig(c);\n    }\n\n    function createLocal(input, format, locale, strict) {\n        return createLocalOrUTC(input, format, locale, strict, false);\n    }\n\n    var prototypeMin = deprecate(\n            'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/',\n            function () {\n                var other = createLocal.apply(null, arguments);\n                if (this.isValid() && other.isValid()) {\n                    return other < this ? this : other;\n                } else {\n                    return createInvalid();\n                }\n            }\n        ),\n        prototypeMax = deprecate(\n            'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/',\n            function () {\n                var other = createLocal.apply(null, arguments);\n                if (this.isValid() && other.isValid()) {\n                    return other > this ? this : other;\n                } else {\n                    return createInvalid();\n                }\n            }\n        );\n\n    // Pick a moment m from moments so that m[fn](other) is true for all\n    // other. This relies on the function fn to be transitive.\n    //\n    // moments should either be an array of moment objects or an array, whose\n    // first element is an array of moment objects.\n    function pickBy(fn, moments) {\n        var res, i;\n        if (moments.length === 1 && isArray(moments[0])) {\n            moments = moments[0];\n        }\n        if (!moments.length) {\n            return createLocal();\n        }\n        res = moments[0];\n        for (i = 1; i < moments.length; ++i) {\n            if (!moments[i].isValid() || moments[i][fn](res)) {\n                res = moments[i];\n            }\n        }\n        return res;\n    }\n\n    // TODO: Use [].sort instead?\n    function min() {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isBefore', args);\n    }\n\n    function max() {\n        var args = [].slice.call(arguments, 0);\n\n        return pickBy('isAfter', args);\n    }\n\n    var now = function () {\n        return Date.now ? Date.now() : +new Date();\n    };\n\n    var ordering = [\n        'year',\n        'quarter',\n        'month',\n        'week',\n        'day',\n        'hour',\n        'minute',\n        'second',\n        'millisecond',\n    ];\n\n    function isDurationValid(m) {\n        var key,\n            unitHasDecimal = false,\n            i,\n            orderLen = ordering.length;\n        for (key in m) {\n            if (\n                hasOwnProp(m, key) &&\n                !(\n                    indexOf.call(ordering, key) !== -1 &&\n                    (m[key] == null || !isNaN(m[key]))\n                )\n            ) {\n                return false;\n            }\n        }\n\n        for (i = 0; i < orderLen; ++i) {\n            if (m[ordering[i]]) {\n                if (unitHasDecimal) {\n                    return false; // only allow non-integers for smallest unit\n                }\n                if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n                    unitHasDecimal = true;\n                }\n            }\n        }\n\n        return true;\n    }\n\n    function isValid$1() {\n        return this._isValid;\n    }\n\n    function createInvalid$1() {\n        return createDuration(NaN);\n    }\n\n    function Duration(duration) {\n        var normalizedInput = normalizeObjectUnits(duration),\n            years = normalizedInput.year || 0,\n            quarters = normalizedInput.quarter || 0,\n            months = normalizedInput.month || 0,\n            weeks = normalizedInput.week || normalizedInput.isoWeek || 0,\n            days = normalizedInput.day || 0,\n            hours = normalizedInput.hour || 0,\n            minutes = normalizedInput.minute || 0,\n            seconds = normalizedInput.second || 0,\n            milliseconds = normalizedInput.millisecond || 0;\n\n        this._isValid = isDurationValid(normalizedInput);\n\n        // representation for dateAddRemove\n        this._milliseconds =\n            +milliseconds +\n            seconds * 1e3 + // 1000\n            minutes * 6e4 + // 1000 * 60\n            hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n        // Because of dateAddRemove treats 24 hours as different from a\n        // day when working around DST, we need to store them separately\n        this._days = +days + weeks * 7;\n        // It is impossible to translate months into days without knowing\n        // which months you are are talking about, so we have to store\n        // it separately.\n        this._months = +months + quarters * 3 + years * 12;\n\n        this._data = {};\n\n        this._locale = getLocale();\n\n        this._bubble();\n    }\n\n    function isDuration(obj) {\n        return obj instanceof Duration;\n    }\n\n    function absRound(number) {\n        if (number < 0) {\n            return Math.round(-1 * number) * -1;\n        } else {\n            return Math.round(number);\n        }\n    }\n\n    // compare two arrays, return the number of differences\n    function compareArrays(array1, array2, dontConvert) {\n        var len = Math.min(array1.length, array2.length),\n            lengthDiff = Math.abs(array1.length - array2.length),\n            diffs = 0,\n            i;\n        for (i = 0; i < len; i++) {\n            if (\n                (dontConvert && array1[i] !== array2[i]) ||\n                (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))\n            ) {\n                diffs++;\n            }\n        }\n        return diffs + lengthDiff;\n    }\n\n    // FORMATTING\n\n    function offset(token, separator) {\n        addFormatToken(token, 0, 0, function () {\n            var offset = this.utcOffset(),\n                sign = '+';\n            if (offset < 0) {\n                offset = -offset;\n                sign = '-';\n            }\n            return (\n                sign +\n                zeroFill(~~(offset / 60), 2) +\n                separator +\n                zeroFill(~~offset % 60, 2)\n            );\n        });\n    }\n\n    offset('Z', ':');\n    offset('ZZ', '');\n\n    // PARSING\n\n    addRegexToken('Z', matchShortOffset);\n    addRegexToken('ZZ', matchShortOffset);\n    addParseToken(['Z', 'ZZ'], function (input, array, config) {\n        config._useUTC = true;\n        config._tzm = offsetFromString(matchShortOffset, input);\n    });\n\n    // HELPERS\n\n    // timezone chunker\n    // '+10:00' > ['10',  '00']\n    // '-1530'  > ['-15', '30']\n    var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n\n    function offsetFromString(matcher, string) {\n        var matches = (string || '').match(matcher),\n            chunk,\n            parts,\n            minutes;\n\n        if (matches === null) {\n            return null;\n        }\n\n        chunk = matches[matches.length - 1] || [];\n        parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n        minutes = +(parts[1] * 60) + toInt(parts[2]);\n\n        return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;\n    }\n\n    // Return a moment from input, that is local/utc/zone equivalent to model.\n    function cloneWithOffset(input, model) {\n        var res, diff;\n        if (model._isUTC) {\n            res = model.clone();\n            diff =\n                (isMoment(input) || isDate(input)\n                    ? input.valueOf()\n                    : createLocal(input).valueOf()) - res.valueOf();\n            // Use low-level api, because this fn is low-level api.\n            res._d.setTime(res._d.valueOf() + diff);\n            hooks.updateOffset(res, false);\n            return res;\n        } else {\n            return createLocal(input).local();\n        }\n    }\n\n    function getDateOffset(m) {\n        // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n        // https://github.com/moment/moment/pull/1871\n        return -Math.round(m._d.getTimezoneOffset());\n    }\n\n    // HOOKS\n\n    // This function will be called whenever a moment is mutated.\n    // It is intended to keep the offset in sync with the timezone.\n    hooks.updateOffset = function () {};\n\n    // MOMENTS\n\n    // keepLocalTime = true means only change the timezone, without\n    // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n    // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n    // +0200, so we adjust the time as needed, to be valid.\n    //\n    // Keeping the time actually adds/subtracts (one hour)\n    // from the actual represented time. That is why we call updateOffset\n    // a second time. In case it wants us to change the offset again\n    // _changeInProgress == true case, then we have to adjust, because\n    // there is no such time in the given timezone.\n    function getSetOffset(input, keepLocalTime, keepMinutes) {\n        var offset = this._offset || 0,\n            localAdjust;\n        if (!this.isValid()) {\n            return input != null ? this : NaN;\n        }\n        if (input != null) {\n            if (typeof input === 'string') {\n                input = offsetFromString(matchShortOffset, input);\n                if (input === null) {\n                    return this;\n                }\n            } else if (Math.abs(input) < 16 && !keepMinutes) {\n                input = input * 60;\n            }\n            if (!this._isUTC && keepLocalTime) {\n                localAdjust = getDateOffset(this);\n            }\n            this._offset = input;\n            this._isUTC = true;\n            if (localAdjust != null) {\n                this.add(localAdjust, 'm');\n            }\n            if (offset !== input) {\n                if (!keepLocalTime || this._changeInProgress) {\n                    addSubtract(\n                        this,\n                        createDuration(input - offset, 'm'),\n                        1,\n                        false\n                    );\n                } else if (!this._changeInProgress) {\n                    this._changeInProgress = true;\n                    hooks.updateOffset(this, true);\n                    this._changeInProgress = null;\n                }\n            }\n            return this;\n        } else {\n            return this._isUTC ? offset : getDateOffset(this);\n        }\n    }\n\n    function getSetZone(input, keepLocalTime) {\n        if (input != null) {\n            if (typeof input !== 'string') {\n                input = -input;\n            }\n\n            this.utcOffset(input, keepLocalTime);\n\n            return this;\n        } else {\n            return -this.utcOffset();\n        }\n    }\n\n    function setOffsetToUTC(keepLocalTime) {\n        return this.utcOffset(0, keepLocalTime);\n    }\n\n    function setOffsetToLocal(keepLocalTime) {\n        if (this._isUTC) {\n            this.utcOffset(0, keepLocalTime);\n            this._isUTC = false;\n\n            if (keepLocalTime) {\n                this.subtract(getDateOffset(this), 'm');\n            }\n        }\n        return this;\n    }\n\n    function setOffsetToParsedOffset() {\n        if (this._tzm != null) {\n            this.utcOffset(this._tzm, false, true);\n        } else if (typeof this._i === 'string') {\n            var tZone = offsetFromString(matchOffset, this._i);\n            if (tZone != null) {\n                this.utcOffset(tZone);\n            } else {\n                this.utcOffset(0, true);\n            }\n        }\n        return this;\n    }\n\n    function hasAlignedHourOffset(input) {\n        if (!this.isValid()) {\n            return false;\n        }\n        input = input ? createLocal(input).utcOffset() : 0;\n\n        return (this.utcOffset() - input) % 60 === 0;\n    }\n\n    function isDaylightSavingTime() {\n        return (\n            this.utcOffset() > this.clone().month(0).utcOffset() ||\n            this.utcOffset() > this.clone().month(5).utcOffset()\n        );\n    }\n\n    function isDaylightSavingTimeShifted() {\n        if (!isUndefined(this._isDSTShifted)) {\n            return this._isDSTShifted;\n        }\n\n        var c = {},\n            other;\n\n        copyConfig(c, this);\n        c = prepareConfig(c);\n\n        if (c._a) {\n            other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n            this._isDSTShifted =\n                this.isValid() && compareArrays(c._a, other.toArray()) > 0;\n        } else {\n            this._isDSTShifted = false;\n        }\n\n        return this._isDSTShifted;\n    }\n\n    function isLocal() {\n        return this.isValid() ? !this._isUTC : false;\n    }\n\n    function isUtcOffset() {\n        return this.isValid() ? this._isUTC : false;\n    }\n\n    function isUtc() {\n        return this.isValid() ? this._isUTC && this._offset === 0 : false;\n    }\n\n    // ASP.NET json date format regex\n    var aspNetRegex = /^(-|\\+)?(?:(\\d*)[. ])?(\\d+):(\\d+)(?::(\\d+)(\\.\\d*)?)?$/,\n        // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n        // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n        // and further modified to allow for strings containing both week and day\n        isoRegex =\n            /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n\n    function createDuration(input, key) {\n        var duration = input,\n            // matching against regexp is expensive, do it on demand\n            match = null,\n            sign,\n            ret,\n            diffRes;\n\n        if (isDuration(input)) {\n            duration = {\n                ms: input._milliseconds,\n                d: input._days,\n                M: input._months,\n            };\n        } else if (isNumber(input) || !isNaN(+input)) {\n            duration = {};\n            if (key) {\n                duration[key] = +input;\n            } else {\n                duration.milliseconds = +input;\n            }\n        } else if ((match = aspNetRegex.exec(input))) {\n            sign = match[1] === '-' ? -1 : 1;\n            duration = {\n                y: 0,\n                d: toInt(match[DATE]) * sign,\n                h: toInt(match[HOUR]) * sign,\n                m: toInt(match[MINUTE]) * sign,\n                s: toInt(match[SECOND]) * sign,\n                ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign, // the millisecond decimal point is included in the match\n            };\n        } else if ((match = isoRegex.exec(input))) {\n            sign = match[1] === '-' ? -1 : 1;\n            duration = {\n                y: parseIso(match[2], sign),\n                M: parseIso(match[3], sign),\n                w: parseIso(match[4], sign),\n                d: parseIso(match[5], sign),\n                h: parseIso(match[6], sign),\n                m: parseIso(match[7], sign),\n                s: parseIso(match[8], sign),\n            };\n        } else if (duration == null) {\n            // checks for null or undefined\n            duration = {};\n        } else if (\n            typeof duration === 'object' &&\n            ('from' in duration || 'to' in duration)\n        ) {\n            diffRes = momentsDifference(\n                createLocal(duration.from),\n                createLocal(duration.to)\n            );\n\n            duration = {};\n            duration.ms = diffRes.milliseconds;\n            duration.M = diffRes.months;\n        }\n\n        ret = new Duration(duration);\n\n        if (isDuration(input) && hasOwnProp(input, '_locale')) {\n            ret._locale = input._locale;\n        }\n\n        if (isDuration(input) && hasOwnProp(input, '_isValid')) {\n            ret._isValid = input._isValid;\n        }\n\n        return ret;\n    }\n\n    createDuration.fn = Duration.prototype;\n    createDuration.invalid = createInvalid$1;\n\n    function parseIso(inp, sign) {\n        // We'd normally use ~~inp for this, but unfortunately it also\n        // converts floats to ints.\n        // inp may be undefined, so careful calling replace on it.\n        var res = inp && parseFloat(inp.replace(',', '.'));\n        // apply sign while we're at it\n        return (isNaN(res) ? 0 : res) * sign;\n    }\n\n    function positiveMomentsDifference(base, other) {\n        var res = {};\n\n        res.months =\n            other.month() - base.month() + (other.year() - base.year()) * 12;\n        if (base.clone().add(res.months, 'M').isAfter(other)) {\n            --res.months;\n        }\n\n        res.milliseconds = +other - +base.clone().add(res.months, 'M');\n\n        return res;\n    }\n\n    function momentsDifference(base, other) {\n        var res;\n        if (!(base.isValid() && other.isValid())) {\n            return { milliseconds: 0, months: 0 };\n        }\n\n        other = cloneWithOffset(other, base);\n        if (base.isBefore(other)) {\n            res = positiveMomentsDifference(base, other);\n        } else {\n            res = positiveMomentsDifference(other, base);\n            res.milliseconds = -res.milliseconds;\n            res.months = -res.months;\n        }\n\n        return res;\n    }\n\n    // TODO: remove 'name' arg after deprecation is removed\n    function createAdder(direction, name) {\n        return function (val, period) {\n            var dur, tmp;\n            //invert the arguments, but complain about it\n            if (period !== null && !isNaN(+period)) {\n                deprecateSimple(\n                    name,\n                    'moment().' +\n                        name +\n                        '(period, number) is deprecated. Please use moment().' +\n                        name +\n                        '(number, period). ' +\n                        'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'\n                );\n                tmp = val;\n                val = period;\n                period = tmp;\n            }\n\n            dur = createDuration(val, period);\n            addSubtract(this, dur, direction);\n            return this;\n        };\n    }\n\n    function addSubtract(mom, duration, isAdding, updateOffset) {\n        var milliseconds = duration._milliseconds,\n            days = absRound(duration._days),\n            months = absRound(duration._months);\n\n        if (!mom.isValid()) {\n            // No op\n            return;\n        }\n\n        updateOffset = updateOffset == null ? true : updateOffset;\n\n        if (months) {\n            setMonth(mom, get(mom, 'Month') + months * isAdding);\n        }\n        if (days) {\n            set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n        }\n        if (milliseconds) {\n            mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n        }\n        if (updateOffset) {\n            hooks.updateOffset(mom, days || months);\n        }\n    }\n\n    var add = createAdder(1, 'add'),\n        subtract = createAdder(-1, 'subtract');\n\n    function isString(input) {\n        return typeof input === 'string' || input instanceof String;\n    }\n\n    // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined\n    function isMomentInput(input) {\n        return (\n            isMoment(input) ||\n            isDate(input) ||\n            isString(input) ||\n            isNumber(input) ||\n            isNumberOrStringArray(input) ||\n            isMomentInputObject(input) ||\n            input === null ||\n            input === undefined\n        );\n    }\n\n    function isMomentInputObject(input) {\n        var objectTest = isObject(input) && !isObjectEmpty(input),\n            propertyTest = false,\n            properties = [\n                'years',\n                'year',\n                'y',\n                'months',\n                'month',\n                'M',\n                'days',\n                'day',\n                'd',\n                'dates',\n                'date',\n                'D',\n                'hours',\n                'hour',\n                'h',\n                'minutes',\n                'minute',\n                'm',\n                'seconds',\n                'second',\n                's',\n                'milliseconds',\n                'millisecond',\n                'ms',\n            ],\n            i,\n            property,\n            propertyLen = properties.length;\n\n        for (i = 0; i < propertyLen; i += 1) {\n            property = properties[i];\n            propertyTest = propertyTest || hasOwnProp(input, property);\n        }\n\n        return objectTest && propertyTest;\n    }\n\n    function isNumberOrStringArray(input) {\n        var arrayTest = isArray(input),\n            dataTypeTest = false;\n        if (arrayTest) {\n            dataTypeTest =\n                input.filter(function (item) {\n                    return !isNumber(item) && isString(input);\n                }).length === 0;\n        }\n        return arrayTest && dataTypeTest;\n    }\n\n    function isCalendarSpec(input) {\n        var objectTest = isObject(input) && !isObjectEmpty(input),\n            propertyTest = false,\n            properties = [\n                'sameDay',\n                'nextDay',\n                'lastDay',\n                'nextWeek',\n                'lastWeek',\n                'sameElse',\n            ],\n            i,\n            property;\n\n        for (i = 0; i < properties.length; i += 1) {\n            property = properties[i];\n            propertyTest = propertyTest || hasOwnProp(input, property);\n        }\n\n        return objectTest && propertyTest;\n    }\n\n    function getCalendarFormat(myMoment, now) {\n        var diff = myMoment.diff(now, 'days', true);\n        return diff < -6\n            ? 'sameElse'\n            : diff < -1\n            ? 'lastWeek'\n            : diff < 0\n            ? 'lastDay'\n            : diff < 1\n            ? 'sameDay'\n            : diff < 2\n            ? 'nextDay'\n            : diff < 7\n            ? 'nextWeek'\n            : 'sameElse';\n    }\n\n    function calendar$1(time, formats) {\n        // Support for single parameter, formats only overload to the calendar function\n        if (arguments.length === 1) {\n            if (!arguments[0]) {\n                time = undefined;\n                formats = undefined;\n            } else if (isMomentInput(arguments[0])) {\n                time = arguments[0];\n                formats = undefined;\n            } else if (isCalendarSpec(arguments[0])) {\n                formats = arguments[0];\n                time = undefined;\n            }\n        }\n        // We want to compare the start of today, vs this.\n        // Getting start-of-today depends on whether we're local/utc/offset or not.\n        var now = time || createLocal(),\n            sod = cloneWithOffset(now, this).startOf('day'),\n            format = hooks.calendarFormat(this, sod) || 'sameElse',\n            output =\n                formats &&\n                (isFunction(formats[format])\n                    ? formats[format].call(this, now)\n                    : formats[format]);\n\n        return this.format(\n            output || this.localeData().calendar(format, this, createLocal(now))\n        );\n    }\n\n    function clone() {\n        return new Moment(this);\n    }\n\n    function isAfter(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() > localInput.valueOf();\n        } else {\n            return localInput.valueOf() < this.clone().startOf(units).valueOf();\n        }\n    }\n\n    function isBefore(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input);\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() < localInput.valueOf();\n        } else {\n            return this.clone().endOf(units).valueOf() < localInput.valueOf();\n        }\n    }\n\n    function isBetween(from, to, units, inclusivity) {\n        var localFrom = isMoment(from) ? from : createLocal(from),\n            localTo = isMoment(to) ? to : createLocal(to);\n        if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {\n            return false;\n        }\n        inclusivity = inclusivity || '()';\n        return (\n            (inclusivity[0] === '('\n                ? this.isAfter(localFrom, units)\n                : !this.isBefore(localFrom, units)) &&\n            (inclusivity[1] === ')'\n                ? this.isBefore(localTo, units)\n                : !this.isAfter(localTo, units))\n        );\n    }\n\n    function isSame(input, units) {\n        var localInput = isMoment(input) ? input : createLocal(input),\n            inputMs;\n        if (!(this.isValid() && localInput.isValid())) {\n            return false;\n        }\n        units = normalizeUnits(units) || 'millisecond';\n        if (units === 'millisecond') {\n            return this.valueOf() === localInput.valueOf();\n        } else {\n            inputMs = localInput.valueOf();\n            return (\n                this.clone().startOf(units).valueOf() <= inputMs &&\n                inputMs <= this.clone().endOf(units).valueOf()\n            );\n        }\n    }\n\n    function isSameOrAfter(input, units) {\n        return this.isSame(input, units) || this.isAfter(input, units);\n    }\n\n    function isSameOrBefore(input, units) {\n        return this.isSame(input, units) || this.isBefore(input, units);\n    }\n\n    function diff(input, units, asFloat) {\n        var that, zoneDelta, output;\n\n        if (!this.isValid()) {\n            return NaN;\n        }\n\n        that = cloneWithOffset(input, this);\n\n        if (!that.isValid()) {\n            return NaN;\n        }\n\n        zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n\n        units = normalizeUnits(units);\n\n        switch (units) {\n            case 'year':\n                output = monthDiff(this, that) / 12;\n                break;\n            case 'month':\n                output = monthDiff(this, that);\n                break;\n            case 'quarter':\n                output = monthDiff(this, that) / 3;\n                break;\n            case 'second':\n                output = (this - that) / 1e3;\n                break; // 1000\n            case 'minute':\n                output = (this - that) / 6e4;\n                break; // 1000 * 60\n            case 'hour':\n                output = (this - that) / 36e5;\n                break; // 1000 * 60 * 60\n            case 'day':\n                output = (this - that - zoneDelta) / 864e5;\n                break; // 1000 * 60 * 60 * 24, negate dst\n            case 'week':\n                output = (this - that - zoneDelta) / 6048e5;\n                break; // 1000 * 60 * 60 * 24 * 7, negate dst\n            default:\n                output = this - that;\n        }\n\n        return asFloat ? output : absFloor(output);\n    }\n\n    function monthDiff(a, b) {\n        if (a.date() < b.date()) {\n            // end-of-month calculations work correct when the start month has more\n            // days than the end month.\n            return -monthDiff(b, a);\n        }\n        // difference in months\n        var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),\n            // b is in (anchor - 1 month, anchor + 1 month)\n            anchor = a.clone().add(wholeMonthDiff, 'months'),\n            anchor2,\n            adjust;\n\n        if (b - anchor < 0) {\n            anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor - anchor2);\n        } else {\n            anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n            // linear across the month\n            adjust = (b - anchor) / (anchor2 - anchor);\n        }\n\n        //check for negative zero, return zero if negative zero\n        return -(wholeMonthDiff + adjust) || 0;\n    }\n\n    hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n    hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n\n    function toString() {\n        return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n    }\n\n    function toISOString(keepOffset) {\n        if (!this.isValid()) {\n            return null;\n        }\n        var utc = keepOffset !== true,\n            m = utc ? this.clone().utc() : this;\n        if (m.year() < 0 || m.year() > 9999) {\n            return formatMoment(\n                m,\n                utc\n                    ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]'\n                    : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'\n            );\n        }\n        if (isFunction(Date.prototype.toISOString)) {\n            // native implementation is ~50x faster, use it when we can\n            if (utc) {\n                return this.toDate().toISOString();\n            } else {\n                return new Date(this.valueOf() + this.utcOffset() * 60 * 1000)\n                    .toISOString()\n                    .replace('Z', formatMoment(m, 'Z'));\n            }\n        }\n        return formatMoment(\n            m,\n            utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'\n        );\n    }\n\n    /**\n     * Return a human readable representation of a moment that can\n     * also be evaluated to get a new moment which is the same\n     *\n     * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n     */\n    function inspect() {\n        if (!this.isValid()) {\n            return 'moment.invalid(/* ' + this._i + ' */)';\n        }\n        var func = 'moment',\n            zone = '',\n            prefix,\n            year,\n            datetime,\n            suffix;\n        if (!this.isLocal()) {\n            func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n            zone = 'Z';\n        }\n        prefix = '[' + func + '(\"]';\n        year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';\n        datetime = '-MM-DD[T]HH:mm:ss.SSS';\n        suffix = zone + '[\")]';\n\n        return this.format(prefix + year + datetime + suffix);\n    }\n\n    function format(inputString) {\n        if (!inputString) {\n            inputString = this.isUtc()\n                ? hooks.defaultFormatUtc\n                : hooks.defaultFormat;\n        }\n        var output = formatMoment(this, inputString);\n        return this.localeData().postformat(output);\n    }\n\n    function from(time, withoutSuffix) {\n        if (\n            this.isValid() &&\n            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())\n        ) {\n            return createDuration({ to: this, from: time })\n                .locale(this.locale())\n                .humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function fromNow(withoutSuffix) {\n        return this.from(createLocal(), withoutSuffix);\n    }\n\n    function to(time, withoutSuffix) {\n        if (\n            this.isValid() &&\n            ((isMoment(time) && time.isValid()) || createLocal(time).isValid())\n        ) {\n            return createDuration({ from: this, to: time })\n                .locale(this.locale())\n                .humanize(!withoutSuffix);\n        } else {\n            return this.localeData().invalidDate();\n        }\n    }\n\n    function toNow(withoutSuffix) {\n        return this.to(createLocal(), withoutSuffix);\n    }\n\n    // If passed a locale key, it will set the locale for this\n    // instance.  Otherwise, it will return the locale configuration\n    // variables for this instance.\n    function locale(key) {\n        var newLocaleData;\n\n        if (key === undefined) {\n            return this._locale._abbr;\n        } else {\n            newLocaleData = getLocale(key);\n            if (newLocaleData != null) {\n                this._locale = newLocaleData;\n            }\n            return this;\n        }\n    }\n\n    var lang = deprecate(\n        'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.',\n        function (key) {\n            if (key === undefined) {\n                return this.localeData();\n            } else {\n                return this.locale(key);\n            }\n        }\n    );\n\n    function localeData() {\n        return this._locale;\n    }\n\n    var MS_PER_SECOND = 1000,\n        MS_PER_MINUTE = 60 * MS_PER_SECOND,\n        MS_PER_HOUR = 60 * MS_PER_MINUTE,\n        MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;\n\n    // actual modulo - handles negative numbers (for dates before 1970):\n    function mod$1(dividend, divisor) {\n        return ((dividend % divisor) + divisor) % divisor;\n    }\n\n    function localStartOfDate(y, m, d) {\n        // the date constructor remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            return new Date(y + 400, m, d) - MS_PER_400_YEARS;\n        } else {\n            return new Date(y, m, d).valueOf();\n        }\n    }\n\n    function utcStartOfDate(y, m, d) {\n        // Date.UTC remaps years 0-99 to 1900-1999\n        if (y < 100 && y >= 0) {\n            // preserve leap years using a full 400 year cycle, then reset\n            return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;\n        } else {\n            return Date.UTC(y, m, d);\n        }\n    }\n\n    function startOf(units) {\n        var time, startOfDate;\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond' || !this.isValid()) {\n            return this;\n        }\n\n        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n        switch (units) {\n            case 'year':\n                time = startOfDate(this.year(), 0, 1);\n                break;\n            case 'quarter':\n                time = startOfDate(\n                    this.year(),\n                    this.month() - (this.month() % 3),\n                    1\n                );\n                break;\n            case 'month':\n                time = startOfDate(this.year(), this.month(), 1);\n                break;\n            case 'week':\n                time = startOfDate(\n                    this.year(),\n                    this.month(),\n                    this.date() - this.weekday()\n                );\n                break;\n            case 'isoWeek':\n                time = startOfDate(\n                    this.year(),\n                    this.month(),\n                    this.date() - (this.isoWeekday() - 1)\n                );\n                break;\n            case 'day':\n            case 'date':\n                time = startOfDate(this.year(), this.month(), this.date());\n                break;\n            case 'hour':\n                time = this._d.valueOf();\n                time -= mod$1(\n                    time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),\n                    MS_PER_HOUR\n                );\n                break;\n            case 'minute':\n                time = this._d.valueOf();\n                time -= mod$1(time, MS_PER_MINUTE);\n                break;\n            case 'second':\n                time = this._d.valueOf();\n                time -= mod$1(time, MS_PER_SECOND);\n                break;\n        }\n\n        this._d.setTime(time);\n        hooks.updateOffset(this, true);\n        return this;\n    }\n\n    function endOf(units) {\n        var time, startOfDate;\n        units = normalizeUnits(units);\n        if (units === undefined || units === 'millisecond' || !this.isValid()) {\n            return this;\n        }\n\n        startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n\n        switch (units) {\n            case 'year':\n                time = startOfDate(this.year() + 1, 0, 1) - 1;\n                break;\n            case 'quarter':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month() - (this.month() % 3) + 3,\n                        1\n                    ) - 1;\n                break;\n            case 'month':\n                time = startOfDate(this.year(), this.month() + 1, 1) - 1;\n                break;\n            case 'week':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month(),\n                        this.date() - this.weekday() + 7\n                    ) - 1;\n                break;\n            case 'isoWeek':\n                time =\n                    startOfDate(\n                        this.year(),\n                        this.month(),\n                        this.date() - (this.isoWeekday() - 1) + 7\n                    ) - 1;\n                break;\n            case 'day':\n            case 'date':\n                time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;\n                break;\n            case 'hour':\n                time = this._d.valueOf();\n                time +=\n                    MS_PER_HOUR -\n                    mod$1(\n                        time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE),\n                        MS_PER_HOUR\n                    ) -\n                    1;\n                break;\n            case 'minute':\n                time = this._d.valueOf();\n                time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;\n                break;\n            case 'second':\n                time = this._d.valueOf();\n                time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;\n                break;\n        }\n\n        this._d.setTime(time);\n        hooks.updateOffset(this, true);\n        return this;\n    }\n\n    function valueOf() {\n        return this._d.valueOf() - (this._offset || 0) * 60000;\n    }\n\n    function unix() {\n        return Math.floor(this.valueOf() / 1000);\n    }\n\n    function toDate() {\n        return new Date(this.valueOf());\n    }\n\n    function toArray() {\n        var m = this;\n        return [\n            m.year(),\n            m.month(),\n            m.date(),\n            m.hour(),\n            m.minute(),\n            m.second(),\n            m.millisecond(),\n        ];\n    }\n\n    function toObject() {\n        var m = this;\n        return {\n            years: m.year(),\n            months: m.month(),\n            date: m.date(),\n            hours: m.hours(),\n            minutes: m.minutes(),\n            seconds: m.seconds(),\n            milliseconds: m.milliseconds(),\n        };\n    }\n\n    function toJSON() {\n        // new Date(NaN).toJSON() === null\n        return this.isValid() ? this.toISOString() : null;\n    }\n\n    function isValid$2() {\n        return isValid(this);\n    }\n\n    function parsingFlags() {\n        return extend({}, getParsingFlags(this));\n    }\n\n    function invalidAt() {\n        return getParsingFlags(this).overflow;\n    }\n\n    function creationData() {\n        return {\n            input: this._i,\n            format: this._f,\n            locale: this._locale,\n            isUTC: this._isUTC,\n            strict: this._strict,\n        };\n    }\n\n    addFormatToken('N', 0, 0, 'eraAbbr');\n    addFormatToken('NN', 0, 0, 'eraAbbr');\n    addFormatToken('NNN', 0, 0, 'eraAbbr');\n    addFormatToken('NNNN', 0, 0, 'eraName');\n    addFormatToken('NNNNN', 0, 0, 'eraNarrow');\n\n    addFormatToken('y', ['y', 1], 'yo', 'eraYear');\n    addFormatToken('y', ['yy', 2], 0, 'eraYear');\n    addFormatToken('y', ['yyy', 3], 0, 'eraYear');\n    addFormatToken('y', ['yyyy', 4], 0, 'eraYear');\n\n    addRegexToken('N', matchEraAbbr);\n    addRegexToken('NN', matchEraAbbr);\n    addRegexToken('NNN', matchEraAbbr);\n    addRegexToken('NNNN', matchEraName);\n    addRegexToken('NNNNN', matchEraNarrow);\n\n    addParseToken(\n        ['N', 'NN', 'NNN', 'NNNN', 'NNNNN'],\n        function (input, array, config, token) {\n            var era = config._locale.erasParse(input, token, config._strict);\n            if (era) {\n                getParsingFlags(config).era = era;\n            } else {\n                getParsingFlags(config).invalidEra = input;\n            }\n        }\n    );\n\n    addRegexToken('y', matchUnsigned);\n    addRegexToken('yy', matchUnsigned);\n    addRegexToken('yyy', matchUnsigned);\n    addRegexToken('yyyy', matchUnsigned);\n    addRegexToken('yo', matchEraYearOrdinal);\n\n    addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);\n    addParseToken(['yo'], function (input, array, config, token) {\n        var match;\n        if (config._locale._eraYearOrdinalRegex) {\n            match = input.match(config._locale._eraYearOrdinalRegex);\n        }\n\n        if (config._locale.eraYearOrdinalParse) {\n            array[YEAR] = config._locale.eraYearOrdinalParse(input, match);\n        } else {\n            array[YEAR] = parseInt(input, 10);\n        }\n    });\n\n    function localeEras(m, format) {\n        var i,\n            l,\n            date,\n            eras = this._eras || getLocale('en')._eras;\n        for (i = 0, l = eras.length; i < l; ++i) {\n            switch (typeof eras[i].since) {\n                case 'string':\n                    // truncate time\n                    date = hooks(eras[i].since).startOf('day');\n                    eras[i].since = date.valueOf();\n                    break;\n            }\n\n            switch (typeof eras[i].until) {\n                case 'undefined':\n                    eras[i].until = +Infinity;\n                    break;\n                case 'string':\n                    // truncate time\n                    date = hooks(eras[i].until).startOf('day').valueOf();\n                    eras[i].until = date.valueOf();\n                    break;\n            }\n        }\n        return eras;\n    }\n\n    function localeErasParse(eraName, format, strict) {\n        var i,\n            l,\n            eras = this.eras(),\n            name,\n            abbr,\n            narrow;\n        eraName = eraName.toUpperCase();\n\n        for (i = 0, l = eras.length; i < l; ++i) {\n            name = eras[i].name.toUpperCase();\n            abbr = eras[i].abbr.toUpperCase();\n            narrow = eras[i].narrow.toUpperCase();\n\n            if (strict) {\n                switch (format) {\n                    case 'N':\n                    case 'NN':\n                    case 'NNN':\n                        if (abbr === eraName) {\n                            return eras[i];\n                        }\n                        break;\n\n                    case 'NNNN':\n                        if (name === eraName) {\n                            return eras[i];\n                        }\n                        break;\n\n                    case 'NNNNN':\n                        if (narrow === eraName) {\n                            return eras[i];\n                        }\n                        break;\n                }\n            } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {\n                return eras[i];\n            }\n        }\n    }\n\n    function localeErasConvertYear(era, year) {\n        var dir = era.since <= era.until ? +1 : -1;\n        if (year === undefined) {\n            return hooks(era.since).year();\n        } else {\n            return hooks(era.since).year() + (year - era.offset) * dir;\n        }\n    }\n\n    function getEraName() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].name;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].name;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraNarrow() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].narrow;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].narrow;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraAbbr() {\n        var i,\n            l,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (eras[i].since <= val && val <= eras[i].until) {\n                return eras[i].abbr;\n            }\n            if (eras[i].until <= val && val <= eras[i].since) {\n                return eras[i].abbr;\n            }\n        }\n\n        return '';\n    }\n\n    function getEraYear() {\n        var i,\n            l,\n            dir,\n            val,\n            eras = this.localeData().eras();\n        for (i = 0, l = eras.length; i < l; ++i) {\n            dir = eras[i].since <= eras[i].until ? +1 : -1;\n\n            // truncate time\n            val = this.clone().startOf('day').valueOf();\n\n            if (\n                (eras[i].since <= val && val <= eras[i].until) ||\n                (eras[i].until <= val && val <= eras[i].since)\n            ) {\n                return (\n                    (this.year() - hooks(eras[i].since).year()) * dir +\n                    eras[i].offset\n                );\n            }\n        }\n\n        return this.year();\n    }\n\n    function erasNameRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasNameRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasNameRegex : this._erasRegex;\n    }\n\n    function erasAbbrRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasAbbrRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasAbbrRegex : this._erasRegex;\n    }\n\n    function erasNarrowRegex(isStrict) {\n        if (!hasOwnProp(this, '_erasNarrowRegex')) {\n            computeErasParse.call(this);\n        }\n        return isStrict ? this._erasNarrowRegex : this._erasRegex;\n    }\n\n    function matchEraAbbr(isStrict, locale) {\n        return locale.erasAbbrRegex(isStrict);\n    }\n\n    function matchEraName(isStrict, locale) {\n        return locale.erasNameRegex(isStrict);\n    }\n\n    function matchEraNarrow(isStrict, locale) {\n        return locale.erasNarrowRegex(isStrict);\n    }\n\n    function matchEraYearOrdinal(isStrict, locale) {\n        return locale._eraYearOrdinalRegex || matchUnsigned;\n    }\n\n    function computeErasParse() {\n        var abbrPieces = [],\n            namePieces = [],\n            narrowPieces = [],\n            mixedPieces = [],\n            i,\n            l,\n            eras = this.eras();\n\n        for (i = 0, l = eras.length; i < l; ++i) {\n            namePieces.push(regexEscape(eras[i].name));\n            abbrPieces.push(regexEscape(eras[i].abbr));\n            narrowPieces.push(regexEscape(eras[i].narrow));\n\n            mixedPieces.push(regexEscape(eras[i].name));\n            mixedPieces.push(regexEscape(eras[i].abbr));\n            mixedPieces.push(regexEscape(eras[i].narrow));\n        }\n\n        this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n        this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');\n        this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');\n        this._erasNarrowRegex = new RegExp(\n            '^(' + narrowPieces.join('|') + ')',\n            'i'\n        );\n    }\n\n    // FORMATTING\n\n    addFormatToken(0, ['gg', 2], 0, function () {\n        return this.weekYear() % 100;\n    });\n\n    addFormatToken(0, ['GG', 2], 0, function () {\n        return this.isoWeekYear() % 100;\n    });\n\n    function addWeekYearFormatToken(token, getter) {\n        addFormatToken(0, [token, token.length], 0, getter);\n    }\n\n    addWeekYearFormatToken('gggg', 'weekYear');\n    addWeekYearFormatToken('ggggg', 'weekYear');\n    addWeekYearFormatToken('GGGG', 'isoWeekYear');\n    addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n    // ALIASES\n\n    addUnitAlias('weekYear', 'gg');\n    addUnitAlias('isoWeekYear', 'GG');\n\n    // PRIORITY\n\n    addUnitPriority('weekYear', 1);\n    addUnitPriority('isoWeekYear', 1);\n\n    // PARSING\n\n    addRegexToken('G', matchSigned);\n    addRegexToken('g', matchSigned);\n    addRegexToken('GG', match1to2, match2);\n    addRegexToken('gg', match1to2, match2);\n    addRegexToken('GGGG', match1to4, match4);\n    addRegexToken('gggg', match1to4, match4);\n    addRegexToken('GGGGG', match1to6, match6);\n    addRegexToken('ggggg', match1to6, match6);\n\n    addWeekParseToken(\n        ['gggg', 'ggggg', 'GGGG', 'GGGGG'],\n        function (input, week, config, token) {\n            week[token.substr(0, 2)] = toInt(input);\n        }\n    );\n\n    addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n        week[token] = hooks.parseTwoDigitYear(input);\n    });\n\n    // MOMENTS\n\n    function getSetWeekYear(input) {\n        return getSetWeekYearHelper.call(\n            this,\n            input,\n            this.week(),\n            this.weekday(),\n            this.localeData()._week.dow,\n            this.localeData()._week.doy\n        );\n    }\n\n    function getSetISOWeekYear(input) {\n        return getSetWeekYearHelper.call(\n            this,\n            input,\n            this.isoWeek(),\n            this.isoWeekday(),\n            1,\n            4\n        );\n    }\n\n    function getISOWeeksInYear() {\n        return weeksInYear(this.year(), 1, 4);\n    }\n\n    function getISOWeeksInISOWeekYear() {\n        return weeksInYear(this.isoWeekYear(), 1, 4);\n    }\n\n    function getWeeksInYear() {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getWeeksInWeekYear() {\n        var weekInfo = this.localeData()._week;\n        return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);\n    }\n\n    function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n        var weeksTarget;\n        if (input == null) {\n            return weekOfYear(this, dow, doy).year;\n        } else {\n            weeksTarget = weeksInYear(input, dow, doy);\n            if (week > weeksTarget) {\n                week = weeksTarget;\n            }\n            return setWeekAll.call(this, input, week, weekday, dow, doy);\n        }\n    }\n\n    function setWeekAll(weekYear, week, weekday, dow, doy) {\n        var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n            date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n\n        this.year(date.getUTCFullYear());\n        this.month(date.getUTCMonth());\n        this.date(date.getUTCDate());\n        return this;\n    }\n\n    // FORMATTING\n\n    addFormatToken('Q', 0, 'Qo', 'quarter');\n\n    // ALIASES\n\n    addUnitAlias('quarter', 'Q');\n\n    // PRIORITY\n\n    addUnitPriority('quarter', 7);\n\n    // PARSING\n\n    addRegexToken('Q', match1);\n    addParseToken('Q', function (input, array) {\n        array[MONTH] = (toInt(input) - 1) * 3;\n    });\n\n    // MOMENTS\n\n    function getSetQuarter(input) {\n        return input == null\n            ? Math.ceil((this.month() + 1) / 3)\n            : this.month((input - 1) * 3 + (this.month() % 3));\n    }\n\n    // FORMATTING\n\n    addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n    // ALIASES\n\n    addUnitAlias('date', 'D');\n\n    // PRIORITY\n    addUnitPriority('date', 9);\n\n    // PARSING\n\n    addRegexToken('D', match1to2);\n    addRegexToken('DD', match1to2, match2);\n    addRegexToken('Do', function (isStrict, locale) {\n        // TODO: Remove \"ordinalParse\" fallback in next major release.\n        return isStrict\n            ? locale._dayOfMonthOrdinalParse || locale._ordinalParse\n            : locale._dayOfMonthOrdinalParseLenient;\n    });\n\n    addParseToken(['D', 'DD'], DATE);\n    addParseToken('Do', function (input, array) {\n        array[DATE] = toInt(input.match(match1to2)[0]);\n    });\n\n    // MOMENTS\n\n    var getSetDayOfMonth = makeGetSet('Date', true);\n\n    // FORMATTING\n\n    addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n    // ALIASES\n\n    addUnitAlias('dayOfYear', 'DDD');\n\n    // PRIORITY\n    addUnitPriority('dayOfYear', 4);\n\n    // PARSING\n\n    addRegexToken('DDD', match1to3);\n    addRegexToken('DDDD', match3);\n    addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n        config._dayOfYear = toInt(input);\n    });\n\n    // HELPERS\n\n    // MOMENTS\n\n    function getSetDayOfYear(input) {\n        var dayOfYear =\n            Math.round(\n                (this.clone().startOf('day') - this.clone().startOf('year')) / 864e5\n            ) + 1;\n        return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');\n    }\n\n    // FORMATTING\n\n    addFormatToken('m', ['mm', 2], 0, 'minute');\n\n    // ALIASES\n\n    addUnitAlias('minute', 'm');\n\n    // PRIORITY\n\n    addUnitPriority('minute', 14);\n\n    // PARSING\n\n    addRegexToken('m', match1to2);\n    addRegexToken('mm', match1to2, match2);\n    addParseToken(['m', 'mm'], MINUTE);\n\n    // MOMENTS\n\n    var getSetMinute = makeGetSet('Minutes', false);\n\n    // FORMATTING\n\n    addFormatToken('s', ['ss', 2], 0, 'second');\n\n    // ALIASES\n\n    addUnitAlias('second', 's');\n\n    // PRIORITY\n\n    addUnitPriority('second', 15);\n\n    // PARSING\n\n    addRegexToken('s', match1to2);\n    addRegexToken('ss', match1to2, match2);\n    addParseToken(['s', 'ss'], SECOND);\n\n    // MOMENTS\n\n    var getSetSecond = makeGetSet('Seconds', false);\n\n    // FORMATTING\n\n    addFormatToken('S', 0, 0, function () {\n        return ~~(this.millisecond() / 100);\n    });\n\n    addFormatToken(0, ['SS', 2], 0, function () {\n        return ~~(this.millisecond() / 10);\n    });\n\n    addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n    addFormatToken(0, ['SSSS', 4], 0, function () {\n        return this.millisecond() * 10;\n    });\n    addFormatToken(0, ['SSSSS', 5], 0, function () {\n        return this.millisecond() * 100;\n    });\n    addFormatToken(0, ['SSSSSS', 6], 0, function () {\n        return this.millisecond() * 1000;\n    });\n    addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n        return this.millisecond() * 10000;\n    });\n    addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n        return this.millisecond() * 100000;\n    });\n    addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n        return this.millisecond() * 1000000;\n    });\n\n    // ALIASES\n\n    addUnitAlias('millisecond', 'ms');\n\n    // PRIORITY\n\n    addUnitPriority('millisecond', 16);\n\n    // PARSING\n\n    addRegexToken('S', match1to3, match1);\n    addRegexToken('SS', match1to3, match2);\n    addRegexToken('SSS', match1to3, match3);\n\n    var token, getSetMillisecond;\n    for (token = 'SSSS'; token.length <= 9; token += 'S') {\n        addRegexToken(token, matchUnsigned);\n    }\n\n    function parseMs(input, array) {\n        array[MILLISECOND] = toInt(('0.' + input) * 1000);\n    }\n\n    for (token = 'S'; token.length <= 9; token += 'S') {\n        addParseToken(token, parseMs);\n    }\n\n    getSetMillisecond = makeGetSet('Milliseconds', false);\n\n    // FORMATTING\n\n    addFormatToken('z', 0, 0, 'zoneAbbr');\n    addFormatToken('zz', 0, 0, 'zoneName');\n\n    // MOMENTS\n\n    function getZoneAbbr() {\n        return this._isUTC ? 'UTC' : '';\n    }\n\n    function getZoneName() {\n        return this._isUTC ? 'Coordinated Universal Time' : '';\n    }\n\n    var proto = Moment.prototype;\n\n    proto.add = add;\n    proto.calendar = calendar$1;\n    proto.clone = clone;\n    proto.diff = diff;\n    proto.endOf = endOf;\n    proto.format = format;\n    proto.from = from;\n    proto.fromNow = fromNow;\n    proto.to = to;\n    proto.toNow = toNow;\n    proto.get = stringGet;\n    proto.invalidAt = invalidAt;\n    proto.isAfter = isAfter;\n    proto.isBefore = isBefore;\n    proto.isBetween = isBetween;\n    proto.isSame = isSame;\n    proto.isSameOrAfter = isSameOrAfter;\n    proto.isSameOrBefore = isSameOrBefore;\n    proto.isValid = isValid$2;\n    proto.lang = lang;\n    proto.locale = locale;\n    proto.localeData = localeData;\n    proto.max = prototypeMax;\n    proto.min = prototypeMin;\n    proto.parsingFlags = parsingFlags;\n    proto.set = stringSet;\n    proto.startOf = startOf;\n    proto.subtract = subtract;\n    proto.toArray = toArray;\n    proto.toObject = toObject;\n    proto.toDate = toDate;\n    proto.toISOString = toISOString;\n    proto.inspect = inspect;\n    if (typeof Symbol !== 'undefined' && Symbol.for != null) {\n        proto[Symbol.for('nodejs.util.inspect.custom')] = function () {\n            return 'Moment<' + this.format() + '>';\n        };\n    }\n    proto.toJSON = toJSON;\n    proto.toString = toString;\n    proto.unix = unix;\n    proto.valueOf = valueOf;\n    proto.creationData = creationData;\n    proto.eraName = getEraName;\n    proto.eraNarrow = getEraNarrow;\n    proto.eraAbbr = getEraAbbr;\n    proto.eraYear = getEraYear;\n    proto.year = getSetYear;\n    proto.isLeapYear = getIsLeapYear;\n    proto.weekYear = getSetWeekYear;\n    proto.isoWeekYear = getSetISOWeekYear;\n    proto.quarter = proto.quarters = getSetQuarter;\n    proto.month = getSetMonth;\n    proto.daysInMonth = getDaysInMonth;\n    proto.week = proto.weeks = getSetWeek;\n    proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n    proto.weeksInYear = getWeeksInYear;\n    proto.weeksInWeekYear = getWeeksInWeekYear;\n    proto.isoWeeksInYear = getISOWeeksInYear;\n    proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;\n    proto.date = getSetDayOfMonth;\n    proto.day = proto.days = getSetDayOfWeek;\n    proto.weekday = getSetLocaleDayOfWeek;\n    proto.isoWeekday = getSetISODayOfWeek;\n    proto.dayOfYear = getSetDayOfYear;\n    proto.hour = proto.hours = getSetHour;\n    proto.minute = proto.minutes = getSetMinute;\n    proto.second = proto.seconds = getSetSecond;\n    proto.millisecond = proto.milliseconds = getSetMillisecond;\n    proto.utcOffset = getSetOffset;\n    proto.utc = setOffsetToUTC;\n    proto.local = setOffsetToLocal;\n    proto.parseZone = setOffsetToParsedOffset;\n    proto.hasAlignedHourOffset = hasAlignedHourOffset;\n    proto.isDST = isDaylightSavingTime;\n    proto.isLocal = isLocal;\n    proto.isUtcOffset = isUtcOffset;\n    proto.isUtc = isUtc;\n    proto.isUTC = isUtc;\n    proto.zoneAbbr = getZoneAbbr;\n    proto.zoneName = getZoneName;\n    proto.dates = deprecate(\n        'dates accessor is deprecated. Use date instead.',\n        getSetDayOfMonth\n    );\n    proto.months = deprecate(\n        'months accessor is deprecated. Use month instead',\n        getSetMonth\n    );\n    proto.years = deprecate(\n        'years accessor is deprecated. Use year instead',\n        getSetYear\n    );\n    proto.zone = deprecate(\n        'moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/',\n        getSetZone\n    );\n    proto.isDSTShifted = deprecate(\n        'isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information',\n        isDaylightSavingTimeShifted\n    );\n\n    function createUnix(input) {\n        return createLocal(input * 1000);\n    }\n\n    function createInZone() {\n        return createLocal.apply(null, arguments).parseZone();\n    }\n\n    function preParsePostFormat(string) {\n        return string;\n    }\n\n    var proto$1 = Locale.prototype;\n\n    proto$1.calendar = calendar;\n    proto$1.longDateFormat = longDateFormat;\n    proto$1.invalidDate = invalidDate;\n    proto$1.ordinal = ordinal;\n    proto$1.preparse = preParsePostFormat;\n    proto$1.postformat = preParsePostFormat;\n    proto$1.relativeTime = relativeTime;\n    proto$1.pastFuture = pastFuture;\n    proto$1.set = set;\n    proto$1.eras = localeEras;\n    proto$1.erasParse = localeErasParse;\n    proto$1.erasConvertYear = localeErasConvertYear;\n    proto$1.erasAbbrRegex = erasAbbrRegex;\n    proto$1.erasNameRegex = erasNameRegex;\n    proto$1.erasNarrowRegex = erasNarrowRegex;\n\n    proto$1.months = localeMonths;\n    proto$1.monthsShort = localeMonthsShort;\n    proto$1.monthsParse = localeMonthsParse;\n    proto$1.monthsRegex = monthsRegex;\n    proto$1.monthsShortRegex = monthsShortRegex;\n    proto$1.week = localeWeek;\n    proto$1.firstDayOfYear = localeFirstDayOfYear;\n    proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n\n    proto$1.weekdays = localeWeekdays;\n    proto$1.weekdaysMin = localeWeekdaysMin;\n    proto$1.weekdaysShort = localeWeekdaysShort;\n    proto$1.weekdaysParse = localeWeekdaysParse;\n\n    proto$1.weekdaysRegex = weekdaysRegex;\n    proto$1.weekdaysShortRegex = weekdaysShortRegex;\n    proto$1.weekdaysMinRegex = weekdaysMinRegex;\n\n    proto$1.isPM = localeIsPM;\n    proto$1.meridiem = localeMeridiem;\n\n    function get$1(format, index, field, setter) {\n        var locale = getLocale(),\n            utc = createUTC().set(setter, index);\n        return locale[field](utc, format);\n    }\n\n    function listMonthsImpl(format, index, field) {\n        if (isNumber(format)) {\n            index = format;\n            format = undefined;\n        }\n\n        format = format || '';\n\n        if (index != null) {\n            return get$1(format, index, field, 'month');\n        }\n\n        var i,\n            out = [];\n        for (i = 0; i < 12; i++) {\n            out[i] = get$1(format, i, field, 'month');\n        }\n        return out;\n    }\n\n    // ()\n    // (5)\n    // (fmt, 5)\n    // (fmt)\n    // (true)\n    // (true, 5)\n    // (true, fmt, 5)\n    // (true, fmt)\n    function listWeekdaysImpl(localeSorted, format, index, field) {\n        if (typeof localeSorted === 'boolean') {\n            if (isNumber(format)) {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        } else {\n            format = localeSorted;\n            index = format;\n            localeSorted = false;\n\n            if (isNumber(format)) {\n                index = format;\n                format = undefined;\n            }\n\n            format = format || '';\n        }\n\n        var locale = getLocale(),\n            shift = localeSorted ? locale._week.dow : 0,\n            i,\n            out = [];\n\n        if (index != null) {\n            return get$1(format, (index + shift) % 7, field, 'day');\n        }\n\n        for (i = 0; i < 7; i++) {\n            out[i] = get$1(format, (i + shift) % 7, field, 'day');\n        }\n        return out;\n    }\n\n    function listMonths(format, index) {\n        return listMonthsImpl(format, index, 'months');\n    }\n\n    function listMonthsShort(format, index) {\n        return listMonthsImpl(format, index, 'monthsShort');\n    }\n\n    function listWeekdays(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n    }\n\n    function listWeekdaysShort(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n    }\n\n    function listWeekdaysMin(localeSorted, format, index) {\n        return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n    }\n\n    getSetGlobalLocale('en', {\n        eras: [\n            {\n                since: '0001-01-01',\n                until: +Infinity,\n                offset: 1,\n                name: 'Anno Domini',\n                narrow: 'AD',\n                abbr: 'AD',\n            },\n            {\n                since: '0000-12-31',\n                until: -Infinity,\n                offset: 1,\n                name: 'Before Christ',\n                narrow: 'BC',\n                abbr: 'BC',\n            },\n        ],\n        dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n        ordinal: function (number) {\n            var b = number % 10,\n                output =\n                    toInt((number % 100) / 10) === 1\n                        ? 'th'\n                        : b === 1\n                        ? 'st'\n                        : b === 2\n                        ? 'nd'\n                        : b === 3\n                        ? 'rd'\n                        : 'th';\n            return number + output;\n        },\n    });\n\n    // Side effect imports\n\n    hooks.lang = deprecate(\n        'moment.lang is deprecated. Use moment.locale instead.',\n        getSetGlobalLocale\n    );\n    hooks.langData = deprecate(\n        'moment.langData is deprecated. Use moment.localeData instead.',\n        getLocale\n    );\n\n    var mathAbs = Math.abs;\n\n    function abs() {\n        var data = this._data;\n\n        this._milliseconds = mathAbs(this._milliseconds);\n        this._days = mathAbs(this._days);\n        this._months = mathAbs(this._months);\n\n        data.milliseconds = mathAbs(data.milliseconds);\n        data.seconds = mathAbs(data.seconds);\n        data.minutes = mathAbs(data.minutes);\n        data.hours = mathAbs(data.hours);\n        data.months = mathAbs(data.months);\n        data.years = mathAbs(data.years);\n\n        return this;\n    }\n\n    function addSubtract$1(duration, input, value, direction) {\n        var other = createDuration(input, value);\n\n        duration._milliseconds += direction * other._milliseconds;\n        duration._days += direction * other._days;\n        duration._months += direction * other._months;\n\n        return duration._bubble();\n    }\n\n    // supports only 2.0-style add(1, 's') or add(duration)\n    function add$1(input, value) {\n        return addSubtract$1(this, input, value, 1);\n    }\n\n    // supports only 2.0-style subtract(1, 's') or subtract(duration)\n    function subtract$1(input, value) {\n        return addSubtract$1(this, input, value, -1);\n    }\n\n    function absCeil(number) {\n        if (number < 0) {\n            return Math.floor(number);\n        } else {\n            return Math.ceil(number);\n        }\n    }\n\n    function bubble() {\n        var milliseconds = this._milliseconds,\n            days = this._days,\n            months = this._months,\n            data = this._data,\n            seconds,\n            minutes,\n            hours,\n            years,\n            monthsFromDays;\n\n        // if we have a mix of positive and negative values, bubble down first\n        // check: https://github.com/moment/moment/issues/2166\n        if (\n            !(\n                (milliseconds >= 0 && days >= 0 && months >= 0) ||\n                (milliseconds <= 0 && days <= 0 && months <= 0)\n            )\n        ) {\n            milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n            days = 0;\n            months = 0;\n        }\n\n        // The following code bubbles up values, see the tests for\n        // examples of what that means.\n        data.milliseconds = milliseconds % 1000;\n\n        seconds = absFloor(milliseconds / 1000);\n        data.seconds = seconds % 60;\n\n        minutes = absFloor(seconds / 60);\n        data.minutes = minutes % 60;\n\n        hours = absFloor(minutes / 60);\n        data.hours = hours % 24;\n\n        days += absFloor(hours / 24);\n\n        // convert days to months\n        monthsFromDays = absFloor(daysToMonths(days));\n        months += monthsFromDays;\n        days -= absCeil(monthsToDays(monthsFromDays));\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        data.days = days;\n        data.months = months;\n        data.years = years;\n\n        return this;\n    }\n\n    function daysToMonths(days) {\n        // 400 years have 146097 days (taking into account leap year rules)\n        // 400 years have 12 months === 4800\n        return (days * 4800) / 146097;\n    }\n\n    function monthsToDays(months) {\n        // the reverse of daysToMonths\n        return (months * 146097) / 4800;\n    }\n\n    function as(units) {\n        if (!this.isValid()) {\n            return NaN;\n        }\n        var days,\n            months,\n            milliseconds = this._milliseconds;\n\n        units = normalizeUnits(units);\n\n        if (units === 'month' || units === 'quarter' || units === 'year') {\n            days = this._days + milliseconds / 864e5;\n            months = this._months + daysToMonths(days);\n            switch (units) {\n                case 'month':\n                    return months;\n                case 'quarter':\n                    return months / 3;\n                case 'year':\n                    return months / 12;\n            }\n        } else {\n            // handle milliseconds separately because of floating point math errors (issue #1867)\n            days = this._days + Math.round(monthsToDays(this._months));\n            switch (units) {\n                case 'week':\n                    return days / 7 + milliseconds / 6048e5;\n                case 'day':\n                    return days + milliseconds / 864e5;\n                case 'hour':\n                    return days * 24 + milliseconds / 36e5;\n                case 'minute':\n                    return days * 1440 + milliseconds / 6e4;\n                case 'second':\n                    return days * 86400 + milliseconds / 1000;\n                // Math.floor prevents floating point math errors here\n                case 'millisecond':\n                    return Math.floor(days * 864e5) + milliseconds;\n                default:\n                    throw new Error('Unknown unit ' + units);\n            }\n        }\n    }\n\n    // TODO: Use this.as('ms')?\n    function valueOf$1() {\n        if (!this.isValid()) {\n            return NaN;\n        }\n        return (\n            this._milliseconds +\n            this._days * 864e5 +\n            (this._months % 12) * 2592e6 +\n            toInt(this._months / 12) * 31536e6\n        );\n    }\n\n    function makeAs(alias) {\n        return function () {\n            return this.as(alias);\n        };\n    }\n\n    var asMilliseconds = makeAs('ms'),\n        asSeconds = makeAs('s'),\n        asMinutes = makeAs('m'),\n        asHours = makeAs('h'),\n        asDays = makeAs('d'),\n        asWeeks = makeAs('w'),\n        asMonths = makeAs('M'),\n        asQuarters = makeAs('Q'),\n        asYears = makeAs('y');\n\n    function clone$1() {\n        return createDuration(this);\n    }\n\n    function get$2(units) {\n        units = normalizeUnits(units);\n        return this.isValid() ? this[units + 's']() : NaN;\n    }\n\n    function makeGetter(name) {\n        return function () {\n            return this.isValid() ? this._data[name] : NaN;\n        };\n    }\n\n    var milliseconds = makeGetter('milliseconds'),\n        seconds = makeGetter('seconds'),\n        minutes = makeGetter('minutes'),\n        hours = makeGetter('hours'),\n        days = makeGetter('days'),\n        months = makeGetter('months'),\n        years = makeGetter('years');\n\n    function weeks() {\n        return absFloor(this.days() / 7);\n    }\n\n    var round = Math.round,\n        thresholds = {\n            ss: 44, // a few seconds to seconds\n            s: 45, // seconds to minute\n            m: 45, // minutes to hour\n            h: 22, // hours to day\n            d: 26, // days to month/week\n            w: null, // weeks to month\n            M: 11, // months to year\n        };\n\n    // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n    function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n        return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n    }\n\n    function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {\n        var duration = createDuration(posNegDuration).abs(),\n            seconds = round(duration.as('s')),\n            minutes = round(duration.as('m')),\n            hours = round(duration.as('h')),\n            days = round(duration.as('d')),\n            months = round(duration.as('M')),\n            weeks = round(duration.as('w')),\n            years = round(duration.as('y')),\n            a =\n                (seconds <= thresholds.ss && ['s', seconds]) ||\n                (seconds < thresholds.s && ['ss', seconds]) ||\n                (minutes <= 1 && ['m']) ||\n                (minutes < thresholds.m && ['mm', minutes]) ||\n                (hours <= 1 && ['h']) ||\n                (hours < thresholds.h && ['hh', hours]) ||\n                (days <= 1 && ['d']) ||\n                (days < thresholds.d && ['dd', days]);\n\n        if (thresholds.w != null) {\n            a =\n                a ||\n                (weeks <= 1 && ['w']) ||\n                (weeks < thresholds.w && ['ww', weeks]);\n        }\n        a = a ||\n            (months <= 1 && ['M']) ||\n            (months < thresholds.M && ['MM', months]) ||\n            (years <= 1 && ['y']) || ['yy', years];\n\n        a[2] = withoutSuffix;\n        a[3] = +posNegDuration > 0;\n        a[4] = locale;\n        return substituteTimeAgo.apply(null, a);\n    }\n\n    // This function allows you to set the rounding function for relative time strings\n    function getSetRelativeTimeRounding(roundingFunction) {\n        if (roundingFunction === undefined) {\n            return round;\n        }\n        if (typeof roundingFunction === 'function') {\n            round = roundingFunction;\n            return true;\n        }\n        return false;\n    }\n\n    // This function allows you to set a threshold for relative time strings\n    function getSetRelativeTimeThreshold(threshold, limit) {\n        if (thresholds[threshold] === undefined) {\n            return false;\n        }\n        if (limit === undefined) {\n            return thresholds[threshold];\n        }\n        thresholds[threshold] = limit;\n        if (threshold === 's') {\n            thresholds.ss = limit - 1;\n        }\n        return true;\n    }\n\n    function humanize(argWithSuffix, argThresholds) {\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n\n        var withSuffix = false,\n            th = thresholds,\n            locale,\n            output;\n\n        if (typeof argWithSuffix === 'object') {\n            argThresholds = argWithSuffix;\n            argWithSuffix = false;\n        }\n        if (typeof argWithSuffix === 'boolean') {\n            withSuffix = argWithSuffix;\n        }\n        if (typeof argThresholds === 'object') {\n            th = Object.assign({}, thresholds, argThresholds);\n            if (argThresholds.s != null && argThresholds.ss == null) {\n                th.ss = argThresholds.s - 1;\n            }\n        }\n\n        locale = this.localeData();\n        output = relativeTime$1(this, !withSuffix, th, locale);\n\n        if (withSuffix) {\n            output = locale.pastFuture(+this, output);\n        }\n\n        return locale.postformat(output);\n    }\n\n    var abs$1 = Math.abs;\n\n    function sign(x) {\n        return (x > 0) - (x < 0) || +x;\n    }\n\n    function toISOString$1() {\n        // for ISO strings we do not use the normal bubbling rules:\n        //  * milliseconds bubble up until they become hours\n        //  * days do not bubble at all\n        //  * months bubble up until they become years\n        // This is because there is no context-free conversion between hours and days\n        // (think of clock changes)\n        // and also not between days and months (28-31 days per month)\n        if (!this.isValid()) {\n            return this.localeData().invalidDate();\n        }\n\n        var seconds = abs$1(this._milliseconds) / 1000,\n            days = abs$1(this._days),\n            months = abs$1(this._months),\n            minutes,\n            hours,\n            years,\n            s,\n            total = this.asSeconds(),\n            totalSign,\n            ymSign,\n            daysSign,\n            hmsSign;\n\n        if (!total) {\n            // this is the same as C#'s (Noda) and python (isodate)...\n            // but not other JS (goog.date)\n            return 'P0D';\n        }\n\n        // 3600 seconds -> 60 minutes -> 1 hour\n        minutes = absFloor(seconds / 60);\n        hours = absFloor(minutes / 60);\n        seconds %= 60;\n        minutes %= 60;\n\n        // 12 months -> 1 year\n        years = absFloor(months / 12);\n        months %= 12;\n\n        // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n        s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n\n        totalSign = total < 0 ? '-' : '';\n        ymSign = sign(this._months) !== sign(total) ? '-' : '';\n        daysSign = sign(this._days) !== sign(total) ? '-' : '';\n        hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n\n        return (\n            totalSign +\n            'P' +\n            (years ? ymSign + years + 'Y' : '') +\n            (months ? ymSign + months + 'M' : '') +\n            (days ? daysSign + days + 'D' : '') +\n            (hours || minutes || seconds ? 'T' : '') +\n            (hours ? hmsSign + hours + 'H' : '') +\n            (minutes ? hmsSign + minutes + 'M' : '') +\n            (seconds ? hmsSign + s + 'S' : '')\n        );\n    }\n\n    var proto$2 = Duration.prototype;\n\n    proto$2.isValid = isValid$1;\n    proto$2.abs = abs;\n    proto$2.add = add$1;\n    proto$2.subtract = subtract$1;\n    proto$2.as = as;\n    proto$2.asMilliseconds = asMilliseconds;\n    proto$2.asSeconds = asSeconds;\n    proto$2.asMinutes = asMinutes;\n    proto$2.asHours = asHours;\n    proto$2.asDays = asDays;\n    proto$2.asWeeks = asWeeks;\n    proto$2.asMonths = asMonths;\n    proto$2.asQuarters = asQuarters;\n    proto$2.asYears = asYears;\n    proto$2.valueOf = valueOf$1;\n    proto$2._bubble = bubble;\n    proto$2.clone = clone$1;\n    proto$2.get = get$2;\n    proto$2.milliseconds = milliseconds;\n    proto$2.seconds = seconds;\n    proto$2.minutes = minutes;\n    proto$2.hours = hours;\n    proto$2.days = days;\n    proto$2.weeks = weeks;\n    proto$2.months = months;\n    proto$2.years = years;\n    proto$2.humanize = humanize;\n    proto$2.toISOString = toISOString$1;\n    proto$2.toString = toISOString$1;\n    proto$2.toJSON = toISOString$1;\n    proto$2.locale = locale;\n    proto$2.localeData = localeData;\n\n    proto$2.toIsoString = deprecate(\n        'toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)',\n        toISOString$1\n    );\n    proto$2.lang = lang;\n\n    // FORMATTING\n\n    addFormatToken('X', 0, 0, 'unix');\n    addFormatToken('x', 0, 0, 'valueOf');\n\n    // PARSING\n\n    addRegexToken('x', matchSigned);\n    addRegexToken('X', matchTimestamp);\n    addParseToken('X', function (input, array, config) {\n        config._d = new Date(parseFloat(input) * 1000);\n    });\n    addParseToken('x', function (input, array, config) {\n        config._d = new Date(toInt(input));\n    });\n\n    //! moment.js\n\n    hooks.version = '2.29.3';\n\n    setHookCallback(createLocal);\n\n    hooks.fn = proto;\n    hooks.min = min;\n    hooks.max = max;\n    hooks.now = now;\n    hooks.utc = createUTC;\n    hooks.unix = createUnix;\n    hooks.months = listMonths;\n    hooks.isDate = isDate;\n    hooks.locale = getSetGlobalLocale;\n    hooks.invalid = createInvalid;\n    hooks.duration = createDuration;\n    hooks.isMoment = isMoment;\n    hooks.weekdays = listWeekdays;\n    hooks.parseZone = createInZone;\n    hooks.localeData = getLocale;\n    hooks.isDuration = isDuration;\n    hooks.monthsShort = listMonthsShort;\n    hooks.weekdaysMin = listWeekdaysMin;\n    hooks.defineLocale = defineLocale;\n    hooks.updateLocale = updateLocale;\n    hooks.locales = listLocales;\n    hooks.weekdaysShort = listWeekdaysShort;\n    hooks.normalizeUnits = normalizeUnits;\n    hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n    hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n    hooks.calendarFormat = getCalendarFormat;\n    hooks.prototype = proto;\n\n    // currently HTML5 input type only supports 24-hour formats\n    hooks.HTML5_FMT = {\n        DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type=\"datetime-local\" />\n        DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type=\"datetime-local\" step=\"1\" />\n        DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type=\"datetime-local\" step=\"0.001\" />\n        DATE: 'YYYY-MM-DD', // <input type=\"date\" />\n        TIME: 'HH:mm', // <input type=\"time\" />\n        TIME_SECONDS: 'HH:mm:ss', // <input type=\"time\" step=\"1\" />\n        TIME_MS: 'HH:mm:ss.SSS', // <input type=\"time\" step=\"0.001\" />\n        WEEK: 'GGGG-[W]WW', // <input type=\"week\" />\n        MONTH: 'YYYY-MM', // <input type=\"month\" />\n    };\n\n    return hooks;\n\n})));\n","/*!\n * Pikaday\n *\n * Copyright © 2014 David Bushell | BSD & MIT license | https://github.com/Pikaday/Pikaday\n */\n\n(function (root, factory)\n{\n    'use strict';\n\n    var moment;\n    if (typeof exports === 'object') {\n        // CommonJS module\n        // Load moment.js as an optional dependency\n        try { moment = require('moment'); } catch (e) {}\n        module.exports = factory(moment);\n    } else if (typeof define === 'function' && define.amd) {\n        // AMD. Register as an anonymous module.\n        define(function (req)\n        {\n            // Load moment.js as an optional dependency\n            var id = 'moment';\n            try { moment = req(id); } catch (e) {}\n            return factory(moment);\n        });\n    } else {\n        root.Pikaday = factory(root.moment);\n    }\n}(this, function (moment)\n{\n    'use strict';\n\n    /**\n     * feature detection and helper functions\n     */\n    var hasMoment = typeof moment === 'function',\n\n    hasEventListeners = !!window.addEventListener,\n\n    document = window.document,\n\n    sto = window.setTimeout,\n\n    addEvent = function(el, e, callback, capture)\n    {\n        if (hasEventListeners) {\n            el.addEventListener(e, callback, !!capture);\n        } else {\n            el.attachEvent('on' + e, callback);\n        }\n    },\n\n    removeEvent = function(el, e, callback, capture)\n    {\n        if (hasEventListeners) {\n            el.removeEventListener(e, callback, !!capture);\n        } else {\n            el.detachEvent('on' + e, callback);\n        }\n    },\n\n    trim = function(str)\n    {\n        return str.trim ? str.trim() : str.replace(/^\\s+|\\s+$/g,'');\n    },\n\n    hasClass = function(el, cn)\n    {\n        return (' ' + el.className + ' ').indexOf(' ' + cn + ' ') !== -1;\n    },\n\n    addClass = function(el, cn)\n    {\n        if (!hasClass(el, cn)) {\n            el.className = (el.className === '') ? cn : el.className + ' ' + cn;\n        }\n    },\n\n    removeClass = function(el, cn)\n    {\n        el.className = trim((' ' + el.className + ' ').replace(' ' + cn + ' ', ' '));\n    },\n\n    isArray = function(obj)\n    {\n        return (/Array/).test(Object.prototype.toString.call(obj));\n    },\n\n    isDate = function(obj)\n    {\n        return (/Date/).test(Object.prototype.toString.call(obj)) && !isNaN(obj.getTime());\n    },\n\n    isWeekend = function(date)\n    {\n        var day = date.getDay();\n        return day === 0 || day === 6;\n    },\n\n    isLeapYear = function(year)\n    {\n        // solution lifted from date.js (MIT license): https://github.com/datejs/Datejs\n        return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);\n    },\n\n    getDaysInMonth = function(year, month)\n    {\n        return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];\n    },\n\n    setToStartOfDay = function(date)\n    {\n        if (isDate(date)) date.setHours(0,0,0,0);\n    },\n\n    compareDates = function(a,b)\n    {\n        // weak date comparison (use setToStartOfDay(date) to ensure correct result)\n        return a.getTime() === b.getTime();\n    },\n\n    extend = function(to, from, overwrite)\n    {\n        var prop, hasProp;\n        for (prop in from) {\n            hasProp = to[prop] !== undefined;\n            if (hasProp && typeof from[prop] === 'object' && from[prop] !== null && from[prop].nodeName === undefined) {\n                if (isDate(from[prop])) {\n                    if (overwrite) {\n                        to[prop] = new Date(from[prop].getTime());\n                    }\n                }\n                else if (isArray(from[prop])) {\n                    if (overwrite) {\n                        to[prop] = from[prop].slice(0);\n                    }\n                } else {\n                    to[prop] = extend({}, from[prop], overwrite);\n                }\n            } else if (overwrite || !hasProp) {\n                to[prop] = from[prop];\n            }\n        }\n        return to;\n    },\n\n    fireEvent = function(el, eventName, data)\n    {\n        var ev;\n\n        if (document.createEvent) {\n            ev = document.createEvent('HTMLEvents');\n            ev.initEvent(eventName, true, false);\n            ev = extend(ev, data);\n            el.dispatchEvent(ev);\n        } else if (document.createEventObject) {\n            ev = document.createEventObject();\n            ev = extend(ev, data);\n            el.fireEvent('on' + eventName, ev);\n        }\n    },\n\n    adjustCalendar = function(calendar) {\n        if (calendar.month < 0) {\n            calendar.year -= Math.ceil(Math.abs(calendar.month)/12);\n            calendar.month += 12;\n        }\n        if (calendar.month > 11) {\n            calendar.year += Math.floor(Math.abs(calendar.month)/12);\n            calendar.month -= 12;\n        }\n        return calendar;\n    },\n\n    /**\n     * defaults and localisation\n     */\n    defaults = {\n\n        // bind the picker to a form field\n        field: null,\n\n        // automatically show/hide the picker on `field` focus (default `true` if `field` is set)\n        bound: undefined,\n\n        // data-attribute on the input field with an aria assistance text (only applied when `bound` is set)\n        ariaLabel: 'Use the arrow keys to pick a date',\n\n        // position of the datepicker, relative to the field (default to bottom & left)\n        // ('bottom' & 'left' keywords are not used, 'top' & 'right' are modifier on the bottom/left position)\n        position: 'bottom left',\n\n        // automatically fit in the viewport even if it means repositioning from the position option\n        reposition: true,\n\n        // the default output format for `.toString()` and `field` value\n        format: 'YYYY-MM-DD',\n\n        // the toString function which gets passed a current date object and format\n        // and returns a string\n        toString: null,\n\n        // used to create date object from current input string\n        parse: null,\n\n        // the initial date to view when first opened\n        defaultDate: null,\n\n        // make the `defaultDate` the initial selected value\n        setDefaultDate: false,\n\n        // first day of week (0: Sunday, 1: Monday etc)\n        firstDay: 0,\n\n        // minimum number of days in the week that gets week number one\n        // default ISO 8601, week 01 is the week with the first Thursday (4)\n        firstWeekOfYearMinDays: 4,\n\n        // the default flag for moment's strict date parsing\n        formatStrict: false,\n\n        // the minimum/earliest date that can be selected\n        minDate: null,\n        // the maximum/latest date that can be selected\n        maxDate: null,\n\n        // number of years either side, or array of upper/lower range\n        yearRange: 10,\n\n        // show week numbers at head of row\n        showWeekNumber: false,\n\n        // Week picker mode\n        pickWholeWeek: false,\n\n        // used internally (don't config outside)\n        minYear: 0,\n        maxYear: 9999,\n        minMonth: undefined,\n        maxMonth: undefined,\n\n        startRange: null,\n        endRange: null,\n\n        isRTL: false,\n\n        // Additional text to append to the year in the calendar title\n        yearSuffix: '',\n\n        // Render the month after year in the calendar title\n        showMonthAfterYear: false,\n\n        // Render days of the calendar grid that fall in the next or previous month\n        showDaysInNextAndPreviousMonths: false,\n\n        // Allows user to select days that fall in the next or previous month\n        enableSelectionDaysInNextAndPreviousMonths: false,\n\n        // how many months are visible\n        numberOfMonths: 1,\n\n        // when numberOfMonths is used, this will help you to choose where the main calendar will be (default `left`, can be set to `right`)\n        // only used for the first display or when a selected date is not visible\n        mainCalendar: 'left',\n\n        // Specify a DOM element to render the calendar in\n        container: undefined,\n\n        // Blur field when date is selected\n        blurFieldOnSelect : true,\n\n        // internationalization\n        i18n: {\n            previousMonth : 'Previous Month',\n            nextMonth     : 'Next Month',\n            months        : ['January','February','March','April','May','June','July','August','September','October','November','December'],\n            weekdays      : ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],\n            weekdaysShort : ['Sun','Mon','Tue','Wed','Thu','Fri','Sat']\n        },\n\n        // Theme Classname\n        theme: null,\n\n        // events array\n        events: [],\n\n        // callback function\n        onSelect: null,\n        onOpen: null,\n        onClose: null,\n        onDraw: null,\n\n        // Enable keyboard input\n        keyboardInput: true\n    },\n\n\n    /**\n     * templating functions to abstract HTML rendering\n     */\n    renderDayName = function(opts, day, abbr)\n    {\n        day += opts.firstDay;\n        while (day >= 7) {\n            day -= 7;\n        }\n        return abbr ? opts.i18n.weekdaysShort[day] : opts.i18n.weekdays[day];\n    },\n\n    renderDay = function(opts)\n    {\n        var arr = [];\n        var ariaSelected = 'false';\n        if (opts.isEmpty) {\n            if (opts.showDaysInNextAndPreviousMonths) {\n                arr.push('is-outside-current-month');\n\n                if(!opts.enableSelectionDaysInNextAndPreviousMonths) {\n                    arr.push('is-selection-disabled');\n                }\n\n            } else {\n                return '<td class=\"is-empty\"></td>';\n            }\n        }\n        if (opts.isDisabled) {\n            arr.push('is-disabled');\n        }\n        if (opts.isToday) {\n            arr.push('is-today');\n        }\n        if (opts.isSelected) {\n            arr.push('is-selected');\n            ariaSelected = 'true';\n        }\n        if (opts.hasEvent) {\n            arr.push('has-event');\n        }\n        if (opts.isInRange) {\n            arr.push('is-inrange');\n        }\n        if (opts.isStartRange) {\n            arr.push('is-startrange');\n        }\n        if (opts.isEndRange) {\n            arr.push('is-endrange');\n        }\n        return '<td data-day=\"' + opts.day + '\" class=\"' + arr.join(' ') + '\" aria-selected=\"' + ariaSelected + '\">' +\n                 '<button class=\"pika-button pika-day\" type=\"button\" ' +\n                    'data-pika-year=\"' + opts.year + '\" data-pika-month=\"' + opts.month + '\" data-pika-day=\"' + opts.day + '\">' +\n                        opts.day +\n                 '</button>' +\n               '</td>';\n    },\n\n    isoWeek = function(date, firstWeekOfYearMinDays) {\n        // Ensure we're at the start of the day.\n        date.setHours(0, 0, 0, 0);\n\n        // Thursday in current week decides the year because January 4th\n        // is always in the first week according to ISO8601.\n        var yearDay        = date.getDate(),\n            weekDay        = date.getDay(),\n            dayInFirstWeek = firstWeekOfYearMinDays,\n            dayShift       = dayInFirstWeek - 1, // counting starts at 0\n            daysPerWeek    = 7,\n            prevWeekDay    = function(day) { return (day + daysPerWeek - 1) % daysPerWeek; };\n\n        // Adjust to Thursday in week 1 and count number of weeks from date to week 1.\n        date.setDate(yearDay + dayShift - prevWeekDay(weekDay));\n\n        var jan4th      = new Date(date.getFullYear(), 0, dayInFirstWeek),\n            msPerDay    = 24 * 60 * 60 * 1000,\n            daysBetween = (date.getTime() - jan4th.getTime()) / msPerDay,\n            weekNum     = 1 + Math.round((daysBetween - dayShift + prevWeekDay(jan4th.getDay())) / daysPerWeek);\n\n        return weekNum;\n    },\n\n    renderWeek = function (d, m, y, firstWeekOfYearMinDays) {\n        var date = new Date(y, m, d),\n            week = hasMoment ? moment(date).isoWeek() : isoWeek(date, firstWeekOfYearMinDays);\n\n        return '<td class=\"pika-week\">' + week + '</td>';\n    },\n\n    renderRow = function(days, isRTL, pickWholeWeek, isRowSelected)\n    {\n        return '<tr class=\"pika-row' + (pickWholeWeek ? ' pick-whole-week' : '') + (isRowSelected ? ' is-selected' : '') + '\">' + (isRTL ? days.reverse() : days).join('') + '</tr>';\n    },\n\n    renderBody = function(rows)\n    {\n        return '<tbody>' + rows.join('') + '</tbody>';\n    },\n\n    renderHead = function(opts)\n    {\n        var i, arr = [];\n        if (opts.showWeekNumber) {\n            arr.push('<th></th>');\n        }\n        for (i = 0; i < 7; i++) {\n            arr.push('<th scope=\"col\"><abbr title=\"' + renderDayName(opts, i) + '\">' + renderDayName(opts, i, true) + '</abbr></th>');\n        }\n        return '<thead><tr>' + (opts.isRTL ? arr.reverse() : arr).join('') + '</tr></thead>';\n    },\n\n    renderTitle = function(instance, c, year, month, refYear, randId)\n    {\n        var i, j, arr,\n            opts = instance._o,\n            isMinYear = year === opts.minYear,\n            isMaxYear = year === opts.maxYear,\n            html = '<div id=\"' + randId + '\" class=\"pika-title\" role=\"heading\" aria-live=\"assertive\">',\n            monthHtml,\n            yearHtml,\n            prev = true,\n            next = true;\n\n        for (arr = [], i = 0; i < 12; i++) {\n            arr.push('<option value=\"' + (year === refYear ? i - c : 12 + i - c) + '\"' +\n                (i === month ? ' selected=\"selected\"': '') +\n                ((isMinYear && i < opts.minMonth) || (isMaxYear && i > opts.maxMonth) ? ' disabled=\"disabled\"' : '') + '>' +\n                opts.i18n.months[i] + '</option>');\n        }\n\n        monthHtml = '<div class=\"pika-label\">' + opts.i18n.months[month] + '<select class=\"pika-select pika-select-month\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n        if (isArray(opts.yearRange)) {\n            i = opts.yearRange[0];\n            j = opts.yearRange[1] + 1;\n        } else {\n            i = year - opts.yearRange;\n            j = 1 + year + opts.yearRange;\n        }\n\n        for (arr = []; i < j && i <= opts.maxYear; i++) {\n            if (i >= opts.minYear) {\n                arr.push('<option value=\"' + i + '\"' + (i === year ? ' selected=\"selected\"': '') + '>' + (i) + '</option>');\n            }\n        }\n        yearHtml = '<div class=\"pika-label\">' + year + opts.yearSuffix + '<select class=\"pika-select pika-select-year\" tabindex=\"-1\">' + arr.join('') + '</select></div>';\n\n        if (opts.showMonthAfterYear) {\n            html += yearHtml + monthHtml;\n        } else {\n            html += monthHtml + yearHtml;\n        }\n\n        if (isMinYear && (month === 0 || opts.minMonth >= month)) {\n            prev = false;\n        }\n\n        if (isMaxYear && (month === 11 || opts.maxMonth <= month)) {\n            next = false;\n        }\n\n        if (c === 0) {\n            html += '<button class=\"pika-prev' + (prev ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.previousMonth + '</button>';\n        }\n        if (c === (instance._o.numberOfMonths - 1) ) {\n            html += '<button class=\"pika-next' + (next ? '' : ' is-disabled') + '\" type=\"button\">' + opts.i18n.nextMonth + '</button>';\n        }\n\n        return html += '</div>';\n    },\n\n    renderTable = function(opts, data, randId)\n    {\n        return '<table cellpadding=\"0\" cellspacing=\"0\" class=\"pika-table\" role=\"grid\" aria-labelledby=\"' + randId + '\">' + renderHead(opts) + renderBody(data) + '</table>';\n    },\n\n\n    /**\n     * Pikaday constructor\n     */\n    Pikaday = function(options)\n    {\n        var self = this,\n            opts = self.config(options);\n\n        self._onMouseDown = function(e)\n        {\n            if (!self._v) {\n                return;\n            }\n            e = e || window.event;\n            var target = e.target || e.srcElement;\n            if (!target) {\n                return;\n            }\n\n            if (!hasClass(target, 'is-disabled')) {\n                if (hasClass(target, 'pika-button') && !hasClass(target, 'is-empty') && !hasClass(target.parentNode, 'is-disabled')) {\n                    self.setDate(new Date(target.getAttribute('data-pika-year'), target.getAttribute('data-pika-month'), target.getAttribute('data-pika-day')));\n                    if (opts.bound) {\n                        sto(function() {\n                            self.hide();\n                            if (opts.blurFieldOnSelect && opts.field) {\n                                opts.field.blur();\n                            }\n                        }, 100);\n                    }\n                }\n                else if (hasClass(target, 'pika-prev')) {\n                    self.prevMonth();\n                }\n                else if (hasClass(target, 'pika-next')) {\n                    self.nextMonth();\n                }\n            }\n            if (!hasClass(target, 'pika-select')) {\n                // if this is touch event prevent mouse events emulation\n                if (e.preventDefault) {\n                    e.preventDefault();\n                } else {\n                    e.returnValue = false;\n                    return false;\n                }\n            } else {\n                self._c = true;\n            }\n        };\n\n        self._onChange = function(e)\n        {\n            e = e || window.event;\n            var target = e.target || e.srcElement;\n            if (!target) {\n                return;\n            }\n            if (hasClass(target, 'pika-select-month')) {\n                self.gotoMonth(target.value);\n            }\n            else if (hasClass(target, 'pika-select-year')) {\n                self.gotoYear(target.value);\n            }\n        };\n\n        self._onKeyChange = function(e)\n        {\n            e = e || window.event;\n\n            if (self.isVisible()) {\n\n                switch(e.keyCode){\n                    case 13:\n                    case 27:\n                        if (opts.field) {\n                            opts.field.blur();\n                        }\n                        break;\n                    case 37:\n                        self.adjustDate('subtract', 1);\n                        break;\n                    case 38:\n                        self.adjustDate('subtract', 7);\n                        break;\n                    case 39:\n                        self.adjustDate('add', 1);\n                        break;\n                    case 40:\n                        self.adjustDate('add', 7);\n                        break;\n                    case 8:\n                    case 46:\n                        self.setDate(null);\n                        break;\n                }\n            }\n        };\n\n        self._parseFieldValue = function()\n        {\n            if (opts.parse) {\n                return opts.parse(opts.field.value, opts.format);\n            } else if (hasMoment) {\n                var date = moment(opts.field.value, opts.format, opts.formatStrict);\n                return (date && date.isValid()) ? date.toDate() : null;\n            } else {\n                return new Date(Date.parse(opts.field.value));\n            }\n        };\n\n        self._onInputChange = function(e)\n        {\n            var date;\n\n            if (e.firedBy === self) {\n                return;\n            }\n            date = self._parseFieldValue();\n            if (isDate(date)) {\n              self.setDate(date);\n            }\n            if (!self._v) {\n                self.show();\n            }\n        };\n\n        self._onInputFocus = function()\n        {\n            self.show();\n        };\n\n        self._onInputClick = function()\n        {\n            self.show();\n        };\n\n        self._onInputBlur = function()\n        {\n            // IE allows pika div to gain focus; catch blur the input field\n            var pEl = document.activeElement;\n            do {\n                if (hasClass(pEl, 'pika-single')) {\n                    return;\n                }\n            }\n            while ((pEl = pEl.parentNode));\n\n            if (!self._c) {\n                self._b = sto(function() {\n                    self.hide();\n                }, 50);\n            }\n            self._c = false;\n        };\n\n        self._onClick = function(e)\n        {\n            e = e || window.event;\n            var target = e.target || e.srcElement,\n                pEl = target;\n            if (!target) {\n                return;\n            }\n            if (!hasEventListeners && hasClass(target, 'pika-select')) {\n                if (!target.onchange) {\n                    target.setAttribute('onchange', 'return;');\n                    addEvent(target, 'change', self._onChange);\n                }\n            }\n            do {\n                if (hasClass(pEl, 'pika-single') || pEl === opts.trigger) {\n                    return;\n                }\n            }\n            while ((pEl = pEl.parentNode));\n            if (self._v && target !== opts.trigger && pEl !== opts.trigger) {\n                self.hide();\n            }\n        };\n\n        self.el = document.createElement('div');\n        self.el.className = 'pika-single' + (opts.isRTL ? ' is-rtl' : '') + (opts.theme ? ' ' + opts.theme : '');\n\n        addEvent(self.el, 'mousedown', self._onMouseDown, true);\n        addEvent(self.el, 'touchend', self._onMouseDown, true);\n        addEvent(self.el, 'change', self._onChange);\n\n        if (opts.keyboardInput) {\n            addEvent(document, 'keydown', self._onKeyChange);\n        }\n\n        if (opts.field) {\n            if (opts.container) {\n                opts.container.appendChild(self.el);\n            } else if (opts.bound) {\n                document.body.appendChild(self.el);\n            } else {\n                opts.field.parentNode.insertBefore(self.el, opts.field.nextSibling);\n            }\n            addEvent(opts.field, 'change', self._onInputChange);\n\n            if (!opts.defaultDate) {\n                opts.defaultDate = self._parseFieldValue();\n                opts.setDefaultDate = true;\n            }\n        }\n\n        var defDate = opts.defaultDate;\n\n        if (isDate(defDate)) {\n            if (opts.setDefaultDate) {\n                self.setDate(defDate, true);\n            } else {\n                self.gotoDate(defDate);\n            }\n        } else {\n            self.gotoDate(new Date());\n        }\n\n        if (opts.bound) {\n            this.hide();\n            self.el.className += ' is-bound';\n            addEvent(opts.trigger, 'click', self._onInputClick);\n            addEvent(opts.trigger, 'focus', self._onInputFocus);\n            addEvent(opts.trigger, 'blur', self._onInputBlur);\n        } else {\n            this.show();\n        }\n    };\n\n\n    /**\n     * public Pikaday API\n     */\n    Pikaday.prototype = {\n\n\n        /**\n         * configure functionality\n         */\n        config: function(options)\n        {\n            if (!this._o) {\n                this._o = extend({}, defaults, true);\n            }\n\n            var opts = extend(this._o, options, true);\n\n            opts.isRTL = !!opts.isRTL;\n\n            opts.field = (opts.field && opts.field.nodeName) ? opts.field : null;\n\n            opts.theme = (typeof opts.theme) === 'string' && opts.theme ? opts.theme : null;\n\n            opts.bound = !!(opts.bound !== undefined ? opts.field && opts.bound : opts.field);\n\n            opts.trigger = (opts.trigger && opts.trigger.nodeName) ? opts.trigger : opts.field;\n\n            opts.disableWeekends = !!opts.disableWeekends;\n\n            opts.disableDayFn = (typeof opts.disableDayFn) === 'function' ? opts.disableDayFn : null;\n\n            var nom = parseInt(opts.numberOfMonths, 10) || 1;\n            opts.numberOfMonths = nom > 4 ? 4 : nom;\n\n            if (!isDate(opts.minDate)) {\n                opts.minDate = false;\n            }\n            if (!isDate(opts.maxDate)) {\n                opts.maxDate = false;\n            }\n            if ((opts.minDate && opts.maxDate) && opts.maxDate < opts.minDate) {\n                opts.maxDate = opts.minDate = false;\n            }\n            if (opts.minDate) {\n                this.setMinDate(opts.minDate);\n            }\n            if (opts.maxDate) {\n                this.setMaxDate(opts.maxDate);\n            }\n\n            if (isArray(opts.yearRange)) {\n                var fallback = new Date().getFullYear() - 10;\n                opts.yearRange[0] = parseInt(opts.yearRange[0], 10) || fallback;\n                opts.yearRange[1] = parseInt(opts.yearRange[1], 10) || fallback;\n            } else {\n                opts.yearRange = Math.abs(parseInt(opts.yearRange, 10)) || defaults.yearRange;\n                if (opts.yearRange > 100) {\n                    opts.yearRange = 100;\n                }\n            }\n\n            return opts;\n        },\n\n        /**\n         * return a formatted string of the current selection (using Moment.js if available)\n         */\n        toString: function(format)\n        {\n            format = format || this._o.format;\n            if (!isDate(this._d)) {\n                return '';\n            }\n            if (this._o.toString) {\n              return this._o.toString(this._d, format);\n            }\n            if (hasMoment) {\n              return moment(this._d).format(format);\n            }\n            return this._d.toDateString();\n        },\n\n        /**\n         * return a Moment.js object of the current selection (if available)\n         */\n        getMoment: function()\n        {\n            return hasMoment ? moment(this._d) : null;\n        },\n\n        /**\n         * set the current selection from a Moment.js object (if available)\n         */\n        setMoment: function(date, preventOnSelect)\n        {\n            if (hasMoment && moment.isMoment(date)) {\n                this.setDate(date.toDate(), preventOnSelect);\n            }\n        },\n\n        /**\n         * return a Date object of the current selection\n         */\n        getDate: function()\n        {\n            return isDate(this._d) ? new Date(this._d.getTime()) : null;\n        },\n\n        /**\n         * set the current selection\n         */\n        setDate: function(date, preventOnSelect)\n        {\n            if (!date) {\n                this._d = null;\n\n                if (this._o.field) {\n                    this._o.field.value = '';\n                    fireEvent(this._o.field, 'change', { firedBy: this });\n                }\n\n                return this.draw();\n            }\n            if (typeof date === 'string') {\n                date = new Date(Date.parse(date));\n            }\n            if (!isDate(date)) {\n                return;\n            }\n\n            var min = this._o.minDate,\n                max = this._o.maxDate;\n\n            if (isDate(min) && date < min) {\n                date = min;\n            } else if (isDate(max) && date > max) {\n                date = max;\n            }\n\n            this._d = new Date(date.getTime());\n            setToStartOfDay(this._d);\n            this.gotoDate(this._d);\n\n            if (this._o.field) {\n                this._o.field.value = this.toString();\n                fireEvent(this._o.field, 'change', { firedBy: this });\n            }\n            if (!preventOnSelect && typeof this._o.onSelect === 'function') {\n                this._o.onSelect.call(this, this.getDate());\n            }\n        },\n\n        /**\n         * clear and reset the date\n         */\n        clear: function()\n        {\n            this.setDate(null);\n        },\n\n        /**\n         * change view to a specific date\n         */\n        gotoDate: function(date)\n        {\n            var newCalendar = true;\n\n            if (!isDate(date)) {\n                return;\n            }\n\n            if (this.calendars) {\n                var firstVisibleDate = new Date(this.calendars[0].year, this.calendars[0].month, 1),\n                    lastVisibleDate = new Date(this.calendars[this.calendars.length-1].year, this.calendars[this.calendars.length-1].month, 1),\n                    visibleDate = date.getTime();\n                // get the end of the month\n                lastVisibleDate.setMonth(lastVisibleDate.getMonth()+1);\n                lastVisibleDate.setDate(lastVisibleDate.getDate()-1);\n                newCalendar = (visibleDate < firstVisibleDate.getTime() || lastVisibleDate.getTime() < visibleDate);\n            }\n\n            if (newCalendar) {\n                this.calendars = [{\n                    month: date.getMonth(),\n                    year: date.getFullYear()\n                }];\n                if (this._o.mainCalendar === 'right') {\n                    this.calendars[0].month += 1 - this._o.numberOfMonths;\n                }\n            }\n\n            this.adjustCalendars();\n        },\n\n        adjustDate: function(sign, days) {\n\n            var day = this.getDate() || new Date();\n            var difference = parseInt(days)*24*60*60*1000;\n\n            var newDay;\n\n            if (sign === 'add') {\n                newDay = new Date(day.valueOf() + difference);\n            } else if (sign === 'subtract') {\n                newDay = new Date(day.valueOf() - difference);\n            }\n\n            this.setDate(newDay);\n        },\n\n        adjustCalendars: function() {\n            this.calendars[0] = adjustCalendar(this.calendars[0]);\n            for (var c = 1; c < this._o.numberOfMonths; c++) {\n                this.calendars[c] = adjustCalendar({\n                    month: this.calendars[0].month + c,\n                    year: this.calendars[0].year\n                });\n            }\n            this.draw();\n        },\n\n        gotoToday: function()\n        {\n            this.gotoDate(new Date());\n        },\n\n        /**\n         * change view to a specific month (zero-index, e.g. 0: January)\n         */\n        gotoMonth: function(month)\n        {\n            if (!isNaN(month)) {\n                this.calendars[0].month = parseInt(month, 10);\n                this.adjustCalendars();\n            }\n        },\n\n        nextMonth: function()\n        {\n            this.calendars[0].month++;\n            this.adjustCalendars();\n        },\n\n        prevMonth: function()\n        {\n            this.calendars[0].month--;\n            this.adjustCalendars();\n        },\n\n        /**\n         * change view to a specific full year (e.g. \"2012\")\n         */\n        gotoYear: function(year)\n        {\n            if (!isNaN(year)) {\n                this.calendars[0].year = parseInt(year, 10);\n                this.adjustCalendars();\n            }\n        },\n\n        /**\n         * change the minDate\n         */\n        setMinDate: function(value)\n        {\n            if(value instanceof Date) {\n                setToStartOfDay(value);\n                this._o.minDate = value;\n                this._o.minYear  = value.getFullYear();\n                this._o.minMonth = value.getMonth();\n            } else {\n                this._o.minDate = defaults.minDate;\n                this._o.minYear  = defaults.minYear;\n                this._o.minMonth = defaults.minMonth;\n                this._o.startRange = defaults.startRange;\n            }\n\n            this.draw();\n        },\n\n        /**\n         * change the maxDate\n         */\n        setMaxDate: function(value)\n        {\n            if(value instanceof Date) {\n                setToStartOfDay(value);\n                this._o.maxDate = value;\n                this._o.maxYear = value.getFullYear();\n                this._o.maxMonth = value.getMonth();\n            } else {\n                this._o.maxDate = defaults.maxDate;\n                this._o.maxYear = defaults.maxYear;\n                this._o.maxMonth = defaults.maxMonth;\n                this._o.endRange = defaults.endRange;\n            }\n\n            this.draw();\n        },\n\n        setStartRange: function(value)\n        {\n            this._o.startRange = value;\n        },\n\n        setEndRange: function(value)\n        {\n            this._o.endRange = value;\n        },\n\n        /**\n         * refresh the HTML\n         */\n        draw: function(force)\n        {\n            if (!this._v && !force) {\n                return;\n            }\n            var opts = this._o,\n                minYear = opts.minYear,\n                maxYear = opts.maxYear,\n                minMonth = opts.minMonth,\n                maxMonth = opts.maxMonth,\n                html = '',\n                randId;\n\n            if (this._y <= minYear) {\n                this._y = minYear;\n                if (!isNaN(minMonth) && this._m < minMonth) {\n                    this._m = minMonth;\n                }\n            }\n            if (this._y >= maxYear) {\n                this._y = maxYear;\n                if (!isNaN(maxMonth) && this._m > maxMonth) {\n                    this._m = maxMonth;\n                }\n            }\n\n            for (var c = 0; c < opts.numberOfMonths; c++) {\n                randId = 'pika-title-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 2);\n                html += '<div class=\"pika-lendar\">' + renderTitle(this, c, this.calendars[c].year, this.calendars[c].month, this.calendars[0].year, randId) + this.render(this.calendars[c].year, this.calendars[c].month, randId) + '</div>';\n            }\n\n            this.el.innerHTML = html;\n\n            if (opts.bound) {\n                if(opts.field.type !== 'hidden') {\n                    sto(function() {\n                        opts.trigger.focus();\n                    }, 1);\n                }\n            }\n\n            if (typeof this._o.onDraw === 'function') {\n                this._o.onDraw(this);\n            }\n\n            if (opts.bound) {\n                // let the screen reader user know to use arrow keys\n                opts.field.setAttribute('aria-label', opts.ariaLabel);\n            }\n        },\n\n        adjustPosition: function()\n        {\n            var field, pEl, width, height, viewportWidth, viewportHeight, scrollTop, left, top, clientRect, leftAligned, bottomAligned;\n\n            if (this._o.container) return;\n\n            this.el.style.position = 'absolute';\n\n            field = this._o.trigger;\n            pEl = field;\n            width = this.el.offsetWidth;\n            height = this.el.offsetHeight;\n            viewportWidth = window.innerWidth || document.documentElement.clientWidth;\n            viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n            scrollTop = window.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop;\n            leftAligned = true;\n            bottomAligned = true;\n\n            if (typeof field.getBoundingClientRect === 'function') {\n                clientRect = field.getBoundingClientRect();\n                left = clientRect.left + window.pageXOffset;\n                top = clientRect.bottom + window.pageYOffset;\n            } else {\n                left = pEl.offsetLeft;\n                top  = pEl.offsetTop + pEl.offsetHeight;\n                while((pEl = pEl.offsetParent)) {\n                    left += pEl.offsetLeft;\n                    top  += pEl.offsetTop;\n                }\n            }\n\n            // default position is bottom & left\n            if ((this._o.reposition && left + width > viewportWidth) ||\n                (\n                    this._o.position.indexOf('right') > -1 &&\n                    left - width + field.offsetWidth > 0\n                )\n            ) {\n                left = left - width + field.offsetWidth;\n                leftAligned = false;\n            }\n            if ((this._o.reposition && top + height > viewportHeight + scrollTop) ||\n                (\n                    this._o.position.indexOf('top') > -1 &&\n                    top - height - field.offsetHeight > 0\n                )\n            ) {\n                top = top - height - field.offsetHeight;\n                bottomAligned = false;\n            }\n\n            this.el.style.left = left + 'px';\n            this.el.style.top = top + 'px';\n\n            addClass(this.el, leftAligned ? 'left-aligned' : 'right-aligned');\n            addClass(this.el, bottomAligned ? 'bottom-aligned' : 'top-aligned');\n            removeClass(this.el, !leftAligned ? 'left-aligned' : 'right-aligned');\n            removeClass(this.el, !bottomAligned ? 'bottom-aligned' : 'top-aligned');\n        },\n\n        /**\n         * render HTML for a particular month\n         */\n        render: function(year, month, randId)\n        {\n            var opts   = this._o,\n                now    = new Date(),\n                days   = getDaysInMonth(year, month),\n                before = new Date(year, month, 1).getDay(),\n                data   = [],\n                row    = [];\n            setToStartOfDay(now);\n            if (opts.firstDay > 0) {\n                before -= opts.firstDay;\n                if (before < 0) {\n                    before += 7;\n                }\n            }\n            var previousMonth = month === 0 ? 11 : month - 1,\n                nextMonth = month === 11 ? 0 : month + 1,\n                yearOfPreviousMonth = month === 0 ? year - 1 : year,\n                yearOfNextMonth = month === 11 ? year + 1 : year,\n                daysInPreviousMonth = getDaysInMonth(yearOfPreviousMonth, previousMonth);\n            var cells = days + before,\n                after = cells;\n            while(after > 7) {\n                after -= 7;\n            }\n            cells += 7 - after;\n            var isWeekSelected = false;\n            for (var i = 0, r = 0; i < cells; i++)\n            {\n                var day = new Date(year, month, 1 + (i - before)),\n                    isSelected = isDate(this._d) ? compareDates(day, this._d) : false,\n                    isToday = compareDates(day, now),\n                    hasEvent = opts.events.indexOf(day.toDateString()) !== -1 ? true : false,\n                    isEmpty = i < before || i >= (days + before),\n                    dayNumber = 1 + (i - before),\n                    monthNumber = month,\n                    yearNumber = year,\n                    isStartRange = opts.startRange && compareDates(opts.startRange, day),\n                    isEndRange = opts.endRange && compareDates(opts.endRange, day),\n                    isInRange = opts.startRange && opts.endRange && opts.startRange < day && day < opts.endRange,\n                    isDisabled = (opts.minDate && day < opts.minDate) ||\n                                 (opts.maxDate && day > opts.maxDate) ||\n                                 (opts.disableWeekends && isWeekend(day)) ||\n                                 (opts.disableDayFn && opts.disableDayFn(day));\n\n                if (isEmpty) {\n                    if (i < before) {\n                        dayNumber = daysInPreviousMonth + dayNumber;\n                        monthNumber = previousMonth;\n                        yearNumber = yearOfPreviousMonth;\n                    } else {\n                        dayNumber = dayNumber - days;\n                        monthNumber = nextMonth;\n                        yearNumber = yearOfNextMonth;\n                    }\n                }\n\n                var dayConfig = {\n                        day: dayNumber,\n                        month: monthNumber,\n                        year: yearNumber,\n                        hasEvent: hasEvent,\n                        isSelected: isSelected,\n                        isToday: isToday,\n                        isDisabled: isDisabled,\n                        isEmpty: isEmpty,\n                        isStartRange: isStartRange,\n                        isEndRange: isEndRange,\n                        isInRange: isInRange,\n                        showDaysInNextAndPreviousMonths: opts.showDaysInNextAndPreviousMonths,\n                        enableSelectionDaysInNextAndPreviousMonths: opts.enableSelectionDaysInNextAndPreviousMonths\n                    };\n\n                if (opts.pickWholeWeek && isSelected) {\n                    isWeekSelected = true;\n                }\n\n                row.push(renderDay(dayConfig));\n\n                if (++r === 7) {\n                    if (opts.showWeekNumber) {\n                        row.unshift(renderWeek(i - before, month, year, opts.firstWeekOfYearMinDays));\n                    }\n                    data.push(renderRow(row, opts.isRTL, opts.pickWholeWeek, isWeekSelected));\n                    row = [];\n                    r = 0;\n                    isWeekSelected = false;\n                }\n            }\n            return renderTable(opts, data, randId);\n        },\n\n        isVisible: function()\n        {\n            return this._v;\n        },\n\n        show: function()\n        {\n            if (!this.isVisible()) {\n                this._v = true;\n                this.draw();\n                removeClass(this.el, 'is-hidden');\n                if (this._o.bound) {\n                    addEvent(document, 'click', this._onClick);\n                    this.adjustPosition();\n                }\n                if (typeof this._o.onOpen === 'function') {\n                    this._o.onOpen.call(this);\n                }\n            }\n        },\n\n        hide: function()\n        {\n            var v = this._v;\n            if (v !== false) {\n                if (this._o.bound) {\n                    removeEvent(document, 'click', this._onClick);\n                }\n\n                if (!this._o.container) {\n                    this.el.style.position = 'static'; // reset\n                    this.el.style.left = 'auto';\n                    this.el.style.top = 'auto';\n                }\n                addClass(this.el, 'is-hidden');\n                this._v = false;\n                if (v !== undefined && typeof this._o.onClose === 'function') {\n                    this._o.onClose.call(this);\n                }\n            }\n        },\n\n        /**\n         * GAME OVER\n         */\n        destroy: function()\n        {\n            var opts = this._o;\n\n            this.hide();\n            removeEvent(this.el, 'mousedown', this._onMouseDown, true);\n            removeEvent(this.el, 'touchend', this._onMouseDown, true);\n            removeEvent(this.el, 'change', this._onChange);\n            if (opts.keyboardInput) {\n                removeEvent(document, 'keydown', this._onKeyChange);\n            }\n            if (opts.field) {\n                removeEvent(opts.field, 'change', this._onInputChange);\n                if (opts.bound) {\n                    removeEvent(opts.trigger, 'click', this._onInputClick);\n                    removeEvent(opts.trigger, 'focus', this._onInputFocus);\n                    removeEvent(opts.trigger, 'blur', this._onInputBlur);\n                }\n            }\n            if (this.el.parentNode) {\n                this.el.parentNode.removeChild(this.el);\n            }\n        }\n\n    };\n\n    return Pikaday;\n}));\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  function define(obj, key, value) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n    return obj[key];\n  }\n  try {\n    // IE 8 has a broken Object.defineProperty that only works on DOM objects.\n    define({}, \"\");\n  } catch (err) {\n    define = function(obj, key, value) {\n      return obj[key] = value;\n    };\n  }\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  exports.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  define(IteratorPrototype, iteratorSymbol, function () {\n    return this;\n  });\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = GeneratorFunctionPrototype;\n  define(Gp, \"constructor\", GeneratorFunctionPrototype);\n  define(GeneratorFunctionPrototype, \"constructor\", GeneratorFunction);\n  GeneratorFunction.displayName = define(\n    GeneratorFunctionPrototype,\n    toStringTagSymbol,\n    \"GeneratorFunction\"\n  );\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      define(prototype, method, function(arg) {\n        return this._invoke(method, arg);\n      });\n    });\n  }\n\n  exports.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  exports.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      define(genFun, toStringTagSymbol, \"GeneratorFunction\");\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  exports.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator, PromiseImpl) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return PromiseImpl.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return PromiseImpl.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration.\n          result.value = unwrapped;\n          resolve(result);\n        }, function(error) {\n          // If a rejected Promise was yielded, throw the rejection back\n          // into the async generator function so it can be handled there.\n          return invoke(\"throw\", error, resolve, reject);\n        });\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new PromiseImpl(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n    return this;\n  });\n  exports.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n    if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList),\n      PromiseImpl\n    );\n\n    return exports.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        // Note: [\"return\"] must be used for ES3 parsing compatibility.\n        if (delegate.iterator[\"return\"]) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  define(Gp, toStringTagSymbol, \"Generator\");\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  define(Gp, iteratorSymbol, function() {\n    return this;\n  });\n\n  define(Gp, \"toString\", function() {\n    return \"[object Generator]\";\n  });\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  exports.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  exports.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n\n  // Regardless of whether this script is executing as a CommonJS module\n  // or not, return the runtime object so that we can declare the variable\n  // regeneratorRuntime in the outer scope, which allows this module to be\n  // injected easily by `bin/regenerator --include-runtime script.js`.\n  return exports;\n\n}(\n  // If this script is executing as a CommonJS module, use module.exports\n  // as the regeneratorRuntime namespace. Otherwise create a new empty\n  // object. Either way, the resulting object will be used to initialize\n  // the regeneratorRuntime variable at the top of this file.\n  typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n  regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n  // This module should not be running in strict mode, so the above\n  // assignment should always work unless something is misconfigured. Just\n  // in case runtime.js accidentally runs in strict mode, in modern engines\n  // we can explicitly access globalThis. In older engines we can escape\n  // strict mode using a global Function call. This could conceivably fail\n  // if a Content Security Policy forbids using Function, but in that case\n  // the proper solution is to fix the accidental strict mode problem. If\n  // you've misconfigured your bundler to force strict mode and applied a\n  // CSP to forbid Function, and you're not willing to fix either of those\n  // problems, please detail your unique predicament in a GitHub issue.\n  if (typeof globalThis === \"object\") {\n    globalThis.regeneratorRuntime = runtime;\n  } else {\n    Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n  }\n}\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n"],"sourceRoot":""}