You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by de...@apache.org on 2015/09/12 13:48:45 UTC
svn commit: r1702624 - in
/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main:
java/org/apache/uima/ducc/ws/server/ webapp/root/
Author: degenaro
Date: Sat Sep 12 11:48:44 2015
New Revision: 1702624
URL: http://svn.apache.org/r1702624
Log:
UIMA-4569 WS should display actual and requested memory size values
Modified:
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/job.details.table.processes.jsp
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/jobs.jsp
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/service.details.table.deployments.jsp
uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/services.jsp
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java?rev=1702624&r1=1702623&r2=1702624&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandler.java Sat Sep 12 11:48:44 2015
@@ -76,6 +76,7 @@ import org.apache.uima.ducc.transport.ev
import org.apache.uima.ducc.transport.event.common.IDuccProcess.ReasonForStoppingProcess;
import org.apache.uima.ducc.transport.event.common.IDuccProcessMap;
import org.apache.uima.ducc.transport.event.common.IDuccProcessWorkItems;
+import org.apache.uima.ducc.transport.event.common.IDuccSchedulingInfo;
import org.apache.uima.ducc.transport.event.common.IDuccStandardInfo;
import org.apache.uima.ducc.transport.event.common.IDuccState.JobState;
import org.apache.uima.ducc.transport.event.common.IDuccTypes.DuccType;
@@ -954,7 +955,8 @@ public class DuccHandler extends DuccAbs
switch(sType) {
case SPC:
case SPU:
- COLS++;
+ COLS++; // Services
+ COLS++; // Memory
break;
default:
break;
@@ -1054,36 +1056,59 @@ public class DuccHandler extends DuccAbs
cbList[index].append(pid);
logAppend(index,"pid",pid);
cbList[index].append("</td>");
+ // Memory
+ switch(sType) {
+ case SPC:
+ case SPU:
+ index++; // jp.05
+ cbList[index].append("<td align=\"right\">");
+ DuccId duccId = job.getDuccId();
+ IDuccSchedulingInfo si;
+ SizeBytes sizeBytes;
+ String requested;
+ String actual;
+ si = job.getSchedulingInfo();
+ sizeBytes = new SizeBytes(SizeBytes.Type.Bytes, si.getMemorySizeAllocatedInBytes());
+ actual = getProcessMemorySize(duccId,sizeBytes);
+ sizeBytes = new SizeBytes(si.getMemoryUnits().name(), Long.parseLong(si.getMemorySizeRequested()));
+ requested = getProcessMemorySize(duccId,sizeBytes);
+ cbList[index].append("<span title=\""+"requested: "+requested+"\">");
+ cbList[index].append(actual);
+ cbList[index].append("</span>");
+ logAppend(index,"actual",actual);
+ logAppend(index,"requested",requested);
+ break;
+ }
// State:scheduler
- index++; // jp.05
+ index++; // jp.06
cbList[index].append("<td>");
String stateScheduler = getStateScheduler(job,process);
cbList[index].append(stateScheduler);
logAppend(index,"stateScheduler",stateScheduler);
cbList[index].append("</td>");
// Reason:scheduler
- index++; // jp.06
+ index++; // jp.07
cbList[index].append("<td>");
String reasonScheduler = getReasonScheduler(job,process);
cbList[index].append(reasonScheduler);
logAppend(index,"reasonScheduler",reasonScheduler);
cbList[index].append("</td>");
// State:agent
- index++; // jp.07
+ index++; // jp.08
cbList[index].append("<td>");
String stateAgent = getStateAgent(job,process);
cbList[index].append(stateAgent);
logAppend(index,"stateAgent",stateAgent);
cbList[index].append("</td>");
// Reason:agent
- index++; // jp.08
+ index++; // jp.09
cbList[index].append("<td>");
String reasonAgent = getReasonAgent(job,process);
cbList[index].append(reasonAgent);
logAppend(index,"reasonAgent",reasonAgent);
cbList[index].append("</td>");
// Exit
- index++; // jp.09
+ index++; // jp.10
cbList[index].append("<td>");
String exit = getExit(job,process);
cbList[index].append(exit);
@@ -1094,7 +1119,7 @@ public class DuccHandler extends DuccAbs
case MR:
break;
default:
- index++; // jp.10
+ index++; // jp.11
cbList[index].append("<td align=\"right\">");
String timeInit = getTimeInit(job,process,sType);
cbList[index].append(timeInit);
@@ -1103,7 +1128,7 @@ public class DuccHandler extends DuccAbs
break;
}
// Time:run
- index++; // jp.11
+ index++; // jp.12
cbList[index].append("<td align=\"right\">");
String timeRun = getTimeRun(job,process,sType);
cbList[index].append(timeRun);
@@ -1114,7 +1139,7 @@ public class DuccHandler extends DuccAbs
case MR:
break;
default:
- index++; // jp.12
+ index++; // jp.13
cbList[index].append("<td align=\"right\">");
String timeGC = getTimeGC(job,process,sType);
cbList[index].append(timeGC);
@@ -1127,7 +1152,7 @@ public class DuccHandler extends DuccAbs
case MR:
break;
default:
- index++; // jp.13
+ index++; // jp.14
cbList[index].append("<td align=\"right\">");
String pgin = getPgIn(job,process,sType);
cbList[index].append(pgin);
@@ -1140,7 +1165,7 @@ public class DuccHandler extends DuccAbs
case MR:
break;
default:
- index++; // jp.14
+ index++; // jp.15
cbList[index].append("<td align=\"right\">");
String swap = getSwap(job,process,sType);
cbList[index].append(swap);
@@ -1149,14 +1174,14 @@ public class DuccHandler extends DuccAbs
break;
}
// %cpu
- index++; // jp.15
+ index++; // jp.16
cbList[index].append("<td align=\"right\">");
String pctCPU = getPctCPU(job,process);
cbList[index].append(pctCPU);
logAppend(index,"%cpu",pctCPU);
cbList[index].append("</td>");
// rss
- index++; // jp.16
+ index++; // jp.17
cbList[index].append("<td align=\"right\">");
String rss = getRSS(job,process);
cbList[index].append(rss);
@@ -1172,7 +1197,7 @@ public class DuccHandler extends DuccAbs
break;
default:
// Time:avg
- index++; // jp.17
+ index++; // jp.18
String timeAvg = "";
IDuccProcessWorkItems pwi = process.getProcessWorkItems();
cbList[index].append("<td align=\"right\">");
@@ -1192,7 +1217,7 @@ public class DuccHandler extends DuccAbs
logAppend(index,"timeAvg",timeAvg);
cbList[index].append("</td>");
// Time:max
- index++; // jp.18
+ index++; // jp.19
cbList[index].append("<td align=\"right\">");
String timeMax = "";
if(pwi != null) {
@@ -1202,7 +1227,7 @@ public class DuccHandler extends DuccAbs
logAppend(index,"timeMax",timeMax);
cbList[index].append("</td>");
// Time:min
- index++; // jp.19
+ index++; // jp.20
cbList[index].append("<td align=\"right\">");
String timeMin = "";
if(pwi != null) {
@@ -1212,7 +1237,7 @@ public class DuccHandler extends DuccAbs
logAppend(index,"timeMin",timeMin);
cbList[index].append("</td>");
// Done
- index++; // jp.20
+ index++; // jp.21
cbList[index].append("<td align=\"right\">");
String done = "";
if(pwi != null) {
@@ -1222,7 +1247,7 @@ public class DuccHandler extends DuccAbs
logAppend(index,"done",done);
cbList[index].append("</td>");
// Error
- index++; // jp.21
+ index++; // jp.22
cbList[index].append("<td align=\"right\">");
String error = "";
if(pwi != null) {
@@ -1234,7 +1259,7 @@ public class DuccHandler extends DuccAbs
// Dispatch
switch(dType) {
case Job:
- index++; // jp.22
+ index++; // jp.23
cbList[index].append("<td align=\"right\">");
String dispatch = "";
if(pwi != null) {
@@ -1253,7 +1278,7 @@ public class DuccHandler extends DuccAbs
break;
}
// Retry
- index++; // jp.23
+ index++; // jp.24
cbList[index].append("<td align=\"right\">");
String retry = "";
if(pwi != null) {
@@ -1263,7 +1288,7 @@ public class DuccHandler extends DuccAbs
logAppend(index,"retry",retry);
cbList[index].append("</td>");
// Preempt
- index++; // jp.24
+ index++; // jp.25
cbList[index].append("<td align=\"right\">");
String preempt = "";
if(pwi != null) {
@@ -1279,7 +1304,7 @@ public class DuccHandler extends DuccAbs
case MR:
break;
default:
- index++; // jp.24
+ index++; // jp.26
cbList[index].append("<td>");
String jConsole = getJConsole(job,process,sType);
cbList[index].append(jConsole);
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java?rev=1702624&r1=1702623&r2=1702624&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerClassic.java Sat Sep 12 11:48:44 2015
@@ -307,7 +307,7 @@ public class DuccHandlerClassic extends
String displaySwapMax = formatter.format(swap);
sb.append(displaySwapMax);
sb.append("</td>");
- // Size
+ // Memory
IDuccSchedulingInfo si;
SizeBytes sizeBytes;
String requested;
@@ -750,18 +750,20 @@ public class DuccHandlerClassic extends
}
}
sb.append("</td>");
- //
- IDuccSchedulingInfo si = duccwork.getSchedulingInfo();
- SizeBytes size;
- // Size (given)
- sb.append("<td align=\"right\">");
- size = new SizeBytes(SizeBytes.Type.Bytes,si.getMemorySizeAllocatedInBytes());
- sb.append(getProcessMemorySize(duccId,size));
- sb.append("</td>");
- // Size (requested)
- sb.append("<td align=\"right\">");
- size = new SizeBytes(si.getMemoryUnits().name(),Long.parseLong(si.getMemorySizeRequested()));
- sb.append(getProcessMemorySize(duccId,size));
+ // Memory
+ IDuccSchedulingInfo si;
+ SizeBytes sizeBytes;
+ String requested;
+ String actual;
+ si = duccwork.getSchedulingInfo();
+ sizeBytes = new SizeBytes(SizeBytes.Type.Bytes, si.getMemorySizeAllocatedInBytes());
+ actual = getProcessMemorySize(duccId,sizeBytes);
+ sizeBytes = new SizeBytes(si.getMemoryUnits().name(), Long.parseLong(si.getMemorySizeRequested()));
+ requested = getProcessMemorySize(duccId,sizeBytes);
+ sb.append("<td valign=\"bottom\" align=\"right\">");
+ sb.append("<span title=\""+"requested: "+requested+"\">");
+ sb.append(actual);
+ sb.append("</span>");
sb.append("</td>");
// Host Names
sb.append("<td>");
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java?rev=1702624&r1=1702623&r2=1702624&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccHandlerJsonFormat.java Sat Sep 12 11:48:44 2015
@@ -341,7 +341,7 @@ public class DuccHandlerJsonFormat exten
sb.append(displaySwapMax);
sb.append("</span>");
row.add(new JsonPrimitive(sb.toString()));
- // Size
+ // Memory
sb = new StringBuffer();
IDuccSchedulingInfo si;
SizeBytes sizeBytes;
@@ -846,21 +846,19 @@ public class DuccHandlerJsonFormat exten
}
}
row.add(new JsonPrimitive(sb.toString()));
- //
- IDuccSchedulingInfo si = duccwork.getSchedulingInfo();
- SizeBytes size;
- // Size (given)
+ // Memory
sb = new StringBuffer();
- sb.append("<span>");
- size = new SizeBytes(SizeBytes.Type.Bytes,duccwork.getSchedulingInfo().getMemorySizeAllocatedInBytes());
- sb.append(getProcessMemorySize(duccId,size));
- sb.append("</span>");
- row.add(new JsonPrimitive(sb.toString()));
- // Size (requested)
- sb = new StringBuffer();
- sb.append("<span>");
- size = new SizeBytes(si.getMemoryUnits().name(),Long.parseLong(si.getMemorySizeRequested()));
- sb.append(getProcessMemorySize(duccId,size));
+ IDuccSchedulingInfo si;
+ SizeBytes sizeBytes;
+ String requested;
+ String actual;
+ si = duccwork.getSchedulingInfo();
+ sizeBytes = new SizeBytes(SizeBytes.Type.Bytes, si.getMemorySizeAllocatedInBytes());
+ actual = getProcessMemorySize(duccId,sizeBytes);
+ sizeBytes = new SizeBytes(si.getMemoryUnits().name(), Long.parseLong(si.getMemorySizeRequested()));
+ requested = getProcessMemorySize(duccId,sizeBytes);
+ sb.append("<span title=\""+"requested: "+requested+"\">");
+ sb.append(actual);
sb.append("</span>");
row.add(new JsonPrimitive(sb.toString()));
// List
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/job.details.table.processes.jsp
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/job.details.table.processes.jsp?rev=1702624&r1=1702623&r2=1702624&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/job.details.table.processes.jsp (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/job.details.table.processes.jsp Sat Sep 12 11:48:44 2015
@@ -27,7 +27,7 @@ under the License.
<tr class="ducc-head">
<th title="The system assigned id for this process" class="sorttable_numeric">Id</th>
<th title="The log file name associated with this process">Log</th>
- <th title="The log file size, in MB">Size</th>
+ <th title="The log file size, in MB">Log<br/>Size</th>
<th title="The host for this process">Host<br>Name</th>
<th title="The OS assigned PID for this process"class="sorttable_numeric">PID</th>
<th title="Process scheduling state">State<br>Scheduler</th>
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/jobs.jsp
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/jobs.jsp?rev=1702624&r1=1702623&r2=1702624&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/jobs.jsp (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/jobs.jsp Sat Sep 12 11:48:44 2015
@@ -123,7 +123,7 @@ if (table_style.equals("scroll")) {
<th title="The number of job processes that failed during runtime (post-initialization)">Run<br>Fails</th>
<th title="The count for all job processes of major faults which required loading a memory page from disk">Pgin</th>
<th title="The GB swapped out to disk for all job processes, current if state=running or maximum if state=completed">Swap</th>
- <th title="Each job process size, in GB">Size</th>
+ <th title="Each job process size, in GB">Memory</th>
<th title="The total number of work items for this job">Total</th>
<th title="The number of work items that completed successfully">Done</th>
<th title="The number of work items that failed to complete successfully">Error</th>
@@ -163,7 +163,7 @@ if (table_style.equals("classic")) {
<th title="The number of job processes that failed during runtime (post-initialization)">Run<br>Fails</th>
<th title="The count for all job processes of major faults which required loading a memory page from disk">Pgin</th>
<th title="The GB swapped out to disk for all job processes, current if state=running or maximum if state=completed">Swap</th>
- <th title="Each job process size, in GB">Size</th>
+ <th title="Each job process size, in GB">Memory</th>
<th title="The total number of work items for this job">Total</th>
<th title="The number of work items that completed successfully">Done</th>
<th title="The number of work items that failed to complete successfully">Error</th>
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp?rev=1702624&r1=1702623&r2=1702624&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/reservations.jsp Sat Sep 12 11:48:44 2015
@@ -47,7 +47,6 @@ if (table_style.equals("scroll")) {
$('td:eq(9)', nRow).css( "text-align", "right" );
$('td:eq(10)', nRow).css( "text-align", "right" );
$('td:eq(11)', nRow).css( "text-align", "right" );
- $('td:eq(12)', nRow).css( "text-align", "right" );
return nRow;
},
} );
@@ -116,8 +115,7 @@ if (table_style.equals("scroll")) {
<th title="The current state of this reservation">State</th>
<th title="The reason for the final state of this reservation, normally CanceledByUser">Reason</th>
<th title="The combined number of PIDs on the assigned resource(s) for user">User<br>Processes</th>
- <th title="The memory allocation for this reservation, in GB">Size<br/><small>(actual)</small></th>
- <th title="The memory request for this reservation, in GB">Size<br/><small>(requested)</small></th>
+ <th title="The memory allocation for this reservation, in GB">Memory</th>
<th title="The machine(s) assigned to this reservation">Host<br>Names</th>
<th title="The user specified description of this reservation">Description</th>
</tr>
@@ -148,8 +146,7 @@ if (table_style.equals("classic")) {
<th title="The current state of this reservation">State</th>
<th title="The reason for the final state of this reservation, normally CanceledByUser">Reason</th>
<th title="The combined number of PIDs on the assigned resource(s) for user">User<br>Processes</th>
- <th title="The memory allocation for this reservation, in GB">Size<br/><small>(actual)</small></th>
- <th title="The memory request for this reservation, in GB">Size<br/><small>(requested)</small></th>
+ <th title="The memory allocation for this reservation, in GB">Memory</th>
<th title="The machine(s) assigned to this reservation">Host<br>Names</th>
<th title="The user specified description of this reservation">Description</th>
</tr>
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/service.details.table.deployments.jsp
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/service.details.table.deployments.jsp?rev=1702624&r1=1702623&r2=1702624&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/service.details.table.deployments.jsp (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/service.details.table.deployments.jsp Sat Sep 12 11:48:44 2015
@@ -27,9 +27,10 @@ under the License.
<th title="The state of this service instance">State</th>
<th title="The current state of service dependencies">Services</th>
<th title="The log file name associated with this process">Log</th>
- <th title="The log file size, in MB">Size</th>
+ <th title="The log file size, in MB">Log<br/>Size</th>
<th title="The host for this process">Host<br>Name</th>
- <th title="The OS assigned PID for this process"class="sorttable_numeric">PID</th>
+ <th class="sorttable_numeric" title="The OS assigned PID for this process">PID</th>
+ <th class="sorttable_numeric" title="The service process actual memory size (GB)">Memory</th>
<th title="Process scheduling state">State<br>Scheduler</th>
<th title="Process scheduling reason (for scheduling state)">Reason<br>Scheduler<br><small>or extraordinary status</small></th>
<th title="Process agent state">State<br>Agent</th>
Modified: uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/services.jsp
URL: http://svn.apache.org/viewvc/uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/services.jsp?rev=1702624&r1=1702623&r2=1702624&view=diff
==============================================================================
--- uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/services.jsp (original)
+++ uima/sandbox/uima-ducc/trunk/uima-ducc-web/src/main/webapp/root/services.jsp Sat Sep 12 11:48:44 2015
@@ -120,7 +120,7 @@ if (table_style.equals("scroll")) {
<th title="The service scheduling class">Class</th>
<th title="The count for all service processes of major faults which required loading a memory page from disk">Pgin</th>
<th title="The GB swapped out to disk for all initializing/running service processes">Swap</th>
- <th title="The service process memory size (GB)">Size</th>
+ <th title="The service process registered memory size (GB)">Memory<br><small>(registered)</small></th>
<th title="The number of active Jobs that depend on this service">Jobs</th>
<th title="The number of active Services that depend on this service">Ser-<br>vices</th>
<th title="The number of active Reservations that depend on this service">Reser-<br>vations</th>
@@ -156,7 +156,7 @@ if (table_style.equals("classic")) {
<th title="The service scheduling class">Class</th>
<th class="sorttable_numeric" title="The count for all service processes of major faults which required loading a memory page from disk">Pgin</th>
<th class="sorttable_numeric" title="The GB swapped out to disk for all initializing/running service processes">Swap</th>
- <th class="sorttable_numeric" title="The service process memory size (GB)">Size</th>
+ <th class="sorttable_numeric" title="The service process registered memory size (GB)">Memory<br/><small>(registered)</small></th>
<th class="sorttable_numeric" title="The number of active Jobs that depend on this service">Jobs</th>
<th class="sorttable_numeric" title="The number of active Services that depend on this service">Ser-<br>vices</th>
<th class="sorttable_numeric" title="The number of active Reservations that depend on this service">Reser-<br>vations</th>