You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					209 lines
				
				5.4 KiB
			
		
		
			
		
	
	
					209 lines
				
				5.4 KiB
			| 
											3 years ago
										 | // Generated by CoffeeScript 1.12.7
 | ||
|  | (function() { | ||
|  |   var Netmask, atob, chr, chr0, chrA, chra, ip2long, long2ip; | ||
|  | 
 | ||
|  |   long2ip = function(long) { | ||
|  |     var a, b, c, d; | ||
|  |     a = (long & (0xff << 24)) >>> 24; | ||
|  |     b = (long & (0xff << 16)) >>> 16; | ||
|  |     c = (long & (0xff << 8)) >>> 8; | ||
|  |     d = long & 0xff; | ||
|  |     return [a, b, c, d].join('.'); | ||
|  |   }; | ||
|  | 
 | ||
|  |   ip2long = function(ip) { | ||
|  |     var b, c, i, j, n, ref; | ||
|  |     b = []; | ||
|  |     for (i = j = 0; j <= 3; i = ++j) { | ||
|  |       if (ip.length === 0) { | ||
|  |         break; | ||
|  |       } | ||
|  |       if (i > 0) { | ||
|  |         if (ip[0] !== '.') { | ||
|  |           throw new Error('Invalid IP'); | ||
|  |         } | ||
|  |         ip = ip.substring(1); | ||
|  |       } | ||
|  |       ref = atob(ip), n = ref[0], c = ref[1]; | ||
|  |       ip = ip.substring(c); | ||
|  |       b.push(n); | ||
|  |     } | ||
|  |     if (ip.length !== 0) { | ||
|  |       throw new Error('Invalid IP'); | ||
|  |     } | ||
|  |     switch (b.length) { | ||
|  |       case 1: | ||
|  |         if (b[0] > 0xFFFFFFFF) { | ||
|  |           throw new Error('Invalid IP'); | ||
|  |         } | ||
|  |         return b[0] >>> 0; | ||
|  |       case 2: | ||
|  |         if (b[0] > 0xFF || b[1] > 0xFFFFFF) { | ||
|  |           throw new Error('Invalid IP'); | ||
|  |         } | ||
|  |         return (b[0] << 24 | b[1]) >>> 0; | ||
|  |       case 3: | ||
|  |         if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFFFF) { | ||
|  |           throw new Error('Invalid IP'); | ||
|  |         } | ||
|  |         return (b[0] << 24 | b[1] << 16 | b[2]) >>> 0; | ||
|  |       case 4: | ||
|  |         if (b[0] > 0xFF || b[1] > 0xFF || b[2] > 0xFF || b[3] > 0xFF) { | ||
|  |           throw new Error('Invalid IP'); | ||
|  |         } | ||
|  |         return (b[0] << 24 | b[1] << 16 | b[2] << 8 | b[3]) >>> 0; | ||
|  |       default: | ||
|  |         throw new Error('Invalid IP'); | ||
|  |     } | ||
|  |   }; | ||
|  | 
 | ||
|  |   chr = function(b) { | ||
|  |     return b.charCodeAt(0); | ||
|  |   }; | ||
|  | 
 | ||
|  |   chr0 = chr('0'); | ||
|  | 
 | ||
|  |   chra = chr('a'); | ||
|  | 
 | ||
|  |   chrA = chr('A'); | ||
|  | 
 | ||
|  |   atob = function(s) { | ||
|  |     var base, dmax, i, n, start; | ||
|  |     n = 0; | ||
|  |     base = 10; | ||
|  |     dmax = '9'; | ||
|  |     i = 0; | ||
|  |     if (s.length > 1 && s[i] === '0') { | ||
|  |       if (s[i + 1] === 'x' || s[i + 1] === 'X') { | ||
|  |         i += 2; | ||
|  |         base = 16; | ||
|  |       } else if ('0' <= s[i + 1] && s[i + 1] <= '9') { | ||
|  |         i++; | ||
|  |         base = 8; | ||
|  |         dmax = '7'; | ||
|  |       } | ||
|  |     } | ||
|  |     start = i; | ||
|  |     while (i < s.length) { | ||
|  |       if ('0' <= s[i] && s[i] <= dmax) { | ||
|  |         n = (n * base + (chr(s[i]) - chr0)) >>> 0; | ||
|  |       } else if (base === 16) { | ||
|  |         if ('a' <= s[i] && s[i] <= 'f') { | ||
|  |           n = (n * base + (10 + chr(s[i]) - chra)) >>> 0; | ||
|  |         } else if ('A' <= s[i] && s[i] <= 'F') { | ||
|  |           n = (n * base + (10 + chr(s[i]) - chrA)) >>> 0; | ||
|  |         } else { | ||
|  |           break; | ||
|  |         } | ||
|  |       } else { | ||
|  |         break; | ||
|  |       } | ||
|  |       if (n > 0xFFFFFFFF) { | ||
|  |         throw new Error('too large'); | ||
|  |       } | ||
|  |       i++; | ||
|  |     } | ||
|  |     if (i === start) { | ||
|  |       throw new Error('empty octet'); | ||
|  |     } | ||
|  |     return [n, i]; | ||
|  |   }; | ||
|  | 
 | ||
|  |   Netmask = (function() { | ||
|  |     function Netmask(net, mask) { | ||
|  |       var error, i, j, ref; | ||
|  |       if (typeof net !== 'string') { | ||
|  |         throw new Error("Missing `net' parameter"); | ||
|  |       } | ||
|  |       if (!mask) { | ||
|  |         ref = net.split('/', 2), net = ref[0], mask = ref[1]; | ||
|  |       } | ||
|  |       if (!mask) { | ||
|  |         mask = 32; | ||
|  |       } | ||
|  |       if (typeof mask === 'string' && mask.indexOf('.') > -1) { | ||
|  |         try { | ||
|  |           this.maskLong = ip2long(mask); | ||
|  |         } catch (error1) { | ||
|  |           error = error1; | ||
|  |           throw new Error("Invalid mask: " + mask); | ||
|  |         } | ||
|  |         for (i = j = 32; j >= 0; i = --j) { | ||
|  |           if (this.maskLong === (0xffffffff << (32 - i)) >>> 0) { | ||
|  |             this.bitmask = i; | ||
|  |             break; | ||
|  |           } | ||
|  |         } | ||
|  |       } else if (mask || mask === 0) { | ||
|  |         this.bitmask = parseInt(mask, 10); | ||
|  |         this.maskLong = 0; | ||
|  |         if (this.bitmask > 0) { | ||
|  |           this.maskLong = (0xffffffff << (32 - this.bitmask)) >>> 0; | ||
|  |         } | ||
|  |       } else { | ||
|  |         throw new Error("Invalid mask: empty"); | ||
|  |       } | ||
|  |       try { | ||
|  |         this.netLong = (ip2long(net) & this.maskLong) >>> 0; | ||
|  |       } catch (error1) { | ||
|  |         error = error1; | ||
|  |         throw new Error("Invalid net address: " + net); | ||
|  |       } | ||
|  |       if (!(this.bitmask <= 32)) { | ||
|  |         throw new Error("Invalid mask for ip4: " + mask); | ||
|  |       } | ||
|  |       this.size = Math.pow(2, 32 - this.bitmask); | ||
|  |       this.base = long2ip(this.netLong); | ||
|  |       this.mask = long2ip(this.maskLong); | ||
|  |       this.hostmask = long2ip(~this.maskLong); | ||
|  |       this.first = this.bitmask <= 30 ? long2ip(this.netLong + 1) : this.base; | ||
|  |       this.last = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 2) : long2ip(this.netLong + this.size - 1); | ||
|  |       this.broadcast = this.bitmask <= 30 ? long2ip(this.netLong + this.size - 1) : void 0; | ||
|  |     } | ||
|  | 
 | ||
|  |     Netmask.prototype.contains = function(ip) { | ||
|  |       if (typeof ip === 'string' && (ip.indexOf('/') > 0 || ip.split('.').length !== 4)) { | ||
|  |         ip = new Netmask(ip); | ||
|  |       } | ||
|  |       if (ip instanceof Netmask) { | ||
|  |         return this.contains(ip.base) && this.contains(ip.broadcast || ip.last); | ||
|  |       } else { | ||
|  |         return (ip2long(ip) & this.maskLong) >>> 0 === (this.netLong & this.maskLong) >>> 0; | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     Netmask.prototype.next = function(count) { | ||
|  |       if (count == null) { | ||
|  |         count = 1; | ||
|  |       } | ||
|  |       return new Netmask(long2ip(this.netLong + (this.size * count)), this.mask); | ||
|  |     }; | ||
|  | 
 | ||
|  |     Netmask.prototype.forEach = function(fn) { | ||
|  |       var index, lastLong, long; | ||
|  |       long = ip2long(this.first); | ||
|  |       lastLong = ip2long(this.last); | ||
|  |       index = 0; | ||
|  |       while (long <= lastLong) { | ||
|  |         fn(long2ip(long), long, index); | ||
|  |         index++; | ||
|  |         long++; | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     Netmask.prototype.toString = function() { | ||
|  |       return this.base + "/" + this.bitmask; | ||
|  |     }; | ||
|  | 
 | ||
|  |     return Netmask; | ||
|  | 
 | ||
|  |   })(); | ||
|  | 
 | ||
|  |   exports.ip2long = ip2long; | ||
|  | 
 | ||
|  |   exports.long2ip = long2ip; | ||
|  | 
 | ||
|  |   exports.Netmask = Netmask; | ||
|  | 
 | ||
|  | }).call(this); |