'use strict'; 
 | 
// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js 
 | 
var uncurryThis = require('../internals/function-uncurry-this'); 
 | 
  
 | 
var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1 
 | 
var base = 36; 
 | 
var tMin = 1; 
 | 
var tMax = 26; 
 | 
var skew = 38; 
 | 
var damp = 700; 
 | 
var initialBias = 72; 
 | 
var initialN = 128; // 0x80 
 | 
var delimiter = '-'; // '\x2D' 
 | 
var regexNonASCII = /[^\0-\u007E]/; // non-ASCII chars 
 | 
var regexSeparators = /[.\u3002\uFF0E\uFF61]/g; // RFC 3490 separators 
 | 
var OVERFLOW_ERROR = 'Overflow: input needs wider integers to process'; 
 | 
var baseMinusTMin = base - tMin; 
 | 
  
 | 
var $RangeError = RangeError; 
 | 
var exec = uncurryThis(regexSeparators.exec); 
 | 
var floor = Math.floor; 
 | 
var fromCharCode = String.fromCharCode; 
 | 
var charCodeAt = uncurryThis(''.charCodeAt); 
 | 
var join = uncurryThis([].join); 
 | 
var push = uncurryThis([].push); 
 | 
var replace = uncurryThis(''.replace); 
 | 
var split = uncurryThis(''.split); 
 | 
var toLowerCase = uncurryThis(''.toLowerCase); 
 | 
  
 | 
/** 
 | 
 * Creates an array containing the numeric code points of each Unicode 
 | 
 * character in the string. While JavaScript uses UCS-2 internally, 
 | 
 * this function will convert a pair of surrogate halves (each of which 
 | 
 * UCS-2 exposes as separate characters) into a single code point, 
 | 
 * matching UTF-16. 
 | 
 */ 
 | 
