import Ġjava . nio . Mapped ByteBuffer Ċ import Ġjava . io . IOException Ċ import Ġjava . io . Random Access File Ċ import Ġjava . nio . channels . File Channel Ċ import Ġjava . nio . Byte Order Ċ import Ġjava . math . BigInteger Ċ import Ġjava . lang . Negative Array Size Exception Ċ import Ġjava . lang . StringBuilder Ċ import Ġjava . net . Inet 6 Address Ċ import Ġjava . net . Inet 4 Address Ċ import Ġjava . net . Inet Address Ċ import Ġjava . net . Unknown Host Exception Ċ import Ġjava . nio . ByteBuffer Ċ import Ġjava . util .* Ċ import Ġjava . util . regex . Pattern Ċ Ċ class ĠIP 2 Proxy Ġ{ ĊĠĠĠ Ġenum Ġclass ĠIO Modes Ġ{ ĊĠĠĠĠĠĠĠ ĠIP 2 PROXY _ FILE _ IO , ĠIP 2 PROXY _ MEMORY _ MAP PED ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġenum Ġclass ĠMode s Ġ{ ĊĠĠĠĠĠĠĠ ĠCOUN TRY _ SHORT , ĠCOUN TRY _ LONG , ĠREGION , ĠC ITY , ĠI SP , ĠPRO XY _ TYPE , ĠIS _ PROXY , ĠDO MAIN , ĠUS AGE _ TYPE , ĠASN , ĠAS , ĠLAST _ SE EN , ĠTH RE AT , ĠPRO VIDER , ĠALL ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġvar Ġip V 4 Buffer : ĠM apped ByteBuffer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġip V 6 Buffer : ĠM apped ByteBuffer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġmap Data Buffer : ĠM apped ByteBuffer ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġindex Array IPV 4 Ġ= ĠArray ( 6 5 5 3 6 ) Ġ{ ĠInt Array ( 2 ) Ġ} ĊĠĠĠ Ġprivate Ġval Ġindex Array IPV 6 Ġ= ĠArray ( 6 5 5 3 6 ) Ġ{ ĠInt Array ( 2 ) Ġ} ĊĠĠĠ Ġprivate Ġvar Ġip V 4 Offset : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġip V 6 Offset : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġmap Data Offset : ĠLong Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġip V 4 Column Size Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġip V 6 Column Size Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġbase Addr Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdb Count Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdb Column Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdb Type Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdb Day Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġvar Ġdb Month Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġvar Ġdb Year Ġ= Ġ 1 ĊĠĠĠ Ġprivate Ġvar Ġbase Addr IPV 6 Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdb Count IPV 6 Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġindex Base Addr Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġindex Base Addr IPV 6 Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġproduct Code Ġ= Ġ 0 ĊĠĠĠ Ġ// Ġprivate Ġvar Ġproduct Type Ġ= Ġ 0 ĊĠĠĠ Ġ// Ġprivate Ġvar ĠfileSize Ġ= Ġ 0 ĊĠĠĠĠĊĠĠĠ Ġprivate Ġvar Ġuse Memory Mapped File Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġip Database Path Ġ= Ġ"" ĊĠĠĠ Ġprivate Ġvar Ġcountry Position Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġregion Position Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcity Position Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġi SP Position Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġproxy Type Position Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġdomain Position Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġusage Type Position Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġa SN Position Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġas Position Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġlast Seen Position Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġthreat Position Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġprovider Position Offset Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġcountry Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġregion Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġcity Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġi SP Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġproxy Type Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġdomain Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġusage Type Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġa SN Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġas Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġlast Seen Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġthreat Enabled Ġ= Ġfalse ĊĠĠĠ Ġprivate Ġvar Ġprovider Enabled Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe Ġmodule Ġversion . ĊĠĠĠĠ Ġ* Ġ@ return ĠModule Ġversion ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Module Version (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠModule Version ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe Ġpackage Ġversion . ĊĠĠĠĠ Ġ* Ġ@ return ĠPackage Ġversion ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Package Version (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdb Type . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe ĠIP Ġdatabase Ġversion . ĊĠĠĠĠ Ġ* Ġ@ return ĠIP Ġdatabase Ġversion ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġget Database Version (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( db Year Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"" ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" 2 0 $ db Year .$ db Month .$ db Day " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġans Ġinteger Ġto Ġstate Ġif Ġit Ġproxy . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġ- 1 Ġif Ġerror , Ġ 0 Ġif Ġnot Ġa Ġproxy , Ġ 1 Ġif Ġproxy Ġexcept ĠD CH Ġand ĠS ES , Ġ 2 Ġif Ġproxy Ġand Ġeither ĠD CH Ġor ĠS ES ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġis Proxy ( IP : ĠString ?): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . IS _ PROXY ). is Proxy ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe Ġcountry Ġcode . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return ĠCountry Ġcode ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget Country Short ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . COUNTRY _ SHORT ). country Short ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe Ġcountry Ġname . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return ĠCountry Ġname ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget Country Long ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . COUNTRY _ LONG ). country Long ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe Ġregion Ġname . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġregion Ġname ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget Region ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . REGION ). region ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe Ġcity Ġname . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġcity Ġname ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget City ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . C ITY ). city ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe Ġi SP Ġname . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġi SP Ġname ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget ISP ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . ISP ). i SP ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe Ġproxy Ġtype . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return ĠProxy Ġtype ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget Proxy Type ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . PROXY _ TYPE ). proxy Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe Ġdomain . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġdomain ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget Domain ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . DOMAIN ). domain ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe Ġusage Ġtype . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return ĠProxy Ġtype ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget Usage Type ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . USAGE _ TYPE ). usage Type ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe ĠAut onomous ĠSystem ĠNumber . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return ĠAut onomous ĠSystem ĠNumber ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget ASN ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . ASN ). a SN ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe ĠAut onomous ĠSystem Ġname . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return ĠAut onomous ĠSystem Ġname ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget AS ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . AS ). ` as ` ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġnumber Ġof Ġdays Ġthe Ġproxy Ġwas Ġlast Ġseen . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return ĠNumber Ġof Ġdays Ġlast Ġseen ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun ĠgetLast Seen ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . LAST _ SE EN ). last Seen ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe Ġthreat Ġtype Ġof Ġthe Ġproxy . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġthreat Ġtype Ġof Ġthe Ġproxy ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget Th reat ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . TH RE AT ). threat ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġthe Ġprovider Ġof Ġthe Ġproxy . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return Ġprovider Ġof Ġthe Ġproxy ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġget Provider ( IP : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP , ĠMode s . PROVIDER ). provider ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġreturns Ġproxy Ġresult . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return ĠProxy Ġresult ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun ĠgetAll ( IP : ĠString ?): ĠProxy Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IP ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġdest ro ys Ġthe Ġmapped Ġbytes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclose (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġdestroy Mapped Bytes () ĊĠĠĠĠĠĠĠ Ġbase Addr Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdb Count Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdb Column Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdb Type Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdb Day Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġdb Month Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġdb Year Ġ= Ġ 1 ĊĠĠĠĠĠĠĠ Ġbase Addr IPV 6 Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġdb Count IPV 6 Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġindex Base Addr Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġindex Base Addr IPV 6 Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġproduct Code Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ// Ġproduct Type Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġ// ĠfileSize Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġreturn Ġ 0 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdestroy Mapped Bytes () Ġ{ ĊĠĠĠĠĠĠĠ Ġip V 4 Buffer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġip V 6 Buffer Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġmap Data Buffer Ġ= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Mapped Bytes () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġr F : ĠRandom Access File ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr F Ġ= ĠRandom Access File ( ip Database Path , Ġ" r ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin Channel Ġ= Ġr F . channel ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Mapped Bytes ( in Channel ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr F ?. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġcreate Mapped Bytes ( in Channel : ĠFile Channel ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ip V 4 Buffer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġip V 4 Bytes Ġ= Ġip V 4 Column Size . to Long () Ġ* Ġdb Count . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip V 4 Offset Ġ= Ġ( base Addr Ġ- Ġ 1 ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip V 4 Buffer Ġ= Ġin Channel . map ( File Channel . Map Mode . READ _ ONLY , Ġip V 4 Offset , Ġip V 4 Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip V 4 Buffer ?. order ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Data Offset Ġ= Ġip V 4 Offset Ġ+ Ġip V 4 Bytes ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( db Count IPV 6 Ġ> Ġ 0 Ġ&& Ġip V 6 Buffer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġip V 6 Bytes Ġ= Ġip V 6 Column Size . to Long () Ġ* Ġdb Count IPV 6 . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip V 6 Offset Ġ= Ġ( base Addr IPV 6 Ġ- Ġ 1 ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip V 6 Buffer Ġ= Ġin Channel . map ( File Channel . Map Mode . READ _ ONLY , Ġip V 6 Offset , Ġip V 6 Bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip V 6 Buffer ?. order ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Data Offset Ġ= Ġip V 6 Offset Ġ+ Ġip V 6 Bytes ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( map Data Buffer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Data Buffer Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġin Channel . map ( File Channel . Map Mode . READ _ ONLY , Ġmap Data Offset , Ġin Channel . size () Ġ- Ġmap Data Offset ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap Data Buffer ?. order ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġload BIN (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġload OK Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġvar Ġr F : ĠRandom Access File ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ip Database Path . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr F Ġ= ĠRandom Access File ( ip Database Path , Ġ" r ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġin Channel Ġ= Ġr F . channel ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġheader Buffer Ġ= Ġin Channel . map ( File Channel . Map Mode . READ _ ONLY , Ġ 0 , Ġ 6 4 ) Ġ// Ġ 6 4 Ġbytes Ġheader ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheader Buffer . order ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Type Ġ= Ġheader Buffer [ 0 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Column Ġ= Ġheader Buffer [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Year Ġ= Ġheader Buffer [ 2 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Month Ġ= Ġheader Buffer [ 3 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Day Ġ= Ġheader Buffer [ 4 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Count Ġ= Ġheader Buffer . getInt ( 5 ) Ġ// Ġ 4 Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Addr Ġ= Ġheader Buffer . getInt ( 9 ) Ġ// Ġ 4 Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdb Count IPV 6 Ġ= Ġheader Buffer . getInt ( 1 3 ) Ġ// Ġ 4 Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Addr IPV 6 Ġ= Ġheader Buffer . getInt ( 1 7 ) Ġ// Ġ 4 Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Base Addr Ġ= Ġheader Buffer . getInt ( 2 1 ) Ġ// 4 Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Base Addr IPV 6 Ġ= Ġheader Buffer . getInt ( 2 5 ) Ġ// 4 Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproduct Code Ġ= Ġheader Buffer [ 2 9 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġproduct Type Ġ= Ġheader Buffer [ 3 0 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠfileSize Ġ= Ġheader Buffer . getInt ( 3 1 ) Ġ// 4 Ġbytes ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġif Ġis Ġcorrect ĠBIN Ġ( should Ġbe Ġ 2 Ġfor ĠIP 2 Proxy ĠBIN Ġfile ), Ġalso Ġchecking Ġfor Ġz ipped Ġfile Ġ( PK Ġbeing Ġthe Ġfirst Ġ 2 Ġchars ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(( product Code Ġ!= Ġ 2 Ġ&& Ġdb Year Ġ>= Ġ 2 1 ) Ġ|| Ġ( db Type Ġ== Ġ 8 0 Ġ&& Ġdb Column Ġ== Ġ 7 5 )) Ġ{ Ġ// Ġonly ĠBIN s Ġfrom ĠJan Ġ 2 0 2 1 Ġon wards Ġhave Ġthis Ġbyte Ġset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Incorrect ĠIP 2 Proxy ĠBIN Ġfile Ġformat . ĠPlease Ġmake Ġsure Ġthat Ġyou Ġare Ġusing Ġthe Ġlatest ĠIP 2 Proxy ĠBIN Ġfile .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip V 4 Column Size Ġ= Ġdb Column Ġshl Ġ 2 Ġ// Ġ 4 Ġbytes Ġeach Ġcolumn ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip V 6 Column Size Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 6 Ġ+ Ġ( db Column Ġ- Ġ 1 Ġshl Ġ 2 ) Ġ// Ġ 4 Ġbytes Ġeach Ġcolumn , Ġexcept ĠIP From Ġcolumn Ġwhich Ġis Ġ 1 6 Ġbytes ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcountry Position Offset Ġ= Ġif Ġ( COUNTRY _ POSITION [ db Type ] Ġ!= Ġ 0 ) ĠCOUN TRY _ POSITION [ db Type ] Ġ- Ġ 2 Ġshl Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregion Position Offset Ġ= Ġif Ġ( REGION _ POSITION [ db Type ] Ġ!= Ġ 0 ) ĠREGION _ POSITION [ db Type ] Ġ- Ġ 2 Ġshl Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Position Offset Ġ= Ġif Ġ( C ITY _ POSITION [ db Type ] Ġ!= Ġ 0 ) ĠC ITY _ POSITION [ db Type ] Ġ- Ġ 2 Ġshl Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi SP Position Offset Ġ= Ġif Ġ( ISP _ POSITION [ db Type ] Ġ!= Ġ 0 ) ĠI SP _ POSITION [ db Type ] Ġ- Ġ 2 Ġshl Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Type Position Offset Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( PROXY TYPE _ POSITION [ db Type ] Ġ!= Ġ 0 ) ĠPRO XY TYPE _ POSITION [ db Type ] Ġ- Ġ 2 Ġshl Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Position Offset Ġ= Ġif Ġ( DOMAIN _ POSITION [ db Type ] Ġ!= Ġ 0 ) ĠDO MAIN _ POSITION [ db Type ] Ġ- Ġ 2 Ġshl Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusage Type Position Offset Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( US AG ET YPE _ POSITION [ db Type ] Ġ!= Ġ 0 ) ĠUS AG ET YPE _ POSITION [ db Type ] Ġ- Ġ 2 Ġshl Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa SN Position Offset Ġ= Ġif Ġ( ASN _ POSITION [ db Type ] Ġ!= Ġ 0 ) ĠASN _ POSITION [ db Type ] Ġ- Ġ 2 Ġshl Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġas Position Offset Ġ= Ġif Ġ( AS _ POSITION [ db Type ] Ġ!= Ġ 0 ) ĠAS _ POSITION [ db Type ] Ġ- Ġ 2 Ġshl Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Seen Position Offset Ġ= Ġif Ġ( LAST SE EN _ POSITION [ db Type ] Ġ!= Ġ 0 ) ĠLAST SE EN _ POSITION [ db Type ] Ġ- Ġ 2 Ġshl Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthreat Position Offset Ġ= Ġif Ġ( TH RE AT _ POSITION [ db Type ] Ġ!= Ġ 0 ) ĠTH RE AT _ POSITION [ db Type ] Ġ- Ġ 2 Ġshl Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider Position Offset Ġ= Ġif Ġ( PROVIDER _ POSITION [ db Type ] Ġ!= Ġ 0 ) ĠPRO VIDER _ POSITION [ db Type ] Ġ- Ġ 2 Ġshl Ġ 2 Ġelse Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcountry Enabled Ġ= ĠCOUN TRY _ POSITION [ db Type ] Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregion Enabled Ġ= ĠREGION _ POSITION [ db Type ] Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Enabled Ġ= ĠC ITY _ POSITION [ db Type ] Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi SP Enabled Ġ= ĠI SP _ POSITION [ db Type ] Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Type Enabled Ġ= ĠPRO XY TYPE _ POSITION [ db Type ] Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Enabled Ġ= ĠDO MAIN _ POSITION [ db Type ] Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusage Type Enabled Ġ= ĠUS AG ET YPE _ POSITION [ db Type ] Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa SN Enabled Ġ= ĠASN _ POSITION [ db Type ] Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġas Enabled Ġ= ĠAS _ POSITION [ db Type ] Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Seen Enabled Ġ= ĠLAST SE EN _ POSITION [ db Type ] Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthreat Enabled Ġ= ĠTH RE AT _ POSITION [ db Type ] Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider Enabled Ġ= ĠPRO VIDER _ POSITION [ db Type ] Ġ!= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Buffer Ġ= Ġin Channel . map ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile Channel . Map Mode . READ _ ONLY , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( index Base Addr Ġ- Ġ 1 ). to Long (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( base Addr Ġ- Ġindex Base Addr ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Buffer . order ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpointer Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread ĠIPv 4 Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġindex Array IPV 4 . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Array IPV 4 [ x ][ 0 ] Ġ= Ġindex Buffer . getInt ( pointer ) Ġ// Ġ 4 Ġbytes Ġfor Ġfrom Ġrow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Array IPV 4 [ x ][ 1 ] Ġ= Ġindex Buffer . getInt ( pointer Ġ+ Ġ 4 ) Ġ// Ġ 4 Ġbytes Ġfor Ġto Ġrow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Ġ+= Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Base Addr IPV 6 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread ĠIPv 6 Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġindex Array IPV 6 . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Array IPV 6 [ x ][ 0 ] Ġ= Ġindex Buffer . getInt ( pointer ) Ġ// Ġ 4 Ġbytes Ġfor Ġfrom Ġrow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Array IPV 6 [ x ][ 1 ] Ġ= Ġindex Buffer . getInt ( pointer Ġ+ Ġ 4 ) Ġ// Ġ 4 Ġbytes Ġfor Ġto Ġrow ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpointer Ġ+= Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Memory Mapped File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Mapped Bytes ( in Channel ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Mapped Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġload OK Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr F ?. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġload OK ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġinitialize Ġthe Ġcomponent Ġwith Ġthe ĠBIN Ġfile Ġpath Ġand ĠIO Ġmode . ĊĠĠĠĠ Ġ* Ġ@ param ĠDatabase Path ĠPath Ġto Ġthe ĠBIN Ġdatabase Ġfile ĊĠĠĠĠ Ġ* Ġ@ param ĠIO Mode ĠDefault Ġis Ġfile ĠIO ĊĠĠĠĠ Ġ* Ġ@ return Ġ- 1 Ġif Ġencounter Ġerror Ġelse Ġ 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Jvm Over loads ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġopen ( Database Path : ĠString , ĠIO Mode : ĠIO Modes Ġ= ĠIO Modes . IP 2 PROXY _ FILE _ IO ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( db Type Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip Database Path Ġ= ĠDatabase Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( IO Mode Ġ== ĠIO Modes . IP 2 PROXY _ MEMORY _ MAP PED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuse Memory Mapped File Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! load BIN ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġfunction Ġto Ġquery ĠIP 2 Proxy Ġdata . ĊĠĠĠĠ Ġ* Ġ@ param ĠIP Address ĠIP ĠAddress Ġyou Ġwish Ġto Ġquery ĊĠĠĠĠ Ġ* Ġ@ return ĠIP 2 Proxy Ġdata ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġproxy Query ( IPAddress : ĠString ?): ĠProxy Result Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġproxy Query ( IPAddress , ĠMode s . ALL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġproxy Query ( IPAddress : ĠString ?, ĠMode : ĠMode s ): ĠProxy Result Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġip Address Ġ= ĠIP Address ?. trim Ġ{ Ġit Ġ<= Ġ' Ġ' Ġ} Ġ?: Ġ"" Ġ// Ġif Ġnull , Ġit Ġbecomes Ġempty Ġstring ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠProxy Result () ĊĠĠĠĠĠĠĠ Ġvar Ġr F : ĠRandom Access File ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġbuf : ĠByteBuffer ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġdata Buf : ĠByteBuffer ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ipAddress . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Proxy Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . proxy Type Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . country Short Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . country Long Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . region Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . city Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . i SP Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . domain Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . usage Type Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . a SN Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult .` as ` Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . last Seen Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . threat Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . provider Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġip No : ĠBigInteger ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Addr : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual IP Type : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġip Type : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbase Addr Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcolumn Size : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġbuf Capacity Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax IP Range : ĠBigInteger ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrow Offset : ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġrow Offset 2 : ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb I : ĠArray < BigInteger > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġover Capacity Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġret Arr : ĠArray < String > ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġb I Ġ= Ġip 2 No ( ipAddress ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Type Ġ= Ġb I [ 0 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip No Ġ= Ġb I [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual IP Type Ġ= Ġb I [ 2 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( actual IP Type Ġ== Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Arr Ġ= Ġexpand IPV 6 ( ipAddress , Ġip Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Type Ġ= Ġret Arr [ 1 ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠUnknown Host Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Proxy Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . proxy Type Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . country Short Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . country Long Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . region Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . city Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . i SP Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . domain Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . usage Type Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . a SN Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult .` as ` Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . last Seen Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . threat Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . provider Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpos : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlow : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġhigh : ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġmid : ĠLong ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġip From : ĠBigInteger ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġip To : ĠBigInteger ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRead ĠBIN Ġif Ġhaven 't Ġdone Ġso ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( db Type Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! load BIN ()) Ġ{ Ġ// Ġproblems Ġreading ĠBIN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Proxy Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . proxy Type Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . country Short Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . country Long Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . region Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . city Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . i SP Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . domain Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . usage Type Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . a SN Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult .` as ` Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . last Seen Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . threat Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . provider Ġ= ĠMSG _ MISSING _ FILE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Memory Mapped File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ip V 4 Buffer Ġ== Ġnull Ġ|| Ġdb Count IPV 6 Ġ> Ġ 0 Ġ&& Ġip V 6 Buffer Ġ== Ġnull Ġ|| Ġmap Data Buffer Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Mapped Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestroy Mapped Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr F Ġ= ĠRandom Access File ( ip Database Path , Ġ" r ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ip Type Ġ== Ġ 4 ) Ġ{ Ġ// ĠIPv 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax IP Range Ġ= ĠMAX _ IPV 4 _ RANGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Memory Mapped File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip V 4 Buffer !!. duplicate () Ġ// Ġthis Ġenables Ġthis Ġthread Ġto Ġmaintain Ġits Ġown Ġposition Ġin Ġa Ġmulti - threaded Ġenvironment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . order ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf Capacity Ġ= Ġbuf . capacity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Addr Ġ= Ġthis . base Addr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Size Ġ= Ġip V 4 Column Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Addr Ġ= Ġip No . shift Right ( 1 6 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlow Ġ= Ġindex Array IPV 4 [ index Addr ][ 0 ]. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhigh Ġ= Ġindex Array IPV 4 [ index Addr ][ 1 ]. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ Ġ// ĠIPv 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( db Count IPV 6 Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Proxy Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . proxy Type Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . country Short Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . country Long Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . region Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . city Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . i SP Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . domain Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . usage Type Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . a SN Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult .` as ` Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . last Seen Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . threat Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . provider Ġ= ĠMSG _ IPV 6 _ UNSUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax IP Range Ġ= ĠMAX _ IPV 6 _ RANGE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhigh Ġ= Ġdb Count IPV 6 . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Memory Mapped File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip V 6 Buffer !!. duplicate () Ġ// Ġthis Ġenables Ġthis Ġthread Ġto Ġmaintain Ġits Ġown Ġposition Ġin Ġa Ġmulti - threaded Ġenvironment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf . order ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf Capacity Ġ= Ġbuf . capacity () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbase Addr Ġ= Ġbase Addr IPV 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcolumn Size Ġ= Ġip V 6 Column Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Base Addr IPV 6 Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex Addr Ġ= Ġip No . shift Right ( 1 1 2 ). toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlow Ġ= Ġindex Array IPV 6 [ index Addr ][ 0 ]. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhigh Ġ= Ġindex Array IPV 6 [ index Addr ][ 1 ]. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ip No . compareTo ( max IP Range ) Ġ== Ġ 0 ) Ġip No Ġ= Ġip No . subtract ( BigInteger . ONE ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( low Ġ<= Ġhigh ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmid Ġ= Ġ(( low Ġ+ Ġhigh ) Ġ/ Ġ 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Offset Ġ= Ġbase Addr Ġ+ Ġmid Ġ* Ġcolumn Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrow Offset 2 Ġ= Ġrow Offset Ġ+ Ġcolumn Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Memory Mapped File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġover Capacity Ġ= Ġrow Offset 2 Ġ>= Ġbuf Capacity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip From Ġ= Ġread 3 2 Or 1 2 8 ( row Offset , Ġip Type , Ġbuf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip To Ġ= Ġif Ġ( over Capacity ) ĠBigInteger . ZERO Ġelse Ġread 3 2 Or 1 2 8 ( row Offset 2 , Ġip Type , Ġbuf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ip No Ġ>= Ġip From Ġ&& Ġip No Ġ< Ġip To ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Proxy : ĠInt ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġproxy Type : ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcountry Short : ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcountry Long : ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġregion : ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcity : ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi SP : ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġdomain : ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġusage Type : ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġa SN : ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġ` as `: ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlast Seen : ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġthreat : ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġprovider : ĠString ? Ġ= ĠMSG _ NOT _ SUPPORTED ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfirst Col Ġ= Ġ 4 Ġ// ĠIP ĠFrom Ġis Ġ 4 Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ip Type Ġ== Ġ 6 ) Ġ{ Ġ// ĠIPv 6 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfirst Col Ġ= Ġ 1 6 Ġ// ĠIPv 6 Ġis Ġ 1 6 Ġbytes ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġread Ġthe Ġrow Ġhere Ġafter Ġthe ĠIP ĠFrom Ġcolumn Ġ( remaining Ġcolumns Ġare Ġall Ġ 4 Ġbytes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow Len Ġ= Ġcolumn Size Ġ- Ġfirst Col ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrow : ĠByteArray Ġ= Ġread Row ( row Offset Ġ+ Ġfirst Col , Ġrow Len . to Long (), Ġbuf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( use Memory Mapped File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Buf Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmap Data Buffer !!. duplicate () Ġ// Ġthis Ġis Ġto Ġenable Ġreading Ġof Ġa Ġrange Ġof Ġbytes Ġin Ġmulti - threaded Ġenvironment ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Buf . order ( Byte Order . LIT TLE _ ENDIAN ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( proxy Type Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . PROXY _ TYPE Ġ|| ĠMode Ġ== ĠMode s . IS _ PROXY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproxy Type Ġ= Ġread Str ( read 3 2 Row ( row , Ġproxy Type Position Offset ). to Long (), Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( country Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . COUNTRY _ SHORT Ġ|| ĠMode Ġ== ĠMode s . COUNTRY _ LONG Ġ|| ĠMode Ġ== ĠMode s . IS _ PROXY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ= Ġread 3 2 Row ( row , Ġcountry Position Offset ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . COUNTRY _ SHORT Ġ|| ĠMode Ġ== ĠMode s . IS _ PROXY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcountry Short Ġ= Ġread Str ( pos , Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . COUNTRY _ LONG ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcountry Long Ġ= Ġread Str ( pos Ġ+ Ġ 3 , Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( region Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . REGION ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregion Ġ= Ġread Str ( read 3 2 Row ( row , Ġregion Position Offset ). to Long (), Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( city Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . C ITY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcity Ġ= Ġread Str ( read 3 2 Row ( row , Ġcity Position Offset ). to Long (), Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( i SP Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . ISP ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi SP Ġ= Ġread Str ( read 3 2 Row ( row , Ġi SP Position Offset ). to Long (), Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( domain Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . DOMAIN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdomain Ġ= Ġread Str ( read 3 2 Row ( row , Ġdomain Position Offset ). to Long (), Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( usage Type Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . USAGE _ TYPE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġusage Type Ġ= Ġread Str ( read 3 2 Row ( row , Ġusage Type Position Offset ). to Long (), Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a SN Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . ASN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa SN Ġ= Ġread Str ( read 3 2 Row ( row , Ġa SN Position Offset ). to Long (), Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( as Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . AS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ` as ` Ġ= Ġread Str ( read 3 2 Row ( row , Ġas Position Offset ). to Long (), Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( last Seen Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . LAST _ SE EN ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Seen Ġ= Ġread Str ( read 3 2 Row ( row , Ġlast Seen Position Offset ). to Long (), Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( threat Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . TH RE AT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthreat Ġ= Ġread Str ( read 3 2 Row ( row , Ġthreat Position Offset ). to Long (), Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( provider Enabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Mode Ġ== ĠMode s . ALL Ġ|| ĠMode Ġ== ĠMode s . PROVIDER ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider Ġ= Ġread Str ( read 3 2 Row ( row , Ġprovider Position Offset ). to Long (), Ġdata Buf , Ġr F ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Proxy Ġ= Ġif Ġ( country Short Ġ== Ġ"-" Ġ|| Ġproxy Type Ġ== Ġ"- ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( proxy Type Ġ== Ġ" D CH " Ġ|| Ġproxy Type Ġ== Ġ" SES ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Proxy Ġ= Ġis Proxy ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . proxy Type Ġ= Ġproxy Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . country Short Ġ= Ġcountry Short ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . country Long Ġ= Ġcountry Long ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . region Ġ= Ġregion ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . city Ġ= Ġcity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . i SP Ġ= Ġi SP ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . domain Ġ= Ġdomain ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . usage Type Ġ= Ġusage Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . a SN Ġ= Ġa SN ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult .` as ` Ġ= Ġ` as ` ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . last Seen Ġ= Ġlast Seen ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . threat Ġ= Ġthreat ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult . provider Ġ= Ġprovider ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ip No Ġ< Ġip From ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhigh Ġ= Ġmid Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlow Ġ= Ġmid Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . is Proxy Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . proxy Type Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . country Short Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . country Long Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . region Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . city Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . i SP Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . domain Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . usage Type Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . a SN Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult .` as ` Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . last Seen Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . threat Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult . provider Ġ= ĠMSG _ INVALID _ IP ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr F ?. close () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexpand IPV 6 ( IP : ĠString , ĠIP Type : ĠInt ): ĠArray < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtmp Ġ= Ġ" 0 0 0 0 : 0 0 0 0 : 0 0 0 0 : 0 0 0 0 : 0 0 0 0 :" ĊĠĠĠĠĠĠĠ Ġval Ġpad Me Ġ= Ġ" 0 0 0 0 " ĊĠĠĠĠĠĠĠ Ġval Ġhex Offset : ĠLong Ġ= Ġ 0 xFF ĊĠĠĠĠĠĠĠ Ġvar Ġip 2 Ġ= ĠIP . uppercase ( Locale . getDefault ()) ĊĠĠĠĠĠĠĠ Ġvar Ġret Type Ġ= ĠIP Type . toString () ĊĠĠĠĠĠĠĠ Ġif Ġ( IP Type Ġ== Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Pattern 4 . matcher ( ip 2 ). matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 2 Ġ= Ġip 2 . replace (" :: ". to Regex (), Ġtmp ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmat Ġ= ĠPattern 5 . matcher ( ip 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mat . matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġmat . group ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarr Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch . replace ("^ :+ ". to Regex (), Ġ""). replace (": +$ ". to Regex (), Ġ""). split (" :" . to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġarr . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbf Ġ= ĠStringBuilder ( 3 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġlen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun padded Ġ= Ġarr [ x ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf . append ( pad Me . substring ( un padded . length ) Ġ+ Ġun padded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtmp 2 Ġ= ĠBigInteger ( bf . toString (), Ġ 1 6 ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 ) Ġ// Ġusing Ġlong Ġin Ġplace Ġof Ġbytes Ġdue Ġto Ġ 2 's Ġcomplement Ġsigned Ġissue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 .. 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes [ x ] Ġ= Ġtmp 2 Ġand Ġhex Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp 2 Ġ= Ġtmp 2 Ġshr Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 2 Ġ= Ġip 2 . replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Ġ+ Ġ"$ ". to Regex (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ":" Ġ+ Ġbytes [ 3 ] Ġ+ Ġ"." Ġ+ Ġbytes [ 2 ] Ġ+ Ġ"." Ġ+ Ġbytes [ 1 ] Ġ+ Ġ"." Ġ+ Ġbytes [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 2 Ġ= Ġip 2 . replace (" :: ". to Regex (), Ġtmp ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( IP Type Ġ== Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ip 2 Ġ== Ġ":: ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 2 Ġ+= Ġ" 0 . 0 . 0 . 0 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 2 Ġ= Ġip 2 . replace (" :: ". to Regex (), Ġtmp Ġ+ Ġ" FFFF :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Type Ġ= Ġ" 4 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmat Ġ= ĠPattern 4 . matcher ( ip 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mat . matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 6 Part Ġ= Ġmat . group ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 4 Part Ġ= Ġmat . group ( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 4 Arr Ġ= Ġv 4 Part . split ("\\ .". to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġv 4 Int Arr Ġ= ĠInt Array ( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlen Ġ= Ġv 4 Int Arr . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġlen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 4 Int Arr [ x ] Ġ= Ġv 4 Arr [ x ]. toInt () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart 1 Ġ= Ġ( v 4 Int Arr [ 0 ] Ġshl Ġ 8 ) Ġ+ Ġv 4 Int Arr [ 1 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart 2 Ġ= Ġ( v 4 Int Arr [ 2 ] Ġshl Ġ 8 ) Ġ+ Ġv 4 Int Arr [ 3 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart 1 Hex Ġ= ĠInteger . to HexString ( part 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpart 2 Hex Ġ= ĠInteger . to HexString ( part 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbf Ġ= ĠStringBuilder ( v 6 Part . length Ġ+ Ġ 9 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf . append ( v 6 Part ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf . append ( pad Me . substring ( part 1 Hex . length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf . append ( part 1 Hex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf . append (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf . append ( pad Me . substring ( part 2 Hex . length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf . append ( part 2 Hex ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 2 Ġ= Ġbf . toString (). toUpperCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarr Ġ= Ġip 2 . split (" :: ". to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Side Ġ= Ġarr [ 0 ]. split (" :" . to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbf 2 Ġ= ĠStringBuilder ( 4 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbf 3 Ġ= ĠStringBuilder ( 4 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbf 4 Ġ= ĠStringBuilder ( 4 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlen Ġ= Ġleft Side . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Segments Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġlen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Side [ x ]. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Segments ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 2 . append ( pad Me . substring ( left Side [ x ]. length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 2 . append ( left Side [ x ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 2 . append (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arr . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Side Ġ= Ġarr [ 1 ]. split (" :" . to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlen Ġ= Ġright Side . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġlen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Side [ x ]. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Segments ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 3 . append ( pad Me . substring ( right Side [ x ]. length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 3 . append ( right Side [ x ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 3 . append (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Segments Left Ġ= Ġ 8 Ġ- Ġtotal Segments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( total Segments Left Ġ== Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 1 Ġuntil Ġtotal Segments Left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 4 . append ( pad Me ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 4 . append (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 4 . append (" FFFF :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 4 . append ( v 4 Part ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Type Ġ= Ġ" 4 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 2 Ġ= Ġbf 4 . toString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġtotal Segments Left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 4 . append ( pad Me ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 4 . append (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 2 . append ( bf 4 ). append ( bf 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 2 Ġ= Ġbf 2 . toString (). replace (" :$ ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmat 2 Ġ= ĠPattern 6 . matcher ( ip 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( mat 2 . matches ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġmat 2 . group ( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarr Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch . replace ("^ :+ ". to Regex (), Ġ""). replace (": +$ ". to Regex (), Ġ""). split (" :" . to Regex ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġarr . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbf Ġ= ĠStringBuilder ( 3 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġlen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġun padded Ġ= Ġarr [ x ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf . append ( pad Me . substring ( un padded . length ) Ġ+ Ġun padded ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtmp 2 Ġ= ĠBigInteger ( bf . toString (), Ġ 1 6 ). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġlong ArrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ// Ġusing Ġlong Ġin Ġplace Ġof Ġbytes Ġdue Ġto Ġ 2 's Ġcomplement Ġsigned Ġissue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 .. 3 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes [ x ] Ġ= Ġtmp 2 Ġand Ġhex Offset ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtmp 2 Ġ= Ġtmp 2 Ġshr Ġ 8 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 2 Ġ= Ġip 2 . replace ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Ġ+ Ġ"$ ". to Regex (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ":" Ġ+ Ġbytes [ 3 ] Ġ+ Ġ"." Ġ+ Ġbytes [ 2 ] Ġ+ Ġ"." Ġ+ Ġbytes [ 1 ] Ġ+ Ġ"." Ġ+ Ġbytes [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 2 Ġ= Ġip 2 . replace (" :: ". to Regex (), Ġtmp Ġ+ Ġ" FFFF :") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġret Type Ġ= Ġ" 4 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġarr Ġ= Ġip 2 . split (" :: ". to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġleft Side Ġ= Ġarr [ 0 ]. split (" :" . to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbf 2 Ġ= ĠStringBuilder ( 4 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbf 3 Ġ= ĠStringBuilder ( 4 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbf 4 Ġ= ĠStringBuilder ( 4 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlen Ġ= Ġleft Side . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġtotal Segments Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġlen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( left Side [ x ]. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Segments ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 2 . append ( pad Me . substring ( left Side [ x ]. length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 2 . append ( left Side [ x ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 2 . append (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arr . size Ġ> Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġright Side Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarr [ 1 ]. split (" :" . to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlen Ġ= Ġright Side . size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġlen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( right Side [ x ]. isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtotal Segments ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 3 . append ( pad Me . substring ( right Side [ x ]. length )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 3 . append ( right Side [ x ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 3 . append (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtotal Segments Left Ġ= Ġ 8 Ġ- Ġtotal Segments ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 0 Ġuntil Ġtotal Segments Left ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 4 . append ( pad Me ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 4 . append (": ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbf 2 . append ( bf 4 ). append ( bf 3 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip 2 Ġ= Ġbf 2 . toString (). replace (" :$ ". to Regex (), Ġ"") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠarrayOf ( ip 2 , Ġret Type ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġreverse ( arr : ĠByteArray ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( arr Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġj Ġ= Ġarr . size Ġ- Ġ 1 ĊĠĠĠĠĠĠĠ Ġvar Ġtmp : ĠByte ĊĠĠĠĠĠĠĠ Ġwhile Ġ( j Ġ> Ġi ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtmp Ġ= Ġarr [ j ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarr [ j ] Ġ= Ġarr [ i ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarr [ i ] Ġ= Ġtmp ĊĠĠĠĠĠĠĠĠĠĠĠ Ġj -- ĊĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġread Row ( Position : ĠLong , Ġmy Len : ĠLong , Ġbuf : ĠByteBuffer ?, Ġr H : ĠRandom Access File ?): ĠByteArray Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrow Ġ= ĠByteArray ( my Len . toInt ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( use Memory Mapped File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf !!. position ( Position . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf [ row , Ġ 0 , Ġmy Len . toInt ()] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr H !!. seek ( Position Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr H . read ( row , Ġ 0 , Ġmy Len . toInt ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġrow ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġread 3 2 Or 1 2 8 ( position : ĠLong , Ġip Type : ĠInt , Ġbuf : ĠByteBuffer ?, Ġr H : ĠRandom Access File ?): ĠBigInteger Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ip Type Ġ== Ġ 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġread 3 2 ( position , Ġbuf , Ġr H ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ip Type Ġ== Ġ 6 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġread 1 2 8 ( position , Ġbuf , Ġr H ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠBigInteger . ZERO ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġread 1 2 8 ( Position : ĠLong , Ġbuf : ĠByteBuffer ?, Ġr H : ĠRandom Access File ?): ĠBigInteger Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠretVal : ĠBigInteger ĊĠĠĠĠĠĠĠ Ġval Ġb Size Ġ= Ġ 1 6 ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( b Size ) ĊĠĠĠĠĠĠĠ Ġif Ġ( use Memory Mapped File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf !!. position ( Position . toInt ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuf [ bytes , Ġ 0 , Ġb Size ] ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr H !!. seek ( Position Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr H . read ( bytes , Ġ 0 , Ġb Size ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreverse ( bytes ) ĊĠĠĠĠĠĠĠ ĠretVal Ġ= ĠBigInteger ( 1 , Ġbytes ) ĊĠĠĠĠĠĠĠ Ġreturn ĠretVal ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġread 3 2 Row ( row : ĠByteArray , Ġfrom : ĠInt ): ĠBigInteger Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlen Ġ= Ġ 4 Ġ// Ġ 4 Ġbytes ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( len ) ĊĠĠĠĠĠĠĠ ĠSystem . arraycopy ( row , Ġfrom , Ġbytes , Ġ 0 , Ġlen ) ĊĠĠĠĠĠĠĠ Ġreverse ( bytes ) ĊĠĠĠĠĠĠĠ Ġreturn ĠBigInteger ( 1 , Ġbytes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġread 3 2 ( position : ĠLong , Ġbuf : ĠByteBuffer ?, Ġr H : ĠRandom Access File ?): ĠBigInteger Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( use Memory Mapped File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġsimulate Ġunsigned Ġint Ġby Ġusing Ġlong ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger . valueOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf !!. getInt ( position . toInt ()). to Long () Ġand Ġ 0 xffffffff L ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ// Ġuse Ġabsolute Ġoffset Ġto Ġbe Ġthread - safe ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġb Size Ġ= Ġ 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr H !!. seek ( position Ġ- Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠByteArray ( b Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr H . read ( bytes , Ġ 0 , Ġb Size ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreverse ( bytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠBigInteger ( 1 , Ġbytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġread Str ( position : ĠLong , Ġbuf : ĠByteBuffer ?, Ġr H : ĠRandom Access File ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpos Ġ= Ġposition ĊĠĠĠĠĠĠĠ Ġval Ġsize : ĠInt ĊĊĠĠĠĠĠĠĠ Ġval Ġbytes : ĠByteArray ? ĊĠĠĠĠĠĠĠ Ġif Ġ( use Memory Mapped File ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpos Ġ-= Ġmap Data Offset Ġ// Ġposition Ġstored Ġin ĠBIN Ġfile Ġis Ġfor Ġfull Ġfile , Ġnot Ġjust Ġthe Ġmapped Ġdata Ġsegment , Ġso Ġneed Ġto Ġminus ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġmap Data Buffer ! ![ pos . toInt ()]. toInt () Ġ// Ġuse Ġabsolute Ġoffset Ġto Ġbe Ġthread - safe ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Ġ= ĠByteArray ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf !!. position ( pos . toInt () Ġ+ Ġ 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuf [ bytes , Ġ 0 , Ġsize ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNegative Array Size Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġr H !!. seek ( position ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsize Ġ= Ġr H . read () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbytes Ġ= ĠByteArray ( size ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġr H . read ( bytes , Ġ 0 , Ġsize ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠNegative Array Size Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠString ( bytes ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( Unknown Host Exception :: class ) ĊĠĠĠ Ġprivate Ġfun Ġip 2 No ( IP : ĠString ): ĠArray < BigInteger > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa 1 : ĠBigInteger ĊĠĠĠĠĠĠĠ Ġvar Ġa 2 : ĠBigInteger ĊĠĠĠĠĠĠĠ Ġvar Ġa 3 Ġ= ĠBigInteger (" 4 ") ĊĠĠĠĠĠĠĠ Ġif Ġ( Pattern 1 . matcher ( IP ). matches ()) Ġ{ Ġ// Ġshould Ġbe ĠIPv 4 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa 1 Ġ= ĠBigInteger (" 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa 2 Ġ= ĠBigInteger ( ip V 4 No ( IP ). toString ()) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( Pattern 2 . matcher ( IP ). matches () Ġ|| ĠPattern 3 . matcher ( IP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. matches () Ġ|| ĠPattern 7 . matcher ( IP ). matches () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnknown Host Exception () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa 3 Ġ= ĠBigInteger (" 6 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġia Ġ= ĠInet Address . get ByName ( IP ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġia . address ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġip Type Ġ= Ġ" 0 " Ġ// ĠBigInteger Ġneeds ĠString Ġin Ġthe Ġconstructor ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ia Ġis ĠInet 6 Address ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Type Ġ= Ġ" 6 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( ia Ġis ĠInet 4 Address ) Ġ{ Ġ// Ġthis Ġwill Ġrun Ġin Ġcases Ġof ĠIPv 4 - mapped ĠIPv 6 Ġaddresses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Type Ġ= Ġ" 4 " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa 2 Ġ= ĠBigInteger ( 1 , Ġbytes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( a 2 Ġin ĠFROM _ 6 TO 4 .. TO _ 6 TO 4 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ 6 to 4 Ġso Ġneed Ġto Ġremap Ġto Ġipv 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Type Ġ= Ġ" 4 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa 2 Ġ= Ġa 2 . shift Right ( 8 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa 2 Ġ= Ġa 2 . and ( LAST _ 3 2 BITS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa 3 Ġ= ĠBigInteger (" 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( a 2 Ġin ĠFROM _ TER EDO .. TO _ TER EDO ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠTer ed o Ġso Ġneed Ġto Ġremap Ġto Ġipv 4 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġip Type Ġ= Ġ" 4 " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa 2 Ġ= Ġa 2 . not () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa 2 Ġ= Ġa 2 . and ( LAST _ 3 2 BITS ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġa 3 Ġ= ĠBigInteger (" 4 ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġa 1 Ġ= ĠBigInteger ( ip Type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠarrayOf ( a 1 , Ġa 2 , Ġa 3 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġip V 4 No ( IP : ĠString ): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġip Arr Ġ= ĠIP . split ("\\ .". to Regex ()). to Typed Array () ĊĠĠĠĠĠĠĠ Ġvar ĠretVal : ĠLong Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġip Long : ĠLong ĊĠĠĠĠĠĠĠ Ġfor Ġ( x Ġin Ġ 3 Ġdown To Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġip Long Ġ= Ġip Arr [ 3 Ġ- Ġx ]. to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ ĠretVal Ġ= ĠretVal Ġor Ġ( ip Long Ġshl Ġ( x Ġshl Ġ 3 )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠretVal ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPattern 1 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . compile ("^ (?: (?: 2 5 [ 0 - 5 ]| 2 [ 0 - 4 ][ 0 - 9 ] |[ 0 1 ]? [ 0 - 9 ][ 0 - 9 ] ?) \\. ){ 3 }( ?: 2 5 [ 0 - 5 ]| 2 [ 0 - 4 ][ 0 - 9 ] |[ 0 1 ]? [ 0 - 9 ][ 0 - 9 ]? )$ ") Ġ// ĠIPv 4 ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPattern 2 Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPattern . compile ("^ ([ 0 - 9 A - F ]{ 1 , 4 }: ){ 6 }( 0 [ 0 - 9 ]+ \\ .| .*? \\. 0 [ 0 - 9 ]+ ). *$ ", ĠPattern . CASE _ INS ENS ITIVE ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPattern 3 Ġ= ĠPattern . compile ("^ [ 0 - 9 ]+ $ ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPattern 4 Ġ= ĠPattern . compile ("^ (.* : )(( [ 0 - 9 ]+ \\. ){ 3 }[ 0 - 9 ]+ )$ ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPattern 5 Ġ= ĠPattern . compile ("^ .* (( :[ 0 - 9 A - F ]{ 1 , 4 } ){ 2 }) $ ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPattern 6 Ġ= ĠPattern . compile ("^ [ 0 : ]+ (( :[ 0 - 9 A - F ]{ 1 , 4 } ){ 1 , 2 }) $", ĠPattern . CASE _ INS ENS ITIVE ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPattern 7 Ġ= ĠPattern . compile ("^ ([ 0 - 9 ]+ \\. ){ 1 , 2 }[ 0 - 9 ]+ $ ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠMAX _ IPV 4 _ RANGE Ġ= ĠBigInteger (" 4 2 9 4 9 6 7 2 9 5 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠMAX _ IPV 6 _ RANGE Ġ= ĠBigInteger (" 3 4 0 2 8 2 3 6 6 9 2 0 9 3 8 4 6 3 4 6 3 3 7 4 6 0 7 4 3 1 7 6 8 2 1 1 4 5 5 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠFROM _ 6 TO 4 Ġ= ĠBigInteger (" 4 2 5 4 5 6 8 0 4 5 8 8 3 4 3 7 7 5 8 8 1 7 8 8 8 6 9 2 1 6 2 9 4 6 6 6 2 4 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTO _ 6 TO 4 Ġ= ĠBigInteger (" 4 2 5 5 0 8 7 2 7 5 5 6 9 2 9 1 2 4 1 5 8 0 7 4 1 7 4 1 7 9 5 8 6 8 6 7 1 9 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠFROM _ TER EDO Ġ= ĠBigInteger (" 4 2 5 4 0 4 8 8 1 6 1 9 7 5 8 4 2 7 6 0 5 5 0 3 5 6 4 2 5 3 0 0 2 4 6 5 2 8 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTO _ TER EDO Ġ= ĠBigInteger (" 4 2 5 4 0 4 8 8 2 4 1 2 0 4 0 0 5 2 7 4 8 1 4 6 9 4 0 1 8 8 4 4 1 9 6 8 6 3 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLAST _ 3 2 BITS Ġ= ĠBigInteger (" 4 2 9 4 9 6 7 2 9 5 ") ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ NOT _ SUPPORTED Ġ= Ġ" NOT ĠSUPPORT ED " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ INVALID _ IP Ġ= Ġ" INVALID ĠIP ĠADDRESS " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ MISSING _ FILE Ġ= Ġ" MISSING ĠFILE " ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠMSG _ IPV 6 _ UNSUPPORTED Ġ= Ġ" IPV 6 ĠADDRESS ĠMIS SING ĠIN ĠIP V 4 ĠBIN " ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠCOUN TRY _ POSITION Ġ= Ġint ArrayOf ( 0 , Ġ 2 , Ġ 3 , Ġ 3 , Ġ 3 , Ġ 3 , Ġ 3 , Ġ 3 , Ġ 3 , Ġ 3 , Ġ 3 , Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠREGION _ POSITION Ġ= Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 4 , Ġ 4 , Ġ 4 , Ġ 4 , Ġ 4 , Ġ 4 , Ġ 4 , Ġ 4 , Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠC ITY _ POSITION Ġ= Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 5 , Ġ 5 , Ġ 5 , Ġ 5 , Ġ 5 , Ġ 5 , Ġ 5 , Ġ 5 , Ġ 5 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠI SP _ POSITION Ġ= Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 6 , Ġ 6 , Ġ 6 , Ġ 6 , Ġ 6 , Ġ 6 , Ġ 6 , Ġ 6 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPRO XY TYPE _ POSITION Ġ= Ġint ArrayOf ( 0 , Ġ 0 , Ġ 2 , Ġ 2 , Ġ 2 , Ġ 2 , Ġ 2 , Ġ 2 , Ġ 2 , Ġ 2 , Ġ 2 , Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠDO MAIN _ POSITION Ġ= Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 7 , Ġ 7 , Ġ 7 , Ġ 7 , Ġ 7 , Ġ 7 , Ġ 7 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠUS AG ET YPE _ POSITION Ġ= Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 8 , Ġ 8 , Ġ 8 , Ġ 8 , Ġ 8 , Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠASN _ POSITION Ġ= Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 9 , Ġ 9 , Ġ 9 , Ġ 9 , Ġ 9 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠAS _ POSITION Ġ= Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 1 0 , Ġ 1 0 , Ġ 1 0 , Ġ 1 0 , Ġ 1 0 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLAST SE EN _ POSITION Ġ= Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 1 1 , Ġ 1 1 , Ġ 1 1 , Ġ 1 1 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTH RE AT _ POSITION Ġ= Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 1 2 , Ġ 1 2 , Ġ 1 2 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPRO VIDER _ POSITION Ġ= Ġint ArrayOf ( 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 0 , Ġ 1 3 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠModule Version Ġ= Ġ" 3 . 2 . 0 " ĊĠĠĠ Ġ} Ċ }