From 49af6dba4526a096a1d319e693dd4e9049c367a5 Mon Sep 17 00:00:00 2001 From: zhanghongqing Date: Mon, 9 May 2022 18:47:02 +0800 Subject: [PATCH] 22.05 --- .../TSG-22.05/Galaxy_22.05更新文档.docx | Bin 13157 -> 13526 bytes .../TSG-22.05/job/mmdb-perl-built-in.pl | 209 ++++++++++++++++++ .../TSG-22.05/job/mmdb-perl-user-defined.pl | 209 ++++++++++++++++++ 3 files changed, 418 insertions(+) create mode 100644 TSG发布版本更新记录/TSG-22.05/job/mmdb-perl-built-in.pl create mode 100644 TSG发布版本更新记录/TSG-22.05/job/mmdb-perl-user-defined.pl diff --git a/TSG发布版本更新记录/TSG-22.05/Galaxy_22.05更新文档.docx b/TSG发布版本更新记录/TSG-22.05/Galaxy_22.05更新文档.docx index 377565eb7bcf982304341b772cd0b53cbcc3670a..3dab7faf81624f64a7801aba63a160e05086c390 100644 GIT binary patch delta 8790 zcma)iWmFyA(k7DN?(PKF;O_43uE8ZZ9NhinKyVEX!S!IlEm&{~92|li2yVkW_gi!C z-1##hySkpLTD^BaReR5F(J__xeLvbpqJ5eWIbcFirf+Qa4S$MQRQA?P)o{h;-^>w~%5|vUVMlL9nKWBVew)s7;!+T?Yu^S&ln1nGevFJJL%TMnN)+KwHjE=14@5~%F&`#tA# z`y>%TH{e>EnCHJOVYORq8T}vEt`@0NS!SvMfOdWDqtCtl9Iu3A%WI0iozV&VHPjO7 z=N1k_!$DlNc#(<+qgh=j8i*>gOBU+*P5g!wW6gbCdGHUShBEv+JQx@lB$yaAh=fT#O^gvN3``&# z00sv8O>E<4t>NkB?!{s4=4s3B=i(fdF8NPlWN#JLsV~JE@(^Tdc|b6qW$Ed{CH}Am zu9D!4ESDAeZehf}w~w$+Ep=psi`%;c^xog72nDkzSfDRfDyd^7A)!blC^2{E7M=tV zDkzVW=eOJ}O_4jr`q+hSh2cciBIYbz&2O z*gD*lx(1^Y5PRN{;d&-2Uzm7Kd!V9CNyvz5#lt%0JI}(F_Gw5UuL`Ts#`ktpI3K-$ zXP5$iYTYL}ZvGnCuvc!tN4#y)j%cVmsi64GmHmYG`zJ?TXL+(QO)3>ijDsCyxhf%JBdeX>gl3joz=!BtDHt4w-D zSA2>75$->8(IgKa2n$FwCUGQ1gMpFpfPuk$ONXzUrwxafx4*Nk*FVXaGFA0l8^_)( zXZDrw0I}Mn(a0(>&wqCwk2h7<`ywysh8`}BJq;7xpW<+jVz^JyA?XTSrxi_tMM~?7 zotG$wB%xv5^$dI8@<;SPfuD~8i3HSX)Pjgr10(pK^J!@S>g>;l9;=TJ?p~g=Ug^J* zGF+)>xlTnBN^j@8e!rfb-Y_c`z^4hoVA1Or@t@YtdwYEj$o6x>?i?fSz{Y-RPxm-1 zb0-qdk9K`xTg&z1UT?4Ly?_@F785k=G0P9Yd()H8Ivb;p;xaugI-%D+$mzA!>CaHw;6VdK3m4jJd7pYScD zwl{V|!1v=jiJ>!9?um4r=q1 z3Ef)9kn8rv%2GZuO#tP*cPz%(c{HFrrhW3FE#dKK)pv#5zck-&#b8bPTAe)6NE4#? z2DXGy(qH!?@hkpj5Hol#0K7c^etn4PTvf)9RQug6D*FO)8%kDn)D2n4pT)|>s=5*x zfiVTxX$qa@B~eRm!wwyD@PE~xH}ilvHQ!`HmRe$aK3E}l)Nte`%)IV$WJ>L|iQQgb z1^<~KYIIxe0{>!g`*y3!dccImqNA%I+4yv~flCTvka%nh$Mt9wmExhh@*VY~shrt~ z8%2kGRWqdgyEQ9lxcEa?X&)__T4?SP?kW)g>!r{?iQ3HR^os%l79DIC9V`_clnsoX zFpAYHI+s_5c2m;{!_=irV1%ATG{J8@q@KdGi>1DaFwg%H^}LC64q?7hOKKf?l*WYH zDqy^yNF_nZpytA3l{R8Dh%VKrM`J3oAjXmE=Ps4r)bSLPZo&Sxp)b$EG_L?C`=L1G zi{Qr(=N>d`MWcaEiGB42717n~`DEXyb|rA?&$Ex?=H``&GiV8}IsICvTUpR^ujXll zHG1i}lP`b;0b4WZ8N<`|h=Mqf%KuI+X> z?IQmfEoFObMul-=l(xo&f^`7S58LSHjE}5I^e_t~xf4@p(AJ@c#+8DY>^qXKU)|i|q8EN=^a1muh{y7{ z*?Bzr*~Vn$mXPWEXFHm?i99z@=-8{Vi5CKoPWl~4(e-Ifu#y}5|4 zLO(`N><;eSt_t?G@*X`W-3Hw}a({(p54*5~)W)As=2j5xH#>1LAhU-*1T9IguBRY? zBH6o3TU3QP)!cxlbp} z!Hx68nol?v)u5Yq+eG^$>YV~nDAIA)oZN69fI?z##6$1girl`G1d<@X91r(A?9LWH zRZC~*#$;HaPwk8^h0+;6eGrKz)Z!t>)9L{3pgy4nMQ5zO4RUJ9;;1G>31i$c+w`!; z$oT4gW-@4QfbPy%8>$^$f(zNB8jGzfss6qL1Y#S@FZBdCIPMwPIQ4|s_N5S9&cD;U zl^5m9=9m6Nvn%Tfht55+-h3l8Lf`d?<#cqdqAe|S-{)Bd=_V(WPhZ1#8h3Z=&a6Pl zUF;KlW&YpmcDsdEkHz8qBVcg{AER~oyL-KD=mQDO5A;dI_yS|_G%q-O4+YAFmBK!9 z&`0(nmchciq%4O%Z!Lr+cwHHFjm|M*k4k@NvEu|~bl008E`E(b-B{+7O*pXjr1)CZ zJpj_i3=33`bsAkZe)Y%`y84_jt!ABjVmGM&pw5y7&B_k62fQmMeDrgGd8Nq+ zAs~>Io+^VL`k`2_v}0q9plq=T$*=A>p*D?+ru3eP9o6*|n zg^W^+amX1aT@+QSG{$rE4qHt=xG;7IVHL$GQYaO(dyg7{E0bV=IT%AZ<5r$CMSj|b zDw~ctZp?(T;7XH4h$?*}fg5vLi=TE}%}|b#4cn#+jWDzfkp5Mt=vRj*w9GTBxoEd4 zo*y(yhe@xg3yzZ+@ioD_rhuZKj8Y`FvVK4$kLSPs|9WY<#$e94?Oe2$cJ-TG?lEaa z9eg*Mv~EA#-U*{O3q!kw($KQTui$w)z@`p+yq|W*|6tOgae|iN7$&@-FnUAa^QK-D z%MY3;MgLZ&_Yds!nDh$fH|T-T4;XX}4@!tISAMHw+|8N>N z?$2P3k`%TZbEYDxl4|Y$aTD-n>|Ky;`j~1KN#oY9p8QWfRpj4kUcTT#x-x%QJ#mXg(NbxVn9)gnDcr&BA_fukoHEK10y>oNo5;od~_z-Euli zJaf93Eycp6pzS@$Q1OXOWLT91GrU3QyPr}*db`sm{6&1 zUa64%;0&c;pxAkxg&Nm7KVb0jq9TAaUjU4nQ3TU?g}jJ(yp^ePDgw(QaLh|!n^862 zrp{q~LA6QnQ0W89IoGoxD-nX=N-yZLe8@xoNnZGLFV%}@eK;lNXI1;LEOtrzr;$JF zjlRg2=iEYA)xUCQoy=YGG;Ly(P`eLCT(2;?7e>xxJg#3bC?8OosR6#*Rv9riyqPVW zry_#C#!aU7ASM=B6D~M{zbU`5r+t>cdu9Gm<7s>zV3oJ_Al9``fnLui!rsOOB=PKm zJVP4wFPDv_qmC-SVNl7D9#4!(>g8lquO+RC@;T*HN8=IlIkY+lS!9`Ey+6RLsHjcW z9v&EG7Bzk6--7m<6$hZYgA5jFJ*hoVzC1MpC_go*5ZF-8|R09-i;X_-Ny->ePLpmzl!kuWKdBeMo2oL(q`YM+J1ul6lFi82d_j& z=1liT(_3)H=$Ci@mQ@8yY#GbX5455iwMX&WL}dtt2|0B{dFB8IkaH&_$ooG2+s^D3 zzB0o=lRj&=0L$^l2jRj#vj*>(bLoh_yY`5ey*-vz41`RqHoGq$Id4JA(YOxCS(C5%NEzwoH5oL*&4n8ZBUKtt?snd@t@0zh2OU(5sSGusPvTfGSTgRb zHh^TPl-U)BBh7o+C>59emMd2fQ962ix)y4K9xk(IH&F@F-TAm`yyg!rGcLZ=PYt%4 z58F$ZFyLD;73XfpH4Mz%UEWWNi-D};KyZ93@c1gpO*U4}pz)FC9u+{Vfb?bV!B^P! zeHv*Lv7xd8YN*MsJ@T|?>1e!0u}|%ccSddoT%S%lx4q}&krHQB5CgiqVnhoWr z_&_5nLXmzgsW5J%m>dB0kDE`dw=%P03kRvkAue6tb;H_i^~xg-((^}sb-L;xyoShh z$K2BJWd3OrhSd1eQl&Fy=7t#uw(Qfmivk`xyc0+8-dNlLhTJ`?oa{64Qh^y6PC?O| zK|3NRpdGS=cjM?ur(fmF;hB23nd!L89eiW>1h(G)ZKX1Rdqf3i&G=~*{V5t zhnKm+sCYpN3g$gnWn5#w9CL`dVeaBfi1RH;Gau zL)D50x_~LmOSV><+8)dI)|C+1BV3+SUduZi;FO*z7b5^g6ekdi(Hx?GE%B=r1!D1P z20>Ef1-)yKu=x8_TiAY9D+LkgloK|q@O^q)qs6|C=fDYRNyMt6>Zn|knf?M2;f!h^ zv=x@|&42!>?F^%X)Yxlv8v1hd#uu(#+*7<>-K5D@-wR>rBO6qZM-_9nP`UYy&wWp& zhr8-Ljs(1J_se5glxYJ{1MNB{JQA^WkokU{$2_JrR54g7T?&R(a~%J8GPi#AG|8;a zR~z%C+uimvnM)if)p9T=0Y8odOlA(M8Pq~VWVhPq1zx}@umA=gF3{z4*I?nDcsvpGJ`(V*(vm7Q1WYqm0SU3}oI^O;p~+ zVP1gv_C@#I2OoJkQx>8uyX7?Ur6l-yUSXQg@;(-FP00$T?tNU(cDiH-B#i{CJ^Uiq zQ%$C8e9su)McoAIPc7v!z(p>?^X(x(Io04=JpcblRG6QU!%%w21vTwcpxGpLg_+N`SPZ`#&9nzv@*e=f5HW)Q)p#jXI ziU$yn~VG*3ZJ-hNXSK0duOC0P6?-d13jX*+%+k`K)IsL!PDrZw}I zFjE(Xvx#)hos<)p?!tY4dtEoIE~DG&69qZeJV?Z05VYq+*j1$TEs$aGlz$UMBmp-& ziQP(E8D;wx-m{^Hpn`VT{(O`~4rGh|wn4!gJjJv}uf|~v85E#iP^?&7z*lxivvR=t zdVLwshWCUsPb~Hn^7w=aOnXNH1hXPH)f0##07yIfs!mX0V8s3YV`+aY=Y4jub@l$I zcywyIroE;|0{ETvOvw}C(3zKJb1&7$=H00A^{0(5H@*K_R$^*YEsb(K-A?)n;@k&x zy43m{;UcC~8{h_eS>BnCB2`Y-vwnQ!^A~_+ua|d&O=3gsG7;^^h&|dPfJw+fSKh>J zp1RmGGXu^%xC*(Ehsd(RA##geO$}Acj?;7diE)LJnkNr5SHr0MWMLD%L{otAe8XRW zr{$P6ap0%OK!vKPjF0EanZEFuUUr@&bI+?rZttBMh}U1MTtHBM0tkc~nSXDnI^V#E zJER}a>;*29^dG3=|M))godE1Y3Fi_^Dz{(K5eYc(5>0}x@~mlz zAH3Wzry9a{^=ew80}8E*uO(WT;B`y2Y&^|3POL}={+=>v!DgWRpt7#Y)n7kml&W7B z%Pd<5W7+d-HaYz6DRWe{txvffX{!0rwV>I&4KADLz}BB2RJ8D+D5Hm|IEx$ z)E(@*JrQoAj$Hbf*Vz10RHj_=AQqq23ieaR;?%jAVS}`1z^CZgp$dm^DyZ*V&=bei zOUnLR(PmX!hjOC||HUnAU$TxI-)l9w$3v5x8Pmd*VUeJ2xNRvBQtc}|G4gJeM|^Bw zw!6A=`RT>q(JT0T$~@6YygV6i=_VbkF-0r;hbPq%9%#w$b9M?E_Jt***UR~^`t5MT z^|h;gzX8Asux{{dwVT`E*QLXHCb|jdJc&4+)P|XuglGr-O_@(gNt?wuPx-hJC&Ow- zYq!~@XJ*FavdMYw_O&gaw5mwzgXr67)K^u24Yy)L^`T^;DP;bMC^tBKA_ zD1bXHLA%Q>VYo@Q4`@w!}@ztw!^ul4~((%hWX3AKf$$z&?$Yx0x zPU78}RsOPa)9QbHv$;dVxGw?T=9JM_|EniKvyHEfq8j*#>h1b5Vs7C`4<0*f0cRnjrvc0P zSqLRY&dhM~&14^S*CqvDe>(UlARKnJodBKh{K-ttz=iMSPtnhBDq%8@_!fC*jHexZ z{5O5GrU>UvG@^_%xvZ)v#1FK^0e*^2Ug z(py|KKQKMPAx59Di1)d>hf7AmA{@}Iu{yJ3B)i@znB&l6=G7$I!7Qg``RH_nRs(rd ztJH!1yDf*&c)^^-O=F|oif`xp3g?f-zHeWnlcwGLqKpgr(5X{!jx8P$auOk7u2~-i z6n{w-PTc*3M@%&p&O@mhU^!O?QQab&G>}Tnx+pTqjE3Xy(sLr^5c4w@R{r6=k7von z<+BLn&Cec->$$nX(|lY*QRPrzC~NSKqMDaqS#>Qg-Ae5IO_AJ&Kqb4NQGm$Y|Iv%Y$QOp+kJ1NthqB&Q^!Y%=|B;*=a7>cf|BlzHa;CF- zXPESBh4cxAjSedNc37ydw_us_ zYi~Jvzh%nS^=-)^HeF3Nr9RJ`WwH$Xc*6#piC!q(n*3;v&Nh`B^Qy@C%b6$zTw2nz z7a6vh?b9zrp}}j3mEEoQ!<>m~nm-PD{-$}<^H>RQJCATLU=}2|g(NQaeojZ+KsZb~ zoYFugl*zC4tOCeY zLuDO2o_m+{6DpL@D!g!l+>5?8bjg@3-s-VxN4to6{Hk}-uW!B*E!6`}3nRP|zvVeB zDN(WN!-x$9_)t=8yHBD9$nAjwN-303IEkuay3Ak#vmHui{lMS9e}oY36CF=c`*De1 zmt(T;**;q@)7KsFKFXt5E#{*r5)W;7C#E3mBZKR21ei+h>+5LuG>*c8PMgQbn7cns zN-NHSa1YFmR2Ju5MuKGKz70dYMMtG4?&yq%O_dq|MRusXIo(fAS)C@C?8t$<#t!h5 zVdy4XQhNl+AVgZzp3j3U45Pz&Uds)fDCZn$P0kH=A0umx; zN^auSpn}4v)w#8<;T?v+HQz}F7PLXEwT%E5R}tRU*6cXD83hg>Xtv-NNkG6Lov2+g9xO2zP`>C}7 zTtJfoLW4yx<$K)lhlPgA`{+x-&(M$r-!GGtR6%&Di8T@dG-3WK_}qp9nCV9`wkGZT z)FH%kV{#)JxF|Fcbg)t1a#K~D?iD+npGt(+&BjPL(=DSLk1xT5(^s^te zC~RF95OYDpI7mKpo zVFe*TK+Fr~KMiLfIX6ku1w#iSoGAyennN6Jj1~BYgB$LY6-dRY^RM$5Kz~j_(tn=~ z_!psgYe&Pt!ce`9VBi#|7_2N1jY|SH2dK)$4TsAP4CCU56JZB-aD}CKEaE z9k(c)G!syon~v9y9Nm^VQ`n=FhB_I1Ho+w9^45|aEAcF2?PzU!8gzD zTlIeR?AHG1uIlc4`<{F5pWA&F?00OE_>tdxn^M~(i%>zOHTqxUbJ*Y8Bq21LvXCbHsYR<@0DqjU-ff!L34-qhkoT7W@8C(Mm<4l zM1|i5u%1CRVs8=BnEgKK0VTyNh*!SlU~j{=Cn8^J>?;Q{raA=_2@%0|Zm-2}hw}!7 zf|ea50m2QnyQp3qs2=1NmCnBnl678{;vXg$a|QkY73m41^3rZPfi@hx9=B_q|dtwK?1@jHe@AT|N(qQDE)xD%-B$pGKIOJHx}b9&CV6_pKVED~D0 zPBxpl0z!2C!K*iJH2$_L*G&G;CpL=q<_IkQsQT@$-y={4)@^szB&Yo*vVtJG1pQ>0)hYl02&}tV@t~7rY=bv0RZqr z1V91!f43p7R$3meZl2s$t{&E0zRpe`Q`9y4Ut>j_Dm_NB-3ln*(h@i20_Sj|l$AiC z-mwI(n2q+zeeF*Hv(@afuiP7-?$3VDqhUzJs<3sc&v zPVN%}q8o?_=$TstlFB_`S$8BpUGrFJ$L~5- z+XyYHyy>g69=Vv36NU}D!-NxlQ;Ui(;vpM~(W0kG>gT-Ox85jnoo=z;D2ioN(v}SW z$k;NsD)f2y)Y!sDGUOGY>**i>j4)x-f&bCtt1x5S3c9U>AMPaost?iDz#u_Pz;2%@oY zV5Qqi3>z0a$u;oe;V^qVl%=urgOQOkTZ`|l>CES8p+Yf;lG^22w)dad`SVe`_@JYr zDYCw?qBYR8d_~^Lq;sKU+8+g5Uichy1e|cVG(HLAa6=W|l(vCci%7Uramo^}c9)vY znKFoYP?0W*J>%I8wXC95P|JNt{ydQ%w7M?Y`!avDpZ|kHV7~g4i*?Q|(mk;SlY1Ry zPLAPYHZ8!xn|n?<&xWm?IJ4|bzj8i%o;PTFXb^gowRr!*>W_Vp&Q$DU<&Vve{C5WHh->Ks{8VVt$LZ4Jd9B0x^S3B z>a8C%CqAH*UP+6kAm?QV<0h%f+ypVXrVh|TJjWBM~GPR!v47& z2VGD1+(M){iwN_W3`P~i>;(^w#L3O0N%k6w3L1yYs5V3#(@rkS#x2X{v_!Vr;kvhx z!1eY~&((rm(ME7WZilQA}QfNu`Mz)`qAtJ(B2@`uP2}J&hmXVJ`R>saC!i%L{W!=_JVC&1nu3fb*aV1pE zKl5=C!2J#|gv!Z;xOSe5uG#6fNj%YgP<_lFP?_Di#?5&j(A8shXBMJgpLbx(syWf= zcb3Y0*4kZ@xE>=tIK>;jC$BkfBh@pKG>kP!*v>7J#uuG422@ak+)_4;TSCx382GzW zs|&viV$J*0V=X4T_U=ngN|+*fr5cpbuX$Q?8$q#I9&vEGJ#kVEeTwN_6=+L9i7bmQ z{xE2`U&|wOgJ%cdXmZ*|-Xvm@eGBI+uE;m*{VqBed@{;JwD-Q%%K{6YdhMZm6%Tao zKMvP>Jm)+AE&`CcyH8p~Vx0#eG#@x1`$K9n#pb47H7K~fIvfSi#lc-T80s9c(;1K) zRVv3pk{2vG-8n$>{b(Qn;x}1QutW{g9$?bqmdPm^fTuDt(#M%`(@ zA*1k4@{z3+der42As*azz23jC{z%|n=o#MwKZb=Am2(u##}yJOK<#`<(cY29>0oUS zDxEb1X0jnPl#9?9D*g!|#T#go&in=U#hXdl*2X`E0?*BR?O29F_y`{L7(#<}&P3`0AEy<(wSV7<#lQ^n+Kb8#{T1Kp()!&6&4HPTh;~@ek=JbMLuG zZAiD~caxfvH}3sm88~tp-42#Pee7pTGUzBj{`iZL=gfOV?7zISAf+I-KJQTDLe#nS zY4te7Ux*?=wTNMK!zK%$5aZ-MwVc^%nnQcrVtC&4Jm+BJRq=Mku=ikIf*fkl(>-jM zq-Z^_)nLyjmJ^ntQ`E4?T8qHsjjmX`+&Y6?@(C~B;pOi4pFb?pO*Ee%-8Pb2I>$rE zh1j$Xhp6Y#_1-SVB>vd!-^Bg>b5}fC$T#g7arc_Bs#%Ocy`R1j1!E@H>b*n+_I+ih z`IM7X+_xJWhBo(wF?NCq850HSs7joz)121i+}Wn&WL*8BshM-87rydo-{RU?)vFe( zg;B&H(U^dWY1~=asX}WcTYJCRM8LVMRRpilGh0ko&U8Pi!B{vY_D|383*QG#h> zCD>^t3x9Kfz#?PHxYp(9e9oCP0^C8aY_Sv4U$@k)>-hw#fsZhH z^;@=z48AK{x;h1$deuJ+FyRtuoBn0tWDBaEqqonpu1lQ#!FwQk^xdTf>@R05e>wSg zdjAl}M9>y3m=;d=m)dLr-7KU3Qbv#OWMjUOZsxk4U>+KBr$qK;nez724vL6>48hTx zn%hmmmC5ao`R-Q!LHTCV=!;^Qe^RA_z`oE1ChGLTYC#xxjTo!VTJQQDxfRj)ca%JNrX26(#HTcpF{DU0Q*_~<*D0}%c z6G$YraZs9>_tOp_32Z2+eau$7(zrKpx+JH4($0Mi?wh3{e6kMPf?p&n_DJ09=0M{T zyCm#B&BnN&4sF?alxnJnI;;|o%=8E7IB;;KQd6D9jIlB2Zau%eXU?2>9$k{sK`kTfdTV_1%t){;YSct|7NSwV$8@Vs!x|PO=CP+r1yu`yb3bo~qD)G|U`TlwGLh zcLlA-_2&9!XT7OHvak#Mnh>&uwW{K=TrgwL^c}~0c{kOQZ*?H?>tscnLs5*jNxap9 z%Thb=Zjp>?)X!#WU%o){leSHy2Igg2;`N@$_>lMl^JryD_km@#6a@x}2D3a=X~A;| zZEhKcR5X5V!Zr0Vp>35ZIhGrKqzVD!J$J{Tm#zwI2)j=@d*&Ov;6D5yr~b5(p^V*T zdKv7u#O`;*UC?`Vt&fUVgnhhor=h>nTxmSDG7#l#CzGB10ZR~U*KE^h6~6>TUc}m0 zs+v-7UIGL~*cah%W?F0=&>zpCN7F7(I1}Q5 zZ_4hTfh1_J9wh)}8SOj+g#z_$g97(rdPx4wI-1zoo<~#NDBXHNq;7=4D`?L$hIOSO z^=PQ7$mVqIM-)%??FCSt*YPrQM5TMO4d1E`VtUa&Ar-`CSCi(Ml3GKZ+P9p1?_!FJ zEMJIJr%+34{kAljax0}-HZ88s}sTeMgc#s!E z%}tCVN1Ml}R+?{kS6uDPir}QMz)oTLaz^H})7=uZ+77XDA9qggiNdUPZV7h%)A#~5 zjf%A#yJlC3(f9zuH0DsXtG!jPeusPi>xK-G-#7Oln0PF#X+6l0V}#LytM z>h{>4b#;1d6xaT|>suh`2xguo%4Sw9i1iOB+brfA*Hk-? zCiwGkj28Sxe1$Kl$h&_?f$K+^_l&wSN9!-gVs(YUP9~n}7k=Wcw_Ez35E3szU_FH+ zbTv!doDt3u$TsJbscX_!v-`z`HUT%Q^A*O}qf&!L%O;($!Q<#nqcoFmTyZ!`aifZ$ zd^iAVOxsGrT)d%ex8dRT?wcZW-Ewd_+5%V-sM2WwS z&qE;y9@CS8D9k)lJD;WQ^*Bq{0U98zaP@7sr!pccokGo;Yq-k~6@r`i|;n#yvkUh6?5 zn*OaSopNfxLO@S$&4Qv`CXZhJGbuJQyMi-{j(8hQ zMq6x+o$`!wzu;{mgZ7Hmp6hG>ULDXWgS?0647dvD*$#?IWvm1;YVOvMsdd?@E*w(m zzy73Rnkt55?~2y{Hp8j;FiTozKY9sTB(+4)U7-kXwk8<*gG(@#tV^hjmyHqUz2OnV z?y^G=c}dZ@*XCaeogmokm0REKQ9@u{0I{T12$So|7=q@6dIqop@=w8>TGCd|z1vWwv#=Q_=~FMQH0fSGPvawrdw0)67bBekSR-2(_ty(uj6S{nD|0JwU;l*TuR|Ywe1u!_K2g*^ z2Z$}$%Rn+D)Wv)e7_2Qi|DZsNDlDZo$Z>MJ^b+Oc1)>gGOTf6D6*i}MP!aHP0XEr< ztRrtm{))ja!`a@Ye_pPC1Bd7CN`F@LX;S&#QrF7X1a$@gICm+Oz~25Dj>CC*JPhZVXm1Q$sFSv+ZTH@IJYa8ddTsVKis6!oTi08>)D<5ieXc%nqu)euE z*kHOM5LAkMjuNy&-S}%8+i4{;oKyVzsqnPbWen%BYsF{tR4hT#%Xx|dxHml2Hh23# z>(x{&^3-N4VyTBzP{xIL#!Gc@JKt%i??34^>!2{9)lL9>PkfJz@=ZgLy)K(zVUrze zkySz-9ylMe=7Ky7(uR`vb$$ozEX-;nwpfQO78|!qz4N>>c8t=u4_h?H?Yg1|#;W>q zL-ZOEtD_u(`F?UNRz2aPq^m9uTX)5fv!m3M5u#Dk_;AaJ9#M_y#DT=R#)JbuB(zA{ ztVJp%;+U9AT5UV8qj1luOo@+nDC|;M2h)Gpz!|W^yfoM9^L88I zSLHPKRPhUiRVoMxOv>rukDdolyvt%HMMG@RHfvDo#A0m~qwi^0o*c!Ixq9(G2sXT0B)2)(Rn}0!cFWGL`Wf2}9&BF^e zkVu)_@p-jlfj`I#&9GC6N@*o1aUl^j7&iKU8tRg0n2UL~spKYja>1Ac*6I;xa6%c3zkckw;7 z=e&`tl1zly8orPWAEivhYZUBL0dvF%&F@e+!idbmnoA)3Qw~un^BlRh^9NxvGRGK| z=&&#rJNYtEkxi&RJ+3@PMXI-moIh1x%jaVpVe=Czhkll<-CfE28z^31JEtO0dhKFN6NqhwT~%7;vEx zd@oWr{1I&kl!(bUD%2p=Z& z_m3coq^pCXIh(RTfGsQzBu|;1m_kXx9S-Rg-i(JC9QJ5j!{{jjpr3}HbEOd-&FSmk zEOe%)4|6loosD%uSUhMI6CUx+m4Dk;iu}>fad0WqxhY=XI1@+vq}6Z7ez6NYfE|} zdLvnI3}=*)rcT{m|Mtc1hqXm057$dhaA~V|dU$P6sshGXsELj)_4y$d4H?sBzt-;K zMtr`DroqDE%CY=*Z&qFH^U}Vs)q#JT?y~6;qSN@-#CSoUcw3)|+3t;(z;`(ixEkBd zSHfth!MOBzM^IaRhtayp>r*jsjkrLyB=E}V4X>+nRxF7mzH}1iDsZa8WYT1#?9uA{ z=^SjUyz6xZp(82vUQdlvR8_Ed-n&-6T%Nm_#l~&BfT`{bxIUG#-R{OMIY+K;l@nqZ zh1Cnsc08?`u<2Es@GQO$E{Tex*vb>IU=fS)^HPJrHKRvhGRBAkh7s zOH|959wpqYBFOLQGqCDLpp)VE`y*$KSf;+;`x+B}$oj*^Nm2R_3CcRBT5}ujgbVPd zsgXea`COLp0}!)kU~Dj+W@^+BD5+qWnw@IMZ}s^89Bh`XHxbxw83z9@SJnq;!xu$bni9a!jNiyZrBuZ*oe@H(aJ(cpoOZ4%@k< zW3?6R{r0X?&M!*(D&O7B*0z_mbL7 zB^P|{veE&IciH42uF@M_Nsr4)ybyv$kwq*o8U0u?Yw0wey>O{|QO>#)O5|c8)88Jk zOZip8>Se~an+N{D6GNt?9St0io0w;`vg~ht0kMJi@>2zgSHj2NUj{5kRv^mu(Iya_$-lK3_$budF6Xb7&A zTB5fLlg!*c`g4>_bbNK;602TqcQrA0L&PeU_dHR+6Q7YsIR&To8a9T#Q?RcaWlo!4 zy4c{-ujU{V6ln0kK@9Yec7!#G8zEWc$>#tN%!<5-R@o_;#&eUk)I$TBUg&W8Y9~4M zuLw*-M33EU`iRB$`_K|J7E+by|1irw=IVhoTM-s1;mEZx-@$5)dvR=1e-3{1Z?%>4#+4~}x3N88#& zS#T#k$~!SyFv@2LVwuk2P)9esM}n`LBX#Fbj`-!}f$BGx>KcQsi(~!=rWqGTKnOTSinclaL zo{%NI8FRn8QQ$q+S_R`{*VIT`Xp}9kKyKFVj zFoeXG0mV)PU$+DiP`U57iQ}J--`j|s9Vu7VE=2iff_JG`8XYC^x3yTx#&kxlqdruA z6JYLq@b&tR*j&zH#9FYL-i$0w8|A9M-HBAX5;9sRe^0_QBt-(X7O;x+$Ywdon(@gj z=v6{nH`%*Fyirp3>|{6-rKZ{f16lD(wFtioQAq+ObIDXQcnJAfT0R#hM6NkC_GX_3 zeo<8I^SS|9g6q;)x#{!Rb_cS~Z-}%P6Nni99g4&$T?tnw z@58jk!*tK4sUx5r%S@x8E}pZZZ*)UWsvKC8JJ@8KAneOfDdF~GZiw4>o_s20Z{6B{d(1xIFW;jX446*eXRCO0&@P(lf zlCXG%TG}6?J2v=j$UK9b+nN)?UpT(GZ!P8eD?`_PxfAZ90t#mOiceUF-4 z2tIe80LsG^EoWjRILwD1?!!ZGKu^6|gT`xFEr&Gfo{}i0A411$HEFK9^9stU!FV2g zOM@Fa+zhRsH^DcveQZP#`SxCO>DN}wK{k6C-7m4qjuPS#EHN~=(zmsZKWO+1H}~Yo z9tD22i?=diG?)c^kA$*|{wK~BC!<(jI&ns^=dacz(s}&v3;fAF)h9-chbg?@c>7?p zNxFX4QDf7v1rk%Ih63gG{Ne|Mb*gOO3lYbbejsRzM1uRWHT?qa;me|N@1oICgp5S1 z?dH(q?=F-er#NLSkq10?jBQb`p~nJSJu`dx!@|#i4~6S%*GNAW$(>4Rwp zr`aO@dVSAd7d206!lj)zVSlx!NKQ@a!^U9!IL*HJ2Mv$;tbcj$bKJJ2xZ-HxEYh9- zcP6N3+0`KrE~C6A%H-2*rc?1sLYv}j(crln`>^cT9|q$=ah1A48%+M}hDXQjc9TRd z^ap-pJEU$T3WGhF9pd{@-=c;l{b0&pK(fFFS-gN&7^5`z3_wWG1cY_dbLpm$v#$fN z4am2!3&3pJ5p0P|Yg&6NIMJjxXmIam`x{z(cT`x{r1zo()S3*Cs1hIMxH$`ZXAT)? z%F5q$u{RbSaR>Xh#H>(m2~Vtd!XeCO;1Mt1MJ#ZX`5dC3k(*djOsNz3+j?loo}`p_ z$QLO;I!kd4S)zJj-)ux!m=H%!b}GNGsN8kqu;$(5uCG9Uzp=?1WfXHU#<8=M2*bkR zO$)4-abmvTwt4|SO_cWh4xV$43dP z;l)8nhIR4sqQg1^^?3ksC`pVR*ZTfPbm diff --git a/TSG发布版本更新记录/TSG-22.05/job/mmdb-perl-built-in.pl b/TSG发布版本更新记录/TSG-22.05/job/mmdb-perl-built-in.pl new file mode 100644 index 0000000..08cceb5 --- /dev/null +++ b/TSG发布版本更新记录/TSG-22.05/job/mmdb-perl-built-in.pl @@ -0,0 +1,209 @@ +use strict; #use this all times +use warnings; #this too - helps a lot! +use JSON; +use MaxMind::DB::Writer::Tree; +use Getopt::Long; +use DBI; +use utf8; +use LWP::UserAgent; +binmode(STDIN,":encoding(gbk)"); + +###################数据库连接信息################### +my $url="http://{{ cm_mariadb_host }}:8080/v1/geolocation/dict/detail"; +my $token="ed04b942-7df4-4e3d-b9a9-a881ca98a867"; + +my $help = 0; +my $outfileV6 = 'ip_v6_built_in.mmdb'; +my $outfileV4 = 'ip_v4_built_in.mmdb'; + +GetOptions("db=s" => \$outfileV6, 'help|?' => \$help, ) +or &help(); + +GetOptions("db=s" => \$outfileV4, 'help|?' => \$help, ) +or &help(); + +&help() if $help; +my %types = ( + AREA_CODE => 'utf8_string', + ASN => 'utf8_string', + ISP => 'utf8_string', + LATITUDE => 'utf8_string', + LONGITUDE => 'utf8_string', + COUNTRY => 'utf8_string', + SUPER_ADMINISTRATIVE_AREA => 'utf8_string', + ADMINISTRATIVE_AREA => 'utf8_string', + SUB_ADMINISTRATIVE_AREA => 'utf8_string', + LOCALITY => 'utf8_string', + DEPENDENT_LOCALITY => 'utf8_string', + DOUBLE_DEPENDENT_LOCALITY => 'utf8_string', +); + +# V6databse info +my $treeV6 = MaxMind::DB::Writer::Tree->new( + ip_version => 6, + record_size => 24, + database_type => 'IPLOCATOR', + languages => ['en'], + description => { en => 'My database of IP data' }, + map_key_type_callback => sub { $types{ $_[0] } }, + remove_reserved_networks => 0, +); +# V4databse info +my $treeV4 = MaxMind::DB::Writer::Tree->new( + ip_version => 4, + record_size => 24, + database_type => 'IPLOCATOR', + languages => ['en'], + description => { en => 'My database of IP data' }, + map_key_type_callback => sub { $types{ $_[0] } }, + remove_reserved_networks => 0, +); +$treeV4->insert_range( + "0.0.0.0", + "0.0.0.0", + { + AREA_CODE => ' ', + ASN => ' ', + ISP => ' ', + LATITUDE => '00', + LONGITUDE => '00', + COUNTRY => changeSplit('aa'), + SUPER_ADMINISTRATIVE_AREA => changeSplit('aa'), + ADMINISTRATIVE_AREA => changeSplit('aa'), + SUB_ADMINISTRATIVE_AREA => changeSplit('aa'), + LOCALITY => changeSplit('aa'), + DEPENDENT_LOCALITY => changeSplit('aa'), + DOUBLE_DEPENDENT_LOCALITY => changeSplit('aa'), + }, +); + + +$treeV6->insert_range( + "0000:0000:0000:0000:0000:0000:0000:0000", + "0000:0000:0000:0000:0000:0000:0000:0000", + { + AREA_CODE => ' ', + ASN => ' ', + ISP => ' ', + LATITUDE => '00', + LONGITUDE => '00', + COUNTRY => changeSplit('aa'), + SUPER_ADMINISTRATIVE_AREA => changeSplit('aa'), + ADMINISTRATIVE_AREA => changeSplit('aa'), + SUB_ADMINISTRATIVE_AREA => changeSplit('aa'), + LOCALITY => changeSplit('aa'), + DEPENDENT_LOCALITY => changeSplit('aa'), + DOUBLE_DEPENDENT_LOCALITY => changeSplit('aa'), + }, +); +my $sum = 0; +my $ua = new LWP::UserAgent; +#提取API接口中的信息,放到一个数组中 +my @dataList; +while(1==1){ +my $request = new HTTP::Request("GET", "$url?isInitialize=1&pageSize=10000&pageNo=$sum"); +$request->header('Authorization' => 'ed04b942-7df4-4e3d-b9a9-a881ca98a867'); +my $response = $ua->request($request); +my $json = new JSON; +my $obj = $json->decode($response->content); +my $list=$obj->{"data"}->{"list"}; +my $JSON =JSON->new->allow_nonref; +my $data = $JSON->encode($list); +my $arraydata=decode_json($data); +$sum+=1; +foreach my $ref (@$arraydata) { + if(($ref->{'addrType'}) == 4){ + $treeV4->insert_range( + $ref->{'startIp'}, + $ref->{'endIp'}, + { + AREA_CODE => isNotBlank($ref->{'areacode'}), + ASN => isNotBlank($ref->{'asnumber'}), + ISP => isNotBlank($ref->{'isp'}), + LATITUDE => isNotBlank($ref->{'latitude'}), + LONGITUDE => isNotBlank($ref->{'longitude'}), + COUNTRY => changeSplit(isNotBlank($ref->{'country'})), + SUPER_ADMINISTRATIVE_AREA => changeSplit(isNotBlank($ref->{'superAdministrativeArea'})), + ADMINISTRATIVE_AREA => changeSplit(isNotBlank($ref->{'administrativeArea'})), + SUB_ADMINISTRATIVE_AREA => changeSplit(isNotBlank($ref->{'subAdministrativeArea'})), + LOCALITY => changeSplit(isNotBlank($ref->{'locality'})), + DEPENDENT_LOCALITY => changeSplit(isNotBlank($ref->{'dependentLocality'})), + DOUBLE_DEPENDENT_LOCALITY => changeSplit(isNotBlank($ref->{'doubleDependentLocality'})), + }, + ); + }elsif (($ref->{'addrType'}) == 6) { + $treeV6->insert_range( + $ref->{'startIp'}, + $ref->{'endIp'}, + { + AREA_CODE => isNotBlank($ref->{'areacode'}), + ASN => isNotBlank($ref->{'asnumber'}), + ISP => isNotBlank($ref->{'isp'}), + LATITUDE => isNotBlank($ref->{'latitude'}), + LONGITUDE => isNotBlank($ref->{'longitude'}), + COUNTRY => changeSplit(isNotBlank($ref->{'country'})), + SUPER_ADMINISTRATIVE_AREA => changeSplit(isNotBlank($ref->{'superAdministrativeArea'})), + ADMINISTRATIVE_AREA => changeSplit(isNotBlank($ref->{'administrativeArea'})), + SUB_ADMINISTRATIVE_AREA => changeSplit(isNotBlank($ref->{'subAdministrativeArea'})), + LOCALITY => changeSplit(isNotBlank($ref->{'locality'})), + DEPENDENT_LOCALITY => changeSplit(isNotBlank($ref->{'dependentLocality'})), + DOUBLE_DEPENDENT_LOCALITY => changeSplit(isNotBlank($ref->{'doubleDependentLocality'})), + }, + ); + } + } +if(@$arraydata<10000){ + last; + } +} +open my $fhV6, '>:raw', $outfileV6; +$treeV6->write_tree($fhV6); + +open my $fhV4, '>:raw', $outfileV4; +$treeV4->write_tree($fhV4); + +sub change { + my $n = scalar(@_); + my $i = $_[0]; + + my $w = ($i / 16777216) % 256; + my $x = ($i / 65536) % 256; + my $y = ($i / 256) % 256; + my $z = ($i) % 256; + + return "$w.$x.$y.$z" +} + +sub changeSplit { + my $n = scalar(@_); + my $i = $_[0]; + $i =~ s/\\b/ /g; + + return "$i" +} + +sub isNotBlank { + my $tmp = $_[1]; + + if(!$tmp) { + return " " + }else{ + return "$tmp" + } +} + + +sub help { + print "Usage: $0 -f file.json -d my-ip-data.mmdb\n"; + print 'Example json: +{ + "records": [ + { + "address": "6.6.6.6/28", + "service_area": "LAX" + } + ] +}' . "\n"; + exit; +}; + diff --git a/TSG发布版本更新记录/TSG-22.05/job/mmdb-perl-user-defined.pl b/TSG发布版本更新记录/TSG-22.05/job/mmdb-perl-user-defined.pl new file mode 100644 index 0000000..5e8cdd8 --- /dev/null +++ b/TSG发布版本更新记录/TSG-22.05/job/mmdb-perl-user-defined.pl @@ -0,0 +1,209 @@ +use strict; #use this all times +use warnings; #this too - helps a lot! +use JSON; +use MaxMind::DB::Writer::Tree; +use Getopt::Long; +use DBI; +use utf8; +use LWP::UserAgent; +binmode(STDIN,":encoding(gbk)"); + +###################数据库连接信息################### +my $url="http://{{ cm_mariadb_host }}:8080/v1/geolocation/dict/detail"; +my $token="ed04b942-7df4-4e3d-b9a9-a881ca98a867"; + +my $help = 0; +my $outfileV6 = 'ip_v6_user_defined.mmdb'; +my $outfileV4 = 'ip_v4_user_defined.mmdb'; + +GetOptions("db=s" => \$outfileV6, 'help|?' => \$help, ) +or &help(); + +GetOptions("db=s" => \$outfileV4, 'help|?' => \$help, ) +or &help(); + +&help() if $help; +my %types = ( + AREA_CODE => 'utf8_string', + ASN => 'utf8_string', + ISP => 'utf8_string', + LATITUDE => 'utf8_string', + LONGITUDE => 'utf8_string', + COUNTRY => 'utf8_string', + SUPER_ADMINISTRATIVE_AREA => 'utf8_string', + ADMINISTRATIVE_AREA => 'utf8_string', + SUB_ADMINISTRATIVE_AREA => 'utf8_string', + LOCALITY => 'utf8_string', + DEPENDENT_LOCALITY => 'utf8_string', + DOUBLE_DEPENDENT_LOCALITY => 'utf8_string', +); + +# V6databse info + my $treeV6 = MaxMind::DB::Writer::Tree->new( + ip_version => 6, + record_size => 24, + database_type => 'IPLOCATOR', + languages => ['en'], + description => { en => 'My database of IP data' }, + map_key_type_callback => sub { $types{ $_[0] } }, + remove_reserved_networks => 0, +); +# V4databse info + my $treeV4 = MaxMind::DB::Writer::Tree->new( + ip_version => 4, + record_size => 24, + database_type => 'IPLOCATOR', + languages => ['en'], + description => { en => 'My database of IP data' }, + map_key_type_callback => sub { $types{ $_[0] } }, + remove_reserved_networks => 0, +); +$treeV4->insert_range( + "0.0.0.0", + "0.0.0.0", + { + AREA_CODE => ' ', + ASN => ' ', + ISP => ' ', + LATITUDE => '00', + LONGITUDE => '00', + COUNTRY => changeSplit('aa'), + SUPER_ADMINISTRATIVE_AREA => changeSplit('aa'), + ADMINISTRATIVE_AREA => changeSplit('aa'), + SUB_ADMINISTRATIVE_AREA => changeSplit('aa'), + LOCALITY => changeSplit('aa'), + DEPENDENT_LOCALITY => changeSplit('aa'), + DOUBLE_DEPENDENT_LOCALITY => changeSplit('aa'), + }, +); + + +$treeV6->insert_range( + "0000:0000:0000:0000:0000:0000:0000:0000", + "0000:0000:0000:0000:0000:0000:0000:0000", + { + AREA_CODE => ' ', + ASN => ' ', + ISP => ' ', + LATITUDE => '00', + LONGITUDE => '00', + COUNTRY => changeSplit('aa'), + SUPER_ADMINISTRATIVE_AREA => changeSplit('aa'), + ADMINISTRATIVE_AREA => changeSplit('aa'), + SUB_ADMINISTRATIVE_AREA => changeSplit('aa'), + LOCALITY => changeSplit('aa'), + DEPENDENT_LOCALITY => changeSplit('aa'), + DOUBLE_DEPENDENT_LOCALITY => changeSplit('aa'), + }, +); + +my $sum = 0; +my $ua = new LWP::UserAgent; +#提取API接口中的信息,放到一个数组中 +my @dataList; +while(1==1){ +my $request = new HTTP::Request("GET", "$url?isInitialize=0&pageSize=10000&pageNo=$sum"); +$request->header('Authorization' => 'ed04b942-7df4-4e3d-b9a9-a881ca98a867'); +my $response = $ua->request($request); +my $json = new JSON; +my $obj = $json->decode($response->content); +my $list=$obj->{"data"}->{"list"}; +my $JSON =JSON->new->allow_nonref; +my $data = $JSON->encode($list); +my $arraydata=decode_json($data); +$sum+=1; +foreach my $ref (@$arraydata) { + if(($ref->{'addrType'}) == 4){ + $treeV4->insert_range( + $ref->{'startIp'}, + $ref->{'endIp'}, + { + AREA_CODE => isNotBlank($ref->{'areacode'}), + ASN => isNotBlank($ref->{'asnumber'}), + ISP => isNotBlank($ref->{'isp'}), + LATITUDE => isNotBlank($ref->{'latitude'}), + LONGITUDE => isNotBlank($ref->{'longitude'}), + COUNTRY => changeSplit(isNotBlank($ref->{'country'})), + SUPER_ADMINISTRATIVE_AREA => changeSplit(isNotBlank($ref->{'superAdministrativeArea'})), + ADMINISTRATIVE_AREA => changeSplit(isNotBlank($ref->{'administrativeArea'})), + SUB_ADMINISTRATIVE_AREA => changeSplit(isNotBlank($ref->{'subAdministrativeArea'})), + LOCALITY => changeSplit(isNotBlank($ref->{'locality'})), + DEPENDENT_LOCALITY => changeSplit(isNotBlank($ref->{'dependentLocality'})), + DOUBLE_DEPENDENT_LOCALITY => changeSplit(isNotBlank($ref->{'doubleDependentLocality'})), + }, + ); + }elsif (($ref->{'addrType'}) == 6) { + $treeV6->insert_range( + $ref->{'startIp'}, + $ref->{'endIp'}, + { + AREA_CODE => isNotBlank($ref->{'areacode'}), + ASN => isNotBlank($ref->{'asnumber'}), + ISP => isNotBlank($ref->{'isp'}), + LATITUDE => isNotBlank($ref->{'latitude'}), + LONGITUDE => isNotBlank($ref->{'longitude'}), + COUNTRY => changeSplit(isNotBlank($ref->{'country'})), + SUPER_ADMINISTRATIVE_AREA => changeSplit(isNotBlank($ref->{'superAdministrativeArea'})), + ADMINISTRATIVE_AREA => changeSplit(isNotBlank($ref->{'administrativeArea'})), + SUB_ADMINISTRATIVE_AREA => changeSplit(isNotBlank($ref->{'subAdministrativeArea'})), + LOCALITY => changeSplit(isNotBlank($ref->{'locality'})), + DEPENDENT_LOCALITY => changeSplit(isNotBlank($ref->{'dependentLocality'})), + DOUBLE_DEPENDENT_LOCALITY => changeSplit(isNotBlank($ref->{'doubleDependentLocality'})), + }, + ); + } + } +if(@$arraydata<10000){ + last; + } +} +open my $fhV6, '>:raw', $outfileV6; +$treeV6->write_tree($fhV6); + +open my $fhV4, '>:raw', $outfileV4; +$treeV4->write_tree($fhV4); + +sub change { + my $n = scalar(@_); + my $i = $_[0]; + + my $w = ($i / 16777216) % 256; + my $x = ($i / 65536) % 256; + my $y = ($i / 256) % 256; + my $z = ($i) % 256; + + return "$w.$x.$y.$z" +} + +sub changeSplit { + my $n = scalar(@_); + my $i = $_[0]; + $i =~ s/\\b/ /g; + + return "$i" +} + +sub isNotBlank { + my $tmp = $_[1]; + + if(!$tmp) { + return " " + }else{ + return "$tmp" + } +} + +sub help { + print "Usage: $0 -f file.json -d my-ip-data.mmdb\n"; + print 'Example json: +{ + "records": [ + { + "address": "6.6.6.6/28", + "service_area": "LAX" + } + ] +}' . "\n"; + exit; +}; +