There was a problem with a Velocity script
Pagesports/wten/2024-25/players/bio-network-template
ErrorInvocation of method 'getOverall' in class com.prestosports.content.sport.stats.StatsSplitter threw exception java.lang.NullPointerException at nqusp7rld8lmjoyrsports/wten/2024-25/players/bio-network-template[line 40, column 24]
Page source:
1: ## PICK UP OPTIONS
2: $website.include("options")
3: #set ($options = $request.getAttribute("options"))
4: #set ($locale = "en_us")
5: #set ($locale = $options.get("locale"))
6: 
7: #set ($showconf = true)
8: #if ($options.get("stats_hide_conference") and $options.get("stats_hide_conference").equalsIgnoreCase("hide"))
9:     #set ($showconf = false)
10: #end
11: 
12: #set ($showCareer = $wiki.valid() && $seasons)
13: #if ("yes" == $options.get("stats_show_career") && $seasons)
14:     #set ($showCareer = "yes")
15: #end
16: 
17: #if ($locale == "en_us")
18:     #set ($defLabel = "Defense")
19: #elseif ($locale == "en_gb")
20:     #set ($defLabel = "Defence")
21: #end
22: 
23: #set ($pos = "")
24: #if($attributes.get("position_stat"))
25: 	#set ($pos = $attributes.get("position_stat"))
26: #else
27: 	#set ($pos = $attributes.get("position"))
28: 	#set ($pos = $statPosition)
29: 	#set ($posVec = $pos.split("/"))
30: 	#set ($pos = $posVec[0])
31: #end
32: #set ($pos = $pos.toLowerCase())
33: #set ($statPos = $positions.get($pos))
34: #set ($paramPos = $request.getParameter("pos"))
35: 
36: #set ($highlights = $highlights.get($statPos))
37: 
38: #set ($url = ${page.url})
39: #set ($playerId = $attributes.get("playerId"))
40: #set ($stats = $splits.overall)
41: 
42: #set ($hasEvents = $events.size() > 0)
43: #set ($hasSynopsis = $synopsis.length() > 1 && $synopsis.indexOf("<center>") == -1)
44: #set ($htmlStatsURL = "${page.url}-stats")
45: #set ($hasHTMLStats = $website.exists($htmlStatsURL))
46: #set ($bioBriefURL = "${page.url}-brief")
47: #set ($hasBioBrief = $website.exists("$bioBriefURL"))
48: 
49: $request.setAttribute("careerTotals", $career)
50: ## We track a map of the careers to see if we are missing any seasons
51: #if(!$rosterTransactions)
52:     #set ($careerMap = {})
53:     $request.setAttribute("careerMap", $careerMap)
54:     #foreach ($season in $seasons)
55:         ## We need to include this season stats.
56: 		## we anticipate the player file being within a normal season structure.
57:         #set ($path = "${season.path}?tmpl=bio-career-template&name=${season.seasonName}&pos=${statPos}&print=no")
58: 
59: 		## naiastats.com uses a unique foler structure that needs to be accounted for.
60: 		## seasons have conference folders within NAIA to reduce query response times for massive season data.
61: 		#if($page.url.contains("/conf"))
62: 			#set ($tempPath = $page.sectionPage.sectionPage.sectionPage.sectionPage.sectionPage.url)
63: 		#else
64: 			#set ($tempPath = $page.sectionPage.sectionPage.sectionPage.url)
65: 		#end
66: 		#set ($path = $path.replace("../..", $tempPath))
67: 
68:         $website.includeAgain($path)
69:     #end
70: #end
71: #set ($view = "profile")
72: #if ($request.getParameter("view"))
73:     #set ($view = $request.getParameter("view"))
74: #end
75: 
76: $website.include("${page.sectionPage.url}/roster?tmpl=roster-headshots-template")
77: #set ($rosterHeadshots = $!request.getAttribute("roster_headshots"))
78: 
79: #################################### MACROS ####################################################
80: #macro (printTableHeader $label $class)
81: 	## Hack for now
82: 	#set ($labels = $labels.get($p))
83: 	<th class="text-uppercase $class" data-p="$!{p}" data-bs-toggle="tooltip" data-bs-placement="top" title="$!{labels.get($label)}">$label</th>
84: #end
85: 
86: #macro (printCellClass)
87: 	class="text-nowrap text-center"
88: #end
89: 
90: #macro (printImage $src $alt $class)
91: 	#set ($src = "${src}?max_height=576&max_width=576&crop=1")
92: 	<div class="ratio ratio-1x1 rounded-circle overflow-hidden img-thumbnail">
93: 		<span class="align-content-center">
94: 			<img src="${src}" alt="${alt}" class="${class}" />
95: 		</span>
96: 	</div>
97: #end
98: 
99: #macro (printTab $viewParam $label)
100: 	#set ($classAttr = "nav-link text-nowrap")
101: 	#if ($viewParam == $view)
102: 		#set ($classAttr = "${classAttr} active")
103: 	#end
104: 	<li class="nav-item">
105: 		<a href="${page.url}?view=${viewParam}" class="$classAttr" role="tab" data-bs-toggle="tab" data-bs-target="#${viewParam}" aria-selected="true" aria-controls="$viewParam">$label</a>
106: 	</li>
107: #end
108: 
109: #macro (printPaneAttrs $viewParam)
110: 	#set ($classAttr = "tab-pane")
111: 	#if ($viewParam == $view)
112: 		#set ($classAttr = "tab-pane active")
113: 	#else
114: 		#set ($classAttr = "${classAttr} fade")
115: 	#end
116: 
117: 	class="$classAttr" role="tabpanel" id="$viewParam"
118: #end
119: 
120: #macro (printResultAriaLabel $event)
121:     #set ($ariaLabel = "${event.sport} event: ${formatter.formatDate($event.date, 'MMMM d hh:mm a:')}")
122:     #if ($event.neutralSite.length() > 0 || $event.home)
123:     	#set ($ariaLabel = "${ariaLabel} vs.")
124:     #else
125:     	#set ($ariaLabel = "${ariaLabel} at")
126:     #end
127:     #set ($ariaLabel = "${ariaLabel} ${event.opponent.name}:")
128:     #if ($event.neutralSite.length() > 0)
129:     	#set ($ariaLabel = "${ariaLabel} @ ${event.neutralSite}:")
130:     #end
131:     #set ($ariaLabel = "${ariaLabel} Box Score")
132:     aria-label="$ariaLabel"
133: #end
134: 
135: #macro (printHighlights)
136:     #if ($highlights)
137:         <div class="d-flex flex-wrap bg-light">
138:         #foreach ($highlight in $highlights.keySet())
139:             #set ($value = "-")
140:             #set ($value = $formatter.formatNumber($stats.get($highlight), $formats.get($highlight)))
141:             #set ($classAttr = "flex-fill border p-3 text-center")
142:             #if ($velocityCount > 1)
143:                 ## #set ($classAttr = "nav-item border-left")
144:             #end
145:             <div class="$classAttr" style="min-width:100px">
146:                 <div class="text-uppercase fw-normal small text-muted">$!highlights.get($highlight)</div>
147:                 <div class="p-0 m-0 fs-5 fw-bold lh-1">$!value</div>
148:             </div>
149:         #end
150: 		</div>
151: 	#end
152: #end ## macro printHighlights
153: 
154: #macro (splitBioNetwork $statPosBriefs $label $stats)
155: 	<tr>
156: 		<th class="text-nowrap text-end fw-bold">${label}</th>
157: 		#if($rosterTransactions && $stats.class.simpleName == "JSONObject")
158:             #set($keys =  $stats.names())
159:             #set($array = $keys.toString().replace('"','').split(","))
160:             #foreach ($brief in $statPosBriefs.keySet())
161:                 #set ($value = "-")
162:                 #if($array.contains($brief))
163:                     #set ($value = $!formatter.formatNumber($tool.math.toDouble($stats.get($brief)), $formats.get($brief)))
164:                  #end
165:                 <td>#if ($value.length() > 0) $value #else - #end</td>
166:             #end
167: 		#else
168:             #foreach ($brief in $statPosBriefs.keySet())
169:                 #set ($value = "-")
170:                 #set ($value = $!formatter.formatNumber($stats.get($brief), $formats.get($brief)))
171:                 <td #printCellClass>#if ($value.length() > 0) $value #else - #end</td>
172:             #end
173:         #end
174: 	</tr>
175: #end ## marco split
176: 
177: #macro (printCategories $briefCategoryLabels $viewParam)
178: 	#printSubTabs($briefCategoryLabels.entrySet(), $viewParam)
179: 
180: 	<div class="tab-content py-3">
181: 		#foreach ($briefCat in $briefCategoryLabels.entrySet())
182: 			#set ($briefCatLabel = $briefCat.value)
183: 			#set ($class = "tab-pane")
184: 			#if ($briefCat.key == $activePos)
185: 				#set ($class = "tab-pane active")
186: 			#end
187: 			<div id="${viewParam}-${briefCat.key}" class="$class" role="tabpanel">
188: 				<div class="stats-wrap clearfix">
189: 					#if ($viewParam == "splits")
190: 						#splitsBioNetworkData($briefCat.key)
191: 					#elseif ($viewParam == "career")
192: 						#careerData($briefCat.key)
193: 					#end
194: 				</div>
195: 			</div>
196: 		#end
197: 	</div>
198: #end ## macro printCategories
199: 
200: #macro (splitsBioNetworkData $p)
201: 	#set ($p = $positions.get($p))
202: 	#set ($statPosBriefs = $briefs.get($p))
203: 	#set ($colspan = $statPosBriefs.size())
204: 
205: 	<div class="stats-container table-responsive-via-datatables">
206: 		<table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
207: 			<thead class="thead-dark">
208: 				<tr>
209: 					<th>&nbsp;</th>
210: 					#foreach ($brief in $statPosBriefs)
211: 						#printTableHeader($brief, "text-center")
212: 					#end
213: 				</tr>
214: 			</thead>
215: 			#splitBioNetwork($statPosBriefs, "Total", $splits.overall)
216: 			#if ($showconf)
217: 				#splitBioNetwork($statPosBriefs, "Conference", $splits.conference)
218: 			#end
219: 			#splitBioNetwork($statPosBriefs, "Exhibition", $splits.exhibition)
220: 
221: 
222: 			<tr class="group">
223: 				#foreach ( $i in [0..$colspan])
224:                     <td class="text-center">&nbsp;</td>
225: 				#end
226: 			</tr>
227: 
228: 			#splitBioNetwork($statPosBriefs, "Home", $splits.home)
229: 			#splitBioNetwork($statPosBriefs, "Away", $splits.away)
230: 			#splitBioNetwork($statPosBriefs, "Neutral", $splits.neutral)
231: 
232:             <tr class="group">
233: 				#foreach ( $i in [0..$colspan])
234:                     <td class="text-center">&nbsp;</td>
235: 				#end
236: 			</tr>
237: 
238: 			#foreach($gameResult in $gamesResults.entrySet())
239: 				#if ($gameResult.key == "wins")
240: 					#set ($splitGameResult = $splits.inWins)
241: 				#elseif ($gameResult.key == "losses")
242: 					#set ($splitGameResult = $splits.inLosses)
243: 				#elseif ($gameResult.key == "ties")
244: 					#set ($splitGameResult = $splits.inTies)
245: 				#end
246: 
247: 				#splitBioNetwork($statPosBriefs, $gameResult.value, $splitGameResult)
248: 			#end
249: 
250:             <tr class="group">
251: 				#foreach ( $i in [0..$colspan])
252:                     <td class="text-center">&nbsp;</td>
253: 				#end
254: 			</tr>
255: 
256: 			#if ($monthsPlayed and $monthsPlayed.size() > 0)
257: 				#foreach($month in $monthsPlayed)
258: 					#if ($month == 'January')
259: 						#set ($splitMonth = $splits.january)
260: 					#elseif ($month == 'February')
261: 						#set ($splitMonth = $splits.february)
262: 					#elseif ($month == 'March')
263: 						#set($splitMonth = $splits.march)
264: 					#elseif ($month == 'April')
265: 						#set($splitMonth = $splits.april)
266: 					#elseif ($month == 'May')
267: 						#set ($splitMonth = $splits.may)
268: 					#elseif ($month == 'June')
269: 						#set ($splitMonth = $splits.june)
270: 					#elseif ($month == 'July')
271: 						#set($splitMonth = $splits.july)
272: 					#elseif ($month == 'August')
273: 						#set ($splitMonth = $splits.august)
274: 					#elseif ($month == 'September')
275: 						#set($splitMonth = $splits.september)
276: 					#elseif ($month == 'October')
277: 						#set($splitMonth = $splits.october)
278: 					#elseif ($month == 'November')
279: 						#set ($splitMonth = $splits.november)
280: 					#elseif ($month == 'December')
281: 						#set($splitMonth = $splits.december)
282: 					#end
283: 					#splitBioNetwork($statPosBriefs, $month, $splitMonth)
284: 				#end
285: 			#end
286: 		</table>
287: 	</div>
288: #end ## macro splitsBioNetworkData
289: 
290: #macro (printRecentGames)
291: 	<div class="stats-container table-responsive-via-datatables">
292:         <table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
293:             <thead class="thead-dark">
294:                 <tr>
295:                     <th class="text-uppercase w-1">Date</th>
296:                     <th class="text-uppercase text-start">Opponent</th>
297:                     <th scope="col" class="text-center text-uppercase">Result</th>
298:                 </tr>
299:             </thead>
300:     		#set ($eventEnd = -1)
301:     		#foreach ($event in $events)
302:     			#if ($event.event.result.resolved)
303:     				#set ($eventEnd = $velocityCount)
304:     			#end
305:     		#end
306: 
307:     		#set ($eventStart = $eventEnd - 5)
308:     		#if ($eventStart < 0) #set ($eventStart = 0) #end
309: 
310:     		#foreach ($event in $events)
311:     			#if ($velocityCount >= $eventStart and $velocityCount <= $eventEnd)
312:     				<tr>
313:     					<td class="text-nowrap text-start">$formatter.formatDate($event.event.date, "MMM d")</td>
314:     					<td class="text-nowrap text-start">
315:     						#if ($event.event.neutralSite.length() > 0) vs.
316:     						#elseif (!$event.event.home) at
317:     						#end
318:     						$event.event.opponent.name
319:     					</td>
320:     					<td class="text-nowrap text-center">
321:     						#if ($event.event.statusCode >= 0)
322:     							#if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
323:     								<a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
324:     							#else
325:     								${event.event.APResult}
326:     							#end
327:     						#end
328:     					</td>
329:     				</tr>
330:     			#end
331:     		#end
332:     	</table>
333: 	</div>
334: #end ## macro printRecentGames
335: 
336: #macro (gamelogData $p)
337: 	#set ($p = $positions.get($p))
338: 	#set ($gamelogs = $gamelogs.get($p))
339: 	#set ($atLeastOneNotOverall = false)
340: 
341: 	<div class="stats-container table-responsive-via-datatables">
342:         <table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-filtering="false" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
343: 			<thead class="thead-dark">
344: 				<tr>
345: 					#printTableHeader("Date", "w-1")
346: 					#printTableHeader("Opponent", "")
347: 					#printTableHeader("Score", "text-center")
348: 
349: 					#set ($colspan = 3)
350: 					#if ($p == 'goalie' && ($sport.enumCode == 9 || $sport.enumCode == 3)) ## field hockey: 9   soccer:3
351: 							#printTableHeader("Dec", "text-center")
352: 					#end
353: 					#foreach ($gamelog in $gamelogs)
354: 						#printTableHeader($gamelog, "text-center")
355: 					#end
356: 				</tr>
357: 			</thead>
358: 			#foreach ($event in $events)
359: 				<tr>
360: 					<td class="text-nowrap">$formatter.formatDate($event.event.date, "MMM d") #if (!$event.event.overall) #set ($atLeastOneNotOverall = true) # #end</</td>
361: 					<td class="text-nowrap">
362: 						#if ($event.event.neutralSite.length() > 0) vs. #elseif (!$event.event.home) at #end
363: 						$event.event.opponent.name
364: 					</td>
365: 					<td #printCellClass>
366: 						#if ($event.event.statusCode >= 0)
367: 							#if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
368: 								<a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
369: 							#else
370: 								${event.event.APResult}
371: 							#end
372: 						#else &nbsp; #end
373: 					</td>
374: 					#if ($p == 'goalie' && ($sport.enumCode == 9 || $sport.enumCode == 3)) ## field hockey: 9   soccer:3
375: 						<td #printCellClass>
376: 						#if ($event.stats.get('gow') == 1)
377: 							W
378: 						#elseif ($event.stats.get('gol') == 1)
379: 							L
380: 						#elseif ($event.stats.get('got') == 1)
381: 							T<
382: 						#else
383: 							-
384: 						#end
385: 						</td>
386: 					#end
387: 					#foreach ($gamelog in $gamelogs.keySet())
388: 						#set ($value = "-")
389: 						#set ($value = $formatter.formatNumber($event.stats.get($gamelog), $formats.get($gamelog)))
390: 						<td #printCellClass>$value</td>
391: 					#end
392: 				</tr>
393: 			#end
394: 		</table>
395: 
396: 		#if ($atLeastOneNotOverall)
397: 			<p class="my-3"># Stats don't count towards season totals</p>
398: 		#end
399: 	</div>
400: #end ## macro gamelogData
401: 
402: #macro (careerData $p)
403: 	#set ($p = $positions.get($p))
404: 	#set ($statPosBriefs = $briefs.get($p))
405: 
406: 	<div class="stats-container table-responsive-via-datatables">
407: 		<table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-module="https://theme-assets.prestosports.com/theme-assets/generic/assets/js/table-sort-bs.js">
408:             <thead class="thead-dark">
409:                 <tr>
410:                     <th class="">&nbsp;</th>
411:                     #foreach ($brief in $statPosBriefs)
412:                         #printTableHeader($brief, "text-center")
413:                     #end
414:                 </tr>
415:             </thead>
416:               #if($rosterTransactions)
417:                   #set ($seasonLength = $career.seasons.length())
418:                   #foreach ($index in [0..$tool.math.sub($seasonLength, 1)])
419:                       #set($season = $career.seasons[$index])
420:                       #if($season.seasonStatsURL != "null")
421:                           #set ($label = "<a href='${season.seasonStatsURL}?view=profile'>$season.seasonName.replaceAll('^[^0-9-]*','') - $season.team.teamName</a>")
422:                       #else
423:                           #set ($label = "$season.seasonName.replaceAll('^[^0-9-]*','') - $season.team.teamName")
424:                       #end
425:                       #splitBioNetwork($statPosBriefs, $label, $season.player.stats)
426:                   #end
427:                   #splitBioNetwork($statPosBriefs, "Total", $career.totals)
428: 
429:               #else
430:                 #foreach ($season in $seasons)
431:                     #if ($careerMap.get($season.seasonName))
432: 						## naiastats.com uses a unique foler structure that needs to be accounted for.
433: 						## seasons have conference folders within NAIA to reduce query response times for massive season data.
434: 						#if($page.url.contains("/conf"))
435: 							#set ($tempPath = $page.sectionPage.sectionPage.sectionPage.sectionPage.sectionPage.url)
436: 						#else
437: 							#set ($tempPath = $page.sectionPage.sectionPage.sectionPage.url)
438: 						#end
439: 						#set ($path = $season.path.replace("../..", $tempPath))
440: 
441:                         #set ($label = "<a href='${path}?view=profile'>$season.seasonName</a>")
442:                         #splitBioNetwork($statPosBriefs, $label, $careerMap[$season.seasonName])
443:                     #elseif ($wiki.valid())
444:                         <tr>
445: 							<td class="text-nowrap text-end text-muted fst-italic">${season.seasonName}</td>
446: 							#foreach ($i in [1..$statPosBriefs.size()])
447: 								#if ($statPosBriefs.size() > 1)
448: 									#if ($foreach.first)
449:                                         <td class="text-nowrap text-center text-muted">
450:                                             <a href="#" data-bs-toggle="tooltip" title="We could not find the 'players' page in the ${season.seasonName} section."><span class="fa fa-light fa-circle-info"></span></a>
451: 										</td>
452: 									#else
453: 										<td class="text-nowrap text-center text-muted"></td>
454: 									#end
455: 								#end
456: 							#end
457:                         </tr>
458:                     #end
459:                 #end
460:                 #splitBioNetwork($statPosBriefs, "Total", $request.getAttribute("careerTotals").overall)
461: 			#end
462: 
463: 
464: 		</table>
465: 	</div>
466: #end ## macro careerData
467: 
468: #macro (printTabs)
469: 	$request.setAttribute("icl-responsive-tabs-script", true)
470: 	<div class="tab-nav">
471: 		<ul class="nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3" id="bio-network-tabs" role="tablist">
472: 			#printTab("profile", "Player Profile")
473: 			#printTab("gamelog", "Game Log")
474: 			#if ($showCareer)
475: 				#printTab("career", "Career Stats")
476: 			#end
477: 			#printTab("splits", "Split Stats")
478: 		</ul>
479:     </div>
480: #end ## printTabs
481: 
482: #macro (printLabel $label)
483: 	#if ($locale == "en_gb" && $label == "Defense")
484: 		Defence
485: 	#else
486: 		$label
487: 	#end
488: #end
489: 
490: #macro (printSubTabs $entries $viewParam)
491: 	#set ($activeLabel = "")
492: 	#foreach ($entry in $entries)
493: 		#if ($entry.key == $activePos)
494: 			#set ($activeLabel = $entry.value)
495: 		#end
496: 	#end
497: 
498: 	<div class="d-flex flex-row text-nowrap align-items-center justify-content-center">
499: 		<div class="secondary-tab-select-container flex-fill">
500: 			<select class="tab-nav-select-helper form-select" id="${viewParam}-subtabs-select" aria-label="Choose a stat group">
501: 				#foreach($entry in $entries)
502: 					<option value="#${viewParam}-${entry.key}" #if ($entry.value == $activeLabel || $foreach.first) selected #end>#printLabel($entry.value)</option>
503: 				#end
504: 			</select>
505: 			<script>
506: 				$('.tab-nav-select-helper').on('change', function(e) {
507: 					var id = $(this).val();
508: 					$('a[data-bs-target="' + id + '"]').tab('show');
509: 				});
510: 			</script>
511: 		</div>
512: 	</div>
513: 
514: 	<ul class="d-none nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-start gap-3" role="tablist" id="${viewParam}-subtabs">
515: 		#foreach($entry in $entries)
516: 			#set ($class = "nav-link")
517: 			#if ($entry.value == $activeLabel)
518: 				#set ($class = "${class} active")
519: 			#end
520: 			<li class="nav-item">
521: 				<a href="#${viewParam}-${entry.key}" class="${class}" id="${viewParam}-${entry.key}-tab" data-bs-target="#${viewParam}-${entry.key}" role="tab" data-bs-toggle="tab">#printLabel($entry.value)</a>
522: 			</li>
523: 		#end
524: 	</ul>
525: #end
526: ################################################## END MACROS  #############################################################
527: 
528: <head>
529: <title>
530:     $!attributes.get("first_name") $!attributes.get("last_name") | #if ($attributes.get("number"))#$!attributes.get("number") | #end #if($attributes.get("position_abbr") && !$attributes.get("position_abbr").empty)$!attributes.get("position_abbr") | #elseif ($attributes.get("position"))$!attributes.get("position") | #end  $attributes.get("team")
531: </title>
532: </head>
533: 
534: $request.setAttribute("icl-responsive-tabs-script", true)
535: $request.setAttribute("icl-dataTables-script", true)
536: 
537: <div class="page-content player-stats">
538: 	<div class="d-flex flex-column justify-content-between gap-3">
539: 		<div class="bnt-heading">
540: 			<div class="bnt-main d-flex flex-column flex-grow-1 gap-3">
541: 				<div class="bnt-name-info">
542: 					<div class="d-flex align-items-center justify-content-between gap-3">
543: 						<div class="bnt-left">
544: 							<div class="bnt-headshot position-relative" style="width:5rem;">
545: 								#set ($playerName = $!attributes.get("first_name") + ' '+  $!attributes.get("last_name"))
546: 								#set ($src = "/info/images/default-headshot.png")
547: 								#if ($rosterHeadshots.size() > 0)
548: 									#foreach ($rosterPlayer in $rosterHeadshots)
549: 										#if ($playerName == $rosterPlayer.name)
550: 											#if ($rosterPlayer.headshot.length() > 0)
551: 												#set ($src = $rosterPlayer.headshot)
552: 											#elseif ($website.exists("/images/setup/default-headshot.png"))
553: 												#set ($src = "/images/setup/default-headshot.png")
554: 											#elseif ($website.exists("/images/setup/headshot_default.jpg"))
555: 												#set ($src = "/images/setup/headshot_default.jpg")
556: 											#end
557: 										#end
558: 									#end
559: 									#printImage($src, $playerName, "img-fluid h-auto")
560: 								#else
561: 									#printImage($website.teamLogo($!{attributes.get("teamId")}), ${attributes.get("team")}, "img-fluid h-auto")
562: 								#end
563: 								#if (!$attributes.get("number").empty)
564: 									<div class="jersey-number-overlay d-inline-block position-absolute bottom-0 end-0 lh-1">
565: 										<span class="number d-inline-block small text-center bg-primary text-white rounded-circle lh-1 overflow-hidden p-2" style="width:2rem; height:2rem;">
566: 											$!attributes.get("number")
567: 										</span>
568: 									</div>
569: 								#end
570: 							</div>
571: 						</div>
572: 						<div class="bnt-name-info-main flex-grow-1">
573: 							<div class="d-flex flex-column aling-items-center justify-content-between gap-3">
574: 								<div class="player-attributes">
575: 									<h1 class="m-0 p-0">
576: 										$!attributes.get("first_name") $!attributes.get("last_name")
577: 									</h1>
578: 									<ul class="list-unstyled list-inline-pipes d-flex align-items-center justify-content-start gap-2 m-0 w-100">
579: 										#if($attributes.get("position_abbr") && !$attributes.get("position_abbr").empty)
580: 											<li><span>$!attributes.get("position_abbr")</span></li>
581: 										#elseif ($attributes.get("position"))
582: 											<li><span>$!attributes.get("position")</span></li>
583: 										#end
584: 										<li><a href="../teams?id=$!{attributes.get("teamId")}" aria-label="Team Stats - ${attributes.get("team")}">$attributes.get("team")</a></li>
585: 									</ul>
586: 								</div>
587: 							</div>
588: 						</div>
589: 						#if ($rosterHeadshots.size() > 0)
590: 							## do nothing
591: 						#else
592: 							#set ($teamId = $attributes.get("teamId"))
593: 							#if ($teamId.length() > 0)
594: 								<div class="bnt-team-logo">
595: 									<span class="bnt-team-logo ps-2">
596: 										<img class="img-mh-3" src="${website.teamLogo($teamId)}" alt="" />
597: 									</span>
598: 								</div>
599: 							#end
600: 						#end
601: 					</div>
602: 				</div>
603: 				<div class="bnt-highlights mx-3">
604: 					#printHighlights
605: 				</div>
606: 			</div>
607: 		</div>
608: 	</div>
609: 
610: 
611: 	<div class="tabs-container my-3">
612: 
613: 		#printTabs
614: 
615:     	<div class="tab-content p-3 border">
616: 
617:     		## PROFILE
618:     		<div #printPaneAttrs("profile")>
619:     			<div class="row">
620:     				<div class="col-lg">
621:     					<h5>Player Stats</h5>
622:     					$website.include("${page.sectionPage.url}/players?tmpl=stats-bios-rank-template&rank=${playerId}&pos=${statPos}")
623:     				</div>
624:     				<div class="mt-3 col-lg mt-lg-0">
625:     					<h5>Recent Results</h5>
626:     					#printRecentGames
627: 
628: 						#if($website.ads.isMediaInternalSectionsAdsEnabled())
629: 							<!-- Individual Player Page, ad unit is placed below recent results on Desktop and Mobile -->
630: 							<div id="waldo-tag-25894" class="p-3 text-center"></div>
631: 						#end
632:                     </div>
633:     			</div>
634: 
635:                 #if ($hasSynopsis)
636:     				<div class="my-3">$!synopsis</div>
637:                 #end
638: 
639:                 #if ($hasBioBrief)
640:     				<div class="my-3">$website.include($bioBriefURL)</div>
641:                 #end
642: 
643:                 #if ($htmlStatsURL)
644:     				<div class="my-3">$website.include($htmlStatsURL)</div>
645:                 #end
646:     		</div> ## PROFILE
647: 
648:     		## GAMELOG
649:             #set ($activePos = $statPos)
650:             #if ($view == "gamelog" && $paramPos.length() > 0)
651:     			#if ($positions.get($paramPos).length() > 0)
652:     				#set ($activePos = $positions.get($paramPos))
653:     			#end
654:             #end
655: 
656:     		<div #printPaneAttrs("gamelog")>
657:     			#if ($gamelogsCategoriesLabels.size() > 0)
658:     				#printSubTabs($gamelogsCategoriesLabels.entrySet(), "gamelog")
659: 
660:     				<div class="tab-content py-3">
661:     					#foreach($entry in $gamelogsCategoriesLabels.entrySet())
662:     						#set ($class = "tab-pane")
663:     						#if ($entry.key == $activePos)
664:     							#set ($class = "tab-pane active")
665:     						#end
666:     						<div class="${class}" role="tabpanel" id="gamelog-${entry.key}">
667:     							#gamelogData($entry.key)
668:     						</div>
669:     					#end
670:     				</div>
671:     			#else
672:     				#gamelogData($pos)
673:     			#end
674:     		</div> ## tab-pane
675:     		## GAMELOG
676: 
677:             ## CAREER
678:     		#if ($showCareer)
679:     			#set ($activePos = $statPos)
680:     			#if ($view == "career" && $paramPos.length() > 0)
681:     				#if ($positions.get($paramPos).length() > 0)
682:     					#set ($activePos = $positions.get($paramPos))
683:     				#end
684:     			#end
685:     			<div #printPaneAttrs("career")>
686:     				#if ($briefsCategoriesLabels)
687:     					#printCategories($briefsCategoriesLabels "career")
688:     				#else
689:     					#careerData($activePos)
690:     				#end
691:     			</div>
692:     		#end
693:     		## CAREER
694: 
695:             ## SPLITS
696:     		#set ($activePos = $statPos)
697:     		#if ($view == "splits" && $paramPos.length() > 0)
698:     			#if ($positions.get($paramPos).length() > 0)
699:     				#set ($activePos = $positions.get($paramPos))
700:     			#end
701:     		#end
702: 
703:     		<div #printPaneAttrs("splits")>
704:     			#if ($briefsCategoriesLabels)
705:     				#printCategories($briefsCategoriesLabels "splits")
706:     			#else
707:     				#splitsBioNetworkData($pos)
708:     			#end
709:     		</div>
710:     		## SPLITS
711: 
712:     	</div> ## tab-content
713: 	</div> ## tabs-container
714: </div> ## bio-wrapper
715: $wiki.su