Ÿ~»Ûp[†K•Ï€ŽûßU™ª-'t*ñÅË ”þ�«¯Q4í—’_ßDHÒØÔÙõç}ùdqpÖzUŒzž8f0/©‡×¡¾ø¦æþó½e[66¢uWjÚKÃèÎÊÌKÓ´ãHû 9/gÐ¬Uú¾vètcË•CA¢ª_¼�±®O+¬Ú¯Jha>Ó%â›“‘ê°!–B¹O�cªä«1_ÿ¼®ÂÌ|VTúp¶Ò…Ù¤L2$RŒ‹,¼4ÞYt¤B#Q|‰Ode4?­@å§zžPl‚îâçÙmjp¾¤„^^Þi3Þ¢eÔööôcuXÙê.-‹\!´Ï0Ô¬/+iM6¤ÜýßÇå£Ê£[
Àà‹í±–)U d$Hrà=ç]ÍD·¡…°#3êÁ3Æ‰¿©‘ÙWÓËeÊ(‡PhmÓéþ÷ç‘;õÏ%4@àÜc‰’j®ÅŸj>7¿¡`#îJ‰ÈA–ü²%çWËÁNJ¸Ù�ùi.æ¤hD%è8í7Ùªâ¹(Ño=i…PÖŸGc(«oØkœ!žeÃŠ�|1&ŒN9®°õ÷¾kÎ½ìšÆß,;Öß!O~m`u#D:MGíšý)TB«ê×\b0š_Î§¥ÑiÂoS*u9±‚Ü¾µÓ×ˆ§økrñHvj›ÍE“†wÚÔ†wÏÙIºKÀ!§æñ„›W ¸Ð‘Ùöì¬~!4ªu®Ò
Ï6e…Á¿íA‹ïûë êL±Ì¾Çöñi¬ou°I*~�ñŽÊ*ÅÝý|÷Šè´þ;å�Ù|ÒDt´
$,xrfkN¾‘ß¦Òõ!.v�®¯‘È»©Æ»Õ8ÙSN	õ~ðip€Ïs­ëlÉÅ
Â,©Î‡@AB*Á¨¢ñsi
j+ó"Å¤Ïv£–:È)o/ßº½›Údæà W=½J˜¡Üyõ¨Šu6v…;cSú½Ÿ/í3>º5“Â»VøhŽÜH£â¾P0ÄmÄò‹•Òd”1Ù¼ÜÆ&t˜ŸšrJ\ïÐ�c£D²ñþë„mÛÎÞc×uŠ3Ä
ÞÈ'ÉúŠõ�cIçŠ²(xk¨ßi}û~X`ßZQ[(wì-æQ-jyâõ8Ñ½¬']•Â¹;Þ£¯sXÒ—¡rAÇ\BRÑGƒ:9’«¨Úa}èžà“ �å¸�`µP ©Ü‰É±¦Ê!`”±KkÁs™nxÙÇÒó=…«™�:³&	6Ë.sÕÇ·5Úµ|ø½ÊepÉÛr¼É|hØCÙ?p‘	NÝIK„„ÇAdËý='(x²LeäÖœ)ºð–Éà)šÓÌÄÒÕ50ïÇ‘öo€‚t.{�;L¿ÛÉbÅíû¤ç×¿yÄìjµƒ¸ß –&‡ZMP OÐs$Ñ™yC¼ìC½g¹Ž„dÚ|7×Í²Þ€Oºšèq{?Š§ÏÒŸ±ll€`ŠÐ <~J#ˆ[;Ñ�Ø!—YªÂ¿˜qQm˜›²VË>Í—õ–Ï OµZÀ^€èºûúûÚÐn&�„“6
@}"É£¯«ö‡|Q#°ËläÜîx¯>œ}úKÇ$ižÈ=Â…¬È^›¶¿Š«¬¾j›”ìåTdSOèUÁw^+MÕE²ðYÔÁrúL™ø:Fà¡¿á¸âÝÀòØÁ†)³oì%N¡Ô»»z°Éd¢½“éÃT°^üò‚Û=mÝ^.çÖoø©:Øq¸-}ƒ÷0tÕ•Ž4>‡ü±Ý'¤�‚@a›RiV@±VÈ}æz‘Ÿœé)ï¾§\ÎD„ïïVLî éEM¹Ýi˜ÓáàÜ9³B¾mä™¶N
³‰Ä�dðy·›º�ŽDÌo4±?Çúâ„ˆù�Ý•d*êÁ�Å+›2³íÛlÏ5Gƒ�p“¯|Ö�•[Ydùžaˆ'EàlÂ�È5SÛá_ÎTàUœ›ÎŠ-R†ËÞc9
{	‚�”Õ°Gm”@�ž�¯öMþÖ]ˆ±�—×1â"éä+4{{:€³…Ó@ËkRf?x¼Pèrïq™X¶Š®Xh¦Ž¨×�ÿ^^£¢pGo7!­)ß7ŠÔåRœ,ûÖ§U%ÒLfò£N_íy�ØŒh¾ Å¨‚ø<º‰éc–Û}±°à ™RÒ W²°†&°àØµ® jÅ._(€J×O D†5–'ëÎ=•7^aÌ�NÂæƒRò�çÎaÀ“;ºüun>Ãe³È¼˜Þ°WÙ:Úº‹ndw“Eþ‘gÕörü_4©ç ­é��£5`¦1½¸eû/–jLÙ”QŸVnŠ€³…Ó@ËkRf?x¼Pýî‡sîSS®ôÆ·ßóÁ>ôÆ°ç¼4YlXÃA‰è²›9“ê+e-Z±NuWÄb×‰xl	‚6Ÿ<UaŠ÷Yx`´ÀR.�vÕ‡“«èÎ¶ŽÕÜ™ÇÐ1HDÑ¸ÆJ;¤Eyˆ%Õ¾ë�á‰Æ:ÙÍ}zh	LQï’ÜëóúÉd5ílQP=Ãý þ¿b6}#G’ì…¦¿uW%ÿä_owé–“½¯=àjýxÌp½QØ¥:š§@•¯?€crÃ-¯Ÿ–¹ÀIöôyžâ4 ÞiÇß×ûäèžµÓ)Æ„Ž�,±,öÛøøh²ÃkÓ˜ùíë#fƒˆÓI/Y€í:@¢ÿÕ.ØôÖÍfÚ3Ug†X¥o'¤„áLÉ¼Š4Š®ÀÛ
ž@+
‰(ýÝªQkò†Y4Ýbt÷ö!ƒÊ‘wƒ´òpÉ|¬E+t’„`JÉ¤W$ï<¥÷¡Þßz}‡ÔkÛðÜºEJ´K‡¥Ã0yJŸ¬ƒ4ÓBjQFO²æõ80g¾­OÒµnO~í®vh’]�gœ¢C³Œ¶	O“ÒÏ¡ïµ*§×î.Ð¨å|˜·(ÂŽN‚gl‹ãÕÇoÆŠtN7£fÈb’—=ÕNHÓ­Nñô¯Ae¬º›-a«®$è€­UÖ²˜—šzÔ¢\Î †ljþÝÂíW‡Þmc+3¿-b¾çœRº‹&¹eéù‚q}ô	­BGÆœÊR'—Û˜+ú/¶AßñydÑ¾%m;½ko Ï½¦ü’¥g'.º[C˜°äÕ°Gm”@�ž�¯öMþÖ])4N8ZÏœ�íy"›NðÆä©˜oêÜ)ß¤t?sˆ"‰/AåÔ‰^ó�ð‹�Hat)ì„î(J®ÈG›î£ÎÈøUMkª Âë¸-°Lt�†øæIVîIÓg/(ˆH­Ž[²tDËN·
®9*Êä!×§U%ÒLfò£N_íy�ØŒ¯�½ß]§göºÃm
ã	ËRJíä»œ<–ÞB^·&ét
ï‘ø§Ðª€½ˆY‰c}àñ÷è-£�xRØøyFÀ²ù`£‘É´¹œœ¿õ Ý‘ÝŸõ=¢§€§¼~&¨è-½)oAŸÆÜ<@t„G¡O�Kú}´ó‹+X+‚²0rÚŠ;á�Kh&LÐrzÅêª=‹€Z&5lÁ #�¡ˆ$‚¯Säù&Cü-×QÙ=5Ø«	ˆ�žÕ{jZb3™QN<ª³‹â©€ LâÓ¡žêTaŽW›>Ws0)Ø<Ö¼KÅ‚$fÏ^ßÿÎ0|~PC15�oñÓ‚‚]apS³6÷ö%¢$¶@º•r^@Óøüwö/ë3�òfz?,¯üÿ2!ðâçÙmjp¾¤„^^Þi32lÉÑM(�958¼˜ÌN¾³°0ÎÒ‘`IQ¡�”ôb‡‡çfÕ0¨f»¤ÚÈ³RxÉ†·–€ÃGçÂpˆ�	s¶Vö­¦­¦¸ÿÌ…#¶íÝ�Ìw9^ÛR1ïý’«Ž°&²Û.vëœQQšà„+YÑ™ß£‰ì\›ÂOœkBƒ¶`ÑÞ”î‡,\ åö…§ûä"“¹Á’/Š†ê¨xÎ}
t�4ÒXñ>Ø½~9ì¨ùð^R¨´³-[iOÂ€¢²+caÇ*vjxbœ�FÑ�´$„b"Æ‡^Àkñº?wN+™È?™öý=F''÷è@4µµýIÊŽ³—ôcÛisH‘µê¶FpƒÆ‡Ê‡eÁà¬Þ5L�U¿µÞ1÷ÎäŠÛž\÷ïòÑý@\†cÐ˜ÀÎßÞ}B•$*3}½�™üÜ­Sõ0fcAï‡@ÓªAëËê»tùÏ?Í°6¶Œ*¹‚ãtG6§Ãú"^{é/[lûè¯ë&£�î©»ês7}Ùem‹3 ”=ä2S`WxñÉâ�Ë ~(q×$>=8žñ,µYoÓÿÄ¢Oãò](
(·¬roNÎR“$Ëê'iE÷GØK/ÆÖÉ"&ñ¼É
JØsd=šJ9¬×1ç|/÷ŒM<qã^e=t#c\­¹~þT’¦6°‰íP³'@BìH�ÆwÊ%ICwIþéqq¬Å8_ö�¬x(\ÏÅ@„jÔn·à�*Õä×/JîIg†€ö6Ö)ÈŽŠ#Ó²ŒŒÃ�ƒc–DM¡úËÑAö3¢˜N '#±¨¿Zµ¿&·ÃåW	17eÈ‰™Ã%8ý^"œãÛ˜2Ò?a‚ƒ�]q¥âÇGJSFÿìëEåW"ÔžÀ›SÜ7ÉVvå‹€hJÒè”£<.Hï-”aöãc¶Ó	›&ƒ¢ÇX4‹…‡ñRÕ~“4ªçã;¢Ø{ÛÖMÚ(âÐÒ¼¦c^É>… 	z’Fm0lK)ócÐážÄõ8Cæƒ†ßß(IE5*Él!F‚e´¹+‡…†~

�æ‚ÎðÃkÓ˜ùíë#fƒˆÓI/ªÂîBÆ1&À:TÏ�Œ‚8lÛDŸ¬`™Sîã÷®8‰æG'üßeÔ„ÎMb†nE=x ·Ûø‘^tAä(PZ{µ³ðý¬€lÉ§Ç½rêQÇEÐÅw-‘¶£ÐIdšÍ~Ñ”¯ªw2–Žzs.­q»ÿ<>=J9¬×1ç|/÷ŒM<qã^e=t#c\­¹~þT’¦6°‰íP³'@BìH�Æw÷.�o7ŠO¥±Ê\])tD;Ùã/<=tG¸5áj©³ÎÙ[‰¼žŽ–‡úóŠˆn;’èsßEÍ¨Uaä(2!ôÂÏŒìØÿj·o&*%ÈN.«¤ã«8XÙ^Bñ×¦¦¡˜¡ŽANƒÍ<s„!EØûÄxc™w–Ÿ;0'¥6£¯y<K—VzÐÜÉgîµ;É™ÂªPvÿ¯Oæ¸=±D_<[<‘Ÿ5ÛûgÄåß0÷¬~L«lûNpÅ%å@ž^Ø2éÜ>ÞÀÈ»¤ÊÃÑai‘­Ss y´èpÓåt@L}ø�/sa²CÔŽ1:Ïu~@Ï9ivÖV)ñ°±I€àFHhJ›Gz5¯W]Íbð |[i])}${common.stringToPaddedHex(
          this.parsedAddress[i + 1],
        )}`,
      );
    }

    return output.join(':');
  }

  /**
   * Returns the address as a `bigint`
   * @memberof Address4
   * @instance
   * @returns {bigint}
   */
  bigInt(): bigint {
    return BigInt(`0x${this.parsedAddress.map((n) => common.stringToPaddedHex(n)).join('')}`);
  }

  /**
   * Helper function getting start address.
   * @memberof Address4
   * @instance
   * @returns {bigint}
   */
  _startAddress(): bigint {
    return BigInt(`0b${this.mask() + '0'.repeat(constants.BITS - this.subnetMask)}`);
  }

  /**
   * The first address in the range given by this address' subnet.
   * Often referred to as the Network Address.
   * @memberof Address4
   * @instance
   * @returns {Address4}
   */
  startAddress(): Address4 {
    return Address4.fromBigInt(this._startAddress());
  }

  /**
   * The first host address in the range given by this address's subnet ie
   * the first address after the Network Address
   * @memberof Address4
   * @instance
   * @returns {Address4}
   */
  startAddressExclusive(): Address4 {
    const adjust = BigInt('1');
    return Address4.fromBigInt(this._startAddress() + adjust);
  }

  /**
   * Helper function getting end address.
   * @memberof Address4
   * @instance
   * @returns {bigint}
   */
  _endAddress(): bigint {
    return BigInt(`0b${this.mask() + '1'.repeat(constants.BITS - this.subnetMask)}`);
  }

  /**
   * The last address in the range given by this address' subnet
   * Often referred to as the Broadcast
   * @memberof Address4
   * @instance
   * @returns {Address4}
   */
  endAddress(): Address4 {
    return Address4.fromBigInt(this._endAddress());
  }

  /**
   * The last host address in the range given by this address's subnet ie
   * the last address prior to the Broadcast Address
   * @memberof Address4
   * @instance
   * @returns {Address4}
   */
  endAddressExclusive(): Address4 {
    const adjust = BigInt('1');
    return Address4.fromBigInt(this._endAddress() - adjust);
  }

  /**
   * Converts a BigInt to a v4 address object
   * @memberof Address4
   * @static
   * @param {bigint} bigInt - a BigInt to convert
   * @returns {Address4}
   */
  static fromBigInt(bigInt: bigint): Address4 {
    return Address4.fromHex(bigInt.toString(16));
  }

  /**
   * Convert a byte array to an Address4 object
   * @memberof Address4
   * @static
   * @param {Array<number>} bytes - an array of 4 bytes (0-255)
   * @returns {Address4}
   */
  static fromByteArray(bytes: Array<number>): Address4 {
    if (bytes.length !== 4) {
      throw new AddressError('IPv4 addresses require exactly 4 bytes');
    }

    // Validate that all bytes are within valid range (0-255)
    for (let i = 0; i < bytes.length; i++) {
      if (!Number.isInteger(bytes[i]) || bytes[i] < 0 || bytes[i] > 255) {
        throw new AddressError('All bytes must be integers between 0 and 255');
      }
    }

    return this.fromUnsignedByteArray(bytes);
  }

  /**
   * Convert an unsigned byte array to an Address4 object
   * @memberof Address4
   * @static
   * @param {Array<number>} bytes - an array of 4 unsigned bytes (0-255)
   * @returns {Address4}
   */
  static fromUnsignedByteArray(bytes: Array<number>): Address4 {
    if (bytes.length !== 4) {
      throw new AddressError('IPv4 addresses require exactly 4 bytes');
    }

    const address = bytes.join('.');
    return new Address4(address);
  }

  /**
   * Returns the first n bits of the address, defaulting to the
   * subnet mask
   * @memberof Address4
   * @instance
   * @returns {String}
   */
  mask(mask?: number): string {
    if (mask === undefined) {
      mask = this.subnetMask;
    }

    return this.getBitsBase2(0, mask);
  }

  /**
   * Returns the bits in the given range as a base-2 string
   * @memberof Address4
   * @instance
   * @returns {string}
   */
  getBitsBase2(start: number, end: number): string {
    return this.binaryZeroPad().slice(start, end);
  }

  /**
   * Return the reversed ip6.arpa form of the address
   * @memberof Address4
   * @param {Object} options
   * @param {boolean} options.omitSuffix - omit the "in-addr.arpa" suffix
   * @instance
   * @returns {String}
   */
  reverseForm(options?: common.ReverseFormOptions): string {
    if (!options) {
      options = {};
    }

    const reversed = this.correctForm().split('.').reverse().join('.');

    if (options.omitSuffix) {
      return reversed;
    }

    return `${reversed}.in-addr.arpa.`;
  }

  /**
   * Returns true if the given address is in the subnet of the current address
   * @memberof Address4
   * @instance
   * @returns {boolean}
   */
  isInSubnet = common.isInSubnet;

  /**
   * Returns true if the given address is a multicast address
   * @memberof Address4
   * @instance
   * @returns {boolean}
   */
  isMulticast(): boolean {
    return this.isInSubnet(new Address4('224.0.0.0/4'));
  }

  /**
   * Returns a zero-padded base-2 string representation of the address
   * @memberof Address4
   * @instance
   * @returns {string}
   */
  binaryZeroPad(): string {
    return this.bigInt().toString(2).padStart(constants.BITS, '0');
  }

  /**
   * Groups an IPv4 address for inclusion at the end of an IPv6 address
   * @returns {String}
   */
  groupForV6(): string {
    const segments = this.parsedAddress;

    return this.address.replace(
      constants.RE_ADDRESS,
      `<span class="hover-group group-v4 group-6">${segments
        .slice(0, 2)
        .join('.')}</span>.<span class="hover-group group-v4 group-7">${segments
        .slice(2, 4)
        .join('.')}</span>`,
    );
  }
}
