MZ@ !L!This program cannot be run in DOS mode. $Rؕ3}3}3}H̴3}H̱3}Rich3}PEL!  .@Д@,.rsrc0.@@8P h!9?@E F8LPMhNOPQRSXY(^@_Xepfklmnopq0rHs`wxx~ 8PP h x           ( 8 H X h x           ( 8 H X h x     D p&*d1(7J=Dz\IMPXQ T"DXYp\aNcek td|  , ̦l8ԯP$t640d|F WMUIIDR_XML_BATTERY_TRANSFORMIDR_XML_DEFAULT_TRANSFORM.XSLIDR_XML_SLEEPSTUDY_TRANSFORM3_: r ȫЇi| =a2 MUI en-USAnalysis FailureZAnalysis was unsuccessful. This can be caused by a corrupted trace file or dropped events.Analysis Error\Analysis was partially unsuccessful. Some results are available, but they may be incomplete.Analysis Success`Analysis was successful. No energy efficiency problems were found. No information was returned.System InformationSystem InformationSystem Information Details Computer NameSystem ManufacturerSystem Product Name BIOS Date BIOS VersionOS Build Number Platform Role Process Count Thread Count Plugged InPAPlatform Timer ResolutionPlatform Timer Resolution,The default platform timer resolution is 15.6ms (15625000ns) and should be used whenever the system is idle. If the timer resolution is increased, processor power management technologies may not be effective. The timer resolution may be increased due to multimedia playback or graphical animations.&Current Timer Resolution (100ns units)"Maximum Timer Period (100ns units)Outstanding Timer RequestiA program or service has requested a timer resolution smaller than the platform maximum timer resolution.Requested PeriodRequesting Process IDRequesting Process Path Outstanding Kernel Timer RequestxA kernel component or device driver has requested a timer resolution smaller than the platform maximum timer resolution.Requested Period Request CountuA program or service has requested a timer resolution equal to or greater than the platform maximum timer resolution.Timer Request StackWThe stack of modules responsible for the lowest platform timer setting in this process.Calling Module Power PolicyActive Power PlanThe current power plan in use Plan GUID#Power Plan Personality (On Battery)NThe personality of the current power plan when the system is on battery power. Personality7Power Plan Personality is High Performance (On Battery)[The current power plan personality is High Performance when the system is on battery power.%Display timeout disabled (On Battery)GThe display is not configured to turn off after a period of inactivity.$Display timeout is long (On Battery)BThe display is configured to turn off after longer than 5 minutes.Timeout (seconds)$Dim timeout is disabled (On Battery)PThe display is not configured to automatically dim after a period of inactivity. Dim timeout is long (On Battery)KThe display is configured to automatically dim after longer than 5 minutes.Timeout (seconds)"Disk idle is disabled (On Battery)IThe disk is not configured to turn off after a period of disk inactivity.!Disk timeout is long (On Battery)@The disk is configured to turn off after longer than 30 minutes.Timeout (seconds)&Sleep timeout is disabled (On Battery)SThe computer is not configured to automatically sleep after a period of inactivity."Sleep timeout is long (On Battery)OThe computer is configured to automatically sleep after longer than 30 minutes.Timeout (seconds)8Minimum processor performance state is 100% (On Battery)\The processor is not configured to automatically reduce power consumption based on activity.8Minimum processor performance state is high (On Battery)`The lowest processor performance state is greater than 75% of the maximum processor performance.4Minimum performance state (% of maximum performance)/Processor idle states are disabled (On Battery)[The current processor power management policy has disabled low-power processor idle states..USB Selective Suspend is disabled (On Battery)EThe current power policy has globally disabled USB selective suspend.=802.11 Radio Power Policy is Maximum Performance (On Battery)rThe current power policy for 802.11-compatible wireless network adapters is not configured to use low-power modes.)PCI Express ASPM is disabled (On Battery)cThe current power policy for PCI Express Active State Power Management (ASPM) is configured to Off.#Power Plan Personality (Plugged In)HThe personality of the current power plan when the system is plugged in.7Power Plan Personality is High Performance (Plugged In)UThe current power plan personality is High Performance when the system is plugged in.%Display timeout disabled (Plugged In)GThe display is not configured to turn off after a period of inactivity.$Display timeout is long (Plugged In)CThe display is configured to turn off after longer than 10 minutes.$Dim timeout is disabled (Plugged In)PThe display is not configured to automatically dim after a period of inactivity. Dim timeout is long (Plugged In)LThe display is configured to automatically dim after longer than 10 minutes."Disk idle is disabled (Plugged In)IThe disk is not configured to turn off after a period of disk inactivity.PA!Disk timeout is long (Plugged In)@The disk is configured to turn off after longer than 30 minutes.&Sleep timeout is disabled (Plugged In)SThe computer is not configured to automatically sleep after a period of inactivity."Sleep timeout is long (Plugged In)OThe computer is configured to automatically sleep after longer than 30 minutes.8Minimum processor performance state is 100% (Plugged In)\The processor is not configured to automatically reduce power consumption based on activity.8Minimum processor performance state is high (Plugged In)`The lowest processor performance state is greater than 75% of the maximum processor performance./Processor idle states are disabled (Plugged In)[The current processor power management policy has disabled low-power processor idle states..USB Selective Suspend is disabled (Plugged In)EThe current power policy has globally disabled USB selective suspend.=802.11 Radio Power Policy is Maximum Performance (Plugged In)rThe current power policy for 802.11-compatible wireless network adapters is not configured to use low-power modes.)PCI Express ASPM is disabled (Plugged In)cThe current power policy for PCI Express Active State Power Management (ASPM) is configured to Off.Video Quality (On Battery)YEnables Windows Media Player to optimize for quality or power savings when playing video. Quality ModeVideo quality (Plugged In)YEnables Windows Media Player to optimize for quality or power savings when playing video.PASystem Availability RequestsSystem Required RequestWThe program has made a request to prevent the system from automatically entering sleep.Requesting ProcessSystem Required RequestWThe service has made a request to prevent the system from automatically entering sleep.Requesting ServiceSystem Required Request`The device or driver has made a request to prevent the system from automatically entering sleep.Requesting Driver InstanceRequesting Driver DevicePASystem Required Request^A kernel component has made a request to prevent the system from automatically entering sleep.Display Required RequestcThe program has made a request to prevent the display from automatically entering a low-power mode.Away Mode Request3The program has made a request to enable Away Mode.Away Mode Request3The service has made a request to enable Away Mode.Execution Required Request6The program has made a request for execution-required.Execution Required Request6The service has made a request for execution-required. USB Suspend)USB Device not Entering Selective SuspendThis device did not enter the USB Selective Suspend state. Processor power management may be prevented when this USB device is not in the Selective Suspend state. Note that this issue will not prevent the system from sleeping.Host Controller IDHost Controller Location Device ID Port Path,USB Device Rarely Entering Selective SuspendThis device intermittently entered the USB Selective Suspend state during the trace. Processor power management may be prevented when this USB device is not in the Selective Suspend state. Note that this issue will not prevent the system from sleeping.Time Suspended (%)Reason\This Bluetooth USB device does not support selective suspend because it is not self powered.cThis Bluetooth USB device does not support selective suspend because it is not remote wake capable.PACPU UtilizationProcessor utilization is lowThe average processor utilization during the trace was very low. The system will consume less power when the average processor utilization is very low.PAAverage Utilization (%)!Processor utilization is moderate0The average processor utilization during the trace was moderate. The system will consume less power when the average processor utilization is very low. Review processor utilization for individual processes to determine which applications and services contribute the most to total processor utilization.Processor utilization is high,The average processor utilization during the trace was high. The system will consume less power when the average processor utilization is very low. Review processor utilization for individual processes to determine which applications and services contribute the most to total processor utilization.:Individual process with significant processor utilization.sThis process is responsible for a significant portion of the total processor utilization recorded during the trace. Process NamePIDAverage Utilization (%)ModuleAverage Module Utilization (%)BatteryBattery Information Battery ID ManufacturerManufacture Date Serial Number Chemistry Long Term Cycle CountDesign CapacityLast Full ChargeLast Full Charge (%)fThe battery stored less than 50% of the Designed Capacity the last time the battery was fully charged.Last Full Charge (%)PALast Full Charge (%)fThe battery stored less than 40% of the Designed Capacity the last time the battery was fully charged.Battery Capacity Unknown[The battery capacity could not be determined. This may indicate a firmware (BIOS) problem.SealedPA&Platform Power Management CapabilitiesSupported Sleep StatesPSleep states allow the computer to enter low-power modes after a period of inactivity. The S3 sleep state is the default sleep state for Windows platforms. The S3 sleep state consumes only enough power to preserve memory contents and allow the computer to resume working quickly. Very few platforms support the S1 or S2 Sleep states.S1 Sleep SupportedS2 Sleep SupportedS3 Sleep SupportedS4 Sleep SupportedkThe S1 sleep state has been disabled because of a known incompatibility with the hardware in this computer.Windows automatically disables sleep on some computers with hardware which is not compatible with sleep. Installing the latest firmware (BIOS) may resolve this issue.kThe S2 sleep state has been disabled because of a known incompatibility with the hardware in this computer.Windows automatically disables sleep on some computers with hardware which is not compatible with sleep. Installing the latest firmware (BIOS) may resolve this issue.kThe S3 sleep state has been disabled because of a known incompatibility with the hardware in this computer.Windows automatically disables sleep on some computers with hardware which is not compatible with sleep. Installing the latest firmware (BIOS) may resolve this issue.+System firmware (BIOS) does not support S3.BThe hardware in this computer does not support the S3 sleep state.7System firmware (BIOS) does not support S4 (Hibernate).HThe hardware in this computer does not support the S4 (Hibernate) state.kThe S3 sleep state has been disabled because of a known incompatibility with the hardware in this computer.Windows automatically disables sleep on some computers with hardware which is not compatible with sleep. Installing the latest firmware (BIOS) may resolve this issue."Sleep is disabled in power policy.;The system administrator has disabled sleep on this system.PALHibernate has been disabled because the system has too much physical memory.UHibernate has been disabled because of an unknown problem with the storage subsystem.\Hibernate has been disabled because the Hibernation file could not be generated or accessed.7Sleep is disabled because a legacy driver is installed.Sleep requires all device drivers to be compatible with Plug-and-Play and Power Management. If a legacy driver is installed, sleep is automatically disabled. Driver NameGThe S1 sleep state has been temporarily disabled by a system component.jThe computer may not transition to sleep when the following components are installed or tasks are ongoing.?Microsoft Basic Display Driver or Microsoft Basic Render Driver Hypervisor9The system is booted from a virtual hard disk file (VHD).GThe S2 sleep state has been temporarily disabled by a system component.jThe computer may not transition to sleep when the following components are installed or tasks are ongoing.PAGThe S3 sleep state has been temporarily disabled by a system component.jThe computer may not transition to sleep when the following components are installed or tasks are ongoing.MThe S4 (Hibernate) state has been temporarily disabled by a system component.jThe computer may not transition to sleep when the following components are installed or tasks are ongoing.)Adaptive Display Brightness is supported.`This computer enables Windows to automatically control the brightness of the integrated display.#Adaptive Display Brightness SupportThis computer does not allow Windows to automatically control the brightness of the integrated display. Installing the latest system firmware (BIOS) may resolve this issue.'Processor Power Management CapabilitiesvEffective processor power management enables the computer to automatically balance performance and energy consumption.GroupIndexIdle (C) State CountPerformance (P) State CountThrottle (T) State CountACPI C2 State Failed ValidationThere is a problem with the definition of the C2 idle state on this computer. Installing the latest system firmware (BIOS) may resolve this issue.ACPI C3 Failed ValidationThere is a problem with the definition of the C3 idle state on this computer. Installing the latest system firmware (BIOS) may resolve this issue.&ACPI Throttle States Failed ValidationThere is a problem with the definition of throttle states on this computer. Installing the latest system firmware (BIOS) may resolve this issue."ACPI _CST Object Failed ValidationThere is a problem with the definition of the ACPI _CST object on this computer. Installing the latest system firmware (BIOS) may resolve this issue."ACPI _CSD Object Failed ValidationThere is a problem with the definition of the ACPI _CSD object on this computer. Installing the latest system firmware (BIOS) may resolve this issue."ACPI _PCT Object Failed ValidationThere is a problem with the definition of the ACPI _PCT object on this computer. Installing the latest system firmware (BIOS) may resolve this issue."ACPI _PSS Object Failed ValidationThere is a problem with the definition of the ACPI _PSS object on this computer. Installing the latest system firmware (BIOS) may resolve this issue."ACPI XPSS Object Failed ValidationThere is a problem with the definition of the ACPI XPSS object on this computer. Installing the latest system firmware (BIOS) may resolve this issue."ACPI _PPC Object Failed ValidationThere is a problem with the definition of the ACPI _PPC object on this computer. Installing the latest system firmware (BIOS) may resolve this issue."ACPI _PSD Object Failed ValidationThere is a problem with the definition of the ACPI _PSD object on this computer. Installing the latest system firmware (BIOS) may resolve this issue."ACPI _PTC Object Failed ValidationThere is a problem with the definition of the ACPI _PTC object on this computer. Installing the latest system firmware (BIOS) may resolve this issue."ACPI _TSS Object Failed ValidationThere is a problem with the definition of the ACPI _TSS object on this computer. Installing the latest system firmware (BIOS) may resolve this issue."ACPI _TPC Object Failed ValidationThere is a problem with the definition of the ACPI _TPC object on this computer. Installing the latest system firmware (BIOS) may resolve this issue."ACPI _TSD Object Failed ValidationThere is a problem with the definition of the ACPI _TSD object on this computer. Installing the latest system firmware (BIOS) may resolve this issue.2Processor Idle State Domain Member Count IncorrectThere is a problem with the number of processors defined as members of a processor idle domain. Installing the latest system firmware (BIOS) may resolve this issue. Domain IDExpected Member CountActual Member CountEProcessor Performance or Throttle State Domain Member Count IncorrectThere is a problem with the number of processors defined as members of a processor performance or throttle state domain. Installing the latest system firmware (BIOS) may resolve this issue.Processor Idle States DisabledProcessor idle states have been automatically disabled due to a known incompatibility with the hardware in this computer. Installing the latest system firmware (BIOS) may resolve this issue.%Processor Performance States DisabledProcessor performance states have been automatically disabled due to a known incompatibility with the hardware in this computer. Installing the latest system firmware (BIOS) may resolve this issue."Processor Throttle States DisabledProcessor throttle states have been automatically disabled due to a known incompatibility with the hardware in this computer. Installing the latest system firmware (BIOS) may resolve this issue.9PCI Express Active-State Power Management (ASPM) DisabledPCI Express Active-State Power Management (ASPM) has been disabled due to a known incompatibility with the hardware in this computer.5Wireless access point does not support WMM Power SaveThe wireless access point the computer is connected to does not support WMM Power Save Mode. The Wi-Fi modem cannot enter Power Save mode to save energy as defined in Wireless Adapter Power Policy.SSID MAC AddressConnected Standby SupportConnected standby allows the computer to enter a low-power mode in which it is always on and connected. If supported, connected standby is used instead of system sleep states.PAConnected Standby Supported"ACPI PCCP Object Failed ValidationThere is a problem with the definition of the ACPI PCCP object on this computer. Installing the latest system firmware (BIOS) may resolve this issue."ACPI _CPC Object Failed ValidationThere is a problem with the definition of the ACPI _CPC object on this computer. Installing the latest system firmware (BIOS) may resolve this issue.Idle State CountIdle State TypeNominal Frequency (MHz)Maximum Performance PercentageLowest Performance PercentageLowest Throttle PercentagePerformance Controls TypeNone*ACPI Performance (P) / Throttle (T) StatesPlatform Clocking Control0ACPI Collaborative Processor Performance ControlPower Engine PluginACPI Idle (C) States Windows To GoBConnected Standby has been disabled due to non-compliant hardware.This computer has indicated support for Connected Standby however one or more hardware components fails to comply with the requirements for this state. The following component(s) do not fulfill these requirements:Storage Hardware WiFi HardwareMobile Broadband HardwareAudio Hardware Compliant Not CompliantMicro Power Engine PluginDevice DriversMDevices with missing or misconfigured drivers can increase power consumption.PA Device Name Device ID Device StatusDevice Problem CodeUnknown Device Sleep StudyWNote: This report does not contain information for the first Connected Standby session. The first Connected Standby session started in an earlier time frame. If interested in the earlier time frame, use &lt;code&gt;powercfg sleepstudy -duration DURATION&lt;/code&gt;. For example, to analyze the past 10 days:&lt;br /&gt;&lt;pre&gt;powercfg sleepstudy -duration 10&lt;/pre&gt;$Analysis errors found for Activators$Analysis errors found for Fx Devices$Analysis errors found for PDC phasesGThe sum of the durations of PDC phases is greater than the CS duration.PA Device NamePAPP Information 4VS_VERSION_INFO@%@%?StringFileInfo040904B0LCompanyNameMicrosoft CorporationbFileDescriptionPower Efficiency Diagnosticsr)FileVersion6.3.9600.16384 (winblue_rtm.130821-1623)6 InternalNameenergy.dll.LegalCopyright Microsoft Corporation. All rights reserved.FOriginalFilenameenergy.dll.muij%ProductNameMicrosoft Windows Operating SystemBProductVersion6.3.9600.16384DVarFileInfo$Translation  Suspended Active Report generated Battery changed Connected standby Screen off Battery AC even odd // Formats a number using the current locale (to handle the 1000's separator). // The result is rounded so no decimal point is shown. function numberToLocaleString(value) { var localeString = Math.round(parseFloat(value + '')).toLocaleString(); return localeString.substring(0, localeString.indexOf('.')); } function padLeft(number, length) { var str = '' + number; while (str.length < length) { str = '0' + str; } return str; } // Returns the number of milliseconds between 2 date-times represented as strings. function msBetween(startTime, endTime) { return startTime > endTime ? msBetween(endTime, startTime) : parseDateTime(endTime) - parseDateTime(startTime); } var dateFormat = /(\d{4})-(\d{2})-(\d{2})[T](\d{2}):(\d{2}):(\d{2})/ // Parses a date-time string and returns a Date (i.e. number of milliseconds) function parseDateTime(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3] + ' ' + match[4] + ':' + match[5] + ':' + match[6]) } // Parses just the date portion of a date-time string and returns a Date // (i.e. number of milliseconds) function parseDate(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3]) } var durationFormat = /P((\d+)D)?T((\d+)H)?((\d+)M)?(\d+)S/ // Convert a string of the form P10DT1H15M40S to a count of milliseconds function parseDurationToMs(value) { var match = durationFormat.exec(value) if (!match) { return 0 } var days = parseInt(match[2] || '0'); var hrs = parseInt(match[4] || '0'); var mins = parseInt(match[6] || '0'); var secs = parseInt(match[7] || '0'); return ((((((days * 24) + hrs) * 60) + mins) * 60) + secs) * 1000; } // Converts milliseconds to days function msToDays(ms) { return (ms / 1000 / 60 / 60 / 24); } function daysToMs(days) { return (days * 24 * 60 * 60 * 1000); } // Formats a number of milliseconds as h:mm:ss function formatDurationMs(value) { var ms = parseInt(value); var secs = ms / 1000; var mins = secs / 60; var hrs = Math.floor(mins / 60); mins = Math.floor(mins % 60); secs = Math.floor(secs % 60); return hrs + ':' + padLeft(mins,2) + ':' + padLeft(secs,2); } // Converts a millisecond timestamp to a day and month string // Note: dayOffset is forward from date. function dateToDayAndMonth(ms, dayOffset) { var adjustedDate = new Date(ms + (dayOffset * 24 * 60 * 60 * 1000)); return padLeft(adjustedDate.getMonth() + 1, 2) + "-" + padLeft(adjustedDate.getDate(), 2); } // Takes a millisecond timestamp and returns a new millisecond timestamp // rounded down to the current day. function dateFloor(ms) { var dt = new Date(ms); return Date.parse(dt.getFullYear() + '/' + (dt.getMonth() + 1) + '/' + dt.getDate()); } Timegraph = { axisTop: 9.5, axisRight: 24.5, axisBottom: 25.5, axisLeft: 25.5, ticks: 10, // Maximum number of 24 hour ticks for showing 12 and 6 hour ticks ticks12Hour: 8, ticks6Hour: 4, // Shading lineColor: "#B82830", shadingColor: "#4d1d35", precompute: function (graph) { var canvas = graph.canvas; var data = graph.data; var min = 0; var max = 0; graph.height = canvas.height - Timegraph.axisTop - Timegraph.axisBottom; graph.width = canvas.width - Timegraph.axisLeft - Timegraph.axisRight; for (var i = 0; i < data.length; i++) { data[i].t0 = parseDateTime(data[i].x0); data[i].t1 = parseDateTime(data[i].x1); if (i == 0) { min = data[i].t0; max = data[i].t1; } if (data[i].t0 < min) { min = data[i].t0; } if (data[i].t1 > max) { max = data[i].t1; } data[i].yy0 = Timegraph.axisTop + graph.height - data[i].y0 * graph.height; data[i].yy1 = Timegraph.axisTop + graph.height - data[i].y1 * graph.height; } if (graph.startTime != null) { graph.startMs = parseDateTime(graph.startTime); } else { graph.startMs = min; } graph.endMs = max; graph.durationMs = max - min; }, drawFrame: function (graph) { var canvas = graph.canvas; var context = graph.context; graph.width = canvas.width - Timegraph.axisRight - Timegraph.axisLeft; graph.height = canvas.height - Timegraph.axisTop - Timegraph.axisBottom; context.beginPath(); context.moveTo(Timegraph.axisLeft, Timegraph.axisTop); context.lineTo(Timegraph.axisLeft + graph.width, Timegraph.axisTop); context.lineTo(Timegraph.axisLeft + graph.width, Timegraph.axisTop + graph.height); context.lineTo(Timegraph.axisLeft, Timegraph.axisTop + graph.height); context.lineTo(Timegraph.axisLeft, Timegraph.axisTop); context.strokeStyle = "#c0c0c0"; context.stroke(); }, drawRange: function (graph) { var canvas = graph.canvas; var context = graph.context; context.font = "12pt Segoe UI"; context.fillStyle = "#00b0f0"; context.fillText("%", 0, Timegraph.axisTop + 5, Timegraph.axisLeft); var tickSpacing = graph.height / 10; var offset = Timegraph.axisTop + tickSpacing; var tickValue = 90; for (var i = 0; i < 9; i++) { context.beginPath(); context.moveTo(Timegraph.axisLeft, offset); context.lineTo(Timegraph.axisLeft + graph.width, offset); context.stroke(); context.fillText(tickValue.toString(), 0, offset + 5, Timegraph.axisLeft); offset += tickSpacing; tickValue -= 10; } }, drawDomain: function (graph, start, end) { var canvas = graph.canvas; var context = graph.context; var data = graph.data; var duration = end - start; if ((end < start)) { return; } var startDay = dateFloor(start); var t0 = startDay; var t1 = dateFloor(end); var dayOffset = 0; if (start > t0) { t0 = t0 + daysToMs(1); dayOffset++; } if (t0 >= t1) { return; } var increment = Math.max(Math.floor((t1 - t0) / daysToMs(Timegraph.ticks)), 1); var incrementMs = daysToMs(increment); var spacing = (incrementMs / duration) * graph.width; var offset = (t0 - start) / duration; var ticksCount = Math.floor((t1 - t0) / incrementMs); for (offset = offset * graph.width + Timegraph.axisLeft; offset < (graph.width + Timegraph.axisLeft); offset += spacing) { context.beginPath(); context.moveTo(offset, Timegraph.axisTop); context.lineTo(offset, Timegraph.axisTop + graph.height); context.stroke(); context.fillText(dateToDayAndMonth(startDay, dayOffset), offset, Timegraph.axisTop + graph.height + 15, spacing); dayOffset += increment; } }, plot: function (graph, start, end) { var canvas = graph.canvas; var context = graph.context var data = graph.data; if ((end < start)) { return; } var duration = end - start; Timegraph.drawDomain(graph, start, end); context.fillStyle = Timegraph.shadingColor; for (var i = 0; i < data.length - 1; i++) { if ((data[i].t0 < start) || (data[i].t0 > end) || (data[i].t1 > end)) { continue; } var x1 = (data[i].t0 - start) / duration; x1 = x1 * graph.width + Timegraph.axisLeft; var x2 = (data[i].t1 - start) / duration; x2 = x2 * graph.width + Timegraph.axisLeft; context.globalAlpha = 0.3; context.fillRect(x1, Timegraph.axisTop, (x2 - x1), graph.height); context.globalAlpha = 1; context.beginPath(); context.strokeStyle = Timegraph.lineColor; context.lineWidth = 1.5; context.moveTo(x1, data[i].yy0); context.lineTo(x2, data[i].yy1); context.stroke(); } }, draw: function (graph) { var canvas = document.getElementById(graph.element); if (canvas == null) { return; } var context = canvas.getContext('2d'); if (context == null) { return; } graph.width = 0; graph.height = 0; graph.context = context; graph.canvas = canvas; Timegraph.precompute(graph); Timegraph.drawFrame(graph); Timegraph.drawRange(graph); Timegraph.plot(graph, graph.startMs, graph.endMs); } }; { x0: "", x1: "", y0: , y1: }, drainGraphData = [ ];

Battery report

COMPUTER NAME
SYSTEM PRODUCT NAME
BIOS
OS BUILD
PLATFORM ROLE
CONNECTED STANDBY Supported Not supported
REPORT TIME

Installed batteries

Information about each currently installed battery
No batteries are currently installed
BATTERY
NAME
MANUFACTURER
SERIAL NUMBER
CHEMISTRY
DESIGN CAPACITY -
FULL CHARGE CAPACITY -
CYCLE COUNT

Recent usage

Power states over the last days
START TIME STATE SOURCE CAPACITY REMAINING
- - - - -

Battery usage

Battery drains over the last days
START TIME STATE DURATION ENERGY DRAINED
- - - - -

Usage history

History of system usage on AC and battery
BATTERY DURATION AC DURATION
PERIOD ACTIVE CONNECTED STANDBY ACTIVE CONNECTED STANDBY
- - - - -
- - - - -

Battery capacity history

Charge capacity history of the system's batteries
PERIOD FULL CHARGE CAPACITY DESIGN CAPACITY
- - -

Battery life estimates

Battery life estimates based on observed drains
AT FULL CHARGE AT DESIGN CAPACITY
PERIOD ACTIVE CONNECTED STANDBY ACTIVE CONNECTED STANDBY
- - - - -
Current estimate of battery life based on all observed drains since OS install
Since OS install - -
/ 16 h
- -
/ 16 h
- -
/ 16 h
- -
/ 16 h
Battery report


- - mWh - mWh - % - % - endTime ? msBetween(endTime, startTime) : parseDateTime(endTime) - parseDateTime(startTime); } var dateFormat = /(\d{4})-(\d{2})-(\d{2})[T](\d{2}):(\d{2}):(\d{2})/ // Parses a date-time string and returns a Date (i.e. number of milliseconds) function parseDateTime(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3] + ' ' + match[4] + ':' + match[5] + ':' + match[6]) } // Parses just the date portion of a date-time string and returns a Date (i.e. number of milliseconds) function parseDate(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3]) } var durationFormat = /P((\d+)D)?T((\d+)H)?((\d+)M)?(\d+)S/ // Convert a string of the form P10DT1H15M40S to a count of milliseconds function parseDurationToMs(value) { var match = durationFormat.exec(value) if (!match) { return 0 } var days = parseInt(match[2] || '0'); var hrs = parseInt(match[4] || '0'); var mins = parseInt(match[6] || '0'); var secs = parseInt(match[7] || '0'); return ((((((days * 24) + hrs) * 60) + mins) * 60) + secs) * 1000; } // Formats a number of milliseconds as h:mm:ss function formatDurationMs(value) { var ms = parseInt(value); var secs = ms / 1000; var mins = secs / 60; var hrs = Math.floor(mins / 60); mins = Math.floor(mins % 60); secs = Math.floor(secs % 60); return hrs + ':' + padLeft(mins,2) + ':' + padLeft(secs,2); } // Converts a string representing a date time to a day and month string function dateToDayAndMonth(date, dayOffset) { var adjustedDate = new Date(parseDate(date) - (dayOffset * 24 * 60 * 60 * 1000)); return padLeft(adjustedDate.getMonth() + 1, 2) + "-" + adjustedDate.getDate(); } ]]>

Power Efficiency Diagnostics Report

Computer Name
Scan Time
Scan Duration seconds
System Manufacturer
System Product Name
BIOS Date
BIOS Version
OS Build
Platform Role
Plugged In
Process Count
Thread Count
Report GUID {}

Analysis Results

Warning: Events were dropped during tracing. This may result in incomplete analysis results.

Errors

Warnings

Information

error-log-entry warning-log-entry info-log-entry
:
Power Saver High Performance Balanced Plan Name OEM Power Saver OEM High Performance OEM Balanced Custom Optimize for Video Quality Balance Video Quality and Power Savings Optimize for Power Savings Module Average Module Utilization (%) Calling Module Stack Unknown Module
P Connected standby Screen off // Add support for drawing dashed lines to Canvas CanvasRenderingContext2D.prototype.dashedLine = function (x0, y0, x1, y1, dashArray) { if (dashArray == null) { dashArray = [4, 4]; } var dx = x1 - x0; var dy = y1 - y0; var distance = Math.sqrt(Math.pow((x1 - x0), 2) + Math.pow((y1 - y0), 2)); var theta = Math.atan(dy / dx); if (dx < 0) { theta += Math.PI; } var i = 0; while (distance > 0) { var length = Math.min(distance, dashArray[i]); x0 += length * Math.cos(theta); y0 += length * Math.sin(theta); if (i % 2 == 0) { this.lineTo(x0, y0); } else { this.moveTo(x0, y0); } distance -= length; i = (i + 1) % dashArray.length; } }; // Formats a number using the current locale (to handle the 1000's separator). // The result is rounded so no decimal point is shown. function numberToLocaleString(value) { var localeString = Math.round(parseFloat(value + '')).toLocaleString(); return localeString.substring(0, localeString.indexOf('.')); } function padLeft(number, length) { var str = '' + number; while (str.length < length) { str = '0' + str; } return str; } // Returns the number of milliseconds between 2 date-times represented as strings. function msBetween(startTime, endTime) { return startTime > endTime ? msBetween(endTime, startTime) : parseDateTime(endTime) - parseDateTime(startTime); } var dateFormat = /(\d{4})-(\d{2})-(\d{2})[T](\d{2}):(\d{2}):(\d{2})/ // Parses a date-time string and returns a Date (i.e. number of milliseconds) function parseDateTime(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3] + ' ' + match[4] + ':' + match[5] + ':' + match[6]) } // Parses just the date portion of a date-time string and returns a Date // (i.e. number of milliseconds) function parseDate(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3]) } var durationFormat = /P((\d+)D)?T((\d+)H)?((\d+)M)?(\d+)S/ // Convert a string of the form P10DT1H15M40S to a count of milliseconds function parseDurationToMs(value) { var match = durationFormat.exec(value) if (!match) { return 0 } var days = parseInt(match[2] || '0'); var hrs = parseInt(match[4] || '0'); var mins = parseInt(match[6] || '0'); var secs = parseInt(match[7] || '0'); return ((((((days * 24) + hrs) * 60) + mins) * 60) + secs) * 1000; } // Converts milliseconds to days function msToDays(ms) { return (ms / 1000 / 60 / 60 / 24); } function daysToMs(days) { return (days * 24 * 60 * 60 * 1000); } // Formats a number of milliseconds as h:mm:ss function formatDurationMs(value) { var ms = parseInt(value); var secs = ms / 1000; var mins = secs / 60; var hrs = Math.floor(mins / 60); mins = Math.floor(mins % 60); secs = Math.floor(secs % 60); return hrs + ':' + padLeft(mins,2) + ':' + padLeft(secs,2); } // Converts a millisecond timestamp to a day and month string // Note: dayOffset is forward from date. function dateToDayAndMonth(ms, dayOffset) { var adjustedDate = new Date(ms + (dayOffset * 24 * 60 * 60 * 1000)); return padLeft(adjustedDate.getMonth() + 1, 2) + "-" + padLeft(adjustedDate.getDate(), 2); } // Takes a millisecond timestamp and returns a new millisecond timestamp // rounded down to the current day. function dateFloor(ms) { var dt = new Date(ms); return Date.parse(dt.getFullYear() + '/' + (dt.getMonth() + 1) + '/' + dt.getDate()); } Timegraph = { axisTop: 9.5, axisRight: 24.5, axisBottom: 25.5, axisLeft: 25.5, ticks: 10, // Maximum number of 24 hour ticks for showing 12 and 6 hour ticks ticks12Hour: 8, ticks6Hour: 4, // Shading shadingColor: "#d0d0d0", precompute: function (graph) { var canvas = graph.canvas; var data = graph.data; var min = 0; var max = 0; graph.height = canvas.height - Timegraph.axisTop - Timegraph.axisBottom; graph.width = canvas.width - Timegraph.axisLeft - Timegraph.axisRight; for (var i = 0; i < data.length; i++) { data[i].t0 = parseDateTime(data[i].x0); data[i].t1 = parseDateTime(data[i].x1); if (i == 0) { min = data[i].t0; max = data[i].t1; } if (data[i].t0 < min) { min = data[i].t0; } if (data[i].t1 > max) { max = data[i].t1; } data[i].yy0 = Timegraph.axisTop + graph.height - data[i].y0 * graph.height; data[i].yy1 = Timegraph.axisTop + graph.height - data[i].y1 * graph.height; } if (graph.startTime != null) { graph.startMs = parseDateTime(graph.startTime); } else { graph.startMs = min; } graph.endMs = max; graph.durationMs = max - min; }, drawFrame: function (graph) { var canvas = graph.canvas; var context = graph.context; graph.width = canvas.width - Timegraph.axisRight - Timegraph.axisLeft; graph.height = canvas.height - Timegraph.axisTop - Timegraph.axisBottom; context.beginPath(); context.moveTo(Timegraph.axisLeft, Timegraph.axisTop); context.lineTo(Timegraph.axisLeft + graph.width, Timegraph.axisTop); context.lineTo(Timegraph.axisLeft + graph.width, Timegraph.axisTop + graph.height); context.lineTo(Timegraph.axisLeft, Timegraph.axisTop + graph.height); context.lineTo(Timegraph.axisLeft, Timegraph.axisTop); context.strokeStyle = "#c0c0c0"; context.stroke(); }, drawRange: function (graph) { var canvas = graph.canvas; var context = graph.context; context.font = "12pt Segoe UI"; context.fillStyle = "#00b0f0"; context.fillText("%", 0, Timegraph.axisTop + 5, Timegraph.axisLeft); var tickSpacing = graph.height / 10; var offset = Timegraph.axisTop + tickSpacing; var tickValue = 90; for (var i = 0; i < 9; i++) { context.beginPath(); context.moveTo(Timegraph.axisLeft, offset); context.lineTo(Timegraph.axisLeft + graph.width, offset); context.stroke(); context.fillText(tickValue.toString(), 0, offset + 5, Timegraph.axisLeft); offset += tickSpacing; tickValue -= 10; } }, drawDomain: function (graph, start, end) { var canvas = graph.canvas; var context = graph.context; var data = graph.data; var duration = end - start; if ((end < start)) { return; } var startDay = dateFloor(start); var t0 = startDay; var t1 = dateFloor(end); var dayOffset = 0; if (start > t0) { t0 = t0 + daysToMs(1); dayOffset++; } if (t0 >= t1) { return; } var increment = Math.max(Math.floor((t1 - t0) / daysToMs(Timegraph.ticks)), 1); var incrementMs = daysToMs(increment); var spacing = (incrementMs / duration) * graph.width; var offset = (t0 - start) / duration; var ticksCount = Math.floor((t1 - t0) / incrementMs); for (offset = offset * graph.width + Timegraph.axisLeft; offset < (graph.width + Timegraph.axisLeft); offset += spacing) { context.beginPath(); context.moveTo(offset, Timegraph.axisTop); context.lineTo(offset, Timegraph.axisTop + graph.height); context.stroke(); context.fillText(dateToDayAndMonth(startDay, dayOffset), offset, Timegraph.axisTop + graph.height + 15, spacing); dayOffset += increment; } }, plot: function (graph, start, end) { var canvas = graph.canvas; var context = graph.context var data = graph.data; if ((end < start)) { return; } var duration = end - start; Timegraph.drawDomain(graph, start, end); context.fillStyle = Timegraph.shadingColor; for (var i = 0; i < data.length - 1; i++) { if ((data[i].t0 < start) || (data[i].t0 > end) || (data[i].t1 > end)) { continue; } var x1 = (data[i].t0 - start) / duration; x1 = x1 * graph.width + Timegraph.axisLeft; var x2 = (data[i].t1 - start) / duration; x2 = x2 * graph.width + Timegraph.axisLeft; context.globalAlpha = 0.3; context.fillRect(x1, Timegraph.axisTop, (x2 - x1), graph.height); context.globalAlpha = 1; context.beginPath(); context.strokeStyle = graph.lineTypes[data[i].type].color; context.lineWidth = 1.5; if (graph.lineTypes[data[i].type].dotted == 1) { context.dashedLine(x1, data[i].yy0, x2, data[i].yy1); } else { context.moveTo(x1, data[i].yy0); context.lineTo(x2, data[i].yy1); } context.stroke(); } }, draw: function (graph) { var canvas = document.getElementById(graph.element); if (canvas == null) { return; } var context = canvas.getContext('2d'); if (context == null) { return; } graph.width = 0; graph.height = 0; graph.context = context; graph.canvas = canvas; Timegraph.precompute(graph); Timegraph.drawFrame(graph); Timegraph.drawRange(graph); Timegraph.plot(graph, graph.startMs, graph.endMs); } }; Histogram = { // Constants yTicks: 10, axisLeft: 30.5, axisBottom: 25.5, paddingTop: 5, maxPadding: 25, barColor: "#1191c1", // Functions precompute: function (graph) { var canvas = graph.canvas; var bucketCount = 0; for (var i = 0; i < graph.data.length; i++) { if (graph.data[i].value > graph.max) { graph.max = graph.data[i].value; } bucketCount++; } if (graph.rangeMax != null) { graph.max = Math.max(graph.max, graph.rangeMax); } graph.bucketCount = bucketCount; graph.tickSpacing = (canvas.width - Histogram.axisLeft) / bucketCount; graph.height = canvas.height; graph.width = canvas.width; }, drawFrame: function (graph) { var context = graph.context; var canvas = graph.canvas; context.beginPath(); context.moveTo(Histogram.axisLeft, Histogram.paddingTop); context.lineTo(Histogram.axisLeft, canvas.height - Histogram.axisBottom); context.lineTo(canvas.width, canvas.height - Histogram.axisBottom); context.stroke(); }, drawDomain: function (graph) { var context = graph.context; var tickOffset = 0; context.font = "8pt Segoe UI"; context.fillStyle = "#00b0f0"; for (var i = 0; i < graph.bucketCount; i++) { context.fillText(graph.data[i].interval, Histogram.axisLeft + tickOffset + 2, graph.height - 10, graph.tickSpacing); tickOffset += graph.tickSpacing; } }, drawRange: function (graph) { var context = graph.context; var tickSpacing = (graph.height - Histogram.axisBottom - 25) / Histogram.yTicks; var tickIncrement = Math.round(graph.max / Histogram.yTicks); var tickOffset = graph.height - Histogram.axisBottom - tickSpacing; var tickValue = tickIncrement; context.font = "12pt Segoe UI"; context.fillStyle = "#00b0f0"; for (var i = 0; i < Histogram.yTicks; i++) { context.beginPath(); context.moveTo(Histogram.axisLeft, tickOffset); context.lineTo(Histogram.axisLeft + 5, tickOffset); context.stroke(); context.fillText(tickValue.toString(), 0, tickOffset + 5, Histogram.axisLeft); tickValue += tickIncrement; tickOffset -= tickSpacing; } }, plot: function (graph) { var tickOffset = 0; var context = graph.context; context.fillStyle = Histogram.barColor; for (var i = 0; i < graph.bucketCount; i++) { if (graph.data[i].value == 0) { tickOffset += graph.tickSpacing;; continue; } var barHeight = Math.round((graph.data[i].value * (graph.height - 50)) / graph.max); context.fillRect(Histogram.axisLeft + tickOffset + Histogram.paddingTop, graph.height - Histogram.axisBottom - barHeight, graph.tickSpacing - 10, barHeight); tickOffset += graph.tickSpacing; } }, draw: function (graph) { var canvas = document.getElementById(graph.element); if (canvas == null) { return; } var context = canvas.getContext("2d"); if (context == null) { return; } if (graph.data == null) { return; } graph.bucketCount = 0; graph.max = 0; graph.tickSpacing = 0; graph.wdith = 0; graph.height = 0; graph.context = context; graph.canvas = canvas; context.strokeStyle = "#c0c0c0"; Histogram.precompute(graph); Histogram.drawFrame(graph); Histogram.drawRange(graph); Histogram.drawDomain(graph); Histogram.plot(graph); } }; Collapser = { topActiveBlockerDivs: {}, detailsContainers: {}, getContainerBody: function (container) { var children = container.childNodes; var containerBody = null; for (var i = 0; i < children.length; i++) { if (children[i].tagName == "DIV" && (children[i].className == "analysis-body-collapsed" || children[i].className == "analysis-body")) { containerBody = children[i]; break; } } return containerBody; }, togglePanel: function (container) { var containerBody = Collapser.getContainerBody(container); if (containerBody == null) { return; } var heading = container.getElementsByTagName("H1")[0]; var expander = heading.getElementsByClassName("expander")[0]; if (containerBody.className == "analysis-body-collapsed") { containerBody.className = "analysis-body"; expander.innerHTML = "- "; } else { containerBody.className = "analysis-body-collapsed"; expander.innerHTML = "+ "; } }, toggleDetails: function (element) { if (element.className == "scenario-details-collapsed") { element.className = "scenario-details"; } else { element.className = "scenario-details-collapsed"; } }, initializePanels: function () { var elements = document.getElementsByClassName("analysis-container"); for (var i = 0; i < elements.length; i++) { var element = elements[i]; var heading = element.getElementsByTagName("h1")[0]; if (heading == null) { continue; } heading.onclick = function () { var container = this.parentNode; Collapser.togglePanel(container); }; } }, initializeDetails: function() { var elements = document.getElementsByClassName("details-expander"); for (var i = 0; i < elements.length; i++) { var element = elements[i]; var targetId = "details-" + element.id.replace("details-expand-", ""); var targetElement = document.getElementById(targetId); Collapser.detailsContainers[element.id] = targetElement; element.onclick = function () { var targetElement = Collapser.detailsContainers[this.id]; Collapser.toggleDetails(targetElement); }; } }, initializeLinks: function () { var links = document.getElementsByClassName("top-active-link"); for (var i = 0; i < links.length; i++) { var link = links[i]; var targetId = link.getAttribute("href").substring(1); var targetElement = document.getElementById(targetId); if (targetElement.tagName.toLowerCase() == "tr") { // tr, tbody, table, div.analysis-body-*, div.analysis-container Collapser.topActiveBlockerDivs[targetId] = targetElement.parentNode.parentNode.parentNode.parentNode; } else { Collapser.topActiveBlockerDivs[targetId] = targetElement; } link.onclick = function () { var targetId = this.getAttribute("href").substring(1); var targetContainer = Collapser.topActiveBlockerDivs[targetId]; var container = targetContainer; while ((container != null) && (container.tagName == "DIV")) { var containerBody = Collapser.getContainerBody(container); if (containerBody == null) { return; } if (containerBody.className == "analysis-body-collapsed") { Collapser.togglePanel(container); } container = container.parentNode.parentNode; } targetContainer.scrollIntoView(true); }; } }, initializeCollapser: function () { Collapser.initializePanels(); Collapser.initializeDetails(); TableDecorator.decorate({ element: ".top-blocker", withClass: "top-active-link" }); Collapser.initializeLinks(); }, initialize: function () { if (window.addEventListener != null) { window.addEventListener("load", Collapser.initializeCollapser, false); } else if (window.attachEvent != null) { window.attachEvent("onload", Collapser.initializeCollapser); } } }; TableDecorator = { decorateTable: function (table, linkClass) { if (table == null) { return; } var rows = table.getElementsByTagName("tr"); for (var i = 0; i < rows.length; i++) { var row = rows[i]; var anchor = row.getElementsByClassName("row-link")[0]; if (anchor == null || anchor.tagName.toLowerCase() != "a") { continue; } var link = anchor.getAttribute("href"); for (var j = 0; j < row.children.length; j++) { var cell = row.children[j]; if (cell == anchor.parentNode) { continue; } var classString = ""; if (linkClass != null) { classString = " class=\"" + linkClass + "\""; } cell.innerHTML = "<a href=\"" + link + "\"" + classString + ">" + cell.innerHTML + "</a>"; } } }, decorate: function (tableData) { var selection = tableData.element; if (selection.charAt(0) == ".") { var className = selection.substring(1); var elements = document.getElementsByClassName(className); for (var i = 0; i < elements.length; i++) { if (elements[i].tagName.toLowerCase() == "table") { TableDecorator.decorateTable(elements[i], tableData.withClass); } } } else if (selection.charAt(0) == "#") { var idName = selection.substring(1); var element = document.getElementById(idName); if (element.tagName.toLowerCase() == "table") { TableDecorator.decorateTable(element, tableData.withClass); } } }, }; function initializeScrollTop() { var elements = document.getElementsByClassName("scroll-top-button"); for (var i = 0; i < elements.length; i++) { var element = elements[i]; element.onclick = function () { window.scroll(0, 0); window.location.replace("#"); if (typeof window.history.replaceState == "function") { history.replaceState({}, "", window.location.href.slice(0, -1)); } } } } { x0: "", x1: "", y0: , y1: , type: 0 2 3 4 1 0 4 }, drainGraphData = [ ]; Histogram.draw({ element: "drips-histogram-", data: dripsBuckets_, rangeMax: 100 }); dripsBuckets_ = [ ]; { interval : " ", value : },

+

COMPUTER NAME
SYSTEM PRODUCT NAME
BIOS
OS BUILD
PLATFORM ROLE
REPORT TIME
Legend
GRAPH LINE DESCRIPTION
Dotted AC power
Solid Battery power
No line System powered off
Grey Active Scenario
Green Low System Activity
Orange Moderate System Activity
Red High System Activity
START TIME DURATION ENERGY CHANGE CHANGE RATE % LOW POWER STATE TIME
- - - - - - - -
row- #connected-standby-session- row-link Drain Charge % HW: % % connected-standby-session-
Top

Connected Standby Session

row-
START TIME DURATION ENERGY CHANGE CHANGE RATE % LOW POWER STATE TIME
Drain Charge % HW: % % details-expander details-expand-
scenario-details-collapsed details-
IR TRUNCATE PERCENTAGE %
PEP PRE-VETO COUNT
PEP VETO COUNT

DRIPS Histogram

Percent of time spent in DRIPS bucketed by time interval length
drips-histogram- 864 300

Top Offenders

Top 5 offenders, ranked by active time
NAME TYPE % ACTIVE TIME ACTIVE TIME
SPM Scenario Time Active Time Disabled Time Suspended Time Disengaged
n/a n/a % row- #offender- top-active-link row-link Unknown

+

analysis-container analysis-

+ Processors

No processor activity reported.
analysis-container analysis- offender-

+

% ACTIVE TIME ACTIVE TIME
analysis-container analysis-

+ Activators

No activator activity reported.
analysis-container analysis- offender-

+

% ACTIVE TIME ACTIVE TIME
offender- row-
analysis-container analysis-

+ PDC Phases

PHASE % TIME TIME
analysis-container analysis-

+ Fx Devices

No device activity reported.
analysis-container analysis- offender-

+

% ACTIVE TIME ACTIVE TIME
COMPONENT % ACTIVE TIME ACTIVE TIME
3 row- No active components.
row-
analysis-container analysis- offender-

+ Networking

No networking activity reported.
analysis-container analysis-

+ Other

analysis-container analysis- offender-

+

% ACTIVE TIME ACTIVE TIME

Installed batteries

Information about each currently installed battery
No batteries are currently installed.
BATTERY
NAME
MANUFACTURER
SERIAL NUMBER
CHEMISTRY
DESIGN CAPACITY -
CAPACITY RATIO %
CYCLE COUNT
Sleep Study

Sleep Study

Connected Standby Transitions

Battery drains over the last days
Connected Standby transitions over the last days

Analysis Results

Analysis of issues that might cause poor battery life



- - mWh - mWh % of battery - - % - mW - % - endTime ? msBetween(endTime, startTime) : parseDateTime(endTime) - parseDateTime(startTime); } var dateFormat = /(\d{4})-(\d{2})-(\d{2})[T](\d{2}):(\d{2}):(\d{2})/ // Parses a date-time string and returns a Date (i.e. number of milliseconds) function parseDateTime(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3] + ' ' + match[4] + ':' + match[5] + ':' + match[6]) } // Parses just the date portion of a date-time string and returns a Date (i.e. number of milliseconds) function parseDate(value) { if (!value) { return 0; } var match = dateFormat.exec(value) if (!match) { return 0; } return Date.parse(match[1] + '/' + match[2] + '/' + match[3]) } var durationFormat = /P((\d+)D)?T((\d+)H)?((\d+)M)?(\d+)S/ // Convert a string of the form P10DT1H15M40S to a count of milliseconds function parseDurationToMs(value) { var match = durationFormat.exec(value) if (!match) { return 0 } var days = parseInt(match[2] || '0'); var hrs = parseInt(match[4] || '0'); var mins = parseInt(match[6] || '0'); var secs = parseInt(match[7] || '0'); return ((((((days * 24) + hrs) * 60) + mins) * 60) + secs) * 1000; } // Formats a number of milliseconds as h:mm:ss function formatDurationMs(value) { var ms = parseInt(value); var secs = ms / 1000; var mins = secs / 60; var hrs = Math.floor(mins / 60); mins = Math.floor(mins % 60); secs = Math.floor(secs % 60); return hrs + ':' + padLeft(mins,2) + ':' + padLeft(secs,2); } // Converts a string representing a date time to a day and month string function dateToDayAndMonth(date, dayOffset) { var adjustedDate = new Date(parseDate(date) - (dayOffset * 24 * 60 * 60 * 1000)); return padLeft(adjustedDate.toLocaleDateString()); } ]]>
PPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGXXPADDINGPADDINGX