{"version":3,"sources":["webpack://App.[name]/./js/demographics-donut.js","webpack://App.[name]/./vendor/highcharts/exporting.js","webpack://App.[name]/./js/analytics.js","webpack://App.[name]/./js/demographics.js","webpack://App.[name]//nix/store/saylf54v94hjg6x2hqwqargyffdmydi3-node_mixrank-0.0.1/lib/node_modules/d3/d3.js","webpack://App.[name]/./vendor/highcharts/highcharts.src.js"],"names":["d3","config","color","scale","category20c","arc","svg","outerRadius","radius","innerRadius","arcHover","pie","layout","sort","value","d","selection","each","data","total","$","i","v","Math","round","select","this","selectAll","gEnter","enter","append","attr","text","title","style","g","arcs","on","percent","index","legendSetup","Highcharts","f","y","A","t","C","k","n","u","o","r","p","D","j","B","E","F","x","Chart","addEvent","removeEvent","createElement","discardElement","css","merge","extend","max","document","window","isTouchDevice","Renderer","prototype","symbols","getOptions","lang","printChart","downloadPNG","downloadJPEG","downloadPDF","downloadSVG","contextButtonTitle","navigation","menuStyle","border","background","padding","menuItemStyle","fontSize","menuItemHoverStyle","buttonOptions","symbolFill","symbolSize","symbolStroke","symbolStrokeWidth","symbolX","symbolY","align","buttonSpacing","height","theme","fill","stroke","verticalAlign","width","exporting","type","url","buttons","contextButton","menuClassName","symbol","_titleKey","menuItems","textKey","onclick","print","separator","exportChart","post","c","a","b","method","action","enctype","display","body","name","submit","getSVG","z","h","options","createElementNS","position","top","chartWidth","chartHeight","renderTo","sourceWidth","chart","test","parseInt","sourceHeight","animation","forExport","enabled","series","showCheckbox","visible","isInternal","push","callback","getExtremes","userMin","userMax","setExtremes","container","innerHTML","destroy","replace","toLowerCase","borderRadius","chartOptions","filename","parentNode","childNodes","isPrinting","nodeType","appendChild","focus","setTimeout","contextMenu","w","e","q","l","m","s","className","zIndex","MozBoxShadow","WebkitBoxShadow","boxShadow","setState","openMenu","clearTimeout","pointer","inClass","target","onmouseover","onmouseout","apply","arguments","cursor","exportDivElements","exportMenuWidth","offsetWidth","exportMenuHeight","offsetHeight","right","left","alignOptions","bottom","addButton","renderer","btnCount","exportSVGElements","states","hover","translateX","translateY","paddingLeft","pick","button","add","destroyExport","length","ontouchstart","menu","callbacks","props","email","$el","that","click","trackEvent","currentTarget","donutChart","demographics","international_total","global_unique_visitors_users","us_unique_visitors_users","gender_total","gender_male_visitors","gender_female_visitors","offspring_total","kidsinhousehold_yes_visitors","kidsinhousehold_no_visitors","charts","age_0_17_visitors","age_18_24_visitors","age_25_34_visitors","age_35_44_visitors","age_45_54_visitors","age_55_64_visitors","age_65_plus_visitors","ushhi_0k_25k_visitors","ushhi_25k_50k_visitors","ushhi_50k_75k_visitors","ushhi_75k_100k_visitors","ushhi_100k_150k_visitors","ushhi_150k_plus_visitors","edu_below_highschool_visitors","edu_highschool_visitors","edu_somecollege_visitors","edu_bachelorsdegree_visitors","edu_graduatedegree_visitors","chartname","hasOwnProperty","hasData","dataIdx","donut","id","get","datum","call","parent","remove","version","d3_arraySlice","slice","d3_array","list","d3_document","d3_documentElement","node","ownerDocument","documentElement","d3_window","defaultView","array","Array","Date","now","setProperty","error","d3_element_prototype","Element","d3_element_setAttribute","setAttribute","d3_element_setAttributeNS","setAttributeNS","d3_style_prototype","CSSStyleDeclaration","d3_style_setProperty","space","local","priority","d3_ascending","NaN","d3_number","d3_numeric","isNaN","d3_bisector","compare","lo","hi","mid","ascending","descending","min","extent","sum","mean","quantile","values","H","floor","median","numbers","variance","deviation","sqrt","d3_bisect","d3_transposeLength","bisectLeft","bisect","bisectRight","bisector","shuffle","i0","i1","random","permute","indexes","permutes","pairs","p1","transpose","matrix","row","zip","keys","map","key","entries","arrays","merged","abs","d3_range_integerScale","d3_class","ctor","properties","Object","defineProperty","enumerable","d3_Map","_","create","range","start","stop","step","Infinity","Error","object","forEach","set","isArray","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","d3_vendorSymbol","charAt","toUpperCase","d3_vendorPrefixes","prefixName","has","empty","nest","sortValues","rollup","sortKeys","mapType","depth","keyValue","setter","valuesByKey","sortKey","keyMap","order","behavior","rebind","d3_noop","d3_dispatch","d3_dispatch_event","dispatch","listeners","listenerByName","event","listener","indexOf","concat","d3_eventPreventDefault","preventDefault","d3_eventSource","sourceEvent","d3_eventDispatch","of","thiz","argumentz","e1","e0","requote","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","d3_selection_selector","selector","d3_selection_selectorAll","subgroup","subnode","group","subgroups","__data__","d3_nsXhtml","d3_nsPrefix","xhtml","xlink","xml","xmlns","d3_selection_attr","ns","qualify","removeAttributeNS","removeAttribute","d3_collapse","trim","d3_selection_classedRe","RegExp","d3_selection_classes","split","d3_selection_classed","d3_selection_classedName","re","classList","getAttribute","lastIndex","d3_selection_style","removeProperty","d3_selection_property","d3_selection_creator","namespace","namespaceURI","d3_selectionRemove","removeChild","d3_selection_dataNode","d3_selection_filter","d3_selection_sortComparator","comparator","d3_selection_each","d3_selection_enter","d3_selection_enterPrototype","prefix","getAttributeNS","classed","contains","getComputedStyle","getPropertyValue","textContent","html","insert","before","insertBefore","bind","groupData","nodeData","n0","updateNodes","enterNodes","exitNodes","nodeByKeyValue","keyValues","update","exit","filter","next","nextSibling","args","d3_selection_enterInsertBefore","j0","d3_selection_on","capture","wrap","d3_selection_onListener","d3_selection_onFilters","onRemove","removeEventListener","d3_selection_onFilter","addEventListener","match","upgroup","nodes","mouseenter","mouseleave","related","relatedTarget","compareDocumentPosition","d3_event_dragSelect","d3_event_dragId","d3_event_dragSuppress","suppressClick","off","mouse","d3_mousePoint","d3_mouse_bug44083","navigator","userAgent","changedTouches","ownerSVGElement","createSVGPoint","point","scrollX","scrollY","ctm","margin","getScreenCTM","pageX","pageY","clientX","clientY","matrixTransform","inverse","rect","getBoundingClientRect","clientLeft","clientTop","d3_behavior_dragTouchId","identifier","touch","touches","drag","origin","mousedown","dragstart","touchstart","subject","move","end","dragOffset","correspondingElement","dragged","dragId","dragName","dragSubject","moved","ended","dragRestore","position0","dx","dy","position1","ε","ε2","π","PI","τ","τε","halfπ","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","d3_sinh","duration","zoom","translate0","center0","center","mousewheelTimer","touchtime","x0","x1","y0","y1","view","scaleExtent","d3_behavior_zoomInfinity","zooming","mousemove","mouseup","mousedowned","d3_behavior_zoomWheel","mousewheeled","dblclicked","touchstarted","location","scaleTo","translateTo","zoomTo","__chart__","pow","transition","rescale","domain","invert","zoomstarted","zoomed","translate","zoomended","location0","d3_selection_interrupt","scale0","locations0","distance0","zoomName","touchmove","touchend","targets","relocate","started","changed","LN2","l0","l1","distance1","scale1","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","toString","rgb","hsl","d3_hslPrototype","d3_hsl_rgb","m1","m2","vv","d3_rgb","d3_hcl","d3_lab_hcl","d3_lab","d3_rgb_lab","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","parseFloat","d3_rgb_parseNumber","d3_rgb_names","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","mimeType","d3_xhr","xhr","headers","request","XMLHttpRequest","responseType","respond","result","status","responseText","d3_xhrHasResponse","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","then","time","timer","d3_timer_step","d3_timer_mark","d3_timer_sweep","isFinite","t0","t1","d3_format_precision","LN10","flush","d3_formatPrefixes","d3_locale_numberFormat","locale","locale_decimal","decimal","locale_thousands","thousands","locale_grouping","grouping","locale_currency","currency","formatGroup","substring","reverse","specifier","d3_format_re","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","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","d3_time_formatPad","dayOfYear","sundayOfYear","mondayOfYear","Y","d3_time_zone","d3_time_parseDay","d3_time_parseHour24","d3_time_parseDayOfYear","d3_time_parseMilliseconds","d3_time_parseMonthNumber","d3_time_parseMinutes","d3_time_parseSeconds","d3_time_parseWeekNumberSunday","d3_time_parseWeekdayNumber","d3_time_parseWeekNumberMonday","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","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","λ00","φ00","λ0","cosφ0","sinφ0","nextPoint","λ","φ","dλ","sdλ","adλ","cosφ","sinφ","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","φ0","λ1","φ1","λ_","λ__","φ__","dλSum","ranges","bound","ringPoint","ringStart","ringEnd","linePoint","normal","inflection","λi","antimeridian","φi","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","meridian","parallel","meridianNormal","polarAngle","winding","ring","point0","intersection","φarc","d3_geo_pointInPolygon","polygonStarted","d3_geo_clipSort","pointLine","buffer","d3_geo_clipBufferListener","ringListener","clean","ringSegments","pop","shift","d3_geo_clipSegmentLength1","lines","rejoin","d3_geo_clipAntimeridian","sλ0","sλ1","cosφ1","sinλ0_λ1","atan","d3_geo_clipAntimeridianIntersect","from","to","direction","d3_geo_clipCircle","cr","smallRadius","notHemisphere","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","wn","insidePolygon","inside","a1","corner","comparePoints","ca","cb","d3_geo_conic","projectAt","d3_geo_projectionMutator","parallels","d3_geo_conicEqualArea","ρ0","forward","ρ0_y","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_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","δ2","cosMinDistance","maxDepth","resample","resampleRecursive","resampleNone","d3_geo_transformPoint","a00","b00","c00","a0","resampleLineTo","φ2","λ2","x2","y2","dx2","dy2","dz","d3_geo_pathProjectStream","d3_geo_projectionRadians","d3_geo_transform","d3_geo_projection","projectRotate","δx","δy","projectResample","δφ","δγ","preclip","postclip","clipAngle","projection","d3_geo_rotation","invalidate","d3_geo_equirectangular","d3_geo_identityRotation","d3_geo_rotationλ","d3_geo_rotationφγ","d3_geo_forwardRotationλ","rotation","cosδφ","sinδφ","cosδγ","sinδγ","sr","d3_geo_circleAngle","d3_geo_graticuleX","d3_geo_graticuleY","d3_source","d3_target","path","projectStream","contextStream","cacheStream","transform","methods","projectionMutator","equirectangular","circle","distance","Δλ","sinΔλ","cosΔλ","sinφ1","graticule","X1","X0","Y1","Y0","DX","DY","outline","majorExtent","minorExtent","majorStep","minorStep","greatArc","source_","target_","cy0","sy0","cy1","sy1","kx0","ky0","kx1","ky1","d3_geo_length","d3_geo_azimuthal","azimuthal","cosλ","sinc","cosc","d3_geo_azimuthalEqualArea","cosλcosφ","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","splice","d3_geom_voronoiClipEdges","cell","iHalfEdge","halfEdges","nHalfEdges","cells","iCell","prepare","d3_geom_voronoiCloseCells","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","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","quad","d3_ease_quad","cubic","d3_ease_cubic","d3_ease_sin","d3_ease_exp","d3_ease_circle","elastic","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","skew","ease","interpolateHcl","ah","ac","al","bh","bc","bl","interpolateHsl","as","interpolateLab","aa","ba","interpolateRound","baseVal","consolidate","d3_transformIdentity","d3_interpolateTransformPop","d3_interpolateTransform","ta","tb","d3_interpolateTranslate","ra","rb","d3_interpolateRotate","wa","wb","d3_interpolateSkew","ka","kb","d3_interpolateScale","d3_uninterpolateNumber","d3_uninterpolateClamp","d3_layout_bundlePath","link","lca","aNodes","d3_layout_bundleAncestors","bNodes","aNode","bNode","sharedNode","d3_layout_bundleLeastCommonAncestor","ancestors","d3_layout_forceDragstart","fixed","d3_layout_forceDragend","d3_layout_forceMouseover","px","py","d3_layout_forceMouseout","interpolateTransform","bundle","paths","chord","chords","sortGroups","sortSubgroups","sortChords","relayout","groupSums","groupIndex","subgroupIndex","di","dj","subindex","startAngle","endAngle","resort","force","alpha","distances","strengths","charges","friction","linkDistance","d3_layout_forceLinkDistance","linkStrength","d3_layout_forceLinkStrength","charge","chargeDistance2","d3_layout_forceChargeDistance2","gravity","theta2","repulse","dw","dn","pointCharge","dragmove","resume","tick","weight","d3_layout_forceAccumulate","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","Number","d3_layout_pieSortByValue","padAngle","da","pa","d3_layout_stackX","d3_layout_stackY","d3_layout_stackOut","d3_layout_stackOrderDefault","d3_layout_stackOffsetZero","orders","offsets","d3_layout_stackOrders","d3_layout_stackOffsets","d3_layout_stackMaxIndex","sums","d3_layout_stackReduceSum","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","db","dc","d3_layout_treeSeparation","d3_layout_treeLeft","d3_layout_treeRight","d3_layout_treeMove","wm","wp","change","d3_layout_treeAncestor","vim","ancestor","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","d3_layout_packTransform","separation","nodeSize","root0","root1","node1","queue","wrapTree","firstWalk","secondWalk","sizeNode","tx","siblings","d3_layout_treeShift","midpoint","vip","vop","vom","sip","sop","sim","som","apportion","cluster","previousNode","d3_layout_clusterX","d3_layout_clusterY","d3_layout_clusterLeft","d3_layout_clusterRight","treemap","stickies","pad","sticky","mode","ratio","squarify","score","remaining","worst","stickify","rmax","rmin","padFunction","padConstant","µ","σ","logNormal","bates","irwinHall","d3_scale_polylinear","d3_scale_linearRebind","d3_scale_linearNice","d3_scale_linearTickRange","span","err","d3_scale_linearTicks","d3_scale_linearTickFormat","d3_scale_linearPrecision","d3_scale_linearFormatSignificant","d3_scale_linearFormatPrecision","d3_scale_linear","clamp","rangeRound","ticks","tickFormat","d3_scale_log","base","positive","niced","d3_scale_logNiceNegative","d3_scale_logFormat","d3_scale_powPow","d3_scale_pow","powp","powb","ordinal","d3_scale_ordinal","rangeBand","steps","xi","rangePoints","rangeRoundPoints","rangeBands","outerPadding","rangeRoundBands","category10","d3_category10","category20","d3_category20","category20b","d3_category20b","d3_category20c","d3_zero","d3_scale_quantile","quantiles","invertExtent","quantize","d3_scale_quantize","threshold","d3_scale_threshold","identity","d3_scale_identity","d3_svg_arcInnerRadius","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","cx0","cx1","dx0","dy0","dx1","dy1","d3_svg_line","defined","d3_svg_lineLinear","interpolateKey","tension","d3_svg_lineInterpolators","d3_svg_lineLinearClosed","d3_svg_lineStepBefore","d3_svg_lineStepAfter","basis","d3_svg_lineBasis","pi","d3_svg_lineDot4","d3_svg_lineBasisBezier3","d3_svg_lineBasisBezier","cardinal","d3_svg_lineHermite","d3_svg_lineCardinalTangents","monotone","tangents","d3_svg_lineSlope","d3_svg_lineFiniteDifferences","d3_svg_lineMonotoneTangents","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","curve","self","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","subnodes","nameNS","attrNull","attrNullNS","attrTween","attrTweenNS","styleNull","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","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","createContextualFragment","json","responseXML","jQuery","factory","win","isNumber","pInt","doc","SVG_NS","createSVGRect","isMS","opera","vml","isFirefox","hasBidiBug","product","deg2rad","hasTouch","undefined","isWebKit","chartCount","seriesTypes","symbolSizes","marginNames","noop","uniqueKeyHash","idCounter","timers","msg","console","Fx","elem","prop","dSetter","startVal","ret","toD","element","run","gotoEnd","stopped","startTime","pos","timerId","setInterval","clearInterval","done","complete","curAnim","objectEach","val","easing","initPath","fromD","fullLength","startX","endX","bezier","numParams","isArea","positionFactor","sixify","arr","isOperator","nextIsOperator","insertSlice","subArr","prepend","fillSetter","strokeSetter","tweenTo","len","doCopy","original","isObject","isClass","isDOMElement","mag","isString","obj","str","strict","constructor","erase","item","splat","syncTimeout","fn","arg","el","styles","opacity","tag","attribs","nopad","extendClass","members","padder","relativeLength","func","proceed","outerArgs","ctx","getTZOffset","timestamp","hcGetTimezoneOffset","hcTimezoneOffset","dateFormat","capitalize","defaultOptions","invalidDate","hcGetHours","hcGetDay","dayOfMonth","hcGetDate","hcGetMonth","fullYear","hcGetFullYear","langWeekdays","weekdays","shortWeekdays","replacements","substr","hcGetMinutes","dateFormats","formatSingle","decimals","decimalPoint","thousandsSep","valueAndFormat","splitter","isInside","getMagnitude","num","normalizeTickInterval","multiples","magnitude","allowDecimals","hasTickAmount","normalized","retInterval","grep","correctFloat","stableSort","sortFunction","sortValue","safeI","arrayMin","arrayMax","destroyObjectProperties","except","garbageBin","prec","setAnimation","globalAnimation","animObject","timeUnits","millisecond","strinteger","roundedNumber","origDec","easeInOutSine","getStyle","toInt","scrollWidth","scrollHeight","inArray","results","docElem","box","pageYOffset","scrollTop","pageXOffset","scrollLeft","events","hcEvents","wrappedFn","srcElement","attachEvent","hcEventsIE","removeOneEvent","detachEvent","removeAllEvents","types","nodeName","fireEvent","eventArguments","defaultFunction","createEvent","dispatchEvent","initEvent","defaultPrevented","animate","params","opt","seriesType","pointProps","plotOptions","pointClass","uniqueKey","highcharts","alias","currentStyle","elements","Color","init","parsers","regex","none","rgba","parser","stops","brighten","setOpacity","hasAlpha","SVGElement","SVGRenderer","textProps","animOptions","colorGradient","colorObject","gradName","gradAttr","radAttr","gradients","gradientObject","stopColor","stopOpacity","radialReference","radialGradient","linearGradient","gradientUnits","getRadialAttr","defs","stopObject","gradient","applyTextOutline","textOutline","tspans","tspan","strokeWidth","firstRealChild","getContrast","fakeTS","getElementsByTagName","ySetter","xSetter","digit","firstChild","clone","cloneNode","hash","continueAnimation","hasSetSymbolSize","skipAttr","_defaultGetter","symbolName","symbolAttr","doTransform","_defaultSetter","shadows","updateShadows","afterSetters","updateTransform","cutHeight","addClass","currentClassName","hasClass","removeClass","wrapper","clipRect","crisp","normalizer","textWidth","hyphenate","oldStyles","newStyles","serializedCss","hasNew","svgPseudoProps","added","buildText","eventType","handler","svgElement","touchEventFired","setRadialReference","existingGradient","inverted","scaleX","scaleY","toFront","alignByTranslate","vAlign","alignTo","alignFactor","vAlignFactor","alignedObjects","placed","alignAttr","getBBox","reload","rot","bBox","rad","toggleTextShadowShim","cacheKey","textStr","cache","cacheKeys","textOverflow","htmlGetBBox","isSVG","show","visibility","hide","fadeOut","elemWrapper","inserted","parentGroup","parentInverted","handleZ","zIndexSetter","onAdd","safeRemoveChild","grandParent","parentToClean","onmousemove","clipPath","destroyShadows","div","shadow","shadowOptions","cutOff","shadowWidth","shadowElementOpacity","offsetX","offsetY","xGetter","dashstyleSetter","alignSetter","opacitySetter","titleSetter","titleNode","createTextNode","textSetter","visibilitySetter","otherElement","otherZIndex","yGetter","translateXSetter","translateYSetter","rotationSetter","verticalAlignSetter","scaleXSetter","scaleYSetter","hasStroke","allowHTML","boxWrapper","subPixelFix","href","imgCount","setSize","unSubPixelFix","fontFamily","setStyle","isHidden","rendererDefs","draw","getSpanWidth","actualWidth","measureSpanWidth","applyEllipsis","currentIndex","wasTooLong","minIndex","maxIndex","updateTSpan","clsRegex","styleRegex","hrefRegex","textCache","isSubsequentLine","textNode","hasMarkup","parentX","textStyles","textLineHeight","lineHeight","ellipsis","noWrap","whiteSpace","tempParent","getLineHeight","fontSizeStyle","fontMetrics","unescapeAngleBrackets","inputStr","lineNo","spans","spanNo","spanCls","spanStyle","attributes","tooLong","words","hasWhiteSpace","rest","normalState","hoverState","pressedState","disabledState","shape","normalStyle","hoverStyle","pressedStyle","disabledStyle","label","curState","fontWeight","state","crispLine","innerR","rSetter","viewBox","image","src","preserveAspectRatio","imageSrc","centerImage","ren","imageRegex","isImage","sym","symbolFn","imgwidth","imgheight","imgSize","trans","isImg","chartIndex","cosStart","sinStart","cosEnd","sinEnd","longArc","callout","safeDistance","anchorX","anchorY","useHTML","fakeSVG","parentVal","rotCorr","baseline","alterY","wrapperX","wrapperY","textAlign","baselineOffset","getCrispAdjust","updateBoxSize","updateTextPadding","boxAttr","deferredAttr","hasBGImage","needsBox","crispAdjust","textY","textX","widthSetter","heightSetter","paddingSetter","paddingLeftSetter","anchorXSetter","anchorYSetter","baseCss","htmlCss","tagName","overflow","offsetLeft","offsetTop","htmlUpdateTransform","alignCorrection","marginLeft","marginTop","invertChild","currentTextTransform","cTT","setSpanRotation","innerText","getSpanCorrection","xCorr","yCorr","alignOnAdd","rotationStyle","cssTransformKey","transformOrigin","addSetters","svgGroupWrapper","htmlGroup","parents","htmlGroupStyle","cls","pointerEvents","VMLRenderer","VMLRendererExtension","VMLElement","docMode8","documentMode","markup","isDiv","prepVML","deferUpdateTransform","costheta","sintheta","elemHeight","nonLeft","pathToVML","isArc","clipMembers","cssRet","destroyClip","getCSS","evt","cutOffPath","modifiedPath","elemStyle","cssText","setAttr","classSetter","filled","stroked","updateClipping","isIE8","isVML","namespaces","hcv","createStyleSheet","styleSheets","isObj","isShape","member","fillType","regexRgba","opacity1","opacity2","color1","color2","firstStop","lastStop","fillAttr","colors","addFillNode","sizex","sizey","applyRadialGradient","global","VMLRadialGradientURL","propNodes","vmlStyle","coordsize","isCircle","parentStyle","imgStyle","flip","measuringSpan","setTimeMethods","globalOptions","useUTC","GET","SET","timezoneOffset","moment","tz","utcOffset","getTimezoneOffsetOption","hcMakeTime","loading","numericSymbols","resetZoom","resetZoomTitle","defaultSeriesType","ignoreHiddenSeries","spacing","resetZoomButton","borderColor","backgroundColor","plotBorderColor","widthAdjust","subtitle","labels","legend","labelFormatter","activeColor","inactiveColor","itemStyle","itemHoverStyle","itemHiddenStyle","itemCheckboxStyle","squareSymbol","symbolPadding","labelStyle","tooltip","dateTimeLabelFormats","footerFormat","snap","borderWidth","headerFormat","pointFormat","credits","setOptions","defaultPlotOptions","Tick","noLabel","isNew","isNewLabel","addLabel","dateTimeLabelFormat","categories","labelOptions","tickPositions","isFirst","isLast","tickPositionInfo","info","isDatetimeAxis","higherRanks","unitName","isLog","lin2log","labelGroup","labelLength","getLabelSize","horiz","handleOverflow","xy","rightPos","pxPos","leftBound","labelLeft","rightBound","labelRight","factor","labelAlign","labelWidth","slotWidth","getSlotWidth","modifiedSlotWidth","xCorrection","goRight","autoRotation","getPosition","tickmarkOffset","old","cHeight","oldChartHeight","transB","opposite","oldChartWidth","getLabelPosition","transA","reversed","staggerLines","tickRotCorr","yOffset","side","labelOffset","getMarkPath","tickLength","tickWidth","renderGridLine","reverseCrisp","gridLinePath","gridLine","gridPrefix","gridLineWidth","gridLineColor","dashStyle","dashstyle","gridGroup","getPlotLinePath","renderMark","tickPrefix","mark","isNewMark","isXAxis","tickColor","axisGroup","renderLabel","showFirstLabel","showLastLabel","isRadial","render","isActive","Axis","endOnTick","minPadding","maxPadding","minorTickLength","minorTickPosition","startOfWeek","startOnTick","tickmarkPlacement","tickPixelInterval","tickPosition","minorGridLineColor","minorGridLineWidth","minorTickColor","lineColor","lineWidth","defaultYAxisOptions","stackLabels","formatter","defaultLeftAxisOptions","defaultRightAxisOptions","defaultBottomAxisOptions","defaultTopAxisOptions","userOptions","isX","isZAxis","coll","defaultLabelFormatter","minPixelPadding","zoomEnabled","hasNames","plotLinesAndBandsGroups","positiveValuesOnly","allowNegativeLog","isLinked","linkedTo","labelEdge","minorTicks","plotLinesAndBands","alternateBands","minRange","userMinRange","maxZoom","stacks","oldStacks","stacksTouched","crosshair","crosshairs","axes","xAxis","linearToLogConverter","val2lin","log2lin","lin2val","numSymMagnitude","numericSymbolMagnitude","formatOption","numericSymbolDetector","tickInterval","getSeriesExtremes","hasVisibleSeries","dataMin","dataMax","softThreshold","buildStacks","xData","seriesDataMin","seriesDataMax","seriesOptions","backwards","cvsCoord","handleLog","pointPlacement","returnValue","linkedParent","cvsOffset","localA","oldTransA","localMin","oldMin","doPostTranslate","isOrdinal","isBroken","sector","toPixels","paneCoordinates","toValue","pixel","translatedValue","axisLeft","axisTop","cWidth","between","getLinearTickPositions","lastPos","roundedMin","roundedMax","single","getMinorTickPositions","minorTickInterval","minorTickPositions","pointRangePadding","paddedTicks","getLogTickPositions","getTimeTicks","normalizeTimeTickInterval","trimTicks","adjustForMinRange","zoomOffset","spaceAvailable","closestDataRange","loopLength","minArgs","maxArgs","xIncrement","getClosest","seriesClosest","closestPointRange","noSharedTooltip","nameToX","explicitCategories","nameX","requireSorting","uniqueNames","autoIncrement","updateNames","isDirtyData","processData","generatePoints","setAxisTranslation","saveOld","ordinalCorrection","pointRange","axisPointRange","minPointOffset","hasCategories","seriesPointRange","ordinalSlope","translationSlope","staticScale","minFromRange","setTickInterval","secondPass","linkedParentExtremes","minTickInterval","thresholdMin","thresholdMax","hardMin","hardMax","tickIntervalOption","tickPixelIntervalOption","getTickAmount","beforePadding","usePercentage","softMin","softMax","ceiling","tickAmount","oldMax","beforeSetTickPositions","postProcessTickInterval","unsquish","setTickPositions","tickPositionsOption","tickPositioner","units","ordinalPositions","adjustTickAmount","alignToOthers","hasOther","others","alignTicks","otherOptions","pane","finalTickAmt","currentTickAmount","setScale","isDirtyAxisLength","oldAxisLength","setAxisSize","isDirty","forceRedraw","oldUserMin","oldUserMax","resetStacks","cleanStacks","newMin","newMax","serie","kdTree","eventArgs","allowZoomOutside","displayBtn","trigger","plotWidth","plotHeight","plotTop","plotLeft","percentRegex","getThreshold","realMin","realMax","autoLabelAlign","labelMetrics","newTickInterval","slotSize","rotationOption","bestScore","MAX_VALUE","getStep","spaceNeeded","autoRotationLimit","labelRotation","slotCount","renderUnsquish","innerWidth","textOverflowOption","maxLabelLength","specCss","addTitle","axisTitleOptions","axisTitle","low","middle","high","generateTick","getOffset","showAxis","titleOffsetOption","labelOffsetPadded","lineHeightCorrection","invertedSide","titleOffset","titleMargin","axisOffset","clipOffset","directionFactor","axisParent","showEmpty","gridZIndex","reserveSpace","1","3","renderLine","axisTitleMargin","axisLine","getLinePath","lineLeft","lineTop","getTitlePosition","axisLength","xOption","yOption","alongAxis","offAxis","renderMinorTick","slideInTicks","hasRendered","renderTick","stackLabelOptions","alternateGridColor","overlap","PlotLineOrBand","_addedPlotLB","plotLines","plotBands","plotLineOptions","addPlotBandOrLine","forDestruction","isPlaced","titleXy","renderStackTotals","plotLine","keepProps","keepEvents","plotGroup","stackKey","drawCrosshair","categorized","graphic","plotX","plotY","chartX","chartY","stackY","hideCrosshair","normalizedInterval","minYear","variableDayLength","minDate","makeTime","unitRange","hcSetMilliseconds","hcSetSeconds","hcSetMinutes","hcSetHours","hcSetDate","hcSetMonth","hcSetFullYear","minMonth","minDateDate","minHours","totalRange","unitsOption","minor","positions","_minorAutoInterval","intermediate","break2","filteredTickIntervalOption","totalPixelLength","optionsLabel","isBand","isLine","svgElem","groupAttribs","groupName","getPlotBandPath","flat","toPath","plus","outside","addPlotBand","addPlotLine","removePlotBandOrLine","removePlotBand","removePlotLine","Tooltip","shared","cleanSplit","tt","getLabel","hideTimer","tooltipTimeout","skipAnchor","followPointer","hideDelay","getAnchor","mouseEvent","yAxis","tooltipPos","normalize","plotLow","plotHigh","boxWidth","boxHeight","swapped","preferFarSide","ttBelow","firstDimension","dim","outerSize","innerSize","roomLeft","roomRight","alignedLeft","alignedRight","secondDimension","retVal","swap","temp","defaultFormatter","items","tooltipFooterHeaderFormatter","bodyFormatter","refresh","pointOrPoints","anchor","currentSeries","textConfig","pointConfig","tooltipOptions","getLabelConfig","category","renderSplit","spacingBox","colorIndex","updatePosition","headerHeight","boxes","rightAligned","tooltipLabel","isHeader","owner","colorClass","rank","distribute","positioner","getDateFormat","dateStr","blank","strpos","lastN","getXDateFormat","labelConfig","isFooter","footOrHead","xDateFormat","isDateTime","formatString","pointFormatter","tooltipFormatter","Pointer","runChartClick","pinchDown","lastValidTouch","followTouchMove","setDOMEvents","zoomOption","zoomX","zoomY","zoomType","pinchType","zoomHor","zoomVert","hasZoom","chartPosition","ePos","getCoordinates","getKDPoints","directTouch","kdpointT","kdpoints","enableMouseTracking","searchPoint","findNearestPointBy","isCloserX","distX","isCloser","dist","isAbove","getPointFromEvent","getChartCoordinatesFromPoint","getHoverData","existingHoverPoint","existingHoverSeries","isDirectTouch","hoverPoint","hoverPoints","hoverSeries","searchSeries","useExisting","notSticky","stickyTracking","isHoverPoint","runPointActions","useSharedTooltip","hoverData","onMouseOver","firePointEvent","unDocMouseMove","hoverChartIndex","onDocumentMouseMove","allowMove","tooltipPoints","isCartesian","onMouseOut","hoverX","scaleGroups","seriesAttribs","getPlotBox","markerGroup","dataLabelsGroup","clipBox","dragStart","mouseIsDown","cancelClick","mouseDownX","mouseDownY","clickedInside","selectionMarker","panKey","hasDragged","isInsidePlot","hasCartesianSeries","selectionMarkerFill","panning","pan","drop","hasPinched","runZoom","selectionData","originalEvent","selectionBox","selectionLeft","selectionTop","selectionWidth","selectionHeight","selectionMin","selectionMax","_cursor","onContainerMouseDown","onDocumentMouseUp","onContainerMouseLeave","toElement","onContainerMouseMove","elemClassName","onTrackerMouseOut","onContainerClick","onmousedown","onContainerTouchStart","ontouchmove","onContainerTouchMove","onDocumentTouchEnd","pinchTranslate","pinchTranslateDirection","forcedScale","selectionWH","selectionXY","clipXY","outOfBounds","transformScale","scaleKey","XY","sChartXY","wh","plotLeftTop","singleTouch","touch0Start","touch0Now","touch1Start","touch1Now","pinch","touchesLength","fireClickEvent","runTrackerClick","initiated","absMin","absMax","res","plotBox","hasMoved","PointerEvent","MSPointerEvent","hasPointerEvent","translateMSPointer","wktype","fake","pointerType","MSPOINTER_TYPE_TOUCH","onContainerPointerDown","pointerId","onContainerPointerMove","onDocumentPointerUp","batchMSEvents","Legend","positionCheckboxes","itemMarginTop","initialItemY","maxItemWidth","itemHeight","symbolWidth","pages","isDirtyLegend","isDirtyBox","colorizeItem","legendGroup","legendItem","legendLine","legendSymbol","hiddenColor","textColor","symbolColor","markerOptions","marker","isMarker","pointAttribs","positionItem","ltr","rtl","legendItemPos","_legendItemPos","itemX","itemY","checkbox","legendWidth","destroyItem","destroyItems","getAllItems","scrollOffset","clipHeight","legendHeight","titleHeight","allItems","checkboxOffset","renderTitle","titleOptions","contentGroup","setText","labelFormat","renderItem","itemWidth","horizontal","itemDistance","widthOption","itemMarginBottom","li","isSeries","drawLegendSymbol","createCheckboxForItem","itemExtraWidth","itemClassName","scrollGroup","symbolHeight","setItemEvents","legendItemWidth","legendItemHeight","lastLineHeight","lastItemY","showInLegend","legendItems","legendType","adjustMargins","alignment","floating","alignments","legendIndex","isResizing","lastY","optionsY","alignTop","spaceHeight","maxHeight","navOptions","arrowSize","nav","clipToHeight","currentPage","fullHeight","up","scroll","pager","down","scrollBy","pageCount","LegendSymbolMixin","drawRectangle","symbolRadius","drawLineMarker","generalRadius","legendItemGroup","verticalCenter","runPositionItem","getArgs","userPlotOptions","optionsChart","chartEvents","showAxes","pointCount","colorCounter","symbolCounter","firstRender","initSeries","Constr","orderSeries","fromIndex","hasStackedSeries","hasDirtyStacks","redrawLegend","isHiddenChart","afterRedraw","setResponsive","temporaryDisplay","layOutTitles","stacking","updateTotals","getStacks","getMargins","extKey","drawChartBox","itemById","getAxes","optionsArray","xAxisOptions","yAxisOptions","axisOptions","getSelectedPoints","selected","getSelectedSeries","setTitle","subtitleOptions","chartTitleOptions","chartSubtitleOptions","isStock","requiresDirtyBox","titleSize","getChartSize","heightOption","containerWidth","containerHeight","revert","tempStyle","hcOrigStyle","setClassName","getContainer","oldChartIndex","Ren","containerStyle","containerId","getElementById","skipClone","skipAxes","resetMargins","extraMargin","extraTopMargin","getAxisMargins","setChartSize","reflow","hasUserWidth","reflowTimeout","initReflow","unbind","clipX","clipY","plotBorderWidth","clipOffsetSide","marginRight","marginBottom","plotSizeX","plotSizeY","sideName","chartBorderWidth","mgn","bgAttr","chartBackground","plotBackground","plotBorder","plotBGImage","chartBackgroundColor","plotBackgroundColor","plotBackgroundImage","verb","plotShadow","propFromSeries","klass","linkSeries","chartSeries","linkedSeries","renderSeries","renderLabels","tempWidth","tempHeight","redoHorizontal","redoVertical","seriesGroup","addCredits","mapCredits","scroller","isReadyToRender","serieOptions","colorCount","applyOptions","colorByPoint","pointValKey","optionsToObject","isNull","isValid","firstItemType","pointArrayMap","valueCount","dataLabels","_hasPointLabels","_hasPointMarkers","getClassName","zone","getZone","zones","zoneAxis","dataLabel","destroyElements","percentage","stackTotal","seriesTooltipOptions","valueDecimals","valuePrefix","valueSuffix","importEvents","allowPointSelect","ctrlKey","metaKey","Series","radiusPlus","lineWidthPlus","fillColor","cropThreshold","halo","turboThreshold","sorted","axisTypes","parallelArrays","lastSeries","bindAxes","getColor","getSymbol","setData","_i","collection","indexOption","AXIS","optionalAxis","updateParallelArrays","toYData","pointInterval","pointIntervalUnit","pointStart","itemOptions","typeOptions","negativeColor","negativeFillColor","getCyclic","defaults","setting","indexName","counterName","seriesMarkerOption","updatePoints","dataLength","pt","oldData","oldDataLength","firstPoint","yData","cropped","hasGroupedData","croppedData","xExtremes","processedXData","processedYData","cropStart","getExtremesFromAll","forceCrop","cropData","cropEnd","cropShoulder","dataOptions","PointClass","processedDataLength","dataGroup","groupMap","yDataLength","validValue","activeYData","activeCounter","stackedYData","lastPlotX","stackIndicator","hasModifyValue","modifyValue","dynamicallyPlaced","stackThreshold","startFromThreshold","closestPointRangePx","pointStack","stackValues","xValue","yValue","yBottom","negStacks","getStackIndicator","setOffset","pointXOffset","barW","getValidPoints","insideOnly","setClip","seriesClipBox","sharedClipKey","markerClipRect","afterAnimate","drawPoints","pointMarkerOptions","hasPointMarker","markerAttribs","seriesMarkerOptions","specialGroup","globallyEnabled","hasImage","seriesStateOptions","pointStateOptions","pointOptions","pointColorOption","pointColor","zoneColor","issue134","animationTimeout","survive","getGraphPath","nullsAsZeroes","connectCliffs","gap","graphPath","xMap","connectNulls","pathToPoint","lastPoint","leftCliff","rightCliff","getPointSpline","drawGraph","gappedPath","graphKey","graph","fillGraph","linecap","applyZones","translatedFrom","translatedTo","clipAttr","extremes","pxRange","pxPosMin","pxPosMax","clips","chartSizeMax","ignoreZones","invertGroups","remover","setInvert","animDuration","chartSeriesGroup","drawDataLabels","drawTracker","wasDirty","kdAxisArray","compareX","searchKDTree","buildKDTree","buildingKdTree","dimensions","_kdtree","kdNow","kdX","kdY","kdComparer","kdDimensions","_search","search","tdist","sideA","sideB","nPoint1","nPoint2","StackItem","isNegative","stackOption","xOffset","xWidth","neg","yZero","stackBox","crop","axisSeries","reversedStacks","setStackedPoints","setStackCliffs","setPercentStacks","stackTotalGroup","touched","cum","pointKey","negKey","singleStacks","pointExtremes","totalFactor","addSeries","addAxis","showLoading","loadingDiv","loadingOptions","setLoadingSize","loadingSpan","loadingShown","showDuration","hideLoading","hideDuration","propsRequireDirtyBox","propsRequireUpdateSeries","updateAllAxes","updateAllSeries","newWidth","newHeight","adders","newOptions","setSubtitle","runEvent","fixedBox","removePoint","addPoint","isInTheMiddle","withEvent","oldOptions","oldType","newType","proto","preserve","setCategories","getStackPoints","visibleSeries","pointMap","seriesIndex","yAxisSeries","seriesLength","upOrDown","stackX","idx","stackPoint","stackedValues","nullName","cliffName","cliff","otherStack","topPath","bottomPath","areaPath","bottomPoints","graphPoints","translatedThreshold","addDummyPoints","otherI","nullVal","cliffVal","isCliff","doCurve","rectPlotX","areaKey","fillOpacity","shiftUnit","leftContX","leftContY","rightContX","rightContY","otherPoint","lastX","nextX","nextY","correction","smoothing","areaProto","groupPadding","pointPadding","minPointLength","brightness","trackerGroups","otherSeries","getColumnMetrics","reversedXAxis","stackGroups","columnCount","columnIndex","otherYAxis","categoryWidth","pointOffsetWidth","pointWidth","maxPointWidth","columnMetrics","crispCol","fromTop","xCrisp","yCrisp","dense","metrics","seriesBarW","barX","barY","barH","shapeType","shapeArgs","stateOptions","p2o","pointAttrToOptions","strokeOption","strokeWidthOption","animationLimit","takeOrdinalPosition","CenteredSeriesMixin","getCenter","handleSlicingRoom","slicingRoom","slicedOffset","centerOption","smallestSize","ignoreHiddenPoint","column","startAngleRad","startR","finalConnectorOffset","radiusX","radiusY","cumulative","connectorOffset","circ","endAngleRad","labelDistance","getX","maxLabelDistance","slicedTranslation","half","labelPos","groupTranslation","pointAttr","shadowGroup","getTranslate","sortByAngle","toggleSlice","setVisible","vis","sliced","haloPath","overlapping","origBoxes","restBoxes","sortByTarget","posInCompositeBox","generalOptions","defer","dlProcessOptions","connector","dlOptions","contrastColor","alignDataLabel","normRotation","negRotation","forceDL","justify","isLabelJustified","justifyDataLabel","justified","dataLabelWidth","labelHeight","connectorPadding","connectorWidth","seriesCenter","centerY","halves","shortened","_pos","naturalY","sideOverflow","positionsIndex","positionIndex","_attr","verifyDataLabelOverflow","placeDataLabels","connectorColor","connectorPath","softConnector","minSize","newSize","overshoot","dlBox","collectAndHide","collections","dataLabelCollections","allowOverlap","labelrank","hideOverlappingLabels","label1","label2","pos1","pos2","parent1","parent2","w2","h2","oldOpacity","newOpacity","isOld","TrackerMixin","drawTrackerPoint","_hasTracking","drawTrackerGraph","trackByArea","trackerPath","trackerPathLength","tracker","TRACKER_FILL","scatter","activeClass","fnLegendItemClick","browserEvent","checked","defaultChecked","showResetZoom","btnOptions","relativeTo","zoomOut","resetSelection","hasZoomed","displayButton","axisData","doRedraw","spill","mousePos","mouseDown","startPos","halfPointRange","panMin","panMax","flipped","paddedMin","paddedMax","accumulate","loopPoint","hasImportedEvents","haloOptions","newSymbol","normalDisabled","markerStateOptions","stateDisabled","stateMarkerGraphic","pointMarker","hasMarkers","currentSymbol","mouseOver","mouseOut","showOrHide","oldVisibility","currentRuleIds","responsive","ruleIds","currentResponsive","rules","rule","_id","matchResponsiveRule","mergedOptions","ruleId","undoOptions","currentOptions","condition","maxWidth","minWidth","minHeight","getCurrent","curr","module","exports"],"mappings":";0FAAA,sBAAO,CAAC,gBA8IP,KA9Ic,EAAF,SAAWA,GACpB,aA4IA,OA1IiB,SAASC,GACtBA,EAASA,GAAU,GAEnB,IAGIC,EAAQF,EAAGG,MAAMC,cACjBC,EAAML,EAAGM,IAAID,MACZE,YAAYC,IACZC,YAAYD,IAEbE,EAAWV,EAAGM,IAAID,MACjBE,YAAYC,IACZC,YAAYD,IAEbG,EAAMX,EAAGY,OAAOD,MACfE,KAAK,MACLC,OAAM,SAASC,GAAK,OAAOA,EAAE,MAuHlC,OApHA,SAAeC,GACXA,EAAUC,MAAK,SAASC,GAEpB,IAAIC,EAAQ,EACZC,EAAEF,GAAMD,MAAK,SAASI,EAAGC,GACrBH,GAASG,EAAE,MAEfF,EAAEF,GAAMD,MAAK,SAASI,EAAGC,GACrBA,EAAE,GAAKC,KAAKC,MAAOF,EAAE,GAAKH,EAAS,KACnCG,EAAE,GAAKD,KAGX,IAAIf,EAAMN,EAAGyB,OAAOC,MAAMC,UAAU,OAAOT,KAAK,CAACA,IAE7CU,EAAStB,EAAIuB,QAAQC,OAAO,OAAOA,OAAO,KAC9CF,EAAOE,OAAO,KAAKC,KAAK,QAAS,SAC5BA,KAAK,YAAa,oBAClBD,OAAO,QAAQE,KAAK/B,EAAOgC,OACvBF,KAAK,cAAe,QACpBG,MAAM,OAAQ,QAEvBN,EAAOE,OAAO,KAAKC,KAAK,QAAS,SACjCH,EAAOE,OAAO,KAAKC,KAAK,QAAS,UACjCH,EAAOE,OAAO,KAAKC,KAAK,QAAS,eAAeD,OAAO,QAGvDxB,EAAIyB,KAAK,QA3CL,KA2CqBA,KAAK,SA1CzB,KA6CL,IAAII,EAAI7B,EAAImB,OAAO,UACdM,KAAK,YAAa,yBAIvBzB,EAAImB,OAAO,gBACNS,MAAM,OAAQ,QACdH,KAAK,cAAe,UACpBA,KAAK,YAAa,yBAIvB,IAAIK,EAAOD,EAAER,UAAU,QAClBT,KAAKP,EAAIO,IACTW,QAAQC,OAAO,KACXC,KAAK,SAAS,SAAShB,EAAGM,GAAK,MAAO,gBAAkBA,KAEjEe,EAAKN,OAAO,QACPC,KAAK,IAAK1B,GACV6B,MAAM,QAAQ,SAASnB,GAAK,OAAOb,EAAMa,EAAEG,KAAK,OAChDmB,GAAG,aAAa,WACb,IAAIC,EAAUtC,EAAGyB,OAAOC,MAAMR,OAAO,GAAGA,KAAK,GACzCqB,EAAQvC,EAAGyB,OAAOC,MAAMR,OAAO,GAAGA,KAAK,GAC3ClB,EAAGyB,OAAOC,MAAMK,KAAK,IAAKrB,GAC1BJ,EAAImB,OAAO,qBAAqBO,KAAKM,EAAS,KAC9ChC,EAAImB,OAAO,gBAAiBc,EAAO,SAC9BL,MAAM,OAAQ,QACdH,KAAK,cAAe,WAG5BM,GAAG,YAAY,WACZ,IAAIE,EAAQvC,EAAGyB,OAAOC,MAAMR,OAAO,GAAGA,KAAK,GAC3ClB,EAAGyB,OAAOC,MAAMK,KAAK,IAAK1B,GAC1BC,EAAImB,OAAO,qBAAqBO,KAAK,IACrC1B,EAAImB,OAAO,gBAAiBc,EAAO,SAC9BL,MAAM,OAAQ,QACdH,KAAK,cAAe,aAMjC,IAAIS,EAAcZ,EAAOH,OAAO,WAAWE,UAAU,gBAAgBT,KAAKA,GAC1EsB,EAAYX,QACPC,OAAO,KACPC,KAAK,SAAS,SAAShB,EAAGM,GAAK,MAAO,2BAA6BA,KACnEU,KAAK,aAAa,SAAShB,EAAGM,GAAK,MAAO,iBAAsB,GAAJA,EAAQ,OACpEa,MAAM,SAAU,WAChBG,GAAG,aAAa,WACb,IAAIC,EAAUtC,EAAGyB,OAAOC,MAAMR,OAAO,GAAG,GACpCqB,EAAQvC,EAAGyB,OAAOC,MAAMR,OAAO,GAAG,GACtCkB,EAAKX,OAAO,aAAcc,EAAO,SAASR,KAAK,IAAKrB,GACpDJ,EAAImB,OAAO,qBAAqBO,KAAKM,EAAS,KAC9ChC,EAAImB,OAAO,gBAAiBc,EAAO,SAC9BL,MAAM,OAAQ,QACdH,KAAK,cAAe,WAG5BM,GAAG,YAAY,WACZ,IAAIE,EAAQvC,EAAGyB,OAAOC,MAAMR,OAAO,GAAG,GACtCkB,EAAKX,OAAO,aAAcc,EAAO,SAASR,KAAK,IAAK1B,GACpDC,EAAImB,OAAO,qBAAqBO,KAAK,IACrC1B,EAAImB,OAAO,gBAAiBc,EAAO,SAC9BL,MAAM,OAAQ,QACdH,KAAK,cAAe,aAIjCS,EAAYV,OAAO,UACdC,KAAK,KAAM,KACXA,KAAK,KAAM,IACXA,KAAK,IAAK,GACVG,MAAM,QAAQ,SAASnB,GAAK,OAAOb,EAAMa,EAAE,OAEhDyB,EAAYV,OAAO,QACdC,KAAK,IAAK,KACVA,KAAK,IAAK,IACVA,KAAK,cAAe,SACpBG,MAAM,OAAQ,QACdA,MAAM,cAAe,QACrBA,MAAM,YAAY,QAClBF,MAAK,SAASjB,GAAK,OAAOA,EAAE,YAShD,6B,2CCtID,mCAAQ,OAAC,YAAsB,SAAW0B,GACtC,IAAUC,EAA0NC,EAAnNC,EAAUC,EAAaC,EAAgBC,EAAkBC,EAAmBC,EAAQC,EAAUC,EAASC,EAAWC,EAAWC,EAAWC,EAASC,EAAkBC,EAA+BC,EAAlMd,GAAPF,EAa+bD,GAbpbkB,MAAMd,EAAEH,EAAEkB,SAASd,EAAEJ,EAAEmB,YAAYd,EAAEL,EAAEoB,cAAcd,EAAEN,EAAEqB,eAAed,EAAEP,EAAEsB,IAAId,EAAER,EAAEuB,MAAMd,EAAET,EAAEzB,KAAKmC,EAAEV,EAAEwB,OAAOb,EAAE9B,KAAK4C,IAAIb,EAAEc,SAASb,EAAEc,OAAOb,EAAEd,EAAE4B,cAAcb,EAAEf,EAAE6B,SAASC,UAAUC,QAAQf,EAAEhB,EAAEgC,aAAetB,EAAEM,EAAEiB,KAAK,CAACC,WAAW,cAAcC,YAAY,qBAAqBC,aAAa,sBAAsBC,YAAY,wBAAwBC,YAAY,4BAA4BC,mBAAmB,uBAAuBvB,EAAEwB,WAAW,CAACC,UAAU,CAACC,OAAO,oBACneC,WAAW,UAAUC,QAAQ,SAASC,cAAc,CAACD,QAAQ,SAASD,WAAW,OAAOnF,MAAM,UAAUsF,SAAShC,EAAE,OAAO,QAAQiC,mBAAmB,CAACJ,WAAW,UAAUnF,MAAM,WAAWwF,cAAc,CAACC,WAAW,UAAUC,WAAW,GAAGC,aAAa,OAAOC,kBAAkB,EAAEC,QAAQ,KAAKC,QAAQ,KAAKC,MAAM,QAAQC,cAAc,EAAEC,OAAO,GAAGC,MAAM,CAACC,KAAK,QAAQC,OAAO,QAAQC,cAAc,MAAMC,MAAM,KAAK9C,EAAE+C,UAAU,CAACC,KAAK,YAAYC,IAAI,gCAAgCC,QAAQ,CAACC,cAAc,CAACC,cAAc,yBAClgBC,OAAO,OAAOC,UAAU,qBAAqBC,UAAU,CAAC,CAACC,QAAQ,aAAaC,QAAQ,WAAWzF,KAAK0F,UAAU,CAACC,WAAU,GAAI,CAACH,QAAQ,cAAcC,QAAQ,WAAWzF,KAAK4F,gBAAgB,CAACJ,QAAQ,eAAeC,QAAQ,WAAWzF,KAAK4F,YAAY,CAACZ,KAAK,iBAAiB,CAACQ,QAAQ,cAAcC,QAAQ,WAAWzF,KAAK4F,YAAY,CAACZ,KAAK,sBAAsB,CAACQ,QAAQ,cAAcC,QAAQ,WAAWzF,KAAK4F,YAAY,CAACZ,KAAK,wBAAwBhE,EAAE6E,KAAK,SAASC,EAAEC,GAAG,IAAI1G,EAAE2G,EAC3Z,IAAI3G,KADyZ2G,EAAE3E,EAAE,OAAO,CAAC4E,OAAO,OACjfC,OAAOJ,EAAEK,QAAQ,uBAAuB,CAACC,QAAQ,QAAQxE,EAAEyE,MAAeN,EAAE1E,EAAE,QAAQ,CAAC2D,KAAK,SAASsB,KAAKjH,EAAED,MAAM2G,EAAE1G,IAAI,KAAK2G,GAAGA,EAAEO,SAASjF,EAAE0E,IAAItE,EAAER,EAAE4B,UAAU,CAAC0D,OAAO,SAASV,GAAG,IAAWzG,EAAE2G,EAAES,EAAEC,EAAbX,EAAE/F,KAAaS,EAAEe,EAAEuE,EAAEY,QAAQb,GAGuD,OAHhDlE,EAAEgF,kBAAgBhF,EAAEgF,gBAAgB,SAASb,EAAEC,GAAG,OAAOpE,EAAEQ,cAAc4D,KAAIF,EAAEzE,EAAE,MAAM,KAAK,CAACwF,SAAS,WAAWC,IAAI,UAAUhC,MAAMiB,EAAEgB,WAAW,KAAKtC,OAAOsB,EAAEiB,YAAY,MAAMpF,EAAEyE,MAAML,EAAED,EAAEkB,SAASzG,MAAMsE,MAAM4B,EAAEX,EAAEkB,SAASzG,MAAMiE,OAAOuB,EAAEvF,EAAEsE,UAAUmC,aAAazG,EAAE0G,MAAMrC,OAAO,MAAMsC,KAAKpB,IAC7fqB,SAASrB,EAAE,KAAK,IAAIU,EAAEjG,EAAEsE,UAAUuC,cAAc7G,EAAE0G,MAAM1C,QAAQ,MAAM2C,KAAKV,IAAIW,SAASX,EAAE,KAAK,IAAIhF,EAAEjB,EAAE0G,MAAM,CAACI,WAAU,EAAGN,SAASnB,EAAE0B,WAAU,EAAG1C,MAAMkB,EAAEvB,OAAOiC,IAAIjG,EAAEsE,UAAU0C,SAAQ,EAAGhH,EAAEiH,OAAO,GAAGjG,EAAEsE,EAAE2B,QAAO,SAAS3B,IAAGU,EAAEjF,EAAEuE,EAAEY,QAAQ,CAACY,WAAU,EAAGI,cAAa,EAAGC,QAAQ7B,EAAE6B,WAAYC,YAAYpH,EAAEiH,OAAOI,KAAKrB,MAAKpH,EAAE,IAAI2B,EAAEiB,MAAMxB,EAAEsF,EAAEgC,UAAUtG,EAAE,CAAC,QAAQ,UAAS,SAASuE,GAAGvE,EAAEsE,EAAEC,IAAG,SAASD,EAAED,GAAG,IAAIrF,EAAEpB,EAAE2G,GAAGF,GAAqBY,GAAlB1F,EAAE+E,EAAEiC,eAAkBC,QAAQjH,EAAEA,EAAEkH,QAAQzH,SAAQ,IAAJiG,QAAgB,IAAJ1F,IAAaP,EAAE0H,YAAYzB,EACrf1F,GAAE,GAAG,SAAQgF,EAAE3G,EAAE+I,UAAUC,UAAU5H,EAAE,KAAKpB,EAAEiJ,UAAUhH,EAAEwE,IAAGE,EAAEA,EAAEuC,QAAQ,kBAAkB,IAAIA,QAAQ,oBAAoB,IAAIA,QAAQ,sBAAsB,IAAIA,QAAQ,wBAAwB,IAAIA,QAAQ,eAAe,SAASA,QAAQ,QAAQ,oDAAoDA,QAAQ,UAAU,gBAAgBA,QAAQ,KAAK,KAAKA,QAAQ,cAAc,UAAUA,QAAQ,UAAU,KAAKA,QAAQ,SAAS,KAAKA,QAAQ,SAAS,WAAWA,QAAQ,mBAAmB,eAAeA,QAAQ,kBACxf,cAAcA,QAAQ,0BAA0B,qBAAqBA,QAAQ,gBAAgB,WAAWA,QAAQ,mBAAmB,cAAcA,QAAQ,eAAe,KAAKA,QAAQ,gBAAgB,MAAMA,QAAQ,oBAAmB,SAASxC,GAAG,OAAOA,EAAEyC,kBAA2BD,QAAQ,mCAAmC,MAAMA,QAAQ,UAAU,MAAM3C,YAAY,SAASE,EAAEC,GAAOD,EAAEA,GAAG,GAAT,IAAYzG,EAAEW,KAAK2G,QAAQ5B,UAAU1F,EAAEW,KAAKwG,OAAOhF,EAAE,CAAC2F,MAAM,CAACsB,aAAa,IAAIpJ,EAAEqJ,aAAa3C,EAAE,CAAChB,UAAU,CAACmC,YAAYpB,EAAEoB,aAClf7H,EAAE6H,YAAYI,aAAaxB,EAAEwB,cAAcjI,EAAEiI,iBAAiBxB,EAAEtE,EAAExB,KAAK2G,QAAQ5B,UAAUe,GAAG9E,EAAE6E,KAAKC,EAAEb,IAAI,CAAC0D,SAAS7C,EAAE6C,UAAU,QAAQ3D,KAAKc,EAAEd,KAAKF,MAAMgB,EAAEhB,OAAO,EAAErG,MAAMqH,EAAErH,OAAO,EAAEG,IAAIS,KAAKqG,MAAM,WAAW,IAAII,EAAE9F,KAAK+F,EAAED,EAAEsC,UAAU/I,EAAE,GAAG2G,EAAED,EAAE6C,WAAW5H,EAAEY,EAAEyE,KAAKK,EAAE1F,EAAE6H,WAAe/C,EAAEgD,aAAWhD,EAAEgD,YAAW,EAAGrH,EAAEiF,GAAE,SAASX,EAAEC,GAAmB,IAAbD,EAAEgD,WAAa1J,EAAE2G,GAAGD,EAAEvF,MAAM4F,QAAQL,EAAEvF,MAAM4F,QAAQ,WAASpF,EAAEgI,YAAYjD,GAAGlE,EAAEoH,QAAQpH,EAAE6D,QAAQwD,YAAW,WAAWlD,EAAEgD,YAAYjD,GAAGtE,EAAEiF,GAAE,SAASX,EAAEC,GACle,IADweD,EAAEgD,WACxehD,EAAEvF,MAAM4F,QAAQ/G,EAAE2G,OAAKF,EAAEgD,YAAW,IAAI,OAAMK,YAAY,SAASrD,EAAEC,EAAE1G,EAAE2G,EAAEhF,EAAE0F,EAAEjG,GAAG,IAAgHb,EAAEwJ,EAAE9H,EAAhH+H,EAAErJ,KAAK4B,EAAEyH,EAAE1C,QAAQnD,WAAW8F,EAAE1H,EAAEiC,cAAc0F,EAAEF,EAAEtC,WAAWyC,EAAEH,EAAErC,YAAYxF,EAAE,SAASsE,EAAEnG,EAAE0J,EAAE7H,GAAGiI,EAAE9H,EAAEX,EAAE0F,GAAa/G,IAAE0J,EAAE7H,GAAG7B,EAAE0B,EAAE,MAAM,CAACqI,UAAU5D,GAAG,CAACe,SAAS,WAAW8C,OAAO,IAAI/F,QAAQ6F,EAAE,MAAMJ,EAAEjB,WAAWxI,EAAEyB,EAAE,MAAM,KAAKK,EAAE,CAACkI,aAAa,oBAAoBC,gBAAgB,oBAAoBC,UAAU,qBAAqBlI,EAAE6B,WAAW9D,GAAGyJ,EAAE,WAAW7H,EAAE5B,EAAE,CAACyG,QAAQ,SAAS3F,GAAGA,EAAEsJ,SAAS,GAAGV,EAAEW,UAAS,GAAI7I,EAAExB,EACrf,cAAa,WAAW2B,EAAE4H,WAAWE,EAAE,QAAOjI,EAAExB,EAAE,cAAa,WAAWsK,aAAa3I,MAAKH,EAAEuB,SAAS,WAAU,SAASqD,GAAGsD,EAAEa,QAAQC,QAAQpE,EAAEqE,OAAOtE,IAAIsD,OAAM3H,EAAEsE,GAAE,SAASA,GAAG,GAAGA,EAAE,CAAC,IAAIC,EAAED,EAAEJ,UAAUtE,EAAE,KAAK,KAAK,KAAKzB,GAAGyB,EAAE,MAAM,CAACgJ,YAAY,WAAW9I,EAAEvB,KAAK4B,EAAEmC,qBAAqBuG,WAAW,WAAW/I,EAAEvB,KAAKsJ,IAAI7D,QAAQ,WAAW2D,IAAIrD,EAAEN,QAAQ8E,MAAMlB,EAAEmB,YAAYnC,UAAUtC,EAAEzF,MAAM+I,EAAE1C,QAAQ1D,KAAK8C,EAAEP,UAAU9D,EAAE,CAAC+I,OAAO,WAAWnB,GAAG1J,GAAGyJ,EAAEqB,kBAAkB5C,KAAK9B,OAAMqD,EAAEqB,kBAAkB5C,KAAKlI,EAAED,GACpf0J,EAAEsB,gBAAgBhL,EAAEiL,YAAYvB,EAAEwB,iBAAiBlL,EAAEmL,cAAa/E,EAAE,CAACK,QAAQ,SAAS/G,EAAEgK,EAAEsB,gBAAgBpB,EAAExD,EAAEgF,MAAMxB,EAAElK,EAAE2B,EAAEyI,EAAE,KAAK1D,EAAEiF,KAAK3L,EAAEoK,EAAE,KAAKzD,EAAEU,EAAE2C,EAAEwB,iBAAiBrB,GAAkC,QAA/B/I,EAAEwK,aAAapG,cAAsBkB,EAAEmF,OAAO1B,EAAExD,EAAEyD,EAAE,KAAK1D,EAAEe,IAAId,EAAEU,EAAE+C,EAAE,KAAKlI,EAAE5B,EAAEoG,GAAGsD,EAAEW,UAAS,GAAImB,UAAU,SAASrF,GAAG,IAA4FrF,EAAE4I,EAA1FtD,EAAE/F,KAAKX,EAAE0G,EAAEqF,SAASpF,EAAExE,EAAEuE,EAAEY,QAAQnD,WAAWQ,cAAc8B,GAAGlE,EAAEoE,EAAEP,QAAQiB,EAAEV,EAAET,UAAclE,EAAE,CAACuD,OAAOoB,EAAE7B,aAAaQ,KAAKqB,EAAE/B,YAAYqF,EAAEtD,EAAE9B,YAAY,GACna,GAD0a6B,EAAEsF,WAAStF,EAAEsF,SAAS,GAAMtF,EAAE2E,oBAAkB3E,EAAE2E,kBACtf,GAAG3E,EAAEuF,kBAAkB,KAAkB,IAAZtF,EAAEyB,QAAa,CAAC,IAAoD9H,EAAhD4J,EAAEvD,EAAEtB,MAAiBpD,GAAXkI,EAAED,EAAEgC,SAAY/B,EAAEgC,MAAMhC,EAAEA,GAAGA,EAAEzJ,cAAgBwJ,EAAEgC,OAAO3J,EAAEjC,EAAE,WAAWiC,EAAE2I,MAAMxE,EAAEyE,YAAY9D,IAAI/G,EAAE,WAAWoG,EAAEoD,YAAYE,EAAEjE,cAAcsB,EAAE2C,EAAEoC,WAAWpC,EAAEqC,WAAWrC,EAAEvE,MAAMuE,EAAE5E,OAAO4E,GAAGA,EAAEU,SAAS,KAAK/D,EAAE1F,MAAM0F,EAAEX,OAAOkE,EAAEoC,YAAY3K,EAAE4K,KAAKrC,EAAEoC,YAAY,IAAI3F,EAAE1F,MAAMoB,EAAE6H,EAAE,CAACzE,MAAMkB,EAAElB,MAAML,OAAOuB,EAAEvB,OAAOb,QAAQ,KAAIyF,EAAEhK,EAAEwM,OAAO7F,EAAE1F,KAAK,EAAE,EAAEX,EAAE4J,EAAEjI,EAAEkI,GAAGnJ,KAAK,CAACE,MAAMwF,EAAEY,QAAQ1D,KAAK+C,EAAEV,WAAW,iBAAiB,WAAYF,cAAcU,EAAEV,eAC1e,mBAAmBW,EAAEsF,WAAWrF,EAAEX,SAAS5E,EAAEpB,EAAEgG,OAAOW,EAAEX,OAAOW,EAAE3B,QAAQiF,EAAE,EAAEtD,EAAE1B,QAAQgF,EAAE,EAAEA,EAAEA,GAAGjJ,KAAKqB,EAAEL,EAAE,CAAC,eAAe2E,EAAE5B,mBAAmB,EAAEuF,OAAO,KAAKmC,IAAIzC,IAAIA,EAAEyC,MAAMvH,MAAM7C,EAAEsE,EAAE,CAAClB,MAAMuE,EAAEvE,MAAM9C,EAAEhB,EAAE4K,KAAK5F,EAAEhE,EAAEf,MAAK,EAAG,cAAcA,IAAIoI,EAAEvE,MAAMkB,EAAExB,gBAA0B,UAAVwB,EAAEzB,OAAiB,EAAE,GAAGwB,EAAEuF,kBAAkBxD,KAAKuB,EAAE5I,KAAKsL,cAAc,SAASjG,GAAG,IAAeC,EAAE1G,EAAE,IAAfyG,EAAEA,EAAEsE,OAAerE,EAAE,EAAEA,EAAED,EAAEwF,kBAAkBU,OAAOjG,KAAO1G,EAAEyG,EAAEwF,kBAAkBvF,MAAG1G,EAAEoG,QAAQpG,EAAE4M,aAAa,KAAKnG,EAAEwF,kBAAkBvF,GAAG1G,EAAEiJ,WAAU,IAAIvC,EACrf,EAAEA,EAAED,EAAE4E,kBAAkBsB,OAAOjG,IAAI1G,EAAEyG,EAAE4E,kBAAkB3E,GAAG3E,EAAE/B,EAAE,cAAcyG,EAAE4E,kBAAkB3E,GAAG1G,EAAEiL,WAAWjL,EAAEgL,YAAYhL,EAAE4M,aAAa5M,EAAEoG,QAAQ,KAAKnE,EAAEjC,MAAM0C,EAAEmK,KAAK,SAASpG,EAAEC,EAAE1G,EAAE2G,GAAG,MAAM,CAAC,IAAIF,EAAEC,EAAE,IAAI,IAAID,EAAEzG,EAAE0G,EAAE,IAAI,IAAID,EAAEC,EAAEC,EAAE,EAAE,GAAI,IAAIF,EAAEzG,EAAE0G,EAAEC,EAAE,EAAE,GAAI,IAAIF,EAAEC,EAAEC,EAAE,IAAI,IAAIF,EAAEzG,EAAE0G,EAAEC,EAAE,MAAM9E,EAAE4B,UAAUqJ,UAAUrE,MAAK,SAAShC,GAAG,IAAIC,EAAE1G,EAAEyG,EAAEa,QAAQ5B,UAAUiB,EAAE3G,EAAE6F,QAAY,GAAJjE,EAAE,GAAiB,IAAZ5B,EAAEoI,QAAa,CAAC,IAAI1B,KAAKC,EAAEF,EAAEqF,UAAUnF,EAAED,IAAI5E,EAAE2E,EAAE,UAAUA,EAAEiG,qBACxb,8B,sBCvBD,uBAgCC,KAhCU,EAAF,WACL,aAEA,MAAO,CACH,WAAc,SAASzF,EAAM8F,KAI7B,iBAAoB,SAASnH,KAM7B,UAAa,SAASoH,EAAOD,KAO7B,WAAc,SAASE,GAEnB,IAAIC,EAAOvM,KACXN,EAAE,mCAAoC4M,GAAKE,OAAM,SAASnD,GACtDkD,EAAKE,WAAW/M,EAAE2J,EAAEqD,eAAelN,KAAK,aAE5CE,EAAE,mBAAoB4M,GAAK/F,QAAO,SAAS8C,GACvCkD,EAAKE,WAAW/M,EAAE2J,EAAEqD,eAAelN,KAAK,gBAIvD,QAhCM,OAgCN,e,8CChCD,sBAAO,CAAC,UAAwB,gBA+F/B,KA/FsC,EAAF,SAAYmN,EAAYrO,GACzD,aACA,IAAIsO,EAAe,CACnB,OAAsB,SAASA,GAC3B,IAAIC,EAAsBD,EAAaE,6BAA+BF,EAAaG,yBAC/EC,EAAeJ,EAAaK,qBAAuBL,EAAaM,uBAChEC,EAAkBP,EAAaQ,6BAA+BR,EAAaS,4BAC3EC,EAAS,CACT,KAAQ,CACJ,GAAM,yBACN,MAAS,OACT,KAAQ,CACJ,CAAC,OAAQV,EAAaW,mBACtB,CAAC,QAASX,EAAaY,oBACvB,CAAC,QAASZ,EAAaa,oBACvB,CAAC,QAASb,EAAac,oBACvB,CAAC,QAASd,EAAae,oBACvB,CAAC,QAASf,EAAagB,oBACvB,CAAC,MAAOhB,EAAaiB,wBAG7B,cAAiB,CACb,GAAM,kCACN,MAAS,gBACT,KAAQ,CACJ,CAAC,SAAUjB,EAAaE,6BAA+B,GAAyB,MAChF,CAAC,KAAMF,EAAaG,yBAA2B,GAAyB,QAGhF,UAAa,CACT,GAAM,8BACN,MAAS,sBACT,KAAQ,CACJ,CAAC,QAASH,EAAakB,uBACvB,CAAC,UAAWlB,EAAamB,wBACzB,CAAC,UAAWnB,EAAaoB,wBACzB,CAAC,WAAYpB,EAAaqB,yBAC1B,CAAC,YAAarB,EAAasB,0BAC3B,CAAC,QAAStB,EAAauB,4BAG/B,UAAa,CACT,GAAM,8BACN,MAAS,YACT,KAAQ,CACJ,CAAC,mBAAoBvB,EAAawB,+BAClC,CAAC,aAAcxB,EAAayB,yBAC5B,CAAC,eAAgBzB,EAAa0B,0BAC9B,CAAC,mBAAoB1B,EAAa2B,8BAClC,CAAC,kBAAmB3B,EAAa4B,+BAGzC,OAAU,CACN,GAAM,2BACN,MAAS,SACT,KAAQ,CACJ,CAAC,OAAQ5B,EAAaK,qBAAuB,GAAkB,MAC/D,CAAC,SAAUL,EAAaM,uBAAyB,GAAkB,QAG3E,UAAa,CACT,GAAM,8BACN,MAAS,UACT,KAAQ,CACJ,CAAC,MAAON,EAAaQ,6BAA+B,GAAqB,MACzE,CAAC,KAAMR,EAAaS,4BAA8B,GAAqB,SAKnF,IAAI,IAAIoB,KAAanB,EACjB,GAAIA,EAAOoB,eAAeD,GAAY,CAClC,IAAItH,EAAQmG,EAAOmB,GACfE,GAAU,EACd,IAAI,IAAIC,KAAWzH,EAAM3H,KACrB,GAAG2H,EAAM3H,KAAKoP,GAAS,GAAG,CACtBD,GAAU,EACV,MAGJA,GACAxH,EAAM0H,MAAQlC,EAAW,CAAEpM,MAAO4G,EAAM5G,QAExCjC,EAAGyB,OAAOL,EAAE,IAAKyH,EAAM2H,IAAIC,IAAI,IAC1BC,MAAM7H,EAAM3H,MACZyP,KAAK9H,EAAM0H,QAIhBnP,EAAE,IAAMyH,EAAM2H,IAAII,SAASC,YAK3C,OAAOvC,GACV,6B,2CC/FD,oBACE,IAAItO,EAAK,CACP8Q,QAAS,UAEPC,EAAgB,GAAGC,MAAOC,EAAW,SAASC,GAChD,OAAOH,EAAcJ,KAAKO,IAExBC,EAAczP,KAAK0C,SACvB,SAASgN,EAAmBC,GAC1B,OAAOA,IAASA,EAAKC,eAAiBD,EAAKjN,UAAYiN,GAAME,gBAE/D,SAASC,EAAUH,GACjB,OAAOA,IAASA,EAAKC,eAAiBD,EAAKC,cAAcG,aAAeJ,EAAKjN,UAAYiN,GAAQA,EAAKI,aAExG,GAAIN,EACF,IACEF,EAASE,EAAYI,gBAAgBhH,YAAY,GAAGE,SACpD,MAAOM,GACPkG,EAAW,SAASC,GAElB,IADA,IAAI7P,EAAI6P,EAAKxD,OAAQgE,EAAQ,IAAIC,MAAMtQ,GAChCA,KAAKqQ,EAAMrQ,GAAK6P,EAAK7P,GAC5B,OAAOqQ,GAOb,GAHKE,KAAKC,MAAKD,KAAKC,IAAM,WACxB,OAAQ,IAAID,OAEVT,EACF,IACEA,EAAYrN,cAAc,OAAO5B,MAAM4P,YAAY,UAAW,EAAG,IACjE,MAAOC,GACP,IAAIC,EAAuBtQ,KAAKuQ,QAAQzN,UAAW0N,EAA0BF,EAAqBG,aAAcC,EAA4BJ,EAAqBK,eAAgBC,EAAqB5Q,KAAK6Q,oBAAoB/N,UAAWgO,EAAuBF,EAAmBR,YACpRE,EAAqBG,aAAe,SAASnK,EAAMlH,GACjDoR,EAAwBvB,KAAKjP,KAAMsG,EAAMlH,EAAQ,KAEnDkR,EAAqBK,eAAiB,SAASI,EAAOC,EAAO5R,GAC3DsR,EAA0BzB,KAAKjP,KAAM+Q,EAAOC,EAAO5R,EAAQ,KAE7DwR,EAAmBR,YAAc,SAAS9J,EAAMlH,EAAO6R,GACrDH,EAAqB7B,KAAKjP,KAAMsG,EAAMlH,EAAQ,GAAI6R,IAKxD,SAASC,EAAanL,EAAGC,GACvB,OAAOD,EAAIC,GAAK,EAAID,EAAIC,EAAI,EAAID,GAAKC,EAAI,EAAImL,IA8D/C,SAASC,EAAUpP,GACjB,OAAa,OAANA,EAAamP,KAAOnP,EAE7B,SAASqP,EAAWrP,GAClB,OAAQsP,MAAMtP,GA0DhB,SAASuP,EAAYC,GACnB,MAAO,CACLxG,KAAM,SAASjF,EAAG/D,EAAGyP,EAAIC,GAGvB,IAFIlH,UAAUwB,OAAS,IAAGyF,EAAK,GAC3BjH,UAAUwB,OAAS,IAAG0F,EAAK3L,EAAEiG,QAC1ByF,EAAKC,GAAI,CACd,IAAIC,EAAMF,EAAKC,IAAO,EAClBF,EAAQzL,EAAE4L,GAAM3P,GAAK,EAAGyP,EAAKE,EAAM,EAAQD,EAAKC,EAEtD,OAAOF,GAET1G,MAAO,SAAShF,EAAG/D,EAAGyP,EAAIC,GAGxB,IAFIlH,UAAUwB,OAAS,IAAGyF,EAAK,GAC3BjH,UAAUwB,OAAS,IAAG0F,EAAK3L,EAAEiG,QAC1ByF,EAAKC,GAAI,CACd,IAAIC,EAAMF,EAAKC,IAAO,EAClBF,EAAQzL,EAAE4L,GAAM3P,GAAK,EAAG0P,EAAKC,EAAUF,EAAKE,EAAM,EAExD,OAAOF,IAhJbnT,EAAGsT,UAAYV,EAIf5S,EAAGuT,WAAa,SAAS9L,EAAGC,GAC1B,OAAOA,EAAID,GAAK,EAAIC,EAAID,EAAI,EAAIC,GAAKD,EAAI,EAAIoL,KAE/C7S,EAAGwT,IAAM,SAAS9B,EAAOhP,GACvB,IAA8B+E,EAAGC,EAA7BrG,GAAK,EAAG2B,EAAI0O,EAAMhE,OACtB,GAAyB,IAArBxB,UAAUwB,OAAc,CAC1B,OAASrM,EAAI2B,GAAG,GAAsB,OAAjB0E,EAAIgK,EAAMrQ,KAAeqG,GAAKA,EAAG,CACpDD,EAAIC,EACJ,MAEF,OAASrG,EAAI2B,GAAyB,OAAjB0E,EAAIgK,EAAMrQ,KAAeoG,EAAIC,IAAGD,EAAIC,OACpD,CACL,OAASrG,EAAI2B,GAAG,GAAwC,OAAnC0E,EAAIhF,EAAEiO,KAAKe,EAAOA,EAAMrQ,GAAIA,KAAeqG,GAAKA,EAAG,CACtED,EAAIC,EACJ,MAEF,OAASrG,EAAI2B,GAA2C,OAAnC0E,EAAIhF,EAAEiO,KAAKe,EAAOA,EAAMrQ,GAAIA,KAAeoG,EAAIC,IAAGD,EAAIC,GAE7E,OAAOD,GAETzH,EAAGmE,IAAM,SAASuN,EAAOhP,GACvB,IAA8B+E,EAAGC,EAA7BrG,GAAK,EAAG2B,EAAI0O,EAAMhE,OACtB,GAAyB,IAArBxB,UAAUwB,OAAc,CAC1B,OAASrM,EAAI2B,GAAG,GAAsB,OAAjB0E,EAAIgK,EAAMrQ,KAAeqG,GAAKA,EAAG,CACpDD,EAAIC,EACJ,MAEF,OAASrG,EAAI2B,GAAyB,OAAjB0E,EAAIgK,EAAMrQ,KAAeqG,EAAID,IAAGA,EAAIC,OACpD,CACL,OAASrG,EAAI2B,GAAG,GAAwC,OAAnC0E,EAAIhF,EAAEiO,KAAKe,EAAOA,EAAMrQ,GAAIA,KAAeqG,GAAKA,EAAG,CACtED,EAAIC,EACJ,MAEF,OAASrG,EAAI2B,GAA2C,OAAnC0E,EAAIhF,EAAEiO,KAAKe,EAAOA,EAAMrQ,GAAIA,KAAeqG,EAAID,IAAGA,EAAIC,GAE7E,OAAOD,GAETzH,EAAGyT,OAAS,SAAS/B,EAAOhP,GAC1B,IAA8B+E,EAAGC,EAAGF,EAAhCnG,GAAK,EAAG2B,EAAI0O,EAAMhE,OACtB,GAAyB,IAArBxB,UAAUwB,OAAc,CAC1B,OAASrM,EAAI2B,GAAG,GAAsB,OAAjB0E,EAAIgK,EAAMrQ,KAAeqG,GAAKA,EAAG,CACpDD,EAAID,EAAIE,EACR,MAEF,OAASrG,EAAI2B,GAAyB,OAAjB0E,EAAIgK,EAAMrQ,MACzBoG,EAAIC,IAAGD,EAAIC,GACXF,EAAIE,IAAGF,EAAIE,QAEZ,CACL,OAASrG,EAAI2B,GAAG,GAAwC,OAAnC0E,EAAIhF,EAAEiO,KAAKe,EAAOA,EAAMrQ,GAAIA,KAAeqG,GAAKA,EAAG,CACtED,EAAID,EAAIE,EACR,MAEF,OAASrG,EAAI2B,GAA2C,OAAnC0E,EAAIhF,EAAEiO,KAAKe,EAAOA,EAAMrQ,GAAIA,MAC3CoG,EAAIC,IAAGD,EAAIC,GACXF,EAAIE,IAAGF,EAAIE,IAGnB,MAAO,CAAED,EAAGD,IAQdxH,EAAG0T,IAAM,SAAShC,EAAOhP,GACvB,IAA6B+E,EAAzB0D,EAAI,EAAGnI,EAAI0O,EAAMhE,OAAWrM,GAAK,EACrC,GAAyB,IAArB6K,UAAUwB,OACZ,OAASrM,EAAI2B,GAAO+P,EAAWtL,GAAKiK,EAAMrQ,MAAK8J,GAAK1D,QAEpD,OAASpG,EAAI2B,GAAO+P,EAAWtL,GAAK/E,EAAEiO,KAAKe,EAAOA,EAAMrQ,GAAIA,MAAK8J,GAAK1D,GAExE,OAAO0D,GAETnL,EAAG2T,KAAO,SAASjC,EAAOhP,GACxB,IAA6B+E,EAAzB0D,EAAI,EAAGnI,EAAI0O,EAAMhE,OAAWrM,GAAK,EAAGiC,EAAIN,EAC5C,GAAyB,IAArBkJ,UAAUwB,OACZ,OAASrM,EAAI2B,GAAO+P,EAAWtL,EAAIqL,EAAUpB,EAAMrQ,KAAM8J,GAAK1D,IAAUnE,OAExE,OAASjC,EAAI2B,GAAO+P,EAAWtL,EAAIqL,EAAUpQ,EAAEiO,KAAKe,EAAOA,EAAMrQ,GAAIA,KAAM8J,GAAK1D,IAAUnE,EAE5F,GAAIA,EAAG,OAAO6H,EAAI7H,GAEpBtD,EAAG4T,SAAW,SAASC,EAAQzQ,GAC7B,IAAI0Q,GAAKD,EAAOnG,OAAS,GAAKtK,EAAI,EAAGgF,EAAI7G,KAAKwS,MAAMD,GAAIxS,GAAKuS,EAAOzL,EAAI,GAAI2C,EAAI+I,EAAI1L,EACpF,OAAO2C,EAAIzJ,EAAIyJ,GAAK8I,EAAOzL,GAAK9G,GAAKA,GAEvCtB,EAAGgU,OAAS,SAAStC,EAAOhP,GAC1B,IAAoC+E,EAAhCwM,EAAU,GAAIjR,EAAI0O,EAAMhE,OAAWrM,GAAK,EAC5C,GAAyB,IAArB6K,UAAUwB,OACZ,OAASrM,EAAI2B,GAAO+P,EAAWtL,EAAIqL,EAAUpB,EAAMrQ,MAAM4S,EAAQzK,KAAK/B,QAEtE,OAASpG,EAAI2B,GAAO+P,EAAWtL,EAAIqL,EAAUpQ,EAAEiO,KAAKe,EAAOA,EAAMrQ,GAAIA,MAAM4S,EAAQzK,KAAK/B,GAE1F,GAAIwM,EAAQvG,OAAQ,OAAO1N,EAAG4T,SAASK,EAAQpT,KAAK+R,GAAe,KAErE5S,EAAGkU,SAAW,SAASxC,EAAOhP,GAC5B,IAA6B+E,EAAG1G,EAA5BiC,EAAI0O,EAAMhE,OAAQxC,EAAI,EAASC,EAAI,EAAG9J,GAAK,EAAGiC,EAAI,EACtD,GAAyB,IAArB4I,UAAUwB,OACZ,OAASrM,EAAI2B,GACP+P,EAAWtL,EAAIqL,EAAUpB,EAAMrQ,OAGjC8J,IAFApK,EAAI0G,EAAIyD,IAEEzD,GADVyD,GAAKnK,IAAMuC,UAKf,OAASjC,EAAI2B,GACP+P,EAAWtL,EAAIqL,EAAUpQ,EAAEiO,KAAKe,EAAOA,EAAMrQ,GAAIA,OAGnD8J,IAFApK,EAAI0G,EAAIyD,IAEEzD,GADVyD,GAAKnK,IAAMuC,KAKjB,GAAIA,EAAI,EAAG,OAAO6H,GAAK7H,EAAI,IAE7BtD,EAAGmU,UAAY,WACb,IAAI7S,EAAItB,EAAGkU,SAASjI,MAAMvK,KAAMwK,WAChC,OAAO5K,EAAIC,KAAK6S,KAAK9S,GAAKA,GAwB5B,IAAI+S,EAAYpB,EAAYL,GAuC5B,SAAS0B,EAAmBvT,GAC1B,OAAOA,EAAE2M,OAvCX1N,EAAGuU,WAAaF,EAAU3H,KAC1B1M,EAAGwU,OAASxU,EAAGyU,YAAcJ,EAAU5H,MACvCzM,EAAG0U,SAAW,SAAShS,GACrB,OAAOuQ,EAAyB,IAAbvQ,EAAEgL,OAAe,SAAS3M,EAAG2C,GAC9C,OAAOkP,EAAalQ,EAAE3B,GAAI2C,IACxBhB,IAEN1C,EAAG2U,QAAU,SAASjD,EAAOkD,EAAIC,IAC1B3J,EAAIgB,UAAUwB,QAAU,IAC3BmH,EAAKnD,EAAMhE,OACPxC,EAAI,IAAG0J,EAAK,IAGlB,IADA,IAAiB/R,EAAGxB,EAAhB6J,EAAI2J,EAAKD,EACN1J,GACL7J,EAAIE,KAAKuT,SAAW5J,IAAM,EAC1BrI,EAAI6O,EAAMxG,EAAI0J,GAAKlD,EAAMxG,EAAI0J,GAAMlD,EAAMrQ,EAAIuT,GAAKlD,EAAMrQ,EAAIuT,GAAM/R,EAEpE,OAAO6O,GAET1R,EAAG+U,QAAU,SAASrD,EAAOsD,GAE3B,IADA,IAAI3T,EAAI2T,EAAQtH,OAAQuH,EAAW,IAAItD,MAAMtQ,GACtCA,KAAK4T,EAAS5T,GAAKqQ,EAAMsD,EAAQ3T,IACxC,OAAO4T,GAETjV,EAAGkV,MAAQ,SAASxD,GAElB,IADA,IAAIrQ,EAAI,EAAG2B,EAAI0O,EAAMhE,OAAS,EAAOyH,EAAKzD,EAAM,GAAIwD,EAAQ,IAAIvD,MAAM3O,EAAI,EAAI,EAAIA,GAC3E3B,EAAI2B,GAAGkS,EAAM7T,GAAK,CAAO8T,EAAIA,EAAKzD,IAAQrQ,IACjD,OAAO6T,GAETlV,EAAGoV,UAAY,SAASC,GACtB,KAAMrS,EAAIqS,EAAO3H,QAAS,MAAO,GACjC,IAAK,IAAIrM,GAAK,EAAG6J,EAAIlL,EAAGwT,IAAI6B,EAAQf,GAAqBc,EAAY,IAAIzD,MAAMzG,KAAM7J,EAAI6J,GACvF,IAAK,IAAYlI,EAARM,GAAK,EAAMgS,EAAMF,EAAU/T,GAAK,IAAIsQ,MAAM3O,KAAMM,EAAIN,GAC3DsS,EAAIhS,GAAK+R,EAAO/R,GAAGjC,GAGvB,OAAO+T,GAKTpV,EAAGuV,IAAM,WACP,OAAOvV,EAAGoV,UAAUlJ,YAEtBlM,EAAGwV,KAAO,SAASC,GACjB,IAAID,EAAO,GACX,IAAK,IAAIE,KAAOD,EAAKD,EAAKhM,KAAKkM,GAC/B,OAAOF,GAETxV,EAAG6T,OAAS,SAAS4B,GACnB,IAAI5B,EAAS,GACb,IAAK,IAAI6B,KAAOD,EAAK5B,EAAOrK,KAAKiM,EAAIC,IACrC,OAAO7B,GAET7T,EAAG2V,QAAU,SAASF,GACpB,IAAIE,EAAU,GACd,IAAK,IAAID,KAAOD,EAAKE,EAAQnM,KAAK,CAChCkM,IAAKA,EACL5U,MAAO2U,EAAIC,KAEb,OAAOC,GAET3V,EAAGiE,MAAQ,SAAS2R,GAElB,IADA,IAAuB1K,EAAkB2K,EAAQnE,EAA7C1O,EAAI4S,EAAOlI,OAAWrM,GAAK,EAAGiC,EAAI,IAC7BjC,EAAI2B,GAAGM,GAAKsS,EAAOvU,GAAGqM,OAE/B,IADAmI,EAAS,IAAIlE,MAAMrO,KACVN,GAAK,GAGZ,IADAkI,GADAwG,EAAQkE,EAAO5S,IACL0K,SACDxC,GAAK,GACZ2K,IAASvS,GAAKoO,EAAMxG,GAGxB,OAAO2K,GAET,IAAIC,EAAMvU,KAAKuU,IAef,SAASC,EAAsBrS,GAE7B,IADA,IAAIX,EAAI,EACDW,EAAIX,EAAI,GAAGA,GAAK,GACvB,OAAOA,EAET,SAASiT,EAASC,EAAMC,GACtB,IAAK,IAAIR,KAAOQ,EACdC,OAAOC,eAAeH,EAAKzR,UAAWkR,EAAK,CACzC5U,MAAOoV,EAAWR,GAClBW,YAAY,IAkBlB,SAASC,IACP5U,KAAK6U,EAAIJ,OAAOK,OAAO,MA1CzBxW,EAAGyW,MAAQ,SAASC,EAAOC,EAAMC,GAQ/B,GAPI1K,UAAUwB,OAAS,IACrBkJ,EAAO,EACH1K,UAAUwB,OAAS,IACrBiJ,EAAOD,EACPA,EAAQ,KAGPC,EAAOD,GAASE,GAASC,IAAU,MAAM,IAAIC,MAAM,kBACxD,IAA8DxT,EAA1DmT,EAAQ,GAAI1T,EAAIgT,EAAsBD,EAAIc,IAAQvV,GAAK,EAE3D,GADAqV,GAAS3T,EAAG4T,GAAQ5T,GAAG6T,GAAQ7T,GACpB,EAAG,MAAQO,EAAIoT,EAAQE,IAASvV,GAAKsV,GAAMF,EAAMjN,KAAKlG,EAAIP,QAAS,MAAQO,EAAIoT,EAAQE,IAASvV,GAAKsV,GAAMF,EAAMjN,KAAKlG,EAAIP,GACrI,OAAO0T,GAeTzW,EAAGyV,IAAM,SAASsB,EAAQrU,GACxB,IAAI+S,EAAM,IAAIa,EACd,GAAIS,aAAkBT,EACpBS,EAAOC,SAAQ,SAAStB,EAAK5U,GAC3B2U,EAAIwB,IAAIvB,EAAK5U,WAEV,GAAI6Q,MAAMuF,QAAQH,GAAS,CAChC,IAA+B7T,EAA3B7B,GAAK,EAAG2B,EAAI+T,EAAOrJ,OACvB,GAAyB,IAArBxB,UAAUwB,OAAc,OAASrM,EAAI2B,GAAGyS,EAAIwB,IAAI5V,EAAG0V,EAAO1V,SAAU,OAASA,EAAI2B,GAAGyS,EAAIwB,IAAIvU,EAAEiO,KAAKoG,EAAQ7T,EAAI6T,EAAO1V,GAAIA,GAAI6B,QAElI,IAAK,IAAIwS,KAAOqB,EAAQtB,EAAIwB,IAAIvB,EAAKqB,EAAOrB,IAE9C,OAAOD,GAmCT,SAAS0B,EAAczB,GACrB,MA/BiB,cA+BTA,GAAO,KA/B6B,OA+BLA,EAAI,GA/BC,KA+BkCA,EAAMA,EAEtF,SAAS0B,EAAgB1B,GACvB,MAlC4C,QAkCpCA,GAAO,IAAI,GAAqBA,EAAI1E,MAAM,GAAK0E,EAEzD,SAAS2B,EAAW3B,GAClB,OAAOyB,EAAczB,KAAQhU,KAAK6U,EAEpC,SAASe,EAAc5B,GACrB,OAAQA,EAAMyB,EAAczB,MAAShU,KAAK6U,UAAY7U,KAAK6U,EAAEb,GAE/D,SAAS6B,IACP,IAAI/B,EAAO,GACX,IAAK,IAAIE,KAAOhU,KAAK6U,EAAGf,EAAKhM,KAAK4N,EAAgB1B,IAClD,OAAOF,EAET,SAASgC,IACP,IAAIC,EAAO,EACX,IAAK,IAAI/B,KAAOhU,KAAK6U,IAAKkB,EAC1B,OAAOA,EAET,SAASC,IACP,IAAK,IAAIhC,KAAOhU,KAAK6U,EAAG,OAAO,EAC/B,OAAO,EAsET,SAASoB,IACPjW,KAAK6U,EAAIJ,OAAOK,OAAO,MAiBzB,SAASoB,EAAY7W,GACnB,OAAOA,EAOT,SAAS8W,EAAU/L,EAAQgM,EAAQnQ,GACjC,OAAO,WACL,IAAI7G,EAAQ6G,EAAOsE,MAAM6L,EAAQ5L,WACjC,OAAOpL,IAAUgX,EAAShM,EAAShL,GAGvC,SAASiX,EAAgBhB,EAAQ/O,GAC/B,GAAIA,KAAQ+O,EAAQ,OAAO/O,EAC3BA,EAAOA,EAAKgQ,OAAO,GAAGC,cAAgBjQ,EAAKgJ,MAAM,GACjD,IAAK,IAAI3P,EAAI,EAAG2B,EAAIkV,EAAkBxK,OAAQrM,EAAI2B,IAAK3B,EAAG,CACxD,IAAI8W,EAAaD,EAAkB7W,GAAK2G,EACxC,GAAImQ,KAAcpB,EAAQ,OAAOoB,GAhKrCnC,EAASM,EAAQ,CACf8B,IAAKf,EACL5G,IAAK,SAASiF,GACZ,OAAOhU,KAAK6U,EAAEY,EAAczB,KAE9BuB,IAAK,SAASvB,EAAK5U,GACjB,OAAOY,KAAK6U,EAAEY,EAAczB,IAAQ5U,GAEtC+P,OAAQyG,EACR9B,KAAM+B,EACN1D,OAAQ,WACN,IAAIA,EAAS,GACb,IAAK,IAAI6B,KAAOhU,KAAK6U,EAAG1C,EAAOrK,KAAK9H,KAAK6U,EAAEb,IAC3C,OAAO7B,GAET8B,QAAS,WACP,IAAIA,EAAU,GACd,IAAK,IAAID,KAAOhU,KAAK6U,EAAGZ,EAAQnM,KAAK,CACnCkM,IAAK0B,EAAgB1B,GACrB5U,MAAOY,KAAK6U,EAAEb,KAEhB,OAAOC,GAET8B,KAAMD,EACNa,MAAOX,EACPV,QAAS,SAAStU,GAChB,IAAK,IAAIgT,KAAOhU,KAAK6U,EAAG7T,EAAEiO,KAAKjP,KAAM0V,EAAgB1B,GAAMhU,KAAK6U,EAAEb,OA6BtE1V,EAAGsY,KAAO,WACR,IAAyCC,EAAYC,EAAjDF,EAAO,GAAI9C,EAAO,GAAIiD,EAAW,GACrC,SAAShD,EAAIiD,EAAShH,EAAOiH,GAC3B,GAAIA,GAASnD,EAAK9H,OAAQ,OAAO8K,EAASA,EAAO7H,KAAK2H,EAAM5G,GAAS6G,EAAa7G,EAAM7Q,KAAK0X,GAAc7G,EAE3G,IADA,IAAmDkH,EAAU7B,EAAQ8B,EAAoChF,EAArGxS,GAAK,EAAG2B,EAAI0O,EAAMhE,OAAQgI,EAAMF,EAAKmD,KAAoCG,EAAc,IAAIxC,IACtFjV,EAAI2B,IACP6Q,EAASiF,EAAYrI,IAAImI,EAAWlD,EAAIqB,EAASrF,EAAMrQ,MACzDwS,EAAOrK,KAAKuN,GAEZ+B,EAAY7B,IAAI2B,EAAU,CAAE7B,IAehC,OAZI2B,GACF3B,EAAS2B,IACTG,EAAS,SAASD,EAAU/E,GAC1BkD,EAAOE,IAAI2B,EAAUnD,EAAIiD,EAAS7E,EAAQ8E,OAG5C5B,EAAS,GACT8B,EAAS,SAASD,EAAU/E,GAC1BkD,EAAO6B,GAAYnD,EAAIiD,EAAS7E,EAAQ8E,KAG5CG,EAAY9B,QAAQ6B,GACb9B,EAqCT,OAtBAuB,EAAK7C,IAAM,SAAS/D,EAAOgH,GACzB,OAAOjD,EAAIiD,EAAShH,EAAO,IAE7B4G,EAAK3C,QAAU,SAASjE,GACtB,OAjBF,SAASiE,EAAQF,EAAKkD,GACpB,GAAIA,GAASnD,EAAK9H,OAAQ,OAAO+H,EACjC,IAAI/D,EAAQ,GAAIqH,EAAUN,EAASE,KAOnC,OANAlD,EAAIuB,SAAQ,SAAStB,EAAKsD,GACxBtH,EAAMlI,KAAK,CACTkM,IAAKA,EACL7B,OAAQ8B,EAAQqD,EAAQL,QAGrBI,EAAUrH,EAAM7Q,MAAK,SAAS4G,EAAGC,GACtC,OAAOqR,EAAQtR,EAAEiO,IAAKhO,EAAEgO,QACrBhE,EAMEiE,CAAQF,EAAIzV,EAAGyV,IAAK/D,EAAO,GAAI,IAExC4G,EAAK5C,IAAM,SAAS3U,GAElB,OADAyU,EAAKhM,KAAKzI,GACHuX,GAETA,EAAKG,SAAW,SAASQ,GAEvB,OADAR,EAASjD,EAAK9H,OAAS,GAAKuL,EACrBX,GAETA,EAAKC,WAAa,SAASU,GAEzB,OADAV,EAAaU,EACNX,GAETA,EAAKE,OAAS,SAAS9V,GAErB,OADA8V,EAAS9V,EACF4V,GAEFA,GAETtY,EAAGiX,IAAM,SAASvF,GAChB,IAAIuF,EAAM,IAAIU,EACd,GAAIjG,EAAO,IAAK,IAAIrQ,EAAI,EAAG2B,EAAI0O,EAAMhE,OAAQrM,EAAI2B,IAAK3B,EAAG4V,EAAIzJ,IAAIkE,EAAMrQ,IACvE,OAAO4V,GAKTjB,EAAS2B,EAAQ,CACfS,IAAKf,EACL7J,IAAK,SAASkI,GAEZ,OADAhU,KAAK6U,EAAEY,EAAczB,GAAO,MAAO,EAC5BA,GAET7E,OAAQyG,EACRzD,OAAQ0D,EACRE,KAAMD,EACNa,MAAOX,EACPV,QAAS,SAAStU,GAChB,IAAK,IAAIgT,KAAOhU,KAAK6U,EAAG7T,EAAEiO,KAAKjP,KAAM0V,EAAgB1B,OAGzD1V,EAAGkZ,SAAW,GAIdlZ,EAAGmZ,OAAS,SAASrN,EAAQgM,GAE3B,IADA,IAAiCnQ,EAA7BtG,EAAI,EAAG2B,EAAIkJ,UAAUwB,SAChBrM,EAAI2B,GAAG8I,EAAOnE,EAASuE,UAAU7K,IAAMwW,EAAU/L,EAAQgM,EAAQA,EAAOnQ,IACjF,OAAOmE,GAgBT,IAAIoM,EAAoB,CAAE,SAAU,KAAM,MAAO,MAAO,IAAK,KAC7D,SAASkB,KAMT,SAASC,KAeT,SAASC,EAAkBC,GACzB,IAAIC,EAAY,GAAIC,EAAiB,IAAInD,EACzC,SAASoD,IAEP,IADA,IAAyCzO,EAArC9C,EAAIqR,EAAWnY,GAAK,EAAG2B,EAAImF,EAAEuF,SACxBrM,EAAI2B,IAAOiI,EAAI9C,EAAE9G,GAAGgB,KAAI4I,EAAEgB,MAAMvK,KAAMwK,WAC/C,OAAOqN,EAeT,OAbAG,EAAMrX,GAAK,SAAS2F,EAAM2R,GACxB,IAAkCtY,EAA9B4J,EAAIwO,EAAehJ,IAAIzI,GAC3B,OAAIkE,UAAUwB,OAAS,EAAUzC,GAAKA,EAAE5I,IACpC4I,IACFA,EAAE5I,GAAK,KACPmX,EAAYA,EAAUxI,MAAM,EAAG3P,EAAImY,EAAUI,QAAQ3O,IAAI4O,OAAOL,EAAUxI,MAAM3P,EAAI,IACpFoY,EAAe5I,OAAO7I,IAEpB2R,GAAUH,EAAUhQ,KAAKiQ,EAAexC,IAAIjP,EAAM,CACpD3F,GAAIsX,KAECJ,IAEFG,EAGT,SAASI,IACP9Z,EAAG0Z,MAAMK,iBAEX,SAASC,IAEP,IADA,IAAkB7O,EAAdJ,EAAI/K,EAAG0Z,MACJvO,EAAIJ,EAAEkP,aAAalP,EAAII,EAC9B,OAAOJ,EAET,SAASmP,EAAiBpO,GAExB,IADA,IAAIyN,EAAW,IAAIF,EAAehY,EAAI,EAAG2B,EAAIkJ,UAAUwB,SAC9CrM,EAAI2B,GAAGuW,EAASrN,UAAU7K,IAAMiY,EAAkBC,GAa3D,OAZAA,EAASY,GAAK,SAASC,EAAMC,GAC3B,OAAO,SAASC,GACd,IACE,IAAIC,EAAKD,EAAGL,YAAcja,EAAG0Z,MAC7BY,EAAGxO,OAASA,EACZ9L,EAAG0Z,MAAQY,EACXf,EAASe,EAAG5T,MAAMuF,MAAMmO,EAAMC,GAC9B,QACAra,EAAG0Z,MAAQa,KAIVhB,EAlETvZ,EAAGuZ,SAAW,WAEZ,IADA,IAAIA,EAAW,IAAIF,EAAehY,GAAK,EAAG2B,EAAIkJ,UAAUwB,SAC/CrM,EAAI2B,GAAGuW,EAASrN,UAAU7K,IAAMiY,EAAkBC,GAC3D,OAAOA,GAGTF,EAAY7U,UAAUnC,GAAK,SAASqE,EAAMiT,GACxC,IAAItY,EAAIqF,EAAKkT,QAAQ,KAAM5R,EAAO,GAKlC,GAJI3G,GAAK,IACP2G,EAAOtB,EAAKsK,MAAM3P,EAAI,GACtBqF,EAAOA,EAAKsK,MAAM,EAAG3P,IAEnBqF,EAAM,OAAOwF,UAAUwB,OAAS,EAAIhM,KAAKgF,GAAMrE,GAAG2F,GAAQtG,KAAKgF,GAAMrE,GAAG2F,EAAM2R,GAClF,GAAyB,IAArBzN,UAAUwB,OAAc,CAC1B,GAAgB,MAAZiM,EAAkB,IAAKjT,KAAQhF,KAC7BA,KAAK0O,eAAe1J,IAAOhF,KAAKgF,GAAMrE,GAAG2F,EAAM,MAErD,OAAOtG,OAyBX1B,EAAG0Z,MAAQ,KA0BX1Z,EAAGwa,QAAU,SAASrP,GACpB,OAAOA,EAAElB,QAAQwQ,EAAe,SAElC,IAAIA,EAAgB,kCAChBC,EAAc,GAAGC,UAAY,SAAS5D,EAAQvS,GAChDuS,EAAO4D,UAAYnW,GACjB,SAASuS,EAAQvS,GACnB,IAAK,IAAIoW,KAAYpW,EAAWuS,EAAO6D,GAAYpW,EAAUoW,IAE/D,SAASC,EAAaC,GAEpB,OADAJ,EAAYI,EAAQC,GACbD,EAET,IAAIE,EAAY,SAAS7P,EAAGnI,GAC1B,OAAOA,EAAEiY,cAAc9P,IACtB+P,EAAe,SAAS/P,EAAGnI,GAC5B,OAAOA,EAAEmY,iBAAiBhQ,IACzBiQ,EAAmB,SAASpY,EAAGmI,GAChC,IAAIkQ,EAAmBrY,EAAEsY,SAAWtY,EAAE+U,EAAgB/U,EAAG,oBAIzD,OAHAoY,EAAmB,SAASpY,EAAGmI,GAC7B,OAAOkQ,EAAiB1K,KAAK3N,EAAGmI,KAEVnI,EAAGmI,IAEP,mBAAXoQ,SACTP,EAAY,SAAS7P,EAAGnI,GACtB,OAAOuY,OAAOpQ,EAAGnI,GAAG,IAAM,MAE5BkY,EAAeK,OACfH,EAAmBG,OAAOC,iBAE5Bxb,EAAGgB,UAAY,WACb,OAAOhB,EAAGyB,OAAO0P,EAAYI,kBAE/B,IAAIwJ,EAAwB/a,EAAGgB,UAAUwD,UAAY,GAkBrD,SAASiX,EAAsBC,GAC7B,MAA2B,mBAAbA,EAA0BA,EAAW,WACjD,OAAOV,EAAUU,EAAUha,OAgB/B,SAASia,EAAyBD,GAChC,MAA2B,mBAAbA,EAA0BA,EAAW,WACjD,OAAOR,EAAaQ,EAAUha,OArClCqZ,EAAsBtZ,OAAS,SAASia,GACtC,IAAoBE,EAAUC,EAASC,EAAOzK,EAA1C0K,EAAY,GAChBL,EAAWD,EAAsBC,GACjC,IAAK,IAAIpY,GAAK,EAAG4H,EAAIxJ,KAAKgM,SAAUpK,EAAI4H,GAAK,CAC3C6Q,EAAUvS,KAAKoS,EAAW,IAC1BA,EAAStR,YAAcwR,EAAQpa,KAAK4B,IAAIgH,WACxC,IAAK,IAAIjJ,GAAK,EAAG2B,EAAI8Y,EAAMpO,SAAUrM,EAAI2B,IACnCqO,EAAOyK,EAAMza,KACfua,EAASpS,KAAKqS,EAAUH,EAAS/K,KAAKU,EAAMA,EAAK2K,SAAU3a,EAAGiC,IAC1DuY,GAAW,aAAcxK,IAAMwK,EAAQG,SAAW3K,EAAK2K,WAE3DJ,EAASpS,KAAK,MAIpB,OAAOqR,EAAakB,IAOtBhB,EAAsBpZ,UAAY,SAAS+Z,GACzC,IAAoBE,EAAUvK,EAA1B0K,EAAY,GAChBL,EAAWC,EAAyBD,GACpC,IAAK,IAAIpY,GAAK,EAAG4H,EAAIxJ,KAAKgM,SAAUpK,EAAI4H,GACtC,IAAK,IAAI4Q,EAAQpa,KAAK4B,GAAIjC,GAAK,EAAG2B,EAAI8Y,EAAMpO,SAAUrM,EAAI2B,IACpDqO,EAAOyK,EAAMza,MACf0a,EAAUvS,KAAKoS,EAAW3K,EAASyK,EAAS/K,KAAKU,EAAMA,EAAK2K,SAAU3a,EAAGiC,KACzEsY,EAAStR,WAAa+G,GAI5B,OAAOwJ,EAAakB,IAOtB,IAAIE,EAAa,+BACbC,GAAc,CAChB5b,IAAK,6BACL6b,MAAOF,EACPG,MAAO,+BACPC,IAAK,uCACLC,MAAO,iCAyBT,SAASC,GAAkBvU,EAAMlH,GAsB/B,OArBAkH,EAAOhI,EAAGwc,GAAGC,QAAQzU,GAqBL,MAATlH,EAAgBkH,EAAK0K,MAjB5B,WACEhR,KAAKgb,kBAAkB1U,EAAKyK,MAAOzK,EAAK0K,QAJ1C,WACEhR,KAAKib,gBAAgB3U,IAmBsD,mBAAVlH,EAAuBkH,EAAK0K,MAJ/F,WACE,IAAIhP,EAAI5C,EAAMmL,MAAMvK,KAAMwK,WACjB,MAALxI,EAAWhC,KAAKgb,kBAAkB1U,EAAKyK,MAAOzK,EAAK0K,OAAahR,KAAK2Q,eAAerK,EAAKyK,MAAOzK,EAAK0K,MAAOhP,IANlH,WACE,IAAIA,EAAI5C,EAAMmL,MAAMvK,KAAMwK,WACjB,MAALxI,EAAWhC,KAAKib,gBAAgB3U,GAAYtG,KAAKyQ,aAAanK,EAAMtE,IAM6DsE,EAAK0K,MAX5I,WACEhR,KAAK2Q,eAAerK,EAAKyK,MAAOzK,EAAK0K,MAAO5R,IAJ9C,WACEY,KAAKyQ,aAAanK,EAAMlH,IAe5B,SAAS8b,GAAYzR,GACnB,OAAOA,EAAE0R,OAAO5S,QAAQ,OAAQ,KAmBlC,SAAS6S,GAAuB9U,GAC9B,OAAO,IAAI+U,OAAO,aAAe/c,EAAGwa,QAAQxS,GAAQ,aAAc,KAEpE,SAASgV,GAAqBhV,GAC5B,OAAQA,EAAO,IAAI6U,OAAOI,MAAM,SAElC,SAASC,GAAqBlV,EAAMlH,GAElC,IAAIkC,GADJgF,EAAOgV,GAAqBhV,GAAMyN,IAAI0H,KACzBzP,OASb,MAAwB,mBAAV5M,EAJd,WAEE,IADA,IAAIO,GAAK,EAAGqC,EAAI5C,EAAMmL,MAAMvK,KAAMwK,aACzB7K,EAAI2B,GAAGgF,EAAK3G,GAAGK,KAAMgC,IANhC,WAEE,IADA,IAAIrC,GAAK,IACAA,EAAI2B,GAAGgF,EAAK3G,GAAGK,KAAMZ,IAQlC,SAASqc,GAAyBnV,GAChC,IAAIoV,EAAKN,GAAuB9U,GAChC,OAAO,SAASqJ,EAAMvQ,GACpB,GAAI0G,EAAI6J,EAAKgM,UAAW,OAAOvc,EAAQ0G,EAAEgG,IAAIxF,GAAQR,EAAEqJ,OAAO7I,GAC9D,IAAIR,EAAI6J,EAAKiM,aAAa,UAAY,GAClCxc,GACFsc,EAAGG,UAAY,EACVH,EAAGtU,KAAKtB,IAAI6J,EAAKc,aAAa,QAASyK,GAAYpV,EAAI,IAAMQ,KAElEqJ,EAAKc,aAAa,QAASyK,GAAYpV,EAAEyC,QAAQmT,EAAI,QAoB3D,SAASI,GAAmBxV,EAAMlH,EAAO6R,GAWvC,OAAgB,MAAT7R,EAVP,WACEY,KAAKQ,MAAMub,eAAezV,IASwB,mBAAVlH,EAJ1C,WACE,IAAI4C,EAAI5C,EAAMmL,MAAMvK,KAAMwK,WACjB,MAALxI,EAAWhC,KAAKQ,MAAMub,eAAezV,GAAYtG,KAAKQ,MAAM4P,YAAY9J,EAAMtE,EAAGiP,IALvF,WACEjR,KAAKQ,MAAM4P,YAAY9J,EAAMlH,EAAO6R,IAgBxC,SAAS+K,GAAsB1V,EAAMlH,GAWnC,OAAgB,MAATA,EAVP,kBACSY,KAAKsG,IASyC,mBAAVlH,EAJ7C,WACE,IAAI4C,EAAI5C,EAAMmL,MAAMvK,KAAMwK,WACjB,MAALxI,SAAkBhC,KAAKsG,GAAYtG,KAAKsG,GAAQtE,GALtD,WACEhC,KAAKsG,GAAQlH,GAkCjB,SAAS6c,GAAqB3V,GAQ5B,MAAuB,mBAATA,EAAsBA,GAAQA,EAAOhI,EAAGwc,GAAGC,QAAQzU,IAAO0K,MAHxE,WACE,OAAOhR,KAAK4P,cAAchJ,gBAAgBN,EAAKyK,MAAOzK,EAAK0K,QAL7D,WACE,IAAItO,EAAW1C,KAAK4P,cAAesM,EAAYlc,KAAKmc,aACpD,OAAOD,IAAc3B,GAAc7X,EAASmN,gBAAgBsM,eAAiB5B,EAAa7X,EAASN,cAAckE,GAAQ5D,EAASkE,gBAAgBsV,EAAW5V,IAiBjK,SAAS8V,KACP,IAAIlN,EAASlP,KAAK4I,WACdsG,GAAQA,EAAOmN,YAAYrc,MAmFjC,SAASsc,GAAsB9c,GAC7B,MAAO,CACL8a,SAAU9a,GAoBd,SAAS+c,GAAoBvC,GAC3B,OAAO,WACL,OAAON,EAAiB1Z,KAAMga,IAmBlC,SAASwC,GAA4BC,GAEnC,OADKjS,UAAUwB,SAAQyQ,EAAavL,GAC7B,SAASnL,EAAGC,GACjB,OAAOD,GAAKC,EAAIyW,EAAW1W,EAAEuU,SAAUtU,EAAEsU,WAAavU,GAAKC,GAQ/D,SAAS0W,GAAkBtD,EAAQrR,GACjC,IAAK,IAAInG,EAAI,EAAG4H,EAAI4P,EAAOpN,OAAQpK,EAAI4H,EAAG5H,IACxC,IAAK,IAAgD+N,EAA5CyK,EAAQhB,EAAOxX,GAAIjC,EAAI,EAAG2B,EAAI8Y,EAAMpO,OAAcrM,EAAI2B,EAAG3B,KAC5DgQ,EAAOyK,EAAMza,KAAIoI,EAAS4H,EAAMhQ,EAAGiC,GAG3C,OAAOwX,EA0BT,SAASuD,GAAmBrd,GAE1B,OADA0Z,EAAY1Z,EAAWsd,IAChBtd,EAhXThB,EAAGwc,GAAK,CACN+B,OAAQrC,GACRO,QAAS,SAASzU,GAChB,IAAI3G,EAAI2G,EAAK4R,QAAQ,KAAM2E,EAASvW,EAEpC,OADI3G,GAAK,GAAqC,WAA/Bkd,EAASvW,EAAKgJ,MAAM,EAAG3P,MAAiB2G,EAAOA,EAAKgJ,MAAM3P,EAAI,IACtE6a,GAAY9L,eAAemO,GAAU,CAC1C9L,MAAOyJ,GAAYqC,GACnB7L,MAAO1K,GACLA,IAGR+S,EAAsBhZ,KAAO,SAASiG,EAAMlH,GAC1C,GAAIoL,UAAUwB,OAAS,EAAG,CACxB,GAAoB,iBAAT1F,EAAmB,CAC5B,IAAIqJ,EAAO3P,KAAK2P,OAEhB,OADArJ,EAAOhI,EAAGwc,GAAGC,QAAQzU,IACT0K,MAAQrB,EAAKmN,eAAexW,EAAKyK,MAAOzK,EAAK0K,OAASrB,EAAKiM,aAAatV,GAEtF,IAAKlH,KAASkH,EAAMtG,KAAKT,KAAKsb,GAAkBzb,EAAOkH,EAAKlH,KAC5D,OAAOY,KAET,OAAOA,KAAKT,KAAKsb,GAAkBvU,EAAMlH,KA6B3Cia,EAAsB0D,QAAU,SAASzW,EAAMlH,GAC7C,GAAIoL,UAAUwB,OAAS,EAAG,CACxB,GAAoB,iBAAT1F,EAAmB,CAC5B,IAAIqJ,EAAO3P,KAAK2P,OAAQrO,GAAKgF,EAAOgV,GAAqBhV,IAAO0F,OAAQrM,GAAK,EAC7E,GAAIP,EAAQuQ,EAAKgM,WACf,OAAShc,EAAI2B,GAAG,IAAKlC,EAAM4d,SAAS1W,EAAK3G,IAAK,OAAO,OAGrD,IADAP,EAAQuQ,EAAKiM,aAAa,WACjBjc,EAAI2B,GAAG,IAAK8Z,GAAuB9U,EAAK3G,IAAIyH,KAAKhI,GAAQ,OAAO,EAE3E,OAAO,EAET,IAAKA,KAASkH,EAAMtG,KAAKT,KAAKic,GAAqBpc,EAAOkH,EAAKlH,KAC/D,OAAOY,KAET,OAAOA,KAAKT,KAAKic,GAAqBlV,EAAMlH,KAkC9Cia,EAAsB7Y,MAAQ,SAAS8F,EAAMlH,EAAO6R,GAClD,IAAI3P,EAAIkJ,UAAUwB,OAClB,GAAI1K,EAAI,EAAG,CACT,GAAoB,iBAATgF,EAAmB,CAE5B,IAAK2K,KADD3P,EAAI,IAAGlC,EAAQ,IACFkH,EAAMtG,KAAKT,KAAKuc,GAAmB7K,EAAU3K,EAAK2K,GAAW7R,IAC9E,OAAOY,KAET,GAAIsB,EAAI,EAAG,CACT,IAAIqO,EAAO3P,KAAK2P,OAChB,OAAOG,EAAUH,GAAMsN,iBAAiBtN,EAAM,MAAMuN,iBAAiB5W,GAEvE2K,EAAW,GAEb,OAAOjR,KAAKT,KAAKuc,GAAmBxV,EAAMlH,EAAO6R,KAenDoI,EAAsBH,SAAW,SAAS5S,EAAMlH,GAC9C,GAAIoL,UAAUwB,OAAS,EAAG,CACxB,GAAoB,iBAAT1F,EAAmB,OAAOtG,KAAK2P,OAAOrJ,GACjD,IAAKlH,KAASkH,EAAMtG,KAAKT,KAAKyc,GAAsB5c,EAAOkH,EAAKlH,KAChE,OAAOY,KAET,OAAOA,KAAKT,KAAKyc,GAAsB1V,EAAMlH,KAe/Cia,EAAsB/Y,KAAO,SAASlB,GACpC,OAAOoL,UAAUwB,OAAShM,KAAKT,KAAsB,mBAAVH,EAAuB,WAChE,IAAIQ,EAAIR,EAAMmL,MAAMvK,KAAMwK,WAC1BxK,KAAKmd,YAAmB,MAALvd,EAAY,GAAKA,GACzB,MAATR,EAAgB,WAClBY,KAAKmd,YAAc,IACjB,WACFnd,KAAKmd,YAAc/d,IAChBY,KAAK2P,OAAOwN,aAEnB9D,EAAsB+D,KAAO,SAAShe,GACpC,OAAOoL,UAAUwB,OAAShM,KAAKT,KAAsB,mBAAVH,EAAuB,WAChE,IAAIQ,EAAIR,EAAMmL,MAAMvK,KAAMwK,WAC1BxK,KAAKqI,UAAiB,MAALzI,EAAY,GAAKA,GACvB,MAATR,EAAgB,WAClBY,KAAKqI,UAAY,IACf,WACFrI,KAAKqI,UAAYjJ,IACdY,KAAK2P,OAAOtH,WAEnBgR,EAAsBjZ,OAAS,SAASkG,GAEtC,OADAA,EAAO2V,GAAqB3V,GACrBtG,KAAKD,QAAO,WACjB,OAAOC,KAAKgJ,YAAY1C,EAAKiE,MAAMvK,KAAMwK,gBAa7C6O,EAAsBgE,OAAS,SAAS/W,EAAMgX,GAG5C,OAFAhX,EAAO2V,GAAqB3V,GAC5BgX,EAASvD,EAAsBuD,GACxBtd,KAAKD,QAAO,WACjB,OAAOC,KAAKud,aAAajX,EAAKiE,MAAMvK,KAAMwK,WAAY8S,EAAO/S,MAAMvK,KAAMwK,YAAc,UAG3F6O,EAAsBlK,OAAS,WAC7B,OAAOnP,KAAKT,KAAK6c,KAMnB/C,EAAsB7Z,KAAO,SAASJ,EAAO4U,GAC3C,IAA6BoG,EAAOzK,EAAhChQ,GAAK,EAAG2B,EAAItB,KAAKgM,OACrB,IAAKxB,UAAUwB,OAAQ,CAErB,IADA5M,EAAQ,IAAI6Q,MAAM3O,GAAK8Y,EAAQpa,KAAK,IAAIgM,UAC/BrM,EAAI2B,IACPqO,EAAOyK,EAAMza,MACfP,EAAMO,GAAKgQ,EAAK2K,UAGpB,OAAOlb,EAET,SAASoe,EAAKpD,EAAOqD,GACnB,IAAI9d,EAAiJgQ,EAAM+N,EAApJpc,EAAI8Y,EAAMpO,OAAQxC,EAAIiU,EAAUzR,OAAQ2R,EAAK9d,KAAKiS,IAAIxQ,EAAGkI,GAAIoU,EAAc,IAAI3N,MAAMzG,GAAIqU,EAAa,IAAI5N,MAAMzG,GAAIsU,EAAY,IAAI7N,MAAM3O,GACjJ,GAAI0S,EAAK,CACP,IAA6DkD,EAAzD6G,EAAiB,IAAInJ,EAAUoJ,EAAY,IAAI/N,MAAM3O,GACzD,IAAK3B,GAAK,IAAKA,EAAI2B,IACbqO,EAAOyK,EAAMza,MACXoe,EAAerH,IAAIQ,EAAWlD,EAAI/E,KAAKU,EAAMA,EAAK2K,SAAU3a,IAC9Dme,EAAUne,GAAKgQ,EAEfoO,EAAexI,IAAI2B,EAAUvH,GAE/BqO,EAAUre,GAAKuX,GAGnB,IAAKvX,GAAK,IAAKA,EAAI6J,IACXmG,EAAOoO,EAAehP,IAAImI,EAAWlD,EAAI/E,KAAKwO,EAAWC,EAAWD,EAAU9d,GAAIA,MAEpE,IAATgQ,IACTiO,EAAYje,GAAKgQ,EACjBA,EAAK2K,SAAWoD,GAHhBG,EAAWle,GAAK2c,GAAsBoB,GAKxCK,EAAexI,IAAI2B,GAAU,GAE/B,IAAKvX,GAAK,IAAKA,EAAI2B,GACb3B,KAAKqe,IAAkD,IAArCD,EAAehP,IAAIiP,EAAUre,MACjDme,EAAUne,GAAKya,EAAMza,QAGpB,CACL,IAAKA,GAAK,IAAKA,EAAIge,GACjBhO,EAAOyK,EAAMza,GACb+d,EAAWD,EAAU9d,GACjBgQ,GACFA,EAAK2K,SAAWoD,EAChBE,EAAYje,GAAKgQ,GAEjBkO,EAAWle,GAAK2c,GAAsBoB,GAG1C,KAAM/d,EAAI6J,IAAK7J,EACbke,EAAWle,GAAK2c,GAAsBmB,EAAU9d,IAElD,KAAMA,EAAI2B,IAAK3B,EACbme,EAAUne,GAAKya,EAAMza,GAGzBke,EAAWI,OAASL,EACpBC,EAAWjV,WAAagV,EAAYhV,WAAakV,EAAUlV,WAAawR,EAAMxR,WAC9EzI,EAAM2H,KAAK+V,GACXI,EAAOnW,KAAK8V,GACZM,EAAKpW,KAAKgW,GAEZ,IAAI3d,EAAQwc,GAAmB,IAAKsB,EAAS9E,EAAa,IAAK+E,EAAO/E,EAAa,IACnF,GAAqB,mBAAV/Z,EACT,OAASO,EAAI2B,GACXkc,EAAKpD,EAAQpa,KAAKL,GAAIP,EAAM6P,KAAKmL,EAAOA,EAAMxR,WAAW0R,SAAU3a,SAGrE,OAASA,EAAI2B,GACXkc,EAAKpD,EAAQpa,KAAKL,GAAIP,GAS1B,OANA6e,EAAO9d,MAAQ,WACb,OAAOA,GAET8d,EAAOC,KAAO,WACZ,OAAOA,GAEFD,GAOT5E,EAAsBrK,MAAQ,SAAS5P,GACrC,OAAOoL,UAAUwB,OAAShM,KAAKkZ,SAAS,WAAY9Z,GAASY,KAAKkZ,SAAS,aAE7EG,EAAsB8E,OAAS,SAASA,GACtC,IAAoBjE,EAAUE,EAAOzK,EAAjC0K,EAAY,GACM,mBAAX8D,IAAuBA,EAAS5B,GAAoB4B,IAC/D,IAAK,IAAIvc,EAAI,EAAG4H,EAAIxJ,KAAKgM,OAAQpK,EAAI4H,EAAG5H,IAAK,CAC3CyY,EAAUvS,KAAKoS,EAAW,IAC1BA,EAAStR,YAAcwR,EAAQpa,KAAK4B,IAAIgH,WACxC,IAAK,IAAIjJ,EAAI,EAAG2B,EAAI8Y,EAAMpO,OAAQrM,EAAI2B,EAAG3B,KAClCgQ,EAAOyK,EAAMza,KAAOwe,EAAOlP,KAAKU,EAAMA,EAAK2K,SAAU3a,EAAGiC,IAC3DsY,EAASpS,KAAK6H,GAIpB,OAAOwJ,EAAakB,IAOtBhB,EAAsB9B,MAAQ,WAC5B,IAAK,IAAI3V,GAAK,EAAG4H,EAAIxJ,KAAKgM,SAAUpK,EAAI4H,GACtC,IAAK,IAA4DmG,EAAxDyK,EAAQpa,KAAK4B,GAAIjC,EAAIya,EAAMpO,OAAS,EAAGoS,EAAOhE,EAAMza,KAAYA,GAAK,IACxEgQ,EAAOyK,EAAMza,MACXye,GAAQA,IAASzO,EAAK0O,aAAaD,EAAKxV,WAAW2U,aAAa5N,EAAMyO,GAC1EA,EAAOzO,GAIb,OAAO3P,MAETqZ,EAAsBla,KAAO,SAASsd,GACpCA,EAAaD,GAA4BjS,MAAMvK,KAAMwK,WACrD,IAAK,IAAI5I,GAAK,EAAG4H,EAAIxJ,KAAKgM,SAAUpK,EAAI4H,GAAKxJ,KAAK4B,GAAGzC,KAAKsd,GAC1D,OAAOzc,KAAKuX,SAQd8B,EAAsB9Z,KAAO,SAASwI,GACpC,OAAO2U,GAAkB1c,MAAM,SAAS2P,EAAMhQ,EAAGiC,GAC/CmG,EAASkH,KAAKU,EAAMA,EAAK2K,SAAU3a,EAAGiC,OAW1CyX,EAAsBpK,KAAO,SAASlH,GACpC,IAAIuW,EAAO/O,EAAS/E,WAEpB,OADAzC,EAASwC,MAAM+T,EAAK,GAAKte,KAAMse,GACxBte,MAETqZ,EAAsB1C,MAAQ,WAC5B,OAAQ3W,KAAK2P,QAEf0J,EAAsB1J,KAAO,WAC3B,IAAK,IAAI/N,EAAI,EAAG4H,EAAIxJ,KAAKgM,OAAQpK,EAAI4H,EAAG5H,IACtC,IAAK,IAAIwY,EAAQpa,KAAK4B,GAAIjC,EAAI,EAAG2B,EAAI8Y,EAAMpO,OAAQrM,EAAI2B,EAAG3B,IAAK,CAC7D,IAAIgQ,EAAOyK,EAAMza,GACjB,GAAIgQ,EAAM,OAAOA,EAGrB,OAAO,MAET0J,EAAsBtD,KAAO,WAC3B,IAAIzU,EAAI,EAIR,OAHAob,GAAkB1c,MAAM,aACpBsB,KAEGA,GAMT,IAAIsb,GAA8B,GA6BlC,SAAS2B,GAA+Bpe,GACtC,IAAI+S,EAAIsL,EACR,OAAO,SAASnf,EAAGM,EAAGiC,GACpB,IAA+C+N,EAA3CyK,EAAQja,EAAMyB,GAAGqc,OAAQ3c,EAAI8Y,EAAMpO,OAGvC,IAFIpK,GAAK4c,IAAIA,EAAK5c,EAAGsR,EAAK,GACtBvT,GAAKuT,IAAIA,EAAKvT,EAAI,KACbgQ,EAAOyK,EAAMlH,OAAUA,EAAK5R,IACrC,OAAOqO,GAsCX,SAAS8O,GAAgBzZ,EAAMiT,EAAUyG,GACvC,IAAIpY,EAAO,OAAStB,EAAMrF,EAAIqF,EAAKkT,QAAQ,KAAMyG,EAAOC,GACpDjf,EAAI,IAAGqF,EAAOA,EAAKsK,MAAM,EAAG3P,IAChC,IAAIwe,EAASU,GAAuB9P,IAAI/J,GAExC,SAAS8Z,IACP,IAAIvV,EAAIvJ,KAAKsG,GACTiD,IACFvJ,KAAK+e,oBAAoB/Z,EAAMuE,EAAGA,EAAE7J,UAC7BM,KAAKsG,IAmBhB,OAxBI6X,IAAQnZ,EAAOmZ,EAAQQ,EAAOK,IAwB3Brf,EAAIsY,EAhBX,WACE,IAAI1O,EAAIoV,EAAK1G,EAAU1I,EAAS/E,YAChCsU,EAAS7P,KAAKjP,MACdA,KAAKif,iBAAiBja,EAAMhF,KAAKsG,GAAQiD,EAAGA,EAAE7J,EAAIgf,GAClDnV,EAAEsL,EAAIoD,GAYsB6G,EAAW7G,EAAWP,EAVpD,WACE,IAA8DwH,EAA1DxD,EAAK,IAAIL,OAAO,eAAiB/c,EAAGwa,QAAQ9T,GAAQ,KACxD,IAAK,IAAIsB,KAAQtG,KACf,GAAIkf,EAAQ5Y,EAAK4Y,MAAMxD,GAAK,CAC1B,IAAInS,EAAIvJ,KAAKsG,GACbtG,KAAK+e,oBAAoBG,EAAM,GAAI3V,EAAGA,EAAE7J,UACjCM,KAAKsG,KAjGpBhI,EAAGgB,UAAUa,MAAQwc,GACrBre,EAAGgB,UAAUa,MAAM2C,UAAY8Z,GAC/BA,GAA4Bxc,OAASiZ,EAAsBjZ,OAC3Dwc,GAA4BjG,MAAQ0C,EAAsB1C,MAC1DiG,GAA4BjN,KAAO0J,EAAsB1J,KACzDiN,GAA4B3N,KAAOoK,EAAsBpK,KACzD2N,GAA4B7G,KAAOsD,EAAsBtD,KACzD6G,GAA4B7c,OAAS,SAASia,GAE5C,IADA,IAAoBE,EAAUC,EAASgF,EAAS/E,EAAOzK,EAAnD0K,EAAY,GACPzY,GAAK,EAAG4H,EAAIxJ,KAAKgM,SAAUpK,EAAI4H,GAAK,CAC3C2V,GAAW/E,EAAQpa,KAAK4B,IAAIqc,OAC5B5D,EAAUvS,KAAKoS,EAAW,IAC1BA,EAAStR,WAAawR,EAAMxR,WAC5B,IAAK,IAAIjJ,GAAK,EAAG2B,EAAI8Y,EAAMpO,SAAUrM,EAAI2B,IACnCqO,EAAOyK,EAAMza,KACfua,EAASpS,KAAKqX,EAAQxf,GAAKwa,EAAUH,EAAS/K,KAAKmL,EAAMxR,WAAY+G,EAAK2K,SAAU3a,EAAGiC,IACvFuY,EAAQG,SAAW3K,EAAK2K,UAExBJ,EAASpS,KAAK,MAIpB,OAAOqR,EAAakB,IAEtBuC,GAA4BS,OAAS,SAAS/W,EAAMgX,GAElD,OADI9S,UAAUwB,OAAS,IAAGsR,EAASiB,GAA+Bve,OAC3DqZ,EAAsBgE,OAAOpO,KAAKjP,KAAMsG,EAAMgX,IAYvDhf,EAAGyB,OAAS,SAAS4P,GACnB,IAAIyK,EAQJ,MAPoB,iBAATzK,GACTyK,EAAQ,CAAEd,EAAU3J,EAAMF,KACpB7G,WAAa6G,EAAYI,iBAE/BuK,EAAQ,CAAEzK,IACJ/G,WAAa8G,EAAmBC,GAEjCwJ,EAAa,CAAEiB,KAExB9b,EAAG2B,UAAY,SAASmf,GACtB,IAAIhF,EAQJ,MAPqB,iBAAVgF,GACThF,EAAQ7K,EAASiK,EAAa4F,EAAO3P,KAC/B7G,WAAa6G,EAAYI,iBAE/BuK,EAAQ7K,EAAS6P,IACXxW,WAAa,KAEduQ,EAAa,CAAEiB,KAExBf,EAAsB1Y,GAAK,SAASqE,EAAMiT,EAAUyG,GAClD,IAAIpd,EAAIkJ,UAAUwB,OAClB,GAAI1K,EAAI,EAAG,CACT,GAAoB,iBAAT0D,EAAmB,CAE5B,IAAK0Z,KADDpd,EAAI,IAAG2W,GAAW,GACNjT,EAAMhF,KAAKT,KAAKkf,GAAgBC,EAAS1Z,EAAK0Z,GAAUzG,IACxE,OAAOjY,KAET,GAAIsB,EAAI,EAAG,OAAQA,EAAItB,KAAK2P,OAAO,OAAS3K,KAAU1D,EAAEuT,EACxD6J,GAAU,EAEZ,OAAO1e,KAAKT,KAAKkf,GAAgBzZ,EAAMiT,EAAUyG,KAgCnD,IAAIG,GAAyBvgB,EAAGyV,IAAI,CAClCsL,WAAY,YACZC,WAAY,aAOd,SAASV,GAAwB3G,EAAUU,GACzC,OAAO,SAAStP,GACd,IAAI7H,EAAIlD,EAAG0Z,MACX1Z,EAAG0Z,MAAQ3O,EACXsP,EAAU,GAAK3Y,KAAKsa,SACpB,IACErC,EAAS1N,MAAMvK,KAAM2Y,GACrB,QACAra,EAAG0Z,MAAQxW,IAIjB,SAASwd,GAAsB/G,EAAUU,GACvC,IAAIpP,EAAIqV,GAAwB3G,EAAUU,GAC1C,OAAO,SAAStP,GACd,IAAmBkW,EAAUlW,EAAEmW,cAC1BD,IAAWA,IADHvf,MACqE,EAA1Cuf,EAAQE,wBADnCzf,QAEXuJ,EAAE0F,KAFSjP,KAEIqJ,IAtBjBoG,GACFoP,GAAuBvJ,SAAQ,SAASjU,GAClC,KAAOA,KAAKoO,GAAaoP,GAAuB1P,OAAO9N,MAwB/D,IAAIqe,GAAqBC,GAAkB,EAC3C,SAASC,GAAsBjQ,GAC7B,IAAIrJ,EAAO,oBAAqBqZ,GAAiBnT,EAAQ,QAAUlG,EAAM8C,EAAI9K,EAAGyB,OAAO+P,EAAUH,IAAOhP,GAAG,YAAc2F,EAAM8R,GAAwBzX,GAAG,YAAc2F,EAAM8R,GAAwBzX,GAAG,cAAgB2F,EAAM8R,GAI/N,GAH2B,MAAvBsH,KACFA,KAAsB,kBAAmB/P,IAAe0G,EAAgB1G,EAAKnP,MAAO,eAElFkf,GAAqB,CACvB,IAAIlf,EAAQkP,EAAmBC,GAAMnP,MAAOT,EAASS,EAAMkf,IAC3Dlf,EAAMkf,IAAuB,OAE/B,OAAO,SAASG,GAGd,GAFAzW,EAAEzI,GAAG2F,EAAM,MACPoZ,KAAqBlf,EAAMkf,IAAuB3f,GAClD8f,EAAe,CACjB,IAAIC,EAAM,WACR1W,EAAEzI,GAAG6L,EAAO,OAEdpD,EAAEzI,GAAG6L,GAAO,WACV4L,IACA0H,OACC,GACH5W,WAAW4W,EAAK,KAItBxhB,EAAGyhB,MAAQ,SAAS3X,GAClB,OAAO4X,GAAc5X,EAAWkQ,MAElC,IAAI2H,GAAoBjgB,KAAKkgB,WAAa,SAAS9Y,KAAKpH,KAAKkgB,UAAUC,YAAc,EAAI,EACzF,SAASH,GAAc5X,EAAWiB,GAC5BA,EAAE+W,iBAAgB/W,EAAIA,EAAE+W,eAAe,IAC3C,IAAIxhB,EAAMwJ,EAAUiY,iBAAmBjY,EACvC,GAAIxJ,EAAI0hB,eAAgB,CACtB,IAAIC,EAAQ3hB,EAAI0hB,iBAChB,GAAIL,GAAoB,EAAG,CACzB,IAAItd,EAASmN,EAAU1H,GACvB,GAAIzF,EAAO6d,SAAW7d,EAAO8d,QAAS,CASpC,IAAIC,GARJ9hB,EAAMN,EAAGyB,OAAO,QAAQK,OAAO,OAAOI,MAAM,CAC1CqG,SAAU,WACVC,IAAK,EACLkE,KAAM,EACN2V,OAAQ,EACR/c,QAAS,EACTF,OAAQ,QACP,cACW,GAAG,GAAGkd,eACpBX,KAAsBS,EAAI1f,GAAK0f,EAAIrX,GACnCzK,EAAIuQ,UAMR,OAHI8Q,IAAmBM,EAAMve,EAAIqH,EAAEwX,MAAON,EAAMtf,EAAIoI,EAAEyX,QAAYP,EAAMve,EAAIqH,EAAE0X,QAC9ER,EAAMtf,EAAIoI,EAAE2X,SAEL,EADPT,EAAQA,EAAMU,gBAAgB7Y,EAAUwY,eAAeM,YACxClf,EAAGue,EAAMtf,GAE1B,IAAIkgB,EAAO/Y,EAAUgZ,wBACrB,MAAO,CAAE/X,EAAE0X,QAAUI,EAAKnW,KAAO5C,EAAUiZ,WAAYhY,EAAE2X,QAAUG,EAAKra,IAAMsB,EAAUkZ,WA2D1F,SAASC,KACP,OAAOjjB,EAAG0Z,MAAMoI,eAAe,GAAGoB,WA1DpCljB,EAAGmjB,MAAQ,SAASrZ,EAAWsZ,EAASF,GAEtC,GADIhX,UAAUwB,OAAS,IAAGwV,EAAaE,EAASA,EAAUpJ,IAAiB8H,gBACvEsB,EAAS,IAAK,IAA+BD,EAA3B9hB,EAAI,EAAG2B,EAAIogB,EAAQ1V,OAAerM,EAAI2B,IAAK3B,EAC/D,IAAK8hB,EAAQC,EAAQ/hB,IAAI6hB,aAAeA,EACtC,OAAOxB,GAAc5X,EAAWqZ,IAItCnjB,EAAGkZ,SAASmK,KAAO,WACjB,IAAI3J,EAAQQ,EAAiBmJ,EAAM,OAAQ,YAAa,WAAYC,EAAS,KAAMC,EAAYC,EAAUpK,EAASpZ,EAAGyhB,MAAOjQ,EAAW,YAAa,WAAYiS,EAAaD,EAAUP,GAAyBjjB,EAAGmjB,MAAOvL,EAAa,YAAa,YACpP,SAASyL,IACP3hB,KAAKW,GAAG,iBAAkBkhB,GAAWlhB,GAAG,kBAAmBohB,GAE7D,SAASD,EAAUhT,EAAIjI,EAAUmb,EAASC,EAAMC,GAC9C,OAAO,WACL,IAA0OC,EAAtO5V,EAAOvM,KAAMoK,EAAS9L,EAAG0Z,MAAM5N,OAAOgY,sBAAwB9jB,EAAG0Z,MAAM5N,OAAQ8E,EAAS3C,EAAK3D,WAAYiP,EAAWG,EAAMS,GAAGlM,EAAM/B,WAAY6X,EAAU,EAAGC,EAASxT,IAAMyT,EAAW,SAAqB,MAAVD,EAAiB,GAAK,IAAMA,GAAqBE,EAAclkB,EAAGyB,OAAOiiB,EAAQ5X,IAASzJ,GAAGshB,EAAOM,EAAUE,GAAO9hB,GAAGuhB,EAAMK,EAAUG,GAAQC,EAAc/C,GAAsBxV,GAASwY,EAAY/b,EAASqI,EAAQoT,GAU/Z,SAASG,IACP,IAA0CI,EAAIC,EAA1CC,EAAYlc,EAASqI,EAAQoT,GAC5BS,IACLF,EAAKE,EAAU,GAAKH,EAAU,GAC9BE,EAAKC,EAAU,GAAKH,EAAU,GAC9BP,GAAWQ,EAAKC,EAChBF,EAAYG,EACZlL,EAAS,CACP7S,KAAM,OACNhD,EAAG+gB,EAAU,GAAKZ,EAAW,GAC7BlhB,EAAG8hB,EAAU,GAAKZ,EAAW,GAC7BU,GAAIA,EACJC,GAAIA,KAGR,SAASJ,IACF7b,EAASqI,EAAQoT,KACtBE,EAAY7hB,GAAGshB,EAAOM,EAAU,MAAM5hB,GAAGuhB,EAAMK,EAAU,MACzDI,EAAYN,GACZxK,EAAS,CACP7S,KAAM,aA3BRmd,EAFEP,EAEW,EADbO,EAAaP,EAAOrX,MAAMgC,EAAM/B,YACNxI,EAAI4gB,EAAU,GAAIT,EAAWlhB,EAAI2hB,EAAU,IAExD,CAAE,EAAG,GAEpB/K,EAAS,CACP7S,KAAM,eAgCZ,OALA2c,EAAKC,OAAS,SAAS5f,GACrB,OAAKwI,UAAUwB,QACf4V,EAAS5f,EACF2f,GAFuBC,GAIzBtjB,EAAGmZ,OAAOkK,EAAM3J,EAAO,OAKhC1Z,EAAGojB,QAAU,SAAStZ,EAAWsZ,GAE/B,OADIlX,UAAUwB,OAAS,IAAG0V,EAAUpJ,IAAiBoJ,SAC9CA,EAAUnS,EAASmS,GAAS3N,KAAI,SAAS0N,GAC9C,IAAIlB,EAAQP,GAAc5X,EAAWqZ,GAErC,OADAlB,EAAMiB,WAAaC,EAAMD,WAClBjB,KACJ,IAEP,IAAIyC,GAAI,KAAMC,GAAKD,MAAOE,GAAIrjB,KAAKsjB,GAAIC,GAAI,EAAIF,GAAGG,GAAKD,GAAIJ,GAAGM,GAAQJ,GAAI,EAAGK,GAAaL,GAAI,IAAKM,GAAa,IAAMN,GACtH,SAASO,GAAOzhB,GACd,OAAOA,EAAI,EAAI,EAAIA,EAAI,GAAK,EAAI,EAElC,SAAS0hB,GAAW3d,EAAGC,EAAGF,GACxB,OAAQE,EAAE,GAAKD,EAAE,KAAOD,EAAE,GAAKC,EAAE,KAAOC,EAAE,GAAKD,EAAE,KAAOD,EAAE,GAAKC,EAAE,IAEnE,SAAS4d,GAAQ3hB,GACf,OAAOA,EAAI,EAAI,EAAIA,GAAK,EAAIkhB,GAAIrjB,KAAK+jB,KAAK5hB,GAE5C,SAAS6hB,GAAQ7hB,GACf,OAAOA,EAAI,EAAIshB,GAAQthB,GAAK,GAAKshB,GAAQzjB,KAAKikB,KAAK9hB,GAKrD,SAAS+hB,GAAQ/hB,GACf,QAASA,EAAInC,KAAKmkB,IAAIhiB,IAAM,EAAIA,GAAK,EAKvC,SAASiiB,GAAYjiB,GACnB,OAAQA,EAAInC,KAAKqkB,IAAIliB,EAAI,IAAMA,EAEjC,IAAImiB,GAAItkB,KAAKukB,MACb9lB,EAAG+lB,gBAAkB,SAASC,EAAI7Q,GAChC,IAAwI9T,EAAG4kB,EAAvIC,EAAMF,EAAG,GAAIG,EAAMH,EAAG,GAAII,EAAKJ,EAAG,GAAIK,EAAMlR,EAAG,GAAImR,EAAMnR,EAAG,GAAIoR,EAAKpR,EAAG,GAAIoP,EAAK8B,EAAMH,EAAK1B,EAAK8B,EAAMH,EAAKK,EAAKjC,EAAKA,EAAKC,EAAKA,EACpI,GAAIgC,EAAK7B,GACPsB,EAAI1kB,KAAKklB,IAAIF,EAAKH,GAAMP,GACxBxkB,EAAI,SAASwB,GACX,MAAO,CAAEqjB,EAAMrjB,EAAI0hB,EAAI4B,EAAMtjB,EAAI2hB,EAAI4B,EAAK7kB,KAAKmkB,IAAIG,GAAIhjB,EAAIojB,SAExD,CACL,IAAIS,EAAKnlB,KAAK6S,KAAKoS,GAAKG,GAAMJ,EAAKA,EAAKH,EAAKA,EAThB,EAS0BI,IAAO,EAAIJ,EAT7C,EASuDM,GAAKE,GAAML,EAAKA,EAAKH,EAAKA,EATzE,EASmFI,IAAO,EAAID,EATtG,EASgHG,GAAKG,EAAKtlB,KAAKklB,IAAIllB,KAAK6S,KAAKuS,EAAKA,EAAK,GAAKA,GAAKG,EAAKvlB,KAAKklB,IAAIllB,KAAK6S,KAAKwS,EAAKA,EAAK,GAAKA,GAC7NX,GAAKa,EAAKD,GAAMhB,GAChBxkB,EAAI,SAASwB,GACX,IAlBWa,EAkBPyH,EAAItI,EAAIojB,EAAGc,EAAStB,GAAQoB,GAAK5jB,EAAImjB,GAZtB,EAYiCM,IAAOK,GAlBhDrjB,EAkBiEmiB,GAAI1a,EAAI0b,IAjB/EnjB,EAAInC,KAAKmkB,IAAI,EAAIhiB,IAAM,IAAMA,EAAI,IAP5C,SAAiBA,GACf,QAASA,EAAInC,KAAKmkB,IAAIhiB,IAAM,EAAIA,GAAK,EAuByDsjB,CAAQH,IAClG,MAAO,CAAEX,EAAMjjB,EAAIshB,EAAI4B,EAAMljB,EAAIuhB,EAAI4B,EAAKW,EAAStB,GAAQI,GAAI1a,EAAI0b,KAIvE,OADAxlB,EAAE4lB,SAAe,IAAJhB,EACN5kB,GAETrB,EAAGkZ,SAASgO,KAAO,WACjB,IAIGC,EAAYC,EAASC,EAAwLC,EAAiDC,EAA2EC,EAAIC,EAAIC,EAAIC,EAJpVC,EAAO,CACTlkB,EAAG,EACHf,EAAG,EACHI,EAAG,GAC2B0U,EAAO,CAAE,IAAK,KAAOoQ,EAAcC,GAA0Bb,EAAW,IAAKc,EAAU,EAAGxE,EAAY,iBAAkByE,EAAY,iBAAkBC,EAAU,eAAiCxE,EAAa,kBAA8B/J,EAAQQ,EAAiBgN,EAAM,YAAa,OAAQ,WAUhU,SAASA,EAAK/kB,GACZA,EAAEE,GAAGkhB,EAAW2E,GAAa7lB,GAAG8lB,GAAwB,QAASC,GAAc/lB,GAAG,gBAAiBgmB,GAAYhmB,GAAGohB,EAAY6E,GAoGhI,SAASC,EAASnlB,GAChB,MAAO,EAAGA,EAAE,GAAKwkB,EAAKlkB,GAAKkkB,EAAK7kB,GAAIK,EAAE,GAAKwkB,EAAKjlB,GAAKilB,EAAK7kB,GAK5D,SAASylB,EAAQrd,GACfyc,EAAK7kB,EAAIxB,KAAK4C,IAAI0jB,EAAY,GAAItmB,KAAKiS,IAAIqU,EAAY,GAAI1c,IAE7D,SAASsd,EAAYrlB,EAAG6H,GACtBA,EAPF,SAAeA,GACb,MAAO,CAAEA,EAAE,GAAK2c,EAAK7kB,EAAI6kB,EAAKlkB,EAAGuH,EAAE,GAAK2c,EAAK7kB,EAAI6kB,EAAKjlB,GAMlDsf,CAAMhX,GACV2c,EAAKlkB,GAAKN,EAAE,GAAK6H,EAAE,GACnB2c,EAAKjlB,GAAKS,EAAE,GAAK6H,EAAE,GAErB,SAASyd,EAAOza,EAAM7K,EAAG6H,EAAGlI,GAC1BkL,EAAK0a,UAAY,CACfjlB,EAAGkkB,EAAKlkB,EACRf,EAAGilB,EAAKjlB,EACRI,EAAG6kB,EAAK7kB,GAEVylB,EAAQjnB,KAAKqnB,IAAI,EAAG7lB,IACpB0lB,EAAYrB,EAAUhkB,EAAG6H,GACzBgD,EAAOjO,EAAGyB,OAAOwM,GACbgZ,EAAW,IAAGhZ,EAAOA,EAAK4a,aAAa5B,SAASA,IACpDhZ,EAAK0C,KAAKuW,EAAKxN,OAEjB,SAASoP,IACHrB,GAAIA,EAAGsB,OAAOvB,EAAG/Q,QAAQhB,KAAI,SAAS/R,GACxC,OAAQA,EAAIkkB,EAAKlkB,GAAKkkB,EAAK7kB,KAC1B0S,IAAI+R,EAAGwB,SACNrB,GAAIA,EAAGoB,OAAOrB,EAAGjR,QAAQhB,KAAI,SAAS9S,GACxC,OAAQA,EAAIilB,EAAKjlB,GAAKilB,EAAK7kB,KAC1B0S,IAAIiS,EAAGsB,SAEZ,SAASC,EAAY1P,GACdwO,KAAWxO,EAAS,CACvB7S,KAAM,cAGV,SAASwiB,EAAO3P,GACduP,IACAvP,EAAS,CACP7S,KAAM,OACNvG,MAAOynB,EAAK7kB,EACZomB,UAAW,CAAEvB,EAAKlkB,EAAGkkB,EAAKjlB,KAG9B,SAASymB,EAAU7P,KACVwO,IAASxO,EAAS,CACvB7S,KAAM,YACJ0gB,EAAU,MAEhB,SAASc,IACP,IAAIja,EAAOvM,KAAM6X,EAAWG,EAAMS,GAAGlM,EAAM/B,WAAY6X,EAAU,EAAGL,EAAU1jB,EAAGyB,OAAO+P,EAAUvD,IAAO5L,GAAG2lB,EAAW7D,GAAO9hB,GAAG4lB,EAAS7D,GAAQiF,EAAYd,EAASvoB,EAAGyhB,MAAMxT,IAAQoW,EAAc/C,GAAsBrT,GAG5N,SAASkW,IACPJ,EAAU,EACV0E,EAAYzoB,EAAGyhB,MAAMxT,GAAOob,GAC5BH,EAAO3P,GAET,SAAS6K,IACPV,EAAQrhB,GAAG2lB,EAAW,MAAM3lB,GAAG4lB,EAAS,MACxC5D,EAAYN,GACZqF,EAAU7P,GAVZ+P,GAAuB3Y,KAAK1C,GAC5Bgb,EAAY1P,GAYd,SAAS+O,IACP,IAAuFiB,EAAnFtb,EAAOvM,KAAM6X,EAAWG,EAAMS,GAAGlM,EAAM/B,WAAYsd,EAAa,GAAIC,EAAY,EAAWC,EAAW,SAAW1pB,EAAG0Z,MAAMoI,eAAe,GAAGoB,WAAYyG,EAAY,YAAcD,EAAUE,EAAW,WAAaF,EAAUG,EAAU,GAAInG,EAAU1jB,EAAGyB,OAAOwM,GAAOoW,EAAc/C,GAAsBrT,GAI/S,SAAS6b,IACP,IAAI1G,EAAUpjB,EAAGojB,QAAQnV,GAKzB,OAJAsb,EAAS3B,EAAK7kB,EACdqgB,EAAQpM,SAAQ,SAASnU,GACnBA,EAAEqgB,cAAcsG,IAAYA,EAAW3mB,EAAEqgB,YAAcqF,EAAS1lB,OAE/DugB,EAET,SAAS2G,IACP,IAAIje,EAAS9L,EAAG0Z,MAAM5N,OACtB9L,EAAGyB,OAAOqK,GAAQzJ,GAAGsnB,EAAWxF,GAAO9hB,GAAGunB,EAAUxF,GACpDyF,EAAQrgB,KAAKsC,GAEb,IADA,IAAIke,EAAUhqB,EAAG0Z,MAAMoI,eACdzgB,EAAI,EAAG2B,EAAIgnB,EAAQtc,OAAQrM,EAAI2B,IAAK3B,EAC3CmoB,EAAWQ,EAAQ3oB,GAAG6hB,YAAc,KAEtC,IAAIE,EAAU0G,IAAYjY,EAAMD,KAAKC,MACrC,GAAuB,IAAnBuR,EAAQ1V,OAAc,CACxB,GAAImE,EAAM0V,EAAY,IAAK,CACzB,IAAInkB,EAAIggB,EAAQ,GAChBsF,EAAOza,EAAM7K,EAAGomB,EAAWpmB,EAAE8f,YAAa3hB,KAAKwS,MAAMxS,KAAKklB,IAAImB,EAAK7kB,GAAKxB,KAAK0oB,KAAO,GACpFnQ,IAEFyN,EAAY1V,OACP,GAAIuR,EAAQ1V,OAAS,EAAG,CACzBtK,EAAIggB,EAAQ,GAAhB,IAAoBpY,EAAIoY,EAAQ,GAAImB,EAAKnhB,EAAE,GAAK4H,EAAE,GAAIwZ,EAAKphB,EAAE,GAAK4H,EAAE,GACpEye,EAAYlF,EAAKA,EAAKC,EAAKA,GAG/B,SAASL,IACP,IAAgC6B,EAAIkE,EAAI/U,EAAIgV,EAAxC/G,EAAUpjB,EAAGojB,QAAQnV,GACzBqb,GAAuB3Y,KAAK1C,GAC5B,IAAK,IAAI5M,EAAI,EAAG2B,EAAIogB,EAAQ1V,OAAQrM,EAAI2B,IAAK3B,EAAG8oB,EAAK,KAEnD,GADAhV,EAAKiO,EAAQ/hB,GACT8oB,EAAKX,EAAWrU,EAAG+N,YAAa,CAClC,GAAIgH,EAAI,MACRlE,EAAK7Q,EAAI+U,EAAKC,EAGlB,GAAIA,EAAI,CACN,IAAIC,GAAaA,EAAYjV,EAAG,GAAK6Q,EAAG,IAAMoE,GAAaA,EAAYjV,EAAG,GAAK6Q,EAAG,IAAMoE,EAAWC,EAASZ,GAAaloB,KAAK6S,KAAKgW,EAAYX,GAC/IzD,EAAK,EAAGA,EAAG,GAAK7Q,EAAG,IAAM,GAAI6Q,EAAG,GAAK7Q,EAAG,IAAM,GAC9C+U,EAAK,EAAGA,EAAG,GAAKC,EAAG,IAAM,GAAID,EAAG,GAAKC,EAAG,IAAM,GAC9C3B,EAAQ6B,EAASd,GAEnBhC,EAAY,KACZkB,EAAYzC,EAAIkE,GAChBhB,EAAO3P,GAET,SAAS6K,IACP,GAAIpkB,EAAG0Z,MAAM0J,QAAQ1V,OAAQ,CAE3B,IADA,IAAIsc,EAAUhqB,EAAG0Z,MAAMoI,eACdzgB,EAAI,EAAG2B,EAAIgnB,EAAQtc,OAAQrM,EAAI2B,IAAK3B,SACpCmoB,EAAWQ,EAAQ3oB,GAAG6hB,YAE/B,IAAK,IAAIA,KAAcsG,EACrB,YAAYM,IAGhB9pB,EAAG2B,UAAUkoB,GAASxnB,GAAGqnB,EAAU,MACnChG,EAAQrhB,GAAGkhB,EAAW2E,GAAa7lB,GAAGohB,EAAY6E,GAClDjE,IACA+E,EAAU7P,GAjEZwQ,IACAd,EAAY1P,GACZmK,EAAQrhB,GAAGkhB,EAAW,MAAMlhB,GAAGohB,EAAYsG,GAkE7C,SAAS3B,IACP,IAAI7O,EAAWG,EAAMS,GAAGzY,KAAMwK,WAC1Bob,EAAiB3b,aAAa2b,IAAuBgC,GAAuB3Y,KAAKjP,MACrFylB,EAAaoB,EAASnB,EAAUC,GAAUrnB,EAAGyhB,MAAM/f,OAAQunB,EAAY1P,IACvE+N,EAAkB1c,YAAW,WAC3B0c,EAAkB,KAClB8B,EAAU7P,KACT,IACHO,IACA0O,EAAQjnB,KAAKqnB,IAAI,EAA6B,KAA1B0B,MAAkC1C,EAAK7kB,GAC3D0lB,EAAYrB,EAASD,GACrB+B,EAAO3P,GAET,SAAS8O,IACP,IAAIjlB,EAAIpD,EAAGyhB,MAAM/f,MAAOqB,EAAIxB,KAAKklB,IAAImB,EAAK7kB,GAAKxB,KAAK0oB,IACpDvB,EAAOhnB,KAAM0B,EAAGmlB,EAASnlB,GAAIpD,EAAG0Z,MAAM6Q,SAAWhpB,KAAKipB,KAAKznB,GAAK,EAAIxB,KAAKwS,MAAMhR,GAAK,GAEtF,OAxQKolB,KACHA,GAAwB,YAAahX,GAAemZ,GAAwB,WAC1E,OAAQtqB,EAAG0Z,MAAM+Q,QAAUzqB,EAAG0Z,MAAMgR,UAAY,IAAM,IACrD,SAAW,iBAAkBvZ,GAAemZ,GAAwB,WACrE,OAAOtqB,EAAG0Z,MAAMiR,YACf,eAAiBL,GAAwB,WAC1C,OAAQtqB,EAAG0Z,MAAMkR,QAChB,wBAKL1D,EAAKxN,MAAQ,SAASvX,GACpBA,EAAElB,MAAK,WACL,IAAIsY,EAAWG,EAAMS,GAAGzY,KAAMwK,WAAY2e,EAAQjD,EAC9CkD,GACF9qB,EAAGyB,OAAOC,MAAMmnB,aAAa5nB,KAAK,cAAc,WAC9C2mB,EAAOlmB,KAAKinB,WAAa,CACvBjlB,EAAG,EACHf,EAAG,EACHI,EAAG,GAELkmB,EAAY1P,MACXwR,MAAM,aAAa,WACpB,IAAIxG,EAAK9M,EAAK,GAAI+M,EAAK/M,EAAK,GAAIuT,EAAK5D,EAAUA,EAAQ,GAAK7C,EAAK,EAAG0G,EAAK7D,EAAUA,EAAQ,GAAK5C,EAAK,EAAGnjB,EAAIrB,EAAG+lB,gBAAgB,EAAGiF,EAAKpD,EAAKlkB,GAAKkkB,EAAK7kB,GAAIkoB,EAAKrD,EAAKjlB,GAAKilB,EAAK7kB,EAAGwhB,EAAKqD,EAAK7kB,GAAK,EAAGioB,EAAKH,EAAMnnB,GAAKmnB,EAAM9nB,GAAIkoB,EAAKJ,EAAMloB,GAAKkoB,EAAM9nB,EAAGwhB,EAAKsG,EAAM9nB,IACjQ,OAAO,SAASF,GACd,IAAIoI,EAAI5J,EAAEwB,GAAIE,EAAIwhB,EAAKtZ,EAAE,GACzBvJ,KAAKinB,UAAYf,EAAO,CACtBlkB,EAAGsnB,EAAK/f,EAAE,GAAKlI,EACfJ,EAAGsoB,EAAKhgB,EAAE,GAAKlI,EACfA,EAAGA,GAELmmB,EAAO3P,OAERtY,KAAK,kBAAkB,WACxBmoB,EAAU7P,MACTtY,KAAK,YAAY,WAClBmoB,EAAU7P,OAGZ7X,KAAKinB,UAAYf,EACjBqB,EAAY1P,GACZ2P,EAAO3P,GACP6P,EAAU7P,QAIhB2N,EAAKiC,UAAY,SAAS5S,GACxB,OAAKrK,UAAUwB,QACfka,EAAO,CACLlkB,GAAI6S,EAAE,GACN5T,GAAI4T,EAAE,GACNxT,EAAG6kB,EAAK7kB,GAEV+lB,IACO5B,GAPuB,CAAEU,EAAKlkB,EAAGkkB,EAAKjlB,IAS/CukB,EAAK/mB,MAAQ,SAASoW,GACpB,OAAKrK,UAAUwB,QACfka,EAAO,CACLlkB,EAAGkkB,EAAKlkB,EACRf,EAAGilB,EAAKjlB,EACRI,EAAG,MAELylB,GAASjS,GACTuS,IACO5B,GARuBU,EAAK7kB,GAUrCmkB,EAAKW,YAAc,SAAStR,GAC1B,OAAKrK,UAAUwB,QACfma,EAAmB,MAALtR,EAAYuR,GAA2B,EAAGvR,EAAE,IAAKA,EAAE,IAC1D2Q,GAFuBW,GAIhCX,EAAKG,OAAS,SAAS9Q,GACrB,OAAKrK,UAAUwB,QACf2Z,EAAS9Q,GAAK,EAAGA,EAAE,IAAKA,EAAE,IACnB2Q,GAFuBG,GAIhCH,EAAKzP,KAAO,SAASlB,GACnB,OAAKrK,UAAUwB,QACf+J,EAAOlB,GAAK,EAAGA,EAAE,IAAKA,EAAE,IACjB2Q,GAFuBzP,GAIhCyP,EAAKD,SAAW,SAAS1Q,GACvB,OAAKrK,UAAUwB,QACfuZ,GAAY1Q,EACL2Q,GAFuBD,GAIhCC,EAAKxjB,EAAI,SAASyE,GAChB,OAAK+D,UAAUwB,QACf+Z,EAAKtf,EACLqf,EAAKrf,EAAE+iB,OACPtD,EAAO,CACLlkB,EAAG,EACHf,EAAG,EACHI,EAAG,GAEEmkB,GARuBO,GAUhCP,EAAKvkB,EAAI,SAASwF,GAChB,OAAK+D,UAAUwB,QACfia,EAAKxf,EACLuf,EAAKvf,EAAE+iB,OACPtD,EAAO,CACLlkB,EAAG,EACHf,EAAG,EACHI,EAAG,GAEEmkB,GARuBS,GAoKzB3nB,EAAGmZ,OAAO+N,EAAMxN,EAAO,OAEhC,IAAgD4Q,GAAuBnC,GAAnEL,GAA2B,CAAE,EAAGjR,KAEpC,SAASsU,MAKT,SAASC,GAAOhjB,EAAG+C,EAAGF,GACpB,OAAOvJ,gBAAgB0pB,IAAe1pB,KAAK0G,GAAKA,EAAG1G,KAAKyJ,GAAKA,OAAGzJ,KAAKuJ,GAAKA,IAAKiB,UAAUwB,OAAS,EAAItF,aAAagjB,GAAS,IAAIA,GAAOhjB,EAAEA,EAAGA,EAAE+C,EAAG/C,EAAE6C,GAAKogB,GAAa,GAAKjjB,EAAGkjB,GAAYF,IAAU,IAAIA,GAAOhjB,EAAG+C,EAAGF,GAPtNjL,EAAGE,MAAQirB,GAEXA,GAAS3mB,UAAU+mB,SAAW,WAC5B,OAAO7pB,KAAK8pB,MAAQ,IAEtBxrB,EAAGyrB,IAAML,GAIT,IAAIM,GAAkBN,GAAO5mB,UAAY,IAAI2mB,GAY7C,SAASQ,GAAWvjB,EAAG+C,EAAGF,GACxB,IAAI2gB,EAAIC,EAaR,SAASC,EAAG1jB,GACV,OAAO7G,KAAKC,MAAa,IAR3B,SAAW4G,GAET,OADIA,EAAI,IAAKA,GAAK,IAAcA,EAAI,IAAGA,GAAK,KACxCA,EAAI,GAAWwjB,GAAMC,EAAKD,GAAMxjB,EAAI,GACpCA,EAAI,IAAYyjB,EAChBzjB,EAAI,IAAYwjB,GAAMC,EAAKD,IAAO,IAAMxjB,GAAK,GAC1CwjB,EAGWtqB,CAAE8G,IAEtB,OAfAA,EAAI4K,MAAM5K,GAAK,GAAKA,GAAK,KAAO,EAAIA,EAAI,IAAMA,EAC9C+C,EAAI6H,MAAM7H,IAASA,EAAI,EAAR,EAAgBA,EAAI,EAAI,EAAIA,EAG3CygB,EAAK,GAFL3gB,EAAIA,EAAI,EAAI,EAAIA,EAAI,EAAI,EAAIA,IAC5B4gB,EAAK5gB,GAAK,GAAKA,GAAK,EAAIE,GAAKF,EAAIE,EAAIF,EAAIE,GAYlC,IAAI4gB,GAAOD,EAAG1jB,EAAI,KAAM0jB,EAAG1jB,GAAI0jB,EAAG1jB,EAAI,MAG/C,SAAS4jB,GAAO5jB,EAAGZ,EAAGyD,GACpB,OAAOvJ,gBAAgBsqB,IAAetqB,KAAK0G,GAAKA,EAAG1G,KAAK8F,GAAKA,OAAG9F,KAAKuJ,GAAKA,IAAKiB,UAAUwB,OAAS,EAAItF,aAAa4jB,GAAS,IAAIA,GAAO5jB,EAAEA,EAAGA,EAAEZ,EAAGY,EAAE6C,GAA2BghB,GAAtB7jB,aAAa8jB,GAAoB9jB,EAAE6C,GAA2B7C,EAAI+jB,IAAY/jB,EAAIpI,EAAGwrB,IAAIpjB,IAAIjF,EAAGiF,EAAEjG,EAAGiG,EAAEV,IAAIuD,EAArE7C,EAAEX,EAAGW,EAAEV,GAA6E,IAAIskB,GAAO5jB,EAAGZ,EAAGyD,GAhCrSygB,GAAgBU,SAAW,SAASrpB,GAElC,OADAA,EAAIxB,KAAKqnB,IAAI,GAAI1c,UAAUwB,OAAS3K,EAAI,GACjC,IAAIqoB,GAAO1pB,KAAK0G,EAAG1G,KAAKyJ,EAAGzJ,KAAKuJ,EAAIlI,IAE7C2oB,GAAgBW,OAAS,SAAStpB,GAEhC,OADAA,EAAIxB,KAAKqnB,IAAI,GAAI1c,UAAUwB,OAAS3K,EAAI,GACjC,IAAIqoB,GAAO1pB,KAAK0G,EAAG1G,KAAKyJ,EAAGpI,EAAIrB,KAAKuJ,IAE7CygB,GAAgBF,IAAM,WACpB,OAAOG,GAAWjqB,KAAK0G,EAAG1G,KAAKyJ,EAAGzJ,KAAKuJ,IAqBzCjL,EAAGssB,IAAMN,GAIT,IAAIO,GAAkBP,GAAOxnB,UAAY,IAAI2mB,GAU7C,SAASqB,GAAWpkB,EAAGZ,EAAGyD,GAGxB,OAFI+H,MAAM5K,KAAIA,EAAI,GACd4K,MAAMxL,KAAIA,EAAI,GACX,IAAI0kB,GAAOjhB,EAAG1J,KAAKkrB,IAAIrkB,GAAK6c,IAAczd,EAAGjG,KAAKqkB,IAAIxd,GAAKZ,GAGpE,SAAS0kB,GAAOjhB,EAAGxD,EAAGC,GACpB,OAAOhG,gBAAgBwqB,IAAexqB,KAAKuJ,GAAKA,EAAGvJ,KAAK+F,GAAKA,OAAG/F,KAAKgG,GAAKA,IAAKwE,UAAUwB,OAAS,EAAIzC,aAAaihB,GAAS,IAAIA,GAAOjhB,EAAEA,EAAGA,EAAExD,EAAGwD,EAAEvD,GAAKuD,aAAa+gB,GAASQ,GAAWvhB,EAAE7C,EAAG6C,EAAEzD,EAAGyD,EAAEA,GAAKkhB,IAAYlhB,EAAI8gB,GAAO9gB,IAAI9H,EAAG8H,EAAE9I,EAAG8I,EAAEvD,GAAK,IAAIwkB,GAAOjhB,EAAGxD,EAAGC,GAhBvQ6kB,GAAgBH,SAAW,SAASrpB,GAClC,OAAO,IAAIipB,GAAOtqB,KAAK0G,EAAG1G,KAAK8F,EAAGjG,KAAKiS,IAAI,IAAK9R,KAAKuJ,EAAIyhB,IAAYxgB,UAAUwB,OAAS3K,EAAI,MAE9FwpB,GAAgBF,OAAS,SAAStpB,GAChC,OAAO,IAAIipB,GAAOtqB,KAAK0G,EAAG1G,KAAK8F,EAAGjG,KAAK4C,IAAI,EAAGzC,KAAKuJ,EAAIyhB,IAAYxgB,UAAUwB,OAAS3K,EAAI,MAE5FwpB,GAAgBf,IAAM,WACpB,OAAOgB,GAAW9qB,KAAK0G,EAAG1G,KAAK8F,EAAG9F,KAAKuJ,GAAGugB,OAO5CxrB,EAAG2sB,IAAMT,GAIT,IAAIQ,GAAW,GAEXE,GAAkBV,GAAO1nB,UAAY,IAAI2mB,GAU7C,SAAS0B,GAAW5hB,EAAGxD,EAAGC,GACxB,IAAI/E,GAAKsI,EAAI,IAAM,IAAKvH,EAAIf,EAAI8E,EAAI,IAAKU,EAAIxF,EAAI+E,EAAI,IAIrD,OAAO,IAAIqkB,GAAOe,GAAW,WAH7BppB,EAba,OAaTqpB,GAAWrpB,IAG8B,WAF7Cf,EAdgC,EAc5BoqB,GAAWpqB,IAE8C,UAD7DwF,EAf8C,QAe1C4kB,GAAW5kB,KAC6D2kB,IAAY,QAAUppB,EAAI,UAAYf,EAAI,QAAUwF,GAAI2kB,GAAW,SAAWppB,EAAI,SAAWf,EAAI,UAAYwF,IAE3L,SAAS8jB,GAAWhhB,EAAGxD,EAAGC,GACxB,OAAOuD,EAAI,EAAI,IAAI+gB,GAAOzqB,KAAKyrB,MAAMtlB,EAAGD,GAAKyd,GAAY3jB,KAAK6S,KAAK3M,EAAIA,EAAIC,EAAIA,GAAIuD,GAAK,IAAI+gB,GAAOnZ,IAAKA,IAAK5H,GAE/G,SAAS8hB,GAAWrpB,GAClB,OAAOA,EAAI,WAAaA,EAAIA,EAAIA,GAAKA,EAAI,EAAI,IAAM,SAErD,SAASupB,GAAWvpB,GAClB,OAAOA,EAAI,QAAUnC,KAAKqnB,IAAIllB,EAAG,EAAI,GAAK,SAAWA,EAAI,EAAI,GAE/D,SAASopB,GAAW3pB,GAClB,OAAO5B,KAAKC,MAAM,KAAO2B,GAAK,OAAS,MAAQA,EAAI,MAAQ5B,KAAKqnB,IAAIzlB,EAAG,EAAI,KAAO,OAGpF,SAAS4oB,GAAO5oB,EAAGhB,EAAGuF,GACpB,OAAOhG,gBAAgBqqB,IAAerqB,KAAKyB,IAAMA,EAAGzB,KAAKS,IAAMA,OAAGT,KAAKgG,IAAMA,IAAKwE,UAAUwB,OAAS,EAAIvK,aAAa4oB,GAAS,IAAIA,GAAO5oB,EAAEA,EAAGA,EAAEhB,EAAGgB,EAAEuE,GAAK2jB,GAAa,GAAKloB,EAAG4oB,GAAQJ,IAAc,IAAII,GAAO5oB,EAAGhB,EAAGuF,GAEzN,SAASwlB,GAAapsB,GACpB,OAAO,IAAIirB,GAAOjrB,GAAS,GAAIA,GAAS,EAAI,IAAa,IAARA,GAEnD,SAASqsB,GAAarsB,GACpB,OAAOosB,GAAapsB,GAAS,GApC/B8rB,GAAgBR,SAAW,SAASrpB,GAClC,OAAO,IAAImpB,GAAO3qB,KAAKiS,IAAI,IAAK9R,KAAKuJ,EAAIyhB,IAAYxgB,UAAUwB,OAAS3K,EAAI,IAAKrB,KAAK+F,EAAG/F,KAAKgG,IAEhGklB,GAAgBP,OAAS,SAAStpB,GAChC,OAAO,IAAImpB,GAAO3qB,KAAK4C,IAAI,EAAGzC,KAAKuJ,EAAIyhB,IAAYxgB,UAAUwB,OAAS3K,EAAI,IAAKrB,KAAK+F,EAAG/F,KAAKgG,IAE9FklB,GAAgBpB,IAAM,WACpB,OAAOqB,GAAWnrB,KAAKuJ,EAAGvJ,KAAK+F,EAAG/F,KAAKgG,IAqBzC1H,EAAGwrB,IAAMO,GAUT,IAAIqB,GAAkBrB,GAAOvnB,UAAY,IAAI2mB,GAoB7C,SAASkC,GAAW/rB,GAClB,OAAOA,EAAI,GAAK,IAAMC,KAAK4C,IAAI,EAAG7C,GAAGiqB,SAAS,IAAMhqB,KAAKiS,IAAI,IAAKlS,GAAGiqB,SAAS,IAEhF,SAASF,GAAaiC,EAAQ9B,EAAKC,GACjC,IAAyBG,EAAIC,EAAI3rB,EAA7BiD,EAAI,EAAGhB,EAAI,EAAGuF,EAAI,EAEtB,GADAkkB,EAAK,mBAAmB2B,KAAKD,EAASA,EAAOpjB,eAG3C,OADA2hB,EAAKD,EAAG,GAAG3O,MAAM,KACT2O,EAAG,IACV,IAAK,MAEF,OAAOH,EAAI+B,WAAW3B,EAAG,IAAK2B,WAAW3B,EAAG,IAAM,IAAK2B,WAAW3B,EAAG,IAAM,KAG9E,IAAK,MAEF,OAAOL,EAAIiC,GAAmB5B,EAAG,IAAK4B,GAAmB5B,EAAG,IAAK4B,GAAmB5B,EAAG,KAI7F,OAAI3rB,EAAQwtB,GAAajd,IAAI6c,IACpB9B,EAAItrB,EAAMiD,EAAGjD,EAAMiC,EAAGjC,EAAMwH,IAEvB,MAAV4lB,GAAuC,MAArBA,EAAOtV,OAAO,IAAehF,MAAM9S,EAAQ6I,SAASukB,EAAOtc,MAAM,GAAI,OACnE,IAAlBsc,EAAO5f,QACTvK,GAAa,KAARjD,IAAiB,EACtBiD,GAAIA,GAAK,EACThB,EAAY,IAARjC,EACJiC,GAAIA,GAAK,EACTuF,EAAY,GAARxH,EACJwH,GAAIA,GAAK,GACkB,IAAlB4lB,EAAO5f,SAChBvK,GAAa,SAARjD,IAAqB,GAC1BiC,GAAa,MAARjC,IAAkB,EACvBwH,EAAY,IAARxH,IAGDsrB,EAAIroB,EAAGhB,EAAGuF,IAEnB,SAAS4jB,GAAWnoB,EAAGhB,EAAGuF,GACxB,IAA0FU,EAAG+C,EAAzFqI,EAAMjS,KAAKiS,IAAIrQ,GAAK,IAAKhB,GAAK,IAAKuF,GAAK,KAAMvD,EAAM5C,KAAK4C,IAAIhB,EAAGhB,EAAGuF,GAAI3G,EAAIoD,EAAMqP,EAAWvI,GAAK9G,EAAMqP,GAAO,EASlH,OARIzS,GACFoK,EAAIF,EAAI,GAAKlK,GAAKoD,EAAMqP,GAAOzS,GAAK,EAAIoD,EAAMqP,GAChCpL,EAAVjF,GAAKgB,GAAUhC,EAAIuF,GAAK3G,GAAKoB,EAAIuF,EAAI,EAAI,GAAavF,GAAKgC,GAAUuD,EAAIvE,GAAKpC,EAAI,GAAaoC,EAAIhB,GAAKpB,EAAI,EAChHqH,GAAK,KAELA,EAAIyK,IACJ1H,EAAIF,EAAI,GAAKA,EAAI,EAAI,EAAI7C,GAEpB,IAAIgjB,GAAOhjB,EAAG+C,EAAGF,GAE1B,SAASkhB,GAAWhpB,EAAGhB,EAAGuF,GAIxB,IAAIhE,EAAIupB,IAAY,UAHpB9pB,EAAIwqB,GAAWxqB,IAGoB,UAFnChB,EAAIwrB,GAAWxrB,IAEmC,UADlDuF,EAAIimB,GAAWjmB,KAlHF,QAmHgE/E,EAAIsqB,IAAY,SAAW9pB,EAAI,SAAWhB,EAAI,QAAUuF,GAnHrG,GAoHhC,OAAOwkB,GAAO,IAAMvpB,EAAI,GAAI,KAAOe,EAAIf,GAAI,KAAOA,EADuGsqB,IAAY,SAAW9pB,EAAI,QAAUhB,EAAI,SAAWuF,GAnH/J,WAsHhD,SAASimB,GAAWxqB,GAClB,OAAQA,GAAK,MAAQ,OAASA,EAAI,MAAQ5B,KAAKqnB,KAAKzlB,EAAI,MAAQ,MAAO,KAEzE,SAASsqB,GAAmBjmB,GAC1B,IAAI9E,EAAI8qB,WAAWhmB,GACnB,MAAkC,MAA3BA,EAAEwQ,OAAOxQ,EAAEkG,OAAS,GAAanM,KAAKC,MAAU,KAAJkB,GAAYA,EAlFjE0qB,GAAgBhB,SAAW,SAASrpB,GAClCA,EAAIxB,KAAKqnB,IAAI,GAAI1c,UAAUwB,OAAS3K,EAAI,GACxC,IAAII,EAAIzB,KAAKyB,EAAGhB,EAAIT,KAAKS,EAAGuF,EAAIhG,KAAKgG,EAAGrG,EAAI,GAC5C,OAAK8B,GAAMhB,GAAMuF,GACbvE,GAAKA,EAAI9B,IAAG8B,EAAI9B,GAChBc,GAAKA,EAAId,IAAGc,EAAId,GAChBqG,GAAKA,EAAIrG,IAAGqG,EAAIrG,GACb,IAAI0qB,GAAOxqB,KAAKiS,IAAI,IAAKrQ,EAAIJ,GAAIxB,KAAKiS,IAAI,IAAKrR,EAAIY,GAAIxB,KAAKiS,IAAI,IAAK9L,EAAI3E,KAJrD,IAAIgpB,GAAO1qB,EAAGA,EAAGA,IAM9C+rB,GAAgBf,OAAS,SAAStpB,GAEhC,OAAO,IAAIgpB,IADXhpB,EAAIxB,KAAKqnB,IAAI,GAAI1c,UAAUwB,OAAS3K,EAAI,IAClBrB,KAAKyB,EAAGJ,EAAIrB,KAAKS,EAAGY,EAAIrB,KAAKgG,IAErD0lB,GAAgB3B,IAAM,WACpB,OAAOH,GAAW5pB,KAAKyB,EAAGzB,KAAKS,EAAGT,KAAKgG,IAEzC0lB,GAAgB7B,SAAW,WACzB,MAAO,IAAM8B,GAAW3rB,KAAKyB,GAAKkqB,GAAW3rB,KAAKS,GAAKkrB,GAAW3rB,KAAKgG,IAmEzE,IAAIgmB,GAAe1tB,EAAGyV,IAAI,CACxBmY,UAAW,SACXC,aAAc,SACdC,KAAM,MACNC,WAAY,QACZC,MAAO,SACPC,MAAO,SACPC,OAAQ,SACRC,MAAO,EACPC,eAAgB,SAChBC,KAAM,IACNC,WAAY,QACZC,MAAO,SACPC,UAAW,SACXC,UAAW,QACXC,WAAY,QACZC,UAAW,SACXC,MAAO,SACPC,eAAgB,QAChBC,SAAU,SACVC,QAAS,SACTC,KAAM,MACNC,SAAU,IACVC,SAAU,MACVC,cAAe,SACfC,SAAU,SACVC,UAAW,MACXC,SAAU,SACVC,UAAW,SACXC,YAAa,QACbC,eAAgB,QAChBC,WAAY,SACZC,WAAY,SACZC,QAAS,QACTC,WAAY,SACZC,aAAc,QACdC,cAAe,QACfC,cAAe,QACfC,cAAe,QACfC,cAAe,MACfC,WAAY,QACZC,SAAU,SACVC,YAAa,MACbC,QAAS,QACTC,QAAS,QACTC,WAAY,QACZC,UAAW,SACXC,YAAa,SACbC,YAAa,QACbC,QAAS,SACTC,UAAW,SACXC,WAAY,SACZC,KAAM,SACNC,UAAW,SACXC,KAAM,QACNC,MAAO,MACPC,YAAa,SACbC,KAAM,QACNC,SAAU,SACVC,QAAS,SACTC,UAAW,SACXC,OAAQ,QACRC,MAAO,SACPC,MAAO,SACPC,SAAU,SACVC,cAAe,SACfC,UAAW,QACXC,aAAc,SACdC,UAAW,SACXC,WAAY,SACZC,UAAW,SACXC,qBAAsB,SACtBC,UAAW,SACXC,WAAY,QACZC,UAAW,SACXC,UAAW,SACXC,YAAa,SACbC,cAAe,QACfC,aAAc,QACdC,eAAgB,QAChBC,eAAgB,QAChBC,eAAgB,SAChBC,YAAa,SACbC,KAAM,MACNC,UAAW,QACXC,MAAO,SACPC,QAAS,SACTC,OAAQ,QACRC,iBAAkB,QAClBC,WAAY,IACZC,aAAc,SACdC,aAAc,QACdC,eAAgB,QAChBC,gBAAiB,QACjBC,kBAAmB,MACnBC,gBAAiB,QACjBC,gBAAiB,SACjBC,aAAc,QACdC,UAAW,SACXC,UAAW,SACXC,SAAU,SACVC,YAAa,SACbC,KAAM,IACNC,QAAS,SACTC,MAAO,QACPC,UAAW,QACXC,OAAQ,SACRC,UAAW,SACXC,OAAQ,SACRC,cAAe,SACfC,UAAW,SACXC,cAAe,SACfC,cAAe,SACfC,WAAY,SACZC,UAAW,SACXC,KAAM,SACNC,KAAM,SACNC,KAAM,SACNC,WAAY,SACZC,OAAQ,QACRC,cAAe,QACfC,IAAK,SACLC,UAAW,SACXC,UAAW,QACXC,YAAa,QACbC,OAAQ,SACRC,WAAY,SACZC,SAAU,QACVC,SAAU,SACVC,OAAQ,SACRC,OAAQ,SACRC,QAAS,QACTC,UAAW,QACXC,UAAW,QACXC,UAAW,QACXC,KAAM,SACNC,YAAa,MACbC,UAAW,QACXC,IAAK,SACLC,KAAM,MACNC,QAAS,SACTC,OAAQ,SACRC,UAAW,QACXC,OAAQ,SACRC,MAAO,SACPC,MAAO,SACPC,WAAY,SACZC,OAAQ,SACRC,YAAa,WAKf,SAASC,GAAW11B,GAClB,MAAoB,mBAANA,EAAmBA,EAAI,WACnC,OAAOA,GAKX,SAAS21B,GAAWC,GAClB,OAAO,SAASvwB,EAAKwwB,EAAU1tB,GAG7B,OAFyB,IAArByC,UAAUwB,QAAoC,mBAAbypB,IAAyB1tB,EAAW0tB,EACzEA,EAAW,MACJC,GAAOzwB,EAAKwwB,EAAUD,EAAUztB,IAG3C,SAAS2tB,GAAOzwB,EAAKwwB,EAAUD,EAAUztB,GACvC,IAAI4tB,EAAM,GAAI9d,EAAWvZ,EAAGuZ,SAAS,aAAc,WAAY,OAAQ,SAAU+d,EAAU,GAAIC,EAAU,IAAIC,eAAkBC,EAAe,KAK9I,SAASC,IACP,IAA6BC,EAAzBC,EAASL,EAAQK,OACrB,IAAKA,GAwET,SAA2BL,GACzB,IAAI7wB,EAAO6wB,EAAQE,aACnB,OAAO/wB,GAAiB,SAATA,EAAkB6wB,EAAQL,SAAWK,EAAQM,aA1E3CC,CAAkBP,IAAYK,GAAU,KAAOA,EAAS,KAAkB,MAAXA,EAAgB,CAC5F,IACED,EAAST,EAASvmB,KAAK0mB,EAAKE,GAC5B,MAAOxsB,GAEP,YADAwO,EAASxH,MAAMpB,KAAK0mB,EAAKtsB,GAG3BwO,EAASwe,KAAKpnB,KAAK0mB,EAAKM,QAExBpe,EAASxH,MAAMpB,KAAK0mB,EAAKE,GAwD7B,OAvEI71B,KAAKs2B,kBAAoB,oBAAqBT,IAAY,oBAAoBzuB,KAAKnC,KAAM4wB,EAAU,IAAIS,gBAC3G,WAAYT,EAAUA,EAAQU,OAASV,EAAQW,QAAUR,EAAUH,EAAQY,mBAAqB,WAC9FZ,EAAQa,WAAa,GAAKV,KAgB5BH,EAAQc,WAAa,SAAS3e,GAC5B,IAAIxW,EAAIlD,EAAG0Z,MACX1Z,EAAG0Z,MAAQA,EACX,IACEH,EAAS+e,SAAS3nB,KAAK0mB,EAAKE,GAC5B,QACAv3B,EAAG0Z,MAAQxW,IAGfm0B,EAAIkB,OAAS,SAASvwB,EAAMlH,GAE1B,OADAkH,GAAQA,EAAO,IAAIkC,cACfgC,UAAUwB,OAAS,EAAU4pB,EAAQtvB,IAC5B,MAATlH,SAAsBw2B,EAAQtvB,GAAYsvB,EAAQtvB,GAAQlH,EAAQ,GAC/Du2B,IAETA,EAAIF,SAAW,SAASr2B,GACtB,OAAKoL,UAAUwB,QACfypB,EAAoB,MAATr2B,EAAgB,KAAOA,EAAQ,GACnCu2B,GAFuBF,GAIhCE,EAAII,aAAe,SAAS32B,GAC1B,OAAKoL,UAAUwB,QACf+pB,EAAe32B,EACRu2B,GAFuBI,GAIhCJ,EAAIH,SAAW,SAASp2B,GAEtB,OADAo2B,EAAWp2B,EACJu2B,GAET,CAAE,MAAO,QAASrgB,SAAQ,SAASrP,GACjC0vB,EAAI1vB,GAAU,WACZ,OAAO0vB,EAAImB,KAAKvsB,MAAMorB,EAAK,CAAE1vB,GAASkS,OAAO5I,EAAS/E,iBAG1DmrB,EAAImB,KAAO,SAAS7wB,EAAQzG,EAAMuI,GAIhC,GAHyB,IAArByC,UAAUwB,QAAgC,mBAATxM,IAAqBuI,EAAWvI,EAAMA,EAAO,MAClFq2B,EAAQkB,KAAK9wB,EAAQhB,GAAK,GACV,MAAZwwB,GAAsB,WAAYG,IAAUA,EAAgB,OAAIH,EAAW,QAC3EI,EAAQmB,iBAAkB,IAAK,IAAI1wB,KAAQsvB,EAASC,EAAQmB,iBAAiB1wB,EAAMsvB,EAAQtvB,IAQ/F,OAPgB,MAAZmvB,GAAoBI,EAAQoB,kBAAkBpB,EAAQoB,iBAAiBxB,GACvD,MAAhBM,IAAsBF,EAAQE,aAAeA,GACjC,MAAZhuB,GAAkB4tB,EAAIh1B,GAAG,QAASoH,GAAUpH,GAAG,QAAQ,SAASk1B,GAClE9tB,EAAS,KAAM8tB,MAEjBhe,EAASqf,WAAWjoB,KAAK0mB,EAAKE,GAC9BA,EAAQiB,KAAa,MAARt3B,EAAe,KAAOA,GAC5Bm2B,GAETA,EAAIwB,MAAQ,WAEV,OADAtB,EAAQsB,QACDxB,GAETr3B,EAAGmZ,OAAOke,EAAK9d,EAAU,MACN,MAAZ9P,EAAmB4tB,EAAMA,EAAI5mB,IAEtC,SAA4BhH,GAC1B,OAA2B,IAApBA,EAASiE,OAAe,SAASqE,EAAOwlB,GAC7C9tB,EAAkB,MAATsI,EAAgBwlB,EAAU,OACjC9tB,EALoCqvB,CAAmBrvB,IA1F7DikB,GAAa1W,SAAQ,SAAStB,EAAK5U,GACjC4sB,GAAazW,IAAIvB,EAAKwX,GAAapsB,OAOrCd,EAAG+4B,QAAU/B,GACbh3B,EAAGq3B,IAAMJ,GAAWrf,GA4FpB5X,EAAGg5B,IAAM,SAASC,EAAW9B,GAC3B,IAAI+B,EAAW,IAAInc,OAAO,KAAOkc,EAAY,OAAQE,EAAgBF,EAAUG,WAAW,GAC1F,SAASJ,EAAIryB,EAAK2O,EAAK7L,GACjByC,UAAUwB,OAAS,IAAGjE,EAAW6L,EAAKA,EAAM,MAChD,IAAI+hB,EAAMD,GAAOzwB,EAAKwwB,EAAiB,MAAP7hB,EAAc4hB,EAAWmC,EAAc/jB,GAAM7L,GAI7E,OAHA4tB,EAAI/hB,IAAM,SAASiB,GACjB,OAAOrK,UAAUwB,OAAS2pB,EAAIH,SAAsB,OAAZ5hB,EAAMiB,GAAa2gB,EAAWmC,EAAc9iB,IAAMjB,GAErF+hB,EAET,SAASH,EAASK,GAChB,OAAOyB,EAAIM,MAAM/B,EAAQM,cAE3B,SAASwB,EAAc32B,GACrB,OAAO,SAAS60B,GACd,OAAOyB,EAAIM,MAAM/B,EAAQM,aAAcn1B,IA+E3C,SAAS62B,EAAUjkB,GACjB,OAAOA,EAAIG,IAAI+jB,GAAaC,KAAKR,GAEnC,SAASO,EAAYx3B,GACnB,OAAOk3B,EAASpwB,KAAK9G,GAAQ,IAAMA,EAAKiI,QAAQ,MAAO,MAAQ,IAAMjI,EAEvE,OAlFAg3B,EAAIM,MAAQ,SAASt3B,EAAMU,GACzB,IAAIQ,EACJ,OAAO81B,EAAIU,UAAU13B,GAAM,SAASsT,EAAKjU,GACvC,GAAI6B,EAAG,OAAOA,EAAEoS,EAAKjU,EAAI,GACzB,IAAIoG,EAAI,IAAIkyB,SAAS,IAAK,WAAarkB,EAAIG,KAAI,SAASzN,EAAM3G,GAC5D,OAAOu4B,KAAKC,UAAU7xB,GAAQ,OAAS3G,EAAI,OAC1Co4B,KAAK,KAAO,KACfv2B,EAAIR,EAAI,SAAS4S,EAAKjU,GACpB,OAAOqB,EAAE+E,EAAE6N,GAAMjU,IACfoG,MAGRuxB,EAAIU,UAAY,SAAS13B,EAAMU,GAC7B,IAAkEG,EAAGi3B,EAAjEC,EAAM,GAAIC,EAAM,GAAIC,EAAO,GAAIC,EAAIl4B,EAAK0L,OAAQysB,EAAI,EAAGn3B,EAAI,EAC/D,SAASo3B,IACP,GAAID,GAAKD,EAAG,OAAOF,EACnB,GAAIF,EAAK,OAAOA,GAAM,EAAOC,EAC7B,IAAIz2B,EAAI62B,EACR,GAA2B,KAAvBn4B,EAAKo3B,WAAW91B,GAAW,CAE7B,IADA,IAAIjC,EAAIiC,EACDjC,IAAM64B,GACX,GAA2B,KAAvBl4B,EAAKo3B,WAAW/3B,GAAW,CAC7B,GAA+B,KAA3BW,EAAKo3B,WAAW/3B,EAAI,GAAW,QACjCA,EAWN,OARA84B,EAAI94B,EAAI,EAEE,MADNmG,EAAIxF,EAAKo3B,WAAW/3B,EAAI,KAE1By4B,GAAM,EACyB,KAA3B93B,EAAKo3B,WAAW/3B,EAAI,MAAa84B,GACtB,KAAN3yB,IACTsyB,GAAM,GAED93B,EAAKgP,MAAM1N,EAAI,EAAGjC,GAAG4I,QAAQ,MAAO,KAE7C,KAAOkwB,EAAID,GAAG,CACZ,IAAI1yB,EAA0BzE,EAAI,EAClC,GAAU,MADNyE,EAAIxF,EAAKo3B,WAAWe,MACVL,GAAM,OAAW,GAAU,KAANtyB,EACjCsyB,GAAM,EACqB,KAAvB93B,EAAKo3B,WAAWe,OAAaA,IAAKp3B,QACjC,GAAIyE,IAAM2xB,EAAe,SAChC,OAAOn3B,EAAKgP,MAAM1N,EAAG62B,EAAIp3B,GAE3B,OAAOf,EAAKgP,MAAM1N,GAEpB,MAAQT,EAAIu3B,OAAaJ,GAAK,CAE5B,IADA,IAAIvyB,EAAI,GACD5E,IAAMk3B,GAAOl3B,IAAMm3B,GACxBvyB,EAAE+B,KAAK3G,GACPA,EAAIu3B,IAEF13B,GAAwB,OAAlB+E,EAAI/E,EAAE+E,EAAGzE,OACnBi3B,EAAKzwB,KAAK/B,GAEZ,OAAOwyB,GAETjB,EAAI1L,OAAS,SAAS2M,GACpB,GAAItoB,MAAMuF,QAAQ+iB,EAAK,IAAK,OAAOjB,EAAIqB,WAAWJ,GAClD,IAAIK,EAAW,IAAI3iB,EAAU4iB,EAAS,GAQtC,OAPAN,EAAKjjB,SAAQ,SAAS1B,GACpB,IAAK,IAAIklB,KAASllB,EACXglB,EAASliB,IAAIoiB,IAChBD,EAAO/wB,KAAK8wB,EAAS9sB,IAAIgtB,OAIxB,CAAED,EAAO9kB,IAAI+jB,GAAaC,KAAKR,IAAapf,OAAOogB,EAAKxkB,KAAI,SAASH,GAC1E,OAAOilB,EAAO9kB,KAAI,SAAS+kB,GACzB,OAAOhB,EAAYlkB,EAAIklB,OACtBf,KAAKR,OACNQ,KAAK,OAEXT,EAAIqB,WAAa,SAASJ,GACxB,OAAOA,EAAKxkB,IAAI8jB,GAAWE,KAAK,OAQ3BT,GAETh5B,EAAGy6B,IAAMz6B,EAAGg5B,IAAI,IAAK,YACrBh5B,EAAG06B,IAAM16B,EAAGg5B,IAAI,KAAK,6BACrB,IAAI2B,GAAoBC,GAAoBC,GAAmBC,GAAkBC,GAAiBr5B,KAAKqW,EAAgBrW,KAAM,2BAA6B,SAAS+H,GACjKmB,WAAWnB,EAAU,KAKvB,SAASuxB,GAASvxB,EAAUwxB,EAAOC,GACjC,IAAIl4B,EAAIkJ,UAAUwB,OACd1K,EAAI,IAAGi4B,EAAQ,GACfj4B,EAAI,IAAGk4B,EAAOtpB,KAAKC,OACvB,IAAIspB,EAAOD,EAAOD,EAAOG,EAAQ,CAC/B5zB,EAAGiC,EACH5G,EAAGs4B,EACHn4B,EAAG,MASL,OAPI43B,GAAoBA,GAAmB53B,EAAIo4B,EAAYT,GAAqBS,EAChFR,GAAqBQ,EAChBP,KACHC,GAAmBnvB,aAAamvB,IAChCD,GAAoB,EACpBE,GAAeM,KAEVD,EAET,SAASC,KACP,IAAIxpB,EAAMypB,KAAiBL,EAAQM,KAAmB1pB,EAClDopB,EAAQ,IACNO,SAASP,KACXtvB,aAAamvB,IACbA,GAAmBlwB,WAAWywB,GAAeJ,IAE/CJ,GAAoB,IAEpBA,GAAoB,EACpBE,GAAeM,KAOnB,SAASC,KAEP,IADA,IAAIzpB,EAAMD,KAAKC,MAAOupB,EAAQT,GACvBS,GACDvpB,GAAOupB,EAAMv4B,GAAKu4B,EAAM5zB,EAAEqK,EAAMupB,EAAMv4B,KAAIu4B,EAAM5zB,EAAI,MACxD4zB,EAAQA,EAAMp4B,EAEhB,OAAO6O,EAET,SAAS0pB,KAEP,IADA,IAAIE,EAAIC,EAAKf,GAAoBQ,EAAOtkB,IACjC6kB,GACDA,EAAGl0B,GACDk0B,EAAG74B,EAAIs4B,IAAMA,EAAOO,EAAG74B,GAC3B64B,GAAMD,EAAKC,GAAI14B,GAEf04B,EAAKD,EAAKA,EAAGz4B,EAAI04B,EAAG14B,EAAI23B,GAAqBe,EAAG14B,EAIpD,OADA43B,GAAqBa,EACdN,EAET,SAASQ,GAAoBj4B,EAAGN,GAC9B,OAAOA,GAAKM,EAAInC,KAAKipB,KAAKjpB,KAAKklB,IAAI/iB,GAAKnC,KAAKq6B,MAAQ,GA5DvD57B,EAAGo7B,MAAQ,WACTJ,GAAS/uB,MAAMvK,KAAMwK,YAiCvBlM,EAAGo7B,MAAMS,MAAQ,WACfP,KACAC,MA0BFv7B,EAAGwB,MAAQ,SAASkC,EAAGV,GACrB,OAAOA,EAAIzB,KAAKC,MAAMkC,GAAKV,EAAIzB,KAAKqnB,IAAI,GAAI5lB,KAAOA,EAAIzB,KAAKC,MAAMkC,IAEpE,IAAIo4B,GAAoB,CAAE,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAMrmB,KAW/G,SAAyB1U,EAAGM,GAC1B,IAAI0B,EAAIxB,KAAKqnB,IAAI,GAAiB,EAAb9S,EAAI,EAAIzU,IAC7B,MAAO,CACLlB,MAAOkB,EAAI,EAAI,SAASN,GACtB,OAAOA,EAAIgC,GACT,SAAShC,GACX,OAAOA,EAAIgC,GAEbgE,OAAQhG,MAGZ,SAASg7B,GAAuBC,GAC9B,IAAIC,EAAiBD,EAAOE,QAASC,EAAmBH,EAAOI,UAAWC,EAAkBL,EAAOM,SAAUC,EAAkBP,EAAOQ,SAAUC,EAAcJ,GAAmBF,EAAmB,SAASr7B,EAAO0F,GAElN,IADA,IAAInF,EAAIP,EAAM4M,OAAQ7K,EAAI,GAAIS,EAAI,EAAGnB,EAAIk6B,EAAgB,GAAI3uB,EAAS,EAC/DrM,EAAI,GAAKc,EAAI,IACduL,EAASvL,EAAI,EAAIqE,IAAOrE,EAAIZ,KAAK4C,IAAI,EAAGqC,EAAQkH,IACpD7K,EAAE2G,KAAK1I,EAAM47B,UAAUr7B,GAAKc,EAAGd,EAAIc,OAC9BuL,GAAUvL,EAAI,GAAKqE,KACxBrE,EAAIk6B,EAAgB/4B,GAAKA,EAAI,GAAK+4B,EAAgB3uB,QAEpD,OAAO7K,EAAE85B,UAAUlD,KAAK0C,IACtBvkB,EACJ,OAAO,SAASglB,GACd,IAAIhc,EAAQic,GAAatP,KAAKqP,GAAYv2B,EAAOua,EAAM,IAAM,IAAK3a,EAAQ2a,EAAM,IAAM,IAAKkc,EAAOlc,EAAM,IAAM,IAAK7Z,EAAS6Z,EAAM,IAAM,GAAImc,EAAQnc,EAAM,GAAIpa,GAASoa,EAAM,GAAIoc,EAAQpc,EAAM,GAAIqc,EAAYrc,EAAM,GAAIla,EAAOka,EAAM,GAAIzgB,EAAQ,EAAGoe,EAAS,GAAI2e,EAAS,GAAIC,GAAU,EAAOC,GAAW,EAM3S,OALIH,IAAWA,GAAaA,EAAUP,UAAU,KAC5CK,GAAkB,MAAT12B,GAA0B,MAAVJ,KAC3B82B,EAAQ12B,EAAO,IACfJ,EAAQ,KAEFS,GACP,IAAK,IACJs2B,GAAQ,EACRt2B,EAAO,IACP,MAED,IAAK,IACJvG,EAAQ,IACR+8B,EAAS,IACTx2B,EAAO,IACP,MAED,IAAK,IACJvG,EAAQ,IACR+8B,EAAS,IACTx2B,EAAO,IACP,MAED,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACW,MAAXK,IAAgBwX,EAAS,IAAM7X,EAAKwD,eAEzC,IAAK,IACJkzB,GAAW,EAEZ,IAAK,IACJD,GAAU,EACVF,EAAY,EACZ,MAED,IAAK,IACJ98B,GAAS,EACTuG,EAAO,IAGM,MAAXK,IAAgBwX,EAASge,EAAgB,GAAIW,EAASX,EAAgB,IAC9D,KAAR71B,GAAgBu2B,IAAWv2B,EAAO,KACrB,MAAbu2B,IACU,KAARv2B,EAAau2B,EAAY17B,KAAK4C,IAAI,EAAG5C,KAAKiS,IAAI,GAAIypB,IAA8B,KAARv2B,GAAuB,KAARA,IAAau2B,EAAY17B,KAAK4C,IAAI,EAAG5C,KAAKiS,IAAI,GAAIypB,MAE/Iv2B,EAAO22B,GAAgB5sB,IAAI/J,IAAS42B,GACpC,IAAIC,EAASR,GAASC,EACtB,OAAO,SAASl8B,GACd,IAAI08B,EAAaN,EACjB,GAAIC,GAAWr8B,EAAQ,EAAG,MAAO,GACjC,IAAI28B,EAAW38B,EAAQ,GAAe,IAAVA,GAAe,EAAIA,EAAQ,GAAKA,GAASA,EAAO,KAAgB,MAATg8B,EAAe,GAAKA,EACvG,GAAI38B,EAAQ,EAAG,CACb,IAAIu9B,EAAO19B,EAAG29B,aAAa78B,EAAOm8B,GAClCn8B,EAAQ48B,EAAKv9B,MAAMW,GACnB08B,EAAaE,EAAK32B,OAASm2B,OAE3Bp8B,GAASX,EAGX,IAAgC6e,EAAQ4e,EAApCv8B,GADJP,EAAQ4F,EAAK5F,EAAOm8B,IACNY,YAAY,KAC1B,GAAIx8B,EAAI,EAAG,CACT,IAAIiC,EAAI85B,EAAWt8B,EAAM+8B,YAAY,MAAQ,EACzCv6B,EAAI,GAAG0b,EAASle,EAAO88B,EAAQ,KAAS5e,EAASle,EAAM47B,UAAU,EAAGp5B,GAAIs6B,EAAQ98B,EAAM47B,UAAUp5B,SAEpG0b,EAASle,EAAM47B,UAAU,EAAGr7B,GAC5Bu8B,EAAQ3B,EAAiBn7B,EAAM47B,UAAUr7B,EAAI,IAE1C07B,GAASC,IAAOhe,EAASyd,EAAYzd,EAAQnI,MAClD,IAAInJ,EAAS6Q,EAAO7Q,OAASsR,EAAOtR,OAASkwB,EAAMlwB,QAAU6vB,EAAS,EAAIE,EAAS/vB,QAASpI,EAAUoI,EAASlH,EAAQ,IAAImL,MAAMjE,EAASlH,EAAQkH,EAAS,GAAG+rB,KAAKpzB,GAAQ,GAI3K,OAHIk3B,IAAQve,EAASyd,EAAYn3B,EAAU0Z,EAAQ1Z,EAAQoI,OAASlH,EAAQo3B,EAAMlwB,OAASmJ,MAC3F4mB,GAAYlf,EACZzd,EAAQke,EAAS4e,GACC,MAAV33B,EAAgBw3B,EAAW38B,EAAQwE,EAAoB,MAAVW,EAAgBX,EAAUm4B,EAAW38B,EAAkB,MAAVmF,EAAgBX,EAAQo3B,UAAU,EAAGhvB,IAAW,GAAK+vB,EAAW38B,EAAQwE,EAAQo3B,UAAUhvB,GAAU+vB,GAAYF,EAASz8B,EAAQwE,EAAUxE,IAAU08B,IA5G7Px9B,EAAG29B,aAAe,SAAS78B,EAAOm8B,GAChC,IAAI57B,EAAI,EAOR,OANIP,GAASA,KACPA,EAAQ,IAAGA,IAAU,GACrBm8B,IAAWn8B,EAAQd,EAAGwB,MAAMV,EAAO66B,GAAoB76B,EAAOm8B,KAClE57B,EAAI,EAAIE,KAAKwS,MAAM,MAAQxS,KAAKklB,IAAI3lB,GAASS,KAAKq6B,MAClDv6B,EAAIE,KAAK4C,KAAK,GAAI5C,KAAKiS,IAAI,GAA8B,EAA1BjS,KAAKwS,OAAO1S,EAAI,GAAK,MAE/Cy6B,GAAkB,EAAIz6B,EAAI,IAwGnC,IAAIw7B,GAAe,yEACfQ,GAAkBr9B,EAAGyV,IAAI,CAC3B/N,EAAG,SAAShE,GACV,OAAOA,EAAE6nB,SAAS,IAEpB/jB,EAAG,SAAS9D,GACV,OAAOo6B,OAAOC,aAAar6B,IAE7BR,EAAG,SAASQ,GACV,OAAOA,EAAE6nB,SAAS,IAEpB7nB,EAAG,SAASA,GACV,OAAOA,EAAE6nB,SAAS,KAEpByS,EAAG,SAASt6B,GACV,OAAOA,EAAE6nB,SAAS,IAAItT,eAExB9V,EAAG,SAASuB,EAAGN,GACb,OAAOM,EAAEu6B,YAAY76B,IAEvB2H,EAAG,SAASrH,EAAGN,GACb,OAAOM,EAAEw6B,cAAc96B,IAEzBV,EAAG,SAASgB,EAAGN,GACb,OAAOM,EAAEy6B,QAAQ/6B,IAEnBD,EAAG,SAASO,EAAGN,GACb,OAAQM,EAAI1D,EAAGwB,MAAMkC,EAAGi4B,GAAoBj4B,EAAGN,KAAK+6B,QAAQ58B,KAAK4C,IAAI,EAAG5C,KAAKiS,IAAI,GAAImoB,GAAoBj4B,GAAK,EAAI,OAAQN,SAG9H,SAASk6B,GAAsB55B,GAC7B,OAAOA,EAAI,GAEb,IAAI06B,GAAUp+B,EAAGm7B,KAAO,GAAIkD,GAAUzsB,KACtC,SAAS0sB,KACP58B,KAAK6U,EAAI,IAAI3E,KAAK1F,UAAUwB,OAAS,EAAIkE,KAAK2sB,IAAItyB,MAAMvK,KAAMwK,WAAaA,UAAU,IAEvFoyB,GAAY95B,UAAY,CACtBg6B,QAAS,WACP,OAAO98B,KAAK6U,EAAEkoB,cAEhBC,OAAQ,WACN,OAAOh9B,KAAK6U,EAAEooB,aAEhBC,YAAa,WACX,OAAOl9B,KAAK6U,EAAEsoB,kBAEhBC,SAAU,WACR,OAAOp9B,KAAK6U,EAAEwoB,eAEhBC,gBAAiB,WACf,OAAOt9B,KAAK6U,EAAE0oB,sBAEhBC,WAAY,WACV,OAAOx9B,KAAK6U,EAAE4oB,iBAEhBC,SAAU,WACR,OAAO19B,KAAK6U,EAAE8oB,eAEhBC,WAAY,WACV,OAAO59B,KAAK6U,EAAEgpB,iBAEhBC,QAAS,WACP,OAAO99B,KAAK6U,EAAEipB,WAEhBC,kBAAmB,WACjB,OAAO,GAETC,QAAS,WACP,OAAOh+B,KAAK6U,EAAEmpB,WAEhBC,QAAS,WACPC,GAAkBC,WAAW5zB,MAAMvK,KAAK6U,EAAGrK,YAE7C4zB,OAAQ,WACNF,GAAkBG,UAAU9zB,MAAMvK,KAAK6U,EAAGrK,YAE5C8zB,YAAa,WACXJ,GAAkBK,eAAeh0B,MAAMvK,KAAK6U,EAAGrK,YAEjDg0B,SAAU,WACRN,GAAkBO,YAAYl0B,MAAMvK,KAAK6U,EAAGrK,YAE9Ck0B,gBAAiB,WACfR,GAAkBS,mBAAmBp0B,MAAMvK,KAAK6U,EAAGrK,YAErDo0B,WAAY,WACVV,GAAkBW,cAAct0B,MAAMvK,KAAK6U,EAAGrK,YAEhDs0B,SAAU,WACRZ,GAAkBa,YAAYx0B,MAAMvK,KAAK6U,EAAGrK,YAE9Cw0B,WAAY,WACVd,GAAkBe,cAAc10B,MAAMvK,KAAK6U,EAAGrK,YAEhD00B,QAAS,WACPhB,GAAkBgB,QAAQ30B,MAAMvK,KAAK6U,EAAGrK,aAG5C,IAAI0zB,GAAoBhuB,KAAKpN,UAC7B,SAASq8B,GAAiBnuB,EAAOkE,EAAMkqB,GACrC,SAASt/B,EAAMu/B,GACb,IAAIC,EAAKtuB,EAAMquB,GAAOra,EAAKua,EAAOD,EAAI,GACtC,OAAOD,EAAOC,EAAKta,EAAKqa,EAAOC,EAAKta,EAEtC,SAAS8D,EAAKuW,GAEZ,OADAnqB,EAAKmqB,EAAOruB,EAAM,IAAI2rB,GAAQ0C,EAAO,IAAK,GACnCA,EAET,SAASE,EAAOF,EAAMh+B,GAEpB,OADA6T,EAAKmqB,EAAO,IAAI1C,IAAS0C,GAAOh+B,GACzBg+B,EAET,SAAStqB,EAAMglB,EAAIC,EAAIwF,GACrB,IAAI/F,EAAO3Q,EAAKiR,GAAK0F,EAAQ,GAC7B,GAAID,EAAK,EACP,KAAO/F,EAAOO,GACNoF,EAAO3F,GAAQ+F,GAAKC,EAAM33B,KAAK,IAAIoI,MAAMupB,IAC/CvkB,EAAKukB,EAAM,QAGb,KAAOA,EAAOO,GAAIyF,EAAM33B,KAAK,IAAIoI,MAAMupB,IAAQvkB,EAAKukB,EAAM,GAE5D,OAAOgG,EAYTzuB,EAAMqB,MAAQrB,EACdA,EAAMlR,MAAQA,EACdkR,EAAM8X,KAAOA,EACb9X,EAAMuuB,OAASA,EACfvuB,EAAM+D,MAAQA,EACd,IAAI2qB,EAAM1uB,EAAM0uB,IAAMC,GAAqB3uB,GAM3C,OALA0uB,EAAIrtB,MAAQqtB,EACZA,EAAI5/B,MAAQ6/B,GAAqB7/B,GACjC4/B,EAAI5W,KAAO6W,GAAqB7W,GAChC4W,EAAIH,OAASI,GAAqBJ,GAClCG,EAAI3qB,MApBJ,SAAmBglB,EAAIC,EAAIwF,GACzB,IACE7C,GAAUC,GACV,IAAI8C,EAAM,IAAI9C,GAEd,OADA8C,EAAI7qB,EAAIklB,EACDhlB,EAAM2qB,EAAK1F,EAAIwF,GACtB,QACA7C,GAAUzsB,OAcPc,EAET,SAAS2uB,GAAqB15B,GAC5B,OAAO,SAASo5B,EAAMh+B,GACpB,IACEs7B,GAAUC,GACV,IAAI8C,EAAM,IAAI9C,GAEd,OADA8C,EAAI7qB,EAAIwqB,EACDp5B,EAAOy5B,EAAKr+B,GAAGwT,EACtB,QACA8nB,GAAUzsB,OAoDhB,SAAS0vB,GAAqBtF,GAC5B,IAAIuF,EAAkBvF,EAAOwF,SAAUC,EAAczF,EAAO+E,KAAMW,EAAc1F,EAAOb,KAAMwG,EAAiB3F,EAAO4F,QAASC,EAAc7F,EAAO8F,KAAMC,EAAmB/F,EAAOgG,UAAWC,EAAgBjG,EAAOkG,OAAQC,EAAqBnG,EAAOoG,YACzP,SAASC,EAAeC,GACtB,IAAIt/B,EAAIs/B,EAAS50B,OACjB,SAAS4f,EAAOyT,GAEd,IADA,IAAgCv5B,EAAGpE,EAAGV,EAAlC6/B,EAAS,GAAIlhC,GAAK,EAAGiC,EAAI,IACpBjC,EAAI2B,GACoB,KAA3Bs/B,EAASlJ,WAAW/3B,KACtBkhC,EAAO/4B,KAAK84B,EAAStxB,MAAM1N,EAAGjC,IAC4B,OAArD+B,EAAIo/B,GAAmBh7B,EAAI86B,EAAStqB,SAAS3W,OAAcmG,EAAI86B,EAAStqB,SAAS3W,KAClFqB,EAAI+/B,EAAgBj7B,MAAIA,EAAI9E,EAAEq+B,EAAW,MAAL39B,EAAkB,MAANoE,EAAY,IAAM,IAAMpE,IAC5Em/B,EAAO/4B,KAAKhC,GACZlE,EAAIjC,EAAI,GAIZ,OADAkhC,EAAO/4B,KAAK84B,EAAStxB,MAAM1N,EAAGjC,IACvBkhC,EAAO9I,KAAK,IA2BrB,OAzBAnM,EAAOgM,MAAQ,SAASiJ,GACtB,IAAIxhC,EAAI,CACN4B,EAAG,KACHuI,EAAG,EACHnK,EAAG,EACH+S,EAAG,EACH4uB,EAAG,EACHzc,EAAG,EACH0c,EAAG,EACHC,EAAG,MAEL,GADOC,EAAc9hC,EAAGuhC,EAAUC,EAAQ,IACjCA,EAAO70B,OAAQ,OAAO,KAC3B,MAAO3M,IAAGA,EAAE+S,EAAI/S,EAAE+S,EAAI,GAAW,GAAN/S,EAAEqC,GACjC,IAAI0/B,EAAgB,MAAP/hC,EAAE6hC,GAAavE,KAAYC,GAAayC,EAAO,IAAK+B,EAASxE,GAAcD,IAOxF,MANI,MAAOt9B,EAAGggC,EAAKf,YAAYj/B,EAAE4B,EAAG,EAAG5B,EAAEuC,GAAa,MAAOvC,GAAK,MAAOA,GACjE,MAAOA,IAAIA,EAAE+J,EAAI,MAAO/J,EAAI,EAAI,GACtCggC,EAAKf,YAAYj/B,EAAE4B,EAAG,EAAG,GACzBo+B,EAAKf,YAAYj/B,EAAE4B,EAAG,EAAG,MAAO5B,GAAKA,EAAE+J,EAAI,GAAK,EAAU,EAAN/J,EAAEgiC,GAAShC,EAAKrC,SAAW,GAAK,EAAI39B,EAAE+J,EAAU,EAAN/J,EAAEiiC,GAASjC,EAAKrC,SAAW,GAAK,IACzHqC,EAAKf,YAAYj/B,EAAE4B,EAAG5B,EAAEmK,EAAGnK,EAAEA,GACpCggC,EAAKb,SAASn/B,EAAE+S,GAAK/S,EAAE6hC,EAAI,IAAM,GAAI7hC,EAAE2hC,EAAI3hC,EAAE6hC,EAAI,IAAK7hC,EAAEklB,EAAGllB,EAAE4hC,GACtDG,EAAS/B,EAAKxqB,EAAIwqB,GAE3BzT,EAAO/B,SAAW,WAChB,OAAO+W,GAEFhV,EAET,SAASuV,EAAc9B,EAAMuB,EAAUC,EAAQj/B,GAE7C,IADA,IAAIkE,EAAGpE,EAAGP,EAAGxB,EAAI,EAAG2B,EAAIs/B,EAAS50B,OAAQxC,EAAIq3B,EAAO70B,OAC7CrM,EAAI2B,GAAG,CACZ,GAAIM,GAAK4H,EAAG,OAAQ,EAEpB,GAAU,MADV1D,EAAI86B,EAASlJ,WAAW/3B,OAItB,GAFAwB,EAAIy/B,EAAStqB,OAAO3W,OACpB+B,EAAI6/B,EAAgBpgC,KAAK2/B,GAAqBF,EAAStqB,OAAO3W,KAAOwB,MAC1DS,EAAIF,EAAE29B,EAAMwB,EAAQj/B,IAAM,EAAG,OAAQ,OAC3C,GAAIkE,GAAK+6B,EAAOnJ,WAAW91B,KAChC,OAAQ,EAGZ,OAAOA,EAET++B,EAAejB,IAAM,SAASkB,GAC5B,IAAI5vB,EAAQ2vB,EAAeC,GAC3B,SAAShV,EAAOyT,GACd,IAEE,IAAIK,EAAM,IADV/C,GAAUC,IAGV,OADA8C,EAAI7qB,EAAIwqB,EACDruB,EAAM0uB,GACb,QACA/C,GAAUzsB,MAad,OAVA0b,EAAOgM,MAAQ,SAASiJ,GACtB,IACElE,GAAUC,GACV,IAAIyC,EAAOruB,EAAM4mB,MAAMiJ,GACvB,OAAOxB,GAAQA,EAAKxqB,EACpB,QACA8nB,GAAUzsB,OAGd0b,EAAO/B,SAAW7Y,EAAM6Y,SACjB+B,GAET+U,EAAea,MAAQb,EAAejB,IAAI8B,MAAQC,GAClD,IAAIC,EAAuBpjC,EAAGyV,MAAO4tB,EAAgBC,GAAiBzB,GAAc0B,EAAoBC,GAAqB3B,GAAc4B,EAAsBH,GAAiBvB,GAAmB2B,EAA0BF,GAAqBzB,GAAmB4B,EAAkBL,GAAiBrB,GAAgB2B,EAAsBJ,GAAqBvB,GAAgB4B,EAAwBP,GAAiBnB,GAAqB2B,EAA4BN,GAAqBrB,GACpeR,EAAe3qB,SAAQ,SAAS5T,EAAG/B,GACjC+hC,EAAqBnsB,IAAI7T,EAAE8G,cAAe7I,MAE5C,IAAIohC,EAAkB,CACpBh7B,EAAG,SAAS1G,GACV,OAAOghC,EAAiBhhC,EAAE29B,WAE5B97B,EAAG,SAAS7B,GACV,OAAO8gC,EAAY9gC,EAAE29B,WAEvBh3B,EAAG,SAAS3G,GACV,OAAOohC,EAAmBphC,EAAEq+B,aAE9B77B,EAAG,SAASxC,GACV,OAAOkhC,EAAclhC,EAAEq+B,aAEzB53B,EAAG66B,EAAed,GAClBxgC,EAAG,SAASA,EAAGqC,GACb,OAAO2gC,GAAkBhjC,EAAEy9B,UAAWp7B,EAAG,IAE3C2H,EAAG,SAAShK,EAAGqC,GACb,OAAO2gC,GAAkBhjC,EAAEy9B,UAAWp7B,EAAG,IAE3C0Q,EAAG,SAAS/S,EAAGqC,GACb,OAAO2gC,GAAkBhjC,EAAE+9B,WAAY17B,EAAG,IAE5C+2B,EAAG,SAASp5B,EAAGqC,GACb,OAAO2gC,GAAkBhjC,EAAE+9B,WAAa,IAAM,GAAI17B,EAAG,IAEvDE,EAAG,SAASvC,EAAGqC,GACb,OAAO2gC,GAAkB,EAAI3F,GAAQ4F,UAAUjjC,GAAIqC,EAAG,IAExDu/B,EAAG,SAAS5hC,EAAGqC,GACb,OAAO2gC,GAAkBhjC,EAAEi+B,kBAAmB57B,EAAG,IAEnD8H,EAAG,SAASnK,EAAGqC,GACb,OAAO2gC,GAAkBhjC,EAAEq+B,WAAa,EAAGh8B,EAAG,IAEhDs/B,EAAG,SAAS3hC,EAAGqC,GACb,OAAO2gC,GAAkBhjC,EAAEm+B,aAAc97B,EAAG,IAE9CA,EAAG,SAASrC,GACV,OAAO4gC,IAAiB5gC,EAAE+9B,YAAc,MAE1C7Y,EAAG,SAASllB,EAAGqC,GACb,OAAO2gC,GAAkBhjC,EAAEu+B,aAAcl8B,EAAG,IAE9C4/B,EAAG,SAASjiC,EAAGqC,GACb,OAAO2gC,GAAkB3F,GAAQ6F,aAAaljC,GAAIqC,EAAG,IAEvD0H,EAAG,SAAS/J,GACV,OAAOA,EAAE29B,UAEXqE,EAAG,SAAShiC,EAAGqC,GACb,OAAO2gC,GAAkB3F,GAAQ8F,aAAanjC,GAAIqC,EAAG,IAEvDM,EAAG2+B,EAAeZ,GAClBzD,EAAGqE,EAAeX,GAClB/+B,EAAG,SAAS5B,EAAGqC,GACb,OAAO2gC,GAAkBhjC,EAAE69B,cAAgB,IAAKx7B,EAAG,IAErD+gC,EAAG,SAASpjC,EAAGqC,GACb,OAAO2gC,GAAkBhjC,EAAE69B,cAAgB,IAAKx7B,EAAG,IAErDw/B,EAAGwB,GACH,IAAK,WACH,MAAO,MAGPnB,EAAkB,CACpBx7B,EAyBF,SAAoCs5B,EAAMwB,EAAQlhC,GAChDoiC,EAAoBlmB,UAAY,EAChC,IAAIva,EAAIygC,EAAoBlW,KAAKgV,EAAOvxB,MAAM3P,IAC9C,OAAO2B,GAAK+9B,EAAKj2B,EAAI44B,EAAwBjzB,IAAIzN,EAAE,GAAGkH,eAAgB7I,EAAI2B,EAAE,GAAG0K,SAAW,GA3B1F9K,EA6BF,SAA8Bm+B,EAAMwB,EAAQlhC,GAC1CgiC,EAAc9lB,UAAY,EAC1B,IAAIva,EAAIqgC,EAAc9V,KAAKgV,EAAOvxB,MAAM3P,IACxC,OAAO2B,GAAK+9B,EAAKj2B,EAAIy4B,EAAkB9yB,IAAIzN,EAAE,GAAGkH,eAAgB7I,EAAI2B,EAAE,GAAG0K,SAAW,GA/BpFhG,EAiCF,SAAkCq5B,EAAMwB,EAAQlhC,GAC9CwiC,EAAsBtmB,UAAY,EAClC,IAAIva,EAAI6gC,EAAsBtW,KAAKgV,EAAOvxB,MAAM3P,IAChD,OAAO2B,GAAK+9B,EAAK71B,EAAI44B,EAA0BrzB,IAAIzN,EAAE,GAAGkH,eAAgB7I,EAAI2B,EAAE,GAAG0K,SAAW,GAnC5FnK,EAqCF,SAA4Bw9B,EAAMwB,EAAQlhC,GACxCsiC,EAAgBpmB,UAAY,EAC5B,IAAIva,EAAI2gC,EAAgBpW,KAAKgV,EAAOvxB,MAAM3P,IAC1C,OAAO2B,GAAK+9B,EAAK71B,EAAI04B,EAAoBnzB,IAAIzN,EAAE,GAAGkH,eAAgB7I,EAAI2B,EAAE,GAAG0K,SAAW,GAvCtFlG,EAyCF,SAAiCu5B,EAAMwB,EAAQlhC,GAC7C,OAAOwhC,EAAc9B,EAAM0B,EAAgBj7B,EAAE+jB,WAAYgX,EAAQlhC,IAzCjEN,EAAGsjC,GACHt5B,EAAGs5B,GACHvwB,EAAGwwB,GACHnK,EAAGmK,GACHhhC,EAAGihC,GACH5B,EAAG6B,GACHt5B,EAAGu5B,GACH/B,EAAGgC,GACHthC,EAyCF,SAA2B29B,EAAMwB,EAAQlhC,GACvC,IAAI2B,EAAIogC,EAAqB3yB,IAAI8xB,EAAOvxB,MAAM3P,EAAGA,GAAK,GAAG6I,eACzD,OAAY,MAALlH,GAAa,GAAK+9B,EAAK39B,EAAIJ,EAAG3B,IA1CrC4kB,EAAG0e,GACH3B,EAAG4B,GACH95B,EAAG+5B,GACH9B,EAAG+B,GACHphC,EA8BF,SAAiCq9B,EAAMwB,EAAQlhC,GAC7C,OAAOwhC,EAAc9B,EAAM0B,EAAgB/+B,EAAE6nB,WAAYgX,EAAQlhC,IA9BjE28B,EAgCF,SAAiC+C,EAAMwB,EAAQlhC,GAC7C,OAAOwhC,EAAc9B,EAAM0B,EAAgBzE,EAAEzS,WAAYgX,EAAQlhC,IAhCjEsB,EAAGoiC,GACHZ,EAAGa,GACHpC,EAAGqC,GACH,IAAKC,IAmCP,OAAO7C,EAtQTjE,GAAQ+G,KAAOtE,IAAiB,SAASE,GAGvC,OAFAA,EAAO3C,GAAQgH,IAAIrE,IACdP,SAAS,EAAG,GACVO,KACN,SAASA,EAAME,GAChBF,EAAKf,YAAYe,EAAKnC,cAAgBqC,MACrC,SAASF,GACV,OAAOA,EAAKnC,iBAEdR,GAAQiH,MAAQjH,GAAQ+G,KAAK1uB,MAC7B2nB,GAAQiH,MAAMjE,IAAMhD,GAAQ+G,KAAK/D,IAAI3qB,MACrC2nB,GAAQgH,IAAMvE,IAAiB,SAASE,GACtC,IAAIqE,EAAM,IAAI/G,GAAQ,IAAK,GAE3B,OADA+G,EAAIpF,YAAYe,EAAKnC,cAAemC,EAAK3B,WAAY2B,EAAKvC,WACnD4G,KACN,SAASrE,EAAME,GAChBF,EAAKpB,QAAQoB,EAAKvC,UAAYyC,MAC7B,SAASF,GACV,OAAOA,EAAKvC,UAAY,KAE1BJ,GAAQ0D,KAAO1D,GAAQgH,IAAI3uB,MAC3B2nB,GAAQ0D,KAAKV,IAAMhD,GAAQgH,IAAIhE,IAAI3qB,MACnC2nB,GAAQ4F,UAAY,SAASjD,GAC3B,IAAIoE,EAAO/G,GAAQ+G,KAAKpE,GACxB,OAAOx/B,KAAKwS,OAAOgtB,EAAOoE,EAA+D,KAAvDpE,EAAKtB,oBAAsB0F,EAAK1F,sBAA8B,QAElG,CAAE,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YAAazoB,SAAQ,SAASouB,EAAK/jC,GACrGA,EAAI,EAAIA,EACR,IAAIikC,EAAWlH,GAAQgH,GAAOvE,IAAiB,SAASE,GAEtD,OADCA,EAAO3C,GAAQgH,IAAIrE,IAAOpB,QAAQoB,EAAKvC,WAAauC,EAAKrC,SAAWr9B,GAAK,GACnE0/B,KACN,SAASA,EAAME,GAChBF,EAAKpB,QAAQoB,EAAKvC,UAAiC,EAArBj9B,KAAKwS,MAAMktB,OACxC,SAASF,GACV,IAAIqE,EAAMhH,GAAQ+G,KAAKpE,GAAMrC,SAC7B,OAAOn9B,KAAKwS,OAAOqqB,GAAQ4F,UAAUjD,IAASqE,EAAM/jC,GAAK,GAAK,IAAM+jC,IAAQ/jC,MAE9E+8B,GAAQgH,EAAM,KAAOE,EAAS7uB,MAC9B2nB,GAAQgH,EAAM,KAAKhE,IAAMkE,EAASlE,IAAI3qB,MACtC2nB,GAAQgH,EAAM,UAAY,SAASrE,GACjC,IAAIqE,EAAMhH,GAAQ+G,KAAKpE,GAAMrC,SAC7B,OAAOn9B,KAAKwS,OAAOqqB,GAAQ4F,UAAUjD,IAASqE,EAAM/jC,GAAK,GAAK,OAGlE+8B,GAAQmH,KAAOnH,GAAQoH,OACvBpH,GAAQqH,MAAQrH,GAAQoH,OAAO/uB,MAC/B2nB,GAAQqH,MAAMrE,IAAMhD,GAAQoH,OAAOpE,IAAI3qB,MACvC2nB,GAAQsH,WAAatH,GAAQ6F,aAyN7B,IAAIzB,GAAqB,CACvB,IAAK,GACLjsB,EAAG,IACH,EAAK,KACJovB,GAAmB,UAAWC,GAAoB,KACrD,SAAS7B,GAAkBjjC,EAAOuF,EAAMG,GACtC,IAAIs2B,EAAOh8B,EAAQ,EAAI,IAAM,GAAIyhC,GAAUzF,GAAQh8B,EAAQA,GAAS,GAAI4M,EAAS60B,EAAO70B,OACxF,OAAOovB,GAAQpvB,EAASlH,EAAQ,IAAImL,MAAMnL,EAAQkH,EAAS,GAAG+rB,KAAKpzB,GAAQk8B,EAASA,GAEtF,SAASe,GAAiBuC,GACxB,OAAO,IAAI9oB,OAAO,OAAS8oB,EAAMpwB,IAAIzV,EAAGwa,SAASif,KAAK,KAAO,IAAK,KAEpE,SAAS+J,GAAqBqC,GAE5B,IADA,IAAIpwB,EAAM,IAAIa,EAAUjV,GAAK,EAAG2B,EAAI6iC,EAAMn4B,SACjCrM,EAAI2B,GAAGyS,EAAIwB,IAAI4uB,EAAMxkC,GAAG6I,cAAe7I,GAChD,OAAOoU,EAET,SAASovB,GAA2B9D,EAAMwB,EAAQlhC,GAChDskC,GAAiBpoB,UAAY,EAC7B,IAAIva,EAAI2iC,GAAiBpY,KAAKgV,EAAOvxB,MAAM3P,EAAGA,EAAI,IAClD,OAAO2B,GAAK+9B,EAAKj2B,GAAK9H,EAAE,GAAI3B,EAAI2B,EAAE,GAAG0K,SAAW,EAElD,SAASk3B,GAA8B7D,EAAMwB,EAAQlhC,GACnDskC,GAAiBpoB,UAAY,EAC7B,IAAIva,EAAI2iC,GAAiBpY,KAAKgV,EAAOvxB,MAAM3P,IAC3C,OAAO2B,GAAK+9B,EAAKiC,GAAKhgC,EAAE,GAAI3B,EAAI2B,EAAE,GAAG0K,SAAW,EAElD,SAASo3B,GAA8B/D,EAAMwB,EAAQlhC,GACnDskC,GAAiBpoB,UAAY,EAC7B,IAAIva,EAAI2iC,GAAiBpY,KAAKgV,EAAOvxB,MAAM3P,IAC3C,OAAO2B,GAAK+9B,EAAKgC,GAAK//B,EAAE,GAAI3B,EAAI2B,EAAE,GAAG0K,SAAW,EAElD,SAASs3B,GAAsBjE,EAAMwB,EAAQlhC,GAC3CskC,GAAiBpoB,UAAY,EAC7B,IAAIva,EAAI2iC,GAAiBpY,KAAKgV,EAAOvxB,MAAM3P,EAAGA,EAAI,IAClD,OAAO2B,GAAK+9B,EAAKp+B,GAAKK,EAAE,GAAI3B,EAAI2B,EAAE,GAAG0K,SAAW,EAElD,SAASq3B,GAAkBhE,EAAMwB,EAAQlhC,GACvCskC,GAAiBpoB,UAAY,EAC7B,IAO0Bxc,EAPtBiC,EAAI2iC,GAAiBpY,KAAKgV,EAAOvxB,MAAM3P,EAAGA,EAAI,IAClD,OAAO2B,GAAK+9B,EAAKp+B,GAMS5B,GANeiC,EAAE,KAO/BjC,EAAI,GAAK,KAAO,KAPoBM,EAAI2B,EAAE,GAAG0K,SAAW,EAEtE,SAASu3B,GAAkBlE,EAAMwB,EAAQlhC,GACvC,MAAO,cAAcyH,KAAKy5B,EAASA,EAAOvxB,MAAM3P,EAAGA,EAAI,KAAO0/B,EAAK6B,GAAKL,EACxElhC,EAAI,IAAM,EAKZ,SAASojC,GAAyB1D,EAAMwB,EAAQlhC,GAC9CskC,GAAiBpoB,UAAY,EAC7B,IAAIva,EAAI2iC,GAAiBpY,KAAKgV,EAAOvxB,MAAM3P,EAAGA,EAAI,IAClD,OAAO2B,GAAK+9B,EAAK71B,EAAIlI,EAAE,GAAK,EAAG3B,EAAI2B,EAAE,GAAG0K,SAAW,EAErD,SAAS22B,GAAiBtD,EAAMwB,EAAQlhC,GACtCskC,GAAiBpoB,UAAY,EAC7B,IAAIva,EAAI2iC,GAAiBpY,KAAKgV,EAAOvxB,MAAM3P,EAAGA,EAAI,IAClD,OAAO2B,GAAK+9B,EAAKhgC,GAAKiC,EAAE,GAAI3B,EAAI2B,EAAE,GAAG0K,SAAW,EAElD,SAAS62B,GAAuBxD,EAAMwB,EAAQlhC,GAC5CskC,GAAiBpoB,UAAY,EAC7B,IAAIva,EAAI2iC,GAAiBpY,KAAKgV,EAAOvxB,MAAM3P,EAAGA,EAAI,IAClD,OAAO2B,GAAK+9B,EAAKz9B,GAAKN,EAAE,GAAI3B,EAAI2B,EAAE,GAAG0K,SAAW,EAElD,SAAS42B,GAAoBvD,EAAMwB,EAAQlhC,GACzCskC,GAAiBpoB,UAAY,EAC7B,IAAIva,EAAI2iC,GAAiBpY,KAAKgV,EAAOvxB,MAAM3P,EAAGA,EAAI,IAClD,OAAO2B,GAAK+9B,EAAKjtB,GAAK9Q,EAAE,GAAI3B,EAAI2B,EAAE,GAAG0K,SAAW,EAElD,SAASg3B,GAAqB3D,EAAMwB,EAAQlhC,GAC1CskC,GAAiBpoB,UAAY,EAC7B,IAAIva,EAAI2iC,GAAiBpY,KAAKgV,EAAOvxB,MAAM3P,EAAGA,EAAI,IAClD,OAAO2B,GAAK+9B,EAAK2B,GAAK1/B,EAAE,GAAI3B,EAAI2B,EAAE,GAAG0K,SAAW,EAElD,SAASi3B,GAAqB5D,EAAMwB,EAAQlhC,GAC1CskC,GAAiBpoB,UAAY,EAC7B,IAAIva,EAAI2iC,GAAiBpY,KAAKgV,EAAOvxB,MAAM3P,EAAGA,EAAI,IAClD,OAAO2B,GAAK+9B,EAAK9a,GAAKjjB,EAAE,GAAI3B,EAAI2B,EAAE,GAAG0K,SAAW,EAElD,SAAS82B,GAA0BzD,EAAMwB,EAAQlhC,GAC/CskC,GAAiBpoB,UAAY,EAC7B,IAAIva,EAAI2iC,GAAiBpY,KAAKgV,EAAOvxB,MAAM3P,EAAGA,EAAI,IAClD,OAAO2B,GAAK+9B,EAAK4B,GAAK3/B,EAAE,GAAI3B,EAAI2B,EAAE,GAAG0K,SAAW,EAElD,SAAS02B,GAAarjC,GACpB,IAAIoH,EAAIpH,EAAE0+B,oBAAqBqG,EAAK39B,EAAI,EAAI,IAAM,IAAK49B,EAAKjwB,EAAI3N,GAAK,GAAK,EAAG69B,EAAKlwB,EAAI3N,GAAK,GAC3F,OAAO29B,EAAK/B,GAAkBgC,EAAI,IAAK,GAAKhC,GAAkBiC,EAAI,IAAK,GAEzE,SAASd,GAA4BnE,EAAMwB,EAAQlhC,GACjDukC,GAAkBroB,UAAY,EAC9B,IAAIva,EAAI4iC,GAAkBrY,KAAKgV,EAAOvxB,MAAM3P,EAAGA,EAAI,IACnD,OAAO2B,EAAI3B,EAAI2B,EAAE,GAAG0K,QAAU,EAEhC,SAASy1B,GAAoB8C,GAE3B,IADA,IAAIjjC,EAAIijC,EAAQv4B,OAAQrM,GAAK,IACpBA,EAAI2B,GAAGijC,EAAQ5kC,GAAG,GAAKK,KAAKukC,EAAQ5kC,GAAG,IAChD,OAAO,SAAS0/B,GAEd,IADA,IAAI1/B,EAAI,EAAGqB,EAAIujC,EAAQ5kC,IACfqB,EAAE,GAAGq+B,IAAOr+B,EAAIujC,IAAU5kC,GAClC,OAAOqB,EAAE,GAAGq+B,IAGhB/gC,EAAGg8B,OAAS,SAASA,GACnB,MAAO,CACLkK,aAAcnK,GAAuBC,GACrCmK,WAAY7E,GAAqBtF,KAGrC,IAAIoK,GAAiBpmC,EAAGg8B,OAAO,CAC7BE,QAAS,IACTE,UAAW,IACXE,SAAU,CAAE,GACZE,SAAU,CAAE,IAAK,IACjBgF,SAAU,iBACVT,KAAM,WACN5F,KAAM,WACNyG,QAAS,CAAE,KAAM,MACjBE,KAAM,CAAE,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YAC1EE,UAAW,CAAE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACvDE,OAAQ,CAAE,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACxHE,YAAa,CAAE,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,SAI9F,SAASiE,MAFTrmC,EAAGstB,OAAS8Y,GAAeF,aAC3BlmC,EAAGsmC,IAAM,GAETD,GAAS7hC,UAAY,CACnB2G,EAAG,EACHtI,EAAG,EACH2K,IAAK,SAAS7K,GACZ4jC,GAAY5jC,EAAGjB,KAAKmB,EAAG2jC,IACvBD,GAAYC,GAAar7B,EAAGzJ,KAAKyJ,EAAGzJ,MAChCA,KAAKyJ,EAAGzJ,KAAKmB,GAAK2jC,GAAa3jC,EAAQnB,KAAKyJ,EAAIq7B,GAAa3jC,GAEnE4jC,MAAO,WACL/kC,KAAKyJ,EAAIzJ,KAAKmB,EAAI,GAEpB68B,QAAS,WACP,OAAOh+B,KAAKyJ,IAGhB,IAAIq7B,GAAe,IAAIH,GACvB,SAASE,GAAY9+B,EAAGC,EAAGxE,GACzB,IAAIQ,EAAIR,EAAEiI,EAAI1D,EAAIC,EAAGg/B,EAAKhjC,EAAI+D,EAAGk/B,EAAKjjC,EAAIgjC,EAC1CxjC,EAAEL,EAAI4E,EAAIk/B,GAAMj/B,EAAIg/B,GAStB,SAASE,GAAsBC,EAAUltB,GACnCktB,GAAYC,GAA0B12B,eAAey2B,EAASngC,OAChEogC,GAA0BD,EAASngC,MAAMmgC,EAAUltB,GATvD3Z,EAAGsmC,IAAIS,OAAS,SAAShwB,EAAQ4C,GAC3B5C,GAAUiwB,GAAwB52B,eAAe2G,EAAOrQ,MAC1DsgC,GAAwBjwB,EAAOrQ,MAAMqQ,EAAQ4C,GAE7CitB,GAAsB7vB,EAAQ4C,IAQlC,IAAIqtB,GAA0B,CAC5BC,QAAS,SAASC,EAASvtB,GACzBitB,GAAsBM,EAAQL,SAAUltB,IAE1CwtB,kBAAmB,SAASpwB,EAAQ4C,GAElC,IADA,IAAIytB,EAAWrwB,EAAOqwB,SAAU/lC,GAAK,EAAG2B,EAAIokC,EAAS15B,SAC5CrM,EAAI2B,GAAG4jC,GAAsBQ,EAAS/lC,GAAGwlC,SAAUltB,KAG5DmtB,GAA4B,CAC9BO,OAAQ,SAAStwB,EAAQ4C,GACvBA,EAAS2tB,UAEXC,MAAO,SAASxwB,EAAQ4C,GACtB5C,EAASA,EAAOywB,YAChB7tB,EAASsI,MAAMlL,EAAO,GAAIA,EAAO,GAAIA,EAAO,KAE9C0wB,WAAY,SAAS1wB,EAAQ4C,GAE3B,IADA,IAAI6tB,EAAczwB,EAAOywB,YAAanmC,GAAK,EAAG2B,EAAIwkC,EAAY95B,SACrDrM,EAAI2B,GAAG+T,EAASywB,EAAYnmC,GAAIsY,EAASsI,MAAMlL,EAAO,GAAIA,EAAO,GAAIA,EAAO,KAEvF2wB,WAAY,SAAS3wB,EAAQ4C,GAC3BguB,GAAkB5wB,EAAOywB,YAAa7tB,EAAU,IAElDiuB,gBAAiB,SAAS7wB,EAAQ4C,GAEhC,IADA,IAAI6tB,EAAczwB,EAAOywB,YAAanmC,GAAK,EAAG2B,EAAIwkC,EAAY95B,SACrDrM,EAAI2B,GAAG2kC,GAAkBH,EAAYnmC,GAAIsY,EAAU,IAE9DkuB,QAAS,SAAS9wB,EAAQ4C,GACxBmuB,GAAqB/wB,EAAOywB,YAAa7tB,IAE3CouB,aAAc,SAAShxB,EAAQ4C,GAE7B,IADA,IAAI6tB,EAAczwB,EAAOywB,YAAanmC,GAAK,EAAG2B,EAAIwkC,EAAY95B,SACrDrM,EAAI2B,GAAG8kC,GAAqBN,EAAYnmC,GAAIsY,IAEvDquB,mBAAoB,SAASjxB,EAAQ4C,GAEnC,IADA,IAAIsuB,EAAalxB,EAAOkxB,WAAY5mC,GAAK,EAAG2B,EAAIilC,EAAWv6B,SAClDrM,EAAI2B,GAAG4jC,GAAsBqB,EAAW5mC,GAAIsY,KAGzD,SAASguB,GAAkBH,EAAa7tB,EAAUuuB,GAChD,IAA6CC,EAAzC9mC,GAAK,EAAG2B,EAAIwkC,EAAY95B,OAASw6B,EAErC,IADAvuB,EAASyuB,cACA/mC,EAAI2B,GAAGmlC,EAAaX,EAAYnmC,GAAIsY,EAASsI,MAAMkmB,EAAW,GAAIA,EAAW,GAAIA,EAAW,IACrGxuB,EAAS0uB,UAEX,SAASP,GAAqBN,EAAa7tB,GACzC,IAAItY,GAAK,EAAG2B,EAAIwkC,EAAY95B,OAE5B,IADAiM,EAAS2uB,iBACAjnC,EAAI2B,GAAG2kC,GAAkBH,EAAYnmC,GAAIsY,EAAU,GAC5DA,EAAS4uB,aAEXvoC,EAAGsmC,IAAIkC,KAAO,SAASzxB,GAGrB,OAFA0xB,GAAiB,EACjBzoC,EAAGsmC,IAAIS,OAAOhwB,EAAQ2xB,IACfD,IAET,IAAIA,GA8MAE,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GAAmBC,GA9M9KC,GAAqB,IAAIjD,GACzCqC,GAAc,CAChBpB,OAAQ,WACNmB,IAAkB,EAAI7jB,IAExB3C,MAAO7I,EACPgvB,UAAWhvB,EACXivB,QAASjvB,EACTkvB,aAAc,WACZgB,GAAmB7C,QACnBiC,GAAYN,UAAYmB,IAE1BhB,WAAY,WACV,IAAIC,EAAO,EAAIc,GACfb,IAAkBD,EAAO,EAAI,EAAI5jB,GAAI4jB,EAAOA,EAC5CE,GAAYN,UAAYM,GAAYL,QAAUK,GAAYzmB,MAAQ7I,IAGtE,SAASmwB,KACP,IAAIC,EAAKC,EAAKC,EAAIC,EAAOC,EAMzB,SAASC,EAAUC,EAAGC,GAEpBA,EAAIA,EAAI9kB,GAAa,EAAIL,GAAI,EAC7B,IAAIolB,GAFJF,GAAK7kB,IAEQykB,EAAIO,EAAMD,GAAM,EAAI,GAAK,EAAGE,EAAMD,EAAMD,EAAIG,EAAO5oC,KAAKkrB,IAAIsd,GAAIK,EAAO7oC,KAAKqkB,IAAImkB,GAAIhnC,EAAI6mC,EAAQQ,EAAMnnC,EAAI0mC,EAAQQ,EAAOpnC,EAAIxB,KAAKkrB,IAAIyd,GAAM5oC,EAAIyB,EAAIknC,EAAM1oC,KAAKqkB,IAAIskB,GAChLZ,GAAmB97B,IAAIjM,KAAKyrB,MAAM1rB,EAAG2B,IACrCymC,EAAKI,EAAGH,EAAQQ,EAAMP,EAAQQ,EAVhC1B,GAAYzmB,MAAQ,SAAS6nB,EAAGC,GAC9BrB,GAAYzmB,MAAQ4nB,EACpBH,GAAMF,EAAMM,GAAK7kB,GAAY0kB,EAAQpoC,KAAKkrB,IAAIsd,GAAKN,EAAMM,GAAK9kB,GAAa,EAAIL,GAAI,GACnFglB,EAAQroC,KAAKqkB,IAAImkB,IASnBrB,GAAYL,QAAU,WACpBwB,EAAUL,EAAKC,IAGnB,SAASY,GAAiBC,GACxB,IAAIR,EAAIQ,EAAU,GAAIP,EAAIO,EAAU,GAAIH,EAAO5oC,KAAKkrB,IAAIsd,GACxD,MAAO,CAAEI,EAAO5oC,KAAKkrB,IAAIqd,GAAIK,EAAO5oC,KAAKqkB,IAAIkkB,GAAIvoC,KAAKqkB,IAAImkB,IAE5D,SAASQ,GAAoB9iC,EAAGC,GAC9B,OAAOD,EAAE,GAAKC,EAAE,GAAKD,EAAE,GAAKC,EAAE,GAAKD,EAAE,GAAKC,EAAE,GAE9C,SAAS8iC,GAAsB/iC,EAAGC,GAChC,MAAO,CAAED,EAAE,GAAKC,EAAE,GAAKD,EAAE,GAAKC,EAAE,GAAID,EAAE,GAAKC,EAAE,GAAKD,EAAE,GAAKC,EAAE,GAAID,EAAE,GAAKC,EAAE,GAAKD,EAAE,GAAKC,EAAE,IAExF,SAAS+iC,GAAoBhjC,EAAGC,GAC9BD,EAAE,IAAMC,EAAE,GACVD,EAAE,IAAMC,EAAE,GACVD,EAAE,IAAMC,EAAE,GAEZ,SAASgjC,GAAsBC,EAAQ5nC,GACrC,MAAO,CAAE4nC,EAAO,GAAK5nC,EAAG4nC,EAAO,GAAK5nC,EAAG4nC,EAAO,GAAK5nC,GAErD,SAAS6nC,GAA0B7pC,GACjC,IAAIkK,EAAI1J,KAAK6S,KAAKrT,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,GAAKA,EAAE,IACvDA,EAAE,IAAMkK,EACRlK,EAAE,IAAMkK,EACRlK,EAAE,IAAMkK,EAEV,SAAS4/B,GAAiBC,GACxB,MAAO,CAAEvpC,KAAKyrB,MAAM8d,EAAU,GAAIA,EAAU,IAAKvlB,GAAQulB,EAAU,KAErE,SAASC,GAAsBtjC,EAAGC,GAChC,OAAOoO,EAAIrO,EAAE,GAAKC,EAAE,IAAMgd,IAAK5O,EAAIrO,EAAE,GAAKC,EAAE,IAAMgd,GAEpD1kB,EAAGsmC,IAAI0E,OAAS,WACd,IAAItB,EAAIuB,EAAIC,EAAIC,EAAIC,EAAIC,EAAKC,EAAKtlB,EAAIulB,EAAOC,EAAQ/0B,EACjDg1B,EAAQ,CACVxpB,MAAOA,EACPmmB,UAAWA,EACXC,QAASA,EACTC,aAAc,WACZmD,EAAMxpB,MAAQypB,EACdD,EAAMrD,UAAYuD,EAClBF,EAAMpD,QAAUuD,EAChBL,EAAQ,EACR7C,GAAYJ,gBAEdC,WAAY,WACVG,GAAYH,aACZkD,EAAMxpB,MAAQA,EACdwpB,EAAMrD,UAAYA,EAClBqD,EAAMpD,QAAUA,EACZiB,GAAqB,GAAGI,IAAOwB,EAAK,KAAMD,IAAOE,EAAK,KAAcI,EAAQ7mB,GAAGymB,EAAK,GAAaI,GAAS7mB,KAAGumB,GAAM,IACvHx0B,EAAM,GAAKizB,EAAIjzB,EAAM,GAAKy0B,IAG9B,SAASjpB,EAAM6nB,EAAGC,GAChByB,EAAOhiC,KAAKiN,EAAQ,CAAEizB,EAAKI,EAAGoB,EAAKpB,IAC/BC,EAAIkB,IAAIA,EAAKlB,GACbA,EAAIoB,IAAIA,EAAKpB,GAEnB,SAAS8B,EAAU/B,EAAGC,GACpB,IAAI3mC,EAAIinC,GAAiB,CAAEP,EAAI7kB,GAAY8kB,EAAI9kB,KAC/C,GAAIe,EAAI,CACN,IAAI8lB,EAAStB,GAAsBxkB,EAAI5iB,GAA+C2oC,EAAavB,GAA3C,CAAEsB,EAAO,IAAKA,EAAO,GAAI,GAAoDA,GACrIlB,GAA0BmB,GAC1BA,EAAalB,GAAiBkB,GAC9B,IAAI/B,EAAKF,EAAIsB,EAAIjgC,EAAI6+B,EAAK,EAAI,GAAK,EAAGgC,EAAKD,EAAW,GAAK7mB,GAAa/Z,EAAG8gC,EAAen2B,EAAIk0B,GAAM,IACpG,GAAIiC,GAAgB9gC,EAAIigC,EAAKY,GAAMA,EAAK7gC,EAAI2+B,IACtCoC,EAAKH,EAAW,GAAK7mB,IAChBimB,IAAIA,EAAKe,QACb,GAAiCD,GAAgB9gC,EAAIigC,GAAjDY,GAAMA,EAAK,KAAO,IAAM,MAAoCA,EAAK7gC,EAAI2+B,GAAI,CAClF,IAAIoC,MAAMH,EAAW,GAAK7mB,IACjB+lB,IAAIA,EAAKiB,QAEdnC,EAAIkB,IAAIA,EAAKlB,GACbA,EAAIoB,IAAIA,EAAKpB,GAEfkC,EACEnC,EAAIsB,EACFe,EAAMzC,EAAII,GAAKqC,EAAMzC,EAAIwB,KAAKA,EAAKpB,GAEnCqC,EAAMrC,EAAGoB,GAAMiB,EAAMzC,EAAIwB,KAAKxB,EAAKI,GAGrCoB,GAAMxB,GACJI,EAAIJ,IAAIA,EAAKI,GACbA,EAAIoB,IAAIA,EAAKpB,IAEbA,EAAIsB,EACFe,EAAMzC,EAAII,GAAKqC,EAAMzC,EAAIwB,KAAKA,EAAKpB,GAEnCqC,EAAMrC,EAAGoB,GAAMiB,EAAMzC,EAAIwB,KAAKxB,EAAKI,QAK7C7nB,EAAM6nB,EAAGC,GAEX/jB,EAAK5iB,EAAGgoC,EAAKtB,EAEf,SAAS1B,IACPqD,EAAMxpB,MAAQ4pB,EAEhB,SAASxD,IACP5xB,EAAM,GAAKizB,EAAIjzB,EAAM,GAAKy0B,EAC1BO,EAAMxpB,MAAQA,EACd+D,EAAK,KAEP,SAAS0lB,EAAU5B,EAAGC,GACpB,GAAI/jB,EAAI,CACN,IAAIgkB,EAAKF,EAAIsB,EACbG,GAASz1B,EAAIk0B,GAAM,IAAMA,GAAMA,EAAK,EAAI,KAAO,KAAOA,OACjDqB,EAAMvB,EAAGwB,EAAMvB,EACtBrB,GAAYzmB,MAAM6nB,EAAGC,GACrB8B,EAAU/B,EAAGC,GAEf,SAAS4B,IACPjD,GAAYN,YAEd,SAASwD,IACPF,EAAUL,EAAKC,GACf5C,GAAYL,UACRvyB,EAAIy1B,GAAS7mB,KAAGglB,IAAOwB,EAAK,MAChCz0B,EAAM,GAAKizB,EAAIjzB,EAAM,GAAKy0B,EAC1BllB,EAAK,KAEP,SAASmmB,EAAMzC,EAAIwB,GACjB,OAAQA,GAAMxB,GAAM,EAAIwB,EAAK,IAAMA,EAErC,SAASkB,EAAc3kC,EAAGC,GACxB,OAAOD,EAAE,GAAKC,EAAE,GAElB,SAAS2kC,EAAY3oC,EAAG+S,GACtB,OAAOA,EAAM,IAAMA,EAAM,GAAKA,EAAM,IAAM/S,GAAKA,GAAK+S,EAAM,GAAK/S,EAAI+S,EAAM,IAAMA,EAAM,GAAK/S,EAE5F,OAAO,SAASwjC,GAKd,GAJAiE,EAAKD,IAAOxB,EAAKuB,EAAKp0B,KACtB20B,EAAS,GACTxrC,EAAGsmC,IAAIS,OAAOG,EAASuE,GACnBzoC,EAAIwoC,EAAO99B,OACR,CACL89B,EAAO3qC,KAAKurC,GACZ,IAAK,IAAI/qC,EAAI,EAAqBwU,EAAS,CAA3BpO,EAAI+jC,EAAO,IAAuBnqC,EAAI2B,IAAK3B,EAErDgrC,GADJ3kC,EAAI8jC,EAAOnqC,IACO,GAAIoG,IAAM4kC,EAAY3kC,EAAE,GAAID,IACxC0kC,EAAM1kC,EAAE,GAAIC,EAAE,IAAMykC,EAAM1kC,EAAE,GAAIA,EAAE,MAAKA,EAAE,GAAKC,EAAE,IAChDykC,EAAMzkC,EAAE,GAAID,EAAE,IAAM0kC,EAAM1kC,EAAE,GAAIA,EAAE,MAAKA,EAAE,GAAKC,EAAE,KAEpDmO,EAAOrM,KAAK/B,EAAIC,GAIpB,IADA,IAAsBsiC,EACbhnC,EAA6C0E,EADlD4kC,GAAQz1B,IAC2BpP,GAAPpG,EAAI,EAAOwU,EAAlC7S,EAAI6S,EAAOnI,OAAS,IAA4BrM,GAAK2B,EAAGyE,EAAIC,IAAKrG,EACxEqG,EAAImO,EAAOxU,IACN2oC,EAAKmC,EAAM1kC,EAAE,GAAIC,EAAE,KAAO4kC,IAAMA,EAAOtC,EAAIN,EAAKhiC,EAAE,GAAIwjC,EAAKzjC,EAAE,IAItE,OADA+jC,EAAS/0B,EAAQ,KACVizB,IAAO7yB,KAAYo0B,IAAOp0B,IAAW,CAAE,CAAEhE,IAAKA,KAAO,CAAEA,IAAKA,MAAU,CAAE,CAAE62B,EAAIuB,GAAM,CAAEC,EAAIC,KA7HrF,GAgIhBnrC,EAAGsmC,IAAIiG,SAAW,SAASx1B,GACzB4xB,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAoB,EAC5NrpC,EAAGsmC,IAAIS,OAAOhwB,EAAQy1B,IACtB,IAAI9oC,EAAIylC,GAAmBxmC,EAAIymC,GAAmBjhC,EAAIkhC,GAAmBn+B,EAAIxH,EAAIA,EAAIf,EAAIA,EAAIwF,EAAIA,EACjG,OAAI+C,EAAIyZ,KACNjhB,EAAIslC,GAAmBrmC,EAAIsmC,GAAmB9gC,EAAI+gC,GAC9CN,GAAoBlkB,KAAGhhB,EAAImlC,GAAmBlmC,EAAImmC,GAAmB3gC,EAAI4gC,KAC7E79B,EAAIxH,EAAIA,EAAIf,EAAIA,EAAIwF,EAAIA,GAChBwc,IAAW,CAAE9R,IAAKA,KAErB,CAAEtR,KAAKyrB,MAAMrqB,EAAGe,GAAKwhB,GAAYK,GAAQpd,EAAI5G,KAAK6S,KAAKlJ,IAAMga,KAGtE,IAAIsnB,GAAkB,CACpBlF,OAAQluB,EACR6I,MAAOwqB,GACPrE,UAAWsE,GACXrE,QAASsE,GACTrE,aAAc,WACZkE,GAAgBpE,UAAYwE,IAE9BrE,WAAY,WACViE,GAAgBpE,UAAYsE,KAGhC,SAASD,GAAqB3C,EAAGC,GAC/BD,GAAK7kB,GACL,IAAIklB,EAAO5oC,KAAKkrB,IAAIsd,GAAK9kB,IACzB4nB,GAAwB1C,EAAO5oC,KAAKkrB,IAAIqd,GAAIK,EAAO5oC,KAAKqkB,IAAIkkB,GAAIvoC,KAAKqkB,IAAImkB,IAE3E,SAAS8C,GAAwBnpC,EAAGf,EAAGwF,KACnCwgC,GACFE,KAAsBnlC,EAAImlC,IAAqBF,GAC/CG,KAAsBnmC,EAAImmC,IAAqBH,GAC/CI,KAAsB5gC,EAAI4gC,IAAqBJ,GAEjD,SAAS+D,KACP,IAAIllB,EAAIE,EAAIolB,EAUZ,SAASjD,EAAUC,EAAGC,GACpBD,GAAK7kB,GACL,IAAIklB,EAAO5oC,KAAKkrB,IAAIsd,GAAK9kB,IAAavhB,EAAIymC,EAAO5oC,KAAKkrB,IAAIqd,GAAInnC,EAAIwnC,EAAO5oC,KAAKqkB,IAAIkkB,GAAI3hC,EAAI5G,KAAKqkB,IAAImkB,GAAIj/B,EAAIvJ,KAAKyrB,MAAMzrB,KAAK6S,MAAMtJ,EAAI4c,EAAKvf,EAAI2kC,EAAKnqC,GAAKmI,GAAKA,EAAIgiC,EAAKppC,EAAI8jB,EAAKrf,GAAK2C,GAAKA,EAAI0c,EAAK7kB,EAAI+kB,EAAKhkB,GAAKoH,GAAI0c,EAAK9jB,EAAIgkB,EAAK/kB,EAAImqC,EAAK3kC,GAC3OygC,IAAqB99B,EACrBk+B,IAAqBl+B,GAAK0c,GAAMA,EAAK9jB,IACrCulC,IAAqBn+B,GAAK4c,GAAMA,EAAK/kB,IACrCumC,IAAqBp+B,GAAKgiC,GAAMA,EAAK3kC,IACrC0kC,GAAwBrlB,EAAIE,EAAIolB,GAhBlCN,GAAgBvqB,MAAQ,SAAS6nB,EAAGC,GAClCD,GAAK7kB,GACL,IAAIklB,EAAO5oC,KAAKkrB,IAAIsd,GAAK9kB,IACzBuC,EAAK2iB,EAAO5oC,KAAKkrB,IAAIqd,GACrBpiB,EAAKyiB,EAAO5oC,KAAKqkB,IAAIkkB,GACrBgD,EAAKvrC,KAAKqkB,IAAImkB,GACdyC,GAAgBvqB,MAAQ4nB,EACxBgD,GAAwBrlB,EAAIE,EAAIolB,IAYpC,SAASH,KACPH,GAAgBvqB,MAAQwqB,GAE1B,SAASG,KACP,IAAIpD,EAAKC,EAAKjiB,EAAIE,EAAIolB,EAgBtB,SAASjD,EAAUC,EAAGC,GACpBD,GAAK7kB,GACL,IAAIklB,EAAO5oC,KAAKkrB,IAAIsd,GAAK9kB,IAAavhB,EAAIymC,EAAO5oC,KAAKkrB,IAAIqd,GAAInnC,EAAIwnC,EAAO5oC,KAAKqkB,IAAIkkB,GAAI3hC,EAAI5G,KAAKqkB,IAAImkB,GAAI/e,EAAKtD,EAAKvf,EAAI2kC,EAAKnqC,EAAGsoB,EAAK6hB,EAAKppC,EAAI8jB,EAAKrf,EAAG4kC,EAAKvlB,EAAK7kB,EAAI+kB,EAAKhkB,EAAGwH,EAAI3J,KAAK6S,KAAK4W,EAAKA,EAAKC,EAAKA,EAAK8hB,EAAKA,GAAK9pC,EAAIukB,EAAK9jB,EAAIgkB,EAAK/kB,EAAImqC,EAAK3kC,EAAG7G,EAAI4J,IAAMma,GAAQpiB,GAAKiI,EAAGJ,EAAIvJ,KAAKyrB,MAAM9hB,EAAGjI,GAC/RkmC,IAAqB7nC,EAAI0pB,EACzBoe,IAAqB9nC,EAAI2pB,EACzBoe,IAAqB/nC,EAAIyrC,EACzBnE,IAAqB99B,EACrBk+B,IAAqBl+B,GAAK0c,GAAMA,EAAK9jB,IACrCulC,IAAqBn+B,GAAK4c,GAAMA,EAAK/kB,IACrCumC,IAAqBp+B,GAAKgiC,GAAMA,EAAK3kC,IACrC0kC,GAAwBrlB,EAAIE,EAAIolB,GAzBlCN,GAAgBvqB,MAAQ,SAAS6nB,EAAGC,GAClCP,EAAMM,EAAGL,EAAMM,EACfyC,GAAgBvqB,MAAQ4nB,EACxBC,GAAK7kB,GACL,IAAIklB,EAAO5oC,KAAKkrB,IAAIsd,GAAK9kB,IACzBuC,EAAK2iB,EAAO5oC,KAAKkrB,IAAIqd,GACrBpiB,EAAKyiB,EAAO5oC,KAAKqkB,IAAIkkB,GACrBgD,EAAKvrC,KAAKqkB,IAAImkB,GACd8C,GAAwBrlB,EAAIE,EAAIolB,IAElCN,GAAgBnE,QAAU,WACxBwB,EAAUL,EAAKC,GACf+C,GAAgBnE,QAAUsE,GAC1BH,GAAgBvqB,MAAQwqB,IAe5B,SAASO,GAAevlC,EAAGC,GACzB,SAASulC,EAAQvpC,EAAGf,GAClB,OAAOe,EAAI+D,EAAE/D,EAAGf,GAAI+E,EAAEhE,EAAE,GAAIA,EAAE,IAKhC,OAHI+D,EAAEuhB,QAAUthB,EAAEshB,SAAQikB,EAAQjkB,OAAS,SAAStlB,EAAGf,GACrD,OAAOe,EAAIgE,EAAEshB,OAAOtlB,EAAGf,KAAS8E,EAAEuhB,OAAOtlB,EAAE,GAAIA,EAAE,MAE5CupC,EAET,SAASC,KACP,OAAO,EAET,SAASC,GAAmBC,EAAUl6B,EAASm6B,EAAiBC,EAAa3zB,GAC3E,IAAI+J,EAAU,GAAI6pB,EAAO,GAuBzB,GAtBAH,EAASp2B,SAAQ,SAASw2B,GACxB,MAAKxqC,EAAIwqC,EAAQ9/B,OAAS,IAAM,GAAhC,CACA,IAAI1K,EAAGgjB,EAAKwnB,EAAQ,GAAIr4B,EAAKq4B,EAAQxqC,GACrC,GAAI+nC,GAAsB/kB,EAAI7Q,GAA9B,CACEwE,EAASyuB,YACT,IAAK,IAAI/mC,EAAI,EAAGA,EAAI2B,IAAK3B,EAAGsY,EAASsI,OAAO+D,EAAKwnB,EAAQnsC,IAAI,GAAI2kB,EAAG,IACpErM,EAAS0uB,cAHX,CAMA,IAAI5gC,EAAI,IAAIgmC,GAA+BznB,EAAIwnB,EAAS,MAAM,GAAO9lC,EAAI,IAAI+lC,GAA+BznB,EAAI,KAAMve,GAAG,GACzHA,EAAEvE,EAAIwE,EACNgc,EAAQla,KAAK/B,GACb8lC,EAAK/jC,KAAK9B,GACVD,EAAI,IAAIgmC,GAA+Bt4B,EAAIq4B,EAAS,MAAM,GAC1D9lC,EAAI,IAAI+lC,GAA+Bt4B,EAAI,KAAM1N,GAAG,GACpDA,EAAEvE,EAAIwE,EACNgc,EAAQla,KAAK/B,GACb8lC,EAAK/jC,KAAK9B,QAEZ6lC,EAAK1sC,KAAKqS,GACVw6B,GAA+BhqB,GAC/BgqB,GAA+BH,GAC1B7pB,EAAQhW,OAAb,CACA,IAAK,IAAIrM,EAAI,EAAGssC,EAAQN,EAAiBrqC,EAAIuqC,EAAK7/B,OAAQrM,EAAI2B,IAAK3B,EACjEksC,EAAKlsC,GAAG0J,EAAI4iC,GAASA,EAGvB,IADA,IAAwBC,EAAQ3rB,EAA5BvL,EAAQgN,EAAQ,KACV,CAER,IADA,IAAImqB,EAAUn3B,EAAOo3B,GAAY,EAC1BD,EAAQvsC,GAAG,IAAKusC,EAAUA,EAAQ7qC,KAAO0T,EAAO,OACvDk3B,EAASC,EAAQ1lC,EACjBwR,EAASyuB,YACT,EAAG,CAED,GADAyF,EAAQvsC,EAAIusC,EAAQ3qC,EAAE5B,GAAI,EACtBusC,EAAQ9iC,EAAG,CACb,GAAI+iC,EACF,IAASzsC,EAAI,EAAG2B,EAAI4qC,EAAOlgC,OAAQrM,EAAI2B,IAAK3B,EAAGsY,EAASsI,OAAOA,EAAQ2rB,EAAOvsC,IAAI,GAAI4gB,EAAM,SAE5FqrB,EAAYO,EAAQnqC,EAAGmqC,EAAQ7qC,EAAEU,EAAG,EAAGiW,GAEzCk0B,EAAUA,EAAQ7qC,MACb,CACL,GAAI8qC,EAEF,IAASzsC,GADTusC,EAASC,EAAQzqC,EAAE+E,GACCuF,OAAS,EAAGrM,GAAK,IAAKA,EAAGsY,EAASsI,OAAOA,EAAQ2rB,EAAOvsC,IAAI,GAAI4gB,EAAM,SAE1FqrB,EAAYO,EAAQnqC,EAAGmqC,EAAQzqC,EAAEM,GAAI,EAAGiW,GAE1Ck0B,EAAUA,EAAQzqC,EAGpBwqC,GADAC,EAAUA,EAAQ3qC,GACDiF,EACjB2lC,GAAaA,SACLD,EAAQvsC,GAClBqY,EAAS0uB,YAGb,SAASqF,GAA+Bh8B,GACtC,GAAM1O,EAAI0O,EAAMhE,OAAhB,CAEA,IADA,IAAI1K,EAAwB0E,EAArBrG,EAAI,EAAGoG,EAAIiK,EAAM,KACfrQ,EAAI2B,GACXyE,EAAEzE,EAAI0E,EAAIgK,EAAMrQ,GAChBqG,EAAEtE,EAAIqE,EACNA,EAAIC,EAEND,EAAEzE,EAAI0E,EAAIgK,EAAM,GAChBhK,EAAEtE,EAAIqE,GAER,SAASgmC,GAA+BxrB,EAAO2rB,EAAQG,EAAOJ,GAC5DjsC,KAAKgC,EAAIue,EACTvgB,KAAKyG,EAAIylC,EACTlsC,KAAKwB,EAAI6qC,EACTrsC,KAAKqJ,EAAI4iC,EACTjsC,KAAKJ,GAAI,EACTI,KAAKsB,EAAItB,KAAK0B,EAAI,KAEpB,SAAS4qC,GAAYC,EAAcC,EAAUZ,EAAaa,GACxD,OAAO,SAASC,EAAQz0B,GACtB,IAsDIyzB,EAtDAiB,EAAOH,EAASv0B,GAAW20B,EAAmBF,EAAOplB,OAAOmlB,EAAU,GAAIA,EAAU,IACpFZ,EAAO,CACTtrB,MAAOA,EACPmmB,UAAWA,EACXC,QAASA,EACTC,aAAc,WACZiF,EAAKtrB,MAAQssB,EACbhB,EAAKnF,UAAYuD,EACjB4B,EAAKlF,QAAUuD,EACfwB,EAAW,GACXoB,EAAU,IAEZjG,WAAY,WACVgF,EAAKtrB,MAAQA,EACbsrB,EAAKnF,UAAYA,EACjBmF,EAAKlF,QAAUA,EACf+E,EAAWptC,EAAGiE,MAAMmpC,GACpB,IAAIC,EAuKZ,SAA+BprB,EAAOusB,GACpC,IAAIC,EAAWxsB,EAAM,GAAIysB,EAAWzsB,EAAM,GAAI0sB,EAAiB,CAAEptC,KAAKqkB,IAAI6oB,IAAYltC,KAAKkrB,IAAIgiB,GAAW,GAAKG,EAAa,EAAGC,EAAU,EACzIvF,GAAmB7C,QACnB,IAAK,IAAIplC,EAAI,EAAG2B,EAAIwrC,EAAQ9gC,OAAQrM,EAAI2B,IAAK3B,EAAG,CAC9C,IAAIytC,EAAON,EAAQntC,GAAI6J,EAAI4jC,EAAKphC,OAChC,GAAKxC,EAEL,IADA,IAAI6jC,EAASD,EAAK,GAAIpF,EAAKqF,EAAO,GAAI9D,EAAK8D,EAAO,GAAK,EAAInqB,GAAI,EAAGglB,EAAQroC,KAAKqkB,IAAIqlB,GAAKtB,EAAQpoC,KAAKkrB,IAAIwe,GAAK3nC,EAAI,IACrG,CACPA,IAAM4H,IAAG5H,EAAI,GAEjB,IAAIwmC,GADJ7nB,EAAQ6sB,EAAKxrC,IACC,GAAIymC,EAAI9nB,EAAM,GAAK,EAAI2C,GAAI,EAAGwlB,EAAO7oC,KAAKqkB,IAAImkB,GAAII,EAAO5oC,KAAKkrB,IAAIsd,GAAIC,EAAKF,EAAIJ,EAAIO,EAAMD,GAAM,EAAI,GAAK,EAAGE,EAAMD,EAAMD,EAAIiC,EAAe/B,EAAMtlB,GAAG7hB,EAAI6mC,EAAQQ,EAG7K,GAFAd,GAAmB97B,IAAIjM,KAAKyrB,MAAMjqB,EAAIknC,EAAM1oC,KAAKqkB,IAAIskB,GAAMP,EAAQQ,EAAOpnC,EAAIxB,KAAKkrB,IAAIyd,KACvF0E,GAAc3C,EAAejC,EAAKC,EAAMnlB,GAAIklB,EACxCiC,EAAevC,GAAM+E,EAAW3E,GAAK2E,EAAU,CACjD,IAAIpuC,EAAMmqC,GAAsBH,GAAiB0E,GAAS1E,GAAiBpoB,IAC3E2oB,GAA0BvqC,GAC1B,IAAI2uC,EAAexE,GAAsBmE,EAAgBtuC,GACzDuqC,GAA0BoE,GAC1B,IAAIC,GAAQhD,EAAejC,GAAM,GAAK,EAAI,GAAKzkB,GAAQypB,EAAa,KAChEN,EAAWO,GAAQP,IAAaO,IAAS5uC,EAAI,IAAMA,EAAI,OACzDwuC,GAAW5C,EAAejC,GAAM,EAAI,GAAK,GAG7C,IAAK1mC,IAAK,MACVomC,EAAKI,EAAGF,EAAQQ,EAAMT,EAAQQ,EAAM4E,EAAS9sB,GAGjD,OAAQ2sB,GAAclqB,IAAKkqB,EAAalqB,IAAK4kB,IAAsB5kB,IAAe,EAAVmqB,EAlM5CK,CAAsBZ,EAAkBE,GAC1DpB,EAAS1/B,QACNyhC,IAAgBx1B,EAAS2uB,eAAgB6G,GAAiB,GAC/DhC,GAAmBC,EAAUgC,GAAiB/B,EAAiBC,EAAa3zB,IACnE0zB,IACJ8B,IAAgBx1B,EAAS2uB,eAAgB6G,GAAiB,GAC/Dx1B,EAASyuB,YACTkF,EAAY,KAAM,KAAM,EAAG3zB,GAC3BA,EAAS0uB,WAEP8G,IAAgBx1B,EAAS4uB,aAAc4G,GAAiB,GAC5D/B,EAAWoB,EAAU,MAEvBlH,OAAQ,WACN3tB,EAAS2uB,eACT3uB,EAASyuB,YACTkF,EAAY,KAAM,KAAM,EAAG3zB,GAC3BA,EAAS0uB,UACT1uB,EAAS4uB,eAGb,SAAStmB,EAAM6nB,EAAGC,GAChB,IAAI9nB,EAAQmsB,EAAOtE,EAAGC,GAClBkE,EAAanE,EAAI7nB,EAAM,GAAI8nB,EAAI9nB,EAAM,KAAKtI,EAASsI,MAAM6nB,EAAGC,GAElE,SAASsF,EAAUvF,EAAGC,GACpB,IAAI9nB,EAAQmsB,EAAOtE,EAAGC,GACtBsE,EAAKpsB,MAAMA,EAAM,GAAIA,EAAM,IAE7B,SAASmmB,IACPmF,EAAKtrB,MAAQotB,EACbhB,EAAKjG,YAEP,SAASC,IACPkF,EAAKtrB,MAAQA,EACbosB,EAAKhG,UAGP,IAAmGmG,EAASM,EAAxGQ,EAASC,KAA6BC,EAAetB,EAASoB,GAASH,GAAiB,EAC5F,SAASZ,EAAUzE,EAAGC,GACpB+E,EAAKtlC,KAAK,CAAEsgC,EAAGC,IACf,IAAI9nB,EAAQmsB,EAAOtE,EAAGC,GACtByF,EAAavtB,MAAMA,EAAM,GAAIA,EAAM,IAErC,SAAS0pB,IACP6D,EAAapH,YACb0G,EAAO,GAET,SAASlD,IACP2C,EAAUO,EAAK,GAAG,GAAIA,EAAK,GAAG,IAC9BU,EAAanH,UACb,IAAkEmF,EAA9DiC,EAAQD,EAAaC,QAASC,EAAeJ,EAAOA,SAAmBtsC,EAAI0sC,EAAahiC,OAI5F,GAHAohC,EAAKa,MACLnB,EAAQhlC,KAAKslC,GACbA,EAAO,KACF9rC,EACL,GAAY,EAARysC,EAAJ,CAEE,IAAoCxtB,EAAR5gB,GAAK,EACjC,IADI2B,GADJwqC,EAAUkC,EAAa,IACPhiC,OAAS,GACjB,EAAG,CAGT,IAFKyhC,IAAgBx1B,EAAS2uB,eAAgB6G,GAAiB,GAC/Dx1B,EAASyuB,cACA/mC,EAAI2B,GAAG2W,EAASsI,OAAOA,EAAQurB,EAAQnsC,IAAI,GAAI4gB,EAAM,IAC9DtI,EAAS0uB,gBAITrlC,EAAI,GAAa,EAARysC,GAAWC,EAAalmC,KAAKkmC,EAAaC,MAAM91B,OAAO61B,EAAaE,UACjFxC,EAAS5jC,KAAKkmC,EAAa7vB,OAAOgwB,KAEpC,OAAOtC,GAGX,SAASsC,GAA0BrC,GACjC,OAAOA,EAAQ9/B,OAAS,EAE1B,SAAS6hC,KACP,IAAgBlB,EAAZyB,EAAQ,GACZ,MAAO,CACL1H,UAAW,WACT0H,EAAMtmC,KAAK6kC,EAAO,KAEpBpsB,MAAO,SAAS6nB,EAAGC,GACjBsE,EAAK7kC,KAAK,CAAEsgC,EAAGC,KAEjB1B,QAASjvB,EACTk2B,OAAQ,WACN,IAAIA,EAASQ,EAGb,OAFAA,EAAQ,GACRzB,EAAO,KACAiB,GAETS,OAAQ,WACFD,EAAMpiC,OAAS,GAAGoiC,EAAMtmC,KAAKsmC,EAAMH,MAAM91B,OAAOi2B,EAAMF,YAIhE,SAASR,GAAgB3nC,EAAGC,GAC1B,QAASD,EAAIA,EAAE/D,GAAG,GAAK,EAAI+D,EAAE,GAAKud,GAAQN,GAAIM,GAAQvd,EAAE,MAAQC,EAAIA,EAAEhE,GAAG,GAAK,EAAIgE,EAAE,GAAKsd,GAAQN,GAAIM,GAAQtd,EAAE,IAEjH,IAAIsoC,GAA0BhC,GAAYd,IAC1C,SAAqCvzB,GACnC,IAAmC81B,EAA/B/F,EAAK72B,IAAKo4B,EAAKp4B,IAAKo9B,EAAMp9B,IAC9B,MAAO,CACLu1B,UAAW,WACTzuB,EAASyuB,YACTqH,EAAQ,GAEVxtB,MAAO,SAASipB,EAAIC,GAClB,IAAI+E,EAAMhF,EAAK,EAAItmB,IAAKA,GAAGolB,EAAKl0B,EAAIo1B,EAAKxB,GACrC5zB,EAAIk0B,EAAKplB,IAAKF,IAChB/K,EAASsI,MAAMynB,EAAIuB,GAAMA,EAAKE,GAAM,EAAI,EAAInmB,IAASA,IACrDrL,EAASsI,MAAMguB,EAAKhF,GACpBtxB,EAAS0uB,UACT1uB,EAASyuB,YACTzuB,EAASsI,MAAMiuB,EAAKjF,GACpBtxB,EAASsI,MAAMipB,EAAID,GACnBwE,EAAQ,GACCQ,IAAQC,GAAOlG,GAAMplB,KAC1B9O,EAAI4zB,EAAKuG,GAAOvrB,KAAGglB,GAAMuG,EAAMvrB,IAC/B5O,EAAIo1B,EAAKgF,GAAOxrB,KAAGwmB,GAAMgF,EAAMxrB,IACnCumB,EAmBR,SAA0CvB,EAAIuB,EAAIC,EAAIC,GACpD,IAAIxB,EAAOwG,EAAOC,EAAW7uC,KAAKqkB,IAAI8jB,EAAKwB,GAC3C,OAAOp1B,EAAIs6B,GAAY1rB,GAAInjB,KAAK8uC,MAAM9uC,KAAKqkB,IAAIqlB,IAAOkF,EAAQ5uC,KAAKkrB,IAAI0e,IAAO5pC,KAAKqkB,IAAIslB,GAAM3pC,KAAKqkB,IAAIulB,IAAOxB,EAAQpoC,KAAKkrB,IAAIwe,IAAO1pC,KAAKqkB,IAAI8jB,KAAQC,EAAQwG,EAAQC,KAAcnF,EAAKE,GAAM,EArBpLmF,CAAiC5G,EAAIuB,EAAIC,EAAIC,GAClDxxB,EAASsI,MAAMguB,EAAKhF,GACpBtxB,EAAS0uB,UACT1uB,EAASyuB,YACTzuB,EAASsI,MAAMiuB,EAAKjF,GACpBwE,EAAQ,GAEV91B,EAASsI,MAAMynB,EAAKwB,EAAID,EAAKE,GAC7B8E,EAAMC,GAER7H,QAAS,WACP1uB,EAAS0uB,UACTqB,EAAKuB,EAAKp4B,KAEZ48B,MAAO,WACL,OAAO,EAAIA,OAQjB,SAA4Cc,EAAMC,EAAIC,EAAW92B,GAC/D,IAAIowB,EACJ,GAAY,MAARwG,EACFxG,EAAI0G,EAAYzrB,GAChBrL,EAASsI,OAAO2C,GAAGmlB,GACnBpwB,EAASsI,MAAM,EAAG8nB,GAClBpwB,EAASsI,MAAM2C,GAAGmlB,GAClBpwB,EAASsI,MAAM2C,GAAG,GAClBjL,EAASsI,MAAM2C,IAAImlB,GACnBpwB,EAASsI,MAAM,GAAI8nB,GACnBpwB,EAASsI,OAAO2C,IAAImlB,GACpBpwB,EAASsI,OAAO2C,GAAG,GACnBjL,EAASsI,OAAO2C,GAAGmlB,QACd,GAAIj0B,EAAIy6B,EAAK,GAAKC,EAAG,IAAM9rB,GAAG,CACnC,IAAIvZ,EAAIolC,EAAK,GAAKC,EAAG,GAAK5rB,IAAKA,GAC/BmlB,EAAI0G,EAAYtlC,EAAI,EACpBwO,EAASsI,OAAO9W,EAAG4+B,GACnBpwB,EAASsI,MAAM,EAAG8nB,GAClBpwB,EAASsI,MAAM9W,EAAG4+B,QAElBpwB,EAASsI,MAAMuuB,EAAG,GAAIA,EAAG,MAhEuF,EAAG5rB,IAAIA,GAAI,IAgG/H,SAAS8rB,GAAkBlwC,GACzB,IAAImwC,EAAKpvC,KAAKkrB,IAAIjsB,GAASowC,EAAcD,EAAK,EAAGE,EAAgB/6B,EAAI66B,GAAMjsB,GAC3E,OAAOspB,GAAY1kC,GAInB,SAAkBqQ,GAChB,IAAIo1B,EAAQ+B,EAAIC,EAAIC,EAAKvB,EACzB,MAAO,CACLrH,UAAW,WACT4I,EAAMD,GAAK,EACXtB,EAAQ,GAEVxtB,MAAO,SAAS6nB,EAAGC,GACjB,IAAuBkH,EAAnBC,EAAS,CAAEpH,EAAGC,GAAazoC,EAAIgI,EAAQwgC,EAAGC,GAAIviC,EAAIopC,EAActvC,EAAI,EAAI6vC,EAAKrH,EAAGC,GAAKzoC,EAAI6vC,EAAKrH,GAAKA,EAAI,EAAIllB,IAAKA,IAAImlB,GAAK,EAU7H,IATKgF,IAAWiC,EAAMD,EAAKzvC,IAAIqY,EAASyuB,YACpC9mC,IAAMyvC,IACRE,EAASG,EAAUrC,EAAQmC,IACvBnG,GAAsBgE,EAAQkC,IAAWlG,GAAsBmG,EAAQD,MACzEC,EAAO,IAAMxsB,GACbwsB,EAAO,IAAMxsB,GACbpjB,EAAIgI,EAAQ4nC,EAAO,GAAIA,EAAO,MAG9B5vC,IAAMyvC,EACRtB,EAAQ,EACJnuC,GACFqY,EAASyuB,YACT6I,EAASG,EAAUF,EAAQnC,GAC3Bp1B,EAASsI,MAAMgvB,EAAO,GAAIA,EAAO,MAEjCA,EAASG,EAAUrC,EAAQmC,GAC3Bv3B,EAASsI,MAAMgvB,EAAO,GAAIA,EAAO,IACjCt3B,EAAS0uB,WAEX0G,EAASkC,OACJ,GAAIJ,GAAiB9B,GAAU6B,EAActvC,EAAG,CACrD,IAAIuB,EACE2E,EAAIspC,KAAQjuC,EAAIuuC,EAAUF,EAAQnC,GAAQ,MAC9CU,EAAQ,EACJmB,GACFj3B,EAASyuB,YACTzuB,EAASsI,MAAMpf,EAAE,GAAG,GAAIA,EAAE,GAAG,IAC7B8W,EAASsI,MAAMpf,EAAE,GAAG,GAAIA,EAAE,GAAG,IAC7B8W,EAAS0uB,YAET1uB,EAASsI,MAAMpf,EAAE,GAAG,GAAIA,EAAE,GAAG,IAC7B8W,EAAS0uB,UACT1uB,EAASyuB,YACTzuB,EAASsI,MAAMpf,EAAE,GAAG,GAAIA,EAAE,GAAG,OAI/BvB,GAAOytC,GAAWhE,GAAsBgE,EAAQmC,IAClDv3B,EAASsI,MAAMivB,EAAO,GAAIA,EAAO,IAEnCnC,EAASmC,EAAQH,EAAKzvC,EAAGwvC,EAAKtpC,GAEhC6gC,QAAS,WACH0I,GAAIp3B,EAAS0uB,UACjB0G,EAAS,MAEXU,MAAO,WACL,OAAOA,GAASuB,GAAOD,IAAO,MA9DwDM,GAAyB7wC,EAAQ,EAAIykB,IAC9E2rB,EAAc,CAAE,GAAIpwC,GAAW,EAAGokB,GAAGpkB,EAASokB,KACjG,SAAStb,EAAQwgC,EAAGC,GAClB,OAAOxoC,KAAKkrB,IAAIqd,GAAKvoC,KAAKkrB,IAAIsd,GAAK4G,EA+DrC,SAASS,EAAU3pC,EAAGC,EAAG4pC,GACvB,IACIC,EAAK,CAAE,EAAG,EAAG,GAAKC,EAAKhH,GADlBH,GAAiB5iC,GAAS4iC,GAAiB3iC,IACM+pC,EAAOlH,GAAoBiH,EAAIA,GAAKE,EAAOF,EAAG,GAAIG,EAAcF,EAAOC,EAAOA,EACxI,IAAKC,EAAa,OAAQL,GAAO7pC,EACjC,IAAImqC,EAAKjB,EAAKc,EAAOE,EAAaE,GAAMlB,EAAKe,EAAOC,EAAaG,EAAQtH,GAAsB+G,EAAIC,GAAK5uC,EAAI8nC,GAAsB6G,EAAIK,GACtInH,GAAoB7nC,EAD2H8nC,GAAsB8G,EAAIK,IAEzK,IAAI5uC,EAAI6uC,EAAOhnC,EAAIy/B,GAAoB3nC,EAAGK,GAAI8uC,EAAKxH,GAAoBtnC,EAAGA,GAAI+uC,EAAKlnC,EAAIA,EAAIinC,GAAMxH,GAAoB3nC,EAAGA,GAAK,GAC7H,KAAIovC,EAAK,GAAT,CACA,IAAInvC,EAAItB,KAAK6S,KAAK49B,GAAKhnC,EAAI0/B,GAAsBznC,IAAK6H,EAAIjI,GAAKkvC,GAG/D,GAFAtH,GAAoBz/B,EAAGpI,GACvBoI,EAAI6/B,GAAiB7/B,IAChBsmC,EAAK,OAAOtmC,EACjB,IAAgD7C,EAA5CuhC,EAAKjiC,EAAE,GAAIyjC,EAAKxjC,EAAE,GAAIujC,EAAKxjC,EAAE,GAAI0jC,EAAKzjC,EAAE,GACxCwjC,EAAKxB,IAAIvhC,EAAIuhC,EAAIA,EAAKwB,EAAIA,EAAK/iC,GACnC,IAAI8pC,EAAK/G,EAAKxB,EAAIwI,EAAQp8B,EAAIm8B,EAAKrtB,IAAKF,GAExC,IADKwtB,GAAS/G,EAAKF,IAAI9iC,EAAI8iC,EAAIA,EAAKE,EAAIA,EAAKhjC,GADS+pC,GAASD,EAAKvtB,GAErDwtB,EAAQjH,EAAKE,EAAK,EAAIngC,EAAE,IAAM8K,EAAI9K,EAAE,GAAK0+B,GAAMhlB,GAAIumB,EAAKE,GAAMF,GAAMjgC,EAAE,IAAMA,EAAE,IAAMmgC,EAAK8G,EAAKrtB,IAAK8kB,GAAM1+B,EAAE,IAAMA,EAAE,IAAMkgC,GAAK,CAC3I,IAAIiH,EAAKzH,GAAsBznC,IAAK6H,EAAIjI,GAAKkvC,GAE7C,OADAtH,GAAoB0H,EAAIvvC,GACjB,CAAEoI,EAAG6/B,GAAiBsH,MAGjC,SAAShB,EAAKrH,EAAGC,GACf,IAAI5mC,EAAIytC,EAAcpwC,EAASokB,GAAIpkB,EAAQ2wC,EAAO,EAGlD,OAFIrH,GAAK3mC,EAAGguC,GAAQ,EAAYrH,EAAI3mC,IAAGguC,GAAQ,GAC3CpH,GAAK5mC,EAAGguC,GAAQ,EAAYpH,EAAI5mC,IAAGguC,GAAQ,GACxCA,GAGX,SAASiB,GAAiB5qB,EAAIE,EAAID,EAAIE,GACpC,OAAO,SAAS0mB,GACd,IAAgHlrC,EAA5GsE,EAAI4mC,EAAK5mC,EAAGC,EAAI2mC,EAAK3mC,EAAG2qC,EAAK5qC,EAAE/D,EAAG4uC,EAAK7qC,EAAE9E,EAAuB84B,EAAK,EAAGC,EAAK,EAAGnX,EAA/B7c,EAAEhE,EAAuC2uC,EAAI7tB,EAAnC9c,EAAE/E,EAA2C2vC,EAE5G,GADAnvC,EAAIqkB,EAAK6qB,EACJ9tB,KAAMphB,EAAI,GAAf,CAEA,GADAA,GAAKohB,EACDA,EAAK,EAAG,CACV,GAAIphB,EAAIs4B,EAAI,OACRt4B,EAAIu4B,IAAIA,EAAKv4B,QACZ,GAAIohB,EAAK,EAAG,CACjB,GAAIphB,EAAIu4B,EAAI,OACRv4B,EAAIs4B,IAAIA,EAAKt4B,GAGnB,GADAA,EAAIskB,EAAK4qB,EACJ9tB,KAAMphB,EAAI,GAAf,CAEA,GADAA,GAAKohB,EACDA,EAAK,EAAG,CACV,GAAIphB,EAAIu4B,EAAI,OACRv4B,EAAIs4B,IAAIA,EAAKt4B,QACZ,GAAIohB,EAAK,EAAG,CACjB,GAAIphB,EAAIs4B,EAAI,OACRt4B,EAAIu4B,IAAIA,EAAKv4B,GAGnB,GADAA,EAAIukB,EAAK4qB,EACJ9tB,KAAMrhB,EAAI,GAAf,CAEA,GADAA,GAAKqhB,EACDA,EAAK,EAAG,CACV,GAAIrhB,EAAIs4B,EAAI,OACRt4B,EAAIu4B,IAAIA,EAAKv4B,QACZ,GAAIqhB,EAAK,EAAG,CACjB,GAAIrhB,EAAIu4B,EAAI,OACRv4B,EAAIs4B,IAAIA,EAAKt4B,GAGnB,GADAA,EAAIwkB,EAAK2qB,EACJ9tB,KAAMrhB,EAAI,GAAf,CAEA,GADAA,GAAKqhB,EACDA,EAAK,EAAG,CACV,GAAIrhB,EAAIu4B,EAAI,OACRv4B,EAAIs4B,IAAIA,EAAKt4B,QACZ,GAAIqhB,EAAK,EAAG,CACjB,GAAIrhB,EAAIs4B,EAAI,OACRt4B,EAAIu4B,IAAIA,EAAKv4B,GAUnB,OARIs4B,EAAK,IAAG4S,EAAK5mC,EAAI,CACnB/D,EAAG2uC,EAAK5W,EAAKlX,EACb5hB,EAAG2vC,EAAK7W,EAAKjX,IAEXkX,EAAK,IAAG2S,EAAK3mC,EAAI,CACnBhE,EAAG2uC,EAAK3W,EAAKnX,EACb5hB,EAAG2vC,EAAK5W,EAAKlX,IAER6pB,OAqBX,SAASkE,GAAkB/qB,EAAIE,EAAID,EAAIE,GACrC,OAAO,SAAShO,GACd,IAAqHyzB,EAAUoB,EAASM,EA6DpI0D,EAAKC,EAAKC,EAAKC,EAAIC,EAAIC,EAAIC,EAAOrD,EA7DlCsD,EAAYp5B,EAAUq5B,EAAiBzD,KAA6BrB,EAAWkE,GAAiB5qB,EAAIE,EAAID,EAAIE,GAC5G4lB,EAAO,CACTtrB,MAAOA,EACPmmB,UA2DF,WACEmF,EAAKtrB,MAAQ4pB,EACT2C,GAASA,EAAQhlC,KAAKslC,EAAO,IACjCgE,GAAQ,EACRD,GAAK,EACLF,EAAKC,EAAK//B,KA/DVw1B,QAiEF,WACM+E,IACFvB,EAAU2G,EAAKC,GACXC,GAAOG,GAAIG,EAAejD,SAC9B3C,EAAS5jC,KAAKwpC,EAAe1D,WAE/B/B,EAAKtrB,MAAQA,EACT4wB,GAAIl5B,EAAS0uB,WAvEjBC,aAAc,WACZ3uB,EAAWq5B,EACX5F,EAAW,GACXoB,EAAU,GACViB,GAAQ,GAEVlH,WAAY,WACV5uB,EAAWo5B,EACX3F,EAAWptC,EAAGiE,MAAMmpC,GACpB,IAAIC,EAgBR,SAAuBjqC,GAErB,IADA,IAAI6vC,EAAK,EAAGjwC,EAAIwrC,EAAQ9gC,OAAQ/K,EAAIS,EAAE,GAC7B/B,EAAI,EAAGA,EAAI2B,IAAK3B,EACvB,IAAK,IAAmDqG,EAA/CpE,EAAI,EAAGhC,EAAIktC,EAAQntC,GAAI6J,EAAI5J,EAAEoM,OAAQjG,EAAInG,EAAE,GAAOgC,EAAI4H,IAAK5H,EAClEoE,EAAIpG,EAAEgC,GACFmE,EAAE,IAAM9E,EACN+E,EAAE,GAAK/E,GAAKyiB,GAAW3d,EAAGC,EAAGtE,GAAK,KAAK6vC,EAEvCvrC,EAAE,IAAM/E,GAAKyiB,GAAW3d,EAAGC,EAAGtE,GAAK,KAAK6vC,EAE9CxrC,EAAIC,EAGR,OAAc,IAAPurC,EA7BiBC,CAAc,CAAE1rB,EAAIG,IAAOwrB,EAAS1D,GAASpC,EAAiB/jC,EAAU8jC,EAAS1/B,QACnGylC,GAAU7pC,KACZqQ,EAAS2uB,eACL6K,IACFx5B,EAASyuB,YACTkF,EAAY,KAAM,KAAM,EAAG3zB,GAC3BA,EAAS0uB,WAEP/+B,GACF6jC,GAAmBC,EAAUl6B,EAASm6B,EAAiBC,EAAa3zB,GAEtEA,EAAS4uB,cAEX6E,EAAWoB,EAAUM,EAAO,OAkBhC,SAASxB,EAAYiD,EAAMC,EAAIC,EAAW92B,GACxC,IAAIlS,EAAI,EAAG2rC,EAAK,EAChB,GAAY,MAAR7C,IAAiB9oC,EAAI4rC,EAAO9C,EAAME,OAAiB2C,EAAKC,EAAO7C,EAAIC,KAAe6C,EAAc/C,EAAMC,GAAM,EAAIC,EAAY,EAC9H,GACE92B,EAASsI,MAAY,IAANxa,GAAiB,IAANA,EAAU+f,EAAKC,EAAIhgB,EAAI,EAAIkgB,EAAKD,UAClDjgB,GAAKA,EAAIgpC,EAAY,GAAK,KAAO2C,QAE3Cz5B,EAASsI,MAAMuuB,EAAG,GAAIA,EAAG,IAG7B,SAASvC,EAAavqC,EAAGf,GACvB,OAAO6kB,GAAM9jB,GAAKA,GAAK+jB,GAAMC,GAAM/kB,GAAKA,GAAKglB,EAE/C,SAAS1F,EAAMve,EAAGf,GACZsrC,EAAavqC,EAAGf,IAAIgX,EAASsI,MAAMve,EAAGf,GAmB5C,SAASkpC,EAAUnoC,EAAGf,GAGpB,IAAIrB,EAAI2sC,EAFRvqC,EAAInC,KAAK4C,KAnGY,IAmGe5C,KAAKiS,IAnGpB,IAmG8C9P,IACnEf,EAAIpB,KAAK4C,KApGY,IAoGe5C,KAAKiS,IApGpB,IAoG8C7Q,KAGnE,GADI6rC,GAASM,EAAKtlC,KAAK,CAAE9F,EAAGf,IACxBmwC,EACFN,EAAM9uC,EAAG+uC,EAAM9vC,EAAG+vC,EAAMpxC,EACxBwxC,GAAQ,EACJxxC,IACFqY,EAASyuB,YACTzuB,EAASsI,MAAMve,EAAGf,SAGpB,GAAIrB,GAAKuxC,EAAIl5B,EAASsI,MAAMve,EAAGf,OAAS,CACtC,IAAIsI,EAAI,CACNxD,EAAG,CACD/D,EAAGivC,EACHhwC,EAAGiwC,GAELlrC,EAAG,CACDhE,EAAGA,EACHf,EAAGA,IAGHurC,EAASjjC,IACN4nC,IACHl5B,EAASyuB,YACTzuB,EAASsI,MAAMhX,EAAExD,EAAE/D,EAAGuH,EAAExD,EAAE9E,IAE5BgX,EAASsI,MAAMhX,EAAEvD,EAAEhE,EAAGuH,EAAEvD,EAAE/E,GACrBrB,GAAGqY,EAAS0uB,UACjBoH,GAAQ,GACCnuC,IACTqY,EAASyuB,YACTzuB,EAASsI,MAAMve,EAAGf,GAClB8sC,GAAQ,GAIdkD,EAAKjvC,EAAGkvC,EAAKjwC,EAAGkwC,EAAKvxC,EAEvB,OAAOisC,GAET,SAAS8F,EAAOjwC,EAAGqtC,GACjB,OAAO36B,EAAI1S,EAAE,GAAKokB,GAAM9C,GAAI+rB,EAAY,EAAI,EAAI,EAAI36B,EAAI1S,EAAE,GAAKqkB,GAAM/C,GAAI+rB,EAAY,EAAI,EAAI,EAAI36B,EAAI1S,EAAE,GAAKskB,GAAMhD,GAAI+rB,EAAY,EAAI,EAAI,EAAIA,EAAY,EAAI,EAAI,EAEpK,SAASv9B,EAAQzL,EAAGC,GAClB,OAAO4rC,EAAc7rC,EAAE/D,EAAGgE,EAAEhE,GAE9B,SAAS4vC,EAAc7rC,EAAGC,GACxB,IAAI6rC,EAAKF,EAAO5rC,EAAG,GAAI+rC,EAAKH,EAAO3rC,EAAG,GACtC,OAAO6rC,IAAOC,EAAKD,EAAKC,EAAY,IAAPD,EAAW7rC,EAAE,GAAKD,EAAE,GAAY,IAAP8rC,EAAW9rC,EAAE,GAAKC,EAAE,GAAY,IAAP6rC,EAAW9rC,EAAE,GAAKC,EAAE,GAAKA,EAAE,GAAKD,EAAE,IAGrH,SAASgsC,GAAaC,GACpB,IAAIzI,EAAK,EAAGE,EAAKvmB,GAAI,EAAG1Z,EAAIyoC,GAAyBD,GAAYtwC,EAAI8H,EAAE+/B,EAAIE,GAK3E,OAJA/nC,EAAEwwC,UAAY,SAASr9B,GACrB,OAAKrK,UAAUwB,OACRxC,EAAE+/B,EAAK10B,EAAE,GAAKqO,GAAI,IAAKumB,EAAK50B,EAAE,GAAKqO,GAAI,KADhB,CAAEqmB,EAAKrmB,GAAI,IAAKumB,EAAKvmB,GAAI,MAGlDxhB,EAET,SAASywC,GAAsB5I,EAAIE,GACjC,IAAIvB,EAAQroC,KAAKqkB,IAAIqlB,GAAKjoC,GAAK4mC,EAAQroC,KAAKqkB,IAAIulB,IAAO,EAAGroC,EAAI,EAAI8mC,GAAS,EAAI5mC,EAAI4mC,GAAQkK,EAAKvyC,KAAK6S,KAAKtR,GAAKE,EAC/G,SAAS+wC,EAAQjK,EAAGC,GAClB,IAAIlkB,EAAItkB,KAAK6S,KAAKtR,EAAI,EAAIE,EAAIzB,KAAKqkB,IAAImkB,IAAM/mC,EAC7C,MAAO,CAAE6iB,EAAItkB,KAAKqkB,IAAIkkB,GAAK9mC,GAAI8wC,EAAKjuB,EAAItkB,KAAKkrB,IAAIqd,IAMnD,OAJAiK,EAAQ/qB,OAAS,SAAStlB,EAAGf,GAC3B,IAAIqxC,EAAOF,EAAKnxC,EAChB,MAAO,CAAEpB,KAAKyrB,MAAMtpB,EAAGswC,GAAQhxC,EAAGuiB,IAASziB,GAAKY,EAAIA,EAAIswC,EAAOA,GAAQhxC,EAAIA,IAAM,EAAIA,MAEhF+wC,EAzKT/zC,EAAGsmC,IAAI2N,WAAa,WAClB,IAAIzsB,EAAIE,EAAID,EAAIE,EAAIof,EAAQwG,EAAM0G,EAAa,CAC7ClN,OAAQ,SAASmN,GAIf,OAHInN,IAAQA,EAAOoN,OAAQ,IAC3BpN,EAASwG,EAAK2G,IACPC,OAAQ,EACRpN,GAETtzB,OAAQ,SAAS8C,GACf,OAAKrK,UAAUwB,QACf6/B,EAAOgF,GAAkB/qB,GAAMjR,EAAE,GAAG,GAAImR,GAAMnR,EAAE,GAAG,GAAIkR,GAAMlR,EAAE,GAAG,GAAIoR,GAAMpR,EAAE,GAAG,IAC7EwwB,IAAQA,EAAOoN,OAAQ,EAAOpN,EAAS,MACpCkN,GAHuB,CAAE,CAAEzsB,EAAIE,GAAM,CAAED,EAAIE,MAMtD,OAAOssB,EAAWxgC,OAAO,CAAE,CAAE,EAAG,GAAK,CAAE,IAAK,SA4J7CzT,EAAGsmC,IAAI8N,eAAiB,WACvB,OAAOX,GAAaI,MACnBQ,IAAMR,GACT7zC,EAAGsmC,IAAIgO,OAAS,WACd,OAAOt0C,EAAGsmC,IAAI8N,iBAAiBhG,OAAO,CAAE,GAAI,IAAK/mB,OAAO,EAAG,GAAI,OAAQusB,UAAU,CAAE,KAAM,OAAQzzC,MAAM,OAEzGH,EAAGsmC,IAAIiO,UAAY,WACjB,IAGItyB,EAIDuyB,EAAcC,EAAaC,EAP1BC,EAAU30C,EAAGsmC,IAAIgO,SACjBM,EAAS50C,EAAGsmC,IAAI8N,iBAAiBhG,OAAO,CAAE,IAAK,IAAK/mB,OAAO,EAAG,EAAG,OAAQusB,UAAU,CAAE,GAAI,KACzFiB,EAAS70C,EAAGsmC,IAAI8N,iBAAiBhG,OAAO,CAAE,IAAK,IAAK/mB,OAAO,EAAG,EAAG,OAAQusB,UAAU,CAAE,EAAG,KACjFkB,EAAc,CACvB7yB,MAAO,SAASve,EAAGf,GACjBsf,EAAQ,CAAEve,EAAGf,KAGjB,SAAS4xC,EAAU/M,GACjB,IAAI9jC,EAAI8jC,EAAY,GAAI7kC,EAAI6kC,EAAY,GAGxC,OAFAvlB,EAAQ,KACPuyB,EAAa9wC,EAAGf,GAAIsf,IAAWwyB,EAAY/wC,EAAGf,GAAIsf,IAAUyyB,EAAYhxC,EAAGf,GACrEsf,EA+DT,OA7DAsyB,EAAUvrB,OAAS,SAASwe,GAC1B,IAAIzkC,EAAI4xC,EAAQx0C,QAAS0C,EAAI8xC,EAAQxrB,YAAazlB,GAAK8jC,EAAY,GAAK3kC,EAAE,IAAME,EAAGJ,GAAK6kC,EAAY,GAAK3kC,EAAE,IAAME,EACjH,OAAQJ,GAAK,KAAOA,EAAI,MAAQe,IAAM,MAAQA,GAAK,KAAOkxC,EAASjyC,GAAK,MAAQA,EAAI,MAAQe,IAAM,MAAQA,GAAK,KAAOmxC,EAASF,GAAS3rB,OAAOwe,IAEjJ+M,EAAUxN,OAAS,SAASA,GAC1B,IAAIgO,EAAgBJ,EAAQ5N,OAAOA,GAASiO,EAAeJ,EAAO7N,OAAOA,GAASkO,EAAeJ,EAAO9N,OAAOA,GAC/G,MAAO,CACL9kB,MAAO,SAASve,EAAGf,GACjBoyC,EAAc9yB,MAAMve,EAAGf,GACvBqyC,EAAa/yB,MAAMve,EAAGf,GACtBsyC,EAAahzB,MAAMve,EAAGf,IAExB2kC,OAAQ,WACNyN,EAAczN,SACd0N,EAAa1N,SACb2N,EAAa3N,UAEfc,UAAW,WACT2M,EAAc3M,YACd4M,EAAa5M,YACb6M,EAAa7M,aAEfC,QAAS,WACP0M,EAAc1M,UACd2M,EAAa3M,UACb4M,EAAa5M,WAEfC,aAAc,WACZyM,EAAczM,eACd0M,EAAa1M,eACb2M,EAAa3M,gBAEfC,WAAY,WACVwM,EAAcxM,aACdyM,EAAazM,aACb0M,EAAa1M,gBAInBgM,EAAUtX,UAAY,SAAS1mB,GAC7B,OAAKrK,UAAUwB,QACfinC,EAAQ1X,UAAU1mB,GAClBq+B,EAAO3X,UAAU1mB,GACjBs+B,EAAO5X,UAAU1mB,GACVg+B,GAJuBI,EAAQ1X,aAMxCsX,EAAUp0C,MAAQ,SAASoW,GACzB,OAAKrK,UAAUwB,QACfinC,EAAQx0C,MAAMoW,GACdq+B,EAAOz0C,MAAU,IAAJoW,GACbs+B,EAAO10C,MAAMoW,GACNg+B,EAAUprB,UAAUwrB,EAAQxrB,cAJLwrB,EAAQx0C,SAMxCo0C,EAAUprB,UAAY,SAAS5S,GAC7B,IAAKrK,UAAUwB,OAAQ,OAAOinC,EAAQxrB,YACtC,IAAIpmB,EAAI4xC,EAAQx0C,QAASuD,GAAK6S,EAAE,GAAI5T,GAAK4T,EAAE,GAI3C,OAHAi+B,EAAeG,EAAQxrB,UAAU5S,GAAG09B,WAAW,CAAE,CAAEvwC,EAAI,KAAOX,EAAGJ,EAAI,KAAOI,GAAK,CAAEW,EAAI,KAAOX,EAAGJ,EAAI,KAAOI,KAAOgkC,OAAO+N,GAAa7yB,MACvIwyB,EAAcG,EAAOzrB,UAAU,CAAEzlB,EAAI,KAAOX,EAAGJ,EAAI,KAAOI,IAAKkxC,WAAW,CAAE,CAAEvwC,EAAI,KAAOX,EAAI2hB,GAAG/hB,EAAI,IAAMI,EAAI2hB,IAAK,CAAEhhB,EAAI,KAAOX,EAAI2hB,GAAG/hB,EAAI,KAAOI,EAAI2hB,MAAOqiB,OAAO+N,GAAa7yB,MACjLyyB,EAAcG,EAAO1rB,UAAU,CAAEzlB,EAAI,KAAOX,EAAGJ,EAAI,KAAOI,IAAKkxC,WAAW,CAAE,CAAEvwC,EAAI,KAAOX,EAAI2hB,GAAG/hB,EAAI,KAAOI,EAAI2hB,IAAK,CAAEhhB,EAAI,KAAOX,EAAI2hB,GAAG/hB,EAAI,KAAOI,EAAI2hB,MAAOqiB,OAAO+N,GAAa7yB,MAC3KsyB,GAEFA,EAAUp0C,MAAM,OAEzB,IAAI+0C,GAAoBC,GA2BpBC,GAAqBC,GAAqBC,GAAqBC,GA3BnBC,GAAkB,CAChEvzB,MAAO7I,EACPgvB,UAAWhvB,EACXivB,QAASjvB,EACTkvB,aAAc,WACZ6M,GAAyB,EACzBK,GAAgBpN,UAAYqN,IAE9BlN,WAAY,WACViN,GAAgBpN,UAAYoN,GAAgBnN,QAAUmN,GAAgBvzB,MAAQ7I,EAC9E87B,IAAsBp/B,EAAIq/B,GAAyB,KAGvD,SAASM,KACP,IAAIC,EAAKC,EAAKnuB,EAAIE,EAKlB,SAASmiB,EAAUnmC,EAAGf,GACpBwyC,IAA0BztB,EAAKhkB,EAAI8jB,EAAK7kB,EACxC6kB,EAAK9jB,EAAGgkB,EAAK/kB,EANf6yC,GAAgBvzB,MAAQ,SAASve,EAAGf,GAClC6yC,GAAgBvzB,MAAQ4nB,EACxB6L,EAAMluB,EAAK9jB,EAAGiyC,EAAMjuB,EAAK/kB,GAM3B6yC,GAAgBnN,QAAU,WACxBwB,EAAU6L,EAAKC,IAInB,IAAIC,GAAoB,CACtB3zB,MAMF,SAAgCve,EAAGf,GAC7Be,EAAI0xC,KAAqBA,GAAsB1xC,GAC/CA,EAAI4xC,KAAqBA,GAAsB5xC,GAC/Cf,EAAI0yC,KAAqBA,GAAsB1yC,GAC/CA,EAAI4yC,KAAqBA,GAAsB5yC,IATnDylC,UAAWhvB,EACXivB,QAASjvB,EACTkvB,aAAclvB,EACdmvB,WAAYnvB,GAQd,SAASy8B,KACP,IAAIC,EAAcC,GAAwB,KAAMzG,EAAS,GACrDvI,EAAS,CACX9kB,MAAOA,EACPmmB,UAAW,WACTrB,EAAO9kB,MAAQ+zB,GAEjB3N,QAASA,EACTC,aAAc,WACZvB,EAAOsB,QAAU4N,GAEnB1N,WAAY,WACVxB,EAAOsB,QAAUA,EACjBtB,EAAO9kB,MAAQA,GAEjBi0B,YAAa,SAAS3/B,GAEpB,OADAu/B,EAAcC,GAAwBx/B,GAC/BwwB,GAETpP,OAAQ,WACN,GAAI2X,EAAO5hC,OAAQ,CACjB,IAAIiqB,EAAS2X,EAAO7V,KAAK,IAEzB,OADA6V,EAAS,GACF3X,KAIb,SAAS1V,EAAMve,EAAGf,GAChB2sC,EAAO9lC,KAAK,IAAK9F,EAAG,IAAKf,EAAGmzC,GAE9B,SAASE,EAAetyC,EAAGf,GACzB2sC,EAAO9lC,KAAK,IAAK9F,EAAG,IAAKf,GACzBokC,EAAO9kB,MAAQotB,EAEjB,SAASA,EAAU3rC,EAAGf,GACpB2sC,EAAO9lC,KAAK,IAAK9F,EAAG,IAAKf,GAE3B,SAAS0lC,IACPtB,EAAO9kB,MAAQA,EAEjB,SAASg0B,IACP3G,EAAO9lC,KAAK,KAEd,OAAOu9B,EAET,SAASgP,GAAwBv1C,GAC/B,MAAO,MAAQA,EAAS,IAAMA,EAAS,IAAMA,EAAS,aAAe,EAAIA,EAAS,IAAMA,EAAS,IAAMA,EAAS,YAAc,EAAIA,EAAS,IAE7I,IAqmBI21C,GArmBAC,GAAsB,CACxBn0B,MAAOo0B,GACPjO,UAAWkO,GACXjO,QAASkO,GACTjO,aAAc,WACZ8N,GAAoBhO,UAAYoO,IAElCjO,WAAY,WACV6N,GAAoBn0B,MAAQo0B,GAC5BD,GAAoBhO,UAAYkO,GAChCF,GAAoB/N,QAAUkO,KAGlC,SAASF,GAAyB3yC,EAAGf,GACnCkmC,IAAqBnlC,EACrBolC,IAAqBnmC,IACnBomC,GAEJ,SAASuN,KACP,IAAI9uB,EAAIE,EAKR,SAASmiB,EAAUnmC,EAAGf,GACpB,IAAI4hB,EAAK7gB,EAAI8jB,EAAIhD,EAAK7hB,EAAI+kB,EAAIvf,EAAI5G,KAAK6S,KAAKmQ,EAAKA,EAAKC,EAAKA,GAC3DwkB,IAAqB7gC,GAAKqf,EAAK9jB,GAAK,EACpCulC,IAAqB9gC,GAAKuf,EAAK/kB,GAAK,EACpCumC,IAAqB/gC,EACrBkuC,GAAyB7uB,EAAK9jB,EAAGgkB,EAAK/kB,GATxCyzC,GAAoBn0B,MAAQ,SAASve,EAAGf,GACtCyzC,GAAoBn0B,MAAQ4nB,EAC5BwM,GAAyB7uB,EAAK9jB,EAAGgkB,EAAK/kB,IAU1C,SAAS4zC,KACPH,GAAoBn0B,MAAQo0B,GAE9B,SAASG,KACP,IAAId,EAAKC,EAAKnuB,EAAIE,EAKlB,SAASmiB,EAAUnmC,EAAGf,GACpB,IAAI4hB,EAAK7gB,EAAI8jB,EAAIhD,EAAK7hB,EAAI+kB,EAAIvf,EAAI5G,KAAK6S,KAAKmQ,EAAKA,EAAKC,EAAKA,GAC3DwkB,IAAqB7gC,GAAKqf,EAAK9jB,GAAK,EACpCulC,IAAqB9gC,GAAKuf,EAAK/kB,GAAK,EACpCumC,IAAqB/gC,EAErBghC,KADAhhC,EAAIuf,EAAKhkB,EAAI8jB,EAAK7kB,IACQ6kB,EAAK9jB,GAC/B0lC,IAAqBjhC,GAAKuf,EAAK/kB,GAC/B0mC,IAAyB,EAAJlhC,EACrBkuC,GAAyB7uB,EAAK9jB,EAAGgkB,EAAK/kB,GAbxCyzC,GAAoBn0B,MAAQ,SAASve,EAAGf,GACtCyzC,GAAoBn0B,MAAQ4nB,EAC5BwM,GAAyBX,EAAMluB,EAAK9jB,EAAGiyC,EAAMjuB,EAAK/kB,IAapDyzC,GAAoB/N,QAAU,WAC5BwB,EAAU6L,EAAKC,IAGnB,SAASc,GAAmBC,GAC1B,IAAIR,EAAc,IACdnP,EAAS,CACX9kB,MAAOA,EACPmmB,UAAW,WACTrB,EAAO9kB,MAAQ+zB,GAEjB3N,QAASA,EACTC,aAAc,WACZvB,EAAOsB,QAAU4N,GAEnB1N,WAAY,WACVxB,EAAOsB,QAAUA,EACjBtB,EAAO9kB,MAAQA,GAEjBi0B,YAAa,SAAS3/B,GAEpB,OADA2/B,EAAc3/B,EACPwwB,GAETpP,OAAQve,GAEV,SAAS6I,EAAMve,EAAGf,GAChB+zC,EAAQC,OAAOjzC,EAAIwyC,EAAavzC,GAChC+zC,EAAQr2C,IAAIqD,EAAGf,EAAGuzC,EAAa,EAAGpxB,IAEpC,SAASkxB,EAAetyC,EAAGf,GACzB+zC,EAAQC,OAAOjzC,EAAGf,GAClBokC,EAAO9kB,MAAQotB,EAEjB,SAASA,EAAU3rC,EAAGf,GACpB+zC,EAAQE,OAAOlzC,EAAGf,GAEpB,SAAS0lC,IACPtB,EAAO9kB,MAAQA,EAEjB,SAASg0B,IACPS,EAAQG,YAEV,OAAO9P,EAET,SAAS+P,GAAgBC,GACvB,IAAIC,EAAK,GAAIC,EAAiB11C,KAAKkrB,IAAI,GAAKxH,IAAaiyB,EAAW,GACpE,SAASC,EAASpQ,GAChB,OAAQmQ,EAAWE,EAAoBC,GAActQ,GAEvD,SAASsQ,EAAatQ,GACpB,OAAOuQ,GAAsBvQ,GAAQ,SAASrjC,EAAGf,GAC/Ce,EAAIqzC,EAAQrzC,EAAGf,GACfokC,EAAO9kB,MAAMve,EAAE,GAAIA,EAAE,OAGzB,SAAS0zC,EAAkBrQ,GACzB,IAAIyC,EAAUkM,EAAKC,EAAK4B,EAAKC,EAAKC,EAAK/N,EAAIliB,EAAIE,EAAIgwB,EAAI/wB,EAAImqB,EACvDqG,EAAW,CACbl1B,MAAOA,EACPmmB,UAAWA,EACXC,QAASA,EACTC,aAAc,WACZvB,EAAOuB,eACP6O,EAAS/O,UAAYuD,GAEvBpD,WAAY,WACVxB,EAAOwB,aACP4O,EAAS/O,UAAYA,IAGzB,SAASnmB,EAAMve,EAAGf,GAChBe,EAAIqzC,EAAQrzC,EAAGf,GACfokC,EAAO9kB,MAAMve,EAAE,GAAIA,EAAE,IAEvB,SAAS0kC,IACP5gB,EAAK3U,IACLskC,EAASl1B,MAAQ4pB,EACjB9E,EAAOqB,YAET,SAASyD,EAAU/B,EAAGC,GACpB,IAAIviC,EAAI6iC,GAAiB,CAAEP,EAAGC,IAAM3mC,EAAI2zC,EAAQjN,EAAGC,GACnD4N,EAAenwB,EAAIE,EAAIgiB,EAAIgO,EAAI/wB,EAAImqB,EAAItpB,EAAKpkB,EAAE,GAAIskB,EAAKtkB,EAAE,GAAIsmC,EAAKI,EAAG4N,EAAKlwC,EAAE,GAAImf,EAAKnf,EAAE,GAAIspC,EAAKtpC,EAAE,GAAI0vC,EAAUnQ,GAChHA,EAAO9kB,MAAMuF,EAAIE,GAEnB,SAAS2gB,IACP8O,EAASl1B,MAAQA,EACjB8kB,EAAOsB,UAET,SAASsD,IACPvD,IACA+O,EAASl1B,MAAQypB,EACjByL,EAAS9O,QAAUuD,EAErB,SAASF,EAAU5B,EAAGC,GACpB8B,EAAUrC,EAAMM,EAASC,GAAI2L,EAAMluB,EAAImuB,EAAMjuB,EAAI6vB,EAAMG,EAAIF,EAAM7wB,EAAI8wB,EAAM3G,EAC3EqG,EAASl1B,MAAQ4pB,EAEnB,SAASD,IACP+L,EAAenwB,EAAIE,EAAIgiB,EAAIgO,EAAI/wB,EAAImqB,EAAI4E,EAAKC,EAAKnM,EAAK+N,EAAKC,EAAKC,EAAKP,EAAUnQ,GAC/EoQ,EAAS9O,QAAUA,EACnBA,IAEF,OAAO8O,EAET,SAASQ,EAAenwB,EAAIE,EAAIgiB,EAAIgO,EAAI/wB,EAAImqB,EAAIrpB,EAAIE,EAAIujB,EAAIkI,EAAIxsB,EAAIgrB,EAAIj5B,EAAOouB,GAC7E,IAAIxiB,EAAKkD,EAAKD,EAAIhD,EAAKmD,EAAKD,EAAIlB,EAAKjC,EAAKA,EAAKC,EAAKA,EACpD,GAAIgC,EAAK,EAAIwwB,GAAMr+B,IAAS,CAC1B,IAAIlR,EAAIiwC,EAAKtE,EAAI1rC,EAAIif,EAAKC,EAAIpf,EAAIspC,EAAKc,EAAI1mC,EAAI3J,KAAK6S,KAAK3M,EAAIA,EAAIC,EAAIA,EAAIF,EAAIA,GAAIowC,EAAKr2C,KAAKikB,KAAKhe,GAAK0D,GAAI2sC,EAAK/hC,EAAIA,EAAItO,GAAK,GAAKkd,IAAK5O,EAAI4zB,EAAKwB,GAAMxmB,IAAKglB,EAAKwB,GAAM,EAAI3pC,KAAKyrB,MAAMtlB,EAAGD,GAAIrE,EAAI2zC,EAAQc,EAAID,GAAKE,EAAK10C,EAAE,GAAI20C,EAAK30C,EAAE,GAAI40C,EAAMF,EAAKtwB,EAAIywB,EAAMF,EAAKrwB,EAAIwwB,EAAK1zB,EAAKwzB,EAAMzzB,EAAK0zB,GACpRC,EAAKA,EAAK1xB,EAAKwwB,GAAMlhC,GAAKyO,EAAKyzB,EAAMxzB,EAAKyzB,GAAOzxB,EAAK,IAAM,IAAMkxB,EAAKtE,EAAKzsB,EAAKC,EAAKkqB,EAAKc,EAAKqF,KAClGU,EAAenwB,EAAIE,EAAIgiB,EAAIgO,EAAI/wB,EAAImqB,EAAIgH,EAAIC,EAAIF,EAAIpwC,GAAKyD,EAAGxD,GAAKwD,EAAG1D,EAAGmR,EAAOouB,GAC7EA,EAAO9kB,MAAM61B,EAAIC,GACjBJ,EAAeG,EAAIC,EAAIF,EAAIpwC,EAAGC,EAAGF,EAAGigB,EAAIE,EAAIujB,EAAIkI,EAAIxsB,EAAIgrB,EAAIj5B,EAAOouB,KASzE,OALAoQ,EAASla,UAAY,SAAS1mB,GAC5B,OAAKrK,UAAUwB,QACfwpC,GAAYF,EAAKzgC,EAAIA,GAAK,GAAK,GACxB4gC,GAFuB51C,KAAK6S,KAAK4iC,IAInCG,EAiDT,SAASgB,GAAyBpB,GAChC,IAAII,EAAWL,IAAgB,SAASpzC,EAAGf,GACzC,OAAOo0C,EAAQ,CAAErzC,EAAIwhB,GAAYviB,EAAIuiB,QAEvC,OAAO,SAAS6hB,GACd,OAAOqR,GAAyBjB,EAASpQ,KAY7C,SAASsR,GAAiBtR,GACxBrlC,KAAKqlC,OAASA,EAsBhB,SAASuQ,GAAsBvQ,EAAQ9kB,GACrC,MAAO,CACLA,MAAOA,EACPqlB,OAAQ,WACNP,EAAOO,UAETc,UAAW,WACTrB,EAAOqB,aAETC,QAAS,WACPtB,EAAOsB,WAETC,aAAc,WACZvB,EAAOuB,gBAETC,WAAY,WACVxB,EAAOwB,eAMb,SAAS+P,GAAkBvB,GACzB,OAAOpD,IAAyB,WAC9B,OAAOoD,IADFpD,GAIT,SAASA,GAAyBD,GAChC,IAAIqD,EAAS3I,EAAQmK,EAGgDC,EAAIC,EAAoG1R,EAHzI2R,EAAkB5B,IAAgB,SAASpzC,EAAGf,GAEhF,MAAO,EADPe,EAAIqzC,EAAQrzC,EAAGf,IACJ,GAAKI,EAAIy1C,EAAIC,EAAK/0C,EAAE,GAAKX,MAClCA,EAAI,IAAKW,EAAI,IAAKf,EAAI,IAAKmnC,EAAI,EAAGC,EAAI,EAAGkI,EAAK,EAAG0G,EAAK,EAAGC,EAAK,EAAWC,EAAU7I,GAAyB8I,EAAWlhC,EAAamhC,EAAY,KAAM9E,EAAa,KACvK,SAAS+E,EAAW/2B,GAElB,MAAO,EADPA,EAAQs2B,EAAct2B,EAAM,GAAKgD,GAAYhD,EAAM,GAAKgD,KACzC,GAAKliB,EAAIy1C,EAAIC,EAAKx2B,EAAM,GAAKlf,GAE9C,SAASimB,EAAO/G,GAEd,OADAA,EAAQs2B,EAAcvvB,QAAQ/G,EAAM,GAAKu2B,GAAMz1C,GAAI01C,EAAKx2B,EAAM,IAAMlf,KACpD,CAAEkf,EAAM,GAAKiD,GAAYjD,EAAM,GAAKiD,IA4CtD,SAASuhB,IACP8R,EAAgBvL,GAAeoB,EAAS6K,GAAgBhH,EAAI0G,EAAIC,GAAK7B,GACrE,IAAI1vB,EAAS0vB,EAAQjN,EAAGC,GAGxB,OAFAyO,EAAK90C,EAAI2jB,EAAO,GAAKtkB,EACrB01C,EAAK91C,EAAI0kB,EAAO,GAAKtkB,EACdm2C,IAET,SAASA,IAEP,OADInS,IAAQA,EAAOoN,OAAQ,EAAOpN,EAAS,MACpCiS,EAET,OArDAA,EAAWjS,OAAS,SAASmN,GAI3B,OAHInN,IAAQA,EAAOoN,OAAQ,IAC3BpN,EAASqR,GAAyBS,EAAQzK,EAAQsK,EAAgBI,EAAS5E,OACpEC,OAAQ,EACRpN,GAETiS,EAAWD,UAAY,SAASxiC,GAC9B,OAAKrK,UAAUwB,QACfmrC,EAAe,MAALtiC,GAAawiC,EAAYxiC,EAAGy5B,IAA2BU,IAAmBqI,GAAaxiC,GAAK0O,IAC/Fi0B,KAFuBH,GAIhCC,EAAW/E,WAAa,SAAS19B,GAC/B,OAAKrK,UAAUwB,QACfumC,EAAa19B,EACbuiC,EAAWviC,EAAIg8B,GAAkBh8B,EAAE,GAAG,GAAIA,EAAE,GAAG,GAAIA,EAAE,GAAG,GAAIA,EAAE,GAAG,IAAMqB,EAChEshC,KAHuBjF,GAKhC+E,EAAW74C,MAAQ,SAASoW,GAC1B,OAAKrK,UAAUwB,QACf3K,GAAKwT,EACEkwB,KAFuB1jC,GAIhCi2C,EAAW7vB,UAAY,SAAS5S,GAC9B,OAAKrK,UAAUwB,QACfhK,GAAK6S,EAAE,GACP5T,GAAK4T,EAAE,GACAkwB,KAHuB,CAAE/iC,EAAGf,IAKrCq2C,EAAW3xB,OAAS,SAAS9Q,GAC3B,OAAKrK,UAAUwB,QACfo8B,EAAIvzB,EAAE,GAAK,IAAM0O,GACjB8kB,EAAIxzB,EAAE,GAAK,IAAM0O,GACVwhB,KAHuB,CAAEqD,EAAI5kB,GAAY6kB,EAAI7kB,KAKtD8zB,EAAW5K,OAAS,SAAS73B,GAC3B,OAAKrK,UAAUwB,QACfukC,EAAK17B,EAAE,GAAK,IAAM0O,GAClB0zB,EAAKpiC,EAAE,GAAK,IAAM0O,GAClB2zB,EAAKriC,EAAE7I,OAAS,EAAI6I,EAAE,GAAK,IAAM0O,GAAa,EACvCwhB,KAJuB,CAAEwL,EAAK/sB,GAAYyzB,EAAKzzB,GAAY0zB,EAAK1zB,KAMzEllB,EAAGmZ,OAAO6/B,EAAYN,EAAiB,aAYhC,WAGL,OAFA3B,EAAUrD,EAAUznC,MAAMvK,KAAMwK,WAChC8sC,EAAWhwB,OAAS+tB,EAAQ/tB,QAAUA,EAC/Byd,KAGX,SAAS2R,GAAyBrR,GAChC,OAAOuQ,GAAsBvQ,GAAQ,SAASrjC,EAAGf,GAC/CokC,EAAO9kB,MAAMve,EAAIuhB,GAAYtiB,EAAIsiB,OAGrC,SAASk0B,GAAuBrP,EAAGC,GACjC,MAAO,CAAED,EAAGC,GAiBd,SAASqP,GAAwBtP,EAAGC,GAClC,MAAO,CAAED,EAAIllB,GAAIklB,EAAIhlB,GAAIglB,GAAKllB,GAAIklB,EAAIhlB,GAAIglB,EAAGC,GAG/C,SAASkP,GAAgBhH,EAAI0G,EAAIC,GAC/B,OAAO3G,EAAK0G,GAAMC,EAAK5L,GAAeqM,GAAiBpH,GAAKqH,GAAkBX,EAAIC,IAAOS,GAAiBpH,GAAM0G,GAAMC,EAAKU,GAAkBX,EAAIC,GAAMQ,GAEzJ,SAASG,GAAwBtH,GAC/B,OAAO,SAASnI,EAAGC,GACjB,MAAgB,EAATD,GAAKmI,GAAUrtB,GAAIklB,EAAIhlB,GAAIglB,GAAKllB,GAAIklB,EAAIhlB,GAAIglB,EAAGC,IAG1D,SAASsP,GAAiBpH,GACxB,IAAIuH,EAAWD,GAAwBtH,GAEvC,OADAuH,EAASxwB,OAASuwB,IAAyBtH,GACpCuH,EAET,SAASF,GAAkBX,EAAIC,GAC7B,IAAIa,EAAQl4C,KAAKkrB,IAAIksB,GAAKe,EAAQn4C,KAAKqkB,IAAI+yB,GAAKgB,EAAQp4C,KAAKkrB,IAAImsB,GAAKgB,EAAQr4C,KAAKqkB,IAAIgzB,GACvF,SAASY,EAAS1P,EAAGC,GACnB,IAAII,EAAO5oC,KAAKkrB,IAAIsd,GAAIrmC,EAAInC,KAAKkrB,IAAIqd,GAAKK,EAAMxnC,EAAIpB,KAAKqkB,IAAIkkB,GAAKK,EAAMhiC,EAAI5G,KAAKqkB,IAAImkB,GAAIhnC,EAAIoF,EAAIsxC,EAAQ/1C,EAAIg2C,EAC7G,MAAO,CAAEn4C,KAAKyrB,MAAMrqB,EAAIg3C,EAAQ52C,EAAI62C,EAAOl2C,EAAI+1C,EAAQtxC,EAAIuxC,GAAQn0B,GAAQxiB,EAAI42C,EAAQh3C,EAAIi3C,IAM7F,OAJAJ,EAASxwB,OAAS,SAAS8gB,EAAGC,GAC5B,IAAII,EAAO5oC,KAAKkrB,IAAIsd,GAAIrmC,EAAInC,KAAKkrB,IAAIqd,GAAKK,EAAMxnC,EAAIpB,KAAKqkB,IAAIkkB,GAAKK,EAAMhiC,EAAI5G,KAAKqkB,IAAImkB,GAAIhnC,EAAIoF,EAAIwxC,EAAQh3C,EAAIi3C,EAC7G,MAAO,CAAEr4C,KAAKyrB,MAAMrqB,EAAIg3C,EAAQxxC,EAAIyxC,EAAOl2C,EAAI+1C,EAAQ12C,EAAI22C,GAAQn0B,GAAQxiB,EAAI02C,EAAQ/1C,EAAIg2C,KAEtFF,EAkCT,SAASnI,GAAyB7wC,EAAQy8B,GACxC,IAAI0T,EAAKpvC,KAAKkrB,IAAIjsB,GAASq5C,EAAKt4C,KAAKqkB,IAAIplB,GACzC,OAAO,SAAS+vC,EAAMC,EAAIC,EAAW92B,GACnC,IAAI/C,EAAO65B,EAAYxT,EACX,MAARsT,GACFA,EAAOuJ,GAAmBnJ,EAAIJ,GAC9BC,EAAKsJ,GAAmBnJ,EAAIH,IACxBC,EAAY,EAAIF,EAAOC,EAAKD,EAAOC,KAAID,GAAQE,EAAY3rB,MAE/DyrB,EAAO/vC,EAASiwC,EAAY3rB,GAC5B0rB,EAAKhwC,EAAS,GAAKoW,GAErB,IAAK,IAAIqL,EAAOpf,EAAI0tC,EAAME,EAAY,EAAI5tC,EAAI2tC,EAAK3tC,EAAI2tC,EAAI3tC,GAAK+T,EAC9D+C,EAASsI,OAAOA,EAAQ4oB,GAAiB,CAAE8F,GAAKkJ,EAAKt4C,KAAKkrB,IAAI5pB,IAAKg3C,EAAKt4C,KAAKqkB,IAAI/iB,MAAO,GAAIof,EAAM,KAIxG,SAAS63B,GAAmBnJ,EAAI1uB,GAC9B,IAAIxa,EAAI4iC,GAAiBpoB,GACzBxa,EAAE,IAAMkpC,EACR/F,GAA0BnjC,GAC1B,IAAI0kC,EAAQ9mB,IAAS5d,EAAE,IACvB,SAAUA,EAAE,GAAK,GAAK0kC,EAAQA,GAAS,EAAI5qC,KAAKsjB,GAAKH,KAAM,EAAInjB,KAAKsjB,IAgFtE,SAASk1B,GAAkBryB,EAAIC,EAAInD,GACjC,IAAI7hB,EAAI3C,EAAGyW,MAAMiR,EAAIC,EAAKjD,GAAGF,GAAI3K,OAAO8N,GACxC,OAAO,SAASjkB,GACd,OAAOf,EAAE8S,KAAI,SAAS9S,GACpB,MAAO,CAAEe,EAAGf,OAIlB,SAASq3C,GAAkBxyB,EAAIC,EAAIlD,GACjC,IAAI7gB,EAAI1D,EAAGyW,MAAM+Q,EAAIC,EAAK/C,GAAGH,GAAI1K,OAAO4N,GACxC,OAAO,SAAS9kB,GACd,OAAOe,EAAE+R,KAAI,SAAS/R,GACpB,MAAO,CAAEA,EAAGf,OAIlB,SAASs3C,GAAUl5C,GACjB,OAAOA,EAAE+W,OAEX,SAASoiC,GAAUn5C,GACjB,OAAOA,EAAE+K,OAxYX9L,EAAGsmC,IAAI6T,KAAO,WACZ,IAAuBnB,EAAYtC,EAAS0D,EAAeC,EAAeC,EAAtEpE,EAAc,IAClB,SAASiE,EAAKpjC,GAMZ,OALIA,IACyB,mBAAhBm/B,GAA4BmE,EAAcnE,aAAaA,EAAYjqC,MAAMvK,KAAMwK,YACrFouC,GAAgBA,EAAYnG,QAAOmG,EAAcF,EAAcC,IACpEr6C,EAAGsmC,IAAIS,OAAOhwB,EAAQujC,IAEjBD,EAAc1iB,SAiCvB,SAAS8O,IAEP,OADA6T,EAAc,KACPH,EAET,OAnCAA,EAAK3R,KAAO,SAASzxB,GAGnB,OAFAm+B,GAAqB,EACrBl1C,EAAGsmC,IAAIS,OAAOhwB,EAAQqjC,EAAc5E,KAC7BN,IAETiF,EAAK5N,SAAW,SAASx1B,GAGvB,OAFA8xB,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAoBC,GAAoB,EACpLrpC,EAAGsmC,IAAIS,OAAOhwB,EAAQqjC,EAAchE,KAC7B/M,GAAoB,CAAEF,GAAoBE,GAAmBD,GAAoBC,IAAsBH,GAAoB,CAAEF,GAAoBE,GAAmBD,GAAoBC,IAAsBH,GAAoB,CAAEF,GAAoBE,GAAmBD,GAAoBC,IAAsB,CAAEl2B,IAAKA,MAErUsnC,EAAKnP,OAAS,SAASj0B,GAGrB,OAFAu+B,GAAsBC,KAAwBH,GAAsBC,GAAsBx+B,KAC1F7W,EAAGsmC,IAAIS,OAAOhwB,EAAQqjC,EAAcxE,KAC7B,CAAE,CAAER,GAAqBC,IAAuB,CAAEC,GAAqBC,MAEhF4E,EAAKnB,WAAa,SAASziC,GACzB,OAAKrK,UAAUwB,QACf0sC,GAAiBpB,EAAaziC,GAAKA,EAAEwwB,QAAUoR,GAAyB5hC,GAAKqB,EACtE6uB,KAFuBuS,GAIhCmB,EAAKzD,QAAU,SAASngC,GACtB,OAAKrK,UAAUwB,QACf2sC,EAAiC,OAAhB3D,EAAUngC,GAAa,IAAIs/B,GAAsB,IAAIY,GAAmBlgC,GAC9D,mBAAhB2/B,GAA4BmE,EAAcnE,YAAYA,GAC1DzP,KAHuBiQ,GAKhCyD,EAAKjE,YAAc,SAAS3/B,GAC1B,OAAKrK,UAAUwB,QACfwoC,EAA2B,mBAAN3/B,EAAmBA,GAAK8jC,EAAcnE,aAAa3/B,IAAKA,GACtE4jC,GAFuBjE,GAQzBiE,EAAKnB,WAAWh5C,EAAGsmC,IAAIiO,aAAamC,QAAQ,OAUrD12C,EAAGsmC,IAAIiU,UAAY,SAASC,GAC1B,MAAO,CACLzT,OAAQ,SAASA,GACf,IAAIwT,EAAY,IAAIlC,GAAiBtR,GACrC,IAAK,IAAIhkC,KAAKy3C,EAASD,EAAUx3C,GAAKy3C,EAAQz3C,GAC9C,OAAOw3C,KAOblC,GAAiB7zC,UAAY,CAC3Byd,MAAO,SAASve,EAAGf,GACjBjB,KAAKqlC,OAAO9kB,MAAMve,EAAGf,IAEvB2kC,OAAQ,WACN5lC,KAAKqlC,OAAOO,UAEdc,UAAW,WACT1mC,KAAKqlC,OAAOqB,aAEdC,QAAS,WACP3mC,KAAKqlC,OAAOsB,WAEdC,aAAc,WACZ5mC,KAAKqlC,OAAOuB,gBAEdC,WAAY,WACV7mC,KAAKqlC,OAAOwB,eAuBhBvoC,EAAGsmC,IAAI0S,WAAaV,GACpBt4C,EAAGsmC,IAAImU,kBAAoB9G,IAsF1B3zC,EAAGsmC,IAAIoU,gBAAkB,WACxB,OAAOpC,GAAkBa,MACxB9E,IAAM8E,GAAuBnwB,OAASmwB,GACzCn5C,EAAGsmC,IAAIkT,SAAW,SAASpL,GAEzB,SAAS2F,EAAQvM,GAEf,OADAA,EAAc4G,EAAO5G,EAAY,GAAKviB,GAAYuiB,EAAY,GAAKviB,KAChD,IAAMC,GAAYsiB,EAAY,IAAMtiB,GAAYsiB,EAMrE,OATA4G,EAAS6K,GAAgB7K,EAAO,GAAK,IAAMnpB,GAAYmpB,EAAO,GAAKnpB,GAAYmpB,EAAO1gC,OAAS,EAAI0gC,EAAO,GAAKnpB,GAAa,GAK5H8uB,EAAQ/qB,OAAS,SAASwe,GAExB,OADAA,EAAc4G,EAAOplB,OAAOwe,EAAY,GAAKviB,GAAYuiB,EAAY,GAAKviB,KACvD,IAAMC,GAAYsiB,EAAY,IAAMtiB,GAAYsiB,GAE9DuM,GAKTqF,GAAwBpwB,OAASmwB,GA0BjCn5C,EAAGsmC,IAAIqU,OAAS,WACd,IAAuBxO,EAAsBmB,EAAzChqB,EAAS,CAAE,EAAG,GAAY2Z,EAAY,EAC1C,SAAS0d,IACP,IAAItzB,EAA2B,mBAAX/D,EAAwBA,EAAOrX,MAAMvK,KAAMwK,WAAaoX,EAAQ8qB,EAAS6K,IAAiB5xB,EAAO,GAAKpC,IAAaoC,EAAO,GAAKpC,GAAY,GAAG+D,OAAQ8lB,EAAO,GAOjL,OANAxB,EAAY,KAAM,KAAM,EAAG,CACzBrrB,MAAO,SAASve,EAAGf,GACjBmsC,EAAKtlC,KAAK9F,EAAI0qC,EAAO1qC,EAAGf,IACxBe,EAAE,IAAMwhB,GAAYxhB,EAAE,IAAMwhB,MAGzB,CACLxe,KAAM,UACN8gC,YAAa,CAAEsH,IAkBnB,OAfA6L,EAAOr3B,OAAS,SAAS5f,GACvB,OAAKwI,UAAUwB,QACf4V,EAAS5f,EACFi3C,GAFuBr3B,GAIhCq3B,EAAOxO,MAAQ,SAASzoC,GACtB,OAAKwI,UAAUwB,QACf4/B,EAAc+D,IAA0BlF,GAASzoC,GAAKuhB,GAAYgY,EAAYhY,IACvE01B,GAFuBxO,GAIhCwO,EAAO1d,UAAY,SAAS1mB,GAC1B,OAAKrK,UAAUwB,QACf4/B,EAAc+D,GAAyBlF,EAAQlnB,IAAagY,GAAa1mB,GAAK0O,IACvE01B,GAFuB1d,GAIzB0d,EAAOxO,MAAM,KA0BtBnsC,EAAGsmC,IAAIsU,SAAW,SAASnzC,EAAGC,GAC5B,IAAyN7E,EAArNg4C,GAAMnzC,EAAE,GAAKD,EAAE,IAAMwd,GAAYgmB,EAAKxjC,EAAE,GAAKwd,GAAYkmB,EAAKzjC,EAAE,GAAKud,GAAY61B,EAAQv5C,KAAKqkB,IAAIi1B,GAAKE,EAAQx5C,KAAKkrB,IAAIouB,GAAKjR,EAAQroC,KAAKqkB,IAAIqlB,GAAKtB,EAAQpoC,KAAKkrB,IAAIwe,GAAK+P,EAAQz5C,KAAKqkB,IAAIulB,GAAKgF,EAAQ5uC,KAAKkrB,IAAI0e,GACpN,OAAO5pC,KAAKyrB,MAAMzrB,KAAK6S,MAAMvR,EAAIstC,EAAQ2K,GAASj4C,GAAKA,EAAI8mC,EAAQqR,EAAQpR,EAAQuG,EAAQ4K,GAASl4C,GAAI+mC,EAAQoR,EAAQrR,EAAQwG,EAAQ4K,IAE1I/6C,EAAGsmC,IAAI2U,UAAY,WACjB,IAAIxzB,EAAID,EAAI0zB,EAAIC,EAAIxzB,EAAID,EAAI0zB,EAAIC,EAAyC33C,EAAGf,EAAGq7B,EAAGmG,EAA9C5f,EAAK,GAAIC,EAAKD,EAAI+2B,EAAK,GAAIC,EAAK,IAAiBte,EAAY,IACjG,SAASge,IACP,MAAO,CACLv0C,KAAM,kBACN8gC,YAAasI,KAGjB,SAASA,IACP,OAAO9vC,EAAGyW,MAAMlV,KAAKipB,KAAK2wB,EAAKG,GAAMA,EAAIJ,EAAII,GAAI7lC,IAAIuoB,GAAGnkB,OAAO7Z,EAAGyW,MAAMlV,KAAKipB,KAAK6wB,EAAKE,GAAMA,EAAIH,EAAIG,GAAI9lC,IAAI0uB,IAAItqB,OAAO7Z,EAAGyW,MAAMlV,KAAKipB,KAAKhD,EAAKjD,GAAMA,EAAIkD,EAAIlD,GAAI1E,QAAO,SAASnc,GAChL,OAAOoS,EAAIpS,EAAI43C,GAAM52B,MACpBjP,IAAI/R,IAAImW,OAAO7Z,EAAGyW,MAAMlV,KAAKipB,KAAK9C,EAAKlD,GAAMA,EAAImD,EAAInD,GAAI3E,QAAO,SAASld,GAC1E,OAAOmT,EAAInT,EAAI44C,GAAM72B,MACpBjP,IAAI9S,IA2DT,OAzDAs4C,EAAUnL,MAAQ,WAChB,OAAOA,IAAQr6B,KAAI,SAAS+xB,GAC1B,MAAO,CACL9gC,KAAM,aACN8gC,YAAaA,OAInByT,EAAUO,QAAU,WAClB,MAAO,CACL90C,KAAM,UACN8gC,YAAa,CAAExJ,EAAEmd,GAAIthC,OAAOsqB,EAAEiX,GAAIpqC,MAAM,GAAIgtB,EAAEkd,GAAIve,UAAU3rB,MAAM,GAAImzB,EAAEkX,GAAI1e,UAAU3rB,MAAM,OAGhGiqC,EAAUxnC,OAAS,SAAS8C,GAC1B,OAAKrK,UAAUwB,OACRutC,EAAUQ,YAAYllC,GAAGmlC,YAAYnlC,GADd0kC,EAAUS,eAG1CT,EAAUQ,YAAc,SAASllC,GAC/B,OAAKrK,UAAUwB,QACfytC,GAAM5kC,EAAE,GAAG,GAAI2kC,GAAM3kC,EAAE,GAAG,GAC1B8kC,GAAM9kC,EAAE,GAAG,GAAI6kC,GAAM7kC,EAAE,GAAG,GACtB4kC,EAAKD,IAAI3kC,EAAI4kC,EAAIA,EAAKD,EAAIA,EAAK3kC,GAC/B8kC,EAAKD,IAAI7kC,EAAI8kC,EAAIA,EAAKD,EAAIA,EAAK7kC,GAC5B0kC,EAAUhe,UAAUA,IALG,CAAE,CAAEke,EAAIE,GAAM,CAAEH,EAAIE,KAOpDH,EAAUS,YAAc,SAASnlC,GAC/B,OAAKrK,UAAUwB,QACf8Z,GAAMjR,EAAE,GAAG,GAAIkR,GAAMlR,EAAE,GAAG,GAC1BmR,GAAMnR,EAAE,GAAG,GAAIoR,GAAMpR,EAAE,GAAG,GACtBiR,EAAKC,IAAIlR,EAAIiR,EAAIA,EAAKC,EAAIA,EAAKlR,GAC/BmR,EAAKC,IAAIpR,EAAImR,EAAIA,EAAKC,EAAIA,EAAKpR,GAC5B0kC,EAAUhe,UAAUA,IALG,CAAE,CAAEzV,EAAIE,GAAM,CAAED,EAAIE,KAOpDszB,EAAUrkC,KAAO,SAASL,GACxB,OAAKrK,UAAUwB,OACRutC,EAAUU,UAAUplC,GAAGqlC,UAAUrlC,GADV0kC,EAAUW,aAG1CX,EAAUU,UAAY,SAASplC,GAC7B,OAAKrK,UAAUwB,QACf4tC,GAAM/kC,EAAE,GAAIglC,GAAMhlC,EAAE,GACb0kC,GAFuB,CAAEK,EAAIC,IAItCN,EAAUW,UAAY,SAASrlC,GAC7B,OAAKrK,UAAUwB,QACf6W,GAAMhO,EAAE,GAAIiO,GAAMjO,EAAE,GACb0kC,GAFuB,CAAE12B,EAAIC,IAItCy2B,EAAUhe,UAAY,SAAS1mB,GAC7B,OAAKrK,UAAUwB,QACfuvB,GAAa1mB,EACb7S,EAAIq2C,GAAkBryB,EAAIC,EAAI,IAC9BhlB,EAAIq3C,GAAkBxyB,EAAIC,EAAIwV,GAC9Be,EAAI+b,GAAkBsB,EAAID,EAAI,IAC9BjX,EAAI6V,GAAkBmB,EAAID,EAAIje,GACvBge,GANuBhe,GAQzBge,EAAUQ,YAAY,CAAE,EAAG,KAAM,GAAK/2B,IAAK,CAAE,IAAK,GAAKA,MAAOg3B,YAAY,CAAE,EAAG,KAAM,GAAKh3B,IAAK,CAAE,IAAK,GAAKA,OAwBpH1kB,EAAGsmC,IAAIuV,SAAW,WAChB,IAAwBC,EAA6BC,EAAjDjkC,EAASmiC,GAAoBnuC,EAASouC,GAC1C,SAAS2B,IACP,MAAO,CACLn1C,KAAM,aACN8gC,YAAa,CAAEsU,GAAWhkC,EAAO7L,MAAMvK,KAAMwK,WAAY6vC,GAAWjwC,EAAOG,MAAMvK,KAAMwK,aAmB3F,OAhBA2vC,EAASjB,SAAW,WAClB,OAAO56C,EAAGsmC,IAAIsU,SAASkB,GAAWhkC,EAAO7L,MAAMvK,KAAMwK,WAAY6vC,GAAWjwC,EAAOG,MAAMvK,KAAMwK,aAEjG2vC,EAAS/jC,OAAS,SAASvB,GACzB,OAAKrK,UAAUwB,QACfoK,EAASvB,EAAGulC,EAAuB,mBAANvlC,EAAmB,KAAOA,EAChDslC,GAFuB/jC,GAIhC+jC,EAAS/vC,OAAS,SAASyK,GACzB,OAAKrK,UAAUwB,QACf5B,EAASyK,EAAGwlC,EAAuB,mBAANxlC,EAAmB,KAAOA,EAChDslC,GAFuB/vC,GAIhC+vC,EAAS5e,UAAY,WACnB,OAAO/wB,UAAUwB,OAASmuC,EAAW,GAEhCA,GAET77C,EAAGsmC,IAAIgH,YAAc,SAASx1B,EAAQhM,GACpC,OAE0B0b,EAFA1P,EAAO,GAAKmN,GAERyC,EAFoB5P,EAAO,GAAKmN,GAE5BwC,EAFwC3b,EAAO,GAAKmZ,GAEhD0C,EAF4D7b,EAAO,GAAKmZ,GAG1G+2B,EAAMz6C,KAAKkrB,IAAI/E,GAAKu0B,EAAM16C,KAAKqkB,IAAI8B,GAAKw0B,EAAM36C,KAAKkrB,IAAI9E,GAAKw0B,EAAM56C,KAAKqkB,IAAI+B,GAAKy0B,EAAMJ,EAAMz6C,KAAKkrB,IAAIjF,GAAK60B,EAAML,EAAMz6C,KAAKqkB,IAAI4B,GAAK80B,EAAMJ,EAAM36C,KAAKkrB,IAAIhF,GAAK80B,EAAML,EAAM36C,KAAKqkB,IAAI6B,GAAK1mB,EAAI,EAAIQ,KAAKikB,KAAKjkB,KAAK6S,KAAKuR,GAAYgC,EAAKD,GAAMs0B,EAAME,EAAMv2B,GAAY8B,EAAKD,KAAOzkB,EAAI,EAAIxB,KAAKqkB,IAAI7kB,IAChSusC,EAAcvsC,EAAI,SAAS8B,GAC7B,IAAIU,EAAIhC,KAAKqkB,IAAI/iB,GAAK9B,GAAKgC,EAAGH,EAAIrB,KAAKqkB,IAAI7kB,EAAI8B,GAAKE,EAAGW,EAAId,EAAIw5C,EAAM74C,EAAI+4C,EAAK35C,EAAIC,EAAIy5C,EAAM94C,EAAIg5C,EAAKp0C,EAAIvF,EAAIq5C,EAAM14C,EAAI44C,EACvH,MAAO,CAAE56C,KAAKyrB,MAAMrqB,EAAGe,GAAKwhB,GAAY3jB,KAAKyrB,MAAM7kB,EAAG5G,KAAK6S,KAAK1Q,EAAIA,EAAIf,EAAIA,IAAMuiB,KAChF,WACF,MAAO,CAAEsC,EAAKtC,GAAYwC,EAAKxC,MAErB01B,SAAW75C,EAChBusC,EATT,IAA4B9lB,EAAIE,EAAID,EAAIE,EAClCq0B,EAAoBC,EAAoBC,EAAoBC,EAAoBC,EAA0BC,EAA0BC,EAA0BC,EAA0Bx7C,EAAuFgC,EAC/QuqC,GASNttC,EAAGsmC,IAAI54B,OAAS,SAASqJ,GAGvB,OAFAo/B,GAAmB,EACnBn2C,EAAGsmC,IAAIS,OAAOhwB,EAAQylC,IACfrG,IAGT,IAAIqG,GAAgB,CAClBlV,OAAQluB,EACR6I,MAAO7I,EACPgvB,UAKF,WACE,IAAIsB,EAAIE,EAAOD,EAQf,SAASE,EAAUC,EAAGC,GACpB,IAAIK,EAAO7oC,KAAKqkB,IAAImkB,GAAK9kB,IAAaklB,EAAO5oC,KAAKkrB,IAAIsd,GAAIlnC,EAAIiT,GAAKg0B,GAAK7kB,IAAcykB,GAAKqR,EAAQx5C,KAAKkrB,IAAI5pB,GAC5GszC,IAAoB50C,KAAKyrB,MAAMzrB,KAAK6S,MAAMvR,EAAIsnC,EAAO5oC,KAAKqkB,IAAI/iB,IAAMA,GAAKA,EAAI8mC,EAAQS,EAAOR,EAAQO,EAAO4Q,GAASl4C,GAAI+mC,EAAQQ,EAAOT,EAAQQ,EAAO4Q,GACtJrR,EAAKI,EAAGF,EAAQQ,EAAMT,EAAQQ,EAVhCqS,GAAcv6B,MAAQ,SAAS6nB,EAAGC,GAChCL,EAAKI,EAAI7kB,GAAY2kB,EAAQroC,KAAKqkB,IAAImkB,GAAK9kB,IAAa0kB,EAAQpoC,KAAKkrB,IAAIsd,GACzEyS,GAAcv6B,MAAQ4nB,GAExB2S,GAAcnU,QAAU,WACtBmU,GAAcv6B,MAAQu6B,GAAcnU,QAAUjvB,IAXhDivB,QAASjvB,EACTkvB,aAAclvB,EACdmvB,WAAYnvB,GAiBd,SAASqjC,GAAiBt8C,EAAOgsC,GAC/B,SAASuQ,EAAU5S,EAAGC,GACpB,IAAI4S,EAAOp7C,KAAKkrB,IAAIqd,GAAIK,EAAO5oC,KAAKkrB,IAAIsd,GAAIhnC,EAAI5C,EAAMw8C,EAAOxS,GAC7D,MAAO,CAAEpnC,EAAIonC,EAAO5oC,KAAKqkB,IAAIkkB,GAAI/mC,EAAIxB,KAAKqkB,IAAImkB,IAMhD,OAJA2S,EAAU1zB,OAAS,SAAStlB,EAAGf,GAC7B,IAAIkjB,EAAItkB,KAAK6S,KAAK1Q,EAAIA,EAAIf,EAAIA,GAAI6E,EAAI2kC,EAAMtmB,GAAI+2B,EAAOr7C,KAAKqkB,IAAIpe,GAAIq1C,EAAOt7C,KAAKkrB,IAAIjlB,GACpF,MAAO,CAAEjG,KAAKyrB,MAAMtpB,EAAIk5C,EAAM/2B,EAAIg3B,GAAOt7C,KAAKikB,KAAKK,GAAKljB,EAAIi6C,EAAO/2B,KAE9D62B,EAET,IAAII,GAA4BL,IAAiB,SAASM,GACxD,OAAOx7C,KAAK6S,KAAK,GAAK,EAAI2oC,OACzB,SAASl3B,GACV,OAAO,EAAItkB,KAAKikB,KAAKK,EAAI,OAE1B7lB,EAAGsmC,IAAI0W,mBAAqB,WAC3B,OAAO1E,GAAkBwE,MACxBzI,IAAMyI,GACT,IAAIG,GAA8BR,IAAiB,SAASM,GAC1D,IAAIv1C,EAAIjG,KAAK+jB,KAAKy3B,GAClB,OAAOv1C,GAAKA,EAAIjG,KAAKqkB,IAAIpe,KACxBoQ,GAIH,SAASslC,GAAsBjS,EAAIE,GACjC,IAAIxB,EAAQpoC,KAAKkrB,IAAIwe,GAAKpoC,EAAI,SAASknC,GACrC,OAAOxoC,KAAK80B,IAAIzR,GAAI,EAAImlB,EAAI,IAC3B/mC,EAAIioC,IAAOE,EAAK5pC,KAAKqkB,IAAIqlB,GAAM1pC,KAAKklB,IAAIkjB,EAAQpoC,KAAKkrB,IAAI0e,IAAO5pC,KAAKklB,IAAI5jB,EAAEsoC,GAAMtoC,EAAEooC,IAAMxnC,EAAIkmC,EAAQpoC,KAAKqnB,IAAI/lB,EAAEooC,GAAKjoC,GAAKA,EAC7H,IAAKA,EAAG,OAAOm6C,GACf,SAASpJ,EAAQjK,EAAGC,GACdtmC,EAAI,EACFsmC,GAAK/kB,GAAQN,KAAGqlB,GAAK/kB,GAAQN,IAE7BqlB,EAAI/kB,GAAQN,KAAGqlB,EAAI/kB,GAAQN,IAEjC,IAAImB,EAAIpiB,EAAIlC,KAAKqnB,IAAI/lB,EAAEknC,GAAI/mC,GAC3B,MAAO,CAAE6iB,EAAItkB,KAAKqkB,IAAI5iB,EAAI8mC,GAAIrmC,EAAIoiB,EAAItkB,KAAKkrB,IAAIzpB,EAAI8mC,IAMrD,OAJAiK,EAAQ/qB,OAAS,SAAStlB,EAAGf,GAC3B,IAAIqxC,EAAOvwC,EAAId,EAAGkjB,EAAIV,GAAOniB,GAAKzB,KAAK6S,KAAK1Q,EAAIA,EAAIswC,EAAOA,GAC3D,MAAO,CAAEzyC,KAAKyrB,MAAMtpB,EAAGswC,GAAQhxC,EAAG,EAAIzB,KAAK8uC,KAAK9uC,KAAKqnB,IAAInlB,EAAIoiB,EAAG,EAAI7iB,IAAMgiB,KAErE+uB,EAKT,SAASqJ,GAAwBnS,EAAIE,GACnC,IAAIxB,EAAQpoC,KAAKkrB,IAAIwe,GAAKjoC,EAAIioC,IAAOE,EAAK5pC,KAAKqkB,IAAIqlB,IAAOtB,EAAQpoC,KAAKkrB,IAAI0e,KAAQA,EAAKF,GAAKoS,EAAI1T,EAAQ3mC,EAAIioC,EAC7G,GAAIn1B,EAAI9S,GAAK0hB,GAAG,OAAOy0B,GACvB,SAASpF,EAAQjK,EAAGC,GAClB,IAAIlkB,EAAIw3B,EAAItT,EACZ,MAAO,CAAElkB,EAAItkB,KAAKqkB,IAAI5iB,EAAI8mC,GAAIuT,EAAIx3B,EAAItkB,KAAKkrB,IAAIzpB,EAAI8mC,IAMrD,OAJAiK,EAAQ/qB,OAAS,SAAStlB,EAAGf,GAC3B,IAAIqxC,EAAOqJ,EAAI16C,EACf,MAAO,CAAEpB,KAAKyrB,MAAMtpB,EAAGswC,GAAQhxC,EAAGq6C,EAAIl4B,GAAOniB,GAAKzB,KAAK6S,KAAK1Q,EAAIA,EAAIswC,EAAOA,KAEtED,GArCR/zC,EAAGsmC,IAAIgX,qBAAuB,WAC7B,OAAOhF,GAAkB2E,MACxB5I,IAAM4I,IAqBRj9C,EAAGsmC,IAAIiX,eAAiB,WACvB,OAAO9J,GAAayJ,MACnB7I,IAAM6I,IAcRl9C,EAAGsmC,IAAIkX,iBAAmB,WACzB,OAAO/J,GAAa2J,MACnB/I,IAAM+I,GACT,IAAIK,GAAkBhB,IAAiB,SAASM,GAC9C,OAAO,EAAIA,IACVx7C,KAAK8uC,MAIR,SAAS8M,GAAgBrT,EAAGC,GAC1B,MAAO,CAAED,EAAGvoC,KAAKklB,IAAIllB,KAAK80B,IAAIzR,GAAI,EAAImlB,EAAI,KAK5C,SAAS2T,GAA0B3G,GACjC,IAAyG4G,EAArGzyC,EAAIotC,GAAkBvB,GAAU52C,EAAQ+K,EAAE/K,MAAOgpB,EAAYje,EAAEie,UAAW8qB,EAAa/oC,EAAE+oC,WAqB7F,OApBA/oC,EAAE/K,MAAQ,WACR,IAAImB,EAAInB,EAAM8L,MAAMf,EAAGgB,WACvB,OAAO5K,IAAM4J,EAAIyyC,EAAWzyC,EAAE+oC,WAAW,MAAQ/oC,EAAI5J,GAEvD4J,EAAEie,UAAY,WACZ,IAAI7nB,EAAI6nB,EAAUld,MAAMf,EAAGgB,WAC3B,OAAO5K,IAAM4J,EAAIyyC,EAAWzyC,EAAE+oC,WAAW,MAAQ/oC,EAAI5J,GAEvD4J,EAAE+oC,WAAa,SAAS19B,GACtB,IAAIjV,EAAI2yC,EAAWhoC,MAAMf,EAAGgB,WAC5B,GAAI5K,IAAM4J,GACR,GAAIyyC,EAAgB,MAALpnC,EAAW,CACxB,IAAIxT,EAAI6hB,GAAIzkB,IAAS0C,EAAIsmB,IACzB8qB,EAAW,CAAE,CAAEpxC,EAAE,GAAKE,EAAGF,EAAE,GAAKE,GAAK,CAAEF,EAAE,GAAKE,EAAGF,EAAE,GAAKE,WAEjD46C,IACTr8C,EAAI,MAEN,OAAOA,GAEF4J,EAAE+oC,WAAW,OA/BrBj0C,EAAGsmC,IAAIsX,SAAW,WACjB,OAAOtF,GAAkBmF,MACxBpJ,IAAMoJ,GAITN,GAAgBn0B,OAAS,SAAStlB,EAAGf,GACnC,MAAO,CAAEe,EAAG,EAAInC,KAAK8uC,KAAK9uC,KAAKmkB,IAAI/iB,IAAMqiB,MA0B1ChlB,EAAGsmC,IAAIuX,SAAW,WACjB,OAAOH,GAA0BP,MAChC9I,IAAM8I,GACT,IAAIW,GAAsBrB,IAAiB,WACzC,OAAO,IACNl7C,KAAKikB,OACPxlB,EAAGsmC,IAAIyX,aAAe,WACrB,OAAOzF,GAAkBwF,MACxBzJ,IAAMyJ,GACT,IAAIE,GAAuBvB,IAAiB,SAASM,GACnD,OAAO,GAAK,EAAIA,MACf,SAASl3B,GACV,OAAO,EAAItkB,KAAK8uC,KAAKxqB,MAKvB,SAASo4B,GAA0BnU,EAAGC,GACpC,MAAO,CAAExoC,KAAKklB,IAAIllB,KAAK80B,IAAIzR,GAAI,EAAImlB,EAAI,KAAMD,GAiB/C,SAASoU,GAAen9C,GACtB,OAAOA,EAAE,GAEX,SAASo9C,GAAep9C,GACtB,OAAOA,EAAE,GA2BX,SAASq9C,GAAkBxQ,GAEzB,IADA,IAAI5qC,EAAI4qC,EAAOlgC,OAAQ2wC,EAAO,CAAE,EAAG,GAAKC,EAAK,EACpCj9C,EAAI,EAAGA,EAAI2B,EAAG3B,IAAK,CAC1B,KAAOi9C,EAAK,GAAKl5B,GAAWwoB,EAAOyQ,EAAKC,EAAK,IAAK1Q,EAAOyQ,EAAKC,EAAK,IAAK1Q,EAAOvsC,KAAO,KAAKi9C,EAC3FD,EAAKC,KAAQj9C,EAEf,OAAOg9C,EAAKrtC,MAAM,EAAGstC,GAEvB,SAASC,GAAkB92C,EAAGC,GAC5B,OAAOD,EAAE,GAAKC,EAAE,IAAMD,EAAE,GAAKC,EAAE,IA7DhC1H,EAAGsmC,IAAIkY,cAAgB,WACtB,OAAOlG,GAAkB0F,MACxB3J,IAAM2J,GAITC,GAA0Bj1B,OAAS,SAAStlB,EAAGf,GAC7C,MAAO,EAAGA,EAAG,EAAIpB,KAAK8uC,KAAK9uC,KAAKmkB,IAAIhiB,IAAMshB,MAE3ChlB,EAAGsmC,IAAImY,mBAAqB,WAC3B,IAAIzF,EAAa0E,GAA0BO,IAA4B52B,EAAS2xB,EAAW3xB,OAAQ+mB,EAAS4K,EAAW5K,OAQvH,OAPA4K,EAAW3xB,OAAS,SAAS9Q,GAC3B,OAAOA,EAAI8Q,EAAO,EAAG9Q,EAAE,GAAIA,EAAE,KAAuB,EAAdA,EAAI8Q,KAAc,IAAK9Q,EAAE,KAEjEyiC,EAAW5K,OAAS,SAAS73B,GAC3B,OAAOA,EAAI63B,EAAO,CAAE73B,EAAE,GAAIA,EAAE,GAAIA,EAAE7I,OAAS,EAAI6I,EAAE,GAAK,GAAK,KAC3D,EADoEA,EAAI63B,KACpE,GAAI73B,EAAE,GAAIA,EAAE,GAAK,KAEhB63B,EAAO,CAAE,EAAG,EAAG,OACrBiG,IAAM4J,GACTj+C,EAAG0+C,KAAO,GAOV1+C,EAAG0+C,KAAKL,KAAO,SAASM,GACtB,IAAIj7C,EAAIw6C,GAAgBv7C,EAAIw7C,GAC5B,GAAIjyC,UAAUwB,OAAQ,OAAO2wC,EAAKM,GAClC,SAASN,EAAKn9C,GACZ,GAAIA,EAAKwM,OAAS,EAAG,MAAO,GAC5B,IAA4CrM,EAAxCu9C,EAAK5nB,GAAWtzB,GAAIm7C,EAAK7nB,GAAWr0B,GAAOK,EAAI9B,EAAKwM,OAAQkgC,EAAS,GAAIkR,EAAgB,GAC7F,IAAKz9C,EAAI,EAAGA,EAAI2B,EAAG3B,IACjBusC,EAAOpkC,KAAK,EAAGo1C,EAAGjuC,KAAKjP,KAAMR,EAAKG,GAAIA,IAAKw9C,EAAGluC,KAAKjP,KAAMR,EAAKG,GAAIA,GAAIA,IAGxE,IADAusC,EAAO/sC,KAAK09C,IACPl9C,EAAI,EAAGA,EAAI2B,EAAG3B,IAAKy9C,EAAct1C,KAAK,CAAEokC,EAAOvsC,GAAG,IAAKusC,EAAOvsC,GAAG,KACtE,IAAI09C,EAAQX,GAAkBxQ,GAASoR,EAAQZ,GAAkBU,GAC7DG,EAAWD,EAAM,KAAOD,EAAM,GAAIG,EAAYF,EAAMA,EAAMtxC,OAAS,KAAOqxC,EAAMA,EAAMrxC,OAAS,GAAI8gC,EAAU,GACjH,IAAKntC,EAAI09C,EAAMrxC,OAAS,EAAGrM,GAAK,IAAKA,EAAGmtC,EAAQhlC,KAAKtI,EAAK0sC,EAAOmR,EAAM19C,IAAI,KAC3E,IAAKA,GAAK49C,EAAU59C,EAAI29C,EAAMtxC,OAASwxC,IAAa79C,EAAGmtC,EAAQhlC,KAAKtI,EAAK0sC,EAAOoR,EAAM39C,IAAI,KAC1F,OAAOmtC,EAQT,OANA6P,EAAK36C,EAAI,SAAS6S,GAChB,OAAOrK,UAAUwB,QAAUhK,EAAI6S,EAAG8nC,GAAQ36C,GAE5C26C,EAAK17C,EAAI,SAAS4T,GAChB,OAAOrK,UAAUwB,QAAU/K,EAAI4T,EAAG8nC,GAAQ17C,GAErC07C,GAaTr+C,EAAG0+C,KAAKlQ,QAAU,SAAShH,GAEzB,OADA9sB,EAAY8sB,EAAa2X,IAClB3X,GAET,IAAI2X,GAA2Bn/C,EAAG0+C,KAAKlQ,QAAQhqC,UAAY,GA+C3D,SAAS46C,GAAsBh8C,EAAGqE,EAAGC,GACnC,OAAQA,EAAE,GAAKD,EAAE,KAAOrE,EAAE,GAAKqE,EAAE,KAAOC,EAAE,GAAKD,EAAE,KAAOrE,EAAE,GAAKqE,EAAE,IAEnE,SAAS43C,GAAyB73C,EAAGzG,EAAG0G,EAAGC,GACzC,IAAI+f,EAAKjgB,EAAE,GAAI83C,EAAK73C,EAAE,GAAI83C,EAAMx+C,EAAE,GAAK0mB,EAAI+3B,EAAM93C,EAAE,GAAK43C,EAAI33B,EAAKngB,EAAE,GAAIi4C,EAAKh4C,EAAE,GAAIi4C,EAAM3+C,EAAE,GAAK4mB,EAAIg4B,EAAMj4C,EAAE,GAAK+3C,EAAIG,GAAMJ,GAAO73B,EAAK83B,GAAME,GAAOl4B,EAAK63B,KAAQK,EAAMJ,EAAMC,EAAME,GAClL,MAAO,CAAEj4B,EAAKm4B,EAAKL,EAAK53B,EAAKi4B,EAAKF,GAEpC,SAASG,GAAsBrY,GAC7B,IAAI//B,EAAI+/B,EAAY,GAAI9/B,EAAI8/B,EAAYA,EAAY95B,OAAS,GAC7D,QAASjG,EAAE,GAAKC,EAAE,IAAMD,EAAE,GAAKC,EAAE,IAvDnCy3C,GAAyB3W,KAAO,WAE9B,IADA,IAA6B/gC,EAAzBpG,GAAK,EAAG2B,EAAItB,KAAKgM,OAAWhG,EAAIhG,KAAKsB,EAAI,GAAIwlC,EAAO,IAC/CnnC,EAAI2B,GACXyE,EAAIC,EACJA,EAAIhG,KAAKL,GACTmnC,GAAQ/gC,EAAE,GAAKC,EAAE,GAAKD,EAAE,GAAKC,EAAE,GAEjC,MAAc,GAAP8gC,GAET2W,GAAyB5S,SAAW,SAASxpC,GAC3C,IAA2C0E,EAAoBD,EAA3DnG,GAAK,EAAG2B,EAAItB,KAAKgM,OAAQhK,EAAI,EAAGf,EAAI,EAAM+E,EAAIhG,KAAKsB,EAAI,GAE3D,IADKkJ,UAAUwB,SAAQ3K,GAAK,GAAK,EAAIrB,KAAK8mC,WACjCnnC,EAAI2B,GACXyE,EAAIC,EACJA,EAAIhG,KAAKL,GACTmG,EAAIC,EAAE,GAAKC,EAAE,GAAKA,EAAE,GAAKD,EAAE,GAC3B/D,IAAM+D,EAAE,GAAKC,EAAE,IAAMF,EACrB7E,IAAM8E,EAAE,GAAKC,EAAE,IAAMF,EAEvB,MAAO,CAAE9D,EAAIX,EAAGJ,EAAII,IAEtBo8C,GAAyB5R,KAAO,SAAS7pB,GAEvC,IADA,IAAIo8B,EAAuGx8C,EAAG4H,EAAoBxD,EAAGF,EAAGzG,EAA7HmnC,EAAS2X,GAAsBn8B,GAAUriB,GAAK,EAAG2B,EAAItB,KAAKgM,OAASmyC,GAAsBn+C,MAAa+F,EAAI/F,KAAKsB,EAAI,KACrH3B,EAAI2B,GAAG,CAMd,IALA88C,EAAQp8B,EAAQ1S,QAChB0S,EAAQhW,OAAS,EACjBhG,EAAIhG,KAAKL,GACTmG,EAAIs4C,GAAO50C,EAAI40C,EAAMpyC,OAASw6B,GAAU,GACxC5kC,GAAK,IACIA,EAAI4H,GAEPk0C,GADJr+C,EAAI++C,EAAMx8C,GACmBmE,EAAGC,IACzB03C,GAAsB53C,EAAGC,EAAGC,IAC/Bgc,EAAQla,KAAK61C,GAAyB73C,EAAGzG,EAAG0G,EAAGC,IAEjDgc,EAAQla,KAAKzI,IACJq+C,GAAsB53C,EAAGC,EAAGC,IACrCgc,EAAQla,KAAK61C,GAAyB73C,EAAGzG,EAAG0G,EAAGC,IAEjDF,EAAIzG,EAEFmnC,GAAQxkB,EAAQla,KAAKka,EAAQ,IACjCjc,EAAIC,EAEN,OAAOgc,GAaT,IAAIq8B,GAAsBC,GAAsBC,GAAuDC,GAA4BC,GAA3DC,GAA2B,GAAwDC,GAA4B,GACvL,SAASC,KACPC,GAA4B7+C,MAC5BA,KAAK8+C,KAAO9+C,KAAK++C,KAAO/+C,KAAKi5C,OAAS,KAExC,SAAS+F,GAA2BD,GAClC,IAAIE,EAAQP,GAAyBzQ,OAAS,IAAI2Q,GAElD,OADAK,EAAMF,KAAOA,EACNE,EAET,SAASC,GAA2BD,GAClCE,GAA4BF,GAC5BV,GAAuBpvC,OAAO8vC,GAC9BP,GAAyB52C,KAAKm3C,GAC9BJ,GAA4BI,GAE9B,SAASG,GAA2BH,GAClC,IAAIhG,EAASgG,EAAMhG,OAAQj3C,EAAIi3C,EAAOj3C,EAAGf,EAAIg4C,EAAO1vB,GAAI81B,EAAS,CAC/Dr9C,EAAGA,EACHf,EAAGA,GACFq+C,EAAWL,EAAMM,EAAGnhC,EAAO6gC,EAAMzmB,EAAGgnB,EAAe,CAAEP,GACxDC,GAA2BD,GAE3B,IADA,IAAIQ,EAAOH,EACJG,EAAKxG,QAAU7kC,EAAIpS,EAAIy9C,EAAKxG,OAAOj3C,GAAKghB,IAAK5O,EAAInT,EAAIw+C,EAAKxG,OAAO1vB,IAAMvG,IAC5Es8B,EAAWG,EAAKF,EAChBC,EAAaE,QAAQD,GACrBP,GAA2BO,GAC3BA,EAAOH,EAETE,EAAaE,QAAQD,GACrBN,GAA4BM,GAE5B,IADA,IAAIE,EAAOvhC,EACJuhC,EAAK1G,QAAU7kC,EAAIpS,EAAI29C,EAAK1G,OAAOj3C,GAAKghB,IAAK5O,EAAInT,EAAI0+C,EAAK1G,OAAO1vB,IAAMvG,IAC5E5E,EAAOuhC,EAAKnnB,EACZgnB,EAAa13C,KAAK63C,GAClBT,GAA2BS,GAC3BA,EAAOvhC,EAETohC,EAAa13C,KAAK63C,GAClBR,GAA4BQ,GAC5B,IAAiCC,EAA7BC,EAAQL,EAAaxzC,OACzB,IAAK4zC,EAAO,EAAGA,EAAOC,IAASD,EAC7BD,EAAOH,EAAaI,GACpBH,EAAOD,EAAaI,EAAO,GAC3BE,GAA0BH,EAAKb,KAAMW,EAAKV,KAAMY,EAAKZ,KAAMM,GAE7DI,EAAOD,EAAa,IACpBG,EAAOH,EAAaK,EAAQ,IACvBf,KAAOiB,GAA0BN,EAAKV,KAAMY,EAAKZ,KAAM,KAAMM,GAClEW,GAA4BP,GAC5BO,GAA4BL,GAE9B,SAASM,GAAwBlB,GAE/B,IADA,IAAoCU,EAAME,EAAMO,EAAKC,EAAjDn+C,EAAI+8C,EAAK/8C,EAAGo+C,EAAYrB,EAAK99C,EAAyB0O,EAAO4uC,GAAuB1pC,EACjFlF,GAEL,IADAuwC,EAAMG,GAA8B1wC,EAAMywC,GAAap+C,GAC7CghB,GAAGrT,EAAOA,EAAKsxB,MAAQ,CAE/B,MADAkf,EAAMn+C,EAAIs+C,GAA+B3wC,EAAMywC,IACrCp9B,IAMH,CACDk9B,GAAOl9B,IACTy8B,EAAO9vC,EAAK4vC,EACZI,EAAOhwC,GACEwwC,GAAOn9B,IAChBy8B,EAAO9vC,EACPgwC,EAAOhwC,EAAK6oB,GAEZinB,EAAOE,EAAOhwC,EAEhB,MAfA,IAAKA,EAAK4wC,EAAG,CACXd,EAAO9vC,EACP,MAEFA,EAAOA,EAAK4wC,EAelB,IAAIC,EAASxB,GAA2BD,GAExC,GADAR,GAAuBlhC,OAAOoiC,EAAMe,GAC/Bf,GAASE,EAAd,CACA,GAAIF,IAASE,EAOX,OANAR,GAA4BM,GAC5BE,EAAOX,GAA2BS,EAAKV,MACvCR,GAAuBlhC,OAAOmjC,EAAQb,GACtCa,EAAO1B,KAAOa,EAAKb,KAAOiB,GAA0BN,EAAKV,KAAMyB,EAAOzB,MACtEiB,GAA4BP,QAC5BO,GAA4BL,GAG9B,GAAKA,EAAL,CAIAR,GAA4BM,GAC5BN,GAA4BQ,GAC5B,IAAIc,EAAQhB,EAAKV,KAAMpO,EAAK8P,EAAMz+C,EAAG4uC,EAAK6P,EAAMx/C,EAAGy/C,EAAK3B,EAAK/8C,EAAI2uC,EAAIgQ,EAAK5B,EAAK99C,EAAI2vC,EAAIgQ,EAAQjB,EAAKZ,KAAMz1B,EAAKs3B,EAAM5+C,EAAI2uC,EAAIpnB,EAAKq3B,EAAM3/C,EAAI2vC,EAAIvxC,EAAI,GAAKqhD,EAAKn3B,EAAKo3B,EAAKr3B,GAAKu3B,EAAKH,EAAKA,EAAKC,EAAKA,EAAIG,EAAKx3B,EAAKA,EAAKC,EAAKA,EAAI81B,EAAS,CACpOr9C,GAAIunB,EAAKs3B,EAAKF,EAAKG,GAAMzhD,EAAIsxC,EAC7B1vC,GAAIy/C,EAAKI,EAAKx3B,EAAKu3B,GAAMxhD,EAAIuxC,GAE/BkP,GAA0BH,EAAKb,KAAM2B,EAAOG,EAAOvB,GACnDmB,EAAO1B,KAAOiB,GAA0BU,EAAO1B,EAAM,KAAMM,GAC3DM,EAAKb,KAAOiB,GAA0BhB,EAAM6B,EAAO,KAAMvB,GACzDW,GAA4BP,GAC5BO,GAA4BL,QAb1Ba,EAAO1B,KAAOiB,GAA0BN,EAAKV,KAAMyB,EAAOzB,OAe9D,SAASsB,GAA8B1hD,EAAKyhD,GAC1C,IAAIrB,EAAOpgD,EAAIogD,KAAMgC,EAAQhC,EAAK/8C,EAAGg/C,EAAQjC,EAAK99C,EAAGggD,EAAOD,EAAQZ,EACpE,IAAKa,EAAM,OAAOF,EAClB,IAAItB,EAAO9gD,EAAI4gD,EACf,IAAKE,EAAM,OAAQtqC,IAEnB,IAAI+rC,GADJnC,EAAOU,EAAKV,MACK/8C,EAAGm/C,EAAQpC,EAAK99C,EAAGmgD,EAAQD,EAAQf,EACpD,IAAKgB,EAAO,OAAOF,EACnB,IAAIG,EAAKH,EAAQH,EAAOO,EAAO,EAAIL,EAAO,EAAIG,EAAOp7C,EAAIq7C,EAAKD,EAC9D,OAAIE,IAAet7C,EAAInG,KAAK6S,KAAK1M,EAAIA,EAAI,EAAIs7C,GAAQD,EAAKA,IAAO,EAAID,GAASD,EAAQC,EAAQ,EAAIJ,EAAQC,EAAO,KAAOK,EAAOP,GACvHA,EAAQG,GAAS,EAE3B,SAASZ,GAA+B3hD,EAAKyhD,GAC3C,IAAIT,EAAOhhD,EAAI65B,EACf,GAAImnB,EAAM,OAAOU,GAA8BV,EAAMS,GACrD,IAAIrB,EAAOpgD,EAAIogD,KACf,OAAOA,EAAK99C,IAAMm/C,EAAYrB,EAAK/8C,EAAImT,IAEzC,SAASosC,GAAoBxC,GAC3B/+C,KAAK++C,KAAOA,EACZ/+C,KAAKwhD,MAAQ,GAyCf,SAASC,GAA6B17C,EAAGC,GACvC,OAAOA,EAAEykC,MAAQ1kC,EAAE0kC,MAErB,SAASiX,KACP7C,GAA4B7+C,MAC5BA,KAAKgC,EAAIhC,KAAKiB,EAAIjB,KAAKrB,IAAMqB,KAAK++C,KAAO/+C,KAAKupB,GAAK,KAErD,SAASy2B,GAA4BrhD,GACnC,IAAI8gD,EAAO9gD,EAAI4gD,EAAGI,EAAOhhD,EAAI65B,EAC7B,GAAKinB,GAASE,EAAd,CACA,IAAIc,EAAQhB,EAAKV,KAAM4C,EAAQhjD,EAAIogD,KAAM6B,EAAQjB,EAAKZ,KACtD,GAAI0B,IAAUG,EAAd,CACA,IAAIF,EAAKiB,EAAM3/C,EAAG2+C,EAAKgB,EAAM1gD,EAAG0vC,EAAK8P,EAAMz+C,EAAI0+C,EAAI9P,EAAK6P,EAAMx/C,EAAI0/C,EAAIr3B,EAAKs3B,EAAM5+C,EAAI0+C,EACjFrhD,EAAI,GAAKsxC,GAD4EpnB,EAAKq3B,EAAM3/C,EAAI0/C,GACjF/P,EAAKtnB,GAC5B,KAAIjqB,IAAM4jB,IAAV,CACA,IAAI2+B,EAAKjR,EAAKA,EAAKC,EAAKA,EAAIkQ,EAAKx3B,EAAKA,EAAKC,EAAKA,EAAIvnB,GAAKunB,EAAKq4B,EAAKhR,EAAKkQ,GAAMzhD,EAAG4B,GAAK0vC,EAAKmQ,EAAKx3B,EAAKs4B,GAAMviD,EAAGkqB,EAAKtoB,EAAI0/C,EACnH1H,EAAS0F,GAA0B1Q,OAAS,IAAIyT,GACpDzI,EAAOt6C,IAAMA,EACbs6C,EAAO8F,KAAO4C,EACd1I,EAAOj3C,EAAIA,EAAI0+C,EACfzH,EAAOh4C,EAAIsoB,EAAK1pB,KAAK6S,KAAK1Q,EAAIA,EAAIf,EAAIA,GACtCg4C,EAAO1vB,GAAKA,EACZ5qB,EAAIs6C,OAASA,EAEb,IADA,IAAI37B,EAAS,KAAM3N,EAAO8uC,GAAuB5pC,EAC1ClF,GACL,GAAIspC,EAAOh4C,EAAI0O,EAAK1O,GAAKg4C,EAAOh4C,IAAM0O,EAAK1O,GAAKg4C,EAAOj3C,GAAK2N,EAAK3N,EAAG,CAClE,IAAI2N,EAAKsxB,EAAuB,CAC9B3jB,EAAS3N,EAAK4vC,EACd,MAFU5vC,EAAOA,EAAKsxB,MAInB,CACL,IAAItxB,EAAK4wC,EAAuB,CAC9BjjC,EAAS3N,EACT,MAFUA,EAAOA,EAAK4wC,EAM5B9B,GAAuBphC,OAAOC,EAAQ27B,GACjC37B,IAAQkhC,GAA6BvF,MAE5C,SAASkG,GAA4BxgD,GACnC,IAAIs6C,EAASt6C,EAAIs6C,OACbA,IACGA,EAAOsG,IAAGf,GAA6BvF,EAAOzgB,GACnDimB,GAAuBtvC,OAAO8pC,GAC9B0F,GAA0B72C,KAAKmxC,GAC/B4F,GAA4B5F,GAC5Bt6C,EAAIs6C,OAAS,MAajB,SAAS4I,GAA2B/C,EAAM/sC,GACxC,IAAI+vC,EAAKhD,EAAK94C,EACd,GAAI87C,EAAI,OAAO,EACf,IAA6NC,EAAIC,EAA7NC,EAAKnD,EAAK/4C,EAAG+f,EAAK/T,EAAO,GAAG,GAAIgU,EAAKhU,EAAO,GAAG,GAAIiU,EAAKjU,EAAO,GAAG,GAAIkU,EAAKlU,EAAO,GAAG,GAAI0uC,EAAQ3B,EAAKv1C,EAAGq3C,EAAQ9B,EAAKr9C,EAAGygD,EAAKzB,EAAMz+C,EAAGmgD,EAAK1B,EAAMx/C,EAAGmhD,EAAKxB,EAAM5+C,EAAGqgD,EAAKzB,EAAM3/C,EAAGi8C,GAAMgF,EAAKE,GAAM,EAAGjF,GAAMgF,EAAKE,GAAM,EAC1N,GAAIA,IAAOF,EAAI,CACb,GAAIjF,EAAKp3B,GAAMo3B,GAAMn3B,EAAI,OACzB,GAAIm8B,EAAKE,EAAI,CACX,GAAKH,GAGG,GAAIA,EAAGhhD,GAAKglB,EAAI,YAHfg8B,EAAK,CACZjgD,EAAGk7C,EACHj8C,EAAG+kB,GAEL87B,EAAK,CACH9/C,EAAGk7C,EACHj8C,EAAGglB,OAEA,CACL,GAAKg8B,GAGG,GAAIA,EAAGhhD,EAAI+kB,EAAI,YAHdi8B,EAAK,CACZjgD,EAAGk7C,EACHj8C,EAAGglB,GAEL67B,EAAK,CACH9/C,EAAGk7C,EACHj8C,EAAG+kB,SAMP,GADAg8B,EAAK7E,GADL4E,GAAMG,EAAKE,IAAOC,EAAKF,IACRjF,EACX6E,GAAM,GAAKA,EAAK,EAClB,GAAIG,EAAKE,EAAI,CACX,GAAKH,GAGG,GAAIA,EAAGhhD,GAAKglB,EAAI,YAHfg8B,EAAK,CACZjgD,GAAIgkB,EAAKg8B,GAAMD,EACf9gD,EAAG+kB,GAEL87B,EAAK,CACH9/C,GAAIikB,EAAK+7B,GAAMD,EACf9gD,EAAGglB,OAEA,CACL,GAAKg8B,GAGG,GAAIA,EAAGhhD,EAAI+kB,EAAI,YAHdi8B,EAAK,CACZjgD,GAAIikB,EAAK+7B,GAAMD,EACf9gD,EAAGglB,GAEL67B,EAAK,CACH9/C,GAAIgkB,EAAKg8B,GAAMD,EACf9gD,EAAG+kB,QAIP,GAAIm8B,EAAKE,EAAI,CACX,GAAKJ,GAGG,GAAIA,EAAGjgD,GAAK+jB,EAAI,YAHfk8B,EAAK,CACZjgD,EAAG8jB,EACH7kB,EAAG8gD,EAAKj8B,EAAKk8B,GAEfF,EAAK,CACH9/C,EAAG+jB,EACH9kB,EAAG8gD,EAAKh8B,EAAKi8B,OAEV,CACL,GAAKC,GAGG,GAAIA,EAAGjgD,EAAI8jB,EAAI,YAHdm8B,EAAK,CACZjgD,EAAG+jB,EACH9kB,EAAG8gD,EAAKh8B,EAAKi8B,GAEfF,EAAK,CACH9/C,EAAG8jB,EACH7kB,EAAG8gD,EAAKj8B,EAAKk8B,GAOrB,OAFAlD,EAAK/4C,EAAIk8C,EACTnD,EAAK94C,EAAI87C,GACF,EAET,SAASQ,GAAoB7B,EAAOG,GAClC5gD,KAAKuJ,EAAIk3C,EACTzgD,KAAKyB,EAAIm/C,EACT5gD,KAAK+F,EAAI/F,KAAKgG,EAAI,KAEpB,SAAS+5C,GAA0BU,EAAOG,EAAOqB,EAAIH,GACnD,IAAIhD,EAAO,IAAIwD,GAAoB7B,EAAOG,GAM1C,OALAvC,GAAqBv2C,KAAKg3C,GACtBmD,GAAInC,GAA0BhB,EAAM2B,EAAOG,EAAOqB,GAClDH,GAAIhC,GAA0BhB,EAAM8B,EAAOH,EAAOqB,GACtDxD,GAAqBmC,EAAM9gD,GAAG6hD,MAAM15C,KAAK,IAAIy6C,GAAwBzD,EAAM2B,EAAOG,IAClFtC,GAAqBsC,EAAMjhD,GAAG6hD,MAAM15C,KAAK,IAAIy6C,GAAwBzD,EAAM8B,EAAOH,IAC3E3B,EAET,SAAS0D,GAAgC/B,EAAOwB,EAAIH,GAClD,IAAIhD,EAAO,IAAIwD,GAAoB7B,EAAO,MAI1C,OAHA3B,EAAK/4C,EAAIk8C,EACTnD,EAAK94C,EAAI87C,EACTzD,GAAqBv2C,KAAKg3C,GACnBA,EAET,SAASgB,GAA0BhB,EAAM2B,EAAOG,EAAOvB,GAChDP,EAAK/4C,GAAM+4C,EAAK94C,EAIV84C,EAAKv1C,IAAMq3C,EACpB9B,EAAK94C,EAAIq5C,EAETP,EAAK/4C,EAAIs5C,GANTP,EAAK/4C,EAAIs5C,EACTP,EAAKv1C,EAAIk3C,EACT3B,EAAKr9C,EAAIm/C,GAOb,SAAS2B,GAAwBzD,EAAM2B,EAAOG,GAC5C,IAAIqB,EAAKnD,EAAK/4C,EAAG+7C,EAAKhD,EAAK94C,EAC3BhG,KAAK8+C,KAAOA,EACZ9+C,KAAK++C,KAAO0B,EACZzgD,KAAKyqC,MAAQmW,EAAQ/gD,KAAKyrB,MAAMs1B,EAAM3/C,EAAIw/C,EAAMx/C,EAAG2/C,EAAM5+C,EAAIy+C,EAAMz+C,GAAK88C,EAAKv1C,IAAMk3C,EAAQ5gD,KAAKyrB,MAAMw2B,EAAG9/C,EAAIigD,EAAGjgD,EAAGigD,EAAGhhD,EAAI6gD,EAAG7gD,GAAKpB,KAAKyrB,MAAM22B,EAAGjgD,EAAI8/C,EAAG9/C,EAAG8/C,EAAG7gD,EAAIghD,EAAGhhD,GAUtK,SAASwhD,KACPziD,KAAK6U,EAAI,KAEX,SAASgqC,GAA4BlvC,GACnCA,EAAK2xB,EAAI3xB,EAAKvO,EAAIuO,EAAKsxB,EAAItxB,EAAK4wC,EAAI5wC,EAAK4vC,EAAI5vC,EAAK6oB,EAAI,KAkKxD,SAASkqB,GAAkCC,EAAMhzC,GAC/C,IAAIjO,EAAIiO,EAAMrG,EAAIqG,EAAK4wC,EAAGrxC,EAASxN,EAAE4/B,EACjCpyB,EACEA,EAAO+xB,IAAMv/B,EAAGwN,EAAO+xB,EAAI33B,EAAQ4F,EAAOqxC,EAAIj3C,EAElDq5C,EAAK9tC,EAAIvL,EAEXA,EAAEg4B,EAAIpyB,EACNxN,EAAE4/B,EAAIh4B,EACN5H,EAAE6+C,EAAIj3C,EAAE23B,EACJv/B,EAAE6+C,IAAG7+C,EAAE6+C,EAAEjf,EAAI5/B,GACjB4H,EAAE23B,EAAIv/B,EAER,SAASkhD,GAAmCD,EAAMhzC,GAChD,IAAIjO,EAAIiO,EAAMrG,EAAIqG,EAAKsxB,EAAG/xB,EAASxN,EAAE4/B,EACjCpyB,EACEA,EAAO+xB,IAAMv/B,EAAGwN,EAAO+xB,EAAI33B,EAAQ4F,EAAOqxC,EAAIj3C,EAElDq5C,EAAK9tC,EAAIvL,EAEXA,EAAEg4B,EAAIpyB,EACNxN,EAAE4/B,EAAIh4B,EACN5H,EAAEu/B,EAAI33B,EAAEi3C,EACJ7+C,EAAEu/B,IAAGv/B,EAAEu/B,EAAEK,EAAI5/B,GACjB4H,EAAEi3C,EAAI7+C,EAER,SAASmhD,GAA6BlzC,GACpC,KAAOA,EAAKsxB,GAAGtxB,EAAOA,EAAKsxB,EAC3B,OAAOtxB,EAET,SAASmzC,GAAgBC,EAAOC,GAC9B,IAAyDl9B,EAAIE,EAAIizB,EAA7D8F,EAAOgE,EAAM5jD,KAAK8jD,IAA4BhV,MAKlD,IAJAoQ,GAAuB,GACvBC,GAAuB,IAAIruC,MAAM8yC,EAAM/2C,QACvCuyC,GAAyB,IAAIkE,GAC7BhE,GAAyB,IAAIgE,KAG3B,GADAxJ,EAASuF,GACLO,KAAU9F,GAAU8F,EAAK99C,EAAIg4C,EAAOh4C,GAAK89C,EAAK99C,IAAMg4C,EAAOh4C,GAAK89C,EAAK/8C,EAAIi3C,EAAOj3C,GAC9E+8C,EAAK/8C,IAAM8jB,GAAMi5B,EAAK99C,IAAM+kB,IAC9Bs4B,GAAqBS,EAAKp/C,GAAK,IAAI4hD,GAAoBxC,GACvDkB,GAAwBlB,GACxBj5B,EAAKi5B,EAAK/8C,EAAGgkB,EAAK+4B,EAAK99C,GAEzB89C,EAAOgE,EAAM9U,UACR,KAAIgL,EAGT,MAFAmG,GAA2BnG,EAAOt6C,KAKlCqkD,IA3VN,SAAkCjxC,GAEhC,IADA,IAAqI1I,EAAjIm4C,EAAQnD,GAAsBxS,EAAO6E,GAAiB3+B,EAAO,GAAG,GAAIA,EAAO,GAAG,GAAIA,EAAO,GAAG,GAAIA,EAAO,GAAG,IAAKpS,EAAI6hD,EAAMx1C,OACtHrM,OAEAkiD,GADLx4C,EAAIm4C,EAAM7hD,GACyBoS,KAAY85B,EAAKxiC,IAAM+K,EAAI/K,EAAEtD,EAAE/D,EAAIqH,EAAErD,EAAEhE,GAAKghB,IAAK5O,EAAI/K,EAAEtD,EAAE9E,EAAIoI,EAAErD,EAAE/E,GAAK+hB,MACvG3Z,EAAEtD,EAAIsD,EAAErD,EAAI,KACZw7C,EAAM0B,OAAOvjD,EAAG,IAqVVwjD,CAAyBH,GA3arC,SAAmCjxC,GAEjC,IADA,IAAgFqkC,EAAIC,EAAIuH,EAAIG,EAAwDqF,EAAMC,EAAWC,EAAWC,EAAYvuC,EAAOkN,EAA/L4D,EAAK/T,EAAO,GAAG,GAAIgU,EAAKhU,EAAO,GAAG,GAAIiU,EAAKjU,EAAO,GAAG,GAAIkU,EAAKlU,EAAO,GAAG,GAAoByxC,EAAQlF,GAAsBmF,EAAQD,EAAMx3C,OACrIy3C,KAEL,IADAL,EAAOI,EAAMC,KACCL,EAAKM,UAInB,IAFAH,GADAD,EAAYF,EAAK5B,OACMx1C,OACvBq3C,EAAY,EACLA,EAAYE,GACiB3F,GAAlC17B,EAAMohC,EAAUD,GAAWnhC,OAAgBlgB,EAAG+7C,EAAK77B,EAAIjhB,EACFm1C,GAArDphC,EAAQsuC,IAAYD,EAAYE,GAAYvuC,SAAoBhT,EAAGq0C,EAAKrhC,EAAM/T,GAC1EmT,EAAIwpC,EAAKxH,GAAMpzB,IAAK5O,EAAI2pC,EAAK1H,GAAMrzB,MACrCsgC,EAAUJ,OAAOG,EAAW,EAAG,IAAId,GAAwBC,GAAgCY,EAAKrE,KAAM78B,EAAK9N,EAAIwpC,EAAK93B,GAAM9C,IAAKiD,EAAK83B,EAAK/6B,GAAI,CAC3IhhB,EAAG8jB,EACH7kB,EAAGmT,EAAIgiC,EAAKtwB,GAAM9C,GAAIqzB,EAAKpwB,GACzB7R,EAAI2pC,EAAK93B,GAAMjD,IAAK+C,EAAK63B,EAAK56B,GAAI,CACpChhB,EAAGoS,EAAIiiC,EAAKpwB,GAAMjD,GAAIozB,EAAKrwB,EAC3B9kB,EAAGglB,GACD7R,EAAIwpC,EAAK73B,GAAM/C,IAAK+6B,EAAK/3B,EAAKhD,GAAI,CACpChhB,EAAG+jB,EACH9kB,EAAGmT,EAAIgiC,EAAKrwB,GAAM/C,GAAIqzB,EAAKrwB,GACzB5R,EAAI2pC,EAAK/3B,GAAMhD,IAAK46B,EAAK93B,EAAK9C,GAAI,CACpChhB,EAAGoS,EAAIiiC,EAAKrwB,GAAMhD,GAAIozB,EAAKtwB,EAC3B7kB,EAAG+kB,GACD,MAAOo9B,EAAKrE,KAAM,SACpBwE,GAkZkCI,CAA0BX,IACpE,IAAIY,EAAU,CACZJ,MAAOlF,GACPkD,MAAOnD,IAGT,OADAE,GAAyBE,GAAyBJ,GAAuBC,GAAuB,KACzFsF,EAET,SAASX,GAA2Bl9C,EAAGC,GACrC,OAAOA,EAAE/E,EAAI8E,EAAE9E,GAAK+E,EAAEhE,EAAI+D,EAAE/D,EA7b9Bu/C,GAAoBz+C,UAAU4gD,QAAU,WAEtC,IADA,IAA0D5E,EAAtDwE,EAAYtjD,KAAKwhD,MAAO6B,EAAYC,EAAUt3C,OAC3Cq3C,MACLvE,EAAOwE,EAAUD,GAAWvE,MAClB94C,GAAM84C,EAAK/4C,GAAGu9C,EAAUJ,OAAOG,EAAW,GAGtD,OADAC,EAAUnkD,KAAKsiD,IACR6B,EAAUt3C,QA4MnBu2C,GAAwBz/C,UAAY,CAClCkS,MAAO,WACL,OAAOhV,KAAK8+C,KAAKv1C,IAAMvJ,KAAK++C,KAAO/+C,KAAK8+C,KAAK/4C,EAAI/F,KAAK8+C,KAAK94C,GAE7Dkc,IAAK,WACH,OAAOliB,KAAK8+C,KAAKv1C,IAAMvJ,KAAK++C,KAAO/+C,KAAK8+C,KAAK94C,EAAIhG,KAAK8+C,KAAK/4C,IAS/D08C,GAA4B3/C,UAAY,CACtCua,OAAQ,SAAS6e,EAAOvsB,GACtB,IAAIT,EAAQ20C,EAASC,EACrB,GAAI5nB,EAAO,CAKT,GAJAvsB,EAAK4vC,EAAIrjB,EACTvsB,EAAK6oB,EAAI0D,EAAM1D,EACX0D,EAAM1D,IAAG0D,EAAM1D,EAAE+mB,EAAI5vC,GACzBusB,EAAM1D,EAAI7oB,EACNusB,EAAMqkB,EAAG,CAEX,IADArkB,EAAQA,EAAMqkB,EACPrkB,EAAM+E,GAAG/E,EAAQA,EAAM+E,EAC9B/E,EAAM+E,EAAItxB,OAEVusB,EAAMqkB,EAAI5wC,EAEZT,EAASgtB,OACAl8B,KAAK6U,GACdqnB,EAAQ2mB,GAA6B7iD,KAAK6U,GAC1ClF,EAAK4vC,EAAI,KACT5vC,EAAK6oB,EAAI0D,EACTA,EAAMqjB,EAAIrjB,EAAM+E,EAAItxB,EACpBT,EAASgtB,IAETvsB,EAAK4vC,EAAI5vC,EAAK6oB,EAAI,KAClBx4B,KAAK6U,EAAIlF,EACTT,EAAS,MAMX,IAJAS,EAAKsxB,EAAItxB,EAAK4wC,EAAI,KAClB5wC,EAAK2xB,EAAIpyB,EACTS,EAAKvO,GAAI,EACT86B,EAAQvsB,EACDT,GAAUA,EAAO9N,GAElB8N,KADJ20C,EAAU30C,EAAOoyB,GACML,GACrB6iB,EAAQD,EAAQtD,IACHuD,EAAM1iD,GACjB8N,EAAO9N,EAAI0iD,EAAM1iD,GAAI,EACrByiD,EAAQziD,GAAI,EACZ86B,EAAQ2nB,IAEJ3nB,IAAUhtB,EAAOqxC,IACnBmC,GAAkC1iD,KAAMkP,GAExCA,GADAgtB,EAAQhtB,GACOoyB,GAEjBpyB,EAAO9N,GAAI,EACXyiD,EAAQziD,GAAI,EACZwhD,GAAmC5iD,KAAM6jD,KAG3CC,EAAQD,EAAQ5iB,IACH6iB,EAAM1iD,GACjB8N,EAAO9N,EAAI0iD,EAAM1iD,GAAI,EACrByiD,EAAQziD,GAAI,EACZ86B,EAAQ2nB,IAEJ3nB,IAAUhtB,EAAO+xB,IACnB2hB,GAAmC5iD,KAAMkP,GAEzCA,GADAgtB,EAAQhtB,GACOoyB,GAEjBpyB,EAAO9N,GAAI,EACXyiD,EAAQziD,GAAI,EACZshD,GAAkC1iD,KAAM6jD,IAG5C30C,EAASgtB,EAAMoF,EAEjBthC,KAAK6U,EAAEzT,GAAI,GAEb+N,OAAQ,SAASQ,GACXA,EAAK6oB,IAAG7oB,EAAK6oB,EAAE+mB,EAAI5vC,EAAK4vC,GACxB5vC,EAAK4vC,IAAG5vC,EAAK4vC,EAAE/mB,EAAI7oB,EAAK6oB,GAC5B7oB,EAAK6oB,EAAI7oB,EAAK4vC,EAAI,KAClB,IAAqBwE,EAAwC3lC,EAAMsV,EAA/DxkB,EAASS,EAAK2xB,EAAYt2B,EAAO2E,EAAKsxB,EAAGl2B,EAAQ4E,EAAK4wC,EA6B1D,GA5B4DniC,EAAvDpT,EAA8BD,EAAgC83C,GAA6B93C,GAA/CC,EAA/BD,EACdmE,EACEA,EAAO+xB,IAAMtxB,EAAMT,EAAO+xB,EAAI7iB,EAAWlP,EAAOqxC,EAAIniC,EAExDpe,KAAK6U,EAAIuJ,EAEPpT,GAAQD,GACV2oB,EAAMtV,EAAKhd,EACXgd,EAAKhd,EAAIuO,EAAKvO,EACdgd,EAAK6iB,EAAIj2B,EACTA,EAAKs2B,EAAIljB,EACLA,IAASrT,GACXmE,EAASkP,EAAKkjB,EACdljB,EAAKkjB,EAAI3xB,EAAK2xB,EACd3xB,EAAOyO,EAAKmiC,EACZrxC,EAAO+xB,EAAItxB,EACXyO,EAAKmiC,EAAIx1C,EACTA,EAAMu2B,EAAIljB,IAEVA,EAAKkjB,EAAIpyB,EACTA,EAASkP,EACTzO,EAAOyO,EAAKmiC,KAGd7sB,EAAM/jB,EAAKvO,EACXuO,EAAOyO,GAELzO,IAAMA,EAAK2xB,EAAIpyB,IACfwkB,EACJ,GAAI/jB,GAAQA,EAAKvO,EACfuO,EAAKvO,GAAI,MADX,CAIA,EAAG,CACD,GAAIuO,IAAS3P,KAAK6U,EAAG,MACrB,GAAIlF,IAAST,EAAO+xB,GAQlB,IAPA8iB,EAAU70C,EAAOqxC,GACLn/C,IACV2iD,EAAQ3iD,GAAI,EACZ8N,EAAO9N,GAAI,EACXshD,GAAkC1iD,KAAMkP,GACxC60C,EAAU70C,EAAOqxC,GAEfwD,EAAQ9iB,GAAK8iB,EAAQ9iB,EAAE7/B,GAAK2iD,EAAQxD,GAAKwD,EAAQxD,EAAEn/C,EAAG,CACnD2iD,EAAQxD,GAAMwD,EAAQxD,EAAEn/C,IAC3B2iD,EAAQ9iB,EAAE7/B,GAAI,EACd2iD,EAAQ3iD,GAAI,EACZwhD,GAAmC5iD,KAAM+jD,GACzCA,EAAU70C,EAAOqxC,GAEnBwD,EAAQ3iD,EAAI8N,EAAO9N,EACnB8N,EAAO9N,EAAI2iD,EAAQxD,EAAEn/C,GAAI,EACzBshD,GAAkC1iD,KAAMkP,GACxCS,EAAO3P,KAAK6U,EACZ,YAUF,IAPAkvC,EAAU70C,EAAO+xB,GACL7/B,IACV2iD,EAAQ3iD,GAAI,EACZ8N,EAAO9N,GAAI,EACXwhD,GAAmC5iD,KAAMkP,GACzC60C,EAAU70C,EAAO+xB,GAEf8iB,EAAQ9iB,GAAK8iB,EAAQ9iB,EAAE7/B,GAAK2iD,EAAQxD,GAAKwD,EAAQxD,EAAEn/C,EAAG,CACnD2iD,EAAQ9iB,GAAM8iB,EAAQ9iB,EAAE7/B,IAC3B2iD,EAAQxD,EAAEn/C,GAAI,EACd2iD,EAAQ3iD,GAAI,EACZshD,GAAkC1iD,KAAM+jD,GACxCA,EAAU70C,EAAO+xB,GAEnB8iB,EAAQ3iD,EAAI8N,EAAO9N,EACnB8N,EAAO9N,EAAI2iD,EAAQ9iB,EAAE7/B,GAAI,EACzBwhD,GAAmC5iD,KAAMkP,GACzCS,EAAO3P,KAAK6U,EACZ,MAGJkvC,EAAQ3iD,GAAI,EACZuO,EAAOT,EACPA,EAASA,EAAOoyB,SACR3xB,EAAKvO,GACXuO,IAAMA,EAAKvO,GAAI,MAiEvB9C,EAAG0+C,KAAKgH,QAAU,SAAS9X,GACzB,IAAIlqC,EAAIw6C,GAAgBv7C,EAAIw7C,GAAgBS,EAAKl7C,EAAGm7C,EAAKl8C,EAAGsxC,EAAa0R,GACzE,GAAI/X,EAAQ,OAAO8X,EAAQ9X,GAC3B,SAAS8X,EAAQxkD,GACf,IAAI0kD,EAAW,IAAIj0C,MAAMzQ,EAAKwM,QAAS8Z,EAAKysB,EAAW,GAAG,GAAIvsB,EAAKusB,EAAW,GAAG,GAAIxsB,EAAKwsB,EAAW,GAAG,GAAItsB,EAAKssB,EAAW,GAAG,GAQ/H,OAPAuQ,GAAgBC,EAAMvjD,GAAO+yC,GAAYiR,MAAMluC,SAAQ,SAAS8tC,EAAMzjD,GACpE,IAAI6hD,EAAQ4B,EAAK5B,MAAOzC,EAAOqE,EAAKrE,MAAgBmF,EAASvkD,GAAK6hD,EAAMx1C,OAASw1C,EAAMztC,KAAI,SAAS1K,GAClG,IAAII,EAAIJ,EAAE2L,QACV,MAAO,CAAEvL,EAAEzH,EAAGyH,EAAExI,MACb89C,EAAK/8C,GAAK8jB,GAAMi5B,EAAK/8C,GAAK+jB,GAAMg5B,EAAK99C,GAAK+kB,GAAM+4B,EAAK99C,GAAKglB,EAAK,CAAE,CAAEH,EAAIG,GAAM,CAAEF,EAAIE,GAAM,CAAEF,EAAIC,GAAM,CAAEF,EAAIE,IAAS,IACjHzF,MAAQ/gB,EAAKG,MAEhBukD,EAET,SAASnB,EAAMvjD,GACb,OAAOA,EAAKuU,KAAI,SAAS1U,EAAGM,GAC1B,MAAO,CACLqC,EAAGnC,KAAKC,MAAMo9C,EAAG79C,EAAGM,GAAKqjB,IAAKA,GAC9B/hB,EAAGpB,KAAKC,MAAMq9C,EAAG99C,EAAGM,GAAKqjB,IAAKA,GAC9BrjB,EAAGA,MA6CT,OAzCAqkD,EAAQG,MAAQ,SAAS3kD,GACvB,OAAOsjD,GAAgBC,EAAMvjD,IAAOgiD,MAAMrjC,QAAO,SAAS2gC,GACxD,OAAOA,EAAKv1C,GAAKu1C,EAAKr9C,KACrBsS,KAAI,SAAS+qC,GACd,MAAO,CACL1oC,OAAQ5W,EAAKs/C,EAAKv1C,EAAE5J,GACpByK,OAAQ5K,EAAKs/C,EAAKr9C,EAAE9B,QAI1BqkD,EAAQI,UAAY,SAAS5kD,GAC3B,IAAI4kD,EAAY,GAahB,OAZAtB,GAAgBC,EAAMvjD,IAAOgkD,MAAMluC,SAAQ,SAAS8tC,EAAMzjD,GAExD,IADA,IAA2G0kD,EA+B5Et+C,EAAGC,EAAGF,EA/BjCi5C,EAAOqE,EAAKrE,KAAMyC,EAAQ4B,EAAK5B,MAAMriD,KAAKsiD,IAA+B7/C,GAAK,EAAG4H,EAAIg4C,EAAMx1C,OAAgB4M,EAAK4oC,EAAMh4C,EAAI,GAAGs1C,KAAMwF,EAAK1rC,EAAGrP,IAAMw1C,EAAOnmC,EAAGnX,EAAImX,EAAGrP,IAC7J3H,EAAI4H,GACNoP,EACLyrC,EAAKC,EAELA,GADA1rC,EAAK4oC,EAAM5/C,GAAGk9C,MACNv1C,IAAMw1C,EAAOnmC,EAAGnX,EAAImX,EAAGrP,EAC3B5J,EAAI0kD,EAAG1kD,GAAKA,EAAI2kD,EAAG3kD,IAyBSqG,EAzB8Bq+C,EAyB3Bv+C,EAzB+Bw+C,IAyBrCv+C,EAzB2Bg5C,GA0BpD/8C,EAAI8D,EAAE9D,IAAMgE,EAAE/E,EAAI8E,EAAE9E,IAAM8E,EAAE/D,EAAIgE,EAAEhE,IAAM8D,EAAE7E,EAAI8E,EAAE9E,GA1BoB,IACtEmjD,EAAUt8C,KAAK,CAAEtI,EAAKG,GAAIH,EAAK6kD,EAAG1kD,GAAIH,EAAK8kD,EAAG3kD,QAI7CykD,GAETJ,EAAQhiD,EAAI,SAAS6S,GACnB,OAAOrK,UAAUwB,QAAUkxC,EAAK5nB,GAAWtzB,EAAI6S,GAAImvC,GAAWhiD,GAEhEgiD,EAAQ/iD,EAAI,SAAS4T,GACnB,OAAOrK,UAAUwB,QAAUmxC,EAAK7nB,GAAWr0B,EAAI4T,GAAImvC,GAAW/iD,GAEhE+iD,EAAQzR,WAAa,SAAS19B,GAC5B,OAAKrK,UAAUwB,QACfumC,EAAkB,MAAL19B,EAAYovC,GAA4BpvC,EAC9CmvC,GAFuBzR,IAAe0R,GAA4B,KAAO1R,GAIlFyR,EAAQjuC,KAAO,SAASlB,GACtB,OAAKrK,UAAUwB,OACRg4C,EAAQzR,WAAW19B,GAAK,CAAE,CAAE,EAAG,GAAKA,IADb09B,IAAe0R,GAA4B,KAAO1R,GAAcA,EAAW,IAGpGyR,GAET,IAAIC,GAA4B,CAAE,EAAG,KAAM,KAAO,CAAE,IAAK,MAkHzD,SAASM,GAAwBllD,GAC/B,OAAOA,EAAE2C,EAEX,SAASwiD,GAAwBnlD,GAC/B,OAAOA,EAAE4B,EAWX,SAASwjD,GAAsBzjD,EAAG2O,EAAMoW,EAAIE,EAAImwB,EAAIC,GAClD,IAAKr1C,EAAE2O,EAAMoW,EAAIE,EAAImwB,EAAIC,GAAK,CAC5B,IAAIqO,EAAiB,IAAX3+B,EAAKqwB,GAAUuO,EAAiB,IAAX1+B,EAAKowB,GAAUuO,EAAWj1C,EAAKyP,MAC1DwlC,EAAS,IAAIH,GAAsBzjD,EAAG4jD,EAAS,GAAI7+B,EAAIE,EAAIy+B,EAAIC,GAC/DC,EAAS,IAAIH,GAAsBzjD,EAAG4jD,EAAS,GAAIF,EAAIz+B,EAAImwB,EAAIuO,GAC/DC,EAAS,IAAIH,GAAsBzjD,EAAG4jD,EAAS,GAAI7+B,EAAI4+B,EAAID,EAAIrO,GAC/DuO,EAAS,IAAIH,GAAsBzjD,EAAG4jD,EAAS,GAAIF,EAAIC,EAAIvO,EAAIC,IAGvE,SAASwO,GAAqBC,EAAM9iD,EAAGf,EAAG6kB,EAAIE,EAAI43B,EAAIG,GACpD,IAA6BgH,EAAzBC,EAAe7vC,IAiCnB,OAhCA,SAAU8vC,EAAKt1C,EAAMoW,EAAIE,EAAImwB,EAAIC,GAC/B,KAAItwB,EAAK63B,GAAM33B,EAAK83B,GAAM3H,EAAKtwB,GAAMuwB,EAAKrwB,GAA1C,CACA,GAAIzF,EAAQ5Q,EAAK4Q,MAAO,CACtB,IAAIA,EAAOsC,EAAK7gB,EAAI2N,EAAK3N,EAAG8gB,EAAK7hB,EAAI0O,EAAK1O,EAAGikD,EAAYriC,EAAKA,EAAKC,EAAKA,EACxE,GAAIoiC,EAAYF,EAAc,CAC5B,IAAI9L,EAAWr5C,KAAK6S,KAAKsyC,EAAeE,GACxCp/B,EAAK9jB,EAAIk3C,EAAUlzB,EAAK/kB,EAAIi4C,EAC5B0E,EAAK57C,EAAIk3C,EAAU6E,EAAK98C,EAAIi4C,EAC5B6L,EAAexkC,GAInB,IADA,IAAIqkC,EAAWj1C,EAAKyP,MAAO+lC,EAAiB,IAAXp/B,EAAKqwB,GAAUgP,EAAiB,IAAXn/B,EAAKowB,GAClD12C,GADqFsB,GAAKmkD,IAC7E,EADuDpjD,GAAKmjD,EACjDvjD,EAAIjC,EAAI,EAAGA,EAAIiC,IAAKjC,EACnD,GAAIgQ,EAAOi1C,EAAa,EAAJjlD,GAAQ,OAAY,EAAJA,GACnC,KAAK,EACJslD,EAAKt1C,EAAMoW,EAAIE,EAAIk/B,EAAIC,GACvB,MAED,KAAK,EACJH,EAAKt1C,EAAMw1C,EAAIl/B,EAAImwB,EAAIgP,GACvB,MAED,KAAK,EACJH,EAAKt1C,EAAMoW,EAAIq/B,EAAID,EAAI9O,GACvB,MAED,KAAK,EACJ4O,EAAKt1C,EAAMw1C,EAAIC,EAAIhP,EAAIC,KA3B7B,CA+BGyO,EAAMh/B,EAAIE,EAAI43B,EAAIG,GACdgH,EAGT,SAASM,GAAkBt/C,EAAGC,GAC5BD,EAAIzH,EAAGwrB,IAAI/jB,GACXC,EAAI1H,EAAGwrB,IAAI9jB,GACX,IAAIs/C,EAAKv/C,EAAEtE,EAAG8jD,EAAKx/C,EAAEtF,EAAG+kD,EAAKz/C,EAAEC,EAAGy/C,EAAKz/C,EAAEvE,EAAI6jD,EAAII,EAAK1/C,EAAEvF,EAAI8kD,EAAII,EAAK3/C,EAAEA,EAAIw/C,EAC3E,OAAO,SAASrkD,GACd,MAAO,IAAMwqB,GAAW9rB,KAAKC,MAAMwlD,EAAKG,EAAKtkD,IAAMwqB,GAAW9rB,KAAKC,MAAMylD,EAAKG,EAAKvkD,IAAMwqB,GAAW9rB,KAAKC,MAAM0lD,EAAKG,EAAKxkD,KAI7H,SAASykD,GAAqB7/C,EAAGC,GAC/B,IAAoB3E,EAAhB1B,EAAI,GAAImG,EAAI,GAChB,IAAKzE,KAAK0E,EACJ1E,KAAK2E,EACPrG,EAAE0B,GAAKwkD,GAAe9/C,EAAE1E,GAAI2E,EAAE3E,IAE9ByE,EAAEzE,GAAK0E,EAAE1E,GAGb,IAAKA,KAAK2E,EACF3E,KAAK0E,IACTD,EAAEzE,GAAK2E,EAAE3E,IAGb,OAAO,SAASF,GACd,IAAKE,KAAK1B,EAAGmG,EAAEzE,GAAK1B,EAAE0B,GAAGF,GACzB,OAAO2E,GAIX,SAASggD,GAAqB//C,EAAGC,GAE/B,OADAD,GAAKA,EAAGC,GAAKA,EACN,SAAS7E,GACd,OAAO4E,GAAK,EAAI5E,GAAK6E,EAAI7E,GAI7B,SAAS4kD,GAAqBhgD,EAAGC,GAC/B,IAAkFggD,EAAIC,EAAIC,EAAtFC,EAAKC,GAAuBvqC,UAAYwqC,GAAuBxqC,UAAY,EAAelc,GAAK,EAAG8J,EAAI,GAAIH,EAAI,GAElH,IADAvD,GAAQ,GAAIC,GAAQ,IACZggD,EAAKI,GAAuBv6B,KAAK9lB,MAAQkgD,EAAKI,GAAuBx6B,KAAK7lB,MAC3EkgD,EAAKD,EAAGplD,OAASslD,IACpBD,EAAKlgD,EAAEsJ,MAAM62C,EAAID,GACbz8C,EAAE9J,GAAI8J,EAAE9J,IAAMumD,EAASz8C,IAAI9J,GAAKumD,IAEjCF,EAAKA,EAAG,OAASC,EAAKA,EAAG,IACxBx8C,EAAE9J,GAAI8J,EAAE9J,IAAMsmD,EAASx8C,IAAI9J,GAAKsmD,GAEpCx8C,IAAI9J,GAAK,KACT2J,EAAExB,KAAK,CACLnI,EAAGA,EACHqC,EAAG8jD,GAAqBE,EAAIC,MAGhCE,EAAKE,GAAuBxqC,UAM9B,OAJIsqC,EAAKngD,EAAEgG,SACTk6C,EAAKlgD,EAAEsJ,MAAM62C,GACT18C,EAAE9J,GAAI8J,EAAE9J,IAAMumD,EAASz8C,IAAI9J,GAAKumD,GAE/Bz8C,EAAEuC,OAAS,EAAI1C,EAAE,IAAMtD,EAAIsD,EAAE,GAAGtH,EAAG,SAASb,GACjD,OAAO6E,EAAE7E,GAAK,KACX,WACH,OAAO6E,IACJA,EAAIsD,EAAE0C,OAAQ,SAAS7K,GAC1B,IAAK,IAAWK,EAAP7B,EAAI,EAAMA,EAAIqG,IAAKrG,EAAG8J,GAAGjI,EAAI8H,EAAE3J,IAAIA,GAAK6B,EAAEQ,EAAEb,GACrD,OAAOsI,EAAEsuB,KAAK,MA5OlBz5B,EAAG0+C,KAAKsJ,SAAW,SAASrJ,GAC1B,OAAO3+C,EAAG0+C,KAAKgH,UAAUI,UAAUnH,IAErC3+C,EAAG0+C,KAAKuJ,SAAW,SAASra,EAAQnmB,EAAIE,EAAImwB,EAAIC,GAC9C,IAA4CmQ,EAAxCxkD,EAAIw6C,GAAgBv7C,EAAIw7C,GAC5B,GAAI+J,EAASh8C,UAAUwB,OAQrB,OAPAhK,EAAIuiD,GACJtjD,EAAIujD,GACW,IAAXgC,IACFnQ,EAAKpwB,EACLmwB,EAAKrwB,EACLE,EAAKF,EAAK,GAELwgC,EAASra,GAElB,SAASqa,EAAS/mD,GAChB,IAAIH,EAA2ConD,EAAIC,EAAI/mD,EAAG2B,EAAGqlD,EAAKC,EAAKC,EAAKC,EAArE5J,EAAK5nB,GAAWtzB,GAAIm7C,EAAK7nB,GAAWr0B,GAC3C,GAAU,MAAN8kB,EACF4gC,EAAM5gC,EAAI6gC,EAAM3gC,EAAI4gC,EAAMzQ,EAAI0Q,EAAMzQ,OAKpC,GAHAwQ,EAAMC,IAAQH,EAAMC,EAAMzxC,KAC1BsxC,EAAK,GAAIC,EAAK,GACdplD,EAAI9B,EAAKwM,OACLw6C,EAAQ,IAAK7mD,EAAI,EAAGA,EAAI2B,IAAK3B,GAC/BN,EAAIG,EAAKG,IACHqC,EAAI2kD,IAAKA,EAAMtnD,EAAE2C,GACnB3C,EAAE4B,EAAI2lD,IAAKA,EAAMvnD,EAAE4B,GACnB5B,EAAE2C,EAAI6kD,IAAKA,EAAMxnD,EAAE2C,GACnB3C,EAAE4B,EAAI6lD,IAAKA,EAAMznD,EAAE4B,GACvBwlD,EAAG3+C,KAAKzI,EAAE2C,GACV0kD,EAAG5+C,KAAKzI,EAAE4B,QACL,IAAKtB,EAAI,EAAGA,EAAI2B,IAAK3B,EAAG,CAC7B,IAAIsxC,GAAMiM,EAAG79C,EAAIG,EAAKG,GAAIA,GAAIuxC,GAAMiM,EAAG99C,EAAGM,GACtCsxC,EAAK0V,IAAKA,EAAM1V,GAChBC,EAAK0V,IAAKA,EAAM1V,GAChBD,EAAK4V,IAAKA,EAAM5V,GAChBC,EAAK4V,IAAKA,EAAM5V,GACpBuV,EAAG3+C,KAAKmpC,GACRyV,EAAG5+C,KAAKopC,GAGZ,IAAIruB,EAAKgkC,EAAMF,EAAK7jC,EAAKgkC,EAAMF,EAE/B,SAASvpC,EAAO/b,EAAGjC,EAAG2C,EAAGf,EAAG8kB,EAAIE,EAAImwB,EAAIC,GACtC,IAAI/kC,MAAMtP,KAAMsP,MAAMrQ,GACtB,GAAIK,EAAEylD,KAAM,CACV,IAAIC,EAAK1lD,EAAEU,EAAGilD,EAAK3lD,EAAEL,EACrB,GAAU,MAAN+lD,EACF,GAAI5yC,EAAI4yC,EAAKhlD,GAAKoS,EAAI6yC,EAAKhmD,GAAK,IAC9BimD,EAAY5lD,EAAGjC,EAAG2C,EAAGf,EAAG8kB,EAAIE,EAAImwB,EAAIC,OAC/B,CACL,IAAI8Q,EAAS7lD,EAAEif,MACfjf,EAAEU,EAAIV,EAAEL,EAAIK,EAAEif,MAAQ,KACtB2mC,EAAY5lD,EAAG6lD,EAAQH,EAAIC,EAAIlhC,EAAIE,EAAImwB,EAAIC,GAC3C6Q,EAAY5lD,EAAGjC,EAAG2C,EAAGf,EAAG8kB,EAAIE,EAAImwB,EAAIC,QAGtC/0C,EAAEU,EAAIA,EAAGV,EAAEL,EAAIA,EAAGK,EAAEif,MAAQlhB,OAG9B6nD,EAAY5lD,EAAGjC,EAAG2C,EAAGf,EAAG8kB,EAAIE,EAAImwB,EAAIC,GAGxC,SAAS6Q,EAAY5lD,EAAGjC,EAAG2C,EAAGf,EAAG8kB,EAAIE,EAAImwB,EAAIC,GAC3C,IAAI8O,EAAiB,IAAXp/B,EAAKqwB,GAAUgP,EAAiB,IAAXn/B,EAAKowB,GAAUtrC,EAAQ/I,GAAKmjD,EAAIiC,EAAQnmD,GAAKmkD,EAAIzlD,EAAIynD,GAAS,EAAIr8C,EACjGzJ,EAAEylD,MAAO,EAELh8C,EAAOgb,EAAKo/B,EAAS/O,EAAK+O,EAC1BiC,EAAOnhC,EAAKm/B,EAAS/O,EAAK+O,EAC9B/nC,EAHA/b,EAAIA,EAAE8d,MAAMzf,KAAO2B,EAAE8d,MAAMzf,GAmDxB,CACLonD,MAAM,EACN3nC,MAAO,GACPmB,MAAO,KACPve,EAAG,KACHf,EAAG,OArDS5B,EAAG2C,EAAGf,EAAG8kB,EAAIE,EAAImwB,EAAIC,GA3B7BxzB,EAAKC,EAAIgkC,EAAMF,EAAM/jC,EAASgkC,EAAMF,EAAM7jC,EA6B9C,IAAIgiC,EA8CC,CACLiC,MAAM,EACN3nC,MAAO,GACPmB,MAAO,KACPve,EAAG,KACHf,EAAG,KAlDH,IAAW,SAAS5B,GAClBge,EAAOynC,EAAMzlD,GAAI69C,EAAG79C,IAAKM,IAAKw9C,EAAG99C,EAAGM,GAAIgnD,EAAKC,EAAKC,EAAKC,IAEzD,MAAa,SAAS9lD,GACpByjD,GAAsBzjD,EAAG8jD,EAAM6B,EAAKC,EAAKC,EAAKC,IAEhD,KAAY,SAASvmC,GACnB,OAAOskC,GAAqBC,EAAMvkC,EAAM,GAAIA,EAAM,GAAIomC,EAAKC,EAAKC,EAAKC,KAGvE,GADAnnD,GAAK,EACK,MAANomB,EAAY,CACd,OAASpmB,EAAI2B,GACX+b,EAAOynC,EAAMtlD,EAAKG,GAAI8mD,EAAG9mD,GAAI+mD,EAAG/mD,GAAIgnD,EAAKC,EAAKC,EAAKC,KAEnDnnD,OACGH,EAAK8V,QAAQwvC,EAAKh5C,KAEzB,OADA26C,EAAKC,EAAKlnD,EAAOH,EAAI,KACdylD,EAmBT,OAjBAyB,EAASvkD,EAAI,SAAS6S,GACpB,OAAOrK,UAAUwB,QAAUhK,EAAI6S,EAAG0xC,GAAYvkD,GAEhDukD,EAAStlD,EAAI,SAAS4T,GACpB,OAAOrK,UAAUwB,QAAU/K,EAAI4T,EAAG0xC,GAAYtlD,GAEhDslD,EAASx0C,OAAS,SAAS8C,GACzB,OAAKrK,UAAUwB,QACN,MAAL6I,EAAWkR,EAAKE,EAAKmwB,EAAKC,EAAK,MAAWtwB,GAAMlR,EAAE,GAAG,GAAIoR,GAAMpR,EAAE,GAAG,GAAIuhC,GAAMvhC,EAAE,GAAG,GACvFwhC,GAAMxhC,EAAE,GAAG,IACJ0xC,GAH6B,MAANxgC,EAAa,KAAO,CAAE,CAAEA,EAAIE,GAAM,CAAEmwB,EAAIC,KAKxEkQ,EAASxwC,KAAO,SAASlB,GACvB,OAAKrK,UAAUwB,QACN,MAAL6I,EAAWkR,EAAKE,EAAKmwB,EAAKC,EAAK,MAAWtwB,EAAKE,EAAK,EAAGmwB,GAAMvhC,EAAE,GAAIwhC,GAAMxhC,EAAE,IACxE0xC,GAF6B,MAANxgC,EAAa,KAAO,CAAEqwB,EAAKrwB,EAAIswB,EAAKpwB,IAI7DsgC,GA8DTjoD,EAAG+oD,eAAiBhC,GASpB/mD,EAAGgpD,kBAAoB1B,GAoBvBtnD,EAAGipD,kBAAoBzB,GAOvBxnD,EAAGkpD,kBAAoBzB,GAiCvB,IAAIK,GAAyB,8CAA+CC,GAAyB,IAAIhrC,OAAO+qC,GAAuBhwC,OAAQ,KAE/I,SAASyvC,GAAe9/C,EAAGC,GAEzB,IADA,IAAiChF,EAA7BrB,EAAIrB,EAAGmpD,cAAcz7C,SAChBrM,GAAK,KAAOqB,EAAI1C,EAAGmpD,cAAc9nD,GAAGoG,EAAGC,MAChD,OAAOhF,EAOT,SAAS0mD,GAAoB3hD,EAAGC,GAC9B,IAAqFrG,EAAjFqC,EAAI,GAAI8D,EAAI,GAAI6hD,EAAK5hD,EAAEiG,OAAQ47C,EAAK5hD,EAAEgG,OAAQ2R,EAAK9d,KAAKiS,IAAI/L,EAAEiG,OAAQhG,EAAEgG,QAC5E,IAAKrM,EAAI,EAAGA,EAAIge,IAAMhe,EAAGqC,EAAE8F,KAAK+9C,GAAe9/C,EAAEpG,GAAIqG,EAAErG,KACvD,KAAMA,EAAIgoD,IAAMhoD,EAAGmG,EAAEnG,GAAKoG,EAAEpG,GAC5B,KAAMA,EAAIioD,IAAMjoD,EAAGmG,EAAEnG,GAAKqG,EAAErG,GAC5B,OAAO,SAASwB,GACd,IAAKxB,EAAI,EAAGA,EAAIge,IAAMhe,EAAGmG,EAAEnG,GAAKqC,EAAErC,GAAGwB,GACrC,OAAO2E,GAlBXxH,EAAGstC,YAAcia,GAMjBvnD,EAAGmpD,cAAgB,CAAE,SAAS1hD,EAAGC,GAC/B,IAAI7E,SAAW6E,EACf,OAAc,WAAN7E,EAAiB6qB,GAAatV,IAAI1Q,EAAEwC,gBAAkB,oBAAoBpB,KAAKpB,GAAKq/C,GAAoBU,GAAuB//C,aAAayjB,GAAW47B,GAAoBp1C,MAAMuF,QAAQxP,GAAK0hD,GAA4B,WAANvmD,GAAkBmQ,MAAMtL,GAAK4/C,GAAuBE,IAAsB//C,EAAGC,KAE3S1H,EAAGupD,iBAAmBH,GAWtB,IAAII,GAAkB,WACpB,OAAO5xC,GAEL6xC,GAAUzpD,EAAGyV,IAAI,CACnBi0C,OAAQF,GACRG,KA+DF,SAAsB5+C,GACpB,OAAO,SAASlI,GACd,OAAOtB,KAAKqnB,IAAI/lB,EAAGkI,KAhErB6+C,KAAM,WACJ,OAAOC,IAETC,MAAO,WACL,OAAOC,IAETnkC,IAAK,WACH,OAAOokC,IAETtkC,IAAK,WACH,OAAOukC,IAETtP,OAAQ,WACN,OAAOuP,IAETC,QA6DF,SAAyB1iD,EAAGrE,GAC1B,IAAI+H,EACAe,UAAUwB,OAAS,IAAGtK,EAAI,KAC1B8I,UAAUwB,OAAQvC,EAAI/H,EAAI0hB,GAAIvjB,KAAKikB,KAAK,EAAI/d,IAASA,EAAI,EAAG0D,EAAI/H,EAAI,GACxE,OAAO,SAASP,GACd,OAAO,EAAI4E,EAAIlG,KAAKqnB,IAAI,GAAI,GAAK/lB,GAAKtB,KAAKqkB,KAAK/iB,EAAIsI,GAAK2Z,GAAI1hB,KAjE/DgnD,KAoEF,SAAsBj/C,GACfA,IAAGA,EAAI,SACZ,OAAO,SAAStI,GACd,OAAOA,EAAIA,IAAMsI,EAAI,GAAKtI,EAAIsI,KAtEhCk/C,OAAQ,WACN,OAAOC,MAGPC,GAAevqD,EAAGyV,IAAI,CACxB,GAAMmC,EACN4yC,IAAKC,GACL,SAAUC,GACV,SAAU,SAAShoD,GACjB,OAAOgoD,GAAgBD,GAAgB/nD,OAS3C,SAASioD,GAAcjoD,GACrB,OAAO,SAASG,GACd,OAAOA,GAAK,EAAI,EAAIA,GAAK,EAAI,EAAIH,EAAEG,IAGvC,SAAS4nD,GAAgB/nD,GACvB,OAAO,SAASG,GACd,OAAO,EAAIH,EAAE,EAAIG,IAGrB,SAAS6nD,GAAgBhoD,GACvB,OAAO,SAASG,GACd,MAAO,IAAMA,EAAI,GAAKH,EAAE,EAAIG,GAAK,EAAIH,EAAE,EAAI,EAAIG,KAGnD,SAASgnD,GAAahnD,GACpB,OAAOA,EAAIA,EAEb,SAASknD,GAAclnD,GACrB,OAAOA,EAAIA,EAAIA,EAEjB,SAAS+nD,GAAmB/nD,GAC1B,GAAIA,GAAK,EAAG,OAAO,EACnB,GAAIA,GAAK,EAAG,OAAO,EACnB,IAAImvC,EAAKnvC,EAAIA,EAAGgoD,EAAK7Y,EAAKnvC,EAC1B,OAAO,GAAKA,EAAI,GAAKgoD,EAAK,GAAKhoD,EAAImvC,GAAM6Y,EAAK,KAOhD,SAASb,GAAYnnD,GACnB,OAAO,EAAItB,KAAKkrB,IAAI5pB,EAAImiB,IAE1B,SAASilC,GAAYpnD,GACnB,OAAOtB,KAAKqnB,IAAI,EAAG,IAAM/lB,EAAI,IAE/B,SAASqnD,GAAernD,GACtB,OAAO,EAAItB,KAAK6S,KAAK,EAAIvR,EAAIA,GAgB/B,SAASynD,GAAeznD,GACtB,OAAOA,EAAI,EAAI,KAAO,OAASA,EAAIA,EAAIA,EAAI,EAAI,KAAO,QAAUA,GAAK,IAAM,MAAQA,EAAI,IAAMA,EAAI,IAAM,KAAO,QAAUA,GAAK,KAAO,MAAQA,EAAI,MAAQ,QAAUA,GAAK,MAAQ,MAAQA,EAAI,QAkC7L,SAASioD,GAAoBrjD,EAAGC,GAE9B,OADAA,GAAKD,EACE,SAAS5E,GACd,OAAOtB,KAAKC,MAAMiG,EAAIC,EAAI7E,IAa9B,SAASkoD,GAAa7/C,GACpB,IA0B2BzD,EAAGC,EAAG3E,EA1B7B8jB,EAAK,CAAE3b,EAAEzD,EAAGyD,EAAExD,GAAKof,EAAK,CAAE5b,EAAE1D,EAAG0D,EAAEnK,GAAKiqD,EAAKC,GAAsBpkC,GAAKqkC,EAAKC,GAAgBtkC,EAAIC,GAAKskC,EAAKH,KA0BlFxjD,EA1B4Hqf,GA2BrJ,KAD+B/jB,GA1B+HmoD,IA0BlIxjD,EA1B6Hmf,GA2B7I,GACdpf,EAAE,IAAM1E,EAAI2E,EAAE,GACPD,KA7BiK,EACpKof,EAAG,GAAKC,EAAG,GAAKA,EAAG,GAAKD,EAAG,KAC7BA,EAAG,KAAO,EACVA,EAAG,KAAO,EACVmkC,IAAO,EACPE,IAAO,GAETxpD,KAAK0sC,QAAU4c,EAAKzpD,KAAKyrB,MAAMnG,EAAG,GAAIA,EAAG,IAAMtlB,KAAKyrB,OAAOlG,EAAG,GAAIA,EAAG,KAAO5B,GAC5ExjB,KAAKynB,UAAY,CAAEje,EAAEH,EAAGG,EAAExI,GAC1BhB,KAAKvB,MAAQ,CAAE6qD,EAAII,GACnB1pD,KAAK2pD,KAAOD,EAAK7pD,KAAKyrB,MAAMk+B,EAAIE,GAAMlmC,GAAa,EAKrD,SAASimC,GAAgB1jD,EAAGC,GAC1B,OAAOD,EAAE,GAAKC,EAAE,GAAKD,EAAE,GAAKC,EAAE,GAEhC,SAASujD,GAAsBxjD,GAC7B,IAAI1E,EAAIxB,KAAK6S,KAAK+2C,GAAgB1jD,EAAGA,IAKrC,OAJI1E,IACF0E,EAAE,IAAM1E,EACR0E,EAAE,IAAM1E,GAEHA,EAzIT/C,EAAGsrD,KAAO,SAAStjD,GACjB,IAAI3G,EAAI2G,EAAK4R,QAAQ,KAAM/W,EAAIxB,GAAK,EAAI2G,EAAKgJ,MAAM,EAAG3P,GAAK2G,EAAMkD,EAAI7J,GAAK,EAAI2G,EAAKgJ,MAAM3P,EAAI,GAAK,KAGlG,OAFAwB,EAAI4mD,GAAQh5C,IAAI5N,IAAM2mD,GAEfmB,IADPz/C,EAAIq/C,GAAa95C,IAAIvF,IAAM0M,GACJ/U,EAAEoJ,MAAM,KAAM8E,EAAcJ,KAAKzE,UAAW,OA4DrElM,EAAGurD,eACH,SAA2B9jD,EAAGC,GAC5BD,EAAIzH,EAAGssB,IAAI7kB,GACXC,EAAI1H,EAAGssB,IAAI5kB,GACX,IAAI8jD,EAAK/jD,EAAEW,EAAGqjD,EAAKhkD,EAAED,EAAGkkD,EAAKjkD,EAAEwD,EAAG0gD,EAAKjkD,EAAEU,EAAIojD,EAAII,EAAKlkD,EAAEF,EAAIikD,EAAII,EAAKnkD,EAAEuD,EAAIygD,EACvE14C,MAAM44C,KAAKA,EAAK,EAAGH,EAAKz4C,MAAMy4C,GAAM/jD,EAAEF,EAAIikD,GAC1Cz4C,MAAM24C,IAAKA,EAAK,EAAGH,EAAKx4C,MAAMw4C,GAAM9jD,EAAEU,EAAIojD,GAAaG,EAAK,IAAKA,GAAM,IAAcA,GAAM,MAAKA,GAAM,KAC1G,OAAO,SAAS9oD,GACd,OAAO2pB,GAAWg/B,EAAKG,EAAK9oD,EAAG4oD,EAAKG,EAAK/oD,EAAG6oD,EAAKG,EAAKhpD,GAAK,KAG/D7C,EAAG8rD,eACH,SAA2BrkD,EAAGC,GAC5BD,EAAIzH,EAAGyrB,IAAIhkB,GACXC,EAAI1H,EAAGyrB,IAAI/jB,GACX,IAAI8jD,EAAK/jD,EAAEW,EAAG2jD,EAAKtkD,EAAE0D,EAAGugD,EAAKjkD,EAAEwD,EAAG0gD,EAAKjkD,EAAEU,EAAIojD,EAAI5D,EAAKlgD,EAAEyD,EAAI4gD,EAAIF,EAAKnkD,EAAEuD,EAAIygD,EACvE14C,MAAM40C,KAAKA,EAAK,EAAGmE,EAAK/4C,MAAM+4C,GAAMrkD,EAAEyD,EAAI4gD,GAC1C/4C,MAAM24C,IAAKA,EAAK,EAAGH,EAAKx4C,MAAMw4C,GAAM9jD,EAAEU,EAAIojD,GAAaG,EAAK,IAAKA,GAAM,IAAcA,GAAM,MAAKA,GAAM,KAC1G,OAAO,SAAS9oD,GACd,OAAO8oB,GAAW6/B,EAAKG,EAAK9oD,EAAGkpD,EAAKnE,EAAK/kD,EAAG6oD,EAAKG,EAAKhpD,GAAK,KAG/D7C,EAAGgsD,eACH,SAA2BvkD,EAAGC,GAC5BD,EAAIzH,EAAG2sB,IAAIllB,GACXC,EAAI1H,EAAG2sB,IAAIjlB,GACX,IAAIgkD,EAAKjkD,EAAEwD,EAAGghD,EAAKxkD,EAAEA,EAAGy/C,EAAKz/C,EAAEC,EAAGmkD,EAAKnkD,EAAEuD,EAAIygD,EAAIQ,EAAKxkD,EAAED,EAAIwkD,EAAI5E,EAAK3/C,EAAEA,EAAIw/C,EAC3E,OAAO,SAASrkD,GACd,OAAOgqB,GAAW6+B,EAAKG,EAAKhpD,EAAGopD,EAAKC,EAAKrpD,EAAGqkD,EAAKG,EAAKxkD,GAAK,KAG/D7C,EAAGmsD,iBAAmBrB,GAOtB9qD,EAAGu6C,UAAY,SAAShY,GACtB,IAAIpgC,EAAIgP,EAAY7I,gBAAgBtI,EAAGwc,GAAG+B,OAAOje,IAAK,KACtD,OAAQN,EAAGu6C,UAAY,SAAShY,GAC9B,GAAc,MAAVA,EAAgB,CAClBpgC,EAAEgQ,aAAa,YAAaowB,GAC5B,IAAI1/B,EAAIV,EAAEo4C,UAAU6R,QAAQC,cAE9B,OAAO,IAAItB,GAAaloD,EAAIA,EAAEwS,OAASi3C,MACtC/pB,IAeLwoB,GAAavmD,UAAU+mB,SAAW,WAChC,MAAO,aAAe7pB,KAAKynB,UAAY,WAAaznB,KAAK0sC,OAAS,UAAY1sC,KAAK2pD,KAAO,UAAY3pD,KAAKvB,MAAQ,KAkBrH,IAAImsD,GAAuB,CACzB7kD,EAAG,EACHC,EAAG,EACHF,EAAG,EACHzG,EAAG,EACHgK,EAAG,EACHrI,EAAG,GAGL,SAAS6pD,GAA2BphD,GAClC,OAAOA,EAAEuC,OAASvC,EAAEwkC,MAAQ,IAAM,GAmDpC,SAAS6c,GAAwB/kD,EAAGC,GAClC,IAAIyD,EAAI,GAAIH,EAAI,GAOhB,OANAvD,EAAIzH,EAAGu6C,UAAU9yC,GAAIC,EAAI1H,EAAGu6C,UAAU7yC,GAnDxC,SAAiC+kD,EAAIC,EAAIvhD,EAAGH,GAC1C,GAAIyhD,EAAG,KAAOC,EAAG,IAAMD,EAAG,KAAOC,EAAG,GAAI,CACtC,IAAIrrD,EAAI8J,EAAE3B,KAAK,aAAc,KAAM,IAAK,KAAM,KAC9CwB,EAAExB,KAAK,CACLnI,EAAGA,EAAI,EACPqC,EAAG8jD,GAAqBiF,EAAG,GAAIC,EAAG,KACjC,CACDrrD,EAAGA,EAAI,EACPqC,EAAG8jD,GAAqBiF,EAAG,GAAIC,EAAG,WAE3BA,EAAG,IAAMA,EAAG,KACrBvhD,EAAE3B,KAAK,aAAekjD,EAAK,KAyC7BC,CAAwBllD,EAAE0hB,UAAWzhB,EAAEyhB,UAAWhe,EAAGH,GAtCvD,SAA8B4hD,EAAIC,EAAI1hD,EAAGH,GACnC4hD,IAAOC,GACLD,EAAKC,EAAK,IAAKA,GAAM,IAAcA,EAAKD,EAAK,MAAKA,GAAM,KAC5D5hD,EAAExB,KAAK,CACLnI,EAAG8J,EAAE3B,KAAK+iD,GAA2BphD,GAAK,UAAW,KAAM,KAAO,EAClEzH,EAAG8jD,GAAqBoF,EAAIC,MAErBA,GACT1hD,EAAE3B,KAAK+iD,GAA2BphD,GAAK,UAAY0hD,EAAK,KA+B1DC,CAAqBrlD,EAAE2mC,OAAQ1mC,EAAE0mC,OAAQjjC,EAAGH,GA5B9C,SAA4B+hD,EAAIC,EAAI7hD,EAAGH,GACjC+hD,IAAOC,EACThiD,EAAExB,KAAK,CACLnI,EAAG8J,EAAE3B,KAAK+iD,GAA2BphD,GAAK,SAAU,KAAM,KAAO,EACjEzH,EAAG8jD,GAAqBuF,EAAIC,KAErBA,GACT7hD,EAAE3B,KAAK+iD,GAA2BphD,GAAK,SAAW6hD,EAAK,KAsBzDC,CAAmBxlD,EAAE4jD,KAAM3jD,EAAE2jD,KAAMlgD,EAAGH,GAnBxC,SAA6BkiD,EAAIC,EAAIhiD,EAAGH,GACtC,GAAIkiD,EAAG,KAAOC,EAAG,IAAMD,EAAG,KAAOC,EAAG,GAAI,CACtC,IAAI9rD,EAAI8J,EAAE3B,KAAK+iD,GAA2BphD,GAAK,SAAU,KAAM,IAAK,KAAM,KAC1EH,EAAExB,KAAK,CACLnI,EAAGA,EAAI,EACPqC,EAAG8jD,GAAqB0F,EAAG,GAAIC,EAAG,KACjC,CACD9rD,EAAGA,EAAI,EACPqC,EAAG8jD,GAAqB0F,EAAG,GAAIC,EAAG,WAEjB,IAAVA,EAAG,IAAsB,IAAVA,EAAG,IAC3BhiD,EAAE3B,KAAK+iD,GAA2BphD,GAAK,SAAWgiD,EAAK,KASzDC,CAAoB3lD,EAAEtH,MAAOuH,EAAEvH,MAAOgL,EAAGH,GACzCvD,EAAIC,EAAI,KACD,SAAS7E,GAEd,IADA,IAA0BK,EAAtB7B,GAAK,EAAG2B,EAAIgI,EAAE0C,SACTrM,EAAI2B,GAAGmI,GAAGjI,EAAI8H,EAAE3J,IAAIA,GAAK6B,EAAEQ,EAAEb,GACtC,OAAOsI,EAAEsuB,KAAK,KAGlB,SAAS4zB,GAAuB5lD,EAAGC,GAEjC,OADAA,GAAKA,GAAKD,GAAKA,IAAM,EAAIC,EAClB,SAAShE,GACd,OAAQA,EAAI+D,GAAKC,GAGrB,SAAS4lD,GAAsB7lD,EAAGC,GAEhC,OADAA,GAAKA,GAAKD,GAAKA,IAAM,EAAIC,EAClB,SAAShE,GACd,OAAOnC,KAAK4C,IAAI,EAAG5C,KAAKiS,IAAI,GAAI9P,EAAI+D,GAAKC,KAW7C,SAAS6lD,GAAqBC,GAE5B,IADA,IAAI92C,EAAQ82C,EAAK11C,OAAQ8L,EAAM4pC,EAAK1hD,OAAQ2hD,EAsB9C,SAA6ChmD,EAAGC,GAC9C,GAAID,IAAMC,EAAG,OAAOD,EACpB,IAAIimD,EAASC,GAA0BlmD,GAAImmD,EAASD,GAA0BjmD,GAAImmD,EAAQH,EAAO/d,MAAOme,EAAQF,EAAOje,MAAOoe,EAAa,KAC3I,KAAOF,IAAUC,GACfC,EAAaF,EACbA,EAAQH,EAAO/d,MACfme,EAAQF,EAAOje,MAEjB,OAAOoe,EA9B2CC,CAAoCt3C,EAAOkN,GAAMgqB,EAAS,CAAEl3B,GACvGA,IAAU+2C,GACf/2C,EAAQA,EAAM9F,OACdg9B,EAAOpkC,KAAKkN,GAGd,IADA,IAAI3T,EAAI6qC,EAAOlgC,OACRkW,IAAQ6pC,GACb7f,EAAOgX,OAAO7hD,EAAG,EAAG6gB,GACpBA,EAAMA,EAAIhT,OAEZ,OAAOg9B,EAET,SAAS+f,GAA0Bt8C,GAEjC,IADA,IAAI48C,EAAY,GAAIr9C,EAASS,EAAKT,OACjB,MAAVA,GACLq9C,EAAUzkD,KAAK6H,GACfA,EAAOT,EACPA,EAASA,EAAOA,OAGlB,OADAq9C,EAAUzkD,KAAK6H,GACR48C,EAuVT,SAASC,GAAyBntD,GAChCA,EAAEotD,OAAS,EAEb,SAASC,GAAuBrtD,GAC9BA,EAAEotD,QAAS,EAEb,SAASE,GAAyBttD,GAChCA,EAAEotD,OAAS,EACXptD,EAAEutD,GAAKvtD,EAAE2C,EAAG3C,EAAEwtD,GAAKxtD,EAAE4B,EAEvB,SAAS6rD,GAAwBztD,GAC/BA,EAAEotD,QAAS,EA9cbnuD,EAAGyuD,qBAAuBjC,GA+E1BxsD,EAAGY,OAAS,GACZZ,EAAGY,OAAO8tD,OAAS,WACjB,OAAO,SAAS7I,GAEd,IADA,IAAI8I,EAAQ,GAAIttD,GAAK,EAAG2B,EAAI6iD,EAAMn4C,SACzBrM,EAAI2B,GAAG2rD,EAAMnlD,KAAK+jD,GAAqB1H,EAAMxkD,KACtD,OAAOstD,IAoCX3uD,EAAGY,OAAOguD,MAAQ,WAChB,IAAgBC,EAAQ/zC,EAAQzF,EAAQrS,EAAgB8rD,EAAYC,EAAeC,EAA/EJ,EAAQ,GAA+BtpD,EAAU,EACrD,SAAS2pD,IACP,IAAkFlsD,EAAGW,EAAG8jB,EAAInmB,EAAGiC,EAA3FyY,EAAY,GAAImzC,EAAY,GAAIC,EAAanvD,EAAGyW,MAAMzT,GAAIosD,EAAgB,GAI9E,IAHAP,EAAS,GACT/zC,EAAS,GACT/X,EAAI,EAAG1B,GAAK,IACHA,EAAI2B,GAAG,CAEd,IADAU,EAAI,EAAGJ,GAAK,IACHA,EAAIN,GACXU,GAAK2R,EAAOhU,GAAGiC,GAEjB4rD,EAAU1lD,KAAK9F,GACf0rD,EAAc5lD,KAAKxJ,EAAGyW,MAAMzT,IAC5BD,GAAKW,EAgBP,IAdIorD,GACFK,EAAWtuD,MAAK,SAAS4G,EAAGC,GAC1B,OAAOonD,EAAWI,EAAUznD,GAAIynD,EAAUxnD,OAG1CqnD,GACFK,EAAcp4C,SAAQ,SAASjW,EAAGM,GAChCN,EAAEF,MAAK,SAAS4G,EAAGC,GACjB,OAAOqnD,EAAc15C,EAAOhU,GAAGoG,GAAI4N,EAAOhU,GAAGqG,UAInD3E,GAAK+hB,GAAIxf,EAAUtC,GAAKD,EACxBW,EAAI,EAAGrC,GAAK,IACHA,EAAI2B,GAAG,CAEd,IADAwkB,EAAK9jB,EAAGJ,GAAK,IACJA,EAAIN,GAAG,CACd,IAAIqsD,EAAKF,EAAW9tD,GAAIiuD,EAAKF,EAAcC,GAAI/rD,GAAIhC,EAAI+T,EAAOg6C,GAAIC,GAAK5X,EAAKh0C,EAAG0vC,EAAK1vC,GAAKpC,EAAIyB,EAC7FgZ,EAAUszC,EAAK,IAAMC,GAAM,CACzB/sD,MAAO8sD,EACPE,SAAUD,EACVE,WAAY9X,EACZ+X,SAAUrc,EACVtyC,MAAOQ,GAGXwZ,EAAOu0C,GAAM,CACX9sD,MAAO8sD,EACPG,WAAYhoC,EACZioC,SAAU/rD,EACV5C,MAAOouD,EAAUG,IAEnB3rD,GAAK4B,EAGP,IADAjE,GAAK,IACIA,EAAI2B,GAEX,IADAM,EAAIjC,EAAI,IACCiC,EAAIN,GAAG,CACd,IAAI8U,EAASiE,EAAU1a,EAAI,IAAMiC,GAAIwI,EAASiQ,EAAUzY,EAAI,IAAMjC,IAC9DyW,EAAOhX,OAASgL,EAAOhL,QACzB+tD,EAAOrlD,KAAKsO,EAAOhX,MAAQgL,EAAOhL,MAAQ,CACxCgX,OAAQhM,EACRA,OAAQgM,GACN,CACFA,OAAQA,EACRhM,OAAQA,IAKZkjD,GAAYU,IAElB,SAASA,IACPb,EAAOhuD,MAAK,SAAS4G,EAAGC,GACtB,OAAOsnD,GAAYvnD,EAAEqQ,OAAOhX,MAAQ2G,EAAEqE,OAAOhL,OAAS,GAAI4G,EAAEoQ,OAAOhX,MAAQ4G,EAAEoE,OAAOhL,OAAS,MAyCjG,OAtCA8tD,EAAMv5C,OAAS,SAAS3R,GACtB,OAAKwI,UAAUwB,QACf1K,GAAKqS,EAAS3R,IAAM2R,EAAO3H,OAC3BmhD,EAAS/zC,EAAS,KACX8zC,GAHuBv5C,GAKhCu5C,EAAMtpD,QAAU,SAAS5B,GACvB,OAAKwI,UAAUwB,QACfpI,EAAU5B,EACVmrD,EAAS/zC,EAAS,KACX8zC,GAHuBtpD,GAKhCspD,EAAME,WAAa,SAASprD,GAC1B,OAAKwI,UAAUwB,QACfohD,EAAaprD,EACbmrD,EAAS/zC,EAAS,KACX8zC,GAHuBE,GAKhCF,EAAMG,cAAgB,SAASrrD,GAC7B,OAAKwI,UAAUwB,QACfqhD,EAAgBrrD,EAChBmrD,EAAS,KACFD,GAHuBG,GAKhCH,EAAMI,WAAa,SAAStrD,GAC1B,OAAKwI,UAAUwB,QACfshD,EAAatrD,EACTmrD,GAAQa,IACLd,GAHuBI,GAKhCJ,EAAMC,OAAS,WAEb,OADKA,GAAQI,IACNJ,GAETD,EAAM9zC,OAAS,WAEb,OADKA,GAAQm0C,IACNn0C,GAEF8zC,GAET5uD,EAAGY,OAAO+uD,MAAQ,WAChB,IAA6Dv0B,EAAwB/X,EAAMusC,EAAkOC,EAAWC,EAAWC,EAA/UJ,EAAQ,GAAIj2C,EAAQ1Z,EAAGuZ,SAAS,QAAS,OAAQ,OAAe9B,EAAO,CAAE,EAAG,GAAkBu4C,EAAW,GAAIC,EAAeC,GAA6BC,EAAeC,GAA6BC,GAAU,GAAIC,EAAkBC,GAAgCC,EAAU,GAAIC,EAAS,IAAK3vC,EAAQ,GAAI+kC,EAAQ,GACzT,SAAS6K,EAAQr/C,GACf,OAAO,SAASu4C,EAAMniC,EAAIlR,EAAGuhC,GAC3B,GAAI8R,EAAK3nC,QAAU5Q,EAAM,CACvB,IAAIkT,EAAKqlC,EAAK5+B,GAAK3Z,EAAK3N,EAAG8gB,EAAKolC,EAAK3+B,GAAK5Z,EAAK1O,EAAGguD,EAAK7Y,EAAKrwB,EAAImpC,EAAKrsC,EAAKA,EAAKC,EAAKA,EACpF,GAAImsC,EAAKA,EAAKF,EAASG,EAAI,CACzB,GAAIA,EAAKN,EAAiB,CACxB,IAAIvtD,EAAI6mD,EAAKyG,OAASO,EACtBv/C,EAAKi9C,IAAM/pC,EAAKxhB,EAChBsO,EAAKk9C,IAAM/pC,EAAKzhB,EAElB,OAAO,EAET,GAAI6mD,EAAK3nC,OAAS2uC,GAAMA,EAAKN,EAAiB,CACxCvtD,EAAI6mD,EAAKiH,YAAcD,EAC3Bv/C,EAAKi9C,IAAM/pC,EAAKxhB,EAChBsO,EAAKk9C,IAAM/pC,EAAKzhB,GAGpB,OAAQ6mD,EAAKyG,QAgMjB,SAASS,EAAS/vD,GAChBA,EAAEutD,GAAKtuD,EAAG0Z,MAAMhW,EAAG3C,EAAEwtD,GAAKvuD,EAAG0Z,MAAM/W,EACnCgtD,EAAMoB,SAER,OAjMApB,EAAMqB,KAAO,WACX,IAAKpB,GAAS,KAAO,KAMnB,OALAx0B,EAAQ,KACR1hB,EAAMkK,IAAI,CACRld,KAAM,MACNkpD,MAAOA,EAAQ,KAEV,EAET,IAAwC5kD,EAAG3J,EAAG6B,EAAGiI,EAAGtI,EAAGoI,EAAGlI,EAAGW,EAAGf,EAA5DK,EAAI8d,EAAMpT,OAAQxC,EAAI26C,EAAMn4C,OAChC,IAAKrM,EAAI,EAAGA,EAAI6J,IAAK7J,EAEnB8J,GADAjI,EAAI2iD,EAAMxkD,IACJyW,QAIF7M,GAFJvH,GADAb,EAAIK,EAAE4I,QACApI,EAAIyH,EAAEzH,GAEAA,GADZf,EAAIE,EAAEF,EAAIwI,EAAExI,GACQA,KAElBe,GADAuH,EAAI2kD,EAAQE,EAAUzuD,KAAO4J,EAAI1J,KAAK6S,KAAKnJ,IAAM4kD,EAAUxuD,IAAM4J,EAEjEtI,GAAKsI,EACLpI,EAAEa,GAAKA,GAAKX,EAAIoI,EAAE8lD,OAASpuD,EAAEouD,OAAS9lD,EAAE8lD,QAAU9lD,EAAE8lD,OAASpuD,EAAEouD,QAAU,IACzEpuD,EAAEF,GAAKA,EAAII,EACXoI,EAAEzH,GAAKA,GAAKX,EAAI,EAAIA,GACpBoI,EAAExI,GAAKA,EAAII,GAGf,IAAIA,EAAI6sD,EAAQY,KACd9sD,EAAI+T,EAAK,GAAK,EACd9U,EAAI8U,EAAK,GAAK,EACdpW,GAAK,EACD0B,GAAG,OAAS1B,EAAI2B,IAClBE,EAAI4d,EAAMzf,IACRqC,IAAMA,EAAIR,EAAEQ,GAAKX,EACnBG,EAAEP,IAAMA,EAAIO,EAAEP,GAAKI,EAGvB,GAAIstD,EAGF,KAyKN,SAASa,EAA0BtH,EAAMgG,EAAOG,GAC9C,IAAI/kC,EAAK,EAAGC,EAAK,EAEjB,GADA2+B,EAAKyG,OAAS,GACTzG,EAAKnB,KAER,IADA,IAAkDjhD,EAA9CsZ,EAAQ8oC,EAAK9oC,MAAO9d,EAAI8d,EAAMpT,OAAQrM,GAAK,IACtCA,EAAI2B,GAEF,OADTwE,EAAIsZ,EAAMzf,MAEV6vD,EAA0B1pD,EAAGooD,EAAOG,GACpCnG,EAAKyG,QAAU7oD,EAAE6oD,OACjBrlC,GAAMxjB,EAAE6oD,OAAS7oD,EAAEwjB,GACnBC,GAAMzjB,EAAE6oD,OAAS7oD,EAAEyjB,IAGvB,GAAI2+B,EAAK3nC,MAAO,CACT2nC,EAAKnB,OACRmB,EAAK3nC,MAAMve,GAAKnC,KAAKuT,SAAW,GAChC80C,EAAK3nC,MAAMtf,GAAKpB,KAAKuT,SAAW,IAElC,IAAI/R,EAAI6sD,EAAQG,EAAQnG,EAAK3nC,MAAM1f,OACnCqnD,EAAKyG,QAAUzG,EAAKiH,YAAc9tD,EAClCioB,GAAMjoB,EAAI6mD,EAAK3nC,MAAMve,EACrBunB,GAAMloB,EAAI6mD,EAAK3nC,MAAMtf,EAEvBinD,EAAK5+B,GAAKA,EAAK4+B,EAAKyG,OACpBzG,EAAK3+B,GAAKA,EAAK2+B,EAAKyG,OApMhBa,CAA0BlmD,EAAIhL,EAAG0+C,KAAKuJ,SAASnnC,GAAQ8uC,EAAOG,GAC9D1uD,GAAK,IACIA,EAAI2B,IACLE,EAAI4d,EAAMzf,IAAI8sD,OAClBnjD,EAAEmmD,MAAMT,EAAQxtD,IAKtB,IADA7B,GAAK,IACIA,EAAI2B,IACXE,EAAI4d,EAAMzf,IACJ8sD,OACJjrD,EAAEQ,EAAIR,EAAEorD,GACRprD,EAAEP,EAAIO,EAAEqrD,KAERrrD,EAAEQ,IAAMR,EAAEorD,IAAMprD,EAAEorD,GAAKprD,EAAEQ,IAAMssD,EAC/B9sD,EAAEP,IAAMO,EAAEqrD,IAAMrrD,EAAEqrD,GAAKrrD,EAAEP,IAAMqtD,GAGnCt2C,EAAMs3C,KAAK,CACTtqD,KAAM,OACNkpD,MAAOA,KAGXD,EAAM7uC,MAAQ,SAASpd,GACrB,OAAKwI,UAAUwB,QACfoT,EAAQpd,EACDisD,GAFuB7uC,GAIhC6uC,EAAM9J,MAAQ,SAASniD,GACrB,OAAKwI,UAAUwB,QACfm4C,EAAQniD,EACDisD,GAFuB9J,GAIhC8J,EAAMl4C,KAAO,SAAS/T,GACpB,OAAKwI,UAAUwB,QACf+J,EAAO/T,EACAisD,GAFuBl4C,GAIhCk4C,EAAMM,aAAe,SAASvsD,GAC5B,OAAKwI,UAAUwB,QACfuiD,EAA4B,mBAANvsD,EAAmBA,GAAKA,EACvCisD,GAFuBM,GAIhCN,EAAM/U,SAAW+U,EAAMM,aACvBN,EAAMQ,aAAe,SAASzsD,GAC5B,OAAKwI,UAAUwB,QACfyiD,EAA4B,mBAANzsD,EAAmBA,GAAKA,EACvCisD,GAFuBQ,GAIhCR,EAAMK,SAAW,SAAStsD,GACxB,OAAKwI,UAAUwB,QACfsiD,GAAYtsD,EACLisD,GAFuBK,GAIhCL,EAAMU,OAAS,SAAS3sD,GACtB,OAAKwI,UAAUwB,QACf2iD,EAAsB,mBAAN3sD,EAAmBA,GAAKA,EACjCisD,GAFuBU,GAIhCV,EAAMyB,eAAiB,SAAS1tD,GAC9B,OAAKwI,UAAUwB,QACf4iD,EAAkB5sD,EAAIA,EACfisD,GAFuBpuD,KAAK6S,KAAKk8C,IAI1CX,EAAMa,QAAU,SAAS9sD,GACvB,OAAKwI,UAAUwB,QACf8iD,GAAW9sD,EACJisD,GAFuBa,GAIhCb,EAAM0B,MAAQ,SAAS3tD,GACrB,OAAKwI,UAAUwB,QACf+iD,EAAS/sD,EAAIA,EACNisD,GAFuBpuD,KAAK6S,KAAKq8C,IAI1Cd,EAAMC,MAAQ,SAASlsD,GACrB,OAAKwI,UAAUwB,QACfhK,GAAKA,EACDksD,EACElsD,EAAI,EACNksD,EAAQlsD,GAER03B,EAAM5zB,EAAI,KAAM4zB,EAAMv4B,EAAIgQ,IAAKuoB,EAAQ,KACvC1hB,EAAMkK,IAAI,CACRld,KAAM,MACNkpD,MAAOA,EAAQ,KAGVlsD,EAAI,IACbgW,EAAMhD,MAAM,CACVhQ,KAAM,QACNkpD,MAAOA,EAAQlsD,IAEjB03B,EAAQJ,GAAS20B,EAAMqB,OAElBrB,GAnBuBC,GAqBhCD,EAAMj5C,MAAQ,WACZ,IAAIrV,EAAiEiwD,EAAWpuD,EAAzEF,EAAI8d,EAAMpT,OAAQxC,EAAI26C,EAAMn4C,OAAQ5C,EAAI2M,EAAK,GAAIrP,EAAIqP,EAAK,GACjE,IAAKpW,EAAI,EAAGA,EAAI2B,IAAK3B,GAClB6B,EAAI4d,EAAMzf,IAAIkB,MAAQlB,EACvB6B,EAAE+tD,OAAS,EAEb,IAAK5vD,EAAI,EAAGA,EAAI6J,IAAK7J,EAEI,iBADvB6B,EAAI2iD,EAAMxkD,IACGyW,SAAoB5U,EAAE4U,OAASgJ,EAAM5d,EAAE4U,SAC7B,iBAAZ5U,EAAE4I,SAAoB5I,EAAE4I,OAASgV,EAAM5d,EAAE4I,WAClD5I,EAAE4U,OAAOm5C,SACT/tD,EAAE4I,OAAOmlD,OAEb,IAAK5vD,EAAI,EAAGA,EAAI2B,IAAK3B,EACnB6B,EAAI4d,EAAMzf,GACN2R,MAAM9P,EAAEQ,KAAIR,EAAEQ,EAAI6E,EAAS,IAAKuC,IAChCkI,MAAM9P,EAAEP,KAAIO,EAAEP,EAAI4F,EAAS,IAAKH,IAChC4K,MAAM9P,EAAEorD,MAAKprD,EAAEorD,GAAKprD,EAAEQ,GACtBsP,MAAM9P,EAAEqrD,MAAKrrD,EAAEqrD,GAAKrrD,EAAEP,GAG5B,GADAktD,EAAY,GACgB,mBAAjBI,EAA6B,IAAK5uD,EAAI,EAAGA,EAAI6J,IAAK7J,EAAGwuD,EAAUxuD,IAAM4uD,EAAat/C,KAAKjP,KAAMmkD,EAAMxkD,GAAIA,QAAS,IAAKA,EAAI,EAAGA,EAAI6J,IAAK7J,EAAGwuD,EAAUxuD,GAAK4uD,EAElK,GADAH,EAAY,GACgB,mBAAjBK,EAA6B,IAAK9uD,EAAI,EAAGA,EAAI6J,IAAK7J,EAAGyuD,EAAUzuD,IAAM8uD,EAAax/C,KAAKjP,KAAMmkD,EAAMxkD,GAAIA,QAAS,IAAKA,EAAI,EAAGA,EAAI6J,IAAK7J,EAAGyuD,EAAUzuD,GAAK8uD,EAElK,GADAJ,EAAU,GACY,mBAAXM,EAAuB,IAAKhvD,EAAI,EAAGA,EAAI2B,IAAK3B,EAAG0uD,EAAQ1uD,IAAMgvD,EAAO1/C,KAAKjP,KAAMof,EAAMzf,GAAIA,QAAS,IAAKA,EAAI,EAAGA,EAAI2B,IAAK3B,EAAG0uD,EAAQ1uD,GAAKgvD,EAClJ,SAAS9nD,EAASgpD,EAAW95C,GAC3B,IAAK65C,EAAW,CAEd,IADAA,EAAY,IAAI3/C,MAAM3O,GACjBM,EAAI,EAAGA,EAAIN,IAAKM,EACnBguD,EAAUhuD,GAAK,GAEjB,IAAKA,EAAI,EAAGA,EAAI4H,IAAK5H,EAAG,CACtB,IAAIJ,EAAI2iD,EAAMviD,GACdguD,EAAUpuD,EAAE4U,OAAOvV,OAAOiH,KAAKtG,EAAE4I,QACjCwlD,EAAUpuD,EAAE4I,OAAOvJ,OAAOiH,KAAKtG,EAAE4U,SAIrC,IADA,IAA8DpU,EAA1D8tD,EAAaF,EAAUjwD,GAAIiC,GAAK,EAAG2H,EAAIumD,EAAW9jD,SAC7CpK,EAAI2H,GAAG,IAAK+H,MAAMtP,EAAI8tD,EAAWluD,GAAGiuD,IAAa,OAAO7tD,EACjE,OAAOnC,KAAKuT,SAAW2C,EAEzB,OAAOk4C,EAAMoB,UAEfpB,EAAMoB,OAAS,WACb,OAAOpB,EAAMC,MAAM,KAErBD,EAAMh5C,KAAO,WACX,OAAOg5C,EAAMC,MAAM,IAErBD,EAAMtsC,KAAO,WAEX,GADKA,IAAMA,EAAOrjB,EAAGkZ,SAASmK,OAAOC,OAAO1L,GAAavV,GAAG,kBAAmB6rD,IAA0B7rD,GAAG,aAAcyuD,GAAUzuD,GAAG,gBAAiB+rD,MACnJliD,UAAUwB,OAAQ,OAAO2V,EAC9B3hB,KAAKW,GAAG,kBAAmBgsD,IAA0BhsD,GAAG,iBAAkBmsD,IAAyB79C,KAAK0S,IAMnGrjB,EAAGmZ,OAAOw2C,EAAOj2C,EAAO,OA0CjC,IAAIw2C,GAA8B,GAAIE,GAA8B,EAAGG,GAAiC15C,IA2DxG,SAAS46C,GAA0B16C,EAAQ26C,GAIzC,OAHA1xD,EAAGmZ,OAAOpC,EAAQ26C,EAAW,OAAQ,WAAY,SACjD36C,EAAO+J,MAAQ/J,EACfA,EAAO8uC,MAAQ8L,GACR56C,EAET,SAAS66C,GAA+BvgD,EAAM5H,GAE5C,IADA,IAAIqX,EAAQ,CAAEzP,GACiB,OAAvBA,EAAOyP,EAAM6uB,QAEnB,GADAlmC,EAAS4H,IACJi1C,EAAWj1C,EAAKi1C,YAActjD,EAAIsjD,EAAS54C,QAE9C,IADA,IAAI1K,EAAGsjD,IACEtjD,GAAK,GAAG8d,EAAMtX,KAAK88C,EAAStjD,IAI3C,SAAS6uD,GAA8BxgD,EAAM5H,GAE3C,IADA,IAAIqX,EAAQ,CAAEzP,GAAQygD,EAAS,GACA,OAAvBzgD,EAAOyP,EAAM6uB,QAEnB,GADAmiB,EAAOtoD,KAAK6H,IACPi1C,EAAWj1C,EAAKi1C,YAActjD,EAAIsjD,EAAS54C,QAE9C,IADA,IAAY1K,EAAGsjD,EAAXjlD,GAAK,IACAA,EAAI2B,GAAG8d,EAAMtX,KAAK88C,EAASjlD,IAGxC,KAAgC,OAAxBgQ,EAAOygD,EAAOniB,QACpBlmC,EAAS4H,GAGb,SAAS0gD,GAA4BhxD,GACnC,OAAOA,EAAEulD,SAEX,SAAS0L,GAAyBjxD,GAChC,OAAOA,EAAED,MAEX,SAASmxD,GAAwBxqD,EAAGC,GAClC,OAAOA,EAAE5G,MAAQ2G,EAAE3G,MAErB,SAAS6wD,GAAyB7wC,GAChC,OAAO9gB,EAAGiE,MAAM6c,EAAMrL,KAAI,SAAS7E,GACjC,OAAQA,EAAO01C,UAAY,IAAI7wC,KAAI,SAASy8C,GAC1C,MAAO,CACLp6C,OAAQlH,EACR9E,OAAQomD,UArGhBlyD,EAAGY,OAAO8wD,UAAY,WACpB,IAAI7wD,EAAOoxD,GAAyB3L,EAAWyL,GAA6BjxD,EAAQkxD,GACpF,SAASN,EAAUlL,GACjB,IAAkCn1C,EAA9B8gD,EAAQ,CAAE3L,GAAQ1lC,EAAQ,GAE9B,IADA0lC,EAAK7tC,MAAQ,EACkB,OAAvBtH,EAAO8gD,EAAMxiB,QAEnB,GADA7uB,EAAMtX,KAAK6H,IACN+gD,EAAS9L,EAAS31C,KAAK+gD,EAAWrgD,EAAMA,EAAKsH,UAAY3V,EAAIovD,EAAO1kD,QAAS,CAEhF,IADA,IAAI1K,EAAGovD,EAAQF,IACNlvD,GAAK,GACZmvD,EAAM3oD,KAAK0oD,EAAQE,EAAOpvD,IAC1BkvD,EAAMthD,OAASS,EACf6gD,EAAMv5C,MAAQtH,EAAKsH,MAAQ,EAEzB7X,IAAOuQ,EAAKvQ,MAAQ,GACxBuQ,EAAKi1C,SAAW8L,OAEZtxD,IAAOuQ,EAAKvQ,OAASA,EAAM6P,KAAK+gD,EAAWrgD,EAAMA,EAAKsH,QAAU,UAC7DtH,EAAKi1C,SAQhB,OALAuL,GAA8BrL,GAAM,SAASn1C,GAC3C,IAAI+gD,EAAQxhD,EACR/P,IAASuxD,EAAS/gD,EAAKi1C,WAAW8L,EAAOvxD,KAAKA,GAC9CC,IAAU8P,EAASS,EAAKT,UAASA,EAAO9P,OAASuQ,EAAKvQ,UAErDggB,EA8BT,OA5BA4wC,EAAU7wD,KAAO,SAAS6C,GACxB,OAAKwI,UAAUwB,QACf7M,EAAO6C,EACAguD,GAFuB7wD,GAIhC6wD,EAAUpL,SAAW,SAAS5iD,GAC5B,OAAKwI,UAAUwB,QACf44C,EAAW5iD,EACJguD,GAFuBpL,GAIhCoL,EAAU5wD,MAAQ,SAAS4C,GACzB,OAAKwI,UAAUwB,QACf5M,EAAQ4C,EACDguD,GAFuB5wD,GAIhC4wD,EAAUW,QAAU,SAAS7L,GAW3B,OAVI1lD,IACF8wD,GAA+BpL,GAAM,SAASn1C,GACxCA,EAAKi1C,WAAUj1C,EAAKvQ,MAAQ,MAElC+wD,GAA8BrL,GAAM,SAASn1C,GAC3C,IAAIT,EACCS,EAAKi1C,WAAUj1C,EAAKvQ,OAASA,EAAM6P,KAAK+gD,EAAWrgD,EAAMA,EAAKsH,QAAU,IACzE/H,EAASS,EAAKT,UAAQA,EAAO9P,OAASuQ,EAAKvQ,WAG5C0lD,GAEFkL,GAkDT1xD,EAAGY,OAAO0xD,UAAY,WACpB,IAAIZ,EAAY1xD,EAAGY,OAAO8wD,YAAaj6C,EAAO,CAAE,EAAG,GAwBnD,SAAS66C,EAAUvxD,EAAGM,GACpB,IAAIyf,EAAQ4wC,EAAU/gD,KAAKjP,KAAMX,EAAGM,GAEpC,OA1BF,SAASkH,EAAS8I,EAAM3N,EAAG6gB,EAAIC,GAC7B,IAAI8hC,EAAWj1C,EAAKi1C,SAKpB,GAJAj1C,EAAK3N,EAAIA,EACT2N,EAAK1O,EAAI0O,EAAKsH,MAAQ6L,EACtBnT,EAAKkT,GAAKA,EACVlT,EAAKmT,GAAKA,EACN8hC,IAAatjD,EAAIsjD,EAAS54C,QAAS,CACrC,IAAY1K,EAAGwE,EAAGzG,EAAdM,GAAK,EAET,IADAkjB,EAAKlT,EAAKvQ,MAAQyjB,EAAKlT,EAAKvQ,MAAQ,IAC3BO,EAAI2B,GACXuF,EAASf,EAAI8+C,EAASjlD,GAAIqC,EAAG3C,EAAIyG,EAAE1G,MAAQyjB,EAAIC,GAC/C9gB,GAAK3C,GAcTwH,CAASuY,EAAM,GAAI,EAAGrJ,EAAK,GAAIA,EAAK,GAVtC,SAASkB,EAAMtH,GACb,IAAIi1C,EAAWj1C,EAAKi1C,SAAUvlD,EAAI,EAClC,GAAIulD,IAAatjD,EAAIsjD,EAAS54C,QAE5B,IADA,IAAY1K,EAAR3B,GAAK,IACAA,EAAI2B,GAAGjC,EAAIQ,KAAK4C,IAAIpD,EAAG4X,EAAM2tC,EAASjlD,KAEjD,OAAO,EAAIN,EAI8B4X,CAAMmI,EAAM,KAC9CA,EAOT,OALAwxC,EAAU76C,KAAO,SAAS/T,GACxB,OAAKwI,UAAUwB,QACf+J,EAAO/T,EACA4uD,GAFuB76C,GAIzBg6C,GAA0Ba,EAAWZ,IAE9C1xD,EAAGY,OAAOD,IAAM,WACd,IAAIG,EAAQyxD,OAAQ1xD,EAAO2xD,GAA0BhD,EAAa,EAAGC,EAAW3qC,GAAG2tC,EAAW,EAC9F,SAAS9xD,EAAIO,GACX,IAE2ZI,EAFvZ0B,EAAI9B,EAAKwM,OAAQmG,EAAS3S,EAAKuU,KAAI,SAAS1U,EAAGM,GACjD,OAAQP,EAAM6P,KAAKhQ,EAAKI,EAAGM,MACzBoG,IAA4B,mBAAf+nD,EAA4BA,EAAWvjD,MAAMvK,KAAMwK,WAAasjD,GAAakD,GAA0B,mBAAbjD,EAA0BA,EAASxjD,MAAMvK,KAAMwK,WAAaujD,GAAYhoD,EAAGrE,EAAI7B,KAAKiS,IAAIjS,KAAKuU,IAAI48C,GAAM1vD,IAAyB,mBAAbyvD,EAA0BA,EAASxmD,MAAMvK,KAAMwK,WAAaumD,IAAYE,EAAKvvD,GAAKsvD,EAAK,GAAK,EAAI,GAAIh/C,EAAM1T,EAAG0T,IAAIG,GAAS9Q,EAAI2Q,GAAOg/C,EAAK1vD,EAAI2vD,GAAMj/C,EAAM,EAAGnR,EAAQvC,EAAGyW,MAAMzT,GAAIZ,EAAO,GAevZ,OAdY,MAARvB,GAAc0B,EAAM1B,KAAKA,IAAS2xD,GAA2B,SAASnxD,EAAGiC,GAC3E,OAAOuQ,EAAOvQ,GAAKuQ,EAAOxS,IACxB,SAASA,EAAGiC,GACd,OAAOzC,EAAKK,EAAKG,GAAIH,EAAKoC,MAE5Bf,EAAMyU,SAAQ,SAAS3V,GACrBe,EAAKf,GAAK,CACRH,KAAMA,EAAKG,GACXP,MAAOQ,EAAIuS,EAAOxS,GAClBmuD,WAAY/nD,EACZgoD,SAAUhoD,GAAKnG,EAAIyB,EAAI4vD,EACvBF,SAAUrvD,MAGPhB,EA2BT,OAzBAzB,EAAIG,MAAQ,SAASyV,GACnB,OAAKrK,UAAUwB,QACf5M,EAAQyV,EACD5V,GAFuBG,GAIhCH,EAAIE,KAAO,SAAS0V,GAClB,OAAKrK,UAAUwB,QACf7M,EAAO0V,EACA5V,GAFuBE,GAIhCF,EAAI6uD,WAAa,SAASj5C,GACxB,OAAKrK,UAAUwB,QACf8hD,EAAaj5C,EACN5V,GAFuB6uD,GAIhC7uD,EAAI8uD,SAAW,SAASl5C,GACtB,OAAKrK,UAAUwB,QACf+hD,EAAWl5C,EACJ5V,GAFuB8uD,GAIhC9uD,EAAI8xD,SAAW,SAASl8C,GACtB,OAAKrK,UAAUwB,QACf+kD,EAAWl8C,EACJ5V,GAFuB8xD,GAIzB9xD,GAET,IAAI6xD,GAA2B,GA0D/B,SAASI,GAAiB7xD,GACxB,OAAOA,EAAE2C,EAEX,SAASmvD,GAAiB9xD,GACxB,OAAOA,EAAE4B,EAEX,SAASmwD,GAAmB/xD,EAAG2mB,EAAI/kB,GACjC5B,EAAE2mB,GAAKA,EACP3mB,EAAE4B,EAAIA,EAjER3C,EAAGY,OAAOuxD,MAAQ,WAChB,IAAIt+C,EAAS+D,EAAaqB,EAAQ85C,GAA6B9xB,EAAS+xB,GAA2BxI,EAAMsI,GAAoBpvD,EAAIkvD,GAAkBjwD,EAAIkwD,GACvJ,SAASV,EAAMjxD,EAAMqB,GACnB,KAAMS,EAAI9B,EAAKwM,QAAS,OAAOxM,EAC/B,IAAIkI,EAASlI,EAAKuU,KAAI,SAAS1U,EAAGM,GAChC,OAAOwS,EAAOlD,KAAKwhD,EAAOpxD,EAAGM,MAE3BusC,EAASxkC,EAAOqM,KAAI,SAAS1U,GAC/B,OAAOA,EAAE0U,KAAI,SAASnU,EAAGD,GACvB,MAAO,CAAEqC,EAAEiN,KAAKwhD,EAAO7wD,EAAGD,GAAIsB,EAAEgO,KAAKwhD,EAAO7wD,EAAGD,UAG/C4xD,EAASh6C,EAAMtI,KAAKwhD,EAAOvkB,EAAQrrC,GACvC6G,EAASpJ,EAAG+U,QAAQ3L,EAAQ6pD,GAC5BrlB,EAAS5tC,EAAG+U,QAAQ64B,EAAQqlB,GAC5B,IAC0BjwD,EAAG3B,EAAGiC,EAAGJ,EAD/BgwD,EAAUjyB,EAAOtwB,KAAKwhD,EAAOvkB,EAAQrrC,GACrC2I,EAAI9B,EAAO,GAAGsE,OAClB,IAAKpK,EAAI,EAAGA,EAAI4H,IAAK5H,EAEnB,IADAknD,EAAI75C,KAAKwhD,EAAO/oD,EAAO,GAAG9F,GAAIJ,EAAIgwD,EAAQ5vD,GAAIsqC,EAAO,GAAGtqC,GAAG,IACtDjC,EAAI,EAAGA,EAAI2B,IAAK3B,EACnBmpD,EAAI75C,KAAKwhD,EAAO/oD,EAAO/H,GAAGiC,GAAIJ,GAAK0qC,EAAOvsC,EAAI,GAAGiC,GAAG,GAAIsqC,EAAOvsC,GAAGiC,GAAG,IAGzE,OAAOpC,EAgCT,OA9BAixD,EAAMt+C,OAAS,SAASnQ,GACtB,OAAKwI,UAAUwB,QACfmG,EAASnQ,EACFyuD,GAFuBt+C,GAIhCs+C,EAAMl5C,MAAQ,SAASvV,GACrB,OAAKwI,UAAUwB,QACfuL,EAAqB,mBAANvV,EAAmBA,EAAIyvD,GAAsB1iD,IAAI/M,IAAMqvD,GAC/DZ,GAFuBl5C,GAIhCk5C,EAAMlxB,OAAS,SAASv9B,GACtB,OAAKwI,UAAUwB,QACfuzB,EAAsB,mBAANv9B,EAAmBA,EAAI0vD,GAAuB3iD,IAAI/M,IAAMsvD,GACjEb,GAFuBlxB,GAIhCkxB,EAAMzuD,EAAI,SAASyE,GACjB,OAAK+D,UAAUwB,QACfhK,EAAIyE,EACGgqD,GAFuBzuD,GAIhCyuD,EAAMxvD,EAAI,SAASwF,GACjB,OAAK+D,UAAUwB,QACf/K,EAAIwF,EACGgqD,GAFuBxvD,GAIhCwvD,EAAM3H,IAAM,SAASriD,GACnB,OAAK+D,UAAUwB,QACf88C,EAAMriD,EACCgqD,GAFuB3H,GAIzB2H,GAYT,IAAIgB,GAAwBnzD,EAAGyV,IAAI,CACjC,aAAc,SAASvU,GACrB,IAAqBG,EAAGiC,EAApBN,EAAI9B,EAAKwM,OAAcvJ,EAAMjD,EAAKuU,IAAI49C,IAA0BC,EAAOpyD,EAAKuU,IAAI89C,IAA2BhxD,EAAQvC,EAAGyW,MAAMzT,GAAGnC,MAAK,SAAS4G,EAAGC,GAClJ,OAAOvD,EAAIsD,GAAKtD,EAAIuD,MAClBc,EAAM,EAAGoE,EAAS,EAAG4mD,EAAO,GAAIC,EAAU,GAC9C,IAAKpyD,EAAI,EAAGA,EAAI2B,IAAK3B,EACnBiC,EAAIf,EAAMlB,GACNmH,EAAMoE,GACRpE,GAAO8qD,EAAKhwD,GACZkwD,EAAKhqD,KAAKlG,KAEVsJ,GAAU0mD,EAAKhwD,GACfmwD,EAAQjqD,KAAKlG,IAGjB,OAAOmwD,EAAQ92B,UAAU9iB,OAAO25C,IAElC72B,QAAS,SAASz7B,GAChB,OAAOlB,EAAGyW,MAAMvV,EAAKwM,QAAQivB,WAE/B,QAAWo2B,KAETK,GAAyBpzD,EAAGyV,IAAI,CAClCi+C,WAAY,SAASxyD,GACnB,IAA6DG,EAAGiC,EAAGJ,EAA/DF,EAAI9B,EAAKwM,OAAQxC,EAAIhK,EAAK,GAAGwM,OAAQ4lD,EAAO,GAAInvD,EAAM,EAAYujB,EAAK,GAC3E,IAAKpkB,EAAI,EAAGA,EAAI4H,IAAK5H,EAAG,CACtB,IAAKjC,EAAI,EAAG6B,EAAI,EAAG7B,EAAI2B,EAAG3B,IAAK6B,GAAKhC,EAAKG,GAAGiC,GAAG,GAC3CJ,EAAIiB,IAAKA,EAAMjB,GACnBowD,EAAK9pD,KAAKtG,GAEZ,IAAKI,EAAI,EAAGA,EAAI4H,IAAK5H,EACnBokB,EAAGpkB,IAAMa,EAAMmvD,EAAKhwD,IAAM,EAE5B,OAAOokB,GAETisC,OAAQ,SAASzyD,GACf,IAAgDG,EAAGiC,EAAGP,EAAGijD,EAAI4N,EAAIC,EAAItvC,EAAIrhB,EAAG4wD,EAAxE9wD,EAAI9B,EAAKwM,OAAQhK,EAAIxC,EAAK,GAAIgK,EAAIxH,EAAEgK,OAAwCga,EAAK,GAErF,IADAA,EAAG,GAAKxkB,EAAI4wD,EAAK,EACZxwD,EAAI,EAAGA,EAAI4H,IAAK5H,EAAG,CACtB,IAAKjC,EAAI,EAAG2kD,EAAK,EAAG3kD,EAAI2B,IAAK3B,EAAG2kD,GAAM9kD,EAAKG,GAAGiC,GAAG,GACjD,IAAKjC,EAAI,EAAGuyD,EAAK,EAAGrvC,EAAK7gB,EAAEJ,GAAG,GAAKI,EAAEJ,EAAI,GAAG,GAAIjC,EAAI2B,IAAK3B,EAAG,CAC1D,IAAK0B,EAAI,EAAG8wD,GAAM3yD,EAAKG,GAAGiC,GAAG,GAAKpC,EAAKG,GAAGiC,EAAI,GAAG,KAAO,EAAIihB,GAAKxhB,EAAI1B,IAAK0B,EACxE8wD,IAAO3yD,EAAK6B,GAAGO,GAAG,GAAKpC,EAAK6B,GAAGO,EAAI,GAAG,IAAMihB,EAE9CqvC,GAAMC,EAAK3yD,EAAKG,GAAGiC,GAAG,GAExBokB,EAAGpkB,GAAKJ,GAAK8iD,EAAK4N,EAAK5N,EAAKzhC,EAAK,EAC7BrhB,EAAI4wD,IAAIA,EAAK5wD,GAEnB,IAAKI,EAAI,EAAGA,EAAI4H,IAAK5H,EAAGokB,EAAGpkB,IAAMwwD,EACjC,OAAOpsC,GAETqsC,OAAQ,SAAS7yD,GACf,IAAoDG,EAAGiC,EAAGJ,EAAtDF,EAAI9B,EAAKwM,OAAQxC,EAAIhK,EAAK,GAAGwM,OAAQ3K,EAAI,EAAIC,EAAY0kB,EAAK,GAClE,IAAKpkB,EAAI,EAAGA,EAAI4H,IAAK5H,EAAG,CACtB,IAAKjC,EAAI,EAAG6B,EAAI,EAAG7B,EAAI2B,EAAG3B,IAAK6B,GAAKhC,EAAKG,GAAGiC,GAAG,GAC/C,GAAIJ,EAAG,IAAK7B,EAAI,EAAGA,EAAI2B,EAAG3B,IAAKH,EAAKG,GAAGiC,GAAG,IAAMJ,OAAQ,IAAK7B,EAAI,EAAGA,EAAI2B,EAAG3B,IAAKH,EAAKG,GAAGiC,GAAG,GAAKP,EAElG,IAAKO,EAAI,EAAGA,EAAI4H,IAAK5H,EAAGokB,EAAGpkB,GAAK,EAChC,OAAOokB,GAETssC,KAAMhB,KAER,SAASD,GAA4B7xD,GACnC,OAAOlB,EAAGyW,MAAMvV,EAAKwM,QAEvB,SAASslD,GAA0B9xD,GAEjC,IADA,IAAIoC,GAAK,EAAG4H,EAAIhK,EAAK,GAAGwM,OAAQga,EAAK,KAC5BpkB,EAAI4H,GAAGwc,EAAGpkB,GAAK,EACxB,OAAOokB,EAET,SAAS2rC,GAAwB3hD,GAE/B,IADA,IAAmC3O,EAA/B1B,EAAI,EAAGiC,EAAI,EAAGhC,EAAIoQ,EAAM,GAAG,GAAO1O,EAAI0O,EAAMhE,OAC1CrM,EAAI2B,IAAK3B,GACR0B,EAAI2O,EAAMrQ,GAAG,IAAMC,IACtBgC,EAAIjC,EACJC,EAAIyB,GAGR,OAAOO,EAET,SAASiwD,GAAyBxyD,GAChC,OAAOA,EAAEkzD,OAAOC,GAAoB,GAEtC,SAASA,GAAmB9wD,EAAGrC,GAC7B,OAAOqC,EAAIrC,EAAE,GAgDf,SAASozD,GAA8B19C,EAAO5C,GAC5C,OAAOugD,GAA4B39C,EAAOlV,KAAKipB,KAAKjpB,KAAKklB,IAAI5S,EAAOnG,QAAUnM,KAAK0oB,IAAM,IAE3F,SAASmqC,GAA4B39C,EAAOzT,GAE1C,IADA,IAAIU,GAAK,EAAGgE,GAAK+O,EAAM,GAAIvL,GAAKuL,EAAM,GAAK/O,GAAK1E,EAAGN,EAAI,KAC9CgB,GAAKV,GAAGN,EAAEgB,GAAKwH,EAAIxH,EAAIgE,EAChC,OAAOhF,EAET,SAAS2xD,GAAyBxgD,GAChC,MAAO,CAAE7T,EAAGwT,IAAIK,GAAS7T,EAAGmE,IAAI0P,IA2ClC,SAASygD,GAAmB7sD,EAAGC,GAC7B,OAAOD,EAAE3G,MAAQ4G,EAAE5G,MAErB,SAASyzD,GAAqB9sD,EAAGC,GAC/B,IAAIF,EAAIC,EAAE+sD,WACV/sD,EAAE+sD,WAAa9sD,EACfA,EAAE+sD,WAAahtD,EACfC,EAAE8sD,WAAahtD,EACfA,EAAEitD,WAAa/sD,EAEjB,SAASgtD,GAAqBjtD,EAAGC,GAC/BD,EAAE+sD,WAAa9sD,EACfA,EAAE+sD,WAAahtD,EAEjB,SAASktD,GAAyBltD,EAAGC,GACnC,IAAI6c,EAAK7c,EAAEhE,EAAI+D,EAAE/D,EAAG8gB,EAAK9c,EAAE/E,EAAI8E,EAAE9E,EAAGiyD,EAAKntD,EAAEtE,EAAIuE,EAAEvE,EACjD,MAAO,KAAOyxD,EAAKA,EAAKrwC,EAAKA,EAAKC,EAAKA,EAEzC,SAASqwC,GAAuBxjD,GAC9B,IAAMyP,EAAQzP,EAAKi1C,YAAetjD,EAAI8d,EAAMpT,QAA5C,CACA,IAAIoT,EAA6ErZ,EAAGC,EAAGF,EAAGnG,EAAGiC,EAAGP,EAAGC,EAAxF8xD,EAAOj+C,IAAUk+C,GAAQl+C,IAAUm+C,EAAOn+C,IAAUo+C,GAAQp+C,IAYvE,GALAiK,EAAM9J,QAAQk+C,KACdztD,EAAIqZ,EAAM,IACRpd,GAAK+D,EAAEtE,EACTsE,EAAE9E,EAAI,EACN8oC,EAAMhkC,GACFzE,EAAI,KACN0E,EAAIoZ,EAAM,IACRpd,EAAIgE,EAAEvE,EACRuE,EAAE/E,EAAI,EACN8oC,EAAM/jC,GACF1E,EAAI,GAQN,IANAmyD,GAAoB1tD,EAAGC,EADvBF,EAAIsZ,EAAM,IAEV2qB,EAAMjkC,GACN+sD,GAAqB9sD,EAAGD,GACxBC,EAAEgtD,WAAajtD,EACf+sD,GAAqB/sD,EAAGE,GACxBA,EAAID,EAAE+sD,WACDnzD,EAAI,EAAGA,EAAI2B,EAAG3B,IAAK,CACtB8zD,GAAoB1tD,EAAGC,EAAGF,EAAIsZ,EAAMzf,IACpC,IAAI+zD,EAAQ,EAAGpP,EAAK,EAAG4N,EAAK,EAC5B,IAAKtwD,EAAIoE,EAAE8sD,WAAYlxD,IAAMoE,EAAGpE,EAAIA,EAAEkxD,WAAYxO,IAChD,GAAI2O,GAAyBrxD,EAAGkE,GAAI,CAClC4tD,EAAQ,EACR,MAGJ,GAAa,GAATA,EACF,IAAKryD,EAAI0E,EAAEgtD,WAAY1xD,IAAMO,EAAEmxD,aACzBE,GAAyB5xD,EAAGyE,GADSzE,EAAIA,EAAE0xD,WAAYb,KAM3DwB,GACEpP,EAAK4N,GAAM5N,GAAM4N,GAAMlsD,EAAEvE,EAAIsE,EAAEtE,EAAGuxD,GAAqBjtD,EAAGC,EAAIpE,GAASoxD,GAAqBjtD,EAAI1E,EAAG2E,GACvGrG,MAEAkzD,GAAqB9sD,EAAGD,GACxBE,EAAIF,EACJikC,EAAMjkC,IAKd,IAAIwjB,GAAM8pC,EAAOC,GAAQ,EAAG9pC,GAAM+pC,EAAOC,GAAQ,EAAGtkB,EAAK,EACzD,IAAKtvC,EAAI,EAAGA,EAAI2B,EAAG3B,KACjBmG,EAAIsZ,EAAMzf,IACRqC,GAAKsnB,EACPxjB,EAAE7E,GAAKsoB,EACP0lB,EAAKpvC,KAAK4C,IAAIwsC,EAAInpC,EAAErE,EAAI5B,KAAK6S,KAAK5M,EAAE9D,EAAI8D,EAAE9D,EAAI8D,EAAE7E,EAAI6E,EAAE7E,IAExD0O,EAAKlO,EAAIwtC,EACT7vB,EAAM9J,QAAQq+C,IA3Dd,SAAS5pB,EAAMp6B,GACbyjD,EAAOvzD,KAAKiS,IAAInC,EAAK3N,EAAI2N,EAAKlO,EAAG2xD,GACjCC,EAAOxzD,KAAK4C,IAAIkN,EAAK3N,EAAI2N,EAAKlO,EAAG4xD,GACjCC,EAAOzzD,KAAKiS,IAAInC,EAAK1O,EAAI0O,EAAKlO,EAAG6xD,GACjCC,EAAO1zD,KAAK4C,IAAIkN,EAAK1O,EAAI0O,EAAKlO,EAAG8xD,IAyDrC,SAASC,GAAmB7jD,GAC1BA,EAAKmjD,WAAanjD,EAAKojD,WAAapjD,EAEtC,SAASgkD,GAAqBhkD,UACrBA,EAAKmjD,kBACLnjD,EAAKojD,WAYd,SAASU,GAAoB1tD,EAAGC,EAAGF,GACjC,IAAI8tD,EAAK7tD,EAAEtE,EAAIqE,EAAErE,EAAGohB,EAAK7c,EAAEhE,EAAI+D,EAAE/D,EAAG8gB,EAAK9c,EAAE/E,EAAI8E,EAAE9E,EACjD,GAAI2yD,IAAO/wC,GAAMC,GAAK,CACpB,IAAIkuC,EAAKhrD,EAAEvE,EAAIqE,EAAErE,EAAGoyD,EAAKhxC,EAAKA,EAAKC,EAAKA,EAGpC9gB,EAAI,KADR4xD,GAAMA,IADN5C,GAAMA,KAEoB,EAAI6C,GAAK5yD,EAAIpB,KAAK6S,KAAK7S,KAAK4C,IAAI,EAAG,EAAIuuD,GAAM4C,EAAKC,IAAOD,GAAMC,GAAMD,EAAK5C,EAAKA,KAAQ,EAAI6C,GACrH/tD,EAAE9D,EAAI+D,EAAE/D,EAAIA,EAAI6gB,EAAK5hB,EAAI6hB,EACzBhd,EAAE7E,EAAI8E,EAAE9E,EAAIe,EAAI8gB,EAAK7hB,EAAI4hB,OAEzB/c,EAAE9D,EAAI+D,EAAE/D,EAAI4xD,EACZ9tD,EAAE7E,EAAI8E,EAAE9E,EAuHZ,SAAS6yD,GAAyB/tD,EAAGC,GACnC,OAAOD,EAAEmJ,QAAUlJ,EAAEkJ,OAAS,EAAI,EAEpC,SAAS6kD,GAAmBn0D,GAC1B,IAAIglD,EAAWhlD,EAAEglD,SACjB,OAAOA,EAAS54C,OAAS44C,EAAS,GAAKhlD,EAAEuB,EAE3C,SAAS6yD,GAAoBp0D,GAC3B,IAA2B0B,EAAvBsjD,EAAWhlD,EAAEglD,SACjB,OAAQtjD,EAAIsjD,EAAS54C,QAAU44C,EAAStjD,EAAI,GAAK1B,EAAEuB,EAErD,SAAS8yD,GAAmBC,EAAIC,EAAIjmB,GAClC,IAAIkmB,EAASlmB,GAASimB,EAAGx0D,EAAIu0D,EAAGv0D,GAChCw0D,EAAGruD,GAAKsuD,EACRD,EAAG1qD,GAAKykC,EACRgmB,EAAGpuD,GAAKsuD,EACRD,EAAG1tD,GAAKynC,EACRimB,EAAG3qD,GAAK0kC,EAWV,SAASmmB,GAAuBC,EAAK10D,EAAG20D,GACtC,OAAOD,EAAIvuD,EAAEmJ,SAAWtP,EAAEsP,OAASolD,EAAIvuD,EAAIwuD,EAgN7C,SAASC,GAAyB7kD,GAChC,MAAO,CACL3N,EAAG2N,EAAK3N,EACRf,EAAG0O,EAAK1O,EACR4hB,GAAIlT,EAAKkT,GACTC,GAAInT,EAAKmT,IAGb,SAAS2xC,GAAqB9kD,EAAM/L,GAClC,IAAI5B,EAAI2N,EAAK3N,EAAI4B,EAAQ,GAAI3C,EAAI0O,EAAK1O,EAAI2C,EAAQ,GAAIif,EAAKlT,EAAKkT,GAAKjf,EAAQ,GAAKA,EAAQ,GAAIkf,EAAKnT,EAAKmT,GAAKlf,EAAQ,GAAKA,EAAQ,GASlI,OARIif,EAAK,IACP7gB,GAAK6gB,EAAK,EACVA,EAAK,GAEHC,EAAK,IACP7hB,GAAK6hB,EAAK,EACVA,EAAK,GAEA,CACL9gB,EAAGA,EACHf,EAAGA,EACH4hB,GAAIA,EACJC,GAAIA,GAsCR,SAAS4xC,GAAertC,GACtB,IAAIrS,EAAQqS,EAAO,GAAIpS,EAAOoS,EAAOA,EAAOrb,OAAS,GACrD,OAAOgJ,EAAQC,EAAO,CAAED,EAAOC,GAAS,CAAEA,EAAMD,GAElD,SAAS2/C,GAAcl2D,GACrB,OAAOA,EAAMm2D,YAAcn2D,EAAMm2D,cAAgBF,GAAej2D,EAAMsW,SAExE,SAAS8/C,GAAkBxtC,EAAQtS,EAAO+/C,EAAelpB,GACvD,IAAIrqC,EAAIuzD,EAAcztC,EAAO,GAAIA,EAAO,IAAK1nB,EAAIisC,EAAY72B,EAAM,GAAIA,EAAM,IAC7E,OAAO,SAAS/S,GACd,OAAOrC,EAAE4B,EAAES,KAGf,SAAS+yD,GAAc1tC,EAAQ2tC,GAC7B,IAAsEnyC,EAAlE3P,EAAK,EAAGC,EAAKkU,EAAOrb,OAAS,EAAG8Z,EAAKuB,EAAOnU,GAAK6S,EAAKsB,EAAOlU,GAOjE,OANI4S,EAAKD,IACPjD,EAAK3P,EAAIA,EAAKC,EAAIA,EAAK0P,EACvBA,EAAKiD,EAAIA,EAAKC,EAAIA,EAAKlD,GAEzBwE,EAAOnU,GAAM8hD,EAAK3iD,MAAMyT,GACxBuB,EAAOlU,GAAM6hD,EAAKlsC,KAAK/C,GAChBsB,EAET,SAAS4tC,GAAkB//C,GACzB,OAAOA,EAAO,CACZ7C,MAAO,SAASrQ,GACd,OAAOnC,KAAKwS,MAAMrQ,EAAIkT,GAAQA,GAEhC4T,KAAM,SAAS9mB,GACb,OAAOnC,KAAKipB,KAAK9mB,EAAIkT,GAAQA,IAE7BggD,GA/oBN52D,EAAGY,OAAOi2D,UAAY,WACpB,IAAIC,GAAY,EAAMC,EAASxE,OAAQyE,EAAS3C,GAA0B4C,EAAS9C,GACnF,SAAS0C,EAAU31D,EAAMG,GAEvB,IADA,IAAwI61D,EAAsFxzD,EAA1NyzD,EAAO,GAAItjD,EAAS3S,EAAKuU,IAAIshD,EAAQr1D,MAAO+U,EAAQugD,EAAOrmD,KAAKjP,KAAMmS,EAAQxS,GAAI+1D,EAAaH,EAAOtmD,KAAKjP,KAAM+U,EAAO5C,EAAQxS,GAAiB2B,GAAR3B,GAAK,EAAOwS,EAAOnG,QAAQxC,EAAIksD,EAAW1pD,OAAS,EAAG3K,EAAI+zD,EAAY,EAAI,EAAI9zD,IAClN3B,EAAI6J,IACXgsD,EAAMC,EAAK91D,GAAK,IACZkjB,GAAK6yC,EAAW/1D,EAAI,IAAM61D,EAAIxzD,EAAI0zD,EAAW/1D,IACjD61D,EAAIv0D,EAAI,EAEV,GAAIuI,EAAI,EAEN,IADA7J,GAAK,IACIA,EAAI2B,IACXU,EAAImQ,EAAOxS,KACFoV,EAAM,IAAM/S,GAAK+S,EAAM,MAC9BygD,EAAMC,EAAKn3D,EAAGwU,OAAO4iD,EAAY1zD,EAAG,EAAGwH,GAAK,IACxCvI,GAAKI,EACTm0D,EAAI1tD,KAAKtI,EAAKG,KAIpB,OAAO81D,EAwBT,OAtBAN,EAAU/1D,MAAQ,SAAS4C,GACzB,OAAKwI,UAAUwB,QACfqpD,EAASrzD,EACFmzD,GAFuBE,GAIhCF,EAAUpgD,MAAQ,SAAS/S,GACzB,OAAKwI,UAAUwB,QACfspD,EAAShgC,GAAWtzB,GACbmzD,GAFuBG,GAIhCH,EAAUM,KAAO,SAASzzD,GACxB,OAAKwI,UAAUwB,QACfupD,EAAsB,iBAANvzD,EAAiB,SAAS+S,GACxC,OAAO29C,GAA4B39C,EAAO/S,IACxCszB,GAAWtzB,GACRmzD,GAJuBI,GAMhCJ,EAAUC,UAAY,SAASpzD,GAC7B,OAAKwI,UAAUwB,QACfopD,IAAcpzD,EACPmzD,GAFuBC,GAIzBD,GAaT72D,EAAGY,OAAOy2D,KAAO,WACf,IAA8F72D,EAA1FkxD,EAAY1xD,EAAGY,OAAO8wD,YAAY7wD,KAAKyzD,IAAqBhvD,EAAU,EAAGmS,EAAO,CAAE,EAAG,GACzF,SAAS4/C,EAAKt2D,EAAGM,GACf,IAAIyf,EAAQ4wC,EAAU/gD,KAAKjP,KAAMX,EAAGM,GAAImlD,EAAO1lC,EAAM,GAAIhW,EAAI2M,EAAK,GAAIrP,EAAIqP,EAAK,GAAItU,EAAc,MAAV3C,EAAiBe,KAAK6S,KAAyB,mBAAX5T,EAAwBA,EAAS,WAC1J,OAAOA,GAOT,GALAgmD,EAAK9iD,EAAI8iD,EAAK7jD,EAAI,EAClBkvD,GAA8BrL,GAAM,SAASzlD,GAC3CA,EAAEoC,GAAKA,EAAEpC,EAAED,UAEb+wD,GAA8BrL,EAAMqO,IAChCvvD,EAAS,CACX,IAAIsvD,EAAKtvD,GAAW9E,EAAS,EAAIe,KAAK4C,IAAI,EAAIqiD,EAAKrjD,EAAI2H,EAAG,EAAI07C,EAAKrjD,EAAIiF,IAAM,EAC7EypD,GAA8BrL,GAAM,SAASzlD,GAC3CA,EAAEoC,GAAKyxD,KAET/C,GAA8BrL,EAAMqO,IACpChD,GAA8BrL,GAAM,SAASzlD,GAC3CA,EAAEoC,GAAKyxD,KAIX,OA4GJ,SAAS0C,EAAwBjmD,EAAM3N,EAAGf,EAAGI,GAC3C,IAAIujD,EAAWj1C,EAAKi1C,SAIpB,GAHAj1C,EAAK3N,EAAIA,GAAKX,EAAIsO,EAAK3N,EACvB2N,EAAK1O,EAAIA,GAAKI,EAAIsO,EAAK1O,EACvB0O,EAAKlO,GAAKJ,EACNujD,EAEF,IADA,IAAIjlD,GAAK,EAAG2B,EAAIsjD,EAAS54C,SAChBrM,EAAI2B,GAAGs0D,EAAwBhR,EAASjlD,GAAIqC,EAAGf,EAAGI,GApH3Du0D,CAAwB9Q,EAAM17C,EAAI,EAAG1C,EAAI,EAAG5H,EAAS,EAAI,EAAIe,KAAK4C,IAAI,EAAIqiD,EAAKrjD,EAAI2H,EAAG,EAAI07C,EAAKrjD,EAAIiF,IAC5F0Y,EAiBT,OAfAu2C,EAAK5/C,KAAO,SAASlB,GACnB,OAAKrK,UAAUwB,QACf+J,EAAOlB,EACA8gD,GAFuB5/C,GAIhC4/C,EAAK72D,OAAS,SAAS+V,GACrB,OAAKrK,UAAUwB,QACflN,EAAc,MAAL+V,GAA0B,mBAANA,EAAmBA,GAAKA,EAC9C8gD,GAFuB72D,GAIhC62D,EAAK/xD,QAAU,SAASiR,GACtB,OAAKrK,UAAUwB,QACfpI,GAAWiR,EACJ8gD,GAFuB/xD,GAIzBmsD,GAA0B4F,EAAM3F,IAmHzC1xD,EAAGY,OAAOyjD,KAAO,WACf,IAAIqN,EAAY1xD,EAAGY,OAAO8wD,YAAY7wD,KAAK,MAAMC,MAAM,MAAOy2D,EAAa/B,GAA0B/9C,EAAO,CAAE,EAAG,GAAK+/C,EAAW,KACjI,SAASnT,EAAKtjD,EAAGM,GACf,IAAIyf,EAAQ4wC,EAAU/gD,KAAKjP,KAAMX,EAAGM,GAAIo2D,EAAQ32C,EAAM,GAAI42C,EAkB5D,SAAkBD,GAChB,IAGsBE,EAHlBD,EAAQ,CACV90D,EAAG,KACH0jD,SAAU,CAAEmR,IACXG,EAAQ,CAAEF,GACb,KAAgC,OAAxBC,EAAQC,EAAMjoB,QACpB,IAAK,IAA+BuiB,EAA3B5L,EAAWqR,EAAMrR,SAAiBjlD,EAAI,EAAG2B,EAAIsjD,EAAS54C,OAAQrM,EAAI2B,IAAK3B,EAC9Eu2D,EAAMpuD,MAAM88C,EAASjlD,GAAK6wD,EAAQ,CAChC37C,EAAG+vC,EAASjlD,GACZuP,OAAQ+mD,EACRrR,UAAW4L,EAAQ5L,EAASjlD,GAAGilD,WAAa4L,EAAMlhD,SAAW,GAC7DpO,EAAG,KACH6E,EAAG,KACHU,EAAG,EACH+C,EAAG,EACH1D,EAAG,EACH2D,EAAG,EACHtI,EAAG,KACHxB,EAAGA,IACFoG,EAAIyqD,GAGX,OAAOwF,EAAMpR,SAAS,GAxC4CuR,CAASJ,GAG3E,GAFA5F,GAA8B6F,EAAOI,GAAYJ,EAAM9mD,OAAO1F,GAAKwsD,EAAMvvD,EACzEypD,GAA+B8F,EAAOK,GAClCP,EAAU5F,GAA+B6F,EAAOO,OAAgB,CAClE,IAAItrD,EAAO+qD,EAAOhrD,EAAQgrD,EAAO7qD,EAAS6qD,EAC1C7F,GAA+B6F,GAAO,SAASpmD,GACzCA,EAAK3N,EAAIgJ,EAAKhJ,IAAGgJ,EAAO2E,GACxBA,EAAK3N,EAAI+I,EAAM/I,IAAG+I,EAAQ4E,GAC1BA,EAAKsH,MAAQ/L,EAAO+L,QAAO/L,EAASyE,MAE1C,IAAI4mD,EAAKV,EAAW7qD,EAAMD,GAAS,EAAIC,EAAKhJ,EAAGsnD,EAAKvzC,EAAK,IAAMhL,EAAM/I,EAAI6zD,EAAW9qD,EAAOC,GAAQ,EAAIurD,GAAK7M,EAAK3zC,EAAK,IAAM7K,EAAO+L,OAAS,GAC5Ii5C,GAA+B6F,GAAO,SAASpmD,GAC7CA,EAAK3N,GAAK2N,EAAK3N,EAAIu0D,GAAMjN,EACzB35C,EAAK1O,EAAI0O,EAAKsH,MAAQyyC,KAG1B,OAAOtqC,EA0BT,SAASg3C,EAAUx2D,GACjB,IAAIglD,EAAWhlD,EAAEglD,SAAU4R,EAAW52D,EAAEsP,OAAO01C,SAAUx7C,EAAIxJ,EAAED,EAAI62D,EAAS52D,EAAED,EAAI,GAAK,KACvF,GAAIilD,EAAS54C,OAAQ,EAwFzB,SAA6BpM,GAC3B,IAAuEwJ,EAAnE8kC,EAAQ,EAAGkmB,EAAS,EAAGxP,EAAWhlD,EAAEglD,SAAUjlD,EAAIilD,EAAS54C,OAC/D,OAASrM,GAAK,IACZyJ,EAAIw7C,EAASjlD,IACX8G,GAAKynC,EACP9kC,EAAEI,GAAK0kC,EACPA,GAAS9kC,EAAEK,GAAK2qD,GAAUhrD,EAAEtD,GA7F1B2wD,CAAoB72D,GACpB,IAAI82D,GAAY9R,EAAS,GAAGn+C,EAAIm+C,EAASA,EAAS54C,OAAS,GAAGvF,GAAK,EAC/D2C,GACFxJ,EAAE6G,EAAI2C,EAAE3C,EAAIovD,EAAWj2D,EAAEiV,EAAGzL,EAAEyL,GAC9BjV,EAAE4J,EAAI5J,EAAE6G,EAAIiwD,GAEZ92D,EAAE6G,EAAIiwD,OAECttD,IACTxJ,EAAE6G,EAAI2C,EAAE3C,EAAIovD,EAAWj2D,EAAEiV,EAAGzL,EAAEyL,IAEhCjV,EAAEsP,OAAOhO,EAMX,SAAmBtB,EAAGwJ,EAAGmrD,GACvB,GAAInrD,EAAG,CAEL,IADA,IAAiH8kC,EAA7GyoB,EAAM/2D,EAAGg3D,EAAMh3D,EAAG00D,EAAMlrD,EAAGytD,EAAMF,EAAIznD,OAAO01C,SAAS,GAAIkS,EAAMH,EAAIntD,EAAGutD,EAAMH,EAAIptD,EAAGwtD,EAAM1C,EAAI9qD,EAAGytD,EAAMJ,EAAIrtD,EACvG8qD,EAAMN,GAAoBM,GAAMqC,EAAM5C,GAAmB4C,GAAMrC,GAAOqC,GAC3EE,EAAM9C,GAAmB8C,IACzBD,EAAM5C,GAAoB4C,IACtB7wD,EAAInG,GACRsuC,EAAQomB,EAAI7tD,EAAIuwD,EAAML,EAAIlwD,EAAIqwD,EAAMjB,EAAWvB,EAAIz/C,EAAG8hD,EAAI9hD,IAC9C,IACVo/C,GAAmBI,GAAuBC,EAAK10D,EAAG20D,GAAW30D,EAAGsuC,GAChE4oB,GAAO5oB,EACP6oB,GAAO7oB,GAET8oB,GAAO1C,EAAI9qD,EACXstD,GAAOH,EAAIntD,EACXytD,GAAOJ,EAAIrtD,EACXutD,GAAOH,EAAIptD,EAET8qD,IAAQN,GAAoB4C,KAC9BA,EAAIz1D,EAAImzD,EACRsC,EAAIptD,GAAKwtD,EAAMD,GAEbJ,IAAQ5C,GAAmB8C,KAC7BA,EAAI11D,EAAIw1D,EACRE,EAAIrtD,GAAKstD,EAAMG,EACf1C,EAAW30D,GAGf,OAAO20D,EAlCM2C,CAAUt3D,EAAGwJ,EAAGxJ,EAAEsP,OAAOhO,GAAKs1D,EAAS,IAEtD,SAASH,EAAWz2D,GAClBA,EAAEiV,EAAE7S,EAAIpC,EAAE6G,EAAI7G,EAAEsP,OAAO1F,EACvB5J,EAAE4J,GAAK5J,EAAEsP,OAAO1F,EAgClB,SAAS8sD,EAAS3mD,GAChBA,EAAK3N,GAAK+T,EAAK,GACfpG,EAAK1O,EAAI0O,EAAKsH,MAAQlB,EAAK,GAiB7B,OAfA4sC,EAAKkT,WAAa,SAAS7zD,GACzB,OAAKwI,UAAUwB,QACf6pD,EAAa7zD,EACN2gD,GAFuBkT,GAIhClT,EAAK5sC,KAAO,SAAS/T,GACnB,OAAKwI,UAAUwB,QACf8pD,EAAyB,OAAb//C,EAAO/T,GAAas0D,EAAW,KACpC3T,GAFuBmT,EAAW,KAAO//C,GAIlD4sC,EAAKmT,SAAW,SAAS9zD,GACvB,OAAKwI,UAAUwB,QACf8pD,EAAyB,OAAb//C,EAAO/T,GAAa,KAAOs0D,EAChC3T,GAFuBmT,EAAW//C,EAAO,MAI3Cg6C,GAA0BpN,EAAMqN,IAiCzC1xD,EAAGY,OAAOi4D,QAAU,WAClB,IAAInH,EAAY1xD,EAAGY,OAAO8wD,YAAY7wD,KAAK,MAAMC,MAAM,MAAOy2D,EAAa/B,GAA0B/9C,EAAO,CAAE,EAAG,GAAK+/C,GAAW,EACjI,SAASqB,EAAQ93D,EAAGM,GAClB,IAAyDy3D,EAArDh4C,EAAQ4wC,EAAU/gD,KAAKjP,KAAMX,EAAGM,GAAImlD,EAAO1lC,EAAM,GAAkBpd,EAAI,EAC3EmuD,GAA8BrL,GAAM,SAASn1C,GAC3C,IAAIi1C,EAAWj1C,EAAKi1C,SAChBA,GAAYA,EAAS54C,QACvB2D,EAAK3N,EAwCb,SAA4B4iD,GAC1B,OAAOA,EAAS2N,QAAO,SAASvwD,EAAGwuD,GACjC,OAAOxuD,EAAIwuD,EAAMxuD,IAChB,GAAK4iD,EAAS54C,OA3CFqrD,CAAmBzS,GAC5Bj1C,EAAK1O,EAkCb,SAA4B2jD,GAC1B,OAAO,EAAItmD,EAAGmE,IAAImiD,GAAU,SAAS4L,GACnC,OAAOA,EAAMvvD,KApCAq2D,CAAmB1S,KAE5Bj1C,EAAK3N,EAAIo1D,EAAep1D,GAAK6zD,EAAWlmD,EAAMynD,GAAgB,EAC9DznD,EAAK1O,EAAI,EACTm2D,EAAeznD,MAGnB,IAAI3E,EAqCR,SAASusD,EAAsB5nD,GAC7B,IAAIi1C,EAAWj1C,EAAKi1C,SACpB,OAAOA,GAAYA,EAAS54C,OAASurD,EAAsB3S,EAAS,IAAMj1C,EAvC7D4nD,CAAsBzS,GAAO/5C,EAyC5C,SAASysD,EAAuB7nD,GAC9B,IAA8BrO,EAA1BsjD,EAAWj1C,EAAKi1C,SACpB,OAAOA,IAAatjD,EAAIsjD,EAAS54C,QAAUwrD,EAAuB5S,EAAStjD,EAAI,IAAMqO,EA3CnC6nD,CAAuB1S,GAAOh/B,EAAK9a,EAAKhJ,EAAI6zD,EAAW7qD,EAAMD,GAAS,EAAGgb,EAAKhb,EAAM/I,EAAI6zD,EAAW9qD,EAAOC,GAAQ,EAQlK,OAPAmlD,GAA8BrL,EAAMgR,EAAW,SAASnmD,GACtDA,EAAK3N,GAAK2N,EAAK3N,EAAI8iD,EAAK9iD,GAAK+T,EAAK,GAClCpG,EAAK1O,GAAK6jD,EAAK7jD,EAAI0O,EAAK1O,GAAK8U,EAAK,IAChC,SAASpG,GACXA,EAAK3N,GAAK2N,EAAK3N,EAAI8jB,IAAOC,EAAKD,GAAM/P,EAAK,GAC1CpG,EAAK1O,GAAK,GAAK6jD,EAAK7jD,EAAI0O,EAAK1O,EAAI6jD,EAAK7jD,EAAI,IAAM8U,EAAK,KAEhDqJ,EAiBT,OAfA+3C,EAAQtB,WAAa,SAAS7zD,GAC5B,OAAKwI,UAAUwB,QACf6pD,EAAa7zD,EACNm1D,GAFuBtB,GAIhCsB,EAAQphD,KAAO,SAAS/T,GACtB,OAAKwI,UAAUwB,QACf8pD,EAAyB,OAAb//C,EAAO/T,GACZm1D,GAFuBrB,EAAW,KAAO//C,GAIlDohD,EAAQrB,SAAW,SAAS9zD,GAC1B,OAAKwI,UAAUwB,QACf8pD,EAAyB,OAAb//C,EAAO/T,GACZm1D,GAFuBrB,EAAW//C,EAAO,MAI3Cg6C,GAA0BoH,EAASnH,IAoB5C1xD,EAAGY,OAAOu4D,QAAU,WAClB,IAA4IC,EAAxI1H,EAAY1xD,EAAGY,OAAO8wD,YAAalwD,EAAQD,KAAKC,MAAOiW,EAAO,CAAE,EAAG,GAAKnS,EAAU,KAAM+zD,EAAMnD,GAA0BoD,GAAS,EAAiBC,EAAO,WAAYC,EAAQ,IAAM,EAAIj4D,KAAK6S,KAAK,IACrM,SAASjU,EAAMmmD,EAAUvjD,GAEvB,IADA,IAAiCmvD,EAAO1pB,EAApCnnC,GAAK,EAAG2B,EAAIsjD,EAAS54C,SAChBrM,EAAI2B,GACXwlC,GAAQ0pB,EAAQ5L,EAASjlD,IAAIP,OAASiC,EAAI,EAAI,EAAIA,GAClDmvD,EAAM1pB,KAAOx1B,MAAMw1B,IAASA,GAAQ,EAAI,EAAIA,EAGhD,SAASixB,EAASpoD,GAChB,IAAIi1C,EAAWj1C,EAAKi1C,SACpB,GAAIA,GAAYA,EAAS54C,OAAQ,CAC/B,IAA8DwkD,EAAwBwH,EAA6J12D,EAA/O6f,EAAOw2C,EAAIhoD,GAAOiE,EAAM,GAAIqkD,EAAYrT,EAASt1C,QAAgBs7B,EAAOz1B,IAAiB5T,EAAa,UAATs2D,EAAmB12C,EAAK0B,GAAc,SAATg1C,EAAkB12C,EAAK2B,GAAc,eAAT+0C,EAAqC,EAAbloD,EAAKsH,MAAYkK,EAAK2B,GAAK3B,EAAK0B,GAAKhjB,KAAKiS,IAAIqP,EAAK0B,GAAI1B,EAAK2B,IAG9O,IAFArkB,EAAMw5D,EAAW92C,EAAK0B,GAAK1B,EAAK2B,GAAKnT,EAAKvQ,OAC1CwU,EAAIkzB,KAAO,GACHxlC,EAAI22D,EAAUjsD,QAAU,GAC9B4H,EAAI9L,KAAK0oD,EAAQyH,EAAU32D,EAAI,IAC/BsS,EAAIkzB,MAAQ0pB,EAAM1pB,KACL,aAAT+wB,IAAwBG,EAAQE,EAAMtkD,EAAKrS,KAAOqpC,GACpDqtB,EAAUhqB,MACVrD,EAAOotB,IAEPpkD,EAAIkzB,MAAQlzB,EAAIq6B,MAAMnH,KACtBjgC,EAAS+M,EAAKrS,EAAG4f,GAAM,GACvB5f,EAAI1B,KAAKiS,IAAIqP,EAAK0B,GAAI1B,EAAK2B,IAC3BlP,EAAI5H,OAAS4H,EAAIkzB,KAAO,EACxB8D,EAAOz1B,KAGPvB,EAAI5H,SACNnF,EAAS+M,EAAKrS,EAAG4f,GAAM,GACvBvN,EAAI5H,OAAS4H,EAAIkzB,KAAO,GAE1B8d,EAAStvC,QAAQyiD,IAGrB,SAASI,EAASxoD,GAChB,IAAIi1C,EAAWj1C,EAAKi1C,SACpB,GAAIA,GAAYA,EAAS54C,OAAQ,CAC/B,IAAoDwkD,EAAhDrvC,EAAOw2C,EAAIhoD,GAAOsoD,EAAYrT,EAASt1C,QAAgBsE,EAAM,GAGjE,IAFAnV,EAAMw5D,EAAW92C,EAAK0B,GAAK1B,EAAK2B,GAAKnT,EAAKvQ,OAC1CwU,EAAIkzB,KAAO,EACJ0pB,EAAQyH,EAAUhqB,OACvBr6B,EAAI9L,KAAK0oD,GACT58C,EAAIkzB,MAAQ0pB,EAAM1pB,KACH,MAAX0pB,EAAM/pD,IACRI,EAAS+M,EAAK48C,EAAM/pD,EAAI0a,EAAK0B,GAAK1B,EAAK2B,GAAI3B,GAAO82C,EAAUjsD,QAC5D4H,EAAI5H,OAAS4H,EAAIkzB,KAAO,GAG5B8d,EAAStvC,QAAQ6iD,IAGrB,SAASD,EAAMtkD,EAAKrS,GAElB,IADA,IAAkBE,EAAdgI,EAAImK,EAAIkzB,KAASsxB,EAAO,EAAGC,EAAOljD,IAAUxV,GAAK,EAAG2B,EAAIsS,EAAI5H,SACvDrM,EAAI2B,IACLG,EAAImS,EAAIjU,GAAGmnC,QACbrlC,EAAI42D,IAAMA,EAAO52D,GACjBA,EAAI22D,IAAMA,EAAO32D,IAIvB,OADAF,GAAKA,GADLkI,GAAKA,GAEM5J,KAAK4C,IAAIlB,EAAI62D,EAAON,EAAQruD,EAAGA,GAAKlI,EAAI82D,EAAOP,IAAU3iD,IAEtE,SAAStO,EAAS+M,EAAKrS,EAAG4f,EAAMgZ,GAC9B,IAAqF34B,EAAjF7B,GAAK,EAAG2B,EAAIsS,EAAI5H,OAAQhK,EAAImf,EAAKnf,EAAGf,EAAIkgB,EAAKlgB,EAAGrB,EAAI2B,EAAIzB,EAAM8T,EAAIkzB,KAAOvlC,GAAK,EAClF,GAAIA,GAAK4f,EAAK0B,GAAI,CAEhB,KADIsX,GAASv6B,EAAIuhB,EAAK2B,MAAIljB,EAAIuhB,EAAK2B,MAC1BnjB,EAAI2B,IACXE,EAAIoS,EAAIjU,IACNqC,EAAIA,EACNR,EAAEP,EAAIA,EACNO,EAAEshB,GAAKljB,EACPoC,GAAKR,EAAEqhB,GAAKhjB,KAAKiS,IAAIqP,EAAKnf,EAAImf,EAAK0B,GAAK7gB,EAAGpC,EAAIE,EAAM0B,EAAEslC,KAAOlnC,GAAK,GAErE4B,EAAEiF,GAAI,EACNjF,EAAEqhB,IAAM1B,EAAKnf,EAAImf,EAAK0B,GAAK7gB,EAC3Bmf,EAAKlgB,GAAKrB,EACVuhB,EAAK2B,IAAMljB,MACN,CAEL,KADIu6B,GAASv6B,EAAIuhB,EAAK0B,MAAIjjB,EAAIuhB,EAAK0B,MAC1BljB,EAAI2B,IACXE,EAAIoS,EAAIjU,IACNqC,EAAIA,EACNR,EAAEP,EAAIA,EACNO,EAAEqhB,GAAKjjB,EACPqB,GAAKO,EAAEshB,GAAKjjB,KAAKiS,IAAIqP,EAAKlgB,EAAIkgB,EAAK2B,GAAK7hB,EAAGrB,EAAIE,EAAM0B,EAAEslC,KAAOlnC,GAAK,GAErE4B,EAAEiF,GAAI,EACNjF,EAAEshB,IAAM3B,EAAKlgB,EAAIkgB,EAAK2B,GAAK7hB,EAC3BkgB,EAAKnf,GAAKpC,EACVuhB,EAAK0B,IAAMjjB,GAGf,SAAS63D,EAAQp4D,GACf,IAAI+f,EAAQs4C,GAAY1H,EAAU3wD,GAAIylD,EAAO1lC,EAAM,GAOnD,OANA0lC,EAAK9iD,EAAI8iD,EAAK7jD,EAAI,EACd6jD,EAAK1lD,OAAO0lD,EAAKjiC,GAAK9M,EAAK,GAAI+uC,EAAKhiC,GAAK/M,EAAK,IAAS+uC,EAAKjiC,GAAKiiC,EAAKhiC,GAAK,EAC3E40C,GAAU1H,EAAUW,QAAQ7L,GAChCrmD,EAAM,CAAEqmD,GAAQA,EAAKjiC,GAAKiiC,EAAKhiC,GAAKgiC,EAAK1lD,QACxCs4D,EAAWS,EAAWJ,GAAUjT,GAC7B8S,IAAQF,EAAWt4C,GAChBA,EA0CT,OAxCAq4C,EAAQ1hD,KAAO,SAAS/T,GACtB,OAAKwI,UAAUwB,QACf+J,EAAO/T,EACAy1D,GAFuB1hD,GAIhC0hD,EAAQ7zD,QAAU,SAAS5B,GACzB,IAAKwI,UAAUwB,OAAQ,OAAOpI,EAC9B,SAAS00D,EAAY3oD,GACnB,IAAIjO,EAAIM,EAAEiN,KAAKwoD,EAAS9nD,EAAMA,EAAKsH,OACnC,OAAY,MAALvV,EAAY8yD,GAAyB7kD,GAAQ8kD,GAAqB9kD,EAAmB,iBAANjO,EAAiB,CAAEA,EAAGA,EAAGA,EAAGA,GAAMA,GAE1H,SAAS62D,EAAY5oD,GACnB,OAAO8kD,GAAqB9kD,EAAM3N,GAEpC,IAAIgD,EAGJ,OAFA2yD,EAAuB,OAAhB/zD,EAAU5B,GAAawyD,GAAiD,aAArBxvD,SAAchD,GAAoBs2D,EAAuB,WAATtzD,GAAqBhD,EAAI,CAAEA,EAAGA,EAAGA,EAAGA,GAC9Iu2D,GAAeA,EACRd,GAETA,EAAQ33D,MAAQ,SAASkC,GACvB,OAAKwI,UAAUwB,QACflM,EAAQkC,EAAInC,KAAKC,MAAQ+wD,OAClB4G,GAFuB33D,GAAS+wD,QAIzC4G,EAAQG,OAAS,SAAS51D,GACxB,OAAKwI,UAAUwB,QACf4rD,EAAS51D,EACT01D,EAAW,KACJD,GAHuBG,GAKhCH,EAAQK,MAAQ,SAAS91D,GACvB,OAAKwI,UAAUwB,QACf8rD,EAAQ91D,EACDy1D,GAFuBK,GAIhCL,EAAQI,KAAO,SAAS71D,GACtB,OAAKwI,UAAUwB,QACf6rD,EAAO71D,EAAI,GACJy1D,GAFuBI,GAIzB9H,GAA0B0H,EAASzH,IA2B5C1xD,EAAG8U,OAAS,CACVg3B,OAAQ,SAASouB,EAAGC,GAClB,IAAIn3D,EAAIkJ,UAAUwB,OAGlB,OAFI1K,EAAI,IAAGm3D,EAAI,GACXn3D,EAAI,IAAGk3D,EAAI,GACR,WACL,IAAIx2D,EAAGf,EAAGQ,EACV,GAGEA,GAFAO,EAAoB,EAAhBnC,KAAKuT,SAAe,GAEhBpR,GADRf,EAAoB,EAAhBpB,KAAKuT,SAAe,GACRnS,SACRQ,GAAKA,EAAI,GACnB,OAAO+2D,EAAIC,EAAIz2D,EAAInC,KAAK6S,MAAM,EAAI7S,KAAKklB,IAAItjB,GAAKA,KAGpDi3D,UAAW,WACT,IAAItlD,EAAS9U,EAAG8U,OAAOg3B,OAAO7/B,MAAMjM,EAAIkM,WACxC,OAAO,WACL,OAAO3K,KAAKmkB,IAAI5Q,OAGpBulD,MAAO,SAASnvD,GACd,IAAI4J,EAAS9U,EAAG8U,OAAOwlD,UAAUpvD,GACjC,OAAO,WACL,OAAO4J,IAAW5J,IAGtBovD,UAAW,SAASpvD,GAClB,OAAO,WACL,IAAK,IAAIC,EAAI,EAAG7H,EAAI,EAAGA,EAAI4H,EAAG5H,IAAK6H,GAAK5J,KAAKuT,SAC7C,OAAO3J,KAIbnL,EAAGG,MAAQ,GAkCX,IAAIy2D,GAAwB,CAC1B7iD,MAAO6D,EACP4S,KAAM5S,GAER,SAAS2iD,GAAoBxxC,EAAQtS,EAAO+/C,EAAelpB,GACzD,IAAIrqC,EAAI,GAAI5B,EAAI,GAAIiC,EAAI,EAAGP,EAAIxB,KAAKiS,IAAIuV,EAAOrb,OAAQ+I,EAAM/I,QAAU,EAKvE,IAJIqb,EAAOhmB,GAAKgmB,EAAO,KACrBA,EAASA,EAAO/X,QAAQ2rB,UACxBlmB,EAAQA,EAAMzF,QAAQ2rB,aAEfr5B,GAAKP,GACZE,EAAEuG,KAAKgtD,EAAcztC,EAAOzlB,EAAI,GAAIylB,EAAOzlB,KAC3CjC,EAAEmI,KAAK8jC,EAAY72B,EAAMnT,EAAI,GAAImT,EAAMnT,KAEzC,OAAO,SAASI,GACd,IAAIJ,EAAItD,EAAGwU,OAAOuU,EAAQrlB,EAAG,EAAGX,GAAK,EACrC,OAAO1B,EAAEiC,GAAGL,EAAEK,GAAGI,KA0DrB,SAAS82D,GAAsBr6D,EAAOupD,GACpC,OAAO1pD,EAAGmZ,OAAOhZ,EAAOupD,EAAQ,QAAS,aAAc,cAAe,SAExE,SAAS+Q,GAAoB1xC,EAAQ7d,GAGnC,OAFAurD,GAAc1tC,EAAQ4tC,GAAkB+D,GAAyB3xC,EAAQ7d,GAAG,KAC5EurD,GAAc1tC,EAAQ4tC,GAAkB+D,GAAyB3xC,EAAQ7d,GAAG,KACrE6d,EAET,SAAS2xC,GAAyB3xC,EAAQ7d,GAC/B,MAALA,IAAWA,EAAI,IACnB,IAAIuI,EAAS2iD,GAAertC,GAAS4xC,EAAOlnD,EAAO,GAAKA,EAAO,GAAImD,EAAOrV,KAAKqnB,IAAI,GAAIrnB,KAAKwS,MAAMxS,KAAKklB,IAAIk0C,EAAOzvD,GAAK3J,KAAKq6B,OAAQg/B,EAAM1vD,EAAIyvD,EAAO/jD,EAKrJ,OAJIgkD,GAAO,IAAKhkD,GAAQ,GAAagkD,GAAO,IAAKhkD,GAAQ,EAAYgkD,GAAO,MAAKhkD,GAAQ,GACzFnD,EAAO,GAAKlS,KAAKipB,KAAK/W,EAAO,GAAKmD,GAAQA,EAC1CnD,EAAO,GAAKlS,KAAKwS,MAAMN,EAAO,GAAKmD,GAAQA,EAAc,GAAPA,EAClDnD,EAAO,GAAKmD,EACLnD,EAET,SAASonD,GAAqB9xC,EAAQ7d,GACpC,OAAOlL,EAAGyW,MAAMxK,MAAMjM,EAAI06D,GAAyB3xC,EAAQ7d,IAE7D,SAAS4vD,GAA0B/xC,EAAQ7d,EAAGoiB,GAC5C,IAAI7W,EAAQikD,GAAyB3xC,EAAQ7d,GAC7C,GAAIoiB,EAAQ,CACV,IAAI1M,EAAQic,GAAatP,KAAKD,GAE9B,GADA1M,EAAMgvB,QACW,MAAbhvB,EAAM,GAAY,CACpB,IAAIrC,EAASve,EAAG29B,aAAap8B,KAAK4C,IAAI2R,EAAIW,EAAM,IAAKX,EAAIW,EAAM,MAI/D,OAHKmK,EAAM,KAAIA,EAAM,GAAK,IAAMm6C,GAAyBx8C,EAAOpe,MAAMsW,EAAM,MAC5EmK,EAAM,GAAK,IACX0M,EAASttB,EAAGstB,OAAO1M,EAAM6Y,KAAK,KACvB,SAAS14B,GACd,OAAOusB,EAAO/O,EAAOpe,MAAMY,IAAMwd,EAAOxX,QAGvC6Z,EAAM,KAAIA,EAAM,GAAK,IAiB9B,SAAwCla,EAAM+P,GAC5C,IAAIrT,EAAI23D,GAAyBtkD,EAAM,IACvC,OAAO/P,KAAQs0D,GAAmCz5D,KAAKuU,IAAI1S,EAAI23D,GAAyBx5D,KAAK4C,IAAI2R,EAAIW,EAAM,IAAKX,EAAIW,EAAM,UAAoB,MAAT/P,GAAgBtD,EAAqB,GAAP,MAATsD,GAnBxHu0D,CAA+Br6C,EAAM,GAAInK,IACzE6W,EAAS1M,EAAM6Y,KAAK,SAEpBnM,EAAS,KAAOytC,GAAyBtkD,EAAM,IAAM,IAEvD,OAAOzW,EAAGstB,OAAOA,GA9FnBttB,EAAGG,MAAMupD,OAAS,WAChB,OAEF,SAASwR,EAAgBnyC,EAAQtS,EAAO62B,EAAa6tB,GACnD,IAAIjnB,EAAQ4L,EACZ,SAASh3B,IACP,IAAI4gC,EAASnoD,KAAKiS,IAAIuV,EAAOrb,OAAQ+I,EAAM/I,QAAU,EAAI6sD,GAAsBhE,GAAmBC,EAAgB2E,EAAQ7N,GAAwBD,GAGlJ,OAFAnZ,EAASwV,EAAO3gC,EAAQtS,EAAO+/C,EAAelpB,GAC9CwS,EAAQ4J,EAAOjzC,EAAOsS,EAAQytC,EAAejP,IACtCpnD,EAET,SAASA,EAAMuD,GACb,OAAOwwC,EAAOxwC,GAyChB,OAvCAvD,EAAM6oB,OAAS,SAASrmB,GACtB,OAAOm9C,EAAMn9C,IAEfxC,EAAM4oB,OAAS,SAASrlB,GACtB,OAAKwI,UAAUwB,QACfqb,EAASrlB,EAAE+R,IAAI88C,QACRzpC,KAFuBC,GAIhC5oB,EAAMsW,MAAQ,SAAS/S,GACrB,OAAKwI,UAAUwB,QACf+I,EAAQ/S,EACDolB,KAFuBrS,GAIhCtW,EAAMi7D,WAAa,SAAS13D,GAC1B,OAAOvD,EAAMsW,MAAM/S,GAAG4pC,YAAYwd,KAEpC3qD,EAAMg7D,MAAQ,SAASz3D,GACrB,OAAKwI,UAAUwB,QACfytD,EAAQz3D,EACDolB,KAFuBqyC,GAIhCh7D,EAAMmtC,YAAc,SAAS5pC,GAC3B,OAAKwI,UAAUwB,QACf4/B,EAAc5pC,EACPolB,KAFuBwkB,GAIhCntC,EAAMk7D,MAAQ,SAASnwD,GACrB,OAAO2vD,GAAqB9xC,EAAQ7d,IAEtC/K,EAAMm7D,WAAa,SAASpwD,EAAGoiB,GAC7B,OAAOwtC,GAA0B/xC,EAAQ7d,EAAGoiB,IAE9CntB,EAAMu2D,KAAO,SAASxrD,GAEpB,OADAuvD,GAAoB1xC,EAAQ7d,GACrB4d,KAET3oB,EAAM+qB,KAAO,WACX,OAAOgwC,EAAgBnyC,EAAQtS,EAAO62B,EAAa6tB,IAE9CryC,IApDAoyC,CAAgB,CAAE,EAAG,GAAK,CAAE,EAAG,GAAK3T,IAAgB,IA+F7D,IAAIyT,GAAmC,CACrC7vD,EAAG,EACHhJ,EAAG,EACHiB,EAAG,EACHD,EAAG,EACH4H,EAAG,GAEL,SAASgwD,GAAyBj6D,GAChC,OAAQS,KAAKwS,MAAMxS,KAAKklB,IAAI3lB,GAASS,KAAKq6B,KAAO,KAMnD57B,EAAGG,MAAMsmB,IAAM,WACb,OAEF,SAAS80C,EAAa7R,EAAQ8R,EAAMC,EAAU1yC,GAC5C,SAAStC,EAAI/iB,GACX,OAAQ+3D,EAAWl6D,KAAKklB,IAAI/iB,EAAI,EAAI,EAAIA,IAAMnC,KAAKklB,IAAI/iB,EAAI,EAAI,GAAKA,IAAMnC,KAAKklB,IAAI+0C,GAErF,SAAS5yC,EAAIllB,GACX,OAAO+3D,EAAWl6D,KAAKqnB,IAAI4yC,EAAM93D,IAAMnC,KAAKqnB,IAAI4yC,GAAO93D,GAEzD,SAASvD,EAAMuD,GACb,OAAOgmD,EAAOjjC,EAAI/iB,IAoDpB,OAlDAvD,EAAM6oB,OAAS,SAAStlB,GACtB,OAAOklB,EAAI8gC,EAAO1gC,OAAOtlB,KAE3BvD,EAAM4oB,OAAS,SAASrlB,GACtB,OAAKwI,UAAUwB,QACf+tD,EAAW/3D,EAAE,IAAM,EACnBgmD,EAAO3gC,QAAQA,EAASrlB,EAAE+R,IAAI88C,SAAS98C,IAAIgR,IACpCtmB,GAHuB4oB,GAKhC5oB,EAAMq7D,KAAO,SAASjlD,GACpB,OAAKrK,UAAUwB,QACf8tD,GAAQjlD,EACRmzC,EAAO3gC,OAAOA,EAAOtT,IAAIgR,IAClBtmB,GAHuBq7D,GAKhCr7D,EAAMu2D,KAAO,WACX,IAAIgF,EAAQjF,GAAc1tC,EAAOtT,IAAIgR,GAAMg1C,EAAWl6D,KAAOo6D,IAG7D,OAFAjS,EAAO3gC,OAAO2yC,GACd3yC,EAAS2yC,EAAMjmD,IAAImT,GACZzoB,GAETA,EAAMk7D,MAAQ,WACZ,IAAI5nD,EAAS2iD,GAAertC,GAASsyC,EAAQ,GAAIp4D,EAAIwQ,EAAO,GAAInS,EAAImS,EAAO,GAAIpS,EAAIE,KAAKwS,MAAM0S,EAAIxjB,IAAKK,EAAI/B,KAAKipB,KAAK/D,EAAInlB,IAAK0B,EAAIw4D,EAAO,EAAI,EAAIA,EACjJ,GAAIhgC,SAASl4B,EAAIjC,GAAI,CACnB,GAAIo6D,EAAU,CACZ,KAAMp6D,EAAIiC,EAAGjC,IAAK,IAAK,IAAI0B,EAAI,EAAGA,EAAIC,EAAGD,IAAKs4D,EAAM7xD,KAAKof,EAAIvnB,GAAK0B,GAClEs4D,EAAM7xD,KAAKof,EAAIvnB,SAGf,IADAg6D,EAAM7xD,KAAKof,EAAIvnB,IACTA,IAAMiC,GAAK,IAASP,EAAIC,EAAI,EAAGD,EAAI,EAAGA,IAAKs4D,EAAM7xD,KAAKof,EAAIvnB,GAAK0B,GAEvE,IAAK1B,EAAI,EAAGg6D,EAAMh6D,GAAK4B,EAAG5B,KAC1B,IAAKiC,EAAI+3D,EAAM3tD,OAAQ2tD,EAAM/3D,EAAI,GAAKhC,EAAGgC,KACzC+3D,EAAQA,EAAMrqD,MAAM3P,EAAGiC,GAEzB,OAAO+3D,GAETl7D,EAAMm7D,WAAa,SAASt4D,EAAGsqB,GAC7B,IAAKphB,UAAUwB,OAAQ,OAAOkuD,GAC1B1vD,UAAUwB,OAAS,EAAG4f,EAASsuC,GAA+C,mBAAXtuC,IAAuBA,EAASttB,EAAGstB,OAAOA,IACjH,IAAIvqB,EAAIxB,KAAK4C,IAAI,EAAGq3D,EAAOx4D,EAAI7C,EAAMk7D,QAAQ3tD,QAC7C,OAAO,SAAS3M,GACd,IAAIM,EAAIN,EAAI6nB,EAAIrnB,KAAKC,MAAMilB,EAAI1lB,KAE/B,OADIM,EAAIm6D,EAAOA,EAAO,KAAIn6D,GAAKm6D,GACxBn6D,GAAK0B,EAAIuqB,EAAOvsB,GAAK,KAGhCZ,EAAM+qB,KAAO,WACX,OAAOqwC,EAAa7R,EAAOx+B,OAAQswC,EAAMC,EAAU1yC,IAE9CyxC,GAAsBr6D,EAAOupD,GA9D7B6R,CAAav7D,EAAGG,MAAMupD,SAAS3gC,OAAO,CAAE,EAAG,IAAM,IAAI,EAAM,CAAE,EAAG,MAgEzE,IAAI6yC,GAAqB57D,EAAGstB,OAAO,OAAQquC,GAA2B,CACpE5nD,MAAO,SAASrQ,GACd,OAAQnC,KAAKipB,MAAM9mB,IAErB8mB,KAAM,SAAS9mB,GACb,OAAQnC,KAAKwS,OAAOrQ,KAwCxB,SAASm4D,GAAgB9wD,GACvB,OAAO,SAASrH,GACd,OAAOA,EAAI,GAAKnC,KAAKqnB,KAAKllB,EAAGqH,GAAKxJ,KAAKqnB,IAAIllB,EAAGqH,IAvClD/K,EAAGG,MAAMyoB,IAAM,WACb,OAEF,SAASkzC,EAAapS,EAAQtsB,EAAUrU,GACtC,IAAIgzC,EAAOF,GAAgBz+B,GAAW4+B,EAAOH,GAAgB,EAAIz+B,GACjE,SAASj9B,EAAMuD,GACb,OAAOgmD,EAAOqS,EAAKr4D,IA6BrB,OA3BAvD,EAAM6oB,OAAS,SAAStlB,GACtB,OAAOs4D,EAAKtS,EAAO1gC,OAAOtlB,KAE5BvD,EAAM4oB,OAAS,SAASrlB,GACtB,OAAKwI,UAAUwB,QACfg8C,EAAO3gC,QAAQA,EAASrlB,EAAE+R,IAAI88C,SAAS98C,IAAIsmD,IACpC57D,GAFuB4oB,GAIhC5oB,EAAMk7D,MAAQ,SAASnwD,GACrB,OAAO2vD,GAAqB9xC,EAAQ7d,IAEtC/K,EAAMm7D,WAAa,SAASpwD,EAAGoiB,GAC7B,OAAOwtC,GAA0B/xC,EAAQ7d,EAAGoiB,IAE9CntB,EAAMu2D,KAAO,SAASxrD,GACpB,OAAO/K,EAAM4oB,OAAO0xC,GAAoB1xC,EAAQ7d,KAElD/K,EAAMi9B,SAAW,SAAS15B,GACxB,OAAKwI,UAAUwB,QACfquD,EAAOF,GAAgBz+B,EAAW15B,GAClCs4D,EAAOH,GAAgB,EAAIz+B,GAC3BssB,EAAO3gC,OAAOA,EAAOtT,IAAIsmD,IAClB57D,GAJuBi9B,GAMhCj9B,EAAM+qB,KAAO,WACX,OAAO4wC,EAAapS,EAAOx+B,OAAQkS,EAAUrU,IAExCyxC,GAAsBr6D,EAAOupD,GAlC7BoS,CAAa97D,EAAGG,MAAMupD,SAAU,EAAG,CAAE,EAAG,KAyCjD1pD,EAAGG,MAAMiU,KAAO,WACd,OAAOpU,EAAGG,MAAMyoB,MAAMwU,SAAS,KAEjCp9B,EAAGG,MAAM87D,QAAU,WACjB,OAKF,SAASC,EAAiBnzC,EAAQiuC,GAChC,IAAIz0D,EAAOkU,EAAO0lD,EAClB,SAASh8D,EAAMuD,GACb,OAAO+S,IAAQlU,EAAMkO,IAAI/M,KAAoB,UAAbszD,EAAOn0D,EAAgBN,EAAM0U,IAAIvT,EAAGqlB,EAAOvf,KAAK9F,IAAMmP,MAAQ,GAAK4D,EAAM/I,QAE3G,SAAS0uD,EAAM1lD,EAAOE,GACpB,OAAO5W,EAAGyW,MAAMsS,EAAOrb,QAAQ+H,KAAI,SAASpU,GAC1C,OAAOqV,EAAQE,EAAOvV,KAgF1B,OA7EAlB,EAAM4oB,OAAS,SAASrlB,GACtB,IAAKwI,UAAUwB,OAAQ,OAAOqb,EAC9BA,EAAS,GACTxmB,EAAQ,IAAI+T,EAEZ,IADA,IAA0B+lD,EAAtBh7D,GAAK,EAAG2B,EAAIU,EAAEgK,SACTrM,EAAI2B,GAAQT,EAAM6V,IAAIikD,EAAK34D,EAAErC,KAAKkB,EAAM0U,IAAIolD,EAAItzC,EAAOvf,KAAK6yD,IACrE,OAAOl8D,EAAM62D,EAAOn0D,GAAGoJ,MAAM9L,EAAO62D,EAAOvvD,IAE7CtH,EAAMsW,MAAQ,SAAS/S,GACrB,OAAKwI,UAAUwB,QACf+I,EAAQ/S,EACRy4D,EAAY,EACZnF,EAAS,CACPn0D,EAAG,QACH4E,EAAGyE,WAEE/L,GAPuBsW,GAShCtW,EAAMm8D,YAAc,SAAS54D,EAAG4B,GAC1B4G,UAAUwB,OAAS,IAAGpI,EAAU,GACpC,IAAIoR,EAAQhT,EAAE,GAAIiT,EAAOjT,EAAE,GAAIkT,EAAOmS,EAAOrb,OAAS,GAAKgJ,GAASA,EAAQC,GAAQ,EACpF,IAAMA,EAAOD,IAAUqS,EAAOrb,OAAS,EAAIpI,GAO3C,OANAmR,EAAQ2lD,EAAM1lD,EAAQE,EAAOtR,EAAU,EAAGsR,GAC1CulD,EAAY,EACZnF,EAAS,CACPn0D,EAAG,cACH4E,EAAGyE,WAEE/L,GAETA,EAAMo8D,iBAAmB,SAAS74D,EAAG4B,GAC/B4G,UAAUwB,OAAS,IAAGpI,EAAU,GACpC,IAAIoR,EAAQhT,EAAE,GAAIiT,EAAOjT,EAAE,GAAIkT,EAAOmS,EAAOrb,OAAS,GAAKgJ,EAAQC,EAAOpV,KAAKC,OAAOkV,EAAQC,GAAQ,GACtG,IAAMA,EAAOD,IAAUqS,EAAOrb,OAAS,EAAIpI,GAAW,EAOtD,OANAmR,EAAQ2lD,EAAM1lD,EAAQnV,KAAKC,MAAMoV,EAAOtR,EAAU,GAAKqR,EAAOD,GAASqS,EAAOrb,OAAS,EAAIpI,GAAWsR,GAAQ,GAAIA,GAClHulD,EAAY,EACZnF,EAAS,CACPn0D,EAAG,mBACH4E,EAAGyE,WAEE/L,GAETA,EAAMq8D,WAAa,SAAS94D,EAAG4B,EAASm3D,GAClCvwD,UAAUwB,OAAS,IAAGpI,EAAU,GAChC4G,UAAUwB,OAAS,IAAG+uD,EAAen3D,GACzC,IAAIq3B,EAAUj5B,EAAE,GAAKA,EAAE,GAAIgT,EAAQhT,EAAEi5B,EAAU,GAAIhmB,EAAOjT,EAAE,EAAIi5B,GAAU/lB,GAAQD,EAAOD,IAAUqS,EAAOrb,OAASpI,EAAU,EAAIm3D,GAQjI,OAPAhmD,EAAQ2lD,EAAM1lD,EAAQE,EAAO6lD,EAAc7lD,GACvC+lB,GAASlmB,EAAMkmB,UACnBw/B,EAAYvlD,GAAQ,EAAItR,GACxB0xD,EAAS,CACPn0D,EAAG,aACH4E,EAAGyE,WAEE/L,GAETA,EAAMu8D,gBAAkB,SAASh5D,EAAG4B,EAASm3D,GACvCvwD,UAAUwB,OAAS,IAAGpI,EAAU,GAChC4G,UAAUwB,OAAS,IAAG+uD,EAAen3D,GACzC,IAAIq3B,EAAUj5B,EAAE,GAAKA,EAAE,GAAIgT,EAAQhT,EAAEi5B,EAAU,GAAIhmB,EAAOjT,EAAE,EAAIi5B,GAAU/lB,EAAOrV,KAAKwS,OAAO4C,EAAOD,IAAUqS,EAAOrb,OAASpI,EAAU,EAAIm3D,IAQ5I,OAPAhmD,EAAQ2lD,EAAM1lD,EAAQnV,KAAKC,OAAOmV,EAAOD,GAASqS,EAAOrb,OAASpI,GAAWsR,GAAQ,GAAIA,GACrF+lB,GAASlmB,EAAMkmB,UACnBw/B,EAAY56D,KAAKC,MAAMoV,GAAQ,EAAItR,IACnC0xD,EAAS,CACPn0D,EAAG,kBACH4E,EAAGyE,WAEE/L,GAETA,EAAMg8D,UAAY,WAChB,OAAOA,GAETh8D,EAAMm2D,YAAc,WAClB,OAAOF,GAAeY,EAAOvvD,EAAE,KAEjCtH,EAAM+qB,KAAO,WACX,OAAOgxC,EAAiBnzC,EAAQiuC,IAE3B72D,EAAM4oB,OAAOA,GA5FbmzC,CAAiB,GAAI,CAC1Br5D,EAAG,QACH4E,EAAG,CAAE,OA4FTzH,EAAGG,MAAMw8D,WAAa,WACpB,OAAO38D,EAAGG,MAAM87D,UAAUxlD,MAAMmmD,KAElC58D,EAAGG,MAAM08D,WAAa,WACpB,OAAO78D,EAAGG,MAAM87D,UAAUxlD,MAAMqmD,KAElC98D,EAAGG,MAAM48D,YAAc,WACrB,OAAO/8D,EAAGG,MAAM87D,UAAUxlD,MAAMumD,KAElCh9D,EAAGG,MAAMC,YAAc,WACrB,OAAOJ,EAAGG,MAAM87D,UAAUxlD,MAAMwmD,KAElC,IAAIL,GAAgB,CAAE,QAAS,SAAU,QAAS,SAAU,QAAS,QAAS,SAAU,QAAS,SAAU,SAAUnnD,IAAI0X,IACrH2vC,GAAgB,CAAE,QAAS,SAAU,SAAU,SAAU,QAAS,SAAU,SAAU,SAAU,QAAS,SAAU,QAAS,SAAU,SAAU,SAAU,QAAS,SAAU,SAAU,SAAU,QAAS,UAAWrnD,IAAI0X,IACzN6vC,GAAiB,CAAE,QAAS,QAAS,QAAS,SAAU,QAAS,QAAS,SAAU,SAAU,QAAS,SAAU,SAAU,SAAU,QAAS,SAAU,SAAU,SAAU,QAAS,SAAU,SAAU,UAAWvnD,IAAI0X,IACxN8vC,GAAiB,CAAE,QAAS,QAAS,SAAU,SAAU,SAAU,SAAU,SAAU,SAAU,QAAS,QAAS,SAAU,SAAU,QAAS,SAAU,SAAU,SAAU,QAAS,QAAS,SAAU,UAAWxnD,IAAI0X,IA0H7N,SAAS+vC,KACP,OAAO,EA1HTl9D,EAAGG,MAAMyT,SAAW,WAClB,OAEF,SAASupD,EAAkBp0C,EAAQtS,GACjC,IAAI2gD,EACJ,SAAStuC,IACP,IAAI/lB,EAAI,EAAGiI,EAAIyL,EAAM/I,OAErB,IADA0pD,EAAa,KACJr0D,EAAIiI,GAAGosD,EAAWr0D,EAAI,GAAK/C,EAAG4T,SAASmV,EAAQhmB,EAAIiI,GAC5D,OAAO7K,EAET,SAASA,EAAMuD,GACb,IAAKsP,MAAMtP,GAAKA,GAAI,OAAO+S,EAAMzW,EAAGwU,OAAO4iD,EAAY1zD,IAsBzD,OApBAvD,EAAM4oB,OAAS,SAASrlB,GACtB,OAAKwI,UAAUwB,QACfqb,EAASrlB,EAAE+R,IAAI3C,GAAW+M,OAAO9M,GAAYlS,KAAK+R,GAC3CkW,KAFuBC,GAIhC5oB,EAAMsW,MAAQ,SAAS/S,GACrB,OAAKwI,UAAUwB,QACf+I,EAAQ/S,EACDolB,KAFuBrS,GAIhCtW,EAAMi9D,UAAY,WAChB,OAAOhG,GAETj3D,EAAMk9D,aAAe,SAAS16D,GAE5B,OADAA,EAAI8T,EAAMmD,QAAQjX,IACP,EAAI,CAAEkQ,IAAKA,KAAQ,CAAElQ,EAAI,EAAIy0D,EAAWz0D,EAAI,GAAKomB,EAAO,GAAIpmB,EAAIy0D,EAAW1pD,OAAS0pD,EAAWz0D,GAAKomB,EAAOA,EAAOrb,OAAS,KAExIvN,EAAM+qB,KAAO,WACX,OAAOiyC,EAAkBp0C,EAAQtS,IAE5BqS,IAjCAq0C,CAAkB,GAAI,KAmC/Bn9D,EAAGG,MAAMm9D,SAAW,WAClB,OAEF,SAASC,EAAkB/1C,EAAIC,EAAIhR,GACjC,IAAIu0C,EAAI3pD,EACR,SAASlB,EAAMuD,GACb,OAAO+S,EAAMlV,KAAK4C,IAAI,EAAG5C,KAAKiS,IAAInS,EAAGE,KAAKwS,MAAMi3C,GAAMtnD,EAAI8jB,OAE5D,SAASsB,IAGP,OAFAkiC,EAAKv0C,EAAM/I,QAAU+Z,EAAKD,GAC1BnmB,EAAIoV,EAAM/I,OAAS,EACZvN,EAqBT,OAnBAA,EAAM4oB,OAAS,SAASrlB,GACtB,OAAKwI,UAAUwB,QACf8Z,GAAM9jB,EAAE,GACR+jB,GAAM/jB,EAAEA,EAAEgK,OAAS,GACZob,KAHuB,CAAEtB,EAAIC,IAKtCtnB,EAAMsW,MAAQ,SAAS/S,GACrB,OAAKwI,UAAUwB,QACf+I,EAAQ/S,EACDolB,KAFuBrS,GAIhCtW,EAAMk9D,aAAe,SAAS16D,GAG5B,MAAO,CADPA,GADAA,EAAI8T,EAAMmD,QAAQjX,IACV,EAAIkQ,IAAMlQ,EAAIqoD,EAAKxjC,EACf7kB,EAAI,EAAIqoD,IAEtB7qD,EAAM+qB,KAAO,WACX,OAAOqyC,EAAkB/1C,EAAIC,EAAIhR,IAE5BqS,IA/BAy0C,CAAkB,EAAG,EAAG,CAAE,EAAG,KAiCtCv9D,EAAGG,MAAMq9D,UAAY,WACnB,OAEF,SAASC,EAAmB10C,EAAQtS,GAClC,SAAStW,EAAMuD,GACb,GAAIA,GAAKA,EAAG,OAAO+S,EAAMzW,EAAGwU,OAAOuU,EAAQrlB,IAmB7C,OAjBAvD,EAAM4oB,OAAS,SAASxS,GACtB,OAAKrK,UAAUwB,QACfqb,EAASxS,EACFpW,GAFuB4oB,GAIhC5oB,EAAMsW,MAAQ,SAASF,GACrB,OAAKrK,UAAUwB,QACf+I,EAAQF,EACDpW,GAFuBsW,GAIhCtW,EAAMk9D,aAAe,SAAS16D,GAE5B,OADAA,EAAI8T,EAAMmD,QAAQjX,GACX,CAAEomB,EAAOpmB,EAAI,GAAIomB,EAAOpmB,KAEjCxC,EAAM+qB,KAAO,WACX,OAAOuyC,EAAmB10C,EAAQtS,IAE7BtW,EAvBAs9D,CAAmB,CAAE,IAAM,CAAE,EAAG,KAyBzCz9D,EAAGG,MAAMu9D,SAAW,WAClB,OAEF,SAASC,EAAkB50C,GACzB,SAAS20C,EAASh6D,GAChB,OAAQA,EAiBV,OAfAg6D,EAAS10C,OAAS00C,EAClBA,EAAS30C,OAAS20C,EAASjnD,MAAQ,SAAS/S,GAC1C,OAAKwI,UAAUwB,QACfqb,EAASrlB,EAAE+R,IAAIioD,GACRA,GAFuB30C,GAIhC20C,EAASrC,MAAQ,SAASnwD,GACxB,OAAO2vD,GAAqB9xC,EAAQ7d,IAEtCwyD,EAASpC,WAAa,SAASpwD,EAAGoiB,GAChC,OAAOwtC,GAA0B/xC,EAAQ7d,EAAGoiB,IAE9CowC,EAASxyC,KAAO,WACd,OAAOyyC,EAAkB50C,IAEpB20C,EArBAC,CAAkB,CAAE,EAAG,KAuBhC39D,EAAGM,IAAM,GAITN,EAAGM,IAAID,IAAM,WACX,IAAII,EAAcm9D,GAAuBr9D,EAAcs9D,GAAuBC,EAAeZ,GAASa,EAAYC,GAAgBxO,EAAayO,GAAsBxO,EAAWyO,GAAoBzL,EAAW0L,GAC/M,SAAS99D,IACP,IAAIwmB,EAAKtlB,KAAK4C,IAAI,GAAI1D,EAAYwL,MAAMvK,KAAMwK,YAAa4a,EAAKvlB,KAAK4C,IAAI,GAAI5D,EAAY0L,MAAMvK,KAAMwK,YAAawrC,EAAK8X,EAAWvjD,MAAMvK,KAAMwK,WAAa8Y,GAAOouB,EAAKqc,EAASxjD,MAAMvK,KAAMwK,WAAa8Y,GAAO0tC,EAAKnxD,KAAKuU,IAAIs9B,EAAKsE,GAAK0mB,EAAK1mB,EAAKtE,EAAK,EAAI,EAE3P,GADItsB,EAAKD,IAAIw3C,EAAKv3C,EAAIA,EAAKD,EAAIA,EAAKw3C,GAChC3L,GAAM3tC,GAAI,OAAOu5C,EAAcx3C,EAAIs3C,IAAOv3C,EAAKy3C,EAAcz3C,EAAI,EAAIu3C,GAAM,IAAM,IACrF,IAAIC,EAAI1tB,EAAI4tB,EAAIC,EAAoBh3C,EAAIE,EAAID,EAAIE,EAAImwB,EAAIC,EAAIuH,EAAIG,EAA5Cz5B,EAAK,EAAG7Q,EAAK,EAAmCglC,EAAO,GAO3E,IANIqkB,IAAO/L,EAASxmD,MAAMvK,KAAMwK,YAAc,GAAK,KACjDqyD,EAAKR,IAAcC,GAAiBz8D,KAAK6S,KAAKyS,EAAKA,EAAKC,EAAKA,IAAOi3C,EAAU9xD,MAAMvK,KAAMwK,WACrFkyD,IAAIjpD,IAAO,GACZ2R,IAAI3R,EAAKoQ,GAAQg5C,EAAKz3C,EAAKvlB,KAAKqkB,IAAI44C,KACpC33C,IAAIb,EAAKT,GAAQg5C,EAAK13C,EAAKtlB,KAAKqkB,IAAI44C,MAEtC13C,EAAI,CACNU,EAAKV,EAAKvlB,KAAKkrB,IAAIirB,EAAKviC,GACxBuS,EAAKZ,EAAKvlB,KAAKqkB,IAAI8xB,EAAKviC,GACxBsS,EAAKX,EAAKvlB,KAAKkrB,IAAI2mB,EAAKj+B,GACxBwS,EAAKb,EAAKvlB,KAAKqkB,IAAIwtB,EAAKj+B,GACxB,IAAIgV,EAAK5oB,KAAKuU,IAAIs9B,EAAKsE,EAAK,EAAIviC,IAAOyP,GAAI,EAAI,EAC/C,GAAIzP,GAAMspD,GAAgBj3C,EAAIE,EAAID,EAAIE,KAAQy2C,EAAKj0C,EAAI,CACrD,IAAIu0C,GAAMhnB,EAAKtE,GAAM,EACrB5rB,EAAKV,EAAKvlB,KAAKkrB,IAAIiyC,GACnBh3C,EAAKZ,EAAKvlB,KAAKqkB,IAAI84C,GACnBj3C,EAAKE,EAAK,WAGZH,EAAKE,EAAK,EAEZ,GAAIb,EAAI,CACNixB,EAAKjxB,EAAKtlB,KAAKkrB,IAAI2mB,EAAKptB,GACxB+xB,EAAKlxB,EAAKtlB,KAAKqkB,IAAIwtB,EAAKptB,GACxBs5B,EAAKz4B,EAAKtlB,KAAKkrB,IAAIirB,EAAK1xB,GACxBy5B,EAAK54B,EAAKtlB,KAAKqkB,IAAI8xB,EAAK1xB,GACxB,IAAIkE,EAAK3oB,KAAKuU,IAAI4hC,EAAKtE,EAAK,EAAIptB,IAAOpB,GAAI,EAAI,EAC/C,GAAIoB,GAAMy4C,GAAgB3mB,EAAIC,EAAIuH,EAAIG,KAAQ,EAAI2e,EAAKl0C,EAAI,CACzD,IAAIy0C,GAAMjnB,EAAKtE,GAAM,EACrB0E,EAAKjxB,EAAKtlB,KAAKkrB,IAAIkyC,GACnB5mB,EAAKlxB,EAAKtlB,KAAKqkB,IAAI+4C,GACnBrf,EAAKG,EAAK,WAGZ3H,EAAKC,EAAK,EAEZ,GAAI2a,EAAKhuC,KAAM25C,EAAK98D,KAAKiS,IAAIjS,KAAKuU,IAAIgR,EAAKD,GAAM,GAAIi3C,EAAa7xD,MAAMvK,KAAMwK,aAAe,KAAM,CACjGykC,EAAK9pB,EAAKC,EAAKs3C,EAAK,EAAI,EACxB,IAAIQ,EAAMP,EAAIQ,EAAMR,EACpB,GAAI3L,EAAK9tC,GAAG,CACV,IAAIk6C,EAAW,MAANxf,EAAa,CAAExH,EAAIC,GAAa,MAANtwB,EAAa,CAAED,EAAIE,GAAO23B,GAAyB,CAAE73B,EAAIE,GAAM,CAAE43B,EAAIG,GAAM,CAAEh4B,EAAIE,GAAM,CAAEmwB,EAAIC,IAAO1F,EAAK7qB,EAAKs3C,EAAG,GAAIxsB,EAAK5qB,EAAKo3C,EAAG,GAAI1c,EAAK36B,EAAKq3C,EAAG,GAAIzc,EAAK16B,EAAKm3C,EAAG,GAAIC,EAAK,EAAIx9D,KAAKqkB,IAAIrkB,KAAK+jB,MAAM+sB,EAAK+P,EAAK9P,EAAK+P,IAAO9gD,KAAK6S,KAAKi+B,EAAKA,EAAKC,EAAKA,GAAM/wC,KAAK6S,KAAKguC,EAAKA,EAAKC,EAAKA,KAAQ,GAAI2c,EAAKz9D,KAAK6S,KAAK0qD,EAAG,GAAKA,EAAG,GAAKA,EAAG,GAAKA,EAAG,IAC5WD,EAAMt9D,KAAKiS,IAAI6qD,GAAKx3C,EAAKm4C,IAAOD,EAAK,IACrCH,EAAMr9D,KAAKiS,IAAI6qD,GAAKv3C,EAAKk4C,IAAOD,EAAK,IAEvC,GAAU,MAANt3C,EAAY,CACd,IAAIw3C,EAAMC,GAA+B,MAAN5f,EAAa,CAAExH,EAAIC,GAAO,CAAEuH,EAAIG,GAAM,CAAEj4B,EAAIE,GAAMZ,EAAI83C,EAAKR,GAAKe,EAAMD,GAAyB,CAAEz3C,EAAIE,GAAM,CAAEmwB,EAAIC,GAAMjxB,EAAI83C,EAAKR,GAC/JC,IAAOO,EACTzkB,EAAK3wC,KAAK,IAAKy1D,EAAI,GAAI,IAAKL,EAAK,IAAKA,EAAK,QAASjuB,EAAI,IAAKsuB,EAAI,GAAI,IAAKn4C,EAAI,IAAKA,EAAI,MAAO,EAAIs3C,EAAKK,GAAgBQ,EAAI,GAAG,GAAIA,EAAI,GAAG,GAAIE,EAAI,GAAG,GAAIA,EAAI,GAAG,IAAK,IAAKf,EAAI,IAAKe,EAAI,GAAI,IAAKP,EAAK,IAAKA,EAAK,QAASjuB,EAAI,IAAKwuB,EAAI,IAEpOhlB,EAAK3wC,KAAK,IAAKy1D,EAAI,GAAI,IAAKL,EAAK,IAAKA,EAAK,QAASjuB,EAAI,IAAKwuB,EAAI,SAGnEhlB,EAAK3wC,KAAK,IAAKge,EAAI,IAAKE,GAE1B,GAAU,MAAN43B,EAAY,CACd,IAAI8f,EAAMF,GAAyB,CAAE13C,EAAIE,GAAM,CAAE43B,EAAIG,GAAM54B,GAAKg4C,EAAKT,GAAKiB,EAAMH,GAAyB,CAAEpnB,EAAIC,GAAY,MAANtwB,EAAa,CAAED,EAAIE,GAAO,CAAED,EAAIE,GAAMd,GAAKg4C,EAAKT,GACjKC,IAAOQ,EACT1kB,EAAK3wC,KAAK,IAAK61D,EAAI,GAAI,IAAKR,EAAK,IAAKA,EAAK,QAASluB,EAAI,IAAK0uB,EAAI,GAAI,IAAKx4C,EAAI,IAAKA,EAAI,MAAOu3C,EAAKK,GAAgBY,EAAI,GAAG,GAAIA,EAAI,GAAG,GAAID,EAAI,GAAG,GAAIA,EAAI,GAAG,IAAK,IAAK,EAAIhB,EAAI,IAAKgB,EAAI,GAAI,IAAKP,EAAK,IAAKA,EAAK,QAASluB,EAAI,IAAKyuB,EAAI,IAEpOjlB,EAAK3wC,KAAK,IAAK61D,EAAI,GAAI,IAAKR,EAAK,IAAKA,EAAK,QAASluB,EAAI,IAAKyuB,EAAI,SAGnEjlB,EAAK3wC,KAAK,IAAKsuC,EAAI,IAAKC,QAG1BoC,EAAK3wC,KAAK,IAAKge,EAAI,IAAKE,GACd,MAAND,GAAY0yB,EAAK3wC,KAAK,IAAKsd,EAAI,IAAKA,EAAI,MAAOqD,EAAI,IAAKi0C,EAAI,IAAK32C,EAAI,IAAKE,GAC9EwyB,EAAK3wC,KAAK,IAAKsuC,EAAI,IAAKC,GACd,MAANuH,GAAYnF,EAAK3wC,KAAK,IAAKqd,EAAI,IAAKA,EAAI,MAAOqD,EAAI,IAAK,EAAIk0C,EAAI,IAAK9e,EAAI,IAAKG,GAGpF,OADAtF,EAAK3wC,KAAK,KACH2wC,EAAK1gB,KAAK,IAEnB,SAAS6kC,EAAcx3C,EAAIs3C,GACzB,MAAO,MAAQt3C,EAAK,IAAMA,EAAK,IAAMA,EAAK,QAAUs3C,EAAK,OAASt3C,EAAK,IAAMA,EAAK,IAAMA,EAAK,QAAUs3C,EAAK,MAAQt3C,EAyCtH,OAvCAzmB,EAAII,YAAc,SAASa,GACzB,OAAK4K,UAAUwB,QACfjN,EAAcu2B,GAAW11B,GAClBjB,GAFuBI,GAIhCJ,EAAIE,YAAc,SAASe,GACzB,OAAK4K,UAAUwB,QACfnN,EAAcy2B,GAAW11B,GAClBjB,GAFuBE,GAIhCF,EAAIy9D,aAAe,SAASx8D,GAC1B,OAAK4K,UAAUwB,QACfowD,EAAe9mC,GAAW11B,GACnBjB,GAFuBy9D,GAIhCz9D,EAAI09D,UAAY,SAASz8D,GACvB,OAAK4K,UAAUwB,QACfqwD,EAAYz8D,GAAK08D,GAAiBA,GAAiBhnC,GAAW11B,GACvDjB,GAFuB09D,GAIhC19D,EAAImvD,WAAa,SAASluD,GACxB,OAAK4K,UAAUwB,QACf8hD,EAAax4B,GAAW11B,GACjBjB,GAFuBmvD,GAIhCnvD,EAAIovD,SAAW,SAASnuD,GACtB,OAAK4K,UAAUwB,QACf+hD,EAAWz4B,GAAW11B,GACfjB,GAFuBovD,GAIhCpvD,EAAIoyD,SAAW,SAASnxD,GACtB,OAAK4K,UAAUwB,QACf+kD,EAAWz7B,GAAW11B,GACfjB,GAFuBoyD,GAIhCpyD,EAAIksC,SAAW,WACb,IAAIppC,IAAM1C,EAAYwL,MAAMvK,KAAMwK,aAAc3L,EAAY0L,MAAMvK,KAAMwK,YAAc,EAAGzE,IAAM+nD,EAAWvjD,MAAMvK,KAAMwK,aAAcujD,EAASxjD,MAAMvK,KAAMwK,YAAc,EAAI8Y,GAC3K,MAAO,CAAEzjB,KAAKkrB,IAAIhlB,GAAKtE,EAAG5B,KAAKqkB,IAAIne,GAAKtE,IAEnC9C,GAET,IAAI29D,GAAiB,OACrB,SAASJ,GAAsB78D,GAC7B,OAAOA,EAAEN,YAEX,SAASo9D,GAAsB98D,GAC7B,OAAOA,EAAER,YAEX,SAAS09D,GAAqBl9D,GAC5B,OAAOA,EAAEyuD,WAEX,SAAS0O,GAAmBn9D,GAC1B,OAAOA,EAAE0uD,SAEX,SAAS0O,GAAmBp9D,GAC1B,OAAOA,GAAKA,EAAE0xD,SAEhB,SAASgM,GAAgBj3C,EAAIE,EAAID,EAAIE,GACnC,OAAQH,EAAKC,GAAMC,GAAMA,EAAKC,GAAMH,EAAK,EAAI,EAAI,EAEnD,SAAS03C,GAAyBl5C,EAAI7Q,EAAI2R,EAAIu3C,EAAID,GAChD,IAAIkB,EAAMt5C,EAAG,GAAK7Q,EAAG,GAAIoqD,EAAMv5C,EAAG,GAAK7Q,EAAG,GAAIhC,GAAMirD,EAAKC,GAAMA,GAAM98D,KAAK6S,KAAKkrD,EAAMA,EAAMC,EAAMA,GAAMC,EAAKrsD,EAAKosD,EAAKE,GAAMtsD,EAAKmsD,EAAK73C,EAAKzB,EAAG,GAAKw5C,EAAI73C,EAAK3B,EAAG,GAAKy5C,EAAI3nB,EAAK3iC,EAAG,GAAKqqD,EAAIznB,EAAK5iC,EAAG,GAAKsqD,EAAIngB,GAAM73B,EAAKqwB,GAAM,EAAG2H,GAAM93B,EAAKowB,GAAM,EAAGxzB,EAAKuzB,EAAKrwB,EAAIjD,EAAKuzB,EAAKpwB,EAAInB,EAAKjC,EAAKA,EAAKC,EAAKA,EAAIrhB,EAAI2jB,EAAKu3C,EAAIh7D,EAAIokB,EAAKswB,EAAKD,EAAKnwB,EAAI5mB,GAAKyjB,EAAK,GAAK,EAAI,GAAKjjB,KAAK6S,KAAK7S,KAAK4C,IAAI,EAAGhB,EAAIA,EAAIqjB,EAAKnjB,EAAIA,IAAKq8D,GAAOr8D,EAAImhB,EAAKD,EAAKxjB,GAAKylB,EAAIw1B,IAAQ34C,EAAIkhB,EAAKC,EAAKzjB,GAAKylB,EAAIm5C,GAAOt8D,EAAImhB,EAAKD,EAAKxjB,GAAKylB,EAAI01B,IAAQ74C,EAAIkhB,EAAKC,EAAKzjB,GAAKylB,EAAIo5C,EAAMF,EAAMpgB,EAAIugB,EAAM7jB,EAAMyD,EAAIqgB,EAAMH,EAAMrgB,EAAIygB,EAAM7jB,EAAMuD,EAEpkB,OADImgB,EAAMA,EAAMC,EAAMA,EAAMC,EAAMA,EAAMC,EAAMA,IAAKL,EAAMC,EAAK3jB,EAAME,GAC7D,CAAE,CAAEwjB,EAAMF,EAAIxjB,EAAMyjB,GAAM,CAAEC,EAAM54C,EAAK3jB,EAAG64C,EAAMl1B,EAAK3jB,IAE9D,SAAS68D,GAAYhnB,GACnB,IAAIt1C,EAAIw6C,GAAgBv7C,EAAIw7C,GAAgB8hB,EAAU/yB,GAASI,EAAc4yB,GAAmBC,EAAiB7yB,EAAY53B,IAAK0qD,EAAU,GAC5I,SAAS/xB,EAAKntC,GACZ,IAAyDH,EAArDqsC,EAAW,GAAIQ,EAAS,GAAIvsC,GAAK,EAAG2B,EAAI9B,EAAKwM,OAAWkxC,EAAK5nB,GAAWtzB,GAAIm7C,EAAK7nB,GAAWr0B,GAChG,SAAS6qC,IACPJ,EAAS5jC,KAAK,IAAK8jC,EAAY0L,EAAWpL,GAASwyB,IAErD,OAAS/+D,EAAI2B,GACPi9D,EAAQtvD,KAAKjP,KAAMX,EAAIG,EAAKG,GAAIA,GAClCusC,EAAOpkC,KAAK,EAAGo1C,EAAGjuC,KAAKjP,KAAMX,EAAGM,IAAKw9C,EAAGluC,KAAKjP,KAAMX,EAAGM,KAC7CusC,EAAOlgC,SAChB8/B,IACAI,EAAS,IAIb,OADIA,EAAOlgC,QAAQ8/B,IACZJ,EAAS1/B,OAAS0/B,EAAS3T,KAAK,IAAM,KA2B/C,OAzBA4U,EAAK3qC,EAAI,SAAS6S,GAChB,OAAKrK,UAAUwB,QACfhK,EAAI6S,EACG83B,GAFuB3qC,GAIhC2qC,EAAK1rC,EAAI,SAAS4T,GAChB,OAAKrK,UAAUwB,QACf/K,EAAI4T,EACG83B,GAFuB1rC,GAIhC0rC,EAAK4xB,QAAU,SAAS1pD,GACtB,OAAKrK,UAAUwB,QACfuyD,EAAU1pD,EACH83B,GAFuB4xB,GAIhC5xB,EAAKf,YAAc,SAAS/2B,GAC1B,OAAKrK,UAAUwB,QACcyyD,EAAZ,mBAAN5pD,EAAmC+2B,EAAc/2B,GAA0B+2B,EAAc+yB,GAAyB5vD,IAAI8F,IAAM2pD,IAAmBxqD,IACnJ24B,GAFuB8xB,GAIhC9xB,EAAK+xB,QAAU,SAAS7pD,GACtB,OAAKrK,UAAUwB,QACf0yD,EAAU7pD,EACH83B,GAFuB+xB,GAIzB/xB,EAETruC,EAAGM,IAAI+tC,KAAO,WACZ,OAAO2xB,GAAYpoD,IAErB,IAAIyoD,GAA2BrgE,EAAGyV,IAAI,CACpCi0C,OAAQwW,GACR,gBAAiBI,GACjB1pD,KAsBF,SAAyBg3B,GACvB,IAAIvsC,EAAI,EAAG2B,EAAI4qC,EAAOlgC,OAAQtK,EAAIwqC,EAAO,GAAIuM,EAAO,CAAE/2C,EAAE,GAAI,IAAKA,EAAE,IACnE,OAAS/B,EAAI2B,GAAGm3C,EAAK3wC,KAAK,KAAMpG,EAAE,IAAMA,EAAIwqC,EAAOvsC,IAAI,IAAM,EAAG,IAAK+B,EAAE,IACnEJ,EAAI,GAAGm3C,EAAK3wC,KAAK,IAAKpG,EAAE,IAC5B,OAAO+2C,EAAK1gB,KAAK,KAzBjB,cAAe8mC,GACf,aAAcC,GACdC,MAAOC,GACP,aAiGF,SAA8B9yB,GAC5B,GAAIA,EAAOlgC,OAAS,EAAG,OAAOwyD,GAAkBtyB,GAChD,IAA0C+yB,EAAtCxmB,EAAO,GAAI94C,GAAK,EAAG2B,EAAI4qC,EAAOlgC,OAAY4gD,EAAK,CAAE,GAAKC,EAAK,CAAE,GACjE,OAASltD,EAAI,GACXs/D,EAAK/yB,EAAOvsC,GACZitD,EAAG9kD,KAAKm3D,EAAG,IACXpS,EAAG/kD,KAAKm3D,EAAG,IAEbxmB,EAAK3wC,KAAKo3D,GAAgBC,GAAyBvS,GAAM,IAAMsS,GAAgBC,GAAyBtS,MACtGltD,EACF,OAASA,EAAI2B,GACX29D,EAAK/yB,EAAOvsC,GACZitD,EAAG1e,QACH0e,EAAG9kD,KAAKm3D,EAAG,IACXpS,EAAG3e,QACH2e,EAAG/kD,KAAKm3D,EAAG,IACXG,GAAuB3mB,EAAMmU,EAAIC,GAEnC,OAAOpU,EAAK1gB,KAAK,KAlHjB,eAoHF,SAAgCmU,GAC9B,IAAIuM,EAA4CwmB,EAAtCt/D,GAAK,EAAG2B,EAAI4qC,EAAOlgC,OAAQxC,EAAIlI,EAAI,EAAOsrD,EAAK,GAAIC,EAAK,GAClE,OAASltD,EAAI,GACXs/D,EAAK/yB,EAAOvsC,EAAI2B,GAChBsrD,EAAG9kD,KAAKm3D,EAAG,IACXpS,EAAG/kD,KAAKm3D,EAAG,IAEbxmB,EAAO,CAAEymB,GAAgBC,GAAyBvS,GAAK,IAAKsS,GAAgBC,GAAyBtS,MACnGltD,EACF,OAASA,EAAI6J,GACXy1D,EAAK/yB,EAAOvsC,EAAI2B,GAChBsrD,EAAG1e,QACH0e,EAAG9kD,KAAKm3D,EAAG,IACXpS,EAAG3e,QACH2e,EAAG/kD,KAAKm3D,EAAG,IACXG,GAAuB3mB,EAAMmU,EAAIC,GAEnC,OAAOpU,EAAK1gB,KAAK,KApIjBi1B,OAsIF,SAA2B9gB,EAAQwyB,GACjC,IAAIp9D,EAAI4qC,EAAOlgC,OAAS,EACxB,GAAI1K,EAEF,IADA,IAAkGI,EAAGP,EAAjG2kB,EAAKomB,EAAO,GAAG,GAAIlmB,EAAKkmB,EAAO,GAAG,GAAIrpB,EAAKqpB,EAAO5qC,GAAG,GAAKwkB,EAAIhD,EAAKopB,EAAO5qC,GAAG,GAAK0kB,EAAIrmB,GAAK,IACtFA,GAAK2B,GACZI,EAAIwqC,EAAOvsC,GACXwB,EAAIxB,EAAI2B,EACRI,EAAE,GAAKg9D,EAAUh9D,EAAE,IAAM,EAAIg9D,IAAY54C,EAAK3kB,EAAI0hB,GAClDnhB,EAAE,GAAKg9D,EAAUh9D,EAAE,IAAM,EAAIg9D,IAAY14C,EAAK7kB,EAAI2hB,GAGtD,OAAOk8C,GAAiB9yB,IAhJxBmzB,SAsCF,SAA6BnzB,EAAQwyB,GACnC,OAAOxyB,EAAOlgC,OAAS,EAAIwyD,GAAkBtyB,GAAUA,EAAO,GAAKozB,GAAmBpzB,EAAQqzB,GAA4BrzB,EAAQwyB,KAtClI,gBA8BF,SAAiCxyB,EAAQwyB,GACvC,OAAOxyB,EAAOlgC,OAAS,EAAIwyD,GAAkBtyB,GAAUA,EAAO,GAAKozB,GAAmBpzB,EAAO58B,MAAM,GAAI,GAAIiwD,GAA4BrzB,EAAQwyB,KA9B/I,kBAgCF,SAAmCxyB,EAAQwyB,GACzC,OAAOxyB,EAAOlgC,OAAS,EAAI4yD,GAAwB1yB,GAAUA,EAAO,GAAKozB,IAAoBpzB,EAAOpkC,KAAKokC,EAAO,IAChHA,GAASqzB,GAA4B,CAAErzB,EAAOA,EAAOlgC,OAAS,IAAKmM,OAAO+zB,EAAQ,CAAEA,EAAO,KAAOwyB,KAjClGc,SAyLF,SAA6BtzB,GAC3B,OAAOA,EAAOlgC,OAAS,EAAIwyD,GAAkBtyB,GAAUA,EAAO,GAAKozB,GAAmBpzB,EAzBxF,SAAqCA,GACnC,IAAmB7sC,EAAG0G,EAAGC,EAAGyD,EAAxBg2D,EAAW,GAAgBj2D,EATjC,SAAsC0iC,GACpC,IAAIvsC,EAAI,EAAGiC,EAAIsqC,EAAOlgC,OAAS,EAAGxC,EAAI,GAAI8a,EAAK4nB,EAAO,GAAIz4B,EAAKy4B,EAAO,GAAI7sC,EAAImK,EAAE,GAAKk2D,GAAiBp7C,EAAI7Q,GAC1G,OAAS9T,EAAIiC,GACX4H,EAAE7J,IAAMN,GAAKA,EAAIqgE,GAAiBp7C,EAAK7Q,EAAIA,EAAKy4B,EAAOvsC,EAAI,MAAQ,EAGrE,OADA6J,EAAE7J,GAAKN,EACAmK,EAG4Bm2D,CAA6BzzB,GAASvsC,GAAK,EAAGiC,EAAIsqC,EAAOlgC,OAAS,EACrG,OAASrM,EAAIiC,GACXvC,EAAIqgE,GAAiBxzB,EAAOvsC,GAAIusC,EAAOvsC,EAAI,IACvCyU,EAAI/U,GAAK2jB,GACXxZ,EAAE7J,GAAK6J,EAAE7J,EAAI,GAAK,GAElBoG,EAAIyD,EAAE7J,GAAKN,EACX2G,EAAIwD,EAAE7J,EAAI,GAAKN,GACfoK,EAAI1D,EAAIA,EAAIC,EAAIA,GACR,IACNyD,EAAQ,EAAJpK,EAAQQ,KAAK6S,KAAKjJ,GACtBD,EAAE7J,GAAK8J,EAAI1D,EACXyD,EAAE7J,EAAI,GAAK8J,EAAIzD,IAIrBrG,GAAK,EACL,OAASA,GAAKiC,GACZ6H,GAAKyiC,EAAOrsC,KAAKiS,IAAIlQ,EAAGjC,EAAI,IAAI,GAAKusC,EAAOrsC,KAAK4C,IAAI,EAAG9C,EAAI,IAAI,KAAO,GAAK,EAAI6J,EAAE7J,GAAK6J,EAAE7J,KACzF8/D,EAAS33D,KAAK,CAAE2B,GAAK,EAAGD,EAAE7J,GAAK8J,GAAK,IAEtC,OAAOg2D,EAGuFG,CAA4B1zB,OApL5H,SAASsyB,GAAkBtyB,GACzB,OAAOA,EAAOlgC,OAAS,EAAIkgC,EAAOnU,KAAK,KAAOmU,EAAS,IAEzD,SAAS0yB,GAAwB1yB,GAC/B,OAAOA,EAAOnU,KAAK,KAAO,IAQ5B,SAAS8mC,GAAsB3yB,GAE7B,IADA,IAAIvsC,EAAI,EAAG2B,EAAI4qC,EAAOlgC,OAAQtK,EAAIwqC,EAAO,GAAIuM,EAAO,CAAE/2C,EAAE,GAAI,IAAKA,EAAE,MAC1D/B,EAAI2B,GAAGm3C,EAAK3wC,KAAK,KAAMpG,EAAIwqC,EAAOvsC,IAAI,GAAI,IAAK+B,EAAE,IAC1D,OAAO+2C,EAAK1gB,KAAK,IAEnB,SAAS+mC,GAAqB5yB,GAE5B,IADA,IAAIvsC,EAAI,EAAG2B,EAAI4qC,EAAOlgC,OAAQtK,EAAIwqC,EAAO,GAAIuM,EAAO,CAAE/2C,EAAE,GAAI,IAAKA,EAAE,MAC1D/B,EAAI2B,GAAGm3C,EAAK3wC,KAAK,KAAMpG,EAAIwqC,EAAOvsC,IAAI,GAAI,IAAK+B,EAAE,IAC1D,OAAO+2C,EAAK1gB,KAAK,IAYnB,SAASunC,GAAmBpzB,EAAQuzB,GAClC,GAAIA,EAASzzD,OAAS,GAAKkgC,EAAOlgC,QAAUyzD,EAASzzD,QAAUkgC,EAAOlgC,QAAUyzD,EAASzzD,OAAS,EAChG,OAAOwyD,GAAkBtyB,GAE3B,IAAIgc,EAAOhc,EAAOlgC,QAAUyzD,EAASzzD,OAAQysC,EAAO,GAAIn0B,EAAK4nB,EAAO,GAAIxqC,EAAIwqC,EAAO,GAAInS,EAAK0lC,EAAS,GAAIt+D,EAAI44B,EAAIklC,EAAK,EAMtH,GALI/W,IACFzP,GAAQ,KAAO/2C,EAAE,GAAa,EAARq4B,EAAG,GAAS,GAAK,KAAOr4B,EAAE,GAAa,EAARq4B,EAAG,GAAS,GAAK,IAAMr4B,EAAE,GAAK,IAAMA,EAAE,GAC3F4iB,EAAK4nB,EAAO,GACZ+yB,EAAK,GAEHQ,EAASzzD,OAAS,EAAG,CACvB7K,EAAIs+D,EAAS,GACb/9D,EAAIwqC,EAAO+yB,GACXA,IACAxmB,GAAQ,KAAOn0B,EAAG,GAAKyV,EAAG,IAAM,KAAOzV,EAAG,GAAKyV,EAAG,IAAM,KAAOr4B,EAAE,GAAKP,EAAE,IAAM,KAAOO,EAAE,GAAKP,EAAE,IAAM,IAAMO,EAAE,GAAK,IAAMA,EAAE,GACzH,IAAK,IAAI/B,EAAI,EAAGA,EAAI8/D,EAASzzD,OAAQrM,IAAKs/D,IACxCv9D,EAAIwqC,EAAO+yB,GACX99D,EAAIs+D,EAAS9/D,GACb84C,GAAQ,KAAO/2C,EAAE,GAAKP,EAAE,IAAM,KAAOO,EAAE,GAAKP,EAAE,IAAM,IAAMO,EAAE,GAAK,IAAMA,EAAE,GAG7E,GAAIwmD,EAAM,CACR,IAAI2X,EAAK3zB,EAAO+yB,GAChBxmB,GAAQ,KAAO/2C,EAAE,GAAY,EAAPP,EAAE,GAAS,GAAK,KAAOO,EAAE,GAAY,EAAPP,EAAE,GAAS,GAAK,IAAM0+D,EAAG,GAAK,IAAMA,EAAG,GAE7F,OAAOpnB,EAET,SAAS8mB,GAA4BrzB,EAAQwyB,GAE3C,IADA,IAA0Cp6C,EAAtCm7C,EAAW,GAAI15D,GAAK,EAAI24D,GAAW,EAAOjrD,EAAKy4B,EAAO,GAAI4zB,EAAK5zB,EAAO,GAAIvsC,EAAI,EAAG2B,EAAI4qC,EAAOlgC,SACvFrM,EAAI2B,GACXgjB,EAAK7Q,EACLA,EAAKqsD,EACLA,EAAK5zB,EAAOvsC,GACZ8/D,EAAS33D,KAAK,CAAE/B,GAAK+5D,EAAG,GAAKx7C,EAAG,IAAKve,GAAK+5D,EAAG,GAAKx7C,EAAG,MAEvD,OAAOm7C,EAET,SAAST,GAAiB9yB,GACxB,GAAIA,EAAOlgC,OAAS,EAAG,OAAOwyD,GAAkBtyB,GAChD,IAAIvsC,EAAI,EAAG2B,EAAI4qC,EAAOlgC,OAAQizD,EAAK/yB,EAAO,GAAIpmB,EAAKm5C,EAAG,GAAIj5C,EAAKi5C,EAAG,GAAIrS,EAAK,CAAE9mC,EAAIA,EAAIA,GAAKm5C,EAAK/yB,EAAO,IAAI,IAAM2gB,EAAK,CAAE7mC,EAAIA,EAAIA,EAAIi5C,EAAG,IAAMxmB,EAAO,CAAE3yB,EAAI,IAAKE,EAAI,IAAKk5C,GAAgBC,GAAyBvS,GAAK,IAAKsS,GAAgBC,GAAyBtS,IAEnQ,IADA3gB,EAAOpkC,KAAKokC,EAAO5qC,EAAI,MACd3B,GAAK2B,GACZ29D,EAAK/yB,EAAOvsC,GACZitD,EAAG1e,QACH0e,EAAG9kD,KAAKm3D,EAAG,IACXpS,EAAG3e,QACH2e,EAAG/kD,KAAKm3D,EAAG,IACXG,GAAuB3mB,EAAMmU,EAAIC,GAInC,OAFA3gB,EAAO+B,MACPwK,EAAK3wC,KAAK,IAAKm3D,GACRxmB,EAAK1gB,KAAK,IAsDnB,SAASmnC,GAAgBn5D,EAAGC,GAC1B,OAAOD,EAAE,GAAKC,EAAE,GAAKD,EAAE,GAAKC,EAAE,GAAKD,EAAE,GAAKC,EAAE,GAAKD,EAAE,GAAKC,EAAE,GA9I5D24D,GAAyBrpD,SAAQ,SAAStB,EAAK5U,GAC7CA,EAAM4U,IAAMA,EACZ5U,EAAMonC,OAAS,WAAWp/B,KAAK4M,MA8IjC,IAAI+rD,GAA0B,CAAE,EAAG,EAAI,EAAG,EAAI,EAAG,GAAKC,GAA0B,CAAE,EAAG,EAAI,EAAG,EAAI,EAAG,GAAKb,GAA0B,CAAE,EAAG,EAAI,EAAG,EAAI,EAAG,EAAI,GACzJ,SAASC,GAAuB3mB,EAAMz2C,EAAGf,GACvCw3C,EAAK3wC,KAAK,IAAKo3D,GAAgBa,GAAyB/9D,GAAI,IAAKk9D,GAAgBa,GAAyB9+D,GAAI,IAAKi+D,GAAgBc,GAAyBh+D,GAAI,IAAKk9D,GAAgBc,GAAyB/+D,GAAI,IAAKi+D,GAAgBC,GAAyBn9D,GAAI,IAAKk9D,GAAgBC,GAAyBl+D,IAEpT,SAASy+D,GAAiBp7C,EAAI7Q,GAC5B,OAAQA,EAAG,GAAK6Q,EAAG,KAAO7Q,EAAG,GAAK6Q,EAAG,IA2CvC,SAAS27C,GAAkB/zB,GAEzB,IADA,IAAI3rB,EAAkC9e,EAAGsE,EAA9BpG,GAAK,EAAG2B,EAAI4qC,EAAOlgC,SACrBrM,EAAI2B,GAEXG,GADA8e,EAAQ2rB,EAAOvsC,IACL,GACVoG,EAAIwa,EAAM,GAAK+C,GACf/C,EAAM,GAAK9e,EAAI5B,KAAKkrB,IAAIhlB,GACxBwa,EAAM,GAAK9e,EAAI5B,KAAKqkB,IAAIne,GAE1B,OAAOmmC,EAET,SAASg0B,GAAY5oB,GACnB,IAAIxxB,EAAK02B,GAAgBz2B,EAAKy2B,GAAgBx2B,EAAK,EAAGC,EAAKw2B,GAAgB8hB,EAAU/yB,GAASI,EAAc4yB,GAAmBC,EAAiB7yB,EAAY53B,IAAKmsD,EAAqBv0B,EAAa3K,EAAI,IAAKy9B,EAAU,GACtN,SAAS53B,EAAKtnC,GACZ,IAAwEH,EAIpD2C,EAAGf,EAJnByqC,EAAW,GAAI00B,EAAU,GAAIC,EAAU,GAAI1gE,GAAK,EAAG2B,EAAI9B,EAAKwM,OAAWs0D,EAAMhrC,GAAWxP,GAAKy6C,EAAMjrC,GAAWtP,GAAKw6C,EAAM16C,IAAOC,EAAK,WACvI,OAAO/jB,GACLszB,GAAWvP,GAAK06C,EAAMz6C,IAAOC,EAAK,WACpC,OAAOhlB,GACLq0B,GAAWrP,GACf,SAAS6lB,IACPJ,EAAS5jC,KAAK,IAAK8jC,EAAY0L,EAAW+oB,GAAU3B,GAAUz9B,EAAGk/B,EAAmB7oB,EAAW8oB,EAAQnlC,WAAYyjC,GAAU,KAE/H,OAAS/+D,EAAI2B,GACPi9D,EAAQtvD,KAAKjP,KAAMX,EAAIG,EAAKG,GAAIA,IAClCygE,EAAQt4D,KAAK,CAAE9F,GAAKs+D,EAAIrxD,KAAKjP,KAAMX,EAAGM,GAAIsB,GAAKs/D,EAAItxD,KAAKjP,KAAMX,EAAGM,KACjE0gE,EAAQv4D,KAAK,EAAG04D,EAAIvxD,KAAKjP,KAAMX,EAAGM,IAAK8gE,EAAIxxD,KAAKjP,KAAMX,EAAGM,MAChDygE,EAAQp0D,SACjB8/B,IACAs0B,EAAU,GACVC,EAAU,IAId,OADID,EAAQp0D,QAAQ8/B,IACbJ,EAAS1/B,OAAS0/B,EAAS3T,KAAK,IAAM,KAiD/C,OA/CA+O,EAAK9kC,EAAI,SAAS6S,GAChB,OAAKrK,UAAUwB,QACf8Z,EAAKC,EAAKlR,EACHiyB,GAFuB/gB,GAIhC+gB,EAAKhhB,GAAK,SAASjR,GACjB,OAAKrK,UAAUwB,QACf8Z,EAAKjR,EACEiyB,GAFuBhhB,GAIhCghB,EAAK/gB,GAAK,SAASlR,GACjB,OAAKrK,UAAUwB,QACf+Z,EAAKlR,EACEiyB,GAFuB/gB,GAIhC+gB,EAAK7lC,EAAI,SAAS4T,GAChB,OAAKrK,UAAUwB,QACfga,EAAKC,EAAKpR,EACHiyB,GAFuB7gB,GAIhC6gB,EAAK9gB,GAAK,SAASnR,GACjB,OAAKrK,UAAUwB,QACfga,EAAKnR,EACEiyB,GAFuB9gB,GAIhC8gB,EAAK7gB,GAAK,SAASpR,GACjB,OAAKrK,UAAUwB,QACfia,EAAKpR,EACEiyB,GAFuB7gB,GAIhC6gB,EAAKy3B,QAAU,SAAS1pD,GACtB,OAAKrK,UAAUwB,QACfuyD,EAAU1pD,EACHiyB,GAFuBy3B,GAIhCz3B,EAAK8E,YAAc,SAAS/2B,GAC1B,OAAKrK,UAAUwB,QACcyyD,EAAZ,mBAAN5pD,EAAmC+2B,EAAc/2B,GAA0B+2B,EAAc+yB,GAAyB5vD,IAAI8F,IAAM2pD,IAAmBxqD,IAC1JmsD,EAAqBv0B,EAAY3Q,SAAW2Q,EAC5C3K,EAAI2K,EAAYpF,OAAS,IAAM,IACxBM,GAJuB23B,GAMhC33B,EAAK43B,QAAU,SAAS7pD,GACtB,OAAKrK,UAAUwB,QACf0yD,EAAU7pD,EACHiyB,GAFuB43B,GAIzB53B,EAqET,SAAS45B,GAAmBrhE,GAC1B,OAAOA,EAAEP,OAgCX,SAAS6hE,GAA0BthE,GACjC,MAAO,CAAEA,EAAE2C,EAAG3C,EAAE4B,GASlB,SAAS2/D,GAAgCtpB,GACvC,OAAO,WACL,IAAIj4C,EAAIi4C,EAAW/sC,MAAMvK,KAAMwK,WAAY/I,EAAIpC,EAAE,GAAI0G,EAAI1G,EAAE,GAAKikB,GAChE,MAAO,CAAE7hB,EAAI5B,KAAKkrB,IAAIhlB,GAAItE,EAAI5B,KAAKqkB,IAAIne,KAoB3C,SAAS86D,KACP,OAAO,GAET,SAASC,KACP,MAAO,SAET,SAASC,GAAoBhrD,GAC3B,IAAItU,EAAI5B,KAAK6S,KAAKqD,EAAOmN,IACzB,MAAO,MAAQzhB,EAAI,IAAMA,EAAI,IAAMA,EAAI,aAAeA,EAAI,IAAMA,EAAI,IAAMA,EAAI,YAAcA,EAAI,IAvOlGnD,EAAGM,IAAI+tC,KAAKq0B,OAAS,WACnB,IAAIr0B,EAAO2xB,GAAY2B,IAGvB,OAFAtzB,EAAK7tC,OAAS6tC,EAAK3qC,SAAU2qC,EAAK3qC,EAClC2qC,EAAKlC,MAAQkC,EAAK1rC,SAAU0rC,EAAK1rC,EAC1B0rC,GAsFTkyB,GAAsB5jC,QAAU6jC,GAChCA,GAAqB7jC,QAAU4jC,GAC/BvgE,EAAGM,IAAIkoC,KAAO,WACZ,OAAOo5B,GAAYhqD,IAErB5X,EAAGM,IAAIkoC,KAAKk6B,OAAS,WACnB,IAAIl6B,EAAOo5B,GAAYD,IAOvB,OANAn5B,EAAKhoC,OAASgoC,EAAK9kC,SAAU8kC,EAAK9kC,EAClC8kC,EAAK/nC,YAAc+nC,EAAKhhB,UAAWghB,EAAKhhB,GACxCghB,EAAKjoC,YAAcioC,EAAK/gB,UAAW+gB,EAAK/gB,GACxC+gB,EAAK2D,MAAQ3D,EAAK7lC,SAAU6lC,EAAK7lC,EACjC6lC,EAAKgnB,WAAahnB,EAAK9gB,UAAW8gB,EAAK9gB,GACvC8gB,EAAKinB,SAAWjnB,EAAK7gB,UAAW6gB,EAAK7gB,GAC9B6gB,GAETxoC,EAAGM,IAAIsuD,MAAQ,WACb,IAAI92C,EAASmiC,GAAWnuC,EAASouC,GAAW15C,EAAS4hE,GAAoB5S,EAAayO,GAAsBxO,EAAWyO,GACvH,SAAStP,EAAM7tD,EAAGM,GAChB,IAacoG,EAAGC,EAbbyD,EAAIyQ,EAASla,KAAMoW,EAAQ/W,EAAGM,GAAIwB,EAAI+Y,EAASla,KAAMoK,EAAQ/K,EAAGM,GACpE,MAAO,IAAM8J,EAAE6a,GAAK3lB,EAAI8K,EAAEhI,EAAGgI,EAAEgK,GAAIhK,EAAEioC,GAAKjoC,EAAEusC,KAY3BhwC,EAZ4C7E,IAY/C4E,EAZ4C0D,GAajDusC,IAAMhwC,EAAEgwC,IAAMjwC,EAAE2rC,IAAM1rC,EAAE0rC,GAbiCuvB,EAAMx3D,EAAEhI,EAAGgI,EAAEgK,GAAIhK,EAAEhI,EAAGgI,EAAE6a,IAAM28C,EAAMx3D,EAAEhI,EAAGgI,EAAEgK,GAAItS,EAAEM,EAAGN,EAAEmjB,IAAM3lB,EAAIwC,EAAEM,EAAGN,EAAEsS,GAAItS,EAAEuwC,GAAKvwC,EAAE60C,IAAMirB,EAAM9/D,EAAEM,EAAGN,EAAEsS,GAAIhK,EAAEhI,EAAGgI,EAAE6a,KAAO,KAE7L,SAASpK,EAASgnD,EAAMlgE,EAAG3B,EAAGM,GAC5B,IAAIua,EAAWlZ,EAAEiO,KAAKiyD,EAAM7hE,EAAGM,GAAI8B,EAAI3C,EAAOmQ,KAAKiyD,EAAMhnD,EAAUva,GAAIq2C,EAAK8X,EAAW7+C,KAAKiyD,EAAMhnD,EAAUva,GAAK2jB,GAAOouB,EAAKqc,EAAS9+C,KAAKiyD,EAAMhnD,EAAUva,GAAK2jB,GAChK,MAAO,CACL7hB,EAAGA,EACHu0C,GAAIA,EACJtE,GAAIA,EACJptB,GAAI,CAAE7iB,EAAI5B,KAAKkrB,IAAIirB,GAAKv0C,EAAI5B,KAAKqkB,IAAI8xB,IACrCviC,GAAI,CAAEhS,EAAI5B,KAAKkrB,IAAI2mB,GAAKjwC,EAAI5B,KAAKqkB,IAAIwtB,KAMzC,SAAS/yC,EAAI8C,EAAGC,EAAGqE,GACjB,MAAO,IAAMtE,EAAI,IAAMA,EAAI,SAAUsE,EAAImd,IAAK,MAAQxhB,EAExD,SAASu/D,EAAM97C,EAAIb,EAAIc,EAAI3R,GACzB,MAAO,SAAWA,EA2BpB,OAzBAy5C,EAAMpuD,OAAS,SAASc,GACtB,OAAK4K,UAAUwB,QACflN,EAASw2B,GAAW11B,GACbstD,GAFuBpuD,GAIhCouD,EAAM92C,OAAS,SAASxW,GACtB,OAAK4K,UAAUwB,QACfoK,EAASkf,GAAW11B,GACbstD,GAFuB92C,GAIhC82C,EAAM9iD,OAAS,SAASxK,GACtB,OAAK4K,UAAUwB,QACf5B,EAASkrB,GAAW11B,GACbstD,GAFuB9iD,GAIhC8iD,EAAMY,WAAa,SAASluD,GAC1B,OAAK4K,UAAUwB,QACf8hD,EAAax4B,GAAW11B,GACjBstD,GAFuBY,GAIhCZ,EAAMa,SAAW,SAASnuD,GACxB,OAAK4K,UAAUwB,QACf+hD,EAAWz4B,GAAW11B,GACfstD,GAFuBa,GAIzBb,GAKT5uD,EAAGM,IAAIuiE,SAAW,WAChB,IAAI/qD,EAASmiC,GAAWnuC,EAASouC,GAAWlB,EAAaqpB,GACzD,SAASQ,EAAS9hE,EAAGM,GACnB,IAAI2kB,EAAKlO,EAAOnH,KAAKjP,KAAMX,EAAGM,GAAIyhE,EAAKh3D,EAAO6E,KAAKjP,KAAMX,EAAGM,GAAI6J,GAAK8a,EAAGrjB,EAAImgE,EAAGngE,GAAK,EAAGS,EAAI,CAAE4iB,EAAI,CAC/FtiB,EAAGsiB,EAAGtiB,EACNf,EAAGuI,GACF,CACDxH,EAAGo/D,EAAGp/D,EACNf,EAAGuI,GACF43D,GAEH,MAAO,KADP1/D,EAAIA,EAAEqS,IAAIujC,IACK,GAAK,IAAM51C,EAAE,GAAK,IAAMA,EAAE,GAAK,IAAMA,EAAE,GAiBxD,OAfAy/D,EAAS/qD,OAAS,SAASpU,GACzB,OAAKwI,UAAUwB,QACfoK,EAASkf,GAAWtzB,GACbm/D,GAFuB/qD,GAIhC+qD,EAAS/2D,OAAS,SAASpI,GACzB,OAAKwI,UAAUwB,QACf5B,EAASkrB,GAAWtzB,GACbm/D,GAFuB/2D,GAIhC+2D,EAAS7pB,WAAa,SAASt1C,GAC7B,OAAKwI,UAAUwB,QACfsrC,EAAat1C,EACNm/D,GAFuB7pB,GAIzB6pB,GAKT7iE,EAAGM,IAAIuiE,SAASH,OAAS,WACvB,IAAIG,EAAW7iE,EAAGM,IAAIuiE,WAAY7pB,EAAaqpB,GAA2BU,EAAcF,EAAS7pB,WAIjG,OAHA6pB,EAAS7pB,WAAa,SAASt1C,GAC7B,OAAOwI,UAAUwB,OAASq1D,EAAYT,GAAgCtpB,EAAat1C,IAAMs1C,GAEpF6pB,GAQT7iE,EAAGM,IAAIyG,OAAS,WACd,IAAIL,EAAO87D,GAAmB/qD,EAAO8qD,GACrC,SAASx7D,EAAOhG,EAAGM,GACjB,OAAQ2hE,GAAevyD,IAAI/J,EAAKiK,KAAKjP,KAAMX,EAAGM,KAAOohE,IAAqBhrD,EAAK9G,KAAKjP,KAAMX,EAAGM,IAY/F,OAVA0F,EAAOL,KAAO,SAAShD,GACrB,OAAKwI,UAAUwB,QACfhH,EAAOswB,GAAWtzB,GACXqD,GAFuBL,GAIhCK,EAAO0Q,KAAO,SAAS/T,GACrB,OAAKwI,UAAUwB,QACf+J,EAAOuf,GAAWtzB,GACXqD,GAFuB0Q,GAIzB1Q,GAYT,IAAIi8D,GAAiBhjE,EAAGyV,IAAI,CAC1BklC,OAAQ8nB,GACRQ,MAAO,SAASxrD,GACd,IAAItU,EAAI5B,KAAK6S,KAAKqD,EAAO,GAAK,EAC9B,MAAO,KAAO,EAAItU,EAAI,KAAOA,EAAI,KAAOA,EAAI,KAAO,EAAIA,EAAI,IAAMA,EAAI,KAAOA,EAAI,IAAM,EAAIA,EAAI,IAAMA,EAAI,IAAMA,EAAI,IAAM,EAAIA,EAAI,KAAOA,EAAI,IAAMA,EAAI,KAAO,EAAIA,EAAI,KAEtK+/D,QAAS,SAASzrD,GAChB,IAAIssC,EAAKxiD,KAAK6S,KAAKqD,GAAQ,EAAI0rD,KAAsBrf,EAAKC,EAAKof,GAC/D,MAAO,OAASpf,EAAK,IAAMD,EAApB,QAAwCC,EAAK,KAAOD,EAApD,OAETsf,OAAQ,SAAS3rD,GACf,IAAItU,EAAI5B,KAAK6S,KAAKqD,GAAQ,EAC1B,MAAO,KAAOtU,EAAI,KAAOA,EAAI,IAAMA,EAAI,KAAOA,EAAI,IAAMA,EAAI,IAAMA,EAAI,KAAOA,EAAI,IAAMA,EAAI,KAE7F,gBAAiB,SAASsU,GACxB,IAAIqsC,EAAKviD,KAAK6S,KAAKqD,EAAO4rD,IAAqBtf,EAAKD,EAAKuf,GAAqB,EAC9E,MAAO,MAAQtf,EAAK,IAAMD,EAAK,KAAOC,EAAK,KAAOD,EAAK,KAAOC,EAAK,KAErE,cAAe,SAAStsC,GACtB,IAAIqsC,EAAKviD,KAAK6S,KAAKqD,EAAO4rD,IAAqBtf,EAAKD,EAAKuf,GAAqB,EAC9E,MAAO,OAAStf,EAAK,IAAMD,EAAK,IAAMC,EAAK,KAAOD,EAAK,IAAMC,EAAK,OAGtE/jD,EAAGM,IAAIgjE,YAAcN,GAAextD,OACpC,IAAI6tD,GAAqB9hE,KAAK6S,KAAK,GAAI+uD,GAAqB5hE,KAAK80B,IAAI,GAAKpR,IAC1ElK,EAAsB8N,WAAa,SAAS7gB,GAO1C,IANA,IAAyG4T,EAAUvK,EAA/Gb,EAAKsa,MAA4By4C,GAAiB/mD,EAAKgnD,GAAuBx7D,GAAO+T,EAAY,GAAoB8M,EAAa46C,IAAwB,CAC5JtoC,KAAMvpB,KAAKC,MACXy5C,KAAMV,GACN3vB,MAAO,EACPhU,SAAU,KAEH3jB,GAAK,EAAG4H,EAAIxJ,KAAKgM,SAAUpK,EAAI4H,GAAK,CAC3C6Q,EAAUvS,KAAKoS,EAAW,IAC1B,IAAK,IAAIE,EAAQpa,KAAK4B,GAAIjC,GAAK,EAAG2B,EAAI8Y,EAAMpO,SAAUrM,EAAI2B,IACpDqO,EAAOyK,EAAMza,KAAIqiE,GAAkBryD,EAAMhQ,EAAGmb,EAAIhM,EAAIqY,GACxDjN,EAASpS,KAAK6H,GAGlB,OAAOsyD,GAAc5nD,EAAWS,EAAIhM,IAEtCuK,EAAsB6oD,UAAY,SAAS57D,GACzC,OAAOtG,KAAKT,KAAa,MAAR+G,EAAeshB,GAAyBu6C,GAAyBL,GAAuBx7D,MAE3G,IAAIshB,GAAyBu6C,GAAyBL,MACtD,SAASK,GAAyBrnD,GAChC,OAAO,WACL,IAAIsnD,EAAMC,EAAUC,GACfF,EAAOpiE,KAAK8a,MAASwnD,EAASF,EAAKC,EAAWD,EAAKE,WACtDA,EAAO5oC,MAAM5zB,EAAI,KACjBw8D,EAAO5oC,MAAMv4B,EAAIgQ,MACXixD,EAAKG,aAAcH,EAAKC,UAAuBriE,KAAK8a,GAC1DsnD,EAAKE,QAAU,GACfA,EAAOtqD,OAASsqD,EAAOtqD,MAAMkqD,UAAUjzD,KAAKjP,KAAMA,KAAKsa,SAAUgoD,EAAOzhE,SAI9E,SAASohE,GAAc7oD,EAAQ0B,EAAIhM,GAIjC,OAHAkK,EAAYI,EAAQopD,IACpBppD,EAAO8C,UAAYpB,EACnB1B,EAAOtK,GAAKA,EACLsK,EAET,IAAsDgQ,GAAwB24C,GAA1ES,GAAyB,GAAIX,GAAkB,EAkEnD,SAASY,GAAoBrpD,EAAQ9S,EAAMlH,EAAOiqB,GAChD,IAAIva,EAAKsK,EAAOtK,GAAIgM,EAAK1B,EAAO8C,UAChC,OAAOQ,GAAkBtD,EAAyB,mBAAVha,EAAuB,SAASuQ,EAAMhQ,EAAGiC,GAC/E+N,EAAKmL,GAAIhM,GAAIua,MAAM9T,IAAIjP,EAAM+iB,EAAMjqB,EAAM6P,KAAKU,EAAMA,EAAK2K,SAAU3a,EAAGiC,OACnExC,EAAQiqB,EAAMjqB,GAAQ,SAASuQ,GAClCA,EAAKmL,GAAIhM,GAAIua,MAAM9T,IAAIjP,EAAMlH,MAqFjC,SAASsjE,GAAmB18D,GAE1B,OADS,MAALA,IAAWA,EAAI,IACZ,WACLhG,KAAKmd,YAAcnX,GA6EvB,SAAS87D,GAAuBx7D,GAC9B,OAAe,MAARA,EAAe,iBAAmB,gBAAkBA,EAAO,KAEpE,SAAS07D,GAAkBryD,EAAMhQ,EAAGmb,EAAIhM,EAAI6zD,GAC1C,IAG2BlpC,EAAMC,EAAOnU,EAAUqkC,EAAMgZ,EAHpDR,EAAOzyD,EAAKmL,KAAQnL,EAAKmL,GAAM,CACjCwnD,OAAQ,EACRC,MAAO,IACLp7C,EAAai7C,EAAKtzD,GAOtB,SAASkG,EAAM6tD,GACb,IAAIR,EAAWD,EAAKE,OAAQA,EAASF,EAAKC,GAQ1C,IAAK,IAAIS,KAPLR,IACFA,EAAO5oC,MAAM5zB,EAAI,KACjBw8D,EAAO5oC,MAAMv4B,EAAIgQ,MACfixD,EAAKG,aACAH,EAAKC,GACZC,EAAOtqD,OAASsqD,EAAOtqD,MAAMkqD,UAAUjzD,KAAKU,EAAMA,EAAK2K,SAAUgoD,EAAOzhE,QAErDuhE,EACnB,IAAKU,EAAWh0D,EAAI,CAClB,IAAIi0D,EAASX,EAAKU,GAClBC,EAAOrpC,MAAM5zB,EAAI,KACjBi9D,EAAOrpC,MAAMv4B,EAAIgQ,MACfixD,EAAKG,aACAH,EAAKU,GAGhBppC,EAAM5zB,EAAIwpD,EACVh2B,IAAS,WAKP,OAJII,EAAM5zB,GAAKwpD,EAAKuT,GAAW,KAC7BnpC,EAAM5zB,EAAI,KACV4zB,EAAMv4B,EAAIgQ,KAEL,IACN,EAAGsoB,GACN2oC,EAAKE,OAASxzD,EACdqY,EAAWnP,OAASmP,EAAWnP,MAAMhD,MAAM/F,KAAKU,EAAMA,EAAK2K,SAAU3a,GACrEijE,EAAS,GACTz7C,EAAWkC,MAAM/T,SAAQ,SAAStB,EAAK5U,IACjCA,EAAQA,EAAM6P,KAAKU,EAAMA,EAAK2K,SAAU3a,KAC1CijE,EAAO96D,KAAK1I,MAGhBwqD,EAAOziC,EAAWyiC,KAClBrkC,EAAW4B,EAAW5B,SAExB,SAAS+pC,EAAKuT,GAEZ,IADA,IAAI1hE,EAAI0hE,EAAUt9C,EAAUlc,EAAIugD,EAAKzoD,GAAIG,EAAIshE,EAAO52D,OAC7C1K,EAAI,GACTshE,IAASthE,GAAG2N,KAAKU,EAAMtG,GAEzB,GAAIlI,GAAK,EAGP,OAFAgmB,EAAWnP,OAASmP,EAAWnP,MAAMkK,IAAIjT,KAAKU,EAAMA,EAAK2K,SAAU3a,KAC7DyiE,EAAKG,aAAcH,EAAKtzD,UAAiBa,EAAKmL,GAC7C,EAGNqM,IACHsS,EAAOkpC,EAAQlpC,KACfC,EAAQJ,IAxDV,SAAkBupC,GAChB,IAAItpC,EAAQpS,EAAWoS,MAEvB,GADAG,EAAMv4B,EAAIo4B,EAAQE,EACdF,GAASspC,EAAS,OAAO7tD,EAAM6tD,EAAUtpC,GAC7CG,EAAM5zB,EAAIkP,IAoDiB,EAAGykB,GAC9BtS,EAAai7C,EAAKtzD,GAAM,CACtBua,MAAO,IAAIzU,EACX6kB,KAAMA,EACNC,MAAOA,EACPH,MAAOopC,EAAQppC,MACfhU,SAAUo9C,EAAQp9C,SAClBqkC,KAAM+Y,EAAQ/Y,KACd/oD,MAAOlB,GAETgjE,EAAU,OACRP,EAAKG,OAtTXC,GAAuBvzD,KAAOoK,EAAsBpK,KACpDuzD,GAAuB7rD,MAAQ0C,EAAsB1C,MACrD6rD,GAAuB7yD,KAAO0J,EAAsB1J,KACpD6yD,GAAuBzsD,KAAOsD,EAAsBtD,KACpDzX,EAAG6oB,WAAa,SAAS7nB,EAAWgH,GAClC,OAAOhH,GAAaA,EAAU6nB,WAAaiC,GAAyB9pB,EAAU6nB,WAAW7gB,GAAQhH,EAAYhB,EAAGgB,YAAY6nB,WAAW7nB,IAEzIhB,EAAG6oB,WAAWrkB,UAAY0/D,GAC1BA,GAAuBziE,OAAS,SAASia,GACvC,IAAuDE,EAAUC,EAASxK,EAAtEb,EAAK9O,KAAK8O,GAAIgM,EAAK9a,KAAKkc,UAAW7B,EAAY,GACnDL,EAAWD,EAAsBC,GACjC,IAAK,IAAIpY,GAAK,EAAG4H,EAAIxJ,KAAKgM,SAAUpK,EAAI4H,GAAK,CAC3C6Q,EAAUvS,KAAKoS,EAAW,IAC1B,IAAK,IAAIE,EAAQpa,KAAK4B,GAAIjC,GAAK,EAAG2B,EAAI8Y,EAAMpO,SAAUrM,EAAI2B,IACnDqO,EAAOyK,EAAMza,MAAQwa,EAAUH,EAAS/K,KAAKU,EAAMA,EAAK2K,SAAU3a,EAAGiC,KACpE,aAAc+N,IAAMwK,EAAQG,SAAW3K,EAAK2K,UAChD0nD,GAAkB7nD,EAASxa,EAAGmb,EAAIhM,EAAIa,EAAKmL,GAAIhM,IAC/CoL,EAASpS,KAAKqS,IAEdD,EAASpS,KAAK,MAIpB,OAAOm6D,GAAc5nD,EAAWS,EAAIhM,IAEtC0zD,GAAuBviE,UAAY,SAAS+Z,GAC1C,IAAuDE,EAAU8oD,EAAUrzD,EAAMwK,EAASgN,EAAtFrY,EAAK9O,KAAK8O,GAAIgM,EAAK9a,KAAKkc,UAAW7B,EAAY,GACnDL,EAAWC,EAAyBD,GACpC,IAAK,IAAIpY,GAAK,EAAG4H,EAAIxJ,KAAKgM,SAAUpK,EAAI4H,GACtC,IAAK,IAAI4Q,EAAQpa,KAAK4B,GAAIjC,GAAK,EAAG2B,EAAI8Y,EAAMpO,SAAUrM,EAAI2B,GACxD,GAAIqO,EAAOyK,EAAMza,GAAI,CACnBwnB,EAAaxX,EAAKmL,GAAIhM,GACtBk0D,EAAWhpD,EAAS/K,KAAKU,EAAMA,EAAK2K,SAAU3a,EAAGiC,GACjDyY,EAAUvS,KAAKoS,EAAW,IAC1B,IAAK,IAAI7Y,GAAK,EAAGG,EAAIwhE,EAASh3D,SAAU3K,EAAIG,IACtC2Y,EAAU6oD,EAAS3hE,KAAI2gE,GAAkB7nD,EAAS9Y,EAAGyZ,EAAIhM,EAAIqY,GACjEjN,EAASpS,KAAKqS,GAKtB,OAAO8nD,GAAc5nD,EAAWS,EAAIhM,IAEtC0zD,GAAuBrkD,OAAS,SAASA,GACvC,IAAoBjE,EAAiBvK,EAAjC0K,EAAY,GACM,mBAAX8D,IAAuBA,EAAS5B,GAAoB4B,IAC/D,IAAK,IAAIvc,EAAI,EAAG4H,EAAIxJ,KAAKgM,OAAQpK,EAAI4H,EAAG5H,IAAK,CAC3CyY,EAAUvS,KAAKoS,EAAW,IAC1B,IAAK,IAAIE,EAAiBza,EAAI,EAAG2B,GAAxB8Y,EAAQpa,KAAK4B,IAAqBoK,OAAQrM,EAAI2B,EAAG3B,KACnDgQ,EAAOyK,EAAMza,KAAOwe,EAAOlP,KAAKU,EAAMA,EAAK2K,SAAU3a,EAAGiC,IAC3DsY,EAASpS,KAAK6H,GAIpB,OAAOsyD,GAAc5nD,EAAWra,KAAKkc,UAAWlc,KAAK8O,KAEvD0zD,GAAuBn5C,MAAQ,SAAS/iB,EAAM+iB,GAC5C,IAAIva,EAAK9O,KAAK8O,GAAIgM,EAAK9a,KAAKkc,UAC5B,OAAI1R,UAAUwB,OAAS,EAAUhM,KAAK2P,OAAOmL,GAAIhM,GAAIua,MAAMta,IAAIzI,GACxDoW,GAAkB1c,KAAe,MAATqpB,EAAgB,SAAS1Z,GACtDA,EAAKmL,GAAIhM,GAAIua,MAAMla,OAAO7I,IACxB,SAASqJ,GACXA,EAAKmL,GAAIhM,GAAIua,MAAM9T,IAAIjP,EAAM+iB,MAWjCm5C,GAAuBniE,KAAO,SAAS4iE,EAAQ7jE,GAC7C,GAAIoL,UAAUwB,OAAS,EAAG,CACxB,IAAK5M,KAAS6jE,EAAQjjE,KAAKK,KAAKjB,EAAO6jE,EAAO7jE,IAC9C,OAAOY,KAET,IAAI4rC,EAAwB,aAAVq3B,EAAwBnY,GAA0BjF,GAAgBv/C,EAAOhI,EAAGwc,GAAGC,QAAQkoD,GACzG,SAASC,IACPljE,KAAKib,gBAAgB3U,GAEvB,SAAS68D,IACPnjE,KAAKgb,kBAAkB1U,EAAKyK,MAAOzK,EAAK0K,OAE1C,SAASoyD,EAAUp9D,GACjB,OAAY,MAALA,EAAYk9D,GAAYl9D,GAAK,GAAI,WACtC,IAAiCrG,EAA7BoG,EAAI/F,KAAK4b,aAAatV,GAC1B,OAAOP,IAAMC,IAAMrG,EAAIisC,EAAY7lC,EAAGC,GAAI,SAAS7E,GACjDnB,KAAKyQ,aAAanK,EAAM3G,EAAEwB,QAIhC,SAASkiE,EAAYr9D,GACnB,OAAY,MAALA,EAAYm9D,GAAcn9D,GAAK,GAAI,WACxC,IAAqDrG,EAAjDoG,EAAI/F,KAAK8c,eAAexW,EAAKyK,MAAOzK,EAAK0K,OAC7C,OAAOjL,IAAMC,IAAMrG,EAAIisC,EAAY7lC,EAAGC,GAAI,SAAS7E,GACjDnB,KAAK2Q,eAAerK,EAAKyK,MAAOzK,EAAK0K,MAAOrR,EAAEwB,QAIpD,OAAOshE,GAAoBziE,KAAM,QAAUijE,EAAQ7jE,EAAOkH,EAAK0K,MAAQqyD,EAAcD,IAEvFZ,GAAuBY,UAAY,SAASH,EAAQ55C,GAClD,IAAI/iB,EAAOhI,EAAGwc,GAAGC,QAAQkoD,GAazB,OAAOjjE,KAAKqpB,MAAM,QAAU45C,EAAQ38D,EAAK0K,MANzC,SAAqB3R,EAAGM,GACtB,IAAIqB,EAAIqoB,EAAMpa,KAAKjP,KAAMX,EAAGM,EAAGK,KAAK8c,eAAexW,EAAKyK,MAAOzK,EAAK0K,QACpE,OAAOhQ,GAAK,SAASG,GACnBnB,KAAK2Q,eAAerK,EAAKyK,MAAOzK,EAAK0K,MAAOhQ,EAAEG,MATlD,SAAmB9B,EAAGM,GACpB,IAAIqB,EAAIqoB,EAAMpa,KAAKjP,KAAMX,EAAGM,EAAGK,KAAK4b,aAAatV,IACjD,OAAOtF,GAAK,SAASG,GACnBnB,KAAKyQ,aAAanK,EAAMtF,EAAEG,QAWhCqhE,GAAuBhiE,MAAQ,SAAS8F,EAAMlH,EAAO6R,GACnD,IAAI3P,EAAIkJ,UAAUwB,OAClB,GAAI1K,EAAI,EAAG,CACT,GAAoB,iBAATgF,EAAmB,CAE5B,IAAK2K,KADD3P,EAAI,IAAGlC,EAAQ,IACFkH,EAAMtG,KAAKQ,MAAMyQ,EAAU3K,EAAK2K,GAAW7R,GAC5D,OAAOY,KAETiR,EAAW,GAEb,SAASqyD,IACPtjE,KAAKQ,MAAMub,eAAezV,GAE5B,SAASi9D,EAAYv9D,GACnB,OAAY,MAALA,EAAYs9D,GAAat9D,GAAK,GAAI,WACvC,IAA6ErG,EAAzEoG,EAAI+J,EAAU9P,MAAMid,iBAAiBjd,KAAM,MAAMkd,iBAAiB5W,GACtE,OAAOP,IAAMC,IAAMrG,EAAIkmD,GAAe9/C,EAAGC,GAAI,SAAS7E,GACpDnB,KAAKQ,MAAM4P,YAAY9J,EAAM3G,EAAEwB,GAAI8P,OAIzC,OAAOwxD,GAAoBziE,KAAM,SAAWsG,EAAMlH,EAAOmkE,IAE3Df,GAAuBgB,WAAa,SAASl9D,EAAM+iB,EAAOpY,GAExD,SAASuyD,EAAWnkE,EAAGM,GACrB,IAAIqB,EAAIqoB,EAAMpa,KAAKjP,KAAMX,EAAGM,EAAGmQ,EAAU9P,MAAMid,iBAAiBjd,KAAM,MAAMkd,iBAAiB5W,IAC7F,OAAOtF,GAAK,SAASG,GACnBnB,KAAKQ,MAAM4P,YAAY9J,EAAMtF,EAAEG,GAAI8P,IAGvC,OAPIzG,UAAUwB,OAAS,IAAGiF,EAAW,IAO9BjR,KAAKqpB,MAAM,SAAW/iB,EAAMk9D,IAErChB,GAAuBliE,KAAO,SAASlB,GACrC,OAAOqjE,GAAoBziE,KAAM,OAAQZ,EAAOsjE,KAQlDF,GAAuBrzD,OAAS,WAC9B,IAAI2L,EAAK9a,KAAKkc,UACd,OAAOlc,KAAKT,KAAK,kBAAkB,WACjC,IAAImC,EACA1B,KAAK8a,GAAIynD,MAAQ,IAAM7gE,EAAI1B,KAAK4I,aAAalH,EAAE2a,YAAYrc,UAGnEwiE,GAAuB5Y,KAAO,SAASxqD,GACrC,IAAI0P,EAAK9O,KAAK8O,GAAIgM,EAAK9a,KAAKkc,UAC5B,OAAI1R,UAAUwB,OAAS,EAAUhM,KAAK2P,OAAOmL,GAAIhM,GAAI86C,MAChC,mBAAVxqD,IAAsBA,EAAQd,EAAGsrD,KAAKr/C,MAAMjM,EAAIkM,YACpDkS,GAAkB1c,MAAM,SAAS2P,GACtCA,EAAKmL,GAAIhM,GAAI86C,KAAOxqD,OAGxBojE,GAAuBjpC,MAAQ,SAASn6B,GACtC,IAAI0P,EAAK9O,KAAK8O,GAAIgM,EAAK9a,KAAKkc,UAC5B,OAAI1R,UAAUwB,OAAS,EAAUhM,KAAK2P,OAAOmL,GAAIhM,GAAIyqB,MAC9C7c,GAAkB1c,KAAuB,mBAAVZ,EAAuB,SAASuQ,EAAMhQ,EAAGiC,GAC7E+N,EAAKmL,GAAIhM,GAAIyqB,OAASn6B,EAAM6P,KAAKU,EAAMA,EAAK2K,SAAU3a,EAAGiC,KACtDxC,GAASA,EAAO,SAASuQ,GAC5BA,EAAKmL,GAAIhM,GAAIyqB,MAAQn6B,MAGzBojE,GAAuBj9C,SAAW,SAASnmB,GACzC,IAAI0P,EAAK9O,KAAK8O,GAAIgM,EAAK9a,KAAKkc,UAC5B,OAAI1R,UAAUwB,OAAS,EAAUhM,KAAK2P,OAAOmL,GAAIhM,GAAIyW,SAC9C7I,GAAkB1c,KAAuB,mBAAVZ,EAAuB,SAASuQ,EAAMhQ,EAAGiC,GAC7E+N,EAAKmL,GAAIhM,GAAIyW,SAAW1lB,KAAK4C,IAAI,EAAGrD,EAAM6P,KAAKU,EAAMA,EAAK2K,SAAU3a,EAAGiC,MACpExC,EAAQS,KAAK4C,IAAI,EAAGrD,GAAQ,SAASuQ,GACxCA,EAAKmL,GAAIhM,GAAIyW,SAAWnmB,MAG5BojE,GAAuBjjE,KAAO,SAASyF,EAAMiT,GAC3C,IAAInJ,EAAK9O,KAAK8O,GAAIgM,EAAK9a,KAAKkc,UAC5B,GAAI1R,UAAUwB,OAAS,EAAG,CACxB,IAAI22D,EAAUZ,GAAsB0B,EAAYr6C,GAChD,IACEA,GAAyBta,EACzB4N,GAAkB1c,MAAM,SAAS2P,EAAMhQ,EAAGiC,GACxCmgE,GAAuBpyD,EAAKmL,GAAIhM,GAChC9J,EAAKiK,KAAKU,EAAMA,EAAK2K,SAAU3a,EAAGiC,MAEpC,QACAmgE,GAAuBY,EACvBv5C,GAAyBq6C,QAG3B/mD,GAAkB1c,MAAM,SAAS2P,GAC/B,IAAIwX,EAAaxX,EAAKmL,GAAIhM,IACzBqY,EAAWnP,QAAUmP,EAAWnP,MAAQ1Z,EAAGuZ,SAAS,QAAS,MAAO,eAAelX,GAAGqE,EAAMiT,MAGjG,OAAOjY,MAETwiE,GAAuBr7C,WAAa,WAElC,IADA,IAAiFjN,EAAiBvK,EAAMwX,EAApGu8C,EAAM1jE,KAAK8O,GAAI60D,IAAQ9B,GAAiB/mD,EAAK9a,KAAKkc,UAAW7B,EAAY,GACpEzY,EAAI,EAAG4H,EAAIxJ,KAAKgM,OAAQpK,EAAI4H,EAAG5H,IAAK,CAC3CyY,EAAUvS,KAAKoS,EAAW,IAC1B,IAAK,IAAIE,EAAiBza,EAAI,EAAG2B,GAAxB8Y,EAAQpa,KAAK4B,IAAqBoK,OAAQrM,EAAI2B,EAAG3B,KACpDgQ,EAAOyK,EAAMza,KAEfqiE,GAAkBryD,EAAMhQ,EAAGmb,EAAI6oD,EAAK,CAClClqC,MAFFtS,EAAaxX,EAAKmL,GAAI4oD,IAEHjqC,KACjBmwB,KAAMziC,EAAWyiC,KACjBrwB,MAAOpS,EAAWoS,MAAQpS,EAAW5B,SACrCA,SAAU4B,EAAW5B,WAGzBrL,EAASpS,KAAK6H,GAGlB,OAAOsyD,GAAc5nD,EAAWS,EAAI6oD,IAgFtCrlE,EAAGM,IAAIglE,KAAO,WACZ,IAAqKC,EAAjKplE,EAAQH,EAAGG,MAAMupD,SAAU8b,EAASC,GAA0BC,EAAgB,EAAGC,EAAgB,EAAGC,EAAc,EAAGC,EAAiB,CAAE,IAAMC,EAAa,KAC/J,SAASR,EAAKnjE,GACZA,EAAElB,MAAK,WACL,IAEqkB8kE,EAFjkB5jE,EAAInC,EAAGyB,OAAOC,MACd6nB,EAAS7nB,KAAKinB,WAAaxoB,EAAOkqB,EAAS3oB,KAAKinB,UAAYxoB,EAAM+qB,OAClEmwC,EAAsB,MAAdyK,EAAqBz7C,EAAOgxC,MAAQhxC,EAAOgxC,MAAMpvD,MAAMoe,EAAQw7C,GAAkBx7C,EAAOtB,SAAW+8C,EAAYxK,EAA4B,MAAfiK,EAAsBl7C,EAAOixC,WAAajxC,EAAOixC,WAAWrvD,MAAMoe,EAAQw7C,GAAkBjuD,EAAc2tD,EAAavU,EAAO7uD,EAAER,UAAU,SAAST,KAAKm6D,EAAOhxC,GAAS27C,EAAYhV,EAAKnvD,QAAQkd,OAAO,IAAK,WAAWhd,KAAK,QAAS,QAAQG,MAAM,UAAWwiB,IAAIuhD,EAAWjmE,EAAG6oB,WAAWmoC,EAAKpxC,QAAQ1d,MAAM,UAAWwiB,IAAG7T,SAAUq1D,EAAalmE,EAAG6oB,WAAWmoC,EAAK/3C,SAAS/W,MAAM,UAAW,GAAIikE,EAAc5kE,KAAK4C,IAAIuhE,EAAe,GAAKE,EACpjBnvD,EAAQ4/C,GAAchsC,GAAS8vB,EAAOh4C,EAAER,UAAU,WAAWT,KAAK,CAAE,IAAMklE,GAAcjsB,EAAKt4C,QAAQC,OAAO,QAAQC,KAAK,QAAS,UACtI/B,EAAG6oB,WAAWsxB,IACd6rB,EAAUlkE,OAAO,QACjBkkE,EAAUlkE,OAAO,QACjB,IAAoQ2lB,EAAIqwB,EAAInwB,EAAIowB,EAA5QsuB,EAAYL,EAAUvkE,OAAO,QAAS6kE,EAAaJ,EAAWzkE,OAAO,QAASO,EAAOgvD,EAAKvvD,OAAO,QAAQO,KAAKs5D,GAAaiL,EAAYP,EAAUvkE,OAAO,QAAS+kE,EAAaN,EAAWzkE,OAAO,QAASq7B,EAAkB,QAAX0oC,GAA+B,SAAXA,GAAqB,EAAI,EAcjQ,GAbe,WAAXA,GAAkC,QAAXA,GACzBO,EAAgBU,GAAch/C,EAAK,IAAKE,EAAK,IAAKmwB,EAAK,KAAMC,EAAK,KAClE/1C,EAAKD,KAAK,KAAM+6B,EAAO,EAAI,MAAQ,SAAS56B,MAAM,cAAe,UACjEkkE,EAAWrkE,KAAK,IAAK,IAAM0U,EAAM,GAAK,IAAMqmB,EAAO6oC,EAAgB,MAAQlvD,EAAM,GAAK,IAAMqmB,EAAO6oC,KAEnGI,EAAgBW,GAAcj/C,EAAK,IAAKE,EAAK,IAAKmwB,EAAK,KAAMC,EAAK,KAClE/1C,EAAKD,KAAK,KAAM,SAASG,MAAM,cAAe46B,EAAO,EAAI,MAAQ,SACjEspC,EAAWrkE,KAAK,IAAK,IAAM+6B,EAAO6oC,EAAgB,IAAMlvD,EAAM,GAAK,MAAQA,EAAM,GAAK,IAAMqmB,EAAO6oC,IAErGU,EAAUtkE,KAAKg2C,EAAIjb,EAAO4oC,GAC1Ba,EAAUxkE,KAAK4lB,EAAImV,EAAOqpC,GAC1BG,EAAWvkE,KAAK+1C,EAAI,GAAG/1C,KAAKg2C,EAAIjb,EAAO4oC,GACvCc,EAAWzkE,KAAK0lB,EAAI,GAAG1lB,KAAK4lB,EAAImV,EAAOqpC,GACnC97C,EAAO8xC,UAAW,CACpB,IAAIz4D,EAAI2mB,EAAQ9F,EAAK7gB,EAAEy4D,YAAc,EACrC5yC,EAASc,EAAS,SAAStpB,GACzB,OAAO2C,EAAE3C,GAAKwjB,QAEPgF,EAAO4yC,UAChB5yC,EAASc,EAET47C,EAASt1D,KAAKo1D,EAAe17C,EAAQd,GAEvCy8C,EAAUr1D,KAAKo1D,EAAex8C,EAAQc,GACtC67C,EAAWv1D,KAAKo1D,EAAe17C,EAAQA,MAqD3C,OAlDAi7C,EAAKnlE,MAAQ,SAASuD,GACpB,OAAKwI,UAAUwB,QACfvN,EAAQuD,EACD4hE,GAFuBnlE,GAIhCmlE,EAAKE,OAAS,SAAS9hE,GACrB,OAAKwI,UAAUwB,QACf83D,EAAS9hE,KAAKijE,GAAqBjjE,EAAI,GAAK+hE,GACrCH,GAFuBE,GAIhCF,EAAKjK,MAAQ,WACX,OAAKnvD,UAAUwB,QACfm4D,EAAiB50D,EAAS/E,WACnBo5D,GAFuBO,GAIhCP,EAAKQ,WAAa,SAASpiE,GACzB,OAAKwI,UAAUwB,QACfo4D,EAAapiE,EACN4hE,GAFuBQ,GAIhCR,EAAKhK,WAAa,SAAS53D,GACzB,OAAKwI,UAAUwB,QACf63D,EAAc7hE,EACP4hE,GAFuBC,GAIhCD,EAAKsB,SAAW,SAASljE,GACvB,IAAIV,EAAIkJ,UAAUwB,OAClB,OAAK1K,GACL0iE,GAAiBhiE,EACjBiiE,GAAiBz5D,UAAUlJ,EAAI,GACxBsiE,GAHQI,GAKjBJ,EAAKI,cAAgB,SAAShiE,GAC5B,OAAKwI,UAAUwB,QACfg4D,GAAiBhiE,EACV4hE,GAFuBI,GAIhCJ,EAAKK,cAAgB,SAASjiE,GAC5B,OAAKwI,UAAUwB,QACfi4D,GAAiBjiE,EACV4hE,GAFuBK,GAIhCL,EAAKM,YAAc,SAASliE,GAC1B,OAAKwI,UAAUwB,QACfk4D,GAAeliE,EACR4hE,GAFuBM,GAIhCN,EAAKuB,cAAgB,WACnB,OAAO36D,UAAUwB,QAAU43D,GAEtBA,GAET,IAAIG,GAA2B,SAAUkB,GAAqB,CAC5Dn+D,IAAK,EACLiE,MAAO,EACPG,OAAQ,EACRF,KAAM,GAER,SAAS+5D,GAAazlE,EAAWwmB,EAAIC,GACnCzmB,EAAUe,KAAK,aAAa,SAAShB,GACnC,IAAIgwC,EAAKvpB,EAAGzmB,GACZ,MAAO,cAAgBy6B,SAASuV,GAAMA,EAAKtpB,EAAG1mB,IAAM,SAGxD,SAAS2lE,GAAa1lE,EAAW0mB,EAAIC,GACnC3mB,EAAUe,KAAK,aAAa,SAAShB,GACnC,IAAIgwC,EAAKrpB,EAAG3mB,GACZ,MAAO,gBAAkBy6B,SAASuV,GAAMA,EAAKppB,EAAG5mB,IAAM,OAG1Df,EAAGM,IAAIwmE,MAAQ,WACb,IAAoIC,EAAeC,EAA/IttD,EAAQQ,EAAiB4sD,EAAO,aAAc,QAAS,YAAapjE,EAAI,KAAMf,EAAI,KAAMskE,EAAU,CAAE,EAAG,GAAKC,EAAU,CAAE,EAAG,GAAmCC,GAAS,EAAMC,GAAS,EAAMC,EAAUC,GAAoB,GAC9N,SAASR,EAAM3kE,GACbA,EAAElB,MAAK,WACL,IAAIkB,EAAInC,EAAGyB,OAAOC,MAAMQ,MAAM,iBAAkB,OAAOA,MAAM,8BAA+B,iBAAiBG,GAAG,kBAAmBklE,GAAYllE,GAAG,mBAAoBklE,GAClKliE,EAAalD,EAAER,UAAU,eAAeT,KAAK,CAAE,IACnDmE,EAAWxD,QAAQC,OAAO,QAAQC,KAAK,QAAS,cAAcG,MAAM,aAAc,UAAUA,MAAM,SAAU,aAC5GC,EAAER,UAAU,WAAWT,KAAK,CAAE,IAAKW,QAAQC,OAAO,QAAQC,KAAK,QAAS,UAAUG,MAAM,SAAU,QAClG,IAAIslE,EAASrlE,EAAER,UAAU,WAAWT,KAAKmmE,EAASzvD,GAClD4vD,EAAO5nD,OAAO/O,SACd22D,EAAO3lE,QAAQC,OAAO,KAAKC,KAAK,SAAS,SAAShB,GAChD,MAAO,UAAYA,KAClBmB,MAAM,UAAU,SAASnB,GAC1B,OAAO0mE,GAAmB1mE,MACzBe,OAAO,QAAQC,KAAK,KAAK,SAAShB,GACnC,MAAO,QAAQ+H,KAAK/H,IAAM,EAAI,QAC7BgB,KAAK,KAAK,SAAShB,GACpB,MAAO,QAAQ+H,KAAK/H,IAAM,EAAI,QAC7BgB,KAAK,QAAS,GAAGA,KAAK,SAAU,GAAGG,MAAM,aAAc,UAC1DslE,EAAOtlE,MAAM,UAAW4kE,EAAMzuD,QAAU,OAAS,MACjD,IAA8E5B,EAA1EixD,EAAU1nE,EAAG6oB,WAAW1mB,GAAIwlE,EAAmB3nE,EAAG6oB,WAAWxjB,GAC7D3B,IACF+S,EAAQ4/C,GAAc3yD,GACtBikE,EAAiB5lE,KAAK,IAAK0U,EAAM,IAAI1U,KAAK,QAAS0U,EAAM,GAAKA,EAAM,IACpEmxD,EAAQF,IAEN/kE,IACF8T,EAAQ4/C,GAAc1zD,GACtBglE,EAAiB5lE,KAAK,IAAK0U,EAAM,IAAI1U,KAAK,SAAU0U,EAAM,GAAKA,EAAM,IACrEoxD,EAAQH,IAEVI,EAAOJ,MAyDX,SAASI,EAAO3lE,GACdA,EAAER,UAAU,WAAWI,KAAK,aAAa,SAAShB,GAChD,MAAO,aAAekmE,GAAS,KAAKn+D,KAAK/H,IAAM,IAAMmmE,GAAS,KAAKp+D,KAAK/H,IAAM,OAGlF,SAAS6mE,EAAQzlE,GACfA,EAAEV,OAAO,WAAWM,KAAK,IAAKklE,EAAQ,IACtC9kE,EAAER,UAAU,2BAA2BI,KAAK,QAASklE,EAAQ,GAAKA,EAAQ,IAE5E,SAASY,EAAQ1lE,GACfA,EAAEV,OAAO,WAAWM,KAAK,IAAKmlE,EAAQ,IACtC/kE,EAAER,UAAU,2BAA2BI,KAAK,SAAUmlE,EAAQ,GAAKA,EAAQ,IAE7E,SAASK,IACP,IAAyUlgD,EAAmC4Z,EAAxWn1B,EAASpK,KAAMqmE,EAAc/nE,EAAGyB,OAAOzB,EAAG0Z,MAAM5N,QAASk8D,EAAStuD,EAAMS,GAAGrO,EAAQI,WAAY/J,EAAInC,EAAGyB,OAAOqK,GAASm8D,EAAWF,EAAYr3D,QAASw3D,GAAa,UAAUp/D,KAAKm/D,IAAavkE,EAAGykE,GAAa,UAAUr/D,KAAKm/D,IAAatlE,EAAGylE,EAAWL,EAAYtpD,QAAQ,UAAW4F,EAAc/C,GAAsBxV,GAAiBwX,EAAStjB,EAAGyhB,MAAM3V,GAC/VhB,EAAI9K,EAAGyB,OAAO+P,EAAU1F,IAASzJ,GAAG,gBAAiBgmE,GAAShmE,GAAG,cAAeimE,GAOpF,GANItoE,EAAG0Z,MAAMoI,eACXhX,EAAEzI,GAAG,kBAAmBkmE,GAAWlmE,GAAG,iBAAkBmmE,GAExD19D,EAAEzI,GAAG,kBAAmBkmE,GAAWlmE,GAAG,gBAAiBmmE,GAEzDrmE,EAAEyhE,YAAYjiE,UAAU,KAAKiiE,YACzBwE,EACF9kD,EAAO,GAAK2jD,EAAQ,GAAK3jD,EAAO,GAChCA,EAAO,GAAK4jD,EAAQ,GAAK5jD,EAAO,QAC3B,GAAI2kD,EAAU,CACnB,IAAIQ,GAAM,KAAK3/D,KAAKm/D,GAAWS,GAAM,KAAK5/D,KAAKm/D,GAC/ChnC,EAAS,CAAEgmC,EAAQ,EAAIwB,GAAMnlD,EAAO,GAAI4jD,EAAQ,EAAIwB,GAAMplD,EAAO,IACjEA,EAAO,GAAK2jD,EAAQwB,GACpBnlD,EAAO,GAAK4jD,EAAQwB,QACX1oE,EAAG0Z,MAAMivD,SAAQthD,EAAS/D,EAAOtS,SAO5C,SAASq3D,IACiB,IAApBroE,EAAG0Z,MAAMkvD,UACNR,IACH/gD,EAAS,KACT/D,EAAO,IAAM2jD,EAAQ,GACrB3jD,EAAO,IAAM4jD,EAAQ,GACrBkB,EAAW,GAEbtuD,KAGJ,SAASwuD,IACiB,IAApBtoE,EAAG0Z,MAAMkvD,SAA6B,GAAZR,IAC5B9kD,EAAO,IAAM2jD,EAAQ,GACrB3jD,EAAO,IAAM4jD,EAAQ,GACrBkB,EAAW,EACXtuD,KAGJ,SAASyuD,IACP,IAAItmD,EAAQjiB,EAAGyhB,MAAM3V,GAASqY,GAAQ,EAClC8c,IACFhf,EAAM,IAAMgf,EAAO,GACnBhf,EAAM,IAAMgf,EAAO,IAEhBmnC,IACCpoE,EAAG0Z,MAAMivD,QACNthD,IAAQA,EAAS,EAAG4/C,EAAQ,GAAKA,EAAQ,IAAM,GAAIC,EAAQ,GAAKA,EAAQ,IAAM,IACnF5jD,EAAO,GAAK2jD,IAAUhlD,EAAM,GAAKoF,EAAO,KACxC/D,EAAO,GAAK4jD,IAAUjlD,EAAM,GAAKoF,EAAO,MACnCA,EAAS,MAEd6gD,GAAaW,EAAM5mD,EAAOve,EAAG,KAC/BkkE,EAAQzlE,GACRgiB,GAAQ,GAENgkD,GAAaU,EAAM5mD,EAAOtf,EAAG,KAC/BklE,EAAQ1lE,GACRgiB,GAAQ,GAENA,IACF2jD,EAAO3lE,GACP6lE,EAAO,CACLthE,KAAM,QACN6yD,KAAM6O,EAAW,OAAS,YAIhC,SAASS,EAAM5mD,EAAO9hB,EAAOkB,GAC3B,IAAoJmS,EAAKrP,EAArJsS,EAAQ4/C,GAAcl2D,GAAQ0mB,EAAKpQ,EAAM,GAAIqQ,EAAKrQ,EAAM,GAAIlO,EAAW+a,EAAOjiB,GAAIoS,EAASpS,EAAI6lE,EAAUD,EAASxvD,EAAOhE,EAAO,GAAKA,EAAO,GAiBhJ,GAhBI20D,IACFvhD,GAAMte,EACNue,GAAMrP,EAAOlP,GAEfiL,GAAOnS,EAAI+lE,EAASD,GAAU5lE,KAAK4C,IAAI0iB,EAAItlB,KAAKiS,IAAIsT,EAAI7E,EAAM5gB,KAAO4gB,EAAM5gB,GACvE+mE,EACFjkE,GAAOqP,GAAOjL,GAAYkP,GAEtB4P,IAAQ9e,EAAWhH,KAAK4C,IAAI0iB,EAAItlB,KAAKiS,IAAIsT,EAAI,EAAIO,EAAOhmB,GAAKmS,KAC7DjL,EAAWiL,GACbrP,EAAMqP,EACNA,EAAMjL,GAENpE,EAAMoE,GAGNkL,EAAO,IAAMD,GAAOC,EAAO,IAAMtP,EAInC,OAHI9C,EAAG2lE,EAAgB,KAAWD,EAAgB,KAClDtzD,EAAO,GAAKD,EACZC,EAAO,GAAKtP,GACL,EAGX,SAASqkE,IACPD,IACApmE,EAAED,MAAM,iBAAkB,OAAOP,UAAU,WAAWO,MAAM,UAAW4kE,EAAMzuD,QAAU,OAAS,MAChGrY,EAAGyB,OAAO,QAAQS,MAAM,SAAU,MAClC4I,EAAEzI,GAAG,kBAAmB,MAAMA,GAAG,gBAAiB,MAAMA,GAAG,kBAAmB,MAAMA,GAAG,iBAAkB,MAAMA,GAAG,gBAAiB,MAAMA,GAAG,cAAe,MAC3JgiB,IACA2jD,EAAO,CACLthE,KAAM,aAtFVvE,EAAED,MAAM,iBAAkB,QAAQP,UAAU,WAAWO,MAAM,UAAW,MACxElC,EAAGyB,OAAO,QAAQS,MAAM,SAAU6lE,EAAY7lE,MAAM,WACpD8lE,EAAO,CACLthE,KAAM,eAER6hE,IAyJF,OAnPAzB,EAAMptD,MAAQ,SAASvX,GACrBA,EAAElB,MAAK,WACL,IAAI+mE,EAAStuD,EAAMS,GAAGzY,KAAMwK,WAAY48D,EAAU,CAChDplE,EAAGujE,EACHtkE,EAAGukE,EACH7lE,EAAG0lE,EACHzjE,EAAG0jE,GACF+B,EAAUrnE,KAAKinB,WAAamgD,EAC/BpnE,KAAKinB,UAAYmgD,EACbh+C,GACF9qB,EAAGyB,OAAOC,MAAMmnB,aAAa5nB,KAAK,eAAe,WAC/C8lE,EAAgBgC,EAAQ1nE,EACxB2lE,EAAgB+B,EAAQzlE,EACxB2jE,EAAU8B,EAAQrlE,EAClBwjE,EAAU6B,EAAQpmE,EAClBqlE,EAAO,CACLthE,KAAM,kBAEPqkB,MAAM,eAAe,WACtB,IAAIsxC,EAAKjT,GAAoB6d,EAAS6B,EAAQplE,GAAIslE,EAAK5f,GAAoB8d,EAAS4B,EAAQnmE,GAE5F,OADAokE,EAAgBC,EAAgB,KACzB,SAASnkE,GACdokE,EAAU6B,EAAQplE,EAAI24D,EAAGx5D,GACzBqkE,EAAU4B,EAAQnmE,EAAIqmE,EAAGnmE,GACzBmlE,EAAO,CACLthE,KAAM,QACN6yD,KAAM,eAGTt4D,KAAK,aAAa,WACnB8lE,EAAgB+B,EAAQznE,EACxB2lE,EAAgB8B,EAAQxlE,EACxB0kE,EAAO,CACLthE,KAAM,QACN6yD,KAAM,WAERyO,EAAO,CACLthE,KAAM,iBAIVshE,EAAO,CACLthE,KAAM,eAERshE,EAAO,CACLthE,KAAM,QACN6yD,KAAM,WAERyO,EAAO,CACLthE,KAAM,kBA8HdogE,EAAMpjE,EAAI,SAASyE,GACjB,OAAK+D,UAAUwB,QAEf25D,EAAUC,KADV5jE,EAAIyE,IACgC,GAAKxF,GAClCmkE,GAHuBpjE,GAKhCojE,EAAMnkE,EAAI,SAASwF,GACjB,OAAK+D,UAAUwB,QAEf25D,EAAUC,IAAqB5jE,GAAK,IADpCf,EAAIwF,IAEG2+D,GAHuBnkE,GAKhCmkE,EAAM3L,MAAQ,SAAShzD,GACrB,OAAK+D,UAAUwB,QACXhK,GAAKf,GAAGwkE,IAAWh/D,EAAE,GAAIi/D,IAAWj/D,EAAE,IAAazE,EAAGyjE,IAAWh/D,EAAYxF,IAAGykE,IAAWj/D,GACxF2+D,GAFuBpjE,GAAKf,EAAI,CAAEwkE,EAAQC,GAAW1jE,EAAIyjE,EAASxkE,EAAIykE,EAAS,MAIxFN,EAAMrzD,OAAS,SAAStL,GACtB,IAAIqf,EAAIC,EAAIC,EAAIC,EAAI9kB,EACpB,OAAKqJ,UAAUwB,QAqBXhK,IACF8jB,EAAKrf,EAAE,GAAIsf,EAAKtf,EAAE,GACdxF,IAAG6kB,EAAKA,EAAG,GAAIC,EAAKA,EAAG,IAC3Bs/C,EAAgB,CAAEv/C,EAAIC,GAClB/jB,EAAEslB,SAAQxB,EAAK9jB,EAAE8jB,GAAKC,EAAK/jB,EAAE+jB,IAC7BA,EAAKD,IAAI3kB,EAAI2kB,EAAIA,EAAKC,EAAIA,EAAK5kB,GAC/B2kB,GAAMy/C,EAAQ,IAAMx/C,GAAMw/C,EAAQ,KAAIA,EAAU,CAAEz/C,EAAIC,KAExD9kB,IACF+kB,EAAKvf,EAAE,GAAIwf,EAAKxf,EAAE,GACdzE,IAAGgkB,EAAKA,EAAG,GAAIC,EAAKA,EAAG,IAC3Bq/C,EAAgB,CAAEt/C,EAAIC,GAClBhlB,EAAEqmB,SAAQtB,EAAK/kB,EAAE+kB,GAAKC,EAAKhlB,EAAEglB,IAC7BA,EAAKD,IAAI7kB,EAAI6kB,EAAIA,EAAKC,EAAIA,EAAK9kB,GAC/B6kB,GAAMw/C,EAAQ,IAAMv/C,GAAMu/C,EAAQ,KAAIA,EAAU,CAAEx/C,EAAIC,KAErDm/C,IApCDpjE,IACEqjE,GACFv/C,EAAKu/C,EAAc,GAAIt/C,EAAKs/C,EAAc,KAE1Cv/C,EAAKy/C,EAAQ,GAAIx/C,EAAKw/C,EAAQ,GAC1BvjE,EAAEslB,SAAQxB,EAAK9jB,EAAEslB,OAAOxB,GAAKC,EAAK/jB,EAAEslB,OAAOvB,IAC3CA,EAAKD,IAAI3kB,EAAI2kB,EAAIA,EAAKC,EAAIA,EAAK5kB,KAGnCF,IACEqkE,GACFt/C,EAAKs/C,EAAc,GAAIr/C,EAAKq/C,EAAc,KAE1Ct/C,EAAKw/C,EAAQ,GAAIv/C,EAAKu/C,EAAQ,GAC1BvkE,EAAEqmB,SAAQtB,EAAK/kB,EAAEqmB,OAAOtB,GAAKC,EAAKhlB,EAAEqmB,OAAOrB,IAC3CA,EAAKD,IAAI7kB,EAAI6kB,EAAIA,EAAKC,EAAIA,EAAK9kB,KAGhCa,GAAKf,EAAI,CAAE,CAAE6kB,EAAIE,GAAM,CAAED,EAAIE,IAASjkB,EAAI,CAAE8jB,EAAIC,GAAO9kB,GAAK,CAAE+kB,EAAIC,KAoB7Em/C,EAAMmC,MAAQ,WAKZ,OAJKnC,EAAMzuD,UACT4uD,EAAU,CAAE,EAAG,GAAKC,EAAU,CAAE,EAAG,GACnCH,EAAgBC,EAAgB,MAE3BF,GAETA,EAAMzuD,MAAQ,WACZ,QAAS3U,GAAKujE,EAAQ,IAAMA,EAAQ,MAAQtkE,GAAKukE,EAAQ,IAAMA,EAAQ,IAElElnE,EAAGmZ,OAAO2tD,EAAOptD,EAAO,OAEjC,IAAI+tD,GAAqB,CACvBzkE,EAAG,YACH+H,EAAG,YACHI,EAAG,YACHL,EAAG,YACHo+D,GAAI,cACJC,GAAI,cACJC,GAAI,cACJC,GAAI,eAEF/B,GAAsB,CAAE,CAAE,IAAK,IAAK,IAAK,IAAK,KAAM,KAAM,KAAM,MAAQ,CAAE,IAAK,KAAO,CAAE,IAAK,KAAO,IACpGjlC,GAAiBjE,GAAQ9Q,OAAS8Y,GAAeD,WACjDmjC,GAAoBjnC,GAAejB,IACnCmoC,GAAoBD,GAAkB,yBAE1C,SAASE,GAAwBzoC,GAC/B,OAAOA,EAAK0oC,cA8Cd,SAASC,GAAchgB,EAAQlP,EAASltB,GACtC,SAASntB,EAAMuD,GACb,OAAOgmD,EAAOhmD,GAUhB,SAASimE,EAAWl2D,EAAQwwD,GAC1B,IAAkCn4D,GAAvB2H,EAAO,GAAKA,EAAO,IAAoBwwD,EAAO5iE,EAAIrB,EAAGwU,OAAOo1D,GAAoB99D,GAC3F,OAAOzK,GAAKuoE,GAAmBl8D,OAAS,CAAE8sC,EAAQrV,KAAMu1B,GAAyBjnD,EAAOgC,KAAI,SAAS1U,GACnG,OAAOA,EAAI,WACTkjE,GAAO,IAAQ5iE,EAAgFm5C,EAAQ1uC,EAAS89D,GAAmBvoE,EAAI,GAAKuoE,GAAmBvoE,GAAKyK,EAASzK,EAAI,EAAIA,GAAlK,CAAEwoE,GAA2BnP,GAAyBjnD,EAAQwwD,GAAO,IAgC9F,OA5CA9jE,EAAM6oB,OAAS,SAAStlB,GACtB,OAAOomE,GAAkBpgB,EAAO1gC,OAAOtlB,KAEzCvD,EAAM4oB,OAAS,SAASrlB,GACtB,OAAKwI,UAAUwB,QACfg8C,EAAO3gC,OAAOrlB,GACPvD,GAFuBupD,EAAO3gC,SAAStT,IAAIq0D,KAUpD3pE,EAAMu2D,KAAO,SAASpxB,EAAUykC,GAC9B,IAAIhhD,EAAS5oB,EAAM4oB,SAAUtV,EAAS2iD,GAAertC,GAASphB,EAAqB,MAAZ29B,EAAmBqkC,EAAWl2D,EAAQ,IAA0B,iBAAb6xB,GAAyBqkC,EAAWl2D,EAAQ6xB,GAEtK,SAAS0kC,EAAQjpC,GACf,OAAQ/tB,MAAM+tB,KAAUuE,EAAS7uB,MAAMsqB,EAAM+oC,IAAmB/oC,EAAO,GAAIgpC,GAAMr8D,OAEnF,OAJI/F,IAAQ29B,EAAW39B,EAAO,GAAIoiE,EAAOpiE,EAAO,IAIzCxH,EAAM4oB,OAAO0tC,GAAc1tC,EAAQghD,EAAO,EAAI,CACnDh2D,MAAO,SAASgtB,GACd,KAAOipC,EAAQjpC,EAAOuE,EAASvxB,MAAMgtB,KAAQA,EAAO+oC,GAAkB/oC,EAAO,GAC7E,OAAOA,GAETvW,KAAM,SAASuW,GACb,KAAOipC,EAAQjpC,EAAOuE,EAAS9a,KAAKuW,KAAQA,EAAO+oC,IAAmB/oC,EAAO,GAC7E,OAAOA,IAEPuE,KAENnlC,EAAMk7D,MAAQ,SAAS/1B,EAAUykC,GAC/B,IAAIt2D,EAAS2iD,GAAej2D,EAAM4oB,UAAWphB,EAAqB,MAAZ29B,EAAmBqkC,EAAWl2D,EAAQ,IAA0B,iBAAb6xB,EAAwBqkC,EAAWl2D,EAAQ6xB,IAAaA,EAAS7uB,OAAS,CAAE,CACnLA,MAAO6uB,GACNykC,GAEH,OADIpiE,IAAQ29B,EAAW39B,EAAO,GAAIoiE,EAAOpiE,EAAO,IACzC29B,EAAS7uB,MAAMhD,EAAO,GAAIq2D,IAAmBr2D,EAAO,GAAK,GAAIs2D,EAAO,EAAI,EAAIA,IAErF5pE,EAAMm7D,WAAa,WACjB,OAAOhuC,GAETntB,EAAM+qB,KAAO,WACX,OAAOw+C,GAAchgB,EAAOx+B,OAAQsvB,EAASltB,IAExCktC,GAAsBr6D,EAAOupD,GAEtC,SAASogB,GAAkBjnE,GACzB,OAAO,IAAI+O,KAAK/O,GAnGlBw/B,GAAe4nC,IAAMr4D,KAAKpN,UAAUilE,cAAgB,IAAI73D,KAAK,4BAA8B43D,GAA0BD,GAIrHC,GAAwBlwC,MAAQ,SAASiJ,GACvC,IAAIxB,EAAO,IAAInvB,KAAK2wB,GACpB,OAAOvvB,MAAM+tB,GAAQ,KAAOA,GAE9ByoC,GAAwBj+C,SAAWg+C,GAAkBh+C,SACrD6S,GAAQ8rC,OAASrpC,IAAiB,SAASE,GACzC,OAAO,IAAI1C,GAAiC,IAAzB98B,KAAKwS,MAAMgtB,EAAO,SACpC,SAASA,EAAME,GAChBF,EAAKH,QAAQG,EAAKvB,UAAiC,IAArBj+B,KAAKwS,MAAMktB,OACxC,SAASF,GACV,OAAOA,EAAKzB,gBAEdlB,GAAQ+rC,QAAU/rC,GAAQ8rC,OAAOzzD,MACjC2nB,GAAQ+rC,QAAQ/oC,IAAMhD,GAAQ8rC,OAAO9oC,IAAI3qB,MACzC2nB,GAAQgsC,OAASvpC,IAAiB,SAASE,GACzC,OAAO,IAAI1C,GAAiC,IAAzB98B,KAAKwS,MAAMgtB,EAAO,SACpC,SAASA,EAAME,GAChBF,EAAKH,QAAQG,EAAKvB,UAAiC,IAArBj+B,KAAKwS,MAAMktB,OACxC,SAASF,GACV,OAAOA,EAAK7B,gBAEdd,GAAQisC,QAAUjsC,GAAQgsC,OAAO3zD,MACjC2nB,GAAQisC,QAAQjpC,IAAMhD,GAAQgsC,OAAOhpC,IAAI3qB,MACzC2nB,GAAQksC,KAAOzpC,IAAiB,SAASE,GACvC,IAAIwpC,EAAWxpC,EAAKtB,oBAAsB,GAC1C,OAAO,IAAIpB,GAA0D,MAAjD98B,KAAKwS,MAAMgtB,EAAO,KAAOwpC,GAAYA,OACxD,SAASxpC,EAAME,GAChBF,EAAKH,QAAQG,EAAKvB,UAAiC,KAArBj+B,KAAKwS,MAAMktB,OACxC,SAASF,GACV,OAAOA,EAAKjC,cAEdV,GAAQosC,MAAQpsC,GAAQksC,KAAK7zD,MAC7B2nB,GAAQosC,MAAMppC,IAAMhD,GAAQksC,KAAKlpC,IAAI3qB,MACrC2nB,GAAQqsC,MAAQ5pC,IAAiB,SAASE,GAGxC,OAFAA,EAAO3C,GAAQgH,IAAIrE,IACdpB,QAAQ,GACNoB,KACN,SAASA,EAAME,GAChBF,EAAKP,SAASO,EAAK3B,WAAa6B,MAC/B,SAASF,GACV,OAAOA,EAAK3B,cAEdhB,GAAQ8D,OAAS9D,GAAQqsC,MAAMh0D,MAC/B2nB,GAAQ8D,OAAOd,IAAMhD,GAAQqsC,MAAMrpC,IAAI3qB,MAsDvC,IAAImzD,GAAqB,CAAE,IAAK,IAAK,KAAM,IAAK,IAAK,IAAK,IAAK,KAAM,KAAM,MAAO,MAAO,MAAO,MAAO,OAAQ,OAAQ,OAAQ,OAAQ,SACnIc,GAA4B,CAAE,CAAEtsC,GAAQ8rC,OAAQ,GAAK,CAAE9rC,GAAQ8rC,OAAQ,GAAK,CAAE9rC,GAAQ8rC,OAAQ,IAAM,CAAE9rC,GAAQ8rC,OAAQ,IAAM,CAAE9rC,GAAQgsC,OAAQ,GAAK,CAAEhsC,GAAQgsC,OAAQ,GAAK,CAAEhsC,GAAQgsC,OAAQ,IAAM,CAAEhsC,GAAQgsC,OAAQ,IAAM,CAAEhsC,GAAQksC,KAAM,GAAK,CAAElsC,GAAQksC,KAAM,GAAK,CAAElsC,GAAQksC,KAAM,GAAK,CAAElsC,GAAQksC,KAAM,IAAM,CAAElsC,GAAQgH,IAAK,GAAK,CAAEhH,GAAQgH,IAAK,GAAK,CAAEhH,GAAQmH,KAAM,GAAK,CAAEnH,GAAQqsC,MAAO,GAAK,CAAErsC,GAAQqsC,MAAO,GAAK,CAAErsC,GAAQ+G,KAAM,IACxawlC,GAA2BtoC,GAAea,MAAM,CAAE,CAAE,MAAO,SAASniC,GACtE,OAAOA,EAAEi+B,oBACN,CAAE,MAAO,SAASj+B,GACrB,OAAOA,EAAEu+B,eACN,CAAE,QAAS,SAASv+B,GACvB,OAAOA,EAAEm+B,eACN,CAAE,QAAS,SAASn+B,GACvB,OAAOA,EAAE+9B,aACN,CAAE,QAAS,SAAS/9B,GACvB,OAAOA,EAAE29B,UAA2B,GAAf39B,EAAEy9B,YACpB,CAAE,QAAS,SAASz9B,GACvB,OAAsB,GAAfA,EAAEy9B,YACN,CAAE,KAAM,SAASz9B,GACpB,OAAOA,EAAEq+B,aACN,CAAE,KAAM8N,MACT28B,GAA4B,CAC9BpzD,MAAO,SAASC,EAAOC,EAAMC,GAC3B,OAAO5W,EAAGyW,MAAMlV,KAAKipB,KAAK9T,EAAQE,GAAQA,GAAOD,EAAMC,GAAMnB,IAAIq0D,KAEnE/1D,MAAO6D,EACP4S,KAAM5S,GAER8yD,GAA0BvlC,KAAO/G,GAAQ+G,KACzC/G,GAAQj+B,MAAQ,WACd,OAAOupE,GAAc1pE,EAAGG,MAAMupD,SAAUghB,GAA2BC,KAErE,IAAIC,GAA0BF,GAA0Bj1D,KAAI,SAASvK,GACnE,MAAO,CAAEA,EAAE,GAAGk2B,IAAKl2B,EAAE,OAEnB2/D,GAAyBvB,GAAkBpmC,MAAM,CAAE,CAAE,MAAO,SAASniC,GACvE,OAAOA,EAAEk+B,uBACN,CAAE,MAAO,SAASl+B,GACrB,OAAOA,EAAEw+B,kBACN,CAAE,QAAS,SAASx+B,GACvB,OAAOA,EAAEo+B,kBACN,CAAE,QAAS,SAASp+B,GACvB,OAAOA,EAAEg+B,gBACN,CAAE,QAAS,SAASh+B,GACvB,OAAOA,EAAE49B,aAAiC,GAAlB59B,EAAE09B,eACvB,CAAE,QAAS,SAAS19B,GACvB,OAAyB,GAAlBA,EAAE09B,eACN,CAAE,KAAM,SAAS19B,GACpB,OAAOA,EAAEs+B,gBACN,CAAE,KAAM6N,MAWb,SAAS49B,GAAQvzC,GACf,OAAOqC,KAAKN,MAAM/B,EAAQM,cAK5B,SAASkzC,GAAQxzC,GACf,IAAI9gB,EAAQtF,EAAY65D,cAExB,OADAv0D,EAAMw0D,WAAW95D,EAAYpJ,MACtB0O,EAAMy0D,yBAAyB3zC,EAAQM,cAnBhD+yC,GAAwBzlC,KAAO/G,GAAQ+G,KAAK/D,IAC5ChD,GAAQj+B,MAAMihC,IAAM,WAClB,OAAOsoC,GAAc1pE,EAAGG,MAAMupD,SAAUkhB,GAAyBC,KAEnE7qE,EAAGgC,KAAOi1B,IAAW,SAASM,GAC5B,OAAOA,EAAQM,gBAEjB73B,EAAGmrE,KAAO,SAASxkE,EAAK8C,GACtB,OAAO2tB,GAAOzwB,EAAK,mBAAoBmkE,GAASrhE,IAKlDzJ,EAAG8e,KAAO,SAASnY,EAAK8C,GACtB,OAAO2tB,GAAOzwB,EAAK,YAAaokE,GAASthE,IAO3CzJ,EAAGqc,IAAM4a,IAAW,SAASM,GAC3B,OAAOA,EAAQ6zC,eAE+B1pE,KAAK1B,GAAKA,OAAa,0BAAT,KAAS,kCAh1SzE,I,kCCAA,QAeA,EAAO,CAAC,gBA41xBP,KA51xBsC,EAAF,SAAWqrE,GAC3C,IAAS7kB,EAAM8kB,EAAN9kB,EAQU,oBAAXniD,OAAyBA,OAAS3C,KAR3B4pE,EAQiC,SAASC,GACtD,IAioEUz3D,EAMF7S,EACAuqE,EACA/1D,EACAxR,EACAwnE,EA3oEJhpE,EAAc,WAOd,IAAI8oE,EAAMlnE,OACNqnE,EAAMH,EAAInnE,SAEVunE,EAAS,6BACT9pD,EAAa0pD,EAAI3pD,WAAa2pD,EAAI3pD,UAAUC,WAAc,GAC1DvhB,EAAMorE,GAAOA,EAAIpjE,mBAAqBojE,EAAIpjE,gBAAgBqjE,EAAQ,OAAOC,cACzEC,EAAO,uBAAuB/iE,KAAK+Y,KAAexd,OAAOynE,MACzDC,GAAOzrE,EACP0rE,EAAY,UAAUljE,KAAK+Y,GAC3BoqD,EAAaD,GAAajjE,SAAS8Y,EAAU5E,MAAM,YAAY,GAAI,IAAM,EAiC7E,OA/BiBsuD,EAAI9oE,WAAa8oE,EAAI9oE,WAAWsP,MAAM,IAAI,GAAQ,CAC/Dm6D,QAAS,aACTp7D,QAAS,SACTq7D,QAAmB,EAAV5qE,KAAKsjB,GAAS,IACvB6mD,IAAKA,EACLO,WAAYA,EACZG,SAAUV,QAA4CW,IAArCX,EAAIn6D,gBAAgB5D,aACrCk+D,KAAMA,EACNS,SAAU,cAAcxjE,KAAK+Y,GAC7BmqD,UAAWA,EACX1nE,cAAe,iCAAiCwE,KAAK+Y,GACrD8pD,OAAQA,EACRY,WAAY,EACZC,YAAa,GACbC,YAAa,GACbnsE,IAAKA,EACLyrE,IAAKA,EACLR,IAAKA,EACLmB,YAAa,CAAC,UAAW,cAAe,eAAgB,YACxDC,KAAM,aAUN39D,OAAQ,IA/CC,IAmDhB,SAAS8E,GAmBN,IAi7DQ84D,EACAC,EAl7DJC,EAAS,GAET99D,EAAS8E,EAAE9E,OACX08D,EAAM53D,EAAE43D,IACRH,EAAMz3D,EAAEy3D,IAiBZz3D,EAAE/B,MAAQ,SAASo/B,EAAMx6B,GACrB,IAAIo2D,EAAMj5D,EAAE03D,SAASr6B,GACjB,qBAAuBA,EAAO,+BAAiCA,EAC/DA,EACJ,GAAIx6B,EACA,MAAM,IAAIG,MAAMi2D,GAGhBxB,EAAIyB,SACJA,QAAQvmD,IAAIsmD,IAoBpBj5D,EAAEm5D,GAAK,SAASC,EAAM7kE,EAAS8kE,GAC3BzrE,KAAK2G,QAAUA,EACf3G,KAAKwrE,KAAOA,EACZxrE,KAAKyrE,KAAOA,GAEhBr5D,EAAEm5D,GAAGzoE,UAAY,CAQb4oE,QAAS,WACL,IAKIC,EALA32D,EAAQhV,KAAKitD,MAAM,GACnB/qC,EAAMliB,KAAKitD,MAAM,GACjB2e,EAAM,GACNz7D,EAAMnQ,KAAKmQ,IACXxQ,EAAIqV,EAAMhJ,OAId,GAAY,IAARmE,EACAy7D,EAAM5rE,KAAK6rE,SAER,GAAIlsE,IAAMuiB,EAAIlW,QAAUmE,EAAM,EACjC,KAAOxQ,KACHgsE,EAAW7/C,WAAW9W,EAAMrV,IAC5BisE,EAAIjsE,GACA2R,MAAMq6D,GACN32D,EAAMrV,GACNwQ,EAAO2b,WAAW5J,EAAIviB,GAAKgsE,GAAaA,OAKhDC,EAAM1pD,EAEVliB,KAAKwrE,KAAKnrE,KAAK,IAAKurE,EAAK,MAAM,IASnC3tD,OAAQ,WACJ,IAAIutD,EAAOxrE,KAAKwrE,KACZC,EAAOzrE,KAAKyrE,KACZt7D,EAAMnQ,KAAKmQ,IACX+E,EAAOlV,KAAK2G,QAAQuO,KAGpBlV,KAAKyrE,EAAO,UACZzrE,KAAKyrE,EAAO,YAGLD,EAAKnrE,KACRmrE,EAAKM,SACLN,EAAKnrE,KAAKorE,EAAMt7D,EAAK,MAAM,GAK/Bq7D,EAAKhrE,MAAMirE,GAAQt7D,EAAMnQ,KAAKg8B,KAG9B9mB,GACAA,EAAKjG,KAAKu8D,EAAMr7D,EAAKnQ,OAe7B+rE,IAAK,SAASl9B,EAAMC,EAAI9S,GACpB,IAIIr8B,EAJAuhE,EAAOlhE,KACP05B,EAAQ,SAASsyC,GACb,OAAOtyC,EAAMuyC,SAAkB/K,EAAKhsD,KAAK82D,IAIjDhsE,KAAKksE,WAAa,IAAIh8D,KACtBlQ,KAAKgV,MAAQ65B,EACb7uC,KAAKkiB,IAAM4sB,EACX9uC,KAAKg8B,KAAOA,EACZh8B,KAAKmQ,IAAMnQ,KAAKgV,MAChBhV,KAAKmsE,IAAM,EAEXzyC,EAAM8xC,KAAOxrE,KAAKwrE,KAClB9xC,EAAM+xC,KAAOzrE,KAAKyrE,KAEd/xC,KAAkC,IAAvB0xC,EAAOtjE,KAAK4xB,KACvBA,EAAM0yC,QAAUC,aAAY,WAExB,IAAK1sE,EAAI,EAAGA,EAAIyrE,EAAOp/D,OAAQrM,IACtByrE,EAAOzrE,MACRyrE,EAAOloB,OAAOvjD,IAAK,GAItByrE,EAAOp/D,QACRsgE,cAAc5yC,EAAM0yC,WAEzB,MAaXl3D,KAAM,SAAS82D,GACX,IACIJ,EACAW,EAFAprE,GAAK,IAAI+O,KAGTvJ,EAAU3G,KAAK2G,QACf6kE,EAAOxrE,KAAKwrE,KACZgB,EAAW7lE,EAAQ6lE,SACnBjnD,EAAW5e,EAAQ4e,SACnBknD,EAAU9lE,EAAQ8lE,QA+BtB,OA7BIjB,EAAKnrE,OAASmrE,EAAKM,QACnBF,GAAM,EAECI,GAAW7qE,GAAKokB,EAAWvlB,KAAKksE,WACvClsE,KAAKmQ,IAAMnQ,KAAKkiB,IAChBliB,KAAKmsE,IAAM,EACXnsE,KAAKie,SAELwuD,EAAQzsE,KAAKyrE,OAAQ,EAErBc,GAAO,EAEPn6D,EAAEs6D,WAAWD,GAAS,SAASE,IACf,IAARA,IACAJ,GAAO,MAIXA,GAAQC,GACRA,EAASv9D,KAAKu8D,GAElBI,GAAM,IAGN5rE,KAAKmsE,IAAMxlE,EAAQimE,QAAQzrE,EAAInB,KAAKksE,WAAa3mD,GACjDvlB,KAAKmQ,IAAMnQ,KAAKgV,OAAUhV,KAAKkiB,IAAMliB,KAAKgV,OAAShV,KAAKmsE,IACxDnsE,KAAKie,SACL2tD,GAAM,GAEHA,GAcXiB,SAAU,SAASrB,EAAMsB,EAAOjB,GAC5BiB,EAAQA,GAAS,GACjB,IAAI5+B,EAKA6+B,EACAz9D,EACA3P,EAKAs7B,EAXA+xC,EAASxB,EAAKwB,OACdC,EAAOzB,EAAKyB,KACZC,EAASJ,EAAM50D,QAAQ,MAAQ,EAC/Bi1D,EAAYD,EAAS,EAAI,EAIzBl4D,EAAQ83D,EAAMvxD,MAAM,KACpB2G,EAAM2pD,EAAIv8D,QACV89D,EAAS5B,EAAK4B,OACdC,EAAiBD,EAAS,EAAI,EAOlC,SAASE,EAAOC,GACZ,IAAIC,EACAC,EAEJ,IADA9tE,EAAI4tE,EAAIvhE,OACDrM,KAIH6tE,EAAwB,MAAXD,EAAI5tE,IAAyB,MAAX4tE,EAAI5tE,GACnC8tE,EAAiB,WAAWrmE,KAAKmmE,EAAI5tE,EAAI,IACrC6tE,GAAcC,GACdF,EAAIrqB,OACAvjD,EAAI,EAAG,EACP4tE,EAAI5tE,EAAI,GAAI4tE,EAAI5tE,EAAI,GACpB4tE,EAAI5tE,EAAI,GAAI4tE,EAAI5tE,EAAI,IASpC,SAAS+tE,EAAYH,EAAKI,EAAQ9sE,GAC9B,GAAGqiD,OAAO34C,MACNgjE,EAAK,CAAC1sE,EAAO,GAAGsX,OAAOw1D,IAO/B,SAASC,EAAQL,EAAKlhC,GAClB,KAAOkhC,EAAIvhE,OAAS+gE,GAGhBQ,EAAI,GAAKlhC,EAAM0gC,EAAaQ,EAAIvhE,QAGhC0hE,EAAYH,EAAKA,EAAIj+D,MAAM,EAAG69D,GAAY,GAItCC,IACAM,EACIH,EACAA,EAAIj+D,MAAMi+D,EAAIvhE,OAASmhE,GAAYI,EAAIvhE,QAE3CrM,KAGR4tE,EAAI,GAAK,IAMb,SAASntE,EAAOmtE,EAAKlhC,GAEjB,IADA,IAAI1sC,GAAKotE,EAAaQ,EAAIvhE,QAAUmhE,EAC7BxtE,EAAI,GAAKA,MAQZ2P,EAAQi+D,EAAIj+D,QAAQ4zC,OACfqqB,EAAIvhE,OAASqhE,EAAkBF,EAChCA,EAAYE,IAIV,GAAKhhC,EAAM0gC,EAAaI,EAAaxtE,EAAIwtE,GAG3CD,IACA59D,EAAM69D,EAAY,GAAK79D,EAAM69D,EAAY,GACzC79D,EAAM69D,EAAY,GAAK79D,EAAM69D,EAAY,IAK7CO,EAAYH,EAAKj+D,EAAOi+D,EAAIvhE,OAASqhE,GAEjCD,GACAztE,IAYZ,GAPIutE,IACAI,EAAOt4D,GACPs4D,EAAOprD,IAKP8qD,GAAUC,EAAM,CAChB,IAAKttE,EAAI,EAAGA,EAAIqtE,EAAOhhE,OAAQrM,IAAK,CAEhC,GAAIqtE,EAAOrtE,KAAOstE,EAAK,GAAI,CACvB/+B,EAAQvuC,EACR,MAEG,GAAIqtE,EAAO,KACdC,EAAKA,EAAKjhE,OAASghE,EAAOhhE,OAASrM,GAAI,CACvCuuC,EAAQvuC,EACRs7B,GAAU,EACV,YAGM0vC,IAAVz8B,IACAl5B,EAAQ,IAmBhB,OAfIA,EAAMhJ,QAAUoG,EAAE03D,SAAS57B,KAI3B6+B,EAAa7qD,EAAIlW,OAASkiC,EAAQm/B,EAAiBF,EAE9ClyC,GAID2yC,EAAQ54D,EAAOkN,GACf9hB,EAAO8hB,EAAKlN,KAJZ44D,EAAQ1rD,EAAKlN,GACb5U,EAAO4U,EAAOkN,KAOf,CAAClN,EAAOkN,KAOvB9P,EAAEm5D,GAAGzoE,UAAU+qE,WACXz7D,EAAEm5D,GAAGzoE,UAAUgrE,aAAe,WAC1B9tE,KAAKwrE,KAAKnrE,KACNL,KAAKyrE,KACLr5D,EAAE5T,MAAMwB,KAAKgV,OAAO+4D,QAAQ37D,EAAE5T,MAAMwB,KAAKkiB,KAAMliB,KAAKmsE,KACpD,MACA,IAcZ/5D,EAAE5P,OAAS,SAASuD,EAAGC,GACnB,IAAI1E,EAIJ,IAAKA,KAHAyE,IACDA,EAAI,IAEEC,EACND,EAAEzE,GAAK0E,EAAE1E,GAEb,OAAOyE,GAmBXqM,EAAE7P,MAAQ,WACN,IAAI5C,EAEAquE,EADA1vD,EAAO9T,UAEPohE,EAAM,GACNqC,EAAS,SAASzkD,EAAM0kD,GAqBpB,MAnBoB,iBAAT1kD,IACPA,EAAO,IAGXpX,EAAEs6D,WAAWwB,GAAU,SAAS9uE,EAAO4U,IAI/B5B,EAAE+7D,SAAS/uE,GAAO,IACjBgT,EAAEg8D,QAAQhvE,IACVgT,EAAEi8D,aAAajvE,GAMhBoqB,EAAKxV,GAAOk6D,EAASl6D,GAJrBwV,EAAKxV,GAAOi6D,EAAOzkD,EAAKxV,IAAQ,GAAI5U,MAOrCoqB,GAYf,KAPgB,IAAZlL,EAAK,KACLstD,EAAMttD,EAAK,GACXA,EAAOrO,MAAMnN,UAAUwM,MAAML,KAAKqP,EAAM,IAI5C0vD,EAAM1vD,EAAKtS,OACNrM,EAAI,EAAGA,EAAIquE,EAAKruE,IACjBisE,EAAMqC,EAAOrC,EAAKttD,EAAK3e,IAG3B,OAAOisE,GASXx5D,EAAE23D,KAAO,SAAStgE,EAAG6kE,GACjB,OAAOjnE,SAASoC,EAAG6kE,GAAO,KAW9Bl8D,EAAEm8D,SAAW,SAAS9kE,GAClB,MAAoB,iBAANA,GAWlB2I,EAAEoD,QAAU,SAASg5D,GACjB,IAAIC,EAAMh6D,OAAO3R,UAAU+mB,SAAS5a,KAAKu/D,GACzC,MAAe,mBAARC,GAAoC,4BAARA,GAavCr8D,EAAE+7D,SAAW,SAASK,EAAKE,GACvB,SAASF,GAAsB,iBAARA,GAAsBE,GAAWt8D,EAAEoD,QAAQg5D,KAWtEp8D,EAAEi8D,aAAe,SAASG,GACtB,OAAOp8D,EAAE+7D,SAASK,IAAgC,iBAAjBA,EAAIzlE,UAWzCqJ,EAAEg8D,QAAU,SAASI,GACjB,IAAI1oE,EAAI0oE,GAAOA,EAAIG,YACnB,SACIv8D,EAAE+7D,SAASK,GAAK,IACfp8D,EAAEi8D,aAAaG,KACf1oE,IAAKA,EAAEQ,MAAmB,WAAXR,EAAEQ,OAY1B8L,EAAE03D,SAAW,SAASxoE,GAClB,MAAoB,iBAANA,IAAmBgQ,MAAMhQ,IAW3C8Q,EAAEw8D,MAAQ,SAASrB,EAAKsB,GAEpB,IADA,IAAIlvE,EAAI4tE,EAAIvhE,OACLrM,KACH,GAAI4tE,EAAI5tE,KAAOkvE,EAAM,CACjBtB,EAAIrqB,OAAOvjD,EAAG,GACd,QAcZyS,EAAEmsD,QAAU,SAASiQ,GACjB,OAAOA,SAeXp8D,EAAE/R,KAAO,SAASmrE,EAAMC,EAAMrsE,GAC1B,IAAIwsE,EAmBJ,OAhBIx5D,EAAEm8D,SAAS9C,GAEPr5D,EAAEmsD,QAAQn/D,GACVosE,EAAK/6D,aAAag7D,EAAMrsE,GAGjBosE,GAAQA,EAAK5vD,eACpBgwD,EAAMJ,EAAK5vD,aAAa6vD,IAIrBr5D,EAAEmsD,QAAQkN,IAASr5D,EAAE+7D,SAAS1C,IACrCr5D,EAAEs6D,WAAWjB,GAAM,SAASkB,EAAK34D,GAC7Bw3D,EAAK/6D,aAAauD,EAAK24D,MAGxBf,GAWXx5D,EAAE08D,MAAQ,SAASN,GACf,OAAOp8D,EAAEoD,QAAQg5D,GAAOA,EAAM,CAACA,IAenCp8D,EAAE28D,YAAc,SAASC,EAAIz1C,EAAOyb,GAChC,GAAIzb,EACA,OAAOrwB,WAAW8lE,EAAIz1C,EAAOyb,GAEjCg6B,EAAG//D,KAAK,EAAG+lC,IAYf5iC,EAAExG,KAAO,WACL,IACIjM,EACAsvE,EAFA3wD,EAAO9T,UAGPwB,EAASsS,EAAKtS,OAClB,IAAKrM,EAAI,EAAGA,EAAIqM,EAAQrM,IAEpB,GAAIsvE,OADJA,EAAM3wD,EAAK3e,IAEP,OAAOsvE,GAwBnB78D,EAAE9P,IAAM,SAAS4sE,EAAIC,GACb/8D,EAAE+3D,OAAS/3D,EAAExT,KACTuwE,QAA6BxE,IAAnBwE,EAAOC,UACjBD,EAAOhxD,OAAS,iBAAqC,IAAjBgxD,EAAOC,QAAiB,KAGpEh9D,EAAE5P,OAAO0sE,EAAG1uE,MAAO2uE,IAqBvB/8D,EAAEhQ,cAAgB,SAASitE,EAAKC,EAASH,EAAQjgE,EAAQqgE,GACrD,IAAIL,EAAKlF,EAAI5nE,cAAcitE,GACvB/sE,EAAM8P,EAAE9P,IAiBZ,OAhBIgtE,GACAl9D,EAAE5P,OAAO0sE,EAAII,GAEbC,GACAjtE,EAAI4sE,EAAI,CACJtrE,QAAS,EACTF,OAAQ,OACRid,OAAQ,IAGZwuD,GACA7sE,EAAI4sE,EAAIC,GAERjgE,GACAA,EAAOlG,YAAYkmE,GAEhBA,GAaX98D,EAAEo9D,YAAc,SAAStgE,EAAQugE,GAC7B,IAAIp6D,EAAS,aAGb,OAFAA,EAAOvS,UAAY,IAAIoM,EACvBkD,EAAE5P,OAAO6S,EAAOvS,UAAW2sE,GACpBp6D,GAaXjD,EAAEulD,IAAM,SAASv4B,EAAQpzB,EAAQ0jE,GAC7B,OAAO,IAAIz/D,OAAOjE,GAAU,GAAK,EAC7BowB,OAAOgD,GAAQpzB,QAAQ+rB,KAAK23C,GAAU,GAAKtwC,GAkBnDhtB,EAAEu9D,eAAiB,SAASvwE,EAAO06D,GAC/B,MAAO,KAAO1yD,KAAKhI,GACf06D,EAAOhuC,WAAW1sB,GAAS,IAC3B0sB,WAAW1sB,IAgBnBgT,EAAEuM,KAAO,SAAS6vD,EAAKvoE,EAAQ2pE,GAC3B,IAAIC,EAAUrB,EAAIvoE,GAClBuoE,EAAIvoE,GAAU,WACV,IAGI2lE,EAHAttD,EAAOrO,MAAMnN,UAAUwM,MAAML,KAAKzE,WAClCslE,EAAYtlE,UACZulE,EAAM/vE,KAQV,OANA+vE,EAAIF,QAAU,WACVA,EAAQtlE,MAAMwlE,EAAKvlE,UAAUwB,OAASxB,UAAYslE,IAEtDxxD,EAAKohC,QAAQmwB,GACbjE,EAAMgE,EAAKrlE,MAAMvK,KAAMse,GACvByxD,EAAIF,QAAU,KACPjE,IAafx5D,EAAE49D,YAAc,SAASC,GACrB,IAAI5wE,EAAI+S,EAAElC,KACV,OAC+B,KADtB7Q,EAAE6wE,qBAAuB7wE,EAAE6wE,oBAAoBD,IACpD5wE,EAAE8wE,kBAAoB,IAkB9B/9D,EAAEg+D,WAAa,SAASxkD,EAAQqkD,EAAWI,GACvC,IAAKj+D,EAAEmsD,QAAQ0R,IAAc3+D,MAAM2+D,GAC/B,OAAO79D,EAAEk+D,eAAertE,KAAKstE,aAAe,GAEhD3kD,EAASxZ,EAAExG,KAAKggB,EAAQ,qBAExB,IAAIjqB,EAAIyQ,EAAElC,KACNmvB,EAAO,IAAI19B,EAAEsuE,EAAY79D,EAAE49D,YAAYC,IAEvCnH,EAAQzpC,EAAK19B,EAAE6uE,cACf9sC,EAAMrE,EAAK19B,EAAE8uE,YACbC,EAAarxC,EAAK19B,EAAEgvE,aACpB5H,EAAQ1pC,EAAK19B,EAAEivE,cACfC,EAAWxxC,EAAK19B,EAAEmvE,iBAClB7tE,EAAOmP,EAAEk+D,eAAertE,KACxB8tE,EAAe9tE,EAAK+tE,SACpBC,EAAgBhuE,EAAKguE,cACrBtZ,EAAMvlD,EAAEulD,IAGRuZ,EAAe9+D,EAAE5P,OAAO,CAIhB,EAAKyuE,EACDA,EAAcvtC,GAAOqtC,EAAartC,GAAKytC,OAAO,EAAG,GAErD,EAAKJ,EAAartC,GAElB,EAAKi0B,EAAI+Y,GAET,EAAK/Y,EAAI+Y,EAAY,EAAG,KACxB,EAAKhtC,EAOL,EAAKzgC,EAAKy9B,YAAYqoC,GAEtB,EAAK9lE,EAAKu9B,OAAOuoC,GAEjB,EAAKpR,EAAIoR,EAAQ,GAIjB,EAAK8H,EAAShnD,WAAWsnD,OAAO,EAAG,GAEnC,EAAKN,EAIL,EAAKlZ,EAAImR,GAET,EAAKA,EAEL,EAAKnR,EAAKmR,EAAQ,IAAO,IAEzB,EAAMA,EAAQ,IAAO,GAErB,EAAKnR,EAAIt4B,EAAK19B,EAAEyvE,iBAEhB,EAAKtI,EAAQ,GAAK,KAAO,KAEzB,EAAKA,EAAQ,GAAK,KAAO,KAEzB,EAAKnR,EAAIt4B,EAAKzB,cAEd,EAAK+5B,EAAI93D,KAAKC,MAAMmwE,EAAY,KAAO,IAe3C79D,EAAEi/D,aAiBV,OAZAj/D,EAAEs6D,WAAWwE,GAAc,SAASvE,EAAK34D,GAErC,MAAsC,IAA/B4X,EAAO1T,QAAQ,IAAMlE,IACxB4X,EAASA,EAAOrjB,QACZ,IAAMyL,EACS,mBAAR24D,EAAqBA,EAAIsD,GAAatD,MAOlD0D,EACHzkD,EAAOulD,OAAO,EAAG,GAAG56D,cAAgBqV,EAAOulD,OAAO,GAClDvlD,GAeRxZ,EAAEk/D,aAAe,SAAS1lD,EAAQ+gD,GAC9B,IAGI4E,EADAtuE,EAAOmP,EAAEk+D,eAAertE,KAiB5B,MAnBiB,KAKFmE,KAAKwkB,IAEhB2lD,GADAA,EAAW3lD,EAAO1M,MALP,cAMWqyD,EAAS,IAAM,EACzB,OAAR5E,IACAA,EAAMv6D,EAAEoyB,aACJmoC,EACA4E,EACAtuE,EAAKuuE,aACL5lD,EAAO1T,QAAQ,MAAQ,EAAIjV,EAAKwuE,aAAe,MAIvD9E,EAAMv6D,EAAEg+D,WAAWxkD,EAAQ+gD,GAExBA,GAqBXv6D,EAAEwZ,OAAS,SAAS6iD,EAAKsB,GAYrB,IAXA,IAEIjkC,EACA4lC,EACAj5B,EACA94C,EACAquE,EAEArB,EACA9rE,EATA8wE,EAAW,IACXC,GAAW,EAMXhG,EAAM,GAIH6C,IAEY,KADf5tE,EAAQ4tE,EAAIv2D,QAAQy5D,KADZ,CAOR,GADA7lC,EAAU2iC,EAAIn/D,MAAM,EAAGzO,GACnB+wE,EAAU,CAQV,IAJA5D,GADAv1B,GADAi5B,EAAiB5lC,EAAQvwB,MAAM,MACT2yB,QAAQ3yB,MAAM,MACzBvP,OACX2gE,EAAMoD,EAGDpwE,EAAI,EAAGA,EAAIquE,EAAKruE,IACjBgtE,EAAMA,EAAIl0B,EAAK94C,IAIf+xE,EAAe1lE,SACf2gE,EAAMv6D,EAAEk/D,aAAaI,EAAe35C,KAAK,KAAM40C,IAInDf,EAAI9jE,KAAK6kE,QAGTf,EAAI9jE,KAAKgkC,GAGb2iC,EAAMA,EAAIn/D,MAAMzO,EAAQ,GAExB8wE,GADAC,GAAYA,GACU,IAAM,IAGhC,OADAhG,EAAI9jE,KAAK2mE,GACF7C,EAAI7zC,KAAK,KAYpB3lB,EAAEy/D,aAAe,SAASC,GACtB,OAAOjyE,KAAKqnB,IAAI,GAAIrnB,KAAKwS,MAAMxS,KAAKklB,IAAI+sD,GAAOjyE,KAAKq6B,QAkBxD9nB,EAAE2/D,sBAAwB,SAASnuC,EAAUouC,EAAWC,EACpDC,EAAeC,GACf,IAAIC,EACAzyE,EACA0yE,EAAczuC,EA8BlB,IA1BAwuC,EAAaxuC,GADbquC,EAAY7/D,EAAExG,KAAKqmE,EAAW,IAIzBD,IACDA,EAAYG,EAGR,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,IAGrC,CAAC,EAAG,EAAG,IAAK,EAAG,KAIG,IAAlBD,IACkB,IAAdD,EACAD,EAAY5/D,EAAEkgE,KAAKN,GAAW,SAASF,GACnC,OAAOA,EAAM,GAAM,KAEhBG,GAAa,KACpBD,EAAY,CAAC,EAAIC,MAMxBtyE,EAAI,EAAGA,EAAIqyE,EAAUhmE,SACtBqmE,EAAcL,EAAUryE,KAEnBwyE,GAAiBE,EAAcJ,GAAaruC,IAC3CuuC,GAAkBC,IAAeJ,EAAUryE,IACxCqyE,EAAUryE,EAAI,IAAMqyE,EAAUryE,KAAO,IALhBA,KAgBlC,OAJA0yE,EAAcjgE,EAAEmgE,aACZF,EAAcJ,GAAYpyE,KAAKC,MAAMD,KAAKklB,IAAI,MAASllB,KAAKq6B,QAkBpE9nB,EAAEogE,WAAa,SAASjF,EAAKkF,GACzB,IACIC,EACA/yE,EAFAqM,EAASuhE,EAAIvhE,OAKjB,IAAKrM,EAAI,EAAGA,EAAIqM,EAAQrM,IACpB4tE,EAAI5tE,GAAGgzE,MAAQhzE,EASnB,IANA4tE,EAAIpuE,MAAK,SAAS4G,EAAGC,GAEjB,OAAqB,KADrB0sE,EAAYD,EAAa1sE,EAAGC,IACHD,EAAE4sE,MAAQ3sE,EAAE2sE,MAAQD,KAI5C/yE,EAAI,EAAGA,EAAIqM,EAAQrM,WACb4tE,EAAI5tE,GAAGgzE,OActBvgE,EAAEwgE,SAAW,SAASpzE,GAIlB,IAHA,IAAIG,EAAIH,EAAKwM,OACT8F,EAAMtS,EAAK,GAERG,KACCH,EAAKG,GAAKmS,IACVA,EAAMtS,EAAKG,IAGnB,OAAOmS,GAaXM,EAAEygE,SAAW,SAASrzE,GAIlB,IAHA,IAAIG,EAAIH,EAAKwM,OACTvJ,EAAMjD,EAAK,GAERG,KACCH,EAAKG,GAAK8C,IACVA,EAAMjD,EAAKG,IAGnB,OAAO8C,GAeX2P,EAAE0gE,wBAA0B,SAAStE,EAAKuE,GACtC3gE,EAAEs6D,WAAW8B,GAAK,SAAS7B,EAAKrrE,GAExBqrE,GAAOA,IAAQoG,GAAUpG,EAAIrkE,SAE7BqkE,EAAIrkE,iBAIDkmE,EAAIltE,OAanB8Q,EAAE/P,eAAiB,SAASypE,GACxB,IAAIkH,EAAa5gE,EAAE4gE,WAEdA,IACDA,EAAa5gE,EAAEhQ,cAAc,QAI7B0pE,GACAkH,EAAWhqE,YAAY8iE,GAE3BkH,EAAW3qE,UAAY,IAY3B+J,EAAEmgE,aAAe,SAAST,EAAKmB,GAC3B,OAAOnnD,WACHgmD,EAAIv1C,YAAY02C,GAAQ,MAgBhC7gE,EAAE8gE,aAAe,SAAS3rE,EAAWJ,GACjCA,EAAMiE,SAAS+nE,gBAAkB/gE,EAAExG,KAC/BrE,EACAJ,EAAMR,QAAQQ,MAAMI,WACpB,IAeR6K,EAAEghE,WAAa,SAAS7rE,GACpB,OAAO6K,EAAE+7D,SAAS5mE,GACd6K,EAAE7P,MAAMgF,GAAa,CACjBge,SAAUhe,EAAY,IAAM,IAOxC6K,EAAEihE,UAAY,CACVC,YAAa,EACb9K,OAAQ,IACRE,OAAQ,IACRE,KAAM,KACNllC,IAAK,MACLG,KAAM,OACNklC,MAAO,QACPtlC,KAAM,UAmBVrxB,EAAEoyB,aAAe,SAASpF,EAAQmyC,EAAUC,EAAcC,GACtDryC,GAAUA,GAAU,EACpBmyC,GAAYA,EAEZ,IAEIgC,EACA74C,EACAkxC,EACA4H,EALAvwE,EAAOmP,EAAEk+D,eAAertE,KACxBwwE,GAAWr0C,EAAOvV,WAAWtO,MAAM,KAAK,IAAM,IAAIvP,OA+CtD,OAzCkB,IAAdulE,EAEAA,EAAW1xE,KAAKiS,IAAI2hE,EAAS,IACrBrhE,EAAE03D,SAASyH,KACnBA,EAAW,GAKfiC,GACI3zE,KAAKuU,IAAIgrB,GAAUv/B,KAAKqnB,IAAI,IAAKrnB,KAAK4C,IAAI8uE,EAAUkC,GAAW,IACjEh3C,QAAQ80C,GAMV72C,GAHA64C,EAAan3C,OAAOhqB,EAAE23D,KAAKyJ,KAGJxnE,OAAS,EAAIunE,EAAWvnE,OAAS,EAAI,EAG5DwlE,EAAep/D,EAAExG,KAAK4lE,EAAcvuE,EAAKuuE,cACzCC,EAAer/D,EAAExG,KAAK6lE,EAAcxuE,EAAKwuE,cAGzC7F,EAAMxsC,EAAS,EAAI,IAAM,GAIzBwsC,GAAOlxC,EAAY64C,EAAWpC,OAAO,EAAGz2C,GAAa+2C,EAAe,GAGpE7F,GAAO2H,EACFpC,OAAOz2C,GACPnyB,QAAQ,iBAAkB,KAAOkpE,GAGlCF,IAEA3F,GAAO4F,EAAegC,EAAclkE,OAAOiiE,IAGxC3F,GAQX/rE,KAAK6zE,cAAgB,SAASvH,GAC1B,OAAQ,IAAOtsE,KAAKkrB,IAAIlrB,KAAKsjB,GAAKgpD,GAAO,IAe7C/5D,EAAEuhE,SAAW,SAASzE,EAAIzD,EAAMmI,GAE5B,IAAIpzE,EAGJ,MAAa,UAATirE,EACO5rE,KAAKiS,IAAIo9D,EAAGtkE,YAAaskE,EAAG2E,aAC/BzhE,EAAEuhE,SAASzE,EAAI,gBACf98D,EAAEuhE,SAASzE,EAAI,iBACH,WAATzD,EACA5rE,KAAKiS,IAAIo9D,EAAGpkE,aAAcokE,EAAG4E,cAChC1hE,EAAEuhE,SAASzE,EAAI,eACf98D,EAAEuhE,SAASzE,EAAI,oBAIvB1uE,EAAQqpE,EAAI5sD,iBAAiBiyD,OAAIvE,MAE7BnqE,EAAQA,EAAM0c,iBAAiBuuD,GAC3Br5D,EAAExG,KAAKgoE,GAAO,KACdpzE,EAAQ4R,EAAE23D,KAAKvpE,KAGhBA,IAYX4R,EAAE2hE,QAAU,SAASlF,EAAMtB,GACvB,OAAOA,EAAIr1D,QAAUq1D,EAAIr1D,QAAQ22D,GAAQ,GAAG32D,QAAQjJ,KAAKs+D,EAAKsB,IAclEz8D,EAAEkgE,KAAO,SAAS/E,EAAKxlE,GACnB,MAAO,GAAGoW,OAAOlP,KAAKs+D,EAAKxlE,IAe/BqK,EAAE6yC,KAAO,SAASsoB,EAAKxlE,GACnB,MAAO,GAAGk9C,KAAKh2C,KAAKs+D,EAAKxlE,IAa7BqK,EAAE2B,IAAM,SAASw5D,EAAKyB,GAKlB,IAJA,IAAIgF,EAAU,GACVr0E,EAAI,EACJquE,EAAMT,EAAIvhE,OAEPrM,EAAIquE,EAAKruE,IACZq0E,EAAQr0E,GAAKqvE,EAAG//D,KAAKs+D,EAAI5tE,GAAI4tE,EAAI5tE,GAAIA,EAAG4tE,GAG5C,OAAOyG,GAYX5hE,EAAEmtB,OAAS,SAAS2vC,GAChB,IAAI+E,EAAUjK,EAAIn6D,gBACdqkE,EAAMhF,EAAG9tD,wBAEb,MAAO,CACHta,IAAKotE,EAAIptE,KAAO+iE,EAAIsK,aAAeF,EAAQG,YACtCH,EAAQ3yD,WAAa,GAC1BtW,KAAMkpE,EAAIlpE,MAAQ6+D,EAAIwK,aAAeJ,EAAQK,aACxCL,EAAQ5yD,YAAc,KAoBnCjP,EAAE6C,KAAO,SAASi6D,EAAIzD,GAKlB,IAHA,IAAI9rE,EAAIyrE,EAAOp/D,OAGRrM,KACCyrE,EAAOzrE,GAAG6rE,OAAS0D,GAAQzD,GAAQA,IAASL,EAAOzrE,GAAG8rE,OACtDL,EAAOzrE,GAAGssE,SAAU,IAiBhC75D,EAAE7S,KAAO,SAASguE,EAAKyB,EAAIe,GACvB,OAAO9/D,MAAMnN,UAAUwS,QAAQrG,KAAKs+D,EAAKyB,EAAIe,IAejD39D,EAAEs6D,WAAa,SAAS8B,EAAKQ,EAAIe,GAC7B,IAAK,IAAI/7D,KAAOw6D,EACRA,EAAI9/D,eAAesF,IACnBg7D,EAAG//D,KAAK8gE,EAAKvB,EAAIx6D,GAAMA,EAAKw6D,IAiBxCp8D,EAAElQ,SAAW,SAASgtE,EAAIlqE,EAAMgqE,GAE5B,IAAIuF,EAASrF,EAAGsF,SAAWtF,EAAGsF,UAAY,GAE1C,SAASC,EAAUprE,GACfA,EAAEe,OAASf,EAAEqrE,YAAc7K,EAC3BmF,EAAG//D,KAAKigE,EAAI7lE,GA2BhB,OAvBI6lE,EAAGjwD,iBACHiwD,EAAGjwD,iBAAiBja,EAAMgqE,GAAI,GAGvBE,EAAGyF,cAELzF,EAAG0F,aACJ1F,EAAG0F,WAAa,IAIpB1F,EAAG0F,WAAW5F,EAAGnlD,YAAc4qD,EAE/BvF,EAAGyF,YAAY,KAAO3vE,EAAMyvE,IAG3BF,EAAOvvE,KACRuvE,EAAOvvE,GAAQ,IAGnBuvE,EAAOvvE,GAAM8C,KAAKknE,GAGX,WACH58D,EAAEjQ,YAAY+sE,EAAIlqE,EAAMgqE,KAgBhC58D,EAAEjQ,YAAc,SAAS+sE,EAAIlqE,EAAMgqE,GAE/B,IAAIuF,EAEA1zE,EADA2zE,EAAWtF,EAAGsF,SAGlB,SAASK,EAAe7vE,EAAMgqE,GACtBE,EAAGnwD,oBACHmwD,EAAGnwD,oBAAoB/Z,EAAMgqE,GAAI,GAC1BE,EAAGyF,cACV3F,EAAKE,EAAG0F,WAAW5F,EAAGnlD,YACtBqlD,EAAG4F,YAAY,KAAO9vE,EAAMgqE,IAIpC,SAAS+F,IACL,IAAIC,EACAhH,EAECkB,EAAG+F,WAIJjwE,GACAgwE,EAAQ,IACFhwE,IAAQ,EAEdgwE,EAAQR,EAGZpiE,EAAEs6D,WAAWsI,GAAO,SAASrI,EAAKrrE,GAC9B,GAAIkzE,EAASlzE,GAET,IADA0sE,EAAMwG,EAASlzE,GAAG0K,OACXgiE,KACH6G,EAAevzE,EAAGkzE,EAASlzE,GAAG0sE,QAM1CwG,IACIxvE,GACAuvE,EAASC,EAASxvE,IAAS,GACvBgqE,IACAnuE,EAAQuR,EAAE2hE,QAAQ/E,EAAIuF,KACT,IACTA,EAAOrxB,OAAOriD,EAAO,GACrB2zE,EAASxvE,GAAQuvE,GAErBM,EAAe7vE,EAAMgqE,KAGrB+F,IACAP,EAASxvE,GAAQ,MAGrB+vE,IACA7F,EAAGsF,SAAW,MAmB1BpiE,EAAE8iE,UAAY,SAAShG,EAAIlqE,EAAMmwE,EAAgBC,GAC7C,IAAI/rE,EAEAkrE,EACAvG,EACAruE,EACAqvE,EAJAwF,EAAWtF,EAAGsF,SAQlB,GAFAW,EAAiBA,GAAkB,GAE/BnL,EAAIqL,cAAgBnG,EAAGoG,eAAiBpG,EAAGgG,YAC3C7rE,EAAI2gE,EAAIqL,YAAY,WAClBE,UAAUvwE,GAAM,GAAM,GAGxBoN,EAAE5P,OAAO6G,EAAG8rE,GAERjG,EAAGoG,cACHpG,EAAGoG,cAAcjsE,GAEjB6lE,EAAGgG,UAAUlwE,EAAMqE,QAGpB,GAAImrE,EAyBP,IAtBAxG,GADAuG,EAASC,EAASxvE,IAAS,IACdgH,OAERmpE,EAAe/qE,QAEhBgI,EAAE5P,OAAO2yE,EAAgB,CAIrB98D,eAAgB,WACZ88D,EAAeK,kBAAmB,GAItCprE,OAAQ8kE,EAIRlqE,KAAMA,IAKTrF,EAAI,EAAGA,EAAIquE,EAAKruE,KACjBqvE,EAAKuF,EAAO50E,MAI8B,IAAhCqvE,EAAG//D,KAAKigE,EAAIiG,IAClBA,EAAe98D,iBAMvB+8D,IAAoBD,EAAeK,kBACnCJ,EAAgBD,IA+BxB/iE,EAAEqjE,QAAU,SAASvG,EAAIwG,EAAQC,GAC7B,IAAI3gE,EAEAkN,EACAg7B,EACA5+B,EAHA0d,EAAO,GAKN5pB,EAAE+7D,SAASwH,KAEZA,EAAM,CACFpwD,UAFJjH,EAAO9T,WAEY,GACfoiE,OAAQtuD,EAAK,GACbkuD,SAAUluD,EAAK,KAGlBlM,EAAE03D,SAAS6L,EAAIpwD,YAChBowD,EAAIpwD,SAAW,KAEnBowD,EAAI/I,OAA+B,mBAAf+I,EAAI/I,OACpB+I,EAAI/I,OACH/sE,KAAK81E,EAAI/I,SAAW/sE,KAAK6zE,cAC9BiC,EAAIlJ,QAAUr6D,EAAE7P,MAAMmzE,GAEtBtjE,EAAEs6D,WAAWgJ,GAAQ,SAAS/I,EAAKlB,GAE/Br5D,EAAE6C,KAAKi6D,EAAIzD,GAEXvuB,EAAK,IAAI9qC,EAAEm5D,GAAG2D,EAAIyG,EAAKlK,GACvBvpD,EAAM,KAEO,MAATupD,GACAvuB,EAAG+P,MAAQ/P,EAAG2vB,SACVqC,EACAA,EAAG7vE,EACHq2E,EAAOr2E,GAEX69C,EAAG2uB,IAAM6J,EAAOr2E,EAChB2V,EAAQ,EACRkN,EAAM,GACCgtD,EAAG7uE,KACV2U,EAAQk6D,EAAG7uE,KAAKorE,IAEhBz2D,EAAQ8W,WAAW1Z,EAAEuhE,SAASzE,EAAIzD,KAAU,EAC/B,YAATA,IACAzvC,EAAO,OAIV9Z,IACDA,EAAMyqD,GAENzqD,GAAOA,EAAIhD,OAASgD,EAAIhD,MAAM,QAC9BgD,EAAMA,EAAI3Z,QAAQ,MAAO,KAE7B20C,EAAG6uB,IAAI/2D,EAAOkN,EAAK8Z,OAuB3B5pB,EAAEwjE,WAAa,SAAS5wE,EAAMkK,EAAQvI,EAASyF,EAAOypE,GAClD,IAAIvF,EAAiBl+D,EAAEpP,aACnB8nE,EAAc14D,EAAE04D,YAEpB,OAAIA,EAAY9lE,GACLoN,EAAE/B,MAAM,KAInBigE,EAAewF,YAAY9wE,GAAQoN,EAAE7P,MACjC+tE,EAAewF,YAAY5mE,GAC3BvI,GAIJmkE,EAAY9lE,GAAQoN,EAAEo9D,YAAY1E,EAAY57D,IAC1C,aAAe9C,GACnB0+D,EAAY9lE,GAAMlC,UAAUkC,KAAOA,EAG/B6wE,IACA/K,EAAY9lE,GAAMlC,UAAUizE,WACxB3jE,EAAEo9D,YAAYp9D,EAAEyzB,MAAOgwC,IAGxB/K,EAAY9lE,KAavBoN,EAAE4jE,WAEM9K,EAAgBrrE,KAAKuT,SAASyW,SAAS,IAAImR,UAAU,EAAG,GACxDmwC,EAAY,EAET,WACH,MAAO,cAAgBD,EAAgB,IAAMC,MAOjDxB,IACAA,EAAOqF,GAAGiH,WAAa,WACnB,IAAI33D,EAAO,GAAGhP,MAAML,KAAKzE,WAEzB,GAAIxK,KAAK,GAGL,OAAIse,EAAK,IACL,IAAIlM,EAEAA,EAAEm8D,SAASjwD,EAAK,IAAMA,EAAK4vB,QAAU,UACvCluC,KAAK,GAAIse,EAAK,GAAIA,EAAK,IAClBte,MAKJsN,EAAO8E,EAAE/R,KAAKL,KAAK,GAAI,4BAUtCgqE,IAAQA,EAAIj6D,cACZqC,EAAEuhE,SAAW,SAASzE,EAAIzD,GACtB,IAAIkB,EACAuJ,EAAQ,CACJpxE,MAAO,cACPL,OAAQ,gBACVgnE,GAEN,OAAIyD,EAAG1uE,MAAMirE,GACFr5D,EAAE23D,KAAKmF,EAAG1uE,MAAMirE,KAEd,YAATA,IACAA,EAAO,UAIPyK,GACAhH,EAAG1uE,MAAMglB,KAAO,EACT3lB,KAAK4C,IAAIysE,EAAGgH,GAAS,EAAI9jE,EAAEuhE,SAASzE,EAAI,WAAY,KAG/DvC,EAAMuC,EAAGiH,aAAa1K,EAAKljE,QAAQ,WAAW,SAASxC,EAAGC,GACtD,OAAOA,EAAEuQ,kBAEA,WAATk1D,IACAkB,EAAMA,EAAIpkE,QACN,6BACA,SAASxC,EAAGC,GACR,OAAOA,EAAI,QAKR,KAAR2mE,EAAa,EAAIv6D,EAAE23D,KAAK4C,OAIlC18D,MAAMnN,UAAUwS,UACjBlD,EAAE7S,KAAO,SAASguE,EAAKyB,EAAIe,GAGvB,IAFA,IAAIpwE,EAAI,EACJquE,EAAMT,EAAIvhE,OACPrM,EAAIquE,EAAKruE,IACZ,IAAqC,IAAjCqvE,EAAG//D,KAAK8gE,EAAKxC,EAAI5tE,GAAIA,EAAG4tE,GACxB,OAAO5tE,IAMlBsQ,MAAMnN,UAAUoV,UACjB9F,EAAE2hE,QAAU,SAASlF,EAAMtB,GACvB,IAAIS,EACAruE,EAAI,EAER,GAAI4tE,EAGA,IAFAS,EAAMT,EAAIvhE,OAEHrM,EAAIquE,EAAKruE,IACZ,GAAI4tE,EAAI5tE,KAAOkvE,EACX,OAAOlvE,EAKnB,OAAQ,IAIXsQ,MAAMnN,UAAUqb,SACjB/L,EAAEkgE,KAAO,SAAS8D,EAAUpH,GAKxB,IAJA,IAAIpD,EAAM,GACNjsE,EAAI,EACJqM,EAASoqE,EAASpqE,OAEfrM,EAAIqM,EAAQrM,IACXqvE,EAAGoH,EAASz2E,GAAIA,IAChBisE,EAAI9jE,KAAKsuE,EAASz2E,IAI1B,OAAOisE,IAIV37D,MAAMnN,UAAUmiD,OACjB7yC,EAAE6yC,KAAO,SAASsoB,EAAKyB,GACnB,IAAIrvE,EACAqM,EAASuhE,EAAIvhE,OAEjB,IAAKrM,EAAI,EAAGA,EAAIqM,EAAQrM,IACpB,GAAIqvE,EAAGzB,EAAI5tE,GAAIA,GACX,OAAO4tE,EAAI5tE,KArkE/B,CA6kEEoB,GAOMxB,GANE6S,EAgPRrR,GA1OexB,KACTuqE,EAAW13D,EAAE03D,SACb/1D,EAAM3B,EAAE2B,IACRxR,EAAQ6P,EAAE7P,MACVwnE,EAAO33D,EAAE23D,KAcb33D,EAAEikE,MAAQ,SAASj4B,GAEf,KAAMp+C,gBAAgBoS,EAAEikE,OACpB,OAAO,IAAIjkE,EAAEikE,MAAMj4B,GAGvBp+C,KAAKs2E,KAAKl4B,IAEdhsC,EAAEikE,MAAMvzE,UAAY,CAIhByzE,QAAS,CAAC,CAENC,MAAO,+FACP5+C,MAAO,SAAS3B,GACZ,MAAO,CAAC8zC,EAAK9zC,EAAO,IAAK8zC,EAAK9zC,EAAO,IAAK8zC,EAAK9zC,EAAO,IAAKnK,WAAWmK,EAAO,GAAI,OAEtF,CAECugD,MAAO,kEACP5+C,MAAO,SAAS3B,GACZ,MAAO,CAAC8zC,EAAK9zC,EAAO,IAAK8zC,EAAK9zC,EAAO,IAAK8zC,EAAK9zC,EAAO,IAAK,MAMnEkO,MAAO,CACHsyC,KAAM,sBACNvhD,MAAO,UACPzI,MAAO,WAOX6pD,KAAM,SAASl4B,GACX,IAAInoB,EACAygD,EACA/2E,EACAg3E,EACA3I,EASJ,GAPAhuE,KAAKo+C,MAAQA,EAAQp+C,KAAKmkC,MACtBia,GAASA,EAAM51C,YACf41C,EAAM51C,cACN,KACC41C,EAGDA,GAASA,EAAMw4B,MACf52E,KAAK42E,MAAQ7iE,EAAIqqC,EAAMw4B,OAAO,SAAS3hE,GACnC,OAAO,IAAI7C,EAAEikE,MAAMphE,EAAK,YAqC5B,GA9BImpC,GAAsB,MAAbA,EAAM,KAEf4vB,EAAM5vB,EAAMpyC,OACZoyC,EAAQ/2C,SAAS+2C,EAAM+yB,OAAO,GAAI,IAGtB,IAARnD,EAEA0I,EAAO,EACM,SAARt4B,IAAqB,IACb,MAARA,IAAmB,EACX,IAARA,EACD,GAMW,IAAR4vB,IAEP0I,EAAO,EACO,KAARt4B,IAAkB,GAAc,KAARA,IAAkB,GAClC,IAARA,IAAiB,EAAc,IAARA,GACf,GAARA,IAAgB,EAAc,GAARA,EACxB,MAMPs4B,EAED,IADA/2E,EAAIK,KAAKu2E,QAAQvqE,OACVrM,MAAQ+2E,IAEXzgD,GADA0gD,EAAS32E,KAAKu2E,QAAQ52E,IACN62E,MAAM3qD,KAAKuyB,MAEvBs4B,EAAOC,EAAO/+C,MAAM3B,IAKpCj2B,KAAK02E,KAAOA,GAAQ,IAOxB3nE,IAAK,SAAS6c,GACV,IAEIggD,EAFAxtB,EAAQp+C,KAAKo+C,MACbs4B,EAAO12E,KAAK02E,KAsBhB,OAnBI12E,KAAK42E,QACLhL,EAAMrpE,EAAM67C,IACRw4B,MAAQ,GAAGz+D,OAAOyzD,EAAIgL,OAC1Br3E,EAAKS,KAAK42E,OAAO,SAAS3hE,EAAMtV,GAC5BisE,EAAIgL,MAAMj3E,GAAK,CAACisE,EAAIgL,MAAMj3E,GAAG,GAAIsV,EAAKlG,IAAI6c,QAM1CggD,EAFG8K,GAAQ5M,EAAS4M,EAAK,IACd,QAAX9qD,IAAsBA,GAAsB,IAAZ8qD,EAAK,GAC/B,OAASA,EAAK,GAAK,IAAMA,EAAK,GAAK,IAAMA,EAAK,GAAK,IACvC,MAAX9qD,EACD8qD,EAAK,GAEL,QAAUA,EAAK3+C,KAAK,KAAO,IAG/BqmB,EAEHwtB,GAOXiL,SAAU,SAAS3oB,GACf,IAAIvuD,EACA+2E,EAAO12E,KAAK02E,KAEhB,GAAI12E,KAAK42E,MACLr3E,EAAKS,KAAK42E,OAAO,SAAS3hE,GACtBA,EAAK4hE,SAAS3oB,WAGf,GAAI4b,EAAS5b,IAAoB,IAAVA,EAC1B,IAAKvuD,EAAI,EAAGA,EAAI,EAAGA,IACf+2E,EAAK/2E,IAAMoqE,EAAa,IAAR7b,GAEZwoB,EAAK/2E,GAAK,IACV+2E,EAAK/2E,GAAK,GAEV+2E,EAAK/2E,GAAK,MACV+2E,EAAK/2E,GAAK,KAItB,OAAOK,MAOX82E,WAAY,SAAS5oB,GAEjB,OADAluD,KAAK02E,KAAK,GAAKxoB,EACRluD,MAeX+tE,QAAS,SAASj/B,EAAIq9B,GAGlB,IACI4K,EACAnL,EAFA/8B,EAAO7uC,KAqBX,OAhBK8uC,EAAG4nC,KAAK1qE,QAKT6iC,EAAOA,EAAK6nC,KAGZ9K,IADAmL,EAAsB,KADtBjoC,EAAKA,EAAG4nC,MACO,IAAwB,IAAZ7nC,EAAK,IACd,QAAU,QACxBhvC,KAAKC,MAAMgvC,EAAG,IAAMD,EAAK,GAAKC,EAAG,KAAO,EAAIq9B,IAAQ,IACpDtsE,KAAKC,MAAMgvC,EAAG,IAAMD,EAAK,GAAKC,EAAG,KAAO,EAAIq9B,IAAQ,IACpDtsE,KAAKC,MAAMgvC,EAAG,IAAMD,EAAK,GAAKC,EAAG,KAAO,EAAIq9B,KAC3C4K,EACI,KAAOjoC,EAAG,IAAMD,EAAK,GAAKC,EAAG,KAAO,EAAIq9B,IACzC,IAAM,KAbdP,EAAM98B,EAAGsP,OAAS,OAefwtB,IAGfx5D,EAAE5T,MAAQ,SAAS4/C,GACf,OAAO,IAAIhsC,EAAEikE,MAAMj4B,IAI1B,SAAShsC,GAMN,IAAI4kE,EACAC,EAEA/0E,EAAWkQ,EAAElQ,SACbuzE,EAAUrjE,EAAEqjE,QACZp1E,EAAO+R,EAAE/R,KACTiN,EAAS8E,EAAE9E,OACX9O,EAAQ4T,EAAE5T,MACV8D,EAAM8P,EAAE9P,IACRF,EAAgBgQ,EAAEhQ,cAClBm8D,EAAUnsD,EAAEmsD,QACZkM,EAAUr4D,EAAEq4D,QACZqI,EAA0B1gE,EAAE0gE,wBAC5B9I,EAAM53D,EAAE43D,IACRzqE,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACXosE,EAAQx8D,EAAEw8D,MACV0D,EAAOlgE,EAAEkgE,KACT5H,EAAWt4D,EAAEs4D,SACbqJ,EAAU3hE,EAAE2hE,QACZv+D,EAAUpD,EAAEoD,QACZ80D,EAAYl4D,EAAEk4D,UACdH,EAAO/3D,EAAE+3D,KACTgE,EAAW/7D,EAAE+7D,SACbI,EAAWn8D,EAAEm8D,SACb3D,EAAWx4D,EAAEw4D,SACbroE,EAAQ6P,EAAE7P,MACV0oE,EAAO74D,EAAE64D,KACTyB,EAAat6D,EAAEs6D,WACf9gE,EAAOwG,EAAExG,KACTm+D,EAAO33D,EAAE23D,KACT5nE,EAAciQ,EAAEjQ,YAEhB8S,GADQ7C,EAAE08D,MACH18D,EAAE6C,MACTrW,EAAMwT,EAAExT,IACRqrE,EAAS73D,EAAE63D,OACXc,EAAc34D,EAAE24D,YAChBlB,EAAMz3D,EAAEy3D,IAsBZmN,EAAa5kE,EAAE4kE,WAAa,WACxB,OAAOh3E,MAEXwC,EAAOw0E,EAAWl0E,UAAyD,CAGvEssE,QAAS,EACTnF,OAAQA,EAMRiN,UAAW,CAAC,YAAa,WAAY,aAAc,aAC/C,YAAa,QAAS,aAAc,QAAS,YAC7C,iBAAkB,eAAgB,eAatCZ,KAAM,SAASlrE,EAAU6pE,GAOrBj1E,KAAK8rE,QAAuB,SAAbmJ,EACX7yE,EAAc6yE,GACdjL,EAAIpjE,gBAAgB5G,KAAKiqE,OAAQgL,GAMrCj1E,KAAKoL,SAAWA,GAepBqqE,QAAS,SAASC,EAAQ/uE,EAAS6lE,GAC/B,IAAI2K,EAAc/kE,EAAEghE,WAChBxnE,EAAKjF,EAAS3G,KAAKoL,SAAS+nE,iBAAiB,IAajD,OAX6B,IAAzBgE,EAAY5xD,UACRinD,IACA2K,EAAY3K,SAAWA,GAE3BiJ,EAAQz1E,KAAM01E,EAAQyB,KAEtBn3E,KAAKK,KAAKq1E,EAAQ,KAAMlJ,GACpB2K,EAAYjiE,MACZiiE,EAAYjiE,KAAKjG,KAAKjP,OAGvBA,MAmDXo3E,cAAe,SAAS54E,EAAOitE,EAAMD,GACjC,IACI6L,EACAC,EACAC,EACAC,EACAC,EACAC,EACAd,EACAe,EACAC,EACAC,EACA/oE,EAEA1P,EAbAgM,EAAWpL,KAAKoL,SAYhB4I,EAAM,GAINxV,EAAMs5E,eACNR,EAAW,iBACJ94E,EAAMu5E,iBACbT,EAAW,kBAGXA,IACAC,EAAW/4E,EAAM84E,GACjBG,EAAYrsE,EAASqsE,UACrBb,EAAQp4E,EAAMo4E,MACdiB,EAAkBrM,EAAKqM,gBAGnBriE,EAAQ+hE,KACR/4E,EAAM84E,GAAYC,EAAW,CACzBxxD,GAAIwxD,EAAS,GACbtxD,GAAIsxD,EAAS,GACbnhC,GAAImhC,EAAS,GACblhC,GAAIkhC,EAAS,GACbS,cAAe,mBAMN,mBAAbV,GACAO,IACCtZ,EAAQgZ,EAASS,iBAElBR,EAAUD,EACVA,EAAWh1E,EACPg1E,EACAnsE,EAAS6sE,cAAcJ,EAAiBL,GAAU,CAC9CQ,cAAe,oBAM3BtL,EAAW6K,GAAU,SAAS5K,EAAKrrE,GACrB,OAANA,GACA0S,EAAIlM,KAAKxG,EAAGqrE,MAGpBD,EAAWkK,GAAO,SAASjK,GACvB34D,EAAIlM,KAAK6kE,MAKT8K,EAHJzjE,EAAMA,EAAI+jB,KAAK,MAIXjpB,EAAK2oE,EAAUzjE,GAAK3T,KAAK,OAKzBk3E,EAASzoE,GAAKA,EAAKsD,EAAE4jE,YACrByB,EAAUzjE,GAAO0jE,EAAiBtsE,EAAShJ,cAAck1E,GACpDj3E,KAAKk3E,GACLzrE,IAAIV,EAAS8sE,MAElBR,EAAeF,QAAUA,EAGzBE,EAAed,MAAQ,GACvBr3E,EAAKq3E,GAAO,SAAS3hE,GACjB,IAAIkjE,EAC4B,IAA5BljE,EAAK,GAAGiD,QAAQ,SAChBm/D,EAAcjlE,EAAE5T,MAAMyW,EAAK,IAC3B0iE,EAAYN,EAAYtoE,IAAI,OAC5B6oE,EAAcP,EAAYtoE,IAAI,OAE9B4oE,EAAY1iE,EAAK,GACjB2iE,EAAc,GAElBO,EAAa/sE,EAAShJ,cAAc,QAAQ/B,KAAK,CAC7Ck/B,OAAQtqB,EAAK,GACb,aAAc0iE,EACd,eAAgBC,IACjB9rE,IAAI4rE,GAGPA,EAAed,MAAM9uE,KAAKqwE,OAKlC/4E,EAAQ,OAASgM,EAASnG,IAAM,IAAM6J,EAAK,IAC3C08D,EAAK/6D,aAAag7D,EAAMrsE,GACxBosE,EAAK4M,SAAWpkE,EAGhBxV,EAAMqrB,SAAW,WACb,OAAOzqB,KAwBnBi5E,iBAAkB,SAASC,GACvB,IACIC,EACAC,EAGAh6E,EACAi6E,EACAC,EACA/4E,EARA6rE,EAAOxrE,KAAK8rE,QAwBhB,IArBuD,IAArCwM,EAAYpgE,QAAQ,cAUbogE,EAAcA,EAAY/vE,QAC3C,YACAvI,KAAKoL,SAASutE,YAAYnN,EAAKhrE,MAAMmE,QAK7C2zE,EAAcA,EAAY/8D,MAAM,KAChC/c,EAAQ85E,EAAYA,EAAYtsE,OAAS,IACzCysE,EAAcH,EAAY,KAES,SAAhBG,GAA0BrmE,EAAExT,IAAK,CAuBhD,IArBAoB,KAAK44E,QAAS,EAEdL,EAAS,GAAGjpE,MAAML,KAAKu8D,EAAKqN,qBAAqB,UAIjD74E,KAAK84E,QAAU94E,KAAK+4E,QAKpBN,EAAcA,EAAYlwE,QACtB,qBACA,SAAS2W,EAAO85D,EAAOh9C,GACnB,OAAQ,EAAIg9C,EAASh9C,KAM7Br8B,EAAI44E,EAAOvsE,OACJrM,KAEiC,6BADpC64E,EAAQD,EAAO54E,IACLic,aAAa,UAEnBgzD,EAAM2J,EAAQ/M,EAAKnvD,YAAYm8D,IAKvCE,EAAiBlN,EAAKyN,WACtB15E,EAAKg5E,GAAQ,SAASC,EAAOv3E,GACzB,IAAIi4E,EAGM,IAANj4E,IACAu3E,EAAM/nE,aAAa,IAAK+6D,EAAK5vD,aAAa,MAC1C3a,EAAIuqE,EAAK5vD,aAAa,KACtB48D,EAAM/nE,aAAa,IAAKxP,GAAK,GACnB,OAANA,GACAuqE,EAAK/6D,aAAa,IAAK,IAK/ByoE,EAAQV,EAAMW,UAAU,GACxB94E,EAAK64E,EAAO,CACR,MAAS,0BACT,KAAQ16E,EACR,OAAUA,EACV,eAAgBi6E,EAChB,kBAAmB,UAEvBjN,EAAKjuD,aAAa27D,EAAOR,QAoErCr4E,KAAM,SAAS+4E,EAAMzM,EAAKH,EAAU6M,GAChC,IAAIrlE,EAEAslE,EAEAC,EACApiE,EAJA20D,EAAU9rE,KAAK8rE,QAEfF,EAAM5rE,KAiEV,MA5DoB,iBAATo5E,QAA6BzO,IAARgC,IAC5B34D,EAAMolE,GACNA,EAAO,IACFplE,GAAO24D,GAII,iBAATyM,EACPxN,GAAO5rE,KAAKo5E,EAAO,WAAap5E,KAAKw5E,gBAAgBvqE,KAAKjP,KAAMo5E,EAAMtN,IAKtEY,EAAW0M,GAAM,SAASzM,EAAK34D,GAC3BulE,GAAW,EAINF,GACDpkE,EAAKjV,KAAMgU,GAKXhU,KAAKy5E,YACL,0DACCryE,KAAK4M,KAEDslE,IACDt5E,KAAK05E,WAAWN,GAChBE,GAAmB,GAEvBC,GAAW,IAGXv5E,KAAK83C,UAAqB,MAAR9jC,GAAuB,MAARA,IACjChU,KAAK25E,aAAc,GAGlBJ,KACDpiE,EAASnX,KAAKgU,EAAM,WAAahU,KAAK45E,gBAC/B3qE,KAAKjP,KAAM2sE,EAAK34D,EAAK83D,GAIxB9rE,KAAK65E,SAAW,sDAAsDzyE,KAAK4M,IAC3EhU,KAAK85E,cAAc9lE,EAAK24D,EAAKx1D,MAItCnX,MAEHA,KAAK+5E,gBAILvN,GACAA,IAGGZ,GAQXmO,aAAc,WAGN/5E,KAAK25E,cACL35E,KAAKg6E,kBACLh6E,KAAK25E,aAAc,IAe3BG,cAAe,SAAS9lE,EAAK5U,EAAO+X,GAIhC,IAHA,IAAI0iE,EAAU75E,KAAK65E,QACfl6E,EAAIk6E,EAAQ7tE,OAETrM,KACHwX,EAAOlI,KACH4qE,EAAQl6E,GACA,WAARqU,EACAnU,KAAK4C,IAAIrD,GAASy6E,EAAQl6E,GAAGs6E,WAAa,GAAI,GACtC,MAARjmE,EAAchU,KAAKX,EAAID,EACvB4U,EACA6lE,EAAQl6E,KAepBu6E,SAAU,SAASxwE,EAAWnB,GAC1B,IAAI4xE,EAAmBn6E,KAAKK,KAAK,UAAY,GAU7C,OAR6C,IAAzC85E,EAAiBjiE,QAAQxO,KACpBnB,IACDmB,GACKywE,GAAoBA,EAAmB,IAAM,IAC1CzwE,GAAWnB,QAAQ,KAAM,MAErCvI,KAAKK,KAAK,QAASqJ,IAEhB1J,MAQXo6E,SAAU,SAAS1wE,GACf,OAA2D,IAApDrJ,EAAKL,KAAK8rE,QAAS,SAAS5zD,QAAQxO,IAQ/C2wE,YAAa,SAAS3wE,GAElB,OADArJ,EAAKL,KAAK8rE,QAAS,SAAUzrE,EAAKL,KAAK8rE,QAAS,UAAY,IAAIvjE,QAAQmB,EAAW,KAC5E1J,MAUX05E,WAAY,SAASN,GACjB,IAAIkB,EAAUt6E,KAEdT,EAAK,CAAC,IAAK,IAAK,IAAK,QAAS,MAAO,QAAS,SAAU,SAAU,UAAW,YAAY,SAASyU,GAC9FsmE,EAAQtmE,GAAOpI,EAAKwtE,EAAKplE,GAAMsmE,EAAQtmE,OAG3CsmE,EAAQj6E,KAAK,CACThB,EAAGi7E,EAAQlvE,SAASrI,QAAQu3E,EAAQb,YAChCa,EAAQt4E,EACRs4E,EAAQr5E,EACRq5E,EAAQx1E,MACRw1E,EAAQ71E,OACR61E,MAYZzuC,KAAM,SAAS0uC,GACX,OAAOv6E,KAAKK,KACR,YACAk6E,EACA,OAASv6E,KAAKoL,SAASnG,IAAM,IAAMs1E,EAASzrE,GAAK,IACjD,SAoBR0rE,MAAO,SAASr5D,EAAMs3D,GAElB,IAEIgC,EAFAH,EAAUt6E,KACVsvE,EAAU,GAqBd,OAlBAmJ,EAAcA,GAAet3D,EAAKs3D,aAAe,EACjDgC,EAAa56E,KAAKC,MAAM24E,GAAe,EAAI,EAG3Ct3D,EAAKnf,EAAInC,KAAKwS,MAAM8O,EAAKnf,GAAKs4E,EAAQt4E,GAAK,GAAKy4E,EAChDt5D,EAAKlgB,EAAIpB,KAAKwS,MAAM8O,EAAKlgB,GAAKq5E,EAAQr5E,GAAK,GAAKw5E,EAChDt5D,EAAKrc,MAAQjF,KAAKwS,OAAO8O,EAAKrc,OAASw1E,EAAQx1E,OAAS,GAAK,EAAI21E,GACjEt5D,EAAK1c,OAAS5E,KAAKwS,OAAO8O,EAAK1c,QAAU61E,EAAQ71E,QAAU,GAAK,EAAIg2E,GAChElc,EAAQp9C,EAAKs3D,eACbt3D,EAAKs3D,YAAcA,GAGvB/L,EAAWvrD,GAAM,SAASwrD,EAAK34D,GACvBsmE,EAAQtmE,KAAS24D,IACjB2N,EAAQtmE,GAAOs7D,EAAQt7D,GAAO24D,MAI/B2C,GAcXhtE,IAAK,SAAS6sE,GACV,IAGIuL,EAEAC,EALAC,EAAY56E,KAAKmvE,OACjB0L,EAAY,GACZrP,EAAOxrE,KAAK8rE,QAEZgP,EAAgB,GAEhBC,GAAUH,EAKVI,EAAiB,CAAC,cAAe,eAAgB,SA6ErD,OA1EI7L,GAAUA,EAAO3wE,QACjB2wE,EAAOxqE,KAAOwqE,EAAO3wE,OAIrBo8E,GACAlO,EAAWyC,GAAQ,SAAS3uE,EAAOc,GAC3Bd,IAAUo6E,EAAUt5E,KACpBu5E,EAAUv5E,GAAKd,EACfu6E,GAAS,MAIjBA,IAGIH,IACAzL,EAAS3sE,EACLo4E,EACAC,IAKRH,EAAY16E,KAAK06E,UACbvL,GACAA,EAAOrqE,OACU,SAAjBqqE,EAAOrqE,OACyB,SAAhC0mE,EAAKyJ,SAASzsE,eACduhE,EAAKoF,EAAOrqE,OAIhB9E,KAAKmvE,OAASA,EAEVuL,IAAe97E,GAAOoB,KAAKoL,SAAS5D,kBAC7B2nE,EAAOrqE,MAIdqlE,IAASvrE,EACT0D,EAAItC,KAAK8rE,QAASqD,IAElBwL,EAAY,SAAS50E,EAAGC,GACpB,MAAO,IAAMA,EAAEwC,eAEnBkkE,EAAWyC,GAAQ,SAAS3uE,EAAOc,IACK,IAAhCyyE,EAAQzyE,EAAG05E,KACXF,GACIx5E,EAAEiH,QAAQ,WAAYoyE,GAAa,IACnCn6E,EAAQ,QAGhBs6E,GACAz6E,EAAKmrE,EAAM,QAASsP,IAKxB96E,KAAKi7E,QAIyB,SAA1Bj7E,KAAK8rE,QAAQmJ,UACbj1E,KAAKoL,SAAS8vE,UAAUl7E,MAIxBmvE,GAAUA,EAAOmJ,aACjBt4E,KAAKq4E,iBAAiBlJ,EAAOmJ,eAKlCt4E,MAUXy4E,YAAa,WACT,OAAOz4E,KAAK,iBAAmB,GAkBnCW,GAAI,SAASw6E,EAAWC,GACpB,IAAIC,EAAar7E,KACb8rE,EAAUuP,EAAWvP,QAmBzB,OAhBIpB,GAA0B,UAAdyQ,GACZrP,EAAQ7/D,aAAe,SAAS5C,GAC5BgyE,EAAWC,gBAAkBprE,KAAKC,MAClC9G,EAAEgP,iBACF+iE,EAAQnsE,KAAK68D,EAASziE,IAE1ByiE,EAAQrmE,QAAU,SAAS4D,KAC6B,IAAhDwgE,EAAI3pD,UAAUC,UAAUjI,QAAQ,YAChChI,KAAKC,OAASkrE,EAAWC,iBAAmB,GAAK,OACjDF,EAAQnsE,KAAK68D,EAASziE,KAK9ByiE,EAAQ,KAAOqP,GAAaC,EAEzBp7E,MAYXu7E,mBAAoB,SAASz1C,GACzB,IAAI01C,EAAmBx7E,KAAKoL,SAASqsE,UAAUz3E,KAAK8rE,QAAQsM,UAe5D,OAbAp4E,KAAK8rE,QAAQ+L,gBAAkB/xC,EAI3B01C,GAAoBA,EAAiBhE,SACrCgE,EAAiB/F,QACbz1E,KAAKoL,SAAS6sE,cACVnyC,EACA01C,EAAiBhE,UAKtBx3E,MASXynB,UAAW,SAASzlB,EAAGf,GACnB,OAAOjB,KAAKK,KAAK,CACboL,WAAYzJ,EACZ0J,WAAYzK,KAapBqmB,OAAQ,SAASm0D,GAIb,OAHcz7E,KACNy7E,SAAWA,EADLz7E,KAENg6E,kBAFMh6E,MAalBg6E,gBAAiB,WACb,IAQInhC,EAPAptC,EADUzL,KACWyL,YAAc,EACnCC,EAFU1L,KAEW0L,YAAc,EACnCgwE,EAHU17E,KAGO07E,OACjBC,EAJU37E,KAIO27E,OACjBF,EALUz7E,KAKSy7E,SACnB3jC,EANU93C,KAMS83C,SACnBg0B,EAPU9rE,KAOQ8rE,QAIlB2P,IACAhwE,GAZUzL,KAYY8E,MACtB4G,GAbU1L,KAaYyE,QAK1Bo0C,EAAY,CAAC,aAAeptC,EAAa,IAAMC,EAAa,KAGxD+vE,EACA5iC,EAAU/wC,KAAK,0BACRgwC,GACPe,EAAU/wC,KAAK,UAAYgwC,EAAW,KAAOg0B,EAAQlwD,aAAa,MAAQ,GAAK,KAAOkwD,EAAQlwD,aAAa,MAAQ,GAAK,MAOxH2iD,EAAQmd,IAAWnd,EAAQod,KAC3B9iC,EAAU/wC,KAAK,SAAW8D,EAAK8vE,EAAQ,GAAK,IAAM9vE,EAAK+vE,EAAQ,GAAK,KAGpE9iC,EAAU7sC,QACV8/D,EAAQr7D,aAAa,YAAaooC,EAAU9gB,KAAK,OAYzD6jD,QAAS,WACL,IAAI9P,EAAU9rE,KAAK8rE,QAEnB,OADAA,EAAQljE,WAAWI,YAAY8iE,GACxB9rE,MA0BXuE,MAAO,SAAS0G,EAAc4wE,EAAkB3H,GAC5C,IAAI3vE,EACAu3E,EACA95E,EACAf,EAEA86E,EAGAC,EACAC,EALA3M,EAAU,GAEVlkE,EAAWpL,KAAKoL,SAChB8wE,EAAiB9wE,EAAS8wE,eA0D9B,OArDIjxE,GACAjL,KAAKiL,aAAeA,EACpBjL,KAAK67E,iBAAmBA,EACnB3H,IAAO3F,EAAS2F,KACjBl0E,KAAK+7E,QAAUA,EAAU7H,GAAO,WAChCtF,EAAMsN,EAAgBl8E,MACtBk8E,EAAep0E,KAAK9H,MACpBk0E,EAAM,QAKVjpE,EAAejL,KAAKiL,aACpB4wE,EAAmB77E,KAAK67E,iBACxBE,EAAU/7E,KAAK+7E,SAGnB7H,EAAMtoE,EAAKsoE,EAAK9oE,EAAS2wE,GAAU3wE,GAGnC7G,EAAQ0G,EAAa1G,MACrBu3E,EAAS7wE,EAAapG,cACtB7C,GAAKkyE,EAAIlyE,GAAK,IAAMiJ,EAAajJ,GAAK,GACtCf,GAAKizE,EAAIjzE,GAAK,IAAMgK,EAAahK,GAAK,GAGxB,UAAVsD,EACAy3E,EAAc,EACG,WAAVz3E,IACPy3E,EAAc,GAEdA,IACAh6E,IAAMkyE,EAAIpvE,OAASmG,EAAanG,OAAS,IAAMk3E,GAEnD1M,EAAQuM,EAAmB,aAAe,KAAOh8E,KAAKC,MAAMkC,GAI7C,WAAX85E,EACAG,EAAe,EACG,WAAXH,IACPG,EAAe,GAEfA,IACAh7E,IAAMizE,EAAIzvE,QAAUwG,EAAaxG,QAAU,IAAMw3E,GAErD3M,EAAQuM,EAAmB,aAAe,KAAOh8E,KAAKC,MAAMmB,GAG5DjB,KAAKA,KAAKm8E,OAAS,UAAY,QAAQ7M,GACvCtvE,KAAKm8E,QAAS,EACdn8E,KAAKo8E,UAAY9M,EAEVtvE,MAsBXq8E,QAAS,SAASC,EAAQC,GACtB,IACIC,EAEA13E,EACAL,EACAqzC,EACA2kC,EAGA34E,EAEA44E,EAGAC,EAZAvxE,EAFUpL,KAESoL,SAKnB0gE,EAPU9rE,KAOQ8rE,QAClBqD,EARUnvE,KAQOmvE,OAEjByN,EAVU58E,KAUQ48E,QAElBC,EAAQzxE,EAASyxE,MACjBC,EAAY1xE,EAAS0xE,UAuCzB,GAnCAL,GADA3kC,EAAWlsC,EAAK2wE,EAhBFv8E,KAgBe83C,WACZ2yB,EAGjB3mE,EAAWqrE,GAAUA,EAAOrrE,cAGZ6mE,IAAZiS,KAQ+B,KAN/BD,EAAWC,EAAQ/yD,YAMN3R,QAAQ,OACjBykE,EAAWA,EAASp0E,QAAQ,SAAU,MAI1Co0E,GAAY,CACJ,GACA7kC,GAAY,EACZh0C,EACAqrE,GAAUA,EAAOrqE,MACjBqqE,GAAUA,EAAO4N,cAEpBhlD,KAAK,MAIV4kD,IAAaL,IACbE,EAAOK,EAAMF,KAIZH,EAAM,CAGP,GAAI1Q,EAAQ3vD,eAvDFnc,KAuD2BiqE,QAAU7+D,EAAS5D,UAAW,CAC/D,KAIIk1E,EAAuB18E,KAAK44E,QAAU,SAASxyE,GAC3C7G,EAAKusE,EAAQryD,iBAAiB,6BAA6B,SAAS++D,GAChEA,EAAMh4E,MAAM4F,QAAUA,QAM1Bs2E,EAAqB,QAGzBF,EAAO1Q,EAAQuQ,QAGX75E,EAAO,GAAIspE,EAAQuQ,WAAa,CAG5Bv3E,MAAOgnE,EAAQlhE,YACfnG,OAAQqnE,EAAQhhE,cAIpB4xE,GACAA,EAAqB,IAE3B,MAAOrzE,MAIJmzE,GAAQA,EAAK13E,MAAQ,KACtB03E,EAAO,CACH13E,MAAO,EACPL,OAAQ,SAQhB+3E,EApGMx8E,KAoGSg9E,cAmCnB,GA7BI5xE,EAAS6xE,QACTn4E,EAAQ03E,EAAK13E,MACbL,EAAS+3E,EAAK/3E,OAWV0qE,GACoB,SAApBA,EAAOrrE,UACgB,KAAvBjE,KAAKC,MAAM2E,KAEX+3E,EAAK/3E,OAASA,EAAS,IAIvBqzC,IACA0kC,EAAK13E,MAAQjF,KAAKuU,IAAI3P,EAAS5E,KAAKqkB,IAAIu4D,IAAQ58E,KAAKuU,IAAItP,EAAQjF,KAAKkrB,IAAI0xD,IAC1ED,EAAK/3E,OAAS5E,KAAKuU,IAAI3P,EAAS5E,KAAKkrB,IAAI0xD,IAAQ58E,KAAKuU,IAAItP,EAAQjF,KAAKqkB,IAAIu4D,MAM/EE,GAAYH,EAAK/3E,OAAS,EAAG,CAG7B,KAAOq4E,EAAU9wE,OAAS,YACf6wE,EAAMC,EAAU5uC,SAGtB2uC,EAAMF,IACPG,EAAUh1E,KAAK60E,GAEnBE,EAAMF,GAAYH,GAG1B,OAAOA,GAYXU,KAAM,SAASva,GACX,OAAO3iE,KAAKK,KAAK,CACb88E,WAAYxa,EAAU,UAAY,aAU1Cya,KAAM,WACF,OAAOp9E,KAAKK,KAAK,CACb88E,WAAY,YAUpBE,QAAS,SAAS93D,GACd,IAAI+3D,EAAct9E,KAClBs9E,EAAY7H,QAAQ,CAChBrG,QAAS,GACV,CACC7pD,SAAUA,GAAY,IACtBinD,SAAU,WACN8Q,EAAYj9E,KAAK,CACbY,GAAI,WAiBpB6K,IAAK,SAASoD,GAEV,IAEIquE,EAFAnyE,EAAWpL,KAAKoL,SAChB0gE,EAAU9rE,KAAK8rE,QAkCnB,OA/BI58D,IACAlP,KAAKw9E,YAActuE,GAIvBlP,KAAKy9E,eAAiBvuE,GAAUA,EAAOusE,cAGlB9Q,IAAjB3qE,KAAK48E,SACLxxE,EAAS8vE,UAAUl7E,MAIvBA,KAAKi7E,OAAQ,IAIR/rE,GAAUA,EAAOwuE,SAAW19E,KAAK2J,UAClC4zE,EAAWv9E,KAAK29E,gBAIfJ,IACAruE,EAASA,EAAO48D,QAAU1gE,EAAS8oE,KAAKlrE,YAAY8iE,GAIrD9rE,KAAK49E,OACL59E,KAAK49E,QAGF59E,MASX69E,gBAAiB,SAAS/R,GACtB,IAAIljE,EAAakjE,EAAQljE,WACrBA,GACAA,EAAWyT,YAAYyvD,IAU/BxjE,QAAS,WACL,IAMIw1E,EAEAn+E,EARA26E,EAAUt6E,KACV8rE,EAAUwO,EAAQxO,SAAW,GAC7BiS,EACAzD,EAAQlvE,SAAS6xE,OACI,SAArBnR,EAAQmJ,UACRqF,EAAQkD,YAERn9D,EAAkByrD,EAAQzrD,gBA0B9B,GAtBAyrD,EAAQrmE,QAAUqmE,EAAQxhE,WAAawhE,EAAQzhE,YAC3CyhE,EAAQkS,YAAclS,EAAQvrD,MAAQ,KAC1CtL,EAAKqlE,GAEDA,EAAQ2D,UAAY59D,IAGpB9gB,EACI8gB,EAAgB5G,iBAAiB,gBACjC,SAASy1D,GAGDA,EAAGtzD,aAAa,aACf1D,QAAQoiE,EAAQ2D,SAASnS,QAAQh9D,GAAK,MAAQ,GAC/CogE,EAAGj0D,gBAAgB,gBAI/Bq/D,EAAQ2D,SAAW3D,EAAQ2D,SAAS31E,WAIpCgyE,EAAQ1D,MAAO,CACf,IAAKj3E,EAAI,EAAGA,EAAI26E,EAAQ1D,MAAM5qE,OAAQrM,IAClC26E,EAAQ1D,MAAMj3E,GAAK26E,EAAQ1D,MAAMj3E,GAAG2I,UAExCgyE,EAAQ1D,MAAQ,KAWpB,IAPA0D,EAAQuD,gBAAgB/R,GAGxBwO,EAAQ4D,iBAIDH,GAAiBA,EAAcI,KAA+C,IAAxCJ,EAAcI,IAAIt1E,WAAWmD,QACtE8xE,EAAcC,EAAcP,YAC5BlD,EAAQuD,gBAAgBE,EAAcI,YAC/BJ,EAAcI,IACrBJ,EAAgBD,EAYpB,OARIxD,EAAQyB,SACRnN,EAAM0L,EAAQlvE,SAAS8wE,eAAgB5B,GAG3C5N,EAAW4N,GAAS,SAAS3N,EAAK34D,UACvBsmE,EAAQtmE,MAGZ,MAkCXoqE,OAAQ,SAASC,EAAejkE,EAAOkkE,GACnC,IACI3+E,EACAy+E,EAEA3F,EACA8F,EACAC,EAGA3lC,EATAghC,EAAU,GAGV/N,EAAU9rE,KAAK8rE,QAQnB,GAAKuS,GAGE,IAAKr+E,KAAK65E,QAAS,CAMtB,IALA0E,EAAc3yE,EAAKyyE,EAAcv5E,MAAO,GACxC05E,GAAwBH,EAAcjP,SAAW,KAAQmP,EACzD1lC,EAAY74C,KAAKy9E,eACb,UACA,IAAM7xE,EAAKyyE,EAAcI,QAAS,GAAK,KAAO7yE,EAAKyyE,EAAcK,QAAS,GAAK,IAC9E/+E,EAAI,EAAGA,GAAK4+E,EAAa5+E,IAC1By+E,EAAStS,EAAQqN,UAAU,GAC3BV,EAA6B,EAAd8F,EAAmB,EAAK,EAAI5+E,EAC3CU,EAAK+9E,EAAQ,CACT,SAAY,OACZ,OAAUC,EAAc7/E,OAAS,UACjC,iBAAkBggF,EAAuB7+E,EACzC,eAAgB84E,EAChB,UAAa,YAAc5/B,EAC3B,KAAQ,SAERylC,IACAj+E,EAAK+9E,EAAQ,SAAUv+E,KAAK4C,IAAIpC,EAAK+9E,EAAQ,UAAY3F,EAAa,IACtE2F,EAAOnE,UAAYxB,GAGnBr+D,EACAA,EAAM0xD,QAAQ9iE,YAAYo1E,GAE1BtS,EAAQljE,WAAW2U,aAAa6gE,EAAQtS,GAG5C+N,EAAQ/xE,KAAKs2E,GAGjBp+E,KAAK65E,QAAUA,QAjCf75E,KAAKk+E,iBAmCT,OAAOl+E,MAQXk+E,eAAgB,WACZ3+E,EAAKS,KAAK65E,SAAW,IAAI,SAASuE,GAC9Bp+E,KAAK69E,gBAAgBO,KACtBp+E,MACHA,KAAK65E,aAAUlP,GAKnBgU,QAAS,SAAS3qE,GAQd,MAP8B,WAA1BhU,KAAK8rE,QAAQmJ,WACD,MAARjhE,EACAA,EAAM,KACS,MAARA,IACPA,EAAM,OAGPhU,KAAKw5E,eAAexlE,IAW/BwlE,eAAgB,SAASxlE,GACrB,IAAI43D,EAAMhgE,EAAK5L,KAAKgU,GAAMhU,KAAK8rE,QAAU9rE,KAAK8rE,QAAQlwD,aAAa5H,GAAO,KAAM,GAKhF,MAHI,eAAe5M,KAAKwkE,KACpBA,EAAM9/C,WAAW8/C,IAEdA,GAIXF,QAAS,SAAStsE,EAAO4U,EAAK83D,GACtB1sE,GAASA,EAAM24B,OACf34B,EAAQA,EAAM24B,KAAK,MAEnB,gBAAgB3wB,KAAKhI,KACrBA,EAAQ,SAEZ0sE,EAAQr7D,aAAauD,EAAK5U,GAE1BY,KAAKgU,GAAO5U,GAGhBw/E,gBAAiB,SAASx/E,GACtB,IAAIO,EACA84E,EAAcz4E,KAAK,gBAQvB,GAJoB,YAAhBy4E,IACAA,EAAc,GAElBr5E,EAAQA,GAASA,EAAMoJ,cACZ,CAaP,IADA7I,GAXAP,EAAQA,EACHmJ,QAAQ,kBAAmB,gBAC3BA,QAAQ,eAAgB,WACxBA,QAAQ,WAAY,QACpBA,QAAQ,YAAa,QACrBA,QAAQ,WAAY,QACpBA,QAAQ,OAAQ,QAChBA,QAAQ,OAAQ,QAChBA,QAAQ,KAAM,IACdgT,MAAM,MAEDvP,OACHrM,KACHP,EAAMO,GAAKoqE,EAAK3qE,EAAMO,IAAM84E,EAEhCr5E,EAAQA,EAAM24B,KAAK,KACdxvB,QAAQ,OAAQ,QACrBvI,KAAK8rE,QAAQr7D,aAAa,mBAAoBrR,KAItDy/E,YAAa,SAASz/E,GAMlBY,KAAK8rE,QAAQr7D,aAAa,cALZ,CACVzF,KAAM,QACN2a,OAAQ,SACR5a,MAAO,OAEsC3L,KAErD0/E,cAAe,SAAS1/E,EAAO4U,EAAK83D,GAChC9rE,KAAKgU,GAAO5U,EACZ0sE,EAAQr7D,aAAauD,EAAK5U,IAE9B2/E,YAAa,SAAS3/E,GAClB,IAAI4/E,EAAYh/E,KAAK8rE,QAAQ+M,qBAAqB,SAAS,GACtDmG,IACDA,EAAYhV,EAAIpjE,gBAAgB5G,KAAKiqE,OAAQ,SAC7CjqE,KAAK8rE,QAAQ9iE,YAAYg2E,IAIzBA,EAAU/F,YACV+F,EAAU3iE,YAAY2iE,EAAU/F,YAGpC+F,EAAUh2E,YACNghE,EAAIiV,eACC7iD,OAAOxwB,EAAKxM,GAAQ,IAAKmJ,QAAQ,WAAY,OAI1D22E,WAAY,SAAS9/E,GACbA,IAAUY,KAAK48E,iBAER58E,KAAKw8E,KAEZx8E,KAAK48E,QAAUx9E,EACXY,KAAKi7E,OACLj7E,KAAKoL,SAAS8vE,UAAUl7E,QAIpC6tE,WAAY,SAASzuE,EAAO4U,EAAK83D,GACR,iBAAV1sE,EACP0sE,EAAQr7D,aAAauD,EAAK5U,GACnBA,GACPY,KAAKo3E,cAAch4E,EAAO4U,EAAK83D,IAGvCqT,iBAAkB,SAAS//E,EAAO4U,EAAK83D,GAErB,YAAV1sE,EACA0sE,EAAQ7wD,gBAAgBjH,GAExB83D,EAAQr7D,aAAauD,EAAK5U,IAGlCu+E,aAAc,SAASv+E,EAAO4U,GAC1B,IAIInL,EACAu2E,EACAC,EAEA9B,EAEA59E,EAVAyL,EAAWpL,KAAKoL,SAChBoyE,EAAcx9E,KAAKw9E,YAEnB50E,GADgB40E,GAAepyE,GACJ0gE,SAAW1gE,EAAS8oE,IAI/CpI,EAAU9rE,KAAK8rE,QAEfC,EAAM/rE,KAAKi7E,MAef,GAZI1c,EAAQn/D,KACR0sE,EAAQniE,OAASvK,EACjBA,GAASA,EACLY,KAAKgU,KAAS5U,IACd2sE,GAAM,GAEV/rE,KAAKgU,GAAO5U,GAMZ2sE,EAAK,CAQL,KAPA3sE,EAAQY,KAAK2J,SAEA6zE,IACTA,EAAYE,SAAU,GAG1B70E,EAAaD,EAAWC,WACnBlJ,EAAI,EAAGA,EAAIkJ,EAAWmD,SAAWuxE,EAAU59E,IAE5C0/E,GADAD,EAAev2E,EAAWlJ,IACCgK,OACvBy1E,IAAiBtT,IAEb/B,EAAKsV,GAAejgF,IAElBm/D,EAAQn/D,IAAUm/D,EAAQ8gB,IAI3BjgF,EAAQ,IAAMm/D,EAAQ8gB,IAAgBz2E,IAAewC,EAAS8oE,OAGnEtrE,EAAW2U,aAAauuD,EAASsT,GACjC7B,GAAW,GAGdA,GACD30E,EAAWI,YAAY8iE,GAG/B,OAAOyR,GAEX3D,eAAgB,SAASx6E,EAAO4U,EAAK83D,GACjCA,EAAQr7D,aAAauD,EAAK5U,MAKlC43E,EAAWl0E,UAAUw8E,QAAUtI,EAAWl0E,UAAU67E,QACpD3H,EAAWl0E,UAAUy8E,iBAAmBvI,EAAWl0E,UAAU08E,iBACzDxI,EAAWl0E,UAAU28E,eAAiBzI,EAAWl0E,UAAU48E,oBAC3D1I,EAAWl0E,UAAU68E,aAAe3I,EAAWl0E,UAAU88E,aAAe,SAASxgF,EAAO4U,GACpFhU,KAAKgU,GAAO5U,EACZY,KAAK25E,aAAc,GAM3B3C,EAAWl0E,UAAU,sBAAwBk0E,EAAWl0E,UAAUgrE,aAAe,SAAS1uE,EAAO4U,EAAK83D,GAClG9rE,KAAKgU,GAAO5U,EAERY,KAAK4E,QAAU5E,KAAK,iBACpBg3E,EAAWl0E,UAAU+qE,WAAW5+D,KAAKjP,KAAMA,KAAK4E,OAAQ,SAAUknE,GAClEA,EAAQr7D,aAAa,eAAgBzQ,KAAK,iBAC1CA,KAAK6/E,WAAY,GACF,iBAAR7rE,GAAoC,IAAV5U,GAAeY,KAAK6/E,YACrD/T,EAAQ7wD,gBAAgB,UACxBjb,KAAK6/E,WAAY,IA+BzB5I,EAAc7kE,EAAE6kE,YAAc,WAC1Bj3E,KAAKs2E,KAAK/rE,MAAMvK,KAAMwK,YAE1BhI,EAAOy0E,EAAYn0E,UAA0D,CAMzEyN,QAASymE,EACT/M,OAAQA,EAKRqM,KAAM,SAASluE,EAAWtD,EAAOL,EAAQjE,EAAOgH,EAAWs4E,GACvD,IACIC,EACAjU,EAqEAkU,EAAa7+D,EA3DjB2qD,GAPAiU,EALe//E,KAKOoC,cAAc,OAC/B/B,KAAK,CACF,QAAW,MACX,MAAS,oBAGZiC,IAAItC,KAAK2zE,SAASnzE,KACFsrE,QACrB1jE,EAAUY,YAAY8iE,IAGwB,IAA1C1jE,EAAUC,UAAU6P,QAAQ,UAC5B7X,EAAKyrE,EAAS,QAAS9rE,KAAKiqE,QAjBjBjqE,KAqBNi9E,OAAQ,EAMjBj9E,KAAKk0E,IAAMpI,EAKX9rE,KAAK+/E,WAAaA,EAhCH//E,KAiCNk8E,eAAiB,GAO1Bl8E,KAAKiF,KAAOqlE,GAAaM,IAAaZ,EAAI6O,qBAAqB,QAAQ7sE,OACnE69D,EAAIhjD,SAASo5D,KACZ13E,QAAQ,QAAS,IACjBA,QAAQ,WAAY,IACpBA,QAAQ,aAAc,QACtBA,QAAQ,KAAM,OACf,GAGGvI,KAAKoC,cAAc,QAAQ0J,MAC7BggE,QAAQ9iE,YAAYghE,EAAIiV,eAAe,mCAlD7Bj/E,KAqDNk4E,KAAOl4E,KAAKoC,cAAc,QAAQ0J,MArD5B9L,KAsDN8/E,UAAYA,EAtDN9/E,KAuDNwH,UAAYA,EAvDNxH,KAwDNy3E,UAAY,GAxDNz3E,KAyDN68E,MAAQ,GAzDF78E,KA0DN88E,UAAY,GA1DN98E,KA2DNkgF,SAAW,EA3DLlgF,KA6DNmgF,QAAQr7E,EAAOL,GAAQ,GAW5B6lE,GAAaliE,EAAUgZ,yBACvB4+D,EAAc,WACV19E,EAAI8F,EAAW,CACX4C,KAAM,EACNlE,IAAK,IAETqa,EAAO/Y,EAAUgZ,wBACjB9e,EAAI8F,EAAW,CACX4C,KAAOnL,KAAKipB,KAAK3H,EAAKnW,MAAQmW,EAAKnW,KAAQ,KAC3ClE,IAAMjH,KAAKipB,KAAK3H,EAAKra,KAAOqa,EAAKra,IAAO,WAjFrC9G,KAyFFogF,cAAgBl+E,EAAS2nE,EAAK,SAAUmW,KAYzDrM,SAAU,SAASnzE,GAOf,OANAR,KAAKQ,MAAQgC,EAAO,CAEhB69E,WAAY,uEACZv8E,SAAU,QAEXtD,GACIR,KAAKQ,OAMhB8/E,SAAU,SAAS9/E,GACfR,KAAK+/E,WAAWz9E,IAAItC,KAAK2zE,SAASnzE,KAYtC+/E,SAAU,WACN,OAAQvgF,KAAK+/E,WAAW1D,UAAUv3E,OAMtCwD,QAAS,WACL,IACIk4E,EADWxgF,KACak4E,KAqB5B,OAtBel4E,KAENk0E,IAAM,KAFAl0E,KAGN+/E,WAHM//E,KAGgB+/E,WAAWz3E,UAG1CwqE,EANe9yE,KAMkBy3E,WAAa,IAN/Bz3E,KAONy3E,UAAY,KAIjB+I,IAXWxgF,KAYFk4E,KAAOsI,EAAal4E,WAZlBtI,KAgBFogF,eAhBEpgF,KAiBFogF,gBAjBEpgF,KAoBNk8E,eAAiB,KAEnB,MAYX95E,cAAe,SAAS6yE,GACpB,IAAIqF,EAAU,IAAIt6E,KAAKuQ,QAEvB,OADA+pE,EAAQhE,KAAKt2E,KAAMi1E,GACZqF,GAQXmG,KAAMxV,EASNgN,cAAe,SAASJ,EAAiBN,GACrC,MAAO,CACHjuD,GAAKuuD,EAAgB,GAAKA,EAAgB,GAAK,EAAKN,EAASjuD,GAAKuuD,EAAgB,GAClFtuD,GAAKsuD,EAAgB,GAAKA,EAAgB,GAAK,EAAKN,EAAShuD,GAAKsuD,EAAgB,GAClFp2E,EAAG81E,EAAS91E,EAAIo2E,EAAgB,KAIxC6I,aAAc,SAASpG,EAAS9B,GAC5B,IAEImI,EADOrG,EAAQ+B,SAAQ,GACJv3E,MAMvB,OAHKlG,GALUoB,KAKMwH,YACjBm5E,EANW3gF,KAMY4gF,iBAAiBpI,EAAMS,WAAWz5E,KAAM86E,EAAQnL,SAEpEwR,GAGXE,cAAe,SAASvG,EAAS9B,EAAOl4E,EAAMwE,GAC1C,IAIIg8E,EAHAH,EADW3gF,KACY0gF,aAAapG,EAAS9B,GAC7CuI,EAAaJ,EAAc77E,EAG3Bk8E,EAAW,EACXC,EAAW3gF,EAAK0L,OAChBk1E,EAAc,SAASz3E,GACnB+uE,EAAMn8D,YAAYm8D,EAAMS,YACpBxvE,GACA+uE,EAAMxvE,YAAYghE,EAAIiV,eAAex1E,KAGjD,GAAIs3E,EAAY,CACZ,KAAOC,GAAYC,GACfH,EAAejhF,KAAKipB,MAAMk4D,EAAWC,GAAY,GAEjDC,EADM5gF,EAAK06B,UAAU,EAAG8lD,GAAgB,KAExCH,EAlBO3gF,KAkBgB0gF,aAAapG,EAAS9B,GACzCwI,IAAaC,EAEbD,EAAWC,EAAW,EACfN,EAAc77E,EAErBm8E,EAAWH,EAAe,EAG1BE,EAAWF,EAIF,IAAbG,GAEAC,EAAY,IAGpB,OAAOH,GAWX7F,UAAW,SAASZ,GAChB,IAKIlsC,EAEA+yC,EACAC,EACAC,EACAN,EASAO,EACAC,EApBAC,EAAWlH,EAAQxO,QACnB1gE,EAAWpL,KACXwH,EAAY4D,EAAS5D,UACrBo1E,EAAUhxE,EAAK0uE,EAAQsC,QAAS,IAAI/yD,WACpC43D,GAAsC,IAA1B7E,EAAQ1kE,QAAQ,KAE5BrP,EAAa24E,EAAS34E,WAKtB64E,EAAUrhF,EAAKmhF,EAAU,KACzBG,EAAarH,EAAQnL,OACrBrqE,EAAQw1E,EAAQI,UAChBkH,EAAiBD,GAAcA,EAAWE,WAC1CvJ,EAAcqJ,GAAcA,EAAWrJ,YACvCwJ,EAAWH,GAA0C,aAA5BA,EAAW5E,aACpCgF,EAASJ,GAAwC,WAA1BA,EAAWK,WAClCl+E,EAAW69E,GAAcA,EAAW79E,SAGpCnE,EAAIkJ,EAAWmD,OACfi2E,EAAan9E,IAAUw1E,EAAQW,OAASj7E,KAAKk0E,IAC7CgO,EAAgB,SAAS1J,GACrB,IAAI2J,EAOJ,OALAA,EAAgB,WAAW/6E,KAAKoxE,GAASA,EAAMh4E,MAAMsD,UACjD00E,EAAMh4E,MAAMsD,SACXA,GAAYsH,EAAS5K,MAAMsD,UAAY,GAGrC89E,EACH7X,EAAK6X,GACLx2E,EAASg3E,YACLD,EAEA3J,EAAM58D,aAAa,SAAW48D,EAAQgJ,GACxC96E,GAEV27E,EAAwB,SAASC,GAC7B,OAAOA,EAAS/5E,QAAQ,QAAS,KAAKA,QAAQ,QAAS,MAc/D,IATA+4E,EAAY,CACR1E,EACAkF,EACAC,EACAH,EACAtJ,EACAx0E,EACAgB,GACFizB,KAAK,QACWuiD,EAAQgH,UAA1B,CAMA,IAHAhH,EAAQgH,UAAYA,EAGb3hF,KACH6hF,EAASnlE,YAAYxT,EAAWlJ,IAK/B8hF,GAAcnJ,GAAgBwJ,GAAah9E,IAAmC,IAA1B83E,EAAQ1kE,QAAQ,MAMrEipE,EAAW,wBACXC,EAAa,wBACbC,EAAY,uBAERY,GACAA,EAAWj5E,YAAYw4E,GAIvBpzC,EADAqzC,EACQ7E,EAEHr0E,QAAQ,gBAAiB,mCACzBA,QAAQ,YAAa,oCAErBA,QAAQ,MAAO,SACfA,QAAQ,yBAA0B,WAClCgT,MAAM,YAGH,CAACqhE,GAKbxuC,EAAQkkC,EAAKlkC,GAAO,SAASzB,GACzB,MAAgB,KAATA,KAKXptC,EAAK6uC,GAAO,SAAwBzB,EAAM41C,GACtC,IAAIC,EACAC,EAAS,EACb91C,EAAOA,EACFpkC,QAAQ,aAAc,IACtBA,QAAQ,SAAU,YAClBA,QAAQ,YAAa,cAC1Bi6E,EAAQ71C,EAAKpxB,MAAM,OAEnBhc,EAAKijF,GAAO,SAAwBvpB,GAChC,GAAa,KAATA,GAAgC,IAAjBupB,EAAMx2E,OAAc,CACnC,IAEI02E,EACAC,EAHAC,EAAa,GACbpK,EAAQxO,EAAIpjE,gBAAgBwE,EAAS6+D,OAAQ,SAqBjD,GAlBIkX,EAAS/5E,KAAK6xD,KACdypB,EAAUzpB,EAAK/5C,MAAMiiE,GAAU,GAC/B9gF,EAAKm4E,EAAO,QAASkK,IAErBtB,EAAWh6E,KAAK6xD,KAChB0pB,EAAY1pB,EAAK/5C,MAAMkiE,GAAY,GAAG74E,QAAQ,qBAAsB,YACpElI,EAAKm4E,EAAO,QAASmK,IAErBtB,EAAUj6E,KAAK6xD,KAAUzxD,IACzBnH,EAAKm4E,EAAO,UAAW,kBAAqBvf,EAAK/5C,MAAMmiE,GAAW,GAAK,KACvE/+E,EAAIk2E,EAAO,CACP/tE,OAAQ,aAOH,OAHbwuD,EAAOopB,EAAsBppB,EAAK1wD,QAAQ,cAAe,KAAO,MAG9C,CA2Cd,GAxCAiwE,EAAMxvE,YAAYghE,EAAIiV,eAAehmB,IAEhCwpB,EAKDG,EAAW//D,GAAK,EAJZ0/D,GAAsB,OAAZb,IACVkB,EAAW5gF,EAAI0/E,GAOvBrhF,EAAKm4E,EAAOoK,GAGZpB,EAASx4E,YAAYwvE,IAGhBiK,GAAUlB,KAGN3iF,GAAO4I,GACRlF,EAAIk2E,EAAO,CACPpyE,QAAS,UAMjB/F,EACIm4E,EACA,KACA0J,EAAc1J,KASlB1zE,EAAO,CACP,IAEI+9E,EAEAlC,EAJAmC,EAAQ7pB,EAAK1wD,QAAQ,YAAa,QAAQgT,MAAM,KAChDwnE,EAAgBP,EAAMx2E,OAAS,GAAKu2E,GAAWO,EAAM92E,OAAS,IAAM+1E,EAEpEiB,EAAO,GAEPlgE,EAAKo/D,EAAc1J,GACnB1gC,EAAWwiC,EAAQxiC,SAMvB,IAJIgqC,IACAf,EAAa31E,EAASy1E,cAAcvG,EAAS9B,EAAOvf,EAAMn0D,KAGtDg9E,GAAYiB,IAAkBD,EAAM92E,QAAUg3E,EAAKh3E,SACvDsuE,EAAQxiC,SAAW,EAEnB+qC,GADAlC,EAAcv1E,EAASs1E,aAAapG,EAAS9B,IACrB1zE,OAGL6lE,IAAfoW,IACAA,EAAa8B,GAKZA,GAA4B,IAAjBC,EAAM92E,QAmBlBwsE,EAAMn8D,YAAYm8D,EAAMS,YACxB+J,EAAKtjC,QAAQojC,EAAM70C,SAnBnB60C,EAAQE,EACRA,EAAO,GAEHF,EAAM92E,SAAW+1E,IACjBvJ,EAAQxO,EAAIpjE,gBAAgBqjE,EAAQ,SACpC5pE,EAAKm4E,EAAO,CACR11D,GAAIA,EACJ9gB,EAAG0/E,IAEHiB,GACAtiF,EAAKm4E,EAAO,QAASmK,GAEzBnB,EAASx4E,YAAYwvE,IAErBmI,EAAc77E,IACdA,EAAQ67E,IAMZmC,EAAM92E,QACNwsE,EAAMxvE,YAAYghE,EAAIiV,eAAe6D,EAAM/qD,KAAK,KAAKxvB,QAAQ,MAAO,OAG5E+xE,EAAQxiC,SAAWA,EAGvB2qC,SAKZlB,EAAmBA,GAAoBC,EAAS34E,WAAWmD,UAG3D+0E,GACAzG,EAAQj6E,KAAK,QAASi6E,EAAQsC,SAE9BqF,GACAA,EAAW5lE,YAAYmlE,GAIvBlJ,GAAegC,EAAQjC,kBACvBiC,EAAQjC,iBAAiBC,IAtL7BkJ,EAASx4E,YAAYghE,EAAIiV,eAAeoD,EAAsBzF,OAoOtEjE,YAAa,SAASjC,GAWlB,OAVAA,EAAOl4E,EAAMk4E,GAAMA,MAUP,GAAKA,EAAK,GAAKA,EAAK,GAAK,IAAU,UAAY,WAoB/D7qE,OAAQ,SAASvL,EAAM0B,EAAGf,EAAG8G,EAAUk7E,EAAaC,EAAYC,EAAcC,EAAeC,GACzF,IAWIC,EACAC,EACAC,EACAC,EAdAC,EAAQ1jF,KAAK0jF,MAAMpjF,EAAM0B,EAAGf,EAAGoiF,EAAO,KAAM,KAAM,KAAM,KAAM,UAC9DM,EAAW,EA8Ff,OA3FAD,EAAMrjF,KAAKkC,EAAM,CACb,QAAW,EACX,EAAK,GACN0gF,IAUHA,EAAc1gF,EAAM,CAChBoC,KAAM,UACNC,OAAQ,UACR,eAAgB,EAChBpE,MAAO,CACHhC,MAAO,UACPiM,OAAQ,UACRm5E,WAAY,WAEjBX,GACHK,EAAcL,EAAYziF,aACnByiF,EAAYziF,MAGnB0iF,EAAa3gF,EAAM0gF,EAAa,CAC5Bt+E,KAAM,WACPu+E,GACHK,EAAaL,EAAW1iF,aACjB0iF,EAAW1iF,MAGlB2iF,EAAe5gF,EAAM0gF,EAAa,CAC9Bt+E,KAAM,UACNnE,MAAO,CACHhC,MAAO,UACPolF,WAAY,SAEjBT,GACHK,EAAeL,EAAa3iF,aACrB2iF,EAAa3iF,MAGpB4iF,EAAgB7gF,EAAM0gF,EAAa,CAC/BziF,MAAO,CACHhC,MAAO,YAEZ4kF,GACHK,EAAgBL,EAAc5iF,aACvB4iF,EAAc5iF,MAIrB0B,EAASwhF,EAAM5X,QAAS3B,EAAO,YAAc,cAAc,WACtC,IAAbwZ,GACAD,EAAM35E,SAAS,MAGvB7H,EAASwhF,EAAM5X,QAAS3B,EAAO,WAAa,cAAc,WACrC,IAAbwZ,GACAD,EAAM35E,SAAS45E,MAIvBD,EAAM35E,SAAW,SAAS85E,GAER,IAAVA,IACAH,EAAMG,MAAQF,EAAWE,GAG7BH,EAAMrJ,YAAY,qDACbH,SAAS,qBAAuB,CAAC,SAAU,QAAS,UAAW,YAAY2J,GAAS,IAGzFH,EAAMrjF,KAAK,CAAC4iF,EAAaC,EAAYC,EAAcC,GAAeS,GAAS,IACtEvhF,IAAI,CAACghF,EAAaC,EAAYC,EAAcC,GAAeI,GAAS,KAO7EH,EACKrjF,KAAK4iF,GACL3gF,IAAIE,EAAO,CACRiI,OAAQ,WACT64E,IAGAI,EACF/iF,GAAG,SAAS,SAAS0I,GACD,IAAbs6E,GACA57E,EAASkH,KAAKy0E,EAAOr6E,OAcrCy6E,UAAW,SAAS53C,EAAQpnC,GASxB,OAPIonC,EAAO,KAAOA,EAAO,KAErBA,EAAO,GAAKA,EAAO,GAAKrsC,KAAKC,MAAMosC,EAAO,IAAOpnC,EAAQ,EAAI,GAE7DonC,EAAO,KAAOA,EAAO,KACrBA,EAAO,GAAKA,EAAO,GAAKrsC,KAAKC,MAAMosC,EAAO,IAAOpnC,EAAQ,EAAI,GAE1DonC,GA2BXuM,KAAM,SAASA,GACX,IAAI62B,EAAU,CAEV3qE,KAAM,QAQV,OALI6Q,EAAQijC,GACR62B,EAAQjwE,EAAIo5C,EACL01B,EAAS11B,IAChBj2C,EAAO8sE,EAAS72B,GAEbz4C,KAAKoC,cAAc,QAAQ/B,KAAKivE,IAmB3Cr2B,OAAQ,SAASj3C,EAAGf,EAAGQ,GACnB,IAAI6tE,EAAUnB,EAASnsE,GAAKA,EAAI,CACxBA,EAAGA,EACHf,EAAGA,EACHQ,EAAGA,GAEP64E,EAAUt6E,KAAKoC,cAAc,UAOjC,OAJAk4E,EAAQvB,QAAUuB,EAAQxB,QAAU,SAAS15E,EAAO4U,EAAK83D,GACrDA,EAAQr7D,aAAa,IAAMuD,EAAK5U,IAG7Bk7E,EAAQj6E,KAAKivE,IAuBxB3wE,IAAK,SAASqD,EAAGf,EAAGQ,EAAGsiF,EAAQ/uE,EAAOkN,GAClC,IAAIvjB,EACAgI,EAsBJ,OApBIwnE,EAASnsE,IAETf,GADA0F,EAAU3E,GACEf,EACZQ,EAAIkF,EAAQlF,EACZsiF,EAASp9E,EAAQo9E,OACjB/uE,EAAQrO,EAAQqO,MAChBkN,EAAMvb,EAAQub,IACdlgB,EAAI2E,EAAQ3E,GAEZ2E,EAAU,CACNo9E,OAAQA,EACR/uE,MAAOA,EACPkN,IAAKA,IAMbvjB,EAAMqB,KAAKqF,OAAO,MAAOrD,EAAGf,EAAGQ,EAAGA,EAAGkF,IACjClF,EAAIA,EACD9C,GA0BXwiB,KAAM,SAASnf,EAAGf,EAAG6D,EAAOL,EAAQhD,EAAGg3E,GAEnCh3E,EAAI0sE,EAASnsE,GAAKA,EAAEP,EAAIA,EAExB,IAAI64E,EAAUt6E,KAAKoC,cAAc,QAC7BktE,EAAUnB,EAASnsE,GAAKA,OAAU2oE,IAAN3oE,EAAkB,GAAK,CAC/CA,EAAGA,EACHf,EAAGA,EACH6D,MAAOjF,KAAK4C,IAAIqC,EAAO,GACvBL,OAAQ5E,KAAK4C,IAAIgC,EAAQ,IAsBjC,YAlBoBkmE,IAAhB8N,IACAnJ,EAAQmJ,YAAcA,EACtBnJ,EAAUgL,EAAQE,MAAMlL,IAE5BA,EAAQ3qE,KAAO,OAGXlD,IACA6tE,EAAQ7tE,EAAIA,GAGhB64E,EAAQ0J,QAAU,SAAS5kF,EAAO4U,EAAK83D,GACnCzrE,EAAKyrE,EAAS,CACV1pB,GAAIhjD,EACJijD,GAAIjjD,KAILk7E,EAAQj6E,KAAKivE,IAUxB6Q,QAAS,SAASr7E,EAAOL,EAAQgxE,GAC7B,IACIyG,EADWl8E,KACek8E,eAC1Bv8E,EAAIu8E,EAAelwE,OAiBvB,IAnBehM,KAIN8E,MAAQA,EAJF9E,KAKNyE,OAASA,EALHzE,KAON+/E,WAAWtK,QAAQ,CACxB3wE,MAAOA,EACPL,OAAQA,GACT,CACCyQ,KAAM,WACFlV,KAAKK,KAAK,CACN4jF,QAAS,OAASjkF,KAAKK,KAAK,SAAW,IAAML,KAAKK,KAAK,aAG/DklB,SAAU3Z,EAAK6pE,GAAS,QAAQ9K,EAAY,IAGzChrE,KACHu8E,EAAev8E,GAAG4E,SAgB1B9D,EAAG,SAAS6F,GACR,IAAIklE,EAAOxrE,KAAKoC,cAAc,KAC9B,OAAOkE,EAAOklE,EAAKnrE,KAAK,CACpB,MAAS,cAAgBiG,IACxBklE,GAmBT0Y,MAAO,SAASC,EAAKniF,EAAGf,EAAG6D,EAAOL,GAC9B,IAGI64E,EAHAhO,EAAU,CACN8U,oBAAqB,QAyB7B,OApBI55E,UAAUwB,OAAS,GACnBxJ,EAAO8sE,EAAS,CACZttE,EAAGA,EACHf,EAAGA,EACH6D,MAAOA,EACPL,OAAQA,KAIhB64E,EAAct9E,KAAKoC,cAAc,SAAS/B,KAAKivE,IAG/BxD,QAAQn7D,eACpB2sE,EAAYxR,QAAQn7D,eAAe,+BAC/B,OAAQwzE,GAIZ7G,EAAYxR,QAAQr7D,aAAa,cAAe0zE,GAE7C7G,GA0BXj4E,OAAQ,SAASA,EAAQrD,EAAGf,EAAG6D,EAAOL,EAAQkC,GAE1C,IACI6nE,EAkBA6V,EACAC,EApBAC,EAAMvkF,KAENwkF,EAAa,iBACbC,EAAUD,EAAWp9E,KAAK/B,GAC1Bq/E,GAAOD,IAAYzkF,KAAK+C,QAAQsC,GAAUA,EAAS,UAInDs/E,EAAWD,GAAO1kF,KAAK+C,QAAQ2hF,GAG/BjsC,EAAO8lB,EAAQv8D,IAAM2iF,GAAYA,EAAS11E,KACtCjP,KAAK+C,QACLlD,KAAKC,MAAMkC,GACXnC,KAAKC,MAAMmB,GACX6D,EACAL,EACAkC,GA8IR,OAzIIg+E,IACAnW,EAAMxuE,KAAKy4C,KAAKA,IAGZp4C,KAAK,OAAQ,QAIjBmC,EAAOgsE,EAAK,CACRiL,WAAYiL,EACZ1iF,EAAGA,EACHf,EAAGA,EACH6D,MAAOA,EACPL,OAAQA,IAERkC,GACAnE,EAAOgsE,EAAK7nE,IAKT89E,IAGPJ,EAAWh/E,EAAO6Z,MAAMslE,GAAY,IAGpChW,EAAMxuE,KAAKkkF,MAAMG,IAKbO,SAAWh5E,EACXm/D,EAAYsZ,IAAatZ,EAAYsZ,GAAUv/E,MAC/C6B,GAAWA,EAAQ7B,OAEvB0pE,EAAIqW,UAAYj5E,EACZm/D,EAAYsZ,IAAatZ,EAAYsZ,GAAU5/E,OAC/CkC,GAAWA,EAAQlC,QAKvB6/E,EAAc,WACV9V,EAAInuE,KAAK,CACLyE,MAAO0pE,EAAI1pE,MACXL,OAAQ+pE,EAAI/pE,UASpBlF,EAAK,CAAC,QAAS,WAAW,SAASyU,GAC/Bw6D,EAAIx6D,EAAM,UAAY,SAAS5U,EAAO4U,GAClC,IAAIs7D,EAAU,GACVwV,EAAU9kF,KAAK,MAAQgU,GACvB+wE,EAAgB,UAAR/wE,EAAkB,aAAe,aAC7ChU,KAAKgU,GAAO5U,EACRm/D,EAAQumB,KACJ9kF,KAAK8rE,SACL9rE,KAAK8rE,QAAQr7D,aAAauD,EAAK8wE,GAE9B9kF,KAAK67E,mBACNvM,EAAQyV,KAAW/kF,KAAKgU,IAAQ,GAAK8wE,GAAW,EAChD9kF,KAAKK,KAAKivE,SAOtB/Q,EAAQv8D,IACRwsE,EAAInuE,KAAK,CACL2B,EAAGA,EACHf,EAAGA,IAGXutE,EAAIwW,OAAQ,EAERzmB,EAAQiQ,EAAIoW,WAAarmB,EAAQiQ,EAAIqW,WACrCP,KAGA9V,EAAInuE,KAAK,CACLyE,MAAO,EACPL,OAAQ,IAKZrC,EAAc,MAAO,CACjBm0B,OAAQ,WAEJ,IAAIpvB,EAAQmG,EAAOi3E,EAAIU,YAIJ,IAAfjlF,KAAK8E,QACLxC,EAAItC,KAAM,CACN6G,SAAU,WACVC,IAAK,WAETkjE,EAAI3jE,KAAK2C,YAAYhJ,OAIzB+qE,EAAYsZ,GAAY,CACpBv/E,MAAO9E,KAAK8E,MACZL,OAAQzE,KAAKyE,QAEjB+pE,EAAIoW,SAAW5kF,KAAK8E,MACpB0pE,EAAIqW,UAAY7kF,KAAKyE,OAEjB+pE,EAAI1C,SACJwY,IAIAtkF,KAAK4I,YACL5I,KAAK4I,WAAWyT,YAAYrc,MAIhCukF,EAAIrE,YACCqE,EAAIrE,UAAY/4E,GAASA,EAAMovB,QAChCpvB,EAAMovB,UAGd4tD,IAAKE,IAETrkF,KAAKkgF,aAIN1R,GAcXzrE,QAAS,CACL,OAAU,SAASf,EAAGf,EAAGmI,EAAG1C,GAExB,OAAO1G,KAAKrB,IAAIqD,EAAIoH,EAAI,EAAGnI,EAAIyF,EAAI,EAAG0C,EAAI,EAAG1C,EAAI,EAAG,CAChDsO,MAAO,EACPkN,IAAe,EAAVriB,KAAKsjB,GACV4T,MAAM,KAId,OAAU,SAAS/0B,EAAGf,EAAGmI,EAAG1C,GACxB,MAAO,CACH,IAAK1E,EAAGf,EACR,IAAKe,EAAIoH,EAAGnI,EACZe,EAAIoH,EAAGnI,EAAIyF,EACX1E,EAAGf,EAAIyF,EACP,MAIR,SAAY,SAAS1E,EAAGf,EAAGmI,EAAG1C,GAC1B,MAAO,CACH,IAAK1E,EAAIoH,EAAI,EAAGnI,EAChB,IAAKe,EAAIoH,EAAGnI,EAAIyF,EAChB1E,EAAGf,EAAIyF,EACP,MAIR,gBAAiB,SAAS1E,EAAGf,EAAGmI,EAAG1C,GAC/B,MAAO,CACH,IAAK1E,EAAGf,EACR,IAAKe,EAAIoH,EAAGnI,EACZe,EAAIoH,EAAI,EAAGnI,EAAIyF,EACf,MAGR,QAAW,SAAS1E,EAAGf,EAAGmI,EAAG1C,GACzB,MAAO,CACH,IAAK1E,EAAIoH,EAAI,EAAGnI,EAChB,IAAKe,EAAIoH,EAAGnI,EAAIyF,EAAI,EACpB1E,EAAIoH,EAAI,EAAGnI,EAAIyF,EACf1E,EAAGf,EAAIyF,EAAI,EACX,MAGR,IAAO,SAAS1E,EAAGf,EAAGmI,EAAG1C,EAAGC,GACxB,IAWIhI,EAXAqW,EAAQrO,EAAQqO,MAChBotC,EAAKz7C,EAAQlF,GAAK2H,EAClBi5C,EAAK17C,EAAQlF,GAAKiF,GAAK0C,EACvB8Y,EAAMvb,EAAQub,IAAM,KACpBnjB,EAAc4H,EAAQo9E,OACtBhtD,EAAOpwB,EAAQowB,KACfmuD,EAAWrlF,KAAKkrB,IAAI/V,GACpBmwE,EAAWtlF,KAAKqkB,IAAIlP,GACpBowE,EAASvlF,KAAKkrB,IAAI7I,GAClBmjE,EAASxlF,KAAKqkB,IAAIhC,GAClBojE,EAAU3+E,EAAQub,IAAMlN,EAAQnV,KAAKsjB,GAAK,EAAI,EAkClD,OA/BAxkB,EAAM,CACF,IACAqD,EAAIogD,EAAK8iC,EACTjkF,EAAIohD,EAAK8iC,EACT,IACA/iC,EACAC,EACA,EACAijC,EACA,EACAtjF,EAAIogD,EAAKgjC,EACTnkF,EAAIohD,EAAKgjC,GAGT9mB,EAAQx/D,IACRJ,EAAImJ,KACAivB,EAAO,IAAM,IACb/0B,EAAIjD,EAAcqmF,EAClBnkF,EAAIlC,EAAcsmF,EAClB,IACAtmF,EACAA,EACA,EACAumF,EACA,EACAtjF,EAAIjD,EAAcmmF,EAClBjkF,EAAIlC,EAAcomF,GAI1BxmF,EAAImJ,KAAKivB,EAAO,GAAK,KACdp4B,GAMX4mF,QAAS,SAASvjF,EAAGf,EAAGmI,EAAG1C,EAAGC,GAC1B,IAMI8xC,EAJAh3C,EAAI5B,KAAKiS,IAAKnL,GAAWA,EAAQlF,GAAM,EAAG2H,EAAG1C,GAC7C8+E,EAAe/jF,EAFA,EAGfgkF,EAAU9+E,GAAWA,EAAQ8+E,QAC7BC,EAAU/+E,GAAWA,EAAQ++E,QA2EjC,OAxEAjtC,EAAO,CACH,IAAKz2C,EAAIP,EAAGR,EACZ,IAAKe,EAAIoH,EAAI3H,EAAGR,EAChB,IAAKe,EAAIoH,EAAGnI,EAAGe,EAAIoH,EAAGnI,EAAGe,EAAIoH,EAAGnI,EAAIQ,EACpC,IAAKO,EAAIoH,EAAGnI,EAAIyF,EAAIjF,EACpB,IAAKO,EAAIoH,EAAGnI,EAAIyF,EAAG1E,EAAIoH,EAAGnI,EAAIyF,EAAG1E,EAAIoH,EAAI3H,EAAGR,EAAIyF,EAChD,IAAK1E,EAAIP,EAAGR,EAAIyF,EAChB,IAAK1E,EAAGf,EAAIyF,EAAG1E,EAAGf,EAAIyF,EAAG1E,EAAGf,EAAIyF,EAAIjF,EACpC,IAAKO,EAAGf,EAAIQ,EACZ,IAAKO,EAAGf,EAAGe,EAAGf,EAAGe,EAAIP,EAAGR,GAIxBwkF,GAAWA,EAAUr8E,EAGjBs8E,EAAUzkF,EAAIukF,GAAgBE,EAAUzkF,EAAIyF,EAAI8+E,EAChD/sC,EAAKyK,OAAO,GAAI,EACZ,IAAKlhD,EAAIoH,EAAGs8E,EAzBL,EA0BP1jF,EAAIoH,EA3BE,EA2Bes8E,EACrB1jF,EAAIoH,EAAGs8E,EA3BA,EA4BP1jF,EAAIoH,EAAGnI,EAAIyF,EAAIjF,GAKnBg3C,EAAKyK,OAAO,GAAI,EACZ,IAAKlhD,EAAIoH,EAAG1C,EAAI,EAChB++E,EAASC,EACT1jF,EAAIoH,EAAG1C,EAAI,EACX1E,EAAIoH,EAAGnI,EAAIyF,EAAIjF,GAKhBgkF,GAAWA,EAAU,EAGxBC,EAAUzkF,EAAIukF,GAAgBE,EAAUzkF,EAAIyF,EAAI8+E,EAChD/sC,EAAKyK,OAAO,GAAI,EACZ,IAAKlhD,EAAG0jF,EA/CD,EAgDP1jF,EAjDM,EAiDW0jF,EACjB1jF,EAAG0jF,EAjDI,EAkDP1jF,EAAGf,EAAIQ,GAKXg3C,EAAKyK,OAAO,GAAI,EACZ,IAAKlhD,EAAG0E,EAAI,EACZ++E,EAASC,EACT1jF,EAAG0E,EAAI,EACP1E,EAAGf,EAAIQ,GAIRikF,GAAWA,EAAUh/E,GAAK++E,EAAUzjF,EAAIwjF,GAAgBC,EAAUzjF,EAAIoH,EAAIo8E,EACjF/sC,EAAKyK,OAAO,GAAI,EACZ,IAAKuiC,EAjEM,EAiEkBxkF,EAAIyF,EACjC++E,EAASxkF,EAAIyF,EAnEH,EAoEV++E,EAnEW,EAmEaxkF,EAAIyF,EAC5B1E,EAAIP,EAAGR,EAAIyF,GAERg/E,GAAWA,EAAU,GAAKD,EAAUzjF,EAAIwjF,GAAgBC,EAAUzjF,EAAIoH,EAAIo8E,GACjF/sC,EAAKyK,OAAO,EAAG,EACX,IAAKuiC,EAxEM,EAwEkBxkF,EAC7BwkF,EAASxkF,EA1EC,EA2EVwkF,EA1EW,EA0EaxkF,EACxBmI,EAAI3H,EAAGR,GAIRw3C,IA4Bf8hC,SAAU,SAASv4E,EAAGf,EAAG6D,EAAOL,GAC5B,IAAI61E,EACAxrE,EAAKsD,EAAE4jE,YAEPiI,EAAWj+E,KAAKoC,cAAc,YAAY/B,KAAK,CAC3CyO,GAAIA,IACLhD,IAAI9L,KAAKk4E,MAOhB,OALAoC,EAAUt6E,KAAKmhB,KAAKnf,EAAGf,EAAG6D,EAAOL,EAAQ,GAAGqH,IAAImyE,IACxCnvE,GAAKA,EACbwrE,EAAQ2D,SAAWA,EACnB3D,EAAQ/X,MAAQ,EAET+X,GA8BXh6E,KAAM,SAASmuE,EAAKzsE,EAAGf,EAAG0kF,GAGtB,IAEIrL,EADAsL,GAAWhnF,GADAoB,KACgBwH,UAE3B8nE,EAAU,GAEd,OAAIqW,IALW3lF,KAKU8/E,WALV9/E,KAKiCwH,WAIhD8nE,EAAQttE,EAAInC,KAAKC,MAAMkC,GAAK,GACxBf,IACAquE,EAAQruE,EAAIpB,KAAKC,MAAMmB,KAEvBwtE,GAAe,IAARA,KACPa,EAAQhvE,KAAOmuE,GAGnB6L,EAjBet6E,KAiBIoC,cAAc,QAC5B/B,KAAKivE,GAGNsW,GACAtL,EAAQh4E,IAAI,CACRuE,SAAU,aAIb8+E,IACDrL,EAAQvB,QAAU,SAAS35E,EAAO4U,EAAK83D,GACnC,IACI0M,EAEA74E,EAHA44E,EAASzM,EAAQ+M,qBAAqB,SAEtCgN,EAAY/Z,EAAQlwD,aAAa5H,GAErC,IAAKrU,EAAI,EAAGA,EAAI44E,EAAOvsE,OAAQrM,KAC3B64E,EAAQD,EAAO54E,IAELic,aAAa5H,KAAS6xE,GAC5BrN,EAAM/nE,aAAauD,EAAK5U,GAGhC0sE,EAAQr7D,aAAauD,EAAK5U,KAI3Bk7E,GA5CQt6E,KAMKod,KAAKqxD,EAAKzsE,EAAGf,IAoDrCmhF,YAAa,SAASt+E,EAAU0nE,GAC5B,IAAIqW,EA6BJ,OAzBA/9E,EAAWA,GAEN0nE,GAAQA,EAAKhrE,OAASgrE,EAAKhrE,MAAMsD,UAEjC9D,KAAKQ,OAASR,KAAKQ,MAAMsD,SAqBvB,CACH4C,EAJJm7E,GAZI/9E,EADA,KAAKsD,KAAKtD,GACCimE,EAAKjmE,GACT,KAAKsD,KAAKtD,GAENgoB,WAAWhoB,IACjB0nE,EAAOxrE,KAAKoiF,YAAY,KAAM5W,EAAK5iE,YAAY5H,EAAI,IAE7C,IAMS,GAAK8C,EAAW,EAAIjE,KAAKC,MAAiB,IAAXgE,GAKnDkC,EAJOnG,KAAKC,MAAmB,GAAb+hF,GAKlB7gF,EAAG8C,IAOXgiF,QAAS,SAASC,EAAUjuC,EAAUkuC,GAClC,IAAI/kF,EAAI8kF,EAIR,OAHIjuC,GAAYkuC,IACZ/kF,EAAIpB,KAAK4C,IAAIxB,EAAIpB,KAAKkrB,IAAI+sB,EAAW2yB,GAAU,IAE5C,CACHzoE,GAAK+jF,EAAW,EAAKlmF,KAAKqkB,IAAI4zB,EAAW2yB,GACzCxpE,EAAGA,IA0CXyiF,MAAO,SAASjV,EAAKzsE,EAAGf,EAAGoiF,EAAOoC,EAASC,EAASC,EAASI,EAAUr8E,GAEnE,IAMIwqE,EACAsI,EAIA13E,EACAL,EACAwhF,EACAC,EACAC,EAEA1N,EACA2N,EAGAC,EACAC,EACAC,EACAC,EAxBAp7E,EAAWpL,KACXs6E,EAAUlvE,EAAS3K,EAAgB,WAAdiJ,GAA0B,SAC/CpJ,EAAOg6E,EAAQh6E,KAAO8K,EAAS9K,KAAK,GAAI,EAAG,EAAGqlF,GAC7CtlF,KAAK,CACFsJ,OAAQ,IAIZqyE,EAAc,EACdp4E,EAAU,EACV+H,EAAc,EAMd86E,EAAe,GAGfC,EAAa,iBAAiBt/E,KAAKi8E,GACnCsD,EAAWD,EAMXh9E,GACA4wE,EAAQJ,SAAS,cAAgBxwE,GAIrCi9E,EAAWD,EACXL,EAAiB,WACb,OAAQ5N,GAAe,GAAK,EAAI,GAUpC6N,EAAgB,WACZ,IACIM,EADApmF,EAAQF,EAAKwrE,QAAQtrE,MAErB8uE,EAAU,GAEdkN,QAAkB7R,IAAV7lE,QAAkC6lE,IAAXlmE,GAAwB0hF,IAAc5nB,EAAQj+D,EAAKs8E,UAC9Et8E,EAAK+7E,UACT/B,EAAQx1E,OAASA,GAAS03E,EAAK13E,OAAS,GAAK,EAAIlB,EAAU+H,EAC3D2uE,EAAQ71E,QAAUA,GAAU+3E,EAAK/3E,QAAU,GAAK,EAAIb,EAGpDwiF,EAAiBxiF,EAAUwH,EAASg3E,YAAY5hF,GAASA,EAAMsD,SAAUxD,GAAM0F,EAG3E2gF,IAGKzS,IACDoG,EAAQpG,IAAMA,EAAM9oE,EAASrI,QAAQsgF,IAAUqD,EAC3Ct7E,EAAS/F,OAAOg+E,GAChBj4E,EAAS+V,OAEb+yD,EAAIgG,UACe,WAAdxwE,EAAyB,GAAK,yBAC9BA,EAAY,eAAiBA,EAAY,OAAS,KAGvDwqE,EAAIpoE,IAAIwuE,GAERsM,EAAcP,IACd/W,EAAQttE,EAAI4kF,EACZtX,EAAQruE,GAAK8kF,GAAYK,EAAiB,GAAKQ,GAInDtX,EAAQxqE,MAAQjF,KAAKC,MAAMw6E,EAAQx1E,OACnCwqE,EAAQ7qE,OAAS5E,KAAKC,MAAMw6E,EAAQ71E,QAEpCyvE,EAAI7zE,KAAKmC,EAAO8sE,EAASmX,IACzBA,EAAe,KAOvBF,EAAoB,WAChB,IACIM,EADAC,EAAQn7E,EAAc/H,EAI1BijF,EAAQd,EAAW,EAAIK,EAGnB7nB,EAAQz5D,IAAU03E,IAAuB,WAAd2J,GAAwC,UAAdA,KACrDW,GAAS,CACLnhE,OAAQ,GACR5a,MAAO,GACTo7E,IAAcrhF,EAAQ03E,EAAK13E,QAI7BgiF,IAAUxmF,EAAK0B,GAAK6kF,IAAUvmF,EAAKW,IACnCX,EAAKD,KAAK,IAAKymF,QACDnc,IAAVkc,GACAvmF,EAAKD,KAAK,IAAKwmF,IAKvBvmF,EAAK0B,EAAI8kF,EACTxmF,EAAKW,EAAI4lF,GAQbL,EAAU,SAASxyE,EAAK5U,GAChB80E,EACAA,EAAI7zE,KAAK2T,EAAK5U,GAEdqnF,EAAazyE,GAAO5U,GAQ5Bk7E,EAAQsD,MAAQ,WACZt9E,EAAKwL,IAAIwuE,GACTA,EAAQj6E,KAAK,CACTC,KAAOmuE,GAAe,IAARA,EAAaA,EAAM,GACjCzsE,EAAGA,EACHf,EAAGA,IAGHizE,GAAO3V,EAAQknB,IACfnL,EAAQj6E,KAAK,CACTolF,QAASA,EACTC,QAASA,KAUrBpL,EAAQyM,YAAc,SAAS3nF,GAC3B0F,EAAQsN,EAAE03D,SAAS1qE,GAASA,EAAQ,MAExCk7E,EAAQ0M,aAAe,SAAS5nF,GAC5BqF,EAASrF,GAEbk7E,EAAQ,oBAAsB,SAASl7E,GACnC+mF,EAAY/mF,GAEhBk7E,EAAQ2M,cAAgB,SAAS7nF,GACzBm/D,EAAQn/D,IAAUA,IAAUwE,IAC5BA,EAAU02E,EAAQ12E,QAAUxE,EAC5BmnF,MAGRjM,EAAQ4M,kBAAoB,SAAS9nF,GAC7Bm/D,EAAQn/D,IAAUA,IAAUuM,IAC5BA,EAAcvM,EACdmnF,MAMRjM,EAAQuE,YAAc,SAASz/E,IAC3BA,EAAQ,CACJ4L,KAAM,EACN2a,OAAQ,GACR5a,MAAO,GACT3L,MACY48E,IACVA,EAAc58E,EACVo9E,GACAlC,EAAQj6E,KAAK,CACT2B,EAAGikF,MAOnB3L,EAAQ4E,WAAa,SAAS9/E,QACZurE,IAAVvrE,GACAkB,EAAK4+E,WAAW9/E,GAEpBknF,IACAC,KAIJjM,EAAQ,sBAAwB,SAASl7E,EAAO4U,GACxC5U,IACAunF,GAAW,GAEflO,EAAcz4E,KAAK,gBAAkBZ,EACrConF,EAAQxyE,EAAK5U,IAGjBk7E,EAAQxM,aAAewM,EAAQzM,WAAayM,EAAQ0J,QAAU,SAAS5kF,EAAO4U,GAC9D,SAARA,GAAkB5U,IAClBunF,GAAW,GAEfH,EAAQxyE,EAAK5U,IAGjBk7E,EAAQ6M,cAAgB,SAAS/nF,EAAO4U,GACpCyxE,EAAUnL,EAAQmL,QAAUrmF,EAC5BonF,EAAQxyE,EAAKnU,KAAKC,MAAMV,GAASinF,IAAmBJ,IAExD3L,EAAQ8M,cAAgB,SAAShoF,EAAO4U,GACpC0xE,EAAUpL,EAAQoL,QAAUtmF,EAC5BonF,EAAQxyE,EAAK5U,EAAQ8mF,IAIzB5L,EAAQvB,QAAU,SAAS35E,GACvBk7E,EAAQt4E,EAAI5C,EACR48E,IACA58E,GAAS48E,IAAgBl3E,GAAS03E,EAAK13E,OAAS,EAAIlB,IAExDqiF,EAAWpmF,KAAKC,MAAMV,GACtBk7E,EAAQj6E,KAAK,aAAc4lF,IAE/B3L,EAAQxB,QAAU,SAAS15E,GACvB8mF,EAAW5L,EAAQr5E,EAAIpB,KAAKC,MAAMV,GAClCk7E,EAAQj6E,KAAK,aAAc6lF,IAI/B,IAAImB,EAAU/M,EAAQh4E,IACtB,OAAOE,EAAO83E,EAAS,CAMnBh4E,IAAK,SAAS6sE,GACV,GAAIA,EAAQ,CACR,IAAIwS,EAAa,GACjBxS,EAAS5sE,EAAM4sE,GACf5vE,EAAK+6E,EAAQpD,WAAW,SAASzL,QACRd,IAAjBwE,EAAO1D,KACPkW,EAAWlW,GAAQ0D,EAAO1D,UACnB0D,EAAO1D,OAGtBnrE,EAAKgC,IAAIq/E,GAEb,OAAO0F,EAAQp4E,KAAKqrE,EAASnL,IAMjCkN,QAAS,WACL,MAAO,CACHv3E,MAAO03E,EAAK13E,MAAQ,EAAIlB,EACxBa,OAAQ+3E,EAAK/3E,OAAS,EAAIb,EAC1B5B,EAAGw6E,EAAKx6E,EAAI4B,EACZ3C,EAAGu7E,EAAKv7E,EAAI2C,IAQpBw6E,OAAQ,SAASp4E,GAOb,OANIA,IACAsgF,IACIpS,GACAA,EAAIkK,OAAOp4E,IAGZs0E,GAOXhyE,QAAS,WAGLnG,EAAYm4E,EAAQxO,QAAS,cAC7B3pE,EAAYm4E,EAAQxO,QAAS,cAEzBxrE,IACAA,EAAOA,EAAKgI,WAEZ4rE,IACAA,EAAMA,EAAI5rE,WAGd0uE,EAAWl0E,UAAUwF,QAAQ2G,KAAKqrE,GAGlCA,EAAUlvE,EAAWk7E,EAAgBC,EAAoBC,EAAU,WAQnFp0E,EAAEvP,SAAWo0E,EArmHjB,CAumHEl2E,GACD,SAASqR,GAMN,IAAI/R,EAAO+R,EAAE/R,KACT+B,EAAgBgQ,EAAEhQ,cAClBE,EAAM8P,EAAE9P,IACRi8D,EAAUnsD,EAAEmsD,QACZh/D,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACX8nE,EAAYl4D,EAAEk4D,UACdH,EAAO/3D,EAAE+3D,KACTS,EAAWx4D,EAAEw4D,SACbb,EAAO33D,EAAE23D,KACTiN,EAAa5kE,EAAE4kE,WACfC,EAAc7kE,EAAE6kE,YAChBpN,EAAMz3D,EAAEy3D,IACRlrD,EAAOvM,EAAEuM,KAGbnc,EAAOw0E,EAAWl0E,UAA8C,CAK5DwkF,QAAS,SAASnY,GACd,IACIrD,EADU9rE,KACQ8rE,QAClB4O,EAAYvL,GAA8B,SAApBrD,EAAQyb,SAAsBpY,EAAOrqE,MAc/D,OAZI41E,WACOvL,EAAOrqE,MALJ9E,KAMF06E,UAAYA,EANV16E,KAOFg6E,mBAER7K,GAAkC,aAAxBA,EAAO4N,eACjB5N,EAAO6S,WAAa,SACpB7S,EAAOqY,SAAW,UAXRxnF,KAaNmvE,OAAS3sE,EAbHxC,KAakBmvE,OAAQA,GACxC7sE,EAdctC,KAcF8rE,QAASqD,GAdPnvE,MA2BlBg9E,YAAa,WACT,IACIlR,EADU9rE,KACQ8rE,QAQtB,MAJyB,SAArBA,EAAQmJ,WACRnJ,EAAQtrE,MAAMqG,SAAW,YAGtB,CACH7E,EAAG8pE,EAAQ2b,WACXxmF,EAAG6qE,EAAQ4b,UACX5iF,MAAOgnE,EAAQlhE,YACfnG,OAAQqnE,EAAQhhE,eAQxB68E,oBAAqB,WAEjB,GAAK3nF,KAAKi7E,MAAV,CAKA,IACI7vE,EADUpL,KACSoL,SACnBogE,EAFUxrE,KAEK8rE,QACfrgE,EAHUzL,KAGWyL,YAAc,EACnCC,EAJU1L,KAIW0L,YAAc,EACnC1J,EALUhC,KAKEgC,GAAK,EACjBf,EANUjB,KAMEiB,GAAK,EACjBsD,EAPUvE,KAOMmmF,WAAa,OAC7ByB,EAAkB,CACd58E,KAAM,EACN2a,OAAQ,GACR5a,MAAO,GACTxG,GACF4qE,EAbUnvE,KAaOmvE,OA0BrB,GAvBA7sE,EAAIkpE,EAAM,CACNqc,WAAYp8E,EACZq8E,UAAWp8E,IAlBD1L,KAsBF65E,SACRt6E,EAvBUS,KAuBG65E,SAAS,SAASuE,GAC3B97E,EAAI87E,EAAQ,CACRyJ,WAAYp8E,EAAa,EACzBq8E,UAAWp8E,EAAa,OA1BtB1L,KAiCFy7E,UACRl8E,EAAKisE,EAAK3iE,YAAY,SAAS2nD,GAC3BplD,EAAS28E,YAAYv3B,EAAOgb,MAIf,SAAjBA,EAAK+b,QAAoB,CAEzB,IACIxB,EADAjuC,EAzCM93C,KAyCa83C,SAEnB4iC,EAAY3Q,EA3CN/pE,KA2CmB06E,WACzBsH,EAAa7S,GAAUA,EAAO6S,WAC9BgG,EAAuB,CAAClwC,EAAUvzC,EAAOinE,EAAKnjE,UA7CxCrI,KA6C2D06E,UA7C3D16E,KA6C8EmmF,WAAWpuD,KAAK,KAEpGiwD,IA/CMhoF,KA+C2BioF,MAGjClC,EAAW36E,EAASg3E,YAAY5W,EAAKhrE,MAAMsD,UAAUkC,EAGjDu4D,EAAQzmB,IArDN93C,KAsDMkoF,gBAAgBpwC,EAAU8vC,EAAiB7B,GAIvDzjF,EAAIkpE,EAAM,CACN1mE,MAAO,GACPk9E,WAAYA,GAAc,WAI1BxW,EAAK5gE,YAAc8vE,GAAa,QAAQtzE,KAAKokE,EAAKruD,aAAequD,EAAK2c,YACtE7lF,EAAIkpE,EAAM,CACN1mE,MAAO41E,EAAY,KACnBt0E,QAAS,QACT47E,WAAYA,GAAc,WApE5BhiF,KAyEEooF,kBAAkB5c,EAAK5gE,YAAam7E,EAAU6B,EAAiB9vC,EAAUvzC,IAIrFjC,EAAIkpE,EAAM,CACNxgE,KAAOhJ,GA9EDhC,KA8EcqoF,OAAS,GAAM,KACnCvhF,IAAM7F,GA/EAjB,KA+EasoF,OAAS,GAAM,OAIlC1d,IACAmb,EAAWva,EAAK1gE,cApFV9K,KAwFFioF,IAAMD,QA5FdhoF,KAAKuoF,YAAa,GAmG1BL,gBAAiB,SAASpwC,EAAU8vC,EAAiB7B,GACjD,IAAIyC,EAAgB,GAChBC,EAAkBte,EAAO,gBAAkBS,EAAW,oBAAsBN,EAAY,eAAiBT,EAAIO,MAAQ,eAAiB,GAE1Ioe,EAAcC,GAAmBD,EAAc3vC,UAAY,UAAYf,EAAW,OAClF0wC,EAAcC,GAAmBne,EAAY,SAAW,YAAcke,EAAcE,gBAAqC,IAAlBd,EAAyB,KAAO7B,EAAW,KAClJzjF,EAAItC,KAAK8rE,QAAS0c,IAMtBJ,kBAAmB,SAAStjF,EAAOihF,EAAU6B,GACzC5nF,KAAKqoF,OAASvjF,EAAQ8iF,EACtB5nF,KAAKsoF,OAASvC,KAKtBvjF,EAAOy0E,EAAYn0E,UAA+C,CAS9Dsa,KAAM,SAASqxD,EAAKzsE,EAAGf,GACnB,IAAIq5E,EAAUt6E,KAAKoC,cAAc,QAC7B0pE,EAAUwO,EAAQxO,QAClB1gE,EAAWkvE,EAAQlvE,SACnB6xE,EAAQ7xE,EAAS6xE,MACjB0L,EAAa,SAAS7c,EAAStrE,GAG3BjB,EAAK,CAAC,UAAW,eAAe,SAASksE,GACrC9sD,EAAKmtD,EAASL,EAAO,UAAU,SAASoE,EAASzwE,EAAO4U,EAAKw3D,GACzDqE,EAAQ5gE,KAAKjP,KAAMZ,EAAO4U,EAAKw3D,GAC/BhrE,EAAMwT,GAAO5U,SA2I7B,OArIAk7E,EAAQ4E,WAAa,SAAS9/E,GACtBA,IAAU0sE,EAAQzjE,kBACXrI,KAAKw8E,KAEhB1Q,EAAQzjE,UAAYrI,KAAK48E,QAAUx9E,EACnCk7E,EAAQqN,uBAIR1K,GACA0L,EAAWrO,EAASA,EAAQxO,QAAQtrE,OAIxC85E,EAAQvB,QAAUuB,EAAQxB,QAAUwB,EAAQuE,YAAcvE,EAAQmF,eAAiB,SAASrgF,EAAO4U,GACnF,UAARA,IACAA,EAAM,aAEVsmE,EAAQtmE,GAAO5U,EACfk7E,EAAQqN,uBAIZrN,EACKj6E,KAAK,CACFC,KAAMmuE,EACNzsE,EAAGnC,KAAKC,MAAMkC,GACdf,EAAGpB,KAAKC,MAAMmB,KAEjBqB,IAAI,CAED+9E,WAAYrgF,KAAKQ,MAAM6/E,WACvBv8E,SAAU9D,KAAKQ,MAAMsD,SAErB+C,SAAU,aAIlBilE,EAAQtrE,MAAMwhF,WAAa,SAG3B1H,EAAQh4E,IAAMg4E,EAAQgN,QAGlBrK,IACA3C,EAAQxuE,IAAM,SAAS88E,GAEnB,IAAIC,EAEArL,EADAp1E,EAAYgD,EAAS8oE,IAAItrE,WAEzBkgF,EAAU,GAKd,GAHA9oF,KAAKw9E,YAAcoL,EAGfA,GAEA,KADAC,EAAYD,EAAgBzK,KACZ,CAIZ,IADAX,EAAcoL,EACPpL,GAEHsL,EAAQhhF,KAAK01E,GAGbA,EAAcA,EAAYA,YAI9Bj+E,EAAKupF,EAAQ7tD,WAAW,SAASuiD,GAC7B,IAAIuL,EACAC,EAAM3oF,EAAKm9E,EAAY1R,QAAS,SAEhCkd,IACAA,EAAM,CACFt/E,UAAWs/E,IAMnBH,EAAYrL,EAAYW,IAAMX,EAAYW,KAAO/7E,EAAc,MAAO4mF,EAAK,CACvEniF,SAAU,WACVmE,MAAOwyE,EAAY/xE,YAAc,GAAK,KACtC3E,KAAM02E,EAAY9xE,YAAc,GAAK,KACrCtF,QAASo3E,EAAYp3E,QACrBgpE,QAASoO,EAAYpO,QACrB6Z,cAAezL,EAAYrO,QAAUqO,EAAYrO,OAAO8Z,eACzDJ,GAAazgF,GAGhB2gF,EAAiBF,EAAUroF,MAI3BgC,EAAOg7E,EAAa,CAChB78E,GAAI,WAIA,OAHA25E,EAAQ35E,GAAG4J,MAAM,CACbuhE,QAASgd,EAAQ,GAAG3K,KACrB3zE,WACIgzE,GAEX+B,iBAAkB,SAASngF,EAAO4U,GAC9B+0E,EAAe/9E,KAAO5L,EAAQ,KAC9Bo+E,EAAYxpE,GAAO5U,EACnBo+E,EAAY7D,aAAc,GAE9B6F,iBAAkB,SAASpgF,EAAO4U,GAC9B+0E,EAAejiF,IAAM1H,EAAQ,KAC7Bo+E,EAAYxpE,GAAO5U,EACnBo+E,EAAY7D,aAAc,KAGlCgP,EAAWnL,EAAauL,YAKhCF,EAAYzgF,EAWhB,OARAygF,EAAU7/E,YAAY8iE,GAGtBwO,EAAQW,OAAQ,EACZX,EAAQiO,YACRjO,EAAQqN,sBAGLrN,IAGRA,KArWnB,CAyWEv5E,GACD,SAASqR,GAON,IAAI82E,EACAC,EACAC,EAEAhnF,EAAgBgQ,EAAEhQ,cAClBE,EAAM8P,EAAE9P,IACRi8D,EAAUnsD,EAAEmsD,QACZkM,EAAUr4D,EAAEq4D,QACZpoE,EAAiB+P,EAAE/P,eACnB2nE,EAAM53D,EAAE43D,IACRzqE,EAAO6S,EAAE7S,KACTqvE,EAAQx8D,EAAEw8D,MACVpsE,EAAS4P,EAAE5P,OACXgtE,EAAcp9D,EAAEo9D,YAChBh6D,EAAUpD,EAAEoD,QACZs0D,EAAW13D,EAAE03D,SACbqE,EAAW/7D,EAAE+7D,SACb5rE,EAAQ6P,EAAE7P,MACV0oE,EAAO74D,EAAE64D,KACTr/D,EAAOwG,EAAExG,KACTm+D,EAAO33D,EAAE23D,KACTnrE,EAAMwT,EAAExT,IACRo4E,EAAa5kE,EAAE4kE,WACfC,EAAc7kE,EAAE6kE,YAChBpN,EAAMz3D,EAAEy3D,IAcPjrE,KAKDwqF,EAAa,CAETC,SAAUrf,GAA4B,IAArBA,EAAIsf,aAQrBhT,KAAM,SAASlrE,EAAU6pE,GACrB,IACIsU,EAAS,CAAC,IAAKtU,EAAU,2BACzBz0E,EAAQ,CAAC,aAAc,WAAY,KACnCgpF,EAAqB,QAAbvU,GAGK,UAAbA,GAAwBuU,IACxBhpF,EAAMsH,KAAK,sCAEftH,EAAMsH,KAAK,eAAgB0hF,EAAQ,SAAW,WAE9CD,EAAOzhF,KAAK,WAAYtH,EAAMu3B,KAAK,IAAK,OAGpCk9C,IACAsU,EAASC,GAAsB,SAAbvU,GAAoC,QAAbA,EACrCsU,EAAOxxD,KAAK,IACZ3sB,EAASq+E,QAAQF,GAjBXvpF,KAkBF8rE,QAAU1pE,EAAcmnF,IAlBtBvpF,KAqBNoL,SAAWA,GAOvBU,IAAK,SAASoD,GACV,IACI9D,EADUpL,KACSoL,SACnB0gE,EAFU9rE,KAEQ8rE,QAClBoI,EAAM9oE,EAAS8oE,IACfuH,EAAWvsE,GAAUA,EAAOusE,SAG5B7yE,EAAasG,EACbA,EAAO48D,SAAW58D,EAClBglE,EA8BJ,OA5BIhlE,IACAlP,KAAKw9E,YAActuE,GAInBusE,GACArwE,EAAS28E,YAAYjc,EAASljE,GAIlCA,EAAWI,YAAY8iE,GArBT9rE,KAwBNi7E,OAAQ,EAxBFj7E,KAyBFuoF,aAzBEvoF,KAyBqB0pF,sBAzBrB1pF,KA0BFg6E,kBA1BEh6E,KA8BF49E,OA9BE59E,KA+BF49E,QAIR59E,KAAK0J,WACL1J,KAAKK,KAAK,QAASL,KAAK0J,WApCd1J,MA6ClBg6E,gBAAiBhD,EAAWl0E,UAAU6kF,oBAKtCO,gBAAiB,WAOb,IAAIpwC,EAAW93C,KAAK83C,SAChB6xC,EAAW9pF,KAAKkrB,IAAI+sB,EAAW2yB,GAC/Bmf,EAAW/pF,KAAKqkB,IAAI4zB,EAAW2yB,GAEnCnoE,EAAItC,KAAK8rE,QAAS,CACd3tD,OAAQ25B,EAAW,CAAC,gDAAiD6xC,EACjE,UAAWC,EAAU,SAAUA,EAAU,SAAUD,EACnD,iCACF5xD,KAAK,IAAM,UAOrBqwD,kBAAmB,SAAStjF,EAAOihF,EAAU6B,EAAiB9vC,EAAUvzC,GAEpE,IAGI2jD,EAHAyhC,EAAW7xC,EAAWj4C,KAAKkrB,IAAI+sB,EAAW2yB,GAAW,EACrDmf,EAAW9xC,EAAWj4C,KAAKqkB,IAAI4zB,EAAW2yB,GAAW,EACrDhmE,EAASmH,EAAK5L,KAAK6pF,WAAY7pF,KAAK8rE,QAAQhhE,cAE5Cg/E,EAAUvlF,GAAmB,SAAVA,EAGvBvE,KAAKqoF,MAAQsB,EAAW,IAAM7kF,EAC9B9E,KAAKsoF,MAAQsB,EAAW,IAAMnlF,EAG9ByjD,EAAOyhC,EAAWC,EAAW,EAC7B5pF,KAAKqoF,OAASuB,EAAW7D,GAAY79B,EAAO,EAAI0/B,EAAkBA,GAClE5nF,KAAKsoF,OAASqB,EAAW5D,GAAYjuC,EAAYoQ,EAAO0/B,EAAkB,EAAIA,EAAmB,GAE7FkC,IACA9pF,KAAKqoF,OAASvjF,EAAQ8iF,GAAmB+B,EAAW,GAAK,EAAI,GACzD7xC,IACA93C,KAAKsoF,OAAS7jF,EAASmjF,GAAmBgC,EAAW,GAAK,EAAI,IAElEtnF,EAAItC,KAAK8rE,QAAS,CACdqa,UAAW5hF,MASvBwlF,UAAW,SAAS3qF,GAKhB,IAHA,IAAIO,EAAIP,EAAM4M,OACVysC,EAAO,GAEJ94C,KAKCmqE,EAAS1qE,EAAMO,IACf84C,EAAK94C,GAAKE,KAAKC,MAAiB,GAAXV,EAAMO,IAAW,EAClB,MAAbP,EAAMO,GACb84C,EAAK94C,GAAK,KAEV84C,EAAK94C,GAAKP,EAAMO,IAKZP,EAAM4qF,OAAuB,OAAb5qF,EAAMO,IAA4B,OAAbP,EAAMO,KAEvC84C,EAAK94C,EAAI,KAAO84C,EAAK94C,EAAI,KACzB84C,EAAK94C,EAAI,IAAMP,EAAMO,EAAI,GAAKP,EAAMO,EAAI,GAAK,GAAK,GAGlD84C,EAAK94C,EAAI,KAAO84C,EAAK94C,EAAI,KACzB84C,EAAK94C,EAAI,IAAMP,EAAMO,EAAI,GAAKP,EAAMO,EAAI,GAAK,GAAK,KAiBlE,OAAO84C,EAAK1gB,KAAK,MAAQ,KAQ7B8T,KAAM,SAAS0uC,GACX,IACI0P,EACAC,EAFA5P,EAAUt6E,KAsBd,OAlBIu6E,GACA0P,EAAc1P,EAAS9K,QACvBb,EAAMqb,EAAa3P,GACnB2P,EAAYniF,KAAKwyE,GACjBA,EAAQ6P,YAAc,WAClBvb,EAAMqb,EAAa3P,IAEvB4P,EAAS3P,EAAS6P,OAAO9P,KAGrBA,EAAQ6P,aACR7P,EAAQ6P,cAEZD,EAAS,CACLr+C,KAAMyuC,EAAQ+O,SAAW,UAAY,eAItC/O,EAAQh4E,IAAI4nF,IAQvB5nF,IAAK00E,EAAWl0E,UAAUwkF,QAM1BzJ,gBAAiB,SAAS/R,GAGlBA,EAAQljE,YACRvG,EAAeypE,IAOvBxjE,QAAS,WAKL,OAJItI,KAAKmqF,aACLnqF,KAAKmqF,cAGFnT,EAAWl0E,UAAUwF,QAAQiC,MAAMvK,OAQ9CW,GAAI,SAASw6E,EAAWC,GAOpB,OALAp7E,KAAK8rE,QAAQ,KAAOqP,GAAa,WAC7B,IAAIkP,EAAMxgB,EAAI7xD,MACdqyE,EAAIjgF,OAASigF,EAAI3V,WACjB0G,EAAQiP,IAELrqF,MAMXsqF,WAAY,SAAS7xC,EAAMzsC,GAEvB,IAAIgiE,EAQJ,OAHY,KAFZA,GADAv1B,EAAOA,EAAKl9B,MAAM,SACPvP,SAEc,KAARgiE,IACbv1B,EAAKu1B,EAAM,GAAKv1B,EAAKu1B,EAAM,GAAKjE,EAAKtxB,EAAKu1B,EAAM,IAAM,GAAKhiE,GAExDysC,EAAK1gB,KAAK,MAOrBqmD,OAAQ,SAASC,EAAejkE,EAAOkkE,GACnC,IACI3+E,EAGAy+E,EAEAmL,EAEA9Q,EACA8R,EACAhM,EACAC,EAXA3E,EAAU,GAEV/N,EAAU9rE,KAAK8rE,QACf1gE,EAAWpL,KAAKoL,SAEhBo/E,EAAY1e,EAAQtrE,MAEpBi4C,EAAOqzB,EAAQrzB,KAYnB,GALIA,GAA8B,iBAAfA,EAAKr5C,QACpBq5C,EAAO,KAEX8xC,EAAe9xC,EAEX4lC,EAAe,CAGf,IAFAE,EAAc3yE,EAAKyyE,EAAcv5E,MAAO,GACxC05E,GAAwBH,EAAcjP,SAAW,KAAQmP,EACpD5+E,EAAI,EAAGA,GAAK,EAAGA,IAEhB84E,EAA6B,EAAd8F,EAAmB,EAAK,EAAI5+E,EAGvC2+E,IACAiM,EAAevqF,KAAKsqF,WAAW7xC,EAAKr5C,MAAOq5E,EAAc,KAG7D8Q,EAAS,CAAC,wCAAyC9Q,EAC/C,0BAA2B8R,EAC3B,8BAA+Bze,EAAQtrE,MAAMiqF,QAAS,QAG1DrM,EAASh8E,EAAcgJ,EAASq+E,QAAQF,GACpC,KAAM,CACFv+E,KAAM++D,EAAKygB,EAAUx/E,MAAQY,EAAKyyE,EAAcI,QAAS,GACzD33E,IAAKijE,EAAKygB,EAAU1jF,KAAO8E,EAAKyyE,EAAcK,QAAS,KAG3DJ,IACAF,EAAOE,OAAS7F,EAAc,GAIlC8Q,EAAS,CACL,kBACAlL,EAAc7/E,OAAS,UACvB,cAAeggF,EAAuB7+E,EAAG,OAE7CyC,EAAcgJ,EAASq+E,QAAQF,GAAS,KAAM,KAAMnL,GAIhDhkE,EACAA,EAAM0xD,QAAQ9iE,YAAYo1E,GAE1BtS,EAAQljE,WAAW2U,aAAa6gE,EAAQtS,GAI5C+N,EAAQ/xE,KAAKs2E,GAIjBp+E,KAAK65E,QAAUA,EAEnB,OAAO75E,MAEX85E,cAAe7O,EAEfyf,QAAS,SAAS12E,EAAK5U,GACfY,KAAKqpF,SACLrpF,KAAK8rE,QAAQ93D,GAAO5U,EAEpBY,KAAK8rE,QAAQr7D,aAAauD,EAAK5U,IAGvCurF,YAAa,SAASvrF,IAGjBY,KAAKi7E,MAAQj7E,KAAK8rE,QAAU9rE,MAAM0J,UAAYtK,GAEnDw/E,gBAAiB,SAASx/E,EAAO4U,EAAK83D,IACjBA,EAAQ+M,qBAAqB,UAAU,IACpDz2E,EAAcpC,KAAKoL,SAASq+E,QAAQ,CAAC,cAAe,KAAM,KAAM3d,IACzD93D,GAAO5U,GAAS,QAC3BY,KAAKgU,GAAO5U,GAIhBssE,QAAS,SAAStsE,EAAO4U,EAAK83D,GAC1B,IAAInsE,EACAk6E,EAAU75E,KAAK65E,QAOnB,GANAz6E,EAAQA,GAAS,GACjBY,KAAKX,EAAID,EAAM24B,MAAQ34B,EAAM24B,KAAK,KAElC+zC,EAAQrzB,KAAOr5C,EAAQY,KAAK+pF,UAAU3qF,GAGlCy6E,EAEA,IADAl6E,EAAIk6E,EAAQ7tE,OACLrM,KACHk6E,EAAQl6E,GAAG84C,KAAOohC,EAAQl6E,GAAG2+E,OAASt+E,KAAKsqF,WAAWlrF,EAAOy6E,EAAQl6E,GAAG2+E,QAAUl/E,EAG1FY,KAAK0qF,QAAQ12E,EAAK5U,IAEtByuE,WAAY,SAASzuE,EAAO4U,EAAK83D,GAC7B,IAAImJ,EAAWnJ,EAAQmJ,SACN,SAAbA,EACAnJ,EAAQtrE,MAAMhC,MAAQY,EACF,QAAb61E,IACPnJ,EAAQ8e,OAAmB,SAAVxrF,EACjBY,KAAK0qF,QAAQ,YAAa1qF,KAAKoL,SAAS5M,MAAMY,EAAO0sE,EAAS93D,EAAKhU,SAG3E,qBAAsB,SAASZ,EAAO4U,EAAK83D,GACvC1pE,EACIpC,KAAKoL,SAASq+E,QAAQ,CAAC,IAAKz1E,EAAIuH,MAAM,KAAK,GAAI,aAAcnc,EAAO,QACpE,KACA,KACA0sE,IAGRgT,cAAe7T,EACfwU,eAAgB,SAASrgF,EAAO4U,EAAK83D,GACjC,IAAItrE,EAAQsrE,EAAQtrE,MACpBR,KAAKgU,GAAOxT,EAAMwT,GAAO5U,EAGzBoB,EAAMwK,MAAQnL,KAAKC,MAAMD,KAAKqkB,IAAI9kB,EAAQqrE,GAAW,GAAK,KAC1DjqE,EAAMsG,IAAMjH,KAAKC,MAAMD,KAAKkrB,IAAI3rB,EAAQqrE,IAAY,MAExDqD,aAAc,SAAS1uE,EAAO4U,EAAK83D,GAC/B9rE,KAAK0qF,QAAQ,cAAe1qF,KAAKoL,SAAS5M,MAAMY,EAAO0sE,EAAS93D,EAAKhU,QAEzE,qBAAsB,SAASZ,EAAO4U,EAAK83D,GACvCA,EAAQ+e,UAAYzrF,EACpBY,KAAKgU,GAAO5U,EACR0qE,EAAS1qE,KACTA,GAAS,MAEbY,KAAK0qF,QAAQ,eAAgBtrF,IAEjC2/E,YAAa,SAAS3/E,EAAO4U,GACzBhU,KAAK0qF,QAAQ12E,EAAK5U,IAEtB+/E,iBAAkB,SAAS//E,EAAO4U,EAAK83D,GAGrB,YAAV1sE,IACAA,EAAQ,WAIRY,KAAK65E,SACLt6E,EAAKS,KAAK65E,SAAS,SAASuE,GACxBA,EAAO59E,MAAMwT,GAAO5U,KAMH,QAArB0sE,EAAQmJ,WACR71E,EAAkB,WAAVA,EAAqB,SAAW,EAKnCY,KAAKqpF,WACNvd,EAAQtrE,MAAMwT,GAAO5U,EAAQ,UAAY,UAE7C4U,EAAM,OAEV83D,EAAQtrE,MAAMwT,GAAO5U,GAEzB25E,QAAS,SAAS35E,EAAO4U,EAAK83D,GAC1B9rE,KAAKgU,GAAO5U,EAEA,MAAR4U,EACAA,EAAM,OACS,MAARA,IACPA,EAAM,OAONhU,KAAK8qF,gBACL9qF,KAAKgU,GAAO5U,EACZY,KAAK8qF,kBAGLhf,EAAQtrE,MAAMwT,GAAO5U,GAG7Bu+E,aAAc,SAASv+E,EAAO4U,EAAK83D,GAC/BA,EAAQtrE,MAAMwT,GAAO5U,KAGlB,wBAA0BgqF,EAAW,sBAChDh3E,EAAEg3E,WAAaA,EAAa5Z,EAAYwH,EAAYoS,GAGpDA,EAAWtmF,UAAUg2E,QACjBsQ,EAAWtmF,UAAUikF,YACrBqC,EAAWtmF,UAAUkkF,aACrBoC,EAAWtmF,UAAUi2E,QAMzBoQ,EAAuB,CAEnB54E,QAAS64E,EACT2B,MAAOlhB,EAAI3pD,UAAUC,UAAUjI,QAAQ,aAAe,EAStDo+D,KAAM,SAASluE,EAAWtD,EAAOL,GAC7B,IACIs7E,EACA7L,EACA5xE,EA2BJ,GA9BetC,KAKNk8E,eAAiB,GAM1BhI,GAJA6L,EAPe//E,KAOOoC,cAAc,OAC/BE,IAAI,CACDuE,SAAU,cAEDilE,QACjB1jE,EAAUY,YAAY+2E,EAAWjU,SAZlB9rE,KAgBNgrF,OAAQ,EAhBFhrF,KAiBNk0E,IAAMA,EAjBAl0E,KAkBN+/E,WAAaA,EAlBP//E,KAmBNy3E,UAAY,GAnBNz3E,KAoBN68E,MAAQ,GApBF78E,KAqBN88E,UAAY,GArBN98E,KAsBNkgF,SAAW,EAtBLlgF,KAyBNmgF,QAAQr7E,EAAOL,GAAQ,IAK3BulE,EAAIihB,WAAWC,IAAK,CAErBlhB,EAAIihB,WAAWn/E,IAAI,MAAO,iCAG1BxJ,EAAM,2GAEN,IACI0nE,EAAImhB,mBAAmBV,QAAUnoF,EACnC,MAAO+G,GACL2gE,EAAIohB,YAAY,GAAGX,SAAWnoF,KAW1Ci+E,SAAU,WACN,OAAQvgF,KAAKk0E,IAAItpE,aAYrB2vE,SAAU,SAASv4E,EAAGf,EAAG6D,EAAOL,GAG5B,IAAI81E,EAAWv6E,KAAKoC,gBAChBipF,EAAQld,EAASnsE,GAGrB,OAAOQ,EAAO+3E,EAAU,CACpB9K,QAAS,GACTlN,MAAO,EACPv3D,MAAOqgF,EAAQrpF,EAAEA,EAAIA,GAAK,EAC1B8E,KAAMukF,EAAQrpF,EAAEf,EAAIA,GAAK,EACzB6D,OAAQumF,EAAQrpF,EAAE8C,MAAQA,GAAS,EACnCL,QAAS4mF,EAAQrpF,EAAEyC,OAASA,GAAU,EACtC2lF,OAAQ,SAAS9P,GACb,IAAIxO,EAAUwO,EAAQxO,QAClBmJ,EAAWnJ,EAAQmJ,SACnBqW,EAAuB,UAAbrW,EACVwG,EAAWnB,EAAQmB,SAEnB30E,EADO9G,KACI8G,KAAOwkF,EAAUxf,EAAQ4b,UAAY,GAChD18E,EAFOhL,KAEKgL,KACZD,EAAQC,EAHDhL,KAGa8E,MACpBoG,EAASpE,EAJF9G,KAIayE,OACpBmnE,EAAM,CACF//B,KAAM,QACFhsC,KAAKC,MAAM27E,EAAWzwE,EAAOlE,GAAO,MACpCjH,KAAKC,MAAM27E,EAAWvwE,EAASH,GAAS,MACxClL,KAAKC,MAAM27E,EAAW1wE,EAAQG,GAAU,MACxCrL,KAAKC,MAAM27E,EAAW30E,EAAMkE,GAAQ,OAUhD,OANKywE,GAAYnB,EAAQ+O,UAAyB,QAAbpU,GACjCzyE,EAAOopE,EAAK,CACR9mE,MAAOiG,EAAQ,KACftG,OAAQyG,EAAS,OAGlB0gE,GAIXkf,eAAgB,WACZvrF,EAAKg7E,EAAS9K,SAAS,SAAS8b,GAIxBA,EAAOzf,SACPyf,EAAOjpF,IAAIi4E,EAAS6P,OAAOmB,WAe/C/sF,MAAO,SAASA,EAAOgtE,EAAMC,EAAM6O,GAC/B,IACIjD,EAEAkS,EACAiC,EAJApgF,EAAWpL,KAEXyrF,EAAY,QAGZ7f,EAAM,OAUV,GAPIptE,GAASA,EAAMu5E,eACfyT,EAAW,WACJhtF,GAASA,EAAMs5E,iBACtB0T,EAAW,WAIXA,EAAU,CAEV,IAAI7T,EACAC,EAEA7xD,EACAE,EACAmwB,EACAC,EACAq1C,EACAC,EACAC,EACAC,EAGAC,EACAC,EAZA3T,EAAW55E,EAAMu5E,gBAAkBv5E,EAAMs5E,eASzCkU,EAAW,GACXpV,EAAQp4E,EAAMo4E,MAGdqV,EAAS,GACTC,EAAc,WAGV3C,EAAS,CAAC,iBAAmB0C,EAAOl0D,KAAK,KACrC,cAAe4zD,EAAU,iBACzBD,EAAU,WAAYF,EAAU,KAAMQ,EACtC,gCAEJ5pF,EAAcgJ,EAASq+E,QAAQF,GAAS,KAAM,KAAM/d,IA4C5D,GAxCAsgB,EAAYlV,EAAM,GAClBmV,EAAWnV,EAAMA,EAAM5qE,OAAS,GAC5B8/E,EAAU,GAAK,GACflV,EAAMl3B,QAAQ,CACV,EACAosC,EAAU,KAGdC,EAAS,GAAK,GACdnV,EAAM9uE,KAAK,CACP,EACAikF,EAAS,KAKjBxsF,EAAKq3E,GAAO,SAAS3hE,EAAMtV,GACnB8rF,EAAUrkF,KAAK6N,EAAK,KACpBoiE,EAAcjlE,EAAE5T,MAAMyW,EAAK,IAC3B0iE,EAAYN,EAAYtoE,IAAI,OAC5B6oE,EAAcP,EAAYtoE,IAAI,OAE9B4oE,EAAY1iE,EAAK,GACjB2iE,EAAc,GAIlBqU,EAAOnkF,KAAgB,IAAVmN,EAAK,GAAY,KAAO0iE,GAGhCh4E,GAIDgsF,EAAW/T,EACXgU,EAASjU,IAJT+T,EAAW9T,EACXiU,EAASlU,MAQJ,SAATlM,EAGA,GAAiB,aAAb+f,EACAzlE,EAAKqyD,EAASryD,IAAMqyD,EAAS,IAAM,EACnCnyD,EAAKmyD,EAASnyD,IAAMmyD,EAAS,IAAM,EACnChiC,EAAKgiC,EAAShiC,IAAMgiC,EAAS,IAAM,EACnC/hC,EAAK+hC,EAAS/hC,IAAM+hC,EAAS,IAAM,EACnC4T,EAAW,WAAa,GAGpB,IAHyBnsF,KAAK8uC,MAC7B0H,EAAKpwB,IACLmwB,EAAKrwB,IACAlmB,KAAKsjB,IAAM,IAErB+oE,QAGG,CAEH,IAMI1P,EANA/6E,EAAI22E,EAAS32E,EACb0qF,EAAY,EAAJ1qF,EACR2qF,EAAY,EAAJ3qF,EACR6nB,EAAK8uD,EAAS9uD,GACdC,EAAK6uD,EAAS7uD,GACdsuD,EAAkBrM,EAAKqM,gBAEvBwU,EAAsB,WACdxU,IACA2E,EAAOlC,EAAQ+B,UACf/yD,IAAOuuD,EAAgB,GAAK2E,EAAKx6E,GAAKw6E,EAAK13E,MAAQ,GACnDykB,IAAOsuD,EAAgB,GAAK2E,EAAKv7E,GAAKu7E,EAAK/3E,OAAS,GACpD0nF,GAAStU,EAAgB,GAAK2E,EAAK13E,MACnCsnF,GAASvU,EAAgB,GAAK2E,EAAK/3E,QAEvCunF,EAAW,QAAU55E,EAAEpP,aAAaspF,OAAOC,qBAAhC,WACIJ,EAAQ,IAAMC,EADlB,gCAGQ9iE,EAAK,IAAMC,EAHnB,aAIMsiE,EAAS,KAE1BK,KAIJ5R,EAAQW,MACRoR,IAGA/R,EAAQsD,MAAQyO,EAKpBzgB,EAAMggB,OAKVhgB,EAAM+L,OAKP,GAAI8T,EAAUrkF,KAAK5I,IAA2B,QAAjBgtE,EAAK+b,QAErClQ,EAAcjlE,EAAE5T,MAAMA,GAEtB87E,EAAQ7O,EAAO,kBAAkB4L,EAAYtoE,IAAI,KAAM08D,EAAMD,GAE7DI,EAAMyL,EAAYtoE,IAAI,WAGnB,CACH,IAAIy9E,EAAYhhB,EAAKqN,qBAAqBpN,GACtC+gB,EAAUxgF,SACVwgF,EAAU,GAAGpd,QAAU,EACvBod,EAAU,GAAGxnF,KAAO,SAExB4mE,EAAMptE,EAGV,OAAOotE,GAOX6d,QAAS,SAASF,GACd,IAAIkD,EAAW,mDACX1B,EAAQ/qF,KAAK+qF,MAgBjB,OAdAxB,EAASA,EAAOxxD,KAAK,IAKbwxD,EAHJwB,GAEmC,KADnCxB,EAASA,EAAOhhF,QAAQ,KAAM,8CACnB2P,QAAQ,WACNqxE,EAAOhhF,QAAQ,KAAM,WAAakkF,EAAW,QAE7ClD,EAAOhhF,QAAQ,UAAW,UAAYkkF,GAI1ClD,EAAOhhF,QAAQ,IAAK,UAYrCjI,KAAM22E,EAAYn0E,UAAUsa,KAM5Bq7B,KAAM,SAASA,GACX,IAAIp4C,EAAO,CAEPqsF,UAAW,SAQf,OANIl3E,EAAQijC,GACRp4C,EAAKhB,EAAIo5C,EACF01B,EAAS11B,IAChBj2C,EAAOnC,EAAMo4C,GAGVz4C,KAAKoC,cAAc,SAAS/B,KAAKA,IAU5C44C,OAAQ,SAASj3C,EAAGf,EAAGQ,GACnB,IAAIw3C,EAASj5C,KAAKqF,OAAO,UAQzB,OAPI8oE,EAASnsE,KACTP,EAAIO,EAAEP,EACNR,EAAIe,EAAEf,EACNe,EAAIA,EAAEA,GAEVi3C,EAAO0zC,UAAW,EAClB1zC,EAAOx3C,EAAIA,EACJw3C,EAAO54C,KAAK,CACf2B,EAAGA,EACHf,EAAGA,KAWXR,EAAG,SAAS6F,GACR,IACIgpE,EAaJ,OAVIhpE,IACAgpE,EAAU,CACN,UAAa,cAAgBhpE,EAC7B,MAAS,cAAgBA,IAKvBtG,KAAKoC,cAAc,OAAO/B,KAAKivE,IAa7C4U,MAAO,SAASC,EAAKniF,EAAGf,EAAG6D,EAAOL,GAC9B,IAAI+pE,EAAMxuE,KAAKoC,cAAc,OACxB/B,KAAK,CACF8jF,IAAKA,IAWb,OARI35E,UAAUwB,OAAS,GACnBwiE,EAAInuE,KAAK,CACL2B,EAAGA,EACHf,EAAGA,EACH6D,MAAOA,EACPL,OAAQA,IAGT+pE,GAMXpsE,cAAe,SAAS6yE,GACpB,MAAoB,SAAbA,EACHj1E,KAAKqF,OAAO4vE,GACZgC,EAAYn0E,UAAUV,cAAc6M,KAAKjP,KAAMi1E,IAQvD8S,YAAa,SAASjc,EAASljE,GAC3B,IAAI27E,EAAMvkF,KACN4sF,EAAchkF,EAAWpI,MACzBqsF,EAA+B,QAApB/gB,EAAQyb,SAAqBzb,EAAQtrE,MAEpD8B,EAAIwpE,EAAS,CACTghB,KAAM,IACN9hF,KAAM++D,EAAK6iB,EAAY9nF,QAAU+nF,EAAW9iB,EAAK8iB,EAAS/lF,KAAO,GACjEA,IAAKijE,EAAK6iB,EAAYnoF,SAAWooF,EAAW9iB,EAAK8iB,EAAS7hF,MAAQ,GAClE8sC,UAAW,KAKfv4C,EAAKusE,EAAQjjE,YAAY,SAAS2nD,GAC9B+zB,EAAIwD,YAAYv3B,EAAOsb,OAQ/B/oE,QAAS,CAELpE,IAAK,SAASqD,EAAGf,EAAGmI,EAAG1C,EAAGC,GACtB,IAQIilE,EARA52D,EAAQrO,EAAQqO,MAChBkN,EAAMvb,EAAQub,IACdpjB,EAAS6H,EAAQlF,GAAK2H,GAAK1C,EAC3B3H,EAAc4H,EAAQo9E,OACtBmB,EAAWrlF,KAAKkrB,IAAI/V,GACpBmwE,EAAWtlF,KAAKqkB,IAAIlP,GACpBowE,EAASvlF,KAAKkrB,IAAI7I,GAClBmjE,EAASxlF,KAAKqkB,IAAIhC,GAGtB,OAAIA,EAAMlN,GAAU,EACT,CAAC,MAGZ42D,EAAM,CACF,KACA5pE,EAAIlD,EACJmC,EAAInC,EACJkD,EAAIlD,EACJmC,EAAInC,EACJkD,EAAIlD,EAASomF,EACbjkF,EAAInC,EAASqmF,EACbnjF,EAAIlD,EAASsmF,EACbnkF,EAAInC,EAASumF,GAGb1+E,EAAQowB,OAASh4B,GACjB6sE,EAAI9jE,KACA,IACA,IACA9F,EACAf,GAIR2qE,EAAI9jE,KACA,KACA9F,EAAIjD,EACJkC,EAAIlC,EACJiD,EAAIjD,EACJkC,EAAIlC,EACJiD,EAAIjD,EAAcqmF,EAClBnkF,EAAIlC,EAAcsmF,EAClBrjF,EAAIjD,EAAcmmF,EAClBjkF,EAAIlC,EAAcomF,EAClB,IACA,KAGJvZ,EAAIoe,OAAQ,EACLpe,IAIX3yB,OAAQ,SAASj3C,EAAGf,EAAGmI,EAAG1C,EAAG4zE,GAazB,OAXIA,GAAW/b,EAAQ+b,EAAQ74E,KAC3B2H,EAAI1C,EAAI,EAAI4zE,EAAQ74E,GAIpB64E,GAAWA,EAAQqS,WACnB3qF,GAAKoH,EAAI,EACTnI,GAAKyF,EAAI,GAIN,CACH,KACA1E,EACAf,EACAe,EAAIoH,EACJnI,EAAIyF,EACJ1E,EAAIoH,EACJnI,EAAIyF,EAAI,EACR1E,EAAIoH,EACJnI,EAAIyF,EAAI,EAER,MAQRya,KAAM,SAASnf,EAAGf,EAAGmI,EAAG1C,EAAGC,GACvB,OAAOswE,EAAYn0E,UAAUC,QAASw7D,EAAQ53D,IAAaA,EAAQlF,EAAe,UAAX,UAAsBwN,KAAK,EAAGjN,EAAGf,EAAGmI,EAAG1C,EAAGC,MAI7HyL,EAAE82E,YAAcA,EAAc,WAC1BlpF,KAAKs2E,KAAK/rE,MAAMvK,KAAMwK,YAE1B0+E,EAAYpmF,UAAYP,EAAM00E,EAAYn0E,UAAWqmF,GAGrD/2E,EAAEvP,SAAWqmF,GAIjBjS,EAAYn0E,UAAU89E,iBAAmB,SAAStgF,EAAM6uE,GACpD,IACIvkE,EADAmiF,EAAgB/iB,EAAI5nE,cAAc,QAElCo/E,EAAWxX,EAAIiV,eAAe3+E,GAOlC,OALAysF,EAAc/jF,YAAYw4E,GAC1Bl/E,EAAIyqF,EAAe5d,GACnBnvE,KAAKk0E,IAAIlrE,YAAY+jF,GACrBniF,EAAcmiF,EAAcniF,YAC5BvI,EAAe0qF,GACRniF,GAnnCf,CA8nCE7J,GACD,SAASqR,GAMN,IAAI5T,EAAQ4T,EAAE5T,MACVe,EAAO6S,EAAE7S,KACTywE,EAAc59D,EAAE49D,YAChBptE,EAAgBwP,EAAExP,cAClBL,EAAQ6P,EAAE7P,MACVqJ,EAAOwG,EAAExG,KACThN,EAAMwT,EAAExT,IACRirE,EAAMz3D,EAAEy3D,IAsTZ,SAASmjB,IACL,IACI98E,EADA+8E,EAAgB76E,EAAEk+D,eAAegc,OAEjCY,EAASD,EAAcC,OACvBC,EAAMD,EAAS,SAAW,MAC1BE,EAAMF,EAAS,SAAW,MAE9B96E,EAAElC,KAAOA,EAAO+8E,EAAc/8E,MAAQ25D,EAAI35D,KAC1CA,EAAKigE,iBAAmB+c,GAAUD,EAAcI,eAChDn9E,EAAKggE,oBAxCT,WACI,IAAI+c,EAAgB76E,EAAEk+D,eAAegc,OACjCgB,EAASzjB,EAAIyjB,OAEjB,GAAIL,EAAcpkB,SAAU,CACxB,GAAKykB,EAMD,OAAO,SAASrd,GACZ,OAAQqd,EAAOC,GACXtd,EACAgd,EAAcpkB,UAChB2kB,aAPNp7E,EAAE/B,MAAM,IAahB,OAAO48E,EAAcC,QAAUD,EAAclvD,kBAmBlB0vD,GAC3Bv9E,EAAKw9E,WAAa,SAASjqD,EAAMslC,EAAO1pC,EAAMypC,EAAOH,EAASF,GAC1D,IAAIppE,EAcJ,OAbI6tF,GACA7tF,EAAI6Q,EAAK2sB,IAAItyB,MAAM,EAAGC,WACtBnL,GAAK2wE,EAAY3wE,IAEjBA,EAAI,IAAI6Q,EACJuzB,EACAslC,EACAn9D,EAAKyzB,EAAM,GACXzzB,EAAKk9D,EAAO,GACZl9D,EAAK+8D,EAAS,GACd/8D,EAAK68D,EAAS,IAChB3qC,UAECz+B,GAEXE,EAAK,CAAC,UAAW,QAAS,MAAO,OAAQ,QAAS,aAAa,SAASkK,GACpEyG,EAAK,QAAUzG,GAAK0jF,EAAM1jF,KAE9BlK,EAAK,CAAC,eAAgB,UAAW,UAAW,QAAS,OAAQ,QAAS,aAAa,SAASkK,GACxFyG,EAAK,QAAUzG,GAAK2jF,EAAM3jF,KAhVlC2I,EAAEk+D,eAAiB,CAEf2b,OAAQ,kFAAkF1wE,MAAM,KAEhGxY,QAAS,CAAC,SAAU,UAAW,SAAU,WAAY,iBACrDE,KAAM,CACF0qF,QAAS,aACTntD,OAAQ,CACJ,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OACxD,SAAU,YAAa,UAAW,WAAY,YAElDE,YAAa,CACT,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAC1C,MAAO,MAAO,MAAO,MAAO,OAEhCswC,SAAU,CACN,SAAU,SAAU,UAAW,YAC/B,WAAY,SAAU,YAG1BQ,aAAc,IACdoc,eAAgB,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,KAC1CC,UAAW,aACXC,eAAgB,uBAChBrc,aAAc,KAElB6a,OAAQ,CACJY,QAAQ,EAGRX,qBAAsB,iEAG1BplF,MAAO,CAWHsB,aAAc,EAEdslF,kBAAmB,OACnBC,oBAAoB,EAEpBC,QAAS,CAAC,GAAI,GAAI,GAAI,IAMtBC,gBAAiB,CACbxpF,MAAO,CACHiF,OAAQ,IAEZ9C,SAAU,CACNtC,MAAO,QACPvC,GAAI,GAEJf,EAAG,KAIX6D,MAAO,KACPL,OAAQ,KAGR0pF,YAAa,UAMbC,gBAAiB,UAEjBC,gBAAiB,WAKrB9tF,MAAO,CACHD,KAAM,cACNiE,MAAO,SAEPoc,OAAQ,GAKR2tE,aAAc,IAGlBC,SAAU,CACNjuF,KAAM,GACNiE,MAAO,SAMP+pF,aAAc,IAGlBxY,YAAa,GACb0Y,OAAQ,CAEJhuF,MAAO,CAEHqG,SAAU,WACVrI,MAAO,YAGfiwF,OAAQ,CACJhnF,SAAS,EACTlD,MAAO,SAEPrF,OAAQ,aACRwvF,eAAgB,WACZ,OAAO1uF,KAAKsG,MAGhB6nF,YAAa,UACb1lF,aAAc,EACdjF,WAAY,CAERmrF,YAAa,UACbC,cAAe,WAanBC,UAAW,CACPrwF,MAAO,UACPsF,SAAU,OACV8/E,WAAY,OACZ7G,aAAc,YAElB+R,eAAgB,CAEZtwF,MAAO,WAEXuwF,gBAAiB,CACbvwF,MAAO,WAEX4/E,QAAQ,EAER4Q,kBAAmB,CACfnoF,SAAU,WACV/B,MAAO,OACPL,OAAQ,QAGZwqF,cAAc,EAGdC,cAAe,EACfrqF,cAAe,SAEf7C,EAAG,EACHf,EAAG,EACHV,MAAO,CAGHC,MAAO,CACHojF,WAAY,UAMxB+J,QAAS,CAILwB,WAAY,CACRvL,WAAY,OACZ/8E,SAAU,WACVC,IAAK,OAETtG,MAAO,CACHqG,SAAU,WACVunF,gBAAiB,UACjBhf,QAAS,GACT+W,UAAW,WAKnBiJ,QAAS,CACL3nF,SAAS,EACTF,UAAW3I,EAEX6J,aAAc,EACd4mF,qBAAsB,CAClB/b,YAAa,yBACb9K,OAAQ,sBACRE,OAAQ,mBACRE,KAAM,mBACNllC,IAAK,gBACLG,KAAM,0BACNklC,MAAO,QACPtlC,KAAM,MAEV6rD,aAAc,GAKd1rF,QAAS,EAIT2rF,KAAM3sF,EAAgB,GAAK,GAE3BwrF,gBAAiB5vF,EAAM,WAAWs4E,WAAW,KAAM/nE,MACnDygF,YAAa,EACbC,aAAc,wDACdC,YAAa,kFACbtR,QAAQ,EACR59E,MAAO,CACHhC,MAAO,UACPiM,OAAQ,UACR3G,SAAU,OACVmlF,cAAe,OACfjH,WAAY,WASpB2N,QAAS,CACLloF,SAAS,EACTw4E,KAAM,4BACNp5E,SAAU,CACNtC,MAAO,QACPvC,GAAI,GACJ6C,cAAe,SACf5D,GAAI,GAGRT,MAAO,CACHiK,OAAQ,UACRjM,MAAO,UACPsF,SAAU,OAGdxD,KAAM,mBA0Fd8R,EAAEw9E,WAAa,SAASjpF,GAQpB,OALAyL,EAAEk+D,eAAiB/tE,GAAM,EAAM6P,EAAEk+D,eAAgB3pE,GAGjDqmF,IAEO56E,EAAEk+D,gBAObl+D,EAAEpP,WAAa,WACX,OAAOoP,EAAEk+D,gBAKbl+D,EAAEy9E,mBAAqBz9E,EAAEk+D,eAAewF,YAGxCkX,IAzYJ,CA2YEjsF,GACD,SAASqR,GAMN,IAAImgE,EAAengE,EAAEmgE,aACjBhU,EAAUnsD,EAAEmsD,QACZuU,EAA0B1gE,EAAE0gE,wBAC5BhJ,EAAW13D,EAAE03D,SACbvnE,EAAQ6P,EAAE7P,MACVqJ,EAAOwG,EAAExG,KACT6+D,EAAUr4D,EAAEq4D,QAKhBr4D,EAAE09E,KAAO,SAASlsB,EAAMuI,EAAKnnE,EAAM+qF,GAC/B/vF,KAAK4jE,KAAOA,EACZ5jE,KAAKmsE,IAAMA,EACXnsE,KAAKgF,KAAOA,GAAQ,GACpBhF,KAAKgwF,OAAQ,EACbhwF,KAAKiwF,YAAa,EAEbjrF,GAAS+qF,GACV/vF,KAAKkwF,YAIb99E,EAAE09E,KAAKhtF,UAAY,CAIfotF,SAAU,WACN,IAQIzhB,EASA0hB,EAhBAvsB,EADO5jE,KACK4jE,KACZj9D,EAAUi9D,EAAKj9D,QACfQ,EAAQy8D,EAAKz8D,MACbipF,EAAaxsB,EAAKwsB,WAClBjsD,EAAQy/B,EAAKz/B,MACbgoC,EANOnsE,KAMImsE,IACXkkB,EAAe1pF,EAAQ6nF,OAEvB8B,EAAgB1sB,EAAK0sB,cACrBC,EAAUpkB,IAAQmkB,EAAc,GAChCE,EAASrkB,IAAQmkB,EAAcA,EAActkF,OAAS,GACtD5M,EAAQgxF,EACRxkF,EAAKwkF,EAAWjkB,GAAMhoC,EAAMgoC,GAAMA,GAClCA,EACAuX,EAfO1jF,KAeM0jF,MACb+M,EAAmBH,EAAcI,KAKjC9sB,EAAK+sB,gBAAkBF,IACvBN,EACIxpF,EAAQ0oF,qBACJoB,EAAiBG,YAAYzkB,IAAQskB,EAAiBI,WAxBvD7wF,KA4BNuwF,QAAUA,EA5BJvwF,KA6BNwwF,OAASA,EAGd/hB,EAAM7K,EAAK8qB,eAAez/E,KAAK,CAC3B20D,KAAMA,EACNz8D,MAAOA,EACPopF,QAASA,EACTC,OAAQA,EACRL,oBAAqBA,EACrB/wF,MAAOwkE,EAAKktB,MAAQve,EAAa3O,EAAKmtB,QAAQ3xF,IAAUA,IAOvDm/D,EAAQmlB,GAoBFA,GACPA,EAAMrjF,KAAK,CACPC,KAAMmuE,KAnEHzuE,KA+CF0jF,MAAQA,EACTnlB,EAAQkQ,IAAQ4hB,EAAa5oF,QAC7BN,EAAMiE,SAAS9K,KACXmuE,EACA,EACA,EACA4hB,EAAa1K,SAIhBrjF,IAAIC,EAAM8tF,EAAa7vF,QAEvBsL,IAAI83D,EAAKotB,YACV,KA5DGhxF,KA6DFixF,YAAcvN,GAASA,EAAMrH,UAAUv3E,MA7DrC9E,KA8DF83C,SAAW,IAaxBo5C,aAAc,WACV,OAAOlxF,KAAK0jF,MACR1jF,KAAK0jF,MAAMrH,UAAUr8E,KAAK4jE,KAAKutB,MAAQ,SAAW,SAClD,GAORC,eAAgB,SAASC,GACrB,IAmBIC,EACA5W,EApBA9W,EAAO5jE,KAAK4jE,KACZ2tB,EAAQF,EAAGrvF,EACX+E,EAAa68D,EAAKz8D,MAAMJ,WACxBknF,EAAUrqB,EAAKz8D,MAAM8mF,QACrBuD,EAAY5lF,EAAKg4D,EAAK6tB,UAAW5xF,KAAKiS,IAAI8xD,EAAKuI,IAAK8hB,EAAQ,KAC5DyD,EAAa9lF,EAAKg4D,EAAK+tB,WAAY9xF,KAAK4C,IAAImhE,EAAKuI,IAAMvI,EAAKoK,IAAKjnE,EAAaknF,EAAQ,KACtFvK,EAAQ1jF,KAAK0jF,MACb5rC,EAAW93C,KAAK83C,SAChB85C,EAAS,CACL5mF,KAAM,EACN2a,OAAQ,GACR5a,MAAO,GACT64D,EAAKiuB,YACPC,EAAapO,EAAMrH,UAAUv3E,MAC7BitF,EAAYnuB,EAAKouB,eACjBC,EAAoBF,EACpBG,EAAcN,EACdO,EAAU,EAIV7vF,EAAM,GAILw1C,EAwBMA,EAAW,GAAKy5C,EAAQK,EAASE,EAAaN,EACrD9W,EAAY76E,KAAKC,MAAMyxF,EAAQ1xF,KAAKkrB,IAAI+sB,EAAW2yB,GAAW+mB,GACvD15C,EAAW,GAAKy5C,EAAQK,EAASE,EAAaJ,IACrDhX,EAAY76E,KAAKC,OAAOiH,EAAawqF,GAAS1xF,KAAKkrB,IAAI+sB,EAAW2yB,MAzBlE6mB,EAAWC,GAAS,EAAIK,GAAUE,EADxBP,EAAQK,EAASE,EAGbN,EACVS,EAAoBZ,EAAGrvF,EAAIiwF,GAAqB,EAAIL,GAAUJ,EACvDF,EAAWI,IAClBO,EAAoBP,EAAaL,EAAGrvF,EAAIiwF,EAAoBL,EAC5DO,GAAW,IAGfF,EAAoBpyF,KAAKiS,IAAIigF,EAAWE,IAChBF,GAAiC,WAApBnuB,EAAKiuB,aACtCR,EAAGrvF,GAAKmwF,GAAWJ,EAAYE,EAAoBC,GAC9CH,EAAYlyF,KAAKiS,IAAIggF,EAAYG,OAKtCH,EAAaG,GAAsBruB,EAAKwuB,eAAiB1O,EAAMvU,QAAU,IAAIrqE,SAC7E41E,EAAYuX,IAUhBvX,IACAp4E,EAAIwC,MAAQ41E,GACN9W,EAAKj9D,QAAQ6nF,OAAOhuF,OAAS,IAAIu8E,eACnCz6E,EAAIy6E,aAAe,YAEvB2G,EAAMphF,IAAIA,KAOlB+vF,YAAa,SAASlB,EAAOhlB,EAAKmmB,EAAgBC,GAC9C,IAAI3uB,EAAO5jE,KAAK4jE,KACZz8D,EAAQy8D,EAAKz8D,MACbqrF,EAAWD,GAAOprF,EAAMsrF,gBAAmBtrF,EAAMH,YAErD,MAAO,CACHhF,EAAGmvF,EACCvtB,EAAKn8C,UAAU0kD,EAAMmmB,EAAgB,KAAM,KAAMC,GAAO3uB,EAAK8uB,OAAS9uB,EAAK54D,KAAO44D,EAAKrkC,QACtFqkC,EAAK+uB,UACAJ,GAAOprF,EAAMyrF,eAAkBzrF,EAAMJ,YAAc68D,EAAK74D,MAAQ64D,EAAK54D,KACvE,GAGR/J,EAAGkwF,EACCqB,EAAU5uB,EAAK14D,OAAS04D,EAAKrkC,QAAUqkC,EAAK+uB,SAAW/uB,EAAKn/D,OAAS,GAAK+tF,EAAU5uB,EAAKn8C,UAAU0kD,EAAMmmB,EAAgB,KAAM,KAAMC,GAAO3uB,EAAK8uB,SAQ7JG,iBAAkB,SAAS7wF,EAAGf,EAAGyiF,EAAOyN,EAAOd,EAAciC,EAAgBzxF,EAAOqU,GAChF,IASIy3B,EATAi3B,EAAO5jE,KAAK4jE,KACZkvB,EAASlvB,EAAKkvB,OACdC,EAAWnvB,EAAKmvB,SAChBC,EAAepvB,EAAKovB,aACpBlN,EAAUliB,EAAKqvB,aAAe,CAC1BjxF,EAAG,EACHf,EAAG,GAEPiyF,EAAU7C,EAAapvF,EA4B3B,OAzBKs9D,EAAQ20B,KAELA,EADc,IAAdtvB,EAAKuvB,KACKzP,EAAM5rC,UAAY,GAAK4rC,EAAMrH,UAAU53E,OAC5B,IAAdm/D,EAAKuvB,KACFrN,EAAQ7kF,EAAI,EAGZpB,KAAKkrB,IAAI24D,EAAM5rC,SAAW2yB,IAAYqb,EAAQ7kF,EAAIyiF,EAAMrH,SAAQ,EAAO,GAAG53E,OAAS,IAIrGzC,EAAIA,EAAIquF,EAAaruF,EAAI8jF,EAAQ9jF,GAAKswF,GAAkBnB,EACpDmB,EAAiBQ,GAAUC,GAAY,EAAI,GAAK,GACpD9xF,EAAIA,EAAIiyF,GAAWZ,IAAmBnB,EAClCmB,EAAiBQ,GAAUC,EAAW,GAAK,GAAK,GAGhDC,IACArmD,EAAQ9rC,GAASqU,GAAQ,GAAK89E,EAC1BpvB,EAAK+uB,WACLhmD,EAAOqmD,EAAermD,EAAO,GAEjC1rC,GAAK0rC,GAAQi3B,EAAKwvB,YAAcJ,IAG7B,CACHhxF,EAAGA,EACHf,EAAGpB,KAAKC,MAAMmB,KAOtBoyF,YAAa,SAASrxF,EAAGf,EAAGqyF,EAAYC,EAAWpC,EAAO/lF,GACtD,OAAOA,EAAS04E,UAAU,CACtB,IACA9hF,EACAf,EACA,IACAe,GAAKmvF,EAAQ,GAAKmC,GAClBryF,GAAKkwF,EAAQmC,EAAa,IAC3BC,IAUPC,eAAgB,SAASjB,EAAKnjB,EAASqkB,GACnC,IAIIC,EAHA9vB,EADO5jE,KACK4jE,KACZj9D,EAAUi9D,EAAKj9D,QACfgtF,EAHO3zF,KAGS2zF,SAEhBrkB,EAAU,GACVnD,EANOnsE,KAMImsE,IACXnnE,EAPOhF,KAOKgF,KACZstF,EAAiB1uB,EAAK0uB,eACtBlnF,EAAWw4D,EAAKz8D,MAAMiE,SAGtBwoF,EAAa5uF,EAAOA,EAAO,OAAS,OACpC6uF,EAAgBltF,EAAQitF,EAAa,aACrCE,EAAgBntF,EAAQitF,EAAa,aACrCG,EAAYptF,EAAQitF,EAAa,iBAGhCD,IAEDrkB,EAAQ1qE,OAASkvF,EACjBxkB,EAAQ,gBAAkBukB,EACtBE,IACAzkB,EAAQ0kB,UAAYD,GAGnB/uF,IACDsqE,EAAQ3lE,OAAS,GAEjB4oF,IACAjjB,EAAQF,QAAU,GA9BfpvE,KAgCF2zF,SAAWA,EAAWvoF,EAASqtC,OAC/Bp4C,KAAKivE,GACL4K,SACG,eAAiBl1E,EAAOA,EAAO,IAAM,IAAM,aAE9C8G,IAAI83D,EAAKqwB,aAKb1B,GAAOoB,IACRD,EAAe9vB,EAAKswB,gBAChB/nB,EAAMmmB,EACNqB,EAASlb,cAAgBgb,EACzBlB,GAAK,KAGLoB,EAjDG3zF,KAiDWgwF,MAAQ,OAAS,WAAW,CACtC3wF,EAAGq0F,EACHtkB,QAASA,KAezB+kB,WAAY,SAAS9C,EAAIjiB,EAASqkB,GAC9B,IACI7vB,EADO5jE,KACK4jE,KACZj9D,EAAUi9D,EAAKj9D,QACfyE,EAAWw4D,EAAKz8D,MAAMiE,SACtBpG,EAJOhF,KAIKgF,KACZovF,EAAapvF,EAAOA,EAAO,OAAS,OACpCkgE,EAAWtB,EAAKsB,SAASkvB,GACzBC,EAPOr0F,KAOKq0F,KACZC,GAAaD,EACbryF,EAAIqvF,EAAGrvF,EACPf,EAAIowF,EAAGpwF,EAGPsyF,EAAY3nF,EACRjF,EAAQytF,EAAa,UAAWpvF,GAAQ4+D,EAAK2wB,QAAU,EAAI,GAE/DC,EAAY7tF,EAAQytF,EAAa,SAGjClvB,IAGItB,EAAK+uB,WACLztB,EAAS,IAAMA,EAAS,IAIxBovB,IA3BGt0F,KA4BEq0F,KAAOA,EAAOjpF,EAASqtC,OACvByhC,SAAS,eAAiBl1E,EAAOA,EAAO,IAAM,IAAM,QACpD8G,IAAI83D,EAAK6wB,WAGdJ,EAAKh0F,KAAK,CACNuE,OAAQ4vF,EACR,eAAgBjB,KAIxBc,EAAKC,EAAY,OAAS,WAAW,CACjCj1F,EAxCGW,KAwCKqzF,YACJrxF,EACAf,EACAikE,EAAS,GACTmvB,EAAK5b,cAAgBgb,EACrB7vB,EAAKutB,MACL/lF,GACJgkE,QAASA,MAkBrBslB,YAAa,SAASrD,EAAIkB,EAAKnjB,EAASvuE,GACpC,IACI+iE,EADO5jE,KACK4jE,KACZutB,EAAQvtB,EAAKutB,MACbxqF,EAAUi9D,EAAKj9D,QACf+8E,EAJO1jF,KAIM0jF,MACb2M,EAAe1pF,EAAQ6nF,OACvBt5E,EAAOm7E,EAAan7E,KACpBo9E,EAAiB1uB,EAAK0uB,eACtBpV,GAAO,EACPl7E,EAAIqvF,EAAGrvF,EACPf,EAAIowF,EAAGpwF,EACPyiF,GAAS5Z,EAAS9nE,KAClB0hF,EAAM2N,GAAKA,EAZJrxF,KAYc6yF,iBACjB7wF,EACAf,EACAyiF,EACAyN,EACAd,EACAiC,EACAzxF,EACAqU,GApBGlV,KA4BMuwF,UA5BNvwF,KA6BOwwF,SACL5kF,EAAKjF,EAAQguF,eAAgB,IA9B/B30F,KAiCMwwF,SAjCNxwF,KAkCOuwF,UACL3kF,EAAKjF,EAAQiuF,cAAe,GAGjC1X,GAAO,GAGAiU,GAAUvtB,EAAKixB,UAAaxE,EAAan7E,MAC/Cm7E,EAAav4C,UAAay6C,GAAmB,IAAZnjB,GA1C/BpvE,KA2CEoxF,eAAeC,GAIpBn8E,GAAQrU,EAAQqU,IAEhBgoE,GAAO,GAIPA,GAAQpT,EAASunB,EAAGpwF,IACpBowF,EAAGjiB,QAAUA,EACbsU,EAvDG1jF,KAuDQiwF,WAAa,OAAS,WAAWoB,GAvDzCrxF,KAwDEiwF,YAAa,IAElBvM,EAAMrjF,KAAK,KAAM,MA1DdL,KA2DEiwF,YAAa,GA3DfjwF,KA6DFgwF,OAAQ,IAWrB8E,OAAQ,SAASj0F,EAAO0xF,EAAKnjB,GACzB,IACIxL,EADO5jE,KACK4jE,KACZutB,EAAQvtB,EAAKutB,MACbhlB,EAHOnsE,KAGImsE,IACXmmB,EAAiB1uB,EAAK0uB,eACtBjB,EALOrxF,KAKGqyF,YAAYlB,EAAOhlB,EAAKmmB,EAAgBC,GAClDvwF,EAAIqvF,EAAGrvF,EACPf,EAAIowF,EAAGpwF,EACPwyF,EAAiBtC,GAASnvF,IAAM4hE,EAAKuI,IAAMvI,EAAKoK,MAC1CmjB,GAASlwF,IAAM2iE,EAAKuI,KAAS,EAAI,EAE3CiD,EAAUxjE,EAAKwjE,EAAS,GACxBpvE,KAAK+0F,UAAW,EAGhB/0F,KAAKwzF,eAAejB,EAAKnjB,EAASqkB,GAGlCzzF,KAAKm0F,WAAW9C,EAAIjiB,EAASqkB,GAG7BzzF,KAAK00F,YAAYrD,EAAIkB,EAAKnjB,EAASvuE,IAMvCyH,QAAS,WACLwqE,EAAwB9yE,KAAMA,KAAK4jE,QA5f/C,CAggBE7iE,GACF,IAAIi0F,EAAQ,SAAS5iF,GAOjB,IAAIlQ,EAAWkQ,EAAElQ,SACbkxE,EAAahhE,EAAEghE,WACfP,EAAWzgE,EAAEygE,SACbD,EAAWxgE,EAAEwgE,SACbp0E,EAAQ4T,EAAE5T,MACV+zE,EAAengE,EAAEmgE,aACjBjC,EAAiBl+D,EAAEk+D,eACnB/R,EAAUnsD,EAAEmsD,QACZkM,EAAUr4D,EAAEq4D,QACZqI,EAA0B1gE,EAAE0gE,wBAC5BvzE,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACX0yE,EAAY9iE,EAAE8iE,UACdtpD,EAASxZ,EAAEwZ,OACXimD,EAAez/D,EAAEy/D,aACjBS,EAAOlgE,EAAEkgE,KACTyB,EAAU3hE,EAAE2hE,QACZv+D,EAAUpD,EAAEoD,QACZs0D,EAAW13D,EAAE03D,SACbyE,EAAWn8D,EAAEm8D,SACbhsE,EAAQ6P,EAAE7P,MACVwvE,EAAwB3/D,EAAE2/D,sBAC1BrF,EAAat6D,EAAEs6D,WACf9gE,EAAOwG,EAAExG,KACTzJ,EAAciQ,EAAEjQ,YAChB2sE,EAAQ18D,EAAE08D,MACVC,EAAc38D,EAAE28D,YAChB+gB,EAAO19E,EAAE09E,KA8BTkF,EAAO,WACPh1F,KAAKs2E,KAAK/rE,MAAMvK,KAAMwK,YAsvF1B,OAnvFA4H,EAAE5P,OAAOwyF,EAAKlyF,UAAmD,CAQ7DwtE,eAAgB,CAIZ+e,qBAAsB,CAClB/b,YAAa,cACb9K,OAAQ,WACRE,OAAQ,QACRE,KAAM,QACNllC,IAAK,SACLG,KAAM,SACNklC,MAAO,SACPtlC,KAAM,MAEVwxD,WAAW,EAGXzG,OAAQ,CACJ/mF,SAAS,EAKTjH,MAAO,CACHhC,MAAO,UACPiM,OAAQ,UACR3G,SAAU,QAGd9B,EAAG,GASPkzF,WAAY,IACZC,WAAY,IAGZC,gBAAiB,EACjBC,kBAAmB,UAiBnBC,YAAa,EACbC,aAAa,EAEbjC,WAAY,GACZkC,kBAAmB,UACnBC,kBAAmB,IACnBC,aAAc,UACdn1F,MAAO,CAEHgE,MAAO,SAMP/D,MAAO,CACHhC,MAAO,YAMfwG,KAAM,SAGN2wF,mBAAoB,UAEpBC,mBAAoB,EACpBC,eAAgB,UAEhBC,UAAW,UACXC,UAAW,EACXjC,cAAe,UAGfU,UAAW,WAWfwB,oBAAqB,CACjBf,WAAW,EACXQ,kBAAmB,GACnBb,eAAe,EACfpG,OAAQ,CACJxsF,GAAI,GAERmzF,WAAY,IACZD,WAAY,IACZK,aAAa,EACbh1F,MAAO,CACHu3C,SAAU,IACVx3C,KAAM,UAEV21F,YAAa,CACTxuF,SAAS,EAOTyuF,UAAW,WACP,OAAO9jF,EAAEoyB,aAAaxkC,KAAKP,OAAQ,IAGvCe,MAAO,CACHsD,SAAU,OACV8/E,WAAY,OACZplF,MAAO,UACP85E,YAAa,iBAKrBub,cAAe,EACfkC,UAAW,GAWfI,uBAAwB,CACpB3H,OAAQ,CACJxsF,GAAI,IAERzB,MAAO,CACHu3C,SAAU,MAUlBs+C,wBAAyB,CACrB5H,OAAQ,CACJxsF,EAAG,IAEPzB,MAAO,CACHu3C,SAAU,KAUlBu+C,yBAA0B,CACtB7H,OAAQ,CACJ4D,aAAc,EAAE,IAChBpwF,EAAG,GAIPzB,MAAO,CACHu3C,SAAU,IASlBw+C,sBAAuB,CACnB9H,OAAQ,CACJ4D,aAAc,EAAE,IAChBpwF,EAAG,GAIPzB,MAAO,CACHu3C,SAAU,IAOlBw+B,KAAM,SAASnvE,EAAOovF,GAGlB,IAAIhC,EAAUgC,EAAYC,IACtB5yB,EAAO5jE,KAEX4jE,EAAKz8D,MAAQA,EAGby8D,EAAKutB,MAAQhqF,EAAMs0E,WAAa7X,EAAK6yB,SAAWlC,EAAUA,EAG1D3wB,EAAK2wB,QAAUA,EACf3wB,EAAK8yB,KAAO9yB,EAAK8yB,OAASnC,EAAU,QAAU,SAE9C3wB,EAAK+uB,SAAW4D,EAAY5D,SAC5B/uB,EAAKuvB,KAAOoD,EAAYpD,OAASvvB,EAAKutB,MACjCvtB,EAAK+uB,SAAW,EAAI,EACpB/uB,EAAK+uB,SAAW,EAAI,GAEzB/uB,EAAKgsB,WAAW2G,GAGhB,IAAI5vF,EAAU3G,KAAK2G,QACf3B,EAAO2B,EAAQ3B,KACf2rF,EAA0B,aAAT3rF,EAErB4+D,EAAK8qB,eAAiB/nF,EAAQ6nF,OAAO0H,WACjCtyB,EAAK+yB,sBAIT/yB,EAAK2yB,YAAcA,EAGnB3yB,EAAKgzB,gBAAkB,EAEvBhzB,EAAKmvB,SAAWpsF,EAAQosF,SACxBnvB,EAAKh8D,SAA8B,IAApBjB,EAAQiB,QACvBg8D,EAAKizB,aAAsC,IAAxBlwF,EAAQkwF,YAG3BjzB,EAAKkzB,SAAoB,aAAT9xF,IAA8C,IAAvB2B,EAAQypF,WAC/CxsB,EAAKwsB,WAAazpF,EAAQypF,YAAcxsB,EAAKkzB,SAC7ClzB,EAAKz/B,MAAQy/B,EAAKz/B,OAAS,GAS3By/B,EAAKmzB,wBAA0B,GAG/BnzB,EAAKktB,MAAiB,gBAAT9rF,EACb4+D,EAAK+sB,eAAiBA,EACtB/sB,EAAKozB,mBAAqBpzB,EAAKktB,QAAUltB,EAAKqzB,iBAG9CrzB,EAAKszB,SAAW34B,EAAQ53D,EAAQwwF,UAKhCvzB,EAAKjK,MAAQ,GACbiK,EAAKwzB,UAAY,GAEjBxzB,EAAKyzB,WAAa,GAGlBzzB,EAAK0zB,kBAAoB,GAGzB1zB,EAAK2zB,eAAiB,GAYtB3zB,EAAKoK,IAAM,EAMXpK,EAAK4zB,SAAW5zB,EAAK6zB,aAAe9wF,EAAQ6wF,UAAY7wF,EAAQ+wF,QAChE9zB,EAAK7uD,MAAQpO,EAAQoO,MACrB6uD,EAAKrkC,OAAS54B,EAAQ44B,QAAU,EAIhCqkC,EAAK+zB,OAAS,GACd/zB,EAAKg0B,UAAY,GACjBh0B,EAAKi0B,cAAgB,EAOrBj0B,EAAKnhE,IAAM,KACXmhE,EAAK9xD,IAAM,KAOX8xD,EAAKk0B,UAAYlsF,EACbjF,EAAQmxF,UACRhpB,EAAM3nE,EAAMR,QAAQyoF,QAAQ2I,YAAYxD,EAAU,EAAI,IACtD,GAGJ,IAAIhgB,EAAS3Q,EAAKj9D,QAAQ4tE,QAGS,IAA/BR,EAAQnQ,EAAMz8D,EAAM6wF,QAChBzD,EACAptF,EAAM6wF,KAAK90C,OAAO/7C,EAAM8wF,MAAMjsF,OAAQ,EAAG43D,GAEzCz8D,EAAM6wF,KAAKlwF,KAAK87D,GAGpBz8D,EAAMy8D,EAAK8yB,MAAM5uF,KAAK87D,IAG1BA,EAAKl8D,OAASk8D,EAAKl8D,QAAU,GAGzBP,EAAMs0E,WAAa7X,EAAK6yB,SAAWlC,QAA6B5pB,IAAlB/G,EAAKmvB,WACnDnvB,EAAKmvB,UAAW,GAIpBrmB,EAAW6H,GAAQ,SAASv8D,EAAOmjE,GAC/Bj5E,EAAS0hE,EAAMuX,EAAWnjE,MAI9B4rD,EAAKmtB,QAAUpqF,EAAQuxF,sBAAwBt0B,EAAKmtB,QAChDntB,EAAKktB,QACLltB,EAAKu0B,QAAUv0B,EAAKw0B,QACpBx0B,EAAKy0B,QAAUz0B,EAAKmtB,UAO5BnB,WAAY,SAAS2G,GACjBv2F,KAAK2G,QAAUpE,EACXvC,KAAKswE,eACS,UAAdtwE,KAAK02F,MAAoB12F,KAAKg2F,oBAAqB,CAC/Ch2F,KAAKs2F,sBACLt2F,KAAKo2F,wBACLp2F,KAAKq2F,yBACLr2F,KAAKm2F,wBACPn2F,KAAKmzF,MACP5wF,EACI+tE,EAAetwE,KAAK02F,MACpBH,KAaZI,sBAAuB,WACnB,IAQIn1D,EACAoqC,EATAhI,EAAO5jE,KAAK4jE,KACZxkE,EAAQY,KAAKZ,MACbgxF,EAAaxsB,EAAKwsB,WAClBD,EAAsBnwF,KAAKmwF,oBAC3BltF,EAAOqtE,EAAertE,KACtB2qF,EAAiB3qF,EAAK2qF,eACtB0K,EAAkBr1F,EAAKs1F,wBAA0B,IACjD54F,EAAIiuF,GAAkBA,EAAe5hF,OAGrCwsF,EAAe50B,EAAKj9D,QAAQ6nF,OAAO5iE,OAInC6sE,EAAwB70B,EAAKktB,MAC7BjxF,KAAKuU,IAAIhV,GACTwkE,EAAK80B,aAET,GAAIF,EACA5sB,EAAMhgD,EAAO4sE,EAAcx4F,WAExB,GAAIowF,EACPxkB,EAAMxsE,OAEH,GAAI+wF,EACPvkB,EAAMx5D,EAAEg+D,WAAW+f,EAAqB/wF,QAErC,GAAIO,GAAK84F,GAAyB,IAKrC,KAAO94F,UAAegrE,IAARiB,GAGN6sB,IAFJj3D,EAAQ3hC,KAAKqnB,IAAIoxE,EAAiB34F,EAAI,KAGzB,GAARP,EAAcoiC,GAAU,GACH,OAAtBosD,EAAejuF,IACL,IAAVP,IAEAwsE,EAAMx5D,EAAEoyB,aAAaplC,EAAQoiC,GAAQ,GAAKosD,EAAejuF,IAarE,YARYgrE,IAARiB,IAEIA,EADA/rE,KAAKuU,IAAIhV,IAAU,IACbgT,EAAEoyB,aAAaplC,GAAQ,GAEvBgT,EAAEoyB,aAAaplC,GAAQ,OAAGurE,EAAW,KAI5CiB,GAMX+sB,kBAAmB,WACf,IAAI/0B,EAAO5jE,KACPmH,EAAQy8D,EAAKz8D,MACjBy8D,EAAKg1B,kBAAmB,EAGxBh1B,EAAKi1B,QAAUj1B,EAAKk1B,QAAUl1B,EAAK9H,UAAY,KAC/C8H,EAAKm1B,eAAiBn1B,EAAK2wB,QAEvB3wB,EAAKo1B,aACLp1B,EAAKo1B,cAITz5F,EAAKqkE,EAAKl8D,QAAQ,SAASA,GAEvB,GAAIA,EAAOE,UAAYT,EAAMR,QAAQQ,MAAM6mF,mBAAoB,CAE3D,IACIiL,EAEAC,EACAC,EAJAC,EAAgB1xF,EAAOf,QAEvBm1D,EAAYs9B,EAAct9B,UAI9B8H,EAAKg1B,kBAAmB,EAGpBh1B,EAAKozB,oBAAsBl7B,GAAa,IACxCA,EAAY,MAIZ8H,EAAK2wB,SACL0E,EAAQvxF,EAAOuxF,OACLjtF,SAKNktF,EAAgBtmB,EAASqmB,GACpBnvB,EAASovB,IACRA,aAAyBhpF,OAE3B+oF,EAAQ3mB,EAAK2mB,GAAO,SAASj3F,GACzB,OAAO8nE,EAAS9nE,MAEpBk3F,EAAgBtmB,EAASqmB,IAG7Br1B,EAAKi1B,QAAUh5F,KAAKiS,IAChBlG,EAAKg4D,EAAKi1B,QAASI,EAAM,IACzBC,GAEJt1B,EAAKk1B,QAAUj5F,KAAK4C,IAChBmJ,EAAKg4D,EAAKk1B,QAASG,EAAM,IACzBpmB,EAASomB,MAUjBvxF,EAAOM,cACPmxF,EAAgBzxF,EAAOoxF,QACvBI,EAAgBxxF,EAAOmxF,QAMnBt6B,EAAQ26B,IAAkB36B,EAAQ46B,KAClCv1B,EAAKi1B,QAAUh5F,KAAKiS,IAChBlG,EAAKg4D,EAAKi1B,QAASK,GACnBA,GAEJt1B,EAAKk1B,QAAUj5F,KAAK4C,IAChBmJ,EAAKg4D,EAAKk1B,QAASK,GACnBA,IAKJ56B,EAAQzC,KACR8H,EAAK9H,UAAYA,GAGhBs9B,EAAcL,gBACfn1B,EAAKozB,qBAELpzB,EAAKm1B,eAAgB,SAWzCtxE,UAAW,SAASklD,EAAK0sB,EAAWC,EAAU/G,EAAKgH,EAAWC,GAC1D,IAKIC,EALA71B,EAAO5jE,KAAK05F,cAAgB15F,KAC5Bo7B,EAAO,EACPu+D,EAAY,EACZC,EAASrH,EAAM3uB,EAAKi2B,UAAYj2B,EAAKkvB,OACrCgH,EAAWvH,EAAM3uB,EAAKm2B,OAASn2B,EAAK9xD,IAEpC8kF,EAAkBhzB,EAAKgzB,gBACvBoD,GAAmBp2B,EAAKq2B,WAAar2B,EAAKs2B,UAAat2B,EAAKktB,OAASyI,IAAe31B,EAAKy0B,QAuC7F,OArCKuB,IACDA,EAASh2B,EAAKkvB,QAKdwG,IACAl+D,IAAS,EACTu+D,EAAY/1B,EAAKoK,KAIjBpK,EAAKmvB,WAEL4G,IADAv+D,IAAS,IACYwoC,EAAKu2B,QAAUv2B,EAAKoK,MAIzCqrB,GAEA1sB,EAAMA,EAAMvxC,EAAOu+D,EAEnBF,GADA9sB,GAAOiqB,GACagD,EAASE,EACzBE,IACAP,EAAc71B,EAAKy0B,QAAQoB,MAK3BO,IACArtB,EAAM/I,EAAKu0B,QAAQxrB,IAEvB8sB,EAAcr+D,GAAQuxC,EAAMmtB,GAAYF,EAASD,EAC5Cv+D,EAAOw7D,GACP9sB,EAAS0vB,GAAkBI,EAASJ,EAAiB,IAGvDC,GAaXW,SAAU,SAASh7F,EAAOi7F,GACtB,OAAOr6F,KAAKynB,UAAUroB,GAAO,GAAQY,KAAKmxF,MAAO,MAAM,IAClDkJ,EAAkB,EAAIr6F,KAAKmsE,MAapCmuB,QAAS,SAASC,EAAOF,GACrB,OAAOr6F,KAAKynB,UACR8yE,GAASF,EAAkB,EAAIr6F,KAAKmsE,MACpC,GAAOnsE,KAAKmxF,MACZ,MACA,IAWR+C,gBAAiB,SAAS90F,EAAO22F,EAAWxD,EAAKtkC,EAAOusC,GACpD,IAIIz0E,EACAE,EACAmwB,EACAC,EAGAgyB,EATAlhE,EADOnH,KACMmH,MACbszF,EAFOz6F,KAESgL,KAChB0vF,EAHO16F,KAGQ8G,IAKf0rF,EAAWD,GAAOprF,EAAMsrF,gBAAmBtrF,EAAMH,YACjD2zF,EAAUpI,GAAOprF,EAAMyrF,eAAkBzrF,EAAMJ,WAE/C2rF,EAXO1yF,KAWO0yF,OAKdkI,EAAU,SAAS54F,EAAG+D,EAAGC,GAQrB,OAPIhE,EAAI+D,GAAK/D,EAAIgE,KACTioD,EACAjsD,EAAInC,KAAKiS,IAAIjS,KAAK4C,IAAIsD,EAAG/D,GAAIgE,GAE7BqiE,GAAO,GAGRrmE,GAkBf,OAfAw4F,EAAkB5uF,EAAK4uF,EA3BZx6F,KA2BkCynB,UAAUroB,EAAO,KAAM,KAAMmzF,IAC1ExsE,EAAKqwB,EAAKv2C,KAAKC,MAAM06F,EAAkB9H,GACvCzsE,EAAKowB,EAAKx2C,KAAKC,MAAM0yF,EAAUgI,EAAkB9H,GAC5C5oB,EAAS0wB,GA9BHx6F,KAiCKmxF,OACZlrE,EAAKy0E,EACLrkD,EAAKm8C,EAnCExyF,KAmCakL,OACpB6a,EAAKqwB,EAAKwkD,EAAQ70E,EAAI00E,EAAUA,EApCzBz6F,KAoCyC8E,SAEhDihB,EAAK00E,EACLrkD,EAAKukD,EAvCE36F,KAuCY+K,MACnBkb,EAAKowB,EAAKukD,EAAQ30E,EAAIy0E,EAASA,EAxCxB16F,KAwCuCyE,SAT9C4jE,GAAO,EAWJA,IAASpa,EACZ,KACA9mD,EAAMiE,SAAS04E,UAAU,CAAC,IAAK/9D,EAAIE,EAAI,IAAKmwB,EAAIC,GAAK0/C,GAAa,IAiB1E8E,uBAAwB,SAASnC,EAAc5mF,EAAKrP,GAChD,IAAI0pE,EACA2uB,EACAC,EAAaxoB,EAAa1yE,KAAKwS,MAAMP,EAAM4mF,GAAgBA,GAC3DsC,EAAazoB,EAAa1yE,KAAKipB,KAAKrmB,EAAMi2F,GAAgBA,GAC1DpI,EAAgB,GAIpB,GAAItwF,KAAKi7F,OACL,MAAO,CAACnpF,GAKZ,IADAq6D,EAAM4uB,EACC5uB,GAAO6uB,IAGV1K,EAAcxoF,KAAKqkE,IAGnBA,EAAMoG,EAAapG,EAAMusB,MAIboC,IAKZA,EAAU3uB,EAEd,OAAOmkB,GAOX4K,sBAAuB,WACnB,IAKI/uB,EALAvI,EAAO5jE,KACP2G,EAAUi9D,EAAKj9D,QACf2pF,EAAgB1sB,EAAK0sB,cACrB6K,EAAoBv3B,EAAKu3B,kBACzBC,EAAqB,GAErBC,EAAoBz3B,EAAKy3B,mBAAqB,EAC9CvpF,EAAM8xD,EAAK9xD,IAAMupF,EACjB54F,EAAMmhE,EAAKnhE,IAAM44F,EACjBtmF,EAAQtS,EAAMqP,EAGlB,GAAIiD,GAASA,EAAQomF,EAAoBv3B,EAAKoK,IAAM,EAEhD,GAAIpK,EAAKktB,MAGLvxF,EAAKS,KAAKs7F,aAAa,SAASnvB,EAAKxsE,EAAG27F,GAChC37F,GACAy7F,EAAmBtzF,KAAKyC,MACpB6wF,EACAx3B,EAAK23B,oBACDJ,EACAG,EAAY37F,EAAI,GAChB27F,EAAY37F,IACZ,YAMb,GAAIikE,EAAK+sB,gBAAgD,SAA9BhqF,EAAQw0F,kBACtCC,EAAqBA,EAAmBjjF,OACpCyrD,EAAK43B,aACD53B,EAAK63B,0BAA0BN,GAC/BrpF,EACArP,EACAkE,EAAQ2uF,mBAIhB,IACInpB,EAAMr6D,GAAOw+E,EAAc,GAAKx+E,GAAOqpF,EAAmBhvB,GAAO1pE,GAG7D0pE,IAAQivB,EAAmB,GAHuCjvB,GAAOgvB,EAM7EC,EAAmBtzF,KAAKqkE,GAQpC,OAHkC,IAA9BivB,EAAmBpvF,QACnB43D,EAAK83B,UAAUN,GAEZA,GAWXO,kBAAmB,WACf,IAIIC,EACAC,EACAC,EACAn8F,EACAu5C,EACA+/C,EACA8C,EACAC,EACAC,EACAzE,EAZA7wF,EADO3G,KACQ2G,QACfmL,EAFO9R,KAEI8R,IACXrP,EAHOzC,KAGIyC,IAHJzC,KAgBFu0F,cAA6B5pB,IAhB3B3qE,KAgBcw3F,WAhBdx3F,KAgB8C8wF,QAEjDvyB,EAAQ53D,EAAQmL,MAAQysD,EAAQ53D,EAAQlE,KAlBrCzC,KAmBEw3F,SAAW,MAMhBj4F,EAzBGS,KAyBO0H,QAAQ,SAASA,GAGvB,IAFAuxF,EAAQvxF,EAAOuxF,MACf8C,EAAar0F,EAAOw0F,WAAa,EAAIjD,EAAMjtF,OAAS,EAC/CrM,EAAIo8F,EAAYp8F,EAAI,EAAGA,IACxBu5C,EAAW+/C,EAAMt5F,GAAKs5F,EAAMt5F,EAAI,SACPgrE,IAArBmxB,GAAkC5iD,EAAW4iD,KAC7CA,EAAmB5iD,MA/B5Bl5C,KAmCEw3F,SAAW33F,KAAKiS,IAAuB,EAAnBgqF,EAnCtB97F,KAmCiD84F,QAnCjD94F,KAmCgE64F,WAKvEp2F,EAAMqP,EAxCC9R,KAwCUw3F,WAEjBqE,EA1CO77F,KA0Ce84F,QA1Cf94F,KA0C8B64F,SA1C9B74F,KA0C8Cw3F,SAKrDwE,EAAU,CAAClqF,GAHX8pF,IADApE,EA3COx3F,KA2CSw3F,UACS/0F,EAAMqP,GAAO,GAGTlG,EAAKjF,EAAQmL,IAAKA,EAAM8pF,IACjDC,IACAG,EAAQ,GAjDLh8F,KAiDe8wF,MAjDf9wF,KAiD4Bo4F,QAjD5Bp4F,KAiDyC64F,SAjDzC74F,KAiDyD64F,SAIhEoD,EAAU,EAFVnqF,EAAM+gE,EAASmpB,IAEExE,EAAU5rF,EAAKjF,EAAQlE,IAAKqP,EAAM0lF,IAC/CqE,IACAI,EAAQ,GAvDLj8F,KAuDe8wF,MAvDf9wF,KAuD4Bo4F,QAvD5Bp4F,KAuDyC84F,SAvDzC94F,KAuDyD84F,UAGhEr2F,EAAMmwE,EAASqpB,IAGLnqF,EAAM0lF,IACZwE,EAAQ,GAAKv5F,EAAM+0F,EACnBwE,EAAQ,GAAKpwF,EAAKjF,EAAQmL,IAAKrP,EAAM+0F,GACrC1lF,EAAM+gE,EAASmpB,KAhEZh8F,KAqEN8R,IAAMA,EArEA9R,KAsENyC,IAAMA,GAQf05F,WAAY,WACR,IAAIvwB,EAoBJ,OAlBI5rE,KAAKowF,WACLxkB,EAAM,EAENrsE,EAAKS,KAAK0H,QAAQ,SAASA,GACvB,IAAI00F,EAAgB10F,EAAO20F,kBACvBz0F,EAAUF,EAAOE,UAChBF,EAAOP,MAAMR,QAAQQ,MAAM6mF,oBAE3BtmF,EAAO40F,iBACR/9B,EAAQ69B,IACRx0F,IAEAgkE,EAAMrN,EAAQqN,GACV/rE,KAAKiS,IAAI85D,EAAKwwB,GACdA,MAITxwB,GAOX2wB,QAAS,SAASh8E,GACd,IAGIve,EAHAw6F,EAAqBhnF,EAAQxV,KAAKowF,YAClCjsD,EAAQq4D,EAAqBx8F,KAAKowF,WAAapwF,KAAKmkC,MACpDs4D,EAAQl8E,EAAM5Z,QAAQ3E,EAuB1B,OApBAue,EAAM7Y,OAAOg1F,gBAAiB,EAEzBn+B,EAAQk+B,KACTA,GAAqC,IAA7Bz8F,KAAK2G,QAAQg2F,YACjBp8E,EAAM7Y,OAAOk1F,gBACb7oB,EAAQxzD,EAAMja,KAAM69B,KAEb,IAAXs4D,EACKD,IACDx6F,EAAImiC,EAAMn4B,QAGdhK,EAAIy6F,OAIE9xB,IAAN3oE,IACAhC,KAAKmkC,MAAMniC,GAAKue,EAAMja,MAGnBtE,GAMX66F,YAAa,WACT,IAAIj5B,EAAO5jE,KAEPA,KAAKmkC,MAAMn4B,OAAS,IACpBhM,KAAKmkC,MAAMn4B,OAAS,EACpBhM,KAAKw3F,SAAWx3F,KAAKy3F,aACrBl4F,EAAKS,KAAK0H,QAAU,IAAI,SAASA,GAG7BA,EAAOw0F,WAAa,KAGfx0F,EAAOwkC,SAAUxkC,EAAOo1F,cACzBp1F,EAAOq1F,cACPr1F,EAAOs1F,kBAGXz9F,EAAKmI,EAAOwkC,QAAQ,SAAS3rB,EAAO5gB,GAChC,IAAIqC,EACAue,EAAM5Z,cAEIgkE,KADV3oE,EAAI4hE,EAAK24B,QAAQh8E,KACMve,IAAMue,EAAMve,IAC/Bue,EAAMve,EAAIA,EACV0F,EAAOuxF,MAAMt5F,GAAKqC,WAW1Ci7F,mBAAoB,SAASC,GACzB,IAGIb,EAIAc,EAPAv5B,EAAO5jE,KACP+U,EAAQ6uD,EAAKnhE,IAAMmhE,EAAK9xD,IACxBsrF,EAAax5B,EAAKy5B,gBAAkB,EAEpCC,EAAiB,EACjBjC,EAAoB,EACpB3B,EAAe91B,EAAK81B,aAEpB6D,IAAkB35B,EAAKwsB,WACvB0C,EAASlvB,EAAKkvB,OACdyB,EAAU3wB,EAAK2wB,SAGfA,GAAWgJ,GAAiBH,KAG5Bf,EAAoBz4B,EAAKu4B,aAErBzC,GACA4D,EAAiB5D,EAAa4D,eAC9BjC,EAAoB3B,EAAa2B,mBAEjC97F,EAAKqkE,EAAKl8D,QAAQ,SAASA,GACvB,IAAI81F,EAAmBD,EACnB,EACChJ,EACG3oF,EAAKlE,EAAOf,QAAQy2F,WAAYf,EAAmB,GAClDz4B,EAAKy5B,gBAAkB,EAC5B7D,EAAiB9xF,EAAOf,QAAQ6yF,eAEpC4D,EAAav9F,KAAK4C,IAAI26F,EAAYI,GAE7B55B,EAAKq3B,SAINqC,EAAiBz9F,KAAK4C,IAClB66F,EACA/uB,EAASirB,GAAkB,EAAIgE,EAAmB,GAKtDnC,EAAoBx7F,KAAK4C,IACrB44F,EACmB,OAAnB7B,EAA0B,EAAIgE,OAO9CL,EAAoBv5B,EAAK65B,cAAgBpB,EAAoBz4B,EAAK65B,aAAepB,EAAoB,EACrGz4B,EAAK05B,eAAiBA,GAAkCH,EACxDv5B,EAAKy3B,kBAAoBA,GAAwC8B,EAGjEv5B,EAAKw5B,WAAav9F,KAAKiS,IAAIsrF,EAAYroF,GAKnCw/E,IACA3wB,EAAKy4B,kBAAoBA,IAK7Ba,IACAt5B,EAAKi2B,UAAY/G,GAErBlvB,EAAK85B,iBAAmB95B,EAAKkvB,OAASA,EAClClvB,EAAKj9D,QAAQg3F,aACb/5B,EAAKoK,KAAQj5D,EAAQsmF,GAAsB,GAC/Cz3B,EAAK8uB,OAAS9uB,EAAKutB,MAAQvtB,EAAK54D,KAAO44D,EAAK14D,OAC5C04D,EAAKgzB,gBAAkB9D,EAASwK,GAGpCM,aAAc,WACV,OAAO59F,KAAKyC,IAAMzC,KAAK+U,OAO3B8oF,gBAAiB,SAASC,GACtB,IAUI9xF,EACA+xF,EAEAC,EAKAC,EACAC,EACAC,EACAC,EArBAx6B,EAAO5jE,KACPmH,EAAQy8D,EAAKz8D,MACbR,EAAUi9D,EAAKj9D,QACfmqF,EAAQltB,EAAKktB,MACbsH,EAAUx0B,EAAKw0B,QACfzH,EAAiB/sB,EAAK+sB,eACtB4D,EAAU3wB,EAAK2wB,QACf2C,EAAWtzB,EAAKszB,SAChB/B,EAAaxuF,EAAQwuF,WACrBD,EAAavuF,EAAQuuF,WAGrBmJ,EAAqB13F,EAAQ+xF,aAE7B4F,EAA0B33F,EAAQ8uF,kBAClCrF,EAAaxsB,EAAKwsB,WAClBt0B,EAAY8H,EAAK9H,UACjBi9B,EAAgBn1B,EAAKm1B,cAMpBpI,GAAmBP,GAAe8G,GACnCl3F,KAAKu+F,gBAITJ,EAAUvyF,EAAKg4D,EAAK37D,QAAStB,EAAQmL,KACrCssF,EAAUxyF,EAAKg4D,EAAK17D,QAASvB,EAAQlE,KAGjCy0F,GACAtzB,EAAK81B,aAAevyF,EAAMy8D,EAAK8yB,MAAM/vF,EAAQwwF,UAC7C4G,EAAuBn6B,EAAK81B,aAAa1xF,cACzC47D,EAAK9xD,IAAMlG,EAAKmyF,EAAqBjsF,IAAKisF,EAAqBlF,SAC/Dj1B,EAAKnhE,IAAMmJ,EAAKmyF,EAAqBt7F,IAAKs7F,EAAqBjF,SAC3DnyF,EAAQ3B,OAAS4+D,EAAK81B,aAAa/yF,QAAQ3B,MAC3CoN,EAAE/B,MAAM,GAAI,MAOX0oF,GAAiBx6B,EAAQzC,KACtB8H,EAAKi1B,SAAW/8B,GAChBmiC,EAAeniC,EACfo5B,EAAa,GACNtxB,EAAKk1B,SAAWh9B,IACvBoiC,EAAepiC,EACfq5B,EAAa,IAIrBvxB,EAAK9xD,IAAMlG,EAAKuyF,EAASF,EAAcr6B,EAAKi1B,SAC5Cj1B,EAAKnhE,IAAMmJ,EAAKwyF,EAASF,EAAct6B,EAAKk1B,UAI5ChI,IAEIltB,EAAKozB,qBACJ8G,GACDj+F,KAAKiS,IAAI8xD,EAAK9xD,IAAKlG,EAAKg4D,EAAKi1B,QAASj1B,EAAK9xD,OAAS,GAEpDM,EAAE/B,MAAM,GAAI,GAKhBuzD,EAAK9xD,IAAMygE,EAAa6lB,EAAQx0B,EAAK9xD,KAAM,IAC3C8xD,EAAKnhE,IAAM8vE,EAAa6lB,EAAQx0B,EAAKnhE,KAAM,KAI3CmhE,EAAK7uD,OAASwpD,EAAQqF,EAAKnhE,OAC3BmhE,EAAK37D,QAAU27D,EAAK9xD,IAAMqsF,EAAUt+F,KAAK4C,IAAImhE,EAAK9xD,IAAK8xD,EAAKg6B,gBAC5Dh6B,EAAK17D,QAAUk2F,EAAUx6B,EAAKnhE,IAE9BmhE,EAAK7uD,MAAQ,MAIjBmgE,EAAUtR,EAAM,iBAGZA,EAAK46B,eACL56B,EAAK46B,gBAIT56B,EAAK+3B,oBAIAvL,GAAexsB,EAAKy5B,gBAAmBz5B,EAAK66B,eAAkBvH,IAAY34B,EAAQqF,EAAK9xD,OAAQysD,EAAQqF,EAAKnhE,OAC7GuJ,EAAS43D,EAAKnhE,IAAMmhE,EAAK9xD,QAEhBysD,EAAQ4/B,IAAYjJ,IACrBtxB,EAAK9xD,KAAO9F,EAASkpF,IAEpB32B,EAAQ6/B,IAAYjJ,IACrBvxB,EAAKnhE,KAAOuJ,EAASmpF,IAM7BrrB,EAASnjE,EAAQ+3F,WACjB96B,EAAK9xD,IAAMjS,KAAKiS,IAAI8xD,EAAK9xD,IAAKnL,EAAQ+3F,UAEtC50B,EAASnjE,EAAQg4F,WACjB/6B,EAAKnhE,IAAM5C,KAAK4C,IAAImhE,EAAKnhE,IAAKkE,EAAQg4F,UAEtC70B,EAASnjE,EAAQ0L,SACjBuxD,EAAK9xD,IAAMjS,KAAK4C,IAAImhE,EAAK9xD,IAAKnL,EAAQ0L,QAEtCy3D,EAASnjE,EAAQi4F,WACjBh7B,EAAKnhE,IAAM5C,KAAKiS,IAAI8xD,EAAKnhE,IAAKkE,EAAQi4F,UAStC7F,GAAiBx6B,EAAQqF,EAAKi1B,WAC9B/8B,EAAYA,GAAa,GACpByC,EAAQ4/B,IAAYv6B,EAAK9xD,IAAMgqD,GAAa8H,EAAKi1B,SAAW/8B,EAC7D8H,EAAK9xD,IAAMgqD,GACHyC,EAAQ6/B,IAAYx6B,EAAKnhE,IAAMq5D,GAAa8H,EAAKk1B,SAAWh9B,IACpE8H,EAAKnhE,IAAMq5D,IAMf8H,EAAK9xD,MAAQ8xD,EAAKnhE,UAAoBkoE,IAAb/G,EAAK9xD,UAAkC64D,IAAb/G,EAAKnhE,IACxDmhE,EAAK80B,aAAe,EACbxB,IAAamH,GACpBC,IAA4B16B,EAAK81B,aAAa/yF,QAAQ8uF,kBACtD7xB,EAAK80B,aAAe2F,EAAqBz6B,EAAK81B,aAAahB,aAE3D90B,EAAK80B,aAAe9sF,EAChByyF,EACAr+F,KAAK6+F,YAAej7B,EAAKnhE,IAAMmhE,EAAK9xD,KAAOjS,KAAK4C,IAAIzC,KAAK6+F,WAAa,EAAG,QAAMl0B,EAC/EylB,EACA,GAECxsB,EAAKnhE,IAAMmhE,EAAK9xD,KAAOwsF,EAA0Bz+F,KAAK4C,IAAImhE,EAAKoK,IAAKswB,IAMzE/J,IAAYuJ,GACZv+F,EAAKqkE,EAAKl8D,QAAQ,SAASA,GACvBA,EAAOq1F,YAAYn5B,EAAK9xD,MAAQ8xD,EAAKm2B,QAAUn2B,EAAKnhE,MAAQmhE,EAAKk7B,WAKzEl7B,EAAKq5B,oBAAmB,GAGpBr5B,EAAKm7B,wBACLn7B,EAAKm7B,yBAILn7B,EAAKo7B,0BACLp7B,EAAK80B,aAAe90B,EAAKo7B,wBAAwBp7B,EAAK80B,eAItD90B,EAAKw5B,aAAeiB,IACpBz6B,EAAK80B,aAAe74F,KAAK4C,IAAImhE,EAAKw5B,WAAYx5B,EAAK80B,eAIvDsF,EAAkBpyF,EAAKjF,EAAQq3F,gBAAiBp6B,EAAK+sB,gBAAkB/sB,EAAKy4B,oBACvEgC,GAAsBz6B,EAAK80B,aAAesF,IAC3Cp6B,EAAK80B,aAAesF,GAInBrN,GAAmBG,GAAUuN,IAC9Bz6B,EAAK80B,aAAe3mB,EAChBnO,EAAK80B,aACL,KACA7mB,EAAajO,EAAK80B,cAGlB9sF,EAAKjF,EAAQurE,gBAAiBtO,EAAK80B,aAAe,IAAO90B,EAAK80B,aAAe,GAAK90B,EAAKnhE,IAAM,KAAQmhE,EAAKnhE,IAAM,SAAUzC,KAAK6+F,aAKlI7+F,KAAK6+F,aACNj7B,EAAK80B,aAAe90B,EAAKq7B,YAG7Bj/F,KAAKk/F,oBAMTA,iBAAkB,WAEd,IACI5O,EADA3pF,EAAU3G,KAAK2G,QAEfw4F,EAAsBx4F,EAAQ2pF,cAC9B8O,EAAiBz4F,EAAQy4F,eACzB7J,EAAc5uF,EAAQ4uF,YACtBN,EAAYtuF,EAAQsuF,UAGxBj1F,KAAKsyF,eAAkBtyF,KAAKowF,YAA4C,YAA9BzpF,EAAQ6uF,mBACxB,IAAtBx1F,KAAK04F,aAAsB,GAAM,EAIrC14F,KAAKm7F,kBAAkD,SAA9Bx0F,EAAQw0F,mBAAgCn7F,KAAK04F,aAClE14F,KAAK04F,aAAe,EAAI/xF,EAAQw0F,kBAMpCn7F,KAAKi7F,OACDj7F,KAAK8R,MAAQ9R,KAAKyC,KAClB87D,EAAQv+D,KAAK8R,OACZ9R,KAAK6+F,aAGFx3F,SAASrH,KAAK8R,IAAK,MAAQ9R,KAAK8R,MAGN,IAA1BnL,EAAQurE,eAIhBlyE,KAAKswF,cAAgBA,EAAgB6O,GAAuBA,EAAoB7vF,QAC3EghF,KAGGA,EADAtwF,KAAK2wF,eACW3wF,KAAKw7F,aACjBx7F,KAAKy7F,0BACDz7F,KAAK04F,aACL/xF,EAAQ04F,OAEZr/F,KAAK8R,IACL9R,KAAKyC,IACLkE,EAAQ2uF,YACRt1F,KAAKs/F,iBACLt/F,KAAKq8F,mBACL,GAEGr8F,KAAK8wF,MACI9wF,KAAKu7F,oBACjBv7F,KAAK04F,aACL14F,KAAK8R,IACL9R,KAAKyC,KAGOzC,KAAK66F,uBACjB76F,KAAK04F,aACL14F,KAAK8R,IACL9R,KAAKyC,MAKKuJ,OAAShM,KAAKguE,MAC5BsiB,EAAgB,CAACA,EAAc,GAAIA,EAAcriD,QAGrDjuC,KAAKswF,cAAgBA,EAGjB8O,IACAA,EAAiBA,EAAe70F,MAAMvK,KAAM,CAACA,KAAK8R,IAAK9R,KAAKyC,SAExDzC,KAAKswF,cAAgBA,EAAgB8O,IAOjDp/F,KAAKs7F,YAAchL,EAAchhF,MAAM,GACvCtP,KAAK07F,UAAUpL,EAAeiF,EAAaN,GACtCj1F,KAAKk3F,WAGFl3F,KAAKi7F,SACLj7F,KAAK8R,KAAO,GACZ9R,KAAKyC,KAAO,IAEX08F,GAAwBC,GACzBp/F,KAAKu/F,qBAQjB7D,UAAW,SAASpL,EAAeiF,EAAaN,GAC5C,IAAI8F,EAAazK,EAAc,GAC3B0K,EAAa1K,EAAcA,EAActkF,OAAS,GAClDsxF,EAAiBt9F,KAAKs9F,gBAAkB,EAE5C,IAAKt9F,KAAKk3F,SAAU,CAChB,GAAI3B,GAAewF,KAAe,IAC9B/6F,KAAK8R,IAAMipF,OAEX,KAAO/6F,KAAK8R,IAAMwrF,EAAiBhN,EAAc,IAC7CA,EAAcpiD,QAItB,GAAI+mD,EACAj1F,KAAKyC,IAAMu4F,OAEX,KAAOh7F,KAAKyC,IAAM66F,EAAiBhN,EAAcA,EAActkF,OAAS,IACpEskF,EAAcriD,MAKO,IAAzBqiD,EAActkF,QAAgBuyD,EAAQw8B,IACtCzK,EAAcxoF,MAAMkzF,EAAaD,GAAc,KAY3DyE,cAAe,WACX,IACIC,EADAC,EAAS,GAET/4F,EAAU3G,KAAK2G,QA+BnB,OA3B4C,IAAxC3G,KAAKmH,MAAMR,QAAQQ,MAAMw4F,aACF,IAAvBh5F,EAAQg5F,YAIP3/F,KAAK8wF,OAENvxF,EAAKS,KAAKmH,MAAMnH,KAAK02F,OAAO,SAAS9yB,GACjC,IAAIg8B,EAAeh8B,EAAKj9D,QAEpBqN,EAAM,CADE4vD,EAAKutB,MAEDyO,EAAa50F,KAAO40F,EAAa94F,IACzC84F,EAAa96F,MACb86F,EAAan7F,OACbm7F,EAAaC,MACf9nE,KAAK,KAGP6rC,EAAKl8D,OAAOsE,SACR0zF,EAAO1rF,GACPyrF,GAAW,EAEXC,EAAO1rF,GAAO,MAKvByrF,GAMXlB,cAAe,WACX,IAAI53F,EAAU3G,KAAK2G,QACfk4F,EAAal4F,EAAQk4F,WACrBpJ,EAAoB9uF,EAAQ8uF,mBAE3Bl3B,EAAQ53D,EAAQ+xF,eAAiB14F,KAAKguE,IAAMynB,IAAsBz1F,KAAK60F,WACvE70F,KAAK8wF,OAASnqF,EAAQ4uF,aAAe5uF,EAAQsuF,YAC9C4J,EAAa,IAGZA,GAAc7+F,KAAKw/F,kBAEpBX,EAAah/F,KAAKipB,KAAK9oB,KAAKguE,IAAMynB,GAAqB,GAKvDoJ,EAAa,IACb7+F,KAAK8/F,aAAejB,EACpBA,EAAa,GAGjB7+F,KAAK6+F,WAAaA,GAStBU,iBAAkB,WACd,IAKI5/F,EACAquE,EANA0qB,EAAe14F,KAAK04F,aACpBpI,EAAgBtwF,KAAKswF,cACrBuO,EAAa7+F,KAAK6+F,WAClBiB,EAAe9/F,KAAK8/F,aACpBC,EAAoBzP,GAAiBA,EAActkF,OAIvD,GAAI+zF,EAAoBlB,EAAY,CAChC,KAAOvO,EAActkF,OAAS6yF,GAC1BvO,EAAcxoF,KAAKyqE,EACf+d,EAAcA,EAActkF,OAAS,GAAK0sF,IAGlD14F,KAAK8yF,SAAWiN,EAAoB,IAAMlB,EAAa,GACvD7+F,KAAKyC,IAAM6tF,EAAcA,EAActkF,OAAS,QAGzC+zF,EAAoBlB,IAC3B7+F,KAAK04F,cAAgB,EACrB14F,KAAKk/F,oBAIT,GAAI3gC,EAAQuhC,GAAe,CAEvB,IADAngG,EAAIquE,EAAMsiB,EAActkF,OACjBrM,MAEmB,IAAjBmgG,GAAsBngG,EAAI,GAAM,GAChCmgG,GAAgB,GAAKngG,EAAI,GAAKA,EAAIquE,EAAM,IAEzCsiB,EAAcptC,OAAOvjD,EAAG,GAGhCK,KAAK8/F,kBAAen1B,IAQ5Bq1B,SAAU,WACN,IACIlD,EACAmD,EAFOjgG,KAIN+5F,OAJM/5F,KAIQ8R,IAJR9R,KAKN8+F,OALM9+F,KAKQyC,IALRzC,KAMNkgG,cANMlgG,KAMeguE,IANfhuE,KASNmgG,cAELF,EAXWjgG,KAWcguE,MAXdhuE,KAW2BkgG,cAGtC3gG,EAdWS,KAcD0H,QAAQ,SAASA,IACnBA,EAAOo1F,aAAep1F,EAAO04F,SAC7B14F,EAAOuwF,MAAMmI,WACbtD,GAAc,MAKlBmD,GAAqBnD,GAtBd98F,KAsBkCk3F,UAtBlCl3F,KAsBmDqgG,aAtBnDrgG,KAuBFiI,UAvBEjI,KAuBesgG,YAvBftgG,KAuBkCkI,UAvBlClI,KAuBmDugG,YAvBnDvgG,KAuBsEw/F,iBAvBtEx/F,KAyBEwgG,aAzBFxgG,KA0BEwgG,cA1BFxgG,KA6BFqgG,aAAc,EA7BZrgG,KAgCF24F,oBAhCE34F,KAmCF69F,kBAnCE79F,KAsCFsgG,WAtCEtgG,KAsCgBiI,QAtChBjI,KAuCFugG,WAvCEvgG,KAuCgBkI,QAvChBlI,KA0CGogG,UA1CHpgG,KA2CEogG,QAAUH,GA3CZjgG,KA2CsC8R,MA3CtC9R,KA2CmD+5F,QA3CnD/5F,KA2CkEyC,MA3ClEzC,KA2C+E8+F,SA3C/E9+F,KA6CKygG,aA7CLzgG,KA8CFygG,eAmCbt4F,YAAa,SAASu4F,EAAQC,EAAQv6B,EAAQ7+D,EAAW4tE,GACrD,IAAIvR,EAAO5jE,KACPmH,EAAQy8D,EAAKz8D,MAEjBi/D,EAASx6D,EAAKw6D,GAAQ,GAEtB7mE,EAAKqkE,EAAKl8D,QAAQ,SAASk5F,UAChBA,EAAMC,UAIjB1rB,EAAiB3yE,EAAO2yE,EAAgB,CACpCrjE,IAAK4uF,EACLj+F,IAAKk+F,IAITzrB,EAAUtR,EAAM,cAAeuR,GAAgB,WAE3CvR,EAAK37D,QAAUy4F,EACf98B,EAAK17D,QAAUy4F,EACf/8B,EAAKk9B,UAAY3rB,EAEb/O,GACAj/D,EAAMi/D,OAAO7+D,OASzBie,KAAM,SAASk7E,EAAQC,GACnB,IAAI9H,EAAU74F,KAAK64F,QACfC,EAAU94F,KAAK84F,QACfnyF,EAAU3G,KAAK2G,QACfmL,EAAMjS,KAAKiS,IAAI+mF,EAASjtF,EAAKjF,EAAQmL,IAAK+mF,IAC1Cp2F,EAAM5C,KAAK4C,IAAIq2F,EAASltF,EAAKjF,EAAQlE,IAAKq2F,IAuC9C,OArCI4H,IAAW1gG,KAAK8R,KAAO6uF,IAAW3gG,KAAKyC,MAGlCzC,KAAK+gG,mBAEFxiC,EAAQs6B,KACJ6H,EAAS5uF,IACT4uF,EAAS5uF,GAET4uF,EAASj+F,IACTi+F,EAASj+F,IAGb87D,EAAQu6B,KACJ6H,EAAS7uF,IACT6uF,EAAS7uF,GAET6uF,EAASl+F,IACTk+F,EAASl+F,KAMrBzC,KAAKghG,gBAAwBr2B,IAAX+1B,QAAmC/1B,IAAXg2B,EAG1C3gG,KAAKmI,YACDu4F,EACAC,GACA,OACAh2B,EAAW,CACPs2B,QAAS,WAKd,GAMXd,YAAa,WACT,IAAIh5F,EAAQnH,KAAKmH,MACbR,EAAU3G,KAAK2G,QACf6qD,EAAU7qD,EAAQ6qD,SAAW,CAAC,EAAG,EAAG,EAAG,GACvC2/B,EAAQnxF,KAAKmxF,MACbrsF,EAAQ8G,EAAKjF,EAAQ7B,MAAOqC,EAAM+5F,UAAY1vC,EAAQ,GAAKA,EAAQ,IACnE/sD,EAASmH,EAAKjF,EAAQlC,OAAQ0C,EAAMg6F,WAAa3vC,EAAQ,GAAKA,EAAQ,IACtE1qD,EAAM8E,EAAKjF,EAAQG,IAAKK,EAAMi6F,QAAU5vC,EAAQ,IAChDxmD,EAAOY,EAAKjF,EAAQqE,KAAM7D,EAAMk6F,SAAW7vC,EAAQ,IACnD8vC,EAAe,KAIfA,EAAal6F,KAAK3C,KAClBA,EAAS5E,KAAKC,MAAMgsB,WAAWrnB,GAAU,IAAM0C,EAAMg6F,aAErDG,EAAal6F,KAAKN,KAClBA,EAAMjH,KAAKC,MAAMgsB,WAAWhlB,GAAO,IAAMK,EAAMg6F,WAAah6F,EAAMi6F,UAItEphG,KAAKgL,KAAOA,EACZhL,KAAK8G,IAAMA,EACX9G,KAAK8E,MAAQA,EACb9E,KAAKyE,OAASA,EACdzE,KAAKkL,OAAS/D,EAAMH,YAAcvC,EAASqC,EAC3C9G,KAAK+K,MAAQ5D,EAAMJ,WAAajC,EAAQkG,EAGxChL,KAAKguE,IAAMnuE,KAAK4C,IAAI0uF,EAAQrsF,EAAQL,EAAQ,GAC5CzE,KAAKmsE,IAAMglB,EAAQnmF,EAAOlE,GA+B9BkB,YAAa,WACT,IACI8oF,EADO9wF,KACM8wF,MACbC,EAFO/wF,KAEQ+wF,QAEnB,MAAO,CACHj/E,IAAKg/E,EAAQve,EAAawe,EALnB/wF,KAKgC8R,MALhC9R,KAK6C8R,IACpDrP,IAAKquF,EAAQve,EAAawe,EANnB/wF,KAMgCyC,MANhCzC,KAM6CyC,IACpDo2F,QAPO74F,KAOO64F,QACdC,QARO94F,KAQO84F,QACd7wF,QATOjI,KASOiI,QACdC,QAVOlI,KAUOkI,UAQtBq5F,aAAc,SAASzlC,GACnB,IACIg1B,EADO9wF,KACM8wF,MACbC,EAFO/wF,KAEQ+wF,QACfyQ,EAAU1Q,EAAQC,EAHX/wF,KAGwB8R,KAHxB9R,KAGoC8R,IAC3C2vF,EAAU3Q,EAAQC,EAJX/wF,KAIwByC,KAJxBzC,KAIoCyC,IAU/C,OARkB,OAAdq5D,GAEO0lC,EAAU1lC,EADjBA,EAAY0lC,EAGLC,EAAU3lC,IACjBA,EAAY2lC,GAXLzhG,KAcCynB,UAAUq0C,EAAW,EAAG,EAAG,EAAG,IAY9C4lC,eAAgB,SAAS5pD,GACrB,IACIrN,GAAS7+B,EAAKksC,EAAU,GAAkB,GAAZ93C,KAAKmzF,KAAa,KAAO,IAS3D,OAPI1oD,EAAQ,IAAMA,EAAQ,IAChB,QACCA,EAAQ,KAAOA,EAAQ,IACxB,OAEA,UAUdy6B,SAAU,SAASroD,GACf,IAAIlW,EAAU3G,KAAK2G,QACf2sF,EAAa3sF,EAAQkW,EAAS,UAC9B02E,EAAY3nF,EAAKjF,EAAQkW,EAAS,SAAqB,SAAXA,GAAqB7c,KAAKu0F,QAAU,EAAI,GAExF,GAAIhB,GAAaD,EAKb,MAHqC,WAAjC3sF,EAAQkW,EAAS,cACjBy2E,GAAcA,GAEX,CAACA,EAAYC,IAQ5BoO,aAAc,WACV,IAAI9gG,EAAQb,KAAKswF,eAAiBtwF,KAAKswF,cAAc,IAAM,EAC3D,OAAOtwF,KAAKmH,MAAMiE,SAASg3E,YACvBpiF,KAAK2G,QAAQ6nF,OAAOhuF,OAASR,KAAK2G,QAAQ6nF,OAAOhuF,MAAMsD,SACvD9D,KAAK25D,MAAM94D,IAAUb,KAAK25D,MAAM94D,GAAO6iF,QAS/Cub,SAAU,WACN,IAKInnD,EAGA5iC,EAEAk9E,EAVA/B,EAAerwF,KAAK2G,QAAQ6nF,OAC5B2C,EAAQnxF,KAAKmxF,MACbuH,EAAe14F,KAAK04F,aACpBkJ,EAAkBlJ,EAClBmJ,EAAW7hG,KAAKguE,OAAShuE,KAAKowF,WAAa,EAAI,GAAKpwF,KAAKyC,IAAMzC,KAAK8R,KAAO4mF,GAE3EoJ,EAAiBzR,EAAav4C,SAC9B6pD,EAAe3hG,KAAK2hG,eAEpBI,EAAYlxC,OAAOmxC,UAGnBC,EAAU,SAASC,GACf,IAAIhtF,EAAOgtF,GAAeL,GAAY,GAEtC,OADA3sF,EAAOA,EAAO,EAAIrV,KAAKipB,KAAK5T,GAAQ,GACtBwjF,GAsCtB,OAnCIvH,GACAiB,GAAgB/B,EAAa2C,eAAiB3C,EAAan7E,OACvDqpD,EAAQujC,GAAkB,CAACA,GAC3BD,EAAWj2F,EAAKykF,EAAa8R,kBAAmB,KAAO9R,EAAa+B,gBAOpE7yF,EAAK6yF,GAAc,SAAS7V,GACxB,IAAIvkB,GAEAukB,IAAQulB,GAAmBvlB,GAAOA,IAAQ,IAAMA,GAAO,MAIvDvkB,GAFA9iD,EAAO+sF,EAAQpiG,KAAKuU,IAAIutF,EAAaj7F,EAAI7G,KAAKqkB,IAAIumD,EAAU8R,MAE7C18E,KAAKuU,IAAImoE,EAAM,MAElBwlB,IACRA,EAAY/pC,EACZlgB,EAAWykC,EACXqlB,EAAkB1sF,MAM1Bm7E,EAAan7E,OACrB0sF,EAAkBK,EAAQN,EAAaj7F,IAG3C1G,KAAKoyF,aAAeA,EACpBpyF,KAAKoiG,cAAgBx2F,EAAKksC,EAAUgqD,GAE7BF,GAOX5P,aAAc,WACV,IAAI7qF,EAAQnH,KAAKmH,MACbgqF,EAAQnxF,KAAKmxF,MACbd,EAAerwF,KAAK2G,QAAQ6nF,OAC5B6T,EAAYxiG,KAAK4C,IAAIzC,KAAKswF,cAActkF,QAAUhM,KAAKowF,WAAa,EAAI,GAAI,GAC5EvI,EAAa1gF,EAAMwZ,OAAO,GAE9B,OACIwwE,IACCd,EAAan7E,MAAQ,GAAK,IAC1Bm7E,EAAav4C,WACZ93C,KAAKgzF,cAAgB,GAAKhzF,KAAKguE,IAAOq0B,IACrClR,IACFtJ,GAAeA,EAAa1gF,EAAM8mF,QAAQ,IACxB,IAAnB9mF,EAAMJ,aAQdu7F,eAAgB,WACZ,IAWIhgG,EAEAohF,EACA/jF,EACAwsE,EAfAhlE,EAAQnH,KAAKmH,MACbiE,EAAWjE,EAAMiE,SACjBklF,EAAgBtwF,KAAKswF,cACrB32B,EAAQ35D,KAAK25D,MACb02B,EAAerwF,KAAK2G,QAAQ6nF,OAC5B2C,EAAQnxF,KAAKmxF,MACbY,EAAY/xF,KAAKgyF,eACjBuQ,EAAa1iG,KAAK4C,IAAI,EAAG5C,KAAKC,MAAMiyF,EAAY,GAAK1B,EAAazsF,SAAW,KAC7EvD,EAAO,GACPshG,EAAe3hG,KAAK2hG,eACpBa,EAAqBnS,EAAa7vF,OAAS6vF,EAAa7vF,MAAMu8E,aAE9D0lB,EAAiB,EAqBrB,GAfKl0B,EAAS8hB,EAAav4C,YACvBz3C,EAAKy3C,SAAWu4C,EAAav4C,UAAY,GAI7Cv4C,EAAK+wF,GAAe,SAAShhC,IACzBA,EAAOqK,EAAMrK,KACDA,EAAK2hC,YAAcwR,IAC3BA,EAAiBnzC,EAAK2hC,gBAG9BjxF,KAAKyiG,eAAiBA,EAIlBziG,KAAKoyF,aAIDqQ,EAAiBF,GAAcE,EAAiBd,EAAaj7F,EAC7DrG,EAAKy3C,SAAW93C,KAAKoiG,cAErBpiG,KAAKoiG,cAAgB,OAItB,GAAIrQ,IAEPzvF,EAAM,CACFwC,MAAOy9F,EAAa,OAGnBC,GAKD,IAJAlgG,EAAIy6E,aAAe,OAGnBp9E,EAAI2wF,EAActkF,QACVmlF,GAASxxF,KACbwsE,EAAMmkB,EAAc3wF,IACpB+jF,EAAQ/pB,EAAMwS,GAAKuX,SAGXA,EAAMvU,QAAwC,aAA9BuU,EAAMvU,OAAO4N,aAC7B2G,EAAMphF,IAAI,CACNy6E,aAAc,SAIXpjB,EAAMwS,GAAK8kB,YAAcc,GAChCrO,EAAMphF,IAAI,CACNwC,MAAOitF,EAAY,OAIvBrO,EAAMrH,UAAU53E,OAASzE,KAAKguE,IAAMsiB,EAActkF,QAAU21F,EAAaj7F,EAAIi7F,EAAa3gG,KAC1F0iF,EAAMgf,QAAU,CACZ3lB,aAAc,cAUlC18E,EAAKy3C,WACLx1C,EAAM,CACFwC,OAAQ29F,EAAqC,GAApBt7F,EAAMH,YAAwC,IAApBG,EAAMH,YAAqBG,EAAMH,aAAe,MAElGw7F,IACDlgG,EAAIy6E,aAAe,aAK3B/8E,KAAK6xF,WAAaxB,EAAa9rF,OAASvE,KAAK0hG,eAAe1hG,KAAKoiG,eAC7DpiG,KAAK6xF,aACLxxF,EAAKkE,MAAQvE,KAAK6xF,YAItBtyF,EAAK+wF,GAAe,SAASnkB,GACzB,IAAI7c,EAAOqK,EAAMwS,GACbuX,EAAQp0B,GAAQA,EAAKo0B,MACrBA,IACAA,EAAMrjF,KAAKA,GACPiC,GACAohF,EAAMphF,IAAIC,EAAMD,EAAKohF,EAAMgf,iBAExBhf,EAAMgf,QACbpzC,EAAKxX,SAAWz3C,EAAKy3C,aAK7B93C,KAAKizF,YAAc7nF,EAAS06E,QAAQ6b,EAAa37F,EAAGhG,KAAKoiG,eAAiB,EAAiB,IAAdpiG,KAAKmzF,OAMtFxkF,QAAS,WACL,OAAO3O,KAAK44F,kBAAqBr6B,EAAQv+D,KAAK8R,MAAQysD,EAAQv+D,KAAKyC,QAAUzC,KAAKswF,eAOtFqS,SAAU,SAASv8F,GACf,IAMI+/E,EALA/6E,EADOpL,KACSmH,MAAMiE,SACtB+lF,EAFOnxF,KAEMmxF,MACbwB,EAHO3yF,KAGS2yF,SAEhBiQ,EALO5iG,KAIQ2G,QACYpG,MALpBP,KAQD6iG,aACN1c,EAAYyc,EAAiBzc,aAEzBA,GAAagL,EAAQ,CACjB2R,IAAK,OACLC,OAAQ,SACRC,KAAM,SACN,CACAF,IAAKnQ,EAAW,QAAU,OAC1BoQ,OAAQ,SACRC,KAAMrQ,EAAW,OAAS,UAC3BiQ,EAAiBr+F,QAnBjBvE,KAqBF6iG,UAAYz3F,EAAS9K,KAClBsiG,EAAiBtiG,KACjB,EACA,EACAsiG,EAAiBjd,SAEpBtlF,KAAK,CACFsJ,OAAQ,EACRmuC,SAAU8qD,EAAiB9qD,UAAY,EACvCvzC,MAAO4hF,IAEVjM,SAAS,yBAET53E,IAAIsgG,EAAiBpiG,OAErBsL,IApCE9L,KAoCOy0F,WApCPz0F,KAqCF6iG,UAAU7S,OAAQ,GArChBhwF,KAyCN6iG,UAAUz8F,EAAU,OAAS,SAAQ,IAY9C68F,aAAc,SAAS92B,GACnB,IAAIxS,EAAQ35D,KAAK25D,MAEZA,EAAMwS,GAGPxS,EAAMwS,GAAK+jB,WAFXv2B,EAAMwS,GAAO,IAAI2jB,EAAK9vF,KAAMmsE,IASpC+2B,UAAW,WACP,IASIv0F,EACAw0F,EAEAC,EAKAC,EAGAx3D,EAIAy3D,EAxBA1/B,EAAO5jE,KACPmH,EAAQy8D,EAAKz8D,MACbiE,EAAWjE,EAAMiE,SACjBzE,EAAUi9D,EAAKj9D,QACf2pF,EAAgB1sB,EAAK0sB,cACrB32B,EAAQiK,EAAKjK,MACbw3B,EAAQvtB,EAAKutB,MACbgC,EAAOvvB,EAAKuvB,KACZoQ,EAAep8F,EAAMs0E,WAAa7X,EAAK6yB,QAAU,CAAC,EAAG,EAAG,EAAG,GAAGtD,GAAQA,EAGtEqQ,EAAc,EAEdC,EAAc,EACdb,EAAmBj8F,EAAQpG,MAC3B8vF,EAAe1pF,EAAQ6nF,OACvB4E,EAAc,EAEdsQ,EAAav8F,EAAMu8F,WACnBC,EAAax8F,EAAMw8F,WAEnBC,EAAkB,EAAE,EAAG,EAAG,GAAI,GAAGzQ,GACjCzpF,EAAY/C,EAAQ+C,UACpBm6F,EAAajgC,EAAKigC,WAElB3+B,EAAWllE,KAAKklE,SAAS,QAG7Bv2D,EAAUi1D,EAAKj1D,UACfi1D,EAAKu/B,SAAWA,EAAWx0F,GAAW/C,EAAKjF,EAAQm9F,WAAW,GAG9DlgC,EAAKovB,aAAepvB,EAAKutB,OAASd,EAAa2C,aAG1CpvB,EAAK6wB,YACN7wB,EAAKqwB,UAAY7oF,EAAS3K,EAAE,QACvBJ,KAAK,CACFsJ,OAAQhD,EAAQo9F,YAAc,IAEjC7pB,SAAS,cAAgBl6E,KAAK02F,KAAKluF,cAAgB,UAAYkB,GAAa,KAC5EoC,IAAI+3F,GACTjgC,EAAK6wB,UAAYrpF,EAAS3K,EAAE,QACvBJ,KAAK,CACFsJ,OAAQhD,EAAQgD,QAAU,IAE7BuwE,SAAS,cAAgBl6E,KAAK02F,KAAKluF,cAAgB,KAAOkB,GAAa,KACvEoC,IAAI+3F,GACTjgC,EAAKotB,WAAa5lF,EAAS3K,EAAE,eACxBJ,KAAK,CACFsJ,OAAQ0mF,EAAa1mF,QAAU,IAElCuwE,SAAS,cAAgBtW,EAAK8yB,KAAKluF,cAAgB,YAAckB,GAAa,KAC9EoC,IAAI+3F,IAGTl1F,GAAWi1D,EAAKszB,UAGhB33F,EAAK+wF,GAAe,SAASnkB,EAAKxsE,GAE9BikE,EAAKq/B,aAAa92B,EAAKxsE,MAG3BikE,EAAK0+B,kBAI6B,IAA9BjS,EAAa2T,cAAoC,IAAT7Q,GAAuB,IAATA,GAAc,CAChE8Q,EAAG,OACHC,EAAG,SACL/Q,KAAUvvB,EAAKiuB,YAAkC,WAApBjuB,EAAKiuB,YACpCtyF,EAAK+wF,GAAe,SAASnkB,GAGzBinB,EAAcvzF,KAAK4C,IACfk3D,EAAMwS,GAAK+kB,eACXkC,MAKRxvB,EAAKovB,eACLI,GAAexvB,EAAKovB,aACpBpvB,EAAKwvB,YAAcA,GAAexvB,EAAK+uB,UAAY,EAAI,KAK3DjmB,EAAW/S,GAAO,SAASrK,EAAMhuD,GAC7BguD,EAAKhnD,iBACEqxD,EAAMr4D,MAIjBshG,GAAoBA,EAAiBtiG,OAAqC,IAA7BsiG,EAAiBn7F,UAC9Dm8D,EAAK++B,SAASQ,GAEVA,IAA8C,IAAlCP,EAAiBoB,eAC7BpgC,EAAK4/B,YAAcA,EACf5/B,EAAKi/B,UAAUxmB,UAAU8U,EAAQ,SAAW,SAChDiS,EAAoBR,EAAiBrjE,OACrCkkE,EAAcllC,EAAQ6kC,GAAqB,EAAIx3F,EAAKg3F,EAAiBjiF,OAAQwwE,EAAQ,EAAI,MAKjGvtB,EAAKugC,aAGLvgC,EAAKrkC,OAASqkE,EAAkBh4F,EAAKjF,EAAQ44B,OAAQmkE,EAAWvQ,IAEhEvvB,EAAKqvB,YAAcrvB,EAAKqvB,aAAe,CACnCjxF,EAAG,EACHf,EAAG,GAGHqiG,EADS,IAATnQ,GACwBvvB,EAAK+9B,eAAej7F,EAC5B,IAATysF,EACgBvvB,EAAKqvB,YAAYhyF,EAEjB,EAI3BoiG,EAAoBxjG,KAAKuU,IAAIg/E,GAAeqQ,EACxCrQ,IACAiQ,GAAqBC,EACrBD,GAAqBO,GAAmBzS,EAAQvlF,EAAKykF,EAAapvF,EAAG2iE,EAAKqvB,YAAYhyF,EAAsB,EAAlB2iG,GAAuBvT,EAAaruF,IAElI4hE,EAAKwgC,gBAAkBx4F,EAAKw3F,EAAmBC,GAE/CK,EAAWvQ,GAAQtzF,KAAK4C,IACpBihG,EAAWvQ,GACXvvB,EAAKwgC,gBAAkBZ,EAAcI,EAAkBhgC,EAAKrkC,OAC5D8jE,EACA10F,GAAW2hF,EAActkF,QAAUk5D,EACnCA,EAAS,GAAK0+B,EAAkBhgC,EAAKrkC,OACrC,GAKJsM,EAAqD,EAA9ChsC,KAAKwS,MAAMuxD,EAAKygC,SAAS5rB,cAAgB,GAC5C9xE,EAAQ44B,OAAS,IACjBsM,GAAyB,EAAjBllC,EAAQ44B,QAEpBokE,EAAWJ,GAAgB1jG,KAAK4C,IAC5BkhG,EAAWJ,IAAiB13D,EAC5BA,IAaRy4D,YAAa,SAASvO,GAClB,IAAI5uF,EAAQnH,KAAKmH,MACbwrF,EAAW3yF,KAAK2yF,SAChBpzD,EAASv/B,KAAKu/B,OACd4xD,EAAQnxF,KAAKmxF,MACboT,EAAWvkG,KAAKgL,MAAQ2nF,EAAW3yF,KAAK8E,MAAQ,GAAKy6B,EACrDilE,EAAUr9F,EAAMH,YAAchH,KAAKkL,QAClCynF,EAAW3yF,KAAKyE,OAAS,GAAK86B,EAMnC,OAJIozD,IACAoD,IAAc,GAGX5uF,EAAMiE,SACR04E,UAAU,CACP,IACAqN,EACAnxF,KAAKgL,KACLu5F,EACApT,EACAqT,EACAxkG,KAAK8G,IACL,IACAqqF,EACAhqF,EAAMJ,WAAa/G,KAAK+K,MACxBw5F,EACApT,EACAqT,EACAr9F,EAAMH,YAAchH,KAAKkL,QAC1B6qF,IAMXoO,WAAY,WACHnkG,KAAKqkG,WACNrkG,KAAKqkG,SAAWrkG,KAAKmH,MAAMiE,SAASqtC,OAC/ByhC,SAAS,wBACTpuE,IAAI9L,KAAKy0F,WAGdz0F,KAAKqkG,SAAShkG,KAAK,CACfuE,OAAQ5E,KAAK2G,QAAQmvF,UACrB,eAAgB91F,KAAK2G,QAAQovF,UAC7BpsF,OAAQ,MASpB86F,iBAAkB,WAEd,IAAItT,EAAQnxF,KAAKmxF,MACbsJ,EAAWz6F,KAAKgL,KAChB0vF,EAAU16F,KAAK8G,IACf49F,EAAa1kG,KAAKguE,IAClB40B,EAAmB5iG,KAAK2G,QAAQpG,MAChCogB,EAASwwE,EAAQsJ,EAAWC,EAC5B/H,EAAW3yF,KAAK2yF,SAChBpzD,EAASv/B,KAAKu/B,OACdolE,EAAU/B,EAAiB5gG,GAAK,EAChC4iG,EAAUhC,EAAiB3hG,GAAK,EAChC6C,EAAW9D,KAAKmH,MAAMiE,SAASg3E,YAAYwgB,EAAiBpiG,OAASoiG,EAAiBpiG,MAAMsD,SAAU9D,KAAK6iG,WAAW7hG,EAGtH6jG,EAAY,CACR/B,IAAKniF,GAAUwwE,EAAQ,EAAIuT,GAC3B3B,OAAQpiF,EAAS+jF,EAAa,EAC9B1B,KAAMriF,GAAUwwE,EAAQuT,EAAa,IACvC9B,EAAiBr+F,OAGnBugG,GAAW3T,EAAQuJ,EAAU16F,KAAKyE,OAASg2F,IAC1CtJ,EAAQ,GAAK,IACbwB,GAAY,EAAI,GACjB3yF,KAAKokG,iBACU,IAAdpkG,KAAKmzF,KAAarvF,EAAW,GAElC,MAAO,CACH9B,EAAGmvF,EACC0T,EAAYF,EAAUG,GAAWnS,EAAW3yF,KAAK8E,MAAQ,GAAKy6B,EAASolE,EAC3E1jG,EAAGkwF,EACC2T,EAAUF,GAAWjS,EAAW3yF,KAAKyE,OAAS,GAAK86B,EAASslE,EAAYD,IASpFG,gBAAiB,SAAS54B,GACtB,IAAI64B,EAAehlG,KAAKmH,MAAM89F,aAAen7B,EAAS9pE,KAAK+5F,QACvD1C,EAAar3F,KAAKq3F,WAEjBA,EAAWlrB,KACZkrB,EAAWlrB,GAAO,IAAI2jB,EAAK9vF,KAAMmsE,EAAK,UAItC64B,GAAgB3N,EAAWlrB,GAAK6jB,OAChCqH,EAAWlrB,GAAK2oB,OAAO,MAAM,GAGjCuC,EAAWlrB,GAAK2oB,OAAO,MAAM,EAAO,IASxCoQ,WAAY,SAAS/4B,EAAKxsE,GACtB,IAAIu3F,EAAWl3F,KAAKk3F,SAChBv9B,EAAQ35D,KAAK25D,MACbqrC,EAAehlG,KAAKmH,MAAM89F,aAAen7B,EAAS9pE,KAAK+5F,UAGtD7C,GAAa/qB,GAAOnsE,KAAK8R,KAAOq6D,GAAOnsE,KAAKyC,OAExCk3D,EAAMwS,KACPxS,EAAMwS,GAAO,IAAI2jB,EAAK9vF,KAAMmsE,IAI5B64B,GAAgBrrC,EAAMwS,GAAK6jB,OAC3Br2B,EAAMwS,GAAK2oB,OAAOn1F,GAAG,EAAM,IAG/Bg6D,EAAMwS,GAAK2oB,OAAOn1F,KAO1Bm1F,OAAQ,WACJ,IAkBIjmD,EACAC,EAnBA80B,EAAO5jE,KACPmH,EAAQy8D,EAAKz8D,MACbiE,EAAWjE,EAAMiE,SACjBzE,EAAUi9D,EAAKj9D,QACfmqF,EAAQltB,EAAKktB,MACbC,EAAUntB,EAAKmtB,QACfmG,EAAWtzB,EAAKszB,SAChB5G,EAAgB1sB,EAAK0sB,cACrBuS,EAAYj/B,EAAKi/B,UACjBlpC,EAAQiK,EAAKjK,MACb09B,EAAazzB,EAAKyzB,WAClBE,EAAiB3zB,EAAK2zB,eACtB4N,EAAoBx+F,EAAQsvF,YAC5BmP,EAAqBz+F,EAAQy+F,mBAC7B9S,EAAiB1uB,EAAK0uB,eACtB+R,EAAWzgC,EAAKygC,SAChBlB,EAAWv/B,EAAKu/B,SAChB57F,EAAY6rE,EAAWhoE,EAAS+nE,iBAsHpC,GAjHAvP,EAAKwzB,UAAUprF,OAAS,EAExB43D,EAAKyhC,SAAU,EAGf9lG,EAAK,CAACo6D,EAAO09B,EAAYE,IAAiB,SAASb,GAC/ChqB,EAAWgqB,GAAM,SAASpnC,GACtBA,EAAKylC,UAAW,SAKpBnxB,EAAKj1D,WAAauoF,KAGdtzB,EAAKu3B,oBAAsBv3B,EAAKwsB,YAChC7wF,EAAKqkE,EAAKs3B,yBAAyB,SAAS/uB,GACxCvI,EAAKmhC,gBAAgB54B,MAMzBmkB,EAActkF,SACdzM,EAAK+wF,GAAe,SAASnkB,EAAKxsE,GAC9BikE,EAAKshC,WAAW/4B,EAAKxsE,MAIrB2yF,IAAgC,IAAb1uB,EAAK9xD,KAAa8xD,EAAKq3B,UACrCthC,GAAO,KACRA,GAAO,GAAK,IAAIm2B,EAAKlsB,GAAO,EAAG,MAAM,IAEzCjK,GAAO,GAAGm7B,QAAQ,KAMtBsQ,GACA7lG,EAAK+wF,GAAe,SAASnkB,EAAKxsE,GAC9BmvC,OAA8B67B,IAAzB2lB,EAAc3wF,EAAI,GAAmB2wF,EAAc3wF,EAAI,GAAK2yF,EAAiB1uB,EAAKnhE,IAAM6vF,EACzF3yF,EAAI,GAAM,GAAKwsE,EAAMvI,EAAKnhE,KAAOqsC,GAAM80B,EAAKnhE,KAAO0E,EAAMqpC,OAAS8hD,EAAiBA,KAC9EiF,EAAeprB,KAChBorB,EAAeprB,GAAO,IAAI/5D,EAAEkzF,eAAe1hC,IAE/C/0B,EAAOs9B,EAAMmmB,EACbiF,EAAeprB,GAAKxlE,QAAU,CAC1BkoC,KAAMiiD,EAAQC,EAAQliD,GAAQA,EAC9BC,GAAIgiD,EAAQC,EAAQjiD,GAAMA,EAC1BtwC,MAAO4mG,GAEX7N,EAAeprB,GAAK2oB,SACpByC,EAAeprB,GAAK4oB,UAAW,MAMtCnxB,EAAK2hC,eACNhmG,GAAMoH,EAAQ6+F,WAAa,IAAIrtF,OAAOxR,EAAQ8+F,WAAa,KAAK,SAASC,GACrE9hC,EAAK+hC,kBAAkBD,MAE3B9hC,EAAK2hC,cAAe,IAM5BhmG,EAAK,CAACo6D,EAAO09B,EAAYE,IAAiB,SAASb,GAC/C,IAAI/2F,EACAimG,EAAiB,GACjBrsE,EAAQhyB,EAAUge,SActBmnD,EAAWgqB,GAAM,SAASpnC,EAAM6c,GACvB7c,EAAKylC,WAENzlC,EAAKwlC,OAAO3oB,GAAK,EAAO,GACxB7c,EAAKylC,UAAW,EAChB6Q,EAAe99F,KAAKqkE,OAK5B4C,GAvB2B,WAEnB,IADApvE,EAAIimG,EAAe55F,OACZrM,KAGC+2F,EAAKkP,EAAejmG,MAAQ+2F,EAAKkP,EAAejmG,IAAIo1F,WACpD2B,EAAKkP,EAAejmG,IAAI2I,iBACjBouF,EAAKkP,EAAejmG,OAkBvC+2F,IAASa,GAAmBpwF,EAAM89F,aAAgB1rE,EAAYA,EAAJ,MAK9D8qE,IACAA,EAASA,EAASwB,SAAW,UAAY,QAAQ,CAC7CxmG,EAAGW,KAAKskG,YAAYD,EAAS5rB,iBAEjC4rB,EAASwB,UAAW,EAGpBxB,EAASlB,EAAW,OAAS,SAAQ,IAGrCN,GAAaM,EAAU,CACvB,IAAI2C,EAAUliC,EAAK6gC,mBACf36B,EAASg8B,EAAQ7kG,IACjB4hG,EAAUA,EAAU7S,MAAQ,OAAS,WAAW8V,GAChDjD,EAAU7S,OAAQ,IAElB6S,EAAUxiG,KAAK,KAAM,MACrBwiG,EAAU7S,OAAQ,GAKtBmV,GAAqBA,EAAkB19F,SACvCm8D,EAAKmiC,oBAITniC,EAAKw8B,SAAU,GAMnBh6B,OAAQ,WAEApmE,KAAK4H,UAEL5H,KAAK80F,SAGLv1F,EAAKS,KAAKs3F,mBAAmB,SAAS0O,GAClCA,EAASlR,aAKjBv1F,EAAKS,KAAK0H,QAAQ,SAASA,GACvBA,EAAO04F,SAAU,MAOzB6F,UAAW,CAAC,SAAU,WAAY,QAAS,SAAU,UAAW,WAUhE39F,QAAS,SAAS49F,GACd,IAGIC,EACAxmG,EAJAikE,EAAO5jE,KACP23F,EAAS/zB,EAAK+zB,OACdL,EAAoB1zB,EAAK0zB,kBAoB7B,GAfK4O,GACD/jG,EAAYyhE,GAIhB8I,EAAWirB,GAAQ,SAASlnC,EAAO21C,GAC/BtzB,EAAwBriB,GAExBknC,EAAOyO,GAAY,QAIvB7mG,EAAK,CAACqkE,EAAKjK,MAAOiK,EAAKyzB,WAAYzzB,EAAK2zB,iBAAiB,SAASb,GAC9D5jB,EAAwB4jB,MAExBY,EAEA,IADA33F,EAAI23F,EAAkBtrF,OACfrM,KACH23F,EAAkB33F,GAAG2I,UAY7B,IAAK69F,KAPL5mG,EAAK,CAAC,kBAAmB,WAAY,YAAa,YAAa,YAAa,aAAc,UAAU,SAASksE,GACrG7H,EAAK6H,KACL7H,EAAK6H,GAAQ7H,EAAK6H,GAAMnjE,cAKds7D,EAAKmzB,wBACnBnzB,EAAKmzB,wBAAwBoP,GAAaviC,EAAKmzB,wBAAwBoP,GAAW79F,UAItFokE,EAAW9I,GAAM,SAAS+I,EAAK34D,IACW,IAAlC+/D,EAAQ//D,EAAK4vD,EAAKqiC,mBACXriC,EAAK5vD,OAcxBqyF,cAAe,SAASh9F,EAAGkX,GAEvB,IAAIk4B,EAGA0zB,EACAm6B,EAHA3/F,EAAU3G,KAAK83F,UACfvI,EAAO3jF,EAAKjF,EAAQ4oF,MAAM,GAG1BgX,EAAUvmG,KAAKuhE,MAQnB,GAJKl4D,IACDA,EAAIrJ,KAAKuhE,OAASvhE,KAAKuhE,MAAMl4D,GAK5BrJ,KAAK83F,YAEyB,KAA7Bv5B,EAAQh+C,KAAWgvE,GAGlB,CAoBH,GAjBKA,EAEMhxB,EAAQh+C,KACf4rD,EAAMnsE,KAAKu0F,QAAUh0E,EAAMimF,MAAQxmG,KAAKguE,IAAMztD,EAAMkmF,OAFpDt6B,EAAM9iE,IAAMrJ,KAAKmxF,MAAQ9nF,EAAEq9F,OAAS1mG,KAAKmsE,IAAMnsE,KAAKguE,IAAM3kE,EAAEs9F,OAAS3mG,KAAKmsE,KAK1E5N,EAAQ4N,KACR1zB,EAAOz4C,KAAKk0F,gBAER3zE,IAAUvgB,KAAKu0F,QAAUh0E,EAAMve,EAAI4J,EAAK2U,EAAMqmF,OAAQrmF,EAAMtf,IAC5D,KACA,KACA,KACAkrE,IACC,OAGJ5N,EAAQ9lB,GAET,YADAz4C,KAAK6mG,gBAITP,EAActmG,KAAKowF,aAAepwF,KAAK60F,SAGlC0R,IACDvmG,KAAKuhE,MAAQglC,EAAUvmG,KAAKmH,MAAMiE,SAC7BqtC,OACAyhC,SAAS,8CACLosB,EAAc,YAAc,SAAW3/F,EAAQ+C,WACnDrJ,KAAK,CACFsJ,OAAQiC,EAAKjF,EAAQgD,OAAQ,KAEhCmC,MAILy6F,EAAQlmG,KAAK,CACT,OAAUsG,EAAQnI,QAAU8nG,EAAc9nG,EAAM,WAAWs4E,WAAW,KAAM/nE,MAAQ,WACpF,eAAgBnD,EAAKjF,EAAQ7B,MAAO,KAEpC6B,EAAQotF,WACRwS,EAAQlmG,KAAK,CACT2zF,UAAWrtF,EAAQotF,aAO/BwS,EAAQrpB,OAAO78E,KAAK,CAChBhB,EAAGo5C,IAGH6tD,IAAgB3/F,EAAQ7B,OACxByhG,EAAQlmG,KAAK,CACT,eAAgBL,KAAK8yF,SAG7B9yF,KAAKuhE,MAAMl4D,EAAIA,OA/DfrJ,KAAK6mG,iBAsEbA,cAAe,WACP7mG,KAAKuhE,OACLvhE,KAAKuhE,MAAM6b,UAKvBhrE,EAAE4iF,KAAOA,EACFA,EAvzFA,CAwzFTj0F,GAwsbF,OAvsbC,SAASqR,GAMN,IAAI4iF,EAAO5iF,EAAE4iF,KACT9kF,EAAOkC,EAAElC,KACTkgE,EAAah+D,EAAEg+D,WACfE,EAAiBl+D,EAAEk+D,eACnB/R,EAAUnsD,EAAEmsD,QACZh/D,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACXqvE,EAAez/D,EAAEy/D,aACjB7B,EAAc59D,EAAE49D,YAChB+B,EAAwB3/D,EAAE2/D,sBAC1BnmE,EAAOwG,EAAExG,KACTynE,EAAYjhE,EAAEihE,UAYlB2hB,EAAKlyF,UAAU04F,aAAe,SAASsL,EAAoBh1F,EAAKrP,EAAK6yF,GACjE,IACI31F,EAGAonG,EAMAC,EAVA1W,EAAgB,GAEhBM,EAAc,GACd1D,EAAS5c,EAAegc,OAAOY,OAG/B+Z,EAAU,IAAI/2F,EAAK4B,EAAMjS,KAAK4C,IAAIutE,EAAYl+D,GAAMk+D,EAAYvtE,KAChEykG,EAAWh3F,EAAKw9E,WAChB9pD,EAAWkjE,EAAmBK,UAC9B5kC,EAAQukC,EAAmBvkC,MAG/B,GAAIhE,EAAQzsD,GAAM,CACdm1F,EAAQ/2F,EAAKk3F,mBAAmBxjE,GAAYyvC,EAAU7K,OAAS,EAC3DjG,EAAQ1iE,KAAKwS,MAAM40F,EAAQ3pE,kBAAoBilC,IAE/C3+B,GAAYyvC,EAAU7K,QACtBy+B,EAAQ/2F,EAAKm3F,cAAczjE,GAAYyvC,EAAU3K,OAAS,EACtDnG,EAAQ1iE,KAAKwS,MAAM40F,EAAQrpE,aAAe2kC,IAG9C3+B,GAAYyvC,EAAU3K,QACtBu+B,EAAQ/2F,EAAKo3F,cAAc1jE,GAAYyvC,EAAUzK,KAAO,EACpDrG,EAAQ1iE,KAAKwS,MAAM40F,EAAQ/2F,EAAKkhE,gBAAkB7O,IAGtD3+B,GAAYyvC,EAAUzK,MACtBq+B,EAAQ/2F,EAAKq3F,YAAY3jE,GAAYyvC,EAAU3vC,IAAM,EACjD6+B,EAAQ1iE,KAAKwS,MAAM40F,EAAQ/2F,EAAKsgE,cAAgBjO,IAGpD3+B,GAAYyvC,EAAU3vC,KACtBujE,EAAQ/2F,EAAKs3F,WAAW5jE,GAAYyvC,EAAUtK,MAAQ,EAClDxG,EAAQ1iE,KAAKwS,MAAM40F,EAAQ/2F,EAAKygE,aAAepO,IAGnD3+B,GAAYyvC,EAAUtK,QACtBk+B,EAAQ/2F,EAAKu3F,YAAY7jE,GAAYyvC,EAAU5vC,KAAO,EAClD8+B,EAAQ1iE,KAAKwS,MAAM40F,EAAQ/2F,EAAK0gE,cAAgBrO,IACpDwkC,EAAUE,EAAQ/2F,EAAK4gE,kBAGvBltC,GAAYyvC,EAAU5vC,OACtBsjE,GAAWA,EAAUxkC,EACrB0kC,EAAQ/2F,EAAKw3F,eAAeX,IAI5BnjE,IAAayvC,EAAUxvC,MAEvBojE,EAAQ/2F,EAAKs3F,WAAWP,EAAQ/2F,EAAKygE,aAAes2B,EAAQ/2F,EAAKugE,YAC7D7kE,EAAK0pF,EAAa,IAK1ByR,EAAUE,EAAQ/2F,EAAK4gE,iBACvB,IAAI62B,EAAWV,EAAQ/2F,EAAK0gE,cACxBg3B,EAAcX,EAAQ/2F,EAAKygE,aAC3Bk3B,EAAWZ,EAAQ/2F,EAAKsgE,eAIxBtgE,EAAKigE,kBAAoBjgE,EAAKggE,uBAO9B82B,IACM9Z,KAAYh9E,EAAKggE,uBAGfztE,EAAMqP,EAAM,EAAIuhE,EAAUtK,OAG1BiH,EAAYl+D,KAASk+D,EAAYvtE,IAIzCwkG,EAAUA,EAAQnpE,UAClBmpE,EAAU,IAAI/2F,EAAK+2F,EAAUj3B,EAAYi3B,KAK7C,IAAIxtE,EAAOwtE,EAAQnpE,UAEnB,IADAn+B,EAAI,EACG85B,EAAOh3B,GACV6tF,EAAcxoF,KAAK2xB,GAGfmK,IAAayvC,EAAU5vC,KACvBhK,EAAOytE,EAASH,EAAUpnG,EAAI4iE,EAAO,GAG9B3+B,IAAayvC,EAAUtK,MAC9BtvC,EAAOytE,EAASH,EAASY,EAAWhoG,EAAI4iE,IAIjCykC,GAAsBpjE,IAAayvC,EAAU3vC,KAAOE,IAAayvC,EAAUxvC,KAI3EmjE,GAAqBpjE,IAAayvC,EAAUzK,KACnDnvC,EAAOytE,EAASH,EAASY,EAAUC,EAAaC,EAAWloG,EAAI4iE,GAI/D9oC,GAAQmK,EAAW2+B,EARnB9oC,EAAOytE,EAASH,EAASY,EAAUC,EAC/BjoG,EAAI4iE,GAAS3+B,IAAayvC,EAAU3vC,IAAM,EAAI,IAUtD/jC,IAIJ2wF,EAAcxoF,KAAK2xB,GAMfmK,GAAYyvC,EAAUzK,MAAQ0nB,EAActkF,OAAS,KACrDzM,EAAK+wF,GAAe,SAAS72D,GAIrBA,EAAO,MAAY,GAEc,cAAjC22C,EAAW,WAAY32C,KAEvBm3D,EAAYn3D,GAAQ,UAapC,OALA62D,EAAcI,KAAOluF,EAAOskG,EAAoB,CAC5ClW,YAAaA,EACbkX,WAAYlkE,EAAW2+B,IAGpB+tB,GAWX0E,EAAKlyF,UAAU24F,0BAA4B,SAAS/C,EAAcqP,GAC9D,IAgCIpoG,EAhCA0/F,EAAQ0I,GAAe,CACnB,CACI,cACA,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,MAExC,CACI,SAAU,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,KAEhC,CACI,SAAU,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,KAEhC,CACI,OAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,KAE/B,CACI,MAAO,CAAC,EAAG,IAEf,CACI,OAAQ,CAAC,EAAG,IAEhB,CACI,QAAS,CAAC,EAAG,EAAG,EAAG,EAAG,IAE1B,CACI,OACA,OAGR/rE,EAAOqjE,EAAMA,EAAMrzF,OAAS,GAC5B43B,EAAWyvC,EAAUr3C,EAAK,IAC1Bg2C,EAAYh2C,EAAK,GAKrB,IAAKr8B,EAAI,EAAGA,EAAI0/F,EAAMrzF,SAClBgwB,EAAOqjE,EAAM1/F,GACbikC,EAAWyvC,EAAUr3C,EAAK,IAC1Bg2C,EAAYh2C,EAAK,KAGbqjE,EAAM1/F,EAAI,IAMN+4F,IAJY90D,EAAWouC,EAAUA,EAAUhmE,OAAS,GACpDqnE,EAAUgsB,EAAM1/F,EAAI,GAAG,KAAO,IATZA,KA8B9B,OAXIikC,IAAayvC,EAAU5vC,MAAQi1D,EAAe,EAAI90D,IAClDouC,EAAY,CAAC,EAAG,EAAG,IAUhB,CACHm1B,UAAWvjE,EACX2+B,MARIwP,EACJ2mB,EAAe90D,EACfouC,EACY,SAAZh2C,EAAK,GAAgBn8B,KAAK4C,IAAIovE,EAAa6mB,EAAe90D,GAAW,GAAK,GAM1EitD,SAAU70D,EAAK,KAhQ3B,CAoQEj7B,GACD,SAASqR,GAMN,IAAI4iF,EAAO5iF,EAAE4iF,KACTnjB,EAAez/D,EAAEy/D,aACjB99D,EAAM3B,EAAE2B,IACRg+D,EAAwB3/D,EAAE2/D,sBAC1BnmE,EAAOwG,EAAExG,KAQbopF,EAAKlyF,UAAUy4F,oBAAsB,SAAS33D,EAAU9xB,EAAKrP,EAAKulG,GAC9D,IACIrhG,EADO3G,KACQ2G,QACf+9F,EAFO1kG,KAEWguE,IAClB+iB,EAHO/wF,KAGQ+wF,QACfqH,EAJOp4F,KAIQo4F,QAGf6P,EAAY,GAQhB,GALKD,IAVMhoG,KAWFkoG,mBAAqB,MAI1BtkE,GAAY,GACZA,EAAW/jC,KAAKC,MAAM8jC,GACtBqkE,EAjBOjoG,KAiBU66F,uBAAuBj3D,EAAU9xB,EAAKrP,QAIpD,GAAImhC,GAAY,IAAM,CACzB,IACIukE,EACAxoG,EACAiC,EACAosE,EACA7B,EACA2uB,EACAsN,EAUJ,IAPID,EADAvkE,EAAW,GACI,CAAC,EAAG,EAAG,GACfA,EAAW,IACH,CAAC,EAAG,EAAG,EAAG,EAAG,GAEb,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAGvCjkC,EAjBYE,KAAKwS,MAAMP,GAiBPnS,EAAI8C,EAAM,IAAM2lG,EAAQzoG,IAEzC,IADAquE,EAAMm6B,EAAan8F,OACdpK,EAAI,EAAGA,EAAIosE,IAAQo6B,EAAQxmG,KAC5BuqE,EAAMisB,EAAQrH,EAAQpxF,GAAKwoG,EAAavmG,KAC9BkQ,KAASk2F,GAASlN,GAAWr4F,SAAoBkoE,IAAZmwB,GAC3CmN,EAAUngG,KAAKgzF,GAGfA,EAAUr4F,IACV2lG,GAAS,GAEbtN,EAAU3uB,MAOf,CACH,IAAIq1B,EAAUzQ,EAAQj/E,GAClB2vF,EAAU1Q,EAAQtuF,GAClB47F,EAAqB13F,EAAQqhG,EAAQ,oBAAsB,gBAC3DK,EAAoD,SAAvBhK,EAAgC,KAAOA,EACpEC,EAA0B33F,EAAQ8uF,mBAAqBuS,EAAQ,EAAI,GACnEM,EAAmBN,EAAQtD,EA/DxB1kG,KA+D0CswF,cAActkF,OAAS04F,EAExE9gE,EAAWh4B,EACPy8F,EAlEGroG,KAmEEkoG,oBACJzG,EAAUD,GAAWlD,GAA2BgK,GAAoB,IAGzE1kE,EAAWmuC,EACPnuC,EACA,KACAiuC,EAAajuC,IAGjBqkE,EAAYl0F,EA7EL/T,KA6Ec66F,uBACjBj3D,EACA49D,EACAC,GACDrJ,GAEE4P,IAnFEhoG,KAoFEkoG,mBAAqBtkE,EAAW,GAQ7C,OAHKokE,IAzFMhoG,KA0FF04F,aAAe90D,GAEjBqkE,GAGXjT,EAAKlyF,UAAUs1F,QAAU,SAAStmB,GAC9B,OAAOjyE,KAAKklB,IAAI+sD,GAAOjyE,KAAKq6B,MAGhC86D,EAAKlyF,UAAUiuF,QAAU,SAASjf,GAC9B,OAAOjyE,KAAKqnB,IAAI,GAAI4qD,IAvH5B,CA0HE/wE,GACD,SAASqR,EAAG4iF,GAMT,IAAIniB,EAAWzgE,EAAEygE,SACbD,EAAWxgE,EAAEwgE,SACbrU,EAAUnsD,EAAEmsD,QACZuU,EAA0B1gE,EAAE0gE,wBAC5BvzE,EAAO6S,EAAE7S,KACTqvE,EAAQx8D,EAAEw8D,MACVrsE,EAAQ6P,EAAE7P,MACVqJ,EAAOwG,EAAExG,KAKbwG,EAAEkzF,eAAiB,SAAS1hC,EAAMj9D,GAC9B3G,KAAK4jE,KAAOA,EAERj9D,IACA3G,KAAK2G,QAAUA,EACf3G,KAAK8O,GAAKnI,EAAQmI,KAI1BsD,EAAEkzF,eAAexiG,UAAY,CAMzBgyF,OAAQ,WACJ,IAuBI16E,EAvBA4rF,EAAWhmG,KACX4jE,EAAOoiC,EAASpiC,KAChButB,EAAQvtB,EAAKutB,MACbxqF,EAAUq/F,EAASr/F,QACnB4hG,EAAe5hG,EAAQ+8E,MACvBA,EAAQsiB,EAAStiB,MACjB50C,EAAKnoC,EAAQmoC,GACbD,EAAOloC,EAAQkoC,KACfzvC,EAAQuH,EAAQvH,MAChBopG,EAASjqC,EAAQ1vB,IAAS0vB,EAAQzvB,GAClC25D,EAASlqC,EAAQn/D,GACjBspG,EAAU1C,EAAS0C,QACnB1Y,GAAS0Y,EACTjwD,EAAO,GACPj6C,EAAQmI,EAAQnI,MAChBmL,EAASiC,EAAKjF,EAAQgD,OAAQ,GAC9B4qE,EAAS5tE,EAAQ4tE,OACjBjF,EAAU,CACN,MAAS,oBAAsBk5B,EAAS,QAAU,UAAY7hG,EAAQ+C,WAAa,KAEvFi/F,EAAe,GACfv9F,EAAWw4D,EAAKz8D,MAAMiE,SACtBw9F,EAAYJ,EAAS,QAAU,QAE/BpQ,EAAUx0B,EAAKw0B,QAmDnB,GAhDIx0B,EAAKktB,QACLjiD,EAAOupD,EAAQvpD,GACfC,EAAKspD,EAAQtpD,GACb1vC,EAAQg5F,EAAQh5F,IAKhBqpG,GACAn5B,EAAU,CACN1qE,OAAQpG,EACR,eAAgBmI,EAAQ7B,OAExB6B,EAAQotF,YACRzkB,EAAQ0kB,UAAYrtF,EAAQotF,YAGzByU,IACHhqG,IACA8wE,EAAQ3qE,KAAOnG,GAEfmI,EAAQ6oF,cACRlgB,EAAQ1qE,OAAS+B,EAAQwnF,YACzB7e,EAAQ,gBAAkB3oE,EAAQ6oF,cAM1CmZ,EAAah/F,OAASA,EACtBi/F,GAAa,IAAMj/F,GAEnByQ,EAAQwpD,EAAKmzB,wBAAwB6R,MAEjChlC,EAAKmzB,wBAAwB6R,GAAaxuF,EAAQhP,EAAS3K,EAAE,QAAUmoG,GAClEvoG,KAAKsoG,GAAc78F,OAIxBkkF,IACAgW,EAAS0C,QAAUA,EACft9F,EACCqtC,OACAp4C,KAAKivE,GAASxjE,IAAIsO,IAKvBquF,EACAhwD,EAAOmrB,EAAKswB,gBAAgB90F,EAAOspG,EAAQjwB,mBACxC,KAAI+vB,EAGP,OAFA/vD,EAAOmrB,EAAKilC,gBAAgBh6D,EAAMC,EAAInoC,GAqD1C,OA9CIqpF,GAASv3C,GAAQA,EAAKzsC,QACtB08F,EAAQroG,KAAK,CACThB,EAAGo5C,IAIH87B,GACAniE,EAAEs6D,WAAW6H,GAAQ,SAASv8D,EAAOmjE,GACjCutB,EAAQ/nG,GAAGw6E,GAAW,SAAS9xE,GAC3BkrE,EAAO4G,GAAW5wE,MAAMy7F,EAAU,CAAC38F,WAIxCq/F,IACHjwD,GACAiwD,EAAQxrB,OACRwrB,EAAQjzB,QAAQ,CACZp2E,EAAGo5C,MAGPiwD,EAAQtrB,OACJsG,IACAsiB,EAAStiB,MAAQA,EAAQA,EAAMp7E,aAMvCigG,GAAgBhqC,EAAQgqC,EAAajoG,OAASm4C,GAAQA,EAAKzsC,QAC3D43D,EAAK9+D,MAAQ,GAAK8+D,EAAKn/D,OAAS,IAAMg0C,EAAKqwD,MAE3CP,EAAehmG,EAAM,CACjBgC,MAAO4sF,GAASqX,GAAU,SAC1BxmG,EAAGmvF,GAASqX,GAAU,EAAI,GAC1B3jG,eAAgBssF,GAASqX,GAAU,SACnCvnG,EAAGkwF,EAAQqX,EAAS,GAAK,GAAKA,EAAS,GAAK,EAC5C1wD,SAAUq5C,IAAUqX,GAAU,IAC/BD,GAEHvoG,KAAK00F,YAAY6T,EAAc9vD,EAAM+vD,EAAQ7+F,IAEtC+5E,GACPA,EAAMtG,OAIH4oB,GAMXtR,YAAa,SAAS6T,EAAc9vD,EAAM+vD,EAAQ7+F,GAC9C,IAGI2lE,EACA7oB,EACAC,EACA1kD,EACAf,EANAyiF,EADW1jF,KACM0jF,MACjBt4E,EAFWpL,KAES4jE,KAAKz8D,MAAMiE,SAQ9Bs4E,KACDpU,EAAU,CACN/qE,MAAOgkG,EAAapiB,WAAaoiB,EAAahkG,MAC9CuzC,SAAUywD,EAAazwD,SACvB,MAAS,oBAAsB0wD,EAAS,OAAS,QAAU,WAAaD,EAAa7+F,WAAa,MAG9FC,OAASA,EAjBN3J,KAmBF0jF,MAAQA,EAAQt4E,EAAS9K,KAC1BioG,EAAajoG,KACb,EACA,EACAioG,EAAa5iB,SAEhBtlF,KAAKivE,GACLxjE,MAGL43E,EAAMphF,IAAIimG,EAAa/nG,QAM3BimD,EAAK,CAAChO,EAAK,GAAIA,EAAK,GAAK+vD,EAAS/vD,EAAK,GAAKA,EAAK,IACjDiO,EAAK,CAACjO,EAAK,GAAIA,EAAK,GAAK+vD,EAAS/vD,EAAK,GAAKA,EAAK,IACjDz2C,EAAI4wE,EAASnsB,GACbxlD,EAAI2xE,EAASlsB,GAEbg9B,EAAMn/E,MAAMgkG,GAAc,EAAO,CAC7BvmG,EAAGA,EACHf,EAAGA,EACH6D,MAAO+tE,EAASpsB,GAAMzkD,EACtByC,OAAQouE,EAASnsB,GAAMzlD,IAE3ByiF,EAAMxG,QAMV50E,QAAS,WAELsmE,EAAM5uE,KAAK4jE,KAAK0zB,kBAAmBt3F,aAE5BA,KAAK4jE,KACZkP,EAAwB9yE,QAShCoS,EAAE5P,OAAOwyF,EAAKlyF,UAAmD,CAK7D+lG,gBAAiB,SAASh6D,EAAMC,GAC5B,IAAIi6D,EAAS/oG,KAAKk0F,gBAAgBplD,EAAI,KAAM,MAAM,GAC9C2J,EAAOz4C,KAAKk0F,gBAAgBrlD,EAAM,KAAM,MAAM,GAE9CsiD,EAAQnxF,KAAKmxF,MACb6X,EAAO,EACPC,EACCp6D,EAAO7uC,KAAK8R,KAAOg9B,EAAK9uC,KAAK8R,KAC7B+8B,EAAO7uC,KAAKyC,KAAOqsC,EAAK9uC,KAAKyC,IAmBlC,OAjBIg2C,GAAQswD,GAGJE,IACAxwD,EAAKqwD,KAAOrwD,EAAK5uB,aAAek/E,EAAOl/E,WACvCm/E,EAAO,GAIXvwD,EAAK3wC,KACDqpF,GAAS4X,EAAO,KAAOtwD,EAAK,GAAKswD,EAAO,GAAKC,EAAOD,EAAO,GAAK5X,GAAS4X,EAAO,KAAOtwD,EAAK,GAAwBswD,EAAO,GAA1BA,EAAO,GAAKC,EAC7G7X,GAAS4X,EAAO,KAAOtwD,EAAK,GAAKswD,EAAO,GAAKC,EAAOD,EAAO,GAAK5X,GAAS4X,EAAO,KAAOtwD,EAAK,GAAwBswD,EAAO,GAA1BA,EAAO,GAAKC,IAGjHvwD,EAAO,KAGJA,GAeXywD,YAAa,SAASviG,GAClB,OAAO3G,KAAK2lG,kBAAkBh/F,EAAS,cAe3CwiG,YAAa,SAASxiG,GAClB,OAAO3G,KAAK2lG,kBAAkBh/F,EAAS,cAW3Cg/F,kBAAmB,SAASh/F,EAAS+vF,GACjC,IAAIloB,EAAM,IAAIp8D,EAAEkzF,eAAetlG,KAAM2G,GAASmuF,SAC1CyB,EAAcv2F,KAAKu2F,YAWvB,OATI/nB,IAEIkoB,IACAH,EAAYG,GAAQH,EAAYG,IAAS,GACzCH,EAAYG,GAAM5uF,KAAKnB,IAE3B3G,KAAKs3F,kBAAkBxvF,KAAK0mE,IAGzBA,GAUX46B,qBAAsB,SAASt6F,GAK3B,IAJA,IAAIwoF,EAAoBt3F,KAAKs3F,kBACzB3wF,EAAU3G,KAAK2G,QACf4vF,EAAcv2F,KAAKu2F,YACnB52F,EAAI23F,EAAkBtrF,OACnBrM,KACC23F,EAAkB33F,GAAGmP,KAAOA,GAC5BwoF,EAAkB33F,GAAG2I,UAG7B/I,EAAK,CACDoH,EAAQ6+F,WAAa,GACrBjP,EAAYiP,WAAa,GACzB7+F,EAAQ8+F,WAAa,GACrBlP,EAAYkP,WAAa,KAC1B,SAASl4B,GAER,IADA5tE,EAAI4tE,EAAIvhE,OACDrM,KACC4tE,EAAI5tE,GAAGmP,KAAOA,GACd8/D,EAAMrB,EAAKA,EAAI5tE,QAiB/B0pG,eAAgB,SAASv6F,GACrB9O,KAAKopG,qBAAqBt6F,IAa9Bw6F,eAAgB,SAASx6F,GACrB9O,KAAKopG,qBAAqBt6F,MAnYtC,CAuYE/N,EAAYi0F,GACb,SAAS5iF,GAMN,IAAIg+D,EAAah+D,EAAEg+D,WACf7wE,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACXopB,EAASxZ,EAAEwZ,OACXk+C,EAAW13D,EAAE03D,SACb/1D,EAAM3B,EAAE2B,IACRxR,EAAQ6P,EAAE7P,MACVqJ,EAAOwG,EAAExG,KACTkjE,EAAQ18D,EAAE08D,MACVC,EAAc38D,EAAE28D,YAChBsE,EAAYjhE,EAAEihE,UAMlBjhE,EAAEm3F,QAAU,WACRvpG,KAAKs2E,KAAK/rE,MAAMvK,KAAMwK,YAG1B4H,EAAEm3F,QAAQzmG,UAAY,CAElBwzE,KAAM,SAASnvE,EAAOR,GAGlB3G,KAAKmH,MAAQA,EACbnH,KAAK2G,QAAUA,EAMf3G,KAAK+3F,WAAa,GAGlB/3F,KAAKmQ,IAAM,CACPnO,EAAG,EACHf,EAAG,GAIPjB,KAAKugF,UAAW,EAKhBvgF,KAAKub,MAAQ5U,EAAQ4U,QAAUpU,EAAMs0E,SACrCz7E,KAAKwpG,OAAS7iG,EAAQ6iG,QAAUxpG,KAAKub,OAUzCkuF,WAAY,SAASx7C,GACjB1uD,EAAKS,KAAKmH,MAAMO,QAAQ,SAASA,GAC7B,IAAIgiG,EAAKhiG,GAAUA,EAAOgiG,GACtBA,KACKA,EAAG3U,UAAY9mC,EAChBvmD,EAAOgiG,GAAKA,EAAGphG,UAEfohG,EAAG3U,UAAW,OAa9B4U,SAAU,WAEN,IAAIv+F,EAAWpL,KAAKmH,MAAMiE,SACtBzE,EAAU3G,KAAK2G,QA2CnB,OAzCK3G,KAAK0jF,QAEF1jF,KAAKub,MACLvb,KAAK0jF,MAAQt4E,EAAS3K,EAAE,YAExBT,KAAK0jF,MAAQt4E,EAASs4E,MACd,GACA,EACA,EACA/8E,EAAQ08E,OAAS,UACjB,KACA,KACA18E,EAAQg/E,QACR,KACA,WAEHtlF,KAAK,CACFuD,QAAS+C,EAAQ/C,QACjBnC,EAAGkF,EAAQ8B,eAInBzI,KAAK0jF,MACArjF,KAAK,CACF,KAAQsG,EAAQynF,gBAChB,eAAgBznF,EAAQ6oF,cAG3BltF,IAAIqE,EAAQnG,OACZ49E,OAAOz3E,EAAQy3E,SAMxBp+E,KAAK0jF,MACArjF,KAAK,CACFsJ,OAAQ,IAEXmC,OAEF9L,KAAK0jF,OAGhBzlE,OAAQ,SAAStX,GACb3G,KAAKsI,UAEL/F,GAAM,EAAMvC,KAAKmH,MAAMR,QAAQyoF,QAAQmH,YAAa5vF,GACpD3G,KAAKs2E,KAAKt2E,KAAKmH,MAAO5E,GAAM,EAAMvC,KAAK2G,QAASA,KAMpD2B,QAAS,WAEDtI,KAAK0jF,QACL1jF,KAAK0jF,MAAQ1jF,KAAK0jF,MAAMp7E,WAExBtI,KAAKub,OAASvb,KAAK0pG,KACnB1pG,KAAKypG,WAAWzpG,KAAKmH,OAAO,GAC5BnH,KAAK0pG,GAAK1pG,KAAK0pG,GAAGphG,WAEtB2B,aAAajK,KAAK4pG,WAClB3/F,aAAajK,KAAK6pG,iBAUtB5nF,KAAM,SAASjgB,EAAGf,EAAGwkF,EAASC,GAC1B,IAAI0J,EAAUpvF,KACVmQ,EAAMi/E,EAAQj/E,IACdslE,GAAwC,IAA9B2Z,EAAQzoF,QAAQY,YAAwB6nF,EAAQ7O,WAEzD1gF,KAAKuU,IAAIpS,EAAImO,EAAInO,GAAK,GAAKnC,KAAKuU,IAAInT,EAAIkP,EAAIlP,GAAK,GAClD6oG,EAAa1a,EAAQ2a,eAAiB3a,EAAQphB,IAAM,EAGxDxrE,EAAO2N,EAAK,CACRnO,EAAGyzE,GAAW,EAAItlE,EAAInO,EAAIA,GAAK,EAAIA,EACnCf,EAAGw0E,GAAWtlE,EAAIlP,EAAIA,GAAK,EAAIA,EAC/BwkF,QAASqkB,OAAan/B,EAAY8K,GAAW,EAAItlE,EAAIs1E,QAAUA,GAAW,EAAIA,EAC9EC,QAASokB,OAAan/B,EAAY8K,GAAWtlE,EAAIu1E,QAAUA,GAAW,EAAIA,IAI9E0J,EAAQua,WAAWtpG,KAAK8P,GAIpBslE,IAGAxrE,aAAajK,KAAK6pG,gBAGlB7pG,KAAK6pG,eAAiB3gG,YAAW,WAGzBkmF,GACAA,EAAQntE,KAAKjgB,EAAGf,EAAGwkF,EAASC,KAEjC,MAQXtI,KAAM,SAAS7jD,GACX,IAAI61D,EAAUpvF,KACdiK,aAAajK,KAAK4pG,WAClBrwE,EAAQ3tB,EAAK2tB,EAAOv5B,KAAK2G,QAAQqjG,UAAW,KACvChqG,KAAKugF,WACNvgF,KAAK4pG,UAAY76B,GAAY,WACzBqgB,EAAQua,WAAWpwE,EAAQ,UAAY,UACvC61D,EAAQ7O,UAAW,IACpBhnD,KAQX0wE,UAAW,SAAS/9D,EAAQg+D,GACxB,IAAIt+B,EAOAu+B,EACAlS,EAPA9wF,EAAQnH,KAAKmH,MACbs0E,EAAWt0E,EAAMs0E,SACjB2lB,EAAUj6F,EAAMi6F,QAChBC,EAAWl6F,EAAMk6F,SACjBmF,EAAQ,EACRC,EAAQ,EAwCZ,OAjCA76B,GAHA1/B,EAAS4iC,EAAM5iC,IAGF,GAAGk+D,WAGZpqG,KAAK+pG,eAAiBG,SACIv/B,IAAtBu/B,EAAWxD,SACXwD,EAAa/iG,EAAM+C,QAAQmgG,UAAUH,IAEzCt+B,EAAM,CACFs+B,EAAWxD,OAASv/F,EAAMk6F,SAC1B6I,EAAWvD,OAASvF,IAIvBx1B,IACDrsE,EAAK2sC,GAAQ,SAAS3rB,GAClB4pF,EAAQ5pF,EAAM7Y,OAAOyiG,MACrBlS,EAAQ13E,EAAM7Y,OAAOuwF,MACrBuO,GAASjmF,EAAMimF,QAAU/qB,GAAYwc,EAAQA,EAAMjtF,KAAOq2F,EAAW,GACrEoF,IAAUlmF,EAAM+pF,SAAW/pF,EAAM+pF,QAAU/pF,EAAMgqF,UAAY,EAAIhqF,EAAMkmF,SACjEhrB,GAAY0uB,EAAQA,EAAMrjG,IAAMs6F,EAAU,MAGpDoF,GAASt6D,EAAOlgC,OAChBy6F,GAASv6D,EAAOlgC,OAEhB4/D,EAAM,CACF6P,EAAWt0E,EAAM+5F,UAAYuF,EAAQD,EACrCxmG,KAAKwpG,SAAW/tB,GAAYvvC,EAAOlgC,OAAS,GAAKk+F,EACjDA,EAAWvD,OAASvF,EACpB3lB,EAAWt0E,EAAMg6F,WAAaqF,EAAQC,IAIvC1yF,EAAI63D,EAAK/rE,KAAKC,QAOzBuyF,YAAa,SAASmY,EAAUC,EAAWlqF,GAEvC,IAIImqF,EAJAvjG,EAAQnH,KAAKmH,MACb+xC,EAAWl5C,KAAKk5C,SAChB0yB,EAAM,GACNllE,EAAI6Z,EAAM7Z,GAAK,EAEf0qC,EAAQ,CAAC,IAAKjqC,EAAMH,YAAayjG,EAC7BlqF,EAAMkmF,MAAQt/F,EAAMi6F,QAASj6F,EAAMi6F,QACnCj6F,EAAMi6F,QAAUj6F,EAAMg6F,YAE1B34B,EAAS,CAAC,IAAKrhE,EAAMJ,WAAYyjG,EAC7BjqF,EAAMimF,MAAQr/F,EAAMk6F,SAAUl6F,EAAMk6F,SACpCl6F,EAAMk6F,SAAWl6F,EAAM+5F,WAG3ByJ,GAAiB3qG,KAAK+pG,eAAiBn+F,EAAK2U,EAAMqqF,SAAUzjG,EAAMs0E,YAAel7D,EAAMwb,UAKvF8uE,EAAiB,SAASC,EAAKC,EAAWC,EAAWzqF,EAAOzO,EAAKrP,GAC7D,IAAIwoG,EAAWD,EAAYzqF,EAAQ24B,EAC/BgyD,EAAY3qF,EAAQ24B,EAAW8xD,EAAYD,EAC3CI,EAAc5qF,EAAQ24B,EAAW8xD,EACjCI,EAAe7qF,EAAQ24B,EAE3B,GAAIyxD,GAAiBO,EACjBt/B,EAAIk/B,GAAOM,OACR,IAAKT,GAAiBM,EACzBr/B,EAAIk/B,GAAOK,OACR,GAAIF,EACPr/B,EAAIk/B,GAAOjrG,KAAKiS,IAAIrP,EAAMuoG,EAAWG,EAAczkG,EAAI,EAAIykG,EAAcA,EAAczkG,OACpF,KAAIwkG,EAQP,OAAO,EAPPt/B,EAAIk/B,GAAOjrG,KAAK4C,IACZqP,EACAs5F,EAAe1kG,EAAIskG,EAAYD,EAC/BK,EACAA,EAAe1kG,KAY3B2kG,EAAkB,SAASP,EAAKC,EAAWC,EAAWzqF,GAClD,IAAI+qF,EAeJ,OAZI/qF,EAAQ24B,GAAY34B,EAAQwqF,EAAY7xD,EACxCoyD,GAAS,EAGT1/B,EAAIk/B,GADGvqF,EAAQyqF,EAAY,EAChB,EAEJzqF,EAAQwqF,EAAYC,EAAY,EAC5BD,EAAYC,EAAY,EAGxBzqF,EAAQyqF,EAAY,EAE5BM,GAKXC,EAAO,SAAShpC,GACZ,IAAIipC,EAAOp6D,EACXA,EAAQo3B,EACRA,EAASgjC,EACTd,EAAUnoC,GAEdwJ,EAAM,YACqC,IAAnC8+B,EAAetgG,MAAM,EAAG6mC,IACiB,IAArCi6D,EAAgB9gG,MAAM,EAAGi+D,IAAsBkiC,IAC/Ca,GAAK,GACLx/B,KAEI2+B,EAIR9+B,EAAI5pE,EAAI4pE,EAAI3qE,EAAI,GAHhBsqG,GAAK,GACLx/B,MAYZ,OALI5kE,EAAMs0E,UAAYz7E,KAAKguE,IAAM,IAC7Bu9B,IAEJx/B,IAEOH,GAUX6/B,iBAAkB,SAASrc,GACvB,IACI3lF,EADAiiG,EAAQ1rG,KAAKksC,QAAU4iC,EAAM9uE,MAYjC,OALAyJ,GAHAA,EAAI,CAAC2lF,EAAQuc,6BAA6BD,EAAM,MAG1CvzF,OAAOi3E,EAAQwc,cAAcF,KAGjC5jG,KAAKsnF,EAAQuc,6BAA6BD,EAAM,IAAI,IAE/CjiG,GAOXoiG,QAAS,SAASC,EAAe5B,GAC7B,IACIxmB,EAEA1hF,EACAf,EAEA8qG,EAEAzrG,EAIA0rG,EAVArlG,EAFU3G,KAEQ2G,QAGlB4Z,EAAQurF,EAERG,EAAa,GAEbC,EAAc,GACdhW,EAAYvvF,EAAQuvF,WAVVl2F,KAU+ByrG,iBACzCjC,EAXUxpG,KAWOwpG,OAGrBv/F,aAAajK,KAAK4pG,WAdJ5pG,KAiBN+pG,cAAgBj7B,EAAMvuD,GAAO,GAAG7Y,OAAOykG,eAAepC,cAE9D/nG,GADA+pG,EAlBc/rG,KAkBGiqG,UAAU1pF,EAAO2pF,IACvB,GACXjpG,EAAI8qG,EAAO,IAGPvC,GAAYjpF,EAAM7Y,QAAU6Y,EAAM7Y,OAAO40F,gBAgBzC2P,EAAa1rF,EAAM6rF,kBAfnB7sG,EAAKghB,GAAO,SAASsuD,GACjBA,EAAK9kE,SAAS,SAEdmiG,EAAYpkG,KAAK+mE,EAAKu9B,sBAG1BH,EAAa,CACTjqG,EAAGue,EAAM,GAAG8rF,SACZprG,EAAGsf,EAAM,GAAGtf,IAELirC,OAASggE,EACpB3rF,EAAQA,EAAM,IAMlBvgB,KAAKguE,IAAMk+B,EAAYlgG,OACvB1L,EAAO41F,EAAUjnF,KAAKg9F,EA1CRjsG,MA6CdgsG,EAAgBzrF,EAAM7Y,OACtB1H,KAAKk5C,SAAWttC,EAAKogG,EAAcG,eAAejzD,SAAU,KAG/C,IAAT54C,EACAN,KAAKo9E,QAGLsG,EArDU1jF,KAqDM2pG,WArDN3pG,KAwDEugF,UACRmD,EAAMrjF,KAAK,CACP+uE,QAAS,IACV8N,OA3DGl9E,KA+DEub,MACRvb,KAAKssG,YAAYhsG,EAAMwrG,IAKlBnlG,EAAQnG,MAAMsE,OAEf4+E,EAAMphF,IAAI,CACNwC,MAAO9E,KAAKmH,MAAMolG,WAAWznG,QAMrC4+E,EAAMrjF,KAAK,CACPC,KAAMA,GAAQA,EAAKy3B,KAAOz3B,EAAKy3B,KAAK,IAAMz3B,IAI9CojF,EAAMrJ,YAAY,2BACbH,SAAS,oBAAsBtuE,EAAK2U,EAAMisF,WAAYR,EAAcQ,aAGzE9oB,EAAMrjF,KAAK,CACPuE,OAAQ+B,EAAQwnF,aAAe5tE,EAAM/hB,OAASwtG,EAAcxtG,OAAS,YAxFnEwB,KA4FEysG,eAAe,CACnBjG,MAAOxkG,EACPykG,MAAOxlG,EACP86B,SAAUxb,EAAMwb,SAChB6uE,QAASrqF,EAAMqqF,QACflkG,EAAGqlG,EAAO,IAAM,KAIxB/rG,KAAKugF,UAAW,IASxB+rB,YAAa,SAAS9d,EAAQtiD,GAC1B,IAMIwgE,EANAtd,EAAUpvF,KACV2sG,EAAQ,GACRxlG,EAAQnH,KAAKmH,MACbo9E,EAAMp9E,EAAMiE,SACZwhG,GAAe,EACfjmG,EAAU3G,KAAK2G,QAEfkmG,EAAe7sG,KAAK2pG,WAGxBpqG,EAAKivF,EAAOl/E,MAAM,EAAG48B,EAAOlgC,OAAS,IAAI,SAASyiE,EAAK9uE,GACnD,IAUIyK,EACApI,EACAw6E,EACAguB,EAbAjqF,EAAQ2rB,EAAOvsC,EAAI,IAEnB,CACImtG,UAAU,EACVtG,MAAOt6D,EAAO,GAAGs6D,OAErBuG,EAAQxsF,EAAM7Y,QAAU0nF,EACxBsa,EAAKqD,EAAMrD,GACXhiG,EAAS6Y,EAAM7Y,QAAU,GACzBslG,EAAa,oBAAsBphG,EAAK2U,EAAMisF,WAAY9kG,EAAO8kG,WAAY,QAO5E9C,IACDqD,EAAMrD,GAAKA,EAAKnlB,EAAIb,MAAM,KAAM,KAAM,KAAM,WACvCxJ,SAAS,0BAA4B8yB,GACrC3sG,KAAK,CACF,QAAWsG,EAAQ/C,QACnB,EAAK+C,EAAQ8B,aAEb,KAAQ9B,EAAQynF,gBAChB,OAAU7tE,EAAM/hB,OAASkJ,EAAOlJ,OAAS,UACzC,eAAgBmI,EAAQ6oF,cAG3B1jF,IAAI+gG,IAGbnD,EAAG3U,UAAW,EACd2U,EAAGrpG,KAAK,CACJC,KAAMmuE,IAGVi7B,EAAGpnG,IAAIqE,EAAQnG,OAKfgqG,GADAhuB,EAAOktB,EAAGrtB,WACMv3E,MAAQ4kG,EAAGjxB,cACvBl4D,EAAMusF,UACNJ,EAAelwB,EAAK/3E,OACpBzC,EAAInC,KAAK4C,IACL,EACA5C,KAAKiS,IACDyO,EAAMimF,MAAQr/F,EAAMk6F,SAAWmJ,EAAW,EAC1CrjG,EAAMJ,WAAayjG,KAI3BxoG,EAAIue,EAAMimF,MAAQr/F,EAAMk6F,SAAWz1F,EAAKjF,EAAQuyC,SAAU,IACtDsxD,EAKJxoG,EAAI,IACJ4qG,GAAe,GAInBxiG,GAAUmW,EAAM7Y,QAAU6Y,EAAM7Y,OAAOyiG,OAAS5pF,EAAM7Y,OAAOyiG,MAAMh+B,MAAQ5rD,EAAMkmF,OAAS,GAC1Fr8F,GAAUjD,EAAMi6F,QAChBuL,EAAM7kG,KAAK,CACPsC,OAAQmW,EAAMusF,SAAW3lG,EAAMg6F,WAAauL,EAAetiG,EAC3D6iG,KAAM1sF,EAAMusF,SAAW,EAAI,EAC3B/2F,KAAMg3F,EAAMrD,GAAGrtB,UAAU53E,OAAS,EAClC8b,MAAOA,EACPve,EAAGA,EACH0nG,GAAIA,OAKZ1pG,KAAKypG,aAGLr3F,EAAE86F,WAAWP,EAAOxlG,EAAMg6F,WAAauL,GACvCntG,EAAKotG,GAAO,SAASz4B,GACjB,IAAI3zD,EAAQ2zD,EAAI3zD,MACZ7Y,EAAS6Y,EAAM7Y,OAGnBwsE,EAAIw1B,GAAGrpG,KAAK,CACR88E,gBAAwBxS,IAAZuJ,EAAI/H,IAAoB,SAAW,UAC/CnqE,EAAI4qG,GAAgBrsF,EAAMusF,SACtB54B,EAAIlyE,EACJue,EAAMimF,MAAQr/F,EAAMk6F,SAAWz1F,EAAKjF,EAAQuyC,SAAU,IAC1Dj4C,EAAGizE,EAAI/H,IAAMhlE,EAAMi6F,QACnB3b,QAASllE,EAAMusF,SACXvsF,EAAMimF,MAAQr/F,EAAMk6F,SAAW9gF,EAAMimF,MAAQ9+F,EAAOuwF,MAAM9rB,IAC9DuZ,QAASnlE,EAAMusF,SACX54B,EAAI/H,IAAMhlE,EAAMi6F,QAAU,GAAK7gF,EAAMkmF,MAAQ/+F,EAAOyiG,MAAMh+B,UAQ1EsgC,eAAgB,SAASlsF,GACrB,IAAIpZ,EAAQnH,KAAKmH,MACbu8E,EAAQ1jF,KAAK2pG,WACbx9B,GAAOnsE,KAAK2G,QAAQwmG,YAAcntG,KAAKqyF,aAAapjF,KAChDjP,KACA0jF,EAAM5+E,MACN4+E,EAAMj/E,OACN8b,GAIRvgB,KAAKiiB,KACDpiB,KAAKC,MAAMqsE,EAAInqE,GACfnC,KAAKC,MAAMqsE,EAAIlrE,GAAK,GACpBsf,EAAMimF,MAAQr/F,EAAMk6F,SACpB9gF,EAAMkmF,MAAQt/F,EAAMi6F,UAa5BgM,cAAe,SAASr4F,EAAOsqB,EAAMi2D,EAAajG,GAC9C,IACIzjE,EACAtqB,EAFA+rG,EAAUj9B,EAAW,oBAAqB/wC,GAG1CiuE,EAAQ,qBACRC,EAAS,CACLj6B,YAAa,GACb9K,OAAQ,GACRE,OAAQ,EACRE,KAAM,EACNllC,IAAK,GAET8pE,EAAQ,cACZ,IAAKlsG,KAAK+xE,EAAW,CAGjB,GAAIt+D,IAAUs+D,EAAUxvC,OAASusC,EAAW,KAAM/wC,KAAUi2D,GACxD+X,EAAQl8B,OAAO,KAAOm8B,EAAMn8B,OAAO,GAAI,CACvC7vE,EAAI,OACJ,MAIJ,GAAI+xE,EAAU/xE,GAAKyT,EAAO,CACtBzT,EAAIksG,EACJ,MAKJ,GAAID,EAAOjsG,IAAM+rG,EAAQl8B,OAAOo8B,EAAOjsG,MAAQgsG,EAAMn8B,OAAOo8B,EAAOjsG,IAC/D,MAIM,SAANA,IACAksG,EAAQlsG,GAQhB,OAJIA,IACAsqB,EAASyjE,EAAqB/tF,IAG3BsqB,GAMX6hF,eAAgB,SAASltF,EAAO5Z,EAASsxF,GACrC,IACI5I,EAAuB1oF,EAAQ0oF,qBAC/BgN,EAAoBpE,GAASA,EAAMoE,kBAavC,OAXIA,EACcr8F,KAAKotG,cACf/Q,EACA97E,EAAMve,EACNi2F,EAAMtxF,QAAQ2uF,YACdjG,GAGUA,EAAqB3rD,MAGjB2rD,EAAqB5rD,MAO/CkoE,6BAA8B,SAAS+B,EAAaC,GAChD,IAAIC,EAAaD,EAAW,SAAW,SACnCjmG,EAASgmG,EAAYhmG,OACrBykG,EAAiBzkG,EAAOykG,eACxB0B,EAAc1B,EAAe0B,YAC7B5V,EAAQvwF,EAAOuwF,MACf6V,EAAa7V,GAAgC,aAAvBA,EAAMtxF,QAAQ3B,MAAuB8kE,EAAS4jC,EAAY15F,KAChF+5F,EAAe5B,EAAeyB,EAAa,UAY/C,OATIE,IAAeD,IACfA,EAAc7tG,KAAKytG,eAAeC,EAAavB,EAAgBlU,IAI/D6V,GAAcD,IACdE,EAAeA,EAAaxlG,QAAQ,cAAe,cAAgBslG,EAAc,MAG9EjiF,EAAOmiF,EAAc,CACxBxtF,MAAOmtF,EACPhmG,OAAQA,KAQhBkkG,cAAe,SAASF,GACpB,OAAO33F,EAAI23F,GAAO,SAAS78B,GACvB,IAAIs9B,EAAiBt9B,EAAKnnE,OAAOykG,eACjC,OAAQA,EAAe6B,gBAAkBn/B,EAAKtuD,MAAM0tF,kBAC/Ch/F,KAAK4/D,EAAKtuD,MAAO4rF,EAAezc,kBAvvBrD,CA6vBE3uF,GACD,SAASqR,GAMN,IAAIlQ,EAAWkQ,EAAElQ,SACb7B,EAAO+R,EAAE/R,KACTiN,EAAS8E,EAAE9E,OACX9O,EAAQ4T,EAAE5T,MACV8D,EAAM8P,EAAE9P,IACRi8D,EAAUnsD,EAAEmsD,QACZyL,EAAM53D,EAAE43D,IACRzqE,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACX0yE,EAAY9iE,EAAE8iE,UACd31C,EAASntB,EAAEmtB,OACX3zB,EAAOwG,EAAExG,KACTzJ,EAAciQ,EAAEjQ,YAChB2sE,EAAQ18D,EAAE08D,MACVy6B,EAAUn3F,EAAEm3F,QACZ1/B,EAAMz3D,EAAEy3D,IAWZz3D,EAAE87F,QAAU,SAAS/mG,EAAOR,GACxB3G,KAAKs2E,KAAKnvE,EAAOR,IAGrByL,EAAE87F,QAAQprG,UAAY,CAIlBwzE,KAAM,SAASnvE,EAAOR,GAGlB3G,KAAK2G,QAAUA,EACf3G,KAAKmH,MAAQA,EAGbnH,KAAKmuG,cAAgBxnG,EAAQQ,MAAMotE,UAAY5tE,EAAQQ,MAAMotE,OAAO/nE,MAEpExM,KAAKouG,UAAY,GACjBpuG,KAAKquG,eAAiB,GAElB9E,GAAW5iG,EAAQyoF,QAAQ3nF,UAC3BN,EAAMioF,QAAU,IAAIma,EAAQpiG,EAAOR,EAAQyoF,SAC3CpvF,KAAKsuG,gBAAkB1iG,EAAKjF,EAAQyoF,QAAQkf,iBAAiB,IAGjEtuG,KAAKuuG,gBAOTC,WAAY,SAASnlG,GACjB,IAIIolG,EACAC,EALAvnG,EAAQnH,KAAKmH,MACbR,EAAUQ,EAAMR,QAAQQ,MACxBwnG,EAAWhoG,EAAQgoG,UAAY,GAC/BlzB,EAAWt0E,EAAMs0E,SAKjB,QAAQr0E,KAAKiC,EAAErE,QACf2pG,EAAW/iG,EAAKjF,EAAQioG,UAAWD,IAGvC3uG,KAAKyuG,MAAQA,EAAQ,IAAIrnG,KAAKunG,GAC9B3uG,KAAK0uG,MAAQA,EAAQ,IAAItnG,KAAKunG,GAC9B3uG,KAAK6uG,QAAWJ,IAAUhzB,GAAcizB,GAASjzB,EACjDz7E,KAAK8uG,SAAYJ,IAAUjzB,GAAcgzB,GAAShzB,EAClDz7E,KAAK+uG,QAAUN,GAASC,GAwB5BrE,UAAW,SAAShhG,EAAG2lG,GACnB,IAAItI,EACAC,EACAsI,EA0BJ,OAvBA5lG,EAAIA,GAAKwgE,EAAI7xD,OACN5N,SACHf,EAAEe,OAASf,EAAEqrE,YAIjBu6B,EAAO5lG,EAAEqY,QAAWrY,EAAEqY,QAAQ1V,OAAS3C,EAAEqY,QAAQmtD,KAAK,GAAKxlE,EAAE+W,eAAe,GAAM/W,EAG7E2lG,IACDhvG,KAAKgvG,cAAgBA,EAAgBzvE,EAAOv/B,KAAKmH,MAAMiB,iBAIxCuiE,IAAfskC,EAAKpuF,OACL6lF,EAAS7mG,KAAK4C,IAAI4G,EAAErH,EAAGqH,EAAE0X,QAAUiuF,EAAchkG,MAEjD27F,EAASt9F,EAAEpI,IAEXylG,EAASuI,EAAKpuF,MAAQmuF,EAAchkG,KACpC27F,EAASsI,EAAKnuF,MAAQkuF,EAAcloG,KAGjCtE,EAAO6G,EAAG,CACbq9F,OAAQ7mG,KAAKC,MAAM4mG,GACnBC,OAAQ9mG,KAAKC,MAAM6mG,MAS3BuI,eAAgB,SAAS7lG,GACrB,IAAIy8B,EAAc,CACdmyD,MAAO,GACPkS,MAAO,IASX,OANA5qG,EAAKS,KAAKmH,MAAM6wF,MAAM,SAASp0B,GAC3B99B,EAAY89B,EAAK2wB,QAAU,QAAU,SAASzsF,KAAK,CAC/C87D,KAAMA,EACNxkE,MAAOwkE,EAAK02B,QAAQjxF,EAAEu6D,EAAKutB,MAAQ,SAAW,gBAG/CrrD,GASXqpE,YAAa,SAASznG,EAAQ8hG,EAAQngG,GAClC,IACIizF,EACA8S,EACAC,EACA1vG,EAJA2vG,EAAW,GAgDf,GAzCA/vG,EAAKmI,GAAQ,SAAS+B,GAElB6yF,EAAkB7yF,EAAE6yF,iBAAmBkN,EACvC4F,GAAe5F,GAAU//F,EAAE2lG,YACvB3lG,EAAE7B,UAAYwnG,GAAexjG,EAAKnC,EAAE9C,QAAQ4oG,qBAAqB,KAEjEF,EAAW5lG,EAAE+lG,YACTnmG,GAAIizF,GAAmB7yF,EAAE9C,QAAQ8oG,mBAAmBv3F,QAAQ,KAAO,KAEvDm3F,EAAS3nG,QACrB4nG,EAASxnG,KAAKunG,MAM1BC,EAASnwG,MAAK,SAASsU,EAAIqsD,GACvB,IAAI4vC,EAAYj8F,EAAGk8F,MAAQ7vC,EAAG6vC,MAC1BC,EAAWn8F,EAAGo8F,KAAO/vC,EAAG+vC,KACxBC,GACChwC,EAAGp4D,OAAO0S,OAAS0lD,EAAGp4D,OAAO0S,MAAMzQ,SACnC8J,EAAG/L,OAAO0S,OAAS3G,EAAG/L,OAAO0S,MAAMzQ,QAgBxC,OAZkB,IAAd+lG,GAAmBlG,EACVkG,EAEW,IAAbE,EACEA,EAEU,IAAZE,EACEA,EAGAr8F,EAAG/L,OAAO7G,MAAQi/D,EAAGp4D,OAAO7G,OAAS,EAAI,KAMtD2oG,GAAU8F,EAAS,KAAOA,EAAS,GAAG5nG,OAAO40F,gBAE7C,IADA38F,EAAI2vG,EAAStjG,OACNrM,MACC2vG,EAAS3vG,GAAGqC,IAAMstG,EAAS,GAAGttG,GAAKstG,EAAS3vG,GAAG+H,OAAO40F,kBACtDgT,EAASpsD,OAAOvjD,EAAG,GAI/B,OAAO2vG,GAEXS,kBAAmB,SAAS1mG,GAIxB,IAHA,IACIkX,EADAnW,EAASf,EAAEe,OAGRA,IAAWmW,GACdA,EAAQnW,EAAOmW,MACfnW,EAASA,EAAOxB,WAEpB,OAAO2X,GAGXyvF,6BAA8B,SAASzvF,EAAOk7D,GAC1C,IAAI/zE,EAAS6Y,EAAM7Y,OACfuwF,EAAQvwF,EAAOuwF,MACfkS,EAAQziG,EAAOyiG,MAEnB,GAAIlS,GAASkS,EACT,OAAO1uB,EAAW,CACdirB,OAAQzO,EAAMjqB,IAAMiqB,EAAM9rB,IAAM5rD,EAAMQ,QACtC4lF,OAAQwD,EAAMn8B,IAAMm8B,EAAMh+B,IAAM5rD,EAAMkmF,OACtC,CACAC,OAAQnmF,EAAMQ,QAAUk3E,EAAM9rB,IAC9Bw6B,OAAQpmF,EAAMkmF,MAAQ0D,EAAMh+B,MA4BxC8jC,aAAc,SACVC,EACAC,EACAzoG,EACA0oG,EACA5G,EACA1jE,GAEA,IAAIuqE,EAQAC,EAPAC,EAAcJ,EACdK,EAAehH,EAAS9hG,EAAS,CAAC6oG,GAClCE,KAAiBL,IAAiBF,GAClCQ,EAAYH,IAAgBA,EAAYI,eACxCC,EAAe,SAASrwF,EAAO5gB,GAC3B,OAAa,IAANA,GAwCf,OAjCI8wG,EACAG,EAAe,SAASlvG,GACpB,OAAOA,IAAMwuG,GAEVQ,EACPE,EAAe,SAASlvG,GACpB,OAAOA,EAAEgG,SAAW6oG,GAIxBC,EAAep+F,EAAEkgE,KAAK5qE,GAAQ,SAAS+B,GACnC,OAAOA,EAAEknG,kBAGjBL,EAAeG,IAAgBjH,EAE3B,CAAC0G,GACDlwG,KAAKmvG,YAAYqB,EAAchH,EAAQ1jE,GAC3CuqE,EAAaj+F,EAAE6yC,KAAKqrD,EAAaM,GACjCL,EAAcF,GAAcA,EAAW3oG,OAKlC+oG,GAAgBC,IAAalH,IAC9B8G,EAActwG,KAAKmvG,YAAYznG,EAAQ8hG,EAAQ1jE,IAInDwqE,EAAYnxG,MAAK,SAASsU,EAAIqsD,GAC1B,OAAOrsD,EAAG/L,OAAO7G,MAAQi/D,EAAGp4D,OAAO7G,SAGhC,CACHwvG,WAAYA,EACZE,YAAaA,EACbD,YAAaA,IAOrBO,gBAAiB,SAASxnG,EAAG3H,GACzB,IAoBIovG,EACA/G,EACAgC,EACA7/D,EAtBA/kC,EADUnH,KACMmH,MAChBO,EAASP,EAAMO,OACf0nF,EAAUjoF,EAAMioF,QAChBoa,IAASpa,GAAUA,EAAQoa,OAC3B6G,EAAa3uG,GAAKyF,EAAMkpG,WACxBE,EAAcF,GAAcA,EAAW3oG,QAAUP,EAAMopG,YAEvDH,IAAkB1uG,GACb6uG,GAAeA,EAAYnB,aATtBpvG,KAUEowG,cAEZW,EAAY/wG,KAAKiwG,aACbI,EACAE,EACA7oG,EACA0oG,EACA5G,EACAngG,GAORgnG,EAAaU,EAAUV,WAEvBtG,GADAwG,EAAcQ,EAAUR,cACOA,EAAYpE,eAAepC,cAC1D+G,EACItH,GACA6G,IACCA,EAAW3oG,OAAO40F,gBAEvBpwD,EAAU4kE,EACNC,EAAUT,YACTD,EAAa,CAACA,GAAc,GAK7BA,IAECA,IAAelpG,EAAMkpG,YAAejhB,GAAWA,EAAQ7O,WAExDhhF,EAAK4H,EAAMmpG,aAAe,IAAI,SAAS5uG,IACL,IAA1B0Q,EAAE2hE,QAAQryE,EAAGwqC,IACbxqC,EAAEqI,cAIVxK,EAAK2sC,GAAU,IAAI,SAASxqC,GACxBA,EAAEqI,SAAS,YAGX5C,EAAMopG,cAAgBA,GACtBA,EAAYS,cAKZ7pG,EAAMkpG,YACNlpG,EAAMkpG,WAAWY,eAAe,YAEpCZ,EAAWY,eAAe,aAC1B9pG,EAAMmpG,YAAcpkE,EACpB/kC,EAAMkpG,WAAaA,EAEfjhB,GACAA,EAAQyc,QAAQiF,EAAmB5kE,EAASmkE,EAAYhnG,IAGrD0gG,GAAiB3a,IAAYA,EAAQ7O,WAC5CwrB,EAAS3c,EAAQ6a,UAAU,CAAC,IAAK5gG,GACjC+lF,EAAQqd,eAAe,CACnBjG,MAAOuF,EAAO,GACdtF,MAAOsF,EAAO,MA3ER/rG,KAgFDkxG,iBAhFClxG,KAiFFkxG,eAAiBhvG,EAAS8nE,EAAK,aAAa,SAAS3gE,GACzD,IAAIlC,EAAQmG,EAAO8E,EAAE++F,iBACjBhqG,GACAA,EAAM+C,QAAQknG,oBAAoB/nG,OAM9C9J,EAAK4H,EAAM6wF,MAAM,SAA2Bp0B,GAC7Bh4D,EAAKg4D,EAAKk0B,UAAUvI,MAAM,GAM1Bn9E,EAAE6yC,KAAK/Y,GAAQ,SAASxqC,GAC3B,OAAOA,EAAEgG,OAAOk8D,EAAK8yB,QAAU9yB,KAEnCA,EAAKyiC,cAAch9F,EAAGgnG,GAGtBzsC,EAAKijC,gBAVLjjC,EAAKyiC,cAAch9F,OAuB/B07B,MAAO,SAASssE,EAAW93E,GACvB,IACIpyB,EADUnH,KACMmH,MAChBopG,EAAcppG,EAAMopG,YACpBF,EAAalpG,EAAMkpG,WACnBC,EAAcnpG,EAAMmpG,YACpBlhB,EAAUjoF,EAAMioF,QAChBkiB,EAAgBliB,GAAWA,EAAQoa,OAAS8G,EAAcD,EAG1DgB,GAAaC,GACb/xG,EAAKuvE,EAAMwiC,IAAgB,SAAS/wF,GAC5BA,EAAM7Y,OAAO6pG,kBAA+B5mC,IAAhBpqD,EAAMimF,QAClC6K,GAAY,MAMpBA,EACIjiB,GAAWkiB,IACXliB,EAAQyc,QAAQyF,GACZjB,IACAA,EAAWtmG,SAASsmG,EAAWxsB,OAAO,GACtCtkF,EAAK4H,EAAM6wF,MAAM,SAASp0B,GAClBA,EAAKk0B,WACLl0B,EAAKyiC,cAAc,KAAMgK,SASrCA,GACAA,EAAWmB,aAGXlB,GACA/wG,EAAK+wG,GAAa,SAAS/vF,GACvBA,EAAMxW,cAIVwmG,GACAA,EAAYiB,aAGZpiB,GACAA,EAAQhS,KAAK7jD,GAjDPv5B,KAoDEkxG,iBApDFlxG,KAqDEkxG,eArDFlxG,KAqD2BkxG,kBAIrC3xG,EAAK4H,EAAM6wF,MAAM,SAASp0B,GACtBA,EAAKijC,mBA1DC7mG,KA6DFyxG,OAAStqG,EAAMmpG,YAAcnpG,EAAMkpG,WAAa,OAOhEqB,YAAa,SAASpiC,EAASzjC,GAE3B,IACI8lE,EADAxqG,EAAQnH,KAAKmH,MAIjB5H,EAAK4H,EAAMO,QAAQ,SAASA,GACxBiqG,EAAgBriC,GAAW5nE,EAAOkqG,aAC9BlqG,EAAOuwF,OAASvwF,EAAOuwF,MAAMpB,aAAenvF,EAAO0S,QACnD1S,EAAO0S,MAAM/Z,KAAKsxG,GACdjqG,EAAOmqG,cACPnqG,EAAOmqG,YAAYxxG,KAAKsxG,GACxBjqG,EAAOmqG,YAAYhmE,KAAKA,EAAO1kC,EAAMozE,SAAW,OAEhD7yE,EAAOoqG,iBACPpqG,EAAOoqG,gBAAgBzxG,KAAKsxG,OAMxCxqG,EAAMozE,SAASl6E,KAAKwrC,GAAQ1kC,EAAM4qG,UAMtCC,UAAW,SAAS3oG,GAChB,IAAIlC,EAAQnH,KAAKmH,MAGjBA,EAAM8qG,YAAc5oG,EAAErE,KACtBmC,EAAM+qG,aAAc,EACpB/qG,EAAMgrG,WAAanyG,KAAKmyG,WAAa9oG,EAAEq9F,OACvCv/F,EAAMirG,WAAapyG,KAAKoyG,WAAa/oG,EAAEs9F,QAM3ChlF,KAAM,SAAStY,GAEX,IAUIgpG,EACAt8F,EAXA5O,EAAQnH,KAAKmH,MACbuB,EAAevB,EAAMR,QAAQQ,MAC7Bu/F,EAASr9F,EAAEq9F,OACXC,EAASt9F,EAAEs9F,OACXkI,EAAU7uG,KAAK6uG,QACfC,EAAW9uG,KAAK8uG,SAChBzN,EAAWl6F,EAAMk6F,SACjBD,EAAUj6F,EAAMi6F,QAChBF,EAAY/5F,EAAM+5F,UAClBC,EAAah6F,EAAMg6F,WAGnBmR,EAAkBtyG,KAAKsyG,gBACvBH,EAAanyG,KAAKmyG,WAClBC,EAAapyG,KAAKoyG,WAClBG,EAAS7pG,EAAa6pG,QAAUlpG,EAAEX,EAAa6pG,OAAS,OAIxDD,GAAmBA,EAAgB7wF,QAMnCilF,EAASrF,EACTqF,EAASrF,EACFqF,EAASrF,EAAWH,IAC3BwF,EAASrF,EAAWH,GAGpByF,EAASvF,EACTuF,EAASvF,EACFuF,EAASvF,EAAUD,IAC1BwF,EAASvF,EAAUD,GAIvBnhG,KAAKwyG,WAAa3yG,KAAK6S,KACnB7S,KAAKqnB,IAAIirF,EAAazL,EAAQ,GAC9B7mG,KAAKqnB,IAAIkrF,EAAazL,EAAQ,IAG9B3mG,KAAKwyG,WAAa,KAClBH,EAAgBlrG,EAAMsrG,aAAaN,EAAa9Q,EAAU+Q,EAAahR,GAGnEj6F,EAAMurG,qBAAuB1yG,KAAKyuG,OAASzuG,KAAK0uG,QAAU2D,IAAkBE,IACvED,IACDtyG,KAAKsyG,gBAAkBA,EAAkBnrG,EAAMiE,SAAS+V,KAChDkgF,EACAD,EACAyN,EAAU,EAAI3N,EACd4N,EAAW,EAAI3N,EACf,GAEH9gG,KAAK,CAEFsE,KAAM+D,EAAaiqG,qBAAuBn0G,EAAM,WAAWs4E,WAAW,KAAM/nE,MAE5E,MAAS,8BACT,OAAU,IAEbjD,QAKTwmG,GAAmBzD,IACnB94F,EAAO2wF,EAASyL,EAChBG,EAAgBjyG,KAAK,CACjByE,MAAOjF,KAAKuU,IAAI2B,GAChB/T,GAAI+T,EAAO,EAAI,EAAIA,GAAQo8F,KAI/BG,GAAmBxD,IACnB/4F,EAAO4wF,EAASyL,EAChBE,EAAgBjyG,KAAK,CACjBoE,OAAQ5E,KAAKuU,IAAI2B,GACjB9U,GAAI8U,EAAO,EAAI,EAAIA,GAAQq8F,KAK/BC,IAAkBC,GAAmB5pG,EAAakqG,SAClDzrG,EAAM0rG,IAAIxpG,EAAGX,EAAakqG,YAQtCE,KAAM,SAASzpG,GACX,IAAIa,EAAUlK,KACVmH,EAAQnH,KAAKmH,MACb4rG,EAAa/yG,KAAK+yG,WAEtB,GAAI/yG,KAAKsyG,gBAAiB,CACtB,IAUIU,EAVAC,EAAgB,CACZC,cAAe7pG,EACf4uF,MAAO,GACPkS,MAAO,IAEXgJ,EAAenzG,KAAKsyG,gBACpBc,EAAgBD,EAAa9yG,KAAO8yG,EAAa9yG,KAAK,KAAO8yG,EAAanxG,EAC1EqxG,EAAeF,EAAa9yG,KAAO8yG,EAAa9yG,KAAK,KAAO8yG,EAAalyG,EACzEqyG,EAAiBH,EAAa9yG,KAAO8yG,EAAa9yG,KAAK,SAAW8yG,EAAaruG,MAC/EyuG,EAAkBJ,EAAa9yG,KAAO8yG,EAAa9yG,KAAK,UAAY8yG,EAAa1uG,QAIjFzE,KAAKwyG,YAAcO,KAGnBxzG,EAAK4H,EAAM6wF,MAAM,SAASp0B,GACtB,GAAIA,EAAKizB,aAAet4B,EAAQqF,EAAK9xD,OAASihG,GAAc7oG,EAAQ,CAC5D+tF,MAAO,QACPkS,MAAO,SACTvmC,EAAK8yB,QAAS,CAChB,IAAIvF,EAAQvtB,EAAKutB,MACbyF,EAA6B,aAAXvtF,EAAErE,KAAsB4+D,EAAKgzB,gBAAkB,EACjE4c,EAAe5vC,EAAK02B,SAASnJ,EAAQiiB,EAAgBC,GAAgBzc,GACrE6c,EAAe7vC,EAAK02B,SAASnJ,EAAQiiB,EAAgBE,EAAiBD,EAAeE,GAAmB3c,GAE5Gqc,EAAcrvC,EAAK8yB,MAAM5uF,KAAK,CAC1B87D,KAAMA,EACN9xD,IAAKjS,KAAKiS,IAAI0hG,EAAcC,GAC5BhxG,IAAK5C,KAAK4C,IAAI+wG,EAAcC,KAEhCT,GAAU,MAGdA,GACA99B,EAAU/tE,EAAO,YAAa8rG,GAAe,SAAS30F,GAClDnX,EAAMqe,KAAKhjB,EAAO8b,EAAMy0F,EAAa,CACjCxrG,WAAW,GACX,WAKhBvH,KAAKsyG,gBAAkBtyG,KAAKsyG,gBAAgBhqG,UAGxCyqG,GACA/yG,KAAK0xG,cAKTvqG,IACA7E,EAAI6E,EAAMiB,UAAW,CACjBqC,OAAQtD,EAAMusG,UAElBvsG,EAAM+qG,YAAclyG,KAAKwyG,WAAa,GACtCrrG,EAAM8qG,YAAcjyG,KAAKwyG,WAAaxyG,KAAK+yG,YAAa,EACxD/yG,KAAKouG,UAAY,KAIzBuF,qBAAsB,SAAStqG,GAE3BA,EAAIrJ,KAAKqqG,UAAUhhG,GAEnBrJ,KAAKwuG,WAAWnlG,GAGZA,EAAEgP,gBACFhP,EAAEgP,iBAGNrY,KAAKgyG,UAAU3oG,IAKnBuqG,kBAAmB,SAASvqG,GACpBiE,EAAO8E,EAAE++F,kBACT7jG,EAAO8E,EAAE++F,iBAAiBjnG,QAAQ4oG,KAAKzpG,IAQ/C+nG,oBAAqB,SAAS/nG,GAC1B,IAAIlC,EAAQnH,KAAKmH,MACb6nG,EAAgBhvG,KAAKgvG,cAEzB3lG,EAAIrJ,KAAKqqG,UAAUhhG,EAAG2lG,IAGlBA,GAAkBhvG,KAAKmK,QAAQd,EAAEe,OAAQ,uBACxCjD,EAAMsrG,aAAappG,EAAEq9F,OAASv/F,EAAMk6F,SAAUh4F,EAAEs9F,OAASx/F,EAAMi6F,UAChEphG,KAAK+kC,SAOb8uE,sBAAuB,SAASxqG,GAC5B,IAAIlC,EAAQmG,EAAO8E,EAAE++F,iBACjBhqG,IAAUkC,EAAEmW,eAAiBnW,EAAEyqG,aAC/B3sG,EAAM+C,QAAQ66B,QACd59B,EAAM+C,QAAQ8kG,cAAgB,OAKtC+E,qBAAsB,SAAS1qG,GAE3B,IAAIlC,EAAQnH,KAAKmH,MAEZo3D,EAAQnsD,EAAE++F,kBAAqB7jG,EAAO8E,EAAE++F,kBAAqB7jG,EAAO8E,EAAE++F,iBAAiBc,cACxF7/F,EAAE++F,gBAAkBhqG,EAAMtG,QAG9BwI,EAAIrJ,KAAKqqG,UAAUhhG,IACjBowF,aAAc,EAEU,cAAtBtyF,EAAM8qG,aACNjyG,KAAK2hB,KAAKtY,IAITrJ,KAAKmK,QAAQd,EAAEe,OAAQ,wBACpBjD,EAAMsrG,aAAappG,EAAEq9F,OAASv/F,EAAMk6F,SAAUh4F,EAAEs9F,OAASx/F,EAAMi6F,UAAcj6F,EAAM6C,UACvFhK,KAAK6wG,gBAAgBxnG,IAS7Bc,QAAS,SAAS2hE,EAASpiE,GAEvB,IADA,IAAIsqG,EACGloC,GAAS,CAEZ,GADAkoC,EAAgB3zG,EAAKyrE,EAAS,SACX,CACf,IAA0C,IAAtCkoC,EAAc97F,QAAQxO,GACtB,OAAO,EAEX,IAAuD,IAAnDsqG,EAAc97F,QAAQ,wBACtB,OAAO,EAGf4zD,EAAUA,EAAQljE,aAI1BqrG,kBAAmB,SAAS5qG,GACxB,IAAI3B,EAAS1H,KAAKmH,MAAMopG,YACpB/wF,EAAgBnW,EAAEmW,eAAiBnW,EAAEyqG,UACzC9zG,KAAKowG,eAAgB,GACjB1oG,IAAU8X,GAAkB9X,EAAOipG,gBAClC3wG,KAAKmK,QAAQqV,EAAe,uBAC3Bxf,KAAKmK,QAAQqV,EAAe,qBAAuB9X,EAAO7G,QACvDb,KAAKmK,QAAQqV,EAAe,uBAGjC9X,EAAO8pG,cAIf0C,iBAAkB,SAAS7qG,GACvB,IAAIlC,EAAQnH,KAAKmH,MACbkpG,EAAalpG,EAAMkpG,WACnBhP,EAAWl6F,EAAMk6F,SACjBD,EAAUj6F,EAAMi6F,QAEpB/3F,EAAIrJ,KAAKqqG,UAAUhhG,GAEdlC,EAAM+qG,cAGH7B,GAAcrwG,KAAKmK,QAAQd,EAAEe,OAAQ,uBAGrC8qE,EAAUm7B,EAAW3oG,OAAQ,QAASlF,EAAO6G,EAAG,CAC5CkX,MAAO8vF,KAIPlpG,EAAMkpG,YACNA,EAAWY,eAAe,QAAS5nG,KAKvC7G,EAAO6G,EAAGrJ,KAAKkvG,eAAe7lG,IAG1BlC,EAAMsrG,aAAappG,EAAEq9F,OAASrF,EAAUh4F,EAAEs9F,OAASvF,IACnDlsB,EAAU/tE,EAAO,QAASkC,MAa1CklG,aAAc,WAEV,IAAIrkG,EAAUlK,KACVoI,EAAY8B,EAAQ/C,MAAMiB,UAE9BA,EAAU+rG,YAAc,SAAS9qG,GAC7Ba,EAAQypG,qBAAqBtqG,IAEjCjB,EAAU41E,YAAc,SAAS30E,GAC7Ba,EAAQ6pG,qBAAqB1qG,IAEjCjB,EAAU3C,QAAU,SAAS4D,GACzBa,EAAQgqG,iBAAiB7qG,IAE7BnH,EAASkG,EAAW,aAAc8B,EAAQ2pG,uBACrB,IAAjBzhG,EAAEy4D,YACF3oE,EAAS8nE,EAAK,UAAW9/D,EAAQ0pG,mBAEjCxhG,EAAEs4D,WACFtiE,EAAU6D,aAAe,SAAS5C,GAC9Ba,EAAQkqG,sBAAsB/qG,IAElCjB,EAAUisG,YAAc,SAAShrG,GAC7Ba,EAAQoqG,qBAAqBjrG,IAEZ,IAAjB+I,EAAEy4D,YACF3oE,EAAS8nE,EAAK,WAAY9/D,EAAQqqG,sBAS9CjsG,QAAS,WACL,IAAI4B,EAAUlK,KAEVkK,EAAQgnG,gBACRhnG,EAAQgnG,iBAGZ/uG,EACI+H,EAAQ/C,MAAMiB,UACd,aACA8B,EAAQ2pG,uBAEPzhG,EAAEy4D,aACH1oE,EAAY6nE,EAAK,UAAW9/D,EAAQ0pG,mBACpCzxG,EAAY6nE,EAAK,WAAY9/D,EAAQqqG,qBAIzCjoC,cAAcpiE,EAAQ2/F,gBAEtBz3F,EAAEs6D,WAAWxiE,GAAS,SAASyiE,EAAKlB,GAChCvhE,EAAQuhE,GAAQ,UAv6BhC,CA46BE1qE,GACD,SAASqR,GAMN,IAAI9E,EAAS8E,EAAE9E,OACX/N,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACXuR,EAAM3B,EAAE2B,IACRk3D,EAAO74D,EAAE64D,KACTr/D,EAAOwG,EAAExG,KACTsiG,EAAU97F,EAAE87F,QAGhB1rG,EAAO0rG,EAAQprG,UAA2C,CAKtD0xG,eAAgB,SAASpG,EAAW1sF,EAASm3B,EAAWy5D,EAAiBzmE,EAAMwiE,GACvEruG,KAAK6uG,SACL7uG,KAAKy0G,yBAAwB,EAAMrG,EAAW1sF,EAASm3B,EAAWy5D,EAAiBzmE,EAAMwiE,GAEzFruG,KAAK8uG,UACL9uG,KAAKy0G,yBAAwB,EAAOrG,EAAW1sF,EAASm3B,EAAWy5D,EAAiBzmE,EAAMwiE,IAOlGoG,wBAAyB,SAAStjB,EAAOid,EAAW1sF,EAASm3B,EACzDy5D,EAAiBzmE,EAAMwiE,EAAgBqG,GACvC,IAMIC,EACAC,EACAC,EASAC,EACAC,EACAC,EAnBA7tG,EAAQnH,KAAKmH,MACbkqF,EAAKF,EAAQ,IAAM,IACnB8jB,EAAK9jB,EAAQ,IAAM,IACnB+jB,EAAW,QAAUD,EACrBE,EAAKhkB,EAAQ,QAAU,SACvBikB,EAAcjuG,EAAM,QAAUgqF,EAAQ,OAAS,QAI/C1yF,EAAQi2G,GAAe,EACvBj5B,EAAWt0E,EAAMs0E,SACjBnyC,EAASniC,EAAMmiC,OAAO6nD,EAAQ,IAAM,KACpCkkB,EAAmC,IAArBjH,EAAUpiG,OACxBspG,EAAclH,EAAU,GAAG8G,GAC3BK,EAAY7zF,EAAQ,GAAGwzF,GACvBM,GAAeH,GAAejH,EAAU,GAAG8G,GAC3CO,GAAaJ,GAAe3zF,EAAQ,GAAGwzF,GAIvClV,EAAW,YAEFqV,GAAex1G,KAAKuU,IAAIkhG,EAAcE,GAAe,KACtD/2G,EAAQi2G,GAAe70G,KAAKuU,IAAImhG,EAAYE,GAAa51G,KAAKuU,IAAIkhG,EAAcE,IAGpFX,GAAWO,EAAcG,GAAa92G,EAAS62G,EAC/CX,EAAcxtG,EAAM,QAAUgqF,EAAQ,QAAU,WAAa1yF,GAIrEuhG,KAEA4U,EAAcC,GAGIvrE,EAAOx3B,KACrB8iG,EAActrE,EAAOx3B,IACrBgjG,GAAc,GACPF,EAAcD,EAAcrrE,EAAO7mC,MAC1CmyG,EAActrE,EAAO7mC,IAAMkyG,EAC3BG,GAAc,GAIdA,GAIAS,GAAa,IAAOA,EAAYlH,EAAehd,GAAI,IAC9CgkB,IACDI,GAAa,IAAOA,EAAYpH,EAAehd,GAAI,KAIvD2O,KAGAqO,EAAehd,GAAM,CAACkkB,EAAWE,GAIhCh6B,IACD5vC,EAAKwlD,GAAMwjB,EAASO,EACpBvpE,EAAKspE,GAAMR,GAEfK,EAAWv5B,EAAY0V,EAAQ,SAAW,SAAY,QAAU8jB,EAChEF,EAAiBt5B,EAAW,EAAIh9E,EAAQA,EAExC6zG,EAAgB6C,GAAMR,EACtBrC,EAAgBjhB,GAAMujB,EACtB/7D,EAAUm8D,GAAYv2G,EACtBo6C,EAAU,YAAco8D,GAAOF,EAAiBK,GAAgBG,EAAaR,EAAiBO,IAMlGI,MAAO,SAASrsG,GAEZ,IAAI63D,EAAOlhE,KACPmH,EAAQ+5D,EAAK/5D,MACbinG,EAAYltC,EAAKktC,UACjB1sF,EAAUrY,EAAEqY,QACZi0F,EAAgBj0F,EAAQ1V,OACxBqiG,EAAiBntC,EAAKmtC,eACtBU,EAAU7tC,EAAK6tC,QACfuD,EAAkBpxC,EAAKoxC,gBACvBz5D,EAAY,GACZ+8D,EAAmC,IAAlBD,IAAyBz0C,EAAK/2D,QAAQd,EAAEe,OAAQ,uBAC7DjD,EAAM0uG,iBAAoB30C,EAAKitC,eACnCtiE,EAAO,GAIP8pE,EAAgB,IAChBz0C,EAAK40C,WAAY,GAIjB/G,GAAW7tC,EAAK40C,YAAcF,GAC9BvsG,EAAEgP,iBAINtE,EAAI2N,GAAS,SAASrY,GAClB,OAAO63D,EAAKmpC,UAAUhhG,MAIX,eAAXA,EAAErE,MACFzF,EAAKmiB,GAAS,SAASrY,EAAG1J,GACtByuG,EAAUzuG,GAAK,CACX+mG,OAAQr9F,EAAEq9F,OACVC,OAAQt9F,EAAEs9F,WAGlB0H,EAAersG,EAAI,CAACosG,EAAU,GAAG1H,OAAQ0H,EAAU,IAAMA,EAAU,GAAG1H,QACtE2H,EAAeptG,EAAI,CAACmtG,EAAU,GAAGzH,OAAQyH,EAAU,IAAMA,EAAU,GAAGzH,QAGtEpnG,EAAK4H,EAAM6wF,MAAM,SAASp0B,GACtB,GAAIA,EAAKizB,YAAa,CAClB,IAAIvtD,EAASniC,EAAMmiC,OAAOs6B,EAAKutB,MAAQ,IAAM,KACzCyF,EAAkBhzB,EAAKgzB,gBACvB9kF,EAAM8xD,EAAKw2B,SAASxuF,EAAKg4D,EAAKj9D,QAAQmL,IAAK8xD,EAAKi1B,UAChDp2F,EAAMmhE,EAAKw2B,SAASxuF,EAAKg4D,EAAKj9D,QAAQlE,IAAKmhE,EAAKk1B,UAChDid,EAASl2G,KAAKiS,IAAIA,EAAKrP,GACvBuzG,EAASn2G,KAAK4C,IAAIqP,EAAKrP,GAG3B6mC,EAAOx3B,IAAMjS,KAAKiS,IAAI8xD,EAAKuI,IAAK4pC,EAASnf,GACzCttD,EAAO7mC,IAAM5C,KAAK4C,IAAImhE,EAAKuI,IAAMvI,EAAKoK,IAAKgoC,EAASpf,OAG5D11B,EAAK+0C,KAAM,GAGJ/0C,EAAKotC,iBAAqC,IAAlBqH,EAC/B31G,KAAK6wG,gBAAgB3vC,EAAKmpC,UAAUhhG,IAG7B+kG,EAAUpiG,SAIZsmG,IACDpxC,EAAKoxC,gBAAkBA,EAAkB9vG,EAAO,CAC5C8F,QAAS2iE,EACTxpD,OAAO,GACRta,EAAM+uG,UAGbh1C,EAAKszC,eAAepG,EAAW1sF,EAASm3B,EAAWy5D,EAAiBzmE,EAAMwiE,GAE1EntC,EAAK6xC,WAAahE,EAGlB7tC,EAAKwwC,YAAY74D,EAAWhN,GAExBq1B,EAAK+0C,MACL/0C,EAAK+0C,KAAM,EACXj2G,KAAK+kC,OAAM,EAAO,MAQ9BtjB,MAAO,SAASpY,EAAG2L,GACf,IACImhG,EACA/H,EAFAjnG,EAAQnH,KAAKmH,MAKbA,EAAMtG,QAAUuR,EAAE++F,iBAClBnxG,KAAK6zG,sBAAsB,CACvBr0F,eAAe,IAGvBpN,EAAE++F,gBAAkBhqG,EAAMtG,MAED,IAArBwI,EAAEqY,QAAQ1V,QAEV3C,EAAIrJ,KAAKqqG,UAAUhhG,GAERlC,EAAMsrG,aACbppG,EAAEq9F,OAASv/F,EAAMk6F,SACjBh4F,EAAEs9F,OAASx/F,EAAMi6F,WAEJj6F,EAAM6C,UAGfgL,GACAhV,KAAK6wG,gBAAgBxnG,GAQV,cAAXA,EAAErE,OAEFmxG,KADA/H,EAAYpuG,KAAKouG,WACI,IAAKvuG,KAAK6S,KAC3B7S,KAAKqnB,IAAIknF,EAAU,GAAG1H,OAASr9F,EAAEq9F,OAAQ,GACzC7mG,KAAKqnB,IAAIknF,EAAU,GAAGzH,OAASt9F,EAAEs9F,OAAQ,KACxC,GAGL/6F,EAAKuqG,GAAU,IACfn2G,KAAK01G,MAAMrsG,IAGR2L,GAEPhV,KAAK+kC,SAGmB,IAArB17B,EAAEqY,QAAQ1V,QACjBhM,KAAK01G,MAAMrsG,IAInB+qG,sBAAuB,SAAS/qG,GAC5BrJ,KAAKwuG,WAAWnlG,GAChBrJ,KAAKyhB,MAAMpY,GAAG,IAGlBirG,qBAAsB,SAASjrG,GAC3BrJ,KAAKyhB,MAAMpY,IAGfkrG,mBAAoB,SAASlrG,GACrBiE,EAAO8E,EAAE++F,kBACT7jG,EAAO8E,EAAE++F,iBAAiBjnG,QAAQ4oG,KAAKzpG,MA9QvD,CAoREtI,GACD,SAASqR,GAMN,IAAIlQ,EAAWkQ,EAAElQ,SACboL,EAAS8E,EAAE9E,OACXhL,EAAM8P,EAAE9P,IACR0nE,EAAM53D,EAAE43D,IACRxnE,EAAS4P,EAAE5P,OACXkoE,EAAWt4D,EAAEs4D,SACbO,EAAO74D,EAAE64D,KACTijC,EAAU97F,EAAE87F,QACZ/rG,EAAciQ,EAAEjQ,YAChB0nE,EAAMz3D,EAAEy3D,IACRlrD,EAAOvM,EAAEuM,KAEb,IAAK+rD,IAAab,EAAIusC,cAAgBvsC,EAAIwsC,gBAAiB,CAGvD,IAAI30F,EAAU,GACV40F,IAAoBzsC,EAAIusC,aAexBG,EAAqB,SAASltG,EAAGpD,EAAQuwG,EAAQ5mC,GAC7C,IAdI6mC,EAemB,UAAlBptG,EAAEqtG,aAA2BrtG,EAAEqtG,cAAgBrtG,EAAEstG,uBAAyBrpG,EAAO8E,EAAE++F,mBACpFvhC,EAAKvmE,GACDiE,EAAO8E,EAAE++F,iBAAiBjnG,QAC5BjE,GAAQ,CACNjB,KAAMwxG,EACNpsG,OAAQf,EAAEqD,cACV2L,eAAgB4yD,EAChBvpD,SAtBJ+0F,EAAO,GACXA,EAAK5nC,KAAO,SAASlvE,GACjB,OAAOK,KAAKL,IAEhByS,EAAEs6D,WAAWhrD,GAAS,SAASD,GAC3Bg1F,EAAK3uG,KAAK,CACN+Y,MAAOY,EAAMZ,MACbC,MAAOW,EAAMX,MACb1W,OAAQqX,EAAMrX,YAGfqsG,OAmBfj0G,EAAO0rG,EAAQprG,UAA2C,CACtD8zG,uBAAwB,SAASvtG,GAC7BktG,EAAmBltG,EAAG,wBAAyB,cAAc,SAASA,GAClEqY,EAAQrY,EAAEwtG,WAAa,CACnBh2F,MAAOxX,EAAEwX,MACTC,MAAOzX,EAAEyX,MACT1W,OAAQf,EAAEqD,mBAItBoqG,uBAAwB,SAASztG,GAC7BktG,EAAmBltG,EAAG,uBAAwB,aAAa,SAASA,GAChEqY,EAAQrY,EAAEwtG,WAAa,CACnBh2F,MAAOxX,EAAEwX,MACTC,MAAOzX,EAAEyX,OAERY,EAAQrY,EAAEwtG,WAAWzsG,SACtBsX,EAAQrY,EAAEwtG,WAAWzsG,OAASf,EAAEqD,mBAI5CqqG,oBAAqB,SAAS1tG,GAC1BktG,EAAmBltG,EAAG,qBAAsB,YAAY,SAASA,UACtDqY,EAAQrY,EAAEwtG,eAOzBG,cAAe,SAAShoC,GACpBA,EAAGhvE,KAAKmH,MAAMiB,UAAWkuG,EAAkB,cAAgB,gBAAiBt2G,KAAK42G,wBACjF5nC,EAAGhvE,KAAKmH,MAAMiB,UAAWkuG,EAAkB,cAAgB,gBAAiBt2G,KAAK82G,wBACjF9nC,EAAGhF,EAAKssC,EAAkB,YAAc,cAAet2G,KAAK+2G,wBAKpEp4F,EAAKuvF,EAAQprG,UAAW,QAAQ,SAAS+sE,EAAS1oE,EAAOR,GACrDkpE,EAAQ5gE,KAAKjP,KAAMmH,EAAOR,GACtB3G,KAAK+uG,SACLzsG,EAAI6E,EAAMiB,UAAW,CACjB,mBAAoB,OACpB,eAAgB,YAM5BuW,EAAKuvF,EAAQprG,UAAW,gBAAgB,SAAS+sE,GAC7CA,EAAQtlE,MAAMvK,OACVA,KAAK+uG,SAAW/uG,KAAKsuG,kBACrBtuG,KAAKg3G,cAAc90G,MAI3Byc,EAAKuvF,EAAQprG,UAAW,WAAW,SAAS+sE,GACxC7vE,KAAKg3G,cAAc70G,GACnB0tE,EAAQ5gE,KAAKjP,UAhHzB,CAoHEe,GACD,SAASA,GAMN,IAAIqR,EAAIrR,EAEJmB,EAAWkQ,EAAElQ,SACbI,EAAM8P,EAAE9P,IACRD,EAAiB+P,EAAE/P,eACnBk8D,EAAUnsD,EAAEmsD,QACZh/D,EAAO6S,EAAE7S,KACT+qE,EAAYl4D,EAAEk4D,UACdU,EAAc54D,EAAE44D,YAChBzoE,EAAQ6P,EAAE7P,MACVqJ,EAAOwG,EAAExG,KACTsnE,EAAe9gE,EAAE8gE,aACjBV,EAAapgE,EAAEogE,WACf3I,EAAMz3D,EAAEy3D,IACRlrD,EAAOvM,EAAEuM,KASb5d,EAAWk2G,OAAS,SAAS9vG,EAAOR,GAChC3G,KAAKs2E,KAAKnvE,EAAOR,IAGrB5F,EAAWk2G,OAAOn0G,UAAY,CAK1BwzE,KAAM,SAASnvE,EAAOR,GAElB3G,KAAKmH,MAAQA,EAEbnH,KAAK4vF,WAAWjpF,GAEZA,EAAQc,UAGRzH,KAAK80F,SAGL5yF,EAASlC,KAAKmH,MAAO,aAAa,WAC9BnH,KAAKyuF,OAAOyoB,0BAKxBtnB,WAAY,SAASjpF,GAEjB,IAAI/C,EAAUgI,EAAKjF,EAAQ/C,QAAS,GAEpC5D,KAAK2G,QAAUA,EAGf3G,KAAK6uF,UAAYloF,EAAQkoF,UACzB7uF,KAAK+uF,gBAAkBxsF,EAAMvC,KAAK6uF,UAAWloF,EAAQooF,iBAErD/uF,KAAKm3G,cAAgBxwG,EAAQwwG,eAAiB,EAC9Cn3G,KAAK4D,QAAUA,EACf5D,KAAKo3G,aAAexzG,EAAU,EAC9B5D,KAAKq3G,aAAe,EACpBr3G,KAAKs3G,WAAa,EAClBt3G,KAAKu3G,YAAc3rG,EAAKjF,EAAQ4wG,YAAa,IAC7Cv3G,KAAKw3G,MAAQ,IAejBv5F,OAAQ,SAAStX,EAASy/D,GACtB,IAAIj/D,EAAQnH,KAAKmH,MAEjBnH,KAAK4vF,WAAWrtF,GAAM,EAAMvC,KAAK2G,QAASA,IAC1C3G,KAAKsI,UACLnB,EAAMswG,cAAgBtwG,EAAMuwG,YAAa,EACrC9rG,EAAKw6D,GAAQ,IACbj/D,EAAMi/D,UASduxC,aAAc,SAAS9oC,EAAMjnE,GACzBinE,EAAK+oC,YAAYhwG,EAAU,cAAgB,YACvC,iCAIJ,IACIjB,EADS3G,KACQ2G,QACjBkxG,EAAahpC,EAAKgpC,WAClBC,EAAajpC,EAAKipC,WAClBC,EAAelpC,EAAKkpC,aACpBC,EALSh4G,KAKY+uF,gBAAgBvwF,MACrCy5G,EAAYrwG,EAAUjB,EAAQkoF,UAAUrwF,MAAQw5G,EAChDE,EAActwG,GAAWinE,EAAKrwE,OAAwBw5G,EACtDG,EAAgBtpC,EAAKloE,SAAWkoE,EAAKloE,QAAQyxG,OAC7C1+B,EAAa,CACT/0E,KAAMuzG,GAGVL,GACAA,EAAWv1G,IAAI,CACXqC,KAAMszG,EACNz5G,MAAOy5G,IAGXH,GACAA,EAAWz3G,KAAK,CACZuE,OAAQszG,IAIZH,IAGII,GAAiBJ,EAAaM,WAE9B3+B,EAAa7K,EAAKypC,eACb1wG,GACDwK,EAAEs6D,WAAWgN,GAAY,SAAS/M,EAAK34D,GACnC0lE,EAAW1lE,GAAOgkG,MAK9BD,EAAa13G,KAAKq5E,KAS1B6+B,aAAc,SAAS1pC,GACnB,IACIloE,EADS3G,KACQ2G,QACjBuoF,EAAgBvoF,EAAQuoF,cACxBspB,GAAO7xG,EAAQ8xG,IACfC,EAAgB7pC,EAAK8pC,eACrBC,EAAQF,EAAc,GACtBG,EAAQH,EAAc,GACtBI,EAAWjqC,EAAKiqC,SAChBlB,EAAc/oC,EAAK+oC,YAEnBA,GAAeA,EAAY9rC,SAC3B8rC,EAAYnwF,UACR+wF,EACAI,EAbK54G,KAcE+4G,YAAcH,EAAQ,EAAI1pB,EAAgB,EACjD2pB,GAIJC,IACAA,EAAS92G,EAAI42G,EACbE,EAAS73G,EAAI43G,IAQrBG,YAAa,SAASnqC,GAClB,IAAIiqC,EAAWjqC,EAAKiqC,SAGpBv5G,EACI,CAAC,aAAc,aAAc,eAAgB,gBAC7C,SAASyU,GACD66D,EAAK76D,KACL66D,EAAK76D,GAAO66D,EAAK76D,GAAK1L,cAK9BwwG,GACAz2G,EAAewsE,EAAKiqC,WAO5BxwG,QAAS,WACL,SAAS2wG,EAAajlG,GACdhU,KAAKgU,KACLhU,KAAKgU,GAAOhU,KAAKgU,GAAK1L,WAK9B/I,EAAKS,KAAKk5G,eAAe,SAASrqC,GAC9BtvE,EAAK,CAAC,aAAc,eAAgB05G,EAAcpqC,MAItDtvE,EAAK,CACD,WACA,KACA,OACA,QACA,MACA,MACA,QACA,SACD05G,EAAcj5G,MACjBA,KAAKoG,QAAU,MAMnB8wG,mBAAoB,SAASiC,GACzB,IACIztG,EADA0wE,EAAYp8E,KAAKoa,OAASpa,KAAKoa,MAAMgiE,UAErCg9B,EAAap5G,KAAKo5G,YAAcp5G,KAAKq5G,aACrCC,EAAct5G,KAAKs5G,YAEnBl9B,IACA1wE,EAAa0wE,EAAU1wE,WACvBnM,EAAKS,KAAKu5G,UAAU,SAAS1qC,GACzB,IACI/nE,EADAgyG,EAAWjqC,EAAKiqC,SAGhBA,IACAhyG,EAAM4E,EAAa4tG,EAAcR,EAAS73G,GACrCk4G,GAAgB,GAAK,EAC1B72G,EAAIw2G,EAAU,CACV9tG,KAAOoxE,EAAU3wE,WAAaojE,EAAK2qC,eAC/BV,EAAS92G,EAAI,GAAM,KACvB8E,IAAKA,EAAM,KACXV,QAASU,EAAM4E,EAAa,GAAK5E,EAAM4E,EACnC0tG,EAAa,EAAI,GAAK,eAU9CK,YAAa,WACT,IAIIj9B,EAJA71E,EAAU3G,KAAK2G,QACf/C,EAAU5D,KAAK4D,QACf81G,EAAe/yG,EAAQpG,MACvB+4G,EAAc,EAGdI,EAAap5G,OACRN,KAAKO,QACNP,KAAKO,MAAQP,KAAKmH,MAAMiE,SAASs4E,MACzBg2B,EAAap5G,KACbsD,EAAU,EACVA,EAAU,EACV,KACA,KACA,KACA+C,EAAQg/E,QACR,KACA,gBAEHtlF,KAAK,CACFsJ,OAAQ,IAGXrH,IAAIo3G,EAAal5G,OAEjBsL,IAAI9L,KAAKoa,QAGlBk/F,GADA98B,EAAOx8E,KAAKO,MAAM87E,WACC53E,OACnBzE,KAAK4K,YAAc4xE,EAAK13E,MACxB9E,KAAK25G,aAAat5G,KAAK,CACnBqL,WAAY4tG,KAGpBt5G,KAAKs5G,YAAcA,GAMvBM,QAAS,SAAS/qC,GACd,IAAIloE,EAAU3G,KAAK2G,QACnBkoE,EAAKgpC,WAAWx3G,KAAK,CACjBC,KAAMqG,EAAQkzG,YACVznG,EAAEwZ,OAAOjlB,EAAQkzG,YAAahrC,GAAQloE,EAAQ+nF,eAAez/E,KAAK4/D,MAQ9EirC,WAAY,SAASjrC,GACjB,IAcIyoC,EAIA96B,EACAu9B,EAlBA5yG,EADSnH,KACMmH,MACfiE,EAAWjE,EAAMiE,SACjBzE,EAHS3G,KAGQ2G,QACjBqzG,EAAgC,eAAnBrzG,EAAQzH,OACrBq4G,EALSv3G,KAKYu3G,YACrBroB,EAAgBvoF,EAAQuoF,cAExBL,EARS7uF,KAQU6uF,UACnBE,EATS/uF,KASgB+uF,gBAEzBnrF,EAXS5D,KAWQ4D,QACjBq2G,EAAeD,EAAapuG,EAAKjF,EAAQszG,aAAc,IAAM,EAC7DzB,GAAO7xG,EAAQ8xG,IAEfyB,EAAcvzG,EAAQ7B,MACtBq1G,EAAmBxzG,EAAQwzG,kBAAoB,EAC/ChD,EAjBSn3G,KAiBcm3G,cAGvBiD,EAAKvrC,EAAKgpC,WACVwC,GAAYxrC,EAAKnnE,OACjBA,GAAU2yG,GAAYxrC,EAAKnnE,OAAO4yG,iBAClCzrC,EAAKnnE,OACLmnE,EACAuqB,EAAgB1xF,EAAOf,QACvBgB,EA1BS3H,KA0Bau6G,uBACtBnhB,GACAA,EAAczxF,aAEd6yG,EAAiBjD,EAAcroB,EAAgB+qB,GAC9CtyG,EAAe,GAAK,GACrBg+E,EAAUh/E,EAAQg/E,QAClB7hF,EAAW,GACX22G,EAAgB5rC,EAAKloE,QAAQ+C,UAE5B0wG,IAIDvrC,EAAK+oC,YAAcxsG,EAAS3K,EAAE,eACzBy5E,SACG,cAAgBxyE,EAAO1C,KAAvB,4BACsB6pE,EAAK29B,YAC1BiO,EAAgB,IAAMA,EAAgB,KACtCJ,EAAW,sBAAwBxrC,EAAKhuE,MAAQ,KAEpDR,KAAK,CACFsJ,OAAQ,IAEXmC,IAlDI9L,KAkDO06G,aAGhB7rC,EAAKgpC,WAAauC,EAAKhvG,EAAS9K,KACxB,GACAk4G,EAAMjB,EAAcroB,GAAiBA,EAvDpClvF,KAwDM+lF,UAAY,EACnBJ,GAIHrjF,IAAIC,EAAMssE,EAAKjnE,QAAUinF,EAAYE,IAErC1uF,KAAK,CACFkE,MAAOi0G,EAAM,OAAS,QACtB7uG,OAAQ,IAEXmC,IAAI+iE,EAAK+oC,aAnEL53G,KAuEG+lF,WAERjiF,EAAW+qF,EAAU/qF,SAzEhB9D,KA2EEoiF,YAAch3E,EAASg3E,YAC1Bt+E,EACAs2G,GA7ECp6G,KA+EE+lF,SA/EF/lF,KA+EoBoiF,YAAYphF,EAAI,EAAIm2G,EAC7CiD,EAAG/5G,KAAK,IAhFHL,KAgFe+lF,WAhFf/lF,KAoFF26G,aAAeh0G,EAAQg0G,cApFrB36G,KAoF4CoiF,YAAYphF,EACjE0G,EAAO4yG,iBArFEt6G,KAqFuB6uE,GArFvB7uE,KAuFE46G,eAvFF56G,KAwFE46G,cAAc/rC,EAAMurC,EAAIz0B,GAI/Bh+E,GA5FK3H,KA6FEu6G,sBAAsB1rC,IA7FxB7uE,KAkGN23G,aAAa9oC,EAAMA,EAAKjnE,SAI1BinF,EAAU/pF,OAEXs1G,EAAG93G,IAAI,CACHwC,OAAQ6B,EAAQozG,WAAa5yG,EAAMolG,WAAWznG,OAC1C01G,IA1GCx6G,KAiHN45G,QAAQ/qC,GAGf2N,EAAO49B,EAAG/9B,UAEV09B,EAAYlrC,EAAK2qC,eACb7yG,EAAQozG,WACRlrC,EAAKgsC,iBACLr+B,EAAK13E,MAAQ01G,EAzHJx6G,KA0HNs3G,WAAaA,EAAaz3G,KAAKC,MAClC+uE,EAAKisC,kBAAoBt+B,EAAK/3E,QA3HrBzE,KA2HsC26G,cAK/CX,GAhISh6G,KAiIF44G,MAAQh1G,EAAUm2G,GACrBG,GACI/yG,EAAMolG,WAAWznG,MAAQ,EAAIlB,EAAU+C,EAAQ3E,KAnI9ChC,KAuIF44G,MAAQh1G,EAvIN5D,KAwIF64G,OAAS1B,EAxIPn3G,KAwI8B+6G,eACnCZ,EAzIKn6G,KA0IF+6G,eAAiB,GA1If/6G,KAsJNq3G,aAAex3G,KAAK4C,IAtJdzC,KAsJyBq3G,aAAc0C,GAtJvC/5G,KAuJNg7G,UAAY7D,EAvJNn3G,KAuJ6B64G,MAAQsB,EAvJrCn6G,KAwJN+6G,eAAiBl7G,KAAK4C,IACzB60G,EAzJSt3G,KA0JF+6G,gBAIXlsC,EAAK8pC,eAAiB,CA9JT34G,KA8JiB44G,MA9JjB54G,KA8J+B64G,OAGxCmB,EAjKSh6G,KAkKF44G,OAASmB,GAlKP/5G,KAqKF64G,OAAS1B,EAAgBG,EAAa6C,EArKpCn6G,KAsKF+6G,eAAiBzD,GAtKft3G,KA0KN4K,YAAcsvG,GAAer6G,KAAK4C,KACpCu3G,EA3KQh6G,KA2KY44G,MAAQh1G,EAAUq2G,EAAeF,GACtDn2G,EA5KS5D,KA6KF4K,cAQfsuG,YAAa,WACT,IAAIK,EAAW,GAsBf,OArBAh6G,EAAKS,KAAKmH,MAAMO,QAAQ,SAASA,GAC7B,IAAI0xF,EAAgB1xF,GAAUA,EAAOf,QAIjCe,GAAUkE,EACNwtF,EAAc6hB,cAAe18C,EAAQ66B,EAAcjC,gBAAYxsB,GAAmB,KAKtF4uC,EAAWA,EAASphG,OAChBzQ,EAAOwzG,cAE0B,UAA7B9hB,EAAc+hB,WACdzzG,EAAOlI,KACPkI,QAKT6xG,GAQX6B,cAAe,SAASz6F,EAAQstE,GAC5B,IAAI9mF,EAAQnH,KAAKmH,MACbR,EAAU3G,KAAK2G,QAGf00G,EAAY10G,EAAQpC,MAAM+R,OAAO,GACjC3P,EAAQ9B,cAAcyR,OAAO,GAC7B3P,EAAQzH,OAAOoX,OAAO,GAErB3P,EAAQ20G,UAET/7G,EAAK,CACD,eACA,eACA,eACA,iBACD,SAASg8G,EAAYpoB,GAChBooB,EAAWn0G,KAAKi0G,KAAe98C,EAAQ59C,EAAOwyE,MAG9ChsF,EAAM6jE,EAAYmoB,IAAStzF,KAAK4C,IAC5B0E,EAAM6jE,EAAYmoB,IAEdhsF,EAAMsnF,QACD0E,EAAO,GAAK,EAAI,eAAiB,eAClC,CAAC,GAAI,GAAI,EAAG,GAAGA,GAAQxsF,EACtBwsF,EAAO,EAAK,IAAM,KAEvBvnF,EAAKjF,EAAQga,OAAQ,IACrBstE,EAAQkF,SAahC2B,OAAQ,WACJ,IAIIykB,EACAnzG,EACA2yG,EACAM,EAPA5qB,EAASzuF,KACTmH,EAAQsnF,EAAOtnF,MACfiE,EAAWjE,EAAMiE,SACjBwsG,EAAcnpB,EAAOr0E,MAKrB85D,EAAMua,EAAOva,IACbvtE,EAAU8nF,EAAO9nF,QACjB/C,EAAU6qF,EAAO7qF,QAErB6qF,EAAOmqB,MAAQh1G,EACf6qF,EAAOoqB,MAAQpqB,EAAO2oB,aACtB3oB,EAAO7jF,YAAc,EACrB6jF,EAAOusB,UAAY,EAEdpD,IACDnpB,EAAOr0E,MAAQw9F,EAAcxsG,EAAS3K,EAAE,UACnCJ,KAAK,CACFsJ,OAAQ,IAEXmC,MACL2iF,EAAOkrB,aAAevuG,EAAS3K,IAC1BJ,KAAK,CACFsJ,OAAQ,IAEXmC,IAAI8rG,GACTnpB,EAAOisB,YAActvG,EAAS3K,IACzBqL,IAAI2iF,EAAOkrB,eAGpBlrB,EAAOgrB,cAGPF,EAAW9qB,EAAOyqB,cAGlB1mC,EAAW+mC,GAAU,SAASxzG,EAAGC,GAC7B,OAASD,EAAEY,SAAWZ,EAAEY,QAAQ60G,aAAgB,IAC1Cx1G,EAAEW,SAAWX,EAAEW,QAAQ60G,aAAgB,MAI7C70G,EAAQosF,UACRwmB,EAASt+E,UAGbwzD,EAAO8qB,SAAWA,EAClB9qB,EAAOroF,QAAUA,IAAYmzG,EAASvtG,OAGtCyiF,EAAOssB,eAAiB,EACxBx7G,EAAKg6G,GAAU,SAAS1qC,GACpB4f,EAAOqrB,WAAWjrC,MAItBkqC,GAAepyG,EAAQ7B,OAAS2pF,EAAO7jF,aAAehH,EACtDy1G,EAAe5qB,EAAOusB,UAAYvsB,EAAOssB,eACrCtsB,EAAO6qB,YACXD,EAAe5qB,EAAO2C,eAAeioB,GACrCA,GAAgBz1G,EAGXswE,IACDua,EAAOva,IAAMA,EAAM9oE,EAAS+V,OACvB+4D,SAAS,yBACT75E,KAAK,CACFoB,EAAGkF,EAAQ8B,eAEdqD,IAAI8rG,GACT1jC,EAAI8b,OAAQ,GAKhB9b,EACK7zE,KAAK,CACFuE,OAAQ+B,EAAQwnF,YAChB,eAAgBxnF,EAAQ6oF,aAAe,EACvC7qF,KAAMgC,EAAQynF,iBAAmB,SAEpChQ,OAAOz3E,EAAQy3E,QAGhB26B,EAAc,GAAKM,EAAe,IAClCnlC,EAAIA,EAAI8b,MAAQ,OAAS,WACrB9b,EAAIsG,MAAM,CACNx4E,EAAG,EACHf,EAAG,EACH6D,MAAOi0G,EACPt0G,OAAQ40G,GACTnlC,EAAIuE,gBAEXvE,EAAI8b,OAAQ,GAIhB9b,EAAI9tE,EAAU,OAAS,UAIvBqoF,EAAOsqB,YAAcA,EACrBtqB,EAAO4qB,aAAeA,EAItB95G,EAAKg6G,GAAU,SAAS1qC,GACpB4f,EAAO8pB,aAAa1pC,MAgBpBzoE,GACAwxG,EAAYrzG,MAAMhC,EAAMoE,EAAS,CAC7B7B,MAAOi0G,EACPt0G,OAAQ40G,KACR,EAAM,cAGTlyG,EAAMs0G,YACPz7G,KAAKk3G,sBAQb9lB,eAAgB,SAASioB,GACrB,IAUID,EAOAsC,EAjBAjtB,EAASzuF,KACTmH,EAAQnH,KAAKmH,MACbiE,EAAWjE,EAAMiE,SACjBzE,EAAU3G,KAAK2G,QACfg1G,EAAWh1G,EAAQ1F,EACnB26G,EAAqC,QAA1Bj1G,EAAQ9B,cACnBjB,EAAU5D,KAAK4D,QACfi4G,EAAc10G,EAAMolG,WAAW9nG,QAC9Bm3G,GAAYD,EAAWA,GAAY/3G,EACpCk4G,EAAYn1G,EAAQm1G,UAEpBvhC,EAAWv6E,KAAKu6E,SAChBwhC,EAAap1G,EAAQnD,WACrB+D,EAAYqE,EAAKmwG,EAAWx0G,WAAW,GACvCy0G,EAAYD,EAAWC,WAAa,GACpCC,EAAMj8G,KAAKi8G,IACXzE,EAAQx3G,KAAKw3G,MAEb+B,EAAWv5G,KAAKu5G,SAChB2C,EAAe,SAASz3G,GACE,iBAAXA,EACP81E,EAASl6E,KAAK,CACVoE,OAAQA,IAEL81E,IACPkU,EAAOlU,SAAWA,EAASjyE,UAC3BmmF,EAAOkrB,aAAa9tE,QAIpB4iD,EAAOkrB,aAAax7B,MACpBsQ,EAAOkrB,aAAax7B,IAAI39E,MAAMqrC,KAAOpnC,EACjC,QAAUb,EAAU,cACnBA,EAAUa,GAAU,QACrB,SAmHhB,MA5GuB,eAAnBkC,EAAQzH,QACkB,WAA1ByH,EAAQ9B,eACP8B,EAAQ20G,WAETO,GAAe,GAEfC,IACAD,EAAch8G,KAAKiS,IAAI+pG,EAAaC,IAIxCtE,EAAMxrG,OAAS,EACXqtG,EAAewC,IAAsC,IAAvBE,EAAWt0G,SAEzCzH,KAAKo5G,WAAaA,EACdv5G,KAAK4C,IAAIo5G,EAAc,GAAK77G,KAAKs5G,YAAc11G,EAAS,GAC5D5D,KAAKm8G,YAAcvwG,EAAK5L,KAAKm8G,YAAa,GAC1Cn8G,KAAKo8G,WAAa/C,EAIlB95G,EAAKg6G,GAAU,SAAS1qC,EAAMlvE,GAC1B,IAAIsB,EAAI4tE,EAAK8pC,eAAe,GACxBjyG,EAAI7G,KAAKC,MAAM+uE,EAAKgpC,WAAWx7B,UAAU53E,QACzCupE,EAAMwpC,EAAMxrG,SAEXgiE,GAAQ/sE,EAAIu2G,EAAMxpC,EAAM,GAAKorC,IACzBsC,GAASz6G,KAAOu2G,EAAMxpC,EAAM,MACjCwpC,EAAM1vG,KAAK4zG,GAASz6G,GACpB+sE,KAGAruE,IAAM45G,EAASvtG,OAAS,GACxB/K,EAAIyF,EAAI8wG,EAAMxpC,EAAM,GAAKorC,GACzB5B,EAAM1vG,KAAK7G,GAEXA,IAAMy6G,IACNA,EAAQz6G,MAMXs5E,IACDA,EAAWkU,EAAOlU,SACdnvE,EAASmvE,SAAS,EAAG32E,EAAS,KAAM,GACxC6qF,EAAOkrB,aAAa9tE,KAAK0uC,IAG7B2hC,EAAa9C,GAGR6C,IACDj8G,KAAKi8G,IAAMA,EAAM7wG,EAAS3K,IACrBJ,KAAK,CACFsJ,OAAQ,IAEXmC,IAAI9L,KAAKoa,OAEdpa,KAAKq8G,GAAKjxG,EACL/F,OACG,WACA,EACA,EACA22G,EACAA,GAEHr7G,GAAG,SAAS,WACT8tF,EAAO6tB,QAAQ,EAAG/0G,MAErBuE,IAAImwG,GAETj8G,KAAKu8G,MAAQnxG,EAAS9K,KAAK,GAAI,GAAI,IAC9B45E,SAAS,gCAET53E,IAAIy5G,EAAWv7G,OAEfsL,IAAImwG,GAETj8G,KAAKw8G,KAAOpxG,EACP/F,OACG,gBACA,EACA,EACA22G,EACAA,GAEHr7G,GAAG,SAAS,WACT8tF,EAAO6tB,OAAO,EAAG/0G,MAEpBuE,IAAImwG,IAIbxtB,EAAO6tB,OAAO,GAEdjD,EAAewC,GAGRI,IACPC,IACAl8G,KAAKi8G,IAAMA,EAAI3zG,UACftI,KAAK06G,YAAYr6G,KAAK,CAClBqL,WAAY,IAEhB1L,KAAKo5G,WAAa,GAGfC,GAQXiD,OAAQ,SAASG,EAAUl1G,GACvB,IAOI4xG,EAPA3B,EAAQx3G,KAAKw3G,MACbkF,EAAYlF,EAAMxrG,OAClBmwG,EAAcn8G,KAAKm8G,YAAcM,EACjCrD,EAAap5G,KAAKo5G,WAClB2C,EAAa/7G,KAAK2G,QAAQnD,WAC1B+4G,EAAQv8G,KAAKu8G,MACb34G,EAAU5D,KAAK4D,QAIfu4G,EAAcO,IACdP,EAAcO,GAGdP,EAAc,SAEIxxC,IAAdpjE,GACA2rE,EAAa3rE,EAAWvH,KAAKmH,OAGjCnH,KAAKi8G,IAAI57G,KAAK,CACVoL,WAAY7H,EACZ8H,WAAY0tG,EAAap5G,KAAK4D,QAAU,EAAI5D,KAAKs5G,YACjDn8B,WAAY,YAEhBn9E,KAAKq8G,GAAGh8G,KAAK,CACT,MAAyB,IAAhB87G,EACL,iCAAmC,iCAE3CI,EAAMl8G,KAAK,CACPC,KAAM67G,EAAc,IAAMO,IAE9B18G,KAAKw8G,KAAKn8G,KAAK,CACX,EAAK,GAAKL,KAAKu8G,MAAMlgC,UAAUv3E,MAC/B,MAASq3G,IAAgBO,EACrB,iCAAmC,iCAI3C18G,KAAKq8G,GACAh8G,KAAK,CACFsE,KAAsB,IAAhBw3G,EACFJ,EAAWntB,cAAgBmtB,EAAWptB,cAE7CrsF,IAAI,CACDmI,OAAwB,IAAhB0xG,EAAoB,UAAY,YAEhDn8G,KAAKw8G,KACAn8G,KAAK,CACFsE,KAAMw3G,IAAgBO,EAClBX,EAAWntB,cAAgBmtB,EAAWptB,cAE7CrsF,IAAI,CACDmI,OAAQ0xG,IAAgBO,EAAY,UAAY,YAIxDvD,GAAgB3B,EAAM2E,EAAc,GAAKn8G,KAAKo3G,aAE9Cp3G,KAAK06G,YAAYjlC,QAAQ,CACrB/pE,WAAYytG,IAGhBn5G,KAAKm8G,YAAcA,EACnBn8G,KAAKk3G,mBAAmBiC,MAWpC/mG,EAAEuqG,kBAAoB,CAQlBC,cAAe,SAASnuB,EAAQ5f,GAC5B,IAAIloE,EAAU8nF,EAAO9nF,QACjBg0G,EAAelsB,EAAOksB,aACtBj5C,EAAS/6D,EAAQsoF,aACjBsoB,EAAc71C,EAASi5C,EAAelsB,EAAO8oB,YAEjD1oC,EAAKkpC,aAAe/3G,KAAKmH,MAAMiE,SAAS+V,KAChCugD,GAAU+sB,EAAO8oB,YAAcoD,GAAgB,EAAI,EACnDlsB,EAAO1I,SAAW40B,EAAe,EACjCpD,EACAoD,EACA/uG,EAAK6iF,EAAO9nF,QAAQk2G,aAAclC,EAAe,IAEpDzgC,SAAS,oBACT75E,KAAK,CACFsJ,OAAQ,IACTmC,IAAI+iE,EAAK+oC,cAWpBkF,eAAgB,SAASruB,GAErB,IAEI3vF,EACAi5G,EAHApxG,EAAU3G,KAAK2G,QACfwxG,EAAgBxxG,EAAQyxG,OAGxBb,EAAc9oB,EAAO8oB,YACrBoD,EAAelsB,EAAOksB,aACtBoC,EAAgBpC,EAAe,EAC/BvvG,EAAWpL,KAAKmH,MAAMiE,SACtB4xG,EAAkBh9G,KAAK43G,YACvBqF,EAAiBxuB,EAAO1I,SACxBlmF,KAAKC,MAA6B,GAAvB2uF,EAAOrM,YAAYp8E,GAC9B3F,EAAO,GAIXA,EAAO,CACH,eAAgBsG,EAAQovF,WAAa,GAErCpvF,EAAQotF,YACR1zF,EAAK2zF,UAAYrtF,EAAQotF,WAI7B/zF,KAAK83G,WAAa1sG,EAASqtC,KAAK,CACxB,IACA,EACAwkE,EACA,IACA1F,EACA0F,IAEH/iC,SAAS,oBACT75E,KAAKA,GACLyL,IAAIkxG,GAGL7E,IAA2C,IAA1BA,EAAc1wG,UAG/B3I,EAASe,KAAKiS,IACVlG,EAAKusG,EAAcr5G,OAAQi+G,GAC3BA,GAI+B,IAA/B/8G,KAAKqF,OAAO6S,QAAQ,SACpBigG,EAAgB51G,EAAM41G,EAAe,CACjCrzG,MAAO61G,EACPl2G,OAAQk2G,IAEZ77G,EAAS,GAGbkB,KAAK+3G,aAAeA,EAAe3sG,EAAS/F,OACpCrF,KAAKqF,OACJkyG,EAAc,EAAKz4G,EACpBm+G,EAAiBn+G,EACjB,EAAIA,EACJ,EAAIA,EACJq5G,GAEHj+B,SAAS,oBACTpuE,IAAIkxG,GACTjF,EAAaM,UAAW,MAUhC,gBAAgBjxG,KAAKyiE,EAAI3pD,UAAUC,YAAcmqD,IACjD3rD,EAAK5d,EAAWk2G,OAAOn0G,UAAW,gBAAgB,SAAS+sE,EAAShB,GAChE,IAAI4f,EAASzuF,KAETk9G,EAAkB,WACVruC,EAAK8pC,gBACL9oC,EAAQ5gE,KAAKw/E,EAAQ5f,IAKjCquC,IAGAh0G,WAAWg0G,MAljCvB,CAsjCEn8G,GACD,SAASqR,GAMN,IAAIlQ,EAAWkQ,EAAElQ,SACbuzE,EAAUrjE,EAAEqjE,QACZrC,EAAahhE,EAAEghE,WACf/yE,EAAO+R,EAAE/R,KACT2pE,EAAM53D,EAAE43D,IACRgrB,EAAO5iF,EAAE4iF,KACT5yF,EAAgBgQ,EAAEhQ,cAClBkuE,EAAiBl+D,EAAEk+D,eACnBjuE,EAAiB+P,EAAE/P,eACnBiL,EAAS8E,EAAE9E,OACXhL,EAAM8P,EAAE9P,IACRi8D,EAAUnsD,EAAEmsD,QACZh/D,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACXyiD,EAAO7yC,EAAE6yC,KACTiwB,EAAY9iE,EAAE8iE,UACdvB,EAAWvhE,EAAEuhE,SACbrB,EAAOlgE,EAAEkgE,KACTxI,EAAW13D,EAAE03D,SACbqE,EAAW/7D,EAAE+7D,SACbI,EAAWn8D,EAAEm8D,SACb0oC,EAAS7kG,EAAE6kG,OACXjsC,EAAc54D,EAAE44D,YAChBzoE,EAAQ6P,EAAE7P,MACVmqE,EAAat6D,EAAEs6D,WACfwhC,EAAU97F,EAAE87F,QACZtiG,EAAOwG,EAAExG,KACTm+D,EAAO33D,EAAE23D,KACT5nE,EAAciQ,EAAEjQ,YAChB2oE,EAAc14D,EAAE04D,YAChBgE,EAAQ18D,EAAE08D,MACVlwE,EAAMwT,EAAExT,IACRmwE,EAAc38D,EAAE28D,YAChBlF,EAAMz3D,EAAEy3D,IACRhnE,EAAWuP,EAAEvP,SAwBbZ,EAAQmQ,EAAEnQ,MAAQ,WAClBjC,KAAKm9G,QAAQ5yG,MAAMvK,KAAMwK,YA4B7B4H,EAAEjL,MAAQ,SAASpB,EAAGC,EAAGF,GACrB,OAAO,IAAI7D,EAAM8D,EAAGC,EAAGF,IAG3BtD,EAAOP,EAAMa,UAAoD,CAK7DqJ,UAAW,GAMXgxG,QAAS,WACL,IAAI7+F,EAAO,GAAGhP,MAAML,KAAKzE,YAIrB+jE,EAASjwD,EAAK,KAAOA,EAAK,GAAG22D,YAC7Bj1E,KAAKiH,SAAWqX,EAAK4vB,SAEzBluC,KAAKs2E,KAAKh4D,EAAK,GAAIA,EAAK,KAM5Bg4D,KAAM,SAASigB,EAAaxuF,GAGxB,IAAIpB,EACA3B,EACAo0F,EAAgB7C,EAAY7uF,OAC5B01G,EAAkB7mB,EAAYzgB,aAAe,GAOjD,IAAK9wE,KALLuxF,EAAY7uF,OAAS,MACrBf,EAAUpE,EAAM+tE,EAAgBimB,IAIXzgB,YACjBnvE,EAAQmvE,YAAY9wE,GAAMoqF,QACtBguB,EAAgBp4G,IAChBzC,EAAM66G,EAAgBp4G,GAAMoqF,eAC3BzkB,EAIThkE,EAAQyoF,QAAQmH,YAAeA,EAAYpvF,OACnCovF,EAAYpvF,MAAMK,WAAa+uF,EAAYnH,QAAQmH,aACvDA,EAAYnH,QAEhBzoF,EAAQe,OAAS6uF,EAAY7uF,OAAS0xF,EACtCp5F,KAAKu2F,YAAcA,EAEnB,IAAI8mB,EAAe12G,EAAQQ,MAEvBm2G,EAAcD,EAAa9oC,OAE/Bv0E,KAAK2gB,OAAS,GACd3gB,KAAKiuF,QAAU,GAGfjuF,KAAKspC,OAAS,CACV5iC,EAAG,GACH9G,EAAG,IAGPI,KAAK+H,SAAWA,EAChB/H,KAAKy7G,WAAa,EAUlBz7G,KAAK2G,QAAUA,EAUf3G,KAAKg4F,KAAO,GASZh4F,KAAK0H,OAAS,GAyBd1H,KAAK0yG,mBAAqB2K,EAAaE,SA4BvC,IAAIp2G,EAAQnH,KAGZmH,EAAMtG,MAAQyM,EAAOtB,OAErBsB,EAAOxF,KAAKX,GACZiL,EAAEy4D,aAGEyyC,GACA5wC,EAAW4wC,GAAa,SAAStlG,EAAOmjE,GACpCj5E,EAASiF,EAAOg0E,EAAWnjE,MAUnC7Q,EAAM8wF,MAAQ,GAOd9wF,EAAMgjG,MAAQ,GAEdhjG,EAAMq2G,WAAar2G,EAAMs2G,aAAet2G,EAAMu2G,cAAgB,EAE9Dv2G,EAAMw2G,eAMVC,WAAY,SAASj3G,GACjB,IAGIe,EAFA21G,EADQr9G,KACa2G,QAAQQ,MAC7BnC,EAAO2B,EAAQ3B,MAAQq4G,EAAar4G,MAAQq4G,EAAatvB,kBAEzD8vB,EAAS/yC,EAAY9lE,GASzB,OANK64G,GACDzrG,EAAE/B,MAAM,IAAI,IAGhB3I,EAAS,IAAIm2G,GACNvnC,KAAKt2E,KAAM2G,GACXe,GAWXo2G,YAAa,SAASC,GAGlB,IAFA,IAAIr2G,EAAS1H,KAAK0H,OACd/H,EAAIo+G,GAAa,EACdp+G,EAAI+H,EAAOsE,OAAQrM,IAClB+H,EAAO/H,KACP+H,EAAO/H,GAAGkB,MAAQlB,EAClB+H,EAAO/H,GAAG2G,KAAOoB,EAAO/H,GAAG2G,MACvB,WAAaoB,EAAO/H,GAAGkB,MAAQ,KAY/C4xG,aAAc,SAASjM,EAAOC,EAAOhrB,GACjC,IAAIz5E,EAAIy5E,EAAWgrB,EAAQD,EACvBvlG,EAAIw6E,EAAW+qB,EAAQC,EAE3B,OAAOzkG,GAAK,GACRA,GAAKhC,KAAKkhG,WACVjgG,GAAK,GACLA,GAAKjB,KAAKmhG,YAelB/6B,OAAQ,SAAS7+D,GACb,IAMIy2G,EACAC,EAGAt+G,EACAihG,EAVA5I,EADQh4F,KACKg4F,KACbtwF,EAFQ1H,KAEO0H,OACfwC,EAHQlK,KAGQkK,QAChBukF,EAJQzuF,KAIOyuF,OACfyvB,EALQl+G,KAKay3G,cAGrB/E,EARQ1yG,KAQmB0yG,mBAC3BgF,EATQ13G,KASW03G,WAGnBtsG,EAZQpL,KAYSoL,SACjB+yG,EAAgB/yG,EAASm1E,WACzB69B,EAAc,GAkBlB,IAhCYp+G,KAiBFq+G,eAjBEr+G,KAkBFq+G,eAAc,GAGxBjsG,EAAE8gE,aAAa3rE,EArBHvH,MAuBRm+G,GAvBQn+G,KAwBFs+G,mBAxBEt+G,KA4BNu+G,eAGN5+G,EAAI+H,EAAOsE,OACJrM,KAGH,IAFAihG,EAAQl5F,EAAO/H,IAELgH,QAAQ63G,WACdR,GAAmB,EAEfpd,EAAMR,SAAS,CACf6d,GAAiB,EACjB,MAIZ,GAAIA,EAEA,IADAt+G,EAAI+H,EAAOsE,OACJrM,MACHihG,EAAQl5F,EAAO/H,IACLgH,QAAQ63G,WACd5d,EAAMR,SAAU,GAM5B7gG,EAAKmI,GAAQ,SAASk5F,GACdA,EAAMR,SAC2B,UAA7BQ,EAAMj6F,QAAQw0G,aACVva,EAAM6d,cACN7d,EAAM6d,eAEVP,GAAe,GAGnBtd,EAAM9D,aACN5nB,EAAU0rB,EAAO,kBAKrBsd,GAAgBzvB,EAAO9nF,QAAQc,UAE/BgnF,EAAOqG,SAxEC90F,KA0EFy3G,eAAgB,GAItBuG,GA9EQh+G,KA+EF0+G,YAINhM,GAEAnzG,EAAKy4F,GAAM,SAASp0B,GAChBA,EAAKi5B,cACLj5B,EAAKo8B,cAvFDhgG,KA2FN2+G,aAEFjM,IAEAnzG,EAAKy4F,GAAM,SAASp0B,GACZA,EAAKw8B,UACLsX,GAAa,MAKrBn4G,EAAKy4F,GAAM,SAASp0B,GAGhB,IAAI5vD,EAAM4vD,EAAK9xD,IAAM,IAAM8xD,EAAKnhE,IAC5BmhE,EAAKg7C,SAAW5qG,IAChB4vD,EAAKg7C,OAAS5qG,EACdoqG,EAAYt2G,MAAK,WACbotE,EAAUtR,EAAM,mBAAoBphE,EAAOohE,EAAKk9B,UAAWl9B,EAAK57D,uBACzD47D,EAAKk9B,eAGhB4W,GAAcsG,IACdp6C,EAAKwC,aAMbsxC,GAxHQ13G,KAyHF6+G,eAKV3pC,EA9HYl1E,KA8HK,WAGjBT,EAAKmI,GAAQ,SAASk5F,IACb8W,GAAc9W,EAAMR,UAAYQ,EAAMh5F,SACvCg5F,EAAMx6B,SAIVw6B,EAAM9D,aAAc,KAIpB5yF,GACAA,EAAQ66B,OAAM,GAIlB35B,EAASq1E,OAGTvL,EAnJYl1E,KAmJK,UACjBk1E,EApJYl1E,KAoJK,UAEbm+G,GAtJQn+G,KAuJFs+G,kBAAiB,GAI3B/+G,EAAK6+G,GAAa,SAASr2G,GACvBA,EAASkH,WAajBF,IAAK,SAASD,GAEV,IAAI88D,EAEAjsE,EADA+H,EAAS1H,KAAK0H,OAGlB,SAASo3G,EAASjwC,GACd,OAAOA,EAAK//D,KAAOA,GAAO+/D,EAAKloE,SAAWkoE,EAAKloE,QAAQmI,KAAOA,EAWlE,IARA88D,EAEI3mB,EAAKjlD,KAAKg4F,KAAM8mB,IAGhB75D,EAAKjlD,KAAK0H,OAAQo3G,GAGjBn/G,EAAI,GAAIisE,GAAOjsE,EAAI+H,EAAOsE,OAAQrM,IACnCisE,EAAM3mB,EAAKv9C,EAAO/H,GAAGusC,QAAU,GAAI4yE,GAGvC,OAAOlzC,GAMXmzC,QAAS,WACL,IAIIC,EAJA73G,EAAQnH,KACR2G,EAAU3G,KAAK2G,QACfs4G,EAAet4G,EAAQsxF,MAAQnpB,EAAMnoE,EAAQsxF,OAAS,IACtDinB,EAAev4G,EAAQwjG,MAAQr7B,EAAMnoE,EAAQwjG,OAAS,IAI1D5qG,EAAK0/G,GAAc,SAASr7C,EAAMjkE,GAC9BikE,EAAK/iE,MAAQlB,EACbikE,EAAK4yB,KAAM,KAGfj3F,EAAK2/G,GAAc,SAASt7C,EAAMjkE,GAC9BikE,EAAK/iE,MAAQlB,KAIjBq/G,EAAeC,EAAa9mG,OAAO+mG,GAEnC3/G,EAAKy/G,GAAc,SAASG,GACxB,IAAInqB,EAAK7tF,EAAOg4G,OAgBxBC,kBAAmB,WACf,IAAIlzE,EAAS,GAOb,OANA3sC,EAAKS,KAAK0H,QAAQ,SAASk5F,GAEvB10D,EAASA,EAAO/zB,OAAOm6D,EAAKsuB,EAAMphG,MAAQ,IAAI,SAAS+gB,GACnD,OAAOA,EAAM8+F,gBAGdnzE,GAiBXozE,kBAAmB,WACf,OAAOhtC,EAAKtyE,KAAK0H,QAAQ,SAASk5F,GAC9B,OAAOA,EAAMye,aAkBrBE,SAAU,SAAS7F,EAAc8F,EAAiBp5C,GAC9C,IAEIq5C,EACAC,EAHAv4G,EAAQnH,KACR2G,EAAUQ,EAAMR,QAIpB84G,EAAoB94G,EAAQpG,MAAQgC,EAGhC,CACI/B,MAAO,CACHhC,MAAO,UACPsF,SAAU6C,EAAQg5G,QAAU,OAAS,SAI7Ch5G,EAAQpG,MACRm5G,GAEJgG,EAAuB/4G,EAAQ4nF,SAAWhsF,EAGtC,CACI/B,MAAO,CACHhC,MAAO,YAIfmI,EAAQ4nF,SACRixB,GAIJjgH,EAAK,CACD,CAAC,QAASm6G,EAAc+F,GACxB,CAAC,WAAYD,EAAiBE,KAC/B,SAASnyC,EAAK5tE,GACb,IAAI2G,EAAOinE,EAAI,GACXhtE,EAAQ4G,EAAMb,GACdozG,EAAensC,EAAI,GACnBkyC,EAAoBlyC,EAAI,GAExBhtE,GAASm5G,IACTvyG,EAAMb,GAAQ/F,EAAQA,EAAM+H,WAG5Bm3G,GAAqBA,EAAkBn/G,OAASC,IAChD4G,EAAMb,GAAQa,EAAMiE,SAAS9K,KACrBm/G,EAAkBn/G,KAClB,EACA,EACAm/G,EAAkB95B,SAErBtlF,KAAK,CACFkE,MAAOk7G,EAAkBl7G,MACzB,MAAS,cAAgB+B,EACzBqD,OAAQ81G,EAAkB91G,QAAU,IAEvCmC,MAGL3E,EAAMb,GAAM2X,OAAS,SAASzc,GAC1B2F,EAAMo4G,UAAU5/G,GAAK6B,EAAG7B,GAAK6B,IAKjC2F,EAAMb,GAAMhE,IAAIm9G,EAAkBj/G,WAK1C2G,EAAMo3G,aAAan4C,IAOvBm4C,aAAc,SAASn4C,GACnB,IACIw5C,EADApc,EAAc,EAEdp4F,EAAWpL,KAAKoL,SAChBmhG,EAAavsG,KAAKusG,WAGtBhtG,EAAK,CAAC,QAAS,aAAa,SAASyU,GACjC,IAKI6rG,EALAt/G,EAAQP,KAAKgU,GACb0lG,EAAe15G,KAAK2G,QAAQqN,GAC5BurB,EAAiB,UAARvrB,GAAmB,EAE5B0lG,EAAa70G,cAAgB,EAAI2+F,EAAc,EAG/CjjG,IAEAs/G,EAAYnG,EAAal5G,MAAMsD,SAE/B+7G,EAAYz0G,EAASg3E,YAAYy9B,EAAWt/G,GAAOyF,EAEnDzF,EACK+B,IAAI,CACDwC,OAAQ40G,EAAa50G,OACjBynG,EAAWznG,MAAQ40G,EAAaprB,aAAe,OAEtD/pF,MAAM/B,EAAO,CACVvB,EAAGs+B,EAASsgF,GACbnG,IAAe,EAAO,cAExBA,EAAa4B,UAAa5B,EAAa70G,gBACxC2+F,EAAc3jG,KAAKipB,KACf06E,EAEAjjG,EAAM87E,QAAQq9B,EAAa/zB,SAASlhF,YAIjDzE,MAEH4/G,EAAmB5/G,KAAKwjG,cAAgBA,EACxCxjG,KAAKwjG,YAAcA,GAEdxjG,KAAK03G,YAAckI,IACpB5/G,KAAK03G,WAAakI,EAEd5/G,KAAKilG,aAAer5F,EAAKw6D,GAAQ,IAASpmE,KAAK03G,YAC/C13G,KAAKomE,WAQjB05C,aAAc,WACV,IACIzC,EADQr9G,KACa2G,QAAQQ,MAC7B+yG,EAAcmD,EAAav4G,MAC3Bi7G,EAAe1C,EAAa54G,OAC5BwC,EAJQjH,KAISiH,SAGhBs3D,EAAQ27C,KAPDl6G,KAQFggH,eAAiBrsC,EAAS1sE,EAAU,UAEzCs3D,EAAQwhD,KAVD//G,KAWFigH,gBAAkBtsC,EAAS1sE,EAAU,WAXnCjH,KAcN+G,WAAalH,KAAK4C,IACpB,EACAy3G,GAhBQl6G,KAgBaggH,gBAAkB,KAhB/BhgH,KAkBNgH,YAAcnH,KAAK4C,IACrB,EACA2P,EAAEu9D,eACEowC,EArBI//G,KAsBE+G,aAtBF/G,KAuBGigH,iBAAmB,MAYtC3B,iBAAkB,SAAS4B,GACvB,IACIC,EADAxwG,EAAO3P,KAAKiH,SAEhB,GAAKi5G,EAwBD,KAAOvwG,GAAQA,EAAKnP,OACZmP,EAAKywG,cACLhuG,EAAE9P,IAAIqN,EAAMA,EAAKywG,oBACVzwG,EAAKywG,aAEhBzwG,EAAOA,EAAK/G,gBA5BhB,KAAO+G,GAAQA,EAAKnP,OACyB,SAArCmzE,EAAShkE,EAAM,WAAW,KAC1BA,EAAKywG,YAAc,CACfh6G,QAASuJ,EAAKnP,MAAM4F,QACpB3B,OAAQkL,EAAKnP,MAAMiE,OACnB+iF,SAAU73E,EAAKnP,MAAMgnF,UAEzB24B,EAAY,CACR/5G,QAAS,QACTohF,SAAU,UAEV73E,IAAS3P,KAAKiH,WACdk5G,EAAU17G,OAAS,GAGvB2N,EAAE9P,IAAIqN,EAAMwwG,GACRxwG,EAAKnP,MAAM4P,aACXT,EAAKnP,MAAM4P,YAAY,UAAW,QAAS,cAGnDT,EAAOA,EAAK/G,YAgBxBy3G,aAAc,SAAS32G,GACnB1J,KAAKoI,UAAUsB,UAAY,yBAA2BA,GAAa,KAOvE42G,aAAc,WACV,IACIl4G,EAGArB,EACAC,EAGAu5G,EACAC,EAEAC,EATA95G,EAFQ3G,KAEQ2G,QAChB02G,EAAe12G,EAAQQ,MAGvBF,EANQjH,KAMSiH,SAIjBy5G,EAActuG,EAAE4jE,YAIf/uE,IAdOjH,KAeFiH,SAAWA,EAAWo2G,EAAap2G,UAGzCsnE,EAAStnE,KAlBDjH,KAmBFiH,SAAWA,EAAW+iE,EAAI22C,eAAe15G,IAI9CA,GACDmL,EAAE/B,MAAM,IAAI,GAQhBkwG,EAAgBx2C,EAAK1pE,EAAK4G,EAzBN,0BA2BhB6iE,EAASy2C,IACTjzG,EAAOizG,IACPjzG,EAAOizG,GAAetb,aAEtB33F,EAAOizG,GAAej4G,UAI1BjI,EAAK4G,EAnCe,wBAPRjH,KA0CwBa,OAGpCoG,EAASoB,UAAY,GAOhBg1G,EAAauD,WAAc35G,EAAS2D,aApD7B5K,KAqDFs+G,mBArDEt+G,KAyDN8/G,eACN/4G,EA1DY/G,KA0DO+G,WACnBC,EA3DYhH,KA2DQgH,YAIpBy5G,EAAiBj+G,EAAO,CACpBqE,SAAU,WACV2gF,SAAU,SAEV1iF,MAAOiC,EAAa,KACpBtC,OAAQuC,EAAc,KACtBm/E,UAAW,OACXtE,WAAY,SACZl4E,OAAQ,EACR,8BAA+B,iBAChC0zG,EAAa78G,OAWhB4H,EAAYhG,EACR,MAAO,CACH0M,GAAI4xG,GAERD,EACAx5G,GAzFQjH,KA2FNoI,UAAYA,EA3FNpI,KA8FN0zG,QAAUtrG,EAAU5H,MAAMiK,OAGhC+1G,EAAMpuG,EAAEirG,EAAajyG,WAAavI,EAjGtB7C,KAkGNoL,SAAW,IAAIo1G,EACjBp4G,EACArB,EACAC,EACA,KACAq2G,EAAa71G,UACbb,EAAQ5B,WAAa4B,EAAQ5B,UAAU+6E,WAxG/B9/E,KA4GNqgH,aAAahD,EAAa3zG,WA5GpB1J,KA8GNoL,SAASk1E,SAAS+8B,EAAa78G,OA9GzBR,KAkHNoL,SAAS65E,WAlHHjlF,KAkHsBa,OAQtC89G,WAAY,SAASkC,GACjB,IACI5yB,EADQjuF,KACQiuF,QAChBttE,EAFQ3gB,KAEO2gB,OACf6iF,EAHQxjG,KAGYwjG,YAHZxjG,KAKN8gH,eAGFtd,IAAgBjlC,EAAQ59C,EAAO,MARvB3gB,KASFohG,QAAUvhG,KAAK4C,IATbzC,KAUEohG,QACNoC,EAXIxjG,KAWgB2G,QAAQpG,MAAMogB,OAASstE,EAAQ,KAX/CjuF,KAgBFyuF,OAAOroF,SAhBLpG,KAiBFyuF,OAAO2sB,cAAcz6F,EAAQstE,GAjB3BjuF,KAqBF+gH,cArBE/gH,UAsBI+gH,YAAY/7G,OAtBhBhF,UAuBS+gH,YAAY/7G,OAAS,GAvB9BhF,KAuByC+gH,YAAY3hH,OAvBrDY,KAyBFghH,iBAzBEhhH,KA0BFohG,SA1BEphG,KA0BeghH,gBAEtBH,GACD7gH,KAAKihH,kBAIbA,eAAgB,WAEZ,IAAI95G,EAAQnH,KAER0jG,EAAav8F,EAAMu8F,WAAa,CAAC,EAAG,EAAG,EAAG,GAC1C/iF,EAASxZ,EAAMwZ,OAGfxZ,EAAMurG,oBACNnzG,EAAK4H,EAAM6wF,MAAM,SAASp0B,GAClBA,EAAKh8D,SACLg8D,EAAKs/B,eAMjB3jG,EAAKyrE,GAAa,SAASxhE,EAAG2pF,GACrB50B,EAAQ59C,EAAOwyE,MAChBhsF,EAAMqC,IAAMk6F,EAAWvQ,OAI/BhsF,EAAM+5G,gBAqBVC,OAAQ,SAAS93G,GACb,IAAIlC,EAAQnH,KACRq9G,EAAel2G,EAAMR,QAAQQ,MAC7BF,EAAWE,EAAMF,SACjBm6G,EAAe7iD,EAAQ8+C,EAAav4G,OACpCA,EAAQu4G,EAAav4G,OAAS6uE,EAAS1sE,EAAU,SACjDxC,EAAS44G,EAAa54G,QAAUkvE,EAAS1sE,EAAU,UACnDmD,EAASf,EAAIA,EAAEe,OAASy/D,EAIvBu3C,GACAj6G,EAAM2B,aACPhE,IACAL,GACC2F,IAAWy/D,GAAOz/D,IAAW4/D,IAG1BllE,IAAUqC,EAAM64G,gBAChBv7G,IAAW0C,EAAM84G,kBAEjBh2G,aAAa9C,EAAMk6G,eAGnBl6G,EAAMk6G,cAAgBtyC,GAAY,WAG1B5nE,EAAMiB,WACNjB,EAAMg5E,aAAQxV,OAAWA,GAAW,KAEzCthE,EAAI,IAAM,IAEjBlC,EAAM64G,eAAiBl7G,EACvBqC,EAAM84G,gBAAkBx7G,IAOhC68G,WAAY,WACR,IACIC,EADAp6G,EAAQnH,KAGZuhH,EAASr/G,EAAS2nE,EAAK,UAAU,SAASxgE,GACtClC,EAAMg6G,OAAO93G,MAEjBnH,EAASiF,EAAO,UAAWo6G,IAqC/BphC,QAAS,SAASr7E,EAAOL,EAAQ8C,GAC7B,IAEI4rE,EAFAhsE,EAAQnH,KACRoL,EAAWjE,EAAMiE,SAIrBjE,EAAMs0G,YAAc,EAGpBrpG,EAAE8gE,aAAa3rE,EAAWJ,GAE1BA,EAAMsrF,eAAiBtrF,EAAMH,YAC7BG,EAAMyrF,cAAgBzrF,EAAMJ,gBACd4jE,IAAV7lE,IACAqC,EAAMR,QAAQQ,MAAMrC,MAAQA,QAEjB6lE,IAAXlmE,IACA0C,EAAMR,QAAQQ,MAAM1C,OAASA,GAEjC0C,EAAM24G,iBAKN3sC,EAAkB/nE,EAAS+nE,iBACRsC,EAAUnzE,GAAK6E,EAAMiB,UAAW,CAC/CtD,MAAOqC,EAAMJ,WAAa,KAC1BtC,OAAQ0C,EAAMH,YAAc,MAC7BmsE,GAGHhsE,EAAM+5G,cAAa,GACnB91G,EAAS+0E,QAAQh5E,EAAMJ,WAAYI,EAAMH,YAAaO,GAGtDhI,EAAK4H,EAAM6wF,MAAM,SAASp0B,GACtBA,EAAKw8B,SAAU,EACfx8B,EAAKo8B,cAGT74F,EAAMswG,eAAgB,EACtBtwG,EAAMuwG,YAAa,EAEnBvwG,EAAMo3G,eACNp3G,EAAMw3G,aAENx3G,EAAMi/D,OAAO7+D,GAGbJ,EAAMsrF,eAAiB,KACvBvd,EAAU/tE,EAAO,UAIjB4nE,GAAY,WACJ5nE,GACA+tE,EAAU/tE,EAAO,YAAa,MAAM,WAChCA,EAAMs0G,YAAc,OAG7BroC,EAAWD,GAAiB5tD,WAOnC27F,aAAc,SAASL,GACnB,IAQIW,EACAC,EACApgB,EACAD,EACAF,EACAC,EACAugB,EAbAjmC,EADQz7E,KACSy7E,SACjBrwE,EAFQpL,KAESoL,SACjBrE,EAHQ/G,KAGW+G,WACnBC,EAJQhH,KAIYgH,YACpBq2G,EALQr9G,KAKa2G,QAAQQ,MAC7B8mF,EANQjuF,KAMQiuF,QAChB0V,EAPQ3jG,KAOW2jG,WASvB,SAASge,EAAexuB,GACpB,IAAI5zD,EAASokE,EAAWxQ,IAAS,EACjC,OAAOtzF,KAAK4C,IAAIi/G,GAAmBniF,EAAQA,GAAU,EAlB7Cv/B,KAqBNqhG,SAAWA,EAAWxhG,KAAKC,MArBrBE,KAqBiCqhG,UArBjCrhG,KAsBNohG,QAAUA,EAAUvhG,KAAKC,MAtBnBE,KAsB+BohG,SAtB/BphG,KAuBNkhG,UAAYA,EAAYrhG,KAAK4C,IAC/B,EACA5C,KAAKC,MAAMiH,EAAas6F,EAzBhBrhG,KAyBiC4hH,cAzBjC5hH,KA2BNmhG,WAAaA,EAAathG,KAAK4C,IACjC,EACA5C,KAAKC,MAAMkH,EAAco6F,EA7BjBphG,KA6BiC6hH,eA7BjC7hH,KAgCN8hH,UAAYrmC,EAAW0lB,EAAaD,EAhC9BlhG,KAiCN+hH,UAAYtmC,EAAWylB,EAAYC,EAjC7BnhG,KAmCN0hH,gBAAkBrE,EAAaqE,iBAAmB,EAnC5C1hH,KAsCNusG,WAAanhG,EAASmhG,WAAa,CACrCvqG,EAAGisF,EAAQ,GACXhtF,EAAGgtF,EAAQ,GACXnpF,MAAOiC,EAAaknF,EAAQ,GAAKA,EAAQ,GACzCxpF,OAAQuC,EAAcinF,EAAQ,GAAKA,EAAQ,IA1CnCjuF,KA4CNk2G,QAAU9qG,EAAS8qG,QAAU,CAC/Bl0G,EAAGq/F,EACHpgG,EAAGmgG,EACHt8F,MAAOo8F,EACPz8F,OAAQ08F,GAGZugB,EAAkB,EAAI7hH,KAAKwS,MAnDfrS,KAmD2B0hH,gBAAkB,GACzDF,EAAQ3hH,KAAKipB,KAAK64F,EAAe,IACjCF,EAAQ5hH,KAAKipB,KAAK64F,EAAe,IArDrB3hH,KAsDN+xG,QAAU,CACZ/vG,EAAGw/G,EACHvgH,EAAGwgH,EACH38G,MAAOjF,KAAKwS,MAzDJrS,KA0DE8hH,UACNH,EAAe,GACfH,GAEJ/8G,OAAQ5E,KAAK4C,IACT,EACA5C,KAAKwS,MAhEDrS,KAiEM+hH,UACNJ,EAAe,GACfF,KAKPZ,GACDthH,EAzEQS,KAyEGg4F,MAAM,SAASp0B,GACtBA,EAAKu8B,cACLv8B,EAAKq5B,yBAQjB6jB,aAAc,WACV,IAAI35G,EAAQnH,KACR0I,EAAevB,EAAMR,QAAQQ,MAGjC5H,EAAK,CAAC,SAAU,YAAY,SAAsB6K,GAC9C,IAAIhL,EAAQsJ,EAAa0B,GACrB+H,EAASg8D,EAAS/uE,GAASA,EAAQ,CAACA,EAAOA,EAAOA,EAAOA,GAE7DG,EAAK,CAAC,MAAO,QAAS,SAAU,SAAS,SAASyiH,EAAU7uB,GACxDhsF,EAAMiD,GAAQ+oF,GAAQvnF,EAClBlD,EAAa0B,EAAS43G,GACtB7vG,EAAOghF,UAOnB5zF,EAAKyrE,GAAa,SAASxhE,EAAG2pF,GAC1BhsF,EAAMqC,GAAKoC,EAAKzE,EAAMwZ,OAAOwyE,GAAOhsF,EAAM8mF,QAAQkF,OAEtDhsF,EAAMu8F,WAAa,CAAC,EAAG,EAAG,EAAG,GAC7Bv8F,EAAMw8F,WAAa,IAMvBkb,aAAc,WACV,IAQIoD,EAOAC,EACAC,EAfA9E,EADQr9G,KACa2G,QAAQQ,MAC7BiE,EAFQpL,KAESoL,SACjBrE,EAHQ/G,KAGW+G,WACnBC,EAJQhH,KAIYgH,YACpBo7G,EALQpiH,KAKgBoiH,gBACxBC,EANQriH,KAMeqiH,eACvBC,EAPQtiH,KAOWsiH,WAGnBC,EAVQviH,KAUYuiH,YACpBC,EAAuBnF,EAAajvB,gBACpCq0B,EAAsBpF,EAAaoF,oBACnCC,EAAsBrF,EAAaqF,oBAInCrhB,EAjBQrhG,KAiBSqhG,SACjBD,EAlBQphG,KAkBQohG,QAChBF,EAnBQlhG,KAmBUkhG,UAClBC,EApBQnhG,KAoBWmhG,WACnB+U,EArBQl2G,KAqBQk2G,QAChB37B,EAtBQv6E,KAsBSu6E,SACjBw3B,EAvBQ/xG,KAuBQ+xG,QAChB4Q,EAAO,UAGNP,IA3BOpiH,KA4BFoiH,gBAAkBA,EAAkBh3G,EAAS+V,OAC9C+4D,SAAS,yBACTpuE,MACL62G,EAAO,QAMXT,GADAD,EAAmB5E,EAAa7tB,aAAe,IACrB6tB,EAAaj/B,OAAS,EAAI,GAEpD+jC,EAAS,CACLx9G,KAAM69G,GAAwB,SAG9BP,GAAoBG,EAAgB,mBACpCD,EAAOv9G,OAASy4G,EAAalvB,YAC7Bg0B,EAAO,gBAAkBF,GAE7BG,EACK/hH,KAAK8hH,GACL/jC,OAAOi/B,EAAaj/B,QAEzBgkC,EAAgBO,GAAM,CAClB3gH,EAAGkgH,EAAM,EACTjhH,EAAGihH,EAAM,EACTp9G,MAAOiC,EAAam7G,EAAMD,EAAmB,EAC7Cx9G,OAAQuC,EAAck7G,EAAMD,EAAmB,EAC/CxgH,EAAG47G,EAAa50G,eAIpBk6G,EAAO,UACFN,IACDM,EAAO,OA9DC3iH,KA+DFqiH,eAAiBA,EAAiBj3G,EAAS+V,OAC5C+4D,SAAS,8BACTpuE,OAETu2G,EAAeM,GAAMzM,GAIrBmM,EACKhiH,KAAK,CACFsE,KAAM89G,GAAuB,SAEhCrkC,OAAOi/B,EAAauF,YAGrBF,IACKH,EASDA,EAAY9sC,QAAQygC,GAxFhBl2G,KAgFEuiH,YAAcn3G,EAAS84E,MACzBw+B,EACArhB,EACAD,EACAF,EACAC,GACFr1F,OAQLyuE,EAGDA,EAAS9E,QAAQ,CACb3wE,MAAOitG,EAAQjtG,MACfL,OAAQstG,EAAQttG,SAnGZzE,KA+FFu6E,SAAWnvE,EAASmvE,SAASw3B,GASvC4Q,EAAO,UACFL,IACDK,EAAO,OA1GC3iH,KA2GFsiH,WAAaA,EAAal3G,EAAS+V,OACpC+4D,SAAS,0BACT75E,KAAK,CACFsJ,OAAQ,IAEXmC,OAKTw2G,EAAWjiH,KAAK,CACZuE,OAAQy4G,EAAahvB,gBACrB,eAAgBgvB,EAAaqE,iBAAmB,EAChD/8G,KAAM,SAIV29G,EAAWK,GAAML,EAAW9nC,MAAM,CAC9Bx4E,EAAGq/F,EACHpgG,EAAGmgG,EACHt8F,MAAOo8F,EACPz8F,OAAQ08F,IACRmhB,EAAW7pC,gBAjIHz4E,KAoIN03G,YAAa,GAQvBmL,eAAgB,WACZ,IAEIC,EAEAnjH,EACAP,EALA+H,EAAQnH,KACRq9G,EAAel2G,EAAMR,QAAQQ,MAE7BiyF,EAAgBjyF,EAAMR,QAAQe,OAKlCnI,EAAK,CAAC,WAAY,UAAW,UAAU,SAASyU,GAc5C,IAXA8uG,EAAQh4C,EAAYuyC,EAAar4G,MAC7Bq4G,EAAatvB,mBAGjB3uF,EACIi+G,EAAarpG,IACZ8uG,GAASA,EAAMhgH,UAAUkR,GAI9BrU,EAAIy5F,GAAiBA,EAAcptF,QAC3B5M,GAASO,MACbmjH,EAAQh4C,EAAYsuB,EAAcz5F,GAAGqF,QACxB89G,EAAMhgH,UAAUkR,KACzB5U,GAAQ,GAKhB+H,EAAM6M,GAAO5U,MASrB2jH,WAAY,WACR,IAAI57G,EAAQnH,KACRgjH,EAAc77G,EAAMO,OAGxBnI,EAAKyjH,GAAa,SAASt7G,GACvBA,EAAOu7G,aAAaj3G,OAAS,KAIjCzM,EAAKyjH,GAAa,SAASt7G,GACvB,IAAIyvF,EAAWzvF,EAAOf,QAAQwwF,SAC1B5oB,EAAS4oB,KAELA,EADa,cAAbA,EACWhwF,EAAMO,OAAOA,EAAO7G,MAAQ,GAE5BsG,EAAM4H,IAAIooF,KAGTA,EAASuC,eAAiBhyF,IACtCyvF,EAAS8rB,aAAan7G,KAAKJ,GAC3BA,EAAOgyF,aAAevC,EACtBzvF,EAAOE,QAAUgE,EACblE,EAAOf,QAAQiB,QACfuvF,EAASxwF,QAAQiB,QACjBF,EAAOE,cAU3Bs7G,aAAc,WACV3jH,EAAKS,KAAK0H,QAAQ,SAASk5F,GACvBA,EAAMn5E,YACNm5E,EAAM9L,aAOdquB,aAAc,WACV,IAAIh8G,EAAQnH,KACRwuF,EAASrnF,EAAMR,QAAQ6nF,OACvBA,EAAOkd,OACPnsG,EAAKivF,EAAOkd,OAAO,SAAShoB,GACxB,IAAIljF,EAAQgC,EAAOgsF,EAAOhuF,MAAOkjF,EAAMljF,OACnCwB,EAAI+nE,EAAKvpE,EAAMwK,MAAQ7D,EAAMk6F,SAC7BpgG,EAAI8oE,EAAKvpE,EAAMsG,KAAOK,EAAMi6F,QAAU,UAGnC5gG,EAAMwK,YACNxK,EAAMsG,IAEbK,EAAMiE,SAAS9K,KACPojF,EAAMtmE,KACNpb,EACAf,GAEHZ,KAAK,CACFsJ,OAAQ,IAEXrH,IAAI9B,GACJsL,UASjBgpF,OAAQ,WACJ,IAIIsuB,EACAC,EACAC,EACAC,EANAvrB,EADQh4F,KACKg4F,KACb5sF,EAFQpL,KAESoL,SACjBzE,EAHQ3G,KAGQ2G,QAHR3G,KAUNu/G,WAVMv/G,KAcNyuF,OAAS,IAAIwoB,EAdPj3G,KAcqB2G,EAAQ8nF,QAd7BzuF,KAiBF0+G,WAjBE1+G,KAkBF0+G,YAlBE1+G,KAsBN2+G,YAAW,GAtBL3+G,KAuBNkhH,eAGNkC,EA1BYpjH,KA0BMkhG,UAClBmiB,EA3BYrjH,KA2BOmhG,WA3BPnhG,KA2B0BmhG,WAAa,GAGnD5hG,EAAKy4F,GAAM,SAASp0B,GAChBA,EAAKo8B,cA/BGhgG,KAiCNihH,iBAGNqC,EAAiBF,EApCLpjH,KAoCuBkhG,UAAY,IAC/CqiB,EAAeF,EArCHrjH,KAqCsBmhG,WAAa,MAE3CmiB,GAAkBC,KAElBhkH,EAAKy4F,GAAM,SAASp0B,IACXA,EAAKutB,OAASmyB,IAAqB1/C,EAAKutB,OAASoyB,IAClD3/C,EAAKi6B,iBAAgB,MA3CrB79F,KA8CF2+G,cA9CE3+G,KAkDN6+G,eAlDM7+G,KAsDF0yG,oBACNnzG,EAAKy4F,GAAM,SAASp0B,GACZA,EAAKh8D,SACLg8D,EAAKkxB,YAzDL90F,KA+DDwjH,cA/DCxjH,KAgEFwjH,YAAcp4G,EAAS3K,EAAE,gBAC1BJ,KAAK,CACFsJ,OAAQ,IAEXmC,OApEG9L,KAsENkjH,eAtEMljH,KAyENmjH,eAzEMnjH,KA4ENyjH,aA5EMzjH,KA+EFq+G,eA/EEr+G,KAgFFq+G,gBAhFEr+G,KAoFNilG,aAAc,GAWxBwe,WAAY,SAAS9zB,GACjB,IAAIxoF,EAAQnH,MAEZ2vF,EAAUptF,GAAM,EAAMvC,KAAK2G,QAAQgpF,QAASA,IAChCloF,UAAYzH,KAAK2vF,UAYzB3vF,KAAK2vF,QAAU3vF,KAAKoL,SAAS9K,KACrBqvF,EAAQrvF,MAAQN,KAAK0jH,YAAc,IACnC,EACA,GAEHxpC,SAAS,sBACTv5E,GAAG,SAAS,WACLgvF,EAAQ1P,OACRpW,EAAIhjD,SAASo5D,KAAO0P,EAAQ1P,SAGnC5/E,KAAK,CACFkE,MAAOorF,EAAQ9oF,SAAStC,MACxBoF,OAAQ,IAGXrH,IAAIqtF,EAAQnvF,OAEZsL,MACAvH,MAAMorF,EAAQ9oF,UAGnB7G,KAAK2vF,QAAQ1xE,OAAS,SAAStX,GAC3BQ,EAAMwoF,QAAUxoF,EAAMwoF,QAAQrnF,UAC9BnB,EAAMs8G,WAAW98G,MAe7B2B,QAAS,WACL,IAII3I,EAJAwH,EAAQnH,KACRg4F,EAAO7wF,EAAM6wF,KACbtwF,EAASP,EAAMO,OACfU,EAAYjB,EAAMiB,UAElBQ,EAAaR,GAAaA,EAAUQ,WAoBxC,IAjBAssE,EAAU/tE,EAAO,WAGbA,EAAMiE,SAAS5D,UACf4K,EAAEw8D,MAAMthE,EAAQnG,GAEhBmG,EAAOnG,EAAMtG,YAAS8pE,EAE1Bv4D,EAAEy4D,aACF1jE,EAAMF,SAASgU,gBAAgB,yBAG/B9Y,EAAYgF,GAIZxH,EAAIq4F,EAAKhsF,OACFrM,KACHq4F,EAAKr4F,GAAKq4F,EAAKr4F,GAAG2I,UAUtB,IANItI,KAAK2jH,UAAY3jH,KAAK2jH,SAASr7G,SAC/BtI,KAAK2jH,SAASr7G,UAIlB3I,EAAI+H,EAAOsE,OACJrM,KACH+H,EAAO/H,GAAK+H,EAAO/H,GAAG2I,UAI1B/I,EAAK,CACD,QAAS,WAAY,kBAAmB,iBACxC,cAAe,aAAc,cAAe,WAAY,UACxD,UAAW,gBAAiB,SAAU,kBAAmB,UACzD,aACD,SAAS+G,GACR,IAAImlE,EAAOtkE,EAAMb,GAEbmlE,GAAQA,EAAKnjE,UACbnB,EAAMb,GAAQmlE,EAAKnjE,cAKvBF,IACAA,EAAUC,UAAY,GACtBlG,EAAYiG,GACRQ,GACAvG,EAAe+F,IAMvBskE,EAAWvlE,GAAO,SAASwlE,EAAK34D,UACrB7M,EAAM6M,OAUrB4vG,gBAAiB,WACb,IAAIz8G,EAAQnH,KAGZ,SAAMpB,GAAQirE,GAAOA,EAAI/iE,KAA0B,aAAnBkjE,EAAItzC,aAChCszC,EAAI2K,YAAY,sBAAsB,WAClC3K,EAAI8K,YAAY,qBAAsB3tE,EAAMw2G,aACrB,aAAnB3zC,EAAItzC,YACJvvB,EAAMw2G,iBAGP,KAQfA,YAAa,WACT,IAAIx2G,EAAQnH,KACR2G,EAAUQ,EAAMR,QAGfQ,EAAMy8G,oBAKXz8G,EAAMm5G,eAGNprC,EAAU/tE,EAAO,QAGjBA,EAAM25G,eACN35G,EAAM+5G,eAGN/5G,EAAM07G,iBAGN17G,EAAM43G,UAGNx/G,EAAKoH,EAAQe,QAAU,IAAI,SAASm8G,GAChC18G,EAAMy2G,WAAWiG,MAGrB18G,EAAM47G,aAKN7tC,EAAU/tE,EAAO,gBAGb+mG,IACA/mG,EAAM+C,QAAU,IAAIgkG,EAAQ/mG,EAAOR,IAGvCQ,EAAM2tF,UAGD3tF,EAAMiE,SAAS80E,UAAY/4E,EAAMovB,QAClCpvB,EAAMovB,SAIVpvB,EAAMm3G,kBAAiB,KAO3B/nF,OAAQ,WAGJh3B,EAAK,CAACS,KAAK+H,UAAUoQ,OAAOnY,KAAKmM,YAAY,SAAS6iE,GAC9CA,QAAqBrE,IAAf3qE,KAAKa,OACXmuE,EAAGzkE,MAAMvK,KAAM,CAACA,SAErBA,MAEHk1E,EAAUl1E,KAAM,QAChBk1E,EAAUl1E,KAAM,UAIZu+D,EAAQv+D,KAAKa,SAAwC,IAA9Bb,KAAK2G,QAAQQ,MAAMg6G,QAC1CnhH,KAAKshH,aAITthH,KAAKu2B,OAAS,QAr2D1B,CA02DEx1B,GACD,SAASA,GAMN,IAAI8kC,EACAzzB,EAAIrR,EAEJxB,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACXosE,EAAQx8D,EAAEw8D,MACVsG,EAAY9iE,EAAE8iE,UACdtpD,EAASxZ,EAAEwZ,OACXpW,EAAUpD,EAAEoD,QACZs0D,EAAW13D,EAAE03D,SACbl+D,EAAOwG,EAAExG,KACTzJ,EAAciQ,EAAEjQ,YAWpBpB,EAAW8kC,MAAQA,EAAQ,aAC3B9kC,EAAW8kC,MAAM/iC,UAAY,CAUzBwzE,KAAM,SAAS5uE,EAAQf,EAAS3E,GAE5B,IACIiqF,EAEAugB,EADAsX,EAAap8G,EAAOP,MAAMR,QAAQQ,MAAM28G,WAyC5C,OA3CY9jH,KAYN0H,OAASA,EAZH1H,KAqBNxB,MAAQkJ,EAAOlJ,MArBTwB,KAuBN+jH,aAAap9G,EAAS3E,GAExB0F,EAAOf,QAAQq9G,cAEf/3B,EAASvkF,EAAOf,QAAQslF,QAAUvkF,EAAOP,MAAMR,QAAQslF,OA3B/CjsF,KA4BFxB,MA5BEwB,KA4BYxB,OAASytF,EAAOvkF,EAAO+1G,cAC3CqG,EAAa73B,EAAOjgF,OAEpBwgG,EAAa9kG,EAAO+1G,aACpB/1G,EAAO+1G,eAEH/1G,EAAO+1G,eAAiBqG,IACxBp8G,EAAO+1G,aAAe,IAG1BjR,EAAa9kG,EAAO8kG,WAtCZxsG,KAwCNwsG,WAAa5gG,EAxCP5L,KAwCkBwsG,WAAYA,GAE1C9kG,EAAOP,MAAMq2G,aA1CDx9G,MAqDhB+jH,aAAc,SAASp9G,EAAS3E,GAC5B,IACI0F,EADQ1H,KACO0H,OACfu8G,EAAcv8G,EAAOf,QAAQs9G,aAAev8G,EAAOu8G,YAwCvD,OAtCAt9G,EAAUk/B,EAAM/iC,UAAUohH,gBAAgBj1G,KAAKjP,KAAM2G,GAGrDnE,EAPYxC,KAOE2G,GAPF3G,KAQN2G,QARM3G,KAQU2G,QAAUnE,EARpBxC,KAQiC2G,QAASA,GAAWA,EAG7DA,EAAQyT,cAXApa,KAYKoa,MAIb6pG,IAhBQjkH,KAiBFiB,EAjBEjB,KAiBQikH,IAjBRjkH,KAmBNmkH,OAASv4G,EAnBH5L,KAoBFokH,UApBEpkH,KAoBgBokH,UACZ,OArBJpkH,KAqBFgC,IAAe8nE,EArBb9pE,KAqB4BiB,GAAG,IArB/BjB,KAyBFq/G,WAzBEr/G,KA0BF6jF,MAAQ,UAKd,SA/BQ7jF,WA+BiB2qE,IAAN3oE,GAAmB0F,EAAOuwF,OAASvwF,EAAOuwF,MAAMnB,WA/B3D92F,KAgCFgC,EAAI0F,EAAOuwF,MAAMsE,QAhCfv8F,YAkCI2qE,IAlCJ3qE,KAkCFgC,GAAmB0F,IAlCjB1H,KAoCEgC,OADA2oE,IAAN3oE,EACU0F,EAAOk1F,cApCb58F,MAsCMgC,GAtCNhC,MAgDhBkkH,gBAAiB,SAASv9G,GACtB,IAKI09G,EALAz4C,EAAM,GACNlkE,EAAS1H,KAAK0H,OACdoM,EAAOpM,EAAOf,QAAQmN,KACtBwwG,EAAgBxwG,GAAQpM,EAAO48G,eAAiB,CAAC,KACjDC,EAAaD,EAAct4G,OAE3BrM,EAAI,EACJiC,EAAI,EAER,GAAIkoE,EAASnjE,IAAwB,OAAZA,EACrBilE,EAAI04C,EAAc,IAAM39G,OAErB,GAAI6O,EAAQ7O,GAWf,KATKmN,GAAQnN,EAAQqF,OAASu4G,IAEJ,WADtBF,SAAuB19G,EAAQ,IAE3BilE,EAAItlE,KAAOK,EAAQ,GACM,WAAlB09G,IACPz4C,EAAI5pE,EAAI2E,EAAQ,IAEpBhH,KAEGiC,EAAI2iH,GACFzwG,QAAuB62D,IAAfhkE,EAAQhH,KACjBisE,EAAI04C,EAAc1iH,IAAM+E,EAAQhH,IAEpCA,IACAiC,QAEsB,iBAAZ+E,IACdilE,EAAMjlE,EAIFA,EAAQ69G,aACR98G,EAAO+8G,iBAAkB,GAIzB99G,EAAQyxG,SACR1wG,EAAOg9G,kBAAmB,IAGlC,OAAO94C,GAOX+4C,aAAc,WACV,MAAO,oBACF3kH,KAAKq/G,SAAW,2BAA6B,KAC7Cr/G,KAAK+7B,SAAW,uBAAyB,KACzC/7B,KAAKmkH,OAAS,yBAA2B,UACrBx5C,IAApB3qE,KAAKwsG,WAA2B,qBAC7BxsG,KAAKwsG,WAAa,KACrBxsG,KAAK2G,QAAQ+C,UAAY,IAAM1J,KAAK2G,QAAQ+C,UAAY,KACxD1J,KAAK4kH,MAAQ5kH,KAAK4kH,KAAKl7G,UAAY,IAChC1J,KAAK4kH,KAAKl7G,UAAUnB,QAAQ,sBAAuB,IAAM,KAMrEs8G,QAAS,WACL,IAIID,EAJAl9G,EAAS1H,KAAK0H,OACdo9G,EAAQp9G,EAAOo9G,MACfC,EAAWr9G,EAAOq9G,UAAY,IAC9BplH,EAAI,EAIR,IADAilH,EAAOE,EAAMnlH,GACNK,KAAK+kH,IAAaH,EAAKxlH,OAC1BwlH,EAAOE,IAAQnlH,GAOnB,OAJIilH,GAAQA,EAAKpmH,QAAUwB,KAAK2G,QAAQnI,QACpCwB,KAAKxB,MAAQomH,EAAKpmH,OAGfomH,GAMXt8G,QAAS,WACL,IAIImjE,EAFAtkE,EAFQnH,KACO0H,OACAP,MACfmpG,EAAcnpG,EAAMmpG,YA2BxB,IAAK7kC,KAxBLtkE,EAAMq2G,aAEFlN,IARQtwG,KASF+J,WACN6kE,EAAM0hC,EAVEtwG,MAWHswG,EAAYtkG,SACb7E,EAAMmpG,YAAc,OAZhBtwG,OAgBEmH,EAAMkpG,YAhBRrwG,KAiBFwxG,cAjBExxG,KAqBFumG,SArBEvmG,KAqBeglH,aACvB7iH,EAtBQnC,WAuBFilH,mBAvBEjlH,KA0BF63G,YACN1wG,EAAMsnF,OAAOuqB,YA3BLh5G,gBA+BFyrE,GAAQ,MAStBw5C,gBAAiB,WAKb,IAJA,IAEIx5C,EADAr/D,EAAQ,CAAC,UAAW,YAAa,iBAAkB,YAAa,eAEhEzM,EAAI,EACDA,KAJKK,KAKRyrE,EAAOr/D,EAAMzM,MALLK,KAOEyrE,GAPFzrE,KAOgByrE,GAAMnjE,YAQtC8jG,eAAgB,WACZ,MAAO,CACHpqG,EAAGhC,KAAKqsG,SACRprG,EAAGjB,KAAKiB,EACRzC,MAAOwB,KAAKxB,MACZguG,WAAYxsG,KAAKwsG,WACjBx4F,IAAKhU,KAAKsG,MAAQtG,KAAKqsG,SACvB3kG,OAAQ1H,KAAK0H,OACb6Y,MAAOvgB,KACPklH,WAAYllH,KAAKklH,WACjBzlH,MAAOO,KAAKP,OAASO,KAAKmlH,aASlClX,iBAAkB,SAASve,GAGvB,IAAIhoF,EAAS1H,KAAK0H,OACd09G,EAAuB19G,EAAOykG,eAC9BkZ,EAAgBz5G,EAAKw5G,EAAqBC,cAAe,IACzDC,EAAcF,EAAqBE,aAAe,GAClDC,EAAcH,EAAqBG,aAAe,GAWtD,OARAhmH,EAAKmI,EAAO48G,eAAiB,CAAC,MAAM,SAAStwG,GACzCA,EAAM,UAAYA,GACdsxG,GAAeC,KACf71B,EAAcA,EAAYnnF,QAAQyL,EAAM,IAAKsxG,EAActxG,EAAM,IAAMuxG,IAE3E71B,EAAcA,EAAYnnF,QAAQyL,EAAM,IAAKA,EAAM,MAAQqxG,EAAgB,SAGxEz5F,EAAO8jE,EAAa,CACvBnvE,MAAOvgB,KACP0H,OAAQ1H,KAAK0H,UAUrBupG,eAAgB,SAAS91B,EAAW2lB,EAAW1rB,GAC3C,IAAI70D,EAAQvgB,KAERo5F,EADSp5F,KAAK0H,OACSf,SAGvByyF,EAAc74E,MAAMg0D,OAAO4G,IAAe56D,EAAM5Z,SAAW4Z,EAAM5Z,QAAQ4tE,QAAUh0D,EAAM5Z,QAAQ4tE,OAAO4G,KACxGn7E,KAAKwlH,eAIS,UAAdrqC,GAAyBie,EAAcqsB,mBACvCrwC,EAAkB,SAASp9D,GAEnBuI,EAAMxgB,QACNwgB,EAAMxgB,OAAO,KAAMiY,EAAM0tG,SAAW1tG,EAAM2tG,SAAW3tG,EAAM6Q,YAKvEqsD,EAAUl1E,KAAMm7E,EAAW2lB,EAAW1rB,IAW1CxtE,SAAS,GAjXjB,CA8ZE7G,GACD,SAASqR,GAMN,IAAIlQ,EAAWkQ,EAAElQ,SACbkxE,EAAahhE,EAAEghE,WACfP,EAAWzgE,EAAEygE,SACbD,EAAWxgE,EAAEwgE,SACbL,EAAengE,EAAEmgE,aACjBriE,EAAOkC,EAAElC,KACTogE,EAAiBl+D,EAAEk+D,eACnBuf,EAAqBz9E,EAAEy9E,mBACvBtxB,EAAUnsD,EAAEmsD,QACZh/D,EAAO6S,EAAE7S,KACTqvE,EAAQx8D,EAAEw8D,MACVpsE,EAAS4P,EAAE5P,OACX0yE,EAAY9iE,EAAE8iE,UACd5C,EAAOlgE,EAAEkgE,KACT98D,EAAUpD,EAAEoD,QACZs0D,EAAW13D,EAAE03D,SACbyE,EAAWn8D,EAAEm8D,SACbouC,EAAoBvqG,EAAEuqG,kBACtBp6G,EAAQ6P,EAAE7P,MACVmqE,EAAat6D,EAAEs6D,WACf9gE,EAAOwG,EAAExG,KACTi6B,EAAQzzB,EAAEyzB,MACV1jC,EAAciQ,EAAEjQ,YAChB2sE,EAAQ18D,EAAE08D,MACVkI,EAAa5kE,EAAE4kE,WACfjI,EAAc38D,EAAE28D,YAChBlF,EAAMz3D,EAAEy3D,IAiDZz3D,EAAEwzG,OAASxzG,EAAEwjE,WAAW,OAAQ,KAAM,CAKlCmgB,UAAW,EAGX0vB,kBAAkB,EAClB99G,cAAc,EACdJ,UAAW,CACPge,SAAU,KAKdgvD,OAAQ,GAGR6jC,OAAQ,CAEJriB,UAAW,EACXD,UAAW,UAKXh3F,OAAQ,EACRyM,OAAQ,CACJC,MAAO,CACHjE,UAAW,CACPge,SAAU,IAEd9d,SAAS,EACTo+G,WAAY,EAEZC,cAAe,GAInB/lH,OAAQ,CACJgmH,UAAW,UACXjwB,UAAW,UACXC,UAAW,KAKvBx1E,MAAO,CACHg0D,OAAQ,IAEZiwC,WAAY,CACRjgH,MAAO,SAGP2xF,UAAW,WACP,OAAkB,OAAXl2F,KAAKiB,EAAa,GAAKmR,EAAEoyB,aAAaxkC,KAAKiB,GAAI,IAG1DT,MAAO,CACHsD,SAAU,OACV8/E,WAAY,OACZplF,MAAO,WACP85E,YAAa,gBAOjBzzE,cAAe,SACf7C,EAAG,EACHf,EAAG,EAEH2C,QAAS,GAIboiH,cAAe,IACf5oB,WAAY,EAIZrE,eAAe,EACfxtF,OAAQ,CACJC,MAAO,CAEHjE,UAAW,CACPge,SAAU,IAEdugG,cAAe,EACf1N,OAAQ,GAIR6N,KAAM,CACFlwG,KAAM,GAENq5D,QAAS,MAIjBrvE,OAAQ,CACJq4G,OAAQ,KAGhBzH,gBAAgB,EAShBuV,eAAgB,IAEhBzW,mBAAoB,KAEqB,CACzC8B,aAAa,EACbx7B,WAAYlwC,EACZsgF,QAAQ,EACRzpB,gBAAgB,EAChB0S,aAAa,EACbgX,UAAW,CAAC,QAAS,SACrB3I,aAAc,EAEd4I,eAAgB,CAAC,IAAK,KACtB3vB,KAAM,SACNpgB,KAAM,SAASnvE,EAAOR,GAClB,IACI4tE,EAEA+xC,EAHA5+G,EAAS1H,KAETgjH,EAAc77G,EAAMO,OAUxBA,EAAOP,MAAQA,EAoBfO,EAAOf,QAAUA,EAAUe,EAAOkoF,WAAWjpF,GAC7Ce,EAAOu7G,aAAe,GAGtBv7G,EAAO6+G,WAGP/jH,EAAOkF,EAAQ,CASXpB,KAAMK,EAAQL,KACdu9E,MAAO,GAUPj8E,SAA6B,IAApBjB,EAAQiB,QASjBy3G,UAA+B,IAArB14G,EAAQ04G,WAItB9qC,EAAS5tE,EAAQ4tE,OAEjB7H,EAAW6H,GAAQ,SAASv8D,EAAOmjE,GAC/Bj5E,EAASwF,EAAQyzE,EAAWnjE,OAG3Bu8D,GAAUA,EAAO/nE,OAEd7F,EAAQ4Z,OACR5Z,EAAQ4Z,MAAMg0D,QACd5tE,EAAQ4Z,MAAMg0D,OAAO/nE,OAEzB7F,EAAQ8+G,oBAERt+G,EAAM0uG,iBAAkB,GAG5BnuG,EAAO8+G,WACP9+G,EAAO++G,YAGPlnH,EAAKmI,EAAO2+G,gBAAgB,SAASryG,GACjCtM,EAAOsM,EAAM,QAAU,MAE3BtM,EAAOg/G,QAAQ//G,EAAQnH,MAAM,GAGzBkI,EAAO6pG,cACPpqG,EAAMurG,oBAAqB,GAK3BsQ,EAAYh3G,SACZs6G,EAAatD,EAAYA,EAAYh3G,OAAS,IAElDtE,EAAOi/G,GAAK/6G,EAAK06G,GAAcA,EAAWK,IAAK,GAAK,EAGpDx/G,EAAM22G,YAAY99G,KAAKqd,OAAO2lG,KAUlC3lG,OAAQ,SAASupG,GACb,IACIjnH,EADAknH,EAAc7mH,KAAK2G,QAAQ9F,MAI/B,GAAIipE,EAAS+8C,GAAc,CAEvB,IADAlnH,EAAIinH,EAAW56G,OACRrM,KAEH,GAAIknH,GACAj7G,EAAKg7G,EAAWjnH,GAAGgH,QAAQ9F,MAAO+lH,EAAWjnH,GAAGgnH,IAAK,CACrDC,EAAW1jE,OAAOvjD,EAAI,EAAG,EAAGK,MAC5B,OAGG,IAAPL,GACAinH,EAAWlnE,QAAQ1/C,MAEvBL,GAAQ,OAIRinH,EAAW9+G,KAAK9H,MAEpB,OAAO4L,EAAKjM,EAAGinH,EAAW56G,OAAS,IAWvCu6G,SAAU,WACN,IAGIpH,EAHAz3G,EAAS1H,KACTo5F,EAAgB1xF,EAAOf,QACvBQ,EAAQO,EAAOP,MAInB5H,EAAKmI,EAAO0+G,WAAa,IAAI,SAASU,GAGlCvnH,EAAK4H,EAAM2/G,IAAO,SAASljD,GACvBu7C,EAAcv7C,EAAKj9D,SAKfyyF,EAAc0tB,KAAU3H,EAAYt+G,YAER8pE,IAAxByuB,EAAc0tB,IACd1tB,EAAc0tB,KAAU3H,EAAYrwG,SAGZ67D,IAAxByuB,EAAc0tB,IACQ,IAAtB3H,EAAYt+G,SAKhB6G,EAAO2V,OAAOumD,EAAKl8D,QAmBnBA,EAAOo/G,GAAQljD,EAGfA,EAAKw8B,SAAU,MAKlB14F,EAAOo/G,IAASp/G,EAAOq/G,eAAiBD,GACzC10G,EAAE/B,MAAM,IAAI,OAaxB22G,qBAAsB,SAASzmG,EAAO5gB,GAClC,IAAI+H,EAAS6Y,EAAM7Y,OACf4W,EAAO9T,UACPwkE,EAAKlF,EAASnqE,GAEd,SAASqU,GACL,IAAI24D,EAAc,MAAR34D,GAAetM,EAAOu/G,QAC5Bv/G,EAAOu/G,QAAQ1mG,GACfA,EAAMvM,GACVtM,EAAOsM,EAAM,QAAQrU,GAAKgtE,GAI9B,SAAS34D,GACL/D,MAAMnN,UAAUnD,GAAG4K,MACf7C,EAAOsM,EAAM,QACb/D,MAAMnN,UAAUwM,MAAML,KAAKqP,EAAM,KAI7C/e,EAAKmI,EAAO2+G,eAAgBr3C,IAQhC4tB,cAAe,WAEX,IAEIv9D,EACA6nF,EAHAvgH,EAAU3G,KAAK2G,QACfu1F,EAAal8F,KAAKk8F,WAGlBirB,EAAoBxgH,EAAQwgH,kBAgChC,OA9BAjrB,EAAatwF,EAAKswF,EAAYv1F,EAAQygH,WAAY,GAElDpnH,KAAKknH,cAAgBA,EAAgBt7G,EACjC5L,KAAKknH,cACLvgH,EAAQugH,cACR,GAIAC,IACA9nF,EAAO,IAAInvB,EAAKgsF,GAEU,QAAtBirB,EACA9nF,GAAQA,EAAKnvB,EAAKs3F,WACdnoE,EAAKnvB,EAAKygE,aAAeu2C,GAEA,UAAtBC,EACP9nF,GAAQA,EAAKnvB,EAAKu3F,YACdpoE,EAAKnvB,EAAK0gE,cAAgBs2C,GAED,SAAtBC,IACP9nF,GAAQA,EAAKnvB,EAAKw3F,eACdroE,EAAKnvB,EAAK4gE,iBAAmBo2C,IAGrCA,EAAgB7nF,EAAO68D,GAI3Bl8F,KAAKk8F,WAAaA,EAAagrB,EACxBhrB,GAOXtM,WAAY,SAASy3B,GACjB,IAMI1gH,EACAm+G,EAPA39G,EAAQnH,KAAKmH,MACbuB,EAAevB,EAAMR,QACrBmvE,EAAcptE,EAAaotE,YAE3BsnC,GADcj2G,EAAMovF,aAAe,IACLzgB,aAAe,GAC7CwxC,EAAcxxC,EAAY91E,KAAKgF,MAgFnC,OA5EAhF,KAAKu2F,YAAc8wB,EAOnB1gH,EAAUpE,EACN+kH,EACAxxC,EAAYpuE,OACZ2/G,GAQJrnH,KAAKmsG,eAAiB5pG,EAClB+tE,EAAe8e,QACf9e,EAAewF,YAAYpuE,QAC3B4oE,EAAewF,YAAYpuE,OAAO0nF,QAClC9e,EAAewF,YAAY91E,KAAKgF,MAAMoqF,QACtC1mF,EAAa0mF,QAAQmH,YACrBzgB,EAAYpuE,QAAUouE,EAAYpuE,OAAO0nF,QACzCtZ,EAAY91E,KAAKgF,MAAMoqF,QACvBi4B,EAAYj4B,SAKhBpvF,KAAK2wG,eAAiB/kG,EAClBy7G,EAAY1W,eACZyM,EAAgBp9G,KAAKgF,OACrBo4G,EAAgBp9G,KAAKgF,MAAM2rG,eAC3ByM,EAAgB11G,QAAU01G,EAAgB11G,OAAOipG,kBAE7C3wG,KAAKmsG,eAAe3C,QAAWxpG,KAAKs8F,kBAEpC31F,EAAQgqG,gBAKW,OAAvB2W,EAAYlP,eACLzxG,EAAQyxG,OAInBp4G,KAAK+kH,SAAWp+G,EAAQo+G,SACxBD,EAAQ9kH,KAAK8kH,OAASn+G,EAAQm+G,OAAS,IAAIx1G,SAEtC3I,EAAQ4gH,gBAAiB5gH,EAAQ6gH,mBACjC7gH,EAAQm+G,OAETA,EAAMh9G,KAAK,CACP1I,MAAOuH,EAAQ3G,KAAK+kH,SAAW,cAC3Bp+G,EAAQm1D,WACR,EACJpyD,UAAW,sBAEXlL,MAAOmI,EAAQ4gH,cACfxB,UAAWp/G,EAAQ6gH,oBAIvB1C,EAAM94G,QACFuyD,EAAQumD,EAAMA,EAAM94G,OAAS,GAAG5M,QAChC0lH,EAAMh9G,KAAK,CAEPtJ,MAAOwB,KAAKxB,MACZunH,UAAW/lH,KAAK+lH,YAKrBp/G,GAGX8gH,UAAW,SAASh8C,EAAMrsE,EAAOsoH,GAC7B,IAAI/nH,EASAgoH,EARAxgH,EAAQnH,KAAKmH,MACbovF,EAAcv2F,KAAKu2F,YACnBqxB,EAAYn8C,EAAO,QACnBo8C,EAAcp8C,EAAO,UACrBuC,EAAM05C,EAAWA,EAAS17G,OAASJ,EAC/BzE,EAAMR,QAAQQ,MAAMskE,EAAO,SAC3BtkE,EAAMskE,EAAO,UAIhBrsE,IAGDuoH,EAAU/7G,EACN2qF,EAAYqxB,GACZrxB,EAAY,IAAMqxB,IAElBrpD,EAAQopD,GACRhoH,EAAIgoH,GAGCxgH,EAAMO,OAAOsE,SACd7E,EAAM0gH,GAAe,GAEzBtxB,EAAY,IAAMqxB,GAAajoH,EAAIwH,EAAM0gH,GAAe75C,EACxD7mE,EAAM0gH,IAAgB,GAEtBH,IACAtoH,EAAQsoH,EAAS/nH,UAIfgrE,IAANhrE,IACAK,KAAK4nH,GAAajoH,GAEtBK,KAAKyrE,GAAQrsE,GAOjBonH,SAAU,WACFxmH,KAAK2G,QAAQq9G,aAGbhkH,KAAK2G,QAAQnI,MAAQ,KAErBwB,KAAKynH,UACD,QACAznH,KAAK2G,QAAQnI,OAASqxF,EAAmB7vF,KAAKgF,MAAMxG,MACpDwB,KAAKmH,MAAMR,QAAQslF,SAQ/Bw6B,UAAW,WACP,IAAIqB,EAAqB9nH,KAAK2G,QAAQyxG,OAEtCp4G,KAAKynH,UACD,SACAK,EAAmBziH,OACnBrF,KAAKmH,MAAMR,QAAQ5D,UAI3Bu3G,iBAAkBqC,EAAkBG,eAsCpC4J,QAAS,SAASlnH,EAAM4mE,EAAQ7+D,EAAWwgH,GACvC,IAGIC,EAKAroH,EAEAsoH,EAVAvgH,EAAS1H,KACTkoH,EAAUxgH,EAAOwkC,OACjBi8E,EAAiBD,GAAWA,EAAQl8G,QAAW,EAE/CrF,EAAUe,EAAOf,QACjBQ,EAAQO,EAAOP,MACfihH,EAAa,KACbnwB,EAAQvwF,EAAOuwF,MAEfiuB,EAAiBv/G,EAAQu/G,eAEzBjtB,EAAQj5F,KAAKi5F,MACbovB,EAAQroH,KAAKqoH,MACb/D,EAAgB58G,EAAO48G,cACvBC,EAAaD,GAAiBA,EAAct4G,OAQhD,GALAg8G,GADAxoH,EAAOA,GAAQ,IACGwM,OAClBo6D,EAASx6D,EAAKw6D,GAAQ,IAKD,IAAjB2hD,GACAC,GACAG,IAAkBH,IACjBtgH,EAAO4gH,UACP5gH,EAAO6gH,gBACR7gH,EAAOE,QAEPrI,EAAKC,GAAM,SAAS+gB,EAAO5gB,GAEnBuoH,EAAQvoH,GAAGse,QAAUsC,IAAU5Z,EAAQnH,KAAKG,IAC5CuoH,EAAQvoH,GAAGse,OAAOsC,GAAO,EAAO,MAAM,UAI3C,CAiBH,GAdA7Y,EAAOw0F,WAAa,KAEpBx0F,EAAO+1G,aAAe,EAGtBl+G,EAAKS,KAAKqmH,gBAAgB,SAASryG,GAC/BtM,EAAOsM,EAAM,QAAQhI,OAAS,KAQ9Bk6G,GAAkB8B,EAAa9B,EAAgB,CAI/C,IADAvmH,EAAI,EACkB,OAAfyoH,GAAuBzoH,EAAIqoH,GAC9BI,EAAa5oH,EAAKG,GAClBA,IAIJ,GAAImqE,EAASs+C,GACT,IAAKzoH,EAAI,EAAGA,EAAIqoH,EAAYroH,IACxBs5F,EAAMt5F,GAAKK,KAAK48F,gBAChByrB,EAAM1oH,GAAKH,EAAKG,QAIjB,GAAI6V,EAAQ4yG,GACf,GAAI7D,EACA,IAAK5kH,EAAI,EAAGA,EAAIqoH,EAAYroH,IACxBsoH,EAAKzoH,EAAKG,GACVs5F,EAAMt5F,GAAKsoH,EAAG,GACdI,EAAM1oH,GAAKsoH,EAAG34G,MAAM,EAAGi1G,EAAa,QAGxC,IAAK5kH,EAAI,EAAGA,EAAIqoH,EAAYroH,IACxBsoH,EAAKzoH,EAAKG,GACVs5F,EAAMt5F,GAAKsoH,EAAG,GACdI,EAAM1oH,GAAKsoH,EAAG,QAMtB71G,EAAE/B,MAAM,SAGZ,IAAK1Q,EAAI,EAAGA,EAAIqoH,EAAYroH,SACRgrE,IAAZnrE,EAAKG,KACLsoH,EAAK,CACDvgH,OAAQA,GAEZA,EAAOquE,WAAWjzE,UAAUihH,aAAax5G,MACrC09G,EAAI,CAACzoH,EAAKG,KAEd+H,EAAOs/G,qBAAqBiB,EAAItoH,IAyB5C,IAlBI4uE,EAAS85C,EAAM,KACfj2G,EAAE/B,MAAM,IAAI,GAYhB3I,EAAOlI,KAAO,GACdkI,EAAOf,QAAQnH,KAAOkI,EAAO6uF,YAAY/2F,KAAOA,EAGhDG,EAAIwoH,EACGxoH,KACCuoH,EAAQvoH,IAAMuoH,EAAQvoH,GAAG2I,SACzB4/G,EAAQvoH,GAAG2I,UAKf2vF,IACAA,EAAMT,SAAWS,EAAMR,cAI3B/vF,EAAO04F,QAAUj5F,EAAMuwG,YAAa,EACpChwG,EAAOo1F,cAAgBorB,EACvB3gH,GAAY,EAKW,UAAvBZ,EAAQw0G,aACRn7G,KAAK+8F,cACL/8F,KAAKg9F,kBAGL52B,GACAj/D,EAAMi/D,OAAO7+D,IASrBw1F,YAAa,SAAS9uC,GAClB,IAIIu6D,EAEAF,EACApvE,EACAmjD,EAEA18F,EAOA8oH,EAGA32G,EACArP,EApBAimH,EADS1oH,KACei5F,MACxB0vB,EAFS3oH,KAEeqoH,MACxBL,EAAaU,EAAe18G,OAE5B48G,EAAY,EAIZ3wB,EATSj4F,KASMi4F,MAEftxF,EAXS3G,KAWQ2G,QACjBq/G,EAAgBr/G,EAAQq/G,cACxB6C,EAbS7oH,KAcF6oH,oBACPliH,EAAQkiH,mBACRtX,EAhBSvxG,KAgBYuxG,YAErBpZ,EAAUF,GAASA,EAAME,QACzBrH,EAAQmH,GAASA,EAAMnH,MAO3B,GACIygB,IA3BSvxG,KA4BDogG,UACPnI,EAAMmI,UA7BEpgG,KA8BDmqG,MAAM/J,UACbnyC,EAED,OAAO,EA8CX,IA3CIgqC,IAEAnmF,GADA22G,EAAYxwB,EAAMjwF,eACF8J,IAChBrP,EAAMgmH,EAAUhmH,KAKhB8uG,GA5CSvxG,KA6CFmmH,SACN0C,KACC7C,GAAiBgC,EAAahC,GA/CvBhmH,KA+C+C8oH,aAKpDJ,EAAeV,EAAa,GAAKl2G,GACjC42G,EAAe,GAAKjmH,GAEpBimH,EAAiB,GACjBC,EAAiB,KAIjBD,EAAe,GAAK52G,GACpB42G,EAAeV,EAAa,GAAKvlH,KAQjCimH,GANAF,EAAcxoH,KAAK+oH,SA/Dd/oH,KAgEMi5F,MAhENj5F,KAiEMqoH,MACPv2G,EACArP,IAEyBw2F,MAC7B0vB,EAAiBH,EAAYH,MAC7BO,EAAYJ,EAAYxzG,MACxBszG,GAAU,IAMlB3oH,EAAI+oH,EAAe18G,QAAU,IACpBrM,IACLu5C,EAAW43C,EACPqH,EAAQuwB,EAAe/oH,IAAMw4F,EAAQuwB,EAAe/oH,EAAI,IACxD+oH,EAAe/oH,GAAK+oH,EAAe/oH,EAAI,IAG5B,SAEegrE,IAAtB0xB,GACAnjD,EAAWmjD,GAGfA,EAAoBnjD,EAKbA,EAAW,GAhGbl5C,KAgGyB08F,gBAC9BtqF,EAAE/B,MAAM,IAjGHrQ,KAsGNsoH,QAAUA,EAtGJtoH,KAuGN4oH,UAAYA,EAvGN5oH,KAwGN0oH,eAAiBA,EAxGX1oH,KAyGN2oH,eAAiBA,EAzGX3oH,KA2GNq8F,kBAAoBA,GAS/B0sB,SAAU,SAAS9vB,EAAOovB,EAAOv2G,EAAKrP,GAClC,IAKI9C,EACAiC,EANAomH,EAAa/uB,EAAMjtF,OACnB48G,EAAY,EACZI,EAAUhB,EAEViB,EAAer9G,EAAK5L,KAAKipH,aAAc,GAK3C,IAAKtpH,EAAI,EAAGA,EAAIqoH,EAAYroH,IACxB,GAAIs5F,EAAMt5F,IAAMmS,EAAK,CACjB82G,EAAY/oH,KAAK4C,IAAI,EAAG9C,EAAIspH,GAC5B,MAKR,IAAKrnH,EAAIjC,EAAGiC,EAAIomH,EAAYpmH,IACxB,GAAIq3F,EAAMr3F,GAAKa,EAAK,CAChBumH,EAAUpnH,EAAIqnH,EACd,MAIR,MAAO,CACHhwB,MAAOA,EAAM3pF,MAAMs5G,EAAWI,GAC9BX,MAAOA,EAAM/4G,MAAMs5G,EAAWI,GAC9Bh0G,MAAO4zG,EACP1mG,IAAK8mG,IASbhsB,eAAgB,WACZ,IAIIgrB,EAMAv9G,EAGA8V,EAEA5gB,EAdAgH,EADS3G,KACQ2G,QACjBuiH,EAAcviH,EAAQnH,KACtBA,EAHSQ,KAGKR,KAEdkpH,EALS1oH,KAKe0oH,eACxBC,EANS3oH,KAMe2oH,eACxBQ,EAPSnpH,KAOW+1E,WACpBqzC,EAAsBV,EAAe18G,OACrC48G,EATS5oH,KASU4oH,WAAa,EAEhCL,EAXSvoH,KAWeuoH,eACxBz0G,EAAOnN,EAAQmN,KAEfo4B,EAAS,GAGb,IAAK1sC,IAAS+oH,EAAgB,CAC1B,IAAIh7C,EAAM,GACVA,EAAIvhE,OAASk9G,EAAYl9G,OACzBxM,EApBSQ,KAoBKR,KAAO+tE,EAQzB,IALIz5D,GAAQy0G,IAvBCvoH,KAyBF2G,QAAQmN,MAAO,GAGrBnU,EAAI,EAAGA,EAAIypH,EAAqBzpH,IACjC8K,EAASm+G,EAAYjpH,EAChB4oH,GAWDhoG,GAAQ,IAAK4oG,GAAc7yC,KAzCtBt2E,KA0CO,CAAC0oH,EAAe/oH,IAAIwY,OAAO22D,EAAM65C,EAAehpH,OAkBtD0pH,UA5DDrpH,KA4DoBspH,SAAS3pH,IA7BlC4gB,EAAQ/gB,EAAKiL,UACyBkgE,IAAxBu+C,EAAYz+G,KACtBjL,EAAKiL,GAAU8V,GAAQ,IAAK4oG,GAAc7yC,KAjCzCt2E,KAmCGkpH,EAAYz+G,GACZi+G,EAAe/oH,KA0BvB4gB,IACAA,EAAM1f,MAAQ4J,EACdyhC,EAAOvsC,GAAK4gB,GAUpB,GA1EavgB,KAqEN2G,QAAQmN,KAAOA,EAMlBtU,IAEI4pH,KAAyBpB,EAAaxoH,EAAKwM,SAC3Cu8G,GAGJ,IAAK5oH,EAAI,EAAGA,EAAIqoH,EAAYroH,IAEpBA,IAAMipH,GAAcL,IACpB5oH,GAAKypH,GAEL5pH,EAAKG,KACLH,EAAKG,GAAGslH,kBACRzlH,EAAKG,GAAG6mG,WAAQ77B,GAxFf3qE,KA6FNR,KAAOA,EA7FDQ,KA8FNksC,OAASA,GAMpBlkC,YAAa,SAASqgH,GAClB,IAGIkB,EAOAC,EACA7+E,EACA3oC,EACAf,EACAtB,EACAiC,EAfAq2F,EAAQj4F,KAAKi4F,MACbkS,EAAQnqG,KAAKmqG,MACblR,EAAQj5F,KAAK0oH,eAEbe,EAAc,GACdC,EAAgB,EAEhBjB,EAAYxwB,EAAMjwF,cAClBorD,EAAOq1D,EAAU32G,IACjBuhD,EAAOo1D,EAAUhmH,IAWrB,IAFA8mH,GADAlB,EAAQA,GAASroH,KAAK2pH,cAAgB3pH,KAAK2oH,gBAAkB,IACzC38G,OAEfrM,EAAI,EAAGA,EAAI4pH,EAAa5pH,IAgBzB,GAdAqC,EAAIi3F,EAAMt5F,GACVsB,EAAIonH,EAAM1oH,GAIV6pH,GACK1/C,EAAS7oE,GAAG,IAASuU,EAAQvU,OAC5BkpG,EAAMnT,oBAAuB/1F,EAAE+K,QAAU/K,EAAI,GACnD0pC,EACI3qC,KAAK6oH,oBACL7oH,KAAK2G,QAAQkiH,oBACb7oH,KAAKsoH,UACHrvB,EAAMt5F,IAAMqC,IAAMoxD,IAAS6lC,EAAMt5F,IAAMqC,IAAMqxD,EAE/Cm2D,GAAc7+E,EAGd,GADA/oC,EAAIX,EAAE+K,OAEF,KAAOpK,KACU,OAATX,EAAEW,KACF6nH,EAAYC,KAAmBzoH,EAAEW,SAIzC6nH,EAAYC,KAAmBzoH,EAK3CjB,KAAK64F,QAAUjmB,EAAS62C,GACxBzpH,KAAK84F,QAAUjmB,EAAS42C,IAW5BhiG,UAAW,WACFznB,KAAK0oH,gBACN1oH,KAAK+8F,cAET/8F,KAAKg9F,iBACL,IASIr9F,EAOA6mG,EACAC,EACAmjB,EACAC,EAlBAljH,EADS3G,KACQ2G,QACjB63G,EAAW73G,EAAQ63G,SACnBvmB,EAHSj4F,KAGMi4F,MACf7H,EAAa6H,EAAM7H,WACnB+Z,EALSnqG,KAKMmqG,MACfj+D,EANSlsC,KAMOksC,OAChB87E,EAAa97E,EAAOlgC,OACpB89G,IARS9pH,KAQiB+pH,YAE1BvwB,EAAiB7yF,EAAQ6yF,eACzBwwB,EACmB,YAAnBxwB,GACA1vB,EAAS0vB,GACT19B,EAAYn1D,EAAQm1D,UACpBmuD,EAAiBtjH,EAAQujH,mBAAqBpuD,EAAY,EAK1DquD,EAAsBt5D,OAAOmxC,UAWjC,IARuB,YAAnBxI,IACAA,EAAiB,IAEjB1vB,EAAS0vB,KACTA,GAAkB5tF,EAAKjF,EAAQy2F,YAAcnF,EAAMmF,aAIlDz9F,EAAI,EAAGA,EAAIqoH,EAAYroH,IAAK,CAC7B,IAQIyqH,EACAC,EATA9pG,EAAQ2rB,EAAOvsC,GACf2qH,EAAS/pG,EAAMve,EACfuoH,EAAShqG,EAAMtf,EACfupH,EAAUjqG,EAAMuiF,IAChBryC,EAAQ+tD,GAAYrU,EAAMxS,QApCrB33F,KAqCMyqH,WACPF,GAAUN,EAAiB,EAAInuD,GAAa,IAAM,IAtCjD97D,KAuCMomG,UAKX+D,EAAMnT,oBAAiC,OAAXuzB,GAAmBA,GAAU,IACzDhqG,EAAM4jG,QAAS,GAInB5jG,EAAMimF,MAAQA,EAAQj0B,EAClB1yE,KAAKiS,IAAIjS,KAAK4C,KAAK,IAAKw1F,EAAMxwE,UAC1B6iG,EACA,EACA,EACA,EACA,EACA9wB,EACc,UAAdx5F,KAAKgF,OACL,MAKJw5G,GA/DKx+G,KAgEE4H,UACN2Y,EAAM4jG,QACP1zD,GACAA,EAAM65D,KAENT,EArEK7pH,KAqEmB0qH,kBACpBb,EACAS,EAvECtqH,KAwEMa,OAIX2pH,GADAH,GADAD,EAAa35D,EAAM65D,IACMp+E,OAAO29E,EAAe71G,MACzB,GACtBu2G,EAASF,EAAY,GAGjBG,IAAYP,GACZJ,EAAe71G,MAAQy8C,EAAM65D,GAAQxwD,OAErC0wD,EAAU5+G,EAAKkwD,EAAWquC,EAAMr4F,MAEhCq4F,EAAMnT,oBAAsBwzB,GAAW,IACvCA,EAAU,MAGdjqG,EAAM9gB,MAAQ8gB,EAAM4kG,WAAaiF,EAAW3qH,MAC5C8gB,EAAM2kG,WACFkF,EAAW3qH,OACV8gB,EAAMtf,EAAImpH,EAAW3qH,MAAQ,IAClC8gB,EAAMqmF,OAAS2jB,EAGfH,EAAWO,UAhGN3qH,KAiGM4qH,cAAgB,EAjGtB5qH,KAkGM6qH,MAAQ,IAMvBtqG,EAAMiqG,QAAUjsD,EAAQisD,GACpBrgB,EAAM1iF,UAAU+iG,EAAS,EAAG,EAAG,EAAG,GAClC,KAGAV,IACAS,EA9GKvqH,KA8GW+pH,YAAYQ,EAAQhqG,IAIxCA,EAAMkmF,MAAQA,EACS,iBAAX8jB,GAAuBA,IAAWp1G,IAC1CtV,KAAKiS,IAAIjS,KAAK4C,KAAK,IACf0nG,EAAM1iF,UAAU8iG,EAAQ,EAAG,EAAG,EAAG,IAAK,UAC1C5/C,EAEJpqD,EAAMqxD,cACQjH,IAAV87B,GACAA,GAAS,GACTA,GAAS0D,EAAMn8B,KACfw4B,GAAS,GACTA,GAASvO,EAAMjqB,IAInBztD,EAAMQ,QAAUipG,EACZz3C,EACI0lB,EAAMxwE,UAAU6iG,EAAQ,EAAG,EAAG,EAAG,EAAG9wB,IAExCgN,EAEJjmF,EAAMwb,SAAWxb,EAAMtf,GAAK66D,GAAa,GAGzCv7C,EAAM8rF,SAAWjc,QAAsCzlB,IAAxBylB,EAAW7vE,EAAMve,GAC5CouF,EAAW7vE,EAAMve,GAAKue,EAAMve,EAG3Bue,EAAM4jG,cACWx5C,IAAdi/C,IACAO,EAAsBtqH,KAAKiS,IACvBq4G,EACAtqH,KAAKuU,IAAIoyF,EAAQojB,KAGzBA,EAAYpjB,GAIhBjmF,EAAMqkG,KAAO5kH,KAAK8kH,MAAM94G,QAAUuU,EAAMskG,UAzJ/B7kH,KA2JNmqH,oBAAsBA,GAMjCW,eAAgB,SAAS5+E,EAAQ6+E,GAC7B,IAAI5jH,EAAQnH,KAAKmH,MAEjB,OAAOmrE,EAAKpmC,GAAUlsC,KAAKksC,QAAU,IAAI,SAAsB3rB,GAC3D,QAAIwqG,IAAe5jH,EAAMsrG,aACjBlyF,EAAMimF,MACNjmF,EAAMkmF,MACNt/F,EAAMs0E,WAINl7D,EAAM4jG,YAStB6G,QAAS,SAASzjH,GACd,IAAIJ,EAAQnH,KAAKmH,MACbR,EAAU3G,KAAK2G,QACfyE,EAAWjE,EAAMiE,SACjBqwE,EAAWt0E,EAAMs0E,SACjBwvC,EAAgBjrH,KAAK+xG,QACrBA,EAAUkZ,GAAiB9jH,EAAM4qG,QACjCmZ,EACAlrH,KAAKkrH,eAAiB,CAClB,cACA3jH,GAAaA,EAAUge,SACvBhe,GAAaA,EAAUqlE,OACvBmlC,EAAQttG,OACRkC,EAAQsxF,MACRtxF,EAAQwjG,OACVpyE,KAAK,KACPwiD,EAAWpzE,EAAM+jH,GACjBC,EAAiBhkH,EAAM+jH,EAAgB,KAItC3wC,IAGGhzE,IACAwqG,EAAQjtG,MAAQ,EAEhBqC,EAAM+jH,EAAgB,KAAOC,EAAiB//G,EAASmvE,UAAU,GAC7DkB,GAAYt0E,EAAMk6F,UAAYl6F,EAAMi6F,QACpC,GACA3lB,EAAWt0E,EAAMJ,WAAaI,EAAMH,cAG5CG,EAAM+jH,GAAiB3wC,EAAWnvE,EAASmvE,SAASw3B,GAEpDx3B,EAAShY,MAAQ,CACbv2D,OAAQ,IAIZzE,IACKgzE,EAAShY,MAAMviE,KAAKa,SACrB05E,EAAShY,MAAMviE,KAAKa,QAAS,EAC7B05E,EAAShY,MAAMv2D,QAAU,KAIZ,IAAjBrF,EAAQklC,OACR7rC,KAAKoa,MAAMyxB,KAAKtkC,GAAa0jH,EAAgB1wC,EAAWpzE,EAAMozE,UAC9Dv6E,KAAK6xG,YAAYhmE,KAAKs/E,GACtBnrH,KAAKkrH,cAAgBA,GAIpB3jH,IACGgzE,EAAShY,MAAMviE,KAAKa,gBACb05E,EAAShY,MAAMviE,KAAKa,OAC3B05E,EAAShY,MAAMv2D,QAAU,GAGC,IAA1BuuE,EAAShY,MAAMv2D,QAAgBk/G,GAAiB/jH,EAAM+jH,KACjDD,IACD9jH,EAAM+jH,GAAiB/jH,EAAM+jH,GAAe5iH,WAE5CnB,EAAM+jH,EAAgB,OACtB/jH,EAAM+jH,EAAgB,KAAO/jH,EAAM+jH,EAAgB,KAAK5iH,cASxEmtE,QAAS,SAASa,GACd,IAEIiE,EAEA2wC,EAHA/jH,EADSnH,KACMmH,MAEfI,EAAY6rE,EAHHpzE,KAGqB2G,QAAQY,WAItC+uE,EAPSt2E,KASFgrH,QAAQzjH,KAKfgzE,EAAWpzE,EADX+jH,EAAgBlrH,KAAKkrH,iBAGjB3wC,EAAS9E,QAAQ,CACb3wE,MAAOqC,EAAM26G,WACdv6G,GAEHJ,EAAM+jH,EAAgB,MACtB/jH,EAAM+jH,EAAgB,KAAKz1C,QAAQ,CAC/B3wE,MAAOqC,EAAM26G,UAAY,IAC1Bv6G,GAvBEvH,KA2BFy1E,QAAU,OAQzB21C,aAAc,WACVprH,KAAKgrH,UACL91C,EAAUl1E,KAAM,iBAUpBqrH,WAAY,WACR,IAGI5kB,EACA9mG,EACA4gB,EACAlb,EACAkhG,EAGA+kB,EACAC,EACA9jH,EACAmqE,EAGA45C,EAfAt/E,EADSlsC,KACOksC,OAChB/kC,EAFSnH,KAEMmH,MAOfskH,EATSzrH,KAQQ2G,QACayxG,OAK9BvG,EAdS7xG,UAcmB0rH,eAdnB1rH,KAc2C6xG,YACpD5Z,EAfSj4F,KAeMi4F,MAEf0zB,EAAkB//G,EACd6/G,EAAoBhkH,UACpBwwF,EAAMpD,UAAkB,KAnBnB70F,KAqBEmqH,qBAAuB,EAAIsB,EAAoB3sH,QAG9D,IAAoC,IAAhC2sH,EAAoBhkH,SAxBXzH,KAwBuC0kH,iBAEhD,IAAK/kH,EAAI,EAAGA,EAAIusC,EAAOlgC,OAAQrM,IAE3B8mG,GADAlmF,EAAQ2rB,EAAOvsC,IACD8mG,MACdF,EAAUhmF,EAAMgmF,QAChB+kB,EAAqB/qG,EAAM63F,QAAU,GACrCmT,IAAmBhrG,EAAM63F,OACzB3wG,EAAWkkH,QAAkDhhD,IAA/B2gD,EAAmB7jH,SAA0B6jH,EAAmB7jH,QAC9FmqE,EAAWrxD,EAAMqxD,SAGbnqE,GAAWqiE,EAAS28B,IAAsB,OAAZlmF,EAAMtf,GAGpCoE,EAASuG,EAAK0/G,EAAmBjmH,OAvChCrF,KAuC+CqF,QAChDkb,EAAMqrG,SAAqC,IAA1BvmH,EAAO6S,QAAQ,OAEhCszG,EA1CCxrH,KA0CsBwrH,cACnBjrG,EACAA,EAAM8+F,UAAY,UAGlB9Y,EACAA,EAAQ30B,EAAW,OAAS,SAAQ,GAC/B6D,QAAQ+1C,GACN55C,IAAa45C,EAAc1mH,MAAQ,GAAKyb,EAAMqrG,YACrDrrG,EAAMgmF,QAAUA,EAAUp/F,EAAMiE,SAAS/F,OACjCA,EACAmmH,EAAcxpH,EACdwpH,EAAcvqH,EACduqH,EAAc1mH,MACd0mH,EAAc/mH,OACd8mH,EAAiBD,EAAqBG,GAEzC3/G,IAAI+lG,IAKTtL,GACAA,EAAQlmG,KAjEXL,KAiEuBs4G,aAAa/3F,EAAOA,EAAM8+F,UAAY,WAI1D9Y,GACAA,EAAQrsB,SAAS35D,EAAMokG,gBAAgB,IAGpCpe,IACPhmF,EAAMgmF,QAAUA,EAAQj+F,YAUxCkjH,cAAe,SAASjrG,EAAOsjE,GAC3B,IACIgoC,EAEAC,EAKAx8C,EARAm8C,EAAsBzrH,KAAK2G,QAAQyxG,OAEnCkT,EAAqB/qG,EAAM63F,QAAU,GAErCt5G,EAAS8M,EACL0/G,EAAmBxsH,OACnB2sH,EAAoB3sH,QA8B5B,OAzBI+kF,IACAgoC,EAAqBJ,EAAoBlgH,OAAOs4E,GAChDioC,EAAoBR,EAAmB//G,QACnC+/G,EAAmB//G,OAAOs4E,GAE9B/kF,EAAS8M,EACLkgH,GAAqBA,EAAkBhtH,OACvC+sH,GAAsBA,EAAmB/sH,OACzCA,GAAU+sH,GAAsBA,EAAmBhG,YAAc,KAIrEtlG,EAAMqrG,WACN9sH,EAAS,GAGbwwE,EAAU,CACNttE,EAAGnC,KAAKwS,MAAMkO,EAAMimF,OAAS1nG,EAC7BmC,EAAGsf,EAAMkmF,MAAQ3nG,GAGjBA,IACAwwE,EAAQxqE,MAAQwqE,EAAQ7qE,OAAS,EAAI3F,GAGlCwwE,GAQXgpC,aAAc,SAAS/3F,EAAOsjE,GAC1B,IACIgoC,EAGAC,EASAnnH,EACAC,EAdA6mH,EAAsBzrH,KAAK2G,QAAQyxG,OAEnC2T,EAAexrG,GAASA,EAAM5Z,QAC9B2kH,EAAsBS,GAAgBA,EAAa3T,QAAW,GAE9D55G,EAAQwB,KAAKxB,MACbwtH,EAAmBD,GAAgBA,EAAavtH,MAChDytH,EAAa1rG,GAASA,EAAM/hB,MAC5Bi6E,EAAc7sE,EACV0/G,EAAmBv1B,UACnB01B,EAAoB11B,WAExBm2B,EAAY3rG,GAASA,EAAMqkG,MAAQrkG,EAAMqkG,KAAKpmH,MAyBlD,OArBAA,EAAQwtH,GAAoBE,GAAaD,GAAcztH,EACvDmG,EAAO2mH,EAAmBvF,WAAa0F,EAAoB1F,WAAavnH,EACxEoG,EAAS0mH,EAAmBx1B,WAAa21B,EAAoB31B,WAAat3F,EAGtEqlF,IACAgoC,EAAqBJ,EAAoBlgH,OAAOs4E,GAChDioC,EAAqBR,EAAmB//G,QAAU+/G,EAAmB//G,OAAOs4E,IAAW,GACvFpL,EAAc7sE,EACVkgH,EAAkB/1B,UAClB81B,EAAmB91B,UACnBtd,EAAc7sE,EACVkgH,EAAkBhG,cAClB+F,EAAmB/F,cACnB,IAGRnhH,EAAOmnH,EAAkB/F,WAAa8F,EAAmB9F,WAAaphH,EACtEC,EAASknH,EAAkBh2B,WAAa+1B,EAAmB/1B,WAAalxF,GAGrE,CACH,OAAUA,EACV,eAAgB6zE,EAChB,KAAQ9zE,IAOhB2D,QAAS,WACL,IAII3I,EAEA4gB,EACAqjD,EAPAl8D,EAAS1H,KACTmH,EAAQO,EAAOP,MACfglH,EAAW,mBAAmB/kH,KAAKyiE,EAAI3pD,UAAUC,WAGjD3gB,EAAOkI,EAAOlI,MAAQ,GA0B1B,IArBA01E,EAAUxtE,EAAQ,WAGlBvF,EAAYuF,GAGZnI,EAAKmI,EAAO0+G,WAAa,IAAI,SAASU,IAClCljD,EAAOl8D,EAAOo/G,KACFljD,EAAKl8D,SACbknE,EAAMhL,EAAKl8D,OAAQA,GACnBk8D,EAAKw8B,QAAUx8B,EAAKy8B,aAAc,MAKtC34F,EAAOmwG,YACPnwG,EAAOP,MAAMsnF,OAAOuqB,YAAYtxG,GAIpC/H,EAAIH,EAAKwM,OACFrM,MACH4gB,EAAQ/gB,EAAKG,KACA4gB,EAAMjY,SACfiY,EAAMjY,UAGdZ,EAAOwkC,OAAS,KAGhBjiC,aAAavC,EAAO0kH,kBAGpB1/C,EAAWhlE,GAAQ,SAASilE,EAAKlB,GACzBkB,aAAeqK,IAAerK,EAAI0/C,SAOlC1/C,EAJUw/C,GAAqB,UAAT1gD,EAClB,OACA,gBAORtkE,EAAMopG,cAAgB7oG,IACtBP,EAAMopG,YAAc,MAExB3hC,EAAMznE,EAAMO,OAAQA,GACpBP,EAAM22G,cAGNpxC,EAAWhlE,GAAQ,SAASilE,EAAKlB,UACtB/jE,EAAO+jE,OAOtB6gD,aAAc,SAASpgF,EAAQqgF,EAAeC,GAC1C,IAGIz5B,EAGA05B,EANA/kH,EAAS1H,KACT2G,EAAUe,EAAOf,QACjBuO,EAAOvO,EAAQuO,KAEfw3G,EAAY,GACZC,EAAO,GAwGX,OAlGA55B,GAHA7mD,EAASA,GAAUxkC,EAAOwkC,QAGR6mD,WAEd7mD,EAAOjR,WAGX/lB,EAAO,CACHnK,MAAO,EACP4a,OAAQ,GACVzQ,IAAUA,GAAQ,IACR69E,IACR79E,EAAO,EAAIA,IAIXvO,EAAQimH,cAAiBL,GAAkBC,IAC3CtgF,EAASlsC,KAAK8qH,eAAe5+E,IAIjC3sC,EAAK2sC,GAAQ,SAAS3rB,EAAO5gB,GAEzB,IAGIktH,EAHArmB,EAAQjmF,EAAMimF,MACdC,EAAQlmF,EAAMkmF,MACdqmB,EAAY5gF,EAAOvsC,EAAI,IAGtB4gB,EAAMwsG,WAAcD,GAAaA,EAAUE,cAAiBR,IAC7DC,GAAM,GAINlsG,EAAM4jG,SAAW5lD,EAAQguD,IAAkB5sH,EAAI,EAC/C8sH,GAAO9lH,EAAQimH,aAGRrsG,EAAM4jG,SAAWoI,EACxBE,GAAM,GAII,IAAN9sH,GAAW8sH,EACXI,EAAc,CAAC,IAAKtsG,EAAMimF,MAAOjmF,EAAMkmF,OAEhC/+F,EAAOulH,eAEdJ,EAAcnlH,EAAOulH,eAAe/gF,EAAQ3rB,EAAO5gB,GAE5CuV,GAGH23G,EADS,IAAT33G,EACc,CACV,IACA43G,EAAUtmB,MACVC,GAGY,IAATvxF,EACO,CACV,KACC43G,EAAUtmB,MAAQA,GAAS,EAC5BsmB,EAAUrmB,MACV,KACCqmB,EAAUtmB,MAAQA,GAAS,EAC5BC,GAIU,CACV,IACAD,EACAsmB,EAAUrmB,QAGN3+F,KAAK,IAAK0+F,EAAOC,GAI7BomB,EAAc,CACV,IACArmB,EACAC,GAKRkmB,EAAK7kH,KAAKyY,EAAMve,GACZkT,GACAy3G,EAAK7kH,KAAKyY,EAAMve,GAGpB0qH,EAAU5kH,KAAKyC,MAAMmiH,EAAWG,GAChCJ,GAAM,MAIdC,EAAUC,KAAOA,EACjBjlH,EAAOglH,UAAYA,EAEZA,GAOXQ,UAAW,WACP,IAAIxlH,EAAS1H,KACT2G,EAAU3G,KAAK2G,QACf+lH,GAAa1sH,KAAKmtH,YAAcntH,KAAKssH,cAAcr9G,KAAKjP,MACxDoM,EAAQ,CACJ,CACI,QACA,mBAEAzF,EAAQmvF,WAAa91F,KAAKxB,MAC1BmI,EAAQotF,YAMpBx0F,EAAKS,KAAK8kH,OAAO,SAASF,EAAMjlH,GAC5ByM,EAAMtE,KAAK,CACP,cAAgBnI,EAChB,0CAA4CA,EAAI,KAAOilH,EAAKl7G,WAAa,IAEzEk7G,EAAKpmH,OAASkJ,EAAOlJ,MACrBomH,EAAK7wB,WAAaptF,EAAQotF,eAMlCx0F,EAAK6M,GAAO,SAASq/D,EAAM9rE,GACvB,IAEI2vE,EAFA89C,EAAW3hD,EAAK,GAChB4hD,EAAQ3lH,EAAO0lH,GAGfC,GACAA,EAAMpgD,KAAOy/C,EAAUC,KACvBU,EAAM53C,QAAQ,CACVp2E,EAAGqtH,KAGAA,EAAU1gH,SAEjBtE,EAAO0lH,GAAY1lH,EAAOP,MAAMiE,SAASqtC,KAAKi0E,GACzCxyC,SAASzO,EAAK,IACdprE,KAAK,CACFsJ,OAAQ,IAEXmC,IAAIpE,EAAO0S,OAGhBk1D,EAAU,CACN,OAAU7D,EAAK,GACf,eAAgB9kE,EAAQovF,UACxB,KAASruF,EAAO4lH,WAAa5lH,EAAOlJ,OAAU,QAG9CitE,EAAK,GACL6D,EAAQ0kB,UAAYvoB,EAAK,GACE,WAApB9kE,EAAQ4mH,UACfj+C,EAAQ,kBAAoBA,EAAQ,mBAAqB,SAG7D+9C,EAAQ3lH,EAAO0lH,GACV/sH,KAAKivE,GACL8O,OAAQz+E,EAAI,GAAMgH,EAAQy3E,SAK/BivC,IACAA,EAAMrgD,OAAS0/C,EAAUC,KAEzBU,EAAMjgD,OAASs/C,EAAUt/C,YAQrCogD,WAAY,WACR,IAIIC,EACAC,EAEAC,EAKAC,EACA76B,EAEA5B,EACA08B,EACAC,EACAC,EAlBArmH,EAAS1H,KACTmH,EAAQnH,KAAKmH,MACbiE,EAAWjE,EAAMiE,SACjB05G,EAAQ9kH,KAAK8kH,MAGbkJ,EAAQhuH,KAAKguH,OAAS,GAEtBX,EAAQrtH,KAAKqtH,MACbvmF,EAAO9mC,KAAK8mC,KACZmnF,EAAepuH,KAAK4C,IAAI0E,EAAMJ,WAAYI,EAAMH,aAChD48D,EAAO5jE,MAAMA,KAAK+kH,UAAY,KAAO,QAGrCtpC,EAAWt0E,EAAMs0E,SAKjByyC,GAAc,EAEdpJ,EAAM94G,SAAWqhH,GAASvmF,IAAS88B,QAAqB+G,IAAb/G,EAAK9xD,MAChDihF,EAAWnvB,EAAKmvB,SAChB5B,EAAQvtB,EAAKutB,MAGTk8B,GACAA,EAAMjwC,OAENt2C,GACAA,EAAKs2C,OAITwwC,EAAWhqD,EAAK57D,cAChBzI,EAAKulH,GAAO,SAAShpD,EAAWn8D,GAE5B8tH,EAAiB16B,EACZ5B,EAAQhqF,EAAM+5F,UAAY,EAC1B/P,EAAQ,EAAIvtB,EAAKw2B,SAASwzB,EAAS97G,KACxC27G,EAAiB5tH,KAAKiS,IAAIjS,KAAK4C,IAAImJ,EAAK8hH,EAAcD,GAAiB,GAAIQ,GAC3EP,EAAe7tH,KAAKiS,IAAIjS,KAAK4C,IAAI5C,KAAKC,MAAM8jE,EAAKw2B,SAASxuF,EAAKkwD,EAAU18D,MAAOwuH,EAASnrH,MAAM,IAAQ,GAAIwrH,GAEvGC,IACAT,EAAiBC,EAAe9pD,EAAKw2B,SAASwzB,EAASnrH,MAG3DorH,EAAUhuH,KAAKuU,IAAIq5G,EAAiBC,GACpCI,EAAWjuH,KAAKiS,IAAI27G,EAAgBC,GACpCK,EAAWluH,KAAK4C,IAAIgrH,EAAgBC,GAChC9pD,EAAK2wB,SACLo5B,EAAW,CACP3rH,EAAGy5E,EAAWsyC,EAAWD,EACzB7sH,EAAG,EACH6D,MAAO+oH,EACPppH,OAAQwpH,GAEP98B,IACDw8B,EAAS3rH,EAAImF,EAAMg6F,WAAawsB,EAAS3rH,KAG7C2rH,EAAW,CACP3rH,EAAG,EACHf,EAAGw6E,EAAWsyC,EAAWD,EACzBhpH,MAAOmpH,EACPxpH,OAAQopH,GAER18B,IACAw8B,EAAS1sH,EAAIkG,EAAM+5F,UAAYysB,EAAS1sH,IAM5Cw6E,GAAYrwE,EAAS4/E,QAEjB2iC,EADA/pD,EAAK2wB,QACM,CACPvyF,EAAG,EACHf,EAAG8xF,EAAW+6B,EAAWC,EACzBtpH,OAAQkpH,EAAS7oH,MACjBA,MAAOqC,EAAMJ,YAGN,CACP/E,EAAG2rH,EAAS1sH,EAAIkG,EAAMk6F,SAAWl6F,EAAMolG,WAAWvqG,EAClDf,EAAG,EACH6D,MAAO6oH,EAASlpH,OAChBA,OAAQ0C,EAAMH,cAOtBgnH,EAAMruH,GACNquH,EAAMruH,GAAG81E,QAAQk4C,IAEjBK,EAAMruH,GAAKyL,EAASmvE,SAASozC,GAEzBN,GACA3lH,EAAO,cAAgB/H,GAAGksC,KAAKmiF,EAAMruH,IAGrCmnC,GACAp/B,EAAO,aAAe/H,GAAGksC,KAAKmiF,EAAMruH,KAI5CuuH,EAAcpyD,EAAU18D,MAAQwuH,EAASnrH,OAE7CzC,KAAKguH,MAAQA,IAOrBG,aAAc,SAAS1yC,GACnB,IAEI2yC,EAFA1mH,EAAS1H,KACTmH,EAAQO,EAAOP,MAGnB,SAASknH,IACL9uH,EAAK,CAAC,QAAS,gBAAgB,SAASqpG,GAChClhG,EAAOkhG,KAGHzhG,EAAMiE,SAAS4/E,OACftjF,EAAOkhG,GAAWvoG,KAAK,CACnByE,MAAO4C,EAAOyiG,MAAMn8B,IACpBvpE,OAAQiD,EAAOuwF,MAAMjqB,MAI7BtmE,EAAOkhG,GAAW9jG,MAAQ4C,EAAOyiG,MAAMn8B,IACvCtmE,EAAOkhG,GAAWnkG,OAASiD,EAAOuwF,MAAMjqB,IACxCtmE,EAAOkhG,GAAWthF,OAAOm0D,OAMhC/zE,EAAOuwF,QAKZm2B,EAAUlsH,EAASiF,EAAO,SAAUknH,GACpCnsH,EAASwF,EAAQ,UAAW0mH,GAG5BC,IAGA3mH,EAAOymH,aAAeE,IAQ1BloB,UAAW,SAAS16B,EAAMnlE,EAAM62E,EAAYxzE,EAAQuF,GAChD,IAAIkL,EAAQpa,KAAKyrE,GACbukB,GAAS51E,EA+Bb,OA5BI41E,IACAhwF,KAAKyrE,GAAQrxD,EAAQpa,KAAKmH,MAAMiE,SAAS3K,IACpCJ,KAAK,CACFsJ,OAAQA,GAAU,KAErBmC,IAAIoD,IAMbkL,EAAM8/D,SAEE,cAAgB5zE,EAChB,sBAAwBtG,KAAKa,MAC7B,eAAiBb,KAAKgF,KAFtB,4BAGsBhF,KAAKwsG,WAAa,KACvCxsG,KAAK2G,QAAQ+C,WAAa,KAE/B,GAIJ0Q,EAAM/Z,KAAK,CACP88E,WAAYA,IACb6S,EAAQ,OAAS,WAChBhwF,KAAK4xG,cAEFx3F,GAMXw3F,WAAY,WACR,IAAIzqG,EAAQnH,KAAKmH,MACb8wF,EAAQj4F,KAAKi4F,MACbkS,EAAQnqG,KAAKmqG,MAOjB,OAJIhjG,EAAMs0E,WACNwc,EAAQkS,EACRA,EAAQnqG,KAAKi4F,OAEV,CACHxsF,WAAYwsF,EAAQA,EAAMjtF,KAAO7D,EAAMk6F,SACvC31F,WAAYy+F,EAAQA,EAAMrjG,IAAMK,EAAMi6F,QACtC1lB,OAAQ,EACRC,OAAQ,IAOhBmZ,OAAQ,WACJ,IAEI16E,EAFA1S,EAAS1H,KACTmH,EAAQO,EAAOP,MAEfR,EAAUe,EAAOf,QAGjB2nH,IAAkB5mH,EAAO+tE,SACrBtuE,EAAMiE,SAAS6xE,OACf7J,EAAWzsE,EAAQY,WAAWge,SAElC43D,EAAaz1E,EAAOE,QAAU,UAAY,SAC1C+B,EAAShD,EAAQgD,OACjBs7F,EAAcv9F,EAAOu9F,YACrBspB,EAAmBpnH,EAAMq8G,YACzB/nC,EAAWt0E,EAAMs0E,SAGrBrhE,EAAQ1S,EAAOy+F,UACX,QACA,SACAhpB,EACAxzE,EACA4kH,GAGJ7mH,EAAOmqG,YAAcnqG,EAAOy+F,UACxB,cACA,UACAhpB,EACAxzE,EACA4kH,GAIAD,GACA5mH,EAAO+tE,SAAQ,GAInBr7D,EAAMqhE,WAAW/zE,EAAO6pG,aAAc91B,EAGlC/zE,EAAOwlH,YACPxlH,EAAOwlH,YACPxlH,EAAO8lH,cAUP9lH,EAAO8mH,gBACP9mH,EAAO8mH,iBAIP9mH,EAAOE,SACPF,EAAO2jH,aAMP3jH,EAAO+mH,cACgC,IAAvC/mH,EAAOf,QAAQ4oG,qBAEf7nG,EAAO+mH,cAIX/mH,EAAOymH,aAAa1yC,IAIC,IAAjB90E,EAAQklC,MAAmBnkC,EAAOwjH,eAAkBjmB,GACpD7qF,EAAMyxB,KAAK1kC,EAAMozE,UAIjB+zC,GACA5mH,EAAO+tE,UAMNwvB,IACDv9F,EAAO0kH,iBAAmBr9C,GAAY,WAClCrnE,EAAO0jH,iBACRkD,IAGP5mH,EAAO04F,SAAU,EAGjB14F,EAAOu9F,aAAc,GAMzB7+B,OAAQ,WACJ,IACIj/D,EADSnH,KACMmH,MAEfunH,EAHS1uH,KAGSogG,SAHTpgG,KAG2B88F,YACpC1iF,EAJSpa,KAIMoa,MACf69E,EALSj4F,KAKMi4F,MACfkS,EANSnqG,KAMMmqG,MAGf/vF,IACIjT,EAAMs0E,UACNrhE,EAAM/Z,KAAK,CACPyE,MAAOqC,EAAM+5F,UACbz8F,OAAQ0C,EAAMg6F,aAItB/mF,EAAMq7D,QAAQ,CACVhqE,WAAYG,EAAKqsF,GAASA,EAAMjtF,KAAM7D,EAAMk6F,UAC5C31F,WAAYE,EAAKu+F,GAASA,EAAMrjG,IAAKK,EAAMi6F,YAnBtCphG,KAuBNynB,YAvBMznB,KAwBN80F,SACH45B,UACO1uH,KAAK6gG,QAQpB8tB,YAAa,CAAC,UAAW,SAEzBnf,YAAa,SAASnmG,EAAGulH,GACrB,IACI32B,EADSj4F,KACMi4F,MACfkS,EAFSnqG,KAEMmqG,MACf1uB,EAHSz7E,KAGSmH,MAAMs0E,SAE5B,OAAOz7E,KAAK6uH,aAAa,CACrB9tG,QAAS06D,EACLwc,EAAMjqB,IAAM3kE,EAAEs9F,OAAS1O,EAAM9rB,IAAM9iE,EAAEq9F,OAASzO,EAAM9rB,IACxDs6B,MAAOhrB,EACH0uB,EAAMn8B,IAAM3kE,EAAEq9F,OAASyD,EAAMh+B,IAAM9iE,EAAEs9F,OAASwD,EAAMh+B,KACzDyiD,IASPE,YAAa,WAGT9uH,KAAK+uH,gBAAiB,EAEtB,IAAIrnH,EAAS1H,KACTgvH,EAAatnH,EAAOf,QAAQ8oG,mBAAmBv3F,QAAQ,MAAQ,EAC/D,EAAI,SAiDDxQ,EAAOm5F,OAGd9xB,GAhBA,WACIrnE,EAAOm5F,OAlCX,SAASouB,EAAQ/iF,EAAQj1B,EAAO+3G,GAC5B,IAAIprD,EACAtxD,EACAtG,EAASkgC,GAAUA,EAAOlgC,OAE9B,GAAIA,EAaA,OAVA43D,EAAOl8D,EAAOinH,YAAY13G,EAAQ+3G,GAGlC9iF,EAAO/sC,MAAK,SAAS4G,EAAGC,GACpB,OAAOD,EAAE69D,GAAQ59D,EAAE49D,MAMhB,CACHrjD,MAAO2rB,EAJX55B,EAASzS,KAAKwS,MAAMrG,EAAS,IAKzBhB,KAAMikH,EACF/iF,EAAO58B,MAAM,EAAGgD,GAAS2E,EAAQ,EAAG+3G,GAExCjkH,MAAOkkH,EACH/iF,EAAO58B,MAAMgD,EAAS,GAAI2E,EAAQ,EAAG+3G,IAUjCC,CACZvnH,EAAOojH,eACH,MAGCpjH,EAAO0nG,aAEZ4f,EACAA,GAEJtnH,EAAOqnH,gBAAiB,IAKArnH,EAAOf,QAAQuoH,MAAQ,EAAI,IAG3DL,aAAc,SAAStuG,EAAOquG,GAC1B,IAAIlnH,EAAS1H,KACTmvH,EAAMnvH,KAAK2uH,YAAY,GACvBS,EAAMpvH,KAAK2uH,YAAY,GACvBU,EAAaT,EAAW,QAAU,OAClCU,EAAe5nH,EAAOf,QAAQ8oG,mBAAmBv3F,QAAQ,MAAQ,EACjE,EAAI,EA8DR,GAJKlY,KAAK6gG,QAAW7gG,KAAK+uH,gBACtB/uH,KAAK8uH,cAGL9uH,KAAK6gG,OACL,OA/CJ,SAAS0uB,EAAQC,EAAQ7sE,EAAM1rC,EAAO+3G,GAClC,IAEIS,EACAC,EACAC,EAEAC,EACAC,EArBap8G,EAAIqsD,EACjB99D,EAMAP,EAOA8e,EAAQoiC,EAAKpiC,MACbqjD,EAAOl8D,EAAOinH,YAAY13G,EAAQ+3G,GAIlCpjD,EAAMrrD,EAiCV,OApDqBu/C,EAuBDv/C,EAtBhBve,EAAKu8D,GADQ9qD,EAuBL+7G,GAtBQL,KAAS5wD,EAAQuB,EAAGqvD,IACpCtvH,KAAKqnB,IAAIzT,EAAG07G,GAAOrvD,EAAGqvD,GAAM,GAC5B,KAIA1tH,GAAKO,GAAK,KAHLu8D,EAAQ9qD,EAAG27G,KAAS7wD,EAAQuB,EAAGsvD,IACpCvvH,KAAKqnB,IAAIzT,EAAG27G,GAAOtvD,EAAGsvD,GAAM,GAC5B,OACqB,GAEzBtvD,EAAG+vC,KAAOtxC,EAAQ98D,GAAK5B,KAAK6S,KAAKjR,GAAKovD,OAAOmxC,UAC7CliC,EAAG6vC,MAAQpxC,EAAQv8D,GAAKnC,KAAK6S,KAAK1Q,GAAK6uD,OAAOmxC,UAkB9C2tB,GAFAF,EAAQD,EAAO5rD,GAAQrjD,EAAMqjD,IAEb,EAAI,QAAU,OAG1BjhB,EAJJ+sE,EAAQD,EAAQ,EAAI,OAAS,WAOzB7jD,GAFAgkD,EAAUL,EAAQC,EAAQ7sE,EAAK+sE,GAAQz4G,EAAQ,EAAG+3G,IAEnCK,GAAczjD,EAAIyjD,GAAcO,EAAUrvG,GAEzDoiC,EAAKgtE,IAGD9vH,KAAK6S,KAAK+8G,EAAQA,GAAS7jD,EAAIyjD,KAO/BzjD,GANAikD,EAAUN,EACNC,EACA7sE,EAAKgtE,GACL14G,EAAQ,EACR+3G,IAEUK,GAAczjD,EAAIyjD,GAC5BQ,EACAjkD,GAILA,EAQA2jD,CAAQhvG,EAAOvgB,KAAK6gG,OAAQyuB,EAAcA,MAz5EjE,CA+5EEvuH,GACD,SAASqR,GAMN,IAAI4iF,EAAO5iF,EAAE4iF,KACT/yF,EAAQmQ,EAAEnQ,MACVswE,EAAengE,EAAEmgE,aACjBhU,EAAUnsD,EAAEmsD,QACZuU,EAA0B1gE,EAAE0gE,wBAC5BvzE,EAAO6S,EAAE7S,KACTqsB,EAASxZ,EAAEwZ,OACX8gD,EAAat6D,EAAEs6D,WACf9gE,EAAOwG,EAAExG,KACTg6G,EAASxzG,EAAEwzG,OAQf,SAASkK,EAAUlsD,EAAMj9D,EAASopH,EAAY/tH,EAAGguH,GAE7C,IAAIv0C,EAAW7X,EAAKz8D,MAAMs0E,SAE1Bz7E,KAAK4jE,KAAOA,EAGZ5jE,KAAK+vH,WAAaA,EAGlB/vH,KAAK2G,QAAUA,EAGf3G,KAAKgC,EAAIA,EAGThC,KAAKP,MAAQ,KAIbO,KAAKksC,OAAS,GAIdlsC,KAAKywD,MAAQu/D,EACbhwH,KAAK+sH,UAAY,EACjB/sH,KAAKgtH,WAAa,EAKlBhtH,KAAKiL,aAAe,CAChB1G,MAAOoC,EAAQpC,QACVk3E,EAAYs0C,EAAa,OAAS,QAAW,UAClDlrH,cAAe8B,EAAQ9B,gBAClB42E,EAAW,SAAYs0C,EAAa,SAAW,OACpD9uH,EAAG2K,EAAKjF,EAAQ1F,EAAGw6E,EAAW,EAAKs0C,EAAa,IAAM,GACtD/tH,EAAG4J,EAAKjF,EAAQ3E,EAAGy5E,EAAYs0C,GAAc,EAAI,EAAK,IAG1D/vH,KAAKmmF,UAAYx/E,EAAQw/E,YACpB1K,EAAYs0C,EAAa,QAAU,OAAU,UAGtDD,EAAUhtH,UAAY,CAClBwF,QAAS,WACLwqE,EAAwB9yE,KAAMA,KAAK4jE,OAMvCkxB,OAAQ,SAAS16E,GACb,IAAIzT,EAAU3G,KAAK2G,QACf6xF,EAAe7xF,EAAQilB,OACvB6iD,EAAM+pB,EACN5sE,EAAO4sE,EAAcx4F,MACrB2G,EAAQuvF,UAAUjnF,KAAKjP,MAIvBA,KAAK0jF,MACL1jF,KAAK0jF,MAAMrjF,KAAK,CACZC,KAAMmuE,EACN0O,WAAY,WAIhBn9E,KAAK0jF,MACD1jF,KAAK4jE,KAAKz8D,MAAMiE,SAAS9K,KAAKmuE,EAAK,KAAM,KAAM9nE,EAAQg/E,SACtDrjF,IAAIqE,EAAQnG,OACZH,KAAK,CACFkE,MAAOvE,KAAKmmF,UACZruC,SAAUnxC,EAAQmxC,SAClBqlC,WAAY,WAEfrxE,IAAIsO,IAQjBuwG,UAAW,SAASsF,EAASC,GACzB,IA4BI9zC,EA3BAxY,EADY5jE,KACK4jE,KACjBz8D,EAAQy8D,EAAKz8D,MACbs0E,EAAWt0E,EAAMs0E,SACjBsX,EAAWnvB,EAAKmvB,SAChBo9B,EAAOnwH,KAAK+vH,aAAeh9B,IACzB/yF,KAAK+vH,YAAch9B,EAErB9xF,EAAI2iE,EAAKn8C,UACLm8C,EAAK66B,cAAgB,IAAMz+F,KAAKP,MAChC,EACA,EACA,EACA,GAEJ2wH,EAAQxsD,EAAKn8C,UAAU,GACvB/gB,EAAI7G,KAAKuU,IAAInT,EAAImvH,GACjBpuH,EAAImF,EAAM8wF,MAAM,GAAGxwE,UAAUznB,KAAKgC,GAAKiuH,EACvC9uB,EAAah6F,EAAMg6F,WACnBkvB,EAAW,CACPruH,EAAGy5E,EAAY00C,EAAMlvH,EAAIA,EAAIyF,EAAK1E,EAClCf,EAAGw6E,EACC0lB,EAAan/F,EAAIkuH,EAAUC,EAAOhvB,EAAalgG,EAAIyF,EAC/Cy6F,EAAalgG,EACrB6D,MAAO22E,EAAW/0E,EAAIwpH,EACtBzrH,OAAQg3E,EAAWy0C,EAASxpH,GAEhCg9E,EAAQ1jF,KAAK0jF,MAGbA,IAEAA,EAAMn/E,MAAMvE,KAAKiL,aAAc,KAAMolH,GAGrCj0C,EAAYsH,EAAMtH,UAClBsH,GAC0B,IAAtB1jF,KAAK2G,QAAQ2pH,MAAkBnpH,EAAMsrG,aACjCr2B,EAAUp6E,EACVo6E,EAAUn7E,GACV,OAAS,SAAQ,MAQrCgB,EAAMa,UAAU47G,UAAY,WACxB,IAAIv3G,EAAQnH,KAGZT,EAAK4H,EAAMgjG,OAAO,SAASvmC,GACnBA,EAAK+zB,QAAU/zB,EAAKg1B,mBACpBh1B,EAAKg0B,UAAYh0B,EAAK+zB,WAI9Bp4F,EAAK4H,EAAMO,QAAQ,SAASA,IACpBA,EAAOf,QAAQ63G,WAAgC,IAAnB92G,EAAOE,UACY,IAA3CT,EAAMR,QAAQQ,MAAM6mF,qBACxBtmF,EAAO0+F,SAAW1+F,EAAO1C,KAAO4G,EAAKlE,EAAOf,QAAQ8pD,MAAO,SAWvEukC,EAAKlyF,UAAUk2F,YAAc,WACzB,IACItxF,EAGA/H,EAJA4wH,EAAavwH,KAAK0H,OAElB8oH,EAAiB5kH,EAAK5L,KAAK2G,QAAQ6pH,gBAAgB,GACnDxiD,EAAMuiD,EAAWvkH,OAErB,IAAKhM,KAAKu0F,QAAS,CAGf,IAFAv0F,KAAKy+F,eAAgB,EACrB9+F,EAAIquE,EACGruE,KACH4wH,EAAWC,EAAiB7wH,EAAIquE,EAAMruE,EAAI,GAAG8wH,mBAIjD,IADA9wH,EAAIquE,EACGruE,MACH+H,EAAS6oH,EAAWC,EAAiB7wH,EAAIquE,EAAMruE,EAAI,IACxC+wH,gBACPhpH,EAAOgpH,iBAIf,GAAI1wH,KAAKy+F,cACL,IAAK9+F,EAAI,EAAGA,EAAIquE,EAAKruE,IACjB4wH,EAAW5wH,GAAGgxH,qBAM9B37B,EAAKlyF,UAAUijG,kBAAoB,WAC/B,IACI5+F,EADOnH,KACMmH,MACbiE,EAAWjE,EAAMiE,SACjBusF,EAHO33F,KAGO23F,OACdi5B,EAJO5wH,KAIgB4wH,gBAGtBA,IAPM5wH,KAQF4wH,gBAAkBA,EACnBxlH,EAAS3K,EAAE,gBACVJ,KAAK,CACF88E,WAAY,UACZxzE,OAAQ,IAEXmC,OAKT8kH,EAAgBnpG,UAAUtgB,EAAMk6F,SAAUl6F,EAAMi6F,SAGhD10B,EAAWirB,GAAQ,SAAS3yF,GACxB0nE,EAAW1nE,GAAM,SAASyrD,GACtBA,EAAMqkC,OAAO87B,UAQzB57B,EAAKlyF,UAAU09F,YAAc,WACzB,IAAI58B,EAAO5jE,KACP23F,EAAS/zB,EAAK+zB,OACb/zB,EAAK2wB,SACN7nB,EAAWirB,GAAQ,SAAS3yF,GACxB0nE,EAAW1nE,GAAM,SAASyrD,EAAOz8C,GAEzBy8C,EAAMogE,QAAUjtD,EAAKi0B,eACrBpnC,EAAMnoD,iBACCtD,EAAKgP,KAIZy8C,EAAMhxD,MAAQ,KACdgxD,EAAMqgE,IAAM,aAOhC97B,EAAKlyF,UAAU29F,YAAc,WACzB,IAAI9I,EAEC33F,KAAKu0F,UACFv0F,KAAK43F,YACLD,EAAS33F,KAAK23F,OAAS33F,KAAK43F,WAIhClrB,EAAWirB,GAAQ,SAAS3yF,GACxB0nE,EAAW1nE,GAAM,SAASyrD,GACtBA,EAAMqgE,IAAMrgE,EAAMhxD,cAYlCmmH,EAAO9iH,UAAU2tH,iBAAmB,WAChC,GAAKzwH,KAAK2G,QAAQ63G,YAA8B,IAAjBx+G,KAAK4H,UACoB,IAAhD5H,KAAKmH,MAAMR,QAAQQ,MAAM6mF,oBADjC,CAKA,IAgBI67B,EACAkG,EACAt/D,EACApkB,EACAr4B,EACA+8G,EACApxH,EACAqC,EACAf,EAvBAg4F,EADSj5F,KACM0oH,eACfL,EAFSroH,KAEM2oH,eACfgB,EAAe,GACfJ,EAAclB,EAAMr8G,OACpBotF,EALSp5F,KAKc2G,QACvBm1D,EAAYs9B,EAAct9B,UAC1BmuD,EAAiB7wB,EAAc8wB,mBAAqBpuD,EAAY,EAChEk0D,EAAc52B,EAAc3oC,MAC5B+tD,EAAWplB,EAAcolB,SACzBpY,EAVSpmG,KAUSomG,SAClB4qB,EAAS,IAAM5qB,EACfqkB,EAZSzqH,KAYUyqH,UACnBtgB,EAbSnqG,KAaMmqG,MACfxS,EAASwS,EAAMxS,OACfC,EAAYuS,EAAMvS,UAetB,IAHAuS,EAAMtS,eAAiB,EAGlBl4F,EAAI,EAAGA,EAAI4pH,EAAa5pH,IACzBqC,EAAIi3F,EAAMt5F,GACVsB,EAAIonH,EAAM1oH,GAMVoxH,GALAlH,EAjCS7pH,KAiCe0qH,kBACpBb,EACA7nH,EAnCKhC,KAoCEa,QAEemT,IAQrB2jF,EAHL3jF,GADA+7G,EAAatF,GAAaxpH,GAAKgpH,EAAiB,EAAInuD,IACjCk1D,EAAS5qB,KAIxBzO,EAAO3jF,GAAO,IAIb2jF,EAAO3jF,GAAKhS,KACT41F,EAAU5jF,IAAQ4jF,EAAU5jF,GAAKhS,IACjC21F,EAAO3jF,GAAKhS,GAAK41F,EAAU5jF,GAAKhS,GAChC21F,EAAO3jF,GAAKhS,GAAGvC,MAAQ,MAEvBk4F,EAAO3jF,GAAKhS,GAAK,IAAI8tH,EACjB3lB,EACAA,EAAMxjG,QAAQsvF,YACd85B,EACA/tH,EACAguH,IAMZv/D,EAAQknC,EAAO3jF,GAAKhS,GACV,OAANf,IACAwvD,EAAMvkB,OAAO6kF,GAAYtgE,EAAMvkB,OArE1BlsC,KAqEwCa,OAAS,CAAC+K,EAAK6kD,EAAMqgE,IAAK7G,IAGlE1rD,EAAQ9N,EAAMqgE,OACfrgE,EAAMqJ,KAAOi3D,GAEjBtgE,EAAMogE,QAAU1mB,EAAMtS,cAKlBgyB,EAAehpH,MAAQ,IAA6B,IAhFnDb,KAgFkCixH,eACnCxgE,EAAMvkB,OAAO6kF,GAAU,GACnBtgE,EAAMvkB,OAlFTlsC,KAkFuBa,MAAQ,IAAMmB,EAAI,MAAM,KAKvC,YAAbw8G,GAIAnyE,EAAQ0jF,EAAa3pB,EAAW4qB,EAC5BvG,GAAa9yB,EAAOtrD,IAAUsrD,EAAOtrD,GAAOrqC,IAC5CqqC,EAAQsrD,EAAOtrD,GAAOrqC,GACtByuD,EAAMhxD,MAAQ4sC,EAAM5sC,MAChBI,KAAK4C,IAAI4pC,EAAM5sC,MAAOgxD,EAAMhxD,OAASI,KAAKuU,IAAInT,IAAM,GAIxDwvD,EAAMhxD,MAAQ8yE,EAAa9hB,EAAMhxD,OAASI,KAAKuU,IAAInT,IAAM,KAG7DwvD,EAAMhxD,MAAQ8yE,EAAa9hB,EAAMhxD,OAASwB,GAAK,IAGnDwvD,EAAMqgE,IAAMllH,EAAK6kD,EAAMqgE,IAAK7G,IAAmBhpH,GAAK,GAE1C,OAANA,IACAwvD,EAAMvkB,OAAO6kF,GAAUjpH,KAAK2oD,EAAMqgE,KAClCnH,EAAahqH,GAAK8wD,EAAMqgE,KAKf,YAAbtS,IACArU,EAAM1L,eAAgB,GAG1Bz+F,KAAK2pH,aAAeA,EAGpBxf,EAAMvS,UAAY,KAMtBguB,EAAO9iH,UAAU6tH,iBAAmB,WAChC,IAII9G,EAJAniH,EAAS1H,KACTomG,EAAW1+F,EAAO0+F,SAClBzO,EAASjwF,EAAOyiG,MAAMxS,OACtB+wB,EAAiBhhH,EAAOghH,eAG5BnpH,EAAK,CAAC6mG,EAAU,IAAMA,IAAW,SAASpyF,GAOtC,IANA,IACIhS,EACAyuD,EACAygE,EACAC,EAJAxxH,EAAI+oH,EAAe18G,OAMhBrM,KACHqC,EAAI0mH,EAAe/oH,GACnBkqH,EAAiBniH,EAAOgjH,kBACpBb,EACA7nH,EACA0F,EAAO7G,MACPmT,IAGJk9G,GADAzgE,EAAQknC,EAAO3jF,IAAQ2jF,EAAO3jF,GAAKhS,KACVyuD,EAAMvkB,OAAO29E,EAAe71G,QAEjDm9G,EAAc1gE,EAAMhxD,MAAQ,IAAMgxD,EAAMhxD,MAAQ,EAEhDyxH,EAAc,GAAK3+C,EAAa2+C,EAAc,GAAKC,GAEnDD,EAAc,GAAK3+C,EAAa2+C,EAAc,GAAKC,GACnDzpH,EAAOiiH,aAAahqH,GAAKuxH,EAAc,QAUvDtL,EAAO9iH,UAAU4nH,kBAAoB,SAASb,EAAgB7nH,EAAGnB,EAAOmT,GAiBpE,OAbKuqD,EAAQsrD,IAAmBA,EAAe7nH,IAAMA,GAChDgS,GAAO61G,EAAe71G,MAAQA,EAC/B61G,EAAiB,CACb7nH,EAAGA,EACHnB,MAAO,EACPmT,IAAKA,GAGT61G,EAAehpH,QAGnBgpH,EAAe71G,IAAM,CAACnT,EAAOmB,EAAG6nH,EAAehpH,OAAOk3B,KAAK,KAEpD8xF,GA5df,CA+dE9oH,GACD,SAASqR,GAMN,IAAIlQ,EAAWkQ,EAAElQ,SACbuzE,EAAUrjE,EAAEqjE,QACZuf,EAAO5iF,EAAE4iF,KACT/yF,EAAQmQ,EAAEnQ,MACVG,EAAgBgQ,EAAEhQ,cAClBE,EAAM8P,EAAE9P,IACRi8D,EAAUnsD,EAAEmsD,QACZh/D,EAAO6S,EAAE7S,KACTqvE,EAAQx8D,EAAEw8D,MACVpsE,EAAS4P,EAAE5P,OACX0yE,EAAY9iE,EAAE8iE,UACdnB,EAAU3hE,EAAE2hE,QACZjK,EAAW13D,EAAE03D,SACbqE,EAAW/7D,EAAE+7D,SACb34D,EAAUpD,EAAEoD,QACZjT,EAAQ6P,EAAE7P,MACVmqE,EAAat6D,EAAEs6D,WACf9gE,EAAOwG,EAAExG,KACTi6B,EAAQzzB,EAAEyzB,MACV+/E,EAASxzG,EAAEwzG,OACX96C,EAAc14D,EAAE04D,YAChBoI,EAAe9gE,EAAE8gE,aACjBpE,EAAQ18D,EAAE08D,MAGdtsE,EAAOP,EAAMa,UAAoD,CAyB7DsuH,UAAW,SAASzqH,EAASy/D,EAAQ7+D,GACjC,IAAIG,EACAP,EAAQnH,KAkBZ,OAhBI2G,IACAy/D,EAASx6D,EAAKw6D,GAAQ,GAEtB8O,EAAU/tE,EAAO,YAAa,CAC1BR,QAASA,IACV,WACCe,EAASP,EAAMy2G,WAAWj3G,GAE1BQ,EAAMswG,eAAgB,EACtBtwG,EAAM47G,aACF38C,GACAj/D,EAAMi/D,OAAO7+D,OAKlBG,GAoBX2pH,QAAS,SAAS1qH,EAAS6vF,EAAKpwB,EAAQ7+D,GACpC,IAAIyM,EAAMwiF,EAAM,QAAU,QACtB9tF,EAAe1I,KAAK2G,QACpB4vF,EAAch0F,EAAMoE,EAAS,CACzB9F,MAAOb,KAAKgU,GAAKhI,OACjBwqF,IAAKA,IAGb,IAAIxB,EAAKh1F,KAAMu2F,GAGf7tF,EAAasL,GAAO86D,EAAMpmE,EAAasL,IAAQ,IAC/CtL,EAAasL,GAAKlM,KAAKyuF,GAEnB3qF,EAAKw6D,GAAQ,IACbpmE,KAAKomE,OAAO7+D,IAqBpB+pH,YAAa,SAAS7iD,GAClB,IAAItnE,EAAQnH,KACR2G,EAAUQ,EAAMR,QAChB4qH,EAAapqH,EAAMoqH,WACnBC,EAAiB7qH,EAAQgnF,QACzB8jC,EAAiB,WACTF,GACAjvH,EAAIivH,EAAY,CACZvmH,KAAM7D,EAAMk6F,SAAW,KACvBv6F,IAAKK,EAAMi6F,QAAU,KACrBt8F,MAAOqC,EAAM+5F,UAAY,KACzBz8F,OAAQ0C,EAAMg6F,WAAa,QAMtCowB,IACDpqH,EAAMoqH,WAAaA,EAAanvH,EAAc,MAAO,CACjDsH,UAAW,gDACZ,KAAMvC,EAAMiB,WAEfjB,EAAMuqH,YAActvH,EAChB,OAAQ,CACJsH,UAAW,4BAEf,KACA6nH,GAEJrvH,EAASiF,EAAO,SAAUsqH,IAG9BF,EAAW7nH,UAAY,qBAGvBvC,EAAMuqH,YAAYrpH,UAAYomE,GAAO9nE,EAAQ1D,KAAK0qF,QAIlDrrF,EAAIivH,EAAY/uH,EAAOgvH,EAAehxH,MAAO,CACzCmJ,OAAQ,MAEZrH,EAAI6E,EAAMuqH,YAAaF,EAAeriC,YAGjChoF,EAAMwqH,eACPrvH,EAAIivH,EAAY,CACZniD,QAAS,EACThpE,QAAS,KAEbqvE,EAAQ87C,EAAY,CAChBniD,QAASoiD,EAAehxH,MAAM4uE,SAAW,IAC1C,CACC7pD,SAAUisG,EAAeI,cAAgB,KAKjDzqH,EAAMwqH,cAAe,EACrBF,KAYJI,YAAa,WACT,IAAIlrH,EAAU3G,KAAK2G,QACf4qH,EAAavxH,KAAKuxH,WAElBA,IACAA,EAAW7nH,UAAY,+CAEvB+rE,EAAQ87C,EAAY,CAChBniD,QAAS,GACV,CACC7pD,SAAU5e,EAAQgnF,QAAQmkC,cAAgB,IAC1CtlD,SAAU,WACNlqE,EAAIivH,EAAY,CACZnrH,QAAS,aAMzBpG,KAAK2xH,cAAe,GAMxBI,qBAAsB,CAAC,kBAAmB,cAAe,cAAe,SAAU,YAAa,cAC3F,eAAgB,aAAc,UAAW,aAAc,eAAgB,gBAAiB,cACxF,eAAgB,sBAAuB,sBAAuB,kBAAmB,kBACjF,aAAc,UAOlBC,yBAA0B,CAAC,iBAAkB,cACzC,2BAA4B,aAAc,SAAU,cACpD,WA6BJ/zG,OAAQ,SAAStX,EAASy/D,GACtB,IAOI6rD,EACAC,EACAC,EACAC,EAVAjrH,EAAQnH,KACRqyH,EAAS,CACL1iC,QAAS,aACTpvF,MAAO,WACPguF,SAAU,eAEd8uB,EAAe12G,EAAQQ,MAOvBk2G,IACA96G,GAAM,EAAM4E,EAAMR,QAAQQ,MAAOk2G,GAG7B,cAAeA,GACfl2G,EAAMk5G,aAAahD,EAAa3zG,YAGhC,aAAc2zG,GAAgB,UAAWA,KAGzCl2G,EAAM07G,iBACNoP,GAAgB,GAGhB,eAAgB5U,IAChB4U,GAAgB,GAGpBvlD,EAAW2wC,GAAc,SAAS1wC,EAAK34D,IAC8B,IAA7D+/D,EAAQ,SAAW//D,EAAK7M,EAAM6qH,4BAC9BE,GAAkB,IAG4B,IAA9Cn+C,EAAQ//D,EAAK7M,EAAM4qH,wBACnB5qH,EAAMuwG,YAAa,MAKvB,UAAW2F,GACXl2G,EAAMiE,SAASk1E,SAAS+8B,EAAa78G,QAOzCmG,EAAQslF,SACRjsF,KAAK2G,QAAQslF,OAAStlF,EAAQslF,QAI9BtlF,EAAQmvE,aACRvzE,GAAM,EAAMvC,KAAK2G,QAAQmvE,YAAanvE,EAAQmvE,aAalDpJ,EAAW/lE,GAAS,SAASgmE,EAAK34D,GAC1B7M,EAAM6M,IAAqC,mBAAtB7M,EAAM6M,GAAKiK,OAChC9W,EAAM6M,GAAKiK,OAAO0uD,GAAK,GAGc,mBAAvBxlE,EAAMkrH,EAAOr+G,KAC3B7M,EAAMkrH,EAAOr+G,IAAM24D,GAIX,UAAR34D,IACkD,IAAlD+/D,EAAQ//D,EAAK7M,EAAM6qH,4BAEnBE,GAAkB,MAU1B3yH,EAAK,CACD,QACA,QACA,QACA,SACA,YACA,SACD,SAASm3F,GACJ/vF,EAAQ+vF,IACRn3F,EAAKuvE,EAAMnoE,EAAQ+vF,KAAQ,SAAS47B,EAAY3yH,GAC5C,IAAIkvE,EACAtQ,EAAQ+zD,EAAWxjH,KACnB3H,EAAM4H,IAAIujH,EAAWxjH,KACpB3H,EAAMuvF,GAAM/2F,GACbkvE,GAAQA,EAAK6nB,OAASA,GACtB7nB,EAAK5wD,OAAOq0G,GAAY,SAMpCL,GACA1yH,EAAK4H,EAAM6wF,MAAM,SAASp0B,GACtBA,EAAK3lD,OAAO,IAAI,MAMpBi0G,GACA3yH,EAAK4H,EAAMO,QAAQ,SAASA,GACxBA,EAAOuW,OAAO,IAAI,MAKtBtX,EAAQgnF,SACRprF,GAAM,EAAM4E,EAAMR,QAAQgnF,QAAShnF,EAAQgnF,SAI/CwkC,EAAW9U,GAAgBA,EAAav4G,MACxCstH,EAAY/U,GAAgBA,EAAa54G,OACpCqlE,EAASqoD,IAAaA,IAAahrH,EAAMJ,YACzC+iE,EAASsoD,IAAcA,IAAcjrH,EAAMH,YAC5CG,EAAMg5E,QAAQgyC,EAAUC,GACjBxmH,EAAKw6D,GAAQ,IACpBj/D,EAAMi/D,UAOdmsD,YAAa,SAAS5rH,GAClB3G,KAAKu/G,cAAS50C,EAAWhkE,MAOjCnE,EAAOqjC,EAAM/iC,UAAoD,CA2B7Dmb,OAAQ,SAAStX,EAASy/D,EAAQ7+D,EAAWirH,GACzC,IAGI7yH,EAHA4gB,EAAQvgB,KACR0H,EAAS6Y,EAAM7Y,OACf6+F,EAAUhmF,EAAMgmF,QAEhBp/F,EAAQO,EAAOP,MACfiyF,EAAgB1xF,EAAOf,QAI3B,SAASsX,IAELsC,EAAMwjG,aAAap9G,GAGH,OAAZ4Z,EAAMtf,GAAcslG,IACpBhmF,EAAMgmF,QAAUA,EAAQj+F,WAExB6lE,EAASxnE,GAAS,KAEd4/F,GAAWA,EAAQz6B,SACfnlE,GAAWA,EAAQyxG,QAAUzxG,EAAQyxG,OAAO/yG,SAC5Ckb,EAAMgmF,QAAUA,EAAQj+F,WAG5B3B,GAAWA,EAAQ69G,YAAcjkG,EAAMykG,YACvCzkG,EAAMykG,UAAYzkG,EAAMykG,UAAU18G,YAK1C3I,EAAI4gB,EAAM1f,MACV6G,EAAOs/G,qBAAqBzmG,EAAO5gB,GAKnCy5F,EAAc55F,KAAKG,GACXwuE,EAASirB,EAAc55F,KAAKG,IAAI,IAChCwuE,EAASxnE,GAAS,GAEtB4Z,EAAM5Z,QACNA,EAGJe,EAAO04F,QAAU14F,EAAOo1F,aAAc,GACjCp1F,EAAO+qH,UAAY/qH,EAAOgrG,qBAC3BvrG,EAAMuwG,YAAa,GAGU,UAA7Bte,EAAc+hB,aACdh0G,EAAMswG,eAAgB,GAEtBrxC,GACAj/D,EAAMi/D,OAAO7+D,GA9CrB6+D,EAASx6D,EAAKw6D,GAAQ,IAmDL,IAAbosD,EACAv0G,IAEAsC,EAAM0wF,eAAe,SAAU,CAC3BtqG,QAASA,GACVsX,IAsBX9O,OAAQ,SAASi3D,EAAQ7+D,GACrBvH,KAAK0H,OAAOgrH,YAAY3+C,EAAQ/zE,KAAMA,KAAK0H,OAAOlI,MAAO4mE,EAAQ7+D,MAKzE/E,EAAOojH,EAAO9iH,UAA0C,CAwCpD6vH,SAAU,SAAShsH,EAASy/D,EAAQl4B,EAAO3mC,GACvC,IAOIgZ,EACAqyG,EAEAjzH,EACAqC,EAVAo3F,EADSp5F,KACc2G,QACvBnH,EAFSQ,KAEKR,KACd2H,EAHSnH,KAGMmH,MACf8wF,EAJSj4F,KAIMi4F,MACf9zD,EAAQ8zD,GAASA,EAAMnB,UAAYmB,EAAM9zD,MACzC+kF,EAAc9vB,EAAc55F,KAG5By5F,EATSj5F,KASMi5F,MAiBnB,GAZA7yB,EAASx6D,EAAKw6D,GAAQ,GAItB7lD,EAAQ,CACJ7Y,OAnBS1H,WAqBN+1E,WAAWjzE,UAAUihH,aAAax5G,MAAMgW,EAAO,CAAC5Z,IACvD3E,EAAIue,EAAMve,EAGVrC,EAAIs5F,EAAMjtF,OAzBGhM,KA0BF08F,gBAAkB16F,EAAIi3F,EAAMt5F,EAAI,GAEvC,IADAizH,GAAgB,EACTjzH,GAAKs5F,EAAMt5F,EAAI,GAAKqC,GACvBrC,IA7BKK,KAiCNgnH,qBAAqBzmG,EAAO,SAAU5gB,EAAG,EAAG,GAjCtCK,KAkCNgnH,qBAAqBzmG,EAAO5gB,GAE/BwkC,GAAS5jB,EAAMja,OACf69B,EAAMniC,GAAKue,EAAMja,MAErB4iH,EAAYhmE,OAAOvjD,EAAG,EAAGgH,GAErBisH,IAzCS5yH,KA0CFR,KAAK0jD,OAAOvjD,EAAG,EAAG,MA1ChBK,KA2CF+8F,eAIsB,UAA7B3D,EAAc+hB,YA/CLn7G,KAgDFg9F,iBAIP9uD,IACI1uC,EAAK,IAAMA,EAAK,GAAG2P,OACnB3P,EAAK,GAAG2P,QAAO,IAEf3P,EAAK0uC,QAxDAluC,KAyDEgnH,qBAAqBzmG,EAAO,SAEnC2oG,EAAYh7E,UA3DPluC,KAgENogG,SAAU,EAhEJpgG,KAiEN88F,aAAc,EAEjB12B,GACAj/D,EAAMi/D,OAAO7+D,IAwBrBmrH,YAAa,SAAS/yH,EAAGymE,EAAQ7+D,GAE7B,IAAIG,EAAS1H,KACTR,EAAOkI,EAAOlI,KACd+gB,EAAQ/gB,EAAKG,GACbusC,EAASxkC,EAAOwkC,OAChB/kC,EAAQO,EAAOP,MACfgI,EAAS,WAED+8B,GAAUA,EAAOlgC,SAAWxM,EAAKwM,QACjCkgC,EAAOgX,OAAOvjD,EAAG,GAErBH,EAAK0jD,OAAOvjD,EAAG,GACf+H,EAAOf,QAAQnH,KAAK0jD,OAAOvjD,EAAG,GAC9B+H,EAAOs/G,qBAAqBzmG,GAAS,CACjC7Y,OAAQA,GACT,SAAU/H,EAAG,GAEZ4gB,GACAA,EAAMjY,UAIVZ,EAAO04F,SAAU,EACjB14F,EAAOo1F,aAAc,EACjB12B,GACAj/D,EAAMi/D,UAIlB8M,EAAa3rE,EAAWJ,GACxBi/D,EAASx6D,EAAKw6D,GAAQ,GAGlB7lD,EACAA,EAAM0wF,eAAe,SAAU,KAAM9hG,GAErCA,KAmBRA,OAAQ,SAASi3D,EAAQ7+D,EAAWsrH,GAChC,IAAInrH,EAAS1H,KACTmH,EAAQO,EAAOP,MAEnB,SAASgI,IAGLzH,EAAOY,UAGPnB,EAAMswG,cAAgBtwG,EAAMuwG,YAAa,EACzCvwG,EAAM47G,aAEFn3G,EAAKw6D,GAAQ,IACbj/D,EAAMi/D,OAAO7+D,IAKH,IAAdsrH,EACA39C,EAAUxtE,EAAQ,SAAU,KAAMyH,GAElCA,KAwBR8O,OAAQ,SAASq0G,EAAYlsD,GACzB,IASI9kE,EATAoG,EAAS1H,KACTmH,EAAQO,EAAOP,MAGf2rH,EAAaprH,EAAO6uF,YACpBw8B,EAAUrrH,EAAOqrH,SAAWrrH,EAAO1C,KACnCguH,EAAUV,EAAWttH,MAAQ8tH,EAAW9tH,MAAQmC,EAAMR,QAAQQ,MAAMnC,KACpEiuH,EAAQnoD,EAAYioD,GAASjwH,UAC7BowH,EAAW,CAAC,QAAS,cAAe,mBAOxC,GAAIz+G,OAAOX,MAA+C,SAAvCW,OAAOX,KAAKw+G,GAAYzoG,WACvC,OAAO7pB,KAAK0mH,QAAQ4L,EAAW9yH,KAAM4mE,GA0BzC,IAAK9kE,KAtBA0xH,GAAWA,IAAYD,QAAkCpoD,IAAtB2nD,EAAW3oH,UAC/CupH,EAASlnH,OAAS,GAItBzM,EAAK2zH,GAAU,SAASznD,GACpBynD,EAASznD,GAAQ/jE,EAAO+jE,UACjB/jE,EAAO+jE,MAIlB6mD,EAAa/vH,EAAMuwH,EAAY,CAC3BvrH,WAAW,EACX1G,MAAO6G,EAAO7G,MACdumH,WAAY1/G,EAAOuxF,MAAM,IAC1B,CACCz5F,KAAMkI,EAAOf,QAAQnH,MACtB8yH,GAIH5qH,EAAOyH,QAAO,EAAO,MAAM,GACjB8jH,EACNvrH,EAAOpG,QAAKqpE,EAEhBnoE,EAAOkF,EAAQojE,EAAYkoD,GAAWD,GAASjwH,WAG/CvD,EAAK2zH,GAAU,SAASznD,GACpB/jE,EAAO+jE,GAAQynD,EAASznD,MAG5B/jE,EAAO4uE,KAAKnvE,EAAOmrH,GACnB5qH,EAAOqrH,QAAUA,EACjB5rH,EAAM47G,aACFn3G,EAAKw6D,GAAQ,IACbj/D,EAAMi/D,QAAO,MAMzB5jE,EAAOwyF,EAAKlyF,UAAmD,CAY3Dmb,OAAQ,SAAStX,EAASy/D,GACtB,IAAIj/D,EAAQnH,KAAKmH,MAEjBR,EAAUQ,EAAMR,QAAQ3G,KAAK02F,MAAM12F,KAAK2G,QAAQ9F,OAC5C0B,EAAMvC,KAAKu2F,YAAa5vF,GAE5B3G,KAAKsI,SAAQ,GAEbtI,KAAKs2E,KAAKnvE,EAAO3E,EAAOmE,EAAS,CAC7B4tE,YAAQ5J,KAGZxjE,EAAMuwG,YAAa,EACf9rG,EAAKw6D,GAAQ,IACbj/D,EAAMi/D,UAYdj3D,OAAQ,SAASi3D,GAOb,IANA,IAAIj/D,EAAQnH,KAAKmH,MACb6M,EAAMhU,KAAK02F,KACX65B,EAAavwH,KAAK0H,OAClB/H,EAAI4wH,EAAWvkH,OAGZrM,KACC4wH,EAAW5wH,IACX4wH,EAAW5wH,GAAGwP,QAAO,GAK7By/D,EAAMznE,EAAM6wF,KAAMh4F,MAClB4uE,EAAMznE,EAAM6M,GAAMhU,MAEdwV,EAAQrO,EAAMR,QAAQqN,IACtB7M,EAAMR,QAAQqN,GAAKkvC,OAAOljD,KAAK2G,QAAQ9F,MAAO,UAEvCsG,EAAMR,QAAQqN,GAGzBzU,EAAK4H,EAAM6M,IAAM,SAAS4vD,EAAMjkE,GAC5BikE,EAAKj9D,QAAQ9F,MAAQlB,KAEzBK,KAAKsI,UACLnB,EAAMuwG,YAAa,EAEf9rG,EAAKw6D,GAAQ,IACbj/D,EAAMi/D,UAadm5C,SAAU,SAAS7F,EAActzC,GAC7BpmE,KAAKie,OAAO,CACR1d,MAAOm5G,GACRtzC,IAUP+sD,cAAe,SAAS/iC,EAAYhqB,GAChCpmE,KAAKie,OAAO,CACRmyE,WAAYA,GACbhqB,MA36Bf,CAg7BErlE,GACD,SAASqR,GAMN,IAAI5T,EAAQ4T,EAAE5T,MACVe,EAAO6S,EAAE7S,KACTo9G,EAAoBvqG,EAAEuqG,kBACtB5oG,EAAM3B,EAAE2B,IACRnI,EAAOwG,EAAExG,KACTg6G,EAASxzG,EAAEwzG,QAQfhwC,EAPiBxjE,EAAEwjE,YAOR,OAAQ,OAAQ,CACvBmjB,eAAe,EACfj9B,UAAW,GAK6B,CACxCm1D,cAAc,EAKdmC,eAAgB,WACZ,IAWIC,EAEA1zH,EAZAmsC,EAAU,GACVh4B,EAAO,GACPmkF,EAAQj4F,KAAKi4F,MACbkS,EAAQnqG,KAAKmqG,MACb15C,EAAQ05C,EAAMxS,OAAO33F,KAAKomG,UAC1BktB,EAAW,GACXpnF,EAASlsC,KAAKksC,OACdqnF,EARSvzH,KAQYa,MACrB2yH,EAAcrpB,EAAMziG,OACpB+rH,EAAeD,EAAYxnH,OAE3B0nH,EAAW9nH,EAAKu+F,EAAMxjG,QAAQ6pH,gBAAgB,GAAQ,GAAK,EAG/D,GAAIxwH,KAAK2G,QAAQ63G,SAAU,CAEvB,IAAK7+G,EAAI,EAAGA,EAAIusC,EAAOlgC,OAAQrM,IAC3B2zH,EAASpnF,EAAOvsC,GAAGqC,GAAKkqC,EAAOvsC,GAInCyS,EAAEs6D,WAAWjc,GAAO,SAASkjE,EAAQ3xH,GACZ,OAAjB2xH,EAAOl0H,OACPqU,EAAKhM,KAAK9F,MAGlB8R,EAAK3U,MAAK,SAAS4G,EAAGC,GAClB,OAAOD,EAAIC,KAGfqtH,EAAgBt/G,EAAIy/G,GAAa,WAC7B,OAAOxzH,KAAK4H,WAGhBrI,EAAKuU,GAAM,SAAS9R,EAAG4xH,GACnB,IACIC,EACAC,EAFA7yH,EAAI,EAIR,GAAIqyH,EAAStxH,KAAOsxH,EAAStxH,GAAGmiH,OAC5Br4E,EAAQhkC,KAAKwrH,EAAStxH,IAGtBzC,EAAK,EAAE,EAAG,IAAI,SAASwvC,GACnB,IAAIglF,EAAyB,IAAdhlF,EAAkB,YAAc,WAC3CilF,EAA0B,IAAdjlF,EAAkB,aAAe,YAC7CklF,EAAQ,EACRC,EAAazjE,EAAM38C,EAAK8/G,EAAM7kF,IAGlC,GAAImlF,EAEA,IADAv0H,EAAI4zH,EACG5zH,GAAK,GAAKA,EAAI8zH,IACjBI,EAAaK,EAAWhoF,OAAOvsC,MAIvBA,IAAM4zH,EACND,EAAStxH,GAAG+xH,IAAY,EAKjBV,EAAc1zH,KACrBm0H,EAAgBrjE,EAAMzuD,GAAGkqC,OAAOvsC,MAE5Bs0H,GAASH,EAAc,GAAKA,EAAc,KAKtDn0H,GAAK+zH,EAGbJ,EAAStxH,GAAGgyH,GAAaC,SAO1B,CAKH,IADAt0H,EAAI4zH,EACG5zH,GAAK,GAAKA,EAAI8zH,GAAc,CAE/B,GADAI,EAAapjE,EAAMzuD,GAAGkqC,OAAOvsC,GACb,CACZsB,EAAI4yH,EAAW,GACf,MAGJl0H,GAAK+zH,EAETzyH,EAAIkpG,EAAM1iF,UAAUxmB,EAAG,EAAG,EAAG,EAAG,GAChC6qC,EAAQhkC,KAAK,CACTq8G,QAAQ,EACR3d,MAAOvO,EAAMxwE,UAAUzlB,EAAG,EAAG,EAAG,EAAG,GACnCA,EAAGA,EACHykG,MAAOxlG,EACPupH,QAASvpH,QAOzB,OAAO6qC,GAGXwgF,aAAc,SAASpgF,GACnB,IACIwgF,EAIAyH,EAEAC,EAIAz0H,EACA00H,EACA7tB,EAIA2d,EACAqG,EAlBA8B,EAAe1G,EAAO9iH,UAAUwpH,aAEhC3lH,EAAU3G,KAAK2G,QACf63G,EAAW73G,EAAQ63G,SACnBrU,EAAQnqG,KAAKmqG,MAIbmqB,EAAe,GACfC,EAAc,GACdhB,EAAcvzH,KAAKa,MAInB82F,EAASwS,EAAMxS,OAAO33F,KAAKomG,UAC3BtqC,EAAYn1D,EAAQm1D,UACpB04D,EAAsBrqB,EAAM5I,aAAa56F,EAAQm1D,WAGjD8wD,EAAejmH,EAAQimH,cAA6B,YAAbpO,EAKvCiW,EAAiB,SAAS90H,EAAG+0H,EAAQvhC,GACjC,IAIIrsF,EACAoE,EALAqV,EAAQ2rB,EAAOvsC,GACfm0H,EAAgBtV,GAAY7mB,EAAOp3E,EAAMve,GAAGkqC,OAAOqnF,GACnDoB,EAAUp0G,EAAM4yE,EAAO,SAAW,EAClCyhC,EAAWr0G,EAAM4yE,EAAO,UAAY,EAGpCgxB,GAAS,EAETyQ,GAAYD,GAEZ7tH,GAAO6tH,EAAUb,EAAc,GAAKA,EAAc,IAAMc,EACxD1pH,EAAS4oH,EAAc,GAAKc,EAC5BzQ,IAAWwQ,IAEHnW,GAAYtyE,EAAOwoF,IAAWxoF,EAAOwoF,GAAQvQ,SACrDr9G,EAAMoE,EAAS4wD,QAIP6O,IAAR7jE,IACAytH,EAAYzsH,KAAK,CACb0+F,MAAOA,EACPC,MAAe,OAAR3/F,EAAe0tH,EAAsBrqB,EAAM5I,aAAaz6F,GAC/Dq9G,OAAQA,EACR0Q,SAAS,IAEbP,EAAaxsH,KAAK,CACd0+F,MAAOA,EACPC,MAAkB,OAAXv7F,EAAkBspH,EAAsBrqB,EAAM5I,aAAar2F,GAClE4pH,SAAS,MAazB,IAPA5oF,EAASA,GAAUlsC,KAAKksC,OAGpBsyE,IACAtyE,EAASlsC,KAAKozH,kBAGbzzH,EAAI,EAAGA,EAAIusC,EAAOlgC,OAAQrM,IAC3BwkH,EAASj4E,EAAOvsC,GAAGwkH,OACnB3d,EAAQ56F,EAAKsgC,EAAOvsC,GAAGo1H,UAAW7oF,EAAOvsC,GAAG6mG,OAC5CgkB,EAAU5+G,EAAKsgC,EAAOvsC,GAAG6qH,QAASgK,GAE7BrQ,IAAUyI,IAENA,GACD6H,EAAe90H,EAAGA,EAAI,EAAG,QAGvBwkH,IAAW3F,GAAYoO,IACzB2H,EAAYzsH,KAAKokC,EAAOvsC,IACxB20H,EAAaxsH,KAAK,CACd9F,EAAGrC,EACH6mG,MAAOA,EACPC,MAAO+jB,KAIVoC,GACD6H,EAAe90H,EAAGA,EAAI,EAAG,UAmBrC,OAdAw0H,EAAU7H,EAAar9G,KAAKjP,KAAMu0H,GAAa,GAAM,GAErDD,EAAavhC,UAAW,GACxBqhC,EAAa9H,EAAar9G,KAAKjP,KAAMs0H,GAAc,GAAM,IAC1CtoH,SACXooH,EAAW,GAAK,KAGpBC,EAAWF,EAAQh8G,OAAOi8G,GAC1B1H,EAAYJ,EAAar9G,KAAKjP,KAAMu0H,GAAa,EAAO3H,GAExDyH,EAAS1H,KAAOwH,EAAQxH,KACxB3sH,KAAKq0H,SAAWA,EAET3H,GAQXQ,UAAW,WAGPltH,KAAKq0H,SAAW,GAGhBzO,EAAO9iH,UAAUoqH,UAAU3iH,MAAMvK,MAGjC,IAAI0H,EAAS1H,KACTq0H,EAAWr0H,KAAKq0H,SAChB1tH,EAAU3G,KAAK2G,QACfm+G,EAAQ9kH,KAAK8kH,MACb14G,EAAQ,CACJ,CACI,OACA,kBAEApM,KAAKxB,MACLmI,EAAQo/G,YAKpBxmH,EAAKulH,GAAO,SAASF,EAAMjlH,GACvByM,EAAMtE,KAAK,CACP,aAAenI,EACf,wCAA0CA,EAAI,IAAMilH,EAAKl7G,UAEzDk7G,EAAKpmH,OAASkJ,EAAOlJ,MACrBomH,EAAKmB,WAAap/G,EAAQo/G,eAKlCxmH,EAAK6M,GAAO,SAASq/D,GACjB,IAAIupD,EAAUvpD,EAAK,GACf3kC,EAAOp/B,EAAOstH,GAGdluF,GACAA,EAAKmmC,KAAOonD,EAAS1H,KACrB7lF,EAAK2uC,QAAQ,CACTp2E,EAAGg1H,MAIPvtF,EAAOp/B,EAAOstH,GAAWttH,EAAOP,MAAMiE,SAASqtC,KAAK47E,GAC/Cn6C,SAASzO,EAAK,IACdprE,KAAK,CAEFsE,KAAMiH,EACF6/D,EAAK,GACLjtE,EAAMitE,EAAK,IAAIqL,WAAWlrE,EAAKjF,EAAQsuH,YAAa,MAAOlmH,OAG/DpF,OAAQ,IACTmC,IAAIpE,EAAO0S,QACbgzD,QAAS,EAElBtmC,EAAKkmC,OAASqnD,EAAS1H,KACvB7lF,EAAKouF,UAAYvuH,EAAQuO,KAAO,EAAI,MAI5ColG,iBAAkBqC,EAAkBC,gBAtU5C,CAyUE77G,GACD,SAASqR,GAMN,IAAIxG,EAAOwG,EAAExG,MAQbgqE,EAPiBxjE,EAAEwjE,YAOR,SAAU,OAAQ,GAA+C,CAIxEq3C,eAAgB,SAAS/gF,EAAQ3rB,EAAO5gB,GACpC,IAMIw1H,EACAC,EACAC,EACAC,EACA1pD,EARA46B,EAAQjmF,EAAMimF,MACdC,EAAQlmF,EAAMkmF,MACdqmB,EAAY5gF,EAAOvsC,EAAI,GACvBwoC,EAAY+D,EAAOvsC,EAAI,GAO3B,SAASm1H,EAAQS,GACb,OAAOA,IACFA,EAAWpR,SACW,IAAvBoR,EAAWT,UACVv0G,EAAMs0G,QAIf,GAAIC,EAAQhI,IAAcgI,EAAQ3sF,GAAY,CAC1C,IAAIqtF,EAAQ1I,EAAUtmB,MAClBkV,EAAQoR,EAAUrmB,MAClBgvB,EAAQttF,EAAUq+D,MAClBkvB,EAAQvtF,EAAUs+D,MAClBkvB,EAAa,EAGjBP,GA5BY,IA4Ba3uB,EAAQiV,GA3BzBka,IA6BRN,GA9BY,IA8Bc7uB,EAAQivB,GA7B1BE,KA4BRP,GA7BY,IA6Bc7uB,EAAQivB,GA5B1BG,OA0BRT,GA3BY,IA2Ba3uB,EAAQgvB,GA1BzBI,OAiCJD,GAAeL,EAAaF,IAAcC,EAAa7uB,IAClD6uB,EAAaF,GAAa1uB,EAAQ6uB,GAI3CA,GAAcK,GADdP,GAAaO,GAKGja,GAAS0Z,EAAY3uB,EAEjC6uB,EAAa,EAAI7uB,GADjB2uB,EAAYv1H,KAAK4C,IAAIi5G,EAAOjV,IAErB2uB,EAAY1Z,GAAS0Z,EAAY3uB,IAExC6uB,EAAa,EAAI7uB,GADjB2uB,EAAYv1H,KAAKiS,IAAI4pG,EAAOjV,KAG5B6uB,EAAaI,GAASJ,EAAa7uB,EAEnC2uB,EAAY,EAAI3uB,GADhB6uB,EAAaz1H,KAAK4C,IAAIizH,EAAOjvB,IAEtB6uB,EAAaI,GAASJ,EAAa7uB,IAE1C2uB,EAAY,EAAI3uB,GADhB6uB,EAAaz1H,KAAKiS,IAAI4jH,EAAOjvB,KAKjClmF,EAAM80G,WAAaA,EACnB90G,EAAM+0G,WAAaA,EAsDvB,OAVA1pD,EAAM,CACF,IACAhgE,EAAKkhH,EAAUuI,WAAYvI,EAAUtmB,OACrC56F,EAAKkhH,EAAUwI,WAAYxI,EAAUrmB,OACrC76F,EAAKupH,EAAW3uB,GAChB56F,EAAKwpH,EAAW3uB,GAChBD,EACAC,GAEJqmB,EAAUuI,WAAavI,EAAUwI,WAAa,KACvC1pD,KArInB,CAyIE7qE,GACD,SAASqR,GAMN,IAAIyjH,EAAYzjH,EAAE04D,YAAYhkC,KAAKhkC,UAC/B+sF,EAAqBz9E,EAAEy9E,mBACvB8sB,EAAoBvqG,EAAEuqG,mBAK1B/mC,EAJiBxjE,EAAEwjE,YAIR,aAAc,SAAUia,EAAmB/oD,KAAM,CACxDssF,eAAgByC,EAAUzC,eAC1B9G,aAAcuJ,EAAUvJ,aACxBoE,eAAgBmF,EAAUnF,eAC1BxD,UAAW2I,EAAU3I,UACrB5S,iBAAkBqC,EAAkBC,gBAlB5C,CAqBE77G,GACD,SAASqR,GAMN,IAAIghE,EAAahhE,EAAEghE,WACf50E,EAAQ4T,EAAE5T,MACVe,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACXsnE,EAAW13D,EAAE03D,SACb6yC,EAAoBvqG,EAAEuqG,kBACtBp6G,EAAQ6P,EAAE7P,MACV0oE,EAAO74D,EAAE64D,KACTr/D,EAAOwG,EAAExG,KACTg6G,EAASxzG,EAAEwzG,OACXhwC,EAAaxjE,EAAEwjE,WACfh3E,EAAMwT,EAAExT,IAOZg3E,EAAW,SAAU,OAAQ,CACzBntE,aAAc,EAEd+xE,OAAO,EACPs7C,aAAc,GAEd1d,OAAQ,KACR2d,aAAc,GAEdC,eAAgB,EAChBhQ,cAAe,GACf5oB,WAAY,KACZ7xF,OAAQ,CACJC,MAAO,CACHy6G,MAAM,EAENgQ,WAAY,GACZ73C,QAAQ,GAIZr+E,OAAQ,CACJvB,MAAO,UACP2vF,YAAa,UACb/P,QAAQ,IAIhBomC,WAAY,CACRjgH,MAAO,KACPM,cAAe,KACf5D,EAAG,MAEP83F,eAAe,EACfmxB,oBAAoB,EACpBvZ,gBAAgB,EAChBvhB,QAAS,CACLl2C,SAAU,GAEd4iB,UAAW,EAEXqyB,YAAa,WAI6B,CAC1C86B,aAAc,EACd7Z,aAAa,EACb8mB,cAAe,CAAC,QAAS,mBACzBzL,WAAW,EAWXn0C,KAAM,WACFsvC,EAAO9iH,UAAUwzE,KAAK/rE,MAAMvK,KAAMwK,WAElC,IAAI9C,EAAS1H,KACTmH,EAAQO,EAAOP,MAIfA,EAAM89F,aACN1lG,EAAK4H,EAAMO,QAAQ,SAASyuH,GACpBA,EAAYnxH,OAAS0C,EAAO1C,OAC5BmxH,EAAY/1B,SAAU,OAUtCg2B,iBAAkB,WAEd,IAKIhwB,EALA1+F,EAAS1H,KACT2G,EAAUe,EAAOf,QACjBsxF,EAAQvwF,EAAOuwF,MACfkS,EAAQziG,EAAOyiG,MACfksB,EAAgBp+B,EAAMlF,SAEtBujC,EAAc,GACdC,EAAc,GAKO,IAArB5vH,EAAQi0B,SACR27F,EAAc,EAEdh3H,EAAKmI,EAAOP,MAAMO,QAAQ,SAASyuH,GAC/B,IAEIK,EAFA52B,EAAeu2B,EAAYxvH,QAC3B8vH,EAAaN,EAAYhsB,MAGzBgsB,EAAYnxH,OAAS0C,EAAO1C,OAExBmxH,EAAYvuH,SACXF,EAAOP,MAAMR,QAAQQ,MAAM6mF,oBAEhCmc,EAAMn8B,MAAQyoD,EAAWzoD,KACzBm8B,EAAMh+B,MAAQsqD,EAAWtqD,MAErByzB,EAAa4e,UACbpY,EAAW+vB,EAAY/vB,cACOz7B,IAA1B2rD,EAAYlwB,KACZkwB,EAAYlwB,GAAYmwB,KAE5BC,EAAcF,EAAYlwB,KACO,IAA1BxG,EAAahlE,WACpB47F,EAAcD,KAElBJ,EAAYK,YAAcA,MAKtC,IAAIE,EAAgB72H,KAAKiS,IACjBjS,KAAKuU,IAAI6jF,EAAMnF,SAAWmF,EAAMwF,cAAgB92F,EAAQy2F,YAAcnF,EAAMoE,mBAAqBpE,EAAMS,cAAgB,GACvHT,EAAMjqB,KAEV8nD,EAAeY,EAAgB/vH,EAAQmvH,aAEvCa,GADaD,EAAgB,EAAIZ,IACAS,GAAe,GAChDK,EAAa/2H,KAAKiS,IACdnL,EAAQkwH,eAAiB5+B,EAAMjqB,IAC/BpiE,EAAKjF,EAAQiwH,WAAYD,GAAoB,EAAI,EAAIhwH,EAAQovH,gBAIjEnL,GAFgB+L,EAAmBC,GAAc,GAElBd,IADnBpuH,EAAO8uH,aAAe,IAAMH,EAAgB,EAAI,IAExDM,EAAoBD,EAAgB,IACvCL,GAAiB,EAAI,GAO1B,OAJA3uH,EAAOovH,cAAgB,CACnBhyH,MAAO8xH,EACPr3F,OAAQqrF,GAELljH,EAAOovH,eAOlBC,SAAU,SAAS/0H,EAAGf,EAAGmI,EAAG1C,GACxB,IAKIwE,EACA8rH,EANA7vH,EAAQnH,KAAKmH,MACbqoF,EAAcxvF,KAAKwvF,YACnBynC,IAAWznC,EAAc,EAAI,GAAM,GACnC0nC,EAAS1nC,EAAc,EAAI,GAAM,EA6BrC,OAxBIroF,EAAMs0E,UAAYt0E,EAAMiE,SAAS4/E,QACjCksC,GAAU,GAKVl3H,KAAK2G,QAAQ6zE,QAGbpxE,EAFQvJ,KAAKC,MAAMkC,EAAIoH,GAAK6tH,GAC5Bj1H,EAAInC,KAAKC,MAAMkC,GAAKi1H,IAKxB/rH,EAASrL,KAAKC,MAAMmB,EAAIyF,GAAKwwH,EAC7BF,EAAUn3H,KAAKuU,IAAInT,IAAM,IAAOiK,EAAS,GAEzCxE,EAAIwE,GADJjK,EAAIpB,KAAKC,MAAMmB,GAAKi2H,GAIhBF,GAAWtwH,IACXzF,GAAK,EACLyF,GAAK,GAGF,CACH1E,EAAGA,EACHf,EAAGA,EACH6D,MAAOsE,EACP3E,OAAQiC,IAOhB+gB,UAAW,WACP,IAAI/f,EAAS1H,KACTmH,EAAQO,EAAOP,MACfR,EAAUe,EAAOf,QACjBwwH,EAAQzvH,EAAOyvH,MAAQzvH,EAAO20F,kBAAoB30F,EAAOuwF,MAAMnF,OAAS,EACxEtD,EAAc9nF,EAAO8nF,YAAc5jF,EAC/BjF,EAAQ6oF,YACR2nC,EAAQ,EAAI,GAEhBhtB,EAAQziG,EAAOyiG,MACfruC,EAAYn1D,EAAQm1D,UACpB04D,EAAsB9sH,EAAO8sH,oBAAsBrqB,EAAM5I,aAAazlC,GACtEk6D,EAAiBpqH,EAAKjF,EAAQqvH,eAAgB,GAC9CoB,EAAU1vH,EAAO0uH,mBACjBQ,EAAaQ,EAAQtyH,MACrBuyH,EAAa3vH,EAAOmjH,KAAOhrH,KAAK4C,IAAIm0H,EAAY,EAAI,EAAIpnC,GACxDo7B,EAAeljH,EAAOkjH,aAAewM,EAAQ73F,OAE7Cp4B,EAAMs0E,WACN+4C,GAAuB,IAMvB7tH,EAAQovH,eACRsB,EAAax3H,KAAKipB,KAAKuuG,IAG3BzR,EAAO9iH,UAAU2kB,UAAUld,MAAM7C,GAGjCnI,EAAKmI,EAAOwkC,QAAQ,SAAS3rB,GACzB,IAMI87F,EANAmO,EAAU5+G,EAAK2U,EAAMiqG,QAASgK,GAC9BhvC,EAAe,IAAM3lF,KAAKuU,IAAIo2G,GAC9B/jB,EAAQ5mG,KAAKiS,IAAIjS,KAAK4C,KAAK+iF,EAAcjlE,EAAMkmF,OAAQ0D,EAAMn8B,IAAMwX,GACnE8xC,EAAO/2G,EAAMimF,MAAQokB,EACrBC,EAAOwM,EACPE,EAAO13H,KAAKiS,IAAI20F,EAAO+jB,GAEvBgN,EAAO33H,KAAK4C,IAAIgkG,EAAO+jB,GAAW+M,EAGlC13H,KAAKuU,IAAIojH,GAAQxB,GACbA,IACAwB,EAAOxB,EACP3Z,GAAOlS,EAAMpX,WAAaxyE,EAAMwb,UAAcouE,EAAMpX,UAAYxyE,EAAMwb,SACtEw7F,EAAO13H,KAAKuU,IAAImjH,EAAO/C,GAAuBwB,EAC1CxL,EAAUwL,EACVxB,GAAuBnY,EAAK2Z,EAAiB,IAKzDz1G,EAAM+2G,KAAOA,EACb/2G,EAAMq2G,WAAaA,EAGnBr2G,EAAM6pF,WAAajjG,EAAMs0E,SAAW,CAAC0uB,EAAMn8B,IAAMm8B,EAAMh+B,IAAMhlE,EAAMk6F,SAAWoF,EAAO/+F,EAAOuwF,MAAMjqB,IAAMspD,EAAOzM,EAAO,EAAG2M,GAAQ,CAACF,EAAOzM,EAAO,EAAGpkB,EAAQ0D,EAAMh+B,IAAMhlE,EAAMi6F,QAASo2B,GAGtLj3G,EAAMk3G,UAAY,OAClBl3G,EAAMm3G,UAAYhwH,EAAOqvH,SAASxsH,MAC9B7C,EACA6Y,EAAM4jG,OAGN,CAACmT,EAAM9C,EAAqB3J,EAAM,GAAK,CAACyM,EAAMC,EAAM1M,EAAM2M,QAMtE/Q,UAAWx7C,EAKXqvC,iBAAkBqC,EAAkBC,cAMpCsQ,UAAW,WACPltH,KAAKoa,MAAMpa,KAAKm3H,MAAQ,WAAa,eAAe,0BAOxD7e,aAAc,SAAS/3F,EAAOsjE,GAC1B,IACI8zC,EACA/rD,EAUAg5C,EACAqR,EAbAtvH,EAAU3G,KAAK2G,QAGfixH,EAAM53H,KAAK63H,oBAAsB,GACjCC,EAAeF,EAAIhzH,QAAU,cAC7BmzH,EAAoBH,EAAI,iBAAmB,cAC3CjzH,EAAQ4b,GAASA,EAAM/hB,OAAUwB,KAAKxB,MACtCoG,EAAS2b,EAAMu3G,IAAiBnxH,EAAQmxH,IACxC93H,KAAKxB,OAASmG,EACd8zE,EAAcl4D,EAAMw3G,IACpBpxH,EAAQoxH,IAAsB/3H,KAAK+3H,IAAsB,EACzD/jC,EAAYrtF,EAAQotF,UAsCxB,OAjCIxzE,GAASvgB,KAAK8kH,MAAM94G,SACpB44G,EAAOrkG,EAAMskG,UACblgH,EAAO4b,EAAM5Z,QAAQnI,OAAUomH,GAAQA,EAAKpmH,OAAUwB,KAAKxB,OAI3DqlF,IAKAoyC,GAJA0B,EAAep1H,EACXoE,EAAQ4E,OAAOs4E,GACftjE,EAAM5Z,QAAQ4E,QAAUgV,EAAM5Z,QAAQ4E,OAAOs4E,IAAU,KAEjCoyC,WAC1BtxH,EAAOgzH,EAAan5H,YACAmsE,IAAfsrD,GAA4Bz3H,EAAMmG,GAAMkyE,SAAS8gD,EAAa1B,YAAYlnH,OAC3EpK,EACJC,EAAS+yH,EAAaG,IAAiBlzH,EACvC6zE,EAAck/C,EAAaI,IAAsBt/C,EACjDub,EAAY2jC,EAAa5jC,WAAaC,GAG1CpoB,EAAM,CACF,KAAQjnE,EACR,OAAUC,EACV,eAAgB6zE,GAEhB9xE,EAAQ8B,eACRmjE,EAAInqE,EAAIkF,EAAQ8B,cAGhBurF,IACApoB,EAAIooB,UAAYA,GAGbpoB,GASXy/C,WAAY,WACR,IAKIqM,EALAhwH,EAAS1H,KACTmH,EAAQnH,KAAKmH,MACbR,EAAUe,EAAOf,QACjByE,EAAWjE,EAAMiE,SACjB4sH,EAAiBrxH,EAAQqxH,gBAAkB,IAI/Cz4H,EAAKmI,EAAOwkC,QAAQ,SAAS3rB,GACzB,IAAIkmF,EAAQlmF,EAAMkmF,MACdF,EAAUhmF,EAAMgmF,QAEhBz8B,EAAS28B,IAAsB,OAAZlmF,EAAMtf,GACzBy2H,EAAYn3G,EAAMm3G,UAEdnxB,EACAA,EAAQp/F,EAAMq2G,WAAawa,EAAiB,UAAY,QACpDz1H,EAAMm1H,IAIVn3G,EAAMgmF,QAAUA,EAAUn7F,EAASmV,EAAMk3G,WAAWC,GAC/C5rH,IAAIyU,EAAMnG,OAAS1S,EAAO0S,OAKnCmsF,EACKlmG,KAAKqH,EAAO4wG,aAAa/3F,EAAOA,EAAM8+F,UAAY,WAClDjhC,OAAOz3E,EAAQy3E,OAAQ,KAAMz3E,EAAQ63G,WAAa73G,EAAQ8B,cAG/D89F,EAAQrsB,SAAS35D,EAAMokG,gBAAgB,IAGhCpe,IACPhmF,EAAMgmF,QAAUA,EAAQj+F,eASpCmtE,QAAS,SAASa,GACd,IAKIk+C,EALA9sH,EAAS1H,KACTmqG,EAAQnqG,KAAKmqG,MACbxjG,EAAUe,EAAOf,QACjB80E,EAAWz7E,KAAKmH,MAAMs0E,SACtBp7E,EAAO,GAGPzB,IACI03E,GACAj2E,EAAKs7E,OAAS,KACd64C,EAAsB30H,KAAKiS,IAAIq4F,EAAMh+B,IAAMg+B,EAAMn8B,IAAKnuE,KAAK4C,IAAI0nG,EAAMh+B,IAAKg+B,EAAM/P,SAASzzF,EAAQm1D,aAC7F2f,EACAp7E,EAAKoL,WAAa+oH,EAAsBrqB,EAAMn8B,IAE9C3tE,EAAKqL,WAAa8oH,EAEtB9sH,EAAO0S,MAAM/Z,KAAKA,KAIlBA,EAAKo7E,EAAW,aAAe,cAAgB0uB,EAAMh+B,IACrDzkE,EAAO0S,MAAMq7D,QAAQp1E,EAAMmC,EAAO4wE,EAAW1rE,EAAOf,QAAQY,WAAY,CAEpE2N,KAAM,SAASy3D,EAAKzvB,GAChBx1C,EAAO0S,MAAM/Z,KAAK,CACds7E,OAAQ97E,KAAK4C,IAAI,KAAOy6C,EAAGivB,WAMvCzkE,EAAO+tE,QAAU,QAQ7BtmE,OAAQ,WACJ,IAAIzH,EAAS1H,KACTmH,EAAQO,EAAOP,MAIfA,EAAM89F,aACN1lG,EAAK4H,EAAMO,QAAQ,SAASyuH,GACpBA,EAAYnxH,OAAS0C,EAAO1C,OAC5BmxH,EAAY/1B,SAAU,MAKlCwlB,EAAO9iH,UAAUqM,OAAO5E,MAAM7C,EAAQ8C,cAzdlD,CA6dEzJ,GACD,SAASqR,IAYNwjE,EALiBxjE,EAAEwjE,YAKR,MAAO,SAAU,KAAM,CAC9B6F,UAAU,IAblB,CAgBE16E,GACD,SAASqR,GAMN,IAAIwzG,EAASxzG,EAAEwzG,QAKfhwC,EAJiBxjE,EAAEwjE,YAIR,UAAW,OAAQ,CAC1BmgB,UAAW,EACX0Z,mBAAoB,KACpB2I,OAAQ,CACJ3wG,SAAS,GAEb2nF,QAAS,CAELK,aAAc,wGAGdC,YAAa,qDAIlB,CACCy2B,QAAQ,EACRzpB,gBAAgB,EAChBJ,iBAAiB,EACjB45B,cAAe,CAAC,QAAS,cAAe,mBACxC+B,qBAAqB,EACrB/K,UAAW,WACHltH,KAAK2G,QAAQovF,WACb6vB,EAAO9iH,UAAUoqH,UAAUj+G,KAAKjP,SAlChD,CAuCEe,GACD,SAASqR,GAMN,IAAIxG,EAAOwG,EAAExG,KACT+jE,EAAiBv9D,EAAEu9D,eAEvBv9D,EAAE8lH,oBAAsB,CAKpBC,UAAW,WAEP,IAGIC,EAMAz4H,EACAP,EAVAuH,EAAU3G,KAAK2G,QACfQ,EAAQnH,KAAKmH,MACbkxH,EAAc,GAAK1xH,EAAQ2xH,cAAgB,GAE3Cp3B,EAAY/5F,EAAM+5F,UAAY,EAAIm3B,EAClCl3B,EAAah6F,EAAMg6F,WAAa,EAAIk3B,EACpCE,EAAe5xH,EAAQgf,OACvBsiF,EAAY,CAACr8F,EAAK2sH,EAAa,GAAI,OAAQ3sH,EAAK2sH,EAAa,GAAI,OAAQ5xH,EAAQoP,MAAQ,OAAQpP,EAAQqkG,WAAa,GACtHwtB,EAAe34H,KAAKiS,IAAIovF,EAAWC,GAIvC,IAAKxhG,EAAI,EAAGA,EAAI,IAAKA,EACjBP,EAAQ6oG,EAAUtoG,GAClBy4H,EAAoBz4H,EAAI,GAAY,IAANA,GAAW,KAAKyH,KAAKhI,GAMnD6oG,EAAUtoG,GAAKgwE,EAAevwE,EAAO,CAAC8hG,EAAWC,EAAYq3B,EAAcvwB,EAAU,IAAItoG,KACpFy4H,EAAoBC,EAAc,GAO3C,OAHIpwB,EAAU,GAAKA,EAAU,KACzBA,EAAU,GAAKA,EAAU,IAEtBA,IA5CnB,CAgDElnG,GACD,SAASqR,GAMN,IAAIlQ,EAAWkQ,EAAElQ,SACbg2H,EAAsB9lH,EAAE8lH,oBACxB35D,EAAUnsD,EAAEmsD,QACZh/D,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACXuxE,EAAU3hE,EAAE2hE,QACZ4oC,EAAoBvqG,EAAEuqG,kBACtB1xC,EAAO74D,EAAE64D,KACTr/D,EAAOwG,EAAExG,KACTi6B,EAAQzzB,EAAEyzB,MACV+/E,EAASxzG,EAAEwzG,OACXhwC,EAAaxjE,EAAEwjE,WACf9K,EAAc14D,EAAE04D,YAChBoI,EAAe9gE,EAAE8gE,aAQrB0C,EAAW,MAAO,OAAQ,CACtBjwD,OAAQ,CAAC,KAAM,MACfkmB,MAAM,EACNm4E,cAAc,EACdQ,WAAY,CAKRtrE,SAAU,GACVzxC,SAAS,EACTyuF,UAAW,WACP,OAAOl2F,KAAKugB,MAAM4jG,YAASx5C,EAAY3qE,KAAKugB,MAAMja,MAGtDtE,EAAG,GAGPy2H,mBAAmB,EAEnBtd,WAAY,QACZ/C,OAAQ,KACRriG,KAAM,KACNklG,cAAc,EACdqd,aAAc,GACd3nB,gBAAgB,EAChBvhB,QAAS,CACL2a,eAAe,GAGnB5b,YAAa,UACbqB,YAAa,EACbjkF,OAAQ,CACJC,MAAO,CACHyqH,WAAY,GACZ73C,QAAQ,KAKuB,CACvCmzB,aAAa,EACb7U,gBAAgB,EAChB0S,aAAa,EACb9S,iBAAiB,EACjB45B,cAAe,CAAC,QAAS,mBACzB9P,UAAW,GACX9N,aAAcxtC,EAAY4tD,OAAO51H,UAAUw1G,aAI3C7iC,QAAS,SAASa,GACd,IAAI5uE,EAAS1H,KACTksC,EAASxkC,EAAOwkC,OAChBysF,EAAgBjxH,EAAOixH,cAEtBriD,IACD/2E,EAAK2sC,GAAQ,SAAS3rB,GAClB,IAAIgmF,EAAUhmF,EAAMgmF,QAChBjoF,EAAOiC,EAAMm3G,UAEbnxB,IAEAA,EAAQlmG,KAAK,CACToB,EAAG8e,EAAMq4G,QAAWlxH,EAAOie,OAAO,GAAK,EACvC3Q,MAAO2jH,EACPz2G,IAAKy2G,IAITpyB,EAAQ9wB,QAAQ,CACZh0E,EAAG6c,EAAK7c,EACRuT,MAAOsJ,EAAKtJ,MACZkN,IAAK5D,EAAK4D,KACXxa,EAAOf,QAAQY,eAK1BG,EAAO+tE,QAAU,OAOzBgpC,aAAc,WACV,IAAI9+G,EAIA4gB,EAHA9gB,EAAQ,EACRysC,EAASlsC,KAAKksC,OACd8hC,EAAM9hC,EAAOlgC,OAEbysH,EAAoBz4H,KAAK2G,QAAQ8xH,kBAGrC,IAAK94H,EAAI,EAAGA,EAAIquE,EAAKruE,IACjB4gB,EAAQ2rB,EAAOvsC,GACfF,GAAUg5H,IAAsBl4G,EAAM3Y,SAElC2Y,EAAM4jG,OADN,EACmB5jG,EAAMtf,EAKjC,IAHAjB,KAAKP,MAAQA,EAGRE,EAAI,EAAGA,EAAIquE,EAAKruE,KACjB4gB,EAAQ2rB,EAAOvsC,IACTulH,WAAczlH,EAAQ,IAAM8gB,EAAM3Y,UAAY6wH,GAAsBl4G,EAAMtf,EAAIxB,EAAQ,IAAM,EAClG8gB,EAAM9gB,MAAQA,GAOtBu9F,eAAgB,WACZ4oB,EAAO9iH,UAAUk6F,eAAe/tF,KAAKjP,MACrCA,KAAKy+G,gBAMTh3F,UAAW,SAASwgF,GAChBjoG,KAAKg9F,iBAEL,IAMI67B,EACA7jH,EACAkN,EACAuoB,EAMAquF,EACAC,EAGAp5H,EAEA4gB,EApBAy4G,EAAa,EAEbryH,EAHS3G,KAGQ2G,QACjB2xH,EAAe3xH,EAAQ2xH,aACvBW,EAAkBX,GAAgB3xH,EAAQ6oF,aAAe,GAKzD1hC,EAAannD,EAAQmnD,YAAc,EACnC6qE,EAXS34H,KAWc24H,cAAgB94H,KAAKsjB,GAAK,KAAO2qC,EAAa,IAErEorE,GAbSl5H,KAYYm5H,YAAct5H,KAAKsjB,GAAK,KAAQvX,EAAKjF,EAAQonD,SAAUD,EAAa,KAAQ,KAC5E6qE,EACrBzsF,EAdSlsC,KAcOksC,OAGhBktF,EAAgBzyH,EAAQ69G,WAAWtrE,SACnCu/E,EAAoB9xH,EAAQ8xH,kBAE5BzqD,EAAM9hC,EAAOlgC,OAqBjB,IAfKi8F,IA1BQjoG,KA2BF2lB,OAASsiF,EA3BPjoG,KA2B0Bm4H,aA3B1Bn4H,KAiCNq5H,KAAO,SAASp4H,EAAG+J,EAAMuV,GAE5B,OADAkqB,EAAQ5qC,KAAKikB,KAAKjkB,KAAKiS,KAAK7Q,EAAIgnG,EAAU,KAAOA,EAAU,GAAK,EAAI1nF,EAAM64G,eAAgB,IACnFnxB,EAAU,IACZj9F,GAAQ,EAAI,IACZnL,KAAKkrB,IAAI0f,IAAUw9D,EAAU,GAAK,EAAI1nF,EAAM64G,iBAIhDz5H,EAAI,EAAGA,EAAIquE,EAAKruE,KAEjB4gB,EAAQ2rB,EAAOvsC,IAGTy5H,cAAgBxtH,EAClB2U,EAAM5Z,QAAQ69G,YAAcjkG,EAAM5Z,QAAQ69G,WAAWtrE,SACrDkgF,GAhDKp5H,KAoDFs5H,iBAAmBz5H,KAAK4C,IApDtBzC,KAoDiCs5H,kBAAoB,EAAG/4G,EAAM64G,eAGvEpkH,EAAQ2jH,EAAiBK,EAAaE,EACjCT,IAAqBl4G,EAAM3Y,UAC5BoxH,GAAcz4G,EAAM2kG,WAAa,KAErChjG,EAAMy2G,EAAiBK,EAAaE,EAGpC34G,EAAMk3G,UAAY,MAClBl3G,EAAMm3G,UAAY,CACd11H,EAAGimG,EAAU,GACbhnG,EAAGgnG,EAAU,GACbxmG,EAAGwmG,EAAU,GAAK,EAClBlkB,OAAQkkB,EAAU,GAAK,EACvBjzF,MAAOnV,KAAKC,MAlEJ,IAkEUkV,GAlEV,IAmERkN,IAAKriB,KAAKC,MAnEF,IAmEQoiB,GAnER,MAuEZuoB,GAASvoB,EAAMlN,GAAS,GACZ,IAAMnV,KAAKsjB,GACnBsnB,GAAS,EAAI5qC,KAAKsjB,GACXsnB,GAAS5qC,KAAKsjB,GAAK,IAC1BsnB,GAAS,EAAI5qC,KAAKsjB,IAItB5C,EAAMg5G,kBAAoB,CACtB9tH,WAAY5L,KAAKC,MAAMD,KAAKkrB,IAAI0f,GAAS6tF,GACzC5sH,WAAY7L,KAAKC,MAAMD,KAAKqkB,IAAIumB,GAAS6tF,IAI7CQ,EAAUj5H,KAAKkrB,IAAI0f,GAASw9D,EAAU,GAAK,EAC3C8wB,EAAUl5H,KAAKqkB,IAAIumB,GAASw9D,EAAU,GAAK,EAC3C1nF,EAAM6pF,WAAa,CACfnC,EAAU,GAAe,GAAV6wB,EACf7wB,EAAU,GAAe,GAAV8wB,GAGnBx4G,EAAMi5G,KAAO/uF,GAAS5qC,KAAKsjB,GAAK,GAAKsnB,EAAQ5qC,KAAKsjB,GAAK,EAAI,EAAI,EAC/D5C,EAAMkqB,MAAQA,EAKdouF,EAAuBh5H,KAAKiS,IAAImnH,EAAiB14G,EAAM64G,cAAgB,GACvE74G,EAAMk5G,SAAW,CACbxxB,EAAU,GAAK6wB,EAAUj5H,KAAKkrB,IAAI0f,GAASlqB,EAAM64G,cACjDnxB,EAAU,GAAK8wB,EAAUl5H,KAAKqkB,IAAIumB,GAASlqB,EAAM64G,cACjDnxB,EAAU,GAAK6wB,EAAUj5H,KAAKkrB,IAAI0f,GAASouF,EAC3C5wB,EAAU,GAAK8wB,EAAUl5H,KAAKqkB,IAAIumB,GAASouF,EAC3C5wB,EAAU,GAAK6wB,EACf7wB,EAAU,GAAK8wB,EACfx4G,EAAM64G,cAAgB,EACtB,SACA74G,EAAMi5G,KAAO,QAAU,OACvB/uF,IAMZyiF,UAAW,KAKX7B,WAAY,WACR,IAGIqO,EAEAnzB,EAEAozB,EACAjC,EARAhwH,EAAS1H,KAEToL,EADQ1D,EAAOP,MACEiE,SASjBgzE,EAAS12E,EAAOf,QAAQy3E,OACxBA,IAAW12E,EAAOkyH,cAClBlyH,EAAOkyH,YAAcxuH,EAAS3K,EAAE,UAC3BqL,IAAIpE,EAAO0S,QAKpB7a,EAAKmI,EAAOwkC,QAAQ,SAAS3rB,GACzB,IAAKA,EAAM4jG,OAAQ,CACf5d,EAAUhmF,EAAMgmF,QAChBmxB,EAAYn3G,EAAMm3G,UAKlBgC,EAAmBn5G,EAAMs5G,eAIzB,IAAID,EAAcr5G,EAAMq5G,YACpBx7C,IAAWw7C,IACXA,EAAcr5G,EAAMq5G,YAAcxuH,EAAS3K,EAAE,UACxCqL,IAAIpE,EAAOkyH,cAGhBA,GACAA,EAAYv5H,KAAKq5H,GAErBC,EAAYjyH,EAAO4wG,aAAa/3F,EAAOA,EAAM8+F,UAAY,UAIrD9Y,EACAA,EACKhrB,mBAAmB7zE,EAAOie,QAE1BtlB,KAAKs5H,GAELlkD,QAAQjzE,EAAOk1H,EAAWgC,KAG/Bn5G,EAAMgmF,QAAUA,EAAUn7F,EAASmV,EAAMk3G,WAAWC,GAC/Cn8C,mBAAmB7zE,EAAOie,QAC1BtlB,KAAKq5H,GACL5tH,IAAIpE,EAAO0S,OAEXmG,EAAM3Y,SACP2+F,EAAQlmG,KAAK,CACT88E,WAAY,WAKpBopB,EACKlmG,KAAKs5H,GACLt5H,KAAK,CACF,kBAAmB,UAEtB+9E,OAAOA,EAAQw7C,IAIxBrzB,EAAQrsB,SAAS35D,EAAMokG,qBAQnCnV,YAAavkC,EAKb6uD,YAAa,SAAS5tF,EAAQ9Q,GAC1B8Q,EAAO/sC,MAAK,SAAS4G,EAAGC,GACpB,YAAmB2kE,IAAZ5kE,EAAE0kC,QAAwBzkC,EAAEykC,MAAQ1kC,EAAE0kC,OAASrP,MAO9Dk/E,iBAAkBqC,EAAkBC,cAKpCub,UAAWD,EAAoBC,UAK/B1R,UAAWx7C,GAOiD,CAI5DqL,KAAM,WAEFzwC,EAAM/iC,UAAUwzE,KAAK/rE,MAAMvK,KAAMwK,WAEjC,IACIuvH,EADAx5G,EAAQvgB,KAYZ,OATAugB,EAAMja,KAAOsF,EAAK2U,EAAMja,KAAM,SAG9ByzH,EAAc,SAAS1wH,GACnBkX,EAAMjR,MAAiB,WAAXjG,EAAErE,OAElB9C,EAASqe,EAAO,SAAUw5G,GAC1B73H,EAASqe,EAAO,WAAYw5G,GAErBx5G,GAMX6jG,QAAS,WACL,OAAOhyG,EAAE03D,SAAS9pE,KAAKiB,GAAG,IAASjB,KAAKiB,GAAK,GAQjD+4H,WAAY,SAASC,EAAK7zD,GACtB,IAAI7lD,EAAQvgB,KACR0H,EAAS6Y,EAAM7Y,OACfP,EAAQO,EAAOP,MACfsxH,EAAoB/wH,EAAOf,QAAQ8xH,kBAEvCryD,EAASx6D,EAAKw6D,EAAQqyD,GAElBwB,IAAQ15G,EAAM3Y,UAGd2Y,EAAM3Y,QAAU2Y,EAAM5Z,QAAQiB,QAAUqyH,OAActvD,IAARsvD,GAAqB15G,EAAM3Y,QAAUqyH,EACnFvyH,EAAOf,QAAQnH,KAAKu0E,EAAQxzD,EAAO7Y,EAAOlI,OAAS+gB,EAAM5Z,QAIzDpH,EAAK,CAAC,UAAW,YAAa,YAAa,gBAAgB,SAASyU,GAC5DuM,EAAMvM,IACNuM,EAAMvM,GAAKimH,EAAM,OAAS,SAAQ,MAItC15G,EAAMs3F,YACN1wG,EAAMsnF,OAAOkpB,aAAap3F,EAAO05G,GAIhCA,GAAuB,UAAhB15G,EAAMsjE,OACdtjE,EAAMxW,SAAS,IAIf0uH,IACA/wH,EAAO04F,SAAU,GAGjBh6B,GACAj/D,EAAMi/D,WAUlB92D,MAAO,SAAS4qH,EAAQ9zD,EAAQ7+D,GAC5B,IACIG,EADQ1H,KACO0H,OACfP,EAAQO,EAAOP,MAEnB+rE,EAAa3rE,EAAWJ,GAGxBi/D,EAASx6D,EAAKw6D,GAAQ,GAPVpmE,KAUNk6H,OAVMl6H,KAUS2G,QAAQuzH,OAASA,EAAS37D,EAAQ27D,GAAUA,GAVrDl6H,KAUqEk6H,OACjFxyH,EAAOf,QAAQnH,KAAKu0E,EAXR/zE,KAWuB0H,EAAOlI,OAX9BQ,KAW6C2G,QAX7C3G,KAaNumG,QAAQ9wB,QAAQz1E,KAAK65H,gBAbf75H,KAgBF45H,aAhBE55H,KAiBF45H,YAAYnkD,QAAQz1E,KAAK65H,iBAKvCA,aAAc,WACV,OAAO75H,KAAKk6H,OAASl6H,KAAKu5H,kBAAoB,CAC1C9tH,WAAY,EACZC,WAAY,IAIpByuH,SAAU,SAASpkH,GACf,IAAI2hH,EAAY13H,KAAK03H,UAErB,OAAO13H,KAAKk6H,SAAWl6H,KAAK4H,QAAU,GAClC5H,KAAK0H,OAAOP,MAAMiE,SAASrI,QAAQpE,IAC/B+4H,EAAU11H,EACV01H,EAAUz2H,EACVy2H,EAAUj2H,EAAIsU,EACd2hH,EAAUj2H,EAAIsU,EAAM,CAChBguE,OAAQ/jF,KAAK03H,UAAUj2H,EACvBuT,MAAO0iH,EAAU1iH,MACjBkN,IAAKw1G,EAAUx1G,SA/fvC,CAqgBEnhB,GACD,SAASqR,GAMN,IAAIlQ,EAAWkQ,EAAElQ,SACb2wE,EAAWzgE,EAAEygE,SACbtU,EAAUnsD,EAAEmsD,QACZh/D,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACXopB,EAASxZ,EAAEwZ,OACX7X,EAAM3B,EAAE2B,IACRxR,EAAQ6P,EAAE7P,MACV0oE,EAAO74D,EAAE64D,KACTr/D,EAAOwG,EAAExG,KACT+jE,EAAiBv9D,EAAEu9D,eACnBi2C,EAASxzG,EAAEwzG,OACX96C,EAAc14D,EAAE04D,YAChB0H,EAAapgE,EAAEogE,WASnBpgE,EAAE86F,WAAa,SAASP,EAAO3+B,GAE3B,IAAIruE,EAIAu0E,EACA9pE,EAJAgwH,GAAc,EACdC,EAAY1tB,EACZ2tB,EAAY,GAGZ76H,EAAQ,EAEZ,SAAS86H,EAAax0H,EAAGC,GACrB,OAAOD,EAAEqE,OAASpE,EAAEoE,OAKxB,IADAzK,EAAIgtG,EAAM3gG,OACHrM,KACHF,GAASktG,EAAMhtG,GAAGoW,KAItB,GAAItW,EAAQuuE,EAAK,CAMb,IALAwE,EAAWm6B,GAAO,SAAS5mG,EAAGC,GAC1B,OAAQA,EAAEinG,MAAQ,IAAMlnG,EAAEknG,MAAQ,MAEtCttG,EAAI,EACJF,EAAQ,EACDA,GAASuuE,GACZvuE,GAASktG,EAAMhtG,GAAGoW,KAClBpW,IAEJ26H,EAAY3tB,EAAMzpD,OAAOvjD,EAAI,EAAGgtG,EAAM3gG,QAgB1C,IAZAwmE,EAAWm6B,EAAO4tB,GAKlB5tB,EAAQ54F,EAAI44F,GAAO,SAASz4B,GACxB,MAAO,CACHn+D,KAAMm+D,EAAIn+D,KACVoS,QAAS,CAAC+rD,EAAI9pE,YAIfgwH,GAAa,CAGhB,IADAz6H,EAAIgtG,EAAM3gG,OACHrM,KACHu0E,EAAMy4B,EAAMhtG,GAEZyK,GAAUvK,KAAKiS,IAAIvH,MAAM,EAAG2pE,EAAI/rD,SAAWtoB,KAAK4C,IAAI8H,MAAM,EAAG2pE,EAAI/rD,UAAY,EAC7E+rD,EAAI/H,IAAMtsE,KAAKiS,IAAIjS,KAAK4C,IAAI,EAAG2H,EAAS8pE,EAAIn+D,KAAO,GAAIi4D,EAAMkG,EAAIn+D,MAMrE,IAFApW,EAAIgtG,EAAM3gG,OACVouH,GAAc,EACPz6H,KACCA,EAAI,GAAKgtG,EAAMhtG,EAAI,GAAGwsE,IAAMwgC,EAAMhtG,EAAI,GAAGoW,KAAO42F,EAAMhtG,GAAGwsE,MACzDwgC,EAAMhtG,EAAI,GAAGoW,MAAQ42F,EAAMhtG,GAAGoW,KAC9B42F,EAAMhtG,EAAI,GAAGwoB,QAAUwkF,EAAMhtG,EAAI,GAAGwoB,QAAQhQ,OAAOw0F,EAAMhtG,GAAGwoB,SAGxDwkF,EAAMhtG,EAAI,GAAGwsE,IAAMwgC,EAAMhtG,EAAI,GAAGoW,KAAOi4D,IACvC2+B,EAAMhtG,EAAI,GAAGwsE,IAAM6B,EAAM2+B,EAAMhtG,EAAI,GAAGoW,MAE1C42F,EAAMzpD,OAAOvjD,EAAG,GAChBy6H,GAAc,GAM1Bz6H,EAAI,EACJJ,EAAKotG,GAAO,SAASz4B,GACjB,IAAIsmD,EAAoB,EACxBj7H,EAAK20E,EAAI/rD,SAAS,WACdkyG,EAAU16H,GAAGwsE,IAAM+H,EAAI/H,IAAMquD,EAC7BA,GAAqBH,EAAU16H,GAAGoW,KAClCpW,UAKR06H,EAAUvyH,KAAKyC,MAAM8vH,EAAWC,GAChC9nD,EAAW6nD,EAAWE,IAO1B3U,EAAO9iH,UAAU0rH,eAAiB,WAC9B,IAIIzC,EACA0O,EAEAhsD,EACAqjC,EARApqG,EAAS1H,KACTo5F,EAAgB1xF,EAAOf,QACvBA,EAAUyyF,EAAcorB,WACxBt4E,EAASxkC,EAAOwkC,OAGhB+4D,EAAcv9F,EAAOu9F,aAAe,EAGpCy1B,EAAQ9uH,EAAKjF,EAAQ+zH,QAASthC,EAAc7xF,WAC5C6D,EAAW1D,EAAOP,MAAMiE,UAExBzE,EAAQc,SAAWC,EAAO+8G,mBAGtB/8G,EAAOizH,kBACPjzH,EAAOizH,iBAAiBh0H,GAI5BmrG,EAAkBpqG,EAAOy+F,UACrB,kBACA,cACAu0B,IAAUz1B,EAAc,SAAW,UACnCt+F,EAAQgD,QAAU,GAGlB+wH,IACA5oB,EAAgBzxG,KAAK,CACjB+uE,SAAU61B,IAETA,GACD/iG,EAASwF,EAAQ,gBAAgB,WACzBA,EAAOE,SACPkqG,EAAgB50B,MAAK,GAEzB40B,EAAgB1Y,EAAc7xF,UAAY,UAAY,QAAQ,CAC1D6nE,QAAS,GACV,CACC7pD,SAAU,UAO1Bk1G,EAAiB9zH,EACjBpH,EAAK2sC,GAAQ,SAAS3rB,GAClB,IAAI9Y,EAEAimG,EACArtG,EACAy3C,EAGAt3C,EANAwkH,EAAYzkG,EAAMykG,UAIlB4V,EAAYr6G,EAAMq6G,UAClB5qC,GAASg1B,EAKb+G,EAAexrG,EAAMs6G,WAAct6G,EAAM5Z,SAAW4Z,EAAM5Z,QAAQ69G,YAClE/8G,EAAUmE,EAAKmgH,GAAgBA,EAAatkH,QAASgzH,EAAehzH,UAAwB,OAAZ8Y,EAAMtf,KAIlF0F,EAAUpE,EAAMk4H,EAAgB1O,GAChCre,EAAcntF,EAAM6rF,iBACpB39B,EAAM9nE,EAAQilB,OACVA,EAAOjlB,EAAQilB,OAAQ8hF,GACvB/mG,EAAQuvF,UAAUjnF,KAAKy+F,EAAa/mG,GACxCnG,EAAQmG,EAAQnG,MAChBs3C,EAAWnxC,EAAQmxC,SAGnBt3C,EAAMhC,MAAQoN,EAAKjF,EAAQnI,MAAOgC,EAAMhC,MAAOkJ,EAAOlJ,MAAO,WAEzC,aAAhBgC,EAAMhC,QACN+hB,EAAMu6G,cAAgB1vH,EAASutE,YAAYp4D,EAAM/hB,OAASkJ,EAAOlJ,OACjEgC,EAAMhC,MAAQmI,EAAQ8qC,QAAU7lC,EAAK2U,EAAM64G,cAAezyH,EAAQuyC,UAAY,GACxEkgD,EAAcolB,SAAWj+F,EAAMu6G,cAAgB,WAErD1hC,EAAc3uF,SACdjK,EAAMiK,OAAS2uF,EAAc3uF,QAIjCpK,EAAO,CAGHsE,KAAMgC,EAAQynF,gBACdxpF,OAAQ+B,EAAQwnF,YAChB,eAAgBxnF,EAAQ6oF,YAExB/tF,EAAGkF,EAAQ8B,cAAgB,EAC3BqvC,SAAUA,EACVl0C,QAAS+C,EAAQ/C,QACjB+F,OAAQ,GAIZyI,EAAEs6D,WAAWrsE,GAAM,SAASssE,EAAKrmE,QACjBqkE,IAARgC,UACOtsE,EAAKiG,QAKpB0+G,GAAev9G,GAAY82D,EAAQkQ,GAO5BhnE,GAAW82D,EAAQkQ,KAErBu2C,EAiBD3kH,EAAKC,KAAOmuE,GAhBZu2C,EAAYzkG,EAAMykG,UAAY55G,EAAS0sC,EAAW,OAAS,SACvD22B,EACA,GAAI,KACJ9nE,EAAQ08E,MACR,KACA,KACA18E,EAAQg/E,QACR,KACA,eAEMzL,SACN,+BAAiC35D,EAAMisF,WACvC,KAAO7lG,EAAQ+C,WAAa,KAC3B/C,EAAQg/E,QAAU,qBAAuB,KAKlDq/B,EAAU3kH,KAAKA,GAGf2kH,EAAU1iH,IAAI9B,GAAO49E,OAAOz3E,EAAQy3E,QAG/B4mC,EAAU/pC,OACX+pC,EAAUl5G,IAAIgmG,GAGlBpqG,EAAOqzH,eAAex6G,EAAOykG,EAAWr+G,EAAS,KAAMqpF,KArCvDzvE,EAAMykG,UAAYA,EAAYA,EAAU18G,UACpCsyH,IACAr6G,EAAMq6G,UAAYA,EAAUtyH,iBA4ChDs9G,EAAO9iH,UAAUi4H,eAAiB,SAASx6G,EAAOykG,EAAWr+G,EAASo1E,EAASiU,GAC3E,IAKIlsF,EACAiiF,EAEAi1C,EACAC,EAEAn1C,EAeA1J,EA1BAj1E,EAAQnH,KAAKmH,MACbs0E,EAAWt0E,EAAMs0E,SACjB+qB,EAAQ56F,EAAK2U,EAAMimF,OAAQ,MAC3BC,EAAQ76F,EAAK2U,EAAMkmF,OAAQ,MAC3BjqB,EAAOwoC,EAAU3oC,UAGjBvkC,EAAWnxC,EAAQmxC,SAGnBvzC,EAAQoC,EAAQpC,MAGhBqD,EACA5H,KAAK4H,UAED2Y,EAAM7Y,OAAOwzH,SACb/zH,EAAMsrG,aAAajM,EAAO3mG,KAAKC,MAAM2mG,GAAQhrB,IAEzCM,GAAW50E,EAAMsrG,aACbjM,EACA/qB,EAAWM,EAAQ/5E,EAAI,EAAI+5E,EAAQ96E,EAAI86E,EAAQt3E,OAAS,EACxDg3E,IAKZ0/C,EAAgD,YAAtCvvH,EAAKjF,EAAQ6gF,SAAU,WAEjC5/E,IAGA9D,EAAW6C,EAAQnG,MAAMsD,SAGzBiiF,EAAW5+E,EAAMiE,SAASg3E,YAAYt+E,EAAUkhH,GAAWh/G,EAG3D+1E,EAAUv5E,EAAO,CACbR,EAAGy5E,EAAWt0E,EAAM+5F,UAAYuF,EAAQD,EACxCvlG,EAAGpB,KAAKC,MAAM27E,EAAWt0E,EAAMg6F,WAAaqF,EAAQC,GACpD3hG,MAAO,EACPL,OAAQ,GACTs3E,GAGHv5E,EAAOmE,EAAS,CACZ7B,MAAO03E,EAAK13E,MACZL,OAAQ+3E,EAAK/3E,SAIbqzC,GACAqjF,GAAU,EACVr1C,EAAU3+E,EAAMiE,SAAS06E,QAAQC,EAAUjuC,GAC3CskC,EAAY,CACRp6E,EAAG+5E,EAAQ/5E,EAAI2E,EAAQ3E,EAAI+5E,EAAQj3E,MAAQ,EAAIghF,EAAQ9jF,EACvDf,EAAG86E,EAAQ96E,EAAI0F,EAAQ1F,EAAI,CACvB6F,IAAK,EACLi8F,OAAQ,GACR73F,OAAQ,GACVvE,EAAQ9B,eAAiBk3E,EAAQt3E,QAEvCugH,EAAUh1B,EAAQ,OAAS,WAAW5T,GACjC/7E,KAAK,CACFkE,MAAOA,IAKf02H,GADAD,GAAgBljF,EAAW,KAAO,KACL,KAAOkjF,EAAe,IAErC,SAAVz2H,EACA63E,EAAUn7E,GAAKg6H,EAAcz+C,EAAK/3E,OAAS,EAC1B,WAAVF,GACP63E,EAAUp6E,GAAKw6E,EAAK13E,MAAQ,EAC5Bs3E,EAAUn7E,GAAKu7E,EAAK/3E,OAAS,GACZ,UAAVF,IACP63E,EAAUp6E,GAAKw6E,EAAK13E,MACpBs3E,EAAUn7E,GAAKg6H,EAAc,EAAIz+C,EAAK/3E,UAK1CugH,EAAUzgH,MAAMoC,EAAS,KAAMo1E,GAC/BK,EAAY4oC,EAAU5oC,WAItB++C,EACA56G,EAAM66G,iBAAmBp7H,KAAKq7H,iBAC1BrW,EACAr+G,EACAy1E,EACAI,EACAT,EACAiU,GAIGpkF,EAAKjF,EAAQ2pH,MAAM,KAC1B1oH,EAAUT,EAAMsrG,aAAar2B,EAAUp6E,EAAGo6E,EAAUn7E,IAAMkG,EAAMsrG,aAAar2B,EAAUp6E,EAAIw6E,EAAK13E,MAAOs3E,EAAUn7E,EAAIu7E,EAAK/3E,SAI1HkC,EAAQ08E,QAAUvrC,GAClBktE,EAAUh1B,EAAQ,OAAS,WAAW,CAClCvK,QAAShK,EAAWt0E,EAAM+5F,UAAY3gF,EAAMkmF,MAAQlmF,EAAMimF,MAC1D9gB,QAASjK,EAAWt0E,EAAMg6F,WAAa5gF,EAAMimF,MAAQjmF,EAAMkmF,SAMlE7+F,IACDo9G,EAAU3kH,KAAK,CACXY,GAAI,OAER+jH,EAAU7oC,QAAS,IAS3BypC,EAAO9iH,UAAUu4H,iBAAmB,SAASrW,EAAWr+G,EAASy1E,EAAWI,EAAMT,EAASiU,GACvF,IAGIlwE,EACAw7G,EAJAn0H,EAAQnH,KAAKmH,MACb5C,EAAQoC,EAAQpC,MAChBM,EAAgB8B,EAAQ9B,cAGxBjB,EAAUohH,EAAU9wC,IAAM,EAAK8wC,EAAUphH,SAAW,EAmDxD,OAhDAkc,EAAMs8D,EAAUp6E,EAAI4B,GACV,IACQ,UAAVW,EACAoC,EAAQpC,MAAQ,OAEhBoC,EAAQ3E,GAAK8d,EAEjBw7G,GAAY,IAIhBx7G,EAAMs8D,EAAUp6E,EAAIw6E,EAAK13E,MAAQlB,GACvBuD,EAAM+5F,YACE,SAAV38F,EACAoC,EAAQpC,MAAQ,QAEhBoC,EAAQ3E,EAAImF,EAAM+5F,UAAYphF,EAElCw7G,GAAY,IAIhBx7G,EAAMs8D,EAAUn7E,EAAI2C,GACV,IACgB,WAAlBiB,EACA8B,EAAQ9B,cAAgB,MAExB8B,EAAQ1F,GAAK6e,EAEjBw7G,GAAY,IAIhBx7G,EAAMs8D,EAAUn7E,EAAIu7E,EAAK/3E,OAASb,GACxBuD,EAAMg6F,aACU,QAAlBt8F,EACA8B,EAAQ9B,cAAgB,SAExB8B,EAAQ1F,EAAIkG,EAAMg6F,WAAarhF,EAEnCw7G,GAAY,GAGZA,IACAtW,EAAU7oC,QAAU6T,EACpBg1B,EAAUzgH,MAAMoC,EAAS,KAAMo1E,IAG5Bu/C,GAMPxwD,EAAY7rE,MACZ6rE,EAAY7rE,IAAI6D,UAAU0rH,eAAiB,WACvC,IAEIjuG,EAOAq6G,EAIA5V,EACAuW,EACA9B,EACA+B,EAKAx5H,EACAf,EACAk8E,EACAv7E,EAxBA8F,EAAS1H,KACTR,EAAOkI,EAAOlI,KAEd2H,EAAQO,EAAOP,MACfR,EAAUe,EAAOf,QAAQ69G,WACzBiX,EAAmB7vH,EAAKjF,EAAQ80H,iBAAkB,IAClDC,EAAiB9vH,EAAKjF,EAAQ+0H,eAAgB,GAC9Cx6B,EAAY/5F,EAAM+5F,UAClBC,EAAah6F,EAAMg6F,WAEnBw6B,EAAej0H,EAAOie,OACtB7mB,EAAS68H,EAAa,GAAK,EAC3BC,EAAUD,EAAa,GAKvBE,EAAS,CACL,GACA,IAMJr0C,EAAW,CAAC,EAAG,EAAG,EAAG,GAGpB9/E,EAAOE,UAAajB,EAAQc,SAAYC,EAAO+8G,mBAKpDllH,EAAKC,GAAM,SAAS+gB,GACZA,EAAMykG,WAAazkG,EAAM3Y,SAAW2Y,EAAMykG,UAAU8W,YACpDv7G,EAAMykG,UACD3kH,KAAK,CACFyE,MAAO,SACRxC,IAAI,CACHwC,MAAO,OACPi4E,aAAc,SAEtBx8D,EAAMykG,UAAU8W,WAAY,MAMpClW,EAAO9iH,UAAU0rH,eAAejkH,MAAM7C,GAEtCnI,EAAKC,GAAM,SAAS+gB,GACZA,EAAMykG,WAAazkG,EAAM3Y,UAGzBi0H,EAAOt7G,EAAMi5G,MAAM1xH,KAAKyY,GAGxBA,EAAMykG,UAAU+W,KAAO,SAO/Bx8H,EAAKs8H,GAAQ,SAAS3vF,EAAQvsC,GAE1B,IAAImH,EACAoE,EAGA8wH,EACAC,EACAC,EACAnmH,EALA/J,EAASkgC,EAAOlgC,OAChBi8F,EAAY,GAMhB,GAAKj8F,EA8CL,IAzCAtE,EAAOoyH,YAAY5tF,EAAQvsC,EAAI,IAG3B+H,EAAO4xH,iBAAmB,IAC1BxyH,EAAMjH,KAAK4C,IACP,EACAm5H,EAAU98H,EAAS4I,EAAO4xH,kBAE9BpuH,EAASrL,KAAKiS,IACV8pH,EAAU98H,EAAS4I,EAAO4xH,iBAC1BnyH,EAAMg6F,YAEV5hG,EAAK2sC,GAAQ,SAAS3rB,GAEdA,EAAM64G,cAAgB,GAAK74G,EAAMykG,YAGjCzkG,EAAMzZ,IAAMjH,KAAK4C,IACb,EACAm5H,EAAU98H,EAASyhB,EAAM64G,eAE7B74G,EAAMrV,OAASrL,KAAKiS,IAChB8pH,EAAU98H,EAASyhB,EAAM64G,cACzBjyH,EAAMg6F,YAEVprF,EAAOwK,EAAMykG,UAAU3oC,UAAU53E,QAAU,GAK3C8b,EAAM27G,eAAiBj0B,EAAUngG,KAAK,CAClCsC,OAAQmW,EAAMk5G,SAAS,GAAKl5G,EAAMzZ,IAAMiP,EAAO,EAC/CA,KAAMA,EACNk3F,KAAM1sF,EAAMtf,IACX,MAGbmR,EAAE86F,WAAWjF,EAAW/8F,EAAS6K,EAAOjP,IAIvClF,EAAI,EAAGA,EAAIoK,EAAQpK,IAGpBs6H,GADA37G,EAAQ2rB,EAAOtqC,IACQs6H,eACvBzC,EAAWl5G,EAAMk5G,SACjBzU,EAAYzkG,EAAMykG,UAClB7nC,GAA+B,IAAlB58D,EAAM3Y,QAAoB,SAAW,UAClDo0H,EAAWvC,EAAS,GAEhBxxB,GAAa1pC,EAAQ0pC,EAAUi0B,SACOvxD,IAAlCs9B,EAAUi0B,GAAgB/vD,IAC1BgR,EAAa,UAEbq+C,EAAcvzB,EAAUi0B,GAAgBnmH,KACxC9U,EAAIsf,EAAMzZ,IAAMmhG,EAAUi0B,GAAgB/vD,KAI9ClrE,EAAI+6H,SAMDz7G,EAAM47G,cAMTn6H,EADA2E,EAAQw0H,QACJQ,EAAa,IAAMh8H,GAAK,EAAI,IAAMb,EAASyhB,EAAM64G,eAEjD1xH,EAAO2xH,KAAKp4H,EAAIsf,EAAMzZ,IAAM,GAAK7F,EAAIsf,EAAMrV,OAAS,EAAI8wH,EAAW/6H,EAAGtB,EAAG4gB,GAKjFykG,EAAUoX,MAAQ,CACdj/C,WAAYA,EACZ54E,MAAOk1H,EAAS,IAEpBzU,EAAU+W,KAAO,CACb/5H,EAAGA,EAAI2E,EAAQ3E,GACV,CACGgJ,KAAMywH,EACN1wH,OAAQ0wH,GACVhC,EAAS,KAAO,GACtBx4H,EAAGA,EAAI0F,EAAQ1F,EAAI,IAEvBw4H,EAASz3H,EAAIA,EACby3H,EAASx4H,EAAIA,EAIbs6H,EAAiBvW,EAAU3oC,UAAUv3E,MAErCm3H,EAAe,KAEXj6H,EAAIu5H,EAAiBE,GACrBQ,EAAep8H,KAAKC,MAChBy7H,EAAiBv5H,EAAIy5H,GAEzBj0C,EAAS,GAAK3nF,KAAK4C,IAAIw5H,EAAcz0C,EAAS,KAGvCxlF,EAAIu5H,EAAiBr6B,EAAYu6B,IACxCQ,EAAep8H,KAAKC,MAChBkC,EAAIu5H,EAAiBr6B,EAAYu6B,GAErCj0C,EAAS,GAAK3nF,KAAK4C,IAAIw5H,EAAcz0C,EAAS,KAI9CvmF,EAAIu6H,EAAc,EAAI,EACtBh0C,EAAS,GAAK3nF,KAAK4C,IACf5C,KAAKC,MAAW07H,EAAc,EAAlBv6H,GACZumF,EAAS,IAINvmF,EAAIu6H,EAAc,EAAIr6B,IAC7B3Z,EAAS,GAAK3nF,KAAK4C,IACf5C,KAAKC,MAAMmB,EAAIu6H,EAAc,EAAIr6B,GACjC3Z,EAAS,KAGjBw9B,EAAUiX,aAAeA,MAMN,IAAvBppD,EAAS2U,IAAmBxnF,KAAKq8H,wBAAwB70C,MAGzDxnF,KAAKs8H,kBAGDZ,GACAn8H,EAAKS,KAAKksC,QAAQ,SAAS3rB,GACvB,IAAIyvE,EAEJ4qC,EAAYr6G,EAAMq6G,WAClB5V,EAAYzkG,EAAMykG,YAIdA,EAAU+W,MACVx7G,EAAM3Y,SACN2Y,EAAM64G,cAAgB,GAEtBj8C,EAAa6nC,EAAUoX,MAAMj/C,YAE7B6S,GAAS4qC,KAGLr6G,EAAMq6G,UAAYA,EAAYzzH,EAAMiE,SAASqtC,OACxCyhC,SAAS,oDAAsD35D,EAAMisF,YACrE1gG,IAAIpE,EAAOoqG,iBAGhB8oB,EAAUv6H,KAAK,CACX,eAAgBq7H,EAChB,OAAU/0H,EAAQ41H,gBAAkBh8G,EAAM/hB,OAAS,aAI3Do8H,EAAU5qC,EAAQ,OAAS,WAAW,CAClC3wF,EAAGqI,EAAO80H,cAAcj8G,EAAMk5G,YAElCmB,EAAUv6H,KAAK,aAAc88E,IAEtBy9C,IACPr6G,EAAMq6G,UAAYA,EAAUtyH,iBAWhDwiE,EAAY7rE,IAAI6D,UAAU05H,cAAgB,SAAS/C,GAC/C,IAAIz3H,EAAIy3H,EAASz3H,EACbf,EAAIw4H,EAASx4H,EACjB,OAAO2K,EAAK5L,KAAK2G,QAAQ69G,WAAWiY,eAAe,GAAQ,CACvD,IACAz6H,GAAqB,SAAhBy3H,EAAS,GAAgB,GAAK,GAAIx4H,EACvC,IACAe,EAAGf,EACH,EAAIw4H,EAAS,GAAKA,EAAS,GAAI,EAAIA,EAAS,GAAKA,EAAS,GAC1DA,EAAS,GAAIA,EAAS,GACtB,IACAA,EAAS,GAAIA,EAAS,IACtB,CACA,IACAz3H,GAAqB,SAAhBy3H,EAAS,GAAgB,GAAK,GAAIx4H,EACvC,IACAw4H,EAAS,GAAIA,EAAS,GACtB,IACAA,EAAS,GAAIA,EAAS,KAQ9B3uD,EAAY7rE,IAAI6D,UAAUw5H,gBAAkB,WACxC/8H,EAAKS,KAAKksC,QAAQ,SAAS3rB,GACvB,IACIw7G,EADA/W,EAAYzkG,EAAMykG,UAElBA,GAAazkG,EAAM3Y,WACnBm0H,EAAO/W,EAAU+W,OAKT/W,EAAUiX,eACVjX,EAAUoX,MAAMt3H,MACZkgH,EAAU3oC,UAAUv3E,MAAQkgH,EAAUiX,aAC1CjX,EAAU1iH,IAAI,CACVwC,MAAOkgH,EAAUoX,MAAMt3H,MAAQ,KAC/Bi4E,aAAc,aAElBioC,EAAU8W,WAAY,GAG1B9W,EAAU3kH,KAAK2kH,EAAUoX,OACzBpX,EAAUA,EAAUviG,MAAQ,UAAY,QAAQs5G,GAChD/W,EAAUviG,OAAQ,GACXuiG,GACPA,EAAU3kH,KAAK,CACXY,GAAI,UAIjBjB,OAGP8qE,EAAY7rE,IAAI6D,UAAUi4H,eAAiB9vD,EAO3CH,EAAY7rE,IAAI6D,UAAUu5H,wBAA0B,SAAS70C,GAEzD,IAAI7hE,EAAS3lB,KAAK2lB,OACdhf,EAAU3G,KAAK2G,QACf4xH,EAAe5xH,EAAQgf,OACvB+2G,EAAU/1H,EAAQ+1H,SAAW,GAC7BC,EAAUD,EAGV9wD,EAAuB,OAAjBjlE,EAAQoP,KAuDlB,OArDK61D,IAEuB,OAApB2sD,EAAa,GACboE,EAAU98H,KAAK4C,IAAIkjB,EAAO,GACtB9lB,KAAK4C,IAAI+kF,EAAS,GAAIA,EAAS,IAAKk1C,IAGxCC,EAAU98H,KAAK4C,IAEXkjB,EAAO,GAAK6hE,EAAS,GAAKA,EAAS,GACnCk1C,GAGJ/2G,EAAO,KAAO6hE,EAAS,GAAKA,EAAS,IAAM,GAIvB,OAApB+wC,EAAa,GACboE,EAAU98H,KAAK4C,IAAI5C,KAAKiS,IAAI6qH,EAASh3G,EAAO,GACxC9lB,KAAK4C,IAAI+kF,EAAS,GAAIA,EAAS,KAAMk1C,IAGzCC,EAAU98H,KAAK4C,IACX5C,KAAKiS,IACD6qH,EAEAh3G,EAAO,GAAK6hE,EAAS,GAAKA,EAAS,IAEvCk1C,GAGJ/2G,EAAO,KAAO6hE,EAAS,GAAKA,EAAS,IAAM,GAK3Cm1C,EAAUh3G,EAAO,IACjBA,EAAO,GAAKg3G,EACZh3G,EAAO,GAAK9lB,KAAKiS,IACb69D,EAAehpE,EAAQqkG,WAAa,EAAG2xB,GACvCA,GAEJ38H,KAAKynB,UAAU9B,GAEX3lB,KAAKwuH,gBACLxuH,KAAKwuH,kBAKT5iD,GAAM,GAGPA,IAIXd,EAAY4tD,SAKZ5tD,EAAY4tD,OAAO51H,UAAUi4H,eAAiB,SAASx6G,EAAOykG,EAAWr+G,EAASo1E,EAASiU,GACvF,IAKI4sC,EALAnhD,EAAWz7E,KAAKmH,MAAMs0E,SACtB/zE,EAAS6Y,EAAM7Y,OACfm1H,EAAQt8G,EAAMs8G,OAASt8G,EAAMm3G,UAC7BtwE,EAAQx7C,EAAK2U,EAAM6mC,MAAO7mC,EAAMkmF,MAAQ76F,EAAK5L,KAAKw0H,oBAAqB9sH,EAAOyiG,MAAMn8B,MACpFv8B,EAAS7lC,EAAKjF,EAAQ8qC,SAAUzxC,KAAK2G,QAAQ63G,UAI7Cqe,KACA9gD,EAAUx5E,EAAMs6H,IAEJ57H,EAAI,IACZ86E,EAAQt3E,QAAUs3E,EAAQ96E,EAC1B86E,EAAQ96E,EAAI,IAEhB27H,EAAY7gD,EAAQ96E,EAAI86E,EAAQt3E,OAASiD,EAAOyiG,MAAMn8B,KACtC,IACZ+N,EAAQt3E,QAAUm4H,GAGlBnhD,IACAM,EAAU,CACN/5E,EAAG0F,EAAOyiG,MAAMn8B,IAAM+N,EAAQ96E,EAAI86E,EAAQt3E,OAC1CxD,EAAGyG,EAAOuwF,MAAMjqB,IAAM+N,EAAQ/5E,EAAI+5E,EAAQj3E,MAC1CA,MAAOi3E,EAAQt3E,OACfA,OAAQs3E,EAAQj3E,QAKnB2sC,IACGgqC,GACAM,EAAQ/5E,GAAKolD,EAAQ,EAAI20B,EAAQj3E,MACjCi3E,EAAQj3E,MAAQ,IAEhBi3E,EAAQ96E,GAAKmmD,EAAQ20B,EAAQt3E,OAAS,EACtCs3E,EAAQt3E,OAAS,KAQ7BkC,EAAQpC,MAAQqH,EACZjF,EAAQpC,OAAQk3E,GAAYhqC,EAAS,SAAW2V,EAAQ,QAAU,QAEtEzgD,EAAQ9B,cAAgB+G,EACpBjF,EAAQ9B,cACR42E,GAAYhqC,EAAS,SAAW2V,EAAQ,MAAQ,UAIpDw+D,EAAO9iH,UAAUi4H,eAAe9rH,KAAKjP,KAAMugB,EAAOykG,EAAWr+G,EAASo1E,EAASiU,GAG3EzvE,EAAM66G,kBAAoB76G,EAAMu6G,eAChCv6G,EAAMykG,UAAU1iH,IAAI,CAChB9D,MAAO+hB,EAAMu6G,kBAp6BjC,CA06BE/5H,GACD,SAASqR,GAUN,IAAInQ,EAAQmQ,EAAEnQ,MACV1C,EAAO6S,EAAE7S,KACTqM,EAAOwG,EAAExG,KACT1J,EAAWkQ,EAAElQ,SAKjBD,EAAMa,UAAUqJ,UAAUrE,MAAK,SAASX,GACpC,SAAS21H,IACL,IAAItuC,EAAS,GAEbjvF,EAAK4H,EAAMO,QAAU,IAAI,SAASA,GAC9B,IAAImzH,EAAYnzH,EAAOf,QAAQ69G,WAE3BuY,EAAcr1H,EAAOs1H,sBAAwB,CAAC,cAG7CnC,EAAUpzH,SAAWC,EAAO+8G,mBAC5BoW,EAAUoC,cACXv1H,EAAOE,SAEPrI,EAAKw9H,GAAa,SAASrmC,GACvBn3F,EAAKmI,EAAOwkC,QAAQ,SAAS3rB,GACrBA,EAAMm2E,KACNn2E,EAAMm2E,GAAMwmC,UAAYtxH,EACpB2U,EAAM28G,UACN38G,EAAMm3G,WAAan3G,EAAMm3G,UAAUjzH,QAEvC+pF,EAAO1mF,KAAKyY,EAAMm2E,cAMtCvvF,EAAMg2H,sBAAsB3uC,GAIhCsuC,IAGA56H,EAASiF,EAAO,SAAU21H,MAQ9B76H,EAAMa,UAAUq6H,sBAAwB,SAAS3uC,GAE7C,IACI9K,EACA/jF,EACAiC,EACAw7H,EACAC,EAEAC,EACAC,EACAC,EACAC,EACA75H,EACyBmiB,EAAIE,EAAIpB,EAAIm4C,EAAI5mB,EAAIC,EAAIqnF,EAAIC,EAZrD3vD,EAAMwgB,EAAOxiF,OAsBjB,IAAKrM,EAAI,EAAGA,EAAIquE,EAAKruE,KACjB+jF,EAAQ8K,EAAO7uF,MAEX+jF,EAAMk6C,WAAal6C,EAAMtU,QACzBsU,EAAMm6C,WAAa,GAW3B,IALArvC,EAAOrvF,MAAK,SAAS4G,EAAGC,GACpB,OAAQA,EAAEk3H,WAAa,IAAMn3H,EAAEm3H,WAAa,MAI3Cv9H,EAAI,EAAGA,EAAIquE,EAAKruE,IAGjB,IAFAy9H,EAAS5uC,EAAO7uF,GAEXiC,EAAIjC,EAAI,EAAGiC,EAAIosE,IAAOpsE,EACvBy7H,EAAS7uC,EAAO5sF,GAEZw7H,GAAUC,GACVD,IAAWC,GACXD,EAAOjhD,QAAUkhD,EAAOlhD,QACF,IAAtBihD,EAAOS,YAA0C,IAAtBR,EAAOQ,aAElCP,EAAOF,EAAOhhD,UACdmhD,EAAOF,EAAOjhD,UAEdohD,EAAUJ,EAAO5/C,YACjBigD,EAAUJ,EAAO7/C,YAEjB55E,EAAU,GAAKw5H,EAAOlpD,IAAM,EAAIkpD,EAAOx5H,SA1CtBmiB,EA4Cbu3G,EAAKt7H,EAAIw7H,EAAQ/xH,WA5CAwa,EA6CjBq3G,EAAKr8H,EAAIu8H,EAAQ9xH,WA7CImZ,EA8CrBu4G,EAAOt4H,MAAQlB,EA9CUo5D,EA+CzBogE,EAAO34H,OAASb,EA/CawyC,EAgD7BmnF,EAAKv7H,EAAIy7H,EAAQhyH,WAhDgB4qC,EAiDjCknF,EAAKt8H,EAAIw8H,EAAQ/xH,WAjDoBgyH,EAkDrCL,EAAOv4H,MAAQlB,EAlD0B+5H,EAmDzCN,EAAO54H,OAASb,IAjDpBwyC,EAAKrwB,EAAKlB,GACVuxB,EAAKsnF,EAAK33G,GACVswB,EAAKpwB,EAAK+2C,GACV3mB,EAAKsnF,EAAK13G,MAkDLm3G,EAAOF,UAAYG,EAAOH,UAAYE,EAASC,GAC/CQ,WAAa,IAO9Bt+H,EAAKivF,GAAQ,SAAS9K,GAClB,IAAIlX,EACAqxD,EAEAn6C,IACAm6C,EAAan6C,EAAMm6C,WAEfn6C,EAAMk6C,aAAeC,GAAcn6C,EAAMvH,SAIrC0hD,EACAn6C,EAAMxG,MAAK,GAEX1Q,EAAW,WACPkX,EAAMtG,QAKdsG,EAAMtH,UAAUhN,QAAUyuD,EAC1Bn6C,EAAMA,EAAMo6C,MAAQ,UAAY,QAC5Bp6C,EAAMtH,UACN,KACA5P,IAIRkX,EAAMo6C,OAAQ,OArK9B,CA0KE/8H,GACD,SAASqR,GAMN,IAmBI2rH,EAnBA77H,EAAWkQ,EAAElQ,SACbD,EAAQmQ,EAAEnQ,MACVG,EAAgBgQ,EAAEhQ,cAClBE,EAAM8P,EAAE9P,IACRguE,EAAiBl+D,EAAEk+D,eACnBuf,EAAqBz9E,EAAEy9E,mBACvBtwF,EAAO6S,EAAE7S,KACTiD,EAAS4P,EAAE5P,OACX0yE,EAAY9iE,EAAE8iE,UACdxK,EAAWt4D,EAAEs4D,SACbqJ,EAAU3hE,EAAE2hE,QACZ5F,EAAW/7D,EAAE+7D,SACb8oC,EAAS7kG,EAAE6kG,OACX10G,EAAQ6P,EAAE7P,MACVqJ,EAAOwG,EAAExG,KACTi6B,EAAQzzB,EAAEyzB,MACV+/E,EAASxzG,EAAEwzG,OACX96C,EAAc14D,EAAE04D,YAChBlsE,EAAMwT,EAAExT,IAQZm/H,EAAe3rH,EAAE2rH,aAAe,CAK5BC,iBAAkB,WACd,IAAIt2H,EAAS1H,KAETkK,EADQxC,EAAOP,MACC+C,QAChB8mG,EAAc,SAAS3nG,GACnB,IAAIkX,EAAQrW,EAAQ6lG,kBAAkB1mG,QAExBshE,IAAVpqD,IACArW,EAAQkmG,eAAgB,EACxB7vF,EAAMywF,YAAY3nG,KAK9B9J,EAAKmI,EAAOwkC,QAAQ,SAAS3rB,GACrBA,EAAMgmF,UACNhmF,EAAMgmF,QAAQz6B,QAAQvrD,MAAQA,GAE9BA,EAAMykG,YACFzkG,EAAMykG,UAAU7mC,IAChB59D,EAAMykG,UAAU7mC,IAAI59D,MAAQA,EAE5BA,EAAMykG,UAAUl5C,QAAQvrD,MAAQA,MAMvC7Y,EAAOu2H,eACR1+H,EAAKmI,EAAOwuH,eAAe,SAASliH,GAC5BtM,EAAOsM,KACPtM,EAAOsM,GACFkmE,SAAS,sBACTv5E,GAAG,YAAaqwG,GAChBrwG,GAAG,YAAY,SAAS0I,GACrBa,EAAQ+pG,kBAAkB5qG,MAE9BqhE,GACAhjE,EAAOsM,GAAKrT,GAAG,aAAcqwG,GAI7BtpG,EAAOf,QAAQ8D,QACf/C,EAAOsM,GACF1R,IAAIA,GACJA,IAAI,CACDmI,OAAQ/C,EAAOf,QAAQ8D,aAM3C/C,EAAOu2H,cAAe,IAU9BC,iBAAkB,WACd,IAUIv+H,EAVA+H,EAAS1H,KACT2G,EAAUe,EAAOf,QACjBw3H,EAAcx3H,EAAQw3H,YACtBC,EAAc,GAAGjmH,OAAOgmH,EAAcz2H,EAAO2sH,SAAW3sH,EAAOglH,WAC/D2R,EAAoBD,EAAYpyH,OAChC7E,EAAQO,EAAOP,MACf+C,EAAU/C,EAAM+C,QAChBkB,EAAWjE,EAAMiE,SACjBmkF,EAAOpoF,EAAMR,QAAQyoF,QAAQG,KAC7B+uC,EAAU52H,EAAO42H,QAEjBttB,EAAc,WACN7pG,EAAMopG,cAAgB7oG,GACtBA,EAAOspG,eAefutB,EAAe,qBAAuB3/H,EAAM,KAAS,MAAS,IAIlE,GAAIy/H,IAAsBF,EAEtB,IADAx+H,EAAI0+H,EAAoB,EACjB1+H,KACoB,MAAnBy+H,EAAYz+H,IACZy+H,EAAYl7E,OAAOvjD,EAAI,EAAG,EAAGy+H,EAAYz+H,EAAI,GAAK4vF,EAAM6uC,EAAYz+H,EAAI,GAAI,MAE3EA,GAAwB,MAAnBy+H,EAAYz+H,IAAeA,IAAM0+H,IACvCD,EAAYl7E,OAAOvjD,EAAG,EAAG,IAAKy+H,EAAYz+H,EAAI,GAAK4vF,EAAM6uC,EAAYz+H,EAAI,IAajF2+H,EACAA,EAAQj+H,KAAK,CACThB,EAAG++H,IAEA12H,EAAO2lH,QAEd3lH,EAAO42H,QAAUlzH,EAASqtC,KAAK2lF,GAC1B/9H,KAAK,CACF,kBAAmB,QACnB88E,WAAYz1E,EAAOE,QAAU,UAAY,SACzChD,OAAQ25H,EACR55H,KAAMw5H,EAAcI,EAAe,OACnC,eAAgB72H,EAAO2lH,MAAM50C,eAAiB0lD,EAAc,EAAI,EAAI5uC,GACpE5lF,OAAQ,IAEXmC,IAAIpE,EAAO0S,OAIhB7a,EAAK,CAACmI,EAAO42H,QAAS52H,EAAOmqG,cAAc,SAASysB,GAChDA,EAAQpkD,SAAS,sBACZv5E,GAAG,YAAaqwG,GAChBrwG,GAAG,YAAY,SAAS0I,GACrBa,EAAQ+pG,kBAAkB5qG,MAI9B1C,EAAQ8D,QACR6zH,EAAQh8H,IAAI,CACRmI,OAAQ9D,EAAQ8D,SAKpBigE,GACA4zD,EAAQ39H,GAAG,aAAcqwG,SAczClmC,EAAY4tD,SACZ5tD,EAAY4tD,OAAO51H,UAAU2rH,YAAcsP,EAAaC,kBAGxDlzD,EAAY7rE,MACZ6rE,EAAY7rE,IAAI6D,UAAU2rH,YAAcsP,EAAaC,kBAGrDlzD,EAAY0zD,UACZ1zD,EAAY0zD,QAAQ17H,UAAU2rH,YAAcsP,EAAaC,kBAM7Dx7H,EAAOy0G,EAAOn0G,UAAW,CAErB83G,cAAe,SAAS/rC,EAAMgpC,EAAYlyB,GACtC,IAAI8I,EAASzuF,KACT+/E,EAAa0O,EAAOtnF,MAAMiE,SAAS20E,WACnC0+C,EAAc,sBAAwB5vD,EAAKnnE,OAAS,QAAU,UAAY,WAG7Ei+E,EAAUkyB,EAAahpC,EAAK+oC,aAAaj3G,GAAG,aAAa,WAClDkuE,EAAK9kE,SAAS,SAGdg2E,EAAW7F,SAASukD,GAGpB5mB,EAAWv1G,IAAImsF,EAAO9nF,QAAQmoF,mBAGjCnuF,GAAG,YAAY,WAEZk3G,EAAWv1G,IAAIC,EAAMssE,EAAKjnE,QAAU6mF,EAAOI,UAAYJ,EAAOM,kBAI9DhP,EAAW1F,YAAYokD,GAEvB5vD,EAAK9kE,cAERpJ,GAAG,SAAS,SAASqX,GAClB,IACI0mH,EAAoB,WACZ7vD,EAAKmrD,YACLnrD,EAAKmrD,cAKjBhiH,EAAQ,CACJ2mH,aAAc3mH,GAId62D,EAAKoiC,eACLpiC,EAAKoiC,eAdgB,kBAcmBj5F,EAAO0mH,GAE/CxpD,EAAUrG,EAhBW,kBAgBe72D,EAAO0mH,OAK3DnkB,sBAAuB,SAAS1rC,GAG5BA,EAAKiqC,SAAW12G,EAAc,QAAS,CACnC4C,KAAM,WACN45H,QAAS/vD,EAAKwwC,SACdwf,eAAgBhwD,EAAKwwC,UALZr/G,KAMH2G,QAAQqoF,kBANLhvF,KAM+BmH,MAAMiB,WAElDlG,EAAS2sE,EAAKiqC,SAAU,SAAS,SAAS9gG,GACtC,IAAI5N,EAAS4N,EAAM5N,OACnB8qE,EACIrG,EAAKnnE,QAAUmnE,EACf,gBAAiB,CACb+vD,QAASx0H,EAAOw0H,QAChB/vD,KAAMA,IAEV,WACIA,EAAK9uE,kBAUzBuwE,EAAeme,OAAOI,UAAUpkF,OAAS,UAQzCjI,EAAOP,EAAMa,UAAyC,CAIlDg8H,cAAe,WACX,IAAI33H,EAAQnH,KACRiD,EAAOqtE,EAAertE,KACtB87H,EAAa53H,EAAMR,QAAQQ,MAAM+mF,gBACjCxpF,EAAQq6H,EAAWr6H,MACnB6G,EAAS7G,EAAM6G,OACfwwE,EAAoC,UAA1BgjD,EAAWC,WAAyB,KAAO,UAMzDh/H,KAAKkuF,gBAAkB/mF,EAAMiE,SAASS,OAAO5I,EAAK4qF,UAAW,KAAM,MAJnE,WACI1mF,EAAM83H,YAGwEv6H,EAAO6G,GAAUA,EAAOC,OACrGnL,KAAK,CACFkE,MAAOw6H,EAAWl4H,SAAStC,MAC3BhE,MAAO0C,EAAK6qF,iBAEf5T,SAAS,yBACTpuE,MACAvH,MAAMw6H,EAAWl4H,UAAU,EAAOk1E,IAO3CkjD,QAAS,WACL,IAAI93H,EAAQnH,KACZk1E,EAAU/tE,EAAO,YAAa,CAC1B+3H,gBAAgB,IACjB,WACC/3H,EAAMqe,WAQdA,KAAM,SAASxN,GACX,IACImnH,EAGAjxC,EAFAhkF,EAFQlK,KAEQkK,QAChBk1H,GAAgB,GAIfpnH,GAASA,EAAMknH,eAChB3/H,EARQS,KAQGg4F,MAAM,SAASp0B,GACtBu7D,EAAYv7D,EAAKp+C,UAGrBjmB,EAAKyY,EAAMigF,MAAM9/E,OAAOH,EAAMmyF,QAAQ,SAASk1B,GAC3C,IAAIz7D,EAAOy7D,EAASz7D,KAChB2wB,EAAU3wB,EAAK2wB,QAGfrqF,EAAQqqF,EAAU,QAAU,WAC5B4qC,EAAYv7D,EAAKp+C,KAAK65G,EAASvtH,IAAKutH,EAAS58H,KACzCmhE,EAAKo9B,aACLo+B,GAAgB,OAOhClxC,EA3BYluF,KA2BYkuF,gBACpBkxC,IAAkBlxC,EA5BVluF,KA6BF8+H,iBACEM,GAAiBjxD,EAAS+f,KA9B1BluF,KA+BFkuF,gBAAkBA,EAAgB5lF,WAKxC62H,GApCQn/H,KAqCFomE,OACFx6D,EAtCI5L,KAsCO2G,QAAQQ,MAAMI,UAAWyQ,GAASA,EAAMzQ,UAtC/CvH,KAsCgEw9G,WAAa,OAU7F3K,IAAK,SAASxpG,EAAGupG,GAEb,IAEI0sB,EAFAn4H,EAAQnH,KACRswG,EAAcnpG,EAAMmpG,YAIpBA,GACA/wG,EAAK+wG,GAAa,SAAS/vF,GACvBA,EAAMxW,cAIdxK,EAAiB,OAAZqzG,EAAmB,CAAC,EAAG,GAAK,CAAC,IAAI,SAASpc,GAC3C,IA0BI+oC,EA1BA37D,EAAOz8D,EAAMqvF,EAAM,QAAU,SAAS,GACtCrF,EAAQvtB,EAAKutB,MACbquC,EAAWn2H,EAAE8nF,EAAQ,SAAW,UAChCsuC,EAAYtuC,EAAQ,aAAe,aACnCuuC,EAAWv4H,EAAMs4H,GACjBE,GAAkB/7D,EAAKw5B,YAAc,GAAK,EAC1CwwB,EAAWhqD,EAAK57D,cAChB43H,EAASh8D,EAAK02B,QAAQolC,EAAWF,GAAU,GAC3CG,EACAE,EAASj8D,EAAK02B,QAAQolC,EAAW97D,EAAKoK,IAAMwxD,GAAU,GACtDG,EACAG,EAAUD,EAASD,EACnBl/B,EAASo/B,EAAUD,EAASD,EAC5Bj/B,EAASm/B,EAAUF,EAASC,EAC5BE,EAAYlgI,KAAKiS,IACb87G,EAAS/0B,QACTj1B,EAAK02B,QACD12B,EAAKw2B,SAASwzB,EAAS97G,KAAO8xD,EAAKgzB,kBAG3CopC,EAAYngI,KAAK4C,IACbmrH,EAAS90B,QACTl1B,EAAK02B,QACD12B,EAAKw2B,SAASwzB,EAASnrH,KAAOmhE,EAAKgzB,mBAO/C2oC,EAAQQ,EAAYr/B,GACR,IACRC,GAAU4+B,EACV7+B,EAASq/B,IAEbR,EAAQ5+B,EAASq/B,GACL,IACRr/B,EAASq/B,EACTt/B,GAAU6+B,GAIV37D,EAAKl8D,OAAOsE,QAAU00F,IAAWktB,EAAS97G,KAAO6uF,IAAWitB,EAASnrH,MACrEmhE,EAAKz7D,YACDu4F,EACAC,GACA,GACA,EAAO,CACHM,QAAS,QAGjBq+B,GAAW,GAGfn4H,EAAMs4H,GAAaD,KAGnBF,GACAn4H,EAAMi/D,QAAO,GAEjB9jE,EAAI6E,EAAMiB,UAAW,CACjBqC,OAAQ,YAQpBjI,EAAOqjC,EAAM/iC,UAAoD,CAuB7D/C,OAAQ,SAASs/G,EAAU4gB,GACvB,IAAI1/G,EAAQvgB,KACR0H,EAAS6Y,EAAM7Y,OACfP,EAAQO,EAAOP,MAEnBk4G,EAAWzzG,EAAKyzG,GAAW9+F,EAAM8+F,UAGjC9+F,EAAM0wF,eAAeoO,EAAW,SAAW,WAAY,CACnD4gB,WAAYA,IACb,WASC1/G,EAAM8+F,SAAW9+F,EAAM5Z,QAAQ04G,SAAWA,EAC1C33G,EAAOf,QAAQnH,KAAKu0E,EAAQxzD,EAAO7Y,EAAOlI,OAAS+gB,EAAM5Z,QAEzD4Z,EAAMxW,SAASs1G,GAAY,UAGtB4gB,GACD1gI,EAAK4H,EAAMi4G,qBAAqB,SAAS8gB,GACjCA,EAAU7gB,UAAY6gB,IAAc3/G,IACpC2/G,EAAU7gB,SAAW6gB,EAAUv5H,QAAQ04G,UAAW,EAClD33G,EAAOf,QAAQnH,KAAKu0E,EAAQmsD,EAAWx4H,EAAOlI,OAAS0gI,EAAUv5H,QACjEu5H,EAAUn2H,SAAS,IACnBm2H,EAAUjvB,eAAe,oBAY7CD,YAAa,SAAS3nG,GAClB,IAEIlC,EAFQnH,KACO0H,OACAP,MACf+C,EAAU/C,EAAM+C,QACpBb,EAAIA,EACAa,EAAQmgG,UAAUhhG,GAElBa,EAAQ8lG,6BAPAhwG,KAOoCmH,EAAMs0E,UACtDvxE,EAAQ2mG,gBAAgBxnG,EARZrJ,OAchBwxG,WAAY,WACR,IACIrqG,EADQnH,KACM0H,OAAOP,MADbnH,KAENixG,eAAe,YACrB1xG,EAAK4H,EAAMmpG,aAAe,IAAI,SAAS5uG,GACnCA,EAAEqI,cAEN5C,EAAMmpG,YAAcnpG,EAAMkpG,WAAa,MAO3CmV,aAAc,WACV,IAAKxlH,KAAKmgI,kBAAmB,CACzB,IAAI5/G,EAAQvgB,KAERu0E,EADUhyE,EAAMge,EAAM7Y,OAAOf,QAAQ4Z,MAAOA,EAAM5Z,SACjC4tE,OAErBh0D,EAAMg0D,OAASA,EAEfniE,EAAEs6D,WAAW6H,GAAQ,SAASv8D,EAAOmjE,GACjCj5E,EAASqe,EAAO46D,EAAWnjE,MAE/BhY,KAAKmgI,mBAAoB,IASjCp2H,SAAU,SAAS85E,EAAO5hE,GACtB,IAeIm+G,EACA5U,EAEA6U,EAjBA75B,EAAQ3mG,KAAKwS,MADLrS,KACiBwmG,OACzBC,EAFQzmG,KAEMymG,MACd/+F,EAHQ1H,KAGO0H,OACfiwH,EAAejwH,EAAOf,QAAQ4E,OAAOs4E,IAAU,GAC/Cs0B,EAAgBtoB,EAAmBnoF,EAAO1C,MAAMozG,QAChD1wG,EAAOf,QAAQyxG,OACfkoB,EAAiBnoB,IAA2C,IAA1BA,EAAc1wG,QAChD84H,EAAsBpoB,GAAiBA,EAAc5sG,QACjD4sG,EAAc5sG,OAAOs4E,IAAW,GACpC28C,GAA+C,IAA/BD,EAAmB94H,QACnCg5H,EAAqB/4H,EAAO+4H,mBAC5BC,EAZQ1gI,KAYYo4G,QAAU,GAC9BjxG,EAAQO,EAAOP,MACf8+G,EAAOv+G,EAAOu+G,KAGd0a,EAAaxoB,GAAiBzwG,EAAO8jH,eAGzC3nC,EAAQA,GAAS,MApBL7jF,KAwBS6jF,QAAU5hE,GAxBnBjiB,KA0BDq/G,UAAsB,WAAVx7B,IAEO,IAAzB8zC,EAAalwH,SAEbo8E,IAAU28C,GAAkBF,IAAiD,IAA/BC,EAAmB94H,UAEjEo8E,GAAS68C,EAAYn1H,QAAUm1H,EAAYn1H,OAAOs4E,KAAgD,IAAtC68C,EAAYn1H,OAAOs4E,GAAOp8E,UAMvFk5H,IACAnV,EAAgB9jH,EAAO8jH,cAvCfxrH,KAuCoC6jF,IAvCpC7jF,KA2CFumG,SA3CEvmG,KA6CE6jF,OA7CF7jF,KA8CEumG,QAAQlsB,YAAY,oBA9CtBr6E,KA8CkD6jF,OAEtDA,GAhDI7jF,KAiDEumG,QAAQrsB,SAAS,oBAAsB2J,GAjDzC7jF,KA6DFumG,QAAQlmG,KAAKqH,EAAO4wG,aA7DlBt4G,KA6DsC6jF,IAG1C2nC,GAhEIxrH,KAiEEumG,QAAQ9wB,QACV+1C,EACA5/G,EACIzE,EAAMR,QAAQQ,MAAMI,UACpBg5H,EAAmBh5H,UACnB4wG,EAAc5wG,YAMtBk5H,GACAA,EAAmBrjD,SAKnByG,GAAS08C,IACTF,EAAYK,EAAYr7H,QAAUqC,EAAOrC,OAIrCo7H,GAAsBA,EAAmBG,gBAAkBP,IAC3DI,EAAqBA,EAAmBn4H,WAIvCm4H,EAeDA,EAAmBx+G,EAAO,UAAY,QAAQ,CAC1CjgB,EAAGwpH,EAAcxpH,EACjBf,EAAGuqH,EAAcvqH,IAhBjBo/H,IACA34H,EAAO+4H,mBAAqBA,EAAqBt5H,EAAMiE,SAAS/F,OACxDg7H,EACA7U,EAAcxpH,EACdwpH,EAAcvqH,EACduqH,EAAc1mH,MACd0mH,EAAc/mH,QAEjBqH,IAAIpE,EAAOmqG,aAChB4uB,EAAmBG,cAAgBP,GAWvCI,GACAA,EAAmBpgI,KAAKqH,EAAO4wG,aAlH/Bt4G,KAkHmD6jF,KAKvD48C,IACAA,EAAmB58C,GAAS18E,EAAMsrG,aAAajM,EAAOC,EAAOt/F,EAAMs0E,UAAY,OAAS,UACxFglD,EAAmB30D,QAAQvrD,MAzHvBvgB,QA8HZogI,EAAczI,EAAa1R,OACRma,EAAYrqH,MACtBkwG,IACDv+G,EAAOu+G,KAAOA,EAAO9+G,EAAMiE,SAASqtC,OAE/B3sC,KAnID9L,KAmIYumG,SAAWk6B,GAAoBjjD,cAEnDyoC,EAAKhkG,EAAO,UAAY,QAAQ,CAC5B5iB,EAtIIW,KAsIKm6H,SAASiG,EAAYrqH,QAElCkwG,EAAK5lH,KAAK,CACN,MAAS,oCACLuL,EA1IA5L,KA0IWwsG,WAAY9kG,EAAO8kG,cAEtCyZ,EAAK1lG,MA5IGvgB,KA+IRimH,EAAK5lH,KAAKmC,EAAO,CACb,KAhJIxC,KAgJUxB,OAASkJ,EAAOlJ,MAC9B,eAAgB4hI,EAAYhxD,QAC5B,QAAW,GACZgxD,EAAYx9C,cAGRqjC,GAAQA,EAAK1lG,OAAS0lG,EAAK1lG,MAAM45G,UAExClU,EAAKxwC,QAAQ,CACTp2E,EAAG4mH,EAAK1lG,MAAM45G,SAAS,KAzJnBn6H,KA6JN6jF,MAAQA,IAQlBs2C,SAAU,SAASpkH,GAIf,OAHa/V,KAAK0H,OACCP,MAENiE,SAASrI,QAAQk2C,OAC1Bp5C,KAAKwS,MAAMrS,KAAKwmG,OAASzwF,EACzB/V,KAAKymG,MAAQ1wF,EACN,EAAPA,EACO,EAAPA,MASZvT,EAAOojH,EAAO9iH,UAAqD,CAI/DkuG,YAAa,WACT,IACI7pG,EADSnH,KACMmH,MACfopG,EAAcppG,EAAMopG,YAGpBA,GAAeA,IALNvwG,MAMTuwG,EAAYiB,aANHxxG,KAWF2G,QAAQ4tE,OAAOssD,WACtB3rD,EAZSl1E,KAYS,aAZTA,KAgBN+J,SAAS,SAChB5C,EAAMopG,YAjBOvwG,MAuBjBwxG,WAAY,WAER,IACI7qG,EADS3G,KACQ2G,QACjBQ,EAFSnH,KAEMmH,MACfioF,EAAUjoF,EAAMioF,QAChBihB,EAAalpG,EAAMkpG,WAEvBlpG,EAAMopG,YAAc,KAGhBF,GACAA,EAAWmB,aAVFxxG,MAcC2G,EAAQ4tE,OAAOusD,UACzB5rD,EAfSl1E,KAeS,aAKlBovF,GApBSpvF,KAoBU2wG,gBAAoBvhB,EAAQoa,SApBtCxpG,KAoBuDs8F,iBAChElN,EAAQhS,OArBCp9E,KAyBN+J,YAMXA,SAAU,SAAS85E,GACf,IAKIvU,EALA5nE,EAAS1H,KACT2G,EAAUe,EAAOf,QACjB0mH,EAAQ3lH,EAAO2lH,MACfsK,EAAehxH,EAAQ4E,OACvBwqF,EAAYpvF,EAAQovF,UAEpBp2F,EAAI,EAIR,GAFAkkF,EAAQA,GAAS,GAEbn8E,EAAOm8E,QAAUA,EAAO,CAwBxB,GArBAtkF,EAAK,CACDmI,EAAO0S,MACP1S,EAAOmqG,YACPnqG,EAAOoqG,kBACR,SAAS13F,GACJA,IAEI1S,EAAOm8E,OACPzpE,EAAMigE,YAAY,qBAAuB3yE,EAAOm8E,OAGhDA,GACAzpE,EAAM8/D,SAAS,qBAAuB2J,OAKlDn8E,EAAOm8E,MAAQA,EAIX8zC,EAAa9zC,KAA0C,IAAhC8zC,EAAa9zC,GAAOp8E,QAC3C,OAOJ,GAJIo8E,IACAkS,EAAY4hC,EAAa9zC,GAAOkS,WAAaA,GAAa4hC,EAAa9zC,GAAOiiC,eAAiB,IAG/FuH,IAAUA,EAAMr5B,UAchB,IAbA1kB,EAAU,CACN,eAAgBymB,GAKpBs3B,EAAM53C,QACFnG,EACA1jE,EACIlE,EAAOP,MAAMR,QAAQQ,MAAMI,UAC3BowH,EAAa9zC,IAAU8zC,EAAa9zC,GAAOt8E,YAG5CG,EAAO,cAAgB/H,IAC1B+H,EAAO,cAAgB/H,GAAGU,KAAKivE,GAC/B3vE,GAAQ,IAkBxBq6H,WAAY,SAASC,EAAK7zD,GACtB,IAGI26D,EAHAr5H,EAAS1H,KACTmH,EAAQO,EAAOP,MACf0wG,EAAanwG,EAAOmwG,WAEpB7pB,EAAqB7mF,EAAMR,QAAQQ,MAAM6mF,mBACzCgzC,EAAgBt5H,EAAOE,QAG3BF,EAAOE,QAAUqyH,EAAMvyH,EAAOf,QAAQiB,QAAUF,EAAO6uF,YAAY3uF,aAAkB+iE,IAARsvD,GAAqB+G,EAAgB/G,EAClH8G,EAAa9G,EAAM,OAAS,OAG5B16H,EAAK,CAAC,QAAS,kBAAmB,cAAe,UAAW,OAAO,SAASyU,GACpEtM,EAAOsM,IACPtM,EAAOsM,GAAK+sH,QAMhB55H,EAAMopG,cAAgB7oG,IAAWP,EAAMkpG,YAAclpG,EAAMkpG,WAAW3oG,UAAYA,GAClFA,EAAO8pG,aAIPqG,GACA1wG,EAAMsnF,OAAOkpB,aAAajwG,EAAQuyH,GAKtCvyH,EAAO04F,SAAU,EAEb14F,EAAOf,QAAQ63G,UACfj/G,EAAK4H,EAAMO,QAAQ,SAASyuH,GACpBA,EAAYxvH,QAAQ63G,UAAY2X,EAAYvuH,UAC5CuuH,EAAY/1B,SAAU,MAMlC7gG,EAAKmI,EAAOu7G,cAAc,SAASkT,GAC/BA,EAAY6D,WAAWC,GAAK,MAG5BjsC,IACA7mF,EAAMuwG,YAAa,IAER,IAAXtxC,GACAj/D,EAAMi/D,SAGV8O,EAAUxtE,EAAQq5H,IAStB7jD,KAAM,WACFl9E,KAAKg6H,YAAW,IAYpB58C,KAAM,WACFp9E,KAAKg6H,YAAW,IAiBpBj6H,OAAQ,SAASs/G,GACAr/G,KAENq/G,SAAWA,OAAyB10C,IAAb00C,GAFjBr/G,KAGDq/G,SACRA,EAJSr/G,KAMF84G,WANE94G,KAOF84G,SAAS8lB,QAAUvf,GAG9BnqC,EAVal1E,KAUKq/G,EAAW,SAAW,aAG5CoP,YAAasP,EAAaG,mBA7/BlC,CAggCEn9H,GACD,SAASqR,GAMN,IAAInQ,EAAQmQ,EAAEnQ,MACV1C,EAAO6S,EAAE7S,KACTw0E,EAAU3hE,EAAE2hE,QACZv+D,EAAUpD,EAAEoD,QACZ24D,EAAW/7D,EAAE+7D,SACbviE,EAAOwG,EAAExG,KACTkjE,EAAQ18D,EAAE08D,MAMd7sE,EAAMa,UAAUu7G,cAAgB,SAASj4C,GACrC,IAGI66D,EAHAt6H,EAAU3G,KAAK2G,QAAQu6H,WACvBC,EAAU,GACVC,EAAoBphI,KAAKohI,kBAGzBz6H,GAAWA,EAAQ06H,OACnB9hI,EAAKoH,EAAQ06H,OAAO,SAASC,QACR32D,IAAb22D,EAAKC,MACLD,EAAKC,IAAMnvH,EAAE4jE,aAGjBh2E,KAAKwhI,oBAAoBF,EAAMH,EAAS/6D,KACzCpmE,MAIP,IAAIyhI,EAAgBrvH,EAAE7P,MAAMgI,MAAM,EAAG6H,EAAE2B,IAAIotH,GAAS,SAASO,GACzD,OAAOtvH,EAAE6yC,KAAKt+C,EAAQ06H,OAAO,SAASC,GAClC,OAAOA,EAAKC,MAAQG,KACrBh5H,iBAIPy4H,EAAUA,EAAQt3G,iBAAc8gD,EAChCs2D,EAAiBG,GAAqBA,EAAkBD,QAIpDA,IAAYF,IAIRG,GACAphI,KAAKie,OAAOmjH,EAAkBO,YAAav7D,GAG3C+6D,GAEAnhI,KAAKohI,kBAAoB,CACrBD,QAASA,EACTM,cAAeA,EACfE,YAAa3hI,KAAK4hI,eAAeH,IAGrCzhI,KAAKie,OAAOwjH,EAAer7D,IAG3BpmE,KAAKohI,uBAAoBz2D,IAQrC1oE,EAAMa,UAAU0+H,oBAAsB,SAASF,EAAM1nH,GACjD,IAAIioH,EAAYP,EAAKO,WACZA,EAAU95H,UAAY,WACvB,OAAO/H,KAAK+G,YAAc6E,EAAKi2H,EAAUC,SAAUjxE,OAAOmxC,YACtDhiG,KAAKgH,aAAe4E,EAAKi2H,EAAU/lB,UAAWjrD,OAAOmxC,YACrDhiG,KAAK+G,YAAc6E,EAAKi2H,EAAUE,SAAU,IAC5C/hI,KAAKgH,aAAe4E,EAAKi2H,EAAUG,UAAW,KAGnD/yH,KAAKjP,OACR4Z,EAAQ9R,KAAKw5H,EAAKC,MAU1Bt/H,EAAMa,UAAU8+H,eAAiB,SAASj7H,GAEtC,IAAIilE,EAAM,GAqCV,OA/BA,SAASq2D,EAAWt7H,EAASu7H,EAAMt2D,EAAK30D,GACpC,IAAItX,EACJyS,EAAEs6D,WAAW/lE,GAAS,SAASgmE,EAAK34D,GAChC,IAAKiD,GAAS88D,EAAQ//D,EAAK,CAAC,SAAU,QAAS,WAAa,EAOxD,IANArN,EAAQqN,GAAO86D,EAAMnoE,EAAQqN,IAE7B43D,EAAI53D,GAAO,GAINrU,EAAI,EAAGA,EAAIgH,EAAQqN,GAAKhI,OAAQrM,IAC7BuiI,EAAKluH,GAAKrU,KACVisE,EAAI53D,GAAKrU,GAAK,GACdsiI,EACIt1D,EAAIhtE,GACJuiI,EAAKluH,GAAKrU,GACVisE,EAAI53D,GAAKrU,GACTsX,EAAQ,SAIbk3D,EAASxB,IAChBf,EAAI53D,GAAOwB,EAAQm3D,GAAO,GAAK,GAC/Bs1D,EAAWt1D,EAAKu1D,EAAKluH,IAAQ,GAAI43D,EAAI53D,GAAMiD,EAAQ,IAEnD20D,EAAI53D,GAAOkuH,EAAKluH,IAAQ,QAKpCiuH,CAAWt7H,EAAS3G,KAAK2G,QAASilE,EAAK,GAChCA,GArIf,CAwIE7qE,GACKA,GAx1xB2BohI,EAAOC,QACrCD,EAAOC,QAAUt9E,EAAKpiD,SAClBknE,IACAA,EAEJ9kB,EAAK/jD,WAAa6oE,KAq1xB7B","file":"48.chunk.js?v=3bc2d6dcd357813849b0","sourcesContent":["define(['d3'], function(d3) {\n 'use strict';\n\n var donutChart = function(config) {\n config = config || {};\n\n var width = 315;\n var height = 210;\n var radius = 84;\n var color = d3.scale.category20c();\n var arc = d3.svg.arc()\n .outerRadius(radius - 10)\n .innerRadius(radius - 40)\n ;\n var arcHover = d3.svg.arc()\n .outerRadius(radius - 5)\n .innerRadius(radius - 40)\n ;\n var pie = d3.layout.pie()\n .sort(null)\n .value(function(d) { return d[1]; })\n ;\n\n function chart(selection) {\n selection.each(function(data) {\n //data processing\n var total = 0;\n $(data).each(function(i, v) {\n total += v[1];\n });\n $(data).each(function(i, v) {\n v[2] = Math.round((v[1] / total) * 100);\n v[3] = i;\n });\n //select the svg element, if it exists\n var svg = d3.select(this).selectAll('svg').data([data]);\n //otherwise create the skeletal chart\n var gEnter = svg.enter().append('svg').append('g');\n gEnter.append('g').attr('class', 'title')\n .attr('transform', 'translate(0, 10)')\n .append('text').text(config.title)\n .attr('font-weight', 'bold')\n .style('fill', '#777')\n ;\n gEnter.append('g').attr('class', 'donut');\n gEnter.append('g').attr('class', 'legend');\n gEnter.append('g').attr('class', 'hover-label').append('text');\n\n //set the outer dimensions\n svg.attr('width', width).attr('height', height);\n\n //position the donut\n var g = svg.select('.donut')\n .attr('transform', 'translate(' + (width / 4) + ', '+ (height / 2) +')')\n ;\n\n //position the hover-label\n svg.select('.hover-label')\n .style('fill', '#999')\n .attr('text-anchor', 'middle')\n .attr('transform', 'translate(' + (width / 4) + ', '+ ((height / 2) + 5) +')')\n ;\n\n //apply arc data\n var arcs = g.selectAll('.arc')\n .data(pie(data))\n .enter().append('g')\n .attr('class', function(d, i) { return 'arc arc-path-' + i; })\n ;\n arcs.append('path')\n .attr('d', arc)\n .style('fill', function(d) { return color(d.data[0]); })\n .on('mouseover', function() {\n var percent = d3.select(this).data()[0].data[2];\n var index = d3.select(this).data()[0].data[3];\n d3.select(this).attr('d', arcHover);\n svg.select('.hover-label text').text(percent +'%');\n svg.select('.legend-item-'+ index +' text')\n .style('fill', '#000')\n .attr('font-weight', 'bold')\n ;\n })\n .on('mouseout', function() {\n var index = d3.select(this).data()[0].data[3];\n d3.select(this).attr('d', arc);\n svg.select('.hover-label text').text('');\n svg.select('.legend-item-'+ index +' text')\n .style('fill', '#999')\n .attr('font-weight', 'normal')\n ;\n })\n ;\n\n //setup the legend\n var legendSetup = gEnter.select('.legend').selectAll('.legend-item').data(data);\n legendSetup.enter()\n .append('g')\n .attr('class', function(d, i) { return 'legend-item legend-item-' + i; })\n .attr('transform', function(d, i) { return 'translate(70, '+ i * 16 +')'; })\n .style('cursor', 'default')\n .on('mouseover', function() {\n var percent = d3.select(this).data()[0][2];\n var index = d3.select(this).data()[0][3];\n arcs.select('.arc-path-'+ index +' path').attr('d', arcHover);\n svg.select('.hover-label text').text(percent +'%');\n svg.select('.legend-item-'+ index +' text')\n .style('fill', '#000')\n .attr('font-weight', 'bold')\n ;\n })\n .on('mouseout', function() {\n var index = d3.select(this).data()[0][3];\n arcs.select('.arc-path-'+ index +' path').attr('d', arc);\n svg.select('.hover-label text').text('');\n svg.select('.legend-item-'+ index +' text')\n .style('fill', '#999')\n .attr('font-weight', 'normal')\n ;\n })\n ;\n legendSetup.append('circle')\n .attr('cx', 105)\n .attr('cy', 53)\n .attr('r', 5)\n .style('fill', function(d) { return color(d[0]); })\n ;\n legendSetup.append('text')\n .attr('x', 115)\n .attr('y', 57)\n .attr('text-anchor', 'start')\n .style('fill', '#999')\n .style('font-weight', 'bold')\n .style(\"font-size\",\"13px\")\n .text(function(d) { return d[0]; })\n ;\n\n });\n }\n\n return chart;\n };\n return donutChart;\n});\n","/*\n Highcharts JS v3.0.7 (2013-10-24)\n Exporting module\n\n (c) 2010-2013 Torstein Hønsi\n\n License: www.highcharts.com/license\n*/\nrequire(['./highcharts.src.js'], function(Highcharts) {\n (function(f){var A=f.Chart,t=f.addEvent,C=f.removeEvent,k=f.createElement,n=f.discardElement,u=f.css,o=f.merge,r=f.each,p=f.extend,D=Math.max,j=document,B=window,E=f.isTouchDevice,F=f.Renderer.prototype.symbols,x=f.getOptions(),y;p(x.lang,{printChart:\"Print chart\",downloadPNG:\"Download PNG image\",downloadJPEG:\"Download JPEG image\",downloadPDF:\"Download PDF document\",downloadSVG:\"Download SVG vector image\",contextButtonTitle:\"Chart context menu\"});x.navigation={menuStyle:{border:\"1px solid #A0A0A0\",\n background:\"#FFFFFF\",padding:\"5px 0\"},menuItemStyle:{padding:\"0 10px\",background:\"none\",color:\"#303030\",fontSize:E?\"14px\":\"11px\"},menuItemHoverStyle:{background:\"#4572A5\",color:\"#FFFFFF\"},buttonOptions:{symbolFill:\"#E0E0E0\",symbolSize:14,symbolStroke:\"#666\",symbolStrokeWidth:3,symbolX:12.5,symbolY:10.5,align:\"right\",buttonSpacing:3,height:22,theme:{fill:\"white\",stroke:\"none\"},verticalAlign:\"top\",width:24}};x.exporting={type:\"image/png\",url:\"http://export.highcharts.com/\",buttons:{contextButton:{menuClassName:\"highcharts-contextmenu\",\n symbol:\"menu\",_titleKey:\"contextButtonTitle\",menuItems:[{textKey:\"printChart\",onclick:function(){this.print()}},{separator:!0},{textKey:\"downloadPNG\",onclick:function(){this.exportChart()}},{textKey:\"downloadJPEG\",onclick:function(){this.exportChart({type:\"image/jpeg\"})}},{textKey:\"downloadPDF\",onclick:function(){this.exportChart({type:\"application/pdf\"})}},{textKey:\"downloadSVG\",onclick:function(){this.exportChart({type:\"image/svg+xml\"})}}]}}};f.post=function(c,a){var d,b;b=k(\"form\",{method:\"post\",\n action:c,enctype:\"multipart/form-data\"},{display:\"none\"},j.body);for(d in a)k(\"input\",{type:\"hidden\",name:d,value:a[d]},null,b);b.submit();n(b)};p(A.prototype,{getSVG:function(c){var a=this,d,b,z,h,g=o(a.options,c);if(!j.createElementNS)j.createElementNS=function(a,b){return j.createElement(b)};c=k(\"div\",null,{position:\"absolute\",top:\"-9999em\",width:a.chartWidth+\"px\",height:a.chartHeight+\"px\"},j.body);b=a.renderTo.style.width;h=a.renderTo.style.height;b=g.exporting.sourceWidth||g.chart.width||/px$/.test(b)&&\n parseInt(b,10)||600;h=g.exporting.sourceHeight||g.chart.height||/px$/.test(h)&&parseInt(h,10)||400;p(g.chart,{animation:!1,renderTo:c,forExport:!0,width:b,height:h});g.exporting.enabled=!1;g.series=[];r(a.series,function(a){z=o(a.options,{animation:!1,showCheckbox:!1,visible:a.visible});z.isInternal||g.series.push(z)});d=new f.Chart(g,a.callback);r([\"xAxis\",\"yAxis\"],function(b){r(a[b],function(a,c){var g=d[b][c],f=a.getExtremes(),h=f.userMin,f=f.userMax;g&&(h!==void 0||f!==void 0)&&g.setExtremes(h,\n f,!0,!1)})});b=d.container.innerHTML;g=null;d.destroy();n(c);b=b.replace(/zIndex=\"[^\"]+\"/g,\"\").replace(/isShadow=\"[^\"]+\"/g,\"\").replace(/symbolName=\"[^\"]+\"/g,\"\").replace(/jQuery[0-9]+=\"[^\"]+\"/g,\"\").replace(/url\\([^#]+#/g,\"url(#\").replace(/.*?$/,\"\").replace(/ /g,\" \").replace(/­/g,\"­\").replace(//g,'xlink:href=\"$1\"/>').replace(/id=([^\" >]+)/g,'id=\"$1\"').replace(/class=([^\" >]+)/g,'class=\"$1\"').replace(/ transform /g,\" \").replace(/:(path|rect)/g,\"$1\").replace(/style=\"([^\"]+)\"/g,function(a){return a.toLowerCase()});return b=b.replace(/(url\\(#highcharts-[0-9]+)"/g,\"$1\").replace(/"/g,\"'\")},exportChart:function(c,a){var c=c||{},d=this.options.exporting,d=this.getSVG(o({chart:{borderRadius:0}},d.chartOptions,a,{exporting:{sourceWidth:c.sourceWidth||\n d.sourceWidth,sourceHeight:c.sourceHeight||d.sourceHeight}})),c=o(this.options.exporting,c);f.post(c.url,{filename:c.filename||\"chart\",type:c.type,width:c.width||0,scale:c.scale||2,svg:d})},print:function(){var c=this,a=c.container,d=[],b=a.parentNode,f=j.body,h=f.childNodes;if(!c.isPrinting)c.isPrinting=!0,r(h,function(a,b){if(a.nodeType===1)d[b]=a.style.display,a.style.display=\"none\"}),f.appendChild(a),B.focus(),B.print(),setTimeout(function(){b.appendChild(a);r(h,function(a,b){if(a.nodeType===\n 1)a.style.display=d[b]});c.isPrinting=!1},1E3)},contextMenu:function(c,a,d,b,f,h,g){var e=this,j=e.options.navigation,q=j.menuItemStyle,l=e.chartWidth,m=e.chartHeight,o=\"cache-\"+c,i=e[o],s=D(f,h),v,w,n;if(!i)e[o]=i=k(\"div\",{className:c},{position:\"absolute\",zIndex:1E3,padding:s+\"px\"},e.container),v=k(\"div\",null,p({MozBoxShadow:\"3px 3px 10px #888\",WebkitBoxShadow:\"3px 3px 10px #888\",boxShadow:\"3px 3px 10px #888\"},j.menuStyle),i),w=function(){u(i,{display:\"none\"});g&&g.setState(0);e.openMenu=!1},t(i,\n \"mouseleave\",function(){n=setTimeout(w,500)}),t(i,\"mouseenter\",function(){clearTimeout(n)}),t(document,\"mouseup\",function(a){e.pointer.inClass(a.target,c)||w()}),r(a,function(a){if(a){var b=a.separator?k(\"hr\",null,null,v):k(\"div\",{onmouseover:function(){u(this,j.menuItemHoverStyle)},onmouseout:function(){u(this,q)},onclick:function(){w();a.onclick.apply(e,arguments)},innerHTML:a.text||e.options.lang[a.textKey]},p({cursor:\"pointer\"},q),v);e.exportDivElements.push(b)}}),e.exportDivElements.push(v,i),\n e.exportMenuWidth=i.offsetWidth,e.exportMenuHeight=i.offsetHeight;a={display:\"block\"};d+e.exportMenuWidth>l?a.right=l-d-f-s+\"px\":a.left=d-s+\"px\";b+h+e.exportMenuHeight>m&&g.alignOptions.verticalAlign!==\"top\"?a.bottom=m-b-s+\"px\":a.top=b+h-s+\"px\";u(i,a);e.openMenu=!0},addButton:function(c){var a=this,d=a.renderer,b=o(a.options.navigation.buttonOptions,c),j=b.onclick,h=b.menuItems,g,e,k={stroke:b.symbolStroke,fill:b.symbolFill},q=b.symbolSize||12;if(!a.btnCount)a.btnCount=0;if(!a.exportDivElements)a.exportDivElements=\n [],a.exportSVGElements=[];if(b.enabled!==!1){var l=b.theme,m=l.states,n=m&&m.hover,m=m&&m.select,i;delete l.states;j?i=function(){j.apply(a,arguments)}:h&&(i=function(){a.contextMenu(e.menuClassName,h,e.translateX,e.translateY,e.width,e.height,e);e.setState(2)});b.text&&b.symbol?l.paddingLeft=f.pick(l.paddingLeft,25):b.text||p(l,{width:b.width,height:b.height,padding:0});e=d.button(b.text,0,0,i,l,n,m).attr({title:a.options.lang[b._titleKey],\"stroke-linecap\":\"round\"});e.menuClassName=c.menuClassName||\n \"highcharts-menu-\"+a.btnCount++;b.symbol&&(g=d.symbol(b.symbol,b.symbolX-q/2,b.symbolY-q/2,q,q).attr(p(k,{\"stroke-width\":b.symbolStrokeWidth||1,zIndex:1})).add(e));e.add().align(p(b,{width:e.width,x:f.pick(b.x,y)}),!0,\"spacingBox\");y+=(e.width+b.buttonSpacing)*(b.align===\"right\"?-1:1);a.exportSVGElements.push(e,g)}},destroyExport:function(c){var c=c.target,a,d;for(a=0;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}();","// ==ClosureCompiler==\n// @compilation_level SIMPLE_OPTIMIZATIONS\n// JSLint options:\n/*global Highcharts, HighchartsAdapter, document, window, navigator, setInterval, clearInterval, clearTimeout, setTimeout, location, jQuery, $, console, each, grep */\n/*jslint ass: true, sloppy: true, forin: true, plusplus: true, nomen: true, vars: true, regexp: true, newcap: true, browser: true, continue: true, white: true */\n\n/**\n * @license Highcharts JS v5.0.12 (2017-05-24)\n *\n * (c) 2009-2016 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n'use strict';\n\ndefine(['../jquery/jquery-1.10.2.js'], function(jQuery) {\n (function(root, factory) {\n if (typeof module === 'object' && module.exports) {\n module.exports = root.document ?\n factory(root) :\n factory;\n } else {\n root.Highcharts = factory(root);\n }\n }(typeof window !== 'undefined' ? window : this, function(win) {\n var Highcharts = (function() {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n /* global window */\n var win = window,\n doc = win.document;\n\n var SVG_NS = 'http://www.w3.org/2000/svg',\n userAgent = (win.navigator && win.navigator.userAgent) || '',\n svg = doc && doc.createElementNS && !!doc.createElementNS(SVG_NS, 'svg').createSVGRect,\n isMS = /(edge|msie|trident)/i.test(userAgent) && !window.opera,\n vml = !svg,\n isFirefox = /Firefox/.test(userAgent),\n hasBidiBug = isFirefox && parseInt(userAgent.split('Firefox/')[1], 10) < 4; // issue #38\n\n var Highcharts = win.Highcharts ? win.Highcharts.error(16, true) : {\n product: 'Highcharts',\n version: '5.0.12',\n deg2rad: Math.PI * 2 / 360,\n doc: doc,\n hasBidiBug: hasBidiBug,\n hasTouch: doc && doc.documentElement.ontouchstart !== undefined,\n isMS: isMS,\n isWebKit: /AppleWebKit/.test(userAgent),\n isFirefox: isFirefox,\n isTouchDevice: /(Mobile|Android|Windows Phone)/.test(userAgent),\n SVG_NS: SVG_NS,\n chartCount: 0,\n seriesTypes: {},\n symbolSizes: {},\n svg: svg,\n vml: vml,\n win: win,\n marginNames: ['plotTop', 'marginRight', 'marginBottom', 'plotLeft'],\n noop: function() {\n return undefined;\n },\n /**\n * An array containing the current chart objects in the page. A chart's\n * position in the array is preserved throughout the page's lifetime. When\n * a chart is destroyed, the array item becomes `undefined`.\n * @type {Array.}\n * @memberOf Highcharts\n */\n charts: []\n };\n return Highcharts;\n }());\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n /* eslint max-len: [\"warn\", 80, 4] */\n\n /**\n * The Highcharts object is the placeholder for all other members, and various\n * utility functions. The most important member of the namespace would be the\n * chart constructor.\n *\n * @example\n * var chart = Highcharts.chart('container', { ... });\n * \n * @namespace Highcharts\n */\n\n var timers = [];\n\n var charts = H.charts,\n doc = H.doc,\n win = H.win;\n\n /**\n * Provide error messages for debugging, with links to online explanation. This\n * function can be overridden to provide custom error handling.\n *\n * @function #error\n * @memberOf Highcharts\n * @param {Number|String} code - The error code. See [errors.xml]{@link \n * https://github.com/highcharts/highcharts/blob/master/errors/errors.xml}\n * for available codes. If it is a string, the error message is printed\n * directly in the console.\n * @param {Boolean} [stop=false] - Whether to throw an error or just log a \n * warning in the console.\n *\n * @sample highcharts/chart/highcharts-error/ Custom error handler\n */\n H.error = function(code, stop) {\n var msg = H.isNumber(code) ?\n 'Highcharts error #' + code + ': www.highcharts.com/errors/' + code :\n code;\n if (stop) {\n throw new Error(msg);\n }\n // else ...\n if (win.console) {\n console.log(msg); // eslint-disable-line no-console\n }\n };\n\n /**\n * An animator object used internally. One instance applies to one property\n * (attribute or style prop) on one element. Animation is always initiated\n * through {@link SVGElement#animate}.\n *\n * @constructor Fx\n * @memberOf Highcharts\n * @param {HTMLDOMElement|SVGElement} elem - The element to animate.\n * @param {AnimationOptions} options - Animation options.\n * @param {string} prop - The single attribute or CSS property to animate.\n * @private\n *\n * @example\n * var rect = renderer.rect(0, 0, 10, 10).add();\n * rect.animate({ width: 100 });\n */\n H.Fx = function(elem, options, prop) {\n this.options = options;\n this.elem = elem;\n this.prop = prop;\n };\n H.Fx.prototype = {\n\n /**\n * Set the current step of a path definition on SVGElement.\n *\n * @function #dSetter\n * @memberOf Highcharts.Fx\n */\n dSetter: function() {\n var start = this.paths[0],\n end = this.paths[1],\n ret = [],\n now = this.now,\n i = start.length,\n startVal;\n\n // Land on the final path without adjustment points appended in the ends\n if (now === 1) {\n ret = this.toD;\n\n } else if (i === end.length && now < 1) {\n while (i--) {\n startVal = parseFloat(start[i]);\n ret[i] =\n isNaN(startVal) ? // a letter instruction like M or L\n start[i] :\n now * (parseFloat(end[i] - startVal)) + startVal;\n\n }\n // If animation is finished or length not matching, land on right value\n } else {\n ret = end;\n }\n this.elem.attr('d', ret, null, true);\n },\n\n /**\n * Update the element with the current animation step.\n *\n * @function #update\n * @memberOf Highcharts.Fx\n */\n update: function() {\n var elem = this.elem,\n prop = this.prop, // if destroyed, it is null\n now = this.now,\n step = this.options.step;\n\n // Animation setter defined from outside\n if (this[prop + 'Setter']) {\n this[prop + 'Setter']();\n\n // Other animations on SVGElement\n } else if (elem.attr) {\n if (elem.element) {\n elem.attr(prop, now, null, true);\n }\n\n // HTML styles, raw HTML content like container size\n } else {\n elem.style[prop] = now + this.unit;\n }\n\n if (step) {\n step.call(elem, now, this);\n }\n\n },\n\n /**\n * Run an animation.\n *\n * @function #run\n * @memberOf Highcharts.Fx\n * @param {Number} from - The current value, value to start from.\n * @param {Number} to - The end value, value to land on.\n * @param {String} [unit] - The property unit, for example `px`.\n * @returns {void}\n */\n run: function(from, to, unit) {\n var self = this,\n timer = function(gotoEnd) {\n return timer.stopped ? false : self.step(gotoEnd);\n },\n i;\n\n this.startTime = +new Date();\n this.start = from;\n this.end = to;\n this.unit = unit;\n this.now = this.start;\n this.pos = 0;\n\n timer.elem = this.elem;\n timer.prop = this.prop;\n\n if (timer() && timers.push(timer) === 1) {\n timer.timerId = setInterval(function() {\n\n for (i = 0; i < timers.length; i++) {\n if (!timers[i]()) {\n timers.splice(i--, 1);\n }\n }\n\n if (!timers.length) {\n clearInterval(timer.timerId);\n }\n }, 13);\n }\n },\n\n /**\n * Run a single step in the animation.\n *\n * @function #step\n * @memberOf Highcharts.Fx\n * @param {Boolean} [gotoEnd] - Whether to go to the endpoint of the\n * animation after abort.\n * @returns {Boolean} Returns `true` if animation continues.\n */\n step: function(gotoEnd) {\n var t = +new Date(),\n ret,\n done,\n options = this.options,\n elem = this.elem,\n complete = options.complete,\n duration = options.duration,\n curAnim = options.curAnim;\n\n if (elem.attr && !elem.element) { // #2616, element is destroyed\n ret = false;\n\n } else if (gotoEnd || t >= duration + this.startTime) {\n this.now = this.end;\n this.pos = 1;\n this.update();\n\n curAnim[this.prop] = true;\n\n done = true;\n\n H.objectEach(curAnim, function(val) {\n if (val !== true) {\n done = false;\n }\n });\n\n if (done && complete) {\n complete.call(elem);\n }\n ret = false;\n\n } else {\n this.pos = options.easing((t - this.startTime) / duration);\n this.now = this.start + ((this.end - this.start) * this.pos);\n this.update();\n ret = true;\n }\n return ret;\n },\n\n /**\n * Prepare start and end values so that the path can be animated one to one.\n *\n * @function #initPath\n * @memberOf Highcharts.Fx\n * @param {SVGElement} elem - The SVGElement item.\n * @param {String} fromD - Starting path definition.\n * @param {Array} toD - Ending path definition.\n * @returns {Array} An array containing start and end paths in array form\n * so that they can be animated in parallel.\n */\n initPath: function(elem, fromD, toD) {\n fromD = fromD || '';\n var shift,\n startX = elem.startX,\n endX = elem.endX,\n bezier = fromD.indexOf('C') > -1,\n numParams = bezier ? 7 : 3,\n fullLength,\n slice,\n i,\n start = fromD.split(' '),\n end = toD.slice(), // copy\n isArea = elem.isArea,\n positionFactor = isArea ? 2 : 1,\n reverse;\n\n /**\n * In splines make moveTo and lineTo points have six parameters like\n * bezier curves, to allow animation one-to-one.\n */\n function sixify(arr) {\n var isOperator,\n nextIsOperator;\n i = arr.length;\n while (i--) {\n\n // Fill in dummy coordinates only if the next operator comes\n // three places behind (#5788)\n isOperator = arr[i] === 'M' || arr[i] === 'L';\n nextIsOperator = /[a-zA-Z]/.test(arr[i + 3]);\n if (isOperator && nextIsOperator) {\n arr.splice(\n i + 1, 0,\n arr[i + 1], arr[i + 2],\n arr[i + 1], arr[i + 2]\n );\n }\n }\n }\n\n /**\n * Insert an array at the given position of another array\n */\n function insertSlice(arr, subArr, index) {\n [].splice.apply(\n arr, [index, 0].concat(subArr)\n );\n }\n\n /**\n * If shifting points, prepend a dummy point to the end path. \n */\n function prepend(arr, other) {\n while (arr.length < fullLength) {\n\n // Move to, line to or curve to?\n arr[0] = other[fullLength - arr.length];\n\n // Prepend a copy of the first point\n insertSlice(arr, arr.slice(0, numParams), 0);\n\n // For areas, the bottom path goes back again to the left, so we\n // need to append a copy of the last point.\n if (isArea) {\n insertSlice(\n arr,\n arr.slice(arr.length - numParams), arr.length\n );\n i--;\n }\n }\n arr[0] = 'M';\n }\n\n /**\n * Copy and append last point until the length matches the end length\n */\n function append(arr, other) {\n var i = (fullLength - arr.length) / numParams;\n while (i > 0 && i--) {\n\n // Pull out the slice that is going to be appended or inserted.\n // In a line graph, the positionFactor is 1, and the last point\n // is sliced out. In an area graph, the positionFactor is 2,\n // causing the middle two points to be sliced out, since an area\n // path starts at left, follows the upper path then turns and\n // follows the bottom back. \n slice = arr.slice().splice(\n (arr.length / positionFactor) - numParams,\n numParams * positionFactor\n );\n\n // Move to, line to or curve to?\n slice[0] = other[fullLength - numParams - (i * numParams)];\n\n // Disable first control point\n if (bezier) {\n slice[numParams - 6] = slice[numParams - 2];\n slice[numParams - 5] = slice[numParams - 1];\n }\n\n // Now insert the slice, either in the middle (for areas) or at\n // the end (for lines)\n insertSlice(arr, slice, arr.length / positionFactor);\n\n if (isArea) {\n i--;\n }\n }\n }\n\n if (bezier) {\n sixify(start);\n sixify(end);\n }\n\n // For sideways animation, find out how much we need to shift to get the\n // start path Xs to match the end path Xs.\n if (startX && endX) {\n for (i = 0; i < startX.length; i++) {\n // Moving left, new points coming in on right\n if (startX[i] === endX[0]) {\n shift = i;\n break;\n // Moving right\n } else if (startX[0] ===\n endX[endX.length - startX.length + i]) {\n shift = i;\n reverse = true;\n break;\n }\n }\n if (shift === undefined) {\n start = [];\n }\n }\n\n if (start.length && H.isNumber(shift)) {\n\n // The common target length for the start and end array, where both \n // arrays are padded in opposite ends\n fullLength = end.length + shift * positionFactor * numParams;\n\n if (!reverse) {\n prepend(end, start);\n append(start, end);\n } else {\n prepend(start, end);\n append(end, start);\n }\n }\n\n return [start, end];\n }\n }; // End of Fx prototype\n\n /**\n * Handle animation of the color attributes directly.\n */\n H.Fx.prototype.fillSetter =\n H.Fx.prototype.strokeSetter = function() {\n this.elem.attr(\n this.prop,\n H.color(this.start).tweenTo(H.color(this.end), this.pos),\n null,\n true\n );\n };\n\n\n /**\n * Utility function to extend an object with the members of another.\n *\n * @function #extend\n * @memberOf Highcharts\n * @param {Object} a - The object to be extended.\n * @param {Object} b - The object to add to the first one.\n * @returns {Object} Object a, the original object.\n */\n H.extend = function(a, b) {\n var n;\n if (!a) {\n a = {};\n }\n for (n in b) {\n a[n] = b[n];\n }\n return a;\n };\n\n /**\n * Utility function to deep merge two or more objects and return a third object.\n * If the first argument is true, the contents of the second object is copied\n * into the first object. The merge function can also be used with a single \n * object argument to create a deep copy of an object.\n *\n * @function #merge\n * @memberOf Highcharts\n * @param {Boolean} [extend] - Whether to extend the left-side object (a) or\n return a whole new object.\n * @param {Object} a - The first object to extend. When only this is given, the\n function returns a deep copy.\n * @param {...Object} [n] - An object to merge into the previous one.\n * @returns {Object} - The merged object. If the first argument is true, the \n * return is the same as the second argument.\n */\n H.merge = function() {\n var i,\n args = arguments,\n len,\n ret = {},\n doCopy = function(copy, original) {\n // An object is replacing a primitive\n if (typeof copy !== 'object') {\n copy = {};\n }\n\n H.objectEach(original, function(value, key) {\n\n // Copy the contents of objects, but not arrays or DOM nodes\n if (\n H.isObject(value, true) &&\n !H.isClass(value) &&\n !H.isDOMElement(value)\n ) {\n copy[key] = doCopy(copy[key] || {}, value);\n\n // Primitives and arrays are copied over directly\n } else {\n copy[key] = original[key];\n }\n });\n return copy;\n };\n\n // If first argument is true, copy into the existing object. Used in\n // setOptions.\n if (args[0] === true) {\n ret = args[1];\n args = Array.prototype.slice.call(args, 2);\n }\n\n // For each argument, extend the return\n len = args.length;\n for (i = 0; i < len; i++) {\n ret = doCopy(ret, args[i]);\n }\n\n return ret;\n };\n\n /**\n * Shortcut for parseInt\n * @ignore\n * @param {Object} s\n * @param {Number} mag Magnitude\n */\n H.pInt = function(s, mag) {\n return parseInt(s, mag || 10);\n };\n\n /**\n * Utility function to check for string type.\n *\n * @function #isString\n * @memberOf Highcharts\n * @param {Object} s - The item to check.\n * @returns {Boolean} - True if the argument is a string.\n */\n H.isString = function(s) {\n return typeof s === 'string';\n };\n\n /**\n * Utility function to check if an item is an array.\n *\n * @function #isArray\n * @memberOf Highcharts\n * @param {Object} obj - The item to check.\n * @returns {Boolean} - True if the argument is an array.\n */\n H.isArray = function(obj) {\n var str = Object.prototype.toString.call(obj);\n return str === '[object Array]' || str === '[object Array Iterator]';\n };\n\n /**\n * Utility function to check if an item is of type object.\n *\n * @function #isObject\n * @memberOf Highcharts\n * @param {Object} obj - The item to check.\n * @param {Boolean} [strict=false] - Also checks that the object is not an\n * array.\n * @returns {Boolean} - True if the argument is an object.\n */\n H.isObject = function(obj, strict) {\n return !!obj && typeof obj === 'object' && (!strict || !H.isArray(obj));\n };\n\n /**\n * Utility function to check if an Object is a HTML Element.\n *\n * @function #isDOMElement\n * @memberOf Highcharts\n * @param {Object} obj - The item to check.\n * @returns {Boolean} - True if the argument is a HTML Element.\n */\n H.isDOMElement = function(obj) {\n return H.isObject(obj) && typeof obj.nodeType === 'number';\n };\n\n /**\n * Utility function to check if an Object is an class.\n *\n * @function #isClass\n * @memberOf Highcharts\n * @param {Object} obj - The item to check.\n * @returns {Boolean} - True if the argument is an class.\n */\n H.isClass = function(obj) {\n var c = obj && obj.constructor;\n return !!(\n H.isObject(obj, true) &&\n !H.isDOMElement(obj) &&\n (c && c.name && c.name !== 'Object')\n );\n };\n\n /**\n * Utility function to check if an item is of type number.\n *\n * @function #isNumber\n * @memberOf Highcharts\n * @param {Object} n - The item to check.\n * @returns {Boolean} - True if the item is a number and is not NaN.\n */\n H.isNumber = function(n) {\n return typeof n === 'number' && !isNaN(n);\n };\n\n /**\n * Remove the last occurence of an item from an array.\n *\n * @function #erase\n * @memberOf Highcharts\n * @param {Array} arr - The array.\n * @param {*} item - The item to remove.\n */\n H.erase = function(arr, item) {\n var i = arr.length;\n while (i--) {\n if (arr[i] === item) {\n arr.splice(i, 1);\n break;\n }\n }\n };\n\n /**\n * Check if an object is null or undefined.\n *\n * @function #defined\n * @memberOf Highcharts\n * @param {Object} obj - The object to check.\n * @returns {Boolean} - False if the object is null or undefined, otherwise\n * true.\n */\n H.defined = function(obj) {\n return obj !== undefined && obj !== null;\n };\n\n /**\n * Set or get an attribute or an object of attributes. To use as a setter, pass\n * a key and a value, or let the second argument be a collection of keys and\n * values. To use as a getter, pass only a string as the second argument.\n *\n * @function #attr\n * @memberOf Highcharts\n * @param {Object} elem - The DOM element to receive the attribute(s).\n * @param {String|Object} [prop] - The property or an object of key-value pairs.\n * @param {String} [value] - The value if a single property is set.\n * @returns {*} When used as a getter, return the value.\n */\n H.attr = function(elem, prop, value) {\n var ret;\n\n // if the prop is a string\n if (H.isString(prop)) {\n // set the value\n if (H.defined(value)) {\n elem.setAttribute(prop, value);\n\n // get the value\n } else if (elem && elem.getAttribute) {\n ret = elem.getAttribute(prop);\n }\n\n // else if prop is defined, it is a hash of key/value pairs\n } else if (H.defined(prop) && H.isObject(prop)) {\n H.objectEach(prop, function(val, key) {\n elem.setAttribute(key, val);\n });\n }\n return ret;\n };\n\n /**\n * Check if an element is an array, and if not, make it into an array.\n *\n * @function #splat\n * @memberOf Highcharts\n * @param obj {*} - The object to splat.\n * @returns {Array} The produced or original array.\n */\n H.splat = function(obj) {\n return H.isArray(obj) ? obj : [obj];\n };\n\n /**\n * Set a timeout if the delay is given, otherwise perform the function\n * synchronously.\n *\n * @function #syncTimeout\n * @memberOf Highcharts\n * @param {Function} fn - The function callback.\n * @param {Number} delay - Delay in milliseconds.\n * @param {Object} [context] - The context.\n * @returns {Number} An identifier for the timeout that can later be cleared\n * with clearTimeout.\n */\n H.syncTimeout = function(fn, delay, context) {\n if (delay) {\n return setTimeout(fn, delay, context);\n }\n fn.call(0, context);\n };\n\n\n /**\n * Return the first value that is not null or undefined.\n *\n * @function #pick\n * @memberOf Highcharts\n * @param {...*} items - Variable number of arguments to inspect.\n * @returns {*} The value of the first argument that is not null or undefined.\n */\n H.pick = function() {\n var args = arguments,\n i,\n arg,\n length = args.length;\n for (i = 0; i < length; i++) {\n arg = args[i];\n if (arg !== undefined && arg !== null) {\n return arg;\n }\n }\n };\n\n /**\n * @typedef {Object} CSSObject - A style object with camel case property names.\n * The properties can be whatever styles are supported on the given SVG or HTML\n * element.\n * @example\n * {\n * fontFamily: 'monospace',\n * fontSize: '1.2em'\n * }\n */\n /**\n * Set CSS on a given element.\n *\n * @function #css\n * @memberOf Highcharts\n * @param {HTMLDOMElement} el - A HTML DOM element.\n * @param {CSSObject} styles - Style object with camel case property names.\n * @returns {void}\n */\n H.css = function(el, styles) {\n if (H.isMS && !H.svg) { // #2686\n if (styles && styles.opacity !== undefined) {\n styles.filter = 'alpha(opacity=' + (styles.opacity * 100) + ')';\n }\n }\n H.extend(el.style, styles);\n };\n\n /**\n * A HTML DOM element.\n * @typedef {Object} HTMLDOMElement\n */\n\n /**\n * Utility function to create an HTML element with attributes and styles.\n *\n * @function #createElement\n * @memberOf Highcharts\n * @param {String} tag - The HTML tag.\n * @param {Object} [attribs] - Attributes as an object of key-value pairs.\n * @param {CSSObject} [styles] - Styles as an object of key-value pairs.\n * @param {Object} [parent] - The parent HTML object.\n * @param {Boolean} [nopad=false] - If true, remove all padding, border and\n * margin.\n * @returns {HTMLDOMElement} The created DOM element.\n */\n H.createElement = function(tag, attribs, styles, parent, nopad) {\n var el = doc.createElement(tag),\n css = H.css;\n if (attribs) {\n H.extend(el, attribs);\n }\n if (nopad) {\n css(el, {\n padding: 0,\n border: 'none',\n margin: 0\n });\n }\n if (styles) {\n css(el, styles);\n }\n if (parent) {\n parent.appendChild(el);\n }\n return el;\n };\n\n /**\n * Extend a prototyped class by new members.\n *\n * @function #extendClass\n * @memberOf Highcharts\n * @param {Object} parent - The parent prototype to inherit.\n * @param {Object} members - A collection of prototype members to add or\n * override compared to the parent prototype.\n * @returns {Object} A new prototype.\n */\n H.extendClass = function(parent, members) {\n var object = function() {};\n object.prototype = new parent(); // eslint-disable-line new-cap\n H.extend(object.prototype, members);\n return object;\n };\n\n /**\n * Left-pad a string to a given length by adding a character repetetively.\n *\n * @function #pad\n * @memberOf Highcharts\n * @param {Number} number - The input string or number.\n * @param {Number} length - The desired string length.\n * @param {String} [padder=0] - The character to pad with.\n * @returns {String} The padded string.\n */\n H.pad = function(number, length, padder) {\n return new Array((length || 2) + 1 -\n String(number).length).join(padder || 0) + number;\n };\n\n /**\n * @typedef {Number|String} RelativeSize - If a number is given, it defines the\n * pixel length. If a percentage string is given, like for example `'50%'`,\n * the setting defines a length relative to a base size, for example the size\n * of a container.\n */\n /**\n * Return a length based on either the integer value, or a percentage of a base.\n *\n * @function #relativeLength\n * @memberOf Highcharts\n * @param {RelativeSize} value - A percentage string or a number.\n * @param {Number} base - The full length that represents 100%.\n * @returns {Number} The computed length.\n */\n H.relativeLength = function(value, base) {\n return (/%$/).test(value) ?\n base * parseFloat(value) / 100 :\n parseFloat(value);\n };\n\n /**\n * Wrap a method with extended functionality, preserving the original function.\n *\n * @function #wrap\n * @memberOf Highcharts\n * @param {Object} obj - The context object that the method belongs to. In real\n * cases, this is often a prototype.\n * @param {String} method - The name of the method to extend.\n * @param {Function} func - A wrapper function callback. This function is called\n * with the same arguments as the original function, except that the\n * original function is unshifted and passed as the first argument.\n * @returns {void}\n */\n H.wrap = function(obj, method, func) {\n var proceed = obj[method];\n obj[method] = function() {\n var args = Array.prototype.slice.call(arguments),\n outerArgs = arguments,\n ctx = this,\n ret;\n ctx.proceed = function() {\n proceed.apply(ctx, arguments.length ? arguments : outerArgs);\n };\n args.unshift(proceed);\n ret = func.apply(this, args);\n ctx.proceed = null;\n return ret;\n };\n };\n\n /**\n * Get the time zone offset based on the current timezone information as set in\n * the global options.\n *\n * @function #getTZOffset\n * @memberOf Highcharts\n * @param {Number} timestamp - The JavaScript timestamp to inspect.\n * @return {Number} - The timezone offset in minutes compared to UTC.\n */\n H.getTZOffset = function(timestamp) {\n var d = H.Date;\n return ((d.hcGetTimezoneOffset && d.hcGetTimezoneOffset(timestamp)) ||\n d.hcTimezoneOffset || 0) * 60000;\n };\n\n /**\n * Formats a JavaScript date timestamp (milliseconds since Jan 1st 1970) into a\n * human readable date string. The format is a subset of the formats for PHP's\n * [strftime]{@link\n * http://www.php.net/manual/en/function.strftime.php} function. Additional\n * formats can be given in the {@link Highcharts.dateFormats} hook.\n *\n * @function #dateFormat\n * @memberOf Highcharts\n * @param {String} format - The desired format where various time\n * representations are prefixed with %.\n * @param {Number} timestamp - The JavaScript timestamp.\n * @param {Boolean} [capitalize=false] - Upper case first letter in the return.\n * @returns {String} The formatted date.\n */\n H.dateFormat = function(format, timestamp, capitalize) {\n if (!H.defined(timestamp) || isNaN(timestamp)) {\n return H.defaultOptions.lang.invalidDate || '';\n }\n format = H.pick(format, '%Y-%m-%d %H:%M:%S');\n\n var D = H.Date,\n date = new D(timestamp - H.getTZOffset(timestamp)),\n // get the basic time values\n hours = date[D.hcGetHours](),\n day = date[D.hcGetDay](),\n dayOfMonth = date[D.hcGetDate](),\n month = date[D.hcGetMonth](),\n fullYear = date[D.hcGetFullYear](),\n lang = H.defaultOptions.lang,\n langWeekdays = lang.weekdays,\n shortWeekdays = lang.shortWeekdays,\n pad = H.pad,\n\n // List all format keys. Custom formats can be added from the outside. \n replacements = H.extend({\n\n //-- Day\n // Short weekday, like 'Mon'\n 'a': shortWeekdays ?\n shortWeekdays[day] : langWeekdays[day].substr(0, 3),\n // Long weekday, like 'Monday'\n 'A': langWeekdays[day],\n // Two digit day of the month, 01 to 31\n 'd': pad(dayOfMonth),\n // Day of the month, 1 through 31\n 'e': pad(dayOfMonth, 2, ' '),\n 'w': day,\n\n // Week (none implemented)\n //'W': weekNumber(),\n\n //-- Month\n // Short month, like 'Jan'\n 'b': lang.shortMonths[month],\n // Long month, like 'January'\n 'B': lang.months[month],\n // Two digit month number, 01 through 12\n 'm': pad(month + 1),\n\n //-- Year\n // Two digits year, like 09 for 2009\n 'y': fullYear.toString().substr(2, 2),\n // Four digits year, like 2009\n 'Y': fullYear,\n\n //-- Time\n // Two digits hours in 24h format, 00 through 23\n 'H': pad(hours),\n // Hours in 24h format, 0 through 23\n 'k': hours,\n // Two digits hours in 12h format, 00 through 11\n 'I': pad((hours % 12) || 12),\n // Hours in 12h format, 1 through 12\n 'l': (hours % 12) || 12,\n // Two digits minutes, 00 through 59\n 'M': pad(date[D.hcGetMinutes]()),\n // Upper case AM or PM\n 'p': hours < 12 ? 'AM' : 'PM',\n // Lower case AM or PM\n 'P': hours < 12 ? 'am' : 'pm',\n // Two digits seconds, 00 through 59\n 'S': pad(date.getSeconds()),\n // Milliseconds (naming from Ruby)\n 'L': pad(Math.round(timestamp % 1000), 3)\n },\n\n /**\n * A hook for defining additional date format specifiers. New\n * specifiers are defined as key-value pairs by using the specifier\n * as key, and a function which takes the timestamp as value. This\n * function returns the formatted portion of the date.\n *\n * @type {Object}\n * @name dateFormats\n * @memberOf Highcharts\n * @sample highcharts/global/dateformats/ Adding support for week\n * number\n */\n H.dateFormats\n );\n\n\n // Do the replaces\n H.objectEach(replacements, function(val, key) {\n // Regex would do it in one line, but this is faster\n while (format.indexOf('%' + key) !== -1) {\n format = format.replace(\n '%' + key,\n typeof val === 'function' ? val(timestamp) : val\n );\n }\n\n });\n\n // Optionally capitalize the string and return\n return capitalize ?\n format.substr(0, 1).toUpperCase() + format.substr(1) :\n format;\n };\n\n /**\n * Format a single variable. Similar to sprintf, without the % prefix.\n *\n * @example\n * formatSingle('.2f', 5); // => '5.00'.\n *\n * @function #formatSingle\n * @memberOf Highcharts\n * @param {String} format The format string.\n * @param {*} val The value.\n * @returns {String} The formatted representation of the value.\n */\n H.formatSingle = function(format, val) {\n var floatRegex = /f$/,\n decRegex = /\\.([0-9])/,\n lang = H.defaultOptions.lang,\n decimals;\n\n if (floatRegex.test(format)) { // float\n decimals = format.match(decRegex);\n decimals = decimals ? decimals[1] : -1;\n if (val !== null) {\n val = H.numberFormat(\n val,\n decimals,\n lang.decimalPoint,\n format.indexOf(',') > -1 ? lang.thousandsSep : ''\n );\n }\n } else {\n val = H.dateFormat(format, val);\n }\n return val;\n };\n\n /**\n * Format a string according to a subset of the rules of Python's String.format\n * method.\n *\n * @function #format\n * @memberOf Highcharts\n * @param {String} str The string to format.\n * @param {Object} ctx The context, a collection of key-value pairs where each\n * key is replaced by its value.\n * @returns {String} The formatted string.\n *\n * @example\n * var s = Highcharts.format(\n * 'The {color} fox was {len:.2f} feet long',\n * { color: 'red', len: Math.PI }\n * );\n * // => The red fox was 3.14 feet long\n */\n H.format = function(str, ctx) {\n var splitter = '{',\n isInside = false,\n segment,\n valueAndFormat,\n path,\n i,\n len,\n ret = [],\n val,\n index;\n\n while (str) {\n index = str.indexOf(splitter);\n if (index === -1) {\n break;\n }\n\n segment = str.slice(0, index);\n if (isInside) { // we're on the closing bracket looking back\n\n valueAndFormat = segment.split(':');\n path = valueAndFormat.shift().split('.'); // get first and leave\n len = path.length;\n val = ctx;\n\n // Assign deeper paths\n for (i = 0; i < len; i++) {\n val = val[path[i]];\n }\n\n // Format the replacement\n if (valueAndFormat.length) {\n val = H.formatSingle(valueAndFormat.join(':'), val);\n }\n\n // Push the result and advance the cursor\n ret.push(val);\n\n } else {\n ret.push(segment);\n\n }\n str = str.slice(index + 1); // the rest\n isInside = !isInside; // toggle\n splitter = isInside ? '}' : '{'; // now look for next matching bracket\n }\n ret.push(str);\n return ret.join('');\n };\n\n /**\n * Get the magnitude of a number.\n *\n * @function #getMagnitude\n * @memberOf Highcharts\n * @param {Number} number The number.\n * @returns {Number} The magnitude, where 1-9 are magnitude 1, 10-99 magnitude 2\n * etc.\n */\n H.getMagnitude = function(num) {\n return Math.pow(10, Math.floor(Math.log(num) / Math.LN10));\n };\n\n /**\n * Take an interval and normalize it to multiples of round numbers.\n *\n * @todo Move this function to the Axis prototype. It is here only for\n * historical reasons.\n * @function #normalizeTickInterval\n * @memberOf Highcharts\n * @param {Number} interval - The raw, un-rounded interval.\n * @param {Array} [multiples] - Allowed multiples.\n * @param {Number} [magnitude] - The magnitude of the number.\n * @param {Boolean} [allowDecimals] - Whether to allow decimals.\n * @param {Boolean} [hasTickAmount] - If it has tickAmount, avoid landing\n * on tick intervals lower than original.\n * @returns {Number} The normalized interval.\n */\n H.normalizeTickInterval = function(interval, multiples, magnitude,\n allowDecimals, hasTickAmount) {\n var normalized,\n i,\n retInterval = interval;\n\n // round to a tenfold of 1, 2, 2.5 or 5\n magnitude = H.pick(magnitude, 1);\n normalized = interval / magnitude;\n\n // multiples for a linear scale\n if (!multiples) {\n multiples = hasTickAmount ?\n // Finer grained ticks when the tick amount is hard set, including\n // when alignTicks is true on multiple axes (#4580).\n [1, 1.2, 1.5, 2, 2.5, 3, 4, 5, 6, 8, 10] :\n\n // Else, let ticks fall on rounder numbers\n [1, 2, 2.5, 5, 10];\n\n\n // the allowDecimals option\n if (allowDecimals === false) {\n if (magnitude === 1) {\n multiples = H.grep(multiples, function(num) {\n return num % 1 === 0;\n });\n } else if (magnitude <= 0.1) {\n multiples = [1 / magnitude];\n }\n }\n }\n\n // normalize the interval to the nearest multiple\n for (i = 0; i < multiples.length; i++) {\n retInterval = multiples[i];\n // only allow tick amounts smaller than natural\n if ((hasTickAmount && retInterval * magnitude >= interval) ||\n (!hasTickAmount && (normalized <= (multiples[i] +\n (multiples[i + 1] || multiples[i])) / 2))) {\n break;\n }\n }\n\n // Multiply back to the correct magnitude. Correct floats to appropriate \n // precision (#6085).\n retInterval = H.correctFloat(\n retInterval * magnitude, -Math.round(Math.log(0.001) / Math.LN10)\n );\n\n return retInterval;\n };\n\n\n /**\n * Sort an object array and keep the order of equal items. The ECMAScript\n * standard does not specify the behaviour when items are equal.\n *\n * @function #stableSort\n * @memberOf Highcharts\n * @param {Array} arr - The array to sort.\n * @param {Function} sortFunction - The function to sort it with, like with \n * regular Array.prototype.sort.\n * @returns {void}\n */\n H.stableSort = function(arr, sortFunction) {\n var length = arr.length,\n sortValue,\n i;\n\n // Add index to each item\n for (i = 0; i < length; i++) {\n arr[i].safeI = i; // stable sort index\n }\n\n arr.sort(function(a, b) {\n sortValue = sortFunction(a, b);\n return sortValue === 0 ? a.safeI - b.safeI : sortValue;\n });\n\n // Remove index from items\n for (i = 0; i < length; i++) {\n delete arr[i].safeI; // stable sort index\n }\n };\n\n /**\n * Non-recursive method to find the lowest member of an array. `Math.min` raises\n * a maximum call stack size exceeded error in Chrome when trying to apply more\n * than 150.000 points. This method is slightly slower, but safe.\n *\n * @function #arrayMin\n * @memberOf Highcharts\n * @param {Array} data An array of numbers.\n * @returns {Number} The lowest number.\n */\n H.arrayMin = function(data) {\n var i = data.length,\n min = data[0];\n\n while (i--) {\n if (data[i] < min) {\n min = data[i];\n }\n }\n return min;\n };\n\n /**\n * Non-recursive method to find the lowest member of an array. `Math.max` raises\n * a maximum call stack size exceeded error in Chrome when trying to apply more\n * than 150.000 points. This method is slightly slower, but safe.\n *\n * @function #arrayMax\n * @memberOf Highcharts\n * @param {Array} data - An array of numbers.\n * @returns {Number} The highest number.\n */\n H.arrayMax = function(data) {\n var i = data.length,\n max = data[0];\n\n while (i--) {\n if (data[i] > max) {\n max = data[i];\n }\n }\n return max;\n };\n\n /**\n * Utility method that destroys any SVGElement instances that are properties on\n * the given object. It loops all properties and invokes destroy if there is a\n * destroy method. The property is then delete.\n *\n * @function #destroyObjectProperties\n * @memberOf Highcharts\n * @param {Object} obj - The object to destroy properties on.\n * @param {Object} [except] - Exception, do not destroy this property, only\n * delete it.\n * @returns {void}\n */\n H.destroyObjectProperties = function(obj, except) {\n H.objectEach(obj, function(val, n) {\n // If the object is non-null and destroy is defined\n if (val && val !== except && val.destroy) {\n // Invoke the destroy\n val.destroy();\n }\n\n // Delete the property from the object.\n delete obj[n];\n });\n };\n\n\n /**\n * Discard a HTML element by moving it to the bin and delete.\n *\n * @function #discardElement\n * @memberOf Highcharts\n * @param {HTMLDOMElement} element - The HTML node to discard.\n * @returns {void}\n */\n H.discardElement = function(element) {\n var garbageBin = H.garbageBin;\n // create a garbage bin element, not part of the DOM\n if (!garbageBin) {\n garbageBin = H.createElement('div');\n }\n\n // move the node and empty bin\n if (element) {\n garbageBin.appendChild(element);\n }\n garbageBin.innerHTML = '';\n };\n\n /**\n * Fix JS round off float errors.\n *\n * @function #correctFloat\n * @memberOf Highcharts\n * @param {Number} num - A float number to fix.\n * @param {Number} [prec=14] - The precision.\n * @returns {Number} The corrected float number.\n */\n H.correctFloat = function(num, prec) {\n return parseFloat(\n num.toPrecision(prec || 14)\n );\n };\n\n /**\n * Set the global animation to either a given value, or fall back to the given\n * chart's animation option.\n *\n * @function #setAnimation\n * @memberOf Highcharts\n * @param {Boolean|Animation} animation - The animation object.\n * @param {Object} chart - The chart instance.\n * @returns {void}\n * @todo This function always relates to a chart, and sets a property on the\n * renderer, so it should be moved to the SVGRenderer.\n */\n H.setAnimation = function(animation, chart) {\n chart.renderer.globalAnimation = H.pick(\n animation,\n chart.options.chart.animation,\n true\n );\n };\n\n /**\n * Get the animation in object form, where a disabled animation is always\n * returned as `{ duration: 0 }`.\n *\n * @function #animObject\n * @memberOf Highcharts\n * @param {Boolean|AnimationOptions} animation - An animation setting. Can be an\n * object with duration, complete and easing properties, or a boolean to\n * enable or disable.\n * @returns {AnimationOptions} An object with at least a duration property.\n */\n H.animObject = function(animation) {\n return H.isObject(animation) ?\n H.merge(animation) : {\n duration: animation ? 500 : 0\n };\n };\n\n /**\n * The time unit lookup\n */\n H.timeUnits = {\n millisecond: 1,\n second: 1000,\n minute: 60000,\n hour: 3600000,\n day: 24 * 3600000,\n week: 7 * 24 * 3600000,\n month: 28 * 24 * 3600000,\n year: 364 * 24 * 3600000\n };\n\n /**\n * Format a number and return a string based on input settings.\n *\n * @function #numberFormat\n * @memberOf Highcharts\n * @param {Number} number - The input number to format.\n * @param {Number} decimals - The amount of decimals. A value of -1 preserves\n * the amount in the input number.\n * @param {String} [decimalPoint] - The decimal point, defaults to the one given\n * in the lang options, or a dot.\n * @param {String} [thousandsSep] - The thousands separator, defaults to the one\n * given in the lang options, or a space character.\n * @returns {String} The formatted number.\n *\n * @sample members/highcharts-numberformat/ Custom number format\n */\n H.numberFormat = function(number, decimals, decimalPoint, thousandsSep) {\n number = +number || 0;\n decimals = +decimals;\n\n var lang = H.defaultOptions.lang,\n origDec = (number.toString().split('.')[1] || '').length,\n strinteger,\n thousands,\n ret,\n roundedNumber;\n\n if (decimals === -1) {\n // Preserve decimals. Not huge numbers (#3793).\n decimals = Math.min(origDec, 20);\n } else if (!H.isNumber(decimals)) {\n decimals = 2;\n }\n\n // Add another decimal to avoid rounding errors of float numbers. (#4573)\n // Then use toFixed to handle rounding.\n roundedNumber = (\n Math.abs(number) + Math.pow(10, -Math.max(decimals, origDec) - 1)\n ).toFixed(decimals);\n\n // A string containing the positive integer component of the number\n strinteger = String(H.pInt(roundedNumber));\n\n // Leftover after grouping into thousands. Can be 0, 1 or 3.\n thousands = strinteger.length > 3 ? strinteger.length % 3 : 0;\n\n // Language\n decimalPoint = H.pick(decimalPoint, lang.decimalPoint);\n thousandsSep = H.pick(thousandsSep, lang.thousandsSep);\n\n // Start building the return\n ret = number < 0 ? '-' : '';\n\n // Add the leftover after grouping into thousands. For example, in the\n // number 42 000 000, this line adds 42.\n ret += thousands ? strinteger.substr(0, thousands) + thousandsSep : '';\n\n // Add the remaining thousands groups, joined by the thousands separator\n ret += strinteger\n .substr(thousands)\n .replace(/(\\d{3})(?=\\d)/g, '$1' + thousandsSep);\n\n // Add the decimal point and the decimal component\n if (decimals) {\n // Get the decimal component\n ret += decimalPoint + roundedNumber.slice(-decimals);\n }\n\n return ret;\n };\n\n /**\n * Easing definition\n * @ignore\n * @param {Number} pos Current position, ranging from 0 to 1.\n */\n Math.easeInOutSine = function(pos) {\n return -0.5 * (Math.cos(Math.PI * pos) - 1);\n };\n\n /**\n * Get the computed CSS value for given element and property, only for numerical\n * properties. For width and height, the dimension of the inner box (excluding\n * padding) is returned. Used for fitting the chart within the container.\n *\n * @function #getStyle\n * @memberOf Highcharts\n * @param {HTMLDOMElement} el - A HTML element.\n * @param {String} prop - The property name.\n * @param {Boolean} [toInt=true] - Parse to integer.\n * @returns {Number} - The numeric value.\n */\n H.getStyle = function(el, prop, toInt) {\n\n var style;\n\n // For width and height, return the actual inner pixel size (#4913)\n if (prop === 'width') {\n return Math.min(el.offsetWidth, el.scrollWidth) -\n H.getStyle(el, 'padding-left') -\n H.getStyle(el, 'padding-right');\n } else if (prop === 'height') {\n return Math.min(el.offsetHeight, el.scrollHeight) -\n H.getStyle(el, 'padding-top') -\n H.getStyle(el, 'padding-bottom');\n }\n\n // Otherwise, get the computed style\n style = win.getComputedStyle(el, undefined);\n if (style) {\n style = style.getPropertyValue(prop);\n if (H.pick(toInt, true)) {\n style = H.pInt(style);\n }\n }\n return style;\n };\n\n /**\n * Search for an item in an array.\n *\n * @function #inArray\n * @memberOf Highcharts\n * @param {*} item - The item to search for.\n * @param {arr} arr - The array or node collection to search in.\n * @returns {Number} - The index within the array, or -1 if not found.\n */\n H.inArray = function(item, arr) {\n return arr.indexOf ? arr.indexOf(item) : [].indexOf.call(arr, item);\n };\n\n /**\n * Filter an array by a callback.\n *\n * @function #grep\n * @memberOf Highcharts\n * @param {Array} arr - The array to filter.\n * @param {Function} callback - The callback function. The function receives the\n * item as the first argument. Return `true` if the item is to be\n * preserved.\n * @returns {Array} - A new, filtered array.\n */\n H.grep = function(arr, callback) {\n return [].filter.call(arr, callback);\n };\n\n /**\n * Return the value of the first element in the array that satisfies the \n * provided testing function.\n *\n * @function #find\n * @memberOf Highcharts\n * @param {Array} arr - The array to test.\n * @param {Function} callback - The callback function. The function receives the\n * item as the first argument. Return `true` if this item satisfies the\n * condition.\n * @returns {Mixed} - The value of the element.\n */\n H.find = function(arr, callback) {\n return [].find.call(arr, callback);\n };\n\n /**\n * Map an array by a callback.\n *\n * @function #map\n * @memberOf Highcharts\n * @param {Array} arr - The array to map.\n * @param {Function} fn - The callback function. Return the new value for the \n * new array.\n * @returns {Array} - A new array item with modified items.\n */\n H.map = function(arr, fn) {\n var results = [],\n i = 0,\n len = arr.length;\n\n for (; i < len; i++) {\n results[i] = fn.call(arr[i], arr[i], i, arr);\n }\n\n return results;\n };\n\n /**\n * Get the element's offset position, corrected for `overflow: auto`.\n *\n * @function #offset\n * @memberOf Highcharts\n * @param {HTMLDOMElement} el - The HTML element.\n * @returns {Object} An object containing `left` and `top` properties for the\n * position in the page.\n */\n H.offset = function(el) {\n var docElem = doc.documentElement,\n box = el.getBoundingClientRect();\n\n return {\n top: box.top + (win.pageYOffset || docElem.scrollTop) -\n (docElem.clientTop || 0),\n left: box.left + (win.pageXOffset || docElem.scrollLeft) -\n (docElem.clientLeft || 0)\n };\n };\n\n /**\n * Stop running animation.\n *\n * @todo A possible extension to this would be to stop a single property, when\n * we want to continue animating others. Then assign the prop to the timer\n * in the Fx.run method, and check for the prop here. This would be an\n * improvement in all cases where we stop the animation from .attr. Instead of\n * stopping everything, we can just stop the actual attributes we're setting.\n *\n * @function #stop\n * @memberOf Highcharts\n * @param {SVGElement} el - The SVGElement to stop animation on.\n * @param {string} [prop] - The property to stop animating. If given, the stop\n * method will stop a single property from animating, while others continue.\n * @returns {void}\n */\n H.stop = function(el, prop) {\n\n var i = timers.length;\n\n // Remove timers related to this element (#4519)\n while (i--) {\n if (timers[i].elem === el && (!prop || prop === timers[i].prop)) {\n timers[i].stopped = true; // #4667\n }\n }\n };\n\n /**\n * Iterate over an array.\n *\n * @function #each\n * @memberOf Highcharts\n * @param {Array} arr - The array to iterate over.\n * @param {Function} fn - The iterator callback. It passes three arguments:\n * * item - The array item.\n * * index - The item's index in the array.\n * * arr - The array that each is being applied to.\n * @param {Object} [ctx] The context.\n */\n H.each = function(arr, fn, ctx) { // modern browsers\n return Array.prototype.forEach.call(arr, fn, ctx);\n };\n\n /**\n * Iterate over object key pairs in an object.\n *\n * @function #objectEach\n * @memberOf Highcharts\n * @param {Object} obj - The object to iterate over.\n * @param {Function} fn - The iterator callback. It passes three arguments:\n * * value - The property value.\n * * key - The property key.\n * * obj - The object that objectEach is being applied to.\n * @param {Object} ctx The context\n */\n H.objectEach = function(obj, fn, ctx) {\n for (var key in obj) {\n if (obj.hasOwnProperty(key)) {\n fn.call(ctx, obj[key], key, obj);\n }\n }\n };\n\n /**\n * Add an event listener.\n *\n * @function #addEvent\n * @memberOf Highcharts\n * @param {Object} el - The element or object to add a listener to. It can be a\n * {@link HTMLDOMElement}, an {@link SVGElement} or any other object.\n * @param {String} type - The event type.\n * @param {Function} fn - The function callback to execute when the event is \n * fired.\n * @returns {Function} A callback function to remove the added event.\n */\n H.addEvent = function(el, type, fn) {\n\n var events = el.hcEvents = el.hcEvents || {};\n\n function wrappedFn(e) {\n e.target = e.srcElement || win; // #2820\n fn.call(el, e);\n }\n\n // Handle DOM events in modern browsers\n if (el.addEventListener) {\n el.addEventListener(type, fn, false);\n\n // Handle old IE implementation\n } else if (el.attachEvent) {\n\n if (!el.hcEventsIE) {\n el.hcEventsIE = {};\n }\n\n // Link wrapped fn with original fn, so we can get this in removeEvent\n el.hcEventsIE[fn.toString()] = wrappedFn;\n\n el.attachEvent('on' + type, wrappedFn);\n }\n\n if (!events[type]) {\n events[type] = [];\n }\n\n events[type].push(fn);\n\n // Return a function that can be called to remove this event.\n return function() {\n H.removeEvent(el, type, fn);\n };\n };\n\n /**\n * Remove an event that was added with {@link Highcharts#addEvent}.\n *\n * @function #removeEvent\n * @memberOf Highcharts\n * @param {Object} el - The element to remove events on.\n * @param {String} [type] - The type of events to remove. If undefined, all\n * events are removed from the element.\n * @param {Function} [fn] - The specific callback to remove. If undefined, all\n * events that match the element and optionally the type are removed.\n * @returns {void}\n */\n H.removeEvent = function(el, type, fn) {\n\n var events,\n hcEvents = el.hcEvents,\n index;\n\n function removeOneEvent(type, fn) {\n if (el.removeEventListener) {\n el.removeEventListener(type, fn, false);\n } else if (el.attachEvent) {\n fn = el.hcEventsIE[fn.toString()];\n el.detachEvent('on' + type, fn);\n }\n }\n\n function removeAllEvents() {\n var types,\n len;\n\n if (!el.nodeName) {\n return; // break on non-DOM events\n }\n\n if (type) {\n types = {};\n types[type] = true;\n } else {\n types = hcEvents;\n }\n\n H.objectEach(types, function(val, n) {\n if (hcEvents[n]) {\n len = hcEvents[n].length;\n while (len--) {\n removeOneEvent(n, hcEvents[n][len]);\n }\n }\n });\n }\n\n if (hcEvents) {\n if (type) {\n events = hcEvents[type] || [];\n if (fn) {\n index = H.inArray(fn, events);\n if (index > -1) {\n events.splice(index, 1);\n hcEvents[type] = events;\n }\n removeOneEvent(type, fn);\n\n } else {\n removeAllEvents();\n hcEvents[type] = [];\n }\n } else {\n removeAllEvents();\n el.hcEvents = {};\n }\n }\n };\n\n /**\n * Fire an event that was registered with {@link Highcharts#addEvent}.\n *\n * @function #fireEvent\n * @memberOf Highcharts\n * @param {Object} el - The object to fire the event on. It can be a\n * {@link HTMLDOMElement}, an {@link SVGElement} or any other object.\n * @param {String} type - The type of event.\n * @param {Object} [eventArguments] - Custom event arguments that are passed on\n * as an argument to the event handler.\n * @param {Function} [defaultFunction] - The default function to execute if the \n * other listeners haven't returned false.\n * @returns {void}\n */\n H.fireEvent = function(el, type, eventArguments, defaultFunction) {\n var e,\n hcEvents = el.hcEvents,\n events,\n len,\n i,\n fn;\n\n eventArguments = eventArguments || {};\n\n if (doc.createEvent && (el.dispatchEvent || el.fireEvent)) {\n e = doc.createEvent('Events');\n e.initEvent(type, true, true);\n //e.target = el;\n\n H.extend(e, eventArguments);\n\n if (el.dispatchEvent) {\n el.dispatchEvent(e);\n } else {\n el.fireEvent(type, e);\n }\n\n } else if (hcEvents) {\n\n events = hcEvents[type] || [];\n len = events.length;\n\n if (!eventArguments.target) { // We're running a custom event\n\n H.extend(eventArguments, {\n // Attach a simple preventDefault function to skip default\n // handler if called. The built-in defaultPrevented property is\n // not overwritable (#5112)\n preventDefault: function() {\n eventArguments.defaultPrevented = true;\n },\n // Setting target to native events fails with clicking the\n // zoom-out button in Chrome.\n target: el,\n // If the type is not set, we're running a custom event (#2297).\n // If it is set, we're running a browser event, and setting it\n // will cause en error in IE8 (#2465). \n type: type\n });\n }\n\n\n for (i = 0; i < len; i++) {\n fn = events[i];\n\n // If the event handler return false, prevent the default handler\n // from executing\n if (fn && fn.call(el, eventArguments) === false) {\n eventArguments.preventDefault();\n }\n }\n }\n\n // Run the default if not prevented\n if (defaultFunction && !eventArguments.defaultPrevented) {\n defaultFunction(eventArguments);\n }\n };\n\n /**\n * An animation configuration. Animation configurations can also be defined as\n * booleans, where `false` turns off animation and `true` defaults to a duration\n * of 500ms.\n * @typedef {Object} AnimationOptions\n * @property {Number} duration - The animation duration in milliseconds.\n * @property {String} [easing] - The name of an easing function as defined on\n * the `Math` object.\n * @property {Function} [complete] - A callback function to exectute when the\n * animation finishes.\n * @property {Function} [step] - A callback function to execute on each step of\n * each attribute or CSS property that's being animated. The first argument\n * contains information about the animation and progress.\n */\n\n\n /**\n * The global animate method, which uses Fx to create individual animators.\n *\n * @function #animate\n * @memberOf Highcharts\n * @param {HTMLDOMElement|SVGElement} el - The element to animate.\n * @param {Object} params - An object containing key-value pairs of the\n * properties to animate. Supports numeric as pixel-based CSS properties\n * for HTML objects and attributes for SVGElements.\n * @param {AnimationOptions} [opt] - Animation options.\n */\n H.animate = function(el, params, opt) {\n var start,\n unit = '',\n end,\n fx,\n args;\n\n if (!H.isObject(opt)) { // Number or undefined/null\n args = arguments;\n opt = {\n duration: args[2],\n easing: args[3],\n complete: args[4]\n };\n }\n if (!H.isNumber(opt.duration)) {\n opt.duration = 400;\n }\n opt.easing = typeof opt.easing === 'function' ?\n opt.easing :\n (Math[opt.easing] || Math.easeInOutSine);\n opt.curAnim = H.merge(params);\n\n H.objectEach(params, function(val, prop) {\n // Stop current running animation of this property\n H.stop(el, prop);\n\n fx = new H.Fx(el, opt, prop);\n end = null;\n\n if (prop === 'd') {\n fx.paths = fx.initPath(\n el,\n el.d,\n params.d\n );\n fx.toD = params.d;\n start = 0;\n end = 1;\n } else if (el.attr) {\n start = el.attr(prop);\n } else {\n start = parseFloat(H.getStyle(el, prop)) || 0;\n if (prop !== 'opacity') {\n unit = 'px';\n }\n }\n\n if (!end) {\n end = val;\n }\n if (end && end.match && end.match('px')) {\n end = end.replace(/px/g, ''); // #4351\n }\n fx.run(start, end, unit);\n });\n };\n\n /**\n * Factory to create new series prototypes.\n *\n * @function #seriesType\n * @memberOf Highcharts\n *\n * @param {String} type - The series type name.\n * @param {String} parent - The parent series type name. Use `line` to inherit\n * from the basic {@link Series} object.\n * @param {Object} options - The additional default options that is merged with\n * the parent's options.\n * @param {Object} props - The properties (functions and primitives) to set on\n * the new prototype.\n * @param {Object} [pointProps] - Members for a series-specific extension of the\n * {@link Point} prototype if needed.\n * @returns {*} - The newly created prototype as extended from {@link Series}\n * or its derivatives.\n */\n // docs: add to API + extending Highcharts\n H.seriesType = function(type, parent, options, props, pointProps) {\n var defaultOptions = H.getOptions(),\n seriesTypes = H.seriesTypes;\n\n if (seriesTypes[type]) {\n return H.error(27); // Series type already defined\n }\n\n // Merge the options\n defaultOptions.plotOptions[type] = H.merge(\n defaultOptions.plotOptions[parent],\n options\n );\n\n // Create the class\n seriesTypes[type] = H.extendClass(seriesTypes[parent] ||\n function() {}, props);\n seriesTypes[type].prototype.type = type;\n\n // Create the point class if needed\n if (pointProps) {\n seriesTypes[type].prototype.pointClass =\n H.extendClass(H.Point, pointProps);\n }\n\n return seriesTypes[type];\n };\n\n /**\n * Get a unique key for using in internal element id's and pointers. The key\n * is composed of a random hash specific to this Highcharts instance, and a \n * counter.\n * @function #uniqueKey\n * @memberOf Highcharts\n * @return {string} The key.\n * @example\n * var id = H.uniqueKey(); // => 'highcharts-x45f6hp-0'\n */\n H.uniqueKey = (function() {\n\n var uniqueKeyHash = Math.random().toString(36).substring(2, 9),\n idCounter = 0;\n\n return function() {\n return 'highcharts-' + uniqueKeyHash + '-' + idCounter++;\n };\n }());\n\n /**\n * Register Highcharts as a plugin in jQuery\n */\n if (jQuery) {\n jQuery.fn.highcharts = function() {\n var args = [].slice.call(arguments);\n\n if (this[0]) { // this[0] is the renderTo div\n\n // Create the chart\n if (args[0]) {\n new H[ // eslint-disable-line no-new\n // Constructor defaults to Chart\n H.isString(args[0]) ? args.shift() : 'Chart'\n ](this[0], args[0], args[1]);\n return this;\n }\n\n // When called without parameters or with the return argument,\n // return an existing chart\n return charts[H.attr(this[0], 'data-highcharts-chart')];\n }\n };\n }\n\n\n /**\n * Compatibility section to add support for legacy IE. This can be removed if\n * old IE support is not needed.\n */\n if (doc && !doc.defaultView) {\n H.getStyle = function(el, prop) {\n var val,\n alias = {\n width: 'clientWidth',\n height: 'clientHeight'\n }[prop];\n\n if (el.style[prop]) {\n return H.pInt(el.style[prop]);\n }\n if (prop === 'opacity') {\n prop = 'filter';\n }\n\n // Getting the rendered width and height\n if (alias) {\n el.style.zoom = 1;\n return Math.max(el[alias] - 2 * H.getStyle(el, 'padding'), 0);\n }\n\n val = el.currentStyle[prop.replace(/\\-(\\w)/g, function(a, b) {\n return b.toUpperCase();\n })];\n if (prop === 'filter') {\n val = val.replace(\n /alpha\\(opacity=([0-9]+)\\)/,\n function(a, b) {\n return b / 100;\n }\n );\n }\n\n return val === '' ? 1 : H.pInt(val);\n };\n }\n\n if (!Array.prototype.forEach) {\n H.each = function(arr, fn, ctx) { // legacy\n var i = 0,\n len = arr.length;\n for (; i < len; i++) {\n if (fn.call(ctx, arr[i], i, arr) === false) {\n return i;\n }\n }\n };\n }\n\n if (!Array.prototype.indexOf) {\n H.inArray = function(item, arr) {\n var len,\n i = 0;\n\n if (arr) {\n len = arr.length;\n\n for (; i < len; i++) {\n if (arr[i] === item) {\n return i;\n }\n }\n }\n\n return -1;\n };\n }\n\n if (!Array.prototype.filter) {\n H.grep = function(elements, fn) {\n var ret = [],\n i = 0,\n length = elements.length;\n\n for (; i < length; i++) {\n if (fn(elements[i], i)) {\n ret.push(elements[i]);\n }\n }\n\n return ret;\n };\n }\n\n if (!Array.prototype.find) {\n H.find = function(arr, fn) {\n var i,\n length = arr.length;\n\n for (i = 0; i < length; i++) {\n if (fn(arr[i], i)) {\n return arr[i];\n }\n }\n };\n }\n\n //--- End compatibility section ---\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var each = H.each,\n isNumber = H.isNumber,\n map = H.map,\n merge = H.merge,\n pInt = H.pInt;\n\n /**\n * @typedef {string} ColorString\n * A valid color to be parsed and handled by Highcharts. Highcharts internally \n * supports hex colors like `#ffffff`, rgb colors like `rgb(255,255,255)` and\n * rgba colors like `rgba(255,255,255,1)`. Other colors may be supported by the\n * browsers and displayed correctly, but Highcharts is not able to process them\n * and apply concepts like opacity and brightening.\n */\n /**\n * Handle color operations. The object methods are chainable.\n * @param {String} input The input color in either rbga or hex format\n */\n H.Color = function(input) {\n // Backwards compatibility, allow instanciation without new\n if (!(this instanceof H.Color)) {\n return new H.Color(input);\n }\n // Initialize\n this.init(input);\n };\n H.Color.prototype = {\n\n // Collection of parsers. This can be extended from the outside by pushing parsers\n // to Highcharts.Color.prototype.parsers.\n parsers: [{\n // RGBA color\n regex: /rgba\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]?(?:\\.[0-9]+)?)\\s*\\)/,\n parse: function(result) {\n return [pInt(result[1]), pInt(result[2]), pInt(result[3]), parseFloat(result[4], 10)];\n }\n }, {\n // RGB color\n regex: /rgb\\(\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*,\\s*([0-9]{1,3})\\s*\\)/,\n parse: function(result) {\n return [pInt(result[1]), pInt(result[2]), pInt(result[3]), 1];\n }\n }],\n\n // Collection of named colors. Can be extended from the outside by adding\n // colors to Highcharts.Color.prototype.names.\n names: {\n none: 'rgba(255,255,255,0)',\n white: '#ffffff',\n black: '#000000'\n },\n\n /**\n * Parse the input color to rgba array\n * @param {String} input\n */\n init: function(input) {\n var result,\n rgba,\n i,\n parser,\n len;\n\n this.input = input = this.names[\n input && input.toLowerCase ?\n input.toLowerCase() :\n ''\n ] || input;\n\n // Gradients\n if (input && input.stops) {\n this.stops = map(input.stops, function(stop) {\n return new H.Color(stop[1]);\n });\n\n // Solid colors\n } else {\n\n // Check if it's possible to do bitmasking instead of regex\n if (input && input[0] === '#') {\n\n len = input.length;\n input = parseInt(input.substr(1), 16);\n\n // Handle long-form, e.g. #AABBCC\n if (len === 7) {\n\n rgba = [\n (input & 0xFF0000) >> 16,\n (input & 0xFF00) >> 8,\n (input & 0xFF),\n 1\n ];\n\n // Handle short-form, e.g. #ABC\n // In short form, the value is assumed to be the same \n // for both nibbles for each component. e.g. #ABC = #AABBCC\n } else if (len === 4) {\n\n rgba = [\n ((input & 0xF00) >> 4) | (input & 0xF00) >> 8,\n ((input & 0xF0) >> 4) | (input & 0xF0),\n ((input & 0xF) << 4) | (input & 0xF),\n 1\n ];\n }\n }\n\n // Otherwise, check regex parsers\n if (!rgba) {\n i = this.parsers.length;\n while (i-- && !rgba) {\n parser = this.parsers[i];\n result = parser.regex.exec(input);\n if (result) {\n rgba = parser.parse(result);\n }\n }\n }\n }\n this.rgba = rgba || [];\n },\n\n /**\n * Return the color a specified format\n * @param {String} format\n */\n get: function(format) {\n var input = this.input,\n rgba = this.rgba,\n ret;\n\n if (this.stops) {\n ret = merge(input);\n ret.stops = [].concat(ret.stops);\n each(this.stops, function(stop, i) {\n ret.stops[i] = [ret.stops[i][0], stop.get(format)];\n });\n\n // it's NaN if gradient colors on a column chart\n } else if (rgba && isNumber(rgba[0])) {\n if (format === 'rgb' || (!format && rgba[3] === 1)) {\n ret = 'rgb(' + rgba[0] + ',' + rgba[1] + ',' + rgba[2] + ')';\n } else if (format === 'a') {\n ret = rgba[3];\n } else {\n ret = 'rgba(' + rgba.join(',') + ')';\n }\n } else {\n ret = input;\n }\n return ret;\n },\n\n /**\n * Brighten the color\n * @param {Number} alpha\n */\n brighten: function(alpha) {\n var i,\n rgba = this.rgba;\n\n if (this.stops) {\n each(this.stops, function(stop) {\n stop.brighten(alpha);\n });\n\n } else if (isNumber(alpha) && alpha !== 0) {\n for (i = 0; i < 3; i++) {\n rgba[i] += pInt(alpha * 255);\n\n if (rgba[i] < 0) {\n rgba[i] = 0;\n }\n if (rgba[i] > 255) {\n rgba[i] = 255;\n }\n }\n }\n return this;\n },\n\n /**\n * Set the color's opacity to a given alpha value\n * @param {Number} alpha\n */\n setOpacity: function(alpha) {\n this.rgba[3] = alpha;\n return this;\n },\n\n /*\n * Return an intermediate color between two colors.\n *\n * @param {Highcharts.Color} to\n * The color object to tween to.\n * @param {Number} pos\n * The intermediate position, where 0 is the from color (current\n * color item), and 1 is the `to` color.\n *\n * @return {String}\n * The intermediate color in rgba notation.\n */\n tweenTo: function(to, pos) {\n // Check for has alpha, because rgba colors perform worse due to lack of\n // support in WebKit.\n var from = this,\n hasAlpha,\n ret;\n\n // Unsupported color, return to-color (#3920)\n if (!to.rgba.length) {\n ret = to.input || 'none';\n\n // Interpolate\n } else {\n from = from.rgba;\n to = to.rgba;\n hasAlpha = (to[3] !== 1 || from[3] !== 1);\n ret = (hasAlpha ? 'rgba(' : 'rgb(') +\n Math.round(to[0] + (from[0] - to[0]) * (1 - pos)) + ',' +\n Math.round(to[1] + (from[1] - to[1]) * (1 - pos)) + ',' +\n Math.round(to[2] + (from[2] - to[2]) * (1 - pos)) +\n (hasAlpha ?\n (',' + (to[3] + (from[3] - to[3]) * (1 - pos))) :\n '') + ')';\n }\n return ret;\n }\n };\n H.color = function(input) {\n return new H.Color(input);\n };\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var SVGElement,\n SVGRenderer,\n\n addEvent = H.addEvent,\n animate = H.animate,\n attr = H.attr,\n charts = H.charts,\n color = H.color,\n css = H.css,\n createElement = H.createElement,\n defined = H.defined,\n deg2rad = H.deg2rad,\n destroyObjectProperties = H.destroyObjectProperties,\n doc = H.doc,\n each = H.each,\n extend = H.extend,\n erase = H.erase,\n grep = H.grep,\n hasTouch = H.hasTouch,\n inArray = H.inArray,\n isArray = H.isArray,\n isFirefox = H.isFirefox,\n isMS = H.isMS,\n isObject = H.isObject,\n isString = H.isString,\n isWebKit = H.isWebKit,\n merge = H.merge,\n noop = H.noop,\n objectEach = H.objectEach,\n pick = H.pick,\n pInt = H.pInt,\n removeEvent = H.removeEvent,\n splat = H.splat,\n stop = H.stop,\n svg = H.svg,\n SVG_NS = H.SVG_NS,\n symbolSizes = H.symbolSizes,\n win = H.win;\n\n /**\n * @typedef {Object} SVGDOMElement - An SVG DOM element.\n */\n /**\n * The SVGElement prototype is a JavaScript wrapper for SVG elements used in the\n * rendering layer of Highcharts. Combined with the {@link\n * Highcharts.SVGRenderer} object, these prototypes allow freeform annotation\n * in the charts or even in HTML pages without instanciating a chart. The\n * SVGElement can also wrap HTML labels, when `text` or `label` elements are\n * created with the `useHTML` parameter.\n *\n * The SVGElement instances are created through factory functions on the \n * {@link Highcharts.SVGRenderer} object, like\n * [rect]{@link Highcharts.SVGRenderer#rect}, [path]{@link\n * Highcharts.SVGRenderer#path}, [text]{@link Highcharts.SVGRenderer#text},\n * [label]{@link Highcharts.SVGRenderer#label}, [g]{@link\n * Highcharts.SVGRenderer#g} and more.\n *\n * @class Highcharts.SVGElement\n */\n SVGElement = H.SVGElement = function() {\n return this;\n };\n extend(SVGElement.prototype, /** @lends Highcharts.SVGElement.prototype */ {\n\n // Default base for animation\n opacity: 1,\n SVG_NS: SVG_NS,\n\n /**\n * For labels, these CSS properties are applied to the `text` node directly.\n * @type {Array.}\n */\n textProps: ['direction', 'fontSize', 'fontWeight', 'fontFamily',\n 'fontStyle', 'color', 'lineHeight', 'width', 'textAlign',\n 'textDecoration', 'textOverflow', 'textOutline'\n ],\n\n /**\n * Initialize the SVG renderer. This function only exists to make the\n * initiation process overridable. It should not be called directly.\n *\n * @param {HighchartsSVGRenderer} renderer\n * The SVGRenderer instance to initialize to.\n * @param {String} nodeName\n * The SVG node name.\n * @returns {void}\n */\n init: function(renderer, nodeName) {\n\n /** \n * The DOM node. Each SVGRenderer instance wraps a main DOM node, but \n * may also represent more nodes.\n * @type {SVGDOMNode|HTMLDOMNode}\n */\n this.element = nodeName === 'span' ?\n createElement(nodeName) :\n doc.createElementNS(this.SVG_NS, nodeName);\n\n /**\n * The renderer that the SVGElement belongs to.\n * @type {Highcharts.SVGRenderer}\n */\n this.renderer = renderer;\n },\n\n /**\n * Animate to given attributes or CSS properties.\n * \n * @param {SVGAttributes} params SVG attributes or CSS to animate.\n * @param {AnimationOptions} [options] Animation options.\n * @param {Function} [complete] Function to perform at the end of animation.\n *\n * @sample highcharts/members/element-on/\n * Setting some attributes by animation\n * \n * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n */\n animate: function(params, options, complete) {\n var animOptions = H.animObject(\n pick(options, this.renderer.globalAnimation, true)\n );\n if (animOptions.duration !== 0) {\n if (complete) { // allows using a callback with the global animation without overwriting it\n animOptions.complete = complete;\n }\n animate(this, params, animOptions);\n } else {\n this.attr(params, null, complete);\n if (animOptions.step) {\n animOptions.step.call(this);\n }\n }\n return this;\n },\n\n /**\n * @typedef {Object} GradientOptions\n * @property {Object} linearGradient Holds an object that defines the start\n * position and the end position relative to the shape.\n * @property {Number} linearGradient.x1 Start horizontal position of the\n * gradient. Ranges 0-1.\n * @property {Number} linearGradient.x2 End horizontal position of the\n * gradient. Ranges 0-1.\n * @property {Number} linearGradient.y1 Start vertical position of the\n * gradient. Ranges 0-1.\n * @property {Number} linearGradient.y2 End vertical position of the\n * gradient. Ranges 0-1.\n * @property {Object} radialGradient Holds an object that defines the center\n * position and the radius.\n * @property {Number} radialGradient.cx Center horizontal position relative\n * to the shape. Ranges 0-1.\n * @property {Number} radialGradient.cy Center vertical position relative\n * to the shape. Ranges 0-1.\n * @property {Number} radialGradient.r Radius relative to the shape. Ranges\n * 0-1.\n * @property {Array.} stops The first item in each tuple is the\n * position in the gradient, where 0 is the start of the gradient and 1\n * is the end of the gradient. Multiple stops can be applied. The second\n * item is the color for each stop. This color can also be given in the\n * rgba format.\n *\n * @example\n * // Linear gradient used as a color option\n * color: {\n * linearGradient: { x1: 0, x2: 0, y1: 0, y2: 1 },\n * stops: [\n * [0, '#003399'], // start\n * [0.5, '#ffffff'], // middle\n * [1, '#3366AA'] // end\n * ]\n * }\n * }\n */\n /**\n * Build and apply an SVG gradient out of a common JavaScript configuration\n * object. This function is called from the attribute setters.\n *\n * @private\n * @param {GradientOptions} color The gradient options structure.\n * @param {string} prop The property to apply, can either be `fill` or\n * `stroke`. \n * @param {SVGDOMElement} elem SVG DOM element to apply the gradient on.\n */\n colorGradient: function(color, prop, elem) {\n var renderer = this.renderer,\n colorObject,\n gradName,\n gradAttr,\n radAttr,\n gradients,\n gradientObject,\n stops,\n stopColor,\n stopOpacity,\n radialReference,\n id,\n key = [],\n value;\n\n // Apply linear or radial gradients\n if (color.radialGradient) {\n gradName = 'radialGradient';\n } else if (color.linearGradient) {\n gradName = 'linearGradient';\n }\n\n if (gradName) {\n gradAttr = color[gradName];\n gradients = renderer.gradients;\n stops = color.stops;\n radialReference = elem.radialReference;\n\n // Keep < 2.2 kompatibility\n if (isArray(gradAttr)) {\n color[gradName] = gradAttr = {\n x1: gradAttr[0],\n y1: gradAttr[1],\n x2: gradAttr[2],\n y2: gradAttr[3],\n gradientUnits: 'userSpaceOnUse'\n };\n }\n\n // Correct the radial gradient for the radial reference system\n if (\n gradName === 'radialGradient' &&\n radialReference &&\n !defined(gradAttr.gradientUnits)\n ) {\n radAttr = gradAttr; // Save the radial attributes for updating\n gradAttr = merge(\n gradAttr,\n renderer.getRadialAttr(radialReference, radAttr), {\n gradientUnits: 'userSpaceOnUse'\n }\n );\n }\n\n // Build the unique key to detect whether we need to create a new element (#1282)\n objectEach(gradAttr, function(val, n) {\n if (n !== 'id') {\n key.push(n, val);\n }\n });\n objectEach(stops, function(val) {\n key.push(val);\n });\n key = key.join(',');\n\n // Check if a gradient object with the same config object is created within this renderer\n if (gradients[key]) {\n id = gradients[key].attr('id');\n\n } else {\n\n // Set the id and create the element\n gradAttr.id = id = H.uniqueKey();\n gradients[key] = gradientObject = renderer.createElement(gradName)\n .attr(gradAttr)\n .add(renderer.defs);\n\n gradientObject.radAttr = radAttr;\n\n // The gradient needs to keep a list of stops to be able to destroy them\n gradientObject.stops = [];\n each(stops, function(stop) {\n var stopObject;\n if (stop[1].indexOf('rgba') === 0) {\n colorObject = H.color(stop[1]);\n stopColor = colorObject.get('rgb');\n stopOpacity = colorObject.get('a');\n } else {\n stopColor = stop[1];\n stopOpacity = 1;\n }\n stopObject = renderer.createElement('stop').attr({\n offset: stop[0],\n 'stop-color': stopColor,\n 'stop-opacity': stopOpacity\n }).add(gradientObject);\n\n // Add the stop element to the gradient\n gradientObject.stops.push(stopObject);\n });\n }\n\n // Set the reference to the gradient object\n value = 'url(' + renderer.url + '#' + id + ')';\n elem.setAttribute(prop, value);\n elem.gradient = key;\n\n // Allow the color to be concatenated into tooltips formatters etc. (#2995)\n color.toString = function() {\n return value;\n };\n }\n },\n\n /**\n * Apply a text outline through a custom CSS property, by copying the text\n * element and apply stroke to the copy. Used internally. Contrast checks\n * at http://jsfiddle.net/highcharts/43soe9m1/2/ .\n *\n * @private\n * @param {String} textOutline A custom CSS `text-outline` setting, defined\n * by `width color`. \n * @example\n * // Specific color\n * text.css({\n * textOutline: '1px black'\n * });\n * // Automatic contrast\n * text.css({\n * color: '#000000', // black text\n * textOutline: '1px contrast' // => white outline\n * });\n */\n applyTextOutline: function(textOutline) {\n var elem = this.element,\n tspans,\n tspan,\n hasContrast = textOutline.indexOf('contrast') !== -1,\n styles = {},\n color,\n strokeWidth,\n firstRealChild,\n i;\n\n // When the text shadow is set to contrast, use dark stroke for light\n // text and vice versa.\n if (hasContrast) {\n styles.textOutline = textOutline = textOutline.replace(\n /contrast/g,\n this.renderer.getContrast(elem.style.fill)\n );\n }\n\n // Extract the stroke width and color\n textOutline = textOutline.split(' ');\n color = textOutline[textOutline.length - 1];\n strokeWidth = textOutline[0];\n\n if (strokeWidth && strokeWidth !== 'none' && H.svg) {\n\n this.fakeTS = true; // Fake text shadow\n\n tspans = [].slice.call(elem.getElementsByTagName('tspan'));\n\n // In order to get the right y position of the clone,\n // copy over the y setter\n this.ySetter = this.xSetter;\n\n // Since the stroke is applied on center of the actual outline, we\n // need to double it to get the correct stroke-width outside the \n // glyphs.\n strokeWidth = strokeWidth.replace(\n /(^[\\d\\.]+)(.*?)$/g,\n function(match, digit, unit) {\n return (2 * digit) + unit;\n }\n );\n\n // Remove shadows from previous runs. Iterate from the end to\n // support removing items inside the cycle (#6472).\n i = tspans.length;\n while (i--) {\n tspan = tspans[i];\n if (tspan.getAttribute('class') === 'highcharts-text-outline') {\n // Remove then erase\n erase(tspans, elem.removeChild(tspan));\n }\n }\n\n // For each of the tspans, create a stroked copy behind it.\n firstRealChild = elem.firstChild;\n each(tspans, function(tspan, y) {\n var clone;\n\n // Let the first line start at the correct X position\n if (y === 0) {\n tspan.setAttribute('x', elem.getAttribute('x'));\n y = elem.getAttribute('y');\n tspan.setAttribute('y', y || 0);\n if (y === null) {\n elem.setAttribute('y', 0);\n }\n }\n\n // Create the clone and apply outline properties\n clone = tspan.cloneNode(1);\n attr(clone, {\n 'class': 'highcharts-text-outline',\n 'fill': color,\n 'stroke': color,\n 'stroke-width': strokeWidth,\n 'stroke-linejoin': 'round'\n });\n elem.insertBefore(clone, firstRealChild);\n });\n }\n },\n\n /**\n *\n * @typedef {Object} SVGAttributes An object of key-value pairs for SVG\n * attributes. Attributes in Highcharts elements for the most parts\n * correspond to SVG, but some are specific to Highcharts, like `zIndex`,\n * `rotation`, `translateX`, `translateY`, `scaleX` and `scaleY`. SVG\n * attributes containing a hyphen are _not_ camel-cased, they should be\n * quoted to preserve the hyphen.\n * @example\n * {\n * 'stroke': '#ff0000', // basic\n * 'stroke-width': 2, // hyphenated\n * 'rotation': 45 // custom\n * 'd': ['M', 10, 10, 'L', 30, 30, 'z'] // path definition, note format\n * }\n */\n /**\n * Apply native and custom attributes to the SVG elements.\n * \n * In order to set the rotation center for rotation, set x and y to 0 and\n * use `translateX` and `translateY` attributes to position the element\n * instead.\n *\n * Attributes frequently used in Highcharts are `fill`, `stroke`,\n * `stroke-width`.\n *\n * @param {SVGAttributes|String} hash - The native and custom SVG\n * attributes. \n * @param {string} [val] - If the type of the first argument is `string`, \n * the second can be a value, which will serve as a single attribute\n * setter. If the first argument is a string and the second is undefined,\n * the function serves as a getter and the current value of the property\n * is returned.\n * @param {Function} [complete] - A callback function to execute after setting\n * the attributes. This makes the function compliant and interchangeable\n * with the {@link SVGElement#animate} function.\n * @param {boolean} [continueAnimation=true] Used internally when `.attr` is\n * called as part of an animation step. Otherwise, calling `.attr` for an\n * attribute will stop animation for that attribute.\n * \n * @returns {SVGElement|string|number} If used as a setter, it returns the \n * current {@link SVGElement} so the calls can be chained. If used as a \n * getter, the current value of the attribute is returned.\n *\n * @sample highcharts/members/renderer-rect/\n * Setting some attributes\n * \n * @example\n * // Set multiple attributes\n * element.attr({\n * stroke: 'red',\n * fill: 'blue',\n * x: 10,\n * y: 10\n * });\n *\n * // Set a single attribute\n * element.attr('stroke', 'red');\n *\n * // Get an attribute\n * element.attr('stroke'); // => 'red'\n * \n */\n attr: function(hash, val, complete, continueAnimation) {\n var key,\n element = this.element,\n hasSetSymbolSize,\n ret = this,\n skipAttr,\n setter;\n\n // single key-value pair\n if (typeof hash === 'string' && val !== undefined) {\n key = hash;\n hash = {};\n hash[key] = val;\n }\n\n // used as a getter: first argument is a string, second is undefined\n if (typeof hash === 'string') {\n ret = (this[hash + 'Getter'] || this._defaultGetter).call(this, hash, element);\n\n // setter\n } else {\n\n objectEach(hash, function(val, key) {\n skipAttr = false;\n\n // Unless .attr is from the animator update, stop current\n // running animation of this property\n if (!continueAnimation) {\n stop(this, key);\n }\n\n // Special handling of symbol attributes\n if (\n this.symbolName &&\n /^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)$/\n .test(key)\n ) {\n if (!hasSetSymbolSize) {\n this.symbolAttr(hash);\n hasSetSymbolSize = true;\n }\n skipAttr = true;\n }\n\n if (this.rotation && (key === 'x' || key === 'y')) {\n this.doTransform = true;\n }\n\n if (!skipAttr) {\n setter = this[key + 'Setter'] || this._defaultSetter;\n setter.call(this, val, key, element);\n\n\n // Let the shadow follow the main element\n if (this.shadows && /^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(key)) {\n this.updateShadows(key, val, setter);\n }\n\n }\n }, this);\n\n this.afterSetters();\n }\n\n // In accordance with animate, run a complete callback\n if (complete) {\n complete();\n }\n\n return ret;\n },\n\n /**\n * This method is executed in the end of {attr}, after setting all attributes in the hash.\n * In can be used to efficiently consolidate multiple attributes in one SVG property -- e.g.,\n * translate, rotate and scale are merged in one \"transform\" attribute in the SVG node.\n */\n afterSetters: function() {\n // Update transform. Do this outside the loop to prevent redundant updating for batch setting\n // of attributes.\n if (this.doTransform) {\n this.updateTransform();\n this.doTransform = false;\n }\n },\n\n\n /**\n * Update the shadow elements with new attributes.\n *\n * @private\n * @param {String} key - The attribute name.\n * @param {String|Number} value - The value of the attribute.\n * @param {Function} setter - The setter function, inherited from the\n * parent wrapper\n * @returns {void}\n */\n updateShadows: function(key, value, setter) {\n var shadows = this.shadows,\n i = shadows.length;\n\n while (i--) {\n setter.call(\n shadows[i],\n key === 'height' ?\n Math.max(value - (shadows[i].cutHeight || 0), 0) :\n key === 'd' ? this.d : value,\n key,\n shadows[i]\n );\n }\n },\n\n\n /**\n * Add a class name to an element.\n *\n * @param {string} className - The new class name to add.\n * @param {boolean} [replace=false] - When true, the existing class name(s)\n * will be overwritten with the new one. When false, the new one is\n * added.\n * @returns {Highcharts.SVGElement} Return the SVG element for chainability.\n */\n addClass: function(className, replace) {\n var currentClassName = this.attr('class') || '';\n\n if (currentClassName.indexOf(className) === -1) {\n if (!replace) {\n className =\n (currentClassName + (currentClassName ? ' ' : '') +\n className).replace(' ', ' ');\n }\n this.attr('class', className);\n }\n return this;\n },\n\n /**\n * Check if an element has the given class name.\n * @param {string} className - The class name to check for.\n * @return {Boolean}\n */\n hasClass: function(className) {\n return attr(this.element, 'class').indexOf(className) !== -1;\n },\n\n /**\n * Remove a class name from the element.\n * @param {string} className The class name to remove.\n * @return {Highcharts.SVGElement} Returns the SVG element for chainability.\n */\n removeClass: function(className) {\n attr(this.element, 'class', (attr(this.element, 'class') || '').replace(className, ''));\n return this;\n },\n\n /**\n * If one of the symbol size affecting parameters are changed,\n * check all the others only once for each call to an element's\n * .attr() method\n * @param {Object} hash - The attributes to set.\n * @private\n */\n symbolAttr: function(hash) {\n var wrapper = this;\n\n each(['x', 'y', 'r', 'start', 'end', 'width', 'height', 'innerR', 'anchorX', 'anchorY'], function(key) {\n wrapper[key] = pick(hash[key], wrapper[key]);\n });\n\n wrapper.attr({\n d: wrapper.renderer.symbols[wrapper.symbolName](\n wrapper.x,\n wrapper.y,\n wrapper.width,\n wrapper.height,\n wrapper\n )\n });\n },\n\n /**\n * Apply a clipping rectangle to this element.\n * \n * @param {ClipRect} [clipRect] - The clipping rectangle. If skipped, the\n * current clip is removed.\n * @returns {Highcharts.SVGElement} Returns the SVG element to allow chaining.\n */\n clip: function(clipRect) {\n return this.attr(\n 'clip-path',\n clipRect ?\n 'url(' + this.renderer.url + '#' + clipRect.id + ')' :\n 'none'\n );\n },\n\n /**\n * Calculate the coordinates needed for drawing a rectangle crisply and\n * return the calculated attributes.\n * \n * @param {Object} rect - A rectangle.\n * @param {number} rect.x - The x position.\n * @param {number} rect.y - The y position.\n * @param {number} rect.width - The width.\n * @param {number} rect.height - The height.\n * @param {number} [strokeWidth] - The stroke width to consider when\n * computing crisp positioning. It can also be set directly on the rect\n * parameter.\n *\n * @returns {{x: Number, y: Number, width: Number, height: Number}} The\n * modified rectangle arguments.\n */\n crisp: function(rect, strokeWidth) {\n\n var wrapper = this,\n attribs = {},\n normalizer;\n\n strokeWidth = strokeWidth || rect.strokeWidth || 0;\n normalizer = Math.round(strokeWidth) % 2 / 2; // Math.round because strokeWidth can sometimes have roundoff errors\n\n // normalize for crisp edges\n rect.x = Math.floor(rect.x || wrapper.x || 0) + normalizer;\n rect.y = Math.floor(rect.y || wrapper.y || 0) + normalizer;\n rect.width = Math.floor((rect.width || wrapper.width || 0) - 2 * normalizer);\n rect.height = Math.floor((rect.height || wrapper.height || 0) - 2 * normalizer);\n if (defined(rect.strokeWidth)) {\n rect.strokeWidth = strokeWidth;\n }\n\n objectEach(rect, function(val, key) {\n if (wrapper[key] !== val) { // only set attribute if changed\n wrapper[key] = attribs[key] = val;\n }\n });\n\n return attribs;\n },\n\n /**\n * Set styles for the element. In addition to CSS styles supported by \n * native SVG and HTML elements, there are also some custom made for \n * Highcharts, like `width`, `ellipsis` and `textOverflow` for SVG text\n * elements.\n * @param {CSSObject} styles The new CSS styles.\n * @returns {Highcharts.SVGElement} Return the SVG element for chaining.\n *\n * @sample highcharts/members/renderer-text-on-chart/\n * Styled text\n */\n css: function(styles) {\n var oldStyles = this.styles,\n newStyles = {},\n elem = this.element,\n textWidth,\n serializedCss = '',\n hyphenate,\n hasNew = !oldStyles,\n // These CSS properties are interpreted internally by the SVG\n // renderer, but are not supported by SVG and should not be added to\n // the DOM. In styled mode, no CSS should find its way to the DOM\n // whatsoever (#6173, #6474).\n svgPseudoProps = ['textOutline', 'textOverflow', 'width'];\n\n // convert legacy\n if (styles && styles.color) {\n styles.fill = styles.color;\n }\n\n // Filter out existing styles to increase performance (#2640)\n if (oldStyles) {\n objectEach(styles, function(style, n) {\n if (style !== oldStyles[n]) {\n newStyles[n] = style;\n hasNew = true;\n }\n });\n }\n if (hasNew) {\n\n // Merge the new styles with the old ones\n if (oldStyles) {\n styles = extend(\n oldStyles,\n newStyles\n );\n }\n\n // Get the text width from style\n textWidth = this.textWidth = (\n styles &&\n styles.width &&\n styles.width !== 'auto' &&\n elem.nodeName.toLowerCase() === 'text' &&\n pInt(styles.width)\n );\n\n // store object\n this.styles = styles;\n\n if (textWidth && (!svg && this.renderer.forExport)) {\n delete styles.width;\n }\n\n // serialize and set style attribute\n if (isMS && !svg) {\n css(this.element, styles);\n } else {\n hyphenate = function(a, b) {\n return '-' + b.toLowerCase();\n };\n objectEach(styles, function(style, n) {\n if (inArray(n, svgPseudoProps) === -1) {\n serializedCss +=\n n.replace(/([A-Z])/g, hyphenate) + ':' +\n style + ';';\n }\n });\n if (serializedCss) {\n attr(elem, 'style', serializedCss); // #1881\n }\n }\n\n\n if (this.added) {\n\n // Rebuild text after added. Cache mechanisms in the buildText\n // will prevent building if there are no significant changes.\n if (this.element.nodeName === 'text') {\n this.renderer.buildText(this);\n }\n\n // Apply text outline after added\n if (styles && styles.textOutline) {\n this.applyTextOutline(styles.textOutline);\n }\n }\n }\n\n return this;\n },\n\n\n /**\n * Get the current stroke width. In classic mode, the setter registers it \n * directly on the element.\n * @returns {number} The stroke width in pixels.\n * @ignore\n */\n strokeWidth: function() {\n return this['stroke-width'] || 0;\n },\n\n\n /**\n * Add an event listener. This is a simple setter that replaces all other\n * events of the same type, opposed to the {@link Highcharts#addEvent}\n * function.\n * @param {string} eventType - The event type. If the type is `click`, \n * Highcharts will internally translate it to a `touchstart` event on \n * touch devices, to prevent the browser from waiting for a click event\n * from firing.\n * @param {Function} handler - The handler callback.\n * @returns {Highcharts.SVGElement} The SVGElement for chaining.\n *\n * @sample highcharts/members/element-on/\n * A clickable rectangle\n */\n on: function(eventType, handler) {\n var svgElement = this,\n element = svgElement.element;\n\n // touch\n if (hasTouch && eventType === 'click') {\n element.ontouchstart = function(e) {\n svgElement.touchEventFired = Date.now(); // #2269\n e.preventDefault();\n handler.call(element, e);\n };\n element.onclick = function(e) {\n if (win.navigator.userAgent.indexOf('Android') === -1 ||\n Date.now() - (svgElement.touchEventFired || 0) > 1100) {\n handler.call(element, e);\n }\n };\n } else {\n // simplest possible event model for internal use\n element['on' + eventType] = handler;\n }\n return this;\n },\n\n /**\n * Set the coordinates needed to draw a consistent radial gradient across\n * a shape regardless of positioning inside the chart. Used on pie slices\n * to make all the slices have the same radial reference point.\n *\n * @param {Array} coordinates The center reference. The format is\n * `[centerX, centerY, diameter]` in pixels.\n * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n */\n setRadialReference: function(coordinates) {\n var existingGradient = this.renderer.gradients[this.element.gradient];\n\n this.element.radialReference = coordinates;\n\n // On redrawing objects with an existing gradient, the gradient needs\n // to be repositioned (#3801)\n if (existingGradient && existingGradient.radAttr) {\n existingGradient.animate(\n this.renderer.getRadialAttr(\n coordinates,\n existingGradient.radAttr\n )\n );\n }\n\n return this;\n },\n\n /**\n * Move an object and its children by x and y values.\n * \n * @param {number} x - The x value.\n * @param {number} y - The y value.\n */\n translate: function(x, y) {\n return this.attr({\n translateX: x,\n translateY: y\n });\n },\n\n /**\n * Invert a group, rotate and flip. This is used internally on inverted \n * charts, where the points and graphs are drawn as if not inverted, then\n * the series group elements are inverted.\n *\n * @param {boolean} inverted - Whether to invert or not. An inverted shape\n * can be un-inverted by setting it to false.\n * @returns {Highcharts.SVGElement} Return the SVGElement for chaining.\n */\n invert: function(inverted) {\n var wrapper = this;\n wrapper.inverted = inverted;\n wrapper.updateTransform();\n return wrapper;\n },\n\n /**\n * Update the transform attribute based on internal properties. Deals with\n * the custom `translateX`, `translateY`, `rotation`, `scaleX` and `scaleY`\n * attributes and updates the SVG `transform` attribute.\n * @private\n * @returns {void}\n */\n updateTransform: function() {\n var wrapper = this,\n translateX = wrapper.translateX || 0,\n translateY = wrapper.translateY || 0,\n scaleX = wrapper.scaleX,\n scaleY = wrapper.scaleY,\n inverted = wrapper.inverted,\n rotation = wrapper.rotation,\n element = wrapper.element,\n transform;\n\n // flipping affects translate as adjustment for flipping around the group's axis\n if (inverted) {\n translateX += wrapper.width;\n translateY += wrapper.height;\n }\n\n // Apply translate. Nearly all transformed elements have translation, so instead\n // of checking for translate = 0, do it always (#1767, #1846).\n transform = ['translate(' + translateX + ',' + translateY + ')'];\n\n // apply rotation\n if (inverted) {\n transform.push('rotate(90) scale(-1,1)');\n } else if (rotation) { // text rotation\n transform.push('rotate(' + rotation + ' ' + (element.getAttribute('x') || 0) + ' ' + (element.getAttribute('y') || 0) + ')');\n\n // Delete bBox memo when the rotation changes\n //delete wrapper.bBox;\n }\n\n // apply scale\n if (defined(scaleX) || defined(scaleY)) {\n transform.push('scale(' + pick(scaleX, 1) + ' ' + pick(scaleY, 1) + ')');\n }\n\n if (transform.length) {\n element.setAttribute('transform', transform.join(' '));\n }\n },\n\n /**\n * Bring the element to the front. Alternatively, a new zIndex can be set.\n *\n * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n *\n * @sample highcharts/members/element-tofront/\n * Click an element to bring it to front\n */\n toFront: function() {\n var element = this.element;\n element.parentNode.appendChild(element);\n return this;\n },\n\n\n /**\n * Align the element relative to the chart or another box.\n * \n * @param {Object} [alignOptions] The alignment options. The function can be\n * called without this parameter in order to re-align an element after the\n * box has been updated.\n * @param {string} [alignOptions.align=left] Horizontal alignment. Can be\n * one of `left`, `center` and `right`.\n * @param {string} [alignOptions.verticalAlign=top] Vertical alignment. Can\n * be one of `top`, `middle` and `bottom`.\n * @param {number} [alignOptions.x=0] Horizontal pixel offset from\n * alignment.\n * @param {number} [alignOptions.y=0] Vertical pixel offset from alignment.\n * @param {Boolean} [alignByTranslate=false] Use the `transform` attribute\n * with translateX and translateY custom attributes to align this elements\n * rather than `x` and `y` attributes.\n * @param {String|Object} box The box to align to, needs a width and height.\n * When the box is a string, it refers to an object in the Renderer. For\n * example, when box is `spacingBox`, it refers to `Renderer.spacingBox`\n * which holds `width`, `height`, `x` and `y` properties.\n * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n */\n align: function(alignOptions, alignByTranslate, box) {\n var align,\n vAlign,\n x,\n y,\n attribs = {},\n alignTo,\n renderer = this.renderer,\n alignedObjects = renderer.alignedObjects,\n alignFactor,\n vAlignFactor;\n\n // First call on instanciate\n if (alignOptions) {\n this.alignOptions = alignOptions;\n this.alignByTranslate = alignByTranslate;\n if (!box || isString(box)) { // boxes other than renderer handle this internally\n this.alignTo = alignTo = box || 'renderer';\n erase(alignedObjects, this); // prevent duplicates, like legendGroup after resize\n alignedObjects.push(this);\n box = null; // reassign it below\n }\n\n // When called on resize, no arguments are supplied\n } else {\n alignOptions = this.alignOptions;\n alignByTranslate = this.alignByTranslate;\n alignTo = this.alignTo;\n }\n\n box = pick(box, renderer[alignTo], renderer);\n\n // Assign variables\n align = alignOptions.align;\n vAlign = alignOptions.verticalAlign;\n x = (box.x || 0) + (alignOptions.x || 0); // default: left align\n y = (box.y || 0) + (alignOptions.y || 0); // default: top align\n\n // Align\n if (align === 'right') {\n alignFactor = 1;\n } else if (align === 'center') {\n alignFactor = 2;\n }\n if (alignFactor) {\n x += (box.width - (alignOptions.width || 0)) / alignFactor;\n }\n attribs[alignByTranslate ? 'translateX' : 'x'] = Math.round(x);\n\n\n // Vertical align\n if (vAlign === 'bottom') {\n vAlignFactor = 1;\n } else if (vAlign === 'middle') {\n vAlignFactor = 2;\n }\n if (vAlignFactor) {\n y += (box.height - (alignOptions.height || 0)) / vAlignFactor;\n }\n attribs[alignByTranslate ? 'translateY' : 'y'] = Math.round(y);\n\n // Animate only if already placed\n this[this.placed ? 'animate' : 'attr'](attribs);\n this.placed = true;\n this.alignAttr = attribs;\n\n return this;\n },\n\n /**\n * Get the bounding box (width, height, x and y) for the element. Generally\n * used to get rendered text size. Since this is called a lot in charts,\n * the results are cached based on text properties, in order to save DOM\n * traffic. The returned bounding box includes the rotation, so for example\n * a single text line of rotation 90 will report a greater height, and a\n * width corresponding to the line-height.\n *\n * @param {boolean} [reload] Skip the cache and get the updated DOM bouding\n * box.\n * @param {number} [rot] Override the element's rotation. This is internally\n * used on axis labels with a value of 0 to find out what the bounding box\n * would be have been if it were not rotated.\n * @returns {Object} The bounding box with `x`, `y`, `width` and `height`\n * properties.\n *\n * @sample highcharts/members/renderer-on-chart/\n * Draw a rectangle based on a text's bounding box\n */\n getBBox: function(reload, rot) {\n var wrapper = this,\n bBox, // = wrapper.bBox,\n renderer = wrapper.renderer,\n width,\n height,\n rotation,\n rad,\n element = wrapper.element,\n styles = wrapper.styles,\n fontSize,\n textStr = wrapper.textStr,\n toggleTextShadowShim,\n cache = renderer.cache,\n cacheKeys = renderer.cacheKeys,\n cacheKey;\n\n rotation = pick(rot, wrapper.rotation);\n rad = rotation * deg2rad;\n\n\n fontSize = styles && styles.fontSize;\n\n\n if (textStr !== undefined) {\n\n cacheKey = textStr.toString();\n\n // Since numbers are monospaced, and numerical labels appear a lot\n // in a chart, we assume that a label of n characters has the same\n // bounding box as others of the same length. Unless there is inner\n // HTML in the label. In that case, leave the numbers as is (#5899).\n if (cacheKey.indexOf('<') === -1) {\n cacheKey = cacheKey.replace(/[0-9]/g, '0');\n }\n\n // Properties that affect bounding box\n cacheKey += [\n '',\n rotation || 0,\n fontSize,\n styles && styles.width,\n styles && styles.textOverflow // #5968\n ]\n .join(',');\n\n }\n\n if (cacheKey && !reload) {\n bBox = cache[cacheKey];\n }\n\n // No cache found\n if (!bBox) {\n\n // SVG elements\n if (element.namespaceURI === wrapper.SVG_NS || renderer.forExport) {\n try { // Fails in Firefox if the container has display: none.\n\n // When the text shadow shim is used, we need to hide the fake shadows\n // to get the correct bounding box (#3872)\n toggleTextShadowShim = this.fakeTS && function(display) {\n each(element.querySelectorAll('.highcharts-text-outline'), function(tspan) {\n tspan.style.display = display;\n });\n };\n\n // Workaround for #3842, Firefox reporting wrong bounding box for shadows\n if (toggleTextShadowShim) {\n toggleTextShadowShim('none');\n }\n\n bBox = element.getBBox ?\n // SVG: use extend because IE9 is not allowed to change width and height in case\n // of rotation (below)\n extend({}, element.getBBox()) : {\n\n // Legacy IE in export mode\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n\n // #3842\n if (toggleTextShadowShim) {\n toggleTextShadowShim('');\n }\n } catch (e) {}\n\n // If the bBox is not set, the try-catch block above failed. The other condition\n // is for Opera that returns a width of -Infinity on hidden elements.\n if (!bBox || bBox.width < 0) {\n bBox = {\n width: 0,\n height: 0\n };\n }\n\n\n // VML Renderer or useHTML within SVG\n } else {\n\n bBox = wrapper.htmlGetBBox();\n\n }\n\n // True SVG elements as well as HTML elements in modern browsers using the .useHTML option\n // need to compensated for rotation\n if (renderer.isSVG) {\n width = bBox.width;\n height = bBox.height;\n\n // Workaround for wrong bounding box in IE, Edge and Chrome on\n // Windows. With Highcharts' default font, IE and Edge report\n // a box height of 16.899 and Chrome rounds it to 17. If this \n // stands uncorrected, it results in more padding added below\n // the text than above when adding a label border or background.\n // Also vertical positioning is affected.\n // http://jsfiddle.net/highcharts/em37nvuj/\n // (#1101, #1505, #1669, #2568, #6213).\n if (\n styles &&\n styles.fontSize === '11px' &&\n Math.round(height) === 17\n ) {\n bBox.height = height = 14;\n }\n\n // Adjust for rotated text\n if (rotation) {\n bBox.width = Math.abs(height * Math.sin(rad)) + Math.abs(width * Math.cos(rad));\n bBox.height = Math.abs(height * Math.cos(rad)) + Math.abs(width * Math.sin(rad));\n }\n }\n\n // Cache it. When loading a chart in a hidden iframe in Firefox and IE/Edge, the\n // bounding box height is 0, so don't cache it (#5620).\n if (cacheKey && bBox.height > 0) {\n\n // Rotate (#4681)\n while (cacheKeys.length > 250) {\n delete cache[cacheKeys.shift()];\n }\n\n if (!cache[cacheKey]) {\n cacheKeys.push(cacheKey);\n }\n cache[cacheKey] = bBox;\n }\n }\n return bBox;\n },\n\n /**\n * Show the element after it has been hidden. \n *\n * @param {boolean} [inherit=false] Set the visibility attribute to\n * `inherit` rather than `visible`. The difference is that an element with\n * `visibility=\"visible\"` will be visible even if the parent is hidden.\n *\n * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n */\n show: function(inherit) {\n return this.attr({\n visibility: inherit ? 'inherit' : 'visible'\n });\n },\n\n /**\n * Hide the element, equivalent to setting the `visibility` attribute to\n * `hidden`.\n *\n * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n */\n hide: function() {\n return this.attr({\n visibility: 'hidden'\n });\n },\n\n /**\n * Fade out an element by animating its opacity down to 0, and hide it on\n * complete. Used internally for the tooltip.\n * \n * @param {number} [duration=150] The fade duration in milliseconds.\n */\n fadeOut: function(duration) {\n var elemWrapper = this;\n elemWrapper.animate({\n opacity: 0\n }, {\n duration: duration || 150,\n complete: function() {\n elemWrapper.attr({\n y: -9999\n }); // #3088, assuming we're only using this for tooltips\n }\n });\n },\n\n /**\n * Add the element to the DOM. All elements must be added this way.\n * \n * @param {Highcharts.SVGElement|SVGDOMElement} [parent] The parent item to add it to.\n * If undefined, the element is added to the {@link\n * Highcharts.SVGRenderer.box}.\n *\n * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n *\n * @sample highcharts/members/renderer-g - Elements added to a group\n */\n add: function(parent) {\n\n var renderer = this.renderer,\n element = this.element,\n inserted;\n\n if (parent) {\n this.parentGroup = parent;\n }\n\n // mark as inverted\n this.parentInverted = parent && parent.inverted;\n\n // build formatted text\n if (this.textStr !== undefined) {\n renderer.buildText(this);\n }\n\n // Mark as added\n this.added = true;\n\n // If we're adding to renderer root, or other elements in the group\n // have a z index, we need to handle it\n if (!parent || parent.handleZ || this.zIndex) {\n inserted = this.zIndexSetter();\n }\n\n // If zIndex is not handled, append at the end\n if (!inserted) {\n (parent ? parent.element : renderer.box).appendChild(element);\n }\n\n // fire an event for internal hooks\n if (this.onAdd) {\n this.onAdd();\n }\n\n return this;\n },\n\n /**\n * Removes an element from the DOM.\n *\n * @private\n * @param {SVGDOMElement|HTMLDOMElement} element The DOM node to remove.\n */\n safeRemoveChild: function(element) {\n var parentNode = element.parentNode;\n if (parentNode) {\n parentNode.removeChild(element);\n }\n },\n\n /**\n * Destroy the element and element wrapper and clear up the DOM and event\n * hooks.\n *\n * @returns {void}\n */\n destroy: function() {\n var wrapper = this,\n element = wrapper.element || {},\n parentToClean =\n wrapper.renderer.isSVG &&\n element.nodeName === 'SPAN' &&\n wrapper.parentGroup,\n grandParent,\n ownerSVGElement = element.ownerSVGElement,\n i;\n\n // remove events\n element.onclick = element.onmouseout = element.onmouseover =\n element.onmousemove = element.point = null;\n stop(wrapper); // stop running animations\n\n if (wrapper.clipPath && ownerSVGElement) {\n // Look for existing references to this clipPath and remove them\n // before destroying the element (#6196).\n each(\n ownerSVGElement.querySelectorAll('[clip-path]'),\n function(el) {\n // Include the closing paranthesis in the test to rule out\n // id's from 10 and above (#6550)\n if (el.getAttribute('clip-path')\n .indexOf(wrapper.clipPath.element.id + ')') > -1) {\n el.removeAttribute('clip-path');\n }\n }\n );\n wrapper.clipPath = wrapper.clipPath.destroy();\n }\n\n // Destroy stops in case this is a gradient object\n if (wrapper.stops) {\n for (i = 0; i < wrapper.stops.length; i++) {\n wrapper.stops[i] = wrapper.stops[i].destroy();\n }\n wrapper.stops = null;\n }\n\n // remove element\n wrapper.safeRemoveChild(element);\n\n\n wrapper.destroyShadows();\n\n\n // In case of useHTML, clean up empty containers emulating SVG groups (#1960, #2393, #2697).\n while (parentToClean && parentToClean.div && parentToClean.div.childNodes.length === 0) {\n grandParent = parentToClean.parentGroup;\n wrapper.safeRemoveChild(parentToClean.div);\n delete parentToClean.div;\n parentToClean = grandParent;\n }\n\n // remove from alignObjects\n if (wrapper.alignTo) {\n erase(wrapper.renderer.alignedObjects, wrapper);\n }\n\n objectEach(wrapper, function(val, key) {\n delete wrapper[key];\n });\n\n return null;\n },\n\n\n /**\n * @typedef {Object} ShadowOptions\n * @property {string} [color=#000000] The shadow color.\n * @property {number} [offsetX=1] The horizontal offset from the element.\n * @property {number} [offsetY=1] The vertical offset from the element.\n * @property {number} [opacity=0.15] The shadow opacity.\n * @property {number} [width=3] The shadow width or distance from the\n * element.\n */\n /**\n * Add a shadow to the element. Must be called after the element is added to\n * the DOM. In styled mode, this method is not used, instead use `defs` and\n * filters.\n * \n * @param {boolean|ShadowOptions} shadowOptions The shadow options. If\n * `true`, the default options are applied. If `false`, the current\n * shadow will be removed.\n * @param {Highcharts.SVGElement} [group] The SVG group element where the shadows will \n * be applied. The default is to add it to the same parent as the current\n * element. Internally, this is ised for pie slices, where all the\n * shadows are added to an element behind all the slices.\n * @param {boolean} [cutOff] Used internally for column shadows.\n *\n * @returns {Highcharts.SVGElement} Returns the SVGElement for chaining.\n *\n * @example\n * renderer.rect(10, 100, 100, 100)\n * .attr({ fill: 'red' })\n * .shadow(true);\n */\n shadow: function(shadowOptions, group, cutOff) {\n var shadows = [],\n i,\n shadow,\n element = this.element,\n strokeWidth,\n shadowWidth,\n shadowElementOpacity,\n\n // compensate for inverted plot area\n transform;\n\n if (!shadowOptions) {\n this.destroyShadows();\n\n } else if (!this.shadows) {\n shadowWidth = pick(shadowOptions.width, 3);\n shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;\n transform = this.parentInverted ?\n '(-1,-1)' :\n '(' + pick(shadowOptions.offsetX, 1) + ', ' + pick(shadowOptions.offsetY, 1) + ')';\n for (i = 1; i <= shadowWidth; i++) {\n shadow = element.cloneNode(0);\n strokeWidth = (shadowWidth * 2) + 1 - (2 * i);\n attr(shadow, {\n 'isShadow': 'true',\n 'stroke': shadowOptions.color || '#000000',\n 'stroke-opacity': shadowElementOpacity * i,\n 'stroke-width': strokeWidth,\n 'transform': 'translate' + transform,\n 'fill': 'none'\n });\n if (cutOff) {\n attr(shadow, 'height', Math.max(attr(shadow, 'height') - strokeWidth, 0));\n shadow.cutHeight = strokeWidth;\n }\n\n if (group) {\n group.element.appendChild(shadow);\n } else {\n element.parentNode.insertBefore(shadow, element);\n }\n\n shadows.push(shadow);\n }\n\n this.shadows = shadows;\n }\n return this;\n\n },\n\n /**\n * Destroy shadows on the element.\n * @private\n */\n destroyShadows: function() {\n each(this.shadows || [], function(shadow) {\n this.safeRemoveChild(shadow);\n }, this);\n this.shadows = undefined;\n },\n\n\n\n xGetter: function(key) {\n if (this.element.nodeName === 'circle') {\n if (key === 'x') {\n key = 'cx';\n } else if (key === 'y') {\n key = 'cy';\n }\n }\n return this._defaultGetter(key);\n },\n\n /**\n * Get the current value of an attribute or pseudo attribute, used mainly\n * for animation. Called internally from the {@link\n * Highcharts.SVGRenderer#attr}\n * function.\n *\n * @private\n */\n _defaultGetter: function(key) {\n var ret = pick(this[key], this.element ? this.element.getAttribute(key) : null, 0);\n\n if (/^[\\-0-9\\.]+$/.test(ret)) { // is numerical\n ret = parseFloat(ret);\n }\n return ret;\n },\n\n\n dSetter: function(value, key, element) {\n if (value && value.join) { // join path\n value = value.join(' ');\n }\n if (/(NaN| {2}|^$)/.test(value)) {\n value = 'M 0 0';\n }\n element.setAttribute(key, value);\n\n this[key] = value;\n },\n\n dashstyleSetter: function(value) {\n var i,\n strokeWidth = this['stroke-width'];\n\n // If \"inherit\", like maps in IE, assume 1 (#4981). With HC5 and the new strokeWidth \n // function, we should be able to use that instead.\n if (strokeWidth === 'inherit') {\n strokeWidth = 1;\n }\n value = value && value.toLowerCase();\n if (value) {\n value = value\n .replace('shortdashdotdot', '3,1,1,1,1,1,')\n .replace('shortdashdot', '3,1,1,1')\n .replace('shortdot', '1,1,')\n .replace('shortdash', '3,1,')\n .replace('longdash', '8,3,')\n .replace(/dot/g, '1,3,')\n .replace('dash', '4,3,')\n .replace(/,$/, '')\n .split(','); // ending comma\n\n i = value.length;\n while (i--) {\n value[i] = pInt(value[i]) * strokeWidth;\n }\n value = value.join(',')\n .replace(/NaN/g, 'none'); // #3226\n this.element.setAttribute('stroke-dasharray', value);\n }\n },\n\n alignSetter: function(value) {\n var convert = {\n left: 'start',\n center: 'middle',\n right: 'end'\n };\n this.element.setAttribute('text-anchor', convert[value]);\n },\n opacitySetter: function(value, key, element) {\n this[key] = value;\n element.setAttribute(key, value);\n },\n titleSetter: function(value) {\n var titleNode = this.element.getElementsByTagName('title')[0];\n if (!titleNode) {\n titleNode = doc.createElementNS(this.SVG_NS, 'title');\n this.element.appendChild(titleNode);\n }\n\n // Remove text content if it exists\n if (titleNode.firstChild) {\n titleNode.removeChild(titleNode.firstChild);\n }\n\n titleNode.appendChild(\n doc.createTextNode(\n (String(pick(value), '')).replace(/<[^>]*>/g, '') // #3276, #3895\n )\n );\n },\n textSetter: function(value) {\n if (value !== this.textStr) {\n // Delete bBox memo when the text changes\n delete this.bBox;\n\n this.textStr = value;\n if (this.added) {\n this.renderer.buildText(this);\n }\n }\n },\n fillSetter: function(value, key, element) {\n if (typeof value === 'string') {\n element.setAttribute(key, value);\n } else if (value) {\n this.colorGradient(value, key, element);\n }\n },\n visibilitySetter: function(value, key, element) {\n // IE9-11 doesn't handle visibilty:inherit well, so we remove the attribute instead (#2881, #3909)\n if (value === 'inherit') {\n element.removeAttribute(key);\n } else {\n element.setAttribute(key, value);\n }\n },\n zIndexSetter: function(value, key) {\n var renderer = this.renderer,\n parentGroup = this.parentGroup,\n parentWrapper = parentGroup || renderer,\n parentNode = parentWrapper.element || renderer.box,\n childNodes,\n otherElement,\n otherZIndex,\n element = this.element,\n inserted,\n run = this.added,\n i;\n\n if (defined(value)) {\n element.zIndex = value; // So we can read it for other elements in the group\n value = +value;\n if (this[key] === value) { // Only update when needed (#3865)\n run = false;\n }\n this[key] = value;\n }\n\n // Insert according to this and other elements' zIndex. Before .add() is called,\n // nothing is done. Then on add, or by later calls to zIndexSetter, the node\n // is placed on the right place in the DOM.\n if (run) {\n value = this.zIndex;\n\n if (value && parentGroup) {\n parentGroup.handleZ = true;\n }\n\n childNodes = parentNode.childNodes;\n for (i = 0; i < childNodes.length && !inserted; i++) {\n otherElement = childNodes[i];\n otherZIndex = otherElement.zIndex;\n if (otherElement !== element && (\n // Insert before the first element with a higher zIndex\n pInt(otherZIndex) > value ||\n // If no zIndex given, insert before the first element with a zIndex\n (!defined(value) && defined(otherZIndex)) ||\n // Negative zIndex versus no zIndex:\n // On all levels except the highest. If the parent is ,\n // then we don't want to put items before or \n (value < 0 && !defined(otherZIndex) && parentNode !== renderer.box)\n\n )) {\n parentNode.insertBefore(element, otherElement);\n inserted = true;\n }\n }\n if (!inserted) {\n parentNode.appendChild(element);\n }\n }\n return inserted;\n },\n _defaultSetter: function(value, key, element) {\n element.setAttribute(key, value);\n }\n });\n\n // Some shared setters and getters\n SVGElement.prototype.yGetter = SVGElement.prototype.xGetter;\n SVGElement.prototype.translateXSetter = SVGElement.prototype.translateYSetter =\n SVGElement.prototype.rotationSetter = SVGElement.prototype.verticalAlignSetter =\n SVGElement.prototype.scaleXSetter = SVGElement.prototype.scaleYSetter = function(value, key) {\n this[key] = value;\n this.doTransform = true;\n };\n\n\n // WebKit and Batik have problems with a stroke-width of zero, so in this case we remove the \n // stroke attribute altogether. #1270, #1369, #3065, #3072.\n SVGElement.prototype['stroke-widthSetter'] = SVGElement.prototype.strokeSetter = function(value, key, element) {\n this[key] = value;\n // Only apply the stroke attribute if the stroke width is defined and larger than 0\n if (this.stroke && this['stroke-width']) {\n SVGElement.prototype.fillSetter.call(this, this.stroke, 'stroke', element); // use prototype as instance may be overridden\n element.setAttribute('stroke-width', this['stroke-width']);\n this.hasStroke = true;\n } else if (key === 'stroke-width' && value === 0 && this.hasStroke) {\n element.removeAttribute('stroke');\n this.hasStroke = false;\n }\n };\n\n\n /**\n * Allows direct access to the Highcharts rendering layer in order to draw\n * primitive shapes like circles, rectangles, paths or text directly on a chart,\n * or independent from any chart. The SVGRenderer represents a wrapper object\n * for SVGin modern browsers and through the VMLRenderer, for VML in IE < 8.\n *\n * An existing chart's renderer can be accessed through {@link Chart#renderer}.\n * The renderer can also be used completely decoupled from a chart.\n *\n * @param {HTMLDOMElement} container - Where to put the SVG in the web page.\n * @param {number} width - The width of the SVG.\n * @param {number} height - The height of the SVG.\n * @param {boolean} [forExport=false] - Whether the rendered content is intended\n * for export.\n * @param {boolean} [allowHTML=true] - Whether the renderer is allowed to\n * include HTML text, which will be projected on top of the SVG.\n *\n * @example\n * // Use directly without a chart object.\n * var renderer = new Highcharts.Renderer(parentNode, 600, 400);\n *\n * @sample highcharts/members/renderer-on-chart - Annotating a chart programmatically.\n * @sample highcharts/members/renderer-basic - Independedt SVG drawing.\n *\n * @class Highcharts.SVGRenderer\n */\n SVGRenderer = H.SVGRenderer = function() {\n this.init.apply(this, arguments);\n };\n extend(SVGRenderer.prototype, /** @lends Highcharts.SVGRenderer.prototype */ {\n /**\n * A pointer to the renderer's associated Element class. The VMLRenderer\n * will have a pointer to VMLElement here.\n * @type {Highcharts.SVGElement}\n */\n Element: SVGElement,\n SVG_NS: SVG_NS,\n /**\n * Initialize the SVGRenderer. Overridable initiator function that takes\n * the same parameters as the constructor.\n */\n init: function(container, width, height, style, forExport, allowHTML) {\n var renderer = this,\n boxWrapper,\n element,\n desc;\n\n boxWrapper = renderer.createElement('svg')\n .attr({\n 'version': '1.1',\n 'class': 'highcharts-root'\n })\n\n .css(this.getStyle(style));\n element = boxWrapper.element;\n container.appendChild(element);\n\n // For browsers other than IE, add the namespace attribute (#1978)\n if (container.innerHTML.indexOf('xmlns') === -1) {\n attr(element, 'xmlns', this.SVG_NS);\n }\n\n // object properties\n renderer.isSVG = true;\n\n /** \n * The root `svg` node of the renderer.\n * @type {SVGDOMElement}\n */\n this.box = element;\n /** \n * The wrapper for the root `svg` node of the renderer.\n * @type {Highcharts.SVGElement}\n */\n this.boxWrapper = boxWrapper;\n renderer.alignedObjects = [];\n\n /**\n * Page url used for internal references.\n * @type {string}\n */\n // #24, #672, #1070\n this.url = (isFirefox || isWebKit) && doc.getElementsByTagName('base').length ?\n win.location.href\n .replace(/#.*?$/, '') // remove the hash\n .replace(/<[^>]*>/g, '') // wing cut HTML\n .replace(/([\\('\\)])/g, '\\\\$1') // escape parantheses and quotes\n .replace(/ /g, '%20') : // replace spaces (needed for Safari only)\n '';\n\n // Add description\n desc = this.createElement('desc').add();\n desc.element.appendChild(doc.createTextNode('Created with Highcharts 5.0.12'));\n\n\n renderer.defs = this.createElement('defs').add();\n renderer.allowHTML = allowHTML;\n renderer.forExport = forExport;\n renderer.gradients = {}; // Object where gradient SvgElements are stored\n renderer.cache = {}; // Cache for numerical bounding boxes\n renderer.cacheKeys = [];\n renderer.imgCount = 0;\n\n renderer.setSize(width, height, false);\n\n\n\n // Issue 110 workaround:\n // In Firefox, if a div is positioned by percentage, its pixel position may land\n // between pixels. The container itself doesn't display this, but an SVG element\n // inside this container will be drawn at subpixel precision. In order to draw\n // sharp lines, this must be compensated for. This doesn't seem to work inside\n // iframes though (like in jsFiddle).\n var subPixelFix, rect;\n if (isFirefox && container.getBoundingClientRect) {\n subPixelFix = function() {\n css(container, {\n left: 0,\n top: 0\n });\n rect = container.getBoundingClientRect();\n css(container, {\n left: (Math.ceil(rect.left) - rect.left) + 'px',\n top: (Math.ceil(rect.top) - rect.top) + 'px'\n });\n };\n\n // run the fix now\n subPixelFix();\n\n // run it on resize\n renderer.unSubPixelFix = addEvent(win, 'resize', subPixelFix);\n }\n },\n\n\n\n /**\n * Get the global style setting for the renderer.\n * @private\n * @param {CSSObject} style - Style settings.\n * @return {CSSObject} The style settings mixed with defaults.\n */\n getStyle: function(style) {\n this.style = extend({\n\n fontFamily: '\"Lucida Grande\", \"Lucida Sans Unicode\", Arial, Helvetica, sans-serif', // default font\n fontSize: '12px'\n\n }, style);\n return this.style;\n },\n /**\n * Apply the global style on the renderer, mixed with the default styles.\n * @param {CSSObject} style - CSS to apply.\n */\n setStyle: function(style) {\n this.boxWrapper.css(this.getStyle(style));\n },\n\n\n /**\n * Detect whether the renderer is hidden. This happens when one of the\n * parent elements has display: none. Used internally to detect when we need\n * to render preliminarily in another div to get the text bounding boxes \n * right.\n *\n * @returns {boolean} True if it is hidden.\n */\n isHidden: function() { // #608\n return !this.boxWrapper.getBBox().width;\n },\n\n /**\n * Destroys the renderer and its allocated members.\n */\n destroy: function() {\n var renderer = this,\n rendererDefs = renderer.defs;\n renderer.box = null;\n renderer.boxWrapper = renderer.boxWrapper.destroy();\n\n // Call destroy on all gradient elements\n destroyObjectProperties(renderer.gradients || {});\n renderer.gradients = null;\n\n // Defs are null in VMLRenderer\n // Otherwise, destroy them here.\n if (rendererDefs) {\n renderer.defs = rendererDefs.destroy();\n }\n\n // Remove sub pixel fix handler (#982)\n if (renderer.unSubPixelFix) {\n renderer.unSubPixelFix();\n }\n\n renderer.alignedObjects = null;\n\n return null;\n },\n\n /**\n * Create a wrapper for an SVG element. Serves as a factory for \n * {@link SVGElement}, but this function is itself mostly called from \n * primitive factories like {@link SVGRenderer#path}, {@link\n * SVGRenderer#rect} or {@link SVGRenderer#text}.\n * \n * @param {string} nodeName - The node name, for example `rect`, `g` etc.\n * @returns {Highcharts.SVGElement} The generated SVGElement.\n */\n createElement: function(nodeName) {\n var wrapper = new this.Element();\n wrapper.init(this, nodeName);\n return wrapper;\n },\n\n /**\n * Dummy function for plugins, called every time the renderer is updated.\n * Prior to Highcharts 5, this was used for the canvg renderer.\n * @function\n */\n draw: noop,\n\n /**\n * Get converted radial gradient attributes according to the radial\n * reference. Used internally from the {@link SVGElement#colorGradient}\n * function.\n *\n * @private\n */\n getRadialAttr: function(radialReference, gradAttr) {\n return {\n cx: (radialReference[0] - radialReference[2] / 2) + gradAttr.cx * radialReference[2],\n cy: (radialReference[1] - radialReference[2] / 2) + gradAttr.cy * radialReference[2],\n r: gradAttr.r * radialReference[2]\n };\n },\n\n getSpanWidth: function(wrapper, tspan) {\n var renderer = this,\n bBox = wrapper.getBBox(true),\n actualWidth = bBox.width;\n\n // Old IE cannot measure the actualWidth for SVG elements (#2314)\n if (!svg && renderer.forExport) {\n actualWidth = renderer.measureSpanWidth(tspan.firstChild.data, wrapper.styles);\n }\n return actualWidth;\n },\n\n applyEllipsis: function(wrapper, tspan, text, width) {\n var renderer = this,\n actualWidth = renderer.getSpanWidth(wrapper, tspan),\n wasTooLong = actualWidth > width,\n str = text,\n currentIndex,\n minIndex = 0,\n maxIndex = text.length,\n updateTSpan = function(s) {\n tspan.removeChild(tspan.firstChild);\n if (s) {\n tspan.appendChild(doc.createTextNode(s));\n }\n };\n if (wasTooLong) {\n while (minIndex <= maxIndex) {\n currentIndex = Math.ceil((minIndex + maxIndex) / 2);\n str = text.substring(0, currentIndex) + '\\u2026';\n updateTSpan(str);\n actualWidth = renderer.getSpanWidth(wrapper, tspan);\n if (minIndex === maxIndex) {\n // Complete\n minIndex = maxIndex + 1;\n } else if (actualWidth > width) {\n // Too large. Set max index to current.\n maxIndex = currentIndex - 1;\n } else {\n // Within width. Set min index to current.\n minIndex = currentIndex;\n }\n }\n // If max index was 0 it means just ellipsis was also to large.\n if (maxIndex === 0) {\n // Remove ellipses.\n updateTSpan('');\n }\n }\n return wasTooLong;\n },\n\n /**\n * Parse a simple HTML string into SVG tspans. Called internally when text\n * is set on an SVGElement. The function supports a subset of HTML tags,\n * CSS text features like `width`, `text-overflow`, `white-space`, and\n * also attributes like `href` and `style`.\n * @private\n * @param {Highcharts.SVGElement} wrapper The parent SVGElement.\n */\n buildText: function(wrapper) {\n var textNode = wrapper.element,\n renderer = this,\n forExport = renderer.forExport,\n textStr = pick(wrapper.textStr, '').toString(),\n hasMarkup = textStr.indexOf('<') !== -1,\n lines,\n childNodes = textNode.childNodes,\n clsRegex,\n styleRegex,\n hrefRegex,\n wasTooLong,\n parentX = attr(textNode, 'x'),\n textStyles = wrapper.styles,\n width = wrapper.textWidth,\n textLineHeight = textStyles && textStyles.lineHeight,\n textOutline = textStyles && textStyles.textOutline,\n ellipsis = textStyles && textStyles.textOverflow === 'ellipsis',\n noWrap = textStyles && textStyles.whiteSpace === 'nowrap',\n fontSize = textStyles && textStyles.fontSize,\n textCache,\n isSubsequentLine,\n i = childNodes.length,\n tempParent = width && !wrapper.added && this.box,\n getLineHeight = function(tspan) {\n var fontSizeStyle;\n\n fontSizeStyle = /(px|em)$/.test(tspan && tspan.style.fontSize) ?\n tspan.style.fontSize :\n (fontSize || renderer.style.fontSize || 12);\n\n\n return textLineHeight ?\n pInt(textLineHeight) :\n renderer.fontMetrics(\n fontSizeStyle,\n // Get the computed size from parent if not explicit\n tspan.getAttribute('style') ? tspan : textNode\n ).h;\n },\n unescapeAngleBrackets = function(inputStr) {\n return inputStr.replace(/</g, '<').replace(/>/g, '>');\n };\n\n // The buildText code is quite heavy, so if we're not changing something\n // that affects the text, skip it (#6113).\n textCache = [\n textStr,\n ellipsis,\n noWrap,\n textLineHeight,\n textOutline,\n fontSize,\n width\n ].join(',');\n if (textCache === wrapper.textCache) {\n return;\n }\n wrapper.textCache = textCache;\n\n /// remove old text\n while (i--) {\n textNode.removeChild(childNodes[i]);\n }\n\n // Skip tspans, add text directly to text node. The forceTSpan is a hook\n // used in text outline hack.\n if (!hasMarkup && !textOutline && !ellipsis && !width && textStr.indexOf(' ') === -1) {\n textNode.appendChild(doc.createTextNode(unescapeAngleBrackets(textStr)));\n\n // Complex strings, add more logic\n } else {\n\n clsRegex = /<.*class=\"([^\"]+)\".*>/;\n styleRegex = /<.*style=\"([^\"]+)\".*>/;\n hrefRegex = /<.*href=\"([^\"]+)\".*>/;\n\n if (tempParent) {\n tempParent.appendChild(textNode); // attach it to the DOM to read offset width\n }\n\n if (hasMarkup) {\n lines = textStr\n\n .replace(/<(b|strong)>/g, '')\n .replace(/<(i|em)>/g, '')\n\n .replace(//g, '')\n .split(//g);\n\n } else {\n lines = [textStr];\n }\n\n\n // Trim empty lines (#5261)\n lines = grep(lines, function(line) {\n return line !== '';\n });\n\n\n // build the lines\n each(lines, function buildTextLines(line, lineNo) {\n var spans,\n spanNo = 0;\n line = line\n .replace(/^\\s+|\\s+$/g, '') // Trim to prevent useless/costly process on the spaces (#5258)\n .replace(//g, '|||');\n spans = line.split('|||');\n\n each(spans, function buildTextSpans(span) {\n if (span !== '' || spans.length === 1) {\n var attributes = {},\n tspan = doc.createElementNS(renderer.SVG_NS, 'tspan'),\n spanCls,\n spanStyle; // #390\n if (clsRegex.test(span)) {\n spanCls = span.match(clsRegex)[1];\n attr(tspan, 'class', spanCls);\n }\n if (styleRegex.test(span)) {\n spanStyle = span.match(styleRegex)[1].replace(/(;| |^)color([ :])/, '$1fill$2');\n attr(tspan, 'style', spanStyle);\n }\n if (hrefRegex.test(span) && !forExport) { // Not for export - #1529\n attr(tspan, 'onclick', 'location.href=\\\"' + span.match(hrefRegex)[1] + '\\\"');\n css(tspan, {\n cursor: 'pointer'\n });\n }\n\n span = unescapeAngleBrackets(span.replace(/<(.|\\n)*?>/g, '') || ' ');\n\n // Nested tags aren't supported, and cause crash in Safari (#1596)\n if (span !== ' ') {\n\n // add the text node\n tspan.appendChild(doc.createTextNode(span));\n\n if (!spanNo) { // first span in a line, align it to the left\n if (lineNo && parentX !== null) {\n attributes.x = parentX;\n }\n } else {\n attributes.dx = 0; // #16\n }\n\n // add attributes\n attr(tspan, attributes);\n\n // Append it\n textNode.appendChild(tspan);\n\n // first span on subsequent line, add the line height\n if (!spanNo && isSubsequentLine) {\n\n // allow getting the right offset height in exporting in IE\n if (!svg && forExport) {\n css(tspan, {\n display: 'block'\n });\n }\n\n // Set the line height based on the font size of either\n // the text element or the tspan element\n attr(\n tspan,\n 'dy',\n getLineHeight(tspan)\n );\n }\n\n /*if (width) {\n renderer.breakText(wrapper, width);\n }*/\n\n // Check width and apply soft breaks or ellipsis\n if (width) {\n var words = span.replace(/([^\\^])-/g, '$1- ').split(' '), // #1273\n hasWhiteSpace = spans.length > 1 || lineNo || (words.length > 1 && !noWrap),\n tooLong,\n rest = [],\n actualWidth,\n dy = getLineHeight(tspan),\n rotation = wrapper.rotation;\n\n if (ellipsis) {\n wasTooLong = renderer.applyEllipsis(wrapper, tspan, span, width);\n }\n\n while (!ellipsis && hasWhiteSpace && (words.length || rest.length)) {\n wrapper.rotation = 0; // discard rotation when computing box\n actualWidth = renderer.getSpanWidth(wrapper, tspan);\n tooLong = actualWidth > width;\n\n // For ellipsis, do a binary search for the correct string length\n if (wasTooLong === undefined) {\n wasTooLong = tooLong; // First time\n }\n\n // Looping down, this is the first word sequence that is not too long,\n // so we can move on to build the next line.\n if (!tooLong || words.length === 1) {\n words = rest;\n rest = [];\n\n if (words.length && !noWrap) {\n tspan = doc.createElementNS(SVG_NS, 'tspan');\n attr(tspan, {\n dy: dy,\n x: parentX\n });\n if (spanStyle) { // #390\n attr(tspan, 'style', spanStyle);\n }\n textNode.appendChild(tspan);\n }\n if (actualWidth > width) { // a single word is pressing it out\n width = actualWidth;\n }\n } else { // append to existing line tspan\n tspan.removeChild(tspan.firstChild);\n rest.unshift(words.pop());\n }\n if (words.length) {\n tspan.appendChild(doc.createTextNode(words.join(' ').replace(/- /g, '-')));\n }\n }\n wrapper.rotation = rotation;\n }\n\n spanNo++;\n }\n }\n });\n // To avoid beginning lines that doesn't add to the textNode (#6144)\n isSubsequentLine = isSubsequentLine || textNode.childNodes.length;\n });\n\n if (wasTooLong) {\n wrapper.attr('title', wrapper.textStr);\n }\n if (tempParent) {\n tempParent.removeChild(textNode); // attach it to the DOM to read offset width\n }\n\n // Apply the text outline\n if (textOutline && wrapper.applyTextOutline) {\n wrapper.applyTextOutline(textOutline);\n }\n }\n },\n\n\n\n /*\n breakText: function (wrapper, width) {\n var bBox = wrapper.getBBox(),\n node = wrapper.element,\n textLength = node.textContent.length,\n pos = Math.round(width * textLength / bBox.width), // try this position first, based on average character width\n increment = 0,\n finalPos;\n\n if (bBox.width > width) {\n while (finalPos === undefined) {\n textLength = node.getSubStringLength(0, pos);\n\n if (textLength <= width) {\n if (increment === -1) {\n finalPos = pos;\n } else {\n increment = 1;\n }\n } else {\n if (increment === 1) {\n finalPos = pos - 1;\n } else {\n increment = -1;\n }\n }\n pos += increment;\n }\n }\n console.log('width', width, 'stringWidth', node.getSubStringLength(0, finalPos))\n },\n */\n\n /**\n * Returns white for dark colors and black for bright colors.\n *\n * @param {ColorString} rgba - The color to get the contrast for.\n * @returns {string} The contrast color, either `#000000` or `#FFFFFF`.\n */\n getContrast: function(rgba) {\n rgba = color(rgba).rgba;\n\n // The threshold may be discussed. Here's a proposal for adding\n // different weight to the color channels (#6216)\n /*\n rgba[0] *= 1; // red\n rgba[1] *= 1.2; // green\n rgba[2] *= 0.7; // blue\n */\n\n return rgba[0] + rgba[1] + rgba[2] > 2 * 255 ? '#000000' : '#FFFFFF';\n },\n\n /**\n * Create a button with preset states.\n * @param {string} text - The text or HTML to draw.\n * @param {number} x - The x position of the button's left side.\n * @param {number} y - The y position of the button's top side.\n * @param {Function} callback - The function to execute on button click or \n * touch.\n * @param {SVGAttributes} [normalState] - SVG attributes for the normal\n * state.\n * @param {SVGAttributes} [hoverState] - SVG attributes for the hover state.\n * @param {SVGAttributes} [pressedState] - SVG attributes for the pressed\n * state.\n * @param {SVGAttributes} [disabledState] - SVG attributes for the disabled\n * state.\n * @param {Symbol} [shape=rect] - The shape type.\n * @returns {SVGRenderer} The button element.\n */\n button: function(text, x, y, callback, normalState, hoverState, pressedState, disabledState, shape) {\n var label = this.label(text, x, y, shape, null, null, null, null, 'button'),\n curState = 0;\n\n // Default, non-stylable attributes\n label.attr(merge({\n 'padding': 8,\n 'r': 2\n }, normalState));\n\n\n // Presentational\n var normalStyle,\n hoverStyle,\n pressedStyle,\n disabledStyle;\n\n // Normal state - prepare the attributes\n normalState = merge({\n fill: '#f7f7f7',\n stroke: '#cccccc',\n 'stroke-width': 1,\n style: {\n color: '#333333',\n cursor: 'pointer',\n fontWeight: 'normal'\n }\n }, normalState);\n normalStyle = normalState.style;\n delete normalState.style;\n\n // Hover state\n hoverState = merge(normalState, {\n fill: '#e6e6e6'\n }, hoverState);\n hoverStyle = hoverState.style;\n delete hoverState.style;\n\n // Pressed state\n pressedState = merge(normalState, {\n fill: '#e6ebf5',\n style: {\n color: '#000000',\n fontWeight: 'bold'\n }\n }, pressedState);\n pressedStyle = pressedState.style;\n delete pressedState.style;\n\n // Disabled state\n disabledState = merge(normalState, {\n style: {\n color: '#cccccc'\n }\n }, disabledState);\n disabledStyle = disabledState.style;\n delete disabledState.style;\n\n\n // Add the events. IE9 and IE10 need mouseover and mouseout to funciton (#667).\n addEvent(label.element, isMS ? 'mouseover' : 'mouseenter', function() {\n if (curState !== 3) {\n label.setState(1);\n }\n });\n addEvent(label.element, isMS ? 'mouseout' : 'mouseleave', function() {\n if (curState !== 3) {\n label.setState(curState);\n }\n });\n\n label.setState = function(state) {\n // Hover state is temporary, don't record it\n if (state !== 1) {\n label.state = curState = state;\n }\n // Update visuals\n label.removeClass(/highcharts-button-(normal|hover|pressed|disabled)/)\n .addClass('highcharts-button-' + ['normal', 'hover', 'pressed', 'disabled'][state || 0]);\n\n\n label.attr([normalState, hoverState, pressedState, disabledState][state || 0])\n .css([normalStyle, hoverStyle, pressedStyle, disabledStyle][state || 0]);\n\n };\n\n\n\n // Presentational attributes\n label\n .attr(normalState)\n .css(extend({\n cursor: 'default'\n }, normalStyle));\n\n\n return label\n .on('click', function(e) {\n if (curState !== 3) {\n callback.call(label, e);\n }\n });\n },\n\n /**\n * Make a straight line crisper by not spilling out to neighbour pixels.\n * \n * @param {Array} points - The original points on the format `['M', 0, 0,\n * 'L', 100, 0]`.\n * @param {number} width - The width of the line.\n * @returns {Array} The original points array, but modified to render\n * crisply.\n */\n crispLine: function(points, width) {\n // normalize to a crisp line\n if (points[1] === points[4]) {\n // Substract due to #1129. Now bottom and left axis gridlines behave the same.\n points[1] = points[4] = Math.round(points[1]) - (width % 2 / 2);\n }\n if (points[2] === points[5]) {\n points[2] = points[5] = Math.round(points[2]) + (width % 2 / 2);\n }\n return points;\n },\n\n\n /**\n * Draw a path, wraps the SVG `path` element.\n * \n * @param {Array} [path] An SVG path definition in array form.\n * \n * @example\n * var path = renderer.path(['M', 10, 10, 'L', 30, 30, 'z'])\n * .attr({ stroke: '#ff00ff' })\n * .add();\n * @returns {Highcharts.SVGElement} The generated wrapper element.\n *\n * @sample highcharts/members/renderer-path-on-chart/\n * Draw a path in a chart\n * @sample highcharts/members/renderer-path/\n * Draw a path independent from a chart\n *\n */\n /**\n * Draw a path, wraps the SVG `path` element.\n * \n * @param {SVGAttributes} [attribs] The initial attributes.\n * @returns {Highcharts.SVGElement} The generated wrapper element.\n */\n path: function(path) {\n var attribs = {\n\n fill: 'none'\n\n };\n if (isArray(path)) {\n attribs.d = path;\n } else if (isObject(path)) { // attributes\n extend(attribs, path);\n }\n return this.createElement('path').attr(attribs);\n },\n\n /**\n * Draw a circle, wraps the SVG `circle` element.\n * \n * @param {number} [x] The center x position.\n * @param {number} [y] The center y position.\n * @param {number} [r] The radius.\n * @returns {Highcharts.SVGElement} The generated wrapper element.\n *\n * @sample highcharts/members/renderer-circle/ Drawing a circle\n */\n /**\n * Draw a circle, wraps the SVG `circle` element.\n * \n * @param {SVGAttributes} [attribs] The initial attributes.\n * @returns {Highcharts.SVGElement} The generated wrapper element.\n */\n circle: function(x, y, r) {\n var attribs = isObject(x) ? x : {\n x: x,\n y: y,\n r: r\n },\n wrapper = this.createElement('circle');\n\n // Setting x or y translates to cx and cy\n wrapper.xSetter = wrapper.ySetter = function(value, key, element) {\n element.setAttribute('c' + key, value);\n };\n\n return wrapper.attr(attribs);\n },\n\n /**\n * Draw and return an arc.\n * @param {number} [x=0] Center X position.\n * @param {number} [y=0] Center Y position.\n * @param {number} [r=0] The outer radius of the arc.\n * @param {number} [innerR=0] Inner radius like used in donut charts.\n * @param {number} [start=0] The starting angle of the arc in radians, where\n * 0 is to the right and `-Math.PI/2` is up.\n * @param {number} [end=0] The ending angle of the arc in radians, where 0\n * is to the right and `-Math.PI/2` is up.\n * @returns {Highcharts.SVGElement} The generated wrapper element.\n *\n * @sample highcharts/members/renderer-arc/\n * Drawing an arc\n */\n /**\n * Draw and return an arc. Overloaded function that takes arguments object.\n * @param {SVGAttributes} attribs Initial SVG attributes.\n * @returns {Highcharts.SVGElement} The generated wrapper element.\n */\n arc: function(x, y, r, innerR, start, end) {\n var arc,\n options;\n\n if (isObject(x)) {\n options = x;\n y = options.y;\n r = options.r;\n innerR = options.innerR;\n start = options.start;\n end = options.end;\n x = options.x;\n } else {\n options = {\n innerR: innerR,\n start: start,\n end: end\n };\n }\n\n // Arcs are defined as symbols for the ability to set\n // attributes in attr and animate\n arc = this.symbol('arc', x, y, r, r, options);\n arc.r = r; // #959\n return arc;\n },\n\n /**\n * Draw and return a rectangle.\n * @param {number} [x] Left position.\n * @param {number} [y] Top position.\n * @param {number} [width] Width of the rectangle.\n * @param {number} [height] Height of the rectangle.\n * @param {number} [r] Border corner radius.\n * @param {number} [strokeWidth] A stroke width can be supplied to allow\n * crisp drawing.\n * @returns {Highcharts.SVGElement} The generated wrapper element.\n */\n /**\n * Draw and return a rectangle.\n * @param {SVGAttributes} [attributes]\n * General SVG attributes for the rectangle.\n * @return {Highcharts.SVGElement}\n * The generated wrapper element.\n *\n * @sample highcharts/members/renderer-rect-on-chart/\n * Draw a rectangle in a chart\n * @sample highcharts/members/renderer-rect/\n * Draw a rectangle independent from a chart\n */\n rect: function(x, y, width, height, r, strokeWidth) {\n\n r = isObject(x) ? x.r : r;\n\n var wrapper = this.createElement('rect'),\n attribs = isObject(x) ? x : x === undefined ? {} : {\n x: x,\n y: y,\n width: Math.max(width, 0),\n height: Math.max(height, 0)\n };\n\n\n if (strokeWidth !== undefined) {\n attribs.strokeWidth = strokeWidth;\n attribs = wrapper.crisp(attribs);\n }\n attribs.fill = 'none';\n\n\n if (r) {\n attribs.r = r;\n }\n\n wrapper.rSetter = function(value, key, element) {\n attr(element, {\n rx: value,\n ry: value\n });\n };\n\n return wrapper.attr(attribs);\n },\n\n /**\n * Resize the {@link SVGRenderer#box} and re-align all aligned child\n * elements.\n * @param {number} width The new pixel width.\n * @param {number} height The new pixel height.\n * @param {boolean} animate Whether to animate.\n */\n setSize: function(width, height, animate) {\n var renderer = this,\n alignedObjects = renderer.alignedObjects,\n i = alignedObjects.length;\n\n renderer.width = width;\n renderer.height = height;\n\n renderer.boxWrapper.animate({\n width: width,\n height: height\n }, {\n step: function() {\n this.attr({\n viewBox: '0 0 ' + this.attr('width') + ' ' + this.attr('height')\n });\n },\n duration: pick(animate, true) ? undefined : 0\n });\n\n while (i--) {\n alignedObjects[i].align();\n }\n },\n\n /**\n * Create and return an svg group element. Child {@link Highcharts.SVGElement}\n * objects are added to the group by using the group as the first parameter\n * in {@link Highcharts.SVGElement#add|add()}.\n * \n * @param {string} [name] The group will be given a class name of\n * `highcharts-{name}`. This can be used for styling and scripting.\n * @returns {Highcharts.SVGElement} The generated wrapper element.\n *\n * @sample highcharts/members/renderer-g/\n * Show and hide grouped objects\n */\n g: function(name) {\n var elem = this.createElement('g');\n return name ? elem.attr({\n 'class': 'highcharts-' + name\n }) : elem;\n },\n\n /**\n * Display an image.\n * @param {string} src The image source.\n * @param {number} [x] The X position.\n * @param {number} [y] The Y position.\n * @param {number} [width] The image width. If omitted, it defaults to the \n * image file width.\n * @param {number} [height] The image height. If omitted it defaults to the\n * image file height.\n * @returns {Highcharts.SVGElement} The generated wrapper element.\n *\n * @sample highcharts/members/renderer-image-on-chart/\n * Add an image in a chart\n * @sample highcharts/members/renderer-image/\n * Add an image independent of a chart\n */\n image: function(src, x, y, width, height) {\n var attribs = {\n preserveAspectRatio: 'none'\n },\n elemWrapper;\n\n // optional properties\n if (arguments.length > 1) {\n extend(attribs, {\n x: x,\n y: y,\n width: width,\n height: height\n });\n }\n\n elemWrapper = this.createElement('image').attr(attribs);\n\n // set the href in the xlink namespace\n if (elemWrapper.element.setAttributeNS) {\n elemWrapper.element.setAttributeNS('http://www.w3.org/1999/xlink',\n 'href', src);\n } else {\n // could be exporting in IE\n // using href throws \"not supported\" in ie7 and under, requries regex shim to fix later\n elemWrapper.element.setAttribute('hc-svg-href', src);\n }\n return elemWrapper;\n },\n\n /**\n * Draw a symbol out of pre-defined shape paths from {@SVGRenderer#symbols}.\n * It is used in Highcharts for point makers, which cake a `symbol` option,\n * and label and button backgrounds like in the tooltip and stock flags.\n *\n * @param {Symbol} symbol - The symbol name.\n * @param {number} x - The X coordinate for the top left position.\n * @param {number} y - The Y coordinate for the top left position.\n * @param {number} width - The pixel width.\n * @param {number} height - The pixel height.\n * @param {Object} [options] - Additional options, depending on the actual\n * symbol drawn. \n * @param {number} [options.anchorX] - The anchor X position for the\n * `callout` symbol. This is where the chevron points to.\n * @param {number} [options.anchorY] - The anchor Y position for the\n * `callout` symbol. This is where the chevron points to.\n * @param {number} [options.end] - The end angle of an `arc` symbol.\n * @param {boolean} [options.open] - Whether to draw `arc` symbol open or\n * closed.\n * @param {number} [options.r] - The radius of an `arc` symbol, or the\n * border radius for the `callout` symbol.\n * @param {number} [options.start] - The start angle of an `arc` symbol.\n */\n symbol: function(symbol, x, y, width, height, options) {\n\n var ren = this,\n obj,\n imageRegex = /^url\\((.*?)\\)$/,\n isImage = imageRegex.test(symbol),\n sym = !isImage && (this.symbols[symbol] ? symbol : 'circle'),\n\n\n // get the symbol definition function\n symbolFn = sym && this.symbols[sym],\n\n // check if there's a path defined for this symbol\n path = defined(x) && symbolFn && symbolFn.call(\n this.symbols,\n Math.round(x),\n Math.round(y),\n width,\n height,\n options\n ),\n imageSrc,\n centerImage;\n\n if (symbolFn) {\n obj = this.path(path);\n\n\n obj.attr('fill', 'none');\n\n\n // expando properties for use in animate and attr\n extend(obj, {\n symbolName: sym,\n x: x,\n y: y,\n width: width,\n height: height\n });\n if (options) {\n extend(obj, options);\n }\n\n\n // Image symbols\n } else if (isImage) {\n\n\n imageSrc = symbol.match(imageRegex)[1];\n\n // Create the image synchronously, add attribs async\n obj = this.image(imageSrc);\n\n // The image width is not always the same as the symbol width. The\n // image may be centered within the symbol, as is the case when\n // image shapes are used as label backgrounds, for example in flags.\n obj.imgwidth = pick(\n symbolSizes[imageSrc] && symbolSizes[imageSrc].width,\n options && options.width\n );\n obj.imgheight = pick(\n symbolSizes[imageSrc] && symbolSizes[imageSrc].height,\n options && options.height\n );\n /**\n * Set the size and position\n */\n centerImage = function() {\n obj.attr({\n width: obj.width,\n height: obj.height\n });\n };\n\n /**\n * Width and height setters that take both the image's physical size\n * and the label size into consideration, and translates the image\n * to center within the label.\n */\n each(['width', 'height'], function(key) {\n obj[key + 'Setter'] = function(value, key) {\n var attribs = {},\n imgSize = this['img' + key],\n trans = key === 'width' ? 'translateX' : 'translateY';\n this[key] = value;\n if (defined(imgSize)) {\n if (this.element) {\n this.element.setAttribute(key, imgSize);\n }\n if (!this.alignByTranslate) {\n attribs[trans] = ((this[key] || 0) - imgSize) / 2;\n this.attr(attribs);\n }\n }\n };\n });\n\n\n if (defined(x)) {\n obj.attr({\n x: x,\n y: y\n });\n }\n obj.isImg = true;\n\n if (defined(obj.imgwidth) && defined(obj.imgheight)) {\n centerImage();\n } else {\n // Initialize image to be 0 size so export will still function if there's no cached sizes.\n obj.attr({\n width: 0,\n height: 0\n });\n\n // Create a dummy JavaScript image to get the width and height. Due to a bug in IE < 8,\n // the created element must be assigned to a variable in order to load (#292).\n createElement('img', {\n onload: function() {\n\n var chart = charts[ren.chartIndex];\n\n // Special case for SVGs on IE11, the width is not accessible until the image is\n // part of the DOM (#2854).\n if (this.width === 0) {\n css(this, {\n position: 'absolute',\n top: '-999em'\n });\n doc.body.appendChild(this);\n }\n\n // Center the image\n symbolSizes[imageSrc] = { // Cache for next \n width: this.width,\n height: this.height\n };\n obj.imgwidth = this.width;\n obj.imgheight = this.height;\n\n if (obj.element) {\n centerImage();\n }\n\n // Clean up after #2854 workaround.\n if (this.parentNode) {\n this.parentNode.removeChild(this);\n }\n\n // Fire the load event when all external images are loaded\n ren.imgCount--;\n if (!ren.imgCount && chart && chart.onload) {\n chart.onload();\n }\n },\n src: imageSrc\n });\n this.imgCount++;\n }\n }\n\n return obj;\n },\n\n /**\n * @typedef {string} Symbol\n * \n * Can be one of `arc`, `callout`, `circle`, `diamond`, `square`,\n * `triangle`, `triangle-down`. Symbols are used internally for point\n * markers, button and label borders and backgrounds, or custom shapes.\n * Extendable by adding to {@link SVGRenderer#symbols}.\n */\n /**\n * An extendable collection of functions for defining symbol paths.\n */\n symbols: {\n 'circle': function(x, y, w, h) {\n // Return a full arc\n return this.arc(x + w / 2, y + h / 2, w / 2, h / 2, {\n start: 0,\n end: Math.PI * 2,\n open: false\n });\n },\n\n 'square': function(x, y, w, h) {\n return [\n 'M', x, y,\n 'L', x + w, y,\n x + w, y + h,\n x, y + h,\n 'Z'\n ];\n },\n\n 'triangle': function(x, y, w, h) {\n return [\n 'M', x + w / 2, y,\n 'L', x + w, y + h,\n x, y + h,\n 'Z'\n ];\n },\n\n 'triangle-down': function(x, y, w, h) {\n return [\n 'M', x, y,\n 'L', x + w, y,\n x + w / 2, y + h,\n 'Z'\n ];\n },\n 'diamond': function(x, y, w, h) {\n return [\n 'M', x + w / 2, y,\n 'L', x + w, y + h / 2,\n x + w / 2, y + h,\n x, y + h / 2,\n 'Z'\n ];\n },\n 'arc': function(x, y, w, h, options) {\n var start = options.start,\n rx = options.r || w,\n ry = options.r || h || w,\n end = options.end - 0.001, // to prevent cos and sin of start and end from becoming equal on 360 arcs (related: #1561)\n innerRadius = options.innerR,\n open = options.open,\n cosStart = Math.cos(start),\n sinStart = Math.sin(start),\n cosEnd = Math.cos(end),\n sinEnd = Math.sin(end),\n longArc = options.end - start < Math.PI ? 0 : 1,\n arc;\n\n arc = [\n 'M',\n x + rx * cosStart,\n y + ry * sinStart,\n 'A', // arcTo\n rx, // x radius\n ry, // y radius\n 0, // slanting\n longArc, // long or short arc\n 1, // clockwise\n x + rx * cosEnd,\n y + ry * sinEnd\n ];\n\n if (defined(innerRadius)) {\n arc.push(\n open ? 'M' : 'L',\n x + innerRadius * cosEnd,\n y + innerRadius * sinEnd,\n 'A', // arcTo\n innerRadius, // x radius\n innerRadius, // y radius\n 0, // slanting\n longArc, // long or short arc\n 0, // clockwise\n x + innerRadius * cosStart,\n y + innerRadius * sinStart\n );\n }\n\n arc.push(open ? '' : 'Z'); // close\n return arc;\n },\n\n /**\n * Callout shape used for default tooltips, also used for rounded rectangles in VML\n */\n callout: function(x, y, w, h, options) {\n var arrowLength = 6,\n halfDistance = 6,\n r = Math.min((options && options.r) || 0, w, h),\n safeDistance = r + halfDistance,\n anchorX = options && options.anchorX,\n anchorY = options && options.anchorY,\n path;\n\n path = [\n 'M', x + r, y,\n 'L', x + w - r, y, // top side\n 'C', x + w, y, x + w, y, x + w, y + r, // top-right corner\n 'L', x + w, y + h - r, // right side\n 'C', x + w, y + h, x + w, y + h, x + w - r, y + h, // bottom-right corner\n 'L', x + r, y + h, // bottom side\n 'C', x, y + h, x, y + h, x, y + h - r, // bottom-left corner\n 'L', x, y + r, // left side\n 'C', x, y, x, y, x + r, y // top-left corner\n ];\n\n // Anchor on right side\n if (anchorX && anchorX > w) {\n\n // Chevron\n if (anchorY > y + safeDistance && anchorY < y + h - safeDistance) {\n path.splice(13, 3,\n 'L', x + w, anchorY - halfDistance,\n x + w + arrowLength, anchorY,\n x + w, anchorY + halfDistance,\n x + w, y + h - r\n );\n\n // Simple connector\n } else {\n path.splice(13, 3,\n 'L', x + w, h / 2,\n anchorX, anchorY,\n x + w, h / 2,\n x + w, y + h - r\n );\n }\n\n // Anchor on left side\n } else if (anchorX && anchorX < 0) {\n\n // Chevron\n if (anchorY > y + safeDistance && anchorY < y + h - safeDistance) {\n path.splice(33, 3,\n 'L', x, anchorY + halfDistance,\n x - arrowLength, anchorY,\n x, anchorY - halfDistance,\n x, y + r\n );\n\n // Simple connector\n } else {\n path.splice(33, 3,\n 'L', x, h / 2,\n anchorX, anchorY,\n x, h / 2,\n x, y + r\n );\n }\n\n } else if (anchorY && anchorY > h && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace bottom\n path.splice(23, 3,\n 'L', anchorX + halfDistance, y + h,\n anchorX, y + h + arrowLength,\n anchorX - halfDistance, y + h,\n x + r, y + h\n );\n } else if (anchorY && anchorY < 0 && anchorX > x + safeDistance && anchorX < x + w - safeDistance) { // replace top\n path.splice(3, 3,\n 'L', anchorX - halfDistance, y,\n anchorX, y - arrowLength,\n anchorX + halfDistance, y,\n w - r, y\n );\n }\n\n return path;\n }\n },\n\n /**\n * @typedef {Highcharts.SVGElement} ClipRect - A clipping rectangle that can be applied\n * to one or more {@link SVGElement} instances. It is instanciated with the\n * {@link SVGRenderer#clipRect} function and applied with the {@link \n * SVGElement#clip} function.\n *\n * @example\n * var circle = renderer.circle(100, 100, 100)\n * .attr({ fill: 'red' })\n * .add();\n * var clipRect = renderer.clipRect(100, 100, 100, 100);\n *\n * // Leave only the lower right quarter visible\n * circle.clip(clipRect);\n */\n /**\n * Define a clipping rectangle\n * @param {String} id\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @returns {ClipRect} A clipping rectangle.\n */\n clipRect: function(x, y, width, height) {\n var wrapper,\n id = H.uniqueKey(),\n\n clipPath = this.createElement('clipPath').attr({\n id: id\n }).add(this.defs);\n\n wrapper = this.rect(x, y, width, height, 0).add(clipPath);\n wrapper.id = id;\n wrapper.clipPath = clipPath;\n wrapper.count = 0;\n\n return wrapper;\n },\n\n\n\n\n\n /**\n * Draw text. The text can contain a subset of HTML, like spans and anchors\n * and some basic text styling of these. For more advanced features like\n * border and background, use {@link Highcharts.SVGRenderer#label} instead.\n * To update the text after render, run `text.attr({ text: 'New text' })`.\n * @param {String} str\n * The text of (subset) HTML to draw.\n * @param {number} x\n * The x position of the text's lower left corner.\n * @param {number} y\n * The y position of the text's lower left corner.\n * @param {Boolean} [useHTML=false]\n * Use HTML to render the text.\n *\n * @return {Highcharts.SVGElement} The text object.\n *\n * @sample highcharts/members/renderer-text-on-chart/\n * Annotate the chart freely\n * @sample highcharts/members/renderer-on-chart/\n * Annotate with a border and in response to the data\n * @sample highcharts/members/renderer-text/\n * Formatted text\n */\n text: function(str, x, y, useHTML) {\n\n // declare variables\n var renderer = this,\n fakeSVG = !svg && renderer.forExport,\n wrapper,\n attribs = {};\n\n if (useHTML && (renderer.allowHTML || !renderer.forExport)) {\n return renderer.html(str, x, y);\n }\n\n attribs.x = Math.round(x || 0); // X is always needed for line-wrap logic\n if (y) {\n attribs.y = Math.round(y);\n }\n if (str || str === 0) {\n attribs.text = str;\n }\n\n wrapper = renderer.createElement('text')\n .attr(attribs);\n\n // Prevent wrapping from creating false offsetWidths in export in legacy IE (#1079, #1063)\n if (fakeSVG) {\n wrapper.css({\n position: 'absolute'\n });\n }\n\n if (!useHTML) {\n wrapper.xSetter = function(value, key, element) {\n var tspans = element.getElementsByTagName('tspan'),\n tspan,\n parentVal = element.getAttribute(key),\n i;\n for (i = 0; i < tspans.length; i++) {\n tspan = tspans[i];\n // If the x values are equal, the tspan represents a linebreak\n if (tspan.getAttribute(key) === parentVal) {\n tspan.setAttribute(key, value);\n }\n }\n element.setAttribute(key, value);\n };\n }\n\n return wrapper;\n },\n\n /**\n * Utility to return the baseline offset and total line height from the font\n * size.\n *\n * @param {?string} fontSize The current font size to inspect. If not given,\n * the font size will be found from the DOM element.\n * @param {SVGElement|SVGDOMElement} [elem] The element to inspect for a\n * current font size.\n * @returns {Object} An object containing `h`: the line height, `b`: the\n * baseline relative to the top of the box, and `f`: the font size.\n */\n fontMetrics: function(fontSize, elem) {\n var lineHeight,\n baseline;\n\n\n fontSize = fontSize ||\n // When the elem is a DOM element (#5932)\n (elem && elem.style && elem.style.fontSize) ||\n // Fall back on the renderer style default\n (this.style && this.style.fontSize);\n\n\n\n // Handle different units\n if (/px/.test(fontSize)) {\n fontSize = pInt(fontSize);\n } else if (/em/.test(fontSize)) {\n // The em unit depends on parent items\n fontSize = parseFloat(fontSize) *\n (elem ? this.fontMetrics(null, elem.parentNode).f : 16);\n } else {\n fontSize = 12;\n }\n\n // Empirical values found by comparing font size and bounding box\n // height. Applies to the default font family.\n // http://jsfiddle.net/highcharts/7xvn7/\n lineHeight = fontSize < 24 ? fontSize + 3 : Math.round(fontSize * 1.2);\n baseline = Math.round(lineHeight * 0.8);\n\n return {\n h: lineHeight,\n b: baseline,\n f: fontSize\n };\n },\n\n /**\n * Correct X and Y positioning of a label for rotation (#1764)\n */\n rotCorr: function(baseline, rotation, alterY) {\n var y = baseline;\n if (rotation && alterY) {\n y = Math.max(y * Math.cos(rotation * deg2rad), 4);\n }\n return {\n x: (-baseline / 3) * Math.sin(rotation * deg2rad),\n y: y\n };\n },\n\n /**\n * Draw a label, which is an extended text element with support for border\n * and background. Highcharts creates a `g` element with a text and a `path`\n * or `rect` inside, to make it behave somewhat like a HTML div. Border and\n * background are set through `stroke`, `stroke-width` and `fill` attributes\n * using the {@link Highcharts.SVGElement#attr|attr} method. To update the\n * text after render, run `label.attr({ text: 'New text' })`.\n * \n * @param {string} str\n * The initial text string or (subset) HTML to render.\n * @param {number} x\n * The x position of the label's left side.\n * @param {number} y\n * The y position of the label's top side or baseline, depending on\n * the `baseline` parameter.\n * @param {String} shape\n * The shape of the label's border/background, if any. Defaults to\n * `rect`. Other possible values are `callout` or other shapes\n * defined in {@link Highcharts.SVGRenderer#symbols}.\n * @param {number} anchorX\n * In case the `shape` has a pointer, like a flag, this is the\n * coordinates it should be pinned to.\n * @param {number} anchorY\n * In case the `shape` has a pointer, like a flag, this is the\n * coordinates it should be pinned to.\n * @param {Boolean} baseline\n * Whether to position the label relative to the text baseline,\n * like {@link Highcharts.SVGRenderer#text|renderer.text}, or to the\n * upper border of the rectangle.\n * @param {String} className\n * Class name for the group.\n *\n * @return {Highcharts.SVGElement}\n * The generated label.\n *\n * @sample highcharts/members/renderer-label-on-chart/\n * A label on the chart\n */\n label: function(str, x, y, shape, anchorX, anchorY, useHTML, baseline, className) {\n\n var renderer = this,\n wrapper = renderer.g(className !== 'button' && 'label'),\n text = wrapper.text = renderer.text('', 0, 0, useHTML)\n .attr({\n zIndex: 1\n }),\n box,\n bBox,\n alignFactor = 0,\n padding = 3,\n paddingLeft = 0,\n width,\n height,\n wrapperX,\n wrapperY,\n textAlign,\n deferredAttr = {},\n strokeWidth,\n baselineOffset,\n hasBGImage = /^url\\((.*?)\\)$/.test(shape),\n needsBox = hasBGImage,\n getCrispAdjust,\n updateBoxSize,\n updateTextPadding,\n boxAttr;\n\n if (className) {\n wrapper.addClass('highcharts-' + className);\n }\n\n\n needsBox = hasBGImage;\n getCrispAdjust = function() {\n return (strokeWidth || 0) % 2 / 2;\n };\n\n\n\n /**\n * This function runs after the label is added to the DOM (when the bounding box is\n * available), and after the text of the label is updated to detect the new bounding\n * box and reflect it in the border box.\n */\n updateBoxSize = function() {\n var style = text.element.style,\n crispAdjust,\n attribs = {};\n\n bBox = (width === undefined || height === undefined || textAlign) && defined(text.textStr) &&\n text.getBBox(); //#3295 && 3514 box failure when string equals 0\n wrapper.width = (width || bBox.width || 0) + 2 * padding + paddingLeft;\n wrapper.height = (height || bBox.height || 0) + 2 * padding;\n\n // Update the label-scoped y offset\n baselineOffset = padding + renderer.fontMetrics(style && style.fontSize, text).b;\n\n\n if (needsBox) {\n\n // Create the border box if it is not already present\n if (!box) {\n wrapper.box = box = renderer.symbols[shape] || hasBGImage ? // Symbol definition exists (#5324)\n renderer.symbol(shape) :\n renderer.rect();\n\n box.addClass(\n (className === 'button' ? '' : 'highcharts-label-box') + // Don't use label className for buttons\n (className ? ' highcharts-' + className + '-box' : '')\n );\n\n box.add(wrapper);\n\n crispAdjust = getCrispAdjust();\n attribs.x = crispAdjust;\n attribs.y = (baseline ? -baselineOffset : 0) + crispAdjust;\n }\n\n // Apply the box attributes\n attribs.width = Math.round(wrapper.width);\n attribs.height = Math.round(wrapper.height);\n\n box.attr(extend(attribs, deferredAttr));\n deferredAttr = {};\n }\n };\n\n /**\n * This function runs after setting text or padding, but only if padding is changed\n */\n updateTextPadding = function() {\n var textX = paddingLeft + padding,\n textY;\n\n // determin y based on the baseline\n textY = baseline ? 0 : baselineOffset;\n\n // compensate for alignment\n if (defined(width) && bBox && (textAlign === 'center' || textAlign === 'right')) {\n textX += {\n center: 0.5,\n right: 1\n }[textAlign] * (width - bBox.width);\n }\n\n // update if anything changed\n if (textX !== text.x || textY !== text.y) {\n text.attr('x', textX);\n if (textY !== undefined) {\n text.attr('y', textY);\n }\n }\n\n // record current values\n text.x = textX;\n text.y = textY;\n };\n\n /**\n * Set a box attribute, or defer it if the box is not yet created\n * @param {Object} key\n * @param {Object} value\n */\n boxAttr = function(key, value) {\n if (box) {\n box.attr(key, value);\n } else {\n deferredAttr[key] = value;\n }\n };\n\n /**\n * After the text element is added, get the desired size of the border box\n * and add it before the text in the DOM.\n */\n wrapper.onAdd = function() {\n text.add(wrapper);\n wrapper.attr({\n text: (str || str === 0) ? str : '', // alignment is available now // #3295: 0 not rendered if given as a value\n x: x,\n y: y\n });\n\n if (box && defined(anchorX)) {\n wrapper.attr({\n anchorX: anchorX,\n anchorY: anchorY\n });\n }\n };\n\n /*\n * Add specific attribute setters.\n */\n\n // only change local variables\n wrapper.widthSetter = function(value) {\n width = H.isNumber(value) ? value : null; // width:auto => null\n };\n wrapper.heightSetter = function(value) {\n height = value;\n };\n wrapper['text-alignSetter'] = function(value) {\n textAlign = value;\n };\n wrapper.paddingSetter = function(value) {\n if (defined(value) && value !== padding) {\n padding = wrapper.padding = value;\n updateTextPadding();\n }\n };\n wrapper.paddingLeftSetter = function(value) {\n if (defined(value) && value !== paddingLeft) {\n paddingLeft = value;\n updateTextPadding();\n }\n };\n\n\n // change local variable and prevent setting attribute on the group\n wrapper.alignSetter = function(value) {\n value = {\n left: 0,\n center: 0.5,\n right: 1\n }[value];\n if (value !== alignFactor) {\n alignFactor = value;\n if (bBox) { // Bounding box exists, means we're dynamically changing\n wrapper.attr({\n x: wrapperX\n }); // #5134\n }\n }\n };\n\n // apply these to the box and the text alike\n wrapper.textSetter = function(value) {\n if (value !== undefined) {\n text.textSetter(value);\n }\n updateBoxSize();\n updateTextPadding();\n };\n\n // apply these to the box but not to the text\n wrapper['stroke-widthSetter'] = function(value, key) {\n if (value) {\n needsBox = true;\n }\n strokeWidth = this['stroke-width'] = value;\n boxAttr(key, value);\n };\n\n wrapper.strokeSetter = wrapper.fillSetter = wrapper.rSetter = function(value, key) {\n if (key === 'fill' && value) {\n needsBox = true;\n }\n boxAttr(key, value);\n };\n\n wrapper.anchorXSetter = function(value, key) {\n anchorX = wrapper.anchorX = value;\n boxAttr(key, Math.round(value) - getCrispAdjust() - wrapperX);\n };\n wrapper.anchorYSetter = function(value, key) {\n anchorY = wrapper.anchorY = value;\n boxAttr(key, value - wrapperY);\n };\n\n // rename attributes\n wrapper.xSetter = function(value) {\n wrapper.x = value; // for animation getter\n if (alignFactor) {\n value -= alignFactor * ((width || bBox.width) + 2 * padding);\n }\n wrapperX = Math.round(value);\n wrapper.attr('translateX', wrapperX);\n };\n wrapper.ySetter = function(value) {\n wrapperY = wrapper.y = Math.round(value);\n wrapper.attr('translateY', wrapperY);\n };\n\n // Redirect certain methods to either the box or the text\n var baseCss = wrapper.css;\n return extend(wrapper, {\n /**\n * Pick up some properties and apply them to the text instead of the\n * wrapper.\n * @ignore\n */\n css: function(styles) {\n if (styles) {\n var textStyles = {};\n styles = merge(styles); // create a copy to avoid altering the original object (#537)\n each(wrapper.textProps, function(prop) {\n if (styles[prop] !== undefined) {\n textStyles[prop] = styles[prop];\n delete styles[prop];\n }\n });\n text.css(textStyles);\n }\n return baseCss.call(wrapper, styles);\n },\n /**\n * Return the bounding box of the box, not the group.\n * @ignore\n */\n getBBox: function() {\n return {\n width: bBox.width + 2 * padding,\n height: bBox.height + 2 * padding,\n x: bBox.x - padding,\n y: bBox.y - padding\n };\n },\n\n /**\n * Apply the shadow to the box.\n * @ignore\n */\n shadow: function(b) {\n if (b) {\n updateBoxSize();\n if (box) {\n box.shadow(b);\n }\n }\n return wrapper;\n },\n\n /**\n * Destroy and release memory.\n * @ignore\n */\n destroy: function() {\n\n // Added by button implementation\n removeEvent(wrapper.element, 'mouseenter');\n removeEvent(wrapper.element, 'mouseleave');\n\n if (text) {\n text = text.destroy();\n }\n if (box) {\n box = box.destroy();\n }\n // Call base implementation to destroy the rest\n SVGElement.prototype.destroy.call(wrapper);\n\n // Release local pointers (#1298)\n wrapper = renderer = updateBoxSize = updateTextPadding = boxAttr = null;\n }\n });\n }\n }); // end SVGRenderer\n\n\n // general renderer\n H.Renderer = SVGRenderer;\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var attr = H.attr,\n createElement = H.createElement,\n css = H.css,\n defined = H.defined,\n each = H.each,\n extend = H.extend,\n isFirefox = H.isFirefox,\n isMS = H.isMS,\n isWebKit = H.isWebKit,\n pInt = H.pInt,\n SVGElement = H.SVGElement,\n SVGRenderer = H.SVGRenderer,\n win = H.win,\n wrap = H.wrap;\n\n // Extend SvgElement for useHTML option\n extend(SVGElement.prototype, /** @lends SVGElement.prototype */ {\n /**\n * Apply CSS to HTML elements. This is used in text within SVG rendering and\n * by the VML renderer\n */\n htmlCss: function(styles) {\n var wrapper = this,\n element = wrapper.element,\n textWidth = styles && element.tagName === 'SPAN' && styles.width;\n\n if (textWidth) {\n delete styles.width;\n wrapper.textWidth = textWidth;\n wrapper.updateTransform();\n }\n if (styles && styles.textOverflow === 'ellipsis') {\n styles.whiteSpace = 'nowrap';\n styles.overflow = 'hidden';\n }\n wrapper.styles = extend(wrapper.styles, styles);\n css(wrapper.element, styles);\n\n return wrapper;\n },\n\n /**\n * VML and useHTML method for calculating the bounding box based on offsets\n * @param {Boolean} refresh Whether to force a fresh value from the DOM or to\n * use the cached value\n *\n * @return {Object} A hash containing values for x, y, width and height\n */\n\n htmlGetBBox: function() {\n var wrapper = this,\n element = wrapper.element;\n\n // faking getBBox in exported SVG in legacy IE\n // faking getBBox in exported SVG in legacy IE (is this a duplicate of the fix for #1079?)\n if (element.nodeName === 'text') {\n element.style.position = 'absolute';\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n },\n\n /**\n * VML override private method to update elements based on internal\n * properties based on SVG transform\n */\n htmlUpdateTransform: function() {\n // aligning non added elements is expensive\n if (!this.added) {\n this.alignOnAdd = true;\n return;\n }\n\n var wrapper = this,\n renderer = wrapper.renderer,\n elem = wrapper.element,\n translateX = wrapper.translateX || 0,\n translateY = wrapper.translateY || 0,\n x = wrapper.x || 0,\n y = wrapper.y || 0,\n align = wrapper.textAlign || 'left',\n alignCorrection = {\n left: 0,\n center: 0.5,\n right: 1\n }[align],\n styles = wrapper.styles;\n\n // apply translate\n css(elem, {\n marginLeft: translateX,\n marginTop: translateY\n });\n\n\n if (wrapper.shadows) { // used in labels/tooltip\n each(wrapper.shadows, function(shadow) {\n css(shadow, {\n marginLeft: translateX + 1,\n marginTop: translateY + 1\n });\n });\n }\n\n\n // apply inversion\n if (wrapper.inverted) { // wrapper is a group\n each(elem.childNodes, function(child) {\n renderer.invertChild(child, elem);\n });\n }\n\n if (elem.tagName === 'SPAN') {\n\n var rotation = wrapper.rotation,\n baseline,\n textWidth = pInt(wrapper.textWidth),\n whiteSpace = styles && styles.whiteSpace,\n currentTextTransform = [rotation, align, elem.innerHTML, wrapper.textWidth, wrapper.textAlign].join(',');\n\n if (currentTextTransform !== wrapper.cTT) { // do the calculations and DOM access only if properties changed\n\n\n baseline = renderer.fontMetrics(elem.style.fontSize).b;\n\n // Renderer specific handling of span rotation\n if (defined(rotation)) {\n wrapper.setSpanRotation(rotation, alignCorrection, baseline);\n }\n\n // Reset multiline/ellipsis in order to read width (#4928, #5417)\n css(elem, {\n width: '',\n whiteSpace: whiteSpace || 'nowrap'\n });\n\n // Update textWidth\n if (elem.offsetWidth > textWidth && /[ \\-]/.test(elem.textContent || elem.innerText)) { // #983, #1254\n css(elem, {\n width: textWidth + 'px',\n display: 'block',\n whiteSpace: whiteSpace || 'normal' // #3331\n });\n }\n\n\n wrapper.getSpanCorrection(elem.offsetWidth, baseline, alignCorrection, rotation, align);\n }\n\n // apply position with correction\n css(elem, {\n left: (x + (wrapper.xCorr || 0)) + 'px',\n top: (y + (wrapper.yCorr || 0)) + 'px'\n });\n\n // force reflow in webkit to apply the left and top on useHTML element (#1249)\n if (isWebKit) {\n baseline = elem.offsetHeight; // assigned to baseline for lint purpose\n }\n\n // record current text transform\n wrapper.cTT = currentTextTransform;\n }\n },\n\n /**\n * Set the rotation of an individual HTML span\n */\n setSpanRotation: function(rotation, alignCorrection, baseline) {\n var rotationStyle = {},\n cssTransformKey = isMS ? '-ms-transform' : isWebKit ? '-webkit-transform' : isFirefox ? 'MozTransform' : win.opera ? '-o-transform' : '';\n\n rotationStyle[cssTransformKey] = rotationStyle.transform = 'rotate(' + rotation + 'deg)';\n rotationStyle[cssTransformKey + (isFirefox ? 'Origin' : '-origin')] = rotationStyle.transformOrigin = (alignCorrection * 100) + '% ' + baseline + 'px';\n css(this.element, rotationStyle);\n },\n\n /**\n * Get the correction in X and Y positioning as the element is rotated.\n */\n getSpanCorrection: function(width, baseline, alignCorrection) {\n this.xCorr = -width * alignCorrection;\n this.yCorr = -baseline;\n }\n });\n\n // Extend SvgRenderer for useHTML option.\n extend(SVGRenderer.prototype, /** @lends SVGRenderer.prototype */ {\n /**\n * Create HTML text node. This is used by the VML renderer as well as the SVG\n * renderer through the useHTML option.\n *\n * @param {String} str\n * @param {Number} x\n * @param {Number} y\n */\n html: function(str, x, y) {\n var wrapper = this.createElement('span'),\n element = wrapper.element,\n renderer = wrapper.renderer,\n isSVG = renderer.isSVG,\n addSetters = function(element, style) {\n // These properties are set as attributes on the SVG group, and as\n // identical CSS properties on the div. (#3542)\n each(['opacity', 'visibility'], function(prop) {\n wrap(element, prop + 'Setter', function(proceed, value, key, elem) {\n proceed.call(this, value, key, elem);\n style[key] = value;\n });\n });\n };\n\n // Text setter\n wrapper.textSetter = function(value) {\n if (value !== element.innerHTML) {\n delete this.bBox;\n }\n element.innerHTML = this.textStr = value;\n wrapper.htmlUpdateTransform();\n };\n\n // Add setters for the element itself (#4938)\n if (isSVG) { // #4938, only for HTML within SVG\n addSetters(wrapper, wrapper.element.style);\n }\n\n // Various setters which rely on update transform\n wrapper.xSetter = wrapper.ySetter = wrapper.alignSetter = wrapper.rotationSetter = function(value, key) {\n if (key === 'align') {\n key = 'textAlign'; // Do not overwrite the SVGElement.align method. Same as VML.\n }\n wrapper[key] = value;\n wrapper.htmlUpdateTransform();\n };\n\n // Set the default attributes\n wrapper\n .attr({\n text: str,\n x: Math.round(x),\n y: Math.round(y)\n })\n .css({\n\n fontFamily: this.style.fontFamily,\n fontSize: this.style.fontSize,\n\n position: 'absolute'\n });\n\n // Keep the whiteSpace style outside the wrapper.styles collection\n element.style.whiteSpace = 'nowrap';\n\n // Use the HTML specific .css method\n wrapper.css = wrapper.htmlCss;\n\n // This is specific for HTML within SVG\n if (isSVG) {\n wrapper.add = function(svgGroupWrapper) {\n\n var htmlGroup,\n container = renderer.box.parentNode,\n parentGroup,\n parents = [];\n\n this.parentGroup = svgGroupWrapper;\n\n // Create a mock group to hold the HTML elements\n if (svgGroupWrapper) {\n htmlGroup = svgGroupWrapper.div;\n if (!htmlGroup) {\n\n // Read the parent chain into an array and read from top down\n parentGroup = svgGroupWrapper;\n while (parentGroup) {\n\n parents.push(parentGroup);\n\n // Move up to the next parent group\n parentGroup = parentGroup.parentGroup;\n }\n\n // Ensure dynamically updating position when any parent is translated\n each(parents.reverse(), function(parentGroup) {\n var htmlGroupStyle,\n cls = attr(parentGroup.element, 'class');\n\n if (cls) {\n cls = {\n className: cls\n };\n } // else null\n\n // Create a HTML div and append it to the parent div to emulate\n // the SVG group structure\n htmlGroup = parentGroup.div = parentGroup.div || createElement('div', cls, {\n position: 'absolute',\n left: (parentGroup.translateX || 0) + 'px',\n top: (parentGroup.translateY || 0) + 'px',\n display: parentGroup.display,\n opacity: parentGroup.opacity, // #5075\n pointerEvents: parentGroup.styles && parentGroup.styles.pointerEvents // #5595\n }, htmlGroup || container); // the top group is appended to container\n\n // Shortcut\n htmlGroupStyle = htmlGroup.style;\n\n // Set listeners to update the HTML div's position whenever the SVG group\n // position is changed\n extend(parentGroup, {\n on: function() {\n wrapper.on.apply({\n element: parents[0].div\n }, arguments);\n return parentGroup;\n },\n translateXSetter: function(value, key) {\n htmlGroupStyle.left = value + 'px';\n parentGroup[key] = value;\n parentGroup.doTransform = true;\n },\n translateYSetter: function(value, key) {\n htmlGroupStyle.top = value + 'px';\n parentGroup[key] = value;\n parentGroup.doTransform = true;\n }\n });\n addSetters(parentGroup, htmlGroupStyle);\n });\n\n }\n } else {\n htmlGroup = container;\n }\n\n htmlGroup.appendChild(element);\n\n // Shared with VML:\n wrapper.added = true;\n if (wrapper.alignOnAdd) {\n wrapper.htmlUpdateTransform();\n }\n\n return wrapper;\n };\n }\n return wrapper;\n }\n });\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n\n var VMLRenderer,\n VMLRendererExtension,\n VMLElement,\n\n createElement = H.createElement,\n css = H.css,\n defined = H.defined,\n deg2rad = H.deg2rad,\n discardElement = H.discardElement,\n doc = H.doc,\n each = H.each,\n erase = H.erase,\n extend = H.extend,\n extendClass = H.extendClass,\n isArray = H.isArray,\n isNumber = H.isNumber,\n isObject = H.isObject,\n merge = H.merge,\n noop = H.noop,\n pick = H.pick,\n pInt = H.pInt,\n svg = H.svg,\n SVGElement = H.SVGElement,\n SVGRenderer = H.SVGRenderer,\n win = H.win;\n\n /* ****************************************************************************\n * *\n * START OF INTERNET EXPLORER <= 8 SPECIFIC CODE *\n * *\n * For applications and websites that don't need IE support, like platform *\n * targeted mobile apps and web apps, this code can be removed. *\n * *\n *****************************************************************************/\n\n /**\n * @constructor\n */\n if (!svg) {\n\n /**\n * The VML element wrapper.\n */\n VMLElement = {\n\n docMode8: doc && doc.documentMode === 8,\n\n /**\n * Initialize a new VML element wrapper. It builds the markup as a string\n * to minimize DOM traffic.\n * @param {Object} renderer\n * @param {Object} nodeName\n */\n init: function(renderer, nodeName) {\n var wrapper = this,\n markup = ['<', nodeName, ' filled=\"f\" stroked=\"f\"'],\n style = ['position: ', 'absolute', ';'],\n isDiv = nodeName === 'div';\n\n // divs and shapes need size\n if (nodeName === 'shape' || isDiv) {\n style.push('left:0;top:0;width:1px;height:1px;');\n }\n style.push('visibility: ', isDiv ? 'hidden' : 'visible');\n\n markup.push(' style=\"', style.join(''), '\"/>');\n\n // create element with default attributes and style\n if (nodeName) {\n markup = isDiv || nodeName === 'span' || nodeName === 'img' ?\n markup.join('') :\n renderer.prepVML(markup);\n wrapper.element = createElement(markup);\n }\n\n wrapper.renderer = renderer;\n },\n\n /**\n * Add the node to the given parent\n * @param {Object} parent\n */\n add: function(parent) {\n var wrapper = this,\n renderer = wrapper.renderer,\n element = wrapper.element,\n box = renderer.box,\n inverted = parent && parent.inverted,\n\n // get the parent node\n parentNode = parent ?\n parent.element || parent :\n box;\n\n if (parent) {\n this.parentGroup = parent;\n }\n\n // if the parent group is inverted, apply inversion on all children\n if (inverted) { // only on groups\n renderer.invertChild(element, parentNode);\n }\n\n // append it\n parentNode.appendChild(element);\n\n // align text after adding to be able to read offset\n wrapper.added = true;\n if (wrapper.alignOnAdd && !wrapper.deferUpdateTransform) {\n wrapper.updateTransform();\n }\n\n // fire an event for internal hooks\n if (wrapper.onAdd) {\n wrapper.onAdd();\n }\n\n // IE8 Standards can't set the class name before the element is appended\n if (this.className) {\n this.attr('class', this.className);\n }\n\n return wrapper;\n },\n\n /**\n * VML always uses htmlUpdateTransform\n */\n updateTransform: SVGElement.prototype.htmlUpdateTransform,\n\n /**\n * Set the rotation of a span with oldIE's filter\n */\n setSpanRotation: function() {\n // Adjust for alignment and rotation. Rotation of useHTML content is not yet implemented\n // but it can probably be implemented for Firefox 3.5+ on user request. FF3.5+\n // has support for CSS3 transform. The getBBox method also needs to be updated\n // to compensate for the rotation, like it currently does for SVG.\n // Test case: http://jsfiddle.net/highcharts/Ybt44/\n\n var rotation = this.rotation,\n costheta = Math.cos(rotation * deg2rad),\n sintheta = Math.sin(rotation * deg2rad);\n\n css(this.element, {\n filter: rotation ? ['progid:DXImageTransform.Microsoft.Matrix(M11=', costheta,\n ', M12=', -sintheta, ', M21=', sintheta, ', M22=', costheta,\n ', sizingMethod=\\'auto expand\\')'\n ].join('') : 'none'\n });\n },\n\n /**\n * Get the positioning correction for the span after rotating.\n */\n getSpanCorrection: function(width, baseline, alignCorrection, rotation, align) {\n\n var costheta = rotation ? Math.cos(rotation * deg2rad) : 1,\n sintheta = rotation ? Math.sin(rotation * deg2rad) : 0,\n height = pick(this.elemHeight, this.element.offsetHeight),\n quad,\n nonLeft = align && align !== 'left';\n\n // correct x and y\n this.xCorr = costheta < 0 && -width;\n this.yCorr = sintheta < 0 && -height;\n\n // correct for baseline and corners spilling out after rotation\n quad = costheta * sintheta < 0;\n this.xCorr += sintheta * baseline * (quad ? 1 - alignCorrection : alignCorrection);\n this.yCorr -= costheta * baseline * (rotation ? (quad ? alignCorrection : 1 - alignCorrection) : 1);\n // correct for the length/height of the text\n if (nonLeft) {\n this.xCorr -= width * alignCorrection * (costheta < 0 ? -1 : 1);\n if (rotation) {\n this.yCorr -= height * alignCorrection * (sintheta < 0 ? -1 : 1);\n }\n css(this.element, {\n textAlign: align\n });\n }\n },\n\n /**\n * Converts a subset of an SVG path definition to its VML counterpart. Takes an array\n * as the parameter and returns a string.\n */\n pathToVML: function(value) {\n // convert paths\n var i = value.length,\n path = [];\n\n while (i--) {\n\n // Multiply by 10 to allow subpixel precision.\n // Substracting half a pixel seems to make the coordinates\n // align with SVG, but this hasn't been tested thoroughly\n if (isNumber(value[i])) {\n path[i] = Math.round(value[i] * 10) - 5;\n } else if (value[i] === 'Z') { // close the path\n path[i] = 'x';\n } else {\n path[i] = value[i];\n\n // When the start X and end X coordinates of an arc are too close,\n // they are rounded to the same value above. In this case, substract or\n // add 1 from the end X and Y positions. #186, #760, #1371, #1410.\n if (value.isArc && (value[i] === 'wa' || value[i] === 'at')) {\n // Start and end X\n if (path[i + 5] === path[i + 7]) {\n path[i + 7] += value[i + 7] > value[i + 5] ? 1 : -1;\n }\n // Start and end Y\n if (path[i + 6] === path[i + 8]) {\n path[i + 8] += value[i + 8] > value[i + 6] ? 1 : -1;\n }\n }\n }\n }\n\n\n // Loop up again to handle path shortcuts (#2132)\n /*while (i++ < path.length) {\n if (path[i] === 'H') { // horizontal line to\n path[i] = 'L';\n path.splice(i + 2, 0, path[i - 1]);\n } else if (path[i] === 'V') { // vertical line to\n path[i] = 'L';\n path.splice(i + 1, 0, path[i - 2]);\n }\n }*/\n return path.join(' ') || 'x';\n },\n\n /**\n * Set the element's clipping to a predefined rectangle\n *\n * @param {String} id The id of the clip rectangle\n */\n clip: function(clipRect) {\n var wrapper = this,\n clipMembers,\n cssRet;\n\n if (clipRect) {\n clipMembers = clipRect.members;\n erase(clipMembers, wrapper); // Ensure unique list of elements (#1258)\n clipMembers.push(wrapper);\n wrapper.destroyClip = function() {\n erase(clipMembers, wrapper);\n };\n cssRet = clipRect.getCSS(wrapper);\n\n } else {\n if (wrapper.destroyClip) {\n wrapper.destroyClip();\n }\n cssRet = {\n clip: wrapper.docMode8 ? 'inherit' : 'rect(auto)'\n }; // #1214\n }\n\n return wrapper.css(cssRet);\n\n },\n\n /**\n * Set styles for the element\n * @param {Object} styles\n */\n css: SVGElement.prototype.htmlCss,\n\n /**\n * Removes a child either by removeChild or move to garbageBin.\n * Issue 490; in VML removeChild results in Orphaned nodes according to sIEve, discardElement does not.\n */\n safeRemoveChild: function(element) {\n // discardElement will detach the node from its parent before attaching it\n // to the garbage bin. Therefore it is important that the node is attached and have parent.\n if (element.parentNode) {\n discardElement(element);\n }\n },\n\n /**\n * Extend element.destroy by removing it from the clip members array\n */\n destroy: function() {\n if (this.destroyClip) {\n this.destroyClip();\n }\n\n return SVGElement.prototype.destroy.apply(this);\n },\n\n /**\n * Add an event listener. VML override for normalizing event parameters.\n * @param {String} eventType\n * @param {Function} handler\n */\n on: function(eventType, handler) {\n // simplest possible event model for internal use\n this.element['on' + eventType] = function() {\n var evt = win.event;\n evt.target = evt.srcElement;\n handler(evt);\n };\n return this;\n },\n\n /**\n * In stacked columns, cut off the shadows so that they don't overlap\n */\n cutOffPath: function(path, length) {\n\n var len;\n\n path = path.split(/[ ,]/); // The extra comma tricks the trailing comma remover in \"gulp scripts\" task\n len = path.length;\n\n if (len === 9 || len === 11) {\n path[len - 4] = path[len - 2] = pInt(path[len - 2]) - 10 * length;\n }\n return path.join(' ');\n },\n\n /**\n * Apply a drop shadow by copying elements and giving them different strokes\n * @param {Boolean|Object} shadowOptions\n */\n shadow: function(shadowOptions, group, cutOff) {\n var shadows = [],\n i,\n element = this.element,\n renderer = this.renderer,\n shadow,\n elemStyle = element.style,\n markup,\n path = element.path,\n strokeWidth,\n modifiedPath,\n shadowWidth,\n shadowElementOpacity;\n\n // some times empty paths are not strings\n if (path && typeof path.value !== 'string') {\n path = 'x';\n }\n modifiedPath = path;\n\n if (shadowOptions) {\n shadowWidth = pick(shadowOptions.width, 3);\n shadowElementOpacity = (shadowOptions.opacity || 0.15) / shadowWidth;\n for (i = 1; i <= 3; i++) {\n\n strokeWidth = (shadowWidth * 2) + 1 - (2 * i);\n\n // Cut off shadows for stacked column items\n if (cutOff) {\n modifiedPath = this.cutOffPath(path.value, strokeWidth + 0.5);\n }\n\n markup = [''\n ];\n\n shadow = createElement(renderer.prepVML(markup),\n null, {\n left: pInt(elemStyle.left) + pick(shadowOptions.offsetX, 1),\n top: pInt(elemStyle.top) + pick(shadowOptions.offsetY, 1)\n }\n );\n if (cutOff) {\n shadow.cutOff = strokeWidth + 1;\n }\n\n // apply the opacity\n markup = [\n ''\n ];\n createElement(renderer.prepVML(markup), null, null, shadow);\n\n\n // insert it\n if (group) {\n group.element.appendChild(shadow);\n } else {\n element.parentNode.insertBefore(shadow, element);\n }\n\n // record it\n shadows.push(shadow);\n\n }\n\n this.shadows = shadows;\n }\n return this;\n },\n updateShadows: noop, // Used in SVG only\n\n setAttr: function(key, value) {\n if (this.docMode8) { // IE8 setAttribute bug\n this.element[key] = value;\n } else {\n this.element.setAttribute(key, value);\n }\n },\n classSetter: function(value) {\n // IE8 Standards mode has problems retrieving the className unless set like this.\n // IE8 Standards can't set the class name before the element is appended.\n (this.added ? this.element : this).className = value;\n },\n dashstyleSetter: function(value, key, element) {\n var strokeElem = element.getElementsByTagName('stroke')[0] ||\n createElement(this.renderer.prepVML(['']), null, null, element);\n strokeElem[key] = value || 'solid';\n this[key] = value;\n /* because changing stroke-width will change the dash length\n and cause an epileptic effect */\n },\n dSetter: function(value, key, element) {\n var i,\n shadows = this.shadows;\n value = value || [];\n this.d = value.join && value.join(' '); // used in getter for animation\n\n element.path = value = this.pathToVML(value);\n\n // update shadows\n if (shadows) {\n i = shadows.length;\n while (i--) {\n shadows[i].path = shadows[i].cutOff ? this.cutOffPath(value, shadows[i].cutOff) : value;\n }\n }\n this.setAttr(key, value);\n },\n fillSetter: function(value, key, element) {\n var nodeName = element.nodeName;\n if (nodeName === 'SPAN') { // text color\n element.style.color = value;\n } else if (nodeName !== 'IMG') { // #1336\n element.filled = value !== 'none';\n this.setAttr('fillcolor', this.renderer.color(value, element, key, this));\n }\n },\n 'fill-opacitySetter': function(value, key, element) {\n createElement(\n this.renderer.prepVML(['<', key.split('-')[0], ' opacity=\"', value, '\"/>']),\n null,\n null,\n element\n );\n },\n opacitySetter: noop, // Don't bother - animation is too slow and filters introduce artifacts\n rotationSetter: function(value, key, element) {\n var style = element.style;\n this[key] = style[key] = value; // style is for #1873\n\n // Correction for the 1x1 size of the shape container. Used in gauge needles.\n style.left = -Math.round(Math.sin(value * deg2rad) + 1) + 'px';\n style.top = Math.round(Math.cos(value * deg2rad)) + 'px';\n },\n strokeSetter: function(value, key, element) {\n this.setAttr('strokecolor', this.renderer.color(value, element, key, this));\n },\n 'stroke-widthSetter': function(value, key, element) {\n element.stroked = !!value; // VML \"stroked\" attribute\n this[key] = value; // used in getter, issue #113\n if (isNumber(value)) {\n value += 'px';\n }\n this.setAttr('strokeweight', value);\n },\n titleSetter: function(value, key) {\n this.setAttr(key, value);\n },\n visibilitySetter: function(value, key, element) {\n\n // Handle inherited visibility\n if (value === 'inherit') {\n value = 'visible';\n }\n\n // Let the shadow follow the main element\n if (this.shadows) {\n each(this.shadows, function(shadow) {\n shadow.style[key] = value;\n });\n }\n\n // Instead of toggling the visibility CSS property, move the div out of the viewport.\n // This works around #61 and #586\n if (element.nodeName === 'DIV') {\n value = value === 'hidden' ? '-999em' : 0;\n\n // In order to redraw, IE7 needs the div to be visible when tucked away\n // outside the viewport. So the visibility is actually opposite of\n // the expected value. This applies to the tooltip only.\n if (!this.docMode8) {\n element.style[key] = value ? 'visible' : 'hidden';\n }\n key = 'top';\n }\n element.style[key] = value;\n },\n xSetter: function(value, key, element) {\n this[key] = value; // used in getter\n\n if (key === 'x') {\n key = 'left';\n } else if (key === 'y') {\n key = 'top';\n }\n /* else {\n value = Math.max(0, value); // don't set width or height below zero (#311)\n }*/\n\n // clipping rectangle special\n if (this.updateClipping) {\n this[key] = value; // the key is now 'left' or 'top' for 'x' and 'y'\n this.updateClipping();\n } else {\n // normal\n element.style[key] = value;\n }\n },\n zIndexSetter: function(value, key, element) {\n element.style[key] = value;\n }\n };\n VMLElement['stroke-opacitySetter'] = VMLElement['fill-opacitySetter'];\n H.VMLElement = VMLElement = extendClass(SVGElement, VMLElement);\n\n // Some shared setters\n VMLElement.prototype.ySetter =\n VMLElement.prototype.widthSetter =\n VMLElement.prototype.heightSetter =\n VMLElement.prototype.xSetter;\n\n\n /**\n * The VML renderer\n */\n VMLRendererExtension = { // inherit SVGRenderer\n\n Element: VMLElement,\n isIE8: win.navigator.userAgent.indexOf('MSIE 8.0') > -1,\n\n\n /**\n * Initialize the VMLRenderer\n * @param {Object} container\n * @param {Number} width\n * @param {Number} height\n */\n init: function(container, width, height) {\n var renderer = this,\n boxWrapper,\n box,\n css;\n\n renderer.alignedObjects = [];\n\n boxWrapper = renderer.createElement('div')\n .css({\n position: 'relative'\n });\n box = boxWrapper.element;\n container.appendChild(boxWrapper.element);\n\n\n // generate the containing box\n renderer.isVML = true;\n renderer.box = box;\n renderer.boxWrapper = boxWrapper;\n renderer.gradients = {};\n renderer.cache = {}; // Cache for numerical bounding boxes\n renderer.cacheKeys = [];\n renderer.imgCount = 0;\n\n\n renderer.setSize(width, height, false);\n\n // The only way to make IE6 and IE7 print is to use a global namespace. However,\n // with IE8 the only way to make the dynamic shapes visible in screen and print mode\n // seems to be to add the xmlns attribute and the behaviour style inline.\n if (!doc.namespaces.hcv) {\n\n doc.namespaces.add('hcv', 'urn:schemas-microsoft-com:vml');\n\n // Setup default CSS (#2153, #2368, #2384)\n css = 'hcv\\\\:fill, hcv\\\\:path, hcv\\\\:shape, hcv\\\\:stroke' +\n '{ behavior:url(#default#VML); display: inline-block; } ';\n try {\n doc.createStyleSheet().cssText = css;\n } catch (e) {\n doc.styleSheets[0].cssText += css;\n }\n\n }\n },\n\n\n /**\n * Detect whether the renderer is hidden. This happens when one of the parent elements\n * has display: none\n */\n isHidden: function() {\n return !this.box.offsetWidth;\n },\n\n /**\n * Define a clipping rectangle. In VML it is accomplished by storing the values\n * for setting the CSS style to all associated members.\n *\n * @param {Number} x\n * @param {Number} y\n * @param {Number} width\n * @param {Number} height\n */\n clipRect: function(x, y, width, height) {\n\n // create a dummy element\n var clipRect = this.createElement(),\n isObj = isObject(x);\n\n // mimic a rectangle with its style object for automatic updating in attr\n return extend(clipRect, {\n members: [],\n count: 0,\n left: (isObj ? x.x : x) + 1,\n top: (isObj ? x.y : y) + 1,\n width: (isObj ? x.width : width) - 1,\n height: (isObj ? x.height : height) - 1,\n getCSS: function(wrapper) {\n var element = wrapper.element,\n nodeName = element.nodeName,\n isShape = nodeName === 'shape',\n inverted = wrapper.inverted,\n rect = this,\n top = rect.top - (isShape ? element.offsetTop : 0),\n left = rect.left,\n right = left + rect.width,\n bottom = top + rect.height,\n ret = {\n clip: 'rect(' +\n Math.round(inverted ? left : top) + 'px,' +\n Math.round(inverted ? bottom : right) + 'px,' +\n Math.round(inverted ? right : bottom) + 'px,' +\n Math.round(inverted ? top : left) + 'px)'\n };\n\n // issue 74 workaround\n if (!inverted && wrapper.docMode8 && nodeName === 'DIV') {\n extend(ret, {\n width: right + 'px',\n height: bottom + 'px'\n });\n }\n return ret;\n },\n\n // used in attr and animation to update the clipping of all members\n updateClipping: function() {\n each(clipRect.members, function(member) {\n // Member.element is falsy on deleted series, like in\n // stock/members/series-remove demo. Should be removed\n // from members, but this will do.\n if (member.element) {\n member.css(clipRect.getCSS(member));\n }\n });\n }\n });\n\n },\n\n\n /**\n * Take a color and return it if it's a string, make it a gradient if it's a\n * gradient configuration object, and apply opacity.\n *\n * @param {Object} color The color or config object\n */\n color: function(color, elem, prop, wrapper) {\n var renderer = this,\n colorObject,\n regexRgba = /^rgba/,\n markup,\n fillType,\n ret = 'none';\n\n // Check for linear or radial gradient\n if (color && color.linearGradient) {\n fillType = 'gradient';\n } else if (color && color.radialGradient) {\n fillType = 'pattern';\n }\n\n\n if (fillType) {\n\n var stopColor,\n stopOpacity,\n gradient = color.linearGradient || color.radialGradient,\n x1,\n y1,\n x2,\n y2,\n opacity1,\n opacity2,\n color1,\n color2,\n fillAttr = '',\n stops = color.stops,\n firstStop,\n lastStop,\n colors = [],\n addFillNode = function() {\n // Add the fill subnode. When colors attribute is used, the meanings of opacity and o:opacity2\n // are reversed.\n markup = [''\n ];\n createElement(renderer.prepVML(markup), null, null, elem);\n };\n\n // Extend from 0 to 1\n firstStop = stops[0];\n lastStop = stops[stops.length - 1];\n if (firstStop[0] > 0) {\n stops.unshift([\n 0,\n firstStop[1]\n ]);\n }\n if (lastStop[0] < 1) {\n stops.push([\n 1,\n lastStop[1]\n ]);\n }\n\n // Compute the stops\n each(stops, function(stop, i) {\n if (regexRgba.test(stop[1])) {\n colorObject = H.color(stop[1]);\n stopColor = colorObject.get('rgb');\n stopOpacity = colorObject.get('a');\n } else {\n stopColor = stop[1];\n stopOpacity = 1;\n }\n\n // Build the color attribute\n colors.push((stop[0] * 100) + '% ' + stopColor);\n\n // Only start and end opacities are allowed, so we use the first and the last\n if (!i) {\n opacity1 = stopOpacity;\n color2 = stopColor;\n } else {\n opacity2 = stopOpacity;\n color1 = stopColor;\n }\n });\n\n // Apply the gradient to fills only.\n if (prop === 'fill') {\n\n // Handle linear gradient angle\n if (fillType === 'gradient') {\n x1 = gradient.x1 || gradient[0] || 0;\n y1 = gradient.y1 || gradient[1] || 0;\n x2 = gradient.x2 || gradient[2] || 0;\n y2 = gradient.y2 || gradient[3] || 0;\n fillAttr = 'angle=\"' + (90 - Math.atan(\n (y2 - y1) / // y vector\n (x2 - x1) // x vector\n ) * 180 / Math.PI) + '\"';\n\n addFillNode();\n\n // Radial (circular) gradient\n } else {\n\n var r = gradient.r,\n sizex = r * 2,\n sizey = r * 2,\n cx = gradient.cx,\n cy = gradient.cy,\n radialReference = elem.radialReference,\n bBox,\n applyRadialGradient = function() {\n if (radialReference) {\n bBox = wrapper.getBBox();\n cx += (radialReference[0] - bBox.x) / bBox.width - 0.5;\n cy += (radialReference[1] - bBox.y) / bBox.height - 0.5;\n sizex *= radialReference[2] / bBox.width;\n sizey *= radialReference[2] / bBox.height;\n }\n fillAttr = 'src=\"' + H.getOptions().global.VMLRadialGradientURL + '\" ' +\n 'size=\"' + sizex + ',' + sizey + '\" ' +\n 'origin=\"0.5,0.5\" ' +\n 'position=\"' + cx + ',' + cy + '\" ' +\n 'color2=\"' + color2 + '\" ';\n\n addFillNode();\n };\n\n // Apply radial gradient\n if (wrapper.added) {\n applyRadialGradient();\n } else {\n // We need to know the bounding box to get the size and position right\n wrapper.onAdd = applyRadialGradient;\n }\n\n // The fill element's color attribute is broken in IE8 standards mode, so we\n // need to set the parent shape's fillcolor attribute instead.\n ret = color1;\n }\n\n // Gradients are not supported for VML stroke, return the first color. #722.\n } else {\n ret = stopColor;\n }\n\n // If the color is an rgba color, split it and add a fill node\n // to hold the opacity component\n } else if (regexRgba.test(color) && elem.tagName !== 'IMG') {\n\n colorObject = H.color(color);\n\n wrapper[prop + '-opacitySetter'](colorObject.get('a'), prop, elem);\n\n ret = colorObject.get('rgb');\n\n\n } else {\n var propNodes = elem.getElementsByTagName(prop); // 'stroke' or 'fill' node\n if (propNodes.length) {\n propNodes[0].opacity = 1;\n propNodes[0].type = 'solid';\n }\n ret = color;\n }\n\n return ret;\n },\n\n /**\n * Take a VML string and prepare it for either IE8 or IE6/IE7.\n * @param {Array} markup A string array of the VML markup to prepare\n */\n prepVML: function(markup) {\n var vmlStyle = 'display:inline-block;behavior:url(#default#VML);',\n isIE8 = this.isIE8;\n\n markup = markup.join('');\n\n if (isIE8) { // add xmlns and style inline\n markup = markup.replace('/>', ' xmlns=\"urn:schemas-microsoft-com:vml\" />');\n if (markup.indexOf('style=\"') === -1) {\n markup = markup.replace('/>', ' style=\"' + vmlStyle + '\" />');\n } else {\n markup = markup.replace('style=\"', 'style=\"' + vmlStyle);\n }\n\n } else { // add namespace\n markup = markup.replace('<', ' 1) {\n obj.attr({\n x: x,\n y: y,\n width: width,\n height: height\n });\n }\n return obj;\n },\n\n /**\n * For rectangles, VML uses a shape for rect to overcome bugs and rotation problems\n */\n createElement: function(nodeName) {\n return nodeName === 'rect' ?\n this.symbol(nodeName) :\n SVGRenderer.prototype.createElement.call(this, nodeName);\n },\n\n /**\n * In the VML renderer, each child of an inverted div (group) is inverted\n * @param {Object} element\n * @param {Object} parentNode\n */\n invertChild: function(element, parentNode) {\n var ren = this,\n parentStyle = parentNode.style,\n imgStyle = element.tagName === 'IMG' && element.style; // #1111\n\n css(element, {\n flip: 'x',\n left: pInt(parentStyle.width) - (imgStyle ? pInt(imgStyle.top) : 1),\n top: pInt(parentStyle.height) - (imgStyle ? pInt(imgStyle.left) : 1),\n rotation: -90\n });\n\n // Recursively invert child elements, needed for nested composite\n // shapes like box plots and error bars. #1680, #1806.\n each(element.childNodes, function(child) {\n ren.invertChild(child, element);\n });\n },\n\n /**\n * Symbol definitions that override the parent SVG renderer's symbols\n *\n */\n symbols: {\n // VML specific arc function\n arc: function(x, y, w, h, options) {\n var start = options.start,\n end = options.end,\n radius = options.r || w || h,\n innerRadius = options.innerR,\n cosStart = Math.cos(start),\n sinStart = Math.sin(start),\n cosEnd = Math.cos(end),\n sinEnd = Math.sin(end),\n ret;\n\n if (end - start === 0) { // no angle, don't show it.\n return ['x'];\n }\n\n ret = [\n 'wa', // clockwise arc to\n x - radius, // left\n y - radius, // top\n x + radius, // right\n y + radius, // bottom\n x + radius * cosStart, // start x\n y + radius * sinStart, // start y\n x + radius * cosEnd, // end x\n y + radius * sinEnd // end y\n ];\n\n if (options.open && !innerRadius) {\n ret.push(\n 'e',\n 'M',\n x, // - innerRadius,\n y // - innerRadius\n );\n }\n\n ret.push(\n 'at', // anti clockwise arc to\n x - innerRadius, // left\n y - innerRadius, // top\n x + innerRadius, // right\n y + innerRadius, // bottom\n x + innerRadius * cosEnd, // start x\n y + innerRadius * sinEnd, // start y\n x + innerRadius * cosStart, // end x\n y + innerRadius * sinStart, // end y\n 'x', // finish path\n 'e' // close\n );\n\n ret.isArc = true;\n return ret;\n\n },\n // Add circle symbol path. This performs significantly faster than v:oval.\n circle: function(x, y, w, h, wrapper) {\n\n if (wrapper && defined(wrapper.r)) {\n w = h = 2 * wrapper.r;\n }\n\n // Center correction, #1682\n if (wrapper && wrapper.isCircle) {\n x -= w / 2;\n y -= h / 2;\n }\n\n // Return the path\n return [\n 'wa', // clockwisearcto\n x, // left\n y, // top\n x + w, // right\n y + h, // bottom\n x + w, // start x\n y + h / 2, // start y\n x + w, // end x\n y + h / 2, // end y\n //'x', // finish path\n 'e' // close\n ];\n },\n /**\n * Add rectangle symbol path which eases rotation and omits arcsize problems\n * compared to the built-in VML roundrect shape. When borders are not rounded,\n * use the simpler square path, else use the callout path without the arrow.\n */\n rect: function(x, y, w, h, options) {\n return SVGRenderer.prototype.symbols[!defined(options) || !options.r ? 'square' : 'callout'].call(0, x, y, w, h, options);\n }\n }\n };\n H.VMLRenderer = VMLRenderer = function() {\n this.init.apply(this, arguments);\n };\n VMLRenderer.prototype = merge(SVGRenderer.prototype, VMLRendererExtension);\n\n // general renderer\n H.Renderer = VMLRenderer;\n }\n\n // This method is used with exporting in old IE, when emulating SVG (see #2314)\n SVGRenderer.prototype.measureSpanWidth = function(text, styles) {\n var measuringSpan = doc.createElement('span'),\n offsetWidth,\n textNode = doc.createTextNode(text);\n\n measuringSpan.appendChild(textNode);\n css(measuringSpan, styles);\n this.box.appendChild(measuringSpan);\n offsetWidth = measuringSpan.offsetWidth;\n discardElement(measuringSpan); // #2463\n return offsetWidth;\n };\n\n\n /* ****************************************************************************\n * *\n * END OF INTERNET EXPLORER <= 8 SPECIFIC CODE *\n * *\n *****************************************************************************/\n\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var color = H.color,\n each = H.each,\n getTZOffset = H.getTZOffset,\n isTouchDevice = H.isTouchDevice,\n merge = H.merge,\n pick = H.pick,\n svg = H.svg,\n win = H.win;\n\n /* ****************************************************************************\n * Handle the options *\n *****************************************************************************/\n H.defaultOptions = {\n\n colors: '#7cb5ec #434348 #90ed7d #f7a35c #8085e9 #f15c80 #e4d354 #2b908f #f45b5b #91e8e1'.split(' '),\n\n symbols: ['circle', 'diamond', 'square', 'triangle', 'triangle-down'],\n lang: {\n loading: 'Loading...',\n months: [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July',\n 'August', 'September', 'October', 'November', 'December'\n ],\n shortMonths: [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',\n 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'\n ],\n weekdays: [\n 'Sunday', 'Monday', 'Tuesday', 'Wednesday',\n 'Thursday', 'Friday', 'Saturday'\n ],\n // invalidDate: '',\n decimalPoint: '.',\n numericSymbols: ['k', 'M', 'G', 'T', 'P', 'E'], // SI prefixes used in axis labels\n resetZoom: 'Reset zoom',\n resetZoomTitle: 'Reset zoom level 1:1',\n thousandsSep: ' '\n },\n global: {\n useUTC: true,\n //timezoneOffset: 0,\n\n VMLRadialGradientURL: 'http://code.highcharts.com/5.0.12/gfx/vml-radial-gradient.png'\n\n },\n chart: {\n //animation: true,\n //alignTicks: false,\n //reflow: true,\n //className: null,\n //events: { load, selection },\n //margin: [null],\n //marginTop: null,\n //marginRight: null,\n //marginBottom: null,\n //marginLeft: null,\n borderRadius: 0,\n\n defaultSeriesType: 'line',\n ignoreHiddenSeries: true,\n //inverted: false,\n spacing: [10, 10, 15, 10],\n //spacingTop: 10,\n //spacingRight: 10,\n //spacingBottom: 15,\n //spacingLeft: 10,\n //zoomType: ''\n resetZoomButton: {\n theme: {\n zIndex: 20\n },\n position: {\n align: 'right',\n x: -10,\n //verticalAlign: 'top',\n y: 10\n }\n // relativeTo: 'plot'\n },\n width: null,\n height: null,\n\n\n borderColor: '#335cad',\n //borderWidth: 0,\n //style: {\n // fontFamily: '\"Lucida Grande\", \"Lucida Sans Unicode\", Verdana, Arial, Helvetica, sans-serif', // default font\n // fontSize: '12px'\n //},\n backgroundColor: '#ffffff',\n //plotBackgroundColor: null,\n plotBorderColor: '#cccccc'\n //plotBorderWidth: 0,\n //plotShadow: false\n\n },\n title: {\n text: 'Chart title',\n align: 'center',\n // floating: false,\n margin: 15,\n // x: 0,\n // verticalAlign: 'top',\n // y: null,\n // style: {}, // defined inline\n widthAdjust: -44\n\n },\n subtitle: {\n text: '',\n align: 'center',\n // floating: false\n // x: 0,\n // verticalAlign: 'top',\n // y: null,\n // style: {}, // defined inline\n widthAdjust: -44\n },\n\n plotOptions: {},\n labels: {\n //items: [],\n style: {\n //font: defaultFont,\n position: 'absolute',\n color: '#333333'\n }\n },\n legend: {\n enabled: true,\n align: 'center',\n //floating: false,\n layout: 'horizontal',\n labelFormatter: function() {\n return this.name;\n },\n //borderWidth: 0,\n borderColor: '#999999',\n borderRadius: 0,\n navigation: {\n\n activeColor: '#003399',\n inactiveColor: '#cccccc'\n\n // animation: true,\n // arrowSize: 12\n // style: {} // text styles\n },\n // margin: 20,\n // reversed: false,\n // backgroundColor: null,\n /*style: {\n padding: '5px'\n },*/\n\n itemStyle: {\n color: '#333333',\n fontSize: '12px',\n fontWeight: 'bold',\n textOverflow: 'ellipsis'\n },\n itemHoverStyle: {\n //cursor: 'pointer', removed as of #601\n color: '#000000'\n },\n itemHiddenStyle: {\n color: '#cccccc'\n },\n shadow: false,\n\n itemCheckboxStyle: {\n position: 'absolute',\n width: '13px', // for IE precision\n height: '13px'\n },\n // itemWidth: undefined,\n squareSymbol: true,\n // symbolRadius: 0,\n // symbolWidth: 16,\n symbolPadding: 5,\n verticalAlign: 'bottom',\n // width: undefined,\n x: 0,\n y: 0,\n title: {\n //text: null,\n\n style: {\n fontWeight: 'bold'\n }\n\n }\n },\n\n loading: {\n // hideDuration: 100,\n // showDuration: 0,\n\n labelStyle: {\n fontWeight: 'bold',\n position: 'relative',\n top: '45%'\n },\n style: {\n position: 'absolute',\n backgroundColor: '#ffffff',\n opacity: 0.5,\n textAlign: 'center'\n }\n\n },\n\n tooltip: {\n enabled: true,\n animation: svg,\n //crosshairs: null,\n borderRadius: 3,\n dateTimeLabelFormats: {\n millisecond: '%A, %b %e, %H:%M:%S.%L',\n second: '%A, %b %e, %H:%M:%S',\n minute: '%A, %b %e, %H:%M',\n hour: '%A, %b %e, %H:%M',\n day: '%A, %b %e, %Y',\n week: 'Week from %A, %b %e, %Y',\n month: '%B %Y',\n year: '%Y'\n },\n footerFormat: '',\n //formatter: defaultFormatter,\n /* todo: em font-size when finished comparing against HC4\n headerFormat: '{point.key}
',\n */\n padding: 8,\n\n //shape: 'callout',\n //shared: false,\n snap: isTouchDevice ? 25 : 10,\n\n backgroundColor: color('#f7f7f7').setOpacity(0.85).get(),\n borderWidth: 1,\n headerFormat: '{point.key}
',\n pointFormat: '\\u25CF {series.name}: {point.y}
',\n shadow: true,\n style: {\n color: '#333333',\n cursor: 'default',\n fontSize: '12px',\n pointerEvents: 'none', // #1686 http://caniuse.com/#feat=pointer-events\n whiteSpace: 'nowrap'\n }\n\n //xDateFormat: '%A, %b %e, %Y',\n //valueDecimals: null,\n //valuePrefix: '',\n //valueSuffix: ''\n },\n\n credits: {\n enabled: true,\n href: 'http://www.highcharts.com',\n position: {\n align: 'right',\n x: -10,\n verticalAlign: 'bottom',\n y: -5\n },\n\n style: {\n cursor: 'pointer',\n color: '#999999',\n fontSize: '9px'\n },\n\n text: 'Highcharts.com'\n }\n };\n\n\n\n /**\n * Sets the getTimezoneOffset function. If the timezone option is set, a default\n * getTimezoneOffset function with that timezone is returned. If not, the\n * specified getTimezoneOffset function is returned. If neither are specified,\n * undefined is returned.\n * @return {function} a getTimezoneOffset function or undefined\n */\n function getTimezoneOffsetOption() {\n var globalOptions = H.defaultOptions.global,\n moment = win.moment;\n\n if (globalOptions.timezone) {\n if (!moment) {\n // getTimezoneOffset-function stays undefined because it depends on\n // Moment.js\n H.error(25);\n\n } else {\n return function(timestamp) {\n return -moment.tz(\n timestamp,\n globalOptions.timezone\n ).utcOffset();\n };\n }\n }\n\n // If not timezone is set, look for the getTimezoneOffset callback\n return globalOptions.useUTC && globalOptions.getTimezoneOffset;\n }\n\n /**\n * Set the time methods globally based on the useUTC option. Time method can be\n * either local time or UTC (default). It is called internally on initiating\n * Highcharts and after running `Highcharts.setOptions`.\n *\n * @private\n */\n function setTimeMethods() {\n var globalOptions = H.defaultOptions.global,\n Date,\n useUTC = globalOptions.useUTC,\n GET = useUTC ? 'getUTC' : 'get',\n SET = useUTC ? 'setUTC' : 'set';\n\n H.Date = Date = globalOptions.Date || win.Date; // Allow using a different Date class\n Date.hcTimezoneOffset = useUTC && globalOptions.timezoneOffset;\n Date.hcGetTimezoneOffset = getTimezoneOffsetOption();\n Date.hcMakeTime = function(year, month, date, hours, minutes, seconds) {\n var d;\n if (useUTC) {\n d = Date.UTC.apply(0, arguments);\n d += getTZOffset(d);\n } else {\n d = new Date(\n year,\n month,\n pick(date, 1),\n pick(hours, 0),\n pick(minutes, 0),\n pick(seconds, 0)\n ).getTime();\n }\n return d;\n };\n each(['Minutes', 'Hours', 'Day', 'Date', 'Month', 'FullYear'], function(s) {\n Date['hcGet' + s] = GET + s;\n });\n each(['Milliseconds', 'Seconds', 'Minutes', 'Hours', 'Date', 'Month', 'FullYear'], function(s) {\n Date['hcSet' + s] = SET + s;\n });\n }\n\n /**\n * Merge the default options with custom options and return the new options\n * structure. Commonly used for defining reusable templates.\n *\n * @function #setOptions\n * @memberOf Highcharts\n * @sample highcharts/global/useutc-false Setting a global option\n * @sample highcharts/members/setoptions Applying a global theme\n * @param {Object} options The new custom chart options.\n * @returns {Object} Updated options.\n */\n H.setOptions = function(options) {\n\n // Copy in the default options\n H.defaultOptions = merge(true, H.defaultOptions, options);\n\n // Apply UTC\n setTimeMethods();\n\n return H.defaultOptions;\n };\n\n /**\n * Get the updated default options. Until 3.0.7, merely exposing defaultOptions for outside modules\n * wasn't enough because the setOptions method created a new object.\n */\n H.getOptions = function() {\n return H.defaultOptions;\n };\n\n\n // Series defaults\n H.defaultPlotOptions = H.defaultOptions.plotOptions;\n\n // set the default time methods\n setTimeMethods();\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var correctFloat = H.correctFloat,\n defined = H.defined,\n destroyObjectProperties = H.destroyObjectProperties,\n isNumber = H.isNumber,\n merge = H.merge,\n pick = H.pick,\n deg2rad = H.deg2rad;\n\n /**\n * The Tick class\n */\n H.Tick = function(axis, pos, type, noLabel) {\n this.axis = axis;\n this.pos = pos;\n this.type = type || '';\n this.isNew = true;\n this.isNewLabel = true;\n\n if (!type && !noLabel) {\n this.addLabel();\n }\n };\n\n H.Tick.prototype = {\n /**\n * Write the tick label\n */\n addLabel: function() {\n var tick = this,\n axis = tick.axis,\n options = axis.options,\n chart = axis.chart,\n categories = axis.categories,\n names = axis.names,\n pos = tick.pos,\n labelOptions = options.labels,\n str,\n tickPositions = axis.tickPositions,\n isFirst = pos === tickPositions[0],\n isLast = pos === tickPositions[tickPositions.length - 1],\n value = categories ?\n pick(categories[pos], names[pos], pos) :\n pos,\n label = tick.label,\n tickPositionInfo = tickPositions.info,\n dateTimeLabelFormat;\n\n // Set the datetime label format. If a higher rank is set for this position, use that. If not,\n // use the general format.\n if (axis.isDatetimeAxis && tickPositionInfo) {\n dateTimeLabelFormat =\n options.dateTimeLabelFormats[\n tickPositionInfo.higherRanks[pos] || tickPositionInfo.unitName\n ];\n }\n // set properties for access in render method\n tick.isFirst = isFirst;\n tick.isLast = isLast;\n\n // get the string\n str = axis.labelFormatter.call({\n axis: axis,\n chart: chart,\n isFirst: isFirst,\n isLast: isLast,\n dateTimeLabelFormat: dateTimeLabelFormat,\n value: axis.isLog ? correctFloat(axis.lin2log(value)) : value\n });\n\n // prepare CSS\n //css = width && { width: Math.max(1, Math.round(width - 2 * (labelOptions.padding || 10))) + 'px' };\n\n // first call\n if (!defined(label)) {\n\n tick.label = label =\n defined(str) && labelOptions.enabled ?\n chart.renderer.text(\n str,\n 0,\n 0,\n labelOptions.useHTML\n )\n\n // without position absolute, IE export sometimes is wrong\n .css(merge(labelOptions.style))\n\n .add(axis.labelGroup) :\n null;\n tick.labelLength = label && label.getBBox().width; // Un-rotated length\n tick.rotation = 0; // Base value to detect change for new calls to getBBox\n\n // update\n } else if (label) {\n label.attr({\n text: str\n });\n }\n },\n\n /**\n * Get the offset height or width of the label\n */\n getLabelSize: function() {\n return this.label ?\n this.label.getBBox()[this.axis.horiz ? 'height' : 'width'] :\n 0;\n },\n\n /**\n * Handle the label overflow by adjusting the labels to the left and right edge, or\n * hide them if they collide into the neighbour label.\n */\n handleOverflow: function(xy) {\n var axis = this.axis,\n pxPos = xy.x,\n chartWidth = axis.chart.chartWidth,\n spacing = axis.chart.spacing,\n leftBound = pick(axis.labelLeft, Math.min(axis.pos, spacing[3])),\n rightBound = pick(axis.labelRight, Math.max(axis.pos + axis.len, chartWidth - spacing[1])),\n label = this.label,\n rotation = this.rotation,\n factor = {\n left: 0,\n center: 0.5,\n right: 1\n }[axis.labelAlign],\n labelWidth = label.getBBox().width,\n slotWidth = axis.getSlotWidth(),\n modifiedSlotWidth = slotWidth,\n xCorrection = factor,\n goRight = 1,\n leftPos,\n rightPos,\n textWidth,\n css = {};\n\n // Check if the label overshoots the chart spacing box. If it does, move it.\n // If it now overshoots the slotWidth, add ellipsis.\n if (!rotation) {\n leftPos = pxPos - factor * labelWidth;\n rightPos = pxPos + (1 - factor) * labelWidth;\n\n if (leftPos < leftBound) {\n modifiedSlotWidth = xy.x + modifiedSlotWidth * (1 - factor) - leftBound;\n } else if (rightPos > rightBound) {\n modifiedSlotWidth = rightBound - xy.x + modifiedSlotWidth * factor;\n goRight = -1;\n }\n\n modifiedSlotWidth = Math.min(slotWidth, modifiedSlotWidth); // #4177\n if (modifiedSlotWidth < slotWidth && axis.labelAlign === 'center') {\n xy.x += goRight * (slotWidth - modifiedSlotWidth - xCorrection *\n (slotWidth - Math.min(labelWidth, modifiedSlotWidth)));\n }\n // If the label width exceeds the available space, set a text width to be\n // picked up below. Also, if a width has been set before, we need to set a new\n // one because the reported labelWidth will be limited by the box (#3938).\n if (labelWidth > modifiedSlotWidth || (axis.autoRotation && (label.styles || {}).width)) {\n textWidth = modifiedSlotWidth;\n }\n\n // Add ellipsis to prevent rotated labels to be clipped against the edge of the chart\n } else if (rotation < 0 && pxPos - factor * labelWidth < leftBound) {\n textWidth = Math.round(pxPos / Math.cos(rotation * deg2rad) - leftBound);\n } else if (rotation > 0 && pxPos + factor * labelWidth > rightBound) {\n textWidth = Math.round((chartWidth - pxPos) / Math.cos(rotation * deg2rad));\n }\n\n if (textWidth) {\n css.width = textWidth;\n if (!(axis.options.labels.style || {}).textOverflow) {\n css.textOverflow = 'ellipsis';\n }\n label.css(css);\n }\n },\n\n /**\n * Get the x and y position for ticks and labels\n */\n getPosition: function(horiz, pos, tickmarkOffset, old) {\n var axis = this.axis,\n chart = axis.chart,\n cHeight = (old && chart.oldChartHeight) || chart.chartHeight;\n\n return {\n x: horiz ?\n axis.translate(pos + tickmarkOffset, null, null, old) + axis.transB : axis.left + axis.offset +\n (axis.opposite ?\n ((old && chart.oldChartWidth) || chart.chartWidth) - axis.right - axis.left :\n 0\n ),\n\n y: horiz ?\n cHeight - axis.bottom + axis.offset - (axis.opposite ? axis.height : 0) : cHeight - axis.translate(pos + tickmarkOffset, null, null, old) - axis.transB\n };\n\n },\n\n /**\n * Get the x, y position of the tick label\n */\n getLabelPosition: function(x, y, label, horiz, labelOptions, tickmarkOffset, index, step) {\n var axis = this.axis,\n transA = axis.transA,\n reversed = axis.reversed,\n staggerLines = axis.staggerLines,\n rotCorr = axis.tickRotCorr || {\n x: 0,\n y: 0\n },\n yOffset = labelOptions.y,\n line;\n\n if (!defined(yOffset)) {\n if (axis.side === 0) {\n yOffset = label.rotation ? -8 : -label.getBBox().height;\n } else if (axis.side === 2) {\n yOffset = rotCorr.y + 8;\n } else {\n // #3140, #3140\n yOffset = Math.cos(label.rotation * deg2rad) * (rotCorr.y - label.getBBox(false, 0).height / 2);\n }\n }\n\n x = x + labelOptions.x + rotCorr.x - (tickmarkOffset && horiz ?\n tickmarkOffset * transA * (reversed ? -1 : 1) : 0);\n y = y + yOffset - (tickmarkOffset && !horiz ?\n tickmarkOffset * transA * (reversed ? 1 : -1) : 0);\n\n // Correct for staggered labels\n if (staggerLines) {\n line = (index / (step || 1) % staggerLines);\n if (axis.opposite) {\n line = staggerLines - line - 1;\n }\n y += line * (axis.labelOffset / staggerLines);\n }\n\n return {\n x: x,\n y: Math.round(y)\n };\n },\n\n /**\n * Extendible method to return the path of the marker\n */\n getMarkPath: function(x, y, tickLength, tickWidth, horiz, renderer) {\n return renderer.crispLine([\n 'M',\n x,\n y,\n 'L',\n x + (horiz ? 0 : -tickLength),\n y + (horiz ? tickLength : 0)\n ], tickWidth);\n },\n\n /**\n * Renders the gridLine.\n * @param {Boolean} old Whether or not the tick is old\n * @param {number} opacity The opacity of the grid line\n * @param {number} reverseCrisp Modifier for avoiding overlapping 1 or -1\n * @return {undefined}\n */\n renderGridLine: function(old, opacity, reverseCrisp) {\n var tick = this,\n axis = tick.axis,\n options = axis.options,\n gridLine = tick.gridLine,\n gridLinePath,\n attribs = {},\n pos = tick.pos,\n type = tick.type,\n tickmarkOffset = axis.tickmarkOffset,\n renderer = axis.chart.renderer;\n\n\n var gridPrefix = type ? type + 'Grid' : 'grid',\n gridLineWidth = options[gridPrefix + 'LineWidth'],\n gridLineColor = options[gridPrefix + 'LineColor'],\n dashStyle = options[gridPrefix + 'LineDashStyle'];\n\n\n if (!gridLine) {\n\n attribs.stroke = gridLineColor;\n attribs['stroke-width'] = gridLineWidth;\n if (dashStyle) {\n attribs.dashstyle = dashStyle;\n }\n\n if (!type) {\n attribs.zIndex = 1;\n }\n if (old) {\n attribs.opacity = 0;\n }\n tick.gridLine = gridLine = renderer.path()\n .attr(attribs)\n .addClass(\n 'highcharts-' + (type ? type + '-' : '') + 'grid-line'\n )\n .add(axis.gridGroup);\n }\n\n // If the parameter 'old' is set, the current call will be followed\n // by another call, therefore do not do any animations this time\n if (!old && gridLine) {\n gridLinePath = axis.getPlotLinePath(\n pos + tickmarkOffset,\n gridLine.strokeWidth() * reverseCrisp,\n old, true\n );\n if (gridLinePath) {\n gridLine[tick.isNew ? 'attr' : 'animate']({\n d: gridLinePath,\n opacity: opacity\n });\n }\n }\n },\n\n /**\n * Renders the tick mark.\n * @param {Object} xy The position vector of the mark\n * @param {number} xy.x The x position of the mark\n * @param {number} xy.y The y position of the mark\n * @param {number} opacity The opacity of the mark\n * @param {number} reverseCrisp Modifier for avoiding overlapping 1 or -1\n * @return {undefined}\n */\n renderMark: function(xy, opacity, reverseCrisp) {\n var tick = this,\n axis = tick.axis,\n options = axis.options,\n renderer = axis.chart.renderer,\n type = tick.type,\n tickPrefix = type ? type + 'Tick' : 'tick',\n tickSize = axis.tickSize(tickPrefix),\n mark = tick.mark,\n isNewMark = !mark,\n x = xy.x,\n y = xy.y;\n\n\n var tickWidth = pick(\n options[tickPrefix + 'Width'], !type && axis.isXAxis ? 1 : 0\n ), // X axis defaults to 1\n tickColor = options[tickPrefix + 'Color'];\n\n\n if (tickSize) {\n\n // negate the length\n if (axis.opposite) {\n tickSize[0] = -tickSize[0];\n }\n\n // First time, create it\n if (isNewMark) {\n tick.mark = mark = renderer.path()\n .addClass('highcharts-' + (type ? type + '-' : '') + 'tick')\n .add(axis.axisGroup);\n\n\n mark.attr({\n stroke: tickColor,\n 'stroke-width': tickWidth\n });\n\n }\n mark[isNewMark ? 'attr' : 'animate']({\n d: tick.getMarkPath(\n x,\n y,\n tickSize[0],\n mark.strokeWidth() * reverseCrisp,\n axis.horiz,\n renderer),\n opacity: opacity\n });\n\n }\n },\n\n /**\n * Renders the tick label.\n * Note: The label should already be created in init(), so it should only\n * have to be moved into place.\n * @param {Object} xy The position vector of the label\n * @param {number} xy.x The x position of the label\n * @param {number} xy.y The y position of the label\n * @param {Boolean} old Whether or not the tick is old\n * @param {number} opacity The opacity of the label\n * @param {number} index The index of the tick\n * @return {undefined}\n */\n renderLabel: function(xy, old, opacity, index) {\n var tick = this,\n axis = tick.axis,\n horiz = axis.horiz,\n options = axis.options,\n label = tick.label,\n labelOptions = options.labels,\n step = labelOptions.step,\n tickmarkOffset = axis.tickmarkOffset,\n show = true,\n x = xy.x,\n y = xy.y;\n if (label && isNumber(x)) {\n label.xy = xy = tick.getLabelPosition(\n x,\n y,\n label,\n horiz,\n labelOptions,\n tickmarkOffset,\n index,\n step\n );\n\n // Apply show first and show last. If the tick is both first and\n // last, it is a single centered tick, in which case we show the\n // label anyway (#2100).\n if (\n (\n tick.isFirst &&\n !tick.isLast &&\n !pick(options.showFirstLabel, 1)\n ) ||\n (\n tick.isLast &&\n !tick.isFirst &&\n !pick(options.showLastLabel, 1)\n )\n ) {\n show = false;\n\n // Handle label overflow and show or hide accordingly\n } else if (horiz && !axis.isRadial && !labelOptions.step &&\n !labelOptions.rotation && !old && opacity !== 0) {\n tick.handleOverflow(xy);\n }\n\n // apply step\n if (step && index % step) {\n // show those indices dividable by step\n show = false;\n }\n\n // Set the new position, and show or hide\n if (show && isNumber(xy.y)) {\n xy.opacity = opacity;\n label[tick.isNewLabel ? 'attr' : 'animate'](xy);\n tick.isNewLabel = false;\n } else {\n label.attr('y', -9999); // #1338\n tick.isNewLabel = true;\n }\n tick.isNew = false;\n }\n },\n\n /**\n * Put everything in place\n *\n * @param index {Number}\n * @param old {Boolean} Use old coordinates to prepare an animation into new\n * position\n */\n render: function(index, old, opacity) {\n var tick = this,\n axis = tick.axis,\n horiz = axis.horiz,\n pos = tick.pos,\n tickmarkOffset = axis.tickmarkOffset,\n xy = tick.getPosition(horiz, pos, tickmarkOffset, old),\n x = xy.x,\n y = xy.y,\n reverseCrisp = ((horiz && x === axis.pos + axis.len) ||\n (!horiz && y === axis.pos)) ? -1 : 1; // #1480, #1687\n\n opacity = pick(opacity, 1);\n this.isActive = true;\n\n // Create the grid line\n this.renderGridLine(old, opacity, reverseCrisp);\n\n // create the tick mark\n this.renderMark(xy, opacity, reverseCrisp);\n\n // the label is created on init - now move it into place\n this.renderLabel(xy, old, opacity, index);\n },\n\n /**\n * Destructor for the tick prototype\n */\n destroy: function() {\n destroyObjectProperties(this, this.axis);\n }\n };\n\n }(Highcharts));\n var Axis = (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n\n var addEvent = H.addEvent,\n animObject = H.animObject,\n arrayMax = H.arrayMax,\n arrayMin = H.arrayMin,\n color = H.color,\n correctFloat = H.correctFloat,\n defaultOptions = H.defaultOptions,\n defined = H.defined,\n deg2rad = H.deg2rad,\n destroyObjectProperties = H.destroyObjectProperties,\n each = H.each,\n extend = H.extend,\n fireEvent = H.fireEvent,\n format = H.format,\n getMagnitude = H.getMagnitude,\n grep = H.grep,\n inArray = H.inArray,\n isArray = H.isArray,\n isNumber = H.isNumber,\n isString = H.isString,\n merge = H.merge,\n normalizeTickInterval = H.normalizeTickInterval,\n objectEach = H.objectEach,\n pick = H.pick,\n removeEvent = H.removeEvent,\n splat = H.splat,\n syncTimeout = H.syncTimeout,\n Tick = H.Tick;\n\n /**\n * Create a new axis object. Called internally when instanciating a new chart or\n * adding axes by {@link Highcharts.Chart#addAxis}.\n *\n * A chart can have from 0 axes (pie chart) to multiples. In a normal, single\n * series cartesian chart, there is one X axis and one Y axis.\n * \n * The X axis or axes are referenced by {@link Highcharts.Chart.xAxis}, which is\n * an array of Axis objects. If there is only one axis, it can be referenced\n * through `chart.xAxis[0]`, and multiple axes have increasing indices. The same\n * pattern goes for Y axes.\n * \n * If you need to get the axes from a series object, use the `series.xAxis` and\n * `series.yAxis` properties. These are not arrays, as one series can only be\n * associated to one X and one Y axis.\n * \n * A third way to reference the axis programmatically is by `id`. Add an `id` in\n * the axis configuration options, and get the axis by\n * {@link Highcharts.Chart#get}.\n * \n * Configuration options for the axes are given in options.xAxis and\n * options.yAxis.\n * \n * @class Highcharts.Axis\n * @memberOf Highcharts\n * @param {Highcharts.Chart} chart - The Chart instance to apply the axis on.\n * @param {Object} options - Axis options\n */\n var Axis = function() {\n this.init.apply(this, arguments);\n };\n\n H.extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n\n /**\n * Default options for the X axis - the Y axis has extended defaults.\n *\n * @private\n * @type {Object}\n */\n defaultOptions: {\n // allowDecimals: null,\n // alternateGridColor: null,\n // categories: [],\n dateTimeLabelFormats: {\n millisecond: '%H:%M:%S.%L',\n second: '%H:%M:%S',\n minute: '%H:%M',\n hour: '%H:%M',\n day: '%e. %b',\n week: '%e. %b',\n month: '%b \\'%y',\n year: '%Y'\n },\n endOnTick: false,\n // reversed: false,\n\n labels: {\n enabled: true,\n // rotation: 0,\n // align: 'center',\n // step: null,\n\n style: {\n color: '#666666',\n cursor: 'default',\n fontSize: '11px'\n },\n\n x: 0\n //y: undefined\n /*formatter: function () {\n return this.value;\n },*/\n },\n //linkedTo: null,\n //max: undefined,\n //min: undefined,\n minPadding: 0.01,\n maxPadding: 0.01,\n //minRange: null,\n //minorTickInterval: null,\n minorTickLength: 2,\n minorTickPosition: 'outside', // inside or outside\n //opposite: false,\n //offset: 0,\n //plotBands: [{\n // events: {},\n // zIndex: 1,\n // labels: { align, x, verticalAlign, y, style, rotation, textAlign }\n //}],\n //plotLines: [{\n // events: {}\n // dashStyle: {}\n // zIndex:\n // labels: { align, x, verticalAlign, y, style, rotation, textAlign }\n //}],\n //reversed: false,\n // showFirstLabel: true,\n // showLastLabel: true,\n startOfWeek: 1,\n startOnTick: false,\n //tickInterval: null,\n tickLength: 10,\n tickmarkPlacement: 'between', // on or between\n tickPixelInterval: 100,\n tickPosition: 'outside',\n title: {\n //text: null,\n align: 'middle', // low, middle or high\n //margin: 0 for horizontal, 10 for vertical axes,\n // reserveSpace: true,\n //rotation: 0,\n //side: 'outside',\n\n style: {\n color: '#666666'\n }\n\n //x: 0,\n //y: 0\n },\n type: 'linear', // linear, logarithmic or datetime\n //visible: true\n\n minorGridLineColor: '#f2f2f2',\n // minorGridLineDashStyle: null,\n minorGridLineWidth: 1,\n minorTickColor: '#999999',\n //minorTickWidth: 0,\n lineColor: '#ccd6eb',\n lineWidth: 1,\n gridLineColor: '#e6e6e6',\n // gridLineDashStyle: 'solid',\n // gridLineWidth: 0,\n tickColor: '#ccd6eb'\n // tickWidth: 1\n\n },\n\n /**\n * This options set extends the defaultOptions for Y axes.\n *\n * @private\n * @type {Object}\n */\n defaultYAxisOptions: {\n endOnTick: true,\n tickPixelInterval: 72,\n showLastLabel: true,\n labels: {\n x: -8\n },\n maxPadding: 0.05,\n minPadding: 0.05,\n startOnTick: true,\n title: {\n rotation: 270,\n text: 'Values'\n },\n stackLabels: {\n enabled: false,\n //align: dynamic,\n //y: dynamic,\n //x: dynamic,\n //verticalAlign: dynamic,\n //textAlign: dynamic,\n //rotation: 0,\n formatter: function() {\n return H.numberFormat(this.total, -1);\n },\n\n style: {\n fontSize: '11px',\n fontWeight: 'bold',\n color: '#000000',\n textOutline: '1px contrast'\n }\n\n },\n\n gridLineWidth: 1,\n lineWidth: 0\n // tickWidth: 0\n\n },\n\n /**\n * These options extend the defaultOptions for left axes.\n * \n * @private\n * @type {Object}\n */\n defaultLeftAxisOptions: {\n labels: {\n x: -15\n },\n title: {\n rotation: 270\n }\n },\n\n /**\n * These options extend the defaultOptions for right axes.\n *\n * @private\n * @type {Object}\n */\n defaultRightAxisOptions: {\n labels: {\n x: 15\n },\n title: {\n rotation: 90\n }\n },\n\n /**\n * These options extend the defaultOptions for bottom axes.\n *\n * @private\n * @type {Object}\n */\n defaultBottomAxisOptions: {\n labels: {\n autoRotation: [-45],\n x: 0\n // overflow: undefined,\n // staggerLines: null\n },\n title: {\n rotation: 0\n }\n },\n /**\n * These options extend the defaultOptions for top axes.\n *\n * @private\n * @type {Object}\n */\n defaultTopAxisOptions: {\n labels: {\n autoRotation: [-45],\n x: 0\n // overflow: undefined\n // staggerLines: null\n },\n title: {\n rotation: 0\n }\n },\n\n /**\n * Initialize the axis\n */\n init: function(chart, userOptions) {\n\n\n var isXAxis = userOptions.isX,\n axis = this;\n\n axis.chart = chart;\n\n // Flag, is the axis horizontal\n axis.horiz = chart.inverted && !axis.isZAxis ? !isXAxis : isXAxis;\n\n // Flag, isXAxis\n axis.isXAxis = isXAxis;\n axis.coll = axis.coll || (isXAxis ? 'xAxis' : 'yAxis');\n\n axis.opposite = userOptions.opposite; // needed in setOptions\n axis.side = userOptions.side || (axis.horiz ?\n (axis.opposite ? 0 : 2) : // top : bottom\n (axis.opposite ? 1 : 3)); // right : left\n\n axis.setOptions(userOptions);\n\n\n var options = this.options,\n type = options.type,\n isDatetimeAxis = type === 'datetime';\n\n axis.labelFormatter = options.labels.formatter ||\n axis.defaultLabelFormatter; // can be overwritten by dynamic format\n\n\n // Flag, stagger lines or not\n axis.userOptions = userOptions;\n\n //axis.axisTitleMargin = undefined,// = options.title.margin,\n axis.minPixelPadding = 0;\n\n axis.reversed = options.reversed;\n axis.visible = options.visible !== false;\n axis.zoomEnabled = options.zoomEnabled !== false;\n\n // Initial categories\n axis.hasNames = type === 'category' || options.categories === true;\n axis.categories = options.categories || axis.hasNames;\n axis.names = axis.names || []; // Preserve on update (#3830)\n\n // Elements\n //axis.axisGroup = undefined;\n //axis.gridGroup = undefined;\n //axis.axisTitle = undefined;\n //axis.axisLine = undefined;\n\n // Placeholder for plotlines and plotbands groups\n axis.plotLinesAndBandsGroups = {};\n\n // Shorthand types\n axis.isLog = type === 'logarithmic';\n axis.isDatetimeAxis = isDatetimeAxis;\n axis.positiveValuesOnly = axis.isLog && !axis.allowNegativeLog;\n\n // Flag, if axis is linked to another axis\n axis.isLinked = defined(options.linkedTo);\n // Linked axis.\n //axis.linkedParent = undefined;\n\n // Major ticks\n axis.ticks = {};\n axis.labelEdge = [];\n // Minor ticks\n axis.minorTicks = {};\n\n // List of plotLines/Bands\n axis.plotLinesAndBands = [];\n\n // Alternate bands\n axis.alternateBands = {};\n\n // Axis metrics\n //axis.left = undefined;\n //axis.top = undefined;\n //axis.width = undefined;\n //axis.height = undefined;\n //axis.bottom = undefined;\n //axis.right = undefined;\n //axis.transA = undefined;\n //axis.transB = undefined;\n //axis.oldTransA = undefined;\n axis.len = 0;\n //axis.oldMin = undefined;\n //axis.oldMax = undefined;\n //axis.oldUserMin = undefined;\n //axis.oldUserMax = undefined;\n //axis.oldAxisLength = undefined;\n axis.minRange = axis.userMinRange = options.minRange || options.maxZoom;\n axis.range = options.range;\n axis.offset = options.offset || 0;\n\n\n // Dictionary for stacks\n axis.stacks = {};\n axis.oldStacks = {};\n axis.stacksTouched = 0;\n\n // Min and max in the data\n //axis.dataMin = undefined,\n //axis.dataMax = undefined,\n\n // The axis range\n axis.max = null;\n axis.min = null;\n\n // User set min and max\n //axis.userMin = undefined,\n //axis.userMax = undefined,\n\n // Crosshair options\n axis.crosshair = pick(\n options.crosshair,\n splat(chart.options.tooltip.crosshairs)[isXAxis ? 0 : 1],\n false\n );\n\n var events = axis.options.events;\n\n // Register. Don't add it again on Axis.update().\n if (inArray(axis, chart.axes) === -1) { // \n if (isXAxis) { // #2713\n chart.axes.splice(chart.xAxis.length, 0, axis);\n } else {\n chart.axes.push(axis);\n }\n\n chart[axis.coll].push(axis);\n }\n\n axis.series = axis.series || []; // populated by Series\n\n // inverted charts have reversed xAxes as default\n if (chart.inverted && !axis.isZAxis && isXAxis && axis.reversed === undefined) {\n axis.reversed = true;\n }\n\n // register event listeners\n objectEach(events, function(event, eventType) {\n addEvent(axis, eventType, event);\n });\n\n // extend logarithmic axis\n axis.lin2log = options.linearToLogConverter || axis.lin2log;\n if (axis.isLog) {\n axis.val2lin = axis.log2lin;\n axis.lin2val = axis.lin2log;\n }\n },\n\n /**\n * Merge and set options\n */\n setOptions: function(userOptions) {\n this.options = merge(\n this.defaultOptions,\n this.coll === 'yAxis' && this.defaultYAxisOptions, [\n this.defaultTopAxisOptions,\n this.defaultRightAxisOptions,\n this.defaultBottomAxisOptions,\n this.defaultLeftAxisOptions\n ][this.side],\n merge(\n defaultOptions[this.coll], // if set in setOptions (#1053)\n userOptions\n )\n );\n },\n\n /**\n * The default label formatter. The context is a special config object for\n * the label. In apps, use the {@link\n * https://api.highcharts.com/highcharts/xAxis.labels.formatter|\n * labels.formatter} instead except when a modification is needed.\n *\n * @private\n */\n defaultLabelFormatter: function() {\n var axis = this.axis,\n value = this.value,\n categories = axis.categories,\n dateTimeLabelFormat = this.dateTimeLabelFormat,\n lang = defaultOptions.lang,\n numericSymbols = lang.numericSymbols,\n numSymMagnitude = lang.numericSymbolMagnitude || 1000,\n i = numericSymbols && numericSymbols.length,\n multi,\n ret,\n formatOption = axis.options.labels.format,\n\n // make sure the same symbol is added for all labels on a linear\n // axis\n numericSymbolDetector = axis.isLog ?\n Math.abs(value) :\n axis.tickInterval;\n\n if (formatOption) {\n ret = format(formatOption, this);\n\n } else if (categories) {\n ret = value;\n\n } else if (dateTimeLabelFormat) { // datetime axis\n ret = H.dateFormat(dateTimeLabelFormat, value);\n\n } else if (i && numericSymbolDetector >= 1000) {\n // Decide whether we should add a numeric symbol like k (thousands)\n // or M (millions). If we are to enable this in tooltip or other\n // places as well, we can move this logic to the numberFormatter and\n // enable it by a parameter.\n while (i-- && ret === undefined) {\n multi = Math.pow(numSymMagnitude, i + 1);\n if (\n numericSymbolDetector >= multi &&\n (value * 10) % multi === 0 &&\n numericSymbols[i] !== null &&\n value !== 0\n ) { // #5480\n ret = H.numberFormat(value / multi, -1) + numericSymbols[i];\n }\n }\n }\n\n if (ret === undefined) {\n if (Math.abs(value) >= 10000) { // add thousands separators\n ret = H.numberFormat(value, -1);\n } else { // small numbers\n ret = H.numberFormat(value, -1, undefined, ''); // #2466\n }\n }\n\n return ret;\n },\n\n /**\n * Get the minimum and maximum for the series of each axis\n */\n getSeriesExtremes: function() {\n var axis = this,\n chart = axis.chart;\n axis.hasVisibleSeries = false;\n\n // Reset properties in case we're redrawing (#3353)\n axis.dataMin = axis.dataMax = axis.threshold = null;\n axis.softThreshold = !axis.isXAxis;\n\n if (axis.buildStacks) {\n axis.buildStacks();\n }\n\n // loop through this axis' series\n each(axis.series, function(series) {\n\n if (series.visible || !chart.options.chart.ignoreHiddenSeries) {\n\n var seriesOptions = series.options,\n xData,\n threshold = seriesOptions.threshold,\n seriesDataMin,\n seriesDataMax;\n\n axis.hasVisibleSeries = true;\n\n // Validate threshold in logarithmic axes\n if (axis.positiveValuesOnly && threshold <= 0) {\n threshold = null;\n }\n\n // Get dataMin and dataMax for X axes\n if (axis.isXAxis) {\n xData = series.xData;\n if (xData.length) {\n // If xData contains values which is not numbers, then\n // filter them out. To prevent performance hit, we only\n // do this after we have already found seriesDataMin\n // because in most cases all data is valid. #5234.\n seriesDataMin = arrayMin(xData);\n if (!isNumber(seriesDataMin) &&\n !(seriesDataMin instanceof Date) // #5010\n ) {\n xData = grep(xData, function(x) {\n return isNumber(x);\n });\n seriesDataMin = arrayMin(xData); // Do it again with valid data\n }\n\n axis.dataMin = Math.min(\n pick(axis.dataMin, xData[0]),\n seriesDataMin\n );\n axis.dataMax = Math.max(\n pick(axis.dataMax, xData[0]),\n arrayMax(xData)\n );\n\n }\n\n // Get dataMin and dataMax for Y axes, as well as handle\n // stacking and processed data\n } else {\n\n // Get this particular series extremes\n series.getExtremes();\n seriesDataMax = series.dataMax;\n seriesDataMin = series.dataMin;\n\n // Get the dataMin and dataMax so far. If percentage is\n // used, the min and max are always 0 and 100. If\n // seriesDataMin and seriesDataMax is null, then series\n // doesn't have active y data, we continue with nulls\n if (defined(seriesDataMin) && defined(seriesDataMax)) {\n axis.dataMin = Math.min(\n pick(axis.dataMin, seriesDataMin),\n seriesDataMin\n );\n axis.dataMax = Math.max(\n pick(axis.dataMax, seriesDataMax),\n seriesDataMax\n );\n }\n\n // Adjust to threshold\n if (defined(threshold)) {\n axis.threshold = threshold;\n }\n // If any series has a hard threshold, it takes precedence\n if (!seriesOptions.softThreshold ||\n axis.positiveValuesOnly\n ) {\n axis.softThreshold = false;\n }\n }\n }\n });\n },\n\n /**\n * Translate from axis value to pixel position on the chart, or back\n *\n */\n translate: function(val, backwards, cvsCoord, old, handleLog, pointPlacement) {\n var axis = this.linkedParent || this, // #1417\n sign = 1,\n cvsOffset = 0,\n localA = old ? axis.oldTransA : axis.transA,\n localMin = old ? axis.oldMin : axis.min,\n returnValue,\n minPixelPadding = axis.minPixelPadding,\n doPostTranslate = (axis.isOrdinal || axis.isBroken || (axis.isLog && handleLog)) && axis.lin2val;\n\n if (!localA) {\n localA = axis.transA;\n }\n\n // In vertical axes, the canvas coordinates start from 0 at the top like in\n // SVG.\n if (cvsCoord) {\n sign *= -1; // canvas coordinates inverts the value\n cvsOffset = axis.len;\n }\n\n // Handle reversed axis\n if (axis.reversed) {\n sign *= -1;\n cvsOffset -= sign * (axis.sector || axis.len);\n }\n\n // From pixels to value\n if (backwards) { // reverse translation\n\n val = val * sign + cvsOffset;\n val -= minPixelPadding;\n returnValue = val / localA + localMin; // from chart pixel to value\n if (doPostTranslate) { // log and ordinal axes\n returnValue = axis.lin2val(returnValue);\n }\n\n // From value to pixels\n } else {\n if (doPostTranslate) { // log and ordinal axes\n val = axis.val2lin(val);\n }\n returnValue = sign * (val - localMin) * localA + cvsOffset +\n (sign * minPixelPadding) +\n (isNumber(pointPlacement) ? localA * pointPlacement : 0);\n }\n\n return returnValue;\n },\n\n /**\n * Translate a value in terms of axis units into pixels within the chart.\n * \n * @param {Number} value\n * A value in terms of axis units.\n * @param {Boolean} paneCoordinates\n * Whether to return the pixel coordinate relative to the chart or\n * just the axis/pane itself.\n * @return {Number} Pixel position of the value on the chart or axis.\n */\n toPixels: function(value, paneCoordinates) {\n return this.translate(value, false, !this.horiz, null, true) +\n (paneCoordinates ? 0 : this.pos);\n },\n\n /**\n * Translate a pixel position along the axis to a value in terms of axis\n * units.\n * @param {Number} pixel\n * The pixel value coordinate.\n * @param {Boolean} paneCoordiantes\n * Whether the input pixel is relative to the chart or just the\n * axis/pane itself.\n * @return {Number} The axis value.\n */\n toValue: function(pixel, paneCoordinates) {\n return this.translate(\n pixel - (paneCoordinates ? 0 : this.pos),\n true, !this.horiz,\n null,\n true\n );\n },\n\n /**\n * Create the path for a plot line that goes from the given value on\n * this axis, across the plot to the opposite side\n * @param {Number} value\n * @param {Number} lineWidth Used for calculation crisp line\n * @param {Number] old Use old coordinates (for resizing and rescaling)\n */\n getPlotLinePath: function(value, lineWidth, old, force, translatedValue) {\n var axis = this,\n chart = axis.chart,\n axisLeft = axis.left,\n axisTop = axis.top,\n x1,\n y1,\n x2,\n y2,\n cHeight = (old && chart.oldChartHeight) || chart.chartHeight,\n cWidth = (old && chart.oldChartWidth) || chart.chartWidth,\n skip,\n transB = axis.transB,\n /**\n * Check if x is between a and b. If not, either move to a/b or skip,\n * depending on the force parameter.\n */\n between = function(x, a, b) {\n if (x < a || x > b) {\n if (force) {\n x = Math.min(Math.max(a, x), b);\n } else {\n skip = true;\n }\n }\n return x;\n };\n\n translatedValue = pick(translatedValue, axis.translate(value, null, null, old));\n x1 = x2 = Math.round(translatedValue + transB);\n y1 = y2 = Math.round(cHeight - translatedValue - transB);\n if (!isNumber(translatedValue)) { // no min or max\n skip = true;\n\n } else if (axis.horiz) {\n y1 = axisTop;\n y2 = cHeight - axis.bottom;\n x1 = x2 = between(x1, axisLeft, axisLeft + axis.width);\n } else {\n x1 = axisLeft;\n x2 = cWidth - axis.right;\n y1 = y2 = between(y1, axisTop, axisTop + axis.height);\n }\n return skip && !force ?\n null :\n chart.renderer.crispLine(['M', x1, y1, 'L', x2, y2], lineWidth || 1);\n },\n\n /**\n * Internal function to et the tick positions of a linear axis to round\n * values like whole tens or every five.\n *\n * @param {Number} tickInterval\n * The normalized tick interval\n * @param {Number} min\n * Axis minimum.\n * @param {Number} max\n * Axis maximum.\n *\n * @return {Array.}\n * An array of numbers where ticks should be placed.\n */\n getLinearTickPositions: function(tickInterval, min, max) {\n var pos,\n lastPos,\n roundedMin = correctFloat(Math.floor(min / tickInterval) * tickInterval),\n roundedMax = correctFloat(Math.ceil(max / tickInterval) * tickInterval),\n tickPositions = [];\n\n // For single points, add a tick regardless of the relative position\n // (#2662, #6274)\n if (this.single) {\n return [min];\n }\n\n // Populate the intermediate values\n pos = roundedMin;\n while (pos <= roundedMax) {\n\n // Place the tick on the rounded value\n tickPositions.push(pos);\n\n // Always add the raw tickInterval, not the corrected one.\n pos = correctFloat(pos + tickInterval);\n\n // If the interval is not big enough in the current min - max range to actually increase\n // the loop variable, we need to break out to prevent endless loop. Issue #619\n if (pos === lastPos) {\n break;\n }\n\n // Record the last value\n lastPos = pos;\n }\n return tickPositions;\n },\n\n /**\n * Return the minor tick positions. For logarithmic axes, reuse the same logic\n * as for major ticks.\n */\n getMinorTickPositions: function() {\n var axis = this,\n options = axis.options,\n tickPositions = axis.tickPositions,\n minorTickInterval = axis.minorTickInterval,\n minorTickPositions = [],\n pos,\n pointRangePadding = axis.pointRangePadding || 0,\n min = axis.min - pointRangePadding, // #1498\n max = axis.max + pointRangePadding, // #1498\n range = max - min;\n\n // If minor ticks get too dense, they are hard to read, and may cause long running script. So we don't draw them.\n if (range && range / minorTickInterval < axis.len / 3) { // #3875\n\n if (axis.isLog) {\n // For each interval in the major ticks, compute the minor ticks\n // separately.\n each(this.paddedTicks, function(pos, i, paddedTicks) {\n if (i) {\n minorTickPositions.push.apply(\n minorTickPositions,\n axis.getLogTickPositions(\n minorTickInterval,\n paddedTicks[i - 1],\n paddedTicks[i],\n true\n )\n );\n }\n });\n\n } else if (axis.isDatetimeAxis && options.minorTickInterval === 'auto') { // #1314\n minorTickPositions = minorTickPositions.concat(\n axis.getTimeTicks(\n axis.normalizeTimeTickInterval(minorTickInterval),\n min,\n max,\n options.startOfWeek\n )\n );\n } else {\n for (\n pos = min + (tickPositions[0] - min) % minorTickInterval; pos <= max; pos += minorTickInterval\n ) {\n // Very, very, tight grid lines (#5771)\n if (pos === minorTickPositions[0]) {\n break;\n }\n minorTickPositions.push(pos);\n }\n }\n }\n\n if (minorTickPositions.length !== 0) {\n axis.trimTicks(minorTickPositions); // #3652 #3743 #1498 #6330\n }\n return minorTickPositions;\n },\n\n /**\n * Adjust the min and max for the minimum range. Keep in mind that the series data is\n * not yet processed, so we don't have information on data cropping and grouping, or\n * updated axis.pointRange or series.pointRange. The data can't be processed until\n * we have finally established min and max.\n *\n * @private\n */\n adjustForMinRange: function() {\n var axis = this,\n options = axis.options,\n min = axis.min,\n max = axis.max,\n zoomOffset,\n spaceAvailable,\n closestDataRange,\n i,\n distance,\n xData,\n loopLength,\n minArgs,\n maxArgs,\n minRange;\n\n // Set the automatic minimum range based on the closest point distance\n if (axis.isXAxis && axis.minRange === undefined && !axis.isLog) {\n\n if (defined(options.min) || defined(options.max)) {\n axis.minRange = null; // don't do this again\n\n } else {\n\n // Find the closest distance between raw data points, as opposed to\n // closestPointRange that applies to processed points (cropped and grouped)\n each(axis.series, function(series) {\n xData = series.xData;\n loopLength = series.xIncrement ? 1 : xData.length - 1;\n for (i = loopLength; i > 0; i--) {\n distance = xData[i] - xData[i - 1];\n if (closestDataRange === undefined || distance < closestDataRange) {\n closestDataRange = distance;\n }\n }\n });\n axis.minRange = Math.min(closestDataRange * 5, axis.dataMax - axis.dataMin);\n }\n }\n\n // if minRange is exceeded, adjust\n if (max - min < axis.minRange) {\n\n spaceAvailable = axis.dataMax - axis.dataMin >= axis.minRange;\n minRange = axis.minRange;\n zoomOffset = (minRange - max + min) / 2;\n\n // if min and max options have been set, don't go beyond it\n minArgs = [min - zoomOffset, pick(options.min, min - zoomOffset)];\n if (spaceAvailable) { // if space is available, stay within the data range\n minArgs[2] = axis.isLog ? axis.log2lin(axis.dataMin) : axis.dataMin;\n }\n min = arrayMax(minArgs);\n\n maxArgs = [min + minRange, pick(options.max, min + minRange)];\n if (spaceAvailable) { // if space is availabe, stay within the data range\n maxArgs[2] = axis.isLog ? axis.log2lin(axis.dataMax) : axis.dataMax;\n }\n\n max = arrayMin(maxArgs);\n\n // now if the max is adjusted, adjust the min back\n if (max - min < minRange) {\n minArgs[0] = max - minRange;\n minArgs[1] = pick(options.min, max - minRange);\n min = arrayMax(minArgs);\n }\n }\n\n // Record modified extremes\n axis.min = min;\n axis.max = max;\n },\n\n /**\n * Find the closestPointRange across all series.\n *\n * @private\n */\n getClosest: function() {\n var ret;\n\n if (this.categories) {\n ret = 1;\n } else {\n each(this.series, function(series) {\n var seriesClosest = series.closestPointRange,\n visible = series.visible ||\n !series.chart.options.chart.ignoreHiddenSeries;\n\n if (!series.noSharedTooltip &&\n defined(seriesClosest) &&\n visible\n ) {\n ret = defined(ret) ?\n Math.min(ret, seriesClosest) :\n seriesClosest;\n }\n });\n }\n return ret;\n },\n\n /**\n * When a point name is given and no x, search for the name in the existing categories,\n * or if categories aren't provided, search names or create a new category (#2522).\n */\n nameToX: function(point) {\n var explicitCategories = isArray(this.categories),\n names = explicitCategories ? this.categories : this.names,\n nameX = point.options.x,\n x;\n\n point.series.requireSorting = false;\n\n if (!defined(nameX)) {\n nameX = this.options.uniqueNames === false ?\n point.series.autoIncrement() :\n inArray(point.name, names);\n }\n if (nameX === -1) { // The name is not found in currenct categories\n if (!explicitCategories) {\n x = names.length;\n }\n } else {\n x = nameX;\n }\n\n // Write the last point's name to the names array\n if (x !== undefined) {\n this.names[x] = point.name;\n }\n\n return x;\n },\n\n /**\n * When changes have been done to series data, update the axis.names.\n */\n updateNames: function() {\n var axis = this;\n\n if (this.names.length > 0) {\n this.names.length = 0;\n this.minRange = this.userMinRange; // Reset\n each(this.series || [], function(series) {\n\n // Reset incrementer (#5928)\n series.xIncrement = null;\n\n // When adding a series, points are not yet generated\n if (!series.points || series.isDirtyData) {\n series.processData();\n series.generatePoints();\n }\n\n each(series.points, function(point, i) {\n var x;\n if (point.options) {\n x = axis.nameToX(point);\n if (x !== undefined && x !== point.x) {\n point.x = x;\n series.xData[i] = x;\n }\n }\n });\n });\n }\n },\n\n /**\n * Update translation information\n */\n setAxisTranslation: function(saveOld) {\n var axis = this,\n range = axis.max - axis.min,\n pointRange = axis.axisPointRange || 0,\n closestPointRange,\n minPointOffset = 0,\n pointRangePadding = 0,\n linkedParent = axis.linkedParent,\n ordinalCorrection,\n hasCategories = !!axis.categories,\n transA = axis.transA,\n isXAxis = axis.isXAxis;\n\n // Adjust translation for padding. Y axis with categories need to go through the same (#1784).\n if (isXAxis || hasCategories || pointRange) {\n\n // Get the closest points\n closestPointRange = axis.getClosest();\n\n if (linkedParent) {\n minPointOffset = linkedParent.minPointOffset;\n pointRangePadding = linkedParent.pointRangePadding;\n } else {\n each(axis.series, function(series) {\n var seriesPointRange = hasCategories ?\n 1 :\n (isXAxis ?\n pick(series.options.pointRange, closestPointRange, 0) :\n (axis.axisPointRange || 0)), // #2806\n pointPlacement = series.options.pointPlacement;\n\n pointRange = Math.max(pointRange, seriesPointRange);\n\n if (!axis.single) {\n // minPointOffset is the value padding to the left of the axis in order to make\n // room for points with a pointRange, typically columns. When the pointPlacement option\n // is 'between' or 'on', this padding does not apply.\n minPointOffset = Math.max(\n minPointOffset,\n isString(pointPlacement) ? 0 : seriesPointRange / 2\n );\n\n // Determine the total padding needed to the length of the axis to make room for the\n // pointRange. If the series' pointPlacement is 'on', no padding is added.\n pointRangePadding = Math.max(\n pointRangePadding,\n pointPlacement === 'on' ? 0 : seriesPointRange\n );\n }\n });\n }\n\n // Record minPointOffset and pointRangePadding\n ordinalCorrection = axis.ordinalSlope && closestPointRange ? axis.ordinalSlope / closestPointRange : 1; // #988, #1853\n axis.minPointOffset = minPointOffset = minPointOffset * ordinalCorrection;\n axis.pointRangePadding = pointRangePadding = pointRangePadding * ordinalCorrection;\n\n // pointRange means the width reserved for each point, like in a column chart\n axis.pointRange = Math.min(pointRange, range);\n\n // closestPointRange means the closest distance between points. In columns\n // it is mostly equal to pointRange, but in lines pointRange is 0 while closestPointRange\n // is some other value\n if (isXAxis) {\n axis.closestPointRange = closestPointRange;\n }\n }\n\n // Secondary values\n if (saveOld) {\n axis.oldTransA = transA;\n }\n axis.translationSlope = axis.transA = transA =\n axis.options.staticScale ||\n axis.len / ((range + pointRangePadding) || 1);\n axis.transB = axis.horiz ? axis.left : axis.bottom; // translation addend\n axis.minPixelPadding = transA * minPointOffset;\n },\n\n minFromRange: function() {\n return this.max - this.range;\n },\n\n /**\n * Set the tick positions to round values and optionally extend the extremes\n * to the nearest tick\n */\n setTickInterval: function(secondPass) {\n var axis = this,\n chart = axis.chart,\n options = axis.options,\n isLog = axis.isLog,\n log2lin = axis.log2lin,\n isDatetimeAxis = axis.isDatetimeAxis,\n isXAxis = axis.isXAxis,\n isLinked = axis.isLinked,\n maxPadding = options.maxPadding,\n minPadding = options.minPadding,\n length,\n linkedParentExtremes,\n tickIntervalOption = options.tickInterval,\n minTickInterval,\n tickPixelIntervalOption = options.tickPixelInterval,\n categories = axis.categories,\n threshold = axis.threshold,\n softThreshold = axis.softThreshold,\n thresholdMin,\n thresholdMax,\n hardMin,\n hardMax;\n\n if (!isDatetimeAxis && !categories && !isLinked) {\n this.getTickAmount();\n }\n\n // Min or max set either by zooming/setExtremes or initial options\n hardMin = pick(axis.userMin, options.min);\n hardMax = pick(axis.userMax, options.max);\n\n // Linked axis gets the extremes from the parent axis\n if (isLinked) {\n axis.linkedParent = chart[axis.coll][options.linkedTo];\n linkedParentExtremes = axis.linkedParent.getExtremes();\n axis.min = pick(linkedParentExtremes.min, linkedParentExtremes.dataMin);\n axis.max = pick(linkedParentExtremes.max, linkedParentExtremes.dataMax);\n if (options.type !== axis.linkedParent.options.type) {\n H.error(11, 1); // Can't link axes of different type\n }\n\n // Initial min and max from the extreme data values\n } else {\n\n // Adjust to hard threshold\n if (!softThreshold && defined(threshold)) {\n if (axis.dataMin >= threshold) {\n thresholdMin = threshold;\n minPadding = 0;\n } else if (axis.dataMax <= threshold) {\n thresholdMax = threshold;\n maxPadding = 0;\n }\n }\n\n axis.min = pick(hardMin, thresholdMin, axis.dataMin);\n axis.max = pick(hardMax, thresholdMax, axis.dataMax);\n\n }\n\n if (isLog) {\n if (\n axis.positiveValuesOnly &&\n !secondPass &&\n Math.min(axis.min, pick(axis.dataMin, axis.min)) <= 0\n ) { // #978\n H.error(10, 1); // Can't plot negative values on log axis\n }\n // The correctFloat cures #934, float errors on full tens. But it\n // was too aggressive for #4360 because of conversion back to lin,\n // therefore use precision 15.\n axis.min = correctFloat(log2lin(axis.min), 15);\n axis.max = correctFloat(log2lin(axis.max), 15);\n }\n\n // handle zoomed range\n if (axis.range && defined(axis.max)) {\n axis.userMin = axis.min = hardMin = Math.max(axis.min, axis.minFromRange()); // #618\n axis.userMax = hardMax = axis.max;\n\n axis.range = null; // don't use it when running setExtremes\n }\n\n // Hook for Highstock Scroller. Consider combining with beforePadding.\n fireEvent(axis, 'foundExtremes');\n\n // Hook for adjusting this.min and this.max. Used by bubble series.\n if (axis.beforePadding) {\n axis.beforePadding();\n }\n\n // adjust min and max for the minimum range\n axis.adjustForMinRange();\n\n // Pad the values to get clear of the chart's edges. To avoid tickInterval taking the padding\n // into account, we do this after computing tick interval (#1337).\n if (!categories && !axis.axisPointRange && !axis.usePercentage && !isLinked && defined(axis.min) && defined(axis.max)) {\n length = axis.max - axis.min;\n if (length) {\n if (!defined(hardMin) && minPadding) {\n axis.min -= length * minPadding;\n }\n if (!defined(hardMax) && maxPadding) {\n axis.max += length * maxPadding;\n }\n }\n }\n\n // Handle options for floor, ceiling, softMin and softMax (#6359)\n if (isNumber(options.softMin)) {\n axis.min = Math.min(axis.min, options.softMin);\n }\n if (isNumber(options.softMax)) {\n axis.max = Math.max(axis.max, options.softMax);\n }\n if (isNumber(options.floor)) {\n axis.min = Math.max(axis.min, options.floor);\n }\n if (isNumber(options.ceiling)) {\n axis.max = Math.min(axis.max, options.ceiling);\n }\n\n\n // When the threshold is soft, adjust the extreme value only if\n // the data extreme and the padded extreme land on either side of the threshold. For example,\n // a series of [0, 1, 2, 3] would make the yAxis add a tick for -1 because of the\n // default minPadding and startOnTick options. This is prevented by the softThreshold\n // option.\n if (softThreshold && defined(axis.dataMin)) {\n threshold = threshold || 0;\n if (!defined(hardMin) && axis.min < threshold && axis.dataMin >= threshold) {\n axis.min = threshold;\n } else if (!defined(hardMax) && axis.max > threshold && axis.dataMax <= threshold) {\n axis.max = threshold;\n }\n }\n\n\n // get tickInterval\n if (axis.min === axis.max || axis.min === undefined || axis.max === undefined) {\n axis.tickInterval = 1;\n } else if (isLinked && !tickIntervalOption &&\n tickPixelIntervalOption === axis.linkedParent.options.tickPixelInterval) {\n axis.tickInterval = tickIntervalOption = axis.linkedParent.tickInterval;\n } else {\n axis.tickInterval = pick(\n tickIntervalOption,\n this.tickAmount ? ((axis.max - axis.min) / Math.max(this.tickAmount - 1, 1)) : undefined,\n categories ? // for categoried axis, 1 is default, for linear axis use tickPix\n 1 :\n // don't let it be more than the data range\n (axis.max - axis.min) * tickPixelIntervalOption / Math.max(axis.len, tickPixelIntervalOption)\n );\n }\n\n // Now we're finished detecting min and max, crop and group series data. This\n // is in turn needed in order to find tick positions in ordinal axes.\n if (isXAxis && !secondPass) {\n each(axis.series, function(series) {\n series.processData(axis.min !== axis.oldMin || axis.max !== axis.oldMax);\n });\n }\n\n // set the translation factor used in translate function\n axis.setAxisTranslation(true);\n\n // hook for ordinal axes and radial axes\n if (axis.beforeSetTickPositions) {\n axis.beforeSetTickPositions();\n }\n\n // hook for extensions, used in Highstock ordinal axes\n if (axis.postProcessTickInterval) {\n axis.tickInterval = axis.postProcessTickInterval(axis.tickInterval);\n }\n\n // In column-like charts, don't cramp in more ticks than there are points (#1943, #4184)\n if (axis.pointRange && !tickIntervalOption) {\n axis.tickInterval = Math.max(axis.pointRange, axis.tickInterval);\n }\n\n // Before normalizing the tick interval, handle minimum tick interval. This applies only if tickInterval is not defined.\n minTickInterval = pick(options.minTickInterval, axis.isDatetimeAxis && axis.closestPointRange);\n if (!tickIntervalOption && axis.tickInterval < minTickInterval) {\n axis.tickInterval = minTickInterval;\n }\n\n // for linear axes, get magnitude and normalize the interval\n if (!isDatetimeAxis && !isLog && !tickIntervalOption) {\n axis.tickInterval = normalizeTickInterval(\n axis.tickInterval,\n null,\n getMagnitude(axis.tickInterval),\n // If the tick interval is between 0.5 and 5 and the axis max is in the order of\n // thousands, chances are we are dealing with years. Don't allow decimals. #3363.\n pick(options.allowDecimals, !(axis.tickInterval > 0.5 && axis.tickInterval < 5 && axis.max > 1000 && axis.max < 9999)), !!this.tickAmount\n );\n }\n\n // Prevent ticks from getting so close that we can't draw the labels\n if (!this.tickAmount) {\n axis.tickInterval = axis.unsquish();\n }\n\n this.setTickPositions();\n },\n\n /**\n * Now we have computed the normalized tickInterval, get the tick positions\n */\n setTickPositions: function() {\n\n var options = this.options,\n tickPositions,\n tickPositionsOption = options.tickPositions,\n tickPositioner = options.tickPositioner,\n startOnTick = options.startOnTick,\n endOnTick = options.endOnTick;\n\n // Set the tickmarkOffset\n this.tickmarkOffset = (this.categories && options.tickmarkPlacement === 'between' &&\n this.tickInterval === 1) ? 0.5 : 0; // #3202\n\n\n // get minorTickInterval\n this.minorTickInterval = options.minorTickInterval === 'auto' && this.tickInterval ?\n this.tickInterval / 5 : options.minorTickInterval;\n\n // When there is only one point, or all points have the same value on\n // this axis, then min and max are equal and tickPositions.length is 0\n // or 1. In this case, add some padding in order to center the point,\n // but leave it with one tick. #1337.\n this.single =\n this.min === this.max &&\n defined(this.min) &&\n !this.tickAmount &&\n (\n // Data is on integer (#6563)\n parseInt(this.min, 10) === this.min ||\n\n // Between integers and decimals are not allowed (#6274)\n options.allowDecimals !== false\n );\n\n // Find the tick positions\n this.tickPositions = tickPositions = tickPositionsOption && tickPositionsOption.slice(); // Work on a copy (#1565)\n if (!tickPositions) {\n\n if (this.isDatetimeAxis) {\n tickPositions = this.getTimeTicks(\n this.normalizeTimeTickInterval(\n this.tickInterval,\n options.units\n ),\n this.min,\n this.max,\n options.startOfWeek,\n this.ordinalPositions,\n this.closestPointRange,\n true\n );\n } else if (this.isLog) {\n tickPositions = this.getLogTickPositions(\n this.tickInterval,\n this.min,\n this.max\n );\n } else {\n tickPositions = this.getLinearTickPositions(\n this.tickInterval,\n this.min,\n this.max\n );\n }\n\n // Too dense ticks, keep only the first and last (#4477)\n if (tickPositions.length > this.len) {\n tickPositions = [tickPositions[0], tickPositions.pop()];\n }\n\n this.tickPositions = tickPositions;\n\n // Run the tick positioner callback, that allows modifying auto tick positions.\n if (tickPositioner) {\n tickPositioner = tickPositioner.apply(this, [this.min, this.max]);\n if (tickPositioner) {\n this.tickPositions = tickPositions = tickPositioner;\n }\n }\n\n }\n\n // Reset min/max or remove extremes based on start/end on tick\n this.paddedTicks = tickPositions.slice(0); // Used for logarithmic minor\n this.trimTicks(tickPositions, startOnTick, endOnTick);\n if (!this.isLinked) {\n\n // Substract half a unit (#2619, #2846, #2515, #3390)\n if (this.single) {\n this.min -= 0.5;\n this.max += 0.5;\n }\n if (!tickPositionsOption && !tickPositioner) {\n this.adjustTickAmount();\n }\n }\n },\n\n /**\n * Handle startOnTick and endOnTick by either adapting to padding min/max or rounded min/max\n */\n trimTicks: function(tickPositions, startOnTick, endOnTick) {\n var roundedMin = tickPositions[0],\n roundedMax = tickPositions[tickPositions.length - 1],\n minPointOffset = this.minPointOffset || 0;\n\n if (!this.isLinked) {\n if (startOnTick && roundedMin !== -Infinity) { // #6502\n this.min = roundedMin;\n } else {\n while (this.min - minPointOffset > tickPositions[0]) {\n tickPositions.shift();\n }\n }\n\n if (endOnTick) {\n this.max = roundedMax;\n } else {\n while (this.max + minPointOffset < tickPositions[tickPositions.length - 1]) {\n tickPositions.pop();\n }\n }\n\n // If no tick are left, set one tick in the middle (#3195)\n if (tickPositions.length === 0 && defined(roundedMin)) {\n tickPositions.push((roundedMax + roundedMin) / 2);\n }\n }\n },\n\n /**\n * Check if there are multiple axes in the same pane.\n *\n * @private\n * @return {Boolean}\n * True if there are other axes.\n */\n alignToOthers: function() {\n var others = {}, // Whether there is another axis to pair with this one\n hasOther,\n options = this.options;\n\n if (\n // Only if alignTicks is true\n this.chart.options.chart.alignTicks !== false &&\n options.alignTicks !== false &&\n\n // Don't try to align ticks on a log axis, they are not evenly\n // spaced (#6021)\n !this.isLog\n ) {\n each(this.chart[this.coll], function(axis) {\n var otherOptions = axis.options,\n horiz = axis.horiz,\n key = [\n horiz ? otherOptions.left : otherOptions.top,\n otherOptions.width,\n otherOptions.height,\n otherOptions.pane\n ].join(',');\n\n\n if (axis.series.length) { // #4442\n if (others[key]) {\n hasOther = true; // #4201\n } else {\n others[key] = 1;\n }\n }\n });\n }\n return hasOther;\n },\n\n /**\n * Set the max ticks of either the x and y axis collection\n */\n getTickAmount: function() {\n var options = this.options,\n tickAmount = options.tickAmount,\n tickPixelInterval = options.tickPixelInterval;\n\n if (!defined(options.tickInterval) && this.len < tickPixelInterval && !this.isRadial &&\n !this.isLog && options.startOnTick && options.endOnTick) {\n tickAmount = 2;\n }\n\n if (!tickAmount && this.alignToOthers()) {\n // Add 1 because 4 tick intervals require 5 ticks (including first and last)\n tickAmount = Math.ceil(this.len / tickPixelInterval) + 1;\n }\n\n // For tick amounts of 2 and 3, compute five ticks and remove the intermediate ones. This\n // prevents the axis from adding ticks that are too far away from the data extremes.\n if (tickAmount < 4) {\n this.finalTickAmt = tickAmount;\n tickAmount = 5;\n }\n\n this.tickAmount = tickAmount;\n },\n\n /**\n * When using multiple axes, adjust the number of ticks to match the highest\n * number of ticks in that group.\n *\n * @private\n */\n adjustTickAmount: function() {\n var tickInterval = this.tickInterval,\n tickPositions = this.tickPositions,\n tickAmount = this.tickAmount,\n finalTickAmt = this.finalTickAmt,\n currentTickAmount = tickPositions && tickPositions.length,\n i,\n len;\n\n if (currentTickAmount < tickAmount) {\n while (tickPositions.length < tickAmount) {\n tickPositions.push(correctFloat(\n tickPositions[tickPositions.length - 1] + tickInterval\n ));\n }\n this.transA *= (currentTickAmount - 1) / (tickAmount - 1);\n this.max = tickPositions[tickPositions.length - 1];\n\n // We have too many ticks, run second pass to try to reduce ticks\n } else if (currentTickAmount > tickAmount) {\n this.tickInterval *= 2;\n this.setTickPositions();\n }\n\n // The finalTickAmt property is set in getTickAmount\n if (defined(finalTickAmt)) {\n i = len = tickPositions.length;\n while (i--) {\n if (\n (finalTickAmt === 3 && i % 2 === 1) || // Remove every other tick\n (finalTickAmt <= 2 && i > 0 && i < len - 1) // Remove all but first and last\n ) {\n tickPositions.splice(i, 1);\n }\n }\n this.finalTickAmt = undefined;\n }\n },\n\n /**\n * Set the scale based on data min and max, user set min and max or options\n *\n */\n setScale: function() {\n var axis = this,\n isDirtyData,\n isDirtyAxisLength;\n\n axis.oldMin = axis.min;\n axis.oldMax = axis.max;\n axis.oldAxisLength = axis.len;\n\n // set the new axisLength\n axis.setAxisSize();\n //axisLength = horiz ? axisWidth : axisHeight;\n isDirtyAxisLength = axis.len !== axis.oldAxisLength;\n\n // is there new data?\n each(axis.series, function(series) {\n if (series.isDirtyData || series.isDirty ||\n series.xAxis.isDirty) { // when x axis is dirty, we need new data extremes for y as well\n isDirtyData = true;\n }\n });\n\n // do we really need to go through all this?\n if (isDirtyAxisLength || isDirtyData || axis.isLinked || axis.forceRedraw ||\n axis.userMin !== axis.oldUserMin || axis.userMax !== axis.oldUserMax || axis.alignToOthers()) {\n\n if (axis.resetStacks) {\n axis.resetStacks();\n }\n\n axis.forceRedraw = false;\n\n // get data extremes if needed\n axis.getSeriesExtremes();\n\n // get fixed positions based on tickInterval\n axis.setTickInterval();\n\n // record old values to decide whether a rescale is necessary later on (#540)\n axis.oldUserMin = axis.userMin;\n axis.oldUserMax = axis.userMax;\n\n // Mark as dirty if it is not already set to dirty and extremes have changed. #595.\n if (!axis.isDirty) {\n axis.isDirty = isDirtyAxisLength || axis.min !== axis.oldMin || axis.max !== axis.oldMax;\n }\n } else if (axis.cleanStacks) {\n axis.cleanStacks();\n }\n },\n\n /**\n * Set the minimum and maximum of the axes after render time. If the\n * `startOnTick` and `endOnTick` options are true, the minimum and maximum\n * values are rounded off to the nearest tick. To prevent this, these\n * options can be set to false before calling setExtremes. Also, setExtremes\n * will not allow a range lower than the `minRange` option, which by default\n * is the range of five points.\n * \n * @param {Number} [newMin]\n * The new minimum value.\n * @param {Number} [newMax]\n * The new maximum value.\n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart or wait for an explicit call to \n * {@link Highcharts.Chart#redraw}\n * @param {AnimationOptions} [animation=true]\n * Enable or modify animations.\n * @param {Object} [eventArguments]\n * Arguments to be accessed in event handler.\n *\n * @sample highcharts/members/axis-setextremes/\n * Set extremes from a button\n * @sample highcharts/members/axis-setextremes-datetime/\n * Set extremes on a datetime axis\n * @sample highcharts/members/axis-setextremes-off-ticks/\n * Set extremes off ticks\n * @sample stock/members/axis-setextremes/\n * Set extremes in Highstock\n * @sample maps/members/axis-setextremes/\n * Set extremes in Highmaps\n */\n setExtremes: function(newMin, newMax, redraw, animation, eventArguments) {\n var axis = this,\n chart = axis.chart;\n\n redraw = pick(redraw, true); // defaults to true\n\n each(axis.series, function(serie) {\n delete serie.kdTree;\n });\n\n // Extend the arguments with min and max\n eventArguments = extend(eventArguments, {\n min: newMin,\n max: newMax\n });\n\n // Fire the event\n fireEvent(axis, 'setExtremes', eventArguments, function() { // the default event handler\n\n axis.userMin = newMin;\n axis.userMax = newMax;\n axis.eventArgs = eventArguments;\n\n if (redraw) {\n chart.redraw(animation);\n }\n });\n },\n\n /**\n * Overridable method for zooming chart. Pulled out in a separate method to allow overriding\n * in stock charts.\n */\n zoom: function(newMin, newMax) {\n var dataMin = this.dataMin,\n dataMax = this.dataMax,\n options = this.options,\n min = Math.min(dataMin, pick(options.min, dataMin)),\n max = Math.max(dataMax, pick(options.max, dataMax));\n\n if (newMin !== this.min || newMax !== this.max) { // #5790\n\n // Prevent pinch zooming out of range. Check for defined is for #1946. #1734.\n if (!this.allowZoomOutside) {\n // #6014, sometimes newMax will be smaller than min (or newMin will be larger than max).\n if (defined(dataMin)) {\n if (newMin < min) {\n newMin = min;\n }\n if (newMin > max) {\n newMin = max;\n }\n }\n if (defined(dataMax)) {\n if (newMax < min) {\n newMax = min;\n }\n if (newMax > max) {\n newMax = max;\n }\n }\n }\n\n // In full view, displaying the reset zoom button is not required\n this.displayBtn = newMin !== undefined || newMax !== undefined;\n\n // Do it\n this.setExtremes(\n newMin,\n newMax,\n false,\n undefined, {\n trigger: 'zoom'\n }\n );\n }\n\n return true;\n },\n\n /**\n * Update the axis metrics\n */\n setAxisSize: function() {\n var chart = this.chart,\n options = this.options,\n offsets = options.offsets || [0, 0, 0, 0], // top / right / bottom / left\n horiz = this.horiz,\n width = pick(options.width, chart.plotWidth - offsets[3] + offsets[1]),\n height = pick(options.height, chart.plotHeight - offsets[0] + offsets[2]),\n top = pick(options.top, chart.plotTop + offsets[0]),\n left = pick(options.left, chart.plotLeft + offsets[3]),\n percentRegex = /%$/;\n\n // Check for percentage based input values. Rounding fixes problems with\n // column overflow and plot line filtering (#4898, #4899)\n if (percentRegex.test(height)) {\n height = Math.round(parseFloat(height) / 100 * chart.plotHeight);\n }\n if (percentRegex.test(top)) {\n top = Math.round(parseFloat(top) / 100 * chart.plotHeight + chart.plotTop);\n }\n\n // Expose basic values to use in Series object and navigator\n this.left = left;\n this.top = top;\n this.width = width;\n this.height = height;\n this.bottom = chart.chartHeight - height - top;\n this.right = chart.chartWidth - width - left;\n\n // Direction agnostic properties\n this.len = Math.max(horiz ? width : height, 0); // Math.max fixes #905\n this.pos = horiz ? left : top; // distance from SVG origin\n },\n\n /**\n * The returned object literal from the {@link Highcharts.Axis#getExtremes}\n * function. \n * @typedef {Object} Extremes\n * @property {Number} dataMax\n * The maximum value of the axis' associated series.\n * @property {Number} dataMin\n * The minimum value of the axis' associated series.\n * @property {Number} max\n * The maximum axis value, either automatic or set manually. If the\n * `max` option is not set, `maxPadding` is 0 and `endOnTick` is\n * false, this value will be the same as `dataMax`.\n * @property {Number} min\n * The minimum axis value, either automatic or set manually. If the\n * `min` option is not set, `minPadding` is 0 and `startOnTick` is\n * false, this value will be the same as `dataMin`.\n */\n /**\n * Get the current extremes for the axis.\n *\n * @returns {Extremes}\n * An object containing extremes information.\n * \n * @sample members/axis-getextremes/\n * Report extremes by click on a button\n * @sample maps/members/axis-getextremes/\n * Get extremes in Highmaps\n */\n getExtremes: function() {\n var axis = this,\n isLog = axis.isLog,\n lin2log = axis.lin2log;\n\n return {\n min: isLog ? correctFloat(lin2log(axis.min)) : axis.min,\n max: isLog ? correctFloat(lin2log(axis.max)) : axis.max,\n dataMin: axis.dataMin,\n dataMax: axis.dataMax,\n userMin: axis.userMin,\n userMax: axis.userMax\n };\n },\n\n /**\n * Get the zero plane either based on zero or on the min or max value.\n * Used in bar and area plots\n */\n getThreshold: function(threshold) {\n var axis = this,\n isLog = axis.isLog,\n lin2log = axis.lin2log,\n realMin = isLog ? lin2log(axis.min) : axis.min,\n realMax = isLog ? lin2log(axis.max) : axis.max;\n\n if (threshold === null) {\n threshold = realMin;\n } else if (realMin > threshold) {\n threshold = realMin;\n } else if (realMax < threshold) {\n threshold = realMax;\n }\n\n return axis.translate(threshold, 0, 1, 0, 1);\n },\n\n /**\n * Compute auto alignment for the axis label based on which side the axis is\n * on and the given rotation for the label.\n *\n * @param {Number} rotation\n * The rotation in degrees as set by either the `rotation` or \n * `autoRotation` options.\n * @private\n */\n autoLabelAlign: function(rotation) {\n var ret,\n angle = (pick(rotation, 0) - (this.side * 90) + 720) % 360;\n\n if (angle > 15 && angle < 165) {\n ret = 'right';\n } else if (angle > 195 && angle < 345) {\n ret = 'left';\n } else {\n ret = 'center';\n }\n return ret;\n },\n\n /**\n * Get the tick length and width for the axis.\n * @param {String} prefix 'tick' or 'minorTick'\n * @returns {Array} An array of tickLength and tickWidth\n */\n tickSize: function(prefix) {\n var options = this.options,\n tickLength = options[prefix + 'Length'],\n tickWidth = pick(options[prefix + 'Width'], prefix === 'tick' && this.isXAxis ? 1 : 0); // X axis defaults to 1\n\n if (tickWidth && tickLength) {\n // Negate the length\n if (options[prefix + 'Position'] === 'inside') {\n tickLength = -tickLength;\n }\n return [tickLength, tickWidth];\n }\n\n },\n\n /**\n * Return the size of the labels\n */\n labelMetrics: function() {\n var index = this.tickPositions && this.tickPositions[0] || 0;\n return this.chart.renderer.fontMetrics(\n this.options.labels.style && this.options.labels.style.fontSize,\n this.ticks[index] && this.ticks[index].label\n );\n },\n\n /**\n * Prevent the ticks from getting so close we can't draw the labels. On a horizontal\n * axis, this is handled by rotating the labels, removing ticks and adding ellipsis.\n * On a vertical axis remove ticks and add ellipsis.\n */\n unsquish: function() {\n var labelOptions = this.options.labels,\n horiz = this.horiz,\n tickInterval = this.tickInterval,\n newTickInterval = tickInterval,\n slotSize = this.len / (((this.categories ? 1 : 0) + this.max - this.min) / tickInterval),\n rotation,\n rotationOption = labelOptions.rotation,\n labelMetrics = this.labelMetrics(),\n step,\n bestScore = Number.MAX_VALUE,\n autoRotation,\n // Return the multiple of tickInterval that is needed to avoid collision\n getStep = function(spaceNeeded) {\n var step = spaceNeeded / (slotSize || 1);\n step = step > 1 ? Math.ceil(step) : 1;\n return step * tickInterval;\n };\n\n if (horiz) {\n autoRotation = !labelOptions.staggerLines && !labelOptions.step && ( // #3971\n defined(rotationOption) ? [rotationOption] :\n slotSize < pick(labelOptions.autoRotationLimit, 80) && labelOptions.autoRotation\n );\n\n if (autoRotation) {\n\n // Loop over the given autoRotation options, and determine which gives the best score. The\n // best score is that with the lowest number of steps and a rotation closest to horizontal.\n each(autoRotation, function(rot) {\n var score;\n\n if (rot === rotationOption || (rot && rot >= -90 && rot <= 90)) { // #3891\n\n step = getStep(Math.abs(labelMetrics.h / Math.sin(deg2rad * rot)));\n\n score = step + Math.abs(rot / 360);\n\n if (score < bestScore) {\n bestScore = score;\n rotation = rot;\n newTickInterval = step;\n }\n }\n });\n }\n\n } else if (!labelOptions.step) { // #4411\n newTickInterval = getStep(labelMetrics.h);\n }\n\n this.autoRotation = autoRotation;\n this.labelRotation = pick(rotation, rotationOption);\n\n return newTickInterval;\n },\n\n /**\n * Get the general slot width for this axis. This may change between the pre-render (from Axis.getOffset) \n * and the final tick rendering and placement (#5086).\n */\n getSlotWidth: function() {\n var chart = this.chart,\n horiz = this.horiz,\n labelOptions = this.options.labels,\n slotCount = Math.max(this.tickPositions.length - (this.categories ? 0 : 1), 1),\n marginLeft = chart.margin[3];\n\n return (\n horiz &&\n (labelOptions.step || 0) < 2 &&\n !labelOptions.rotation && // #4415\n ((this.staggerLines || 1) * this.len) / slotCount\n ) || (!horiz && (\n (marginLeft && (marginLeft - chart.spacing[3])) ||\n chart.chartWidth * 0.33\n )); // #1580, #1931\n\n },\n\n /**\n * Render the axis labels and determine whether ellipsis or rotation need to be applied\n */\n renderUnsquish: function() {\n var chart = this.chart,\n renderer = chart.renderer,\n tickPositions = this.tickPositions,\n ticks = this.ticks,\n labelOptions = this.options.labels,\n horiz = this.horiz,\n slotWidth = this.getSlotWidth(),\n innerWidth = Math.max(1, Math.round(slotWidth - 2 * (labelOptions.padding || 5))),\n attr = {},\n labelMetrics = this.labelMetrics(),\n textOverflowOption = labelOptions.style && labelOptions.style.textOverflow,\n css,\n maxLabelLength = 0,\n label,\n i,\n pos;\n\n // Set rotation option unless it is \"auto\", like in gauges\n if (!isString(labelOptions.rotation)) {\n attr.rotation = labelOptions.rotation || 0; // #4443\n }\n\n // Get the longest label length\n each(tickPositions, function(tick) {\n tick = ticks[tick];\n if (tick && tick.labelLength > maxLabelLength) {\n maxLabelLength = tick.labelLength;\n }\n });\n this.maxLabelLength = maxLabelLength;\n\n\n // Handle auto rotation on horizontal axis\n if (this.autoRotation) {\n\n // Apply rotation only if the label is too wide for the slot, and\n // the label is wider than its height.\n if (maxLabelLength > innerWidth && maxLabelLength > labelMetrics.h) {\n attr.rotation = this.labelRotation;\n } else {\n this.labelRotation = 0;\n }\n\n // Handle word-wrap or ellipsis on vertical axis\n } else if (slotWidth) {\n // For word-wrap or ellipsis\n css = {\n width: innerWidth + 'px'\n };\n\n if (!textOverflowOption) {\n css.textOverflow = 'clip';\n\n // On vertical axis, only allow word wrap if there is room for more lines.\n i = tickPositions.length;\n while (!horiz && i--) {\n pos = tickPositions[i];\n label = ticks[pos].label;\n if (label) {\n // Reset ellipsis in order to get the correct bounding box (#4070)\n if (label.styles && label.styles.textOverflow === 'ellipsis') {\n label.css({\n textOverflow: 'clip'\n });\n\n // Set the correct width in order to read the bounding box height (#4678, #5034)\n } else if (ticks[pos].labelLength > slotWidth) {\n label.css({\n width: slotWidth + 'px'\n });\n }\n\n if (label.getBBox().height > this.len / tickPositions.length - (labelMetrics.h - labelMetrics.f)) {\n label.specCss = {\n textOverflow: 'ellipsis'\n };\n }\n }\n }\n }\n }\n\n\n // Add ellipsis if the label length is significantly longer than ideal\n if (attr.rotation) {\n css = {\n width: (maxLabelLength > chart.chartHeight * 0.5 ? chart.chartHeight * 0.33 : chart.chartHeight) + 'px'\n };\n if (!textOverflowOption) {\n css.textOverflow = 'ellipsis';\n }\n }\n\n // Set the explicit or automatic label alignment\n this.labelAlign = labelOptions.align || this.autoLabelAlign(this.labelRotation);\n if (this.labelAlign) {\n attr.align = this.labelAlign;\n }\n\n // Apply general and specific CSS\n each(tickPositions, function(pos) {\n var tick = ticks[pos],\n label = tick && tick.label;\n if (label) {\n label.attr(attr); // This needs to go before the CSS in old IE (#4502)\n if (css) {\n label.css(merge(css, label.specCss));\n }\n delete label.specCss;\n tick.rotation = attr.rotation;\n }\n });\n\n // Note: Why is this not part of getLabelPosition?\n this.tickRotCorr = renderer.rotCorr(labelMetrics.b, this.labelRotation || 0, this.side !== 0);\n },\n\n /**\n * Return true if the axis has associated data\n */\n hasData: function() {\n return this.hasVisibleSeries || (defined(this.min) && defined(this.max) && !!this.tickPositions);\n },\n\n /**\n * Adds the title defined in axis.options.title.\n * @param {Boolean} display - whether or not to display the title\n */\n addTitle: function(display) {\n var axis = this,\n renderer = axis.chart.renderer,\n horiz = axis.horiz,\n opposite = axis.opposite,\n options = axis.options,\n axisTitleOptions = options.title,\n textAlign;\n\n if (!axis.axisTitle) {\n textAlign = axisTitleOptions.textAlign;\n if (!textAlign) {\n textAlign = (horiz ? {\n low: 'left',\n middle: 'center',\n high: 'right'\n } : {\n low: opposite ? 'right' : 'left',\n middle: 'center',\n high: opposite ? 'left' : 'right'\n })[axisTitleOptions.align];\n }\n axis.axisTitle = renderer.text(\n axisTitleOptions.text,\n 0,\n 0,\n axisTitleOptions.useHTML\n )\n .attr({\n zIndex: 7,\n rotation: axisTitleOptions.rotation || 0,\n align: textAlign\n })\n .addClass('highcharts-axis-title')\n\n .css(axisTitleOptions.style)\n\n .add(axis.axisGroup);\n axis.axisTitle.isNew = true;\n }\n\n // hide or show the title depending on whether showEmpty is set\n axis.axisTitle[display ? 'show' : 'hide'](true);\n },\n\n /**\n * Generates a tick for initial positioning.\n *\n * @private\n * @param {number} pos\n * The tick position in axis values.\n * @param {number} i\n * The index of the tick in {@link Axis.tickPositions}.\n */\n generateTick: function(pos) {\n var ticks = this.ticks;\n\n if (!ticks[pos]) {\n ticks[pos] = new Tick(this, pos);\n } else {\n ticks[pos].addLabel(); // update labels depending on tick interval\n }\n },\n\n /**\n * Render the tick labels to a preliminary position to get their sizes\n */\n getOffset: function() {\n var axis = this,\n chart = axis.chart,\n renderer = chart.renderer,\n options = axis.options,\n tickPositions = axis.tickPositions,\n ticks = axis.ticks,\n horiz = axis.horiz,\n side = axis.side,\n invertedSide = chart.inverted && !axis.isZAxis ? [1, 0, 3, 2][side] : side,\n hasData,\n showAxis,\n titleOffset = 0,\n titleOffsetOption,\n titleMargin = 0,\n axisTitleOptions = options.title,\n labelOptions = options.labels,\n labelOffset = 0, // reset\n labelOffsetPadded,\n axisOffset = chart.axisOffset,\n clipOffset = chart.clipOffset,\n clip,\n directionFactor = [-1, 1, 1, -1][side],\n className = options.className,\n axisParent = axis.axisParent, // Used in color axis\n lineHeightCorrection,\n tickSize = this.tickSize('tick');\n\n // For reuse in Axis.render\n hasData = axis.hasData();\n axis.showAxis = showAxis = hasData || pick(options.showEmpty, true);\n\n // Set/reset staggerLines\n axis.staggerLines = axis.horiz && labelOptions.staggerLines;\n\n // Create the axisGroup and gridGroup elements on first iteration\n if (!axis.axisGroup) {\n axis.gridGroup = renderer.g('grid')\n .attr({\n zIndex: options.gridZIndex || 1\n })\n .addClass('highcharts-' + this.coll.toLowerCase() + '-grid ' + (className || ''))\n .add(axisParent);\n axis.axisGroup = renderer.g('axis')\n .attr({\n zIndex: options.zIndex || 2\n })\n .addClass('highcharts-' + this.coll.toLowerCase() + ' ' + (className || ''))\n .add(axisParent);\n axis.labelGroup = renderer.g('axis-labels')\n .attr({\n zIndex: labelOptions.zIndex || 7\n })\n .addClass('highcharts-' + axis.coll.toLowerCase() + '-labels ' + (className || ''))\n .add(axisParent);\n }\n\n if (hasData || axis.isLinked) {\n\n // Generate ticks\n each(tickPositions, function(pos, i) {\n // i is not used here, but may be used in overrides\n axis.generateTick(pos, i);\n });\n\n axis.renderUnsquish();\n\n\n // Left side must be align: right and right side must have align: left for labels\n if (labelOptions.reserveSpace !== false && (side === 0 || side === 2 || {\n 1: 'left',\n 3: 'right'\n }[side] === axis.labelAlign || axis.labelAlign === 'center')) {\n each(tickPositions, function(pos) {\n\n // get the highest offset\n labelOffset = Math.max(\n ticks[pos].getLabelSize(),\n labelOffset\n );\n });\n }\n\n if (axis.staggerLines) {\n labelOffset *= axis.staggerLines;\n axis.labelOffset = labelOffset * (axis.opposite ? -1 : 1);\n }\n\n\n } else { // doesn't have data\n objectEach(ticks, function(tick, n) {\n tick.destroy();\n delete ticks[n];\n });\n }\n\n if (axisTitleOptions && axisTitleOptions.text && axisTitleOptions.enabled !== false) {\n axis.addTitle(showAxis);\n\n if (showAxis && axisTitleOptions.reserveSpace !== false) {\n axis.titleOffset = titleOffset =\n axis.axisTitle.getBBox()[horiz ? 'height' : 'width'];\n titleOffsetOption = axisTitleOptions.offset;\n titleMargin = defined(titleOffsetOption) ? 0 : pick(axisTitleOptions.margin, horiz ? 5 : 10);\n }\n }\n\n // Render the axis line\n axis.renderLine();\n\n // handle automatic or user set offset\n axis.offset = directionFactor * pick(options.offset, axisOffset[side]);\n\n axis.tickRotCorr = axis.tickRotCorr || {\n x: 0,\n y: 0\n }; // polar\n if (side === 0) {\n lineHeightCorrection = -axis.labelMetrics().h;\n } else if (side === 2) {\n lineHeightCorrection = axis.tickRotCorr.y;\n } else {\n lineHeightCorrection = 0;\n }\n\n // Find the padded label offset\n labelOffsetPadded = Math.abs(labelOffset) + titleMargin;\n if (labelOffset) {\n labelOffsetPadded -= lineHeightCorrection;\n labelOffsetPadded += directionFactor * (horiz ? pick(labelOptions.y, axis.tickRotCorr.y + directionFactor * 8) : labelOptions.x);\n }\n axis.axisTitleMargin = pick(titleOffsetOption, labelOffsetPadded);\n\n axisOffset[side] = Math.max(\n axisOffset[side],\n axis.axisTitleMargin + titleOffset + directionFactor * axis.offset,\n labelOffsetPadded, // #3027\n hasData && tickPositions.length && tickSize ?\n tickSize[0] + directionFactor * axis.offset :\n 0 // #4866\n );\n\n // Decide the clipping needed to keep the graph inside the plot area and\n // axis lines\n clip = Math.floor(axis.axisLine.strokeWidth() / 2) * 2; // #4308, #4371\n if (options.offset > 0) {\n clip -= options.offset * 2;\n }\n clipOffset[invertedSide] = Math.max(\n clipOffset[invertedSide] || clip,\n clip\n );\n },\n\n /**\n * Internal function to get the path for the axis line. Extended for polar\n * charts.\n *\n * @param {Number} lineWidth\n * The line width in pixels.\n * @return {Array}\n * The SVG path definition in array form.\n */\n getLinePath: function(lineWidth) {\n var chart = this.chart,\n opposite = this.opposite,\n offset = this.offset,\n horiz = this.horiz,\n lineLeft = this.left + (opposite ? this.width : 0) + offset,\n lineTop = chart.chartHeight - this.bottom -\n (opposite ? this.height : 0) + offset;\n\n if (opposite) {\n lineWidth *= -1; // crispify the other way - #1480, #1687\n }\n\n return chart.renderer\n .crispLine([\n 'M',\n horiz ?\n this.left :\n lineLeft,\n horiz ?\n lineTop :\n this.top,\n 'L',\n horiz ?\n chart.chartWidth - this.right :\n lineLeft,\n horiz ?\n lineTop :\n chart.chartHeight - this.bottom\n ], lineWidth);\n },\n\n /**\n * Render the axis line\n */\n renderLine: function() {\n if (!this.axisLine) {\n this.axisLine = this.chart.renderer.path()\n .addClass('highcharts-axis-line')\n .add(this.axisGroup);\n\n\n this.axisLine.attr({\n stroke: this.options.lineColor,\n 'stroke-width': this.options.lineWidth,\n zIndex: 7\n });\n\n }\n },\n\n /**\n * Position the title\n */\n getTitlePosition: function() {\n // compute anchor points for each of the title align options\n var horiz = this.horiz,\n axisLeft = this.left,\n axisTop = this.top,\n axisLength = this.len,\n axisTitleOptions = this.options.title,\n margin = horiz ? axisLeft : axisTop,\n opposite = this.opposite,\n offset = this.offset,\n xOption = axisTitleOptions.x || 0,\n yOption = axisTitleOptions.y || 0,\n fontSize = this.chart.renderer.fontMetrics(axisTitleOptions.style && axisTitleOptions.style.fontSize, this.axisTitle).f,\n\n // the position in the length direction of the axis\n alongAxis = {\n low: margin + (horiz ? 0 : axisLength),\n middle: margin + axisLength / 2,\n high: margin + (horiz ? axisLength : 0)\n }[axisTitleOptions.align],\n\n // the position in the perpendicular direction of the axis\n offAxis = (horiz ? axisTop + this.height : axisLeft) +\n (horiz ? 1 : -1) * // horizontal axis reverses the margin\n (opposite ? -1 : 1) * // so does opposite axes\n this.axisTitleMargin +\n (this.side === 2 ? fontSize : 0);\n\n return {\n x: horiz ?\n alongAxis + xOption : offAxis + (opposite ? this.width : 0) + offset + xOption,\n y: horiz ?\n offAxis + yOption - (opposite ? this.height : 0) + offset : alongAxis + yOption\n };\n },\n\n /**\n * Render a minor tick into the given position. If a minor tick already \n * exists in this position, move it.\n * @param {number} pos - The position in axis values.\n */\n renderMinorTick: function(pos) {\n var slideInTicks = this.chart.hasRendered && isNumber(this.oldMin),\n minorTicks = this.minorTicks;\n\n if (!minorTicks[pos]) {\n minorTicks[pos] = new Tick(this, pos, 'minor');\n }\n\n // Render new ticks in old position\n if (slideInTicks && minorTicks[pos].isNew) {\n minorTicks[pos].render(null, true);\n }\n\n minorTicks[pos].render(null, false, 1);\n },\n\n /**\n * Render a major tick into the given position. If a tick already exists\n * in this position, move it.\n * @param {number} pos - The position in axis values\n * @param {number} i - The tick index\n */\n renderTick: function(pos, i) {\n var isLinked = this.isLinked,\n ticks = this.ticks,\n slideInTicks = this.chart.hasRendered && isNumber(this.oldMin);\n\n // Linked axes need an extra check to find out if\n if (!isLinked || (pos >= this.min && pos <= this.max)) {\n\n if (!ticks[pos]) {\n ticks[pos] = new Tick(this, pos);\n }\n\n // render new ticks in old position\n if (slideInTicks && ticks[pos].isNew) {\n ticks[pos].render(i, true, 0.1);\n }\n\n ticks[pos].render(i);\n }\n },\n\n /**\n * Render the axis\n */\n render: function() {\n var axis = this,\n chart = axis.chart,\n renderer = chart.renderer,\n options = axis.options,\n isLog = axis.isLog,\n lin2log = axis.lin2log,\n isLinked = axis.isLinked,\n tickPositions = axis.tickPositions,\n axisTitle = axis.axisTitle,\n ticks = axis.ticks,\n minorTicks = axis.minorTicks,\n alternateBands = axis.alternateBands,\n stackLabelOptions = options.stackLabels,\n alternateGridColor = options.alternateGridColor,\n tickmarkOffset = axis.tickmarkOffset,\n axisLine = axis.axisLine,\n showAxis = axis.showAxis,\n animation = animObject(renderer.globalAnimation),\n from,\n to;\n\n // Reset\n axis.labelEdge.length = 0;\n //axis.justifyToPlot = overflow === 'justify';\n axis.overlap = false;\n\n // Mark all elements inActive before we go over and mark the active ones\n each([ticks, minorTicks, alternateBands], function(coll) {\n objectEach(coll, function(tick) {\n tick.isActive = false;\n });\n });\n\n // If the series has data draw the ticks. Else only the line and title\n if (axis.hasData() || isLinked) {\n\n // minor ticks\n if (axis.minorTickInterval && !axis.categories) {\n each(axis.getMinorTickPositions(), function(pos) {\n axis.renderMinorTick(pos);\n });\n }\n\n // Major ticks. Pull out the first item and render it last so that\n // we can get the position of the neighbour label. #808.\n if (tickPositions.length) { // #1300\n each(tickPositions, function(pos, i) {\n axis.renderTick(pos, i);\n });\n // In a categorized axis, the tick marks are displayed between labels. So\n // we need to add a tick mark and grid line at the left edge of the X axis.\n if (tickmarkOffset && (axis.min === 0 || axis.single)) {\n if (!ticks[-1]) {\n ticks[-1] = new Tick(axis, -1, null, true);\n }\n ticks[-1].render(-1);\n }\n\n }\n\n // alternate grid color\n if (alternateGridColor) {\n each(tickPositions, function(pos, i) {\n to = tickPositions[i + 1] !== undefined ? tickPositions[i + 1] + tickmarkOffset : axis.max - tickmarkOffset;\n if (i % 2 === 0 && pos < axis.max && to <= axis.max + (chart.polar ? -tickmarkOffset : tickmarkOffset)) { // #2248, #4660\n if (!alternateBands[pos]) {\n alternateBands[pos] = new H.PlotLineOrBand(axis);\n }\n from = pos + tickmarkOffset; // #949\n alternateBands[pos].options = {\n from: isLog ? lin2log(from) : from,\n to: isLog ? lin2log(to) : to,\n color: alternateGridColor\n };\n alternateBands[pos].render();\n alternateBands[pos].isActive = true;\n }\n });\n }\n\n // custom plot lines and bands\n if (!axis._addedPlotLB) { // only first time\n each((options.plotLines || []).concat(options.plotBands || []), function(plotLineOptions) {\n axis.addPlotBandOrLine(plotLineOptions);\n });\n axis._addedPlotLB = true;\n }\n\n } // end if hasData\n\n // Remove inactive ticks\n each([ticks, minorTicks, alternateBands], function(coll) {\n var i,\n forDestruction = [],\n delay = animation.duration,\n destroyInactiveItems = function() {\n i = forDestruction.length;\n while (i--) {\n // When resizing rapidly, the same items may be destroyed in different timeouts,\n // or the may be reactivated\n if (coll[forDestruction[i]] && !coll[forDestruction[i]].isActive) {\n coll[forDestruction[i]].destroy();\n delete coll[forDestruction[i]];\n }\n }\n\n };\n\n objectEach(coll, function(tick, pos) {\n if (!tick.isActive) {\n // Render to zero opacity\n tick.render(pos, false, 0);\n tick.isActive = false;\n forDestruction.push(pos);\n }\n });\n\n // When the objects are finished fading out, destroy them\n syncTimeout(\n destroyInactiveItems,\n coll === alternateBands || !chart.hasRendered || !delay ? 0 : delay\n );\n });\n\n // Set the axis line path\n if (axisLine) {\n axisLine[axisLine.isPlaced ? 'animate' : 'attr']({\n d: this.getLinePath(axisLine.strokeWidth())\n });\n axisLine.isPlaced = true;\n\n // Show or hide the line depending on options.showEmpty\n axisLine[showAxis ? 'show' : 'hide'](true);\n }\n\n if (axisTitle && showAxis) {\n var titleXy = axis.getTitlePosition();\n if (isNumber(titleXy.y)) {\n axisTitle[axisTitle.isNew ? 'attr' : 'animate'](titleXy);\n axisTitle.isNew = false;\n } else {\n axisTitle.attr('y', -9999);\n axisTitle.isNew = true;\n }\n }\n\n // Stacked totals:\n if (stackLabelOptions && stackLabelOptions.enabled) {\n axis.renderStackTotals();\n }\n // End stacked totals\n\n axis.isDirty = false;\n },\n\n /**\n * Redraw the axis to reflect changes in the data or axis extremes\n */\n redraw: function() {\n\n if (this.visible) {\n // render the axis\n this.render();\n\n // move plot lines and bands\n each(this.plotLinesAndBands, function(plotLine) {\n plotLine.render();\n });\n }\n\n // mark associated series as dirty and ready for redraw\n each(this.series, function(series) {\n series.isDirty = true;\n });\n\n },\n\n // Properties to survive after destroy, needed for Axis.update (#4317,\n // #5773, #5881).\n keepProps: ['extKey', 'hcEvents', 'names', 'series', 'userMax', 'userMin'],\n\n /**\n * Destroys an Axis instance. See {@link Axis#remove} for the API endpoint\n * to fully remove the axis.\n *\n * @private\n * @param {Boolean} keepEvents\n * Whether to preserve events, used internally in Axis.update.\n */\n destroy: function(keepEvents) {\n var axis = this,\n stacks = axis.stacks,\n plotLinesAndBands = axis.plotLinesAndBands,\n plotGroup,\n i;\n\n // Remove the events\n if (!keepEvents) {\n removeEvent(axis);\n }\n\n // Destroy each stack total\n objectEach(stacks, function(stack, stackKey) {\n destroyObjectProperties(stack);\n\n stacks[stackKey] = null;\n });\n\n // Destroy collections\n each([axis.ticks, axis.minorTicks, axis.alternateBands], function(coll) {\n destroyObjectProperties(coll);\n });\n if (plotLinesAndBands) {\n i = plotLinesAndBands.length;\n while (i--) { // #1975\n plotLinesAndBands[i].destroy();\n }\n }\n\n // Destroy local variables\n each(['stackTotalGroup', 'axisLine', 'axisTitle', 'axisGroup', 'gridGroup', 'labelGroup', 'cross'], function(prop) {\n if (axis[prop]) {\n axis[prop] = axis[prop].destroy();\n }\n });\n\n // Destroy each generated group for plotlines and plotbands\n for (plotGroup in axis.plotLinesAndBandsGroups) {\n axis.plotLinesAndBandsGroups[plotGroup] = axis.plotLinesAndBandsGroups[plotGroup].destroy();\n }\n\n // Delete all properties and fall back to the prototype.\n objectEach(axis, function(val, key) {\n if (inArray(key, axis.keepProps) === -1) {\n delete axis[key];\n }\n });\n },\n\n /**\n * Internal function to draw a crosshair.\n *\n * @param {PointerEvent} [e]\n * The event arguments from the modified pointer event, extended \n * with `chartX` and `chartY`\n * @param {Point} [point]\n * The Point object if the crosshair snaps to points.\n */\n drawCrosshair: function(e, point) {\n\n var path,\n options = this.crosshair,\n snap = pick(options.snap, true),\n pos,\n categorized,\n graphic = this.cross;\n\n // Use last available event when updating non-snapped crosshairs without\n // mouse interaction (#5287)\n if (!e) {\n e = this.cross && this.cross.e;\n }\n\n if (\n // Disabled in options\n !this.crosshair ||\n // Snap\n ((defined(point) || !snap) === false)\n ) {\n this.hideCrosshair();\n } else {\n\n // Get the path\n if (!snap) {\n pos = e && (this.horiz ? e.chartX - this.pos : this.len - e.chartY + this.pos);\n } else if (defined(point)) {\n pos = this.isXAxis ? point.plotX : this.len - point.plotY; // #3834\n }\n\n if (defined(pos)) {\n path = this.getPlotLinePath(\n // First argument, value, only used on radial\n point && (this.isXAxis ? point.x : pick(point.stackY, point.y)),\n null,\n null,\n null,\n pos // Translated position\n ) || null; // #3189\n }\n\n if (!defined(path)) {\n this.hideCrosshair();\n return;\n }\n\n categorized = this.categories && !this.isRadial;\n\n // Draw the cross\n if (!graphic) {\n this.cross = graphic = this.chart.renderer\n .path()\n .addClass('highcharts-crosshair highcharts-crosshair-' +\n (categorized ? 'category ' : 'thin ') + options.className)\n .attr({\n zIndex: pick(options.zIndex, 2)\n })\n .add();\n\n\n // Presentational attributes\n graphic.attr({\n 'stroke': options.color || (categorized ? color('#ccd6eb').setOpacity(0.25).get() : '#cccccc'),\n 'stroke-width': pick(options.width, 1)\n });\n if (options.dashStyle) {\n graphic.attr({\n dashstyle: options.dashStyle\n });\n }\n\n\n }\n\n graphic.show().attr({\n d: path\n });\n\n if (categorized && !options.width) {\n graphic.attr({\n 'stroke-width': this.transA\n });\n }\n this.cross.e = e;\n }\n },\n\n /**\n * Hide the crosshair.\n */\n hideCrosshair: function() {\n if (this.cross) {\n this.cross.hide();\n }\n }\n }); // end Axis\n\n H.Axis = Axis;\n return Axis;\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var Axis = H.Axis,\n Date = H.Date,\n dateFormat = H.dateFormat,\n defaultOptions = H.defaultOptions,\n defined = H.defined,\n each = H.each,\n extend = H.extend,\n getMagnitude = H.getMagnitude,\n getTZOffset = H.getTZOffset,\n normalizeTickInterval = H.normalizeTickInterval,\n pick = H.pick,\n timeUnits = H.timeUnits;\n /**\n * Set the tick positions to a time unit that makes sense, for example\n * on the first of each month or on every Monday. Return an array\n * with the time positions. Used in datetime axes as well as for grouping\n * data on a datetime axis.\n *\n * @param {Object} normalizedInterval The interval in axis values (ms) and the count\n * @param {Number} min The minimum in axis values\n * @param {Number} max The maximum in axis values\n * @param {Number} startOfWeek\n */\n Axis.prototype.getTimeTicks = function(normalizedInterval, min, max, startOfWeek) {\n var tickPositions = [],\n i,\n higherRanks = {},\n useUTC = defaultOptions.global.useUTC,\n minYear, // used in months and years as a basis for Date.UTC()\n // When crossing DST, use the max. Resolves #6278.\n minDate = new Date(min - Math.max(getTZOffset(min), getTZOffset(max))),\n makeTime = Date.hcMakeTime,\n interval = normalizedInterval.unitRange,\n count = normalizedInterval.count,\n variableDayLength;\n\n if (defined(min)) { // #1300\n minDate[Date.hcSetMilliseconds](interval >= timeUnits.second ? 0 : // #3935\n count * Math.floor(minDate.getMilliseconds() / count)); // #3652, #3654\n\n if (interval >= timeUnits.second) { // second\n minDate[Date.hcSetSeconds](interval >= timeUnits.minute ? 0 : // #3935\n count * Math.floor(minDate.getSeconds() / count));\n }\n\n if (interval >= timeUnits.minute) { // minute\n minDate[Date.hcSetMinutes](interval >= timeUnits.hour ? 0 :\n count * Math.floor(minDate[Date.hcGetMinutes]() / count));\n }\n\n if (interval >= timeUnits.hour) { // hour\n minDate[Date.hcSetHours](interval >= timeUnits.day ? 0 :\n count * Math.floor(minDate[Date.hcGetHours]() / count));\n }\n\n if (interval >= timeUnits.day) { // day\n minDate[Date.hcSetDate](interval >= timeUnits.month ? 1 :\n count * Math.floor(minDate[Date.hcGetDate]() / count));\n }\n\n if (interval >= timeUnits.month) { // month\n minDate[Date.hcSetMonth](interval >= timeUnits.year ? 0 :\n count * Math.floor(minDate[Date.hcGetMonth]() / count));\n minYear = minDate[Date.hcGetFullYear]();\n }\n\n if (interval >= timeUnits.year) { // year\n minYear -= minYear % count;\n minDate[Date.hcSetFullYear](minYear);\n }\n\n // week is a special case that runs outside the hierarchy\n if (interval === timeUnits.week) {\n // get start of current week, independent of count\n minDate[Date.hcSetDate](minDate[Date.hcGetDate]() - minDate[Date.hcGetDay]() +\n pick(startOfWeek, 1));\n }\n\n\n // Get basics for variable time spans\n minYear = minDate[Date.hcGetFullYear]();\n var minMonth = minDate[Date.hcGetMonth](),\n minDateDate = minDate[Date.hcGetDate](),\n minHours = minDate[Date.hcGetHours]();\n\n\n // Handle local timezone offset\n if (Date.hcTimezoneOffset || Date.hcGetTimezoneOffset) {\n\n // Detect whether we need to take the DST crossover into\n // consideration. If we're crossing over DST, the day length may be\n // 23h or 25h and we need to compute the exact clock time for each\n // tick instead of just adding hours. This comes at a cost, so first\n // we found out if it is needed. #4951.\n variableDayLength =\n (!useUTC || !!Date.hcGetTimezoneOffset) &&\n (\n // Long range, assume we're crossing over.\n max - min > 4 * timeUnits.month ||\n // Short range, check if min and max are in different time \n // zones.\n getTZOffset(min) !== getTZOffset(max)\n );\n\n // Adjust minDate to the offset date\n minDate = minDate.getTime();\n minDate = new Date(minDate + getTZOffset(minDate));\n }\n\n\n // Iterate and add tick positions at appropriate values\n var time = minDate.getTime();\n i = 1;\n while (time < max) {\n tickPositions.push(time);\n\n // if the interval is years, use Date.UTC to increase years\n if (interval === timeUnits.year) {\n time = makeTime(minYear + i * count, 0);\n\n // if the interval is months, use Date.UTC to increase months\n } else if (interval === timeUnits.month) {\n time = makeTime(minYear, minMonth + i * count);\n\n // if we're using global time, the interval is not fixed as it jumps\n // one hour at the DST crossover\n } else if (variableDayLength && (interval === timeUnits.day || interval === timeUnits.week)) {\n time = makeTime(minYear, minMonth, minDateDate +\n i * count * (interval === timeUnits.day ? 1 : 7));\n\n } else if (variableDayLength && interval === timeUnits.hour) {\n time = makeTime(minYear, minMonth, minDateDate, minHours + i * count);\n\n // else, the interval is fixed and we use simple addition\n } else {\n time += interval * count;\n }\n\n i++;\n }\n\n // push the last time\n tickPositions.push(time);\n\n\n // Handle higher ranks. Mark new days if the time is on midnight\n // (#950, #1649, #1760, #3349). Use a reasonable dropout threshold to \n // prevent looping over dense data grouping (#6156).\n if (interval <= timeUnits.hour && tickPositions.length < 10000) {\n each(tickPositions, function(time) {\n if (\n // Speed optimization, no need to run dateFormat unless\n // we're on a full or half hour\n time % 1800000 === 0 &&\n // Check for local or global midnight\n dateFormat('%H%M%S%L', time) === '000000000'\n ) {\n higherRanks[time] = 'day';\n }\n });\n }\n }\n\n\n // record information on the chosen unit - for dynamic label formatter\n tickPositions.info = extend(normalizedInterval, {\n higherRanks: higherRanks,\n totalRange: interval * count\n });\n\n return tickPositions;\n };\n\n /**\n * Get a normalized tick interval for dates. Returns a configuration object with\n * unit range (interval), count and name. Used to prepare data for getTimeTicks.\n * Previously this logic was part of getTimeTicks, but as getTimeTicks now runs\n * of segments in stock charts, the normalizing logic was extracted in order to\n * prevent it for running over again for each segment having the same interval.\n * #662, #697.\n */\n Axis.prototype.normalizeTimeTickInterval = function(tickInterval, unitsOption) {\n var units = unitsOption || [\n [\n 'millisecond', // unit name\n [1, 2, 5, 10, 20, 25, 50, 100, 200, 500] // allowed multiples\n ],\n [\n 'second', [1, 2, 5, 10, 15, 30]\n ],\n [\n 'minute', [1, 2, 5, 10, 15, 30]\n ],\n [\n 'hour', [1, 2, 3, 4, 6, 8, 12]\n ],\n [\n 'day', [1, 2]\n ],\n [\n 'week', [1, 2]\n ],\n [\n 'month', [1, 2, 3, 4, 6]\n ],\n [\n 'year',\n null\n ]\n ],\n unit = units[units.length - 1], // default unit is years\n interval = timeUnits[unit[0]],\n multiples = unit[1],\n count,\n i;\n\n // loop through the units to find the one that best fits the tickInterval\n for (i = 0; i < units.length; i++) {\n unit = units[i];\n interval = timeUnits[unit[0]];\n multiples = unit[1];\n\n\n if (units[i + 1]) {\n // lessThan is in the middle between the highest multiple and the next unit.\n var lessThan = (interval * multiples[multiples.length - 1] +\n timeUnits[units[i + 1][0]]) / 2;\n\n // break and keep the current unit\n if (tickInterval <= lessThan) {\n break;\n }\n }\n }\n\n // prevent 2.5 years intervals, though 25, 250 etc. are allowed\n if (interval === timeUnits.year && tickInterval < 5 * interval) {\n multiples = [1, 2, 5];\n }\n\n // get the count\n count = normalizeTickInterval(\n tickInterval / interval,\n multiples,\n unit[0] === 'year' ? Math.max(getMagnitude(tickInterval / interval), 1) : 1 // #1913, #2360\n );\n\n return {\n unitRange: interval,\n count: count,\n unitName: unit[0]\n };\n };\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var Axis = H.Axis,\n getMagnitude = H.getMagnitude,\n map = H.map,\n normalizeTickInterval = H.normalizeTickInterval,\n pick = H.pick;\n /**\n * Methods defined on the Axis prototype\n */\n\n /**\n * Set the tick positions of a logarithmic axis\n */\n Axis.prototype.getLogTickPositions = function(interval, min, max, minor) {\n var axis = this,\n options = axis.options,\n axisLength = axis.len,\n lin2log = axis.lin2log,\n log2lin = axis.log2lin,\n // Since we use this method for both major and minor ticks,\n // use a local variable and return the result\n positions = [];\n\n // Reset\n if (!minor) {\n axis._minorAutoInterval = null;\n }\n\n // First case: All ticks fall on whole logarithms: 1, 10, 100 etc.\n if (interval >= 0.5) {\n interval = Math.round(interval);\n positions = axis.getLinearTickPositions(interval, min, max);\n\n // Second case: We need intermediary ticks. For example\n // 1, 2, 4, 6, 8, 10, 20, 40 etc.\n } else if (interval >= 0.08) {\n var roundedMin = Math.floor(min),\n intermediate,\n i,\n j,\n len,\n pos,\n lastPos,\n break2;\n\n if (interval > 0.3) {\n intermediate = [1, 2, 4];\n } else if (interval > 0.15) { // 0.2 equals five minor ticks per 1, 10, 100 etc\n intermediate = [1, 2, 4, 6, 8];\n } else { // 0.1 equals ten minor ticks per 1, 10, 100 etc\n intermediate = [1, 2, 3, 4, 5, 6, 7, 8, 9];\n }\n\n for (i = roundedMin; i < max + 1 && !break2; i++) {\n len = intermediate.length;\n for (j = 0; j < len && !break2; j++) {\n pos = log2lin(lin2log(i) * intermediate[j]);\n if (pos > min && (!minor || lastPos <= max) && lastPos !== undefined) { // #1670, lastPos is #3113\n positions.push(lastPos);\n }\n\n if (lastPos > max) {\n break2 = true;\n }\n lastPos = pos;\n }\n }\n\n // Third case: We are so deep in between whole logarithmic values that\n // we might as well handle the tick positions like a linear axis. For\n // example 1.01, 1.02, 1.03, 1.04.\n } else {\n var realMin = lin2log(min),\n realMax = lin2log(max),\n tickIntervalOption = options[minor ? 'minorTickInterval' : 'tickInterval'],\n filteredTickIntervalOption = tickIntervalOption === 'auto' ? null : tickIntervalOption,\n tickPixelIntervalOption = options.tickPixelInterval / (minor ? 5 : 1),\n totalPixelLength = minor ? axisLength / axis.tickPositions.length : axisLength;\n\n interval = pick(\n filteredTickIntervalOption,\n axis._minorAutoInterval,\n (realMax - realMin) * tickPixelIntervalOption / (totalPixelLength || 1)\n );\n\n interval = normalizeTickInterval(\n interval,\n null,\n getMagnitude(interval)\n );\n\n positions = map(axis.getLinearTickPositions(\n interval,\n realMin,\n realMax\n ), log2lin);\n\n if (!minor) {\n axis._minorAutoInterval = interval / 5;\n }\n }\n\n // Set the axis-level tickInterval variable\n if (!minor) {\n axis.tickInterval = interval;\n }\n return positions;\n };\n\n Axis.prototype.log2lin = function(num) {\n return Math.log(num) / Math.LN10;\n };\n\n Axis.prototype.lin2log = function(num) {\n return Math.pow(10, num);\n };\n\n }(Highcharts));\n (function(H, Axis) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var arrayMax = H.arrayMax,\n arrayMin = H.arrayMin,\n defined = H.defined,\n destroyObjectProperties = H.destroyObjectProperties,\n each = H.each,\n erase = H.erase,\n merge = H.merge,\n pick = H.pick;\n /*\n * The object wrapper for plot lines and plot bands\n * @param {Object} options\n */\n H.PlotLineOrBand = function(axis, options) {\n this.axis = axis;\n\n if (options) {\n this.options = options;\n this.id = options.id;\n }\n };\n\n H.PlotLineOrBand.prototype = {\n\n /**\n * Render the plot line or plot band. If it is already existing,\n * move it.\n */\n render: function() {\n var plotLine = this,\n axis = plotLine.axis,\n horiz = axis.horiz,\n options = plotLine.options,\n optionsLabel = options.label,\n label = plotLine.label,\n to = options.to,\n from = options.from,\n value = options.value,\n isBand = defined(from) && defined(to),\n isLine = defined(value),\n svgElem = plotLine.svgElem,\n isNew = !svgElem,\n path = [],\n color = options.color,\n zIndex = pick(options.zIndex, 0),\n events = options.events,\n attribs = {\n 'class': 'highcharts-plot-' + (isBand ? 'band ' : 'line ') + (options.className || '')\n },\n groupAttribs = {},\n renderer = axis.chart.renderer,\n groupName = isBand ? 'bands' : 'lines',\n group,\n log2lin = axis.log2lin;\n\n // logarithmic conversion\n if (axis.isLog) {\n from = log2lin(from);\n to = log2lin(to);\n value = log2lin(value);\n }\n\n\n // Set the presentational attributes\n if (isLine) {\n attribs = {\n stroke: color,\n 'stroke-width': options.width\n };\n if (options.dashStyle) {\n attribs.dashstyle = options.dashStyle;\n }\n\n } else if (isBand) { // plot band\n if (color) {\n attribs.fill = color;\n }\n if (options.borderWidth) {\n attribs.stroke = options.borderColor;\n attribs['stroke-width'] = options.borderWidth;\n }\n }\n\n\n // Grouping and zIndex\n groupAttribs.zIndex = zIndex;\n groupName += '-' + zIndex;\n\n group = axis.plotLinesAndBandsGroups[groupName];\n if (!group) {\n axis.plotLinesAndBandsGroups[groupName] = group = renderer.g('plot-' + groupName)\n .attr(groupAttribs).add();\n }\n\n // Create the path\n if (isNew) {\n plotLine.svgElem = svgElem =\n renderer\n .path()\n .attr(attribs).add(group);\n }\n\n\n // Set the path or return\n if (isLine) {\n path = axis.getPlotLinePath(value, svgElem.strokeWidth());\n } else if (isBand) { // plot band\n path = axis.getPlotBandPath(from, to, options);\n } else {\n return;\n }\n\n\n // common for lines and bands\n if (isNew && path && path.length) {\n svgElem.attr({\n d: path\n });\n\n // events\n if (events) {\n H.objectEach(events, function(event, eventType) {\n svgElem.on(eventType, function(e) {\n events[eventType].apply(plotLine, [e]);\n });\n });\n }\n } else if (svgElem) {\n if (path) {\n svgElem.show();\n svgElem.animate({\n d: path\n });\n } else {\n svgElem.hide();\n if (label) {\n plotLine.label = label = label.destroy();\n }\n }\n }\n\n // the plot band/line label\n if (optionsLabel && defined(optionsLabel.text) && path && path.length &&\n axis.width > 0 && axis.height > 0 && !path.flat) {\n // apply defaults\n optionsLabel = merge({\n align: horiz && isBand && 'center',\n x: horiz ? !isBand && 4 : 10,\n verticalAlign: !horiz && isBand && 'middle',\n y: horiz ? isBand ? 16 : 10 : isBand ? 6 : -4,\n rotation: horiz && !isBand && 90\n }, optionsLabel);\n\n this.renderLabel(optionsLabel, path, isBand, zIndex);\n\n } else if (label) { // move out of sight\n label.hide();\n }\n\n // chainable\n return plotLine;\n },\n\n /**\n * Render and align label for plot line or band.\n */\n renderLabel: function(optionsLabel, path, isBand, zIndex) {\n var plotLine = this,\n label = plotLine.label,\n renderer = plotLine.axis.chart.renderer,\n attribs,\n xs,\n ys,\n x,\n y;\n\n // add the SVG element\n if (!label) {\n attribs = {\n align: optionsLabel.textAlign || optionsLabel.align,\n rotation: optionsLabel.rotation,\n 'class': 'highcharts-plot-' + (isBand ? 'band' : 'line') + '-label ' + (optionsLabel.className || '')\n };\n\n attribs.zIndex = zIndex;\n\n plotLine.label = label = renderer.text(\n optionsLabel.text,\n 0,\n 0,\n optionsLabel.useHTML\n )\n .attr(attribs)\n .add();\n\n\n label.css(optionsLabel.style);\n\n }\n\n // get the bounding box and align the label\n // #3000 changed to better handle choice between plotband or plotline\n xs = [path[1], path[4], (isBand ? path[6] : path[1])];\n ys = [path[2], path[5], (isBand ? path[7] : path[2])];\n x = arrayMin(xs);\n y = arrayMin(ys);\n\n label.align(optionsLabel, false, {\n x: x,\n y: y,\n width: arrayMax(xs) - x,\n height: arrayMax(ys) - y\n });\n label.show();\n },\n\n /**\n * Remove the plot line or band\n */\n destroy: function() {\n // remove it from the lookup\n erase(this.axis.plotLinesAndBands, this);\n\n delete this.axis;\n destroyObjectProperties(this);\n }\n };\n\n /**\n * Object with members for extending the Axis prototype\n * @todo Extend directly instead of adding object to Highcharts first\n */\n\n H.extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n\n /**\n * Create the path for a plot band\n */\n getPlotBandPath: function(from, to) {\n var toPath = this.getPlotLinePath(to, null, null, true),\n path = this.getPlotLinePath(from, null, null, true),\n // #4964 check if chart is inverted or plotband is on yAxis \n horiz = this.horiz,\n plus = 1,\n outside =\n (from < this.min && to < this.min) ||\n (from > this.max && to > this.max);\n\n if (path && toPath) {\n\n // Flat paths don't need labels (#3836)\n if (outside) {\n path.flat = path.toString() === toPath.toString();\n plus = 0;\n }\n\n // Add 1 pixel, when coordinates are the same\n path.push(\n horiz && toPath[4] === path[4] ? toPath[4] + plus : toPath[4], !horiz && toPath[5] === path[5] ? toPath[5] + plus : toPath[5],\n horiz && toPath[1] === path[1] ? toPath[1] + plus : toPath[1], !horiz && toPath[2] === path[2] ? toPath[2] + plus : toPath[2]\n );\n } else { // outside the axis area\n path = null;\n }\n\n return path;\n },\n\n /**\n * Add a plot band after render time.\n *\n * @param {AxisPlotBandsOptions} options\n * A configuration object for the plot band, as defined in {@link\n * https://api.highcharts.com/highcharts/xAxis.plotBands|\n * xAxis.plotBands}.\n * @return {Object}\n * The added plot band.\n * @sample highcharts/members/axis-addplotband/\n * Toggle the plot band from a button\n */\n addPlotBand: function(options) {\n return this.addPlotBandOrLine(options, 'plotBands');\n },\n\n /**\n * Add a plot line after render time.\n * \n * @param {AxisPlotLinesOptions} options\n * A configuration object for the plot line, as defined in {@link\n * https://api.highcharts.com/highcharts/xAxis.plotLines|\n * xAxis.plotLines}.\n * @return {Object}\n * The added plot line.\n * @sample highcharts/members/axis-addplotline/\n * Toggle the plot line from a button\n */\n addPlotLine: function(options) {\n return this.addPlotBandOrLine(options, 'plotLines');\n },\n\n /**\n * Add a plot band or plot line after render time. Called from addPlotBand\n * and addPlotLine internally.\n *\n * @private\n * @param options {AxisPlotLinesOptions|AxisPlotBandsOptions}\n * The plotBand or plotLine configuration object.\n */\n addPlotBandOrLine: function(options, coll) {\n var obj = new H.PlotLineOrBand(this, options).render(),\n userOptions = this.userOptions;\n\n if (obj) { // #2189\n // Add it to the user options for exporting and Axis.update\n if (coll) {\n userOptions[coll] = userOptions[coll] || [];\n userOptions[coll].push(options);\n }\n this.plotLinesAndBands.push(obj);\n }\n\n return obj;\n },\n\n /**\n * Remove a plot band or plot line from the chart by id. Called internally\n * from `removePlotBand` and `removePlotLine`.\n *\n * @private\n * @param {String} id\n */\n removePlotBandOrLine: function(id) {\n var plotLinesAndBands = this.plotLinesAndBands,\n options = this.options,\n userOptions = this.userOptions,\n i = plotLinesAndBands.length;\n while (i--) {\n if (plotLinesAndBands[i].id === id) {\n plotLinesAndBands[i].destroy();\n }\n }\n each([\n options.plotLines || [],\n userOptions.plotLines || [],\n options.plotBands || [],\n userOptions.plotBands || []\n ], function(arr) {\n i = arr.length;\n while (i--) {\n if (arr[i].id === id) {\n erase(arr, arr[i]);\n }\n }\n });\n },\n\n /**\n * Remove a plot band by its id.\n * \n * @param {String} id\n * The plot band's `id` as given in the original configuration\n * object or in the `addPlotBand` option.\n * @sample highcharts/members/axis-removeplotband/\n * Remove plot band by id\n * @sample highcharts/members/axis-addplotband/\n * Toggle the plot band from a button\n */\n removePlotBand: function(id) {\n this.removePlotBandOrLine(id);\n },\n\n /**\n * Remove a plot line by its id.\n * @param {String} id\n * The plot line's `id` as given in the original configuration\n * object or in the `addPlotLine` option.\n * @sample highcharts/xaxis/plotlines-id/\n * Remove plot line by id\n * @sample highcharts/members/axis-addplotline/\n * Toggle the plot line from a button\n */\n removePlotLine: function(id) {\n this.removePlotBandOrLine(id);\n }\n });\n\n }(Highcharts, Axis));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var dateFormat = H.dateFormat,\n each = H.each,\n extend = H.extend,\n format = H.format,\n isNumber = H.isNumber,\n map = H.map,\n merge = H.merge,\n pick = H.pick,\n splat = H.splat,\n syncTimeout = H.syncTimeout,\n timeUnits = H.timeUnits;\n /**\n * The tooltip object\n * @param {Object} chart The chart instance\n * @param {Object} options Tooltip options\n */\n H.Tooltip = function() {\n this.init.apply(this, arguments);\n };\n\n H.Tooltip.prototype = {\n\n init: function(chart, options) {\n\n // Save the chart and options\n this.chart = chart;\n this.options = options;\n\n // Keep track of the current series\n //this.currentSeries = undefined;\n\n // List of crosshairs\n this.crosshairs = [];\n\n // Current values of x and y when animating\n this.now = {\n x: 0,\n y: 0\n };\n\n // The tooltip is initially hidden\n this.isHidden = true;\n\n\n\n // Public property for getting the shared state.\n this.split = options.split && !chart.inverted;\n this.shared = options.shared || this.split;\n\n },\n\n /**\n * Destroy the single tooltips in a split tooltip.\n * If the tooltip is active then it is not destroyed, unless forced to.\n * @param {boolean} force Force destroy all tooltips.\n * @return {undefined}\n */\n cleanSplit: function(force) {\n each(this.chart.series, function(series) {\n var tt = series && series.tt;\n if (tt) {\n if (!tt.isActive || force) {\n series.tt = tt.destroy();\n } else {\n tt.isActive = false;\n }\n }\n });\n },\n\n\n\n\n /**\n * Create the Tooltip label element if it doesn't exist, then return the\n * label.\n */\n getLabel: function() {\n\n var renderer = this.chart.renderer,\n options = this.options;\n\n if (!this.label) {\n // Create the label\n if (this.split) {\n this.label = renderer.g('tooltip');\n } else {\n this.label = renderer.label(\n '',\n 0,\n 0,\n options.shape || 'callout',\n null,\n null,\n options.useHTML,\n null,\n 'tooltip'\n )\n .attr({\n padding: options.padding,\n r: options.borderRadius\n });\n\n\n this.label\n .attr({\n 'fill': options.backgroundColor,\n 'stroke-width': options.borderWidth\n })\n // #2301, #2657\n .css(options.style)\n .shadow(options.shadow);\n\n }\n\n\n\n this.label\n .attr({\n zIndex: 8\n })\n .add();\n }\n return this.label;\n },\n\n update: function(options) {\n this.destroy();\n // Update user options (#6218)\n merge(true, this.chart.options.tooltip.userOptions, options);\n this.init(this.chart, merge(true, this.options, options));\n },\n\n /**\n * Destroy the tooltip and its elements.\n */\n destroy: function() {\n // Destroy and clear local variables\n if (this.label) {\n this.label = this.label.destroy();\n }\n if (this.split && this.tt) {\n this.cleanSplit(this.chart, true);\n this.tt = this.tt.destroy();\n }\n clearTimeout(this.hideTimer);\n clearTimeout(this.tooltipTimeout);\n },\n\n /**\n * Provide a soft movement for the tooltip\n *\n * @param {Number} x\n * @param {Number} y\n * @private\n */\n move: function(x, y, anchorX, anchorY) {\n var tooltip = this,\n now = tooltip.now,\n animate = tooltip.options.animation !== false && !tooltip.isHidden &&\n // When we get close to the target position, abort animation and land on the right place (#3056)\n (Math.abs(x - now.x) > 1 || Math.abs(y - now.y) > 1),\n skipAnchor = tooltip.followPointer || tooltip.len > 1;\n\n // Get intermediate values for animation\n extend(now, {\n x: animate ? (2 * now.x + x) / 3 : x,\n y: animate ? (now.y + y) / 2 : y,\n anchorX: skipAnchor ? undefined : animate ? (2 * now.anchorX + anchorX) / 3 : anchorX,\n anchorY: skipAnchor ? undefined : animate ? (now.anchorY + anchorY) / 2 : anchorY\n });\n\n // Move to the intermediate value\n tooltip.getLabel().attr(now);\n\n\n // Run on next tick of the mouse tracker\n if (animate) {\n\n // Never allow two timeouts\n clearTimeout(this.tooltipTimeout);\n\n // Set the fixed interval ticking for the smooth tooltip\n this.tooltipTimeout = setTimeout(function() {\n // The interval function may still be running during destroy,\n // so check that the chart is really there before calling.\n if (tooltip) {\n tooltip.move(x, y, anchorX, anchorY);\n }\n }, 32);\n\n }\n },\n\n /**\n * Hide the tooltip\n */\n hide: function(delay) {\n var tooltip = this;\n clearTimeout(this.hideTimer); // disallow duplicate timers (#1728, #1766)\n delay = pick(delay, this.options.hideDelay, 500);\n if (!this.isHidden) {\n this.hideTimer = syncTimeout(function() {\n tooltip.getLabel()[delay ? 'fadeOut' : 'hide']();\n tooltip.isHidden = true;\n }, delay);\n }\n },\n\n /**\n * Extendable method to get the anchor position of the tooltip\n * from a point or set of points\n */\n getAnchor: function(points, mouseEvent) {\n var ret,\n chart = this.chart,\n inverted = chart.inverted,\n plotTop = chart.plotTop,\n plotLeft = chart.plotLeft,\n plotX = 0,\n plotY = 0,\n yAxis,\n xAxis;\n\n points = splat(points);\n\n // Pie uses a special tooltipPos\n ret = points[0].tooltipPos;\n\n // When tooltip follows mouse, relate the position to the mouse\n if (this.followPointer && mouseEvent) {\n if (mouseEvent.chartX === undefined) {\n mouseEvent = chart.pointer.normalize(mouseEvent);\n }\n ret = [\n mouseEvent.chartX - chart.plotLeft,\n mouseEvent.chartY - plotTop\n ];\n }\n // When shared, use the average position\n if (!ret) {\n each(points, function(point) {\n yAxis = point.series.yAxis;\n xAxis = point.series.xAxis;\n plotX += point.plotX + (!inverted && xAxis ? xAxis.left - plotLeft : 0);\n plotY += (point.plotLow ? (point.plotLow + point.plotHigh) / 2 : point.plotY) +\n (!inverted && yAxis ? yAxis.top - plotTop : 0); // #1151\n });\n\n plotX /= points.length;\n plotY /= points.length;\n\n ret = [\n inverted ? chart.plotWidth - plotY : plotX,\n this.shared && !inverted && points.length > 1 && mouseEvent ?\n mouseEvent.chartY - plotTop : // place shared tooltip next to the mouse (#424)\n inverted ? chart.plotHeight - plotX : plotY\n ];\n }\n\n return map(ret, Math.round);\n },\n\n /**\n * Place the tooltip in a chart without spilling over\n * and not covering the point it self.\n */\n getPosition: function(boxWidth, boxHeight, point) {\n\n var chart = this.chart,\n distance = this.distance,\n ret = {},\n h = point.h || 0, // #4117\n swapped,\n first = ['y', chart.chartHeight, boxHeight,\n point.plotY + chart.plotTop, chart.plotTop,\n chart.plotTop + chart.plotHeight\n ],\n second = ['x', chart.chartWidth, boxWidth,\n point.plotX + chart.plotLeft, chart.plotLeft,\n chart.plotLeft + chart.plotWidth\n ],\n // The far side is right or bottom\n preferFarSide = !this.followPointer && pick(point.ttBelow, !chart.inverted === !!point.negative), // #4984\n /**\n * Handle the preferred dimension. When the preferred dimension is tooltip\n * on top or bottom of the point, it will look for space there.\n */\n firstDimension = function(dim, outerSize, innerSize, point, min, max) {\n var roomLeft = innerSize < point - distance,\n roomRight = point + distance + innerSize < outerSize,\n alignedLeft = point - distance - innerSize,\n alignedRight = point + distance;\n\n if (preferFarSide && roomRight) {\n ret[dim] = alignedRight;\n } else if (!preferFarSide && roomLeft) {\n ret[dim] = alignedLeft;\n } else if (roomLeft) {\n ret[dim] = Math.min(max - innerSize, alignedLeft - h < 0 ? alignedLeft : alignedLeft - h);\n } else if (roomRight) {\n ret[dim] = Math.max(\n min,\n alignedRight + h + innerSize > outerSize ?\n alignedRight :\n alignedRight + h\n );\n } else {\n return false;\n }\n },\n /**\n * Handle the secondary dimension. If the preferred dimension is tooltip\n * on top or bottom of the point, the second dimension is to align the tooltip\n * above the point, trying to align center but allowing left or right\n * align within the chart box.\n */\n secondDimension = function(dim, outerSize, innerSize, point) {\n var retVal;\n\n // Too close to the edge, return false and swap dimensions\n if (point < distance || point > outerSize - distance) {\n retVal = false;\n // Align left/top\n } else if (point < innerSize / 2) {\n ret[dim] = 1;\n // Align right/bottom\n } else if (point > outerSize - innerSize / 2) {\n ret[dim] = outerSize - innerSize - 2;\n // Align center\n } else {\n ret[dim] = point - innerSize / 2;\n }\n return retVal;\n },\n /**\n * Swap the dimensions\n */\n swap = function(count) {\n var temp = first;\n first = second;\n second = temp;\n swapped = count;\n },\n run = function() {\n if (firstDimension.apply(0, first) !== false) {\n if (secondDimension.apply(0, second) === false && !swapped) {\n swap(true);\n run();\n }\n } else if (!swapped) {\n swap(true);\n run();\n } else {\n ret.x = ret.y = 0;\n }\n };\n\n // Under these conditions, prefer the tooltip on the side of the point\n if (chart.inverted || this.len > 1) {\n swap();\n }\n run();\n\n return ret;\n\n },\n\n /**\n * In case no user defined formatter is given, this will be used. Note that the context\n * here is an object holding point, series, x, y etc.\n *\n * @returns {String|Array}\n */\n defaultFormatter: function(tooltip) {\n var items = this.points || splat(this),\n s;\n\n // Build the header\n s = [tooltip.tooltipFooterHeaderFormatter(items[0])];\n\n // build the values\n s = s.concat(tooltip.bodyFormatter(items));\n\n // footer\n s.push(tooltip.tooltipFooterHeaderFormatter(items[0], true));\n\n return s;\n },\n\n /**\n * Refresh the tooltip's text and position.\n * @param {Object|Array} pointOrPoints Rither a point or an array of points\n */\n refresh: function(pointOrPoints, mouseEvent) {\n var tooltip = this,\n label,\n options = tooltip.options,\n x,\n y,\n point = pointOrPoints,\n anchor,\n textConfig = {},\n text,\n pointConfig = [],\n formatter = options.formatter || tooltip.defaultFormatter,\n shared = tooltip.shared,\n currentSeries;\n\n clearTimeout(this.hideTimer);\n\n // get the reference point coordinates (pie charts use tooltipPos)\n tooltip.followPointer = splat(point)[0].series.tooltipOptions.followPointer;\n anchor = tooltip.getAnchor(point, mouseEvent);\n x = anchor[0];\n y = anchor[1];\n\n // shared tooltip, array is sent over\n if (shared && !(point.series && point.series.noSharedTooltip)) {\n each(point, function(item) {\n item.setState('hover');\n\n pointConfig.push(item.getLabelConfig());\n });\n\n textConfig = {\n x: point[0].category,\n y: point[0].y\n };\n textConfig.points = pointConfig;\n point = point[0];\n\n // single point tooltip\n } else {\n textConfig = point.getLabelConfig();\n }\n this.len = pointConfig.length; // #6128\n text = formatter.call(textConfig, tooltip);\n\n // register the current series\n currentSeries = point.series;\n this.distance = pick(currentSeries.tooltipOptions.distance, 16);\n\n // update the inner HTML\n if (text === false) {\n this.hide();\n } else {\n\n label = tooltip.getLabel();\n\n // show it\n if (tooltip.isHidden) {\n label.attr({\n opacity: 1\n }).show();\n }\n\n // update text\n if (tooltip.split) {\n this.renderSplit(text, pointOrPoints);\n } else {\n\n // Prevent the tooltip from flowing over the chart box (#6659)\n\n if (!options.style.width) {\n\n label.css({\n width: this.chart.spacingBox.width\n });\n\n }\n\n\n label.attr({\n text: text && text.join ? text.join('') : text\n });\n\n // Set the stroke color of the box to reflect the point\n label.removeClass(/highcharts-color-[\\d]+/g)\n .addClass('highcharts-color-' + pick(point.colorIndex, currentSeries.colorIndex));\n\n\n label.attr({\n stroke: options.borderColor || point.color || currentSeries.color || '#666666'\n });\n\n\n tooltip.updatePosition({\n plotX: x,\n plotY: y,\n negative: point.negative,\n ttBelow: point.ttBelow,\n h: anchor[2] || 0\n });\n }\n\n this.isHidden = false;\n }\n },\n\n /**\n * Render the split tooltip. Loops over each point's text and adds\n * a label next to the point, then uses the distribute function to \n * find best non-overlapping positions.\n */\n renderSplit: function(labels, points) {\n var tooltip = this,\n boxes = [],\n chart = this.chart,\n ren = chart.renderer,\n rightAligned = true,\n options = this.options,\n headerHeight,\n tooltipLabel = this.getLabel();\n\n // Create the individual labels for header and points, ignore footer\n each(labels.slice(0, points.length + 1), function(str, i) {\n var point = points[i - 1] ||\n // Item 0 is the header. Instead of this, we could also use the crosshair label\n {\n isHeader: true,\n plotX: points[0].plotX\n },\n owner = point.series || tooltip,\n tt = owner.tt,\n series = point.series || {},\n colorClass = 'highcharts-color-' + pick(point.colorIndex, series.colorIndex, 'none'),\n target,\n x,\n bBox,\n boxWidth;\n\n // Store the tooltip referance on the series\n if (!tt) {\n owner.tt = tt = ren.label(null, null, null, 'callout')\n .addClass('highcharts-tooltip-box ' + colorClass)\n .attr({\n 'padding': options.padding,\n 'r': options.borderRadius,\n\n 'fill': options.backgroundColor,\n 'stroke': point.color || series.color || '#333333',\n 'stroke-width': options.borderWidth\n\n })\n .add(tooltipLabel);\n }\n\n tt.isActive = true;\n tt.attr({\n text: str\n });\n\n tt.css(options.style);\n\n\n // Get X position now, so we can move all to the other side in case of overflow\n bBox = tt.getBBox();\n boxWidth = bBox.width + tt.strokeWidth();\n if (point.isHeader) {\n headerHeight = bBox.height;\n x = Math.max(\n 0, // No left overflow\n Math.min(\n point.plotX + chart.plotLeft - boxWidth / 2,\n chart.chartWidth - boxWidth // No right overflow (#5794)\n )\n );\n } else {\n x = point.plotX + chart.plotLeft - pick(options.distance, 16) -\n boxWidth;\n }\n\n\n // If overflow left, we don't use this x in the next loop\n if (x < 0) {\n rightAligned = false;\n }\n\n // Prepare for distribution\n target = (point.series && point.series.yAxis && point.series.yAxis.pos) + (point.plotY || 0);\n target -= chart.plotTop;\n boxes.push({\n target: point.isHeader ? chart.plotHeight + headerHeight : target,\n rank: point.isHeader ? 1 : 0,\n size: owner.tt.getBBox().height + 1,\n point: point,\n x: x,\n tt: tt\n });\n });\n\n // Clean previous run (for missing points)\n this.cleanSplit();\n\n // Distribute and put in place\n H.distribute(boxes, chart.plotHeight + headerHeight);\n each(boxes, function(box) {\n var point = box.point,\n series = point.series;\n\n // Put the label in place\n box.tt.attr({\n visibility: box.pos === undefined ? 'hidden' : 'inherit',\n x: (rightAligned || point.isHeader ?\n box.x :\n point.plotX + chart.plotLeft + pick(options.distance, 16)),\n y: box.pos + chart.plotTop,\n anchorX: point.isHeader ?\n point.plotX + chart.plotLeft : point.plotX + series.xAxis.pos,\n anchorY: point.isHeader ?\n box.pos + chart.plotTop - 15 : point.plotY + series.yAxis.pos\n });\n });\n },\n\n /**\n * Find the new position and perform the move\n */\n updatePosition: function(point) {\n var chart = this.chart,\n label = this.getLabel(),\n pos = (this.options.positioner || this.getPosition).call(\n this,\n label.width,\n label.height,\n point\n );\n\n // do the move\n this.move(\n Math.round(pos.x),\n Math.round(pos.y || 0), // can be undefined (#3977) \n point.plotX + chart.plotLeft,\n point.plotY + chart.plotTop\n );\n },\n\n /**\n * Get the optimal date format for a point, based on a range.\n * @param {number} range - The time range\n * @param {number|Date} date - The date of the point in question\n * @param {number} startOfWeek - An integer representing the first day of\n * the week, where 0 is Sunday\n * @param {Object} dateTimeLabelFormats - A map of time units to formats\n * @return {string} - the optimal date format for a point\n */\n getDateFormat: function(range, date, startOfWeek, dateTimeLabelFormats) {\n var dateStr = dateFormat('%m-%d %H:%M:%S.%L', date),\n format,\n n,\n blank = '01-01 00:00:00.000',\n strpos = {\n millisecond: 15,\n second: 12,\n minute: 9,\n hour: 6,\n day: 3\n },\n lastN = 'millisecond'; // for sub-millisecond data, #4223\n for (n in timeUnits) {\n\n // If the range is exactly one week and we're looking at a Sunday/Monday, go for the week format\n if (range === timeUnits.week && +dateFormat('%w', date) === startOfWeek &&\n dateStr.substr(6) === blank.substr(6)) {\n n = 'week';\n break;\n }\n\n // The first format that is too great for the range\n if (timeUnits[n] > range) {\n n = lastN;\n break;\n }\n\n // If the point is placed every day at 23:59, we need to show\n // the minutes as well. #2637.\n if (strpos[n] && dateStr.substr(strpos[n]) !== blank.substr(strpos[n])) {\n break;\n }\n\n // Weeks are outside the hierarchy, only apply them on Mondays/Sundays like in the first condition\n if (n !== 'week') {\n lastN = n;\n }\n }\n\n if (n) {\n format = dateTimeLabelFormats[n];\n }\n\n return format;\n },\n\n /**\n * Get the best X date format based on the closest point range on the axis.\n */\n getXDateFormat: function(point, options, xAxis) {\n var xDateFormat,\n dateTimeLabelFormats = options.dateTimeLabelFormats,\n closestPointRange = xAxis && xAxis.closestPointRange;\n\n if (closestPointRange) {\n xDateFormat = this.getDateFormat(\n closestPointRange,\n point.x,\n xAxis.options.startOfWeek,\n dateTimeLabelFormats\n );\n } else {\n xDateFormat = dateTimeLabelFormats.day;\n }\n\n return xDateFormat || dateTimeLabelFormats.year; // #2546, 2581\n },\n\n /**\n * Format the footer/header of the tooltip\n * #3397: abstraction to enable formatting of footer and header\n */\n tooltipFooterHeaderFormatter: function(labelConfig, isFooter) {\n var footOrHead = isFooter ? 'footer' : 'header',\n series = labelConfig.series,\n tooltipOptions = series.tooltipOptions,\n xDateFormat = tooltipOptions.xDateFormat,\n xAxis = series.xAxis,\n isDateTime = xAxis && xAxis.options.type === 'datetime' && isNumber(labelConfig.key),\n formatString = tooltipOptions[footOrHead + 'Format'];\n\n // Guess the best date format based on the closest point distance (#568, #3418)\n if (isDateTime && !xDateFormat) {\n xDateFormat = this.getXDateFormat(labelConfig, tooltipOptions, xAxis);\n }\n\n // Insert the footer date format if any\n if (isDateTime && xDateFormat) {\n formatString = formatString.replace('{point.key}', '{point.key:' + xDateFormat + '}');\n }\n\n return format(formatString, {\n point: labelConfig,\n series: series\n });\n },\n\n /**\n * Build the body (lines) of the tooltip by iterating over the items and returning one entry for each item,\n * abstracting this functionality allows to easily overwrite and extend it.\n */\n bodyFormatter: function(items) {\n return map(items, function(item) {\n var tooltipOptions = item.series.tooltipOptions;\n return (tooltipOptions.pointFormatter || item.point.tooltipFormatter)\n .call(item.point, tooltipOptions.pointFormat);\n });\n }\n\n };\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var addEvent = H.addEvent,\n attr = H.attr,\n charts = H.charts,\n color = H.color,\n css = H.css,\n defined = H.defined,\n doc = H.doc,\n each = H.each,\n extend = H.extend,\n fireEvent = H.fireEvent,\n offset = H.offset,\n pick = H.pick,\n removeEvent = H.removeEvent,\n splat = H.splat,\n Tooltip = H.Tooltip,\n win = H.win;\n\n /**\n * The mouse tracker object. All methods starting with \"on\" are primary DOM\n * event handlers. Subsequent methods should be named differently from what they\n * are doing.\n *\n * @constructor Pointer\n * @param {Object} chart The Chart instance\n * @param {Object} options The root options object\n */\n H.Pointer = function(chart, options) {\n this.init(chart, options);\n };\n\n H.Pointer.prototype = {\n /**\n * Initialize Pointer\n */\n init: function(chart, options) {\n\n // Store references\n this.options = options;\n this.chart = chart;\n\n // Do we need to handle click on a touch device?\n this.runChartClick = options.chart.events && !!options.chart.events.click;\n\n this.pinchDown = [];\n this.lastValidTouch = {};\n\n if (Tooltip && options.tooltip.enabled) {\n chart.tooltip = new Tooltip(chart, options.tooltip);\n this.followTouchMove = pick(options.tooltip.followTouchMove, true);\n }\n\n this.setDOMEvents();\n },\n\n /**\n * Resolve the zoomType option, this is reset on all touch start and mouse\n * down events.\n */\n zoomOption: function(e) {\n var chart = this.chart,\n options = chart.options.chart,\n zoomType = options.zoomType || '',\n inverted = chart.inverted,\n zoomX,\n zoomY;\n\n // Look for the pinchType option\n if (/touch/.test(e.type)) {\n zoomType = pick(options.pinchType, zoomType);\n }\n\n this.zoomX = zoomX = /x/.test(zoomType);\n this.zoomY = zoomY = /y/.test(zoomType);\n this.zoomHor = (zoomX && !inverted) || (zoomY && inverted);\n this.zoomVert = (zoomY && !inverted) || (zoomX && inverted);\n this.hasZoom = zoomX || zoomY;\n },\n\n /**\n * @typedef {Object} PointerEvent\n * A native browser mouse or touch event, extended with position\n * information relative to the {@link Chart.container}.\n * @property {Number} chartX\n * The X coordinate of the pointer interaction relative to the\n * chart.\n * @property {Number} chartY\n * The Y coordinate of the pointer interaction relative to the \n * chart.\n * \n */\n /**\n * Add crossbrowser support for chartX and chartY.\n * \n * @param {Object} e\n * The event object in standard browsers.\n *\n * @return {PointerEvent}\n * A browser event with extended properties `chartX` and `chartY`\n */\n normalize: function(e, chartPosition) {\n var chartX,\n chartY,\n ePos;\n\n // IE normalizing\n e = e || win.event;\n if (!e.target) {\n e.target = e.srcElement;\n }\n\n // iOS (#2757)\n ePos = e.touches ? (e.touches.length ? e.touches.item(0) : e.changedTouches[0]) : e;\n\n // Get mouse position\n if (!chartPosition) {\n this.chartPosition = chartPosition = offset(this.chart.container);\n }\n\n // chartX and chartY\n if (ePos.pageX === undefined) { // IE < 9. #886.\n chartX = Math.max(e.x, e.clientX - chartPosition.left); // #2005, #2129: the second case is \n // for IE10 quirks mode within framesets\n chartY = e.y;\n } else {\n chartX = ePos.pageX - chartPosition.left;\n chartY = ePos.pageY - chartPosition.top;\n }\n\n return extend(e, {\n chartX: Math.round(chartX),\n chartY: Math.round(chartY)\n });\n },\n\n /**\n * Get the click position in terms of axis values.\n *\n * @param {Object} e A pointer event\n */\n getCoordinates: function(e) {\n var coordinates = {\n xAxis: [],\n yAxis: []\n };\n\n each(this.chart.axes, function(axis) {\n coordinates[axis.isXAxis ? 'xAxis' : 'yAxis'].push({\n axis: axis,\n value: axis.toValue(e[axis.horiz ? 'chartX' : 'chartY'])\n });\n });\n return coordinates;\n },\n /**\n * Collects the points closest to a mouseEvent\n * @param {Array} series Array of series to gather points from\n * @param {Boolean} shared True if shared tooltip, otherwise false\n * @param {Object} e Mouse event which possess a position to compare against\n * @return {Array} KDPoints sorted by distance\n */\n getKDPoints: function(series, shared, e) {\n var kdpoints = [],\n noSharedTooltip,\n directTouch,\n kdpointT,\n i;\n\n // Find nearest points on all series\n each(series, function(s) {\n // Skip hidden series\n noSharedTooltip = s.noSharedTooltip && shared;\n directTouch = !shared && s.directTouch;\n if (s.visible && !directTouch && pick(s.options.enableMouseTracking, true)) { // #3821\n // #3828\n kdpointT = s.searchPoint(\n e, !noSharedTooltip && s.options.findNearestPointBy.indexOf('y') < 0\n );\n if (kdpointT && kdpointT.series) { // Point.series becomes null when reset and before redraw (#5197)\n kdpoints.push(kdpointT);\n }\n }\n });\n\n // Sort kdpoints by distance to mouse pointer\n kdpoints.sort(function(p1, p2) {\n var isCloserX = p1.distX - p2.distX,\n isCloser = p1.dist - p2.dist,\n isAbove =\n (p2.series.group && p2.series.group.zIndex) -\n (p1.series.group && p1.series.group.zIndex),\n result;\n\n // We have two points which are not in the same place on xAxis and shared tooltip:\n if (isCloserX !== 0 && shared) { // #5721\n result = isCloserX;\n // Points are not exactly in the same place on x/yAxis:\n } else if (isCloser !== 0) {\n result = isCloser;\n // The same xAxis and yAxis position, sort by z-index:\n } else if (isAbove !== 0) {\n result = isAbove;\n // The same zIndex, sort by array index:\n } else {\n result = p1.series.index > p2.series.index ? -1 : 1;\n }\n return result;\n });\n\n // Remove points with different x-positions, required for shared tooltip and crosshairs (#4645):\n if (shared && kdpoints[0] && !kdpoints[0].series.noSharedTooltip) {\n i = kdpoints.length;\n while (i--) {\n if (kdpoints[i].x !== kdpoints[0].x || kdpoints[i].series.noSharedTooltip) {\n kdpoints.splice(i, 1);\n }\n }\n }\n return kdpoints;\n },\n getPointFromEvent: function(e) {\n var target = e.target,\n point;\n\n while (target && !point) {\n point = target.point;\n target = target.parentNode;\n }\n return point;\n },\n\n getChartCoordinatesFromPoint: function(point, inverted) {\n var series = point.series,\n xAxis = series.xAxis,\n yAxis = series.yAxis;\n\n if (xAxis && yAxis) {\n return inverted ? {\n chartX: xAxis.len + xAxis.pos - point.clientX,\n chartY: yAxis.len + yAxis.pos - point.plotY\n } : {\n chartX: point.clientX + xAxis.pos,\n chartY: point.plotY + yAxis.pos\n };\n }\n },\n\n /**\n * Calculates what is the current hovered point/points and series.\n *\n * @private\n *\n * @param {undefined|Point} existingHoverPoint\n * The point currrently beeing hovered.\n * @param {undefined|Series} existingHoverSeries\n * The series currently beeing hovered.\n * @param {Array<.Series>} series\n * All the series in the chart.\n * @param {boolean} isDirectTouch\n * Is the pointer directly hovering the point.\n * @param {boolean} shared\n * Whether it is a shared tooltip or not.\n * @param {object} coordinates\n * Chart coordinates of the pointer.\n * @param {number} coordinates.chartX\n * @param {number} coordinates.chartY\n * \n * @return {object}\n * Object containing resulting hover data.\n */\n getHoverData: function(\n existingHoverPoint,\n existingHoverSeries,\n series,\n isDirectTouch,\n shared,\n coordinates\n ) {\n var hoverPoint = existingHoverPoint,\n hoverSeries = existingHoverSeries,\n searchSeries = shared ? series : [hoverSeries],\n useExisting = !!(isDirectTouch && existingHoverPoint),\n notSticky = hoverSeries && !hoverSeries.stickyTracking,\n isHoverPoint = function(point, i) {\n return i === 0;\n },\n hoverPoints;\n\n // If there is a hoverPoint and its series requires direct touch (like\n // columns, #3899), or we're on a noSharedTooltip series among shared\n // tooltip series (#4546), use the existing hoverPoint.\n if (useExisting) {\n isHoverPoint = function(p) {\n return p === existingHoverPoint;\n };\n } else if (notSticky) {\n isHoverPoint = function(p) {\n return p.series === hoverSeries;\n };\n } else {\n // Avoid series with stickyTracking false\n searchSeries = H.grep(series, function(s) {\n return s.stickyTracking;\n });\n }\n hoverPoints = (useExisting && !shared) ?\n // Non-shared tooltips with directTouch don't use the k-d-tree\n [existingHoverPoint] :\n this.getKDPoints(searchSeries, shared, coordinates);\n hoverPoint = H.find(hoverPoints, isHoverPoint);\n hoverSeries = hoverPoint && hoverPoint.series;\n\n // In this case we could only look for the hoverPoint in series with\n // stickyTracking, but we should still include all series in the shared\n // tooltip.\n if (!useExisting && !notSticky && shared) {\n hoverPoints = this.getKDPoints(series, shared, coordinates);\n }\n // Keep the order of series in tooltip\n // Must be done after assigning of hoverPoint\n hoverPoints.sort(function(p1, p2) {\n return p1.series.index - p2.series.index;\n });\n\n return {\n hoverPoint: hoverPoint,\n hoverSeries: hoverSeries,\n hoverPoints: hoverPoints\n };\n },\n /**\n * With line type charts with a single tracker, get the point closest to the mouse.\n * Run Point.onMouseOver and display tooltip for the point or points.\n */\n runPointActions: function(e, p) {\n var pointer = this,\n chart = pointer.chart,\n series = chart.series,\n tooltip = chart.tooltip,\n shared = tooltip ? tooltip.shared : false,\n hoverPoint = p || chart.hoverPoint,\n hoverSeries = hoverPoint && hoverPoint.series || chart.hoverSeries,\n // onMouseOver or already hovering a series with directTouch\n isDirectTouch = !!p || (\n (hoverSeries && hoverSeries.directTouch) &&\n pointer.isDirectTouch\n ),\n hoverData = this.getHoverData(\n hoverPoint,\n hoverSeries,\n series,\n isDirectTouch,\n shared,\n e\n ),\n useSharedTooltip,\n followPointer,\n anchor,\n points;\n // Update variables from hoverData.\n hoverPoint = hoverData.hoverPoint;\n hoverSeries = hoverData.hoverSeries;\n followPointer = hoverSeries && hoverSeries.tooltipOptions.followPointer;\n useSharedTooltip = (\n shared &&\n hoverPoint &&\n !hoverPoint.series.noSharedTooltip\n );\n points = (useSharedTooltip ?\n hoverData.hoverPoints :\n (hoverPoint ? [hoverPoint] : [])\n );\n // Refresh tooltip for kdpoint if new hover point or tooltip was hidden\n // #3926, #4200\n if (\n hoverPoint &&\n // !(hoverSeries && hoverSeries.directTouch) &&\n (hoverPoint !== chart.hoverPoint || (tooltip && tooltip.isHidden))\n ) {\n each(chart.hoverPoints || [], function(p) {\n if (H.inArray(p, points) === -1) {\n p.setState();\n }\n });\n // Do mouseover on all points (#3919, #3985, #4410, #5622)\n each(points || [], function(p) {\n p.setState('hover');\n });\n // set normal state to previous series\n if (chart.hoverSeries !== hoverSeries) {\n hoverSeries.onMouseOver();\n }\n\n // If tracking is on series in stead of on each point, \n // fire mouseOver on hover point. // #4448\n if (chart.hoverPoint) {\n chart.hoverPoint.firePointEvent('mouseOut');\n }\n hoverPoint.firePointEvent('mouseOver');\n chart.hoverPoints = points;\n chart.hoverPoint = hoverPoint;\n // Draw tooltip if necessary\n if (tooltip) {\n tooltip.refresh(useSharedTooltip ? points : hoverPoint, e);\n }\n // Update positions (regardless of kdpoint or hoverPoint)\n } else if (followPointer && tooltip && !tooltip.isHidden) {\n anchor = tooltip.getAnchor([{}], e);\n tooltip.updatePosition({\n plotX: anchor[0],\n plotY: anchor[1]\n });\n }\n\n // Start the event listener to pick up the tooltip and crosshairs\n if (!pointer.unDocMouseMove) {\n pointer.unDocMouseMove = addEvent(doc, 'mousemove', function(e) {\n var chart = charts[H.hoverChartIndex];\n if (chart) {\n chart.pointer.onDocumentMouseMove(e);\n }\n });\n }\n\n // Issues related to crosshair #4927, #5269 #5066, #5658\n each(chart.axes, function drawAxisCrosshair(axis) {\n var snap = pick(axis.crosshair.snap, true);\n if (!snap) {\n axis.drawCrosshair(e);\n\n // Axis has snapping crosshairs, and one of the hover points belongs\n // to axis\n } else if (H.find(points, function(p) {\n return p.series[axis.coll] === axis;\n })) {\n axis.drawCrosshair(e, hoverPoint);\n // Axis has snapping crosshairs, but no hover point belongs to axis\n } else {\n axis.hideCrosshair();\n }\n });\n },\n\n /**\n * Reset the tracking by hiding the tooltip, the hover series state and the\n * hover point\n *\n * @param allowMove {Boolean}\n * Instead of destroying the tooltip altogether, allow moving it if\n * possible\n */\n reset: function(allowMove, delay) {\n var pointer = this,\n chart = pointer.chart,\n hoverSeries = chart.hoverSeries,\n hoverPoint = chart.hoverPoint,\n hoverPoints = chart.hoverPoints,\n tooltip = chart.tooltip,\n tooltipPoints = tooltip && tooltip.shared ? hoverPoints : hoverPoint;\n\n // Check if the points have moved outside the plot area (#1003, #4736, #5101)\n if (allowMove && tooltipPoints) {\n each(splat(tooltipPoints), function(point) {\n if (point.series.isCartesian && point.plotX === undefined) {\n allowMove = false;\n }\n });\n }\n\n // Just move the tooltip, #349\n if (allowMove) {\n if (tooltip && tooltipPoints) {\n tooltip.refresh(tooltipPoints);\n if (hoverPoint) { // #2500\n hoverPoint.setState(hoverPoint.state, true);\n each(chart.axes, function(axis) {\n if (axis.crosshair) {\n axis.drawCrosshair(null, hoverPoint);\n }\n });\n }\n }\n\n // Full reset\n } else {\n\n if (hoverPoint) {\n hoverPoint.onMouseOut();\n }\n\n if (hoverPoints) {\n each(hoverPoints, function(point) {\n point.setState();\n });\n }\n\n if (hoverSeries) {\n hoverSeries.onMouseOut();\n }\n\n if (tooltip) {\n tooltip.hide(delay);\n }\n\n if (pointer.unDocMouseMove) {\n pointer.unDocMouseMove = pointer.unDocMouseMove();\n }\n\n // Remove crosshairs\n each(chart.axes, function(axis) {\n axis.hideCrosshair();\n });\n\n pointer.hoverX = chart.hoverPoints = chart.hoverPoint = null;\n }\n },\n\n /**\n * Scale series groups to a certain scale and translation\n */\n scaleGroups: function(attribs, clip) {\n\n var chart = this.chart,\n seriesAttribs;\n\n // Scale each series\n each(chart.series, function(series) {\n seriesAttribs = attribs || series.getPlotBox(); // #1701\n if (series.xAxis && series.xAxis.zoomEnabled && series.group) {\n series.group.attr(seriesAttribs);\n if (series.markerGroup) {\n series.markerGroup.attr(seriesAttribs);\n series.markerGroup.clip(clip ? chart.clipRect : null);\n }\n if (series.dataLabelsGroup) {\n series.dataLabelsGroup.attr(seriesAttribs);\n }\n }\n });\n\n // Clip\n chart.clipRect.attr(clip || chart.clipBox);\n },\n\n /**\n * Start a drag operation\n */\n dragStart: function(e) {\n var chart = this.chart;\n\n // Record the start position\n chart.mouseIsDown = e.type;\n chart.cancelClick = false;\n chart.mouseDownX = this.mouseDownX = e.chartX;\n chart.mouseDownY = this.mouseDownY = e.chartY;\n },\n\n /**\n * Perform a drag operation in response to a mousemove event while the mouse is down\n */\n drag: function(e) {\n\n var chart = this.chart,\n chartOptions = chart.options.chart,\n chartX = e.chartX,\n chartY = e.chartY,\n zoomHor = this.zoomHor,\n zoomVert = this.zoomVert,\n plotLeft = chart.plotLeft,\n plotTop = chart.plotTop,\n plotWidth = chart.plotWidth,\n plotHeight = chart.plotHeight,\n clickedInside,\n size,\n selectionMarker = this.selectionMarker,\n mouseDownX = this.mouseDownX,\n mouseDownY = this.mouseDownY,\n panKey = chartOptions.panKey && e[chartOptions.panKey + 'Key'];\n\n // If the device supports both touch and mouse (like IE11), and we are touch-dragging\n // inside the plot area, don't handle the mouse event. #4339.\n if (selectionMarker && selectionMarker.touch) {\n return;\n }\n\n // If the mouse is outside the plot area, adjust to cooordinates\n // inside to prevent the selection marker from going outside\n if (chartX < plotLeft) {\n chartX = plotLeft;\n } else if (chartX > plotLeft + plotWidth) {\n chartX = plotLeft + plotWidth;\n }\n\n if (chartY < plotTop) {\n chartY = plotTop;\n } else if (chartY > plotTop + plotHeight) {\n chartY = plotTop + plotHeight;\n }\n\n // determine if the mouse has moved more than 10px\n this.hasDragged = Math.sqrt(\n Math.pow(mouseDownX - chartX, 2) +\n Math.pow(mouseDownY - chartY, 2)\n );\n\n if (this.hasDragged > 10) {\n clickedInside = chart.isInsidePlot(mouseDownX - plotLeft, mouseDownY - plotTop);\n\n // make a selection\n if (chart.hasCartesianSeries && (this.zoomX || this.zoomY) && clickedInside && !panKey) {\n if (!selectionMarker) {\n this.selectionMarker = selectionMarker = chart.renderer.rect(\n plotLeft,\n plotTop,\n zoomHor ? 1 : plotWidth,\n zoomVert ? 1 : plotHeight,\n 0\n )\n .attr({\n\n fill: chartOptions.selectionMarkerFill || color('#335cad').setOpacity(0.25).get(),\n\n 'class': 'highcharts-selection-marker',\n 'zIndex': 7\n })\n .add();\n }\n }\n\n // adjust the width of the selection marker\n if (selectionMarker && zoomHor) {\n size = chartX - mouseDownX;\n selectionMarker.attr({\n width: Math.abs(size),\n x: (size > 0 ? 0 : size) + mouseDownX\n });\n }\n // adjust the height of the selection marker\n if (selectionMarker && zoomVert) {\n size = chartY - mouseDownY;\n selectionMarker.attr({\n height: Math.abs(size),\n y: (size > 0 ? 0 : size) + mouseDownY\n });\n }\n\n // panning\n if (clickedInside && !selectionMarker && chartOptions.panning) {\n chart.pan(e, chartOptions.panning);\n }\n }\n },\n\n /**\n * On mouse up or touch end across the entire document, drop the selection.\n */\n drop: function(e) {\n var pointer = this,\n chart = this.chart,\n hasPinched = this.hasPinched;\n\n if (this.selectionMarker) {\n var selectionData = {\n originalEvent: e, // #4890\n xAxis: [],\n yAxis: []\n },\n selectionBox = this.selectionMarker,\n selectionLeft = selectionBox.attr ? selectionBox.attr('x') : selectionBox.x,\n selectionTop = selectionBox.attr ? selectionBox.attr('y') : selectionBox.y,\n selectionWidth = selectionBox.attr ? selectionBox.attr('width') : selectionBox.width,\n selectionHeight = selectionBox.attr ? selectionBox.attr('height') : selectionBox.height,\n runZoom;\n\n // a selection has been made\n if (this.hasDragged || hasPinched) {\n\n // record each axis' min and max\n each(chart.axes, function(axis) {\n if (axis.zoomEnabled && defined(axis.min) && (hasPinched || pointer[{\n xAxis: 'zoomX',\n yAxis: 'zoomY'\n }[axis.coll]])) { // #859, #3569\n var horiz = axis.horiz,\n minPixelPadding = e.type === 'touchend' ? axis.minPixelPadding : 0, // #1207, #3075\n selectionMin = axis.toValue((horiz ? selectionLeft : selectionTop) + minPixelPadding),\n selectionMax = axis.toValue((horiz ? selectionLeft + selectionWidth : selectionTop + selectionHeight) - minPixelPadding);\n\n selectionData[axis.coll].push({\n axis: axis,\n min: Math.min(selectionMin, selectionMax), // for reversed axes\n max: Math.max(selectionMin, selectionMax)\n });\n runZoom = true;\n }\n });\n if (runZoom) {\n fireEvent(chart, 'selection', selectionData, function(args) {\n chart.zoom(extend(args, hasPinched ? {\n animation: false\n } : null));\n });\n }\n\n }\n this.selectionMarker = this.selectionMarker.destroy();\n\n // Reset scaling preview\n if (hasPinched) {\n this.scaleGroups();\n }\n }\n\n // Reset all\n if (chart) { // it may be destroyed on mouse up - #877\n css(chart.container, {\n cursor: chart._cursor\n });\n chart.cancelClick = this.hasDragged > 10; // #370\n chart.mouseIsDown = this.hasDragged = this.hasPinched = false;\n this.pinchDown = [];\n }\n },\n\n onContainerMouseDown: function(e) {\n\n e = this.normalize(e);\n\n this.zoomOption(e);\n\n // issue #295, dragging not always working in Firefox\n if (e.preventDefault) {\n e.preventDefault();\n }\n\n this.dragStart(e);\n },\n\n\n\n onDocumentMouseUp: function(e) {\n if (charts[H.hoverChartIndex]) {\n charts[H.hoverChartIndex].pointer.drop(e);\n }\n },\n\n /**\n * Special handler for mouse move that will hide the tooltip when the mouse leaves the plotarea.\n * Issue #149 workaround. The mouseleave event does not always fire.\n */\n onDocumentMouseMove: function(e) {\n var chart = this.chart,\n chartPosition = this.chartPosition;\n\n e = this.normalize(e, chartPosition);\n\n // If we're outside, hide the tooltip\n if (chartPosition && !this.inClass(e.target, 'highcharts-tracker') &&\n !chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) {\n this.reset();\n }\n },\n\n /**\n * When mouse leaves the container, hide the tooltip.\n */\n onContainerMouseLeave: function(e) {\n var chart = charts[H.hoverChartIndex];\n if (chart && (e.relatedTarget || e.toElement)) { // #4886, MS Touch end fires mouseleave but with no related target\n chart.pointer.reset();\n chart.pointer.chartPosition = null; // also reset the chart position, used in #149 fix\n }\n },\n\n // The mousemove, touchmove and touchstart event handler\n onContainerMouseMove: function(e) {\n\n var chart = this.chart;\n\n if (!defined(H.hoverChartIndex) || !charts[H.hoverChartIndex] || !charts[H.hoverChartIndex].mouseIsDown) {\n H.hoverChartIndex = chart.index;\n }\n\n e = this.normalize(e);\n e.returnValue = false; // #2251, #3224\n\n if (chart.mouseIsDown === 'mousedown') {\n this.drag(e);\n }\n\n // Show the tooltip and run mouse over events (#977)\n if ((this.inClass(e.target, 'highcharts-tracker') ||\n chart.isInsidePlot(e.chartX - chart.plotLeft, e.chartY - chart.plotTop)) && !chart.openMenu) {\n this.runPointActions(e);\n }\n },\n\n /**\n * Utility to detect whether an element has, or has a parent with, a specific\n * class name. Used on detection of tracker objects and on deciding whether\n * hovering the tooltip should cause the active series to mouse out.\n */\n inClass: function(element, className) {\n var elemClassName;\n while (element) {\n elemClassName = attr(element, 'class');\n if (elemClassName) {\n if (elemClassName.indexOf(className) !== -1) {\n return true;\n }\n if (elemClassName.indexOf('highcharts-container') !== -1) {\n return false;\n }\n }\n element = element.parentNode;\n }\n },\n\n onTrackerMouseOut: function(e) {\n var series = this.chart.hoverSeries,\n relatedTarget = e.relatedTarget || e.toElement;\n this.isDirectTouch = false;\n if (series && relatedTarget && !series.stickyTracking &&\n !this.inClass(relatedTarget, 'highcharts-tooltip') &&\n (!this.inClass(relatedTarget, 'highcharts-series-' + series.index) || // #2499, #4465\n !this.inClass(relatedTarget, 'highcharts-tracker') // #5553\n )\n ) {\n series.onMouseOut();\n }\n },\n\n onContainerClick: function(e) {\n var chart = this.chart,\n hoverPoint = chart.hoverPoint,\n plotLeft = chart.plotLeft,\n plotTop = chart.plotTop;\n\n e = this.normalize(e);\n\n if (!chart.cancelClick) {\n\n // On tracker click, fire the series and point events. #783, #1583\n if (hoverPoint && this.inClass(e.target, 'highcharts-tracker')) {\n\n // the series click event\n fireEvent(hoverPoint.series, 'click', extend(e, {\n point: hoverPoint\n }));\n\n // the point click event\n if (chart.hoverPoint) { // it may be destroyed (#1844)\n hoverPoint.firePointEvent('click', e);\n }\n\n // When clicking outside a tracker, fire a chart event\n } else {\n extend(e, this.getCoordinates(e));\n\n // fire a click event in the chart\n if (chart.isInsidePlot(e.chartX - plotLeft, e.chartY - plotTop)) {\n fireEvent(chart, 'click', e);\n }\n }\n\n\n }\n },\n\n /**\n * Set the JS DOM events on the container and document. This method should contain\n * a one-to-one assignment between methods and their handlers. Any advanced logic should\n * be moved to the handler reflecting the event's name.\n */\n setDOMEvents: function() {\n\n var pointer = this,\n container = pointer.chart.container;\n\n container.onmousedown = function(e) {\n pointer.onContainerMouseDown(e);\n };\n container.onmousemove = function(e) {\n pointer.onContainerMouseMove(e);\n };\n container.onclick = function(e) {\n pointer.onContainerClick(e);\n };\n addEvent(container, 'mouseleave', pointer.onContainerMouseLeave);\n if (H.chartCount === 1) {\n addEvent(doc, 'mouseup', pointer.onDocumentMouseUp);\n }\n if (H.hasTouch) {\n container.ontouchstart = function(e) {\n pointer.onContainerTouchStart(e);\n };\n container.ontouchmove = function(e) {\n pointer.onContainerTouchMove(e);\n };\n if (H.chartCount === 1) {\n addEvent(doc, 'touchend', pointer.onDocumentTouchEnd);\n }\n }\n\n },\n\n /**\n * Destroys the Pointer object and disconnects DOM events.\n */\n destroy: function() {\n var pointer = this;\n\n if (pointer.unDocMouseMove) {\n pointer.unDocMouseMove();\n }\n\n removeEvent(\n pointer.chart.container,\n 'mouseleave',\n pointer.onContainerMouseLeave\n );\n if (!H.chartCount) {\n removeEvent(doc, 'mouseup', pointer.onDocumentMouseUp);\n removeEvent(doc, 'touchend', pointer.onDocumentTouchEnd);\n }\n\n // memory and CPU leak\n clearInterval(pointer.tooltipTimeout);\n\n H.objectEach(pointer, function(val, prop) {\n pointer[prop] = null;\n });\n }\n };\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var charts = H.charts,\n each = H.each,\n extend = H.extend,\n map = H.map,\n noop = H.noop,\n pick = H.pick,\n Pointer = H.Pointer;\n\n /* Support for touch devices */\n extend(Pointer.prototype, /** @lends Pointer.prototype */ {\n\n /**\n * Run translation operations\n */\n pinchTranslate: function(pinchDown, touches, transform, selectionMarker, clip, lastValidTouch) {\n if (this.zoomHor) {\n this.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n }\n if (this.zoomVert) {\n this.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n }\n },\n\n /**\n * Run translation operations for each direction (horizontal and vertical) independently\n */\n pinchTranslateDirection: function(horiz, pinchDown, touches, transform,\n selectionMarker, clip, lastValidTouch, forcedScale) {\n var chart = this.chart,\n xy = horiz ? 'x' : 'y',\n XY = horiz ? 'X' : 'Y',\n sChartXY = 'chart' + XY,\n wh = horiz ? 'width' : 'height',\n plotLeftTop = chart['plot' + (horiz ? 'Left' : 'Top')],\n selectionWH,\n selectionXY,\n clipXY,\n scale = forcedScale || 1,\n inverted = chart.inverted,\n bounds = chart.bounds[horiz ? 'h' : 'v'],\n singleTouch = pinchDown.length === 1,\n touch0Start = pinchDown[0][sChartXY],\n touch0Now = touches[0][sChartXY],\n touch1Start = !singleTouch && pinchDown[1][sChartXY],\n touch1Now = !singleTouch && touches[1][sChartXY],\n outOfBounds,\n transformScale,\n scaleKey,\n setScale = function() {\n // Don't zoom if fingers are too close on this axis\n if (!singleTouch && Math.abs(touch0Start - touch1Start) > 20) {\n scale = forcedScale || Math.abs(touch0Now - touch1Now) / Math.abs(touch0Start - touch1Start);\n }\n\n clipXY = ((plotLeftTop - touch0Now) / scale) + touch0Start;\n selectionWH = chart['plot' + (horiz ? 'Width' : 'Height')] / scale;\n };\n\n // Set the scale, first pass\n setScale();\n\n selectionXY = clipXY; // the clip position (x or y) is altered if out of bounds, the selection position is not\n\n // Out of bounds\n if (selectionXY < bounds.min) {\n selectionXY = bounds.min;\n outOfBounds = true;\n } else if (selectionXY + selectionWH > bounds.max) {\n selectionXY = bounds.max - selectionWH;\n outOfBounds = true;\n }\n\n // Is the chart dragged off its bounds, determined by dataMin and dataMax?\n if (outOfBounds) {\n\n // Modify the touchNow position in order to create an elastic drag movement. This indicates\n // to the user that the chart is responsive but can't be dragged further.\n touch0Now -= 0.8 * (touch0Now - lastValidTouch[xy][0]);\n if (!singleTouch) {\n touch1Now -= 0.8 * (touch1Now - lastValidTouch[xy][1]);\n }\n\n // Set the scale, second pass to adapt to the modified touchNow positions\n setScale();\n\n } else {\n lastValidTouch[xy] = [touch0Now, touch1Now];\n }\n\n // Set geometry for clipping, selection and transformation\n if (!inverted) {\n clip[xy] = clipXY - plotLeftTop;\n clip[wh] = selectionWH;\n }\n scaleKey = inverted ? (horiz ? 'scaleY' : 'scaleX') : 'scale' + XY;\n transformScale = inverted ? 1 / scale : scale;\n\n selectionMarker[wh] = selectionWH;\n selectionMarker[xy] = selectionXY;\n transform[scaleKey] = scale;\n transform['translate' + XY] = (transformScale * plotLeftTop) + (touch0Now - (transformScale * touch0Start));\n },\n\n /**\n * Handle touch events with two touches\n */\n pinch: function(e) {\n\n var self = this,\n chart = self.chart,\n pinchDown = self.pinchDown,\n touches = e.touches,\n touchesLength = touches.length,\n lastValidTouch = self.lastValidTouch,\n hasZoom = self.hasZoom,\n selectionMarker = self.selectionMarker,\n transform = {},\n fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, 'highcharts-tracker') &&\n chart.runTrackerClick) || self.runChartClick),\n clip = {};\n\n // Don't initiate panning until the user has pinched. This prevents us from\n // blocking page scrolling as users scroll down a long page (#4210).\n if (touchesLength > 1) {\n self.initiated = true;\n }\n\n // On touch devices, only proceed to trigger click if a handler is defined\n if (hasZoom && self.initiated && !fireClickEvent) {\n e.preventDefault();\n }\n\n // Normalize each touch\n map(touches, function(e) {\n return self.normalize(e);\n });\n\n // Register the touch start position\n if (e.type === 'touchstart') {\n each(touches, function(e, i) {\n pinchDown[i] = {\n chartX: e.chartX,\n chartY: e.chartY\n };\n });\n lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];\n lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];\n\n // Identify the data bounds in pixels\n each(chart.axes, function(axis) {\n if (axis.zoomEnabled) {\n var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],\n minPixelPadding = axis.minPixelPadding,\n min = axis.toPixels(pick(axis.options.min, axis.dataMin)),\n max = axis.toPixels(pick(axis.options.max, axis.dataMax)),\n absMin = Math.min(min, max),\n absMax = Math.max(min, max);\n\n // Store the bounds for use in the touchmove handler\n bounds.min = Math.min(axis.pos, absMin - minPixelPadding);\n bounds.max = Math.max(axis.pos + axis.len, absMax + minPixelPadding);\n }\n });\n self.res = true; // reset on next move\n\n // Optionally move the tooltip on touchmove\n } else if (self.followTouchMove && touchesLength === 1) {\n this.runPointActions(self.normalize(e));\n\n // Event type is touchmove, handle panning and pinching\n } else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first\n\n\n // Set the marker\n if (!selectionMarker) {\n self.selectionMarker = selectionMarker = extend({\n destroy: noop,\n touch: true\n }, chart.plotBox);\n }\n\n self.pinchTranslate(pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);\n\n self.hasPinched = hasZoom;\n\n // Scale and translate the groups to provide visual feedback during pinching\n self.scaleGroups(transform, clip);\n\n if (self.res) {\n self.res = false;\n this.reset(false, 0);\n }\n }\n },\n\n /**\n * General touch handler shared by touchstart and touchmove.\n */\n touch: function(e, start) {\n var chart = this.chart,\n hasMoved,\n pinchDown,\n isInside;\n\n if (chart.index !== H.hoverChartIndex) {\n this.onContainerMouseLeave({\n relatedTarget: true\n });\n }\n H.hoverChartIndex = chart.index;\n\n if (e.touches.length === 1) {\n\n e = this.normalize(e);\n\n isInside = chart.isInsidePlot(\n e.chartX - chart.plotLeft,\n e.chartY - chart.plotTop\n );\n if (isInside && !chart.openMenu) {\n\n // Run mouse events and display tooltip etc\n if (start) {\n this.runPointActions(e);\n }\n\n // Android fires touchmove events after the touchstart even if the\n // finger hasn't moved, or moved only a pixel or two. In iOS however,\n // the touchmove doesn't fire unless the finger moves more than ~4px.\n // So we emulate this behaviour in Android by checking how much it\n // moved, and cancelling on small distances. #3450.\n if (e.type === 'touchmove') {\n pinchDown = this.pinchDown;\n hasMoved = pinchDown[0] ? Math.sqrt( // #5266\n Math.pow(pinchDown[0].chartX - e.chartX, 2) +\n Math.pow(pinchDown[0].chartY - e.chartY, 2)\n ) >= 4 : false;\n }\n\n if (pick(hasMoved, true)) {\n this.pinch(e);\n }\n\n } else if (start) {\n // Hide the tooltip on touching outside the plot area (#1203)\n this.reset();\n }\n\n } else if (e.touches.length === 2) {\n this.pinch(e);\n }\n },\n\n onContainerTouchStart: function(e) {\n this.zoomOption(e);\n this.touch(e, true);\n },\n\n onContainerTouchMove: function(e) {\n this.touch(e);\n },\n\n onDocumentTouchEnd: function(e) {\n if (charts[H.hoverChartIndex]) {\n charts[H.hoverChartIndex].pointer.drop(e);\n }\n }\n\n });\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var addEvent = H.addEvent,\n charts = H.charts,\n css = H.css,\n doc = H.doc,\n extend = H.extend,\n hasTouch = H.hasTouch,\n noop = H.noop,\n Pointer = H.Pointer,\n removeEvent = H.removeEvent,\n win = H.win,\n wrap = H.wrap;\n\n if (!hasTouch && (win.PointerEvent || win.MSPointerEvent)) {\n\n // The touches object keeps track of the points being touched at all times\n var touches = {},\n hasPointerEvent = !!win.PointerEvent,\n getWebkitTouches = function() {\n var fake = [];\n fake.item = function(i) {\n return this[i];\n };\n H.objectEach(touches, function(touch) {\n fake.push({\n pageX: touch.pageX,\n pageY: touch.pageY,\n target: touch.target\n });\n });\n return fake;\n },\n translateMSPointer = function(e, method, wktype, func) {\n var p;\n if ((e.pointerType === 'touch' || e.pointerType === e.MSPOINTER_TYPE_TOUCH) && charts[H.hoverChartIndex]) {\n func(e);\n p = charts[H.hoverChartIndex].pointer;\n p[method]({\n type: wktype,\n target: e.currentTarget,\n preventDefault: noop,\n touches: getWebkitTouches()\n });\n }\n };\n\n /**\n * Extend the Pointer prototype with methods for each event handler and more\n */\n extend(Pointer.prototype, /** @lends Pointer.prototype */ {\n onContainerPointerDown: function(e) {\n translateMSPointer(e, 'onContainerTouchStart', 'touchstart', function(e) {\n touches[e.pointerId] = {\n pageX: e.pageX,\n pageY: e.pageY,\n target: e.currentTarget\n };\n });\n },\n onContainerPointerMove: function(e) {\n translateMSPointer(e, 'onContainerTouchMove', 'touchmove', function(e) {\n touches[e.pointerId] = {\n pageX: e.pageX,\n pageY: e.pageY\n };\n if (!touches[e.pointerId].target) {\n touches[e.pointerId].target = e.currentTarget;\n }\n });\n },\n onDocumentPointerUp: function(e) {\n translateMSPointer(e, 'onDocumentTouchEnd', 'touchend', function(e) {\n delete touches[e.pointerId];\n });\n },\n\n /**\n * Add or remove the MS Pointer specific events\n */\n batchMSEvents: function(fn) {\n fn(this.chart.container, hasPointerEvent ? 'pointerdown' : 'MSPointerDown', this.onContainerPointerDown);\n fn(this.chart.container, hasPointerEvent ? 'pointermove' : 'MSPointerMove', this.onContainerPointerMove);\n fn(doc, hasPointerEvent ? 'pointerup' : 'MSPointerUp', this.onDocumentPointerUp);\n }\n });\n\n // Disable default IE actions for pinch and such on chart element\n wrap(Pointer.prototype, 'init', function(proceed, chart, options) {\n proceed.call(this, chart, options);\n if (this.hasZoom) { // #4014\n css(chart.container, {\n '-ms-touch-action': 'none',\n 'touch-action': 'none'\n });\n }\n });\n\n // Add IE specific touch events to chart\n wrap(Pointer.prototype, 'setDOMEvents', function(proceed) {\n proceed.apply(this);\n if (this.hasZoom || this.followTouchMove) {\n this.batchMSEvents(addEvent);\n }\n });\n // Destroy MS events also\n wrap(Pointer.prototype, 'destroy', function(proceed) {\n this.batchMSEvents(removeEvent);\n proceed.call(this);\n });\n }\n\n }(Highcharts));\n (function(Highcharts) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var H = Highcharts,\n\n addEvent = H.addEvent,\n css = H.css,\n discardElement = H.discardElement,\n defined = H.defined,\n each = H.each,\n isFirefox = H.isFirefox,\n marginNames = H.marginNames,\n merge = H.merge,\n pick = H.pick,\n setAnimation = H.setAnimation,\n stableSort = H.stableSort,\n win = H.win,\n wrap = H.wrap;\n\n /**\n * The overview of the chart's series. The legend object is instanciated\n * internally in the chart constructor, and available from `chart.legend`. Each\n * chart has only one legend.\n * \n * @class\n */\n Highcharts.Legend = function(chart, options) {\n this.init(chart, options);\n };\n\n Highcharts.Legend.prototype = {\n\n /**\n * Initialize the legend\n */\n init: function(chart, options) {\n\n this.chart = chart;\n\n this.setOptions(options);\n\n if (options.enabled) {\n\n // Render it\n this.render();\n\n // move checkboxes\n addEvent(this.chart, 'endResize', function() {\n this.legend.positionCheckboxes();\n });\n }\n },\n\n setOptions: function(options) {\n\n var padding = pick(options.padding, 8);\n\n this.options = options;\n\n\n this.itemStyle = options.itemStyle;\n this.itemHiddenStyle = merge(this.itemStyle, options.itemHiddenStyle);\n\n this.itemMarginTop = options.itemMarginTop || 0;\n this.padding = padding;\n this.initialItemY = padding - 5; // 5 is pixels above the text\n this.maxItemWidth = 0;\n this.itemHeight = 0;\n this.symbolWidth = pick(options.symbolWidth, 16);\n this.pages = [];\n\n },\n\n /**\n * Update the legend with new options. Equivalent to running `chart.update`\n * with a legend configuration option.\n * @param {LegendOptions} options\n * Legend options.\n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart.\n *\n * @sample highcharts/legend/legend-update/\n * Legend update\n */\n update: function(options, redraw) {\n var chart = this.chart;\n\n this.setOptions(merge(true, this.options, options));\n this.destroy();\n chart.isDirtyLegend = chart.isDirtyBox = true;\n if (pick(redraw, true)) {\n chart.redraw();\n }\n },\n\n /**\n * Set the colors for the legend item\n * @param {Object} item A Series or Point instance\n * @param {Object} visible Dimmed or colored\n */\n colorizeItem: function(item, visible) {\n item.legendGroup[visible ? 'removeClass' : 'addClass'](\n 'highcharts-legend-item-hidden'\n );\n\n\n var legend = this,\n options = legend.options,\n legendItem = item.legendItem,\n legendLine = item.legendLine,\n legendSymbol = item.legendSymbol,\n hiddenColor = legend.itemHiddenStyle.color,\n textColor = visible ? options.itemStyle.color : hiddenColor,\n symbolColor = visible ? (item.color || hiddenColor) : hiddenColor,\n markerOptions = item.options && item.options.marker,\n symbolAttr = {\n fill: symbolColor\n };\n\n if (legendItem) {\n legendItem.css({\n fill: textColor,\n color: textColor // #1553, oldIE\n });\n }\n if (legendLine) {\n legendLine.attr({\n stroke: symbolColor\n });\n }\n\n if (legendSymbol) {\n\n // Apply marker options\n if (markerOptions && legendSymbol.isMarker) { // #585\n //symbolAttr.stroke = symbolColor;\n symbolAttr = item.pointAttribs();\n if (!visible) {\n H.objectEach(symbolAttr, function(val, key) {\n symbolAttr[key] = hiddenColor;\n });\n }\n }\n\n legendSymbol.attr(symbolAttr);\n }\n\n },\n\n /**\n * Position the legend item\n * @param {Object} item A Series or Point instance\n */\n positionItem: function(item) {\n var legend = this,\n options = legend.options,\n symbolPadding = options.symbolPadding,\n ltr = !options.rtl,\n legendItemPos = item._legendItemPos,\n itemX = legendItemPos[0],\n itemY = legendItemPos[1],\n checkbox = item.checkbox,\n legendGroup = item.legendGroup;\n\n if (legendGroup && legendGroup.element) {\n legendGroup.translate(\n ltr ?\n itemX :\n legend.legendWidth - itemX - 2 * symbolPadding - 4,\n itemY\n );\n }\n\n if (checkbox) {\n checkbox.x = itemX;\n checkbox.y = itemY;\n }\n },\n\n /**\n * Destroy a single legend item\n * @param {Object} item The series or point\n */\n destroyItem: function(item) {\n var checkbox = item.checkbox;\n\n // destroy SVG elements\n each(\n ['legendItem', 'legendLine', 'legendSymbol', 'legendGroup'],\n function(key) {\n if (item[key]) {\n item[key] = item[key].destroy();\n }\n }\n );\n\n if (checkbox) {\n discardElement(item.checkbox);\n }\n },\n\n /**\n * Destroys the legend.\n */\n destroy: function() {\n function destroyItems(key) {\n if (this[key]) {\n this[key] = this[key].destroy();\n }\n }\n\n // Destroy items\n each(this.getAllItems(), function(item) {\n each(['legendItem', 'legendGroup'], destroyItems, item);\n });\n\n // Destroy legend elements\n each([\n 'clipRect',\n 'up',\n 'down',\n 'pager',\n 'nav',\n 'box',\n 'title',\n 'group'\n ], destroyItems, this);\n this.display = null; // Reset in .render on update.\n },\n\n /**\n * Position the checkboxes after the width is determined\n */\n positionCheckboxes: function(scrollOffset) {\n var alignAttr = this.group && this.group.alignAttr,\n translateY,\n clipHeight = this.clipHeight || this.legendHeight,\n titleHeight = this.titleHeight;\n\n if (alignAttr) {\n translateY = alignAttr.translateY;\n each(this.allItems, function(item) {\n var checkbox = item.checkbox,\n top;\n\n if (checkbox) {\n top = translateY + titleHeight + checkbox.y +\n (scrollOffset || 0) + 3;\n css(checkbox, {\n left: (alignAttr.translateX + item.checkboxOffset +\n checkbox.x - 20) + 'px',\n top: top + 'px',\n display: top > translateY - 6 && top < translateY +\n clipHeight - 6 ? '' : 'none'\n });\n }\n });\n }\n },\n\n /**\n * Render the legend title on top of the legend\n */\n renderTitle: function() {\n var options = this.options,\n padding = this.padding,\n titleOptions = options.title,\n titleHeight = 0,\n bBox;\n\n if (titleOptions.text) {\n if (!this.title) {\n this.title = this.chart.renderer.label(\n titleOptions.text,\n padding - 3,\n padding - 4,\n null,\n null,\n null,\n options.useHTML,\n null,\n 'legend-title'\n )\n .attr({\n zIndex: 1\n })\n\n .css(titleOptions.style)\n\n .add(this.group);\n }\n bBox = this.title.getBBox();\n titleHeight = bBox.height;\n this.offsetWidth = bBox.width; // #1717\n this.contentGroup.attr({\n translateY: titleHeight\n });\n }\n this.titleHeight = titleHeight;\n },\n\n /**\n * Set the legend item text\n */\n setText: function(item) {\n var options = this.options;\n item.legendItem.attr({\n text: options.labelFormat ?\n H.format(options.labelFormat, item) : options.labelFormatter.call(item)\n });\n },\n\n /**\n * Render a single specific legend item\n * @param {Object} item A series or point\n */\n renderItem: function(item) {\n var legend = this,\n chart = legend.chart,\n renderer = chart.renderer,\n options = legend.options,\n horizontal = options.layout === 'horizontal',\n symbolWidth = legend.symbolWidth,\n symbolPadding = options.symbolPadding,\n\n itemStyle = legend.itemStyle,\n itemHiddenStyle = legend.itemHiddenStyle,\n\n padding = legend.padding,\n itemDistance = horizontal ? pick(options.itemDistance, 20) : 0,\n ltr = !options.rtl,\n itemHeight,\n widthOption = options.width,\n itemMarginBottom = options.itemMarginBottom || 0,\n itemMarginTop = legend.itemMarginTop,\n bBox,\n itemWidth,\n li = item.legendItem,\n isSeries = !item.series,\n series = !isSeries && item.series.drawLegendSymbol ?\n item.series :\n item,\n seriesOptions = series.options,\n showCheckbox = legend.createCheckboxForItem &&\n seriesOptions &&\n seriesOptions.showCheckbox,\n // full width minus text width\n itemExtraWidth = symbolWidth + symbolPadding + itemDistance +\n (showCheckbox ? 20 : 0),\n useHTML = options.useHTML,\n fontSize = 12,\n itemClassName = item.options.className;\n\n if (!li) { // generate it once, later move it\n\n // Generate the group box, a group to hold the symbol and text. Text\n // is to be appended in Legend class.\n item.legendGroup = renderer.g('legend-item')\n .addClass(\n 'highcharts-' + series.type + '-series ' +\n 'highcharts-color-' + item.colorIndex +\n (itemClassName ? ' ' + itemClassName : '') +\n (isSeries ? ' highcharts-series-' + item.index : '')\n )\n .attr({\n zIndex: 1\n })\n .add(legend.scrollGroup);\n\n // Generate the list item text and add it to the group\n item.legendItem = li = renderer.text(\n '',\n ltr ? symbolWidth + symbolPadding : -symbolPadding,\n legend.baseline || 0,\n useHTML\n )\n\n // merge to prevent modifying original (#1021)\n .css(merge(item.visible ? itemStyle : itemHiddenStyle))\n\n .attr({\n align: ltr ? 'left' : 'right',\n zIndex: 2\n })\n .add(item.legendGroup);\n\n // Get the baseline for the first item - the font size is equal for\n // all\n if (!legend.baseline) {\n\n fontSize = itemStyle.fontSize;\n\n legend.fontMetrics = renderer.fontMetrics(\n fontSize,\n li\n );\n legend.baseline = legend.fontMetrics.f + 3 + itemMarginTop;\n li.attr('y', legend.baseline);\n }\n\n // Draw the legend symbol inside the group box\n legend.symbolHeight = options.symbolHeight || legend.fontMetrics.f;\n series.drawLegendSymbol(legend, item);\n\n if (legend.setItemEvents) {\n legend.setItemEvents(item, li, useHTML);\n }\n\n // add the HTML checkbox on top\n if (showCheckbox) {\n legend.createCheckboxForItem(item);\n }\n }\n\n // Colorize the items\n legend.colorizeItem(item, item.visible);\n\n // Take care of max width and text overflow (#6659)\n\n if (!itemStyle.width) {\n\n li.css({\n width: (options.itemWidth || chart.spacingBox.width) -\n itemExtraWidth\n });\n\n }\n\n\n // Always update the text\n legend.setText(item);\n\n // calculate the positions for the next line\n bBox = li.getBBox();\n\n itemWidth = item.checkboxOffset =\n options.itemWidth ||\n item.legendItemWidth ||\n bBox.width + itemExtraWidth;\n legend.itemHeight = itemHeight = Math.round(\n item.legendItemHeight || bBox.height || legend.symbolHeight\n );\n\n // If the item exceeds the width, start a new line\n if (\n horizontal &&\n legend.itemX - padding + itemWidth > (\n widthOption || (\n chart.spacingBox.width - 2 * padding - options.x\n )\n )\n ) {\n legend.itemX = padding;\n legend.itemY += itemMarginTop + legend.lastLineHeight +\n itemMarginBottom;\n legend.lastLineHeight = 0; // reset for next line (#915, #3976)\n }\n\n // If the item exceeds the height, start a new column\n /*if (!horizontal && legend.itemY + options.y +\n itemHeight > chart.chartHeight - spacingTop - spacingBottom) {\n legend.itemY = legend.initialItemY;\n legend.itemX += legend.maxItemWidth;\n legend.maxItemWidth = 0;\n }*/\n\n // Set the edge positions\n legend.maxItemWidth = Math.max(legend.maxItemWidth, itemWidth);\n legend.lastItemY = itemMarginTop + legend.itemY + itemMarginBottom;\n legend.lastLineHeight = Math.max( // #915\n itemHeight,\n legend.lastLineHeight\n );\n\n // cache the position of the newly generated or reordered items\n item._legendItemPos = [legend.itemX, legend.itemY];\n\n // advance\n if (horizontal) {\n legend.itemX += itemWidth;\n\n } else {\n legend.itemY += itemMarginTop + itemHeight + itemMarginBottom;\n legend.lastLineHeight = itemHeight;\n }\n\n // the width of the widest item\n legend.offsetWidth = widthOption || Math.max(\n (horizontal ? legend.itemX - padding - itemDistance : itemWidth) +\n padding,\n legend.offsetWidth\n );\n },\n\n /**\n * Get all items, which is one item per series for normal series and one\n * item per point for pie series.\n */\n getAllItems: function() {\n var allItems = [];\n each(this.chart.series, function(series) {\n var seriesOptions = series && series.options;\n\n // Handle showInLegend. If the series is linked to another series,\n // defaults to false.\n if (series && pick(\n seriesOptions.showInLegend, !defined(seriesOptions.linkedTo) ? undefined : false, true\n )) {\n\n // Use points or series for the legend item depending on\n // legendType\n allItems = allItems.concat(\n series.legendItems ||\n (\n seriesOptions.legendType === 'point' ?\n series.data :\n series\n )\n );\n }\n });\n return allItems;\n },\n\n /**\n * Adjust the chart margins by reserving space for the legend on only one\n * side of the chart. If the position is set to a corner, top or bottom is\n * reserved for horizontal legends and left or right for vertical ones.\n */\n adjustMargins: function(margin, spacing) {\n var chart = this.chart,\n options = this.options,\n // Use the first letter of each alignment option in order to detect\n // the side. (#4189 - use charAt(x) notation instead of [x] for IE7)\n alignment = options.align.charAt(0) +\n options.verticalAlign.charAt(0) +\n options.layout.charAt(0);\n\n if (!options.floating) {\n\n each([\n /(lth|ct|rth)/,\n /(rtv|rm|rbv)/,\n /(rbh|cb|lbh)/,\n /(lbv|lm|ltv)/\n ], function(alignments, side) {\n if (alignments.test(alignment) && !defined(margin[side])) {\n // Now we have detected on which side of the chart we should\n // reserve space for the legend\n chart[marginNames[side]] = Math.max(\n chart[marginNames[side]],\n (\n chart.legend[\n (side + 1) % 2 ? 'legendHeight' : 'legendWidth'\n ] + [1, -1, -1, 1][side] * options[\n (side % 2) ? 'x' : 'y'\n ] +\n pick(options.margin, 12) +\n spacing[side]\n )\n );\n }\n });\n }\n },\n\n /**\n * Render the legend. This method can be called both before and after\n * chart.render. If called after, it will only rearrange items instead\n * of creating new ones.\n */\n render: function() {\n var legend = this,\n chart = legend.chart,\n renderer = chart.renderer,\n legendGroup = legend.group,\n allItems,\n display,\n legendWidth,\n legendHeight,\n box = legend.box,\n options = legend.options,\n padding = legend.padding;\n\n legend.itemX = padding;\n legend.itemY = legend.initialItemY;\n legend.offsetWidth = 0;\n legend.lastItemY = 0;\n\n if (!legendGroup) {\n legend.group = legendGroup = renderer.g('legend')\n .attr({\n zIndex: 7\n })\n .add();\n legend.contentGroup = renderer.g()\n .attr({\n zIndex: 1\n }) // above background\n .add(legendGroup);\n legend.scrollGroup = renderer.g()\n .add(legend.contentGroup);\n }\n\n legend.renderTitle();\n\n // add each series or point\n allItems = legend.getAllItems();\n\n // sort by legendIndex\n stableSort(allItems, function(a, b) {\n return ((a.options && a.options.legendIndex) || 0) -\n ((b.options && b.options.legendIndex) || 0);\n });\n\n // reversed legend\n if (options.reversed) {\n allItems.reverse();\n }\n\n legend.allItems = allItems;\n legend.display = display = !!allItems.length;\n\n // render the items\n legend.lastLineHeight = 0;\n each(allItems, function(item) {\n legend.renderItem(item);\n });\n\n // Get the box\n legendWidth = (options.width || legend.offsetWidth) + padding;\n legendHeight = legend.lastItemY + legend.lastLineHeight +\n legend.titleHeight;\n legendHeight = legend.handleOverflow(legendHeight);\n legendHeight += padding;\n\n // Draw the border and/or background\n if (!box) {\n legend.box = box = renderer.rect()\n .addClass('highcharts-legend-box')\n .attr({\n r: options.borderRadius\n })\n .add(legendGroup);\n box.isNew = true;\n }\n\n\n // Presentational\n box\n .attr({\n stroke: options.borderColor,\n 'stroke-width': options.borderWidth || 0,\n fill: options.backgroundColor || 'none'\n })\n .shadow(options.shadow);\n\n\n if (legendWidth > 0 && legendHeight > 0) {\n box[box.isNew ? 'attr' : 'animate'](\n box.crisp({\n x: 0,\n y: 0,\n width: legendWidth,\n height: legendHeight\n }, box.strokeWidth())\n );\n box.isNew = false;\n }\n\n // hide the border if no items\n box[display ? 'show' : 'hide']();\n\n\n\n legend.legendWidth = legendWidth;\n legend.legendHeight = legendHeight;\n\n // Now that the legend width and height are established, put the items\n // in the final position\n each(allItems, function(item) {\n legend.positionItem(item);\n });\n\n // 1.x compatibility: positioning based on style\n /*var props = ['left', 'right', 'top', 'bottom'],\n prop,\n i = 4;\n while (i--) {\n prop = props[i];\n if (options.style[prop] && options.style[prop] !== 'auto') {\n options[i < 2 ? 'align' : 'verticalAlign'] = prop;\n options[i < 2 ? 'x' : 'y'] = \n pInt(options.style[prop]) * (i % 2 ? -1 : 1);\n }\n }*/\n\n if (display) {\n legendGroup.align(merge(options, {\n width: legendWidth,\n height: legendHeight\n }), true, 'spacingBox');\n }\n\n if (!chart.isResizing) {\n this.positionCheckboxes();\n }\n },\n\n /**\n * Set up the overflow handling by adding navigation with up and down arrows\n * below the legend.\n */\n handleOverflow: function(legendHeight) {\n var legend = this,\n chart = this.chart,\n renderer = chart.renderer,\n options = this.options,\n optionsY = options.y,\n alignTop = options.verticalAlign === 'top',\n padding = this.padding,\n spaceHeight = chart.spacingBox.height +\n (alignTop ? -optionsY : optionsY) - padding,\n maxHeight = options.maxHeight,\n clipHeight,\n clipRect = this.clipRect,\n navOptions = options.navigation,\n animation = pick(navOptions.animation, true),\n arrowSize = navOptions.arrowSize || 12,\n nav = this.nav,\n pages = this.pages,\n lastY,\n allItems = this.allItems,\n clipToHeight = function(height) {\n if (typeof height === 'number') {\n clipRect.attr({\n height: height\n });\n } else if (clipRect) { // Reset (#5912)\n legend.clipRect = clipRect.destroy();\n legend.contentGroup.clip();\n }\n\n // useHTML\n if (legend.contentGroup.div) {\n legend.contentGroup.div.style.clip = height ?\n 'rect(' + padding + 'px,9999px,' +\n (padding + height) + 'px,0)' :\n 'auto';\n }\n };\n\n\n // Adjust the height\n if (\n options.layout === 'horizontal' &&\n options.verticalAlign !== 'middle' &&\n !options.floating\n ) {\n spaceHeight /= 2;\n }\n if (maxHeight) {\n spaceHeight = Math.min(spaceHeight, maxHeight);\n }\n\n // Reset the legend height and adjust the clipping rectangle\n pages.length = 0;\n if (legendHeight > spaceHeight && navOptions.enabled !== false) {\n\n this.clipHeight = clipHeight =\n Math.max(spaceHeight - 20 - this.titleHeight - padding, 0);\n this.currentPage = pick(this.currentPage, 1);\n this.fullHeight = legendHeight;\n\n // Fill pages with Y positions so that the top of each a legend item\n // defines the scroll top for each page (#2098)\n each(allItems, function(item, i) {\n var y = item._legendItemPos[1],\n h = Math.round(item.legendItem.getBBox().height),\n len = pages.length;\n\n if (!len || (y - pages[len - 1] > clipHeight &&\n (lastY || y) !== pages[len - 1])) {\n pages.push(lastY || y);\n len++;\n }\n\n if (i === allItems.length - 1 &&\n y + h - pages[len - 1] > clipHeight) {\n pages.push(y);\n }\n if (y !== lastY) {\n lastY = y;\n }\n });\n\n // Only apply clipping if needed. Clipping causes blurred legend in\n // PDF export (#1787)\n if (!clipRect) {\n clipRect = legend.clipRect =\n renderer.clipRect(0, padding, 9999, 0);\n legend.contentGroup.clip(clipRect);\n }\n\n clipToHeight(clipHeight);\n\n // Add navigation elements\n if (!nav) {\n this.nav = nav = renderer.g()\n .attr({\n zIndex: 1\n })\n .add(this.group);\n\n this.up = renderer\n .symbol(\n 'triangle',\n 0,\n 0,\n arrowSize,\n arrowSize\n )\n .on('click', function() {\n legend.scroll(-1, animation);\n })\n .add(nav);\n\n this.pager = renderer.text('', 15, 10)\n .addClass('highcharts-legend-navigation')\n\n .css(navOptions.style)\n\n .add(nav);\n\n this.down = renderer\n .symbol(\n 'triangle-down',\n 0,\n 0,\n arrowSize,\n arrowSize\n )\n .on('click', function() {\n legend.scroll(1, animation);\n })\n .add(nav);\n }\n\n // Set initial position\n legend.scroll(0);\n\n legendHeight = spaceHeight;\n\n // Reset\n } else if (nav) {\n clipToHeight();\n this.nav = nav.destroy(); // #6322\n this.scrollGroup.attr({\n translateY: 1\n });\n this.clipHeight = 0; // #1379\n }\n\n return legendHeight;\n },\n\n /**\n * Scroll the legend by a number of pages\n * @param {Object} scrollBy\n * @param {Object} animation\n */\n scroll: function(scrollBy, animation) {\n var pages = this.pages,\n pageCount = pages.length,\n currentPage = this.currentPage + scrollBy,\n clipHeight = this.clipHeight,\n navOptions = this.options.navigation,\n pager = this.pager,\n padding = this.padding,\n scrollOffset;\n\n // When resizing while looking at the last page\n if (currentPage > pageCount) {\n currentPage = pageCount;\n }\n\n if (currentPage > 0) {\n\n if (animation !== undefined) {\n setAnimation(animation, this.chart);\n }\n\n this.nav.attr({\n translateX: padding,\n translateY: clipHeight + this.padding + 7 + this.titleHeight,\n visibility: 'visible'\n });\n this.up.attr({\n 'class': currentPage === 1 ?\n 'highcharts-legend-nav-inactive' : 'highcharts-legend-nav-active'\n });\n pager.attr({\n text: currentPage + '/' + pageCount\n });\n this.down.attr({\n 'x': 18 + this.pager.getBBox().width, // adjust to text width\n 'class': currentPage === pageCount ?\n 'highcharts-legend-nav-inactive' : 'highcharts-legend-nav-active'\n });\n\n\n this.up\n .attr({\n fill: currentPage === 1 ?\n navOptions.inactiveColor : navOptions.activeColor\n })\n .css({\n cursor: currentPage === 1 ? 'default' : 'pointer'\n });\n this.down\n .attr({\n fill: currentPage === pageCount ?\n navOptions.inactiveColor : navOptions.activeColor\n })\n .css({\n cursor: currentPage === pageCount ? 'default' : 'pointer'\n });\n\n\n scrollOffset = -pages[currentPage - 1] + this.initialItemY;\n\n this.scrollGroup.animate({\n translateY: scrollOffset\n });\n\n this.currentPage = currentPage;\n this.positionCheckboxes(scrollOffset);\n }\n\n }\n\n };\n\n /*\n * LegendSymbolMixin\n */\n\n H.LegendSymbolMixin = {\n\n /**\n * Get the series' symbol in the legend\n *\n * @param {Object} legend The legend object\n * @param {Object} item The series (this) or point\n */\n drawRectangle: function(legend, item) {\n var options = legend.options,\n symbolHeight = legend.symbolHeight,\n square = options.squareSymbol,\n symbolWidth = square ? symbolHeight : legend.symbolWidth;\n\n item.legendSymbol = this.chart.renderer.rect(\n square ? (legend.symbolWidth - symbolHeight) / 2 : 0,\n legend.baseline - symbolHeight + 1, // #3988\n symbolWidth,\n symbolHeight,\n pick(legend.options.symbolRadius, symbolHeight / 2)\n )\n .addClass('highcharts-point')\n .attr({\n zIndex: 3\n }).add(item.legendGroup);\n\n },\n\n /**\n * Get the series' symbol in the legend. This method should be overridable\n * to create custom symbols through\n * Highcharts.seriesTypes[type].prototype.drawLegendSymbols.\n *\n * @param {Object} legend The legend object\n */\n drawLineMarker: function(legend) {\n\n var options = this.options,\n markerOptions = options.marker,\n radius,\n legendSymbol,\n symbolWidth = legend.symbolWidth,\n symbolHeight = legend.symbolHeight,\n generalRadius = symbolHeight / 2,\n renderer = this.chart.renderer,\n legendItemGroup = this.legendGroup,\n verticalCenter = legend.baseline -\n Math.round(legend.fontMetrics.b * 0.3),\n attr = {};\n\n // Draw the line\n\n attr = {\n 'stroke-width': options.lineWidth || 0\n };\n if (options.dashStyle) {\n attr.dashstyle = options.dashStyle;\n }\n\n\n this.legendLine = renderer.path([\n 'M',\n 0,\n verticalCenter,\n 'L',\n symbolWidth,\n verticalCenter\n ])\n .addClass('highcharts-graph')\n .attr(attr)\n .add(legendItemGroup);\n\n // Draw the marker\n if (markerOptions && markerOptions.enabled !== false) {\n\n // Do not allow the marker to be larger than the symbolHeight\n radius = Math.min(\n pick(markerOptions.radius, generalRadius),\n generalRadius\n );\n\n // Restrict symbol markers size\n if (this.symbol.indexOf('url') === 0) {\n markerOptions = merge(markerOptions, {\n width: symbolHeight,\n height: symbolHeight\n });\n radius = 0;\n }\n\n this.legendSymbol = legendSymbol = renderer.symbol(\n this.symbol,\n (symbolWidth / 2) - radius,\n verticalCenter - radius,\n 2 * radius,\n 2 * radius,\n markerOptions\n )\n .addClass('highcharts-point')\n .add(legendItemGroup);\n legendSymbol.isMarker = true;\n }\n }\n };\n\n // Workaround for #2030, horizontal legend items not displaying in IE11 Preview,\n // and for #2580, a similar drawing flaw in Firefox 26.\n // Explore if there's a general cause for this. The problem may be related\n // to nested group elements, as the legend item texts are within 4 group\n // elements.\n if (/Trident\\/7\\.0/.test(win.navigator.userAgent) || isFirefox) {\n wrap(Highcharts.Legend.prototype, 'positionItem', function(proceed, item) {\n var legend = this,\n // If chart destroyed in sync, this is undefined (#2030)\n runPositionItem = function() {\n if (item._legendItemPos) {\n proceed.call(legend, item);\n }\n };\n\n // Do it now, for export and to get checkbox placement\n runPositionItem();\n\n // Do it after to work around the core issue\n setTimeout(runPositionItem);\n });\n }\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var addEvent = H.addEvent,\n animate = H.animate,\n animObject = H.animObject,\n attr = H.attr,\n doc = H.doc,\n Axis = H.Axis, // @todo add as requirement\n createElement = H.createElement,\n defaultOptions = H.defaultOptions,\n discardElement = H.discardElement,\n charts = H.charts,\n css = H.css,\n defined = H.defined,\n each = H.each,\n extend = H.extend,\n find = H.find,\n fireEvent = H.fireEvent,\n getStyle = H.getStyle,\n grep = H.grep,\n isNumber = H.isNumber,\n isObject = H.isObject,\n isString = H.isString,\n Legend = H.Legend, // @todo add as requirement\n marginNames = H.marginNames,\n merge = H.merge,\n objectEach = H.objectEach,\n Pointer = H.Pointer, // @todo add as requirement\n pick = H.pick,\n pInt = H.pInt,\n removeEvent = H.removeEvent,\n seriesTypes = H.seriesTypes,\n splat = H.splat,\n svg = H.svg,\n syncTimeout = H.syncTimeout,\n win = H.win,\n Renderer = H.Renderer;\n /**\n * The Chart class. The recommended constructor is {@link Highcharts#chart}.\n * @class Highcharts.Chart\n * @param {String|HTMLDOMElement} renderTo\n * The DOM element to render to, or its id.\n * @param {Options} options\n * The chart options structure.\n * @param {Function} [callback]\n * Function to run when the chart has loaded and and all external images\n * are loaded. Defining a {@link\n * https://api.highcharts.com/highcharts/chart.events.load|chart.event.load}\n * handler is equivalent.\n *\n * @example\n * var chart = new Highcharts.Chart('container', {\n * title: {\n * text: 'My chart'\n * },\n * series: [{\n * data: [1, 3, 2, 4]\n * }]\n * })\n */\n var Chart = H.Chart = function() {\n this.getArgs.apply(this, arguments);\n };\n\n /**\n * Factory function for basic charts. \n *\n * @function #chart\n * @memberOf Highcharts\n * @param {String|HTMLDOMElement} renderTo - The DOM element to render to, or\n * its id.\n * @param {Options} options - The chart options structure.\n * @param {Function} [callback] - Function to run when the chart has loaded and\n * and all external images are loaded. Defining a {@link\n * https://api.highcharts.com/highcharts/chart.events.load|chart.event.load}\n * handler is equivalent.\n * @return {Highcharts.Chart} - Returns the Chart object.\n *\n * @example\n * // Render a chart in to div#container\n * var chart = Highcharts.chart('container', {\n * title: {\n * text: 'My chart'\n * },\n * series: [{\n * data: [1, 3, 2, 4]\n * }]\n * });\n */\n H.chart = function(a, b, c) {\n return new Chart(a, b, c);\n };\n\n extend(Chart.prototype, /** @lends Highcharts.Chart.prototype */ {\n\n /**\n * Hook for modules\n */\n callbacks: [],\n\n /**\n * Handle the arguments passed to the constructor\n * @returns {Array} Arguments without renderTo\n */\n getArgs: function() {\n var args = [].slice.call(arguments);\n\n // Remove the optional first argument, renderTo, and\n // set it on this.\n if (isString(args[0]) || args[0].nodeName) {\n this.renderTo = args.shift();\n }\n this.init(args[0], args[1]);\n },\n\n /**\n * Initialize the chart\n */\n init: function(userOptions, callback) {\n\n // Handle regular options\n var options,\n type,\n seriesOptions = userOptions.series, // skip merging data points to increase performance\n userPlotOptions = userOptions.plotOptions || {};\n\n userOptions.series = null;\n options = merge(defaultOptions, userOptions); // do the merge\n\n // Override (by copy of user options) or clear tooltip options\n // in chart.options.plotOptions (#6218)\n for (type in options.plotOptions) {\n options.plotOptions[type].tooltip = (\n userPlotOptions[type] &&\n merge(userPlotOptions[type].tooltip) // override by copy\n ) || undefined; // or clear\n }\n // User options have higher priority than default options (#6218).\n // In case of exporting: path is changed\n options.tooltip.userOptions = (userOptions.chart &&\n userOptions.chart.forExport && userOptions.tooltip.userOptions) ||\n userOptions.tooltip;\n\n options.series = userOptions.series = seriesOptions; // set back the series data\n this.userOptions = userOptions;\n\n var optionsChart = options.chart;\n\n var chartEvents = optionsChart.events;\n\n this.margin = [];\n this.spacing = [];\n\n //this.runChartClick = chartEvents && !!chartEvents.click;\n this.bounds = {\n h: {},\n v: {}\n }; // Pixel data bounds for touch zoom\n\n this.callback = callback;\n this.isResizing = 0;\n\n /**\n * The options structure for the chart. It contains members for the sub\n * elements like series, legend, tooltip etc.\n *\n * @memberof Highcharts.Chart\n * @name options\n * @type {Options}\n */\n this.options = options;\n /**\n * All the axes in the chart.\n *\n * @memberof Highcharts.Chart\n * @name axes\n * @see Highcharts.Chart.xAxis\n * @see Highcharts.Chart.yAxis\n * @type {Array.}\n */\n this.axes = [];\n\n /**\n * All the current series in the chart.\n *\n * @memberof Highcharts.Chart\n * @name series\n * @type {Array.}\n */\n this.series = [];\n\n /**\n * The chart title. The title has an `update` method that allows\n * modifying the options directly or indirectly via `chart.update`.\n *\n * @memberof Highcharts.Chart\n * @name title\n * @type Object\n *\n * @sample highcharts/members/title-update/\n * Updating titles\n */\n\n /**\n * The chart subtitle. The subtitle has an `update` method that allows\n * modifying the options directly or indirectly via `chart.update`.\n *\n * @memberof Highcharts.Chart\n * @name subtitle\n * @type Object\n */\n\n\n\n this.hasCartesianSeries = optionsChart.showAxes;\n //this.axisOffset = undefined;\n //this.inverted = undefined;\n //this.loadingShown = undefined;\n //this.container = undefined;\n //this.chartWidth = undefined;\n //this.chartHeight = undefined;\n //this.marginRight = undefined;\n //this.marginBottom = undefined;\n //this.containerWidth = undefined;\n //this.containerHeight = undefined;\n //this.oldChartWidth = undefined;\n //this.oldChartHeight = undefined;\n\n //this.renderTo = undefined;\n\n //this.spacingBox = undefined\n\n //this.legend = undefined;\n\n // Elements\n //this.chartBackground = undefined;\n //this.plotBackground = undefined;\n //this.plotBGImage = undefined;\n //this.plotBorder = undefined;\n //this.loadingDiv = undefined;\n //this.loadingSpan = undefined;\n\n var chart = this;\n\n // Add the chart to the global lookup\n chart.index = charts.length;\n\n charts.push(chart);\n H.chartCount++;\n\n // Chart event handlers\n if (chartEvents) {\n objectEach(chartEvents, function(event, eventType) {\n addEvent(chart, eventType, event);\n });\n }\n\n /**\n * A collection of the X axes in the chart.\n * @type {Array.}\n * @name xAxis\n * @memberOf Highcharts.Chart\n */\n chart.xAxis = [];\n /**\n * A collection of the Y axes in the chart.\n * @type {Array.}\n * @name yAxis\n * @memberOf Highcharts.Chart\n */\n chart.yAxis = [];\n\n chart.pointCount = chart.colorCounter = chart.symbolCounter = 0;\n\n chart.firstRender();\n },\n\n /**\n * Initialize an individual series, called internally before render time\n */\n initSeries: function(options) {\n var chart = this,\n optionsChart = chart.options.chart,\n type = options.type || optionsChart.type || optionsChart.defaultSeriesType,\n series,\n Constr = seriesTypes[type];\n\n // No such series type\n if (!Constr) {\n H.error(17, true);\n }\n\n series = new Constr();\n series.init(this, options);\n return series;\n },\n\n /**\n * Order all series above a given index. When series are added and ordered\n * by configuration, only the last series is handled (#248, #1123, #2456,\n * #6112). This function is called on series initialization and destroy.\n *\n * @param {number} fromIndex - If this is given, only the series above this\n * index are handled.\n */\n orderSeries: function(fromIndex) {\n var series = this.series,\n i = fromIndex || 0;\n for (; i < series.length; i++) {\n if (series[i]) {\n series[i].index = i;\n series[i].name = series[i].name ||\n 'Series ' + (series[i].index + 1);\n }\n }\n },\n\n /**\n * Check whether a given point is within the plot area\n *\n * @param {Number} plotX Pixel x relative to the plot area\n * @param {Number} plotY Pixel y relative to the plot area\n * @param {Boolean} inverted Whether the chart is inverted\n */\n isInsidePlot: function(plotX, plotY, inverted) {\n var x = inverted ? plotY : plotX,\n y = inverted ? plotX : plotY;\n\n return x >= 0 &&\n x <= this.plotWidth &&\n y >= 0 &&\n y <= this.plotHeight;\n },\n\n /**\n * Redraw the chart after changes have been done to the data, axis extremes\n * chart size or chart elements. All methods for updating axes, series or\n * points have a parameter for redrawing the chart. This is `true` by\n * default. But in many cases you want to do more than one operation on the\n * chart before redrawing, for example add a number of points. In those\n * cases it is a waste of resources to redraw the chart for each new point\n * added. So you add the points and call `chart.redraw()` after.\n *\n * @param {AnimationOptions} animation\n * If or how to apply animation to the redraw.\n */\n redraw: function(animation) {\n var chart = this,\n axes = chart.axes,\n series = chart.series,\n pointer = chart.pointer,\n legend = chart.legend,\n redrawLegend = chart.isDirtyLegend,\n hasStackedSeries,\n hasDirtyStacks,\n hasCartesianSeries = chart.hasCartesianSeries,\n isDirtyBox = chart.isDirtyBox,\n i,\n serie,\n renderer = chart.renderer,\n isHiddenChart = renderer.isHidden(),\n afterRedraw = [];\n\n // Handle responsive rules, not only on resize (#6130)\n if (chart.setResponsive) {\n chart.setResponsive(false);\n }\n\n H.setAnimation(animation, chart);\n\n if (isHiddenChart) {\n chart.temporaryDisplay();\n }\n\n // Adjust title layout (reflow multiline text)\n chart.layOutTitles();\n\n // link stacked series\n i = series.length;\n while (i--) {\n serie = series[i];\n\n if (serie.options.stacking) {\n hasStackedSeries = true;\n\n if (serie.isDirty) {\n hasDirtyStacks = true;\n break;\n }\n }\n }\n if (hasDirtyStacks) { // mark others as dirty\n i = series.length;\n while (i--) {\n serie = series[i];\n if (serie.options.stacking) {\n serie.isDirty = true;\n }\n }\n }\n\n // Handle updated data in the series\n each(series, function(serie) {\n if (serie.isDirty) {\n if (serie.options.legendType === 'point') {\n if (serie.updateTotals) {\n serie.updateTotals();\n }\n redrawLegend = true;\n }\n }\n if (serie.isDirtyData) {\n fireEvent(serie, 'updatedData');\n }\n });\n\n // handle added or removed series\n if (redrawLegend && legend.options.enabled) { // series or pie points are added or removed\n // draw legend graphics\n legend.render();\n\n chart.isDirtyLegend = false;\n }\n\n // reset stacks\n if (hasStackedSeries) {\n chart.getStacks();\n }\n\n\n if (hasCartesianSeries) {\n // set axes scales\n each(axes, function(axis) {\n axis.updateNames();\n axis.setScale();\n });\n }\n\n chart.getMargins(); // #3098\n\n if (hasCartesianSeries) {\n // If one axis is dirty, all axes must be redrawn (#792, #2169)\n each(axes, function(axis) {\n if (axis.isDirty) {\n isDirtyBox = true;\n }\n });\n\n // redraw axes\n each(axes, function(axis) {\n\n // Fire 'afterSetExtremes' only if extremes are set\n var key = axis.min + ',' + axis.max;\n if (axis.extKey !== key) { // #821, #4452\n axis.extKey = key;\n afterRedraw.push(function() { // prevent a recursive call to chart.redraw() (#1119)\n fireEvent(axis, 'afterSetExtremes', extend(axis.eventArgs, axis.getExtremes())); // #747, #751\n delete axis.eventArgs;\n });\n }\n if (isDirtyBox || hasStackedSeries) {\n axis.redraw();\n }\n });\n }\n\n // the plot areas size has changed\n if (isDirtyBox) {\n chart.drawChartBox();\n }\n\n // Fire an event before redrawing series, used by the boost module to\n // clear previous series renderings.\n fireEvent(chart, 'predraw');\n\n // redraw affected series\n each(series, function(serie) {\n if ((isDirtyBox || serie.isDirty) && serie.visible) {\n serie.redraw();\n }\n // Set it here, otherwise we will have unlimited 'updatedData' calls\n // for a hidden series after setData(). Fixes #6012\n serie.isDirtyData = false;\n });\n\n // move tooltip or reset\n if (pointer) {\n pointer.reset(true);\n }\n\n // redraw if canvas\n renderer.draw();\n\n // Fire the events\n fireEvent(chart, 'redraw');\n fireEvent(chart, 'render');\n\n if (isHiddenChart) {\n chart.temporaryDisplay(true);\n }\n\n // Fire callbacks that are put on hold until after the redraw\n each(afterRedraw, function(callback) {\n callback.call();\n });\n },\n\n /**\n * Get an axis, series or point object by `id` as given in the configuration\n * options. Returns `undefined` if no item is found.\n * @param id {String} The id as given in the configuration options.\n * @return {Highcharts.Axis|Highcharts.Series|Highcharts.Point|undefined}\n * The retrieved item.\n * @sample highcharts/plotoptions/series-id/\n * Get series by id\n */\n get: function(id) {\n\n var ret,\n series = this.series,\n i;\n\n function itemById(item) {\n return item.id === id || (item.options && item.options.id === id);\n }\n\n ret =\n // Search axes\n find(this.axes, itemById) ||\n\n // Search series\n find(this.series, itemById);\n\n // Search points\n for (i = 0; !ret && i < series.length; i++) {\n ret = find(series[i].points || [], itemById);\n }\n\n return ret;\n },\n\n /**\n * Create the Axis instances based on the config options\n */\n getAxes: function() {\n var chart = this,\n options = this.options,\n xAxisOptions = options.xAxis = splat(options.xAxis || {}),\n yAxisOptions = options.yAxis = splat(options.yAxis || {}),\n optionsArray;\n\n // make sure the options are arrays and add some members\n each(xAxisOptions, function(axis, i) {\n axis.index = i;\n axis.isX = true;\n });\n\n each(yAxisOptions, function(axis, i) {\n axis.index = i;\n });\n\n // concatenate all axis options into one array\n optionsArray = xAxisOptions.concat(yAxisOptions);\n\n each(optionsArray, function(axisOptions) {\n new Axis(chart, axisOptions); // eslint-disable-line no-new\n });\n },\n\n\n /**\n * Returns an array of all currently selected points in the chart. Points\n * can be selected by clicking or programmatically by the {@link\n * Highcharts.Point#select} function.\n *\n * @return {Array.}\n * The currently selected points.\n *\n * @sample highcharts/plotoptions/series-allowpointselect-line/\n * Get selected points\n */\n getSelectedPoints: function() {\n var points = [];\n each(this.series, function(serie) {\n // series.data - for points outside of viewed range (#6445)\n points = points.concat(grep(serie.data || [], function(point) {\n return point.selected;\n }));\n });\n return points;\n },\n\n /**\n * Returns an array of all currently selected series in the chart. Series\n * can be selected either programmatically by the {@link\n * Highcharts.Series#select} function or by checking the checkbox next to\n * the legend item if {@link\n * https://api.highcharts.com/highcharts/plotOptions.series.showCheckbox|\n * series.showCheckBox} is true.\n * \n * @return {Array.}\n * The currently selected series.\n *\n * @sample highcharts/members/chart-getselectedseries/\n * Get selected series\n */\n getSelectedSeries: function() {\n return grep(this.series, function(serie) {\n return serie.selected;\n });\n },\n\n /**\n * Set a new title or subtitle for the chart.\n *\n * @param titleOptions {TitleOptions}\n * New title options.\n * @param subtitleOptions {SubtitleOptions}\n * New subtitle options.\n * @param redraw {Boolean}\n * Whether to redraw the chart or wait for a later call to \n * `chart.redraw()`.\n *\n * @sample highcharts/members/chart-settitle/ Set title text and styles\n *\n */\n setTitle: function(titleOptions, subtitleOptions, redraw) {\n var chart = this,\n options = chart.options,\n chartTitleOptions,\n chartSubtitleOptions;\n\n chartTitleOptions = options.title = merge(\n\n // Default styles\n {\n style: {\n color: '#333333',\n fontSize: options.isStock ? '16px' : '18px' // #2944\n }\n },\n\n options.title,\n titleOptions\n );\n chartSubtitleOptions = options.subtitle = merge(\n\n // Default styles\n {\n style: {\n color: '#666666'\n }\n },\n\n options.subtitle,\n subtitleOptions\n );\n\n // add title and subtitle\n each([\n ['title', titleOptions, chartTitleOptions],\n ['subtitle', subtitleOptions, chartSubtitleOptions]\n ], function(arr, i) {\n var name = arr[0],\n title = chart[name],\n titleOptions = arr[1],\n chartTitleOptions = arr[2];\n\n if (title && titleOptions) {\n chart[name] = title = title.destroy(); // remove old\n }\n\n if (chartTitleOptions && chartTitleOptions.text && !title) {\n chart[name] = chart.renderer.text(\n chartTitleOptions.text,\n 0,\n 0,\n chartTitleOptions.useHTML\n )\n .attr({\n align: chartTitleOptions.align,\n 'class': 'highcharts-' + name,\n zIndex: chartTitleOptions.zIndex || 4\n })\n .add();\n\n // Update methods, shortcut to Chart.setTitle\n chart[name].update = function(o) {\n chart.setTitle(!i && o, i && o);\n };\n\n\n // Presentational\n chart[name].css(chartTitleOptions.style);\n\n\n }\n });\n chart.layOutTitles(redraw);\n },\n\n /**\n * Lay out the chart titles and cache the full offset height for use\n * in getMargins\n */\n layOutTitles: function(redraw) {\n var titleOffset = 0,\n requiresDirtyBox,\n renderer = this.renderer,\n spacingBox = this.spacingBox;\n\n // Lay out the title and the subtitle respectively\n each(['title', 'subtitle'], function(key) {\n var title = this[key],\n titleOptions = this.options[key],\n offset = key === 'title' ? -3 :\n // Floating subtitle (#6574)\n titleOptions.verticalAlign ? 0 : titleOffset + 2,\n titleSize;\n\n if (title) {\n\n titleSize = titleOptions.style.fontSize;\n\n titleSize = renderer.fontMetrics(titleSize, title).b;\n\n title\n .css({\n width: (titleOptions.width ||\n spacingBox.width + titleOptions.widthAdjust) + 'px'\n })\n .align(extend({\n y: offset + titleSize\n }, titleOptions), false, 'spacingBox');\n\n if (!titleOptions.floating && !titleOptions.verticalAlign) {\n titleOffset = Math.ceil(\n titleOffset +\n // Skip the cache for HTML (#3481)\n title.getBBox(titleOptions.useHTML).height\n );\n }\n }\n }, this);\n\n requiresDirtyBox = this.titleOffset !== titleOffset;\n this.titleOffset = titleOffset; // used in getMargins\n\n if (!this.isDirtyBox && requiresDirtyBox) {\n this.isDirtyBox = requiresDirtyBox;\n // Redraw if necessary (#2719, #2744)\n if (this.hasRendered && pick(redraw, true) && this.isDirtyBox) {\n this.redraw();\n }\n }\n },\n\n /**\n * Get chart width and height according to options and container size\n */\n getChartSize: function() {\n var chart = this,\n optionsChart = chart.options.chart,\n widthOption = optionsChart.width,\n heightOption = optionsChart.height,\n renderTo = chart.renderTo;\n\n // Get inner width and height\n if (!defined(widthOption)) {\n chart.containerWidth = getStyle(renderTo, 'width');\n }\n if (!defined(heightOption)) {\n chart.containerHeight = getStyle(renderTo, 'height');\n }\n\n chart.chartWidth = Math.max( // #1393\n 0,\n widthOption || chart.containerWidth || 600 // #1460\n );\n chart.chartHeight = Math.max(\n 0,\n H.relativeLength(\n heightOption,\n chart.chartWidth\n ) || chart.containerHeight || 400\n );\n },\n\n /**\n * If the renderTo element has no offsetWidth, most likely one or more of\n * its parents are hidden. Loop up the DOM tree to temporarily display the\n * parents, then save the original display properties, and when the true\n * size is retrieved, reset them. Used on first render and on redraws.\n *\n * @param {Boolean} revert - Revert to the saved original styles.\n */\n temporaryDisplay: function(revert) {\n var node = this.renderTo,\n tempStyle;\n if (!revert) {\n while (node && node.style) {\n if (getStyle(node, 'display', false) === 'none') {\n node.hcOrigStyle = {\n display: node.style.display,\n height: node.style.height,\n overflow: node.style.overflow\n };\n tempStyle = {\n display: 'block',\n overflow: 'hidden'\n };\n if (node !== this.renderTo) {\n tempStyle.height = 0;\n }\n\n H.css(node, tempStyle);\n if (node.style.setProperty) { // #2631\n node.style.setProperty('display', 'block', 'important');\n }\n }\n node = node.parentNode;\n }\n } else {\n while (node && node.style) {\n if (node.hcOrigStyle) {\n H.css(node, node.hcOrigStyle);\n delete node.hcOrigStyle;\n }\n node = node.parentNode;\n }\n }\n },\n\n /**\n * Setter for the chart class name\n */\n setClassName: function(className) {\n this.container.className = 'highcharts-container ' + (className || '');\n },\n\n /**\n * Get the containing element, determine the size and create the inner\n * container div to hold the chart\n */\n getContainer: function() {\n var chart = this,\n container,\n options = chart.options,\n optionsChart = options.chart,\n chartWidth,\n chartHeight,\n renderTo = chart.renderTo,\n indexAttrName = 'data-highcharts-chart',\n oldChartIndex,\n Ren,\n containerId = H.uniqueKey(),\n containerStyle,\n key;\n\n if (!renderTo) {\n chart.renderTo = renderTo = optionsChart.renderTo;\n }\n\n if (isString(renderTo)) {\n chart.renderTo = renderTo = doc.getElementById(renderTo);\n }\n\n // Display an error if the renderTo is wrong\n if (!renderTo) {\n H.error(13, true);\n }\n\n // If the container already holds a chart, destroy it. The check for\n // hasRendered is there because web pages that are saved to disk from\n // the browser, will preserve the data-highcharts-chart attribute and\n // the SVG contents, but not an interactive chart. So in this case,\n // charts[oldChartIndex] will point to the wrong chart if any (#2609).\n oldChartIndex = pInt(attr(renderTo, indexAttrName));\n if (\n isNumber(oldChartIndex) &&\n charts[oldChartIndex] &&\n charts[oldChartIndex].hasRendered\n ) {\n charts[oldChartIndex].destroy();\n }\n\n // Make a reference to the chart from the div\n attr(renderTo, indexAttrName, chart.index);\n\n // remove previous chart\n renderTo.innerHTML = '';\n\n // If the container doesn't have an offsetWidth, it has or is a child of\n // a node that has display:none. We need to temporarily move it out to a\n // visible state to determine the size, else the legend and tooltips\n // won't render properly. The skipClone option is used in sparklines as\n // a micro optimization, saving about 1-2 ms each chart.\n if (!optionsChart.skipClone && !renderTo.offsetWidth) {\n chart.temporaryDisplay();\n }\n\n // get the width and height\n chart.getChartSize();\n chartWidth = chart.chartWidth;\n chartHeight = chart.chartHeight;\n\n // Create the inner container\n\n containerStyle = extend({\n position: 'relative',\n overflow: 'hidden', // needed for context menu (avoid scrollbars)\n // and content overflow in IE\n width: chartWidth + 'px',\n height: chartHeight + 'px',\n textAlign: 'left',\n lineHeight: 'normal', // #427\n zIndex: 0, // #1072\n '-webkit-tap-highlight-color': 'rgba(0,0,0,0)'\n }, optionsChart.style);\n\n\n /**\n * The containing HTML element of the chart. The container is\n * dynamically inserted into the element given as the `renderTo`\n * parameterin the {@link Highcharts#chart} constructor.\n *\n * @memberOf Highcharts.Chart\n * @type {HTMLDOMElement}\n */\n container = createElement(\n 'div', {\n id: containerId\n },\n containerStyle,\n renderTo\n );\n chart.container = container;\n\n // cache the cursor (#1650)\n chart._cursor = container.style.cursor;\n\n // Initialize the renderer\n Ren = H[optionsChart.renderer] || Renderer;\n chart.renderer = new Ren(\n container,\n chartWidth,\n chartHeight,\n null,\n optionsChart.forExport,\n options.exporting && options.exporting.allowHTML\n );\n\n\n chart.setClassName(optionsChart.className);\n\n chart.renderer.setStyle(optionsChart.style);\n\n\n // Add a reference to the charts index\n chart.renderer.chartIndex = chart.index;\n },\n\n /**\n * Calculate margins by rendering axis labels in a preliminary position.\n * Title, subtitle and legend have already been rendered at this stage, but\n * will be moved into their final positions\n */\n getMargins: function(skipAxes) {\n var chart = this,\n spacing = chart.spacing,\n margin = chart.margin,\n titleOffset = chart.titleOffset;\n\n chart.resetMargins();\n\n // Adjust for title and subtitle\n if (titleOffset && !defined(margin[0])) {\n chart.plotTop = Math.max(\n chart.plotTop,\n titleOffset + chart.options.title.margin + spacing[0]\n );\n }\n\n // Adjust for legend\n if (chart.legend.display) {\n chart.legend.adjustMargins(margin, spacing);\n }\n\n // adjust for scroller\n if (chart.extraMargin) {\n chart[chart.extraMargin.type] =\n (chart[chart.extraMargin.type] || 0) + chart.extraMargin.value;\n }\n if (chart.extraTopMargin) {\n chart.plotTop += chart.extraTopMargin;\n }\n if (!skipAxes) {\n this.getAxisMargins();\n }\n },\n\n getAxisMargins: function() {\n\n var chart = this,\n // [top, right, bottom, left]\n axisOffset = chart.axisOffset = [0, 0, 0, 0],\n margin = chart.margin;\n\n // pre-render axes to get labels offset width\n if (chart.hasCartesianSeries) {\n each(chart.axes, function(axis) {\n if (axis.visible) {\n axis.getOffset();\n }\n });\n }\n\n // Add the axis offsets\n each(marginNames, function(m, side) {\n if (!defined(margin[side])) {\n chart[m] += axisOffset[side];\n }\n });\n\n chart.setChartSize();\n\n },\n\n /**\n * Reflows the chart to its container. By default, the chart reflows\n * automatically to its container following a `window.resize` event, as per\n * the {@link https://api.highcharts/highcharts/chart.reflow|chart.reflow}\n * option. However, there are no reliable events for div resize, so if the\n * container is resized without a window resize event, this must be called\n * explicitly.\n *\n * @param {Object} e\n * Event arguments. Used primarily when the function is called\n * internally as a response to window resize.\n *\n * @sample highcharts/members/chart-reflow/\n * Resize div and reflow\n * @sample highcharts/chart/events-container/\n * Pop up and reflow\n */\n reflow: function(e) {\n var chart = this,\n optionsChart = chart.options.chart,\n renderTo = chart.renderTo,\n hasUserWidth = defined(optionsChart.width),\n width = optionsChart.width || getStyle(renderTo, 'width'),\n height = optionsChart.height || getStyle(renderTo, 'height'),\n target = e ? e.target : win;\n\n // Width and height checks for display:none. Target is doc in IE8 and\n // Opera, win in Firefox, Chrome and IE9.\n if (!hasUserWidth &&\n !chart.isPrinting &&\n width &&\n height &&\n (target === win || target === doc)\n ) {\n if (\n width !== chart.containerWidth ||\n height !== chart.containerHeight\n ) {\n clearTimeout(chart.reflowTimeout);\n // When called from window.resize, e is set, else it's called\n // directly (#2224)\n chart.reflowTimeout = syncTimeout(function() {\n // Set size, it may have been destroyed in the meantime\n // (#1257)\n if (chart.container) {\n chart.setSize(undefined, undefined, false);\n }\n }, e ? 100 : 0);\n }\n chart.containerWidth = width;\n chart.containerHeight = height;\n }\n },\n\n /**\n * Add the event handlers necessary for auto resizing\n */\n initReflow: function() {\n var chart = this,\n unbind;\n\n unbind = addEvent(win, 'resize', function(e) {\n chart.reflow(e);\n });\n addEvent(chart, 'destroy', unbind);\n\n // The following will add listeners to re-fit the chart before and after\n // printing (#2284). However it only works in WebKit. Should have worked\n // in Firefox, but not supported in IE.\n /*\n if (win.matchMedia) {\n win.matchMedia('print').addListener(function reflow() {\n chart.reflow();\n });\n }\n */\n },\n\n /**\n * Resize the chart to a given width and height. In order to set the width\n * only, the height argument may be skipped. To set the height only, pass\n * `undefined for the width.\n * @param {Number|undefined|null} [width]\n * The new pixel width of the chart. Since v4.2.6, the argument can\n * be `undefined` in order to preserve the current value (when\n * setting height only), or `null` to adapt to the width of the\n * containing element.\n * @param {Number|undefined|null} [height]\n * The new pixel height of the chart. Since v4.2.6, the argument can\n * be `undefined` in order to preserve the current value, or `null`\n * in order to adapt to the height of the containing element.\n * @param {AnimationOptions} [animation=true]\n * Whether and how to apply animation.\n *\n * @sample highcharts/members/chart-setsize-button/\n * Test resizing from buttons\n * @sample highcharts/members/chart-setsize-jquery-resizable/\n * Add a jQuery UI resizable\n * @sample stock/members/chart-setsize/\n * Highstock with UI resizable\n */\n setSize: function(width, height, animation) {\n var chart = this,\n renderer = chart.renderer,\n globalAnimation;\n\n // Handle the isResizing counter\n chart.isResizing += 1;\n\n // set the animation for the current process\n H.setAnimation(animation, chart);\n\n chart.oldChartHeight = chart.chartHeight;\n chart.oldChartWidth = chart.chartWidth;\n if (width !== undefined) {\n chart.options.chart.width = width;\n }\n if (height !== undefined) {\n chart.options.chart.height = height;\n }\n chart.getChartSize();\n\n // Resize the container with the global animation applied if enabled\n // (#2503)\n\n globalAnimation = renderer.globalAnimation;\n (globalAnimation ? animate : css)(chart.container, {\n width: chart.chartWidth + 'px',\n height: chart.chartHeight + 'px'\n }, globalAnimation);\n\n\n chart.setChartSize(true);\n renderer.setSize(chart.chartWidth, chart.chartHeight, animation);\n\n // handle axes\n each(chart.axes, function(axis) {\n axis.isDirty = true;\n axis.setScale();\n });\n\n chart.isDirtyLegend = true; // force legend redraw\n chart.isDirtyBox = true; // force redraw of plot and chart border\n\n chart.layOutTitles(); // #2857\n chart.getMargins();\n\n chart.redraw(animation);\n\n\n chart.oldChartHeight = null;\n fireEvent(chart, 'resize');\n\n // Fire endResize and set isResizing back. If animation is disabled,\n // fire without delay\n syncTimeout(function() {\n if (chart) {\n fireEvent(chart, 'endResize', null, function() {\n chart.isResizing -= 1;\n });\n }\n }, animObject(globalAnimation).duration);\n },\n\n /**\n * Set the public chart properties. This is done before and after the\n * pre-render to determine margin sizes\n */\n setChartSize: function(skipAxes) {\n var chart = this,\n inverted = chart.inverted,\n renderer = chart.renderer,\n chartWidth = chart.chartWidth,\n chartHeight = chart.chartHeight,\n optionsChart = chart.options.chart,\n spacing = chart.spacing,\n clipOffset = chart.clipOffset,\n clipX,\n clipY,\n plotLeft,\n plotTop,\n plotWidth,\n plotHeight,\n plotBorderWidth;\n\n function clipOffsetSide(side) {\n var offset = clipOffset[side] || 0;\n return Math.max(plotBorderWidth || offset, offset) / 2;\n }\n\n chart.plotLeft = plotLeft = Math.round(chart.plotLeft);\n chart.plotTop = plotTop = Math.round(chart.plotTop);\n chart.plotWidth = plotWidth = Math.max(\n 0,\n Math.round(chartWidth - plotLeft - chart.marginRight)\n );\n chart.plotHeight = plotHeight = Math.max(\n 0,\n Math.round(chartHeight - plotTop - chart.marginBottom)\n );\n\n chart.plotSizeX = inverted ? plotHeight : plotWidth;\n chart.plotSizeY = inverted ? plotWidth : plotHeight;\n\n chart.plotBorderWidth = optionsChart.plotBorderWidth || 0;\n\n // Set boxes used for alignment\n chart.spacingBox = renderer.spacingBox = {\n x: spacing[3],\n y: spacing[0],\n width: chartWidth - spacing[3] - spacing[1],\n height: chartHeight - spacing[0] - spacing[2]\n };\n chart.plotBox = renderer.plotBox = {\n x: plotLeft,\n y: plotTop,\n width: plotWidth,\n height: plotHeight\n };\n\n plotBorderWidth = 2 * Math.floor(chart.plotBorderWidth / 2);\n clipX = Math.ceil(clipOffsetSide(3));\n clipY = Math.ceil(clipOffsetSide(0));\n chart.clipBox = {\n x: clipX,\n y: clipY,\n width: Math.floor(\n chart.plotSizeX -\n clipOffsetSide(1) -\n clipX\n ),\n height: Math.max(\n 0,\n Math.floor(\n chart.plotSizeY -\n clipOffsetSide(2) -\n clipY\n )\n )\n };\n\n if (!skipAxes) {\n each(chart.axes, function(axis) {\n axis.setAxisSize();\n axis.setAxisTranslation();\n });\n }\n },\n\n /**\n * Initial margins before auto size margins are applied\n */\n resetMargins: function() {\n var chart = this,\n chartOptions = chart.options.chart;\n\n // Create margin and spacing array\n each(['margin', 'spacing'], function splashArrays(target) {\n var value = chartOptions[target],\n values = isObject(value) ? value : [value, value, value, value];\n\n each(['Top', 'Right', 'Bottom', 'Left'], function(sideName, side) {\n chart[target][side] = pick(\n chartOptions[target + sideName],\n values[side]\n );\n });\n });\n\n // Set margin names like chart.plotTop, chart.plotLeft,\n // chart.marginRight, chart.marginBottom.\n each(marginNames, function(m, side) {\n chart[m] = pick(chart.margin[side], chart.spacing[side]);\n });\n chart.axisOffset = [0, 0, 0, 0]; // top, right, bottom, left\n chart.clipOffset = [];\n },\n\n /**\n * Draw the borders and backgrounds for chart and plot area\n */\n drawChartBox: function() {\n var chart = this,\n optionsChart = chart.options.chart,\n renderer = chart.renderer,\n chartWidth = chart.chartWidth,\n chartHeight = chart.chartHeight,\n chartBackground = chart.chartBackground,\n plotBackground = chart.plotBackground,\n plotBorder = chart.plotBorder,\n chartBorderWidth,\n\n plotBGImage = chart.plotBGImage,\n chartBackgroundColor = optionsChart.backgroundColor,\n plotBackgroundColor = optionsChart.plotBackgroundColor,\n plotBackgroundImage = optionsChart.plotBackgroundImage,\n\n mgn,\n bgAttr,\n plotLeft = chart.plotLeft,\n plotTop = chart.plotTop,\n plotWidth = chart.plotWidth,\n plotHeight = chart.plotHeight,\n plotBox = chart.plotBox,\n clipRect = chart.clipRect,\n clipBox = chart.clipBox,\n verb = 'animate';\n\n // Chart area\n if (!chartBackground) {\n chart.chartBackground = chartBackground = renderer.rect()\n .addClass('highcharts-background')\n .add();\n verb = 'attr';\n }\n\n\n // Presentational\n chartBorderWidth = optionsChart.borderWidth || 0;\n mgn = chartBorderWidth + (optionsChart.shadow ? 8 : 0);\n\n bgAttr = {\n fill: chartBackgroundColor || 'none'\n };\n\n if (chartBorderWidth || chartBackground['stroke-width']) { // #980\n bgAttr.stroke = optionsChart.borderColor;\n bgAttr['stroke-width'] = chartBorderWidth;\n }\n chartBackground\n .attr(bgAttr)\n .shadow(optionsChart.shadow);\n\n chartBackground[verb]({\n x: mgn / 2,\n y: mgn / 2,\n width: chartWidth - mgn - chartBorderWidth % 2,\n height: chartHeight - mgn - chartBorderWidth % 2,\n r: optionsChart.borderRadius\n });\n\n // Plot background\n verb = 'animate';\n if (!plotBackground) {\n verb = 'attr';\n chart.plotBackground = plotBackground = renderer.rect()\n .addClass('highcharts-plot-background')\n .add();\n }\n plotBackground[verb](plotBox);\n\n\n // Presentational attributes for the background\n plotBackground\n .attr({\n fill: plotBackgroundColor || 'none'\n })\n .shadow(optionsChart.plotShadow);\n\n // Create the background image\n if (plotBackgroundImage) {\n if (!plotBGImage) {\n chart.plotBGImage = renderer.image(\n plotBackgroundImage,\n plotLeft,\n plotTop,\n plotWidth,\n plotHeight\n ).add();\n } else {\n plotBGImage.animate(plotBox);\n }\n }\n\n\n // Plot clip\n if (!clipRect) {\n chart.clipRect = renderer.clipRect(clipBox);\n } else {\n clipRect.animate({\n width: clipBox.width,\n height: clipBox.height\n });\n }\n\n // Plot area border\n verb = 'animate';\n if (!plotBorder) {\n verb = 'attr';\n chart.plotBorder = plotBorder = renderer.rect()\n .addClass('highcharts-plot-border')\n .attr({\n zIndex: 1 // Above the grid\n })\n .add();\n }\n\n\n // Presentational\n plotBorder.attr({\n stroke: optionsChart.plotBorderColor,\n 'stroke-width': optionsChart.plotBorderWidth || 0,\n fill: 'none'\n });\n\n\n plotBorder[verb](plotBorder.crisp({\n x: plotLeft,\n y: plotTop,\n width: plotWidth,\n height: plotHeight\n }, -plotBorder.strokeWidth())); //#3282 plotBorder should be negative;\n\n // reset\n chart.isDirtyBox = false;\n },\n\n /**\n * Detect whether a certain chart property is needed based on inspecting its\n * options and series. This mainly applies to the chart.inverted property,\n * and in extensions to the chart.angular and chart.polar properties.\n */\n propFromSeries: function() {\n var chart = this,\n optionsChart = chart.options.chart,\n klass,\n seriesOptions = chart.options.series,\n i,\n value;\n\n\n each(['inverted', 'angular', 'polar'], function(key) {\n\n // The default series type's class\n klass = seriesTypes[optionsChart.type ||\n optionsChart.defaultSeriesType];\n\n // Get the value from available chart-wide properties\n value =\n optionsChart[key] || // It is set in the options\n (klass && klass.prototype[key]); // The default series class\n // requires it\n\n // 4. Check if any the chart's series require it\n i = seriesOptions && seriesOptions.length;\n while (!value && i--) {\n klass = seriesTypes[seriesOptions[i].type];\n if (klass && klass.prototype[key]) {\n value = true;\n }\n }\n\n // Set the chart property\n chart[key] = value;\n });\n\n },\n\n /**\n * Link two or more series together. This is done initially from\n * Chart.render, and after Chart.addSeries and Series.remove.\n */\n linkSeries: function() {\n var chart = this,\n chartSeries = chart.series;\n\n // Reset links\n each(chartSeries, function(series) {\n series.linkedSeries.length = 0;\n });\n\n // Apply new links\n each(chartSeries, function(series) {\n var linkedTo = series.options.linkedTo;\n if (isString(linkedTo)) {\n if (linkedTo === ':previous') {\n linkedTo = chart.series[series.index - 1];\n } else {\n linkedTo = chart.get(linkedTo);\n }\n // #3341 avoid mutual linking\n if (linkedTo && linkedTo.linkedParent !== series) {\n linkedTo.linkedSeries.push(series);\n series.linkedParent = linkedTo;\n series.visible = pick(\n series.options.visible,\n linkedTo.options.visible,\n series.visible\n ); // #3879\n }\n }\n });\n },\n\n /**\n * Render series for the chart\n */\n renderSeries: function() {\n each(this.series, function(serie) {\n serie.translate();\n serie.render();\n });\n },\n\n /**\n * Render labels for the chart\n */\n renderLabels: function() {\n var chart = this,\n labels = chart.options.labels;\n if (labels.items) {\n each(labels.items, function(label) {\n var style = extend(labels.style, label.style),\n x = pInt(style.left) + chart.plotLeft,\n y = pInt(style.top) + chart.plotTop + 12;\n\n // delete to prevent rewriting in IE\n delete style.left;\n delete style.top;\n\n chart.renderer.text(\n label.html,\n x,\n y\n )\n .attr({\n zIndex: 2\n })\n .css(style)\n .add();\n\n });\n }\n },\n\n /**\n * Render all graphics for the chart\n */\n render: function() {\n var chart = this,\n axes = chart.axes,\n renderer = chart.renderer,\n options = chart.options,\n tempWidth,\n tempHeight,\n redoHorizontal,\n redoVertical;\n\n // Title\n chart.setTitle();\n\n\n // Legend\n chart.legend = new Legend(chart, options.legend);\n\n // Get stacks\n if (chart.getStacks) {\n chart.getStacks();\n }\n\n // Get chart margins\n chart.getMargins(true);\n chart.setChartSize();\n\n // Record preliminary dimensions for later comparison\n tempWidth = chart.plotWidth;\n tempHeight = chart.plotHeight = chart.plotHeight - 21; // 21 is the most common correction for X axis labels\n\n // Get margins by pre-rendering axes\n each(axes, function(axis) {\n axis.setScale();\n });\n chart.getAxisMargins();\n\n // If the plot area size has changed significantly, calculate tick positions again\n redoHorizontal = tempWidth / chart.plotWidth > 1.1;\n redoVertical = tempHeight / chart.plotHeight > 1.05; // Height is more sensitive\n\n if (redoHorizontal || redoVertical) {\n\n each(axes, function(axis) {\n if ((axis.horiz && redoHorizontal) || (!axis.horiz && redoVertical)) {\n axis.setTickInterval(true); // update to reflect the new margins\n }\n });\n chart.getMargins(); // second pass to check for new labels\n }\n\n // Draw the borders and backgrounds\n chart.drawChartBox();\n\n\n // Axes\n if (chart.hasCartesianSeries) {\n each(axes, function(axis) {\n if (axis.visible) {\n axis.render();\n }\n });\n }\n\n // The series\n if (!chart.seriesGroup) {\n chart.seriesGroup = renderer.g('series-group')\n .attr({\n zIndex: 3\n })\n .add();\n }\n chart.renderSeries();\n\n // Labels\n chart.renderLabels();\n\n // Credits\n chart.addCredits();\n\n // Handle responsiveness\n if (chart.setResponsive) {\n chart.setResponsive();\n }\n\n // Set flag\n chart.hasRendered = true;\n\n },\n\n /**\n * Set a new credits label for the chart.\n *\n * @param {CreditOptions} options\n * A configuration object for the new credits.\n * @sample highcharts/credits/credits-update/ Add and update credits\n */\n addCredits: function(credits) {\n var chart = this;\n\n credits = merge(true, this.options.credits, credits);\n if (credits.enabled && !this.credits) {\n\n /**\n * The chart's credits label. The label has an `update` method that\n * allows setting new options as per the {@link\n * https://api.highcharts.com/highcharts/credits|\n * credits options set}.\n *\n * @memberof Highcharts.Chart\n * @name credits\n * @type {Highcharts.SVGElement}\n */\n this.credits = this.renderer.text(\n credits.text + (this.mapCredits || ''),\n 0,\n 0\n )\n .addClass('highcharts-credits')\n .on('click', function() {\n if (credits.href) {\n win.location.href = credits.href;\n }\n })\n .attr({\n align: credits.position.align,\n zIndex: 8\n })\n\n .css(credits.style)\n\n .add()\n .align(credits.position);\n\n // Dynamically update\n this.credits.update = function(options) {\n chart.credits = chart.credits.destroy();\n chart.addCredits(options);\n };\n }\n },\n\n /**\n * Remove the chart and purge memory. This method is called internally\n * before adding a second chart into the same container, as well as on\n * window unload to prevent leaks.\n *\n * @sample highcharts/members/chart-destroy/\n * Destroy the chart from a button\n * @sample stock/members/chart-destroy/\n * Destroy with Highstock\n */\n destroy: function() {\n var chart = this,\n axes = chart.axes,\n series = chart.series,\n container = chart.container,\n i,\n parentNode = container && container.parentNode;\n\n // fire the chart.destoy event\n fireEvent(chart, 'destroy');\n\n // Delete the chart from charts lookup array\n if (chart.renderer.forExport) {\n H.erase(charts, chart); // #6569\n } else {\n charts[chart.index] = undefined;\n }\n H.chartCount--;\n chart.renderTo.removeAttribute('data-highcharts-chart');\n\n // remove events\n removeEvent(chart);\n\n // ==== Destroy collections:\n // Destroy axes\n i = axes.length;\n while (i--) {\n axes[i] = axes[i].destroy();\n }\n\n // Destroy scroller & scroller series before destroying base series\n if (this.scroller && this.scroller.destroy) {\n this.scroller.destroy();\n }\n\n // Destroy each series\n i = series.length;\n while (i--) {\n series[i] = series[i].destroy();\n }\n\n // ==== Destroy chart properties:\n each([\n 'title', 'subtitle', 'chartBackground', 'plotBackground',\n 'plotBGImage', 'plotBorder', 'seriesGroup', 'clipRect', 'credits',\n 'pointer', 'rangeSelector', 'legend', 'resetZoomButton', 'tooltip',\n 'renderer'\n ], function(name) {\n var prop = chart[name];\n\n if (prop && prop.destroy) {\n chart[name] = prop.destroy();\n }\n });\n\n // remove container and all SVG\n if (container) { // can break in IE when destroyed before finished loading\n container.innerHTML = '';\n removeEvent(container);\n if (parentNode) {\n discardElement(container);\n }\n\n }\n\n // clean it all up\n objectEach(chart, function(val, key) {\n delete chart[key];\n });\n\n },\n\n\n /**\n * VML namespaces can't be added until after complete. Listening\n * for Perini's doScroll hack is not enough.\n */\n isReadyToRender: function() {\n var chart = this;\n\n // Note: win == win.top is required\n if ((!svg && (win == win.top && doc.readyState !== 'complete'))) { // eslint-disable-line eqeqeq\n doc.attachEvent('onreadystatechange', function() {\n doc.detachEvent('onreadystatechange', chart.firstRender);\n if (doc.readyState === 'complete') {\n chart.firstRender();\n }\n });\n return false;\n }\n return true;\n },\n\n /**\n * Prepare for first rendering after all data are loaded\n */\n firstRender: function() {\n var chart = this,\n options = chart.options;\n\n // Check whether the chart is ready to render\n if (!chart.isReadyToRender()) {\n return;\n }\n\n // Create the container\n chart.getContainer();\n\n // Run an early event after the container and renderer are established\n fireEvent(chart, 'init');\n\n\n chart.resetMargins();\n chart.setChartSize();\n\n // Set the common chart properties (mainly invert) from the given series\n chart.propFromSeries();\n\n // get axes\n chart.getAxes();\n\n // Initialize the series\n each(options.series || [], function(serieOptions) {\n chart.initSeries(serieOptions);\n });\n\n chart.linkSeries();\n\n // Run an event after axes and series are initialized, but before render. At this stage,\n // the series data is indexed and cached in the xData and yData arrays, so we can access\n // those before rendering. Used in Highstock.\n fireEvent(chart, 'beforeRender');\n\n // depends on inverted and on margins being set\n if (Pointer) {\n chart.pointer = new Pointer(chart, options);\n }\n\n chart.render();\n\n // Fire the load event if there are no external images\n if (!chart.renderer.imgCount && chart.onload) {\n chart.onload();\n }\n\n // If the chart was rendered outside the top container, put it back in (#3679)\n chart.temporaryDisplay(true);\n\n },\n\n /** \n * On chart load\n */\n onload: function() {\n\n // Run callbacks\n each([this.callback].concat(this.callbacks), function(fn) {\n if (fn && this.index !== undefined) { // Chart destroyed in its own callback (#3600)\n fn.apply(this, [this]);\n }\n }, this);\n\n fireEvent(this, 'load');\n fireEvent(this, 'render');\n\n\n // Set up auto resize, check for not destroyed (#6068)\n if (defined(this.index) && this.options.chart.reflow !== false) {\n this.initReflow();\n }\n\n // Don't run again\n this.onload = null;\n }\n\n }); // end Chart\n\n }(Highcharts));\n (function(Highcharts) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var Point,\n H = Highcharts,\n\n each = H.each,\n extend = H.extend,\n erase = H.erase,\n fireEvent = H.fireEvent,\n format = H.format,\n isArray = H.isArray,\n isNumber = H.isNumber,\n pick = H.pick,\n removeEvent = H.removeEvent;\n\n /**\n * The Point object. The point objects are generated from the `series.data` \n * configuration objects or raw numbers. They can be accessed from the\n * `Series.points` array. Other ways to instaniate points are through {@link\n * Highcharts.Series#addPoint} or {@link Highcharts.Series#setData}.\n *\n * @class\n */\n\n Highcharts.Point = Point = function() {};\n Highcharts.Point.prototype = {\n\n /**\n * Initialize the point. Called internally based on the series.data option.\n * @param {Object} series The series object containing this point.\n * @param {Object} options The data in either number, array or object\n * format.\n * @param {Number} x Optionally, the X value of the.\n * @returns {Object} The Point instance.\n */\n init: function(series, options, x) {\n\n var point = this,\n colors,\n colorCount = series.chart.options.chart.colorCount,\n colorIndex;\n\n /**\n * The series object associated with the point.\n *\n * @name series\n * @memberof Highcharts.Point\n * @type Highcharts.Series\n */\n point.series = series;\n\n\n /**\n * The point's current color.\n * @name color\n * @memberof Highcharts.Point\n * @type {Color}\n */\n point.color = series.color; // #3445\n\n point.applyOptions(options, x);\n\n if (series.options.colorByPoint) {\n\n colors = series.options.colors || series.chart.options.colors;\n point.color = point.color || colors[series.colorCounter];\n colorCount = colors.length;\n\n colorIndex = series.colorCounter;\n series.colorCounter++;\n // loop back to zero\n if (series.colorCounter === colorCount) {\n series.colorCounter = 0;\n }\n } else {\n colorIndex = series.colorIndex;\n }\n point.colorIndex = pick(point.colorIndex, colorIndex);\n\n series.chart.pointCount++;\n return point;\n },\n /**\n * Apply the options containing the x and y data and possible some extra\n * properties. Called on point init or from point.update.\n *\n * @param {Object} options The point options as defined in series.data.\n * @param {Number} x Optionally, the X value.\n * @returns {Object} The Point instance.\n */\n applyOptions: function(options, x) {\n var point = this,\n series = point.series,\n pointValKey = series.options.pointValKey || series.pointValKey;\n\n options = Point.prototype.optionsToObject.call(this, options);\n\n // copy options directly to point\n extend(point, options);\n point.options = point.options ? extend(point.options, options) : options;\n\n // Since options are copied into the Point instance, some accidental options must be shielded (#5681)\n if (options.group) {\n delete point.group;\n }\n\n // For higher dimension series types. For instance, for ranges, point.y is mapped to point.low.\n if (pointValKey) {\n point.y = point[pointValKey];\n }\n point.isNull = pick(\n point.isValid && !point.isValid(),\n point.x === null || !isNumber(point.y, true)\n ); // #3571, check for NaN\n\n // The point is initially selected by options (#5777)\n if (point.selected) {\n point.state = 'select';\n }\n\n // If no x is set by now, get auto incremented value. All points must have an\n // x value, however the y value can be null to create a gap in the series\n if ('name' in point && x === undefined && series.xAxis && series.xAxis.hasNames) {\n point.x = series.xAxis.nameToX(point);\n }\n if (point.x === undefined && series) {\n if (x === undefined) {\n point.x = series.autoIncrement(point);\n } else {\n point.x = x;\n }\n }\n\n return point;\n },\n\n /**\n * Transform number or array configs into objects\n */\n optionsToObject: function(options) {\n var ret = {},\n series = this.series,\n keys = series.options.keys,\n pointArrayMap = keys || series.pointArrayMap || ['y'],\n valueCount = pointArrayMap.length,\n firstItemType,\n i = 0,\n j = 0;\n\n if (isNumber(options) || options === null) {\n ret[pointArrayMap[0]] = options;\n\n } else if (isArray(options)) {\n // with leading x value\n if (!keys && options.length > valueCount) {\n firstItemType = typeof options[0];\n if (firstItemType === 'string') {\n ret.name = options[0];\n } else if (firstItemType === 'number') {\n ret.x = options[0];\n }\n i++;\n }\n while (j < valueCount) {\n if (!keys || options[i] !== undefined) { // Skip undefined positions for keys\n ret[pointArrayMap[j]] = options[i];\n }\n i++;\n j++;\n }\n } else if (typeof options === 'object') {\n ret = options;\n\n // This is the fastest way to detect if there are individual point dataLabels that need\n // to be considered in drawDataLabels. These can only occur in object configs.\n if (options.dataLabels) {\n series._hasPointLabels = true;\n }\n\n // Same approach as above for markers\n if (options.marker) {\n series._hasPointMarkers = true;\n }\n }\n return ret;\n },\n\n /**\n * Get the CSS class names for individual points\n * @returns {String} The class name\n */\n getClassName: function() {\n return 'highcharts-point' +\n (this.selected ? ' highcharts-point-select' : '') +\n (this.negative ? ' highcharts-negative' : '') +\n (this.isNull ? ' highcharts-null-point' : '') +\n (this.colorIndex !== undefined ? ' highcharts-color-' +\n this.colorIndex : '') +\n (this.options.className ? ' ' + this.options.className : '') +\n (this.zone && this.zone.className ? ' ' +\n this.zone.className.replace('highcharts-negative', '') : '');\n },\n\n /**\n * Return the zone that the point belongs to\n */\n getZone: function() {\n var series = this.series,\n zones = series.zones,\n zoneAxis = series.zoneAxis || 'y',\n i = 0,\n zone;\n\n zone = zones[i];\n while (this[zoneAxis] >= zone.value) {\n zone = zones[++i];\n }\n\n if (zone && zone.color && !this.options.color) {\n this.color = zone.color;\n }\n\n return zone;\n },\n\n /**\n * Destroy a point to clear memory. Its reference still stays in series.data.\n */\n destroy: function() {\n var point = this,\n series = point.series,\n chart = series.chart,\n hoverPoints = chart.hoverPoints,\n prop;\n\n chart.pointCount--;\n\n if (hoverPoints) {\n point.setState();\n erase(hoverPoints, point);\n if (!hoverPoints.length) {\n chart.hoverPoints = null;\n }\n\n }\n if (point === chart.hoverPoint) {\n point.onMouseOut();\n }\n\n // remove all events\n if (point.graphic || point.dataLabel) { // removeEvent and destroyElements are performance expensive\n removeEvent(point);\n point.destroyElements();\n }\n\n if (point.legendItem) { // pies have legend items\n chart.legend.destroyItem(point);\n }\n\n for (prop in point) {\n point[prop] = null;\n }\n\n\n },\n\n /**\n * Destroy SVG elements associated with the point\n */\n destroyElements: function() {\n var point = this,\n props = ['graphic', 'dataLabel', 'dataLabelUpper', 'connector', 'shadowGroup'],\n prop,\n i = 6;\n while (i--) {\n prop = props[i];\n if (point[prop]) {\n point[prop] = point[prop].destroy();\n }\n }\n },\n\n /**\n * Return the configuration hash needed for the data label and tooltip formatters\n */\n getLabelConfig: function() {\n return {\n x: this.category,\n y: this.y,\n color: this.color,\n colorIndex: this.colorIndex,\n key: this.name || this.category,\n series: this.series,\n point: this,\n percentage: this.percentage,\n total: this.total || this.stackTotal\n };\n },\n\n /**\n * Extendable method for formatting each point's tooltip line\n *\n * @return {String} A string to be concatenated in to the common tooltip text\n */\n tooltipFormatter: function(pointFormat) {\n\n // Insert options for valueDecimals, valuePrefix, and valueSuffix\n var series = this.series,\n seriesTooltipOptions = series.tooltipOptions,\n valueDecimals = pick(seriesTooltipOptions.valueDecimals, ''),\n valuePrefix = seriesTooltipOptions.valuePrefix || '',\n valueSuffix = seriesTooltipOptions.valueSuffix || '';\n\n // Loop over the point array map and replace unformatted values with sprintf formatting markup\n each(series.pointArrayMap || ['y'], function(key) {\n key = '{point.' + key; // without the closing bracket\n if (valuePrefix || valueSuffix) {\n pointFormat = pointFormat.replace(key + '}', valuePrefix + key + '}' + valueSuffix);\n }\n pointFormat = pointFormat.replace(key + '}', key + ':,.' + valueDecimals + 'f}');\n });\n\n return format(pointFormat, {\n point: this,\n series: this.series\n });\n },\n\n /**\n * Fire an event on the Point object.\n * @param {String} eventType\n * @param {Object} eventArgs Additional event arguments\n * @param {Function} defaultFunction Default event handler\n */\n firePointEvent: function(eventType, eventArgs, defaultFunction) {\n var point = this,\n series = this.series,\n seriesOptions = series.options;\n\n // load event handlers on demand to save time on mouseover/out\n if (seriesOptions.point.events[eventType] || (point.options && point.options.events && point.options.events[eventType])) {\n this.importEvents();\n }\n\n // add default handler if in selection mode\n if (eventType === 'click' && seriesOptions.allowPointSelect) {\n defaultFunction = function(event) {\n // Control key is for Windows, meta (= Cmd key) for Mac, Shift for Opera\n if (point.select) { // Could be destroyed by prior event handlers (#2911)\n point.select(null, event.ctrlKey || event.metaKey || event.shiftKey);\n }\n };\n }\n\n fireEvent(this, eventType, eventArgs, defaultFunction);\n },\n\n /**\n * For certain series types, like pie charts, where individual points can\n * be shown or hidden. \n *\n * @name visible\n * @memberOf Highcharts.Point\n * @type {Boolean}\n */\n visible: true\n };\n\n /**\n * For categorized axes this property holds the category name for the \n * point. For other axes it holds the X value.\n *\n * @name category\n * @memberOf Highcharts.Point\n * @type {String|Number}\n */\n\n /**\n * The percentage for points in a stacked series or pies.\n *\n * @name percentage\n * @memberOf Highcharts.Point\n * @type {Number}\n */\n\n /**\n * The total of values in either a stack for stacked series, or a pie in a pie\n * series.\n *\n * @name total\n * @memberOf Highcharts.Point\n * @type {Number}\n */\n\n /**\n * The x value of the point.\n *\n * @name x\n * @memberOf Highcharts.Point\n * @type {Number}\n */\n\n /**\n * The y value of the point.\n *\n * @name y\n * @memberOf Highcharts.Point\n * @type {Number}\n */\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var addEvent = H.addEvent,\n animObject = H.animObject,\n arrayMax = H.arrayMax,\n arrayMin = H.arrayMin,\n correctFloat = H.correctFloat,\n Date = H.Date,\n defaultOptions = H.defaultOptions,\n defaultPlotOptions = H.defaultPlotOptions,\n defined = H.defined,\n each = H.each,\n erase = H.erase,\n extend = H.extend,\n fireEvent = H.fireEvent,\n grep = H.grep,\n isArray = H.isArray,\n isNumber = H.isNumber,\n isString = H.isString,\n LegendSymbolMixin = H.LegendSymbolMixin, // @todo add as a requirement\n merge = H.merge,\n objectEach = H.objectEach,\n pick = H.pick,\n Point = H.Point, // @todo add as a requirement\n removeEvent = H.removeEvent,\n splat = H.splat,\n SVGElement = H.SVGElement,\n syncTimeout = H.syncTimeout,\n win = H.win;\n\n /**\n * This is the base series prototype that all other series types inherit from.\n * A new series is initiated either through the {@link https://api.highcharts.com/highcharts/series|\n * series} option structure, or after the chart is initiated, through {@link\n * Highcharts.Chart#addSeries}.\n *\n * The object can be accessed in a number of ways. All series and point event\n * handlers give a reference to the `series` object. The chart object has a\n * {@link Highcharts.Chart.series|series} property that is a collection of all\n * the chart's series. The point objects and axis objects also have the same\n * reference.\n * \n * Another way to reference the series programmatically is by `id`. Add an id\n * in the series configuration options, and get the series object by {@link\n * Highcharts.Chart#get}.\n *\n * Configuration options for the series are given in three levels. Options for\n * all series in a chart are given in the {@link https://api.highcharts.com/highcharts/plotOptions.series|\n * plotOptions.series} object. Then options for all series of a specific type\n * are given in the plotOptions of that type, for example `plotOptions.line`.\n * Next, options for one single series are given in the series array, or as\n * arguements to `chart.addSeries`. \n * \n * The data in the series is stored in various arrays.\n *\n * - First, `series.options.data` contains all the original config options for\n * each point whether added by options or methods like `series.addPoint`.\n * - Next, `series.data` contains those values converted to points, but in case\n * the series data length exceeds the `cropThreshold`, or if the data is grouped,\n * `series.data` doesn't contain all the points. It only contains the points that\n * have been created on demand.\n * - Then there's `series.points` that contains all currently visible point\n * objects. In case of cropping, the cropped-away points are not part of this\n * array. The `series.points` array starts at `series.cropStart` compared to\n * `series.data` and `series.options.data`. If however the series data is grouped,\n * these can't be correlated one to one.\n * - `series.xData` and `series.processedXData` contain clean x values, equivalent\n * to `series.data` and `series.points`.\n * - `series.yData` and `series.processedYData` contain clean y values, equivalent\n * to `series.data` and `series.points`.\n *\n * @class Highcharts.Series\n * @param {Highcharts.Chart} chart\n * The chart instance.\n * @param {Object} options\n * The series options.\n */\n H.Series = H.seriesType('line', null, { // base series options\n\n //cursor: 'default',\n //dashStyle: null,\n //linecap: 'round',\n lineWidth: 2,\n //shadow: false,\n\n allowPointSelect: false,\n showCheckbox: false,\n animation: {\n duration: 1000\n },\n //clip: true,\n //connectNulls: false,\n //enableMouseTracking: true,\n events: {},\n //legendIndex: 0,\n // stacking: null,\n marker: {\n\n lineWidth: 0,\n lineColor: '#ffffff',\n //fillColor: null,\n\n //enabled: true,\n //symbol: null,\n radius: 4,\n states: { // states for a single point\n hover: {\n animation: {\n duration: 50\n },\n enabled: true,\n radiusPlus: 2,\n\n lineWidthPlus: 1\n\n },\n\n select: {\n fillColor: '#cccccc',\n lineColor: '#000000',\n lineWidth: 2\n }\n\n }\n },\n point: {\n events: {}\n },\n dataLabels: {\n align: 'center',\n // defer: true,\n // enabled: false,\n formatter: function() {\n return this.y === null ? '' : H.numberFormat(this.y, -1);\n },\n\n style: {\n fontSize: '11px',\n fontWeight: 'bold',\n color: 'contrast',\n textOutline: '1px contrast'\n },\n // backgroundColor: undefined,\n // borderColor: undefined,\n // borderWidth: undefined,\n // shadow: false\n\n verticalAlign: 'bottom', // above singular point\n x: 0,\n y: 0,\n // borderRadius: undefined,\n padding: 5\n },\n // draw points outside the plot area when the number of points is less than\n // this\n cropThreshold: 300,\n pointRange: 0,\n //pointStart: 0,\n //pointInterval: 1,\n //showInLegend: null, // auto = false for linked series\n softThreshold: true,\n states: { // states for the entire series\n hover: {\n //enabled: false,\n animation: {\n duration: 50\n },\n lineWidthPlus: 1,\n marker: {\n // lineWidth: base + 1,\n // radius: base + 1\n },\n halo: {\n size: 10,\n\n opacity: 0.25\n\n }\n },\n select: {\n marker: {}\n }\n },\n stickyTracking: true,\n //tooltip: {\n //pointFormat: '\\u25CF' +\n // '{series.name}: {point.y}'\n //valueDecimals: null,\n //xDateFormat: '%A, %b %e, %Y',\n //valuePrefix: '',\n //ySuffix: ''\n //}\n turboThreshold: 1000,\n // zIndex: null\n findNearestPointBy: 'x'\n\n }, /** @lends Highcharts.Series.prototype */ {\n isCartesian: true,\n pointClass: Point,\n sorted: true, // requires the data to be sorted\n requireSorting: true,\n directTouch: false,\n axisTypes: ['xAxis', 'yAxis'],\n colorCounter: 0,\n // each point's x and y values are stored in this.xData and this.yData\n parallelArrays: ['x', 'y'],\n coll: 'series',\n init: function(chart, options) {\n var series = this,\n events,\n chartSeries = chart.series,\n lastSeries;\n\n /**\n * Read only. The chart that the series belongs to.\n *\n * @name chart\n * @memberOf Series\n * @type {Chart}\n */\n series.chart = chart;\n\n /**\n * Read only. The series' type, like \"line\", \"area\", \"column\" etc. The\n * type in the series options anc can be altered using {@link\n * Series#update}.\n *\n * @name type\n * @memberOf Series\n * @type String\n */\n\n /**\n * Read only. The series' current options. To update, use {@link\n * Series#update}.\n *\n * @name options\n * @memberOf Series\n * @type SeriesOptions\n */\n series.options = options = series.setOptions(options);\n series.linkedSeries = [];\n\n // bind the axes\n series.bindAxes();\n\n // set some variables\n extend(series, {\n /**\n * The series name as given in the options. Defaults to\n * \"Series {n}\".\n *\n * @name name\n * @memberOf Series\n * @type {String}\n */\n name: options.name,\n state: '',\n /**\n * Read only. The series' visibility state as set by {@link\n * Series#show}, {@link Series#hide}, or in the initial\n * configuration.\n *\n * @name visible\n * @memberOf Series\n * @type {Boolean}\n */\n visible: options.visible !== false, // true by default\n /**\n * Read only. The series' selected state as set by {@link\n * Highcharts.Series#select}.\n * \n * @name selected\n * @memberOf Series\n * @type {Boolean}\n */\n selected: options.selected === true // false by default\n });\n\n // register event listeners\n events = options.events;\n\n objectEach(events, function(event, eventType) {\n addEvent(series, eventType, event);\n });\n if (\n (events && events.click) ||\n (\n options.point &&\n options.point.events &&\n options.point.events.click\n ) ||\n options.allowPointSelect\n ) {\n chart.runTrackerClick = true;\n }\n\n series.getColor();\n series.getSymbol();\n\n // Set the data\n each(series.parallelArrays, function(key) {\n series[key + 'Data'] = [];\n });\n series.setData(options.data, false);\n\n // Mark cartesian\n if (series.isCartesian) {\n chart.hasCartesianSeries = true;\n }\n\n // Get the index and register the series in the chart. The index is one\n // more than the current latest series index (#5960).\n if (chartSeries.length) {\n lastSeries = chartSeries[chartSeries.length - 1];\n }\n series._i = pick(lastSeries && lastSeries._i, -1) + 1;\n\n // Insert the series and re-order all series above the insertion point.\n chart.orderSeries(this.insert(chartSeries));\n },\n\n /**\n * Insert the series in a collection with other series, either the chart\n * series or yAxis series, in the correct order according to the index \n * option.\n * @param {Array} collection A collection of series.\n * @returns {Number} The index of the series in the collection.\n */\n insert: function(collection) {\n var indexOption = this.options.index,\n i;\n\n // Insert by index option\n if (isNumber(indexOption)) {\n i = collection.length;\n while (i--) {\n // Loop down until the interted element has higher index\n if (indexOption >=\n pick(collection[i].options.index, collection[i]._i)) {\n collection.splice(i + 1, 0, this);\n break;\n }\n }\n if (i === -1) {\n collection.unshift(this);\n }\n i = i + 1;\n\n // Or just push it to the end\n } else {\n collection.push(this);\n }\n return pick(i, collection.length - 1);\n },\n\n /**\n * Set the xAxis and yAxis properties of cartesian series, and register the\n * series in the `axis.series` array.\n *\n * @function #bindAxes\n * @memberOf Series\n * @returns {void}\n */\n bindAxes: function() {\n var series = this,\n seriesOptions = series.options,\n chart = series.chart,\n axisOptions;\n\n // repeat for xAxis and yAxis\n each(series.axisTypes || [], function(AXIS) {\n\n // loop through the chart's axis objects\n each(chart[AXIS], function(axis) {\n axisOptions = axis.options;\n\n // apply if the series xAxis or yAxis option mathches the number\n // of the axis, or if undefined, use the first axis\n if (\n seriesOptions[AXIS] === axisOptions.index ||\n (\n seriesOptions[AXIS] !== undefined &&\n seriesOptions[AXIS] === axisOptions.id\n ) ||\n (\n seriesOptions[AXIS] === undefined &&\n axisOptions.index === 0\n )\n ) {\n\n // register this series in the axis.series lookup\n series.insert(axis.series);\n\n // set this series.xAxis or series.yAxis reference\n /**\n * Read only. The unique xAxis object associated with the\n * series.\n *\n * @name xAxis\n * @memberOf Series\n * @type Axis\n */\n /**\n * Read only. The unique yAxis object associated with the\n * series.\n *\n * @name yAxis\n * @memberOf Series\n * @type Axis\n */\n series[AXIS] = axis;\n\n // mark dirty for redraw\n axis.isDirty = true;\n }\n });\n\n // The series needs an X and an Y axis\n if (!series[AXIS] && series.optionalAxis !== AXIS) {\n H.error(18, true);\n }\n\n });\n },\n\n /**\n * For simple series types like line and column, the data values are held in\n * arrays like xData and yData for quick lookup to find extremes and more.\n * For multidimensional series like bubble and map, this can be extended\n * with arrays like zData and valueData by adding to the\n * series.parallelArrays array.\n */\n updateParallelArrays: function(point, i) {\n var series = point.series,\n args = arguments,\n fn = isNumber(i) ?\n // Insert the value in the given position\n function(key) {\n var val = key === 'y' && series.toYData ?\n series.toYData(point) :\n point[key];\n series[key + 'Data'][i] = val;\n } :\n // Apply the method specified in i with the following arguments\n // as arguments\n function(key) {\n Array.prototype[i].apply(\n series[key + 'Data'],\n Array.prototype.slice.call(args, 2)\n );\n };\n\n each(series.parallelArrays, fn);\n },\n\n /**\n * Return an auto incremented x value based on the pointStart and\n * pointInterval options. This is only used if an x value is not given for\n * the point that calls autoIncrement.\n */\n autoIncrement: function() {\n\n var options = this.options,\n xIncrement = this.xIncrement,\n date,\n pointInterval,\n pointIntervalUnit = options.pointIntervalUnit;\n\n xIncrement = pick(xIncrement, options.pointStart, 0);\n\n this.pointInterval = pointInterval = pick(\n this.pointInterval,\n options.pointInterval,\n 1\n );\n\n // Added code for pointInterval strings\n if (pointIntervalUnit) {\n date = new Date(xIncrement);\n\n if (pointIntervalUnit === 'day') {\n date = +date[Date.hcSetDate](\n date[Date.hcGetDate]() + pointInterval\n );\n } else if (pointIntervalUnit === 'month') {\n date = +date[Date.hcSetMonth](\n date[Date.hcGetMonth]() + pointInterval\n );\n } else if (pointIntervalUnit === 'year') {\n date = +date[Date.hcSetFullYear](\n date[Date.hcGetFullYear]() + pointInterval\n );\n }\n pointInterval = date - xIncrement;\n\n }\n\n this.xIncrement = xIncrement + pointInterval;\n return xIncrement;\n },\n\n /**\n * Set the series options by merging from the options tree\n * @param {Object} itemOptions\n */\n setOptions: function(itemOptions) {\n var chart = this.chart,\n chartOptions = chart.options,\n plotOptions = chartOptions.plotOptions,\n userOptions = chart.userOptions || {},\n userPlotOptions = userOptions.plotOptions || {},\n typeOptions = plotOptions[this.type],\n options,\n zones;\n\n this.userOptions = itemOptions;\n\n // General series options take precedence over type options because\n // otherwise, default type options like column.animation would be\n // overwritten by the general option. But issues have been raised here\n // (#3881), and the solution may be to distinguish between default\n // option and userOptions like in the tooltip below.\n options = merge(\n typeOptions,\n plotOptions.series,\n itemOptions\n );\n\n // The tooltip options are merged between global and series specific\n // options. Importance order asscendingly:\n // globals: (1)tooltip, (2)plotOptions.series, (3)plotOptions[this.type]\n // init userOptions with possible later updates: 4-6 like 1-3 and\n // (7)this series options\n this.tooltipOptions = merge(\n defaultOptions.tooltip, // 1\n defaultOptions.plotOptions.series &&\n defaultOptions.plotOptions.series.tooltip, // 2\n defaultOptions.plotOptions[this.type].tooltip, // 3\n chartOptions.tooltip.userOptions, // 4\n plotOptions.series && plotOptions.series.tooltip, // 5\n plotOptions[this.type].tooltip, // 6\n itemOptions.tooltip // 7\n );\n\n // When shared tooltip, stickyTracking is true by default,\n // unless user says otherwise.\n this.stickyTracking = pick(\n itemOptions.stickyTracking,\n userPlotOptions[this.type] &&\n userPlotOptions[this.type].stickyTracking,\n userPlotOptions.series && userPlotOptions.series.stickyTracking,\n (\n this.tooltipOptions.shared && !this.noSharedTooltip ?\n true :\n options.stickyTracking\n )\n );\n\n // Delete marker object if not allowed (#1125)\n if (typeOptions.marker === null) {\n delete options.marker;\n }\n\n // Handle color zones\n this.zoneAxis = options.zoneAxis;\n zones = this.zones = (options.zones || []).slice();\n if (\n (options.negativeColor || options.negativeFillColor) &&\n !options.zones\n ) {\n zones.push({\n value: options[this.zoneAxis + 'Threshold'] ||\n options.threshold ||\n 0,\n className: 'highcharts-negative',\n\n color: options.negativeColor,\n fillColor: options.negativeFillColor\n\n });\n }\n if (zones.length) { // Push one extra zone for the rest\n if (defined(zones[zones.length - 1].value)) {\n zones.push({\n\n color: this.color,\n fillColor: this.fillColor\n\n });\n }\n }\n return options;\n },\n\n getCyclic: function(prop, value, defaults) {\n var i,\n chart = this.chart,\n userOptions = this.userOptions,\n indexName = prop + 'Index',\n counterName = prop + 'Counter',\n len = defaults ? defaults.length : pick(\n chart.options.chart[prop + 'Count'],\n chart[prop + 'Count']\n ),\n setting;\n\n if (!value) {\n // Pick up either the colorIndex option, or the _colorIndex after\n // Series.update()\n setting = pick(\n userOptions[indexName],\n userOptions['_' + indexName]\n );\n if (defined(setting)) { // after Series.update()\n i = setting;\n } else {\n // #6138\n if (!chart.series.length) {\n chart[counterName] = 0;\n }\n userOptions['_' + indexName] = i = chart[counterName] % len;\n chart[counterName] += 1;\n }\n if (defaults) {\n value = defaults[i];\n }\n }\n // Set the colorIndex\n if (i !== undefined) {\n this[indexName] = i;\n }\n this[prop] = value;\n },\n\n /**\n * Get the series' color\n */\n\n getColor: function() {\n if (this.options.colorByPoint) {\n // #4359, selected slice got series.color even when colorByPoint was\n // set.\n this.options.color = null;\n } else {\n this.getCyclic(\n 'color',\n this.options.color || defaultPlotOptions[this.type].color,\n this.chart.options.colors\n );\n }\n },\n\n /**\n * Get the series' symbol\n */\n getSymbol: function() {\n var seriesMarkerOption = this.options.marker;\n\n this.getCyclic(\n 'symbol',\n seriesMarkerOption.symbol,\n this.chart.options.symbols\n );\n },\n\n drawLegendSymbol: LegendSymbolMixin.drawLineMarker,\n\n /**\n * Apply a new set of data to the series and optionally redraw it. The new\n * data array is passed by reference (except in case of `updatePoints`), and\n * may later be mutated when updating the chart data.\n * \n * Note the difference in behaviour when setting the same amount of points,\n * or a different amount of points, as handled by the `updatePoints`\n * parameter. \n * \n * @param {SeriesDataOptions} data\n * Takes an array of data in the same format as described under\n * `seriesdata` for the given series type.\n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart after the series is altered. If doing\n * more operations on the chart, it is a good idea to set redraw to\n * false and call {@link Chart#redraw} after.\n * @param {AnimationOptions} [animation]\n * When the updated data is the same length as the existing data,\n * points will be updated by default, and animation visualizes how\n * the points are changed. Set false to disable animation, or a\n * configuration object to set duration or easing.\n * @param {Boolean} [updatePoints=true]\n * When the updated data is the same length as the existing data,\n * points will be updated instead of replaced. This allows updating\n * with animation and performs better. In this case, the original\n * array is not passed by reference. Set false to prevent.\n *\n * @sample highcharts/members/series-setdata/\n * Set new data from a button\n * @sample highcharts/members/series-setdata-pie/\n * Set data in a pie\n * @sample stock/members/series-setdata/\n * Set new data in Highstock\n * @sample maps/members/series-setdata/\n * Set new data in Highmaps\n */\n setData: function(data, redraw, animation, updatePoints) {\n var series = this,\n oldData = series.points,\n oldDataLength = (oldData && oldData.length) || 0,\n dataLength,\n options = series.options,\n chart = series.chart,\n firstPoint = null,\n xAxis = series.xAxis,\n i,\n turboThreshold = options.turboThreshold,\n pt,\n xData = this.xData,\n yData = this.yData,\n pointArrayMap = series.pointArrayMap,\n valueCount = pointArrayMap && pointArrayMap.length;\n\n data = data || [];\n dataLength = data.length;\n redraw = pick(redraw, true);\n\n // If the point count is the same as is was, just run Point.update which\n // is cheaper, allows animation, and keeps references to points.\n if (\n updatePoints !== false &&\n dataLength &&\n oldDataLength === dataLength &&\n !series.cropped &&\n !series.hasGroupedData &&\n series.visible\n ) {\n each(data, function(point, i) {\n // .update doesn't exist on a linked, hidden series (#3709)\n if (oldData[i].update && point !== options.data[i]) {\n oldData[i].update(point, false, null, false);\n }\n });\n\n } else {\n\n // Reset properties\n series.xIncrement = null;\n\n series.colorCounter = 0; // for series with colorByPoint (#1547)\n\n // Update parallel arrays\n each(this.parallelArrays, function(key) {\n series[key + 'Data'].length = 0;\n });\n\n // In turbo mode, only one- or twodimensional arrays of numbers are\n // allowed. The first value is tested, and we assume that all the\n // rest are defined the same way. Although the 'for' loops are\n // similar, they are repeated inside each if-else conditional for\n // max performance.\n if (turboThreshold && dataLength > turboThreshold) {\n\n // find the first non-null point\n i = 0;\n while (firstPoint === null && i < dataLength) {\n firstPoint = data[i];\n i++;\n }\n\n\n if (isNumber(firstPoint)) { // assume all points are numbers\n for (i = 0; i < dataLength; i++) {\n xData[i] = this.autoIncrement();\n yData[i] = data[i];\n }\n\n // Assume all points are arrays when first point is\n } else if (isArray(firstPoint)) {\n if (valueCount) { // [x, low, high] or [x, o, h, l, c]\n for (i = 0; i < dataLength; i++) {\n pt = data[i];\n xData[i] = pt[0];\n yData[i] = pt.slice(1, valueCount + 1);\n }\n } else { // [x, y]\n for (i = 0; i < dataLength; i++) {\n pt = data[i];\n xData[i] = pt[0];\n yData[i] = pt[1];\n }\n }\n } else {\n // Highcharts expects configs to be numbers or arrays in\n // turbo mode\n H.error(12);\n }\n } else {\n for (i = 0; i < dataLength; i++) {\n if (data[i] !== undefined) { // stray commas in oldIE\n pt = {\n series: series\n };\n series.pointClass.prototype.applyOptions.apply(\n pt, [data[i]]\n );\n series.updateParallelArrays(pt, i);\n }\n }\n }\n\n // Forgetting to cast strings to numbers is a common caveat when\n // handling CSV or JSON\n if (isString(yData[0])) {\n H.error(14, true);\n }\n\n /**\n * Read only. An array containing the series' data point objects. To\n * modify the data, use {@link Highcharts.Series#setData} or {@link\n * Highcharts.Point#update}.\n *\n * @name data\n * @memberOf Highcharts.Series\n * @type {Array.}\n */\n series.data = [];\n series.options.data = series.userOptions.data = data;\n\n // destroy old points\n i = oldDataLength;\n while (i--) {\n if (oldData[i] && oldData[i].destroy) {\n oldData[i].destroy();\n }\n }\n\n // reset minRange (#878)\n if (xAxis) {\n xAxis.minRange = xAxis.userMinRange;\n }\n\n // redraw\n series.isDirty = chart.isDirtyBox = true;\n series.isDirtyData = !!oldData;\n animation = false;\n }\n\n // Typically for pie series, points need to be processed and generated\n // prior to rendering the legend\n if (options.legendType === 'point') {\n this.processData();\n this.generatePoints();\n }\n\n if (redraw) {\n chart.redraw(animation);\n }\n },\n\n /**\n * Process the data by cropping away unused data points if the series is\n * longer than the crop threshold. This saves computing time for large\n * series.\n */\n processData: function(force) {\n var series = this,\n processedXData = series.xData, // copied during slice operation\n processedYData = series.yData,\n dataLength = processedXData.length,\n croppedData,\n cropStart = 0,\n cropped,\n distance,\n closestPointRange,\n xAxis = series.xAxis,\n i, // loop variable\n options = series.options,\n cropThreshold = options.cropThreshold,\n getExtremesFromAll =\n series.getExtremesFromAll ||\n options.getExtremesFromAll, // #4599\n isCartesian = series.isCartesian,\n xExtremes,\n val2lin = xAxis && xAxis.val2lin,\n isLog = xAxis && xAxis.isLog,\n min,\n max;\n\n // If the series data or axes haven't changed, don't go through this.\n // Return false to pass the message on to override methods like in data\n // grouping.\n if (\n isCartesian &&\n !series.isDirty &&\n !xAxis.isDirty &&\n !series.yAxis.isDirty &&\n !force\n ) {\n return false;\n }\n\n if (xAxis) {\n xExtremes = xAxis.getExtremes(); // corrected for log axis (#3053)\n min = xExtremes.min;\n max = xExtremes.max;\n }\n\n // optionally filter out points outside the plot area\n if (\n isCartesian &&\n series.sorted &&\n !getExtremesFromAll &&\n (!cropThreshold || dataLength > cropThreshold || series.forceCrop)\n ) {\n\n // it's outside current extremes\n if (\n processedXData[dataLength - 1] < min ||\n processedXData[0] > max\n ) {\n processedXData = [];\n processedYData = [];\n\n // only crop if it's actually spilling out\n } else if (\n processedXData[0] < min ||\n processedXData[dataLength - 1] > max\n ) {\n croppedData = this.cropData(\n series.xData,\n series.yData,\n min,\n max\n );\n processedXData = croppedData.xData;\n processedYData = croppedData.yData;\n cropStart = croppedData.start;\n cropped = true;\n }\n }\n\n\n // Find the closest distance between processed points\n i = processedXData.length || 1;\n while (--i) {\n distance = isLog ?\n val2lin(processedXData[i]) - val2lin(processedXData[i - 1]) :\n processedXData[i] - processedXData[i - 1];\n\n if (\n distance > 0 &&\n (\n closestPointRange === undefined ||\n distance < closestPointRange\n )\n ) {\n closestPointRange = distance;\n\n // Unsorted data is not supported by the line tooltip, as well as\n // data grouping and navigation in Stock charts (#725) and width\n // calculation of columns (#1900)\n } else if (distance < 0 && series.requireSorting) {\n H.error(15);\n }\n }\n\n // Record the properties\n series.cropped = cropped; // undefined or true\n series.cropStart = cropStart;\n series.processedXData = processedXData;\n series.processedYData = processedYData;\n\n series.closestPointRange = closestPointRange;\n\n },\n\n /**\n * Iterate over xData and crop values between min and max. Returns object\n * containing crop start/end cropped xData with corresponding part of yData,\n * dataMin and dataMax within the cropped range\n */\n cropData: function(xData, yData, min, max) {\n var dataLength = xData.length,\n cropStart = 0,\n cropEnd = dataLength,\n // line-type series need one point outside\n cropShoulder = pick(this.cropShoulder, 1),\n i,\n j;\n\n // iterate up to find slice start\n for (i = 0; i < dataLength; i++) {\n if (xData[i] >= min) {\n cropStart = Math.max(0, i - cropShoulder);\n break;\n }\n }\n\n // proceed to find slice end\n for (j = i; j < dataLength; j++) {\n if (xData[j] > max) {\n cropEnd = j + cropShoulder;\n break;\n }\n }\n\n return {\n xData: xData.slice(cropStart, cropEnd),\n yData: yData.slice(cropStart, cropEnd),\n start: cropStart,\n end: cropEnd\n };\n },\n\n\n /**\n * Generate the data point after the data has been processed by cropping\n * away unused points and optionally grouped in Highcharts Stock.\n */\n generatePoints: function() {\n var series = this,\n options = series.options,\n dataOptions = options.data,\n data = series.data,\n dataLength,\n processedXData = series.processedXData,\n processedYData = series.processedYData,\n PointClass = series.pointClass,\n processedDataLength = processedXData.length,\n cropStart = series.cropStart || 0,\n cursor,\n hasGroupedData = series.hasGroupedData,\n keys = options.keys,\n point,\n points = [],\n i;\n\n if (!data && !hasGroupedData) {\n var arr = [];\n arr.length = dataOptions.length;\n data = series.data = arr;\n }\n\n if (keys && hasGroupedData) {\n // grouped data has already applied keys (#6590)\n series.options.keys = false;\n }\n\n for (i = 0; i < processedDataLength; i++) {\n cursor = cropStart + i;\n if (!hasGroupedData) {\n point = data[cursor];\n if (!point && dataOptions[cursor] !== undefined) { // #970\n data[cursor] = point = (new PointClass()).init(\n series,\n dataOptions[cursor],\n processedXData[i]\n );\n }\n } else {\n // splat the y data in case of ohlc data array\n point = (new PointClass()).init(\n series, [processedXData[i]].concat(splat(processedYData[i]))\n );\n\n /**\n * Highstock only. If a point object is created by data\n * grouping, it doesn't reflect actual points in the raw data.\n * In this case, the `dataGroup` property holds information\n * that points back to the raw data.\n *\n * - `dataGroup.start` is the index of the first raw data point\n * in the group.\n * - `dataGroup.length` is the amount of points in the group.\n *\n * @name dataGroup\n * @memberOf Point\n * @type {Object}\n * \n */\n point.dataGroup = series.groupMap[i];\n }\n if (point) { // #6279\n point.index = cursor; // For faster access in Point.update\n points[i] = point;\n }\n }\n\n // restore keys options (#6590)\n series.options.keys = keys;\n\n // Hide cropped-away points - this only runs when the number of points\n // is above cropThreshold, or when swithching view from non-grouped\n // data to grouped data (#637)\n if (\n data &&\n (\n processedDataLength !== (dataLength = data.length) ||\n hasGroupedData\n )\n ) {\n for (i = 0; i < dataLength; i++) {\n // when has grouped data, clear all points\n if (i === cropStart && !hasGroupedData) {\n i += processedDataLength;\n }\n if (data[i]) {\n data[i].destroyElements();\n data[i].plotX = undefined; // #1003\n }\n }\n }\n\n series.data = data;\n series.points = points;\n },\n\n /**\n * Calculate Y extremes for visible data\n */\n getExtremes: function(yData) {\n var xAxis = this.xAxis,\n yAxis = this.yAxis,\n xData = this.processedXData,\n yDataLength,\n activeYData = [],\n activeCounter = 0,\n // #2117, need to compensate for log X axis\n xExtremes = xAxis.getExtremes(),\n xMin = xExtremes.min,\n xMax = xExtremes.max,\n validValue,\n withinRange,\n x,\n y,\n i,\n j;\n\n yData = yData || this.stackedYData || this.processedYData || [];\n yDataLength = yData.length;\n\n for (i = 0; i < yDataLength; i++) {\n\n x = xData[i];\n y = yData[i];\n\n // For points within the visible range, including the first point\n // outside the visible range, consider y extremes\n validValue =\n (isNumber(y, true) || isArray(y)) &&\n (!yAxis.positiveValuesOnly || (y.length || y > 0));\n withinRange =\n this.getExtremesFromAll ||\n this.options.getExtremesFromAll ||\n this.cropped ||\n ((xData[i] || x) >= xMin && (xData[i] || x) <= xMax);\n\n if (validValue && withinRange) {\n\n j = y.length;\n if (j) { // array, like ohlc or range data\n while (j--) {\n if (y[j] !== null) {\n activeYData[activeCounter++] = y[j];\n }\n }\n } else {\n activeYData[activeCounter++] = y;\n }\n }\n }\n\n this.dataMin = arrayMin(activeYData);\n this.dataMax = arrayMax(activeYData);\n },\n\n /**\n * Translate data points from raw data values to chart specific positioning\n * data needed later in drawPoints, drawGraph and drawTracker.\n *\n * @function #translate\n * @memberOf Series\n * @returns {void}\n */\n translate: function() {\n if (!this.processedXData) { // hidden series\n this.processData();\n }\n this.generatePoints();\n var series = this,\n options = series.options,\n stacking = options.stacking,\n xAxis = series.xAxis,\n categories = xAxis.categories,\n yAxis = series.yAxis,\n points = series.points,\n dataLength = points.length,\n hasModifyValue = !!series.modifyValue,\n i,\n pointPlacement = options.pointPlacement,\n dynamicallyPlaced =\n pointPlacement === 'between' ||\n isNumber(pointPlacement),\n threshold = options.threshold,\n stackThreshold = options.startFromThreshold ? threshold : 0,\n plotX,\n plotY,\n lastPlotX,\n stackIndicator,\n closestPointRangePx = Number.MAX_VALUE;\n\n // Point placement is relative to each series pointRange (#5889)\n if (pointPlacement === 'between') {\n pointPlacement = 0.5;\n }\n if (isNumber(pointPlacement)) {\n pointPlacement *= pick(options.pointRange || xAxis.pointRange);\n }\n\n // Translate each point\n for (i = 0; i < dataLength; i++) {\n var point = points[i],\n xValue = point.x,\n yValue = point.y,\n yBottom = point.low,\n stack = stacking && yAxis.stacks[(\n series.negStacks &&\n yValue < (stackThreshold ? 0 : threshold) ? '-' : ''\n ) + series.stackKey],\n pointStack,\n stackValues;\n\n // Discard disallowed y values for log axes (#3434)\n if (yAxis.positiveValuesOnly && yValue !== null && yValue <= 0) {\n point.isNull = true;\n }\n\n // Get the plotX translation\n point.plotX = plotX = correctFloat( // #5236\n Math.min(Math.max(-1e5, xAxis.translate(\n xValue,\n 0,\n 0,\n 0,\n 1,\n pointPlacement,\n this.type === 'flags'\n )), 1e5) // #3923\n );\n\n // Calculate the bottom y value for stacked series\n if (\n stacking &&\n series.visible &&\n !point.isNull &&\n stack &&\n stack[xValue]\n ) {\n stackIndicator = series.getStackIndicator(\n stackIndicator,\n xValue,\n series.index\n );\n pointStack = stack[xValue];\n stackValues = pointStack.points[stackIndicator.key];\n yBottom = stackValues[0];\n yValue = stackValues[1];\n\n if (\n yBottom === stackThreshold &&\n stackIndicator.key === stack[xValue].base\n ) {\n yBottom = pick(threshold, yAxis.min);\n }\n if (yAxis.positiveValuesOnly && yBottom <= 0) { // #1200, #1232\n yBottom = null;\n }\n\n point.total = point.stackTotal = pointStack.total;\n point.percentage =\n pointStack.total &&\n (point.y / pointStack.total * 100);\n point.stackY = yValue;\n\n // Place the stack label\n pointStack.setOffset(\n series.pointXOffset || 0,\n series.barW || 0\n );\n\n }\n\n // Set translated yBottom or remove it\n point.yBottom = defined(yBottom) ?\n yAxis.translate(yBottom, 0, 1, 0, 1) :\n null;\n\n // general hook, used for Highstock compare mode\n if (hasModifyValue) {\n yValue = series.modifyValue(yValue, point);\n }\n\n // Set the the plotY value, reset it for redraws\n point.plotY = plotY =\n (typeof yValue === 'number' && yValue !== Infinity) ?\n Math.min(Math.max(-1e5,\n yAxis.translate(yValue, 0, 1, 0, 1)), 1e5) : // #3201\n undefined;\n\n point.isInside =\n plotY !== undefined &&\n plotY >= 0 &&\n plotY <= yAxis.len && // #3519\n plotX >= 0 &&\n plotX <= xAxis.len;\n\n\n // Set client related positions for mouse tracking\n point.clientX = dynamicallyPlaced ?\n correctFloat(\n xAxis.translate(xValue, 0, 0, 0, 1, pointPlacement)\n ) :\n plotX; // #1514, #5383, #5518\n\n point.negative = point.y < (threshold || 0);\n\n // some API data\n point.category = categories && categories[point.x] !== undefined ?\n categories[point.x] : point.x;\n\n // Determine auto enabling of markers (#3635, #5099)\n if (!point.isNull) {\n if (lastPlotX !== undefined) {\n closestPointRangePx = Math.min(\n closestPointRangePx,\n Math.abs(plotX - lastPlotX)\n );\n }\n lastPlotX = plotX;\n }\n\n // Find point zone\n point.zone = this.zones.length && point.getZone();\n }\n series.closestPointRangePx = closestPointRangePx;\n },\n\n /**\n * Return the series points with null points filtered out\n */\n getValidPoints: function(points, insideOnly) {\n var chart = this.chart;\n // #3916, #5029, #5085\n return grep(points || this.points || [], function isValidPoint(point) {\n if (insideOnly && !chart.isInsidePlot(\n point.plotX,\n point.plotY,\n chart.inverted\n )) {\n return false;\n }\n return !point.isNull;\n });\n },\n\n /**\n * Set the clipping for the series. For animated series it is called twice,\n * first to initiate animating the clip then the second time without the\n * animation to set the final clip.\n */\n setClip: function(animation) {\n var chart = this.chart,\n options = this.options,\n renderer = chart.renderer,\n inverted = chart.inverted,\n seriesClipBox = this.clipBox,\n clipBox = seriesClipBox || chart.clipBox,\n sharedClipKey =\n this.sharedClipKey || [\n '_sharedClip',\n animation && animation.duration,\n animation && animation.easing,\n clipBox.height,\n options.xAxis,\n options.yAxis\n ].join(','), // #4526\n clipRect = chart[sharedClipKey],\n markerClipRect = chart[sharedClipKey + 'm'];\n\n // If a clipping rectangle with the same properties is currently present\n // in the chart, use that.\n if (!clipRect) {\n\n // When animation is set, prepare the initial positions\n if (animation) {\n clipBox.width = 0;\n\n chart[sharedClipKey + 'm'] = markerClipRect = renderer.clipRect(-99, // include the width of the first marker\n inverted ? -chart.plotLeft : -chart.plotTop,\n 99,\n inverted ? chart.chartWidth : chart.chartHeight\n );\n }\n chart[sharedClipKey] = clipRect = renderer.clipRect(clipBox);\n // Create hashmap for series indexes\n clipRect.count = {\n length: 0\n };\n\n }\n if (animation) {\n if (!clipRect.count[this.index]) {\n clipRect.count[this.index] = true;\n clipRect.count.length += 1;\n }\n }\n\n if (options.clip !== false) {\n this.group.clip(animation || seriesClipBox ? clipRect : chart.clipRect);\n this.markerGroup.clip(markerClipRect);\n this.sharedClipKey = sharedClipKey;\n }\n\n // Remove the shared clipping rectangle when all series are shown\n if (!animation) {\n if (clipRect.count[this.index]) {\n delete clipRect.count[this.index];\n clipRect.count.length -= 1;\n }\n\n if (clipRect.count.length === 0 && sharedClipKey && chart[sharedClipKey]) {\n if (!seriesClipBox) {\n chart[sharedClipKey] = chart[sharedClipKey].destroy();\n }\n if (chart[sharedClipKey + 'm']) {\n chart[sharedClipKey + 'm'] = chart[sharedClipKey + 'm'].destroy();\n }\n }\n }\n },\n\n /**\n * Animate in the series\n */\n animate: function(init) {\n var series = this,\n chart = series.chart,\n clipRect,\n animation = animObject(series.options.animation),\n sharedClipKey;\n\n // Initialize the animation. Set up the clipping rectangle.\n if (init) {\n\n series.setClip(animation);\n\n // Run the animation\n } else {\n sharedClipKey = this.sharedClipKey;\n clipRect = chart[sharedClipKey];\n if (clipRect) {\n clipRect.animate({\n width: chart.plotSizeX\n }, animation);\n }\n if (chart[sharedClipKey + 'm']) {\n chart[sharedClipKey + 'm'].animate({\n width: chart.plotSizeX + 99\n }, animation);\n }\n\n // Delete this function to allow it only once\n series.animate = null;\n\n }\n },\n\n /**\n * This runs after animation to land on the final plot clipping\n */\n afterAnimate: function() {\n this.setClip();\n fireEvent(this, 'afterAnimate');\n },\n\n /**\n * Draw the markers.\n *\n * @function #drawPoints\n * @memberOf Series\n * @returns {void}\n */\n drawPoints: function() {\n var series = this,\n points = series.points,\n chart = series.chart,\n plotY,\n i,\n point,\n symbol,\n graphic,\n options = series.options,\n seriesMarkerOptions = options.marker,\n pointMarkerOptions,\n hasPointMarker,\n enabled,\n isInside,\n markerGroup = series[series.specialGroup] || series.markerGroup,\n xAxis = series.xAxis,\n markerAttribs,\n globallyEnabled = pick(\n seriesMarkerOptions.enabled,\n xAxis.isRadial ? true : null,\n // Use larger or equal as radius is null in bubbles (#6321)\n series.closestPointRangePx >= 2 * seriesMarkerOptions.radius\n );\n\n if (seriesMarkerOptions.enabled !== false || series._hasPointMarkers) {\n\n for (i = 0; i < points.length; i++) {\n point = points[i];\n plotY = point.plotY;\n graphic = point.graphic;\n pointMarkerOptions = point.marker || {};\n hasPointMarker = !!point.marker;\n enabled = (globallyEnabled && pointMarkerOptions.enabled === undefined) || pointMarkerOptions.enabled;\n isInside = point.isInside;\n\n // only draw the point if y is defined\n if (enabled && isNumber(plotY) && point.y !== null) {\n\n // Shortcuts\n symbol = pick(pointMarkerOptions.symbol, series.symbol);\n point.hasImage = symbol.indexOf('url') === 0;\n\n markerAttribs = series.markerAttribs(\n point,\n point.selected && 'select'\n );\n\n if (graphic) { // update\n graphic[isInside ? 'show' : 'hide'](true) // Since the marker group isn't clipped, each individual marker must be toggled\n .animate(markerAttribs);\n } else if (isInside && (markerAttribs.width > 0 || point.hasImage)) {\n point.graphic = graphic = chart.renderer.symbol(\n symbol,\n markerAttribs.x,\n markerAttribs.y,\n markerAttribs.width,\n markerAttribs.height,\n hasPointMarker ? pointMarkerOptions : seriesMarkerOptions\n )\n .add(markerGroup);\n }\n\n\n // Presentational attributes\n if (graphic) {\n graphic.attr(series.pointAttribs(point, point.selected && 'select'));\n }\n\n\n if (graphic) {\n graphic.addClass(point.getClassName(), true);\n }\n\n } else if (graphic) {\n point.graphic = graphic.destroy(); // #1269\n }\n }\n }\n\n },\n\n /**\n * Get non-presentational attributes for the point.\n */\n markerAttribs: function(point, state) {\n var seriesMarkerOptions = this.options.marker,\n seriesStateOptions,\n pointMarkerOptions = point.marker || {},\n pointStateOptions,\n radius = pick(\n pointMarkerOptions.radius,\n seriesMarkerOptions.radius\n ),\n attribs;\n\n // Handle hover and select states\n if (state) {\n seriesStateOptions = seriesMarkerOptions.states[state];\n pointStateOptions = pointMarkerOptions.states &&\n pointMarkerOptions.states[state];\n\n radius = pick(\n pointStateOptions && pointStateOptions.radius,\n seriesStateOptions && seriesStateOptions.radius,\n radius + (seriesStateOptions && seriesStateOptions.radiusPlus || 0)\n );\n }\n\n if (point.hasImage) {\n radius = 0; // and subsequently width and height is not set\n }\n\n attribs = {\n x: Math.floor(point.plotX) - radius, // Math.floor for #1843\n y: point.plotY - radius\n };\n\n if (radius) {\n attribs.width = attribs.height = 2 * radius;\n }\n\n return attribs;\n\n },\n\n\n /**\n * Get presentational attributes for marker-based series (line, spline, scatter, bubble, mappoint...)\n */\n pointAttribs: function(point, state) {\n var seriesMarkerOptions = this.options.marker,\n seriesStateOptions,\n pointOptions = point && point.options,\n pointMarkerOptions = (pointOptions && pointOptions.marker) || {},\n pointStateOptions,\n color = this.color,\n pointColorOption = pointOptions && pointOptions.color,\n pointColor = point && point.color,\n strokeWidth = pick(\n pointMarkerOptions.lineWidth,\n seriesMarkerOptions.lineWidth\n ),\n zoneColor = point && point.zone && point.zone.color,\n fill,\n stroke;\n\n color = pointColorOption || zoneColor || pointColor || color;\n fill = pointMarkerOptions.fillColor || seriesMarkerOptions.fillColor || color;\n stroke = pointMarkerOptions.lineColor || seriesMarkerOptions.lineColor || color;\n\n // Handle hover and select states\n if (state) {\n seriesStateOptions = seriesMarkerOptions.states[state];\n pointStateOptions = (pointMarkerOptions.states && pointMarkerOptions.states[state]) || {};\n strokeWidth = pick(\n pointStateOptions.lineWidth,\n seriesStateOptions.lineWidth,\n strokeWidth + pick(\n pointStateOptions.lineWidthPlus,\n seriesStateOptions.lineWidthPlus,\n 0\n )\n );\n fill = pointStateOptions.fillColor || seriesStateOptions.fillColor || fill;\n stroke = pointStateOptions.lineColor || seriesStateOptions.lineColor || stroke;\n }\n\n return {\n 'stroke': stroke,\n 'stroke-width': strokeWidth,\n 'fill': fill\n };\n },\n\n /**\n * Clear DOM objects and free up memory\n */\n destroy: function() {\n var series = this,\n chart = series.chart,\n issue134 = /AppleWebKit\\/533/.test(win.navigator.userAgent),\n destroy,\n i,\n data = series.data || [],\n point,\n axis;\n\n // add event hook\n fireEvent(series, 'destroy');\n\n // remove all events\n removeEvent(series);\n\n // erase from axes\n each(series.axisTypes || [], function(AXIS) {\n axis = series[AXIS];\n if (axis && axis.series) {\n erase(axis.series, series);\n axis.isDirty = axis.forceRedraw = true;\n }\n });\n\n // remove legend items\n if (series.legendItem) {\n series.chart.legend.destroyItem(series);\n }\n\n // destroy all points with their elements\n i = data.length;\n while (i--) {\n point = data[i];\n if (point && point.destroy) {\n point.destroy();\n }\n }\n series.points = null;\n\n // Clear the animation timeout if we are destroying the series during initial animation\n clearTimeout(series.animationTimeout);\n\n // Destroy all SVGElements associated to the series\n objectEach(series, function(val, prop) {\n if (val instanceof SVGElement && !val.survive) { // Survive provides a hook for not destroying\n\n // issue 134 workaround\n destroy = issue134 && prop === 'group' ?\n 'hide' :\n 'destroy';\n\n val[destroy]();\n }\n });\n\n // remove from hoverSeries\n if (chart.hoverSeries === series) {\n chart.hoverSeries = null;\n }\n erase(chart.series, series);\n chart.orderSeries();\n\n // clear all members\n objectEach(series, function(val, prop) {\n delete series[prop];\n });\n },\n\n /**\n * Get the graph path\n */\n getGraphPath: function(points, nullsAsZeroes, connectCliffs) {\n var series = this,\n options = series.options,\n step = options.step,\n reversed,\n graphPath = [],\n xMap = [],\n gap;\n\n points = points || series.points;\n\n // Bottom of a stack is reversed\n reversed = points.reversed;\n if (reversed) {\n points.reverse();\n }\n // Reverse the steps (#5004)\n step = {\n right: 1,\n center: 2\n }[step] || (step && 3);\n if (step && reversed) {\n step = 4 - step;\n }\n\n // Remove invalid points, especially in spline (#5015)\n if (options.connectNulls && !nullsAsZeroes && !connectCliffs) {\n points = this.getValidPoints(points);\n }\n\n // Build the line\n each(points, function(point, i) {\n\n var plotX = point.plotX,\n plotY = point.plotY,\n lastPoint = points[i - 1],\n pathToPoint; // the path to this point from the previous\n\n if ((point.leftCliff || (lastPoint && lastPoint.rightCliff)) && !connectCliffs) {\n gap = true; // ... and continue\n }\n\n // Line series, nullsAsZeroes is not handled\n if (point.isNull && !defined(nullsAsZeroes) && i > 0) {\n gap = !options.connectNulls;\n\n // Area series, nullsAsZeroes is set\n } else if (point.isNull && !nullsAsZeroes) {\n gap = true;\n\n } else {\n\n if (i === 0 || gap) {\n pathToPoint = ['M', point.plotX, point.plotY];\n\n } else if (series.getPointSpline) { // generate the spline as defined in the SplineSeries object\n\n pathToPoint = series.getPointSpline(points, point, i);\n\n } else if (step) {\n\n if (step === 1) { // right\n pathToPoint = [\n 'L',\n lastPoint.plotX,\n plotY\n ];\n\n } else if (step === 2) { // center\n pathToPoint = [\n 'L',\n (lastPoint.plotX + plotX) / 2,\n lastPoint.plotY,\n 'L',\n (lastPoint.plotX + plotX) / 2,\n plotY\n ];\n\n } else {\n pathToPoint = [\n 'L',\n plotX,\n lastPoint.plotY\n ];\n }\n pathToPoint.push('L', plotX, plotY);\n\n } else {\n // normal line to next point\n pathToPoint = [\n 'L',\n plotX,\n plotY\n ];\n }\n\n // Prepare for animation. When step is enabled, there are two path nodes for each x value.\n xMap.push(point.x);\n if (step) {\n xMap.push(point.x);\n }\n\n graphPath.push.apply(graphPath, pathToPoint);\n gap = false;\n }\n });\n\n graphPath.xMap = xMap;\n series.graphPath = graphPath;\n\n return graphPath;\n\n },\n\n /**\n * Draw the actual graph\n */\n drawGraph: function() {\n var series = this,\n options = this.options,\n graphPath = (this.gappedPath || this.getGraphPath).call(this),\n props = [\n [\n 'graph',\n 'highcharts-graph',\n\n options.lineColor || this.color,\n options.dashStyle\n\n ]\n ];\n\n // Add the zone properties if any\n each(this.zones, function(zone, i) {\n props.push([\n 'zone-graph-' + i,\n 'highcharts-graph highcharts-zone-graph-' + i + ' ' + (zone.className || ''),\n\n zone.color || series.color,\n zone.dashStyle || options.dashStyle\n\n ]);\n });\n\n // Draw the graph\n each(props, function(prop, i) {\n var graphKey = prop[0],\n graph = series[graphKey],\n attribs;\n\n if (graph) {\n graph.endX = graphPath.xMap;\n graph.animate({\n d: graphPath\n });\n\n } else if (graphPath.length) { // #1487\n\n series[graphKey] = series.chart.renderer.path(graphPath)\n .addClass(prop[1])\n .attr({\n zIndex: 1\n }) // #1069\n .add(series.group);\n\n\n attribs = {\n 'stroke': prop[2],\n 'stroke-width': options.lineWidth,\n 'fill': (series.fillGraph && series.color) || 'none' // Polygon series use filled graph\n };\n\n if (prop[3]) {\n attribs.dashstyle = prop[3];\n } else if (options.linecap !== 'square') {\n attribs['stroke-linecap'] = attribs['stroke-linejoin'] = 'round';\n }\n\n graph = series[graphKey]\n .attr(attribs)\n .shadow((i < 2) && options.shadow); // add shadow to normal series (0) or to first zone (1) #3932\n\n }\n\n // Helpers for animation\n if (graph) {\n graph.startX = graphPath.xMap;\n //graph.shiftUnit = options.step ? 2 : 1;\n graph.isArea = graphPath.isArea; // For arearange animation\n }\n });\n },\n\n /**\n * Clip the graphs into the positive and negative coloured graphs\n */\n applyZones: function() {\n var series = this,\n chart = this.chart,\n renderer = chart.renderer,\n zones = this.zones,\n translatedFrom,\n translatedTo,\n clips = this.clips || [],\n clipAttr,\n graph = this.graph,\n area = this.area,\n chartSizeMax = Math.max(chart.chartWidth, chart.chartHeight),\n axis = this[(this.zoneAxis || 'y') + 'Axis'],\n extremes,\n reversed,\n inverted = chart.inverted,\n horiz,\n pxRange,\n pxPosMin,\n pxPosMax,\n ignoreZones = false;\n\n if (zones.length && (graph || area) && axis && axis.min !== undefined) {\n reversed = axis.reversed;\n horiz = axis.horiz;\n // The use of the Color Threshold assumes there are no gaps\n // so it is safe to hide the original graph and area\n if (graph) {\n graph.hide();\n }\n if (area) {\n area.hide();\n }\n\n // Create the clips\n extremes = axis.getExtremes();\n each(zones, function(threshold, i) {\n\n translatedFrom = reversed ?\n (horiz ? chart.plotWidth : 0) :\n (horiz ? 0 : axis.toPixels(extremes.min));\n translatedFrom = Math.min(Math.max(pick(translatedTo, translatedFrom), 0), chartSizeMax);\n translatedTo = Math.min(Math.max(Math.round(axis.toPixels(pick(threshold.value, extremes.max), true)), 0), chartSizeMax);\n\n if (ignoreZones) {\n translatedFrom = translatedTo = axis.toPixels(extremes.max);\n }\n\n pxRange = Math.abs(translatedFrom - translatedTo);\n pxPosMin = Math.min(translatedFrom, translatedTo);\n pxPosMax = Math.max(translatedFrom, translatedTo);\n if (axis.isXAxis) {\n clipAttr = {\n x: inverted ? pxPosMax : pxPosMin,\n y: 0,\n width: pxRange,\n height: chartSizeMax\n };\n if (!horiz) {\n clipAttr.x = chart.plotHeight - clipAttr.x;\n }\n } else {\n clipAttr = {\n x: 0,\n y: inverted ? pxPosMax : pxPosMin,\n width: chartSizeMax,\n height: pxRange\n };\n if (horiz) {\n clipAttr.y = chart.plotWidth - clipAttr.y;\n }\n }\n\n\n /// VML SUPPPORT\n if (inverted && renderer.isVML) {\n if (axis.isXAxis) {\n clipAttr = {\n x: 0,\n y: reversed ? pxPosMin : pxPosMax,\n height: clipAttr.width,\n width: chart.chartWidth\n };\n } else {\n clipAttr = {\n x: clipAttr.y - chart.plotLeft - chart.spacingBox.x,\n y: 0,\n width: clipAttr.height,\n height: chart.chartHeight\n };\n }\n }\n /// END OF VML SUPPORT\n\n\n if (clips[i]) {\n clips[i].animate(clipAttr);\n } else {\n clips[i] = renderer.clipRect(clipAttr);\n\n if (graph) {\n series['zone-graph-' + i].clip(clips[i]);\n }\n\n if (area) {\n series['zone-area-' + i].clip(clips[i]);\n }\n }\n // if this zone extends out of the axis, ignore the others\n ignoreZones = threshold.value > extremes.max;\n });\n this.clips = clips;\n }\n },\n\n /**\n * Initialize and perform group inversion on series.group and series.markerGroup\n */\n invertGroups: function(inverted) {\n var series = this,\n chart = series.chart,\n remover;\n\n function setInvert() {\n each(['group', 'markerGroup'], function(groupName) {\n if (series[groupName]) {\n\n // VML/HTML needs explicit attributes for flipping\n if (chart.renderer.isVML) {\n series[groupName].attr({\n width: series.yAxis.len,\n height: series.xAxis.len\n });\n }\n\n series[groupName].width = series.yAxis.len;\n series[groupName].height = series.xAxis.len;\n series[groupName].invert(inverted);\n }\n });\n }\n\n // Pie, go away (#1736)\n if (!series.xAxis) {\n return;\n }\n\n // A fixed size is needed for inversion to work\n remover = addEvent(chart, 'resize', setInvert);\n addEvent(series, 'destroy', remover);\n\n // Do it now\n setInvert(inverted); // do it now\n\n // On subsequent render and redraw, just do setInvert without setting up events again\n series.invertGroups = setInvert;\n },\n\n /**\n * General abstraction for creating plot groups like series.group,\n * series.dataLabelsGroup and series.markerGroup. On subsequent calls, the\n * group will only be adjusted to the updated plot size.\n */\n plotGroup: function(prop, name, visibility, zIndex, parent) {\n var group = this[prop],\n isNew = !group;\n\n // Generate it on first call\n if (isNew) {\n this[prop] = group = this.chart.renderer.g()\n .attr({\n zIndex: zIndex || 0.1 // IE8 and pointer logic use this\n })\n .add(parent);\n\n }\n\n // Add the class names, and replace existing ones as response to\n // Series.update (#6660)\n group.addClass(\n (\n 'highcharts-' + name +\n ' highcharts-series-' + this.index +\n ' highcharts-' + this.type + '-series ' +\n 'highcharts-color-' + this.colorIndex + ' ' +\n (this.options.className || '')\n ),\n true\n );\n\n // Place it on first and subsequent (redraw) calls\n group.attr({\n visibility: visibility\n })[isNew ? 'attr' : 'animate'](\n this.getPlotBox()\n );\n return group;\n },\n\n /**\n * Get the translation and scale for the plot area of this series\n */\n getPlotBox: function() {\n var chart = this.chart,\n xAxis = this.xAxis,\n yAxis = this.yAxis;\n\n // Swap axes for inverted (#2339)\n if (chart.inverted) {\n xAxis = yAxis;\n yAxis = this.xAxis;\n }\n return {\n translateX: xAxis ? xAxis.left : chart.plotLeft,\n translateY: yAxis ? yAxis.top : chart.plotTop,\n scaleX: 1, // #1623\n scaleY: 1\n };\n },\n\n /**\n * Render the graph and markers\n */\n render: function() {\n var series = this,\n chart = series.chart,\n group,\n options = series.options,\n // Animation doesn't work in IE8 quirks when the group div is\n // hidden, and looks bad in other oldIE\n animDuration = (!!series.animate &&\n chart.renderer.isSVG &&\n animObject(options.animation).duration\n ),\n visibility = series.visible ? 'inherit' : 'hidden', // #2597\n zIndex = options.zIndex,\n hasRendered = series.hasRendered,\n chartSeriesGroup = chart.seriesGroup,\n inverted = chart.inverted;\n\n // the group\n group = series.plotGroup(\n 'group',\n 'series',\n visibility,\n zIndex,\n chartSeriesGroup\n );\n\n series.markerGroup = series.plotGroup(\n 'markerGroup',\n 'markers',\n visibility,\n zIndex,\n chartSeriesGroup\n );\n\n // initiate the animation\n if (animDuration) {\n series.animate(true);\n }\n\n // SVGRenderer needs to know this before drawing elements (#1089, #1795)\n group.inverted = series.isCartesian ? inverted : false;\n\n // draw the graph if any\n if (series.drawGraph) {\n series.drawGraph();\n series.applyZones();\n }\n\n /* each(series.points, function (point) {\n if (point.redraw) {\n point.redraw();\n }\n });*/\n\n // draw the data labels (inn pies they go before the points)\n if (series.drawDataLabels) {\n series.drawDataLabels();\n }\n\n // draw the points\n if (series.visible) {\n series.drawPoints();\n }\n\n\n // draw the mouse tracking area\n if (\n series.drawTracker &&\n series.options.enableMouseTracking !== false\n ) {\n series.drawTracker();\n }\n\n // Handle inverted series and tracker groups\n series.invertGroups(inverted);\n\n // Initial clipping, must be defined after inverting groups for VML.\n // Applies to columns etc. (#3839).\n if (options.clip !== false && !series.sharedClipKey && !hasRendered) {\n group.clip(chart.clipRect);\n }\n\n // Run the animation\n if (animDuration) {\n series.animate();\n }\n\n // Call the afterAnimate function on animation complete (but don't\n // overwrite the animation.complete option which should be available to\n // the user).\n if (!hasRendered) {\n series.animationTimeout = syncTimeout(function() {\n series.afterAnimate();\n }, animDuration);\n }\n\n series.isDirty = false; // means data is in accordance with what you see\n // (See #322) series.isDirty = series.isDirtyData = false; // means\n // data is in accordance with what you see\n series.hasRendered = true;\n },\n\n /**\n * Redraw the series after an update in the axes.\n */\n redraw: function() {\n var series = this,\n chart = series.chart,\n // cache it here as it is set to false in render, but used after\n wasDirty = series.isDirty || series.isDirtyData,\n group = series.group,\n xAxis = series.xAxis,\n yAxis = series.yAxis;\n\n // reposition on resize\n if (group) {\n if (chart.inverted) {\n group.attr({\n width: chart.plotWidth,\n height: chart.plotHeight\n });\n }\n\n group.animate({\n translateX: pick(xAxis && xAxis.left, chart.plotLeft),\n translateY: pick(yAxis && yAxis.top, chart.plotTop)\n });\n }\n\n series.translate();\n series.render();\n if (wasDirty) { // #3868, #3945\n delete this.kdTree;\n }\n },\n\n /**\n * KD Tree && PointSearching Implementation\n */\n\n kdAxisArray: ['clientX', 'plotY'],\n\n searchPoint: function(e, compareX) {\n var series = this,\n xAxis = series.xAxis,\n yAxis = series.yAxis,\n inverted = series.chart.inverted;\n\n return this.searchKDTree({\n clientX: inverted ?\n xAxis.len - e.chartY + xAxis.pos : e.chartX - xAxis.pos,\n plotY: inverted ?\n yAxis.len - e.chartX + yAxis.pos : e.chartY - yAxis.pos\n }, compareX);\n },\n\n /**\n * Build the k-d-tree that is used by mouse and touch interaction to get the\n * closest point. Line-like series typically have a one-dimensional tree \n * where points are searched along the X axis, while scatter-like series\n * typically search in two dimensions, X and Y.\n */\n buildKDTree: function() {\n\n // Prevent multiple k-d-trees from being built simultaneously (#6235)\n this.buildingKdTree = true;\n\n var series = this,\n dimensions = series.options.findNearestPointBy.indexOf('y') > -1 ?\n 2 : 1;\n\n // Internal function\n function _kdtree(points, depth, dimensions) {\n var axis,\n median,\n length = points && points.length;\n\n if (length) {\n\n // alternate between the axis\n axis = series.kdAxisArray[depth % dimensions];\n\n // sort point array\n points.sort(function(a, b) {\n return a[axis] - b[axis];\n });\n\n median = Math.floor(length / 2);\n\n // build and return nod\n return {\n point: points[median],\n left: _kdtree(\n points.slice(0, median), depth + 1, dimensions\n ),\n right: _kdtree(\n points.slice(median + 1), depth + 1, dimensions\n )\n };\n\n }\n }\n\n // Start the recursive build process with a clone of the points array\n // and null points filtered out (#3873)\n function startRecursive() {\n series.kdTree = _kdtree(\n series.getValidPoints(\n null,\n // For line-type series restrict to plot area, but\n // column-type series not (#3916, #4511)\n !series.directTouch\n ),\n dimensions,\n dimensions\n );\n series.buildingKdTree = false;\n }\n delete series.kdTree;\n\n // For testing tooltips, don't build async\n syncTimeout(startRecursive, series.options.kdNow ? 0 : 1);\n },\n\n searchKDTree: function(point, compareX) {\n var series = this,\n kdX = this.kdAxisArray[0],\n kdY = this.kdAxisArray[1],\n kdComparer = compareX ? 'distX' : 'dist',\n kdDimensions = series.options.findNearestPointBy.indexOf('y') > -1 ?\n 2 : 1;\n\n // Set the one and two dimensional distance on the point object\n function setDistance(p1, p2) {\n var x = (defined(p1[kdX]) && defined(p2[kdX])) ?\n Math.pow(p1[kdX] - p2[kdX], 2) :\n null,\n y = (defined(p1[kdY]) && defined(p2[kdY])) ?\n Math.pow(p1[kdY] - p2[kdY], 2) :\n null,\n r = (x || 0) + (y || 0);\n\n p2.dist = defined(r) ? Math.sqrt(r) : Number.MAX_VALUE;\n p2.distX = defined(x) ? Math.sqrt(x) : Number.MAX_VALUE;\n }\n\n function _search(search, tree, depth, dimensions) {\n var point = tree.point,\n axis = series.kdAxisArray[depth % dimensions],\n tdist,\n sideA,\n sideB,\n ret = point,\n nPoint1,\n nPoint2;\n\n setDistance(search, point);\n\n // Pick side based on distance to splitting point\n tdist = search[axis] - point[axis];\n sideA = tdist < 0 ? 'left' : 'right';\n sideB = tdist < 0 ? 'right' : 'left';\n\n // End of tree\n if (tree[sideA]) {\n nPoint1 = _search(search, tree[sideA], depth + 1, dimensions);\n\n ret = (nPoint1[kdComparer] < ret[kdComparer] ? nPoint1 : point);\n }\n if (tree[sideB]) {\n // compare distance to current best to splitting point to decide\n // wether to check side B or not\n if (Math.sqrt(tdist * tdist) < ret[kdComparer]) {\n nPoint2 = _search(\n search,\n tree[sideB],\n depth + 1,\n dimensions\n );\n ret = nPoint2[kdComparer] < ret[kdComparer] ?\n nPoint2 :\n ret;\n }\n }\n\n return ret;\n }\n\n if (!this.kdTree && !this.buildingKdTree) {\n this.buildKDTree();\n }\n\n if (this.kdTree) {\n return _search(point, this.kdTree, kdDimensions, kdDimensions);\n }\n }\n\n }); // end Series prototype\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var Axis = H.Axis,\n Chart = H.Chart,\n correctFloat = H.correctFloat,\n defined = H.defined,\n destroyObjectProperties = H.destroyObjectProperties,\n each = H.each,\n format = H.format,\n objectEach = H.objectEach,\n pick = H.pick,\n Series = H.Series;\n\n /**\n * The class for stacks. Each stack, on a specific X value and either negative\n * or positive, has its own stack item.\n *\n * @class\n */\n function StackItem(axis, options, isNegative, x, stackOption) {\n\n var inverted = axis.chart.inverted;\n\n this.axis = axis;\n\n // Tells if the stack is negative\n this.isNegative = isNegative;\n\n // Save the options to be able to style the label\n this.options = options;\n\n // Save the x value to be able to position the label later\n this.x = x;\n\n // Initialize total value\n this.total = null;\n\n // This will keep each points' extremes stored by series.index and point \n // index\n this.points = {};\n\n // Save the stack option on the series configuration object, and whether to \n // treat it as percent\n this.stack = stackOption;\n this.leftCliff = 0;\n this.rightCliff = 0;\n\n // The align options and text align varies on whether the stack is negative \n // and if the chart is inverted or not.\n // First test the user supplied value, then use the dynamic.\n this.alignOptions = {\n align: options.align ||\n (inverted ? (isNegative ? 'left' : 'right') : 'center'),\n verticalAlign: options.verticalAlign ||\n (inverted ? 'middle' : (isNegative ? 'bottom' : 'top')),\n y: pick(options.y, inverted ? 4 : (isNegative ? 14 : -6)),\n x: pick(options.x, inverted ? (isNegative ? -6 : 6) : 0)\n };\n\n this.textAlign = options.textAlign ||\n (inverted ? (isNegative ? 'right' : 'left') : 'center');\n }\n\n StackItem.prototype = {\n destroy: function() {\n destroyObjectProperties(this, this.axis);\n },\n\n /**\n * Renders the stack total label and adds it to the stack label group.\n */\n render: function(group) {\n var options = this.options,\n formatOption = options.format,\n str = formatOption ?\n format(formatOption, this) :\n options.formatter.call(this); // format the text in the label\n\n // Change the text to reflect the new total and set visibility to hidden\n // in case the serie is hidden\n if (this.label) {\n this.label.attr({\n text: str,\n visibility: 'hidden'\n });\n // Create new label\n } else {\n this.label =\n this.axis.chart.renderer.text(str, null, null, options.useHTML)\n .css(options.style)\n .attr({\n align: this.textAlign,\n rotation: options.rotation,\n visibility: 'hidden' // hidden until setOffset is called\n })\n .add(group); // add to the labels-group\n }\n },\n\n /**\n * Sets the offset that the stack has from the x value and repositions the\n * label.\n */\n setOffset: function(xOffset, xWidth) {\n var stackItem = this,\n axis = stackItem.axis,\n chart = axis.chart,\n inverted = chart.inverted,\n reversed = axis.reversed,\n neg = (this.isNegative && !reversed) ||\n (!this.isNegative && reversed), // #4056\n // stack value translated mapped to chart coordinates\n y = axis.translate(\n axis.usePercentage ? 100 : this.total,\n 0,\n 0,\n 0,\n 1\n ),\n yZero = axis.translate(0), // stack origin\n h = Math.abs(y - yZero), // stack height\n x = chart.xAxis[0].translate(this.x) + xOffset, // stack x position\n plotHeight = chart.plotHeight,\n stackBox = { // this is the box for the complete stack\n x: inverted ? (neg ? y : y - h) : x,\n y: inverted ?\n plotHeight - x - xWidth : (neg ? (plotHeight - y - h) :\n plotHeight - y),\n width: inverted ? h : xWidth,\n height: inverted ? xWidth : h\n },\n label = this.label,\n alignAttr;\n\n if (label) {\n // Align the label to the box\n label.align(this.alignOptions, null, stackBox);\n\n // Set visibility (#678)\n alignAttr = label.alignAttr;\n label[\n this.options.crop === false || chart.isInsidePlot(\n alignAttr.x,\n alignAttr.y\n ) ? 'show' : 'hide'](true);\n }\n }\n };\n\n /**\n * Generate stacks for each series and calculate stacks total values\n */\n Chart.prototype.getStacks = function() {\n var chart = this;\n\n // reset stacks for each yAxis\n each(chart.yAxis, function(axis) {\n if (axis.stacks && axis.hasVisibleSeries) {\n axis.oldStacks = axis.stacks;\n }\n });\n\n each(chart.series, function(series) {\n if (series.options.stacking && (series.visible === true ||\n chart.options.chart.ignoreHiddenSeries === false)) {\n series.stackKey = series.type + pick(series.options.stack, '');\n }\n });\n };\n\n\n // Stacking methods defined on the Axis prototype\n\n /**\n * Build the stacks from top down\n */\n Axis.prototype.buildStacks = function() {\n var axisSeries = this.series,\n series,\n reversedStacks = pick(this.options.reversedStacks, true),\n len = axisSeries.length,\n i;\n if (!this.isXAxis) {\n this.usePercentage = false;\n i = len;\n while (i--) {\n axisSeries[reversedStacks ? i : len - i - 1].setStackedPoints();\n }\n\n i = len;\n while (i--) {\n series = axisSeries[reversedStacks ? i : len - i - 1];\n if (series.setStackCliffs) {\n series.setStackCliffs();\n }\n }\n // Loop up again to compute percent stack\n if (this.usePercentage) {\n for (i = 0; i < len; i++) {\n axisSeries[i].setPercentStacks();\n }\n }\n }\n };\n\n Axis.prototype.renderStackTotals = function() {\n var axis = this,\n chart = axis.chart,\n renderer = chart.renderer,\n stacks = axis.stacks,\n stackTotalGroup = axis.stackTotalGroup;\n\n // Create a separate group for the stack total labels\n if (!stackTotalGroup) {\n axis.stackTotalGroup = stackTotalGroup =\n renderer.g('stack-labels')\n .attr({\n visibility: 'visible',\n zIndex: 6\n })\n .add();\n }\n\n // plotLeft/Top will change when y axis gets wider so we need to translate\n // the stackTotalGroup at every render call. See bug #506 and #516\n stackTotalGroup.translate(chart.plotLeft, chart.plotTop);\n\n // Render each stack total\n objectEach(stacks, function(type) {\n objectEach(type, function(stack) {\n stack.render(stackTotalGroup);\n });\n });\n };\n\n /**\n * Set all the stacks to initial states and destroy unused ones.\n */\n Axis.prototype.resetStacks = function() {\n var axis = this,\n stacks = axis.stacks;\n if (!axis.isXAxis) {\n objectEach(stacks, function(type) {\n objectEach(type, function(stack, key) {\n // Clean up memory after point deletion (#1044, #4320)\n if (stack.touched < axis.stacksTouched) {\n stack.destroy();\n delete type[key];\n\n // Reset stacks\n } else {\n stack.total = null;\n stack.cum = null;\n }\n });\n });\n }\n };\n\n Axis.prototype.cleanStacks = function() {\n var stacks;\n\n if (!this.isXAxis) {\n if (this.oldStacks) {\n stacks = this.stacks = this.oldStacks;\n }\n\n // reset stacks\n objectEach(stacks, function(type) {\n objectEach(type, function(stack) {\n stack.cum = stack.total;\n });\n });\n }\n };\n\n\n // Stacking methods defnied for Series prototype\n\n /**\n * Adds series' points value to corresponding stack\n */\n Series.prototype.setStackedPoints = function() {\n if (!this.options.stacking || (this.visible !== true &&\n this.chart.options.chart.ignoreHiddenSeries !== false)) {\n return;\n }\n\n var series = this,\n xData = series.processedXData,\n yData = series.processedYData,\n stackedYData = [],\n yDataLength = yData.length,\n seriesOptions = series.options,\n threshold = seriesOptions.threshold,\n stackThreshold = seriesOptions.startFromThreshold ? threshold : 0,\n stackOption = seriesOptions.stack,\n stacking = seriesOptions.stacking,\n stackKey = series.stackKey,\n negKey = '-' + stackKey,\n negStacks = series.negStacks,\n yAxis = series.yAxis,\n stacks = yAxis.stacks,\n oldStacks = yAxis.oldStacks,\n stackIndicator,\n isNegative,\n stack,\n other,\n key,\n pointKey,\n i,\n x,\n y;\n\n\n yAxis.stacksTouched += 1;\n\n // loop over the non-null y values and read them into a local array\n for (i = 0; i < yDataLength; i++) {\n x = xData[i];\n y = yData[i];\n stackIndicator = series.getStackIndicator(\n stackIndicator,\n x,\n series.index\n );\n pointKey = stackIndicator.key;\n // Read stacked values into a stack based on the x value,\n // the sign of y and the stack key. Stacking is also handled for null\n // values (#739)\n isNegative = negStacks && y < (stackThreshold ? 0 : threshold);\n key = isNegative ? negKey : stackKey;\n\n // Create empty object for this stack if it doesn't exist yet\n if (!stacks[key]) {\n stacks[key] = {};\n }\n\n // Initialize StackItem for this x\n if (!stacks[key][x]) {\n if (oldStacks[key] && oldStacks[key][x]) {\n stacks[key][x] = oldStacks[key][x];\n stacks[key][x].total = null;\n } else {\n stacks[key][x] = new StackItem(\n yAxis,\n yAxis.options.stackLabels,\n isNegative,\n x,\n stackOption\n );\n }\n }\n\n // If the StackItem doesn't exist, create it first\n stack = stacks[key][x];\n if (y !== null) {\n stack.points[pointKey] = stack.points[series.index] = [pick(stack.cum, stackThreshold)];\n\n // Record the base of the stack\n if (!defined(stack.cum)) {\n stack.base = pointKey;\n }\n stack.touched = yAxis.stacksTouched;\n\n\n // In area charts, if there are multiple points on the same X value,\n // let the area fill the full span of those points\n if (stackIndicator.index > 0 && series.singleStacks === false) {\n stack.points[pointKey][0] =\n stack.points[series.index + ',' + x + ',0'][0];\n }\n }\n\n // Add value to the stack total\n if (stacking === 'percent') {\n\n // Percent stacked column, totals are the same for the positive and\n // negative stacks\n other = isNegative ? stackKey : negKey;\n if (negStacks && stacks[other] && stacks[other][x]) {\n other = stacks[other][x];\n stack.total = other.total =\n Math.max(other.total, stack.total) + Math.abs(y) || 0;\n\n // Percent stacked areas\n } else {\n stack.total = correctFloat(stack.total + (Math.abs(y) || 0));\n }\n } else {\n stack.total = correctFloat(stack.total + (y || 0));\n }\n\n stack.cum = pick(stack.cum, stackThreshold) + (y || 0);\n\n if (y !== null) {\n stack.points[pointKey].push(stack.cum);\n stackedYData[i] = stack.cum;\n }\n\n }\n\n if (stacking === 'percent') {\n yAxis.usePercentage = true;\n }\n\n this.stackedYData = stackedYData; // To be used in getExtremes\n\n // Reset old stacks\n yAxis.oldStacks = {};\n };\n\n /**\n * Iterate over all stacks and compute the absolute values to percent\n */\n Series.prototype.setPercentStacks = function() {\n var series = this,\n stackKey = series.stackKey,\n stacks = series.yAxis.stacks,\n processedXData = series.processedXData,\n stackIndicator;\n\n each([stackKey, '-' + stackKey], function(key) {\n var i = processedXData.length,\n x,\n stack,\n pointExtremes,\n totalFactor;\n\n while (i--) {\n x = processedXData[i];\n stackIndicator = series.getStackIndicator(\n stackIndicator,\n x,\n series.index,\n key\n );\n stack = stacks[key] && stacks[key][x];\n pointExtremes = stack && stack.points[stackIndicator.key];\n if (pointExtremes) {\n totalFactor = stack.total ? 100 / stack.total : 0;\n // Y bottom value\n pointExtremes[0] = correctFloat(pointExtremes[0] * totalFactor);\n // Y value\n pointExtremes[1] = correctFloat(pointExtremes[1] * totalFactor);\n series.stackedYData[i] = pointExtremes[1];\n }\n }\n });\n };\n\n /**\n * Get stack indicator, according to it's x-value, to determine points with the\n * same x-value\n */\n Series.prototype.getStackIndicator = function(stackIndicator, x, index, key) {\n // Update stack indicator, when:\n // first point in a stack || x changed || stack type (negative vs positive)\n // changed:\n if (!defined(stackIndicator) || stackIndicator.x !== x ||\n (key && stackIndicator.key !== key)) {\n stackIndicator = {\n x: x,\n index: 0,\n key: key\n };\n } else {\n stackIndicator.index++;\n }\n\n stackIndicator.key = [index, x, stackIndicator.index].join(',');\n\n return stackIndicator;\n };\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var addEvent = H.addEvent,\n animate = H.animate,\n Axis = H.Axis,\n Chart = H.Chart,\n createElement = H.createElement,\n css = H.css,\n defined = H.defined,\n each = H.each,\n erase = H.erase,\n extend = H.extend,\n fireEvent = H.fireEvent,\n inArray = H.inArray,\n isNumber = H.isNumber,\n isObject = H.isObject,\n isArray = H.isArray,\n merge = H.merge,\n objectEach = H.objectEach,\n pick = H.pick,\n Point = H.Point,\n Series = H.Series,\n seriesTypes = H.seriesTypes,\n setAnimation = H.setAnimation,\n splat = H.splat;\n\n // Extend the Chart prototype for dynamic methods\n extend(Chart.prototype, /** @lends Highcharts.Chart.prototype */ {\n\n /**\n * Add a series to the chart after render time. Note that this method should\n * never be used when adding data synchronously at chart render time, as it\n * adds expense to the calculations and rendering. When adding data at the\n * same time as the chart is initiated, add the series as a configuration\n * option instead. With multiple axes, the `offset` is dynamically adjusted.\n *\n * @param {SeriesOptions} options\n * The config options for the series.\n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart after adding.\n * @param {AnimationOptions} animation\n * Whether to apply animation, and optionally animation\n * configuration.\n *\n * @return {Highcharts.Series}\n * The newly created series object.\n *\n * @sample highcharts/members/chart-addseries/\n * Add a series from a button\n * @sample stock/members/chart-addseries/\n * Add a series in Highstock\n */\n addSeries: function(options, redraw, animation) {\n var series,\n chart = this;\n\n if (options) {\n redraw = pick(redraw, true); // defaults to true\n\n fireEvent(chart, 'addSeries', {\n options: options\n }, function() {\n series = chart.initSeries(options);\n\n chart.isDirtyLegend = true; // the series array is out of sync with the display\n chart.linkSeries();\n if (redraw) {\n chart.redraw(animation);\n }\n });\n }\n\n return series;\n },\n\n /**\n * Add an axis to the chart after render time. Note that this method should\n * never be used when adding data synchronously at chart render time, as it\n * adds expense to the calculations and rendering. When adding data at the\n * same time as the chart is initiated, add the axis as a configuration\n * option instead.\n * @param {AxisOptions} options\n * The axis options.\n * @param {Boolean} [isX=false]\n * Whether it is an X axis or a value axis.\n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart after adding.\n * @param {AnimationOptions} [animation=true]\n * Whether and how to apply animation in the redraw.\n *\n * @sample highcharts/members/chart-addaxis/ Add and remove axes\n */\n addAxis: function(options, isX, redraw, animation) {\n var key = isX ? 'xAxis' : 'yAxis',\n chartOptions = this.options,\n userOptions = merge(options, {\n index: this[key].length,\n isX: isX\n });\n\n new Axis(this, userOptions); // eslint-disable-line no-new\n\n // Push the new axis options to the chart options\n chartOptions[key] = splat(chartOptions[key] || {});\n chartOptions[key].push(userOptions);\n\n if (pick(redraw, true)) {\n this.redraw(animation);\n }\n },\n\n /**\n * Dim the chart and show a loading text or symbol. Options for the loading\n * screen are defined in {@link\n * https://api.highcharts.com/highcharts/loading|the loading options}.\n * \n * @param {String} str\n * An optional text to show in the loading label instead of the\n * default one. The default text is set in {@link\n * http://api.highcharts.com/highcharts/lang.loading|lang.loading}.\n *\n * @sample highcharts/members/chart-hideloading/\n * Show and hide loading from a button\n * @sample highcharts/members/chart-showloading/\n * Apply different text labels\n * @sample stock/members/chart-show-hide-loading/\n * Toggle loading in Highstock\n */\n showLoading: function(str) {\n var chart = this,\n options = chart.options,\n loadingDiv = chart.loadingDiv,\n loadingOptions = options.loading,\n setLoadingSize = function() {\n if (loadingDiv) {\n css(loadingDiv, {\n left: chart.plotLeft + 'px',\n top: chart.plotTop + 'px',\n width: chart.plotWidth + 'px',\n height: chart.plotHeight + 'px'\n });\n }\n };\n\n // create the layer at the first call\n if (!loadingDiv) {\n chart.loadingDiv = loadingDiv = createElement('div', {\n className: 'highcharts-loading highcharts-loading-hidden'\n }, null, chart.container);\n\n chart.loadingSpan = createElement(\n 'span', {\n className: 'highcharts-loading-inner'\n },\n null,\n loadingDiv\n );\n addEvent(chart, 'redraw', setLoadingSize); // #1080\n }\n\n loadingDiv.className = 'highcharts-loading';\n\n // Update text\n chart.loadingSpan.innerHTML = str || options.lang.loading;\n\n\n // Update visuals\n css(loadingDiv, extend(loadingOptions.style, {\n zIndex: 10\n }));\n css(chart.loadingSpan, loadingOptions.labelStyle);\n\n // Show it\n if (!chart.loadingShown) {\n css(loadingDiv, {\n opacity: 0,\n display: ''\n });\n animate(loadingDiv, {\n opacity: loadingOptions.style.opacity || 0.5\n }, {\n duration: loadingOptions.showDuration || 0\n });\n }\n\n\n chart.loadingShown = true;\n setLoadingSize();\n },\n\n /**\n * Hide the loading layer.\n *\n * @see Highcharts.Chart#showLoading\n * @sample highcharts/members/chart-hideloading/\n * Show and hide loading from a button\n * @sample stock/members/chart-show-hide-loading/\n * Toggle loading in Highstock\n */\n hideLoading: function() {\n var options = this.options,\n loadingDiv = this.loadingDiv;\n\n if (loadingDiv) {\n loadingDiv.className = 'highcharts-loading highcharts-loading-hidden';\n\n animate(loadingDiv, {\n opacity: 0\n }, {\n duration: options.loading.hideDuration || 100,\n complete: function() {\n css(loadingDiv, {\n display: 'none'\n });\n }\n });\n\n }\n this.loadingShown = false;\n },\n\n /** \n * These properties cause isDirtyBox to be set to true when updating. Can be extended from plugins.\n */\n propsRequireDirtyBox: ['backgroundColor', 'borderColor', 'borderWidth', 'margin', 'marginTop', 'marginRight',\n 'marginBottom', 'marginLeft', 'spacing', 'spacingTop', 'spacingRight', 'spacingBottom', 'spacingLeft',\n 'borderRadius', 'plotBackgroundColor', 'plotBackgroundImage', 'plotBorderColor', 'plotBorderWidth',\n 'plotShadow', 'shadow'\n ],\n\n /** \n * These properties cause all series to be updated when updating. Can be\n * extended from plugins.\n */\n propsRequireUpdateSeries: ['chart.inverted', 'chart.polar',\n 'chart.ignoreHiddenSeries', 'chart.type', 'colors', 'plotOptions',\n 'tooltip'\n ],\n\n /**\n * A generic function to update any element of the chart. Elements can be\n * enabled and disabled, moved, re-styled, re-formatted etc.\n *\n * A special case is configuration objects that take arrays, for example\n * {@link https://api.highcharts.com/highcharts/xAxis|xAxis}, \n * {@link https://api.highcharts.com/highcharts/yAxis|yAxis} or \n * {@link https://api.highcharts.com/highcharts/series|series}. For these\n * collections, an `id` option is used to map the new option set to an\n * existing object. If an existing object of the same id is not found, the\n * corresponding item is updated. So for example, running `chart.update`\n * with a series item without an id, will cause the existing chart's series\n * with the same index in the series array to be updated.\n *\n * See also the {@link https://api.highcharts.com/highcharts/responsive|\n * responsive option set}. Switching between `responsive.rules` basically\n * runs `chart.update` under the hood.\n *\n * @param {Options} options\n * A configuration object for the new chart options.\n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart.\n *\n * @sample highcharts/members/chart-update/\n * Update chart geometry \n */\n update: function(options, redraw) {\n var chart = this,\n adders = {\n credits: 'addCredits',\n title: 'setTitle',\n subtitle: 'setSubtitle'\n },\n optionsChart = options.chart,\n updateAllAxes,\n updateAllSeries,\n newWidth,\n newHeight;\n\n // If the top-level chart option is present, some special updates are required \n if (optionsChart) {\n merge(true, chart.options.chart, optionsChart);\n\n // Setter function\n if ('className' in optionsChart) {\n chart.setClassName(optionsChart.className);\n }\n\n if ('inverted' in optionsChart || 'polar' in optionsChart) {\n // Parse options.chart.inverted and options.chart.polar together\n // with the available series.\n chart.propFromSeries();\n updateAllAxes = true;\n }\n\n if ('alignTicks' in optionsChart) { // #6452\n updateAllAxes = true;\n }\n\n objectEach(optionsChart, function(val, key) {\n if (inArray('chart.' + key, chart.propsRequireUpdateSeries) !== -1) {\n updateAllSeries = true;\n }\n // Only dirty box\n if (inArray(key, chart.propsRequireDirtyBox) !== -1) {\n chart.isDirtyBox = true;\n }\n });\n\n\n if ('style' in optionsChart) {\n chart.renderer.setStyle(optionsChart.style);\n }\n\n }\n\n // Moved up, because tooltip needs updated plotOptions (#6218)\n\n if (options.colors) {\n this.options.colors = options.colors;\n }\n\n\n if (options.plotOptions) {\n merge(true, this.options.plotOptions, options.plotOptions);\n }\n\n // Some option stuctures correspond one-to-one to chart objects that\n // have update methods, for example\n // options.credits => chart.credits\n // options.legend => chart.legend\n // options.title => chart.title\n // options.tooltip => chart.tooltip\n // options.subtitle => chart.subtitle\n // options.mapNavigation => chart.mapNavigation\n // options.navigator => chart.navigator\n // options.scrollbar => chart.scrollbar\n objectEach(options, function(val, key) {\n if (chart[key] && typeof chart[key].update === 'function') {\n chart[key].update(val, false);\n\n // If a one-to-one object does not exist, look for an adder function\n } else if (typeof chart[adders[key]] === 'function') {\n chart[adders[key]](val);\n }\n\n if (\n key !== 'chart' &&\n inArray(key, chart.propsRequireUpdateSeries) !== -1\n ) {\n updateAllSeries = true;\n }\n });\n\n // Setters for collections. For axes and series, each item is referred\n // by an id. If the id is not found, it defaults to the corresponding\n // item in the collection, so setting one series without an id, will\n // update the first series in the chart. Setting two series without\n // an id will update the first and the second respectively (#6019)\n // chart.update and responsive.\n each([\n 'xAxis',\n 'yAxis',\n 'zAxis',\n 'series',\n 'colorAxis',\n 'pane'\n ], function(coll) {\n if (options[coll]) {\n each(splat(options[coll]), function(newOptions, i) {\n var item = (\n defined(newOptions.id) &&\n chart.get(newOptions.id)\n ) || chart[coll][i];\n if (item && item.coll === coll) {\n item.update(newOptions, false);\n }\n });\n }\n });\n\n if (updateAllAxes) {\n each(chart.axes, function(axis) {\n axis.update({}, false);\n });\n }\n\n // Certain options require the whole series structure to be thrown away\n // and rebuilt\n if (updateAllSeries) {\n each(chart.series, function(series) {\n series.update({}, false);\n });\n }\n\n // For loading, just update the options, do not redraw\n if (options.loading) {\n merge(true, chart.options.loading, options.loading);\n }\n\n // Update size. Redraw is forced.\n newWidth = optionsChart && optionsChart.width;\n newHeight = optionsChart && optionsChart.height;\n if ((isNumber(newWidth) && newWidth !== chart.chartWidth) ||\n (isNumber(newHeight) && newHeight !== chart.chartHeight)) {\n chart.setSize(newWidth, newHeight);\n } else if (pick(redraw, true)) {\n chart.redraw();\n }\n },\n\n /**\n * Setter function to allow use from chart.update\n */\n setSubtitle: function(options) {\n this.setTitle(undefined, options);\n }\n\n\n });\n\n // extend the Point prototype for dynamic methods\n extend(Point.prototype, /** @lends Highcharts.Point.prototype */ {\n /**\n * Update point with new options (typically x/y data) and optionally redraw\n * the series.\n *\n * @param {Object} options\n * The point options. Point options are handled as described under\n * the `series.data` item for each series type. For example\n * for a line series, if options is a single number, the point will\n * be given that number as the main y value. If it is an array, it\n * will be interpreted as x and y values respectively. If it is an\n * object, advanced options are applied. \n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart after the point is updated. If doing\n * more operations on the chart, it is best practice to set\n * `redraw` to false and call `chart.redraw()` after.\n * @param {AnimationOptions} [animation=true]\n * Whether to apply animation, and optionally animation\n * configuration.\n *\n * @sample highcharts/members/point-update-column/\n * Update column value\n * @sample highcharts/members/point-update-pie/\n * Update pie slice\n * @sample maps/members/point-update/\n * Update map area value in Highmaps\n */\n update: function(options, redraw, animation, runEvent) {\n var point = this,\n series = point.series,\n graphic = point.graphic,\n i,\n chart = series.chart,\n seriesOptions = series.options;\n\n redraw = pick(redraw, true);\n\n function update() {\n\n point.applyOptions(options);\n\n // Update visuals\n if (point.y === null && graphic) { // #4146\n point.graphic = graphic.destroy();\n }\n if (isObject(options, true)) {\n // Destroy so we can get new elements\n if (graphic && graphic.element) {\n if (options && options.marker && options.marker.symbol) {\n point.graphic = graphic.destroy();\n }\n }\n if (options && options.dataLabels && point.dataLabel) { // #2468\n point.dataLabel = point.dataLabel.destroy();\n }\n }\n\n // record changes in the parallel arrays\n i = point.index;\n series.updateParallelArrays(point, i);\n\n // Record the options to options.data. If the old or the new config\n // is an object, use point options, otherwise use raw options\n // (#4701, #4916).\n seriesOptions.data[i] = (\n isObject(seriesOptions.data[i], true) ||\n isObject(options, true)\n ) ?\n point.options :\n options;\n\n // redraw\n series.isDirty = series.isDirtyData = true;\n if (!series.fixedBox && series.hasCartesianSeries) { // #1906, #2320\n chart.isDirtyBox = true;\n }\n\n if (seriesOptions.legendType === 'point') { // #1831, #1885\n chart.isDirtyLegend = true;\n }\n if (redraw) {\n chart.redraw(animation);\n }\n }\n\n // Fire the event with a default handler of doing the update\n if (runEvent === false) { // When called from setData\n update();\n } else {\n point.firePointEvent('update', {\n options: options\n }, update);\n }\n },\n\n /**\n * Remove a point and optionally redraw the series and if necessary the axes\n * @param {Boolean} redraw\n * Whether to redraw the chart or wait for an explicit call. When\n * doing more operations on the chart, for example running\n * `point.remove()` in a loop, it is best practice to set `redraw`\n * to false and call `chart.redraw()` after. \n * @param {AnimationOptions} [animation=false]\n * Whether to apply animation, and optionally animation\n * configuration.\n *\n * @sample highcharts/plotoptions/series-point-events-remove/\n * Remove point and confirm\n * @sample highcharts/members/point-remove/\n * Remove pie slice\n * @sample maps/members/point-remove/\n * Remove selected points in Highmaps\n */\n remove: function(redraw, animation) {\n this.series.removePoint(inArray(this, this.series.data), redraw, animation);\n }\n });\n\n // Extend the series prototype for dynamic methods\n extend(Series.prototype, /** @lends Series.prototype */ {\n /**\n * Add a point to the series after render time. The point can be added at\n * the end, or by giving it an X value, to the start or in the middle of the\n * series.\n * \n * @param {Number|Array|Object} options\n * The point options. If options is a single number, a point with\n * that y value is appended to the series.If it is an array, it will\n * be interpreted as x and y values respectively. If it is an\n * object, advanced options as outlined under `series.data` are\n * applied.\n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart after the point is added. When adding\n * more than one point, it is highly recommended that the redraw\n * option be set to false, and instead {@link Chart#redraw}\n * is explicitly called after the adding of points is finished.\n * Otherwise, the chart will redraw after adding each point.\n * @param {Boolean} [shift=false]\n * If true, a point is shifted off the start of the series as one is\n * appended to the end.\n * @param {AnimationOptions} [animation]\n * Whether to apply animation, and optionally animation\n * configuration.\n *\n * @sample highcharts/members/series-addpoint-append/\n * Append point\n * @sample highcharts/members/series-addpoint-append-and-shift/\n * Append and shift\n * @sample highcharts/members/series-addpoint-x-and-y/\n * Both X and Y values given\n * @sample highcharts/members/series-addpoint-pie/\n * Append pie slice\n * @sample stock/members/series-addpoint/\n * Append 100 points in Highstock\n * @sample stock/members/series-addpoint-shift/\n * Append and shift in Highstock\n * @sample maps/members/series-addpoint/\n * Add a point in Highmaps\n */\n addPoint: function(options, redraw, shift, animation) {\n var series = this,\n seriesOptions = series.options,\n data = series.data,\n chart = series.chart,\n xAxis = series.xAxis,\n names = xAxis && xAxis.hasNames && xAxis.names,\n dataOptions = seriesOptions.data,\n point,\n isInTheMiddle,\n xData = series.xData,\n i,\n x;\n\n // Optional redraw, defaults to true\n redraw = pick(redraw, true);\n\n // Get options and push the point to xData, yData and series.options. In series.generatePoints\n // the Point instance will be created on demand and pushed to the series.data array.\n point = {\n series: series\n };\n series.pointClass.prototype.applyOptions.apply(point, [options]);\n x = point.x;\n\n // Get the insertion point\n i = xData.length;\n if (series.requireSorting && x < xData[i - 1]) {\n isInTheMiddle = true;\n while (i && xData[i - 1] > x) {\n i--;\n }\n }\n\n series.updateParallelArrays(point, 'splice', i, 0, 0); // insert undefined item\n series.updateParallelArrays(point, i); // update it\n\n if (names && point.name) {\n names[x] = point.name;\n }\n dataOptions.splice(i, 0, options);\n\n if (isInTheMiddle) {\n series.data.splice(i, 0, null);\n series.processData();\n }\n\n // Generate points to be added to the legend (#1329)\n if (seriesOptions.legendType === 'point') {\n series.generatePoints();\n }\n\n // Shift the first point off the parallel arrays\n if (shift) {\n if (data[0] && data[0].remove) {\n data[0].remove(false);\n } else {\n data.shift();\n series.updateParallelArrays(point, 'shift');\n\n dataOptions.shift();\n }\n }\n\n // redraw\n series.isDirty = true;\n series.isDirtyData = true;\n\n if (redraw) {\n chart.redraw(animation); // Animation is set anyway on redraw, #5665\n }\n },\n\n /**\n * Remove a point from the series. Unlike the {@link Highcharts.Point#remove}\n * method, this can also be done on a point that is not instanciated because\n * it is outside the view or subject to Highstock data grouping.\n *\n * @param {Number} i\n * The index of the point in the {@link Highcharts.Series.data|data}\n * array.\n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart after the point is added. When \n * removing more than one point, it is highly recommended that the\n * `redraw` option be set to `false`, and instead {@link\n * Highcharts.Chart#redraw} is explicitly called after the adding of\n * points is finished.\n * @param {AnimationOptions} [animation]\n * Whether and optionally how the series should be animated.\n *\n * @sample highcharts/members/series-removepoint/\n * Remove cropped point\n */\n removePoint: function(i, redraw, animation) {\n\n var series = this,\n data = series.data,\n point = data[i],\n points = series.points,\n chart = series.chart,\n remove = function() {\n\n if (points && points.length === data.length) { // #4935\n points.splice(i, 1);\n }\n data.splice(i, 1);\n series.options.data.splice(i, 1);\n series.updateParallelArrays(point || {\n series: series\n }, 'splice', i, 1);\n\n if (point) {\n point.destroy();\n }\n\n // redraw\n series.isDirty = true;\n series.isDirtyData = true;\n if (redraw) {\n chart.redraw();\n }\n };\n\n setAnimation(animation, chart);\n redraw = pick(redraw, true);\n\n // Fire the event with a default handler of removing the point\n if (point) {\n point.firePointEvent('remove', null, remove);\n } else {\n remove();\n }\n },\n\n /**\n * Remove a series and optionally redraw the chart.\n *\n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart or wait for an explicit call to\n * {@link Highcharts.Chart#redraw}.\n * @param {AnimationOptions} [animation]\n * Whether to apply animation, and optionally animation\n * configuration\n * @param {Boolean} [withEvent=true]\n * Used internally, whether to fire the series `remove` event.\n *\n * @sample highcharts/members/series-remove/\n * Remove first series from a button\n */\n remove: function(redraw, animation, withEvent) {\n var series = this,\n chart = series.chart;\n\n function remove() {\n\n // Destroy elements\n series.destroy();\n\n // Redraw\n chart.isDirtyLegend = chart.isDirtyBox = true;\n chart.linkSeries();\n\n if (pick(redraw, true)) {\n chart.redraw(animation);\n }\n }\n\n // Fire the event with a default handler of removing the point\n if (withEvent !== false) {\n fireEvent(series, 'remove', null, remove);\n } else {\n remove();\n }\n },\n\n /**\n * Update the series with a new set of options. For a clean and precise\n * handling of new options, all methods and elements from the series are\n * removed, and it is initiated from scratch. Therefore, this method is more\n * performance expensive than some other utility methods like {@link\n * Series#setData} or {@link Series#setVisible}.\n *\n * @param {SeriesOptions} options\n * New options that will be merged with the series' existing\n * options.\n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart after the series is altered. If doing\n * more operations on the chart, it is a good idea to set redraw to\n * false and call {@link Chart#redraw} after.\n *\n * @sample highcharts/members/series-update/\n * Updating series options\n * @sample maps/members/series-update/\n * Update series options in Highmaps\n */\n update: function(newOptions, redraw) {\n var series = this,\n chart = series.chart,\n // must use user options when changing type because series.options\n // is merged in with type specific plotOptions\n oldOptions = series.userOptions,\n oldType = series.oldType || series.type,\n newType = newOptions.type || oldOptions.type || chart.options.chart.type,\n proto = seriesTypes[oldType].prototype,\n preserve = ['group', 'markerGroup', 'dataLabelsGroup'],\n n;\n\n // Running Series.update to update the data only is an intuitive usage,\n // so we want to make sure that when used like this, we run the\n // cheaper setData function and allow animation instead of completely\n // recreating the series instance.\n if (Object.keys && Object.keys(newOptions).toString() === 'data') {\n return this.setData(newOptions.data, redraw);\n }\n\n // If we're changing type or zIndex, create new groups (#3380, #3404)\n if ((newType && newType !== oldType) || newOptions.zIndex !== undefined) {\n preserve.length = 0;\n }\n\n // Make sure groups are not destroyed (#3094)\n each(preserve, function(prop) {\n preserve[prop] = series[prop];\n delete series[prop];\n });\n\n // Do the merge, with some forced options\n newOptions = merge(oldOptions, {\n animation: false,\n index: series.index,\n pointStart: series.xData[0] // when updating after addPoint\n }, {\n data: series.options.data\n }, newOptions);\n\n // Destroy the series and delete all properties. Reinsert all methods\n // and properties from the new type prototype (#2270, #3719)\n series.remove(false, null, false);\n for (n in proto) {\n series[n] = undefined;\n }\n extend(series, seriesTypes[newType || oldType].prototype);\n\n // Re-register groups (#3094)\n each(preserve, function(prop) {\n series[prop] = preserve[prop];\n });\n\n series.init(chart, newOptions);\n series.oldType = oldType;\n chart.linkSeries(); // Links are lost in series.remove (#3028)\n if (pick(redraw, true)) {\n chart.redraw(false);\n }\n }\n });\n\n // Extend the Axis.prototype for dynamic methods\n extend(Axis.prototype, /** @lends Highcharts.Axis.prototype */ {\n\n /**\n * Update an axis object with a new set of options. The options are merged\n * with the existing options, so only new or altered options need to be\n * specified.\n *\n * @param {Object} options\n * The new options that will be merged in with existing options on\n * the axis.\n * @sample highcharts/members/axis-update/ Axis update demo\n */\n update: function(options, redraw) {\n var chart = this.chart;\n\n options = chart.options[this.coll][this.options.index] =\n merge(this.userOptions, options);\n\n this.destroy(true);\n\n this.init(chart, extend(options, {\n events: undefined\n }));\n\n chart.isDirtyBox = true;\n if (pick(redraw, true)) {\n chart.redraw();\n }\n },\n\n /**\n * Remove the axis from the chart.\n *\n * @param {Boolean} [redraw=true] Whether to redraw the chart following the\n * remove.\n *\n * @sample highcharts/members/chart-addaxis/ Add and remove axes\n */\n remove: function(redraw) {\n var chart = this.chart,\n key = this.coll, // xAxis or yAxis\n axisSeries = this.series,\n i = axisSeries.length;\n\n // Remove associated series (#2687)\n while (i--) {\n if (axisSeries[i]) {\n axisSeries[i].remove(false);\n }\n }\n\n // Remove the axis\n erase(chart.axes, this);\n erase(chart[key], this);\n\n if (isArray(chart.options[key])) {\n chart.options[key].splice(this.options.index, 1);\n } else { // color axis, #6488\n delete chart.options[key];\n }\n\n each(chart[key], function(axis, i) { // Re-index, #1706\n axis.options.index = i;\n });\n this.destroy();\n chart.isDirtyBox = true;\n\n if (pick(redraw, true)) {\n chart.redraw();\n }\n },\n\n /**\n * Update the axis title by options after render time.\n *\n * @param {TitleOptions} titleOptions\n * The additional title options.\n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart after setting the title.\n * @sample highcharts/members/axis-settitle/ Set a new Y axis title\n */\n setTitle: function(titleOptions, redraw) {\n this.update({\n title: titleOptions\n }, redraw);\n },\n\n /**\n * Set new axis categories and optionally redraw.\n * @param {Array.} categories - The new categories.\n * @param {Boolean} [redraw=true] - Whether to redraw the chart.\n * @sample highcharts/members/axis-setcategories/ Set categories by click on\n * a button\n */\n setCategories: function(categories, redraw) {\n this.update({\n categories: categories\n }, redraw);\n }\n\n });\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var color = H.color,\n each = H.each,\n LegendSymbolMixin = H.LegendSymbolMixin,\n map = H.map,\n pick = H.pick,\n Series = H.Series,\n seriesType = H.seriesType;\n\n /**\n * Area series type.\n * @constructor seriesTypes.area\n * @extends {Series}\n */\n seriesType('area', 'line', {\n softThreshold: false,\n threshold: 0\n // trackByArea: false,\n // lineColor: null, // overrides color, but lets fillColor be unaltered\n // fillOpacity: 0.75,\n // fillColor: null\n }, /** @lends seriesTypes.area.prototype */ {\n singleStacks: false,\n /** \n * Return an array of stacked points, where null and missing points are replaced by \n * dummy points in order for gaps to be drawn correctly in stacks.\n */\n getStackPoints: function() {\n var series = this,\n segment = [],\n keys = [],\n xAxis = this.xAxis,\n yAxis = this.yAxis,\n stack = yAxis.stacks[this.stackKey],\n pointMap = {},\n points = this.points,\n seriesIndex = series.index,\n yAxisSeries = yAxis.series,\n seriesLength = yAxisSeries.length,\n visibleSeries,\n upOrDown = pick(yAxis.options.reversedStacks, true) ? 1 : -1,\n i;\n\n if (this.options.stacking) {\n // Create a map where we can quickly look up the points by their X value.\n for (i = 0; i < points.length; i++) {\n pointMap[points[i].x] = points[i];\n }\n\n // Sort the keys (#1651)\n H.objectEach(stack, function(stackX, x) {\n if (stackX.total !== null) { // nulled after switching between grouping and not (#1651, #2336)\n keys.push(x);\n }\n });\n keys.sort(function(a, b) {\n return a - b;\n });\n\n visibleSeries = map(yAxisSeries, function() {\n return this.visible;\n });\n\n each(keys, function(x, idx) {\n var y = 0,\n stackPoint,\n stackedValues;\n\n if (pointMap[x] && !pointMap[x].isNull) {\n segment.push(pointMap[x]);\n\n // Find left and right cliff. -1 goes left, 1 goes right.\n each([-1, 1], function(direction) {\n var nullName = direction === 1 ? 'rightNull' : 'leftNull',\n cliffName = direction === 1 ? 'rightCliff' : 'leftCliff',\n cliff = 0,\n otherStack = stack[keys[idx + direction]];\n\n // If there is a stack next to this one, to the left or to the right...\n if (otherStack) {\n i = seriesIndex;\n while (i >= 0 && i < seriesLength) { // Can go either up or down, depending on reversedStacks\n stackPoint = otherStack.points[i];\n if (!stackPoint) {\n // If the next point in this series is missing, mark the point\n // with point.leftNull or point.rightNull = true.\n if (i === seriesIndex) {\n pointMap[x][nullName] = true;\n\n // If there are missing points in the next stack in any of the \n // series below this one, we need to substract the missing values\n // and add a hiatus to the left or right.\n } else if (visibleSeries[i]) {\n stackedValues = stack[x].points[i];\n if (stackedValues) {\n cliff -= stackedValues[1] - stackedValues[0];\n }\n }\n }\n // When reversedStacks is true, loop up, else loop down\n i += upOrDown;\n }\n }\n pointMap[x][cliffName] = cliff;\n });\n\n\n // There is no point for this X value in this series, so we \n // insert a dummy point in order for the areas to be drawn\n // correctly.\n } else {\n\n // Loop down the stack to find the series below this one that has\n // a value (#1991)\n i = seriesIndex;\n while (i >= 0 && i < seriesLength) {\n stackPoint = stack[x].points[i];\n if (stackPoint) {\n y = stackPoint[1];\n break;\n }\n // When reversedStacks is true, loop up, else loop down\n i += upOrDown;\n }\n y = yAxis.translate(y, 0, 1, 0, 1); // #6272\n segment.push({\n isNull: true,\n plotX: xAxis.translate(x, 0, 0, 0, 1), // #6272\n x: x,\n plotY: y,\n yBottom: y\n });\n }\n });\n\n }\n\n return segment;\n },\n\n getGraphPath: function(points) {\n var getGraphPath = Series.prototype.getGraphPath,\n graphPath,\n options = this.options,\n stacking = options.stacking,\n yAxis = this.yAxis,\n topPath,\n //topPoints = [],\n bottomPath,\n bottomPoints = [],\n graphPoints = [],\n seriesIndex = this.index,\n i,\n areaPath,\n plotX,\n stacks = yAxis.stacks[this.stackKey],\n threshold = options.threshold,\n translatedThreshold = yAxis.getThreshold(options.threshold),\n isNull,\n yBottom,\n connectNulls = options.connectNulls || stacking === 'percent',\n /**\n * To display null points in underlying stacked series, this series graph must be \n * broken, and the area also fall down to fill the gap left by the null point. #2069\n */\n addDummyPoints = function(i, otherI, side) {\n var point = points[i],\n stackedValues = stacking && stacks[point.x].points[seriesIndex],\n nullVal = point[side + 'Null'] || 0,\n cliffVal = point[side + 'Cliff'] || 0,\n top,\n bottom,\n isNull = true;\n\n if (cliffVal || nullVal) {\n\n top = (nullVal ? stackedValues[0] : stackedValues[1]) + cliffVal;\n bottom = stackedValues[0] + cliffVal;\n isNull = !!nullVal;\n\n } else if (!stacking && points[otherI] && points[otherI].isNull) {\n top = bottom = threshold;\n }\n\n // Add to the top and bottom line of the area\n if (top !== undefined) {\n graphPoints.push({\n plotX: plotX,\n plotY: top === null ? translatedThreshold : yAxis.getThreshold(top),\n isNull: isNull,\n isCliff: true\n });\n bottomPoints.push({\n plotX: plotX,\n plotY: bottom === null ? translatedThreshold : yAxis.getThreshold(bottom),\n doCurve: false // #1041, gaps in areaspline areas\n });\n }\n };\n\n // Find what points to use\n points = points || this.points;\n\n // Fill in missing points\n if (stacking) {\n points = this.getStackPoints();\n }\n\n for (i = 0; i < points.length; i++) {\n isNull = points[i].isNull;\n plotX = pick(points[i].rectPlotX, points[i].plotX);\n yBottom = pick(points[i].yBottom, translatedThreshold);\n\n if (!isNull || connectNulls) {\n\n if (!connectNulls) {\n addDummyPoints(i, i - 1, 'left');\n }\n\n if (!(isNull && !stacking && connectNulls)) { // Skip null point when stacking is false and connectNulls true\n graphPoints.push(points[i]);\n bottomPoints.push({\n x: i,\n plotX: plotX,\n plotY: yBottom\n });\n }\n\n if (!connectNulls) {\n addDummyPoints(i, i + 1, 'right');\n }\n }\n }\n\n topPath = getGraphPath.call(this, graphPoints, true, true);\n\n bottomPoints.reversed = true;\n bottomPath = getGraphPath.call(this, bottomPoints, true, true);\n if (bottomPath.length) {\n bottomPath[0] = 'L';\n }\n\n areaPath = topPath.concat(bottomPath);\n graphPath = getGraphPath.call(this, graphPoints, false, connectNulls); // TODO: don't set leftCliff and rightCliff when connectNulls?\n\n areaPath.xMap = topPath.xMap;\n this.areaPath = areaPath;\n\n return graphPath;\n },\n\n /**\n * Draw the graph and the underlying area. This method calls the Series base\n * function and adds the area. The areaPath is calculated in the getSegmentPath\n * method called from Series.prototype.drawGraph.\n */\n drawGraph: function() {\n\n // Define or reset areaPath\n this.areaPath = [];\n\n // Call the base method\n Series.prototype.drawGraph.apply(this);\n\n // Define local variables\n var series = this,\n areaPath = this.areaPath,\n options = this.options,\n zones = this.zones,\n props = [\n [\n 'area',\n 'highcharts-area',\n\n this.color,\n options.fillColor\n\n ]\n ]; // area name, main color, fill color\n\n each(zones, function(zone, i) {\n props.push([\n 'zone-area-' + i,\n 'highcharts-area highcharts-zone-area-' + i + ' ' + zone.className,\n\n zone.color || series.color,\n zone.fillColor || options.fillColor\n\n ]);\n });\n\n each(props, function(prop) {\n var areaKey = prop[0],\n area = series[areaKey];\n\n // Create or update the area\n if (area) { // update\n area.endX = areaPath.xMap;\n area.animate({\n d: areaPath\n });\n\n } else { // create\n area = series[areaKey] = series.chart.renderer.path(areaPath)\n .addClass(prop[1])\n .attr({\n\n fill: pick(\n prop[3],\n color(prop[2]).setOpacity(pick(options.fillOpacity, 0.75)).get()\n ),\n\n zIndex: 0 // #1069\n }).add(series.group);\n area.isArea = true;\n }\n area.startX = areaPath.xMap;\n area.shiftUnit = options.step ? 2 : 1;\n });\n },\n\n drawLegendSymbol: LegendSymbolMixin.drawRectangle\n });\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var pick = H.pick,\n seriesType = H.seriesType;\n\n /**\n * Spline series type.\n * @constructor seriesTypes.spline\n * @extends {Series}\n */\n seriesType('spline', 'line', {}, /** @lends seriesTypes.spline.prototype */ {\n /**\n * Get the spline segment from a given point's previous neighbour to the given point\n */\n getPointSpline: function(points, point, i) {\n var smoothing = 1.5, // 1 means control points midway between points, 2 means 1/3 from the point, 3 is 1/4 etc\n denom = smoothing + 1,\n plotX = point.plotX,\n plotY = point.plotY,\n lastPoint = points[i - 1],\n nextPoint = points[i + 1],\n leftContX,\n leftContY,\n rightContX,\n rightContY,\n ret;\n\n function doCurve(otherPoint) {\n return otherPoint &&\n !otherPoint.isNull &&\n otherPoint.doCurve !== false &&\n !point.isCliff; // #6387, area splines next to null\n }\n\n // Find control points\n if (doCurve(lastPoint) && doCurve(nextPoint)) {\n var lastX = lastPoint.plotX,\n lastY = lastPoint.plotY,\n nextX = nextPoint.plotX,\n nextY = nextPoint.plotY,\n correction = 0;\n\n leftContX = (smoothing * plotX + lastX) / denom;\n leftContY = (smoothing * plotY + lastY) / denom;\n rightContX = (smoothing * plotX + nextX) / denom;\n rightContY = (smoothing * plotY + nextY) / denom;\n\n // Have the two control points make a straight line through main point\n if (rightContX !== leftContX) { // #5016, division by zero\n correction = ((rightContY - leftContY) * (rightContX - plotX)) /\n (rightContX - leftContX) + plotY - rightContY;\n }\n\n leftContY += correction;\n rightContY += correction;\n\n // to prevent false extremes, check that control points are between\n // neighbouring points' y values\n if (leftContY > lastY && leftContY > plotY) {\n leftContY = Math.max(lastY, plotY);\n rightContY = 2 * plotY - leftContY; // mirror of left control point\n } else if (leftContY < lastY && leftContY < plotY) {\n leftContY = Math.min(lastY, plotY);\n rightContY = 2 * plotY - leftContY;\n }\n if (rightContY > nextY && rightContY > plotY) {\n rightContY = Math.max(nextY, plotY);\n leftContY = 2 * plotY - rightContY;\n } else if (rightContY < nextY && rightContY < plotY) {\n rightContY = Math.min(nextY, plotY);\n leftContY = 2 * plotY - rightContY;\n }\n\n // record for drawing in next point\n point.rightContX = rightContX;\n point.rightContY = rightContY;\n\n\n }\n\n // Visualize control points for debugging\n /*\n if (leftContX) {\n this.chart.renderer.circle(leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop, 2)\n .attr({\n stroke: 'red',\n 'stroke-width': 2,\n fill: 'none',\n zIndex: 9\n })\n .add();\n this.chart.renderer.path(['M', leftContX + this.chart.plotLeft, leftContY + this.chart.plotTop,\n 'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n .attr({\n stroke: 'red',\n 'stroke-width': 2,\n zIndex: 9\n })\n .add();\n }\n if (rightContX) {\n this.chart.renderer.circle(rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop, 2)\n .attr({\n stroke: 'green',\n 'stroke-width': 2,\n fill: 'none',\n zIndex: 9\n })\n .add();\n this.chart.renderer.path(['M', rightContX + this.chart.plotLeft, rightContY + this.chart.plotTop,\n 'L', plotX + this.chart.plotLeft, plotY + this.chart.plotTop])\n .attr({\n stroke: 'green',\n 'stroke-width': 2,\n zIndex: 9\n })\n .add();\n }\n // */\n ret = [\n 'C',\n pick(lastPoint.rightContX, lastPoint.plotX),\n pick(lastPoint.rightContY, lastPoint.plotY),\n pick(leftContX, plotX),\n pick(leftContY, plotY),\n plotX,\n plotY\n ];\n lastPoint.rightContX = lastPoint.rightContY = null; // reset for updating series later\n return ret;\n }\n });\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var areaProto = H.seriesTypes.area.prototype,\n defaultPlotOptions = H.defaultPlotOptions,\n LegendSymbolMixin = H.LegendSymbolMixin,\n seriesType = H.seriesType;\n /**\n * AreaSplineSeries object\n */\n seriesType('areaspline', 'spline', defaultPlotOptions.area, {\n getStackPoints: areaProto.getStackPoints,\n getGraphPath: areaProto.getGraphPath,\n setStackCliffs: areaProto.setStackCliffs,\n drawGraph: areaProto.drawGraph,\n drawLegendSymbol: LegendSymbolMixin.drawRectangle\n });\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var animObject = H.animObject,\n color = H.color,\n each = H.each,\n extend = H.extend,\n isNumber = H.isNumber,\n LegendSymbolMixin = H.LegendSymbolMixin,\n merge = H.merge,\n noop = H.noop,\n pick = H.pick,\n Series = H.Series,\n seriesType = H.seriesType,\n svg = H.svg;\n /**\n * The column series type.\n *\n * @constructor seriesTypes.column\n * @augments Series\n */\n seriesType('column', 'line', {\n borderRadius: 0,\n //colorByPoint: undefined,\n crisp: true,\n groupPadding: 0.2,\n //grouping: true,\n marker: null, // point options are specified in the base options\n pointPadding: 0.1,\n //pointWidth: null,\n minPointLength: 0,\n cropThreshold: 50, // when there are more points, they will not animate out of the chart on xAxis.setExtremes\n pointRange: null, // null means auto, meaning 1 in a categorized axis and least distance between points if not categories\n states: {\n hover: {\n halo: false,\n\n brightness: 0.1,\n shadow: false\n\n },\n\n select: {\n color: '#cccccc',\n borderColor: '#000000',\n shadow: false\n }\n\n },\n dataLabels: {\n align: null, // auto\n verticalAlign: null, // auto\n y: null\n },\n softThreshold: false,\n startFromThreshold: true, // false doesn't work well: http://jsfiddle.net/highcharts/hz8fopan/14/\n stickyTracking: false,\n tooltip: {\n distance: 6\n },\n threshold: 0,\n\n borderColor: '#ffffff'\n // borderWidth: 1\n\n\n }, /** @lends seriesTypes.column.prototype */ {\n cropShoulder: 0,\n directTouch: true, // When tooltip is not shared, this series (and derivatives) requires direct touch/hover. KD-tree does not apply.\n trackerGroups: ['group', 'dataLabelsGroup'],\n negStacks: true, // use separate negative stacks, unlike area stacks where a negative\n // point is substracted from previous (#1910)\n\n /**\n * Initialize the series. Extends the basic Series.init method by\n * marking other series of the same type as dirty.\n *\n * @function #init\n * @memberOf seriesTypes.column\n * @returns {void}\n */\n init: function() {\n Series.prototype.init.apply(this, arguments);\n\n var series = this,\n chart = series.chart;\n\n // if the series is added dynamically, force redraw of other\n // series affected by a new column\n if (chart.hasRendered) {\n each(chart.series, function(otherSeries) {\n if (otherSeries.type === series.type) {\n otherSeries.isDirty = true;\n }\n });\n }\n },\n\n /**\n * Return the width and x offset of the columns adjusted for grouping, groupPadding, pointPadding,\n * pointWidth etc.\n */\n getColumnMetrics: function() {\n\n var series = this,\n options = series.options,\n xAxis = series.xAxis,\n yAxis = series.yAxis,\n reversedXAxis = xAxis.reversed,\n stackKey,\n stackGroups = {},\n columnCount = 0;\n\n // Get the total number of column type series.\n // This is called on every series. Consider moving this logic to a\n // chart.orderStacks() function and call it on init, addSeries and removeSeries\n if (options.grouping === false) {\n columnCount = 1;\n } else {\n each(series.chart.series, function(otherSeries) {\n var otherOptions = otherSeries.options,\n otherYAxis = otherSeries.yAxis,\n columnIndex;\n if (\n otherSeries.type === series.type &&\n (\n otherSeries.visible ||\n !series.chart.options.chart.ignoreHiddenSeries\n ) &&\n yAxis.len === otherYAxis.len &&\n yAxis.pos === otherYAxis.pos\n ) { // #642, #2086\n if (otherOptions.stacking) {\n stackKey = otherSeries.stackKey;\n if (stackGroups[stackKey] === undefined) {\n stackGroups[stackKey] = columnCount++;\n }\n columnIndex = stackGroups[stackKey];\n } else if (otherOptions.grouping !== false) { // #1162\n columnIndex = columnCount++;\n }\n otherSeries.columnIndex = columnIndex;\n }\n });\n }\n\n var categoryWidth = Math.min(\n Math.abs(xAxis.transA) * (xAxis.ordinalSlope || options.pointRange || xAxis.closestPointRange || xAxis.tickInterval || 1), // #2610\n xAxis.len // #1535\n ),\n groupPadding = categoryWidth * options.groupPadding,\n groupWidth = categoryWidth - 2 * groupPadding,\n pointOffsetWidth = groupWidth / (columnCount || 1),\n pointWidth = Math.min(\n options.maxPointWidth || xAxis.len,\n pick(options.pointWidth, pointOffsetWidth * (1 - 2 * options.pointPadding))\n ),\n pointPadding = (pointOffsetWidth - pointWidth) / 2,\n colIndex = (series.columnIndex || 0) + (reversedXAxis ? 1 : 0), // #1251, #3737\n pointXOffset = pointPadding + (groupPadding + colIndex *\n pointOffsetWidth - (categoryWidth / 2)) *\n (reversedXAxis ? -1 : 1);\n\n // Save it for reading in linked series (Error bars particularly)\n series.columnMetrics = {\n width: pointWidth,\n offset: pointXOffset\n };\n return series.columnMetrics;\n\n },\n\n /**\n * Make the columns crisp. The edges are rounded to the nearest full pixel.\n */\n crispCol: function(x, y, w, h) {\n var chart = this.chart,\n borderWidth = this.borderWidth,\n xCrisp = -(borderWidth % 2 ? 0.5 : 0),\n yCrisp = borderWidth % 2 ? 0.5 : 1,\n right,\n bottom,\n fromTop;\n\n if (chart.inverted && chart.renderer.isVML) {\n yCrisp += 1;\n }\n\n // Horizontal. We need to first compute the exact right edge, then round it\n // and compute the width from there.\n if (this.options.crisp) {\n right = Math.round(x + w) + xCrisp;\n x = Math.round(x) + xCrisp;\n w = right - x;\n }\n\n // Vertical\n bottom = Math.round(y + h) + yCrisp;\n fromTop = Math.abs(y) <= 0.5 && bottom > 0.5; // #4504, #4656\n y = Math.round(y) + yCrisp;\n h = bottom - y;\n\n // Top edges are exceptions\n if (fromTop && h) { // #5146\n y -= 1;\n h += 1;\n }\n\n return {\n x: x,\n y: y,\n width: w,\n height: h\n };\n },\n\n /**\n * Translate each point to the plot area coordinate system and find shape positions\n */\n translate: function() {\n var series = this,\n chart = series.chart,\n options = series.options,\n dense = series.dense = series.closestPointRange * series.xAxis.transA < 2,\n borderWidth = series.borderWidth = pick(\n options.borderWidth,\n dense ? 0 : 1 // #3635\n ),\n yAxis = series.yAxis,\n threshold = options.threshold,\n translatedThreshold = series.translatedThreshold = yAxis.getThreshold(threshold),\n minPointLength = pick(options.minPointLength, 5),\n metrics = series.getColumnMetrics(),\n pointWidth = metrics.width,\n seriesBarW = series.barW = Math.max(pointWidth, 1 + 2 * borderWidth), // postprocessed for border width\n pointXOffset = series.pointXOffset = metrics.offset;\n\n if (chart.inverted) {\n translatedThreshold -= 0.5; // #3355\n }\n\n // When the pointPadding is 0, we want the columns to be packed tightly, so we allow individual\n // columns to have individual sizes. When pointPadding is greater, we strive for equal-width\n // columns (#2694).\n if (options.pointPadding) {\n seriesBarW = Math.ceil(seriesBarW);\n }\n\n Series.prototype.translate.apply(series);\n\n // Record the new values\n each(series.points, function(point) {\n var yBottom = pick(point.yBottom, translatedThreshold),\n safeDistance = 999 + Math.abs(yBottom),\n plotY = Math.min(Math.max(-safeDistance, point.plotY), yAxis.len + safeDistance), // Don't draw too far outside plot area (#1303, #2241, #4264)\n barX = point.plotX + pointXOffset,\n barW = seriesBarW,\n barY = Math.min(plotY, yBottom),\n up,\n barH = Math.max(plotY, yBottom) - barY;\n\n // Handle options.minPointLength\n if (Math.abs(barH) < minPointLength) {\n if (minPointLength) {\n barH = minPointLength;\n up = (!yAxis.reversed && !point.negative) || (yAxis.reversed && point.negative);\n barY = Math.abs(barY - translatedThreshold) > minPointLength ? // stacked\n yBottom - minPointLength : // keep position\n translatedThreshold - (up ? minPointLength : 0); // #1485, #4051\n }\n }\n\n // Cache for access in polar\n point.barX = barX;\n point.pointWidth = pointWidth;\n\n // Fix the tooltip on center of grouped columns (#1216, #424, #3648)\n point.tooltipPos = chart.inverted ? [yAxis.len + yAxis.pos - chart.plotLeft - plotY, series.xAxis.len - barX - barW / 2, barH] : [barX + barW / 2, plotY + yAxis.pos - chart.plotTop, barH];\n\n // Register shape type and arguments to be used in drawPoints\n point.shapeType = 'rect';\n point.shapeArgs = series.crispCol.apply(\n series,\n point.isNull ?\n // #3169, drilldown from null must have a position to work from\n // #6585, dataLabel should be placed on xAxis, not floating in the middle of the chart\n [barX, translatedThreshold, barW, 0] : [barX, barY, barW, barH]\n );\n });\n\n },\n\n getSymbol: noop,\n\n /**\n * Use a solid rectangle like the area series types\n */\n drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n\n\n /**\n * Columns have no graph\n */\n drawGraph: function() {\n this.group[this.dense ? 'addClass' : 'removeClass']('highcharts-dense-data');\n },\n\n\n /**\n * Get presentational attributes\n */\n pointAttribs: function(point, state) {\n var options = this.options,\n stateOptions,\n ret,\n p2o = this.pointAttrToOptions || {},\n strokeOption = p2o.stroke || 'borderColor',\n strokeWidthOption = p2o['stroke-width'] || 'borderWidth',\n fill = (point && point.color) || this.color,\n stroke = point[strokeOption] || options[strokeOption] ||\n this.color || fill, // set to fill when borderColor null\n strokeWidth = point[strokeWidthOption] ||\n options[strokeWidthOption] || this[strokeWidthOption] || 0,\n dashstyle = options.dashStyle,\n zone,\n brightness;\n\n // Handle zone colors\n if (point && this.zones.length) {\n zone = point.getZone();\n fill = point.options.color || (zone && zone.color) || this.color; // When zones are present, don't use point.color (#4267). Changed order (#6527)\n }\n\n // Select or hover states\n if (state) {\n stateOptions = merge(\n options.states[state],\n point.options.states && point.options.states[state] || {} // #6401\n );\n brightness = stateOptions.brightness;\n fill = stateOptions.color ||\n (brightness !== undefined && color(fill).brighten(stateOptions.brightness).get()) ||\n fill;\n stroke = stateOptions[strokeOption] || stroke;\n strokeWidth = stateOptions[strokeWidthOption] || strokeWidth;\n dashstyle = stateOptions.dashStyle || dashstyle;\n }\n\n ret = {\n 'fill': fill,\n 'stroke': stroke,\n 'stroke-width': strokeWidth\n };\n if (options.borderRadius) {\n ret.r = options.borderRadius;\n }\n\n if (dashstyle) {\n ret.dashstyle = dashstyle;\n }\n\n return ret;\n },\n\n\n /**\n * Draw the columns. For bars, the series.group is rotated, so the same coordinates\n * apply for columns and bars. This method is inherited by scatter series.\n *\n */\n drawPoints: function() {\n var series = this,\n chart = this.chart,\n options = series.options,\n renderer = chart.renderer,\n animationLimit = options.animationLimit || 250,\n shapeArgs;\n\n // draw the columns\n each(series.points, function(point) {\n var plotY = point.plotY,\n graphic = point.graphic;\n\n if (isNumber(plotY) && point.y !== null) {\n shapeArgs = point.shapeArgs;\n\n if (graphic) { // update\n graphic[chart.pointCount < animationLimit ? 'animate' : 'attr'](\n merge(shapeArgs)\n );\n\n } else {\n point.graphic = graphic = renderer[point.shapeType](shapeArgs)\n .add(point.group || series.group);\n }\n\n\n // Presentational\n graphic\n .attr(series.pointAttribs(point, point.selected && 'select'))\n .shadow(options.shadow, null, options.stacking && !options.borderRadius);\n\n\n graphic.addClass(point.getClassName(), true);\n\n\n } else if (graphic) {\n point.graphic = graphic.destroy(); // #1269\n }\n });\n },\n\n /**\n * Animate the column heights one by one from zero\n * @param {Boolean} init Whether to initialize the animation or run it\n */\n animate: function(init) {\n var series = this,\n yAxis = this.yAxis,\n options = series.options,\n inverted = this.chart.inverted,\n attr = {},\n translatedThreshold;\n\n if (svg) { // VML is too slow anyway\n if (init) {\n attr.scaleY = 0.001;\n translatedThreshold = Math.min(yAxis.pos + yAxis.len, Math.max(yAxis.pos, yAxis.toPixels(options.threshold)));\n if (inverted) {\n attr.translateX = translatedThreshold - yAxis.len;\n } else {\n attr.translateY = translatedThreshold;\n }\n series.group.attr(attr);\n\n } else { // run the animation\n\n attr[inverted ? 'translateX' : 'translateY'] = yAxis.pos;\n series.group.animate(attr, extend(animObject(series.options.animation), {\n // Do the scale synchronously to ensure smooth updating (#5030)\n step: function(val, fx) {\n series.group.attr({\n scaleY: Math.max(0.001, fx.pos) // #5250\n });\n }\n }));\n\n // delete this function to allow it only once\n series.animate = null;\n }\n }\n },\n\n /**\n * Remove this series from the chart\n */\n remove: function() {\n var series = this,\n chart = series.chart;\n\n // column and bar series affects other series of the same type\n // as they are either stacked or grouped\n if (chart.hasRendered) {\n each(chart.series, function(otherSeries) {\n if (otherSeries.type === series.type) {\n otherSeries.isDirty = true;\n }\n });\n }\n\n Series.prototype.remove.apply(series, arguments);\n }\n });\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n\n var seriesType = H.seriesType;\n\n /**\n * The Bar series class\n */\n seriesType('bar', 'column', null, {\n inverted: true\n });\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var Series = H.Series,\n seriesType = H.seriesType;\n /**\n * The scatter series type\n */\n seriesType('scatter', 'line', {\n lineWidth: 0,\n findNearestPointBy: 'xy',\n marker: {\n enabled: true // Overrides auto-enabling in line series (#3647)\n },\n tooltip: {\n\n headerFormat: '\\u25CF ' +\n ' {series.name}
',\n\n pointFormat: 'x: {point.x}
y: {point.y}
'\n }\n\n // Prototype members\n }, {\n sorted: false,\n requireSorting: false,\n noSharedTooltip: true,\n trackerGroups: ['group', 'markerGroup', 'dataLabelsGroup'],\n takeOrdinalPosition: false, // #2342\n drawGraph: function() {\n if (this.options.lineWidth) {\n Series.prototype.drawGraph.call(this);\n }\n }\n });\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var pick = H.pick,\n relativeLength = H.relativeLength;\n\n H.CenteredSeriesMixin = {\n /**\n * Get the center of the pie based on the size and center options relative to the\n * plot area. Borrowed by the polar and gauge series types.\n */\n getCenter: function() {\n\n var options = this.options,\n chart = this.chart,\n slicingRoom = 2 * (options.slicedOffset || 0),\n handleSlicingRoom,\n plotWidth = chart.plotWidth - 2 * slicingRoom,\n plotHeight = chart.plotHeight - 2 * slicingRoom,\n centerOption = options.center,\n positions = [pick(centerOption[0], '50%'), pick(centerOption[1], '50%'), options.size || '100%', options.innerSize || 0],\n smallestSize = Math.min(plotWidth, plotHeight),\n i,\n value;\n\n for (i = 0; i < 4; ++i) {\n value = positions[i];\n handleSlicingRoom = i < 2 || (i === 2 && /%$/.test(value));\n\n // i == 0: centerX, relative to width\n // i == 1: centerY, relative to height\n // i == 2: size, relative to smallestSize\n // i == 3: innerSize, relative to size\n positions[i] = relativeLength(value, [plotWidth, plotHeight, smallestSize, positions[2]][i]) +\n (handleSlicingRoom ? slicingRoom : 0);\n\n }\n // innerSize cannot be larger than size (#3632)\n if (positions[3] > positions[2]) {\n positions[3] = positions[2];\n }\n return positions;\n }\n };\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var addEvent = H.addEvent,\n CenteredSeriesMixin = H.CenteredSeriesMixin,\n defined = H.defined,\n each = H.each,\n extend = H.extend,\n inArray = H.inArray,\n LegendSymbolMixin = H.LegendSymbolMixin,\n noop = H.noop,\n pick = H.pick,\n Point = H.Point,\n Series = H.Series,\n seriesType = H.seriesType,\n seriesTypes = H.seriesTypes,\n setAnimation = H.setAnimation;\n\n /**\n * The pie series type.\n *\n * @constructor seriesTypes.pie\n * @augments Series\n */\n seriesType('pie', 'line', {\n center: [null, null],\n clip: false,\n colorByPoint: true, // always true for pies\n dataLabels: {\n // align: null,\n // connectorWidth: 1,\n // connectorColor: point.color,\n // connectorPadding: 5,\n distance: 30,\n enabled: true,\n formatter: function() { // #2945\n return this.point.isNull ? undefined : this.point.name;\n },\n // softConnector: true,\n x: 0\n // y: 0\n },\n ignoreHiddenPoint: true,\n //innerSize: 0,\n legendType: 'point',\n marker: null, // point options are specified in the base options\n size: null,\n showInLegend: false,\n slicedOffset: 10,\n stickyTracking: false,\n tooltip: {\n followPointer: true\n },\n\n borderColor: '#ffffff',\n borderWidth: 1,\n states: {\n hover: {\n brightness: 0.1,\n shadow: false\n }\n }\n\n\n }, /** @lends seriesTypes.pie.prototype */ {\n isCartesian: false,\n requireSorting: false,\n directTouch: true,\n noSharedTooltip: true,\n trackerGroups: ['group', 'dataLabelsGroup'],\n axisTypes: [],\n pointAttribs: seriesTypes.column.prototype.pointAttribs,\n /**\n * Animate the pies in\n */\n animate: function(init) {\n var series = this,\n points = series.points,\n startAngleRad = series.startAngleRad;\n\n if (!init) {\n each(points, function(point) {\n var graphic = point.graphic,\n args = point.shapeArgs;\n\n if (graphic) {\n // start values\n graphic.attr({\n r: point.startR || (series.center[3] / 2), // animate from inner radius (#779)\n start: startAngleRad,\n end: startAngleRad\n });\n\n // animate\n graphic.animate({\n r: args.r,\n start: args.start,\n end: args.end\n }, series.options.animation);\n }\n });\n\n // delete this function to allow it only once\n series.animate = null;\n }\n },\n\n /**\n * Recompute total chart sum and update percentages of points.\n */\n updateTotals: function() {\n var i,\n total = 0,\n points = this.points,\n len = points.length,\n point,\n ignoreHiddenPoint = this.options.ignoreHiddenPoint;\n\n // Get the total sum\n for (i = 0; i < len; i++) {\n point = points[i];\n total += (ignoreHiddenPoint && !point.visible) ?\n 0 :\n point.isNull ? 0 : point.y;\n }\n this.total = total;\n\n // Set each point's properties\n for (i = 0; i < len; i++) {\n point = points[i];\n point.percentage = (total > 0 && (point.visible || !ignoreHiddenPoint)) ? point.y / total * 100 : 0;\n point.total = total;\n }\n },\n\n /**\n * Extend the generatePoints method by adding total and percentage properties to each point\n */\n generatePoints: function() {\n Series.prototype.generatePoints.call(this);\n this.updateTotals();\n },\n\n /**\n * Do translation for pie slices\n */\n translate: function(positions) {\n this.generatePoints();\n\n var series = this,\n cumulative = 0,\n precision = 1000, // issue #172\n options = series.options,\n slicedOffset = options.slicedOffset,\n connectorOffset = slicedOffset + (options.borderWidth || 0),\n finalConnectorOffset,\n start,\n end,\n angle,\n startAngle = options.startAngle || 0,\n startAngleRad = series.startAngleRad = Math.PI / 180 * (startAngle - 90),\n endAngleRad = series.endAngleRad = Math.PI / 180 * ((pick(options.endAngle, startAngle + 360)) - 90),\n circ = endAngleRad - startAngleRad, //2 * Math.PI,\n points = series.points,\n radiusX, // the x component of the radius vector for a given point\n radiusY,\n labelDistance = options.dataLabels.distance,\n ignoreHiddenPoint = options.ignoreHiddenPoint,\n i,\n len = points.length,\n point;\n\n // Get positions - either an integer or a percentage string must be given.\n // If positions are passed as a parameter, we're in a recursive loop for adjusting\n // space for data labels.\n if (!positions) {\n series.center = positions = series.getCenter();\n }\n\n // Utility for getting the x value from a given y, used for anticollision\n // logic in data labels.\n // Added point for using specific points' label distance.\n series.getX = function(y, left, point) {\n angle = Math.asin(Math.min((y - positions[1]) / (positions[2] / 2 + point.labelDistance), 1));\n return positions[0] +\n (left ? -1 : 1) *\n (Math.cos(angle) * (positions[2] / 2 + point.labelDistance));\n };\n\n // Calculate the geometry for each point\n for (i = 0; i < len; i++) {\n\n point = points[i];\n\n // Used for distance calculation for specific point.\n point.labelDistance = pick(\n point.options.dataLabels && point.options.dataLabels.distance,\n labelDistance\n );\n\n // Saved for later dataLabels distance calculation.\n series.maxLabelDistance = Math.max(series.maxLabelDistance || 0, point.labelDistance);\n\n // set start and end angle\n start = startAngleRad + (cumulative * circ);\n if (!ignoreHiddenPoint || point.visible) {\n cumulative += point.percentage / 100;\n }\n end = startAngleRad + (cumulative * circ);\n\n // set the shape\n point.shapeType = 'arc';\n point.shapeArgs = {\n x: positions[0],\n y: positions[1],\n r: positions[2] / 2,\n innerR: positions[3] / 2,\n start: Math.round(start * precision) / precision,\n end: Math.round(end * precision) / precision\n };\n\n // The angle must stay within -90 and 270 (#2645)\n angle = (end + start) / 2;\n if (angle > 1.5 * Math.PI) {\n angle -= 2 * Math.PI;\n } else if (angle < -Math.PI / 2) {\n angle += 2 * Math.PI;\n }\n\n // Center for the sliced out slice\n point.slicedTranslation = {\n translateX: Math.round(Math.cos(angle) * slicedOffset),\n translateY: Math.round(Math.sin(angle) * slicedOffset)\n };\n\n // set the anchor point for tooltips\n radiusX = Math.cos(angle) * positions[2] / 2;\n radiusY = Math.sin(angle) * positions[2] / 2;\n point.tooltipPos = [\n positions[0] + radiusX * 0.7,\n positions[1] + radiusY * 0.7\n ];\n\n point.half = angle < -Math.PI / 2 || angle > Math.PI / 2 ? 1 : 0;\n point.angle = angle;\n\n // Set the anchor point for data labels. Use point.labelDistance \n // instead of labelDistance // #1174\n // finalConnectorOffset - not override connectorOffset value.\n finalConnectorOffset = Math.min(connectorOffset, point.labelDistance / 5); // #1678\n point.labelPos = [\n positions[0] + radiusX + Math.cos(angle) * point.labelDistance, // first break of connector\n positions[1] + radiusY + Math.sin(angle) * point.labelDistance, // a/a\n positions[0] + radiusX + Math.cos(angle) * finalConnectorOffset, // second break, right outside pie\n positions[1] + radiusY + Math.sin(angle) * finalConnectorOffset, // a/a\n positions[0] + radiusX, // landing point for connector\n positions[1] + radiusY, // a/a\n point.labelDistance < 0 ? // alignment\n 'center' :\n point.half ? 'right' : 'left', // alignment\n angle // center angle\n ];\n\n }\n },\n\n drawGraph: null,\n\n /**\n * Draw the data points\n */\n drawPoints: function() {\n var series = this,\n chart = series.chart,\n renderer = chart.renderer,\n groupTranslation,\n //center,\n graphic,\n //group,\n pointAttr,\n shapeArgs;\n\n\n var shadow = series.options.shadow;\n if (shadow && !series.shadowGroup) {\n series.shadowGroup = renderer.g('shadow')\n .add(series.group);\n }\n\n\n // draw the slices\n each(series.points, function(point) {\n if (!point.isNull) {\n graphic = point.graphic;\n shapeArgs = point.shapeArgs;\n\n\n // If the point is sliced, use special translation, else use\n // plot area traslation\n groupTranslation = point.getTranslate();\n\n\n // Put the shadow behind all points\n var shadowGroup = point.shadowGroup;\n if (shadow && !shadowGroup) {\n shadowGroup = point.shadowGroup = renderer.g('shadow')\n .add(series.shadowGroup);\n }\n\n if (shadowGroup) {\n shadowGroup.attr(groupTranslation);\n }\n pointAttr = series.pointAttribs(point, point.selected && 'select');\n\n\n // Draw the slice\n if (graphic) {\n graphic\n .setRadialReference(series.center)\n\n .attr(pointAttr)\n\n .animate(extend(shapeArgs, groupTranslation));\n } else {\n\n point.graphic = graphic = renderer[point.shapeType](shapeArgs)\n .setRadialReference(series.center)\n .attr(groupTranslation)\n .add(series.group);\n\n if (!point.visible) {\n graphic.attr({\n visibility: 'hidden'\n });\n }\n\n\n graphic\n .attr(pointAttr)\n .attr({\n 'stroke-linejoin': 'round'\n })\n .shadow(shadow, shadowGroup);\n\n }\n\n graphic.addClass(point.getClassName());\n\n }\n });\n\n },\n\n\n searchPoint: noop,\n\n /**\n * Utility for sorting data labels\n */\n sortByAngle: function(points, sign) {\n points.sort(function(a, b) {\n return a.angle !== undefined && (b.angle - a.angle) * sign;\n });\n },\n\n /**\n * Use a simple symbol from LegendSymbolMixin\n */\n drawLegendSymbol: LegendSymbolMixin.drawRectangle,\n\n /**\n * Use the getCenter method from drawLegendSymbol\n */\n getCenter: CenteredSeriesMixin.getCenter,\n\n /**\n * Pies don't have point marker symbols\n */\n getSymbol: noop\n\n\n /**\n * @constructor seriesTypes.pie.prototype.pointClass\n * @extends {Point}\n */\n }, /** @lends seriesTypes.pie.prototype.pointClass.prototype */ {\n /**\n * Initiate the pie slice\n */\n init: function() {\n\n Point.prototype.init.apply(this, arguments);\n\n var point = this,\n toggleSlice;\n\n point.name = pick(point.name, 'Slice');\n\n // add event listener for select\n toggleSlice = function(e) {\n point.slice(e.type === 'select');\n };\n addEvent(point, 'select', toggleSlice);\n addEvent(point, 'unselect', toggleSlice);\n\n return point;\n },\n\n /**\n * Negative points are not valid (#1530, #3623, #5322)\n */\n isValid: function() {\n return H.isNumber(this.y, true) && this.y >= 0;\n },\n\n /**\n * Toggle the visibility of the pie slice\n * @param {Boolean} vis Whether to show the slice or not. If undefined, the\n * visibility is toggled\n */\n setVisible: function(vis, redraw) {\n var point = this,\n series = point.series,\n chart = series.chart,\n ignoreHiddenPoint = series.options.ignoreHiddenPoint;\n\n redraw = pick(redraw, ignoreHiddenPoint);\n\n if (vis !== point.visible) {\n\n // If called without an argument, toggle visibility\n point.visible = point.options.visible = vis = vis === undefined ? !point.visible : vis;\n series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data\n\n // Show and hide associated elements. This is performed regardless of redraw or not,\n // because chart.redraw only handles full series.\n each(['graphic', 'dataLabel', 'connector', 'shadowGroup'], function(key) {\n if (point[key]) {\n point[key][vis ? 'show' : 'hide'](true);\n }\n });\n\n if (point.legendItem) {\n chart.legend.colorizeItem(point, vis);\n }\n\n // #4170, hide halo after hiding point\n if (!vis && point.state === 'hover') {\n point.setState('');\n }\n\n // Handle ignore hidden slices\n if (ignoreHiddenPoint) {\n series.isDirty = true;\n }\n\n if (redraw) {\n chart.redraw();\n }\n }\n },\n\n /**\n * Set or toggle whether the slice is cut out from the pie\n * @param {Boolean} sliced When undefined, the slice state is toggled\n * @param {Boolean} redraw Whether to redraw the chart. True by default.\n */\n slice: function(sliced, redraw, animation) {\n var point = this,\n series = point.series,\n chart = series.chart;\n\n setAnimation(animation, chart);\n\n // redraw is true by default\n redraw = pick(redraw, true);\n\n // if called without an argument, toggle\n point.sliced = point.options.sliced = sliced = defined(sliced) ? sliced : !point.sliced;\n series.options.data[inArray(point, series.data)] = point.options; // update userOptions.data\n\n point.graphic.animate(this.getTranslate());\n\n\n if (point.shadowGroup) {\n point.shadowGroup.animate(this.getTranslate());\n }\n\n },\n\n getTranslate: function() {\n return this.sliced ? this.slicedTranslation : {\n translateX: 0,\n translateY: 0\n };\n },\n\n haloPath: function(size) {\n var shapeArgs = this.shapeArgs;\n\n return this.sliced || !this.visible ? [] :\n this.series.chart.renderer.symbols.arc(\n shapeArgs.x,\n shapeArgs.y,\n shapeArgs.r + size,\n shapeArgs.r + size, {\n innerR: this.shapeArgs.r,\n start: shapeArgs.start,\n end: shapeArgs.end\n }\n );\n }\n });\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var addEvent = H.addEvent,\n arrayMax = H.arrayMax,\n defined = H.defined,\n each = H.each,\n extend = H.extend,\n format = H.format,\n map = H.map,\n merge = H.merge,\n noop = H.noop,\n pick = H.pick,\n relativeLength = H.relativeLength,\n Series = H.Series,\n seriesTypes = H.seriesTypes,\n stableSort = H.stableSort;\n\n\n /**\n * Generatl distribution algorithm for distributing labels of differing size along a\n * confined length in two dimensions. The algorithm takes an array of objects containing\n * a size, a target and a rank. It will place the labels as close as possible to their \n * targets, skipping the lowest ranked labels if necessary.\n */\n H.distribute = function(boxes, len) {\n\n var i,\n overlapping = true,\n origBoxes = boxes, // Original array will be altered with added .pos\n restBoxes = [], // The outranked overshoot\n box,\n target,\n total = 0;\n\n function sortByTarget(a, b) {\n return a.target - b.target;\n }\n\n // If the total size exceeds the len, remove those boxes with the lowest rank\n i = boxes.length;\n while (i--) {\n total += boxes[i].size;\n }\n\n // Sort by rank, then slice away overshoot\n if (total > len) {\n stableSort(boxes, function(a, b) {\n return (b.rank || 0) - (a.rank || 0);\n });\n i = 0;\n total = 0;\n while (total <= len) {\n total += boxes[i].size;\n i++;\n }\n restBoxes = boxes.splice(i - 1, boxes.length);\n }\n\n // Order by target\n stableSort(boxes, sortByTarget);\n\n\n // So far we have been mutating the original array. Now\n // create a copy with target arrays\n boxes = map(boxes, function(box) {\n return {\n size: box.size,\n targets: [box.target]\n };\n });\n\n while (overlapping) {\n // Initial positions: target centered in box\n i = boxes.length;\n while (i--) {\n box = boxes[i];\n // Composite box, average of targets\n target = (Math.min.apply(0, box.targets) + Math.max.apply(0, box.targets)) / 2;\n box.pos = Math.min(Math.max(0, target - box.size / 2), len - box.size);\n }\n\n // Detect overlap and join boxes\n i = boxes.length;\n overlapping = false;\n while (i--) {\n if (i > 0 && boxes[i - 1].pos + boxes[i - 1].size > boxes[i].pos) { // Overlap\n boxes[i - 1].size += boxes[i].size; // Add this size to the previous box\n boxes[i - 1].targets = boxes[i - 1].targets.concat(boxes[i].targets);\n\n // Overlapping right, push left\n if (boxes[i - 1].pos + boxes[i - 1].size > len) {\n boxes[i - 1].pos = len - boxes[i - 1].size;\n }\n boxes.splice(i, 1); // Remove this item\n overlapping = true;\n }\n }\n }\n\n // Now the composite boxes are placed, we need to put the original boxes within them\n i = 0;\n each(boxes, function(box) {\n var posInCompositeBox = 0;\n each(box.targets, function() {\n origBoxes[i].pos = box.pos + posInCompositeBox;\n posInCompositeBox += origBoxes[i].size;\n i++;\n });\n });\n\n // Add the rest (hidden) boxes and sort by target\n origBoxes.push.apply(origBoxes, restBoxes);\n stableSort(origBoxes, sortByTarget);\n };\n\n\n /**\n * Draw the data labels\n */\n Series.prototype.drawDataLabels = function() {\n var series = this,\n seriesOptions = series.options,\n options = seriesOptions.dataLabels,\n points = series.points,\n pointOptions,\n generalOptions,\n hasRendered = series.hasRendered || 0,\n str,\n dataLabelsGroup,\n defer = pick(options.defer, !!seriesOptions.animation),\n renderer = series.chart.renderer;\n\n if (options.enabled || series._hasPointLabels) {\n\n // Process default alignment of data labels for columns\n if (series.dlProcessOptions) {\n series.dlProcessOptions(options);\n }\n\n // Create a separate group for the data labels to avoid rotation\n dataLabelsGroup = series.plotGroup(\n 'dataLabelsGroup',\n 'data-labels',\n defer && !hasRendered ? 'hidden' : 'visible', // #5133\n options.zIndex || 6\n );\n\n if (defer) {\n dataLabelsGroup.attr({\n opacity: +hasRendered\n }); // #3300\n if (!hasRendered) {\n addEvent(series, 'afterAnimate', function() {\n if (series.visible) { // #2597, #3023, #3024\n dataLabelsGroup.show(true);\n }\n dataLabelsGroup[seriesOptions.animation ? 'animate' : 'attr']({\n opacity: 1\n }, {\n duration: 200\n });\n });\n }\n }\n\n // Make the labels for each point\n generalOptions = options;\n each(points, function(point) {\n var enabled,\n dataLabel = point.dataLabel,\n labelConfig,\n attr,\n rotation,\n connector = point.connector,\n isNew = !dataLabel,\n style;\n // Determine if each data label is enabled\n // @note dataLabelAttribs (like pointAttribs) would eradicate\n // the need for dlOptions, and simplify the section below.\n pointOptions = point.dlOptions || (point.options && point.options.dataLabels); // dlOptions is used in treemaps\n enabled = pick(pointOptions && pointOptions.enabled, generalOptions.enabled) && point.y !== null; // #2282, #4641\n if (enabled) {\n // Create individual options structure that can be extended without\n // affecting others\n options = merge(generalOptions, pointOptions);\n labelConfig = point.getLabelConfig();\n str = options.format ?\n format(options.format, labelConfig) :\n options.formatter.call(labelConfig, options);\n style = options.style;\n rotation = options.rotation;\n\n // Determine the color\n style.color = pick(options.color, style.color, series.color, '#000000');\n // Get automated contrast color\n if (style.color === 'contrast') {\n point.contrastColor = renderer.getContrast(point.color || series.color);\n style.color = options.inside || pick(point.labelDistance, options.distance) < 0 ||\n !!seriesOptions.stacking ? point.contrastColor : '#000000';\n }\n if (seriesOptions.cursor) {\n style.cursor = seriesOptions.cursor;\n }\n\n\n attr = {\n //align: align,\n\n fill: options.backgroundColor,\n stroke: options.borderColor,\n 'stroke-width': options.borderWidth,\n\n r: options.borderRadius || 0,\n rotation: rotation,\n padding: options.padding,\n zIndex: 1\n };\n\n // Remove unused attributes (#947)\n H.objectEach(attr, function(val, name) {\n if (val === undefined) {\n delete attr[name];\n }\n });\n }\n // If the point is outside the plot area, destroy it. #678, #820\n if (dataLabel && (!enabled || !defined(str))) {\n point.dataLabel = dataLabel = dataLabel.destroy();\n if (connector) {\n point.connector = connector.destroy();\n }\n // Individual labels are disabled if the are explicitly disabled\n // in the point options, or if they fall outside the plot area.\n } else if (enabled && defined(str)) {\n // create new label\n if (!dataLabel) {\n dataLabel = point.dataLabel = renderer[rotation ? 'text' : 'label']( // labels don't support rotation\n str,\n 0, -9999,\n options.shape,\n null,\n null,\n options.useHTML,\n null,\n 'data-label'\n );\n dataLabel.addClass(\n 'highcharts-data-label-color-' + point.colorIndex +\n ' ' + (options.className || '') +\n (options.useHTML ? 'highcharts-tracker' : '') // #3398\n );\n } else {\n attr.text = str;\n }\n dataLabel.attr(attr);\n\n // Styles must be applied before add in order to read text bounding box\n dataLabel.css(style).shadow(options.shadow);\n\n\n if (!dataLabel.added) {\n dataLabel.add(dataLabelsGroup);\n }\n // Now the data label is created and placed at 0,0, so we need to align it\n series.alignDataLabel(point, dataLabel, options, null, isNew);\n }\n });\n }\n };\n\n /**\n * Align each individual data label\n */\n Series.prototype.alignDataLabel = function(point, dataLabel, options, alignTo, isNew) {\n var chart = this.chart,\n inverted = chart.inverted,\n plotX = pick(point.plotX, -9999),\n plotY = pick(point.plotY, -9999),\n bBox = dataLabel.getBBox(),\n fontSize,\n baseline,\n rotation = options.rotation,\n normRotation,\n negRotation,\n align = options.align,\n rotCorr, // rotation correction\n // Math.round for rounding errors (#2683), alignTo to allow column labels (#2700)\n visible =\n this.visible &&\n (\n point.series.forceDL ||\n chart.isInsidePlot(plotX, Math.round(plotY), inverted) ||\n (\n alignTo && chart.isInsidePlot(\n plotX,\n inverted ? alignTo.x + 1 : alignTo.y + alignTo.height - 1,\n inverted\n )\n )\n ),\n alignAttr, // the final position;\n justify = pick(options.overflow, 'justify') === 'justify';\n\n if (visible) {\n\n\n fontSize = options.style.fontSize;\n\n\n baseline = chart.renderer.fontMetrics(fontSize, dataLabel).b;\n\n // The alignment box is a singular point\n alignTo = extend({\n x: inverted ? chart.plotWidth - plotY : plotX,\n y: Math.round(inverted ? chart.plotHeight - plotX : plotY),\n width: 0,\n height: 0\n }, alignTo);\n\n // Add the text size for alignment calculation\n extend(options, {\n width: bBox.width,\n height: bBox.height\n });\n\n // Allow a hook for changing alignment in the last moment, then do the alignment\n if (rotation) {\n justify = false; // Not supported for rotated text\n rotCorr = chart.renderer.rotCorr(baseline, rotation); // #3723\n alignAttr = {\n x: alignTo.x + options.x + alignTo.width / 2 + rotCorr.x,\n y: alignTo.y + options.y + {\n top: 0,\n middle: 0.5,\n bottom: 1\n }[options.verticalAlign] * alignTo.height\n };\n dataLabel[isNew ? 'attr' : 'animate'](alignAttr)\n .attr({ // #3003\n align: align\n });\n\n // Compensate for the rotated label sticking out on the sides\n normRotation = (rotation + 720) % 360;\n negRotation = normRotation > 180 && normRotation < 360;\n\n if (align === 'left') {\n alignAttr.y -= negRotation ? bBox.height : 0;\n } else if (align === 'center') {\n alignAttr.x -= bBox.width / 2;\n alignAttr.y -= bBox.height / 2;\n } else if (align === 'right') {\n alignAttr.x -= bBox.width;\n alignAttr.y -= negRotation ? 0 : bBox.height;\n }\n\n\n } else {\n dataLabel.align(options, null, alignTo);\n alignAttr = dataLabel.alignAttr;\n }\n\n // Handle justify or crop\n if (justify) {\n point.isLabelJustified = this.justifyDataLabel(\n dataLabel,\n options,\n alignAttr,\n bBox,\n alignTo,\n isNew\n );\n\n // Now check that the data label is within the plot area\n } else if (pick(options.crop, true)) {\n visible = chart.isInsidePlot(alignAttr.x, alignAttr.y) && chart.isInsidePlot(alignAttr.x + bBox.width, alignAttr.y + bBox.height);\n }\n\n // When we're using a shape, make it possible with a connector or an arrow pointing to thie point\n if (options.shape && !rotation) {\n dataLabel[isNew ? 'attr' : 'animate']({\n anchorX: inverted ? chart.plotWidth - point.plotY : point.plotX,\n anchorY: inverted ? chart.plotHeight - point.plotX : point.plotY\n });\n }\n }\n\n // Show or hide based on the final aligned position\n if (!visible) {\n dataLabel.attr({\n y: -9999\n });\n dataLabel.placed = false; // don't animate back in\n }\n\n };\n\n /**\n * If data labels fall partly outside the plot area, align them back in, in a way that\n * doesn't hide the point.\n */\n Series.prototype.justifyDataLabel = function(dataLabel, options, alignAttr, bBox, alignTo, isNew) {\n var chart = this.chart,\n align = options.align,\n verticalAlign = options.verticalAlign,\n off,\n justified,\n padding = dataLabel.box ? 0 : (dataLabel.padding || 0);\n\n // Off left\n off = alignAttr.x + padding;\n if (off < 0) {\n if (align === 'right') {\n options.align = 'left';\n } else {\n options.x = -off;\n }\n justified = true;\n }\n\n // Off right\n off = alignAttr.x + bBox.width - padding;\n if (off > chart.plotWidth) {\n if (align === 'left') {\n options.align = 'right';\n } else {\n options.x = chart.plotWidth - off;\n }\n justified = true;\n }\n\n // Off top\n off = alignAttr.y + padding;\n if (off < 0) {\n if (verticalAlign === 'bottom') {\n options.verticalAlign = 'top';\n } else {\n options.y = -off;\n }\n justified = true;\n }\n\n // Off bottom\n off = alignAttr.y + bBox.height - padding;\n if (off > chart.plotHeight) {\n if (verticalAlign === 'top') {\n options.verticalAlign = 'bottom';\n } else {\n options.y = chart.plotHeight - off;\n }\n justified = true;\n }\n\n if (justified) {\n dataLabel.placed = !isNew;\n dataLabel.align(options, null, alignTo);\n }\n\n return justified;\n };\n\n /**\n * Override the base drawDataLabels method by pie specific functionality\n */\n if (seriesTypes.pie) {\n seriesTypes.pie.prototype.drawDataLabels = function() {\n var series = this,\n data = series.data,\n point,\n chart = series.chart,\n options = series.options.dataLabels,\n connectorPadding = pick(options.connectorPadding, 10),\n connectorWidth = pick(options.connectorWidth, 1),\n plotWidth = chart.plotWidth,\n plotHeight = chart.plotHeight,\n connector,\n seriesCenter = series.center,\n radius = seriesCenter[2] / 2,\n centerY = seriesCenter[1],\n dataLabel,\n dataLabelWidth,\n labelPos,\n labelHeight,\n halves = [ // divide the points into right and left halves for anti collision\n [], // right\n [] // left\n ],\n x,\n y,\n visibility,\n j,\n overflow = [0, 0, 0, 0]; // top, right, bottom, left\n\n // get out if not enabled\n if (!series.visible || (!options.enabled && !series._hasPointLabels)) {\n return;\n }\n\n // Reset all labels that have been shortened\n each(data, function(point) {\n if (point.dataLabel && point.visible && point.dataLabel.shortened) {\n point.dataLabel\n .attr({\n width: 'auto'\n }).css({\n width: 'auto',\n textOverflow: 'clip'\n });\n point.dataLabel.shortened = false;\n }\n });\n\n\n // run parent method\n Series.prototype.drawDataLabels.apply(series);\n\n each(data, function(point) {\n if (point.dataLabel && point.visible) { // #407, #2510\n\n // Arrange points for detection collision\n halves[point.half].push(point);\n\n // Reset positions (#4905)\n point.dataLabel._pos = null;\n }\n });\n\n /* Loop over the points in each half, starting from the top and bottom\n * of the pie to detect overlapping labels.\n */\n each(halves, function(points, i) {\n\n var top,\n bottom,\n length = points.length,\n positions = [],\n naturalY,\n sideOverflow,\n positionsIndex, // Point index in positions array.\n size;\n\n if (!length) {\n return;\n }\n\n // Sort by angle\n series.sortByAngle(points, i - 0.5);\n // Only do anti-collision when we have dataLabels outside the pie \n // and have connectors. (#856)\n if (series.maxLabelDistance > 0) {\n top = Math.max(\n 0,\n centerY - radius - series.maxLabelDistance\n );\n bottom = Math.min(\n centerY + radius + series.maxLabelDistance,\n chart.plotHeight\n );\n each(points, function(point) {\n // check if specific points' label is outside the pie\n if (point.labelDistance > 0 && point.dataLabel) {\n // point.top depends on point.labelDistance value\n // Used for calculation of y value in getX method \n point.top = Math.max(\n 0,\n centerY - radius - point.labelDistance\n );\n point.bottom = Math.min(\n centerY + radius + point.labelDistance,\n chart.plotHeight\n );\n size = point.dataLabel.getBBox().height || 21;\n\n // point.positionsIndex is needed for getting index of \n // parameter related to specific point inside positions \n // array - not every point is in positions array.\n point.positionsIndex = positions.push({\n target: point.labelPos[1] - point.top + size / 2,\n size: size,\n rank: point.y\n }) - 1;\n }\n });\n H.distribute(positions, bottom + size - top);\n }\n\n // Now the used slots are sorted, fill them up sequentially\n for (j = 0; j < length; j++) {\n\n point = points[j];\n positionsIndex = point.positionsIndex;\n labelPos = point.labelPos;\n dataLabel = point.dataLabel;\n visibility = point.visible === false ? 'hidden' : 'inherit';\n naturalY = labelPos[1];\n\n if (positions && defined(positions[positionsIndex])) {\n if (positions[positionsIndex].pos === undefined) {\n visibility = 'hidden';\n } else {\n labelHeight = positions[positionsIndex].size;\n y = point.top + positions[positionsIndex].pos;\n }\n\n } else {\n y = naturalY;\n }\n\n // It is needed to delete point.positionIndex for \n // dynamically added points etc.\n\n delete point.positionIndex;\n\n // get the x - use the natural x position for labels near the \n // top and bottom, to prevent the top and botton slice connectors \n // from touching each other on either side\n if (options.justify) {\n x = seriesCenter[0] + (i ? -1 : 1) * (radius + point.labelDistance);\n } else {\n x = series.getX(y < point.top + 2 || y > point.bottom - 2 ? naturalY : y, i, point);\n }\n\n\n // Record the placement and visibility\n dataLabel._attr = {\n visibility: visibility,\n align: labelPos[6]\n };\n dataLabel._pos = {\n x: x + options.x +\n ({\n left: connectorPadding,\n right: -connectorPadding\n }[labelPos[6]] || 0),\n y: y + options.y - 10 // 10 is for the baseline (label vs text)\n };\n labelPos.x = x;\n labelPos.y = y;\n\n\n // Detect overflowing data labels\n dataLabelWidth = dataLabel.getBBox().width;\n\n sideOverflow = null;\n // Overflow left\n if (x - dataLabelWidth < connectorPadding) {\n sideOverflow = Math.round(\n dataLabelWidth - x + connectorPadding\n );\n overflow[3] = Math.max(sideOverflow, overflow[3]);\n\n // Overflow right\n } else if (x + dataLabelWidth > plotWidth - connectorPadding) {\n sideOverflow = Math.round(\n x + dataLabelWidth - plotWidth + connectorPadding\n );\n overflow[1] = Math.max(sideOverflow, overflow[1]);\n }\n\n // Overflow top\n if (y - labelHeight / 2 < 0) {\n overflow[0] = Math.max(\n Math.round(-y + labelHeight / 2),\n overflow[0]\n );\n\n // Overflow left\n } else if (y + labelHeight / 2 > plotHeight) {\n overflow[2] = Math.max(\n Math.round(y + labelHeight / 2 - plotHeight),\n overflow[2]\n );\n }\n dataLabel.sideOverflow = sideOverflow;\n } // for each point\n }); // for each half\n\n // Do not apply the final placement and draw the connectors until we have verified\n // that labels are not spilling over.\n if (arrayMax(overflow) === 0 || this.verifyDataLabelOverflow(overflow)) {\n\n // Place the labels in the final position\n this.placeDataLabels();\n\n // Draw the connectors\n if (connectorWidth) {\n each(this.points, function(point) {\n var isNew;\n\n connector = point.connector;\n dataLabel = point.dataLabel;\n\n if (\n dataLabel &&\n dataLabel._pos &&\n point.visible &&\n point.labelDistance > 0\n ) {\n visibility = dataLabel._attr.visibility;\n\n isNew = !connector;\n\n if (isNew) {\n point.connector = connector = chart.renderer.path()\n .addClass('highcharts-data-label-connector highcharts-color-' + point.colorIndex)\n .add(series.dataLabelsGroup);\n\n\n connector.attr({\n 'stroke-width': connectorWidth,\n 'stroke': options.connectorColor || point.color || '#666666'\n });\n\n }\n connector[isNew ? 'attr' : 'animate']({\n d: series.connectorPath(point.labelPos)\n });\n connector.attr('visibility', visibility);\n\n } else if (connector) {\n point.connector = connector.destroy();\n }\n });\n }\n }\n };\n\n /**\n * Extendable method for getting the path of the connector between the data label\n * and the pie slice.\n */\n seriesTypes.pie.prototype.connectorPath = function(labelPos) {\n var x = labelPos.x,\n y = labelPos.y;\n return pick(this.options.dataLabels.softConnector, true) ? [\n 'M',\n x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label\n 'C',\n x, y, // first break, next to the label\n 2 * labelPos[2] - labelPos[4], 2 * labelPos[3] - labelPos[5],\n labelPos[2], labelPos[3], // second break\n 'L',\n labelPos[4], labelPos[5] // base\n ] : [\n 'M',\n x + (labelPos[6] === 'left' ? 5 : -5), y, // end of the string at the label\n 'L',\n labelPos[2], labelPos[3], // second break\n 'L',\n labelPos[4], labelPos[5] // base\n ];\n };\n\n /**\n * Perform the final placement of the data labels after we have verified that they\n * fall within the plot area.\n */\n seriesTypes.pie.prototype.placeDataLabels = function() {\n each(this.points, function(point) {\n var dataLabel = point.dataLabel,\n _pos;\n if (dataLabel && point.visible) {\n _pos = dataLabel._pos;\n if (_pos) {\n\n // Shorten data labels with ellipsis if they still overflow\n // after the pie has reached minSize (#223).\n if (dataLabel.sideOverflow) {\n dataLabel._attr.width =\n dataLabel.getBBox().width - dataLabel.sideOverflow;\n dataLabel.css({\n width: dataLabel._attr.width + 'px',\n textOverflow: 'ellipsis'\n });\n dataLabel.shortened = true;\n }\n\n dataLabel.attr(dataLabel._attr);\n dataLabel[dataLabel.moved ? 'animate' : 'attr'](_pos);\n dataLabel.moved = true;\n } else if (dataLabel) {\n dataLabel.attr({\n y: -9999\n });\n }\n }\n }, this);\n };\n\n seriesTypes.pie.prototype.alignDataLabel = noop;\n\n /**\n * Verify whether the data labels are allowed to draw, or we should run more translation and data\n * label positioning to keep them inside the plot area. Returns true when data labels are ready\n * to draw.\n */\n seriesTypes.pie.prototype.verifyDataLabelOverflow = function(overflow) {\n\n var center = this.center,\n options = this.options,\n centerOption = options.center,\n minSize = options.minSize || 80,\n newSize = minSize,\n // If a size is set, return true and don't try to shrink the pie\n // to fit the labels.\n ret = options.size !== null;\n\n if (!ret) {\n // Handle horizontal size and center\n if (centerOption[0] !== null) { // Fixed center\n newSize = Math.max(center[2] -\n Math.max(overflow[1], overflow[3]), minSize);\n\n } else { // Auto center\n newSize = Math.max(\n // horizontal overflow\n center[2] - overflow[1] - overflow[3],\n minSize\n );\n // horizontal center\n center[0] += (overflow[3] - overflow[1]) / 2;\n }\n\n // Handle vertical size and center\n if (centerOption[1] !== null) { // Fixed center\n newSize = Math.max(Math.min(newSize, center[2] -\n Math.max(overflow[0], overflow[2])), minSize);\n\n } else { // Auto center\n newSize = Math.max(\n Math.min(\n newSize,\n // vertical overflow\n center[2] - overflow[0] - overflow[2]\n ),\n minSize\n );\n // vertical center\n center[1] += (overflow[0] - overflow[2]) / 2;\n }\n\n // If the size must be decreased, we need to run translate and\n // drawDataLabels again\n if (newSize < center[2]) {\n center[2] = newSize;\n center[3] = Math.min( // #3632\n relativeLength(options.innerSize || 0, newSize),\n newSize\n );\n this.translate(center);\n\n if (this.drawDataLabels) {\n this.drawDataLabels();\n }\n // Else, return true to indicate that the pie and its labels is\n // within the plot area\n } else {\n ret = true;\n }\n }\n return ret;\n };\n }\n\n if (seriesTypes.column) {\n\n /**\n * Override the basic data label alignment by adjusting for the position of the column\n */\n seriesTypes.column.prototype.alignDataLabel = function(point, dataLabel, options, alignTo, isNew) {\n var inverted = this.chart.inverted,\n series = point.series,\n dlBox = point.dlBox || point.shapeArgs, // data label box for alignment\n below = pick(point.below, point.plotY > pick(this.translatedThreshold, series.yAxis.len)), // point.below is used in range series\n inside = pick(options.inside, !!this.options.stacking), // draw it inside the box?\n overshoot;\n\n // Align to the column itself, or the top of it\n if (dlBox) { // Area range uses this method but not alignTo\n alignTo = merge(dlBox);\n\n if (alignTo.y < 0) {\n alignTo.height += alignTo.y;\n alignTo.y = 0;\n }\n overshoot = alignTo.y + alignTo.height - series.yAxis.len;\n if (overshoot > 0) {\n alignTo.height -= overshoot;\n }\n\n if (inverted) {\n alignTo = {\n x: series.yAxis.len - alignTo.y - alignTo.height,\n y: series.xAxis.len - alignTo.x - alignTo.width,\n width: alignTo.height,\n height: alignTo.width\n };\n }\n\n // Compute the alignment box\n if (!inside) {\n if (inverted) {\n alignTo.x += below ? 0 : alignTo.width;\n alignTo.width = 0;\n } else {\n alignTo.y += below ? alignTo.height : 0;\n alignTo.height = 0;\n }\n }\n }\n\n\n // When alignment is undefined (typically columns and bars), display the individual\n // point below or above the point depending on the threshold\n options.align = pick(\n options.align, !inverted || inside ? 'center' : below ? 'right' : 'left'\n );\n options.verticalAlign = pick(\n options.verticalAlign,\n inverted || inside ? 'middle' : below ? 'top' : 'bottom'\n );\n\n // Call the parent method\n Series.prototype.alignDataLabel.call(this, point, dataLabel, options, alignTo, isNew);\n\n // If label was justified and we have contrast, set it:\n if (point.isLabelJustified && point.contrastColor) {\n point.dataLabel.css({\n color: point.contrastColor\n });\n }\n };\n }\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2009-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n /**\n * Highcharts module to hide overlapping data labels. This module is included in\n * Highcharts.\n */\n var Chart = H.Chart,\n each = H.each,\n pick = H.pick,\n addEvent = H.addEvent;\n\n // Collect potensial overlapping data labels. Stack labels probably don't need\n // to be considered because they are usually accompanied by data labels that lie\n // inside the columns.\n Chart.prototype.callbacks.push(function(chart) {\n function collectAndHide() {\n var labels = [];\n\n each(chart.series || [], function(series) {\n var dlOptions = series.options.dataLabels,\n // Range series have two collections\n collections = series.dataLabelCollections || ['dataLabel'];\n\n if (\n (dlOptions.enabled || series._hasPointLabels) &&\n !dlOptions.allowOverlap &&\n series.visible\n ) { // #3866\n each(collections, function(coll) {\n each(series.points, function(point) {\n if (point[coll]) {\n point[coll].labelrank = pick(\n point.labelrank,\n point.shapeArgs && point.shapeArgs.height\n ); // #4118\n labels.push(point[coll]);\n }\n });\n });\n }\n });\n chart.hideOverlappingLabels(labels);\n }\n\n // Do it now ...\n collectAndHide();\n\n // ... and after each chart redraw\n addEvent(chart, 'redraw', collectAndHide);\n\n });\n\n /**\n * Hide overlapping labels. Labels are moved and faded in and out on zoom to\n * provide a smooth visual imression.\n */\n Chart.prototype.hideOverlappingLabels = function(labels) {\n\n var len = labels.length,\n label,\n i,\n j,\n label1,\n label2,\n isIntersecting,\n pos1,\n pos2,\n parent1,\n parent2,\n padding,\n intersectRect = function(x1, y1, w1, h1, x2, y2, w2, h2) {\n return !(\n x2 > x1 + w1 ||\n x2 + w2 < x1 ||\n y2 > y1 + h1 ||\n y2 + h2 < y1\n );\n };\n\n // Mark with initial opacity\n for (i = 0; i < len; i++) {\n label = labels[i];\n if (label) {\n label.oldOpacity = label.opacity;\n label.newOpacity = 1;\n }\n }\n\n // Prevent a situation in a gradually rising slope, that each label will\n // hide the previous one because the previous one always has lower rank.\n labels.sort(function(a, b) {\n return (b.labelrank || 0) - (a.labelrank || 0);\n });\n\n // Detect overlapping labels\n for (i = 0; i < len; i++) {\n label1 = labels[i];\n\n for (j = i + 1; j < len; ++j) {\n label2 = labels[j];\n if (\n label1 && label2 &&\n label1 !== label2 && // #6465, polar chart with connectEnds\n label1.placed && label2.placed &&\n label1.newOpacity !== 0 && label2.newOpacity !== 0\n ) {\n pos1 = label1.alignAttr;\n pos2 = label2.alignAttr;\n // Different panes have different positions\n parent1 = label1.parentGroup;\n parent2 = label2.parentGroup;\n // Substract the padding if no background or border (#4333)\n padding = 2 * (label1.box ? 0 : label1.padding);\n isIntersecting = intersectRect(\n pos1.x + parent1.translateX,\n pos1.y + parent1.translateY,\n label1.width - padding,\n label1.height - padding,\n pos2.x + parent2.translateX,\n pos2.y + parent2.translateY,\n label2.width - padding,\n label2.height - padding\n );\n\n if (isIntersecting) {\n (label1.labelrank < label2.labelrank ? label1 : label2)\n .newOpacity = 0;\n }\n }\n }\n }\n\n // Hide or show\n each(labels, function(label) {\n var complete,\n newOpacity;\n\n if (label) {\n newOpacity = label.newOpacity;\n\n if (label.oldOpacity !== newOpacity && label.placed) {\n\n // Make sure the label is completely hidden to avoid catching\n // clicks (#4362)\n if (newOpacity) {\n label.show(true);\n } else {\n complete = function() {\n label.hide();\n };\n }\n\n // Animate or set the opacity \n label.alignAttr.opacity = newOpacity;\n label[label.isOld ? 'animate' : 'attr'](\n label.alignAttr,\n null,\n complete\n );\n\n }\n label.isOld = true;\n }\n });\n };\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var addEvent = H.addEvent,\n Chart = H.Chart,\n createElement = H.createElement,\n css = H.css,\n defaultOptions = H.defaultOptions,\n defaultPlotOptions = H.defaultPlotOptions,\n each = H.each,\n extend = H.extend,\n fireEvent = H.fireEvent,\n hasTouch = H.hasTouch,\n inArray = H.inArray,\n isObject = H.isObject,\n Legend = H.Legend,\n merge = H.merge,\n pick = H.pick,\n Point = H.Point,\n Series = H.Series,\n seriesTypes = H.seriesTypes,\n svg = H.svg,\n TrackerMixin;\n\n /**\n * TrackerMixin for points and graphs.\n *\n * @mixin\n */\n TrackerMixin = H.TrackerMixin = {\n\n /**\n * Draw the tracker for a point.\n */\n drawTrackerPoint: function() {\n var series = this,\n chart = series.chart,\n pointer = chart.pointer,\n onMouseOver = function(e) {\n var point = pointer.getPointFromEvent(e);\n // undefined on graph in scatterchart\n if (point !== undefined) {\n pointer.isDirectTouch = true;\n point.onMouseOver(e);\n }\n };\n\n // Add reference to the point\n each(series.points, function(point) {\n if (point.graphic) {\n point.graphic.element.point = point;\n }\n if (point.dataLabel) {\n if (point.dataLabel.div) {\n point.dataLabel.div.point = point;\n } else {\n point.dataLabel.element.point = point;\n }\n }\n });\n\n // Add the event listeners, we need to do this only once\n if (!series._hasTracking) {\n each(series.trackerGroups, function(key) {\n if (series[key]) { // we don't always have dataLabelsGroup\n series[key]\n .addClass('highcharts-tracker')\n .on('mouseover', onMouseOver)\n .on('mouseout', function(e) {\n pointer.onTrackerMouseOut(e);\n });\n if (hasTouch) {\n series[key].on('touchstart', onMouseOver);\n }\n\n\n if (series.options.cursor) {\n series[key]\n .css(css)\n .css({\n cursor: series.options.cursor\n });\n }\n\n }\n });\n series._hasTracking = true;\n }\n },\n\n /**\n * Draw the tracker object that sits above all data labels and markers to\n * track mouse events on the graph or points. For the line type charts\n * the tracker uses the same graphPath, but with a greater stroke width\n * for better control.\n */\n drawTrackerGraph: function() {\n var series = this,\n options = series.options,\n trackByArea = options.trackByArea,\n trackerPath = [].concat(trackByArea ? series.areaPath : series.graphPath),\n trackerPathLength = trackerPath.length,\n chart = series.chart,\n pointer = chart.pointer,\n renderer = chart.renderer,\n snap = chart.options.tooltip.snap,\n tracker = series.tracker,\n i,\n onMouseOver = function() {\n if (chart.hoverSeries !== series) {\n series.onMouseOver();\n }\n },\n /*\n * Empirical lowest possible opacities for TRACKER_FILL for an element to stay invisible but clickable\n * IE6: 0.002\n * IE7: 0.002\n * IE8: 0.002\n * IE9: 0.00000000001 (unlimited)\n * IE10: 0.0001 (exporting only)\n * FF: 0.00000000001 (unlimited)\n * Chrome: 0.000001\n * Safari: 0.000001\n * Opera: 0.00000000001 (unlimited)\n */\n TRACKER_FILL = 'rgba(192,192,192,' + (svg ? 0.0001 : 0.002) + ')';\n\n // Extend end points. A better way would be to use round linecaps,\n // but those are not clickable in VML.\n if (trackerPathLength && !trackByArea) {\n i = trackerPathLength + 1;\n while (i--) {\n if (trackerPath[i] === 'M') { // extend left side\n trackerPath.splice(i + 1, 0, trackerPath[i + 1] - snap, trackerPath[i + 2], 'L');\n }\n if ((i && trackerPath[i] === 'M') || i === trackerPathLength) { // extend right side\n trackerPath.splice(i, 0, 'L', trackerPath[i - 2] + snap, trackerPath[i - 1]);\n }\n }\n }\n\n // handle single points\n /*for (i = 0; i < singlePoints.length; i++) {\n singlePoint = singlePoints[i];\n trackerPath.push(M, singlePoint.plotX - snap, singlePoint.plotY,\n L, singlePoint.plotX + snap, singlePoint.plotY);\n }*/\n\n // draw the tracker\n if (tracker) {\n tracker.attr({\n d: trackerPath\n });\n } else if (series.graph) { // create\n\n series.tracker = renderer.path(trackerPath)\n .attr({\n 'stroke-linejoin': 'round', // #1225\n visibility: series.visible ? 'visible' : 'hidden',\n stroke: TRACKER_FILL,\n fill: trackByArea ? TRACKER_FILL : 'none',\n 'stroke-width': series.graph.strokeWidth() + (trackByArea ? 0 : 2 * snap),\n zIndex: 2\n })\n .add(series.group);\n\n // The tracker is added to the series group, which is clipped, but is covered\n // by the marker group. So the marker group also needs to capture events.\n each([series.tracker, series.markerGroup], function(tracker) {\n tracker.addClass('highcharts-tracker')\n .on('mouseover', onMouseOver)\n .on('mouseout', function(e) {\n pointer.onTrackerMouseOut(e);\n });\n\n\n if (options.cursor) {\n tracker.css({\n cursor: options.cursor\n });\n }\n\n\n if (hasTouch) {\n tracker.on('touchstart', onMouseOver);\n }\n });\n }\n }\n };\n /* End TrackerMixin */\n\n\n /**\n * Add tracking event listener to the series group, so the point graphics\n * themselves act as trackers\n */\n\n if (seriesTypes.column) {\n seriesTypes.column.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n }\n\n if (seriesTypes.pie) {\n seriesTypes.pie.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n }\n\n if (seriesTypes.scatter) {\n seriesTypes.scatter.prototype.drawTracker = TrackerMixin.drawTrackerPoint;\n }\n\n /*\n * Extend Legend for item events\n */\n extend(Legend.prototype, {\n\n setItemEvents: function(item, legendItem, useHTML) {\n var legend = this,\n boxWrapper = legend.chart.renderer.boxWrapper,\n activeClass = 'highcharts-legend-' + (item.series ? 'point' : 'series') + '-active';\n\n // Set the events on the item group, or in case of useHTML, the item itself (#1249)\n (useHTML ? legendItem : item.legendGroup).on('mouseover', function() {\n item.setState('hover');\n\n // A CSS class to dim or hide other than the hovered series\n boxWrapper.addClass(activeClass);\n\n\n legendItem.css(legend.options.itemHoverStyle);\n\n })\n .on('mouseout', function() {\n\n legendItem.css(merge(item.visible ? legend.itemStyle : legend.itemHiddenStyle));\n\n\n // A CSS class to dim or hide other than the hovered series\n boxWrapper.removeClass(activeClass);\n\n item.setState();\n })\n .on('click', function(event) {\n var strLegendItemClick = 'legendItemClick',\n fnLegendItemClick = function() {\n if (item.setVisible) {\n item.setVisible();\n }\n };\n\n // Pass over the click/touch event. #4.\n event = {\n browserEvent: event\n };\n\n // click the name or symbol\n if (item.firePointEvent) { // point\n item.firePointEvent(strLegendItemClick, event, fnLegendItemClick);\n } else {\n fireEvent(item, strLegendItemClick, event, fnLegendItemClick);\n }\n });\n },\n\n createCheckboxForItem: function(item) {\n var legend = this;\n\n item.checkbox = createElement('input', {\n type: 'checkbox',\n checked: item.selected,\n defaultChecked: item.selected // required by IE7\n }, legend.options.itemCheckboxStyle, legend.chart.container);\n\n addEvent(item.checkbox, 'click', function(event) {\n var target = event.target;\n fireEvent(\n item.series || item,\n 'checkboxClick', { // #3712\n checked: target.checked,\n item: item\n },\n function() {\n item.select();\n }\n );\n });\n }\n });\n\n\n\n // Add pointer cursor to legend itemstyle in defaultOptions\n defaultOptions.legend.itemStyle.cursor = 'pointer';\n\n\n\n /*\n * Extend the Chart object with interaction\n */\n\n extend(Chart.prototype, /** @lends Chart.prototype */ {\n /**\n * Display the zoom button\n */\n showResetZoom: function() {\n var chart = this,\n lang = defaultOptions.lang,\n btnOptions = chart.options.chart.resetZoomButton,\n theme = btnOptions.theme,\n states = theme.states,\n alignTo = btnOptions.relativeTo === 'chart' ? null : 'plotBox';\n\n function zoomOut() {\n chart.zoomOut();\n }\n\n this.resetZoomButton = chart.renderer.button(lang.resetZoom, null, null, zoomOut, theme, states && states.hover)\n .attr({\n align: btnOptions.position.align,\n title: lang.resetZoomTitle\n })\n .addClass('highcharts-reset-zoom')\n .add()\n .align(btnOptions.position, false, alignTo);\n\n },\n\n /**\n * Zoom out to 1:1\n */\n zoomOut: function() {\n var chart = this;\n fireEvent(chart, 'selection', {\n resetSelection: true\n }, function() {\n chart.zoom();\n });\n },\n\n /**\n * Zoom into a given portion of the chart given by axis coordinates\n * @param {Object} event\n */\n zoom: function(event) {\n var chart = this,\n hasZoomed,\n pointer = chart.pointer,\n displayButton = false,\n resetZoomButton;\n\n // If zoom is called with no arguments, reset the axes\n if (!event || event.resetSelection) {\n each(chart.axes, function(axis) {\n hasZoomed = axis.zoom();\n });\n } else { // else, zoom in on all axes\n each(event.xAxis.concat(event.yAxis), function(axisData) {\n var axis = axisData.axis,\n isXAxis = axis.isXAxis;\n\n // don't zoom more than minRange\n if (pointer[isXAxis ? 'zoomX' : 'zoomY']) {\n hasZoomed = axis.zoom(axisData.min, axisData.max);\n if (axis.displayBtn) {\n displayButton = true;\n }\n }\n });\n }\n\n // Show or hide the Reset zoom button\n resetZoomButton = chart.resetZoomButton;\n if (displayButton && !resetZoomButton) {\n chart.showResetZoom();\n } else if (!displayButton && isObject(resetZoomButton)) {\n chart.resetZoomButton = resetZoomButton.destroy();\n }\n\n\n // Redraw\n if (hasZoomed) {\n chart.redraw(\n pick(chart.options.chart.animation, event && event.animation, chart.pointCount < 100) // animation\n );\n }\n },\n\n /**\n * Pan the chart by dragging the mouse across the pane. This function is called\n * on mouse move, and the distance to pan is computed from chartX compared to\n * the first chartX position in the dragging operation.\n */\n pan: function(e, panning) {\n\n var chart = this,\n hoverPoints = chart.hoverPoints,\n doRedraw;\n\n // remove active points for shared tooltip\n if (hoverPoints) {\n each(hoverPoints, function(point) {\n point.setState();\n });\n }\n\n each(panning === 'xy' ? [1, 0] : [1], function(isX) { // xy is used in maps\n var axis = chart[isX ? 'xAxis' : 'yAxis'][0],\n horiz = axis.horiz,\n mousePos = e[horiz ? 'chartX' : 'chartY'],\n mouseDown = horiz ? 'mouseDownX' : 'mouseDownY',\n startPos = chart[mouseDown],\n halfPointRange = (axis.pointRange || 0) / 2,\n extremes = axis.getExtremes(),\n panMin = axis.toValue(startPos - mousePos, true) +\n halfPointRange,\n panMax = axis.toValue(startPos + axis.len - mousePos, true) -\n halfPointRange,\n flipped = panMax < panMin,\n newMin = flipped ? panMax : panMin,\n newMax = flipped ? panMin : panMax,\n paddedMin = Math.min(\n extremes.dataMin,\n axis.toValue(\n axis.toPixels(extremes.min) - axis.minPixelPadding\n )\n ),\n paddedMax = Math.max(\n extremes.dataMax,\n axis.toValue(\n axis.toPixels(extremes.max) + axis.minPixelPadding\n )\n ),\n spill;\n\n // If the new range spills over, either to the min or max, adjust\n // the new range.\n spill = paddedMin - newMin;\n if (spill > 0) {\n newMax += spill;\n newMin = paddedMin;\n }\n spill = newMax - paddedMax;\n if (spill > 0) {\n newMax = paddedMax;\n newMin -= spill;\n }\n\n // Set new extremes if they are actually new\n if (axis.series.length && newMin !== extremes.min && newMax !== extremes.max) {\n axis.setExtremes(\n newMin,\n newMax,\n false,\n false, {\n trigger: 'pan'\n }\n );\n doRedraw = true;\n }\n\n chart[mouseDown] = mousePos; // set new reference for next run\n });\n\n if (doRedraw) {\n chart.redraw(false);\n }\n css(chart.container, {\n cursor: 'move'\n });\n }\n });\n\n /*\n * Extend the Point object with interaction\n */\n extend(Point.prototype, /** @lends Highcharts.Point.prototype */ {\n /**\n * Toggle the selection status of a point.\n * @param {Boolean} [selected]\n * When `true`, the point is selected. When `false`, the point is\n * unselected. When `null` or `undefined`, the selection state is\n * toggled.\n * @param {Boolean} [accumulate=false]\n * When `true`, the selection is added to other selected points.\n * When `false`, other selected points are deselected. Internally in\n * Highcharts, when {@link http://api.highcharts.com/highcharts/plotOptions.series.allowPointSelect|allowPointSelect}\n * is `true`, selected points are accumulated on Control, Shift or\n * Cmd clicking the point.\n *\n * @see Highcharts.Chart#getSelectedPoints\n *\n * @sample highcharts/members/point-select/\n * Select a point from a button\n * @sample highcharts/chart/events-selection-points/\n * Select a range of points through a drag selection\n * @sample maps/series/data-id/\n * Select a point in Highmaps\n */\n select: function(selected, accumulate) {\n var point = this,\n series = point.series,\n chart = series.chart;\n\n selected = pick(selected, !point.selected);\n\n // fire the event with the default handler\n point.firePointEvent(selected ? 'select' : 'unselect', {\n accumulate: accumulate\n }, function() {\n\n /**\n * Whether the point is selected or not. \n * @see Highcharts.Point#select\n * @memberof Highcharts.Point\n * @name selected\n * @type {Boolean}\n */\n point.selected = point.options.selected = selected;\n series.options.data[inArray(point, series.data)] = point.options;\n\n point.setState(selected && 'select');\n\n // unselect all other points unless Ctrl or Cmd + click\n if (!accumulate) {\n each(chart.getSelectedPoints(), function(loopPoint) {\n if (loopPoint.selected && loopPoint !== point) {\n loopPoint.selected = loopPoint.options.selected = false;\n series.options.data[inArray(loopPoint, series.data)] = loopPoint.options;\n loopPoint.setState('');\n loopPoint.firePointEvent('unselect');\n }\n });\n }\n });\n },\n\n /**\n * Runs on mouse over the point\n * \n * @param {Object} e The event arguments\n */\n onMouseOver: function(e) {\n var point = this,\n series = point.series,\n chart = series.chart,\n pointer = chart.pointer;\n e = e ?\n pointer.normalize(e) :\n // In cases where onMouseOver is called directly without an event\n pointer.getChartCoordinatesFromPoint(point, chart.inverted);\n pointer.runPointActions(e, point);\n },\n\n /**\n * Runs on mouse out from the point\n */\n onMouseOut: function() {\n var point = this,\n chart = point.series.chart;\n point.firePointEvent('mouseOut');\n each(chart.hoverPoints || [], function(p) {\n p.setState();\n });\n chart.hoverPoints = chart.hoverPoint = null;\n },\n\n /**\n * Import events from the series' and point's options. Only do it on\n * demand, to save processing time on hovering.\n */\n importEvents: function() {\n if (!this.hasImportedEvents) {\n var point = this,\n options = merge(point.series.options.point, point.options),\n events = options.events;\n\n point.events = events;\n\n H.objectEach(events, function(event, eventType) {\n addEvent(point, eventType, event);\n });\n this.hasImportedEvents = true;\n\n }\n },\n\n /**\n * Set the point's state\n * @param {String} state\n */\n setState: function(state, move) {\n var point = this,\n plotX = Math.floor(point.plotX), // #4586\n plotY = point.plotY,\n series = point.series,\n stateOptions = series.options.states[state] || {},\n markerOptions = defaultPlotOptions[series.type].marker &&\n series.options.marker,\n normalDisabled = markerOptions && markerOptions.enabled === false,\n markerStateOptions = (markerOptions && markerOptions.states &&\n markerOptions.states[state]) || {},\n stateDisabled = markerStateOptions.enabled === false,\n stateMarkerGraphic = series.stateMarkerGraphic,\n pointMarker = point.marker || {},\n chart = series.chart,\n halo = series.halo,\n haloOptions,\n markerAttribs,\n hasMarkers = markerOptions && series.markerAttribs,\n newSymbol;\n\n state = state || ''; // empty string\n\n if (\n // already has this state\n (state === point.state && !move) ||\n // selected points don't respond to hover\n (point.selected && state !== 'select') ||\n // series' state options is disabled\n (stateOptions.enabled === false) ||\n // general point marker's state options is disabled\n (state && (stateDisabled || (normalDisabled && markerStateOptions.enabled === false))) ||\n // individual point marker's state options is disabled\n (state && pointMarker.states && pointMarker.states[state] && pointMarker.states[state].enabled === false) // #1610\n\n ) {\n return;\n }\n\n if (hasMarkers) {\n markerAttribs = series.markerAttribs(point, state);\n }\n\n // Apply hover styles to the existing point\n if (point.graphic) {\n\n if (point.state) {\n point.graphic.removeClass('highcharts-point-' + point.state);\n }\n if (state) {\n point.graphic.addClass('highcharts-point-' + state);\n }\n\n /*attribs = radius ? { // new symbol attributes (#507, #612)\n x: plotX - radius,\n y: plotY - radius,\n width: 2 * radius,\n height: 2 * radius\n } : {};*/\n\n\n //attribs = merge(series.pointAttribs(point, state), attribs);\n point.graphic.attr(series.pointAttribs(point, state));\n\n\n if (markerAttribs) {\n point.graphic.animate(\n markerAttribs,\n pick(\n chart.options.chart.animation, // Turn off globally\n markerStateOptions.animation,\n markerOptions.animation\n )\n );\n }\n\n // Zooming in from a range with no markers to a range with markers\n if (stateMarkerGraphic) {\n stateMarkerGraphic.hide();\n }\n } else {\n // if a graphic is not applied to each point in the normal state, create a shared\n // graphic for the hover state\n if (state && markerStateOptions) {\n newSymbol = pointMarker.symbol || series.symbol;\n\n // If the point has another symbol than the previous one, throw away the\n // state marker graphic and force a new one (#1459)\n if (stateMarkerGraphic && stateMarkerGraphic.currentSymbol !== newSymbol) {\n stateMarkerGraphic = stateMarkerGraphic.destroy();\n }\n\n // Add a new state marker graphic\n if (!stateMarkerGraphic) {\n if (newSymbol) {\n series.stateMarkerGraphic = stateMarkerGraphic = chart.renderer.symbol(\n newSymbol,\n markerAttribs.x,\n markerAttribs.y,\n markerAttribs.width,\n markerAttribs.height\n )\n .add(series.markerGroup);\n stateMarkerGraphic.currentSymbol = newSymbol;\n }\n\n // Move the existing graphic\n } else {\n stateMarkerGraphic[move ? 'animate' : 'attr']({ // #1054\n x: markerAttribs.x,\n y: markerAttribs.y\n });\n }\n\n if (stateMarkerGraphic) {\n stateMarkerGraphic.attr(series.pointAttribs(point, state));\n }\n\n }\n\n if (stateMarkerGraphic) {\n stateMarkerGraphic[state && chart.isInsidePlot(plotX, plotY, chart.inverted) ? 'show' : 'hide'](); // #2450\n stateMarkerGraphic.element.point = point; // #4310\n }\n }\n\n // Show me your halo\n haloOptions = stateOptions.halo;\n if (haloOptions && haloOptions.size) {\n if (!halo) {\n series.halo = halo = chart.renderer.path()\n // #5818, #5903, #6705\n .add((point.graphic || stateMarkerGraphic).parentGroup);\n }\n halo[move ? 'animate' : 'attr']({\n d: point.haloPath(haloOptions.size)\n });\n halo.attr({\n 'class': 'highcharts-halo highcharts-color-' +\n pick(point.colorIndex, series.colorIndex)\n });\n halo.point = point; // #6055\n\n\n halo.attr(extend({\n 'fill': point.color || series.color,\n 'fill-opacity': haloOptions.opacity,\n 'zIndex': -1 // #4929, IE8 added halo above everything\n }, haloOptions.attributes));\n\n\n } else if (halo && halo.point && halo.point.haloPath) {\n // Animate back to 0 on the current halo point (#6055)\n halo.animate({\n d: halo.point.haloPath(0)\n });\n }\n\n point.state = state;\n },\n\n /**\n * Get the circular path definition for the halo\n * @param {Number} size The radius of the circular halo.\n * @returns {Array} The path definition\n */\n haloPath: function(size) {\n var series = this.series,\n chart = series.chart;\n\n return chart.renderer.symbols.circle(\n Math.floor(this.plotX) - size,\n this.plotY - size,\n size * 2,\n size * 2\n );\n }\n });\n\n /*\n * Extend the Series object with interaction\n */\n\n extend(Series.prototype, /** @lends Highcharts.Series.prototype */ {\n /**\n * Series mouse over handler\n */\n onMouseOver: function() {\n var series = this,\n chart = series.chart,\n hoverSeries = chart.hoverSeries;\n\n // set normal state to previous series\n if (hoverSeries && hoverSeries !== series) {\n hoverSeries.onMouseOut();\n }\n\n // trigger the event, but to save processing time,\n // only if defined\n if (series.options.events.mouseOver) {\n fireEvent(series, 'mouseOver');\n }\n\n // hover this\n series.setState('hover');\n chart.hoverSeries = series;\n },\n\n /**\n * Series mouse out handler\n */\n onMouseOut: function() {\n // trigger the event only if listeners exist\n var series = this,\n options = series.options,\n chart = series.chart,\n tooltip = chart.tooltip,\n hoverPoint = chart.hoverPoint;\n\n chart.hoverSeries = null; // #182, set to null before the mouseOut event fires\n\n // trigger mouse out on the point, which must be in this series\n if (hoverPoint) {\n hoverPoint.onMouseOut();\n }\n\n // fire the mouse out event\n if (series && options.events.mouseOut) {\n fireEvent(series, 'mouseOut');\n }\n\n\n // hide the tooltip\n if (tooltip && !series.stickyTracking && (!tooltip.shared || series.noSharedTooltip)) {\n tooltip.hide();\n }\n\n // set normal state\n series.setState();\n },\n\n /**\n * Set the state of the graph\n */\n setState: function(state) {\n var series = this,\n options = series.options,\n graph = series.graph,\n stateOptions = options.states,\n lineWidth = options.lineWidth,\n attribs,\n i = 0;\n\n state = state || '';\n\n if (series.state !== state) {\n\n // Toggle class names\n each([\n series.group,\n series.markerGroup,\n series.dataLabelsGroup\n ], function(group) {\n if (group) {\n // Old state\n if (series.state) {\n group.removeClass('highcharts-series-' + series.state);\n }\n // New state\n if (state) {\n group.addClass('highcharts-series-' + state);\n }\n }\n });\n\n series.state = state;\n\n\n\n if (stateOptions[state] && stateOptions[state].enabled === false) {\n return;\n }\n\n if (state) {\n lineWidth = stateOptions[state].lineWidth || lineWidth + (stateOptions[state].lineWidthPlus || 0); // #4035\n }\n\n if (graph && !graph.dashstyle) { // hover is turned off for dashed lines in VML\n attribs = {\n 'stroke-width': lineWidth\n };\n\n // Animate the graph stroke-width. By default a quick animation\n // to hover, slower to un-hover.\n graph.animate(\n attribs,\n pick(\n series.chart.options.chart.animation,\n stateOptions[state] && stateOptions[state].animation\n )\n );\n while (series['zone-graph-' + i]) {\n series['zone-graph-' + i].attr(attribs);\n i = i + 1;\n }\n }\n\n }\n },\n\n /**\n * Show or hide the series.\n *\n * @param {Boolean} [visible]\n * True to show the series, false to hide. If undefined, the\n * visibility is toggled.\n * @param {Boolean} [redraw=true]\n * Whether to redraw the chart after the series is altered. If doing\n * more operations on the chart, it is a good idea to set redraw to\n * false and call {@link Chart#redraw|chart.redraw()} after.\n */\n setVisible: function(vis, redraw) {\n var series = this,\n chart = series.chart,\n legendItem = series.legendItem,\n showOrHide,\n ignoreHiddenSeries = chart.options.chart.ignoreHiddenSeries,\n oldVisibility = series.visible;\n\n // if called without an argument, toggle visibility\n series.visible = vis = series.options.visible = series.userOptions.visible = vis === undefined ? !oldVisibility : vis; // #5618\n showOrHide = vis ? 'show' : 'hide';\n\n // show or hide elements\n each(['group', 'dataLabelsGroup', 'markerGroup', 'tracker', 'tt'], function(key) {\n if (series[key]) {\n series[key][showOrHide]();\n }\n });\n\n\n // hide tooltip (#1361)\n if (chart.hoverSeries === series || (chart.hoverPoint && chart.hoverPoint.series) === series) {\n series.onMouseOut();\n }\n\n\n if (legendItem) {\n chart.legend.colorizeItem(series, vis);\n }\n\n\n // rescale or adapt to resized chart\n series.isDirty = true;\n // in a stack, all other series are affected\n if (series.options.stacking) {\n each(chart.series, function(otherSeries) {\n if (otherSeries.options.stacking && otherSeries.visible) {\n otherSeries.isDirty = true;\n }\n });\n }\n\n // show or hide linked series\n each(series.linkedSeries, function(otherSeries) {\n otherSeries.setVisible(vis, false);\n });\n\n if (ignoreHiddenSeries) {\n chart.isDirtyBox = true;\n }\n if (redraw !== false) {\n chart.redraw();\n }\n\n fireEvent(series, showOrHide);\n },\n\n /**\n * Show the series if hidden.\n *\n * @sample highcharts/members/series-hide/\n * Toggle visibility from a button\n */\n show: function() {\n this.setVisible(true);\n },\n\n /**\n * Hide the series if visible. If the {@link\n * https://api.highcharts.com/highcharts/chart.ignoreHiddenSeries|\n * chart.ignoreHiddenSeries} option is true, the chart is redrawn without\n * this series.\n *\n * @sample highcharts/members/series-hide/\n * Toggle visibility from a button\n */\n hide: function() {\n this.setVisible(false);\n },\n\n\n /**\n * Select or unselect the series. This means its {@link\n * Highcharts.Series.selected|selected} property is set, the checkbox in the\n * legend is toggled and when selected, the series is returned by the\n * {@link Highcharts.Chart#getSelectedSeries} function.\n *\n * @param {Boolean} [selected]\n * True to select the series, false to unselect. If undefined, the\n * selection state is toggled.\n *\n * @sample highcharts/members/series-select/\n * Select a series from a button\n */\n select: function(selected) {\n var series = this;\n\n series.selected = selected = (selected === undefined) ?\n !series.selected :\n selected;\n\n if (series.checkbox) {\n series.checkbox.checked = selected;\n }\n\n fireEvent(series, selected ? 'select' : 'unselect');\n },\n\n drawTracker: TrackerMixin.drawTrackerGraph\n });\n\n }(Highcharts));\n (function(H) {\n /**\n * (c) 2010-2017 Torstein Honsi\n *\n * License: www.highcharts.com/license\n */\n var Chart = H.Chart,\n each = H.each,\n inArray = H.inArray,\n isArray = H.isArray,\n isObject = H.isObject,\n pick = H.pick,\n splat = H.splat;\n\n /**\n * Update the chart based on the current chart/document size and options for\n * responsiveness.\n */\n Chart.prototype.setResponsive = function(redraw) {\n var options = this.options.responsive,\n ruleIds = [],\n currentResponsive = this.currentResponsive,\n currentRuleIds;\n\n if (options && options.rules) {\n each(options.rules, function(rule) {\n if (rule._id === undefined) {\n rule._id = H.uniqueKey();\n }\n\n this.matchResponsiveRule(rule, ruleIds, redraw);\n }, this);\n }\n\n // Merge matching rules\n var mergedOptions = H.merge.apply(0, H.map(ruleIds, function(ruleId) {\n return H.find(options.rules, function(rule) {\n return rule._id === ruleId;\n }).chartOptions;\n }));\n\n // Stringified key for the rules that currently apply.\n ruleIds = ruleIds.toString() || undefined;\n currentRuleIds = currentResponsive && currentResponsive.ruleIds;\n\n\n // Changes in what rules apply\n if (ruleIds !== currentRuleIds) {\n\n // Undo previous rules. Before we apply a new set of rules, we need to\n // roll back completely to base options (#6291).\n if (currentResponsive) {\n this.update(currentResponsive.undoOptions, redraw);\n }\n\n if (ruleIds) {\n // Get undo-options for matching rules\n this.currentResponsive = {\n ruleIds: ruleIds,\n mergedOptions: mergedOptions,\n undoOptions: this.currentOptions(mergedOptions)\n };\n\n this.update(mergedOptions, redraw);\n\n } else {\n this.currentResponsive = undefined;\n }\n }\n };\n\n /**\n * Handle a single responsiveness rule\n */\n Chart.prototype.matchResponsiveRule = function(rule, matches) {\n var condition = rule.condition,\n fn = condition.callback || function() {\n return this.chartWidth <= pick(condition.maxWidth, Number.MAX_VALUE) &&\n this.chartHeight <= pick(condition.maxHeight, Number.MAX_VALUE) &&\n this.chartWidth >= pick(condition.minWidth, 0) &&\n this.chartHeight >= pick(condition.minHeight, 0);\n };\n\n if (fn.call(this)) {\n matches.push(rule._id);\n }\n\n };\n\n /**\n * Get the current values for a given set of options. Used before we update\n * the chart with a new responsiveness rule.\n * TODO: Restore axis options (by id?)\n */\n Chart.prototype.currentOptions = function(options) {\n\n var ret = {};\n\n /**\n * Recurse over a set of options and its current values,\n * and store the current values in the ret object.\n */\n function getCurrent(options, curr, ret, depth) {\n var i;\n H.objectEach(options, function(val, key) {\n if (!depth && inArray(key, ['series', 'xAxis', 'yAxis']) > -1) {\n options[key] = splat(options[key]);\n\n ret[key] = [];\n\n // Iterate over collections like series, xAxis or yAxis and map\n // the items by index.\n for (i = 0; i < options[key].length; i++) {\n if (curr[key][i]) { // Item exists in current data (#6347)\n ret[key][i] = {};\n getCurrent(\n val[i],\n curr[key][i],\n ret[key][i],\n depth + 1\n );\n }\n }\n } else if (isObject(val)) {\n ret[key] = isArray(val) ? [] : {};\n getCurrent(val, curr[key] || {}, ret[key], depth + 1);\n } else {\n ret[key] = curr[key] || null;\n }\n });\n }\n\n getCurrent(options, this.options, ret, 0);\n return ret;\n };\n\n }(Highcharts));\n return Highcharts\n }));\n});\n"],"sourceRoot":""}