export function isFunction(obj) {
  return type(obj) === 'function';
};

export function isString(obj) {
  return type(obj) === 'string';
};

export function type(obj) {
  let typeMatches = Object.prototype.toString.call(obj).match(/\[object\s([a-z]+)\]/i);
  return typeMatches != null ? typeMatches[1].toLowerCase() : null;
};

export function strToMilliseconds(strTime) {
  let [_, h, m, s] = strTime.toString().match(/([0-9]{2})\:([0-9]{2})\:([0-9]{2})/);
  return ((h * 60**3) + (m * 60**2) + (s * 60)) * 1000;
};

export function millisecondsToStr(ms) {
  ms /= 1000;
  return [
    `0${Math.floor(ms / 60**3)}`.slice(-2),
    `0${Math.floor((ms % 60**3) / 60**2)}`.slice(-2),
    `0${Math.round(ms % 60**2 / 60)}`.slice(-2)
  ].join(':');
};

export function splitter(str, left, len) {
  const MAX_LENGTH = len || 40;
  let words = str.split(' '), built = '', line = [], lineLen = 0;
  function makeLine() {
    return (!left ? '\t\t' : '') + line.join(' ') + '\n';
  }
  function addLine() {
    if (lineLen > 0) {
      built += makeLine();
      lineLen = 0;
      line = [];
    }
  }
  function extendLine(w) {
    lineLen += w.length;
    line.push(w);
  }
  words.forEach(function (word) {
    if ((lineLen + word.length) > MAX_LENGTH) {
      addLine();
    }
    extendLine(word);
  });
  addLine();
  return built;
};

@@ -553,16 +553,66 @@
 r(ms) %7B%0A
+  let parts = %5B0, 0, 0%5D;%0A  if (isANumber(ms)) %7B%0A  
   ms /= 
@@ -623,25 +623,26 @@
 ;%0A  
+ 
-return
+ parts =
  %5B%0A    
-%600$%7B
+  
 Math
@@ -661,28 +661,16 @@
 60**
-3)%7D%60.slice(-
 2),%0A    
 %600$%7B
@@ -661,28 +661,26 @@
 60**2),%0A    
-%600$%7B
+  
 Math.floor((
@@ -692,41 +692,24 @@
 60**
-3
+2
 ) / 60
-**2)%7D%60.slice(-2
 ),%0A    
-%600$%7B
+  
 Math
@@ -726,33 +726,67 @@
 %25 60
-**2 / 60)%7D%60.slice(-2)%0A  %5D
+)%0A    %5D;%0A  %7D%0A  return parts.map((p) =%3E padTo(p.toString()))
 .joi
@@ -791,24 +791,27 @@
 oin(':');%0A%7D;
+%0A%7D;
 %0A%0Aexport fun

Fix millisecondsToStr function.