var ucs2decode = function (string) { 
 | 
  var output = []; 
 | 
  var counter = 0; 
 | 
  var length = string.length; 
 | 
  while (counter < length) { 
 | 
    var value = charCodeAt(string, counter++); 
 | 
    if (value >= 0xD800 && value <= 0xDBFF && counter < length) { 
 | 
      // It's a high surrogate, and there is a next character. 
 | 
      var extra = charCodeAt(string, counter++); 
 | 
      if ((extra & 0xFC00) === 0xDC00) { // Low surrogate. 
 | 
        push(output, ((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000); 
 | 
      } else { 
 | 
        // It's an unmatched surrogate; only append this code unit, in case the 
 | 
        // next code unit is the high surrogate of a surrogate pair. 
 | 
        push(output, value); 
 | 
        counter--; 
 | 
      } 
 | 
    } else { 
 | 
      push(output, value); 
 | 
    } 
 | 
  } 
 | 
  return output; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * Converts a digit/integer into a basic code point. 
 | 
 */ 
 | 
var digitToBasic = function (digit) { 
 | 
  //  0..25 map to ASCII a..z or A..Z 
 | 
  // 26..35 map to ASCII 0..9 
 | 
  return digit + 22 + 75 * (digit < 26); 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * Bias adaptation function as per section 3.4 of RFC 3492. 
 | 
 * https://tools.ietf.org/html/rfc3492#section-3.4 
 | 
 */ 
 | 
var adapt = function (delta, numPoints, firstTime) { 
 | 
  var k = 0; 
 | 
  delta = firstTime ? floor(delta / damp) : delta >> 1; 
 | 
  delta += floor(delta / numPoints); 
 | 
  while (delta > baseMinusTMin * tMax >> 1) { 
 | 
    delta = floor(delta / baseMinusTMin); 
 | 
    k += base; 
 | 
  } 
 | 
  return floor(k + (baseMinusTMin + 1) * delta / (delta + skew)); 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * Converts a string of Unicode symbols (e.g. a domain name label) to a 
 | 
 * Punycode string of ASCII-only symbols. 
 | 
 */ 
 | 
var encode = function (input) { 
 | 
  var output = []; 
 | 
  
 | 
  // Convert the input in UCS-2 to an array of Unicode code points. 
 | 
  input = ucs2decode(input); 
 | 
  
 | 
  // Cache the length. 
 | 
  var inputLength = input.length; 
 | 
  
 | 
  // Initialize the state. 
 | 
  var n = initialN; 
 | 
  var delta = 0; 
 | 
  var bias = initialBias; 
 | 
  var i, currentValue; 
 | 
  
 | 
  // Handle the basic code points. 
 | 
  for (i = 0; i < input.length; i++) { 
 | 
    currentValue = input[i]; 
 | 
    if (currentValue < 0x80) { 
 | 
      push(output, fromCharCode(currentValue)); 
 | 
    } 
 | 
  } 
 | 
  
 | 
  var basicLength = output.length; // number of basic code points. 
 | 
  var handledCPCount = basicLength; // number of code points that have been handled; 
 | 
  
 | 
  // Finish the basic string with a delimiter unless it's empty. 
 | 
  if (basicLength) { 
 | 
    push(output, delimiter); 
 | 
  } 
 | 
  
 | 
  // Main encoding loop: 
 | 
  while (handledCPCount < inputLength) { 
 | 
    // All non-basic code points < n have been handled already. Find the next larger one: 
 | 
    var m = maxInt; 
 | 
    for (i = 0; i < input.length; i++) { 
 | 
      currentValue = input[i]; 
 | 
      if (currentValue >= n && currentValue < m) { 
 | 
        m = currentValue; 
 | 
      } 
 | 
    } 
 | 
  
 | 
    // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow. 
 | 
    var handledCPCountPlusOne = handledCPCount + 1; 
 | 
    if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) { 
 | 
      throw new $RangeError(OVERFLOW_ERROR); 
 | 
    } 
 | 
  
 | 
    delta += (m - n) * handledCPCountPlusOne; 
 | 
    n = m; 
 | 
  
 | 
    for (i = 0; i < input.length; i++) { 
 | 
      currentValue = input[i]; 
 | 
      if (currentValue < n && ++delta > maxInt) { 
 | 
        throw new $RangeError(OVERFLOW_ERROR); 
 | 
      } 
 | 
      if (currentValue === n) { 
 | 
        // Represent delta as a generalized variable-length integer. 
 | 
        var q = delta; 
 | 
        var k = base; 
 | 
        while (true) { 
 | 
          var t = k <= bias ? tMin : k >= bias + tMax ? tMax : k - bias; 
 | 
          if (q < t) break; 
 | 
          var qMinusT = q - t; 
 | 
          var baseMinusT = base - t; 
 | 
          push(output, fromCharCode(digitToBasic(t + qMinusT % baseMinusT))); 
 | 
          q = floor(qMinusT / baseMinusT); 
 | 
          k += base; 
 | 
        } 
 | 
  
 | 
        push(output, fromCharCode(digitToBasic(q))); 
 | 
        bias = adapt(delta, handledCPCountPlusOne, handledCPCount === basicLength); 
 | 
        delta = 0; 
 | 
        handledCPCount++; 
 | 
      } 
 | 
    } 
 | 
  
 | 
    delta++; 
 | 
    n++; 
 | 
  } 
 | 
  return join(output, ''); 
 | 
}; 
 | 
  
 | 
module.exports = function (input) { 
 | 
  var encoded = []; 
 | 
  var labels = split(replace(toLowerCase(input), regexSeparators, '\u002E'), '.'); 
 | 
  var i, label; 
 | 
  for (i = 0; i < labels.length; i++) { 
 | 
    label = labels[i]; 
 | 
    push(encoded, exec(regexNonASCII, label) ? 'xn--' + encode(label) : label); 
 | 
  } 
 | 
  return join(encoded, '.'); 
 | 
}; 
 |