From b670a1e22cb8922a39daf9c63fb0806ca9772282 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 25 Sep 2023 10:25:05 -0400 Subject: [PATCH 001/271] Fixes #13871: Fix rack filtering for empty location during device bulk import --- netbox/dcim/forms/bulk_import.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 74af0696b..70aceaa49 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -549,9 +549,9 @@ class DeviceImportForm(BaseDeviceImportForm): params = { f"site__{self.fields['site'].to_field_name}": data.get('site'), } - if 'location' in data: + if location := data.get('location'): params.update({ - f"location__{self.fields['location'].to_field_name}": data.get('location'), + f"location__{self.fields['location'].to_field_name}": location, }) self.fields['rack'].queryset = self.fields['rack'].queryset.filter(**params) From df46198b914faeaf5bd91fd9fc4c17f90be9129b Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Mon, 25 Sep 2023 09:01:33 -0700 Subject: [PATCH 002/271] 13839 change color and spacing on alert code block (#13857) * 13839 change color and spacing on alert code block * 13839 update review changes --- netbox/project-static/dist/netbox-dark.css | Bin 375591 -> 375651 bytes netbox/project-static/dist/netbox-light.css | Bin 232798 -> 232824 bytes netbox/project-static/dist/netbox-print.css | Bin 727883 -> 728021 bytes netbox/project-static/styles/netbox.scss | 6 ++++++ netbox/project-static/styles/theme-dark.scss | 2 +- 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/netbox/project-static/dist/netbox-dark.css b/netbox/project-static/dist/netbox-dark.css index 2d7142bc6b6da7f32935de02c63becb00dc33c22..84d1600e3732b880c7dc31223984e389245aa59e 100644 GIT binary patch delta 79 zcmZ4fP3-YEu?>^N*itQ1lT*{C3*2N9ZC)$ZzE+G8h?#(x8Hic7uN7l`={5a9CKDT* gLUMjeYW4KSI3|PX|9e?krza$_%5LA0$eJGs0OHCX1ONa4 delta 54 zcmaF-O>Fr$u?>^NCMOuMO&7SyB-*@ItbMH*BM>tIF*6XeY+ozJ`qFFq^dwfL?OzgE G^CJOip%rxi diff --git a/netbox/project-static/dist/netbox-light.css b/netbox/project-static/dist/netbox-light.css index ffdd83285e235e4f723f8f46937a2c0ab5033570..9048a328688ff2e459656c0c6e1a0613e25360fd 100644 GIT binary patch delta 52 zcmcaNi|@xQzJ?aY7N#xCR{|yV5_3|EN)(dwQ&Ovw^KF7M2#)7Pc1l7LFFqEnHPu(*xeHuuWdCrZGL>37DZY{lEtn bUKWMq{FLdrhgp=Tf7s8(y1hP&>&ylK{16;K delta 35 rcmcb*UFY;RorV_17N!>F7M2#)7Pc1l7LFFqEnHPu+gY-?E^Yt-^p6b+ diff --git a/netbox/project-static/styles/netbox.scss b/netbox/project-static/styles/netbox.scss index 94fddc32c..a38633b5c 100644 --- a/netbox/project-static/styles/netbox.scss +++ b/netbox/project-static/styles/netbox.scss @@ -167,6 +167,12 @@ table td > .progress { } } +.alert { + code { + color: $gray-600; + } +} + span.profile-button .dropdown-menu { right: 0; left: auto; diff --git a/netbox/project-static/styles/theme-dark.scss b/netbox/project-static/styles/theme-dark.scss index 2d04b44e3..4bbe5cea5 100644 --- a/netbox/project-static/styles/theme-dark.scss +++ b/netbox/project-static/styles/theme-dark.scss @@ -282,7 +282,7 @@ $btn-close-white-filter: invert(1) grayscale(100%) brightness(200%); $btn-close-bg: url("data:image/svg+xml,"); // Code -$code-color: $gray-600; +$code-color: $gray-200; $kbd-color: $white; $kbd-bg: $gray-300; $pre-color: null; From a0e5e69283ef634ef6579e997814212c99c69c85 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 25 Sep 2023 12:30:50 -0400 Subject: [PATCH 003/271] #13887: Rebuild static assets --- netbox/project-static/dist/graphiql.css | Bin 29136 -> 27375 bytes netbox/project-static/dist/graphiql.js | Bin 1037991 -> 978737 bytes netbox/project-static/dist/graphiql.js.map | Bin 975440 -> 929453 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/netbox/project-static/dist/graphiql.css b/netbox/project-static/dist/graphiql.css index 267856f34593aa2e252a73f63eca1604674b9986..a20e480d3e975f86c6e9932f5dc3f372cb9d185e 100644 GIT binary patch delta 266 zcmcccnDPBp#tnU}j82pLS!ICa8rFT253`AFp1}5%b@ODNsfFeM}(6u1v!b8R+)J@nR%&`AL}-C9O~*Mu zCDk{xs3^Zkp|~J1uUe}twWuUBIWb2!F()%U&q|>rwW35fDZiv7KX)^)U56Z!H~J4eJgCL{(XSQtQ_SP%;v0}L=RfLIv#TM!cxXUA@n79?by<$Hd2?|naa-`^%)e@Z;r zNG5c+n>-@kkCV@n+7e!s;p^EEe=YSh*;g=@WKXWS*jc2@mS69El!6!8-SGTC3eFD> z!pVbu{$&5NeM2kQrC7I!OsbSKSLT$92`8((3F+aZX<4_Jaa}W*#avbF*MK)Y15^KA zRlo+PE2P<4FoqB$E@wtK*1hH;p|wS>P8Xe3O~=Odn#<~TRi;b0M&Lo$D4a5m1-l;- z*-eLelv8G_F0pX1BODmc!Wkob^;+HI)NIHGvpKQ3YKRwcH3wI#)UL^#IV#$mxnaq& zs2KmZh{;uDT129L6okeje4<@62WxvX=d55|09VtQTP1=Q=ExpzSVXm%P2#A|IA?O|TmXS)~H!gj>_` zL~(j1ACJOpF5e0&A{Y%Nmuo|01f(vA4q|Qovr4IyFGgdl3KCVK(NQIkSrav+f?+X_ zG^^BeEZk739YBa(RChgLBZtvYvKF;1Lg9BMb7Bd*HEPSDL~WX>C1+I%=8+Zw8Ffz$ zx!WIe7Zrw&nM`&QYTONTut9kPo~E+qR+FkuOy&k&Z8>T5a&cCf8P)#UyD5_78!ZdZ zBBX_LkKQDz5*T{Z@4`YzFKHn4NK=KjTH6IyL)B0|cnYWjx6RB{TY7YiwxsIFSBgRY zZjmnw+c(9@k;eXUF1C|wg?hx^Z-Y^6XBiJ=5l$-AH2Ap=-G_<4=>GirA5sS;4`qC>4!VD0sruocfEfADqZ?W diff --git a/netbox/project-static/dist/graphiql.js b/netbox/project-static/dist/graphiql.js index 1b6949d02887e5df5e07862773e2e325fe9550d7..0d4b3288bc7767a5eff23734750948eae8e87185 100644 GIT binary patch literal 978737 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 %~7`a){CWLPwb=K`At=Mlv}x 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%0DE}yA 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

K zo&Eq_ljvC23v4Wul^e2ZyjmxZio>R%b$sMa?BlHjWk;${P&sa$5|9_azTbMob41hc z2Pc8n8*3RPmx8~=w;9qZ&;4BeCYLJ$`TqvWAFlPedyD*({R~A{S4q5J ztS2eXelGUvo9auKVcujfqh`<{W186p*3lXVBtU;dFdc<)V%0b1Kc6bhJFEE~egja8 ztVgV})rk+q>U1Ako%*O#KXKVC9l^`V&L^Hnorwb42nrQ<)FG=hhG8+P+5*(0qoTyS zyi*9t5aeWq9zC)jZzkG!Y2UrMBa`@`Kc15=`AX@Hs}&Ok*C#yh5f}N}cGah)5U;@~pCx+O zQL=>+L~K5`e@-fM6g+xp^CD>9d>WiIUe*U8*;I2}i#-wp}{%S=-4TAH-oNf>$wvq_DuT zorfj^j^*<)%a4#Nh@tE@&U+Kn+TAFd4%z(Qh(IYFu|9E)fM`m6uYha$-<)d^>XiJQO8MVeX~=4gN@GO0Y{nh zV|m`$WH^ugf~Uq~3^4)gQPr4w^^}leXxRu&#YLNp@;ZAEDL$;8oue9!6_qGWD{aO~ zr!rLVl)hwi-U4vmZJ!Taeaa}VpN@VT!xgLqITo^F6VZg7u-x-z5(>-H4-|Q#(R|{w zAT(W=sn1I6P-g@uI?i?!~UlM$GGkzH-l+2$QRKZCRWnkN~1PmZq&&I zW++ftZVDr`JF9cS20BZ4JN7+1Nr5`#(scSN(1u8Oc%`|QNJFWtkjZ256mOJn1~o)yn7vI#IriQD^t0BR@+1n&&+;T5Wc+ zo6*ULOWP$eo?%Bng0$X;0Zg##{w&h5RX4ejBC4^*gf~0ChB-zk6-_RH@(oumFr109 zFtminj9EoVHVinB1p8gAU+doWbN&7%C~*HTckkNPMv|lre}48?$hBOI)GlN2?CkT7 z=rRii+t`4y!EPJO&;kjgMyRk#VAG)g{@!;)p6VbW+}*o-J=gS@QdU+TA|oRs0qM&S(Hp$h47J*!Fd2jv7rH+xymAM8$lD*KDe@!q z!HM-dg>hkXSCl#mlP4+b;fUqSa0Yg60rsvEdkb=SMdL!DUxRmJ*P!y8wMS}jn!c;( z)C>PByZ5jCKsLt?M79Um`|-#Psg=*YvEFWiVqj&*@3nGcleSw`+tu4oWQyYm0K6A- zgH&`16va&#vw^wax&()2(+JpJKS z1a1kU7K>t$J66-8^*O3Azk$i|#D`nH3$+%MpeJkJVJ4S3y2SmCwM zDyPMn$Oq5o1UP^hfXk`E4HW0+n?nvTLw02-kLY@=LW|^-f@#bB;2z9U4m-?j^4OtM z1Ni;f&(n+3{C^v3-U4g9MqIGQ|MXb%;ts4S5)gH)x`Tkg5)aXm5tPXxLP$Wi(&7Ig z4KWkQBgAwx#7*n2-R~-np&dpDv0#<>vf5ZoAUk01%~jbG&i~IdQyVINZ}BYFqkU4qh-5Z|wt8 zBSI_IXnxhd48HCR3w{GUawa7Ll3a<0N*HA(Fk;xQe~JMXNp&m-dh$v09xF_i9d*l+ zS2mjSHmy5{DKE&dp`dAx_ZdfPvDG}|0H>~%`fqc6Uq?Iu{X)7$qEpOnrLhFkoPeQ0 zKq&tf%`}>t=NV}_&`FW6&h%wzpuBe^GNIBd7?}2vxD{O%I|FUUcc*6 z4aI<0z<~7xKm!6uIZ*OP*B+uIuHx9Gf7J-Of#Sck=)?_2`0bjn=a(Exo?xQk_EE(7 zguovmioj67*SEK*nn$;MZSfHc>-&l}uGf4xY!%%UyR6beR_mwu#cTc-m=v~a!?dPb%2x60P&UW#C)*=9k0AP_+Z=h?V?Y-qZiLO0 z8`9Dn^@UNkUvgbFnub0dN{A`gaT!n?W{4++pln9HG$r)Ijz_WSP6b%oHaUIJRE%H; zh*}ljz%-y4Ov!XA>m&n#n=OQ{FtUMxE0eohkm+wY?c~ryLFi#5Bw0l4+&DrcKQ)$C zl21(#Q|Y9SrCCQf!}wM5$)IpJmHm|ikHV#OU2oSy;}kAys|S|6eGM~~+GWzjZ7M z;5%)^pag9Ecf@iPiQ*Ii5%e@zE&Eu*;in|(l|U8dKA;?jy!P_$`b@b3>t+%nVf@K~ z7iX7z_01Yp^HUt6pNbrWtyrQ=;;VAjsedXHtp=JY*Ef?bNR+ZUP#IuEsblL*<4wzP zKm)IYrNAL8%A9o>1tJEn=m8kNnma7@+*m|u0X+LFbD^AoraA`+jM6~B?bx%~S+ldm zRmT-KDn~}VccXE2fh*O$vorKnwFoyZ|HKpKxAAk7R)W@_6w3#BVS?SX7Ag3Frk>lhI6q zUv4DDo#W1fG8J;nuAWon1B&#>vhwDP;=v?3l2?fsuze!V#$eKE3J#<-Pb2UN3dJJE zzY-)TX?|c?UFvGUb><~;ubd>#P?m|aRL+4ih84RP*T-R(UBK#*B`fw6T+uWx;R+Nn zH$NstQaHjGR_zBNt`R0`9A3ykILMEK>?e)C89=oXa%PnKpRoA@XpMskss#|qpD-0j z=`q=ICwUlIbTW{1u!2KT`6Mt~(?fJTJuv5hS@X$#65Ymj7GB!4mI5p&*R!I)G7=Vc zQud5QrlqQm{v;UWCux?o>cB0GRL^4Zm2d+!x2_P^$5HEix8vsWgSc;-D^iZ1(i4ejS>^ANpt017O>;Y zFDN8d*&+QmkozI;9qKj0B1I%~XUV63<;98LCJf&Dz8D7q%Uj*gS7p*fME-3pl-4cF z7R(PRE$(#QlZk$~!v)ZppndqCo-x#c29TgfY8eFyav2B#6p%GzIQK>ri+4IZ3N)sy z>+#@XI39_uWnLbc;~s?Vmyp83Okmxy-8lZpE#B9}|4tkU%tLIis!c1yEw5AIXaYzg z^GIR8!0)xZQ|JuqFy>VOW47nEd#!GtTPuk!_{dIZqD_C*HdC`BRGU5pxh=)*PNYHJ z;F2=+pgAZkq`pYXY=ObB<)M0Ml1uHL#*F zUqV=}%+VRVV}MEXPb7S?gM!J>5Jv35xJ-!$<7Q!K+hWxu_N@qya+ok zi#D+Em&e0&ko*UJOIVlWA9(s;yv~#VWHsd3$&&wzr*({CaKcdh;sz-}c9MVMg_Qy( z3-ml>to&qwX1(J2o-EL+cMX!hWP#lxo*vk$cCx@eclzCniw>%@TlM%@V5f2(FR;^h zos$ljCv>{NUTIkkdFBGUWt*Fw^CSFz!j5G^@P$vFuyaVaFt_B1^nOJjfG6z!%>@LG zobnU)zYFz@^YTuf`~z^`Ec;nIq=3zxaq*^)G>iQTtWQ8>8IPGNZH(86aO=+DTm80W zd5eX<{nb+Yf#EXJ&(~MkXnus&dbw2Uo82xnYp)9M+_mOy=9IN2f-AA=pFo(5R^(p( zC+i{Fi=Li)9ecw#UTNe0x9KAwGus||@4R<>0KTBqPxO6ZqT6$=Y(0}5(rW*9nGM(b z^aaEw#awzqC1w#m#G7Fs$R7TeW=6%0Gn+e9Xkz36lywOb5q^@ z_TPBg_M%(DiVeoBFo6eTMtSrIU;Eh&3Iry=6U@$_h#Ek?3Ry7#Qi5aT`>5#FcXc_T zE9wkQXE0tm&zi4pZ)pOYA!?{@PN)(d;4;6b8K0pr0twmR2>sT0cXro*ZN-}I z)gSMF{`~7the)^l`JmqT_lKV!%{@3^sGQHAXJ(<`*_Ke-{#?7;1=*g+SmDw+vJQ;! zr~`Lo!zvVt!}Em9>{c;kg+PGEoQq-M=07uj{v}ifv}HW`!;ZcUIKo7AO{ZR-Um0ez zH7FHfE`b?23=K@}Sn7&-#VfVjb@+XIE5yPShwA zEE!YYSFsgT2wA`-qiNq1a6Bcka3@LN!y?0|dg1YX=Z;Z9JXSS0L2Y?MS+6dPkBvo#l0m3>u{yTSdIMMcxeFT-9iH5($ z79ZHI(in;ButT_1g;x={RK4(UIVr#;;A!4L5honYFSKDy{to;;VNdopmJ9GAT~)sE zeO(s%Dq@Dh|3>ZQUpcEvK*#uv2mp;4BemmsFkDs+u6kg8P%jFDvV0L37Y%VJAYdpv ziBu$9-8S+i;ocw|ow9CZtqc!H*2*z!eiIOBTMHQJWjm8;Qc2M<%OW6L>Y37T@X3Q5sSSN^a~8vo^Qx9T0R<)YoB@3A@T0y)sE0D_olFE`MY|yDxiDyO#XUal_S(3^+}DS8 zJ%7$~NP5N_lB3iHMTT=0kouqb5uzNj5uHzPj)shc;X!RpL?n}7i}~8#n!4@7G3qC7 zo>mfkds{Szw^fYM68U zdDju!`=HK1OIT?~{Ui~goBoo%=f18L=F)t*{{WL)2Jtiv&0&W4N!Rus zgA37(R0Fd)Dwr?wa6B(;Ac_L6Qt*v(ds@C6rgUdI7Wdh6y>HmIgP?D+NqrZ=8{gC0 z!iojQu)U3vPLi2vyC7T{_%gToY$_^oSm^hz6VdR5r8t#*96C`n1ZTDPIvW!l$TLH- zI|I%YyUPzLJ_Dbt+al#C{FcbGyKp|hYjRo2^4pCOjM0Az_rP5FdDkukZLdr3+`


6gX$Q;tATk-OP03&DiYl2F^(&|gbb3Bl+K93*KgmI*1S z#Eh3rChl@j(4mwZCaq4O!+wi{E;wL7&+NCVE}D83*YkAMx?GYx`URY@VnHokW?g5Q zhF>hVq-d9~%*t{y?vUiNnW?%mLrV<+e0vHVTivwQ%@79z0y3Bx<_GM_bWkN2LQwlR z0lPpsB(}$SOevs<$Bow$aYGHKz@i)0+3!@qC)`VPJZU2srta6N*Rs$`;Up{uk1(*t zJ+uf-bcjfFJY-(md2b-XrJFT>_&J}Ak3t7BW!a${lfV;foC>uh=KmjYI>T&(Fd3$K zAPmZb1sA!Z_7&{>Ge*8sNn;SrQzlp{^)vlCp8K-|*@$D5p|f$Iz%p?)?Y@S%kQ5m&>j8LEDjocC=_?q-(G?u#vA`#bp$vGuWg^CG`sGjffoPpx58Q@n_9^0 zFKIm|%tB%^^;VL}$a~FCvC%ymFc=Ky(7Nm)M}+()9KY)R0xyCAON3Ds=8U;{dvK9JdqF8{u%-`O+ zhFE8R{s0V`!9qhrsfyfYoZB4QRA5qYJgyY5$nG=MDY@g((ou4t_o1TjJfUX4L^%OJ z-CH1)Y%@3oR=AFOF%zXEwKuYWg)+Z#TNC4!LJwb>hNVnfpkO%un8afTTmu4~U77gZ z_c{$H%+jCr6`gRQLr8?f!f6Tn2t!LbPItxxu-ejS)ID5c1y&zSeT_k0gj)Wshu@ci z^z05C0F^TV(Ekif$N|7NEz|cut0pfYr~{;^jL}|%L1iTminGhHL?GlAPk8jf-eV=s zkiHnv@@#C*`#_|Mhg!k5$Tb)&_St2AV}uvN01TxY;ch`gq>@&V2e<a&57Xrde5u=+q5`|8Wmuj9lRqOhfy8>)y>JL4 zS~*W^^et}{qVRI{&3((taD&f_Vc4`Ad+YU#-}r0FGWl8u9MRbV@Q$b{6kV|g-0u?r zC&FmGu~EVznR96F4>2@V#=t{&pZ9{^AHRo}&O1We1m(4T7pa*HM45gbT`r=el*h}2 zzkzz;I=(B4M}HO9BZ96Op#%~`$~DVlMC!y6p7KvXh6~2N?0;b{#{eJDuP5q36*Cu8 z@=nqic0om-dg5GVpB2A(@Ld_22=|6f3YON1D=U=j9C$Pg&hOqJ4xkBmYL>`v zdfBI047%maDC{!+MEOFyQ(k+qBw|OO!M&9T8F$1 z9mW=<_1E3_q_0qU*-c(|RUc1=et?`i8118zeyPk73w%KbuEJL^$=493#ZTRf=F2X8 zK+lE<8EAM`IE+GxVtybiR;SOjSe-udV#$iF4e)xugM>JTI8DG#8yM8r2I1%$@k^O- z`8A@LiBspx4sxOo8-NS?M!Gsf>*vvK;~^R|wongqZ(mZ2WCqt*?DVn@yq62^!f#-m zim0j=AOYg^11~E~@Ni(Akt8q*-uJGRG!??2$*R#^!1nWVvS2OSVXRNA)wS$Nq`JpX zZs)m}sGjw@a9o_n2nD3B1iu&8>+3_d9IqpCEFUBl5*q`&=VL&X6BkJT?7%-eyEgb4 z+AZyA(I5vkk7!NS;B2_RHh@PWfeHV;&i)}XF~J*&Z}9+b*px^`l#GavSWe%`V#8Ik zpUK!3^L@KYwk3;t)Gs#bFUeYv<+oxVp*LYca6S$~*Cx9G=mpDw1r+Y7s}DB3jRJA# zce!)bwMNL0hpA(u8nr--t-rZv-UxPP#*55ifNH@FsjQxrC$TSJ32MB?(Q*wo~3erm5qYp};+mvs!Uz$OSsAQUqJNI=;)0)(?z z4Zk((dUO~zVL1$cKzyRp#D;WMCaeNH;WY{N$p8pxT1^ zl46Rl=<7FF9wJ=JB0$OuC{J_arw@g6}TQ^!+&iq2)q+J1N zg@>C3pK)!Qw=~@)>X?r|DOFxv`FY(CTR=*>Kk22QoAs54>y5`x-~bLAu!EyR^JLFo%G5_h&E5<}E_zzlC&rO{T89XS?g?@RTgc*41CS>Q4!{uPI zTK{J^-+4L0;O@7tZw>$)eF{)v$-aHKfI}p=^UPsn=BSGkuF}dwah6xc1H_!$bDD@2 z#1LV~CR3y$NX$&9AW)0|(kX~c2%F_S z11)y{%K^u$JQwiSw*cNE=(W0qEwMC{7K~iI8?^A2EyRYMHE1%qo!Qyf-Jg?}P(G87 zIq73$+U`3V{(wL9!&@ItKfKx5Agh#b-=~y9KUAhL3)lM4_i=WwKIX@?Y%d#Na(&aC z{@ufWZmjkRTObM=Nv%UlEVZsQS6H7+qNQYQ;2Sz*Ls%v&%F#5n zxM6BsO&|f6!$b{3H8ke$?PRALxQcp+abaA5eKP?pXnGGM-6oi3g9`_-{oBc-vK z?L-t}H#iW1tl~+7>P#0_;ZPu5+L9Gu|0`gj|fpS7?~-<%8yC19eXnDWWz0V@yy;Dk+L{{xCmH_kT}HTUF4ey zGkLUtb3g`yl!Cv&UauqFGp#K&2Lgwx5g-Nag9W*e^uhA9lD@WaSQtxVv5$+4w4&p= zt4(J&)AFMdg}z@pJ5D+uWS=kR=Uej!j}5PropmpE(>2)75N*tbg=nB-2;iXSrRhXJ zlZm^*CU!;6TgX{lp~4QmmOp1VK$r8_*WvrU5; zm_`GE+=wn_F<31?+jMp|H5=R2A<`hloh}w8pEVFJ%PiUv?7iP#5xr8AKsmGtQpMYJE29V1e%+A`S0EM4#2pS+=Ij5PTid^Gc zX1q_+#YRh5cd`8&)>9t%|6J-nOrA6$2Z&R!@K#1=CWX+VVgXS}^}@vrXep;=d41h~ zHs~2%Sn_x17bqEy5T>a}Rb2Y)5+F*%575BoHzPL(9Avr<-}_h;kme>fdx$TJr^qia zNDnMVMt49K2Ho#h$)iyNoy=^T1M9^q4y^6&bO+XUcl?31-JQEg@XwI{99<3(Zj?_w zxI*zS!uJ|Egg=Da$hU0|;G6X1-6g`bF=V;cZU?#BFHB}`1%|5&w=DWqH9;`44(&N$ zSlb**3)1gJ(8Ot&+#5N)1@A0$&Cdks+6}IG$O9Qcd6B3a8>5ANXqbXDd75e?v$GG( z6YGE%=L`%4PJWX^5vt!gtx?mqs!?q;plQaCLCSTQ7P+iJ+lPAHag$kGaTu@Fa~(r zVgoNBStoh1iVMp5$K-g3ztCL>huA#eE^l7R{az}4zI?v+{JE|9 z`TO#Gw1@%tPOm@mw;Rxn=+YnmYyWWh(O&D(?+5#b^N;>%o_~5A2f%AS{#Sje`QY~R z%@Pg} z=fOTYIQXg2!0*p<<_Bx+ch(N}A3i!*lCp=5rN^<}RkY(MiulE6{Jq`(S9EY2>A&)) z@e|(RO=IbnweaTiXAI^uOK(3v#?$T5?a6Kbc5pkqy<`WiM<>gVo*&#G?@{BYXbIze zrj|tL?ce8qdORYSf>pe+lFjBmWV{GY$oT0TBS`g2=9+L51_rWtaED`smD zyyj2;nnc^ZRB7lgihKoc&1R>)jw_j%y7@|%eeP{r;XQx(mtrDk->u=|=wEgF7ng3T z(K>(mmtb|Fi*T*3$xr{f-Gy@o4NF{&Ra?SJqfzXauel#NbHJU>Fgl23?V9_&ejUCK zT;N8mSc6jl2C&0AEuj$JGAxZg7&8#G&lp&kW#+!K*k;Fo7sWm;N@%wZV{(1`H9d!j zroHFz@xNgN6`-^G^a7i-UW8-0zN^9djRa-4wpsocnEul$iaUi7D~i5|Vm{kRJH zGprCWXHm0~+1PhqZ-8A1zx8a09?Rjo8TXYVcRHe3_rlN8-7G1a(1`&8W5xp+9$rbU zlNQwXuDuoYSk_V4CIk9ISwXZEZQ+mBX+}KjP5qH!Hsz;9K5}OU#<4TG1*sGHx2cJA zPrQTJ8>P8EkoC4#k;tqIRD%P2+KG+y6nO{jyQ{%8W2=ev)1yc=AffwKnL^a30rWeU|S&R z*e`BG1+Cpttb%;-2S$~X12o^24jaWPCEsBqa@+(jr>0WeQvS9ao=y8e49-b5T{GHB z`-GAF8p&k&Se$F_z&5iBxiO_4eDMH$8o=&b1smYef8sZm6g2mbKGq{#&d&)#$4G`_ z`Y)_9{2^L~-kQgdY+AYwrZ8v&v{0#!XIMjU-=kTygwDybPN2%xV%D-c1kkMjDCFC9 zM4q?TGeqYf0xW{3ZLh-%$wW@quSE&X1i^IVzLwyaZ`zDzY*(elCt z83zwrLB*-&$61<N?e%SDTNpo`;jX| z?)9CNj^MTXN@syagDb>@^|5ziT^hYFPqnlG!X#KtovHzeG-`djJP>rd2QPE@j1wb1MaU4>CXTirY!g@A8XTGGbRELo@M;G_E-_Xhw|9Hn$KbD0r16-ys-u2T zjk=rMm|)558VR0Ar|hu7YQb7jRLgzpsXtArr~Y(@p8EA_@|NP;T@~N@#ajbxk{i_| zLK|^`(2h-6EvH<3&G64gB8=152#T91wldlna(yF9X0ew^N?iYRfZGf5;53nD!d~1p ziK##n253|}4H23OPMN(XM3=+P1^)DbCaPTKmBgr-0V;hOP!qvbK(=9IuHEUFn2t;$ zq&?POp4LXq1pXM_BU+QL|yTYgM^eKlfr0 zKm){7YTs;yOOVF-<;?QS&>JNKYVd}0gdz7K|9V4$`K8}iVZs0*h(LC^eMRl6A~Qj4 z3OLMPP%(Zmk6S86nIfr*uH{uy@8vbBJ$Pjw?I3UoOyCi^3=^j2af1sU+OP3u;#89L z#^bBT2m{TqdkyrWZ&}2d*V@VI$9fA(!kIj1mw@|u=iy_T+go|i=M1V#Ai&F2tP%u3 zAU)kSs2`k_<&m1bh;6kUnKIJ$$hPgib}wS*(ko*+O@^EG8z7Jj$~P2Vg2mbr%8Z-( z{=s8a|FxA4HX1pwxL6PZc-b0Rf;H1820U!Qv$zjOSHT|#PS`~nyK_ti9gP~F4@x}& zafY=k(6s7yt(`b5BJyiBJ9}j{x-hc5+PA+REgbxu8@&uVT;yC`>?2VRE9SwH(F_Nh z8%lgFg+$NNZ;JIu6F_WXLN3@^Z)53YcLPm{zWZ85(qb6IbtD0Uxk|3`2zfQ=3x7QgRgN3gp20g9lb!uM|P-2fF*;L%lM5letu?`4O0ic{iB@r~N;@h61Xyj{hJ z24d*T)tp}430`xFAL4afjY3Oy*A;dsEpag|iVH?Npjh7McoVzy^ltR`2PW`Xq^w+* zfwexwk&aA)YJtiZGz94XY>faGp~i1?_6Pg@gM(zKf1T=9Y)@aVCO2l|HDO6?m09~C zD?t*iWR%+)%^d{ECCGiQ4F<4tjo$aq`UnGE4(Zc}|)scNWVgxGae(CF$#Mvv} zU;{kxWRdm3vmCy1ju^aSrzjVMgY|$CL5EAAdLB%mli({J;83xw0nN>{pP*0*Kp~~u zu$%=bmm!4ZEI>IY2Q9d3Tnb2OxfjB67O?%?L71zNe}%fP(OflG+VGPEwh1oqT$6KS z0OX+ikqk%oZXd14F4V!vF6;+8Og1=7qkIubZE3`SWMQDClG)jo-I=<1xbcQ&BMDV0 zw!w2shxPE`q7D<*0QJ0oyqOGVMPUA{zYVQxEH-4N(F`XEav~sDs@Df*-hRK++#}Bs z4)zUD{Nz;#m!E12OOeCJ4^6m8J?h2 zGPHWWSn)^h0B43>A5-&Yd1HNfXKnTH`TE+%YBLITP*J@6?uBr*J9y!=O7YIiH}7^2 z-@ada_o*2w_+wL~O8t2A{q8b#?9Iq(ZKHVS{mRa>ckA0)9_m!1c=yxx+TpV|TdSg( zZx*!{>suc%Rt(XyUh%Uxn`F70k!7dioo6rCHkYa2$H1HxAH~ZX%kONl)!xT%R$i?= z+dY(i<&*pc)xJl!@7J2<_WFSr&M4kk-`PDhFE*UkAzt6wU3>R@`PrKG6^aX^`27}u zp)af`BZ}9y-fwCdZ}`0WYmsT&UHhY07D%gF=}?3Yx8I9B1Hocc|E5q{u;aih8M$=e zR#o4+mDS!q?yhaEnjzVnd=#&)zXPn+KbV<0A%lFgzPY`z#-#wBc#&ije^`FEzPz#_ z-xz}n)Uf&%eCkX9Wbt*$qtRjx#dT2-W?fF={4cP|XL4teu2`3*$sx8dC3p~f6u!QO)Z0FGkQofa=yYN;GX3|CfveFsg4sh-}u zTb6x*W%iqI{cRIgXtksED_}o(&s(fNXrYS;m2iiswU(eoIXvuS8kD!$nqzcFW--0J zh2^731k2yz&fUV58yI8rp3cW;rYcV=coAHh$9Si7;(pv}jQn@PI#o_A?trq9EjvJK z&jOGk5(Z3sa1kHe-i843ZeKL8t#uj$Tu5wi90+e77}$E3l+#ugKuaAv2q@&VuVJKM-j04@HaoYpetDEaD%6caBW`{jxH?O>?hkcBng$K^`E&FdKx9wJ8 z`lj6{7BYtyV#GLM2D<7~c5!%Nuw?SciBZ$H$l8F8-F-5Sx3;zT6r+jp5+>2CAHM zs0X?ToYko7j|)<4cyu-5n=*i4J%0l#ewm%(2}nAESPW*ZDAh|MWDG{sG7R(<8%Ac! zV>C`xa+@vkUeU8Gz&O4o#V}NlijxR}nxubwdr2`1%=k}}HZGCS6F5nt<$0Iv3wO_M zni7#>o|?M|Ai+UgC8sJmIKqQm@pqFR1vBOwxzj)_m0WlHonp?3vUS1$-sNEK6pC&# zx(&$9_Du>1WA>?0&EF3SS%Y{%nR{-0`bM$+#@TG%@3Wk-<^4W&mQ(lp>?WF29|{TZ zkm9U2I;e)D=ZbG{OF-UQ-o&MgR}V0ba5g&i@)R!$@G*s~awwDaWR2XC`L3)$@cBn9 z)G2r-s3@w3x3jiEjviN%owePH5z2j|qC9tDwB4<@wo@vgxLbip!9eUeq^0gGmi`jLgB{+J?x>VvU+hSI4H7Jd7ali!JG? zB1|@7Klm`*1L_+hV8bR2Lq9g_JIMwZCufu1aDJ*gPV~OC(^OhH370HU7C|w_NI?ro zkZ3L-NG`0kxwXpmt^%IswXB|n>Fn&T@shPS$4sSe%ZY+Cl@xPwL(C9EtyDSQp!7SB zbKy9as&~IM*sOjhBQfhWZe4fGx?bnkbw}6LWK}S0v{SuC*U3)x8eRJ}y3Vc9hAxA) zXP2Qgd%3rdTLUj0&=o+Kx>5t>b$U`!%kCU)=ZW2J?{vH2PE@_&?8V!3A1pQwMX&)| z5F3mACKtO)!ND$Yu7PF#NPQd*h{o8Z*+2?_9^4mz{!a;8qzi$nE~zi))g#NYNDW}I zIX6oX$jf`iLnH#1I~}TKu|G~+uOT7awEFC z>J|=>t@j%na-KDoz7ky30Cr-er4?4<0flt{bEWL*I3{%CqjG!a$*;AWf2-AI7XEGY zYy3TA{!|I#u@;El&A_k1Z4)aS4SSd>lr>+QWawY>{bD_01pWis>}Guw&j)Oi6847`guZQ8;+pC&gMgiFFU zm?Ngwc$n$Yqk$~VkNi25Ri8ucB&$A$+Ws7B+jGdrux=Wg={mm#&#zIbk+&>M`$%q{ zt-5H}lWUefZdNoniARwo)RR$XIEt^5?;q=#Jt%5dz@JkbCXk8=)G%RcCm&wLVd?X9 z0RNf=k9CaOthSK_TsvAYIQP zoYpgJYfo`3k5;V`_t{Q*e+Z-a^>i3jS+n$Uv!dE0j3VUJ@KVvL1zyYAqoi12iF`=F zgJgJkoBc56Lcr~8Oj_I}RopQO41Kx10&fok`(aJIH|8c@1M{qVsab#RRZox~8U`ou z$3_7sAcKmv)NdGE5zU5y4&a7L@Ph8#0NDr=5G#XwNoXo4CgMj_9u}$FN^;CP6_{+2 zxCg2r^j5RAEssESmqq%4m>zH|UEH~-_v89=FH=*9&Kxj59S-qV4 z4H^dI#ONRQE^$XQU*gPY&mnZK{TWxc6LMO0x#l@>i$9@ufR}ka{mz}2a{+S;qw?;* zQdGYN;mDPuaW(((NuTUNc+F*SaLwujc)wk*D@flFr0?*#!pd3*$(i=dFQJ3LYEnNO z+xcN>j)#b14cP~bF+tw)W0trqSad@f-3YnzR*^PN8ny~)n45pr+=o*hY(_1ZviKP+ zWq~2%TGy%TjN_ATr`OKJR`h^Jg(D>9TFdc3vY>!J$K3VyYl|J^&r6d(|Fa=~Hoo_> zQtxMZ(C0>7fW69~|EB>Df^Jx;JfcvanHzn41g7vb&k~*%VGZ7$7K;_sV;4llQhgv! z`#>r!Cr{0m0F`Mts^rT+dBA&>`z6-`Lh<0pQ;%gwK*3WK7|31Qn{eA3Hb1W3eR)Gn^QdwYtvz5P?+kPZ@Xf)Jgz{POGSC~jG4R?m`vRss`GKkoyHtt^XHJlYn8 zcf>m9Tk=O6AW*z38jiG#A1%QT1d@@i`{=v zQy@;vL}o>Jc#&v1?0{q=&jUQ@PkHKN0wAKsfJ2=cXlO3p4OrxK6Jc@|X)hI+`}Xv9 zh&|d;%0M30NRzO#DHe7JJi+;*CQY);YTJB3i@S`0{lx~eAd7Tzn^4rE_YaU!MHgcu zjr}w3zV2}Y+kZ^0iDPu1wNt@&6Q&!v>tO}zTaPC^F(E!$-j7!^=+$Ce&SMIT zuHqw7FSVMiV96>>Cml;>Ej(er=)Tm(u-R#S>PkI}S0#j~sKy&go)c_M?ACXs13+9x zkcG5*3~8xx$XKkguperbs;HtGCAImX_NE-F?^FkkBO6W{h~?L=9=FdkWr9_f=JE6rJX)9o>6+zTH643ps(%No%Yu=H5Wf!eNFeq4uJMi%ciB zVkIJN$)ANAhcnDctF5S(X{pGFfDrXTB!wr5r)(pOuy#t0DzLF4NwY{MWTd>UFiIx4hF(Zo(}e^nB30@OIu#eK^7!eS^@BA7rbHuXu`W!O%dv zY-5puEAY^UmLRvK9I|bSbfKCB>pMPPSTM19-9_Ja+m+8u$9~x}GnI8I9Dr%aLQjQ! zJhB`c1!aa|qf`{%5*o=3R6&Es9v2}m>TG}XelH3)$|hkU;@d`#!MXa%ag*GR)?D6=|_HdFGd1L!)z zy`&6R0;f?b`!kaL#0%0*57rEV!Fb3&V8VK|Z!o}wKg*&okColQ z0Z<&b#S#N^SzS!Y#k0oD2>{Sd#3{b+2EFen(dmv+~ik58AL>$5~%78uuzVot}Q+Ee#rA84)yYv0cNgeds z?Oq#FL+cWP$emDb$+=2Q*O;w7w!NI2#dK|kpNwr+okYsx&)Ec-IE8mXMA{nPQ#n@S zwC$F^yt^0G_usb%{c3FM>suS^TWg2*c%QQM!dGKk4}4vwTw!sJnb4kdl9{$WelWH@ zW8fm@7xb=~u2KDJY@>oS;+!&FbFRKIz!=+bPIWNlSlu^cTlFqK(+yYZk8REQ3QgA- zt50rAos6b$O+B8*w&|UbrfX8`-?8Fa$vZO{f-H`c70lIG5kLj~w#HRE_dqE7O<>gX zC&Qx}Wk-hJg7Yv;Ws3IUS-@_Hfv;sZ$^w*lH>Z_0VpriaAn}bMH5XIL4SVt}>seU= zK0W><&Ycev8#Rw`kb;Q|EHxI7;LUP2>DV*hSU*8>^iVI2`z$=FY#|>2$v!aLmfqC=b2waJ343;zl0!6)7OM0CFG@S(v z*qN)?*w$(AlA|PBQj-k%ZN>uo^&-2Hy9~ni4ULxs(MRK_;!L-iEodAlkXVw1cDznK z9M)KfIHD<=PCo(D3Hx_OV%aSyvYd`Yz-^SqdV%xWLB;|Ilz!uCsTP;Pu$;r>NCWL?{kp>1-^>{mS(dk;qT1T|iCp z#>n-ufi?F-#*K{tyS?4OQ(oYvN?6{1ADq!YlJ#_CBR2JIJXW7+I1c&rTjA4w@{I=J zW{x8`?9t^9NfCnPWe-;1y#;*}V*($~%aBfLe(~(*zEMvsp5daz3j1dVf?t@J!RH&? zWl?G-G3u3#*M^{1W1;UYg`4blr*hvx1%}IU=vt1gSuinL+96%FwneJ+KTDpTsba&A zSIEHF;dt9*8P0Vu9IO=GONsA|I!4q>uB%5xJI1AJW0^R)JG14K)8PCMgAPGMj1@9^ zJ53I&dlMm#--=6z1cMMn$VR5>UAGE*KR1gyJA1lxx~~g-pl$RLDEx^|RuXzH6n`ur zy>tv`gAvu{&ju0NT6zr0*p0e0G?BDMeH)tnxZO1&*r7~=*pn`sYBirKNn>#a@u@M< zZuVjoZrTGOYo0Q2ld<@0Ua9=_2w!*;ljg4Zh%3tm+fHnO0`WQPZ9+c6OY#ZB6zo!4 znR9C6s}CQOUF4P7P2o`c7kS?9rsKWj&@b2Bgh7VkBP0i%{&BaHJx>SAJG&U%xC(|u z$pmLs)lcnsGx-3QKDeee;`d(dM7m{FMaJ-HutUpIJvKnmZ11V<282?(Qb zjbaO5jbje;PKdnWmz}E#ON_o)QH7t=X-)(wkO7&I^qtxsQplSJa3W(v5HStiQ%l;x zkdHSZffb@oy8|pVDpH~^O$Ij0kSZ9K6%5i-y7^&E%w#h^Su^||V(aMmRfXboz}iKj zus&flxvD@J1wg(O5I}ON3TPRt=#1j=bkeFDOnzarwY0e#uaAqn(Fi>Ou+VM&`gr{2 zxjrULtpX%_wex06O{NpPF@X1lZzRWtO(`tfX7^II&Ell$H;AmT*&3X+5m(8^I)HA1 zS*E;1?)+FKa!|O^*%IEgPKw@H&{y0*Oy^QCwO^`h1#1x>OH&fMxM@ELEbI{$Pb=&r zNL%HX2MB-L)bYqZ2!^uV(xLFo7zD~7#EHNM@a6sW*I&QT0{Cn1GsC;1eMa|--TTjd z)WD0u+;3?YF+w9%aKHV?2v)-;4DKZ9eYzmEOq4qZ=MJCTdaV@d|8{|-; zn*fCLlEL1^Y=ulyIY6omEiT~>Xs}8?6vdpZsk4`s2vGQdypxL|1W7VaK)pdaPKPF6 z)P3k8`L;CLud*wuvDDTe8+iK>VTgGC9`JU~*&r*D8|l)Z8MXQ*VTlaO;|-!~+}KgI z27?yz)&L0@HNx1s;5ha_vL<3764C}K8M!Z;n;CRYmLL!wcFwcphQA=<=ARL?qFM@* z286W`x4StBi`Ii?D=>jd_uB_a5C1@?hBL|HcWz5?sK_1$dH?+e2!p8~>%G8<(U+RQ z;>?m?|NU_Qmd7(U3jfisf_j-QspZ;WAauipZ`w4T2)LOd{N@m+ISe=BLFelw7^61z zl!)*Y*uO2+b5`$yXU+rjA(Sc)xpjdf$e|W8bHll6;zWf<4`wwbsx_u%iB*ZXTKQ4@ zS$zuGVKht^utjhq%i{)#(rJnbt1x3}i3J4m9$h@rYh_|rL za*IIhGuS!KWcR2MFYEEVkzm}~ywHq7L*eql7AsuL+%H+ZjVAmrr(C)l0%FH^&b2Ad zqH<|--7e*R$sl%`J0rNW^yVyd^{hfX#ohd--Bo+k9URc<{?0+Ni+@B3o?7yg^o-yR zgw)}wp`#D%t}YU?9LB@&jbzn*yd+fC{Tzd*_uBzflHYd+xaY2`?laf{9=CB# z^0?g!eq>Fk03HAETD0(1|9mrJ!Yf3l!{J5NeEj$~I88m$!nt(t<#Bt^IvGBGGXG@$ z(ZZ9*`U0^grlm_p$c+Qh>=azW1|VPngd^qkeORy^SbMg#OsOq~;bQ0KnBj)TQ>Ddi zIS98U>}!N}*P*3FOc1mAy`7Y|7Nd$ff$)0N2V2xAs#R=t$lgif#)VH0`TTxE5>E9v?Lc+ig3kM-)v2H zZ`o{(zqf3{d^kPcO*Kn8ex*eEs^F zYXcLPq^+=g49O=Ybw9K5jR9(Yap6bmo)3m>xBefG5cneUNpsy$4uJ$}Pt zO}#7ClcD}V+sM|7ZLz~)OB5NMpVs1y{Om%CS!oUKLK11*HZNCpTVb>am?|8H3$l;S zE+)bd2|%;m(^mh@V2wG+AU(1`5PvKE|3H;owWl>4wgDGsc$Cf>giNB z&=l^EI!~>~$vv}%Lhhaa4ndBr4zg7l^EVceXTt9O#7@&iQKT4Syyb5~<$op-Ks%pRFjxQaK(iIvCncrCG zTn9s5Jp0mkuu*=oP)O8*$@&{6^e3r|hKL#)Xr~sGnVCNc2Nfn4Fa0<3NRL zpFSr09|v@Z_d#J8zI?kg*f91&b^<^!=k+2}HxPX#_bi!< zdwJmTL##9E>Jr96>D3kG*b{WBv&8Es1iheM6<;Rf_%i_WNIfw$p{Mq7~1gvIQ*>=e;${F z2|MbQ-M-xgY~SxwZr|?{w(s|Ic*yl=EbL@}p-{Y!LlP;OJ&t|M(IUg&h7u!7DXRo*anE4wRGh6xra-nfThVGvh`|7GepaMAzjr@25EqJSH8;C2EXLB({76(qRUTg;+8|9o- zfm~N)zoRNJf3%CaOIo~2sdY}ZVu0Hwh4e80+VvOMsc3oQ3eWyIl`kI4=s z#XF4m`xj}_b|%EIMZdT?1^A-{Zs{EU6v`E;P*@@*D6_=6$Q|HSiDySyz^vexa+`Q? zoEe_;*F6+eUiY-zQ8ll`0Eqd8J*+AehT|)Qv~g`SIT;^clyDx?%aox;*EYuu6MJP$ zoY@JzstV~3_pQxv1lX*#&R){K69yG)Fy$~hdjvtn_qPAT&E)jX{(-i6QNWbFAIbuh zzMc&I9CA+IQSLK4yLCi*o;*9dEvD>f{oHM&$+M7sH+`d0eR7L_Ur*nx|7LRAMLIHl z55+GnXN}$H zP6MI(Q+7IoPgs5zolX9h1+^ zF>@rADVS;8n2!56-CN&U(DxN0<0BCq?a=JKzeQo7VN=r31ZuF9HYr3H)NNhbV=#&W zhT(+_bu4I%Nbn7*NQa5LY`1?9tF6QL;QP zF8^_VynF)C21F zqY;=dtbK>HVAyHb%&}J+rnOVZrE9GksBuezaKm~5%=FG?z^n0Mh49!8NiK6Tvp?ET zkxEN%Mgr#h?C*&O2?6_M0KeW=_k^&UuX zME?b^jH2DN0WDB4Zx%rp;8%}jwLZg#rI-CS{vFiJQr38LML322=vP&oripr|)^8xK zK}Lz;DU1s!k%mMerx1cZ2-n@qy?Q1tn%qV9W)ln^+OYWRWoK|L=QO+;jp2mB2Hw3! zlTqJeYJbn;UH3;JUJc@ubJ2S_wI?|c++oJ^l zPaVKRyAGIjP`*HNZo@&sM4iD(7+cEg+p3}*;2sa+nLNG9PfbJhVoqXPW63uxQx;o# zInMU#sVr{>*I1CjP*0!1HZ)jTm_^*VmLfk)y1_cOesmr0yK|KK{~0^x#F%^jfnBq@ z`B(3n!hz8WK%N#rp4+Ya7#by;10-q=7Iz?cv$T(Gi+A#)aX?F$J2tN;KXS;W!7yA$ zA|!z_L0aWjL%bh7NK9J92?qm-!yG(~6?JbeNUl2Zg;B&caTZAOfFma$^{ z{%;?v;axY#yS|t*amkAbiA!Ech%Y&95KC{rhH96N;R{c!A7P_}PtMZ!?lVQT$75(5EYZ zWFBBf*~dAIz_T<*MW!_OBZ^@}RSW z=HK)0*y};_KQxueZ|5%d(O3r0pUKC9ZE}|IIzdg4+&yBOeuSqCh3IuM9Z1{Qf;`(8 zk}h=~Lca-9xmMFXISs$YWvI6wQmp>`9L6UYWTSrCfMpbPqOgI2Ei1hLDR5<#-d@Qh zzAg3=?eHpth71!V(6c&~txe{>fGrCY=GNujAFke*#kypqP}q2b&deKh!fKEjVC4M9 zb@}qV-<%&ooNGwc{!NB7(MYCt-K<_LPc zOLqtl@pKtyT|9A)$i639Tx0DlG)*o!Fw#mYWr2H@hp(>V`zYoyBil3iyHFLTqEHE$V}a^aRBS&&JV!D z&}7+Cs`SeTxC?X{2n{A$L8r!|0gLKaHNpjrf2@=eYN3dSn+cuXk`vVSk;y_C2kC)0l%HYqS)<-*y3N!zzXoJb(qGuW-P!mcWcXdLUYWtxOFXH+rZ@Z z1Pmr)?J`;>H_1b&P+?E-sAuk2i$+U>z~_SYznU%E1ot&Sq&K@i0BBXbBBGGlSHO5V z_QmD_2}=2+ZhlzdC45M@M`1Hz2LP*xcx)vxG6S0%_x*Z;UI<1wRnMEvQtT9RH)8by zQm#gQOiZ3v-A?Hr~JdKW%V2b~($T_~r?R81a#S9wi*Q*IQ!)Y}gF|?}BAV2Ihe8Gs1=y)8vCu(G zHsb1pmbTF1y+9AUsRgJamNWsl?lb9YQLhoj=AjziNNn2Is`DZSikiz?dYYY;s_j!O?An3La z2|^&~0mTeheT`&^NGHU|CX99+Ll1%zFn|#4T5hWkZmUmjO9aP@eTKawF-J7FIx|;; zjan?_?t*IteNZJHHBJy~qGV2C$5?zNW3f3UW3f4bvDg&G;$;e^IS>nk9L76iruBR? z*<;pJH}NkraeLM0%)m-YR;uS>z92lD_k!Rh4wlGr>p^H4$d$ob;&>h+4YwFXMdH?o zTY`;j$jlt1+;TsVT%m~V3kiU>j;+WM^YFIqApcMPRLcK?7axKL1}RQC7+R4=f?~Kn zQFcC$Kn!|P1LxEfHCpD`3oBKg-=^A=u$nIHQ6SiVc2Pe<9vt{2#~vnOQ>f>%}DZ*Pw6KG(oqL$H>?A&kJe zOziu5{M5~-clGM*s?qJKxZw(2!8JE`;pJr(zP77#LmDvj_^-2CR7TgAt3m(_oAGyeBDc=NLqNU` z5K7OvAokc}GC7=5<`EJvN3O6H%wVrAI4EIguzgTkJ zHT{fcXB`Y;0Kn{mT;H}d=rO9})HQvF;1xb#mzZYe-GE2Go32|2*mWpacr%C{;KF%e zXZU$wV17Fk#^zq=@LXfL6lQJ_?4bRi+y@xc1D+NAP$K(o(@JEGPx+Ex=RR(2;andu zP{Nq6B^FR!hrvh-zSlw{5^X^tD-+7e>0~Dmw}~z`#IHqCKpg^X-bB3Ds~2YH$~BY^ ztZ#Hg6j{6Fg!irmy$6yjs_L0ds{j-dH%+>?R8gj#3W#NXL9b2(3SV|&gw8*lx|Bf3 z>EmG-amEU{j+sgeqqV(c26LRDg^?QNui)f{#siCNPGK!xvKVSMFfhUAGysrr)m7Pv ziwXg$(3@|4*b>nj|9aIx9Fi;HC+ZIn9l1_}R~`hdC7|!&VJF*6+weI-Y=dtQvQy;5 z3_lRhB1_cefWMin5y64sPYG`cDQP~KkI_ui4bTZchWi6*x6KuTwq#%;?SL>3>N-aL zJEcrj6N}0BCDL3Y{(9~~*7<&c%#IX(-QK$X(T>IjgD|!>pr{0_5+!dK0FAvt2p<^O zLR&dZNpBhJC4d&fGWL1`sM*=IJv@l9%or2inF+>BSXjWO#3yQTK`!<6y#4{4Vmt!| z7tiDx?eiIo{Ot3FedhEI_mcJT27nwH(LjYwQ(DR$iV3gz#!BRN_L8r6_EVhZlpXF! zhsBR6%TkQ~!0q#9N^grd6TB_nWEF|+6O=xO%?`x4kaUw)zQzu;oP71mn`e;D!sZH^ zL;b7`UEwMOBrN;8Dgjsb7QOi%xSGx!K@m~r+QdNFcz*6Nn}-dg4`VzcMgw%JFpWh7vd~)8ns)6K zzQTt>TdS&IzBLAh{%Xqdimijv@?x=WdNJf5`KO1#gZy#9f4bQ^Obg(d&L10{@8b8! zXFhPLGyW(jT39675?4Enz0bFHom3x*f}P7RUpla0Nc$Mzc?;Vdg~bTGD5|n;;OExP z0nfo2`N_&K@rFpuOE#P5Pln*ngAJt)o$zc=0cs;22aWHBn5r@iRGc_%Q@kD4aI*tsmUK6nMF2Tw?AcM`6hpOWDfKG zltH=Het0~xTmF=>NK5w^2l(FMk0OnHdv{;n=Ieel^xxgthb3P3>cD<ate`lXX`hBksiyzAR@-cyezArfd413Lj4HrNr+|-%sh& z$vx#*&FOo|ea0THaHs!@sQl;97>(bVA)`BGXI~L;NtAeMU^IC)o~@p~b^p!ewhLVR z^c@sFoZO4MI85KZ`($#<_IfgX!}g2G?YcYA^bNaDCbxVseTx^9TjHf{`o>s$a(nk^ z?2eXjwVZxnsLXM3uf0d?@X0p^PuQ*8Vakr)!!*#Pr?lTrhDZ4_J$+y0Z|xjUx@u-W zo}Tb_^n)(6uj2d3eHMjt)Av^Va&kX8so?aT z@^(1!`uOB}+=d2+T_KS8W8oP_kkV&RL;<9u$f7=oI#mus;2wA@id+uXbZ21Ndia2woZrJ%ADzg7kr;!5jxAd*KNxDMe8i68uffWS`QjUpSEN}Sl@Zf2cp zpgcN-EZqOZcLk+2zb=*mhvO53j4+NyMxmS!oKu97mw`_+ z!~qa1yr;14s<-FZOA_D)XoM+Mcxw$r0R^n!^-!)lL_A$C4Btw%ps}p`1>lBSID#(L zb50R-uSn$z(-h>ov1*-{+*lH0*otG1JrgZ%pn4GZ0Bj^bWKq=E;0~2Lj3ET+`sMbP zi>Gp9U6v3Fq3E&%J4WNZwDfutaRTkHM+*l{6u@Ij_99-0H`LO%Jyw$E0~-iWHc$W% zqINnrpvq5ajiD&HqGKDN7U@FL=9sTRq4M9dz<zAoU|BDS{Lkp_R053qOE0GwBl`g3{qi!f|KpN!M zQ`qdb9zANnWPBe%(nrS*vy$aKa~!rgr>%?PoY>gbUb1yDJG*u9*Bysj7vq7%A*^Xu zoOtIr`P9cDuz?|A40V7mL=0FfUI5@!*s=tU@o3B2UDGd2^;qI`}psc>SfS@pe| zwuR3KqsVqs$uDB1-dgBL_&i2ycQVa|?V>YBo~%`z+8m&|yqW@AUF9OlX&HriKjE>4 zLrafmVb6E*6I_8$jTzbeo)L_#ePvr(t{*1#%zqQUDSwwYJU3&tN3vIeMF>p5Vc?Vs z$0P0O8!Tfmd;z3sEoY>R>DUzkf@_lqu>^C3rQc}?iEZIhv>|g8U#RO9-mrE8+bG|J zcYtoeLRuA;cB3h)6AmhL$svqo zp{I!`UHN{`C8RXaM)Ect3Rc*R36*pp2r-OA^d?&%J?m{1k5v_J^@0uIOlXq>7UHrK z$@(FymYm$ov0A#eW0MH9}+tT_TI6`2kbcw8vo*3;~Ho3N|ete87 zBS<$YWA6rd&tTN2V@3_qNTWpd%$-mkxGPCcLz7uQaCU^eF={2N=n>Ef6`2JCxf(MN zV4=x>Sv86R^-iv;$Fk1V)-DB>R|KSxs*3cOkybR6j9c@_fD`$#<_bMxj}=Px74#-! zW-#dFD9;cal`v|{PSz1}ZA+5~bL17ogqM`T2q(O`S0>*Bn|s;5Vi3>W2E5ogp3`Xa zFqLb`6hRpTSD3R5PzjDDRJUm!Yn9*e7HS&h;O^gK@vB0EghxfAO02tbm0@HZgQbXS zVAwqjmMs@QXX^+ltRZj79c1={ps3!UZLK}%YuI&pt5*=Df%l;rC?TT%)ZoDN&mZJI zi8~i$&NjP6=1g&nYZhAWZg$7>QkxQ{1fpK$`fj>lP69F_~ABiX1etsi;4VorqTFhp+ z6A+=m}3fK&BD!;^a|2~4#70@O z6Y?a_jamBA4J^H3-i=UhO(y$!Fu!zzr@)Q(y|l$6WSE;1jeXg!6*HDH0XlFY2k}4V z=lxms!t5Eg$!H=TP7p=FI}W6&gM9)S^WfMl6OYWCQ`5`c%?V&!p)5FHt9QtCIo&dIQe zT-W>y56D6H%jvN3_z7f!7c9mflpdu+(_)g8Phud6`0|qp?^w zr*3DK4o2fk1V@C7f$^hSxpZE*Q70rEq@42v7h!ShB1mDO@17MGDL>-Tns38&xmf z$pQhxTV_?z2p6fMjotL3vWXR4P2i_p*~Q*dGv02$PjwkPd1T){TKET9dh{}>7L_a{ zap}b)gkWm_ELs=WgM#c7dGdy*nBsS^Dq)YmblbzzM;Ur*ES^49Y(#^n_?{2~)`64) zd_c9c7-wEPV9UIhxoRV zL;SRvyak8&_AlfR-`>F?zB0iyUhXBIHdSdI|1QsMO6cQ_i{yg2kWTr}OD7C3DX*1I zjZ6MA%5F0{h){3@N<5SK2m&M)m$B6GvLLYFb#x{*Wd-z-bLN2JycW(o*!XrV8u}p zqXI*hv7lcsXTfRMMR6oCD&!HVW<{W2BcCzD!Nvudg}f{VTQPLf2U?n$lIn5n3|mpx z3FHtITY};q-IdA}S4;w)p&S@S<328r$n7jAB`AyvSR0ONu@Dr)4LTPT!!3hhrF0Gk z+ov174qhT<*lFPV@&uNPB03p=h$2pcVpl2`Rm0&DG?KcI5<|f)br@9xTPK8t!!Eyn zrktB=Jr`y}y9XXAMq%OD@S`hHksvCQL!&iI5ymZ=Yo8$t!rSw!azGAW*TvG%fs_Ms z_^(AbQP+A5$T7AN3CJP!NXdz{6_^@F+{Wd#-9>3QMMyb0qDc6g1CQZHK|4s*j-#4_hE-2*VdSNpH16^sE~WRl2EhI+ym1spK!1BOXsFnL zg;!V;SIdtU%>ue+i0;(ZQLB>T9~!3wLi zEN+mG#E=a_haBt*EjlO{0;Ise59^m9_Q*;Hq1})t9R(-dL58%>xE@xlh+hanWeE2) z8antBs&AA8Q^TJiZaH|cps1hRz^5CB$(g9|aK$Fun+~CaUB@nldcQnD!X+Vu>Ig-T^OWW0Gx9LG|x;#v^?@p_}lw7>}789HGPR9-vLWGiSghCDj=NzfeN!W07S&bbJZH4F@Z zjm&}JdLl5{nl0YOKX@yffzy8BWDPMmAdlak;m|d z&LD$g3%pIcBbn+qTgN6hz1Oe-v7CmjMl7fgW|krviNHP^QIUp&v=>Gll$}=IS&9Qn z5xja$5J>SaE~p|v->6#v<;W=oupGGs2$c<}3#QvHZ%OIE&I(G06hcW5kG!gZDLV#d zt`)e7s&MF-irur7I`8F>=YWP_)pN`yjYe2klu&ifK*+z(!wdz*Nl1F1}1}TVwrXU>vZFf!zDY5-(N+*S@X`B>Nb9xJf=H(A$ zs|VMP9uAd+0V{2~7f{rBm>ZG?_lFy-(QF|ZhIL3dcm#nSSTy7kodeT*49Br!F|PEI zNq?iXq7oQVgAP(!xU|rOBGo_=0k`KHKdFF_?P)Mf-;lqD+J^LO=nolo4}wmdWmn!E zBAqd`;*!vNSLqIMIg`ADJH)%c&>iC49qtgnpR3zaHj`Y=)KgFfxYEt|Lmj6Z7fBMJ z{Cbf8wV=llQwS%2$Zd+XZQ<~*;bq$=0b zP?am8DpvT@Prl5+RN~|-RdnJ}ied8bdSJa}c(ns>2#X+|@_8>*`;B;^8vFs$fRC|= z)`JA7*$*8uHE|RY+%#K(L#8j4&&jV`dopn~A3elL}<&I_7g*X!^%#g9AXRrYREs^=%2lnmI^T-7deGPeZ}k>6 zXfd35JqgD=uzUOwBqs+XZ%oqyR7M_K=pVc7Xvw~C&TGn~4548LsbqC*I$o$d7d*76 z<%m{|iibA={GRtL{MoVPBj}7hjQ2G{L39(14%C_~gPhT>(r!v-U(Z5kLbx_Vvk@{% zNH|mO5-d4~@WJNBv_p{1+O}zBAf(D*m1q|cSx^fDL!Q>q>wDK80Xp8lMSmmP%|xTS z@!ycD?Qb}rFw|zYzsvpApcq?Wp$;qRuw}-kMfS?55SpEJ3E*X9BUvg1y&V1d$v0on|Dzr~jOt;cNK!2eLH~2+tTKH!>8FjzNb2-!;|8 zddMDmhQHvcjzx1B2R%VSAObdtW8XL|E?S8B${uHRS!tEWj{@8Snum^}eCyE9^w0{` zHXfL49Ht0?gQ&M#bM!kTJ30os>lVfUqiN?OS{Q)BDoLw{P}l`alJQjtn)M4EJ0vB0 zIwZPo_b~|ihiZq`NjtN^wf@l@UXta{+DzsHx&yWlRF7QeHF=t6rOXU`bvTnegR0Pc%9bS`hnUUHlSd9Bqjj*e2FldsGN(t>IOoJAjuT|({-;))KC zcmQRE8M+&R%m*0FwwUn-$_4ul$26UlxJMeAa-6w#cTrIis@J1u)cn^B(3mLtvQvv5 zDvgI#{llo%&1!vY=T;4;BJQxrs(=L2_>XNuSg(Wf+y~-W+=whJsGbZ*u&=YwMLJls z*ai@4Q;OcGWelqMXUPx@yR8xEruj&3_}eDq3=m_yn<((&)y|tOjY%W(wssg6Otl>l zmd4Eo$N=M+bAQozJ4g=u$@7Z@*{5GKj@0lPBj8fPS{?kUU5dlYdbIZDISe<3BlKqF zDLXS#_d^Sf#%~AlVLyI;5w8y8i>?P4+Y!E?lc36w`RTBhZ1D!|J?LE5qY)A*-L%sh zfXKvyt22~#AY~~eT6`Vj^&&q&J#!&2-hT=!*o;U3s}642?IuQW-r;$jh8dN(=>1@A@IEG+Pb zD+~0J`80{`v}eVo{)4r974!r5>YB6mC<_8+~){kDM`zeW!WeLh5))D-j@B*E(jSRKOo@xSICE`2_F+*s5W>i<7` z@7~wOm8=W@e?EoK_HiWBU}HPUL~>h$xfl}T3*e9pW*C7QBU?xy2`~Z9XMdlks@A1j z62?w4d(VC|zl>>huluT1tM0{o(+_rPKR37Ez=@nKTr2u|wU3kb=@?@6tW_#IN*%_! zrM*+o9Q2?=!YucGs7Aapo1>F(17NbdCc^N*hj2pRrDTj$1!z(x2;qTp;Q)vSw?|DR zR)LE>^s*_iyW_xz*A+o6)%qB8b955UJ7$3H4Vs9Jk06pk#!ES(ekWsb56*aQqpYsL z3i8GH84yFchIhM9?tsm&>>{NpFb>gJn%+5r1Ov;@fKXI^&JXb&?Bn7vG{ROdd0_$T z?RM*^nx;QoUCH0M2kzmKJv@3?ud-W0iWGTJy#&MvGPL!&wzDL-6kX|wDm{AaP7ll5 zxk+BR(^Y!>tsJ7#_Sfov`n|tt( z;a4Ky1je5JR`MAt=~~rT9avE$Op@DxBX{T8W-F+nG&lEPOkh_y_gzi84IxmlZr{thq)$AU|HtCY*xgzS z=-^qiRq`RuO5j?X$60BRot!dn6l|}BUL~HhGhl=eG09t|-#((X39!jP7+X}Rb68~a z1)?84u3pMG4Ks$0$JY+4%ki^cENA-oZ(P9^nW9QL|HOwcodgoTEnqgy>5d_+xazHhBC~44}auwaq#I<~!gA zDZqEtM5p^*IP7yIK;4$>*T?SQKmHaUL*>vv+tNutdHgq->$l%WEAD4eoIxG*4cjxi zCckD>1lLJqERhL#HWE67pU&^3&)RqIK5K&%SBml(Bv=qt{FU9X-6~N^$+V5R?1uBv zl7auxoNkM1;dv8>3q@^70DJfJej8rFkVH zK=mgtqJbk}9}>p7BN>YD*|mDWnP9 ztiU2Nu;QQ&WtU*_dW9!lZOlQl%*>RYKESZ2Ag%;A4ki!B906gwS-lFy6)EP zn3B&36ZO#^X~ zzPwYp0Fhm-uX@1|rkM{(43#^~e4SExlGXt*LL@ll@}`56VZUA3DhXk_cjDk4;&QkC z&~u_zPBMdX1?JU&eS3*2QtYD3je38q(D0a8aXg1cV^PmoaLXJp> zfcH5a0>*E3`shWt$5|Y!r6!1XziE(zaFRWqJ$oK7mRwWJUICdrjZlqx7DLNd#w9M>}e1M~CT)JC#=QunLdwLq=ZR!=Jew1P&0`#`2wD75KbluS%q0$~B=@;9*KrF^Oz zu0D)fFq&*U4AGqaT-n%M%#($ECv|?=>yqqq7z`%Drlt{Mu(7>8OunJKrWEuN83!q1 zneGgil)^@g5L8gJOHs{UCc+sEac8H-L7702sx6GI(1imhK{pcyNx7u1Iko#Lp3FC; z?6sDmd!}q1q;LUnHcw#6>0!ky-b)xDoKCPu4n@d|p%7pbhEtGH%AwI&fq=DGb!9iN zNeg&%I*_Gmc1v~zaJ}T1`n1L-nc^Zd5(}mG6 zu5fY?k&xGtIT*Qfj$Jr|FOVKVuXu7xB}z6?sk%XqIi}cS4!emnt$+cAI+Zi73f@c4 z^-e5`9yuEHPnHACoz$(O2!dlCb1075g8_)XQXdRJ8(BU_7l3D+3n0h0=b%obT48%U zN5>c%JdA`X$57E^nPP30GoCdrX0PH>tBa7qhK7vsj9-nZB(X)t)yuVviwJk|NZX*? z?EJwT5QDcLRmCNq0GFMeu#k#6Die;M(`#Wc<2P;t6bb@YVS_*(L<1bNVq@0Bt#!Oc zf();&mT@hqVC!c}s@*(+iobYrxbGY?D#@)7X$5@zZy+WM_FZ%F)a9t;LZeGGZw#w9 zScVb6Y8R&Z7?{X&AP?@rLa^`&GPGC@$4Lcp$K8@N3CqF|fqLX_v0GTsZIF+fyo)Xa zor?-+LN&pnGrBQO8)Tfi7sZ&1L|h;4q}>acrd)ua{*&mj?!{#3Jcsc5PWr*oW5N1@x#9fwv|Ep55vHo2;J!O(%EK%hxm=JQXh@F5mXm&eglit9RE| zwX5WQqF4tXW*U`7?ZFlP*`AyEVQ2dR{<&AJ;`h5*`@s_1+0xGT^vq5}-c45<_Y=is zXrj#T|17_IhaTSH8EHiBfow-)xR2Eow8PQ=3stidFS#mOi1pP(ZEld2^}p^ zkas0A#w$`9_pg&@n1Qpjscplm0nmJ0RgIAT>X0I%l0c1~$_ynykUz%TP@bA02zGpZ zD2R3vSEshUdr|==vlilV(CH+mfM9u`+K6fQ+7UG=G7X6#auc$a^`}%VtGdLHzbl|W z;{wr^m1`z&l)T!fK#!tb@miR2(83pVF-HAqyY6o1s%kk~^a<^YL{-F;X06}`YgbY{ zTDIvFK$xwwY>B(PzBWLUdTt-NZMIlRxhs}4+?8lO;*z#%NqHdBNtTQU6Bl)JOUiqv zFbHjTS=f(kd`Zx8=ZG!Gl72~DNdg@8ZUum2bnn|i8+33xi4ttN6&MT2T24sATQ)Di z992_zZVs_f&;@0F35x+9=B-R z?c9oe<36h)pO3``|h6Z@)Xg z^X^k~Zsy(T0saTCiL=zL2^Ah@R$f}JYjH742s#V24u4|h2k>cY8_E?3;E5(6}B z#V_{oqMyZY;H8-b@&T}3@R_<_cErCN2`y%1D15++!6`PBFJup^$%O>>#@c0{ zD8J?xec}*Bq|I0QgjZ&J!^Li%H`_xz(9Q+Itoz&3?`H1Z{lDpxr&Eoq|M$1P54`{0P39_S!L^WW${Fg^-Q&=;(EuddkVH%=Z@T2Zen_->^~m91(LeoH%65y8Li-d*I5ekr?z*?qQ5$H+s0*$2ABP49d)|6;v9)1iRUSSow%v+ajd{65DrsGfTHha&R9r~GF z%2?p#3WL8xv$g|q5nzSIF~{a$xC#7^`JtanygQ?aNH%PBK&c%F59kVjdtpRJR0|U2 zY`dR%<<3QAO;ZAZc)^B%7y;%NNj%VXT5ckn-+r{O_y1XWHvqf)?p|g4pZCE30zXc@ z13J9dcy|wf?-7Sp-ksy#nws-Fi}`Cq5=KafEa@enLkz9Wf#Lv#M-C(){UcsdR>RR1 z6}c!lFS%SW2d+yGfe>c>x%fMVzhY>8(+_DY+zGopn@Wq$I2zC&7HX2~Sfg|$e+^Q{ zinr;qUVg}EhYOF_9bZB;Pa+kvynD|3P5^(H zvI6ABj%x}Pr8o(I00Sqd%|ScHpgG(qgu+5vu54ezMW7t$g+)P%=;@$2gpjm%K9BS^ zI2+-o+60L5gXDtYA)$+29aPG^E*&x=_)Jx{o*<|)Pm`$~G1&Vxcx3YuJDu2INfJ|GeJ0_YMx*gL`-GBe`p~&wD3Ec-8|58`=_JgxnwXi-a28%*6pb z56ClM$H6FUA@|`SEQcP{XJ!!cUC!@DKg@t8P%!Ajr=;Ib7rc`tSRBry-$qrebo1ZxRoFYi69@}&?G69g)+1@_yXy2bj+t|lFqDNZ zt5VZ{xW8Tg=H2~&Iqb;-a+Yi^=o~Zj-ej^lCj>NGG(R`+(3}jur5gyyG^W5qs62S$ zs+Wj}K2scd5701GnEAE6EW!y^QVG)a^pd1~4Plv-y5o~WOnlZ+@<}g#J_*-=zee%n zsfbljDiTGk3B^H58+Z%5ZdUZlIA<-8y=)PJ{?6%9H(k+Rr1n7!%NKg_rKl=D81ym) z3)D9o7|c!H!}0GuOh|xA9nvhF=!wCqPB|?!NPP!`JR%)13Z0)}PF&vtLBA!akH&#` z5>?oW-PzDyx@v+Yj7tH46I}tmIYe)bBM^^O{CulntiQ#Jq(^`}_3Zw>^!x_!0>J{- ziccV^kGLRjfbJ2$t0e~?zxMaJGAx1n4J(NWDxFZU{J}NF)gnQIi&o4ghgXxrOMU;opJatgS%S#PPjB?of$9L4Fs!I^jo5`61}yvgq^vzWj{<@;N0X zhKZI_gpHAOO)lRckkK-6(J~UTa!Jjc$d%e&hI-Y5*atLab9rt$DjAG#6vq9L9W(SV z!qK_jx6+jfkhdHlPuriG3%!0sGrC19sX+#Dhg-yyk^=;71k@9`uTY0ZrrLhF{g#s? ztBr;Bg`&sVJ)Dn^+R;|JCu8?*u|p7~oGq_E>muE?5S+CY-jUc{iOR&yMWtf8Lnoq(!Na~XcAj#g9h`180GFV(aLOAi zHIDc^1L&_n4%#0uUxUMIZ)EN`t;fmiTL?iGCEWg@2v?c&k57wQYFtbyN<9po*Cr6E>_Kx0|p1ebvu zDEj59KammMKol*bz>umU^l3HMUjcUi@wUdt``*m z;+=mjN7wB}X$35_yD)%KmK(T0YCObsoKN0;*Y>w+e|O3aTvxRZ70lKUKqMf1YkMA{ z2F$pORsjvXGvy*!sU|-r7zjFn$vl)H?9ezsi2SWIcJv6}U-px?*+{9qLa8xD5O#qe zCcEZ*pM*`|k(7Drs1&x6UN$l$FNH^G8?KJ^()A9-SaLpu92x^m)`o8Bq;*aTs)Pov zL7@uVE@3l4F{WiAX8@%8y1&029#K}pxiBKiBAAxwix544KOKBwk&;!&b!0i+4s)ct z@b~0sP}mLJ>S633hg{#ap@{bJKH-p7l9aL-lEp6fVPi=t%FEgwr?>%G??g_}Yde5XJ8195G2@47cGHIJ8 z?;!;LzQyu^nUt-FYx~P`>@+@9WR-GYeAL$UHgygs7zT{9L^uv3h8#rPFJmx{AX!WS z&;$m?dQk0Z<4zHTPr3K1V#@dVW0pK`>k;-R#FR8v&<@~I&x4?8Z1UfKYx?gh)WT=X zUpDXWglk#8YVEnq*c!Ew8=?uc!t*vMR@^m&*@~CoeyALDWvWPX5mD8MWF=&>p|v}3 z*@LPCXe2a3IcB z=n0653z3EUbgOZY)i%hD4o~~t(t45MTP6mEbYKjw0zsg!zZwxi(?o=9!0Ij*N1l4% z*=iuXIaW)?fW6S8GO`bTJRT(|nQNLPRLeC49h^3_gEibD%=!j!ZM^DM_K}<9TB%I` zMMZG9Sx-Z0DvZ&TO1Xh}B6#S@CGIX+r#joNzq@{i(1pp){i8qI;Q&+4&24JXjih~2Q&1--dn);6sOb>DRlczgZ5Denay{FZCPjSb;t0?Z*jUX@s z#(~DEuj7WWQMTBS9z1fB?GUhZ^U-~AQnmr z3g{2I0>3(Mn(>$I=nKy!fyXEkKI)j+udPKB>Tqjn%>DL(la2Z{C0VFp1c_-efIi$6 z>31hkynC<;d3!8qM^Fq*Y-jv72)==+5Oe^JZ6r*G$#9GhiS9g*WAV*YhuR_`bVQbT zN9ZcppaI%3`R6eTd@dkwtBtF6Wb&W@V2loNjOVr_DWkjMr*qtM$JAI!{1zczd3rfU0o5b zDXR4Bh@S9pKEeRFyj)u)N@4inR~a-U8Yj+l!lx2W?dPv;5W8F9CXZMasz6k)hazLz z@uv|-b9xKzS$3*;DnG(mker4?RAw|`SD2g`KX5h zx9+|SCJ%wpidO;pZelJX+K(6)f_^(uii~IwlX0Ee?Hf7+(zVar8JH-HV2B9jquxN& zTFK|KSmDI}BtYq483@b+CT>^sRl{C5ycsVI*sTaQKXxO~4xIrb1>!0YpwG#yg(2YD zBBhBd*kKIZ!<0u*Yk}p59MEf@fPbIP%)#Oe)5rZImo_Bk4qi+~;3%>~3Os}lm0Jpc zg*Sko)c!KS^|au1*E1~mpziYcikhnxs2>r$X2qzDW!UoL)^TzHjsztjXh8|e6`+0$ z!{zOX@uKQ7@jdtmK!~gA`?RUrCXBR*%F<(4F~!EAf|!nz zs6$Qf1imF9A-Dr1A&6Q@ScdK{iumrD_>QO!O!Y-ODtRIUlU;*$(~eFI5AT&uAoMmo zOn#`GFc_0tkJ4-CHx0kzSjq8&8NBetv_f{EOadV4`JE-C4ls#68v`p`Mt!paXrN@XUnmq12>@qUSwVVn@-rV#5b2etrl#q)KVx&z?DEsV7mGFc^(`6X8jsY ziQ$|lW|R*s9B~eG_U5A=@3hGUxwTP4W@K#5K$6uF^ZUX$=osV%@S_&9R#;TTvJ=FVkg;;Jo{^SoLzxm! z<(cpBR&?SsPXUHQW}|=>8rL(9iO0*(g22`{EN7@3_7MaF!Z4HJcGUu=#kW-oYohg8 z%}u-j+Ee4M)0)Yl-SFBJOyy;2Le`IvlF;m6T?52F(<1;1gBloq+a|s=5huaWgt5u0 zQB>lL^9)NK6Qo1xq5SsC*8m#rJYdE9pW|lV2nTIc3@#aK4?>@Kt@1eA&~s^z>U}~C z6(FG|kEjUNk-AsDnBFH0?qg_=^~HuiYT)BIf;tHGvTmMq%Y-Phf!juMJ%3D=4D)yh z!&|<4&VR#jmPXNBRjEI=CU+TYaj2lp6tj^iiP#2rV*zThjVR4d^eObSn@4M(VQs)a zI6(H}cZ=*mFe(#nA`#ee6G$r0+66jj)F2+v6;3C zJMoGlg;A%4xzHaFkSm{wv|~ICQG>Y0Ao7hCFyI9C^f~=So{RDj=RwzPA5=2KWaT*O z=(n8I4qX{wVx&4~(YiXdA0+OSN)!9-_L8-IOd)D(H@}#Q1gOJ9Sx$I_j8n{}i#`#x zv~%*oHAr+k=N0f2tTs5FXfW+O8SuFk+(k}5&)&`FuV2Pd@xUHVdW0@=N{_ALlI|#( z^PDmUD!X=a+VWL|uMY&KC+n)FEe0C(_7bSShX8Vf9Y{NJlC`~d+)9B=y(qB1-XRD3 z?NwO70P%YY8O((V=AmlB4|fAPF(=;RFa8pi&z#hPsZ``%k?tau*gxT$;QGB9^bW3U zDNEaX`>mZT+EH9VpL?Z-4_9{1uJr1@g6|H!50iRr=PG?#g(HJFS_L;F3^M${6qVIS zzwa)^qDjkp6aC=nMO|HGi?UoVTh;K#8)B#I;DZo|qg7ggk2Le;G27m5;+&jnWy}Z} z@AeV7j*0x}=p{C%Yn93}+n(tru(=m|Or~Z>Nr~W+*BRO! zHV3cHyRTjN`^Z$C+DlmtH7SI0oIb8@@UX_yM+uDri!F7SiQQnQ(vS44fG3;9!f|Mg z%VBpz05w7E4*9>pWSv)0W2=Vgy6sB&$pIsX#mWYLPfr8-`9Qb92KbSE*k6@vFOuKr z%9X$oI9UdW*vgMv7zY?>`jH1K{5*Gq&XB@!FyKuWK2N2)?z0A5gM~Txhj9LQ&3OYx zDBxLrO42Zr34{pR&O+6DGngBK(;Uyil2cuEs1qR+L+L?31sMEGFgLop0JESU*lN-) z(!0tWA`0^=EJXPiyn(vjfCYu)8Hy6XuwW$9uy)~v8h>G3op~hmG1?(}^~2gB6j5QZ z0Y^0cg`N}!26+wTXV(v=|K4*zHDxc2m%_qq~WT4$PEiUglVbD5o#H$ zN8cn2aii}*MtqI1K(xVxpSTCqX_}onQ-BC`M)0RrI_TLPra~~>(+8am<+hzOGm{34wsz%4ZHr4|XQekzTtx8;r4KZVzqJ2u#`!vGc z12YTyHJn?GK&sKLJ-i2=2{ptfm{rxjcN$JyOhISeGjc}OvX>wW#|4eDeoC|V8a0RD zYZ?g&7(Ef}xS$@;K)$e=88mpxYvud*%DJ!bm-gT8-OqnpaB(GE<-G z-bc+`0@Hi|D@#lI%{TAL@5=xBS2;P%I`CfI1k9reQRzZ>6h|9TEidzY)_Mtl$m1Zv zmDbM?2(Z_k?{tviumzXygr46^{zHULs+V*uvKSohj|2k}OZ;qhLv$(l7sl3=ayfZu z=J*Wff>>+C7_lxO2~yGJMk|3ypkhE3Y&^rKtgbB~umtX(`|+&eN@ELW`$tU;fRgW_ zSeWtPa4|Ah!L2)p>wKEI?XconUo|@H9b!h)Fm-f?=_z;9)G*B7Q~jvfZ6CmieEN5_ z(rMjXA8C8XOhfjbNZoDcm?a3G$F&fzd?-0~EyHJN2q9M$JufgAQFCl?z~^_;CV~St z|HR;c&Cdh}d~+v#?t%mES#ZENHwOpA*+1Ti!Nj}ylLaxmAtazR8cI5O3!2S`1VqUwBp`knpy@0b63|K%01a}O(J+8k zlwudHXpKej{5}V}QPFtL9)i7y*mW@y2+*#--Xq51+aDkR*CPhwYd%8E28Qk$q@Une z?xMwglEh8O4vFM|;MM7ke>6ZuYvhl)x|(~SF8{D6`NVh4Pk5I-)?#o}LOut))`zRB zhx-0Qdk8lsyw``Ph|l1jpQLjQ_gu545!x_2I>x9TTz`VYwaceB+d4%&Ii{m>Lxqfr zEN7P5An&a;hljAEJJ%opItm?vYZFFiWOAi~j>cV>Qn!!r^1UO73;LS(`k>PTM>@P0 zmA?mha+X%4xcfYZ^b>OkNA#eP&Gc*8bl;iMNhvHGgBr_1Ha}G=*ujuwHD6x}9`DT;ma>*b4b^G3`5sQWZh-0hzW>NpTUIshPTVb)JCb0HJC zBg>i3HyO4sFUm+bZh zHgqBcWP(9-yY6s+fbuvr;m7PjH}^Z;j=v_o9mM92N=uOW9^~io+q4I6%?d3bz1$Ed z1sVF>NJ}jwXG3Cz%bA&cF#&p4QReaHxTb*?OTOgxa3{31=u>A}cUDXHBOU@ke=*9G zIV-b&NuRy|((d>|I*P^fXFJzSh`3T3N&t;6b6xZmZCJ@FU{*8EFg+e)vdc1I6Ob7k z%w<-AJObJ`Q~wy8LUS02CpEFn013wdRbWReHmt(2 z+{$!zYzYwQg;Q_k7p}8|xT;0VWTsMKOD!&-OOV+T!~m$^y7#lA-dXm-j&)_2u&9I- zEj?iPhvd+5|II8hc}c0!t&)F-B=Dl>r48SgJb&D^$TUc z{Yrnc;Ta?DmU?dXVX)m2aNZJ5jhm32q_vEm?2M9ac-a{~$u>RY7J9QZ_IsFT) zzoF*j%$z8=gPUo~0q(p&^d5q<>^<3(7F9-BX`!W?_lpH4ZJE^e+r^SL4hs+EHf>@# z=FJjmww8QUyP+g@EiU``=CZgKthC8fnKN-pLk-Q3Tk3f%^}H=Do#4K$xW2b)zHYH!rM>DaJ$BCpaOJX3WMq$9HhC6A`c{a0BW{cZtVF= zJ*0jmi2*V7Cxp&=EkBn?Wi8>}A=k2qWM)e5ZOy?A$wyJ9a&K$Sb5M)WOei(iA$9!g zT#+s|T0jNjUZMHx+~kZQ?y!_zlX~@s#YUs*F}huruYaARpuGuMV2ZLfj(v{f$6Jo$ z$J>l!EjJEkZXvJlW43cdJyii;{}@JuS~j8sj_8+Lj_8*gM)XT){Upl*nU5b_C>~%S z7%-elk$KoOx*g+mYYTnZY;SLn_0JfHvw`?E(N6$q+D8Oi{~cU>{5^#=KN30r{qIo; z#=~386)z$thi?Ly zAaDujZ=X7{kWi3Iw7TygdysVwaI)04QP$e#`}5-@o0# zTi>6&*6YYxw?6-R<;{!TjknJ>7S>l^Z?3+2xsgU6wl*xmnT+!d#_4kZ675MN0gJ5|6USED<$IiCjyn5zyKTunPTm#*#1=YpXBYAU_gJD? zy(WVswQ1Zp?QGinr3L8M0aEUQ%VwWrV;5e%e7Us1ZQWgcxw=Vvj&2vB(y$r342fR` zJ6tF?zwlG87+mwmlv-L}f3=<~Cz(OVl>BLF>GkgXi`Ac(VA9+iQ($vx9UC*hiSNqqT!q1`y?(Kz?bBB#Zu8Y^HrYdT zZ=liW6zsb0BJkbyedkK*AYwS*btB4^+jzUMu(Yv({&H=e?(ajlJ<|X3{OXHB(Sv3i zu^tNJTza`!D29Y&ET#MHHkrS0%xwgGyE_Oy%UA7DKDnN9dzWR$Fkv|3h9ILsJ^Sd8 zRSIymQ?SHS@OErQ=MVeoTi8^*WkzQ}Dq?X)Np=0Tk5YDPjFbV=r{Rpd_U0fUC~~#+ z{u8kApe`?m;Tt6fu40oSkzv)km?X7RCKky}NbqJ95e)H9I9k`qhkfHHh{qE@447^F zilZCm$rKPs+>py2tUQ4~(@n@D9EXt0729w0#00J%61PAaFhFsrdhHqk8mORo5~HxU zY!Bdt6H1Hp!1vRsoMBmz`}eS7>4VQ;jV0lfDtl~qFLnZM#ia%1;Kk(Phb(?3356Ry z1S*#+y;^Jf$JyZ_oMDhvvwD44LGJ3VtskUqOe=~^#*Cm?K^IuVALBKAPpKlDTnnqH z^iMy%M8edp1EKl=)NHT<5eX*J9_&D3ZRvBFOxBjIhi3@=`xgV+8}^R*=h{hJTp{F6 z=9p@o3WOb+LZt)o7_7;7gX8r>4ArQEaVem|;S_T~$4EUQ1Yiy^2;^O-0?CSfb-Tyq zwO6gm_F-}cXuNhGOD)y_GuRz3o_+3CkZER{9XhOClo-eQ6bWSBBVddik9xmeC3vtM zaM|F40@yI4V6oHxTQ>rmCrdg~8XMko%G_qpxMH zc6@2CZUPOF*rC_MbX&Vc4rGC&9mtx{uZf!;h^Iv?^baITNrdHi#&QRyZTDsNY>(+0#SBi0wnn<3@0ejj&IM&Rv=6vEEi4+8BmTkP7_VCNbfA?F1XinG8<)yL< zT$%=7Tc%sv;0G|`O5WoZa#xMoKa1cO$)wzoAyH*_3B$4v@&A6fF-){jA3o{VsUgUw z!#4=|-DlTAH&wYZlelYRzNRaJwAntG@(@YhQLKYgq3}^3Jn7U2fLBVSDU42gOq^}t z+?|vb{VlB81Lu?Hqj1Y^L{!E?rw!~Flk!K8(#ed?jZBYmJW!hc0yKT}Xm%^x+d#}@ zq$Rq-ueIK9{zY=}DD9Dx`v*!6_^|gV?eOm%yx8Xhh_Q5wu}&d{NS8P8(8oiIpCDmM zkNL3qC_UugwQhRGzqnFkMC$ew)UitCyrc|Q28KBx`tfA%0>F^rrm+44oIm9OT>9n# z#8q+O*GNNlGyrO7g`$_&wHCy^$j{#HZnlrI9=sFw(z8%t6N`{zG-_u^^wgUjTH*P0 zGgmmU6Sd9c1q${v8!mDq!O+@`acT~>)EDu0Q1SDoMNW3pi%@j#{)5^@a)h#-=5H6t z$Mh(CLo-LoIX>aQfe|=EUMx3_h4eg>dr&)17E$bc@amZS!n_0EWIbIB#kO~9ixf19 z818(q3IaO?We3sd;2Q%A2N)uniN_LFy)`rUJM&Tjt=$F$z^49C48n}~hO`VAV z34&KJVwKUYws_h>01_0o2DXanp1wQxFXpY~E=iO%5c^2&HF$HHoo1AcN&|k&QyZXv zfg2iH-a@HpL<+0ViQ4A3y0bM$FLi#ID!y8!t2F0klp1s8CW#;b+do5?$DqeEcgAiYYg;W z24TH>i?h|TvsF=~j{CxKs6`ov7de>aw;L93NnK0Vtb#AJA3z4+T09i{_qy_9K8Ofn zTn#Api2+7FMK9v>HcQno5+k+;2B8^~PvWwbs0KE*f;CX?g0zS7LtmQwv|Q5Jid#I^t4E{7xCADBVGbXjDs$4Z;0l#jT_%>)J_ZA$!ranJK-`2!Q3Ze6v*$G^YTcZe` zfaO9f3hhHVes#N|VB|Sa>>Egy>MV$(rRM%&kO%Qjn2p+nZ4RX^F{Fr5!di5Vhi!HO z7am6kek27zYfvHE-2i=c>VmIfRT;1yfu^0hLNQG@)j6o*FJed{!!K zj<>Ia1jh)q{AP}!h;p;E!|%7)W8AUZDwYf+^i>}Q>LREYMQ~)z!H`sWeZhB*+Xqi( z-@BD2NG$FUkYNt^iuX-4Skf~D2ek=PGT$gmhtTz^QOc6Q5>Ti~5W_{b3ea#MEY-rX zA@_aR6NYC{8zzUalENlTzT~#HUei0$eg%K3#AAfHu{{+D;W|4FuMlt?@ z#%H)53U5O9y|{bW=S37wvq;>Cx&k&#SXHb((lG~El@Z0q9s;^PdIf$sY7PbRC{!j4 zHS-%1kq5cGh-_NMK|@33rhZAn-VeF=iQv3&Nrum`Ht9F0es-kje~s+qrx2U z+{ihE(JL4!`pmIypp9jRJ=^90golAl5qLZR1WdteePo@c33zR8_F)l$3MD;({EbJU z&^n$>UPb7Uijm|-INw~{k=2u$Gtwi!USnzSks)HfMmrc49tP*gav9s0ayF_lUnY)c z4Anm}qL|{nc}!zV+Nj2Un>el!;&o(HBMkS1bsAI7Ml|NjxbeU){>IS|?-_L<8#B@@ zrO`Li4Jwobd5nTeRgAO&$p^;a0Kgyg>SeCs2-8(f)Tym{9?P)mNc%-bW-LApdmyB& zT@SNhdHNS*VVGJ^+#n` zYq{dxl3f?B#@-{x*FZG`O$cOlv&5}taO325x^Kob?+;6QWtE7I2eUfv$P!W(wQBu5MD}!+r(-fd_? z+JJKcE#>9fg4sKTMR6OTck~m?q*%`Q`vx=xwQX|%UY5HyYYCW@6Dv|HzwLhP_RhN{ zX`r0+`tA2P3>_(k8*V4Rx)B8s4P5ofGOVb;dei)a;w>@uu&`xvR(;qipy=0;!@I>tc7@R^P3zee0Jw{$VxPCZ-5bz*vj1hI%V#IW@ zicCC+vcVZhFxxOl_>B^=+0ygguvRKhBRAExv}*zy&JCT$io$s4&OYYla}~pZOe)G~ zm1M_E)Y{o8`=pha2Q-1qt>!adG6*Q0HwUF|Z&+ftrM+yw309;u5OoT*wfyA8J_+AY z-h|cVS&p>1Dvg^ht=U4MS+2&&c3^e#AT@?I4glbfgnHpsrl)1r1tE9=n&O)^Zi)b6 z7Zb6mSuXn(wB<8V^sMs>d#Y5KFBVC@q4^xM3CQaRoAEMxGHAlBjQiH{MUXxfLExYR zo$lMwC77^z()+j-15O+xZ{Ptms3b}v@2#xVm?oe!$U~>x`$m6a=i?EP6D1}Fq{DRZ zc%GI?>)C#WKZt!l@e_0&M%XKw2!Pdn?-T(zVOa$tcZkQw3}>xK5yzv7fLw+kRQyN{ zCtMy!8jq)|hLYd!bO0gz5E?mZ*=C7$NudROA%#{m{wU_pQkKH4l*s8)rAi8n}b zu&C-F?vX%d*e0`e*?yEf-f`=8vkC+tSk%&u-Yn8h48aYU7u&W`Dp_;#T>e0^CmnV= zr^YSbZwsnvv1*}d$M#(ED8VSJ$+o#WyY{?NtqLm{1e*&UT`<|8aKbBaq9gx#RSZoJ zN&m@QCZQr67+pK**t>`|e^19^DM}yIFX-91oWbk`_V48VrLu=SRR%>s)z_nFTZs@~ z(b0tOP@%dIKHz6A@YcFSyha70FBoa1OYAr1?K9F2gs3pza7+7>V2 zg;#3cTYN7YydxpVKD|Q5UkPhg#p#@xBQM4y>Nz0Z+jeWDm;#BbF!TUm4DoGfBY^jc0Mh=4ZNrskV0VWvBtl504qB2npRPJjOVr zXd{5j1~=6B3oP6zxk958oxB1!Ph9s|SPj#T(bsVFEP5Dp88dWD161Zl&XkeON@d8=J3Q8+9e( zJNgKWH$#N|p1BLa&L#a74qiYgAW!rMWMYVE!E5VI^l{K+!F?(C+X#khqD12)! z%C|-Lt+$v;LeN^GYNKM)8kxYldUV_aK&+Q^1=IAV2nmt z`Thvh%_3v`wP^_lbv`a;qQSu|L)@vAva$=V^oHaGVaYD@(&kD+xCfPCtCfFAhdPc4 zm$i*VR5Zd;4KVzvzBU9w;?O@er5y~px#$FiRd56lGNNlTpweUyjFqEnn_e%>Mst%L zgvr|Qaeq(g_&d=|Wd!V^@Un8lXmUld*}4Gvw^#w(MPpX0XO6$*9edXT8y7w9vjWb^ zR)BhyGRE3mst%0<@Znmpcfxh>IK4W6mFVs+Xr5tjcbAR;?Jfv;_#q?siO2x&-t`on z=(f8d3QO9&j*N=sE0C}FsL+?A)V!UmNfUS$N3*-#L!GU4xwgPio% z!xF;}=VS|##Mmiw2*zIIyNEawU9o+DI>+T^ft749)R`pnurdw+HK|-7a_) z2z&KSue$-?EZE|N7bpVtAK(WqsbX~_>p%h?+kQZ!NOkE@4CyLPo%;%GAw2*He6D%6 z22TYXVnjuZK|I$3EMQ}f63r7m_2h0!K~kJT2HzcS!o(Z+BkuXI{r<3n{|{?=nW|t& z2ZA7&0?CnW2Lu;v_>k%bXaribnp+h+H>jewIrXl00(_8SjL@+}10m=3T|pjuNDxoq z&(=YVY}s+?B)|43=j=M8Q-LMywqOYBPnT|hir$=&oWY7y+Q5qdR=Y-jO4m-{ z$DSE;h6)bz{FpPlFWXUr99S6huxe#L&iWv|=s7HIv7weUvsa~j3eUew$yQEfO%3@- z=)RN9n5?nPb;wz$h`Ae~X+GT(z;5Uty{u~GCvUq1`xd0cdw~y{Mg}u?SSJsr)5c&R zV6DwhmuJe;n@JcL4eUCNGQ6tgOqQK@24ndGFkhX)m?Bzj!)|h$+G+LcQQISf?J6S8 z;%)2ktVLDd9*?a#f}UNS%R!xlpRB8dYBJmP`a)wmsw~4 z&OqQl>0br67{Y-ciQpM+=uAHqsx~I?$#HXdh+S#b%4?;$2mJ3v>ER>)7mqLa1Al)j zg9Er_Lvy7c*v{k9+;^-$=jwkRMq2H&@esRrIvn=8Gw1#0F`#zxIJ6wv5OrSJ{S2Vy z&w%@6pt1;sTI~>kBNq*vHHPgWY^KXgdSps(s30y?7KZ)K%n~h=t2d5ga0VO3%ky?? zcvvexddx7^g3)x)MzVk+P5BZ`Os@h)1w<9Eg=?e-SHxGO-fKqSJLo zioj*+BJF#1vf}w6h!s^<`rv2w@E}19Cx}Jch>|E`E^cGrqCH5y30{8g6p&zlyZ(aO zRVAO`dNN%`c=TzIv%LXK-P9zD0zGjag%z+vW~HCELO6^2mA#|mE2vJdJ{)K7@z49K zW9TISf<9vhwBI=CMBR#|26@Wt*(hb^?z9le1hMEP_!O~E}L(OT(l11o}v`JmLG z$p8XWXA2=fgRS5P(|-aNe3Ahr zGB3RoB{@hn(5#GBm8V(3xS~;z`?NWX0in=)3^FvObZb@hclaCdTB8XIwz@g^FtA!gY8lN zt%54qet|1LM#BKjM5@)gXj5*&2r>#c;i-sclx=_e*G=d!*Pq3cPfAaGcBJXEQlF95licZ;BLVJcdjLx0z00Ui>iG&<7SMNwBc@*Q!gJY za#oIdjJc~}uLmdL{)~M?R+dKDY_w`+YEq51l=Bd+jggvtgxfM*oC@R(Wswd=ViK4w z&9qgpivZ(|vg9VIl@FRsNs9x-L#8!U%`9gsnn2-9b=Ey~8AzYOq7M;9iOeC)@^E{( z)#$9>co|GyikbKQ9)t@Rky0NQ1K)S@{IB!;XP@WJV(vUY|LXIscdK0bkfe1i$g9$N z6!=n)HX`)eUxcbSce*Jh_x`A8C}>V`<@&?yOM#*rD}|xCzmRrY?M~-y7b2{2)LkDk z1=t-F$-0|~viP30akxW(Kpv)dDWU{KlNxsfpanQB6;Q)CRKSIcbv`j)y1$6{F%hK$ zWJpPXBesQ95q34g0>ZzJ;)P`L1adslPdl4j5Z)mP4vvNzvb)10`=x9)$u5^J}dsr~2q-jhXP1_+YYLjy0 zn}@P+7)<=_AsMl0q$U4C;UGfQ@dn)>YTT!=8vc1gz`1iWG9m-b$>YHm`%cD+ZO8Xh z=vU5XVKt&Dh3;{y>xfCGf|i5Xf(WMt(wLtPbRhIu45b-#drn*)9amF*?)sz0&LQat z5LCE}_Ve5*$!Rj#kmHL$5T;{b#pN2LqCl><&mTt-H##|BPJqbMlNW2lz6OEAC?ieF zhmel<0r0MBEJD1wW~d~>Bph061F}Tem&*Z#OBj?R;l>4a1c^oC^!)OQEb;wZxF`2T zeYpt9f=Y*mzi9lJS*A>_T&m=_HV0(sStp4}Z`_mG;!5EKWEfq*4p;s*_rpV&KGXM0 zL$Ys|-<>{u@bGU){UQ%PxQAsve42ky-hr;|7g05?XYY|mty10w-}uYyhaU1c;3!U) zcTf~&V_}9zuY;rlQSbZNai@uh@%>*C@SI8ye2i4F7q2;InP;;1TDrP;?NDyi>M0ep z!NHHNo(#tgMT)pPn=Bcr=3ER-aV8~uhD{`dwbD+c#;7+_f7DdT<%Q_vbkTMUBV4|< zcE8{2&m6+30CbrePe8f@zHr>hq8W04HX&P1*oX8=f z8jor_7GJGVqp~jA9+>MyGUoZ}<$O>Q(QT|XUMn=x21NqO^Xs2O!!5dvXHX2aEQuM0 z+t_<;ni8n2qxaQX8Rz<-6! zztelu?&Bl4@K2vf4`}9TnRX zvyC=;M$laOY3S6Z{0%fGu$&xTz<&W=?l?^ssinA8KW2=!GE$%mN(raZ`AS9^n6awB zK!zsZP2GirNY&UMk7l1k-hTMz#mipzCAGjTi+};#5UkKtxi+CZ6^jj`hJ1yca_yTZ zO}91NNupft4aFiy8Mn3hv@E!9ua|7TruLG>pi|cXQrI>1A!3ASeAlz?_jj$iPa~cV=FRQu{*qSqdJG=1*W2EF-6$^{wPuz9K_b&%F7LoK8PP0WL-Zk( zE#ifupp<$(@gvm%H-CMR9Sm9heQ)D*k69t*g*MIF>(mS63g{atG2a=^ga)3IjSAKI zF{&+JeO-`Pr)l>WnR)9@xa1Xd|1xzzE~Y=y)Zy2oc!}*a;icJ4{ErSx`s>kn$^Lb6 zd`B+e{S$WqCx>@ZBnocM{5C)Hj|Ve9?Eby7gB-FyMzaSpY2Eo+LyxT0W|k~tF%j*x z*Uvz&ble|3dS zwl{Ov;}j=Er_S6#6V9X>YXep{$;a3D=RKcZFJ1S6Dj7ES zHkd*FVR8i0sOEx_lTpi{fQp*Xj*y}1hz-5xE!aMRF$I7Lc7Mn_j|9(9k(3j{%>rG2 zp7jw9EgMQd2#~OU7{7of>wMv~Kj`(h5YSe+8dxlGOpM+2s@u7Udw1^|O9C~mVLolwuGJeW*9$#~!!`kHluy@pqThcd)n1c!pxqjNo2Gom0lP!Fuu{#eS zfD=!q9qFo~4uR|#Rj=a=7SWX1v?Vg4a48(0>A3M z1yt{!VucykOpodYR*{j-B+}WiiS6#|^c6NndaNO=Y?yf%Zf|6`y>Y`OHG0E1Rj9NW zNZ_EG0?BBX!totP6(g##7X*1WB@`5`Fbv#GY`mTwWawZYHfNK*RL~-#OrIVd-!Mog zh5iG3d@n$WaLCXWdB%um53%U>Ku&=rj6M*IwMKadNxFyqCJ^|b_Ulmv|6K~bwQ&p< zu^d*u#?2f;EU>YfwGBJ?4ca*{EZv3tmbg_hJUzjk8h2HVS$T0j%8AsI0>j|yA#)%!m zA$_E!+=pUo;3&qfOs-PAJh>0W*48GpwwA$cbYx)RE!u(1_7pB2dY~pW|a%*N-+ zQ2|`X)c`AQiTozCnUi!XQG;t+zTvKbL>*+wFp4`C3?Cd1_pqrFP<2M>{6Z4A# zAYTGeZ;Rq~m&L{(g=l#t3S;?pry{Cm;oA2cdGGF;*y5I&LCmZCS-AbdhC7J29d@dR>L|S#6ZS z$Wbm2wrtp=C6OpVqE#pI6AY#7%|;OP3%m34UjmyyTPeOf7q;009bWz?2yAxeCJAiX z7hzTq#QgjR31aLJgDC_=k3*^|r;sZ?3_#=)6csR*K2RXfdmWx(ib$Yr9Xw6H`xdhG zC+QClXdtgKJJAZ>Jxw3~O+J15Jpx_DUvLQL{`SM@%ZCpiMuMKN6Ysd8jhQ9J`~N@j zj@pdIh?;t~Gs#W!kuGEbC&qeh7;+S2trp}@A=S=>ES8p`vU|# zGXO%3=|=kTe}$;W&1h4!W3k95|D_;e$$y+&4Zb;FCvrg=l|MolusioTNdRJ82+eVW zKp++h-CiK@I~u-`+x{Kxenvd-J6isq#m@h+jQH<^4R=~Q`AU5OU7z;J#nFr07y zVmSY7hI4To!-<#w2@L1rM27QKG%GNiZ~tOAzs#P%A@RQ$PPHfa0~pR%WHZTis@0cL zCc4gl4x4Gwnm;tpnwqq{oP2;KAoFeg=d+uC2s^j<7dxj`OQMkei=F!#z3N}=+!)TG zz|KJz_Js<#zgQb@SQm851vPY}iuziG+sD6H8<=s^5EAabUJDmg1zrOqYyDZ>-E}2e z&;o07z8{=s7KF_Su>rUKVsrj%Hs?Ig5NwSy1d4Lt(*;zec80f%EOOS)&JlJ?jDwx) zqyBIKD8>p=CL6Gd2}rO{6@%1*k*a7f7798Gm7c9<19-v>HsSR>Y#+N&4*G5N2)R08 z*ux>yKLxps;dXR5XGG~|Jc1B$xu3nK6GDF_>mYDcUY#o8nm3dswxDt6|%Vp4otbyCjaIP4$f$9aR|8;pF% zlHxgQO0iFU27t_($YvNUnDU@%84E@s6{gqT9P{F|XtAL??iY8AVU=09Mjgwd1(IZf zm=hQ@}w;el|KAK-0FX(j{fSW_B3xHIav zRJ5hhZ7OZS3#oVRKdQ{~xCbdEB$jG@17D}3_C5rY5(Q#JDv2}Cu;3CO(_s?W4vCy4LkBCLrfB9Rv;QNk{5`hn5p~;8pW3c%fZ!!MjzX@Y73*4ey}g$(4(d4nW$? z(0>o9sEP{)b4vnZ-nls$Vr7uiC1I!~#0-F3J+nBo>TXa|e?WCBeHmoc$sp`r@@quQ zMIMX|L?<3xpidZJA`~+{E+c>I*T?ZrAGEVh%XYDBVI2gw;Jz(MTCVsd@R)f+ybO0% z!C5%kta2$Wm6OjEjkOx^wx6*MVX^>b4h!?^or+EfW@pPVDU;zbT5~)yXpeYlBX%=_ z-V%*@AUq$$^F;^ZOmEw?i8_c^ig0!?s$W#kerewU_S(eoUpmji;4$1Utf62-Y(n?} zL?i#ym5GY_cD?`hL)rCW%(MF%^3iM#D zC*Tl;$IXpb0qL`Y<|D!1F(Tv}XCZeKgj5sj+`N45_MBY(#$g{BINyHc zFoKUqj^HelyS|Z5`JE$&$GSgXw;#Qy4+K>h**qU4?1B6|1NljAmvnXCol(bzKtITJT`Y-sw&@~qAMbcxsw5NTDG+Y=MNQT_& zsArQHgOZT&)q?JjhU8js-Y*dose}J3G|C?w8s#6+5`(k)WmF^JeKKzqPFDO7gX+k_ zdG(4ZRg`jq2``|+;u{OOD)Et#*)ZEfz{vd!!521=RFlz?A&_uUEEga_%_aC4Z3bcm zhP6~78$;DeBO-weF)Yc%*P>V(>|vzm6ldq*g9jsxq4{x&jZvwj-H7v(MafdpyXa$1<)e`H zGf$ls5y+F@dAa^5rjgrSt?2ZaMQuTn7@e*2Hhu`%pVy2U2N8#1$*~g10U7jGMmjB1 zOq+B_GPL;5A^$l8!Ux|#UI7|3FcN#tlon*>pmGN94Ty#IkjDs-X`xB2c#>e(Z_6&` z-xX;K&i@`Wx-$?5{QN{3i6E9nv}}g!29=@D?HH{x-Et3yPAZYkJ$PXG0?T_)6@Dzs z0X<63ws&_#7mQAi?%rLVtL#Du&V*gZ%%MD-NJx+1;8=WRaz)CGcCmYt8u66$k*7z6 z(@!vxGL})6Sfp!5iY`8;M_gWg53bA1lx1x{R%fv?`LyllT5TcyxP88pEOMe#nBqC6 zSjDp!-Ywj{yPy&>4OuG7xtQ9!;#RHstwLLCDi@Pv@Qb$Ga0Yd&t(h)+&auuOu>-48TY9I_N;eWkaJ9JMd1fnE;ki1Cu>hn)t*k;$~!5M&D z=$AIq7u)kY$wj(Z*{BlMF6f%C$E_-V94eiBQVBYZiL-NS z5ANK5A42>33`ym8@5<9iDB}1}Xtv~Tt1#D+MJxvO)dp3C<2*B0%&>&`#KYc;9;}QO zBxbx%0}h2#{N8E{2iY2Wsaf(il1vzsRsZg$(P*YYZ|BYyP#-CzV9s5M`)} zd*l3|{wj)jLB(*cFirl2ixf5@y)1s6l*$0*U})vfMbQ{W!jKq~7g0yNVgSaPT|Q6Y zNthz}mZSfayUC9Vr7)q~oN-{u*P1utZKy!$FHZn+ba~Rxs5#yZF1wNAp2f^U$-IFY z_>tPHcjIuxZ=23$;%(O?%8d#_M8kAV@=1u)6((^VtOzI<}~+d7hvY`t*tVg z*#QF1v81%vW^h4fZx(6oS2U@_659g_$|%;ZL20YY;rU(>1yl86EymSy*VR+%G+SxQ z>-me?=Fi;+Us==N2Lp!R$|*5H7#a+Iu5D5UM@p;}uFt$S{5qM~(inOb$$o+o@h~|P zTDnNR;ws?1u?LursMlmO#~bWbC(Uec`)CK($KikD!XpSZxE)I7H%B-ZzXjzu8acII zM~$hYT!?Z(MU$pEaoJZ-l%})Y8v=rB-9$zdh*`pQ&C9jr)KaL1?U74wKK-JB-@Th3 zIF^6j@lrel$U*$yb_l$N5gBj&wg?6uhe;dr|K|0sOc9O8*&E6qtzt@|0Ja7fxOTIDMAKdy!wm(&RrGxB2U=G zif!rdFZHu}pm{;CN^*9abkZyIiyS7_1bFgQs_n}lUACX?VL2^yfC4N?TGl1J6%<5-+1_OZKmsf{HN)@Sr z;hZTO)VN^?FTk8=sh`FA!qq`iZjkb#x2-if{6tr|)_0_U5EK#PDB#SOu7E&M&S--^ zRPq+i0dBppP;)m8a2;03x9%G4!b#@C93&tdNfr6vF!bt8?SJ9|2qM7LhNxuIjp);n zIoy7hH>~_BCMLAbEjz^AZfI>(ktqqRbAUuO)rL&9G=J7?!x*Ro<6)82K-g;V%l$xz z+cB$H6tO8-bR22p8h8qHRq4bh;^B@_%ab8_tdAtAkj$ZB(ZV)WmpO=v87Lvh05KAT2W^8-}09#Hqf-ITcbG$3+oV z&f*KHB*kp1Jgswtx*ifLpdx)AA7On1s(0waG`mF#7L|$3G3J8Jn$AW zH|1b&=&AteVYZNcSGJV|Q8qFGj)Gn7j$GP>>+l@Vz1-{jq(8Z_35!Fkava(+ky5## z1Em%R7rXLqxC&-nA;G>Qr34Md#pcbA3E36<5RE|&U2J%y3dMYKg-9JDQnw8G!Q^jV zuDI?;Zel{=s{v5{s`wp8uo?cQoQm| ze`mRrZ@R9dHHDZ_!AJzUK`TWl8(%$v}=GW%;jI}L{+!E}TNF9r&l4c!B1mQ;LiaO7>0J4r0nUK}cve!q9 zj1-qIe;zeIF_&3t!BZvAw*taJhGc5R*j4Fc>2H}9zFLGLIF zR%i5t)-~+UiuVInX{b*;Z2)}@Q7*6jFMc{iia2D^k`MOG*WR7vC0u9aW9|(>J03J6 z;N=F)!=^#^W_2l;{dBe4%07ibd&`PacXZI*$%BR+^|(PJF0%81nKbBnAEk*Gdh{0+q--iG|%8>RG4E6`ND@0yW{*36q5dPW_i;b})y=^1^`O)cb8iq<&U24 z_nS!N;q7kec?0o-FP=89udec6{S5`3VyRg*Oz#o^$D??dLJAA`!G`)7y5I*r#D`cSO-*9wwMrb1k9R~1D#{3#Tkn$Cy>_<(w;J&j4W{7-%`@a=8X~YaJxv~bi&!}F@Lk#M z`aHAFj}^ak+PVBza$uC+bPL-kyQgwZNf~2*3dJV(;hbAUv|z3(HXN0>NUza)=Y#lg zQKEevFjMHW&Z%WLRr#K5IbY81Vci73VUd_Mgk73%3ee2 zFnMm{_+RV{aP5V0=S~(B4?+Y*QSU;f-=dQ-#tKUS_+oPfcA7=pT*Mpc`v*((Mw$o| zVK{`^!8cNAs|a*ydazgQQ`jq!l({FelGhq*~j09 z50ZoU1i+I-1yb}y%giTlYOYS_5-2*>PLz9PkT`P$0e_<04*ZlH+v8YJ^wgM|t92Vw zl>!5qk@PLRGjRzSlfswb*wX$29#f+~wuar#h>ioU6Im6*Z-mCd@6cjZG7+3aTMQ-y zxZ(?$5SQC@MJc@iFyiHtoQWqNHlU)vF(NIv0lF}ojl>oZ+YsmFK8p+3rO+j{PU6R2 zgRzbjqKyESrsD-|Vk)a?JlA?U;vj z-%YT#Nu_sT0#Y2M{;283tCP}~Y;CS0A#4CINP5hhpJFCrA$IDn4QZU5EhdLm zp#+#SWq(jjscHA(4U<|cN99*-;#kW;QJq&puPBbAxyGbf4AZ*8*zeyI>}-{ z51r zkfxm?YE;WwSxZFK<@ocDWe_BpOdwnV;Ym- z@&uQ@tJim+%H|8w{@ffOq`u^Oc6q(y0zh##6!)tIdTDL~+8gQExG3RG#@D0p8|DTG zY6LvoOb1Z55TxS5z|a~nA$}Q8687#&0$;`o4tRr!GNjg|8iTO=^GOPDkfZ!k0)rJ| zYd=H8Wd;Vryr!n`SB|F8;QbU-_{)7qg%6WUSp9$o6JyNIGJt_kKReNsI@jv7yivRw z1*ci#OpZ*yYT{a~rcZ&Oy)c<00z&tb%U4bZxkxZ<^Be^oFx-N9Q*-VQFxE?a`Nx$IaKVhw9EC2*F=EVjpkg7>q$yvUFW<$}wj2 zWnEQL5N@<#YJ)nW*JrKmA zlBAs!9wM?<{V@HXW!DMc-1o{iy z#Hk5}>WJ^o-Ovh{&l%lIzNmfBS^p-cdD*E{t#$>FQJ?Yr|3iiBLsW_;O4?+P)`o6g-fX3U=pMMEzx(xG@&_x2U&&e98FLNty`heUE8*8#$~F$4*w z5A{<`KV{t((#ldvTr0yO&sI*O${$ukREl?9grb0AYx+!1f#8gBJ8>l4A`5UhBv?&) zOK~G{LAhW%bmv7VcSXL~XYLEo}rqBnv^99_@m$?G0%RanV{)(J(^+FMmPKU0u0Tip%{0&PHKbsn)kk zji6P7^OCx`TRkIE`CN zU%kimH^r_9;di_>1q*cmZ?=`mU9`WR;N(XtJ9B{QtFg z_FrurNx%Qyf5lkYlOrXAj7)4N!de~&9NURWVj%YJ`uMN{$wom)Mk63HaR2uEsjBXt zp3z8PKllB)yL;AXrl;S#-n!~rdD*PPn$;J+O+_EhtI2=R4ev~Kw>Q^A6lQ$4hUt+Q z)|9o-S<_tHZxk7K=0^FMd#3zGP?zT@UmmBh>=F^#?KzqJymJ(Zu*$ZMq67g~SMjfyxL@kh zdqMZS@plNmn1=_Wv;KN!Gl9e*#NeRQe;c=={W`Fj+{4^Gg-LIYN0?9%n}Ah2h&mt$ zYxz>Zgup&=oa)6$a-w-P%ncEWPnJ6q znNy&YS#?suF4J5X=0@pvvEGSmtE*iqfiI4ALLDs{r@DKN3iFcx$ko+0Ri4CCv>_L%wRC=CbzDDtfCOC>6D~X;+hz-^2h|35@ zL@nHQ%r!wg^zo95RjPL#4v%c1VdpXyg>s=h9LULrp(-gGl)l$px4~zL=EjR3=N;y7 z1kM2G_PisM@I1fqW^cNwI%sx>gKoCr{xwCfeGsh{G6>Yl2o@qe_g0REWO4&^o%;Qm z4>Rw4Xh!WY-W||LfKyU{CvY@DAG{&@%`c4D3Wkj~nu^TOtH_uCbxRbfSEp)S8ciqT z?4#)e{znpenw}K8)i^18Y`Q$PYnK8KrUYSU(Aiz8e zS|HnZN+7D8zQR9K^`a;z_c7@epWr7dJJj@4FJr2nDq3krn&n@- zOwm`3SZi@{(qwbf7d4;-$4+ligGvZfj1=n{U7$qrU%RnxCiVfviu>rBDo@ zxY3(?Apo14On=r8hB-ZcG{R}qEFG?o9%Bz7Pz|N!+i%~2fiZ*x)Z)JDgJR$HQPlUw zdSeWS9=_{{vtxII8IoU6hPEvMs9*8`8s(Q{BWsJE^v&vB)lBaGH=G*3l_!m0a*+OS zTwaSCt!%m7q6j39{=aYT|6p+XXWfoJUAO@|s>H+p8-(X)-9^Ilt2lDqdqMbdCS9QJ z{ZPm8&BA13+!pQ>VI^ad%LExeFgM=UF$8hqf5$F3$WYAla1jt+qZ^zdAk3Fyq&^Zv zWx(3`?M+UwfUJHH8$)_=>FLpAe6h6nkrY2~_Qs?B#<+fNoTJh1hCiF&nU2I4p>cgA z{>mdaS@7eltGC$QtV{F=F7iup!c2A|F2HW;NhpZ!7xNWJ-WZ$T*DZnq=xH*3+X^94 z@;ClklUc?=##$`@aQT|zr=Dh>KW2atFeB|@eN`MEse?aTXxOT~^Y?x6`7#Q>J3BcT zLxF031%;7kZ|$+f?vPbx44L+?^NlRFeHdt#bC4l&ieLLso|$wzzgK??IMBP|y6^?# z9l4>(2HB%ydWlr8J?j&gjOR!2rgc zBbmYbgsZzj%Wr<^Y=}rG)>wN5!x}qh|3_LHwftOFd5Qrml zl%y??M!5wT^~Iyp3P0ek*_Y}vN(#{I>boE_TCqp%Be5OeZ~t*D_~qPdvuEr_UKF{n zORDF#>^O=`5qOr2+J(ko{usaYzXG^E0kQY#dy3O^C@sI>xNZ*R3liVtMei4i-iL46 zJctqYsNtF!zrFuXKDuFsu8-jH8VI5}MeTlw9nF+KWGjmReU0c$q{!?Nn-;&^*uQ?@ zcC-xFoy)MO>_mC&ZqA-0bznUolvPxx+mK|=ogiri4ngWE;%%i zD(aNnbxXfo!$A^Kp9%@Te33~Yumw>1)sWy(*^P{azjQeAufHrvCfB%bL=ufNg*&>| z&1R!Rt}~UmRMVcSl0t??q~KD0sV|7!YU9R$?g?h0Vz!wC!LZQiSoI#mGY63tL~fSPTxAgDY&_%=r`Iqh z>&psn8Q1+8GO9Qf_KKEyo&FZDb*>WspKsAi-<)>V9;~LD3_#-@QS9n}BR8yzE)q8= zEGy1@zM9@|q^(sww|w!q_0VlzW0-Ginmcar>SeOpY<=HcO^A|6y6@TOe(N5Rw49g- zLXq*Am>vOK-aVWqtp^EA7Tz(?Y3pG^+?N&U|Z z@4&(NBu&mnACEtz2~pII6qNcQ->YK-Ou8$u#BC}&nobc@?%n%9b7$fod2;W=r2Fyc zbZGzLH*xP^I6k;{LXOV<Aga(zZok+PGio#IzVBncBHAPl0Nzb!V%(7# zWrL5VFS2cL`lo%YoP6TL`lS?}U@l-q<8~^57j~tl@XaMR{~jxfEBTT7*oK23MWX`2 z7KY@`2p^njdbR6I>XSM zeDexLHnoU1|4%e1VI{M4pM(>~=|#GkZlycvc6zE_f}V{2(y|o`pM8Sfm=N~KWQ8DW zsq0B`EfK7M2w=raYn<-e)9%@HEVC(b-f{uSEu3u(H|$gK>Pt^zzePIjVw;ZR$3D90 zB7O)i1wd54%Yn{t1=G0ubTcjyyg$T%obG~L!sQf6P3oJSU5n?*9U6nHhLo*u;(zOA zpwluDu;s09@jFUYnD8{?Jg6_UB*w6xl$e?2oKi*UdDs%9@moLi{vUMaPglHih}7lnRmZ{!5Bi;F z>&N}a2fj2v{H4QYzjM%kd)$AQUi3Sgc*b?7N9k+*Q$~?~oXS({NcwZXgQQyD?5A&Q zQV=RHh4{w`Nd6Tj^1=ySultdR^;E`EuR&+9Dgu2C(<7(pI1%ju+zVKZR3%wYafO=B z(uCN_cuYr(>|=h987p|QTzdDgA-KcuBU8}zwxeHxM2 z>J8t@H@seQpLD0326UwQmPjsom-L^h<(0}m4b(N!2=DtNy3_eY*Wmnf=Q6h5ws$yg zZ`U}!_W7Fse0$;NH;!_yW?{-d# z$51m-y%u$w(2;P$h4321+t_X6{BR*g`3&bh^U-lX1fQZ&KfaA`VPpM*Dv#NwuKla4 z6WNW{@`aOPHm%pM9ajk*-|Ez7oy}s$H)VWt9iQbLCtXxcU9*IaMOf^G@yr0~^FujmX>9UE^h;v!|W zKP~C(Y2MjSe11x2U0YXI+j(a{6*`-5o$Wqhs@40ZYRAkvyHU@TJKRO;lNsHod=Q7c zpXT~*-i5-B;j(UDBuSN@3>#4JGxCnf^jW{i*h!kVoRuL!NqaNe+cyTO<$gkN&+5CO z(gM?+f0~6yu62`kg9IRi@>B$z_U<(z>%4HNFKg+pyb1WL3P?Kvm#~&A*=>=;eG$KC*Zh6=dO#P=*uR}HJv$)Tp5$~>*AAMCh--zV#?vl?%q;I#eEkdpy_w z!on3s!DQ)ajpw0IdL87NS)sz`1N2AST_*?}sQWuOi1wo#!7So#v)k)EJx54*i2yBz z@p|o0z)t}rZ0TEaYlpeER9)2LaDvEZ(!5aC2#Cm zEK(TfnAaR-KkQGOLiuF6c{a%q9qnLN4>%tKGsaPb-4`g&ZnF@lj{%W6>}HvqJrU+h z?}fY+K4^y0C>ENGQNQ#Ax?Eaucc1TVzeK|<(te>6Wc!qza?;rs8Yb5sP@Q#hW@3a0 zWch!NDWHBLWcSwR=F9B@Pzq>Ne(()-V{3dEQ7G>5>@Lcm^6@At7FnF*lbM&`f+6R_ zvH4=2h21ocg*8c4OO|9o2jV?${dJmczD*a7-IrWCe6J{nejk}`{d;%Rhv1CnXP{JI z&cd^>rs52gs%bC!ES>@L0die7NheU8z)X?)V;-T!Ae1QtGk%_P6Cwt&LFckcei{;cuz7Fmb54E!<=i&$8$K_>G3TsbV;u{N+7Q~MVqP_m zI2oU18uwO9S*u%=J^M()44Fs~CTU6jxn2(+&hxkhEi5Q#)knmNUC|fypREy(DkcT_ z1hmOME1bAs2+LpJZVJPO+=4s!w0Kh%6WAr7jC0+qjnzWcVtvfhIE_yY+}$h zN{688Dgf7t1+$~wZ_hr507ZTMvcXfq?dT6w{xZ(;`0^`R~Van-O0>e*wJ2%WfghkWsEOty|tiqare5Z z_1$8L&*lTfdq?_4u`(GMJJ{2|QfCaHfRpa|#XnaFFv?|^i+lyPlwWLB@rzCP#jJC8 zRpp_bYC&eZv*kF1HnG!KIp(f!$33%ttZc8JK7P1L2wX0EmpW`~H@Bqry(C0z-}v#| zinxzI>lBr`WmPOBu9c;|1htvZapQ6(Xd^d_exKuh3+g2Z0~oSzRaPh+_ih(P={7%$ z(#0(-p>&&2I;Z!M4nT0&`=E12?nUPOSoR21@dN*cN&ob0FzMqKn7EG!tI z^Y#TU`$MrG5{;yZRPbog*eg%IviQ^RaIQPy4bDH}{AV<=@UeR|_o;i%hv(`wD1K2` zp~SWkw>^$cm2Iq>{!X|wF@N%D-qk0LrgqvD_S+Nh|K#Vh{M+b^rW~B zrJ8CIyHlG^&U_x4J>o3gj2CITw40A_Pda6)+95L6* z_sV?JQRxMBR#I54{yz3@e^hL`oxo7;R#l;BZwcl^EOxj>o1+GC8EZ+=r)`6Zlrmpn z!TF4P8+D{mf$N0?%~foU_RF+vxhapj^ge1wPH4R5CeSaK|L9Db=q@Y!<}|(i4KU$R z={Q8`NWgixi_aOPfc;uXdI<=T*le*8sH404RvixtpR&T>gcPHdCJkcI1lZ$mr;YaC zU>m`swA8{VZUIZb1C0vaU|WNpx`X8{I`pDYBKV6TDmizY=ynhyW~bLV$|#q!Ok3Vd zK(Lt%6iSewCd%o4JSEH8sD~fl2lXt1$;y3<>)ju}?mqeH>3-9byS#IMEnSE zr6xDR>U#2*p&)e(13Q7$ii>*{JExq)cNbntX+J|zgTyuD&pDJ}B=EJcmuO~9bU|7z zKGqqzy6P357F)GzkaMeT?#30D!Crhi!nbTBIB49@Ugx|xAorbj#gqskzv|KPio{Rr zgDsL1D`lweBziZtf{8EmM{k1gWG*%8nQS-JxgdFRSYJ4;TR~t+3-!Qv{X(>lN^s7x z3qdpr!k{9e8!X0xXjJuF78(&t0^bXi1?yDtlm}V?LHpw)o>c`~sP2Fg9dcfLLX)z( z z)=P9!LoPZf6v#{6+$-Z{U_H-U^_NiDm*Wo-%XW1YRb9+5Ze^5j5I1#GeS3KKkuUJ3 zDqS(-Mhlz%aF$+HE5A2t4q&$COOY2e{oH1A zCmi3VKB;JMJ8w{nd`WA;slzuW4=UQ)%-fO@U(!_Jmd`i0OFp{fx!uf#>GQvty;8!H zsato>w#YER4uw>*a8qIJ~}&m~mDlIa=ga#hTiQs+7pvYYnaPvbGJ_+qK< zbuQoZ4~{{Qmm8#r;P-=EpT1xC>KgWY*&7f+-NhRXFMn}YxR6__xT=UgsjzsB8XEhe zzd`8-Br9sX{KaFW`i)w`*7f~&U3^@AF{B7xm>tMS!!k^#w zvvz-N_2XZ)^wSF{%3tkA*PuT~b(9p1-^9EIX7f>h@Zo6M-g7AqO|C0yj!uCwAOzB>8cY%2$aG%fbL_nu+5y|KkhV1%L1`Ag{`#gaM0H2s>LLMZ zHY4ie;CeAhI3?%i{2&T$;4*+BJB+$pc;R?z^jbMh#A2gYp4H$9=Wu(Kz{P1~=I^K( zks*g_Mc(jW?Y`KuZ;Md|OU7QS$O98^^ydR`)2dRw6zNJ4C3tf<#+5kG6U#@_dVsRK zgfP$J2HSboRa`cLxm>Oo@VTM>((gd=9WUN1AZ%BZ|h$ z>0OFs!RcrGN`C9|=Q|Ay1@^PkOTsqO80SWMH+mOQA35*KPRtDpF05h6f^TsPTuMD8 z4JJI-do8un#aZPg-+ac(FP_qcWW?4#b~Y%{kx)Q7yfr?TY8RQXmA9A%KEyTq&S46#Hk4v=`oA@6Jm&bjUZ zufi2xL2)EtJK7}L7?U9F#Zx4|-NqZ0-1W@sFD_hJfJ$}ZLl{~7Me&Uk^**(QQvM+Y zydbBYiVGE9P%xL;;!^ojiueN;7qAKUZ=5}F@2C%KVKkq8T^4eKE0HX6?2_x@Q* z*iCroOIyn6tWqw=^X#e*5GysyCqZZ^LSK(a-c ze(l|FkxO>C!suty#fcryNpQ~PrdbA#I^g~ zb&HuuPsmL*7zwasyLMk>+J$ptJMs%>ro63}aihVkicb4YY#k_&>Nzs&%jTCB4okaY z^Vl2KSt>4*D8C;>I;lp>yD#szFf{G0zYE$y1C zM8#BDL$@Z8@*$drZA0#A#xaG2LY(slJ=wI|FPlt#c z6e)8S@@BNN43{X^F%y3J0aUlbVpWDyiQU3zGkm75%-EWJH}RtkNRc zec6a_P|9x5!euB$*{^0QI4>4xWh4)NWEy$NOpTX=3KB+cfyFm4}g zx3GYCPY5)&&lpp*==0JuyZLtAb*fhFd8?HQ&6`bY!OL>f7S3C^grt2V+{;^!30tY{ z%2&5&nR7qs#|h)zm2A}{yX(HHSLK$tOVN7$z3hUiaWyV@dsC&AV|G!LTCBL`2n`h8;c8nKr^_l#+e2W&St{buag8Txg23Or8RP z%VfQqWF&H@i!Ejpu*>Yu$K5Pb*{l30;h@Mh<~YAC%rT7YD-bqy=q}_8i}~14v?O84 z@8b-3Ba5=I0POD7m0+pLKzjf!903SeNDdMKCM%GQ0wsHNd~;wJ^Tp(N4-FOvnUCX4 z8d8&UeeYXIH&K38?|s{O;-R;}u8sJvEXIqG471jht@3Y>_^Z=t5(_Lws(A@&F&n_!HY6?b4`=qK|?sX~2e4q1F~P(VJjwfe}1iob5<=2JPJ?LY7l zAuXGn#k>7AV8k4S&0Sa_Fa|DD`^lU>6N0N0Rn2XwuE!MvPzu5W6lJyIQr$(M}44Ux87$)5F_zh_i<^q=c7l6=1Fu zIK>H9!)x3c4E#i!z@^4@1V>8;k0S`g1t%?`kfkcUD}-|!4Ljk8!^&hBx?;SbxBNZ> zT+jT&Y+W*+s7vTq@$~QOc~(x4pMIRh3_umx+xwG&RVAmz<5amWht3(7Ab~6>q@TQDN1bDtG% zHmF0S~3U@7np*krMw-Zm?()jYzp(b(h@9^t#CxP3ySyf?RxXHeuU%3M_ zk)dzo?ANbl0^xkQoN5*T{uUC<(}3)ET0-_ajq&VO(-wesEkU$%<#PPHLcv!0FnyG^ zKnEuL320clAHKL>gyRBY?!*Cj2c#`l`xq!W2hw%-?lE3<0SX#St_SbdFNn=n`*b=K z#1`M3@2v8GsI`{fceR4$tg=6!(=RLb&|`XS=B@2?F8hL-2Hc*&e}%G-eA&W4A2A)w z3W&)ma8s_M(6H^!3Hy0^HW@WG7~!@7V4gJIwW;$5*ZlYGFh<}1AFN|PM4biF*r2Re z1v+}i@rxaUhjT0X_K`2-fe7;_0ryPFSB$P%Uw9xYHm6R82SaNGG_urO0ZW1UFl3E`Y&i)tJ3tX!w;2PGQG$PGJB82%;&l z2Es9hvcE;N5OP|QtODUpKARfNN|Q75lLJSP)~*}xDuk{{3Bx59y^M^CTH=IWgL~8b z!%lTD#Gv4>f$DC%SP{q&-C}R7+-pOv0Y;jgzxkX6fUT?I3Sf>up@o6=86d3%9iH+| zyA)?lm)6d!|6_5YTP1yyH#g+zn|hs*OW#Clr}3eryb9SMA9v8`>^BaoekhUl@Yg=XB$R~O5_=poiCTlj6#Uv#DIvO0<#B6-Ye@;dR;9ZpJxM*kuaV_w^AO z{Fr#nY~nkxx-JkR#0 zk{G#jxRXw=W9a5!w2Y9oecH~k?(U0*O#J-YXuukL&m zerRrt5r&eL13Wjd`cZN`RO89TL?L}s+(OJ-X#`j|Q_0s;JWmAKTdO3VR*V3He%92g z_fYTs6S2UI4b(fsJux9G6o!{1!?hh(R|OastndpWiSU)_OY#12IQYO>mS(7_D`Gi; zx)*{c?ml;@TA_IDb+t<1#rZu06810GVLya1*$)&BH#x$^mWGZ5MOLuPvG7RG zrs!HWjMCVoGtSh>9D_Qm0O;MMc3Dd#nJBm6{Yf)A#OVD*DQ&OU2t`YBRU@q?MB#9mPlR8GVk5FbAVqgAJBvnD# zh4dxe1ERzmp|k3cP*u-%sh$(@XIM~4lEAq_B^pPdhUiii;v-&JgIKAB2q-Q$!_gXc zKXwI*p27Tih7Xl3s4Vd4gLMDSzjGpm9Wtl6ve6bKHtVZ74ugx=*J{`PujB~|LtaT` z@&nSfn!GWRY_|cn)>J`XQJs8%Q~r;zn@BDc;3SjqCzT4^q%JL*aSP{kInHN&Lf}<7 zB^#uOeEioplAxF7ovj+NPYQRSsCR%T`$BogtLFi=Z+XoUFfNP-g(D=dn2vWfWA0w} z!#l**+7rpX5pw&Gy{$UehNL;k$MoyxtN`YEM2vdPD6b~H-stDqG>Ta|s>JK6n2Q7M zB^W)CKrZ(N1gF2eT1nB-bl~U_TeZT98Oi9R#Ou8 znZeYTAhJG}CWzvIkdP^oOVZtLL1b?7bQKxINZ1#HAC@E_xkF}pEdGO z^41H!lJP9*-Yz*0Sttb0U?gc)y8NHe0CH9!+`E|$fEN1n(q86dZB%y(5^ypY;m-~U zRA8o}yRMEbgf5hu0+;-gM1n*MV(qlaK=2QLr$T5*YkiI8`YFm=7Gzc)y2?-w1|Ps} z2s6P>^z$I8t6QjMFgLy3%A7TDee!susUI(=`8yIn=9+^{;PiGAIA!LQ%yi$8aFKLC zK3cqgP2U%!ugmA}ub80R<+_So4~{wH7G+KI&g^{5l!!oSWvji2cOS!MH!jRJQk`kU zZBBO82!%%%36`)w6h9`QUHt=7{KQ=~*Xd-t&5VWQw`yV=#vxx4g$Qri&-oAAitI6R zqtv+!rO>QKezu|wljky#!0?6@PqV%%xdl^m5Df1X}uf z&~&I9%@BwwcjsDIXFjMrdGIA+;HpO6l|{?~khARd_4-{lrN8F1jILm5$Vo%pR`I;o z@vnU#kZ8r$mVYA2!HQ3ej!P5dGO}07hv|wxu+dnGk)JzYynJeDUTphRqA@MlsNKWA zEw{2RtfEGGh4_-+=}ap&LY4Usx|0>}+qA&z*#;qVE8#M^tJeEj(J4;2joX_UtE}z< z(TeB;_E3=zC`}c5OR(z<*yRtu_7UhoqH!lGx2Jspp~9BmYp(s#dhDrnBL)MOhiE9V;Vtu}gF! z#;FlnEw^q^{?ggW5A6JL^F#q`JzavFO6X6c5$fX}udct3sepbyG}!23Wph1pr+jgL zI8vdJO1S9icFe^mAB3E!(riRS%9}^JwjK+`M9TE$D!KtZoOqu}AM76!JNGUpT+-fk zJ=!5vwi*ttNLNDe$?yi+y&YIs8~IZtQ6u{wNndkD_j@i-en2~0{>a$FwtSQ0qDytr>b^dv(RDYkp`t_%4h>z|y>IT=75R#Z zOLyvrjbs-^0#nHDcye@>-T4nrV}C>l=k|-eJKx;nlW&sn%+j-+uQu=VzdOk{Y9r|p zjHcYFhtNlGnqZ4I|IBzTB_!Z$qSgm#i!2fS1FR5f@?vz@RNKm6iZSLrRCK_|vG~|$ zd+-FG;Y|P?#H{3c)+5gwXbNgDpp*VFCMKS%z;@J^mS4WueERF|Q@qE>F6XQ<6KrUB t_)JLlL#VZxfAWT=7?Gp{)uV1bYPwMq{dG89>5Wf>d;ZrN_5Wid{_i23mbm}` literal 1037991 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 z zYg)MdRRwd2##e+~)c0`rdZ@4nVZw)Qq0%^n_!n%TmC-A(AZcc5bvQDra^RRQ3V@jh zwvM5Z0b>i8L%vy5T0rGnJwMYD0j*y-H#xu_Lo>1- zQ<(!16w=slD81zbJ}{cVJ!8@`R6~~%xzDyC%|wrfGrP+SXM)_A^>7bYmOxIT-d!}x z361A3j2 z&_Fm6ujA@AW=-+XO_{dv~ScZ;K1F_ z_%0qPR1&GNIg@lNL08du8&YE$G6%?QJvzP_;3b zQ8`jRA*@ZZ7v%mRUJxCMX`&bI9wAZ?a)3HV8&_qh(}S_K+T^eZOg@Oo3OyFQ+7naW;ZMe@jHxS6s%$m1F+wd6<_fS!sA7u!N4HpJ@I=mT# zScls<2|PFzKZx64dmLQP;^-1thY;SxW8}jCH|TR;hHWCO;`AGNL8|cwrQXdn4+I%Fmo73JUbv6JfO3C$HyWypWu$~ zWyD*hK6nSgY=Bk#v7~iao|unHgJH906CeS>78k)8uE9TQcaCnTu?n-*dyQ|nY<9yy zdObqaJOw)D!=-;N(?2&m_<%BSS;1AJoH<~GZSnK>`uBOUf1gnm4P&pii3YP7WKZfh za|<*;>=wuXk0=?#l?j3_p9Ecg+iM0t+kC{53aljKXF zu-PH2P2|a=>CjCG(estG_baN|^Q!^gT?|sh9i@2&lf{`|mKQeVw0l>iC0j>h%C#btloFpLOa861X3o7M(iW%+pIg)`L$M z<`ov*!AAyzH}CRX4|YICO$r~85W)8ue_)eR4}OpF@!+r?yo2#i#|Bs9OFe)KZN89n z$gtcfuD|f0Jx9s(8?^a2XM^%^_0>Nmh*l0ON36bK9T!JqJkL7yS8!bt*VlURyi-5w z4-h4K6V>x-bUbchykct}Af{mbkg8OqKGpWoC|*#>%P~_?{sZqOtOuJdWWZc&Pd1U= z0u4tWf@=%)egN?xaJC-lvw~skF(2b9@;#0M1Eear`RVD||h(Dd$8 zKA_p%XL#U9cc1eCL6~>jEj~%rtb3Dnw^{ikRQ`TCQFuTeS)HoQO?;+|9nZzs(e@D$^ zbrC~WetCGIRH%xzmd&@f0-Rclkt^vJYOp(~ElVv*{oCY{t2*EG9j(6SyCrl!4I3d$g z;FnBGaY^k8aGcYsg$B~f#Xbaq;?FX@0EKMV_Dta_IqUEW)W0olY zEfbc^_fouAGUaGL+u}}Lp#8+Q&yDrMIKuwmz8Xs{32N!vT4cYE#zlWAhXchkzSx~q z-#YcnQ520qLEWeIXv0e*dPvr#Oo@J}RQcJj(l9HPDk~YZXyv-RYK-p%qrB0NoZZwzausaoYSY6Y^|s zs@A8ZvZB5zZLp0&ZfWal1qe<(<3tCgNa0{nImdfRZasi8UF66d_K-VsVxs+V z1sLNkwW6tt=W%(On{Ma;98}N;bFrT{HbYelU^l28#t*44o9i?P_!eeHBfi3sY>s>H z80*wRjSfNVs%$>5w^vsWw~a^30wg3fqop6lYBBVI6Ej!lnq`1Y(Ff+b~6Xo;!y)y3cfCY#ZJI6U=FDtgUIkK zRzFYcIsrN_%V&Wc(&<)+7_4yhrbj=fP(lXqmxpqu5e4OCU23m04Y&Q^XpM&nxHO43 zq9GTULZpy~?a5k{kS_p#&_#BY0K^ zFlg9TJCIlOV8tmWu3 zCB8voh_K}vYeTFMg#TgJ5TMN^pLx>K57ajivk(Cm=J00tp4RE2TxGhp%wQ~_qz5}f zUB#Ge20Q$#8SOX}d>;J|uIPdI=b+pIaE=Ft7zu-o`}60379HhnFRm)wZYKUH z5NzA7t~^ zE1}omKm&B0EkYcP(c-$Ce;6(0=e82Mv8=ALmJ>n-fp9Lg8IK>MJ-Zdh$YqkUD& zzN{qbG`d3E%eY<$;sqI@_im@I#D}*+y7gF{g;G_QN-V1)NxGSO?=6PwLf4ZpT7%~W zm>LQlz!O{TS@eRKk$^8XaJ*&!5YTTEgsFgLAFU*}QRiCvUABSB4%Oim@&S0JBxQnH z=+`1de1!(Wg%H83N^|jm{!?RWF{}2{jLwc5NZI4MD|q3y+X;_=2uPHhvCwba3xM9b zM6JVXunF0UdY0st!?f?9L68rS)j;=l42!QJzfxQ*h7b$)eMHICHtgAOIhXI=^O2<1 z&P5d314oE}vvB{1i7hm)&|zRFh&Fhc@>^ULF|m6JCXNvTWS6uH5Zsi`6-0)hD#H0t z{;5xg_*W6ZD9=<$0`pXP2iH`2x4f5xMP@s!RG1tP3=1)Pk+OVe2zO;bj?B5u z?xA-NemtSsuMR@Y7Q8j_ZlWWhIzitsGsRKmjPjSDF*hhe4+d5niU{aQ1`U_38v*$} z%zchP0$DXEakn_Sxj~!K7@t6^Fl`Bl4i@uUM9Fab5wuPaf`Wg6trjLOY4&iNH;@gX zPi9e^TK6Ra-uHz=NNZgfb^4M;W)ZT%8Y zA9?}a;mN2yXr_D#^zlHh4s~DjHIPl*6mid*>Iz7@zCm`<2SbDXq(21X33zZSKoo2W#jQH%X(f==5M@&t*bEIg`F=m9=4?(=hQqbgV|J^ zmobeMC+7Z{%r?^C&Mbcnql8Ozd8xMi1;rEdO_A`cWwC(GQ_Mq~HQCb6UeqLekyQrbMTym@2|Hq|RB?L++u z-4!lGm!Bd%gIOp*WPTu5mHGvIQoBeTYx1`OBwSMpAnoi0o9dC49r02H9zb!+x*>1o zoono^;Ik)0(7EvvKm~obe&bBw&&yy2#%eHoksTRE2`{krF$VqF(U-yOD<@Aj?4w{X z>mHAJrh3QF1u|>(;EM{;04#VP2y6-EI&4zByfSzHocDuDvR%y<rQw=fOszIP{vOMc{wY#wQBVO zyppc`Sc9)3Fk_J*1L0epe#{7(P?;Ezs8TMW__g0`ZOL= zHRlP1Cm7k+#OtZ14oeiWnny|`-K)Z5VYh%yehr6DaWV2KKHZ88X=fIcrEd|4yO{OY zD3ddzuMleMB;?bA59*e7h#&%PvzI;HZj$VFmCE^(O`a5r!$u1ENO>IIUEmXyNrw7y znur~i-uPaJsdLpRE(;Khi&ycQ`*(1{UChEmae1y1sT$7Rg<9dlg~uHjmt4YNxK`us zl&Ar9H{mha%JUG2PjaQ^EGMUTvG6BC{F`|%dE}*jnlsYk@dw#fMU5A*4a;8BjI{-8e#)zy2J5OAaiTj#>*BQ)YTix8T zf!!QLoFa%H>I<&0{I@$IagX{l6UZnE{~9brbMr))eT0^zh(tD(@H6!nU~8i_L}FE= zGu&21`HG$bex`UW3O41k#f-7=kgn&PzY#=7tuyy!*02KVYhvdPX*EI{_%X@1o-~ce z8h2L{oW1rN(32Nk{Jjm8I7A%yrFvvOcRubmD>`}oVOzRIfzl`T3WCf?M8nNM-yu%d zcZz~-$r`?4yn3q$#~g=`Ubq-?X5U?1btzvS@!C*h4(6vqMF`&*V$M=Q9RnuV!xk!d zj#fzz0W7RuvL$0Jx^p(x-JW9oxk<`HL$5=!{I03~oCID!E1 zHpnf5r5U(vc3|%=?pv)+9PaLUac^pEq`b2!#O>5tUp-;-rb)inUCp>PS23RBgl_X5w5tDE{{v84&)3rh1;@U{@Xv}*~XXR?nQ z*J-)`$dN?P5T6W@3xdLy8FVeiZMP16@&0Ue6(Mb%NR2s6fH4%%s+I292yf%7IqFhjo&L$Fl%LxJt;0nZ8|6oA_yDXeZmV6Q*0rg?bv`FGy!r}Ioo0Mq}(QPe}flQ8r z9>L&zMh^^}@UN(!Fq;_SOK!_zQsolD6B}IBVmslRL2!)Fa0_}?$2(G=3UizcSOEt) zyBAfp?)Hru`cVR zI|L9qSKI#3dEPbo_y|_9@>UHl#uKvlS&qlvyPUnWP1YsMr2Cx8)O@N;jnFz3LYRD# zQg%XKy>WZQ5hKaAyphySwx#LXsremlBg-qlz1jtnV!u?~Y&l5(+s~@zIs{i*$6?el6C~WB0Z;py?|B{Jwi4=3$y7g4*;eyHKLB%_FY6~`@!~v6{ z>*Hu!cGPpnt_BdWov*D5JTZ?Hy-)B>hpbuo(Q47%rB;v|Dy`;%}K zTy`fV6}${5LYn8{Wl8Nwc`iv9(avLN0!?-h#mjIW9G0*15Miz-!69Oi+wk`1s{5V} zkvGvHR8LB)9CzdR=UYt9wrlA2Yb{e2BR*Md+?W>9wec(wS&&fJbx{pohDK{ao zXPs-j!?v8DDFqBhL+Ha9M8(Sl+*rtilwctH8x$M5)g6OHs+fc0>O9}Fp4$aT_%V2y z<1c@~)5ehy_HpOtX22Y<$SMWkv)-&DDOJ|1H>gUN2ZpSx+QZm)2RpsS(k?l}e~fVi zT7BG;UI``y$K|vg(Y@}tDM=8mA9Jel6;o{=pRmKnx*NeJc1NC2BaRe1$a$>1;5lei zFsI$XJIZ>DeC5z37!l3H%t$>@rqs^HUD$ISu;ugc$W;76mz7_&Nh&Kh^+Cve6zCkq2b>o$ZU8`tL>p49>V$`v7$;X)0Eo`G!;Pey z6r-Ov4p~)1`D7g!ELEM`sxE``g{qEF)j9h*4|V|YW}(`|^Kb`i`8b%s2jVh3?_PE< z!yvKtkm*>Z zmo}Xlgq=UfP!4Zy$~7$sWiV8O$py%WR&A=fJr{83;ZmQw#0F2jOT-hKW^Bwht`bsrG?A zux&QVMqx2~a;`VtmWk$WaG=nBc!r4RXnbE@_Hn)$fn;98VB{*;7hKZ46I|ZG>goZ$ z4|uQ_5@zLL7-i!CovYkUhaMh?4v-RO`stL-n+tQ~uGc|e@6Q3wiwR5f)^K2&JXxJc~ zt2tkVX)4(&$8$MmNtBZTbdpydRJD#pku5pGqb;*(Nu5UEX!d%%v3^&V?9v}Oi+>Do z3c6n4kUcS}VYP^Z??@)^NImUj+rd@MITy=N40~@0Bg*eA7BbRLTkiIqVe@q@?~i+8 zbSW1ZFBWBc#!|>agc1cj)Ak-K04B7U@Wo<>qLpoS-{BiA7hz1|TP`AXABHXOKpU2U zr1y?Xs{$+bV|8^Ol&0}f3`4O;!6! z+l_ZdSffO}%8|VDIFbYCLqGQ3iBW9$v4dX0__2*a z60VBCa7Nl84A+<0vwNemd+-p)zJu;9WDDwg`cX1;FDo_kIzB?jXQta=svse~g6suR zP3@tv22M_7F4pk{7k>kb!TBQCvXx9C&~im`*~vU>7V4rY%CkHu{B=t%6+%6pKn|Bb|jy2xGT2 zQZ4k(<0ra zselbf>%|4=A1P{ELoE_2SBE)Q=;hG%l#!%3$i^2uby!0_SdZi01zatK!p4qi`N#5} zJ7WTP-&JHJm-gzid+#fA6Mk=w4ZZbDXJ4THX4@KM!P=J&u8_r`F-t4zy)xO}ntZ%v zi=2Sj&XyJOKbT_We5L>~Bj8x6H9*{^k2BPi+q5Hr12irKtbFGd#HBb$hgS@FWbk^i zkS|#NC`((!m!<#={ZJ`dadv&&v>B?x_JsRAt-IQoE&LdM!O{&+m+=iKi6NjUw4t*Y zM$J1(?|othp|KW4QcudzqDE#SceMc&S65ZD`Cu^kBecyNl_(F9vw z&opSz_Z2NcG=+vnDcx>7h%#Js{(2T1!XDkEQrDGh>R)4*%GnnQv3~iTdLFGsth%*8 z*?*kd(0?MSaNX4sXI;?ms%tJo|mVF9$C@G>Z%%14QXiiZ;h zgen{Q!&SC)8pWRZPIr|a*Agml{7HnDfW>R8uB~Na#ITSNhS`=uk2zxrB_b;gd4}qD zaS*L%!E1&;6en?wmP0n%`eGrp4-kN!Rpq!YD{DQhPCm{)_fKa8p z1t?Ut3eXeWU#07oH(QjQ`1AX~UAcP^(-Yj-)XnIDXeK7jp&`E)_3reQXBi)BTu%{| zNz)w)aK6Wev7N$tg!0D2t7NB)tp{sx=Y06#VwCjs0jAjf3~IO091vlV}*@ zkY{rR(S9Yvr)9ALi)x;QsQ+2@>wbFaDo?7P-VVoQ!xu*+S(jVkgKaEZqojYZT?PTb z!6P^`vD$XbWrQOdya(}qI6Q*Q_g@H)7CrhY-tP^M{BnlQFwc6t?>RgEJqAg!!nQ3K z@Id*i_0&_??%#e|zJ$`lh!HY-z}i1etIlqrv$N9e*r-h!hwq_37n)cTM> zx<27aI#dSceLvHx%fP(RzDap%yI9y17os<_DK18Dvj3wU%E7mB^K-;ndWdBq$z{jK z3t|c!#x>`OoY5*2_GKS%2YK6>87@s3!zkRDb?wxi^4xKo?)y$~d}Fzl(GlGItRSL! zO*GJ0Wb{F@&MQTDmUhwo=g<9HWAuzsUbVs~d%~82pJdcMh!Jo~Za_L^WC)g%#4I%} z0vbOTcvk3iy1rmf1&*E}S|P0EqeisG(A$8(`&sa^kMp8ZR(WfgZJXD?tgR}3+?M`xNZ@_Y%9zg z-)Uy&whtHiMA^7G97m@OlEY@OZI<3|#s_78Fm2*g6%ntHfe>}ymTUIm0BC!%JpNVJ1u)fCn~mkld~%2JmV@ z-4W0kAM7Q-U^2}ap^`;q-2N8?e$}&_Un3F&iz1l)h5RtxMSpbdc&q%A;V1#1C{S3* zW}`DF!JdAc-=Vf zl9SVnP8+KD4fadu03!HWdRE0US&zxI;zl(w5)hT=|2mC;jMoEf6o))xLG)3%OjWz` z3ZGTZugc#s?%i8V%Mr8yk@c=kv}gmA==2m$Qnuf2U&sy06GOa?zzN8E0{}6R2&v$w zRl4fBeW#lSU&>Af3w618h-0D@5| zULfSYKB*5WZq?CrQYSM}paNwF#%5kD>G2>>d)X=}vX*+7BU*_0d8H#@Kv<6kuBAaI zC@x7D#kPXs-t1VK)4U$0QYtsGAqA>g8E#tP3zZMREI`(K+bp2z6DuG`2uTBN&@juO zmN3VqvbsEbkot#thj+{hXmXJ%^YIpeOvX`pO|loeqi`iluSHQ9xA2SZ^} zT|vMOuD@0kgll0H1z{|1P!QARff<&$h89DVvxv`Ds{q%?1z?8-1)M@RfDqMQ`1{g{ z;el}MG80*8y{m+UQ%vp3LL<;HASQ5Sgs|a-5=Mq*k&ozLtrtNy7rrXSumR{JpoM^e zBzoP|A3e`lBgbAEjyj0i%2AEb_E6RaXn7T7Jq``#Gae`<`xVlvUG83C`^bUdR~B7n zivvZwSGL{7;^7c%7KT{zc2@vFi4!oP4`v|-rXvOF^Xg!tw)AI!7o2l6&N@K_q05*% zKJI0f()k_wLagSl?VgC&NH#~M#8vz1LCp>|{^;Ni|ZvKPd3fdm0Ge)|7R`!3Zv!i#2 zqk!HezK)Aap58opq~BqIU2PAYQY}WM#a^Yk&JHk8AngpQt_+*$_eNXT1eFHoaeG_B z2B<(128d&K;q9+Ch;bxHZI&mimn^;5uGkPFst&Aa8NemQ(MY@}aQl{<){dE}@xL)s zz#-Ev6uz@?0QKEfv*XZW5TK_*c`cO#F*bl8%XD{Hx`7zYUJ7*}F)T3rhH!U_%Nt8{ z=>onrgcQDpwx0kYyNLX5Erdh7Ezl5Z4i^?Al=82KH;8I&_(XZCa4g}Kx1XKJeumQ; z$4OC_ohkPu^W_**k*60tb-h3XQF2y{x=?T^{lf-`>kVMM4~d*vE?kr}m?uD_jq;OL z3^#QfnhW{7wXnbywx8qR555p`CR7b~6LXk4-4`MBFQW~y?MOfj;9`O(1$lXrdMg@n z5s%^Aw8+5m_$Q)4JQyq~I_7W%zyOd{@WDYrC=e;D#6I`Qq&HuXF_JRBoQ2nM4ud@~ z$iq@hfwR7DO~S}jrNnu&Cl}nK0fcvI-@7aSYRi?3tG5H;wdhzvo-3wk(e~qG1b4d=!w>&&=nIH% z*be@^KJBL2iDkk4F5M5DOo5Xa;KT$DC8$6#b_iE4IaQ`29YuIJODbR>l@`DxlyrD9 zrlDC-yc<9R*4vW@=BSjt8)8gmnleC#yPxDfF@IBl@^xt*Oe7d0#8fW>;NUPv_CyI2H#^kS6tct%wT@U^j<|}I z=Q6kVl?Q>3z?y$pT@9{c3jSTCNsKn`QL-#inqaYcQjd|t zB;v3cg{75*ote|$pG2)hV0 zFSBUpg=@>wGuoY+y)5ODzS{jto$*V|&KxF)usuo(HHW)Pj=bE<5J2`h ze;)@1YG()|53}xMgjfzYcj!dg0W2%ycb&eucWcFt=i0otkBimZn~}AFxR{>Zi^H*< z4KV}!q51c^=?1YA4+S#S?v?!XBV{T+&O*c^?_Yt)%Wui+oI1I@Fm!aJICb2cn+%Xk zAFB+wm}(4}gjdTpj>TO`vh zk{y@n)Yt5tG&Mq98Iyv8DBmn{YbYvjaY(+6V>Rmf$Us$L3`r02@n%Jv5qpvl6S|Az z6THNc@09l7HU*j~GE0UTLg)Y!@N=UUR(QQ1~W)J%S?g@K*wx2?MYz$)R;aoeVe>E>@@&<9_PUmqwf>2bbdm!b6EB?ZydRn zu;F{Po8^RM<_g0prz|A{`BC5Cv_^j0k0mCjSz%Z0W0sO z2bbus1%7~Z6sQq3Gs zE_Bp#!+_+jCK2exj{sd2Z!q4vx%u+--WizL@dWelO!ZT?`g!b4HM0M!lYM2Ti1f!$ zXCT!bt6!!WV_!=b1kJD;kq`-{EnpOhxL2c6QSfJW`8%Ed;f6KdG?Kt~r&e)4A))}a zi719LEI|}BOfOD@a7x@X$>7{X<#Et`8TufzbzjH1QGGRdRS4&aj5?3Cm~M=7tG*!>23BuFK*9{{)UeCaO3wEF%h^f%Z66|nlW(5Sjd}r?#p#CE*ja+Fn z6_+{{@b`4v>Hb@x{c-Qa@6bdZ2snPak`5?K(h7X&;Vd2X>bicKPp+i|!zpeEIm*EQr4WO38eE zV4kqw9)$0VCgB!a^8ZcV`**c*Wc%KK-+2{SD-Q$LZ4WEm&X}GX9BC8B9^oi4i=HloLva)il$EiGZkHm^ zVfaM_4=8_sZhK-B+u10#8O3&rU%9X{AHc~zJ^q>J;bm~_sQ}_eI_)Siwx9==`30 zNHVOfsVf&H^!g;@` zJ8La32eGTwV%_?k%Ch+5z}&3C7bEc>0f~S2WY~bme+1m4n}ng0c>G7TaH&;>$A3&L z&>z_X{lNnL5%JjP@C6ur!)$*yOs?io{GKq$kogO?RKk@pWWMo>5viwt6^zTac^XZ^ z>)-2mZI@rX{nJ>d_$&(3D-Sr^roT)AKmOIxXP z4Ywz3MW5%?UbQ*4=7Z06nvj5ZSGpZJ>iVFU0tkTg+@XswkgdcHFQljhLGNq1V6%Y( z6efKU38{eHQB{QTq31&G9_0r@WuI#gP)oJ5-pyT1RaZX!8NONxlYHE-gCv=M?b-&L z_=alQX=}lJFCZvE*}TrC7v=S_=|uVYgX==$-}^V|OM7L-m!*Ox2_dZEg|A_zoquF; zOfrRXTqyj_bWASpA;jOLO7VD1m8v(c>rK|We#;jp*%cfIAo5Avnb4f_HL+vGwJy68 z>%yJPgmC>Sg^eDg2qRF5jc1#0JR@?7P<|pa9aU%&QHh{KJ-5+C^hnd2vg$q!_Q1{R zJOiajmsXP@qO(*|b0uu)k@3YyyDP3~`+IiQv=;C@o8uWqlXsmS2Ub#X?;?_by=?C; zT7K#bhc23^x!`{m!)?xToZz5K%Fmz+#90JOKL<=6w?<{m^C^1_@JoUZwiI<-98vj# zU!)e)fF1t%YUf#V zo2u{x2rG_a?ZxFgmh8#?f?FA9pzc2o#nrJ^{7 z-6TV0M%F?Ug!wUEkdG>yu+=`kq%;R12+YQ%K$3dA5CJUrt5xN-R+qOx+kiYVcn>NO zze~bz^~IO+!NF6`+Xvn40Wr8h$33s6mGYLyCq1~QfaPhuTDW!~CIq%SEu=@|N}3n| zIPn0^qJL((Me!Sf*;yLorMYwCiaqJf-FJJS?GBco5YEi_*jV4#+SuDzZxDbeno{OB zlA%x08*z+Ow1_ru3s8wB_5fHCsxrHKZZG$Eme`!g4}u>p&M4U0^Y=kk0NB;f@T?@Zt9t1eSOvWR20PGjm*)oZ=0V@_}hW6 z_o(cjX;YGj;D8zF>Q;cDTW?Bo;ywC!*YTJ{x)EU-sZofjV@|%I?kp}W-M?CLJmaW1 z=tRI@Q0+tx;%nU$KGHSYurnBXu40I?`+SGloc7$W15pws_7A08j4FXSOL5N9nirS- zjG^$FhE?Iwb0c@aLopmD{je#4us{R^{iPWjfK7IRB3CPcG&+LmWuYG(P_Uj`nr%U${K zm5>vWNtrp3@_GaczNax>y}bA}ygEp#>Mi>$Bl&Zs3Me@c@JVSMAARv_T?Rf(fvc)m zfgq+@1tQ*!uWqGZVhgc;K{l%EK;tMQCdGiOlm03Y%l2eGiEv<~FJvBWw4vM~dpjeU zMofR~S{cPiYj)KzazrJ4wZHk1`q&IvrMhxsD&|aoihq0-@GJtNq-N+-{0*_ zy^~gr2egRB3n^q9oHag}yKK)bFJXMCcEkH1pn+J*2v?ugj))NO>gl5Z0G6!^#vA|) z-VLXN+0kIsM+~5!b}rbqeNe%X3RpATVPbtvOmR6i%=Rh97%ESVu~{<|qNy!fyApX~ zfV~P9)VuL{tzIlQ*Ou8WioYbD?xY1Wu(m{bGXn!%acger{3nvb-R+I~VKk0J_9 zfOk>gRa4Ms43G?=Hol?)Dv#2I-FD!H+jdbnkhx_)^8B@%X9Hx%ARIO99MCUALTA8= zppdf5D=Y5mi0BDUElon!CE+|#hR{MGy^nlk;zv=Gp9GJ#ho`RWkowdn@ocBvI(yqj zCbPBCrm;Y6!NVu6!t_B}Qr|I-({Q5-;TG;Hb43V91fKqc%pd}I?P_@KP_|x6)eKAh z8vW3gtNJ7C)?OofDq9>IW49cVF=X_mRdz%c^l@dmSON&$%pJ96kF7fBd`yx--|2>6 zd`}l7#e+m!*g%tWIqgT$rk?X4z=ON_r9U$^9-lZ*uQnXj2pB^C68omT8gBWkZ75p& z9IPECX=5i8+_Fxn%=m8|(n`v!Acm<+3IJf6ZzedLL(H8(Uy(7O^nl}Q4jDJN2T~X- z>CDdRS7*NJk*>(k@Rcn%bCOW``u@V)F?ZxisAEq!8f{c#?qA+zNd8O|?4?|I2nq^*MG)!e5Jnt`QgQlnR+sL&I7_V)jbhEu@+w_;TO^ zCoS0Ws|3BLWQE-Gp~D_13s$uceFDmLxH=7I8`MA#;g|yLeuQ?v=w)EtH_c9Ae%f#f z)ZWKc9Hc1~GokPOVgHPX`xv;#jZev5IhZ(Fvm;K^bjkT_bie@>gsFSRcEMe3>$bLa zTM5UX=^7+MrnCGZ0?{yAMTKFIkJ9Cbs$o&dUviXHD76vhPTa1|o{-~?jXpBRaY^J} z40cpBZw4pUwx5lFjG;=-u=0Uaa5kLJ&kG2wfdwF_P#WC4vie>xz9ECD^?HGF1+W^! ztIG+k~epJ#`viFfFXfHKH2Ns_}sYbaNKRCnZG z`ODbm(yPthbkNig@M3okT{dk(--Ra*8@Tc$Y)-~t6DnHZTi(qV&yo8B zncVzWy!MH(1QhIMEAnF>E35suWP`9MNM8ZuE|*3k?N>Q{kNo!Kf#vnq$bR#j+@eI_ z$@je2%g%&ZwHYn_vln3p9~*rDDdnlMNf^L3KB^*Ritoe16mf7hxokD-NcG!9lTP}vH&>YQym$r4}C~VcjPkmIly7Iy(=(-T^x$VIr6eJ zi&r3IJbg{tTF7wHCTQlRzg|pqZ^#Yj9)HQmaekayQht44LuquifrwgD5CFTDVL?$T z%a|^D$TmU>=s4rmXpt=9M!CNJqWS5K3R2s)OA}B5-2KG|#XW7#tkriRI6i=$`A=*0 zq23p*?s0}$y{8wU4YQo4phe-rHg_RyEvMciFPd{L7@^f_UB+IBP9+vN(iNG6(rvwx zSzXs{G?K)^%<$!Szf>(CHA#p2Vfb+$cL9kw)WpO6koj0 z4`|(sUK!^fl&T(P^`#zuJ6Kggu6zaC^5r6}ss7a0-|(FBT={bsq`xDzlDv2?^hssA5Wo1QzIh8O7&LIo7q}f?@yFQr5 z+9yjIhF$5(e6F5j9Y4;SkZ)NUW!;9!YLKGmQJe@;MiD=NgBa`OjG3v-zr1ATqCo z)c9u0FZ*6O$*)|V4v(IloVM}Vk{r0n*@@kDxV?37Nge1~%jd9)@HEO<-ro+nPyWjn z*?+IM56_OQ%vN}~-hRh1sO?sMZ!ckLX!P7A?p;&-!oBU&gWu2E&sxaJop+t~z;5@3 zrqk_rhA-M5NKJ)KQ7C3$sq7capM*(7?Yw%>jCkV|>H!Yq3{ceM+5j9N>fjD=+TPNm z35e$3`%*Fs4-(&)N@n$u+WO=lNK`!ZV4O#9*z(m|Iz7&XkSSzY!k%n`Q-BkJ5z!&< zT@!VJRPVoX-LIm9VTYvdW{u$ICOU+*HrK4a>SO&$B|uf6s!i*tIr;+Gb!|O1(bT`BD^*z6lV|fJ;hsLNh0bdqY7#2pp5!@@v_=q8?y*KZaHOf4dn)i?o z5_PCGFFR5d;oQ^+)X=icHujyihGk5F>Ka%80?(y*;&R63+v2o^$**(^XSH7IJ2rL9 z^XVus2Hs!*_?V>y%Lq`Z^FfLa_JMY0A7ECw4y7qhkcu=OGciYBd0RyXMkV#nv*)gt zQc4@Gijz7AbB#fhlTOd}@OBX>usa%1-D{5XWRd4H%g%i)J3v?v9L-m&Ifopoq@H-9 zrmlnBEwK^F^?uH~Kk>EeB#ledgY!kZKUMN?7-3<9p=H6T88_3(wNKN@3&ZxcX_W4} zb3uE8(yiMYHQMySZW-}ev!9VzT-yH8u6kvi`L4>=BOoE(iI)c$3jUSN=I>75ZHV*P z$3&|B`*xd;tJ-O=rPD?EJQAGx#@aRDeG0#8@S^X}EdJL2&BZ_b!o|n<{x2`Szx)5* z;`_M%YZgEC{h7sowmcqmu>GM&FoJw6Sv=XPmGlfnjXY+~0xC^LKiZP^1x>Q&&6m=} zLlslIQ>hSJLBo{$ANd3oZ(t6?U>H#3+q=kfC}TR3qrO*WK?6GOCo3>;>*!z=%VciV zsTIXTIq>kM^3MH5QvY3?$9UQ)F8fx`h$>I2$`}apVi6{)@$s?+3uY?Nvuyk!d?7iF zO~|1>NIeRTh_wDYe3&(B-K}5u=7uN~GGDwqIO~pLz?e&zgjiUi2`XSBbqcV$GqtH^ zulUTx`;1m51S)Vn_CXFqj0N*+EBDg}7Qz7G$+&!!)QkqD2&;D}Ec|P~V<==?=ahsd z^~yj}%ynk__)Juhih55;ZnJr?(bD+!J9_d5%?|OP_!@dl-M^_2Jia==8dgIEe6q!8 zEBBmve8~_a37-kmA7mjWF_?e~9#~b!Mmsqg6hcG)Vy-{iAx>~%o|hbt79T8ARUxm1 z>n9Bck}IW8`eHz|h-Cd}l$zN}wlV-;?TfWB)jH|44p6IcrZU6q7QBLSIuvWF3Ct!S zNw-9@@)O${$DJ115^+`4ttbfG0ioK1J1V_^f_I0ONHq7T#~w{vJ!}{vnUdkcwhLEwa9_1UmL6tEl;IY{RdS5g4;qZs!iw~@Us673 zr2QW$Es^ILdj2<2TB;T$5M`73Eu*w1u~XHHnD;O(Og9`jflbyU0>!Gpy*Ljdsudae z!uNo!Q3Xl1a*8uD+RFM&+z9MoiL?muHfRYa7R$zHR7E@~7>|VVapin)vJs`vC$c)uH zJNCupv{C!aIbEYyO|SiQ857s22U+=)Qt74PmlSGRxy;&6t8SFn49hb~Q;{ISA*3YbrfyIX!6w zdb0irda^c1I*$V@ypRer=&%g>fHHf0Ov*a zzJvr%w!D#|c+;GHNV!S7Tty?j2|inmGveZKDq)%4+cYewb(-~>z6^bt)?1}y+{@nj z0<>gl5^Y+#j|K1s>fj&Ep?r0vu*phdxBbew-L;#>sRZSykbc4N{_`KvM81Gt?pKtj zqL=#_y=*}*C6c6#JGl)1`N978LBuI|P(Pm4CF4q%&mLGtLlEwb7!1i;4T_^DBuYxX zMVZ%I!|18+%+7LZnFLE&-IE$j++!|AK3k49LC!Rgctf;uqI6S5JF`pY(Ds}*6(Q^q zp`FDOMO0hN>?%Xq6-;X>Yt|ge($W}e5ACLI&o_hG6WWaFO3q=6Y{n!cPbfz(VUI3J zE1}MqvIO~+#OQ(QY=5yhs*=-f}+X0vEtoO1jPk(e9;qmxWvSfNnWzv-*d z60y8||Ngyu97o{MWMA#geUwF}**Nbgp|{;A;_O3+7Z0Ud%AA0M)oG3esQD&D^Bq45 zC@kqJ0PB@MIo4%B%|Hqetqif?O?-JU;ne|3^g$iDENGhHtkxji%&z>j05hXpu?CcL z*9YAAlAmEU`yZ2b6BdY+0pjd_pBT6;d3`KKV8|5y|Ibt__QF;$2P*LTD8jGxbGvO^ z$Y{?Y;?Z#|*!(IK!~16x!tAw`ajUjs3oKwxsVF_qkvbqQHuz#8Vy0>&TAAr^qaRUK z`QQO-F)63yc!Gce8zC>Jnp9YInN`xH413~S2-=T*U_r(R+$nC{Km(kvP)^M~xmZI2 z3VA8jxZts|Pq+J2R1uqyLXkXpBRq5hT0RshRW5UQs2!dzuo^~An9VM1MmH7N{IvaS z(UJk33^#NLPrVKd{if9$#H2f{(MxV~4kJ#L%Vu^dl0(&59wprw=QTnxkF?vZfm5)EK5vQxGeENX>- zXAVN|%F4~3=VBs$RFyAJvwz*38&a4%^$pihfeZxiDu8zizuJtzD<`n3B+LhTKl3#!i3VC06)4Fh>ahWv!N zmAJiBj3LYIO*CM3)=JNW$*~DZeS=)nHqylbNEnk&S9u)iT=;81fq*DwF1#{E;^zxC z?FiW(+M?j_oHoS*K{gc~wo;pmCXK8#?Tafh123QytSb2rZkSxEGecsjl_k2)8C+s@ zY(PyJ7Ju#IhK3tW{M67#ease=4`?*wTy5<3j|<&Xryab>5bqlOGMJ{YB1hheZwK|% zEAq#kWhRl@!I>&UAz7kr$BYsqMGmMyk7u;NKNx^&lA>uXAGImc1`Ln64*O|5-+1x< zGG<8Lsak5bUa}$We3u)Pijj*o8N&uwB5zqqn!8+>Mw+eW?M=i!=Z1LnJ7XMe?FMUyLGAwuSpoE zNm8II7p*mBqST%X5<{3Z5gBy~CVULHYUPl$DFX$wWHyq&r_rwjmPo&{8>3(V;e^I` z_d4|w7bZTjVT3Pm{L#){1t|ieSDw@%r%hAIl@Yy7{}$HR_RS8tk#(V{*WfZ?!IQz` zF?-;=QHoCQ^la2rhbX~?90nZc{H%@hw8pN-yQEoQ8sg=03apnn2o{f;Tx(l z1;4SJsf`xNne9RUY}mcrZI7Py2!7h!d%i_c8hdOU9XTal56@0dIRJRLCX-Tcw9)EV zROQbHgPy`C!dtP`rj=&`~3c3c>fb5)FDQEyF;1bey1fPIHh|*KQF8_}T6Z2QyVx$i6)=K37SGP`K1E_CJ zfi)gZQu@cgGn64~at*3=Yt2u2XLh#BVlliHejW;Tu{z!H7{OA~M9W1N zo61c~y^7PTMM;JI{o~OIzBWu%a_Kopm&7a?FvZaQrhnvd+_S zMK`3oy0&;vC*%DvjTM+AI@YwZ*zOY&hN35qssdnHfjQT=0^tureA6pI^O9uDyS`NAJ z6?v(JEQS)Fq2}r0gHY=8{?r<%U;EvMp;370QMkMp&!R9ei1*Gc##=fJ&>ZLB$~Ljp zMm@c9Uo5X@md~=02ES6eMjEUW`~&?5*xuK*J3a4G*EV^&18_ zRIO+p7s!o9ghdc4Q=5*13oC?fLbAP%Ci^bkHn$^UqwMI_gzq;g0y>HXGREqRg4$Bg zM2RvDC7WCz`cHylk3ShuNO{yjSQem`Z=XfN&XOw5AzRuyS!Z!ZW3?+5AK)&H20p_Z zUTcq6KQ$Q4f2@N(4&DfX8Ph^Mp9^(i%l2Nk&)#7E=)K-O=iDq|p~+#b&Ox_-)M$#P zy*=o?Z9~&oV!Q12QDnKw<+jed0Tm$|hFmdH!Y|q>gjHB4vqae#bipK!^5=SF`{BSUQPF!>6 zlsv*)w{R|mi)$O#4ZT%@>rc}^?c${(mYw274ar23{(OH@@&IkA35BeH@e>X=!Ig1y zM6SGwl?ur@uvqZE!^`dRb@fuwK^zP0TrURJJv%%8CY*cnW!>ccNoh|qY7p2wL-i&` z+++U)T#vXN)RECSXA~E|8`KJNgL8DQpz5u@qgAazT*R8vQm>vICf&b52as-1=>V#e zR%g_`EN{OeWH4;A=Y=U*oiB8;J*X6G^=P%zL?cl$!a9<&>Z6!%@%`alNolq=KVB#% zG{3znwkpY`b2@6ssYetFs?ew%Dn`#WTAlNTXj>;r`eoxAZ~yH#|M*+@h0p_&9YAHy z+iRvt698USG)-90!}6M8(B$U^1$JNPcxQNx;4|g9Sh9L>{f}8;QigfN{jy4Ieb_p< zb?Io>`9r0h}4uFoop61Dm2w>1;Kt0*ifQ}%p{Zf#taD4cP&T$ev0%~sC3Obxp86AgrN1jVGtGh zfGCHtM_a=5*P>a0HF1L7aj^uo)P&}~>*{d-2^EqU5|bQTW%qUe&5BON3~IpYroN6o zWcU7@CYQ9fC*DWsWP%w;nF%Kn;8ueJR3~0~xG|Q4+1VeFS~QSA6ZKMJ1oq7JHu+f_ zpVixHt)^HD?D=P`1^xNeG(&^Vje1-&wHwMV)F%d+;wjfR@)Xb*p2DJwR^*sjAq6~z zR`8VRsN3^{c3i$x2n+eVk4GfX9-eXBQNwIp4V?q_b02BiE@5)n9*E2dcTJ*$w<@GI z=aRiv04hn9tGiuBe5=+*!-sYT#QaHywK$^5*7bH7H;s55C4d{4Vcj71!Sd&3xlO-N<{5iKWs34 zXTrqpvbu!x?7V_8D{0~S3J%A$x6jM3%8Fai2b30ZeHL+EWFi-PxXQCYA=C!~v zLpTHjjJ0Q&B@8s`a;R)ID|3owVufSelflYV_t?}v8E`;Hzu%Gxgr1m|dqBC2U(lMx z_YA0?h|Ho(i_EG5%?QgPIBa!K3coV;__54%^p_h~SN3-q(xyB25E)|d4{GN|Yj$z@ z-qPaNUoU;_!3T3cbnCaSuKr-lb&99Rr)apG$63!(qDR9q*SeFku0u0|8e2{CCt@Kh zkz_0sFH?6H7oviHG^PkIQVYjI24+5?`Y%4xmbwuSqGcooY1&rQ3*#YrNK7%J66>$& z7&cY4oyV}`gfs5NJ)sZqu6$kN-fLGEqq`@zb4TN_G=FId+i+`a+CmTR74d@*#bItJ z6KSkSO>RMxOEj6!5IeKjmh6o@yu+qf^C$v=>NRX8avH@MR6bzp{jy)sC&LcobYCy% z6XFZhuO4QhHsMy)xy=C}_bUTi0y%MyZcp(5G=($y)>Sx?8(KntwSDAWjt9SmmN}%t zt=zF0-%TzyyTQh)jRXZG#l@vTg}Op%XrU3;_0f%I)>hA5&#s<30qf_>K8^$-KRB3y zc$!a!Pv@6aa>?c&VnZ1Z zzcQled5}y0Q{cLjQ6#X!qlpZLno^aV`{!V~A{{mb8LgTEdWhZWDDHKj;@fP<4!|aE z6G%{`fLt^g6a5rh28vS-D|T(R^|1VkZF8{FunK9yy=$#1Q+DVlkdhpb`HKk{rNA^6 zDxxAVxVl4Rw&QDmb)*QSCjZhroGW4G<)vjeJufA0_IDYKBZf`HYKIBk690%h+;(hu z0Ppn#ZLS+J=z4mBcD`(ZvtEx|TJJw#H3$yKOAYT}nolQj$*3Ps4qR-)D7k^zg<;4> zZe~{bIc$qWlkI5s-ohgeU5f{~jArj}#G6Va^Bo-^h?#iX8kMb?@PAzNdk zUwTL(o%qpdAM?-Lk8Iu!zsf~}WY-V;z53>tP66>C5Uwa9q}infw;5Kmt_dV)MAefU zaK#!#l_HM|slsi3vxq~2heA=g0j_H~B`8imGq_zI|6t-TTf|=vWxWypJy3WMipJ@f zjq;y=v5b(Jqc#RLs=W1%W`-l8o|-fNye+OW9AZws{m;MX${qv(8g*P@2-t?a5F62j z_8JwXVzkQ4%WRxDM27ut`>t89!FGFnK8ysbCHkMD8>u*u7u|6bAd=V5tNV?jBp#FS zbNk@^^Mg}%Mf_T0HQZ}*zw+X3x+cUI2%$QgyR#_UmxskH^Y`@NQU;vzV@Rv?T2clm zsV_Flh;xvEnB)*YN)gLHNUWRtLsbKd%{>Jchgo0efz5w>Vie(HzSE{!cMn?RVRMy0>4+P$W#7JE(Zk6hMWiY|rqM!5 z!Q@zladp^iG(aWR--4`O*06~|i48 z4MQY;0)_o8aW$j%pm)%XrP*s~zp;*4U{buhon8IPdt#;?ID$q`7bek$CXI(d;r> zb~tJgM@q1F5TF<;Aafi7xWog!8IIG?Qd0}#-!&HJ9&O?S!eJ>oQ-Yx>i6qv(QL2|$ z!Rany;DX_8F56$$TxMTXp0>qwGOoa#Y;hKGR3Hi_EDNRZW{E{iCr}YOpLTYv4=`uu zm-?xNR6{YTW!(HCEc7QxK@r6b>4lJa*RL#?1TDR4XItUR@K)B2iNy~~KRf$&3wYqN zilR(J?rE!(wki+ZwF%2IX*xbhNNIO7)Vyy1^}7kInE{nZ2tjx1Oycp4&3mcrIwif8nW3;v%WE5DdP;HH{DhgaO3 zG4gL9$# z1CF8KfMD6d{V{$EJ#|yD%5A5GH&I1l^%1IWbF{(WYD>=QiJ;B&<@wc4{EQR6FqL?- z{NW-SroOZejFR@vCf@v*1%LMT61C{~4 zvnntAY$y*!|Ky}IdddMTgIB$i{#kEQWVxZ;Tz60TPcF!yLqs>xr-YNpbVC#uCt4dt zt3?B3S~A2=CZ(89m!1SKASRi>=;Co)vM%CQjLcB`M7u=H38W0hb}M1lb5=DEdm`B? z_(P;SNtxnc#A;p$XbN+=z7}jVt|}TrLEXw11u5lwh=v4Sjmb)`tYpl^Dqh?GZ?Xq; ziZR?j;-qaan2v40?7kDT>D`V^L4~~XvEFamKyyxTui0Ki7G+H~s}i%iC{2Gt~fwMlqujuiqM*jHpl z#GlL6&wJHdU-{IVA7d1ei~7noT!~_ulWO|suqQ)=843}wKw+PbSuPeI=x`?|^P?E4 zBMHIQ)$$CCCWX*PKet#_Ch}EUCc+do0pn__L4eLrxv>lp?|r&Wv?@#tPiKEdPQHka zFo(Z-q{Gq?H_X;ETi)S#SWbr>g`BRoxRn6(r70f3DiSMpafpo#ptBtoK&L(vDf<+e zPCO7qYHMv026A{Dr zCUT*S$9|AB6`?Ef&QYDsZTs1`P4aY3&Y7Y$Wyieq`j z&H^GTJ;6!JJrYl9WT3^n;g*ZVbV7g+Rp27^H`uiz67oo>?XYY`G8XYYyHRzZ4}^K8 zZsLpaiH#!Q`88E92#wUlvPB>bzY3LnNR(i;i|MQiTcmuQlE3pC^MqCAcd~ASl_~@E zJ#&_gOUIUR8+G_8OC7b>IIoPlR(XU;;y3BlthM>XwK%x4&(ghhof4hro? zjp4@dMFJG7R<;|Idbo<1=C>7{OCb%(@BynZQ)>mnw3>S%|FRMms~E=SE1yy(NyfNi zvk}$eNbhD5{OpArpOy7UJ21t3DS0&BU|KYu);oVyy9`9MYUn>z0eXt&8+*UrO!0Zm zX^mpI;Ogr)xC0ach~85}S_`YokTekU$ym50SYg&KH%8P|xSBZ{OICdg#AF_(I*7l; zsbz?&6VY*_)P#+!QXO|ih672U<0pIW+{W${yzBxHc1qOX2}{?Mn=yFGnRMp5REOhc z((u{X?`KS5d@b{-jPK#t7ezF(N6uY?;jAJjDS1wylt>tPk-3>(E-SPIM!j)>3nsb8 zQcn0UwWDm5`@(V@3~{F7;X{tYEyccvU>>*eppglMD=AZ%e-FMIr+70N@Fkr_+Ggv5 zNEc-RDbXRBE6O1h>y)Zjejty3zZ*jlNi5`+*H8D?fVN0Hu#-j;+8XY(VVGz zUp_+pJyQwiVmH_x-nYs}3&kIMWI`7|+rNjNmtSma7{7#%|9p<(TI}_8>zsc+gx9~< zC#vCm!0_|Y*KKY@Fu+5Li`3wnKc9nvcNSNFKIf;6x010r1Q^VPr`ZA{cNIkAS}CR& zAZX>sx#<=217_$5KNjxMqt(Uck{A`^3jvt@@(Idzk8b9uZ zO|kmpUbK%`bX${k;h?6zF~m`MZ}H)S#l@xB|M=xRx^_n>@@&`expvhAJ+f@i-q9cb z&ZvC2_y_`59VXPavj+})#I zxtRC;g>SZ7fvnb+%{<<7m+iSli}^4J|6Sdgh0V841hL84Z|$L6`x;Zb1E7BBQd~r6 zYC5DMQ7sVFVAJzs6gAgHHrr^{7Mz!S@qxhV_XufB=SQ7yLbq%Shl?<`czi(BYMweQ zc!1i@nml@lu%N$>AQ<4I4|G+S8NJ*(CG(ItMQDkX<TpI>ZX^e zlEx7wJJGw;Ryw%X7z)ByBt=v&aka*j!##q}Fz^ z-lgKTAu5!95+C@`UQbQs77n}&S(Q9|cAe!d>ODb~-+w|jFh&WrvQ zd*LY5SCGC&hor$Usl|Kb-BE7l(W7FlKQ_;x-15Xga8^)&<3JYtE_GJS!A?>R12|Xc;Sc92w1lAU5e9?rBX&@1ZvlcGc)juX zUb%;eGxwxB`$JbWe%`(vFe{qmU`O;Wq+K$SsS0eYOORr06NKO5*u-f7!`y7m(hkb= zHE{_IMO>{{zEHIV`CV-{EQX~Tm7C{97(-z+9Q-nZBIeBYiKZwV%$;6mc-(IN+#kG$ zGK6@VjJj1#j9g$3Lh>^$HHL9C$MNHyA`Y#|QuB1kfHM_o27A`Kxi}`uS3OvIw0Q46 zrhWjUl#O2bWKXiq9g8Z3ez1fBoDqQqpbL0i9pk15-WUxes$!s47>XsI0O5=xayIu^ z``J#w3GB%pNax43mYZvHr^DLbl4$GrGcl=qW0MLpgv}|8R&-n>n@WB?i`nD63@9q( zcM!<$Fpyu|YkiSl(dwS%T7N6f%)wBsJXEo7#yczKCK%n3IS4^wfs>8-w|VcOe(`T} zalwA-PZO!c8t|vN++L;y|2CKEt(#xH;jL%snr_iGq% zgDYiu>5ofG#qIY?;xIWkHUQOrsJtFyvcvVcTTj6aXc zrxbYfJ&*cX(HpP>jwmi^jKPQkF18RP=TG38)vJ8f{3lLFL~{RSnluVDNt%{uQu>I| zE0|fJNrMTR#8|VX9zH=7I`9lpqi25@;{=|zS@hdLM2{a z?PZfTzQd%)*3q=l>Yg)`g&+xxk(d>hN<8k)A_z71OuKC#Dg}BamOO7leffQI%0ylr z_ASyw3X=nnqUF*;_?_bzPg`!@5RIR6IjbKN`Gxbs zd-h)5h!jeINA6_p=A&sh7n&sI)%(k=Nm`ZM8;o$$20B(Bc#j|?o#WdH@wY#o7r&oZ%1V!8;p>)|6%)=FLRbfF77Oo)?Bxu1R~uEysO=`X`(d2cq1wW57GL< zh5ZSv;^@j+g|B$eY-4!@nv;xU%B}HP^7=y-t7IP=<9XSwM6{LjRhr~xzVrNwG1hEi z<$3*@=UqEx@!bESW7K;Sh$cEQP@4VevIK=AB6u7tNBj(9jM2KLuwEVp|IcCw#@**m zZCGly&z`rA*USCPTo>-To+euQK6}~R8Y}DN`;;ck%Dca1m9re)e=fCml{z4|F0Un1 ztvhh{=skm`2DTTl$s6oO!^Fz2nIw+qi`pCIu5;eK@YEKO>3S-%Eh2p$MnpmlNJwP| zV#Z5R_D2sFxpd#zqMWeV!pA}R^Tn?#0G))S4K$h)dwHoiIGgJhC-c`~wb7y+?FqeT z1$cq$UfBBsIiZr8*Rc4uHTn*;S9vK{dTgF-tEH%Xk#Z*!)P=)(&^?p#yI|V6e z5f_DRKDGILam&gUQWp`5W032*mU&VBoST^Y#W5<|%CQ@iFNzBSwIV2$QpH+0K9AA_ z4_Q%XxIxp?;Z%lbD=qTWC=4|>x6uW(+K`y78;@tq{yUSRn;Y}D|2dNc$QjcYXHpJb zF+=@@nO=V;p1U#g>e&n)pBbz(Z#(Zg?bhAD{N-`0HFGfY&90ejNM49-%e!~)ep`KM z=D2f2{b3dL7#$N@GidWqe}))0)pDT+CEh6CsDllMXu>|{QVwQ_Pkq}y?sq9uuGS$W z_3l6CuPsZOU>_x;FKHo2gK7c5xJQHI%l2pBi?F4#1sE-4=c+WIx(PIZ7LmXh_f|=s z(4opH&#!d#Yb&s_7`(8ko~-FMOCabLJN!sCudp-hL&{%s5i*d)?HjXta#DG9wG$RI z(bydn=WzDn4T(2c$0K{VMe2;)6+0-=^B=!p($7oMlJZGEPm{jBz8TZ5heY~@y zl%%QzZNWOh#a1)1aA2!UELOpQiWvwGs9;xDLBxxemG8zaE1h6j=}fV#n2?(dte1&# zV}^vK2Y4CdTxtfFz3gxTecfZ~l03LFf3^rDGoe(*pRq>d3%}REC))CE@~pk%cg1Nr zL+UFI*dKvhrk#o{+{nKXgw zN%%5h8P&bo7h?W@{314rswGxbSL#246N8c*Wa;~%Peu4Rq$HYtE#i{az7Ea`ETC@I zyO5Ue1+s7WC9IKGHH7M<+<8MS!amJRdo2{l5#v_W=yIK3F)vc6ka9oUjHavyoR?QG zZt>wzChsRXvzJba9>Bn=E%PLJjIry=bQ1D(ccZ9nM%>StU0frt)KQrlw9%s4P%}Vl z1J(_t5mLc;>R8M10_>V(LmfApQ}YFCHfGUMM=Qa=%~DX(KgQd}EkZDTMPTga?036YEQpUR*j2^ltLuj$l`6%1(9oII8R4gKbI>kVTY>JOTIH~j5mPdgU!C5sLFo1;vEh=4Cp zJX@(I{A`gvN%<>tp9VK37@0E+ZOE`YYJpyHJDM9XQips$V(o^Y<-10 ziivzd4Rvy7yvAQZJ?pyz)pcJ}!V55i=XA^Cy981n_Xp;T?5E4^ckfUEkTZ`xdCeXl z$18toR)lVfxg?;p7s4-tYX934e_M4#2O2Pt}=zQi?LZ|<@@zYR9373H{99ei4=Lt3H5RByA}zm49h zv0IE)2w}q$v@3N~WOhy5PVNYs%=}*Yp7HM5<_Y1%@9An7;$h9oAYGFxX18yz^P|s4 z7$SiqTu>qX_U(Os9CMc;g%9;eUETF4?)atPb9i6w@#6a|n)RBmUw2E=-2fqn^x9uP z%Q7I_rD4}$@Xv--pm_V$RcHWV0sR*04LW-zVgR{{?bb%OebU5t5fNxdnA7ZD7w;@U zr4~z4D0n4`kv|}fRqGET^DwAsV}jxGvcjp!G}>twzf<+9UGC&Zjs-@v6S*ENA_TDH zpA!Ltc&(&nfkvIEGvk3`2q&}3>>y&0n@Mf491osQUe4Iq2fb1g*gk|M_vaTV!peHT z2zOb&pyOQRs>~{-WWo9Q=0!B8xRQDuqZ9e$!ZP0szBN*Ab|89jxR?u;b4%ib=9C5n zVYK;RdAn|YT%ZU`*5l&B(*3+st{;v+|6HHg^BJgd6x?93kYjqmA^(Lu32?o*VF zAL(vtPw8iC?~D2&)Fm+F0mICSX3K<4N*!PV4DAcXX!!?^yIpHOq&>4-W$=VYc@JPg z1Oe64tb_DH7Sp986&YCiZ$As?ap z!s6yd(QUuu&s{(GVvCDn)IUu(_WGyS5OJt*poJ$6xtttbj@}N%P@)aX`NeZRN!%v7uDFNl9;pBQ=7;im zAk5LL&YkN3%bgsGt2=Wa=9^f>g0tqs^?w`b6vGu{Kfv29j>awH8KA{v&(7vkoNBuu zNOk1mtl(}eJLAzK!A2sFYsdn1b>$!9mMg*p7S3snitVVtdIK(F)ScZh5yFHoMQG%j z72>~1gsQ${yxDFn61-WKzwE7Uw{G8V&cz^1j6L>K2E6ov;u9(4O7+VZ%1Yjh=Z~wA zlE(){NGMTwyRT%JrWsE8r(%E7oHF0~ALl_C^%&uHxw)4Dh1)^#wnB;uddF{5b=dtoIgZ7-Pc95dNLcg zU6={MCkwHglqlj0)=p-Z_p&oQ3VyhD`RMC!-nUjCecgQD3V@vPAZv^n?c$H+nAn5+ zGId357xT6MK^(FUS0e0$b5j4@P^;cZ$+zBq{@3SN-s&CfM{ZPJUb5>!`Sae2MV}k>R}(CUD?K!H=lv_almmo0@pbPFoSHx6 z0Kvs6gwdv|c>hv_BV9xfRv>>mMIeH^VY>=88Ma5u<`?5K$E`F;wV;}}(iA}XLHWmC zh?$={&ap9?a;r&EpgqX@A>t7v*Oe<;QS2nyA9iAoHq*E3V7b?=2UpV0le#Ti5 z#%`S^aydp5`Cde6jP@f7-zNQ~!o0VJc}mG1$*Y9HjKRQ_8)^d|P+JFAHJg8V zWQwJo^0JLJptj1JIEeG8lxksrHUcQbad^9>(!I?wPDBZW!LXO1&}V`79ZVPUbrW@eNfwUfN*@%DV@ZpMl6-t*WQuavslJiYVTG{B=-i^X>Ettkre|@ zK^*1^V_&D}IJV;i|G`?@)KEdD_Z-I{$2&S|{}jmX5` z<>t#RIX^ate9Fxe_nRlWpWm{AtX@)2da4cu%OBrs9%`TE35oTv>%1{#Nmbu62Cmo? zL$yocf=)O#8nLe~AjB(#(_NewoxA%124*K@-_~!`4t$v*EKJ)peZ|O3pqTScI$nTK$jY6k z&y&ej$)sEx?e2v^&!mISN&mFvRtUUARlzO7)Mjhths4v^FiNlQ<;Sn9dLGBCn_eNm zVzk=_0eyV*h_b;P8YDjBm2N^CFF!^_NkemHvS#V#Y=9V+oB-!4jNxQd&8pXOB(-u) z!WZF0zW*}q(5I2Pd*h7&AVN0e{H-~dJLU5(D7ym{4m+!Or5o($PPt8-pfoP>V_+8@ z-AvGC4>?$Qmme*!XMBUgD#(89sRDO%{$S^pg z{8q=pcBI49s$Y!vgO6BzHi-2?t*mX$*i*TQ~@dFsP8M( z5u}*23I#|@`};B#c0fsrLUsfuSiNnf1u~bm(yV#Jl$~f)u|P8b{b)Z1n7-06lY2sI>0y`eUWymKt8tNYHJ|Ph~w1wbWZ{n(-z6) zw?1#sNatn#t9=5f@ji_!IM-9J*}h7VJzfS$h&8U(EInL88-vv9)rq-{(Oy*~G&G{> zV6^5LwhnDn^Tk^#4KrW62fnM%S{LyxGnRDb#iVo2k-yNT))rAB+w}lnq?c^ZZaW zA|m`;$&QpzeDA73(Whbq5dzP2$o7%WtNy7y7$OOhVRv#cxKtx)r$2UGq3^q0b5I^3 zj5wHtn(QXq&T|f?KML;xq$V;kZB#ChsU9!#awrDPVG{ z;chZe!iw41eGx@lChcZ6`4|o`%edlWu}w}?rFGi};l#xOyBxG%g}#Dl&6rWaA;)^q z*UD84=K(gAfHYwm!we9;`AhMvs^ULgNau ze%bdwbqH?e;5HI7183(5RWeiGo^=r&){fCCL+j5v{Un5f1^Fy#q=SdW|FyLduWPHB(IafUuq{K)s0HwU3x&Z3^`n?%Xh2 zQ3HV4%eBnlXb%p`5mz%o%-*qe!Ak%fV4 ze@+}`XrS|AVTy?kxkX|(r9{WTVt0tZJ~d`8i7yEICc2M_`X<#n2-2cfdapeoaVtpq zNyl`mULAjv9*j$|i`iK;RUww|gFOvR_oJQipb4=kI`H9r`%+nj`Wf)K^n)N2ndCnM zPJ5eV1hz|){_R%|coY2WE*fR&hXj*3Il{;7 z8&t@lrkYvmOu7}(*Y~0VZ=&JfkE2~?(dz9;Ao{AhcQ2BtrD_5#H|QHrs?|V=eu5Z2 zt5O((jCK~Zp)D-rUoF@?5$HKC5iaTh1A7up-Nw#P4Jw%(o?DfsKvk)(9e}~v=onVA zD+D(z{$r>&-f6@YuTLE!tqrGZQJsz&d0jxeqX}fFf={N3Xb;t77_1>rY{|7X;yU8H zxKIFaF-mZC`Z;o1RFBGhLWoa7Mx0~oCGC+v-vjK8;m=Dy06U8|`5O|zwRXS7Gvp`ud=)ATLFr)-ZuJ?KR=x>Wdo)MYG1*WUDn2B4 zJXwn~oDXLT&kxJ{{oJf}5+dWM8 zT^jJ_zrTxJwuRZ$ZBn*H=jtKGkQ{@{-`{aVqxD}-MEXUj=K9lEHyoyPFE=r_NzoA>H1Th`?R z2|p5fZEd3w>Qv8`mg3FpvB1*BWujZdHlb=atB4P;UAG!(`B7pWHg$mng!X0B5hxMz zS@t~GC{ZbA76$9DF_-a*u)yEKk5y4!R%+^7OUu=3`3jv^D^%;Jz3=^GEQqN*P$$xQ zZ~FXb{I!uFaF4MXO+yi?YzOg9lbA6l`t%w>0mv#EUUJ-2ud2yT+Dq-a2qb(>w3Sb| z9fET=oL5*qE8eN!xTfk_^j^*UntY7Lza!VTK`P#BZd0*{rhwIlmJ}9>!sbCHde# zW4$xbRV)5gT5dX2IiwdxSJpVVzmtQ+({%w&^L)mec< zawXzS2-s)=8qsQrybO)pbD;HiofNM`=S1s?Md-Rk6N|FDJK@V8R`@)C z@Otoz~B(5oUmQQY4KW zUNzsU3aeqlF7SoeoWZ4bJ*jJa(tlg^ZA?0YZ>a0k#N3mpch8s(g#i51g?%^){n(hp zgX)d;W);&Xpj1yfiGev?AYoDs6r$l27eoH`sRBE&4Bhmk?nxNpX`u@t93@21_ae6$ z??6hGJQBt;mxC*SH@QIy?&{ZG?{9TkMGaF}rx;bWQfTky)GXSsf1{#eYE^K!JF%~* zRC|&(%aW3!S%7vEO{-^xaoUQe_@)>A8f^lnu}}71x8E2+kX2_r=s+s4bl(ps z)u=v4g`FgRzTIm`;v1bc^=Y3>jEU^bUmFL*G3kdLTD0uoy0c&D&7cz6$DoXOqYdM< zRSdNDW(E8C>y=s`XFWg2DRtsli`#v&6De6WI={l_gbGoL$~qa@dg&pBp(`2#dmC4cTW2N@J=)k&d328 z2RSp^6d!UoK9RD_4jhVIgHn&Uj7c6FA+DbYkCfTwV%ex<9+U;({KbHcng`~Lk+L)& zk4A$I^)cFCowOGECdfPyLe2wxzf1q{Tv&_{i7`d~`dMM?tJ<*}hejd{vATAvyR zm73x>C?S>&HXl{;jN90+2W!==0waoiHx%*lz|Iw`PJB;%%*Zx@=+`SR5C6=|55A^I z;X?}H#6IE;b=CXAao{<%($YR2ICU5gu@~(4yc3~(;CmzDaaS(#!Ae0(CwtRS)`EB* z087S^0J8Byz%d_jzySnOxWQ&gCm)a^t6lE_^WZea4f4bpNpjh>hZql34Qp`eX}A5s zW01x_`dS|;8@IpT-F^X67$9VK-d)Zie2(UC|Mksl`*`^Do4;yY3oD~4lzJp;ANbzu zk(Kh5G(v=AkIb6E3FBr%^TS(p%J=80GsZ-3b;g4Th8OY11m*~U%5+jc z8o>y@>`vbVVM{Y8dLu0L11 zImDLV%ZuNskibI}&_irfG2n###7oe=PLG{%`H_%jtL*CO9aVj5zPgp6!~91JaeqW8 zsiHSkNU%`V0kG!p^zoKQj=Mls>v+9aZN@m3Ckg{ zdQ6<F`QaZ4h)P<7Dg?`|M`_Y4gDppGH4lcx;aRWMH94iZP@H@0M6d+pJcSg#6EG*^qYpGEn zsbok2uhv<&{mPE!^?PCEs#6Vi+V7e-A9DO zndP1&@Eec>z~Ar)>1NYj%Lg%h+8;1%LU97P<3y+5gwqFjv`3*u4NQo?YmU!8Hw_-1 zk=XwJ{?5kZwY~lIji2_mx3_lpzuVe=@_1{1b9?)TeX7&ccn*V`mVXvmEaV-M7Ao36E1ejs9R ze|KYTXJc>w*^9l6ofnT8;`;Xfi|xJrSGybg+dKQeY`@z7`PtUi{*#UUr_Xja*2}@B zUVO_w18sGjZMQsK)Ge*U`u6h|$Z{Fo4VtKPwm>xmCPAqtGcHEe)K3_a#5``d5MV)( zAgwuF3Idj7J`?FPIcv4D06ct1VYzg<^x$E!ZKh^9n1;yJ6-6^#LU^D#02$Rt5#x_AY14*ilAsCqX1?Kl_IVBT+;rhs1ms z!l$RT&5*un8dAV`=gY-^f+717rBC`=?VcT~(BHG(sGl^F8aBGmARq<#8e<@KUM?hb z!Yhq%Y}1YJx3q~UD3QbfAn&dQVBYhQ2A*0*ZcWa%Hpanz`Q6;yR;OJYEzXzUer!-MWD-Lt^*WK7Jg6atTxL=$K`;ov-2kjli6%?DjgCk>%lS4Sz409YDF~|P? zm(8)ifAbvss_AMKh|2zEg(H1z5S2P+F1LurtIi>C^iT@3hX`J+@O2p7^8-eA_JyN6 z`^4zZs?nWgqwBFF#zr@@dwFu$@8+XPsT2O_ZU>8%N^{a?XpI}Iy`ySF%bf2ATm-H+ zxNc5=PWD=8GVP<-0>ReN;Own^tMoP)Hqr3HNKRvj$!Z))bZZWft2MdnxNBz4@|Cb> zjDNzF8zKL@Ab)!HWq5IVb~9d_p55L3<@uBCt^K|2{oTEtXD`0n-+TOBS>1oU`^$^9 z{bxuvkN38BvIpswBZ}>V;b!>>kOi>B1#(S&b?k1l@xT68Y|&V$#*scZ^exx@l208B z5iOntgs6Y7_DCPC-N?T@27#`B|LvE2f7IVKs{vcR{`KsEzMWm>U#_po+ej5Uq6)(= z+;_uI?7QKk_nz>i&ocsw?5 z``xpXUbBONBe>1P@A^kyhVA{Mo3Xurg!vllVw&;k=1RQhX$tAdrRUtYHp|WtX^v^1 zp62`X5=+5dH`W((95=U_gLA%mW?I;wmS3$`D?u02Ygh!YQUh%f3~*uh%7Y_ZjJF-I z7MCe7@kFHw$KDE06bG)KxBIFpZ9kDf7IE`1Ms9fLw{^r+qaiZJ`b&?HMXk|n%*R{9 z+EuIg=U@IgUvPfj-Qj7sGn%U-1d*BLIr$or*e}D%e#@CCZiy2L9eP!vcilcX)%x2* z+%D^7>;HSGQgXyByvKO<{+syf%KO_TE$}y}O2g&dVYluMIb2KT|NH*ew`_QRVLuDiWBfA{3zw6ehNMOHuu#oimlR=S#L6hM3(NB!-_|8Be~ z^lbk%FViWiMBp8hAC_mI`QM?P-ihC5K$qSLy|(gRQwzqWH~kA0M_^`fKLJi^+`EpV z?y9k;BOrTB7hLGQ=9JbjIHiR+QD#bmP|N9n`a-9t-OD-EY{JJ?gG8;j*bVuemW^{= z!TVFMjSb>hX7tYd?YaJHW9Dk6al7B-Zv*M=?r(TS=7dbuWC2da>K_jV2bXhgt(P@r zO|qtRoNEPo^A1REL!G~kBh!h-_ic#APHUWKq>X%*fAJGctM+J`aB=n-;bQvp|61X~ zCU-qu6y9mwOdxk!P9RM|DYq9_xbfZK;Pm*%Ex(oV`t!~5WD{)Cp;kwmZ`2-Qt1DEE zwS!)-Kbn!dg<|b*ac2!@s04pNH4CpEkmJ!tpuiP}TUfyv9x!QTP#Nz>95l4jqvRU_ zEdyDNAc55dzBb6Tb~8rIGk=afpkW$@s);Jiqj&cMC*Ik+a!F5L8G^wqSQqWD+8Kui z1-V6{*g89_p;wMrIa@#{n-9*BEP8FPf?z;n?EaM;k9-TIkj@@-+A(nMo}oO=pn56m z4gq22UVLuq(~)VMLd>82dOwwRUcJ@G=yEwD%O)uzM|aB2^dqFW5142 zv694}^zV9!s?||*OLM5O!!D)e%h2YVGh0h$(ZbO7n78|7S{pbI zqgU9D@Q}TxX0>ltOg(Inc7ZoEJ<#92rW=@;yVt5o@(q}5bX292&g-T&9!v+Q$s}%*iCiXQ) zSd4G=yTjvyld#~F-m3b1Ip|+dy*I-`M^g%`$mA7pmfYry22$?ORX`5{nE2S7niq(_ z39R@Q6q~V7nZ?3aIJY%6nqikz{4@c#{;l@B>ss6I<{EgiN0d$CsFPOvO+yij90Qwr z3nVqp;8`o;Avn&YJx^x)-PKim!w^387-_ZMNV2W(8 z?3XR z@ljfI6lWT_?2Ip+GoXh!+2dnMmL!o<@=hlETo+NbAI8>m=TsOD^4jdI4p(3HKxn- z!fAhqi~(TNJBQ^-^^Q)13iCKj?{GTwkwQgGtdH-tu8V4w;!RFByQn%_uR2?wGDk{) z8&HrV0|I~v!uYrESLdcJ>t$HfhP6pvgYZtiUK6tFe1Vv^uamfJ5)g`0@}b+i`ql=}EGzyo*6TyfZd1l*XStQxQ zUOC#FYC0~U-xbl0Z#R50jqB?-C@a@G=5A(%_v_1O{j6m>Qdt%#-e$1qub>_|MHiA-e$M&FCuJYR>66y+RzANPb`-f zjeOEu)4ojK?(=P(#F3t?^uHO#@Asn`NnZNv{+pF4->q97GqWLwV+Wd(tQuXJe&2ne z>G$0yOuz3ij9n6cd11>?Zo5(Y{bu=nJJ;K{$F)yMYwtH}MuE8o4t#p@WP#>PvVFlL zeQOhVN&Fj_6HGHBCh_(Q?YVD1Vb6VgboU3$$$@}4Lz?i!y?Fe5quEekQ=?elUVHU? z1VUCjVfeT@pZ+P7zJw-KRw=g_V~%xMy=&f z2ZN3j`@G@q#@5D~^|`yj$2_tSBDmWgHHxRtHn!HAji;Sf?|c`A^f=_l&|>HD zcN*sY?n`1{)OK)iq-2_1RPh5|diG-L*$aY6Lc3<;Sx*Mv*evTIpHqCCk2FrH*@*K{ z?~ECL_)pTw>1%8IF*lxa_+7l^o+2h@-i^@i3DG$lkAdBjK2F?&Uby|@)z%j9hw+3P z8!uixZ#Fhyec{H|vt9b%>I`G|+fTj+d@O>+mxNY+lK>ino<9mOTqmdoaR037)ij6{F3wQNNzxjgY*FalO6o3uXLs%K*5e)fWbK7rq{@TAc8? z|EI@Wuj=D{);m4(m8iGI1^D#w+Q#H~L6!F49XxG(5U*ZnTTP7kRgbMO-d0#K*;H6E zwdLfn6GGKTtvTKVI-99u()dRbO4VSPuq*#Yz>kf;?`^!;HR9puu@Pm;Mv<>{tzBH` ztZhEntZg;StgS_yRg01}udPY;Mz$nb>$DzY=GOWIb8A)c1TQja;zclrN}ixbf>S933{$-ZnMujTsSqQL(XH`{q7@t` zI>JoW>G68!pf}=p(9RJ>%{X8bvvOc(f6;&4FE)l=;QEDYGqsYC zLmARc4a8`lzZ!r>w%CWoxKK!yS(De*gEtg8iU{)eu3$GDcT4&1R!^{T%pV@Lbc_eK z@{=U}!=jdshu9b_5b*Kl3Kx6*_msur$5wRbyX<9B(fVTfY;&%KCp!ZrcfJ&q+A$Yd zd19Qpu^w|<*)o_xz4(op56CjGzcJI91EB1@92rjhi4Qj9S`%~X*P)z@tC(fS>>2WX znsG_Uy%NP?tZG`i%BmCfjBrj?^(9p7R?{x|f$Gw}M!e0Tbg?Lne?6_@{M-elFErt` zPfl3IPnn3q#NSH}4HI%8gxT;}tYS6-iD*iE5E$GC&)GP3buLMZbARmu8ILo@{kMwc zxYDW-{aIjWP(FG63YuN@!9oM_=lT@`FS7Av0P`hUn}F6D&`QYgxQ0@$Zl@?JiV_G& zgk_o3h%V@G{#9Gz^b2X`=_hFB>5=b(AM}|F`*$XEg5B+>&BizU`)#Axu;2X4?Ps ztwn11q^Up8!F4W24tCqhvTt{Ac7`l<>no(yg1dH}+LpHfa^LHkKTX#G+-Vqj*$ebUc=|_2Hl8d7) zGa&Ib&LSGG*E$1Lpd9ddkL1|_!|4z$Ms+6uaruFBz0xdkH-yWd{IXgvyOHuAf>aRlD>TqSuq(+J zAE)~9x}irga^c&p3J8tcKWd7%Au$F8ot;{<)2GB-A&RQ)vI1djo!bp;Ik)>zh5*x# zT=qgpPC-o0?Z(V?qZ+%-jj=NpjA0g!lMnMXW4K|M1}z>}p&034xu=`RUEY~iEdIVj zY>|S-u)Sez8?4;sAW{6NiWRe&^fi+>aE`c9_*;11fKbmY&YbiI#FUKMl6ZUHlGvR; zPA05g(WqJuiES^S-M2e6AiT+7U>Nl=@aoqAd4H?qNDGe(7*rEDBZ64QOK70_UM8F8 za(rx<9##urYaKowP$!8_V}3|{gM;>I7oC0XZ~yxruYGUM{7u!Cst0ervKzK)Krq^H zGlrhRBkH<_Zz5%sXALaA(E4&U#R9aQ9eLC=-wvoZn6P_pcHlxsU&w`yKEZ{KDlYUS zQw^VJBc^@#dDSq<^S`w;urCx|jy@s0934eHA{SkL$UK+1hklfYLk+H1vbTSTocly- z+RKRuxPTdBs>aJtM1{Rn!kk;F%kMW=xC|GWjI|je!2Z}QFZbtuBefgn;l6%v5*9IE z{OtEzH4TKPf11}n3(+$bt@wX3Z0i?8s4S*JkxLA{Qf5Fmg>BhtYo!UeU-P`p zzg&C2t zipso?rtAJ3{`KGPQozF_i@w?E)lX%IS69_ld^SGH*lPT~G}Wn?^7qL1+HXO~r(ekT zo_>PwJ#E2~Df>RkRA+NWmA`JT@DNXT_T(8v0yn5-()_ll=jK(;T9jX9634H$y`oiT zdPc>d{7vRg2~A2XTSzWvl5aS(F-rWL*?4WifIbDJASxEY&|=>gC`$Z ze|}~D_U%q;rK;yHXs`6Y?Sxi+@)>A%=T1MW1q41?DuznRPK)HHbI3;gv{yulQafV$ z$WAW98_ax&>&K%We*cds{Sk8KLs#mfah?nW~OL;i{Ew5o*xklI{?Q;y=~nORs(*DwZ8r)Bl9d#(jaaQ)bHK8rD6E!ZHvS0;75o}e z9xJIZ|LBpC=Ff;B=cUkgzW8gS(fI3a)gKAk4%f8(E1%^7Reba(va&r%%+J4&ayO8InPJ%&NJBD&1k(Wo<$wRatLoIb zbay&Io&D@SpMCbVBk4YUE_JHv)a_K2aE^77nBUMzdQMkS*>=iS$~FXycGB)5-ob_RBe)byN}v0k6C*|S0$Q2$37(1D6p-9N zQ2{()>8&FPCw|S9 z^zpTmutwKT!r}rvL04pp21#W{5X*GI3)ra(o*Jw5#5Y?7Z$z#sc)`}~g6CrEE_kuB zQ}EE*!Ass1O^d#RjlAG1vX~b1y*o)bZop860{qaOWTDuQ@*- zE)a9N@7ZdBVr+xZvy<#6;tRuhF=D+3{8l5|z+sU9d(eUTtA}bTgw9lT&pXbL(Ui&- zvumdl&p#MGlpjpJT0Ic~{CtT0@bvMI<~(!98oyas!0|R*f+c6%8=RY5>NpnhFnWNc za{pe>2xZQ+eF7r#=cUK&@(^XdX7A^Tt=%!1*%8seGdIMwWD4Kbg!4~qGS>Dr{FS&D z>%X)`uqO8_R9DoqEeAFEV^C(nmkX}=-9+APsJG~AR|#v%*IPwjqqZUO$Na7={6N|1 zg6C8zH(vNbjdPRNDSU&6d!i6_S?DTHX8;v*n1TuaFvD_%3l)8A%j-;@`^rwihd<9S zs^w-y-_L@v#w%E~P4li?&E%OIwpcLyyen!m`E%l(h2L6|nf$F`umzt#aUc(oi6!hO z3&lwGWMMh==o5D|7SFxkrh3G}Q<1wDelq_WhV}H3{C+xb{(WrzHI-(cE|}lu`=>vc z-?seGPzIB$AIdv^FwK83&42h&KKsE8|AQI+M>G77X80e?@IRX2e>B7YX!`rn^!KCb z??=<0vf-ahe?OW2elq?2WcvHb^!JnL?NIb^Z6 zt0(70?&LI1ipgXF83I>`dQmq*^;++MNB2(rNS-}`xs@__QUo zN(UWY4bLm52-mHQhZRaB)vk1g=ZI%EU(~AgobsqrDgP^C4ikw16$LuC=#SZWqBml98WlKzog)k!MyxWkMEZWppMg7zaxD;Ph~kB( zm=6`K3ucWp_*fC%{>1Lkg7;DX7raG9y=U>$A0_m#04WoQDTu^Icn~%Up|A(ZDDolS z!9AIArF}%`@W?Zu10!&^l8xr#lJ3L@l!={k@?&DbY&&dU;@RTtN4Y^5IxHV4r18R2YFjYm)G=k!xR!X0<=zg6Hl9;Jh#c9K zVIvXO`(i=Qm0JlcJL&jhwG0m8O6kq=0G z6!s(q*$X4+GV*tr7t;_wmtYZsF_jb@$Ghyo<}j#;b{L`$XojIgn+SU%mX7`(yI7oH z-jqHjw|)^k^lgGIyPjXKd!07?V zi)Y9vL_J^GU8mhlA3P4?Xag|=~?Cf5@@IQ80v;8T}LpK9eo45NQY4C8;Fl&}J1le`rx z=qfAd^5M7)e$a>U1RRj!Zsi{_s`l%P+~&!0EdwCqn^^9P(WLzQpCMZoeLorSx%N*; z?T1EI%WQ?1%mL?kfpDV^15UpL5do@chzJ&85YZav4k)7Y8SHRh@YfiB{X~C^@W%rE zfg~38=;5Yn)Jx>BOz5y&P98!<#FHN&qv6SqkMQK_Q+o3AkNgA-5RafR`N1pu(KZxpAtHIY2c1Nii-Qe~?!o2pV|9s)$(edQ<9&r=aGgo_6^@b8 zgOrE3d%dK8i!=4YJ=j5LSbWUC-%#VgNwU)tC&}F;{uS{>QRiBmC98=zOWw@Kr{qLA zyN>UY^W^1xyc6W^>+;UZ@gb#yS`;wrLLRv`M4IT`(3*#37n8r86OoC%8nx9VbiGK7 z1lezS^}OOW&TrYTq0WMCFY2=L1*3va$X^i+9KIiapP3M-k&Q(1133@N^oh{n+w$V1 zLw{6cQ^|q-zL~dyV^FZ`NI*zvjHeQULU}jXW7F!hLyTU&oEPsHm(C_{PHQOTq2fWA zyNQ8IcYI^z3pVQ$k1!FsL_N9-pUGXccsJoo#dAzo(7ceAYGA5nAjHR9mlz%r4lH?>DlcA)}bZ^UKNdg@cR?ekVs%){TQne|HhcG|W^Mmwo)Z_iMao{o{EydoG zb!!4%lKfjeGWVYgzRF)}){m$x!D(B^<~z0K2gR$IKXLD0?yj2O=X5vK{GCAKw#{%S z*8JV+=@nzOFu64lRc&9T2rJGn0zO9gYYLX&KC<^C!Fni^{PW~3F=k&IS?=ag3`f7G zRfxW3AK;KO_AJ+dn~%Q;Ipbmb0Z}^R4<@QaP%y5KU83Le=K($V6AQ5}v&4{O+=Xiw zn-$T$ImWofs^DS7=~%>>i~CR6oBAlPvLD&~4dPr6GMQ45oU;CrC$}< z`Q2396og*}U+*FME!$rm714Vc{>}lf5iI`gba5z1;H4Jz*0rMH`^=W7qINOs&K*R0 z=z7#-w+88J09kXIPNWk%F9&0*6b!s>Ur=sUZCtRf0MOI9W-r9J9Bb5(+^j?sEMSNQ zJ0DDDB1Iea77~>PR?A-Y{A<|E0<${dWD*Y`Hp4p1q|2t0#Yi)|+p_U+4am?wc@avZ zv&`S4u>!tt=--#ULVElyxw;&VI<+c9dR6l7^l*QzLX z7Q+EEsh#*##lCk~DMZ%DaKkvKk)z33#!pdw1{sn#8I?zMA(2ntKBpSwHd4u_K*sP- zM7ujjs@=hhh*ZG5LRI_82uV?^DEf@QOjM@)1GSvCd(@)~?Crj8g-RqTeR}87r2X`? zh5_Vk4-(pu*;AYjnfzYnI5fnYduv1?w`o2x*+mmddU`w!W;XM06T^G;n+&p9?4B7K zB;@_KT$vTq{O$8mQ}s+AE5&jFJYfzYg}oU4d<8dP{k-Xd8FoaU`MDA8nJ4(nCN5(F zG73y@jtox5#TQs_=n$4v5rG6mRualtMhU3dFPQs?a!BMpksF`IA5ks|{{sUZ6TS^p z&T^+6b3*irY+}H$f{BT5{1&6|2e%)`nYB@*g>O<+@Kul6F#gQc1L9W-dyu3GMN^;y=Z~@g$!Dn+-^qN9Lfh`4_Viw~@-)s{DEo zQw=Z0yeESzusFFTOk^Y|7~&rpp@vbQl~@|9qqeH2@dx9Qj7ao95pA>=pl~k^&k&oy zR4i`2aH$}s`l3IsCt3Pqme|wi5=A{DHwOt)Ck>36ZE6s;qs{=~LS{y1u4HeWfB_TP zE&)30gPAZ3qKLp5BI=dl%J!m}nv;BPO~FXThXXsy3T@Qtk@E3LM378AS?9u{1fePj zi1K7U(9EGu57UoGL@)S6I4%Jv|B2@X%grswB%1%!ILvaN*_5LBPsFd5`$BVz=0E6B zM%scUWwMLrKeYOA!N-=%`JYV?LqJr7*dey~I29}=XHygTqK>LQ#fAr8oNyA4hnW6Q zs>ftzQ{>1CWG2r7noVEqcR!0U)SDTQ&SPX&yET|D(GUL7X`v2h5{&J}Bsz;_Iq;~t zJ3$Ao&)gBBz<^9aLmv~$HohS9_V)(^v-6pN&^$fsCu9suEzeFNXdq0D*$#(`SXq(D z54RcYD;9-QM_7|Ei1UnOGj(Su$$-%wD?~q*7pIGTmFW@MIf<%@7Lx-m9m01!{-Z*T z(@#Lm!ao{d236^n0fWP3z=6({zK?VTzraJFBwDliw*B>6^gb zI6WI*$w&h2iI#klo}m>Y?viJnm* zb3VwRtv~p!rLKZ~oPD$W4bN^?-|t5GX~EvhZEK2b_P0K;Q$fI!bL*A}P+XXz7!7#q zak%(VBePN|0pj|1;0OxMGu_`z9A0^7LIL0&eb$gfBMu zd&?gXzbI@kn4cekce!v)H^s3O#*Rvs2(dxhsg>{en6l9o5@jNnDgt+kmAe8fr0)|6 zIhFFY+i>H+S~ra&6P9WfV7QWT!&L7O(l5DZn!i|4$Uw8j#(brx=Ztu?jTAmQk#9N^ z-rv0io)ORA0;7BS#>;S52x#8`Cd!U0Jkyph(*R75NtQsU0I&ZRBxP11r^*!g6q%he z>U#*nK(sA5b21R7E5NR919Fpizix%3g~i|$`j*iVetKIm+j(VfYXxlTZ`l?*O+=2; z5%jOJHyOPzM;vzDU$H&;6X$Q)8aeQ0+LjDG_=XRjY^ds$(!;GNz*7)&5cY5$#lVldacvT;yT^=026?j|M1CcYD!mRZH^PT2|h8|AAC zvm29geL8;0Az{;h=MEOLW#uer@$nX>M%s6q%=z0@wzi1oQLv z#rOZHdyDgBd*l#&>`68Lx1y|=sMj!Z*EDm^F9S`ade{l-$=3rHnn_~ZGgU#W4XveX zvmLF^Q^;O5svHf^QDX%~s1ApN!}hq=YEdExNj8QEoR9|DEAiczL{`s$gl|1U5Lrte zS1K;XXA)3l0G8|me=R7NxN@8(kh%pl?>lJPEYt&JmR4BapAD9VUCp#sgLQI!0ZS@h z?<99BsA3US5CCm=*`i>0l;)#Y_T_#pGmdb`h%L55x-xl zS^^z&>i0!dyt~nm{|bGh`LBS|NQ6^ZLZXgV%g6+%95Ruv5>43DJx9W()^N50)2-p; zgiWpC+(j?#jpKvsCH=cO02~ktll0>qeu@$}@2SztLEJc|X3w`8E5F6~;J=@bKa(^-sXTPN#l33BrnpI~`;j%* zIYAU{2KcNRRnbfKh990%Qb?S4t{t9@x|I@;eGI8^KptGN;q(X}1(M!>`f z#Ib(*STrBPD}JoIWARB~YlU0~R<~jM5g{#K`PA1k^bTNaK#T!4h69>u_%Iv4i{_pS zExRAXAd;0P?LP>%g&>ax&Nv*r4aYEx4G_iIOs9Y73{BYyTj(-er}yN5>L|~K0%19< zIrG*{?~5T&PPsriNf||(GQGzc)@ki#(|hy4EsG`OR2$JPKffTt(eG!3k2k&n>}~ek z`#P%HZC=&Qnm&JjtD&rkUdtFuxxTC`g9t)9CH9>o0f*uKH{~c@&~k>o4Y1|wy0GX` z@OiLILSEfZLe6RJEdoq3hbd>uoQAq{H+16X5Bm4>EQE~?W5Ep+%}J8$r1lx5`|yE? z2%|%H;vWPl4ecHq_rou1BMnx4pl#vv;{4ckrK^PP}uY`pPHtvWDrdJyRFY(wcs_8Ta?r_EE?!+LFKK z5igA>zs-m7C)`CtT|iP|Nh7OaqGwzSa5F-3nNR3pv9q_iA8*~LGd+cP{gK4$4HN{d1A@j%O4gaiXoRYXHoNc2 z_D+Rbd6~WO@hPPh<~o1$waM~Lvgk)h!8K%fXZuUk;*8ZFdCc|rqfz~k5uOS|Ttx@< zXdSQ|9oD5t4rWHbkzqnfGkd}Il+G(H7F5=1vZ#JU*X{+JaF_I zKngsG{on$Y+dP6Pav@o-PTbenR@Vn=f#&-d^5Cd@Vy0}y!>;Dr(hlMb zrSS%omw9`}s>|CYRhPF5>&~~X%?Wxo8jgoFr@14L__D%|(_bAVaqQU^U+qjNf*Gt}n8`lOJ8$CedWJYM5ltAO8 z5E|RpdgO}4go-1kO15XIFtQFG%1M3hw0%~yt*~qZE5ghh81qlAoUdO-U28ffy@Mc!qi!QFR%F>%9 zKJa>~R+NsZ{wGL|2VVwFxzp7%!6tOxRv4@}V;|tu+Vl=r6j)S~T6mIET8weGzKr^u z==Sn@?$xM$)_uDs$9He;G)dF;aS|b&6nSHyxw^vz7G-mGl2JK=TY^iW;t#3mj^btBS!SpzwG!OwS}&+T49$A{`}b*K^|p8JK{XhN1}p3+Iu_$fxZw2AK@| z3e_G8?YXGHm83Lf8dlM;M;!lhMl`%ELBq>J9=Bq79FD$GFF`40rEm|=W@2)Cw6X{ajKmH#Z#O%IjjA%+i0G3?_XXoVwa zXz{p4MVIs*=}3`vgDPon%m}895-@EzFufBneY}p}=fH#~w+7QY{su&CkQ%;>H!AI* z$az9{OnLM5=(hg8aUnn<&;Y2UcZC2QJtMJ_l>#f|Km~@7Lpl%v6iHwSpyR#aKC1ed z;l>Kf_aqRk&IrrZ5?HP}SibTINJpv%?1|=JTMsY+l&%mHMIrIjM?9^W2DwVNlIHsgd+3dV7t$kulVEwiuY596spJ z{Wa_jYB=nw^#}MbchaF@6usWgV~<|UxJNHa_UMJ%qu)IA`Yj+$9rYa{b#um1n3fV1}L>mhxeAKHFB z#OQtc8k0$%^^GL*aGrnvqQ5Ki)~MEdHVhi|e$n5R`6Zh6g9lKsEcpvi9x8Mg*VbC7 zR~cP{>V9-&hm}~iYl1qwZ0pdW z7|=tJg%~~CLs54%Js%}C*hK4GL`p4iH9lNnOW#~C5v{jW+FT93%f*o>X8}2IwfeJdZxKDFOcPRGwGV8 zTdTb6Y9~&YQWW9q!`exmP{BQ+P#8efqDkN1sdXP-{L%wYQm%JpQbQ1s;n8@sbnq;` zSULbEUg5CWJJ^p8tWdKW&o8Y$i@Qs!gs9p>E56#Rt)e>R|9P?xhsV|4D*dq&pWyp= z75<2MxF67`bv&HL=^oneWAXjHZTzwPXmLKe6gojQ!deS{2~fugzr-K-jaCm%g|(92 zw@v>EdU?Dr4<5U21vZ~#dXH&(=;!hNk~h*Nd=m5Zo6BcAILde8OE_6Dc6>?Z?j68M zXiK;o`sq?17nX9?p20x9W?T@kJ|#E4p#=K~_M%Xt03fp^QdmrIc?{GA&~eUy$pVWY zLx)EK&J#o6R&wr=DQjy+KDkxGC%0N~tU!s4lU+vJKdl^jQp=qg}%*#=G%PkD}48iMUZ_feL*pJB}p~>c)o1IP0HnRJ~h$FrFg= zz>SO8Dd_93q()(2Fg!{{tmwl({_&yy0EI~*b!rTQ=QH-ZAVPs4h_E_S5ePdWV}fU2 z!NUWQi2FywZ14{SqQVqWt>Zt#SZ2{PHJ?!7j^5!S$(#+)L0JT|jdvh4-WgIMzhOeVHNdDh+!kMc#duWMi{$^4r?m}1s*mcfDZ>i5y-xHDkB474XWzGrl6`_TsRxT zSH)u2Lplu)418@7I2X1HNyx;BJBs#^f@l4J7o-hkMfywd%WXeX!UM$PB5DIBS>)p_ zf^oR(*lrhhHcN9qFwM2M_HzajhUVSkB-Dyvy=AcHyVt_jpTo9)B3;$7Pt0xn0IlU} zb+K9j*)0CLy}5zVdos!Pj;>(lx`~2dI5!75Q;BVcOI)r>Mst&w{3hD4!E^RwJprm@ zGO5B@qnE*E0-=k!vmN5NP{q@ zv%>jWj1B=~DSlPYhw`s2@6)OLyHdJvG+?JadH`jx83_<90t!t@F#|?Rg5VB_zi;FCM}Bo}#j+ID(KB0EOHkjHdJ_-RjJnxSr_upM(ppSaDK z={4d*#c-UuJLu_C$2AI=ODHr+Wbv9uYyz4Z7w;b&d(?y7`WQKs}Sr8J` z=H^|H9CC5mI1tw)v@pdA{9(Zi$OB7>(1RJ!7F97mF*29y5d7Or=pG&I9w!HEVY?G< zjtaTd;Vr;m(U)gOWAnW7&>26d{Web(UokK5@E!Sw@1o<`hL&04f|bgXR(K&`>9mZS zdT}J@G@$Z48Ju1?_JoPkwvJ^6BL*soOSqbZ=Q0ZmJDd=OQJ~XibL%a(AAJ2j+W^8_ z?6uoeyV)V?opYsBANM0jziR4cvqKfoBVJ91?iV_WstDDjy~I`)#H>yOU1mzbsUXZG zp~NP^lz{N?>-dB6De+Z+@F}l|FZB?$Rg|hYhba z%XSg96`We%MB%l;auq&TdvTU7!obWOkJz)ir%kg6SxGoV0=F_d5r2_v@9JZBuq@&XE?gz~3* zE;4ih+L$>I3nV?N=$Ihlw8w-nIfBPfsfJ`>$Lap&iP{Bz^=vJ#n{lQd3<;zJsY0YN z?9SUo3WilzX~6Cje;vEC-0tfpRmAB8m4)H?lk!h^IWI*xz6F+LKr$Jv3{#pk{Ef3Q zfweL>^ zm;I;M6+@;qNUGxE)c|dhvHHMvC)2tRfx%5(d}*V)izUM4J{@C>j$K#`w!tl!q@d5% z1d&)N=mv{ZU{uhEu`|}S%@zc2*H$st4iWi?DORh?30U?hm?8`!!4yebMEni- za=(o@iGTjb;Gf5sYNY~0iJRuYvldno3G#-woHhyrJ)CzfApyGn6S>9XdJ-iBIsv! z_cn%ezafrtj*4(;J~dL9#Tl$`y`pTKm<=2l&L!po(LCIKL03U_HEz!K2>l?_+OLtO z!%0>U^F|4(fakl1qt~#~)iu_#pv>{NVR_deBRqh8v%zu8sHj zY*$*klOY}+x|ZJKu4x&_0P&UAZTRNGw6~{leBiZpPmfJI)dJ!jubF*#YDY)?7jIT? zJ8rTWp*y}Z->5w#UORS;?ZX4p$}@q)t#jAVf4<|-f+79h13iz=Pg|zl=J^=Ytrw2^x?K?^uXx~hV4tpXJNnu_`oxcLbf!DQ75o>5@T1;we9qtZ(yipI-Mi$3FX6B7WRrkmtxqB88iF@whw0r0gs)#Rqe7&BJS9=m27+sym zAKP%{osa0*UpTSw_b&Z?0S{k2dT~sDU$*G)cWwH6#aI<)^)E|9m<1__~zI+*?Km3E6e)P|Q{IetfyzTJAH4@~$d}*EI zA18+V&f*t^1#q|dJ8mvK6d9V6ruf#MV%JWQzxiHM6pAmKBJcF1DL(h7cwwi= z-+ZqrT4q%?OGd;=v;57U<*}V5fAhU&$!xZ4hD;-qX878l;i;V=fAhU&NM}RY1etm# zP4L>E;FX;qfAhU2$j4e`Iz}>onKaSHxkuLrcB1^v_nIh)CuNXi&Npd-+x`T1>;(Cn z?=?Y4OAkqiDVyZ`0_Gm_@#n`XF? zpwIG)XxK$?x8G|KLzcM9R`I8Ai!diE1K*vO+jef;_dTpc4l+CU|lFw&|6BLCR+&w(UG>~mi zs3~TVNNz|QO9Dlf^4B+wb0?u8yi+18VrzWR#Z&ZwypxbmL#OOeU&{1BffxB6B+Q6SfCt9u18+nqkOLlneX~6q@G6CnLtMd9rh{*ToZs13Le8kaMZg1C9PpUi zDP0uH;g^;!xbgR*i%X-Bm(j)8r&`tm5So}#6L?#RcJ6TN?=`)Fu>h1!Z$lxI)D1cE z+;ERxs0vn9rN7F+U&^eik^6jAhq}WZeYaJT>7i_ipLAUCCofod38*keR>(0tPO{b| z0|DInvTJVo271!FaGRR$G-(4E^--DH1JXI^ii(Y#IZuL;e|ZF3wb&9k+WA$>XG_|h zg#45H0U@dspc>=$^avNNk@=9F=FaUAT%q2bS3OViACq4c-?4j?8HnfB!E^7ITo#}^ zwmmqRI?u1(jrwR2J}`|Egz5Hs*GY^_ylA37-JE*P71LXEbCS>9B4U&aq$7c!tfAZ` z@)^c8q;CkGxNe88+o9vMC^2UNol>rq&Tf(Kp^n>;NH2r@o-`yoW78h)mt!>d1LlTD zFw-ay>o8rrm*$!TG6Pc@8hmH|%Jc|#2fa^Ypn&(eK1MHsKC&&DE80h%&JRP#I^CCs zwc?`JNh-99bT2!*D`GQ8ol)&K+_dr$Y~ED{3nR*Xxh$>2R>SV9m3C^ciARAb%`!{~YsSv2V8%5j=3=JF zXF@Q^9?YobF(7&BJ%~cQllS4X$fA#VtNR?e70Da-TV5G%$th3a`@AmPFf+kBxV)TiqRg8BQO>d_9104J94B=zzL}9~ zSLP5G@%omL`3$JPG)`uo-nw_`-`vfoG5< zk=_y}JeqC7=u-t+ip-P=inB7m2%f+lg#M%6EmAFVvac#!m|rv2{Yu&$p7%Re^hZu< z=@S~u7A~rzkPX|`kSDwXO*9S1Eg z4pi`sIJ?pmJ;C&6&IgtthN5OtD1j580uA%?4Q=Z1t2ULob(2?Y5{$$<4o(P>k~W$r z2BrK_^xA6Nb<7|Py6Owc;pQWyH|gRZO4XB$&qo8{?46*HdN&kyaK!=*c)P0VQVf;909*rgaiWVEX^j?ulmz%EA}Avx zso7mTHGf6v`2oe59#BjBH;yAmL)>d-i4wqAuymS1rmeqpPaRKlOZQ*8rCTi@OLt5W z=w_`uK!Sb{X$Hey$h!Sd035&mmp;2n9J{jjvk}#3<8T+ls9XXp9y$1)<7B5Ry(#od zp?$p00~)ub73c*Jq%le$NcDKeP=d*FV$lPmicKVd5vJp>^x7koqLo(k8oCOV?k4+; zK=8?eVO2^c-*2HW*sy30Z8Dqkp1^yETVo!j;tslJ_j~@m^&+#;JHQI4M&7Ug)sD#C z;sGS5AO-JcJQZ26Wu-N1F7tZ(S~bb*;(s+Ia|?5lru5b3B_}A~USIMyNIv!+_y_<2sJLX;H?TfhB3$1mw%Pvf=SoG}T{A@hHO`@loi ze?eYIs5aG#Bfu>(;K&=X-SFSeY{NglJ0Id+EeqPA*~41n?a}{on3A{(8{%EaUF_TV zw;X3dWTdm!tg#Ho)*7*L@UEz`BjyupiYc~t1ZG)Q07y0GerB>`v`3@%6{>EIDiTj= z{aT&^4%;Q$OkaO*Zs??X2#@Z^6eWqN#2jPzP7k#3)Kl-rWPd2zYWez38aH>vJjtS! zxi|!cM(B~-tPO`J=VzSwZykx~{%^ixUT&*0o2bBLCHygp>aPdR)&AZyDv>Tom zd;piDT11gQ-Z;UWKQCAT#huBfz{94w&yC@atTkcBrv5Mmo_*UI28cPuMIYSB$uFnJ zzU~JrC`JRoBHx!dP)*%yfR^{pz!zmHC|aisxZK=JQceYCZIbdz@`>VeVRo!KfCliV z%NH;Z+W7#y3SAVLq&!Q69}HfN$gm1IVo^A>Ps*hr7~^PHu29mgMS(Jmb&qh@MDijb z84}guM#jU+_kl4@J`Z8!3xiG0t_V3DaSMcS8JXb-mmQ2{fs(7$K$?xhh&q{l*4Yi{ zf7=H1dAi1Wkh(3H=t@Vr0nFAnrv$4c;lb`0YMz*$hlX_WuLA4J5GD(2aEcfo77bn$ z7>lTNiLq$tog~&+grYjuSQOY29h!Pm5ZT9jAahDl=E$8=(#ZX`V{w;yD%tmXApPq& z>WSg*fbSK`K>9L%ofCm@^}>lj;85PB_r#J75GpilyZqyZA5&^gpyZ){hQjS_b{B6_ z?@e{wO%O(-giI-YoLv>CKhHtQVY+V#ei_EniAH>Wo44Rcn3iw5A7>Vc8_sN5@Kcj3 zqlERhH^te&EXg^KjE!iN93{w?Fm!G!<7lXuD{tiW;*ctPKGK=OF-Y(m4%&TL>~v2` z&)AKk0*}49{dHe00{w^;| z6?i#ZeXk66WyY%>U_Qb~^h6#$IGceg(4Zf0gTa>$cuPQ~K;RRq6Px zGh5n{-#U}imi*R%A*=E6yv>!&x1|p$jq~g3x<>qz({QfIf=*1cOFrpgLRabMQvAGIK2*^Fdwt|7sjf_FX*-u4IMUj zPsjCT8q{3afWm6-el6aacf#Zr3$*_Ae@tvNabif3SvX;gB|YhABX6|gHReC5+lFot z-hl35{?nq-g7$ajZRdVk5nNs%Q0tlkM+;)3M1W;zyP!6D&W>xOt`S_2WI?JmR{mlE zy$q(|6tEnfK==ZSXBFekFim?VJxPkuB_)-P2Lpn|Dj<@Z6O;yAxA7iPnum#Cz)=3j z<2vDqp{qYA<<(y^)^hu+q?X%XHuB8)`PpyvW>@lqyxcWaJdcnO%dh7q2`XT?GLc%I z?T08pswh?^poG2!OXSok9I?kXAb~ z)fM_wYm=5SVRUJl-vGfL~HUVt*XnPnxYQW0G^8(P;?i9vj8w7wg^++Fg}VjZ;`7%6@w zoO?4P&b=wYxi^J4_i;DgU=RT7UosSZgtHW7AV$&V7GnAV_8HX>fV;a(-Wcz70qay# z?)Mq<#Qk29C+>GwLFkp7F7Je3oJ{qy;OgD>)#<^o?_YnhH)Q11oS@ARx!9{IH?A(f zJa&qOOJHW8FuGYRe(wqv7Y#Zh9UrFO^TRQX6-ygboPZ8%W@4|&EbB}b?U)fS&K+5= zJo!Zm0F)_cYM9#V@o?sf(PzS3XG4zPuP%y0*96h z^q33ui?{%xhQ;YVbAf(_3v_7gE=KM?>w^oRY!jA#XGT`gbtOj$XdRtpvS+SUcabm? zjkIP|NBBL6M-thpJJhNj{>d4HXDtC+=r+&>aCYF(b0QjYId3|>Xpm&Bq!VpOQ z9tf!28iVP|6XvytO?JEQT8FPAzMAOfRcvt;+O_o|Emn76@Be_uA7K5U^xGT~;T*tJ zTzT;Dh_WO?$b*I3Y|CXANLm3C$DPhYW8=rAUBMvtxmy1ZlJRAd3@Q(6kN@+@d>uCP zPKEx0Ks-NJ^)8D3w(DOGeQkc}eNa8HfZTK*jOR{plMiQQD-};C(!qZ3?Y+k7LB+vX z_ktR2j#qZUV!4=uoP3mR7E}6LabI`djEN8jive5}&10}&kcUmjbFTkudCvQpc@A^- zLaq}cS9p6p!vH)eD27yaeGcHyrvAegVSkB3e0C8;+DVwnB3WxWXR+SNQdoTtV`7 zl^x|~0l9d!Y1=i41(+k1ls`xIGDzI<=>GR9WR#9V@@~Dg=jBb=C30bEZZ5m#Z zVD1Ry&jJFm(=MTq?=zP?jhs!V5i@iVk(gH#spJC{^pboC(De5JP5-gmIdYJ1e(<4#~klcW7(lgjZk#+z= zp*aVZDqYkihZ`}1J)h14iUEe8m%u-Pq;10rvJ`|2f3C9I#bJ?rf(2+?n2M=AxYARz zCb)Nl*Pa4bcmTmp)@`!JdC`oG@srNr>jcGk zo6%u2I%-B|&8XYl=X1-7_)har;|q@`jG4d;v0OAW?mTGKVmy}1zSg?H!Kvh(#U*Rw zBl(m3-AQ9MLt@gHY)DKR6t6{vXx@``G5)l zazpyYuuGn#@0Zp9N_EalXw`7RS7qp1q;lY)t*=r1ix6AVXIj&1DShxj`s>HNJ(TP2 zU>lLp5Ao%&&d}%g?ir6`M|G2M5mX{aV~2+~s=hGv;7j)4oQe2hs|@V}X;1B7@&OPu zqog_)qbmxD9e5vbo}rf<;08Q{^YKc(mlwLYgZPU4iL11@Wbc5fVm~^N`{YZj*8LbR zO-lE)UN#$Rs}Wt0SPb89tgJUoD7SQZV}7lI+KM(@I@E+g-5Vb~S`tOzLd4uc;!Jy= z#2A}f0Xo6ZB4}b1CcMqspu-s(vByla#mMJ9}@MUk-q+2+*16voMDFx;*R=#6yNRBJ&}d@PgI(T?xG|Xon3E|jC%^b z%zAbaD;PA`Kk&xZ4I==FQ!9^wNL zqtdpG!FPbva0`q{QXHmuk8qPp`=Z_BqDSWXB}q%Jk|Gs1rEcZph~(7Eguar|ARdpd zDr|>LS?-0@Ji3aIBxub0fe+A~$)R#aJ5;g7t`VlFY*Wv2WWY2$*7u5h9s?$ecgM;B zgkkBeUzgn0#VG`Fj+8JG9i&wC&U3Y_RQh!Ni$H|+a0^WI>})t9`4%=83T8Iz#!Pt* zbTi9sn2|DS;Zr)+Gmo_4ZV#$|$-Kc7#tnDmkLX&-4yI05H^CroB8DzK$*hGG8k!*H z+#XlBl?P`ly^n@NmfguXRI(mSvt*LEOpj^3rG2KEz`S`A>2?=PO*6*|0x5*)28v<` zp_iMyKA&m+yS=FsT{q*{x%$XB^Lzsoj+i3cl>HvR*R&D6XK~d|-H~Nx|3h4M%@o{! z7ee>U72^bBhNJ)-igs@I%{G$Pz!SRO}ng14jz=B`%5M^cK1& z^_7aG4%D=XV3KgH#$Ps!mq^CeZ>A(7+0aRt03k(cFj0>{}#j0_S4L9hDVkx%m{1!&jMa0$=&J zp9)l2PiuKEN_W#HYb<+HX6tth?r1BLmktsRU2=-FrxTqW5u;O*v+pzTU8IDcvT_>C zCvi)aaZjkcouzWs0-Vfazfqwsq;-ftwgnkD*(}xh3#ES%?f?{pCj=5ndo*V8hY(hs zC;j%|_`H1#+G$r>E!&9>qZB}L6K+#5eL+m(i0evQMmU62g~Jmp;+zDEx9=KTe=Nef zK#^F#kLGfH&T)$XZ>x4Z(d6(5Z>CTrlO3lkkZkl7}HPM8~Yy0!9Zy|J;=T5Y^+ZZxN^r=a~z%YsM$ zm@09KzfIi(V z(iPK~T8Ma7C>OM!Wo-D-P&@t6uCA;jKUD?x73fJc-W|9)h-db>I{4z7y;(~WAGn? zRY=*;QAj5dV-j^MwkhIQQRNV});64?45Ae1LaHy+HDCE?AD~(yW(xZTeKe;vXy}Ji zW(LFHql4rM+7ZM((jOwzv6!Jq-4oRe;Q3%(bzIBoLqz%Baqy6E%EP%40IS|e@EXxO zVzXl-7i_79IfPRp;F^WuPpfBP1$xO(MunY`3W#JxAnKw^qZjc>F+r7A<(DAohSH3SP8ZXf~xzXBqx3)%=WBP%M;r=_^12TU9F`y0S!hMZQM&s0LjN&TytCa8_ zTA`<)XI1fXlNx=9I4Q}_yex?|wMN@_RnYxG{G-j}g}%v_Jo*}YKuGrfh~XQzK%wM9 z;wVwshfvv#A}$7+1U%8yJurQ_T`)EV95L<=KHtGD*cdo901DVj*^3w%V>OtKdH%5FWy^Z)CZ88BXhe7qB~AjBwtFJwbyI>F%Ek}ny){_m1+ z(XsPiNT{Z+sj%2-P8VtHGgI@qa&G4VApDMZdrL$K!>nb{u`FjB3p zvQMvVoqmD|C{l!?s!`E^AO7DMsM9;inscC=kQ zfa-?usj+piecm_mKxJVI|0AfJ)>wE1Dl3{5sRIdhg8c1^?k;kLudTGl6pbLkVQ#0$ zPC&bBIyWXHO7+bF8M5i@aluBIlvhCv2puMrIDwXlI7*uynYSGYS)dgiEd*h%^;(aj zBMnUrDGSfxf?hNo))y%x?_ZXNnI;%E@m-1bJ)h+yCb5mb%Fyv9oCPX0dwbWe93xC? zz!sG`v8(VNf|^05Cfr`0MC|8oSI+vdwBllO2PO;J{I?$s`FgswFJzAaJ{Z6 zbY8X;ST-r-Ua;?fJW2m+9xoQh;&VA-8iP#S{b#WzEmq~~}O-#`>XSH|-C0Z8xprww$VDUgHO8s9?ebrZH( zs=!EgU@`_%xA+(2#wI-S_=U!L^dk>u>qnhabGY-xXY~g@U_UtR9}mC;Fv(uWm`cU9 zsaxmfZ})K4q3s}U^r+$wEn@r!Wm&WrY4LmnY1~}+_iXbJuMVb=8HT~^t(%t3*yu)~ zpR)}j=z>8KWzASf(Fi_PtM3DQ>OY=!L^+LzT$vOj^G}i4iic(ra*Ly%vkk?18%7XS zvbb}lL~l*{XvRSX$gV+$efdDvZKH%6r^22(3$e-U(Q1iNr!>xT04sVZ9^rOXD(;xW z^U;U{T8J8rj~ZHP7?a8x4l*<4q#z{tBO{ZTn1;wYXG}~g;bioYJM)-FM$9)RPe0kN z=@O#90hLU_%I2zC{;ls?*8AP5%n5TyAc7ihmGiNCpvFLX=9&5U2zD7*DTWb%DV=5 z;a>y1`i5(O$8g64CuTJ=t z^`Y1oX^bz73wc}9l|8?*@4eTn)~)(UrNy>GV>_Zoa< zhHM%SiQXFVK5@;3^qF}bFT{}Pyrb8qaJwBKBcW|AF4UQE-0Vmc^*lUzZ)zHvDZ8bEkSr{>>!XPQAb0}9pYjag_Kg{ zxDA`=DE3g6ZDm1{@@qS&KxKC&L8dpzJkVOB9tR1z-@C;Ew6Vm6TOT;&0ZwX(_{Dk@=Fjw2Cn=XR9sRrADFeJ}#e&234I_Z` zs

wDvAzV+VQr2i2Sv8!pWJM>C>k~!ihf{5syvv5)D@)2tdi=i~&&Dz$q9r=v%T- z9S3s>Ys$dCO4!toQ!16-!9ST&>HR>sLTYk%?@27$oq{3@)XX`Y3j{)HkP#An>9A9V zK>kZt9HgVT1BsfiKT;Ydn*vs83uU{9FPIa>N>c8g7=ckr8qr_Dx*4AS(k-gU2ll5( zlK}ejV|E(s3|FuVG9)gi62a28)M3Q;E)4K<|A`L_e(4Cx%FNQ4)^tKH_VG}R@cE@x z|GoNvo72Li4hN^2%E5q@0^1R;*hI`<_dbK~E}kxE0_&a4mRx~t?X0|taD~emO_iT& zu?I`9UYQ4XaND=>c1rOmEe}<}fcfNXNLG&RRIMDw2Na6whB1i7qt{A^;hNT>?y%8- zTmTw_j4(1-5GbAWrDK{8)d?& z_tisuu)F2r@s4P6D#C1Bxz86kBV(y@{EuAeGHArmUhn&-#I zur*MaHMtd#Y=`gWiS5PiCsM1P;$HNK6S~b+Uh*wC@>iXcC4w0b?NDcUi7S9t2(tYI zOCs(It5(Bl9bXJjPlp3)=Mp<278B1-@r=_tQu;>!;9WdvX2`ur6WSDPy3Ase9sc=M z2Au#nx$<3kx3z}pL;Kdo!hg*b#B)SqsGZ5!f2VR%F*ECKo{#!7azNSOj1g=HEdAC~ z%z&&=x4aaXZRB+KMl;%OMw`v(k`niTj1@2)d(@@zhNrNf_zL^Rj0!ttyqD_4E^p5X z@+#C04`)-@4-Y3R?1zUOa!XfP;up;&{1k0n40G|y0zFd2n~imTI)u%I_~g7cU_JMe z|NeuscON$Bxui+hF#7KiKNJ0TmD`H```aFoNsLPqhMIGO-l65kz zS`CiBtn`jF6d!?PxQTE)94}V1%U^#X19Z}VI) zvy!D2uk@#R>t8)JE&NBOm4k;EPu%Ybrju2$dp+YtLarvKZj? zEYI~C$^~hcSLpH}zF=K^>FU{mc66m3t;Pp?SNlrS4Xfzc7a))s8C3AZ`|Jo2h& zJi#GkPym^ne+n`zkCt8DsCRlM;yE+7bV6ebmKN4odD!f;9q+KAjR3aI*0u~|qzD}2c5$I}ScoL(IXLh2`7Rcz&LSR=&V1U#MRyjD z$=pDeIYA`@roHWbYd_2#D)&t{Y}^AU=DS=H(gXRM`jgBWDKk#ffGlMFaSzaApC0rW zZs#tqY@5p}w9f2Y;vFhU+-d_?ntF$T_NrdnarklySYHBIFm>2Q257^B6V|ifYS*w=i)%36yH2oF}>#iun7Qc6#!uK*_HxeQvt9ZZ|!ZC0btz#;NxTf ztQ!D)^Z_uveJKDw&Kc;q)kD@N^XCLxp`V+`7f#gEK-N6RI?1kvFV?*zK@&gnxup4S zJCmhn;YA5;I@XM2BXg?f}@+34-W`7Q6Yj(Xj9YDTJ#%$xy=! z6#;!HBYkIIY0{?e?8JSf?_3)0bp$*Rl9}|ad(RxOg_}b~`;b?&tD97kLlYyI^qDk* z9=EIbzJ>1{16o>r*3wC?D&shbTYIZC$rCrp8{yY^_{Bp_COX_hDMZ?Hd#o5Nax#_M znQ${(PM*kq<36#}ft}d&&RV4vHw^SpOMVV*WOmr<0kn0t(~CdAjbL1Q24{oZay*DH zM6=XtDe0}ton|wq*_S>m!qj}mVcP(8t%Hzo812SHtyI(V(9`8~vD8L#$VCozwl^OX zb7>#RrO=<1#ZzhLei!;OTzi$>7vYQK@$HxTW`bai)6Y{0Wz@Xl=+FhZPe`Q}H^;`; zxH&{@@q8RP8_Aky^noDBzIEadBNE|o^n&s>NNgbh*I~LKS>?`{N@7xRug@g8%(Xim z{IK$h$7#_-iERL4qfm9ncb5h(q3=M64WV4%?Iht2VJ#??1B}vKB+Jm$bYNjcxtot= z{0O6WXmsrYbpgR_GN{KrN+cj9@a;akP|nfS#azV~dtF}4m5A#|XRm!8pwHF#N@V?m zXRG@0fqvYISN9J1!4NxBrhW2kM@K%4^eCn2n}v8A2ES;f8Na6AFJZI8(I2fFd)=0?*S#2J>~-kz z*7mx;*q9~K>r1+aK~Y7r1|p#-fwGo07u5}Xi{3H3$EhY*N_^pqenS?XdJrh{j{X;`KQQ0c2l4G z3$>eSAO7)=54es`oxfl3j}|?VDr`z)KH5q~qv0r}N}T*V6*KOrOc=)XC!{mwHM`!u zz|hbr)~he~^roCTCl^h`3b+_|!_v)4Fp$XI{CN;G zqlCm_dcrHl_2wIFm<0*;7f2@?l9<@Z2*ns_d%dHTdGV;8%y~elRk=Zh5}`_*sRpE| zrVMWkShm=#>PyN`D4+QYimb`-5}w6iX~r?+V;+}FI~+=~X@tZ0_PUP)4aA^S6l_6^ zaF(7mYRKlyf&_v^fOll7xOXoI>#?yof>IE;2_~ULL15`2wxwuAxKz(88fI6dT@(P$ zTa<4j%`PysN&0JqiKavFCqfP;G`Eu2XJMg{krr-2?gQ9sss(^Y}REG zRZ>_MAaOv%K)_WpI39PGtcU?AghUL&68910;IZ=H9-n&NG{9*=k9u;Cajc@=v7t-a z7+=0z8oMFKdZHp|ZEws&5>{?yEPw;-REEH8;GUIcok@NYDGdzVQL~*WN2@&yEMS+& zFx4BJCpVjjyhOmF6-Ihk5*1vgAfTn*v!TMQrwc$5hrJ#zfIr0+D|N8|BGO^XaD#8Yl6G4Q2&)`{Xy0GB_;vE%t0{F;gp>& zh2g`d-9h{lXSl7`QpCX(WbyC~k~tF6UR+Sltm|?d(RuQTH|$+BYW{R#8@KyLIvO_g z%NNwK)(A&2zb*C|26l$5cr-a}no=7el zJVJ`MNp?IHWrl`sh8EzCPymi~0v^n(VSIZXyywdohBUrcV(<@76HLj6Dn1tzrx41p zzFd0)K?_0!vV`)#b<%9Pt*1Vr-D?09&FovfTSwzBUuRzClmUwItnEsx2vyS|!`vwI ztndtcH1T(a4;-i6C>I3+J|cVxBo3iYC1SxVxL8^6kYH&}H;YJ=(;;rbakLu+ghoe) zkX;=Yn$EBp-Z)MzT5O(=aUEWuDr|ew0q-**%RF?hn2b(e%py8{NG>wOEm)A5hduM% zVQvZ8S=f|I4~2JHl~c4JtV3!zdY`5o}Ko+m8G_|jcUJjoSb?97KA?cj(8hR4_vv~xgjVj^hT7i)=MZxMuIez+et3s5b z%DIye--@@a4&>LLffg}h3K!>Yb>SIW3Rv)7ty?5`c5_Ur%RD%$-HK&{hbgjMIRnaN z^hp4@7Ju5i+>bWnHKrPPb}`kacS#4#6UU)b|E{h2cgWiG=8vO9wg zSr3?ocpj7Au`1m%#i9z2Akv5c{v%yg~zs&){qI#KrIYtUQzcj&!t(OcpU z40_+$;@fMiEU3idP>%1y_>~epXejKFP8KO_JozQuUD) z-pm;luBSkWJWWmyT%zX!RkBDN#@55SrIT5*)~zATb7I{ZOqAG4X9+3N$Zc}BNe^;8 za&w~FdXofKKD2!4)ecYc8`yr%B2Pwz40YdbVulxxM1cH`EFUj{XxdJYM!l@OW~AAIj0?Oaq=|&h{D$L+pVse+MG^6v7hQskh^K z=Ko(}r18uUf0K zoRw9Dlo@)0leJPAM1!45N0eLVWKVY371bySOHM?hV@nLlD)Web!L|l#CuF;>@kSPL z)e$*tZQ3&5{$QisoNKcOj`5iU^s(c#_D|w^js;pitvUl=8~2G}=Xq=Ch`Yz7A zug(j)KQ0QWvQ%?bl@O+0GYXIss(3eLrG5*os%^ABNF~HY%~QmO4EDOr&{@?Ti60o& zIA_1A_iA17xH2@a5Dg>2NEdZTm{*}sebowotK6$P)XBA$L7)3C#La3A5+)0%p?nu` zEb~LuG2hfjk_%((7`cf-S1DGFmq*L+s_7X!sxRW#;z$T>c|_sG7Khnw7?{f# zXUQeOBNto5aDRcLkw(}lsANbXSHn>;h7{=B(}CZ150qp4`(AtngeCT3nm3^f(~q6# zsha@qOAS-dB~XS9?V1sSqGnLP9)hRA54Tzz(6bFl2z8-(}8r;-Ql*M<0f)5IG6&VNfu<>N;D>ljML$7Uvu2(1Atvw;ce53X$WG8en$ z%oK~rq^vt$IW^vI(lAG42^h~&W<&t+xG_f=80RRvTx;i#Hx0FRj4(mkd!92Vn4whM zA1&ax;J}DYB)QHsliaO3)Jy-9`b4q$)u6+Kcs8+BJ!P(qJFYS$Yd*d$6wTWD9@!;tap4*>-#7nd} ze=fwyQxlQ4JrWGKyAc0QMYZ2G>RrFIW_z)n=Zv8DTX!$~^XOcxPY1 z;m$S8nKziJsNv0jM(LSYUGN{ONg6}Ohy@}pvOHKEJ&k%ev4J%w6t%=hHceLKFIjxJ z0y&W3Jk)P+bsZPRd*dYgT?Qn%4+Ezoq&*pJtf12Nr3qgQ5%_yZ1kOQWt|tjy`Q?$4 zcjo_jrvq2j(X7DVxUW`V0+l6Y1hRxCCgrRfo z%<#GA`6*cP_Qp3Sogk={158k)S}T1x1s^DL&>%|77bcBhIR|}#( zWJ%-fJndRemEk&w;uxAs;q|2hT+uwa38wP0*;wN;t5irwhZ7_xwuOTQsj!w116b>u zJ3Su1MAG*ZVO|lUC~LTCBSL}Rdkpc4=V&j6It~=f-DiBA`f{gi;;T($FWhOqZ<3S#8pJSab3c;O|HRx5ngm78B~0z>&q3-W?+uIkHIWeX~(lq+*SAOg$J zPZpw-6*6TxX!SU^JilH$s4pLsO+u6Y$jGZvD>|Wz604TL9Cmt|-l_{%UA0$>UQ)hq zFkwh?JD{=_t>RBlI^D^*EDL-(J^>(XwS{hQMO?4YiJ-pK=n|qKZbx7GMk;g7 zQn=lIw1yU+;JhTls_VigtbT2I?K^Dkr~2}zGH_^a_EBYXb}(#__QpUUo4D-jCar!e z-lWwtDuU5pkj28T)1KM!mO(OjTIt$J`@+AoTK_!zQ9a@OCG(TV%48@o)9XiZ(+Xvj_OFF&@VEojn?<1)1lJS?sMaoj^#2T{Q zASyrZ92Vq}=XPWe0-<y#+YPvSjWm)Wl}9g>(^(5X^-MvjFQ#z^p( zEcKlIoO;)9eJ(kcj6jBk24T{!&%omH?{qBX|7r%U{}@hLe(k_kuvnFep0(qJ1|e%MIGpS8_r zd^Yftp?SjCLp`5+54Nw;adMjJ`MK$tzR0}#&3h%^Ha?-)VXCu!?Y$4*TuTzY)iK-g z9D(g1Y|2UlFm)6#+Hrv&)D3?W?pPc%}w5!bugnKta+n-DRQ_>mB zy4*%)`IVv;nKQ=?I4m7d50rv2QO>5|>C3gvm7?d8zPI3m=bM{rjg^gpH&ipa;4yLY zg2!~86g-wg#Vz-|bh#VWs9n&NHOUve3oPtzG{&Nd__F=tbz^bGhG@GasB~?K03TYw7{BteJylSu4M0l7P~-*5hTT zf#c<1Mqk@OiLdRTF;{eoq+92x-f;Mo5AgJ<-0a_Nil3$bG`^(hA}bLbdbIm_b$H0( zz3#XTq5~x*MaLd!X|W$zyuc7(C_cRZ6lY-3H1)(6>4C~#8H!{P0s+X^mp)Y|sa)u*(%l{#(Ul@_(=C_MqEW28Bqpb$n}VtM zmY7I6cjlcC(V$&!&A7|0l3i{!<`A=nd)}L8D9pif1Vl~Q? z5iQAdKieLiG~jmL+JVL3V!o-6I5kGD9#&5Gm&52fg6L5OqW1w&Tw|k{KZM=z)s`V8 zq|?>p^1PY8P0+-i8!YPW*O7k84j#ih1&~KCN9|)uh+VV_6?OfsIiaoDo^floOSWda zF}H@btRVQ~>U4OXT6i)AUdZO084B#;U--J+CS7=&gsLoDHM)QTu@6XQLADGdMy9z~ z2T0&X%b)QZapAan}9wgN9(_JWn9Y($*n-8bmFS#gQ+U&E;W`le{By9zVx67JW zVGR0WB;W-hjMgFoGA-b0x1*p-+NRAJw`sFvn>HJB+el^DPuTkCTcL%DPGzHxvs85I zv&K?LQ4B_KIX*Oi-@Av5+=%75<|a@=U}K^V23O1Y)RQw}t6+yloA(X;O5zWkypMq$Wdyy4`b6>e*1lPTy ztB7uUuw#%C$c2`kJ0m1DMN*Cd{*gB9T{uBLr^ov)aO}jn6HXSdaLd8uK)rWw^C^;i zlD%a6-o2BjwU(MzSpGRB1IEEqH3ipet!R7s*QTzcUtjEJ;{%DW?PTcg{=2~mp_+-g zwglIbQ|bW*x$*`%tw&v9WpoDr+C=<_j@WwY(gkmGK7HDhG-^Oj%HEn!>tT?ihmQ0uOc2qf2aC_m zK_7+6bO49JVD4(89Am4jmyivB@{X-h$x7%g42d5GHJ~V@ClZS9(xu5@{uGEKeX;BO z&!$!z$9H)d>vtQWCQ|EtowZ(`LHMP(GQsvCvkoeU8oiUn;GvPTm z8fyzFUOFnoOP5OTLM)xh*dQ3bCK$e9PO;Ueg5jT@asXxY;%NrM*L)1uev5=Xe{)|v zEyHAig1@JqNXN4it;3wE`#HjaB5U!uzFd=DeX1y~9p<-pBg=+$1(oVu%Y$im6z`#7 z0NWq3zeF+JZlj{Q8PDInzy5#jzP+oBB+2*x{S-3S*DW1ux$c==+la1ZvB5SN1D3#T z%;l&BDo~*pRtbSj^WE<+A~G_wN~NM?dwTXx&m2pXDqoS2@ydA6?$rzKUOi{`>X0>= zs_%rYbJ?iF zanukpxp5e*V=rm)^m2u`0iGni9k9LZs1+%}N{F2tb}(Ld95<7Kjn?hY)&W013ZQKlG_x4I?PgorK+*H*@Ve9wp)z}61n9VQS6W_PF5NG!VNHl9 zBxOm(>NkYK`vp;WKL>^P!DYEDJF!?4ojzmN16FB22rAeAGx+_YEG1#0b^0!H_9Z_T zIeVYKA9Bf;H-=h8S1EKy%Z1VXLt%9H{k{^+nhyi75tI-rIhm>~GAG$Km1J=8Dq?1U zBaw&PODIl9i7&8K5z7yLQM#q-*Z)Lf)&W95E31@^YH0}q)=VFt;0#T#(0!DjDToBo zH)#rJf>${2pGH1eQporZZlA_I(c*!CI15jE7IUodh-sSJSONtt@d{L6{WKnrTC)AP z_EWj~_{1hc8)$(G(3C8tMT%N5ME%6vG3DUQD{+BIJn9kE5ky1+^AU6dBwR!4TzK6@ z$35PZli*i76{#=5jr{oK>;e;%2b)SvJesBkfnY16Olg#<8KsQ84fZdml1!XRGO0bQ zJpGlml|DDmy*kkovWM|8?H$8>!bfs&M?`xA(oNO5*RT%&7uXQNMNN&D&a<d;gdQY^%{URNDCb&}6vhwPHd7W_(cKkyU?$D7 z&K{=eNw#(N+?Z5njk7{Ts$`Z$7^55zvC5vnN=c-WY_gUs9nxNWD!3P)a`xhrG4{-E z#Vgs0kLj&=m0%QRK@G&2w%Qp2Qi9A!V!6?=$QvS}yS+4Z{+NcQnh7lYoEkDPkduLg zcZ-w7M}pDYf-riU1EaT_%e%wF0r*i{r!Ls~PC)cN4Wf4*wj#ohLQ@N2D43-&IFB`a z<3UTjYh!{vjrCrwS+%>Ar-w_mG?%%6iD=?wu9KveH~4;|R1!tFLaJjrQir$2D2`zD zoYplFl>-t&6cGyBHfHfv8w!hbaU2S3LRFo0%qHeRQ3VuIu(7uj4WdP~>ha`+<5Zpa zunG!K^$i})Bn2c^|2~aOx`&=rOrfNF4F&t{hy;%|Nw?FaB>0Z->3uCo~ zZR=d*{0LSZ3056l1i!0d(=v+9t4+~IzllCt9jBd^WF)*9Y+=8L59 zhzw%mdqn61GkHa3(Uc`-KxVM)pD0?LPW2_9Z9LOF=0U4jhUX6_=*jB&ybzv@oDuBwL7vtg?6O@qYhog*>|jl zO!6Zk6ss227F3jGZexEaeqxvn?dZvqVL|9cbgRlD!3?C3Rf7d+A9_)ijch*jk~G;f z9Xtrk1fcjzGY^`i30i1+fvOBAo3VoNMvoT>#*m+UW6ZY##+am~Z4T~2Z8t=FVA=EU zL@K@&Bo*IsNX0i|J-Uk5(=!;aSY!MmG~#ob^L+6*PllYttSC22LjL8o@~4MHs90Yt zMc@G}xi}g%lYGI@f5lASycShXHGW9Yhk`?WSYD#c z44MtJ7=3fqmdWd&8c_QL2^0Jq6=*gCFdjxCVa*-z2dJJV8h{VgX>xw3skeHHEF1^~ zk#a(`h7B?jaqSnVLMX0b{&-gX_g_;wL04f&E*DbtM*u}G7d8(AWzWg7WT%;)(QnOB zJXeb6&g_I(AfnMaHX#Fa+A^t1OG|4@rAgFs{u@os8&l)_>KkB^np=SZEf675)#we| zbQq2b9)_cw!*HZ}gPJRy-Vi=#40)VB58-p-hd-(}Wa=FERh>qb-PcnhFglx^S&BE> z#2hu^aeCXb)d=lT)rh3gmT05u5&C9Yp-4P;TlIyu>T|)Z`kb>>pG9Og&Iq5>@XoYr zBzrY}&c<3t7e?Q|S80!H^6khVe_3A7N)C)HV+C5B^C8s{iP@DI1Y_um1=#|kl%9j7 zV%+t@VHl#Zm{IIjx91C|uh z@|CbG6oTy|!%yB}Oa_Xnl$L`>NUDuo+P1oZEkoBsb%Xds&v_;yH#bn%>-1f+u*61bi!~R=D0ob{IEK%;D!U_mXtA);cFl;b z_>f8MIB${fD1&gIH4d?L>p&}GX4A`g+12q6uz zRo`QggwzI+^r(3#Lsnaz?P3!MpXE@_?vly#0Xu_EBxzmks3cYD$XViiP{uJZqMH~P zFr4kmIM!5~A~~4LHT84 zA>vXyjUavwkDFDv-W*t$lSX#d&&)yXMy3ZV^;;+vjH^Frs$}ONM+TQt3ul0QZ!sGj zB72R2xmY18Jf`3tDrJNG9vb+b@^>-8RM*~p4kCvn(~rq}cJt)B$&OMHD!Cn{-c5Ft z5nq$rS;qUx4mAkI3yR3?FysAXhckg668*3HV1Blq;<Kk|Qzd72SdK%gL@%0T=V;oqDa<)NP~WkY3=%yy3i8iVejL zlEb*bk9niGH;N5H?`MqhX?^F=4-(2nQ67_9Bzu|-K$$n|**A;L-fx#R_RKO^twjki zN0I-o*9@gmnuq$mr(==UG6|rxNMmO$^IeU^_Hf>3AfV)6ASQqw-{^2_Zj?L{{_$|L ze#EfwlBDD{_;7f@Ia;I*oIh;&-lg1KZydgAysmHUQ?{LZ*!dEytGaYJuzB_^KSC-> za!+kNcOE&OZ)S@`�j28RdwcQNx6(SOypGha+WjtWUQ^3_TOwr#fgzNYdH5cw(QY z#m)9l6CKZgP;`7W#4SNRyb45l&e0MW(jQm9lZQ~d6e(UWd(ICRE|#PES@p>Qb$-Kb8% zW)T{&+MsYL`W8^$fBH|<%^{un?Si$4w{vO{Z(oSIxo)b0I5X$P^VQ5B_XdtUFiq&M zvpw{DJ?N|(FS0g&7ca6aqnciUW>BKgPMSub)xs+21Z_~S+OQ>aM#SZWjq>IRG}67B z!TyLS>3G_h_D_dB+!w%BfqWHt?_fr&W9&M-qjEyEGJDtvg%J!#m||2xDg?x1j>s1n zsvzQQC~J|)vVg>u>iSahvgckfK%Bn)D=KW-bPTE_+e(|G!2X78z$RU!|EP9%zdHWk ze_I30WWrQ}7SSQg7-6%8jBu)a!SHxD0l|j18`TSi=a2@sB;n{*7_S)+h>g$y8u^sb z$pgUQYU(wAPT3R68eqzEd|&`d3ku!R0yuO^CNGlwj;sp=nUliI#n4#eDo_TAd}^br z+sztMcf$ewJi55%-KD>8MiFxtd<8*jdjnrEJ2X-Swi*AwyRY_XzbjRIyVGOn zEClu*kuMqbcXk1mYe$=oOU;34pUFpX+oy|L!TT9+NTmEgsge0s46;WcNf*1;wmmgF zu4abaT+OpdC`x*+5bEp5PQJcLS*u6DK%kf3CjYzmKZ5I=ds9Kqaq*<}Qc^HbZKbat zFP%^3hsE$WGbB01rKU=U&YA$t~hyftZEJ)bX=2reM7D?s@xE;hqK{q-5HKNSJLpT69fGUcM}$~;OclCra}+u^x) zV;R^m_g$T&>(;yQbkhs&VGiVmJ!pgNTt`E)_SS|M0(pv1Cww@!)19*p3!FY z3T{>}XR~?@1QSu&m%a0}FMmTe>-2em>|eVGldDt@`1^$8WLsDC{1QSJuK)SD`1o(~ zcahF^V+mvVd?8UtuUaYpe)O=gbk^|L+#Mx8vpfx`|Ek5IDT!2y%-DpD*^ngi zA0|V%H1YE(I;WTok~>JaK}G?Q4jvvD+sNUr#`|mTc>IHOD$dYZ!&;4lqX`c@eSHKm z5_vPdQhpQ50(_f4IIVcxW1Xj7`+@J}p67WFMs0oT8DMRQu?%KXf2F_~uZ53l1-|%( z7f@J4%d1pvlILcSz}+}`kvtRlW1NV|zOU?CuBk}{g3p>Qv^Gu!*mUTH8xH=l^(@&v zQrNrM)D)4)z^2ru&Z3gK6MEatz=E8lz{=Wi=2slux#{gq!tdBfr4m-1*t9He@*pS^ zeFHeNck*c%8sJ+&sp-uWo_FFGxQp{P?`-ht^8up}*+u>{v{Uq_$c3~w^~`!UwR-7< zXqe})sEComI`|&`vQ#ad53dJp@3IJQeZH{4hNgTuEv34tnX(h)#faF3Alz3Gb}_r$ z^h4_-MtzP;SN1`@I~+Ti|1?A+L?_Y`u8Xo-K8jnBa$`<5Y&p1mkE=9 z%+ca!Y$LJ92eyrhBh!r^qL2))z8{aK=12{euUexx+(B`IQLBgigT~p7PNl0IE^AJ-%3monR8R!?yAxmGH#XVfXoJ z-a9k)r>@wart3jdT_e6+(07r7PL2KP0H0)k>OL1qXHV=<)$>M5;z7%WC7#WHWqVZP zA7hUK%!FCy*`sd$T6>f~r@zh~#f$uB*rRqmLA``+#{Xf3>N{F7Ar=Gb;EbNUt3Smcw)cYuF@Q6%!D1gfk9y$!YRCk_pTAS)_I*br47Z$hH zxy^&t$i0lzh*`eZMrZd6x#l}#vu2j#b`29wLHB(rKU?htabicoseH$Ng#V09NYM1j z6QgmM5FneIZi7zf&hup6pHq}9B?|!?&o&UdSAR}P2JqBJplX|vov|Ln^<4HmZnpuE znR@o0wX@FFZQ8=B$m0hVaOh9Q38E});v|ZjI4)8LCtsv#y&{jqG> z!}5W8&~1BO`~U^h*~16`kw#>S3PSzF+Hc6kVaEJHYWD0eP;ZS+YYMYc>PX6q3qj|# zxsst2-c)MU%05i_D6}#*0e+8uT@|fzU`oXpl^H|ss=tLv8nJf{+a+e))2q&$cgSU3 zJP4XZB@PNwiGv&}anM*c0kl`xC>D5PM1Z|QDTUDmbUeyr{6Xl%B~-44sT#S@-=i}! zPH(K!b1_uEG4x|%T#IhuN zJU)guvdE#o*qlF}j5i`wrki1e-jVO~S&OpEAi@o!0{)fd%V9JqgTcVUwFI@_q233N ztZ_K`bNJQM7i5|=Bi`AX0!Y*8OkRygv34=$#2+xjAT$3)1DRB9rkPuoXh0Wt* zf{$NMKz@4kaf*+>k!ucCf`G$WgT zwR#bJ_z)0{q&RS{IcGb12}yg-L)c$Rr^9il6d@3rJZQ*vj2w(;2J+GBk-2HAU4!p3 zov3B?V0pAQrTfJ3#22@q6K8`}Df*ODc$!QY5emu_qL&9h~Cq08_Az#D3FTRP6)741IdTb=+}No??;H-zF-`O)=rr zEGEZOOx7c&M%FK+T8aU6O%x=58A{05tntaHErLBsJ~GQIKkEJY z=OY-em<)HkMFPsSmy|h(vDqvi?gO}kreENSM!TF?^aOcN?LOh|8Mn<%U36D>$t|jh zhz9@Z<@zHx3tmW@aI>ShN#XT4oyqkWyrm|o6#>q? zsJ7{u7FE?{Bycxlg}kkar5;Ggh2v577f_b`WX+LJbF@1|Xz|0@?$V1)b$8 zDGQ82I+f{h16u~YLG8(k(>DsJ0M*j@ixs z`qj=-{zwOfH}o{vBC8<@8lVV}z$n{Dht3Rza+|Cyi0AeW zPy#XenCmcN0r4-NhI#o=#1g{vY~oFINHpdYU_W&`a_TK+13zuJGryrrX}YCE)ed&} z6s!YY9FRIWc8vS_K@WRa?s3kuq|NjBTZ$@Wf1+)F6g=9kz>43@iMX$!~0Sg{_!zgbXcc= z17h{e$DI+U!O!4Y;5eADtY0c8Rf_h<4xcbdLt^7*w(|{z!W-wCCK<)xoYKX-9#+$N zac`fO`_&sw6+u&80^^)Y21c0`iPW~YB{wgQ2)hkBQq+D;=1>!ZS9K>iO+G(m)q=*n zeewjA{icmF>I3=%|H1 zIR61nckjs)*erGGtRt z>fsnwQ_;>SHwf4pO14sXPEzu_*|)vt2}R87J@LHA0O*Zg=3o_-)Xg%AfJ#{ATP43QjWsUMgM z?%|=@+*c{X=tE8aHm51v-A|bLy?-9)c}6XJ{aS+Zd`BAQafK!ko#G_x==pp`sk2wxM@~O^r zEuCJqq7jS)>qxjNLz+6J-t!2%IRxa!%T4!mraMA$Q;MBekD0EaSN!g_O{}w`{#*Mu?wH3xc|j!#|2-AQd}jb2#gS{gx)!^*X}rvca0@04{54>g9`FX5;3ZNxUjr1ivaf& zxHS&}qN?D8jj60f_wJ~0+B-E3z#J5SRu5f%3kHNk&e$PmOxk9FY;`s?8OAiqlFEWk z27$Uv;~)(U@6M4+@HRn#zE+P?`c9=#AIKB#fW|QO3c@Uxw#HtDM@R;Yz-=<_;?}A* zEi`T>VYF2OX%b_a8b&swqIX;_K|&*12=T4sM`Q>ayCq!RD2S^YIk>u^xJux03~XD_ zbU%%z+a8)`XbtIPJPwIkz1E0^a1^&TFl=b%aY6!4G(aswp>T<(DCLhq*doW-;77C{MgQ!oe3TD^Ek zS!>#YY4Rej7sk{lKNR|fj8QUSMnC3SR)dWs3{v!JV&-P740C4XOFCxlwI211$o(} z=`M$~F%RQmwI5NoYUpR5pTnZ53#^nW^Zy1Z?<|TUc0L2S-lUHJH81fzy@SwWFKl}$ z#&$MCet+m#IFW(!sPUpeIy*20|IDfS0rYx0p#g>*GEakv}v`karZ$9g@d#NIsZDvXyo?e*6zTB&j$SH^Ewju!sbC_KpliOoXHJ)>%kr zDb>jP#cz^H=Od55crSa@pM{m5awNshK3}l;o+G&$u9WFaRx^*>hxCzSB>10p+P-I& zKYq}h?PMioAl@Q}TZb)FX%Lk6S(TqB5HI~x0$u4x&=wFyhB``&*aQepKpj)3ocf`jlY}fdjmej^rx|$jmkksr5-oaCF7L}E3A9DnzuW8h^4SZKf z&N;8*`9u5x5|fk87nY4?CUlS~8?_^oMNva^U4}zz%XmmaGN|!^P~%NO)OeGF8gCl5 z%0fc)5N)$1$nj}C81#*o(;LeKvw)3CO<;StdFJr{)vbHpH zxiOMt^5dlSi!BqhbcCu^r=(PM)~3O51(6WsmUvR5EA(k_y#k*u%79A-r727TdbdKX z8Mp2$W%D4z@9S-fmZ+&IBr{T*>p5Cg8;N&kyg4b|G)Zuswc`%_IZ@CT_R+8xhrCXk z+==hJ5U@y@c{Y&G-q`*PzVNShv0R)P9$!qC*{OA~qCT&ca+{obW=&@4b^KyXW@a5@ zQvaOklxA)H`w)ncjLpS*D7C}L8?^~{G9wtn;KgR%m7u(L9U$lir*ZGP+BRuu{VbF& z`CsPGE-zQA4?n+TMj!sqbNjGq8`F9G>{L>3%9FlSYGNnkXwc`z zO0Y+tw=2OeeZF1^Zs~Ie^QX_Pm7q?a>np)Neb!fk5A=D7c8s9Q=c6$E7M72DE6ba= zD80ss&73~MqAkE>Qij?~7ON8hgnY-hJ{S(B{o!?NUm@TFu*(fNg7rey-Td1R>G>mK z@CL&hzDaX^UajPpkH@~an5CK0+t{siX=iNQyi&Q?OS3q2I(GAzuE^|We>q*rF5m|Y zusVXaGF62b9!+YeKe*~kKom2HPbL)0O`;(~wZ%xSzYF-fZW_rSUKzMrZBO2Rzix(c z&r`Wyfr@idMFKfZV-22lbKIl-$jn{@6wXfs0Ni$anHhfutbZ`}1Si5wj+qQ&o1NYX z#6yo%2vxWgb!~s?H_ZK(eRjTo=j#r2X$e+ik>zFLMLJ7E9**SgP%f6F2T5(GrTqIVhQS;X zgSojb#$ax)=QEg_YeMS?zChry@U0p{LkRE?LuNi-Zyd}%H@;}32W&&vr{olGK+ci7 ztNM98_;!JCdMlxPAxA*Cl6vk%N~n$73j9jc@rb;j>>s2hp$PQ#*?5Qq-uR{2cWs;@~3b=xI6HJ6^HE{1by9fJqVTtBdrNZu2=g-NnS_qhns1hp6 zmeat2^C!LR4V^4aGUMXL{`}_pFlN;peqP%q6g{ID1C(GC@k!V%;B5s*E5pEjcP1$I z5!|s-3)HPrEaL>Qz(zCmrmoYxM{DtXS>cU(Vgq9kIR&pUEi?q{!LwBxS3tLA?DK>x zH>&0uJBPwJCtJg+*e9}pAT>4CB5}X!;Ht-U370n{J2k%~9#`&@d!);n^`8}#u>roB z1!w1CM?R|O12JRk;2Dg#Ro{ah-ghPhB?)JE4;na2C3VF=#b>i#n2)kcsw0{R;Ry&> z@o_rEFcMM*-_chsk$7qmTn9kb0t#Izn|(Qj@1N|$X=46l+>xDl08|+p6W)U= zg3x9X)K3kz_Iy}zdjqu&q!X^E9xY{WY3qWiXPEM?LYYJEDI8n&i~RFX{tBN@aR~{c zYRnXgo%od4YJ0ABB(i}UK1E}sADqJb@}~x`Ba>l#Ft-WC)?uUlbS4z`=T?GA<93Bt z(z7cWz!23W&3J2YJ`9HR7uXP&4wNEvmLlU9yGtrbreFCvKw$u;hOm^$I*173Bqz&f z3SP;;)koG%7>-OmUd8A2Ws+KGrG`k$HdN@E{mshqBtk}mN;#q^54_8N{*L05+6Xxk zt9LptCyF^AJl$kUJE`xvUlBxUPQe|O?5lOE1ov8xCe0!#jRTesG2SM0kY6#DeFBG3 zoEnhvVGtXZnt}lx7IG}sC;%`5hNz`tIyJL<^FTXiw^J}4+QXmh7PnKDC%}ObTfiHJ zwc2@PQd4Rdy9%kcP#s0z#b7L8A;#LP{iVjGWMzUI^A<1>t4rB%Es8uFVum3+qO?-wJg+2s*UYS)r>-&=*zaXRY3|hw{P3_sx}sCt}olx zR(&ee+`dii9UY#P&cCYC&_9FHa8b}Ib&+G0x;P`JAyOK`;MK~i_b0eO@U}ruT5*h0 z1w0#i_?}-&KD6pr@XlN;!p5{xe#iNL4`Ej#Y7+HDk$AfjjNolveJlz^HLM3;$<8yb z2Z#7{3I=)ruQcLkNEv3D%`pBjY{OWy7S`?zc|y8^d!-zuS7_s^FxYrPjgS4?lPC5W zVm2W{m{11)X)UZfTOBLl@T#>hXjgytyZU=(SARdLkwf!ikJ^V6GBwlJfB1dkgt8Nups zC7H-~>0mfS(Z0cyoW_iDTM9`Pi>vZk>P3CrbirE}i)k;H+_5ROPKTp0o-GlRf`m$S zE|5bFtK!lDQC~Rg)&MjJVpiCzAR;l5XambJ_}77q3TC%T`9T3kZCimLhd;5!8BBUW zj_M{SrvQdh*bmLB)qA&u!jXD|^VS3|f{~WIDjEvA#nBfhRxud+7_sz$eaw>acq?@# zh+euw0#pJR;+TlXryzshRWSskgfT<@N`NLL&?uyQD8pa2I&iCg&j+2>JO<4nYy=Kz zJSr&^24aLDd;sucVw(_5XeNVMN(NC)YVyaw{o5bd1YK9@U4lRuc++@VAw6@v)Z(Fh zoACy7#xvHPQ5}T(V?lS0k2&rf9~*j89DG}GB=VbsoY{bquGB<3R4W7E@MAV?kb)J>uQ(mQd!&0%SsN^mJK?~^7(#V09T7O_ zoYhQVEyhrHvWNilz93-U=K$ut1I%X+$v!(IQwG6~4d7*@b|y}uI~gGvca$uY_D92h z6o-gO?IE{nYL%|hV8#Rm{eiSe1BD2+4&oDd!&IYeqY|qmj8)fHfJ&=h%&^+(&o`{L z`V`T)-x_yk3~FhMc1*cedTKB6@<<;UWSM@fh|~ykATg zrS=f1mZ)ei1U?EA!x6D5M@t;)R2pHD?81Zit+7SA(f#b4GzMx(rZtdhC1as@W`hDV zGwwA|1G(lB!h|S}NQa0MlNn@8#*eu&6EYrU{_UeEc|57;yC>xjm7G`vC6%PG%q@Vo zkwnXNT9Z(KU9}73Y#4sWuKu|Up}6@wU2=RYh@0PXaPym^P~(@54UU0=mPVvPx?Qph zQk*HzA21WwTc_b@X>I9v>FIcRJd_0b<;v5glcgF`!ap6W{IIlSPgsvA%2B~p9ObOy zs3D;mZ$K1bH4Ne_K3SueLEJY*QwIE9(uGI-U2@U2_`7&%PS50q<~B}+xS$sg9K{r; z7)4bm6BEntj~<~t&Q7Q{|LK{epVfNF?(h&v^J1gK&+pGasahLIKtfjFMMelGfmvSZ zIo^@zSMb8y7%ofc1Q^l-LJ2XQIq#?_GBaDsX{ZTfWPO_4Ly8h)HqhQ^T6E@gP?tT# zrBl=#A@tr%XFFSs1DEE>=uvdpVBnQ|(SQzH^>PRMp$=WM(18>!U{uwHrYzMb??{+N zmZB?kF+?Xc!O6^i7>#HG3^)5B#^fnAq||U|XnvU5#tKlF-TggbW02ex5WRw4Br_MV zKx|YL5>F(Zxw5`fl`Q-#BE%j6`h%A$`a)5isabPt&;6};M*xkb2~!_u2_1RuS>|P9 zQB1O4^S7>1tyY_wIO-tiQnAlQuyK6AJ(?WAfBuOLF$Y(-%N})TjdhTC??;qT6;r@ z0Q`~{RJq8guNKVOb;#qy|){%`-Y=47-6v@-ud9l$VM-N-D^X^ zdwu#YRQsBr3)PPKyZF}k`1^+z`P`q$chW(s=lorK?%VwRcUZ>Ynl%ir$#nMGl*l@} zN>P4{xG?3vGV1=zH z!HswDmR`a-jaq~?R&Q)|9CK&^o<6e5jH)B7r5-s>~0lGJ|zyNZCNL@|oPVND2x5Z#)-_tpZsh zZQf3sC9;cr{!-cVQIE2uGJsHl0QE1ujqIxb3U`&*c{+HDo%%G`x&)A9oJQ$%Is-S0 zq$Y?X_U3oMX@t$ei~Z9y%jz4<>Kn@H8NI+W44dyGy)HtoY=x*4&03qk);@AlECvWm z{^lLWWy(<9S2CWe1SOJ|KI}UJXu#005&)8&|LlnoU8pwhfhO19HasBj_(zWA9kG61 zkyhEhDrTo@U(L5uwXcXIeKI~1ys>d`@N!k2ubaB6=6SDfp4+QW^TVb{GLx6VS>NPE zzu@ntbk!L>7pbPt&qXrn4&{<>SQnl2x-L1=4@_j>^rh5Vi0eU*B$(5e!RN$fA9`I_ zayc+^1u<`uUda6m9BhybHiL;?FQXXu>CHH3YFleBhrt_s$gn8Xr`AgsdtpONygN+U zsOjEI{J0}BLPQxSY7NGabD$17chCtV{&1W`#d6w#JOzw;JP_|S#bX3BC(7nn#g90YQ+!ZucQ8&yxtosV@Fz@jLj#Yk+WzvO;pwV^}= zNy^H%s=!#?WopGD0JHD0l7?zA*}%Gex`cX(Pj4J=R7RL&i#N-|QFIZZ>;PYzVt3(T zBGnf3dUcijnrMrWdj^+)s>MZ)Z1h+gC+$s%#sC+|Og50$4(T4XBD%|Rkw|3+n#|=f zFTC}671SEmfYb0u3=BBpnTsnUl&a71$wfLFQ=|+@^qC@YLT)4gqf?8@Q~2oUQDP?N z>@*Q)(MtT7e?oEoov}R43w}`^>kGvX$-~%qA7^ma1B?bPEzO)yzS&Tk#6}@1Q_oZn z!tREeYKL_()spd(Krr)zT2F)+chPc=4Od8BS4iIfhamigKnQ-!g+2M!NO_shL|Fb7 z?vMsK5)zKCVT9|4!d!?wAV}NpK@(K5dm{9Zcmy)bXA;Hl#+tcwZ!Xr%(848}F`aLw z$TJ)YwGWIP@xThq--F^vCp$wAJrjoG_9*heC3i6^K79vjQ1mFyX3AbPUT#Nlp&Un( z5Xoq<_K8PI{2v_|k1SR3)3;%XVkH#e%4V2m5;q`grwT$PuzTMIX>>^rQz3nY^5^c| z3~;TD3(qkMy3oZoHP9=sK8f|WQ8BUp7Wwd{y^WSb4t5NKotNHU zjp^Vl*y1OiGoFtQ_XO~fPn zlwVb&$3}P_?C}#L;jmh3-X8@R&^#y6&psCJ#OT;O3vPx+k!ZZ6@1r`IIJ^8^Or_^_ zdM;jsM-jin=Fu+=`YvYEJ%0ZKKfmGc1MX*+zeoIiCl<5m`<5sv=l$So8%jv$N|cq2 zm*SDQc@|8luv5DpT+rvFua>)%m!C z;%OAMOB&C4E9yZ2hr#V^*uUz9W2DvuLgONOfVkY=6h3<@ij3W%UxWM=7noF& zt*vEsbHmt6`{Ah5x{6D^;jl|s8HY%`dQRHm^?>ih+NJHr-fjtDi=^87k_AxJfd+`c zprM@fda6}yMm?SC1i?&(mn3dFQQ-!+o#18U;=-9cV^qA^FdMW=6>k{tA?P86pw=2_ zve0L04Ro$V@Y~zptgjzz?d>*QQj!{w5vkfqI}-Dk}n z1Re3cp##=}%@AAB8%H?H2``We3d;md&YV*&w}U1Nn^e4m=JMyCZ7X%?HDX&tT6zW5 z2XSkS`mA1Q0bONA^kHp!EZs{FCqYw-0$}xzCVC&Dmk^mt{^fAcr5Jy=2F>YZl{S;o zt8!Ay>>-K%beEvS1&AV5c5p2Xl3@uEc&YBWQ=!OHSlH!ShcY0u_}1>vn)t}@(yd13 zW+g&~=Bno?{+}d57`Ad?PW_sGsX11nag}im@}SbsSzcn-Qk$gt%7M|W+i8AcW)|1F z^%QF{zw~O2desn};}g$d1+r-93<UStxl7K?1{`D^d z_!NzfD{CmRN;KLi>q^=wiI&+arM+s^t3uFZ|H+X^WMw|dpyaVL0nTemuX;e``4aO2 zh0^gb!y8YeHZbAaj>xM3&7PP9j$RPK4O6`6cVhn@5YmI3a9oE?l@_A3phZH|aZjSLSXSpFhMXeiYoJWc(%Zrk+px09P@VA#VR4TaSjPgh*819 z7#)%T$TvPjVkpH@l8``9oq+@r>MA5a{z1*`(FT2^`ewl?U2XZ0IHlSyn9wt8kSoPh zB4yXxrD3J!m0M(t&sZrHm-~?lHkRIQZSHK;$e8jd>;lK(yiJ6k98_3{X$O}tDU5f3 zfL$8I6pKf%cEBiAgFt=3>J6ev;iM;~5gl3q^zD!^r z9CB-L*1K+p`J+m|Fb^gM9?-x*enh1z%`5Q+vn(kz9^xzL`D?8W#4uJp{gEU_;!04r z>DvdT|4wv9HH=`iCKa^yhPaDZKZW?#Ix`$2qD-yAH1Hc7Zi$f~EMdfD$m|4x)}C%> ziYk#KJ4(QcpaF5(S+TAa9=18EOOh#-RB23XJb?WVh8;AQ};+BIH@l zAQL21gmHV?CG3t9+=_7ZZm90r{H|G9!!>(~t~;ym1s&%OW;cbz+#v0w8zi0~MPZ6M zcF|)t2Sv98Xp}L;4Ss*QH^c>5*k&!XQf^=nJO`OhIOs(7?znW-hto<2k@++W!&yz2 z;uP>*T^>l69uMXnvBX*q%N=hUtK{acUmhSpJBA=8FA<8OI0qe(D%27b73L=c{4wr8 zwO7-C;*up-gceG=JOR&FmaTk)ckTDIl$XW{Z&3iAk=8&L0cSpPiOV5SapTveBI!sK zQI0f&?-mOy_Uthp7&uXO1av&~-4kSErOzRqnR&x9R>Xo=*4K$eAkyK{Fb1t)nQF#% zVe)MX{Mp}%o&41_%RXDYQ?7mp0_W`B@HtQ9w;#v>Wm5y0Lak`To*SyAdE@yDOE_|>LUX)q?yz-<_%Gw6CE z3ycE>oYv|y(OcW=fxXEcUXN40qD}8Ilzb;FhNRYR_StT6k7POy_T2NP;oUxwZG{_6 ziDdW^Tm)TRh^j|3vnd?p)>FEBN=U9vE4eZj$1HJAtEf3!shtWY>a)%ag+pd{1kF9d z-B322L+3>2*uQy(&NVTVEG9wca0{Ww4o9^MizCrFOvVs8(NY&CQe1zLbfk@Z6(2Cm#K9S-)=7?D>y!aX8Jid16y){*($YS5F z)Vu=CI2piR0WDb-5%(T}&m-j^JW@ds^sB4Jx~}kZmdHh~V9W_;}2os=Q#j z?!)~?i2DsnM>*$x;Jsai=fRpfqjCZuVSuEKRaD?(3L$|u1fkeYT!=yIiJ2rUoe2&P zQ5lhkEIsJxz%5@_$<^AJARN@o6F9*NT|kj=CA>HZ`a76z#_#r+qX+$+NZcJZL%m!b z!Jfe{C2Q(7pn#Q%wAOXN$WvtYgSkcsn>2y9v0eZ|cQobd;9aa8!Rsc6&_^Dj2NISx zBTxv$I3s+`>%&ckHlh@FhS$BenloXk1ZJ?fM|-$rqkBu3j+ixva5l1j!|B$8(vsvD z-#d40=^7JKG7%8Im={J3%eSd7%q0v+JgtR<^)xMblK^X$#QM49VgLVZm~#<1zD<`i zIqzrzCx5BJXH|}%zdOM7nKKLc3G~Pd*eDP%O3?<92L(Wea+nX%zK3y>Y|K7tDi&Mp ziwT3r9U!TVkmPa*Bq2p@TdPcV8?z#xEZ%FMcSDc=p%XMSOA?HR>^_}2VS{`$9Sc0C zeT~SjkTajUxsLY_smp#YNoYTur`$r5)~9a`zTJotd@o3 z%Q{90oiZ)8@=2EI-|@3~+)R{S0ygn%_(Roj(3CKyjty+GeCh9Bu-n-=^*H!y=PJ)LR#r&`{9~ zVRnAbJ6PxjVrU*$lfRH4?hJR5GO|$*bO-qAkXJ3J;a_)+VfZry7Zq?h9~x0&Se%vi zs-*4xYSUZ6_thgv`v&(3TVqP;pfQLrXlh!-)t;`gjVi{d^Mxt3Ej|l|ll{SBI5Y7q zq{i)Lj1Gd1^`Ppg8qsDY=$>3;G!2aY#jMfW1Wt+C z6XgMvaVq!Zz>wvC(5N%l>lWP$gp~>NqnKgcJ`<>obYsUJhqocErUmpk*J3UCDoiG{ z{V?D9GkxP*KY| z1~tK`_KF?-tLDlgLf|_|3~%h%V2y4Cy$RWgFbz}GR`6I@pr=M11&tmV6iCc zZ-zXHsxD3+MAh0ZCzR@FM3v3yaQQ&|d_-En51aezT8G@{Yxvh)>BYlq1S$T5eM7*6 z9Jl=a;ng{hgMZ$f4M#rocnI<|IjKW5x*u~|@w7_b8dl3vPAjrOf04_Igr~iFNhWK~ z_a?-HgDpWxJ7#14OYa2K3q*ZX#BNNy_w7s4dScjpY;-WZY=tdpEBGi#H5oRmd~~B? zJXl;5$ESAGHElV)r(41IFV*R-VljH`{GBGA33HJ2cY@g_;ok%QCTq+j;sgICHYKRW zTf^lN=#u@j4TOeZMTc^ONKhjz=EBzq=ezKUv?{(GAbX{$)pq(Jj)yYxPk7iIO^t43TK~&?vU%&LSh&Mi2E)=`I(AkhXcK?^N{gBJ)o* zeP|>##4j?0wt1*;@6u$E?!9IYjbNj)7U|zMdZ_n3w%;$h$F9{w{p+p9B9qrP5B2>T z?x;g#U*;mSiwuxx_|Pb7{aF-7e!GXp_#IO36`U0p9m8+;&=|WgD3jrS(J}mX4~_w@ z&6deUc7s?wH+rb|dieD^LWxkl17Bp2blak1@j+sp=X*wTt@FndZob&gxHd)lc6_n; zI#kBc8kR-Iar|-7aa_wH<0P2mqC+Jb7a7em%tc4C4U3GToO97Zv|W)g7$Y617ac0q zyvT^kNf#YT+Z7qZW2cJ_<25ZZ5(D6S4ytWfWE96=7hR5PS!5jLw2O|S?TU<%V77}6 zlxSRJG@t7(I+)+K$XGu2U34tJZIQ8jF1+Yie%nH0DMMa(AZ?gG3KV94O2tP>HGFs! zozG%JXsi7Gt%9uVvG^b}O$&|mJyhF_I_^ z8x|TR#UmFUEY-fyn8Yj>9*7zh>fP|jg$FS0^2dl`>z`b3fOjpJ)@-Bv-bIGBFBcyn z)i8e)bIiVDm~_khabQur3eO@~McdyoR#xl$@#2}$;^Gj@Xq-QqfkoPDz4(Z8Iw&-1 z!aaZCArq|&jkggZNjSSaf5%QL*39-%Xl#o_ucqHWcvdI*qa(&~{cz_1v5x!o&DRq5 zSl?VntY&d|&+j9DY!CMrR)x1H*|A-&Yo0%%MSs_z=;6VDS*`QOv&dhR5nvS8rcmE+ zdc)S@y>qKV{Wmybw;(dO=}WUhBfJ_8dtqy^@DQe5p)s~L7Vds)Bfn?L%{3kk2`MN* zasmBw8Uc4_8b2^vdaR;&OM}g{%^$1TTe!RYzmVeeYOu*X4H9Ha{LxCqzLZn;f?zKLcnIAdz^K+i~jQ&d_Hk0ixweve!? zvEV!}OvT0mJ-Tv(3-;|A=8po}@rlYbzbPuEVe+m`e&4U4!M-m(Z+<<$#|6p5>-w^` z$nTdAWWkxDQ+_?aM_A!(KAc?yKNswLmje8gEgu?3vf+{YLbBZ=BhKsNp|KmG$xE~7 z5)%y{8ih&4q9fQw5B1JM(SkdqZHn~Wn8xF<|NVPIV`cSGWb7XsHQBnzcrs60M|sgb zb4yKhQDo#qgGErE#!NKMAI)mPN>~bxH9lINX-XrJuzCcad}MyCZodp7`n*MU`6fO; zzm&v|UtR`ZdieYC%iw^1A9TgHKRlA`^cSWi_3L`@ncmwS1~(-9j*o)J_}h%KMZ)dI zbur;~<9boymRcar?`k-R!+oT2SdTevU_tPVz+_#ynfY5lqe%M2q7=2?S0C&`y;3|y z!8yC0sZoCK?eM&XymD+OP$%u;!(_ECG#(-McMs<`&L0f|fkkenyG5;HgCi0qQf+B0 z*5QsM-)XPE5INE*P+&Z8HhI{oBBq?$+RJyn~H2qe=>9=yG-*VHx zmg(0~i9Rv?A*P=QyrQJKih7&$!$@3LjaLQCr3k_QR8YZ(A>|uG{dM^P z;eZ;_R-Q_v->G|IV-7SzZxmj_P>eV4HF{$x!$u}-@3eYK6jS>w^~x@J8ww#Hk;B@g zc8OE~k~Im579_XDejNpVIkvM+kvWKRqcwMe(Q4aG2NN`bkLY2F!q9$O4S2v9M~3Q<4zR&aasT&aMk{t8ENJP8LdDhC%yi6@N?OJ~3WwPLKu( z*EJ!EJ%5w{&lm)-Ym!TUsMGg#P6R#d3Ss<;Dm5sbT>XRtPl=#=LLjS+Ga;B~Xitfr z&$*vB)YjoOdb5i!g~j6j+U7j_aeoG%Gm|~PB>>m(uM6kX6vsa~pwB`!!C{kWpAUJv zaW;_?*VTslYO~Nu8YWqf#&I2oC-+*#&(Sqr7oYD`ES#?H9~cdny;8)*eM}~AZleZ_ zBRn>=jiS!aR3gfZN<)$^n>qFLN2AhkUX{+KGYeUQf+>CQQZG-DGze+Wj+84`sCHWQ zuwJQ6{nL--GE-Ar)PpPw^bEtI+u|BZedA-wHA_k4xSruma4M1)5as4{O8`}7#(C+% zB!B_kU+txmWVb6e6tI0?yE;OO9*`bG_^=j-OZW}vkVZ`5l8yIcWWozvg-OIKP6=+e z35i~@>NA$5_GWX+Qph#9qyQ$7B%hXnybOta09mO>vz}396C*%yhSeAe<%1rj1?&Vd zvSm_16Z&h46u|?y4H|aI`T77>h<$uip<_}o<&ZLp;%K7MiHl%O9nJDD2go^N@c&Bk zuT!wOSEqzaDJ84WQBsVKiG(B=47)DTt1`Xnkf%u1b_Ghj=|*tg8k`RaP^ZX$H>5HY zhT>)No33o-0SfP;ryg&K;+pk!t=l8O@R@yf7y~w(Ao;FXJ4h`Kg{tG1$dY1yr6=Rw-|Qf6yM`C;z~rw2Ip^ z6Ls9UK8?>tk-tk^)5E}SowDSYG+)*-iU2LuGc!lU9vSFL`VG4Q-Fqh_V2vVqEVLRI zB>RrI{Aochf11PPvt?>(VK=p)-uJ%l@L<0BMLo|EBZ`kRrvueh-q(Xy5FU);b>0Q2 z&I)QSXE~b7S$BDN=zP6iqyE*fU%&2!!9*09xEpki%BD&@id>Ma)9a>c1>=o{<(P@r z=8nmblXH#WP8AqD8ikReph!L>RrvAp(H#UG?@W)fyafs2 zvk>&+C`q$_G47-g!aQfi64e_!4Z{JFg~nt^YfI`-%B@JHr$gKvwUhNpsM?St|CSI+ z`b8sSbE;6mVBMYHX?M;GdbXS|?AbysU@~NvpMqk?!I913GGDr(ejzqfzu>V*r%n~2 z3J%abTApc|KazDUCLyG#348O%IV5wt{4ug_T4QQga8-??<+)wtkIa-m-UAdz@UG`P zj|+_3JzAdA!2_dex^5cS%So`vn)fhvUN`wOcu$3JRDz*1zR1uwN6Xpm3yf(cmPH2K zH3KFa7Z^<;wCD;q%z!iP3yet=a?$Z_&3K8n`D5+CB)dKs4yJt+RdWW8;)mw-5&S^r z^^rgJ?oa{qdU^(`u)vYoIRYb_ZT--AhXY*qMT4;YNvne`FyXkGMApM?J|VBD4%y++V?McXSc97l85Q(egt*<1cUQ2SrA8++#l+si(>UD1NA;&+VwlEEK;N zWf5<6^qCHdjLJF_Z~LO-e$;U@x+pTTWlf6?{7MI&?V-rHN&*)h_Pq`}(?R~IV#wY* z|2|3b9n0m=ZDu-nXjHiYfnO0y`J%E0Nf3*i=5I9cygmw!y){_x^@cZL8|0VkTP|>@ ze)q=D>?eN?B*BPUj5`xkX>ozkk3LGtzAww237lrz^BH3&YMaE5ti3N3}&pKqH zagouiIcL$M^hJl9?V-rHOs?FvE;{;S9erLuMdn~h{i36XFAS@i?IC|$6=7(btPAEM zCwlzCib1n|wwK^!(dVuugyf4*ysB`{*dxqtET5V3$5WW4`qH z1?!^E$45b(KEoHmK7Ec~1Rv;g^ddO#;&bpK_~!1nj>uGYRnU-mm1D@f>MkSid%q=D zIl=G+Z%XtcXuXhX@Xk<)CktO<4Y>{N^LRDn8;Ixytmy1#$_1?TMpdePp=QLjYL=yN zG#ZXz66YDAMkBc%z%UZGE<$(ZJa$*kq6A=fLE~In-ACS%uuKYXIs^5@i*53ndNJ_?^@&YXWFy%xR^8OdOY75 zH2eCNS{MWFCPA*?N!?Dm7R@IP)IW#WE!ewjlixRP+sCcjMLNHJvFtU<@16J1lqW0* znfOJ*;~>9(?+_L2zW2gEdDJ@{lWpTJcl{#hksE#d!nn=72#(zGpV0Mor{MALGwEeVsSTMkpQ}!x5Zc;2lesN0Qka<<{UdM70i=VNK~x zsSrd(y;r@OUS~|9wD!d~_;q#sn_gpT1&!6QR_++N;sJ0ZHbu4V>v)8k;H%^R{kJv1 zOuzys+bXKR(q3=2;83bQySS6NJIB~?4I3Q~PT;su%Y>s_VVvm;9iiSxsJ>70fD>aD zm6|`N>UJQ@%*cKk$y#uzsj+@?RZasUA{wcPxbbR$uZpCq`aCQ zj(TvXt+tV!7702g;Z|G^ufmq`8~@eR`qZreqoB7V((hQ!+;G>z8+V)Aq(Mm6n&6-{AV5UbmyT@hni2jc8W(ZLGrH$d9~b z_|K!nb1N%&eSkj1uAjKPRE|txXPf`2RvM44!^%>n`bT03ya+ZVFrs;#x`pUB`Mm!( ze(BuYMU@l+sP2ee6404$y2zAazIv;6Gj%I=&jxn2=j7ajT1Ru1;w{7L+y|WNzC@le z-wPt_at44DC?%E5QmR!!_>e^&1T9DH%1GQVguK1Hn7e%~Up zmf-pZKRj=pC2)IY3HmniKe2rMq>cG5cwG6_uslSVGwn3Wy6qIC_5Rj<^iay-rb8&A z1)wl)JWFSc?%|&%*8z^Ezg{|xW~USH%%FpPF})IlXNAw+@H}xqOC|4!mY85#oSbXULbDCu|%xF5dac1+(4syDf)5)A}ayy#a)!feXyb(Q-|I$yAfBS#A z@A^$X>EAzWMVvl~_!k95{EHkB|AIw)YuH?G90VQF@~>WS=&q9uIwX%GSV^Vf5xc)Z zQhCPuGR}@M>Bg&r-y$s#H&Edi4s(!X*=2H>5Es?5u3m6*lI6X9iZk5W+ePxgH(R?~ z^i@=YnBGUtH*&ONAMlY@nWHDGqhNR+_F_cCz@HCwc8wD}x~8B1{F91_i-){=>BZt; zgn-6itX-k{n-NS$s%V9mfbX;*e5X0^ouW{X?=SUcH0+DzE7%k`PhJG4FN}-u#S00G z?!S=mr|FAe0`rdB1H8GgmF4ljvVwNN08y0uX$l%(_OOE1qyzESDQNzj{yGJX7x~Xn z&^8UZA-l&Yz&_t4^&e8wtdyQq$)LTlzTxRP^fn7(vnts$1d76fO3^MCFSMc>xl6tv zbHc1zL*>@Um!7;XUuYZ}#m~D~G>XAIgRNmOt_@(i5$f_NT4u9j4Db47xC6G>;yLjx zp6Hf;Q8F|lGIUyy44vkXq0_EJfxYfU6r;(|30?~UYJdP;m3NU#4EFJezF#6f7q)eN z{*Ip?^y&F0glNL{d`aIwAU+#*cSEplUP!XC-4~LiY~zI_Df`xvBxO737oApbVYo`v zZbVND6SUU`Gq3^UOJ^?*;l`SNgnW{M3Ka%+*9Ug>m#x8sJTs|;Hxw24_VvOsMOOO$ ztw;!gtOuwWK8UYJp;URE4zHn;grzIQ=)t+7v_!kPM5V&nxCLQqwiC`OfwJc9(qLFx z5=2-kNzrDC4u@B4t2Z26P{C*v@KyB~3wlkS<;Ers+X4B3gCoGEB_|`aYZM$l=)2cP zTvHx}_O1t0l*_+*qKXN~H@!CCMI6}>W;}f0A1`Midk?^wKR=*)(w+}KB zQmOj3D{UL83;+&&9G$EVjwMdugv@&SJutE7yWMe_}#R*z`Q@f`<9}_YyKb0{nl0aRi$=ptIJYY%gqaQk(Lvcup-sa z-r1C@yd=~()Opt0Reu__4p%>nspewC!%~FUxhd5qRbU+G3W!+Lt{J&VMVm3@64W0- zb#&89Q`&Y&NFP=1!j2JeDdXGn&Q{|I6pACuI2+xM27CCf}Nrh^M zFoWUlrqddv@SPV+morALB4F)A3M|S@U!Iot5uY$`R=bb|cMo@VWM-W(IkissGv-Fe z=Qa$cWptN4QIp}GLPaop3CP_A29lpU0kBfOrFeX^$WuBt7U=ZX9SuQXC53bzP!G+O z6oYgWo`<7wfNHU&B|Ud367W$;0Cf(?4376%s(zFOm23(pB(Z95!)R!4zo&k7+;3Us|FpKmhKqgRn zkZoqS0HYRDNM<9VX?zAW?nySq{Y5H?{8fo>B1-Nc$E9+2)`EiJADPDM^_}&4%`D~s zJ+IEZv-fIy^Ywwg)6aZoYZv)d-mJgg)Yon@Upw4|I;5}MX1=nyd-y@$*vWijYj^+f zpqZT29^T}1ANwTB_-qC%nu&+aMx_MhN5sc0v-}yzlR{1~KzGmx{sw_cNjl@06ta=v z1lDBFs~%a#Bk!-Y(f^}kcx;0AgZCRWER!#Qz}Vo7-udK7CZ)C8ZS+p?5~8yoiF=w3 zlwuUxj#(+C)Q?0UaXn^0&fu*-F0;3$2UJ4XY@oV>Srn+=WRyCVZRZ3=2qA1Ob`fg! z=Q{oDgPo2@_QbXnigf<}DRZN-HRXtlmYm3k_6_<&>#8QnAJv4kOs3=H0*?FQQH0J zUn|z|qEBpQ48`(7Du$G>-#eH@vki#7dxf6`W3S7iKxXs%;zVKYiT?_|>rEqxU_=hg z>ZOBOIS^#Pl~OPa$cg^?6-bhpAnlzxwQrGN-{8OpZ?8VkY()fw2+pb)dqhz7 z3CNRC?8^C7NE+sMAK6c{H?NRk`R9uWFHbv{^a zs_j>4;x$4ZUctSS5AaNPDSfi@Hu9Udk>4KLNInE2cmA|}FwGpchVh77L-$SFw*MMX{;oj$DIOuPe1QWE_@W+z_xGiOxQzcWHVynyVkg{ zp$;BJS-9`|0XX}AdhUuJ#et0+8<*o=bQZ!smpVnDzUqie7f#KqV(y8}tNHGU%`2Ep z;ZSJ`B?KQ{tfn4q!44O+FX=JtuN%&W64Yb%g4=19&n;s!zuAb z5JYQXjYvA+VSKQSy*ToO47B8IfbLujsuAUpMfRTK6BxY(wN1v&GFifr7LIwMs9yfrYqzpGD+u&}3;_#F*+q&_3>- ztkOTh!P@*2m@J$q9HlzD#lbWuR$h<7w5k@*tRycZWED(CHJ&6;y>1I(e_Uw~)yxf`;=Ok>@2LeY@!IXoYbhI2;_Z&Sjde%fT|Y#E!$EjU z6*J9kB($lgcxm9h1W0&@A{{XUK~BN*6fRU_m^*+V?c;NULGCd0Lw6c*i;%nnc8H!@ z1<^?&m9TCb^qFh(vTtGmK5k(uX^T_KWec~h@XQja+P89RET$$h971^+mt%rM2HimS za|s99B+ywl?P2KY`CAxziYl{UgSba#S-V_JTOJ`CGvvkn;M(NSSasw_v7>qz2AHGu zmEfzRYHJM6+#3HDhsx1gHg4!_T#d&;93HpEC#z^(J{t#}%W^!fI53`hv5aTq+F_{I z&Pi(P=)x=@lQTjWKL|IWArIpOfWb7`EvDd!asPVGmVxc z1i+r882RnzAkt@Mm?{xjBnC6|nFI+!B(RCaFNNXw(aAJUlKQkz&;G3yq;`z&QP_al zA}Hc{_!~y+g@cQ62Y*0aQB5WeiI5IMFys@Wo;YQ}A%sY{9I=AI&~qdu_Ly``Ou7mp z`fT+K@tR}p|IAWcklWVy_zdK>A0EeJ*Xv2J2ZpH})TkMK&tC;U(^5p9G-3o%H=~Ri zF#_rortM~zB6tn@m83Mhu7dW=Rn{-QXAs02>l1h$A|Wu6!do>c_U5;h*d)N#_}Z(L zh5Wsm2S@vxSzsf{y$e-VV{2~oHwE8imchETrSi`Mh^Az_JUNQh!%rzKT0|FrMmIsL0 z%bm?WUU3kL$2P>mKT8bJ1X&p36qDw@Hsm7=C}jZ;Xz^?{4u8X`Gn6AH%E2fDnn6ce zXa?2;lEH)y#N`;@XV=^sr*p9gH^zo&_)qiorh& zo<{kAPDq&gtGk7c{p`SH# zI{WcoGHF;zY0^1@fn__S;u%}Rd>H{|2IGio7_sq0RYoqpoXmMdDm!FEXkAeD69zlX5ghtdn2JT_<>9YMtc0o4v%%h?dw+E^#xO zvqWn`nYTJ)Nda+egSO_*ax+TLlHHKAr}=I`)4WPf^W9+1G@ar!Z=QT;GY}1Q;fgjO zcjoU9ah1d)@z>6t`aVH88)H0E%DjoDEGn?sfCS`EZ+`}`zH4^&BtMP_zVDOA`QvB~ zeA9Nwd6S=Oj)XAsp3ZYFm_LpH=6mq*e6uWqMD#Wifln0Llx?Qv>!qtpayi@bu2^6h zw=j155$p8^8P|aALYPL&_rNGo#=u?)&+^VPtLOW)Q&il6JC<_OGDlbx|1-!Ey}P zO8Jj}`{U^d2&5`si96y>DU%!CrwKiJl!!Nn{K9#0#;wtq3)nA1GMcOo)TLmc%5MFI z6u9RIr`LNQ$gSYX6BJSb+o4ZtMxQ+-DS!Ga79>CM-};>7JARR$uF8U=Kvq#62-L9u zBF#h;K`QU7L^CqV$$vdVC>aI}M=@NimM@3VfR?W=b=JkIPr;szf(5)9IR(5LeF^r& zWuW*O1Q(a9`p`W2Cb6HNUIgz7r{XyC>=d` z2d!8g&I{w-Wb{31WDFIDCMiI|9psZo6AHS6%;2(j5lR9fyMyGtlynFAn05ytZAza)?E)(n+Vo zGSDkxQB15MP2xBQtOg^W!u+sIBW_A;rbwGhA1SxfQf(kN{Xx8X3c}XqcqcgJ$W=f6 zthf8gHyYkeKfUE&?CYDL0mgTsNB8qefMa;PC~$4a)siMxA81&^%l1{FdFZnio2-F0{+2!Dy&G$f2MKffn=f+ zE`4J+C?%30g>P+Sd04$040lYb$=MiA_gl3^d75{^i`Lnc+>iQKxf7Y4LvrA(Ho#igVI%6P)zcj3pENb~Y>&CGJA)pm!l-(e!E|PO%y`K^ zH2~Ob8}C%%cmMU=cS+EZqkhUHx?nthBPSle(FJPVMrXr|QR}J`oi$J{&rs&UHdB?~ zUj&;Pm4C$F#j$mpzl$^LXZ|ix`Cs_^AxG#xHWWMD7K%OI7Dv^QMB%&0V2rRZ<(~d4 zJEnd>rbuUy{ArGP!g(e9P zE^d_Y;F@WtcS4D#5pi9GYl;3+$c~N$wx09W(EIrmc~cT?WBQRKunll_x1;{Hgxk6X zD=pBr$j)rYji|kYs%>`5aF?}NpmmaPRMjaqkr#vSKzewSz9hY5dfs%qeUwSIT{vkZ zJv<4DwE?=LFX#^c(^jSS5BE1STfch}fOKU)W4aTsKOpm|U~uFuXi9HDR#l{PIz5U? zOOBTDcDA$JX+^cyQ`S`t+B)MU_3#irIGlFvW)LFR*g3&Yxfk-Rfo;5LF6EoAah_t#@wPsAoLq__=A@W^T$T zhD}bDq9`fKyU6fKxhpCQNnZ)*sh!i!fGUn>696{@ZRI9#AQLcFQ5=8+QR?MTdsv#X zsJU?)1;$M^cEiJcnAShn4A&_)5}N?z+4gwHTo=eA?_|1B`XBo zZgAT*QE$;UeK(PAm-Jl}f<2TQN4~CVYg;1OnkGW+2GM&Iv9{Y4g<$VYBGop!!53%@ zPA))CZYv5#strkQb^EYM`hnd*1Of@ZP|))(k|8=jXUmZ(q1t^l-bN>Gcds*gozuSB z%=E8LbQiPu=caO#n2OJaD2*6RHoH@@`nXB*S|QCk6k~rwyE5|bGCAuZ1`bKm>~{5* z8(opfnfCYtvP)I$tJbi8+@o3B3%n@lB!f6@a}@jA<(Tryu4Trt3 zHLwOrSR|jqEa?`a4k;SgU>_cUCJfL*%V3Z)<~1YOJo=R( zVZfMz1X==^0y1i;KQAR48!*m=!J{%jDo~?d{P&hT#0I+P1p;t(?~KkZS1u%g(iu=$ z>>NmdgJvW$e$h!*{)_F|7eV~Q1eNaeYW7_#KlpuiX5UjT@4q&geJ#b5{kJd7+gSI3 z7fdjh-A3Eqfd;#^h+sgYhZOikVS`VXVg{tkK_N~_m8Vk->^1LR;!husEVw{b4Erjn zYvbBdDYB+LT(Lnd1WD1UfWGQ11cC0&sb4BRDJ@kfpTE9ZGW(?O+gXpX@w0R0Nj}}X zH410ideIj^Z^#K+=l2f@<`coFAK(cGN9w68q zFABt;dbe{1Mf_pp1`q^10m%XCh$NOZsDiRBRUbvzS$ugaXY1)!7xwrWZ!nPPnMs9I z(cUI|Q)GDEC8lV1#UQ1bUltn?%P?_~#pb(%iDpeJ8lZl~gY&}9Go6rokkq`!ME#1* ziws|xaJ-=baI--nR`dd(OjpSE7LL%e@-Vbh;KZMvm}9UA^zhjl61J=Y=`fp1Mu&JQVV$ykvetlW1nU#&_uWZDDkn;UolROwYg-PR=eSWp6BH&I!fQT&B>HHu#y%XikrJ}r)0lkbd#FZI{y+bB z@P95K8k3VpQmeqw04ybl5UC$1{b)p8;ankq0%1}w8nc5$l9LUU43@@E%M=^Ew6wPL zzkt`n+S31m>}nO6KkRWCJdJp8qt9=UKEGb@_HI4r_HMmv=n}5%gM)3SJ|AFl{`Ctd6nAXT!l+3q}c&BclP=|%-B()FDh zyz0%;c4%q!f=jFCEUn&Mj>D@KW%;#5A>v?D?j-m6k}#*a9dwX!$E|xaYu(wlB{+;> zlf6~s6^l>@SoRGu{;zxe`9&kZJo#RKSn>Q6O4{O0ef=$Y0{QN;uuU;T63gF7@ER_B zfIyEbeGLbV5ULG(JUB0fI5Q-n7pSaOo;VDc24kcxKxPhd7(i#p&jG^%4Khs)vhiEf zoWa!%MG@q=INmr}y}iUm!l>Gn6buK!lqb9X)OPWW!N^uCK;-0wqy+TpxWtA+w9Ya5C;B6Pfm^d8LgajPfzuni_pS8_(cjdqMQSRQ=^E?a z4`${2ICl#2^Olo;r2awkkg|b4UZaQGKR$j;rBeUU^Ye1+`*$WxA(Zriij6|kI7)~# zQ19i}uGCf%p1&UG@Vz} z+?E-=R3`KCK$*(RFUL&fC=ng66{c2>k)_6& z@4x0d1DYwaU@+YKR_Y!`;s2oTj9;h!Io}y+$wb z-hWrEY^8iCl@X}?B7F0_TKV*9_l-&52kBJ0gip1@{nww=759n4yoglhUAXtwB2_VR z<$da&h*ajV`up46L)1c@uBh!+_bQ*lN`-a4KQ5KoeSNT3rIILF_5J*=xih0v8HL6Y zCjpvRpB7swmBbJ8>K-0GpQy79OJ(?Jae07>@yo>9=Sb^^q%!UTG+V|*ke|v!fb|Gy zt8P#8g1wq2jY9)B<&#^!)B_?)a<_We(M^XKmCW_L7Spw?sRoQ4AXzCUk#KI3t#E zKg7JY)PV)%I>rs%v;6e+krQ=f|4VPxakw7IiPM`YySJbm`(X`JuTBXb+?+{|FzbPj zH`REI1?vi2>4s{wpEk_8w9R#?N!i3rS#4ZBS!#aBo@Vaw15Nadt-Vpk`a5My)hpgJ zuHsPKjAbr#;WD0_#;es|hApgcLVeLfdie_K>Uf*240nyUET3$C2!o+2k#|139gQnl ztb!V_R z;hI~}Y*e~&K9<|JPe+Dow}xtarO}7m({0?NX9MP@P9xC)V^ZVFHIvU_*x_YmH$C~PGsC|}9(`3fdS#(~!~+a5 z{caWBed^p@!$N_MhgHh3!?a?O!>J9{m@Rs!j!qLhTt$oIaC`qZT;NWG-lcI6kM_aU zdbiuY!%>shFPCw7uDX#@ityYF{4%`Y$wF%5g-kdX_(e@bP8N7DUZ7h4kV(?8F1n`q z;djb=R$5^_1tznMMNJ}q{#i(3I_|9kL82Q5!2~rthgk;Jg*zXf9FP-BfdoT3&M<;v z>0C?$4Kol|T$0~W2X5lvX)!1B5Qxi7d1*i9FTD!)h9_t!8itWPvxleMq@FrDZLAxd zYBrm3mdgZTi@Zy_1t5|QVH%9(?T_*GpGq;XwAx;!b%&mzvSF*-d z8W~c6c?_R7r%ba+0d)fbb(heMZl0Q}p0{tz+;vvEqs1R55~vr!p__WqRq3{?9sDz& z^mRm6-@hj)4?S*jEjWMu)fq?ht{Fzs`&v)%#*%iN(5DT?2bGT1b-aIcLFC;ty6kL6 z4;?$V0a#${B4^Jouy)8ji2V#68{uI<>=Dv|re%!+@zcIp-o{2nz=kJJ#lXtKD+sI# z_^>I!u)EjI%99+^xR^F<@3$Y+X0S1jn-5x^rKj=KJYyl-^x~dF^G<{2of~R1XZV3O zQ=vAah?c>zE3QhoclAppJ*`Q;(fJ+;G=IC4&jXqZZ-Y5C9oxIf<%8~fU4Py8_SKR* zvwWAS(zzO-nP-V8SR>T_W3uf~TG*Y_ETsQE8fXiHRMEG@h-{OlNFRPG?a-C}&4VWAse zt~ul5H4a0Mja0i>ThQWYO?mVkwPSS__a{w{xIo1d8U9l3zKVEDw1n;RuhzsYxIGVg z$b6YO)tqYR=?<0SU69GZ0gM^Us1KGyJyj3Td$x?k33HR)CFD(_V)IC(^N=ONP5udd zt{6BcH;%>9!o;d`Fv^vn6(`k6bf#EWE$1HsS^0BxVa6Htj5}}O602%DtGQE)`Tm`* zHq#rD$RKaEsB|+4VAZ1CQ+9c~$R53Hmact;Py``ouBX&o*$! zTxVp1NddcP)&W>{(MZJx9DuQd)`T{w8h^UowCaSJa~kkHQ$qhkBhx%}J9V%|ZQnS@ zN^5^o9;e&!2c;^V+7hjW_Rg3~zsan))yvr3zAZR~tL?|Fj&&`5L07QaoF0s|86J$a zD{%#@*n1S;_UrTod#?N!-@R0?ZN7b3x=36v_ngZMd%hS<^bU;5H~HYBO#jS5=EK{U zt8Zdga2c-!#@C0#Hm=||9&IOV#@%2(kG8wP{T^*)L&=#G_IV(0 z-0RbF@H3V9M*9ICEjVjO^y)_{H=@kYSo-}Xw}~dRv-&eJS}$$*qR)wIM{xNW=f`pw z$Fi9q~XpqMvmR zO!jidIh*zM^Vp@1bKqF49U6hkG`n>F8p1j2|HtRV<%P4$$58OD9GxFSGT&?*_uRiW zFS3_d*H68`Z8lc#9*8+Hy}t4x$szD2u%`9`2oDfe7F_&q?loDp+9iV0u0rN|@ zKVOPXLT8#?I;N4~g2lg-$;alJzx=lywxuy=&zvOD=*+XR`6uD#MDsqWEzT~VT(aA_ zi03T(&(EtS$Lw!Qcr$y z>W#mD;Itdl{qeGNM)>tr=?#DXd|CRPH($McS!&~srOe68((6z7eXox5Wd8hI`pQ#s zzrHM;9N{-QDOH$na8laiZ||h^nZIAIN-uCzR_5jB(h>9DUYA}mymL}|fnQzg<^YS# z_w%hW-!HnvLnFtfXYnQ3O>a=-DH_MA2T6^}6RLgX*) zc?vzc>zprKFf+|8+}yk%mp;u|{C;FFY>;g8Ah7P=3*)dk=RxDluM6XGS?58dtQ4I2 z7DnW<&VvYR2zPDN!nhK-=Rs%f#0#UcIp;xR49p8-F&XDUGG>@w7}r?-c~Ei(Xkk3e zG*97rb7$f5b-tM>?2RFA7|c7DLL5xXJrkW4J7CX+TZ26F6kTh_^~DR9T=NvKcGMTH zyvjBY0)1iO!WeYEc~Ixt?=0SRN z)$0B{#zgLU&^crO&m)~u#yqI)AqwwhriDp7t&o|>IkEB{g!wU<95ahGE-I7vNX?Jv z{xW8wZuwSvSuxL#ax(8sRG&UAWUYk!HaQ+B_9vL{(g- z7ZO&Yc}-iW{$$>ns92w$Lo}ZAK{PaM{XDAi+%wVfdfR4nU7x>aOpXVNwPSsel5M63 z3MWMuDVOOVDAFmrixli~Jy5(`=`B*c%k@C<(1d?xY1rx~GCqLBF6$O)g3a_m;bt|r zNZBUO14WN5-WI_ymh}Nd#_4Yn3?|P5MSI?Siu!wu(4s}lPh@-mNqB}GBV1~>C=Ng011SE0b+Lny=RjuFr9~0hjB_9{defpf zOuji#h-`9XUKG<<_Bjw5J!(-*Cf^(=JY{N8EMC?*5J~HQW_;R=b0Bfr)uN4YIp;uQ z^sGgZn0#}fNT^zi;z?wl1DUULEsD#}I|nLX_gWN{pLY&az7Do1DnIW$sEj(cFdma} zCK7nU`W2cV$ymk*k(k;nhQZ{TS^SN5@?TWVNamY~LQS{gDInEnGA| zWhME{nuFcrB>Bt&7uZ5YEtz^|adxG-xNMlnIulW=k4+u@@W-3DvB1z9&-nnF>L@xN4rsvo zd4%_s@c`;0^X$f=4NPQw0Evi;MG@Fc4-`&`v1r*Q&m2V`-QiBw>!0rzqMBC59H{>q z(q!&A(5YHhM}w$Chu5E>>69YoK>U|bCNj@NhNm+y%H|!#Z_aUcPBP3>=mKuBuHXmV zVjJo{Q?b$>M*X-A*Wx(^Gq6m{J+m!313C7mvH6*2BI`x{F7CFB4(fwu*bjTX`rZ6Z zo054ZGR%Bd^ov}X*C7mKoXk5Dm44#(Y+gQ#4pwcJnFXKYIgdf46x-?zPs|Pway=)} zfaab8W+J`O%fUIZbfLuP95ahWAMhwSq)a)+_VH+57fF;qk##1bem6RAU9_SG52nxC z>A;fAHxtFQiMLO5^V96!B4#2MvC!WK341*}oh2i0A++}tFdJ#Fet8Y%6TII3iEO*(amF$%2@t=YJTbl^;KYFPZsaWQIIH+rEkX52Gae{4Bae-kGTO z;!YHHVqRB0?AzNA78@=1moXFdo7hmLe0L6Euo%*5xgS9Hwu1>3_f<6B)q5=}_Y0$( zUc!TDaZPx`wDl)&PGp}8;a_MZ5hk+FM5vE=(xX5LuyVb#1E00trIPaVi`|Dxnpus5 zxZiJ~Qw^cjLv;(1dqyF%k@w=87T$Ik-}_$_{j6eURzPjDa-(EHlw%oZBS9B~z`W}S z$A|5ktczltQOZp8*w*|qjQ+w@b58+tAa(P_LDVy5j>QC)LVj;Sb5z1`_D{?T3i(6< zb0C#%MCtOMMmwd5IS|{)=%?{cmM{leBlmt9>qG%FkwSYO;*|WwPwR~L6z~92J^zJ0 zbq@sfg#|~kX(m>RV`a>Tdbbm{+wpDGfXJ2Ceis`}7X8$6W>$gfirVL@SZm^9$nPs* zCR#NFEl>Ug$?q#+4zvk{aQ+EdVN7J60~uXIge`x13{93W2U-zQu1kL!`F-WgQ3WgA ze;WB@2{X|eeT7|Q4Q~sMsMzr(w?qXkR%GR-W!%`;R{W5Lq>Tr-Q8y}bnscX?(Ojaw|Q>w^W$ z_A<>Z92Ug{OD%F|;gM|PO=f=xp`8fkzaUAW@-xnj#N0VJ=MWjgWOC0$*Yf>*7rw9% z81E@yCeok1uMp@avObImUA2&djKN~_J&fX~%2%0Y7EYsiWLInpv4NLwCJI=M@tpXg z4e)c#EdHLG2Ip_eJq64}D$;4uCV812E}S#>{B4k;ndRYv6C&xSnlPn=nP>;7*J9Tc zVt{y=W)^<4_$`Gf-On|5@rzwjIELlHOA2w>&`;b^2rPcCnQb9|EO3z#iZ(fB7AxK` zKXF4L2}I8rKkH0H1cC3a#$Et7d?q8ht+k6k){qo!n@iEPTng7YJr zlKDYoV-=it_Zws+w(;B#qx-o#2@Sfj+(dVSI|<+8uE8Ac{QLED>Glx6`%$UF-;+UU zkH2ruOS}Ay4oWZh+Z~ktknnElguh3F(uun(uy=sF0+&x>Tws5Y#+8AC1339~@peML zWF9hDR_`rDrAB;?E95(}-m=ba%j(&sXth_z(`V&)*cqhti)LN{KkVbn16K@WUF#;Q zwj&mr(a$4fw>x;Iz!kRL!HZS;IWl?H@sN1J0iIe&Z})FogYzbyzZ%ppIm}lF@!Kx0 z!Y|kR5gvQ|c8=eaJZ75OlJDc{$#Dp8&eRsxAMIfewLgQ;$kn#?^w}E73l%ERyf1_5 z$a@5^mkM&emglt%STRiS#6hZDN6S-uuVpfW-zGjohNW?}j=I}|TIp{Qp9m5Z%Pm~y zm>E2J1l9x9fziH%P?sKij~;7DkEQqqGN+OAK}r~;byDgbpo*P?(zg^{NuG4u^;Rdf zl{yBH%BZmB;JS^Vw>`Myn#QXHKQi?bv?cD|@v*A&cB^|9<5A|VrN4c-zap++P|!X{`>TKKiMC)4HtVwcb@!v=?5YukqCL$6=7q zZK49@0cwz5Nv)Jq=9vqU4^=*omY@9X+sFPtffav$Jh{aC3+{Q1A+Yj62IB2yI+<1` z&h#^Q=%e&YZhL??Mh2yCpkWV><}{+S;U!+1L3r=(TdUMM0eND_h{_L05uPt>+{5UZ zwu@0&H195_`rUdbmCm%$<=8E>PrtJdHxXs*U;N&4Nz zzmC7&A9>xsKaSlvUL^QdJg|6xFX}|S<c9Uv#mIluT zs~X&@pI9bW8J0Wb${$dAP~P3QK3GZ*!@i!`L{?%DnmHi#ED^IDr?*UiH)}#bK6+$% zM3_xYl$P0AnCP_j(D>1Ey2$WEYdIt<>{)fR~z~0)gZ4+H7itBTHBoQ+AKeb;t1m1avOb`%$~Lx>CKi z?I1JqO9)k`t{LLL)8o?Kd;PL*Z@0$wzUfDq(Fxl-I`ywZ>2tt%DGggZlNlm z5Ngd0HbATo=K-HHE(r2fem68wBTzLl$eYh2ZFt`5G5M&>f(%dAIhC4QmK_qpQa#SZ3 zL)=RW)Xb%-Rt(8KDnt>x7?MH~qU%Qjb}oAuTC8qPMfV0bs&2uKDuDsICPjs%ue%RT zloI+ZVN_<yjt8ZpVl^ zX}kgQq(tM(FqV?CIq>;ebY35VOV}OKT!D2}8L%@Ra28?uzEh1W?tlZ&NJf^BRWyux zop>lE<^m9UM_}jx3X2XK7|Dl`bcWj*RsJ0X86nAbMT6TY(rmQO;+zD|7Qkj_4$jpG zw=U1kVBy?ASWOkfpisp~V!%){AUO>CAg++Dqj+~MU^ClSxj^A7l8^w`G{`2lukr?z#PPYxTi9e#9W zUd>Vl0s1m*DNYR5b2j*m>CGxB($P?!D!`5>XY)m}ix*JHOMt36ra#6G@LZzQPQ$l@ zmL42s)+Zj}e~B-aF{1%!P(Xpzh>hT$0yzrzR`c3M1AW2PVs9FJb;oT?H{C29&Bj!61KgX=nHMI~NWReWJURmG+n%7wg2 z{6d54s>aQ?I$#wiG$?;*sU=ph$*_M{ZaJp{nfA5Kt94G$bM)$D_A~ zfT}5PO)Psl9t|~#a;maJLn2kwTSGuqySFBmgCQO%J}SuIjz{k_0m+hx)6~r?tT&px z>ni6v9lNfo_|C-Y#Ja|Ts?&|GF||vS{7%QNt3G~bVpSjCnD*$ROpO)o-kJ6&+P>4V z>!joOEM_(DpaNp-B*C-Z4Q42`coeeJ{h53NLt;k<1R}f7`q8zB`yjhU#L3AKkQpEB z5|}@pLOOzK+#_LVFR3v9Y31WLm&I(HBWYVdOYC=+N?Ll_Y}Pv{?{ zG3ds~P=7}~Rn};Sl}2RLtH>N60q0I%2(n=AvVy_eZ2k+QDsgRe-ZYSOT{F^C(MArV z6PF^NUtQO=RwhBP7_eiq`A{-zKnSTdkZe#U!vQi3T3}MZG~Hn)x3g+)heUA^ZcfeZ zkU$dC5SAP!b)6;lOV5BAa>Ym-&NuvjIh5CV=+=dy5vZYcC4fQ z2vVhu6D@*heVsKWIBcomr$S;`KWw24^+mep(Ov;nv%(Du5k{M4T3AaZE|0|8h;sB7 zaQsU?wWdln6iK=lS{24Vg}`c~N~(yqn6QynRmIHWtqdqrunN*+EeO}ycm(u@Y7C+B zoR|Ee9Do^+#H^-*fD#nPfhXw9gs^tnb!~z65*UBgLS5Gc3rwYa1ngPF0v?_#f=UqW zrD)A4q)6F6_|tqdys!E^mlOJ8QxBVJv%8*s)-&t!99K@~xOP8U$%=q-dbUE^;z)=d*cGB4;vP&*kR1vYffctDxlV=n#k8d-qmXt3ggBUkci1hP$%>N$ z;uX38f&-BnH;IUxrfIY@0I-eOR5@c+mr&*{Bl&|MwDZ=`>j(-2fz^Caq+W%9_FeP^ zn=Pi5(r5{!@m<$OnvOuXFfz&frIAX785OxkG*6-Qn+XvsWHaHugq8Y@VK58yKsr8Y zaA5aZg9A1Z0p7LG2V!o700Mi*&Kx6*>K76+Ej>+R6kzgY<{9PQL}hGa{Gb3!t?Oh35taI$~~=Kmxz9cvRA zlVj*KT6MihEwkl-Vq@cF0I($kbP8`OLr*Z!%yj}%c8zGcou-{iipx57)1*~-a!&&e zeR_JTfhY}GnvZJi!WIw0vOEW24sj|1l_VsJJK7vcxbo647}sQt&juje~OLQ-8LO$F~sdx8pkDIVxv3$j9HC=F)D z1~VdU^hIZYi4!b_)biY})FYshi)e2VECV|pxJ9rGBe1(O%>**QMM=Su%!#x-S1L+* znLhiHqa_T5EV9Z20$_$lq4<;Nxf&)x)FyfF#96y$fWMhxDHB*F)4u&3) zEODbo=23Zc#DI7U4 zxK&B-@N6(gFpROP0|SZD#518qD*v>L)g4JiL???iL0&3FcwJngdNqy6Ez9#F2~niQ zq=sgWvXo(vKixR)xb=caB^S}NHn^M!D8$%aeTRKSJzW>cq@)NVLB&KA#+8Xu;g$w8 zUnQf2VmVqj8E!fyQJiq7jvFtJ!`Jms!P+i}AS*r9c>a%6-K4Z4Wd8;G>#HIy-97!B*s+DE* zR|6FUYGEa$OWUX+1P)$igBGJJvQSkZc*-bL;W{c(^``$E7!O+k)>@FmI($4qYD=WIZ<^JdzLDEbHR9vINaLJ6<<4$D=Hw4eHPKGF*GLR4QPu49OPx`yv|D8hE%tLVvmOX+^A7N)&}w+GNJIl9F05!b(Pz7NR3X zWcgJzo~j{2xFH$M)+y^=wfZ`TfB|Txs~*#6KH{=jErUiid{)hNFB!*d_sVxqZ()XP z?C2bw{tG|g>8IF1n2?~Nb3j-*(1?qlB+5zc;aJ>JhF7YR~zp;eWZaz%SGVR)ML zNkCn+W&{{5{1*nG<@f@lRXatj)7pD+fv%FlP}^aRE-oA>(by$5(a2tNf-1||=)%DP zx2pWoz~41kNu$Q(SOUjYLuCU-!2|1)Y2<@%KJvd@H81ZVaFQ|}sfb>e1%6JV1rxrA{ zp0+1(k$nLs9vI71NWCBKQ0KC{IHD>dP+oN)*;rr-tLb|jTIzp@?%OMEPIzDPT~TYSTYY|O=%kYnu*7dWPHJ3XP*!@>2+H+46Mr6vMwvE z28C9yhq!-o;cGHn^wiv#1>r8uv=0$Y+4kHmpE^sORTKfvw5zAB-+5J+NCiv zZGsBVJ*O_N%r1Qx!sEHI?E^Jy`rJrW%<(MS15xyIGn_ctT^fK69?$hGiBiBy#-s^| z%~L};;KKb<4d8$qmX}qsE}q# zfQdLeeQ&a2A|92r3OCVS9bhT~K0=5d1eG0QEn}D|md1_eZs=!2bmygm1KL?HMQp%& zi?%%1-yAiUCPDzLw-u%wP1Mib`kKUb>uW-?-vXtGyWp3)dNjsdwiP`?4*ARWXVr4* z->`ArgVE zR0XPcT4#g7m%&FoYkvXC~r+OrT?G*n9Nz5UVOl|L8W8c~!V8h9uH~N1Xj# zIl?(Q%A3+TNj~=mYe70&awYSFibou3s-J0oamz_(eyy{K@-+%t<9`cNGaHDMoAE+Yu&s6 zUDAxO0M-V%9So(WCp2jHdZA$KyP!*7wAyE&teo1=bpjQdSAF0$9!4~XAOybZHiT$! z5=S?K3(RJGJlIu63js~6*RRcfh8CCjbGUETYm zGVrtvPzA7SWG%L{PE z?n|u&XLH=UZ7JoHt4YrLyKVu@VcGIP^eaF;`RAm<0C8ZTcekrrD3wDP*5is-#8$&h z)Ff3J=0k|ui~&xzTQ99tlu~+wfa{hPTuqcFB)f~d*WGr@?7h-P*}~Cqy}O;`BHP%< zX%%o(2&gCtXuQjcw5PW^#xYS<12lzsQfe8{J;2ZyRY4t%_bZ*e5EEg$Ny*wAr3s?F zJ#l7W8te~xU%JVJyLF#E5S6!z zU=9eZ9+(I4(uspCrRZk|2VBy9wgW}H9$tFAvBpib&t5=*>yVcol|xQKpS^$`8ew1J zD4%U12=Lj1c_QJZYcUN`pB+dyidWD}jB7E5$dv;*VgwYz!={5yedR4i@*v-p4};TR znTpW*Y3ZH^@X8S)OJ=!pa6m2e>awTZmN9lw>sQXR2n4@!o<)FOS^860UfB*P0D9#S zaE-d*l^0N;QS6mRz>p&Q$_prSjI={LL03@qJu~T0qN0zn1FR+?!iaCzJ=0*3+n8-0 zY*7L`Mlk_F#G^LGx8>kPX^R_Z%dp!~aA?M3JXnm{glcByrm=B0!kE zx*WN+YkuNx*OmYJh*n9uKqw!=9Cy0~yint=$YUK0P*R=B@t%VqS=ynAqt%HiZBEEu z!dm8uxSILz9i2TN0w5C~Q2 z+C3?xx`?c1Ef`jeYTJeyq}o;_*KpU$fNY#SFR-yevDZGQ11RdWXNQ?& z(wi()9^3FhQ204K+uqp)7DrGuTFx@G8$IsJtMpvDBVgFKA@tO2H?$vIjzve6g4m{ip3(1!|AlsETrz>7&3>8_BTQQdKT~fUjUNZ?*DiefGGDbR%y13B8(e%ZKxA%5HjEKUb^^T!?L3sD-HpNgC$!Ki3itaNHohX@Qfd$3lG;qBL)T9%3#s}vo_Rm3<$XbyYZ z^~%XnX=3v6#JWz2r0n*pniE2iHG0!6;Dpq+#y9CbyR?@sQ#&To+;D?3$1}cBh8W4H z7-ov4ITUa|VeY`x#4v*^s7Ouw*cE_D zL-mYm7lUk=G<*;Fq?fcQ$fah?xamoTZ@-^NyP=U;R19Ed{!?_~s;&*l8BU~6`uz!; zlyG;y?;E5j7kyVLcHKpC#P2y}Crg#B?cjh*c6~H8kg93}Y$&t+3oD+92IEjoH%eRp zRFjPo69n}P%Yzo}Ce8*)`wE-nZKpJGHg!r9Ax^%MG$(>ZuW?w)p8n=3h_*Np=?!mj zBid_&pS{s9z38f0qx^|a!I@4a%Gt#v(lP+gHMe7@h_O>Wvkk{pY|ayIsKlKA zd}3^HnS)ENC!BnA@OWxg0I3-~CZ#v%1ZGMalk7HbYCf_7%Dl$82tBMfYSI+AFw^11 zb=?M?GKgcMd>uZKo^+0J2?%9Bkt_ZYZOjBq9vv=dky^mwrVzndqSv@Thm+LKG|kl$ z0_=`74Iyp+R3X=8xcl6?^mC;R7;4^D>J!^?i$?}fuh30ST;WRiSR-@vNWdvTsat{0 z8UB$#6QHaXTN}2h2#ceyQfSi z*({Y(?B1!76L9Wm_q8eyFMLs<{dEf$k9#^GkVQw^YHpmSe4uUFTy$MPX1K5h0L{cB zNWVbmr1FcI-kgIawFs()WVzVe^9+DIXVdm!$}VSU=g{&D?c^gc&r_6ftbPe zL%ZbT{4eASgnYg#AO%@TRuo~HFvOGIhN1=fe-YB9$+8Wg>f{0qIfy+l{7M%VTr~x4 z*o4rgjS$b*h)Kqb?VEP>;f(DzOk3hcJZ|spdjm5dMS~6Q)e(yNs-6n3RaVHNOS9Jrgz7ExGQ_zK36>!au4kqYc4^ar5XLYV+CFy zX>nhVc6JKbcdtDOxyF6WYcHTcyNWTlOKx94&=&IA3J6+;ulobJ@Ia2>po?Eiy&+oI ziTa!Ck851w1OuG4CrV6#CBN z!7h|mvQ>6~Mt8;$B!|=>VUgVwDgC)3LrM9w56sp4&fC4CPn1iW$5DaQ%A^1RJU;I>&?^!-@o#*J~an0V1Yt;(P6$*v&U_9W2wd z8%37WGC@00)C!4YYN8Kna7)pQ#MC!NoiN$WRa0CEOL;eH??2$O6;JD#)wnnK4? zsJy&jnTy)e#zt}OY6ZoAX<7%KLCXLHS z8HPSnPMN>L5LdofB3sd`MixY@p}7svdT)(#J02i~p}87Z2RL~eHMBSi=)8wYn?OgR zFsvE0Ui?_g16}}!=tEq1hb{Hws8l^6Yxapgt~k8|xoOidNpvT3E+30=bqnZ5f@tOI ze}vQO<}ARbUui$u&#YvQiN&48Hha;pRx*KK0F^~x_wk|=l|;4?UIzO6NjPqrh#G1l z2sV`%IpT$z2z1HAokT5k`~>Bb*?o>n&;WRnDMgde^LcE0Z z#WlfW5|FyDiSi3lMMD)FJAKB94cY}HOrvMStQ|z1 zZp_uEfVt)|1)Fo&IvRsRduh4>fLtn%Hz+zZ8L5#~%!90YggQeK z@2cqZLZel2XG8L62f3n^8J%%uLvqTX@O2i+55>d{kPZz^rZH5M%)xoG768{$1?x6= z?B%UALt3%&UJ+1h!3rKLGuhq! zFMV_4K)}l`I}9+F-|)-}?y1#cjz)4qRn_BVH&3}DIR2Q%j`K}BTy?Nf*u9j-#vCS! zGzat*i8(ekw>YYzNWK1~xs;Hp+qz{F*BTBvrg3$%V^jy*y1A6DZm!6I^mOrEz(2?*LuvD2)8*XsEvVwENToC z@(rWu-xzis>4PqE{tdA8UZvh}V{8~}GV;alaAOz80Ts*6O~ovh18!w@-g)ty2j6+| z97s3Lciu=ugh6Wj=D-&iebT-n9dO{|<+<~*%p1E*De~ktV9oIBYpxKnk@}z=u{&NW zD<+COFVng42KEjZTI>2Zc7)~2HV|H_)-1rhfb}|##?Q{J6+qm*lUTblk^ou?R4ZwF z+c!p^5s&f47NR#-Y;E=wQ2WMNlY7yz0q6xrK=B0^bJhor&VSYgj(6Y2u8(+I&%V2) zA;;sou@8f7V|CD;SHXg9jmx0A)+gpERVAZ}w0-UCTW{g&!=p>FzW0_O8**W4Sfqh| z-!1QRG`GbL4(NGgUGv17d*8Z)k`ZGIaa|niHFuHcd1LGLT%;j0Zpsz`ZcW1QjLi%c z(D^TR%U^nL#cfwTiFKE`6zO)v`Au-KAfJI)ExbOT#c^g&ifh6%Yj6CcbT?+^D zR=<5Qyvhmy)djzyB#d{ikk;_n*?Uo+{l30(b;Qlw*h0K@AU21y18#-wTQSdLqF9g_p|2oZ>{-`F z2znVIwY}<-=VXxHz;czsfx+DE2CkhJ|oqQvf3qLy9OwIyF&1s~@H^ z2Rub*E}p}Edk8W1Ryxsj4Z!VfFxfek$iK^Hi?=zg$|p`wNY7>Idu~}#Zp{RQ2N<;V zg#OeAPLSlNOm!U`aG&(RUZlpB8h{&+0JQrid$QZa{UfR&;v3#=nme}Ex!-soDj|k6 zYoxy^3vlJ$c{6#~uxpDY5;!I5tKQ^rfP(eqJS><2`fQ?3FzmbQnz`%3Z4a}}A{mDE z%CeBB-qg0piu!1%J)VF{IU^dP3k0EbBw!`eLT+vz0F*r#;RBG8>8~l8Mm&*8$o4ze z2Mie8s`5k5V_h{$*$I%fFy!-96XOg|N5U>eu#v(cjaFS>TG8x_yXMulVvdfCT|BQt z;Wy$1LtUH;5;h1a$PV_=8M7;9J_pf1AhDkwz$`CUO<^HF773erLS#?dE+3B9 zv&a3Y!1sLDZ{qV^zXczLjUFFTni@r#N2E{S1*8>39)hD@VL))jp#ynRrRVv6vohNE z8~i7qn1@g0)B1k13JKqD(#ZGyruXupx9Q7c7&tm)H-QUe3vbhxY96jQRd>gd>o7V1 zTiMbvqq5$PTN|(Tj3@>QuWg5Sj3a zOFLZLTOKJ)T)xW05na;qeC+nT)a4(ku?3+TDdg9{{6(s$m}ZkqEvxK46R@t)`M$i|I3Ktp7V z#i_Q?2}>e;2YPlLtBX!Zde94ny%^)oBz?qi+NB@|;#>o(@<&e6@_@#LmvUc=QO(x)?UKO+S`&->Bk z#oZf2ndGb+(slGR){MgLYAgLMO9ibr?nKPdCt;EyPu;)QF-C}x$Ao*Hw=czo=j|)8 z&fAy5)fpgohX+7spWp)R&?!Dr7MB%*Ii#}K^H#_qj~5?uN#LJ_Epl72Co5Du6UYx^ z5aL0OUN^BdK{bLis-^`;XpgiPwpD@jH0$~9qa?DgZSid4p$>oul;nB=M_L`)xq*c1 z(Wp6uC)u$$JTnc7O0RXER_mWx^saZXN33m@v>3tx-gC%gzL6pT)tDn+j{|-zL7iTQ7WdCke@QMLt$pj$#R?pG z(>EO&5NoG%9t}EDnpQ}oq1ipzV4-gFgeNZgJXHp32Dau1nB@(se&o;ps4Y@DeE=+d zq%EUV4+Mw0J&vH1>sB{x+PPibfIR^jbu6Gp+CNY54~ACXTUiM%eWZ-8nf4Mt?#A#8 zhhC?1dUHoQ_*?-Y-8`NOqYsv~C^On~Gy_HZo}-z79>3BE#e>zL)rfwN>IsEye(*L0 zAz_hjsMzfAjEB@M8KRvJ6gW~^$_7nUM{d&3ae>iyaGrKWz~)3&o@NKS`>HkDI{lrF zUU(PY6MNIU@*eP!JG9CMxI?Rej=2BDnK5*8FFnR3d~8mp{y4T@#!g}h5Cvm)EGa;Q ztzR-KFA<4*GkK(>-(=s8sEQr6a58|jgs#H!9Z2VB0c8kcZAe-$TI(+g)(d7j{er)Y zhet@iZNQ2X0(yWFGJAFkR4by8kD4IT9C_hV1fWu;Le8j!^dO-j8KAbk1iTCxpeI=| zh!9{UVUhM97&(n#BvIwEud-a-FFX|RPKZ7ntlLu<=^8sh+BidZ+5UCnzC2zcvGdn@oiCbP!_yMZHsTv|l?m+B~l$=*JfW1JeQz11%OcQtLbo zi-ZL#axxV2?GrT6n~BzF0`7YO>s-S3yLIEUu`Ys4V0SMHyFex$NGUOm;@Kv%Z$^F< zP}M#tVuw-H9-(Hhk~5TmCK0x$bQ8arU3RX~WNTLS0uRsnJGH{6+_`monI;873@e#b z+NdIf#@pTH@>+I#Z6P*=Ux=i_1)_>w3zTZgUqhVJY6-$QunNUL&`IeRtMKMKWpw@GwFxeNiDv>((zYP5-J1S(+aO6$>A?-MQ zFQClh_&A7{6rmz=r{tXYDTNG_pXL9DLtLhp<6zT?X{zO@tT%k~vu$FDypXGZ235zntBEl4bMUMfLv?y}| zq1%G>Lt-)$;;Jp0jtQQyD0_wY7G)u-?-HS^le8#HSDgD6W$9dmn6@iz2bHt|JmreY zG>@BlA0(hlabMpB3eA_%dR`;YA8O;>y3A_BZVn_FQC|i90{Nx@8FusXEu_@)h^J+b zj8LTW1X4L3<-`Zr^@>p3Ie194VLItST%4nw?L$g@6zxe6jZ8uu?E{{F1e&JV-P_>y ztOQtYP$}#*SyY|f^#+7$pdApLi-ui0AcTB)FVie=xZFm(<#$~(3u{UUw=4G2m6Q;} z|I(8z#Id?Uq=HN`RTtB{Ax+rCZ5zj_h_GRG7VG;tXjqA^9FGU~JwFEleXUdi==vZP zFY>a|CP!>7+z{e!aSAG>0LL#*i&zofJF}f_5f`h1Swu|!Iu{w5YaE>d%frInhz{19AFIrQ* z#hq<|u_37WlR?K!G7)61tffAWOa|nFNd5@TPZNkh0hccHStz@Qq&yRHVftj-;>RE0Z zA*iX!E0%}ejS#G*|0WCxlf2$Rg}}5a?ab4x3MJWI@?V_PRuB*KIN#WQNy)qS9B z3ppx$L;uwh@P>lzoeL_&u`zi=KgDNnoMo^++;10=1SU77>zttVr5Xd{GYl8h;F zZKsK4XqBsgr^(+AjB5bm=1gdK}_Et1wlr1 z6AM^GNk+0Mv!ZVW(|CExj+pyyl8 zLY-SPU44Deb0CpeZ7JmiG(rR2V^8=QWyW+N^QD2*7X+w6`qz4Io4HTqTFcmeBN z7~Ld&xWv6)Nhk8eJ5Ms~aNTs{1(c~i-=HdXA?-Msp<2pqI_5_WZCb~?3^i$O3GaMP zVxN9(U4E^rQC+0-{2yAcfykpn&aDSxl;YVm!#g3}rra}X@a{wAs9{byaCI-SMwtd< z-bQ$5LJ>1Zd-@-)KXR0hw+_zJ0{w?a)iqilZ@qwZDnPehX}3z61oUvZg_ntb^ikkH zJo@fXQ@Zs6%AD6n)^^P;i;-z|P~elIBWts!5;5YdQqq|PS`bfMt#j8P> zC08(w>^XONqwPeCOlrg<{mlt?WDPBHJ=Dma{E)ZbM&?=#xut33PQ+t8kL*E(kk4A5 zcr;t%T43Y_taDf(z-UAvuMHl_uCp{Sq|frm+AQVnr;+sm+u*c!;!$#kqiW;@lsPy? z&gLKTX5G=y!v`K4c@rJUYXuTz(8yyk^3rap9 z1u6%3Ucfq;|4)x>JLLX5FQ82B|I;lqz#w;Sogt8HhK+bn{GV$6=Lp6idv8cY82$Ct zhcV#ad!{39Jb(3Jlx*KX%b^+e2{by6z1J&UlnX+Abr95wuef~CT*t$ChHD z6Psi7y$(QGV8HhtrFS@Fzj^^>j+w8w>OGDuodmz$b_`Tb{rHjI#^k>g@0Xr0FIW0e zrddmue*2b!cli>Q#;x-~YP(rm#T!Z3lp&nu^q{x<;(k0&7++ur{^q8Zp#zJd|6@F=;I?m8yxmZf%og*D8X# zCN->8*t}W=h2*kpOp70si*pAkF_&LwTKwP^uH0G{Rme&E@E29itrwYSy$G^kX|Thj z>s8b_w~+@X{6)=k8x__HKML4X01<8qdGJG^xQ6=TFEfTDEB>+~VJKAyLuL;{$&PD_ z0qjV>=62Rut({t#1@F|Dr<|9%l=A|R6>w3be3zxLav6M)D_7*iXO2NQmVzK$6sLeS ziCHU1Oab=*K-bSJ0EOY&Cg8_k`QDW8O@8C9TqeqAK^DBr4ASB+8i$)IC1PU(tqV4I zuoZvNAb6y&Gsi|1wZmB=!BH%N+Ci}*S&DqL2X|?K#P~~8uz>=@by6c-uLTlO12u7-B#Xt50AHbBY;GNDuQDKM>5c)aHono*D4%e_=}Xas&q7d&@DAZ zm|C@fp@P4xXRW%9jQESz;IG^}#~Uc{&7x{TJ^V1bmL+T8hw-&6>w_O+spTYy(gEKR z!fU%~HDO8opf&g_5gfF&T0uezH7R4gaQgk@u!52C0Y4S#OZ=dgm0A&*Dj2;w1u9#q ztk+cXfXT}R5V}$!){3;bQZ0}f@PpP=svH89YE1>zzwWr$t=ML*(iRU*n#y*0sA;c%){HZZ{P7tCKlRhg<%X1yxx z;Yx*!j=y9q{FSQa$tIO5X;!I*rUC_30S<9gfCqZeIId78nFr;NBGokks#1-r zh_p&|owcpy*>(7->c*{0*?AUM&9h68ndMcBl#Tddu4+-*SPcW6YeUsYu#_pmDrJsE z{3R8t91QrosZ$pv^@fn9ys@T2b0I^k6s!2FI*J9=@@QzhBlQAzTGrosuQQYq9}n211~&1 zuv9)-j?&*4G05~Xozi9PLv*^`x>)X{dl4>;>nwG)vC*-tV@e-RGlNogd+-!$%l2Sp zCEY6>K`rQ9uEK@vx{Sp^8F%+B57L<@|NfADT&zF-div{=)+#)I2Ftzlv(9Q4SFPh~ zOMl^n;L36;n_3yH4q{c*a&A2hK&)@&dOuoDr&s&!)_Ju2I7p|ZI;sxQY8#J+4w_Pt z&WC9AT;mT1sKIF|`Y<@%HqH29+x+|Wa+E=HRl7TxRwmB$Gwn>HluD`6@48WZu{8Ll zl%melxlBEJwA?EV(DdK0R~ykq9Ts7>wV%!mRN7vtlp4ZriwA3>hD!cRHl1mgKwuD~ zQ_5yqC0pOl)7Ewe#QO$9#|ZZ7-AQM9j~>OPQYpXj=uu}Sc-ngO$k6iQ^jq-5k~7j& z>8#{3ot1n#o&MHXL1~Is9SOsqQm~DS^{_WKjD8RwyG~NJKg6fWsNYJ3LQq@>{->qF zMt&`?YM2OK&*zG)SdJB2?vK@eC6~_hk$ycNWFI~1n_^VWaKT?AdV9Ew=U>!on#<9L z&glyNtmIBXq?Hv{9ke9%_iF9$JNUnnN`yz#%Sr#xUETOG)=Q<-_LFB@|9Vtf`8D(S z)9Nq(`=9?&-Xbri`B*89!?D^h~@S2gxxrDD8}omtF}p zL1m&6Is!t&AC~5JMuI>=4Z~GdGz#Gf-O?R&l9g#6at5 zyxm$UDXzuh1OqgJ``U6x4~Z5AN(%!e0|Arit8s9*QtEx^C&$5Z{}CS1O_xgW8hi8z zIiAK~_4c#^*H9n|V}Z-ChZ_y$TZPF5W4Y)m#I7d%?et*vFhx7nmM zoICyAP)!Q5Yn$J{-&hH8qeuKiJLhWc`ebW2+1fS85>)rU(%R-UYUCiES8~Ba^Z<35 zQ>e4~D7Tr%b8?%c4`>w>Hc6I-C00`rYrRm&uajDMbZia(?je#P)$+~bl4Qx;!y+QA zSC(&n`z?pLMr1CaN4adk$$;!rbOd#bmokF#?nnB^*Z}oKB_t$b$0cNH``8J_9U~Zz zL@@3`Fjgl8W7TD_1ACz52Zyqj+r5?2U=^0;L5vr(zkg5R7z0D(!iK2-EcN6`YRd%H zhlA#`!76`NQvZ_h!D=(^4?6Yh=+Pthy^1^dqS5}vGSZ}fDU}}Qo}pCS>Uuf- z4ZBl)ON&wmZw1nar*DYig^&au$Vz&kX^F#wijSpCP6=_8t$Hyp8R_mLi#I& z^ym+ zJwv+BC#4U(^_)+P@`!Q@FR-ST@b6}1yC^}4uOfRqgGmR8)F#Uh7-_&7oYjp=(zhpBh z4@@E8N2Y=_&B36{SpN3;aiL(mQVWMN383FG^Gj0ZRG-)ZmTzWIUpkKt7I$T&@O1ol zP(m^oZQAf(>wU1y$Tv*GA2c#O~KCb)s8@+9A0rlc?m+^nSd$Ry@hcUd5CQ z+bR^~7Azx-N?nS$lxUaQt5BoC)|p=hsK9C;uOAMU(IaU+b3@zBDS6N+9iG6t7@aS- z)6Cm2^-}{v54uw0L+&)w_z;{zBCByBgAd^W6iJ2%<2FmXiPD-B;HBn=>?ySICKMof z6+x{r)c7*ur__Y*-d@EH6;=StOE9>mG!XS&{%nSNL5UJ9(|`2n7tA7$-qb!cPnpicg9#`x%CUq1%_JoY1ZHHeNJd4j z8^|+J0DD-J^`7q6j4IT_>LNx3jP%>DLHSE(Vv&F->ju?%ocsPgetN??+>~Nv_`S=V zNqH*%*%^w!?Ky*8BSim|N^eaG%s^W?GiBeg;j&)KX3n?z`3| zzq+^XSM$_e+9NGNjb&8`%pYzZ=T1rZEiB1y9zPZyuh{xzQSEJ4J+wh8CoKO0bIEc= zhgc~p@dl!Bml8jf65(Jk;`{)d$?ycEYpE-Enj*LV@=0~;RkA=mV4i$jeWI4Xpcs~v zSGKdCcDC8!qADMkuF%y|+Aqgomt)PTw>2oGT*`Bd9%0(eT%(lR(y=M!`swZVHA*@5 zm!sF|-|(iuvm;EIqtq6Djz3(h!jJrNS>^~8GTq)wXZ9@EW4G@Eks2~zPSV@^=&6x1 z1?*!eBlYSK_ae3~2Fv>#!VFNoh=lFZ-s)#uH?xc@gwiYR@je;3$Zhzz)vtcwziFiY z?ez&tOT>T->CC5z&_o&|1agWyOz)figGoYU%^}#zj5dn4?L#vjRB4=btw1^ShebAX z2(t!B_}VYy8OqR_(d$G}dd9Yey-pVP8q{l>CfUgxWP{*nL0~2t2L=(?q?^b`0x`vp z?MdO!G2%@CivI?sP|MsXy$x}{JSYt)aIrE}<52a0=qXU{lz`2l&Jj%)3d~}8sJj30 zKz}fSshsJ8Qk4F&J#xzByA!=kAIkRCAr!5{?!@-hVb^S5ttv}G=?=SC+g@-ZqM@Sn zX)G9n2OL~F8VeS2Q7XHgu)bi&d!(5?QSq@w8}YSYs*D-Y3D5m+NA3melFyCjfQ`ghJW@OzJ$F?Sc&2FhQDYH zbJG)FTEi`%tn46VY1YO56aHe?CTmT$2PEq5`S>pD?)hrixhwVe!JGIlpO@O^^P+S} z9z^It={eLYe!VZ9BUGj`ZjcrCSI9(I<~ z=YBpZL?*geN?1}>jMJ2e!{1Lz69r>Mw13+i%#qpr~JCmJ)9R)>4X znbJz|wX5HGHI`{dWx^2@T!-2j^fNgtJ_oB9x>dZbwrnT>1N1k}x4)=gW5k8QSG6UT z#v%Urc8S{XF_hgZ{6Blky_M88?nzrZi@kGm3lOJ4Z@kczbr@A3KMB7%=hmITVKPQP*A&{ z!kCcFZhZfaRRGNj1*oL*I}x%b`CxNF9$0rGbaD>5BFf6a?1aF)h60$V0pv3|QGP%=94xyM^xLz4efaqCQW9w@y{%jDM+St1=qm(@{s`CVe-(Yyp+ z>!s7r(52YC@p$;9FB2lC0%5_Pewuw2Z8=NtyILmoYcAz6$jQviU@lkQqlx0ao;W+P z>|U9nu+;nh9V8rNIuMA$2Jg`mA09pZEp_@N^Q-&5%tY@?-%^jbKB!-JX(o8e@AiP7 zzwz^upRiNlleemEr@V#r;Jq7uOVNAmoVlUh^W)y@K8e!L95sGD$qe3;l;qRSdsJ}s z**{nQ{p*L1r{LK1w;$ghpFX*COwsa7bj5Vu(>U@g$m5XLC29Yb7g(~2=h#JCDsIV7 zKG;&i1~vlyk#jj?$tfeYv?=Cq$^gt@dL8~tc6)lUxvVNam(#z2{>@vofZ;^7 zHLNSSrW>%PTe_xOx~9up)8(z{^44^DYr4FGF0Y`=Gh|rT<*n=T)^&O7y1b%}FY5TB zjxU;cjjyQj9K1mu1=ZaDV|OZ{A#aopC;$3C`eXueB> z35PjssHY}{4I^-ICBzYnu-iWW&;R{@m=}i(Ybk2?$&7%!4d5RUHhEfS+`3j@tJe+O z^H~~FZ0eBVxm>qgI-qWZusW_dz3h~BP6)L6YLX~D7Z93Asa9je5RYWRSvGpzD7};@ z6A-rBr4ya^9qxf^RI!ITxa0PA>9u5)9dCfVA$3stB4Mhq7lZ3|srO!LK~?3Dx2K** z;h^-&)P|0OrMe_(_5WzL29fv@mSP?Bx)I_k*wz6z>Pu}MC=holOMMAZ*bb|umVg~D zP};4p(P4CfW2rFlmCoO5mGE~_-QPlkeJ&bo!lUoGQ)kVfg7kzTPfbB~_l?$?CXMuQ z|8;!?>y3P>9Y_Y2u+)cTEw?S{R^Smb5QNoB-JR3c50=A!E)NN5x8di)g07> z=>;4DmxFKd)z&XL+>YDdLJ(TV-#(v*#!Q2{CnotGC;9cPvg5$w1Cw7z(YS>scwPjs zzmS}{?Dy~dMHb!M2FsKnBhi-{w&xnFKwR3X0jW|6+UQP9`kBURe1%@g*xcL~MPEM! zgJ9ppb1*=q3}qWXXl;tcFxg=rPgL<2sR=d{zqg*sUsgHTfH6e6lhyPPO%MaRFjC}$ zv@i=SV17k(Gr4oP9Ivco;@^;Pf(mPjap-Q5)y2e*AOG-L(MA;12^vm8%;iZEX#z>t zmHHr+i~~b5(9ZDEAHqw&gO|Qe=cSAHlf3lxzsXCz-%1^{A)e?6wk{9VUVh=-!C&k% zJ94onK@@DZGlC>7fpibCUu+BTSj-WM%y#kqVP+#jL7cPYZId^0*=PNgm8}GuplYn= z*kF*va7Tf46MKpthic*YC%fjw_4s=E1-3irL$KHCT zs?v+`$m13+Uo8EBV2$TQSl|^{;N^4{XlNEtb62K2$q|`aUvY_>X)=G*IWhiG$G%u2 z`lN(p$qI7ub>g0k66WwXa&A$nr_7RCX<=H1i61x44to9NIK2Ypccs>cf6hRbq_~%T zfWW6unEW?LCWGv(9iLy#iwjp-Pemn_n1=8_8sXC?$okv=`j6nfkcn+}^DryKm@O{i zXWjS9>I*JqvIoT-+&0bMboWy3B$=~J#jG{4J+lm}i!r$`L&L$ckQUZES}_}?JG)%c zc4sOtz11d;iQ-C(=HOYgOM0ItQwY%iJ#y zaC1d#w9-CJZ!MpFxH&EHkI9-LfVCqG|4XTrWCoa$OW#&P@-yuLS=X1~c?(*1an_cEG~j90#Q$P{SHB^Ndx-twL8vO(=ro+Ns zUHfT)In?Eb5@CfdJZc1k2I5q+K@zXU#t91RSkrCo$C{Q|zU?w8^CDvsTn-3wL z-wC|IW=BieDaHJEuQjk83W^UqXm|`Dd$vc>C|xEQeN>qff1n7R>*}0- z8aib9nd6q#onZ`H2lpyvoM*neP>E)<)!QxpB24%FRBO~LN%c*UNW6a}sq(8J)!R>rW6c@V1|^hwp>R<|lX zpvN{iL^4LtgAH#V5iJtn)Qoo7fjUO%YbAkeUH;pbO+k1kUqOCQD{+9)bqo z>>86kJG;hmsfGS7fwfk9VH@*aOZA&fC6~oWrRB-=H`@#LcWO-Non)%{8WIYn(>rYm z3j;Ry=FZT}!2G<(##%#TMI>`$2ge&sqs6B5{QQXd3%CW#mxaC?joA@Tjl;|IW#pWn zR4VB1C6#M(dzs12S05(VawH>18Tv!Ymp^KF?(U;`z^oD`V>S?7q^c*Ub}GEm zAq2xJcFzR@S1h#cDjnD|Y1s4A%93gKC(j6)}~|J*o?{f2|>L~GF};b~Wb z=EJpQ8uO_>G&@5P*T32U)4~29J{!m%|H*6+hSCrr1B&F7GDRn1+iSg96kAK!>9AJK z=LCUmSybPrd;f0D@BOV8^1J)U-oG@v_Y0qoQSj{#_Iult{T^zMbG@#i-djp5OE!#f z=&7Q3xfN+JO^g7$b2M2-XN)i3mF^kT*iYV;!5L8VYi zTGrktN!<(NJ=>^}We71^aqLiF#Uj`_6vKlc;c%Vhop2uU-de=jfN%aVZ9EQ29i;Xc zwmTod5-Mz@`gRWThQ>AkhH={Dr`0>>*Oig!gduFl#`GIw>dlU+_n9%#Jy(^pPd4V$ zG1^EsoF8Few4t5Qgs7J=+YT5q=**}gOg4yfQ4sKCdQGAqchc{^_4^0 z8@<71G=buUoyR$lGlfLP(rsnv=z1re_LXBy9cO)X!a86YVhmCH3 zh=k2}XmVDShYE-bMW19u%oBoVrK+4dYUQwA>J_Rb6;Y>xUu9amgg#yht78-M)(tqq zf%otsEbSrsE~Y7$4x1h=7Wqu3v@$#9dAtjNF{q?v{V{+(2TZ(RmY9{0-`U+_-rUqG zl>M^}4!I#72*Bxh>%v2>dQ2});tNdESJ1CUZ(T)+V(~eEE1u9#H&eE^a#x)tztw5} zjVr5OM^?*_^UP^&JM*l=+-Z$#O}KOf^V8Me{Yya5H>K@2bDDiC;apO%{HBypz_bP^ zQmJxd;WwZ8=G-i>&(BwE&KI)qUscsO9@;qUSP)%3tTW(Yo;2EYdBQjh^AVqWscJpK z=ABg{)QWecD-t0bBK?@EMl*M4h!z!U1x(o}Wpb~0Z?ABS+?L3t2M1|Ys62*{-NDKD z%wZ{u5D^qayxorrSljoJcZb%d8=K$fH)-uR7qx!6g=8It>raX;FYo-FPSqW36K{i3 zwZ3)k(eiJ@IqgLb$~mGD_v0g!1Bi8+5NZCo{iSPk`d8@ma6X+LzhLVwFHiPY_E#pj zINARui~O5J(PVjfHL7cKFBTh<(dlF`IV;S>kV zE`S-inCyxYoUuE40)a=`^vR1A58v;JC}(_GGImIBY%|dQVhVj$yXfaA5s2YGG7_yE zK`U_?MlQgn9q6QC25VI6+jN^xo{|;#_I>o^y{SP$$rOPR96B^)*&8BqxQ6jzKb1EZs!A-c#?s>L=SiS$2`5k_SADP2s&<9-` zFHbpR2E-+M#&UN551+y|uH7f$=8AQ1ESAj`IE`DkSUb57fu)NA{^Y(oH6NG+mgYW$ zVhJmFWF+Q2B<6fRiD|rWI^L{hP}EKm6EmQwnWSayg`!<(%^psXtI-+6%ASs*;}`Ng z2T2|f zIQCt9o6)gS;MOo6NSSu09_aWMs;!F1qqGE2gtHf^^Bble{g?#vP3(vR!eh?3%eV0x zNe!IF8DC>szCdl@oWQ;&C?zH;k#x{}TVALCrE>&v8DpK~8)j>=SW*v8V>Cd?Xj>X> zSbC{U9+71BL!ywxaYz6WqrGT30!kBGPyHL#G zPgn{G8sYh>Rl^x0vv`^m_qcMrqT44CAH^{Zr+Ij9mOlBy7u&_>jyVrUK3PS#hB)ov z;+H!M`VX5jFPL8jdy4sGEE-JMgy#=@7fryPTzC;EBql1#I-81B1vXjHbC|+%yqnMx zlC3o3L*-iJTkts)7n`LKT~OXFi6}rdK24y$(7L{UyY0OhKUtMXr)ALR7dF?k+4a^J zkum<2<~0YATetq=?82Cy{}1ku`SbYhXZFX*giT=HMh9yenCah6B^Fy^r#qe9>5@(8 zbwm6t%10OWzz7`)lK)Cs?6n#0{F8=4kd!HX3tDEUq;*>Z$6Ko;$YL_tJw=p8(z1lJ zlYe#Rrtpn8o|&S~WCG>B6?7VXmi+bWtTBT+`%DynR<@R!GH8HVYX+98)-L=^^2JAv zN+eVnA&NYT9Bm2GaAI}2U0fQxneM#GX$m+#q^)eHkM58-LNu53A?8ppr@l9>jE>7@ zPs{+yr%=$wFB9DkHAI*}^e{zAzN$OLPPQG!6Qenw>G*fKhMaaI1EZvwo=s9vEl2_+ z`kD4;2y0=^#%Qi*8u!3Y; zYfNFQ+luP5OGRCI`9A(l&VI?Vxq6XXHj@1MRfFIZ<6>*wF~%l+)x4xqT~OAeKIYHY zS1&TE=C>lM@yqwsdfLyc7yf+w#QKS0V{|ybpF8j4kBars-j%Q-5giqx){A24AlfU~ z0^+pmUp+S-b^N=|gC@S{`vfoPHm^Pm2z)BnR}MyQk10e)N<2tG)5I^p;kUFaPJF%d z-d2}D+2X+4+G>ZrpxT1vFlbqBw*=a|2>e-Jj6)A>N!QKY43LNv(P#~aDb8f$=vhl1 z^<14nBT+PmY7@fYKH*&_8Gys--r4_z}#l@*$&>Nq=Lq7RQJ3o;ARSeja4@MWHkDjyN;~#YEmL6{7KB&KU?o%XR2UUnw zn^(nds6r2_LVxeT<}RM?7I#Zj^&A#UAKbg!q88m=SM4(5q^Isch56P@L(E-hMh~h@ ze?v3 zB{mrW79jc)3V?lq@Aj(#9zf@o)!!@I%jF8Oj+~I`B-6K(?2+pvVMS%;d*}Z4p+n z;@nlt>L%=EfWoa?GK;2U0a-q#(H6oZ|2bs!kxne%S^tb3qMiVgM+2~8$Q*jGWWYw> zJ6_|DZ;(6RuuAQUq_<|lmwDm1FD*F1_Q9h>y*N#UZ4bud z=``QQdxMA_A(LIVfhF1XV#0ctoy=w+naMs#@)GPSsW)VtgOQoC$4S{^D|-lI=&v((o62C41;(iNaEON?C8n4)04-@HoZ zS}z$?c>@ZTH$cK1SZ_e9^XOa#x(==C2AxbZDc(Ay{cpji?F>@M^WsLlYNlvIcZ64& zuFl|8@G+CvB$Lk|m!OveozUxzm~o^znXDoaX_Jm%DC=9x%9fl`m-v)dxY8D$gE&ol zzU!s&T|M}&i&?(w;wC=9@kQ`J(NOZr1l9AjcI$Sac5asx-vTMAc7nSf<{85$r)Q%p z=pq|bITJWHTWe>Uf?Hm(L5cL@+DZ7l^w*D5wz`2Lnop5u*$d_^B%_a1w>esYwS6wf z#o~Zr-G&iK_>>4qn0!}E4~R_&XA%P>LZ}3emj*|SOQW4xIPTm8#~b)9(FIMiXJrQ& zwg|B@ak>Jp!D%!Ls66@XC3jOn4p%lT%D# zKvTP9GahKwBl2rH*T0=u?zqv#4D>5@3QCJbptLoV9xlMpPAfyjVB_P~A(kJdPxX|NdyF;bV#hr*!ybQ|V?V>&teQ~Ak znFB_*Q~K&QmCe>ws>q4FRH4kenEeFh2N+FcUgD3{k6Yh@bB0CJ9gQA~)s>dVe9X6Z z%JJ>x;*JPh+6RuNLNt0(VI);XWrvRwYc$DbttM|wMDko-FBdNZu6}$Ne~XC~{Y}2B zWby(jX`)<`y5F7k+<20g_@g*>cUWgNc;UJcZ}Wy3h*rOrg>2DDVFCjzo0)XOqsjCo z&gO(q*FIDiqgH&8j-#HV4_PFvXNXMwAj%*iZ;M5Z7!cRR+07#BAGisB+#$Jpk-eEvxr7N<{;X6YzT9bwCxeaH=ev@=P844 zcsGkOCivxwrKJqnLLQG}E>H53MYwuCi28YkXMV1A*foAVk-2r@*Cm2r)_3>1;@9he zUnhHpUwoAb}o9#On{a8E~Vo3;hmDRUN+wiAn!U(HDTQ4D6Ejf}Zie zvq6sFMnGhFmo%ImG*EoaH+Ni3PqE>^kfzwF;dR)$)L328x0nE_$^Hp6qiwynC)R{d!HR(Ooir`*mzllXYLbZVV70H?};gvXroF-kOJ@TQ?yhS67onI$@BkRj4I=Qn=? zOAEKRmZ%Ru*gUacMK9*h)1Ol;RS?Q9yfWR0*A+RN=71CuX!|Le5_L-=?59X(aJ)_N zBD%9B8UQ#=f&E1eX@55-6I62$BVFe*U5YXN`GTklrS0YQN-q_ZKh1aYGyUqpB4zrf zvkUhXJdFFy$((+2Af%sLx|(6|@D2f0f?CjoHC2Zg9g3$PsPV>%oYlfWRtvUEcb0pE z0t_)_&{_sTsDz9I5a>2yMEiR;#AY$cI;72W?HJkvt9cDNSSivRuNW?e;L)v8#pB+U+_0n9SNzevn=v`8@^zt!U=L7wV`39Ga=Kia7#0qBJ`LkZ{oR(^3% z{&ra>yLtO&i4)rCje4PvURYAPw6ob|=4^Ixz?m!w0Va_O0iZ59q8VzK)XPq5%>OX{ zs7tF(3Ei?zNS4dx^XT}Y)Q-H%Y2v(m%$iH4&ZdljZKq-0x*eOhFM`-lN!?G$m78O; zHJOLjI@XUAQYO+#%d6=y;Q6Pd#!vLuMj<;Y+gk_>erua;~zPwdgWc$HUzD zG1E+ZX%Nyn>3GQ_OhAb%Sj3sfFSwXt<&+TZ?p>5vNBIPcatx+PFho2a+8vA2LIKo*UN--V%_-uk}rUjX%tv*TCv(V%6jq zXO_j|`%T;&*xU;fpe6_%U6}YS>BB{iwti0KmN`Tn8_CxxYA3!7CYEr~JK-30*@E?j z)?I{iluBd{QpYV{o5-zgMF^W#adj|3T z&&GNVVLji?XFZ?$BSK=}k_26hemKorT)g{FGXhMyC~ksK>AZM)ken=_6{ab;QMX{i z?U{Mnm2mGtx`8@Iv0UEWdOcs(yDPDbVmHoK#iXdR4MVZr@;Vt`8;<8ugD=X5u|cvI zJ4Dfzq0>bWX?kzA`C=@5pLb!}B zMKmiR+0vv0n}pZ#8{ZB{v0l{_?b3a5QGGsT4tf~Lnl2$Tua-$OSNgOQ?|S=g+Y*(N zkb2Jvsb__xm89N?`eCo~)mm1JMQBz$|Bk|Am0Y$k2Qkz}zxH%CUryCjc& z%K0)Lqijg9(sdk(l8lJUx^_j{E-3sia*XHrNbdgUMx^?08j^(&41=+m5SiV@$%Ju9 zD9)WLqXBp@-94IJjUK0pA^ZnB`9K-yw zd-a1a6<3x|g#G0%uFFV%mz87HmtlS5Ltc#s8kC=d^jY!6Pqv4^phw@$?jhf$o5Eh9 z)+FE@vHWnN9E>^*v*M@?JA`J83Uz{a`#)`bjP$6Wi%xXUix~(Mh+!-jY`%I!A!)kU zA@zGS=#S5MY@%5&G_hvxbk$U|Q|tDR>_HNoX6IbLD$`Ue?M|!P9Jbu!QCfeyb2KJ2 zAsPBu{;MPie5yYK;%kJzuHf-H@5dYZ+0@T%{oK*dUHzE-hyAg7oFEDBX})zrZQa%p zp(#lbGiDyx{J~{dL&YR??Ei=#=doAQAbNc(tw9Yu8rdAIo&%~vFitT;)1=(3fItmQ-~hv`|taOuj8$Uf9&sH>Z+0b z%Z)V*i=)?k`+D#9uMfV#=jhM(@z>-mQ0VLE6<@f6piqAF-mWQl?f(49pHd-u>b~w1 z=(13LMjBap`6kv+q5Mj@w#oM`?qgef^hZ}Z`@eK;e_uT-KPB5YDzVS~e~6lYRBoPc zD4?9=dO_P;i+D3GKb+_m(?(e@j_-30I(%)GX zYUZHKr!u7vRQ1o6zQ4csc<0gENBm6-?km8)%6|7gdzVAucLUP5FAPXOx<4-%7dJb6 zaDU#pKR@%Q1i$gq7s`{TdcGT?Y^;3$_QmtVw~xL%Bw+V@=NYJ3d}I^r+dDEz*~y^@9Ux9@$_RqPd+1nVu`1?SXZmYeR~SpA)=7_D2G z8h(7AT-71$TT1e+V>teON{oXD8J^7?8=VZ<-wOZ*2%q|AgQ$1dWjX^?{3D5gZT^vB?2?Qrhr_NP z#8(Th?1tILxPb1yI^83pa2&XdnGqgNl6iBzVeV90vM`I(oUu3=W)76YoJxeZIU{p@ z$u>+-3k%f(Ljpg7mLgpF<~a<%7jvCEaB?~_3&&wwCg@>G3SHi4MjW)71kK1Z-$ZlF zGT+E7)1%=Jwi=tP#^2_z#$Tqi62JWqW7k~mk<%S*-r*9-huFfUlP~rYjS*-xbCfHW zkHH;qMiDY=a{vzE+!pLczq@vbu*(8gI+q@lAFrD(r zn|JKXL$1A~l9}#xIcZ9CbPj);a$z~u6dNr8bId@0C-9fA{|i zeqrIy>ptg*rpYWl~9j^lq1(=i90^u=N$j}-VpT+ zME!LZQGdM&DKjRDidmgHbeq}_3nV5m5$sKyRi}CYqc==hFb0~kCC}rZEc0#@C#Q8* zcZ}quC-)u9L?LZZnatUIXZqxBN8_X`I|tKRi429>$xx`B9EIY|(3ykE3?hQQB+D%U z-(ddUT^CxaT4DNQ9J7bTW8H-slDwXQa&9p~QmoK`y&&!~1<0?SBuLnivIyP-K}d+x0~<0lUV|#nVL?E`V>Fv4_ab`+2|FGM{ceG)TowV3zkqhA8JC z%HYG?v)|~0xpzjtP6>|#Kf3T+&AEFfF<4Xdk^a~)!JHV`fr2CGDX8JRJZD`(iD@j4 zP{++C4x&zwoV+@%Q}XJldGhKFZ_@W*nFUr@BopL5eaa&@Fr(?2Lv7Fjy~OD%Wvi{46VXxjqSpX$@Wy22LEqqekxod?5d5K;BF?F zX6%Tju3bjcvbubI&rQ#1f9g}V8`M72jgU6o4a+Dj(9CDs4QA9Fjc(=JBtkSKKEP`hs>6tZyum9pA>jk@x zzu2r8{Y=wxyJyLbws7kWCpxE!8a*7CB1+XKUCK1QygW)|_6x)+`rL?(A)9J7K>UUQ z&ueld6`1qf{$gu0;}jKlBkj$MlsmonB)hVC&Dux3Z3of{(vZr;JJ!oK*0 zAe(K>Eb>Y6-_!BZ-)H7mt?({0$;}emqs$dWSs&;s01WbnZq)@NPz-$`&5{fR8=&U$ zm0J{kVUi>H>~u=_AzTk1_O`{dWClE3?m;%az==B!T|?@VlfG~^DpjmZGEeD;z+Rsx z*91+iy|)%+Vf3Lo_z*;d@oyoXaLw2SqVYtX`Ru~?KFY#-+y(Z6jCxlxz`cwyR+LeD z;`+b^K)UWJdZ};;ym_CP%g+^?Qa8xNqF_~JwGhw#Q4Ny!zy3!htryXUzg*TjoM?@Z z4pUM9$jXL3{=M4#LA?Ns;r5?sdarT9-UR>$=<}EaC_KQC~_kXTgSHcuGWkpq_+W>J;Oa^0X)b z0jpx7`LGWxXc#Z}uwzU#IpqY|=V|TorMvzHW{lkpOG{%Kb!AI_gVZ%Pi$%f`KvMYT z>k+7}qbopQ4Wwd^78Pe+ z8zy5n3!%j(HlCgV@O^U}9fN`Cv72Ssog?dfnzJjWPgx>yd|^x&Hdk}-W$K61z)kr3 z>S7DMD1oRHds~#%B7r1_0M8$aipX@o!%bBhss97N#ZBS))?6f!9ynI*q%>#g)SqR? zMsrS~IsI9hlN>`nS`5yqOMt`ezsa4tU${$m=FVK7KirLbUNt;4(#sC@rC1nGfmi zVwpe&xNW;W(ah$;ak6W3g}Z+=oSiH6@0TeLhT%;EvcWi6gddU^foVIgp>z?6$+t6` zH4wO-`&G{2O`;^=0z9I{f!G*K#m(l}k1@NQ_ryS9mFaSsx!=58tT&g>)DGM;g2j0s z19aIQ&B@;n`Ku-F@~kF#)G^;%w@a_dJ(onz9K}K!Jdq8LeF-N7;~$bjbBfbYQa%lB z7|J{TBh)|VyGW53k)a$1ewl+h=6t9ef!i}YkWXqrgSMdouIy1`J{tU%M}z2;piIO` zqUEbysNmJ^*2bN?{DI`165U9kAe^Fb;%c|bz2b}eg@0fA>ekoA(l_O3Wwlb>iXU$O zYwzIq!#_SvuK!~hdHGqlLtt*=$x`bRt}iMk3x+5_rvy*RPWf8tAm%2EYU2y&=&(pz zi^nEoPp7f6Bdo;G%)!TDCDc2@y}-C@VdxYK+2MGnG2gmH*L2?(F4P{p^VTA}gI|A` z^aFTxLo1l2VAx2RFvGJL6v;8)xjM}6$>QQ~@44AT?$pz>+_71n-!tZg&D9{oU{h>3 zGi-PZHZ*6kq4@=f=cP#={&QsAS0>n3pcdTT6Tl0jdhu0sCFrM=LhJK z$Sr^d&68V}Jq1ZWPB{k@aU2q{ia8m+Y1DeX7RGxJs3ehC^^?h3X)8_+Qd1M@R(YS( z!m(yhUF~vMxvE+OCE-VKvoHKXnDmm63KHWcxGB*Ihm(2ZXohice$Y71k@nzD&ft!- zI3?#|M`SFPLLz=lJkgWT?Z|`YYLc#^ZYHj?T_B=6*VAy)zb_P5%B2O=-b9+#g`|cY z*m*PFEU38Tvl|X3nRE|V6Qkreq&(~b*?DV*EQcUkeb$hro?1Kvv+tCBv^_MlbmFYZYO1QM%*dfpfG}vi%JEyv~QC4~4#D-~*&Tc$Ul#ldmxRu-i?bYeS zuVm(EWX86EY%Kibp4PY<4T-0VFl3GWo;_dgJzp$S?lKEabrahpnJKD)Pf|E?F%c4M z(_?elw*d)bc`t+tg0YCbs=|hU8-Ml7sK+Hv8s=8yNcQiWoWMsgl8!qS-cgsLfdK_DF z6P|HI^Vc2%YhdPv=Qv1 z_Hgb#5&9}wXR>~XC2x_Y3A}AIqPtxfjt2c;T2d(_-e6=PW^wYJfPFGd?Po|`KajdE z63k(R!17sYmuWO1p)-v-s$i{p`uC+~wUd0dT?M>PhU-D?#+>b4CWoIF57;yYH@Y`n zyi~f*EY$xpVgp+K17c&PZX!0P#x=iz*c{Dr&04vH?ww92{k=``T-W&1JqEzEl6GFV_axIku!t;mK`NMGK!WyFul_JaAor zP;0(}M9w=RH(Q^?16MjB+Fv{mCon@4+3gUv2tyS)aj@jh5%1#F5za#X#Mnnso?sS^GcvSs zCpRRkQx|ewdFSk2dL>sKH3K(9^jsOVGHQYaZXyIA;ZA;TC$VTNQq$*J@Wfnqej!{+ zk8uIp;}h0xIEB@XaGgN7uI3Z2UvDN{CsTy$>TeRR5UW76%YsKiQFJ$;qg|gTSDOUO zm`}{mwuxa7IrFDNJc-4-eGZMRQP54|`|dPBJJ#_X!@biv1npSI_dw7v?;vIh+2+wQ zj*if>lPOvz+bN9{6TZ`Qb!aJ{AZgId&g*v8NzG9PSvxtnDR6FI^mOjMdxY1WPs!ev z(6C;qj>=mmM7Ne4|I@+T)a@)O%XZjccEYToy;bMULrj5v=_>@?di9U`V$xR;<^bY3 zNMjcAP_^v&H-4j~&fJ*%_8(EV&!CH_8_*R_-7vp_x`8tw#@e=|KdDgvBofx3{gy$F z`x6a8_k6A<@}9ZW?br8MF3(ao8}i#g-9+YQs9T3gq8opxS2u1jKzh7W>CqyQ+%SOZOqzm zrigB2w*(xV(?}0c>M#vO%(G{hTUlz3HS3UDTXHI6o85o=X>b&GA!Y}ZOO7~p)u0OL z=#{+%Gp%yIsBgB5Z*}n~-AqebXYyP1ms|GeUFJONBtvX%Fk;vemn!eS1f}%e)Bhh{ zz$>-Ceq&VO0;=$2K2>NfWjx}X^Ia+v9WA9dRkS9X#ESAaKs<~ea6uPlXxzMc{p2q# zNxvNZY0A(j*f==Nx0YaISXv6^rqz||CCm&a(MuS0PbIL~?F(^Kxg*Cihr)qo zm*Y&LusX1)FKv2WGCddbr|0BD+{a-t8Z5bx8OOC@)br1s;X8uZH=p#_%&s0|xD@Sv zaJkxp{;3jPacR#e>MTL{Z~c1_+I$JAZbSP;V((s0_Wa|$YmT0{D%LEg?GZ+k{bvzl zK36aP!bE!_>WQg{sLoHb!bMF|Cb9*YI9YRjo*0rjGpo3G2o&XMWm)pu^)O6fhbas} z+ZHs37%das#9aNd7r;_c;j*x8yZW=AwQui! z;J3o>-8*+SH`BS+-G&|kv_A(kyBoS(Qr^{_ zZTh1cvO%+$DBPN>3Vm#dw*%r`&LUn=P%rGH2bSkFvtD*}do?&L<#-g2MZjL=4W+#5g(WLA-|)F#jLW#(g8rvPW5I zoVGU!YFrMDf3>N5fa=SK41)6AxL55xL=U!1oX#HBoU-6x`g!*IplOOiyF{zBI`x-n zlbyCqqt>G$f=`VC6H&{c;Rl1Ur0vpIn=Z_2`0~}}qV8fz`^KwEI)ki5xu+h-JsEm0 z(j#egY(VssXDmI#K3NwDh331aq^>*=G~M2WOo{@@mb0ME z!wn$1S(9QK;NhRhHGY@#$V;M-gRq#mb@)Yv3t0OPWS~~+CK>26TP~L@m*=y~<@sm( zjcN!(nxyxjQy7ScfnOg|o(@o+N~_qHHVB*d5ldL;(7{^Y(wxD5$G!Lrnn@XTScWMD z9jY|h@$tzd{BjL}@)>8h?Guw@huZWn<@`6cL#9+(wZ70n4MB``x=+%>D(od&+fxJC zV?g$57Gx3|@9sK>o=1Mu%3bFBI!R0~^ZheP%UR+u zlCcfsX8G)!VOQ)7x&tQ)?U#8WhXbZEJhHVpyH4@+4x8OKH%B3(qr(ydxq|NfdDbVV zfl*LP)YNjMny$oc=#V%B=ZAAXBsLyN=_DmFSy;dR^DJYrDskN_->E?7v7yz3w9Jxn zcem&e#5scpmJcf>e?HBQLzbJV4~gF&ZE$WdZpAuzUn_ty1xf3=I@7t-79xA+rLP*E z(`F(a1h$%HE)n|f3bE*P^=0V1`Mx-}2m}<>KB0r;@_*0tTu9r;Tuk*k&5Igj9-LVF;(AGIfpvurpHw_(zGX?fkgPQ}s zC%r5oydv`EPiST^-QCd-ni;=1WYdU#MsHdZnNxDhDgB8)`_SKTIh}#My`uAl-KsIC zhJj>}C)EL=?kK;c-!1hljuRj#um~VUj!eiNwUMWxK z<~$wpG~-9A2eya5!0>z<5Uf`eqY}};F^q)Xm2n%e;J=~$Z!)>!gWmZt+U7)2XSduz zvcVG>7P$`@2?9xa;nrkbt^6sNvY`3Yqp<*$MA6;HMmo1>-kP7p?r!x}x)1$%=53bW z85MpG75*@v3cvW^Zlk=g+bG?ce=I9|L{%78bCgG>)%6K2Fy)N*wtr8kO(8n-Nr*K& zC#}&jA(f7Z{qt7QRtyIb=&R1w=^4ye2kVw6)1RC;;?!5<#c6f_S{sl0F2kWu$sNkx z_(U8aISk>!q4$I6rH!gy>(+XW*5O&LGoazeKJUD)LgRzg$DH0yeHFA0i67Oiohby> zGix*5k6uAL9AULB-WG;A0T``%@gZ{8Y+mg8?PKmWn-}4lP4~d@V5+i>d~GjpsBOco z{+FRT_n=!lUuCxkxfD2rN;ZdZSEa(epzxQ74E9}XbdE;@S0{zdP!>3dv%(?&G;w4A z-`P#H>Dk%P>DIb%7K_?#2rRFip8yJoE%w`(E%cilnhYRAyJ8Q;nMEi>5W_0)a^E4 zyDxOm!2Z||?y~0eC{pIjckE=38 zxLhDKgaS%^+=#m~iSOgaOxmmXJ3N;1h2OuT_@1liy|3_9Qt?3=&&j8~pUwWbk;!KK z(11W_54ZNmPoLg-d{78mrfURZHE#B?P90%)X`#=G+lz(rz#@71e$Xey@FI??AGO|m z2RdiBU8#*b2$1d^Og8v)8zBpFB}7W=2ix{&Kij4K{gu+E&FkV{${d=2+8_I#RjhNq zTk6$h?_aCLDw2a0AN`^ zq$zg}zzIyx2oP-@-&@`Ocj;YbMy+=KnCulx8u_Q|m8kIb_9D^cs=$Ei_gtAjLj49Q zasnV?&K;0L^1qo{_Y8#OD3RmSY>uxdd)K~>YjOy*)bVwu75Y@LY2Yh4zMj{Qy{~8sUS2TGmo{)+M!%0*%nxAqDI$}1dfWByO1JQpr+ z@Au^cMLwff%iokHSex;&Y{Ai@>Ds8NIwuV$kMeZ#WN*=R6a^SdCx@NeHdea3nxamN zfQ;S49`PUJubIE)YUNhEzfVBErHEmBfwlu&DwM|t}n%w+NQ;^{Q zbUCM5ys6ftM_Pi`A1ZVIg(9x6P$}S5BH*H%k|fn?7@c(wZ4tM}A3t8@#sy6SET69x zEU0|-_W916uOJfwb5dWgf7m%YOl$p2*Rqv_sj@za8*Pjb4vF9@#Sg(grc@`}tTlL; z6im8f={FV+^&g5@rlmu&FQ<<;R*|%1Rs5B1{Eg}|z)X9Ww3zw&w|eS2sQ`U(fsh!r zuHZVkxVQjcL|PoZ-@Mi<)5o85ws{H&rOg^d@zE3=3b@5>4S-X>+m7({M8vQ-$x=$f zF@|bVdQdL>ONq(&vcU9vuD+Q{HEjZ_v$s-V8(cp8m&F3zTPovu_WK_bzvU+j&2<<8 zs3KFDY=2K$o|(%4U$&;{o@8dhhWy{wpG-p@8D@GFbZNgBclQYH?&Bmmx5-TI$I$Xz*UU2)0l97jK5 zS+sPl81RD&ImeRgq(iMMb;v7kd_`FY^EXatVZCaV(sF&%&H8dyiA1}5ee24CD|Jvv z^N&B9-!+`gKm2Td7j`t8|0i@s$v9^E^K{&^5W?9K-CPT)v)10q_BZ9dGK;P{Px4N5@}Gn*3rv4)Lx1|5iDVJRw-0C@}rfljarp3$4)HmWC1!t zJ3l_1N1Zx-K;tVajj$+rwqtz~-4$+v|KI_YRis)Ra{6YQge_pV8>C;vSX$IqbjYEZ z#NlVk`UDNYRI7c;0R)EV@zIGSO4*VS=!k#``7%irw1(lGo{|V z7->#`l5F>oZ^GZEP;eiN84@W=KiIyMl%LvbGuft~=sTMLlE5%n8npIC%P6y0hLr-= zcvESsh3&OU4&uI+8K4V~NBw_}O0IlBCiiwDT&K38JS-eGW%0+=mJB>M9`|i(IM-2g zDK6CZ8qHSwsM9^|^*;=Tqw&S%$Ad|IuU1#`apzCcNj|^0BDt|wYc!R5qU?k5`NgG@ zn|rN4Pfq(hwe}jVBh_*+Y43HEI5?ObC6!U?%r$a#Fge~kIqeOUwX=sj-M4=*`E##z z+CMv(ob0t|i4p^AyGt#N&WS2Nr}U}1LI&%JtJL?V#}^w>|7i&4`_U$$My`6Zjb685L=&@1J*2>|b`2-&xO82W* zCkvHOkF-K&-#O3H-Gm~hey-wp?Y8ehLJx7GQ6Ob(;sScLrjRPsv+yIbp0Ig_M3GzF ziJBPFu`ykz8zK7tAku^u4_fhe)Pel)5dX{3@R0k(b?+V{BD(+KVTk;KOs?O1+&?|z zCU)#`k_>~^S(gcF9@z{yyfSakSD$IV}wQJSc>>Wl}eNGAns4>?#ENS9t&t;K>n zZ-j$_iW8=8CChR8EkajIiIvNID!FLi7U1#3pH8N7r)*_DGn6Sg(9A26`JNOs;_28| zW3#8qO?`I7OjgxV$OQou92R(ir37waIv4syoS>OdbP5*>k}EzL43PbPUDWR1X$*5oD5Sd~^X&)cqOC7V?%$}=XCx5H+t#~p{-+>_#XmTOlM-W%JH8MYVz zElv$zuUT*slVBD?DIC63I>~7(F-07}oEi2PYe^tvOnD9k_ps5Pp5P>VMNqmn?B$x9 z4ELXJ5&U8&=T^pm%eh7FGy*c;$d_Ua@S}uaFLswgbTtuS5i7iHh2W4|4zhlQ>CDLi z>`+3kROmZ<0xXod!UDmC-2srTY}l#|8pr>`HmIJ*>?0TxnuxQk^eeH z88SKk_d?R3b`f{H-W}awcpeYBaptPl@3U5Q#+Ug4`L(q$ zg$@Hh=^4x}4kFAc1}RA1cN|Dqv4q4%nX=I74M);?aw*Vz6xjZ#A@b?-O6g^XBGV!_KvKkntuW@aj9tpN+*R$(33B_s0WS}3u>(HYW2(4;kTk_4gye)S`1aaM8lA5u zUEB08B)YvhK3mEqqMX_Z$q8ZV{>!i?>jT zReW8|RmE*SnW~bF+z-L=6&hSFApmu%E?Yrqzf76u%jMwb(J(h71g~~fCH1$mMKW!{ zVTxB%x#cK|^o}ypHoF^d@TlS%&Kp}` zk4D(#4fZw^i#(|T<)5~8L%IZGER#?4>lm)dp2`E6>Spb&rVudAmssJJ``$7!xHI~y z-Mp+Mk_2yElx0K|0#PSkLNvH|^+qb)JnGOcl~Bs_IF}}^CpRG9cisMW>_TiNvn7j6 z**Uud_?!+sd*!TJXeH&+oLNvv%5q@=^i+#Qn}<~|1FJcG8qVpH?@2Nh>EaC&!POsb zbXhW+X)*yjQu2^B3+X31Ce8)5J3l&L%XQUS+-(;Tkz#OTanhWVj0r8Q7l0zm@#dh= z@lfbwpa3CGQj?BieLOQ?)3BLLY=s>#$qVvkmjmq)tZ+6x?C`-HWV`3j3%T9IPKoKPDy(9dS7(_@ zz)feNI^u@m3fogO*bXS?x5fY*cZkLMqfvwW%Jg6`!UAEMFEtClq#3!+U}1qhxCutj z3D2ZMZ*B*~h%MJfa*j_B*LsrOld*~Q8?mhd80g%v6Ye^P1?)7~J9u6|6-MBaD2kzMVb zF1dJ(=ArX$?%f5i8u7;Z?R&THZ{EFqFZ!VtZ{CeAxtlb4dKPcojZT;Fg^8|~;(Kdr z(QhB(dmGUYA8@U@AN~3vE-V+Ky8Lpa?Ol!D^2il;Tx@rF@5#Yxbf|akxO=ic-dtPT zkosqh=ciBau1jkE1i^Hl`D=Ik7nQ|lx0=I+3+_>51@uPTBsdr@jQR`k zNDX)0Vy{11=7Pme1Ci!4ZfZQLb$!`~@xt2W{k4T6Sr%#wmT5sD+ZN8`b!6v^o}F=* ztua;L-dzQS>*(=r{6lT|ayR<5=5ENQm;FKXe0N^lnN%L|VkiMlDh_yE>m9Y6OyJ29 z!F)4Hk~jXOfUOHB1wwgA{O*_svqZv0V;Q4T>1IYnsc6Fab|K4Kdw$(j0>k7YI%-ow z36F7&uTd9rv!@S`p-Za=LoHr~qY-TefzIJlR9N9Gr@C}9@pX}e5fr`cz!ZA%kg^4? zz1+VJ^k8Ah6fLS?q!D2PH#4e%g$WOBWDIf50FE<4=V5&3&c*|xJa)F?J9jtNAK-zs z1=Uv>nW#;dDfVyOy?tkW12bH*Z(zmiC}OeLxwXEwv02*M!bhr1HhU|}B?>PpmYT(f z=s*yOd6R?;l}&V~l(1u_LpfQBTk%7$?#g+v6<1bPI1ubErAslRYFfU1pSHJK%NrY& z*7DsuTN`(IxqF9~2lw2|gL{=9YS&TgU8VvZAU$|n<&BN$jNQ0@>lTZP>p{b!7jd--oXVW7afnSf z?s*l}%pC*V1VYkc|scg3=LRnuys<7Q{`9U<7LP=A%Zn6&qo&flDajk4QbC zh;u>u?L#sr%>~2)tx|K#=G@Qm^IeJhtO7YH`3k!6(2C(kV;Rw zTj*TZh;xcOcXe7!hiY@V7bdV%0uu9pR3uaBn`2PCIbAa|cdiRI%H<9)o+(UhQBTCK z;!aYwZrE4%*vB01#C4AtAXPw&xs@iDeE8J~aUS3;ue7WW zS5G9Gx77k9$#Lbr8jf_p5aQx-la1zr<#){p_}fcpV0sNgbTOCEz1KDrb^#grdg@hQ z3he#%;2i|lF{QUbGgtW^7g{_h`XawF7G*&X9|N zD}{}f^_8_kG;RzxD!8$T52!3*;oh^SlO?o(E^+WKB=+7BtMAd9$IqTsULwco|J>_X z=8Gl7=kJm$A9j{Jmo+vn>rc3>{w$Z(PYZnFut}eWl~3{zzz86^)Whz0q-V2+9_k67 zfTLGLJL+6k3VI$Bz5`xMhi#M!%7HUo|7cJ70uXdv}%JBX1#@hO0``xkM`}X^w z5FHZ|zpJqL#??ou$$MpeZS6YJA*$b#RY~Pjqd#a>5KY-F5qfa$;W}F*lyZ|$fXE8&Kx>`l!>Mob`?-f1b6DWDRgeD2L2h%Cz$u)CisdQ?pa^*UD@h;SBOB-3t~MpC&KZ zTN(F$_AU;x(!^@W?x8nJ7DDQK1F(e;nHE3bRI3|4*w}E^F`=}HRArF>>wq-dr1iL1 zO(tjW5_w>n4A;sIJQ`e~?w2gqEUcUF*!pZ^VK)q^rE3HrGIin*?>A0bcl%S3C%9E4 zP?BM%C#`q?GhOu?-xoXUcF99{Nl{@*hl~5eWf-W zc8+>dbX{V(VdL>EM51v*e%9_BjR#;VIlS;1r4RUWy_D4{tc+1Pe!5troVnu-yjkXx7-G!$|<` zSP=2j2QKCCzL~ChM_$=P)Io{DbGad_tT{wfuuy|AQeVU@93(TFmKUqhV7waCG@a7c z8mue08N}NPF*1ukFFXQ18?7unMHkd+O6KUgx-jmY^gzx9^@dn}l?Bcm2^P%(aI-Vi z{Qj>&*th?;K%6i0KL}&r@ZSb9c7hoI2U@hJ>9Cj~(k=W&WBOz+TPwA*GcC$g4W6Td zvreW?6YkuFTlfmgI2Gn}7QvqNB-|Dkw18RTxZ4y#s(G7uXp&oh+H^DmRt}o7O99v-Y#uhKfcT}pY@Z!?Tw0jniQ z=ub<*=s^UJtGvR{-Ev0EgXY}b{_P~igsX52ESG=>;hNnA{>k4JH_FO9``BPK5Zo+m z-maizxFy*`wcyMcs_w&m`%pVQn@WFR>Hog@AfL{aajK|0Rn6TEOFl}I!-<3q#d(Ym zr459^KzzyGJ+8ZTS0pY!vM;VMB-ksT5=oY2-|omyCzrR<34)DZMw-TFyU`=Ny&|=a zbB4Qag+JRxo!2+hI<67%5x5`i=3)eFKT7VpK!1Z=$`xexnU<<9@JBriHDG02fC?^X?2S>uCK+b7cHTLXFYpTA29J(7 zwi13IO~r_Jq=Ne~Stx!#Dw8wP#% zy{!hlUCeI$?YM8)2Av)?eU zrj_uZZ{{gZ`42i;Z2(Q)&i}pzUbHCIvB=9I)Vvi@L@8M z+r90N8^;ztarkhfLhzsuBMi9@Yg7MxXs1F)u6P{xm#rLb$mf0acmTq zhNUMnE*#rX5Ui{#dd&-6D+(5&ym^ok#t+3>!U$?V%~+)F?+ojvxG0?5YOD< zH{OBkW4d$IqOoHr+Hs9=cO1rEa{7oG@rUBLqW7rBXFh zN0Mx+(o^3Y(MH!PWx{@(6|5hWB%1Xc(t1F7l{F3#d3)AhUqVdDE>hkiqRAb*h zMdS2XIf^xSW4t}=C1D$C*MV>>{8Y3N`t3o@i17iRUGZ_|oc>B#qjr>xG%VAV26wZL zT3q-epG2zAp3`Qc&QgfQZKOt)G#qj7M;*&P?WX*{V+U+)M$sFEiZg=OJqO6MOdsYy3&CS!_%uwFrP( z0<0l6Gnz%(t;|&J(6SLHU8(n*SANC>$oI4>n%t^cvUcH z9FMbIidYM<0t6En1|}y>0WFw=1>r}gmUUS|s2WM%N)d=x3kIoc)eDvlsFiOdMUtm< z%z<=V709#}8C~Z*puZR7wM+I%z=n3q=|ZcwI=*#lyfQqlA>nvU=!5)QzM^VLok;Ue zef2ALoObQGhnW^Zj#^cXR+*7eTY|C-5h};U_BNLhir$p7i~W0FS)e(p&|8CWbs_X` zt=iaXheg&v2j1RmV1~N*p{NJcd$MU7qd+Z=%P}pKEjg^Cv8|9_vn!$Wi56O2JeB3U z@OJx#kE}4m9`uwUKS^L39Yhc}4yxtrikOP2N;G4k6sb%` z!YEy>T%c-$HCW;J-x}qXQ0+4YdduH>;iu*KX#>X!yOOWTk+ zLvhUP#`sI7Bs7D9kVH?>B4`8)OC3`oVUM#-mU-9^AHKEP+QF(VJ`2XG9Bw0ns0XAw zilKCC(UTb0<28l5SMOhvGstub|5qV8vhC)jte9UujK_fpJSi8)%Y1uMj$bZgX;zNg z%TK;)M@R9?^7^%*Un7Hl-pad!X^3EH2hMipdDI~|ia&_Lxit|+#Z0B;>-XOBwLf+y z?;vkOrmf);_T+1v%pZut7@CH{s(33di#^$46WwOR=BU6fPXn(^ks0D(VYK7dnIoY&%11RjwIsbeXBpy3gbV&-6LdGy9fw&Sz0A zZ1x#ielbHzIC5@<>BiWnEqnahUK`)!Wcu13>6h1Ss)!PEXDxbxyTqvf#sn*=`+C@n z3h5DPA zND1kS&LDpt9gn8au~DiX`2fTEhVTW=QTa&*Z5!nmICHNM#Hsis z8ZV;`BmY@hB_sZ{m(RfAMtsDn_AFb>VKktZV^~Vd+H~JBj@8pZ8MoqEwZxm*f}q`E z*2}t&HjtUq)?V!(C0OK030rM1bX?ZA0ihRuo|$4y|J)uC@>jzi5s#Vc2A`7#+i68e z>WqM-%&r4>TRV9pL7H2)gfP&ct@x~3qUI{}#ThF#FjdNKWZF(Xr46ttiB&R65^!w6 z3-uivyWI{hbMBqdSBiwsNLF+V?`8U*hM0$2w;;8!#igiin7YHMc~A7M+2;4o{d@X- zfI%#O+PC?=yJjzU+kD?#yRDbawFmZ6b1(Mgwq?8Btl!xm-)`B!IMrpO&lHl>8!?nUwc^C#}pPR1GEG~7VTor>Shr%%$ea3(44ChwR6|9n#N|& z0WI(x+wdj*@c`nJ5aRv)i$dw4NV#=ndvUEY4mDLQDV>AwsV<%1vD=MA0;YEyu@AMq z@j>9uxT?~m`a!AdL5*dxz`J=@5XXvHFSqYM;P=jhbpw38sh7IVNMl{k4Q!G5)r8z> z0AhYMQ+L4`_x3IQZyW6U{4{G+_ zx*EKsVwsAkWt=>GiZMp8aq&phygS(dZt}1?TU;TSfw{mq2^+CgB zHRwEOSm~ykebBOEEfuS+saVY#ty!bB+m>=$d1|+nzh>>%92jfXjoKZ{WWcQ5bIr2i0Qn$X;trzu84WYiNxvo1f)NgBo>ehb! z&RspzZV(6nZn z)=aY@-MY8wi@>>ul2dTuK8#ivbHzX|MsQ;+ul^M_B}(R_B~bGzHj*7zOVkY?`xE8qm6Ax z8`}@8-~+?!w!y0{7-6s7q`~#IP3DAOjfy{H=9gCZWeEHNLw;#$9inT$_Vtb?ZXKel zU+WNm=)*c|$bRWH&(_j?tK)%wH}3$%^?U2q+`V-bxaZoww`nhTRQlc>R>Jzdd-icbyU$ep1gcv-FYVe1-Td&;{Y2=T4(Fp5CJNTo{)op0? zO`$h0f~&2m^}5#ddi}2Tx^4rl-xoydTD9x-nt`ca6D;dBb*pZJYHT!ARbx}NH#XJN zhD}|gX`^j4Rd1syTw8CnRAZxMbu~msc@cn`4a?kYseH3-=+M+2xv{p!Ncbh!#+p^R zvDT)R4MLw#mEW);n`;|dul%7r+b*Ezmyy=)-c^y>T}>vxRLn0G*Y2uD zeyOT{91|#X6?Q;SG#Wo9&8AhwFeuj>4B}Y+5?fm+5=k<{85b$ z>OhEJmsyLB7j>a#gq}Z4Y^|oH%dbk*wA}bryS3XYUAt`sw5QZ+bwQCo>QJo?y6_7` z`L&8fiE0p7e(Nn&R2RJYrJI0T@B&<9YS-5((02R>f0WcRROJtCx7!c&z5O7^i@eJ4 zA`6mL)&}CuIU=uN5_Rt`hWuvBT0>BdD zg@lpI97TVe!%2=GwzrqpE9?H|G|s2(a9ngpq_Y@lMZ2`R!7;Hx>&A;WTAgn3tW>cV z^8w<`v+>D!rB*yDZI3JMsy(#hqska2y^%SQ9~%?pE@X!)w8teLmBlyulwfMxs#cv^OeF7)~Lrn6)+Ir$+ZP)-g?duJBHoF3;TjsOV<$CsNEs8_{-yYK)tI-H!u@%`rlKtx-Ju8xcln7+&1p;gGbK zFTeWgtC#jKdKtZ3PyV^Im(Oqf=Q7;*`MJLPhVt!Z-y$_{?OT4{*4JO^aoxS&Q2l4R zWhGu>Kpz)+_V4A(!B<}mqQT3Tr|G}J-~5-B%sjdJ_4`$?M}?<NHY#m_hzas}O;joaIW*M-VD zE@w&Nz591KM1>N|`bM#P_mW~88+fr5289YofsIh?{>IwocHyE>c^1b!Q*WJx`n=$z zS?=6<<5_bJ_f6>f+WlGs$ILTw3sZSK;_>xCGq+@Jb< zpN04!+zcD2<5C<7MZe0=u%_DzYOSp$s7kF>`qfD{RCQ+e;X_8ch*=hroL2lJK1Eip z>jQ7qafI9JwhpR1;ImuUwzv4KRUvns;FzAAy;KEnRl!SF!AoDkV^#2y3V4VM>zusF z6*HUEL^6x0P=R{soc-8DZhU^+iY)g)=X9U#bwQ_a-`aOAJk>s^=CyLxdAbvHKkkz%VbnaKOH#$HjrB^ItwL6H<(OoY%OBCL| zAK|>#9c(S#x&`RD?JLG&n89`l!WO{M?T}61zaJrrBF7>@4fAEzK{5tPyU`Cla#w%o zZFL9K^Fxm={eV|(w?p^i?f@xcGN=o=tp3_#RxjuQxi2uv7UduI7}>?(pvuP>?7el1 z6oC?;lB}dKtHYjwtrzo+menS%vyPq`bb`qE&L zWPeF^I`%RHj?+P0e2TLtRRNC5k9fk;pXhxrE~>B)Z;&RRcVh~~?|a*)gRl@QKSn?H zX|DQXf9s{7^kW|={n$T<&%1Oxekmvg=$|U;LG-v5{h~qrqCsguFd;(fU-y1V2J~Sq z{$*gZRxb0Ptj3a*S!JyO44hJHW8$GY_CtiSb4_lePvmn!}` zMy%+1hTydyJ=4WJzruRHM=ohBOgDb!oJz}O9<1tHw{rE;2a0K&vz5YdcC(ez2KCw4 ztv-763tp*n%UXvFR9-%pQcy$h}g+KTb758%wScpKsJ(o@vBH(V>N<+AI zG1)ZJC9WHDAs;HIz3XfA<6)m!xb%Wb&4@IX{Q(AyL9Pv_=+#llr}%YWGEwy0FvUTF z`^!+ceV9=Wd66`Tg2JuYe1g5t=s8|REi{3s(WaA(pC|TiLhZ;h8WDWb3aUW*RxDsK zP?r4IavP#I==q`7tLS#|%$w=)8i+*WqJAfnU$|V<+g77=$tW(qL(DEgccRBkYDA`* zR_`lG4`GiI9^QuQY)Pg^JSTO|pqs7ipfhh@95n0+#v&S_sXrWPJc`jIoe5G$CTKPY z#MnTXlkyshzyOJmhL!}}!Kp4mkf&Mkf9zqTHWn9yGCMIOY4~U+iQwP0G#!B(`zv>@ z2^Fx;&(MaS9b}cW4fcWHW7JDP>?dc|0)|C|&Q|G_afEe=FmA{DVugA*keCJzgF*Rd z;Vi0LEg4Or&yH-UZ4QJhswNULM89!lR*GD5PR*F`*%6K^nRws74JDh``jJLFN{k*cm&#~Vz9Q}B~Kd4F@VWd8$ZN1C2g@w`) zL4PN7c+l|1MQPqg${R2a^P9$TpxEPtV%Ju%w;J_(x7N4E@j6}duN%B>rmwec-E2V0 zF&E@SHX3w)Y;g%56*-%qO*D3PTEf>W0ETr00g&T%#m*SK_#?-KHrQdF&m;b&c=Wc?72nsEXhg|Y6o#yD6gQ$#+vKb%Z zM6~F}eIF|6_RMi>JLyHzxk@JK@)3^oW+MS)%rd5e0#C;J%jOJJRluInab;os?6SIm zHy6tGWmN8Xoi8ktmcViWL&=;iUE_3FJ261Pz{n|6e;%d4d@ZGxa$!&@Spks9=|fBf4Y(EI9{w?xn7c99B`c) zZ7{5a6p0-k6<7BM`@QXn;BXzi9>kawV#qIg-T$d)UuB4jb!FzL0ODVZ}3 zOAWnT0cdN!D~3ObJzvhkE3L>IO?rdL)XvWjZ&AWmZ<*+6T#z`d2xsj3`<}kmC{CD}gYcr|J2i6(b!VX(m z<~YC+BV$MwWiO!gCx>g^8NLo+J zy1=+SDm`?jK#zO!d+pZvO?!;%v~j!1#V8)#MdPsjY_??5j5~FwHTJ=UF@wo{7@NWa+7v(yjJ+*0+scex1I87#*eXen2#FI(ZN=QgKVO06@gjq< zRb?pzB6M@jhL?6gtfcC!jA09FF$Z*3y><|52+LT$xnuSXBUt@?Z~uZTyvqBSwz!A# zk3=6doBpW zu?P#8ztG|2r@6$)wj<*rxBW5Y4jy*!SWMJImfONNtYQq>p>-?Jh&d99&@#k7`!nV% z*;zV^|LiAq2a0|q+n2M_;@Nc3BiZRTW>dlD#$MsDP(C_{8?s}M^c$b)QSs0l**T3c z;cRuW_IV3ZsAT4q#hQMDP-FSsY>ByaH{WhsNF$us+SnYgn}n+tdE+=N4t# zFG>g6S@_gS+rXrDP_bVX^`=zmEYb#$nnG0tHKMr|g!!0L>Hr9W458iBfzGd>F_m$6uT<$D+!Km*90iC{p^ zOH`!OQ1VWfqQ#POOu{a{0rHQ&t{!nIMRF2r^}E@vFsyW0tlGV? znXY+Ce;ws27=E?_A1XKL(Ny8HR_o-Z<{dl&&lCX1a&;o?shWB)wAq?K+EBz9-TLZ0 zbCw9`^L;7kN?Sx)s*P*x?wnShWhs46{*9j6p-K59ieS=8U^c(ppo_xRzGR z4mE_;H}i7Wb*phcG`0BBfrLeubb+9Zd8D%Ir{!x9wvix%$*diDegA)~y=`||SF-Q> z`rc0=X=rOe1di-ccR#;>)qGljobWb*ESecr)wgy%|FmcGIctb{?81? zboO}|fpCkS1nxd_e15vYn?xk&r-hw#piw*-gbb`@$X76HEV?rOY~bUAR_@%Vt9YD-m5wPm|d)f10#c$gwnC!Ehjzq0bM zZ8$i<%UzMWMXU?vB8~PKN2&?I1D0^{1B0I?-p(7x_V6KYpq;rfdE%4=G44Zu&87j| zj3UAxE>BnK_{)ZmkRXlN1nyy0S1J{0xulx$LTsIWr=K(_8al@;pS`KdXSs~xW%Xw1G#aNfvc%YdjPD;;K#mNjzL&qWL7_(aJj14Cnlfx?RCM5mfajLseXKjVN zLHbO-FCRO-&comc&?+i;&b}bKHF}*vv7oEtUPw92Zs?_s4*MAp|8zJ+il!ZIN@z$A zJ=#yUu{M3K^R!auxy5e5TWSy<{QtG3wzItxX~47eQT{K{Z1z$u3A2TL2!qaWvp+me zPm+}gYbnjWOvjXr%dr7xJT-zS)^NSl%4z=c?t1j|`x0@l1C0x__MtZ&C1uhWUGXrw zD#p29A+!nR`Y+O&dlCGda$#x13W z$d3u0&%^ExZMjP*UZP2 zUb-)_^x5GuQ6%xNF(XaA_1oW&W&PN(&Z?jDHBxiRDNsuN-FtpyGQVLjquI=|66HU=mI zA_r%fugnWYoq(~NlBv2-dg6#omXK$W8}Kk%tD4Sp(yzc(dD-;xdqj9{B_7B+8RJ*; znDS_xm;_Od0Z8$yO`AF1!_3OTw5cn&3BQh}99iTW%XjERBvMuekw#d6#0Y^$v8K-{ z2S7Sce6!~Quc}~R#;+|Pa^v-3=ZRr!nB~V>z`HIibuihB7mIf)d|KQ2{lDu<0Z$b9 z&ZAF0HT#x`q+gfxv4&qa#Tr&1A&r7SodFS$LiCJ8?KY1RoVvkp<7KmH&C28F`S2Y+ z19@$o#s;FG;5;~Dzo_l&FFQ%6ud-2xs!{F0J$ToJ48Ef33!( zT?vkEq&GWj^3O$MFYW_!@2IWLjN2{T2qLh^6IbrIbm54A2krt_Ty3!Mw^MsF?!Fl- zV%d^bR9ciA1&%qaI(>fS-R1PIc;mzlF6gM;qSz2Z`o^>twqCf z0g)|y`smHHhn51j7U%5kp*!`PlRm_KwKELpK90rhg zDSBa`rGJy$QJjb;SoJ)0DI)Z*Phq<)!}~KklOVa;rU^wyK1sqOIsw~3#|1Pvd{E>> z*v?-};K<;XwLNRQ;k`zT{Nh7zOg+2Lc&Tt;&BkVKB_eRDALyw1!j^>ff|>JCrVRC8 zlMMFmdW_3sG5+{6;GVH6ac=P&643)q!Lvl77G_W^PST`nx5>OtyMUU%?&Bbd2X}O> zi(nXZ?2*F>q;7=1L&hMrG3~rG4g`WHGy2IWa?0>7qs9~#O6}Z@4bFJm_q$N}M2;!a z2a_WW9W_w(d+)4W#Kj%bMu}~nieg7bp;y0u`5tWPIei-VXinkubw0FvMX#MxWXvY1 zK2HDRbMw4EJwe!bN464x`BuRT{`6wr9XK8^An^=?NAVC+9>WIVMqzMq5khbE#vp^( zM#VtI#5j5Nbuy|xwRrj|;xiOA;&afW0YM{~!aErcrm_GyM*wJl!BpyYHeTXcLflTI)LnPlu} zveA-Tc5)Axw+#i#v@Hxdv3l{GaPPv$gifLSzgH41r4;iXVUGpCh;s_(N5y029t{Oq zdA>ZcEq!|zXEgn=ku&*Q+CU5A7GX&1B;~ywUcS@mugrqu;oCdsli5up@`c%%Z(G-_o?(dhDLof0&w4p zxCsXxb{kJFDM0Cskou!G=4nJb`Dx<=yoq}~JdX|g1om?|CbpG*>r@kh^+y|n57lWz zxYK}O_L*(ZYEB!c>_uN^B|tlOc0d$kH6WsF_ zHHAz}OCqzQsf=q%)A--NsZ#hqFLxN5Wp)k_H*I@7m7^*R0yaQbs--qvhn& zw<0ayUQ8t=fl8^2_!|>SJ;CT5AXNx!&I5_kG_?Jb=40|`Lc&X&wlO2!EZc+RTqvbT zBsyggpBVgs5JiOVJmSkXGDRl4Gx(z16mH?#R|bNEgI8+dwc%1ATdWd_vmrfweOtpqeOX&$<`lxem`-7o4Obg9G-#Zij#{J6)5b2wsbl5_Tu`Ap#c9&!n{)1nwU* zRyfcN4>LwYTT>f{1zTalbWhF|e6%3#)nl}yh#gT9$z{`xnJxf8w=I=KtIQ@P^Z!n|5& z%XKljuK-Rtm}@5rp$VcUk&uP{du}YI;nXmx&L@)IkUe~pqAgAq2BpIiXyE$1gPadk-~GTO&~?##bjU&p*UjrWHL*v#`uZzVUD+!v@5UL$HUmoYt~zb zn#4eK?OTA_9-2PD_3Lt0}+mJO4wxFZ73p&4o!p4SKq ztZtYFTAK0gotg|zfjxRw!2D*vKOiHjW6}j!w@Mq}Tun`et%w@pP(XFW5F1#d=T=zN zgZ@XFQdpku{?CEz-x>Iyht|h|Wjl8ZxE@?4@qybRmO!O8n=2p~CzN4GqTa1g{HqB7 zMkcUB>BtV$TMKEY!K7nm7+V!*Y!42MtWuu-f>zw{!Z#Zv!E4;j*UHBi<&F~i?Xur@ zM;kp$^=;4T_3Z?x`tIEC45YVW++6zdiOE2V)_XN1@R|zbHNKliZMQ!i zasW4YpV7;!v7Z^+K%aaIqlh8bxhh%F^M*zW9e}~ho016ia7%3{NAnLA{4h`hoy$RO z0Kw}W9Q1ZOdezgb9zF$MQMSOdnM4&8Q(kJf$B|>q=70)sP-j5XMJ{WT_66gLVq%3@axEp`> z5_hAx{Aej;g1Ae>b_kmwOrkgulSNy(<HNNTV;-KL2 zf=uK&2UpD|p(K$e#-6%E*8!$s-Bu~25gS4Fk6Z^Xj2v8)yELsr#LUXqtyo$qA&d=k zL*0t4VtA=Lh*+;($Qma15tzwNhOy<{I;G>2A`I6^M1(hr^Lv4m$i=&PYw|&AbEV{# z8^2{LR~DOCxNmOEQh>oWk}et++!eBLez7z! z;Hd4NtW~z7mfHL4wKYNkM{}TNRFsE+(FL{wgdId92SM|*blxs9k}nL&HAA^e6!cyw zwYv+FM;JSo8AUFBeT2iWV}~RaQ6rJ3V;3^Y$J}hvq9->twZ- z+jPk)A-xq`_`3&+I(JhkdJ&FPflA`Z3}!ESMg%*4d=%(NfSkO{Cq^Wt4>sg)fWfHi)#MkEf zGB5VK0C=Cnio8dab!r%gnq6`h!8s!AJjKzZoriNM(E^OXNiSaRv)OR59P2jZRo7?I zvhgJaiD&{)M4u8WvEhs^NbzQTbQ*ra5Kaw2!?bJyN+gx2;j~;q{|pUHpKpv<`WD6^ z`HyF;)KbMnQ)($iVv{{;%WNZy?L2Z~z=1>N*vzUU4mprU14C>rfg!z!XFvglx3+Yy zj`HbDr8PipD$9T-7HT`UCKT)^@;HEU4vv+aE36+{3E@Dm(~sx&Zf|35UPcOuFzZNK z&kGu;RPZ2bEK?WOV&@5D5*!^lg60C?sV6?$t(|kT<-x((u_f%`Uw-SZOMrB4PpR3w zi32g@*2c=Vjs$q3%Q9QV(-GZ!H~(g1b_R@4s)Xj^vo6DSY($(dh}sByb|#i9bjXIe zZDO=wYjr50NC9r))l;P9fD+KtTDl{*m z8@_Tw9QWcJu)B?L9Kx_zW+!-`Y5WS^qa3h}a!26p#BAcJRXcFLmW$-1D5TQ|uRx|k zk98C`4$Dng(Ep@PPWH6*t*OMMX@>-HJ?{|oB=K|`MOwEd3j=#edg%pMPRe@cB7Y)y z##T86cT$(o!)BB!5YUW&i!Q*BIzi}!h@+pO!3shj9PGOdhjjVduq}KIZfqO_p=;aL z3^q1uh-bix%VjlTqBy=9$PWI?iw8k3R(1t#e99XxY(eq1axX0eu{6}geXkuMl@-Y3 zXliMUXv;w1!+7X)A<8WPtOTeZIFaF2N~EN<(C=L!V!RrpCDpG0Tw&Mi3tQ8%5) zILa^r{fP~T+hFs=T@e*c6b&SK-;c;f<6#UTsiI}8_ZfRhq=QGSv`ag?U#L2Q-f-jgMv;Wis@a9?09<)aA=3NLm)k?_@gM@+((nN@k2 zqR35Udk*zXuF=GFoV2xaBm?RyvA13pdL*tQhXqaL_&hYnSk!h(S zfA<;)b&cW{jHWh=F6+UUW_)wkVk6IIEpi^tm;5_=OHk?EEtY;-x5zrK$Y@wD276kP zR)u5lJM%88?WwJox&nvNcmZhZjE76^oHlR<$9+G7NutZ-i5>JmfrLq)XC4fiEhhW$ z^%c1$UXvg}?ZXd;M1c78W4+YPXv{u@tvqQc1xWPBiQS9m>~~1~H3hHa4Rm>ZO9l_3 z&n>fA(ZB*NWNHp&B!FSRp{;mrScc_K$Q7^qVSkNp3D^17XNh#g4#7fu^@N^A4Rhzh z@<%JdAu4!3F`Vj)=pV+1QT*NEdZq297*p~mBM-`Y>qZ=dMVaPA1?*`{gXtShrr%_& zq0un&urP_439gFD@kW@0BTeNZHs!NP01C^m);RZ$x}s+eD}$=RRunC~8W zT2lF-axoS}>DQta!dgMKk_%Wn)jIyFs6{VkqP~p6Ql5^*6Y6YjlW^pXQqBzDq`M4z z?$I{D_Kon-dxR6??R(EYGRGBd?L}?xk=F;Jwzv^wBe?^rk&gB}9W-@!RPzeQi=4H< z(sPldgBZixXWFOA(B-=Tq12^n);G?oj%nCr?PZ z!$7ZZ-VJBhmm|{H5^xodQtlkOL&v@MU;nj|gOI+aT;3eWA)w>&|6`tmm3%(K+v{O- zMpE$^2~NBj3S~BblFpUrrvYbTY9)RvuE=dcRF!hu&_04#&MP*7n!x*pCr zmv5KY8lY$A#>)5D0ZMy8-VNzH4q;ebqQ?3F&G1`C*AguabcBJ9!BQ%M#0&lSWn2iTacHJC_{x$K zL5L{`O+s+xr~2$k11|;?k_+6A(9Zq-dlZZaBhc|CXM@@R7jhi37U3sqD3yLE*k^ z3gKLd(uMrrocxn1A43m$SGo%v&A@P`F(Rp)$p-9?^*3pnr;?%}&gY%e!(?NEhDI=) zMFo*!CH9XaHZl4$62R=E8>*dglAWBQ#57$4>DD2O`*_=mpxQUAxMAQZ&?+P5!UtX? zhe?%go`QMUyN!+4tPu3=w_;V@jWQO)6OIa{Hu4`P6O?|^yCC%BQP!ErWB-ATMXpep z<@B91F|xAPH(Xnd&-VCo*>fEHBHm!DrH22Kr~5YaTsuNyS~C|@jPqL~r!11|Vz}%T z1BQ4*y4W%rsPOsC`0^T>&ULGddiwy-+ypvdGG~=YlqoV{%Rw)R$J*$!*c2Km^W+!( zHhTzbisdq)N5Au!fZ1d@=qvWbggg^FU^-GZS?Oy~xzrm7jr>qR3@*TLqwgp<<2aHO zJ_Gb1fmLuXQh7VDAI}>5oZ(zxI))GuKGS$Jh8BfeNiI4a_5tTNq?{9QUllOQ8v=3i z+24!K<4--?bs%d>#vM=6Ml_tK&5+Z?lfQkW4Db!IzyB+`9tg{4cUzo{DB;>pyay)Y;iN}?_B$Qg(cBcuP&`!C%#Fy|m#7~I4-~sN zvEMX*q0wWb07l9dsdgjNEqsIe%U890?S+;cX|?@M4gTqHuk8^;Dz#kNcZ&~ru2`0G zOjKFq7IPV^0@sl%Xv%V$?aAqZ1<8U8oy3wP(P!vZ*?4Qpb6!z_RhHxuIBsg#XDf&W z)vuh+>A9ZX>7=4m@vYL1vhb6wzxZx>`FT^UL2dU9U1Qb4qr!JCzzlXRu#KGm&f_p< zp~6XA1wAluTL;t6n#0UE=`l(0f7Jf%_P7^so#a6~t2chd4<+muoD}J$g|fGtmD-vb z4}%Gamm1_+fFs=r0Ot9Y!j8>-0FcWS^6HDR?g_94-YDxDIjY!BG;AgHA>w71 zi(p&!TyOT+f^q(#ZqUo?L#z?b0C}J2mGB%Gk?Gsrg-$wyz~IKChf4~Q5A&dLQ4d@E z+^H0o67&ww<8*xP{)IaT{(5sVyM`%`p7^utW)C(Ty-U=HF!5h*8)w}!Lg`wN66i>e z%L+n!0Ju9F6Cww#;a& zGHuxp{Nmvd7hL5;h7N`*p+mxb**;+k_i(Qqe@ z3{HCj2V;&NBU-KL;K*`jbQ9Lt!hTW!yPclm26!Kh8V{uLww>8tPx7q^j4z2C+n)P7 z_C;*y_5!cgKX`+no9A7(j!(BTu-{1iua3ra&fTe*(IZ81gzQdn{1JBOLPs zV}8$CIYzDY(iFxkPb`ra^~+o5VZGJu+2aHM@u#l#R_gdRI3iToSk=~Q!iUwQ1$V|s zIN{-$;aI-nFj~b ziHYFd7rwSFi5gR~f{#g9{9W$A-n&@Vy~Fy0++?qudqKYWht=2QQwO&4dALg~WC>^l z#fk2KMCu-rA6_6yDm8d^U2N+IO!P41aD!-gp&l1wCmdLkFRv z8qfeLVxu<@v`_z;#^e^4N58q=NNLc$Zl2kj%Dz}dT{F7)pmnwwAJnZ<$H#Z3G!82I z_)hysg5pF6xCFy*?K%N7Iphd4rccW$;H*ATN9i&1Y#p$?^2N=hf)=3Bo!kzYvP`vU zTfxkWCOLqm#J8%fhYaT4@?YAmaka`i5)>#u1&n~!p#WHwqN;LB*>1UEel~RUJ!7^; zk0M5aS2Zd`Eh~_88*|M1)YbX(K&3#YqGlcGH|W?Ax!$a>1m{s09p_ zGx*UGgb@QNJ6kCtq+@~o2S78Obf{Tb9une?!unV#DSMfy*2miNm&vX{BuYdg^f*?e zC*ED}Ro)(CO$ZoC*Wp)a&fxWP6`(rus-C;=`#96h(gKxun%a_5MBCt@7M69 zsJvc)Z6LtJ!6pC|RS-zpenONJDt=e?Seiv;m!-F1L5k*0$(3hRP(E?FRmlkkR=mLX1 zv`OnFRKRF@+?=jkS*HqKEzgT{zDjf=_;Znf+-~((bVUKXZ_ROODVm$7rSG0WOQ|Ou zvi*)hR#A*`eg6oeLVZ$1qj&!Q4>}N^A(AX$(+))9L|Alsxw~EYsrWGnVtbJfwqlwB zl^#U+@V9`BVHK!~zBtPNE>Uil5-pD?QNWJMyC{)&r>{zMQ-Pb++c(@Zwf948 zd=B{}N~6~~G_a}IR+R)UFEJ{ZOrHVm`P1|=%7v0aLsh*-1ohgbXSjcl4%PI9%{b^L zvvzDMN@%%P6pWU>Bj^+XWWjPo9z>->JdL;gG+y;=k*oMw;K3mt$!RsarohV2%1Trx z(F$VClKZ!sb~n^AlgH;z6e(|3fInbCPgza5CJf)e zB@@GKg5(^>tV zaNo3nP+b;Jh0+twTZ|C?TaUsqV>=a|#$3Z#bZ*PZN3v~SraMxSsBi4RmTf{lfleIq zNewP}6Tv%5)N)HPCkUx9+xYH^D`|9yf2j0hyTDrv($nXuR+Q?vfG|pR3^KujA;!U= zK;^b08_O2%B2uTsjLuBVG|0M3n`^w2r70%o6bw!8gLl*Dt&Uitd&2fVvd8JTmP|Eo z=9lkne58eOnlb5YkxbirSZ51J0|Ci$J_V9>iH#!f19zuXs6W~)yKBl8QZv#8GX*q4 zGX`m~P`Q4<05*zlS*p}0r(^0S$}*8}dF3MPYnQWeFpsvy=m*FFWfZxPNy=NUGCI%X zp?<#9=eASEKM zMAoU~+S{;@Wrl$_=B69%jYdPwBQJpd#k`0DyEXsTRMwiT-13E=geX_pz*Ec4n*s9` zv^wl?bEUfc-dzr#MkE7KUOt_ks7U4+2+66=Wsl^JvHkSeN6|8)655uz5&o-_;wp*MzsXHov+{_=g~I z?_T4eg+H^AAkO3TY}Li^tKt6`xcn%@ECxKD0O@$==-*{=-czi}aFp;U^+ zmqt*>x8=TQTI)rdZ#G)HsjmA2t@%oCYi=C}eh#$WDTeH)C9nK4IDW$aj1CTLCQgRp z`Ug_Q8OQhRtY>6kH!9gB)kJqdCwOx8Q$rju`IA*5@nPf>2$Hg+tI*461LoV>mL!p? z21=25WDvF49xBD@PQ;Y*2%14gw@dXNy_s{T;M?YD_)*twQKT1>sy=-^RE*}L{^=9$ zZ_|$tA3_O~EnYpoPjvm)$j03pZPyk+uM;-YJuYQf0U{iDYS`u~-r4g9!9`BQSV5Al zI%@6LS*BDJhUsHnNvFTPJAJ_|y5h&{y+_teidp)>LgVjI%GOWfZ6KSoS}N*h>&)!S z8&kgNN}7V<_%3KC$?L7lMuHZF9MJ(fSJS)?ZpKVPj$Z z_pZK*fVc4rrqD?TSa)PXQ;RpSB(A`RW}2FR#O!CHPT~t7-CXkuT8+l%i%aqynwO-< zlZVxgJR-YhWX8I%HuoAU4xWNiYt)cax2GS}22v8=+59WNWO( z7U~DzGzBMN(5-E^O-eS(!=F{9^eB#$PDCeLqsOAtpq=^RPlzrtE2(xW z^oEL0a1yjuh?Rs}$Z2-EK8#kZY%L*gQqI4SLRZmMns@sYhpbnp%_q=i{r&8Yv2!kiu8&t_Ddk-PDh>%Gzn$B6AJDn zmyURv`HI;Fw1iZKsfq}+!L_9m$SHzdpiIk5NRWjh1EZl%q_w&WQjf*`ThO^;-x#f1 zbihC@I7}88WDDK0O`E_!gNCkq*z}GvTHW`b{NaPo<9v_SJxx({!?uco}vq`4F2xS zOExKs_W-MNTLkIlUb?4f^Rmz)R%;u{YMpjiW$wr&uMc4`n;aQnB+DHOF1?4XB(A#J z66R?_`o%ub?XwYk5xGCu5FhKN=F`qspinv!qfm%nrnw{C_mzu=R5rM`ItDx4K0~J6 z#;nk>8a#-}4vW{^Xy8&QiMiB(-ad3JFps><<-lMSo zQr2*wT3EorzdIaZFUCpoTVEUD5vFdPogsuHV$c%xEm^JY5_{()zV}!i4rr?A(Cl0= zjYqfM3;8I?+cM6KpKv(1ZSMvN7jbVqzWM!k|4VkmDR-sLF24GnvrA{s_AjCI<@nw8 zXsp8Em|fBvdAJypzuD}k8+Bo&tHpk#!D=zRNo<%v4AJ7xCzG%SV3Ndao&{#av-#qa zQG_)dm9Yz-l!*$zfD;HhhJa4MJ&Qrcu;Bd&%eaPZ1{GeLAe4@d=yOsELMw1CSGN|I z_@U5hUXdSc7-eD%xLwuE(c_Ho7j8Fngbw9(V5okB zXG39Pu@M{aWseiVbYq3M<6mAN^*9!8e2V&-2&;&|;-I7G4$kJjLYOg~-FWF8iG z!s@L?;x17ceE&4?1&Qa~!NK#c@~KMW_|P$7c+*Vk7*XI-@e^w6{#a&fgNE_^IIpLPD-K4UZg)Hd1Y-ljc0SnS#W^B8a-Dl zv4VZ-_76K!a7MhZxB9v{F75*D7Ka_PMQ_d86IG?3PC!Fwn4$w?6%EAIn-8!mZMsy( ztpze&Zm4_I0y+M!yq^F^AlH3ZB6I7-!1`EBUUC%Z^f0U#3FK!~NShw$&~KeE0%*T8 zw7&)w-5V8vh^3d+I0DcKxNbL72WDqvz>)bkFw{rQP8v!Bvq&0#x<%Zi4+Ap?MDT&K z49G!;Z`$XFwknJ^{E2t3U-WNoko|uP)Cm;A$KrTJeY87&ODs@y}+s#uO=Dofz`9cy%~o zo0pPg`b}Y4|K16PEt&3UOeaiNY;XAjIeO1^7)ZsvkbVhqnb$+z;(-ohcM$QcFCjS= z@AgQlhMh6LDFAZr0D%v5n85W7Ud`a!jHP2R@5VFCArTUNVkEl5F%1I80S;2S6-JXK z{OXoOmrDFizP;aWh>*uBol$oZz4`JJlD+1&w%l!JzZ2IOjf5bW-NBFUSUm zl*u9;;_4&VDAnR10)|_jkki=B3~sj<=jh4Pl?BanDcNVZe~t@;-&pFj9lJ*&(zntA z{;xo?rRRnE`k|;LlOISqziHh^9Ii))GFPFRzF16oONI@wr&0HvnQ?IlX^HPrn&?{c&9K- zBWSy*7zdqG zq!k)*JG>!%rl-oD;i?c**zdIhfH*wJ`)nII0;SLF z8D(lDR&jQXfNvf7x+~JcpCU>_G&rFdv<08RO>uNB6p03=>k~+0GDDpOP)IP~10+1gnL=m4);rDq4+i4f#C`9kk zZDSM81w^r#G1BwcsnX$!E=lEO9irVyt{J_&b?RV|zv2?I9p%W88xatJbB=RGz@d~TLur9XOe&A zDiU88uC@wQn-aB&$pz$$9=3{D3#2#mylYz}2>;opY(kqhMTU_J{!GTUo2O`&Y z;W+fbD%!%~L-bLZ-wI`FeGU`ppybxuimgGu2HO}aRuMOYL<>JJ6q;#(1tdSMh+WOk z5=#_WL|sV_HBl(9$zZ700^S|jMo=nwzAvIqENO&=8ht2#(3LSUQ^)pE$EKG;1eeFa z;Hk1yhSK>%9#D6BShIPJ#@93DCC%c@r%H|dxc&*Zwj7rE%O|!%3E8=JYSJ-~wn^!Y zB%UP%4>L`MY6;H;j9pehu8hKjl-Z-Egef<8 zriHv7dv&CI555Qh6>)Z$%7O&vj?#aBP_3bx?GXm~fes=@pe zec6eFibLXrUk0MV!_oGFM8~3>X6YM_MbenTy&jemK2w6a0pYyEtyrgKW7J9)vVO=D zRmZU_U_lQF+uIAbnsaO)`A@qEuU4Bj7A#Ki$r0Laxc9u6 zbF7oqG_{=W*Tk&>iM0SvIuEtgO6lFyzM~wVD|@*5YLbm)^xF2fH5S?`oD^T)1VKms zb$&bppA=17TRyp8#+DB_%(0~IKcu!fXl_ETRiGUEt1COSl3lyPrd|x>U&`;BHKRxp z3HDY?d9JP2jR1Ku*NTL(2|KwZWZkNFDF>X|4w-B)mB|mJ1QzklMy2Pdz8b1Ma^IqZ)10b8fq_ zTU#BE5^mu1Bz3XlY7lFr#M6uHJV=l3v=aTD1UPOfhPG;x$%iccRyaqS3t_lSn-fHq z{=R$2qRTFr6GK11Q4+4N5sKDm8Te$I&S^}+ENFnraZqi+EkT`vrwlk(#6t!0t0QHt zGdmksP+&-0(QCLM+9;dT%zN8oxH=j9xw0nF;?mBfA!~1o+ne$L0a+CTl zUahh1+UWQQ-A&O&r4K?nMxW40)5=M=5)KTsPov1zuFpO*9;ZQical}bXh$j>lzejN zdMd~V)KOO@#Oxwb*czvtECj|yhypSchw1TTMVxL~IDbk+!C%!|`O~p3I1KgtPaqiq zL68@7VP(d%E?&%!C$YCst0YRX5Xc|7Pvz)suYTjC+2dH zH&+N-zMB8y>21-UX6^?PtAuelJK-a$$`d*UtlGojE9r3 zdC@G_lahY5kqOmo4$JY(mAZeTymoz*O!h~sC2DDR*=b8RZrvrcihxx)AF9ma_WG?Q(+H%r7v6i_pk>>IwUqv+2G_{Bav}QnE@vn~rakXqnIwmx0%6S71WREaY1)2;>*FVX_ z_72^p##`}>(32rTlc8%$3~iav&65V-%h}j-_GXw8+T!>i17s9`$<%l1{azHG-Kw64azW&Lh|NPvbUoaETjj>F^qnVfR1f+Rk zyvD$j{^XO&P`bd{MCw36JNuz4YkI&fw5Q*xNP$SjI#|(1#Vf5rDVK>{b=R;^C{RmB z_-&z6s^je7%3$%M$wq|;KD)c!%SzXCOfR?$VjRL0MB3-ESx0rXqC5#5k6l6~|13qy zH!=WKgL&ib+EBYf%b=&@OSFeEnzgk<4Agu^2ws~c%;=^F)_gHO{2wAZ|L>iT{l_Y_ zcK(NyeOk35Sw@Ytlg5+cRq$fm!rb*I8gm3udzibL%+XMxJZR1mgdFpM0oLLL7Az%3 zv^0=eG1GW@*ZA!=gLigYBSqfDO+qExpfAOZ^Vs7HgpajkmX*;&b=wTQ_#J_<^mXNgn!W?2uhhlYtGF zTX-md$)o!O>s(a8GO4$>450pMaQoVnDkKubBFgXzR7=ILZbdci2Ko}lENs;T9FT+CwYk+BKi%lt#SQKQ`f4~&T1{aT+Ua*QENxN0KvF~a zo3lCQ%lJwloZU6vlDp47_J*C^zv3OMr@!8?^~3|Y)4@+S+W*bBxB7ET0D~>f%i9h% z!*{dR*_@N^?M>rfM|yEKZ@ruGqBrESi_Xj2?x0m;cyDi8KizOjYe!$KI{!NA_U!#n zH?6m~!Ftm^uPx?GS=~^m=?_l0g7dj>;-^*P^rkVLHU7>8ZMWUpPpi)9!NI$k20?Gs zw_Z+fuwM3Bj#A5;Ml@iub7y=R=*z_onAV8cLxXDR482BgNLA)-K!rnAAKlHS2*RKn zSz<%?J$3KYhhFp{v^G#{HZFCdrmB6ndRUR@CQkqKrs)r1`g-p_k9|3?0^-_}-um|N zPihJ9_ydz_`a=X{ZTBgG0T6mn`Dsiz`t+{DIy89u(~ZA{gX1NO)~N0Nb{i}Fb{jI3 zl4Ueku(wp;B^5A;-FpNJG(pZ1zukKL(mu*cXV);t>QHfZ3&SkT8(A~$Z~cs0g7t#S zgYh)G;2&4}7}jAZG#cbZphMv~)Rh5Hw@T>(RsJg1ITq+@i{>m<>Xb=yDdJMMAQNo! zXV@ui0F*rPz&9HOr!wIvTo%ksEf48}3vz91Jn7cX^~zV?zxj&rJFcMC%ggJJ;R1id zSMrN)G!RNP%Z6idrWNtQ+jM+LZ@qW_1c9w^EHIyu{Ol}DZ!Y#5u9ErPk^U9IfIBID zmluLk+iv0|?t6U8Z50^nm1N~-!sy%Dl@kOIbnVX9e0BXUurTkgm)CE&=jQIc7@Ktt z@JqGu1D(QzrS`a#n(G%rFL9t`K_u(IaQU?cSHlKyBcq<25sh8k+96t1JTbd_5XF!K zNlxxjVDXA+1ePDvF5JNyW^JZV?l$$Yo?`o@1Jjo#a8?JsA?O*biJ@MDJ=c?JU5a(O zvUQ5ZEDb5F|Ch7XZT}tiGx_EKwwR-`0ySUNjVd7VN1A)QKBR*KgE%e^kB@MCh&}9R zppr%(Y)jE_0kcSRGR4M7&}7Zk z0atiRJ!(8dB2 zB{9BZfe9MhzCJ-Ml{;_^fY&n@lP4G}SdFOOi{G)0y&GSC?fU_7Zw+CzS|42(;1$;; z%$VUj1mA#G4*~FT^L!=ykfU{v-Hqto#<<&L$W|a83@%VEf zlQHpUM3)=`SP(9hJMK>^D&gkg7jPJ(QdY(7H)ex)$fyffBB?qz^^t;zJSgKFFQ9H<#8A*yZr9bKwdK4WzChoFNaLV!gR`}g{wi#|1v}|s!gOqQ*$_LA;--z>{ z-u@Ziq@v0bKCHZO;al!^O$;HOGj}QzCEt%VADAC?VzgV+W8il2lEL^W{yBRLfKBJL zwD$Hvlerz8w5M|sZLKla7uESSPoJ4#X;_eKtUg~e zT;dB?R9(M^FgIHHf)7)%;p4@GVOAS;P+0`?oXi3?6y?~MT22j)>4ez+1Jp;eUF;iX z8{K1qO+H!nW3*Lx&*GS7RNg{{#L_i}Z^T)#qb81XIfm7)gqZ{cMQ!BU&ylY@Ex&Vv zR#tr}Eh{_D%_PAI%(P0L^8<~|=DfHJ)22U}&56GpH7%P@w495(y7$6PS zFh00&vnzsl>kkY8-M3BY?ez`bZqS~5C-6x}TGlYc*b)wPIG${qj8tL0=qKn7ZBsd@ zdGmm_-)S{5AMIO;e9>~Bx7m6hRY*Gj$UOQ*}jqtYp;4J%7) zR71x|%sc>_^0QB*pOVq(VyL5|FGHf~|JkCyd01b=piQ@8lOTbOXuaFi3@sxyVc|cn z_qno+QK2cHyzAo*EmIK*MaWPT_R}9UCDN*fT!FWyLrQ4yL|HH7J{}Z(o|%=nvP^h% z=6KjwsbKCabEsoT#0|e)CKAqEtxUey7u8Dau7cRH=m60!l;3JE9+g;b zu^g};bk=(W4{D*{=G=V=E~&HyFC9M4x&V@#tf(-$DvNAXR{`8k^(QF{TFPG*qP*o9 zH9h{kJ&lKZAIw67>H2$l*;*{DHRrCX4eR%U&dw@to-rovNo@7TCsD$w zs7_xjTsQ-z4|R9%(IEuRh&7H?aO2VCS!DizvsID;|DwiIYro0ks{HambE?!ltF*V< z_Y4Qo3RgsTejjL=i>fwjEnps6?B6C+yvIvt%P4J-<%i-t4UKOhiWR>;gk@GU$d>#{ zC=T2aa=ybcA-Xsu_=SUO<9#a*1xLjOUzKHla(=GMBSyl)}y^$(LECj{wCsPtg5`pqg=y=oy21vD}+*b*w{u z<>rU&oxxgGY3RvC)F2O~JPIEvGy{pb2~r0;zm6Yciz>SB2#EG!zxqBA>!VQf@Qi41 zizH!RQOO9z$;IKmveP8^Y4CAmr0EXjoAlq$6!>ir=n-snL{t42305$qC3M*T3iMfj z?69&|JF$|RG2H(&#HUkymdUaBW2ao)f7#MV>7Qs$85hLgh zCBbteJKx&J;)uBvxiWiIEzA*z37;%nfloG1zS_A%5SoyHQ~fTml!38d2ePvrgqlbZ zqGg3_YX|~WkWtiFqU`q+H=7#KLK)~L9goU1HdLA0!Xt4L?Wgh^Q0$|!?I`5GM zg@^g(BvF&_z_Wy;W5}@)iYTO9JED9KJ9oZ$LI+%`}`3sYq2Qkq@bQ+ZGFx ztu3XXFEeyJP6`|{vW-+?L)~`rtm?;4P$Zzpeq$4Z;McxV<%# zo*xE@eKvU1xV9vEkom-f1CBN8tE?|gEi(|}mccbJ=__#hNy6^KfKaJFfP^=+*+v!O zDh0?3fL(!9zPHv@Q`^p~Aj!G`+Lt>Y$Y~w%*a&WPB`!h#9agMf`QGyRIl56~n~d1- zdItZpmEtuzy_7__EK+2<~thJ=8{| z)>`kzp3NQAd1%H#el;HbJih#Cd^z*f-!UhM1$z?Ea7@VSlfQWVy~qD4 zFnwshT;WAFznkBYJvw;C7ptE4qR-MQqpK?>fTSo5mw)$eQvrXZgj_SL2xlsyZ~>pd z76upyG*T&7mHOxiZkSoN%P4Lx0% z&Y(P|s*`~7`YgjF7QxlYuGG%$rqxH6UA$fQR?43q8i-~heNKRhVZq0MQWh{ymRR=; z6dy}jW(INrq(D{-dImY=UlHVNX_<5=(BxFfAoPYdhW?AWhZT%=1YvBf#FOa;0L$T} zg%4}~(H;dWr|G)}Skj(WwuecDw#R(&EE^xWb&d`WtUS7D-$zfmuLr}^)*M@8yZ8@=sRk;eR2?Uq8)K}j zQ3j|}q+#b5_?Lfl_Z~lijJ2Ga`ED}sFg|@!Z#`TuR;0WLj3s6aH8D`Nr(h2%gUv|KHQ}9ZwQF zECO%j*$(9>5b@GUW&5ScdRcGl_h9}d+zC;Xw?@c)X14tx!sKR@j@@pNSg#@4990li z<+RzR8`i%M-587Y`rC*7Auilb82`O1G1IiE7WID&av4}1j$7$B%{$hSG+fs3gOvLn zE^mm?!YpS;fgfVhcWzet(!}*p%fU&tu#fD-rJmCy+#^Pk8*O*LncrTHZ$s@^LFISw zfW5xl;ad3{g6nVDv3taY*f^Bg+*|H4O6Nit>(|$_S!y?cE-_ONl?!AtHW){`y-_Eg zVH8%Bdkz0+02;QBwp@No>idmF*AK9ZznDL_Lx*XUrAo1fsk$Ke2lL!g=z&RYDd{te z!SaUYX`Wk(Cn)ck()CC3k2|Z|dbu(Wv(`IBYz4xy^H&MicmhSdPEdxQ-%xEBs@je> z|EJA5x@|jLGPlj;WLr0>3d)0R-|evaaquc{(=^2ALf6+hOx#?W;-I1sTe;zBQ@@dr z)Fh-;WACl5pt{7cS&_7KXcUfi|E6bV64}wzz zDV97Lx|19<2C^qPzBe$x#k&nu&SRfX6+nds0ih2M8oeKxf5dlh{<(BtPFD_pLFTG= zxFtTdyTWd_e)9{kY0RDYiPS2F<=uTd{Ph`zMH^>gbG;u&El#}ZBl=o@VGF5>*O#rs z!*8ERjs3G-UhM@qL(v|)9=OmW{na3*BOqys+om5sFoWkkORc2I_ z@e??e(aHLa%8)fRwd2;+R7OVDzp2c$C=*?+3NNcKRiM^am+X%{6ti4gfScK>7FhZIE39DjU z*XqEvn)zBcil_*8l<0b^;20D}g0^KV^O5Gn(&bs;&N=>NXK-c7+{)MYaL8=4I6~b) zAitL46@!)^Z87TtU07k;&kn}Rubg>W>-s%fcJMBZtfO@-TeGsZH!{3q*c$01RpBsyg)Meycd?#t#V=AjISpFx1*Az@sTwZU{N zEi%zOzyMk=nDh&g%}6R+`%d4^i@DpBq-*?yDs4+2y2758hCxqOSI7*8JWo`q)Cc`> zyG;z7=&$kqUx&IOr$seog6P`z5Vm^xJbndV|4cyZ+L~kVt4uN3+VUhz4i%N)R;W9# zw*~}gmQD~yZ^856fU|EEa+8=TI<2QcP8??f;W|hy4Pb!+)g3AKA``x(L^NtI-p_t? zI$w{K*%$~j+YPvBFUMgx02O1Jz{-+rR3U2gfu&N=f*+r{Iy;}AtQkU;xR{KbnF8iL z_76zlMxpf+k=s#>Qo@f^d7Fqmb}nzu%l(`QGqmHHeS2^q$9bqjK@=e64-y50ADfgE zjIpmg_6u$0_*zuqm#gu3_FN#jNN811yLFQ7`YfsX*GRGuzS5c;*;3m-+F>eSCOR5> z!;YvCrT6?cO8VT8ELX`r2MmpM^Z|3FSuEqb7juZRA8m^cE>x?=k5cnjJ_nQVmJb+* z*NO)Fa2pRmk|Q|ZCS~f|;rln^r{;l-S)JIACC(+`_4$n}KEemBN51#iqrVk_8yrXn z^(isjcB)0TgxIsYn%<(?Bjv8&Xx&e~sGjl9y)Mr~7R~*oc zoIMR309I0yEw}ZyrPO-&St;@CMw@eM@1~xr%nr(K1JIYXG3XUmjXdcG%9bOsI;H#I zQ-HB;FwXS(c)~TVq|6Asbr|~t{b@B&rTlvX!@Z?gBJ(G3fl|^7`WLRlzLJXa=I(lY zdz_^v=kA0$PDWE%(BXe zSY(j}uP_GgZLE(}Jh78Eh4Y(cX^DU3wB*RJ%*By&3_p!Per6P>JLEcqM{kLTKwD#= zt-BD`>s(7I$R%4MsBKawi7w~}BcX01_C1n)VoY(QE-YV9@ z#-#V@LAl?L+Ph~52m8md4-$Uv*U!kGv;R7Gr!=jU;?6}~!|5yGFaR81D4#tlzvb}V z7=_Kq(m+b|g*2Jnu(BA(oC*)G#=*f$(IBs3>2w|Bu@8~-|M*-fjAMVkSY@Ze@`SbN zGRz&@YPoOW@K;xpUw(M04BvjjGz=d;Lz zc~SG0^d^kk>5#5pWliF254G|X95 z$K8Cok)XS5$4}ziPS$J;*(1Ya8x+ZX8AN0>hUgo0AYT_Ods-Cdn@0fbk`)MzJ95@^$|en3Kem6eV%wO|J`Ew8*rX|GzHP@cydf zAp^RDonjRk${YfNnx2-c4h=3zRcp9n-)srK#MQQqn=R%mi*x1~els{3f0AQ*BL^fH z8=YMRA&KM8&NNIvyIi-P&k^lJV*2De7tZihmo&FSY52x{@-3|FM&ED^7{_emSA?SDc&}OvarhrxiUK{KOlqn!*|Awrf>ep zSCbFbC!f;q_&!y#Fa8u`dUlGWQ!gWc$*MF2Z16S_8WLpEgUO-A^P@@-juL(Y?o`^x z1NGni^uKGTgYVB@{QjbU@#2dg`d`%dL)P%JxZ)27!?#Mi&Fcb~fDlH-7*K2{m+#>X z@@GnK`JO<5P9o{>^2jRVcEw(Ck5#$mI=t9Yp4IvXh0fVpqek!FTxzyyoM}`6&d~mN z{bWs%L)=4Tw%9LbGiyheVY9lIm)| ziS610t4CF`9`W9C0CIPM?-M#eBPkLS&IgnIqV`bCRQXML*rQ&N^_~Q&2O2>RYv>Jg5us1OUkV#2_|>*g4wOsmDH#=0@X3064MaCWzSD= zwIS>-sqR8QEOxAd)+_>4S^DGeX8+jgR>l)QQb!3@X*i`DoNDMPSE?>26;A-$OBTY^ z7kp!URJt=&ZO<7!E1wh5){bTl<$6Nf0;jk_)&DMUTB zD2_c9PCYuG6V8EfTd%o}*v477+e_OrN;c5lTI3$;S^FC{5CHxlPEGtWANCw&$>w0{ z;Zgz@F)JNh$T>G~D+ZZBAgGc4i%>aY4 z$iIfe8u9m+a2CWH;<@U52N{ASTd%*s3a3#rbhB zicfY2w*YX~>AgDldtlDcBwb#PZ!GQSS;(a7e~YeBOgJyJ-|36|a%~-(vOUG5w8XLP zOS{6Tw$C*-p1VTBYI7KRL+yIMGa!?v?Hul)VW&olK}zsb5_1{JchI-bf(lpWSu!rC z$Hty}#q8Bjlz+K)A^O#LE<)$S;YK`Oe@TtJkffa`o+LTK74@#JXP24lUAt7}Da0VK zF{G`K*{vVuQ7-U@(?i~hAM(V+{W!^tbT1UZbT4?zRPTddmI5Z`rcJ?5Higd0#k?R`=~qnLG@ zf~E4dJl@9H_#i$!G=~fx#{?@rI`mw$Wk91z7{+Pjrt%hDR(V2;$g(>_%8gjnU*q%Z zl9(SYnp0c`-60a%X2;wnOWY{lNK~N#F^VXK6HV5lhSb!}>g}5`_u?W!e|vp2iBjH+9pyCEP0mVgYxpQ1B%==)Jn=&UoTgM_xfMq=pX?xh?Je(a@h(#q zvSg58NpzbLRsd6Z@Yq?u6UrBLxu-3=svAdas&jGz-(BCV#z>u}dcRN2aNDHKz12rk z9F|d0pzxBLWgqG;G@)t0^cGs8@mE_83us|HIP40i_LqzmUQ1Z%2;cyTfQ0#hQ{KM7D5H(H5aMLD)^`?5=SlksFWhEV(<2@;IrwG7E(jEuSn zhFq<148;-pSMf8jhRSlHv)V%gUBz$y9_Yto6M5*WS{-Z9vRM}ry@6S1<%7y|`!R>ag#vwcT#@t3wK%Y-^DpL6hws@Vze0iQ@^#wlSCX!^2wTriH?Wk(#k@>)jFt9&%}W9c9y= zTgv*BA)CnDw)NvUx~w)>E>I|tR`eU=om|xsw^VgrHVIat959cep|uH{Rm5j(Kcy|J zY|9w4OSbT)<7`mgr6GeOX}kL-O}(YZXcwyVPPgw44&I-19v^)UQRD(Pl!S|{ubYY3_l{{^s$>9O-f7sn1G4 z3cdilNUpmzA|&2QH(V6A#G&FOEpSoch3M(CSVb6C@sy`VPS@f=TRQ3vV3G6_T|r>- z__m>PsJ^O{Rb?>{DpF{?1M*7ge~bPlY~Ra>KdKe9sdjH{RXYbY3@>~qsK|!GF*a2- z&@r7P_4x1HM8cM6dNiJ=%CR{i<_yft7|m$&^UnFTFtt)H@`n5}P8IS#Ax=YrRxfon zyBtPS{_1;dBd|?R<0OK+AdiS^c>c{xYz4|Io z?uSQ1F>9!Pt|xGf-McaA#e6loim!YZ8ynPtfgHtcotasfbhN)5`M8P6+4Y)uL-&{a z>WV3h=GIhu+2vRB(dVDFZuRT&=dE}C=KpPd1vcyB<4?JgF|n(671qq>4C_C6V(znwKVKUzkbpg%~7?!_rJN$ zEg&#+7*wkR)$+SfqY7bkg$i-}+{maxoqY~af>@wbN-Puz%KahkUEoUnmc<^$jLEs) zdc&nwa{Zf9RmT?M(pjeJIEal3wvBRU9~tDHXIgfNdeQ-Eu;GgI`xS|0^5{KG?`V$e z6^WhihTqCwY=#ta<%M?_lnXz9q;T*>E^g|A2anmN#cH!7?&UxW5JK1(^! zHE9d{T4~)8Z_?SmD?HBdRWiL{r*mFLoNZBcp0`a0zcc<|SGjP)aKP-o!Kml@!1}$$ zi`x^-dwE4=ga#gpoV5G_ z^)(uLPNNV{237lH%B9zA*{m3107`RDW?I?`XLjkC)4m`(CUuIDQTC!qc4V%<&bCi) z)AoAU75AAK(Jj$uU2plR!*~oOa%fzCM46W zLM4bfmyu_3{yA1~UKZouZ;X*hXycL!7#edqsAzPdUbjO(A)_=_^>@bIfEG*%5#jFPi0 z&h4uUu7}Ie;HF%hJuUk3=j%?QF-9284+%buYXdtW;y>M*MP9M?&)0T1SFkB8FnleOVp@YqG|;wg!{X8JyT11mRZRM9rko6 zPU;`f+kO!8ghmviaEaAq>hyCgL)zYsZMVnFMX^qk%5ui+P09SDsATMBj&O zB>}mtHCrtl5XKLQH;QDwWLZcF{to3ZS^9Rn8Go8Td-@nGkweji;G z{)?AGfLEF<#ZE@|nxukQemi_`Y_b>(LOx+a@LagdvD5pFiv$?fV?Qhqce#X>k{Ysu zolU_d2?bzL$f8?`^EBlcS6oZofWq+AwE0-s@@Z3dUE^-mk1c9@qZHlkN6hT@PL5hV zP{P^H(+(>%hyzL0aNP#@sWHPE_>w_tC6?4xqJm#5w$Y)GUNB_k9d43EA22Lt*Q0T* z*_<|>G|ae+zkU}F@Wxs9v~?~@9+o`pUBUW8M2MZg+vT!qMzfuUJcq%f1mPKH-;i9en=!!&Bx)|kd zo(Fjo*m3}Fdkq1azH}>49EH{*e7c*Ln~=d`XxDiyIYQzku>s}i@F57Ht{BYH6zVbu zP+@cxDW6v+A!019Gxo4!?Nf}(G{e0?jh8j)So7eYZ?^&*wMQ5LK=A6x)Gn?7EkElv z(4c+~YXeXg@nC`JvqxbEl!ZkPfYI(!*y{vsy822-VllvLgDzN+*Hm!QRP~p&MGegl zny`6}uE+q+Ok44TR#OFlf&NH(;d6$-PeJvZN&mQY%tZ0U~T0GOnKDS-f zIFF~`F>Axecv@;7_1I0l)@g`4D8Kf&tusP9>>i7PdjQx!gAFDGRCgt7^OYHj&k+5uu{@c^q87?a}0dherMRjW22gEyh{)8dxv-{w% z|20uQh0Vyo&pVwnag1>ooG0~Z?VKHLlzwR^q=aY4(&7GL<#kUlVIFMcZW+^PAE$Y1 zv?OyZS896`TC~Q4-JZTW(&EaqacwGCvlqo={?sJY+M&ZQ+(zy5h#j~KRe%*808F3Y zpBbOlW`A4jKuISlvh6y6hGQk!Ut2=!*O0BccD#SXgx%|BWQtb5`YCUrZ;UO`nUr?y zh-*OQB783*FB~9)XHwaCuy1@FkcM40a0Kk3qV*c#7U!M_ZSwXy)wL!)G`1v#x_o-Q zylcZ=?Q-FAZN+WRl+?XGqwsSfZz)18M{GJ%tyRKI=9yK&;s0&@4xQmIJKEuWxm48l zULY{;(4<8o?C^Uy(`94tcdl=C$lUYDZ@rkKQiHi8H!MEDIx-q|a5PplF9eFTFW)tb z(&YNquhA~PYpcAJ0tZ>__ut7ZQmJhRkO!OjdDB=U)YjcS2b7Mb)IPNM_HMS{#7wJbpD^U`JAN zJbkpM*5gk@4pG@S&{j%o>hii?JjXFnFN!kXg><>$Gmo~u)~DWmN2;*vn@SVmRW3Ij z4w3`NVP z0l49h5asY_j02wiWw)I}GJIAD0iOlgNT&QL(x_?p3VNgu{2s;Ejwtz)KSva43@ptB z9=2iOzrYdtvZTs)w*Q<%Hq|ybm+&gm6;N~UlRah`5RKpxTlR?CxYt!)$X#qh4_MPB zx!YcQaww$(Ai64y(;yOHaBNq9{3%4vTl02fUa4&aM07V?4rj1xBPwR_VNW3dD?d9p zJG#HdU&d9+b##=(D&NKOzyEH4#h)&ru!Qq&z?^^|ktcuMS+&4r^iu(k(*W$8$|NJb z4;@A908$_Y$_LHMER8>q2oMX(F4PWk8i`SH!fNk`@Vb74VJd;A1=ZQo>X$3vA?KnG zhRdZqYKKjQ_^n>;kzDg;`Hwx+K-ZV@#v{u4kqN8GTolEAwnY&`V*(|$BvMGqN{19o zU!Uzl_LoZ>hHfOj)>tHD{q^3scBo!Qb%*M#C@;gu6#G(aaOVcZu;XTT7*7i`lSS1q zGh)<}?4fyhIH?cOJ9?{J<^HSGZr69S_dVS=I=<`%^>X0Gk6>N76h|c6VPmC2l~VIJCbI17DA*5{|Qg8Mi^LzOWHor)Ywp}txF1{b`jk9-)+d!j^lNw^&4 zjwg1GMO+BOKneC&`JzJySqV;XqMc!ohY#s4OvtT!|tl3EG z9DI>10@gh)M~|!#HkW>(Re;XH4{lEdgp84~l}< zHz?r685K7LTQgS(lXRr1_X4nq(Gg6;yyUTK6N*O?*BUs@?^bLg(R_nr%4}Af)?4VS z;wVkRms@W*xX?V4<0Q0`PP4&>thwHjn#jh3D5G3N=iwGt4Q$}Uafb5LSw@&ia(B#~ zm-H+i3QkM%)S1MQ(>jv%84$f2UDZDQZ{OCn|GGRR@>)!RY18r6!6Bt~{^~JkKR6x+*4y%w5GsnIO8O40tG%AI*iyn;Iqm@ zSCjzr*94&2YptJObEd12;%-3*!}vu!ZqOW5-%lWL`jm*oGb4^V73t)jV^7;nXMps= zgfkmwm4qK-3uI_y=i#3vRRC_drjf^B_DZu%8d!{?Fc2b}3)8Jb>~go4fuGz!z(3Qg zQQPTO#j=uEjzk*MP=Z|xLx)*AOo+iaB1rc;QFFYh%xv4l`hYkO`m16QRbMcICyN|G z(7?c6$qG4f(8L}V(jryVr4@KA3jW%9#$=)OtrQxDliu-U)VcS$kr3T~giNiixVU&s zxnSv^wc8@G*^)!WB)|l%s23)!8BvfxH0q6&0WG|dA|5S4!`X|LovHpi$!X! z^v19ct-)|mX(83SuURgZaNp)SRNz(|dMfl0=$UMTV_HNX$9`O%#QMCs9xmZBOoEZ& z#I~*53Nps#mm)-5*(s+d0rIUwb0oPLKU2TK*S&XenhnBk4KFk zb)6<%n#LOef|8hBzX*AZ6{A;-X3B)we`)T%rbbnmZBZ~l#zGO|u0yxS=`LHWV^%<_ z@_y6!DOhH!1?6(c45}{$+x$}XdYvzXp#5k#BW8UNe``GO7;bcx@zrhP*nL7Bv#wbU z`=#=2@u9ulRM_%nc?*)71Cts@6&2C)>=NOKl%!`W#c&)g(zaFRh-|Pccj_uIDSkBh z(P&nHV1aXfq~w4joZZ4UExF?e>cc}AGPR{FXGLANybS_p1%&n-Rpf()=k`voi#VQN zwR&iKN3+$Ea0nHF7YP-9xF!SLS`B+wRXDR$0nQxqd542`d*+m zrGg#Nlsz{c!$~Z8H$U-mt~{nRM70+wYR{0me}g#_;}cc)#T%VLIMt4N+CM&O?Vmu10+Ja5oxy^Lw=wSXq8yl$F)wTN zFH!ny0nuAp<#op%QbSpGg61*uzK3g&$#GarD zGQbz(eq(f3lrCqPs--zTLn#lliGf|Oq+{|o^~T?@!KAbQg-}h0wNU^VC;&F%M7UJ8 zcvD3O&7N*QO_GBPnvu&%3Ma3dnXLp*^b(<2*5N~9g*a_-boao6P8^b(d$^}w&a!;g zAUe)rf%Q_x$mPo4h@eWW;|=V$!t(~`J$zf)Yv;YluZWaWGG2eoZ>18PgU)8fDRk{@ zr1|0y^*Q+I`UIy8*;89CdHD>a#@D!A^78RU_(g40;l#d7(kO(*j^cY!nA~IB&`Qaw z5iVy~WNaZtbgZ0P<(I1k37nTpZGsqzEPvqLT7{7c(|w44il0RcR-J$}Y_`U(yiNk{ zOgJNVS<_qd`*4BN6v7(PD9M;8Fca(8Uf?#>ZZ;S7e+Ur+#E`6$xGKFtg4?3|YH#ng z5Rv7M;EU*olxzgqT2fZjh*3M?je!tNb)h7|Vys=OH)wRxaH2^!zE4r9vY zlCS0LnU2lY{y6ITGF5*U00cEU$)zJtW(WxJE>8j2a3@tjy(;qc)k1jy-6|C z1|id^{-k4tMuK#HTz)`}<9a4T_WPiHLD>_&7tDfAy>rQ)bk|pRy`ZWYU77y1b^f5; zV$Gf~Eo>UU|Gr^eNW$$|r<9uFZhk;mil5<7A`;bbyD;=wjI*}t)og4UFuWuJon475 z*){U87?UF|@f~rEFuQUi7||E*FPb_WG)+#a(#`c#WbP#tn=8rg_+s)iUT<|rA`HsTu&YmHXyM&p zgTHhLgR#$gmv%XanDx9GL~t)oVty&Z4Xl5B8u_)KMp|RU#{V#8`(-B*Tbv~5%Lwp| zBS5TJ1r?a*+^A!20SsZf5r{UTKN7>9xU=|H+r zeusmTMeE2xLhB+j5RbhE(KzE{1m1@95#hHCW%OCxPyT4XM1-3Snfk~)i}9DB52^Nb zJ4LyF_`4~ATY^m)Xu^#KYXb8-lK0|cFfg`~F=(9`NGhnU+Uv)tF=(^$vLvL7EKv(+ zcj37EPWgAmJIPPZ&!P_`KL@XS4QnK;A$<;T2+IeK7QL)u+9LRczjiko4@H}3$?GI-oJ!=skJ zmfT0BA~hHgw9$v_GHQf!Vf`B07FXNr#K_t$H54{9Z{n`sHwWS74OcsohIkkI8_zwl zcXf5(H^7Z>phr5zJAQ)v05!uw;jD(IrNgV3>Wk)eHyTX^bdPK4y(&eS^T)Qp`6ZWQ zqv7}3jmGB$^14GFPi9?!j3fPwm_a6T$+#EQmJ__0t#88y<06X09*SB)4ox#N>b&Lo z9g5Zw7y)cQk_JgR)D-YWG-D2UBhO*^IT-5-WV7$a82JrPTyJ=)utISurlq>~rD1Q$ z8lVlqv)W*&b^XEftu+s?Y<2X~1*bSu7Yy?IvW*apZXt}%f>IFjnD~>N+e}$l`h^3?m>o>OilPAGg?Bypx37k)n%Z$pu!Be7wU!L- z_-xjU&G`m_r?75tPu;fZyZjkvw0{(Ndu3WRAHRQzg~kf;j$2Ab7YN4~g}DWmPq>+=SM&XKUIMt4lO7Sa&-J=Sm_F zNC*?eMM`6BCqq|X;UkGP(&?pP1$bh=+emP%Z$lkqVA(Bj-;H5Sp!FDL^(^Nr}vli0bzzhU|TT`(Ro1LA_SX%f(gtvW; z-A4z&;pS!&w1{9R;{oFD&Nm6KDAASK+_v$#b>T#hLnHHtrjI{|-|4 z>KE>8PR9jzj;`x}AR}_zYlbV{MmTM9&Z;!pG4Ddq*gkAWMM_I+^oXi zIju&5$T_C>Kzsav-2n&B&p-I{E6%n+V}tv`TP*j4^PT|4PeP@u3^2)-rSd(6sLKb$ z0Y<@R*^+7SmWTi$sXQdIAs4eTED-E{;whvPuPBUGDvaO{cfZ@X`yE`#PJ91e^;6q- zt84NBwjzFY4J85VHad5|10TgxyNPxvoZre^BJ_cvnp;7FRh;h7Y#LWofFhu`W-Phe z%PA4$u$OhKZ~$|}#^)~?!P)98z+sr`J%Y6a2<#blY#&VwBZ+j3Fc1e@yz$N5{I2;O zNXixi1n9|YK$@h)>J&46Z@ zln#9vw(;{8NnoCT7{8cJh(~tu3AIGPeVk5WzXPdk9 zW91;Ix+bA8fV7i&>w|~)1=g%}omMVWs6nDkGerdMQQs|vN;=ujXhdAZRWyYhn4+gp zD`Hgxoinvd0KV3@Mq-oLr4feCijF#`j`$nx$0wN3C9_;$F~YVqY6^O`=&JKUboQ{h z$t`6ZFcLVQ6LeR!649&(=z~d1FpiaXmqrTzB}l6-pozLG0U}JEU{gb^W$P4BPgu3E zuHhb5ZzXl;6tJJjIM2;_TTycAk0*YMiHGl_<6`rf1PPd(j(C*H_m)qf5|pS@LaQ{G?goPF6NDUku^6Cz}RuO z79xI(1oWD9dI7Ya$>gro1J8rJN?fi_Un1R?;#S1@!lQr?&LW!vAu%PK(UX@ZG-s#b zM1vn!HQ*X@#K7^yozAP13`U4UAW@IK#D94Xii<s+5Oo+h_OP>}?P`-me#-V5fpqSE5*OpMm z^Zwr0Z(H{2P6yis$=K8zyFDs*+np)!Oq`aoi^%!STgK@zV0Yqu1Vi>?5s$+-p@a&Q zh0HHTF_DoXX5%9YIyu5~WdG6U_K%YyK8Wd|N*p9iVvR1DsjtRQ9CV4tHF@n9X6u#? zw27|Bj&03)z!AvcDx5;IVga0ONy=g%5tBSB=LLLgkd<(=vGtI!_Q#FA^27te0<)#d zA%Ap(uZdzY6=q4cP+Vt>-HJx)?#M-RtUFXj$a&WiDwBm!jK_}=uN6SPXoF4f4H*MV zit|x)*7?sL7kY=P^{NijA>K(EgoC9GOvq+Od_8$w1&9}j$l_T8FR4||X&KaHZ=r7r|hSbFEBI|s{Ox&fUd z!TOAYtv1_czBoSA0t+2Ra!&eRqn#?pQ3oTRMmyoetMZkw!Q0{P)D9<; z_v&A94SI@|7mteFD{$CTr?+&oM1hK3{dNjRnSwZn6o9GZfK=@E!T|xkJfck84OA&; zg|aK@I=MF zpky6f|E^p>vR$=*jUTGlL9XDoK3N;l)I~HDgqavGl2X3xKF9scGQ`gY7;TNZE3yo6 z}PJV7DdZ6LXP znZu=^WE93OcxKOMo{0PEN**99J~-qVJh9B7#KG7zu%yb@d?+*z8g50LXJmu8_X1nS&IC_0@am>a`o#7G})98%? zjcAD`6@6U}MYZPJYQ0JT>CMPnh)C~^k4^{ACIm_FpsILj7A>Ngg1{t4!r}aaw)F=Gn9UW|9lfSeqq0r5L3$q=Rq;hC7^4W|4D0}%i7^ehMaqNJ zC?TF82%=JDLc}C5vm69s*G520hPAXpYksuXxLYnxly!YgneC8QD|EwJZ@e}jur4VZ zMr-(Dpe%gzBR9`TsUKfWp18X?;jqP>IqpTAI%y4~I?NEqD^zxbcr`Ya~~R370S_mUk7{p$!!4xo6?Rl5sL zsbTgjCu*F<9<&?iSmW^~bnQPMo5A?aoBtSyA2>8Op3;)Myp!T7@gu~(X(Z9jgSGf8 zd)ee9gYFbIfGY$y@>8S8#QDY7u8#^IL{NHrVfP6>Se+l|FYpVzcY?{*90HNkx=X*^ zaP=+TWR->*kZRos^l_DfiKU(Tlxjl<5|Qxi;-w->=@*W0>6zRadd2PJXViXO;6gh{ zM6Ck#3KU7^6*jf4TwVwoy3K<~%j3@(sXr(>3(sPL2kiO%2nCL;E3H{vdE>s`S7k#% zhvSv98Z87ZUDOGnE{@8M;0hdsa=K0keELP95bJa;LuS{}DoQuegGHdsFxWhno{PD| zd(=7+#@Y}JY8s~n*^8!l7UZg6UWuka<$t7wkI@wNPkPtISs@Yk25y(8Z@;0cp%kkNZCJLQ0jWaru= z@NP1slbzQ1=ovK9c{alrGShh_uCC(H zIA|7uOBE#3)KW%BbD)LXL+_+eO}&b#ft zPO>*5a=KZwfD>Gblks1oL*Ob+8tq1!y1Ukn)Cg zh7Vz9e;McLa+oBL12Bb$U7vweIw{kB87D4G!1jxbiee1~s&GycE)I}FCu;8GcG9C> z&HfTljvQMm+jz%+or^W&(5S6W@-gSD{HLg*$bLtjTKu!&1YweK5zZ*QKI0@ljxhtR z;Bv^oVZa57j)@Y&O2Kh;aOO=4Prv<)HYN0v4c+^-Yi#(?f2cQim5c&1T^TP2iicv& z<~UUfRbr86|(U1eO_Q@sCU! zd%Dqsu*_#9=bH8}<1D4?oFkAbE(y%XC+zub-sj41{W3Ofe%5u_mUCLRZAw8WvS~kT z6Pxo*Nq<|#=i+02+^|RKuf!@go%F4AlaC}26*T(^qsZ_8<-OS+I4|m3=j{XyWo1|r zNe8Qsg>Gyl6-dN&D_-y5 zFYQaerH5K=yYJgmt2J4gnEL$ z08*zXTQOgGP!0@~S{2lGC-ZU9OuG4O?mFOHLyDzaU7~6+D?oF>3os9AMX?gPF~o4% zA=k+CPTb`%eP@Cy1^p=bK!bmPhrk%dJz@=n@8Nb>4B0By$on!!{6+X{z3Pqo$CH`A z^k;hw4ksd&3S3P5LBOS&3abr_xgnq|khF*v_0NTT=XrqDxyy#yO)WtUi(%})RB5R& ze4da?SdR*J(S43zowS|OoVMa0Xlo~^HFxjc)k7t5hm{1SW_ z<({h=A_j`VV&3DXv_l2nSkch=VoQxnf|^)67DTQ1PjaJ2TKywG_$;he9)Rk41Qom1Y2Mws9s6KAi$Kf&lWqdI#juw|Kx z?~OJV&DuXs_`J-I;sZd?ohFyPXEIhNkcWK-+spV|+sEP|`}yMLY2kv48nnc@IDE>6Zuz^s)W=NRGjUxDYyiSbt5Wm79 zwr2~N4;@U<=4eVe#iTZ}`XB?t0j=ThUHs*M3v^H!G5XkW5~zBKy-s8d7h=X# z2<8J}i|F*WH(U@-RB1%oNlCzh(iz88tYZkHqKo3@O#;!Yrk^3Dl8>jat*j00?&fAA zl5u@0Oxye0#Kf^G`+?LJ?L{CK8-QZ5uu)?iKua9lxWv=eD!EIn3K1dh+Cutf)-!4; zZ||3y6fGE9{oM-Ie5e3g+%e7vIdZoSbV$`r^_y zY3|zqd_c}16MNz#FGnqu84L(*Ny4xrPg=gSNV>Mo3E7pxn^-f6Z;gPLVdLz*^v&b4 zTWfcbyY`pIqTVylEr}PyUwE6_%4C^L9?J2WBOd`Gm)-$Et6m4!>4FUpQz~4IVJJ!Q zSeZ;7K&7J`am4@}w58;ZB4kwb(0QpM|Gt`1I zjT^R|W=@nzl`#(C?sYivqSi`bu{!(##liCB8#Pczh&(N zg3$)ee6-bZmMa$|0+nnO@s}XJ%G{< zbYEE}?8c==1E1iE#dqns z8BF!48=g2H(2`;ty>NN;TnCc!(DOmnw&Oz!T?2z!1*R&liBVX8te;v-Zx6|&Ir1zm z+qE!o|FY10s8dT5scF;JMVdQ(KJ*j^y!ep(GjaXwJC3!v?j@#IZ@Zg9hfZuB~BCVnt zCvF2u#KtwCL~+nY0x3(l_AS&cPj*m{iV@ef`%334f3Gx*p2HeW%w53-LBq>17<)!! z#Sq0tUx+5=Qh6ARxGL>Bb|i*>X%L}kz*vUJiu{$VI}JAx1p{7GI7Srp zO};;u0qZbJuuO>8aJ`9#ZWf>x*7(N$B~D7xX1kIJV+{#Na6Mz9e5n*)U3}m@X|0Zh z?5A)9`5Qsr;+GI~Icj%;7Do*T3A@FbABx7X2nXH!;`9Nw831RUST+TvnD zP{LyAF!f#!h2n>33`lL)xhnyRme+&kX?fRS0EvVX*Nj)_03|VquhP247md$&CWve> zLhixosjm8hwf0#kSLO18rE^(0@!D>ECEO&IJI>4PIDB%YCM19B&LeAzNLPENHSkBH{E2>uDR$rJxAAQ=jHQzO{vgkK4=};BvU}UMO zwiY)=C#_W6pOEF7opK}d1eOdTA@;&!)dv?b2|^CXKlw~jFXRw5n_{qh_WI{rbex&X zf>qLwFhU=76Jv`sgBV7^FhgAO>YCg2!j)zz8x}*;C0;Dxf8247z)WI#lXN3WNSu94 zuM^vBn;81Gm-0x;#hhIh>s%@5uPF+LqHFbOJRnt6h|Q2~Z_q$J14Q!)N~5=y1+y;S zA`T*o_jJ&z#rkJZcS*jOOD#w@SaYFHVu@H`AAES(X#IxTnRN=kU6Glas&*I(U0wax z|My=;SUx%l*}SUMFk}hhOc^y8teHsz3%TywnGhczZMx}2@*t|P>7~GGGCLZ~j40*s zSY^pNN!S&hxr{_`mo^Qz2GQ=i@>V-#IOHSlPTAk>$n1YI4%1E5eT2nRbG<&EAqP;7 zkyBjZqO~Y5utOrJJ=Cdke$ZUXg5pSO*x8$_qQN3wQn!wJ7rj@|=jX%03^Oe9TdJ3J zqh;n;b^U~9=J}XN546k&Gq85Hg@|ulwUZCG9#c!j2At;NRXW2tY$d$cgW0S{tVP*U zkzX*|_%tqwrcAgd!uD!r1(Xd%NJ^ZfNI14iZ-TJf;@I$yxD+ekK=l+DJI9uj*;Mw9 zxNz_n7xUSeXmO6~KQ~;f;I%7oXID&!@l~6m{~gpm%VxnxLJCF%-TsXIN-;taB>tY{ zV{ceBU_ks-H_!ErvI}0an#2yX5a#E%uwR~hc!Y1Q7E{~~+h@K4*B2n5u-GdLvxm_i zslt46WM^G+!?;Ry!-jKOAr`SWjv#|y}`QxSLWz#ONF`D#o*S_tT!UH*GRSH#|v19;*es?qj(J!yDO!3t(3Q8F}P56 zpvk;Qg`Jjx=7QO^X>o21$vSwhrMZg*R#@GO*(byO2aAUX>V#}eJrWi&G!IU7;8)b1 z77fB^#RPB@S$@rArk^;zd&X&$I(UFm0oxMX!DjPjFCDcTppP5(2z(taZ*Md(OY!0u zx9z>X5f!lhY(b7{T2ltB=vY;a85u!iKHz3J0}|V=UZl@NYa#6kk=H6A7pK7jlO+&J zLWR6MVRROPR!e5}@zK3IBv)%({#9WG!lF~zP#&^1M|mJF-zm}jG|Qk$M24K9*bA=B zQgx|CTqr*n4zY58|C)S&{;6sGpCKiwEtXTeEY|K>Z-nE*`lDd=IqbZs*G|qxZa(M| z?iyUvi6qahwc*Lf!BKndRB{TUmakn*ruxg06Ch#M@6d3gWIE%Vf(OmKKTBR z&7ZbTe|Y}r^!UM#4<0_yf4Wb;d-z~y@4(_o_MQ`N$2d|z^Nb~#LO)(Ji@ zo;7)8e?={Ci5#E6+>fgZi&l#Wca7^EiYfP+C&9Mn*Lg7Idgt%CS~-RM*2Vm}+o#s8 zPT6|e1CGqj=|Jm_k%@_t_j_mDTTxX!@BB{Dda=?h&+L;R3Yz!lBNJylAcVl z8xI(bcM`KI1cjvx&Dp&3xLkD}Ygj&v9zqTD-H>B;Iqp8fs34PBzdfusE_WXRJR_c( z`ijahZHZnQeD>P7t~i0yB)g!n4R)OwFjqqMUBwX-7UTnaO~-%|Gw6| zOWB?Cey#cKUFv)5-&(gLGMDrEkE%EVO?<#B?%VIw-w_Y=_5?dLo@hWq3ZCf9s?e7w z)oA{azP#oi)z0i>eDShBqoF_2(C%2_7kH*E5`L17tJeIEy6sx?`#Y@~X!bAsfofKhpqR-T8B9 z;Li-dso$ZYzl4S~2sNZJ{1*$RrF_d@t>fSRrUweV(_aewhyF5E8{_xi-qosVP4q~= zz83mH8DBO1V2EMC`1L2M#O2UWs`*OmM_hkBGk)z%X#P)3BX89A-+sGAJ7I}GH=oNF z;Q5eSpMMeDKAgPe?;rpCuH#RC`Tkw!B`#3oQT@4`X@aH7ug9J5zia<`e6RDDE&h1L zUyoy1liKJM2&L42JR-Tq6yb3FJFjX0`BU%V8aQy9y4YUihaXVdP90qQi^EC! z6u?GkaWhp?Cviynkn8A6F{p)Yw9e8_`-(Xxvt72&0YZE*FB$xKPeiZ(e#~#_dgAXN z!tZ^tHxYKM-T39jYygoJK*YYNjlfh?Km3$GKy}A1-tyLg>M4mg;@fxW?K9kyX$!7R4y)HNQ zg}tr9$9{TO0*64`At`RMHM^5u7d!m3y^LqSx}f=+aEC*X(#AX=LR z2zrfxD}A?7?NRYPvF9|g*vTv2T}XfgzcWx*Y2Tjn1xjsfrR`v|pvB2PJ6b;2yjwok zyj(uk;blD4{45VOKUbb<-iO0mo^;+WA9P;YMrnU2?E6qTn&o+}9!>j_;DnYc$2md@ z@2jUd)>yF_D~|JZrQ)g9_i$UUIP!E}o_Kzi2cDntR9DY?@gW@dF0a(p%Co-wEgW|~ zET48>E+2MYE&`@;ux5T!EM+;>*SSPoQw{SAI3s*rL>UJ5D9gU2rei^n!f$_Uj6i>80us<1%;X#hp&L&4E z!;`^mZ45Ko!YqjlRe?v6Lax`b+mlqSzOd7YzkqVU2vbsi|c<8P5l* zMo7cjty{Nhc!AiBy=Lvj5{V0&%Ebc-lC&;$EVLTUPY>}ufSQ)&cn|>=CgYyn3!!_+ zo;R`-?j|WDi&}j@n%G-Ygxqbk>|L~C8WDNQrRAZ3kFl*)A!iW*)lHhyCD7tN>BJN4 zDB0txfF8`}9Bn2<;@TmXK7`=;8pOSCX)*CM-(4;JoUG!z@91tfnM4$uHcWo=NPs&p zkd(T{Kw-?~_KWq9{@^3T?B*C$YRFi0AP)$3UA6H9_04!>rgHk?vvd%vok0hm_@}5W zw%B;#vl|W_SpgiWGF@TPeo_ZO!QPtACKnS)?olE;U*lt{R#@-U-cGE-nyF0Q)xrSR ze2!)7=AD?1zXL#}wH3gy+zJvBZ-^y{R&HxMr9b)ulM-pa33h+`~IvXFLQyVrtY z>)m=k_#~byZI4VAbp~-a(<4_!cyf_|zZFxOWg9=yksF(-Gt^W;4!kx;QF5_2KsZjQ zG;3<%%-4Tni-pZ7gic5pi6>d&P~Jwdh!m_wC`XM@H`LIu7LbNaff1DmgQbD^OumFo zezh4H7$7lCi`40S`$xAz>dmT#g+p<_sa#sj;LR@c6jtH~uDN4IvAuq$g>>+}uRM)f zn`{C@vLrz~Hkz!e0&L1iCP|SvB87%_c~6H7;vL@Fslt(+uqZQMvhKwGw|w&QsEWEoMNu%G9UDPxwK*G&dtfrhsEYq>ImdKdDd}D=O|L+9 z3^I&aU5qhhtP$1sLHkY=ip8L;aU_bU;UmByd0#Fq`?$0SL1z%Y?8K)RX;$7C42y6O{DP~XA`JgGsE=e@hom^Y4D zQrS?jij);WHR~nXQqq{#dL{&bud#SL*kGoed>WchffWD*(-a{=51Mq2Yfzj|J7gL( zR6pu`#E@Ky5q3S5G)aE4)SJ??h5u-UxFx*6i(!YE{)TlBA@ER#?k^3_BPoSa3Z%8r zNf?eV?m=gOW=l)4+fjcQo94A79jjYx?R7r(D0P4;5s;cvcCS$U-AMA)Q0j)2>U8!n zdRrXwwgXp7G5&Br+|?W~#`bmPpzU_ppkZ?t^Ae9wO+FnBOy#L$fEg$i5jU?fnb{=( z_~%Hz#FtBxX%WCxTN%1)g*`2{@|EdU40{^|GSwa_m-X@a! zDONfMom~-ezOZR!xAy@h^w_q*cDR<8NJo=kbNNu&-tQ?NQ#fXw4v2db5ty%nZt?ZWMe|>?bRz#X+pe^@U*|iBBOU`X{n{xC9r7`qi}v9FRDSd3 z;ULq&homMD00=C87yx*OgLln;4tRH8sOg7+FWS0r)9FR$pM!0(6Z*dG*Lh@Rv>#eN z%IYxR>zrbNaC&i%-?ATuK~lBwwY9HuTo+VQQbcPiRq+Nh)DEc3Xjn3=Fi7xKACVrQ z-#oDXi1!ts`*dI^7<&wz1mCXxde|ZxUMM&X_AThBb!aeW#(cg4c~Y8tS88gD1f%gD zq~G1TY&aN7V;eskb49S@gn@n%!?q3|H5a6}*;Fgj6s|ss@?8!(YDHJp)?VgCcX{%yiVX^)P(IQm+e9b^ z+|@rfozRf{?5h@_Y*7RAHvK@Ns;6yilYBWm%VE7?A8p*JM|CH$%KuWAaTswzg=prh zdlB#%9c%g=#F9$Z7i?G1>)WNh@g0OGM%xp8mK?Hvd8%0u{}^)%qFI;;K%~HY+55iU zzD_F!XtJZPT8ID12-%TfbtKe@tw1orF#YWYO5!ifAg-<^LhLYLMl$hLLw0{(88b=7 zwYr49s6<7szPf0oNNhC;+gI1A2-j36>swY=;FyAUQ>!^RoM4pGf|*cgWQU6@;erzT ztZE{kXRoi;O#1#+O<)a?%?`3X=nLcUGBRLfm(hH1LoQdC=A87-TO>Z#m{XrGrQ`db zbo@AX{1ttE?Lu8M%YPW9`TMinET(zwDe491fV9Djou*S|W;$Iv+N(}}MB*!s|G#;- z@O!&R`*R(B`oA&mg+sqIuKzyReC?wCJLq(c(BH@0lw9L>G|iP@(7<%0H^V0I_TOIK zZfuu;3bHC!8cq4i)2nmya~*EWvW3Wl&`*vOGheDvso+ZUFBMk@Q|uMIgQ#HpQjJOl z-8R?5istad=Fq2{ccB_zI2K-oK8hNX)A`x>t9r4Lp&xtxs-B8kQv7{QPai1f{bYUD z^^5kT&V)u%ffseYrkkRUM)ozci6eu6(o(w?bM?@i#tIvRoNP+)JB!~E>Y6s~%T;beuyr*Z~N!Yz_MUjiCUIyoooNcyOibE%gIpoE|r>5W*A&{ z<9^tS{=i3$3ee4IXffL0+!8Y4JVr) zdZ_C9E4>8f^EzRxGRrNk*>zT-FmvncW)oWB=uqUyJ=JJ`PZDc_T2GtjjGb6?B$529 zl$zPi9)_1(Iwmvl;$(~HAH$w2IT8Y}t;UMa%C?f$`X@z}QILL6%7Y7Qp6a;mmoM%% zny>kE3Qg%9@Pb^c8)@B;8_TI-%?7Aq$}NK|)f^O^Z{4xZb5m-PnmkmaJ$zy3jJDVS_8m*9(J(PYiasT1(=fk#)lWQf8u&&p*eaTy!o) z)O9ik`(FT;LZ3a9z@9Xo#4-w}*>`B=oQZ`-zFrT7=+DkT#(-VKn_C9Yq*PmBw;WH; zQzlq9s4V$y2~Ff=m2?EnXbQ7x4blYC3f6IJYoc0{0iaG@)p~Aq8w-Wtu&`MSez9xL zpDfEo(35uvnpx;3$jktgSvVG@{y|TG^CucpG;$=EPYpUNu)4vMyI;{DN(9NQa*IwN z#ufuZCHT=83G!+Ciu~ALnUI@&E_QgTiU_5yn|eGB(>I_Xa-5qI_n9O*xL=n)P&-QVhsCtevAH&rBOmmp(u4-Rsjc!&IMHV}<*3fn-quPp zf!lxkk7xxl*NyC}N#9gAyZqM6hp_3zNFL?3r~h*S#7Z!+z0QCX*>0z~XQZGo@J zMk%?$bVH$idqf}z&e3n=?%(6l?7i{5>1XgCaQh zU$Sl6&twlI{FIiQ9S%)A)^YBu(a-pzS(U|-`JBs?C)!8c{`+Y1_QB?Vz6(}An4pje zU?Lx}2*2Jo4YyXdTN!~$t>4KT^FAG~P|RoZA4G22kn#WTPR4y>whZbrjQ`AfI&^!U zE5Y^LSAInOjqv7d)8}*>gls z@7*EXXJN{4_fIzk**+x;J1*R0*iRB+HcrMSP{^@w$6we<-1%Ns5^=MwM!y4e$Zfif z5k`G?tJB{edQzNqjK!$)=Rcz{`BhN~K5!PJ9SLHkWJj{XNit*&fLmAKPeNDH#s~iI zP5$wF%_k0n*QqsPl1G2Hg4|yHmi$a=94D&I9gXq!-wv~{)FwV8=Y(=Nnf>iBz*b%l zU6zt5_Z4W&Jh*P&eEv|(LIxdvr#;RXBh+j^WuvetW|@PFTGclNG`gIY@!Q@S0jxrSiH`CC~T3U^+pM zV1@Cy|9`M$aWK*~2z=@bP?H<@;eY2)tk)O3_lf%z{rU?q0c70liTrT_rf8!SDWxF7yw;ZX~G%2MCB-nKai`MqasO!0sRG#MlGgIBZ!sEkT<$4Q@Eb zv`Va^USj@b4iXmtQIl$aJ4A6`2OBBOz!VgjVbQ&+C*!@rCya;B&xO4)FcYf&@UZho zG#wANIuW8G(PZ0lfzNh~$bg}FOk_dovWp3sLO!=2Y!!xe{mGeJQkR+vh%vRe@!{cp zqS9bd6vDC4wDM)!s#z)Tz%ylk95%b;v5x@1Z}>LuL2_V@mtYsNstcLvLqP#A!+`Dj z$6=>S-gI#Xn9ZL|PZ2t{K2rAMa#M64h=}*=rt6=7&~O?N!U9)?GOZ^N>dT z;{w!zP14>tT2Ih7yoD6y|rlN zd^`Z^6a;Xa4OC8<=!8^j!_&_j(dl1g3Rh9|&p&t8HU}OEWN-Oe4Wn z(g-*WYHPc{-PL=4+xnT(;xXbP+`MT=vqjOn+iHYJ^6U;)XvBT_oi$mGRzQ4jGXtzY zgW!o*V?2IcY>gp)pAE($@LR{Ml)_XL7XlLqge?nXD>%Y@@)YBrT7+*=HUSK``S{2o za%0rehXC2koKLSD%t=(tvcp%h6z*WCXqI=kYtK%OApCF^G0CptAT}R~u*P1IB++bH zrowg%-~tatxR6L&(a}x^9%|Vpo{Zq;EXE+$Iw4ZF`vKv#ur>!VPl-@;67qk?E%=C)TRcoUl#xK; zw3=CLJ5(BNBP}%E^M>0+>Kk^i+fOxANoK%fyZJdUhZS%h&d%{vGjf)Y*@13%I?8*RkJv8Q z*)}U8rV4hJG}KRl;cTGl6+oeO()+<_?-TDI;>m7lM`_GlB_50LH>q=IV6h;r2p6#r zqWh+|VxS6ieS_JfKq`~7P-LL!LsAj{ZaD!@tx1M8D;cMREeIRPFyvj^UGZ_^&5yXI zz{o4i+ zFOB=1JKV2D_@cxK%SGsO`+8_Wwv?bkH++Pa9puXjvC@G($fsLj5UyF6>Zbp0xwPq4 z^14l5`WQAn4S5+piGi2#NwJ@Su3Xp(3me3y#R1qsa;&l9CDPj1;@U$9H4}ndauEob z7}kzL0?~WO-RB?!T@?E6D#0)ePp4@5L=iNxjN$i%He?2-_lo3Fu?^EpHw%lBM%~CX z7WxQdKx<*9@gS#S_=boA&fy@~nGUG6L_T(m+MF+%)g`&p+y~4Ef()|VB`B+7Mh!on zKF(G=Y4TUHq8YWqFYbd|w|6?b811)qj4)=QEJ#wzkS$HaCJlXKCBlZq5sJ03H3|Xn2LO?D_>OKkKJz|ySbI`GUT5ybsPzO|*?k)+A| z*TDSDwtP~8tM@0Gjhf-W!)Wkn4NH>U)N7(gu$0O&>sMszm5as-T#1a>x&hs)%EZM!OW#}|{IPX-?Z9A;>1 zi}7aM*=e4S{X{14Xfz+sI&a4D81B#7fYN#T{dfko1)`aCcxT!|ioclEsS)({sVs{W z$^{K0CI3NqyRnmPp?;t+&t?g`#mP3>XEV7?J`fETb^?SvVt`D2#>vVHbvDyta5h|W z@&>=nNGc(6eMr_jIa9)|an1h(8vv%m2)~Fcc{;F@BOu`CyLI#8Se)SN@7G=*}%RekIn1^vdlO%6T=+>2NiaJpoR(aX&^k9-JV32GpoW(wmc6<^3 zENGEMT>#Bu_FV1$b%CeV?E%=Zr-`N(%)^|@9u52`1k&nf!hsMr@K+#RoSh^yXKqDF7v(N^Q8^L zTyM5-*wVFbux9d)d9&m>7|Bv!upY+>NkrJl(*a3s14`AOq`3#};o-v0X8_s@gf}m3 z-ry`Pq+BwPgAUFy5lYXpF9^I8ob-yk-1?0h_qhd*OeQm3uADA5!PVivoDTX)#lNx9^>yB5L~(k3 zMWj?L$#XKwX&k%Is@ILvCw;#Yq?8Ap4^YJ>HAULEm**T>x8BukU}GMWaY!0|97Oln z%%CBYs9h5*C8CIv#s6G}iUCkU9v|*n1+0@wIPq{#43rv|$h^}U(7@HzPrBmufUsS> zgQS5H#}a9AUgPyMDPiKGtrFQXu+&RvEDp)``9A-qf3|tP`L~xFw@0{A%N8xl&n}J$ESZbe|98!(n_pRZhd0@J`Bvdo^5jhh+MWjuzr##2nq{B7NHExgXH zI_J#AzGRW_+4v~f9M)^U^+?=J6s02EqoueH5T>xko@ZMDFpa&W65&s%V=|{S0;|Tc~7HO*i#C(E2p*@-4RL?_Zx>9An@~>?Wx^>Bww%cS8&}@wU7RJQ86M zv$zmM`AMo@?H2#OR-(1kr;toCJ6t(zj<=6I6lIaI=I~7#iAj^|zeLYw9SH}m=aWiU zZ%{}y&D{m%gpdIT%IdHlqhcWdj={vFuAe7(DM_s{n4U+iB>^2WY?|Gl2S|C9a8 z*C7Fp`FA+{3r+K<|BjPZ0uZ$Mr7m_etUuV`$x?;MV%m~d zUGac@Isc6O81y;YLo~d{NVOIx{o<53p~sU`;>8nQ;chXEc%bnn$<-sAnxbuX((j_c z5SThh8h(6v@d-Ug^9=2V@EZTawoU3pg(d?APzCpjQ>LsC3n7MbGi&|cc#Rk^YxPfq zi^dv0;s``A`#rL_KWnr3cnov3rXEPIok9J4IygOrM6i3{PBAGd(9)6Sw%wH?HQ2=v zyC>Enb8Vbc4-5PLWG0$S$MI|1Dyl6u)|;{(rl%J`| z@*MQ|37@$y3j2sSFivax6Nr5W1J7H%3x6M4J znCrFTjR6<7zK!j)fHe z0qX}HA~^Ohw|>sa=7@m7(8o`=`&iV*`@qYGMl~hzpadGI~tQtzY==a9{XWeoHs= zr7H3;s?^bo3}wX{FU&{>H#fboO?i|2!?_gIRrs|V>uK6T!t_!gLPqZP@nm)eK$=xk zwD06ZM3jM>T&i?_Jo(_h^Ga+7_YQ`LKsQXK%)~Q%oQ$83yA@i`(Wbh8eL}oOv@l%^ z%i^#s&xOW({$emoZKTiV-X(#%p7lPN4T#pvP5~&^@`S8dL@W`As)dl~9E=GCH5P;v zyXG{mB41-svh+SS4Bi(S7BOTU0sw=-_$SLd^0aq2Ac*J+vWUFlis4oB;5s^75mvm{ zrB)WZp}1}m!`iFnMi`%kCWDD>!edcatW|8jcxZ#in0g`IM~P`{r5>_J?|%Z15_$St z-!)%CKMBt;zdRvYb@|1^dkfGqG`JOzLydoDXSKsNoLmkK(tDZRP@C)vqW1LWk#u1B z)$ml1IwltP*skE_rv!EA`U#fh=}>K*@~0^#>qun>GbrBNmK?|}(HG<>hF=*UR4z=B zdr@SSYH%0X2*U@{GRKkLMG$AyH4Nz#Q>D00cgimE@mhiM&Uzo8z)7Eqn|^Ad6$U-{ zV=-6h7Y!gpHT%-~YNqq6IpBk^5;R^+JTF8fji6LSgMVBJzYz^Az!-EyBq69SGW}zR z{%RY(4;T_ zk)dv5(c9}}lV1m+NhVhqADA-qaagc(2}QR5F=#!QwMUsa1QIT3#d{RWa@yZ+Q< zl0nE580w0>t=>UfXO3K{2WH_;KRX$Fpnn+2g%bYW_Ns;TZT|X&P6lp(G1MP%bNp+3 z_?I=`+}%ptCDf5+6DKC$@SXQ8Z3Yi!OXhmMx4hWQZiBY_yYF zJup)Gq$12rVs7#5VexO?{0(DaA6*MN%QiX*F?PhmK09taJ60plKa5|1r|@?EM7+OuDXcs;}=N zK9(T5i=4P3Sf+v{{-dODl9H1tc7HGeLh_Z&)()ap%#BVYrk;3Va zM$dZ*w#qVl3Pn&awZjN@F@-uhnV-KQXNhzn{_7Wh?3(&UeNJO%2j3iQ?0vI$|L)c|cemtZlNTM21r6WGuY!K80xn2N)8$Wq zR4usg@q&XuA6jabO#K~jck}w;(^af4k>^D9wRW4LzU`Kgg=A}Y)0X{S=i9BV?S8=i zX%WLZqe%ogRNC`JN(H6NQv{ed!pj*tv@n$|u|mI?D0kJ;xaDDlwiU2eZQZ6KAKc|b zuzcS!a8<3U;EY(2%Wz4(6On!H4!ghIm}xH4{s)t*8`|;teqEw57bqig}B| z7De2&${1r{oaSDernKaQoUHF+c&2CcO3}*h0I7K^6j>^l3Rln)6;k!rgfSGd7eiZE zBKpfWGVUECIBsu+^CfAXnGQ>3W+vCXH2@S)C zWz8Ls9Im;mtH0_FG4gWt_qrtx>^7PzNJ&QnX@E2p*25A_sx5I}ExTKfkhU1Zwz_Fc zwnvNvovM9ivv?Efmfz3rh>^R`T^>C0(Cv92ym&zg{47c!wZoZFUK<WrI{Ry%+pjz9ydMs z;T&V!aYY)nu{IV%3G5F$HH#J_pVScQM<>EKCYDm!pKuK7x!tgnsV(XVZQwVmHQz~E z*mExNLyMQQFB2W{Ll}NyXNi3QB%HHsJBanY9SdAUXXQ`7@2uTjnI%w-1RKgodi(Fv zEH^;$%>&~=F^s^0_GNID^|Fn|fua{nQh8BJ0a_|kJHXIR3{jXIwmzX7H;Rq6wdf+O z_XeSTiJgGu%YB)tId#_$H!|z!EAd%f*qUt5@8cbPGCRN6J_shJtOL5r$`Z5~Cd=q+ zPr+`XRrf`giq}e{U`Q&qnWYa!vA{2@y|F18L`17mY^e{j#p;$K(Q3!`5Tz1NcuUK; z*kDv4r)0EmN;8&&+ic&P_U7iB#*GbZG526j|Bod~xN+}*PWerEql3*G9GAWI&Td$z zHDa+(n|o+h=eim6C$DoY#%^K7K?@fHg9`%$aBO0G%=odVSirEE!KyqE2JPM;n#*EW zR2ERqV$Bk*iA=}rZX$%PY!CefF+tKu{EQ4bmEpB9ah_s%8O=FKfUKyxF*v=Q)2U~K z%m?qE7LT9TMacaZ!U1MZFR`MwA-E-BWf$4g=&s!C%O1<^+T$ThuBq5UD(AN3@t)Ay z9OR9EtT5>JcQ}0HV&@R<+G=Vc(5Rsxk_Df-k+k4WF2`5TC6BJfI-Xw;Arw)o1=a!S~P4@8mBCaoWY-)u5(vPT@J=V zuh;Z=xl!%-Wzf3GDJF8|Bv}NW}!1g0Jg6x16PxncK;U z&4AuymnND4t?d)AnX=OLiI{S8aW=&*!Tqfxl(16VkFruAT7S0@UcnBs*$o5 zIEEUg z9Vv0Oz!g$6zmWZ#K9t$ThY?5ijJ)Q)edJON=wI@RSL6TiBEmm7BdN3`gee6|#BM9% zgd`#X6eI++Z_Y`LiY^?p!363>B$aQ z(R^t+`Nqr%BZd#r6Ol8=;7?NVEnm$2crORivnUb+06K~rbuQh^n^^2q(FocxJ$p2E zl3V!AA+E#;UG48ry2#iEuiC^eUi%zViCr3gnl~M42p*n+{BgRBEeO-#;=u*Z?wH39 zTrHkf=3L&}Q zth|`aFLZ8NSWBTzW_eSZby5ZeL?NvKX3QU2YsWbG561Krw4bfD8A=4%f}}pbE&JT! z2jCurfUxtYEk5?*yMqvG`A8mn+}w04Lc z+Ix*VujW51vfipt7~TLk=D{ff^K)613h9PKUY$!sp6HwAeQd&77!=FXIkTLNOU|}Q z;*)s7R4=Xew1`5kk}7Y52o)k|$w>qKs0f0icej+kk6-bsg++h>?aMO@yBBUh&EUCf%vw)z z$DcsoF1B#sIa zXggf;Etdxn!3B_)h=m9>DXwwzSKnt*x;n~G3Yv*2kuf=s!+mMjGm+)0V_sVF>gCIc zQ1Dld#ZJzgQ)CUDq8HS1??)D;v7ayf`?8LY!ztb~G#TrT5Xu-`rb~l9f-*c@{y@~( zuBaoTF$J}yhsm`aCs|nJlT5awNEn59V$_816A9NIWw%+|-<;_|Vgrh7q8{lVn-^7M z<4(cP9kloEjnG!^HR2TZbS{N-Z&ZisL_xbtJLWPL4ahqk`7Me2Bykc86-G=kCE!6A zU?bAL?L?74w`m2%_Ibh^!5cXCmGH%bA}fSplW_dbT_>v@cZ~d$d0CC(&RJD~jAOVN zYBLNqTa{O&{Ht_?&0`1odm3w41E{djE#zeW=*zCn-C|3jynO)>THU^jq@mB`n_Yt# z@%mlTF5P|S!Zp!@(N=%AGuqg>f8QuukA!U^n{XHV>GC zEz>iw+QJG6D8ez;`4QfW4Jrf#(MnXw!fS_TC{tUsytnLyGl&hV-@^Qxk57!gShx$r zzQ+c<%(=W&B-1SFE$+Wl3=#yxk(uE@NeB?NIkY@7FyFC=P9Lb2QX_2->i4--PGQ0$fPIKA<9eO z3Qm7p{(iTeJ1>g8BZ>m$g#9by^EX+P<07Y>TmKlHP7ZsgabyxY8SYU&weSr|Q+rRm z_7Q3UtrGb6gGhlrnI9qaQedAj7=INbsg7)y>}p>Kx^D-yAngFC2uuCW%M%*Mn8_{< zQd~+nOt^8Gf8j96X-2xPaWwldJJSGApE0hHsja6=S%4+$iKA+J9Ff0}uSLYjJ%=ut zyRlPY_hnb*Noi|{_N!>3rI2c#=CIDvn=Gq2?D_bJ(7O%;PD6;ufopkH*FcVmY1PPu%R8q3pmKv zceZ0&K#|sV^L&Dk1H7IS6~M7Bu6rUhFPsvHLhf7(#$;y3jd|%(rP)#?@Tvkr$QpRL zybC6MoW({xR#+Qkl}jI9P4F&+D5HDY&FyiHATzs#6ALCRT{+%gLLJ>E_+#R)J^)~ zQf=-xp>U4_MFY8c3TqNa;uUO<196AZc|Qhsu=fO$D2EZ35QjTNE=i!-`+6Iqy zt^9y5y1m}4z9uBIZ^c48_d0tVmAq3Bps9on=l%`8A9QY{_I!|^<1Vs%P%Lt`(dHHI zIN^tRZ%e&KxSyK+sBKFX7q+HYkZKR9wa|dXA{J4H9ID``8p^+|mfAe?FpD-yERlT2 zuWc3rPBAHpfgaf4q4jRwd~w$iv}f2m;Gj$~%&`Hq7M7(ML`}PCwR~Tc9Rk7GXf&8T zS3FqD=mdX-zP$4Og*4`3Vo;Y?K9Dl%;8A{K77wuz%vfsJWCZ8|+pm0%y zepF`VC?4%D+^Q(xw%WV*VAe@6`>fz0x&%*>k8*Rpi-W|)%abG6pN$PH{lY}Lcn)zu zpHznmm0+jTZIRu^8WhZ_PaI<<30vm+M-dHsh{vldUT}uJveM9oJT2Rd(mvs6C)&X| z(wctER2y{!4?D2F0+2EC;NI_05}S3V8-?J0d%>k3o0p=AQoL5;Ul%FK3|>)8q)i8*|Y^ zDAC@9MJeCE-F;UKyR*;l0B&vuTmYQIN#XjOJ^Z_~@!E^vavKQG z#IC}LS^z>(W#@<@@tTOSS7Nf}t1E7x=t0kgytBQzxzoZnJRv@00CZ+*Fp%0o=V*+P zVYiXvEbJu;k579td}|S6BG~Zkt}2*6?@>6N=+qE4K(W4vgmtxx5!8;vH3#6ZI2$l zk9^~fK#J{}#sH6DZ3We?v8 zG4__12zWJN1x#hhS&1nvLvK1F=1x>$m}svBk+UEjcd+wSc27=>Qwm{3V2I&ty*Eyn zRKT%eR!@XQYCRUSywBFP{EaPnyZ(UhECwC#kcTKP8d3{I!_!+k#eOWe9|!uE3@%Ti zn86BJYpJ?`1V-c~yw&nbWtk6GW zzx%nJ5J&a+COci@I}AvOa1PbmL~)^oVCgFmRjuH#NDX9$&c4N?r0e2!@MOGs^Cw>n zzaoPmF=7yjKOVD=PIKzaSr``=q$S!?rCv?4)`|7d1uwNPXa79wFZ^0eAIdwite`t_ zJbB^})VO>$;r7Kw*PF}c6vEqKW`NwX-&RtLhPWh-)U>~HphAs}q9yGi_&X3xSkq`# z#TK~T^7G}=sc>{3``jFikG@nex=<;Tw*^_L0M|>aUYqS0#+!(Q1>?%g*%P=x4sJqc@=PRLF1F^ z1G;`U&Oh{~k5D;R6m^TlP9oQC_0J6WeG&Z91WkEV1ufRin>ObaUr<05zIQ;tyLlt6Xe_1FbB~u(;7jtblxe;Z9|( z3%T&z0PL%)I*blxR@VcVd}XI0pa+-T+}xj)d}>6h*8z8|bPyR?o6HZCw6JjCRp>Lx z5js8na~aeJIM=dUdM_mkDuLYc52kxq**=6LamcDeknTqWrO7Iy;=*_og^fQ#-;X|` zwFA4EZCl`9m#m2Ax_Vsd%QvU}Vc3v1$g(&Gg@kFZZEp@+Meya_V0T2&Pp`Pqji9wZ zAnKp#Dj@rb^csF(s4kh)Hc|db0wVJGb)A5qN~*{|F{Y%6pnD2dT39(9P|#2DtAQ91 z@Cl)wQm$r~xDKM#zvyN>yc*c?cO{~Z3{h}Z zw#%Tu`|j>vND9>*-23kPZwVG_@ATyF{`Bo1ziq3&O~Y3p2WQ^OhPS~*z?nLm?8fjL zqTp`dB{(Lx=_cN~E@q!@)7~pAkU&e^QP^8Hh+Nz0ZlP?_4~?DQHe}hUtnZ@=V;dUt z4kRoB+9Do3LGpE6I8x$6Z*|19)ev6HA2z;Rj>`t$ra; z$Wf>taz#gJ7T#UZ7P5DS+s@G>vtds=?DX5&q(pfDQ4bjR@zLJ55$70WRY3p<+%%15Fmq>hGye6QIho zaFL3@jbOVEJU6H`2U^xZH@uco5$kgXaEQBsi}y@Jb4V`EU}Cg}1R|X1c*D7!r-G46 zib2Mbuy?L_vtzQKEhKctEfm3OF+Inp*Kl>VGZ$Dy=?$dYT*y11(~3)+ympc-e}D7V zci(W$r+ymEZ!sY4*m;}>F*~sq;Cvb!imo36fr_X~d7^-wIF7OC#x?GnQe zrCu+{Lh(PuEb$y+C}9AZJe#$>a}NRd4k1EeI;4cc<)B#7U@@?R`^h)oMc#eaoHL$X zWK@s8lwZ$hF$h>RVZi2#5z#09NCo%u@L6K zJH;t}qCh?cwK5{j`QQcK@RK72l(ur>YjOSyF11$pbNg9&!{ftWos_`P^EzVRs7B1> z8U!S}>Z6n2IIP+XBn9LaGRJP`lRa72RugmBGGbXaRD}tOWLy!LZt-ohfMrJ`SQA1s zllijzasTdix7|e>qP%Y73$3Jc2G~6Y=^yxl9j_)vtZ%n8{KmEu{3$(RHwVdRcr3`U z^+e#sS&x+0?tG9L5ypgH^F9~`&qdmyT6&@^TntNaZFreOtMP7uQjix#Drj8I*g%u1j0 zw4_4}X9=;<%`3M<%KBW}lG8xz_(76+|rW$X9^l${q!M(H#uAU~t7x7d)@@4&CWf3EctsUC+utlBa z2?{UYkcboQbeaAN_b`&3T$d1V)sWl(*LC^_s2QT6IaHYlePwK$e0bp&Kxw0aPtRx& z@yV1Za4;OUKP^5CVz;RUr@^z0bVqfJF?FEw%B9F6Sr9;H*q_=tMas0?hX!jZS z5AY=|=IVlrBVa3aJ)~LWp8a6-IzPIAN|bV;zYAdlwA`uR>Z(U;RRrd}#c8vAD|&=7 zE z%*8=Pd0%DP6`UoIsP6X)xG8%Q2=|-I2p@?GUoju0)-;>97+gjt=F-hSRdUw>=BS-hsPa%JQ>uCT|?r92B5UF;p0`&Ik32QNk|NoI;i$u8`GoaSK!knB9dgr8`M8qv?+~&lLWn{{> z3yHj9g>svUV8!A?nBypE48Yu zruh~JQ@p(UZnOCH?YqyGw7AQ;VjPl-d|}&eK)ssEv`bDLgn8zEVfzbjgPPz?Te%tD zbUxzzijjo1cG~m82Jm^CsWNLs5z5M(J`evOxND^8UvA4FxxkJ4(>81AQD}7V$ z+Z6*BKph>~=<08f479$YP!rC!1j?X%DO$SGXfaYpE21cW$ZUgb&g}zhI8cz`giko? zi)VeI?&@>iu0-^)whJ~T^j5sNChij3lt*dVa=0sk%|^IW>flO=5g>$u_`M`r0*B&o4}mEIB+=f>NNpLv=IO!*{^*xPfzjy$ds}H!>C&Ew)wf(M4Z=&NpNnHy+K=3Q zyvKZP3(5?9W$!WvDhvet7Z_`yfTN{U#D6+OsFlpI1~jGy7e1#Z3Ou*CpmFDR$I`D( z3i0WeCL>%~9^S~~c}icUZ{SYJM_K&C*<=hqj>oG^pDo*JQn#+*>uIxxqTpU$7@`fn zTw^P0z-646u?Ww{r=RfgDdQN|{c2D97-v`q-(F8jto!B1NXq;EWn3m7=OQJ;O(^@^ zIEP5XEzU&IVU{LBPq#d{^1{4XK@;ScHA?b;iVHOq*D>3p3Na(_WU~Vw97u zQdPv|y6d1dEG~^mbuTUzSKb$pPNqvms=XwZX1F=o%t&(;Vc-MVa`WcTlG$fGOBZoN z7Y$tN<}TQ(;nM0MqIi&|qV;E7FiSSHWkOWUyL{?ag7eSUn2vmIBex6uTHIovM-V%aWq&a^i)aHDc zmVI%5T<(L{WfhGGF1nuCqlAiU0fHWuDUmAVB+_R|V(LPNUSd&n*M!|S7jRiFFmCz4 zy3@>c>`EVnggFQX0-XaR|DC7sAR=E-Vnur}tbkLH1}}`RDu5S68iH3EN+p~~uLN0bs5iNlbjtv zePb4rZ;~+i!3uqC(twOCDH$lh*K_l7>>h z=sUO8!H7E&~BhyB1AB^(8g%?Q%W|JgkLu*=3IPT=V*iQSHqc$CrU?Y<_sBNOhh_@i1Z}&3 z@ykfDODKP}z`uHBnAOdHtLBQ<%XSv7T6p=dylRq$qfp{4XoE6+Utag3-@}!^NbfJ` zF3NFcO3+E`>h+f_B3Im@*Kp-*vZNME_oaB=M0i-C^bN&NdEKC*rTZP;NXJ9GwTcF)0urF*AdQc+}+dIxNG^iCIWF z1z^J3;nfwkT^6_~A~CI$A;^9v$egl}toq}=h+ddMr)Ml#aGwJrnlaf^NmT5vdFmwi zRP1|#T?pf2nMmya;qG>D0&IC%vq#Sx&8R z%HF|wz|Dwo9#L<*iwHG#6JHXaFufy0;mJ{_^QN$m!jS;V}OuHNGm7t^Eh$l~gSg-ZZHl-Uzu`9I6;P&)ySU1~m z=&lu&U_0K+)Chu0H8Ef^fjmT+Sd8%zhVt*v<#^(>r3XT5?$$RbiG5Nem6!tb+~GhZ zfvO=92Q%)~6Lku)CM}HUx{FD}Lp{pN#kWs#_@%))5{$0JHOQ)f2gCWXqXU_D`|ouy z+7+1MYI=2ga%DL4>TuS$ar?xh*7*_|NNJMmxBq@PTlEnt%QV{IoCm^03X^cd$VyJO zY>}viw%o#UkM!{UlxR5A;`PQxgH0?xy?r%!*Jy|FPFIePg#<PZBCA zGZAwLu~13#PG)HB6u}Z1(Ds+#m+LTm*CdTo=t3viwCkW@AT4ponTa%kCCJ1qn}$RM zw-wPeNSn~cA--Q?86BE+A~<3EmD|!0*Wf~*hI%PiR+QC5wg_5P*{$v3=1kFGaDW8!gzpN!b3@} z&mm5bOLJW$5}9RvU56ocqbps$W);Y!*)^msF!Wf1&sn<+yKmVT)|ZH%LAIsgLt$Kq zQuil?iq&FqMVu>|+L&Ul|tZGR>%SRN4$F z8}kKl0B(a#l^yYA+iEO105(5}i;S@H z!(gNHtwRg^QFri`7epUoqxcDzdv&G1iXSY};`BmN25Z(gg8k4A8E$Dlx$p+wZS2P# zs$)V89r#ZqtC)|nPO;1eU$*Zs=y#GDoL*2F=(D>58x=Vy2See#cxu?|J+?KWzZ$eedUz#_535bj-Ozg*Z0U(;X+D$LhnII#2Ak4KlF26V~}Qf!b1wuBK$*Ya*MR*C? zvWU)UF(`tu(6RxZ@*>^u{6)B;Tn?J4zOdE6c-mAeW-+(gG;_zYNf1^Ib`P7(9W!{~ znsBX6H7aw8g-)|WHtPlZ21i(GeMV%%virykJ$JyWcIo_2O#PA^E*r(_fD{>69Z~Fm z$#T!l-BAb-TPfQOZc7?nTIlUZ3q3>G80obTzgGZu8m!K|!5qT7iD}uCwI~htDt)m- zaaGHx)@e;aMTLPFw@Ya~=0EWP34T1wCbnVO>q=~8n;AF2w}Z5bT*}JmUjo#$*)+ zr_3r%h^#c2&E<8u*4o#>K@Rw^3|%uRsMkb{!z>Kp@Pa+K%=gj{-*-li`6R4K@g?R? z+VOzKc*Tl^c*W7zVJW+~n7~$CCT^}(D_FnO5lKc@ni^M4g1L9|*npgPjLU(2VaS4B zlfYC^UxCOvnXe1_u7I36X0mCBD`GcS<}4#GBP5bFTGZIezOzytX1g$KCp}V5(9S3O zl?~ZHH!CClcdR1gaCM>!KC!pLG%^(p22e#1>RcKDOJyuzf#0!@47Ua(W}=a!(hD^g z)|1>GV8a~2UDj826XsO74!aoc^*F|umzKJ+G5`lLCvpNI!2BUbT1Q-XUGqHu3D-oR zSd^$xC47M3bX6IYQy0X)oMy+9!u=}uz==ja=bkK^WCQ;HnS1m8HjZQO_wW0>3KEZx z0)!y7WH~v2M*N7P6w3h(Zj$X#48sK?5rTjSK;r)1@Ap^LJ<|h#lzr@*+!G%W)6>&y zRdsc(pX7J40DU6_2V5{dDCP^^ku(0!YU&5M+Ivg#wxKEgp)LJ^jD~9qZj+@=kacIl z0;E7J@{|Lkn@0LAq`3k1++$>93oMV-L7z3^h;}N(qf!;v!jwI{BNq69&Ajc7vdvmp zY^wCY4~M$uW0hK(rfN+BmN6?Ogak-J(1pW7rne4-V1p+GoS1Tjt4lt60hx^?VS~8% z%(S<6ZF_pc8CuJ<6o|=}nq#1Z)Zq~Ps8&-mJ_HKESSaF{XL2--#RrvgEg9E8J1{Zz z^|!@HX7vZdnDaj~S~Id2Mw-kW-;OdAF|!A4cjDM5KKq&h&(n$ec7PTeYX`B->aehH ziSpo7vyl2ioL%5wIte=%{coN_Ir= z3X7v46Ggm9$a-UUAq>=>fO;rLF~Ug%kF4_a7`ekZ);4n!D8B?HVs_b4X+}zz=_6>) zBh8rK$7I$78deHru-W{XG+Z)&ooJ7Kk`a>2rS#D=eKfJK>S}tx+Kj@|2Qq8B6Cs9E z&Yp85&MDEobSy_x7!~zH{TXgaejK^%DW^a-q!KwpdU1Pu@#xXxoe!Ts{`Zq7i~95N<8Bc3 zb4rGDt*}G48=eFjfFc4b3*&4?Kst+3BYhs7F_urk0N!gH2gn_&u%dET>kj-1x7^PVvKg@F2agO91N|8e#Qz{GZzAsjo%XhduhaYfl!j*Ygs)K+J_R;rrAI(nHo~x z|G@?~=Ki@LJh5xSPm78k_-XM^HSxR6Ii2^7xk^#tM=GdLHU3$&bG>NDO3EDa(~xF| z3^NLQfc90bkI?BJAM973{pnBjx#FLtCx5Du<6(@e3i1uPH&uK!kBn>Tq!B(koD06D-q`?sqrV& zR)z0KwQpB zHc9S@Tn=c>4>}g5zE->WPEs44CFoI-b$L0gUO=q|7xju|n*RKWEN&=A*p?W^;79Y2 zQX1r0HT~XOs!pEUiBmJ)4rf^lab=$7-r`ZI^HY{oN7+7B1i9ahAJTcH*nBoWk7I7> zyk=mtthHoLRH}E6nNVU)vSCVHqXg*Pm)~~K!#8LK3t_R|Fk<#sNf$9>uoFP;Y5aaG z*3EDzzK|d#l*1GOR0>IaGU!3n^-bwfSD@mx_`Tvu#7~k(zoEOT zX=SqgvhwCZl}Z_7W0hJI7*P?TX~ABI)^c=p7olhF&~B4H`|ov(zt=**GHC?HlgK?} zhzDvF;PKxG$Uh&Pb#WahaRoEC#N1m}v_=qx!O_c}%mw3}z&~n!QZ8GoWX_supR8x0 zCIVf<%p;u1Ka)$jQPRLmO5K<* zEcp9N78X7ltmui$jqG(Vw_k96hD`uDm6o34fy&UolhJJf;sJ=Mqbb6+}S?^vVcguc!M(OH+ zq(yyx6jt}-FXs7Bj=!%gauq4HDUhL4cpm7vJ5p?9h|@58-Q{^5J2sMb^J_#th5cUk zX3Xyv66oyjBYtrw>>qb@(!Lw0lAT$cX3CY*%YOQvG9*jc52||hNk6-4Oeum!*((j{ ztb5i`?NQd-=MfS==zX!0?6XDy9O!k{Rr~txwZdeN6g4FKm&$-gy{^~XHFYZ~@BK z>s)0oRn#Ma{O3=4{HO~o$tKSBdjxc&L~R_bQ0Qi!{M*?-%Z{~iTP&?do|IV{(eqB# zuTUmDZ>VoAF!FTfo^9!UXHT3SoN&l!n{~8`ojsg8KdlepT8}N}X7(m8&A#I&4%Dw? ziI}xiJzi+CV?7Pe{M9wT!&FDv%HZx_E7k50Gk5!AQ2n=+tfJVYa}K#As+5*vPV0;# zshRi=5N5FUtQTp$^JJ~HL5O>aiX*u%cC9J}yPrWO@W*>E`X)>+HKxQUHonz13-FPqNgINv()fSu7m5d)oc9 zJph&E?v8|_mvOo~2`#vk}O8%Mj zz4_U)u~LU93R3BVJDvzaR{7J?pZ~P<^p6z^QOY`(_pf&L*J}0jeZBp@mc6(s=yL}> zsUHES?_sGzBB%UZXeWiso$3z=^YU2BzQwZUEDj4VTiQQ6TK1pSoyyYEWB%)P4;~+~ zEoWvkT-mK-gg{6HO5BQ=k(NeP`8-lGOY&-rD~5sNELA)cUkRpx+^t0miz-{(N9{!l znkJqwDAm5DsMwCv`gVQGSho4?C@MV7>s7aE&8xBZuFH*ExG*^Rnr zY~M-1vXw{UzYtPy)y{S2;yY3=4T8yTiLTMKoG zvbB-OI9J?LAJ4XnrF+C7-HKOHSvE-e!{GhS_kxI$x~>{iJ>x3v%W;ZHdwdfR#)+iq@Q9!cBVJ6lNx?fJ}}_xp;2XNua;%AJqF6l)T1_Bzr~zO)Ss z5ruWXqB=|};FBl!np2g3aVrq2MuL7{e<`J0q)IlPM@v?1y^f-2jo!C+5 z03PR1*Irwzarf{v{Z!-s> zYIF=MjXf+dqDM1iF(5!7<&6H8_1Qdy!^0xJR3Vtw8J1K34bv>}yLPh`RN}EcS%|qQ zWH&V?7|5-QLL2QWh0EeC4WIL%O zshJ$~laVVwP_<{3IJ}8)_0WYa)tu-6d*rO#|G~E}ZkvSkK@` z%osUv-)6|Qe~7^sGK zda{X@&LXB!oL4M~x8tQoJUBX_A$CUj&!F#*UD@l~+pS1Zwz*xURUk-CW%3UWPi}8j z>-j1FL^BdrbC%S2UKK-~h%~mWy6gdTuu!OFM&l}Ugc1~w`T*Nu%n(o!M_4w~%^QJK z3P$-Nb_+(Pc9S0^`F_qqk|5U-*I9QgE;bQ@6whzreJW>m4uEA|@I;S#-#qXwj`P#O z=YRzK+APAGf-^p=-E1!zP03(@wu21h-6!_AQw8Xah$@8{k`XUWMyDgnn!TS!_>8y* zITl*&S*sv?=nxYE>)~{ukss)6q5kW292#eRZ(E5(B_9q4Cb;5QA0P@GV2-6CJheRn zq59{{l^8Y|qwy49tc0Z~A+Y$jKCU=yTcIBq>DU&Z=>Wnh7J|NLC))nIev#eq37#*i zbSVaMuXeF>xts0rk2tuqoV~QSXRw!-yYpH0WzapEL-bs=+A1_;D!5UrzE#_rRb7R- zXyw9rz94K+i&l`8%Z&%A)i3Vi0Xf&J7Dr^fJ8%mSuiihdET1-@d0gd-500FV@y)*> zM_+6Tf#Ei{z%QLQW|Iq^-PJ8!-#r!detrMA^FR}{hYf+Ut5nJ5El(N$ z-+T-CD323vz=x?Oxgp;3HuADEr=)p*!jT(2Zo{u#>`>wSNJJyy{%@q+U(!X`G+z6xgyVXrU1+h_ca5d&t|!? z&D!RDjcr`Ly$Aq`~%0 zsI2RMxFU!c$NPbkRk@fs3hEP}j`Q*iI%FsI+y1A|F^g7NO(1a4@?U ziwQ)nOLZknN*53+F03G*EGlLz3@~tQNvn?@olmU2Ep41^v9#yO(k@g4bhJKm*PLRo zY1i<;?9XsH{-~aF?p@a!=QGzsQY)!As@Ks9MkNGFuU>P2(wiXY?NPR7`l5{lu@Bt{ zr85-lN#|5w2WtIZ=qbai1tCNHeB77exn%gu@G=O@f(_M4CtGLxNP=*wUm?5lu_BAt z-{`X3;vW%@4bEBb$+!61PPUWeS*{E_&}K=Q>XnaZ9F8ixxjojU@xKTZJ_A}NFRgCW zuuAm61ZdHe-u1^$_HAc*qp=YJimn^EsK3XvyQA-CS+v(*;xK5lzpqAt-rdLt}*-2;dO~urX6?L)Y#g2dD?9!D9 zKgjkZ*HbjM<4 zOLVRb-i8?N#bKhUNTGoApY1}3BPvH@e{>cd)xm=zSY2Q494i&0@^LUHS5&D_{9^)u{F|VFY|+`6bE|OKY@UtzFFPBTG_gGTiUlay>>i&`DH8Cd^7L%9c6X7| z%~gPYkwUj7b)YT+H#xswFwh@67?_yw&NQhe$LMeePho$-E0HrV@Zss_Q{R5dr2y4Xi9gDCDX&vlR6t{?>N*moW24Ag+?Lt4mc~)SU zeb(;30~O%19oh$-CgM1xn{rhMSU>2mOoVD3DCF5JBumDEQK2LY-kSB0H)q$Cf;GoE zGPQCWutc>x|IX1p|Il$a{Zfq1#~GN-ZaBJ6nkn2zh?*D3TC1~&gcG-SoC2MN3&;A8 zP6qbLz1&%>Ucz@CcYg9Hp=xCEJc;ZKW{p4Qhhpiof+k>#6iLhroy7E@)n>$kn^DakA5&B}rd$V=_Qs{waXafLL zYqz+|g#@S0)(0Wm^xHxWAO?Dr+&#mjCW~R)MT6bO$hx!|Q&&lsa;xezDfcB0qTpmq zF6m9VEVMYY-BG7_AJNR&RgJasE`!dq)TIjqlcHRxA%dM#UQXC;5r7#)mw*NSW(EO; zmWP)!siY*fL3*1W36opN!uZ@CUQ3@!I4*Boe3YQWsUZ&Lk9bayEZjuWx$;u`HS^r% zT$((wCO z=tlpuJI_vcA;@{x3z_#L{w9@*+;cOZ+^T65o7K(~b}@qPQC!P=$y@;fA#y?B3G!{7 zLE8{@1B{Lwk#rUS;u{qx#cbMK4@f<=jjl;!@f@~hydMvuD$mZwQOeO8*6IM^ieU5d z@8du}Iap2~qX;_q-jn$@`LW5S4&+mo1oq3vY1u}Qj}Xx`Ob z(=9C|qXRve7MYfupG{Xk2sRTLV$y$luX~)77x#iN>%cMH-r@{AYZKER#Vbyq43Q@L z@?+;mDs{=(e0-j%J-@yLyM>5t-*T`mqIw~PyI1MDiHE76Q)+{3#b%LyxPba9RnJ_x ztd-+-9s`|eEn(#SwsR5SR<zDO*!QNiiZmu6ax=we9)SWE^ehpe&kRsx4jSz!((PHW%x41&S zGqtjk(_N&IXsQxo=W}H#`5kOoYCdfV0ZG+bTaHtyUgmc|XQz!FY$4!f$~VedJ8GOU ztVVdd-@j5}@_oHE*+Qs811&zxdy+l547$@i(N*7!dPRb!N*zlRv-EAO8lQeoT`{a0 zVRCV>V>j9DeAZz_wq@do`WoAU3ncg*86a!#(Yq8?oDp@&u()fUM!x%Y)CnBw!R`b39ZUI`uQg-p{gGXYXibhd>_n_$u=m}H9` z*o5Y0479ff1-3Uko4d`m;4RC(hl*%fK!^5{CAMCxNpIASuL3ENw7vlpO7MFrn$dC# zE*M0!ayA!bJg#QbrFs85ZQ zM2HmJVLR!@n{888JIwlTB%JC=i0l0Lx*3*Uysv+MuVLv$VnfQ6#H~%gPYVCNhNZ%q zF)G)sx3A|u98IZRF*_Z;JjTkLJ7F~ntaC|&88n+A*6r=gm(TxF!z$JAt=`XWDpfr7 zYA;X}$eXkJoF6;<*j33cKXz1d!;d?a-0|Z^CC~ZsLM1Qw@%(uuu`cLViOd-eb#jrA z#s|ZdQ}P~ljysp+u--wbeh1v`J}yq2LG?@hs(#?qeKoVFIW55ETl8zaPW8&@0uiXP zD<0|-B z!yc6pB%ccL7ooZr`@^FKy(FxH#sDzXSL=I47|hdbk6pmY|8fhnM!^P#R$Sj;_&R@t zKc9Syn-`Cmd%t(m-li4Bg0Q3WNZGx{i_@A3 z!&z(Z4Sa7q22>9S_Nj=PwPt%h+ibS;5v(CY46xF+0h~F^u8CT#VgcahImjCg3(CL% zZzMRly~W!%%c`sPBlxzRXMNPen$o#+wqy0kkQ* zbKCYaw>9saeZpOaJrJeKtHX$5^HtVXEhgCLrO>;|!BcYrS7$--tjd7m&#&wbxWD8BVHnEQnO%tIig$~-6QBBw zVHbP$pPxF{pE4s^8d615jWdd*MZ{qq{z(qFwlgNMbtc1Pj~M+|>IkyfcZqU?z_uuG zh1yB2t|h9~ukPF4EHI*1ocO`(Y57VH+%!DH>%cqUMXAGFfp-!#Ek51X(L1wRnV4}t zT>^l*MX9U}rDvG>5_4Ok_B&+^lr^~k28PZV!Ri4v&CXYAItK&ntM;)=W$p*d)dRby z9gefB`V}W><0`vazHz2T+`bX{THOu9>$H2%ct$V=ZwAAAhEj)M2Cg(XF9j|`V9WoE zT)cWOFSOP7^~-xN3#-Y!AipeJCWZfr%fij4eK?iIKdZGJ?sLEUU8V9*zs`A5_r^bK zyLZ2~iJ?x!e^7)9QFX37+b-R)%;FUBL@%$_!h6#&Ma3fbr z5F@Hef;yoq<%v@RyNbr90twm%5(u#(VUSHl;_KPm|bHBnWSbqkvxedoKB%ZnGso_S{<){(8J&w~wz3pN z%tUmG6T4vLFP_6L8I#bw(8`Mum-pjR;KL@G*V0^O5>Z;E6LJOlAi1ximB5DZvi%W; z{=c5h=P5eod}w)qHi?_OOKxTtTo;=ci;F(%R+cww%ErVm2P_=f}HH85Mhir8MS_3ee_Lf|H*t}n~&Jxo7rx#XA`Wf7s_NryWE2Yx8 zy(Q3GvAQ{LUTrP3Tq0DL4YSsF*5q;sYqN3f0(#mJZ#UV)cH%=ySAvVabLg8MAdjOG z>Xepa;jb&Qne3Rp%_q&vVoaBDOoA(XF;Z>)H6LaCNSA}^_A&}uNiA#?v3fBj zZ#YzyyhIc=ACu`gd{kQnQTj#5qNP29AZ_JmmKm!@aNm&FjJv{5k^63MSsyyY-E1 z#Y0-Jvvv+PZiKP{?b-09-q6CaWTGK!#Isz(fqLMMt zV76UrBdY=1Hfqb%#$xHD0(cb*W5P58*V+C4L3vrX7x*Lk}M9b@PFlFis8YUycu9I=UO0E zCaA11=2SoI&oat&JdhyCKKb(4pidi4xJmYvhk3ztlC`}gvkF9hzVzmj;6rhdOBc~_ zKE)kk6KN$JQOJR?E_(c76sAh^x3@Bs_LGiBLUumbuAMFCwexH}hXEXJ*2@cGd=nO{ z0OoQ5#I)SlmOZE-p>^owB$Le76 z3=P_%Lf`aok5@FQ4z(<00^7ni(&n$p8-guED}$LxJ|_$d8EZKHPL}}g<711|bjZ&` zf6GPH&qdrKXe+`m&@#I{nzaAwm4isKd_Q!H%E{}rx;Fy5JJn*bWNxbvoTR`APC%(B zI?S?X%Uct2KG7D~T@m2Gnnrcvea%hcHonhXN5LsIa_wEh@!%ujwYMGm&X ze-wA&>iEX=Os)6zxA$HhTgfdkzmdF63je)V$5H^3eCJRK*vEL z>x+c7BsCu-SCd|qdv-kF_7IqMSx`i#Pn!6qg$;WS5#;P1Sx)P>f#$3#Me`}NL6l|7 zPR$#Baff?a^90Y^1db%~NM!5}ak}aDKX;^IRW0`NxjGBADc$oirX<|-Ue!T;OQ2RK zKVMZ!SJ=2)C;d@Hgi^=h@CMF^%4liPS8oF|jlH_AWGKW@Ic>of6+nNaxoeJlHqyS$ z&sGQvJs9*=EyY2M&~oPP0CFSMd2`fnT^BEX3uwp&H@&16^_G@2W0Lt& z+389nZGukk<>Y#PaS^@Fc6I?H-fCLAbDg`pg@sm>{8izC0(gi{AjhME2(jMsK+D1#*he?ZoBK2$N1QvKfvGmw3}V1uCR1 zTioLxNf|;P-u%f_^9Q&OoLKWLQ;cjpcMxZ#dCao6_(&K<6sZU3Ch+JPS9f;Mw@THz zTi-z!D>dvc5wDQIOkO}}On^dM*R5nU=~&q>1uTW7%7>d3t1z@#$96b(S~o-X}_+Jk=9 zd&W0);Bzt!K2l1Eeb?&U^Uaq6e7?kdWM`f6e#Mm%W=|CJ)BgoxR{6hiQW20$^D!JR z{AJcQYN1Dwc==9-U>Jd%l(wt~^$&;Q5!=-ZJ4J@yWTzGudZk^8BydD+ZOL$A*Lr~` z30%p)OrZVpeSPy@uHWb753U4otoP8X+_1(y;l$xS;B3e3N!DxjY|)%2 z))6cO81O-5sL+>hbh9D(aEuMWCJ`O)?0_30VcN%k`FMcM0_O(4htuB z%DYd9Vnt$_^XR=`y&zdHG(3`}I*NWH};}icT6U5n*!E zFpq|iyS^j$rkUUcJsBzi)dxDe`ccVo8Aaw1n-Vgqm*N>{qOvCd%N#MK%BFd$6EoRd z?E$&mrsxQ5EMhzX@|(bNWcg7dB#ZiuywK>uxXK@Pw!rhopzh1n7;!zD8P`xllSxFf ziDA_}F%jFNJ(#WdbYxT9hkPW1;?gs6Uw{;ab-;tYz32Jm1+p&e9qsfI>~(|`oB`ds zmnh^dJ9$h@A+1WX8nqj+FwCJk5O6=|Ul>mKHc9VJG43a^gJ10qci_pb`aJr^?Qf6i@%>kCl3Io;RN0lAtF<7*b z@7J+42~RLp#kfz(&E&_cnJaOn&iNRM5p%{SJOz*t$mSFl-$ z&yk}jN=6s^pH>GX6Dpc>xQdO*x(L(d856RAaYM{4urRG3$u`#cni&I^rBQj@l*}Hs z*&Y?6=CM3z3MR%($<&Yoh>o2nFOY1=FmKFvDqv5x=dM(;Nc1CjJjkBhMWQp;*9U>< zVH1sSj@E*xcABlv)Nfk0M4=$HlhhV?vDiRe`MZY-eAfO%%vsxT`?6d9WOJP#afNDR)zLp8kHlq%T9pX%!L+{H4mf( zWp8qZunm_}?~}8L_e39a!#6V|aR`cgAJ>KJEWS@UAo*))ey2Zm;JfETz0@70vwwJE z*E1$s@Ti-$8!nA@2(3B2I>%Yg*HV{FVvFj0#k?C`+xgB`c(qILcGirrx7ySe#^2Jl znj^${u|-i{-dxKDGv;D@V;seGHYQ>x0J)OMCxDi(?O0!V^k@ZM*DsMPg~juW?7})m z(@V$gpWU&o#ogV!l-K8&RZD^PSEJuP*XkzTU_N=$4RJK)grk=b4w)6;xbph)Q?-Iq z$%hZ4T4e!ftS&dcu_sD?uQZKOMk;D*^OTejHb)WZMB&jc3N0s(mZpRTP-y7G(1JY| zVrXJZ2vq$-hw^T~AW@qcxeKK@m<-S|>Qz2~ldr+I_IMsI6C0&mO9DMrIg)omN%<*f z?=QH2incT_aP16N?}j6U@G%k>iQtPNe6de%WL9^kv;5JcD^{g=ucv&CrdGs;mm7@a zp*m23hN+9pJHr;EJDEuxXRC*Pl?{%cS^j)ah#Kt_NtGPA`+jJu!7XmNx3_<`yj1zB z9{jI{Yzy|Q2I(5J2}p`dVOuW?H7(4d;NZnG)cU?qiwf_|^Rnj2md%7P{}eMtwE*4= z;=C*Xp4QTq-Ag$<)T+7)we`~qRg<03dtnm`>+XUP0g9#lV|i&;9a=QgnHXa5kZ5~* zT!WfhFHqR}pttbU)NpLIK)?qcjmIRxLH!&oP*yYEDf}~L{rWHcS%Aq$8ql9t0JAyqSl%z)@_-S#i z6mTHq+N>~p|IR`!#o9kEc!0F10yN>~Jw4aYF%`<22`Mh~KuWRsP>xQ#zE%*_ZWSl9 zRx($e&_#&X5GuqM5fAX3stxqrd|H*mCT?GzRedO`!;ybR;Gvgnr@?BjtH0cck z89}0w`w6abC<~xjY}_@zp}s$BVPi-XT7g5Tiz^x69I^`y&}^7R)*LlbxTi9 z_WnE%B)5^RHJcllUll82(6J%gu|5aXHVhgD1W)Ng)lLQ@Lf36fq>&5YW2ff^VFPex zGu^ehB+bVJ*K^_nrTVaMdAIaiC2DCSU#bA`} z>;~52Wxqe*rYeI=8DZ9|^BCc^?WTj$P?abw-I#D5v1j36hkJ~Do3$f4-rgo5zt4zzmBm^8c8HLGpnuW-QV57ezj)M0lQj>lut)m{niNvb!* zt*!}ugRF(Ix$JlI;jN9^Dt6@lMedA71a6#OWiMxAiOB7j_!iOot@5|qYc0%7FoL!` zaz~ZrO)l^Ry3h-7HK|6(&IiCDSH0!mAfnkU7X8$>Mx<)9L<0z?&3Z2t1g)SN=NzMJ zisNkYB%=gR{LLLDNZtH;q=I^z17G)4PlZ}Y3$6hYaN4~agLsnaX@^;6;7$OY^qjI7 zv)PK6h1quwCUgz_L6Hg71M=r5k)qS&z_wk20F%h7vfo}4x)PXBRs&f^=}^4AwVAo1 zAsDqhk>r86?us|$O|41z#SST@8WElIU`H+Z6th_i%*tAMo!V1Fx8@=r&^-5eNdBi_ zP2fwvvMhHB?tAaTv4f?n_SSvS;gieJaWkIrO`RzD32=_n6I`eJ3!E1x0K*i(tsn-v z_NWx|Ktn|R4L^m~S@Gl)njmwlL5WQEs$&^gA^^cR;7RkO^L(Y~2upM83G?`sos-V4 z;u~M0NskzBkx?m&I1gKPP~D)GSmntR71~QX)8&*3r_#Z$mr!!gYtXSSlAG~BH1Y&m zMwfWr>&i)RcIu_>?=#8vG&!LiXbE{e_xAStk#}occ7zM1(Q(vI2&=B^E&YZ6UqQg5V>>N+x zAJZ1Rm(v66RaY2^PR>o%0#RX3qQqDxlqe3Toeam(5L5C=hDSiP80;RC!wDg4IztHB z%uxI1#0_Wkgz#NkvZ&j&$IrlG3JDcVSqKtL;R)O4rs>pV;yu|PqB5~krg~%*;$w2LIK9$wXRc!G9dLGo-($$M22IP;5mSy zNiCg`;gXMi*kn;;@Gw!)iE7OjA*hkalw0Tw@rtEW>r9GjmDq7GDPbt_N-2*GcI5X7 zB9zGFM=~rfAv9F5;t{e@q?wcET>28oPdC&C;McBd#l@_|egkB=FE~tUR~6O)Amh~=eI{>7b}s-+u0Ns#nvM^^I49fVk95VJa$f@7c(_$*ht1ahg=aD7}l z?hOw1d&`yMyu|JTAOqFTtgxU{@(M=Y9|_AD)^_-wgg3<^)GIVY@6%`gjxLCC02d?QV5Wil%mD@>n zY0%ZCI+PYT>=3jPH;S!r2Q?OPGe~~iN_t$qfRjK~*SR$N+vIsc7tw&fm}^?ttIbp| zqF9$Ps^)xGF8)DT8RyoFb302X$FSk#nVEJMrC@1pt>;-ABjUIcex*mTMi{9V1b`|< zEsS$iWSi!N{7MYW)*2TJI8QIE-LW9Qe}*)_SRgH@V_;mA3tJS#DxyZ$WPFMC(j@4y zRS9XuX;C`9bFGObxUX8tMwrI}K{t)kaZ6dxu6K&ZxP$??;<9hl*TaHuEJO~7Z{ts; z$Xj1nDR!W-vJ>AeK8LK3jFBBeTl26h?H`<)>1n;o&`2Ur*t@RPhSFkxs!|* zM&cS<6UH&e3yB1Pvd1d$#-`Y#~;Bb zg`NmE32G$9bc$2}ZY(a+1uA~q)G2i6!3A#BF9|vJ1fgBnHV<$1+aU+xXlElwoZW-S zQ6R9RNlfXxX!JlX)P_9Dm6guE{es|W1@?FbEwIPR*P;R1c|srB1a(Mo=e%)lxN~uL z`TOjdVahdLMi)%Q{jTzxRDmehGZ1A16euIgde+Y2TsNm#;5>mMa_0^>vc3=*FmNRP z6poy97B&h1Yi#Vqm(xgcEhG^z6DX&-Wv&&8nIWgr8Bs>BNp15bi!5n2_32HUkReU&)Pw_6XG1iY>&G<#M6*f{WT_c0qTMRJM_Q1;Qd$7o~gr ztlivvakkvb+Ko&0KXoo#Ee(A>?>ihJqT~jCN{;xYamAo7Ibj0nef(j_N&8{A{1}-= z?tYk{g`tTe+ZM;>!qdfEu-AT$4ux14%p+t&D&Yj(kT;`4PD9w(OJwe%bn#=L&gqKe zqDB*mr6Q_mwN}j2Gx~DQb!-l2T=I!xP+zHE))qD=puAmAUj}&33sZV)U+dmMkOHG@ zU|HO|39@`0X0Sm5G#gtoqIfE-XHU5f#c2`cWgP;cZ5KZl*oXGQdd-?x->oH02#dhs zv|iB;K^dXzdhlO!Ojgh^?*^4iQf0@kUQOa43jpWn7I7Ujg|EjjL@mwgGUT zvVf+{nxV`7~Ws*wX(9(H0eX=-{Q<4H6HiWX(wskZ6x_Q&l*k9|m@IBDyYufSpf zzgCz{i%FN4BMl;A%2{?ss>SHwNO<}&gj`mU`jkMVnWGN*rw2q=cS0JS#o&`;c(7&V z8a?DLCKJ5|1pk6-lt?cv1uMV8+HqM2f?i54$#_CFOns$s} zYW_7>mbfv2aG^HIqxy`@emaqkzBlRU#{2rpz0%Q*L=c)wM^}=yL2*|J00MfozCF|y@ngpFRs#ROJ1ee0@4bc4!%-(Eh*zO^x zjO^nM8;a_KsF%Wp6SmDWr5Bg;6N09QYKB!L0(^9HsC`+&!0&S>J8+FWm3o1MnkGLd-JR0LM%O$+5t`o_e>MghZ5TBzX|dKj#?H(^TH3)PU<}UgT$bu5h3?1nqmU|7>T> zH_pV<8=CqCp=s`efCD@y2KaeNxWSmMn=4bRmXfO0ZfL52w}%GF*Ll3~s|ZL;JUK%r zP!w}&SgW&SQv;4Zh?&~4pfm*PYWC-$HC1Jo2&$ozX?{JhCyH;ap3?y-mdLdY|D!EnoYChv!$kr1stX=P#I3!UA+ z!70rz?=l8_PHInFYZ{rtIuHP2!MV?C@&zWZ4W~og7uNg$}LjE3+!+*wXzVz#MXnqbec<#4{F4 zAkpg%tFSfUwCpZ@IvFBesaC%GeD-N>Jebo>nEX@=zngn*$LpNdIIE1|yDM|%agixB z3c+0Fo<8ZERj|K@-z)KYK9I$a-44FVk6+9^R~VD{?cty|7&hkq?_d7%mj}K*k%hvG z-z^m5tG*-dtqqPAKA-jH2E#c|9Qj{!SQ3u+FKdjt^8B$ndr>L)xV{!Vvb*0~2qMK# z^aXhQkDbMZ-Jk;>)Yt>gpK$j;xFD&(s4*huU=mQ{U#!&jK=;T(qQr`d1}a!%(m+$2 zt>vy4^O#s?PD|_M=>jGM3mly%1#dw76}!^%SB+c5vR?N1A2>i(cRnn9SlnIyaI{e4 z@k2vp;o+NL&^@Zvx-x4E)6qKgcAi2`!y@!{o?#N4M+uy6x%y#AO)l3y{1?p^t=edg zJe->aU#)g+60e9*%;oI&dHZzsSjp&{rDe83KrIxP!RD^;a;#7>)FV`AS_+T23R$r^ ze`qXE&%79w=xxzNFp$E}uC5cxl#{C;lEO%?&LLOz_4facX3Zj4Tw(_O$Bt>?4>uITDiU-MdgiY?N8Ryb zlL;x-AsOLDzmT*E>=YLuMz_fmRzyOJ&%e@?kwFtkMPIG7q!!LK%6m|Ag&23kDhV4w z8kF9CSjxZxWDz2TS0*OAd=XkfPaeg4fm%&B<_`8bZ-S{hc47*sh+}{R$0xFgmx|0( z>9IYmB%U;}-@k62FJzbXm8f>!phpa~hr|HW2j_%L#Q=Lf+u(@aGkdHgKs2GYD;FT` zfJ71>tLvOT7gX6m81W7dx}ofcs)+G6fOMio|9}t!PoXfp+Bz)`D$BC1@Aerjahw}# z+4;g{j*hC#D>KT&3Xm?)T3Q$C>IYufa-W;V#tY&YSV3vY2rj$^X5DP+vu4zdxz9eI zMQ5t8wsCu8vYzj5SG!xgIm7B=j8kAC5Lvk@_`D*0>eE#vGz+R%L}>VYiT=&uRQb=CW-?eAP(+y9ddG8I$hG8(md7` zfq2P_A#@Dy#v&B+(}nQ=yBX$FLOV7+spt1jN~5}OS|qN%cUqr%-9i$#a;5btO)e_$ z+$3!xN!+D`jh<#Kri-;SWAUSQcAO^PeyL z9p>AX{g`SpVh?ewNx~>En<#Fiiq~FllYDPYIxx$hkbk~n5!6HNl6Aqm8VV;-@(h655xibu7cjMMyW*4VJb7q~gGCPTc< ze9diT^EFYqR^LjEwll1$RUs{0PN4=)p}^HMqW5o-9;4mwaqWxe4<=f}2j7q!L3OXCU1E(q?KLgv0NT5uyo%Wj1Wf$O{S z!_ZAm^G6H=brxZh=LRB{-kTNj3)=UPjmYzXv#~F7u}# zQzq0-4-@z|?8qD7;RiZbz!06P^eGrC)F5zSXbruuHVLh?paz9_cJf^m-y-DPpvG9RRDwk7?Z!h~b2S;Mw zlgkP4LB$OetPe)-%# zq%2ta&v>J}D0YQSQ5Z)lQE92QZ1~#)S%6HP;o8K&FDF$6yfdr9G#3B>s`)K1(r0I> z00TGHmVJ9li_Q|J>OxdW)Hi^yy)zce>6ODFCJW)mQ&ak!WEBLScRRaDV3jYTq;Ukl zh}}zA5l(Sj`2|ISM#ZCilV`9bLKQ1yG;=MGOH4Y{V+KQKYQbjv3d+5Xg2zIDki?ep(`^5^=wVKs#ZZSj}_G`0ZSilYjc2F*9q} zlChCADqm@{)12VVt^??)VR+IIa$}QmT3Qj_;qN%D zwCTp&1Y}`vNa!A3C#evv+-QdJ3S}q`J;AZg=t{hdQ7419@Y^<0-G_DJG*ptr94!5( z)si`!z7O{WLSl-1OkAm%#e?kl&p~35{XFP7b4kJ<J&DQi){@#xXw;&uJ}MGKjR z^@weC4Y5XKMXQ%P@c}P@jA%Qp>>9HE;3Y*utCiw#U0KMUIk0VTx~|B1ls^mPpTX|g zAWR!m-I%&wSO&}u-ML7FW|u6k8Hy9C`Y}v@!)&pP|NX`U|nNZ+S+9f&TLj2aQ#YA^akA^e$MUmV?o$3v&Cv_EV z+TiG4gKl3ipI8R}uNjO;(OlkPOh&kf$ZuZM1x_{*Zg4X#01K)44#}LN9LlO^*?E&> ze-}I4Oqrp>|^{K@xc$flj`%e}O#H8wC|n+N_$BZG$&X z({ld4TPdFoCmlrA9X|yWGGdBEtpM2$Nk^ZNQeqUQpi*Tf=PNXQ78e^v6+9v@nrZe~ zmU}|nWa((5TzvwwiYX_VXKMl7k|O3&o21wFtzZ3#XW(~gg3#(t%}pfmqFRz^u25n&iQTZ=fm%*@9dr?a8-= zcBZg!rCB4Q16a70VxfBUW|ZM~1wtNJ3kC7HyNg1n)guyfwGi4GyBCjN@FgH}WN8$o%&w4s8nC_QGfr^G}7)ezYcXSRiDbSWR( zx1IWrgoz2vAn7@O>?|){HogT}`SqlMc%X6LN8*0pcd~C4u_aN2)nAVJwpRcMpa z$)`;aX(`FGVoi%V?b#18s&*0>vSP{E##DD`tC78$u*Su8xtryM12dPq@*WsZl74K*ypbv-Nn-9zK@InV2c=Z$P9QV&O!dPk}d_+-6eq)tfs3};|;LHW>#J0 zh#oQy+Bt@q!;S~yEShc7yxFUbob$eo;ONylKS`JY(@y1Q??dV-Q&km&Uo&3=4wS&E zEoz<@;7gA5=$vlOpRdLJK6i=D8j<0ag1j?Mnn-3UH5)V5GEUpWr9}3!sSrNmCs8s} z8*Q|?SKyL*4KakQxZFTG=+LFA1Ui_;;M4^Et;igj_6y5CPGCNw0v#j-5fZ462Ij=u}&*I5aG7%`}O-)a&9@Ue&2At^R{&jzkz!M{$ty!ZHSBScIqK zCVt6HyqRBxmnBD#UJ4it2O)l2ibZOr7cLBOMq@298h)=vAaR#-G`Z}4q&Soz=`&V} zm{}yj7ZkA1DH>Pxb6i$|`ptM@TZ5BTltkwh6m~xsO8On23mB#oQ7|VBikH`#=lC%j zdCSKWv?A4OSFRAR*xp||CGi6VI3KTIc!NnAev|3d#Q34nfJ}&3x*hx6I#8~%6zgkh z%X=vi;-wh$$nQMw`dtj=p*0b*xy`n;IKYn2H^84xO!hY66mE2RVY}=OBOfKghDj5| z+R5I_<@88S?dE3R#jeNu2cE{SB*p)h{bO?!5z%tRn9PfFne@*wE$Jq<+-v`ZFK5tZ zU5E53VGsm`V^(>`Ym1j?L~2a}iJr`J$Fi)_Y*+$3zFFK$&xvVPS@5_~NEie6-s$Pw zpEe%(3WnUX{K*nuYKbpd;t8-}Bt~!iKE-Xto^mOI?#pqEz`zU^8>;mAlVJa4Fz+it zmk>OMHZVP$eX<})Sh6sA%rgEr4W)r4f~a=9<=RReL#6RdoPT<6M9N}J2J)}MNPopz zOuhpo5fDYv?^Gk2(t)mZ7n=&{4=8HPX z6aA{~cUCk&!$mNMaxnO5zyBaC`jW)B**Ti#r_JOzy?&5ienLvh>0>;?$>8E`{}tk; z2?L1;b|uxKOSuZuFvsxifm?dzmSn*{tKK9->b? zCoF=^RMMPVBAE#U?;99p`f{gM4C-gvFoC%h=B=e0JyMciKaxvZ@F@zEURpTA#x}!u z$TrKSIa*fif&`sf0;>?$p+ugoqF-=T5#`%-V-8Qn=0KR@#UL0ml(yxGY0FK-N#IG29d^N+?vQmFNI^?S<6GZjNcdte9Xm-L#tkm{& z9XAaNO|0gl63!MDRHZgZ5_H(fE1EXB^nNXWH=!*Ko#=g{(ha4y8NQskCNq5%7c^k&7WA|C{)TTzxfk2Cq+)7d3%?C zl8B4)ueCWdTPRh2^Q=)x#Yp+*Z=TV4D#D2!tGp~F$-l8K^}c*f=e?lTT6E}(Y#jKI z-;Y=Up<4bN`up3QS~U>4-{`7TH(+7T(wAPoV{~QCx%65Hax}pamnsxsm~y+NDlcin zr&(eMOLcxwKOo|`bAO#5)y_2kRchxa)hRfg(z{oBm#`(Jmw)Bu)GleIeZ7lauyJZF zBZ65XB!@Pg{gmTYAIr&C7QF4;%CnAj!hpi-}Dxu_M;F{vkt5$g%y z|DZv|(~ge|v@5@g2O(7qHsg2k@GE_~6J}Z}+|4ILu~zPF==yD+6yH)xV)vg8V8;7R zmnVk?zNLYn&w?cU!6%{#=FQ}D(C~3Z-S73rC%9l8pEN3*WvlMjRFSJw9t-eq=JQ0v zwBoQ+R=ZEh$>)poTb*s&Ok+IU?~gDa=_u;8PCYI1J%^rNJ$&Zfd)`IzY>ctMzzPD$ z+;`Xsob25%J?-@2^igIu(fJM;uufMh&O0^o^#jj9{-G036&^hDVukXV7tld3r%%1) zWn9>ab5Gwrc<`yhJtv=D%{u!22P!pv^!<)D55QsIGPF{w3iFeY!Nj>hEO%)?QD^R=TZs)j>_*8&|^kogVOg&j1Dzm!BNJA zBD091^7siMkuBobl%ngvLeSJ#v#VU6)LfM`e>Eyh_Oh#;)o8L+KlLYx@JR>VgB5v^ zeWB;m_#5+vQ{w1{8Mz>3JM^^WQAYLDS6aYdMzz@Xd~TypPcsLO9li8CVj(Mz+Ux=Wwsq=U}7Gt zWaQ(Iiyy12zBRYEBUP-gGG7Dgz3fZ6Be%B)>7$7*iF{+>lLm*UVNfPYQq=>5zNJDI zk-8rN0u8~UyIhrOg)NGUX5JB}9(;kk=xm3yUL+y*-6n^o4F`D8To#@ND5wL+xlJ$T zZ{)`QLa3OdBX&E$Al7q@yo{XnUkp8g$dw*KbQ>K`SJtc?8`OOBYPJp;&4qSQQnEr$ zc;+Z|5k}a&cz#Ospj^XoCHPP;$_OE$Z%#P?3Mj@UBHkF5c~F(YuSymSVUL^$T1F54AACQ-I=NcR-8-7<*6nTREnNqp*hKS1Y3t5hHI}FL zjd+CfKS^F3fvXqu88h3O2G+A26FiiQ5ztFA+}kb%g`NAno=E8g-p>;}V%jcZa>9F@ zD|H-YsGJD;3Fds#C^an=0d@~mo>;L}Xus6|vk@pijDIoq5d4%3)?cN|fhuDMk6la5(>t3^k$+_m!3ds&JEZyE|br$z_WnGGGYB8NU#;QMd7U0vI@c-C(&S8ov zY8VLysqZ@rM2NQ604WDUm69TZ1)fukXWpECp>NTRMvO-1Ryx7x|6Yfosbk;XGVud?kZj z+FL$%?6Xe++>LA{U+GOaEoxjZL<44m9pi%1huy^+MT$Ruuhwx$vOY)#z9>fUYaq5> z<8c0JEiye&&8FpwXeDl`D?L&%z8Wx{dqx_a#GaZM3o&&Sz~3f>r2HE&ujZYY5=98g zLDpUt4PuX-PuAviiJh~6|2Y3kHd%)&9XPa{uPHsGOQ%!FX*cHFE1^RxoERTY6<#-R z*bGxH7FtTa3?o*J1+2g0IO4eUSMQeRpAvI(HfJ{r%-OZYDrgZ0wy_w|rM@AAS&om2 zZw)qRm*d34kp$KjkRceOxwx=kQELhVDM>JJ)~J9hb+*UH^tzUxV9Kh!?_ zp16C<#KrsY;U6Eq`Ea}Y__$8=i*FvmWNeZgu#04xJb751c)mbRl8LrMmcDi=&0zel zR=*h!PCNY~u>D%?27(!B5XRIfRcyQEO(xH2+*AF|ZUBl+Ysd;G!)xkBgHn4~@Z@k# za&B)i!t^_q)}VR5Y;_=cM(rE4i^6q#01uDQB{A0_Ch(03O=$iN{FO^kc-SWVsiL}T zxEnJ4@kcY>@w=bB9w5~xMwpe{MKeVL$&t7->=5Bq-2BgEM_R*Dfm?$na)xg5?ey+q z5~2`H<kRzW)2N= zsnR&F<2cV}k2Ay_y|>H8b&NYIht_15j^YU7(uBatVF2MtD^+U{txhqO35x|l~?~yA3juf`or;u4+Nb&F3exky(Q#U1yLF2KEd{~%CNFr`7o^5?=ipsAOHE` zgUUZt8uFmbd;Owb#jq)U#FQOGUI;Rp{=foAag4*x+K1rl9W(9Sf`aNCU`+RH>M<5K{;Ga6TAQ*Sbf z$Cv+jjHP`s@T&;mn{Jb(z;VPx3{Tk?dc^b%jWu}LcGM*FNkGy%;2uo5AaJpi0P~@= z^uDbaBvVbOb(tY>Gg4ZJcHhky5BBjRwHPawms>gP6_dpuazo&v$jF7p5bLlFvzwhY zwqzp@3NX}mVq30d7F!!88i){i+VPt)TDwADMimr>SMo-fN%ERSGN+GM=DK}|R{yXw z_&DbWi7`Z$lNDII{09*mt1Dp^YtWm0E1B<~UCJY$%LUA6%1a^stySKen{5x%n6 zP)fAViroRnF2Zk=*?vKmZTPvhbbW*B8<5ni9>Jc`GIz&Uq>QU;#w4K{$ehNrLbI1yDm*TV8b)?U@8{+Yc9M$YVX1=j+mI(wF!t`sr0tUggW(5AFAy&i= zH?%=Mf>Q5!Zxs=fQj6<2kqWw4!8%;V3hy1_Rvd6h1?O~22aPRm#ZOTQJsa40r3+0w zepYNg0B}Ht>F|6%8>9_%H=P@f*fVDctdrePZMt<~|G8m5Q9{H9oI8ZV$el+F;&x|@ zO|8jbwPDb9WnBDumhfPY|t$|4D?>!Dm<342zHywWo-npF9CakgW%zqtH z)!-XB@n$s;u{Xp0V^hEts={-q`rIaI;m>!oP5#McX4j;iy?#!%iqHB2me++xa*8wp zvXbTR@R7tDF3my{SX2UT#B?i@gVkbvFICw}t${yzIFZ(hJraUhN1NFx+OPeC4z^}D zdFq`;C84d(<1cz8oVW6j?~b1Yd#}@m=ThPRLAZD9w-`XBZqyU&V00u7!n{e?06w4#DI_wdRJMl%()iJ{~%0E!<`(8fVzBQzv*fvgzVzC9rmUtom);u9@5X$F_0+G z>L<+ni^&Mdo z&jm%QsBl~ychE%%=;rRHGg==iP{R0%diBcQUT1_^(&rwo3D6vJpRc*?4*82aV8_ z>ivR-Cab5-NCGgUDRNo=^bG;$F=gR?*u{;9E^F0sO#{>K$?s4LgdHEjYR`?A2{0N9 zsCot-g%b|V1y)pZGd{+_JDHwHa9>~uPv>bO1z<`MNs zmm^Lh!NhNpPgNJlvx9Sf92FyfZBy9KUd;E|&eaafq&RLz9ND(c9hjR>Ro+)`$fkAK zJwsO37^~NJ)jn(m7cambE37^u-$oxQ9_K;B{5MqFTK(|tbAon-?(CCtryhsP5|7ej zpP+fPTB@@A6ea2+37779b$gq1wn*Bk*s)&tH#X?F^Rc0{uomYWzDO7`Tdf=j6^O&) ziepzcK3b} z;SL^UxQO^JfOag#)MmIqF~raeS;nFxPq0H?`V&xFbf@+WN~}92@)NEN@&@aqR}F0& zNDslA;qz?J94ev`h@A2N_NGso#{Tnc)a=`vC%ZfS-K-xzdRlxW#3V4~1f6I5iz`O=3h{@dIg;@) zBoo1T_X<(vC(b1df#XYOO*vGn&R?`CFKmKCEa-0 z5=jB$Z?XaoJLjLfLwOp8zAZ@>$tUB74i7(rKN#Q39^iv7nNAcn0Yb0aE&e5;gGUFF zZV~_e@zUEqy3udpB+}n4(V2C;W7ERFi9fUtkj5LQfeKB6n{wf6F)91R;^|>94S5^M zV!B-A{r<44_bozPeg0H_r(sjF#o62+cMr|7QYcU=fFU9)GEC^?3mt`C7*r>AgQQkm z38bZ`JiZwW(W#9g;C{8!HxdN3Fz^mPUmD9(dMM_rx?W*>*gZb(48!6S<)I+CeY)wAqV#oY3;PvgsnuKvvE%>a94}Gtus)b2vxSv1S&KL~)b9kBJKp3s>_kQoat}p|#aF^=H zg4`gB?!I2*-cR#Q#vQfKEjQWrFy&Qq#(vZ7>E&ieoM(7=W#Z%TkoFM1d>M3>Ht@KB z)=hZBtlp;c@G%rG=}^taPu(SkLQ;Pp_Xi`8jt2qqYA0vNORs%{it1bPDwa+!ZDZ3j zESF(SR0o`kNSQu{9V5!tV8|tp7?yrJu(429ZpfhV{07g0cn|ui`d!Xi1oHn~Azi`;UM5!=L~7 zmpbJye+=b$@qZT__&pQuTY6Itx}@Fb*>{f~efK;|nk*KiTdci}HSR+`-ogFjee!P` zC3Zzi5m;=P@u67PQF)vRWW2Ax%wYplx6HGX7V8TW@t#bi`FhvtFK5?!S+3=A@!r=J z$8P@+^4)lO$HKa{Df_9|tM97soriguz0bK;6z?V>XmNKO?)R!Mk*#$)`7En1O=>n( zn0Hq5J^T)!7Fmy2Wvde(iq+{ov^w=+r~cV_vvdUSCp({b9(E=QXd_&z(8s{5G)QD( zw6m%$;D&Tmlz5kSvYZ%!oUG8JNA~08L>uqzyO(!O#W}c`(~a`A(l%EsMo|8*_b_*e z0Jn2ACrK$PJ2;;1(OjW{tKiAhhcGdaN_`F+f$;dU{K%k6uRrs=i)i`R?W#|U>nTf; z&yuSc{s%^vw1r|sY(BPsPAYR0JbGyJB52=y9(Eh=>q8xHzZwvG+LD(`))+&s0v3L| zrjUM++X_&)NFlKzYNZz@(-B)5Nx#h~J`@mn^3bFrMEVu)hLuBB!co8k{kN@9<7Ieq zyA#e7FJ>DDFoE6vMEU2=uf)%=EXfcY1M;=W2TFOVa(N_L((roLK&O{?X02qs@o3H0 zTMTt+&5gs(f$7UHSodM)h!sEPM%-tu48*;nMEO6}Lp~-+_`Fu?HBjgHfD7!7sP_b$Iy~vx6*!*9KKq(!uK7|Pr zq$G|3ENIzEnAT~c(u~nL)`rbZE3bRj*e+M!QHNDp8tN`g^Q&DnSKL=}SiEEdb}e{ZAvm_hl5B3BXUV1qL2ee@RQGT>oQ3AJn6L2#HGX=byJ_IiX z4G1?kAmj`g(f%)HBO+{wlRa`8)(dU=(&uvt?I*L52&lNfPG41Rb`Mo3X1iUU?VBZI z7qh2e-w*r4KDXWMnXoev!Tf<|leqm6gxoF-C0?Z`1`vyjZnq}8eMeY>LoFn35bFH@ ze}5B!b#>g&v|yXX;oKOty;Be)v9$XZ(7KnqnoX$8=T-vJ@8ELcBQkp@nFT{*vmD( zo4pAZb9}Nea=gL*?m}$F9Kas)Le5Jyk2?7RD@R_TY=4yJ zgYMxFlGw0Yf(whgrqpqmn58U-5X+b02<+Gb>fIpqmh|vS#-&0(2b)vppmv`%m5HaG@mcKTYYHa2Uy)wNx}{6JCD zfrKk#1f;4H=39|+ERy5i=I1Zdy&bhl=?aOed?S9 z8s-}wU#*3Khb=T*+*3mkGHs-x5N$x%EY^jbaPh{Tbfues_J240#zNx8N4^sl`r-XC zYj|KEp8xPDg5<%X+D%f?JJ$1}Wr-KOf+@-~A1-;AL30>EPgcLcS*~z=iR&G6nQJ6# zR>!o$d6w<)9$ae~XcNyUFc=HH=$ahcqG}T`0Bi$-A?x!b(7k7|?tZXaUC^d}4 zVw$ATWT>7NdmP*Y9cDB! zb?DH5e!ur~_u?@B|4lV7KsDYXE>z=xdaC(w2i24r2$(&b9`0Zu@W#7Dul;;jj0#bPeAJZX}jIjKcI|FZrODz+L z2o}_fIhF>j^Dd8qAquRNdk-9#Po^Ouc>OyMjegNUs*DC48BY42;ZoRXjPr&rDO<%$fyDwZDSI_R2uT>#6!RW~x`W`e z%!9PFp%F30ql4POR@?BW1Gxwieq06>2SxvnF0M|k;ZZZNA9jpz%Gv;&U?P#b2)!T% z2d)8OjvUje%##3uU@0hF;ba2`SLW5RDAV6h5jPgJYPeD`HDt-MbhvPYNq%fC?Ped_ zV5ZW^5L2^;6iMlu?4u#!a437b`<{d=^Sah)gw83P*24ir^3F9Q&ygJ&GbhPO{F1E_ z$9mrIlh(k7aM|yGAmC%#fE$c&-^V5>cKk;Lpv0p0NPF}s-Hlg*4$~thUOJWp@SQed zNCIyDTjIHjI5#Cgcwaj1TqZ!``Hf%|?mpoE2R!z2H`V>7u)!uF5vCs95k*jXr;b)c80zbC-EfQOe{B;V_}oe&0g3Hl(T9KLmNQ%l*w@P0da9k zl?CBgj0dR!zGm8u?PI>m)A|$|u~0|ox*y8|1LXGL*NIfjgoMq-HRdS$?Vb`uj_?ihvsxCzHq8_qr*V6s2M7T#YP^R1% zChdtC@s--De19&C>pf5nf)@%94)fD6`%!Pn4zOB_IRoY1M=bsTTb8WLSV6S_Bk>MX zLzJG9t#lIO$dZ%6q{9^gie$Fp+GUJR=LcpVFjE`1QtlJvHodc812Gh=Km_HwSCm9X z;=&Fp*e>fjD#K&x<(@c*2We4NBlVRa)xB84BOIXSthzBHen z7hQNIm^}+Y{T)fKs<^C~4En(TubmF)CS*Q#?R-EDK`lg^4)dH4n6!Qo{RK)bc`pI~ zFZ_(W!3f(hm+PE>b)$v5W`zvC(hALC_m~(=BffAVhMgE_o}-D;6M4$x0j@>Mg>eSltd}djHC+6Ooc}D)2t`#RLdg+3J3=DzgS6`fux@v}{GTV0=h5 zcxUjQ40QL75J2aG_QU_}5yKp45D9*yo>7?JDiQ)LAno{gVM7dycLqBOHs-AB>EP#? zSbzwU^cl z;$EvOg~70nVs=ZodA0CC68M51ugJ~K~=_Ysn?JMKtXs^VpN&H)pB&C;k#JBd93CqmrSc^6=@fXMA ze3bn=eoJzf?4NkrHBsl;f3OCNDh9`T*$ip2- z$k{V`)=KDm_KaS=tI+gi&)6+;vqG%uWY5^=*07HRw5ZN*C5R$>#!h8Fe#TBWyC+=; zPw4a+d!_R|^qJ4tE!%w8Jv+kh=j>Ppgjo3OIXj1T3uDWkOYfJA0eH^tH;^#skVAgX z{nci}t zZ+~2AKX6=rhDMRTNW20A2(9;W40q(gd|YbQ9u*oN85{`SBDkBX{Rxc8SVis? ze*$}cxZ{>w^x%UcXu(<$mpw)wfeRelmBDQpv|zEfsV}Kv3D6gmdi-6L2Ks8@uvjZ( zg&cN%yC}wML&k!uUmhpv%6CI<#HjqB4_o9r$V*Ewz+{y>(5C9q0DGw90f3loADuW& zTWVa>#hRPy?zjKOvyr??&TpBs!XzG$5yj*YzV@SgS3+MrIe3<2{qlpv6l4UWrf!45xM3 zzY2`z53>OVMHpb7?uG>k17#0De?uDoKvpb-IdbUZ?X4xoEpTh&X z>g+zEv-|SisO0NDGQRHKKlzRG2?XY?Y$)?Z=i_j^8O*#vo#hse_PEQ;BtyrOMg}WE(c%F%TCyufz+o?)ZWjjcTD%7pRo~;61DDF|HvjQGR zy{ZBpMLI9wao{BZ?>|5&J3^9@WylG3LFORGEDlRdFp3nTz;#GoZ3WSmXOaK{+V2VZ}MnL8&Lg;%@lumJI!@)3+_n90){5$%nwe<@W5FxZo(_D9GX&Xp0nZ z!TnFx%%x?11S`X-$2Jvlar}m=FpA5SS=dcgEQ6#g)8WvM`UQOKB=6Ox39cxvj_gZ_ad@@x;i7+h`l|mWOORyl`1GXzMdQG6z~%7}k>L6imag)0 z5iBG35=rr-B&>uyaae{yoxT)=RW`fgUmesLX$dQB>CH5W#_9QzjnU`BAv|kb__|hD z$m4SV0S31W=4l#QzzFe^q3x?oF2pcWP0Z%FU|i(!*eNX_ssb)?8yXJrfOq*~oHLy1 zSi)yJoFm^*kn~L!Y3&=|(+{Pd0%mDXquhxp%ye85t^#tIU3~CLqt*{BkpT2 z07n1m@5 zK{8BTuV1?&OFLmXd4$0=&Y@*&qC;e&<0kXoGRL>baOpE4xrSv}&bOxLSX);XnAQ+Sf6D|rg?JHRMADCiKHH|?wPZ?mP)Q|MX>C&HN z$VMGw=GSC?g2=?#yq9LML=kt)rKWUJ1&I@3OkptWA1N+c0pYDp!4www!S-gdIXA6# zq&NvfVR+9N!dOkhU8FqDWge-iul8%7#0fT{<>4ajagoM3tYk*xB0s`EN+WzFncVgC zm{8`GM~V>Scv-@K`AhDRL2w>z0sKwJ-7Mk1{6!m$8U~O--8`}!(?S(ISw8-_*naFI%dzQ89^5RkPg2|39TK?K%0&PyB~->NAQ0-aypdC4f>@KG zKx0`|kck-Iqkq~<68+2X&JJ=+UXwWrr14F!uvz%0(+><47?4@D?5ww z152@|kINEclO6_`2}ul^pbz^)d$$)OWO!wt`G$_tBKKef`ovP??xC0ndf;De!JRVD zf_>(j!z18HWNrH-rN#9S4IJ_he=Dvvv#G_r{*u-sWmeJ&f69A^_!k4*3~@AKG8m2_ z_)R=sl4(W=gW^RKDw}l{pxC|g_}naI>9iCF>q^xo0R9(q2hk}}&0GM=wQz^$I)XeE zzO#ZAI7)o#f<*zGm|}%KnJgAyFHdi8T|=yc>s%qA87d4+k(*5O8DXJ@l7j8=ONq+_ zqYk%6%SS1J-iM1i8Nb9ifj?baV3lk$*ag0DJ?OzqjFPn8$OM+k{LK9{GjC~V7qi2# zoQe7uY=6AUV+&FP5}jR|{N4B34QGtf@AWmEaH2y@gkWK}gnxwLrJ^UYdrW|lK}m%po9nkzG)f0|LHc^VDJZ24hBR~o1?vq zgW5_S6|XO5>7Sffal)++{vNxy-7kk#ykm27-UlOfGSn`XMbuz0-q#oLc*6r>fQHJ6 zaJjNka3>LcfZNcKl_!{W@H?ZiWW>y~+gtv5u5vfiT`iNuYtHTXGFQ;MCZtSVo zF3MTQlvk8%9lFG33&cC7rZ{uO9&y9c#04{C1$r;|o20z9?=m+NKvd}G*5xuvN_qN<_%~QD9mkhPDnr|&xNZ@290)a#04Zvg+lbWB z^pt-AF`P5^{?nx-%qhHU|gDPe$ressDG4Rw;_m$KMj|jtPUBzq4lf}pB+ufXk z3UBFwgh3C=(8FU_P8f#caGihT_TqH)>dzxkmC6J*+|I%4IQDQceERFB5&q@9@S43V zpDtyHN1ava8?FOKlg7mmY6h?EpQ2@;&x=_DF5A?D2i#Mv!a{P~;J0A`P*~}(V|@dP zt!;iS&KeoNQGB_BJzrw)eVJbjnTiwLaE(%*Y2u0ELc3CyOO^AJ6S>6I(Sm2j%)tdL z_&jP*#X+Hv|q^CDrO&>f0yJZ=Z59QN0-SkGmKEv%R86SAyS*%gvoJTTYjeIhGG{6%rc* zzMrPRDhDo@{?4KQ;ls_*cd%}0Pm4MM!0Sa9t;rm0j`uc4h)5(dpTg^Z?>F4Uw68OS z2S~%FL@J_WLQe-wr|$%JrP)f-C@KkTi*etsl5NS79_@>*rrfGSk>9F)gx`b(o)KOQ z!_X$TJ4yVpMuvp^j9RqjG{trId*H*0j7y1+na}yXplb2 zk=9U;r7jy7UPDb#jzB495|DtizYPe^QZ;g%*wCYcun8++_zmJCU5^ZIEJ#2J?h;)F zTUh??jb#JNa6-DFbK^&s9R$^$X)Gzs0B;zxJ6awiZ_DB?xDa**?&!C-^2lx8l|hg3 z=$UI7H>J2wA3ft0aj48Hk0$8O_WwOnbDExQkqsFN2lz3bli*c6FMe;0$mOHCm z>HcJpgKsu>A1$|@JVyZd9(=yO|A@dj1X>ZtkDg78IJ1jA)9eg;yK^u);7gol^WgSi+>KfrSPR3gIA(mwHq5BahWeq;Xwx59+ z;8-jV&(NDW&Sc9T%n|Ny^l)M#7-x?X@_;=(cQ>{~(Ap=wDszE;eG8B+?rdRQl<3le z(W_qsE&Re3QX|e9jMYP8+rg3a@Vl%#h9nL-=H(EOX}gf`B@mhE8!LauN6a(FlRuZ;Jf;FtSIc8QBKO<`km6t+MT zG~O7FC^6MK)0|;_G8Zjnn~F#nrfMh8$o}SDsnZl0?8~i(y+M(*^E_unFQF%$95-jJt9TTXkvy8-%4JU z?ZlIDw-~RZiMHk%|*~!#>4>z?=s)a7|G*j*arlV?&0_+`0L?7jP7~UEG!2m z<4qL;TtWNbnO-Rik*A*xwT*)kEUm@iB9cTfZ;rxqSDVgn22#9*N(}mb>MWcLJ}5q2 zJbiljbpMHwb&Ave`F6ev{~3~v(j$8|BMI=Jhd0xSekKEVz-D$v;Nf-L%jDK%NPQeP znw2Umo8RrQq@3(Yrm~sY6;h&Q3r#YR#v~9qoMv%(ob;vHg5gm?3xTP0dRWm zHst_6wO1G;3_Q<9tv0eKVc{JjI1IKhZ5Pu}GfX}Fxf zB9){3ibljnny*dO?rkgTlRP0N0yBzNYhka z(_r6I5K-Y@zy=n7EOkNrar8dKq<}TIvDia;Q98vf^Fs8XV%+Nv%)+7j#Rg?GTA;K3 zj=8e=#|>;)@QV8WW}aJ)52tTfAC=~x9eXr3&_)QpT z;r+$nH~Got1@g2(p<=4zwXfT^mvbvVTx~>VF|?`;o>6q^(gEMv_E_4GuJN63wd14(1UKQ(VZ zwQfHx@PD`M+wAt??SI{V+PmGq{d9Bt>Gt;1r1d0KSs!0LUcz@zZ}HFGv&a9rzlRR? zziqYf`_qE?!5Vwr)&0FkkN20P>``m!Nva1I?Knvie(?!^Z}R=kT&Yd`hBxX24!(24AKT@!|WL&t*TCV`HY zK_zWLxIm8HWKmxIF3TJ6oV%a#ued^(EhetFsjrYCV|4Kht;0 z)@gv|7HAe;c(u9w`rYdK_QA^PtF`sD?X`_{)AVrgTV$mpJFZt?oG4Pi6Ajd#A%DA|W`# ztyIYddjg`$aiMDmjexNRrOB>w3PJnKh=oxW?mJ6v76!a1_i1TDyLBWJ_3`)g98#M0 z9uegK00cFtvkUbctF&3hW3|4k!TPNPi@90{^K1(fGjpun=46npZJ|suSp($`@%IVa z3jzBkNxkZK zTl+?#JRC#&2cfJRRTPr71QgFt*ehpUsZ!XL zq4_E=+E3$2ueK55luHH9PjC|IAk~O7aG5;P}n8|{zJ_{vXrdjkJf1?-0MyKiIFztrzJj$X9mZqbHD|w6K%Mu ziOZjO6tU+^bB3VsZBHbLnT1sCiOL_xD$=PPQ}q%5fcW_jXiy>U^@lIuo_1PDN7(~c zS-b`Qtwkee_)Tjv*-yjqM*|=()8y!)4`(^jEJkWjP*ctN&ZC;cj6DN>$3f!$xGg30}_4rMRU0(YX=O#vTZRW0FPJ zPS*1waU{PcGFU#A#~N+eW^|!6rrd)s9zae5+I_1K13dZ9{Km3^_TDkhun7+8XT+hC zBtxM73)777h(p70&11+nEn~;#6|@0nsO-l}tRcSd(JWd*=agAzux0B&Yh@i`=vFWk z3hoM#7w&Zv(eZ~EOAvTF=+3z#*V36#m_qKSOo+@kZJ?RjRb@8W(?c1Qn<_i*>T+^N zBJHNo1CyPDnr+R)SzR>}k%DcJBwITwO~v4AC_HZA8{~2T+~X+=S*qKTqnaZZb8-vo zn2)O<+huQ{(t(ZvV${X|)Wq5;*P&PBz>*kN#$rWUuN$sgYJx65VHGh<4wb?U%l*h1 zB6@u%t0Q{ty3$dg(cla*V}9(RSf@r0%yUg`Krk6*Q-^9$B8}QmFOLLW?!n85A?ns6 zcq1#3l&%2+K82T z#_0$aSaCYej1mqp zMs16*PcUA&Ex2~(#y^-4+GvKU{#Au>8^u;pn?lWRbjmFDib=`zpO0{Y!Ob{rTs#p_ z3T$P9Pq?H}`9H>Gx(L%8v|%2ue|NGmj<4@C;<>(}<=C&I9fr#$C2sT@x+I zYh@gorGg7#*g1#z>p@M&#D^*vS2kYmP{D`=27?q5T@0H-R!Y|m*wFbqMNY!Wq=#N@JfS#4WwZ6< zvNZvq1=g^^UUF3=9C-tF3ZT4?S>aF~bSl{WwDsr-BS)-a=u-iUCaB=24NMa>L101s z4!9s^L6pnOB&X;_>vVb-{5?(IKO zt6)d@VXGD4#ifW4%**;HGEAC2F%M!30mnnczX}04e8OGQxT9k*=xEaVv|s57lrwHz zg0rmqX7pi9JYNe zg=)|8aq9QT7=$?WZL@=^mn9B5CH?Mc6}c_LP_E+(0Om5gj4ASR!C5F<>7~rdB^-e_ zWl6BQ`2nt=P~m&G_-;T7Iq2xJwTLOe@fQ~W0NdCsE|uP9ZxrGRcbOtdh~Y7p3wnkp zdd+EmjMr&B2`$-WS6ZTU(8aK*H<0N z&s4skgTU}R>m0BM^M0$lH`*KS?`LEE>#Vurlls#}c4Jmv8y?2iuC*7+6lB!ONV%@j z+K+|)IRJ(!zGHo^n<7um`2 zESs?GCWi3XDawW7;8mb(&=C{(o<|cnCFF|-*jlWJKsPk)Cn%Hx@JQ)4EN21A1%$Ai z1t{m>vap;5mZJ*xzd&&B*;x@fjgV*92X!Cy5tFbx_F0Z zg~078aIy@C!4i`d4workL|$8g7?>;pS}A$>uy2>9t{$$uu~|vNR?2N~r&6#UJz7*S z;UItz)G%9_84O27WPYc=4YO-4wq&N!3yMMWo9}7GiEQf3eJc48dbJY)wGzIReL$DyhZP34=9!I7V|k`>=x4DAX>e~R)`Xj+TRShdUT&_v*YeQ7nxxww->)9L+*n@`Gkv>k!dP41 z1*`zkieKr=jdv8i+ldva(yf<2tiD^Ou^)grlRk=<-!5<3Vr$AzH(tD1eYt%g{mLit zVb#7zw>ztCbCTWV;WJ6!u5E1}m=|xI2_juv-(KB(wfu5b`wCTuNxHKRWata4)=1LT z^__QG#?wC409s_)b}9hmAmIdQRjVmV(BbY`9!OW#Hi4_PT{AMLaFB1--o1aj%BcXIc=cqG?k;bxEx&jx-x%);)Ud`E zeCqrGWb$>&lgVO4<2otGz%H9{{0rhT2wYBLh|j2949=bV8Vm3R4ydtr9Ji%2tdSSs zR4>L02M3yv_yv|1;x4ftn+~;j$+AopGg8F4`m;P3JN)?c5Z<>k1l+bau7>YT&Y_jA z`m;a=;c;)V`Jj(35>&!TqS0T1QRU#ETOd0OmUz3rz|@bt;`H_wZjt7eSpJq+?>QkVi_7YVHBsf1$30>)?!?fR;_{&#CeySZ<+68l?Y_^Zqu0xz5PX>H`a3~+$ z-i8?RL1A>iZFE~BoJ(x#9O!Z$807kZmEK_ypi9F(h^dDUF-gD~lG?%}?|8@0SO1KC zgO;dJ47;})g9dioZh+RMZu_RA)#;(QXkb7Q%=>ntKq=E%Fz5sci&&f5ixFUft0ew8 z=RZ(z@()#w{A>IM@#It?EcTiX{<7*2K0B}VtufpR&O(p6BjEgS2Uj3X2f6e$LXhSm zk>i~v+HP5wQmaY&MU_7@y0d`K+0QRt^TR%-55uEp{+9hWv)gv_Fn`nT6N{PG=i=Kq zV+1ZVjo&<{~x>_I!3r_kc=ZA`joj+9+nP zjd0D*2`d%`8jcnQ7+-UMj?x!6AuF@*UQxDV5Xc;k*Sn+XjAeHuA;%E4nO-}?&*Q`4 zPSJI{EsI7M!;O&pn2)G>T=ua+T3Yoify^kK*i9Isleq-OzF{iZV{<>o)&#ysh$|2a4?FOabV3@)#CUQ4M$R|TQe~%If4*37+HD;%uy-_C=)wL?nYRTs+Mc=N!nlKK?(^{w zS)DCe+1rm6UYW?hNov1wzMS{_EONrU->1%_>VBWyB(v(nNP$zZg!E1J>+$FXmJAE7{S);pj6&yn>Xy zV*05P;|kQL=gk9f0dj;>qk}Nib|Ct*RI}?c%CM~^j}j;VQ_Ftpn3K)y4}pw{T@FOy zhGiP2h-^1cvjfOa&RxCb;#p6fE`I5>t^9HpHCe_inq$C7#S6HQ*fOA5F3q+%!pd2% z2A}4&OrOQ+!-q#En${j83yWt(X)ad?$#Jo0HLI1=1FFMgste&*s$c)oV7vaEKw{== z+Pt2cdEJiZ^;GB8+`eGu=(K*0wzJdvIokGfv>naSflh28F zyGjGqd3s(`%dQ-4=eb>P8)m)XbX33M>@nQ*AIvs3MjRT~p+^?iPR@3pYJ_bNT?_O4 z4NY{|BU)4E<^XpE3=r7>`v0ED#l0f1-et{|*kH0Ev(y3^o4vDwf>`@A9aSN>3^=6? z!VHS+jv2AXxSOSQgS#%QG3^RWE_!6^{pRZOiUDeA#eFnRV|8i2wbXAz6lwNbHO<+1 zpxVW#L(EjxOtz4XZVKdubyPD271%}Y!a@xsx3_nFN<9k^_{nGWmju0y%dDi zTSEwA?f2d%dLToj9YFi34isV@R07_`7Bzu;iKYX43#9 z>`hg`VP8B7uwqyypht3TH)R0mIfO9?F=pH8h#1|=ZVITIM1C-P&7k$D&^<^qUz#8B zhE&vVNS&;x-;g?fL+aQK$tS&T8@K8vzlQj)X{If(4Wrii#EbNZaxC8<9u&Y2(CTPQmX}5fInTDmW@)2CVGDrt&uBMjRdtXuA z2x+w^QJj=0Bq<4ldAQ}k-O=eZc@pZAnn4Ef#)sAKH@=)3A5U^P`kUOje7^R5%0IAE$6rl#t!Pk(|~u66`>!EGDdeMG);| zgFi)6{CYl`s;yc1xLs3i7EKXz>YS;B)rZ(+eN}QyaToCw4I-X0sKd8e5mU|vT+qhd z#hq9sW}_tASKBLz`S8LYHzdSkVdj}Imf|bT`ZKVGi+mLr9KfH00+B+76dSo;F+4At z6_fTg?OVyNZm?`r3&^j*#UyMMOcN2`wfjZx){<tSc;n4;2cpY8mGI-?d^7@ zn{7^m!)wtb!iSw^Q&GA}ly2f9#g%m*l5Op+pF)R$jjXvfwezh?=Ud2p4NVB#HNoFv zm?f7BCf%?`2O($P+SjJ(#x|fEbK@`CdkEcwSE)r)k-mjDEhuDK>pFBDaeC744myQ+ zlkRh~aGb=PhY1g~42t+Oj9mpDTkJ4@RvG-+Uyb>z>Ahc7dcTTMA3}R89|?3LoV#aQem%*Ysl|(XRP5KM_?+J?SpVS`%-Bo``#=GaG93lO1=!7 z2jW+?U&<|D6c2Dqq2(Scj)SU*>~*8v^vL!m0`~#jlqEB|9))M^fNp{42DoDVkgJF4 zP~jxZFH%ZnE0G|O9+2prV8o+uEEtiILi6oU3ixf$G0R8LaY89i(!miYtfl${IV51C z!$O9nH={bX2iY&)=dkF*mdzFmWctAtpwwyZ1a6YewHAv7_zA5ZLIdA{Skx&`zI)rl z+reH>WTgEJ!XPy1eLw$oCzyfb0T~=X{kZoR$r)tU%6r?QNRK!yD4AL%ncv%hf%1XT z2&Gj5=?j4%@r-mOyCy!5<Toj)xkW*%+xFT}AsJ9$> zP{|QX0S|_A?)w-4*r@UC(9j1uqDu?}X8B|Xd36^1bj8y&Rm{XX&?6#NX==ZC9Y)=qWS-Uad7u7x1+N1T56zNh(&=zQrHh_Hz(|!|j0-hZ(6kf3Ck`-x zDYa(8=sxS@LhvTJcMHdiko3~ojaXu+(o#og37BdcLJ3D!5-(@>Q6j8gt<9wI%}v&G$Xxg+u86z%nGc>-+-)4eC4lVA#U!d3_L0a+87}`=C(NkJCF4JrBFLkP{k;-a3 zE1gtk9YEpU=)Tm(u-xgK>Po$oSEq`osm4=EEDZK%cI&%R0FcfRj3KXwA+IzJO^fv< z_Mq0;j%un=ZySR;m=jdrsRE5%8&Moc0obXB+h0#**;U6k;o-){UjislQTl3B+s1HT z*0n}0YFzF5-ox|l2Bu%=3WQPWJ_su~V~bz|E^TK>E@}^3ILmZXt6U<{RsvqQayY_B zcWt${0^#9+A<;=%91hfpIGTu>&o#hJ>*C-;SKtNCt8qNmwkJruX09E_ z@wr{oa%A-NwQL6Bc@e|JBX%2|+l5!%Hk}A&x6NE8rnCpNp7q7)4qMwC*Wd|%ikmrxBG z?pOGf*)c+a)OiHyDPJsbP*I-4Ys9yShbl!) zTs{-{d$q_g845%2wg>X=;9O=G zLvoq0F*4%6e%9@T;E3-gQzxWv<{=mKm;L2FoO?Ed^&%vB34aj@PI>@WYedq>_Nx?( z#G%9+r9hSf_aMexEiT2P$xeiwl*xaHd>4hWpwST8N`s1yPWQ{kNfR8~tzMgbL+cWQ zxOJi0l8dC6uQ6MFYI{)>#(ZstpGTU*6q| z+W+s{gMKx&^|kf4YwN2Ac7va@_0m^UTMt5E=A2=Pote>|i=mmfJ$^8?J>&8s{um6t znXgg(YHFiGG!oS^UvsX$amSe2aAZK36IS=l)K+~&(0t%Z{i&_FP@?%7WA)i>X$;c* zt!Y5i)HZ#r(tJ&7{X1q{EBRO_!;mGkvPQU?ss*Uw-`3q~>mCGUzX@D?{$hO8lkCLE zTL>?P+f3PO{5%jh#Oc?H8|tha>QK_7$T)3uuOeqa?VCb(F3yz)cIR8sy|M;)W(x>Rf76Fh-jZDJ=$5?$h{)8ahl{_Y zYs)vb+C1`Lu08M4Gm@Aj8iumi~?+d<8-omHf0C2cg`Nq=pNdGYAH&{Yw6*cx zAbMNNkD(j8(IAKRC^gXz?P1#Kn{@3ks6p|`U{3X;&y}UI80T;6y4D_~s@}94LecIq zxs!4IY+tGd^%`GzN0auE`G_;i20Kn|fdYv{>)AU-J~NHMGEJ6Is2k7EYcS9(<4T(4 z9Kp7KQ&jG9K0SC2{c_?>&SbbiLUqs`9{0P&t9-P)wGH5=RWNn|@h2W%Y53aZPKFUR ze?EmzX}TO3pUAqb!N_<(jTRYbHX`YcuQX8@qsvU>7?_F*ye@JK^`--((28NOHCdcq zF9T2l@#Y=C$*u*pDK+B8nMwgQF>&46C^!U#KpEeK8b_#Cxd_vB;pRt!V@-SxUr%Vh z5x5=Igj2>)9IC?48BQnK6exlWBtvJwXKsuKh%RG8&@+wQ6E-9`W&z~O9q3_&v(p0s zlZ}d0>`Rk@2QyR)Ms9_a^gROrF)L=Ug&(W|e}EJ`3cs3CoH1CtC>1tmKoeC3)hGhu zQeXggQ`KP0_(&JjlIOGL-B2@T9V6$$JL8)C{kXg)jp`E^3**{^4Y`)XUP&yFyuXmOvpB2z%|+3DcQ`ujApeq0hk!^=-csfDa_^2+ zF9*vj<1i6v>y+uED}9Aoea|akO0M@yO|4)(;kUex zq@szMx_`rhMyjiE8xHt#t0VHJsPfsS+eu#y@OoN%@ji5c+>%xhucH>a(-0 z`GHkx30s4T0EkAyBJRWcJf(9uxK7D|x-@DhheLD8iNNJ42PrsiV8j%#4w*7ZG7B=X zgzUdsbvO`~_7v|4d*X)lzsjJbY+YvLsL& zz{C~!L*;v&{cM1LU|qw;WXBvW3WAFJ$DsE|(nk-|odCjn>g#$hNo3p#i7bvR`}JR+ zco2#w-`ptvC%+2q6*{L@dV{mj4N=^-7l9%{XO488V{Gbhd<0|R8WC8 z+)^`gf)_$_v6+uxTzSOB3nIZSY@tv$UZ`hJq{0D6tirdZv@Cfok%23Q;;-sc7!NaN zx~wij8%0bTWJ|rQ0CA)cKn$jkIM9>mb?~ET9|?)7pA`r+4QXXX-;r+NspTet)Mu!3 zngj23D_zkY`XB?`+PpB0QbXbN!7nSE%;=ZQ-a#9YnR8Cv4H0qbJLlY#M^QVqQMXIc zF9G7TeL6vS%V5D`S9dF>GP+LpFMw~FOZ62 zUdCj!-PjV%Qo(6#1P%sFI9}e|L)wUa>)V!BS+ylGobdc03mnzBt@ODrN8!4JtBo-4 zCd{=+8DdtySIl_NG1{s{$Qpv1bin3Dpd!186?d)fO2l69Et(Uzo6%&tV2QafQtXi= z$eUA&-JK!D?jA3kLz)_I=Nl&{IKX5mfLMzY;CkNa21a;w1{1;c6(la+Q5Z;|)@MV> zWSCvkRE&fieXk$KSN2#jX6_q?K_l}A_TgOAau6isMh#@T!i}u?vH7E>`|mQiM-9K@ zU9I^s9SmCiELSa`5)7|x9dr*byROZ0~Ro-T{4R;cQL_$l2EB@TxN@sj@c!5fQ7Y;k5M7Y#}NqsX&S5Jrf z7ER$CspHgo9NbImHss#XfN`azzAas_Kgu0n#k!MNy%C(o#5 zbjXjN;Q)p49To`EQeP0H05rRUK{`13W03o{lK=GZLZ zoXO~lIhSxTV+j}6h@BhIh1h8XLp}MS>d8Hsy^cAOk#$4;k>z#cP{MQ~Fz@OHlAIHD z;?}yyOrofzA0afK{SxhIOp#TOG;eH`HnQzgST7g>E2lw3RXj}(5jTnASEKw4!XZfp zSqlbBqdoNj)_H?=1xguu{$Z~0h0L_K?a(FFPco-dG;@&nn&o!zv9Z`m73g_I7d)xM zGjM69bAudthidG|;9{`bA)E9`OLu1EjouM2N^!e*1xMK;(*lQNpg_w5acFf%`SSMC6{Cb^;dVS@C*Zl1H;cXa_GRWAV-tFpvukX zc23p{J6Ue86)W1q$z9X;P03}}jXRVZKm#?p z)Rh>wX`rz^!qk?M1`2eTEt;jX)1Af2Y@AwY_=j^$_}kh%#V;@oZ=pPX%PhfvlZEZ= zjJ&t#7YC_;gtWlTog<-AxzZI1EBpjymSva41iY$s&r^DtGdJng&NMK=SEgj9ozbhBmHu?! z+6*B8_ig+Liaom%2{n^2Cmd*>NT_MRLa@G*9o-242shRZ%-Q|AOhM)A+4zshbN-H^ z&+O<1*V*>$(b|E&7!`f3yCZ*=?6O$^1Q(zqFYD0hE0( z8}(B-+njx)gK50c!tjUPmg}VfF7`6VowIYaTw&I>*NdxcWA?zYBHf-KynoJKvA;Dh zuA*$q(?=F|VmF>S`?x`^@Qd@) z#t@tQ;ngARfTgVZ%rOi2J*J9-Z-tx?an6(UA1wum3g>Al{Wpfw^%cN2 zCfEy~GH09J0^%BWG+)kb0@E|AvK1WEz2vUSOi6P`9iE!S503TTF0a4dS$@45N*XIW z*$>FOv>3il%vmGx2ejjBbyuM5i`3YhlLqNS@5BmyEOw0hg^I=^bXkEIjli*C^$TA10QnQ$vQ;PXxf&A87Gs&ww{YeiF5+kcIX@-VUIb-UXuyQtJ)(hk8sElUZZPG-LV2u!Da`4KtSw9#@fbVL16!Evh-P1ZmnEC~t5Z#kdEfK9$t4 zMMQ=o*okoT{RKlWB#4vi$ewWm=wT;If4}ICu4TJM+@tZSF!aDv*km^Gds+paJ?VY? zYNXd=Ip=Wnm`x$lpy4ezejym2_s9nM3a54e0#-9VOZ zb4S9Bok>lYh02@a>XISgR1XH4eSaAbP4oLgYb1_0mW9J>1qrw0p!^N+oXZRsh@S;7 z42}2&97u!Nh0nyD(K{_dqy+Bbk_ zkMy6*NRJln9)P31bA-#Eg9#o9@ht6O_2QlUXzkNg=8iS&*^umZ=-UJ0dJ?q>GPX*y zTyV$^q+5!)VsXY6K_;<)m}Dj3n{)E5ZhCHvbZzVka`nOJaQL~~R_I~Vz(;M-@Ls?? zgmC8pUSB|$+YYup`Um}nooO@A$GqIfGVumkpQ0!R+^iw&Y7h?Y208s70hX)ye><>7 zj(tx#c2tpL>&5ob3;}E;GL`H*8J_LgN#rmVP&(@$ejetyjpP^^#D)tiYs;_KH@3Fd zUgFY%-PO&t?T;*W&w(EE1eadGx}SE(YUWSh?&zH)uM3r&!tZW`fZK`uNz$JVM?=Q_ zC*}dpmP72x$W}|QRouGfekAD+a64!x{1>;9Oabv`FX(JRI@xbOOQTZL)qeYVTpo0` z-~PAw9edqx|GVCX(m@6uP!RW@snVWb)MMljKyBGo^a2z02Zj8U{wQUbv> zkjPPCeMy(PkFsC?1rBxnwtI3O0Gh?2*?B~L`^hytQ~+hG*=xan3N}-CO2Ow9xdNz$ zWfe?N#eKdb9u=MNWP_HBNF?~P_Lkpvczp&uUSLtT5&C|g^)4?qf+L49$NPO2-tQC6 zg)|Z4Dsh~jFV2STrxR#-4ZqsEDRA>NE@r!K*H5udYHCbPxRk{_rA2-*!X@ceG;cSy zuHjGcB}tXj^(OlhWuYB=JX_nrkq69>Hd}O7S_GIkKZ&Rs&Y>W!9H-FFmVu(D>FdHR zu#(zU6!y{|(n);3iA^t^IY?aQCstmp1xzID+u8vp$gW^*aStWyIdrL#th(Fr2H}0? zi=Ek%Sq*7oKiAIei9~M3!7p3*TjwC`DL@CCWY(ZGnmbLrbn4ul$;N<6*L~04JVQ>X}HoCkRxnUf|3U`VtxK9&i zdgi)Cg>?hh+!5FY^AJjsMJ|&^FtEbo;PJp5x)zQ31}W2p@P9RnwhcLKg!FKBg#goP zmPHaGv$B9>+5LGw1+~h)&@?}+N)z!WT%~ZUV3tn;0LO`RY9(<-gUFi>{e*&J2uW~+ z629|xr;==iLXJ4bz*|O=tuOaAwE()O7Fxc-wrO_RBak0Fh9L^#X?XkZ|Kw=M>TY9)zm<=rU5RS+fr~?cE zYUjv;NC8|M*zE81_K~&)scSTC%gE$x$-zoUchSZ5Ee-;qRZakUFBcm&5K@4)c(^~p z(f$%wd(h$*i+2=m&gV3xpU*I*pI;L@8y92FU8uP^Ho<1ERD+Y= zl!MQ4l%HhBYIgR#9y&og(6MZuV{V?PX6%~^!8T%pUO5 zt(Z_L_%y2jp>M^CEDw4B7l2GD*43WIRNF#=|hglfdS zp@8B7g4Lz?@gNx-IU=(xjoig{1o0IXY00xsbv>AI>jDKnWckFMpU_Jx9RiwLW4i)-)x(4q=ZD9*4LJe8GJ<0`w-t|NA9E*814O!F zEadDs@-fDpEkU9>yv;$N0p<%h4#2;ZGec#-xVyxQ;Db+a=fyfthtjZ2iwjZw>hUI4 zXJAHl@8Pb|9ry(3p|8T%g8_M2oB3KeY$(;&gTPp;Khygz7s`FRck6@1)M7$HQnI3HvXu+4@>2VpY+6E7>44L55}1?X1NrM<2_!-IDOs^=2(fEOv8y}$Jnk(H znJ|z198zGD7h*%6TC7|GhFA>7tx7g)Y$Dc)$?U~Wz<5Ccqc^93(VHP)^hCh;A&2xF z=m_e$Z(S4K7pL#J>9KAb?UR4EOY;bJ1h5aQ|)^LnpWt-No_p;@Y#OzhXkbb1uN9?`Q1WIi9iwp{%<8U++xq zK5F1D5Udk%h$M(FGy8^H@YK%Dw|8~xe6Z1PPl9)ax8TehM6B^l8@!y33|Jng0>sTq z+P-r(C^CpyRbb+#PzMgnr$h4kSOEbQNX05~XmOP=>{^*jS-M!3URnkf3Ui90Qy)Iu zA#*DQnR}K7I-UNJi9GkUN#LkX-Nug9a-<*3Q;G}ji3eZZ)e%j|*slQ{*P=?izFf@& zklRdz#B(`>9vlGoO(0QvMlU{9Nh{USVY4!iP=Psijpbl~B_D!6agZj(upt9N@?XiL z_`QN6t%psL%6*&hCrhrswjUDkZ=py5f>{Zr@oQ<&Wzxj%YdR0{EAqfLk!%LuLNWk1 zUN;eN{7}5`jF39ag#+R0@B;y4eo2&ob1xJ=*IINJnwtg-wTH@m0H_{t%NT}A+TVAq zlGa3{FZr1s;s6&8_5qVDO!-=}2{jcAW@+%fmKu>v4T@SBP^h^Bvkq`#lLT8b1=^w1 z=Ap#L%X$TORIbT@;Gd%qQH|~9vz4AW+HVvcT_>uC*5!I3vFQg7kB}dTsANApeq)z-VZ~%iP1oLe6 zV=Z2?RH_)JZ<4m5c z@WDa1c$aq&353K5S5UoE4aLiXptHq=Qx_xt=GBkLFpM}%#8*g3`@z!`&9ohWP8%}b z8`1i0juRS=;N9rE5-2nA-wEl|4lJbzm`QW3^zz!Hto!90_e4@5c6;mkM?0Ee3>wz(odvU^e%65@aRnL^mi?Pr2rnUDcuzlwINb&6jIw92d*E`^ zUf#)`9{%o5puuo{&>+5f?l(}86FFMjC?&i)gR zcI{`+VDn>WA3A2wBDrPH*z+ouarTVe{-`>r>>2yq8up=`>HjiKXC>bdNeS+L;(;0rkET5O@- z^yPesk&{F+Jm7p=A9`8!>ScASDCKkHX3m1Lrj=z_w|2(EEK&MKOdlqcNLQ;>9M%?E z?_1NZJ=NEQU1;-l70kEB8PT6rSzfnzIP+)cSP$59-9kg%{Cvz$CA{J9GchkOVC z&knKtQCQCAi=sN;2Yzn-An+W_ksqvpi8rKTp1RpQe=?naj5d@ya>BFQ52SvXm6~S! z)cE`n+JSHi95PMC(33+e;9YoMn62kZ1w+msR~b+F%eam^-rdz!l+5mq${tK{jZz4v z-B2Dlpu8SsKThAExU7NWDecU;Pra5)^`^AJopL%$LEnC0F&2F}2YfG3{HL>;{A$Q7 zv8kK&UjkX&dve)qFp@Pb-AX-;4cXcDpq)&-`7~d_23ilF&7O zPo)oM_fnDf=I^KS>Fk~&QFH!YqR-gFB~JF;T)byzNED%TL zW_H^pDSrMAN*~Vd#T^{xZ{K|~yJdSknZIHC#q4(78EF27-6ykKKA*qE^Vu!&&^CW# ztUbHEdo*@OOE_B24;U&FF0Qpd;2Adi=9I;G%&l@`y78TBzyKT zd&@^!F3u|MN8ENkL#KUq{qW)0_1~9j=xl~VlfZDD0gUEPh}>!|{s!}tY=}SYWFL<4 z{P~(21@kE(+UPTO^6uz|?f|OhX3~SxB%D$|YwGa!0Um< z%;5;u4~O*v)<`CC4ArB!9S8v~n)Dq;JIxmVB)R=`^<)9Auw#S)z+oO1Qic^FuRENg zaFHx?)#LJ5@zeil$LZRULxE0g$Wez#3V1`|)pQjgF9Q)scImhVz_fgsrXwK_%FE=>4I$Z9hILm+hhmVjKv-#^|pr2 z)pYZv#bje!U1$P73Akfo?z)TcDhaP@(1?J=mT|8Ib7oc;Fr!OR9g71mnL0CdD2u?| z%Kh)*&f9A^FkAUqxkkQsc>R^ zUG=?sw}sD0#K?AYImuZaxE4Bgj?|A>gl6-mJF%U6UcV#a1#9kemz#H3Fwx!kj;eDa;H{qM=cd=`_fz|HM-XfMD zlL5iNmKDMy?dcm#WB|Tk(zF&iF=IG(Nw>Bqb;4ULZGB;vm}v90XQ=})!NGU# zg^g_(=pC1?d~e|Hx-{6vm2lb^X4tffN(u;472}S3M75BL8HI1Fc&e%i!53->M?xPR z5pxrnKV+)+txh2**Q=qbk#~8`qPzhhMw>SPy%5f&Q!vR6NmTm8JyM<<9a*8daiqb1 zj6M^pn^ej7EhNzZ?A{cx!5rzU$ga5*s*t;qtQR`dddS%k?xIouS*4GFQRv1S0CG76 z5Rjp{TeA*|693LF>tR{rbZeJ_%u6Ctcva2Sn~7F5tc+{(+MpA6ZY`90#3Cz|>?!Ka zZJYtn*>x-zTvteH-451qa&1d5C?@1J+=NG#(FEJP*{CvXr`{u97O;5BbG?BuUK}rI z=6X2K9m*KN?S)u)6B^JGY)q(bFOY21e#b+pX_V02zsd4fr3Q(Rnnsmf_vK{6WITpU zkpjWUeE^m%mp^CgNK33~b15Jc_Jg3P*`m*_-Rc`$cdF&A2vXbjbPPz`X0AmN{Njez9yenR2^B79-s8ngl7Exvl@ zim0)?M?==kCY9QlC!@SbPl)Yy*KJ)Y+I@qa-xal%D3PI#-=4v#WymF<(61-(^%@}D z=#mN`Zbw8%?inkHs}SU+;;a4NIy=q@p#ie0~>-QFtk=v4D21GD9Fa|AJwmL0>x+16LEdD!io zxL!PD0LDZ1l92g?DF$&|C)F7kqqL1ooN%7RlkFj1Q)tgOP8zi|&O|BTNI`HAIAnt0 zAiLB*bEzNI>Qdff`5Zx)a`ZRqQjYG>rMw;@XSh{Vz8=~ggMXn((tA>yqC`nj+^uPO zAdzcw$>0_Y#sLK1uE8hTDy#LQ9+10(sn9CvbTAk=d)s1JQU<{ESV6SSVtg02p_ zXK-PLJd>QUK0`wjgfOJX$muZRZJ_xDm@8EVw&fn{m^V;miN83e#@FBtlLjbiM*WKn zmPaPd?}yN3n`rn5zOiz7DDo$zA-KaippBYi@<~rV?9kEA4eX`RDHZK*ET#;PS-f-u zZ*aJPBOhFww+TIXx^#o5AozD#8{?)jj>biYU^Z+Ok(C<<9m;Us@jstF_1hc9u4{*l zG8u_S7St37rvsnrV!c2OJvugX#cec-f%;+l-COexfgzMp;DgDv&5)6;_si=E^H4Y# zFrj#%+@WPo(vYyw&kJS}g<|^UpbwhZM1nlf1@3?`&i%-68c{{uCd8nqj||r)S^AND zyijfjErpW|nzV{!LxyLdv4l$RQni_+i$Hl~B919HhN%LhVgVPZ{m+0FLu2M3{Y{9V zkNg{*Olb^9xp2D5sEn{OoC|k%tRqETKAVcLflkvCbe55BV5!9D&@S zHst~_*S;FZIT$;5LnmG%{WM=AyAbk_^(E425%=M~*TsbdL6cx)w$#~jEa@$1oSNl` zNvD5_-fq^_}}ymKABMEpO2MNdJCZ zNE!TsU6t%wmjEJ+)BnIwq4@}^%>E#fPln8}Ivo$e>l!r7!R3xbK;TL|d<|)FyH;B4 zzRtEGEN=ge!s7NF!s7U~<|2Is!L|F^7~tONj~*5H>CXr`Vv3H>{0G&XJXyALE32Aj z=LY|Lz}R>_Ga^lg5kib;;Diz|ag+9ns$kgB&%wK~AOVx@8A^J4;%3a&FSzX;@^jEoT1>iw z0x}@PDE92moCZ3i+sLDX<-NKd;#Rd%&*32zd_3;m9{WPnfS2P;e6MbIYesCEDfj5k zbLbLz|EwN0`hgjBX8wD@u~P$w>!LDvcK{VocqAkg{QK1a{CKSR$BeU`fB^Jo0a+k8 zAdphb`D*mqJf(f}1Z%H+G_icJ;p&LMF@)y_FPZSk9=s0Q$F^I`h$<6t0zl>)czx7l zxB%<|3;Ok1m{z*nM{%;i3>WfHs1d#j2n(NLQwc$TfpNJ|hAKXxztDh}`0G%7YSAB-{|J#ZpQQ2X&NE!_9+{sdNyA z;O7Hhp_e=xb{zP=I)df04o?OU(uh;7*r|$gayVjw)lz3t(l5BV4s&vF^@PZ9^yQb( zoP%@CM@c%ge^8PmBsTo`lI}vt-RB8u)pCVt)8^V|8i(*WJ$`L%CoY|buj?{#C?M5z z9{y{wUo^EI(|Js7MACUkJ+gDsZ4Ira2^Vs8a<@?$4iTDKj&L@x?FDR6b~fdW z{cQHG1Sdg%hTv}eIA{kq#6yA_Li4cVc`n?-RHnw!9_*#^9tQ$=jD=^95(Es=r>KUC z$Y&na#6k15qchLie3|k#87+*BdQFR_9Ql)DcCG#WV-~)E4BsZ1Wch4|gp@-Z?%=sq znHUG;V{v|i79zr4sYQq9QhF6Q1!4vZBrbW;MT$6NKt{nye^lTqX&e=6=ETp05HnPM zdJiwe6xw){4bu@ILoRd(V?og{yFny4Hk4B_^x?ow@yUIGBPUh`bRSBsyj~vO{34x0inTg?Bc}!>mm&!rw zCU5q66vxqEdQUnpOw{b=WyJP_Lv{&BHv!n|N`zjRylOG|&-mWzkqe#-4r)&ZA0UAr z;An90Hy#ZR?l>9@4>N#a9A1ZqU`p!W8tajNyEsF@%uGFU@NJzQnJt8x+Qp#$yn1A_ zKU>9S)a1qZUM=#x*9YbM0TT#2ooRxknb4geS#GH_U7L6a=@QD)(w+7>%3W)~C7TYafHa<-&; zglAw_5eU%`Bg!o={tK`>XkbI)j;fd~35-Cp)ihPhq$~qY*%R!kA>=$HQQ;g+7o@gv ze<;q&iv|5Pf_H{p*qxP!P&C;On&d5s(I-K3zzZ)Y=ycCSyR2DcfNW&!3dd7gtTiJJ zYeWMcmc~1oaDabcJELTbMLImZ?0-HS=P)oPFawEAlG#sPdGN>$dAB<%VDy5N)9HTM zIB6#D4v!P2YlQo(#bbk{>#e%Hlnj(Fc;lPU zkdk0pGE$JuVfMg3B69&|B$|WJ41u~3!R-uJ%n|IYWRA$8tON^*jS##LWOPco1eOvQ zcHyTekpc)~pt=>o9us8DFTcPE0L4!1A#R+lfjvJSGx<&e-9-ey;w2lzizc9~j0z9W zzJybVfM3F*HdNa<+0*p)?ZwDsYrJlbDMGE*ico{s*(xNc)xS}KTD?Pp`UtWg zSf%P4{h>N7Jj5k!O;+Ari(C@Ec1$-8YK*6fHl|_O1 zr&X&ae&%WVO|2Fw7y6d2oI1y-E33NFQd{nW;FKM-XO%0aIZ+H7El#N+TeH3$r>_u2 zqSuy`8gbR?TdAreje{B#Y>Jwaz5p!Vg*cp$;?L#`aX6bN#NlVVjgwQ$X%M_?fY6Wu zHkXX)FYSdg;HyvJrASsh9KU6ab{|)5*l>pZ$I$XYTEp$73te7_FzO$RPo`H_`Xi>* zp1=Vc%#bR?rDtu}Sq&H(x@H9`rARtMMx_*bpM#q_wOIEh7 zvEa$%-^&#_t>z6o7yPOD+A_gXtTpQ&!2?Jv?imrqp zu~@p%fTV7xk6j#FD^i}eZ;%6Z3pahhzs)?6Lu-#WI(N8JQFf&*%E8dG`X4apW6wd6 z{7sd-+Q5M2M`=V&?I-{JsrYtp()zT&|0F$uB;8JqMso89F#(GHYUH4S+ZqY6;Dmp!l{H$3t|UWAy(egEOZFs{{pBXO;UjzBz+ zY%IYIpdV@v!w^rsrwTXewEIDbr!SSyDZy-eo&l)6gh`0yL`pE7yYvxnjJ8rJ&ml_j zxPl-IN;Nb@$#F`Q9@6W6>7VfqKbRYvzzeKO5bO{hhqVvc^%{|>;@^S}@!zPX&qj_g z5!1?d8NFd@;gZ%$&_P&*#EAUBK>#675tbDLwE!XdNO<*Q944l`y1fm+d0cqV_(H$o z0PWUc+X>1X`)KH;($&#m#L^PBM*FfM6XNs+bUQ{Ob!2k3ya?P+cPrh>+9UrdupS&C zz>D7ISKZM|+|bZ$K{JlaKaRW2C!cM5Y z%NNCk9S-Xm{x5Ha*)v=vk`;1^NFS?-xub{Xqi67bHy`opk*Kb0KZ6Y3?+6tIl;b^I zb+->t5zvUn*^GM9^oO|kjg?UJ=vk^S@l&6roWH0u{vIOUkpD!jKHt}Z=e`@DudWkz z!44ij#}ocRqqu)jZUAZY_wxO{V&9$_uF2n4YI*s=Rki|NzVbKn@|8Py`TBKsaAo{3 z5D+dG#p3cW7D_;6`ol4w&xF0N&zp4swl}@05!w7KDFtK%>cOe>rA;(YKG9Oq4|@gp z&JY~Qa9M=vMG7{^fnd9cgVzT`juHnClLX`7185m0tfhKrHP4KLr^i^es*Qu^TZw}Y z8k-RZ->0Q5MS!s9B2ht7F~q ztld55?gf0n%fncLctF7Kr(UxE;n;1o(*K?&KS*wp$-X+E;T~Z`cIiBA=R5=Grs(_* zVH%;A2}LK|Z&U3Pk~(47wYPFw7-YeA>@7CXz!mUiwA1($6cs~;D`LZ7au;}}0RJQT z2c>adae9>g1GmHd1KSi}Z5Mk-Tw^UNyA>H4Vx{3<2DUKj%7XXsp}U4&Aniqvx_48c zYS;?we#WTi*%yS!&lr`s|3^bR5@{q#N^u07Io}mKY(YQLEkm^%je7m!?5I16ieBV7 zR2jplY#p*rR6s+Q7AUTsO~vB#`ni9uXNAjbAR}N<2G$SOx;ulma7!wu&xT`=s-pNh z)HhLzrTDseNqc&OJSUUP70ByM0`_FQ2-urWpV#-ENlT)acTAym*t*0r^5ZsBb@zCY zu^s*mvKT5~M?EL&`M7a%2=}ms1nM}7J?%t(&;L0)!`Da}5a`{=A-r^u-3TnAIulo( zO6WUw7Qgo6(05FmyXDZc6y!Hxo7ntK0OX>@nXl}rRwtH@eEcY&J`j2sc*?hq08J15 z(6r;x$;RQf5CoihM>og9L&l>pF#fj$16-|L%xMV#MOK#AgHT!rOR}IuJ7(idr-Gz9 zGzE#V;6nhxcvJ1rMtv6+xi;XM;AKU;-xe|+a2`m9;CoaFY*Dg#QMvnpuPz}%ynr#` zMZxP!5LksI@xfIf3Q?eBkWe5aKXolXhRZIJ|BrKmvw>U8ZVnD`<{0M(2W{Lm8d&1w z2D*n2oumON75+Qu*;LQ^lb~~XODU6p66cM6OJ|Vh2JLR4?%t6;j31B(hmh|w3VG0B zQ26ErBnET`femdU=)7D9)(86zTQ#GdxJp`j;W_X5-9|;Z&b^tuq?16yAdRVc@boY5Es#s1=X|h1nzitxVVJY z%(g*5W*bn(blnr^;?35^x~994aa)%Si>AhB z@)n#5an?w`T>AsZaF~67b7Bt`ne-4tOW$4t1kU9+JA#;M=i=Q(Gg;ku1t*X31l?IB z3!0V6qa3ZK!(sXXLS`>r8>gFnk1{qS!a+Afl`-$c1A}6dH)!y|%j;$`f#>2)CvO0a zyzTG|;6kl{n^K|a;`RdRxayCOd(BO(?_(U5lRX5r>#0kCT$I8aS19x# zW&a<0@7mTzlB|nLh^brqMVm--FJKK609PWBCG9&x zRxPAxNzQUNIt&HyW@fkr?GU*jF_}<}G|wPdEb{xvZ6v|6LV_@31H91*2p{w&$i|~k zxOO1>n?n+#Qi4$UFfBLGPYIF+9*Fi{*=xy-?o=1++$u`^R-P>MIf-{tQgGW(qt8{? zJOuR9e@#!;cMqPzwI?l9c-!@}y;{H5=yvxYi+(HLsSx|)5bSn!1~+`WRVq7^9TC2z zgL4=kJcEb(x!n7qM*hld7T=|g)HrXb4)tibmnCE?!n#TZ$$d_}0}5VxNM4*F#Din` z3>UcI!Yoa%uHnxB{F!iyTcmSCe8*C9c^Jrot=>>? zLH2EQXHhjx|8aXOe`lV#hZpwn;`wZq-I7$K$g}DVNJd1W!RyYrNhB(|Ql2Wkc3{fGYj`!oAHV}GC9-xv1xrTw+~fB(UL{}^{@%$eX$ zcGuy|v*(i8C1ROwck=IYi=vvbRm}ndnBs0G(Fz>9V{MzSj(%q5*_g&&N@J=(Lt8IG zTOt?=4gGL$Lt>gogNhm|4C)R8Rc?~L0=fm@f^R|NGLN^uc=`D8^6>SGnc1pC>pz}X z4UNFE%sfV<;_F9+^FIt9|1i7}tWtm=u?IuZ%*+op=~iK3AAgj0$uebO{vXR>V@ej< ztlzsVQ6#)+wn{#WS_w#2Ec4pR+3IbZ(i~px38M5_F;C~?37yB=WNJ1dPycUeIp}(i9Xl}ML>!X)cK>f zh*MAY<_E|KDZqEtMCbcMVE7r@q7LW!^`&F}mw(5{P&o{MZRxCEz5Gv^?B9QkK<=ke zoWd*&9kyroO&)06E*4wkk_&=tBq<5akbNu&vL?KBO_=3sUA}=w3po9s8x^xwi3db^ zRb=i)#l;wASPbbEatj(4`ykk=H{(rmsAFT%k<`3upbVki!Y-~X?fr@!ONMH)6^|)9 z9e2&65Ez!3Z7%)n=1RvlYI_fH2ORYhHryz2t8Oti{!&PrieH6{U7PV9NW?Fz?SN;K z)Fr@BtO+avk}vVtaY=+_OH+9>_{Wk#UJJU>vqN zv2&=K6JOq?pux(PE-->W33JWoLB{4hLWJGc^L;xKAQj5P33q=xmNx9WEBKO}sbAi? zwIlM$I3!^26}55>84_nnVJi)tXX2{r(Ieof zIIFK>&V5i5PRPLb5$!MVLvDWoGcY{%(T^-Cr@>&0P0)@<9oA2rW{+HG&jV(y%OqeH z1WLZd=BX!D7xvOqV#JyIA@;atJM}&&5}PO@KB}V~wX~z-6wFs?CC_nBYeO8)lAz)~td^4kFe_{>YKUfY}@I81>V!JE_UUYE>; zT!Ni}t>nKU1el(yZcv06wy?b59?@%Vk6o9xxl}4Uht4Ct+UwE`bli^UV%x(JJqmYA&jDCmp+_>ws>tY#67I4Fer01a^nkQD|F!~O2p1R zgQUk&fzAj3bzJ6~(j~W+;W1Ca9o%z)a@O7<1k@9Y-G?oF)$Eo`8xUT?ss3JNb6F9{Oz(mz3?2RFrb4<$=9aY5 z8Fg_oTHF&qWWUL2NBkWH6}FvQdkABe{*QGt)A?iZg}|OT_EQ>=rN+~RC*I@c1*igx zcO*0e@%UwO3)CZ|AzguUko%D8$qp%bMnA4x;5?D?px=~oppp$Z*>QD)9K)x;F^8Rj zsg*FW;m(a4R|W5-=h;r|q#j`n>>DZb5|fH5dL=mKF-&oq4F<3POMR>dGTbjZ3IOsr z0U+$#b5y4pvw$AI!edSjG9ziqEwC8sOouni*(x?JX0PH>%L{PMhK6h<8owG-Nph8p ztCwpTx(GUXq-|Jn#(#()#Nh2mRb`1c#|5+Z08&Lqlj8N3~z52sF>8*^+^)k(E%wdHth_G=v_*LX-~xB;Fh&R; z(JrQlMc@Y4xjDgj+@Nz^fpw^XT0GWn3#kPzq~^xPj9kGgnuGsn?!Pc-WbP|LBl8#o z#$lG(T3_#^z*}c2@ozEsZ@dMj!bXBi*O2w}&jgolAq@^(MNvTMa=#r1lFs4he|7li z3j2tIkX_j5Xw>NVDAAD^QF(#Q*2vaFCrVe;VgEOUPIEp$T6(k2q-^JM7Ks3C-0t1( z-rVlq-PUfCr-=$6e3+_N>a}OL_@^;5^^d*AGyL%r7%J0SW&MZ$o+R z9l_<}>thRPFL8Bhjn#J*2sLXVE{9E@#P%mx9y^E8V&3nbXzY>gpqNlM4{TX~O4YLN zrkEmd1@vcJAi`O>X1++d-TNHAae5BJE=@V?)obH^tHvxrZP)2}f>p~I)bD9uyshHF zw5SF*SW{2&XxXOQAHr;11WerJ-JMaI)N^7adx$xzru5t#0#Mj0YWtD1yO^MH7mB59EP(<1P7U^FkPHps{<32g=pBn7Q@?6; zMP}e#a(;%}S|a8Udt#{OBBSB}EZd%&Nv39?mz`!_p=PdJy-VibRdJ{ztf(;_S{pES zuinAn?8zMvGz<0ReDtzznzLr#R9T{un;)v_yXod>tFDigMtOSrDgNtZ2T#M9$}+5n zY7INi{#+eaXSq?8k^fZO=Z8b=_T@Bl$a)ZkX$mMPkhwI3NsXXqo^e4CBJ*PbYCP^h z!>Nli7fY#<6Px=U_0h|Mfe&I2Qt;3!~)#LapQ`vLA8pM_`MLa2(sTZ5rGwfsi z`LwZn`Dpj5IWx6;euV$wxWz^4V8XpGhyIhwx<6o|F-Pk#{)7y8US2puPl7I`Cl&Xq z#Dot!@rwhz$lCE6ob^n0a&N$6$;FUmFctCn;l(~Yn4CZ9pnOmg5=Q zl57=!(5z;utz~eX^s*NJiaUu9t@gqB=g-Ldio))hGik~j{J{?i2VnvI*=Y~M4+m?$ zanGzm7bM@w175(hBt?2`P=!B#>yuQ#RHZ!h07ooI9r(r`@iObyE`}1v);r=;i0qN~ zP_wmt1dB0#jSrOI{OgbN^2cg(m4B9TJP5>k&1dcmvm^fHNElWlL*WBn49Jec}+s)6G}z^RxgY@aY{#hX=QSUZu-HMF4?cnC3^XBLFEvf02pPR6o`?oX`ZsGF3MJzCQ zqkT(8yt+MrHbn;P!{))Q9I2_6p9Z10P&o;gTrBa(`3|XjVrI4is&~F+b-B;#a(_ww z>_GH9h0K}AoELPKuNvh#t7Eqm?p?mv;}TX{tlpvhC4IZQi%iv&7yHSVFqrMiNwSpe zcp1E(o+Mw=on$F2lD1ex?f)=7I#19SqJD30+2`M!Z>Y4S=e2O^D?P33RFm*q+OdjA zDE9dAiH}~`Z8dgV`+HBkF}O=>kgsSB`po*<;3(DTLA8%-5F!|snW+_28X#7?*@Bn( zlqbK%V+SGD*u{CT-O6q?ncam!x@Q;U?L;+qq%0?x%6M@`u2O!TYdd|7c7x1u!+DmQ zALez1>A*yVp^8b}_F%OB$cKZ*vl-5^`wi24y4xBVV}PNDV3!6r3~YgDH5k}2ObONG zA#gtR2tDD+z)JZ^8BGObrkBa3AhcSu0;o~1oJv3 zDP%W;3gm_)Ok($-QfYk7POs15;HuOo-1C#&=hf;YBV0IY>>+^V(WY8$Q_q2s8v2%j zreJ!M@hFL~gN|@sANj1fd*f02o1bbly{qIZN3Z`O_&jU3zf|CQEF*cCk=MwKg~no1 zBl&1`f5h@QqOq_1B23y zc$espFL3rBv%YWG4m}Z~NXxjWga>gwQ&e^kBl#LRy(gA%mg6deTk7`KKZ@xf1?Z&; z2&q$80BAaPV2I4`uvL57c=h@TWby6edSF6dA2NiMU(1A92V>D!b^nU_3F|;Q{?xt& z_ng_WpV^I!1?OWC5_qgz&I*SBh%L97wV0d8P0J0ZB zb`-TRQ7#%;+wb&jS9bL70T?ep2#gU(e(}nqzqH)MZGwjpUZ4J}vOB_Qwqsqa3)-zSt|mEB9|t%(_rSlB7gpWJxbU9Aap)c?AXvj~qx4`lnP< zR>Rp96;TwNmnav^fpF5OT zUJY{J6>rlMRep%7fx;7YN3cP&IS+f*hNm{}O+v#jtc#%bQ$TFdfRmjM>B0GvjKKgsWZF} zhdMa#M}hni?Fy0`JFW>-l;Si10uB6r-W+7H1kK4tF%(wPa;0&DqXgw(FRY1BL{CS} zA>5_C%Q@Vs1KtQfHB>-0LTE0S91^>Td0MD0oiHN#0I{!-u$kOsdyp9H(;AL)Q;A(p z;@?+|f4$y&^7@tvyIO~%sqwG7y(hak={m3C$mG8 z*jl%ka!}MWt{H%FEEIN-Ic6V0MbBoZruJ=TZoMC7!00H1`{7fvm8C2GL?)IvoW~X~ zZG8NAD|_`qZMGe(G$$wbhejYMGBrgSMtmQd1!#f23VTO(16e}c`Qrg>>xH!SLv?Zz zY~~JAn8-qxRjKJeJZ+T!w)^xqCp}p}c**91&M`xO>`ajJ3kl7D=I4erG$(^^={hny zjVbUPR7sAj-s~eNqB!ykP{TxF=6Ck8NGE`#8l;=)4NdzRvOB4D$0sM4_^hMklPZ2b z$*KW=&Em&XQL3O+5~4UwGU%hzVNtT zimLL1X*5$Vfh;rzbCdTtA^5oqQj22AepikGR43eyG)#R@gFr$D3x&=nL>tfUz@Xm| zvBS7QJju4$lId*hWV&i1C2W-f0;jkFeRGIDNJl6hQ2ctUK`8wZ14&gF*VNO8htl&K z&AI6rn|f2JGv~CM4hCm!3BD$d?+xxOmE0AS)mW>Oek9f(jxK^lpAQe^ zZ$ywA^puz+I!TdsMlOdMV32YEd}j89vgic2z!IdoTkA_TPO#PL^m1t(P1#&FY`01V zdLNkh@rPL^cvcmx}rRM-CAVKvM?n~TF z8EYJ*6f&`Aeg6Lsl1 zPcA-R(zg9eM<58en*QAB9VnARz*$@29gW?ks7%~kR4TSRbRr52GW*ilc?w56I^C&* zE@5kd%j-)u2EMPrLx}}8xtzC=D2a)(FmkYwvOqP|(Kh5{kj+^N(1=uxVzmj@fbX}0 zZ~Jrt4mmqNz{v<$Bl4r4T|hSYU%jCmF|gmw1IP>b5A7#cP#qe8qFkYvmwH!c0sSbz6 ziO>m@fg3A4W6qIW+A)YH5qTn4lg|CbO?@`#I*tR9BfPMQbI5q>#zqstG^l$;mx;ZL zzRJArNQfYS81vY7r_a$5!V;FyPGLZ#oYbK}YGmSB@F#WOo&Bxa-@S4j>Z-P0!E8+c zL=M7B!+9hcfbB9`1vOA-iXvF5CO;(@2s%Lo2R1|4p{)Sn^0(5!=qbMc(M~R5Y86Ty z6iSULg8U35F~OQU8YRmFvZTyYN2Rot^x(BG49R=pQQE%gSZ`eKcNpN@F!=)q4%@iQ z(1A``=cKTeP=^{6tH5Ci$b`k1mMNTpUHA3yun`_nR#pEV0*tU|iN1)@1Nzg!7l4#} zgkML%=`hTZp5Ra@M}xv{;8qV~-y9OYYjD0Bh{fv;Y`36!IR$WK|A@)6I1{t)9Jb2w zFcS8mwd*G}Ao=i^jcVV(y*e7|)-KK~Ad2bURxeo*MJpV`X|HwOp+e!0HdY4qNG72J ziQp;XdG}IWA!7&an*nfs9#m`mEp6fVpec0VeTLXN@{~ckCm|d3K1oR|xD&o4Ehr(# zq-~niLr5n64dBBeP)F)Aa}LTY%dyi~uLzWKWZXiyG4WvAIhas1VDJ*@IE)y65ILS1 zlW|1J5(W9NxQ_h|i=Lxj9Uf&NnYZ(A=M1;aK!);bdH0op4_5AC+#v2thp&Squ z7b6S$bf6`{?me}nsk~$@;Jrf%u`Q1JN1or?Spj& zTqvuI;K7f_iv%@uZ6}HIh#SHloHn#agpy``15g{s-O3qYeWzBY|DrB9Xx2d}%?)ET zr5<+(o`@cLIZAR{XN}q2yItfwO!l5uMM-afC8AoVc@ia76ZX&p2#(}io}}#^s1C@d z#Rhv|Vy1qIAPkPueq!;xA&YOeM@ldPUnhMS0mg*np=br4?oRGb-cC)~cEu8W046#o zI5;e}sRk$vx&JXD>ERB4^?L6XjzRo+^1AxuHFW%LMP;#MV08t?y&qVBq zh(RFklt+We8@LK#2Y_uOXFATy%U*FL?mUqL_!g?e-6An`#FzL;?5Y8fL!wMR#>D$k zNZz0gRXZ|ySO5r2hdaivwj^07H=nOCI8wO?1;Fm`u>CXbdZ+yc>kJro(!j^{?O=Hw2JY8h9ND>snqhARyxs4Qs0 zRG9FLAGn`puO7CaYX%b}u?drxb{+f*TX+ucz6>T0htZPX0`%R)tB436u`GmezUT|h zPz+)+u2a*#QD<%UnV3O{!ia>3Xg=xSr2Ev?pC_!zRE6l&j;ONs`3$zJ8px=Fh{Czz&gNQRs zANt36%pJX$kHC2l_v!GEb*N}55EkBmep36({MeHs*Imzu;KO#82MBkrmTqsc0hTVA zwQ+)oerO%%7vM-x0*)4xpkD#ok72mfo)|Bxo>1Py>;#3ls=iN~s$poPMO2m^1H_OXjR*LhklKnDz-0@kp*Iffqgl^#gFbx)J)l?%{AXl1h(S^>^f!m0>j6tW}bbyz!5 z-&an&f)%xjE9gZ>ByObck23EL<`ep^#K*?Oc zP$&qJ^$J?+*|P54dEC;gs3q%?c5wu#qS@Q+vwon$cju8z%h~)n>X;MJXS4T#T@78O zaFIez;oK6ymw#u;Jadq&8o_=BkHhW%sMePJUZB*LB#J)@f7)47tH=CTr(=}=0fD7&P zjplV1;3f4Yzu;7`mrlQck-b#<6XrEq4UP589CL#M;5(^vTOy}g7(RE;f#fjnRhgm(wwD|>Tm_!X(kg+ub zPgY05@4q4$jhK`u1IDcjkR91GK)9Wkp5HXnQ2Q-5A`CZ#VDd}U@-I1oo_6F+$i(36w{7j~hcp1~$wE-SIP@9;?Y zPXUiG7;q4f3vO2}NLqZGqq8Q0&s=Weq!>RAYzL21r#16KyW!!C6(dyhHOHBf*x5m$ z;AZ-yEC36GJ23p#AS0Onf@EmU*ksNuDmjev2_TORQk+PP&@W#DX`JT?E5?6rHT!G4 z9EY+pLRhc-6v66aUS^wkE*-#+BNW38kWiB>DvtF;w?=RVL-u{b;5I{htS>SAQ3IR7 zTN&hQaOz!flO`J7MbUHvA_>o*l1_neJKPSO*WLsZZ+F>@%V1Lu z;~tsw);rm93z>Evbzhl7J7DtOIYec?bq?mv{?-Yghk%5E#Ho7~=@6%O%g7+Z!q8ch zgQfuQTOb$pI-l31tj(}mp_X}EAea{rctc;QEVl2VG8BXchWZddA z8EY?1{s&IP6c65EJIVn#ke{0p*E4WR0bm@Kr`NF_FGF@{B(|Qj9_H*Ddf0Hzmklac z$TxE9gmMJMS7d|r4m#&d0_%$*9Sw~E3@i~)p92Aq=XI7Rq<=;)fqS$Th&l@^Z;p}& z82C3{s%Ltk9DB_#6sUn6u@+S7EO1d$x1YofS#$^EH{jVw&1E8vny?e^oH!fU9;x#T zV62u-Y@jwh1?fHFV9xtvAr@HD@9f^Iq-bNzGR9mi5V*)?rFn!~%g7H=gV1Df`UU_V zskm?q{|>5W#83p{K4l=zcl6FdN1i7 zVG2=O>v>?ZHB1?HANVhBB)J8}lv+bnLSV5nZ2LE$u$Kav9s`AsZHfcQP#40ebK0iqhjj{^rh#+>*wfAN<9 zK0Brsf~BGZ7U>qQANv{hM&Tb$nE z`NL$kws)JpuHq-y_IOj@7Pis#m{YBc8R4?LLu9h!C4fBYB~hmzDwPwqJ=IMRbuST_ zyy_hr@Gg*@m(IFpITj6N9lyh+P8z++h(!&lV|^FhR%7!%tS%pXt4=;#*cIYxiF|jA zKOcr0m%>R@-topO1;hN!HwzHc+29J0=eU$7d zh}l{bgDE};JCR=6`8Ugn4Hls|dWNDTFaV5(8ekV* zX!sZ4>H;LOBcmO%S3j&hQW3W-PH_~Cf3Z^vAHmaqHIm)wln2ghFykujqz<+}wQNua@q(0ViYD$ihDwxWZ5`ax!q`%p2_Ue9iCyKG+?6AQ?K)d0jT zK&OwqsfasoFH2^NEeT|sV1!E4`y}$=Lo$o_HJMwDNUGkgJ%55#6KY6QFso{W?<9_K z@xnUmp1CvHEqe)9__)kb)=z2rNxkL-d`*)fL82!j9q087G=wkG6%6X+@>==nlXC7W zPE7l6PoCz#&AZGJu5#%~sho78YfasUr>L2``!t`$%5F6M+uwG}yXD`0D<{Y84$iM` zgXYn>oS=dg8|NF*eO_Jr|4Q}KW;Z*+G4jd3)JmuIaDCkPJ7yY!dkS@j&M_bepU1TjLq3!o z3(N3X8bShA70=5|M|3haQQ#*eBRfH&z?1*NM1dz?Nfh`IW575pQQ)#A3dCD-QS-br zbleo*59~cf@m&4c6Vr*C6NwP6%&P%V;2gdILb6j|CJis6fKIHd>H8JGHfL`!3yVA2Ek- zatR>*iW?@9Y$NRgm`QUZZKtn|Qn-vaO2I8B$ox#HfV(`Dj`-D4SvgrHI?~s8nU?*1 zlvw}EiwGj_mB&Rnd4I{8^l(pLJiwY=*FhK8Hu{oF%_^2SwFH(Qlw6*Cl_~??2|18! zOb{?aPY6bnZ%5nsZC)=UK-_WZygO(fwb@(^mo411@5;Ynfx4j6$de{A7vReK4&vW= zUEEnkX{S1U(!)*c+$up*&MQdlT!FjU-w@_DJ!s>CJ%q~flFeKN|3T{bU#=R~TfAZ`UxhEV zIG?O2(lLD|+H*zar4*GXE6TNOyMNJMZw`+~W{~?RRda8oiT+(OZy>}~B>*BJ)J=hp z%CHXL3T$iG5PE+JUJ>|Z=@Rmd;JOb<;E%VrxBZZm!hZv@amhml8ox_ctP9-B7`hl57Lg!ur-ToqWjrtMXqIoyGm6nq~bDMC&+7AX{GuK_u*7=L9g5*(t>|QpE@`_ zP0t(K?;zbp=M@hx^Ki&)2XVRr#TITA?ubiI?qQeQGrdW?oSejKrhH)1OZ=n`-t)_7iNrvRZ;@*>}@!rhda=~0&og7Mbd#+zVjV;(rFq>4`tbM9RRA0 za$F7cK&&Uo7xx;76AHicMvHd zV;EkD)$L`?^aZ@K+2`&oU5ZdGjUio=c$Khz{p8 zc(xlNY$8y`K`ZH^t9)v*$taE)7i0&5N2_Z$Z+En!5^R zenoN}7cc&+Tx|(egj%(i96Ylv{Is?U^?`zgH(mS_L&tQN(yZaSMXPn-iZkMp?bW#pq;4PA?eri?zzOpEsMCXF z7(S8qwEPnYQ0S@L=NVkfH3OsKS-m~gueB%p4vkU@fFt$F7@JpBZY$;HMY%tWCnZJQ zhyjIsaTNZLML=LSX`Mf=l^87wJb8HeqD0E{26vbuGSfzCUtr5E%-dv}0OM*yzL-0eNIa9B0m;0>li+YCwx zH2uirASAQE>ZpsGqUDJ^3D0b*Ie>Ai#9=$_L$*XohE^bERQT|&@SwbMH+7FUxVDem zC9ZVZNYv{sE?nMYyar2)1l$w0<`^O1VDC}W4$@{;Z)TIj+RzKa>3wAQ?G6W!Szwy* zWBRC@`<*u8uSsvO7XMbQ*FywB{5I{uUu{j!;|AU#I0cs&yOEau!1cAbXzFHaDql>9 z-c^)&bdGCkFPD5ti2Bgddn7SYELe9|OYsp80i^#P7koMVPs{9Anb#nYv}0e`1zb@O zJ7k7jGa>6-X(&3O%e%i|wL~SWpjlnYP|5I)8Zi@qgs#i(j@(B6bdJ#}qNmm_yX&?v z&0><4;)aTSleVK)nQovkE#tP7%WFZjGC z6DPH0$T$d!Gi3-uBMXVMpYc$wZfbMYAntM?X`jNZc4P?E4)pM*L|iQlF4`-`))*3tN?P^OGp4{wj_r2j8FyDP3n+25 zNE(uY3?=2hiqi83O2IPnL`$rrT;N&;(f*_RKOgUM zLj8`^gl5h2vG+6;>LPbZzSlg*6XRWaOZ8`N+lw zc}dX|nF^D#Tjf7oa+ApW7AFu)x zFNHz%j*iltqR10To`9OImK%G%Qm?B8u~C18^r6j+KNo3bEkf^b)$$(qyQ;VDr%Sk^ z{7n)JZ~E!dyEoq>HbbqsIawRRNbyB5-9|ROR48jQuPPNE9Z7Lq&<%k>>*djil-;G(*;mnVJf*QAKRQhL(z%*05l-04lfQRjkNL*x`r0)xTpekD zxLQN8x3(1Gg$l#-eplpkxe6yFhuFhJv0sGwIs&g&9vxxBi&<(M+^0S zY+9SP-GN{?9CRtoBf=1y8cxBrr{4jw^J}ZCi}OV5{_^VbHX~ZQUF_!o8T-5zsEp-s zq1@d3`&==kCmK^~adUHRGgnS-OdnJ7{o>;K{@lv)r$w9~Z;mOjy|@X)%x&X)G&(3H zc$Apu)`qyXJ-3MoAfU1DhrKYjJ%>XTOS=9D1Z3KL~KL|a`SM5@V4n97~-G6T6anR$W|0$Qu|?G zU$6z%4fEtRSh&0@Ow?R#5l?6EN4VMd;v0$k^`0C8=!eVe;0@r03WD7XTo3~lG!J7G zwiYgr#zsLXE#3nM;!>w_0kHJ1Z;mTnNqmpr)jLTkS-EDr*Ks10R$N*{&V$8q-8Kvo z1PpiE^&T#35&I5%PyTUwc--z*aLai0?zn0yu4<@dD+JnbhC1$TN<8O!IGo1eY>j6((^v?L_&Usv% z9W_XAnAy74sleHx*T{7$IDnv_$Lr@9s+p;3fyEXVC}+^n*VCi{&R{PV>X9LUeUU*h z?>e{{#}S0X9>HrBT9w9easg_*b014B*1%%0JKjC}&Oxx04NA=pGdx_Ec$ddH_VYd? zX`ZmhY=5>&@?bk)F09BZz4Vw6e2(2jn>2spmp}t#hZ61+Sf!_Y1Gg@t$_1f#JAp#( zOL7dr1J|Szx1-gYHHU_H?9l6R+R$#3p3>1Cd`;-r+)d9U+PpMV!|3u}1p^R5ct{eH zlWv*8PI0whw_St3TOAwl2l-MNW{Cpm_F34x(qcc>cq=35LoYIbSxlPIAAX-}HgZ$& z`bQQ?bk@2=u3jyl$J-KH-Lv%0!PPXZBtT zQ9tJ6t6t*;x87_jG7W_Yw`g4l4CEJppg6krrTGgUQiCCDV7oRHeV!}&9DZko!};Kt zH#g}~j$Y$A7Q0`C(A_bEU68F2&UGB6RG9;c2FQN^DJQ`Eo!$3%(@lH$W#fPRccW-d z*ZA^A*N&WCov&+Z#us_A z&vJ*LJsG~i$#0$quT;9J`jy*QvS?$zrt74aYXIKpXSfp7Q3N(^JG0oWP3V!PGa7rO z12^4L_ilFlI_kW6zikgKyA@d(^RQyONXU+iOeH-f^l>9K(KTja^WdV#Ry^1=J%*V6 zxG}xcKG?#&5xAQ17Qa69{_ro7cN^(ES8^99xy*-+jdYHGKjXzFA5QUbjDv{0Ycf6k zf`DxR zO~8Ku{!@_D^-pa8cU4??9dR?K1BiyOQ(nKhtF_?n?Qy4gJ3DRn&WE_+@*=eL20+Ly zG-?;P?6NmKw89JNL9TFEPSg&PeH84sZMex79yN1gM2N|LvK@bi6+dUY$jMf^9g5C8 zeOB8}PEoeg{Np;gOi#l%G;^9<;S;QDECeoaH>jJ&N_rK_J*!;p=hl56g6uwK)kzeTUY^kqqlpfNKemU=V z{4Oct;A9xE1S~{=2Em$pz1$+V)BOli*cliU(`$Wq>0c~Z%Uzl%A7Jd`degzidHcLg z->5X;QJ#J&ynu$rE^qN=KzwR5BBIlYiAyaxg4=XOKgc1a)|=~(a0dBy$q#fia#8ti zqjIA=;kD_%!!VKI$(E#Z6|xi`+Ay0|Kp3^J-qXkpT0y ziF%@S)BD5tB4B+PO+cRVr&h%#rL_xU)elfqT4RKU(@p(As6pBhht?|co|+voUh49M zqXmcZmb>Qg9Ba25bROHD)`GUH0MM97^;RoOOwX^ZZ7nX;qEcXe*k)YNBOHhspY)nT z*eyKUdz5`fYzUaf9i8zbnHIDLp$Iw1C6E&xFdyXhGw8VJ74R>HE$7Z4o8_WB@bH!y z&GTy3~MbOKf`>g2W@Gb{C`(|_{^Hf;6W|e%g`+=ZXtXe!3`}Yd@ zF(1SQF|GzS_9+2IK1DBLew*gjFfNDA21cQ6Uce1yD`ETr2`QnH^K~2A(<1AQ2 z7q)70d+XfT7q@S_KYaixEU2XwBW>#vq3z{eT%@N(B3#5@2W|~zq;d~+VfBWkbORdS zA?n^063kDJ^)Mf-C%FwxZI2CDE-&%Z^$p<I#>=h#b0li_>h8gFv zG-k7r6LLt1c4FnO_u63jH5-wJO_Ueb;5MiE@E@&ZHXyGf)YMNYCNFX zIb5V;qZ^t6=6DL-AaF&?_QI$K32u!eRYwGx)KFKysRv2G{gAj%MCJu089pQ0q%S3$Mh=C1hYZjMW8WdDFh@KO zt{lSXm5fw;=9X=+jRnJg+2#m@%)mtv)_5QYgo4-liN;*lW~QGP1*llk_n5!&D3n^q zo5{;azE&}l+zjW3i@SBvea)Hak%t#e{t+8|WQdrr*$!rfhrv0sT*fx0oQ-PCmwU%E z#_As#QEc%(Jf^WFZB%2w-8-(4rP0W!Mi$)nz-df58_}3ABKjSaW1!PX3RLg3?^rc8ATU~X$02hMspjt1BJL{yruGQ5JD z)VGkuryXs$%iY6XABO0#q$;aKaXgsTaYvE(diYG7X{A>0Q0_lYe)Ecm5czGScv6D$ zEB)r77?tRjdJ+Le%Oi)VgY&H8mf<=4P-PH9I8VhBRsz_1|EPlhum(g_?~S~2fizYE zHin&>LjbiFfWsIb802b%29r0?TQwKEeUr5yqX`5E>9gi_r`K%NvVxfr>%C};;C?~ys_8H93kz&wrdwJ+a7C3>dLp ztS%EzqHJ&q9?T2@34hQdHeGtx8{&BGB<|Y~)6O#d;etR81|N4jOu=prazmk)rosrGn;1*hwFHhLv% z&Y#O4*gw}{r!yMd;?HeiYg(dO7~0X8NnRuvWi@Hoac9?_-&Ct2N(Sk6!-+10Y|!%X z8#ocme|;;4p@+2pWG?rKBEY2~u#=Ac5iuNt|MMM7q$pgK-_x@@a)z)M#J_XxFT?hf zCwPk)rmw7M`(#Kv5wRxD4i&14;S;JuH}&;2sBOL4R*2b-+IV^yRg+iOoJ&I$fARB}%Mb;gXD==S8*0LBMu*j&7bDS+F#$myb zV-QfIpl}&$TU5gHYZ~5Ld@l&zlO(KHYglPWVpnF*m_qgqjZFxq0ra+M4d^Aey~z9_ zDm?Ct^R1B^p~J%1oGpo1Yw6lHc1I#l?0jY5D;JW2A=;Y78Jl0}2BF&8$@hr{Y<_sj zz>Sd5tlfNv5u8a;+xA7AJMQIw&AD!sOV#)CkEf2P1Gw>&d;td7xhsx=fT2g+>)_1?rd0 z{tK4RA{5}Vrsf$x9Jflvdf8W0Wi)BqsGBP-5ZhdjI+_Ov=4{O zbQoic!Jfe$s*2gXf720R!ANw$2EhU6-YBl_Egl;g^PX#A7MYaJ_wE{1SD5=Xwu^XY zT;btDgB);O1nG#dT<#)l0zrFjxk#uY&Z!`;BaxMp)6!Xl+#$Cc?xDt^SzqJ)iw@GU zVjmX8?bi0%x>;9P`REye@nMLF-?QTai-_b~Y*+q(K&c{|w)|-BYkIb3B=?>YuLBw~}N^c#D z%HBE?L1}lNzWl`&KYc-qpT2|^&kJL0O90`gxs{KL>D2R?mp{Jz&lf+u{7-n=KFs~R zukZcqA4BB$JySv)(E%>`WI7rKCQAKRJlflTg~Nls$uQ+}PWe2V^6F`R%27iIfs5Km z|0{>JdWvDKo(8ymY37F&;TD#>$1V>tYig`8SujF3T|Esi81*u?SXL-@!(`yKZo&&L z5I~8|!R!v8)BUFunKvAPVUNxGJl(1S**Da4x*}%+Id&$u5*;i2I2zOC%Ce6t#lFVMn5goK)-iciX4BN&F<&+e<*BAj395fN=QV1 zjB_$77=6rkqs$0CrX#_ntVyYiZBYG*+fU-3xK}3rIk3A`{t^OhR$Qa^hk%&-jafzb zTH!&R6~;W7AXzAIm8Tp{LubP2=DeSQ+>o>BbNero+6s*G0fQlTe~FWCJ?b{rD);(Pu$#Elc#*7R)v|ny9aP<_<5s z9{fdab0CODphWKB;Kzyg`O^8J5Pt5vdhQF~M}RrDR0Q1t1@9mdydUq^HIQ&Q==O0j zKsWi^Z{ymP4EG(J^BRF>=j^yy`>P-WNvIAH#E^X2EnG-5qj1ZAk^$WJk)yirn+#Px z1`+p>n(||$DLW5Ro0IrALf(|oy-x41%V&pUX%%z+_(hpWT92^TA@({E_6{E$Eo^JY z;(CUS7ieA$7hBm72t+Q2jA8f9&bGZA)OvrB^kZgM50*-RnBUzHAPMGiMgYR1N;)q{ zg)yU3(Ln>XrN?2i=`p1eX%q&cS7V2S+F=B>qXN|0({`%|&j+8L!qFthTTeB8F>f1W z9%H`SY=5Sg7)~($Ekj2hvGJp*@m8VnQE`>g0``$&e@2o(& zIDygcBN62cD1WEf@6!AK9M8*LUH_96Uf}lLbPCjDKUylT|=Z)Vy5RlHg-##)3aOHKu-Y%lv zt{ya)s10+>>$E^X-UEya7g`@jp~kc9A#USH$Fl06ciu+Tt+Dk2;Zqb-;tAe=^1x2kc7>f{RD<2oEWtiF1BpumzeiWZvI~ss1(l2h z;Emtes3PIDa0nPJ9EP>deD7WuNtyy%A}Gt^p3wFsHJn2`0;}tw(Fwk`x&} z0iYg&isCjh>~Hsx=O`@CyCLs_*^8mua+#JEJY`@-FVZAY1MvZ1Mhu!4Y1HunGy|Lv zk%{1~GB5Hf3iGP{lR?VO<6t-b381=qkep~W>L4uh0nP^-DP-8&Q04*d*>$@$fFtuL zW1KIw0XDmO`7*7*rKFI-_fSZF;^sN;O_)o8p@ zGx{CsC~WB>xgr@}MP&G?doLM|)mPRrvYvT=;3u4Jt$gYRe9fQV+ootFZ%>R6cOsVz z2yT{JHC&^@>(|E9I?qq!c;sGcAJgbq;%92nT#GUJ=Npmr<2P`FE*Qkjy*i}1GnkHN z2#kH|j(Kgs6=pamGn_}jeNg558F1CIV1bPglWnY>27kd=TQ*}YZWg4Nj||MFrJG3V z%~LbX$C}~nUeb`|yJuyZtk{#o@lPfv5|7V#w#F$hDD+F1D&f8bvQYN9+v~TNj~1_x zur=JPK>lF_6xko=;YRpBM$h*NfD9S#r)8l6r@0M07JceYLiZT4b?>ATfaG6>>3IGX zYaxgXs~rl;dNeeUpZV8X$(KfCiHtA@hA>Q}R;**Yh{H2BjV*zNGfZXSEKuv!SMVLu z`Q9kT`)%G5h``TIOZ{Td7kmh7%$&gP1t@qqj^N>ku;20Er+oLdFl|@|(Y$Ehe!GE? z!@f--kA0mHz#Ft71wCh{F#o@nDy~QsR}odre}yUvQb0H8z9I#%Dm(8F5bWkL8cTuI z-thm7Ah5CLu?}(e4Jh|B`Wg%Sg7*jlKl!gUAx~pF$WSTarfX!^e{QMxc&-jVE2K$zY=Xb=VG#w#Xt2U)(44g){M2Kxbe1r+Is- z&8vPy1XN@gZO~z{5jiYYPQz|=wDBrwS}fQ`G^oqBp>v<}LW$d4X4=MQRLz=kcDcp0 zi%|@ZIQN^l;b*JJETvH*#y<;IYbw*b)jHBrK?kSv=h5e+>+|&@{Tvny3i4=3ZiAng zh+adnYVhO89B^*5i_`wt{Tk^EXYMq#K%k&;<~bGZQ)K1Cvz(3i9T2c8_ktk${@(zD zxVJwG1eG*_z`_|I#BhQJLaK{;mo$L#IF4ZG$HhGGL*U#5(Jx;>8ZJ}w_hQ~ck?zGj z4}FGy;7%VwI%&hpafkFQk97FbqshkX;|?ek%I6P_8y`tTh>%;pw8SZg_H)hidY;2J z^3#UO=Cxp$M@WYFgKLCR9DNU&lC zdL9YcDU;9Zq1(LdvAOL>)zUDe`kEeWQj4}C0bD#%#IUOUL*5vIyg3Gn{XzBzvWJb6 zQP`=D`;Va?cYK#vcj|4yQFVHjgzA2N>$ zNgRE`dFvX)sZ5{8K6rAP@!v+n@mvsI7if57BY(M7iZ|%vvn$BRi9;_yogA|Zd^<`V zt34b^bEddErq_}zP>7KV?W3jpAdXRj?-iW{EV8b3^Hi+U43KeaObsV=G=O?JnwWMM zMe>LR^P?tA@8l(Pkp$_%(E}bD`nJ!N<|61`70$pVL5;~U377HJRSoUqa`rESGx)|> zm1?x8@m;|Y;Uu}9KCknvzE~AGT{h;WlED5*;b~Ah!^4UlGX^n#8U(>Gpe(f|>VaAA1O8Q{3k?|mGxd@*|cRF61GjsvhtRW^FXYia2RXFDAUXMQnM1&wr8fU#R z8s7w?g2(pG&e)fTg*+B+?wmmQ2HxhZALec5<8_{mc{KnDZ^|CZ=o>$-wCkw8D>+zl z@GsJB9`4HUAsOSJgg5+Or_D}@!;38l5BK}vI+ROKVwjEvoQ+bhbBv&MA5?JbV+4`B zh8aVWfsUPdl7~?NZJstQGCHpaoTQ6N-6su94H(WJ?$hNe9NSr>KOR;U1)GtuF!K0s zf>H8-UBx@yLT9 z@RBI_KHN%ZkY^utH;zFBLw+$C5qo2J?Efq(dWH(_hI=0bTo5%_9fAtPE)W$x&$abI z3fGHAMIY0vRXT=@UKQEl?^Czta-hSv*aY^Gz5^Zf345Eup`(*Whc3j&pyU6;$oNxy z0q>Vb#-HMgTm%0mzTiy^v|Uf{55$3h($$bg5`R|=;eAm6bm@j|)>8)RoJN5<*AI+_ zTpEwZ+d$tJM*q;r#Qp5zSu$r@MFYO(fUlzgFMr!MBMmp)foMkCzjMIY5wm8&{~8N} zjg!$iM3Y$NZsT&a+j#IG)N{eYI*|^%nCEa#V)HqeqCJU1{mz)-uVTaR;DAtc}pJ>PF)&-eX1K4TpJ#jvL|!t)0rTq+aVBcF{lZ!TGS#86FJ!2=gwTVb7nMi2Y7y z*z+R%ROt*u6W_P5VHC8|8TPr=&CbqnMf422ooD2BI>Syywal>7&Gu0n+8>?Hu-CWP zV}v(uhTXEw4{e@vN}sc1nNSmfkI&ipmdq`EF1<6MYWkeruSp^%^z)qkZzFVB@wjEL1TtQAm^=RQly`R@J;sUD_Vf{MAPTZK7p#W{&B5knt4EQYIqHeuy>KjUL~8(N0l83_6ey)_Cp*h*Dq2wGK=)PvxeXo0`>30BTmRtEpU7kUs?LMf7oGmrnGmAZ zy`>b4uF{;{OB&bebMTofS^H|$+-cG+$ zsV}O2=cI#v=fn&8{Rg0RnP6Uyz&tks=7NfzV~x3}#%7^Lo)8j5Bt$`94EBPDR${-p zi8~5XlZ6?w12d?AQHzczm^{8C5(Z{$yHD&E!?ZAoO%7=@8q&#EhvXDUDMXhcY3~Dr zgE=9C!wIz7!v&GxK1azX9NkGYy7l`<2kT|z5QmJaiyRtM<1lLkb`Dkp-1?R~GurX6 zYk9u~fOrg-C=ye`cKp6GQ(0c!a4f2UjER+h@yZ!U8r&Uz=Z8mC!US@hN~8i}jb`SG zE9p<)xPX>IaAeD$&#_=AKhIF17`5t(SdC%xbMU?2-WE&qvr|h9sa_{O*CTwsE#MOz zczT9|G-aO1+c?h-zr4+^((>lgNuu(i{2L;t>O}8?tIu|nEs*Iz$Y|hP9j6*LjlT>m=Uf~ zV+MM)l{FCxJU~MOXnZG05MDy30_cx7xp%HD6xhFmc>av^1Mhk8@O#ez1f4A05}81t z^)Q;`iWZX+whSRqXx?x_XfH-cZLj8^qtj@Jp(^eo%)LK3bx>tIhRhk7vDg`rQyY0kl=W+VeIIP7%<$pOS1%6 z3SwC>Mw$10Xvy+|%N^RG^a&Wri=eOIO%W#}3DEaALc{!IsNzJt_$3}}mj0bK=H?#S zGr+j=)?9`Zfn53H)Omi$AxJzb5{)4$y&?V-4cU*y+3!UD?-BApJ&1f|GwivlIt&a3 zNW^@AlXpzGCTtez!*H1Bp5!2L8%3Q`JT`0K!&+nnZ0ORGgnZ)sK1K8U_?7wD%5vB| z*n$}J4uvgRm4D?(1ppMCC${E62Y4T$Q35r!uZTlGauOe-NxXY-5|LlT&}0cFU_KBl z-{TS~;Pq=b(bN%iA2{g+&aju!gx+yN@1hB9JUAg|t~shhYHOG>$Py6ST3@BD{JJ&+ z>_=vkaZN?{SYSy~66T=qW6s&&95$jkyeZ59OC8ut5}uTn{UbFeMNL}fzx;K`i_39_ zMD8!gZ-%j@W&X>r^xvwZvFsoD9=ZYUN|CYn>snoROG0hl|KxW}0pp=>uk0WB9!oVz z6Q7pdla#htJQTJkzU8RQ%_t+(XZa$_jxr*wH9vt<(9ta^sE_{Xe=X}@);nz;_Iq?m z;}3r$C%?Ev%l05;daVq1Y-8Z3_Qbd3f8r|6il7?PYaWzROBD#vBv5#R>tGxE&y# z0y^Rb=oabb0&kkB5r1>}%fQ`vOCIh|h(0P_eTpt*K;C1uS@ersOzh~zgckQ1mN>1Y zXj*^VKP}j#BSMS&FyAAxyv|tZ6wc^rw ze8+sos()O?ly5Nt`%fJ0Ptj=KkL*uwQ~Pnr=d}|YsCkiK8<32Jo9r^G* zcN^bFyNyeQE~2))Cm;TIW`xS^3WQGYu|`KN23j+4*$uNZkE(*LqhEnn^_lzfW|ljj zS5$o@GYVY z`@e?cGv3+Q*``@T=KM63q zk`pgpOLxVnjkMyg?EBZK???CdE$IN5UCQ{I;pT&%aW9Lxl%{T} zSj;%V&>U*{IL8uhRrH}Axy4ED1FEqW&1|Nk#5cIu=6U8tzfi8=tp#D{-Z^5P%NNCs zq{t_WmrgqXDlh-b7$YlI!A#r26@A}9! zgb*P;*cq5lLZA_Gew-e-z-*rGmir4;B;+%j5EqO-w5h&IXI!{nPj>8xAH5jt>GRuX zKoC;!*s(C=K05Y4JD6Cdh1L>W>xnd=vlqjIGCK=Bee0SX20+qzwX#U)Z#4C=tPC3|Jk^cTx~}w*w?659+8zF zMXWsdIgUy8YE=%fCSu}h1SVL{onhS%jONc7xxg;u_p@VUvWpB?pZ+GBtqG?L?6`$P znQns_tGnI0{OK_C{qO;jeU$k6DT{CDDa`CE9fpGcmVOO4pJAbvk1=;=0xZ@5SHMtf z8}&Hqa;MtHP!nuTI5CDjDt^v+B_cRS)s+ygyB{~E6w~DOQzTV_aRm-x-5rJU44LW9TnVg8}TSm0$b0xG9VSODO-!PZjDx!!R4#5+a*G@I*~S1@*ptot)Wo zVem?c4uUqtQ3Q1-<#?YO0dP~0E5GF!E=M57(8GeL2of95H^?O(8tu0834;iVp*sv3 zc-S2_4dzt8vf#~1vN?937AE2=7NGpiV$3H&8?6Se^U3_msOEpD$nW;#aWx?y6w^##b4wR1j72KAg9COn<+C+SJt$larzkeQ9+E7Ks5(qs);r<6MD|ZUXex}{@^$iPTkSFdN?yF$V4kS{++Jf3$liBpr*GPWK zMsTTjV>=eve>)>9?D6?>;Q9ZtpKFzU4J<%WJFFGVb6xZH6}GC#Gpb9^j&f zWE=#xHl|>TYUohYK^kLO<=1%Ebk?PyINzb zTQQ_!-3=z~SGWa*>>2!3{$$$%XwP=p2Dtf8h{|<^-^HdK=CyTC82`QwVzSXra@6(j z>uAjUYYlL6xnf`#Er1U!P%VSkM!y0N?qylZ)d)WlTv-4PKy&-=6S*;NL3@2vPQtD- za)JOu7lt7gjw@@0l&x!Hdr3?H`uWCY;lJ46@7S7u8OyDbNebFp)6>)CIxeWD$YMbM zVE6plv*xp8?@6WC-95Pd=j~1PX@V76y{z$dZ#`?5-QyOvg_6pH2nyxPBZqQ6VdHxcHiZt0!yOSZx$$XNGR`tLFk8Y;WIu3G zPRq$=#tk<}%W9!}(WyU`RaC9$62ceIpK*a$G1tZ_(uS{1D<-ZRRII9;_}e32%Zmyf z(PRH1%+k3W7<;Lu_^mvCJP2~ZCz<|HvjZSFrSwJv=XDgW$%xh2dbtjmbvjz6R;C`a z@^?uDy;=k2k%MmHH~t|{WJxAfaFM;*KQ6w&?4EY|8X+qTPlR|e_$TVYQXz!ICd8@w z>jyj8@VN4~a=H9BnEUW!X5BZ~5d1Qbj?xKVSUk%wstC7f#dWH8cY8@Za~nG0my~%` z_b?-QVsz}{?qMDi}!|bsja-&+1J1PZ&QKZ27hK5iV-Ovyk6?JZx zUzPQ(%riFsw9{ZBs>szziLT+@+HKmi;|wRl&f!@wtV7{zL2{^U{S+IEfXqrbITwS{ z4Stj=x15cv?GDs}9u@QP0QL9_)B!1?Fwo*R?a_0Hw{$4|9mcoBF87EtGd%~uf}!cS z#0H>aA7V5{CI2q4J5=Z_BBLTle*pxM4L34kr^W{|QNq)ij$-VK90)Cm)tLM60CN)z z0cWgZaLX@k))r?lU1VLx&?XGpR!LZ2jd`0hMMRO= zg4_77xZ>TKUt0Vyx4-!F_TuVRwA_u?vwnHJH9xm9x4FOl%lcxmhOkJn@wGQUEzWO` zEg!^LvC{JD_TuK-x%tJh^^~xRbv~|Q=wr(ZZ4`?yu73P5wsaORmHo7rSJyvo?~k1f z7QhYXJSc*4j|*Za1c9xn;21D!Y3DbHN{{WArBywfpo-hS4}z=|E0(y0rzkv3D1Iu27P}jb|pDlk#T64b#^{Z^MZ#O7EIbyE?7B&kxF= z*jW4CMw}TanMH>ZHiJDOX%=S$eVZ^T{$!h2NSAP(2h)>cd$WD91$S1PdkVCD5kG~e z{8d8TsF>_Zc467LF(HMeZzOsmC%PgqKgEI9f9oB1$>GoG&D_fJ+}7g4{@dlnm4#Y4 zUgegPxy^SU=>*%t2fvCaqf;ii1#WmXUD(?PW#t`jV>2fl^_JM<|mFL~fdd7Ef*{lMjK@TSmXnp`t!=%FxF+_jy$=8_Q|3hX;H-gf_@1uz{G0> zeldS2R%KLD1znUZEN?>8FMnFpM!c!51OBkSvS=g~?9FoWX>N0Q?#+tSvF1T^Zbgc! z-XSP-qSR4F!pXO8gAwO2kQ2Y6IAl6!{<^tK`ftUdTLrc2F7_5uxiqq&x_JY|Sg(ou zvbMgsDfFxAAxztsh;`tY&js=-wjXFk2!Biiksu!PHHh9ZA4jF_m_j*36^B<;VPj|Q zsltDaCq4SLFz3+%(UeC&h8d538=bH(qgflWxB1O!9I2=6vh~Z>_Tq=M9R1)qiN&86 z=OMm8kZCzQ^L#}178_34+pw4S;WP-;U%&AA=P&MZ_uo%b@g!hJ2*CvtLklNp?9J*9 z5@RSoG|vz~!6*3tW)Va8;dJ^ULtJkaRc}T;T@_w^gsbs}h-Rb?P_2|qJj1S$E3JM` zmc+e;O-g|el=e2U^F&=D{Pp9fLQpB1RvalEGbd7uA*De8y zoYO(3RY4q@EsLHgzq$=luUzGh;*ImZhYvi|h{y)i&#HznUkW!U(*Qs+G@j^{7H}IM zz_fBG8`N)+@@8&pn`DM5b`X`)i{`(Vc953Dykn>#n_{bTA7CnwR~|o(X^O*s+vzoj zWtb+#c2N0Uzj=1Nu_8rah!{Bgx}zBQCqVO2ZliTr2Xu!?yIND52>b$?(pE5^k1@lH zfgWH3KCmb*V%vjgyGNTDNiBMkObd%Do;wfr-N`_aO6CRk4*S={1Gav(S8Ndv+8}sO zAbI7J{{>ZqS@kgs48R@C0{m-8OmK%2T-en>c(+bUO||8-^hRz;g`(wUspZ6OO0AXc z0R}+0FO`-NXaE}|bfPD`Iki^izfhA0u=EhRbr;6Bc657tv%fDPLHql)#@-!ra}Arw zjRs1U(2B>8osC_QP}T0VFOKBpx3~GPqi6-9}=Y3eL6S3W#$YMny0=F5N`8(hFnnbK?ZLRgP21 z^@Opn@}gR!klWj1JmnXBNc)0>XgJaA!YkJ8uurAXEYF~@vFU}id0DOPudi*%8fqV_ zsqMMtRmki&zsz1x@drTVAOjR3bB~is)Tj5)k$3{PBFwjd<|Ge$lyj0k;tGJU%fyGC za^i4h2zKEqqZKcdHAkF&ldj#paHJB%+A{Z<#VWo=t_sD0Vibg_D3^w{vLEN{AYI|@ zI%2t4km{m3&@1Kh4uU1+VD~DBwN`Fl;o7ocd&&UE#Rqny&%%vV*U5o)wvgfw1nSiF zk6LK8@+(|Wjkmb$1BWCii$qdSmS2}0v)(_L4g=-k`=~8UmZ!>-2T2&%HAtsZFApS{ zP#e43rX+ja4Tzj$2X5B&WDD~H-QHZ)WE2itjBn)!kC zXI%ZS(?~137*Da-$shK*QOK4TD8l#d4Il%+^LNGpEyd!6ilGHz-Eqbwe!B)dnL0u?vse*Z#l2twsYsUCM zp8t1y=l<_q|lmKU;Jr+h5%Cb zX%fVi(JBxjD?FTA2G^zkBE5OkS$kRJBTm zew3^b**vz8et`g97rKPVtV0Z&pqvSTj8$TlKoYnY*&1KS~A z`bM6>Rm~13o#8KXHArYpXzSlR)|&#BFnPsdRwOBzKC&(35zK%+2%>{5dd%eC^+XsS zXQ%jqknjc}`oX<5Zt%rfzc-5Pp4Y=|2rt|?)nhna?BifaQdd<}VVKYWvjx#IkY-r; zoUAd*PeqZAq!{_9hN_}$lO;y3-BEx+rk|m#5C)2yFu{z%O*mVRH{tWIH{l_Zgy8KY9IcJo~>7rKhHg;(v@Uw*y&6b+`Ai%$!fi({o#X)V}$1|^*ki7ajfQK zbwYls>6Dbg7EJCe5NeDXWcyfA$UPz^m1iOCoj4BBY-R8 zAw_d@q@j!y2;dfX5Eb-J7iyup50y(h>y(p7I30+gXaYR5t*nZWi8;D4PZzT41>|Jb zNgrAC@bnG0*D~2xkY-SB@t*TA0M$S9tO|9drZbGs$?{xc9B%48+4AUaaWYp z^^jh|w5)S8a;RB7AGSCQQmVEsAEz*`p3ed_lG`T^&#i9D7d{nUZsIh_ifQ7UgK7f1 zotQ|uueE99>XPH?BmKkClflm#2?iDJqCuWO`TGYwzA6Msc7Q0Z*Wif1^m@DaII6nQ z>j85LL^(ZqwYKHJ6dh^1-bXt=0pb0psS5G@FXKo4(7Ha*C6bmv59kD9)=d1vppM+Q zk{==uUX{{Mj^jOf^ho}moOrwZ>u=f?!7F7y8rbwkd#IY0A(lbFO`<1Vc(>LFxlh)I z`|NPzuggE&yup>+L`^@!eAn2j|JUKorJH}nm0bV$!T<44{`h!rss6T^J^Ds1{jYj^ z4?Z3=>Ra_2ufJLRbxi67j^YiR+_U-~iEsQYYWr`ZgBgDGzV`g1Z!%;~;|E43vbMgO z2Q-#c%_M7OPf>zcC%Z*npq4e6^Txv?h`z}?jb{5t zI{ifkD2hO_G>Y$7QsA#h5^OXxP958gO~3tkh+^Ctdrz2UoBcyvS!bJ80P)iYrAKkkzGc2rXvLz~pK@6=9S z|M5R=yjrItQ4fQycfXZZKgu;CqWhSL80=w>H=jLi|HoZ+%zw`Tk-{_bIT@yW=A~Pj zLE-MfkA#HCe{bwy6|tAMnk|0l2z2u!hBe#`u3wiGaMU?$Yy@>qrelYHYr5#dtHRO? zZvjAkMG7p(8K+B523k;(S^se@Bx`l+{*N1Lq(xV^R1%X^=c0hOVsi&)>8gPe@FDmOUA7 zZM<2n-{0>pJOr`SV(_s3mPEubcQ2%Nq3{EwOs1i>dQ|yRj1A|%l_Y=i`Q8{$R7qT{ z53FnXT66W~8rTzUac?+Vh#fo4_GUA-w)}N2X+~|>ID&mav(U#g zVbuFLWnLWXY*8%x5Qv0DCI#$~LBDssf%H-$s9ldy5J zzcZ#fO5IOD&cbxd9xuXwYf6c?am&N*3PXrMmrMN84{v>U0!g>K-NsfwJ9>)>$G@y~ z8+^ffM@b=Op$`w_l5Er;iMN8B#2PimLSxA-E#4>tNgLI|!vo;)^cs!)o2(Du*;YXb=Mq^P zueg|2@^EEXYq8XB*|1#u>Ua9=G4C}Vwf3El@E{#kXQwy3 zaYNj_h~jL?pi~tbAv-UhS>xNS*lNHkX~3{cZ&&2X8jKEm*6jOMAAVlkR}REA2Gfk- zjQxmBon+e*j1%^sCYi0;_)AIaHO9xzek}k2StX-E5bxjtVt?Iivc;q#^D{W3JNN1q z?XQic}4*A-1~ z=9=ClcbdULQlj;nZWw7MA6)>UGmP(s8$I|<=ko?e1M)kdGWz_bGsry1gNl=!YD<3p z*Ka$FmgTy088#J6l*iud!8Ujab6@t$H|?$Snc831g{jTXZ}j3ajqVH2eNj&jFVoYr z%QSj(nc+Tws~67c!=;A1OiypLCwzVVt@27mi$Jj+f1?V5%(PEV8Ye+2k#L zs{EgTWHd>9D-BA?0~OueO1?T-X*#PdzQ9Bs*9f4n& z+y#{-i{vc6+nSg!yzJ{hyj5qH^H!ZVwgzw8GyW5-#y!&ioj86;c!(@a1FnRm zIdNHExyws%m*^sL5c|qreq}GevX@`k%QE(I46P6u{OD2O8xDE&?f>2CEPT4R@PC#T ze%Suc#@lbc&5o1Xg`0y5{Y!oMr8pg>j?{H%v`B;_lRza+f=~6=h9eQ1pqLseCP$Bs3&ZEojc zhg|bi-|i5-+|{UJ)FC#exD@FV_4hb%;S|!je4PHycOa%SUE$--RBT7g4gG1HkggOn z0RPg?_amV{Nkou25^7KB++0jNc_m3%Q|9e2z(C~2_Eq9Ss0_cFi_N`GV|?+^_|%hC zp^PZ8H%LnEk=PgNB;W?`>qw;Ro_rwoaCyO2Ni>E&*Io55hy#iMa1C-m@eOx+aCh!t zxpqG#k3hdo;N5) z7fmIZszg_$PH-P2-|d3UA5*Zpt(p0$Rks+52TB;BNvTH*CIj!yLiB23nnj`-34hSI zh{D^?7@6@BY8tKigRWEn<-bIBvM+;qt{$byN7^r zIg=|{c(V;aB~EnmWJE=KEF-pj!PuVvdEW zZJZX7U@1X@zDZ9)M9uj8yY?t%;or5xjsD=>AJXOTK2x#iKfvS<-3bVU=_jBnVc~ki zrAX?ZiT|nX#&7DufTb=4_bX;`e|&HlbrtVhWF+!Etc`XSf#Avr4SKvi_(x5jVG#zpNoQJ6<=W?g65$Vo~_ zw(*>&42q+DN_y=A&5Ky_;c$R>X>mVQpDI;%9IyV3w^#fs-zB_cD(l5Ar399m*B8f= z!QMckpQy!+JBkZ!Bo+;2!AHq0e$d!|LtUsvi@8Ex6+c6y)7e-eqZse3k#L40ld6nt zzGUmsaZx3~SE)|=tNrH>Nw)F+IPP<}GkEx~VE=i4TxI|HHN~8-_Mc1Ge;}z55rEiN z`_GxblfJqaiPyka_agPdQHLw@919iDsR={n*M#PI?AAU^G%r^4MrkWlSG2$ zZ>|fhIwzMgjvQa6(b|O;6j5bQar{HeAspTcdHsx!!)4I>!w}Br(W4>s@c*1O4aOHBe~%Us?z5LRq4Z2ee+dS`iH1WkIPi0Jp5Ns zl^$2BN}r{e^Ho)P303Kb0>r+mO24W~zq-nQb(Jr3m0wHl3>@IOrvF7$rBA;qI458I z&WWfe=i(pbbN)vtIIp73M8V*cnEZ7q-{G&Cy%0v>^OTK8d0*k*L$mk%-%Yaz6aGb- zJy_BIe>Hojl6bsT|Fv_}v9wP0>{l`$Ndm}!eGT95qCq?UszFOseqS|cIp@o$4Es0M zpd~j+L4)=Wtz~CLy*{cot+P$sg*qPooJ#m#wP}BdHtlf=76|Jh!tHfS*qt~&^xA%orbrC=u3%pn=F$0$&y4}*){J{ z$-gd@M(oXHQg&S`b;IwNM(i?~BA$4aTT;xZ#L1^DpMZG^jRvzpE{QB0~3xRNl6>Ze_PZLb@>WMG3hlVOt*eh7`1HXs&2>*M&hZ7@pvZ6nw5o z^O}*k)X45htm9l`vrnu@b0sd0GVxVw9g#dw5|g^5tK`i~Yn|niujb!1hIj~HG{}JR zhf?UOMM2AEcH*+Rtu{VJZJZsbM&&%~>UpO(!%34oGW@TVet&57HUbU0r^R3;O}Ts{ zfpQL?+P5rM;VqvdFg@rK#YQ^^*{QgPiC5o&3j!xNo1CX*v?a!eOKAIL!_@O$W?^6F zqSw!H=PFh9>(_>fGQECzSwl#Swky4Jf=JJp~oXcDO;-vDTA(=c`goK6C zfh@T>J!hmhZ|3ux$9^@x`K3A~3Hn^eZ|S)D<6==7aw#u}Hnu(=eNR3gxvBDXC^BkC zN~YUPs^U@J1y9&sKCP(Bu5M}7qcc31jh9Af_YqyHj7-a;leBv-$ z(qQ9;OYKpz0IXRV7VY0V2M_ul0&|I4bfJaWGv6zIVTdF2L@)@PZUM8(K1Om2F=z75 z%0B_$CJ;5ru5oP{hrX&QkNVlEZg^|P6{fg#PYa+F3YOjD;6{jb$^4>D-yS6QLSDOz zK|*nj1rlQQ_QvF|kvc=Ht;^(Pt(Lu;K=J>?Se87onY~J|{#7i~lKlg$m+X44!Ymr6 z8g-`WP`K^h6JW1Zup)W;X_PK#zcYDH>DZCtK`58)S2tUIRf(`g$N5Rtl~iM-_@53> zHhSbmb5$c+r`y~8+5WJ_Y<+SLNF&9bFX-Ivd0dohf6JY2p`-GYWHoF%wH3-T%J=3H z%1il;YZISJy{DJMh`1C@#4fc+$?#2v`>EE|)hzFl-`Hg?;W}MdsQtJEZ*+~UEUo~6 zOV7U292-+Mux<2dyK$8#F}`L!gHZ};yQPKzoY}R3=5`nMo&M}%pnEqVVmf@9Z{|I9 zxxJ^BL+#9GksBw(?AIKoDsGpYZa~@iM<5rHu-Qs;UL#xoO)1DaBE`B?Pmz@8WH1t_ zLHiIz_NIXj$`8l$0TLFO^jIK)h9=;7UC>{9No!@NX99Y0Q9l7gt-ElVwDb|*%QUTO zFqLp-Lg1#0lnp~9id7v#d4OxwTPW5_!OtL9u0AxbT{JbAyw;JP+^Y52nZIz6dbwAQ z_Tex)Wm&BwPws?jw;*}VYT*5ZOi+NFUMO5Ip$JYr^Q3@PB+sFxM{NHbpad6qQ8~|& zF_S*h(ejsl>7Kyt8{@Jyv1%zg4_3Pc z+{|J+qso0SG3!*Y^W-b)X)?Kp=$AviRyA^C4D5MeXcx2(#(cp3YEh+%2l|y{FVQEV4lDd zoU5Ec6fp9HVqV@r8HK_Qt(5Skn}euv2$I)}9CzkY2TIw=yzn&>M^eo^CHFddP%;3@ zqi2T{P-lnashsh`BN~!>Po7ewE8OWxY{?Kvdz^HRM^fiIq>mb z?U7`HeEGCy@Tj4oJsQxa)~QX#<5^8Ms0J%u>yhfY_8wh%4R)WhtdwX17>k0!m2atZ;FN8wIVju9!O z@|*L)=V@m3=jTp)-=Xv6XO48{^lv(I>MvCfT@+1K^zek^H_n_4qydF5Kl^cR_U>B$ zTXZXm;`y&=AA^AF�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 RJKh)W_1|mN|DUb+{{em60^I-r literal 978737 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 %~7`a){CWLPwb=K`At=Mlv}x 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%0DE}yA zLuER_;F}&_GJO5_9^Wdq^Iv#SOC9F>Np*VraD?z~F_jOdLto*tr zjK!RIB@d(oL$Ran;)AWaA$)2H88DJj&%^^w3S0QU;*`@GD_NkDqG^#jkWk0S-@fSX zB3Jm@N;0Hq1PKmvJ4JQ^+T8%=99zNx8M5i@aluBIlvhCv2r&~%oIuM&93{nqI6)c- zS)diYT?)cn8#4(-N18L0Q5K#@OM1~XYb;Yp-oNY_<}<-ZBHof{-_vP0F^O&bRpA`J zgtI_}W@G-NH0??47-3p{wy4aBU4{1$ry0l8gxkxLi2dA2?L!ZiR$OfEz+@p^7*s)b z7~EZTo~u2TfO#BTuWJgOmn{XBjSIP#F8{AT(*K(5#o}0eDl8`N7vk=}h&5@sF8|ge zV^*%qzjgS>)DKX%f7T;0*w^`=dc@}SI{la0d&X&e;(pa5GS@8E>A&?z4KmAh{i`lv zEjyq(FDSq<@3UC@vUr$O-*G~%eo{C|O=Ckh9E#}T1(`q9dP?-oo-1Q{eGjDf{L=G(Ku*sbNeiYdFZvRFZ;_;E#++yWb@AU0mFqXflyRq=fZ^_N5r!R1 z9W_#a^hQy)K~Vk^*{0WpZ4!{)5PmjbRr1(SAEcJio+>&U)r>l>ft9J>N;mX+s3FH0 zctxMRDOO-N*E^YmY-+ z!GywV7I}Q;T?2gKUjsb*j%$F=>2k=&!E~2HJ`ToT4*58M2hVEU@lJaMPm&xl+(Y;D zrzLvo-TvCuff$);b z)i9*t?b|eUmsJ#th>%Q@*8{g@>b~6xE9L&-`8U%j%e~ABKk4=LTl|fe7r8(yuE*Cobce_&t zc=ehEhwU3i0O?h0k55$;9X6lm-qvTxUwbQ@oT-_9{gg;J@n<9Av8i67;c5f{C|R5_ z04f_O0%Hb!%O#6~xr8-k;9n(d>cu&gN{6OdES261ge#;bcPZw?qTQ(|vOvu|J6T!u zp#}vZ(U%T8lMu*%>57AN6n7v|^YzCu1>UO4I|=0w3DBOYVBP%GU%EvVsexpFiZlrX zI6Y>k!A{o1F03)}!{t;uu(T}=81cOe1N_{7;sb+Ux&vipX6a08Iw2SPFcTwutkl9@ zfvf*}eU_UOrbrzQPBm3($V!3j2v=+(rmwqSKzElv+qAPgFZbmN?EX&kNd!N#Gn%Tu zUW+~0^Xip(aE#l&jkBEMQGWMPHJ6lpEy>D}@3pd;A*UEb{{6`}bY(+56W^{Nn@UD>D* zPQ9ld;v>(t4vaFghuYTH?Gt;K#KX~L2zDZUN7#E($ut5 z*s0BAa7wP}JQn9NE%JL&;nnA$Dk^)-S*VPXt!zscEeRyn zBZJEfdDb__#vKr$i~&urLuTtCR1_EDPRtEm1D$JUr z<73zwD9oDN3P`rYck{&dV)qlNRnKrQdcXqzMvea5@I-7XyW^$JaBU9jo2h)s6* zN0$Y30^sDzckRvA2Br_~TN?}gHCGTv1JT(*M zZ#=~U$SQTqQ-K*YMWd={?w(dV+HXhe?dX&e_uv>SU^N=wxa*OJf^my|0eug^xusC7X5d$5dYCf z3Wc?H{G9&nCIy`rJ=|F5z4*UF=gomLMV*(XUebAaJ)zFq40YaQK}B_x{E6CaPv`A1 zW>N+o{$@&@x9O>Cs5DU4d4=1Q72bB+ms?dbtvQ8P)ZP7k_HpnnV%EJ$-2{Td_VAXR zJ~$b-?yc_bso51mW#+AMAiCg7FO4yj%Aka}wNx-!7ln(|%Uco#kbnIe>T>3BRmXSg zWSz|GR)ga&YuzIa#YZ3+ZXz6K!{wSEY3&11yXVT5Jd2K64JxMM-c`@Xy`OGUvvsQ` z1CrsqTwf+>ji{ZT2#T%oeqC=T==wY5>42)xin8O`2}0dS3(TT{)tB^{48Cu(UZ4&C zZJz68RYjZN@tlcUKBln+%Ldl4P4=CEcWMB(jfdO1 zoDE&hWxTz+!Em`W$irrz{rHj%ZG>C}O|movcn6u^S1!w>3TIeU1j zus%~*U&N=oXNrSW{a%=KX=?_j%lp22!P~O8vIcf0P6XIduWuiJ5q6a?!;@>n73kL$ zBqd74CF{$jZq6leIz{GOFeFOx&2trbwgiB60AQ;E0P7F86aecAfX#SocYP87HVpti zjt9V|0l-He0N1yl2!M}s20Cu_koC#@ImTA#=O*%n6ZJHZHP4Ywva8{XO)p8%*pGZF zX};SoWa%0EZIM)(@0Gr&JuNH>b~Q?M86b{`hoY6{feD#%_PleDcb#7+CSG zVvu)DuHRVg6HKT#+<_5WDSkf-DIKZ}>eiUC3JrqMXv326n1fSLxj9s{4|z3Dbdx6J(8LHP zeI|{d?6!&TH}Jh9Kr79M8#>9R5{~V7W4B3@+;)?^5_(;RUz}+&(QFr`5NXdXTQOMV zWGc5a;b!hTd7}7@`^26O?8MOHwR%?EFwjHo@pEV+v%^;Rp{=u>Ui<-W1mn^(I2+`a z<3W5Ongud@l3u&qX*P43ed&`TOwA`8whd6%ItU4e(QZhmm1=rkc)FY}mfA=TxyZrJ z_U40PF7F|^6#BEWcrNYS?@C{WYp=5VGJKIdzWq|)j1jEC{XCUWMlCCj4qb2olvHYQ zbMzOqPUj8W93r-OK8})&r0p4fAV{)rohZbBL^!ZsoV+%WxI+M@^1CFf+!|6zOe*g6 zg(R1`q|?CNrJRNc|tmA*^p+tgDaVN}<{&=bJ>kV1h`5e)_S)wT z`fSDrBJ1xwZ0g55`te5G+}+`iH}qr31x3M#W7~b{$OHK{hPb?D+S?B=b>wXw8S?k; zHjljTMpkA+p@D=TuP7n++LYxA*Cv!JTsx+^G?b4n6?Bca+ADY{<~_EanCIsUJn}|6 zZnumr?{SCz7W>^!pZ*rR-Qj{%*gIN?cPOQ4XCZ#OgMUA@<2CyIVIdxY^+zYhUiZw{ z>n;ZcdmVbbvAu4KjaeeSepm?Xlyrom6v|rBT%=d*tKRXdhpc)Zll5!mYyk;{qf7qp z0sWU-pjscDE-^p3OQlsk#)HT!UU$wWHQLl6U~dk&hSY!@-7D!s!_ZytrzM5YKSu_# ztH#`4sNFR4{vZE%ubF=reAc2INla->NB7ggARFXViIaclV#Xaz5{7a83F%CE&8~MZ zFf=rZC5_cYZ_252a@j8!=4qm#^nn5;a z79!(`^Y$u*bQRb&t;iqp@^26k69{8(3Ch(Iwo>4nh&C0HU+ra6c|(Gxu=2p?7@D4Vlcmq}E~VOfC00TBZM zS84xvc(P(e3`ij)Vi1bJQ4o+^5x3V4LMYf zilDXKArDDd`K(|8>|>`22h0ZUS!vdpWjFiUg+NaC=Y@B;W#Y_Xm$7C=Ng%o%R5@D~~vbg=}^% zzD*R)s6JC~Xf_uK8;t794eOfV?rYS4t=^ceTff9OAecD_20EOw)1@$c*t9!{f8q?c zjhP&Aa1~iRe1l}^2x%`aC}-MrIg02!`9%LvA92Q?E^Om=-$+NphJO8uI@X$&M$B)^ zJqGz6EM^|M@)p_JD%hyb0th=xQY6bWM?=&XYp00synQ>hY>fEdx*(5X zc%C>&9>J+NrQd~1O|s)_ zQ6@9zCbIx{2LhHh8pgLbKzqJ^Wk})hBw%$ zMT?iCA+E#I1aQMy$d7Qn5`*`NkR={ES4>8yFJ=*)J|q_z;szwh%)|10$IR_Pb{00J z(wR)&s+^*=;!~o?<4tGqK#A#$B>|%99S=GlZI*agBNCh!MS`0G$D`RN737*IH6z8f zXU|N_!0H@}Q7OQ}>byks&JC|@K@kkvizDmPU`h!XlW4qK zU^H`3wcLZ!a>aH~pz%yLf_o4mrp^U!J|Vh%mMsZ_+B+@Lwcp4At027L(Z_E1axZjL zLj^dT)jE`1@;`BmMa{AHMHO_^sFTNuMSiOOv@2$-~<)ZfnYctktz+@9p-88 z2od~;$%uSV!`ekQLZW(sD}w6|yMx0Kh0RfcJY3W|WM5+COa{A|n1F9E8wvgOKwv48 z^aYS+W5=`u!pt4Di0%`3q84|#%!6VIx4x_p*QUQ=ii=)~~$ZMSpUSO&sVANe~Ad6R4 zn%YxBFU%)I9pWpWNIECHhMq+KygY)@MwM`Lt-wf`!fH;U5+u?&8hCaw)eY~G4u~h%p;P}pTlMcVe}P%9!#qiHbw?3%GO83`w~hvX4VA!Tfzwie4Ek7B18LO zt0hE|6<>o*GBG0jazH(+h@R09G$p`Ve8rICj)7UXhz+|lo4}Zo+^|`~*-eA9ALFfZ zbLY}mk?bQkC%%iI95U8}hLAK?FxHcqZX-UJ*@>D?l->Ro^p^e|dT(0vmbe3h-nX{o z_L|&-E2^_=kb4R^Zwy#0cRM_<-VVK(LWyOhYfl)mtO!Ry0<68bnj@6d2)(m5(s zP1Bh^+YO8yrG^dl5`f<)F^K?w`EXwi6PGYdY|mUq`@TYB7+#sB*%^_^U)WmNA2gno z;T9>$!q`StGw;q9L7e01a8+bpi?a&g3bDolQXz6vc?0*)1DbBfVx_A}dQjVn zKN5D&Hif#35;>K7742H42{C67!TQ7E4qQz>_*qr8`XtK|G)a;-C#sLE@D_MfxSk3n z@+>_&aEYEPRLLrF7+VkPmQH5HTDLNo=ft|zA1kpa?TvV7p=ZZmm{!39Y{rEZ?Q+-x9|f{z1ikqB`B zb|)mhxDE-(u5nWwfDa8l6ZyE2Apt_IDETXDPT+`_I$f%(fBj0jd7VqQ>kl%%)yrgc z(v(%LFc9ULB5$=l_nELRXBzM%bGFx57-A26`8yENuQ^y^JN0(FO#J^#j5MAZ;%~Ci z$V!DILTtF!?C@PCnhLW6kI#w|%uv7-3TZA}B=!vtc~MTYhKDX?cPy$xN(?>0$y%ul zqQOq3Bg(CFvL`$2ie@MYOG!i`wk3vSm3c(JU|WN=6S7^`cq6N*>VO=!Hf@=2f3VSR z&b5iS4vreRHFT8L{z+8Nkw8nQRcGL9?K|0@O z0SfN9yv^6_OejTHDOL?v2dnU^DUTgAmho$OAO~%AK;gv-%^JH619KVUEV(3j;^de>885y9!V-Hi&707L>BmlV)lC5RrG_c! z5-7ulcFhPuQ8TDt55d#mhg&Te^mGFf0^e+`E6)K05~F*jdxH6hs|r@Qbj~_2S!|XU zWSt9X&JauOcO2%AT`2sf#=lc>VN`)&!jmo%geU#gn(p4=U#;=?4*zQLF@Fs02H}12 zW66W|av}cMHnB!){I`@;-fG2fhfp#$+l4qHv<9rq2BxGxxU$u&ToeqPi=Qp5;JN)NNW4OubFmP&7feLj(LgYu zxe!02qS}wzaXP}k9f>T9-u2{$=-YODfs{#(GopuSF@#MHW231gFP_9CX$X~f*JXQ{ z9G==3t9_Sjtnh+G5n65GIhzsI)1$&;|Au$*6&&td!<=b@nTi_T{AZM&iPZ)Fp_-&I zWZXBzy}$fvAwrA~`F}cO2Vs^?lNI?(79Xxa7&4rP`VFqGq$aae!Hi~yD-vj;kU7l+?}_VBWxzQ%7Kattsbt> z$_!d~S{mB!Nae_dt*IV3Y-Gj_AC`uF#Vh`n!RJFDhvQ5f{Jw&lH2}g>CE>X3LX?(w zH8?kB-o>2_+L$qeXQlOGG|Jm9r>1Jy(zzTnbg7*gzVy621$(@`@eQYwrCT|`1VuKD z(cOnr@PQHs4WhJkVcZCoa?lq@o|q0?-?o5|Oh!oJN`BED9-bh@8?n^J7bIJt{wg8&XCn9*qy9{KQhK0@XnjM`kXCH&zaC zMf3D3n9Ad4tqm@-ibO1O+W^A}k`vhiV?ipc6~q9}^vsX< zgaW<3S#9>g$e zb3c;O|HRx58V5zrB~0xb&<9sfCPA@~foVAajF!aplH3TgLKo$|#)Td!bB=3L=alpR zZQB=SsVKlXhZcc{Vo$C`>~Rb7f^ZHRs|S-7R8c8c=Db4(tUNzih@PyFC<~)ic5Z2Y zV`itZx-)4Kn)F9TZblo?HeHlx+5_gW)6?{tE?l)~uNK*()>yg3Dchh`TzJyyWx-`x z;nVRC0K!%`&<(Dfg@;uMV!UC*r!raQle)3Gp|RD>5)=yNt102PjnFdvvWh5aj_W~f z-y@5#l2WQnL2RXrc2_7P=$UEV%}EcDhWm(dGd7gveM3OUEKVeDrC(F7<*c!KHfb%A z=UvL53O<~AYjRhgDi?GSt&!s5L{Q&qbPCZBx1&#eBbB*kDb#K+T0@HqI4|j7X@120 zF{@u&UHbuBd(l|Em;?^Z&5m+3(}Q8l0)cGevajp3`mK1KR?nyiLVr#c3%gFsv*Rs; zWbm}owUgxBzq8u-GCivv!+**AtEw%TSbHA`G%nw z^QA+FnQr@ln|w*fHvw!cIQ9LL#8|<2MdBi5sdZuvnOhK*AHVBWn^3C zqBX`_3oHD%^(j3>k_kuvg$8fh(qJ1|eqaVNpFK98F>m0G{xVM(d#LAE-h=JSe3+gU zdVXShrY{PwUVE?P+tw!(JIreIoz7pnn`r z@=I&$Rh#Y3P?XCm%1>8jjA>V!RS5TPgvb6|%AbRzSC-N!xr@Q>(lU<^Un#N zJ9v71l=jRA=cIN8XijSC0drC_2g^yV{F+GuO50l5%VrDg<<*qFwpSB;ZLeB$Ra_+B z8lif_Bf0&*X>Rs^Zi}Dg<3ik{=pri-Jo3)&m-XzB!+RaOg@C5<1adoqt0x+UmRI|M z#S07phT_9N5_hkfrgD6d0IBS?A?csn#;jOA$>Z8s7_ZjFURhthQ@=AS5o4l9&Ei2J z5P*Gsg`4Yjy4zzTx^e_=b}avAQz{qh3}bFe@FQByYgjcoE;*<`n=Z+KHlP8wEaBU%xm?2GNuNds=@tsPhl zF6NsWiBm)5>S5({Z#9grBZ$5&K=ckEife2X^M|k-zS@#eLONZI$p`1cE==DhXkyn5 z7A1QPq@S{b$8@!A{wjJrNRBBXcGW6W)b+RK4QB)p`deWNPMk>Qz%GO8U3N5GTvuxDU;wk#0(?bHUcKWl0-;74ZsTjw6t~1cmyzAc8)hGBz4Sco zNvzV`oyKzAqHrzfd8+SGbk{AYusR9Yn&+rj<$s@PU!P97uTLlJ>r;ev^pS2|^=H}5 zpJX@REyVBIGXumDG@?KF?>_(i+#JUjEoOw#?+a3H=}$>*N)gS>ke}kvD)q815ywVw-77kX=(Y!2dMJThXz95% zKvGjA<>=!dX~W)yZRB&hzvlwSww*g+d-(vj983;Wkfs+%@=5lReHag3%xtJ>g$)>N zL;u6`FlW)WH5gU#F4((b^d!>tBvEkvW)fIMyN@?r8_!n zy*z{POL1j_>_cYl*A6v$r-;Fsk+X#LPL!oAAb=v17b|J3Eu?tqs1Qf`K-JPIql-1_ zxuutSxd|Y~Ger{vem#gRwMz_)iW6dC#RSv+PDuWIN+f?i0m+}Y=H4cQE~yuJbAVVn zld(ZCd?Xm&e<2v&eIXd0yx;)JD0@)|lN_yXQ>zUIrDFx5&u2 zWn8j^J%4k@ZeA^rrrBmaQD9E?A}+%noQN3VfRF~ zY$RJ2HiP)B@qwK-W&0-0l;11fu*A7k(C>BRwYg&vH-mQZ780icIi$RjzBp?g1`2 z+27vS#8Hd~QT=l}98)7C+XNDzs!xwEDPst@$nlHaw#nPf#7Bu+C)CZuVt;<(Bbo!H zTL=97D1g3Q(A;A1wwrBf6GhK&#+Rk@5Gu15Mu3h>ccsbd}|SQR(Ug+#iHo+F}ohHN;?o#K7JcCPRmjfCPL!PQzK`e@N42ucW*oJ>^~nUlnhN-{Wk6)`iwk;p^t z6%?nV#247AA@5_Cgr{W4t+%e_g%qej}lXx^Dsw0Sq1m+Xy21vMu)VWml;&8;9 zauob-ry}(wxRD>foLyjo@?cYmiATNEAP{V2lpc-JGozG|x5579RFaufNoKWYm8ZYc zc@#SiKzRIC{ZEJluExl_>4G*qeW-gV5lct^-qozzYHMp^fM@GX%4WqIVizW~xy`qw zE|ocTy8iFKFM7R^dc9GF;}^f(_omwBHCJU$6_|<=VODLmr9YVoD`&llN?Go=@`?i zir1vy3RAxkN_Z}m&8cBGOr0R~{DkFIVf>J7Gi9L_-Cc19X3{L{?0K4=WLsxXj7fFg zI4eY?N@iJvG0FiEtLzc1lte1YCTqD;m-b>Yv1fiO+OieB^j5SJjKVCa zg*el0KSMxDkom4yZgeaXVY+m;m!{6WG&I#rVBzP~kjOwz1`^&aP8OF0qj5nPjdNf$ z?yT;P4U4liYlOxf{neMX%H=mdNRlBFb zrYbf=qu9h9(MMaNk5;=)P9*N=Bw8#j`JH)f9=6u-wiD}NjYnh<8{Z>BADBtpnYYA5 zWCqLriK5j>KI%dQ98>4<9yVgsy`ZF5zO9#XYFC)4u{~$kD^&-)XC29ZmZ>8R=X4~c z%Ep8NZ8v6mR^lr*=sjb0mdB^nKh*BX`V`ugB1Rp$inH%n4VmOeLMT=(tSzW0&D_KO zQ2fMLj$B&&hV5%y5PDs@Rb}YSK?+$lSb+AShk9A_w0SY~k~G;f9Xtrk1fcjzGY^`i z30i1+fvOBAo3VoNMvoT>#*m+UV@#`nF(zqgTY$Sz+YQlS}Do%1p#R;(< zUB$-DF^pHNFv#r7m~?OD>K^%_Uzj^j|U4 zcQ2?Ay85OjR= z$Fu6c|DMtbS_(sQxoEKnD1aiD3!8_5vgc%+(v39JGy1JLiYH3(+?kyb3q&;9z$RpX zPFp5bX=P=7r8FCMo&QFY^TyOTzj^~qQgbUXpami%sv5mvK!@R?;9kPN z=?%Mb9vbQMu$zA#3Q1+;D3EcM?yEYDEW59#L}1(5?CfnJ&^l9%Xr#9-TaC~jRgFj* zZHYFj9-(ih6^g`jw^gUKRkMOyHOtwmnTX8B8R4TE-kEk?%U(6pdv*QedzJRMUbtl` zSs1&dN2FEDMET`^fNub)}sp&~aX8 zf~ofBuyMXiLPk-;9z;Z8%P4t+|A_&hO=#CEh<3dkwCfooi4DjUqpU=rSn3Y-ABGwbKdSk;hFPt~WQ< z<)o9H^)qu&yOHU^O6Oga3dYqRG*z;5kRyXjsf9B@zPFeS4w1daz+8ZzASP4`_K<>m zsFV%zduZT$%HPEVQ;og*97GOD+8~qTK({t445en&sqb%*oX2uEaLlO3fZRB}5?y_@VPBfciLvyAtX9cmDa z7Zj1(VaEH(4(9?tB>G?X!TfAJ#d8Ofm(%^b2n8>*LSnO98}6N=BTKk|Qzd72SdK%gL@%0T+wroqDa<)NP~WkY3=%qT#$(iVejLlEb*bk42-nH;N5H z?`MqhvC%y6gM@NXl*i;2$)4r|P!`R4{>@^u_uFNSJ+};|$S48kDDvO+nxQmF^H9I{ zbS%<(CIOTdY3!_JzN?Yg9?ts=1e6>M#01de8y#-Vjgm*gKOAiBe_>d7NmB9}ygO)f zjuvSH=MP)HcO`e%TL&*&8~Z!&DcjCH?0gBL(qD3fD-`as0cm!kVrw>lD%G=dWpZg{I7)8gjAFB2U<{-o&m zXpCEe{qQ2}a>VX079Y1DwGWY=u%P((s89EhW-8*QJ;<{Az%rPj_o*c*75a^feMpLJ zF9)Tcfww_oWLuA_&UcRE{`J?QcPwS8G=hPxq6xGdk-HgPq&VA@1ctT6$=Lp$h&ra6 zH6rLW193zUdAZ&|3E}1uiVvv46XG{L2^v|jFa?t{f3uDyQWn^UOnq?`VB~D+ctSX| zk8}98mmB!V2$g!7(qbu8s+1{ypOev(Zf`hr#)-u6f$O4hDFxlAPQhjo8nD`-a4Gs0 zP~Ly~pQxLgbmp4{YY{hdY7sY2aQMN_@V z_`C5UGpgz9w?ZpEq-g|NEv=Fc&<6FY4O=p2L|jhTC~uxXBi*}--cN{LMeYDqk=>-n|9EhPNBl3x(&92Dc<(oRyZ873Y&C6gD)zH;WbDVdYP%*D`H(<)E~iF|64s@u&PQg_1v{bYE0 z$-7H`UrmP0UGN>i3$Y)lJM9g;&Fs(&ifzV!clXs(+V4sg-|qAnItzilN90RJ{oP%N zJ0D0j2c|D=AHi*(E^Y{@%`so8NgGwi0n$R?pE>A6Cv zuj9!uM7=T3Pgbtw*g&9{-zNXN_&-F2kGKt^<0=oi~zv5yu95fy~&&UDp5#)Le`TAha z#?^wy6^~%3N_Z8f7o^57^`^YDOv9lz1QuFwBf(1K@K`kSuU6D$!JFWFp1BmptlLjW?jE2kdn!KXT+9eSu`vFOP>5C;NuKPdQHZWuKn!!Ck*n{mjoLmi8-u z7wPOcmN1syEt!)&c+;I6e7DwWQKN%{*>n}?M*$mo-M6jIwKn9 zIV>t-q_7UY55KKcODE&YsPA1C;jQaa8*FIGm(x1>P@fa>3(St8~w_iM8tJcnK1kt}ox#%uMDIAfsL4crEjJ%R`&pYO5 z@hi5G*y97+M#Yio#t%_QdjB|`+?XR3tzL8|ao9w0f=L%e(yPYVjZUSj9WHBNhf<$Z z{h~FHI#PTM_efh#`P7k0ox~#cXiZJ354AF$b`j>f$drP2{gyU35vtd8%D?d^RPh1_MwR+w= zbM~i}*q_c}M^x8{om2WQQqYaDKlPeoe+t(`(wVNYYecmne(ugi0xg%8c((p0+oL-F z7<&|8Cd@L=9yM8GThBks9_7#JpJ$KaMgA-7Q4yeP#ZYWB{(}{&YyKlGXQ}1S^nziyR$08v9D7>&bUtKO^DJpp1EK}`hD$D1!8(UmCW+KW(8PDn zV^ZbZ{EQo-er!~zx`%%%H@L1xxTaddMxg_04N<=H8d>Ht59k&Bka0FQmpPlb_aw2( z6Z?lg84h{DdQq#Wm`J2cnipDi>x9j5W`%-?kItb##j)GJ9j{OM#nVOKG-jgRr<1isW zHaA^^_|)ZEGVf0tB}>Udz{ax%V)u^M%1APRr#=Ez`;_dA^_V90vgvWVMy1+HKkH|m zt?pXNETqWe2NrPXPsRyq(g|WGQQX9Fkvcf}B2DWBdCW$qbLlYDnf0(&9l;FC=jlPW z?M3ke6ila=pd|o^G$Py{;`a6q>L=iFMlKF><_}V{=YN5EYjj#un3YmTQc6zmg4@6qpkvPLj1k2#NzQJFF1p88uL&m$4Ty%R*PV#XuA>dbkE zT-L>d;5$)?cLk}$yBsR;;8#yykZID4cxP)0AWf$;c>z=PdTbob2!kiU2qshhbucg*X!lS^2rZMs z=J7GZ$L~iVKO_2RI0H;UQwUY?9uO3!tQWzgxrtj(iah+PjTX18_GiPEzyJ;pw;Y1k9leA zFo%0LOTj3{$0ZfSN+}Z9gg6ok)eqj|>;O}+j>LY`TU6}>!3?kH4cGC&O}U3f_Wqcu zDA&V;Q?r;I_AptGwDN*nXPBiK2-WBiJ zul#8A*I$odykasu@D>Ru(_T{MAjW31e7Fzb4w`;}35j+&vFI66^4NXC-7{{Ro4V+h z?vh(n6A>Hk{TsZ0^G8qLze&H}JG=qHC4hA5@gLes><%xaPq>NI2yRk%Jx*t8J@Okh zNv#NQ=0)|*Uecnfx{L(wW~`96)wPrrqDNg;qJ74S6YU{-V9gFf9YCn#Ak+bb^iV*1 zfU=;otdp|97^G9_9d@u~&>PgATG0|zP=^pFyZ49vkq!!PXgg?<)sO@YPy|R|lx<`{XNE$# zO;#4fb9)CUftY;Ebr`XL_?J)PynHBP31NCR^QJl`8q)^Y+ipkN-eMZ~so~CiLzmKY zOX*ez*x@!<2fR2cb=3AVD`_TH!b^9j#uBWt5Zf^w&;f!J!EVTC!>5)gFlHAE4~qW! zYXr;_6VB%d0-CH|^uv)P0GWFZwgt?6)Q~NZGKjuo3-ny^$T8lico|uW;e9C#|L~A5 zI;>N`4Y7LWqrbMo|gGI(K{;bsCCgIr!@rE~941Lv9Q%XpVQi&&1uOW6l*^m#Nt9Kc) zsV4PsT3M%dM!7-2o@hCk)H6zcH~+TxJfVnry(gX*86e%j8^fhfHA(MeM)p1x-G{V~ z1Vp>vhBuSrDI-@G`wVQN++##^uxTP>X4o6Rl`@{zua!d(v4^?+aIAi{Y)y+nQm7OG zhJe(ho~~VQMn-&-k)gZre3H3id2*21|6|xZ2~=aOb`ag5lLm!WPSv26rpH!QtEj}eV$=rN%?sy zPa~9iTonuiexlSMqh%iqj&_ucHLRtqn@>4mwSJuvxllq%d_a7wROyQZj~_x|uaXMj zmB6+ONXCQK)S*YZ(>%eklm4nx!UO?fGF#%a%-v=aWNTB z$7FNUNlr<#alPWGy2ZFY;c-vO=94Ee#k`yKQN~##2!K0Eb&;-(ZkuO2h4$H3}LlBLB^0VTW_ zfNIftg0U161xupdK9ce2WkKW9%N*m=OZ8-RE^WlS#gU*TR;P|wl-vb>3#cl{G$ozN zrY!aCzh(pOgg%H5PloAO&N5sMGdr0xB104a3AvzJtw?tweKR#lSaO6(_>8?iLDrX) z#|YVlI%#_gqK`71T89x5(3?!d~wG5x)($ZJTb}#5ybLzqNnkj(HlCCv?-?P0Fdb z7>=hLlLnSe1#X`_NnAV6y$+`B6{dAg@v!LXah%k$TD?O(P%=G{5(3Mn9d7CxPBRy9X;?~N4d19`$75Se-fVOC2!Q!m3KBm+j^J{fm$ zYgOwN8aIF_%`q(GK7uY60U9+#MSK_T-{b&CGa=~ zwkK%%DvhRl9-3xo4e4Y&4vDl@k)yb^$gm+AIq^6l0VjSzEkmJjiKpaB z9#htuzF?ZXi0g$Z^~n!~ej#I&OxTe~Be+rW;taf;pJgUq@;D1QH77=PoSObLaO3Qk zhF5uT*V^hz-FoAI&SSW88ZTzQzv#(JSz2w(h}N@|MG87S9f zhj7~a9LmT7EvTY|85(4ZkS3Z{wb4oOc#TgF2Yl0l6Lp~kdTtlrkNwYc8av}LO- zBt#F@}%LFYQp=#A0DOH2@Uhr)Vkr3pTcvPb+^j`3O4L)6z0hbI)J(vXaZiQHL zJ9xKNHV-oVzCNaCiJF>1G9&f5o}*Q@A#u)mb5go#lHdmGhXeR?qM$GAqg3mU*J+bG z@tqff{U|d}1NrQ6p^O+j6GgPjzuLvZWex^7=w&p0c52=6u2TEt)H81~ORwWMV=^=A zn3DSEOsAYATmAbGh>?uV#d;{U!?ibR6YgY2Fowa4CiZPDz#T_`pc|aVlgsL4A`YT{ z7D|`=FY{-Ymn+qWpI%tyfipGo%+>Z;} z=cOg|mh=9g-B|#elS^oUmk~UY;fsj#0+Nfff=&K10(Ehuf&>%2PtDp zkq)g%p!nT;i4rK0K9xmns`%=LXzEf#H#HX5on zmTH%^C)(zc%yg;uGxkAW4`D1wy`2MdZ8hYpC9|gc+>Ib+vtT2PJQk5W_IXrH9{UVK zMyC_T@5X(&n6GGxF3P-B|BO3pL=Ft05cXS}O}bW!1OK5sG0p%)h`&Sd+JbQP5|@Sa z`Ee~cpwEM~-~)d)gIoH1y%v0-&kt+CXZn1*7CffU?X_Uq!RPH-5YgwSwV+F%U)F+4 z`h2q%9Mk9LwV+R*U)O>GeLh|bPU$mz9^BC9Yq+4&=Z9v{qR+R@V3R(#o53D^PM-%? z^m*G1cIk8SJh-OM=y~v+K0hJKnLdZlgV*%geIC4}&++r%mOd|^2Vdwjeja?K&(ZTB zY~l0xc`%{RljmyuI+=vwZCF11zP7q`jnZqJ*v#o8EZPEGro5uPWU)FCK*)D|jc6R* zoR2SK`w9UcfL(3D5o{E)?&jZqNY4j|!HdRMe3Rz-e7%-mJ|6qxVwUDgZ)3O8rJb>H zi%R8UFBjF0#P%*IWrz*WF5m|YusVV|F`KGF43E#$PJeLKmw+f{5+6+{mIKCP8LBTv zYW-cn7e2SsNdEBJz}0Gd^8SaW8OA+N<$eV!E=Uy#3mYa*G1WjfWrBS0D#+W zFEiuMfb|c?p5R27$uW~*Y_lLdN|Fkp3MbE5X6($LPH4f5JP4@hyUFC zbC3OeG07<|K#q~StNI2}PNxW`w-U-{as-4cspnp#gxa{Rz^_CdkH`zk{y|z2ia=i; zPsd2$jbAz){tX$Ur>uhvTh8Mr;qkkkWsmF$>Y21?e6*ilk z;+?6N$I;egg4srSK2=`oAvb?GUdkj*7Zh*>?%tPvt4f94tInU3 zU$qc07f~ftmMy1&1LseA*&8}pnq@A=gSIj)FT@hgUBg(g`qwR*Xw}w z;91?q70_)N`#j;wjjFlE&Y>{Q$<|O8`$QHHq^8DtSKO}#xax6T!sQLgPR%cg$Cdl! z9_g~?{bvPbY=CcO!P$k_k&o*6K+M=W_yHkq)%ReB_gyBO;XP>JES1z1{}i9idSO1w zE~(B1)#1?L=c6MnZH$No>?l$O-_chsk=V8ft^<^N9J*3A`_hJ(Df`e)%%6-qvJ(%0 zDq~~9dr(CX+Dw8vY%%8^Ja>BowGN~cuBRR?Wp8Qgf~jYi@~%ReL+&XYTlS0m>o5Ka zpHFcK3A)voDH1#JDY4b|T%ZB6OA_;}^S2DoLha`87ac0H%hpl*u}X z2;w9s%V!EvT)@>w)=e0WOo*O_i`$##DoHK0QbVL=8!B|oe(`*DHbh1PM1fJ12j1mB zKcP6KHbRcX>YdKZiDJ$NPdAy;PU?H^R|HX-Q*cKm`)Y$K!M!%3NwY{wU> z>?6_`TfiHJwc2@PQd4Rdy9%kcP#s0z#b7L8A;#LP{iVjGWMzUIix#j5Km`AVCzke# zFo%{e8)d-i!m10kb+2P5Wn=8-7wW*iZQDzi_IaURQf+Kss%8}GL|?Y8tqM}8xqaKV zSGBQFbA8#iw(3)%=JsuB@91!bbgoLn;}MjGuLZ4AUvsQdUq|FLL`p*#w4c|#Kfwip zaf_aG;~1q1csBHKi(gAVwCY#T5k7JHJm@_yUvd85^XHO&<@>295;xC-_kB>8ucA;? zA2)-D>^$Lh(8Z@yFwg^dr4c_1reSHLjjO_7;|VoB_HW2LuL-;nvk4KxgfjR~Ymb}G zR>ulBylU+W+ST9vuKu3c)!&b5MD4$N)IOw;sky%X!|&@qGW+_EquSkh_nNhkxF)kk z5e0TqIDPIShhb?>xH|X8$DFU6TvNeKZk{LhlU=RJw#`z?SoJq!XuCtcB#3&-wZiLp z4U_L{BNqh-)&iE-MY;+zRjK}f5E6wO`~vNdmFZwIhR3&vWCW}8=gEvMEA8O?l@oa^d6eLutbAcRcSQVEJ_*IbIOEnYMqiv*#bE4Xm!%KvW0s7^Td6ZaVum{;KqY`7j){1D3NrXz6+n zEj{8v>$xM5EeAQX0VTVGCa8-@#FY2_Q`kMj9kiTvL{G8&gzUy6TE1kyAbpKgYRWR= zZuIF1V)yYDWegJ9qj!0IxfMq=7VVB10?Mi=O2~hK%ok;mdi6(Awn;F=mAWWLL1@Ck zbPW{WhaurhUme&;p9#S-E(psw2bQse<({ys&F8_{^YZ%{uIC+W@nmWCv&YzljMj=D z^I?M&7HfXR>Dcs0cT`!AR;Pn7axsQb9SouoIOv?!Okgd>P7zb^2#J?0!uLBoU7 zRciC^E+*lu7FGeQ+LTqS2!RB(i5HIFV9=^|Vq*UgrCG0-6cxzR72Xh>QKbpJ)fF26 zCq(GS(9#qO4oKL=CrBMGA^;JOkEbc#FQ$u9e~eU1RJ0fRD20hl5r?BGM@t;)RGMIt z?81Zit*J%2$vuWh%}HaRR%BX{Oe+}+#WRZv%*?pgKn>)YO9&I9I3gV)PE01sn2aBD zWhP{*0Qk3$qU7O{3d`IAcpFKy+@L!P1=v-)K+cBYckJq)%Mgm2 zeY)g0DTtdVIk=4_-wx?QphQk*HzA21WwTfK0yvc7V-@^rd79ZLfJ za^>mD(Mk;|;h#=bepp$tC+q`Jl#7C^xX4+>MN2|8Od5mWb)PBLH7>|cP0^Gc{x0dl z_xZczqI<>P#Y;0h7B9?xoC}n24X>Uw=_{Y>urkcYjaV=p%OpM6aM1$;@R_AT}xri6@fIT*1>;$-<9#N9++6zT=5V z;ats{D=QmZdG}7xSeh{PahA|)uRY7WY%GdN)@%OJGHPkPsfnX*f)*9~>;#R&8}8BM z0RHPQY)D5?UAN^%g>opJmy~?P;Cow}2FW-48m05tej{m76*S-~$TNBwvMKwVwnRsl z7tOYw+nv#dZuE2A*S5b^E|H94@)@hOXOsxQFL^^~L za;W#91-oxJIffAyE8?9GUW;t>?RjuL=!>in>_L^cQ zvk%XeQfwqCMQk;J8J!B$64gWsqw?F!mn zhBjLS+8%hA1f_&ha6x2N%{+*nt`N%E2i1w2n$DK;BMF^-+n?t`!VJZfWlmX1T3UvJ z4(b!4)5o~zbqYcSx6@T5xPo|lk*-l?3lYH`?ca%ZQ$<#FMAy58InYoRG7^T7Z4|*R z)C_Ljpk+d+>70kcQ+1*qBjdHrGcrmFCCRQ}=fQw4eRw+C9%XRj9lWBKuuh{EVU5)@ zTOG$R41nhxS!E{GD`y-kjRl13D|jl%D{ZoG`_2-V`6Y)D92jTALY+W3Y^DvjvWZuF_`_$w`-{$Y4i%yT}xkxp) z{9GgxxNN*6mx1oJ=%nLo$&o%emdLYr6rd)My_zl z4ROaY4x(hR8BFwg8O69yat>VYwXL<6!{CjRV^|a}&Cd)&zZ2=RUqgx_ zsrQDNyJmv_cQPI5%}&;_ONOkYl(I|QY#dl1;F^lyGeb)G0i~s$LE({Ac+xdeL;&?a zJ!h`saxof0&GRO9JvoLX#r(X@8etnOn>uH$ZhQ@cCSph`Wy^lT>E$FUMdd6w|Mt;L z!>`=H^@pS&159tTR5?dWI=Obr)nJIs>YIX z*&>4nR}pP#^gD0yv}G+=ZF(%Hw19~uQ9>X$JDj-$=Ao%27|Q$uD^US?jw^Du<8w;w zWwzDG!?Y5A19gYKJfG9uh`qO+klU$xV(wzBI|UXE6IzVKR{BdmuhctAM3AJce5DGE z)m?fPM*+-RkCk*(i^&Go)zcN!OMH6fc%w4HBwIXN9Z!a*LzEq0YK7f}hlx~M(CgJY z`8ClNBliq00ac6h61K*yjg$7KL<3h?LN<`s4(T4%p~7XkNTjj@P3HXO+ur)T3Tho| z!0C7-1_m7Q%*B-vO4aB1Rs(PxUp3AvE~j7}{qaQGPLQDP?N>@;1@qLuhD z|AgZFJ7am87yPC?))$H&l83SJKF;(w%QSFlW$t|P&4$t>HVRRhdZv01b{lG{?Ouzi zmTZ{>g1H~mdLqQQg_a9!xI*$;Lh}9}1mSN4LhxfQ?8&!Az;ouvJ`-X2Tew3S;XaAb`P4MimfA|hr}b0Sw52}{xH@oq^R#dgz%j9Jfc22QImbS@G$+QG=pKalWSPMbp*(5H6I{;VeWlTCDx8 zM@sx39T~TG>?O%cCg%i86f2;@nIP^vdfiiS_ZYm{=bV7mM}ra5dy$$1u3uuDiclH_>qr^Apb*&&rfai{jwo znp*WPhoipzb;HC54fwa?F`S={jWr{9)3@*Mhw*qc6OZg0epQVga0CuE`H8VYuv%;0 zp9C1tJSWl5J{Io8=!nS=#zv8N{G7f|ugSz2Zqs)$l^$Qyckv=@4(U6)XjD&I^j*xR zQ+{8}rW5`?;eI0i9`W}e zyDiGgcsn?NeYSdg8hk=~XLiMGmR4Rax8=f(vR7+S6(b>8j%uU_pzZJL=j0ew!@qap zD-Op3_3eXq0bPJIbE{2Ynd9Iu`7^32(c`~kq}U>qCokyFad!F zWD}(P_aOqo!(1~dO!&^uhf4k88h(EhxVAGc4}yXGZMPDRf6RL)lkN?aAodlZ>a9uT zY;e!bk*j?h_jCg{4K^l=I@G6IK-|z-!h{DNVVVQ}I#knlWHI!apQcbqDuGP&AV=uiACxh-qTpEqX zXM~k;h{UTWq#a&Hd?(f~y=m?3mJqf`s=Y5+0974mfCvm4|5U5kjCwlN8FXsHOA)LH{g7Wz!BfiHa#{Px~&?Kj#xd%GQ% zl%$4pid5~S9f^6_$-sh=hop4xc2mZUgeS2*B%I}npd-FFbilf>8Dc9&(;?1s!V9E= z!ZJaVGv}1c{h-OhCKd0Xx%~B4-%1^Njo24fO|PK(Aa1QupVccZpsUP?KCJZ)rF-e& zC}?U?0IdGeOz%VV5+ZZSza2zp6yxvKpgFy)(q>Y6RgP+zJtWbe?h=%^08ymM4z8t9 z_Q4V&@KW7#r$UjZu&~SZ0cAjD@$L3>-oyv*?P{xvx{Uf^PteoT{u>q^=w ziI&+arM=>TjoN7tG}(W0A`)4dPckTZ>`Z`*n$oKtP3?$kP5+MJGN3};A^o{D91#P<8@*&Zt+Af&TGi#75#Z)3C@^)!lsd?oV8RIin zO2y@Vrh<*7w>w+S%^Dd~9^Fuo0-U#r@RNfI3o$79u}xvT5fZ+EiPMKEFVi>WW$>d{ zSVsGuD-q+3fSQS?ghM0fRc>9i9+-1$GI|FqM6oz&<$SPINrF?1%ZIO204< z3Re2{{55;?M?1gr=e z5T~65&Cwo9{+Q6x#6drifg6PbDa^t(0Ug~0n(G3nY%(t!1w#$C_QkF_3n0Yx;rh*5 zxsw$j(Kwo#)?IqR4V|GrkZ%f#Z?C}k4o7xdZ3UtcRmymmW;usUkWf?lR5O_2R)ni} zqb7GYziU?3am}8h>(1)?nOOAzv+F?*?vQrU3KGwdqA*1rTj(*HgQ8mkG|Cu0t8SmJ zj>fnk3;V2vR>~a=g6AO92?rh2c2$h|bPA`H0V4Bh7KXE$E?NHiu`X|16o`B~o z%T~U@yY_op%1h&fwrfHNPt#N`mExbf>!fKOBrJwY~B`W(}lSu`wT1ulKrH%)z=SOg*+9t~sA3YMwnY!@cqrlBeH4m|>LUY0%^NMG-D(3=9x@A`6TI2AtOFGt*n!%gEm3 zjxVPvU(v|B48`;ukxi}L?6Y-e8<9-M!JboZ8s6;_*;cqwk4T0u!F8dl3*Yi+W;TU` z+}ftQr-bC%w2~`hUCcn~RZ(-cQfmt)>a)Qdg+pd{1kF8qR&8g~Ido2Rj{TeGh*A?n z$zl?84!00`>~K_DDC10Y4wEs2&h*K*^FP*SL;4isIyC##fl8YfezP7xJ4oM82dP@> z!AH11r2M>89Sn(jsY(;%c2g?MWx6eX#yF3!UHWKURVfNZ>sM-Cfo7ZxP%r^4#VaB1 zeF#2}l!Nd{#o2_7%J5n5iiBxU*{y|aOYl!6CpaS0-d!N}#K&XyROJQJbsz3GLfmgq zI!f=}#D5=nZ&%@Yu%^zaoB&7|AZb$-75JD!NT3ZtD7F(9V$gb;Wx~>#u$V$rM&uz& z4>~&5;p-~7S{oCD-gS8fCs-lmC=#xO7bih~2h+{?-7*67puZD|yTfLvm#ZV#bNHoX zExi#^k(O>|*?MT?DKh)PTqA@{n!wvwF93ZUw72%~y2&B*U60TM2}@f;Pzc00BYX`W z%DT&LGK?Zd|%(;jhc@c`w_`;(Focyf{ zpH(@6{_bR*S-?-AM_#~2fq+qpHi$eZ05X)re2DfvjGJU*_EA%@*kVph7(5*SNo|BA zm&+juY1p^5%4D}OEAq+Wz4m!G^!T4TL36Vt!D!6x)0q=C$Vbz$z;oKygzO4A^Vv7o z@%|xoJVBIt&!4tix=0)kI>cE=&rHe)F(W5lq~sZ*J5wl&wAFhj!YGK$>Jw1Pl!7F6 zmQxfnwgQ$h1S*{)3m`#eWMI&yYb8GnYfI@MQ9o@x)ySt;|rC9_^G?7q)X;aM|5)W>@30uvf4njy^2&v^$6T_lF)DU!uNr%e#hiNAT~iqT48cVOT+W9^lo%FgrM(78{a@?Ou!*#M zoYRG@Q2>mO;RDzl^oh)!iChY)al09# zgJ57is0OM=^jQhIC-p|t!01oDFczot0zfp^mG!VQy+3ApAJ)UH(c278iP{t80hDnn z_vFBk<$ut*X0F#Nx)%s56Xr)T!@7MYP#fvS4m}QULt0G>=y9&adh%76OlbRIzV&DN z%D;vWTG!6KfUH9#9oZ90g6QxViK7SMdG}p7?Q&b(BQXG;JV}Sz8C*A*}Q5(qv~wZ6*Wpg@QJ`g`2krwd7=Kj9^h1}NX!Mz``)PAi^P$y>v_oN`)`4f-d! ztVnoTdz(zwobOGD2N`b&9s{#6|EYHZ>II@cDq=S#-g~o6T2BnSkBtt7m#wfRZ3Q0% zsV2i_m7W_F3d!ZL8B;#bWf-`8&-#6K0h3cY@g_;ok%QCTq+j z;sgICw$`b}Tf^lN=#u@j?=r}25D5bB{m;7{WvI7Q65* zZb2nlh=!w91QojwD@YA?AFywiuT!C0YPZ0Mr3KN+#r=v$;Ie)Dt@8UfXJgp`63y~Q z5P_p0Tt07=uGK^RCraupGen}{L!;Q5JIjn<8$HxJ zrMp}fLfYn`zEjb|%gjI3^r4Z|5Wmb2+UB9Yy-Sm2y7!trG=h!FTBd*7=%L>C*nYq4 z9=lc#^{=-Y%S>L|Jk<9F+)>BKzRX2tml+_@@S#!E`m-#I{B{qG@d;Az1)LR^9m8+; z&=|WgD3jrS*)jZf4~_w@&6de!c7s?wH+rb|{qXzc5G6wO4t$wG(rt^5#RrLXo*x;_ zway<;xcPEBrfd(YgiT;$MMHy$8jx-jFVuJ%MO)jTx2xMFqa+4HY_rV za?WK3(RM|~V2pI2UUsNd^CBZECtY?ZZC7LrkDV?%jMuctNDP1(R{AE>|lP|B4hd7ciFN0wnfJBx$v@M`E3i0r3`uL zfwW=%C{URFDHR_j)$rj_bUw=sp{?@!w+gbd$Kr#`H7zvKk5Fwhl51LMqy&FldRd9q zg~qd7a_O;b%R=KQqg;9zZCGfO6pvhbuvGg(V-mAmdLU|4sCUC7mma{h%O7JHTmR&O z12nrZA=yUxy^9QMUoJjEs$u>p=9vA!FzJ^0q6sghDZ|5F3%RWOOKk-N1?GT61}|n@xik?$sZjt zj*Ww68?lb>_qR4A?s0#sfmqGrD_`74{@5PwFRcpCDA}=Hu4|q@qD6n#py=VjfLX2c z$Fs;^lo4PQ*QQY4uSVnU^1XAbLjAWmVz(eNxamu?LLs1B#)K3UAi0G8`4xdY^Nk-EEj?CIyrseB+UAed=`3|Ig%PyHL;WsG*|=-l zsBrI1id(^+6x{RVDBAd;(U#lrPKVxqsLy4LnmlW6@KCQTynZCF>SX}pT0PW1N#aX) zZyP<-JHd?#<}NdLZIj=(zE!+uZIR!voF3nYr}zl-ZS%*X8U5Hu>6Q$Kt(G`Q73gspuA|*@n*x0k&02EC)Z~GlDQ9cJ zUU%UrMz81h$aND7_W0RUY%I{DD>t}g->zZ)D4-o5sZ8^$qEZ?r@7m<|{Sq4N+v4-) z*YkT^k~}o7SG7fczkDDI&J>;U>-jyx3TN}->>~KNVCORm@K3gUXdKCgNA3&BcFT;o zsE>!nZiOZ<&9X~OG<;|jCKbz$U>iNuI}1fi?vS=A(s%17o`&Z?zBe>hRv$&i{<%?; zt&5B&^R#u8m)$eB)I=9WMou(X2K8yoMC1I?tQM?eo~C!7kJ*#ZwfVv+J1}<@eqXPrAq}$94jB(k?zsR_j9J5pw_VaDLC>R}x3Fza4Bs zNpz7*ulyL9DPTIbf!msmC_LPUvi9ZO%e`i&(fYEx(b;KJ0>i!iBP1zuF;u#^Z#4Z@ z!Rfbhrr&bYe=pPDxlT?0n+a&K4)~Pxy%es?)pt4sfMT=|=K(Vn^0kBscYcJ_bA?b6 zHpspIYBHRf?+Ahq52r@~nz%@s_jX{~Pb4)x+(FUqOduiKU1ZV^BXM0dt_zrv_gF$Q zd>B%`G1Om|9}o_xaY^N#gdw%v6T4)M(3^zcU?|3$_Zq!1mSMXlY_E;_20$_GvotEZ zs&uaTf1t3|IkZ3`2TfDkPfnUyN-ls?uM7hzL2f?I{oMNUhI!(|7KB9*n z3PbyCHQ*K7b%!h>S&#3#D`!xp$j>j*Xtu{&gXnojO zO0dt7M6O#mb-OeChQBfEU91O1Sg}r7SZYKAdH{TS%oW-1tBVlArR%dGn+}GtAEyNn z0$1(NnUQ8*uwi+M*s?^R*DG|O%?%hR8!(Mx_!|>={tN1y(#_Qtqor;Ci)%^pb;j&kX zxVVF4^5#C|Ku36NXd9x^y2mOJWk#hTNtex>+Wy(7G@MtZv+2x2mY`rt@4eK^JtPf6 z;W96*5w+8*FRzhh#XtR6E=Ln<45}VvS)gYa7Tp%tQ0f~WQ?6M`BFFU%=YmshEUWaC znQ>lvFbQBl_v@oFC&z~JE=jWc6&niJzpuUCMv5Mg9z*!B7Kcmt4d;+}MGBW}ydNVI zUf`M!B3^MyaJx+i_{UsdF3KrOA=luNvYbScd|C$bG9;t^jZ~0GDw^?(Dw~+coMAPt zAVbxN67CIx7-=)9pb7m&#g`(u4H|aI`TBr?5E=QXLdT?F$}wdW#nD8i6BognI-2F* z+Q>O$@c%;cuT!wOmz#)7DVcKS5SmeDy-!Io1|m>$PN>b6OZ2KtuR7)_Qng)g(~aP~ z6P=6+P;KPD8&eqyL-8{CO-r`&28DOg(|6ty#XH%$N*NsyU{F!>Je`Q}EGXZg8j3yR zE;-_j%XV}_S@8TQ`+BQmR;`Yo$9k(uf@$qEn?~+MU#MQAHlqJ8U`Lb3~1ZZVHGjr5Cj|{XV z{f6Cu*1Z!Futt$QmRb$yiP0wB5|dczAC7>T;*skSFP3EvGdc~Knncv`Tpf74Bm<&v)2kfY?~q) zkNYC)Y_w9fg7L=Ea?D$=%^i~=C+8Z$ohmSRGz!ud6covaq$*zo%}E^9z+CpjZaj|Y zctj|=Cn>>&7ErMU^z`1Q*n(zhlDBi2fIX|gq3i%Ehd{5n7*D2hkch}U?yEDBIb1{r znE<#oFqP3rZ5H@k3Ki-|A{KED zx{-YOv3>lFG0)>(l1(?Ui7pq^Pc0DIj7c%R2-`u^H(IoG@(<7qY7P|ag+c})(jl;M z^17*uC}IHpN_Cv3ABH4n!rQ9L1ls#|uGXQ`WUmJD)`YEtM(47oIW>R=cgpuA0* z)k#VzgrhLAJ1)!xnalEr=sX!n4og4_|~oY;OxsxZO6@S-07#!|AwRiqLrg|CZ&nH0CS1 zgP`M`Pup4Ef`sr{2)ezUq}jh2cTxypp0i?!>W%fnFha7>m<(xsNgYbL6{+-eh?}E+ zvOWn_8*=2|5<*G8Xk=_o6)G64yK~F(O+n8V)RV*r#^-GtKa~iw^!$y=8t3@i%AG6YQp}y?HrQ1UH%wZH?1+X zE4Zr1+p7z^$RAlq@gAT!fp&@l?G^FFDJn=Yo224yl(Pm@RkbU zs02f2e3_vqx2xIh3yf(cmSqNv%z(+p1x8Z{ExW>@8E~$Bfia0fE<0Y=jF)JeKUNba z*+w*uZq89uZO<0XDSl|ix9|g5)JOiUQli@4Fz=Q=1dD(g(V?aPka({VGpC^E8TP0J44)`91HC^D{+ zz-5Qs(qZR1$R8DAHB^(mlOK~LJGUg4XLaz8y1xEMP&_=AeK4JEgE=H9|gzW zi5jEP_$us!{BnKEB@Wf5H-2V6`Ewu%M$}^5nV3q8ON@RdGEi0z`Qr*1vY5Fn)b|w0 z=6fhIZbD2fs3UFYkcq}cMziLeWslO84msaLk#U(^xour`^oEYUsGlNpu%v$3(RX$9 z`5yAeRS|}^$+}=JbE2D044UsFf9&j=hk^)pP2y+P&Ba4w=9;w%4!%Q!=XON1nBhYC zjmiD|c{}K~V4(cE9Ypl`csqEvh0pLdn0D|vy$!z5-;>*5lm3owgEoB*Z-Xv6dXcTYoikqP#V**AgijbY_S0odzlh&mqd3f6n`@%o(^3jT$*Rm~QEb1jfrzLxv0 zH9o(gJv)tyUEiL@%bGW-g)!i65#$P<)GtZbqQ%64`sWywgdi%QI@xRVF{?~k+mbk+Ba2ZZ+f`eOk@ISK`lU$ii68W#PAVlTEQGy07y_*$l;lV?2TL3%q0L z@<=j!qud&thN#xzDy%7^8!7}*QSVi+rq@fRP+I$98vI_L{-M{HT0x^e)yf?cS3CfY z#B#B^ZePbE)C8|j|M%b40W$#$oNTM8{z`kj)rCW;b+e5scONk}T*D@Z(GeUMYMF3! zD~vOJp@*n95^8DYMZk$Mi%QL(Q}%?+48*plJIQl=U~UXu@>?~2N1lH*FVe55@y~MX zK5)Dzz%HXmg!T4`$uZpCq`bU2n2g{~TkRt|EfRFh!ku_Oya>C-Z~S*t>r=M^jDp@C zl77cpqDoov!##@qRVOG_rzKq^IAu_F*i$o z7j;rhO&V{i>l2LT4s-04K1VgBtTn8U(8BEGpZ`|E|6n7U+?3|YMCp!yE|of+n3L<< z2c^=VdX+t{N+-4>5`#;3r3lv?rF+vs3H9Noe1Vqzt8q+XU#;vnrle_m@WO8xk1NyiVOh^qYL%{~Nz_V(y|!3ISAi#4ZWwOgCr9lwrPlt9CPWD|XK! zyV?`-?u!>L#ao8gxeqwkeTh6{eiTI5$X#n*85xc(L*VRn+~Cf7J$OI@hqJ&x`%(7Tn9Ls{(9*&nw?I(GlvfL#q>%H zo)tcO>YL6&qJMhe0haz;&@7{2M$?6jGn;32 zkkiG2P8M{N+tI?V7IvoRO<+X-rk^DL_WyF<^_zUszkgb1-&Z8!?-vyD_j5%2eHQVp zVYAU{2OmVse+?4`;@PXt}1S_dDJYf$)NGgcOfSSx=AsdwAdh|zE3&ce#9K&G_ zk}SJSt`cIQTGne^q~qJ_-g}BO+}Ybj^1xR+yF2t%RD+n_N6k0V|Jet8qE+VTNqrKG z@52#F0+Bx->g*aPcyvua|MeFY6BiG8^>~fN!3Y73!Bo3K^*1A!PE^r)OxpOjg7E#8 z1K)2b6y*C$y_$^A#qt$=6*#|ziRae12yfp?SoAH-J*3xtx(#+<-f???H+kB9J!u8xNEeGhaWw)GeE{feJY5$AJJ-U3a+^Bwx$ zLU=js?k|L3O>`&ED)@ z{E_>qRelX)4KVx}?B9n+I+fuIXOZx--d3-Xu-gY236h8>?7GsnU6ldAp%1%9_2^LI z1dhn8r{4n;dp-&#t87uAe%2dh@2^UY*gAsrCab7^d_^9~ZyYn8jOV+355 zy_!2MMAj0K{T94l6*Yi_u1DYIL*h2WL^vdWid!i=8J%x&3_7af0 z3k)PbcLHFgd`9v3W|3_=HWujgmjx^7O^bkfV6LPXq?7O@oP-go#gj+xn%WHexdh4Qgy0B#VR1cE-8MfwsT6DU2%HnUrRQHv=gvk}oWJ_8!}B=pby zMJkE>Rf(^Ll-xm%OXcpk3kAbJGOdk9v$0<@+kS(d>vQkyy?nE^(bjj)GvC?SMShi6 zjg2jR?JV=PgI%aY`pQ-2D_gq<@AQq0%r|y+-ygI)$ysgUO-}dmjbs_0&0s}y@vzyb zl%V{G_?TywzXEwu$O%+(2aVuw5U4~%+0hxtq>zmSC$J`aUiHW_9(jMIjsCA4!($V? zAH3h8VVQgZ1jYtu^v)+wGAXUyZliaCmk^zOP2AITpcJFfcFapDrSqW(B(BE{$Qiu# z$7S}`^ngkTn+;TVFpC1!n~YM&vhAF}2qA>6#V$h4{=82=`(URdl0C5Iz>T3%plI#iqxVQWg5xNA<|<2;7rZGYW1$iqD$X` zxqBI8fHDA|PLjZU8TvI}8?)Nz3DRJ;iiXEwT9kG_`qzpzyyz2~IYY6$kc!79?Dq~P z(QE@^?_S|o!Px7vD3ICwzC2M_c;dfqTqAFMXjzEx@BH9{UFwGFchVh77L-$SFw*MM zX{;oj$DIOuPrv9)E`1c-z_xGiOxQzcWHVynku@%Cs)I*S7Vf)#0M7oOp1a~}abP3I z#?^QUc+toR>Rd+>Cd`xH&l&qh~Y`Bj;!* zW#q(6oVZXhQQh&57&&Rd|Kr^1wkVOIy-56Jw>E&;!?!jUWIg`p-P-tb`sdx+@FM>e zw>AT|%_DQe9k|MP#~97TJj&*4xMY(N_sNr~wMGu*7I<@S10xlrRf-19gtL(CiM4eh<5JLF4{Joy0T1JYZS2KePsl(^ z&IahtMO5ul9$94XIXr^VTTt6%+$<9i5syGW&5)rEA8pv{8|+x9u~l)s{YOJD;@fJ3 zZw8ISHrpPW=`Cn&Y;V15__y%0pvkF)=!SjK>sz1OTe~f~v+uD>ZMj*oZGZ*C9dIBL zjy7%37iCqi;I+yqw}FMYeV;|-R?zfP@lo;mPJ!~GqUf(|tGRZaSG8 zdX7yzBcviNyng=2ndz*4uG@DNoE@GY)jNk*41}ZLTlorT1RrNY$c^Axed7;auex_hALen~d|Kw~)dj{j6sOy>~8kg4~`z3`gnOJ}1M2Kd>L zYopAt)p&BQ^L5g;!LIvi3)ilM1uPw7^3w~|k1FLBb_S|v^$jNFo29?;u%IG%KPC#8 zFihAbGqby--&^YK?abB;PV1$_H%JP)1uykN8n!OO^42)hOrp1qxfc`m)5N=1bMIQC zV&c7zbML7IF7evg+-oTtQsQl>CA1=1w|Ce7th#a#h1XOu)7(Zvn|g|uCf-YE=OK!8 zBn%|1o}_T0dI@s}5Tt*2Vlc=ZhF0iKLn}<(0Rzak&MG|q9k_{35~+lB+n~=vo0okP z3-ECZQ%PH#zS^@_vaRsU5~k0~aIsVFPAd+Kkr&Gdx1!gfUOOkLt)mO`fK1K^ zUHl~6goZqf695L&WVe`tCo1nS4fVPw)Ey8{j_ReLPR`wvMYx5h z@&X%FeINdk113cF9|+6@eV<2;|7q|PX7mq)r{#h3uoP)=?y@tDmLvqk4kLFbzXXvk zrYw0FeZwL#n4!-kNDv}{O)P#X49Aa7rg4(g8)n5SYdzGne`^J)9pifxHej|0ig*(K zfzd``bUGd24^TwaWG+J@q~j0_`G}||fD^oi5DAwf8wnOWl5*)WY1DmzJ`5uItR7AO z06#SSM>bLuTh3?wFoFubfF@4|L+)Wnvl6v! zj48P_f*+)C-PjQl

~u{s8ieH0aRk=aAk(=O|zew}#DA+)sGP0AO7*YFR+wEe{a$ zmpjopNiP;cU6dX*1j#>34ABHx7~>R^=Dt4WBMc~I0S{>LtbQ5(0o}`->`N<4fo9-H zUkc5@dO$Lm(1Exd;`{uXztZKDjr}FufMA5BCT_4mAV)iL#O<{idh_1_jiN@WE3FzJ z@tVl2!4=4D3W*c%)Iv)C?~XLp55vI24?{TT;rU^hhNqy84=b_&%)t{l<-ddR7QnLr zW$8 z^s8phqS!xW(y)@!q;muV%XUb`Gq#4sG6LKKjU%dI#OjG^7`gazGAs5>*fpL2#3c|h z2tcrhS^s^|CuO2ZozYXXgmXf`@G%jRm_vXJ&oCfbG|ltk154x=ln8?P&KVwRUx|x~ zAFWxTb(qXvBxE=&5>&}wB+fCp88vwdN#&*rj$h!O<7c6vjGXnpWfTK>G`hN*^@kr2o1g`kMmiy z01Z;sRO2)gVnSY~}}hLqNB{rvJHE9OOerH65oG05_HzuBF!jFK-HscR3lk!N6%aR2v#*!sk@) z5)uzZtmQj{xm6%2j-nVhoq!zEwHZqGOTC9$8UFM`es6XSXQLfoNlOiX9bxIeW`Z0BG{+?=*v1n&|- z>FB{bXvOMq&WwAL(f6p4F;twt$Z!Wa^=Ja_eu}t*%;BF|KpuCkFym zrISvFCDJQmQB15MP2xBsR)gcbuuLOvN^GV`n=2nEx6?{3lAHb@uJ=IL&N$u)yC6B4 z=x4p%PrlLeZu;ph|6*U?1Pw603nRLpR{|Wv<3))B6&)r>w}XMl4=h=X4|_-T(JGy= z8<#HGU_D5h2~j(@JDvXYF-$?F4->+EVU>3xo!P3jWZ7t z$mxVjEp~%aA_-D>V;pROHPyRl+%%~s=VLhCZ`Cg4X>Nw6-Qyc_KRUmd-n^1PnR&Eb z^lGXT!kLgLI$cMbJCXT0BnQrF1FVG|c1S&SN1EgOqo$^w?=kmvXV3#xm{jjFn9h8U z887*#1^}CHX|6>cNbv-;DpH8|LgW+)tIea1Y;K2jnGm?z0(ga5DOdptv?NN14zWsa$UnSdoP-{UpWjDMbEsz0ZHo?|L6 z@?YVYy2C;WAuY+5&It&)7(t#lJo(~#t1S0Fz9xYfc_Zl?CQ?PUU-N{xK_kr#fJyid z*IY1zlkbqo0~l)48;Z=#mf_WSVE4CNRbvw3Y&XWN_?zcrN6(b=ru^#YC!gJtJBLdN z5P|iX1z}3BqJ$4uTU@yC)OfbA3m2LsJh-?~!h>tBo!$v0ns$lnT1H8KDP$*y0$a~{ zYwZ0D2|n32rXOiX8{q72NBwQtwcBE)1=<$bnTG6)y@RT~Y?a|IYqLP>B;ly4Q*2UR z42m>DwQRm4O?t_Uyyabcg?It5W}``=Pkhv`w>^nL4=ncrKigZq=M^S0X(b9a8?JU=>sP@`sUDcqiGhR{;58;EuY1eKJ zA##nKGwhUmA7X^cW&CP0@Jq5+>~2BVN{fNk>Rs)OH>w;z7o(=JExlgRUFSI01j~4%1z)# zCSa_hH~=@I)FTm1a=?^D&5heBFm9@`8y@b%#26Nu;RfYSViSNodmist=mL4>y@V6t z*;uf|R0cmItR=3dqX2Z!{9xodN5_zb&v3nwqzHmS2|J4TZ`eFPV`L@i9#v6__;8Gj zIrt}-u20Kxr50Q3h@)~K6;2Ap*zmto1K!jQH#NGOYsPQ77vOOxL2RorglVS-Qf6=F z63CTI;uq2&qvEMy5`gKI2QI{05dAgM{vI1-3dXz*b7J0x7ceB@H;_FvFFkqpuKIa`iQ3Dxea z?_NMua=ZIJqt^xPtL;qx>O^<%Sp0KS`H+~3&xR_2Q?mNFN%C4D%{mlge?z-6 z^6oM@>mde?Nzy#X%2r0!{ zsq6RV3&&oMQd%2+ojXI4-a`N-*5u_jY5CMyaghZ0p7OFP#+Mi@OmIliz|@emv6q8A9j z*~?=(w_Lf907_>-WwDQPOpQdwFFMJ}fAL`cMG!wRL8Uu=J^!wiAN)Q)%)h5x-hb`w z{A($u?7zKj-p0CnUNFHzcDwKKk3_(M0gWC~;1h)nK3$0!kS+&>I3-n{e!{@s7PNNo zr;kS#T%an3eU+w$^{%7Nxi#(KiVbQZNQ&Yl=&Q~`5a`~V`jyg?(n^K$`Rl7CvrqcI zo%IwOKR;)l|rGU0ee1K?(ZLagWoK$)(P?JXRkW#wULe@cQAe|ln$IYXd_ z&(^8H!k<78drJqNc>ibOgz%IgcgmWr8>H#wKmP_Zh5Cpd{tZ=NG?31JN<}ve^VTDb zTgYeYD=W2W`XU43tC3q0;fwc`^_8-o^e-(v(N%^~Wu^9K84F3#ffP0<)Spfq{!X46 zj7We0m$gq!yrbcD%eFtLm3p{W3&Fzu%SpJ~15 z#}KbuB19wl8d67fLYq#bq@3ftLj$phk<;{R$$&MnmHx}p0&FU%vzT(`805wI z0#hj!I_idySZk3_d)&FDIkLe6e%>6hEpx%{6ZWvpkL_C3*V(R-?7Ii`o8{LM7~%#SekbObUjypS8rh-u5ytBH1q;$CSN{ z^jl(7om<&-@yaF~2)UTy67Wi_sbeopzT6X_Tj@_9@BS>|F0o`iMmT97QUhR>-m@}X zCFbBU!Jhi~4P@~Mn?1VA9&#|Lxwe1z3B=zs3B=!zC|@-f_i>&VBx7~c@W->V!7a@L z8{*I`^4c&*;meD1m$eo~LuBUHb-jT54QVN_a9v3ntLL~;K@$`v8pCTofF$}TT4x`Q z+C&N2=xIzo^CMIvDgU4UFZw^H5RJ*nBdJwjXaE)t)=WR)&VjBb)D_MZR!o>Q8cx|k zBFV|dN(M{Qr)7$bURhaR`Cq{6ac$*)L3Xu@%%AqSL{GasxY6e~NT2^)@b>O=&h6dj zmZ3|yvJc+8aAx&4B*NJ+7o!wCt55#0j_MN|^9S3=BF6;WH!WEU&smagyA;8kyywo6OnJ8IpjEMQXE}ISl9pQ=~0GW)8X{LTAX& z@vMsc8$0D*YLLbsO>+k84Mh>;xj1Yb)vtDNkua&YBn87w(BlcO%ZJRH#EJOu24NhG zF1ldNsFFY$=FEyhYMro?@7Pn;fk4vx>#vUb{1{q5w1PHA56gt>+<3j^BI!YXE*1PLb%N+9M-+f{y?%N%DU*+>F#@OhhcjD$5~?AzYZfB(cA zX&rnXJBvDBO?<-{*qyuk>!zkU3e z$z=Yf*XLDyZ-NCgNF{$@VgqRwR|!!D=DqwiV*5MA_GYx0*xrop7u%Z=R7|h6$EYzx ze?n|~m(j2?JlWMbH6{$=(a>adC2Jy?d;SV)r17ZK7>_~ag)_tR3cMcbOBRiN{#Fme zB`5r?+~t2tx^kBfBwfYK^iGuPymKOJTdsMcT;`t=%r)ipK-QDX*x33;_?5g#e?A?*{^Sc`Dp3o$P4fjjotVkJ ze#7tGg$J`l_5M7s9*01X?qqCvn|7Z_>k6|4S~8Uw8Ap@qxe_5IPP1|}OJ}X#m$5TJ zhg8?rh5A{oic@-bzz!R!3U$m;^*H=!|mHpR)btmC^ zCZ}$1X6)I53hakBOnr4q=-}l{Mugc2e7t+fYb@AT;7K<$qx-aF_N86!OHIi(Udrm? z>B&m_L;e)+Pqsh65F$Sc7%Gf>^Vywf9LZ)C+<+(7d4x0ei_SMDpWKqxr+IaU0b~4+ z8L+#jpA4t&%nts#@(H_gb4O^#fO*<8-D*2%*M2iJtrhWnPB&FG@FwNFhI{R7B4Lu3 zj)l{@HQg%rMe&u3Zu8O?B;6+C%re}QChZ!jxdP8_D>p92a`)=#t>N00;aatF`{C+z z7w>4AP)vlawW9Isi`6P`pFJ*2%Y*B~q?S+j!1A@4o(J<;YW97e#?gwvP6#*MA;`mX z`tq9ia2&SNoc-LXs34ErM7F2`m;E0p0^b-*bsIFBCy)Yrsn9>nAL1bCD8ZNMnu8WT z*3|66?6Yi|r88E}qVp!c`n1wX`2D9|oM4LS?^fZvPrbWqcqlON@JbnRn1v=iow^W> z`KpKJ=q$CvU9@NpclLk74enIxSr!-Z=pS5f_WRvCTs3K*tm5%p^&+L9@WKpy9A5G? zlKv!;so(-1)l}v*!qy~0wf~`zWLJG$e)^e;o|RtMNP+1p6Is*5-|Y)a%)sp_5G=Z3 z5?oNDbGT*TT{!dM=?OWt6-WuBlMJIMR?fvW&@vNo%@uizHt-M!pB8gE4~cl(l#ljf z{hBriz(cVxjOLj?J?$a&%-Lyk-Q-lO*_=-t8tF5unGCxif+New;i_E`>~c1>T}iXe zTg)za6>P>t#d4<3?i0w1$1rv9s8T*mkq^L^&%L{sp^H~Fk$v#Y)_ z@}IY5$__DW>!cOpRKe8Rn%Z-vTWqzFVFiT8$a#ClGOJ|ENYD)w)LF_lx_N4zdfvS; zYu9n*j2?g7NT6MWfNt7FN0m`u2l(d>^m9Z<-@c_d4?AvpFSvO7)g4ESu9-$M`r1zL z=8_Ja(6JAIpya6$>Olm|7^dAh#jD7Gu9i2TS z67=+cdqnPW4&Bqx`$y#A#!e3i*3EeXVwYh%P5hMqU|{C#=kMva9UwbjIwneQ=z4IR^}KEDdlGug~j-QUYYgGj_QA~*LSOIdY`Y?Tx&(&Q2B@*Enc(ZO5BGRfU`Sy zrdK)n*mIDfTMjhQkb^=hZvc>iiA{S&{tu?2ec?KJ7_karM= zIecsc5sD1)X8=vpItAjVL$ke&jfsE*Pu_}wmxWIdSQGGJSHKKLs7P`w+7)*tJiGcS%+Bi4 zj}7oW{ZcUx=q{oS7PNHi=%%+1dhB)k_1N35mYkXGyDXJ1)BxQ)PG!Lxq2BvQ_Z>zH zhjW&Pba5enhzHukAWif=F{0a~D>8-$mFEmM@k^U&3Bwe5=^oi3JwUgQcvrv^)Bl!! z`D5$1+UyLCiaVIHUd(cFj2-uW=dLX8}~Q-K;I?akQ>H#*W&# zI&W5|U5|J`B|R2)t9D;Qye(SF_xYc;#B8{|2zuyzSvl33YWV3s41%bV>BIzn8dlU7 z%VD0X572wQjMNQtQ{ENiOQPcQNR{)5rP59PDS8eKf|Fav;%Q-FH8_~%YBEZY>NGin z)-}t;hd@{U7++X%PCMh?D}=>GT*kQm!Y_lc2q;QJ zz;`v;dqbJ#ib|IcTxPg_nDV|;%PWtgpR+#^l{a0%TF!cMg2%5M$G^BH4V&3ouk7Bm0EiT{yJJ%|i-if&s;J?1a zGdCVD8gorM|HNj)KXMPV;j!JjuX?Py$QLCT%V>@oL&Wr{z-X^p;;y;QsRowe@YfyFmbhmBI3A5(35PPPS{)bksedj7d#G!D{v$#ka#I zW5Mna@CANco~W;FUY}ILBR{zKPWv|OpkG2z`At5=C}TDtrt`z~$@;6 zsEa4~O+?$T?8Y!zETV0g+#k`VW(KDt9uIso;P(iUJ7CUbaLxmL&|VkBO$Mv-xu=+9++rqAy76SZMhb7pHO<$8wmpAgOwql&L+R zUdLx5?-Z$v@e7jtbdr7()FGHp^=#DXwyNC@f-je%cXXm&TlA|gK*>JNxL~(l>`y%E zxB!i%`e6vDO7pSHD~9?R!Ufy^Wk2S-zAGM$)#VLsgiE#nMcT)SPJh)+USnvWgJ z$Y@FQuVwMEwHC+!w#UA-795#snvAYIpPGLYZb34)X=`yleoD!H?;>6h_sRacsWBg~ z+_X69ByCfCaRO6S=Tkb5BV2J116)ko1qp>GFn7~6AELt>U5m@?D-zIE=3}0|oV8#d z4o+rV?0SIK%=;z_(i?-`%=+_bc82xOqo(X@7bMiHA+W_(dI&p343A#$&+Ch2D5NUR zr_zd9c=#Ic(RQ2t#fhZr&8LBpIeaL z{>jYUAn9>8c!ujX*ahZ}Pbv-mt)Eoh@;2Ki>=MWLdvsDs_VM?{e&v#XzwFDS&2ETBXYR@AoV3j`4SNUHP5q`zMv(@K?9`Ji#XOkHz+we=NJjLaC`s2tx*dWywAz;J5m!@HBE<(n+UzeuisxCrEc`3N^EltQ(U4#(!5boKirD>&V zFG9}xiI*m2Yc4{@IGC5FVk#~|WWq7MG_8sHi;(0A(9(2RX%Xc5aA#@!y53w8_Qeo4 z4HjKXp$=x%o=Z-v9f;@By+NHtP&c}9b9v-aYZ3J7M1ASTt7?l7&<_?aO+nXNgv5Sr zY3%#8xrnVCSf%|VLgXsXC1z#lygO<|w$k!_>ZK7ZLiFgW)BkabsoIN>bI$%BCprVi zBBbpl3h&EIOS5TAV)~5mWgAV#^tBpFXkt11Kdta+x+ug$Ix> z?Yxu0bhREpPitx!*Pvjxl^#HDX5=zFF?HsmR?_`4N}9sLTC}KZ3(cRdJC_vO^J9c2 zYd%PZj;$XjHCcNuIX-XOj;@=FkBq7D09rfOm%(f+J%F4XT?Q}9KY-F1yUQSUwH`q4 zc6!U8ceNfs4@>w*wuT+|HLL|#WVdz8bir17pa*6*w+wDm=K<6co3~{sOjLb&e91E{O? zXwkCxQxzW|5}x722#=aAOT(}C0ErWL7yEdJYFQF~y$47zER(T5%aZWxJw(F9VlFiY zOr-~qn;WYp1bP`7lXVv)CG%%VYtcOv;c7oX&hEL~akNGAeJK+4YsU2OjUk> zm~Ec59)75Ew)R|d>iBV4o5`=W0D9Y$#XF)X*oq4fS#DSqe%4t4^^b^|VG&McORGp3fM;#FOMko5jX=BKT=01;&n-Z5T~M{g7LWb#~u>SgA|F{<)&Q5sM2;z&)6 zxo9C#rrhF~y-IVDOFZ@R=u_1mCZL%2gJjZ`=Ms}AwHIfS6rYRGKA*ifQd?y%VtgWC zxTxnk6n_}ue(wz)i|=-$ zMZ>Vb07304&Lx7m`i_s~Hx>;{1AbR$F6uqJ=KkB_43Xk<5iW6ridM4pTy%D)xx8+e zsydfYXNW@`{ndt7achaGH(B!mGWBtEK1%4o`f-By;dp@bk@@V#vK>rSe1M3ki)9Je zN)I5X##k1&sj~p;qdUCGdi~?$LQ=DEEI|4{Bbu(g06Epl`Z$St40!z!p3XqA0O9|L zWUBI9V)%3hX4#^%xOZl##kSOYrsAbNjD~R+p~VX-W>A?`dv0HJ z1xoA>Q}Zj&B{qnLeY|ZMy=f-xa2O5-&AY|BHly-fVp#dC>KDDTXh0a)I9+!xDgBAt zvqk0X=lykCWiDd%y>MmN)^B)YHo*rzt`}q)$lQZqF3}sk9bAw~2S$vpF&8byfLF<( zWvVfbkH?FKNCN*<)wzU*{ph@N(TQ5Tn7-(sgG##IToSVu-XX~?&a-<_%q1*pVfY#> z91QSChs?aC$lilsKG8w*@*2V?biMP*C3|c>?=%z5+y?yCi*I}8oQ&}%OH!U)|6!6= zfBXo&bmfPM8TR~W|EB6cOp@aBqvTR`=aM>zdr{bn`CRpAXkSBEZnoTyV=n1evEfSf z?i|WsIij;_KS1tn4+|>Zt7yGz4mvdMmnJzI!-Hh;OnA%m^#^E9RbPnUf6z%1OjVyt zP+#$6M1fLZ)n;!GF>8ZMrR5h_yANTS+l)8yaM;118b+%R)h)^HIY{OcAH+8ueA{92 z?0;GE^U%y~fI4R7LCKONCo0Y-f*}Tj`PLDx4-e1rB|e%A%Tk?}w>QA(%@P*7FFrX z+o%PV+o2X&ZZ=u+Gx5xA0?ie5&Q-JC#N~+JhhZ*RH3h9q{s7DG!>|C^ltH-of~+W} zDlb5cp&=rcKRkz~F)TnzQj`?!@jv0FSX{PAKu}+x8o(TdzI!Q z@A3{+)LIg|Uu!OUIon$jxvMi5HD0m2ZYE3O_A1Rq4v%6=q?UQJ@KTQPrmH_h&@Kdv zKaiwI`4tx?V%{8FaEeS&GPUQD>-cfL?!CdqDc*x%F3}%-uMi!as`@aYWuGfFRBXM6 zNh}qBWALj=bCJ_&9@!n+;)9Z|HR!O^A+khN+5kiKL$xT)Y$MdUHv5ak1PAE>2^j;#?w=&kHV2WwPd6GC%w- zA%mXxgUFz5ThpKCTf%1 z4c;XDC*B$i@#fzj`;{xcL3kWhs{H#lsl4Lf?s?^ae}CSu{KmhXr1FJ-hyBX0{Ck;H zesymJCWm+{aP_bk<)XtZo(zl*5#-ayw-bgH^L2++^)Z5|(u&XVgnUo-TQ=AYZ{+i{ zOVRqEiBF$Z<54fk>Mxpk2)^5oFDDKSbYs~B zh-l8t4)!12(EzPKL(It4u8#ECN#qL^D$#sj2F;Q05x`$6#E0Ob*EdkbG{GkhGSwz} zp5gaerYrb;;%CUPHLf?&c8jQ){TlHTK|*4+iN_ps$)iV*1#le{?UxWbGGYykSWiYQ z!*3vS897ffA|Qu&l=2Ww92{1@W*AEHq~C3JdYPTfF@Q`?rL~jmE|T635RPj)uL^w6 zHBQi%xPQlwRh@S`{j(S!W!_o&%h#*u?t2cO8^Icv*)=U+`4gW;P%@HKR-arq&sXB% z%J@lVJ&A@Gr{+!PvWc(tuA`xY@DgKO zR&+MH#Mfq!KDhhZtQ?+zJ+Tu+6$hjk&o6A;Bj~xV%TZOd?5<{p{bnzNxrZ)~6N%vI zC6x&9FuChuSi9XyW`x)-u-~NhwcEXtx#*1fBDcv%;yyl$W+3vvl3_RtK3uY*|DScG zZ`-&Jf7A!JDw+NO+S*jSjn1w*$y@MT&DDyGyUTwWf4M*NdU$^xhj9`mb!(f>>)NO-#0t2`0$k^A(RC!7@ZRV6=YQ9Q0O^$?yXC>?&qQl&*|{nyLW7z^UlU zetks;I-O%qjV>-w_7=K7zD=V56g3BI2{Z^L@T@X8{9w9riV1#bq78Rv)`uua?Xz5z z{T_AE$cY~M6mpY!rnVsnB)j-(6#}37clhS`EH>&~(25_chfjDFRUJ!JaODXUoV0G~xSD+B{YahdNL-*eZZpq7btHfayy+m&8) zyCS|smAi7T%E|}iFi%G3=h1L@F@k2;#eB|xhu0Lk5<=t+Tto-3KhzYtmC=yn=+WO< z$>i|iZm*&ek^4tnw8Y#|GkpK{O;4(ba%}i-eyz^J0dBhvoh{s<)S$6T`0TjXCC!Tq zC>nPEta*M#;qT*{1^omv+^axIXAm03kKJTCy_MuyvaZ3M#)%bjRbjP9sr(Kr1o-a0 z4k1!{8V>c!Cb|-n(5wNOXQ`akIJ;vKyj2ql^3fwJBO+{Sp|rw=>10;j*7u&XMc$lf z>!(wrz49kkzu`6QmDK8ITC>tTRG(ggN{Q4rr;JS!$!r}|oB$^F!-~(6oy_w%!Izq0 z0zu;Owb{%XXO@U8mh1t8>yG0$P|$_k;QR2}+DgsCT?d(&UqPz6bn-L)Vq6ibrOZ#yvT z_S;Q@`C^&8a^M~*!)6g$;1!X1APZkNyKMa^2#aLUb$=)G2$f#Gk-t!J_`k|8fpTa8 zvRMN`uqA*gR~2a3jr%f2L0HI1LD2abk;1=Jl}El>Pa#h@>TzLtlfC;dkItpL7$p&J8+1L$ovR@Y<+~O$c(F!)m zzkWxxIM^WXV9xDi{swaWe)q01>S1rA8Wo6eV^JN%V;?W!=(A1%zHk7|4N&#b0Cn~N z#|A8i9&D7WY_ONGx5=r2$h%8nK@gP40&?r`{Ch`fwVfeoX@bvTf<>O=J+4w%EmY^M zA6<7PhxqjGI)C57)WT7bLQDP7#5$+Iuz=y_;)5budN(jYOo{r#PFD|8v4N@2M0nG$ zmAK_OX_++as978o(LSAEnp{QF9?Nu_LnUuP0hsoh13ho*m}O^xB84>A6C48sxkzh^ zc@RNq2TMB$>**yW&dvr`s{9@s1t@VTtdZ{Bo>6tuc>@&5iPq;)EST~I$oW}x-W)+n zI2_Vlfpt@vus4}-7Ge3mQ=KdCK?2XnMq+EG;qEIF*|c`p+UHFd2S{P*9O9BsTc*NI%X0RMp^(V zVSwXStYw9&mI?i?W=fbR&ybQpDpU_bu3bnPel~c*JX?yCq^YLtCI=M>*a1T`bR*d6 zstY90(-3Zvt z?o}aB^vYx;zzq$ui`}cD0i|$!uIiSyiK>SVR3NK)>L5U$M;#@J!DhiGzcQm)Cr5f3 zD$)el^Ym=7OmXoNN<~RfO~>-b+ytLXl-6nZHtFceQDuALG5#<4Xq~q~Ov#6jNJ2EU%sNNa| zs@AuuR~ObT4pf_Nbc<Wd}I2fQJEGi-n}#ZQM`Spb2rJy$yLl+-a!q_*h_eQDh1;$*8yF`P?j+4_t#fe^ z4d7$y;J5U;umOIdwqBZp^2br5&dGgFf39N821E#;HeiA(@K>8~?cJG`79((OafBNH ztFC;3S_avseu3*p^*m~II1XcCgU3TdG-9e|9R=GUL+2jIZl^3THWVG#3nuL?0f$PL zh9!1gGXmH!jm{lJh8ntDKdJ<}v=GJw&r|jXc?`ZWGt|GMfxD8W2Wm z3nU*@DR6*{fRDjB9abZpQkgF*2ul2SjqyYzbi2pPK40;u@h*!6rp|}F$(EuST5q9EA zodiWy0=c6>_pTO?;Dr5s6pNDr+ND5#bYq?EXOJsh+-MO(o11JY!BIy|Ka~>8{$U3= z)GzYAi2e$wx)p9wi7?xA)52OSaeE}*M&QxEK;s|sQ(LMuLs6uEp-o|&QwXdMs-%hN zi%A=6Q&rq7-p+tJ1-l?U*Me}9okzl8q~;JB&vnV4$^nD{Ma*t02&h4E9e9e*EC_F> z-Pe}rFM;z{ZPay3u)$QuN5GLqF5uC*VyGn1Uy9z0L#mY5Z{C~VOdqN-FBF8oIMl%?I^T6`r0Ym@8zWQ9-x{e> zSW!`HO!pM9-%P1kVVg33xG*CFC$AvQZU$aoivZ2YVA_Q zY-+yF-RW;hSy*!3n7>QOSE-1PhYLQmzd87j{euFYw;6UzUTPZVvcrQ9b zy)7+ou`kXL$kWPgIXEZ~exWz>Wp0dGh@(=p3tY1Z>hac z9sSgNhGt8pb3rn-%s4oFxLH64^S@J-jYm2~MXN|R7GNCUvME84c5Ew##fSm=8ECvUskq01 z^%6>SA*rE}u0r;tKS7P76eoJrg1oR9MuSW;|JgSb)oWQ!(plYxsrgCKvI6o$G z3fx<%dXi(B6S!W#?fZ?F!6Blz{hGW?;n;!6tuVdAXM;I|;fz%S7)X|8o=Gj!_@`g2 z=~yZ%I*ryOd8HKNHM&&u8k&&XmKQ}60;Q#-re=YtRf(#1lRWKqQ+0YG^1bk?ejnj2_iZ6KNSm z2A~NV(H@Y3vh>%XKM8@SMB^X`Kx9ga>ec$Fz@2(@;j*A7>TY4r(}a&49Pp@3%nKZ( za=To&C%D}5au=yick2SFIT)7Nmdl}T4JtBI83!Tv(mDc5^_Q*^oGx>-qN*3^ONq3z zt3YjnP#e`{?w$cS#3)&J2fqb$247+_$HG#TXEB-(D-%Q@j!UUCLSk=BQK%EGsXz7r%D@w8r#6PRP~OEr-caEGp9IPm~-x!iW|YY zfA%Mg_Y+ux<;8Z!xfa3CTEMYM7NPz;A=S}m>k8fANPWhUU@yTLkhD-qjY`8KGv0_h zlOfy^I-@29qJlPJ$hy|n!{M)>#Xe9EFlRW*bh@3hL1&~)z(N(8E%MJrG^j1`aEpxo zeB<+qRIQdM3$L`xjD001wPJ*qj3h0@K#Iu9t5`gB!-Q~4Dw?BHw!Locbxr{T&`noA zrqg`PZL``2jT`t`H^;pc9CO?&zX$pVGh}DS=NR;#_yduCN*qK82`WAZgjE2Ig!oCJ zg0voi#XaSCReN>OAa$2oS7oVJbR-j|r`ewbv_%_6fziW%VE}rLFECqmP{by^y%!f4 zDwzz8J+|oL!hw>FQ&N+S>J6u;@?4EB931ed%Et!zZoo?#wWjAfSfsLMPj1Z6i$8_# z#h>`uZ7LRS(l>PBH3&Vu=q5eI&=NybE_$)7TKNJG@*3XcEY{dOFQLR87Gf%)hx7oU zzm0f+Kr9C%U!C;@H8Ky7-pSG!Z@}TyfrU2E{v>X)FCfH;@l1uZ`w77s%vNc$jOj zY3ds$A5)U~B}1KKLfDkoec3Xw!mo8*UPKKBt=RxH${PU7BSdDw?|O zx!cImaP{_eJeZbT*|X=1+y_avfzh-}<7C~$>0%G^nR1Uatzf==A;DP03T}fNGO-ja>P{Y_> znvI=Qi9YLXo>bC`Tm&K9Vwa!}l{+e=n-X9u&o1BFY?!D=rLDqk^j9aChCq&xq9;LZ z&v?t2X3)~P@!U=Qe2C$^bZ|gF>!qj-cyG~{=lVBi&85i@0Q+r4sX!O?bGN@HbKU-$ zkes)`DB>yjrEVUbF_&G%&yZ98viqm%IqmPuo)rU#FCiOU6mCn38kLX-`IkL2ENmps z@f9AG<=8KoW%jG8$~eGHcib+T)nV`MBtJ^y8n1x zH-W&I8EOwkFK?VonQ8O_R}j>uOioAJO&lE=GZhSJH@lP_Su5Jj>rPj(q>zU&ya*4i zx0C*G?7^(VlU6MqfQGwede@mCye@FUwnGDPEn}XF(kU=t@dek|e<2wz9#w@qw--+J z(UNF;AjY5#@3ppOHmRf(><*(O3Cp$aUVtHKN7w*shuj{fQrlA+^n1NfFwR{tq%S(% zGjLXJZRj?E3+<~R=$Z&4Iz*6ySaq91GPsGOyTJ`+JHAe|pEW2FMI2vs;axx>U8_K? z$z*X-`03=UKc8v!ywC|~CRo>w2Zm|+0-Ez89(2CImDubaAedPiE-^4|Z%*ye8hPR7 z6dUEj^$Nm!Z@Vt6^I^=07l*5Pa7 zpWint@0fvuaP#WTI75{>YEjAasBvG9{?3-1PJEo2S=vv&jOCl}XeY?vh zpE`D%&7-A`vYFu}#A=Dy12y23)Q%@3++pn-8KFaJ-|mOG$)IOJ?~Vy6e@1~*p@aXK z=u66$0|V~(k%`E2p;@Lq(doo$FM#a@BxC;>I!%DOyRTax4OBvG(p@k>o`FvLuZ`I9$hs37h(7dv=L6u0a>oNP zz4krru)*++j+aoPWwftl2|@LcB_mn+A{AgK-E2M_DXZF;PPmS*F=$!rTa7`7o;%x+ zvBOD+UEXLxGh3T94N?NASGopg6+yL`2^tV$!WtB8O7s+OOu#ekV@in+b9Rib47+$F z&~YH068mPy%nq3yGk*W-789P<{po>dyfp+1AYkplB7k3=I>=Lt{^{U=Te?5(M3Jb6 zU%k=T;33+dUP6ickY7D6hg^jI^b+>yg#8s)`D_otfImH$HxhnzJ*Fe-PX{uL;y2hO zCbSq+>1<&_eJ{lF|b)TkI^oB*puh%oZIP0ux0<}qfM7h9CVF3<^i(7Zlt87@PWbUm2SNw9p? z9%PGt(*p+ycEq2EiYW8e3yW$Oi4^YIO#~Qo(3C5;cF#}R-KL6PAJZ$z5C|1RSm0^5 zfEQ}sm3gg$2}-NeI6iO?G)p%$dGtE5q^$|vOIYhXF;@t8)zV)ul>16|mK75R)=n+c zPG^Ng6(}$=4StoTMAqTJfYYoSda!gwDS=R7*WpPa%|%o-d%>_~OxrHZAl0`rrG}?g z24v^#eSxhl5VONjMHn}GWBQ;nI^EmMQ{|qtd z`Y@;-_|u0NeVC0rk2DL4RD0cX27sbX2X>lCC4I<3(1!IGVf%q%s4Mq>$W#}8VB)AXX!>kteM{E#+vO#?oYc&0+V?h*)mQjISKSK zbnsAtem5rbKjDQoQFz|Zw8Ya$#uWC>}2Z zxKZN#vkmb1NBf@{6DO0pz3xC-^K9~LRr3wkIHSmqgFssZtG+m5#H`GqBR@k%B%l!c zsorLUdYf75z}s&*tt^!@(I^IvtBgs3&=U5x@8K!XXkzin!n#eVq8#?RS`$LiHTuvk z;DXe(&Nmr7yS0}gQzs_U-EfOK$8)|>hZxPM^NdjzGQ)?P}c6~K9kfv$}Y$&V!3#*<<2J=uYH%eUqREv#L69n}N%ZnD>Htq&V|4Q4GZD%xb zHFZW4AuhgBv>=K_?{SFbK>y|~h^_u;GBRc3pp1s*Gqv)DhrhB#9g_ct7VD!oX zVw24wHLv1!J(y=cU4BC&!K*52r7bdyO{EDA1v}R%Tc38FN{Xr+Zc|N~ea0rc;9RGY z<@{ojX$64yn!B+x#5ky)+lKQhHunj)RAH`vJ~Ots&A}trQ$apDd9pMcfYMB!(9&BB z0yCHoY%M)p{Mm$L%M$i4fKd07xRM{S z#!Rx*(dj}Kr3EZ+3lp3tdV}Y4xJm6?)7(8F!JbId5z_T<6>?vOx6f@zKX=-IVdm{* zKCv&i_{ad-6}rWVJ6uVh=wyKr3AhC)Z7VT2!@m+}5|r1c%nO2D>By@3p}nAGQGM2_ zTM&~(B5Lf6p|}q)O%+QR*)O0rA$fq<9VpjHK2M_*r*~@R1YA41Lv6|<3SUfUf8WB* z!7h4yQnJ#PrK(p`&(a*3sY5ZcPH}_!4ErO~ed2aR&JO?1} z*>ruFy30A*Ikh}TJLL$%^AtFa)gL8FfhaN0(JuA4{tNp8VV`db2qLS=%A!nDj(GCh zaJ0nuFG3odY}){;K`zmegWNYpUKzrIr>0;Hn-u!Ak>bS~vB-q8ecSFnoU`4gX;0jk z*X_M?Z%_uLc(BE@IzrJOEhX9x}{rB~A=&@+Nx0!OqHLAebuS%~;GMm1c}i zo?-E(j+WaJ@3&m*`xXco4e4}zX}2Jl*w+T2bL-j*uqJ97p%ield>u81BfPWdwy}6n z0O)XMX>{$J>3N1~yhPLwd}sCq8zc78t(*mJ)vp~K(3^GLRx(=PeWdFS;@7~OF{4wk z%$OVX_z8cGa4n=)1F#Y)Ubh9H)+f3BB*Ca^$Bei&=Gq&Y+*}K&E7NPCV6`ZRbho}_ zd3W81r?S`Gb2VZi&(N;1=Mv(1y3wzDR^bIw7Vq`wV5fj%_tMjl8$8Fn_7Y0;s~C5? z)b9+R@DI-+Zk7o98r741RQ*2<{&R< z^$b9-1Ku{#+8_QZfHT{3@N#03$F4NOSt*LSHN`iAwro< zvtC7f7VHM!u9}$AJS8-l$L-Gfl{eid@_P4VF(L<5C$m%c+9^#?mqt(1Ck)tyRk?N| zc(bLq3aK3ft=3oYbVse!HbEAoSJCYO4@3U_KmQH1UI3MF(vP4*!Yikp3S6Lj4i4zt z?YUqJ(<<{0LBOao0Q%V0K;{&8%PXJS@i{@YTe2;e=0Y7@eajjK)AgR4#TS!IPfZ?! zQ%5kEwr6)y0zFT(SANsYNvx1soVafE+`%qS=6Y>o0*1Wu(9`A(hrg#Eya;Ha0?=xe zdxoBQv_QnfZDg3`HZp|l@?T(dYR~yBd3xA$x|Usa9xTfY7_ zn!-A5u@|K4EIeU07la9R1Fz}09lY0))UdiqkA12P2R8R!VG|}GO3v-sTnRVI6x0JV zq}apjQPvhmAQ-Hf6fiis=h;bh4$grccGTCZ*e#+I{1~D6O||>XQ&YT(dy)btoSE86 z$NK9Rx5lq@0&G}}k$ahfWJTAE8N!Hk-0DbO!=wsCs&_??_B4|2yQ~03i`;bVF%}V~ zF^tq{Ig{dT`Zog8Z)Q%;`Z!6e6U-YF(`g=ZPHLAi>C3QF+!aZqwNuU&ur7^YOLaxp znDS#-mEh`n-J>Qz#;ikpuisOr`6jQ2ZJG|F$a7gHXcvk`DOF4@^g#n*DO!+N`o@?O zrn-4*iaTM!ccae!18!TU+YIGRV zqto4>Y})Cfv!=$y&S_o19~7BaiCUO6EuUl<`a(Hl{R%@o`C^%DRj-;^P_c&RHbL9H z4eISUK?%ciHL>2{=4sT@>L_6F9vW>D9gD)SVaR&<6Fm?3035Op@!%bf)YG$4jfCvk zr^dME><-kXPs0?^gUq#jBFD8YU>FIqRjmIJZmXNS0NZ|}{cOLo(m5sZV&2RD)EiidltR_OdG&Zn#U5|`ou zE@!*`Z5LC`R9TL4u&vaOhm1}EG+k1>f{evA$rBoowy(+Z5h>I#1t)HwabbgXfsknv zsmd)ClaweJNJo!`4NNxmFcQn?6)|roQLi6!_bGKlUOeoX+vOB>0JvbTWlX{59=6WL z1UK|Mc*kz9i=J6ZedBHoiTFuc(PN=R% zyz15|hl2BuW$ZlPw$oK78-v{|X?)CK3Z=QAuUO2vsinnn6)5%olkQSNrfr*6Ok8g` z0g+39qEfMa{mpmjb5eQaASNJ8#437 z?{H%`#{mt?-c8MHmIEGT_TG80( z5$BEFrj&Ve8?YAm%?*b{e55{TXY8I=%BqPn@5}UVyotRBf!4PEjh$h|s!c?cs&xyn zE?~Wnqw}+OYZVYr?lwb zMnK60H*+=yj=_I61deat#%_%GTF-0uNJD|wbz>if*v9IjJ)eSw*qV?*^{h|KTdGP& zmFfF>tzW%Gs1L6$#roY_g6znJXQe^j6$;&68aBm`j;qM_k{Oq~(Q; zdJ9aK)&ktS{$#k1AsRXjEVgOataBC$&ejD)~iZc zd+lusHyELX^CWvPv`M!wkDZjPF{l(D^XuL7SP_TNoIdsl=vj*Ofoxa;R{&_2d4Y#h0_xyblfZ6_`I;m$IgDc&Cul$$ zBujqaO?2s9$PmRCcQoA-!{}~oUP>)-43DIwyg2pRTXaKu!(->~MSETk^^>b(9_Gdt z;;RF(xttyFDD1UW^SmaC4Vh8;3c|ylP3?qWlo3kXr#^X42IUPbPg%Xzah22?vHs0% zTdW_^Lr4zYl>BbJ3EvQTlmr!r1tnGFn?5GV#26KMY{SGih#KxCZTR_A!{pu-O$*^M zi1D{)7@{Lagm7b10HYH_swiYSGf_ZmA7*lIc#FslI~)o|C?@52>-I2H*iC z03E)`k?gne{)p;`#D@3V=8dgQo;SV`lMqvyEz-ZK3-ILLc{_dCuy4_l2!ayzQ*UxP zK*9QP9wKIfzMH5EjE3&HW}dq6*uxyNNQIGovMl7SH+3wsrhc^48Bai?oEa^#1%glp z60p)~ArCj-0F*Nrkpr-j<*%ul#=Mb9$c{Vr2TVwA75>*l6L9POHAJt?2f}Tl4BzvA{saK0dEQT;uriIyy%xzM)~p6Op^ z$G{V0#3&>?f6M$W_xsz|$MR#~#dc$s+2sZ6i|nZ|(GQKWN-Ga424!r#Hy<(?G+X-S zQNYNDK|1^!1C7{kwJ+M@BO(0Eh79HwBS)C0O&{I}C8z|x%u{!QHo6;i2PSx%8i5vx z))r-YXbCHwS>Wr=0-BI)#tksR`V|x??U38&ht|BIwzt~`c_@e#4I&!bgl%lM^w^8- z#<(-z#CG#MldzdiWj^M3hy)$mUFL|ffQ|JQhS}?WG~fq*=r`&4q2EFe(?-t^!KP-B zmJt~fL;-07k(c0TR~Qgdap*waR2g`&-)xMI{f7L>PpreI^3%qCvk9r#Z}P~G{buy? zp?B!ZYZ$mXWDkK$6btXrmu4QGI8|@QQtB`}0NdDaN`l0GqfLj#x{x6@03+vc-%`17 z%hVc!R@V#eCI&AUoILS^!3DMvcw(rK)p`K1G2;VbBv-qpE}d;3qmG+>d_9D_m)=*Q%`!xvp)krCX;mim`rxT zQ)N7OI#e*uo!A>}*+sz040UJ7mYTEjz7j!YaTI7B38?gMnGfzCst^>IQP3p=18^e; zz}%&wnvn;?rlaO58V^E$33k-nXQ_Zg}1dEbvAFYetK>LlmgkfCFou@)2#S6A6@c^YVg z$sl6RK1q`bMcV#@o^e8iye2&GqJ60@yl7v^b<%bOk<+Q+*upyy@MUbTd0q;M< z*tLEE#@O2E))Ec!l&4aG%62X>;*7aAD51qug4J-yl!{HuAST64a5_W zF~L<7o`p?I+xyc#p^QGG&Tmp}NLg0Qg6FjO3Nc+NxGmQ2yX2MQc3D`ktW zsw21P7r4O~I=D!`B4BePt4Oy4!+q7BZIkg%M=!hw?@7JwJ$VoK$X!}x2i&DqKu0|P z;>sAhwU-g&l0LB}(|(*dFXJE)1609;A4?F3vh^{e@sg2xHM**{USpF z--H+$*@R3L=q4M*P6AJUIA^b)GPj*p9YX*CL2Pf0gF-K7Y~CpwM* zs+Q5~?0wfuL#n8J<_i}?nlw-NTqG_hv6gx;(qvc%HeJ?86z7lJl7K`gB77JOJXZj% zVB}c+!8LVclB5MvirxBt^SW+2|ud;t7H)XD+b?x;d!o{HnUeP=&ffTt9(J zvnv#?64ttn=d=7?K+2;`wTLvuV6kHWr9H}AKp3`Q_$a6?gBg{+X$VE zARf-q!S*3FK2UoaL=%$~$NPZyA3>&VPWQHWJSz!S8dM3pOqSJP_q_?BI%p>Z*P>D1 zP6%NizL#k>INWX{-^#mgnT0hcMB0^j=|)P5k$)LUB5|Uw2&p7fOtr;~Zb%n4Y1__m zDI#n{ooM|y2MsILRp9l&p%>>Mpl_8*0z)69;bmU%8GccZFOB()kz;`Rru~-VgQb!_fbkf$Nr{*xjqb)aO~{~_%2Z5!w@%TKuD%G;`x%Sy+)Vk zRxpXW=D4WH6RTrq1{b&!OdMR~0TvEc2hoNaEuL%(i~~U}pG-Ptk*Or}WG(G^R5Bnp zR08VH{oB|PON^>{kw%|jZ&Qe-m3 zk<4dVufDW{J7r_;g**b5y|Z5MXeOJz^q7})1W+EzkjKgPd_6bech4qC z{3MzhTdN&xl5A0^W*FsLV(c0UYT4J=+$J>SEyv?Qrw{jp=Chh}OfpK6*LQ(KA9kG_~!s*4O>Joc=#kUs0gOQfZk&id_N{Taj43E13-O8% zOj)CaA%t%o1hqN}O&-+*^K4{TnfC?X;=4_{ql`9yHDb5}Rd*t9E zk5S*+*f73IJF*ZTP8+>2s}Wy8r1MMdp5?U>f|{#*VtM4f2*FnR--ID!($71n6u35} zpGCS=VIEF1V+hG1}^3+z#hC7xp3Mv7uZ9# zvf7)e$R3WF+X->z3;4#&u3(!ywZV1;`T<5B$O@hs+u+gj$V=FyXGr@^%=t^1NBSe| zi`{iFilYC`6mIU``XxkIRf!3|4`qhNVEUsd?D6E+R`{Ci+sTr&;AfqBafti$SfxI6 z!X1iDb_%Z`5@A)6Vp<254mZ>Otev-&u>jX*3Epo|C3qNpEx=Zlt>c+l*p)2Uyp(EEfi?*jr^~cKsFR?-&{~BPK+rV`orw- zo$|ID-bq(RK0xxy`K39*-g-KAk3K>~Cdr(V(0005M%K6rc$@rfVnSnpkL~ke&R9E# zxWEz88+EQ#Bc})1x3?yAj+4=Z&hdBZn4WD9uPQWu7?#rF8+=cQZmRm?Aq} zXX)FAh5S5Y^6wdMl4MS75oYC?iq_MHik>aXS;~~D;B~$gfU)t*v5K!dOEnMMSR z7O`LBqtW-yOd@(WkYj9{64dq$Us=#L9}mJ1O(}@Jv6}aIu+X54sSIU!LByrl#8n(H z2z4d#KmrGJ9eytAh;G!T`JmDkV4(u2S;e z*9~qzSho?k2GmAO)O~hWncjJezy{+gZ@h#}Zj5fyF}%_PB4l@e-;u zpKs6^!g|@5{UZ$F|7Q;JVk~pScI+tIXYF3vSJb$9?8mK%58lwA9Ick|(4&2>Kt}&(|n70wWGohGSpg;Y@jYom{@z%jbdZ14{ zu5Qr#c(g3>ku-z(c5-`H$7EvbpqmKfgc>LX?rF82hRJpE?t?!yg7Gu-xpu|s# zj;+s{M#Pw3m6E|M(S!I;*Xja?ZtUP9H$G!)TgeklV|&kCzR~titukp5kM(aZxMS;R zk>{bt_U4Ct`)zEV)sR=3#_mQu=JVKIR0#Q5>wkJY+u&Yc>?Le+S|Gt#L?NFI9?Pk- zbTDMh^4R(;L|8BxeJ+HmKA5Zw2sDBo|sGXUSUywhJg zh48<316!cT+&Q>NOYpsYK%9@8+}Rhz8Km{zV|t0k!JU_|N#TF*v2Bmif9EAsDgE!= zHUk23=k^%_$zj--@5H}X>py2OCfOf`MT9Y4Uwjx7{twS}#DnKAJ`BwE8)yY|!+rvd zfn$H@oi6Z#QC}Pcv*HULUo_A0a9#NW_pMGkt)zX_m-kY|^MYD`SXU44b9}K7KfL?J z<1cmU9}31>=0s>uP`R*tu_vhXR6wU$ku6Y6zWB`M9Q{Kl02c)C50BG(oU&iMgevFE zms|Bcjy!_|zufi=RLy+`s`RBw-<5ju;it!c`Rn74f6qPs_+)4I8Foh zKYquNY=MW}_-_v$=1u&E-+TNm*KpM<9@~5spi~MU%O7Txwt02F#C0Q&ui^3EDzE+G zfh+l!_xef=`Q5-t9A0B!`OQ4bZ|1SC;9rKmZWgeb;9p|cED$qX-Xwz$8}Z*7D{tlV zOxltf(0c;N-Tm#NCo3IH-Z+XVXf zSAK8H?`{6ZTe&P$%!4iXE;Cq*f6+O-R4Ex-Tj*V|#fz=@7ac-G`X*~^)zLcKB@!Ct zGPoU-Yf`1mkM`g#EwC8>l2o-(W|gWWRU4#RWv}rW6fgoW14tL@0W<2VKXpFHRLtiK zsE9x49R4NxBEE_w|8j@`08J4*kbgl7@9)ZQ%0jq7Qur5TLd*eFz#jp&fH2%7H^R+E zAQ=sC6VFK!E&d2lW&U=RHMSchjz8cH{zc#Ly&qjv+k-!((kMt0wF7=j3ZLz2G(;rv2fe|+lEF#a zXp|(S)DRq-rPFU8M>Wih5BO7)vBV#=veqc0QVp|Lmq24{watbq9>c4TxW@QKT&4kDx9qpj_1yibUEdv8(t~)~OppYJ; zS`})S|6&~RZ(TB~(!33!RpWH3)wVFf@h^nGhNiMqt;%-QIKs6W1s(rVu<)-mwMa3k z)ycD3Jv0p{sRnS0qX8^fB`5K(G=}pEI4L~9Lypup1gJ|h>Y~zW^-Z?6QRL9!PhEFz zQ*alFu3qGjpfd5*%hZkd!&>#S^sycWy4IFzkx;2pgVm~>i};sZsB<#l-)&vGETy-E zHPx*Rm0AdyTBlmYziOa}s8JL~LwpEqn9_Svx-5BUo5I1#Q>&JhNED?j^=(yTdruW9 z3Yi)goLa5aIDMj5;mbp=!e>~8Z>AS+uI%l@%Gd9^7r5}k+XE}VovcRLugpktgIurD zKKu}!?shI#d)YyRN8@@cyS~htphA$?qmlVYcihYirp-WY<+} z4yt&&Z#Bv0p8V@W{&Bha_{-_fPde*}{7F^^*=N1=KAu{~uO0mhHw4#KGx^L~vYx~W z)oNig3qZVY)#fl-&1Tn!-OhQm`Z&mDr8%k%(Rvpj4Ncn8klu%A{an)z6SUy85`9Qc zcTG3G+df}huSPj^SM|G>Yv$tIFxSnsDw&MJe%FuUi#gXb36C)QI?U!0Rd!IRWJd7Y;)69&OBMeqpUrhEU@(}`tK@UdifwQ2X>+#+=6waD zVM~~u4rBd8_^r*KMJZ(ODWO#XT`Zf4&*%@iB^wtWw-dZu6&3;!Mc+w}LnkG>AL7$=)-RP(DJXA({?kfntGH2AEleeE77JxItiXn? z4kuc_R>{_&`?_H*v>r}dxy*WdrPn*9sL`g$GD zd#a|$a8@!lJF|P^4A_fnJ-yCkdL3hW-OZj}*Xil?Vq$t--#fh|XNl=$C(?cMVUQjf z3gL&rDVVC~+hDQzHe>#@Wd5kxGcfsj9;D|?QfW=jmq7(QL1UtIxl)Qr{bcp8ADWLZ zpe!ie*|jH^ot&AgP(z}e>=ezlb2qs&Gf|tER&k|g)IjrTyxUx>D5)J*;BOm72wz+6 z=_%2~L}_B8}M7=u;;RX-_84<2_ zAE7*JVSb_6mEqH;n@HN;_||>2S#|E5xOe)krMeX4H@3fhyRjPL zM$h=EelFD8&FS85v$q@2C1~z{NpIV;xKV(5UMmC-@dMmx&*0AXqr!F(pOf1rf55At zv`x0OEVJ5*S(~L&ag*G_N5?ks-#tt+tXjQ!T#+iddqhN(_1fyqFTWJ9)`-pp^r(;z zxEN4;%8sE<@G?eGo_)`LpO~P&s)U9_?xcpy?A|%W*fNT-E{d@Z#dtie7>`{AJFye3 zKRA`O-X5$~l682RlNevj{`M_{YYa?5Eb|aA96ZZBd6L;NiOo^cewM8B&sydmlAf%$ z<6+WkUPq4}x!>z}gD)DtzF0+>>`#@-I86Dq%xPvvXqgm8oqmpIsEgwK zX&caoN0zi)Nyhn~w;kL@vlV2#D!0O{pyl4J|J!J$x&WF+4-V z3@?Q&@IW@w15JngB(%!|RkOVW(=$o>PSfzqN#)7ER-vT7KuNE!Jw9FA$v)}iPLRAq zBk%O@KR?O6mqH((e0=h3_1RA!pJYG$>*KSJ!_&WKS3f?(Z~l6Qa=)HbKJe9ZeqxkY zlr#7OYi0%ieH>(Rd|nojWT&}*vJ^h~lYzU6Coh?gAMp>qg^A*)kV!mAkgWcClFj|W zf`4;q|3uoSL!|u`Wf2*k!TsnAZcyN%BwOzflsRGk?wIwZC~K;pI02U5te}4BIyzaxl~Ka8@sszocg2*$)QDCP z3YOsI3Yxh6Yh&g|;`bX=deJRX?UY=XMO5nN2H*SFN+!A3tDK4vTSbD>f^CE`sVfn; z65UF79cDDdI`>n82CNV9^}}QpBa+oCH>}-)(g&@|`xAHW3qnIzKcAyr zP@x9P4Ie%F39HDXtHTfNQ^MGbu@gpp43|rJ`cj4fL59fCFsG22YO; zjVUz1?jlA5jP^S^gz=Zn#i9X$>juqvT=@1aetN?;+*D%a_&v)V3qF=-DZev^Hp zME{Y=?#xKc!CE;sxX;*e*{|hu$J_%M@R+*;>7XdBvuuv-&#AV5y0`707HPZmM|y%5 z%dQZVKioVnoRaZ7*pl5mek?K`+V|NJ9^g$XYBL4zw$!e%mtQM7g15vpP#)C>K z9pXirA3!smo`Q5MbpuZ`l=hzv)UY0<5$Xx^rRfzt;^g+j9c^SJN`F|)xZ3F0&J-qupyf}m`Y8R zF-oAIq{EE989%rrMAsZbtjuhqYTG?D^Fd+bs%sU>p+7D1ISh>m(n}x5GvLsc(aRJn zy<%HrFVo0gf_q)lCA*k|ZBQIdD9lvnARq#pa#QulAeQ*PJFWaVN4y0<$zM`A(Kb(6#W%hmYbe+@kj#9)1GY1vXB<(GRH3QEE8*I2G5T@*2;|hJ`gzBKvLi z*$&LC6qaxQ%1#tBe!{l2@d|BxC2f2)*~T%v&*Lq4PRC{ET^x%6`x>Aajf)v94pdrqZjZHq@Va4Rd9>)wX= z>8tqy603oB>AH^J2)nB2_`Y;}-|zSe&Mx64M${YrMQ>P}k@(UZ9s%X$1SwCqF3z9u zFHUXp)@6H0rkXobmLH2kGesf_nI<{R!6%jw7JkE6~x*#@4ObvvZE^D z3JRV>?Ipup!K%+>9aFcCZ>y~u4!{BZmFw+K>aTI)!r`m>lF8x{e|)<_Yxo$(ZXNNT zgVn)W<{Iy$t(-+Grr56T!NGx)n+= zN#*ZU%7)Z~&joeh-H9;B1=xzfRe;+GiA4wsW7~)fBE^ZkKp$G z`&#bf<8_81Jgxll>>nRKe*Ad)uTTH}`tAGwI?X=0%#EQVx*M~78Z=*GAQrAZBHI&O-cCc=CxnKOtDirhBdN>QY?eE`Y z(+sTJ-?Q9Ee?F{SaBdsvTsarHQ0u8!$Lc5s^W^g(1mfA}L!4~vB)*|WuVAHEdi1FK zULCe1wCizb0rM)o(czRGXP#N_C_OAZTv6VyovCyfZ*(s~)&|+^GYlyXZ#)^k@O47u zOdxF7vrqHSq8;byeR-J6{9MR*0@9jW8N%i8J(@x{eDD0ka(ZQ^!ph*=H?T0t^`H<% z4Eh*}509Syk~w{nYrEfsMXnsuouGq$oV z?r-V!Vd(mq#i9Cvi{afss@y6>_O!chSS>X~U}!wfuJ33Wsi_SonD z|Ns6s>*A7OBSY&xT@jFX0Q~*kV7=Qp#65am{ekoQ33}m#~M0mcalgY)pgR# zR*0uyJ8yVUU#aOtfp}6`Ig%7b?XX@s6R^h(O1JYRI*cxGEfp@l%9Ys?y%W>@6)f02 zv0zgXeS6NFHIoY36OKH!1liL!dTZKr(#OM>%`v<;@>88aGO>cKK0IrMT}gl1-W4lr zNGJZ_++VFEA7^k_i^@d^M)UDw)T>nB@A?{7pk&lW9(t&&Xyg)%I2HrG$G1Mb>hzD} ztEk6=M8N^?p_Hwt(vJ(-CJvMF4MBK2y;uezTe-BLR0Wjyx3 z3)c?7wdd1Zqb_=TSg9tfSt~}6n%(CMa1*YVZe@UwgRk+`&QArrjyv2z5_-qKLw+6_ zD-GJ7TI2^@ozydVJa1_Vyu$5zRNcK3kQ%(CxT7pBw zZ_TIjFPj={!3iS6$Y$P4NOyxLg7Mm#^m0RuK4T{GSrMGw`0?ZKUX!}Wf=xj0XCBt> zbbobkh5wZy`Ypn2`VU4Jfp{STF@`|=Hd`QGzn>O}-~KBFV(?3)hd#tpTxIWyu+QZ$ zLNxdnhs90;I4ocaPRyBsk%=o{-9s`ITLhlGI7U%&Uc=V9S8_O-h5WPO+S(3(+JOaq zHfBO>r7!|V;D^NNpC?m#XZwZxZ(mRDY}+`P;A#Isr+0PGJd3)OcU%Sh@JwRm1(G$L_cG3h80VAO<6PC_tX7%a?ewtc&W1`9+?tTvZ*mFSZ{h^2 z6@60btYTHJL?!X`M5$dw2Dt#H%u`m$tTnNK!WoaZVUxjdHO{WVOkF!0B9bPN%_Ck= zPmuWZ35)*%9b$-`b>s7^MQP#D>6xUY5wi&XTN8Zx1XX|epZ^xR7qSG+?;iAb48494 zKf8Uus(vB(OHPY;*4m|`x}~B%%ytkbC|DM77AnU`Ps9ev!o>)QS#RUECSIm!C(l|H z4+3V!K!G>8ZuZ+Z@XID-cUqMcj9G8}xKGIlD&73E)*22ccZSb!fE2Gc!F@RsSKT#ULCjnmJE0rp@BW}`ps{#S{qhZ-kLZlox~JKl8ypB>w+2`H zN@gvci;$PEq&eKV`Hnpbc|21d&i)U1Z@SgkvF!VPzUL`GyIhv6NnfpC78@5}7p58) zEO&shS`dvStD!ov$9%@GN zxMKRwQXY$@OW7=P2ku$(%MfSI5B(?yA?|T5lr*w9Anyy?$F~ND&G$pi#5t~`ptW%v zQOM+WcxS0+9f9v@7 zl`cWG4h`vkt}jVXCKsgZKYcr$UWQ4b>=I53%pekXln4uLu2l~f1O$d`LWO=Ue!7MB za6+tSq-GgHl8z$SWrz%kXPC#xLWt*g0dFB$)v|P2DF5Ay>1{WGaKnEY8UqNQ0i~4I zX!+~7@U;k5CK&}#nIm>s-&Ky-)BQAb$n-PEo~k>87(NPiQQ9xh^;|&@8jWUWvrwoM zuNDpVNJtjpve*mG*dP~HU}(^Z9Q9Ge`P|wW%Q2ITzO)=u&S!@VU_An9MJ})*P1NGB zdZsLF@0jQRzm71SS;f{!{P=_D#v7bUQy zI|YXv1sEyccRgjhi`|rZNnY!%(@W1IM6|IDHviBPkts$ORmu#gyOo-P-5bt|l@R+2 zk_hxLBQj1gY-1k8+Xe;B`e5T~UE6tw-E4p;ik=6f*)B3sM6Rjb>?T;FM8v@ZS?HSP zsZ=2~1L8mz$dO2RXQND(%-lT$4Zs-^CVh5>gym8bg;@e?t@gqu_OzDjx06aPi;+ql zbjg+Jakd|9)YO?!Jc%)rQFLZb!Bo#Z;AOR}zJu}!@a-sehq1BPiH@HDv48=2V9lmG zYnHkBZdSaMTxP@hS)+ohqoi`pUMDkq`Rc>$S&n4ns26|EFv)e#h25A>*)Ckz-ZU4M zkh@Vekh{}UL&4KiGo%$%PEYH|{hOr7hU#`y&CtKoQ>?Wcdr1&oxgaO%RV3~)W5OLmIpJ-ZUb=c};TX$Sv(6Y^JEg zY#*vXvw>vqpUeh<9SspOph%7(6LccBz1ABV zv9*Mq4*So1P7v6Z#rj^l_m8T6@BhstFc<9ozfAA_Vu7|$nH~3!JDcO<4vK_VdR<0g z_Dfn>vSEZ%%{mHElSKzD#MZB}IYx4Tv>>Ftl19xrXGkQB=sNBP`CoHa{&jEY)xGIn z-TPe2+WRCndx>0T6UD4d3xi1UrYSwI75PuCu%oAR|6nj$r=z=11sr z@6L3;g(3SvMwipUq#D)t8THoE?;F*lXIQBRXT_}D%Zq%*X=@< z4$M8L+JH~vv8&8i0`E)sW$aoluLm+mK_{9AG!E0K& zFl-!H!$DLnoYt?p1H@&{maK!`q z>1N9IR&IZ@+IL};HH#5&V%w1QxD1>V~Fz8(R-M<6`JuPjX&S>^f z(zm2w`LvW!z_bP^QmJxh;nUB2bB+sGyyq)6cLv$aFR5zenl=tQ7DTmYhYWa-Cyh2; zo-hu=e8e|ix_TJZPyssV$6Hd|h!74CZ%kC9nL9N^iwe~O#$l8)!B%{9R5(WnOAMNm zle8*S69dR@|8mrGSjr+q#sm>>b>jl|>s{p1p|#1zX7~9tt^Mwz)=#&PtfO%KNwI~6 zt-sT$LkHW$e!sMSxN+mr@^8aA?L`jCIieAF<9&qq$ZZ-BY5uwWWn^^vTj+FmHl42S zvUQgi#>b1ti({OI?0@5V{*9w(ys)qoz18MkEY`=v>v4bFD;>*hYIjEBS#*I#j{>;A zSMWFm(Xxxy6j{rzR2jM`=Zd?VvE+FJfk&M5$;%BdemxRV&UlApEPGzsW}yAWROGC7 z(a&Kb@xmixC|Ws$R^o(oM zhKL-lp?(ut9S+UPi&`x(Mst7u7Y(Mm>s|cA3Ki)}h6Quw328DwO}I1v;G(4rM&o7a7hz%6=;zZO)&R{@?%m|Iz1rD~q@Tr1iOvpB}iv_g3`3?Dr_t8)Z|AzmJc8 zUpOf(EG!iDFuqq>y0+S7tGn{x-s(i|;{kb#$AgKCYf~Ai4Q@i2-P5cB|84Wz{R}@c zgUJ9pbrHLK&x{!mm+TqK>HR-^3fs7LpM;w$z76Jwz5?Y6oW}k8tetG}gr$oD{^Y(o zjUAW-mgYVLPB38w&yB?V1c~X*CNYCur;BY5Qd^toDoIQXYodCRmbJi%zJ=Bt;byoL zwIEjZbQU#s<;xA4JSCPuh^TRvM3?ZyB;(b9X0~5W-et_2uEd`_2@+w+xX=aVXP#$_ zE~9tR^Jv>h&pYuT&WS3KU`qvKe3-=UaB2yB9Br7KoMHIsXG~V7TuTx z^Y*KX1HuQ*xXTamsiX!@GmQ5xEnlJ+aBfv!6Xr2qTaBbE=G(#w{V&}hh|8G2B;QKT z21q@)j#2R>qit%mfhZ?xK@=&u4~fPRR~!KZc;vo2DB$XEse#00I+9BdOR1DvH`O!} zKvSya2QbKYyiCV8!rW@Ia=rMn?t>6_bia0I_m?wWJ&fzS#Tz6~SGz@LOP3G%a>H)5 zr98E}^VG<*9}iSdbfCX5ZwH$n5XDrsz>fX#_z=mK-jxxil@DSG560syKIokfH7Jf5 zx;TtLbBJ@_v-rUi{>bp10;jQ665#-M%BxS9OaNO4TVX&&AirBA-_g<7UqY^lhcPx^Hgm^3KbZT@iqoC+H z++jK1PKXN0R+{mlTrKh~xbumf%@T_%@ZPP9C_pv7PM|*5yuJOf=^X_>S(S*XWh>`b zI5(f!&C!>UoxduLTTUeS)_&RS!lCy52RF+6!Tj6LY?R|MyTPm-4<0pe)z_vQ`xjf@ z&GeR+>_&~c7+aK#E~0=@JQAdX_6W|oR!P{wGub^E zlxotlghP~nbqA>MjS!icqRu#iwQ2>O?w+N4+sK*&sIxCb`lkg_snLQ4n6+DAscP-Q z*d$+kP^Lswm64{%S;rBVAQmSKmfOyy%A4xWo1Dskb41$8X8Pz(i$i2|NgrZP2Q%tB zXl9gMHhba<&_acRHhx*ZR;eMv;Gu(oQSw#YDOR)XFrFA4`BcZh%QfWG92poT&2(&% zf{sC=Ag!>pKLdCS419<&G^3F{?4vVtC1ku~I5UP}!q$CMVzK##z`4)|>Dh1`EsWmcZFIl7H40dgVs zWj#+Vy}atS^R~6*QP0&GR1-z>RW`Y05)x{-(f85ehS()w-&by_yZ$cuch;G zz3u1Yz~5LB=W-b2A%!{0QcjYqXtJOAJ2t= z6(ly8TFg20CkPl}^aAhfF`IpytVpLTn+xR%p@5vkXg|}p{VbmDC+wsQa34O|+;TXV z%Vchkd@IyhP|ZG;d3Iq1LhG5?d=&*<;6$GAitij<3lItR$0qId!J_~RolwM-1T*?4 z)0lA+vqCY1bN)Vx4l^DfkMBudB_F3+0v=@DTYh|*@zaTFKmaFJJOq7Aq+J+F5gjDh z_F_`(L(>fF%If||*$d#aM`ddXxbvsn^mviFm`gkb_DT)iRV3}ncZJx|J>&nUYE zzOd#GQ*rxX_~ELFgQbqo3m6lealKqw*-qdf(t5-0<&>g_$)P2Sfcb8cC!-uqYZ{(= z-4t!oMR3!0kxYhunt}1_l#=;qpbRp3?obgdC$iMKjSmSF^pXL@2PUVys_7BcSw%Sn z8Jvf|pGkb686FYOKZl5)rBQf3Xt|2x{R@oDjB*kK+?>~J`NaZlO z9xjc0_#W28_~#KdiPK1vFdCq8_92DnO`{FXlE$&)OD>vX$@JC&cc-=QGf zG+zWt8w077!dK(B0iqQA^adk_(x*dsRxeuhqIdH=bsQcu>~XhIE*@^KR6soQU)5Q; zV4h0sND2DhI1SrXbdzj5Sv*D}-GIpy_TB_7am^mF)0u_HuMClY29dX>5m~2%cZuG? z9VNE@CUR#jN`iJEdKb!*G!+SJxA+fF;g#qevyOaVlF7CLPdAJDOwhi? znnzZ~y;b_^0hLYH#rel7qs$8Q03C4BJz-Ds5`SF(xbY*{IK#8~V<~zE3uwNq=9;{@ zRgNDl6t_h7(moWshJy5@!bsK`l`-Y;aoKFvYEpI@5#UG!=KVnBj(d4^I zCNB_~1{xIUwB1RikEKKACH^Q*)*VDyCth&ujL0UB*p_Ot0S*c>48dj#*89-hIx;V@ zlSR0k(Mv(}(6*>UaX;w}beJO^d?72VDubzq8A^0`5@j%zxA~$553~>c`D7Xq_yF!a z!gG24rQ?YjaRw8qK8uO@*8V#&k(Ry?6Ws|QnW96up5`&_7Xg^b}mQ9y8N zK3~@<8zQuQbalcp_Yl!AcvbpD_OMCt^|^c_Javo@1=S#&ft*PWvLE{BmxuZ|6DF4- zW77Xp^cO%_0Cq`xLDTl%*&ydvqcXBVOB&7&8YsTilGfB^)^9l2WY)fph;PHrC;u_M z^x~R7hnlv^5fGD-5|hG2G=u}4*+Af~vn_}V&ozfx3j9P_(xprC_-RSkE-BD#OFJMf$mud5j6Y;p*7vs4|H@9kKYOSD zVM1uQ|HV7KrY%tERO|%B79;b;yZ0=nRmVkRTOU9s#l8lK)YFF<9#YF~Ky;7ujTyHa~j7y&&;A5 zljj5_n1P;iix?ovaWU>@vda)}3 z-{!(frISjEck`Y6OusttQJKCO=T^q5qRX7j=qG1M`njR7|NUnV3EC0#VkS~q_aQte zo_>JP-dT~;+xMlnH&J4Bp+lIt5Vr)iUH0565%L3MaQ63+-vmPY0jDrI2UfEhbg)ts zGhkIsVfFo_=?(BOeKNutuQfz|qq%h|pCFiAO}w4M7g;-5Njl1mWs`%k33RJ!wpNa+ z($zFqc{TVTi)&5Ov#E-^Qo6nPVxpn@GG-eOx#L0fG5Rt3F1m>7&FB)%6T#`5##i&Z z{8#5-tyvcxx+9y%%%RW@&DoD=5E5>npJV#+hg4A7gM|N>e)le**bxg674Y)blicHM*`fvEg)QZ5M;~BKmRRf<1^(!~~u_Wnr!) z9lZ^ag=h?FkTga^E6(C5k>ZQVpgdJ`^7p6KAL&_!U?8|clXMKk~S3JRcmG?vS|DY(J2DhQYBMO4X4@WFjvdS z)k0})_?(hV@NBO}i)Yc^4<(Kt{pdU4)ulR__^3=CFVtTS7CM5YNRZ#{@fje``lX4w zv^+oB=_di`rS`*jRN!~>%aihtcONx5$z9*6SK%;c;+E1oJHx%poZ&7{IJ+egrj%=K zm25ufl*!EORL7JK;*Yu$>3Z`#Ua4U0vv3ogKVvx{6k=i<@lE-hWtU8yO&RgPuEV@t zwQb)162yK=4*itq;6GF-6i#0Ww*#{v2F!zoH<=u%MX!>~zVIbkUpX#OoWqJ zc#u0sW}1oL83eQr+FmXx#S=GpnAr3sas3ysiSX^-MQnAXPp~A%LmDF=DKLfgVLbj$ zf}wXJS|w1-Rk6^2Mg)blHJ?h3%%DCq^yj&8z2q$cS^QSt1lah`+4B~-SxubQ?qALv zi^KOjIus{+Y2wv{*NZMqK$rC4GDki?r;^H?lL!Xq4@z6{Ww0fLQQitCrOPJVEwt=1 z9F8to!Dhr{IX>u}?YoymOQe z30As}BN~!9EH}CtVh*6=+Xy6{MbS|2*c#9Vi>F>ghBgoGeEzVMiV%=O>*7xNIb($37d>M5OpGBAcIx}5Tlj+6WseR|{;IgL zd?Ge17dE|%%8WgOuGmc-;7!nn6FksO z`25Lz8=~!GCHUV!beOWBJ=8%Xi0Tm`JSF{ytg}TB=%My0acQ*UefX$%_>z z=N2P8M=f?GQ4y}D?nW8jWa}j1O-zmItVWY7r9#v;ZKQ;4gE!d<$AWx(=C0>Wg7ghB zM3tUqSd^{1SQJkZ;R3#7jn(pNY?hb-kW8-(I^$OFU5l(bS%^r0B>mk5MgMXO>W&Uh zYzuIEgnteuL*LsHYgUOaJiWwzNSD}Aq1qr|CUHmc5$_M%bu*`{4%$SBjS4lQ{rf*H zTqyOZ*sop{TW~f`1%jR{!USKv>7=Y5I4$Y-tlu5=cx+%(RcPR&(Y{hsjdt~_du9(3 z%QxCL`c;{RT4}YLSB*i_J)WiYx7ueT!l;s=i$9Y}!pvOjPoMBX;jb%rzQX(Ys(#k= z^FTij_47zSW_o9TtRANwAUFiy+M%|q<{1%kNzw7!0!;9ShzJ@ghVCQ(M-mo$91;$o z(5Y%Hovu})u^K3F#0sErK3RMaTtq`uc)-Ou4u{BjwyNpME{*~+IxUy3BRaWfU z5}vr2v$DwbmERPiU-kX>Td?GSKh@%zJ< z`=^In-<=ZSzr8p0<@KALSEtYSUmxs*Ow~P)F?&Wx`e4kj(}YAA)7^`|$L%2+?Zt;U zbhxIbDvWw{98Cy~Q*;-ajtL+$HtSvB9Lo#-8E);0#jvz-yfmGO5IL~AIHphq)3g*V zF(*q&((xuK$D5gyd7BqfvuR;Uj+Fa^iSRWjf|9?7r||m**UlEo-93L9AokjT+&W1w zK`r%@Ri$frmVW1^R_j)#hS6SflaG+>UXpJG=a*ko(i^mZ?1-lObNmhVkdC`yxA`w% zx!qwixPdDA%?#1VxtUxAO__HX5bKxc8DXuL*Sj0Nx)%o^q3G2K;feo^Gr-5$8#fJO zu*94v8B?ALCLpLE=3LoTvygQ6J^1Q$&5&XX;r42V$9R0_&7220sb$H6!cudFT^eNA zr9qBe;%&yrTwk&c6QRfAPH`0FB+9|U^FDz)@hk_Em9PaCTgWy@(8Ki1y4%$lby`g# z0Fgh#(-3<$eH z-JtCd$S^g|Nx7=B$&=#A#PXg7V6f(NVC(vC)Z*lUJvJOyOPIGq$$OQB>?Qzc0N-5Vdqg}!lCt_?*R3$?;0 zkBHRD+V)|p0S4;@Oy!1VOr9l`Z6uM-(13ieZD#eX6zn>X zf^ObOKX`*NC-U6XV!KV<^b04q4qRlU3nL$xf}-Dw4RfsMq$-la(_ zq3LlG;L9C3HC!L`81)rBE`1M^;g#!lbnKX4bFNoyr^QS=mIjZqx;ztr5sFGQrB5$(!Gv@t5M^0-O9@}-{?lZO+p-N zzxSfG;fyXgfx_(Ov4gSd#AUb{qYpCaMTMzOC_S@g@KK+iXT2!Q`Ij{-Xap}f^3H|jmRhAeu}6T zHZn0boPl2r=-Rcc3`JR=DwaLQ_5-&7g6$?oyO3sagF!ppSg5&0;TI-3lFv?qgpa}P z;8_PpwC+h}z=MSjWYZrqxc1I9B%F6rS{OH7aXZZ~|3ixoaBp|L zc@YkQ@!Jp(w`1%=6?UONn_U>}x#$3gxB?sn@xy^mc}E!=swku6#0`M!XmqbobSXD~ z-n=Kw^UoEV5Ga{Fj#ZVFGrjspHAtfK{vVaJUPN!cxU6+J(GeA*KPf2yc#(M_`q$s9 z>MAMtW2h;)?*%E#->WQPCJF7J+A{GMb_f758Gm80XB1Jy%EezeOk%{&iobAp?c*=F z2gIG96#BjBURNzBbIBvLZcyF9kiFj>cBLY7R%h6Ar$odDm`TWGR1KWgq&%NPwSs#2 za0P6`FkbLs=U7&9$_eM)>+1Vg?t&JWF?Kf$B#mj*r6TzaQWvev7je3Wr0~rt2d+*C zm6aS7%n=9D=`A{+#pk-q!0PM!!=XA(*kYU~b+c55NMlvqVF7EPb4D~zpmZ6%au(Z=wYy zWR8MIiyB%4i{udC`9o0=S=?8-OGzX3f8eyaJUZW+i-0k_AOc1|r8zs-UXD~Xn$v~m zw5MrK;7;bQ_7s(3;$GNrA#8HZ>R(*1I(3bz&mXQ!z4MyXaQ*2&zaI6=ZbfaU@ChTA z5Gdu$bYeyQPY@gX3%KFTfX$SGrz51q-aD`ex~0O3m|7EDrU)UCrE4tnA>Cap6UYF! zZI|(xDO@;Cj%=<*%vE=Ku0$H@dwGka?p*^irpK*f8<3ciNxrTt=~H5-?WIo!0oQTA z$T_=79RyeaN2H-)-fecmet=nCvE!ZmWC1Rlp;=j2X+TS!fXR2&?;A}5FU*yZ@mV|= zcdRL-q5Rmr*kq7DRAyG;w(I3^bm#O@ETj?k(!w-)*EexN$UQIsug{o$j8xW3$`Keg zo62rRFmPovIbbFSvuCoEpUG&4ctC6s(6Q5P2-)fO#_GdI{DEri5Lie3B$S_~^>llk z+oI=>GuNRnCU>ESi_jO)Tie}w0C4&`36}Z}aeJ~8w_G}jbwT>zFEGksf_4Xw5yoLo zqE^*ghB^3nUs6aWhW*AM3(F=>8C6bb8uR`8bWN8^;rr~tJ8L;X;QbQ9m>$5Z8(M_m zvz@aj6Q*|>Zz47W_6j)}%Vvs|@Vp4~I%h5gYW!(dY}QOmI53T&uP zV?+HfAf5_@JnYS2B7a0f=EwMN02;pP3DAX29ReCSAxAP{=R)f#_@A4hAGRFiHaraG zA8s{uWO!lHmi5GEwyh9uuUo~!A6#Ko(v;)u;lR)3jvQjHX0~({T4EDbx33oDWgB>k z?4+9r)Rw44C`d$niH~<;`_PrT*9DvPsO7qiXMQHYu-!7DtFANQUFM35<Nm97YgRkDGO%%P(rrdInGbG842Vk9Em@W z1If=t!&fn_fu&$h>($P7^QwKV%lTx-CT?bs257vBXX&&xvm2|E7C>LgFwoYy&42|; z_2Tv9=FRvj8W2MJC{v zj?`}9Nen7Hbj{kzaDjRo>vl<^-Bt*D=DIHmq_7cH?AIE$ARG{nEP>$ki3buXHXsG8 zH^-vFz{|Q_T*m?`>_Ku7Ad=4DDOdQ9|In9!?FdCPm3F5qH5jObqDAIw1$v*UHgR6^ zmFjxM-~wgXknxVnWC@un6~-cE-oxNDG!P4MeFouizGJ=gH>!p~9X!qm|1Q6?bWPm9 zZ>1(u6VJ!jMrK-&nagQ1bNP43j3+Ttf=q141Tc0aMy{YwvG>#82dnw*WhT*)9EXga zDun2;5Qp+#(uP^&$!z&j(B#R*RUj9kng3y`(VI;*rbz}WgY*Ixu!s5P;M?(Z!-F{U z3IKKEUWSYS>my5$+RMqj-JPf80pj+lEUw$78a7(GJ?WZMU!EIC9q#hgQ=v?`gph^K zKwoA}OZY75VX}+}FD`0*LI`Ff6<3>u!LZ*A7MGPm;uA#%=uz^Wux~Qv>1HTiH&DDQ zWP*bVvBtARFVkp3Nv9fh#KBtiWbm(=)rRufb`|_E8EzKTX`E$9awdnL7Z37WF5Sgb zy3MTD|1z2bTK)r?W2Nq*IXA|{HlR7@(@d<0V#6P4665=~!F)S1- z{M+}$N(QI?I4WOD@i~e%FLE_S#q6`4MsPZ|u#aTNTya3bS-u5!^}NAO)f)RG-FU)N z(?&zQZPeH}n88Ii#M?gbXAlKDSEL)H;N*1-+9VqX4VZtvjV=fJkAOaGxx&d5p`^Mj65Cw<5ms%^Jz}fG9qbk# zyt2gvl<i zsx*X={!b*Q|9mc(bPhJ=F_3erIBM)+h|e~3>~B-A$gYYL4YPPl zP!`=8=Ro&)vb9F&h}lGq85h?evS#OG$l9ve!+Z{ntWnTSQt_)v!gel$0*uA|LHuFBV z+Fdm5LkY!YO?6a07)_)7e>#}Ex}BwI*$x}b4wyBRqUyZSv_pC$n&x};kNRRX?U3OJ znFQh)NMpu^P_^t?n7BJEb>_yxA^aoi_8D{$bpyJ>sXOL3?6%+xyXs*;YQSxdo+g=ohfC6gv;62r zPJ$>vxU{=Ek+Qo+9%I#OjP2P$wtS!lBY=!hSJk1ZL}w?HMM&Wm!r1l|9swQ5FE3t} z)s473Ws*js>JHQ{#jf}|L+y5q+MPq~4rf!l4;Qg)g1yB##@vhZ|90=I`(J-kK3)A;s37Ea3lp5{2gR62cIIQg_3JzBX(l;e+for+mWUSxI zi`bZdT8Y*WO;@;uYvY--e3#+7O0FM%F)7y6pxH^Vf8w<3O>x1lAQAQgM2@lUnj#50 zpB1?D++5dc7tU6;!>Dx|in~s-c46W+8Roj;E2f0d=^FBu=elGcrqmqAbwza&cc+ri z>CLo}2K{ii9$tYzi6qqSlT#sGZkW63FhS0&C@(8Eo$TVFZkLqXTT*hyzWdiLdt62C zCb&4Mk2q_*W=fS088~uVx`*QjgQMwRDlzuCDtU}M--B(b zIzZD_H@1e{sNWBQ^ zqucS3e|&t)krOYEn&q@D!6>l*EYi#8_19l8(QcZZQMS$HOx|{&>0HZ%gMeq@{K6G# zVn71<&CIM0HwY6c^w6^8w`UYQj`)6H3PZ@UIn5!qzk~!aFNy3$pj1?NU)Z!={6%M2 zRHi^?@KAhIs^mUJoXMfoUO!!qulG2uZ(d&TTjBT7!-s2Y>0IYmWD;fSjxN{K<@@)~ z_KMpVk@^uN4c7lmquUop`kd-KC))9AQ=`t5D%_u`j(lZ^cMalgO(R|~jF@|Omt<28 z!11SBW7?;*A~lm~Gmny1BH|2U*+l6w9xr1~ioQlSO*`2?2hHl>^}7zzb^<*p;5joY zWsuhE4T=)?b`l>UowNS~hXJ=(Bwu)PJ^5-)!cp>|MOdgVN`r*lwet+s)B^fCy@O12 zj|o8+;AMT>fg?$%YX&Ka1lW?7@_^xR7qg}&Duu3uv9d>&s!}G%Dq~ONG%Khg5=spV z>qsjjbD^NuEQc8!O#ezgg1^ZnCr;Md7e&74WkZi`e!#L z)MakCjJrcLD%SyX=1{i@-Q`BlVasa9SJ_5V}VX0pPt^B9#`Fq&!G9kn!u$^=+V%4$#RXdCYwjXBqC*e+NMuTP6SdE`ImD3 zTg9x4rTpqj&!wI~H+Arq)v=}fv4GZL7kXnLs{yi$X^?66-`aLAEHC{2lDmKPZIYPY zzq*^GW$#~28H-jgv37G-kg(#xwI$=wl6twgX^6dRi+eMzTkK4jwfDl zYh)6D_C5(c<`H$Uj$fHk+M{#$$W+Oyx}yqN7EH9}A(5LVy8J0kaJT!V@3(p28HgQD zx$am4S!lCqWYP>(9WyB-rwOp9CL1~6dwR;cNGuW3&>ONq-O>*l5s&e*%{xdDJ;OaU zox+{ir_cNagA+&JCeqW2_zp~2!-LbriA+JP3EGbUg zNW@1zp$Vq+c)#-RHJogS8*z!9NXsW7Mr>a;hv&q8I3qg2w%o!EFA<=t&gOLwPOD9c z*OQ-|#NftPc@a4)`&Xa6 zfaC5xd&aE*vL{~S;jkrN;ZdZRiHf8(Xs;r7F{|R zx!1ns4#$CAoXDL&VTY6T3*ww&gr+GZD6AV6SadAN-P+0?cnX z+~eX*cEkzEh|;Hv3?t;}%k*AqGoK8>pC7`5h!HVCwX55HAzSN1S^m=+#nql0CYO+A zK@+ezLnHm!LGlTM&RtNEbk6VlvKgQu(aJjkgpUAOHoDGZY1W9bo-7Vyv7j2K+zZ0! z01*a41}N%~sKR+7Y4>h-M$KF5b{lY+o_?hNAFkzfEU8zY= z+N1q!mX41XOP|(mi(iyEGy%0g_dTmv=RA1StMSplFA-RUSSpbC(qgIn@1@O9uGj73 zqm7`6Qk6%N{i|ok#|?TgewckJ3n21U>}CIU$F{Z&Q^X83f5uBFCrc9AA%* zZhalMS(g>4cJk zU?|BVQ2s?K2Bt;g>NbxGMDi(|Y+?aVC?6Nk=jiu^6UA(yR}0^i##ngqv20;oj*p|s z`V5luld0pQd9`wUjBaVN{Y@Jf-a;^ps`zW>YGJ){KR!MtO3=NCF}V0j zES1xfsgHCn`~91*{epYnL0X7msQ^MrO***w@ab(p`$kuhsZJHUz>p|F>3t`&rYC?c z3GCW!f`G1y>C!+h)HYE;X?*uL!8^hA$#PC>cUP@RkF?yZKUC)aABwoXLXm)1iSSQu zNhPUP!?1UCY74eC`uGtod#10@FTnEoTFZR?>TrMi;44Uiz?{_A>7KTGr)jO9=~}ju zFjdwkah~-dqG}OWrT8J($CScko3#c{lY&WiEd9>nq5e}5#=cdMwIU9B0WQQKLdNDLp6`{#}X5__DzC`>Vd0hBIvfs&lkh zSz^_n{<}pcJGxiih@bub$JlT0$wG4-hT5sfL?+wIla{CEGQgK@XtF1nS+F7hxAiB} zkVl58UImHa&&J7}!pVJ{=HvqVHuoNJkUN15otQ2o2Q%F`r;w|wVzqxZvb*aE?~`&$ z94~e_qZC7J#Gd#xk85#%;hF?V{c4tYh1 zuPEyiec%KX)+?@=Ps$yd9@Lk!N+g>->RMOkT&a^nnt$iB`CY@={HLGI@1mn+^M8k4 zCK<<6e|AS53uu@vagc4Hnfg8*EpC2O{{7yOV&idIz8x=|=$dObOY}y!lI;C>5r4A9 zu#Z7O1%Z>j>}Zos-d?;>_{;RJ7K6rh|)~+jZwXsPOUjU1>N#^{Nu%>HmF~^ z)iKLDbh#IQDx438y-K0N@g5Cmb=a(gxpH!4hjltGI~xq0&YbGHPveU!jbJEwwj+EJ zgbr?k|HJPot4OuD;q=Wm30uH!H%PyTiL~H!cz1+m5)+YN*N}WErKS)SqDc`KlU@xN zlph?CHEoQ^>(bIc9xzKgJ7)iyANJ&cwPmN&n-?R^2~d*l9`a3;z7z`XgE2!QW$6do zmy+@mdu=A$1QdN|6F_oB5nBD`(QpA}6w9zuz|w6ZZK<%iT**P)*D?ik;qkEh&r!*h z56I-+?u6^aR+NW@!=^0$xZ09|=f>l{O$_HYdQJSx>QTMXY@M~Qt~=d7`-9==-TRLx z7PR8$!T7#4Ehok23Wc=}{dj0MMp(enswLgyQ zv=0RvpLK7>o#t@d?Vk}-vpas*tc~Ble?P7^c|pipC1*!daPr~cyLbY z@o4$MgJt`Dka%iyGD@lFJENk_#nV&svOPVOQd_T1?kNEtX@$(bvz4X02}MlZO2zTo zwbW^#Exc3|?-3iefL_fBqzd)S{eWC2Y@Q)eLTps7-sjsn~ z@Q;q0e=o(0QEe58`>FUQ1#AbIR~X0@z3N>t?ZtvSZ-j$_iW6CFG0SoKEkZXOiIvNI zD!HJf7L)MOpH3!nr)*_DGn6Sg(99~5`JNOs;_28|W3wm9O?-C6OfFSbhyei<92R(i zrG#r?I_J7Y!n-RnO~3nYPBO%uejfwvuZ!CK+pP~ThNZa|9ou#11|Z;db*}Jr`KtVN zp)&V%xly{!?e?_eGHI%(V-PS4LXC!@K$20nb0R;L>#TH$F3)+KZuLry1kH+`Zk0Jd zB5J_K0VYgQOyR9k14|6Q6JyJm)sp#AfvL*8W;3SA6$hWl@+LU1T9cPJW8_)MJa4+9 zm26h6D9@Nkwho)A9uqfDI!i9{a6HScD+%w7Nyijh41ne*hOgHwI0*$b4WSece^olk zX)7^B9Kf6z_FvYLK**T#910#`|2#RtN%o4MbZgiA$ojw5;$^_I#aABc} zvy}~+)qef_pI3K=IhWOkp+UZ51#T+McRGoMjHt+eouCYv9RKb+Yr9TL!C$eZh{S85 zI$G^FBU475o?cZE%7!FekDA|}!hS=zn|0GMIGAQuJY;{EHO+HsbE^?Aa3ADUt-MgE ziMSJz`qg(>*I1p}55x1Qe-&ph1-;02Uj)q$$gi!r33TZDNzY(*u^(YN(N970w(aU< z#S&f@#mQW|GZ;$4$*nbS+ll?2TJw3O;Ic!J>5T{#3(@rk0%0qRIW1#Y^5X^2_NEL0 zuG;r)pm}g-l0Bx18wfckn1qm=&;{S#<(@|8Yfo1b{R@e<^`6Gh_i_p8UW|6#ePMg2 z6kEP(E8V_rXO8>abPy*CGk4sR;wek6h8*3KN~~hS>t(Crih)d3$wuyn;P?s+E|(C1 zI#HLcptN7kxzF_|2S1O7IZg~4W^Z%k$TVIwwn!$eHB8B>IwuyV+D2FCbeP!J=d(CE zfn|M)`UIfuv%56kH|r|r_eTpU=@odY^1z7J7F9?6qg8nYBsIu3)|p!cfV2BsCJ!sW zj^Uc@soa-YY}R0E0s+%}iB*5OI~lCofz!>)Vj@ZKmPA=bgs6RXswWhJyC=m+rJF}! zH$l3byO7qCYrywi*OQ&QsF2BQ$&ykw#m+`JhZn9xFWxu{7FtQUG-m=7lCoS_06o1gx?uo;gP4Jbda#GZII0~VUv zDKLhy1&Dkenz)W7u=6NmxpS zkNWw&@x-BNZqZC;Nw_r#fHRjYAzsRN#wIn>i?F>fv#E1F$V1+6!6)U2B2%P=<+#=F zvE&6+vHjDT&S%eJt+SgEg~VixD`Ue!v@&$<89A&fq~3IeRWQj5@}`#q?GayZIz8<0 z!SrLZ5-=YUcg1FX`?4G^jFgTEux_xF}A_QDg*+6~5O>){# zdxI=`{bOnp^0w^_>Z)%PZvOzyL;KClaQo-=cy;B$;|EXH9zA#*?N;NpN6`x|&y0G# zc=b`VzlYyR^nNdXyu2L!dJ#WfjrJ~ZV|o((auF963egMsz)0J>6usq<3wO9?=l$cI zlci`^@7%bvb39sGUS5^@XPM{S-A5~unqMH8?lOO^tM0o>;dOX|JM4{y9HyI%!Q4A8 zcj}WeYQbo zQv|fRo;-Z)oYApE`GPg33f#M^pl}<#-Hvyw3oo{#i)#E53F{)g?DnHwu9KX$%1q?} zhXZLEQgOiBYUix!WC9m^#GlP5N#6LA0(LE&6bP9m@w;Ol%<2gDivV)g#Y^6FY? zV*`JrGTH2{EcYWkmgMy#xdFzp3M%9Lj*_$xxnXEJl$U#PGk%tx`QR;9TwGk_K=9{Y zx)f7YQ*+_L6WZQvF08IrnhTE}Zmd4y<iAn`AF76pKSVUl`FtG(5w68PQ_FRqhrtHe`-BFRI1n()+zqrTOd`!q9ST38;6P z&)#l-)9aC{2z0yEQqz5UyPeD|Sv%$8TU|!{O>?Q(Ebs3TdMD~&Kwst@*P3__ z|E&1e3$q(ccxqUtUoME5Dc=vcK>~EDtLipaR}lShuwE`-m2#7ORU$I#>XZBTSzKIJ z78bpTt25NkVg%etrp5vG+qlA2R5M}o4LpswljOL8&S6bmU0<&m5I!lYvTLZFBM@#? z9L9gLXmibBp;=ll9zLTI?k#)<%!=prg-&US>p@*bfy8M^mgB>3Zft>V#kGyNyZK_f zQp4!6-0N-jdX?HjSErxDjV*5lDY)#55N)mBsP6On(*AU{H{Znjx5}!R0gi$Y4vsU< zn__1{mroMw3fof6=hAuU8U4c^Q^3r0t!k*D?@{L~q=9T)kP^haIKxEDW+^O)yA}Z) zT-2G38tcv22!jn=LJ@yN>Ig-g57Dm|$(%Ii5DPR*jSZV~KgYY<67^XHax?W65Hiz> z;RodN3AeISeO^!My>a!ztK-&lqkFFLK)Z2uTD*ky#zH4dV6_A!W&x>4rqVa(pm<}l zW@he2cS4lQRbV_-_y+l`!@ycxP0Ah`_8ofcV-C0CLys6BRX~hGhZwa9#HcN7;lW_& zk;19@rnpt!|LQ=&e&s8`wC^t+NHlM&1xS*k=Dr$^RKXBD^Kb>%T(JCZ83BJgVakVT zUj; zTD2LQ70Ml2@KyZ_)i*A!L?tBWg(%Qywp2dfoaR>TKX?qSW|v8R`Nw~U`MLnNX0`$|F2qv}}`UQ35EJc;cV)U%IjZUozmq^neHdhYxsl=6GezJ*ePC((PYkCGimt33r941ic+V z-{fk_0F#gz({g`TFW&-~!bhF{3UEQHc$Jzb{5s5SE%nDZNuk>^=)MNJ^=atV?}qMj z2A#Nwq~EMw{?DV+e<5_UH*5GCJHk~R>5UbI%g=PBw^DEu>Ok>gGFM(?ZUvb! zXQ|%~)0KD&W!!)Y!DXiqyo)&WU0)%4HWUF@u34<=1dEkFNVWZkze0!9)#z@_xG~Il z4rZKBV}^tU=RFH)5Pi27e|*ci_{Y8YSN;8gxD~pM<9jaSL_ZXL+>5`}-=Fv5pY`{q z9yc)mj~Z{{>Kp$43I)adp~@vuy|AR*JWN* zZ>s*0qkMCWy%B!@OVKaNrk9F=h^sTt+O2V~b2h%{HP2)X&?9U@dY1YPUdu^ZqzvcO zC0B&p#u3gSd+A;u!H4@&t#B1WGdO^rY4NB?ZoZV^{sg_m`b@JLp}V-Tj;fXg99`@_D5JI`47e zh~qaItb{B?Rly*RQ!Do~8*ai>o219BJ~Jfx=oK$U3@qh)pQ3%u5`ORrgpNYIfK!Q7 zPe1xZty?x(OZ(ZU1+%$*zQw=!#AKte)O)j152a~q{^I&L8gij@eBN_!=gli3H|Tw_ zIvBLiI?`r+hk1sL$MXq^S_vVUyHFZHM2HbB6Pg{6;&%5=ZBKdYl>$y6T z#xh6Jun<)|>T5aVXNM&LXV1+1x`&rnG~WdECygS0R#e-$KSVhi-FKaZ_V5qHIZcKk zqli965z!plnEK_M*2>ow{Emty>nYq_59OwI%;F1LC zhg0t7{{6hlJpD4mAVapZnX<@e%qL98k?`DS9an2t&DWi)4>~#~Y*xqs+dVUxQ1WRd ztAAO`s;mSwITLf~TF*?RWD8C?jpW)SwJb6xv9&eUj3uVR^Hr;b{VVLLfd!hjsNf>C zJ}R&v$E6S4G~t}%e77A9Wv5UFCGXDVhIVR)4DNKU$G(WE2qhSs6bh@+V4)gxF;yas z!JmSgL58jHAJh2r(j(xD;o{sb3ZG^}f<@Qv+^BQe0XgTywGqjyGRMIp!J-)eZnOuQ z-~Vk8_U->I5a-MM55m|t{I`LOF<=J3ffgNUIxMn>6bKHNQ}c8?Yff9tCv(|ctoC|Z zl&P*eM+K+7MxDCb`TsWOiKK6m;KDS5z351SEmmg^+r`mULjSZ0v3GcjXJs3-FB7%R7Q@7_l|9yR$tin5dCTcbjp&z?F4fQ zPcNxsf}~i+7q(_6+WH&gk}6!Q{w1ezg=P5rY5}K4Ve?ILNdXE01RbuZ`%Lj5exU-FwphJxY`RAYMvw=?Jq?;yEjFCzfc<4# zwu-8YzN&|z2Fz9qthhPhcYRnebcJ!M-n7r;NV>?k{?-}iAbi);RIEaW;#48;OJ{82 zUEBg1LB9pp(utQ|9=zC@Bhd+kNUO$6hkaB$ogt?IEW{qmB^OWD)#$c#ytw#H|E5wr zZj?()&WeK)-FRuIan>YzJ{`jX;z5naT|`;zzs1gGqgyvOnZ@uRR2z>URnP>GwPgAa zVo>3Yzw~pn_CuRKq&+)V5bdQONuwQHuo~s`+l?#q9RB8dx+esGMh198^~85xdJU6T z%~re>FKt10nsd)#1x6U)`Fc}8-moaUtnz&TR;|yyKA8JuZsoXfyj?tc;^1@KC>?L7 z{W*x2-keuE!|wIoL7Mu(qI4|1?AF-f7{=N9{J@NBh2yyc~> zPNUy#XC~@8{xHTtc)Y|Z?e)Rp#CnDR-)LgKDJ_-Ox0&+o z_|@pT207c-)Kc#L{cSV{T*G0pPLP5VVZo63ZLGlV1VK?y6PBLrVlg;F;=H(`&?hf- zwIW!AHsEP`I{dTPPM8j}RcoH@yzdod;&^;Kz;mNrmJi51dn4r=?-BGdrIPJv~wxaDQ0b#EF{PrYEsnAVYGT#kHJG+w>UI-n@y z`9oJSR?9zXB+|QxV2{)l1=4-R`p~7(cE!x-+4B0r!l=|{kGMup@LV~HZTK+U2ka%; zqT08CaLj#Iv=MqLtY);yg3qq_D06_lP}ZmwB_j>Xbg_=yYS`SlYRbutD#XyWn5bTM zw1^=rX)ye71^+x4*iowv5A4X|2#Of?XHHm|PE53;avC`kfL81ZvPW|xi`F6NoS~IE z+ZY9~l*?zOe08Ivvs5$NOF@C^WMY8nh{NXI(@A7&2$`)x35s0iu6XVRI}>$=Rf&o@ z;P#vwS95)$=cZfUyv%S$6AjMFpBPZjS>rpMMzKB~x1$#As5h`77-47@X}2;}xkF22 zMS-~1x{VKh#so?06KzQBQC}3|9CrOo>N5xg_rSCY;z8`uOIB4qh(EYY+lQ$sDk_Sr zNqsFy`CF|+HVNSqKDa(-KhgVo2H$Ho7skGgFu`s#4?z-QV}e1Wc$Do@#9AQo2;S*~ z5cNAv0WFvV!;efYD^jhi8i{jC5s23g(b|{S-?3~!t$ZUXl02tl4x}RknbsnsYu^O) z_mZJj>61PQ*wAiS@oV+2kM7?eEe_7BoTlI6OP_zsSF~PIC(^tVU;T<5rCodHVWvfp zqgLxitIYhUC811)2$kbvYm>|3L~qL3#r~78EYKWP=*z$O<#;LGcyx zlLV&GL4-b|psT#Ch^d&UL`WV=(TWq|LExn%Nl4dyx|mjM9h2cj#_l4Hh|S zHv8LtHD#bL!WT}sR>dNmoTRZowVUtKd@n7ZBjaCq017}0JxraHz&$$=nZpRvmp1dl z=8qNkX~c|=WQ}baOf_7`W@fIRDiDgI$5p0J)e0Y$%}X<*Aj&?ZHRHP?zQ5P z@ldU_m2!I>dALrpZDPx{{2lZ3L^E8!Vx~gtK9d)6(&tRi>|4?~pGD(|TL2-9cJ5zO zqy%f1jWFF+VR8Xh|oKqhFvFLPW_?7sw<>Nq{TNd zY6V=5N0dOb!PbP%^)`Cd$AGQh#sRWY_~yFHu?WMldzr+tHo!ur^W9_}1*C-ZMLo!$ zN5``XbgY-w&wP+seeyVM6R;DXE!4#uks*9R6;a;Fpl!WuwrfNHD(*z11@tTA@0C?D z;!kU#2M*WcGwz${Ws5nCK0p?Tr%?*~7TtG@BPDF@qtJ1gb0$;#-P9CgOXl{7kbgbw5%Gw*uJbu*u$5Ny+a2I;X(z8I zNOS+b5C$5w5%<r}co}N6Yr| zsKxiS2XLc5qVCqwClD5THrZ0;Y+%sew|C> z5q8+^xW~uu3Z-Wv<<^nS`Q^$e)Ksygw7MUyt6@Ej{BFdIPVP8jAKFKwlfa#Exu8jq zy_T?!FhZclR8` zD{gXDs(N`)Q|U(!oBDk$SLR2JN0!uJB6w-qOVg&cY2}-kZ!AA*R^10R`*=kSK3=nm zA3spVkE>S8~`+_Y96x7K)hvSMGJtf==-R_x1@Rr|8~P<1|8RWnakpSl+{@YD_e zsqA%^pRTEAPaoL0pFU7;o<6W#4_(qj4fg3H%lk+bKYgP9J*`=}nuhwc?y?$mp4P2& zL(M*ITCt{zRhLz)YK>N{(dq+Bd7wPi2g+Zy_NxwzRqICep=B~)Rv)`(^{8sSs6Mg6 z)|aa5Mb&1fYO_(}~HwZ7D>FE#5$ZB0X{t!b`n4h*#inxLAsUwimS&kxnT znn9svP^ekUH5-4eu6e<|UcWZ*`kKvj-Q3yh4{VO=Hn{o&o9en%UN_*@t%O!tY zT|;j)R)ryrhKAm-S{p`@nri}jbM1jXH`i36`QWj=JP_oXHTzz3-)q9dX02ww>TI+A z#PV97TPvE6mLY3vP5p1J39zj-6>B{26*E+->`mn+p zvR``5v$gcZ>UgT(wTA$4_5Rw&%z8ToWi)9*f|t zJhlNmu4_yyj~n*Ap$|`%wXpePFI9E)>8jwvAJz3#i=1DLWV&B z1^kt&kd0r>3V$^IstvX(#Nb&}gFnpOO7*cwBY)hBMp!f2!5?+5W<#s33B7p{Ty0IQ z)U>8oYLBefH5+K{i6C0js$Hp74KlT=U|FlGTQwV0eYLKt>T9aKzNVhmZR+X`8*ROz zdg~40+Dg5t8tYA~t1ddqivZN9TjoYnJuyQbXCBtK3!E!Pi>u5pNa%lpW1@pk7|5c148_|%vyB3 zs0&pi^!#CBt5q#sepRBX<;Jhttv*oc>H{mFJ*8T$35xtthpIKug;URE5Cu zTWhMKn&8bZ-2~i%7vLgOtF}Ucmg7J8qok&xDt~CZ)q1M$t*1F&bTw6w}Gu}}J9fg%gol%|?5HNJtcbq7xF8E1VB%Dw3{rQ=-DohYjBeQrq# z(?bTu#JuisQnBkkRyGU$;S~ZQ>(3cNMG4_=Ie};T>Ecvy)z;PR#v&U^h2A7%nQPEB1Po$XhHlocs)i@DBJq||)juGl>o8sZ$khna9@Z$as2Bf`u z_0?Bjy|RDNtLW8A^3SEc+Q0Lk%W&uCeSP;0<=f4^MQYyKxBR@Vti00WihIAK`pX;sufFO>{a3H9(|`TH`7bS*d2;pZ_p45a3a|fWrT;9u??A^7hi0$s zvENVTZl#bSdaL+8NFCk*L3zZdo zn3BZDPablJ3MCfwjbe`SS3l)w6tD)GF)#bI#!n;D{eH`;ly)_o82ZXLKKdIL7^y`sZn9AcBkNa=?JniVIw$kD8HII5o$NZ}JKKd#8!3&if zwRrCZWvEr-pWHL6^oOvVlBGjQw|ahve`39gv~1Gv3UCo2eecC2IK7O=Ap^4Hy4xe( zhkz3VAPCg)UK|QVznCkYLfvD;(uZ*+i6O0QVP$Y=CdW)qVONa}v3W>VTzI;`1NO5l%-=Mpmb53x)y&2*Sb&q=Q z-~Z+49`Q2b!dC?bdk-s{0FLiEWYhOILqt*Jm?uhJzRU_p#z1K|+EVWIt7_F_ibe7Sow0#uTf z6lV43zQ9I49+HZ;sd#sQiFyCH;x^J8@Bk`9Ps0`IkXVfq1{OS?z~~SotB^@6z1* zes|-hPxbpNt%zQb``G8yTwZq{;G%@>N1ss|I+Xp{F_~Bir$W5ayqeUv^z3-B8FvCK7)cr zrWxx8`~ALjTHyF{GO+g!9@NW}t{EFPT!uWz(gK@lED-$B6buoxyp#Mf^NJ zEl|8n4mqqLAntcc3I90J2yNVRjre@S?!r_fCW;O%+*`=D5Z$AVQlv52G}9$6pu(gC zH?&H>b9;;KI_xuZ-x>qzR+2Q9-9E;0L9Pv_=+#llr}#}>GEwy0FvUTF`)VNEKFcVF zkQnPA0ivLAYczJS_ZjZvrqV-7B8>s53WbmqNa$ z;SgrSb+#mvBc72uW6+IecF>u(zZ^8|3C1ECq1c1ul<==+u_s8KnV{Jq5Mu*jUa!k2 z0s|yM8d?%?2QRGzLEz5}Dq6Cw*uzL|%+Cj9c4A0U|FV$I*k8GGO{hTY9Bp{-B&(dQ zXT<3rlcTAhoM{Uf77;pIrB_A~)+NHYZSUL@2E&2GG;m(cjQ62(HDxq~K0C6Zwm1+j zs+vf{j(+9HtQ5IMUYjxDi!+=eG6AIb2T~&lJkrP}SeV0^#rmjEN&n2|CQU=jtFV-kPVx7KzzO2} zIrclov*k47M>4XgbE?`n0j{n1v!-cyZTaIZn9bU1P2^?aXgXZpw3Vi*&r~!!i5wU5 z2@o?GZVgBM&QG#p;P9W;@y2y@Fzoi;aD8YMqfTrdsAD3(X84i3!{beiZ_u48+u(nc7mk7--q=GwwSi94LoL@8{kH!e!^zEIwP zahTuK&jZCy4G6HL84ZWs&i$3mQM^Kz{Oc;OYw7C)TQ{qaa?Axekq!G-KQupJWfRBF z=4Y)GIn$G2hP)ePm+|1n(^S)>4z=TpVxiH#Npz!y2F{~r@*cp!bgn%fTf#PTV(;ul zQM;LLM?bo`XWM|6*4`7wNwtGswF7UAU~+l+TN;odUXpw?iV}M*r-e+6-niA5D^+MG zW7xOYZMD$Lf8Uh1FwrJ}0xgbw^3UzY@SKCFjE%AxpW(1FU$k*Qfl4}(*lunny+}G& z$t1ns!ZX`!B!G-r##B(?$uNAu98cC20cLn!nOo_-U!TKs2xa>MDtFwN=N3pyU^$1O zWX_hZe!ZZb7@%Na<_JXcVhAn~)~Vr`V=9joq-Yo{ zBsD4>Ynpi|?`F|c-m_%y-2tj_!#ixamEH0cc{Q#(IDym<*QDa zKTbyINX0Y-BKB6d_rb`GluEt(+O~$J zXU-I;)sc_o_icVNJ?=TaF1cyLqq}Haam1b`lV<#L+s(n3a&?TTgCR_u(J8!#ITBC( zJ!UYu4?l74Fn|S617mN?eE?22$p_7I)2BUP~~InE!;!-{q@zo z#K48H*7Kv>vD_MF=WP)h?jan}T-OgWEt6ZS2U;WcP-gLul-&WY7-E%=`j73<$ z{JHPZBWW&?AarD0R9`lKM$a0&L{}RTaZCbYiXa}qo4RNPCWxkS~rCz+# zP3jI5{Y!^v3A;ZcoZ5y1IV6*)sSBxWZI?QpQRcG%uYXWIQ5odJktMklRcAT>t z!q9%A30!Z|7TAT1mkAST*HL@^E;I}>&nC%OKC;N#75;#@&JYkZGLi0x^C{R%S-;ZC z*keR)6JuwCiwLY6s>p_oeEYez2&bXac$__Pv z)i?8U*LACLHZ-;P(t(6Umvo^$F)(*`v3w1}HWFkonYCjeck?;3cv^PmWCaf1FE}c; z4RnOaE6}*mzj(wA#1m~O1kS&3Li0Cdi7g4)7vjnB;IhNIO*1DvxfMy5@f+?6wj`qr z;Ksyvx6CpA_n8EOKs{LRInptMYD^|sb>5sj*NK4D)H(Ip3N84a1xm9yt530`+8=i2Bo_Ov)<@g*8$XG7yBoo`(l$}T>l3Qix z7V%|f-WCU=8jB?%Q?QBQQgtup`&l8vx5lw*P>swAW?o_&{y9TM6Qj+jYz@-?<4LQ9Gz2$6N|`2SdY z+wQckWZ(DoJ)c6-(Dr};jvROH*$0Fewu6(j97x-athBdxZy5oiElaczjvU$F{r>({ z^JxKc()Zqs5sS6fe5_fsWFn+9+* ziU@zWJl)OWFPlC>f;3_ixQAI?sZ^xpl4`~av32_0e$u39=p3_r_NFSIN3I?xax!+a^`nWXdv@*dYM#nG1etE9%yEXlhU(QaWVtb&=JSAjzU?vosDEjhLg=nql&u;Nk5|~Cr))6 z>a4AhH%On!_vK@!*LfHm0a`@`&)FAbx8|TbEEaURKL|N&*$so#QKO#$@zh0~NYS*z z4Hl3ddbFQxV{Q6e=Z8w27nXnp-cp0`;QyzVE6w&!qyf*;NA%JOgI+~xN7#oj=nOae z!{hWMS&5RB(%h?bOv$($8*s)`BZy)R_Z2Oj<}a>iqjw)m#JvhMF3j48-g1=z z!{{uJ^QYAcp-nK?e__Y>BKSMyYL~V_LN5%}KxEq40tROk(oqwNg?8j8+n(j7UQ|tB zxzr5#F~Rey8r5T3H*!nRv#n(I5tWX(TwFNOVo3ig&Hx*8M1{z%YA)VlNam3CP(T(O znIcMA19<7a!qR7l%cO3EDe@rg7Y~tT{n)Xx)z5iylrum%>C!62K7tzn+WLbf{RB88 z-^krKJ?|m!8b16x$!_S5-| z*0Fhd(v557m@m)az_qAOz*tVnR9z@NaYSY%pG9uK!)UE)I?qYJk~r4%5=OtvHMgf+ z(3V8;Jf=JvCniCZV*pb8YSU)+yOCKrm^O6R_@LFBX&Ze_h-9^xt(Q z?k0+S>;6|?n|(_}((m8-Qp0arVht;hkVZkE&VVQwPcnboJW6otO1QO`t(G+_kDnJO zAMhE-Yg^GMDL4-d^_#zbpZ7#YPjwthF=v`8RELJbXa@M1kfq+^E@7vdyQB`&O>ktGOY8d;e*^y+hSs;JjUMEXhVH_QOQuXvJ~Zk);t z2ah;ueJBBs7O!vKG!JnI-Q~Cs%0slH&2nr<4zXff$GEU%r3wD8hn?O1<6u5SUo(Gw z_=b$_2gmX?3{Gl?%?HinCSO2uyk*Ht%f_HvKQ0JUKGs|5p0~GYoxevU zpPt@-i{Y4X^G~0gv$u!d)UV?C9QW1MML;j7TG}+E!J$(8g&1pQOC1Lh;T#6!8j_+H z23qUo+>MCh9zV7o14_%l0`?%lI(noxA)lO#N%8?YU8oI``d2SrYV z?fhs0M+Ud7?OEFn?=@oN7aw|a>e+q93xxw~Ha2rB5rI?vKu6UVZd-)MS3JB%nNprV zCGqI>Y>dkzWG0S3z6`i$tjg*)B%(W-f@euwhR+}`jse&_enjzQUZ-6^&0qI%ki>&K zx=4^<7`<-zh5ImXD56B5DwZXl6@Ghg~6c))eK0xF&`}drzxU4CMO@q>ZIsyNsVH{T_YLZ|^N(Q5!0FS_M{@(GFMhW(D0=M@ zMX+p<>f`1=zBSMLn*)T64`eF=(C-zz;7>0vdqc+q1|*(gct0LO%9+QRWYVq_l#AhgK#OGjZ0D?v`g?BO@Ol1LZjz(5a+^}cwKR*@w}-$C;JcRF9=+7_>5P%=7KSaf_clWs5r znPlu}veuGYc5)Axw~gkYvx>{N#gG|`Ln)pU?p^qR&?%Jvw@RX=lw#f^?6Gh%;vC9) zsd&uXqoE)xUoH-8OQSLk=s*3umY?@0+JGdxMHtdLNjX+ePCw}MS7yQS$@}{uLE6c? zZXB|YH#4TJkkQhp_Qmeb3x*MoZYhU(6BKi}AK1ApEvBqWnJG2c$S@Rp+PYjjp?#l9 zzhlfnAB_Oq_dIUGVVB*;lS>Lvdf(^vsEx^Gt1t(ko&2=%0ba+w0iMT(eFFQD91}ar zzICGs!TO_(!H4Q5BHT?tF#F85XEmqI8}_2Fvl5^kIXj?!Pu>wx(-$Wdh9Apel?Y2U z>Kz#k2t{Loj4#UqcTFJ^(~?NWGL>;nX&T9Qw`kNw0a`U#2&PwZd1}>rwf}lSu0}`e zNf7^MTEO5_J8>OsU6Pu;3NOg!lrB6>rf@RX5s~DlA&0X-YDdCO$C3saweQ)_3HNr| z#L}h1Hb%?Ir*B1Cz8y(;N+l(MN~w(a8xu->gV8%csu0$k2htvDYWpY6$AlZf@Vp*h zU`D!FbcV?tTuPBhbjl(=G57-^iU{9P#FtHEicEHg@I|>P+`_f53r@V#d9?d+sB-wB7;Nr!FHE` zFyq_?`$vxbo%$d%hv8jw(D-(Y@8!HUXx`L2H-w0VFI^j_#g)K?*+bw*5pfcaY41ZL zojI`xw8D127#E~7owqg~JIA&DEQro>m~DmrE?WgZk?r!m2jhpjRfQ7^RpIcUPbS5o zacaYT4jenW6Z!NLxDGZLzV!dTx3(>*v+@X?&KR}avRB6fr=GS6h=UC@p&NSESb z&l%*^_fXX4Hf7fsw0$@TE=@=Q<#)nf53Y>{TXo9FoBxIrger(PfhEuboI-f{-L-z1Zincge7?ci6 zpn>c24svR&GN}Bwu#k~gP;Mw`rHUp;b!AFI1rCsLCqY{(hZaAEDtX+B!9I$-t1TOr z#C!LGJLW5HsChAlkA-`&k)0YfRlDW05z0`O32yw@JvCU)J$8C?0); z=;f-V*w00wl`7F=hm=8W3^+P)M+(oWHh~m{7n6ZCgyM+dlgTWx8iOhTv=VvMz8uDG zUbEgh)FcL?``#o#Zgw#`UoOZO`3#@No`2r&E|DXJJ0Q9Gg0#kpEE^_UaYqE6Lo?Je zJg*TJSluuUv^3+ZYc}j$z`9l10Ox9IGHgZE5QhS)BZk<( zngh4Osvh(|(v-sT^z8pXko`LY|MSrLGO%ptZUEPv%OpNK!fG;PnN8*Hkze(@4~I`%{Ah zxXJsBUS17t8)F;llW$>NYY0NcqDM`Q6gmKdmp3I5>fzecP>$yBD)@P*2D+nnwIKv= zaPQt=yQ^0Ny&6E2HG1@GuZK4FZ8VR1Lr{A~!PNSO5O+#A&uAwvVY_{aBSq@xZI^_6(VLcR=Y!xS`y6=Yd+J>xQavy=27G@`2a+T8YNfCxCBqG9l-hF*5kP^9gec7IT zmfBn?x#h-hnaY*LCKm3S8?zK(u+^lCh6Q(pESz5~jZRCLd4no=;J8|Y|-oVgN8ZEu6*5ysACMp4kX%q8q)#BC4E4J;7e%SBU$qJ@lgn$->eP7faMyt#+c zq4`%>>tx%OlC5NwklqR|{I7Qub?&B8bQ+FSflA_u)F9C_BG~ccqd-RjOF(N5_ zupy^w-@{LI=xh_mr@5oyr%yJ67XLaQHw|ZKYibSIQAtu0@&^b-KYg-UwD_0e;hgWw zBrrS0*JgH_DcU>$-skWuw*gnyscC6tvrEoAI7ft?r#PCl^RPk_Ex-tz^y1}yett4v zj8EC<%bw4qZR1M{643;ph(0A$V#66-kmAkw=rsI-Av`k#jl!oUphQxM8XlJ`X!9dv zK7anvh^24gN%v38SgECoiKd`&MPidZYQteZN78y!&_Jbv2T^00y08{IPau=v=*ST?7XVK^@!59mh^rFG#kOw=d-#{%x;zme z9obWAHgDoU47nk&vaKTlp6K?)cJZ`F_ukFF*_fRHBa|wkx%jNxl^q)q=L@3tyG6T2 zV!1?zY?w=85b?V@lu)FAx<)wSHZAmx&%xA8Y*pV-yQu%g>QAfHanAoz1I=|AKJC3i zfPY`1c@f=4UFM28CG1J;ZX+CrFf5kY38sP6Knj=W9_4^-lsf`%D`pcLBBv_pcpo_7d(lDJ@_Nb5FaVPFm@FCYNT zZCUSJ+rn2S zptFW!Aarfpn!(0K4e<J@|@dP$xS^{-^*vy2X+aZ8yYVN1x7k6crwS zf43u-8qtv#JPs=#l5a(JvhXm_$%WJPL{t%X0Y6)G&5<7}qKs^FUq(kx1`!_djnpDC z8v}y314T&f2m(brc%CZfTk>vb`JpT|13B;2l3_m`tQPZ50%0qr{Fcq=Ll&1Dtoe8x zm{p)7yuA^1(}|3u3}eAa@9IH&|IE(aE`Uo#i?2`4xar*zu29u%@e#Y2p>627s>;a% zBW&o(n*^O#-gITCjKhH-dq#%m)gXhUb{3FOI>V65d@5eT%&3lW*g8DUjGTg>JI{%k z%ierUc7S3!`U@m>8!D_8a8e>K%5ymsM``+>L2Q-f9s{#Fmi^0Yn&!U1T*^li8Wdja zUKZi2`HqOw(ih9i6h&?-+jFRAa*ZaYKAex)mLD2*3@w$AuuvAh}^I74);AHgKiW%7$_ z{DSl+kTB`<%!5I*#bh78z9!ei8xka_efZ&!2oRrste3hOjoEwH%F)B7Qh>xg9J|-S z(C?D?YYJY;8|ZX)MFtO|&n>fA(ZKg;AyacGBLNKi4Q<66!!j&?Laun-4`@EVB3$Pu zpC!@}I|SdGzdfX8?VaEJ=tPYkE}BKn8%VHAINxn5~=DaMri$;gAU+PZDO zU{R(yZAN?A&|vyTlj%1ZYiKmgJSJf++o3v_e=bs8(_TYo}VrUlq0J#WYQa|utgmw! z81&d^qo40NbBEFoee(?|cNpmG;={@L>{QXh1YE_VlnaWkQC9E#*MBW{@B-1-l*^j~ zIRtb(_`h{5Rx^>DT+L2e=Oh(BC&7s~L!r#(AEk38`f0$Km|97rlv74QjC#Mw@t@ZhVIe}q~<-R-&!Bvg)X0xP0FrJ%>1W}9Pn5e z8j!nw1Uc}PF!HpEG(Wx>lZ3lY#@pTAE^;(qTZf{Z#-+3lHCL3y0v{~Rof8YLJcqdQ z;>*$TDfEsiTRowOG{yCLyZTkWyLSM`e2n>MU_OojIW~`x-M}2Ori>HwNg(-* zU7jbHIsdPa7Z$X$wT-?x(IF5zay~{uMi>8aK1P3yrc`&c#Y-#G*tz}ajFE<2C~AtX zyNaZnFK}EdrhN>pWuq{-I6F)ZcKu`+HVKl*Kx3j@?7^vd%e4->EHhVGf0uVh8dU!B6vuE zc?XU>kZ~cPM#D^PD;pajrXVy4!Ihut;WtgZ7*I&gaX&&k_vup*j4)jBVP{9q1{kXl z5jdE_Pt;aIHq1~7H(npTY4*7l+Kh~a!i~Vxi>-dWznXi+5;YI~5^;E0Oz`$#w4R3# zD~LrpXEbyGC=ybk>xI~`3aVnu`n>rIemj{|Li{)#Ol1(QO9$k0+x~iMYb^&4qFUg_ z$m0NuxU<9gT*7{khp*Q7VP)0aT zEAA*muJT5r>{+Nm;l6ANQTG%D5SUUY|IJ}j&dV@{a~#dUaHcULshr6M?2pwqX__~Z zq9M*l-J3?TF+oEk7!IR?NU;*TDPW7y;|%wD7u`_pkdy2HgX^K`8c4SeS=`0jRs_|) zVZ{vtM}bxuF&94YA~{T|bPMM+c^(=YuUR4J+i%6Hx*KII26d-Gsf~PVGJ$&l3un20 z0fe61&pH!%?BB7m$Q3HHoW64=Mpkxq!L`-+Y>!VDPaFpy#T#t3)bL+&#@>XUD@RC7 zYvy8#aegc0ltpq~441uPzz}ap7aK+c75;@g(r3_g!dMyg<^iC&33S3_&dTY}@t$`G zY&qy9@mN5U#ir0mnJ2&Kx7kC)WgyB%^yqgV5HOo82Ytn!n2={;2TVuGCM$gnDwlc_ zp^+a7h`|N;ee@j#XBp<2BNXH)UCuuVp&eLWv^SJ?r{Ou!UfNzrh z{dsgfFt!2Lg*7K5O1QQY?}6iSfr53&of$)qvBk$Lm_zCPE~RTcWJR7m91K2vq7e@5 zXl@E+C?2Y6=0@b~OVkg92aVyte$)K1MvsjG7%5w%+Krq$UoW8k@>MNgd!YqKT5Y#m zgMVu5bUcDcr4|eOj!r|N9nkl3OjJ3~E#@*-1+F7k(3FoUK9th~3z7vHI*BDoqR-H+ zvhmiG=e(iyVY2DR-o zy2h%7M}_ZPfEnysU>iCAoyTF!LWP643VLARwhpGB6@$ka8Fv*4{`Wf1ul9%W)=3_; zvxei>{7}Mv!AX%`S}1$VS*fk5@i3Txc&S0I1%P^A?}K^1rLbdj9{}W1i9A1ybx(jb zaHgzVp#iRq<)~si(Xf@&hlrOwE`n{_bGDRuJxRqlBuT~>_+)e*hSy%heBKs zPu&3_U*eE5f#nHi;=VboYTV{6F4LC%z%L#San4mvWawb163RXGMrLtDf}eUgb=E5$ zavs%hpDub&7n~1hU{wnhCc4hwE*9Ste=+Y;>6UM8)P>E{F;S7@(S=g>Ut~s|84R_+mE_WtyFy`nnqScxXjx1+JH(`w}>?Z}V+aV!tfcMd; zaYq_&+nJr!B;T6A_>{=8&AGp0U&MxPF7SHwgEt7e-A}XNL>|3o&v^=rJmEqU{CnUw z1u`l76VPp&k=Ie#V}U9j;g}y7^GDXoF>0xorZ7Gl*_*tm&q7`WZ*_C__`rYssjIz} zI=%yr2o>(HVZhOd4@aXm+!-U`gokH}*D}9)$W>u^HDOF5KaGPxP+6o`Nyk6IXF%e| z`A5SB6#7^hP`WB(NMe8*jedPfZkYo8Udat!lb$h>P6A61GdB3w$+1rPj-sNwUof?C zE4omk7%CZ25*8N1N&03U97rc7g7^OFYulEnF(oVbn1sbIatHR_#j@T@H-pnKKhv1p;&T6Y*BdDfy4TG!`?az! zmQmM?EO@F%-Yz)TJ~!i?$Datb)BPt;L* z%sg9n(x%ViiJS4;& zh4rygQuflk*2miNm&vX{BuYdg^f*@JiFkLtS9yDoH6dUmU58(xK`X%9RJa+oIVoIh z!1|CUr_1OQAqpjL!#2b%y?R6!u=_z6)?sQ6vkV`&zZ zU6$U41u2?0C0CwNLHWexl7rhwVjfs^|M*v}jsNm}lO7+Z&H3d9a=F}8ewP|G;Ce>} z-pF6XUFn~Sij~b+nlim)>unkzQbSmqqJ3`BBm}0-H}+3d8&768e;sDRP*xH(<7vPu=aTAml@e3j@#@aG}{ zx!vlo=!yb%KbhmwLNqr|OW!?%mQqhRWcyu%tfCm>`u-6_h5B3wkKXzJJLo`shDfr2 z%DoO|2O@DIEIPehUoHJq{1ODQy~qb!F-?I=4~Hm9ZOo{ zbJ-Ol^drtG?&$6ztsrVXEW*rwR0e9pX~$Stf$Vc1GoHj1@NvArc9ys>r9H93;s(BF zLpdDrGsID9O;^?BHvnx)lA6wuZb91wE-BzkkpD3>ZioxtxIb;8bQb1XilTwpgC9U} zCN;{1^o_Qj=_#-dkuN3PO0681APPmm6@rbg5GdouGLL{T87x?H35s=PBT#;f7qhoi z#aDoX3fm(xOT6Iv;0GaC5s0vB5xSbukB6%})&o$;g&>}fb;!!Zr(e>H~KgcH*y z8qd-6R@5jRFjgczG4}Mk9?#WgamF;m7%{GRm-!@0qt`j~&Zc5p)$&=$IO^^oNu%Q; zXvIgQBN;SQmHdwg>a|PHaQ_}1s_6@xanMa>?buY5&~mRR7%hEA&?y4Qg5`)jh)Rce zlUVxK16$-OeinGpz#}=WW={&N;#paV>Lgl0tT{a&|8%)rjP3d~s5JQ@DwGjzIT*?P zTP?dAYLUs~?n6b&n-$;>SWwv-VkYOHwOaC(yLqjZ{af9q76c z?l$@j|Af4t3}R;Bm*ba?o{P&LUW~Aqa*q+Nt7!wFx-6awr6-)X7$N+(?uTQ>b}BrL zxrU((;I^E6B-{37x+5jI`rZy~*(T%@=)@tP)Zmgg5xk>BEjJW%f{+TcjjzwRl17L4 z=Sn}e3%tc3J$;*MMX8Pp2%}WTAQLPYVjK(#RBk)6v25TjB6Uj4==UaO8f4w2%{AW1 z(iD?(3Wlcl!MkbnUPmm^Jz@Lr+2h-BEtzWGUY>rm@sSqBX~v|xK{D-d^KJ=gARt-J zr_j>Ma9@*ntSa?Kn`L)R*+ObYx?rY&Mrg($Efy-*4;aA4(Jf1r`riY=*iDpWBH!}b zMc6kkXX9WV6>rfGkORsnav_tHw_Ig(K0a{^WF+*H?qkV@#QV%5dgA38J#q(d`EqXd z%No?fOS6yIy>lD}$%Ixj-zZxhyv@Ie```zSd*1ozVMS+ZQuvX&YJ-ekA|Fpbus?&g4h8dY#x%@clG9#!rR;HU(NR&zeNYt_G~dY8Q?*swm6T|vsD+v zw>oFJ6BOp`ImndO==&K^jtG2Vil4`Xi;CJ5P+k@_a`A-`)bUlhFIv`m(dOH=*8Wjl z_t^PLYrfK(np?$zF*o+Ps$A4Y_S2GAeia-);eRkL4>c1fLvj5Bsp5>|dv?|{GO!($ z?2>AtJD?Lhx%#Og4w(GODv|gw?$bWibaWMZ89Aor+u9Z+k*Wqtk$7Ynwb>pj#p#Ye zhVlrSK}NSr4er0aPkBO&E4q>ZqXG#Uhh5jBgHKJV4?B%C}ryh@ivh4SuGTGvvFqj<*g~-bR|u}a9kS_ z>P{wtG6M53>B=U=-UB5gmV*ox-`uM4MqU8q{}$K>U60@t2V$zRu4%?_$PX0LwMcNi zVw*+JVi&6Yle@0MEt~GE*!{nS6&6<>S~}C|^3R1GF~+y$o&UnM(831GiXZ#PsrD3} zUcP;KnMrT?{`Dia9*#invHV5NBAuZPqd!+HVyj$A$1k8XNIb_e6uT(G#=`hb^2>m? z@e8KVNe5WZEhBB-z>>HEADU@u{t>hPP1H$z0i>I2UO}tT_?P*qvKC7a@ObjD+L1?O z*Nlt;g|)fWSaI+al-i@FoVq>zpf->~f#SwNveN0)3@C+|W4P5M!HiS61&-|nmf1>K zjy=3(pgUe%j0<-g`e?AHG!*qN--3R`6%HcxvnuIMxy1?!W#0&Wk|JAUHMUSc_@*g1 z34?BJx@}UjQ64T;og7<5KB<{%5d$Me%RsfkLlh=&FQ-fQjE;lp%FEr)OT~~*uEX)z z_bVw0K?jsv338<$ebKk36E%Mueye2>O1FwVdKXUMz0er9IZ=Br*4!(iD+Y-YM#@q+ zdqI--IyX5n!%d_6P!tBwUuCz&u@{@Od~EiIJ#1im2-;*i>zbxy2fko`px4XRkPq@n zYvY3pkqFMP4~e5T6TMn__{Jl6r`-X?k8I+I@b)x4w|8Onc}LeTocgqaDk9JZXF7qLBG?7WSc!vvZlTD)Xr>csrS6>6V{!i$bgtMpM(gHXFcl62nj%e$ z5XyuKRskmn%@j14%Yz5Bgx&;LG;cJqsTFnU;9)+ikHGGu{l9dMI5*ui-^ao5glab{NaPo}k?r%C4?Q;QgoCB0NPGTn#l$cjhIVl*N01)wwN# z^l~q~8?<>@Xc4QmiDb2Jx~wvH3J_QPPPwOx5ac0)zZ&B4oE&;Mz7$$z%l8#My#j=0OnOU4v|eiN%+@ zv&%@FVDDNRfyVkn<0trw2oxgzAiGLel!*3jB-D)f(Yxe^c-%D}mRuJ)NUQ=JY2u=-*6i%+ls|KDOk0?<4Y`lLSU9of-`!>#8ym@^lpJ(!O<2u$}1%QzmMG&mV!RaA@!b3?Up5gBGZ7$!cwv*gGfjv&ZUiKvPABX7`wB+`sZ(U_%i^#+mUG z4hOgG?I7VIppC~DpFa6tvKvmhEA{;NyPtn_f3wYBLg~}-2ht6xFgRwH^hO>o#^kRz z`}JB~Sm|o9Uum#fOm7k!CJ;lk`192ytO1xLF`H+B8S(6L{?#bL8ji}?g|Es)h0n5% zA)pg*&ti}Bnpfn;hY|PCszKg6 z<38_HppXNyyG`u9WX%DPrRdNoG}+XGm_LS5==A?)dOsTq6N`=5fKQ*`j&F*CLfr8$ zFOhm23)enHeNBW_L|_d*itgZS?kj{D)7gc`FPDxEs)eCTBXO6g489)?d_m&*aPQtf zddjCNjpJR%gy9Veh@h+y1uhjop>|!qmqB$(NC^WSPfnKS*GFQU=O@$g@zAu6K8X-L z6}-_EouCoa?}ODG%+Em7JmTm7{)j>5KRw`=XaqKm_t!r^UYf|m{m#@nBAg}z&%{tB z;{_Yn)V*b%9|d+4u3PiEvR$|_fDJ}a21;hVf)R)!Z|?0HMWZYDn@B>OWF-1Geu(V# zA5Ax^oo#^~VNdg0C!S79p~+69KO}i&Z8(k3FCk~a0ixd}#{yz}tYDvd{YF;`&WQK* zc3(Hg#a*D?;;>`3=&f0MqN?=M31|onQ*>agqJg-6^bS^~Lzl|9HAkk)4fXcgAje;o z_Y>d<SRacC)D-9rFsv8} zKquh3-Ao;rosj_xbSi0JsE=CRG?XT0ku?0|f^X7?ftdp$_&`|(?NKX8oix>+^Pna(K&~q27tz!3C^_Idw~TCNxH@W@<^??g zS_g0zO;2v_mEC70242xOWXjhi0jmu)J>10<9V6B~Ded~oDot3L;Xk~OX$j^YqR|V| zSK9>`xdeyNo`|$|MU~4C$_hIfgHW#It--ZK}f%ZxXkMl-Qs}`V|y6!tS=!s7VizxZI7xN-{* zfch7fsOW=@UqQfUqau?gVs1U0p!?ksH|{o>ekd~kgQ@`Xa(+OisR-Wf+cA6+`WR_t zN@Ds`F;q|U9hA9_*1F@@kSvS{R0=1!nvY{i^DVQgJV^+frX`L`8o_-s&1^q_U(*oz zx!10ZNXc!)AC_G*LY<4eBVe{{S(ECOBg`2DL3G-U%JaU%StcE$hz0F~W^l#Mk;tc# z0aVGSRzF169Co1ro4DZK@^Sm}aox8Y5akjC;hn-Tji7C#VjOmFkpC5b)V459X(;rD ze4YNf^}q<*uCv?6{s*KgQGk54c9IZqXAqwfm6w*>0>I#_`U(YeNa_JVKPSQj>>#A5 z$8Ujkzl(bZKLt~8hrP4geacl@3e8gPCF!;;bT)+&Dyu!92#Elo)}z+3S3mY8X^kX> z^PzjwVc5G3^7FzCafbot9zVme(T)^XQFi@t&l_onMqCfGjcSu~0u?D&xA13(>6GZZ zhFa3|UTREF!HyTsvDkb&07#dU-1tV0K^o|kOzmm`il%4LwpBf8R1fk00jCL8mE!wh)c{0hU3!2`^a$Q zi$+R3NI9x?x0(_+Bs`0Ij#W?7I3}$FXtrzE*F5Gn6*FZJrx;Ii-?Yq7X8{xv4EPKQ zk8!5Z8L)L8azhSDf@@ePBAD>|D1+^$2XPdllOW@=xen(7qS(wB=~3)d>2S5_rSh^4 z(e5PIj6vS<%R68cC=C~LXuv~^FpxF2_fSgK&e#972yyKJWkw#Qe#890u$xvZnJT%H zMY*H>eiIlBg?LA3SPZuT;24| zGw!7*zMH1%)WITu#U*3|Ua3VQH;v*6_tAw-dsEP*@nHOa+9zWYz}B{pK7BeofGq-K zM<|XCjYW#c$4B1IiGT9#A$W3$iyGdSo#LqLiH8TMT*$`3a@k1vX@5Vfum`cHqF!6& zZ`KPN345~44DiqB7AsyLS>dqim$a&o5V?7Re&3BJ{EFTnwlu5Gl))V&t)OdD{_=ka z=v>yH;HFum@-Q*-sLz(J|fS zdDAK97?P?<)VxDphT(-fG+f4wO$Sf?Ypx%Q{EECJ()`mfb$1}L)q^5Ovsr=7^q~X3 zntu;fAD%pLLK=p-`YnP7%rnWqautcM3s+l(s!fU7#N>iDEPB`~V$F7WsTJ_r=G2UH zXLi@@C86OpTL) z%?sEEOl+lBB(*oV$Q6PEoq|DO74RgBjzf2>qAeUgL|>Hotx%@c|AL8hP%gWo2T{i& zJlo7rv5L4EBwF}wq0meNEFk%HMeJ%lOe|4k5p^X!)I_1YCWE0~3p3ucji6NWe4np5 z{CX5)de6j69ot78n_dbLTpk01r^-@^uMyx|Yo$hh zQ2&ZsTN-8l@`0^TLUyj5nsg1Mc)Z?`9#Xzf%4!$|Maya^o|MSU2$QYf%02J;gZPkq^m!&xtJ!Y>2SO2W|&f<(unV7H3mI~b`xH$Hf_lZGU2=Ji+UAX>#d{g zeOjD>RLC}$ZogdG@IJy!WUDeLEbDIy=F&ZhC_-+4L>(OBcnbl?AG@G!16F4r7 z^yMY3%O~LM;;_;pOnh}dTs0&AoDEYVAR|l)uY(IH zMa}XwKuc^^zE9!F<5zDZz+(`qMu5D$)QW_$2|KwZWYwy7DhHg}WFK;%9%MGwUn=56 z6d#DqK*44ByY617)CmPW{!Y2hrJ1_jjG?wo3Wr6woU~=u2dCrAJoTIco2Op*$^Ca> zRHLq;l!*f>ChmjMi%4S%W{a#E6p0|V{TD6+Myv(JpjB1rF!NL7q> zq{2bTCx@=5f_y+7byY&l9ukGEamvX;U|fVKAVYDO9uJnp>6V4_r$iL|RlS`*?dyWW zP|yDak`WLDc`+AOW<2ZS<>me)_7-ZDL@5>m`D0%%FAo%E?q9+TLr;56>x;6fGYDwm zclOx$>+Hl(#deP3y>Qse3~2mok(5O@-*!l%@1e8|f!}h~Q=p%~UOG!7@^dEs9d0@mMy@PeHdm9KY!_YM%=2*GoS>5AHe=kX{#gbel`|5jhSbQh9t8IzCWzlUj9>H1fB z*xsSL)OahN5qffh&}8VE5<^=ibn~Ra_wsz~IeW8CAsw{AqP+que6u-QU7z9xcBrOL z1NoDP#2W65y?%CkNlKMk-BJ<|tcalG22m%)!+#g9W!(8<42e5Ex%!wvPRzct-bMPL zoP+U|U=OIx8q02p3lTs2LipFT9PwjVjyU$b6sdgutNZ`?twFzFCT7N}CgIV{OLzj( zyf9v4;7Nb-No6QqU~QtT&U+z>PyZAxsYroH#X4BgN5w0xK`G}P+)1lxp-?EvbcA0O zI;DCGr+S&cP-)MBsvIvx&Tx>qzS_x3*CR|XxC~+(!W2}$SWRIpzZcR0MM@ zSW1j&X&|#=rup-A^Z8W<@9uSt6nO)3-UY_XHs~ugd3J?yLmoIlRV6YieShJVny;?B z%kQqbW?iMAK~_~iTy+O=ISCDTb;Z&K8_h~+K=b6PTYT<)cjd;8Hb1a+w8%prjUBT1 zX)>JVSLBBe1u%K^zQH;d6|hX|CP|A9>8LR4l@ zU!r3zP%|o+(tMlWg()*V8?&%g6L3I&xLTPT!Q&VDHn_ljKwk~#F;@wr&`uvOu(U<} z0!aY@vb`S^jWwjbdgtEWd7Y(4Qn?sV|%Li@jUa-~1}1TdHo z`t+)c&G2~9es;-8cXiRc*wc$=m+j*PFFu?!$MkpA8@6i<@8qie>_WOEcJ%XQ_hPR% zu=md{+9y}Rdeb?ojmax&-B76I4}OLO=X0HlPvO@untvxHJbKBiUhV0!i;#JYEBMs~ zy;0wKnO|VN9JC#!UR^b#L9b3#z6|wcZ~>+@BlggsT6%^m<--Y8nYRHI4q1Kl)|(;- zgKlJr4c!may;C20(TC95P_5ax)QOs^_T45`@e$p`>CZ1({t%|G_x^L=mjf%H?y!w- zeS7#PwFG$lfl0OeAp)|t{WF095PDGg=j)Jg^ylj?>(J!wvkQLD@lkh8?|E015=MOo?W8s=CXD$Z_Un1y)*9qn)ZkXwTF zg3E*PG&|-WSNj;&QO;)kaFmWEF|jex-Z#C?yixUB+Xy^^fFBaA+X9ox8o1!3d6*@wW@e3&g}Z@K5@`lA?| zRSxj6T6j*UFkz{^E}1$~FL9t`K_u(I$>OO7SHlMIFB$dZjA-oQ#tzY{;)&VYfhdL? zNOE$I0*hBnBe49ScHs`zFl#e?a<{23^%UDL9hiPGfwMa3H9^l{O$_x4>_2^au5~Ha z=|^9uutb)y64w9m`SQv#oX9r^u*Dpe6{z{Du2o^X#$MOH>H3cNF`&b}dj@e_9viwYj72qelsga@X8Hlzlt;z+LP~Q&@n2hd(^JM&po~59u~I2&Gk=Ysf-qXGFRlyl zit7?)%X8;$`fu>Ubyfr_q!H`knW*7m5IOFjWzF>A9Z51TgzkMwo#m8d=&qjJqEz0 zBU)N{dza&bADy(Pa}jN=G1te{`L!(Ovvz!Ne{b(wJc#yN`T?(5o9~;qZmWA-Z*n!A zLq%TC-@gkF$aE`lOmGr=_~4P0s*Gfk2VLE2>8;(sBfuYV9c#is37qCe;E;v|$;RrV z6~iUIa7ESCdkAx*l`r@(6&pTYOc-XhRtJ?uFwe;>U_()kjj83-;FwN`?LR<$G~30# zVYciWCP^+Hx5=k4;TUZd-m^HS8I`w?A+dCg;hTJ5bcd?pT#jM2D`6%9L8Z&EU?NAp z^0d5k6In_gi=NklI^0YWoWM-0Y)i+zvg((!y;ldpPR&3i{gvY-MG*+Dxezed)-{DN~bO zFBa5>m8CVRp<^Uw9)L}G;S=enWOTY1YH#mxNHqOF8}v7K>uVUa=~iqKB(M>!cbl4_ zWuzu7{Fn7UXO=N4H06_beO$vb6_HSc3`Jo-{XtVAt!l^>cq=-jga+Rz>xJ}ZLDA=# zS(RTjj@i)L!@f!db6<%t977^*`0X;0aO$Y?YGv}pzNl7WCnw2iRZ&ESBp^A_cVQcM z3gvfsRAR-&azIg?^&Y{KLu-1kz$KNo;HAcctP3E?$&w1Av$DuqbrrzvRDY7PpsoC6 zA!m;~qo(`ccBb)g?~8#R2K~LfY%P@;Uf8G|%;OkOzZ{ZdGSq5 zg=`t~IzHsKK6&S^)O0KZ%`;U5K^x1^Ao9uMc6F z)eN#FzY>ZAcZ8fFjtSAlAwf1ATx;*!aVTiQQ(;aoOH~Hl=i1#!Ih}YMOj(8aiVZ;j z4IK9c9kaWG2~Kz#WVy32ARp}rmNZs77`80t$-m6&ar1*b-2sXdd!HS40`48CBRepT z0{_j)W<{H54~L1u*ISI|hy-RrmpmzM12fi8*cn;oGRyQHpxERIx_cK?Gwu;RV{k8) zdmXNhb*Qi0{IIz*Sj#F6JvfdU4p*h1;0ND}rHm5e|f95;5AohHFggO4L?r1CBL?`I19&mhnv*y@PZa3xs5ke1NV zBD1?!U%85VW!J;2t(2?7K;|AFOOE+H_t8N!AU}zTEjhPV0!rhU*V+OI(8fJFHl}^1bEr zb9AG~CK<8m^$h-HE5&PcdMSx;S)_Pv{lqq^-PqeEpb~rvf?Xcr6H*nyiiUxb49zex zJ_fM|auLOzW;N|AgQ~u$1b$5167_7^jUq=p4D33y(fg3La^$z2k?`v}iG!~zMt+lD zcaY0lzxkyV4|G38H4x~7kDZ~SO;#N6Y;phW@@n?`7u)oOZf`+>{-d*{9@3ljF3yTB zNWF;zzIjdI`jCENAf6HHz&|khQ^k7+L7tmJW85^-Rs~l$2<2`OsYi21kWjuP(v({x z^No$*4wunGZA5CV^=|Ii+)aEFj!mxdh@oh+@_f3kx!#1QJ_B?B}Z z6Y~1xFJ6D=!G8)&pF7W%c#&ORU+Q+v;2B@6x}S5}i#|)MjIOSj0Ft6KT>jm=O$Gds z5^~L~BAls+!UcQ+TNq#<&}35}Q_H&@zgVyM?k6HL;>bKP+B^jlhZd!eG*~QycZ>9X{u7PMK(&q%2 z7#4g9C}jcTWQldpK=HAZWzIn^fE37zLC+wk{40W-EiID{1zMac8HC=@+R%S9_ppM| zjv$PUm3T5;17JD4wD4igzu2Q-%s7}u@Q;i&0E(Z7%UtWq>+Gnswj7zdY;hJopAO)^=* zDcFO`V0{w7*Fek>rr!tShsac)D-TtSH6v*TPs9RSC11h9oT6-e`BJ`IM*Qg77eR(| zP(0_a*kKbWkS^|pQw=3l~{5Jh=wgxqIl+Ycg4Zbs?Y z?G}mE8lufn1yNN_n{B#j{rk|3u~@CYdDx%h!fl1|n}BX^{ysFSMg1RxTm)8!<5v1j z^Nw{S4VN`MmvX<$N!oqJz^xe(RTOS z%d6AzRj3^+sQeZlu(Q)Gu9d$axc-VAyF*-vjYFBuz2zRGbS{LkKAoMPr*;GA5;JvI zxj-gkgK?yr8+GCtMqx#{*YJ-9pke!H%jLJEzTaDP{Q$f8%gYyb=rE14R4Mi_RTl*R zV4fQa-7(1xC4Gi5Sl-Y)&2vNX1mzu5y8cf7ac6bg&z9z4*8UYsLc-5i60T8DMZ8W> zhM!+kZ5XQBjyM0O^*Xw3J6tli$>n5IH>nEBgH7M%2|V5MKyg-{eG6Fsr$R zD8yE7cv{zQBqTKnY1!O)uPdldF>F>OEgc$#qusyh8Dvf|-0<7P3rmV)Xz<;U=ke0N z&sowl&8N;yJ6l{B>$x_k-VSOs{Ny$RFah}9y^VfU8Dt5ti&V!o_h*l>mL-(A(S;^a zr`f$7y>HJ-Kb4t?!-?NK`|`v?x&NRXBZZ3oQci#ejEav zc-2QVx&FcyQWa;X?MCD5vDDb_?DA?a@VTj*%w5}C=#hRjh($e;>4H0`?zncFm5oO{ zYRYJw^ovU-98BqoK}ELN3k9){-g_58iTqf1a2MTuK!cqdlekPnoL;P9^}6#Zc@SPt zh*+(5ER}Hzr+cq5qoRzTz^RN*){iPf*3{IFTUS#V8Cl<|%(N&IU9Ac)tCuR%FO&Z= zLZ*@+_nuj#%da~Bptx|pvaF*Td-9}KpV(pC* z#v(jthY`{YNLUr)x>5(O)y&trQA9_@lzWUS1_K$zLC!A*NP4#NSc7}Eq+mSnApl67ugDg`b0@u{n`^ZCh| zAyjGqXXMNjFz>O)kifM69H|&TSQF_mBqogkk$#Rw4bHLD8M;|~t!@T(J z@hZ!4>?R&G^-Uiz4zCmq_Tdg5fCO7P-zH`1`;(7v$3K_{GG=vRKNdKbgx9}ZxZ)#x z(0b&1k3ITZ5xBvDbXcDf!)>QpWJ|~xeO=RARC}b{^&74G$rsgAKg4VcWUL$1E&YQ8 z?byV2(j5lb8%j4AFY<5P$Z;N@o;fgSyLYy4l~&Tw-j z3szLwY$Xg`6M}JxkR4M=7z;JIVmdN}GT%eTng8qf; zu+OBTyttl?ulBRl_y~~e!IMSr+^|T?7z%qX1zrjHMvGIq*(Kd|H`A(tSay(IWySKX^`+$7z)(^>_v->7@r!=jU;?6}~!|5yGFaR8nl+PZO z-{R!M7=_Kq(m+b|g*2Jnu(BBYoCn_(vMlF`dV7P!`t%MKGBm$3Eurv~Tqv4D5+p7hO z7B9~u59US9Thf~_Zl_DSevSWh_I}Z|WTj!yA5aAAYTD18#aUsYSa4bU$$14v_1ho( z0&r*jqX*^4LVGm`8Q4j5m;Y7`5?E?@OufjLP`Nl_9<-t@Y#MT5t#9(!7< z;r&(DLk29H3$+U^zcYM6O;5{JhX$9Vsx@4(Z?*(q;%eK*%@*^O#X0i~FAPq`{N$M4 z$N>q)MrW5nNaDD&GY!+vHrK7^b3{9lm_GT=1x6{=opf(cq~RO)&$&X&ZuHF;T_-`x z&y-R3H=reSrXiGtT{g&-*-`lc8N?qv7$kl3 zN4}bTs6P3We#iHzl6~=~7}K*=B%S&$0+_5yGr$IK6QLnNCOw!OT0Gyc1mP&*H{edC zeLPVA?XUm4_T%8^UtWHC**|{y=z0H9eK%wcFN-S{Y;f{kX}5V@022_xs2Br^?d0?$ zyg~j<=?&i#D9}kH9bO(;W!x?w7WY_TKrU9+L`KhQ{amVHTWi$l{fkr0HjOilD!>`q zAFrRRDRPK=h|CuI==|K;(Ph}I?&+zwipLcJV1_g_o5oM8mBq`uLTWK_@}m4z^BySg zeBJVXm8?g+w;X`nUEuqK4$zE?#Dw#~l#Ee(C}yhsrabIXugH2&g4FVi&9#z5bi=3E zC@M)s>|w{l+&4Zw;+#?@FL8Qg$dz4)<2;O(VIJ!Zo%y&WeZ_Mi#Q6yMXIG2saJLDu z48?(5&I-4l$Y`iD9gaw#%4i>2P~2Pc(&bi@1e5E_g4wOsmDH#=0@XgD64MaCWzXLz zPf#(Q&<~3ptDrTD09BU$_`B8Lx4M<_#E;ZbLRA`0=?147ddiim%SnY9u)SmUAy?2b@A3FfQ(qlepAO$)vSyP`skh(EJgq&;pZ zT7)kp{H(V;9?D}BOd2To=TuCBs`7`|3tBOO5Nr}kSLtYK#P%md(Qe#z0ZAe1iTa3R zPlZ#D&gX=4Al%k#t|PW_=I-{=v5b;UbBIAXg?iQ^_`(JPz@NpbiC^Z!j-xEu985i2 zO5h@9rGpDOCs`<`-TEd*p)CLM@~+ZG{Fz(sHIh@eO(~Z|wJo*3@`^@^H>-m|o-D_* zQok&X0jFA)hBJ;@@JBjhgAGhrD{^FjCxz&(yXzP}r#lNMk=exn)&iSO`%Uv1G zFl)OuLm|qcG|7jS=uS9hIpkcr6i+KfM|MihBF0e3jf_Pg?*OSEF5oc2Z48m5!K30r zn1KLgk$(-zDaYq8IUC2<1lH=txQ)b)OXSKss7t3Z$-O7zbh)uE!_z_&6X-u|Rs8a8 zMX{Qy*Y4mJ01mr@*GGO2%psbj)6?;VrTsh%nNXz!n(p_N&Y%_5xOO&meql$8^#aOIMO63;;HG?ZPe z6xLm87s%m1Icb6zZ+0EQAa-G9YM6*h5RjYk z>G$S^#w4tew_be;bl_ZA0Ml8NdyEtL)Pj(zHS+sv-N>R^69z-Mc?+t;6+@0<)@=%w z%G>gI8)xH#_?))G${aFy922bgsNuP2%Ya6cFpSg4P30}RsPcq{3U+5mxe+;0O$2ep z2R^?rF$v8yr??EdLnO4#j=4&fxKX^3s6qo`6j2H%nyf?(si}+Q`?uq(GIgvkTx)!e z+7PWQ0X`WM%MA|Yn3vDoe-)G?K1fH0ux!6slmnUB(gc1~4h=)PEODV7xA}#t1!A`P zb%nsh*?Yb8nA>Xfb0Gs!hFC7ti|}j{u~g~N*V+f0TDQ)8SBUCG{-7?NG(=Domp~l_ z;W}>2iBjH+9pyCEP0mVgYxpQ1B%==)Jn=&UoTgM_xfMrrIoU$|+F4v*;a#RIWXT}G zlIS+0lf}YR9z1qeuix@TUF>MfF6+h-o9djLz}K^jGQPXq`H*G>#Z>l$i#a*FMR?@NgP)LzGMF2*cCZUs~!)UR13G>q> z@5mQmO@+$XhbgX@k8inb z{xg1})N^?MQI}q-?60i%=bTbyLjkGacDti-t;pP6BJv0wqR%Hf6{&m$TO1zq%f(EI zp4(ej7<{Dq?QH$t@(UKW9#|7e#IDw_bZ40Z*rE(BTqk#T;ZVQ|YbMbJtunf@_0ku`;5 zY^rLYW2i~$@!z?LbT~xQqwzddj?MQ!XJBT=Xhxf#ch0Ycsg-h(H{_Rbs*v{yaXKMr z^;BoG%V9L-uYSfh0^9UMoJ4S!TzPzEd>Apu5DoXPr*X_Qr{14=*?osZ@BVh*{ThG0 zFt5JKll$S(P|O;tpQ{O6WA|=MdU?4VoyAwai;WHH!a$DVw$98fOgh?Mj(jw6a(0~& zZ|MGV=Vwge?;AV7+gJMa;M?{GfAhcFkHBVqeDF0_GA3Q>ZiO}TIm7y& z92X} zf~xhS|IKyALorD(lTfWLRLk!^jVgrE8C!Jx!bqV)oqY~af>@x`a?BM7%KahkUEoUn zw#6RBjLEs)YQv>ga`l^1RmT?M(pjeJIEb|hwvBRUUl`<$XIgfNdLpR7hAYzV28m^I z|07KA-%oJ8B6;)m$xpHun<0fxDURQMhMb_A==$f!<_6l3KyBkTm3 z3Iu*lXrx(%N)U4{BhTdguB_0LYARZLY~`u{ zd-u-9U#BN-Y$`sY>pjmOk2{raz~%4{p%WkQ6@DS=VxfF znxq&dXIq@xcgI{0m!ZK;xj1`T^yS5@n`n#?M)O00598XvZix6#w`P%7taG6-ff(bh zFWftnn@Dc5MKiDMcWUI#=Vqmi@xPWQ=Zo9~$^(#i*0o$LQKM#ws?~G2ziZnwwWMd6 zm3+`)Plp1Pcd@YtDGJO}5f@{P6k!?lH52d1+wpY7u_vC4Lj5#GXXg$c9O3?hP^xWv zZ?|+QxbWmO`V(PG3!0?86;Pax$MYwb^9np8iJOTt{Ni|L49H?p-(J@)uRYI28h0F5 zbN!2tEuNjSUR})CzSUJDG_s;v_wirlB6u1E3DvJ0#S6mD4FNnGBLktqyeVhehu4w`C#|aT(UNV?^9cg0}Y2TV2Q(_mTR_lS!NC zMaWhXkjq-L)%x75RKMm@!Wg8PDxU=u_@l~pMcsz_sW)TUeLDs$vNyp)QscqSRsB9X zEBqIK6*iS7ORuKwOvgOmJ?z+a^svld__C_hX-H({r8yxJl z2cU#&Bk}sUqLTNYtKqs0@Ka-kHSi_F)Jp6?SBVOK?bt?_LVCfFm3O#B7Ja}lKcAsh zX|<-!Z#c$(+hTto_V5629`aoeVg{Pp+GAtV%RnuW!k2Pi)GLKBil=IX=kN%t4Hs?oM`t9O z(#0s(mwAxafh`B%w$~7#=}Wf)#ZhQ2!l&!YauYIG4DC9vB}YiSBsQQN9Xq}b0a*sLW#4L$Bz9W@!IzwD7 z9%^GBIoyuoDY(zt@G+j2+D8L+)1ZA5;ttBM18(b#&_cJK%QNjn+XNZ@X0CJu{3{psg_#7mbGSz_Uu5MIz7QBJAgYq+#FbnBX)G z8_9n|ubptPlrnwkdK~i-B85OaBz`-)JRd&;@qV#jd3Vw%VD>lLfNuFnbZ=gREsh93 z>0vw`zp;pqJjy9WxOkAu^y;_&e3%{-Jc7dl-$Fp%4*WcuE?4Y(*^KVoiU)hfMR@&j z=jnJKGeM)ljfq3NUKI8sw0XX$-MoG}M!m<)iU{2po&t1+V`If-yb^ihEE0q)DYobs z#|ig2%#a;@?;ZLh&M>wWx&Mr-V{sYj&Pk;1`$}eI_O};lc|~mW4BRxO&AqK`?$F84Z*Ho zdywX>(UJwST&c}XXwjN?c6;-BPm3$h#+9jH%|0(C^QR`E)*24Ka2vJHBX-~}Q~_3W z05EN7ZvV{qv^Kk&S_euxNs(<=0mMbf_$sX|q4g_dTc7Y56Lznkkttf`u2*iM-{3Kv zD@;3f#5JID5xy0X7Y>lYGpTGm*f+ioNW(50Isy(*(Rz(=i}OGfG zPk)##t~;<-+g!L@TXNeoC3UaQDEyquTZ&Li>26H5RtYniWmbh)&-e9fbcTpb?C}28 z72aYyFR{9A(WFHpZ1MZ#T$hb~+?ri%k-6u--+FP0N)2jFZdk5v){)V)gQIyu^MYrj zefh3glqR!q?`-j1TjiA$ILKn3KE1V;a&0?+JlM?7o8}6kw(f2@pmg4(_MydB*XKLE z-^T6V>-rdcveX$?!HOwe1q;&n$dt0H;cGrC@4F~GQWAKVl1}l777aDAV|lUm_}zGp z9ZAXY^wFN$555jLL}lan>GD)sQX*2n(bGx z4Iqe}2s#f42@B`NLKrB?K;N8J+L5Z&kq*eVR@_zO=#7UU_3%Kxv)*R~tCpS|mqJBz zI>Wy&Fl;_}t~cRCGH#3^ihfSJDT=h&Zw@snQ8Z!LyxYY~Jv=zNaom%#6vPv26n}vg{*%+oZV%og z*kz{yi{y0!x*tqiz+m(qv?~~zutF}Erdp3xx zgj15d+F`dDo1+VNkAxAmUxx4w3`NVP0l49h5asY_j02wiWw+f189pn7fX_mJNT&QL(x_?p3VNgu{2s;Ejwtz) zKSva44lT_E9=2iOAK?gnT2kd_K|q6pG4+RxI0>&JT>&+BzS?1y0nrF9v8^3(8~3`( z3%QG}=>cmX0N$so>cJW)rZZCM0En&%<1~l_80_2CAAbsw^VYmsn^$TZ0TJB|m%|yX zI*5uHeArV6z{<}K&aUpS@t1LxavdEdvC1%(|MbZKI~Cb*WPp}&y?4NzfFF@3f74yI z!DaMQ0guxF?3~IZBfSqDMeG1lAO*??&C4u}&q)M`1!Ws*2RV(zs5oJ@cNmf_I+@AX zzUaoZaK4iI{Q-(sOMc+P3EE~_OmUD z7#eqdb&*0+Ryw3$`uc1avcH_-FmxgDwZ#z34wL|qfsykF?MR^%Mrr4KagIhlu z8v@Arn#_BmM0ZKJ9OaJB?Hr4^5Qc#g?1Qr<)t)`$$0!bDk~FIB*&6*8t#89F@+P}y z>xe&Ui`~SsW+Sb0@I|r+SogRb1F}YtqvwV-x!Er=`rJt9o4&q@%hE-rwPnAmNB`EX zG0__~choc<6a}wuP{4~bDsBn~)n6>>ue4#Y_X4nq(Gg6;yyUTK6AGI~*BV%dlU~Ip z63sU_rktPGru8=ZsyIrM@a5JU4lXp$)#6FVd#t zt%E~K?dbIb(8?oLpd-Wj>%%wQ8~$nHEHJ(vZ|Qf|MHhJYgW;E}XBcfdf?`;-rod`A z<0NhZ1wI-&jMzNjv&utHlmPSB1fbe$>A3xxGhK}ocZ=(^iN_6^gX;SU1Wun4kvKKt zsDaVREytd=o6Z2~g$ZXi&MFB%#umuX2zQQu7GnOjl5_->;A_n?DFrc#!a#^@&P}%t zvCG|#0zbKifPbb}qqftHie)9S9Emihp*WG3p~I{lCd6PI5v2Rws5xF&W_E01eL$QC z{d=*9sxKJ9lSPgoXkcKkWQ8OVhd>j1m?N*MY}QRz;4vxqYpaLJLhD;8^fa9Gjwhq; zt8*QYHi2G#be3^OaH9h7PtF`94aQsC1^#xF!|1AO=VVzdSfLz3vZ-|M@!Ij z_M&ZPs{c-MTDbSxLdrP0$0SRL$zG)m;r#OjS2^%4ULd(%R39lF*)IiG`&fGs!tqlo z6OIOSGbE~rFxfgyn5QL_`6Du7;%jAjBf}eOC`KprP#e7_IKpf?*vZ(0^RQ_+{cN$c zQn`op>Nb^Y8k1%iU=wyx#q`Fo5ADIppwdFBcU!YuEIV&E0uXM+p{GJ$fS$=V%Wgs+ z$9`O%#QMCQoh)>Jm!ujYr)^ue6=aOfFGYyBvJ-XTT!8%G&>Tr_#?RDm@OA$l+@^@> zlfF!JME@d^Ap8jfYCG}n`JH<8_Ice|N6`YD){iOvBbTO)#N3_MupHil)pK2ZaPPF# zh+Xmkt8WK3HA@`C^>MHHEOcoaZv+VU0e=+o7%N7v7|j_IhEArr`CxRtyc%`6R4w*sqrC^(1s@|Y`CIszA!x=H_!}wd{ zfyZ#8tBkL18^`Vw>X>!SYS=H8?}!f_Y^TDOH_Ka))Et=9II5_KmS>j;N2DYJQz?ey zXr8vMGDl>hSnkyC1C!!MlOK&{1qc>6=SNBoIKtU2Y}1lEj-YNdV93;#vYZul-SRdJ zoD~q-aa56~6`tE$gC62|e$^hJsUMv$7lcEYGuBb8@LU<_R%+P0vWmUX_=BO(k6loj zn>vkm**D=d7{y_AQQr&Hrc|&anzBcxV>pNDDV>3&T)Nfm@e&*h?QcD8|8YkD6?`NaLgcd9eA<39L$@(&aT09`?tWK)550_j^ zU`|Z-8soiYbl9D0FC8|y+K?P+9^jj-vQv{BK%})#RNWPCbO_;8JL+k7f3LlJ03ixU zW(af$3nJdexXn4+teZpRvb3Ar^Eso zcjYLI>gxeE;Dp^swh*&z4xHi@lyssKF_A(YsjYl(k@L^w)Seyo@s?-S(X;!tC%PTUtJIiJxhv~#j*6n60T5QL z6nk3_(yh=~Pw=J``6N94x2@O{G(iUVV%+bI?uybC8HdswpP}}J*+h4%SJE;08~9Hy zYDs7RN1>VyYoh=#PylSiiEyfH@urFnnmyfqnj{AoG$WUj6i!|@Gg}Fs=p{n4ti$KT z3US)v=Eu@H!jm)j`i{+dI&WnXMK@3Hf zKk#;~!bpYb-o-z~&msoPZa^9t2DasO5^(1n2kdRu^yZ<4;sU2|#w-G(Bx9n$Osr#P zj@wkH)tcAe3K0XukgSuqD!oC1+r0OBXXlL&Q5NvPWJmNvN_K*5D2>b+F>1@&hF`L2 zd*v_!EXLZkY7UJq8csCn#`k3d3nU=S5I?e@6G^&%0eYQtg|^E|D4G(qD3QNJ-l*DP z)RR zveU6+ooa5|NsS6UP>fD->``v;)$S1-CB06YgiNFQla3V{3DWs-`585i>zQZT}KCM|7l5l(2Ev2Too9_^o z;%7LNh(tBqE)0Eel1SRB*C%7sfZ-((=;x|O7=O}`Jt92IQAVF7{p64KBqrQ^$ka!cSxml! ze8{w~(<$ox!{3$^ZV5N#pougZya_DsNYRT=Irs6Ej7jUvK~hO=)!ry(jlr6g!IFqB z+Yit5_kIJ>Xi@Sg_(cnsz!(DJizl&zggEEch=Q zTk$n=f{p+(!Ra(g2qHtSt!<^Rjty*HNBQaKp7=g-eBiv;#xR?Ph;Lk(G={huZAoeSEnHj@Z5KUuvrxjM0fp~ZEd|mI22@uw*fbY})hq`y| zZt6<*eqTT5Q`j1GwiL@?AW5esga;52h=WA~ZJeg*-bR*WHMXS4b}+H|?&tTfnztp% zgnsrOXN=PqytLN5&zd#sUY#Y=h9;s}JpRI^>vFN}e&abom(wj< z3zS~bN=HAl6;6G(^YN_y`?$_h^_yN8;)y%mEIN0QPN)L(f5N(81%PQ^O3L7$8gT+$ zZYlbR)z{&ZNLkkG&?=xX6 zEWy$se~$Nhdegx}Fiye0f}!#&zi~|Tq_q@EQB*;;NOq)wLwM#Mx=ftmzrUN;Fh>t; zYe*LhM+i#=O>r}<_~vckSq6{WW_Z-{*OL3FRHO#O`7`=(T}F*iF05Z;+u~|_ofuiW zrG~S$gu`O_Z$>rE+_`P`s27AukDmqF=~|3=Oe*5eb`QFj zX~m|M*u-yXJKG?_g^wn&bm2ypTScngm5GZ)3Ci1Dhec%{2ylyXQBxY;b48-9VZ)y> z=PzDvU^MAhpU4I&8|{0%i}cm+qGU3x7jvR#Fe#Xx&Ywff=+SUggo^=x95x-i4zK6Cj6rNZN`CtH_Y9i z(S1-}30AWore!p>gVXfmxj zpS*vG(f11Rj$2Aa{oZP9-o$qaT}+N^9WbbOoUbGHUW6?p*M~!@M&o-W9|8`M4KILQNY)UF>VSNj|7UQh zMn4CC)|+`RaCYOO6+WSH`T>+PWCpL$_#NQnAot7p3PXeZeS+*flE;P1M{>!Uye(#Qg^i&)74ZeRHDSY({cQ&Wvj5|ly^%*iE$Gv8_;%$V}Cg-e5 zqaE`u1da7zJ1SpfOj!cQHAgmXR^jiQRwF^=Ii~llV*G&J0SC{|Klt+t&bB~fgZsi; zEcb--o&d&ALZzz=Fv*ss@;!y9%Ll{(M!{#r-Md%))b`!lHTeKr5x=^Il7Mv^ojc!xkK(D_L^~ADZ)GkK z`an?4tsucFPIqWFjVmfZ5zt#RmfY>-j0ker%eqzg7=R^0LH?2voUP6R9EPdhBUnp- zz_DS+_Tkhpl1Rr0197m$8{gc`Z=2tOq--%jfF7Bdi@|21E5gx)hdzg|j7Kx3A8(6b zpUJy8R!V)MB8L(5meR{O5C|Do4PB08f;QZK977(XvVw#|F&0l7v9goT;|``&>3ewi z^npSeOe`E$={}2;N0XPB#sA~mL>Rxi_vx(thj1QZEEhQmAfP~uIt2i~ZZ+_r42;qh zrBA|T-D_|eAmdKSrOz*?w`Fu(|vNL#Mi2^h|PNzkY zB>kH32i#ut%~xs>i*ZrhLvClAyYyq_AgH<~p)i27lX>%lhxY~6taY7ME>oyMqD(VI z!r4T9w-hSrWILk~aS>P1402$GoipQZxi;GG z#+cCg{d91FvtNYhO=;A|EXks)&JUuqhfTgWMWIRp=W~MYidG_;6#;!PX$i)$(ywWx z@Lz(oNo4^|)LjV>q0{6`h*-d+}*Kap{so9Ass$*I4b`Yk3N zzK@QJ>GKfIGmC1uKqo9of+6-G2p_n0V(M?nTv&*}D?oh?o3&!nJ|pt4Gi|n3ljeWT z-{x-v!yhZD|s%?8~1cx-CZ_3LQo zaVz3{;ZbP!B(f;6~>AX70V1zg{4%sYndX@|! zoau?er$0~-cnMsBPGr`=iX%X7qLHG8poGeJBR)6-D&ha)b=c`j54_Hh91*bF4d5M#y>B z5-O90P>jcq5w8_MzG#C@?+qCPOHk=$XPpl?fR`_@O9)jRrbE1wGzbSv8<>zymjlZf z3=p3qB8z7YyugCJJnTW9 z{Bso5E`1@8!qPi0-Pv3I@+hElBv_wtu+?VU%opcpqEe*k66NGkhFL_X%q8#@;NlHKV9&7PTP=cRNX9wtQALO;J3iU4*D>m%8&+P}sR)$1Tva9f|OjcDp38VbTpj2B5M zUv{5kk0^?M+YrpfAMA*<)pmx7W}7`xz^J)e0ZZWdn(#N`hTc?M4`b11Qp ztQ$gM^@l?9py5`;d1fxal&b)BNOaKE6E5Z(=nO`jU$T0VnfU!t92&a)kd>>e~V;qh>r*w>14+1qrs$mGCTWdeuc5Gk*cDL z7|f0j`h&yQsew0i-u0Zy_T6U~+gocs34Oy`45PpwMK=(G8`!n&i^G-~u`%$IGD-iJn2 ze31&qD8e`cJ3zmoGex6nxJAm85j=$dR6;zx{^~0$6Cx&gndKl5Pi+LmWLQfpwB|>9 zjl1P+tgP#6%4~@(4kl{@0_&2pVYG%X2Fk)mce!~+O8xk1`os;xUUZJuh#H$&CG;yqOZcwK5HlbbP51JPaRi=yXLCfh|sf*reT!Np9y#@Mq zSE{-Ra5}EUu_kce6Z>J_-P_mm#gpU`t6XxMG;MOq$z&Pe@1 z(OGyF6Fgwg??)(bWV_Ou#g#Yi>!2zd3OXFGl+|bMWD^@Py5gQq-FM3<1VLDZr@QMVI}KE)L;Wzpd@} zy-_YvHH!sSWdKqZ#9*_3%mER?t_Lh_bOF8W$^{Q#ZTMd~339__%GwQ1E$|h-BdbFRc|HGWa}nymced zp5#?h9x_r=Ttw)D3N<6m%A34efJZ#xZmR;JoOj!Oon&uBFw)irV|S7x~AA~h6f$*xITb+8tq1!y16A>|G0>^+2?{V>VXhyFLS{ zbW)~$m?SPt!1h5#MX`ngRX9%#7Y9h86E$~oJLyrcW`7ANM~*F(ZM@~b&c&JmVboS9 z`Iz%n{!>&@WWOU%E&kbXf-uRX2xk;tpKuZ%$C!aua5-e)FyI13$3zKXrQo3VebWR-v0?Q1u_(!IVV-N#Y;r7*MB2`YKCLc*4Droi-Mv>tG%6qdta9-56&f5tZ%F3`Lk`7iM3*FdAD!T4UMXI4O*gH5r zuNr9R4ms~UJ@wViGxLpfbLTY4XnTwPKt8s_*EqlVZ!$5|$5&TYD8R}AF}e^;B7Rfk zcklFR5ls_B<^8_4Zr$=$I6MhIl_)%QiwO}1Y5G}G--2~)Jni*xl|`)AFM%x4>v2?Q z5jesvq|YV_u^M9dp11}F3KxMm<0_z!+fUFZb30?lUdY9%vKOWgxICBdlnss=kVf)o z3u7gj28Mk0Bj6t2omEZwN+BIO@Cvb&v0cKU{j@LOFYQaerH5K=yYJgmt2J}1NFGUissuC>4gnEL$08(cxTQOgGP!0@~S{2kjnx0RJ zX41`PbJqdq8d5CX>Jn9pSpk|0UVwQ}D~grSjUk594!K6Ack+hYGC31eDdowS|OoVGG7(0o~^+mQ zI)OawJJ?>v=UR0Z582OWH%|)}gytElV}L3%D~ZvE%UR{QSnPL@P`q0zqsYFS0SLg5 zc{GW(uTcDHj$s3#g3XXHksC$u^LU*Y=^=iFLu}7F+0gjhSJ1w0REZ*a7Fm6ef#HDG z@Q*J3a=-;TsEinWY`F3B3Wh-=pm45h#h{gj)R-(`9zFY@#~~OS+Q-@FN9S|JL@(Sf z=c1|XHea>I0i7gGE2DOck%a}1BTf)Kc4}_1=~GkM(#9{+b zEEYCuf&*xYgCR-+)^wLx6(U01wT1M}tY_3x-rmnODOxbJ`iB*)`A`A0*fq`vIdZoSbV$`r^_y>D;#g_<)?rg41%;LYY2dKN(@zktelf z3hykEuE9n^cBSwp)=c7CBj9D&IDh|0e015ZgVO?c?Jti+y=R_V5-*0o@HV%V$uczF z4yIuw=Ez5Y$Z`($4hUNHI=D_3YtA;a-9y5JOhcpAWvXo;N&L` zPkBla>@Ec>E#mW48rDlcgeyKeoJc|gjYV^ODmItmWxAR8=M15qYb z#(D5~_d)?emx|d)JjJUdgoAknb&MU82c(bLm8OanSC?sYivqShb1!wr{0aj2ZTCLPKG8~mC)=nT8J0?Eb>Nv}l3lf1!HVRR<)qyFX zR;4Fo)g-LL+6ZoRd46%z*OqJ95SxsD;ge>w@TxK!<|97p>12pvEUsgO0V%zf>2IeK z6JsdVE~Z!|i`FE9Xw-u0s3g~aqGO071mXE0!k(&3*o{k#22Pu^jAFAj4x%J;P-<3| zigY-Y-&XPwT->P=<$#Fox%qAs--V~9a`(k|>A4w9^{5-3q#8Ip6yxZH%d6))kd%j> z5305uA6n=d7}P2-RdJ1!!fC*@mfpT2ljg{?v~1VH!2QcY^ES3xtCl8G)26M9GIy9^ zzOY6QTdw-GT4N*D=%FOfN5jtnTM-@{(FE{&ZAPS3R8v8T*tiCiC=S|4Ao;>--$LE; zWCsPQ7;#;@uYkYeA|%U`$?QMgB_Gowhp!mGU##f~#|(swD6pIXM4zM4W6d6qCu7Y+lfx10pFbB>b!6 zm*RDbyEIM`KoC`20q~nJam!ozkXmQklz+f;> zdSTeAG`GqQnuws79cVm4Mo1?XSRD5vj`yokCT2O|?}OUBG@nTJtrc56ElW4)!53m7 z%h%VI#p58i*U@@sQ&yB5-kBK$9Nov-;%rJ#!eZ$#^F-hAdr#GU*QR0FlOqVQReSjVq&FarksF1W67L zZar%AKp4fRoG;JwP=uKtgFL@vayCt0mH^#px*S`4K0TUQoU3NT`NH9yyxfcAmQmSg zHosJ@runovW=*I*qNMb`==mNOoMly)8G!n6Pqbo-bm3A>dl1;SVmpHK z?jP&|mS-u&65V0b7gWBsz~Kj$Q1;UogSi*K3L{Fm!9GzRa)Xew`G=5@E+3Y&^Tvv* zm1Z>SK%aJP&9_agEc#7MI#h*?0h^sq)Yj6*aMDV}{cG71j#*-chSZeWVF(Ga7aprV zxQIy*ayb6UXOf|Z9KvQ(43-aKnou(sA)L#CRnm_zLLYS#V~aF{7)HS`Ls;dIkv07C zzPZvYWy3;LEO1#sbOHb4j&lfR64RTc845^xFxH(nN0MUGc(&(*a!K}--h=YjYJsq@avHl6vU6L>6QVY@z z)?BEQSRz)~2OnNGS_9P1tW)^yip<gvD$pZ_+(@`rKA=2fMJA-WJ}%BaC$ z%}g3t$dJ%FAwE9ZbkmFEK~!PWOM%sNemIyLQOe=5%93@Guq!-s8HwO7Z5nP4qTO}n zt#-5vtQ#$Jj#bwSG&8-)G2!?>gYPeRxYggdT zu9y(xt2RUbJE(n<&4Q1F6pRSE{Tcg}VuT_{{5{FX_E|MxK>XBhp6fm~aV97s0H=j8 zKfQ_l^7O+G_||GM#qF?t<|}Z00Rjq(y=s`(z-12uMn^hsxj8WWlDDQ!W=I5bN~xCz zlGcOTNHkR9cuGF)V)X@mgf8S8u~5&C&jcN}-u&ZYYipB#zUTh~9&QicUf%h1%Owa3 zHCT>kgn8B54w3z0FEZqPa4P1K1^N`SltkTv1*qIb3_(~+Jg>~rn?9i{ELZB`{9r_C zuaRoYj~B2I#UaI(NAVgec2`R6db2EV$6|1%>_F4=A{BO82AT_I*QUj}IV9`gsg~vr z7Fc0*&*mR5wJ1uBTRA-7QL-@|kg$-Ud2p%_nQBLiwt51%i7d~H$;>`-e0Pk~D0T1v zWs`ty3GQICd9#y_+6~ahje7*Xj+VDK8knVcag5t`-rR@^Sbw%4M>VYx16Fjbs>Y0r zpfMkCGn@g)u4@+Q6VY0*LL>58CFJ6d!2**d5K2OYygXra7Bbvp`39ShdiQRVT&;2W zlfnvwMW?c%JY;K*@>qM{Dbf5i%b-d`hMb|;3$9HzC+U5(hzsQh!y#4<@L$sp&_6Y; z|1+c{wZ(F3m&JN|axlViVf_Ka6f6uo|E|}@CnGl>bhCpRT+>+j30iBz@x|b<%`rkw zLDcfKv*}EKS#km-%=?|1#@-@b!f0@7G#<9!9h?rn`=-fjs564Fj{`%nI1O4aG zlW!kB=OSQN$;3krf#zY5ws-@#D!l0d?3sp zDLMiI2K*NO#ki<49S)f$g#OYhm9v*sqRgo14nuA;`ZR|S7YoK#i{OBN4RGM=#Vw@0 zw7Z7%Oty;s4u{#YeBSJXBF+XsgrARD@{_^jOg7r)!|kL{oRGlRZAL`*r+Mbr+MUDk zZ((<8kDzFtjfDv}vF1OW&QI5hSE?3XpYlpz4P}x_i_sPtxMQ*w-3BqPT6|e1CC7hc%XI1$izg+ zy9X!STTxYfp0{gt(R#7cEagz5uItSg%v2%ogOa8ISQ1Fgup18;jdv2WDg=e449(fR z^SE4f9&5CvGbd()^xcqSb~)}URAMHxb{^L8&>`nv{RvM^eMM!MwnQ%tKF4ibSDfZ) zl5<2BWQE|KU31ZzHmai&w0zBsZQYx!_U{k5RSeHTAr{TPJ3hzaHug=&fsvrfuXy$q z!}`4-4%5bi!~0N}1CI5<9QiIdAimM9^kkrf66w`*gveZ_PkdC|M8@&IJD8)Q9D^Oq z+!uTe?qsgqgK_J3r=82Yt=jVgT+3?B?_0Hps3dSs>+|a`t=g-DceUni3V4c$=I!rV zwUvyf& z5t++*{f#P)KocMEio5%*`a9%--kxBG#uE)lNWl}GSrz*7q#Dg{=*w$P zoQA%kp{EmtU*MUxNcc%Qu3Gb3>b7gm?{2qhpxM9h2eyd^2Imh9%^q%VQR{0awnhIG zy}d=vP5$1d%bWU3-CO)sPxOhyoKN`npJ_q`zo!AZy8V4<;CqJO)bG&HUqV9~gc{Nq z{+k8UQoiA@*6|MsTUOMjWFjq$s?ceJWn6Ft(euZ4b4##c>07-Cp3e*Kv$ zaXIvpYQEC?5!YYOj9)twn*TG?$Q$+D-Md?~6PB2aPx1wr4!QODm&3X{eZ${xzJJ^C zr@wsnw(}AfsL7~4l`~DSR2dz0zWcU4I=a{S3#KwhUU763%bL_ir$8vBK03-3&xaiX znGOknbca7)kH74S^~fVLxclwfPVI4R_YTr1x$<;h2*MrulRU1v!fv=S< zQhXIw>~Ax@5IdrU&;rNbzSw|kd|{BQwTv&!2KFUlSfJ3CQeWbt#?_4PyglEVmg4$p zU=N0{Kec8$o9TmJT|kr_%FR>&Rbi+aOK_6)Zg>FYZ>Ks`(Q}K$G>6;{56&?qZQ4<9 z)ga?^H$9jfN?JT&@V?J2>`h0b<3SG>%@1?@zLRK-TNq^X2OlnHQ!5J9BXHFAgW^Qve&G#m!Vnox~yOL$0GQ z#h@0p(K?I!7)I!r%y!v62MF=6FB$ylfrwuJ{g~g<^~B#lhTpqlZzAm2>c%h6=L3kW z03!B9Z3L#G`r$?X0M#A4c*9!S!pClUR|1DX+aW1# zvNhXHuZtbtvzPJgR~IyY6RrvSP5CM=@b^#h`vf3bn*|7ZjeskCw^8j-@%@C%F!&(bML#AsqKdyi!*y&-(JWaNPN@eA;=reAs!p2$;sfn)yw! zl;u=k=Mr&EHO$Z8jPP|4Wf<76fEc@gBEpZ*Q6iEz0h2Uqjz(&4?F59owDW$OdoCY` zR(b1X&g6B4#&?PNtbblf?S=DrB>Ea7y=&-sP=2Zb0S9P?32WJfhU}24Xxv8mT8&A$jf?3L0o6^KvrC}G9_hpr>?qmes(>EM=M-%w zMB>^zE`12W(=}Gvx3rjen(u{{{+z7h7jNnABAG-KoA!GO2!jN;bAqJQH3kY}F1KH- zhx7;86SF(Vpi)D|q62wAurR1irl@ZwBQurL7oVkrSnUKlco3@1VKWM$ z6B0(^NtQU2w^1x21*;LtQ6tn1H8iXRq#;vaL?yytX&^q6&ta3NHX{QAB&KPRI-R@U zxE0dDJnU}>0x=Z#o64od4BqTAPhll~==zpf5aG5 zO+@v5(7qFeVlgOd9El=or0cOKmzEwbElSCuNi|WK^pz;W#$`|Btf_4{azcEs1j7}f z-0P6lJ6;6uQD~bz6A1&PtBG(-hS965K0yV~V5Y(dJgGsE=lz$3#=LRNlFEjHRivy4 zs#!15mXgM_c3?sP_!`Ulj16Ym$)7^=DX;>7V45O?&q0&UaSe*|S%*x6hU!P1hl=;Q zP|_s%$x?4d&urs}?DB|fxp8=b7ekks{)TlBA@ER#_Lc_ck(5Fy1=3pRBn-zFcdzqr zG+SDV3pI~#Td|g;V|9zIoz4;Zabn?I2&86|{k2g1-AJGxO5Lzhoz4zMZ;M0TcHn9$ z#vks77n%dc*uJhDw2KZKG;CgAUgGho$)}@%sXUboFvCF;aq}9JnF|7de~RQwe7Q84 z76Dwfm7%Lv*wb<=O}Ap$+bEEk_6RM%oy@eGu5Fpcdj#-e`M3ztLiMqNtR(u_hOi)s zYvmm(BI0TF-+xTA#$lLJoKxW$l~+9ESjHhQ0?n@z!t<$2Dj^d9<#g7WUKlCss>l;x zeHCEgPj@V$TD^bYm-D_F3TsN9Gv!hXE1M^!o1?HVAP-(Q>;Ks)+z247CZ{nX|Lg6e zfm-!~=07&pR7@AZ_YpbVnTo+Vg#@MV0DdmeSn2Qd3(b7>)NJ{a(~%!@*D* z+Xn+rNUe1{#XvuaVOuA?=7RJ#n`&j6!qrDnzRN*JSLn*xdW=yZ6=m_(f*CX{B1ba{ zn^v`Klt?=^x_ z-q?08TQ4jhTV)GOMU|YO@hN04zNQQp)+cv)@~w&u3ZhUx(xiuCz+L@Q(+Lg9&%S5@ z$`&;+Z_^JXs(RYSHp!R6vmDkN_R+@8u)IfgC$Y-^QkQWUvH3zY^ToXg_>7JWWB;fc}qRG%e>tY02$7Q{cs+=6HpW&#i?Fkkk*ueYz$iUFGJ=!@3j ze=5@bz&?k*lvR zS}77+O~Urobt=L&)yevn)fG6V;N8?}4h|<6<+NZX6dLJraV1<(VxLt_e-0>Im`K1eW z%`Eqg(){CDZWhzL_7shSb3oeQ#ZJ?yGBce=cC=TW{D{O?9RL6Da3Q3{*(vPLb@=K3 zi*YX;`lWIG--FGUF6w`RPS*(ieZ)=4HEu`KTnPpZOh*pp*aY7C$IDxd?GjKyR^>{g zDPMVdb#C_Ra9frwL>`2Ga-^8~T#ZVFpg#YD4rbUZcn49z_6Hs03egJS`U+2M4t;JV z??N>`b1XFNCv_%K)R-QhpG>ZYNUx%mB0w@FLqGQXMLiX@r1<-io<2~{`^oyQ&#eK2 z8%YIT)cKNbiaHwEm&_)P3<63^?OM#$LvtD{Y!Gs?8Nu%?eoLrp+O*GCEjEfu8snFC zSd3HEzO1jJlCArfc9zzWL0ZKx>n>Gu&AiM#RxgKtPsp5bBkruFQjw`7Js_ObHy#(g- zI$^6a%PpbUKfFYcg*zoj{B&28K%TqcIZX)Akkl zvA;4QH~C!b@GJ_s30>gvI85Jwg2-`hO5A6X=-_@`5~&hOyL*4kk|1rLWZW1J=pnKi zxSRVK?;<=KWubPI<`46(e2wt4*aabR>!vkcm~Ckp`2~ z^ZDR8*205BJRvk8bKnbwOe4v4Lru9T0iA{K9(`~Hm;=@6`D}*q`e_$;&QpvoFwD2F zu`_E&`f%F9Nu#menV)^a4iIIwTCEn-@~>?6c3g*9UWdO2Ek#xY`l*UdpuT*D@pqKi z7EuCGR!f`VJ%wUi186UZXemS=1*9qbUzXA%0GLY~jPp@wCSK9$i?wrgweZ>dv2P~G zzVXm*kLQDYrjF5EXlJ>j4ZvogkTl4bgI|4Yx{6Spr@gJ13EcX}e?=>hbKS^gb+gNF z-FOHabyoit-AZVY%=K*TtBhSX3v>P5rPmWtWl4ah_A7 z5?$ltiqFyoDoilc`g#Fn&x5Aj*fR~^8JqnI2p#Dv7Qdyp65z1y$-B#GeNG((7>OR ziY6ilhc!Mw9uM#?3m$s-LiLD9BcIC7qe1;AZcS}o@MK10&k;Socl&n5KH|=w4TgM5 z7Is{?$*`X!!fc$3O`wot-;TeqleqnztR&)Q2Yd;1fJqu{j4|q&Vvsi&5wM z@6nk23qR)id(L9CBSEZ`>_}EPNrtQeaNY|1N$5)2c+da6$#1^XeBv;8om%_qE66_g zcPq&4)o;nqq{eZg>fF{CZ~fz4_LbVihvbw{4&(Vh-UZmo>!Hh1GGz-iW*%JR>e>^t zkU@vvX^%6;2sPUu*eEQDS?1_97rT=OW27%ITWeerp(5;v#;JUB!C*&c_V??XX}+4* z<6;;xKuCb5r26_qnXHhE$UzDW1}VO(O67H>N}lhp2Ga?81S^cs-1bF@pW;vKV5Dmh z_|zAmCO7c#f9FuF*B89^xrCx$e*q?djGH}OT>)1KE;%ud_mu)*vz)&3}?C+ zkpV;Vn8tSn(a{t$3oNi)1xnC)vT0v z;F+@fSn!a?J_7t?Pa}+bkQ|ufB{+nv8bW6JP*A|D@OHgV9A@&Si#xzv#&F0&HVZc^E69!}5SSxvQ9Et6Vz+cpUiYaBn5;uzA55yIzKzL*Wh(yv*X7qfhv+%MsgyFg0Wl^Xcx(bT`THxzMJnG zuE=ss9UU+uaJyo}t#F+TTerFrxgN}yvV`j!GVxGfPAGfW3lSerfjR{N+-3unQzkkg z)!H98dyVMyFEWLzDEjAv6BGwO2ObDyZ~0mcqi^Sk3ixMmOe2ke)1bDt``c5!_qQ#X z7mLS;i$G{k#qDTO^bTOcH4y#$iTm;gYqA`zz}mqKu>K5!Cti(SY&v;_tue&!v%y3J ze(NbK#a5P5y!1jwd;KD}}D;MJsTeq&J!O6lk6%EV$(<$>=j88&6Z^x3wD;VL=gnK=U_Q72~oeak# zxH*e4$hA(0l z3Ew)83>uKZwrdnDjA-1vn#q&N^#h?$3#322yW%uP3xq1*V)Sc+5$u z7Iy~(B@oWiA&4*DGmSj-NLx`sN{rs*2e3g=sd%{#Sr+Fi%cww=(N|u0&R76l2+Hl^ z;5<94|Lr~J5v?%-&ShehlWIibtYdp8rVe=Z`EmN2T{!Z{ItpPaS_`C<;y^4i+uR<( zvr$)}!idUv{{T6vP8#t^c#9dUeQ~2%L2eWVliA*EA1_`Ej*&`wSs7`e@jh?3U8KHY z_qu(q*-A149y`s?c{!|r^Kga<#i9m$!0bS`-H!5}<|B3icDBumh^c~|B@OjcU^qMA zL$#CM4~`E$^8O*7?3Q+v#>`dXu?T;YI)?@p3(|^k5&IyzZ+0^VszBE_nEwz+WpWmZ z3>1AxD&jvZC*Y|m^|+OcQ^FR64P+SduH9Ynaq7*FxTe6$n0i9T8Zcj7ftC#>;QH+@ zwtv#mXtH+e53a7n%5*w^Dd8_(!#MR{Gq;=XriUNH{d0+s<~MvJUfLbmQqWxv$TFhG zaI5kXuCNTN#BPo{Ov40U2k&GzLt+}*-QT>3PmPVGufL?PzclW5ZgamD;foR{EEl0q z?dzch*;0ZE-S81wy2zImVxN@Ou;Yy3K?d1g5R}z1qlO<(A7?9`H2Eu8(TrN*7kl8= zZ7>=}`>n1K#w?TtNopCg6=xSRC4x+23ps%dGx1xuxIY`QcaTA~P3UKjV}meA@*o<- z%g!QJiRj$x*gkTRSflcG@C%d?KKWShHus`BV$T&?@q2@@?|q8hZWAin{j)BDXjJ)S zMop5-jGG){&*);L4|wjU z2J1Cq#}^^Ybq`gU?$*zaAntFY_4`NVjwDUy?%e#$uy@g<1Xq)Bo!O`rXxZufHdwil$pHncV_Z})1I{;k)YoDXj4BpogJk+T1+IAG z2d3+f(L`Y78w+5?Ta@5eDDwO)CoFm~phg43=J4v^q8?t|C`tugLTs@4<0Q9$Rw`s4 z17r&YhMn73qtU)`cCYi}gg^4M5%@irNM|x?-Z%?WIGT5+Ol{J{R+^c#8D)yb_ z>?D+M?UQdZ2B)DxXfyrhDVT2LXo}+S+35PCDJ@>$#uE1Rjm%5A)9MBp$=x z<}f$)*M!EJD0vzmp|-Z`zs)G6QDb2@P7gjUkh z%^Q^Q%Y!pDC5#j4rQ0%!7vSE{{`JamZUq}ABc{&f%!ic z@>)sJTpCEez>j@}BPmf49*9_GBDZgCfwLfvxd3Tnk+}O}+7=I!KPH2XT&CbC1`tkp zZ02LgGUL!p40kkGU%CS^XiM7iLu~yYYUG{v_K9XR*(t9pBlK7FpB<&@5)p<$jFYT%2$W^ruKMo!bRu z-fwuqQEh!x{nYK?l6Tq0-gR`ZH0*S8=oxRO2RFPiOCT>_?$FWMtgA*QO-RpFAH*a5E>F@SMXXoBli+}HL zxlWbU+1;pLsO(nbZF9eK!F+G{d}+fl*Z%emTe{W_)=d5}`%9jKQ7GjLHsM$yi3l5c zFd(UIK&kqZH20uAJY3lM3_w2y!aFH+n@KIW5?h7jZ*r86&I$tpWQYZE zUGV)%S|T`*TIia_H0#m*UcivBBFh?NoskJ>}L1oZ``;&3mlnDW_G!9 zcCiVr4*%tB&`&Dl(UXL~(k3MWj?L$x|}QX&e{Os@ILvCw;#Yq?CJ|;Xz=} zkv8t+IfvG*cQqSWC9Jp*eIQ)lYwoa_q~ei=Ormy8u#|`*PKG5*tZx96kjIC+Rsrjz z5>7naUk#K{yx4$z3uyqiUq@1=>JgVGX`sZhL|Qzr@%@>UFmcgViEJ5I>LoOG8RlcV z6bF^1ytT&m!hnl!O_W>}Me>fR3Gx^sago-iSk|R)(Gm-r@6)gQC!436|9H7^YlJIx z16#BxKRY`juw*V;|L4^|P8(EE!8NOeQ1q`zL_H(?FQ=W$7%U;1KE=%_RFgNKA~UVw zMfapfz_#YQBZX~Ci#25B9o}T?0b2Ksg~~z@DRWxb3;~v83 z>>UAS-{TFww}B0&-Jj4#7H#yk7;{KEg5{7vBDO41ftQ2BF9QYGhy*WC@32hzW4P5` za3!YpX%aF~D+>l3ADCS_%S|lp^DX|fsXw=e`uER6`|%h1ad611?{4@1aeilO>z(~O zuz&e_XY0=Q_U~WpUrO@EzJB+ep1=FE{ma)O0gm~1IQ$Du^QZrola^M{;GLAik!C9f zXfl)+gHiWlCMtM(KJO1Uc(N!#vY58yRaZP<+s{8EKL&ly_7Dy45mK$iNk2a(PUz9} zn0WC7C%jt>BOYkHNpkfFr$$K5$9*ZD1*Q&?h96&^eMHaEJVCo5yvF~qZIe1tp~-*& zRKW+uDN|O6g%CrznYI4GWQ`awYxR$Vv&P!H!5RV)%zh6QeCA+nem5W6SVB6Dq=(*YLt{pnmZnU3R^wpCPHZ0umh zdK_bp{vWrOY8Fl6cm52qy60*?{z#jTY>z*%se_+6@_(BV(0br*32CPc<%8}5MlJRO z6vCAQ^4J#&Ny~sC3Fd&SYv{l^lISYR&&*_b4to5A&+Li9J|qr|)7t(7V((($dGp}R z-^VB36a806H9#vc<2Hkivut*NR;jZy9Bdzixn3*Y7;s_hJKKvp8AzI16GT>?Hl4M2 z!+RMcOgejHMu5JKx1?I$JwJIjn4c~#j)fHe5$gvXA~^QXw|>gW=7@m7(8tfVA8;|m z{u>*$*#+lhi%=&kPF-L2Hr~%JtMY34(u6F;2)3!_ZWEC2kqbF*qO;2s4`;MCA#Sr& zGG)!z@3s3@kwL_TNmUs=rsdWze0R7n{42kuoB3Q7c^Fmd=tUl2vBnEC(!tG5FKkoZ zB>!+KMRgT^?Z(n^@GT@vF9jlGvwjrsKXV4m7YpMxBOz+KM{KAH`P z`nDE9v6d%9FN)38BFb`eg8ELO)};^qRS;6_n$x(7e2qoP()-vjcwcB(#E^9e01O6` z7nXPA=Yw|xf{3mli^vhVa0o0YGtt-it8pZti5V((DMsT1{2$a$D*!S ztJpl;v%zCby^!vs#5A^24*`+)FTkTjp1$k5=1b@&;Th(aW1>};Up&0G04+mAiZ{0<2XagF1v!f0SH=gG3sdA?OoEhZa2MGK!w1tc$C2Ja5U0_LA(g38 zT&LS*7x{RtKzSzz7f;}%kHt;@Y@{KB9(+^GRU#?_2vNbnIn1sBjptL(3lT{p zC>7D*7c1d6qJae%gN}$K1l2{R6KjY>n<#lSd65EUXIns367q1PO33rM6$jt`5M@Fo z_c1$~lbV99_q#IAckR$vTInmr%=hI#GSqD>dV8I0^6MZpeJP9&Od0w(AiPrvMYczS z)~k7YR7gA=$q(igeLZBT6!*}Y*On9s$P6)J(ZlCT>UvW_{ry}yQg-Xs60^X=^(Cc4 zo-sG>r9vD$GsZKroR;J)kqp~)>}!{p?TWpvm~3e4Tu7-0=HX618BaXWKaAu;34d>U z)x!EVe+^vws!ray0miQWh@0bIR0g-KVsCSjku}KEEbh z@12-a#WRZ#Ph?0d$Wh`98Ndi?%UiR` zCZ_LPI6~_0PEYcX8+?rp{w-P0=G-Ej017i#z!v=;S3J-Sn)B^3!^KZPB4ar zNN(X^h&6lpGY}STU1>cO_9FUy6fv?%a-R>H3>YUDH{LHfYL8aLN+leKE}OJ$Bj1o@ z-6;bd^ED{+KM|khv>PN6te7tQ-7YzwQbIM4_QFysg-G+_yj)l=Yx8!1VRn89W0~gI zcT%Qh3nL5}A_*xQ?W9%@jFdj92s4wI8ydl?UEqmm7J_F0z&eY%+?l+P9)?;d425|)0tp+ffxxRyt+cW zK>R`wTXlk^JUdevxxPupb45dxlJ5tKrYaDxG?14(Tm2yBGfyN|BsFYnfKIP-3B%g)22rX zr$ZV&?LA}%tBe=j6>TrC1x=+p$=|cS1FZ{}vZMSY>XgZON4{W}TG`8-+ zFbOqi-!^yc5BiY{Q{Sl1S?p}@>%EPguXpa>+4}mO}Y+Y>Hvfu06-P+pj z2kf5~F|0G1M36(JJzu0$P|7?7blDeP&U>nbsceZA`o%=KtCq%<*Ad!Qz*@C+n~HpJ zmk*IcfwFI;)>vnq?TaediKaqBwk}U1@P^<+`yWF*u3wmmCD>NFPmD->BOmkL+V5*1SQ*MuJSR(q%V2LOjpCZUWeJ3jTcTBx63fYJd?qWwxoc3#07AbFEB7@ly_Hv%1Sa!j0 zWJH3(*BNO*>UT5R&!4@VNu_r2tpJ!(O@EN^$%HMYd93+M2zRstOCzyM<-^fH<1B$7 zV1<;s@e*Qg;dIpC{_n%P>daFp`}9PLu1%P#Izx z`t5P#?u3Tn!?NZMNKTi?Pr5^lyj=agZixdi(pEuAIvPj=q^YnTmS|FKiTi5V-TJqO zjixbdtDClDd&Ef4sp>JC#hXaCd@s8rM(JGc^4DGrCm;90ix-r@Gf@Jm9nOsM+SuS8 z<}ZO)Uok1jxxC3VzK|cT7>Xj#Y7}NyG1x+P)^<9FLnW&1$#nX@lX`%piD0zldN265 zd`%v%aBPR;!5RWdNR=wKZM~Yc9z%|K*Bl8)>^OyI-2I?A>Df_S>7A`;8k!;%)B0ocz#|RPHV(spEY;Tte)#;(4V}{r0fvO&E>QN2;kVn_L%YGM6rNjGlNxmAPm}Axd(Gu z?25_)%2}*glK5DrV|F(YLRYqj{(_hwX(X3g8@v}Q!)s&WJj2p2nsbr>Sy6RkaC$qZ zKY2#TeDGdbJbqq}Gii6WrJF=iCL|hFSHUd_E4#>^Mt9|AU-npT86OW>qDZlYRL*V5 z<2|9ZImjFTSYgobW0l<@7dwaW!j6>|0*x99BFW&R`Of{@vIYHV{MA=KjSWUUI|zYm zu%$!p!^edhe~JZNm5vD;h7-b6QOyo;xA*Q$D#<(Q{u>-EjvTkZvq zsVl-(;fx4;T^+03rlVSIwUPrEyih`w-F(;PsNaef4V#q4Da#^f@Xt-x`BZSo!C2@O zTLD67laiSjMYeJKsRWsrWd*t)Es15;2DM3Gm;G#%UzZ>i6J!d$u20-@mRe?RCnq-U zLU{iqngOl#2-r+nfYgX7Hy0mI+@L+Yb%YXD3KKY4DG;rHw-H{!4zk%{UrpeIrfB6R z@8%t6`52{j9tR4}a}eZYc)VQ>1Ht1C_!sQly4b#WbK_6(5WQ{fMvny~*>$o5IE2HR6`BE7A}trUYFhdRh{mOz zymyD`ta#tq5sm4^L7kFBNT?I`p>l=*5Z|3**chJVQ~i6e57T+J*v6z>eK$RrA1ZOR zz!f1uej)x?AIj|F!-yltMqYE@{@`g7p?}FMUXB05iwOVVjHJ?%5T+C;5xWgc6DgfU zB!Gg1fVTV=imAY%^l$)+rPso;>fEm@qCo7gV!44SVg6DW88y#U57AF(<08 z6V;C=N*Swz3uWIB_BtepVQfOWp~^xDBV*85ggjX#J`Y6&0F5S$VSnM;=2--0{do*^ETlmc( zuEd^fe_!Y#V;{U~6T5irb4(?6Y53{9=}<%P@C@WX*|F7S%mpWQ^uZab_)OVsB7}~S0AYD3`#l5=Qv1!yi|P59&P)qS zDKyC}ZA!6Dx}bn0bS+`R{GqjWgoFQJLSI4i*;<>UK#(0s>ho^d=N3O;5dwp9NF*LN zU$OCZYMg3H)O0aamf!Rn&6+PcDWU*-ulJ77s)IQdXBTU%!uW9Q9X4q18Mk(m(dRY& zts?EMiiP10aAY1FlYAU|)K5@fDV0~}5}_w?p3eJNg|)`63&~7pC7#f{h=^v*3JdJ8e zPCofA4i5 zV$0+o`+hJ%KAA2TTjsb{AQQh`7#+c9Mb$NyY!pKur)wt%AI(A$+eDkq@cfuuf$hH! zyiK2>PM@@R%}ap;5eoH3R%Wd}kth#-Js-3H7Zl(2+{6VI=eo0x{xbf$x?*~1LKsAc zBiRM=y*wm9u~F&+b>YT_G{<@`sh01|$`!h1chcBbY>y#4PaI^-xTd7FBNzx9wyghE z4xzY%_}!O#_t}95>?7?+(;4QUh42yK*vY@?7JLWVNO~^YPc`k|nBy|!C6-G=krQksv zU?bALb)!&Vw`m2%_;C+mmne7x$G#H2cu?eEF>Df!-_*6TCJ!(i`!n;h8bzG!RTaoN zhNGc2!>U=8S0r+*bcEGo2MK%{Yghx!974Acl=-7CyEb==Ers^>1wd?d>khI8xrQ}& z4PwOY?~-`w&RZ9+i6V^F`WKziM)&@Gqp|S@o4vXC`VOQzK4JGey#@~bNg`*THg3PY z*CRvi1siDIpK6yX8?D3J#t)hy~Q?!U$+wy z*m49&0o66SZ}j4=cn_nl!|xp9TAved=RRS26?voGD1XBR%$mYG>unn(5Zb#4x%7lO zM0p8Z!Rc?x-*2~b=S8u%#8IG}uzzKI{w51^T}p>KyI;@=w(bB_gr$CGKBjTZ zne5^q$)&`@1RR$E7%r2XX5{Ot)$GIW%mP4t!n{Vtww^F$0hSCTII6KPW2}UH59Z{} z$~}iJnY%GmVfSTO-R*eAxE8De->jxNCC z{K#unJE%615{Ts+QSuX1{J0H z*cKFnQd>M0rY*zP@-j3DH`GPI zfQx*+yB*sCinO+yKOG?E0I%m%1@Ntl>z)YB=S~SkMk&{VF`1irV_v#c>Df{x@Tx*W z$R2pPyo)A%oW({xR$v>Xl}jI9O_inZ@R06lH@C+*me(M$83M&p)@=7X@g!7X+6jyc zE=uRip=um7weira=C=_UXS6^+w0BhYl1TSRxGr0ud~BZ$vXuBno8Jk?%&}1Ugt(?&jG!6MmTgwiIjx{HfWG+P0K&VQY#7srHas3k^s(Vlj2dq6&_xq5j)ysm&7) zv}mJTwa(RMA>b61q8R9&4IWw#rsJU_XwR{?$3a2m-n0R<7M7(M1Wp%ewR~Tc9|FBF|F|WLTE}glU7!>A}4ptvC}a#aYwRZu7s6MQ&E%>17e-8ypc1JdisHpFU`~DF7%OSmGS@$fXxM{1US08mGwhX>h&E(u*=CgX30FJO z4$hfIS;x%<_d%lHT9Rass1wKrPY%`y2{1o90~-VKymk z9z;lDT_L=&vXgKVrkbZ;K_tFvv_y~ zOM8LuZtZbng-jVcx_(DQTr+?SsX+H`j;1(bTjsN9FNaZ?kS2ML^EcTS7<1#_qD+7# zgYY*lJi>vi*0GoS>MK}EpH`x+zxwLm3VH@@J0d@_k3o0p=8pd55;Ul%FK3|>)8q)i z8*|Y^DAB%vMJeCExp-R)yVK)$05^{YSOA>EN#AY3pQ^VO{NF2Gy0gW)B<|hl3=b z(QYtc8*ICGF9rjs6hnR2ZZM;ca6ZC!@+CbPf^I`ic{fL?qTc1jO(EVTD3>5L z_b2UhWyG!|0p^08cqb&0P$9LG_1()Yt*`rJqRcfql?Ja1U1L~;o+&2|Ekz5*Wi0n3 za@*XZE~tAMg3b+#q4Fwx1Za6vlmaO$hQVYey(_1^mek`|Vf&L|j%U`3I!3tSx zsk(p!Mnsm4%PZx=Ic+0|HX)~M(ivvStsU9^t1E074>w}MpqCJ$6B*k#ws+l)fA>>6 zA&%&L4TE)up#UHkAR=L;;2U^*fVRNI8*a7+c!kx-m%NO4LvMcZ>AzLZW{#kl7TFz~J4_(FV*2^Uw(5o}26Omm0-hD(v(-%m zEabv-1G+D+>M%N(TU`%f@`as-kRDuizhg%zlfOA$hNrkNJTV8+H2dJ!&VV~`65^!5%$w7ZtOJEteXA)<`0>pX^KQL97lyRFl|D*x&Sd4@ORa!;<3E?*5V7iK{8ZqkHUY*}2UBqYz z^e$O=9~E23)@)yhWg86gMYqfG88o5BH|jE?-9qaJg-+!$QT}%81Ql-lHn8LGN<F)ZyAoHD^+Jxju&8_R&Q>Ru3Ms<( z$Ol^eLa30#P(Nggj?ygryPz#(8O?_IH-da>pl0HFB3nxbdJIfU9#Y29*zm8{hZ2;n z)2B={vDe2E(*Xfn<6^tRR&(x@I2DUycsUG>_X$w;q1Hk&OYsh$wri7GYyAe4RAT)I z0_wWo+RPmi=uaU;*N^$9PE$2_+9twZ{1UJtzO)hH{&Ks?3MIfr96nUkiAYhfXjXqm zb(#QGo`sVf0yo0#9(i_9X%4ikLD2F{N=59?8Nd+^2QJ<-4b9OYp9&-p;Y7z9&TJ*& z<$*`B6yz-Nv*L<3KPK5iLT4O{n1he2#q=1hjT^4QcA^1`D7}Gnv$S;qomQOU{fb(f^D0clA2vkH>$`=Lf#Bq#8H|~1jOhp#%bC@@&?2_Z|Z9E7ZEBKmm4fK>7OH$h%*d zd&cfrM)i11`SpAf^N`83>h*k4}8InS5qU_w_6%M0ubXLQi4Q`cVf8L zhDU=8TTcvLEQ3jU?d}Je5n)VtHuu0V_%0GLP7ggWv+nw1e6i8|!|FwUW(+L*xo#qE z&TqQIi1;8j%KTIBpbeGLk2)nnMpX7eb1FSeTotVemstXY%R}4&kTmO0^AIy!!eqGd z&_X-j;k6AxsQh8GE5`?qa&4oWTpyXTf~GOsSmkjbFbym4ayp$D7A;CK8KJtgC@a0r z(~=G`oP||;lvl1x()wK6U~Nkt0PXP zi>H;Exq%bcrGV}=elrSQB3UYe2(CIW1g}UUB&G*sW6mN{24@!Yuew%2p%TTVn~qlO zCq#1ddtkSN(LGi>)q#*=Lj%F*ojKvVpRw{2{4=|(zs*h0-QmxSK~NeuT-%y zLxL7$hz=-Dv!!cG<8t8zpHU|NAa9qb9giMi|DHln$-!(zI~u1|s)=#K$yV!I=}9|K zl)zkvz`cm}@klM5XTlvEZOCM1uTbYs(3)zzonyXf{arClb}!7UJ?dqBkA;bMYc66W zv9&;p9qbC3{(o|Rp_AwfJrZ_mz;&y+MY z_3AlPtGiJmnsOZiZMit8DCw(AyMnC*64m`)0XJn&0^zaKKILG9=>095V97@p#ll8> zNZ3kI5g?|(183wUmM$N}!L+idx=j>sPiO7^!naqX8Nn`5_;O-s&Kcdg+JLZZeYzW$b*3G@*z+hY~_p>vilV)<-wr9T1G8%VXCcNk2hO z8Pnv4Bow?McZ|K6DJ?~CO;d=1h*Pu*P}-{}ti`|rS*fl?oLo*AP^+g9Cntl0Q_@Z% z+?E|~b80lIjMxYtxN3!7O+z~&t^<#zE-5eO-9ahepWK01?BNfa2JKCrZv9+fWb8F~3~u`~!TnSL&g zVQD{d_wgR{wJm5e@RhyGyr(b_@Lyo8g#wP2QW5{@5TRC#F%6Aml$P4C$5&n+%! z+_|R{ag5XXmrX{vvOK(zySv>M?osLn?i4#Lc9g|moJ=Qh;&{8t=-D!@CPgbD+|$j@ zy}U3)8+lcBPNj$y@^ifzE-E=g!aYAR=E-UqwqW?0-{$1}}`3Du5S6 z8X{L3N+p~~uLN+B6R+_$Wu8#Fn9+rQ@#uL7BmxU0-og1L|9+q7$!2sx&yFWUG)n0t zddNCdPYhSCSjSpW@$LLuLrlsxvigrge<~$jL$%~klHW`KcWB$P9RAe{d*vEJmiI>>MO5b0-nzFuo{7@%9a2X2Wxd5g`p*-GQ zTnc?8p@PlA-r87nM8^cxi{ojo_wrgrRfOdm6Nuy(MJIc#QjhdvUF1?+XX~PkY|q++-Knp@I*-P5QAx@=`75(ulHHg}k$TQ5(0Ec&%w5pnpQO{i0+j zc*9ECF+&F~;M^x`v7Rn~D&OU81Gc!@XdKX2as$O>xlfiyb#is(`C(t6unlwaxH^5s7J~3_Z6O4zXLgavmW=xh;5*52s zo)Bm7rs#QcT?peN8AtT~bZ0xb|FyiV+ah#!-$T$LSEUaOrU<7QkZTlNq8sl+ElUQ8 zO3{4rYQ#T4PphZ~lHxUYKShRdO`J>CvP0>%&)a0#DAnr>@m7&P!ucOdBZ1`YmPZ$3 zEYMVzHZ@{9#La^fe1D7`|%~Q3DY~m6OIo%o&CZx4m+MpB=YsqMyJ=5L$n^W zS8BPiLfcW(5&_Hbhcf%cw;TG#itQWm`pWdW!BPo2YF|8g0>pZ)f3hhpEGk{9XmC6F zH>{iOH+0vEN?4`8myrfO9?OHi`scg(s*g}vrppfJJj_iBlW@bx zK2BC_kwAyGBoh9B)bRb3WH{8~^~OenO)NgW`EBsF(GKICtsEZ<35)>3>I%+AW(%h7 zF2UfgmeybFDd}q_)13J7^tk2Qt*wJC%Y|D51sh3uL(y1Cr8I0~?RQ@CMh^Y~7mV^r zf{EwErKC&(m-9|$Xd_ExK-*t_U#`ROZIcvEp$na4)2oAqfi#X}upvuKWWy}ku<(@W z-;jvlwj!DaDHGbb!uLxoqeHV!>?X{1yFdcBqReU>|W0v&Aj22=B@TXEr+Gh1meNgolw_KZiI$ zF3oijk>(o9`nnE7>gHCud~Fqd*O0cr&|?RF&e~X!IQdwVvg=~=-^P576vKD zBYiB}u#-`KY$8CyfRe~ubmT`Oj6xy4^QNv7ccRh504%>UEV9cqqs~z&Go)?=S;sL3_)`gBg>SX^X;mB)jP&RvHV z_@mz74KIj0#76NGF8At6e-%4en0bF7DT6iZ8^L~PhYYtgpPzXHZ#TMehv0SZK?lA- zvWnp->lDinO=GZqn?b*o)L?%=Wrd4UCs?P*H943F@5ECBNbRt#3H{w*B@3YnhPYkg zwJh!dR^CJ`Zr>o7RZ-Z`g!;K5Gm^B;0@Jd;*Wv~NH_Ti5N5uM8_xl?(rK3>A(}veH zdag$|!YKqS5<3jx-evI1g}o?#5zf$HEV_0%9N78m$D>P713F*_X>`SqY&A~{JqjdJ zpthscr-ouK5F$(Ln-~maRF4rYiApKoRg5@sbj%X&STK?L1#4&wtUOR??o<18UN~rc zk@;pAu`_>I=Afu{pUJVy(Sl!y=C6pMFk;aJq+-Kl&4e!yvaw9w{6N*o*~+ap%IsPu2?DCY?qQADHG>DP3D??G zBQmEr=rlWIv!1hW(xVkxpHZC#fh}cWQlox3{*R3Ok{m9Z!|H&@Hn3u|*ZZ8!UeACP zg#b~Nvc=%`qHSI;#5wk$2AJoy5WiOdb{4G8yulp4yNPMpjI}6D^(uX_LvdBhh}LOM zK}Cgum~NL~&noLN|A{I;cbpDQv}M;^tblg7r%skzjPCk#W@+n0q&m4akYdxE$DLhAe`^Brp}! zS0J)Z;_D)Q4#=rv#+rt>B6f3?`!e#vAG1WP|A_@-Z2Ak#7*o+duw|@_g%kS+wu}M8 zuToHxA0YV9TX zLAJp1E1gbQBd$}&82prfp)E|+4?C{7$6sRJ#!tLrEi8gmc{y|2rR?r%OH1RSnil3{ zghl1>=&lRWQ}OQ?XU_(c^XHsqHh57OiP=?PGt%q@WHyq5WPwRpd0{#sRo+HM%gYQD zh)GKgyIwiJ;ldiK)zah+y{E^jX2MR#c*aGeE__fWh0(#w&MvnxGF9s!k7QMU5O;}I zS<#xIs4&uE?s#BSp@^A%*3Kr5eWBVP8Qa`mC~uct-dMXdZC3qkixOqGr5G06ypG*$ zv{;IxS+F|~HXiY7qaoAD>Y|0)Hke9+l@}LcrFl|pG1(|pPN1#pDp{{}y?j1ayw(v% z{!rbMYb}$kfm1@(J7u^~Eq*AMS*XCx1srG#Rv?_7@J3gKgHf>~`j)MOV%%^xFHpT8 z21+kLJ(wep5HWgX$s$?1JVy8pKeeP)EJle;Av4ahdD4uO*ivOUitEaiHO9Qvgb%T% z&E`AOWyw@^p*{L3Mo7+;N~Jrhv@mFOwLD;LMi{cx819>v&N{c8?N&O(2^00N!(-`~ zB70fDC3q>%Nt?@5HC<~sQ9SYxs;ZS%XHro)-zrooq$Unbcrc}qEju3B=O(o!*opd~ z{0irx|ChOU?`tEu_J039&#M4E*^U$hz9f^KExFAH3!Cu-X3S-78xtZxHW(p+B%|T> z-p}{9R#kVkB(NtlCpkN_jk>zJuIs*5t#WqccA}gD*^o-)i~}6Ex2KODJ>Gry>HU8{ zd9tWK@89nQvpiff@UN8r-}m)VuZHlcz#^jW(6>?ktqXEF1o7~2INV`+9Q7!K zZ5JHl8wE;5w%WI&A#d%h?Y$CxQN7d<*UJSDZNqM;I5{jbo`$}%e->3@PTS%#7+nC9 z-$3(cJ^i0K`#;3s#@s&_geRsZ{Jf|ff9H!|)ga(xDs?QbwEIs+E#!U<(j+J1G&>`dsjmDvs zuEfzTJGygb(Trktxz5CUWm+rWj>AnHhq{4dj((bR?@zkAGIg%qJwI+&!@KOOTJxW_ zt$%NFhzJwt#1X-zaIg6f#NY+k`&m@YNq-R1>U{e7?{@lCBY}iu#qT5aMwgjpT!_`t zxCF~DjHIO7hZ;>|Q}z?>PH`HYId?cG|5$Q8G(Pms$kXyTj;vrJC?uCZAi02GfO?Fj z-5OGbnp(MjWLy z4pK!VMI297FkE0~4=zIDUHZwVICCj8`J`vQk=U2xbQwv1(U?qej5ztNUs;cJHc~Ls z%8~pC?ab&IWK2fDDcY97Ig|ONOJBRG&JS;IMbn@E4+0h&W$?>xD0O%$_RU&|0vrUg z6N{RWQX?s3S(RiX-Ijb~myJfAeFu%KasS}L!tILc1&_~&P2oJr@E zV)NPj{K-Vm3~W|pl|p|?eEpt~o+R?);0HNijS}D^Uw*^g^|c1g5DP5P8$rze>T*Pa z4vYinC>g)sNOUtCiZ5hs3FQby0F@F4ANRWub$wHMlnPY5mb_OyiTEk~g=^^U*0|9o zzt@pt40Poa-f3lS`zMQ77<^n&-N6 z)+*V-O1013WT7YpXNFYI%gLA@s-&f_?t&eG+<$j>avb+ghR3?Zx@d@31U0qs>mG7) zlbK1jSpm$7DtW{Y5J%F3{;V3Ma?1-<*8tfyWQtvNF6oY@}zANBs2aFShAuVP*1HK_B?}H9M+qL!PX?c6{3wF1x z^^(%n{$V!m@uP^4=bmAn4|PblW%;GJ`kDd-C57j{o==9#U<`2@WZgE;Z;3hMa&3MM zx%Hsk%~te#9Sd}}HRKmMVedmnoVL|hCF5CeGu>#@&8|-=!?Kk9sH$h@`Z-WHy2yv{ zObzMmoVB~8U86*8{H%@ekWBvVv`J^AjoW5vJwK#E$ha-B zt$u|v;dw=)(gI^oXYN@~?>qaF^pJ$Z&9hlYtJvA+Am+L58*G2D%$V8RyfpiUpB#2> zDQYkqt9n#uvI9L0&ivIizr$3A*|+_>_disBB;N=ZH1fxw`qd9vMHxir9CEo-QeKX^ z!~Xfz93%82r#$wC;bO*$!(Fw4OqvHp>>u;}+_;C#+8_0Wd$sgoGPB?QF;dL;`0{?J z^V5>}|CnUL*xf(gD<}}S5v(u~d7;OlgjF~{@5V%#=xyYiH4@Hc19#PQ2x>DAy_+K? z;TWF*otjX;EeVe6C?ltB3Hbcez`*||>bl^!hZ#KBLYnT*(B2{m7`d}t^$#CCUkx#N%I1uIZS!q}D&*YoU zdCS2Mb%>%Ml|In%L=dvdS4)5WYUzI}l;J;h=)FA8zOPnay{+%Rtz|E63i8|`_lY_^H?8@26 zV9*~__UatY>QoD_FC#6Ds`6>58z;H^VpK5%9A&AGm?TKZ3|zBXw6LhM#Wr3q?ult~ zXa%3z*Ax}Iv0cBa@0-Lne-$l-+j+g}eyzz_%>AYI@Tw>K;+6kWn5B*2EW1$`jjKD^ zSN8Li`KQ9^{o2{?>0Y+aKhge|G);_uy%TUE-|uQA4l(iKZ`W?Nvv4bf$-xkpXj(HW zj)uGKu2Gxh;mOt2e{p3 zdhcvZg0E!rLj2b3S$xqH)A*oX6@V=^kLab!1?#%6qf1FU(LcyBX@$Z9PbAFSDE zf%KC$SRO6r#DD;Ml*{@1)@O4Y0gvGIQiTu&XIM`C*G#j(@7m3N@QBCu6wKvOi|x#{ zRb(r!qg5_NE};|ry&fRnaQ-3?u__1{m}a8HZr3rpKmMx}*?w$@9R7!$?qoZuA*q@0 zc`j`h5EonrUT6zqQvtZ6rjLJte5*&$l!+j{=j?j zu_2LE#Qkg=a3vb{YOj9gAQs!3ncZdIh~l#UsglZp^G)!NhJFD?rgwW9oi5yuI+3VZe{YX)+P_EJ{5G1EE`3Hx`x3{YGe4Bq_6bY+2 z%V<2WilI(vS*7a%bVyKmWrm|Fbc7Q8j{1NwU!o9{C(gD2KBU-=8-Y{`M)@MP3qhuK zle3b1KW8CHFl$NZtUF~aHW7jZkG1}V_oNXTH{d=2?1j}vLY zhp8q}5bt>#Wn-JnEA-+)<7!EORo`hJ#GkK*hx{~f<&LxL@kaYFgi`d{mnWDp`b3L% z+ap;^YfTwU_jfC;(V)BdwvuT4GnOyb`}Y2NtfFJ$Df}?P=HVx-C}&u0hV^lFx_ooj z*e@WuRo$pxI6PlB!LE<~`+Tza~wZbBMpXVR!~QCq%7PrBG^TxS>c@$SZ6 zb}bLZX%6wL!iUoufY=^>H}1){L$cGW>MGWdR&}+0y1NP(3!b);DFAbWwq_vo*(x`- zRol9+u`O#X$QR=RYL6Xig`-Uf5;?iHJ<0c#9b%DH4Bq~|Y_qMlw37@ZSbu{RgZ<9! zxmmUyHO;H$RhGU=+-;ZMmk}L~i|W8;P>?!{l?97R!F|g}>?bbaBXU+g?feyEuzeFM zOZyKhf>FPqA2?anX)s4YeFD_MFVCPu#<4A0*N<(~%3cD2gOndxY$TTu2Nb6FBUV%V zL@np>B5p&fdf@aczi@*vn=WL(C9huMRT%WU9qcEP#SZ#hA6lQR&{mGt&M)Uov_szK zc(-gzXKBMC*<4m_5;+i$j!7^`Z+TexlzCu?yMEQz%>8?vqpuk_`;tC#3sX*;w|J+4 z);CanH=b_=Hp1Eq;+kEZ;rAJ za~G{8h<)fWD4l^|PcEnWN1)dALciC$S`ad<&mVeXr969F8h`c{tYCohyU4A%@=_V5X@^p@8%+`V>i!Yp?@#`oeEq&&BO?2qtkQVE(3pk0*J=Kv5&r{6l^SUtesbV@EX_9cLSakvRf>J6J5b3SZErvCRTwtB^O3 zUj_Y~&Mop~tAjoh7vOCt7mNNdfNvG2E1Q29@L%?aLCF!zqpw(ik}X|ma_{tPw5Ger z=jI+jSEO*Q$r~s|;3k*%3jz8)@l7})OzG}@=$IX&gASg;{(@H`Oe4tQ>E~15z9*4# zJ!%3)&0IL8ZA&7*LXb-jr^X%OLCWRTi2R*^unB7&;!-rXNT5m^-8TVWtw`*`KL9@~ zIFfz#UGIBP0V&&|z29kKj>EdClL`Ur`@NSFSylU;G(sprvScj86w0#TtyvFwbEd8o zqB-Xn(;&A#OH{k_?;PFp4;^>YFD2-_pMlxzo1^<=l)`<4sQEp%*6J)G;lypN1CLqw z-m(6@lY#&3WNV$p>KM86L+58t97!Wn{3MD8wLrdhAQS?}19kbo9K&t}juUu9{eL^p zN&hB-a(nx~%H$rYQxw_rb(RR5la93s#wZNV4sF!Nd>OX>I;oJsfQ@c(1@l1{Ix34_ zzLS8d$&jq#F;z5Q9J3vyB7P1Bhk;Snnx7yojLt=*TqvACn7o2)k!H)lFj4gXZ|gh( zefO-uq1<%S(){IOn;xA-o1stOSk0G*@a&m9<}9AK^~Bl^Ioshvs}xm9(Vl!qk` z=H1+XrcWlMEW9|gPoqxBKBAektD0!#T?U_LvJ8jeir1tlH)@Dr=ad(|dnE!egXof5 zz~9UupwRO0awe6O#Wq-PQl51-MLQ0ZcJYH-mq{A^brElxJU7{g^&1OMbI6=F3s2&ceWQSnl5g ziE$Lt=)bu0Y4n)&2bO{3VXcBZh45u6;wwY-N=2QcrE8d(v1uhpid!NB!u^Gu}8%C0fH;F_8ZG zbDNic9|wBwU^!8UwFeU6UoD!))PG~f%*z+z@1P&eYTW%XVZ@2{1QgDy4mjS|yt})m zTUtm)2YNCsE=6*AHeLN-*i3AQN&l%{_c$pp^nx&~ATizEau#^jCZ;_~Rt)<+gC_g( z6XwT#=d!c;`26zrTzv^~3lZDChOsT;df}dRuR@Yu8*L7jf!bibxAOGE1>9Gud*;Ax zt+3m90(7Rmgi-dp%1wa#*{-1MN%O3Td^scX=~i}79joKWdFD2%nE(0uBFmzJ6ql)G z2Y0yrt-6Itzdo+77V_IQ`EnjTx=#54_iMH=_%L5_&K4YC2=#fYiXJmL!b&eY1v zPIsCnjj76rozIn}4?)a2*3LQ@+vFvctw1!)k=L z?cS9Nlke-T$reH#8ffuh-jl+~70;bs=3Mp7s8?iYs?>=zu|VI(iplBs)RhTSBTOXY zQcOcS>#!m_ig3hzO>Ds_7W|IlkG1#s-cc3JcaHfW+eZtvhv!lyIN$qj9Q;r!mp?E1 z!Sx<`Xq9no)t2Qr2vvy0=U4TKm|R{7AL^+h)5nXO|)y-}0jXf?hHq(s*G22d!&?^raW@48k*u=6ZViy(pq2c?O`d$;>;4>xb) zMSbtFSMl(T{EJ*RRf&7aCnKV)?kqLRU-Wc36Ca~#0fiIKpL36xKh7}qsgaTik%Bv7 zCp~!6oz)Jr{u>LYdJ^KgJbwCCfu-AT>#O$$mTo68q^KkwZMvEi{>KALIkhv$9`F9+ z-SFKfCBtO5dX6*oHh(>4zo3Tw>X8%5jlxJog-Axe(qPy-k@@QM{kc5Kp8{W5#{_(}c1 zMJM6JwrR!q2!YJ{jz^QNWCuCxY_7ZjGglTDeRAvB!R`tPTR|i0Z~K$okhgAhkz}9J?dSpu- z0)$t5Yd9{ciuD!dYqqHMjEgIZ?l?rAK1zm|U+18uu6pVpo`ykfD~?uGrwUm_>b{3) zXb3~`@PksVutjmv%(lK=WMVjmr_9S(P1b(2iGmSv- z0t}*cHS#ia3gr$re0<^jIt8TY=i2-?9Tkh#eEdFCi}8b;VW zeZGyC_|#W*oNU9XST850Bjo@npcvx@MV1=kNxhGlQfngKSd+K6X8}oZ#kg9nRXxiP zHzH^KqFz_w+5UZV9({Oz;K6QV#hwkC))UiB0du|KO8 z|77Wo?j22apL-g-w*nkb4aFv!FB%taEc5e zRzPV-3IS!ni3!YM%Mv`8hYmb?1ke`s10n?CA<1SQf)!vir&zXpWs2o6YZS|Yt%N@6 zp@bc^=JtGm(MOMjUKl_hJ(}8`ZPCBQ#ciW1pTVZ458=i3?d?MtlT!iB-iNxM&FUDu zE5Y2=!aAVFh$ew?#XzxG02}Pt#Kx_2kHF;4sZ3jU7Q!hfA$Q>^_)El(5V%UrB{SP+ zJtoF=mSckF`!WJL&e~PmrJ#zyywSdnkz5Hg$mS1bDV>uOUZ;M2to|@R)#L4=WM6Mqq z=V#4MLmKM*cFhuT&vkO8<1|~>UamYyj77|U`3`m5xMPcqI%56-`GQU~1NBbpEtrik zrP_jsi?H)2$0ku$Z!418oW!^IDvp$>Fc}QSrq0}hKoLNR;aG2uaa?IW$8 z+*w@TBeg2AC3!dsMiYxFSwK!Rdn~tlE8%mMI?imq=}-fUR^Tg{B7m!uV37(%m_CeY zmoO5|u2`|%Bjv<=+Of@MGs59E>631qxqQa~~MVuHI0!QF}-d0gAZ#Mk#> zef=U~#p?>pBK9fl{;KW%wf3;w_-2NTCQK-C0u~OyYAO_OS*CeYVyii!aiPpy&RskMvhpYN%p-$`Vzc z6cG>?CN;f@)2|=F4j{5}!kSQmk)ANHAeGq5qCujl^2yqqPRSxJ;6KR!E<|gQ7!EDF zTudM$J)}z~V&dW}F-)7GLo1vZ-$7^5>jnv%VbYW>C13J)nGvhT0&x#<9C2Lwt9Q%u zPa9C^nUdWEfj2N`*A^8t9tXCz7;&S%236nZgovXGTP|$SF2{)@#t93++5$4P|1=jD z7AzwCB(|Xj!9Yq944gG8;7XmX^D(_{xnXX0bus?w4;B{IYj%KRem{`AIZY=Brm~RQxguQz$eMG-0yjlK4{RA^ zoH!&B?Ciyp`K-F0*(&9^74v3JeO*%}U=WtJ4(dY<#+)F&tS5z4nzZX2a06fw-ig}w z+&C!5YP{iInBp_@xFCfRdDACiTp7_D_9&epp9*{q;bhz%95v`AaY|?m07HGHj&2m? zm+fqwT_Bs_FWVfT6g65m!35V*=P$^5lW)oA#L-K3&wMcLDjfSX+hI1jAn8DbB<>e( z8iA7uAoz-ihC}ZvE<|;ilztblv{3$ab3C7&HpdHD0Nqvrx`<`kp!s?1{w~m{_b0>% zI?<=SEgMiQ2s=7YETY$Vf#Ra+v)0}lu)XRSP~G7M5M8rTYp%{`Tg}yc1RF#v1z2&Z z~4@BwmbMHbZ7F1S~GaupY?fSfIebmf}An&BF zISmZ3fgJB(C4Y*|Z8=S8U?mJVkX~qXlJB6`?@hiZ+Qzo-lD0zPeeV=vko1lZ$VP&k zglL+i;XhUAB9PWE4|~*~9JG$mP4|SeME!*7)(`+TqYq0-7IhLro7A1}uSMW=NE!%? z*r~7}Kov%F)@!!x7J;RO8N0=CP{+Pz3)j;2ZflPS47;!ZnL?X&P?Kk$ygTGd1bF{O z9AygCbK``P9f=j*(`y{KZAA{4Fe~M3>|W*IsX2kGv!HlZWo+(WUfDS2ulhh3Mi}?Z zE+lj1Htu7e`ix;0d-k87dTuk1F00azDw=AXQ6w!Q4)e%Q%JgMBW1(R#WLT6F=>;mX zptJ7^8VjLeMS+LzqAqEPP@3-B-YmGh4&eA9zsmA~GR4vGjQj@P0WV4&=ApvJA*OT6 zC^|9Ye7d!pt_4fDI6cd`r1V!CfieaFPV7QKpmSPZ-Qo1Kd+;=!gFYv@+MIx8?mNrX z9rFkuqG{lF+Nm`TvV-Lt7i#2JG$LQaxUCqCI_&~zv&J(-FnHY`+%ptB6}Zhup9a0T zkR~Na8L6`H-I?5yTjek~ayLgWO_{U1+pYAw* z*@3!s8vm^A-TkrBXukMo9a)hKDnl}d);THH#qorY&qv$@8`Od+KdyofT8fE`WU7o9 z;n*_j+F(@+xF18h>>D0iS-m$4bf;cHjj)9)SPHZX)l$%}uit-{{u`RGJT&x&- zb*?<@^A(`xt>qh4K5-mCQiXX2qixbWxN&z`KO0K>U>2!%cJmTNhOD}WoyHMId38qj zI8l81I^Z0c$ra4xs$eEpF-}3rB!cXO9C?;i{#aSqU*O+no46muGW|ge-351ou@l%C{o@d&(LWnt=Rprh3KiI zV9RZ?`xwIt5V6CkQ<4}dYp~nq9;;KWyaaLOSy~Em*hKSYYRMD~WtEOG^1JZPu~p(9 zgPChw`>$uX6wBWxp0wB{n%Svb;-}Fi-pcZ3Evz}o00I^cB=DnGSS+|~!KDHTL6rsa z0a_Z6WKTI~oUSRF4mf116VMuf(X{cP{rYuQIM9E3VRal}h7VPH)w1E0?$^D&#cWxu zZsPk`XnE{OU8kkBzOyEmL)a=Cw^~5YYQ)%R+mM5rFT23wj zsVK%oQ}HOA+>X>DsHw9T9c}YTb6kvR9LFTMBI`rTE<)nOxNx-PcX5fco@S_^u6lYE z2oGq9QgtJELlYICJM5u=<#iUW?iy1y7P;gv=yx~m-r;e7K&+I$Z>%yes7m5*f_l{n zGt9{kp_36*V^oad7p)c6%h2sb9?}_F*U7^{Ud=}tKVl*a)hpR-Wwo$T#OlSAyx~w) z_7YLld`uQi>7&{&h|;e@7A-B#dnOxsmK}?aSTus>|H( zVB_ZhHE7S8FZG%hjwKTf*}$i@nUl_sByd1W;Q-tb>GH^EGe?!GJS(y>&|r2|Tg6rb zwyo8csm+1u;|kzaEQ}e`3|wdT`{$abxxoMQ{ZP3Tj|o$*G{RHSFCA&5FK{0`)In)l zi_dVucn8KAtbu2WVhmwE!AxiaEE`CY#i14cugse)Pi2Qu%%_(O5xX2|%)LCaf4mOcif^v%;2yfow zcf&AMn!ml(k!<&7@+hy*L+u)Gxu{)aA9ENWwa3Tuf|%SSuMoGz7eGwQjVqm;SMin7 zV!3To&<$CgN%a9Sf`|lxj_Cs>n3S*+5@bPek^&<*0i~j2E6biO?@!qIL|gKle+8N%o8H&l zByN*s4RsWp;xvt7&>%N}A(Pf0LkW*7Ql;jMaa8TshxINN3`x!SQ@TrsZQ#eOna5eT*)^5Tp-(LE7(Yp$4=Mv? zvwkfaGC=kWx)q^|B)mO4pp4ZWy5p%jRMe5lCYSN+vlEo}?vYY3rK(OMI~;3dP8&^E z3Fg8@Pu5{z_53mtAi=z7)Dff(lSucd65pf;H2N5nWyBbq4gnr-NCKkHY(xMgUgAvI zO80eaV}Ji-sA0NFk>}{K-jtaMOQ9XJt6S}8IgI+K(Zd~%Ngya{aADzOxcL4YrAOjm za~=!R&}Q>O!{e@UcTF^F`RdtQ90-V;)|$r#%va|zv+TrC5R|C7f8zYOX73xgk_~LL zFg)A&;+1e;!^8<%lY^D9kUMCcQEAYh=Qp(N6M+vSiu^> z(tOu*tvSp)Ekn?WYb%>it-0=2E`63*l??CmT!^Gd4AZOki4G=hRC4r|mo{@=B?C)k zKrIEJ?kjU-fHoKPH=5(iEm9^D*1hx`u_h>{iYBSNC*_0o{E9Nd#v9+FS+KR2jI3w>CV z$EIw^mUNYCS5kO&RPJXhgF%~^yO@ICg*oGn)jTgg3(*YZJ_lK&F>#HL0MDc6tZM{M zc!{&o{_fEpoRKS|fY%uGG`zAJSfLpP4$ zDC&o>ca1@fOpd|1H31_j_LCHWZMK6^kq+p3si*(*mr6b1=Zz;EGZl+d2B4Ja&pb7x zCd;RW3d5%uhpnbC8a4@1<1Y2wmXW`!&_s(Prr!@aG?PZ-_CO+!((jk`)ada~?iEU6 z$BPD1TBOwuyWMv8gw_u5;(s=VGmAcY^R~WquT=OZ5dd?ka4RVcQepjb8lG?D*S`$day+oZRGp)!I~uE zXR3-xpOl+(&8t~@kcvW|Loo^^q9}*X4)UT)au6yb-(@C_YDtq9_@T z+vlr&?guQIbGV9)$&W{n(2NOL64(Kb4F#beDGJ5qni&I^Pp>>~N@fq+ynMx|c`Of_ zf{8IxGBxA?q9d2d3nUvb%o{ro9k3@`_v6v>{X5GY^|`P(5}i4s33D_c`iQV!tp%BC zHCvx)9-NgIOo}gF520sWW{8tRB{Thw^oYrqa zJR;&tP>6?ou%Nk~p~#WMh}qY|Q#VMTtbL^==ZBH;$orF2DjS?t1|b&^CT zu_C@JE?O>fV0WYpoZBvAhOdRwiI7>W)zD7m<$C%wDo1RWMILR2fP3R7fwW*&O?U{~ zFrIp!@FL!mQPf?`=CW}JihCc|1$CD5%o6}08|(C^4t)1~sF%`FI_<+_Q_rAwg^apY zyFqC*2C(7u>VgCCzLrup$rr9ICXfoN*2V6Ac(qrn3%*EYuT5ABe6m_%`%jmW|cKyGG=zN6)9gRD)3BuC|WvxqHvk#XpZjfK-CpG zW!`6y7^sZgg{=I9a`v(3=~X^}gqH=uG>9Eay~ zw&~(du(8B|Cv#rITRok-jEc^){P~`=bK0ppEhwA8Idx-lYH%AZ_xAR$cGYCQsyqME zkbnCiwFvu@kc8dUpupBbzF<8q3JzX8Qz9^b)|CxBFKeD`*-QxYPYDQ63*fyV&dXRs zm1!-lFE538s8w|pYU`&JnklyrI2oX7VLb&vM1W#x|59Gs6^9nz?im1Rq)h5dS%^+a@x_V<&}j4lU!a`6CsrvBkE1nEhWEZ`1f+s|yoxR`S8KyG%FvtwD1AlF-*AJdWj_i+ms z)aFQY*BsYvq`ky;pv*Pdik3nr?xHSyn)Qq0lCco4Xuh&`9cE8f($5`7a(TE!{D)%unl%FAEcnL9OPgPUH`aH20` zlKE0O8_%-U8qxi^yJ~)M5u$vRog((Mn&B+p-QB`MD@H%Fn=&Zh-u7`zEbC_ovCntU zBJBN%^gps`hD<5P3Q)cT+Ag0DqI!QB)%yb+-GklBy;_r?!()%bC7AA*lcliD9M~=H zJ_vW(vPC4kW3W8-;mvc>-7Oe-^E+5YkF9x@DPAEzw-aZjdCbaeBd)+fk^^G1ku68n z-CfR`=%~qFeV4N+I)<{x)q)tx?lIWdmy4D=|Gw{OsY*+=&$M)MCIKQ*@CWrC*c>Ge zJK4hAw6=+v?DqEZ1&f{A$)X{`oB~3J0}d-gD-39GGx)w;;=(k@eEe=Zc$he~i(jty z0bgwOo^KA8$oMSW)sbe&tX!u++COE!spur1H$Y*SN@*-{19!4ZP8|}udCUc(y=pr4 z`sKn?ELb~!PBffqSoiT8twV2?yoCg9=UyvKH-;}ik(5Yi z$D-2A3DO7210BVtgV9!~rAxSZq9GQbD|@`0?D9a-hE<0Wnu=}ZG z=$-^0l746?li+jwF!)@~0-xh)@KI291fP4pxzwy3d@c=qBsg|PZ3M^ob$)Q~Z-hux z{%@RA1SE_69*h?LHftNT&^Y|G&~YcjIr%_N3?<^0VV;cJCFe^w>{QUy!%ktoFYQt! zfkSF5Nz-6r*Sd=Gk&@x|w^u_2^uB#t-?&#Qd7B6zxm2=|6#fUL5>byC_L*EpLo(~O zKMbQHPyDS`7-oqtllu$^{nZ^K%as#OfK+P4Of7xr_7B?K<;sV=`R3 zN(e}z`*EWN;WL~e}>9^0jC!?y4pJTGP(3&JAYhfM> z%+xSzrczs;hEOwx=xf|atK86kx{~ zFW8m>Ke};W;wma>o?o`+$5-x2t5jM1~(QL z=>nE)V*eC6bh&hCzdq)y;*&pxPqQP^*rnzl0N#Zrl?|NS*`&g8%3j#ljiK4%bR6v2@N|N9rCh9b^FIFVTXF2tS5Qz5rEnK?V<_U(H zu(J7Al7DEA6TYq3LgXyth1QD~IwO2acac<*Gb<7nF&J!!@w3(D){C>{R<_z0v;V19 zzET?ceBO5|l4-Maf7@l_fI*MpFagFMzZ<}5-wl=@6EKwP?Fm{Knke~Z!CDrcF2*Cw zgwkgloK9X~9^t~45>C*KrHMe|1jr}Rj;Ny5+B6eMG=h+~M{_vK zcDPOIy1rQ-*A})WpnSESz6|i57pC;qzDABzgsF{Sjcc^R-c69@>o9{gvY*-5k`YC& z@G*PZ{P;Xhi{l|5ArRVj$z#EWw7Njb7B%s4ua-2SNrA&@y`mjNF)lw+Y_L+Vw04U( zc24^==ISAJUJPiZi-S(ufkQ#$m2oxJd<7(6kE*K+MZ+wiWHTj62@66^nE?x?xc={f zw}cumKFvqiga89@u%)e>EtMe-JTZwB$4ib@TOk=hM6eg@>q05`Rr z5z?O2Bjsf?*V4UA;0@c-YL11Zb@?3loqaL*706wHpX8Gq+W0YzDl@QSVx1DIkpo#C zufCXI-Sk4n^_T)hON8xI+x*$>(RYV_Xd0X%7R3vdMC6su=i6b{yqwrPj#`{$XWRxC zEdylG9zn?E7abqO|@ZL-UB^735O5FUy;R0VqQoOAKS zdso-5w}Z~*N&nOE;o7=YRke#+xpHi6vWxldg&QT$-HrmCQ^KV@5wd-#?-WHd=J0W zpBG>Bk#$ATy7FkNM|g`xHJ+I*Yu{lfT?W)g9b=4=!_@qMxWG*9RoHKV*1fBw#Gm=m zu8=uG`5aLHNfce`NjMWOluj2_x#Fxl?T2;Afg;S<@V`?QJ6;CD`Xz)v-2FjeDt&;S zf%7|9sYl1sQ(@_8xB;cyJ7JV^aur}?g4xvCOislBi3a<>`omG51J@oSU3{xGmOwZ^ zKi#tlB4-5am{PpXPGc4z&R*cD?Jecm3oER})U=AFl@GC?UThJIo3Fd7It=kADgkG^ z#Y0qw7s%G(6{H%JzsF$&a3K+3v7gE|0Pt@U(S3OA=M)oDdr;y6J&;9cI|u)8?}0_@ zdXuaD!z4KG*S9*|V$$5uGG1>;;a3n@PH$~@B9lFnrv=c|@=x>+s>I@O9J8X8g$(Of z1`8Mx8B{u$d5q1TC%nof4cvJ+^`)|a)<~|?tev^XCLX_}AsXciJOAikqq4+}352VB zY)IiCiFI_}tfLoi>o4!Mj$R~&(A+xuGAaD`T1Vqv%#m`t-mVi2E(#Hxv6Csi@G1mw z>f#+pL+QbnPx5+B#@$<36sabbyD*Iy5|xIB9i6nh{SRq`l$R{}t+18Gul|r*fI$ewE5G7;`0{F} z{Xrpj)yheaYkw;>G+XQ?0b(z)jwJ2cEa3EUK7F4TJvy=aL9^sSSC-mjJM-rl86#%c z#$|~W#HC3db6F347PO5O)R3(fj=InfF|`m~y&#Rp_vgju_#8h0w-Ft+0eP*-&tsQ- zGjYsFUy%~an_uO+w$ekX9pHpKF*KoID9!}_H{Nk@)GlhXLq%cQNu8&EmKjvJVLuH3 zUL9lNvifr+^*h$8l&U^@gm*VA>JIEnvkuMcdd<+fO~vBqxifH9-X0nxU+0O24k92i z@q~va98W0P>h}<>&XOqw9DNWowPQ~Egq-(5c$^=o3;q^2O%ynMKvqbyZF6Ypcf!i! zeA0Ja*)3yMu*ko6Fx2ln&(AW|T&jwRH5!<0%O`ASFNtWegUy z+|J7zUv>Um>@xs-gPR{WG5cJK+CvpCsBu4`x6{-(eOsc&9L0-n4qI%_08Z{18QEs+ z*`?70)=mfKfa78_jyVZyc$52-FIMGK{^4!?`+KFP9})p6U#jnu!g!|Rm5!b7^ACmv zmjQeQVPSD+@y&bLQv2*^*?(4dD@#j{`LBC&Kq}~?&e;hW890K$!4AJ40zOYvj|!F^ zyL1r#{KoSh-a1!MInwL=Sz;!~SV-Vhuu05?8LbxlczM+hM1(ls)u^*nx%X&Mw;sKF z{O;!6-Mi|$+Pgo!TX?tpZt2~-cmH_zhj+Jok3ZBa@81345mNLP?rV9p@#NxGa*sA3 zHPLqPBd?Ym;qg08t67*fV^x&#vPMGF0xhk)^V$p$5+T!K!kMgTV`H2 zYKHdVg1awWMIsZaZh@87LvT-}d9iGDV*c<3?JC1X{}sXi(wpMOll~-}!(b?{k@a2K z;9&;@mENJ@Zhqb9?p3l**Ql#(Jy8LL6&^U-MyO9g&c!AU-v7~Wb58$q@Br_8l zWE&btBeWr(r<|Ue$<)x6C&qal$9XY(oS*Bmab3l@hT*bGXAr)81V?cMacKf;4+98K zTB%wCUxTfx-_XxN zWx4WhP_f@5e*ZuI^W8g@zpD`Jko0<~Ud4&GfF-j8RUiN3-Q()gpKAQO+g`lh`%~=? z_@ltWt=edCbyGt8tzBY1w|1ZHxw8~gJ<%@~hO%6NX7KwCwTG*>7_FaUS>+OKA|4zi zq7qRiTHHtnrLmJ3%7_b(Sj`^)@{h-y94VITAOiT-l3}8bdS@F1eK=lT(qmoAXcwnB zYF4)_;~GfH$&XMGZj+ay0)^7j`&B7_-%U25)^#aeFkEnXw%yly&>k?}E%Gh(`ceT) z56HN{F+8YvAI#E8!F|on8e6iFI|UeOJFf}9@xYjCUy(>LS5(i#wKmyuqY6S>(5#Ai z6wg~EbK3IFxsx8MZ11qse;*EvSc-j%8UogS`3DTMx*2A{nUoak9I)2xCD9`}?3z!@ z1p`wNNUBqxpFh-E9TH+02CNOGMEiVg9`kE438T#R3$kp(4@Mt0a*gV1kkqR#;s}WY z$qkBAv#uG-Uvhl%egugraOi+6a3S&jxYKOmNkN)={%0hBXs|F?@&qq^?JH?!R+q?~ zN3sPjKpesb#m#Zn5swTA*r+e|fPgg8_m> ztFJ3At0a>lKSB>R&b;y{gjKGjAQ{cX9GCtgjpwc@GJVCa5%UUpC#_cmLIl&@{w$X1tg+TMr*37uN(wT|dv$D+I4YGf8QezazCBH@~KK(jcM|DiRHX zlY`CEv24~Fo4M||Q80BOSdd1xtCep1pwmV9$&JIM#Of{*E_$UqsKNR10BN=w@RNHs z>a^k3KJ*Xty+&muYEw53(NO9clI6@jebT`U^I#wEPdYj^adI?k0R9pJ9AuigEy4cE z2<-(!4C7(d(F_x=5Jv7F+9>_PRs>nH)oIk0k%kl>Vr7lWVZRHlnft$g{p(*pGf=xk zI$ewE_hbxwJm@^08(wh>?JuHQb41jWwRFyhQG+`rV#L07Am}R$Bn&JJ>vvpC$nAf8 zu4gmnS}gyAFfk2xmV1fSj1&7^S1Z|~)8BX4TkaNJPDUOKh;`DR7ije}-nn9OGpl?n z?^&Gw%o=2)`COH4`DjWoITi(cfaB$4&Db5n?M34CYby3DkftrHX3n|P6bRX&m3a?;KK z=Sx!6fOMhX^}1IqL!|ptg1Q)d!K%0~Z3~4nlEAR1bEJ}k4x&s=yby7`=H~i{-@g*( zFR-G~eXS{>=o;O7qmY6&Yd7qT1VB8JPKjE{q`2+5?|SyC{7sE!n>M z%!g7wrayebS2I7fes-pYKf96gfXyV}Dg~Kek_8APCu_|pEG6|~2}MY>64De5Lk{eG z_}bh0=Dk+)wZuT4Tg^93;nP`f4w-Ri>e_z= zF%qG1q4NB(I(t#Mi}ZxlL@c<|++p^ugOWGF~;sx#f8hcO>Z#Wriu`p~5 zIpUt+z(-bUr!UpBKt@(nJV3btk_MV1`qpySi+N0}Gd^bP<>>;J$pswF#|4!nvzWN> zJb%@=9gyv2SVD(?s_x<&S=?KGceGIB@m)h@;o%RD%?3f#L9H#RKky>0Ll?_vtsWMk zi-i<+8FMI4w_L^dLi@|LcmGB6MXNTNBR@TCxsI!z5ut@0361VgdHZzs_$fZiW@(vi z5O6moXS2EMI4Ubt4E2bEU0Mp4RB*=GoZmH;r)OS_N?yvMiDI_i5JU))<(47Eq_sKn zxLaB2juzJ{ds(H}(@IXRT6Po6-{021zL#A6J)ulFx%xUO{P%`NmD2eNWJV>tWU)t! zp2&%qw!!o}?Z#rI@YMDcUtH+<6S{oV@(DdsCaDc92eaa(tk+S$&k@t}xx=%?;bMhY z{YbP%$DOlIy{xluDeNN2S<1B-9=W8Z@-K1hyvL6*YM=C$Tf(}@*sqcuU?VX_9Q2Q_ zCSDeEzNq3(658RR%j12bof;D^7dpjt2#IrL%&*``VFldGi>?rk*4vq%Yo>F8t>fp# z4Sf!be%;ZnbBkX=ug-s|Fnj;5+j&32bmX;vTKLM|mYmu5^jyD?v=W;MR%Sm444zGt z%le#HH`-NhCu}8iRl=!a=15vaq*E*5B7J=~pH@Y})JCO-ZnLs0u7-1nlkdm~S-99E zwZ`44%6E081WJ0t?kq@@z9qPpDbYc**tl!H_5Ilh8)MNqTy={Hm79go5BN;+_7;n^ zDGxuEzRmzHTZDSp-e2Tb;;wO&q`5}k{$fR38PKHzJ-qHam~aSyeM%RqcHAG1bh~qr zbxpt)r1uUmlOU%V?=tzu~TGd7V=`6k*FT6Vl!a(u?r`R<|Ct|Eq$C^Pgsi@5gUSh)S z;P|oExr0b(*mmpxxYvD!2v?ZJk>?<{@B4XEr141QW_85Ru?Dh%j^sJ58}-J6f?^p=e=f=l(FP z%gZe&OTMlv+UAJ+t0GViLGfH6DfV-JLJQD=R&SVj#6-kqbrp|*Oc?SG>>{>$AUu|< zpvWX$t(V}w!$k18Hlc6OzA!e|N4Fl{+PJL}NABO&&T!cN(3##>FK1&{V`z74>C6ii z&|MCdQ&xx=>0PSUzz2^%w|CS!KItCil1BiC+;x$EgPmimSoCe*8b_m)2Gln))_bWS zXa&`{fQ@c&a1wrP`E@hdF~!?ko0;d$4%vY0&|gIjA?;dI8#3dvL!#Taw+ONNQPZl23y_1bvQb_qe3uhL zx8|Z8fTb9zxQAm@e+tnAx%4y3!jZoRYOsT)*fK3jX3i2G_vc=4M8|(UUGRL@~3(UbmLV>=2s}@I^Nf>859- zFkLR4yinj_kU2g&d*@W=R?6Qd2W!LcTp&%KH?Fzg!j)pV=|n|9xF;NFPf+%wV=U;uN&W;b z=_x=No4>R*LmPr>?&4W-Zc}5G5NUv+cuw&5&PhNXl1NS!WtBN}^awph1OPUBR)T_`L|(rD{2l`{ki?=}RC#-B24qoV_O{ zR=m}P!u=g4wX3}kqhsjfHBlPZds(JXIBKAyio9z-3pK+6hg~_vG_slFPr4`)%~O$r zLgUn%OMH!Z(KIwwaxvXGM)%S#O8t&>D846JD9{HGUCVAqQ0e%=;VjT>QDHfEoatD$6HImy$9Z zOWOdlX^kFZ9y{_{U698Y+tSBu4Vix5fHAqXk^3(z zV@&(~isSMbfmM$8ntoJy0%^PDD5tnZ5ZnX5Fzy0Yz8Bo_{LX88fp2?bcrW=2; z;1rd%#FnONc_nu#3EI9tFI5qcD_0<}=t0$QdhhApxab)f3(290)9QmyzQZvNXGlt& zCU{;6Mqgl9d=Q{Bo3LAg>y>Vw8}?8uto;}~Y#+W*=6)@05mj3G(Dwln$WGVh1l!^2 zbe;OJ<`-EvcX3ES^gbAn7NMA*PBr|0H^Y2NWS*Ix)bo2MrBU5Ct%V1srM!VT;Jv)k z`jjRYMHf%^I4tVw^wn4*MGI_iJ%{=@ms6s{_|a;1y4&LXphx16k4sM;;fZxh+uPiD zj?`zr78W*Y{*%yYl_0xj;iaVbaJl5z1(JA_pDJE^d9^X%GzamecBnu9ba_kV;yP@3 z62{7%qdL*Atp)tLoqQ2?@Is`R5CM4dLQ*VX6HNl61lM!FbN$pYk88aKeWG@B(#v}4 zC^&!pcUfaow0wb^6KgUcV%OK))-hibm235_)Mz`ynpzctJ>vA|`c9!BcV}FwyA>jt zK#4%sh#$tn!!pdYIz%vVTrR^-02iPK5L%Vp#O+$+G<~K>K>0HnN4393J|r-+mSp1$ zMB{=it6sKHJtc7>9vft=vl#W_kzt&yLFhN6uPksN0_(YU1P;O+IfdDCo{45osn`i&TcSeV$;v0Cr+@|*Ls(Hdr4sCgW!5%W za-X#JOS?n%-s-@1v5!OF$6`Z_d6TZr(lkzr2@uZGJ;|J82U5mLCff=$o^!*gah##cff;vk=(l-9+Ia8h_`yRoUMAgH0uw~*u{2UUboF{_B8 zOr#t@28BwAXhln|)Ph0Y=2o6A`s{0V^NtBI2s_DHuaI^JGAh!X$VFwDScu zD8y>ccL5_NDS{)Slw~q?w-EV@#CTgiGzUsGk4)8CPV)J3zUu({_JaMbHBeRk3y&`f z6W!2<*BpqHMyMrn)_RTRKD+t=RGtj?FMqG_e{Miko|*~lBXqwURawj$kvONIQ^A*a zT*yOnuH?*G^nA^oOme1kCCWp;ZrdF#+2o0h7uF&s%!VaENMTvUMw8=7vV+4x%JRHy za#^PAa+vG`=3=ffjxe8*MXY6{Yd#yxLR27UcM>^gEPNo7Psj=x?^RH4NC!tQV%S~X z1AMfzWdG_9f3QPq&WeyIMBeO}no5x8+TE7L0!dFTeWPVU;mE(xb6Ou)eepHC*(aBj zg)G`L-Zaov((_QUijJrg1_3{KKLWl=%};cnH$G85-L%akY1lN*>ns-LKYX+*W z8!Mc?V#t0FWP0064FmKW)>i&TI? zAyTEZ=qwScPDPbOeFON~I}@>-UO60+4lMk5Y7W@rtb)7ZZg(#UTDcS@jU)I~;$9+( zz{PQs3W@}cy1MdpfAG@PV~)A9LPj$;0^uNCntF`6>;;We--J)1m7hMBJ|-&`#JUR@2TU8TCfyG4fB}GiGKDYj*Yd zVrow6CuFnh0D3wDg-mMMtMBf%7^n5+qc1z7ai`M@yObnJ1Rj{~yjm&?dM|LA&l~VSlg!faT0SQ8aN(3T3qCy!iyF*4eL?)0x)Yh zxkS_$@5To*Y-dC=wX$o-`h!Y}j8>ZkbKP9Xo;k2_NOyNrmUI3ra6leYxj~pVhJy{0 z>IDZN2Gup`T>LR5t6o{qm7=PTVDj+=be%(q_BnVlrJO9_6q1luR3dwrOcZG|u)Gjb z?(!ok#--N`@TSr8RCOj_)_rk63WcPdzUhTin=%PW9S&oivUB`CU{_3w#X)}!yGCkf z@(&~5kn7!WT-E{;YH$iAI;(DjOmy33cpG74tALRWY5RkWXr+dGy%@oSnV|QXpQn<;oi)QTt z5JNY0la#fRTT;xdqV>>nSO7$?7?LSSz9#cN73e+Ny(T@Tag z03K1@$L$`VS@IHI_~$8vn#NXwBpvZo6N1qe){eSGmxtJ~v{^N$ykSm{X<5LcB#yB9c*M8mvM6nSLl%~?JkE6R zjk@NkR-f7JB<~pOvH}aw!FL}b0iq7giy*sX9PRj57i7hcHY_>47m87M<Y`V9$nDQ#q*80-xn|yD5i39EKLlHC{dMK@Cj=fr|q#KQM|My9g-(;GE*CGw52ZR z5bia^5VGQS1Nopsm#Pxzpy1U4+;s5cW}lmnYr9n*J&_K;t5I=`#4MQU zji5=4gaU)Ak~%nq&5A?A;?_))xUpUrTzN%YSzi4IdCn}K7{F@IF#ZY7u(*VYCO$?J zZ|17-vg`_#zus6*Q=G4A(v=!+r83GRoZqskvu2LD2UlS z0_j#BGlHsq!F4b|{Z>@iHjrc$f$p+`vOMNSN!RgFzzCgiQh1%ogW~0+cnFz*Ci%}P zNr23`Qujz0yG(~s{(oX7ITv&uW( zSRCVGsx>*JaXgQXb$E;@!G80 zzZjL?QM`~`rc;BM$sg_?N{}Rcph;9lxo7C8ID~K3@7=fYjoh4ExQ-2vg*7?(k{=q% zWpz0d)|B6ztKy)ZrFH!KNwKOAT0Wl#50LGn&#YQa-3d2*e}nql0x20Mj$umn_dg^(nNqn1iO-J(XCuX zXqaR8PKfkE#PvwBJffPgFSdU>&;doKm7>fZKTFyBx*Q&{+X8ChH6;^%X9XOTV5t;G z&@wLQx4UvAIE^FV3R0K&bqy&3i4&RRE}n7S(%B)3G6<)87DS*%8m%O{f7|5|4SAet z^cv6nJVB)@k{;rD@pLnxmcbGthTU$}(O>Bv!>QDdT9dFEWF`26JeyU?8G4XMRQFAx zH(=OIEzNl(Qgos<2+Ew@&vak{b1TAIOBy{q@3)U+Yzsaq&y|!Gc-Y8h_&v7Ga%hg0 z)$-LO72-OS$g@>+1y^f@^KH5@ho@q5;3`q(3IJ8wmQ&v{QK}Fj*Z`I`Y=e%~Bp;mcJURs=G z`q~Pppy}y5Rcd2fGIUq>8rSyiN`6teoT8M z_repZ22 z_uP1?U=4?P|Mm&xp9rC!ej}VHy%EuL#4sF8;*!Lu0*x{p^;!WPlX{{Uu^uCP{bvmd z`fMDGVHIdseia!ZRSY)ccaiy(KHUv7EfwzNlc88E_a=1xrbjvfIVFkvPX{pL{g&I4 zLjzyaK=5Zl68`KH(FF5m@;PYu9O7?xyQ5=FAs@(W2rpapqX88qM9S~kCcid0v$>79 zV0K(-xpbazK3}BYi?{7C4f1;ThJ=rFbmUK5Pm6pH)6=VmdEUMJE|O;xj0FZ(z;+0* z?qhcOyI;%g^x-rsn_zddD;4}s??2D*RI4C0ipihgc&hLq%ZnAtJTIVwUQTnp{YM*rv& z`FmoTP@-sS&5tK!TIeC`3`ZHi`__QvXBp}lW&Bn9@EDbKM7H4**-2h2jXWYjc;wd! zUVxK+&ntPftLeliKV`ZZr2gSB`^&g)*@wfWZ7%#hYj1Q$?YJ;YJ#Off6NtsKkt^k! z&g^ER<(VHeLQ|^uD;k=to;IVqQD!v7J@h9(aiERRHKeE$)C9V$k;O{`)9=aeP;SGH z4^hSEM#}^+$AW5Ycd+MS%@dH(Pu9&gmZ%Ty_CQvfUe+r z9?_gx&%FJ%8TO4DX=j7r9mLtxmM5f*CuCF|?6&u6+Q<^j{`|Js!cPU*WdTz#*$jb2 zAa4{JRj+u3RtAIiRdwJlK<}20o)1W7(6069D(mcy__G%QxTmg5=<_LAg`q)D4m;hS zs-yZhfINou0VWV^%Y2<9;xPG=s=%EGq>o~p_RCcYd)bTm9-Fz^IUjTsC3ZwAb6aH+ z;UJpxzIwxLU%#B3kB2uH*>H+vCM+Ma3|SFB;*NkQcGU} zutjGyUv#GHH-%;WyuCV?B8R38hX!EG;Ca?>4v5uggTfjAZ*O|p(`N5^Hf;9n&6B;| z-d@%VA3ZHTl7+TZ*O0plMhp~o4xQWW@k8fOo9aN#aKYH|(%A`FcC8Xc#7_B3s`_t! z*oO;%=imi_b3Of2YV{c*Au4!Qbi?Y+>O{S&1FF*KvppKkbHBBB`+K{?J^ZxBr~db? zF6aE|ZGC)Jg98;Q2-tgE1|#Sq_lAwn$cNwvPEv%taEVJu;7G&brTZ7iZ&B^E>OZ~Z z@Ey5aoX9cOu?~9p7o%{oLTKyAxHj!XFrphTTWX(i$Eg428qY!J;?v1MhTzbWrQhJn z*!ZEt!xu;fqk9DdoOBAMSqPNPn-3 z$h^hwmKOdUNcLx>6O%ENj+b7_g|Eo3$~l_$LAUej7f9Ps8CJ?werOL)^nRTvwNK~e zcN#V&+i+!4QykiP7@53%R=4llMlW2=+mH6Zkv5YyudzRF8*3~hti#VuAQT8 zV{A72GqOf%SSDm@nPS14QHKjkCkhO7R*|Ppx>`wT)`O8Yl|Ad^1zUdK%PUgROts*% zESL)E36MZE}(T&f0etUa8WS--}*`F;N|GE+S?67

K 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 z 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 diff --git a/netbox/project-static/dist/graphiql.js.map b/netbox/project-static/dist/graphiql.js.map index fd9688c34203e31546aaab27615350883183e890..23c20b9a45fc405535a28e82c13648d4d9215898 100644 GIT binary patch delta 37128 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 delta 15182 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 From 04796a6ac62937de54ef1be0c16d13c10f37c685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Desno=C3=AB?= Date: Mon, 25 Sep 2023 19:33:01 +0200 Subject: [PATCH 005/271] Fix creating config template using rest api (#13869) * Fix creation of extras/config-templates objects using the REST API * Update serializers.py --- netbox/extras/api/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index e007db43d..c1fad99ee 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -454,7 +454,7 @@ class ConfigTemplateSerializer(TaggableModelSerializer, ValidatedModelSerializer required=False ) data_file = NestedDataFileSerializer( - read_only=True + required=False ) class Meta: From 0ce2b1b779228befa55d867eacb863b7f2ee1684 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Mon, 25 Sep 2023 10:41:21 -0700 Subject: [PATCH 006/271] 13845 fix device type image save (#13851) * 13845 check original image is null in save * 13845 update delete image code --- netbox/dcim/models/devices.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 9cca724ce..c9ebf898d 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -4,6 +4,7 @@ import yaml from functools import cached_property from django.core.exceptions import ValidationError +from django.core.files.storage import default_storage from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.db.models import F, ProtectedError @@ -332,10 +333,10 @@ class DeviceType(ImageAttachmentsMixin, PrimaryModel, WeightMixin): ret = super().save(*args, **kwargs) # Delete any previously uploaded image files that are no longer in use - if self.front_image != self._original_front_image: - self._original_front_image.delete(save=False) - if self.rear_image != self._original_rear_image: - self._original_rear_image.delete(save=False) + if self._original_front_image and self.front_image != self._original_front_image: + default_storage.delete(self._original_front_image) + if self._original_rear_image and self.rear_image != self._original_rear_image: + default_storage.delete(self._original_rear_image) return ret From 685ac5f57127dde7edaab480c6ce4af3a373f0a0 Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 25 Sep 2023 13:45:55 -0700 Subject: [PATCH 007/271] 13891 fix primary ip assignment if assigning ip --- netbox/ipam/forms/model_forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index e965bf7b1..bfd4f952d 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -354,7 +354,7 @@ class IPAddressForm(TenancyForm, NetBoxModelForm): }) elif selected_objects: assigned_object = self.cleaned_data[selected_objects[0]] - if self.instance.pk and self.cleaned_data['primary_for_parent'] and assigned_object != self.instance.assigned_object: + if self.instance.pk and self.instance.assigned_object and self.cleaned_data['primary_for_parent'] and assigned_object != self.instance.assigned_object: raise ValidationError( _("Cannot reassign IP address while it is designated as the primary IP for the parent object") ) From 27297c7556cf3c9659fdf79f5a77b49afe31706e Mon Sep 17 00:00:00 2001 From: Luke Anderson Date: Tue, 26 Sep 2023 20:20:30 +0930 Subject: [PATCH 008/271] Add Hide Disconnected Button to Interface Summary, Remove Unused Table Caption Descriptor - Close #12732 --- netbox/dcim/tables/devices.py | 15 +++- netbox/project-static/dist/netbox.js | Bin 530368 -> 529836 bytes netbox/project-static/dist/netbox.js.map | Bin 450659 -> 450242 bytes .../src/tables/interfaceTable.ts | 69 +++++------------- .../device/inc/interface_table_controls.html | 1 + 5 files changed, 31 insertions(+), 54 deletions(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 34dbcbf30..624eb579b 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -64,9 +64,19 @@ def get_interface_state_attribute(record): Get interface enabled state as string to attach to DOM element. """ if record.enabled: - return "enabled" + return 'enabled' else: - return "disabled" + return 'disabled' + + +def get_interface_connected_attribute(record): + """ + Get interface disconnected state as string to attach to DOM element. + """ + if record.mark_connected or record.cable: + return 'connected' + else: + return 'disconnected' # @@ -674,6 +684,7 @@ class DeviceInterfaceTable(InterfaceTable): 'data-name': lambda record: record.name, 'data-enabled': get_interface_state_attribute, 'data-type': lambda record: record.type, + 'data-connected': get_interface_connected_attribute } diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 84bfecae34920e732ecf52670208390ce6712040..ac5a6800292bbdffd0407da2b0b99f25e226bfb2 100644 GIT binary patch delta 25237 zcma*Q33wD$);IoC*T%jlgs>$|2;HR8N!WyhA|$Cm2uYeOEFp%_>Fy*=dP%xF8%aQM zA4dUOy`m_fDC5j1C~CQHIHQgWpw25QDEhjuIHTi?>-RfVoq#j*{lEVM^sRgAuIHY6 z_FFu8Fy)VbNZB!+^WBrOh~s>*_1x>}e!pt#2`i0ZySk*LfgYDN*pRa;ffltVtS<4n zP{?w&^U1MxODkHPvfPZ{UjBT}clZRKzzuPR?Y&)Ln=|&UU>nRFo+*AejdRAPrWH*< zg}y#pcUX0X9Z^@f*&9`yv1r;nSwqV-n-)8mmWZl>N%z{BZVXL&l+Dao7=Q z@ij$l_B>w`7OO8x!<pW?m-eJp4`G5vc}m*4k>qcEHjR4f~p#z2WLMuNzBJP}1TGdi-9` zvJl#vFato(Ev>7!=fz>Y7Pt^!|L~&e7&xP-cak>PtJmWUy1n+WH`);n0*+4<&0K`H zepe*A#^vwuVuC$kM<+cFRyz0fz{`F>Sc^^7k`%P|c>S&(ug6Z$(Ux#18ubsh26zUF z^0k;tn}}`e(NghylV%%swlUi`OPYB2eeEVO5y0pHFdXg{pWhSq2B}{)n~j+#Sr6-_ zrQB3hsI^sx6#$H0t&S3Y#h0zcrj=~~QuLSE_#uS7Kx!>^my>qlW2cp{UnxU_!{b){ zIB5hSsR@e|=i%f{b?Z67_m8)tnv4i5SG%))8s3Dn(%xE6uG5=K}>?JH|`SFwTJ%+q`23 z1{uC{w`C0a2!tJBZ=@|0jCj$59-9YXE51l^I2;ONcHhMoVollCPRKyVMPWz$4al6M z$>jsKtAHaikq)=p8;LY^_|;S`7P@xvB=lWD`0NTs2+URSL9nIIT-!j4NxMEl#6)s$ zs+TRTe)iNfd1CC)ttnhb8*$Ou)z5s}?LC)4V)e0Z>Z!OZ;mHVgKo$4BAT{uwR*SFSb3kQ_m zejLAm!`s~!3P&UAawqb1Hdn-s@1HQ-saE;XIv7yfV`uhv0|dU?U&XI_2WUa8^$zP$ zr@AtN8l}$I^>-A{b2{8Ezu&gbNfaOWXz!1Ax5}K`noWv(aBh`OHCtKljEz39exWmC zz0>Z9hN?kMg3Y$M3kF*{UB;@`Zc;i1Tc&lGtMY2GeFywNm{Gr5I6+gLF3?iX*~LV) z*!th4aV4>>zYB4jVqg7kB7WsNgHt#8)n&oDoO-+6p4WJ`{w9$3j7_m??u^JKwCu1J z8}a+OoW{P+;l{_Rf8UNV)^uQuhO=#aTI|H{%lw)-p@^ogpqAYMwL6G3q^YYYUmY+S zDlSc3iw+dcrA9QHwW}3GSt)R-LCsO!6KD+i74+oN@(WzK1+Mh;0+*x97i|f3M612g zs5ji#7t-=-V%(vGnDe_KvAh1TU|NBTNJ+lts_O~Ys|7}q8_)T*8286%TMJFtuivC- zgAjCU>Po_k4o!7qA_IW0aW!K?&Vbt6pXUtJb!hdfb+a{3JGNH@!IuJkeHF5Yj zF+L&N=78EpAk{Rrl=5kTovDdK@>T~NO=^u6t2>OzXrRYb6Y>G}UyE%&yo=i$v){L4 zX1uc^P3EYciJac)$m*>Z>k*!y$iuZPBF-*1=O z2}b2On)f#V6c68Dgi~eEs47iePxGq{sI6LT>;w5rHCt@}?M;f5W^PeiiBdYaMHTV$ z)*e4+>jG*8(7DyygM*b<8b2vRV|PC=cC@kKgD@+Kz5Kw!JWcg_FygBC3^r*d@|9?6 zlolKHn8!HmQH@y_YHAwIewn5g#R~M9Nf=ghto6ED%Ux~CYQIwEQr7sDG$Kn0lh^nO z#q!HY-nHkhrW}#mer2`B#yYr^*vtB;5yrMcm<@#0ve?J^x=~tRU)bY_L|svDzO6A< z@!({uW>>t;YGcGfg09a)Pc5#95;e*qC|ezCcqk#Z_rW1zV+7=Y<#1AB?8t*DV~i}x z;`rB(+0ncbz0D?-HeQ0E^!E2-*0I!Q5;HvKzUjB;+SWzXLIBj54k*Jit!`bUUQNw5 zhAbOr;Oe@_uSZCX{qoR|*jo>cu%Op{2Piw5YmAM4c-mHg2y4g%n6Q9cfXW*LQ*?WC z(=>Vk5(lXiS9heYyWbj!<#U~!IkJIeE4dMKra9txP zZ6KVx9J0?NdjW%Ji!WjyY*?$s{`hDbx;_4ACVqc;bj}c*b(-1Q*rLZ~acg6)#{#^T zzczOKvAz*&{dBH#aqiT$vD(LdT;bs(k2eZjc`W_N(?eQK=I4x^Inps!D^UW2PzV&L zt%p0GnPw?nZk~(s5~X_ZZ9{?TBE;@4P|Lv-mFfbMP1h8t>j@^#0=1!;-Z!gt^$wDg zl%9ynzD|%Q#Qyf@Y5}s37F+SG&3x#1)(Sc0hG&;@^*s?=HYl&FEf-HYcBRSZ$EHzc zj$Mg_0$zHY3w-VLhI{CF9@PnY=yAUJxFYEBc2j=AK=UduF_GM!*!<@+hiU~Tuc(O? zJe3f;;Q8r*;oj$$jL@15#!^+HIGfqKSzLlpP@pc4@qd|#x!M2n00)qre!)4`U=1Y& zs)yEJSfFl>Eq(DbuJy3;(r27hL=wX0c+VqZOO7(GHugV9ub#Zp0OIQAI0^M;t8LUi znyuExwjR@ml4zj>v(=Tc{NoQuL<#e1jc&%ga=WF%#mX0RNwK4^ltC1m@@jcrh0Eb_ zMO|Q{N+4TBuA-o3#hPN(T47b1je=Fqvf5=U%F0yhDr?@l=0O3hBDVk40`&6Xs~!{h z6|dD~L56G$*Hwq>akw49kSTgE_eLSnhSkn&Xu^gtUjy9%vMn(0wOWX08GoIG-{QZf z7GXQBkrr3Ls-$A~dg2YBtC8%`KXBNJ&BL~`M5!D^r0#5!Jyl|{$%l`i$HHO*fwI*` z0?;}?gaB)XGdsgtZ&kExwaVLE+}&ogZm?#o^V47JY!Yz>Ur=Fe+Ux7Ft39vxO*T3! z&sL+IHi&;=UqA_Wnmw1s#+6@G_`)x0~^WD6S$k z?eNIA@8J?F{mOd3I;d{hd!yl=-pbf(?__Z6uQ{DPzS5uH-D#`z+jIRzHhV5T$BItR zoVea!*WjtIYwRTXt$u*pua9j#eKEH_CcH~F0sFhthI-u?)`Q_=tKOY7%jr=I!eLjB zqYdh7DB9EJ&2xI{YCQD=8n>qieApS=@oqlaAA5J2taTFo)MDShdoMu$yZ6$$w8KZ= zb8yJ~{J+z=s>9RXuj069to?(;$%NjHCZ(pxB&^ONQ&wEj37Fmb!5)WJq?Tjz9V>A3 zUC~f@)xac_f+E$JXi8@}-=`%OpF1|~>Ezhy zPy4MnA*nf}UE_cZ!h|+m3)i)~pzVOlf0i%;xh|X{?0#xEw)eAXSp5^9UC6b^3O-N7 z@4C-3lYAJi2&V{2UeFcr0_&&*u)O*6`4i0EP*#8%YdT4JZjXKVc^alV{EG$2VK+2g zNa?Az6$2B7&84IW+GgDs*`o0}w&M#86zi{F{EZvhN;tK)NG(2m?5oc>Zsp-ezrLE| zg0YoS`;$(X#aT8*D|2Zu7?hh#yuszs&!M=$IWfQE6sCN9o+4G9ROEfxfu(rYa z0+6o=<8_@Dt_M8;_zDO_5G-KeLEkH4&L1a^UE#8&=Ggl|$jYfNSoOMoyabc_>BosF z@po})aE-@c2W5qd(^#gnF?Rf^>9OjcdNKQ>KQ-}MV?BGS6AH$T55?H3pDzXq{`F@s zpnF{&m&HY|Yvp#ySRp91rVr=1EBGl|*k*-o$Q$*7Vo?S%3Z9CIq_RT-HvyX9p9C(0 zbF!}mE*(jd$khoEw;E(!A~%;?&i){B6NI z!cCbPaszY_9K2E3k3fy>xkUsYhY#o2$vz&!tuMw5BW`LoKp9Y=LjKA}TiBDxmWBCJ zg{Zn2XIqk7T@yYZfRN=n+#O$&%jY5+^}- zz;Gw~X(%@b?X!n*$yxue_7LOZ?elS3oUCUUH+>>OAwFDp*pQbnNpyU07#ErrB+}+B zS62}puWeLUQ|fY?nD1wchjWFTn{6G=C5o$D%JN1Mo~OmKo*vGQ4CiXORcz`AKz$SQ zkKpnqx!i=YQ2yM;g9-e`uw{&O?uX7?oAH%C>$S+jULN6hk4wj zh>?AYotnhWV%x`Z9f17iWMc#FO6HP*gwG`dgPrW6aa;+Kg2^ZvGoHH*&-N+Y68&%E zxdM*!uz3mGrAQu0;C@E(a3Yt_dGzlS0fn*7ay4s1c4J+3PJKpNmJdf@UJ_S&?o^hr zrzaVMVH&&tZ!`F3^1uu};+#4Lf69{NEO$gb8qlmAv)GNE)|*3|#8!hAL^ z6A80nhg#UvX6}rQy9!me*tx@8i#}&IcZ}!C8SmgaY5opwKCGpAjbUhOWDc$gXW)=M z>EK#u>RH^&JlDYfIft8JHDr=?t?IHK;Ni+1bv31>t)^wCvK1VTsdI6lx>)^Ot{TZb zbGeMMU2ao%BIVr$veCu9n9IFxP*(l9dE6@;9@Q>(%K~oVc~00OA)5GtZ5>gPQH%#i z#P4%^ZL2^coZ-4`kO2BUx0HRpfSZA}j5&`>L6UPGH+i+u8Ul5OS=*F$VC;m<-;|zC zG+|H%T9T8V9^>w!*hw5!*ylh%$&2E z4EhbHhAUhUg{GG~@EQj2b4s0;>G_xyuloJXPK%FWez8huf82 zScP+!>j!VNRPy8%2vrzzn8t?RVwnx@V0d&4#Sj=n=4a4iOz;*<6P9rJ7RwEQUD+PX z&lqFnUdsX`+xA)(a?ABc_F4{D63`?3Ca_1kqR=54JHWvKz^>aYcc9(0{T2{SebIi) z)1$$ge>`l-LE^a2qD=}Bt0NtVmWTGVuYf~th+TP~6+G4Ykn=e<%q>@sddFNrD^P=BbMG2EU5t!D6vv(FP?1+bIvn_2cuZiw>@L&2gi8e ze=MmIP<#;Sl&Ux~RFL|^o;+rOl*>}z6UQ_ENy{{g2J_G|K7ler+3!zUM&s?nCoS+# zvJ)pQ7mdMS>VWmp;6pBfPhzLP5(U(_{FG7gj#HNTAZNg`cTQP00JuxuwoK$%-@BIa ztmR$H1h$%^j^a$Wd>VE7 z6fK|N`3dNVy(aS!*-4tYKfU9-=wx-2)7VzZY3%MXyj>uvPk(C+|DDA7^;akI&y3*w?2&YSvHn^b{~?D$WIlkd z!S>DOQ{fi{RW!WV?8Vu9l}MtjQ=gH+&*#vUn#z`1`NWaLZa^1t7IJ|(TNOS9n6p>m zeHJuOmpJuNS^Ov-#tP5?xEaAnid{s?@U9m`r<*f}@9| zXZ!=par9(ptYHq{ipjk&ho23a3^WFks0O|?!1oJ(N(7SW$hmyhG+@rZmD6Sq49(Wh zADr!ElreRKK5VYHN92<0gndulE}Wi4SVHKqsx zH4`itral9sx{335L%lF^J(TMi$aPV!OX-edmRW~X5l5uWkPk0gR>d`Abuc*%=FVc{~*%kC*fXs9egRuJF-( z{%UM?=K}sFZ1cGD_%W8L{z#rbLd&T3wyQaD4J_C~8dzR9b7Hjp2ts2 zstq}s!#FXAl79nts$>O}i%eLwPINFOB?>N$WzY*{oe%Lt2m)Uwo44^@$X$Ow4=1}m`T_pc;S_(d1WpJzd{ot`fAti9 zQ_@xgRKwm(3QW)&E~zOm!>mvdf_4;MTeQ;HHE;3r zi1ViA7$7hxqhTCt2-_h+XV;^NwZWR6ZVqpBK(j<+vm`!U2*D(JqbI|{X3(%uTQp+0 z%6#tSpf)s~AqECR2($2Q_722D4YvkE<)Ka^&sLq}9|nwvpW^d}vhEMDolD;a5or7n zNM1_WTb{+S+WR4Y|5Wheyp%=+2!#TIko9|;qLk6t(U169Y}ZHpr2lulGPdRu zehI7nm>)?``9r)Lm5m6TYGJ!S;U}@bde{nLfLNTTQwMFe_U-$CK3$$=1Me0y7;A1>TLv48kY8ab(+d>f^#Q^2@q7*tt zygfT93VA@-BuRkYq~}ROOaSg59VR@2$+59d^eg z;VP_qUb0}rUe+fIyZB^`cJ`D6pve1zWrQNo09-!<+0&;94Wwt7f|M^vq5zZ!qF94P zntuB=$7t$cTGR`U-Kys&5xCBYo41wg+OpWgW(hZPjqC!OunHEw<2E66WSd`U@p-&Pg#i1- zCghE8_A70Em)lE$AQ9t5h?U#Xq?6rZ7Z9z;PTPg#S#H15>GO6`9FtKg;)3ezi<(_^ zx5T9uCrh0z*k=V@P!=%}tFk<();WDjl}{=2DFwcIWkrzmA6GbPRotw7wlI~8uo;XOGSn6jqoaj6;Lf8NyfCtzt#k zhvXwgs6nzgQ@9Kq;+afgJwN&!%P8~*r=FQ3yv1=Yedt_aHf{90c|!Uy7X+g8bPDfd zo_Uyw#;%$txUo?R(U2$(Tm~VbNvNQ;U;_*qfer1Z1K*RYu_^O~laTBFHD5T2!Jl7% z!I7rr;$Q=U3-fT++^i!{m@9V}0SmqCc$Scm2rl9#aSTdw|A0oD;$d&*3HNgyY{z0@ z5^RgVUo7l~B(2sJ5ESdd4q%aTHj!C+i6ON^nfItd6$a8(ArshCpTUl+!g%(BYLJDA zON5IjqBIj0p(;3NmW9>AaMqkm*n~9w-X%0gKl^jOuz>5(f65nX2{LO7ge?@g2bY7( z<7$igIuW_YJ}3|xO&xY%w$^;qEfoA?vCAuAg2UuOU8b_~TA@K<#uf=})0{p~qb_0} z1$Z(Z%6x!26bDsxvpq$^mI+kHcvE%Gn;cEJdITvM>l^G!gHP4;7c^mr1?0!DWN7+Z z%LEITptabXMzEB_6^ZzogEsO!uqR4{DQvV)7|AA=2;2XAB^{N9l0og!0|dEfr;k}&u5}X@UX#7LoUpXMk)>(!C{anpk=~d==SHj z{VcOym@*8nz&OwbXjX4qKpLG-A$yz1kv> zvE{oKfjl_@AC}n6uJQ?20{W9S2^%?tRsZMCva4E!D`6;8;!uKXP;vPOw?0?X=lVf{ z2^0Yw3(kEYF(hzO6t^#meJrP4n832zgh}J0{>+Y$685XDzKn23X4J3v*!gWjYHk>z z2(>;09){~yW9mLXXjl9xv(-l)5>RjB{HzZtLBG11aKhSc%?Ax{6PDz8UFw=(#)@!V z&|j~#g^*V@ zx^P`fs6MmQOteTwi_d{27j*j&>&CXU3yHN_B=c-xZd*tR`Qb|dYYgQ(TWk@(vL>iR zUH078h^;J~AMxjU5s(*zDLy~yLUm)cE3sMx+G4flQ|6jreqd5qs{ca9#!M zmcTyt{Oc9mX*J+REPXM2U!SisaiAg0D* zeF8K)_F|s^vmE=PPsoI;7l;h+v>96A7!<%z8P2wRZSAk%CS5H`o|-2%~0WBgX39OtEStB^b% zTrCt_<_kxntJ@G)vQO(!Y1-8MlZvHo7kt9LHKN9ms~E~I<(ktTun-CV%b*+J{+nWuK>{>-i6adN&s={ zsw;&a%;&``1+tm`aHX&~$=NZ;Y~f*E(uiF*9AUcix59n!gm$Z0xw+?i;9*s?4${Xr zw~+BtpS)f8+A?12Fain9grYF23jMl>JHw({?Jo_d+y@ma9vyhQ|wkYnOGPGBC zfm)b$i!c-Z+)cL#ZM2JT-6~vYv9!3@FZ+ZHcE#<&4V2mUG}za|JA^HofBy!rdJFh-r5TS5I_SBY2JC^fDVGnUMGqx1y z5>VL5x?h9=qM1GQB6xK-d-p}58paAVce0)1h4ErFgl32w!jS2#{Uu?grQ6RA9fcgy zte<*GI6@n+@2HT8mPe0b_RZ{XM{({v?EGWGLZfZB+4jL>f@h$urP+mBCgNnh_BhBM z;Bw#7Z&e5SUW>X2(C=tNTUL4kVtb>0%?aU7@+K`l z2@>tp51bUna$FBfoh4?oPfiJKd{e~6a^4maS@>-jcpBOAcZ3%ac`@O%priharwMbq z^mpGQWuQsl{J!wKFufSGF%>Qo(+k(vx2y#MEH)Yh3J1rjH+}*c41<69sZeYItml0p z^o*{7#fTIv%n*3xWRHF!M7SE3{UtWk$u@i`*k(7n?D=F^$#wYj_nfk$>glz)D4Y6_T^ig3ftFee5pi(X`-eZa58Ji@D-?H6FVxpcVi?_+t z)*y#(j}i|I^+e3@^gK426BF6NCUFLPcC@&ND`wmnF*#n@AeTd#Iz}8mG!QW*9Pr*T zqJlxTj1i|wS{t^GtZm{P6umY^+{G2K;8-yg;?a(=VjgF4wz1>S3sdz^$BBQma78*x z5dXxXQvF0RG{V_NY(c9bEr4z0v8_Xr#A_!M0g2OyZ`lU?!7#BON)q41rd~M-qhnhh zOcoI^$$m=4SjMC$>I)`|b45DQ-DXrY5n9%jBHASo0y~cB9VsG_kfSLgE)}xxQ$$GM z`m|JWgP2kV>eS@InOEA|R4b$-m*1-NfS{SAt(fgj7t?`SN7BW5u15z7eriEFVz#)5 z=gRbDnd0L>8YX6m`NMl$c7so0ChYWIAac92#4?O~C`%+m<#So$1&|@=0*mPotj-2# z%KWVTHX#x7O3D#0;)?a%Ibs$kpf82(deA&uk^6?`C=xJY0rGIO6I#<`D|adIFSuk#W{mHeXT0ik<<3@5^)mF343X& zm^l{%_VqyxYiNNTG+a$W7;v`OW$*pB!eUoE$flp|DHIh;v5UP_D5kRu3$QW8?9T<_ zPN~a9S0Y%03@nTkikC=O{=Z7ZnYcN9PmG6=r6L`Nic;}?TrG@mL&V9{l_Cim z_ly&h*+VNu+<+!j8qYpkDZ(wT|FBa07~xY2YVOJtm$F$E;)|&A;WBYGTj3NxpN_t8 zC&s*&8fojXD&>BI28NtKT9=d6tP}HrSMcV2tNxGozvAWu;_R z_X?w(_qGKPYE&n#Ld!Sn#C1sKo-dMAcSr)R+y{G|(kGsTK-k~$j9tf!LX3ZtZ(Ky9!QBU>HM4!o{GKF&t)KCQQy#&BYc0SITp z2HXJ&gT1stoIX}FMjr%z0f@u~aS33txIrwRc<#%=ttdwfbAyPh#B6wmIEfwn0DjXf zza+CM8^vm_nzd~dCxGT$vQeZk-+MNSy%wj!M!zdeWh-4`8p_&S;uV8sNsS_fbpiH? z`pQOZSyFYJB*1JK2e&imwPD!5xJ8?Yw@QFjdc+hq(F2^UX5}8SM2192;Y4hs2WI(u zJz|&L=>#1kqJe(EPX;z$bK>$T^xc7-EQ7DoD_VK<%PK8HtZbK8{0t|h$jL5m5=$|) zSDOrql+r9t*h8UV4wU+9H07HM)G_MkJ|6g=BWpXDoZxCb8U7W6D&*GACd=Ed=6na1-{> z6wesfDh9yWL#+nALE}_*uvNr;3HDX1XccOR9-m3XaaF6t5$q?QIE=0Gi-jUyAQopI zWJ4O@&DCNm+jCe*)W7nJK?`8N8WReMv(V3zA#p0ZBP7CLMb8V)DN3@eGRji)iZ*dB zhw#^J?II$n*t_jw`lKqC+5vB7hv%HT3{|)fT*XqtVq#vE%eb;n(J}B*cYv5$7ZjWKh=JB$uxmedo!TZ4`HCSHP!5--l-PIj#T>ELP>u}ebA*0a{RV;B)#m&LGXox(zB`$if z(>=kP)%UpCNeg?axSDZ4T z&3*QY4J{W#F4JG`6`d9?pikQ(9^#<(9Nj7=P7Sz82_Tq|NY-WsgU4e<1I%&(Sne`5 z=K}G0jPv6KAnRbq7mAM{qDEOo2G9&mKXoDc8;_3SdToP`?EC#nv%dEt@ojEG=YLM7 zja_qzc#@sjCJF1}re`9q0o=ubwb{@x4P#`d`<#M2Sb&TGGSUW7kG^hEj=!S=~Rh=^*o^<_=-+-%Gv{rV{HDa>JJhc(`VS2(#5Cq%<*pR0T)~-f(223c5`H~&qj**wK@3xCyKr8xS2T&W5f_9DA z%57$ct^uhnW^=yx`JOW!`TrYf_8#FK!gqa10TbyKG2kWd-JK5>o;#+oO2xpaXFHzCrLlso1#`T?|_>e0? zYB78NX7QgEXO;260R8J*AbkSP}XAtN1EctxvlRViUx<3-*g4P_i@o#mW)gZrlkm zg09ljW5i*umB4@81rd13fAEfH-$3=e+)qm^{*yd>UPbjh{8#E6&jm z9Kt9FmUmDLg&jU&*jQ%+eh=LPG1AEr?iCLv)VSdTfg6haKWY~_M37-$91FHsyYwgsH=uR=nD`Wu z*m2;B#(p_2dNAblSAd{fUJ)Ng4SmsT;>7~FLu$fV7&jAccQUnX*+Nl%nK(?ww8{OG zr?IvZ;sQ454ROR+_(jis4};@^H$;RgvF0~KibTBp4RN$Q2Gcg91h6uiyMExb=p~tX zm({-T1z^n1w$OQ{fs_RO;3_A$~7HjirF zK1LdY1-vs>N@6dMkw&nFZBimTGX_SQ%9o&+@7V<@$~smeBkAt3(oR6sF-~eGt^WE1 z38bl*jpXGN{o@1)*oCO7L&vO{r;qn^r4Z#>t@lorUXUiQ zHU!(a2D5Pn3|is-jRt32!(3Kr1-FL%!7438^1fB7=GN#7XGrU4kez7~1rVP~lO~Z- z4~G**m?i2wid0%WKOa-1AY>;SJ5x%|LIt3q2{bYQW;VcmO-8?Ja1x4$Fjxv*3V?+Q zyk-4N2^NmE%%3iOLyGL+H4B(sgR>;E(cCmkvI9fzaz^Ac$ zvLw_JtEg0vw> z3pB#$7<+F9`D3@Mooznw+lGc+U4mHgB3#^$v*3X~Y=ja|7^+6G~v{#S)l3Z#YS(1LmZ5kUgx2NG;F8LQR! z^aH!+Ai%q)K%xLiP}(O8q$?1BXR9E-w5m{Qq6|gjvBwG}H+DX?$e>Z1i=F%fgqsGMzI>T93u>MoDwR&b;iH$AOUd{In%+_+$t2*lRZGv0 z2S{_9B{DV#nx(@iO>L1LgfyYQ*(xn0sbYLcqFBepA?Y8(uoy$iHv%5n>GPxsv0bIp z^tR2?I`Swz-zPndAP*9Us&ez=Mc-2mnM8+q+0g)fZm?fyI=cF1`@5 zkds|^Ay_kDd!dw#!yIOnA;@vp^h*=<=Pr^W#=J6E(SDF_uM6=v8|U%qX6csFO{YZQjW=S z7KN`@A|RDM%n`>sqLy!8DrvwH1K2o3+?`SiJH{j{3tT3xK~IleCFQUU*GUrl;WBA6 z!DQ^kQsM+7v@GEA1r3E7*CxrWzVCABNnBfTxDdt`^c2xI6bXg!ru}MZyg*MS;TpET40(Cq!4G?it|mqxQOS4subF&H?$8QhL*f)J$4JEAll;?8YXVy(lk zlP0kHuapV_zkJxMuLMQ-uK?O`l|)7!0O$p54puYKT-W}qA*w-~x()~uxmrpXfEi2K zE~TJm!FGs!MuY#h{L8mXQ_%YM?GmYH+zx3L&b@gQDzBF&v63CqDE3J%#C87;bcaZb z9ny#KnnMe5a`Fnpi#4`?C&XzODk;&}nVkk!r(Ppd!*TeO%RWuK_G)PT)YRw7$%cF zM0MG|J<<#$mG^-Po!%oQ5m`O=Q1&Y%QscltKiVr%oJq!Bshp$~(yj+rIF#+i+j+p& zv%!>xpn($fIPm4#YG0!tp#?b3;C)ncKvQ8q?=`gyjZNDp_2UyBBv=E-OrLLNPQCHD zT;uE;stq+5%TDc+CLsEVIH^e-K;vKDFD+&Hw@SYS!~geApoLNwIPnBpiUDA!Pl+P? zGxi2c17gfzV{Vg%voCKq&Q9BHQWjYf(bIofE_(-6acYc(QaC01_BQE7$UK9z3gG@_ zpS08p5YU%=(Ri8fqr2|X*@^{i1p#D2|LX)3D z5(D@lZ4AZZn^ZI&^-5e|mU(JuBA9~#7gAkM-X(=`>D%N%1i%-!f$Q|&Z78X`%;f&N zr98~*>$|1%h)^W4r3a-#6kK#rs)Fo(Rz)#@a5f8}=Whq4PcY+?hooOP=%S>C#5E4Y zM&2tuLd&@QJ}DD%pY&N2h30>@4g#R=lkR~4;F^W*BT0yVFey$1v-T*m4-0@q^#Gx+Ye3E(83T* zYpOVU^mXayVKCc7-jn_%b8Gd$r_!ScW!7hZF731+|LB*1$&j@!vZLh%*t=g!N&3Vy z(nI82KmIpqh`^Pxv0uq)`p^H6&L`h=-S^T2o{j%m%4U0hlA*$y}AbBUzr!3l(m)N`HJRWIC>0$2W1N(>=)3 z)8*@M&95^>{)w}cx?*2XoIqcW)OT3r?*v?YxO|oj2Yac$+%Bh68k{XlJXgg!GUa?j zW{oS=kaja=6|?*~Q>J)9r$e5>uW*|mv156e@**@k;*b~7_XcWU9YRnrE*@pc(@;4* zOQsOT_AI##$$MEcg$azzHu^*1c(x&1ZXf50)NQ7VXsIiK_=Wghh>N|OE#uR~tRY9f z6}AVp)G(`re4x#S)N4lRRfWlVV(PQ~6iJ&3<7s7yJbp;3FH+&EKyJkxxq+fap^=o} zgM;|0o?`r=WApeN`5VhBcN{W9+3~sZrTAFPx_R;jaa@JFKhKDrhEWWZ*{iN#L+_QX z`lpNJCEO&0yW%A}RS^qoJ{grldO@BnbCS>an3-O&SjP8^HnCrp%0J?e{a7I5BAC9g zP+kN6rf)Bj;YV4;mKMt{ewEwCo+_3T*h9qt*(zOFCch?eQT>fFxf7_OuX4)oz}Bc| zZ;&q=g6(~)h2l_-Rg7%Ea0}PUp8A7a3zVJwN4bYX_PV=(y6x=#yRZ-I+2Xt95+s-0EidPS z`b&2M?t&}gfGl!IPGn#9%R`ytkUScTTyjXxMiM$CXCc{hNOoYtFCUU~Ic|lHUHcP{ zp^x4#2Ql=L2V|J$!+KPgzqZf}cf2mA%ZTNMaN*LgeOSJiR=fNO`9W?Zf~b4_A$)1s zn_CyuM?6IbCBo)DE!U3IB6aOya=@9`M||>@r{(;yC@(*!99Lq#d|I|+ZAnLPfZJK_ z5qSpSwBd-H%;UQkJ%5(BBRlk2`85mDx1X0U=DGE{`z3krP{G+?D`)+0$+MW_b$KIZ zwf%K@3?0?IC*)TIi`KwGF?o`H)hW3{9$x`(Vca2+Tj`@qFBL4|1NnD=z~djt&0Io> zTW$B{4bq_6E`0K#gynuDTjAlU|46RlO7ue?0og!z!BF#h*x1YXiMsYF@EN+23SN1< z0w1?GQvmaU&c|0g_?RFn$$w;L>N%%I^A`ycV#{`nx=3ls9Pb6$q9H@HEP154`I1g`*t^ zB!Yu5{%ZQn!M?y^K?4w*Xi6LQvo>l>=GfomQkoRfscg|VvSToF={IuXBs3&{k+FvV zXgGDmxl?9WeIq}KDAWtTkS8<8xAFqH(uGl#M*5`t1a|COc`V!Utvr*85eIj+*r*8V zc(!B+v;RXLmu4DG&K<)9i{TkWFNkbEr_IE{1tVVL98j_a|BzE@Rki<+H?U{^B_B#X z_qEw&{J#e%qL@>}La=S$%SR~M>IeCXiNng>N|9S>Y=F!1jd4T9afwd1vZ+fc=~A4< TN#paXd-hwu z|6Rsohcb3e=OTAzEaJFGd;|AtwmYEOdLv46#I7zWZ=%O#O*Z80O0Z4sji^f^ZWOYD zoqT$Hi=`c{PFSwTZy$d)7di48pTZ4sMeKdu5t}Ri55YE=IWklHdK%}7Pt7WwfC~Nn zww{RUia28KNUJZVxZ<&_d9sFHdjQkw)NyjyWJhR;c&CnUZ_Pf)lg?3ke%)J z*|dn_I&y3F^+RVRd$0e6-qBM%dXF>~YVpnaQ#mbuaee`(9eE)C(;?%~uq@(;w)tCP zHhZDJ1&h@eWns>5E}}(#XFO*(i}Bp-w5>s39$Q&N(R}to46mxH)e{IuebJb;zu(Na z_(R^oOvu-B`b|f~*X0j)My>YjY;=+wRng)nos))YkpW*I>dSD&Erm`Drxwzn+Y1+s z!W=P9Bpjx$0L{W&&UNJPg-4}&yjg3jkJtfAM=auRZS_U!I(!~1NkK`QJLC=cyvxF9 zZ^8@!J+ri-(O#H<^;+OUV*SHQr(@up(!NRBV6Q%}7V`M)5nrq`5&|3_EuFatZv*aV zY>hk6>B9tjBaSY59ISNa>*UJ;Kv;`Ub)_k2?ezuRy*{sibC} z2uV#?WVnu`Zyv{urIMpq)eV{e@F`BZ~;b_d~#Z(J+rKe&LYe#3a&8n0}RIJolA1ML~xOa`0ToIfDExvWvE(|h! z_g>2w^bw3WBED!xI284v2R%Lyz*hXxvPdKx!R)?{FT|SiubhyBj!Pqs#2b(~M~mAJ zY*ztCWTKrOk1rZ+=?tiuT0DH^;z{Vcn()~jiV~P>6N6w&pS-e(7L#>#iin9guWOVo zRRQ++GVUdAVzZTOR{TK_UxS>jajDgQ?B80KS{uLg=Bajlp)IIt+u%f23yv4ZhXA%w_7mAnof+-bh?dSi@)~U%7A80D5|MjsAW%3?Fk_bYw8Nh*9DD+ zid$3Hq65X{R->BD+T9MKtY~gEq&ez(gU#W9f}Y%3k>+-4?(A&M?dbN$+QOZ&I$td2 zi}d%0wZi&1cQ_@keLW<8`|lP^)7(T#id^o7-bkaW8HqEI3utlf_tUnQo3P)oScK>kfUkGAVnVK<+BZ<>3O00VjjDC4wNN{~-oysE&=Z(LL%4af&lAho z+GtH|bTDdcm#TKu zORE;|x}yS}JbuRvQ6tV1?|3{rKKjsi z1a@L75aawq;1Wmn9(sgJFQLsY!=?w3b|+xmq^aFnJa%UtMt=IvNAP>mU0Gu^wS+3w zAw{FYWyY?)c-Js&2V^E|)Hn!`JQDQ2PNO4L)Esdpb^y8L;c7KtzB-sV^Ysb%xG+8; z+t#4kK_JyMwSw|l!QGjuLkd?19W83T7H>F$$!MU*R1@+6_Fs$dJhF#d7PsHMYi6Re zQcZ0opjQIuG~czSfl&-#9Qa^-Ja4a@TB#lb49NSu_R@jLDvJKEUrL6{ZCU$}Q+p{Dx07;#l%2Aee#`N}mlMvIMk z&0`$#s>ZBKG<7S@ewn5g$BXruX_~r9bFB5b+pF9iN>)HAbt|g_N*0l&l*y|DgknXd zB=6dtS(GDkJD{xA*jNXb5r07+HNx0d2(v-3mH0>cx=~txf5hvE#@sPqk*zCUecxoO zW>e)PVKF-DeTar_^^ z>}X!8zE+b;8!y37`UWtiKs@uw)Ew`bZwBm6+q$S)0)QIR0cBXGHLQy^s+sx5kd@;M zTwNFa`3R};pY9(Lf8+iU7W8`HAZ15$UGdQmOxq3+VGT}z2@7xnRK5_HqQ~dV(&z<9 z9Hd6)YAuP`H6}IbDp#VdgDfqvS^idYlh$hHCN0<0TH2iT2{a0|sui?}D>XILYJhIt zXyY+4rc$BBAAH~_aB%yB)@kMer~?NNcVa@=k-=vb6(4=jK2EduHARYgBMr@IQ;|t5|JnrT49BL!*P_B&9j3 zvaeF)3Gu)Fu}*;Oqs3P|WiuZ-pRz(ux#p>*Tw`<8mJiD7?r`F%z^=6T1K2dm%&{xc zaL`AObAhj2zDO@U&!ajaFFnpTA6JCDz8=aiNH(wa5fgDX$LBwjJ5(z+c}0D^`0y-H!5YeoRWGf- z1f9i~KKChCbwqjoQ%))-31MrZ=MnKG#~8Of{$Ix~pS<1x;_B7}3H9Zx9n?OSuP%>o ze^DPwqJRMlT<{>@|U3{Yrfv zWXR@7LtUg1huaYfo1*t}Uknm$MD5ClCTs}v_0Sz4+XC}mSr73n=g*VyTlVM7Qf#L+ z+U5>gl}zkjZ=wNoHIf|$l83F=JZvk=m6}0B>d80RQwRz<_oe63|Y9X9JmYtG65{aI&&ZWIr`pu+gHS2ti+dtdFJY;;zYug1D; z5dR|npc3gadtMhG^O|+sx_~Xxm1E6cXtigm>cam1b#d2gE4X#>%U_#;-@9I$g$?}6 zYd$U*U;26;S9zr4^}j%0+F_$zPca5Yz)%pYG7DC+65RRrwLK&j2{r000)$(a*t z0u4>x#)jrDlHVGW+`cBh{p9&vOQ?O%LnnyhsZ{nXM@cW1^*{hLoUGma4vZ_yg#4N8bIQ&N5aboLSwawo|&9UM~9>gU4GwR-~9m zUEbx0YwxF8lI@?0JN;Ik}Db@=BC(qkTIx{%T{ zZ7Y%!hRvnC6xwFP=lP=XI=<_37bw=BKmRK?w2E+QZK>LO7! z<|NCkuQVk#TdNjn{L|pQ~x@P+Y+~Z`?N`E{{HP!Waoc36R#S+TSJ<4dnL&( z3L#jyCBwz`PvR!T_kS}i{?2z9)v!I-`@p`52;~#3OR09^z}X8+BTF66Hsp)>NGU@GG76r`h@`T^0yhDg;2#7ohjX#7 z1TGs%n#eT>A&=^3-6A)aTg!eYa@AavJvL2F)5l5NMHX0x2JMPX5y%vF0#t|{8p2JP z8ub8l5FC6l*pEPs?aoqykHe31>|!4c;Wm_Eh9M6%OHu|DsF1&k&=&S2vSneuRKZDR zjgn@vEx~Hz_X6?Em)N$8hH|j2v4cao8FR5&=#h+f3C#ip$sREUk}T=1lQ;>w1BScU z4@0>*XrDifOV9hi+Cz*>v@gPGak1WE-1LbAg~V_@5kp?WB+>DqVO)5c-vj*hRjI28 zkJmP^iGWL>+utQUB=vR7SAX+^tf*{Nvr9H7Kk8^gQk*4v%UXyI}!0@hlf?kq}M%p^nZN$tcEyBO35~ ze702}5w1u>K1cxlo>|I1Tfohr%|46EKvHlPH+i+u8Ul5WS=*F$VC;m<-;$k8G+|H% zT2hdm9jP^EY1D?$c-lZbNXiQeHFn@EF2y9>u<{xfm?#l$5Q?s_-?D=+(IrNxgQo{<6SIg5x0)~6EIUH?cr?qA`WT_yBi4+b`l5JiACHLxDyO24+}l4 zyRk^82O^76!p1qdtXXh?fZ97+0&dt*tPo-i89~i+|%t&ABHUuYct*^xgcL>bkcBKziVdq-? z(6yEtp1cC#YC{gw*zg-Hv%wt-HK5AA7R0S9N4U3$0WLev^}j|Kc(ci&?08J|L#q3pMBT1MmT18-X3pJcDS zX*q8U22+#PM}rT!1wM_P{8AK9G!t%VvB77B(hn?|0F9#w`>l}K#R1nAy)hKv0mT>e$DHi&UE&0G z^aIOE^fUTH3tYi0`$J1$JBDp&q?1sOgVbY^s)QfXkY6!U!bc3Eg|lSHt~h(3e2$h7 zr2ZbX8_YYJ5+#@qSy0d`)g0t{gw=+}xu`DE&;;TMJ~Qqk%QAT9^!1-uYy!9T;JIH| zcwq5)Us;Ba=3H0peki@a>q~vvc^_pvgdEAc<<=OA~y*@TWu}nU0*x=S>6V{98F~c5-O8VJ@Em z4&i8mKn;xsJwY$*p<#M(;xG$ia6EN`$RC)?rw*f~^g$@k(AeX1`6+7&Td6Tc5U9Ce z!7%k17}Z0ZzX$4tk?W;gZ!*_Sxo)K=fmvo9Qbiom4ns=N*t~gs6%7`Q#)t^&f>>drn;kr?kFvz&bLJ^NN8Z8HqyYBhuNl2EZG*M6w<*hXFCh|iD}Ej zj@F3Z>+-d@I|J}5nqouYa{bOl{0Yvi^~#VM!@Rk{Z*-yWUd+EH4RwXo8d8flu(4mt zlk`hV`30P1gPR?7@dw$XK7JfKwwzCAU;6mT?7e5j6xP|wTiHite4qJtdIdk#e0%#c zekRLr;Zxa1%lJRDhdRu*8EketKi+IRy`2}CvV|YR+1c*%_=#-g3O-%mSk52f%=+kU zhFM>(2N@i!&(5vjb#a5caD!W4vXZ~dGRio7fw1ZhWAf|u*Q@x0Bf0hZISu?WX!Z>0 zc>RsD`3y-|A1++aero2APFfjO&1PHFHKYV-iM6lO-|+D7acpxLru;$&FSC*Dm>kwD zv+K+F32aykpUqw_0~u$u`tMSNVa!>B7rWN+L)c|4{I!KEeBlGcC5I&f*-{~?ff3gO6>1?fN)2cPt(r|@CAIbNJr6PZm^G8)O-Zvw($8l z)^oP-Wn8i*HBQ%Wi|{(ftz_;PzYxi_G5%t1oj#+J7kH$$9{y7cw^E%xWW zm^#3}HPnDlMOdxTv$pY^#ZnPwk1of)R_@?OaTTm#2Rf@@ndbt!2Y2uyM-@g_@U~=y z_s`)Axe6T>mX8GC_3z~4h)!TX?BOSJH7w;?z5u1mujL;Yic-tXyoRLqX1*4b@Rpl- zl03h-nZHj45o%~uO4&Ql07Q@7!tcY2O}FwZk^KHvK87UoAfJb%<{%F{f!=bEe|;oQ z8}V*BZiOHzHqZd5oKQmSIEECygg)-!9YatD8a#4W-^0Vlu8+Q#e|b2CUo3$S0{$LV zb?IL|&R>_dooHc`K`=l}lA`!v0fL!`0fEGzHyAcRJ_acnQ6=yp65F`(FdTU&u!|q!CubVwX3}3mzDRj}RV8MHijcEoaN44k z#;$mSpGS;0v%mm>K^P6&SX0Cf0Xn}CO{`7U>}+#*qXU{H8k;4F=|To3$s0Wx1~!9) zg*#$V!&Bz>EC;cn@eC<26h@SVf2%JU4mI2w3Ri`@j67TQCjS6nJp2S-G?evxfbCrR z7B8~q4}jzql)d389IO2w@b^pwD=y4vMto2>=*-B1AcAbb*Ak{pl0n>lYvK(^$(#s8;bY&Jmu9V}mO;IQW!lp?A)F!=965;}I|JX3$K_r(B7y1!*o!uo z$U3Zco_69M#Ph*H5|XotPo%|AB?=IrZ6cIs9V3Ow80^<0g{?^BQNqVCd%($t6YwUV zGNQ91!HdAe*~HNTox4q=g~dp&A1zFU_=ECCMhg=$wf`C|1d+JL2xlWXFh+fk@^L`4H?A1V#*wnq+_aGvkC_9zk*7 z?j*&t!!IEsQDg2@VcJOWdJ^Irfo5R1zfKi2gc*_G4F(J$6cXhCp(z&i6{;tM@-yB6 zP;`L%*rAcaBvw38Sc;y{oha-k3B%}_tfG#l)@WH5&QG}!M@MHiIjrtX6G~yZHKs$+ zXo=~tTPF#ZVcql61snFVF?fO0I6fFqIs$HwkK#b0#)~McvZF~WyTL9XSdpEy3+b~00j10D>!vU!qf*EX z&DkF_yXt962rVv_Ia{#L^1GocVj@;$c}Q(=`ITC~Qt4NU{f)|s5UD@zNX)7P*p}JC zR4&AJ&IViq?7rDT(eywRnz(`xMkVSd=P8Jt#~rgR4=D|PccYy>G+R(uNscfM4OZs} zUt+h)6yX4p4;7&v$>Ln$B5;T&bA=83=ratXP#;`+Zh`Oy$A$HwbA{Qo(evgB*~7w+ zhqALNx{rD1VI~^8Y@Xo3Mkz!?VmNR)goGxcg3^KwFlYoew1*CSuTx`F<_m8^tozq| z;TQ&gW&s9An&rg71_T!t;;aQ&XQ41x_89RBee8Iikdg{65+G>|I`TkLq0Q)Ie<>91 z;XG{DVqp?Yi@#kg?1dn$HWU*S8^I1>kkVSnD!s%I+M&yPRiPFG>8g+mY--G5$5mlG z`%X2;!o(%Q`4dr^3xiNC{4>iUYDpw-PA*JBnts<3nxmWju}E0JdGsHOg!KfOwZ+0V z3fzOo!R>W-#Qa?d++*(-3(ckqo1Cq+2z5(@z*y|^N(B63a^Y@MS9ztxpfF=gg^p=1 zKd4bRv5#Ur84s0yKplF6ss`A;QeoQ!s$;yVJ>yM*OSpUl=@=WD>`Ieg)%0gw!Vn9{ zk73Br^f#6X7A{4DB4fl#Io#2xzcpkd#{+w`T$sW}`-PEga=Ebcmn-S0G?eVQ&#VyQ zX__CFYY;Z`I8bzEhmTYr7ON0e!aOy|@ssNZv9g0(!2mFUEqzWL!nUpyhM~8gDun#p z&H#My$q-QrZ!pY-NugozjnRc+H%L9*#|Sir*^i`y`UpGc8?diCjIQ?dVuvR;dCKL4xD9BhpUBc78r70TP1i>S^~C}Au=DIfpH$T zszy*yW1vP@f?gh~0lD|+S+&A79M0#%b;5F>qgXHe3W&0+UbtyC9jt_IU)*N6k|=g{ zP&o&`1UFQx5E#oER|_x@v7XfeVhz|eW^&(Z;XD|V7q1a+2iktJMtG2dy}O}bMS&)E zCz*;2EJ_51502(y&#e{mRv_*>5&oTv4I_yL_#8|;AnK6J(1jj10HVN>*`Ps%z2K={e!fv?Oo=w6dNY=T9O3e2bw_r!^m>cxQrGM-eKIFJI{kTV% zM$BR{#H<@#Zfne1#c%z^Jkm~5)YCdEr_wD*uBmk*aomp)b_-p<{a3| zZ30L79esYh1b{prXCam}a>T1FXYmc=E6ud)NQn(?kt_kI= zh&1>EjY2h?D=XhYbE z=IbI2ZQ;h;3Nz87Ic}XxfNpHEiQvbfy7m$f{o!ReO{4-4pRT=B z=*4`VyHp^9>35e3i_=`4gRB_QJiYXq}{uZ*3#X zr9OG5@Ren})@ei$nhAwq;?49cgpc@Qg91~m7vvG}1w5d!LC)5Kh>?~7(o%%*L*hV* zO$BTTNItEl1ys2FYT;(A;`6J8E)tZy*9ebd(ph_GZS3+rLJ z3wEHfIoAqz8Ll&OM}K;);Kr+}>x@^i>x6GnBfQs8!7kb>Y@FQ^RYSh+42pc+998=$ ziUGb)(0Oupv=||(MEU#sTiEF9F=yRZ^+Hbi>7s;l%Ftcm0%~Ed z8-$r~=5D@0=%8JE<3`~ei>1ZQemWrJuuEaB-` zDHb@{&c90-VL{{FcMByF@~=Dq5CFWNJt(B1GhKWb2ML`vJR+P&jt#?+R30V%12=D1 zowKzL%mNmie?0<{A!=b5epo@CI39EZ0hl=dxXl!;^haZmV{sjaz5JMf=ycL6+2xN5 z6WO@O4e=!RaWKR-_Sxe?&xkg+6F8@;CDEcbz2gbtZx9c4?~^nkjSc)kcnUnM?2kfl zdxv{qlhR(NZi=>ryF*!hM!pt#QnC`+YBLKym?+qS0uQXr?M6PUue1)GWWhH|omdh4 ziOXlW0Oan7!p+u%0Kh~J?A)sKoX-2atl%l30D79|Dd9FGBcBGgwX*!DVR&d|fv1JF z3B&)>PYV-Bvpn%9k{{Ste~?nx}b+Ml3 zV0#F%$DaeEZes5|C)B}Cf#xo@d%Q4S?18-Ox@zf=>1@mM!b(e1fE_*t86>EmcwRV4 zz&~(I$VJ0r$1wRI`|B~BxlVTWi^4*7@;O1^dW^RBy(oB-Z7o5>oD_(Y_4UU=@&J~D zFA2-g=8KnvdnF79vm87A9MHF$n(8NB#^!RZ`YnG3Z<^8;RW~`Z`Zm)B)pn{@Bj_~O z-Ql+?b!^kC5Dn_tWv>deTk8V@{aJl=fq_kk;U3)nwkXeknUtH^h> z_)XAcmwxa~VJycrv&>myKKuBD(7}77HdgSKkjf%&!JgB_mcK1L$Ca@OCj}k#pF2s| zQl`K2E=m7hed~L|Gs5&<5W`G3NKBtwfB&*JNUYdgP$Zm`dcFB$2wklGX<>x^uTKQ0 z1u&lXxzIbh4mKiEsW4BVQ$2g=b0NyrvHUNvkuJ9J3&A$K%WW?rQ;O5=M{uF9%M4&b zDa@CId}eEmQpXN|0cEG2ef5RVk9mi_#4dH|qfQBrikRpN{}3iyELxb=d@GFCfBagg zgHKhj{T_O)r6bC|$`)tphkg*wB~L415UaO{@1us37w@zrkc&-{#D7fCfQMN`@@+{! zDkzs#7H^TMBZD5kHA*}c3rx&u(oS4cEwTLs=Q=`R2TrcCsi0O&S2E820)G^}l zp&e0E!~ydiBPtkl+Zb`Gq;+67$=D{&LD4H?#64Uw3yl@Q&GlVl#X`>F>R`v85vJ;& zj1zxv;fi&ZBL0CxrN)V3c!aBi_<~kXY5?2BW1EMhiC3~wGUjwwn)n(v_0mZg4SRB5 zx`^;d_Cq@QHYPbyUocsmE7B?MF=L>Kva;?B(JtZe+i^5+%@B!f9Lo@Kg^+!lAwuNV zr)7#8#f(yrqZT*Lxw550wL% zu2f%^D?Y+uBgH(iXn3>RZZIaygq{2oWNc5KSc!2D=ZR#Od^%6u0il7etC;S;x_p45 z6h@?*gjCEctw1~vd}VKen8yj|OJTd;1{3>sj<{SvGdtTf7v8K5bHxRi&+fURJ=s=& zX|8x3CzJ-1X0~O%mcP7*s&pur#!U?W_w^IBF!BPrp?kNSI(?ZR@i`YJ*Hlui_xZ4(7v z6a>OhY;G*v+8O|& zb-CE@Ys555HwZgUG{cD=qkmT;E`-#;=GBQuu*Q$-#8bGiz+PW1UIQ^SvPOjUTK~%$ zalbIyMQ+~2?QUBTfkh4CDzyAdgSZaK+_Oaz;|@!}mAlRse@nv{=lupv>}Ov#iler> z6hm$Wu`*a?3oceBEjo1no`kk;!^TIb+8wfW1FuQ(X~uG5?q;jfYeLv~ZgLy2?IqZj z8S5pH$zUzggQ#OfpTo3EmBu)U$xnPq>LA`fw68kJJg^hkkn95eV#VnL{xW!8b%hH-f3gQCn zQ}vb2*s`>q1WACEFad5Y|s@2v0R1-NWnvFlNVO_ zyS!qz-Q@xuBcg$Rz)X^xueos56bf!~CoAEa^odsL7tObLK|Oa^h74nSeB!4#Fr_Yb zaf?`i8NS?N5T=Y)al&>2YHbqI4zE8N^hcvveH%h3uSR(gUk30IO-Ph&87%9JC5l#{ zs0BAMqke3i(Qs9=1fdj(qRl8WvB9WOZf3nIVS`apf)W!OjO?;RHu-uhcF?5M>p`gv z*$hI=saAuwewm52PHQt()!rul18a2q#Z5>uj|u7QO~0}1S)0WwOPwiC3Cmo7(X=pV z%%RQLN>emrT)P+qcMrE4WCx8i*`an3mn7Ji?V?qvBeHxd6{l9M6-Tfi{NgaSDj=4K zc!2<%0}u;ofWNF3Gugf)LaP2{Knz&``_-6GSe%7^9t(?8*{xv_hAMhqa7Iy@WtCBu zp;vc^b2-Gkp1Vav_!N6*i8V zM1W`q zv+MxpEn#zZh|gf0?{|Q@gDamSK8P?HWfd7db2R#9{-*~z`)8+Ky|SFLdwQPC1Z71zQy zilIvrL#_y`z3jc~#cwRGTH`AL`d2qV2nGD7>=%E%1k*@Z;>nF>})_%hd{PrC`y6IaG|+$@Gc$xhuY z){JQK;39|-X_cKFKVCM8z5Sg$goSPqJGnajy<5O~xH3Kcpg4CZ=eqi^m_E`JfSTQg zZJ#yWCCyq$katkzgdLt>*j8r)e)r!AY0||~?h+5B)Oq0hfb)sGK57{`LXcsf z9~K?Dd_??M9*zohfgGVNW$e2LFyAKq*n?tx6y_WIP@Jt__9yWT9&_=(08R?DyYLtY zH=uR=Me%VY@#DZ1js0|7^kT^AF9AWfy(B(>8v3GF#PbDmgVaazFm5iK?POxvwv9sj za&ef9X_MOr;p-i*i3`}I*ToTI;SD|WJq(QtUKbId#9Ch$Dg5x_*TvED7);xY4ZzB1 z?)t%#qK`!9k^e33!%S}fZ*e}4(OB`r5W6maRUFR5_r!JZz{6pJn=&~r*7}}k9gWL{ z$*AuY2p?tFyeBqctZ&{Eb1@Ud!J9U97>Ut_UHhK6m_^a5n--)nWb?e{% zAl8n;oV5{BG3es%5z>nwlg%TgJ1oq7yEK{QjFE=2E5}G<*_UIbA*^bQG#X)|W(-d~ zz8eGyB%#1;86(YL^Qh)6W27-y$lGJ3H1@(6X#{IJS4w54#=uTf^E~wQeS08OS;tCb zB;7k!+6~A$#!0O_RN<>rB#OJzRA+F(&Q{d&P^yZn`UG|*%{bmaLConZIxDVtJ&|Y(n2KfS*1E|wZ3qM zw2lVZoh4E9@QEyG5*hVyNMVRsqRyi@rN#4$Fhz<$cCoQDrSv>h06LmLBLiS=6P(v% z^s56$p?C;`wa|?K7^%QxHq4Y@@L0nF+0x%huN}N&0kdmpmZV_d>t;!I!08XOq*+Kl zpCwU1+ESZDVcHvQQf!pw0YOQ|k8A9tO}dx1cRahzE|J#q2fMTg$xn9aVQ?LaSUJOE zMS-k|(5*r1BVBSMV;h`Uc0~Rg=H)>ONjKLJ+Cs+Mgtr*st(iHJ71JlLS22C(04IUf zNbU>H`dT>aSEv`u1-8P=R z=#ZwKvD|+;B%Q#gu{-l5QbYbLPwIx_H0g4*=Hkk=es;bzmph}h&+ml`_=W;$4g&5> zsjj~t7g}OC)CdE?wXB|)Q7{;;N2P-q<5d)q1s;eX^d|WX7kz;O#Q`p$UMf#K4#JD> zye12&p1U~{A4E#jbT{MK=)v$HwS@z4KVh03bEGu7_+j8*f4>k?z+rHfu(`wMk84Z4|1tThv!qV)*}y@lv1iVbY`~j; zL$uKgrR4zC+JzEb0_|QX-EKto9lupd)zw9kg>I&yaj8?vH=nwll43p`bV`m9WMzW^ z!A1zps(0ar%1=&dq7n0w{2CCm7D_qTqwMTt34G#gRIxOX-B$`lYI~uSi$PVkr4lUT z$wJ8rI`(0q^aaJ#8DcP;#MtTyW+M9RTO!j1#M| zJxipS>^@bBfwUn+3pB#$7<+F<_+z*064*^73r@WylH-5xuXj3i14`z0G61!7hGs;$l7BkU*u3*bffC8y*riLQb0IV|{;Y6Hv9$0ETF?j} zB1pjeI)aTRW3?LJePDMU0(kcoOB5anO8Z!`bP2-mY}Leh!Omxv z8Z>HasnmzfOP+`f1oXKK#@*+V6k}lMPMI)sxTIy69F7(^8GSneRGa-!DD49y!2R}y zYRsEHJ_teD{DL5gv1N&(glw&`7t5p|$>X@eglh(xzI>T93+kR8u8>Z^=c89uN$L3h znch|_$t37?)Je~b2S}Z*64{!At(o{fneb zeen(mET;T){yC6^TAA*%+jK4j3>QO^ z!tOX%Dj~mLUy=x%;rElyld9qOBZIb4H*}sf9yj;w0JlM{D2B-JFh^KT7;@Yd1JXqO z>GPzhF|Qofa)DGrH*c`vw_hM3tew4mfmBWsy+LD%+|cz#7+aZ?Y4Lm6owrL_Z2N`M zD1iC$3#Dm;lw)#&Md8zx2uG!_awPDMsO4K1N-kiD0c;#1?lvidy~rdh3tl9xK~E1~ zCKa%aS4k54?jmU`!DQ_DQtAXWMFhFqA2Jkc+?gb|`hkn3$8cxG;YJW!$XiMuP$U$> zn=O}1;{^hf(ONKAa??&Jjh18dV%W&=Aq|-QFM+@VfAuAjADnC0H9~FIatj^b6q!I4p9x_ z)Kx%`=;cyM5@sx8r<8%3#XBMP84Z4E`4{h$rl9pLJ0()nxLwjLoO|;q)Lbo1V&%J} zQS4(U#Pz@~bcaZbUD5}MnnO!)atcc#i#2xhZiv&cTT-I2Q@ahU&b&hEg5uIp0?dPi zWTb%jZ?2HeLZy>eNQ+6crniWF(AccFbm9!kHS$WS30(%SlmaY#skAHwgyd&i4XF_@ zpLdn?8hR@}BBcz6Rt&|HK2l>Aj54iF#Cae*Yi!lkMwf@LmdK+*P1u`P8x;5-S4-2O z)#JK^V)c9B)?i}*|gsk!xEPhXyosiWdHe2O=nftNM$BI-+hfl zVS&f4!CBIDZjZEs6oYfGm6jpw)I`EC&=%GJ7klkmsqjBbXIuxh#@sk0(d(p{&{Teg zz5{6c+v}wB@j7p>)J!|Sv<~Q$|A;71hPw$n_{Y6cEujCih9okW=O7$v@weieuHo)F z2&tYnI-_(_&}HNGl5g<9m~*95_wx19Ie5GJ28pcaSKc7erz{@4L8?YFY@alHunFQ3 zToA}04VUc$F^1`6A5mR)V4p<(k(#?fg--61(uk~{c_;@I5~*=updam*D9$8jzf?t1 z3TfGcD;&!9;_W*-)hL(o78dQ5({w$9%iKxhGuGk71>Olm6Z$Ni?3p|NQPqyc=t zg9K~fnCSw}Eod~pm1~@RL$#p>W7&xV(gZ{w5hpc?18DpUH%m)d(T&ot!SMgR6KJ8- z1x`GHmcjto$rGZ;{)oN7(tsE<*qEE7;p~fBjI+~mlaxmmMfCIw%Vlq)Do%~DPztAH z|F}td4l>Umtpd1zIv_2z0tECK-^B7U0g58|SsBZG1Yv3b;t2N0Js`N3-7ML77^m1f zH%d=L-36}LrY;_-fF0A>OtvJaMfoHLg~QL zzW9xF3aJ0~ZP4VWki-CfNE<`Z_$C!iM7#IAYvxrcnv89Kk5)_oL{Vt|r|Td9>Tc;ySayn7<~?9xnEZM} zp)#yNgwlxH$-Y;*LIN1>e@Oac8X>U}5q9C9rQc%Ug8zalKL^{1sex0%58~>w}&-VQw#aQ?U zJeB?^?YFqP@xdC9%5Q%(4u1bn(%$h}HGOCVAOAY7(BG3I51}xFc@~*2-fXeR4`D(M zUY;*=TbXy595jc zsN<@2d=Y0lU4uM1UA_vp{JJvaA2`c8cl@h~6X?5<`Yx;dwSapM7tfO6a9^h{x69d- zhGxqW&$YA8T)D^)S`%6|#NAw3#Vmi!l__9QbI3FJEgtg|cC0X0UW7(R9r7aj+CV+b zLx>8-y`wyN8Y*Y!$rPiwB~R`^@@}3?VFM%cjs8$Lo^8yRw~Px%8@AFtw9J*j{1SXE zB+TB)m+@g@)>I(h2;+lVVc1o|eh_Cv>@~ymY9nMmF%{YY3Z>126}6^Z9zP`0AFXy* zBe!CX+(cocP)W-1xj}qWPci<{xp`!c{CCR=PXaPS+3~sZh4@s=x_R```OCTT+v!}4J#alXIL2PTUcQ8j>7E&&KKb`@FNf?^w*z&n**&*o zA8Od*JLGaC7u+E)=luHfcL44}IO>3uc34hjUku1Ynd7iL8jD_lW zV8SmPmYp28MaQoFfydCt?vX zKPunHjYJf6Um%R{Ec=`detpE_bWlQU?i2F*aay!tON2aeCiW4dyx|GCXe`RB&M3!? zm@l4??O0pdQ5@iE<~%CT0Gu`+mD71H%6k7O??iU!Q}Qboq;EYVpU-nOy61U$|4_lz zWUFEWZ^*Nl<5hVRX0`KGc?=!Z{jbR{2^Ou1h2yxlec1`QQyyOnw_(CF;jHn~otIjc z^1l2VK;V)0$~y6ht16Sp=^b#r}0C%mfNf!{t(Cp!V8XC*vrOV z#81>+p8%hsEU93Y$E)#a3++isWNn|yQ;5*RQss}?tPZOkOrCgrk)~h!shr7MD%|Yh zFXTE)xk)=2Xy+(>{+Dt)Khi^Yh{A~Kpa$&7U*)w3>fH16*McPQ`uR6mmPzd^ZyQf z`tUO)M%O8n#x&!}9U0lQgg%8qCS>$IhFeYxTgIo>aGo#F$VFp|gzDNt?pQzPIP5-x+ z+kf6PJHwR_PJY%)=Ks}=*~|aj_J5rHcGX($r%N`;*(;}Kke#u{gw21>#pv&U1;#Hm z9fafQmfH z*Fl1&myP^Rnx?P+m)tyYSfxiP_9)FwO1=JvF+;|2sr4RZbGK67t+>jRV*GiO_1#LP L{`uG;kMjQy+GCjo diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 7f2400ed2610973ed909703e534ec9b73c19c8ae..7dbfeca7a9d3a26ecee4ea6b390076a4186e29d3 100644 GIT binary patch delta 276 zcmaESK>E;L>4p}@7N!>F7M2#)Eo@(o8s|Ev=|nm@M(VgbI#xRAI6GQ8nLFuZIyrhf z>Qp*8`a0?ufJq430wg|N?-<*3Iag1R79%Gh>8$Uhf$H?4tuz*VNI2(lb(lC$Y_#}jPAj3(2YPp~<#csoY=On-Tb htyK`DEY}I*LtjV#BIoJFr`hzGG6J?QInB0T1OW6TRv!QW delta 737 zcmaJD#Q^f0T3{BqT<8;-6^2rls0m==9xPe~sM0cs3y#PJ z1c`P4HkHl~KIv;3tfe}#4b5QNf5pj=c{*Zvn_fvH<&3q = null; + // @ts-expect-error null handling is performed in the constructor + private disconnectedButton: ButtonState; /** * All table rows in table @@ -166,9 +167,10 @@ class TableState { this.table, 'button.toggle-virtual', ); - - const caption = this.table.querySelector('caption'); - this.caption = caption; + const toggleDisconnectedButton = findFirstAdjacent( + this.table, + 'button.toggle-disconnected', + ); if (toggleEnabledButton === null) { throw new TableStateError("Table is missing a 'toggle-enabled' button.", table); @@ -182,10 +184,15 @@ class TableState { throw new TableStateError("Table is missing a 'toggle-virtual' button.", table); } + if (toggleDisconnectedButton === null) { + throw new TableStateError("Table is missing a 'toggle-disconnected' button.", table); + } + // Attach event listeners to the buttons elements. toggleEnabledButton.addEventListener('click', event => this.handleClick(event, this)); toggleDisabledButton.addEventListener('click', event => this.handleClick(event, this)); toggleVirtualButton.addEventListener('click', event => this.handleClick(event, this)); + toggleDisconnectedButton.addEventListener('click', event => this.handleClick(event, this)); // Instantiate ButtonState for each button for state management. this.enabledButton = new ButtonState( @@ -200,6 +207,10 @@ class TableState { toggleVirtualButton, table.querySelectorAll('tr[data-type="virtual"]'), ); + this.disconnectedButton = new ButtonState( + toggleDisconnectedButton, + table.querySelectorAll('tr[data-connected="disconnected"]'), + ); } catch (err) { if (err instanceof TableStateError) { // This class is useless for tables that don't have toggle buttons. @@ -211,52 +222,6 @@ class TableState { } } - /** - * Get the table caption's text. - */ - private get captionText(): string { - if (this.caption !== null) { - return this.caption.innerText; - } - return ''; - } - - /** - * Set the table caption's text. - */ - private set captionText(value: string) { - if (this.caption !== null) { - this.caption.innerText = value; - } - } - - /** - * Update the table caption's text based on the state of each toggle button. - */ - private toggleCaption(): void { - const showEnabled = this.enabledButton.buttonState === 'show'; - const showDisabled = this.disabledButton.buttonState === 'show'; - const showVirtual = this.virtualButton.buttonState === 'show'; - - if (showEnabled && !showDisabled && !showVirtual) { - this.captionText = 'Showing Enabled Interfaces'; - } else if (showEnabled && showDisabled && !showVirtual) { - this.captionText = 'Showing Enabled & Disabled Interfaces'; - } else if (!showEnabled && showDisabled && !showVirtual) { - this.captionText = 'Showing Disabled Interfaces'; - } else if (!showEnabled && !showDisabled && !showVirtual) { - this.captionText = 'Hiding Enabled, Disabled & Virtual Interfaces'; - } else if (!showEnabled && !showDisabled && showVirtual) { - this.captionText = 'Showing Virtual Interfaces'; - } else if (showEnabled && !showDisabled && showVirtual) { - this.captionText = 'Showing Enabled & Virtual Interfaces'; - } else if (showEnabled && showDisabled && showVirtual) { - this.captionText = 'Showing Enabled, Disabled & Virtual Interfaces'; - } else { - this.captionText = ''; - } - } - /** * When toggle buttons are clicked, reapply visability all rows and * pass the event to all button handlers @@ -272,7 +237,7 @@ class TableState { instance.enabledButton.handleClick(event); instance.disabledButton.handleClick(event); instance.virtualButton.handleClick(event); - instance.toggleCaption(); + instance.disconnectedButton.handleClick(event); } } diff --git a/netbox/templates/dcim/device/inc/interface_table_controls.html b/netbox/templates/dcim/device/inc/interface_table_controls.html index 36605cd25..7868d99db 100644 --- a/netbox/templates/dcim/device/inc/interface_table_controls.html +++ b/netbox/templates/dcim/device/inc/interface_table_controls.html @@ -9,5 +9,6 @@ + {% endblock extra_table_controls %} From e67624f0427f6a2c12a3abb06fc57836da8d6554 Mon Sep 17 00:00:00 2001 From: JCWasmx86 Date: Tue, 26 Sep 2023 16:41:09 +0200 Subject: [PATCH 009/271] Fixes #13666: Fix behavior for reports without test methods (#13667) --- netbox/extras/reports.py | 2 -- netbox/templates/extras/report.html | 6 +++++- netbox/templates/extras/report_list.html | 10 ++++++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index 6af81a9d9..284f69d77 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -106,8 +106,6 @@ class Report(object): 'failure': 0, 'log': [], } - if not test_methods: - raise Exception("A report must contain at least one test method.") self.test_methods = test_methods @classproperty diff --git a/netbox/templates/extras/report.html b/netbox/templates/extras/report.html index 07d6fcfd5..717c24eab 100644 --- a/netbox/templates/extras/report.html +++ b/netbox/templates/extras/report.html @@ -12,7 +12,11 @@ {% csrf_token %} {% render_form form %}
-
+ +
+
+
+
{% trans "Virtual Disks" %}
+
+ {% if perms.virtualization.add_virtualdisk %} + + {% endif %} +
+
+
+
{% plugin_full_width_page object %} diff --git a/netbox/templates/virtualization/virtualmachine/base.html b/netbox/templates/virtualization/virtualmachine/base.html index 8a1d68ed6..a147ef944 100644 --- a/netbox/templates/virtualization/virtualmachine/base.html +++ b/netbox/templates/virtualization/virtualmachine/base.html @@ -16,9 +16,23 @@ {% endblock %} {% block extra_controls %} - {% if perms.virtualization.add_vminterface %} - - {% trans "Add Interfaces" %} - - {% endif %} + + + {% endblock %} diff --git a/netbox/templates/virtualization/virtualmachine/virtual_disks.html b/netbox/templates/virtualization/virtualmachine/virtual_disks.html new file mode 100644 index 000000000..a947f9824 --- /dev/null +++ b/netbox/templates/virtualization/virtualmachine/virtual_disks.html @@ -0,0 +1,14 @@ +{% extends 'generic/object_children.html' %} +{% load helpers %} +{% load i18n %} + +{% block bulk_edit_controls %} + {{ block.super }} + {% if 'bulk_rename' in actions %} + + {% endif %} +{% endblock bulk_edit_controls %} diff --git a/netbox/templates/virtualization/virtualmachine_list.html b/netbox/templates/virtualization/virtualmachine_list.html index bbb3ddab4..8c5e81256 100644 --- a/netbox/templates/virtualization/virtualmachine_list.html +++ b/netbox/templates/virtualization/virtualmachine_list.html @@ -15,6 +15,13 @@ {% endif %} + {% if perms.virtualization.add_virtualdisk %} +
  • + +
  • + {% endif %}
    {% endif %} diff --git a/netbox/virtualization/api/nested_serializers.py b/netbox/virtualization/api/nested_serializers.py index 8c3f57c1d..afb7e39a1 100644 --- a/netbox/virtualization/api/nested_serializers.py +++ b/netbox/virtualization/api/nested_serializers.py @@ -2,12 +2,13 @@ from drf_spectacular.utils import extend_schema_serializer from rest_framework import serializers from netbox.api.serializers import WritableNestedSerializer -from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface +from virtualization.models import * __all__ = [ 'NestedClusterGroupSerializer', 'NestedClusterSerializer', 'NestedClusterTypeSerializer', + 'NestedVirtualDiskSerializer', 'NestedVMInterfaceSerializer', 'NestedVirtualMachineSerializer', ] @@ -72,3 +73,12 @@ class NestedVMInterfaceSerializer(WritableNestedSerializer): class Meta: model = VMInterface fields = ['id', 'url', 'display', 'virtual_machine', 'name'] + + +class NestedVirtualDiskSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualdisk-detail') + virtual_machine = NestedVirtualMachineSerializer(read_only=True) + + class Meta: + model = VirtualDisk + fields = ['id', 'url', 'display', 'virtual_machine', 'name', 'size'] diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index c9fa559aa..95b2152a5 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -14,7 +14,7 @@ from netbox.api.fields import ChoiceField, SerializedPKRelatedField from netbox.api.serializers import NetBoxModelSerializer from tenancy.api.nested_serializers import NestedTenantSerializer from virtualization.choices import * -from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface +from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualDisk, VirtualMachine, VMInterface from .nested_serializers import * @@ -84,6 +84,7 @@ class VirtualMachineSerializer(NetBoxModelSerializer): # Counter fields interface_count = serializers.IntegerField(read_only=True) + virtual_disk_count = serializers.IntegerField(read_only=True) class Meta: model = VirtualMachine @@ -91,7 +92,7 @@ class VirtualMachineSerializer(NetBoxModelSerializer): 'id', 'url', 'display', 'name', 'status', 'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'description', 'comments', 'config_template', 'local_context_data', 'tags', 'custom_fields', 'created', 'last_updated', - 'interface_count', + 'interface_count', 'virtual_disk_count', ] validators = [] @@ -104,7 +105,7 @@ class VirtualMachineWithConfigContextSerializer(VirtualMachineSerializer): 'id', 'url', 'display', 'name', 'status', 'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip', 'primary_ip4', 'primary_ip6', 'vcpus', 'memory', 'disk', 'description', 'comments', 'local_context_data', 'tags', 'custom_fields', 'config_context', 'created', 'last_updated', - 'interface_count', + 'interface_count', 'virtual_disk_count', ] @extend_schema_field(serializers.JSONField(allow_null=True)) @@ -159,3 +160,19 @@ class VMInterfaceSerializer(NetBoxModelSerializer): }) return super().validate(data) + + +# +# Virtual Disk +# + +class VirtualDiskSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='virtualization-api:virtualdisk-detail') + virtual_machine = NestedVirtualMachineSerializer() + + class Meta: + model = VirtualDisk + fields = [ + 'id', 'url', 'virtual_machine', 'name', 'description', 'size', 'tags', 'custom_fields', 'created', + 'last_updated', + ] diff --git a/netbox/virtualization/api/urls.py b/netbox/virtualization/api/urls.py index 2ceeb8ce6..ce71605a1 100644 --- a/netbox/virtualization/api/urls.py +++ b/netbox/virtualization/api/urls.py @@ -13,6 +13,7 @@ router.register('clusters', views.ClusterViewSet) # VirtualMachines router.register('virtual-machines', views.VirtualMachineViewSet) router.register('interfaces', views.VMInterfaceViewSet) +router.register('virtual-disks', views.VirtualDiskViewSet) app_name = 'virtualization-api' urlpatterns = router.urls diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index 2b28505ab..3ba2bb97f 100644 --- a/netbox/virtualization/api/views.py +++ b/netbox/virtualization/api/views.py @@ -6,7 +6,7 @@ from netbox.api.viewsets import NetBoxModelViewSet from utilities.query_functions import CollateAsChar from utilities.utils import count_related from virtualization import filtersets -from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface +from virtualization.models import * from . import serializers @@ -55,7 +55,8 @@ class ClusterViewSet(NetBoxModelViewSet): class VirtualMachineViewSet(ConfigContextQuerySetMixin, RenderConfigMixin, NetBoxModelViewSet): queryset = VirtualMachine.objects.prefetch_related( - 'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'config_template', 'tags' + 'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'config_template', + 'tags', 'virtualdisks', ) filterset_class = filtersets.VirtualMachineFilterSet @@ -92,3 +93,12 @@ class VMInterfaceViewSet(NetBoxModelViewSet): def get_bulk_destroy_queryset(self): # Ensure child interfaces are deleted prior to their parents return self.get_queryset().order_by('virtual_machine', 'parent', CollateAsChar('_name')) + + +class VirtualDiskViewSet(NetBoxModelViewSet): + queryset = VirtualDisk.objects.prefetch_related( + 'virtual_machine', 'tags', + ) + serializer_class = serializers.VirtualDiskSerializer + filterset_class = filtersets.VirtualDiskFilterSet + brief_prefetch_fields = ['virtual_machine'] diff --git a/netbox/virtualization/apps.py b/netbox/virtualization/apps.py index 8db943ea1..f0af9a163 100644 --- a/netbox/virtualization/apps.py +++ b/netbox/virtualization/apps.py @@ -5,7 +5,7 @@ class VirtualizationConfig(AppConfig): name = 'virtualization' def ready(self): - from . import search + from . import search, signals from .models import VirtualMachine from utilities.counters import connect_counters diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index b23808b31..351166260 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -11,12 +11,13 @@ from netbox.filtersets import OrganizationalModelFilterSet, NetBoxModelFilterSet from tenancy.filtersets import TenancyFilterSet, ContactModelFilterSet from utilities.filters import MultiValueCharFilter, MultiValueMACAddressFilter, TreeNodeMultipleChoiceFilter from .choices import * -from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface +from .models import * __all__ = ( 'ClusterFilterSet', 'ClusterGroupFilterSet', 'ClusterTypeFilterSet', + 'VirtualDiskFilterSet', 'VirtualMachineFilterSet', 'VMInterfaceFilterSet', ) @@ -305,3 +306,29 @@ class VMInterfaceFilterSet(NetBoxModelFilterSet, CommonInterfaceFilterSet): Q(name__icontains=value) | Q(description__icontains=value) ) + + +class VirtualDiskFilterSet(NetBoxModelFilterSet): + virtual_machine_id = django_filters.ModelMultipleChoiceFilter( + field_name='virtual_machine', + queryset=VirtualMachine.objects.all(), + label=_('Virtual machine (ID)'), + ) + virtual_machine = django_filters.ModelMultipleChoiceFilter( + field_name='virtual_machine__name', + queryset=VirtualMachine.objects.all(), + to_field_name='name', + label=_('Virtual machine'), + ) + + class Meta: + model = VirtualDisk + fields = ['id', 'name', 'size', 'description'] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) + ) diff --git a/netbox/virtualization/forms/bulk_create.py b/netbox/virtualization/forms/bulk_create.py index 7153453ec..a4ad867d4 100644 --- a/netbox/virtualization/forms/bulk_create.py +++ b/netbox/virtualization/forms/bulk_create.py @@ -3,9 +3,10 @@ from django.utils.translation import gettext_lazy as _ from utilities.forms import BootstrapMixin, form_from_model from utilities.forms.fields import ExpandableNameField -from virtualization.models import VMInterface, VirtualMachine +from virtualization.models import VirtualDisk, VMInterface, VirtualMachine __all__ = ( + 'VirtualDiskBulkCreateForm', 'VMInterfaceBulkCreateForm', ) @@ -30,3 +31,10 @@ class VMInterfaceBulkCreateForm( VirtualMachineBulkAddComponentForm ): replication_fields = ('name',) + + +class VirtualDiskBulkCreateForm( + form_from_model(VirtualDisk, ['size', 'description', 'tags']), + VirtualMachineBulkAddComponentForm +): + replication_fields = ('name',) diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index a33ffac53..72990ec76 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -18,6 +18,8 @@ __all__ = ( 'ClusterBulkEditForm', 'ClusterGroupBulkEditForm', 'ClusterTypeBulkEditForm', + 'VirtualDiskBulkEditForm', + 'VirtualDiskBulkRenameForm', 'VirtualMachineBulkEditForm', 'VMInterfaceBulkEditForm', 'VMInterfaceBulkRenameForm', @@ -315,3 +317,35 @@ class VMInterfaceBulkRenameForm(BulkRenameForm): queryset=VMInterface.objects.all(), widget=forms.MultipleHiddenInput() ) + + +class VirtualDiskBulkEditForm(NetBoxModelBulkEditForm): + virtual_machine = forms.ModelChoiceField( + label=_('Virtual machine'), + queryset=VirtualMachine.objects.all(), + required=False, + disabled=True, + widget=forms.HiddenInput() + ) + size = forms.IntegerField( + required=False, + label=_('Size (GB)') + ) + description = forms.CharField( + label=_('Description'), + max_length=100, + required=False + ) + + model = VirtualDisk + fieldsets = ( + (None, ('size', 'description')), + ) + nullable_fields = ('description',) + + +class VirtualDiskBulkRenameForm(BulkRenameForm): + pk = forms.ModelMultipleChoiceField( + queryset=VirtualDisk.objects.all(), + widget=forms.MultipleHiddenInput() + ) diff --git a/netbox/virtualization/forms/bulk_import.py b/netbox/virtualization/forms/bulk_import.py index 04fe2d7ae..5d44ddceb 100644 --- a/netbox/virtualization/forms/bulk_import.py +++ b/netbox/virtualization/forms/bulk_import.py @@ -14,6 +14,7 @@ __all__ = ( 'ClusterImportForm', 'ClusterGroupImportForm', 'ClusterTypeImportForm', + 'VirtualDiskImportForm', 'VirtualMachineImportForm', 'VMInterfaceImportForm', ) @@ -199,3 +200,17 @@ class VMInterfaceImportForm(NetBoxModelImportForm): return True else: return self.cleaned_data['enabled'] + + +class VirtualDiskImportForm(NetBoxModelImportForm): + virtual_machine = CSVModelChoiceField( + label=_('Virtual machine'), + queryset=VirtualMachine.objects.all(), + to_field_name='name' + ) + + class Meta: + model = VirtualDisk + fields = ( + 'virtual_machine', 'name', 'size', 'description', 'tags' + ) diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 99ac0cb77..5eb3fea1c 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -16,6 +16,7 @@ __all__ = ( 'ClusterFilterForm', 'ClusterGroupFilterForm', 'ClusterTypeFilterForm', + 'VirtualDiskFilterForm', 'VirtualMachineFilterForm', 'VMInterfaceFilterForm', ) @@ -221,3 +222,23 @@ class VMInterfaceFilterForm(NetBoxModelFilterSetForm): label=_('L2VPN') ) tag = TagFilterField(model) + + +class VirtualDiskFilterForm(NetBoxModelFilterSetForm): + model = VirtualDisk + fieldsets = ( + (None, ('q', 'filter_id', 'tag')), + (_('Virtual Machine'), ('virtual_machine_id',)), + (_('Attributes'), ('size',)), + ) + virtual_machine_id = DynamicModelMultipleChoiceField( + queryset=VirtualMachine.objects.all(), + required=False, + label=_('Virtual machine') + ) + size = forms.IntegerField( + label=_('Size (GB)'), + required=False, + min_value=1 + ) + tag = TagFilterField(model) diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index bca6a1ec6..cbbf5ea66 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -22,6 +22,7 @@ __all__ = ( 'ClusterGroupForm', 'ClusterRemoveDevicesForm', 'ClusterTypeForm', + 'VirtualDiskForm', 'VirtualMachineForm', 'VMInterfaceForm', ) @@ -240,6 +241,11 @@ class VirtualMachineForm(TenancyForm, NetBoxModelForm): if self.instance.pk: + # Disable the disk field if one or more VirtualDisks have been created + if self.instance.virtualdisks.exists(): + self.fields['disk'].widget.attrs['disabled'] = True + self.fields['disk'].help_text = _("Disk size is managed via the attachment of virtual disks.") + # Compile list of choices for primary IPv4 and IPv6 addresses for family in [4, 6]: ip_choices = [(None, '---------')] @@ -276,12 +282,26 @@ class VirtualMachineForm(TenancyForm, NetBoxModelForm): self.fields['primary_ip6'].widget.attrs['readonly'] = True -class VMInterfaceForm(InterfaceCommonForm, NetBoxModelForm): +# +# Virtual machine components +# + +class VMComponentForm(NetBoxModelForm): virtual_machine = DynamicModelChoiceField( label=_('Virtual machine'), queryset=VirtualMachine.objects.all(), selector=True ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Disable reassignment of VirtualMachine when editing an existing instance + if self.instance.pk: + self.fields['virtual_machine'].disabled = True + + +class VMInterfaceForm(InterfaceCommonForm, VMComponentForm): parent = DynamicModelChoiceField( queryset=VMInterface.objects.all(), required=False, @@ -348,9 +368,15 @@ class VMInterfaceForm(InterfaceCommonForm, NetBoxModelForm): 'mode': HTMXSelect(), } - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - # Disable reassignment of VirtualMachine when editing an existing instance - if self.instance.pk: - self.fields['virtual_machine'].disabled = True +class VirtualDiskForm(VMComponentForm): + + fieldsets = ( + (_('Disk'), ('virtual_machine', 'name', 'size', 'description', 'tags')), + ) + + class Meta: + model = VirtualDisk + fields = [ + 'virtual_machine', 'name', 'size', 'description', 'tags', + ] diff --git a/netbox/virtualization/forms/object_create.py b/netbox/virtualization/forms/object_create.py index 3ea374039..2f6844a5c 100644 --- a/netbox/virtualization/forms/object_create.py +++ b/netbox/virtualization/forms/object_create.py @@ -1,8 +1,9 @@ from django.utils.translation import gettext_lazy as _ from utilities.forms.fields import ExpandableNameField -from .model_forms import VMInterfaceForm +from .model_forms import VirtualDiskForm, VMInterfaceForm __all__ = ( + 'VirtualDiskCreateForm', 'VMInterfaceCreateForm', ) @@ -15,3 +16,13 @@ class VMInterfaceCreateForm(VMInterfaceForm): class Meta(VMInterfaceForm.Meta): exclude = ('name',) + + +class VirtualDiskCreateForm(VirtualDiskForm): + name = ExpandableNameField( + label=_('Name'), + ) + replication_fields = ('name',) + + class Meta(VirtualDiskForm.Meta): + exclude = ('name',) diff --git a/netbox/virtualization/graphql/schema.py b/netbox/virtualization/graphql/schema.py index 88e6aac64..1461faaeb 100644 --- a/netbox/virtualization/graphql/schema.py +++ b/netbox/virtualization/graphql/schema.py @@ -36,3 +36,9 @@ class VirtualizationQuery(graphene.ObjectType): def resolve_vm_interface_list(root, info, **kwargs): return gql_query_optimizer(models.VMInterface.objects.all(), info) + + virtual_disk = ObjectField(VirtualDiskType) + virtual_disk_list = ObjectListField(VirtualDiskType) + + def resolve_virtual_disk_list(root, info, **kwargs): + return gql_query_optimizer(models.VirtualDisk.objects.all(), info) diff --git a/netbox/virtualization/graphql/types.py b/netbox/virtualization/graphql/types.py index 96b0fc875..9b97e1dc9 100644 --- a/netbox/virtualization/graphql/types.py +++ b/netbox/virtualization/graphql/types.py @@ -8,6 +8,7 @@ __all__ = ( 'ClusterType', 'ClusterGroupType', 'ClusterTypeType', + 'VirtualDiskType', 'VirtualMachineType', 'VMInterfaceType', ) @@ -54,3 +55,14 @@ class VMInterfaceType(IPAddressesMixin, ComponentObjectType): def resolve_mode(self, info): return self.mode or None + + +class VirtualDiskType(ComponentObjectType): + + class Meta: + model = models.VirtualDisk + fields = '__all__' + filterset_class = filtersets.VirtualDiskFilterSet + + def resolve_mode(self, info): + return self.mode or None diff --git a/netbox/virtualization/migrations/0038_virtualdisk.py b/netbox/virtualization/migrations/0038_virtualdisk.py new file mode 100644 index 000000000..59d45c975 --- /dev/null +++ b/netbox/virtualization/migrations/0038_virtualdisk.py @@ -0,0 +1,50 @@ +from django.db import migrations, models +import django.db.models.deletion +import taggit.managers +import utilities.fields +import utilities.json +import utilities.ordering +import utilities.query_functions +import utilities.tracking + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0099_cachedvalue_ordering'), + ('virtualization', '0037_protect_child_interfaces'), + ] + + operations = [ + migrations.AddField( + model_name='virtualmachine', + name='virtual_disk_count', + field=utilities.fields.CounterCacheField(default=0, editable=False, to_field='virtual_machine', to_model='virtualization.VirtualDisk'), + ), + migrations.CreateModel( + name='VirtualDisk', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('name', models.CharField(max_length=64)), + ('_name', utilities.fields.NaturalOrderingField('name', blank=True, max_length=100, naturalize_function=utilities.ordering.naturalize_interface)), + ('description', models.CharField(blank=True, max_length=200)), + ('size', models.PositiveIntegerField()), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ('virtual_machine', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='%(class)ss', to='virtualization.virtualmachine')), + ], + options={ + 'verbose_name': 'virtual disk', + 'verbose_name_plural': 'virtual disks', + 'ordering': ('virtual_machine', utilities.query_functions.CollateAsChar('_name')), + 'abstract': False, + }, + bases=(models.Model, utilities.tracking.TrackingModelMixin), + ), + migrations.AddConstraint( + model_name='virtualdisk', + constraint=models.UniqueConstraint(fields=('virtual_machine', 'name'), name='virtualization_virtualdisk_unique_virtual_machine_name'), + ), + ] diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index eb6c2a8b0..705419186 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -2,7 +2,7 @@ from django.contrib.contenttypes.fields import GenericRelation from django.core.exceptions import ValidationError from django.core.validators import MinValueValidator from django.db import models -from django.db.models import Q +from django.db.models import Q, Sum from django.db.models.functions import Lower from django.urls import reverse from django.utils.translation import gettext_lazy as _ @@ -21,6 +21,7 @@ from utilities.tracking import TrackingModelMixin from virtualization.choices import * __all__ = ( + 'VirtualDisk', 'VirtualMachine', 'VMInterface', ) @@ -130,6 +131,10 @@ class VirtualMachine(ContactsMixin, RenderConfigMixin, ConfigContextModel, Prima to_model='virtualization.VMInterface', to_field='virtual_machine' ) + virtual_disk_count = CounterCacheField( + to_model='virtualization.VirtualDisk', + to_field='virtual_machine' + ) objects = ConfigContextModelQuerySet.as_manager() @@ -192,6 +197,17 @@ class VirtualMachine(ContactsMixin, RenderConfigMixin, ConfigContextModel, Prima ).format(device=self.device, cluster=self.cluster) }) + # Validate aggregate disk size + if self.pk: + total_disk = self.virtualdisks.aggregate(Sum('size', default=0))['size__sum'] + if total_disk and self.disk != total_disk: + raise ValidationError({ + 'disk': _( + "The specified disk size ({size}) must match the aggregate size of assigned virtual disks " + "({total_size})." + ).format(size=self.disk, total_size=total_disk) + }) + # Validate primary IP addresses interfaces = self.interfaces.all() if self.pk else None for family in (4, 6): @@ -236,11 +252,19 @@ class VirtualMachine(ContactsMixin, RenderConfigMixin, ConfigContextModel, Prima return None -class VMInterface(NetBoxModel, BaseInterface, TrackingModelMixin): +# +# VM components +# + + +class ComponentModel(NetBoxModel): + """ + An abstract model inherited by any model which has a parent VirtualMachine. + """ virtual_machine = models.ForeignKey( to='virtualization.VirtualMachine', on_delete=models.CASCADE, - related_name='interfaces' + related_name='%(class)ss' ) name = models.CharField( verbose_name=_('name'), @@ -257,6 +281,42 @@ class VMInterface(NetBoxModel, BaseInterface, TrackingModelMixin): max_length=200, blank=True ) + + class Meta: + abstract = True + ordering = ('virtual_machine', CollateAsChar('_name')) + constraints = ( + models.UniqueConstraint( + fields=('virtual_machine', 'name'), + name='%(app_label)s_%(class)s_unique_virtual_machine_name' + ), + ) + + def __str__(self): + return self.name + + def to_objectchange(self, action): + objectchange = super().to_objectchange(action) + objectchange.related_object = self.virtual_machine + return objectchange + + @property + def parent_object(self): + return self.virtual_machine + + +class VMInterface(ComponentModel, BaseInterface, TrackingModelMixin): + virtual_machine = models.ForeignKey( + to='virtualization.VirtualMachine', + on_delete=models.CASCADE, + related_name='interfaces' # Override ComponentModel + ) + _name = NaturalOrderingField( + target_field='name', + naturalize_function=naturalize_interface, + max_length=100, + blank=True + ) untagged_vlan = models.ForeignKey( to='ipam.VLAN', on_delete=models.SET_NULL, @@ -298,20 +358,10 @@ class VMInterface(NetBoxModel, BaseInterface, TrackingModelMixin): related_query_name='vminterface', ) - class Meta: - ordering = ('virtual_machine', CollateAsChar('_name')) - constraints = ( - models.UniqueConstraint( - fields=('virtual_machine', 'name'), - name='%(app_label)s_%(class)s_unique_virtual_machine_name' - ), - ) + class Meta(ComponentModel.Meta): verbose_name = _('interface') verbose_name_plural = _('interfaces') - def __str__(self): - return self.name - def get_absolute_url(self): return reverse('virtualization:vminterface', kwargs={'pk': self.pk}) @@ -359,15 +409,19 @@ class VMInterface(NetBoxModel, BaseInterface, TrackingModelMixin): ).format(untagged_vlan=self.untagged_vlan) }) - def to_objectchange(self, action): - objectchange = super().to_objectchange(action) - objectchange.related_object = self.virtual_machine - return objectchange - - @property - def parent_object(self): - return self.virtual_machine - @property def l2vpn_termination(self): return self.l2vpn_terminations.first() + + +class VirtualDisk(ComponentModel, TrackingModelMixin): + size = models.PositiveIntegerField( + verbose_name=_('size (GB)'), + ) + + class Meta(ComponentModel.Meta): + verbose_name = _('virtual disk') + verbose_name_plural = _('virtual disks') + + def get_absolute_url(self): + return reverse('virtualization:virtualdisk', args=[self.pk]) diff --git a/netbox/virtualization/search.py b/netbox/virtualization/search.py index 12174dda4..9e67a0af2 100644 --- a/netbox/virtualization/search.py +++ b/netbox/virtualization/search.py @@ -56,3 +56,13 @@ class VMInterfaceIndex(SearchIndex): ('mtu', 2000), ) display_attrs = ('virtual_machine', 'description') + + +@register_search +class VirtualDiskIndex(SearchIndex): + model = models.VirtualDisk + fields = ( + ('name', 100), + ('description', 500), + ) + display_attrs = ('virtual_machine', 'description') diff --git a/netbox/virtualization/signals.py b/netbox/virtualization/signals.py new file mode 100644 index 000000000..06f172179 --- /dev/null +++ b/netbox/virtualization/signals.py @@ -0,0 +1,16 @@ +from django.db.models import Sum +from django.db.models.signals import post_delete, post_save +from django.dispatch import receiver + +from .models import VirtualDisk, VirtualMachine + + +@receiver((post_delete, post_save), sender=VirtualDisk) +def update_virtualmachine_disk(instance, **kwargs): + """ + When a VirtualDisk has been modified, update the aggregate disk_size value of its VM. + """ + vm = instance.virtual_machine + VirtualMachine.objects.filter(pk=vm.pk).update( + disk=vm.virtualdisks.aggregate(Sum('size'))['size__sum'] + ) diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index f8473df1e..88627462a 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -4,10 +4,12 @@ from django.utils.translation import gettext_lazy as _ from dcim.tables.devices import BaseInterfaceTable from netbox.tables import NetBoxTable, columns from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin -from virtualization.models import VirtualMachine, VMInterface +from virtualization.models import VirtualDisk, VirtualMachine, VMInterface __all__ = ( + 'VirtualDiskTable', 'VirtualMachineTable', + 'VirtualMachineVirtualDiskTable', 'VirtualMachineVMInterfaceTable', 'VMInterfaceTable', ) @@ -84,6 +86,9 @@ class VirtualMachineTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable) interface_count = tables.Column( verbose_name=_('Interfaces') ) + virtual_disk_count = tables.Column( + verbose_name=_('Virtual Disks') + ) config_template = tables.Column( verbose_name=_('Config Template'), linkify=True @@ -155,3 +160,39 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable): row_attrs = { 'data-name': lambda record: record.name, } + + +class VirtualDiskTable(NetBoxTable): + virtual_machine = tables.Column( + verbose_name=_('Virtual Machine'), + linkify=True + ) + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + tags = columns.TagColumn( + url_name='virtualization:virtualdisk_list' + ) + + class Meta(NetBoxTable.Meta): + model = VirtualDisk + fields = ( + 'pk', 'id', 'virtual_machine', 'name', 'size', 'description', 'tags', + ) + default_columns = ('pk', 'name', 'virtual_machine', 'size', 'description') + row_attrs = { + 'data-name': lambda record: record.name, + } + + +class VirtualMachineVirtualDiskTable(VirtualDiskTable): + actions = columns.ActionsColumn( + actions=('edit', 'delete'), + ) + + class Meta(VirtualDiskTable.Meta): + fields = ( + 'pk', 'id', 'name', 'size', 'description', 'tags', 'actions', + ) + default_columns = ('pk', 'name', 'size', 'description') diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index b33f3afe9..819ce54e4 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -5,9 +5,9 @@ from dcim.choices import InterfaceModeChoices from dcim.models import Site from extras.models import ConfigTemplate from ipam.models import VLAN, VRF -from utilities.testing import APITestCase, APIViewTestCases, create_test_device +from utilities.testing import APITestCase, APIViewTestCases, create_test_device, create_test_virtualmachine from virtualization.choices import * -from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface +from virtualization.models import * class AppTest(APITestCase): @@ -256,10 +256,7 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase): @classmethod def setUpTestData(cls): - - clustertype = ClusterType.objects.create(name='Test Cluster Type 1', slug='test-cluster-type-1') - cluster = Cluster.objects.create(name='Test Cluster 1', type=clustertype) - virtualmachine = VirtualMachine.objects.create(cluster=cluster, name='Test VM 1') + virtualmachine = create_test_virtualmachine('Virtual Machine 1') interfaces = ( VMInterface(virtual_machine=virtualmachine, name='Interface 1'), @@ -336,3 +333,41 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase): ] self.client.delete(self._get_list_url(), data, format='json', **self.header) self.assertEqual(virtual_machine.interfaces.count(), 2) # Child & parent were both deleted + + +class VirtualDiskTest(APIViewTestCases.APIViewTestCase): + model = VirtualDisk + brief_fields = ['display', 'id', 'name', 'size', 'url', 'virtual_machine'] + bulk_update_data = { + 'size': 888, + } + graphql_base_name = 'virtual_disk' + + @classmethod + def setUpTestData(cls): + virtualmachine = create_test_virtualmachine('Virtual Machine 1') + + disks = ( + VirtualDisk(virtual_machine=virtualmachine, name='Disk 1', size=10), + VirtualDisk(virtual_machine=virtualmachine, name='Disk 2', size=20), + VirtualDisk(virtual_machine=virtualmachine, name='Disk 3', size=30), + ) + VirtualDisk.objects.bulk_create(disks) + + cls.create_data = [ + { + 'virtual_machine': virtualmachine.pk, + 'name': 'Disk 4', + 'size': 10, + }, + { + 'virtual_machine': virtualmachine.pk, + 'name': 'Disk 5', + 'size': 20, + }, + { + 'virtual_machine': virtualmachine.pk, + 'name': 'Disk 6', + 'size': 30, + }, + ] diff --git a/netbox/virtualization/tests/test_filtersets.py b/netbox/virtualization/tests/test_filtersets.py index e6fe90297..8e2e723bd 100644 --- a/netbox/virtualization/tests/test_filtersets.py +++ b/netbox/virtualization/tests/test_filtersets.py @@ -6,7 +6,7 @@ from tenancy.models import Tenant, TenantGroup from utilities.testing import ChangeLoggedFilterSetTests, create_test_device from virtualization.choices import * from virtualization.filtersets import * -from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface +from virtualization.models import * class ClusterTypeTestCase(TestCase, ChangeLoggedFilterSetTests): @@ -534,3 +534,46 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): def test_description(self): params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class VirtualDiskTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = VirtualDisk.objects.all() + filterset = VirtualDiskFilterSet + + @classmethod + def setUpTestData(cls): + cluster_type = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1') + cluster = Cluster.objects.create(name='Cluster 1', type=cluster_type) + + vms = ( + VirtualMachine(name='Virtual Machine 1', cluster=cluster), + VirtualMachine(name='Virtual Machine 2', cluster=cluster), + VirtualMachine(name='Virtual Machine 3', cluster=cluster), + ) + VirtualMachine.objects.bulk_create(vms) + + disks = ( + VirtualDisk(virtual_machine=vms[0], name='Disk 1', size=1, description='A'), + VirtualDisk(virtual_machine=vms[1], name='Disk 2', size=2, description='B'), + VirtualDisk(virtual_machine=vms[2], name='Disk 3', size=3, description='C'), + ) + VirtualDisk.objects.bulk_create(disks) + + def test_virtual_machine(self): + vms = VirtualMachine.objects.all()[:2] + params = {'virtual_machine_id': [vms[0].pk, vms[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'virtual_machine': [vms[0].name, vms[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_name(self): + params = {'name': ['Disk 1', 'Disk 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_size(self): + params = {'size': [1, 2]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_description(self): + params = {'description': ['A', 'B']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/virtualization/tests/test_models.py b/netbox/virtualization/tests/test_models.py index 782b9f07f..c94ff930e 100644 --- a/netbox/virtualization/tests/test_models.py +++ b/netbox/virtualization/tests/test_models.py @@ -90,3 +90,28 @@ class VirtualMachineTestCase(TestCase): # Uniqueness validation for name should ignore case with self.assertRaises(ValidationError): vm2.full_clean() + + def test_disk_size(self): + vm = VirtualMachine( + cluster=Cluster.objects.first(), + name='Virtual Machine 1' + ) + vm.save() + vm.refresh_from_db() + self.assertEqual(vm.disk, None) + + # Create two VirtualDisks + VirtualDisk.objects.create(virtual_machine=vm, name='Virtual Disk 1', size=10) + VirtualDisk.objects.create(virtual_machine=vm, name='Virtual Disk 2', size=10) + vm.refresh_from_db() + self.assertEqual(vm.disk, 20) + + # Delete one VirtualDisk + VirtualDisk.objects.first().delete() + vm.refresh_from_db() + self.assertEqual(vm.disk, 10) + + # Attempt to manually overwrite the aggregate disk size + vm.disk = 30 + with self.assertRaises(ValidationError): + vm.full_clean() diff --git a/netbox/virtualization/tests/test_views.py b/netbox/virtualization/tests/test_views.py index f47c386e9..ed6bef1e4 100644 --- a/netbox/virtualization/tests/test_views.py +++ b/netbox/virtualization/tests/test_views.py @@ -5,9 +5,9 @@ from netaddr import EUI from dcim.choices import InterfaceModeChoices from dcim.models import DeviceRole, Platform, Site from ipam.models import VLAN, VRF -from utilities.testing import ViewTestCases, create_tags, create_test_device +from utilities.testing import ViewTestCases, create_tags, create_test_device, create_test_virtualmachine from virtualization.choices import * -from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface +from virtualization.models import * class ClusterGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase): @@ -403,3 +403,54 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): } self.client.post(self._get_url('bulk_delete'), data) self.assertEqual(virtual_machine.interfaces.count(), 2) # Child & parent were both deleted + + +class VirtualDiskTestCase(ViewTestCases.DeviceComponentViewTestCase): + model = VirtualDisk + validation_excluded_fields = ('name',) + + @classmethod + def setUpTestData(cls): + virtualmachine = create_test_virtualmachine('Virtual Machine 1') + + disks = VirtualDisk.objects.bulk_create([ + VirtualDisk(virtual_machine=virtualmachine, name='Virtual Disk 1', size=10), + VirtualDisk(virtual_machine=virtualmachine, name='Virtual Disk 2', size=10), + VirtualDisk(virtual_machine=virtualmachine, name='Virtual Disk 3', size=10), + ]) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'virtual_machine': virtualmachine.pk, + 'name': 'Virtual Disk X', + 'size': 20, + 'description': 'New description', + 'tags': [t.pk for t in tags], + } + + cls.bulk_create_data = { + 'virtual_machine': virtualmachine.pk, + 'name': 'Virtual Disk [4-6]', + 'size': 10, + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + f"virtual_machine,name,size,description", + f"Virtual Machine 1,Disk 4,20,Fourth", + f"Virtual Machine 1,Disk 5,20,Fifth", + f"Virtual Machine 1,Disk 6,20,Sixth", + ) + + cls.csv_update_data = ( + f"id,name,size", + f"{disks[0].pk},disk1,20", + f"{disks[1].pk},disk2,20", + f"{disks[2].pk},disk3,20", + ) + + cls.bulk_edit_data = { + 'size': 30, + 'description': 'New description', + } diff --git a/netbox/virtualization/urls.py b/netbox/virtualization/urls.py index 9e5d5a670..78f88260a 100644 --- a/netbox/virtualization/urls.py +++ b/netbox/virtualization/urls.py @@ -48,4 +48,13 @@ urlpatterns = [ path('interfaces//', include(get_model_urls('virtualization', 'vminterface'))), path('virtual-machines/interfaces/add/', views.VirtualMachineBulkAddInterfaceView.as_view(), name='virtualmachine_bulk_add_vminterface'), + # Virtual disks + path('disks/', views.VirtualDiskListView.as_view(), name='virtualdisk_list'), + path('disks/add/', views.VirtualDiskCreateView.as_view(), name='virtualdisk_add'), + path('disks/import/', views.VirtualDiskBulkImportView.as_view(), name='virtualdisk_import'), + path('disks/edit/', views.VirtualDiskBulkEditView.as_view(), name='virtualdisk_bulk_edit'), + path('disks/rename/', views.VirtualDiskBulkRenameView.as_view(), name='virtualdisk_bulk_rename'), + path('disks/delete/', views.VirtualDiskBulkDeleteView.as_view(), name='virtualdisk_bulk_delete'), + path('disks//', include(get_model_urls('virtualization', 'virtualdisk'))), + path('virtual-machines/disks/add/', views.VirtualMachineBulkAddVirtualDiskView.as_view(), name='virtualmachine_bulk_add_virtualdisk'), ] diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index e8782243f..6019fc227 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -22,7 +22,7 @@ from utilities.query_functions import CollateAsChar from utilities.utils import count_related from utilities.views import ViewTab, register_model_view from . import filtersets, forms, tables -from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface +from .models import * # @@ -378,6 +378,28 @@ class VirtualMachineInterfacesView(generic.ObjectChildrenView): ) +@register_model_view(VirtualMachine, 'disks') +class VirtualMachineVirtualDisksView(generic.ObjectChildrenView): + queryset = VirtualMachine.objects.all() + child_model = VirtualDisk + table = tables.VirtualMachineVirtualDiskTable + filterset = filtersets.VirtualDiskFilterSet + template_name = 'virtualization/virtualmachine/virtual_disks.html' + tab = ViewTab( + label=_('Virtual Disks'), + badge=lambda obj: obj.virtual_disk_count, + permission='virtualization.view_virtual_disk', + weight=500 + ) + actions = { + **DEFAULT_ACTION_PERMISSIONS, + 'bulk_rename': {'change'}, + } + + def get_children(self, request, parent): + return parent.virtualdisks.restrict(request.user, 'view').prefetch_related('tags') + + @register_model_view(VirtualMachine, 'configcontext', path='config-context') class VirtualMachineConfigContextView(ObjectConfigContextView): queryset = VirtualMachine.objects.annotate_config_context_data() @@ -556,6 +578,62 @@ class VMInterfaceBulkDeleteView(generic.BulkDeleteView): table = tables.VMInterfaceTable +# +# Virtual disks +# + +class VirtualDiskListView(generic.ObjectListView): + queryset = VirtualDisk.objects.all() + filterset = filtersets.VirtualDiskFilterSet + filterset_form = forms.VirtualDiskFilterForm + table = tables.VirtualDiskTable + + +@register_model_view(VirtualDisk) +class VirtualDiskView(generic.ObjectView): + queryset = VirtualDisk.objects.all() + + +class VirtualDiskCreateView(generic.ComponentCreateView): + queryset = VirtualDisk.objects.all() + form = forms.VirtualDiskCreateForm + model_form = forms.VirtualDiskForm + + +@register_model_view(VirtualDisk, 'edit') +class VirtualDiskEditView(generic.ObjectEditView): + queryset = VirtualDisk.objects.all() + form = forms.VirtualDiskForm + + +@register_model_view(VirtualDisk, 'delete') +class VirtualDiskDeleteView(generic.ObjectDeleteView): + queryset = VirtualDisk.objects.all() + + +class VirtualDiskBulkImportView(generic.BulkImportView): + queryset = VirtualDisk.objects.all() + model_form = forms.VirtualDiskImportForm + + +class VirtualDiskBulkEditView(generic.BulkEditView): + queryset = VirtualDisk.objects.all() + filterset = filtersets.VirtualDiskFilterSet + table = tables.VirtualDiskTable + form = forms.VirtualDiskBulkEditForm + + +class VirtualDiskBulkRenameView(generic.BulkRenameView): + queryset = VirtualDisk.objects.all() + form = forms.VirtualDiskBulkRenameForm + + +class VirtualDiskBulkDeleteView(generic.BulkDeleteView): + queryset = VirtualDisk.objects.all() + filterset = filtersets.VirtualDiskFilterSet + table = tables.VirtualDiskTable + + # # Bulk Device component creation # @@ -572,3 +650,17 @@ class VirtualMachineBulkAddInterfaceView(generic.BulkComponentCreateView): def get_required_permission(self): return f'virtualization.add_vminterface' + + +class VirtualMachineBulkAddVirtualDiskView(generic.BulkComponentCreateView): + parent_model = VirtualMachine + parent_field = 'virtual_machine' + form = forms.VirtualDiskBulkCreateForm + queryset = VirtualDisk.objects.all() + model_form = forms.VirtualDiskForm + filterset = filtersets.VirtualMachineFilterSet + table = tables.VirtualMachineTable + default_return_url = 'virtualization:virtualmachine_list' + + def get_required_permission(self): + return f'virtualization.add_virtualdisk' From a73ba00aa03f8ce6b544f7193a9b3190057c4a49 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 20 Nov 2023 13:06:34 -0500 Subject: [PATCH 102/271] Closes #13299: Improve options for controlling custom field visibility (#14289) * Add ui_visible and ui_editable fields * Extend migration to map new visible/editable values * Remove ui_visibility field * Update docs --- docs/customization/custom-fields.md | 16 ++++++-- docs/models/extras/customfield.md | 25 +++++++---- netbox/extras/api/serializers.py | 9 ++-- netbox/extras/choices.py | 29 +++++++++---- netbox/extras/filtersets.py | 4 +- netbox/extras/forms/bulk_edit.py | 14 ++++--- netbox/extras/forms/bulk_import.py | 17 +++++--- netbox/extras/forms/filtersets.py | 13 ++++-- netbox/extras/forms/mixins.py | 7 +--- netbox/extras/forms/model_forms.py | 2 +- .../migrations/0100_customfield_ui_attrs.py | 41 +++++++++++++++++++ netbox/extras/models/customfields.py | 31 ++++++++++---- netbox/extras/tables/tables.py | 11 +++-- netbox/extras/tests/test_filtersets.py | 23 +++++++---- netbox/extras/tests/test_views.py | 13 +++--- netbox/netbox/forms/base.py | 13 +++--- netbox/netbox/models/features.py | 17 ++++---- netbox/netbox/tables/tables.py | 4 +- netbox/templates/extras/customfield.html | 8 +++- 19 files changed, 204 insertions(+), 93 deletions(-) create mode 100644 netbox/extras/migrations/0100_customfield_ui_attrs.py diff --git a/docs/customization/custom-fields.md b/docs/customization/custom-fields.md index 1e0d5c31e..e9ff7bd9f 100644 --- a/docs/customization/custom-fields.md +++ b/docs/customization/custom-fields.md @@ -40,14 +40,22 @@ Related custom fields can be grouped together within the UI by assigning each th This parameter has no effect on the API representation of custom field data. -### Visibility +### Visibility & Editing -When creating a custom field, there are three options for UI visibility. These control how and whether the custom field is displayed within the NetBox UI. +!!! info "This feature was improved in NetBox v3.7." -* **Read/write** (default): The custom field is included when viewing and editing objects. -* **Read-only**: The custom field is displayed when viewing an object, but it cannot be edited via the UI. (It will appear in the form as a read-only field.) +When creating a custom field, users can control the conditions under which it may be displayed and edited within the NetBox user interface. The following choices are available for controlling the display of a custom field on an object: + +* **Always** (default): The custom field is included when viewing an object. +* **If Set**: The custom field is included only if a value has been defined for the object. * **Hidden**: The custom field will never be displayed within the UI. This option is recommended for fields which are not intended for use by human users. +Additionally, the following options are available for controlling whether custom field values can be altered within the NetBox UI: + +* **Yes** (default): The custom field's value may be modified when editing an object. +* **No**: The custom field is displayed for reference when editing an object, but its value may not be modified. +* **Hidden**: The custom field is not displayed when editing an object. + Note that this setting has no impact on the REST or GraphQL APIs: Custom field data will always be available via either API. ### Validation diff --git a/docs/models/extras/customfield.md b/docs/models/extras/customfield.md index bf0c4755a..e68ddb79d 100644 --- a/docs/models/extras/customfield.md +++ b/docs/models/extras/customfield.md @@ -64,16 +64,25 @@ Defines how filters are evaluated against custom field values. | Loose | Match any occurrence of the value | | Exact | Match only the complete field value | -### UI Visibility +### UI Visible -Controls how and whether the custom field is displayed within the NetBox user interface. +Controls whether the custom field is displayed for objects within the NetBox user interface. -| Option | Description | -|-------------------|--------------------------------------------------| -| Read/write | Display and permit editing (default) | -| Read-only | Display field but disallow editing | -| Hidden | Do not display field in the UI | -| Hidden (if unset) | Display in the UI only when a value has been set | +| Option | Description | +|--------|----------------------------------------------------------------| +| Always | The field is always displayed when viewing an object (default) | +| If set | The field is displayed only if a value has been defined | +| Hidden | The field is not displayed when viewing an object | + +### UI Editable + +Controls whether the custom field is editable on objects within the NetBox user interface. + +| Option | Description | +|--------|------------------------------------------------------------------------------| +| Yes | The field's value may be changed when editing an object (default) | +| No | The field's value is displayed when editing an object but may not be altered | +| Hidden | The field is not displayed when editing an object | ### Default diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 4864253ab..4e1b47503 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -95,15 +95,16 @@ class CustomFieldSerializer(ValidatedModelSerializer): filter_logic = ChoiceField(choices=CustomFieldFilterLogicChoices, required=False) data_type = serializers.SerializerMethodField() choice_set = NestedCustomFieldChoiceSetSerializer(required=False) - ui_visibility = ChoiceField(choices=CustomFieldVisibilityChoices, required=False) + ui_visible = ChoiceField(choices=CustomFieldUIVisibleChoices, required=False) + ui_editable = ChoiceField(choices=CustomFieldUIEditableChoices, required=False) class Meta: model = CustomField fields = [ 'id', 'url', 'display', 'content_types', 'type', 'object_type', 'data_type', 'name', 'label', 'group_name', - 'description', 'required', 'search_weight', 'filter_logic', 'ui_visibility', 'is_cloneable', 'default', - 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex', 'choice_set', 'created', - 'last_updated', + 'description', 'required', 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable', 'is_cloneable', + 'default', 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex', 'choice_set', + 'created', 'last_updated', ] def validate_type(self, value): diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index 0572a33a1..fdb951b7d 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -53,18 +53,29 @@ class CustomFieldFilterLogicChoices(ChoiceSet): ) -class CustomFieldVisibilityChoices(ChoiceSet): +class CustomFieldUIVisibleChoices(ChoiceSet): - VISIBILITY_READ_WRITE = 'read-write' - VISIBILITY_READ_ONLY = 'read-only' - VISIBILITY_HIDDEN = 'hidden' - VISIBILITY_HIDDEN_IFUNSET = 'hidden-ifunset' + ALWAYS = 'always' + IF_SET = 'if-set' + HIDDEN = 'hidden' CHOICES = ( - (VISIBILITY_READ_WRITE, _('Read/write')), - (VISIBILITY_READ_ONLY, _('Read-only')), - (VISIBILITY_HIDDEN, _('Hidden')), - (VISIBILITY_HIDDEN_IFUNSET, _('Hidden (if unset)')), + (ALWAYS, _('Always'), 'green'), + (IF_SET, _('If set'), 'yellow'), + (HIDDEN, _('Hidden'), 'gray'), + ) + + +class CustomFieldUIEditableChoices(ChoiceSet): + + YES = 'yes' + NO = 'no' + HIDDEN = 'hidden' + + CHOICES = ( + (YES, _('Yes'), 'green'), + (NO, _('No'), 'red'), + (HIDDEN, _('Hidden'), 'gray'), ) diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index fec067263..32850bee2 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -87,8 +87,8 @@ class CustomFieldFilterSet(BaseFilterSet): class Meta: model = CustomField fields = [ - 'id', 'content_types', 'name', 'group_name', 'required', 'search_weight', 'filter_logic', 'ui_visibility', - 'weight', 'is_cloneable', 'description', + 'id', 'content_types', 'name', 'group_name', 'required', 'search_weight', 'filter_logic', 'ui_visible', + 'ui_editable', 'weight', 'is_cloneable', 'description', ] def search(self, queryset, name, value): diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index 821ce7eb2..5da2a5dde 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -48,11 +48,15 @@ class CustomFieldBulkEditForm(BulkEditForm): queryset=CustomFieldChoiceSet.objects.all(), required=False ) - ui_visibility = forms.ChoiceField( - label=_("UI visibility"), - choices=add_blank_choice(CustomFieldVisibilityChoices), - required=False, - initial='' + ui_visible = forms.ChoiceField( + label=_("UI visible"), + choices=add_blank_choice(CustomFieldUIVisibleChoices), + required=False + ) + ui_editable = forms.ChoiceField( + label=_("UI editable"), + choices=add_blank_choice(CustomFieldUIEditableChoices), + required=False ) is_cloneable = forms.NullBooleanField( label=_('Is cloneable'), diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index 9b3f59af0..181b1f8d3 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -49,10 +49,17 @@ class CustomFieldImportForm(CSVModelForm): required=False, help_text=_('Choice set (for selection fields)') ) - ui_visibility = CSVChoiceField( - label=_('UI visibility'), - choices=CustomFieldVisibilityChoices, - help_text=_('How the custom field is displayed in the user interface') + ui_visible = CSVChoiceField( + label=_('UI visible'), + choices=CustomFieldUIVisibleChoices, + required=False, + help_text=_('Whether the custom field is displayed in the UI') + ) + ui_editable = CSVChoiceField( + label=_('UI editable'), + choices=CustomFieldUIEditableChoices, + required=False, + help_text=_('Whether the custom field is editable in the UI') ) class Meta: @@ -60,7 +67,7 @@ class CustomFieldImportForm(CSVModelForm): fields = ( 'name', 'label', 'group_name', 'type', 'content_types', 'object_type', 'required', 'description', 'search_weight', 'filter_logic', 'default', 'choice_set', 'weight', 'validation_minimum', - 'validation_maximum', 'validation_regex', 'ui_visibility', 'is_cloneable', + 'validation_maximum', 'validation_regex', 'ui_visible', 'ui_editable', 'is_cloneable', ) diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 2d438377b..5da3ba1e6 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -38,7 +38,7 @@ class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): fieldsets = ( (None, ('q', 'filter_id')), (_('Attributes'), ( - 'type', 'content_type_id', 'group_name', 'weight', 'required', 'choice_set_id', 'ui_visibility', + 'type', 'content_type_id', 'group_name', 'weight', 'required', 'choice_set_id', 'ui_visible', 'ui_editable', 'is_cloneable', )), ) @@ -72,10 +72,15 @@ class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): required=False, label=_('Choice set') ) - ui_visibility = forms.ChoiceField( - choices=add_blank_choice(CustomFieldVisibilityChoices), + ui_visible = forms.ChoiceField( + choices=add_blank_choice(CustomFieldUIVisibleChoices), required=False, - label=_('UI visibility') + label=_('UI visible') + ) + ui_editable = forms.ChoiceField( + choices=add_blank_choice(CustomFieldUIEditableChoices), + required=False, + label=_('UI editable') ) is_cloneable = forms.NullBooleanField( label=_('Is cloneable'), diff --git a/netbox/extras/forms/mixins.py b/netbox/extras/forms/mixins.py index 5366dcc28..e9fb897c0 100644 --- a/netbox/extras/forms/mixins.py +++ b/netbox/extras/forms/mixins.py @@ -2,7 +2,7 @@ from django import forms from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext as _ -from extras.choices import CustomFieldVisibilityChoices +from extras.choices import * from extras.models import * from utilities.forms.fields import DynamicModelMultipleChoiceField @@ -40,7 +40,7 @@ class CustomFieldsMixin: def _get_custom_fields(self, content_type): return CustomField.objects.filter(content_types=content_type).exclude( - ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_HIDDEN + ui_visible=CustomFieldUIVisibleChoices.HIDDEN ) def _get_form_field(self, customfield): @@ -51,9 +51,6 @@ class CustomFieldsMixin: Append form fields for all CustomFields assigned to this object type. """ for customfield in self._get_custom_fields(self._get_content_type()): - if customfield.ui_visibility == CustomFieldVisibilityChoices.VISIBILITY_HIDDEN: - continue - field_name = f'cf_{customfield.name}' self.fields[field_name] = self._get_form_field(customfield) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 755f7e836..1a4d45f9a 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -59,7 +59,7 @@ class CustomFieldForm(BootstrapMixin, forms.ModelForm): (_('Custom Field'), ( 'content_types', 'name', 'label', 'group_name', 'type', 'object_type', 'required', 'description', )), - (_('Behavior'), ('search_weight', 'filter_logic', 'ui_visibility', 'weight', 'is_cloneable')), + (_('Behavior'), ('search_weight', 'filter_logic', 'ui_visible', 'ui_editable', 'weight', 'is_cloneable')), (_('Values'), ('default', 'choice_set')), (_('Validation'), ('validation_minimum', 'validation_maximum', 'validation_regex')), ) diff --git a/netbox/extras/migrations/0100_customfield_ui_attrs.py b/netbox/extras/migrations/0100_customfield_ui_attrs.py new file mode 100644 index 000000000..a4a713a86 --- /dev/null +++ b/netbox/extras/migrations/0100_customfield_ui_attrs.py @@ -0,0 +1,41 @@ +from django.db import migrations, models + + +def update_ui_attrs(apps, schema_editor): + """ + Replicate legacy ui_visibility values to the new ui_visible and ui_editable fields. + """ + CustomField = apps.get_model('extras', 'CustomField') + + CustomField.objects.filter(ui_visibility='read-write').update(ui_visible='always', ui_editable='yes') + CustomField.objects.filter(ui_visibility='read-only').update(ui_visible='always', ui_editable='no') + CustomField.objects.filter(ui_visibility='hidden').update(ui_visible='hidden', ui_editable='hidden') + CustomField.objects.filter(ui_visibility='hidden-ifunset').update(ui_visible='if-set', ui_editable='yes') + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0099_cachedvalue_ordering'), + ] + + operations = [ + migrations.AddField( + model_name='customfield', + name='ui_editable', + field=models.CharField(default='yes', max_length=50), + ), + migrations.AddField( + model_name='customfield', + name='ui_visible', + field=models.CharField(default='always', max_length=50), + ), + migrations.RunPython( + code=update_ui_attrs, + reverse_code=migrations.RunPython.noop + ), + migrations.RemoveField( + model_name='customfield', + name='ui_visibility', + ), + ] diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index 939e8b73b..08190d20f 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -177,12 +177,19 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): blank=True, null=True ) - ui_visibility = models.CharField( + ui_visible = models.CharField( max_length=50, - choices=CustomFieldVisibilityChoices, - default=CustomFieldVisibilityChoices.VISIBILITY_READ_WRITE, - verbose_name=_('UI visibility'), - help_text=_('Specifies the visibility of custom field in the UI') + choices=CustomFieldUIVisibleChoices, + default=CustomFieldUIVisibleChoices.ALWAYS, + verbose_name=_('UI visible'), + help_text=_('Specifies whether the custom field is displayed in the UI') + ) + ui_editable = models.CharField( + max_length=50, + choices=CustomFieldUIEditableChoices, + default=CustomFieldUIEditableChoices.YES, + verbose_name=_('UI editable'), + help_text=_('Specifies whether the custom field value can be edited in the UI') ) is_cloneable = models.BooleanField( default=False, @@ -195,7 +202,7 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): clone_fields = ( 'content_types', 'type', 'object_type', 'group_name', 'description', 'required', 'search_weight', 'filter_logic', 'default', 'weight', 'validation_minimum', 'validation_maximum', 'validation_regex', - 'choice_set', 'ui_visibility', 'is_cloneable', + 'choice_set', 'ui_visible', 'ui_editable', 'is_cloneable', ) class Meta: @@ -229,6 +236,12 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): return self.choice_set.choices return [] + def get_ui_visible_color(self): + return CustomFieldUIVisibleChoices.colors.get(self.ui_visible) + + def get_ui_editable_color(self): + return CustomFieldUIEditableChoices.colors.get(self.ui_editable) + def get_choice_label(self, value): if not hasattr(self, '_choice_map'): self._choice_map = dict(self.choices) @@ -379,7 +392,7 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): set_initial: Set initial data for the field. This should be False when generating a field for bulk editing. enforce_required: Honor the value of CustomField.required. Set to False for filtering/bulk editing. - enforce_visibility: Honor the value of CustomField.ui_visibility. Set to False for filtering. + enforce_visibility: Honor the value of CustomField.ui_visible. Set to False for filtering. for_csv_import: Return a form field suitable for bulk import of objects in CSV format. """ initial = self.default if set_initial else None @@ -504,10 +517,10 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): field.help_text = render_markdown(self.description) # Annotate read-only fields - if enforce_visibility and self.ui_visibility == CustomFieldVisibilityChoices.VISIBILITY_READ_ONLY: + if enforce_visibility and self.ui_editable != CustomFieldUIEditableChoices.YES: field.disabled = True prepend = '
    ' if field.help_text else '' - field.help_text += f'{prepend} ' + _('Field is set to read-only.') + field.help_text += f'{prepend} ' + _('Field is not editable.') return field diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index 9e14a2d27..54194c00f 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -71,8 +71,11 @@ class CustomFieldTable(NetBoxTable): required = columns.BooleanColumn( verbose_name=_('Required') ) - ui_visibility = columns.ChoiceFieldColumn( - verbose_name=_('UI Visibility') + ui_visible = columns.ChoiceFieldColumn( + verbose_name=_('Visible') + ) + ui_editable = columns.ChoiceFieldColumn( + verbose_name=_('Editable') ) description = columns.MarkdownColumn( verbose_name=_('Description') @@ -94,8 +97,8 @@ class CustomFieldTable(NetBoxTable): model = CustomField fields = ( 'pk', 'id', 'name', 'content_types', 'label', 'type', 'group_name', 'required', 'default', 'description', - 'search_weight', 'filter_logic', 'ui_visibility', 'is_cloneable', 'weight', 'choice_set', 'choices', - 'created', 'last_updated', + 'search_weight', 'filter_logic', 'ui_visible', 'ui_editable', 'is_cloneable', 'weight', 'choice_set', + 'choices', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'content_types', 'label', 'group_name', 'type', 'required', 'description') diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index 69111e6a7..c5a6706c0 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -40,7 +40,8 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests): required=True, weight=100, filter_logic=CustomFieldFilterLogicChoices.FILTER_LOOSE, - ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_READ_WRITE + ui_visible=CustomFieldUIVisibleChoices.ALWAYS, + ui_editable=CustomFieldUIEditableChoices.YES ), CustomField( name='Custom Field 2', @@ -48,7 +49,8 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests): required=False, weight=200, filter_logic=CustomFieldFilterLogicChoices.FILTER_EXACT, - ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_READ_ONLY + ui_visible=CustomFieldUIVisibleChoices.IF_SET, + ui_editable=CustomFieldUIEditableChoices.NO ), CustomField( name='Custom Field 3', @@ -56,7 +58,8 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests): required=False, weight=300, filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED, - ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_HIDDEN + ui_visible=CustomFieldUIVisibleChoices.HIDDEN, + ui_editable=CustomFieldUIEditableChoices.HIDDEN ), CustomField( name='Custom Field 4', @@ -64,7 +67,8 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests): required=False, weight=400, filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED, - ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_HIDDEN, + ui_visible=CustomFieldUIVisibleChoices.HIDDEN, + ui_editable=CustomFieldUIEditableChoices.HIDDEN, choice_set=choice_sets[0] ), CustomField( @@ -73,7 +77,8 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests): required=False, weight=500, filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED, - ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_HIDDEN, + ui_visible=CustomFieldUIVisibleChoices.HIDDEN, + ui_editable=CustomFieldUIEditableChoices.HIDDEN, choice_set=choice_sets[1] ), ) @@ -106,8 +111,12 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests): params = {'filter_logic': CustomFieldFilterLogicChoices.FILTER_LOOSE} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - def test_ui_visibility(self): - params = {'ui_visibility': CustomFieldVisibilityChoices.VISIBILITY_READ_WRITE} + def test_ui_visible(self): + params = {'ui_visible': CustomFieldUIVisibleChoices.ALWAYS} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_ui_editable(self): + params = {'ui_editable': CustomFieldUIEditableChoices.YES} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) def test_choice_set(self): diff --git a/netbox/extras/tests/test_views.py b/netbox/extras/tests/test_views.py index e034abff5..3d4b3e9a9 100644 --- a/netbox/extras/tests/test_views.py +++ b/netbox/extras/tests/test_views.py @@ -50,15 +50,16 @@ class CustomFieldTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'default': None, 'weight': 200, 'required': True, - 'ui_visibility': CustomFieldVisibilityChoices.VISIBILITY_READ_WRITE, + 'ui_visible': CustomFieldUIVisibleChoices.ALWAYS, + 'ui_editable': CustomFieldUIEditableChoices.YES, } cls.csv_data = ( - 'name,label,type,content_types,object_type,weight,search_weight,filter_logic,choice_set,validation_minimum,validation_maximum,validation_regex,ui_visibility', - 'field4,Field 4,text,dcim.site,,100,1000,exact,,,,[a-z]{3},read-write', - 'field5,Field 5,integer,dcim.site,,100,2000,exact,,1,100,,read-write', - 'field6,Field 6,select,dcim.site,,100,3000,exact,Choice Set 1,,,,read-write', - 'field7,Field 7,object,dcim.site,dcim.region,100,4000,exact,,,,,read-write', + 'name,label,type,content_types,object_type,weight,search_weight,filter_logic,choice_set,validation_minimum,validation_maximum,validation_regex,ui_visible,ui_editable', + 'field4,Field 4,text,dcim.site,,100,1000,exact,,,,[a-z]{3},always,yes', + 'field5,Field 5,integer,dcim.site,,100,2000,exact,,1,100,,always,yes', + 'field6,Field 6,select,dcim.site,,100,3000,exact,Choice Set 1,,,,always,yes', + 'field7,Field 7,object,dcim.site,dcim.region,100,4000,exact,,,,,always,yes', ) cls.csv_update_data = ( diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 43d0850f0..b51efe9c0 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -3,7 +3,7 @@ from django.contrib.contenttypes.models import ContentType from django.db.models import Q from django.utils.translation import gettext_lazy as _ -from extras.choices import CustomFieldFilterLogicChoices, CustomFieldTypeChoices, CustomFieldVisibilityChoices +from extras.choices import * from extras.forms.mixins import CustomFieldsMixin, SavedFiltersMixin, TagsMixin from extras.models import CustomField, Tag from utilities.forms import CSVModelForm @@ -76,11 +76,9 @@ class NetBoxModelImportForm(CSVModelForm, NetBoxModelForm): ) def _get_custom_fields(self, content_type): - return CustomField.objects.filter(content_types=content_type).filter( - ui_visibility__in=[ - CustomFieldVisibilityChoices.VISIBILITY_READ_WRITE, - CustomFieldVisibilityChoices.VISIBILITY_HIDDEN_IFUNSET, - ] + return CustomField.objects.filter( + content_types=content_type, + ui_editable=CustomFieldUIEditableChoices.YES ) def _get_form_field(self, customfield): @@ -131,7 +129,8 @@ class NetBoxModelBulkEditForm(BootstrapMixin, CustomFieldsMixin, forms.Form): def _extend_nullable_fields(self): nullable_custom_fields = [ - name for name, customfield in self.custom_fields.items() if (not customfield.required and customfield.ui_visibility == CustomFieldVisibilityChoices.VISIBILITY_READ_WRITE) + name for name, customfield in self.custom_fields.items() + if (not customfield.required and customfield.ui_editable == CustomFieldUIEditableChoices.YES) ] self.nullable_fields = (*self.nullable_fields, *nullable_custom_fields) diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index 11307b4f8..f39f35620 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -13,7 +13,7 @@ from taggit.managers import TaggableManager from core.choices import JobStatusChoices from core.models import ContentType -from extras.choices import CustomFieldVisibilityChoices, ObjectChangeActionChoices +from extras.choices import * from extras.utils import is_taggable, register_features from netbox.registry import registry from netbox.signals import post_clean @@ -205,12 +205,11 @@ class CustomFieldsMixin(models.Model): for field in CustomField.objects.get_for_model(self): value = self.custom_field_data.get(field.name) - # Skip fields that are hidden if 'omit_hidden' is set - if omit_hidden: - if field.ui_visibility == CustomFieldVisibilityChoices.VISIBILITY_HIDDEN: - continue - if field.ui_visibility == CustomFieldVisibilityChoices.VISIBILITY_HIDDEN_IFUNSET and not value: - continue + # Skip hidden fields if 'omit_hidden' is True + if omit_hidden and field.ui_visible == CustomFieldUIVisibleChoices.HIDDEN: + continue + elif omit_hidden and field.ui_visible == CustomFieldUIVisibleChoices.IF_SET and not value: + continue data[field] = field.deserialize(value) @@ -232,12 +231,12 @@ class CustomFieldsMixin(models.Model): from extras.models import CustomField groups = defaultdict(dict) visible_custom_fields = CustomField.objects.get_for_model(self).exclude( - ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_HIDDEN + ui_visible=CustomFieldUIVisibleChoices.HIDDEN ) for cf in visible_custom_fields: value = self.custom_field_data.get(cf.name) - if value in (None, []) and cf.ui_visibility == CustomFieldVisibilityChoices.VISIBILITY_HIDDEN_IFUNSET: + if value in (None, []) and cf.ui_visible == CustomFieldUIVisibleChoices.IF_SET: continue value = cf.deserialize(value) groups[cf.group_name][cf] = value diff --git a/netbox/netbox/tables/tables.py b/netbox/netbox/tables/tables.py index 83dc3ae3c..495e56991 100644 --- a/netbox/netbox/tables/tables.py +++ b/netbox/netbox/tables/tables.py @@ -12,8 +12,8 @@ from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from django_tables2.data import TableQuerysetData +from extras.choices import * from extras.models import CustomField, CustomLink -from extras.choices import CustomFieldVisibilityChoices from netbox.registry import registry from netbox.tables import columns from utilities.paginator import EnhancedPaginator, get_paginate_count @@ -204,7 +204,7 @@ class NetBoxTable(BaseTable): content_type = ContentType.objects.get_for_model(self._meta.model) custom_fields = CustomField.objects.filter( content_types=content_type - ).exclude(ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_HIDDEN) + ).exclude(ui_visible=CustomFieldUIVisibleChoices.HIDDEN) extra_columns.extend([ (f'cf_{cf.name}', columns.CustomFieldColumn(cf)) for cf in custom_fields ]) diff --git a/netbox/templates/extras/customfield.html b/netbox/templates/extras/customfield.html index dd5cce7bd..95919b414 100644 --- a/netbox/templates/extras/customfield.html +++ b/netbox/templates/extras/customfield.html @@ -79,8 +79,12 @@ {{ object.weight }} - {% trans "UI Visibility" %} - {{ object.get_ui_visibility_display }} + {% trans "UI Visible" %} + {{ object.get_ui_visible_display }} + + + {% trans "UI Editable" %} + {{ object.get_ui_editable_display }}
    From 18422e1d268cff15d58fd93a709f5136ce43ad80 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 22 Nov 2023 13:49:26 -0500 Subject: [PATCH 103/271] Closes #14326: Move form mixins (#14327) * Move form mixins from extras app to netbox app * Remove obsolete extras/admin.py --- netbox/core/forms/filtersets.py | 2 +- netbox/dcim/forms/bulk_create.py | 4 ++-- netbox/extras/admin.py | 2 -- netbox/extras/forms/__init__.py | 1 - netbox/extras/forms/filtersets.py | 2 +- netbox/netbox/forms/base.py | 2 +- netbox/{extras => netbox}/forms/mixins.py | 0 netbox/users/forms/filtersets.py | 8 +++----- 8 files changed, 8 insertions(+), 13 deletions(-) delete mode 100644 netbox/extras/admin.py rename netbox/{extras => netbox}/forms/mixins.py (100%) diff --git a/netbox/core/forms/filtersets.py b/netbox/core/forms/filtersets.py index a567a9fed..14f0fb6ed 100644 --- a/netbox/core/forms/filtersets.py +++ b/netbox/core/forms/filtersets.py @@ -4,8 +4,8 @@ from django.utils.translation import gettext_lazy as _ from core.choices import * from core.models import * -from extras.forms.mixins import SavedFiltersMixin from netbox.forms import NetBoxModelFilterSetForm +from netbox.forms.mixins import SavedFiltersMixin from netbox.utils import get_data_backend_choices from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm from utilities.forms.fields import ContentTypeChoiceField, DynamicModelMultipleChoiceField diff --git a/netbox/dcim/forms/bulk_create.py b/netbox/dcim/forms/bulk_create.py index 02aa5a3e4..2a84a9a51 100644 --- a/netbox/dcim/forms/bulk_create.py +++ b/netbox/dcim/forms/bulk_create.py @@ -1,9 +1,9 @@ from django import forms +from django.utils.translation import gettext_lazy as _ from dcim.models import * -from django.utils.translation import gettext_lazy as _ -from extras.forms import CustomFieldsMixin from extras.models import Tag +from netbox.forms.mixins import CustomFieldsMixin from utilities.forms import BootstrapMixin, form_from_model from utilities.forms.fields import DynamicModelMultipleChoiceField, ExpandableNameField from .object_create import ComponentCreateForm diff --git a/netbox/extras/admin.py b/netbox/extras/admin.py deleted file mode 100644 index 6e82ffc75..000000000 --- a/netbox/extras/admin.py +++ /dev/null @@ -1,2 +0,0 @@ -# TODO: Removing this import triggers an import loop due to how form mixins are currently organized -from .forms import ConfigRevisionForm diff --git a/netbox/extras/forms/__init__.py b/netbox/extras/forms/__init__.py index e203bee46..8bebaeec2 100644 --- a/netbox/extras/forms/__init__.py +++ b/netbox/extras/forms/__init__.py @@ -3,5 +3,4 @@ from .filtersets import * from .bulk_edit import * from .bulk_import import * from .misc import * -from .mixins import * from .scripts import * diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 5da3ba1e6..28aefa685 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -7,6 +7,7 @@ from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site from extras.choices import * from extras.models import * from netbox.forms.base import NetBoxModelFilterSetForm +from netbox.forms.mixins import SavedFiltersMixin from tenancy.models import Tenant, TenantGroup from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice from utilities.forms.fields import ( @@ -14,7 +15,6 @@ from utilities.forms.fields import ( ) from utilities.forms.widgets import APISelectMultiple, DateTimePicker from virtualization.models import Cluster, ClusterGroup, ClusterType -from .mixins import * __all__ = ( 'ConfigContextFilterForm', diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index b51efe9c0..5b13dc531 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -4,11 +4,11 @@ from django.db.models import Q from django.utils.translation import gettext_lazy as _ from extras.choices import * -from extras.forms.mixins import CustomFieldsMixin, SavedFiltersMixin, TagsMixin from extras.models import CustomField, Tag from utilities.forms import CSVModelForm from utilities.forms.fields import CSVModelMultipleChoiceField, DynamicModelMultipleChoiceField from utilities.forms.mixins import BootstrapMixin, CheckLastUpdatedMixin +from .mixins import CustomFieldsMixin, SavedFiltersMixin, TagsMixin __all__ = ( 'NetBoxModelForm', diff --git a/netbox/extras/forms/mixins.py b/netbox/netbox/forms/mixins.py similarity index 100% rename from netbox/extras/forms/mixins.py rename to netbox/netbox/forms/mixins.py diff --git a/netbox/users/forms/filtersets.py b/netbox/users/forms/filtersets.py index ff56cbc4c..4ae2bd729 100644 --- a/netbox/users/forms/filtersets.py +++ b/netbox/users/forms/filtersets.py @@ -1,14 +1,12 @@ from django import forms -from extras.forms.mixins import SavedFiltersMixin -from utilities.forms import FilterForm -from users.models import Token from django.contrib.auth import get_user_model from django.contrib.auth.models import Group from django.utils.translation import gettext_lazy as _ from netbox.forms import NetBoxModelFilterSetForm -from users.models import NetBoxGroup, NetBoxUser, ObjectPermission -from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES +from netbox.forms.mixins import SavedFiltersMixin +from users.models import NetBoxGroup, NetBoxUser, ObjectPermission, Token +from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm from utilities.forms.fields import DynamicModelMultipleChoiceField from utilities.forms.widgets import DateTimePicker From 975a647d9a29572c4e1a1b1a8f8961631305577e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 27 Nov 2023 16:09:05 -0500 Subject: [PATCH 104/271] Closes #14312: Move ConfigRevision to core (#14328) * Move ConfigRevision model & write migrations * Move ConfigRevision resources from extras to core * Extend migration to update original content type for ConfigRevision --- netbox/core/filtersets.py | 21 ++++ netbox/core/forms/filtersets.py | 7 ++ netbox/core/forms/model_forms.py | 118 +++++++++++++++++- netbox/core/management/commands/clearcache.py | 2 +- netbox/core/migrations/0009_configrevision.py | 31 +++++ netbox/core/models/__init__.py | 1 + netbox/core/models/config.py | 66 ++++++++++ netbox/core/signals.py | 11 ++ netbox/core/tables/__init__.py | 1 + netbox/core/tables/config.py | 33 +++++ netbox/core/urls.py | 7 ++ netbox/core/views.py | 73 ++++++++++- netbox/extras/filtersets.py | 25 ---- netbox/extras/forms/filtersets.py | 7 -- netbox/extras/forms/model_forms.py | 117 ----------------- .../migrations/0101_move_configrevision.py | 39 ++++++ netbox/extras/models/models.py | 60 +-------- netbox/extras/signals.py | 14 +-- netbox/extras/tables/tables.py | 26 ---- netbox/extras/urls.py | 7 -- netbox/extras/views.py | 69 ---------- netbox/netbox/config/__init__.py | 2 +- netbox/netbox/navigation/menu.py | 6 +- netbox/netbox/tests/test_config.py | 2 +- .../{extras => core}/configrevision.html | 6 +- .../configrevision_restore.html | 6 +- 26 files changed, 417 insertions(+), 340 deletions(-) create mode 100644 netbox/core/migrations/0009_configrevision.py create mode 100644 netbox/core/models/config.py create mode 100644 netbox/core/tables/config.py create mode 100644 netbox/extras/migrations/0101_move_configrevision.py rename netbox/templates/{extras => core}/configrevision.html (96%) rename netbox/templates/{extras => core}/configrevision_restore.html (85%) diff --git a/netbox/core/filtersets.py b/netbox/core/filtersets.py index 410e2e80c..a293b44ec 100644 --- a/netbox/core/filtersets.py +++ b/netbox/core/filtersets.py @@ -9,6 +9,7 @@ from .choices import * from .models import * __all__ = ( + 'ConfigRevisionFilterSet', 'DataFileFilterSet', 'DataSourceFilterSet', 'JobFilterSet', @@ -123,3 +124,23 @@ class JobFilterSet(BaseFilterSet): Q(user__username__icontains=value) | Q(name__icontains=value) ) + + +class ConfigRevisionFilterSet(BaseFilterSet): + q = django_filters.CharFilter( + method='search', + label=_('Search'), + ) + + class Meta: + model = ConfigRevision + fields = [ + 'id', + ] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(comment__icontains=value) + ) diff --git a/netbox/core/forms/filtersets.py b/netbox/core/forms/filtersets.py index 14f0fb6ed..f21bd3f87 100644 --- a/netbox/core/forms/filtersets.py +++ b/netbox/core/forms/filtersets.py @@ -12,6 +12,7 @@ from utilities.forms.fields import ContentTypeChoiceField, DynamicModelMultipleC from utilities.forms.widgets import APISelectMultiple, DateTimePicker __all__ = ( + 'ConfigRevisionFilterForm', 'DataFileFilterForm', 'DataSourceFilterForm', 'JobFilterForm', @@ -123,3 +124,9 @@ class JobFilterForm(SavedFiltersMixin, FilterForm): api_url='/api/users/users/', ) ) + + +class ConfigRevisionFilterForm(SavedFiltersMixin, FilterForm): + fieldsets = ( + (None, ('q', 'filter_id')), + ) diff --git a/netbox/core/forms/model_forms.py b/netbox/core/forms/model_forms.py index e3184acf6..652728734 100644 --- a/netbox/core/forms/model_forms.py +++ b/netbox/core/forms/model_forms.py @@ -1,22 +1,28 @@ import copy +import json from django import forms +from django.conf import settings from django.utils.translation import gettext_lazy as _ from core.forms.mixins import SyncedDataMixin from core.models import * +from netbox.config import get_config, PARAMS from netbox.forms import NetBoxModelForm from netbox.registry import registry from netbox.utils import get_data_backend_choices -from utilities.forms import get_field_value +from utilities.forms import BootstrapMixin, get_field_value from utilities.forms.fields import CommentField from utilities.forms.widgets import HTMXSelect __all__ = ( + 'ConfigRevisionForm', 'DataSourceForm', 'ManagedFileForm', ) +EMPTY_VALUES = ('', None, [], ()) + class DataSourceForm(NetBoxModelForm): type = forms.ChoiceField( @@ -111,3 +117,113 @@ class ManagedFileForm(SyncedDataMixin, NetBoxModelForm): new_file.write(self.cleaned_data['upload_file'].read()) return super().save(*args, **kwargs) + + +class ConfigFormMetaclass(forms.models.ModelFormMetaclass): + + def __new__(mcs, name, bases, attrs): + + # Emulate a declared field for each supported configuration parameter + param_fields = {} + for param in PARAMS: + field_kwargs = { + 'required': False, + 'label': param.label, + 'help_text': param.description, + } + field_kwargs.update(**param.field_kwargs) + param_fields[param.name] = param.field(**field_kwargs) + attrs.update(param_fields) + + return super().__new__(mcs, name, bases, attrs) + + +class ConfigRevisionForm(BootstrapMixin, forms.ModelForm, metaclass=ConfigFormMetaclass): + """ + Form for creating a new ConfigRevision. + """ + + fieldsets = ( + (_('Rack Elevations'), ('RACK_ELEVATION_DEFAULT_UNIT_HEIGHT', 'RACK_ELEVATION_DEFAULT_UNIT_WIDTH')), + (_('Power'), ('POWERFEED_DEFAULT_VOLTAGE', 'POWERFEED_DEFAULT_AMPERAGE', 'POWERFEED_DEFAULT_MAX_UTILIZATION')), + (_('IPAM'), ('ENFORCE_GLOBAL_UNIQUE', 'PREFER_IPV4')), + (_('Security'), ('ALLOWED_URL_SCHEMES',)), + (_('Banners'), ('BANNER_LOGIN', 'BANNER_MAINTENANCE', 'BANNER_TOP', 'BANNER_BOTTOM')), + (_('Pagination'), ('PAGINATE_COUNT', 'MAX_PAGE_SIZE')), + (_('Validation'), ('CUSTOM_VALIDATORS', 'PROTECTION_RULES')), + (_('User Preferences'), ('DEFAULT_USER_PREFERENCES',)), + (_('Miscellaneous'), ( + 'MAINTENANCE_MODE', 'GRAPHQL_ENABLED', 'CHANGELOG_RETENTION', 'JOB_RETENTION', 'MAPS_URL', + )), + (_('Config Revision'), ('comment',)) + ) + + class Meta: + model = ConfigRevision + fields = '__all__' + widgets = { + 'BANNER_LOGIN': forms.Textarea(attrs={'class': 'font-monospace'}), + 'BANNER_MAINTENANCE': forms.Textarea(attrs={'class': 'font-monospace'}), + 'BANNER_TOP': forms.Textarea(attrs={'class': 'font-monospace'}), + 'BANNER_BOTTOM': forms.Textarea(attrs={'class': 'font-monospace'}), + 'CUSTOM_VALIDATORS': forms.Textarea(attrs={'class': 'font-monospace'}), + 'PROTECTION_RULES': forms.Textarea(attrs={'class': 'font-monospace'}), + 'comment': forms.Textarea(), + } + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Append current parameter values to form field help texts and check for static configurations + config = get_config() + for param in PARAMS: + value = getattr(config, param.name) + + # Set the field's initial value, if it can be serialized. (This may not be the case e.g. for + # CUSTOM_VALIDATORS, which may reference Python objects.) + try: + json.dumps(value) + if type(value) in (tuple, list): + self.fields[param.name].initial = ', '.join(value) + else: + self.fields[param.name].initial = value + except TypeError: + pass + + # Check whether this parameter is statically configured (e.g. in configuration.py) + if hasattr(settings, param.name): + self.fields[param.name].disabled = True + self.fields[param.name].help_text = _( + 'This parameter has been defined statically and cannot be modified.' + ) + continue + + # Set the field's help text + help_text = self.fields[param.name].help_text + if help_text: + help_text += '
    ' # Line break + help_text += _('Current value: {value}').format(value=value or '—') + if value == param.default: + help_text += _(' (default)') + self.fields[param.name].help_text = help_text + + def save(self, commit=True): + instance = super().save(commit=False) + + # Populate JSON data on the instance + instance.data = self.render_json() + + if commit: + instance.save() + + return instance + + def render_json(self): + json = {} + + # Iterate through each field and populate non-empty values + for field_name in self.declared_fields: + if field_name in self.cleaned_data and self.cleaned_data[field_name] not in EMPTY_VALUES: + json[field_name] = self.cleaned_data[field_name] + + return json diff --git a/netbox/core/management/commands/clearcache.py b/netbox/core/management/commands/clearcache.py index dd95013af..9c91efe77 100644 --- a/netbox/core/management/commands/clearcache.py +++ b/netbox/core/management/commands/clearcache.py @@ -1,7 +1,7 @@ from django.core.cache import cache from django.core.management.base import BaseCommand -from extras.models import ConfigRevision +from core.models import ConfigRevision class Command(BaseCommand): diff --git a/netbox/core/migrations/0009_configrevision.py b/netbox/core/migrations/0009_configrevision.py new file mode 100644 index 000000000..e7f817a16 --- /dev/null +++ b/netbox/core/migrations/0009_configrevision.py @@ -0,0 +1,31 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0008_contenttype_proxy'), + ] + + operations = [ + migrations.SeparateDatabaseAndState( + state_operations=[ + migrations.CreateModel( + name='ConfigRevision', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True)), + ('comment', models.CharField(blank=True, max_length=200)), + ('data', models.JSONField(blank=True, null=True)), + ], + options={ + 'verbose_name': 'config revision', + 'verbose_name_plural': 'config revisions', + 'ordering': ['-created'], + }, + ), + ], + # Table will be renamed from extras_configrevision in extras/0101_move_configrevision + database_operations=[], + ), + ] diff --git a/netbox/core/models/__init__.py b/netbox/core/models/__init__.py index c93c392d7..2c30ce02b 100644 --- a/netbox/core/models/__init__.py +++ b/netbox/core/models/__init__.py @@ -1,3 +1,4 @@ +from .config import * from .contenttypes import * from .data import * from .files import * diff --git a/netbox/core/models/config.py b/netbox/core/models/config.py new file mode 100644 index 000000000..6c8e41477 --- /dev/null +++ b/netbox/core/models/config.py @@ -0,0 +1,66 @@ +from django.core.cache import cache +from django.db import models +from django.urls import reverse +from django.utils.translation import gettext, gettext_lazy as _ + +from utilities.querysets import RestrictedQuerySet + +__all__ = ( + 'ConfigRevision', +) + + +class ConfigRevision(models.Model): + """ + An atomic revision of NetBox's configuration. + """ + created = models.DateTimeField( + verbose_name=_('created'), + auto_now_add=True + ) + comment = models.CharField( + verbose_name=_('comment'), + max_length=200, + blank=True + ) + data = models.JSONField( + blank=True, + null=True, + verbose_name=_('configuration data') + ) + + objects = RestrictedQuerySet.as_manager() + + class Meta: + ordering = ['-created'] + verbose_name = _('config revision') + verbose_name_plural = _('config revisions') + + def __str__(self): + if not self.pk: + return gettext('Default configuration') + if self.is_active: + return gettext('Current configuration') + return gettext('Config revision #{id}').format(id=self.pk) + + def __getattr__(self, item): + if item in self.data: + return self.data[item] + return super().__getattribute__(item) + + def get_absolute_url(self): + if not self.pk: + return reverse('core:config') # Default config view + return reverse('core:configrevision', args=[self.pk]) + + def activate(self): + """ + Cache the configuration data. + """ + cache.set('config', self.data, None) + cache.set('config_version', self.pk, None) + activate.alters_data = True + + @property + def is_active(self): + return cache.get('config_version') == self.pk diff --git a/netbox/core/signals.py b/netbox/core/signals.py index a39a87c6a..cd1633a1a 100644 --- a/netbox/core/signals.py +++ b/netbox/core/signals.py @@ -1,5 +1,8 @@ +from django.db.models.signals import post_save from django.dispatch import Signal, receiver +from .models import ConfigRevision + __all__ = ( 'post_sync', 'pre_sync', @@ -19,3 +22,11 @@ def auto_sync(instance, **kwargs): for autosync in AutoSyncRecord.objects.filter(datafile__source=instance).prefetch_related('object'): autosync.object.sync(save=True) + + +@receiver(post_save, sender=ConfigRevision) +def update_config(sender, instance, **kwargs): + """ + Update the cached NetBox configuration when a new ConfigRevision is created. + """ + instance.activate() diff --git a/netbox/core/tables/__init__.py b/netbox/core/tables/__init__.py index 052f68b68..69f9d8a48 100644 --- a/netbox/core/tables/__init__.py +++ b/netbox/core/tables/__init__.py @@ -1,2 +1,3 @@ +from .config import * from .data import * from .jobs import * diff --git a/netbox/core/tables/config.py b/netbox/core/tables/config.py new file mode 100644 index 000000000..9d4cb6393 --- /dev/null +++ b/netbox/core/tables/config.py @@ -0,0 +1,33 @@ +from django.utils.translation import gettext_lazy as _ + +from core.models import ConfigRevision +from netbox.tables import NetBoxTable, columns + +__all__ = ( + 'ConfigRevisionTable', +) + +REVISION_BUTTONS = """ +{% if not record.is_active %} + + + +{% endif %} +""" + + +class ConfigRevisionTable(NetBoxTable): + is_active = columns.BooleanColumn( + verbose_name=_('Is Active'), + ) + actions = columns.ActionsColumn( + actions=('delete',), + extra_buttons=REVISION_BUTTONS + ) + + class Meta(NetBoxTable.Meta): + model = ConfigRevision + fields = ( + 'pk', 'id', 'is_active', 'created', 'comment', + ) + default_columns = ('pk', 'id', 'is_active', 'created', 'comment') diff --git a/netbox/core/urls.py b/netbox/core/urls.py index f17a50c81..77c0d3194 100644 --- a/netbox/core/urls.py +++ b/netbox/core/urls.py @@ -25,6 +25,13 @@ urlpatterns = ( path('jobs//', views.JobView.as_view(), name='job'), path('jobs//delete/', views.JobDeleteView.as_view(), name='job_delete'), + # Config revisions + path('config-revisions/', views.ConfigRevisionListView.as_view(), name='configrevision_list'), + path('config-revisions/add/', views.ConfigRevisionEditView.as_view(), name='configrevision_add'), + path('config-revisions/delete/', views.ConfigRevisionBulkDeleteView.as_view(), name='configrevision_bulk_delete'), + path('config-revisions//restore/', views.ConfigRevisionRestoreView.as_view(), name='configrevision_restore'), + path('config-revisions//', include(get_model_urls('core', 'configrevision'))), + # Configuration path('config/', views.ConfigView.as_view(), name='config'), diff --git a/netbox/core/views.py b/netbox/core/views.py index d16fa4ece..61ef93642 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -1,12 +1,13 @@ from django.contrib import messages -from django.shortcuts import get_object_or_404, redirect +from django.http import HttpResponseForbidden +from django.shortcuts import get_object_or_404, redirect, render +from django.views.generic import View -from extras.models import ConfigRevision -from netbox.config import get_config +from netbox.config import get_config, PARAMS from netbox.views import generic from netbox.views.generic.base import BaseObjectView from utilities.utils import count_related -from utilities.views import register_model_view +from utilities.views import ContentTypePermissionRequiredMixin, register_model_view from . import filtersets, forms, tables from .models import * @@ -164,3 +165,67 @@ class ConfigView(generic.ObjectView): return ConfigRevision( data=get_config().defaults ) + + +class ConfigRevisionListView(generic.ObjectListView): + queryset = ConfigRevision.objects.all() + filterset = filtersets.ConfigRevisionFilterSet + filterset_form = forms.ConfigRevisionFilterForm + table = tables.ConfigRevisionTable + + +@register_model_view(ConfigRevision) +class ConfigRevisionView(generic.ObjectView): + queryset = ConfigRevision.objects.all() + + +class ConfigRevisionEditView(generic.ObjectEditView): + queryset = ConfigRevision.objects.all() + form = forms.ConfigRevisionForm + + +@register_model_view(ConfigRevision, 'delete') +class ConfigRevisionDeleteView(generic.ObjectDeleteView): + queryset = ConfigRevision.objects.all() + + +class ConfigRevisionBulkDeleteView(generic.BulkDeleteView): + queryset = ConfigRevision.objects.all() + filterset = filtersets.ConfigRevisionFilterSet + table = tables.ConfigRevisionTable + + +class ConfigRevisionRestoreView(ContentTypePermissionRequiredMixin, View): + + def get_required_permission(self): + return 'core.configrevision_edit' + + def get(self, request, pk): + candidate_config = get_object_or_404(ConfigRevision, pk=pk) + + # Get the current ConfigRevision + config_version = get_config().version + current_config = ConfigRevision.objects.filter(pk=config_version).first() + + params = [] + for param in PARAMS: + params.append(( + param.name, + current_config.data.get(param.name, None), + candidate_config.data.get(param.name, None) + )) + + return render(request, 'core/configrevision_restore.html', { + 'object': candidate_config, + 'params': params, + }) + + def post(self, request, pk): + if not request.user.has_perm('core.configrevision_edit'): + return HttpResponseForbidden() + + candidate_config = get_object_or_404(ConfigRevision, pk=pk) + candidate_config.activate() + messages.success(request, f"Restored configuration revision #{pk}") + + return redirect(candidate_config.get_absolute_url()) diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index 32850bee2..d336394f9 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -17,7 +17,6 @@ from .models import * __all__ = ( 'BookmarkFilterSet', 'ConfigContextFilterSet', - 'ConfigRevisionFilterSet', 'ConfigTemplateFilterSet', 'ContentTypeFilterSet', 'CustomFieldChoiceSetFilterSet', @@ -625,27 +624,3 @@ class ContentTypeFilterSet(django_filters.FilterSet): Q(app_label__icontains=value) | Q(model__icontains=value) ) - - -# -# ConfigRevisions -# - -class ConfigRevisionFilterSet(BaseFilterSet): - q = django_filters.CharFilter( - method='search', - label=_('Search'), - ) - - class Meta: - model = ConfigRevision - fields = [ - 'id', - ] - - def search(self, queryset, name, value): - if not value.strip(): - return queryset - return queryset.filter( - Q(comment__icontains=value) - ) diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index 28aefa685..b68845c2f 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -18,7 +18,6 @@ from virtualization.models import Cluster, ClusterGroup, ClusterType __all__ = ( 'ConfigContextFilterForm', - 'ConfigRevisionFilterForm', 'ConfigTemplateFilterForm', 'CustomFieldChoiceSetFilterForm', 'CustomFieldFilterForm', @@ -499,9 +498,3 @@ class ObjectChangeFilterForm(SavedFiltersMixin, FilterForm): api_url='/api/extras/content-types/', ) ) - - -class ConfigRevisionFilterForm(SavedFiltersMixin, FilterForm): - fieldsets = ( - (None, ('q', 'filter_id')), - ) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 1a4d45f9a..9553a839a 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -1,7 +1,6 @@ import json from django import forms -from django.conf import settings from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ @@ -10,7 +9,6 @@ from core.models import ContentType from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup from extras.choices import * from extras.models import * -from netbox.config import get_config, PARAMS from netbox.forms import NetBoxModelForm from tenancy.models import Tenant, TenantGroup from utilities.forms import BootstrapMixin, add_blank_choice @@ -21,11 +19,9 @@ from utilities.forms.fields import ( from utilities.forms.widgets import ChoicesWidget from virtualization.models import Cluster, ClusterGroup, ClusterType - __all__ = ( 'BookmarkForm', 'ConfigContextForm', - 'ConfigRevisionForm', 'ConfigTemplateForm', 'CustomFieldChoiceSetForm', 'CustomFieldForm', @@ -445,116 +441,3 @@ class JournalEntryForm(NetBoxModelForm): 'assigned_object_type': forms.HiddenInput, 'assigned_object_id': forms.HiddenInput, } - - -EMPTY_VALUES = ('', None, [], ()) - - -class ConfigFormMetaclass(forms.models.ModelFormMetaclass): - - def __new__(mcs, name, bases, attrs): - - # Emulate a declared field for each supported configuration parameter - param_fields = {} - for param in PARAMS: - field_kwargs = { - 'required': False, - 'label': param.label, - 'help_text': param.description, - } - field_kwargs.update(**param.field_kwargs) - param_fields[param.name] = param.field(**field_kwargs) - attrs.update(param_fields) - - return super().__new__(mcs, name, bases, attrs) - - -class ConfigRevisionForm(BootstrapMixin, forms.ModelForm, metaclass=ConfigFormMetaclass): - """ - Form for creating a new ConfigRevision. - """ - - fieldsets = ( - (_('Rack Elevations'), ('RACK_ELEVATION_DEFAULT_UNIT_HEIGHT', 'RACK_ELEVATION_DEFAULT_UNIT_WIDTH')), - (_('Power'), ('POWERFEED_DEFAULT_VOLTAGE', 'POWERFEED_DEFAULT_AMPERAGE', 'POWERFEED_DEFAULT_MAX_UTILIZATION')), - (_('IPAM'), ('ENFORCE_GLOBAL_UNIQUE', 'PREFER_IPV4')), - (_('Security'), ('ALLOWED_URL_SCHEMES',)), - (_('Banners'), ('BANNER_LOGIN', 'BANNER_MAINTENANCE', 'BANNER_TOP', 'BANNER_BOTTOM')), - (_('Pagination'), ('PAGINATE_COUNT', 'MAX_PAGE_SIZE')), - (_('Validation'), ('CUSTOM_VALIDATORS', 'PROTECTION_RULES')), - (_('User Preferences'), ('DEFAULT_USER_PREFERENCES',)), - (_('Miscellaneous'), ( - 'MAINTENANCE_MODE', 'GRAPHQL_ENABLED', 'CHANGELOG_RETENTION', 'JOB_RETENTION', 'MAPS_URL', - )), - (_('Config Revision'), ('comment',)) - ) - - class Meta: - model = ConfigRevision - fields = '__all__' - widgets = { - 'BANNER_LOGIN': forms.Textarea(attrs={'class': 'font-monospace'}), - 'BANNER_MAINTENANCE': forms.Textarea(attrs={'class': 'font-monospace'}), - 'BANNER_TOP': forms.Textarea(attrs={'class': 'font-monospace'}), - 'BANNER_BOTTOM': forms.Textarea(attrs={'class': 'font-monospace'}), - 'CUSTOM_VALIDATORS': forms.Textarea(attrs={'class': 'font-monospace'}), - 'PROTECTION_RULES': forms.Textarea(attrs={'class': 'font-monospace'}), - 'comment': forms.Textarea(), - } - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - # Append current parameter values to form field help texts and check for static configurations - config = get_config() - for param in PARAMS: - value = getattr(config, param.name) - - # Set the field's initial value, if it can be serialized. (This may not be the case e.g. for - # CUSTOM_VALIDATORS, which may reference Python objects.) - try: - json.dumps(value) - if type(value) in (tuple, list): - self.fields[param.name].initial = ', '.join(value) - else: - self.fields[param.name].initial = value - except TypeError: - pass - - # Check whether this parameter is statically configured (e.g. in configuration.py) - if hasattr(settings, param.name): - self.fields[param.name].disabled = True - self.fields[param.name].help_text = _( - 'This parameter has been defined statically and cannot be modified.' - ) - continue - - # Set the field's help text - help_text = self.fields[param.name].help_text - if help_text: - help_text += '
    ' # Line break - help_text += _('Current value: {value}').format(value=value or '—') - if value == param.default: - help_text += _(' (default)') - self.fields[param.name].help_text = help_text - - def save(self, commit=True): - instance = super().save(commit=False) - - # Populate JSON data on the instance - instance.data = self.render_json() - - if commit: - instance.save() - - return instance - - def render_json(self): - json = {} - - # Iterate through each field and populate non-empty values - for field_name in self.declared_fields: - if field_name in self.cleaned_data and self.cleaned_data[field_name] not in EMPTY_VALUES: - json[field_name] = self.cleaned_data[field_name] - - return json diff --git a/netbox/extras/migrations/0101_move_configrevision.py b/netbox/extras/migrations/0101_move_configrevision.py new file mode 100644 index 000000000..730e7a096 --- /dev/null +++ b/netbox/extras/migrations/0101_move_configrevision.py @@ -0,0 +1,39 @@ +from django.db import migrations + + +def update_content_type(apps, schema_editor): + ContentType = apps.get_model('contenttypes', 'ContentType') + + # Delete the new ContentType effected by the introduction of core.ConfigRevision + ContentType.objects.filter(app_label='core', model='configrevision').delete() + + # Update the app label of the original ContentType for extras.ConfigRevision to ensure any foreign key + # references are preserved + ContentType.objects.filter(app_label='extras', model='configrevision').update(app_label='core') + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0100_customfield_ui_attrs'), + ] + + operations = [ + migrations.SeparateDatabaseAndState( + state_operations=[ + migrations.DeleteModel( + name='ConfigRevision', + ), + ], + database_operations=[ + migrations.AlterModelTable( + name='ConfigRevision', + table='core_configrevision', + ), + ], + ), + migrations.RunPython( + code=update_content_type, + reverse_code=migrations.RunPython.noop + ), + ] diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 67b455ab4..d0a2e4b61 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -3,14 +3,13 @@ import urllib.parse from django.conf import settings from django.contrib.contenttypes.fields import GenericForeignKey -from django.core.cache import cache from django.core.validators import ValidationError from django.db import models from django.http import HttpResponse from django.urls import reverse from django.utils import timezone from django.utils.formats import date_format -from django.utils.translation import gettext, gettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from rest_framework.utils.encoders import JSONEncoder from core.models import ContentType @@ -28,7 +27,6 @@ from utilities.utils import clean_html, dict_to_querydict, render_jinja2 __all__ = ( 'Bookmark', - 'ConfigRevision', 'CustomLink', 'ExportTemplate', 'ImageAttachment', @@ -710,59 +708,3 @@ class Bookmark(models.Model): raise ValidationError( _("Bookmarks cannot be assigned to this object type ({type}).").format(type=self.object_type) ) - - -class ConfigRevision(models.Model): - """ - An atomic revision of NetBox's configuration. - """ - created = models.DateTimeField( - verbose_name=_('created'), - auto_now_add=True - ) - comment = models.CharField( - verbose_name=_('comment'), - max_length=200, - blank=True - ) - data = models.JSONField( - blank=True, - null=True, - verbose_name=_('configuration data') - ) - - objects = RestrictedQuerySet.as_manager() - - class Meta: - ordering = ['-created'] - verbose_name = _('config revision') - verbose_name_plural = _('config revisions') - - def __str__(self): - if not self.pk: - return gettext('Default configuration') - if self.is_active: - return gettext('Current configuration') - return gettext('Config revision #{id}').format(id=self.pk) - - def __getattr__(self, item): - if item in self.data: - return self.data[item] - return super().__getattribute__(item) - - def get_absolute_url(self): - if not self.pk: - return reverse('core:config') # Default config view - return reverse('extras:configrevision', args=[self.pk]) - - def activate(self): - """ - Cache the configuration data. - """ - cache.set('config', self.data, None) - cache.set('config_version', self.pk, None) - activate.alters_data = True - - @property - def is_active(self): - return cache.get('config_version') == self.pk diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index 8bdaf523c..e1d424960 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -14,7 +14,7 @@ from netbox.context import current_request, webhooks_queue from netbox.signals import post_clean from utilities.exceptions import AbortRequest from .choices import ObjectChangeActionChoices -from .models import ConfigRevision, CustomField, ObjectChange, TaggedItem +from .models import CustomField, ObjectChange, TaggedItem from .webhooks import enqueue_object, get_snapshots, serialize_for_webhook # @@ -219,18 +219,6 @@ def run_delete_validators(sender, instance, **kwargs): ) -# -# Dynamic configuration -# - -@receiver(post_save, sender=ConfigRevision) -def update_config(sender, instance, **kwargs): - """ - Update the cached NetBox configuration when a new ConfigRevision is created. - """ - instance.activate() - - # # Tags # diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index 54194c00f..b78ab0c94 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -11,7 +11,6 @@ from .template_code import * __all__ = ( 'BookmarkTable', 'ConfigContextTable', - 'ConfigRevisionTable', 'ConfigTemplateTable', 'CustomFieldChoiceSetTable', 'CustomFieldTable', @@ -34,31 +33,6 @@ IMAGEATTACHMENT_IMAGE = ''' {% endif %} ''' -REVISION_BUTTONS = """ -{% if not record.is_active %} - - - -{% endif %} -""" - - -class ConfigRevisionTable(NetBoxTable): - is_active = columns.BooleanColumn( - verbose_name=_('Is Active'), - ) - actions = columns.ActionsColumn( - actions=('delete',), - extra_buttons=REVISION_BUTTONS - ) - - class Meta(NetBoxTable.Meta): - model = ConfigRevision - fields = ( - 'pk', 'id', 'is_active', 'created', 'comment', - ) - default_columns = ('pk', 'id', 'is_active', 'created', 'comment') - class CustomFieldTable(NetBoxTable): name = tables.Column( diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index fd95186e4..bcab007e7 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -98,13 +98,6 @@ urlpatterns = [ path('journal-entries/import/', views.JournalEntryBulkImportView.as_view(), name='journalentry_import'), path('journal-entries//', include(get_model_urls('extras', 'journalentry'))), - # Config revisions - path('config-revisions/', views.ConfigRevisionListView.as_view(), name='configrevision_list'), - path('config-revisions/add/', views.ConfigRevisionEditView.as_view(), name='configrevision_add'), - path('config-revisions/delete/', views.ConfigRevisionBulkDeleteView.as_view(), name='configrevision_bulk_delete'), - path('config-revisions//restore/', views.ConfigRevisionRestoreView.as_view(), name='configrevision_restore'), - path('config-revisions//', include(get_model_urls('extras', 'configrevision'))), - # Change logging path('changelog/', views.ObjectChangeListView.as_view(), name='objectchange_list'), path('changelog//', include(get_model_urls('extras', 'objectchange'))), diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 0e8e3b0ea..b62165e1a 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -15,7 +15,6 @@ from core.models import Job from core.tables import JobTable from extras.dashboard.forms import DashboardWidgetAddForm, DashboardWidgetForm from extras.dashboard.utils import get_widget_class -from netbox.config import get_config, PARAMS from netbox.constants import DEFAULT_ACTION_PERMISSIONS from netbox.views import generic from utilities.forms import ConfirmationForm, get_field_value @@ -1316,74 +1315,6 @@ class ScriptResultView(ContentTypePermissionRequiredMixin, View): }) -# -# Config Revisions -# - -class ConfigRevisionListView(generic.ObjectListView): - queryset = ConfigRevision.objects.all() - filterset = filtersets.ConfigRevisionFilterSet - filterset_form = forms.ConfigRevisionFilterForm - table = tables.ConfigRevisionTable - - -@register_model_view(ConfigRevision) -class ConfigRevisionView(generic.ObjectView): - queryset = ConfigRevision.objects.all() - - -class ConfigRevisionEditView(generic.ObjectEditView): - queryset = ConfigRevision.objects.all() - form = forms.ConfigRevisionForm - - -@register_model_view(ConfigRevision, 'delete') -class ConfigRevisionDeleteView(generic.ObjectDeleteView): - queryset = ConfigRevision.objects.all() - - -class ConfigRevisionBulkDeleteView(generic.BulkDeleteView): - queryset = ConfigRevision.objects.all() - filterset = filtersets.ConfigRevisionFilterSet - table = tables.ConfigRevisionTable - - -class ConfigRevisionRestoreView(ContentTypePermissionRequiredMixin, View): - - def get_required_permission(self): - return 'extras.configrevision_edit' - - def get(self, request, pk): - candidate_config = get_object_or_404(ConfigRevision, pk=pk) - - # Get the current ConfigRevision - config_version = get_config().version - current_config = ConfigRevision.objects.filter(pk=config_version).first() - - params = [] - for param in PARAMS: - params.append(( - param.name, - current_config.data.get(param.name, None), - candidate_config.data.get(param.name, None) - )) - - return render(request, 'extras/configrevision_restore.html', { - 'object': candidate_config, - 'params': params, - }) - - def post(self, request, pk): - if not request.user.has_perm('extras.configrevision_edit'): - return HttpResponseForbidden() - - candidate_config = get_object_or_404(ConfigRevision, pk=pk) - candidate_config.activate() - messages.success(request, f"Restored configuration revision #{pk}") - - return redirect(candidate_config.get_absolute_url()) - - # # Markdown # diff --git a/netbox/netbox/config/__init__.py b/netbox/netbox/config/__init__.py index a9a93636c..c536ceadb 100644 --- a/netbox/netbox/config/__init__.py +++ b/netbox/netbox/config/__init__.py @@ -74,7 +74,7 @@ class Config: def _populate_from_db(self): """Cache data from latest ConfigRevision, then populate from cache""" - from extras.models import ConfigRevision + from core.models import ConfigRevision try: revision = ConfigRevision.objects.last() diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 43cf3f869..7ad317324 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -424,13 +424,13 @@ ADMIN_MENU = Menu( MenuItem( link='core:config', link_text=_('Current Config'), - permissions=['extras.view_configrevision'], + permissions=['core.view_configrevision'], staff_only=True ), MenuItem( - link='extras:configrevision_list', + link='core:configrevision_list', link_text=_('Config Revisions'), - permissions=['extras.view_configrevision'], + permissions=['core.view_configrevision'], staff_only=True ), ), diff --git a/netbox/netbox/tests/test_config.py b/netbox/netbox/tests/test_config.py index db401cf0c..f8c892363 100644 --- a/netbox/netbox/tests/test_config.py +++ b/netbox/netbox/tests/test_config.py @@ -2,7 +2,7 @@ from django.conf import settings from django.core.cache import cache from django.test import override_settings, TestCase -from extras.models import ConfigRevision +from core.models import ConfigRevision from netbox.config import clear_config, get_config diff --git a/netbox/templates/extras/configrevision.html b/netbox/templates/core/configrevision.html similarity index 96% rename from netbox/templates/extras/configrevision.html rename to netbox/templates/core/configrevision.html index a880865c3..6481127fa 100644 --- a/netbox/templates/extras/configrevision.html +++ b/netbox/templates/core/configrevision.html @@ -14,11 +14,11 @@
    {% plugin_buttons object %} - {% if not object.pk or object.is_active and perms.extras.add_configrevision %} - {% url 'extras:configrevision_add' as edit_url %} + {% if not object.pk or object.is_active and perms.core.add_configrevision %} + {% url 'core:configrevision_add' as edit_url %} {% include "buttons/edit.html" with url=edit_url %} {% endif %} - {% if object.pk and not object.is_active and perms.extras.delete_configrevision %} + {% if object.pk and not object.is_active and perms.core.delete_configrevision %} {% delete_button object %} {% endif %}
    diff --git a/netbox/templates/extras/configrevision_restore.html b/netbox/templates/core/configrevision_restore.html similarity index 85% rename from netbox/templates/extras/configrevision_restore.html rename to netbox/templates/core/configrevision_restore.html index 134a0b547..ad6fb1bd9 100644 --- a/netbox/templates/extras/configrevision_restore.html +++ b/netbox/templates/core/configrevision_restore.html @@ -18,8 +18,8 @@ @@ -77,7 +77,7 @@
    - {% trans "Cancel" %} + {% trans "Cancel" %}
    From 6678880db5332644dfce57c4bc605958b5bb8a43 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 27 Nov 2023 16:17:15 -0500 Subject: [PATCH 105/271] Closes #9816: VPN tunnel support (#14276) - Introduces a new `vpn` app with the following models: - Tunnel - TunnelTermination - IKEProposal - IKEPolicy - IPSecProposal - IPSecPolicy - IPSecProfile --- docs/features/vpn-tunnels.md | 49 ++ docs/models/vpn/ikepolicy.md | 25 + docs/models/vpn/ikeproposal.md | 39 ++ docs/models/vpn/ipsecpolicy.md | 17 + docs/models/vpn/ipsecprofile.md | 21 + docs/models/vpn/ipsecproposal.md | 25 + docs/models/vpn/tunnel.md | 36 ++ docs/models/vpn/tunneltermination.md | 30 + mkdocs.yml | 9 + netbox/core/management/commands/nbshell.py | 2 +- netbox/dcim/models/device_components.py | 10 + netbox/dcim/tables/devices.py | 13 +- netbox/dcim/tables/template_code.py | 10 + netbox/netbox/api/views.py | 1 + netbox/netbox/graphql/schema.py | 2 + netbox/netbox/navigation/menu.py | 25 +- netbox/netbox/settings.py | 1 + netbox/netbox/urls.py | 2 + netbox/templates/vpn/ikepolicy.html | 67 ++ netbox/templates/vpn/ikeproposal.html | 63 ++ netbox/templates/vpn/ipsecpolicy.html | 55 ++ netbox/templates/vpn/ipsecprofile.html | 112 ++++ netbox/templates/vpn/ipsecproposal.html | 59 ++ netbox/templates/vpn/tunnel.html | 85 +++ netbox/templates/vpn/tunneltermination.html | 62 ++ .../virtualization/models/virtualmachines.py | 6 + .../virtualization/tables/virtualmachines.py | 5 +- netbox/vpn/__init__.py | 0 netbox/vpn/admin.py | 3 + netbox/vpn/api/__init__.py | 0 netbox/vpn/api/nested_serializers.py | 84 +++ netbox/vpn/api/serializers.py | 193 ++++++ netbox/vpn/api/urls.py | 15 + netbox/vpn/api/views.py | 74 +++ netbox/vpn/apps.py | 9 + netbox/vpn/choices.py | 201 ++++++ netbox/vpn/filtersets.py | 241 +++++++ netbox/vpn/forms/__init__.py | 4 + netbox/vpn/forms/bulk_edit.py | 243 +++++++ netbox/vpn/forms/bulk_import.py | 230 +++++++ netbox/vpn/forms/filtersets.py | 182 ++++++ netbox/vpn/forms/model_forms.py | 357 +++++++++++ netbox/vpn/graphql/__init__.py | 0 netbox/vpn/graphql/schema.py | 51 ++ netbox/vpn/graphql/types.py | 69 ++ netbox/vpn/migrations/0001_initial.py | 186 ++++++ netbox/vpn/migrations/__init__.py | 0 netbox/vpn/models/__init__.py | 2 + netbox/vpn/models/crypto.py | 254 ++++++++ netbox/vpn/models/tunnels.py | 146 +++++ netbox/vpn/search.py | 65 ++ netbox/vpn/tables.py | 254 ++++++++ netbox/vpn/tests/__init__.py | 0 netbox/vpn/tests/test_api.py | 473 ++++++++++++++ netbox/vpn/tests/test_filtersets.py | 592 ++++++++++++++++++ netbox/vpn/tests/test_views.py | 508 +++++++++++++++ netbox/vpn/urls.py | 65 ++ netbox/vpn/views.py | 334 ++++++++++ 58 files changed, 5656 insertions(+), 10 deletions(-) create mode 100644 docs/features/vpn-tunnels.md create mode 100644 docs/models/vpn/ikepolicy.md create mode 100644 docs/models/vpn/ikeproposal.md create mode 100644 docs/models/vpn/ipsecpolicy.md create mode 100644 docs/models/vpn/ipsecprofile.md create mode 100644 docs/models/vpn/ipsecproposal.md create mode 100644 docs/models/vpn/tunnel.md create mode 100644 docs/models/vpn/tunneltermination.md create mode 100644 netbox/templates/vpn/ikepolicy.html create mode 100644 netbox/templates/vpn/ikeproposal.html create mode 100644 netbox/templates/vpn/ipsecpolicy.html create mode 100644 netbox/templates/vpn/ipsecprofile.html create mode 100644 netbox/templates/vpn/ipsecproposal.html create mode 100644 netbox/templates/vpn/tunnel.html create mode 100644 netbox/templates/vpn/tunneltermination.html create mode 100644 netbox/vpn/__init__.py create mode 100644 netbox/vpn/admin.py create mode 100644 netbox/vpn/api/__init__.py create mode 100644 netbox/vpn/api/nested_serializers.py create mode 100644 netbox/vpn/api/serializers.py create mode 100644 netbox/vpn/api/urls.py create mode 100644 netbox/vpn/api/views.py create mode 100644 netbox/vpn/apps.py create mode 100644 netbox/vpn/choices.py create mode 100644 netbox/vpn/filtersets.py create mode 100644 netbox/vpn/forms/__init__.py create mode 100644 netbox/vpn/forms/bulk_edit.py create mode 100644 netbox/vpn/forms/bulk_import.py create mode 100644 netbox/vpn/forms/filtersets.py create mode 100644 netbox/vpn/forms/model_forms.py create mode 100644 netbox/vpn/graphql/__init__.py create mode 100644 netbox/vpn/graphql/schema.py create mode 100644 netbox/vpn/graphql/types.py create mode 100644 netbox/vpn/migrations/0001_initial.py create mode 100644 netbox/vpn/migrations/__init__.py create mode 100644 netbox/vpn/models/__init__.py create mode 100644 netbox/vpn/models/crypto.py create mode 100644 netbox/vpn/models/tunnels.py create mode 100644 netbox/vpn/search.py create mode 100644 netbox/vpn/tables.py create mode 100644 netbox/vpn/tests/__init__.py create mode 100644 netbox/vpn/tests/test_api.py create mode 100644 netbox/vpn/tests/test_filtersets.py create mode 100644 netbox/vpn/tests/test_views.py create mode 100644 netbox/vpn/urls.py create mode 100644 netbox/vpn/views.py diff --git a/docs/features/vpn-tunnels.md b/docs/features/vpn-tunnels.md new file mode 100644 index 000000000..ae6df70c8 --- /dev/null +++ b/docs/features/vpn-tunnels.md @@ -0,0 +1,49 @@ +# Tunnels + +NetBox can model private tunnels formed among virtual termination points across your network. Typical tunnel implementations include GRE, IP-in-IP, and IPSec. A tunnel may be terminated to two or more device or virtual machine interfaces. + +```mermaid +flowchart TD + Termination1[TunnelTermination] + Termination2[TunnelTermination] + Interface1[Interface] + Interface2[Interface] + Tunnel --> Termination1 & Termination2 + Termination1 --> Interface1 + Termination2 --> Interface2 + Interface1 --> Device + Interface2 --> VirtualMachine + +click Tunnel "../../models/vpn/tunnel/" +click TunnelTermination1 "../../models/vpn/tunneltermination/" +click TunnelTermination2 "../../models/vpn/tunneltermination/" +``` + +# IPSec & IKE + +NetBox includes robust support for modeling IPSec & IKE policies. These are used to define encryption and authentication parameters for IPSec tunnels. + +```mermaid +flowchart TD + subgraph IKEProposals[Proposals] + IKEProposal1[IKEProposal] + IKEProposal2[IKEProposal] + end + subgraph IPSecProposals[Proposals] + IPSecProposal1[IPSecProposal] + IPSecProposal2[IPSecProposal] + end + IKEProposals --> IKEPolicy + IPSecProposals --> IPSecPolicy + IKEPolicy & IPSecPolicy--> IPSecProfile + IPSecProfile --> Tunnel + +click IKEProposal1 "../../models/vpn/ikeproposal/" +click IKEProposal2 "../../models/vpn/ikeproposal/" +click IKEPolicy "../../models/vpn/ikepolicy/" +click IPSecProposal1 "../../models/vpn/ipsecproposal/" +click IPSecProposal2 "../../models/vpn/ipsecproposal/" +click IPSecPolicy "../../models/vpn/ipsecpolicy/" +click IPSecProfile "../../models/vpn/ipsecprofile/" +click Tunnel "../../models/vpn/tunnel/" +``` diff --git a/docs/models/vpn/ikepolicy.md b/docs/models/vpn/ikepolicy.md new file mode 100644 index 000000000..7b739072b --- /dev/null +++ b/docs/models/vpn/ikepolicy.md @@ -0,0 +1,25 @@ +# IKE Policies + +An [Internet Key Exhcnage (IKE)](https://en.wikipedia.org/wiki/Internet_Key_Exchange) policy defines an IKE version, mode, and set of [proposals](./ikeproposal.md) to be used in IKE negotiation. These policies are referenced by [IPSec profiles](./ipsecprofile.md). + +## Fields + +### Name + +The unique user-assigned name for the policy. + +### Version + +The IKE version employed (v1 or v2). + +### Mode + +The IKE mode employed (main or aggressive). + +### Proposals + +One or more [IKE proposals](./ikeproposal.md) supported for use by this policy. + +### Pre-shared Key + +A pre-shared secret key associated with this policy (optional). diff --git a/docs/models/vpn/ikeproposal.md b/docs/models/vpn/ikeproposal.md new file mode 100644 index 000000000..dd8d75330 --- /dev/null +++ b/docs/models/vpn/ikeproposal.md @@ -0,0 +1,39 @@ +# IKE Proposals + +An [Internet Key Exhcnage (IKE)](https://en.wikipedia.org/wiki/Internet_Key_Exchange) proposal defines a set of parameters used to establish a secure bidirectional connection across an untrusted medium, such as the Internet. IKE proposals defined in NetBox can be referenced by [IKE policies](./ikepolicy.md), which are in turn employed by [IPSec profiles](./ipsecprofile.md). + +!!! note + Some platforms refer to IKE proposals as [ISAKMP](https://en.wikipedia.org/wiki/Internet_Security_Association_and_Key_Management_Protocol), which is a framework for authentication and key exchange which employs IKE. + +## Fields + +### Name + +The unique user-assigned name for the proposal. + +### Authentication Method + +The strategy employed for authenticating the IKE peer. Available options are listed below. + +| Name | +|----------------| +| Pre-shared key | +| Certificate | +| RSA signature | +| DSA signature | + +### Encryption Algorithm + +The protocol employed for data encryption. Options include DES, 3DES, and various flavors of AES. + +### Authentication Algorithm + +The mechanism employed to ensure data integrity. Options include MD5 and SHA HMAC implementations. + +### Group + +The [Diffie-Hellman group](https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange) supported by the proposal. Group IDs are [managed by IANA](https://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-8). + +### SA Lifetime + +The maximum lifetime for the IKE security association (SA), in seconds. diff --git a/docs/models/vpn/ipsecpolicy.md b/docs/models/vpn/ipsecpolicy.md new file mode 100644 index 000000000..3283d3b23 --- /dev/null +++ b/docs/models/vpn/ipsecpolicy.md @@ -0,0 +1,17 @@ +# IPSec Policy + +An [IPSec](https://en.wikipedia.org/wiki/IPsec) policy defines a set of [proposals](./ikeproposal.md) to be used in the formation of IPSec tunnels. A perfect forward secrecy (PFS) group may optionally also be defined. These policies are referenced by [IPSec profiles](./ipsecprofile.md). + +## Fields + +### Name + +The unique user-assigned name for the policy. + +### Proposals + +One or more [IPSec proposals](./ipsecproposal.md) supported for use by this policy. + +### PFS Group + +The [perfect forward secrecy (PFS)](https://en.wikipedia.org/wiki/Forward_secrecy) group supported by this policy (optional). diff --git a/docs/models/vpn/ipsecprofile.md b/docs/models/vpn/ipsecprofile.md new file mode 100644 index 000000000..1ad1ce7d5 --- /dev/null +++ b/docs/models/vpn/ipsecprofile.md @@ -0,0 +1,21 @@ +# IPSec Profile + +An [IPSec](https://en.wikipedia.org/wiki/IPsec) profile defines an [IKE policy](./ikepolicy.md), [IPSec policy](./ipsecpolicy.md), and IPSec mode used for establishing an IPSec tunnel. + +## Fields + +### Name + +The unique user-assigned name for the profile. + +### Mode + +The IPSec mode employed by the profile: Encapsulating Security Payload (ESP) or Authentication Header (AH). + +### IKE Policy + +The [IKE policy](./ikepolicy.md) associated with the profile. + +### IPSec Policy + +The [IPSec policy](./ipsecpolicy.md) associated with the profile. diff --git a/docs/models/vpn/ipsecproposal.md b/docs/models/vpn/ipsecproposal.md new file mode 100644 index 000000000..d061b1535 --- /dev/null +++ b/docs/models/vpn/ipsecproposal.md @@ -0,0 +1,25 @@ +# IPSec Proposal + +An [IPSec](https://en.wikipedia.org/wiki/IPsec) proposal defines a set of parameters used in negotiating security associations for IPSec tunnels. IPSec proposals defined in NetBox can be referenced by [IPSec policies](./ipsecpolicy.md), which are in turn employed by [IPSec profiles](./ipsecprofile.md). + +## Fields + +### Name + +The unique user-assigned name for the proposal. + +### Encryption Algorithm + +The protocol employed for data encryption. Options include DES, 3DES, and various flavors of AES. + +### Authentication Algorithm + +The mechanism employed to ensure data integrity. Options include MD5 and SHA HMAC implementations. + +### SA Lifetime (Seconds) + +The maximum amount of time for which the security association (SA) may be active, in seconds. + +### SA Lifetime (Data) + +The maximum amount of data which can be transferred within the security association (SA) before it must be rebuilt, in kilobytes. diff --git a/docs/models/vpn/tunnel.md b/docs/models/vpn/tunnel.md new file mode 100644 index 000000000..ebe004da1 --- /dev/null +++ b/docs/models/vpn/tunnel.md @@ -0,0 +1,36 @@ +# Tunnels + +A tunnel represents a private virtual connection established among two or more endpoints across a shared infrastructure by employing protocol encapsulation. Common encapsulation techniques include [Generic Routing Encapsulation (GRE)](https://en.wikipedia.org/wiki/Generic_Routing_Encapsulation), [IP-in-IP](https://en.wikipedia.org/wiki/IP_in_IP), and [IPSec](https://en.wikipedia.org/wiki/IPsec). NetBox supports modeling both peer-to-peer and hub-and-spoke tunnel topologies. + +Device and virtual machine interfaces are associated to tunnels by creating [tunnel terminations](./tunneltermination.md). + +## Fields + +### Name + +A unique name assigned to the tunnel for identification. + +### Status + +The operational status of the tunnel. By default, the following statuses are available: + +| Name | +|----------------| +| Planned | +| Active | +| Disabled | + +!!! tip "Custom tunnel statuses" + Additional tunnel statuses may be defined by setting `Tunnel.status` under the [`FIELD_CHOICES`](../../configuration/data-validation.md#field_choices) configuration parameter. + +### Encapsulation + +The encapsulation protocol or technique employed to effect the tunnel. NetBox supports GRE, IP-in-IP, and IPSec encapsulations. + +### Tunnel ID + +An optional numeric identifier for the tunnel. + +### IPSec Profile + +For IPSec tunnels, this is the [IPSec Profile](./ipsecprofile.md) employed to negotiate security associations. diff --git a/docs/models/vpn/tunneltermination.md b/docs/models/vpn/tunneltermination.md new file mode 100644 index 000000000..8400eaa86 --- /dev/null +++ b/docs/models/vpn/tunneltermination.md @@ -0,0 +1,30 @@ +# Tunnel Terminations + +A tunnel termination connects a device or virtual machine interface to a [tunnel](./tunnel.md). The tunnel must be created before any terminations may be added. + +## Fields + +### Tunnel + +The [tunnel](./tunnel.md) to which this termination is made. + +### Role + +The functional role of the attached interface. The following options are available: + +| Name | Description | +|-------|--------------------------------------------------| +| Peer | An endpoint in a point-to-point or mesh topology | +| Hub | A central point in a hub-and-spoke topology | +| Spoke | An edge point in a hub-and-spoke topology | + +!!! note + Multiple hub terminations may be attached to a tunnel. + +### Termination + +The device or virtual machine interface terminated to the tunnel. + +### Outside IP + +The public or underlay IP address with which this termination is associated. This is the IP to which peers will route tunneled traffic. diff --git a/mkdocs.yml b/mkdocs.yml index 3e61f922a..f927bf386 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -74,6 +74,7 @@ nav: - Circuits: 'features/circuits.md' - Wireless: 'features/wireless.md' - Virtualization: 'features/virtualization.md' + - VPN Tunnels: 'features/vpn-tunnels.md' - Tenancy: 'features/tenancy.md' - Contacts: 'features/contacts.md' - Search: 'features/search.md' @@ -252,6 +253,14 @@ nav: - ClusterType: 'models/virtualization/clustertype.md' - VMInterface: 'models/virtualization/vminterface.md' - VirtualMachine: 'models/virtualization/virtualmachine.md' + - VPN: + - IKEPolicy: 'models/vpn/ikepolicy.md' + - IKEProposal: 'models/vpn/ikeproposal.md' + - IPSecPolicy: 'models/vpn/ipsecpolicy.md' + - IPSecProfile: 'models/vpn/ipsecprofile.md' + - IPSecProposal: 'models/vpn/ipsecproposal.md' + - Tunnel: 'models/vpn/tunnel.md' + - TunnelTermination: 'models/vpn/tunneltermination.md' - Wireless: - WirelessLAN: 'models/wireless/wirelesslan.md' - WirelessLANGroup: 'models/wireless/wirelesslangroup.md' diff --git a/netbox/core/management/commands/nbshell.py b/netbox/core/management/commands/nbshell.py index 674a878c7..fd86627d2 100644 --- a/netbox/core/management/commands/nbshell.py +++ b/netbox/core/management/commands/nbshell.py @@ -9,7 +9,7 @@ from django.contrib.auth import get_user_model from django.contrib.contenttypes.models import ContentType from django.core.management.base import BaseCommand -APPS = ('circuits', 'core', 'dcim', 'extras', 'ipam', 'tenancy', 'users', 'virtualization', 'wireless') +APPS = ('circuits', 'core', 'dcim', 'extras', 'ipam', 'tenancy', 'users', 'virtualization', 'vpn', 'wireless') BANNER_TEXT = """### NetBox interactive shell ({node}) ### Python {python} | Django {django} | NetBox {netbox} diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index c24ed4d86..705af7637 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -566,6 +566,10 @@ class BaseInterface(models.Model): return super().save(*args, **kwargs) + @property + def tunnel_termination(self): + return self.tunnel_terminations.first() + @property def count_ipaddresses(self): return self.ip_addresses.count() @@ -719,6 +723,12 @@ class Interface(ModularComponentModel, BaseInterface, CabledObjectModel, PathEnd object_id_field='interface_id', related_query_name='+' ) + tunnel_terminations = GenericRelation( + to='vpn.TunnelTermination', + content_type_field='termination_type', + object_id_field='termination_id', + related_query_name='interface' + ) l2vpn_terminations = GenericRelation( to='ipam.L2VPNTermination', content_type_field='assigned_object_type', diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index b72c37daa..60e203697 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -584,6 +584,12 @@ class BaseInterfaceTable(NetBoxTable): orderable=False, verbose_name=_('L2VPN') ) + tunnel = tables.Column( + accessor=tables.A('tunnel_termination__tunnel'), + linkify=True, + orderable=False, + verbose_name=_('Tunnel') + ) untagged_vlan = tables.Column( verbose_name=_('Untagged VLAN'), linkify=True @@ -646,7 +652,8 @@ class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpoi 'speed', 'speed_formatted', 'duplex', 'mode', 'mac_address', 'wwn', 'poe_mode', 'poe_type', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', - 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'inventory_items', 'created', 'last_updated', + 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'inventory_items', 'created', + 'last_updated', ) default_columns = ('pk', 'name', 'device', 'label', 'enabled', 'type', 'description') @@ -682,8 +689,8 @@ class DeviceInterfaceTable(InterfaceTable): 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'enabled', 'type', 'parent', 'bridge', 'lag', 'mgmt_only', 'mtu', 'mode', 'mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', - 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', 'ip_addresses', 'fhrp_groups', - 'untagged_vlan', 'tagged_vlans', 'actions', + 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', + 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'actions', ) default_columns = ( 'pk', 'name', 'label', 'enabled', 'type', 'parent', 'lag', 'mtu', 'mode', 'description', 'ip_addresses', diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index e0f38afef..a24f9ea6d 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -359,6 +359,16 @@ INTERFACE_BUTTONS = """ {% endif %} +{% elif record.type == 'virtual' %} + {% if perms.vpn.add_tunnel and not record.tunnel_termination %} + + + + {% elif perms.vpn.delete_tunneltermination and record.tunnel_termination %} + + + + {% endif %} {% elif record.is_wired and perms.dcim.add_cable %} diff --git a/netbox/netbox/api/views.py b/netbox/netbox/api/views.py index 4e71ca193..cfbe82f14 100644 --- a/netbox/netbox/api/views.py +++ b/netbox/netbox/api/views.py @@ -39,6 +39,7 @@ class APIRootView(APIView): 'tenancy': reverse('tenancy-api:api-root', request=request, format=format), 'users': reverse('users-api:api-root', request=request, format=format), 'virtualization': reverse('virtualization-api:api-root', request=request, format=format), + 'vpn': reverse('vpn-api:api-root', request=request, format=format), 'wireless': reverse('wireless-api:api-root', request=request, format=format), }) diff --git a/netbox/netbox/graphql/schema.py b/netbox/netbox/graphql/schema.py index 7224f3c38..021d6d902 100644 --- a/netbox/netbox/graphql/schema.py +++ b/netbox/netbox/graphql/schema.py @@ -9,6 +9,7 @@ from netbox.registry import registry from tenancy.graphql.schema import TenancyQuery from users.graphql.schema import UsersQuery from virtualization.graphql.schema import VirtualizationQuery +from vpn.graphql.schema import VPNQuery from wireless.graphql.schema import WirelessQuery @@ -21,6 +22,7 @@ class Query( IPAMQuery, TenancyQuery, VirtualizationQuery, + VPNQuery, WirelessQuery, *registry['plugins']['graphql_schemas'], # Append plugin schemas graphene.ObjectType diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 7ad317324..e99b84b10 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -195,17 +195,34 @@ IPAM_MENU = Menu( ), ) -OVERLAY_MENU = Menu( - label=_('Overlay'), +VPN_MENU = Menu( + label=_('VPN'), icon_class='mdi mdi-graph-outline', groups=( MenuGroup( - label='L2VPNs', + label=_('Tunnels'), + items=( + get_model_item('vpn', 'tunnel', _('Tunnels')), + get_model_item('vpn', 'tunneltermination', _('Tunnel Terminations')), + ), + ), + MenuGroup( + label=_('L2VPNs'), items=( get_model_item('ipam', 'l2vpn', _('L2VPNs')), get_model_item('ipam', 'l2vpntermination', _('Terminations')), ), ), + MenuGroup( + label=_('Security'), + items=( + get_model_item('vpn', 'ikeproposal', _('IKE Proposals')), + get_model_item('vpn', 'ikepolicy', _('IKE Policies')), + get_model_item('vpn', 'ipsecproposal', _('IPSec Proposals')), + get_model_item('vpn', 'ipsecpolicy', _('IPSec Policies')), + get_model_item('vpn', 'ipsecprofile', _('IPSec Profiles')), + ), + ), ), ) @@ -444,7 +461,7 @@ MENUS = [ CONNECTIONS_MENU, WIRELESS_MENU, IPAM_MENU, - OVERLAY_MENU, + VPN_MENU, VIRTUALIZATION_MENU, CIRCUITS_MENU, POWER_MENU, diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 465389a11..ce8ab5876 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -379,6 +379,7 @@ INSTALLED_APPS = [ 'users', 'utilities', 'virtualization', + 'vpn', 'wireless', 'django_rq', # Must come after extras to allow overriding management commands 'drf_spectacular', diff --git a/netbox/netbox/urls.py b/netbox/netbox/urls.py index 6955426a8..984358911 100644 --- a/netbox/netbox/urls.py +++ b/netbox/netbox/urls.py @@ -33,6 +33,7 @@ _patterns = [ path('tenancy/', include('tenancy.urls')), path('users/', include('users.urls')), path('virtualization/', include('virtualization.urls')), + path('vpn/', include('vpn.urls')), path('wireless/', include('wireless.urls')), # Current user views @@ -51,6 +52,7 @@ _patterns = [ path('api/tenancy/', include('tenancy.api.urls')), path('api/users/', include('users.api.urls')), path('api/virtualization/', include('virtualization.api.urls')), + path('api/vpn/', include('vpn.api.urls')), path('api/wireless/', include('wireless.api.urls')), path('api/status/', StatusView.as_view(), name='api-status'), diff --git a/netbox/templates/vpn/ikepolicy.html b/netbox/templates/vpn/ikepolicy.html new file mode 100644 index 000000000..559ba6d17 --- /dev/null +++ b/netbox/templates/vpn/ikepolicy.html @@ -0,0 +1,67 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load i18n %} + +{% block content %} +
    +
    +
    +
    {% trans "IKE Policy" %}
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    {% trans "Name" %}{{ object.name }}
    {% trans "Description" %}{{ object.description|placeholder }}
    {% trans "IKE Version" %}{{ object.get_version_display }}
    {% trans "Mode" %}{{ object.get_mode_display }}
    {% trans "Pre-Shared Key" %} + {{ object.preshared_key|placeholder }} + {% if object.preshared_key %} + + {% endif %} +
    {% trans "IPSec Profiles" %} + {{ object.ipsec_profiles.count }} +
    +
    +
    + {% plugin_left_page object %} +
    +
    + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + {% plugin_right_page object %} +
    +
    +
    +
    +
    +
    {% trans "Proposals" %}
    +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} diff --git a/netbox/templates/vpn/ikeproposal.html b/netbox/templates/vpn/ikeproposal.html new file mode 100644 index 000000000..33cf60c81 --- /dev/null +++ b/netbox/templates/vpn/ikeproposal.html @@ -0,0 +1,63 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load i18n %} + +{% block content %} +
    +
    +
    +
    {% trans "IKE Proposal" %}
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {% trans "Name" %}{{ object.name }}
    {% trans "Description" %}{{ object.description|placeholder }}
    {% trans "Authentication method" %}{{ object.get_authentication_method_display }}
    {% trans "Encryption algorithm" %}{{ object.get_encryption_algorithm_display }}
    {% trans "Authentication algorithm" %}{{ object.get_authentication_algorithm_display }}
    {% trans "DH group" %}{{ object.get_group_display }}
    {% trans "SA lifetime (seconds)" %}{{ object.sa_lifetime|placeholder }}
    {% trans "IKE Policies" %} + {{ object.ike_policies.count }} +
    +
    +
    + {% plugin_left_page object %} +
    +
    + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + {% plugin_right_page object %} +
    +
    +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} diff --git a/netbox/templates/vpn/ipsecpolicy.html b/netbox/templates/vpn/ipsecpolicy.html new file mode 100644 index 000000000..4960d9dd3 --- /dev/null +++ b/netbox/templates/vpn/ipsecpolicy.html @@ -0,0 +1,55 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load i18n %} + +{% block content %} +
    +
    +
    +
    {% trans "IPSec Policy" %}
    +
    + + + + + + + + + + + + + + + + + +
    {% trans "Name" %}{{ object.name }}
    {% trans "Description" %}{{ object.description|placeholder }}
    {% trans "PFS group" %}{{ object.get_pfs_group_display|placeholder }}
    {% trans "IPSec Profiles" %} + {{ object.ipsec_profiles.count }} +
    +
    +
    + {% plugin_left_page object %} +
    +
    + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + {% plugin_right_page object %} +
    +
    +
    +
    +
    +
    +
    {% trans "Proposals" %}
    +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} diff --git a/netbox/templates/vpn/ipsecprofile.html b/netbox/templates/vpn/ipsecprofile.html new file mode 100644 index 000000000..08fa3074e --- /dev/null +++ b/netbox/templates/vpn/ipsecprofile.html @@ -0,0 +1,112 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load i18n %} + +{% block content %} +
    +
    +
    +
    {% trans "IPSec Profile" %}
    +
    + + + + + + + + + + + + + +
    {% trans "Name" %}{{ object.name }}
    {% trans "Description" %}{{ object.description|placeholder }}
    {% trans "Mode" %}{{ object.get_mode_display }}
    +
    +
    + {% include 'inc/panels/tags.html' %} + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/comments.html' %} + {% plugin_left_page object %} +
    +
    +
    +
    {% trans "IKE Policy" %}
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    {% trans "Name" %}{{ object.ike_policy|linkify }}
    {% trans "Description" %}{{ object.ike_policy.description|placeholder }}
    {% trans "Version" %}{{ object.ike_policy.get_version_display }}
    {% trans "Mode" %}{{ object.ike_policy.get_mode_display }}
    {% trans "Proposals" %} +
      + {% for proposal in object.ike_policy.proposals.all %} +
    • + {{ proposal }} +
    • + {% endfor %} +
    +
    {% trans "Pre-Shared Key" %}{% checkmark object.ike_policy.preshared_key %}
    +
    +
    +
    +
    {% trans "IPSec Policy" %}
    +
    + + + + + + + + + + + + + + + + + +
    {% trans "Name" %}{{ object.ipsec_policy|linkify }}
    {% trans "Description" %}{{ object.ipsec_policy.description|placeholder }}
    {% trans "Proposals" %} +
      + {% for proposal in object.ipsec_policy.proposals.all %} +
    • + {{ proposal }} +
    • + {% endfor %} +
    +
    {% trans "PFS Group" %}{{ object.ipsec_policy.get_pfs_group_display }}
    +
    +
    + {% plugin_right_page object %} +
    +
    +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} diff --git a/netbox/templates/vpn/ipsecproposal.html b/netbox/templates/vpn/ipsecproposal.html new file mode 100644 index 000000000..7425eef43 --- /dev/null +++ b/netbox/templates/vpn/ipsecproposal.html @@ -0,0 +1,59 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load i18n %} + +{% block content %} +
    +
    +
    +
    {% trans "IPSec Proposal" %}
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {% trans "Name" %}{{ object.name }}
    {% trans "Description" %}{{ object.description|placeholder }}
    {% trans "Encryption algorithm" %}{{ object.get_encryption_algorithm_display }}
    {% trans "Authentication algorithm" %}{{ object.get_authentication_algorithm_display }}
    {% trans "SA lifetime (seconds)" %}{{ object.sa_lifetime_seconds|placeholder }}
    {% trans "SA lifetime (KB)" %}{{ object.sa_lifetime_data|placeholder }}
    {% trans "IPSec Policies" %} + {{ object.ipsec_policies.count }} +
    +
    +
    + {% plugin_left_page object %} +
    +
    + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + {% plugin_right_page object %} +
    +
    +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} diff --git a/netbox/templates/vpn/tunnel.html b/netbox/templates/vpn/tunnel.html new file mode 100644 index 000000000..544ffadae --- /dev/null +++ b/netbox/templates/vpn/tunnel.html @@ -0,0 +1,85 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load i18n %} + +{% block extra_controls %} + {% if perms.vpn.add_tunneltermination %} + + {% trans "Add Termination" %} + + {% endif %} +{% endblock %} + +{% block content %} +
    +
    +
    +
    {% trans "Tunnel" %}
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {% trans "Name" %}{{ object.name }}
    {% trans "Status" %}{% badge object.get_status_display bg_color=object.get_status_color %}
    {% trans "Description" %}{{ object.description|placeholder }}
    {% trans "Encapsulation" %}{{ object.get_encapsulation_display }}
    {% trans "IPSec profile" %}{{ object.ipsec_profile|linkify|placeholder }}
    {% trans "Tunnel ID" %}{{ object.tunnel_id|placeholder }}
    {% trans "Tenant" %} + {% if object.tenant.group %} + {{ object.tenant.group|linkify }} / + {% endif %} + {{ object.tenant|linkify|placeholder }} +
    +
    +
    + {% plugin_left_page object %} +
    +
    + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + {% include 'inc/panels/comments.html' %} + {% plugin_right_page object %} +
    +
    +
    +
    +
    +
    {% trans "Terminations" %}
    +
    + {% if perms.vpn.add_tunneltermination %} + + {% endif %} +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} diff --git a/netbox/templates/vpn/tunneltermination.html b/netbox/templates/vpn/tunneltermination.html new file mode 100644 index 000000000..6f4e83ce0 --- /dev/null +++ b/netbox/templates/vpn/tunneltermination.html @@ -0,0 +1,62 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load i18n %} + +{% block content %} +
    +
    +
    +
    {% trans "Tunnel Termination" %}
    +
    + + + + + + + + + + + + + + + + + + + + + +
    {% trans "Tunnel" %}{{ object.tunnel|linkify }}
    {% trans "Role" %}{% badge object.get_role_display bg_color=object.get_role_color %}
    + {% if object.termination.device %} + {% trans "Device" %} + {% elif object.termination.virtual_machine %} + {% trans "Virtual Machine" %} + {% endif %} + {{ object.termination.parent_object|linkify }}
    {% trans "Interface" %}{{ object.termination|linkify }}
    {% trans "Outside IP" %}{{ object.outside_ip|linkify|placeholder }}
    +
    +
    + {% plugin_left_page object %} +
    +
    + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + {% plugin_right_page object %} +
    +
    +
    +
    +
    +
    {% trans "Peer Terminations" %}
    +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index 705419186..2126f2541 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -351,6 +351,12 @@ class VMInterface(ComponentModel, BaseInterface, TrackingModelMixin): object_id_field='interface_id', related_query_name='+' ) + tunnel_terminations = GenericRelation( + to='vpn.TunnelTermination', + content_type_field='termination_type', + object_id_field='termination_id', + related_query_name='vminterface', + ) l2vpn_terminations = GenericRelation( to='ipam.L2VPNTermination', content_type_field='assigned_object_type', diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index 88627462a..1eeb06ea8 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -131,7 +131,8 @@ class VMInterfaceTable(BaseInterfaceTable): model = VMInterface fields = ( 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags', - 'vrf', 'l2vpn', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'created', 'last_updated', + 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'created', + 'last_updated', ) default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description') @@ -154,7 +155,7 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable): model = VMInterface fields = ( 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'mac_address', 'mtu', 'mode', 'description', 'tags', - 'vrf', 'l2vpn', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'actions', + 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'actions', ) default_columns = ('pk', 'name', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'ip_addresses') row_attrs = { diff --git a/netbox/vpn/__init__.py b/netbox/vpn/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/netbox/vpn/admin.py b/netbox/vpn/admin.py new file mode 100644 index 000000000..8c38f3f3d --- /dev/null +++ b/netbox/vpn/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/netbox/vpn/api/__init__.py b/netbox/vpn/api/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/netbox/vpn/api/nested_serializers.py b/netbox/vpn/api/nested_serializers.py new file mode 100644 index 000000000..c9c92d308 --- /dev/null +++ b/netbox/vpn/api/nested_serializers.py @@ -0,0 +1,84 @@ +from rest_framework import serializers + +from netbox.api.serializers import WritableNestedSerializer +from vpn import models + +__all__ = ( + 'NestedIKEPolicySerializer', + 'NestedIKEProposalSerializer', + 'NestedIPSecPolicySerializer', + 'NestedIPSecProfileSerializer', + 'NestedIPSecProposalSerializer', + 'NestedTunnelSerializer', + 'NestedTunnelTerminationSerializer', +) + + +class NestedTunnelSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:tunnel-detail' + ) + + class Meta: + model = models.Tunnel + fields = ('id', 'url', 'display', 'name') + + +class NestedTunnelTerminationSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:tunneltermination-detail' + ) + + class Meta: + model = models.TunnelTermination + fields = ('id', 'url', 'display') + + +class NestedIKEProposalSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:ikeproposal-detail' + ) + + class Meta: + model = models.IKEProposal + fields = ('id', 'url', 'display', 'name') + + +class NestedIKEPolicySerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:ikepolicy-detail' + ) + + class Meta: + model = models.IKEPolicy + fields = ('id', 'url', 'display', 'name') + + +class NestedIPSecProposalSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:ipsecproposal-detail' + ) + + class Meta: + model = models.IPSecProposal + fields = ('id', 'url', 'display', 'name') + + +class NestedIPSecPolicySerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:ipsecpolicy-detail' + ) + + class Meta: + model = models.IPSecPolicy + fields = ('id', 'url', 'display', 'name') + + +class NestedIPSecProfileSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:ipsecprofile-detail' + ) + + class Meta: + model = models.IPSecProfile + fields = ('id', 'url', 'display', 'name') diff --git a/netbox/vpn/api/serializers.py b/netbox/vpn/api/serializers.py new file mode 100644 index 000000000..1a517fe59 --- /dev/null +++ b/netbox/vpn/api/serializers.py @@ -0,0 +1,193 @@ +from django.contrib.contenttypes.models import ContentType +from drf_spectacular.utils import extend_schema_field +from rest_framework import serializers + +from ipam.api.nested_serializers import NestedIPAddressSerializer +from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField +from netbox.api.serializers import NetBoxModelSerializer +from netbox.constants import NESTED_SERIALIZER_PREFIX +from tenancy.api.nested_serializers import NestedTenantSerializer +from utilities.api import get_serializer_for_model +from vpn.choices import * +from vpn.models import * +from .nested_serializers import * + +__all__ = ( + 'IKEPolicySerializer', + 'IKEProposalSerializer', + 'IPSecPolicySerializer', + 'IPSecProfileSerializer', + 'IPSecProposalSerializer', + 'TunnelSerializer', + 'TunnelTerminationSerializer', +) + + +class TunnelSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:tunnel-detail' + ) + status = ChoiceField( + choices=TunnelStatusChoices + ) + encapsulation = ChoiceField( + choices=TunnelEncapsulationChoices + ) + ipsec_profile = NestedIPSecProfileSerializer( + required=False, + allow_null=True + ) + tenant = NestedTenantSerializer( + required=False, + allow_null=True + ) + + class Meta: + model = Tunnel + fields = ( + 'id', 'url', 'display', 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tunnel_id', + 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + ) + + +class TunnelTerminationSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:tunneltermination-detail' + ) + tunnel = NestedTunnelSerializer() + role = ChoiceField( + choices=TunnelTerminationRoleChoices + ) + termination_type = ContentTypeField( + queryset=ContentType.objects.all() + ) + termination = serializers.SerializerMethodField( + read_only=True + ) + outside_ip = NestedIPAddressSerializer( + required=False, + allow_null=True + ) + + class Meta: + model = TunnelTermination + fields = ( + 'id', 'url', 'display', 'tunnel', 'role', 'termination_type', 'termination_id', 'termination', 'outside_ip', + 'tags', 'custom_fields', 'created', 'last_updated', + ) + + @extend_schema_field(serializers.JSONField(allow_null=True)) + def get_termination(self, obj): + serializer = get_serializer_for_model(obj.termination, prefix=NESTED_SERIALIZER_PREFIX) + context = {'request': self.context['request']} + return serializer(obj.termination, context=context).data + + +class IKEProposalSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:ikeproposal-detail' + ) + authentication_method = ChoiceField( + choices=AuthenticationMethodChoices + ) + encryption_algorithm = ChoiceField( + choices=EncryptionAlgorithmChoices + ) + authentication_algorithm = ChoiceField( + choices=AuthenticationAlgorithmChoices + ) + group = ChoiceField( + choices=DHGroupChoices + ) + + class Meta: + model = IKEProposal + fields = ( + 'id', 'url', 'display', 'name', 'description', 'authentication_method', 'encryption_algorithm', + 'authentication_algorithm', 'group', 'sa_lifetime', 'tags', 'custom_fields', 'created', 'last_updated', + ) + + +class IKEPolicySerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:ikepolicy-detail' + ) + version = ChoiceField( + choices=IKEVersionChoices + ) + mode = ChoiceField( + choices=IKEModeChoices + ) + proposals = SerializedPKRelatedField( + queryset=IKEProposal.objects.all(), + serializer=NestedIKEProposalSerializer, + required=False, + many=True + ) + + class Meta: + model = IKEPolicy + fields = ( + 'id', 'url', 'display', 'name', 'description', 'version', 'mode', 'proposals', 'preshared_key', 'tags', + 'custom_fields', 'created', 'last_updated', + ) + + +class IPSecProposalSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:ipsecproposal-detail' + ) + encryption_algorithm = ChoiceField( + choices=EncryptionAlgorithmChoices + ) + authentication_algorithm = ChoiceField( + choices=AuthenticationAlgorithmChoices + ) + + class Meta: + model = IPSecProposal + fields = ( + 'id', 'url', 'display', 'name', 'description', 'encryption_algorithm', 'authentication_algorithm', + 'sa_lifetime_seconds', 'sa_lifetime_data', 'tags', 'custom_fields', 'created', 'last_updated', + ) + + +class IPSecPolicySerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:ipsecpolicy-detail' + ) + proposals = SerializedPKRelatedField( + queryset=IPSecProposal.objects.all(), + serializer=NestedIPSecProposalSerializer, + required=False, + many=True + ) + pfs_group = ChoiceField( + choices=DHGroupChoices, + required=False + ) + + class Meta: + model = IPSecPolicy + fields = ( + 'id', 'url', 'display', 'name', 'description', 'proposals', 'pfs_group', 'tags', 'custom_fields', 'created', + 'last_updated', + ) + + +class IPSecProfileSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='vpn-api:ipsecprofile-detail' + ) + mode = ChoiceField( + choices=IPSecModeChoices + ) + ike_policy = NestedIKEPolicySerializer() + ipsec_policy = NestedIPSecPolicySerializer() + + class Meta: + model = IPSecProfile + fields = ( + 'id', 'url', 'display', 'name', 'description', 'mode', 'ike_policy', 'ipsec_policy', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', + ) diff --git a/netbox/vpn/api/urls.py b/netbox/vpn/api/urls.py new file mode 100644 index 000000000..f646174d5 --- /dev/null +++ b/netbox/vpn/api/urls.py @@ -0,0 +1,15 @@ +from netbox.api.routers import NetBoxRouter +from . import views + +router = NetBoxRouter() +router.APIRootView = views.VPNRootView +router.register('ike-policies', views.IKEPolicyViewSet) +router.register('ike-proposals', views.IKEProposalViewSet) +router.register('ipsec-policies', views.IPSecPolicyViewSet) +router.register('ipsec-proposals', views.IPSecProposalViewSet) +router.register('ipsec-profiles', views.IPSecProfileViewSet) +router.register('tunnels', views.TunnelViewSet) +router.register('tunnel-terminations', views.TunnelTerminationViewSet) + +app_name = 'vpn-api' +urlpatterns = router.urls diff --git a/netbox/vpn/api/views.py b/netbox/vpn/api/views.py new file mode 100644 index 000000000..c0ccab7ab --- /dev/null +++ b/netbox/vpn/api/views.py @@ -0,0 +1,74 @@ +from rest_framework.routers import APIRootView + +from netbox.api.viewsets import NetBoxModelViewSet +from utilities.utils import count_related +from vpn import filtersets +from vpn.models import * +from . import serializers + +__all__ = ( + 'IKEPolicyViewSet', + 'IKEProposalViewSet', + 'IPSecPolicyViewSet', + 'IPSecProfileViewSet', + 'IPSecProposalViewSet', + 'TunnelTerminationViewSet', + 'TunnelViewSet', + 'VPNRootView', +) + + +class VPNRootView(APIRootView): + """ + VPN API root view + """ + def get_view_name(self): + return 'VPN' + + +# +# Viewsets +# + +class TunnelViewSet(NetBoxModelViewSet): + queryset = Tunnel.objects.prefetch_related('ipsec_profile', 'tenant').annotate( + terminations_count=count_related(TunnelTermination, 'tunnel') + ) + serializer_class = serializers.TunnelSerializer + filterset_class = filtersets.TunnelFilterSet + + +class TunnelTerminationViewSet(NetBoxModelViewSet): + queryset = TunnelTermination.objects.prefetch_related('tunnel') + serializer_class = serializers.TunnelTerminationSerializer + filterset_class = filtersets.TunnelTerminationFilterSet + + +class IKEProposalViewSet(NetBoxModelViewSet): + queryset = IKEProposal.objects.all() + serializer_class = serializers.IKEProposalSerializer + filterset_class = filtersets.IKEProposalFilterSet + + +class IKEPolicyViewSet(NetBoxModelViewSet): + queryset = IKEPolicy.objects.all() + serializer_class = serializers.IKEPolicySerializer + filterset_class = filtersets.IKEPolicyFilterSet + + +class IPSecProposalViewSet(NetBoxModelViewSet): + queryset = IPSecProposal.objects.all() + serializer_class = serializers.IPSecProposalSerializer + filterset_class = filtersets.IPSecProposalFilterSet + + +class IPSecPolicyViewSet(NetBoxModelViewSet): + queryset = IPSecPolicy.objects.all() + serializer_class = serializers.IPSecPolicySerializer + filterset_class = filtersets.IPSecPolicyFilterSet + + +class IPSecProfileViewSet(NetBoxModelViewSet): + queryset = IPSecProfile.objects.all() + serializer_class = serializers.IPSecProfileSerializer + filterset_class = filtersets.IPSecProfileFilterSet diff --git a/netbox/vpn/apps.py b/netbox/vpn/apps.py new file mode 100644 index 000000000..2254befd3 --- /dev/null +++ b/netbox/vpn/apps.py @@ -0,0 +1,9 @@ +from django.apps import AppConfig + + +class VPNConfig(AppConfig): + name = 'vpn' + verbose_name = 'VPN' + + def ready(self): + from . import search diff --git a/netbox/vpn/choices.py b/netbox/vpn/choices.py new file mode 100644 index 000000000..a932c5055 --- /dev/null +++ b/netbox/vpn/choices.py @@ -0,0 +1,201 @@ +from django.utils.translation import gettext_lazy as _ + +from utilities.choices import ChoiceSet + + +# +# Tunnels +# + +class TunnelStatusChoices(ChoiceSet): + key = 'Tunnel.status' + + STATUS_PLANNED = 'planned' + STATUS_ACTIVE = 'active' + STATUS_DISABLED = 'disabled' + + CHOICES = [ + (STATUS_PLANNED, _('Planned'), 'cyan'), + (STATUS_ACTIVE, _('Active'), 'green'), + (STATUS_DISABLED, _('Disabled'), 'red'), + ] + + +class TunnelEncapsulationChoices(ChoiceSet): + ENCAP_GRE = 'gre' + ENCAP_IP_IP = 'ip-ip' + ENCAP_IPSEC_TRANSPORT = 'ipsec-transport' + ENCAP_IPSEC_TUNNEL = 'ipsec-tunnel' + + CHOICES = [ + (ENCAP_IPSEC_TRANSPORT, _('IPsec - Transport')), + (ENCAP_IPSEC_TUNNEL, _('IPsec - Tunnel')), + (ENCAP_IP_IP, _('IP-in-IP')), + (ENCAP_GRE, _('GRE')), + ] + + +class TunnelTerminationTypeChoices(ChoiceSet): + # For TunnelCreateForm + TYPE_DEVICE = 'dcim.device' + TYPE_VIRUTALMACHINE = 'virtualization.virtualmachine' + + CHOICES = ( + (TYPE_DEVICE, _('Device')), + (TYPE_VIRUTALMACHINE, _('Virtual Machine')), + ) + + +class TunnelTerminationRoleChoices(ChoiceSet): + ROLE_PEER = 'peer' + ROLE_HUB = 'hub' + ROLE_SPOKE = 'spoke' + + CHOICES = [ + (ROLE_PEER, _('Peer'), 'green'), + (ROLE_HUB, _('Hub'), 'blue'), + (ROLE_SPOKE, _('Spoke'), 'orange'), + ] + + +# +# Crypto +# + +class IKEVersionChoices(ChoiceSet): + VERSION_1 = 1 + VERSION_2 = 2 + + CHOICES = ( + (VERSION_1, 'IKEv1'), + (VERSION_2, 'IKEv2'), + ) + + +class IKEModeChoices(ChoiceSet): + AGGRESSIVE = 'aggressive' + MAIN = 'main' + + CHOICES = ( + (AGGRESSIVE, _('Aggressive')), + (MAIN, _('Main')), + ) + + +class AuthenticationMethodChoices(ChoiceSet): + PRESHARED_KEYS = 'preshared-keys' + CERTIFICATES = 'certificates' + RSA_SIGNATURES = 'rsa-signatures' + DSA_SIGNATURES = 'dsa-signatures' + + CHOICES = ( + (PRESHARED_KEYS, _('Pre-shared keys')), + (CERTIFICATES, _('Certificates')), + (RSA_SIGNATURES, _('RSA signatures')), + (DSA_SIGNATURES, _('DSA signatures')), + ) + + +class IPSecModeChoices(ChoiceSet): + ESP = 'esp' + AH = 'ah' + + CHOICES = ( + (ESP, 'ESP'), + (AH, 'AH'), + ) + + +class EncryptionAlgorithmChoices(ChoiceSet): + ENCRYPTION_AES128_CBC = 'aes-128-cbc' + ENCRYPTION_AES128_GCM = 'aes-128-gcm' + ENCRYPTION_AES192_CBC = 'aes-192-cbc' + ENCRYPTION_AES192_GCM = 'aes-192-gcm' + ENCRYPTION_AES256_CBC = 'aes-256-cbc' + ENCRYPTION_AES256_GCM = 'aes-256-gcm' + ENCRYPTION_3DES = '3des-cbc' + ENCRYPTION_DES = 'des-cbc' + + CHOICES = ( + (ENCRYPTION_AES128_CBC, '128-bit AES (CBC)'), + (ENCRYPTION_AES128_GCM, '128-bit AES (GCM)'), + (ENCRYPTION_AES192_CBC, '192-bit AES (CBC)'), + (ENCRYPTION_AES192_GCM, '192-bit AES (GCM)'), + (ENCRYPTION_AES256_CBC, '256-bit AES (CBC)'), + (ENCRYPTION_AES256_GCM, '256-bit AES (GCM)'), + (ENCRYPTION_3DES, '3DES'), + (ENCRYPTION_3DES, 'DES'), + ) + + +class AuthenticationAlgorithmChoices(ChoiceSet): + AUTH_HMAC_SHA1 = 'hmac-sha1' + AUTH_HMAC_SHA256 = 'hmac-sha256' + AUTH_HMAC_SHA384 = 'hmac-sha384' + AUTH_HMAC_SHA512 = 'hmac-sha512' + AUTH_HMAC_MD5 = 'hmac-md5' + + CHOICES = ( + (AUTH_HMAC_SHA1, 'SHA-1 HMAC'), + (AUTH_HMAC_SHA256, 'SHA-256 HMAC'), + (AUTH_HMAC_SHA384, 'SHA-384 HMAC'), + (AUTH_HMAC_SHA512, 'SHA-512 HMAC'), + (AUTH_HMAC_MD5, 'MD5 HMAC'), + ) + + +class DHGroupChoices(ChoiceSet): + # https://www.iana.org/assignments/ikev2-parameters/ikev2-parameters.xhtml#ikev2-parameters-8 + GROUP_1 = 1 # 768-bit MODP + GROUP_2 = 2 # 1024-but MODP + # Groups 3-4 reserved + GROUP_5 = 5 # 1536-bit MODP + # Groups 6-13 unassigned + GROUP_14 = 14 # 2048-bit MODP + GROUP_15 = 15 # 3072-bit MODP + GROUP_16 = 16 # 4096-bit MODP + GROUP_17 = 17 # 6144-bit MODP + GROUP_18 = 18 # 8192-bit MODP + GROUP_19 = 19 # 256-bit random ECP + GROUP_20 = 20 # 384-bit random ECP + GROUP_21 = 21 # 521-bit random ECP (521 is not a typo) + GROUP_22 = 22 # 1024-bit MODP w/160-bit prime + GROUP_23 = 23 # 2048-bit MODP w/224-bit prime + GROUP_24 = 24 # 2048-bit MODP w/256-bit prime + GROUP_25 = 25 # 192-bit ECP + GROUP_26 = 26 # 224-bit ECP + GROUP_27 = 27 # brainpoolP224r1 + GROUP_28 = 28 # brainpoolP256r1 + GROUP_29 = 29 # brainpoolP384r1 + GROUP_30 = 30 # brainpoolP512r1 + GROUP_31 = 31 # Curve25519 + GROUP_32 = 32 # Curve448 + GROUP_33 = 33 # GOST3410_2012_256 + GROUP_34 = 34 # GOST3410_2012_512 + + CHOICES = ( + # Strings are formatted in this manner to optimize translations + (GROUP_1, _('Group {n}').format(n=1)), + (GROUP_2, _('Group {n}').format(n=2)), + (GROUP_5, _('Group {n}').format(n=5)), + (GROUP_14, _('Group {n}').format(n=14)), + (GROUP_16, _('Group {n}').format(n=16)), + (GROUP_17, _('Group {n}').format(n=17)), + (GROUP_18, _('Group {n}').format(n=18)), + (GROUP_19, _('Group {n}').format(n=19)), + (GROUP_20, _('Group {n}').format(n=20)), + (GROUP_21, _('Group {n}').format(n=21)), + (GROUP_22, _('Group {n}').format(n=22)), + (GROUP_23, _('Group {n}').format(n=23)), + (GROUP_24, _('Group {n}').format(n=24)), + (GROUP_25, _('Group {n}').format(n=25)), + (GROUP_26, _('Group {n}').format(n=26)), + (GROUP_27, _('Group {n}').format(n=27)), + (GROUP_28, _('Group {n}').format(n=28)), + (GROUP_29, _('Group {n}').format(n=29)), + (GROUP_30, _('Group {n}').format(n=30)), + (GROUP_31, _('Group {n}').format(n=31)), + (GROUP_32, _('Group {n}').format(n=32)), + (GROUP_33, _('Group {n}').format(n=33)), + (GROUP_34, _('Group {n}').format(n=34)), + ) diff --git a/netbox/vpn/filtersets.py b/netbox/vpn/filtersets.py new file mode 100644 index 000000000..c0bd140c3 --- /dev/null +++ b/netbox/vpn/filtersets.py @@ -0,0 +1,241 @@ +import django_filters +from django.db.models import Q +from django.utils.translation import gettext as _ + +from dcim.models import Interface +from ipam.models import IPAddress +from netbox.filtersets import NetBoxModelFilterSet +from tenancy.filtersets import TenancyFilterSet +from utilities.filters import ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter +from virtualization.models import VMInterface +from .choices import * +from .models import * + +__all__ = ( + 'IKEPolicyFilterSet', + 'IKEProposalFilterSet', + 'IPSecPolicyFilterSet', + 'IPSecProfileFilterSet', + 'IPSecProposalFilterSet', + 'TunnelFilterSet', + 'TunnelTerminationFilterSet', +) + + +class TunnelFilterSet(NetBoxModelFilterSet, TenancyFilterSet): + status = django_filters.MultipleChoiceFilter( + choices=TunnelStatusChoices + ) + encapsulation = django_filters.MultipleChoiceFilter( + choices=TunnelEncapsulationChoices + ) + ipsec_profile_id = django_filters.ModelMultipleChoiceFilter( + queryset=IPSecProfile.objects.all(), + label=_('IPSec profile (ID)'), + ) + ipsec_profile = django_filters.ModelMultipleChoiceFilter( + field_name='ipsec_profile__name', + queryset=IPSecProfile.objects.all(), + to_field_name='name', + label=_('IPSec profile (name)'), + ) + + class Meta: + model = Tunnel + fields = ['id', 'name', 'tunnel_id'] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) | + Q(comments__icontains=value) + ) + + +class TunnelTerminationFilterSet(NetBoxModelFilterSet): + tunnel_id = django_filters.ModelMultipleChoiceFilter( + field_name='tunnel', + queryset=Tunnel.objects.all(), + label=_('Tunnel (ID)'), + ) + tunnel = django_filters.ModelMultipleChoiceFilter( + field_name='tunnel__name', + queryset=Tunnel.objects.all(), + to_field_name='name', + label=_('Tunnel (name)'), + ) + role = django_filters.MultipleChoiceFilter( + choices=TunnelTerminationRoleChoices + ) + termination_type = ContentTypeFilter() + interface = django_filters.ModelMultipleChoiceFilter( + field_name='interface__name', + queryset=Interface.objects.all(), + to_field_name='name', + label=_('Interface (name)'), + ) + interface_id = django_filters.ModelMultipleChoiceFilter( + field_name='interface', + queryset=Interface.objects.all(), + label=_('Interface (ID)'), + ) + vminterface = django_filters.ModelMultipleChoiceFilter( + field_name='vminterface__name', + queryset=VMInterface.objects.all(), + to_field_name='name', + label=_('VM interface (name)'), + ) + vminterface_id = django_filters.ModelMultipleChoiceFilter( + field_name='vminterface', + queryset=VMInterface.objects.all(), + label=_('VM interface (ID)'), + ) + outside_ip_id = django_filters.ModelMultipleChoiceFilter( + field_name='outside_ip', + queryset=IPAddress.objects.all(), + label=_('Outside IP (ID)'), + ) + + class Meta: + model = TunnelTermination + fields = ['id'] + + +class IKEProposalFilterSet(NetBoxModelFilterSet): + authentication_method = django_filters.MultipleChoiceFilter( + choices=AuthenticationMethodChoices + ) + encryption_algorithm = django_filters.MultipleChoiceFilter( + choices=EncryptionAlgorithmChoices + ) + authentication_algorithm = django_filters.MultipleChoiceFilter( + choices=AuthenticationAlgorithmChoices + ) + group = django_filters.MultipleChoiceFilter( + choices=DHGroupChoices + ) + + class Meta: + model = IKEProposal + fields = ['id', 'name', 'sa_lifetime'] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) + ) + + +class IKEPolicyFilterSet(NetBoxModelFilterSet): + version = django_filters.MultipleChoiceFilter( + choices=IKEVersionChoices + ) + mode = django_filters.MultipleChoiceFilter( + choices=IKEModeChoices + ) + proposal_id = MultiValueNumberFilter( + field_name='proposals__id' + ) + proposal = MultiValueCharFilter( + field_name='proposals__name' + ) + + class Meta: + model = IKEPolicy + fields = ['id', 'name', 'preshared_key'] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) + ) + + +class IPSecProposalFilterSet(NetBoxModelFilterSet): + encryption_algorithm = django_filters.MultipleChoiceFilter( + choices=EncryptionAlgorithmChoices + ) + authentication_algorithm = django_filters.MultipleChoiceFilter( + choices=AuthenticationAlgorithmChoices + ) + + class Meta: + model = IPSecProposal + fields = ['id', 'name', 'sa_lifetime_seconds', 'sa_lifetime_data'] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) + ) + + +class IPSecPolicyFilterSet(NetBoxModelFilterSet): + pfs_group = django_filters.MultipleChoiceFilter( + choices=DHGroupChoices + ) + proposal_id = MultiValueNumberFilter( + field_name='proposals__id' + ) + proposal = MultiValueCharFilter( + field_name='proposals__name' + ) + + class Meta: + model = IPSecPolicy + fields = ['id', 'name'] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) + ) + + +class IPSecProfileFilterSet(NetBoxModelFilterSet): + mode = django_filters.MultipleChoiceFilter( + choices=IPSecModeChoices + ) + ike_policy_id = django_filters.ModelMultipleChoiceFilter( + queryset=IKEPolicy.objects.all(), + label=_('IKE policy (ID)'), + ) + ike_policy = django_filters.ModelMultipleChoiceFilter( + field_name='ike_policy__name', + queryset=IKEPolicy.objects.all(), + to_field_name='name', + label=_('IKE policy (name)'), + ) + ipsec_policy_id = django_filters.ModelMultipleChoiceFilter( + queryset=IPSecPolicy.objects.all(), + label=_('IPSec policy (ID)'), + ) + ipsec_policy = django_filters.ModelMultipleChoiceFilter( + field_name='ipsec_policy__name', + queryset=IPSecPolicy.objects.all(), + to_field_name='name', + label=_('IPSec policy (name)'), + ) + + class Meta: + model = IPSecProfile + fields = ['id', 'name'] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) | + Q(comments__icontains=value) + ) diff --git a/netbox/vpn/forms/__init__.py b/netbox/vpn/forms/__init__.py new file mode 100644 index 000000000..1499f98b2 --- /dev/null +++ b/netbox/vpn/forms/__init__.py @@ -0,0 +1,4 @@ +from .bulk_edit import * +from .bulk_import import * +from .filtersets import * +from .model_forms import * diff --git a/netbox/vpn/forms/bulk_edit.py b/netbox/vpn/forms/bulk_edit.py new file mode 100644 index 000000000..a7b097b5c --- /dev/null +++ b/netbox/vpn/forms/bulk_edit.py @@ -0,0 +1,243 @@ +from django import forms +from django.utils.translation import gettext_lazy as _ + +from netbox.forms import NetBoxModelBulkEditForm +from tenancy.models import Tenant +from utilities.forms import add_blank_choice +from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField +from vpn.choices import * +from vpn.models import * + +__all__ = ( + 'IKEPolicyBulkEditForm', + 'IKEProposalBulkEditForm', + 'IPSecPolicyBulkEditForm', + 'IPSecProfileBulkEditForm', + 'IPSecProposalBulkEditForm', + 'TunnelBulkEditForm', + 'TunnelTerminationBulkEditForm', +) + + +class TunnelBulkEditForm(NetBoxModelBulkEditForm): + status = forms.ChoiceField( + label=_('Status'), + choices=add_blank_choice(TunnelStatusChoices), + required=False + ) + encapsulation = forms.ChoiceField( + label=_('Encapsulation'), + choices=add_blank_choice(TunnelEncapsulationChoices), + required=False + ) + ipsec_profile = DynamicModelMultipleChoiceField( + queryset=IPSecProfile.objects.all(), + label=_('IPSec profile'), + required=False + ) + tenant = DynamicModelChoiceField( + label=_('Tenant'), + queryset=Tenant.objects.all(), + required=False + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + tunnel_id = forms.IntegerField( + label=_('Tunnel ID'), + required=False + ) + comments = CommentField() + + model = Tunnel + fieldsets = ( + (_('Tunnel'), ('status', 'encapsulation', 'tunnel_id', 'description')), + (_('Security'), ('ipsec_profile',)), + (_('Tenancy'), ('tenant',)), + ) + nullable_fields = ( + 'ipsec_profile', 'tunnel_id', 'tenant', 'description', 'comments', + ) + + +class TunnelTerminationBulkEditForm(NetBoxModelBulkEditForm): + role = forms.ChoiceField( + label=_('Role'), + choices=add_blank_choice(TunnelTerminationRoleChoices), + required=False + ) + + model = TunnelTermination + + +class IKEProposalBulkEditForm(NetBoxModelBulkEditForm): + authentication_method = forms.ChoiceField( + label=_('Authentication method'), + choices=add_blank_choice(AuthenticationMethodChoices), + required=False + ) + encryption_algorithm = forms.ChoiceField( + label=_('Encryption algorithm'), + choices=add_blank_choice(EncryptionAlgorithmChoices), + required=False + ) + authentication_algorithm = forms.ChoiceField( + label=_('Authentication algorithm'), + choices=add_blank_choice(AuthenticationAlgorithmChoices), + required=False + ) + group = forms.ChoiceField( + label=_('Group'), + choices=add_blank_choice(DHGroupChoices), + required=False + ) + sa_lifetime = forms.IntegerField( + label=_('SA lifetime'), + required=False + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + comments = CommentField() + + model = IKEProposal + fieldsets = ( + (None, ( + 'authentication_method', 'encryption_algorithm', 'authentication_algorithm', 'group', 'sa_lifetime', + 'description', + )), + ) + nullable_fields = ( + 'sa_lifetime', 'description', 'comments', + ) + + +class IKEPolicyBulkEditForm(NetBoxModelBulkEditForm): + version = forms.ChoiceField( + label=_('Version'), + choices=add_blank_choice(IKEVersionChoices), + required=False + ) + mode = forms.ChoiceField( + label=_('Mode'), + choices=add_blank_choice(IKEModeChoices), + required=False + ) + preshared_key = forms.CharField( + label=_('Pre-shared key'), + required=False + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + comments = CommentField() + + model = IKEPolicy + fieldsets = ( + (None, ( + 'version', 'mode', 'preshared_key', 'description', + )), + ) + nullable_fields = ( + 'preshared_key', 'description', 'comments', + ) + + +class IPSecProposalBulkEditForm(NetBoxModelBulkEditForm): + encryption_algorithm = forms.ChoiceField( + label=_('Encryption algorithm'), + choices=add_blank_choice(EncryptionAlgorithmChoices), + required=False + ) + authentication_algorithm = forms.ChoiceField( + label=_('Authentication algorithm'), + choices=add_blank_choice(AuthenticationAlgorithmChoices), + required=False + ) + sa_lifetime_seconds = forms.IntegerField( + label=_('SA lifetime (seconds)'), + required=False + ) + sa_lifetime_data = forms.IntegerField( + label=_('SA lifetime (KB)'), + required=False + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + comments = CommentField() + + model = IPSecProposal + fieldsets = ( + (None, ( + 'encryption_algorithm', 'authentication_algorithm', 'sa_lifetime_seconds', 'sa_lifetime_data', + 'description', + )), + ) + nullable_fields = ( + 'sa_lifetime_seconds', 'sa_lifetime_data', 'description', 'comments', + ) + + +class IPSecPolicyBulkEditForm(NetBoxModelBulkEditForm): + pfs_group = forms.ChoiceField( + label=_('PFS group'), + choices=add_blank_choice(DHGroupChoices), + required=False + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + comments = CommentField() + + model = IPSecPolicy + fieldsets = ( + (None, ('pfs_group', 'description',)), + ) + nullable_fields = ( + 'pfs_group', 'description', 'comments', + ) + + +class IPSecProfileBulkEditForm(NetBoxModelBulkEditForm): + mode = forms.ChoiceField( + label=_('Mode'), + choices=add_blank_choice(IPSecModeChoices), + required=False + ) + ike_policy = DynamicModelChoiceField( + label=_('IKE policy'), + queryset=IKEPolicy.objects.all(), + required=False + ) + ipsec_policy = DynamicModelChoiceField( + label=_('IPSec policy'), + queryset=IPSecPolicy.objects.all(), + required=False + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + comments = CommentField() + + model = IPSecProfile + fieldsets = ( + (_('Profile'), ( + 'mode', 'ike_policy', 'ipsec_policy', 'description', + )), + ) + nullable_fields = ( + 'description', 'comments', + ) diff --git a/netbox/vpn/forms/bulk_import.py b/netbox/vpn/forms/bulk_import.py new file mode 100644 index 000000000..5b42cc761 --- /dev/null +++ b/netbox/vpn/forms/bulk_import.py @@ -0,0 +1,230 @@ +from django.utils.translation import gettext_lazy as _ + +from dcim.models import Device, Interface +from ipam.models import IPAddress +from netbox.forms import NetBoxModelImportForm +from tenancy.models import Tenant +from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, CSVModelMultipleChoiceField +from virtualization.models import VirtualMachine, VMInterface +from vpn.choices import * +from vpn.models import * + +__all__ = ( + 'IKEPolicyImportForm', + 'IKEProposalImportForm', + 'IPSecPolicyImportForm', + 'IPSecProfileImportForm', + 'IPSecProposalImportForm', + 'TunnelImportForm', + 'TunnelTerminationImportForm', +) + + +class TunnelImportForm(NetBoxModelImportForm): + status = CSVChoiceField( + label=_('Status'), + choices=TunnelStatusChoices, + help_text=_('Operational status') + ) + encapsulation = CSVChoiceField( + label=_('Encapsulation'), + choices=TunnelEncapsulationChoices, + help_text=_('Tunnel encapsulation') + ) + ipsec_profile = CSVModelChoiceField( + label=_('IPSec profile'), + queryset=IPSecProfile.objects.all(), + required=False, + to_field_name='name' + ) + tenant = CSVModelChoiceField( + label=_('Tenant'), + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text=_('Assigned tenant') + ) + + class Meta: + model = Tunnel + fields = ( + 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tunnel_id', 'description', 'comments', + 'tags', + ) + + +class TunnelTerminationImportForm(NetBoxModelImportForm): + tunnel = CSVModelChoiceField( + label=_('Tunnel'), + queryset=Tunnel.objects.all(), + to_field_name='name' + ) + role = CSVChoiceField( + label=_('Role'), + choices=TunnelTerminationRoleChoices, + help_text=_('Operational role') + ) + device = CSVModelChoiceField( + label=_('Device'), + queryset=Device.objects.all(), + required=False, + to_field_name='name', + help_text=_('Parent device of assigned interface') + ) + virtual_machine = CSVModelChoiceField( + label=_('Virtual machine'), + queryset=VirtualMachine.objects.all(), + required=False, + to_field_name='name', + help_text=_('Parent VM of assigned interface') + ) + termination = CSVModelChoiceField( + label=_('Termination'), + queryset=Interface.objects.none(), # Can also refer to VMInterface + required=False, + to_field_name='name', + help_text=_('Device or virtual machine interface') + ) + outside_ip = CSVModelChoiceField( + label=_('Outside IP'), + queryset=IPAddress.objects.all(), + required=False, + to_field_name='name' + ) + + class Meta: + model = TunnelTermination + fields = ( + 'tunnel', 'role', 'outside_ip', 'tags', + ) + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + + # Limit termination queryset by assigned device/VM + if data.get('device'): + self.fields['termination'].queryset = Interface.objects.filter( + **{f"device__{self.fields['device'].to_field_name}": data['device']} + ) + elif data.get('virtual_machine'): + self.fields['termination'].queryset = VMInterface.objects.filter( + **{f"virtual_machine__{self.fields['virtual_machine'].to_field_name}": data['virtual_machine']} + ) + + def save(self, *args, **kwargs): + + # Assign termination object + if self.cleaned_data.get('termination'): + self.instance.termination = self.cleaned_data['termination'] + + return super().save(*args, **kwargs) + + +class IKEProposalImportForm(NetBoxModelImportForm): + authentication_method = CSVChoiceField( + label=_('Authentication method'), + choices=AuthenticationMethodChoices + ) + encryption_algorithm = CSVChoiceField( + label=_('Encryption algorithm'), + choices=EncryptionAlgorithmChoices + ) + authentication_algorithm = CSVChoiceField( + label=_('Authentication algorithm'), + choices=AuthenticationAlgorithmChoices + ) + group = CSVChoiceField( + label=_('Group'), + choices=DHGroupChoices + ) + + class Meta: + model = IKEProposal + fields = ( + 'name', 'description', 'authentication_method', 'encryption_algorithm', 'authentication_algorithm', + 'group', 'sa_lifetime', 'tags', + ) + + +class IKEPolicyImportForm(NetBoxModelImportForm): + version = CSVChoiceField( + label=_('Version'), + choices=IKEVersionChoices + ) + mode = CSVChoiceField( + label=_('Mode'), + choices=IKEModeChoices + ) + proposals = CSVModelMultipleChoiceField( + queryset=IKEProposal.objects.all(), + to_field_name='name', + help_text=_('IKE proposal(s)'), + ) + + class Meta: + model = IKEPolicy + fields = ( + 'name', 'description', 'version', 'mode', 'proposals', 'preshared_key', 'tags', + ) + + +class IPSecProposalImportForm(NetBoxModelImportForm): + encryption_algorithm = CSVChoiceField( + label=_('Encryption algorithm'), + choices=EncryptionAlgorithmChoices + ) + authentication_algorithm = CSVChoiceField( + label=_('Authentication algorithm'), + choices=AuthenticationAlgorithmChoices + ) + + class Meta: + model = IPSecProposal + fields = ( + 'name', 'description', 'encryption_algorithm', 'authentication_algorithm', 'sa_lifetime_seconds', + 'sa_lifetime_data', 'tags', + ) + + +class IPSecPolicyImportForm(NetBoxModelImportForm): + pfs_group = CSVChoiceField( + label=_('Diffie-Hellman group for Perfect Forward Secrecy'), + choices=DHGroupChoices + ) + proposals = CSVModelMultipleChoiceField( + queryset=IPSecProposal.objects.all(), + to_field_name='name', + help_text=_('IPSec proposal(s)'), + ) + + class Meta: + model = IPSecPolicy + fields = ( + 'name', 'description', 'proposals', 'pfs_group', 'tags', + ) + + +class IPSecProfileImportForm(NetBoxModelImportForm): + mode = CSVChoiceField( + label=_('Mode'), + choices=IPSecModeChoices, + help_text=_('IPSec protocol') + ) + ike_policy = CSVModelChoiceField( + label=_('IKE policy'), + queryset=IKEPolicy.objects.all(), + to_field_name='name' + ) + ipsec_policy = CSVModelChoiceField( + label=_('IPSec policy'), + queryset=IPSecPolicy.objects.all(), + to_field_name='name' + ) + + class Meta: + model = IPSecProfile + fields = ( + 'name', 'mode', 'ike_policy', 'ipsec_policy', 'description', 'comments', 'tags', + ) diff --git a/netbox/vpn/forms/filtersets.py b/netbox/vpn/forms/filtersets.py new file mode 100644 index 000000000..ec146919a --- /dev/null +++ b/netbox/vpn/forms/filtersets.py @@ -0,0 +1,182 @@ +from django import forms +from django.utils.translation import gettext as _ + +from netbox.forms import NetBoxModelFilterSetForm +from tenancy.forms import TenancyFilterForm +from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterField +from vpn.choices import * +from vpn.models import * + +__all__ = ( + 'IKEPolicyFilterForm', + 'IKEProposalFilterForm', + 'IPSecPolicyFilterForm', + 'IPSecProfileFilterForm', + 'IPSecProposalFilterForm', + 'TunnelFilterForm', + 'TunnelTerminationFilterForm', +) + + +class TunnelFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): + model = Tunnel + fieldsets = ( + (None, ('q', 'filter_id', 'tag')), + (_('Tunnel'), ('status', 'encapsulation', 'tunnel_id')), + (_('Security'), ('ipsec_profile_id',)), + (_('Tenancy'), ('tenant_group_id', 'tenant_id')), + ) + status = forms.MultipleChoiceField( + label=_('Status'), + choices=TunnelStatusChoices, + required=False + ) + encapsulation = forms.MultipleChoiceField( + label=_('Encapsulation'), + choices=TunnelEncapsulationChoices, + required=False + ) + ipsec_profile_id = DynamicModelMultipleChoiceField( + queryset=IPSecProfile.objects.all(), + required=False, + label=_('IPSec profile') + ) + tunnel_id = forms.IntegerField( + required=False, + label=_('Tunnel ID') + ) + tag = TagFilterField(model) + + +class TunnelTerminationFilterForm(NetBoxModelFilterSetForm): + model = TunnelTermination + fieldsets = ( + (None, ('q', 'filter_id', 'tag')), + (_('Termination'), ('tunnel_id', 'role')), + ) + tunnel_id = DynamicModelMultipleChoiceField( + queryset=Tunnel.objects.all(), + required=False, + label=_('Tunnel') + ) + role = forms.MultipleChoiceField( + label=_('Role'), + choices=TunnelTerminationRoleChoices, + required=False + ) + tag = TagFilterField(model) + + +class IKEProposalFilterForm(NetBoxModelFilterSetForm): + model = IKEProposal + fieldsets = ( + (None, ('q', 'filter_id', 'tag')), + (_('Parameters'), ('authentication_method', 'encryption_algorithm', 'authentication_algorithm', 'group')), + ) + authentication_method = forms.MultipleChoiceField( + label=_('Authentication method'), + choices=AuthenticationMethodChoices, + required=False + ) + encryption_algorithm = forms.MultipleChoiceField( + label=_('Encryption algorithm'), + choices=EncryptionAlgorithmChoices, + required=False + ) + authentication_algorithm = forms.MultipleChoiceField( + label=_('Authentication algorithm'), + choices=AuthenticationAlgorithmChoices, + required=False + ) + group = forms.MultipleChoiceField( + label=_('Group'), + choices=DHGroupChoices, + required=False + ) + tag = TagFilterField(model) + + +class IKEPolicyFilterForm(NetBoxModelFilterSetForm): + model = IKEPolicy + fieldsets = ( + (None, ('q', 'filter_id', 'tag')), + (_('Parameters'), ('version', 'mode', 'proposal_id')), + ) + version = forms.MultipleChoiceField( + label=_('IKE version'), + choices=IKEVersionChoices, + required=False + ) + mode = forms.MultipleChoiceField( + label=_('Mode'), + choices=IKEModeChoices, + required=False + ) + proposal_id = DynamicModelMultipleChoiceField( + queryset=IKEProposal.objects.all(), + required=False, + label=_('Proposal') + ) + tag = TagFilterField(model) + + +class IPSecProposalFilterForm(NetBoxModelFilterSetForm): + model = IPSecProposal + fieldsets = ( + (None, ('q', 'filter_id', 'tag')), + (_('Parameters'), ('encryption_algorithm', 'authentication_algorithm')), + ) + encryption_algorithm = forms.MultipleChoiceField( + label=_('Encryption algorithm'), + choices=EncryptionAlgorithmChoices, + required=False + ) + authentication_algorithm = forms.MultipleChoiceField( + label=_('Authentication algorithm'), + choices=AuthenticationAlgorithmChoices, + required=False + ) + tag = TagFilterField(model) + + +class IPSecPolicyFilterForm(NetBoxModelFilterSetForm): + model = IPSecPolicy + fieldsets = ( + (None, ('q', 'filter_id', 'tag')), + (_('Parameters'), ('proposal_id', 'pfs_group')), + ) + proposal_id = DynamicModelMultipleChoiceField( + queryset=IKEProposal.objects.all(), + required=False, + label=_('Proposal') + ) + pfs_group = forms.MultipleChoiceField( + label=_('Mode'), + choices=DHGroupChoices, + required=False + ) + tag = TagFilterField(model) + + +class IPSecProfileFilterForm(NetBoxModelFilterSetForm): + model = IPSecProfile + fieldsets = ( + (None, ('q', 'filter_id', 'tag')), + (_('Profile'), ('mode', 'ike_policy_id', 'ipsec_policy_id')), + ) + mode = forms.MultipleChoiceField( + label=_('Mode'), + choices=IPSecModeChoices, + required=False + ) + ike_policy_id = DynamicModelMultipleChoiceField( + queryset=IKEPolicy.objects.all(), + required=False, + label=_('IKE policy') + ) + ipsec_policy_id = DynamicModelMultipleChoiceField( + queryset=IPSecPolicy.objects.all(), + required=False, + label=_('IPSec policy') + ) + tag = TagFilterField(model) diff --git a/netbox/vpn/forms/model_forms.py b/netbox/vpn/forms/model_forms.py new file mode 100644 index 000000000..35fa2cad3 --- /dev/null +++ b/netbox/vpn/forms/model_forms.py @@ -0,0 +1,357 @@ +from django import forms +from django.utils.translation import gettext_lazy as _ + +from dcim.models import Device, Interface +from ipam.models import IPAddress +from netbox.forms import NetBoxModelForm +from tenancy.forms import TenancyForm +from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField +from utilities.forms.utils import add_blank_choice +from utilities.forms.widgets import HTMXSelect +from virtualization.models import VirtualMachine, VMInterface +from vpn.choices import * +from vpn.models import * + +__all__ = ( + 'IKEPolicyForm', + 'IKEProposalForm', + 'IPSecPolicyForm', + 'IPSecProfileForm', + 'IPSecProposalForm', + 'TunnelCreateForm', + 'TunnelForm', + 'TunnelTerminationForm', +) + + +class TunnelForm(TenancyForm, NetBoxModelForm): + ipsec_profile = DynamicModelChoiceField( + queryset=IPSecProfile.objects.all(), + label=_('IPSec Profile'), + required=False + ) + comments = CommentField() + + fieldsets = ( + (_('Tunnel'), ('name', 'status', 'encapsulation', 'description', 'tunnel_id', 'tags')), + (_('Security'), ('ipsec_profile',)), + (_('Tenancy'), ('tenant_group', 'tenant')), + ) + + class Meta: + model = Tunnel + fields = [ + 'name', 'status', 'encapsulation', 'description', 'tunnel_id', 'ipsec_profile', 'tenant_group', 'tenant', + 'comments', 'tags', + ] + + +class TunnelCreateForm(TunnelForm): + # First termination + termination1_role = forms.ChoiceField( + choices=add_blank_choice(TunnelTerminationRoleChoices), + required=False, + label=_('Role') + ) + termination1_type = forms.ChoiceField( + choices=TunnelTerminationTypeChoices, + required=False, + widget=HTMXSelect(), + label=_('Type') + ) + termination1_parent = DynamicModelChoiceField( + queryset=Device.objects.all(), + required=False, + selector=True, + label=_('Device') + ) + termination1_termination = DynamicModelChoiceField( + queryset=Interface.objects.all(), + required=False, + label=_('Interface'), + query_params={ + 'device_id': '$termination1_parent', + } + ) + termination1_outside_ip = DynamicModelChoiceField( + queryset=IPAddress.objects.all(), + label=_('Outside IP'), + required=False, + query_params={ + 'device_id': '$termination1_parent', + } + ) + + # Second termination + termination2_role = forms.ChoiceField( + choices=add_blank_choice(TunnelTerminationRoleChoices), + required=False, + label=_('Role') + ) + termination2_type = forms.ChoiceField( + choices=TunnelTerminationTypeChoices, + required=False, + widget=HTMXSelect(), + label=_('Type') + ) + termination2_parent = DynamicModelChoiceField( + queryset=Device.objects.all(), + required=False, + selector=True, + label=_('Device') + ) + termination2_termination = DynamicModelChoiceField( + queryset=Interface.objects.all(), + required=False, + label=_('Interface'), + query_params={ + 'device_id': '$termination2_parent', + } + ) + termination2_outside_ip = DynamicModelChoiceField( + queryset=IPAddress.objects.all(), + required=False, + label=_('Outside IP'), + query_params={ + 'device_id': '$termination2_parent', + } + ) + + fieldsets = ( + (_('Tunnel'), ('name', 'status', 'encapsulation', 'description', 'tunnel_id', 'tags')), + (_('Security'), ('ipsec_profile',)), + (_('Tenancy'), ('tenant_group', 'tenant')), + (_('First Termination'), ( + 'termination1_role', 'termination1_type', 'termination1_parent', 'termination1_termination', + 'termination1_outside_ip', + )), + (_('Second Termination'), ( + 'termination2_role', 'termination2_type', 'termination2_parent', 'termination2_termination', + 'termination2_outside_ip', + )), + ) + + def __init__(self, *args, initial=None, **kwargs): + super().__init__(*args, initial=initial, **kwargs) + + if initial and initial.get('termination1_type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE: + self.fields['termination1_parent'].label = _('Virtual Machine') + self.fields['termination1_parent'].queryset = VirtualMachine.objects.all() + self.fields['termination1_termination'].queryset = VMInterface.objects.all() + self.fields['termination1_termination'].widget.add_query_params({ + 'virtual_machine_id': '$termination1_parent', + }) + self.fields['termination1_outside_ip'].widget.add_query_params({ + 'virtual_machine_id': '$termination1_parent', + }) + + if initial and initial.get('termination2_type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE: + self.fields['termination2_parent'].label = _('Virtual Machine') + self.fields['termination2_parent'].queryset = VirtualMachine.objects.all() + self.fields['termination2_termination'].queryset = VMInterface.objects.all() + self.fields['termination2_termination'].widget.add_query_params({ + 'virtual_machine_id': '$termination2_parent', + }) + self.fields['termination2_outside_ip'].widget.add_query_params({ + 'virtual_machine_id': '$termination2_parent', + }) + + def clean(self): + super().clean() + + # Validate attributes for each termination (if any) + for term in ('termination1', 'termination2'): + required_parameters = ( + f'{term}_role', f'{term}_parent', f'{term}_termination', + ) + parameters = ( + *required_parameters, + f'{term}_outside_ip', + ) + if any([self.cleaned_data[param] for param in parameters]): + for param in required_parameters: + if not self.cleaned_data[param]: + raise forms.ValidationError({ + param: _("This parameter is required when defining a termination.") + }) + + def save(self, *args, **kwargs): + instance = super().save(*args, **kwargs) + + # Create first termination + if self.cleaned_data['termination1_termination']: + TunnelTermination.objects.create( + tunnel=instance, + role=self.cleaned_data['termination1_role'], + termination=self.cleaned_data['termination1_termination'], + outside_ip=self.cleaned_data['termination1_outside_ip'], + ) + + # Create second termination, if defined + if self.cleaned_data['termination2_termination']: + TunnelTermination.objects.create( + tunnel=instance, + role=self.cleaned_data['termination2_role'], + termination=self.cleaned_data['termination2_termination'], + outside_ip=self.cleaned_data.get('termination1_outside_ip'), + ) + + return instance + + +class TunnelTerminationForm(NetBoxModelForm): + tunnel = DynamicModelChoiceField( + queryset=Tunnel.objects.all() + ) + type = forms.ChoiceField( + choices=TunnelTerminationTypeChoices, + widget=HTMXSelect(), + label=_('Type') + ) + parent = DynamicModelChoiceField( + queryset=Device.objects.all(), + selector=True, + label=_('Device') + ) + termination = DynamicModelChoiceField( + queryset=Interface.objects.all(), + label=_('Interface'), + query_params={ + 'device_id': '$parent', + } + ) + outside_ip = DynamicModelChoiceField( + queryset=IPAddress.objects.all(), + label=_('Outside IP'), + required=False, + query_params={ + 'device_id': '$parent', + } + ) + + fieldsets = ( + (None, ('tunnel', 'role', 'type', 'parent', 'termination', 'outside_ip', 'tags')), + ) + + class Meta: + model = TunnelTermination + fields = [ + 'tunnel', 'role', 'termination', 'outside_ip', 'tags', + ] + + def __init__(self, *args, initial=None, **kwargs): + super().__init__(*args, initial=initial, **kwargs) + + if initial and initial.get('type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE: + self.fields['parent'].label = _('Virtual Machine') + self.fields['parent'].queryset = VirtualMachine.objects.all() + self.fields['termination'].queryset = VMInterface.objects.all() + self.fields['termination'].widget.add_query_params({ + 'virtual_machine_id': '$parent', + }) + self.fields['outside_ip'].widget.add_query_params({ + 'virtual_machine_id': '$parent', + }) + + if self.instance.pk: + self.fields['parent'].initial = self.instance.termination.parent_object + self.fields['termination'].initial = self.instance.termination + + def clean(self): + super().clean() + + # Set the terminated object + self.instance.termination = self.cleaned_data.get('termination') + + +class IKEProposalForm(NetBoxModelForm): + + fieldsets = ( + (_('Proposal'), ('name', 'description', 'tags')), + (_('Parameters'), ( + 'authentication_method', 'encryption_algorithm', 'authentication_algorithm', 'group', 'sa_lifetime', + )), + ) + + class Meta: + model = IKEProposal + fields = [ + 'name', 'description', 'authentication_method', 'encryption_algorithm', 'authentication_algorithm', 'group', + 'sa_lifetime', 'tags', + ] + + +class IKEPolicyForm(NetBoxModelForm): + proposals = DynamicModelMultipleChoiceField( + queryset=IKEProposal.objects.all(), + label=_('Proposals') + ) + + fieldsets = ( + (_('Policy'), ('name', 'description', 'tags')), + (_('Parameters'), ('version', 'mode', 'proposals', 'preshared_key')), + ) + + class Meta: + model = IKEPolicy + fields = [ + 'name', 'description', 'version', 'mode', 'proposals', 'preshared_key', 'tags', + ] + + +class IPSecProposalForm(NetBoxModelForm): + + fieldsets = ( + (_('Proposal'), ('name', 'description', 'tags')), + (_('Parameters'), ( + 'encryption_algorithm', 'authentication_algorithm', 'sa_lifetime_seconds', 'sa_lifetime_data', + )), + ) + + class Meta: + model = IPSecProposal + fields = [ + 'name', 'description', 'encryption_algorithm', 'authentication_algorithm', 'sa_lifetime_seconds', + 'sa_lifetime_data', 'tags', + ] + + +class IPSecPolicyForm(NetBoxModelForm): + proposals = DynamicModelMultipleChoiceField( + queryset=IPSecProposal.objects.all(), + label=_('Proposals') + ) + + fieldsets = ( + (_('Policy'), ('name', 'description', 'tags')), + (_('Parameters'), ('proposals', 'pfs_group')), + ) + + class Meta: + model = IPSecPolicy + fields = [ + 'name', 'description', 'proposals', 'pfs_group', 'tags', + ] + + +class IPSecProfileForm(NetBoxModelForm): + ike_policy = DynamicModelChoiceField( + queryset=IKEPolicy.objects.all(), + label=_('IKE policy') + ) + ipsec_policy = DynamicModelChoiceField( + queryset=IPSecPolicy.objects.all(), + label=_('IPSec policy') + ) + comments = CommentField() + + fieldsets = ( + (_('Profile'), ('name', 'description', 'tags')), + (_('Parameters'), ('mode', 'ike_policy', 'ipsec_policy')), + ) + + class Meta: + model = IPSecProfile + fields = [ + 'name', 'description', 'mode', 'ike_policy', 'ipsec_policy', 'description', 'comments', 'tags', + ] diff --git a/netbox/vpn/graphql/__init__.py b/netbox/vpn/graphql/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/netbox/vpn/graphql/schema.py b/netbox/vpn/graphql/schema.py new file mode 100644 index 000000000..64e680882 --- /dev/null +++ b/netbox/vpn/graphql/schema.py @@ -0,0 +1,51 @@ +import graphene + +from netbox.graphql.fields import ObjectField, ObjectListField +from utilities.graphql_optimizer import gql_query_optimizer +from vpn import models +from .types import * + + +class VPNQuery(graphene.ObjectType): + + ike_policy = ObjectField(IKEPolicyType) + ike_policy_list = ObjectListField(IKEPolicyType) + + def resolve_ike_policy_list(root, info, **kwargs): + return gql_query_optimizer(models.IKEPolicy.objects.all(), info) + + ike_proposal = ObjectField(IKEProposalType) + ike_proposal_list = ObjectListField(IKEProposalType) + + def resolve_ike_proposal_list(root, info, **kwargs): + return gql_query_optimizer(models.IKEProposal.objects.all(), info) + + ipsec_policy = ObjectField(IPSecPolicyType) + ipsec_policy_list = ObjectListField(IPSecPolicyType) + + def resolve_ipsec_policy_list(root, info, **kwargs): + return gql_query_optimizer(models.IPSecPolicy.objects.all(), info) + + ipsec_profile = ObjectField(IPSecProfileType) + ipsec_profile_list = ObjectListField(IPSecProfileType) + + def resolve_ipsec_profile_list(root, info, **kwargs): + return gql_query_optimizer(models.IPSecProfile.objects.all(), info) + + ipsec_proposal = ObjectField(IPSecProposalType) + ipsec_proposal_list = ObjectListField(IPSecProposalType) + + def resolve_ipsec_proposal_list(root, info, **kwargs): + return gql_query_optimizer(models.IPSecProposal.objects.all(), info) + + tunnel = ObjectField(TunnelType) + tunnel_list = ObjectListField(TunnelType) + + def resolve_tunnel_list(root, info, **kwargs): + return gql_query_optimizer(models.Tunnel.objects.all(), info) + + tunnel_termination = ObjectField(TunnelTerminationType) + tunnel_termination_list = ObjectListField(TunnelTerminationType) + + def resolve_tunnel_termination_list(root, info, **kwargs): + return gql_query_optimizer(models.TunnelTermination.objects.all(), info) diff --git a/netbox/vpn/graphql/types.py b/netbox/vpn/graphql/types.py new file mode 100644 index 000000000..f46e8b697 --- /dev/null +++ b/netbox/vpn/graphql/types.py @@ -0,0 +1,69 @@ +from extras.graphql.mixins import CustomFieldsMixin, TagsMixin +from netbox.graphql.types import ObjectType, OrganizationalObjectType, NetBoxObjectType +from vpn import filtersets, models + +__all__ = ( + 'IKEPolicyType', + 'IKEProposalType', + 'IPSecPolicyType', + 'IPSecProfileType', + 'IPSecProposalType', + 'TunnelTerminationType', + 'TunnelType', +) + + +class TunnelTerminationType(CustomFieldsMixin, TagsMixin, ObjectType): + + class Meta: + model = models.TunnelTermination + fields = '__all__' + filterset_class = filtersets.TunnelTerminationFilterSet + + +class TunnelType(NetBoxObjectType): + + class Meta: + model = models.Tunnel + fields = '__all__' + filterset_class = filtersets.TunnelFilterSet + + +class IKEProposalType(OrganizationalObjectType): + + class Meta: + model = models.IKEProposal + fields = '__all__' + filterset_class = filtersets.IKEProposalFilterSet + + +class IKEPolicyType(OrganizationalObjectType): + + class Meta: + model = models.IKEPolicy + fields = '__all__' + filterset_class = filtersets.IKEPolicyFilterSet + + +class IPSecProposalType(OrganizationalObjectType): + + class Meta: + model = models.IPSecProposal + fields = '__all__' + filterset_class = filtersets.IPSecProposalFilterSet + + +class IPSecPolicyType(OrganizationalObjectType): + + class Meta: + model = models.IPSecPolicy + fields = '__all__' + filterset_class = filtersets.IPSecPolicyFilterSet + + +class IPSecProfileType(OrganizationalObjectType): + + class Meta: + model = models.IPSecProfile + fields = '__all__' + filterset_class = filtersets.IPSecProfileFilterSet diff --git a/netbox/vpn/migrations/0001_initial.py b/netbox/vpn/migrations/0001_initial.py new file mode 100644 index 000000000..f5d9ae0c1 --- /dev/null +++ b/netbox/vpn/migrations/0001_initial.py @@ -0,0 +1,186 @@ +from django.db import migrations, models +import django.db.models.deletion +import taggit.managers +import utilities.json + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('extras', '0099_cachedvalue_ordering'), + ('ipam', '0067_ipaddress_index_host'), + ('tenancy', '0012_contactassignment_custom_fields'), + ] + + operations = [ + migrations.CreateModel( + name='IKEPolicy', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('name', models.CharField(max_length=100, unique=True)), + ('description', models.CharField(blank=True, max_length=200)), + ('version', models.PositiveSmallIntegerField(default=2)), + ('mode', models.CharField()), + ('preshared_key', models.TextField(blank=True)), + ], + options={ + 'verbose_name': 'IKE policy', + 'verbose_name_plural': 'IKE policies', + 'ordering': ('name',), + }, + ), + migrations.CreateModel( + name='IPSecPolicy', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('name', models.CharField(max_length=100, unique=True)), + ('description', models.CharField(blank=True, max_length=200)), + ('pfs_group', models.PositiveSmallIntegerField(blank=True, null=True)), + ], + options={ + 'verbose_name': 'IPSec policy', + 'verbose_name_plural': 'IPSec policies', + 'ordering': ('name',), + }, + ), + migrations.CreateModel( + name='IPSecProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), + ('mode', models.CharField()), + ('ike_policy', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ipsec_profiles', to='vpn.ikepolicy')), + ('ipsec_policy', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ipsec_profiles', to='vpn.ipsecpolicy')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'IPSec profile', + 'verbose_name_plural': 'IPSec profiles', + 'ordering': ('name',), + }, + ), + migrations.CreateModel( + name='Tunnel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), + ('status', models.CharField(default='active', max_length=50)), + ('encapsulation', models.CharField(max_length=50)), + ('tunnel_id', models.PositiveBigIntegerField(blank=True, null=True)), + ('ipsec_profile', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnels', to='vpn.ipsecprofile')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ('tenant', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnels', to='tenancy.tenant')), + ], + options={ + 'verbose_name': 'tunnel', + 'verbose_name_plural': 'tunnels', + 'ordering': ('name',), + }, + ), + migrations.CreateModel( + name='TunnelTermination', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('role', models.CharField(default='peer', max_length=50)), + ('termination_id', models.PositiveBigIntegerField(blank=True, null=True)), + ('termination_type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype')), + ('outside_ip', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnel_termination', to='ipam.ipaddress')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ('tunnel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='terminations', to='vpn.tunnel')), + ], + options={ + 'verbose_name': 'tunnel termination', + 'verbose_name_plural': 'tunnel terminations', + 'ordering': ('tunnel', 'role', 'pk'), + }, + ), + migrations.CreateModel( + name='IPSecProposal', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('name', models.CharField(max_length=100, unique=True)), + ('description', models.CharField(blank=True, max_length=200)), + ('encryption_algorithm', models.CharField()), + ('authentication_algorithm', models.CharField()), + ('sa_lifetime_seconds', models.PositiveIntegerField(blank=True, null=True)), + ('sa_lifetime_data', models.PositiveIntegerField(blank=True, null=True)), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'IPSec proposal', + 'verbose_name_plural': 'IPSec proposals', + 'ordering': ('name',), + }, + ), + migrations.AddField( + model_name='ipsecpolicy', + name='proposals', + field=models.ManyToManyField(related_name='ipsec_policies', to='vpn.ipsecproposal'), + ), + migrations.AddField( + model_name='ipsecpolicy', + name='tags', + field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'), + ), + migrations.CreateModel( + name='IKEProposal', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('name', models.CharField(max_length=100, unique=True)), + ('description', models.CharField(blank=True, max_length=200)), + ('authentication_method', models.CharField()), + ('encryption_algorithm', models.CharField()), + ('authentication_algorithm', models.CharField()), + ('group', models.PositiveSmallIntegerField()), + ('sa_lifetime', models.PositiveIntegerField(blank=True, null=True)), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'IKE proposal', + 'verbose_name_plural': 'IKE proposals', + 'ordering': ('name',), + }, + ), + migrations.AddField( + model_name='ikepolicy', + name='proposals', + field=models.ManyToManyField(related_name='ike_policies', to='vpn.ikeproposal'), + ), + migrations.AddField( + model_name='ikepolicy', + name='tags', + field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'), + ), + migrations.AddConstraint( + model_name='tunneltermination', + constraint=models.UniqueConstraint(fields=('termination_type', 'termination_id'), name='vpn_tunneltermination_termination', violation_error_message='An object may be terminated to only one tunnel at a time.'), + ), + ] diff --git a/netbox/vpn/migrations/__init__.py b/netbox/vpn/migrations/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/netbox/vpn/models/__init__.py b/netbox/vpn/models/__init__.py new file mode 100644 index 000000000..3b70eb418 --- /dev/null +++ b/netbox/vpn/models/__init__.py @@ -0,0 +1,2 @@ +from .crypto import * +from .tunnels import * diff --git a/netbox/vpn/models/crypto.py b/netbox/vpn/models/crypto.py new file mode 100644 index 000000000..1954dc6a0 --- /dev/null +++ b/netbox/vpn/models/crypto.py @@ -0,0 +1,254 @@ +from django.db import models +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ + +from netbox.models import NetBoxModel, PrimaryModel +from vpn.choices import * + +__all__ = ( + 'IKEPolicy', + 'IKEProposal', + 'IPSecPolicy', + 'IPSecProfile', + 'IPSecProposal', +) + + +# +# IKE +# + +class IKEProposal(NetBoxModel): + name = models.CharField( + verbose_name=_('name'), + max_length=100, + unique=True + ) + description = models.CharField( + verbose_name=_('description'), + max_length=200, + blank=True + ) + authentication_method = models.CharField( + verbose_name=('authentication method'), + choices=AuthenticationMethodChoices + ) + encryption_algorithm = models.CharField( + verbose_name=_('encryption algorithm'), + choices=EncryptionAlgorithmChoices + ) + authentication_algorithm = models.CharField( + verbose_name=_('authentication algorithm'), + choices=AuthenticationAlgorithmChoices + ) + group = models.PositiveSmallIntegerField( + verbose_name=_('group'), + choices=DHGroupChoices, + help_text=_('Diffie-Hellman group ID') + ) + sa_lifetime = models.PositiveIntegerField( + verbose_name=_('SA lifetime'), + blank=True, + null=True, + help_text=_('Security association lifetime (in seconds)') + ) + + clone_fields = ( + 'authentication_method', 'encryption_algorithm', 'authentication_algorithm', 'group', 'sa_lifetime', + ) + + class Meta: + ordering = ('name',) + verbose_name = _('IKE proposal') + verbose_name_plural = _('IKE proposals') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('vpn:ikeproposal', args=[self.pk]) + + +class IKEPolicy(NetBoxModel): + name = models.CharField( + verbose_name=_('name'), + max_length=100, + unique=True + ) + description = models.CharField( + verbose_name=_('description'), + max_length=200, + blank=True + ) + version = models.PositiveSmallIntegerField( + verbose_name=_('version'), + choices=IKEVersionChoices, + default=IKEVersionChoices.VERSION_2 + ) + mode = models.CharField( + verbose_name=_('mode'), + choices=IKEModeChoices + ) + proposals = models.ManyToManyField( + to='vpn.IKEProposal', + related_name='ike_policies', + verbose_name=_('proposals') + ) + preshared_key = models.TextField( + verbose_name=_('pre-shared key'), + blank=True + ) + + clone_fields = ( + 'version', 'mode', 'proposals', + ) + prerequisite_models = ( + 'vpn.IKEProposal', + ) + + class Meta: + ordering = ('name',) + verbose_name = _('IKE policy') + verbose_name_plural = _('IKE policies') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('vpn:ikepolicy', args=[self.pk]) + + +# +# IPSec +# + +class IPSecProposal(NetBoxModel): + name = models.CharField( + verbose_name=_('name'), + max_length=100, + unique=True + ) + description = models.CharField( + verbose_name=_('description'), + max_length=200, + blank=True + ) + encryption_algorithm = models.CharField( + verbose_name=_('encryption'), + choices=EncryptionAlgorithmChoices + ) + authentication_algorithm = models.CharField( + verbose_name=_('authentication'), + choices=AuthenticationAlgorithmChoices + ) + sa_lifetime_seconds = models.PositiveIntegerField( + verbose_name=_('SA lifetime (seconds)'), + blank=True, + null=True, + help_text=_('Security association lifetime (seconds)') + ) + sa_lifetime_data = models.PositiveIntegerField( + verbose_name=_('SA lifetime (KB)'), + blank=True, + null=True, + help_text=_('Security association lifetime (in kilobytes)') + ) + + clone_fields = ( + 'encryption_algorithm', 'authentication_algorithm', 'sa_lifetime_seconds', 'sa_lifetime_data', + ) + + class Meta: + ordering = ('name',) + verbose_name = _('IPSec proposal') + verbose_name_plural = _('IPSec proposals') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('vpn:ipsecproposal', args=[self.pk]) + + +class IPSecPolicy(NetBoxModel): + name = models.CharField( + verbose_name=_('name'), + max_length=100, + unique=True + ) + description = models.CharField( + verbose_name=_('description'), + max_length=200, + blank=True + ) + proposals = models.ManyToManyField( + to='vpn.IPSecProposal', + related_name='ipsec_policies', + verbose_name=_('proposals') + ) + pfs_group = models.PositiveSmallIntegerField( + verbose_name=_('PFS group'), + choices=DHGroupChoices, + blank=True, + null=True, + help_text=_('Diffie-Hellman group for Perfect Forward Secrecy') + ) + + clone_fields = ( + 'proposals', 'pfs_group', + ) + prerequisite_models = ( + 'vpn.IPSecProposal', + ) + + class Meta: + ordering = ('name',) + verbose_name = _('IPSec policy') + verbose_name_plural = _('IPSec policies') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('vpn:ipsecpolicy', args=[self.pk]) + + +class IPSecProfile(PrimaryModel): + name = models.CharField( + verbose_name=_('name'), + max_length=100, + unique=True + ) + mode = models.CharField( + verbose_name=_('mode'), + choices=IPSecModeChoices + ) + ike_policy = models.ForeignKey( + to='vpn.IKEPolicy', + on_delete=models.PROTECT, + related_name='ipsec_profiles' + ) + ipsec_policy = models.ForeignKey( + to='vpn.IPSecPolicy', + on_delete=models.PROTECT, + related_name='ipsec_profiles' + ) + + clone_fields = ( + 'mode', 'ike_policy', 'ipsec_policy', + ) + prerequisite_models = ( + 'vpn.IKEPolicy', + 'vpn.IPSecPolicy', + ) + + class Meta: + ordering = ('name',) + verbose_name = _('IPSec profile') + verbose_name_plural = _('IPSec profiles') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('vpn:ipsecprofile', args=[self.pk]) diff --git a/netbox/vpn/models/tunnels.py b/netbox/vpn/models/tunnels.py new file mode 100644 index 000000000..f7390d0b4 --- /dev/null +++ b/netbox/vpn/models/tunnels.py @@ -0,0 +1,146 @@ +from django.contrib.contenttypes.fields import GenericForeignKey +from django.core.exceptions import ValidationError +from django.db import models +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ + +from netbox.models import ChangeLoggedModel, PrimaryModel +from netbox.models.features import CustomFieldsMixin, CustomLinksMixin, TagsMixin +from vpn.choices import * + +__all__ = ( + 'Tunnel', + 'TunnelTermination', +) + + +class Tunnel(PrimaryModel): + name = models.CharField( + verbose_name=_('name'), + max_length=100, + unique=True + ) + status = models.CharField( + verbose_name=_('status'), + max_length=50, + choices=TunnelStatusChoices, + default=TunnelStatusChoices.STATUS_ACTIVE + ) + encapsulation = models.CharField( + verbose_name=_('encapsulation'), + max_length=50, + choices=TunnelEncapsulationChoices + ) + ipsec_profile = models.ForeignKey( + to='vpn.IPSecProfile', + on_delete=models.PROTECT, + related_name='tunnels', + blank=True, + null=True + ) + tenant = models.ForeignKey( + to='tenancy.Tenant', + on_delete=models.PROTECT, + related_name='tunnels', + blank=True, + null=True + ) + tunnel_id = models.PositiveBigIntegerField( + verbose_name=_('tunnel ID'), + blank=True, + null=True + ) + + clone_fields = ( + 'status', 'encapsulation', 'ipsec_profile', 'tenant', + ) + + class Meta: + ordering = ('name',) + verbose_name = _('tunnel') + verbose_name_plural = _('tunnels') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('vpn:tunnel', args=[self.pk]) + + def get_status_color(self): + return TunnelStatusChoices.colors.get(self.status) + + +class TunnelTermination(CustomFieldsMixin, CustomLinksMixin, TagsMixin, ChangeLoggedModel): + tunnel = models.ForeignKey( + to='vpn.Tunnel', + on_delete=models.CASCADE, + related_name='terminations' + ) + role = models.CharField( + verbose_name=_('role'), + max_length=50, + choices=TunnelTerminationRoleChoices, + default=TunnelTerminationRoleChoices.ROLE_PEER + ) + termination_type = models.ForeignKey( + to='contenttypes.ContentType', + on_delete=models.PROTECT, + related_name='+' + ) + termination_id = models.PositiveBigIntegerField( + blank=True, + null=True + ) + termination = GenericForeignKey( + ct_field='termination_type', + fk_field='termination_id' + ) + outside_ip = models.OneToOneField( + to='ipam.IPAddress', + on_delete=models.PROTECT, + related_name='tunnel_termination', + blank=True, + null=True + ) + + prerequisite_models = ( + 'vpn.Tunnel', + ) + + class Meta: + ordering = ('tunnel', 'role', 'pk') + constraints = ( + models.UniqueConstraint( + fields=('termination_type', 'termination_id'), + name='%(app_label)s_%(class)s_termination', + violation_error_message=_("An object may be terminated to only one tunnel at a time.") + ), + ) + verbose_name = _('tunnel termination') + verbose_name_plural = _('tunnel terminations') + + def __str__(self): + return f'{self.tunnel}: Termination {self.pk}' + + def get_absolute_url(self): + return reverse('vpn:tunneltermination', args=[self.pk]) + + def get_role_color(self): + return TunnelTerminationRoleChoices.colors.get(self.role) + + def clean(self): + super().clean() + + # Check that the selected termination object is not already attached to a Tunnel + if getattr(self.termination, 'tunnel_termination', None) and self.termination.tunnel_termination.pk != self.pk: + raise ValidationError({ + 'termination': _("{name} is already attached to a tunnel ({tunnel}).").format( + name=self.termination.name, + tunnel=self.termination.tunnel_termination.tunnel + ) + }) + + def to_objectchange(self, action): + objectchange = super().to_objectchange(action) + objectchange.related_object = self.tunnel + return objectchange diff --git a/netbox/vpn/search.py b/netbox/vpn/search.py new file mode 100644 index 000000000..70b0c644f --- /dev/null +++ b/netbox/vpn/search.py @@ -0,0 +1,65 @@ +from netbox.search import SearchIndex, register_search +from . import models + + +@register_search +class TunnelIndex(SearchIndex): + model = models.Tunnel + fields = ( + ('name', 100), + ('tunnel_id', 300), + ('description', 500), + ('comments', 5000), + ) + display_attrs = ('status', 'encapsulation', 'tenant', 'description') + + +@register_search +class IKEProposalIndex(SearchIndex): + model = models.IKEProposal + fields = ( + ('name', 100), + ('description', 500), + ) + display_attrs = ('description',) + + +@register_search +class IKEPolicyIndex(SearchIndex): + model = models.IKEPolicy + fields = ( + ('name', 100), + ('description', 500), + ) + display_attrs = ('description',) + + +@register_search +class IPSecProposalIndex(SearchIndex): + model = models.IPSecProposal + fields = ( + ('name', 100), + ('description', 500), + ) + display_attrs = ('description',) + + +@register_search +class IPSecPolicyIndex(SearchIndex): + model = models.IPSecPolicy + fields = ( + ('name', 100), + ('description', 500), + ) + display_attrs = ('description',) + + +@register_search +class IPSecProfileIndex(SearchIndex): + model = models.IPSecProfile + fields = ( + ('name', 100), + ('description', 500), + ('comments', 5000), + ) + display_attrs = ('description',) diff --git a/netbox/vpn/tables.py b/netbox/vpn/tables.py new file mode 100644 index 000000000..304467586 --- /dev/null +++ b/netbox/vpn/tables.py @@ -0,0 +1,254 @@ +import django_tables2 as tables +from django.utils.translation import gettext_lazy as _ +from django_tables2.utils import Accessor + +from tenancy.tables import TenancyColumnsMixin +from netbox.tables import NetBoxTable, columns +from vpn.models import * + +__all__ = ( + 'IKEPolicyTable', + 'IKEProposalTable', + 'IPSecPolicyTable', + 'IPSecProposalTable', + 'IPSecProfileTable', + 'TunnelTable', + 'TunnelTerminationTable', +) + + +class TunnelTable(TenancyColumnsMixin, NetBoxTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + status = columns.ChoiceFieldColumn( + verbose_name=_('Status') + ) + ipsec_profile = tables.Column( + verbose_name=_('IPSec profile'), + linkify=True + ) + terminations_count = columns.LinkedCountColumn( + accessor=Accessor('count_terminations'), + viewname='vpn:tunneltermination_list', + url_params={'tunnel_id': 'pk'}, + verbose_name=_('Terminations') + ) + comments = columns.MarkdownColumn( + verbose_name=_('Comments'), + ) + tags = columns.TagColumn( + url_name='vpn:tunnel_list' + ) + + class Meta(NetBoxTable.Meta): + model = Tunnel + fields = ( + 'pk', 'id', 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tenant_group', 'tunnel_id', + 'termination_count', 'description', 'comments', 'tags', 'created', 'last_updated', + ) + default_columns = ('pk', 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'terminations_count') + + +class TunnelTerminationTable(TenancyColumnsMixin, NetBoxTable): + tunnel = tables.Column( + verbose_name=_('Tunnel'), + linkify=True + ) + role = columns.ChoiceFieldColumn( + verbose_name=_('Role') + ) + termination_parent = tables.Column( + accessor='termination__parent_object', + linkify=True, + orderable=False, + verbose_name=_('Host') + ) + termination = tables.Column( + verbose_name=_('Termination'), + linkify=True + ) + ip_addresses = tables.ManyToManyColumn( + accessor=tables.A('termination__ip_addresses'), + orderable=False, + linkify_item=True, + verbose_name=_('IP Addresses') + ) + outside_ip = tables.Column( + verbose_name=_('Outside IP'), + linkify=True + ) + tags = columns.TagColumn( + url_name='vpn:tunneltermination_list' + ) + + class Meta(NetBoxTable.Meta): + model = TunnelTermination + fields = ( + 'pk', 'id', 'tunnel', 'role', 'termination_parent', 'termination', 'ip_addresses', 'outside_ip', 'tags', + 'created', 'last_updated', + ) + default_columns = ( + 'pk', 'id', 'tunnel', 'role', 'termination_parent', 'termination', 'ip_addresses', 'outside_ip', + ) + + +class IKEProposalTable(NetBoxTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + authentication_method = tables.Column( + verbose_name=_('Authentication Method') + ) + encryption_algorithm = tables.Column( + verbose_name=_('Encryption Algorithm') + ) + authentication_algorithm = tables.Column( + verbose_name=_('Authentication Algorithm') + ) + group = tables.Column( + verbose_name=_('Group') + ) + sa_lifetime = tables.Column( + verbose_name=_('SA Lifetime') + ) + tags = columns.TagColumn( + url_name='vpn:ikeproposal_list' + ) + + class Meta(NetBoxTable.Meta): + model = IKEProposal + fields = ( + 'pk', 'id', 'name', 'authentication_method', 'encryption_algorithm', 'authentication_algorithm', + 'group', 'sa_lifetime', 'description', 'tags', 'created', 'last_updated', + ) + default_columns = ( + 'pk', 'name', 'authentication_method', 'encryption_algorithm', 'authentication_algorithm', 'group', + 'sa_lifetime', 'description', + ) + + +class IKEPolicyTable(NetBoxTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + version = tables.Column( + verbose_name=_('Version') + ) + mode = tables.Column( + verbose_name=_('Mode') + ) + proposals = tables.ManyToManyColumn( + linkify_item=True, + verbose_name=_('Proposals') + ) + preshared_key = tables.Column( + verbose_name=_('Pre-shared Key') + ) + tags = columns.TagColumn( + url_name='vpn:ikepolicy_list' + ) + + class Meta(NetBoxTable.Meta): + model = IKEPolicy + fields = ( + 'pk', 'id', 'name', 'version', 'mode', 'proposals', 'preshared_key', 'description', 'tags', 'created', + 'last_updated', + ) + default_columns = ( + 'pk', 'name', 'version', 'mode', 'proposals', 'description', + ) + + +class IPSecProposalTable(NetBoxTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + encryption_algorithm = tables.Column( + verbose_name=_('Encryption Algorithm') + ) + authentication_algorithm = tables.Column( + verbose_name=_('Authentication Algorithm') + ) + sa_lifetime_seconds = tables.Column( + verbose_name=_('SA Lifetime (Seconds)') + ) + sa_lifetime_data = tables.Column( + verbose_name=_('SA Lifetime (KB)') + ) + tags = columns.TagColumn( + url_name='vpn:ipsecproposal_list' + ) + + class Meta(NetBoxTable.Meta): + model = IPSecProposal + fields = ( + 'pk', 'id', 'name', 'encryption_algorithm', 'authentication_algorithm', 'sa_lifetime_seconds', + 'sa_lifetime_data', 'description', 'tags', 'created', 'last_updated', + ) + default_columns = ( + 'pk', 'name', 'encryption_algorithm', 'authentication_algorithm', 'sa_lifetime_seconds', + 'sa_lifetime_data', 'description', + ) + + +class IPSecPolicyTable(NetBoxTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + proposals = tables.ManyToManyColumn( + linkify_item=True, + verbose_name=_('Proposals') + ) + pfs_group = tables.Column( + verbose_name=_('PFS Group') + ) + tags = columns.TagColumn( + url_name='vpn:ipsecpolicy_list' + ) + + class Meta(NetBoxTable.Meta): + model = IPSecPolicy + fields = ( + 'pk', 'id', 'name', 'proposals', 'pfs_group', 'description', 'tags', 'created', 'last_updated', + ) + default_columns = ( + 'pk', 'name', 'proposals', 'pfs_group', 'description', + ) + + +class IPSecProfileTable(NetBoxTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + mode = tables.Column( + verbose_name=_('Mode') + ) + ike_policy = tables.Column( + linkify=True, + verbose_name=_('IKE Policy') + ) + ipsec_policy = tables.Column( + linkify=True, + verbose_name=_('IPSec Policy') + ) + comments = columns.MarkdownColumn( + verbose_name=_('Comments'), + ) + tags = columns.TagColumn( + url_name='vpn:ipsecprofile_list' + ) + + class Meta(NetBoxTable.Meta): + model = IPSecProfile + fields = ( + 'pk', 'id', 'name', 'mode', 'ike_policy', 'ipsec_policy', 'description', 'comments', 'tags', 'created', + 'last_updated', + ) + default_columns = ('pk', 'name', 'mode', 'ike_policy', 'ipsec_policy', 'description') diff --git a/netbox/vpn/tests/__init__.py b/netbox/vpn/tests/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/netbox/vpn/tests/test_api.py b/netbox/vpn/tests/test_api.py new file mode 100644 index 000000000..9bfa297ab --- /dev/null +++ b/netbox/vpn/tests/test_api.py @@ -0,0 +1,473 @@ +from django.urls import reverse + +from dcim.choices import InterfaceTypeChoices +from dcim.models import Interface +from utilities.testing import APITestCase, APIViewTestCases, create_test_device +from vpn.choices import * +from vpn.models import * + + +class AppTest(APITestCase): + + def test_root(self): + url = reverse('vpn-api:api-root') + response = self.client.get('{}?format=api'.format(url), **self.header) + + self.assertEqual(response.status_code, 200) + + +class TunnelTest(APIViewTestCases.APIViewTestCase): + model = Tunnel + brief_fields = ['display', 'id', 'name', 'url'] + bulk_update_data = { + 'status': TunnelStatusChoices.STATUS_PLANNED, + 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + + tunnels = ( + Tunnel( + name='Tunnel 1', + status=TunnelStatusChoices.STATUS_ACTIVE, + encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP + ), + Tunnel( + name='Tunnel 2', + status=TunnelStatusChoices.STATUS_ACTIVE, + encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP + ), + Tunnel( + name='Tunnel 3', + status=TunnelStatusChoices.STATUS_ACTIVE, + encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP + ), + ) + Tunnel.objects.bulk_create(tunnels) + + cls.create_data = [ + { + 'name': 'Tunnel 4', + 'status': TunnelStatusChoices.STATUS_DISABLED, + 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, + }, + { + 'name': 'Tunnel 5', + 'status': TunnelStatusChoices.STATUS_DISABLED, + 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, + }, + { + 'name': 'Tunnel 6', + 'status': TunnelStatusChoices.STATUS_DISABLED, + 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, + }, + ] + + +class TunnelTerminationTest(APIViewTestCases.APIViewTestCase): + model = TunnelTermination + brief_fields = ['display', 'id', 'url'] + bulk_update_data = { + 'role': TunnelTerminationRoleChoices.ROLE_PEER, + } + + @classmethod + def setUpTestData(cls): + device = create_test_device('Device 1') + interfaces = ( + Interface(device=device, name='Interface 1', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 2', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 3', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 4', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 5', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 6', type=InterfaceTypeChoices.TYPE_VIRTUAL), + ) + Interface.objects.bulk_create(interfaces) + + tunnel = Tunnel.objects.create( + name='Tunnel 1', + status=TunnelStatusChoices.STATUS_ACTIVE, + encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP + ) + + tunnel_terminations = ( + TunnelTermination( + tunnel=tunnel, + role=TunnelTerminationRoleChoices.ROLE_HUB, + termination=interfaces[0] + ), + TunnelTermination( + tunnel=tunnel, + role=TunnelTerminationRoleChoices.ROLE_HUB, + termination=interfaces[1] + ), + TunnelTermination( + tunnel=tunnel, + role=TunnelTerminationRoleChoices.ROLE_HUB, + termination=interfaces[2] + ), + ) + TunnelTermination.objects.bulk_create(tunnel_terminations) + + cls.create_data = [ + { + 'tunnel': tunnel.pk, + 'role': TunnelTerminationRoleChoices.ROLE_PEER, + 'termination_type': 'dcim.interface', + 'termination_id': interfaces[3].pk, + }, + { + 'tunnel': tunnel.pk, + 'role': TunnelTerminationRoleChoices.ROLE_PEER, + 'termination_type': 'dcim.interface', + 'termination_id': interfaces[4].pk, + }, + { + 'tunnel': tunnel.pk, + 'role': TunnelTerminationRoleChoices.ROLE_PEER, + 'termination_type': 'dcim.interface', + 'termination_id': interfaces[5].pk, + }, + ] + + +class IKEProposalTest(APIViewTestCases.APIViewTestCase): + model = IKEProposal + brief_fields = ['display', 'id', 'name', 'url'] + bulk_update_data = { + 'authentication_method': AuthenticationMethodChoices.CERTIFICATES, + 'encryption_algorithm': EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC, + 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_MD5, + 'group': DHGroupChoices.GROUP_19, + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + + ike_proposals = ( + IKEProposal( + name='IKE Proposal 1', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + IKEProposal( + name='IKE Proposal 2', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + IKEProposal( + name='IKE Proposal 3', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + ) + IKEProposal.objects.bulk_create(ike_proposals) + + cls.create_data = [ + { + 'name': 'IKE Proposal 4', + 'authentication_method': AuthenticationMethodChoices.CERTIFICATES, + 'encryption_algorithm': EncryptionAlgorithmChoices.ENCRYPTION_AES256_CBC, + 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, + 'group': DHGroupChoices.GROUP_19, + }, + { + 'name': 'IKE Proposal 5', + 'authentication_method': AuthenticationMethodChoices.CERTIFICATES, + 'encryption_algorithm': EncryptionAlgorithmChoices.ENCRYPTION_AES256_CBC, + 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, + 'group': DHGroupChoices.GROUP_19, + }, + { + 'name': 'IKE Proposal 6', + 'authentication_method': AuthenticationMethodChoices.CERTIFICATES, + 'encryption_algorithm': EncryptionAlgorithmChoices.ENCRYPTION_AES256_CBC, + 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, + 'group': DHGroupChoices.GROUP_19, + }, + ] + + +class IKEPolicyTest(APIViewTestCases.APIViewTestCase): + model = IKEPolicy + brief_fields = ['display', 'id', 'name', 'url'] + bulk_update_data = { + 'version': IKEVersionChoices.VERSION_1, + 'mode': IKEModeChoices.AGGRESSIVE, + 'description': 'New description', + 'preshared_key': 'New key', + } + + @classmethod + def setUpTestData(cls): + + ike_proposals = ( + IKEProposal( + name='IKE Proposal 1', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + IKEProposal( + name='IKE Proposal 2', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + ) + IKEProposal.objects.bulk_create(ike_proposals) + + ike_policies = ( + IKEPolicy( + name='IKE Policy 1', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + IKEPolicy( + name='IKE Policy 2', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + IKEPolicy( + name='IKE Policy 3', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + ) + IKEPolicy.objects.bulk_create(ike_policies) + for ike_policy in ike_policies: + ike_policy.proposals.set(ike_proposals) + + cls.create_data = [ + { + 'name': 'IKE Policy 4', + 'version': IKEVersionChoices.VERSION_1, + 'mode': IKEModeChoices.MAIN, + 'proposals': [ike_proposals[0].pk, ike_proposals[1].pk], + }, + { + 'name': 'IKE Policy 5', + 'version': IKEVersionChoices.VERSION_1, + 'mode': IKEModeChoices.MAIN, + 'proposals': [ike_proposals[0].pk, ike_proposals[1].pk], + }, + { + 'name': 'IKE Policy 6', + 'version': IKEVersionChoices.VERSION_1, + 'mode': IKEModeChoices.MAIN, + 'proposals': [ike_proposals[0].pk, ike_proposals[1].pk], + }, + ] + + +class IPSecProposalTest(APIViewTestCases.APIViewTestCase): + model = IPSecProposal + brief_fields = ['display', 'id', 'name', 'url'] + bulk_update_data = { + 'encryption_algorithm': EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC, + 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_MD5, + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + + ipsec_proposals = ( + IPSecProposal( + name='IPSec Proposal 1', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ), + IPSecProposal( + name='IPSec Proposal 2', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ), + IPSecProposal( + name='IPSec Proposal 3', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ), + ) + IPSecProposal.objects.bulk_create(ipsec_proposals) + + cls.create_data = [ + { + 'name': 'IPSec Proposal 4', + 'encryption_algorithm': EncryptionAlgorithmChoices.ENCRYPTION_AES256_CBC, + 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, + }, + { + 'name': 'IPSec Proposal 5', + 'encryption_algorithm': EncryptionAlgorithmChoices.ENCRYPTION_AES256_CBC, + 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, + }, + { + 'name': 'IPSec Proposal 6', + 'encryption_algorithm': EncryptionAlgorithmChoices.ENCRYPTION_AES256_CBC, + 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, + }, + ] + + +class IPSecPolicyTest(APIViewTestCases.APIViewTestCase): + model = IPSecPolicy + brief_fields = ['display', 'id', 'name', 'url'] + bulk_update_data = { + 'pfs_group': DHGroupChoices.GROUP_5, + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + + ipsec_proposals = ( + IPSecProposal( + name='IPSec Policy 1', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ), + IPSecProposal( + name='IPSec Proposal 2', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ), + ) + IPSecProposal.objects.bulk_create(ipsec_proposals) + + ipsec_policies = ( + IPSecPolicy( + name='IPSec Policy 1', + pfs_group=DHGroupChoices.GROUP_14 + ), + IPSecPolicy( + name='IPSec Policy 2', + pfs_group=DHGroupChoices.GROUP_14 + ), + IPSecPolicy( + name='IPSec Policy 3', + pfs_group=DHGroupChoices.GROUP_14 + ), + ) + IPSecPolicy.objects.bulk_create(ipsec_policies) + for ipsec_policy in ipsec_policies: + ipsec_policy.proposals.set(ipsec_proposals) + + cls.create_data = [ + { + 'name': 'IPSec Policy 4', + 'pfs_group': DHGroupChoices.GROUP_16, + 'proposals': [ipsec_proposals[0].pk, ipsec_proposals[1].pk], + }, + { + 'name': 'IPSec Policy 5', + 'pfs_group': DHGroupChoices.GROUP_16, + 'proposals': [ipsec_proposals[0].pk, ipsec_proposals[1].pk], + }, + { + 'name': 'IPSec Policy 6', + 'pfs_group': DHGroupChoices.GROUP_16, + 'proposals': [ipsec_proposals[0].pk, ipsec_proposals[1].pk], + }, + ] + + +class IPSecProfileTest(APIViewTestCases.APIViewTestCase): + model = IPSecProfile + brief_fields = ['display', 'id', 'name', 'url'] + + @classmethod + def setUpTestData(cls): + + ike_proposal = IKEProposal.objects.create( + name='IKE Proposal 1', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ) + + ipsec_proposal = IPSecProposal.objects.create( + name='IPSec Proposal 1', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ) + + ike_policies = ( + IKEPolicy( + name='IKE Policy 1', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + IKEPolicy( + name='IKE Policy 2', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + ) + IKEPolicy.objects.bulk_create(ike_policies) + for ike_policy in ike_policies: + ike_policy.proposals.add(ike_proposal) + + ipsec_policies = ( + IPSecPolicy( + name='IPSec Policy 1', + pfs_group=DHGroupChoices.GROUP_14 + ), + IPSecPolicy( + name='IPSec Policy 2', + pfs_group=DHGroupChoices.GROUP_14 + ), + ) + IPSecPolicy.objects.bulk_create(ipsec_policies) + for ipsec_policy in ipsec_policies: + ipsec_policy.proposals.add(ipsec_proposal) + + ipsec_profiles = ( + IPSecProfile( + name='IPSec Profile 1', + mode=IPSecModeChoices.ESP, + ike_policy=ike_policies[0], + ipsec_policy=ipsec_policies[0] + ), + IPSecProfile( + name='IPSec Profile 2', + mode=IPSecModeChoices.ESP, + ike_policy=ike_policies[0], + ipsec_policy=ipsec_policies[0] + ), + IPSecProfile( + name='IPSec Profile 3', + mode=IPSecModeChoices.ESP, + ike_policy=ike_policies[0], + ipsec_policy=ipsec_policies[0] + ), + ) + IPSecProfile.objects.bulk_create(ipsec_profiles) + + cls.create_data = [ + { + 'name': 'IPSec Profile 4', + 'mode': IPSecModeChoices.AH, + 'ike_policy': ike_policies[1].pk, + 'ipsec_policy': ipsec_policies[1].pk, + }, + ] + + cls.bulk_update_data = { + 'mode': IPSecModeChoices.AH, + 'ike_policy': ike_policies[1].pk, + 'ipsec_policy': ipsec_policies[1].pk, + 'description': 'New description', + } diff --git a/netbox/vpn/tests/test_filtersets.py b/netbox/vpn/tests/test_filtersets.py new file mode 100644 index 000000000..966717f4a --- /dev/null +++ b/netbox/vpn/tests/test_filtersets.py @@ -0,0 +1,592 @@ +from django.test import TestCase + +from dcim.choices import InterfaceTypeChoices +from dcim.models import Interface +from ipam.models import IPAddress +from virtualization.models import VMInterface +from vpn.choices import * +from vpn.filtersets import * +from vpn.models import * +from utilities.testing import ChangeLoggedFilterSetTests, create_test_device, create_test_virtualmachine + + +class TunnelTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = Tunnel.objects.all() + filterset = TunnelFilterSet + + @classmethod + def setUpTestData(cls): + ike_proposal = IKEProposal.objects.create( + name='IKE Proposal 1', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ) + ike_policy = IKEPolicy.objects.create( + name='IKE Policy 1', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ) + ike_policy.proposals.add(ike_proposal) + ipsec_proposal = IPSecProposal.objects.create( + name='IPSec Proposal 1', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ) + ipsec_policy = IPSecPolicy.objects.create( + name='IPSec Policy 1', + pfs_group=DHGroupChoices.GROUP_14 + ) + ipsec_policy.proposals.add(ipsec_proposal) + ipsec_profiles = ( + IPSecProfile( + name='IPSec Profile 1', + mode=IPSecModeChoices.ESP, + ike_policy=ike_policy, + ipsec_policy=ipsec_policy + ), + IPSecProfile( + name='IPSec Profile 2', + mode=IPSecModeChoices.ESP, + ike_policy=ike_policy, + ipsec_policy=ipsec_policy + ), + ) + IPSecProfile.objects.bulk_create(ipsec_profiles) + + tunnels = ( + Tunnel( + name='Tunnel 1', + status=TunnelStatusChoices.STATUS_ACTIVE, + encapsulation=TunnelEncapsulationChoices.ENCAP_GRE, + ipsec_profile=ipsec_profiles[0], + tunnel_id=100 + ), + Tunnel( + name='Tunnel 2', + status=TunnelStatusChoices.STATUS_PLANNED, + encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP, + ipsec_profile=ipsec_profiles[0], + tunnel_id=200 + ), + Tunnel( + name='Tunnel 3', + status=TunnelStatusChoices.STATUS_DISABLED, + encapsulation=TunnelEncapsulationChoices.ENCAP_IPSEC_TUNNEL, + ipsec_profile=None, + tunnel_id=300 + ), + ) + Tunnel.objects.bulk_create(tunnels) + + def test_name(self): + params = {'name': ['Tunnel 1', 'Tunnel 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_status(self): + params = {'status': [TunnelStatusChoices.STATUS_ACTIVE, TunnelStatusChoices.STATUS_PLANNED]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_encapsulation(self): + params = {'encapsulation': [TunnelEncapsulationChoices.ENCAP_GRE, TunnelEncapsulationChoices.ENCAP_IP_IP]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_ipsec_profile(self): + ipsec_profiles = IPSecProfile.objects.all()[:2] + params = {'ipsec_profile_id': [ipsec_profiles[0].pk, ipsec_profiles[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'ipsec_profile': [ipsec_profiles[0].name, ipsec_profiles[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_tunnel_id(self): + params = {'tunnel_id': [100, 200]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class TunnelTerminationTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = TunnelTermination.objects.all() + filterset = TunnelTerminationFilterSet + + @classmethod + def setUpTestData(cls): + device = create_test_device('Device 1') + interfaces = ( + Interface(device=device, name='Interface 1', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 2', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 3', type=InterfaceTypeChoices.TYPE_VIRTUAL), + ) + Interface.objects.bulk_create(interfaces) + + virtual_machine = create_test_virtualmachine('Virtual Machine 1') + vm_interfaces = ( + VMInterface(virtual_machine=virtual_machine, name='Interface 1'), + VMInterface(virtual_machine=virtual_machine, name='Interface 2'), + VMInterface(virtual_machine=virtual_machine, name='Interface 3'), + ) + VMInterface.objects.bulk_create(vm_interfaces) + + ip_addresses = ( + IPAddress(address='192.168.0.1/32'), + IPAddress(address='192.168.0.2/32'), + IPAddress(address='192.168.0.3/32'), + IPAddress(address='192.168.0.4/32'), + IPAddress(address='192.168.0.5/32'), + IPAddress(address='192.168.0.6/32'), + ) + IPAddress.objects.bulk_create(ip_addresses) + + tunnels = ( + Tunnel( + name='Tunnel 1', + status=TunnelStatusChoices.STATUS_ACTIVE, + encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP + ), + Tunnel( + name='Tunnel 2', + status=TunnelStatusChoices.STATUS_ACTIVE, + encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP + ), + Tunnel( + name='Tunnel 3', + status=TunnelStatusChoices.STATUS_ACTIVE, + encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP + ), + ) + Tunnel.objects.bulk_create(tunnels) + + tunnel_terminations = ( + # Tunnel 1 + TunnelTermination( + tunnel=tunnels[0], + role=TunnelTerminationRoleChoices.ROLE_HUB, + termination=interfaces[0], + outside_ip=ip_addresses[0] + ), + TunnelTermination( + tunnel=tunnels[0], + role=TunnelTerminationRoleChoices.ROLE_SPOKE, + termination=vm_interfaces[0], + outside_ip=ip_addresses[1] + ), + # Tunnel 2 + TunnelTermination( + tunnel=tunnels[1], + role=TunnelTerminationRoleChoices.ROLE_HUB, + termination=interfaces[1], + outside_ip=ip_addresses[2] + ), + TunnelTermination( + tunnel=tunnels[1], + role=TunnelTerminationRoleChoices.ROLE_SPOKE, + termination=vm_interfaces[1], + outside_ip=ip_addresses[3] + ), + # Tunnel 3 + TunnelTermination( + tunnel=tunnels[2], + role=TunnelTerminationRoleChoices.ROLE_PEER, + termination=interfaces[2], + outside_ip=ip_addresses[4] + ), + TunnelTermination( + tunnel=tunnels[2], + role=TunnelTerminationRoleChoices.ROLE_PEER, + termination=vm_interfaces[2], + outside_ip=ip_addresses[5] + ), + ) + TunnelTermination.objects.bulk_create(tunnel_terminations) + + def test_tunnel(self): + tunnels = Tunnel.objects.all()[:2] + params = {'tunnel_id': [tunnels[0].pk, tunnels[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + params = {'tunnel': [tunnels[0].name, tunnels[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + def test_role(self): + params = {'role': [TunnelTerminationRoleChoices.ROLE_HUB, TunnelTerminationRoleChoices.ROLE_SPOKE]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + def test_termination_type(self): + params = {'termination_type': 'dcim.interface'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + params = {'termination_type': 'virtualization.vminterface'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + def test_interface(self): + interfaces = Interface.objects.all()[:2] + params = {'interface_id': [interfaces[0].pk, interfaces[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'interface': [interfaces[0].name, interfaces[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_vminterface(self): + vm_interfaces = VMInterface.objects.all()[:2] + params = {'vminterface_id': [vm_interfaces[0].pk, vm_interfaces[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'vminterface': [vm_interfaces[0].name, vm_interfaces[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_outside_ip(self): + ip_addresses = IPAddress.objects.all()[:2] + params = {'outside_ip_id': [ip_addresses[0].pk, ip_addresses[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class IKEProposalTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = IKEProposal.objects.all() + filterset = IKEProposalFilterSet + + @classmethod + def setUpTestData(cls): + ike_proposals = ( + IKEProposal( + name='IKE Proposal 1', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_1, + sa_lifetime=1000 + ), + IKEProposal( + name='IKE Proposal 2', + authentication_method=AuthenticationMethodChoices.CERTIFICATES, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, + group=DHGroupChoices.GROUP_2, + sa_lifetime=2000 + ), + IKEProposal( + name='IKE Proposal 3', + authentication_method=AuthenticationMethodChoices.RSA_SIGNATURES, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES256_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA512, + group=DHGroupChoices.GROUP_5, + sa_lifetime=3000 + ), + ) + IKEProposal.objects.bulk_create(ike_proposals) + + def test_name(self): + params = {'name': ['IKE Proposal 1', 'IKE Proposal 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_authentication_method(self): + params = {'authentication_method': [ + AuthenticationMethodChoices.PRESHARED_KEYS, AuthenticationMethodChoices.CERTIFICATES + ]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_encryption_algorithm(self): + params = {'encryption_algorithm': [ + EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC + ]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_authentication_algorithm(self): + params = {'authentication_algorithm': [ + AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256 + ]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_group(self): + params = {'group': [DHGroupChoices.GROUP_1, DHGroupChoices.GROUP_2]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_sa_lifetime(self): + params = {'sa_lifetime': [1000, 2000]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class IKEPolicyTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = IKEPolicy.objects.all() + filterset = IKEPolicyFilterSet + + @classmethod + def setUpTestData(cls): + ike_proposals = ( + IKEProposal( + name='IKE Proposal 1', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + IKEProposal( + name='IKE Proposal 2', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + IKEProposal( + name='IKE Proposal 3', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + ) + IKEProposal.objects.bulk_create(ike_proposals) + + ike_policies = ( + IKEPolicy( + name='IKE Policy 1', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + IKEPolicy( + name='IKE Policy 2', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + IKEPolicy( + name='IKE Policy 3', + version=IKEVersionChoices.VERSION_2, + mode=IKEModeChoices.AGGRESSIVE, + ), + ) + IKEPolicy.objects.bulk_create(ike_policies) + ike_policies[0].proposals.add(ike_proposals[0]) + ike_policies[1].proposals.add(ike_proposals[1]) + ike_policies[2].proposals.add(ike_proposals[2]) + + def test_name(self): + params = {'name': ['IKE Policy 1', 'IKE Policy 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_version(self): + params = {'version': [IKEVersionChoices.VERSION_1]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_mode(self): + params = {'mode': [IKEModeChoices.MAIN]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_proposal(self): + proposals = IKEProposal.objects.all()[:2] + params = {'proposal_id': [proposals[0].pk, proposals[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'proposal': [proposals[0].name, proposals[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class IPSecProposalTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = IPSecProposal.objects.all() + filterset = IPSecProposalFilterSet + + @classmethod + def setUpTestData(cls): + ipsec_proposals = ( + IPSecProposal( + name='IPSec Proposal 1', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + sa_lifetime_seconds=1000, + sa_lifetime_data=1000 + ), + IPSecProposal( + name='IPSec Proposal 2', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, + sa_lifetime_seconds=2000, + sa_lifetime_data=2000 + ), + IPSecProposal( + name='IPSec Proposal 3', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES256_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA512, + sa_lifetime_seconds=3000, + sa_lifetime_data=3000 + ), + ) + IPSecProposal.objects.bulk_create(ipsec_proposals) + + def test_name(self): + params = {'name': ['IPSec Proposal 1', 'IPSec Proposal 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_encryption_algorithm(self): + params = {'encryption_algorithm': [ + EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC + ]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_authentication_algorithm(self): + params = {'authentication_algorithm': [ + AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256 + ]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_sa_lifetime_seconds(self): + params = {'sa_lifetime_seconds': [1000, 2000]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_sa_lifetime_data(self): + params = {'sa_lifetime_data': [1000, 2000]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class IPSecPolicyTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = IPSecPolicy.objects.all() + filterset = IPSecPolicyFilterSet + + @classmethod + def setUpTestData(cls): + ipsec_proposals = ( + IPSecProposal( + name='IPSec Policy 1', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ), + IPSecProposal( + name='IPSec Proposal 2', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ), + IPSecProposal( + name='IPSec Proposal 3', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ), + ) + IPSecProposal.objects.bulk_create(ipsec_proposals) + + ipsec_policies = ( + IPSecPolicy( + name='IPSec Policy 1', + pfs_group=DHGroupChoices.GROUP_1 + ), + IPSecPolicy( + name='IPSec Policy 2', + pfs_group=DHGroupChoices.GROUP_2 + ), + IPSecPolicy( + name='IPSec Policy 3', + pfs_group=DHGroupChoices.GROUP_5 + ), + ) + IPSecPolicy.objects.bulk_create(ipsec_policies) + ipsec_policies[0].proposals.add(ipsec_proposals[0]) + ipsec_policies[1].proposals.add(ipsec_proposals[1]) + ipsec_policies[2].proposals.add(ipsec_proposals[2]) + + def test_name(self): + params = {'name': ['IPSec Policy 1', 'IPSec Policy 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_pfs_group(self): + params = {'pfs_group': [DHGroupChoices.GROUP_1, DHGroupChoices.GROUP_2]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_proposal(self): + proposals = IPSecProposal.objects.all()[:2] + params = {'proposal_id': [proposals[0].pk, proposals[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'proposal': [proposals[0].name, proposals[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class IPSecProfileTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = IPSecProfile.objects.all() + filterset = IPSecProfileFilterSet + + @classmethod + def setUpTestData(cls): + ike_proposal = IKEProposal.objects.create( + name='IKE Proposal 1', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ) + ipsec_proposal = IPSecProposal.objects.create( + name='IPSec Proposal 1', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ) + + ike_policies = ( + IKEPolicy( + name='IKE Policy 1', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + IKEPolicy( + name='IKE Policy 2', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + IKEPolicy( + name='IKE Policy 3', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + ) + IKEPolicy.objects.bulk_create(ike_policies) + for ike_policy in ike_policies: + ike_policy.proposals.add(ike_proposal) + + ipsec_policies = ( + IPSecPolicy( + name='IPSec Policy 1', + pfs_group=DHGroupChoices.GROUP_14 + ), + IPSecPolicy( + name='IPSec Policy 2', + pfs_group=DHGroupChoices.GROUP_14 + ), + IPSecPolicy( + name='IPSec Policy 3', + pfs_group=DHGroupChoices.GROUP_14 + ), + ) + IPSecPolicy.objects.bulk_create(ipsec_policies) + for ipsec_policy in ipsec_policies: + ipsec_policy.proposals.add(ipsec_proposal) + + ipsec_profiles = ( + IPSecProfile( + name='IPSec Profile 1', + mode=IPSecModeChoices.ESP, + ike_policy=ike_policies[0], + ipsec_policy=ipsec_policies[0] + ), + IPSecProfile( + name='IPSec Profile 2', + mode=IPSecModeChoices.ESP, + ike_policy=ike_policies[1], + ipsec_policy=ipsec_policies[1] + ), + IPSecProfile( + name='IPSec Profile 3', + mode=IPSecModeChoices.AH, + ike_policy=ike_policies[2], + ipsec_policy=ipsec_policies[2] + ), + ) + IPSecProfile.objects.bulk_create(ipsec_profiles) + + def test_name(self): + params = {'name': ['IPSec Profile 1', 'IPSec Profile 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_mode(self): + params = {'mode': [IPSecModeChoices.ESP]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_ike_policy(self): + ike_policies = IKEPolicy.objects.all()[:2] + params = {'ike_policy_id': [ike_policies[0].pk, ike_policies[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'ike_policy': [ike_policies[0].name, ike_policies[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_ipsec_policy(self): + ipsec_policies = IPSecPolicy.objects.all()[:2] + params = {'ipsec_policy_id': [ipsec_policies[0].pk, ipsec_policies[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'ipsec_policy': [ipsec_policies[0].name, ipsec_policies[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/vpn/tests/test_views.py b/netbox/vpn/tests/test_views.py new file mode 100644 index 000000000..433eca467 --- /dev/null +++ b/netbox/vpn/tests/test_views.py @@ -0,0 +1,508 @@ +from dcim.choices import InterfaceTypeChoices +from dcim.models import Interface +from vpn.choices import * +from vpn.models import * +from utilities.testing import ViewTestCases, create_tags, create_test_device + + +class TunnelTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = Tunnel + + @classmethod + def setUpTestData(cls): + + tunnels = ( + Tunnel( + name='Tunnel 1', + status=TunnelStatusChoices.STATUS_ACTIVE, + encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP + ), + Tunnel( + name='Tunnel 2', + status=TunnelStatusChoices.STATUS_ACTIVE, + encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP + ), + Tunnel( + name='Tunnel 3', + status=TunnelStatusChoices.STATUS_ACTIVE, + encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP + ), + ) + Tunnel.objects.bulk_create(tunnels) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'Tunnel X', + 'description': 'New tunnel', + 'status': TunnelStatusChoices.STATUS_PLANNED, + 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "name,status,encapsulation", + "Tunnel 4,planned,gre", + "Tunnel 5,planned,gre", + "Tunnel 6,planned,gre", + ) + + cls.csv_update_data = ( + "id,status,encapsulation", + f"{tunnels[0].pk},active,ip-ip", + f"{tunnels[1].pk},active,ip-ip", + f"{tunnels[2].pk},active,ip-ip", + ) + + cls.bulk_edit_data = { + 'description': 'New description', + 'status': TunnelStatusChoices.STATUS_DISABLED, + 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, + } + + +class TunnelTerminationTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = TunnelTermination + # TODO: Workaround for conflict between form field and GFK + validation_excluded_fields = ('termination',) + + @classmethod + def setUpTestData(cls): + device = create_test_device('Device 1') + interfaces = ( + Interface(device=device, name='Interface 1', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 2', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 3', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 4', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 5', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 6', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 7', type=InterfaceTypeChoices.TYPE_VIRTUAL), + ) + Interface.objects.bulk_create(interfaces) + + tunnel = Tunnel.objects.create( + name='Tunnel 1', + status=TunnelStatusChoices.STATUS_ACTIVE, + encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP + ) + + tunnel_terminations = ( + TunnelTermination( + tunnel=tunnel, + role=TunnelTerminationRoleChoices.ROLE_HUB, + termination=interfaces[0] + ), + TunnelTermination( + tunnel=tunnel, + role=TunnelTerminationRoleChoices.ROLE_SPOKE, + termination=interfaces[1] + ), + TunnelTermination( + tunnel=tunnel, + role=TunnelTerminationRoleChoices.ROLE_SPOKE, + termination=interfaces[2] + ), + ) + TunnelTermination.objects.bulk_create(tunnel_terminations) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'tunnel': tunnel.pk, + 'role': TunnelTerminationRoleChoices.ROLE_PEER, + 'type': TunnelTerminationTypeChoices.TYPE_DEVICE, + 'parent': device.pk, + 'termination': interfaces[6].pk, + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "tunnel,role,device,termination", + "Tunnel 1,peer,Device 1,Interface 4", + "Tunnel 1,peer,Device 1,Interface 5", + "Tunnel 1,peer,Device 1,Interface 6", + ) + + cls.csv_update_data = ( + "id,role", + f"{tunnel_terminations[0].pk},peer", + f"{tunnel_terminations[1].pk},peer", + f"{tunnel_terminations[2].pk},peer", + ) + + cls.bulk_edit_data = { + 'role': TunnelTerminationRoleChoices.ROLE_PEER, + } + + +class IKEProposalTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = IKEProposal + + @classmethod + def setUpTestData(cls): + + ike_proposals = ( + IKEProposal( + name='IKE Proposal 1', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + IKEProposal( + name='IKE Proposal 2', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + IKEProposal( + name='IKE Proposal 3', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + ) + IKEProposal.objects.bulk_create(ike_proposals) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'IKE Proposal X', + 'authentication_method': AuthenticationMethodChoices.CERTIFICATES, + 'encryption_algorithm': EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC, + 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, + 'group': DHGroupChoices.GROUP_19, + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "name,authentication_method,encryption_algorithm,authentication_algorithm,group", + "IKE Proposal 4,preshared-keys,aes-128-cbc,hmac-sha1,14", + "IKE Proposal 5,preshared-keys,aes-128-cbc,hmac-sha1,14", + "IKE Proposal 6,preshared-keys,aes-128-cbc,hmac-sha1,14", + ) + + cls.csv_update_data = ( + "id,description", + f"{ike_proposals[0].pk},New description", + f"{ike_proposals[1].pk},New description", + f"{ike_proposals[2].pk},New description", + ) + + cls.bulk_edit_data = { + 'description': 'New description', + 'authentication_method': AuthenticationMethodChoices.CERTIFICATES, + 'encryption_algorithm': EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC, + 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, + 'group': DHGroupChoices.GROUP_19 + } + + +class IKEPolicyTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = IKEPolicy + + @classmethod + def setUpTestData(cls): + + ike_proposals = ( + IKEProposal( + name='IKE Proposal 1', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + IKEProposal( + name='IKE Proposal 2', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ), + ) + IKEProposal.objects.bulk_create(ike_proposals) + + ike_policies = ( + IKEPolicy( + name='IKE Policy 1', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + IKEPolicy( + name='IKE Policy 2', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + IKEPolicy( + name='IKE Policy 3', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + ) + IKEPolicy.objects.bulk_create(ike_policies) + for ike_policy in ike_policies: + ike_policy.proposals.set(ike_proposals) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'IKE Policy X', + 'version': IKEVersionChoices.VERSION_2, + 'mode': IKEModeChoices.AGGRESSIVE, + 'proposals': [p.pk for p in ike_proposals], + 'tags': [t.pk for t in tags], + } + + ike_proposal_names = ','.join([p.name for p in ike_proposals]) + cls.csv_data = ( + "name,version,mode,proposals", + f"IKE Proposal 4,2,aggressive,\"{ike_proposal_names}\"", + f"IKE Proposal 5,2,aggressive,\"{ike_proposal_names}\"", + f"IKE Proposal 6,2,aggressive,\"{ike_proposal_names}\"", + ) + + cls.csv_update_data = ( + "id,description", + f"{ike_policies[0].pk},New description", + f"{ike_policies[1].pk},New description", + f"{ike_policies[2].pk},New description", + ) + + cls.bulk_edit_data = { + 'description': 'New description', + 'version': IKEVersionChoices.VERSION_2, + 'mode': IKEModeChoices.AGGRESSIVE, + } + + +class IPSecProposalTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = IPSecProposal + + @classmethod + def setUpTestData(cls): + + ipsec_proposals = ( + IPSecProposal( + name='IPSec Proposal 1', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + ), + IPSecProposal( + name='IPSec Proposal 2', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + ), + IPSecProposal( + name='IPSec Proposal 3', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + ), + ) + IPSecProposal.objects.bulk_create(ipsec_proposals) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'IPSec Proposal X', + 'encryption_algorithm': EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC, + 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, + 'sa_lifetime_seconds': 3600, + 'sa_lifetime_data': 1000000, + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "name,encryption_algorithm,authentication_algorithm,sa_lifetime_seconds,sa_lifetime_data", + "IKE Proposal 4,aes-128-cbc,hmac-sha1,3600,1000000", + "IKE Proposal 5,aes-128-cbc,hmac-sha1,3600,1000000", + "IKE Proposal 6,aes-128-cbc,hmac-sha1,3600,1000000", + ) + + cls.csv_update_data = ( + "id,description", + f"{ipsec_proposals[0].pk},New description", + f"{ipsec_proposals[1].pk},New description", + f"{ipsec_proposals[2].pk},New description", + ) + + cls.bulk_edit_data = { + 'description': 'New description', + 'encryption_algorithm': EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC, + 'authentication_algorithm': AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, + 'sa_lifetime_seconds': 3600, + 'sa_lifetime_data': 1000000, + } + + +class IPSecPolicyTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = IPSecPolicy + + @classmethod + def setUpTestData(cls): + + ipsec_proposals = ( + IPSecProposal( + name='IPSec Policy 1', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ), + IPSecProposal( + name='IPSec Proposal 2', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ), + ) + IPSecProposal.objects.bulk_create(ipsec_proposals) + + ipsec_policies = ( + IPSecPolicy( + name='IPSec Policy 1', + pfs_group=DHGroupChoices.GROUP_14 + ), + IPSecPolicy( + name='IPSec Policy 2', + pfs_group=DHGroupChoices.GROUP_14 + ), + IPSecPolicy( + name='IPSec Policy 3', + pfs_group=DHGroupChoices.GROUP_14 + ), + ) + IPSecPolicy.objects.bulk_create(ipsec_policies) + for ipsec_policy in ipsec_policies: + ipsec_policy.proposals.set(ipsec_proposals) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'IPSec Policy X', + 'pfs_group': DHGroupChoices.GROUP_5, + 'proposals': [p.pk for p in ipsec_proposals], + 'tags': [t.pk for t in tags], + } + + ipsec_proposal_names = ','.join([p.name for p in ipsec_proposals]) + cls.csv_data = ( + "name,pfs_group,proposals", + f"IKE Proposal 4,19,\"{ipsec_proposal_names}\"", + f"IKE Proposal 5,19,\"{ipsec_proposal_names}\"", + f"IKE Proposal 6,19,\"{ipsec_proposal_names}\"", + ) + + cls.csv_update_data = ( + "id,description", + f"{ipsec_policies[0].pk},New description", + f"{ipsec_policies[1].pk},New description", + f"{ipsec_policies[2].pk},New description", + ) + + cls.bulk_edit_data = { + 'description': 'New description', + 'pfs_group': DHGroupChoices.GROUP_5, + } + + +class IPSecProfileTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = IPSecProfile + + @classmethod + def setUpTestData(cls): + + ike_proposal = IKEProposal.objects.create( + name='IKE Proposal 1', + authentication_method=AuthenticationMethodChoices.PRESHARED_KEYS, + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, + group=DHGroupChoices.GROUP_14 + ) + + ipsec_proposal = IPSecProposal.objects.create( + name='IPSec Proposal 1', + encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, + authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1 + ) + + ike_policies = ( + IKEPolicy( + name='IKE Policy 1', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + IKEPolicy( + name='IKE Policy 2', + version=IKEVersionChoices.VERSION_1, + mode=IKEModeChoices.MAIN, + ), + ) + IKEPolicy.objects.bulk_create(ike_policies) + for ike_policy in ike_policies: + ike_policy.proposals.add(ike_proposal) + + ipsec_policies = ( + IPSecPolicy( + name='IPSec Policy 1', + pfs_group=DHGroupChoices.GROUP_14 + ), + IPSecPolicy( + name='IPSec Policy 2', + pfs_group=DHGroupChoices.GROUP_14 + ), + ) + IPSecPolicy.objects.bulk_create(ipsec_policies) + for ipsec_policy in ipsec_policies: + ipsec_policy.proposals.add(ipsec_proposal) + + ipsec_profiles = ( + IPSecProfile( + name='IPSec Profile 1', + mode=IPSecModeChoices.ESP, + ike_policy=ike_policies[0], + ipsec_policy=ipsec_policies[0] + ), + IPSecProfile( + name='IPSec Profile 2', + mode=IPSecModeChoices.ESP, + ike_policy=ike_policies[0], + ipsec_policy=ipsec_policies[0] + ), + IPSecProfile( + name='IPSec Profile 3', + mode=IPSecModeChoices.ESP, + ike_policy=ike_policies[0], + ipsec_policy=ipsec_policies[0] + ), + ) + IPSecProfile.objects.bulk_create(ipsec_profiles) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'IPSec Profile X', + 'mode': IPSecModeChoices.AH, + 'ike_policy': ike_policies[1].pk, + 'ipsec_policy': ipsec_policies[1].pk, + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "name,mode,ike_policy,ipsec_policy", + f"IKE Proposal 4,ah,IKE Policy 2,IPSec Policy 2", + f"IKE Proposal 5,ah,IKE Policy 2,IPSec Policy 2", + f"IKE Proposal 6,ah,IKE Policy 2,IPSec Policy 2", + ) + + cls.csv_update_data = ( + "id,description", + f"{ipsec_profiles[0].pk},New description", + f"{ipsec_profiles[1].pk},New description", + f"{ipsec_profiles[2].pk},New description", + ) + + cls.bulk_edit_data = { + 'description': 'New description', + 'mode': IPSecModeChoices.AH, + 'ike_policy': ike_policies[1].pk, + 'ipsec_policy': ipsec_policies[1].pk, + } diff --git a/netbox/vpn/urls.py b/netbox/vpn/urls.py new file mode 100644 index 000000000..7fe548245 --- /dev/null +++ b/netbox/vpn/urls.py @@ -0,0 +1,65 @@ +from django.urls import include, path + +from utilities.urls import get_model_urls +from . import views + +app_name = 'vpn' +urlpatterns = [ + + # Tunnels + path('tunnels/', views.TunnelListView.as_view(), name='tunnel_list'), + path('tunnels/add/', views.TunnelEditView.as_view(), name='tunnel_add'), + path('tunnels/import/', views.TunnelBulkImportView.as_view(), name='tunnel_import'), + path('tunnels/edit/', views.TunnelBulkEditView.as_view(), name='tunnel_bulk_edit'), + path('tunnels/delete/', views.TunnelBulkDeleteView.as_view(), name='tunnel_bulk_delete'), + path('tunnels//', include(get_model_urls('vpn', 'tunnel'))), + + # Tunnel terminations + path('tunnel-terminations/', views.TunnelTerminationListView.as_view(), name='tunneltermination_list'), + path('tunnel-terminations/add/', views.TunnelTerminationEditView.as_view(), name='tunneltermination_add'), + path('tunnel-terminations/import/', views.TunnelTerminationBulkImportView.as_view(), name='tunneltermination_import'), + path('tunnel-terminations/edit/', views.TunnelTerminationBulkEditView.as_view(), name='tunneltermination_bulk_edit'), + path('tunnel-terminations/delete/', views.TunnelTerminationBulkDeleteView.as_view(), name='tunneltermination_bulk_delete'), + path('tunnel-terminations//', include(get_model_urls('vpn', 'tunneltermination'))), + + # IKE proposals + path('ike-proposals/', views.IKEProposalListView.as_view(), name='ikeproposal_list'), + path('ike-proposals/add/', views.IKEProposalEditView.as_view(), name='ikeproposal_add'), + path('ike-proposals/import/', views.IKEProposalBulkImportView.as_view(), name='ikeproposal_import'), + path('ike-proposals/edit/', views.IKEProposalBulkEditView.as_view(), name='ikeproposal_bulk_edit'), + path('ike-proposals/delete/', views.IKEProposalBulkDeleteView.as_view(), name='ikeproposal_bulk_delete'), + path('ike-proposals//', include(get_model_urls('vpn', 'ikeproposal'))), + + # IKE policies + path('ike-policys/', views.IKEPolicyListView.as_view(), name='ikepolicy_list'), + path('ike-policys/add/', views.IKEPolicyEditView.as_view(), name='ikepolicy_add'), + path('ike-policys/import/', views.IKEPolicyBulkImportView.as_view(), name='ikepolicy_import'), + path('ike-policys/edit/', views.IKEPolicyBulkEditView.as_view(), name='ikepolicy_bulk_edit'), + path('ike-policys/delete/', views.IKEPolicyBulkDeleteView.as_view(), name='ikepolicy_bulk_delete'), + path('ike-policys//', include(get_model_urls('vpn', 'ikepolicy'))), + + # IPSec proposals + path('ipsec-proposals/', views.IPSecProposalListView.as_view(), name='ipsecproposal_list'), + path('ipsec-proposals/add/', views.IPSecProposalEditView.as_view(), name='ipsecproposal_add'), + path('ipsec-proposals/import/', views.IPSecProposalBulkImportView.as_view(), name='ipsecproposal_import'), + path('ipsec-proposals/edit/', views.IPSecProposalBulkEditView.as_view(), name='ipsecproposal_bulk_edit'), + path('ipsec-proposals/delete/', views.IPSecProposalBulkDeleteView.as_view(), name='ipsecproposal_bulk_delete'), + path('ipsec-proposals//', include(get_model_urls('vpn', 'ipsecproposal'))), + + # IPSec policies + path('ipsec-policys/', views.IPSecPolicyListView.as_view(), name='ipsecpolicy_list'), + path('ipsec-policys/add/', views.IPSecPolicyEditView.as_view(), name='ipsecpolicy_add'), + path('ipsec-policys/import/', views.IPSecPolicyBulkImportView.as_view(), name='ipsecpolicy_import'), + path('ipsec-policys/edit/', views.IPSecPolicyBulkEditView.as_view(), name='ipsecpolicy_bulk_edit'), + path('ipsec-policys/delete/', views.IPSecPolicyBulkDeleteView.as_view(), name='ipsecpolicy_bulk_delete'), + path('ipsec-policys//', include(get_model_urls('vpn', 'ipsecpolicy'))), + + # IPSec profiles + path('ipsec-profiles/', views.IPSecProfileListView.as_view(), name='ipsecprofile_list'), + path('ipsec-profiles/add/', views.IPSecProfileEditView.as_view(), name='ipsecprofile_add'), + path('ipsec-profiles/import/', views.IPSecProfileBulkImportView.as_view(), name='ipsecprofile_import'), + path('ipsec-profiles/edit/', views.IPSecProfileBulkEditView.as_view(), name='ipsecprofile_bulk_edit'), + path('ipsec-profiles/delete/', views.IPSecProfileBulkDeleteView.as_view(), name='ipsecprofile_bulk_delete'), + path('ipsec-profiles//', include(get_model_urls('vpn', 'ipsecprofile'))), + +] diff --git a/netbox/vpn/views.py b/netbox/vpn/views.py new file mode 100644 index 000000000..56eadc077 --- /dev/null +++ b/netbox/vpn/views.py @@ -0,0 +1,334 @@ +from netbox.views import generic +from utilities.utils import count_related +from utilities.views import register_model_view +from . import filtersets, forms, tables +from .models import * + + +# +# Tunnels +# + +class TunnelListView(generic.ObjectListView): + queryset = Tunnel.objects.annotate( + count_terminations=count_related(TunnelTermination, 'tunnel') + ) + filterset = filtersets.TunnelFilterSet + filterset_form = forms.TunnelFilterForm + table = tables.TunnelTable + + +@register_model_view(Tunnel) +class TunnelView(generic.ObjectView): + queryset = Tunnel.objects.all() + + +@register_model_view(Tunnel, 'edit') +class TunnelEditView(generic.ObjectEditView): + queryset = Tunnel.objects.all() + form = forms.TunnelForm + + def dispatch(self, request, *args, **kwargs): + + # If creating a new Tunnel, use the creation form + if 'pk' not in kwargs: + self.form = forms.TunnelCreateForm + + return super().dispatch(request, *args, **kwargs) + + +@register_model_view(Tunnel, 'delete') +class TunnelDeleteView(generic.ObjectDeleteView): + queryset = Tunnel.objects.all() + + +class TunnelBulkImportView(generic.BulkImportView): + queryset = Tunnel.objects.all() + model_form = forms.TunnelImportForm + + +class TunnelBulkEditView(generic.BulkEditView): + queryset = Tunnel.objects.annotate( + count_terminations=count_related(TunnelTermination, 'tunnel') + ) + filterset = filtersets.TunnelFilterSet + table = tables.TunnelTable + form = forms.TunnelBulkEditForm + + +class TunnelBulkDeleteView(generic.BulkDeleteView): + queryset = Tunnel.objects.annotate( + count_terminations=count_related(TunnelTermination, 'tunnel') + ) + filterset = filtersets.TunnelFilterSet + table = tables.TunnelTable + + +# +# Tunnel terminations +# + +class TunnelTerminationListView(generic.ObjectListView): + queryset = TunnelTermination.objects.all() + filterset = filtersets.TunnelTerminationFilterSet + filterset_form = forms.TunnelTerminationFilterForm + table = tables.TunnelTerminationTable + + +@register_model_view(TunnelTermination) +class TunnelTerminationView(generic.ObjectView): + queryset = TunnelTermination.objects.all() + + +@register_model_view(TunnelTermination, 'edit') +class TunnelTerminationEditView(generic.ObjectEditView): + queryset = TunnelTermination.objects.all() + form = forms.TunnelTerminationForm + + +@register_model_view(TunnelTermination, 'delete') +class TunnelTerminationDeleteView(generic.ObjectDeleteView): + queryset = TunnelTermination.objects.all() + + +class TunnelTerminationBulkImportView(generic.BulkImportView): + queryset = TunnelTermination.objects.all() + model_form = forms.TunnelTerminationImportForm + + +class TunnelTerminationBulkEditView(generic.BulkEditView): + queryset = TunnelTermination.objects.all() + filterset = filtersets.TunnelTerminationFilterSet + table = tables.TunnelTerminationTable + form = forms.TunnelTerminationBulkEditForm + + +class TunnelTerminationBulkDeleteView(generic.BulkDeleteView): + queryset = TunnelTermination.objects.all() + filterset = filtersets.TunnelTerminationFilterSet + table = tables.TunnelTerminationTable + + +# +# IKE proposals +# + +class IKEProposalListView(generic.ObjectListView): + queryset = IKEProposal.objects.all() + filterset = filtersets.IKEProposalFilterSet + filterset_form = forms.IKEProposalFilterForm + table = tables.IKEProposalTable + + +@register_model_view(IKEProposal) +class IKEProposalView(generic.ObjectView): + queryset = IKEProposal.objects.all() + + +@register_model_view(IKEProposal, 'edit') +class IKEProposalEditView(generic.ObjectEditView): + queryset = IKEProposal.objects.all() + form = forms.IKEProposalForm + + +@register_model_view(IKEProposal, 'delete') +class IKEProposalDeleteView(generic.ObjectDeleteView): + queryset = IKEProposal.objects.all() + + +class IKEProposalBulkImportView(generic.BulkImportView): + queryset = IKEProposal.objects.all() + model_form = forms.IKEProposalImportForm + + +class IKEProposalBulkEditView(generic.BulkEditView): + queryset = IKEProposal.objects.all() + filterset = filtersets.IKEProposalFilterSet + table = tables.IKEProposalTable + form = forms.IKEProposalBulkEditForm + + +class IKEProposalBulkDeleteView(generic.BulkDeleteView): + queryset = IKEProposal.objects.all() + filterset = filtersets.IKEProposalFilterSet + table = tables.IKEProposalTable + + +# +# IKE policies +# + +class IKEPolicyListView(generic.ObjectListView): + queryset = IKEPolicy.objects.all() + filterset = filtersets.IKEPolicyFilterSet + filterset_form = forms.IKEPolicyFilterForm + table = tables.IKEPolicyTable + + +@register_model_view(IKEPolicy) +class IKEPolicyView(generic.ObjectView): + queryset = IKEPolicy.objects.all() + + +@register_model_view(IKEPolicy, 'edit') +class IKEPolicyEditView(generic.ObjectEditView): + queryset = IKEPolicy.objects.all() + form = forms.IKEPolicyForm + + +@register_model_view(IKEPolicy, 'delete') +class IKEPolicyDeleteView(generic.ObjectDeleteView): + queryset = IKEPolicy.objects.all() + + +class IKEPolicyBulkImportView(generic.BulkImportView): + queryset = IKEPolicy.objects.all() + model_form = forms.IKEPolicyImportForm + + +class IKEPolicyBulkEditView(generic.BulkEditView): + queryset = IKEPolicy.objects.all() + filterset = filtersets.IKEPolicyFilterSet + table = tables.IKEPolicyTable + form = forms.IKEPolicyBulkEditForm + + +class IKEPolicyBulkDeleteView(generic.BulkDeleteView): + queryset = IKEPolicy.objects.all() + filterset = filtersets.IKEPolicyFilterSet + table = tables.IKEPolicyTable + + +# +# IPSec proposals +# + +class IPSecProposalListView(generic.ObjectListView): + queryset = IPSecProposal.objects.all() + filterset = filtersets.IPSecProposalFilterSet + filterset_form = forms.IPSecProposalFilterForm + table = tables.IPSecProposalTable + + +@register_model_view(IPSecProposal) +class IPSecProposalView(generic.ObjectView): + queryset = IPSecProposal.objects.all() + + +@register_model_view(IPSecProposal, 'edit') +class IPSecProposalEditView(generic.ObjectEditView): + queryset = IPSecProposal.objects.all() + form = forms.IPSecProposalForm + + +@register_model_view(IPSecProposal, 'delete') +class IPSecProposalDeleteView(generic.ObjectDeleteView): + queryset = IPSecProposal.objects.all() + + +class IPSecProposalBulkImportView(generic.BulkImportView): + queryset = IPSecProposal.objects.all() + model_form = forms.IPSecProposalImportForm + + +class IPSecProposalBulkEditView(generic.BulkEditView): + queryset = IPSecProposal.objects.all() + filterset = filtersets.IPSecProposalFilterSet + table = tables.IPSecProposalTable + form = forms.IPSecProposalBulkEditForm + + +class IPSecProposalBulkDeleteView(generic.BulkDeleteView): + queryset = IPSecProposal.objects.all() + filterset = filtersets.IPSecProposalFilterSet + table = tables.IPSecProposalTable + + +# +# IPSec policies +# + +class IPSecPolicyListView(generic.ObjectListView): + queryset = IPSecPolicy.objects.all() + filterset = filtersets.IPSecPolicyFilterSet + filterset_form = forms.IPSecPolicyFilterForm + table = tables.IPSecPolicyTable + + +@register_model_view(IPSecPolicy) +class IPSecPolicyView(generic.ObjectView): + queryset = IPSecPolicy.objects.all() + + +@register_model_view(IPSecPolicy, 'edit') +class IPSecPolicyEditView(generic.ObjectEditView): + queryset = IPSecPolicy.objects.all() + form = forms.IPSecPolicyForm + + +@register_model_view(IPSecPolicy, 'delete') +class IPSecPolicyDeleteView(generic.ObjectDeleteView): + queryset = IPSecPolicy.objects.all() + + +class IPSecPolicyBulkImportView(generic.BulkImportView): + queryset = IPSecPolicy.objects.all() + model_form = forms.IPSecPolicyImportForm + + +class IPSecPolicyBulkEditView(generic.BulkEditView): + queryset = IPSecPolicy.objects.all() + filterset = filtersets.IPSecPolicyFilterSet + table = tables.IPSecPolicyTable + form = forms.IPSecPolicyBulkEditForm + + +class IPSecPolicyBulkDeleteView(generic.BulkDeleteView): + queryset = IPSecPolicy.objects.all() + filterset = filtersets.IPSecPolicyFilterSet + table = tables.IPSecPolicyTable + + +# +# IPSec profiles +# + +class IPSecProfileListView(generic.ObjectListView): + queryset = IPSecProfile.objects.all() + filterset = filtersets.IPSecProfileFilterSet + filterset_form = forms.IPSecProfileFilterForm + table = tables.IPSecProfileTable + + +@register_model_view(IPSecProfile) +class IPSecProfileView(generic.ObjectView): + queryset = IPSecProfile.objects.all() + + +@register_model_view(IPSecProfile, 'edit') +class IPSecProfileEditView(generic.ObjectEditView): + queryset = IPSecProfile.objects.all() + form = forms.IPSecProfileForm + + +@register_model_view(IPSecProfile, 'delete') +class IPSecProfileDeleteView(generic.ObjectDeleteView): + queryset = IPSecProfile.objects.all() + + +class IPSecProfileBulkImportView(generic.BulkImportView): + queryset = IPSecProfile.objects.all() + model_form = forms.IPSecProfileImportForm + + +class IPSecProfileBulkEditView(generic.BulkEditView): + queryset = IPSecProfile.objects.all() + filterset = filtersets.IPSecProfileFilterSet + table = tables.IPSecProfileTable + form = forms.IPSecProfileBulkEditForm + + +class IPSecProfileBulkDeleteView(generic.BulkDeleteView): + queryset = IPSecProfile.objects.all() + filterset = filtersets.IPSecProfileFilterSet + table = tables.IPSecProfileTable From e4989300de45e60843575c3d2be53fa7b2f975a2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 28 Nov 2023 13:11:00 -0500 Subject: [PATCH 106/271] Draft v3.7 release notes --- docs/release-notes/version-3.7.md | 92 +++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 docs/release-notes/version-3.7.md diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md new file mode 100644 index 000000000..292ed4eb0 --- /dev/null +++ b/docs/release-notes/version-3.7.md @@ -0,0 +1,92 @@ +## v3.7-beta1 (FUTURE) + +### Breaking Changes + +* The `ui_visibility` field on the [custom field model](../models/extras/customfield.md) has been replaced with two new fields: `ui_visible` and `ui_editable`. Existing values will be migrated automatically upon upgrade. +* The `FeatureQuery` class for querying content types by model feature has been removed. Plugins should now use the new `with_feature()` manager method on NetBox's proxy model for ContentType. +* The ConfigRevision model has been moved from `extras` to `core`. Configuration history will be retained throughout the upgrade process. +* The L2VPN and L2VPNTermination models have been moved from the `ipam` app to the new `vpn` app. All object data will be retained however please note that the relevant API endpoints have been moved to `/api/vpn/`. +* The `CustomFieldsMixin`, `SavedFiltersMixin`, and `TagsMixin` classes have moved from the `extras.forms.mixins` to `netbox.forms.mixins`. + +### New Features + +#### VPN Tunnels ([#9816](https://github.com/netbox-community/netbox/issues/9816)) + +Several new models have been introduced to enable [VPN tunnel management](../features/vpn-tunnels.md). Users can now define tunnels with two or more terminations to replicate peer-to-peer or hub-and-spoke topologies. Each termination is made to a virtual interface on a device or VM. Additionally, users can define IKE and IPSec policies which can be applied to tunnels to document encryption and authentication strategies. + +#### Virtual Machine Disks ([#8356](https://github.com/netbox-community/netbox/issues/8356)) + +A new [VirtualDisk](../models/virtualization/virtualdisk.md) model has been introduced to enable tracking the assignment of discrete virtual disks to virtual machines. The original `size` field has been retained on the VirtualMachine model, and will be automatically updated with the aggregate size of all assigned virtual disks. (Users who opt to eschew the new model may continue using the VirtualMachine `size` attribute as before.) + +#### Protection Rules ([#10244](https://github.com/netbox-community/netbox/issues/10244)) + +A new [`PROTECTION_RULES`](../configuration/data-validation.md#protection_rules) configuration parameter is now available. Similar to how [custom validation rules](../customization/custom-validation.md) can be used to enforce certain values for object attributes, protection rules guard against the deletion of objects which do not meet specified criteria. This enables an administrator to prevent, for example, the deletion of a site which has a status of "active." + +#### Improved Custom Field Visibility Controls ([#13299](https://github.com/netbox-community/netbox/issues/13299)) + +The old `ui_visible` field on the custom field model](../models/extras/customfield.md) has been replaced by two new fields, `ui_visible` and `ui_editable`, which control how and whether a custom field is displayed when view and editing an object, respectively. Separating these two functions into discrete fields enables more control over how each custom field is presented to users. The values of these fields will be appropriately set automatically during the upgrade process depending on the value of the original field. + +#### Extend Display of Global Search Results ([#14134](https://github.com/netbox-community/netbox/issues/14134)) + +Global search results now include additional context about each object, such as a description, status, and/or related objects. The set of attributes to be displayed is specific to each object type, and is defined by setting `display_attrs` under the object's [SearchIndex class](../plugins/development/search.md#netbox.search.SearchIndex). + +#### Table Column Registration for Plugins ([#14173](https://github.com/netbox-community/netbox/issues/14173)) + +Plugins can now [register their own custom columns](../plugins/development/tables.md#extending-core-tables) for inclusion on core NetBox tables. For example, a plugin can register a new column on SiteTable using the new `register_table_column()` utility function, and it will become available for users to select for display. + +#### Data Backend Registration for Plugins ([#13381](https://github.com/netbox-community/netbox/issues/13381)) + +Plugins can now [register their own data backends](../plugins/development/data-backends.md) for use with [synchronized data sources](../features/synchronized-data.md). This enables plugins to introduce new backends in addition to the git, S3, and local path backends provided natively. + +### Enhancements + +* [#12135](https://github.com/netbox-community/netbox/issues/12135) - Avoid orphaned interfaces by preventing the deletion of interfaces which have children assigned +* [#12216](https://github.com/netbox-community/netbox/issues/12216) - Add a `color` field for circuit types +* [#13230](https://github.com/netbox-community/netbox/issues/13230) - Allow device types to be excluded from consideration when calculating a rack's utilization +* [#13334](https://github.com/netbox-community/netbox/issues/13334) - Added an `error` field to the Job model to record any errors associated with its execution +* [#13427](https://github.com/netbox-community/netbox/issues/13427) - Introduced a mechanism for omitting models from general-purpose lists of object types +* [#13690](https://github.com/netbox-community/netbox/issues/13690) - Display any dependent objects to be deleted prior to deleting an object via the web UI +* [#13794](https://github.com/netbox-community/netbox/issues/13794) - Any models with a relationship to Tenant are now included automatically in the list of related objects under the tenant view +* [#13808](https://github.com/netbox-community/netbox/issues/13808) - Added a `/render-config` REST API endpoint for virtual machines +* [#14035](https://github.com/netbox-community/netbox/issues/14035) - Order objects of equivalent weight by value in global search results to improve readability +* [#14156](https://github.com/netbox-community/netbox/issues/14156) - Enable custom fields for contact assignments + +### Other Changes + +* [#13550](https://github.com/netbox-community/netbox/issues/13550) - Optimized the format for declaring view actions under `ActionsMixin` (backward compatibility has been retained) +* [#13645](https://github.com/netbox-community/netbox/issues/13645) - Installation of the `sentry-sdk` Python library is now required only if Sentry reporting is enabled +* [#14036](https://github.com/netbox-community/netbox/issues/14036) - Move plugin resources from the `extras` app into `netbox` (backward compatibility has been retained) +* [#14153](https://github.com/netbox-community/netbox/issues/14153) - Replace `FeatureQuery` with new `with_feature()` method on ContentType manager +* [#14311](https://github.com/netbox-community/netbox/issues/14311) - Move the L2VPN models from the `ipam` app to the new `vpn` app +* [#14312](https://github.com/netbox-community/netbox/issues/14312) - Move the ConfigRevision model from the `extras` app to `core` +* [#14326](https://github.com/netbox-community/netbox/issues/14326) - Form feature mixin classes have been moved from the `extras` app to `netbox` + +### REST API Changes + +* Introduced the following endpoints: + * `/api/virtualization/virtual-disks/` + * `/api/vpn/ike-policies/` + * `/api/vpn/ike-proposals/` + * `/api/vpn/ipsec-policies/` + * `/api/vpn/ipsec-profiles/` + * `/api/vpn/ipsec-proposals/` + * `/api/vpn/tunnels/` + * `/api/vpn/tunnel-terminations/` +* The following endpoints have been moved: + * `/api/ipam/l2vpns/` -> `/api/vpn/l2vpns/` + * `/api/ipam/l2vpn-terminations/` -> `/api/vpn/l2vpn-terminations/` +* circuits.CircuitType + * Added the optional `color` choice field +* core.Job + * Added the read-only `error` character field +* dcim.DeviceType + * Added the `exclude_from_utilization` boolean field +* extras.CustomField + * Removed the `ui_visibility` field + * Added the `ui_visible` and `ui_editable` choice fields +* tenancy.ContactAssignment + * Added support for custom fields +* virtualization.VirtualDisk + * Added the read-only `virtual_disk_count` integer field +* virtualization.VirtualMachine + * Added the `/render-config` endpoint From 8e7146cd06711b519d9ddd5a18a5e374cd0db0f4 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 28 Nov 2023 13:11:30 -0500 Subject: [PATCH 107/271] v3.7 documentation updates --- docs/models/virtualization/virtualdisk.md | 13 +++++++++++++ docs/plugins/development/models.md | 4 ++++ 2 files changed, 17 insertions(+) create mode 100644 docs/models/virtualization/virtualdisk.md diff --git a/docs/models/virtualization/virtualdisk.md b/docs/models/virtualization/virtualdisk.md new file mode 100644 index 000000000..9d256bb66 --- /dev/null +++ b/docs/models/virtualization/virtualdisk.md @@ -0,0 +1,13 @@ +# Virtual Disks + +A virtual disk is used to model discrete virtual hard disks assigned to [virtual machines](./virtualmachine.md). + +## Fields + +### Name + +A human-friendly name that is unique to the assigned virtual machine. + +### Size + +The allocated disk size, in gigabytes. diff --git a/docs/plugins/development/models.md b/docs/plugins/development/models.md index 8394813f8..46af135e1 100644 --- a/docs/plugins/development/models.md +++ b/docs/plugins/development/models.md @@ -60,6 +60,10 @@ class MyModel(NetBoxModel): This attribute specifies the URL at which the documentation for this model can be reached. By default, it will return `/static/docs/models///`. Plugin models can override this to return a custom URL. For example, you might direct the user to your plugin's documentation hosted on [ReadTheDocs](https://readthedocs.org/). +#### `_netbox_private` + +By default, any model introduced by a plugin will appear in the list of available object types e.g. when creating a custom field or certain dashboard widgets. If your model is intended only for "behind the scenes use" and should not be exposed to end users, set `_netbox_private` to True. This will omit it from the list of general-purpose object types. + ### Enabling Features Individually If you prefer instead to enable only a subset of these features for a plugin model, NetBox provides a discrete "mix-in" class for each feature. You can subclass each of these individually when defining your model. (Your model will also need to inherit from Django's built-in `Model` class.) From d2fea4edc4a095dec92344c645371516d7290218 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 28 Nov 2023 13:45:00 -0500 Subject: [PATCH 108/271] Closes #14311: Move L2VPN models from `ipam` to `vpn` (#14358) * Move L2VPN and L2VPNTermination models from ipam to vpn * Move L2VPN resources from ipam to vpn * Extend migration to update content types * Misc cleanup --- netbox/dcim/api/serializers.py | 6 +- netbox/dcim/filtersets.py | 3 +- netbox/dcim/forms/filtersets.py | 3 +- netbox/dcim/models/device_components.py | 2 +- netbox/dcim/tables/template_code.py | 4 +- netbox/ipam/api/nested_serializers.py | 28 --- netbox/ipam/api/serializers.py | 54 +----- netbox/ipam/api/urls.py | 2 - netbox/ipam/api/views.py | 13 -- netbox/ipam/choices.py | 49 ----- netbox/ipam/constants.py | 6 - netbox/ipam/filtersets.py | 181 +----------------- netbox/ipam/forms/bulk_edit.py | 31 --- netbox/ipam/forms/bulk_import.py | 92 --------- netbox/ipam/forms/filtersets.py | 95 +-------- netbox/ipam/forms/model_forms.py | 96 ---------- netbox/ipam/graphql/schema.py | 17 +- netbox/ipam/graphql/types.py | 19 -- netbox/ipam/migrations/0068_move_l2vpn.py | 64 +++++++ netbox/ipam/models/__init__.py | 22 --- netbox/ipam/models/vlans.py | 3 +- netbox/ipam/search.py | 14 +- netbox/ipam/tables/__init__.py | 1 - netbox/ipam/tests/test_api.py | 93 --------- netbox/ipam/tests/test_filtersets.py | 162 +--------------- netbox/ipam/tests/test_models.py | 80 +------- netbox/ipam/tests/test_views.py | 141 +------------- netbox/ipam/urls.py | 16 -- netbox/ipam/views.py | 113 +---------- netbox/netbox/navigation/menu.py | 4 +- netbox/templates/ipam/routetarget.html | 4 +- netbox/templates/{ipam => vpn}/l2vpn.html | 8 +- .../{ipam => vpn}/l2vpntermination.html | 2 +- .../{ipam => vpn}/l2vpntermination_edit.html | 0 netbox/virtualization/api/serializers.py | 5 +- netbox/virtualization/forms/filtersets.py | 3 +- .../virtualization/models/virtualmachines.py | 2 +- .../virtualization/tables/virtualmachines.py | 4 +- netbox/vpn/api/nested_serializers.py | 27 +++ netbox/vpn/api/serializers.py | 56 +++++- netbox/vpn/api/urls.py | 2 + netbox/vpn/api/views.py | 14 ++ netbox/vpn/choices.py | 53 +++++ netbox/vpn/constants.py | 7 + netbox/vpn/filtersets.py | 180 ++++++++++++++++- netbox/vpn/forms/bulk_edit.py | 31 +++ netbox/vpn/forms/bulk_import.py | 94 ++++++++- netbox/vpn/forms/filtersets.py | 99 +++++++++- netbox/vpn/forms/model_forms.py | 100 +++++++++- netbox/vpn/graphql/gfk_mixins.py | 30 +++ netbox/vpn/graphql/schema.py | 12 ++ netbox/vpn/graphql/types.py | 22 ++- netbox/vpn/migrations/0002_move_l2vpn.py | 73 +++++++ netbox/vpn/models/__init__.py | 1 + netbox/{ipam => vpn}/models/l2vpn.py | 14 +- netbox/vpn/search.py | 12 ++ netbox/vpn/tables/__init__.py | 3 + netbox/vpn/{tables.py => tables/crypto.py} | 81 -------- netbox/{ipam => vpn}/tables/l2vpn.py | 6 +- netbox/vpn/tables/tunnels.py | 87 +++++++++ netbox/vpn/tests/test_api.py | 94 +++++++++ netbox/vpn/tests/test_filtersets.py | 169 +++++++++++++++- netbox/vpn/tests/test_models.py | 79 ++++++++ netbox/vpn/tests/test_views.py | 142 +++++++++++++- netbox/vpn/urls.py | 16 ++ netbox/vpn/views.py | 111 +++++++++++ 66 files changed, 1616 insertions(+), 1441 deletions(-) create mode 100644 netbox/ipam/migrations/0068_move_l2vpn.py rename netbox/templates/{ipam => vpn}/l2vpn.html (85%) rename netbox/templates/{ipam => vpn}/l2vpntermination.html (96%) rename netbox/templates/{ipam => vpn}/l2vpntermination_edit.html (100%) create mode 100644 netbox/vpn/constants.py create mode 100644 netbox/vpn/graphql/gfk_mixins.py create mode 100644 netbox/vpn/migrations/0002_move_l2vpn.py rename netbox/{ipam => vpn}/models/l2vpn.py (93%) create mode 100644 netbox/vpn/tables/__init__.py rename netbox/vpn/{tables.py => tables/crypto.py} (65%) rename netbox/{ipam => vpn}/tables/l2vpn.py (96%) create mode 100644 netbox/vpn/tables/tunnels.py create mode 100644 netbox/vpn/tests/test_models.py diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 32dcdc5bb..09933f2de 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -2,8 +2,8 @@ import decimal from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext as _ -from drf_spectacular.utils import extend_schema_field from drf_spectacular.types import OpenApiTypes +from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from timezone_field.rest_framework import TimeZoneSerializerField @@ -12,8 +12,7 @@ from dcim.constants import * from dcim.models import * from extras.api.nested_serializers import NestedConfigTemplateSerializer from ipam.api.nested_serializers import ( - NestedASNSerializer, NestedIPAddressSerializer, NestedL2VPNTerminationSerializer, NestedVLANSerializer, - NestedVRFSerializer, + NestedASNSerializer, NestedIPAddressSerializer, NestedVLANSerializer, NestedVRFSerializer, ) from ipam.models import ASN, VLAN from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField @@ -27,6 +26,7 @@ from tenancy.api.nested_serializers import NestedTenantSerializer from users.api.nested_serializers import NestedUserSerializer from utilities.api import get_serializer_for_model from virtualization.api.nested_serializers import NestedClusterSerializer +from vpn.api.nested_serializers import NestedL2VPNTerminationSerializer from wireless.api.nested_serializers import NestedWirelessLANSerializer, NestedWirelessLinkSerializer from wireless.choices import * from wireless.models import WirelessLAN diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index ffd3879a8..36540f3e3 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -5,7 +5,7 @@ from django.utils.translation import gettext as _ from extras.filtersets import LocalConfigContextFilterSet from extras.models import ConfigTemplate from ipam.filtersets import PrimaryIPFilterSet -from ipam.models import ASN, L2VPN, IPAddress, VRF +from ipam.models import ASN, IPAddress, VRF from netbox.filtersets import ( BaseFilterSet, ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet, ) @@ -17,6 +17,7 @@ from utilities.filters import ( TreeNodeMultipleChoiceFilter, ) from virtualization.models import Cluster +from vpn.models import L2VPN from wireless.choices import WirelessRoleChoices, WirelessChannelChoices from .choices import * from .constants import * diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index d0d321187..1c8713a28 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -7,12 +7,13 @@ from dcim.constants import * from dcim.models import * from extras.forms import LocalConfigContextFilterForm from extras.models import ConfigTemplate -from ipam.models import ASN, L2VPN, VRF +from ipam.models import ASN, VRF from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.widgets import APISelectMultiple, NumberWithOptions +from vpn.models import L2VPN from wireless.choices import * __all__ = ( diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 705af7637..94ae2d6a6 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -730,7 +730,7 @@ class Interface(ModularComponentModel, BaseInterface, CabledObjectModel, PathEnd related_query_name='interface' ) l2vpn_terminations = GenericRelation( - to='ipam.L2VPNTermination', + to='vpn.L2VPNTermination', content_type_field='assigned_object_type', object_id_field='assigned_object_id', related_query_name='interface', diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index a24f9ea6d..bf2ce9de4 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -316,8 +316,8 @@ INTERFACE_BUTTONS = """ {% if perms.dcim.add_interface %}
  • Child Interface
  • {% endif %} - {% if perms.ipam.add_l2vpntermination %} -
  • L2VPN Termination
  • + {% if perms.vpn.add_l2vpntermination %} +
  • L2VPN Termination
  • {% endif %} {% if perms.ipam.add_fhrpgroupassignment %}
  • Assign FHRP Group
  • diff --git a/netbox/ipam/api/nested_serializers.py b/netbox/ipam/api/nested_serializers.py index 9e150e2cb..17d8d74a7 100644 --- a/netbox/ipam/api/nested_serializers.py +++ b/netbox/ipam/api/nested_serializers.py @@ -2,7 +2,6 @@ from drf_spectacular.utils import extend_schema_serializer from rest_framework import serializers from ipam import models -from ipam.models.l2vpn import L2VPNTermination, L2VPN from netbox.api.serializers import WritableNestedSerializer from .field_serializers import IPAddressField @@ -14,8 +13,6 @@ __all__ = [ 'NestedFHRPGroupAssignmentSerializer', 'NestedIPAddressSerializer', 'NestedIPRangeSerializer', - 'NestedL2VPNSerializer', - 'NestedL2VPNTerminationSerializer', 'NestedPrefixSerializer', 'NestedRIRSerializer', 'NestedRoleSerializer', @@ -223,28 +220,3 @@ class NestedServiceSerializer(WritableNestedSerializer): class Meta: model = models.Service fields = ['id', 'url', 'display', 'name', 'protocol', 'ports'] - -# -# L2VPN -# - - -class NestedL2VPNSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:l2vpn-detail') - - class Meta: - model = L2VPN - fields = [ - 'id', 'url', 'display', 'identifier', 'name', 'slug', 'type' - ] - - -class NestedL2VPNTerminationSerializer(WritableNestedSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:l2vpntermination-detail') - l2vpn = NestedL2VPNSerializer() - - class Meta: - model = L2VPNTermination - fields = [ - 'id', 'url', 'display', 'l2vpn' - ] diff --git a/netbox/ipam/api/serializers.py b/netbox/ipam/api/serializers.py index 6882de56d..33aa55a93 100644 --- a/netbox/ipam/api/serializers.py +++ b/netbox/ipam/api/serializers.py @@ -12,8 +12,9 @@ from netbox.constants import NESTED_SERIALIZER_PREFIX from tenancy.api.nested_serializers import NestedTenantSerializer from utilities.api import get_serializer_for_model from virtualization.api.nested_serializers import NestedVirtualMachineSerializer -from .nested_serializers import * +from vpn.api.nested_serializers import NestedL2VPNTerminationSerializer from .field_serializers import IPAddressField, IPNetworkField +from .nested_serializers import * # @@ -479,54 +480,3 @@ class ServiceSerializer(NetBoxModelSerializer): 'id', 'url', 'display', 'device', 'virtual_machine', 'name', 'ports', 'protocol', 'ipaddresses', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] - -# -# L2VPN -# - - -class L2VPNSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:l2vpn-detail') - type = ChoiceField(choices=L2VPNTypeChoices, required=False) - import_targets = SerializedPKRelatedField( - queryset=RouteTarget.objects.all(), - serializer=NestedRouteTargetSerializer, - required=False, - many=True - ) - export_targets = SerializedPKRelatedField( - queryset=RouteTarget.objects.all(), - serializer=NestedRouteTargetSerializer, - required=False, - many=True - ) - tenant = NestedTenantSerializer(required=False, allow_null=True) - - class Meta: - model = L2VPN - fields = [ - 'id', 'url', 'display', 'identifier', 'name', 'slug', 'type', 'import_targets', 'export_targets', - 'description', 'comments', 'tenant', 'tags', 'custom_fields', 'created', 'last_updated' - ] - - -class L2VPNTerminationSerializer(NetBoxModelSerializer): - url = serializers.HyperlinkedIdentityField(view_name='ipam-api:l2vpntermination-detail') - l2vpn = NestedL2VPNSerializer() - assigned_object_type = ContentTypeField( - queryset=ContentType.objects.all() - ) - assigned_object = serializers.SerializerMethodField(read_only=True) - - class Meta: - model = L2VPNTermination - fields = [ - 'id', 'url', 'display', 'l2vpn', 'assigned_object_type', 'assigned_object_id', - 'assigned_object', 'tags', 'custom_fields', 'created', 'last_updated' - ] - - @extend_schema_field(serializers.JSONField(allow_null=True)) - def get_assigned_object(self, instance): - serializer = get_serializer_for_model(instance.assigned_object, prefix=NESTED_SERIALIZER_PREFIX) - context = {'request': self.context['request']} - return serializer(instance.assigned_object, context=context).data diff --git a/netbox/ipam/api/urls.py b/netbox/ipam/api/urls.py index 442fd2240..bae9d8048 100644 --- a/netbox/ipam/api/urls.py +++ b/netbox/ipam/api/urls.py @@ -23,8 +23,6 @@ router.register('vlan-groups', views.VLANGroupViewSet) router.register('vlans', views.VLANViewSet) router.register('service-templates', views.ServiceTemplateViewSet) router.register('services', views.ServiceViewSet) -router.register('l2vpns', views.L2VPNViewSet) -router.register('l2vpn-terminations', views.L2VPNTerminationViewSet) app_name = 'ipam-api' diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index 662b393de..688fe42e2 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -14,7 +14,6 @@ from circuits.models import Provider from dcim.models import Site from ipam import filtersets from ipam.models import * -from ipam.models import L2VPN, L2VPNTermination from ipam.utils import get_next_available_prefix from netbox.api.viewsets import NetBoxModelViewSet from netbox.api.viewsets.mixins import ObjectValidationMixin @@ -178,18 +177,6 @@ class ServiceViewSet(NetBoxModelViewSet): filterset_class = filtersets.ServiceFilterSet -class L2VPNViewSet(NetBoxModelViewSet): - queryset = L2VPN.objects.prefetch_related('import_targets', 'export_targets', 'tenant', 'tags') - serializer_class = serializers.L2VPNSerializer - filterset_class = filtersets.L2VPNFilterSet - - -class L2VPNTerminationViewSet(NetBoxModelViewSet): - queryset = L2VPNTermination.objects.prefetch_related('assigned_object') - serializer_class = serializers.L2VPNTerminationSerializer - filterset_class = filtersets.L2VPNTerminationFilterSet - - # # Views # diff --git a/netbox/ipam/choices.py b/netbox/ipam/choices.py index 436cbd040..017fd0430 100644 --- a/netbox/ipam/choices.py +++ b/netbox/ipam/choices.py @@ -172,52 +172,3 @@ class ServiceProtocolChoices(ChoiceSet): (PROTOCOL_UDP, 'UDP'), (PROTOCOL_SCTP, 'SCTP'), ) - - -class L2VPNTypeChoices(ChoiceSet): - TYPE_VPLS = 'vpls' - TYPE_VPWS = 'vpws' - TYPE_EPL = 'epl' - TYPE_EVPL = 'evpl' - TYPE_EPLAN = 'ep-lan' - TYPE_EVPLAN = 'evp-lan' - TYPE_EPTREE = 'ep-tree' - TYPE_EVPTREE = 'evp-tree' - TYPE_VXLAN = 'vxlan' - TYPE_VXLAN_EVPN = 'vxlan-evpn' - TYPE_MPLS_EVPN = 'mpls-evpn' - TYPE_PBB_EVPN = 'pbb-evpn' - - CHOICES = ( - ('VPLS', ( - (TYPE_VPWS, 'VPWS'), - (TYPE_VPLS, 'VPLS'), - )), - ('VXLAN', ( - (TYPE_VXLAN, 'VXLAN'), - (TYPE_VXLAN_EVPN, 'VXLAN-EVPN'), - )), - ('L2VPN E-VPN', ( - (TYPE_MPLS_EVPN, 'MPLS EVPN'), - (TYPE_PBB_EVPN, 'PBB EVPN'), - )), - ('E-Line', ( - (TYPE_EPL, 'EPL'), - (TYPE_EVPL, 'EVPL'), - )), - ('E-LAN', ( - (TYPE_EPLAN, 'Ethernet Private LAN'), - (TYPE_EVPLAN, 'Ethernet Virtual Private LAN'), - )), - ('E-Tree', ( - (TYPE_EPTREE, 'Ethernet Private Tree'), - (TYPE_EVPTREE, 'Ethernet Virtual Private Tree'), - )), - ) - - P2P = ( - TYPE_VPWS, - TYPE_EPL, - TYPE_EPLAN, - TYPE_EPTREE - ) diff --git a/netbox/ipam/constants.py b/netbox/ipam/constants.py index f26fce2b5..6dffd3287 100644 --- a/netbox/ipam/constants.py +++ b/netbox/ipam/constants.py @@ -86,9 +86,3 @@ VLANGROUP_SCOPE_TYPES = ( # 16-bit port number SERVICE_PORT_MIN = 1 SERVICE_PORT_MAX = 65535 - -L2VPN_ASSIGNMENT_MODELS = Q( - Q(app_label='dcim', model='interface') | - Q(app_label='ipam', model='vlan') | - Q(app_label='virtualization', model='vminterface') -) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index ba944e3ad..08d22dd23 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -4,8 +4,8 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.db.models import Q from django.utils.translation import gettext as _ -from drf_spectacular.utils import extend_schema_field from drf_spectacular.types import OpenApiTypes +from drf_spectacular.utils import extend_schema_field from netaddr.core import AddrFormatError from dcim.models import Device, Interface, Region, Site, SiteGroup @@ -15,6 +15,7 @@ from utilities.filters import ( ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter, NumericArrayFilter, TreeNodeMultipleChoiceFilter, ) from virtualization.models import VirtualMachine, VMInterface +from vpn.models import L2VPN from .choices import * from .models import * @@ -26,8 +27,6 @@ __all__ = ( 'FHRPGroupFilterSet', 'IPAddressFilterSet', 'IPRangeFilterSet', - 'L2VPNFilterSet', - 'L2VPNTerminationFilterSet', 'PrefixFilterSet', 'PrimaryIPFilterSet', 'RIRFilterSet', @@ -1059,182 +1058,6 @@ class ServiceFilterSet(NetBoxModelFilterSet): return queryset.filter(qs_filter) -# -# L2VPN -# - -class L2VPNFilterSet(NetBoxModelFilterSet, TenancyFilterSet): - type = django_filters.MultipleChoiceFilter( - choices=L2VPNTypeChoices, - null_value=None - ) - import_target_id = django_filters.ModelMultipleChoiceFilter( - field_name='import_targets', - queryset=RouteTarget.objects.all(), - label=_('Import target'), - ) - import_target = django_filters.ModelMultipleChoiceFilter( - field_name='import_targets__name', - queryset=RouteTarget.objects.all(), - to_field_name='name', - label=_('Import target (name)'), - ) - export_target_id = django_filters.ModelMultipleChoiceFilter( - field_name='export_targets', - queryset=RouteTarget.objects.all(), - label=_('Export target'), - ) - export_target = django_filters.ModelMultipleChoiceFilter( - field_name='export_targets__name', - queryset=RouteTarget.objects.all(), - to_field_name='name', - label=_('Export target (name)'), - ) - - class Meta: - model = L2VPN - fields = ['id', 'identifier', 'name', 'slug', 'type', 'description'] - - def search(self, queryset, name, value): - if not value.strip(): - return queryset - qs_filter = Q(name__icontains=value) | Q(description__icontains=value) - try: - qs_filter |= Q(identifier=int(value)) - except ValueError: - pass - return queryset.filter(qs_filter) - - -class L2VPNTerminationFilterSet(NetBoxModelFilterSet): - l2vpn_id = django_filters.ModelMultipleChoiceFilter( - queryset=L2VPN.objects.all(), - label=_('L2VPN (ID)'), - ) - l2vpn = django_filters.ModelMultipleChoiceFilter( - field_name='l2vpn__slug', - queryset=L2VPN.objects.all(), - to_field_name='slug', - label=_('L2VPN (slug)'), - ) - region = MultiValueCharFilter( - method='filter_region', - field_name='slug', - label=_('Region (slug)'), - ) - region_id = MultiValueNumberFilter( - method='filter_region', - field_name='pk', - label=_('Region (ID)'), - ) - site = MultiValueCharFilter( - method='filter_site', - field_name='slug', - label=_('Site (slug)'), - ) - site_id = MultiValueNumberFilter( - method='filter_site', - field_name='pk', - label=_('Site (ID)'), - ) - device = django_filters.ModelMultipleChoiceFilter( - field_name='interface__device__name', - queryset=Device.objects.all(), - to_field_name='name', - label=_('Device (name)'), - ) - device_id = django_filters.ModelMultipleChoiceFilter( - field_name='interface__device', - queryset=Device.objects.all(), - label=_('Device (ID)'), - ) - virtual_machine = django_filters.ModelMultipleChoiceFilter( - field_name='vminterface__virtual_machine__name', - queryset=VirtualMachine.objects.all(), - to_field_name='name', - label=_('Virtual machine (name)'), - ) - virtual_machine_id = django_filters.ModelMultipleChoiceFilter( - field_name='vminterface__virtual_machine', - queryset=VirtualMachine.objects.all(), - label=_('Virtual machine (ID)'), - ) - interface = django_filters.ModelMultipleChoiceFilter( - field_name='interface__name', - queryset=Interface.objects.all(), - to_field_name='name', - label=_('Interface (name)'), - ) - interface_id = django_filters.ModelMultipleChoiceFilter( - field_name='interface', - queryset=Interface.objects.all(), - label=_('Interface (ID)'), - ) - vminterface = django_filters.ModelMultipleChoiceFilter( - field_name='vminterface__name', - queryset=VMInterface.objects.all(), - to_field_name='name', - label=_('VM interface (name)'), - ) - vminterface_id = django_filters.ModelMultipleChoiceFilter( - field_name='vminterface', - queryset=VMInterface.objects.all(), - label=_('VM Interface (ID)'), - ) - vlan = django_filters.ModelMultipleChoiceFilter( - field_name='vlan__name', - queryset=VLAN.objects.all(), - to_field_name='name', - label=_('VLAN (name)'), - ) - vlan_vid = django_filters.NumberFilter( - field_name='vlan__vid', - label=_('VLAN number (1-4094)'), - ) - vlan_id = django_filters.ModelMultipleChoiceFilter( - field_name='vlan', - queryset=VLAN.objects.all(), - label=_('VLAN (ID)'), - ) - assigned_object_type = ContentTypeFilter() - - class Meta: - model = L2VPNTermination - fields = ('id', 'assigned_object_type_id') - - def search(self, queryset, name, value): - if not value.strip(): - return queryset - qs_filter = Q(l2vpn__name__icontains=value) - return queryset.filter(qs_filter) - - def filter_assigned_object(self, queryset, name, value): - qs = queryset.filter( - Q(**{'{}__in'.format(name): value}) - ) - return qs - - def filter_site(self, queryset, name, value): - qs = queryset.filter( - Q( - Q(**{'vlan__site__{}__in'.format(name): value}) | - Q(**{'interface__device__site__{}__in'.format(name): value}) | - Q(**{'vminterface__virtual_machine__site__{}__in'.format(name): value}) - ) - ) - return qs - - def filter_region(self, queryset, name, value): - qs = queryset.filter( - Q( - Q(**{'vlan__site__region__{}__in'.format(name): value}) | - Q(**{'interface__device__site__region__{}__in'.format(name): value}) | - Q(**{'vminterface__virtual_machine__site__region__{}__in'.format(name): value}) - ) - ) - return qs - - class PrimaryIPFilterSet(django_filters.FilterSet): """ An inheritable FilterSet for models which support primary IP assignment. diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index f0a8286fc..bf4825be9 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -23,8 +23,6 @@ __all__ = ( 'FHRPGroupBulkEditForm', 'IPAddressBulkEditForm', 'IPRangeBulkEditForm', - 'L2VPNBulkEditForm', - 'L2VPNTerminationBulkEditForm', 'PrefixBulkEditForm', 'RIRBulkEditForm', 'RoleBulkEditForm', @@ -596,32 +594,3 @@ class ServiceTemplateBulkEditForm(NetBoxModelBulkEditForm): class ServiceBulkEditForm(ServiceTemplateBulkEditForm): model = Service - - -class L2VPNBulkEditForm(NetBoxModelBulkEditForm): - type = forms.ChoiceField( - label=_('Type'), - choices=add_blank_choice(L2VPNTypeChoices), - required=False - ) - tenant = DynamicModelChoiceField( - label=_('Tenant'), - queryset=Tenant.objects.all(), - required=False - ) - description = forms.CharField( - label=_('Description'), - max_length=200, - required=False - ) - comments = CommentField() - - model = L2VPN - fieldsets = ( - (None, ('type', 'tenant', 'description')), - ) - nullable_fields = ('tenant', 'description', 'comments') - - -class L2VPNTerminationBulkEditForm(NetBoxModelBulkEditForm): - model = L2VPN diff --git a/netbox/ipam/forms/bulk_import.py b/netbox/ipam/forms/bulk_import.py index ed3ceec2b..0627a6765 100644 --- a/netbox/ipam/forms/bulk_import.py +++ b/netbox/ipam/forms/bulk_import.py @@ -1,6 +1,5 @@ from django import forms from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from dcim.models import Device, Interface, Site @@ -21,8 +20,6 @@ __all__ = ( 'FHRPGroupImportForm', 'IPAddressImportForm', 'IPRangeImportForm', - 'L2VPNImportForm', - 'L2VPNTerminationImportForm', 'PrefixImportForm', 'RIRImportForm', 'RoleImportForm', @@ -529,92 +526,3 @@ class ServiceImportForm(NetBoxModelImportForm): ) return self.cleaned_data['ipaddresses'] - - -class L2VPNImportForm(NetBoxModelImportForm): - tenant = CSVModelChoiceField( - label=_('Tenant'), - queryset=Tenant.objects.all(), - required=False, - to_field_name='name', - ) - type = CSVChoiceField( - label=_('Type'), - choices=L2VPNTypeChoices, - help_text=_('L2VPN type') - ) - - class Meta: - model = L2VPN - fields = ('identifier', 'name', 'slug', 'tenant', 'type', 'description', - 'comments', 'tags') - - -class L2VPNTerminationImportForm(NetBoxModelImportForm): - l2vpn = CSVModelChoiceField( - queryset=L2VPN.objects.all(), - required=True, - to_field_name='name', - label=_('L2VPN'), - ) - device = CSVModelChoiceField( - label=_('Device'), - queryset=Device.objects.all(), - required=False, - to_field_name='name', - help_text=_('Parent device (for interface)') - ) - virtual_machine = CSVModelChoiceField( - label=_('Virtual machine'), - queryset=VirtualMachine.objects.all(), - required=False, - to_field_name='name', - help_text=_('Parent virtual machine (for interface)') - ) - interface = CSVModelChoiceField( - label=_('Interface'), - queryset=Interface.objects.none(), # Can also refer to VMInterface - required=False, - to_field_name='name', - help_text=_('Assigned interface (device or VM)') - ) - vlan = CSVModelChoiceField( - label=_('VLAN'), - queryset=VLAN.objects.all(), - required=False, - to_field_name='name', - help_text=_('Assigned VLAN') - ) - - class Meta: - model = L2VPNTermination - fields = ('l2vpn', 'device', 'virtual_machine', 'interface', 'vlan', 'tags') - - def __init__(self, data=None, *args, **kwargs): - super().__init__(data, *args, **kwargs) - - if data: - - # Limit interface queryset by device or VM - if data.get('device'): - self.fields['interface'].queryset = Interface.objects.filter( - **{f"device__{self.fields['device'].to_field_name}": data['device']} - ) - elif data.get('virtual_machine'): - self.fields['interface'].queryset = VMInterface.objects.filter( - **{f"virtual_machine__{self.fields['virtual_machine'].to_field_name}": data['virtual_machine']} - ) - - def clean(self): - super().clean() - - if self.cleaned_data.get('device') and self.cleaned_data.get('virtual_machine'): - raise ValidationError(_('Cannot import device and VM interface terminations simultaneously.')) - if not self.instance and not (self.cleaned_data.get('interface') or self.cleaned_data.get('vlan')): - raise ValidationError(_('Each termination must specify either an interface or a VLAN.')) - if self.cleaned_data.get('interface') and self.cleaned_data.get('vlan'): - raise ValidationError(_('Cannot assign both an interface and a VLAN.')) - - # if this is an update we might not have interface or vlan in the form data - if self.cleaned_data.get('interface') or self.cleaned_data.get('vlan'): - self.instance.assigned_object = self.cleaned_data.get('interface') or self.cleaned_data.get('vlan') diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index a8ca91901..c7dad372d 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -1,5 +1,4 @@ from django import forms -from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext_lazy as _ from dcim.models import Location, Rack, Region, Site, SiteGroup, Device @@ -9,10 +8,9 @@ from ipam.models import * from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import TenancyFilterForm from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, add_blank_choice -from utilities.forms.fields import ( - ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField, -) +from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField from virtualization.models import VirtualMachine +from vpn.models import L2VPN __all__ = ( 'AggregateFilterForm', @@ -21,8 +19,6 @@ __all__ = ( 'FHRPGroupFilterForm', 'IPAddressFilterForm', 'IPRangeFilterForm', - 'L2VPNFilterForm', - 'L2VPNTerminationFilterForm', 'PrefixFilterForm', 'RIRFilterForm', 'RoleFilterForm', @@ -539,90 +535,3 @@ class ServiceFilterForm(ServiceTemplateFilterForm): label=_('Virtual Machine'), ) tag = TagFilterField(model) - - -class L2VPNFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): - model = L2VPN - fieldsets = ( - (None, ('q', 'filter_id', 'tag')), - (_('Attributes'), ('type', 'import_target_id', 'export_target_id')), - (_('Tenant'), ('tenant_group_id', 'tenant_id')), - ) - type = forms.ChoiceField( - label=_('Type'), - choices=add_blank_choice(L2VPNTypeChoices), - required=False - ) - import_target_id = DynamicModelMultipleChoiceField( - queryset=RouteTarget.objects.all(), - required=False, - label=_('Import targets') - ) - export_target_id = DynamicModelMultipleChoiceField( - queryset=RouteTarget.objects.all(), - required=False, - label=_('Export targets') - ) - tag = TagFilterField(model) - - -class L2VPNTerminationFilterForm(NetBoxModelFilterSetForm): - model = L2VPNTermination - fieldsets = ( - (None, ('filter_id', 'l2vpn_id',)), - (_('Assigned Object'), ( - 'assigned_object_type_id', 'region_id', 'site_id', 'device_id', 'virtual_machine_id', 'vlan_id', - )), - ) - l2vpn_id = DynamicModelChoiceField( - queryset=L2VPN.objects.all(), - required=False, - label=_('L2VPN') - ) - assigned_object_type_id = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.filter(L2VPN_ASSIGNMENT_MODELS), - required=False, - label=_('Assigned Object Type'), - limit_choices_to=L2VPN_ASSIGNMENT_MODELS - ) - region_id = DynamicModelMultipleChoiceField( - queryset=Region.objects.all(), - required=False, - label=_('Region') - ) - site_id = DynamicModelMultipleChoiceField( - queryset=Site.objects.all(), - required=False, - null_option='None', - query_params={ - 'region_id': '$region_id' - }, - label=_('Site') - ) - device_id = DynamicModelMultipleChoiceField( - queryset=Device.objects.all(), - required=False, - null_option='None', - query_params={ - 'site_id': '$site_id' - }, - label=_('Device') - ) - vlan_id = DynamicModelMultipleChoiceField( - queryset=VLAN.objects.all(), - required=False, - null_option='None', - query_params={ - 'site_id': '$site_id' - }, - label=_('VLAN') - ) - virtual_machine_id = DynamicModelMultipleChoiceField( - queryset=VirtualMachine.objects.all(), - required=False, - null_option='None', - query_params={ - 'site_id': '$site_id' - }, - label=_('Virtual Machine') - ) diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index dd9e6b3e4..6c445ef27 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -29,8 +29,6 @@ __all__ = ( 'IPAddressBulkAddForm', 'IPAddressForm', 'IPRangeForm', - 'L2VPNForm', - 'L2VPNTerminationForm', 'PrefixForm', 'RIRForm', 'RoleForm', @@ -754,97 +752,3 @@ class ServiceCreateForm(ServiceForm): self.cleaned_data['description'] = service_template.description elif not all(self.cleaned_data[f] for f in ('name', 'protocol', 'ports')): raise forms.ValidationError("Must specify name, protocol, and port(s) if not using a service template.") - - -# -# L2VPN -# - - -class L2VPNForm(TenancyForm, NetBoxModelForm): - slug = SlugField() - import_targets = DynamicModelMultipleChoiceField( - label=_('Import targets'), - queryset=RouteTarget.objects.all(), - required=False - ) - export_targets = DynamicModelMultipleChoiceField( - label=_('Export targets'), - queryset=RouteTarget.objects.all(), - required=False - ) - comments = CommentField() - - fieldsets = ( - (_('L2VPN'), ('name', 'slug', 'type', 'identifier', 'description', 'tags')), - (_('Route Targets'), ('import_targets', 'export_targets')), - (_('Tenancy'), ('tenant_group', 'tenant')), - ) - - class Meta: - model = L2VPN - fields = ( - 'name', 'slug', 'type', 'identifier', 'import_targets', 'export_targets', 'tenant', 'description', - 'comments', 'tags' - ) - - -class L2VPNTerminationForm(NetBoxModelForm): - l2vpn = DynamicModelChoiceField( - queryset=L2VPN.objects.all(), - required=True, - query_params={}, - label=_('L2VPN'), - fetch_trigger='open' - ) - vlan = DynamicModelChoiceField( - queryset=VLAN.objects.all(), - required=False, - selector=True, - label=_('VLAN') - ) - interface = DynamicModelChoiceField( - label=_('Interface'), - queryset=Interface.objects.all(), - required=False, - selector=True - ) - vminterface = DynamicModelChoiceField( - queryset=VMInterface.objects.all(), - required=False, - selector=True, - label=_('Interface') - ) - - class Meta: - model = L2VPNTermination - fields = ('l2vpn', ) - - def __init__(self, *args, **kwargs): - instance = kwargs.get('instance') - initial = kwargs.get('initial', {}).copy() - - if instance: - if type(instance.assigned_object) is Interface: - initial['interface'] = instance.assigned_object - elif type(instance.assigned_object) is VLAN: - initial['vlan'] = instance.assigned_object - elif type(instance.assigned_object) is VMInterface: - initial['vminterface'] = instance.assigned_object - kwargs['initial'] = initial - - super().__init__(*args, **kwargs) - - def clean(self): - super().clean() - - interface = self.cleaned_data.get('interface') - vminterface = self.cleaned_data.get('vminterface') - vlan = self.cleaned_data.get('vlan') - - if not (interface or vminterface or vlan): - raise ValidationError(_('A termination must specify an interface or VLAN.')) - if len([x for x in (interface, vminterface, vlan) if x]) > 1: - raise ValidationError(_('A termination can only have one terminating object (an interface or VLAN).')) - - self.instance.assigned_object = interface or vminterface or vlan diff --git a/netbox/ipam/graphql/schema.py b/netbox/ipam/graphql/schema.py index 596b5eb78..6627c540e 100644 --- a/netbox/ipam/graphql/schema.py +++ b/netbox/ipam/graphql/schema.py @@ -1,9 +1,8 @@ import graphene + from ipam import models -from utilities.graphql_optimizer import gql_query_optimizer - from netbox.graphql.fields import ObjectField, ObjectListField - +from utilities.graphql_optimizer import gql_query_optimizer from .types import * @@ -38,18 +37,6 @@ class IPAMQuery(graphene.ObjectType): def resolve_ip_range_list(root, info, **kwargs): return gql_query_optimizer(models.IPRange.objects.all(), info) - l2vpn = ObjectField(L2VPNType) - l2vpn_list = ObjectListField(L2VPNType) - - def resolve_l2vpn_list(root, info, **kwargs): - return gql_query_optimizer(models.L2VPN.objects.all(), info) - - l2vpn_termination = ObjectField(L2VPNTerminationType) - l2vpn_termination_list = ObjectListField(L2VPNTerminationType) - - def resolve_l2vpn_termination_list(root, info, **kwargs): - return gql_query_optimizer(models.L2VPNTermination.objects.all(), info) - prefix = ObjectField(PrefixType) prefix_list = ObjectListField(PrefixType) diff --git a/netbox/ipam/graphql/types.py b/netbox/ipam/graphql/types.py index 6e834512e..b4350f9f2 100644 --- a/netbox/ipam/graphql/types.py +++ b/netbox/ipam/graphql/types.py @@ -1,6 +1,5 @@ import graphene -from extras.graphql.mixins import ContactsMixin from ipam import filtersets, models from netbox.graphql.scalars import BigInt from netbox.graphql.types import BaseObjectType, OrganizationalObjectType, NetBoxObjectType @@ -13,8 +12,6 @@ __all__ = ( 'FHRPGroupAssignmentType', 'IPAddressType', 'IPRangeType', - 'L2VPNType', - 'L2VPNTerminationType', 'PrefixType', 'RIRType', 'RoleType', @@ -188,19 +185,3 @@ class VRFType(NetBoxObjectType): model = models.VRF fields = '__all__' filterset_class = filtersets.VRFFilterSet - - -class L2VPNType(ContactsMixin, NetBoxObjectType): - class Meta: - model = models.L2VPN - fields = '__all__' - filtersets_class = filtersets.L2VPNFilterSet - - -class L2VPNTerminationType(NetBoxObjectType): - assigned_object = graphene.Field('ipam.graphql.gfk_mixins.L2VPNAssignmentType') - - class Meta: - model = models.L2VPNTermination - exclude = ('assigned_object_type', 'assigned_object_id') - filtersets_class = filtersets.L2VPNTerminationFilterSet diff --git a/netbox/ipam/migrations/0068_move_l2vpn.py b/netbox/ipam/migrations/0068_move_l2vpn.py new file mode 100644 index 000000000..b1a059de1 --- /dev/null +++ b/netbox/ipam/migrations/0068_move_l2vpn.py @@ -0,0 +1,64 @@ +from django.db import migrations + + +def update_content_types(apps, schema_editor): + ContentType = apps.get_model('contenttypes', 'ContentType') + + # Delete the new ContentTypes effected by the new models in the vpn app + ContentType.objects.filter(app_label='vpn', model='l2vpn').delete() + ContentType.objects.filter(app_label='vpn', model='l2vpntermination').delete() + + # Update the app labels of the original ContentTypes for ipam.L2VPN and ipam.L2VPNTermination to ensure + # that any foreign key references are preserved + ContentType.objects.filter(app_label='ipam', model='l2vpn').update(app_label='vpn') + ContentType.objects.filter(app_label='ipam', model='l2vpntermination').update(app_label='vpn') + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0067_ipaddress_index_host'), + ] + + operations = [ + migrations.RemoveConstraint( + model_name='l2vpntermination', + name='ipam_l2vpntermination_assigned_object', + ), + migrations.SeparateDatabaseAndState( + state_operations=[ + migrations.RemoveField( + model_name='l2vpntermination', + name='assigned_object_type', + ), + migrations.RemoveField( + model_name='l2vpntermination', + name='l2vpn', + ), + migrations.RemoveField( + model_name='l2vpntermination', + name='tags', + ), + migrations.DeleteModel( + name='L2VPN', + ), + migrations.DeleteModel( + name='L2VPNTermination', + ), + ], + database_operations=[ + migrations.AlterModelTable( + name='L2VPN', + table='vpn_l2vpn', + ), + migrations.AlterModelTable( + name='L2VPNTermination', + table='vpn_l2vpntermination', + ), + ], + ), + migrations.RunPython( + code=update_content_types, + reverse_code=migrations.RunPython.noop + ), + ] diff --git a/netbox/ipam/models/__init__.py b/netbox/ipam/models/__init__.py index a00919ee0..0d0b3d6ac 100644 --- a/netbox/ipam/models/__init__.py +++ b/netbox/ipam/models/__init__.py @@ -3,27 +3,5 @@ from .asns import * from .fhrp import * from .vrfs import * from .ip import * -from .l2vpn import * from .services import * from .vlans import * - -__all__ = ( - 'ASN', - 'ASNRange', - 'Aggregate', - 'IPAddress', - 'IPRange', - 'FHRPGroup', - 'FHRPGroupAssignment', - 'L2VPN', - 'L2VPNTermination', - 'Prefix', - 'RIR', - 'Role', - 'RouteTarget', - 'Service', - 'ServiceTemplate', - 'VLAN', - 'VLANGroup', - 'VRF', -) diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index b6aed5398..1327a6e9d 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -183,9 +183,8 @@ class VLAN(PrimaryModel): null=True, help_text=_("The primary function of this VLAN") ) - l2vpn_terminations = GenericRelation( - to='ipam.L2VPNTermination', + to='vpn.L2VPNTermination', content_type_field='assigned_object_type', object_id_field='assigned_object_id', related_query_name='vlan' diff --git a/netbox/ipam/search.py b/netbox/ipam/search.py index c08acce1b..a1cddbb1a 100644 --- a/netbox/ipam/search.py +++ b/netbox/ipam/search.py @@ -1,5 +1,5 @@ -from . import models from netbox.search import SearchIndex, register_search +from . import models @register_search @@ -69,18 +69,6 @@ class IPRangeIndex(SearchIndex): display_attrs = ('vrf', 'tenant', 'status', 'role', 'description') -@register_search -class L2VPNIndex(SearchIndex): - model = models.L2VPN - fields = ( - ('name', 100), - ('slug', 110), - ('description', 500), - ('comments', 5000), - ) - display_attrs = ('type', 'identifier', 'tenant', 'description') - - @register_search class PrefixIndex(SearchIndex): model = models.Prefix diff --git a/netbox/ipam/tables/__init__.py b/netbox/ipam/tables/__init__.py index 7d04a5fea..95676b82c 100644 --- a/netbox/ipam/tables/__init__.py +++ b/netbox/ipam/tables/__init__.py @@ -1,7 +1,6 @@ from .asn import * from .fhrp import * from .ip import * -from .l2vpn import * from .services import * from .vlans import * from .vrfs import * diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index d696c8dae..cb633e162 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -1100,96 +1100,3 @@ class ServiceTest(APIViewTestCases.APIViewTestCase): 'ports': [6], }, ] - - -class L2VPNTest(APIViewTestCases.APIViewTestCase): - model = L2VPN - brief_fields = ['display', 'id', 'identifier', 'name', 'slug', 'type', 'url'] - create_data = [ - { - 'name': 'L2VPN 4', - 'slug': 'l2vpn-4', - 'type': 'vxlan', - 'identifier': 33343344 - }, - { - 'name': 'L2VPN 5', - 'slug': 'l2vpn-5', - 'type': 'vxlan', - 'identifier': 33343345 - }, - { - 'name': 'L2VPN 6', - 'slug': 'l2vpn-6', - 'type': 'vpws', - 'identifier': 33343346 - }, - ] - bulk_update_data = { - 'description': 'New description', - } - - @classmethod - def setUpTestData(cls): - - l2vpns = ( - L2VPN(name='L2VPN 1', slug='l2vpn-1', type='vxlan', identifier=650001), - L2VPN(name='L2VPN 2', slug='l2vpn-2', type='vpws', identifier=650002), - L2VPN(name='L2VPN 3', slug='l2vpn-3', type='vpls'), # No RD - ) - L2VPN.objects.bulk_create(l2vpns) - - -class L2VPNTerminationTest(APIViewTestCases.APIViewTestCase): - model = L2VPNTermination - brief_fields = ['display', 'id', 'l2vpn', 'url'] - - @classmethod - def setUpTestData(cls): - - vlans = ( - VLAN(name='VLAN 1', vid=651), - VLAN(name='VLAN 2', vid=652), - VLAN(name='VLAN 3', vid=653), - VLAN(name='VLAN 4', vid=654), - VLAN(name='VLAN 5', vid=655), - VLAN(name='VLAN 6', vid=656), - VLAN(name='VLAN 7', vid=657) - ) - VLAN.objects.bulk_create(vlans) - - l2vpns = ( - L2VPN(name='L2VPN 1', slug='l2vpn-1', type='vxlan', identifier=650001), - L2VPN(name='L2VPN 2', slug='l2vpn-2', type='vpws', identifier=650002), - L2VPN(name='L2VPN 3', slug='l2vpn-3', type='vpls'), # No RD - ) - L2VPN.objects.bulk_create(l2vpns) - - l2vpnterminations = ( - L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[0]), - L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[1]), - L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[2]) - ) - L2VPNTermination.objects.bulk_create(l2vpnterminations) - - cls.create_data = [ - { - 'l2vpn': l2vpns[0].pk, - 'assigned_object_type': 'ipam.vlan', - 'assigned_object_id': vlans[3].pk, - }, - { - 'l2vpn': l2vpns[0].pk, - 'assigned_object_type': 'ipam.vlan', - 'assigned_object_id': vlans[4].pk, - }, - { - 'l2vpn': l2vpns[0].pk, - 'assigned_object_type': 'ipam.vlan', - 'assigned_object_id': vlans[5].pk, - }, - ] - - cls.bulk_update_data = { - 'l2vpn': l2vpns[2].pk - } diff --git a/netbox/ipam/tests/test_filtersets.py b/netbox/ipam/tests/test_filtersets.py index 952376056..07f3e637f 100644 --- a/netbox/ipam/tests/test_filtersets.py +++ b/netbox/ipam/tests/test_filtersets.py @@ -7,9 +7,9 @@ from dcim.models import Device, DeviceRole, DeviceType, Interface, Location, Man from ipam.choices import * from ipam.filtersets import * from ipam.models import * +from tenancy.models import Tenant, TenantGroup from utilities.testing import ChangeLoggedFilterSetTests, create_test_device, create_test_virtualmachine from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface -from tenancy.models import Tenant, TenantGroup class ASNRangeTestCase(TestCase, ChangeLoggedFilterSetTests): @@ -1616,163 +1616,3 @@ class ServiceTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) params = {'ipaddress': [str(ips[0].address), str(ips[1].address)]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - -class L2VPNTestCase(TestCase, ChangeLoggedFilterSetTests): - queryset = L2VPN.objects.all() - filterset = L2VPNFilterSet - - @classmethod - def setUpTestData(cls): - - route_targets = ( - RouteTarget(name='1:1'), - RouteTarget(name='1:2'), - RouteTarget(name='1:3'), - RouteTarget(name='2:1'), - RouteTarget(name='2:2'), - RouteTarget(name='2:3'), - ) - RouteTarget.objects.bulk_create(route_targets) - - l2vpns = ( - L2VPN(name='L2VPN 1', slug='l2vpn-1', type=L2VPNTypeChoices.TYPE_VXLAN, identifier=65001), - L2VPN(name='L2VPN 2', slug='l2vpn-2', type=L2VPNTypeChoices.TYPE_VPWS, identifier=65002), - L2VPN(name='L2VPN 3', slug='l2vpn-3', type=L2VPNTypeChoices.TYPE_VPLS), - ) - L2VPN.objects.bulk_create(l2vpns) - l2vpns[0].import_targets.add(route_targets[0]) - l2vpns[1].import_targets.add(route_targets[1]) - l2vpns[2].import_targets.add(route_targets[2]) - l2vpns[0].export_targets.add(route_targets[3]) - l2vpns[1].export_targets.add(route_targets[4]) - l2vpns[2].export_targets.add(route_targets[5]) - - def test_name(self): - params = {'name': ['L2VPN 1', 'L2VPN 2']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - def test_slug(self): - params = {'slug': ['l2vpn-1', 'l2vpn-2']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - def test_identifier(self): - params = {'identifier': ['65001', '65002']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - def test_type(self): - params = {'type': [L2VPNTypeChoices.TYPE_VXLAN, L2VPNTypeChoices.TYPE_VPWS]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - def test_import_targets(self): - route_targets = RouteTarget.objects.filter(name__in=['1:1', '1:2']) - params = {'import_target_id': [route_targets[0].pk, route_targets[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - params = {'import_target': [route_targets[0].name, route_targets[1].name]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - def test_export_targets(self): - route_targets = RouteTarget.objects.filter(name__in=['2:1', '2:2']) - params = {'export_target_id': [route_targets[0].pk, route_targets[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - params = {'export_target': [route_targets[0].name, route_targets[1].name]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - -class L2VPNTerminationTestCase(TestCase, ChangeLoggedFilterSetTests): - queryset = L2VPNTermination.objects.all() - filterset = L2VPNTerminationFilterSet - - @classmethod - def setUpTestData(cls): - device = create_test_device('Device 1') - interfaces = ( - Interface(name='Interface 1', device=device, type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(name='Interface 2', device=device, type=InterfaceTypeChoices.TYPE_1GE_FIXED), - Interface(name='Interface 3', device=device, type=InterfaceTypeChoices.TYPE_1GE_FIXED), - ) - Interface.objects.bulk_create(interfaces) - - vm = create_test_virtualmachine('Virtual Machine 1') - vminterfaces = ( - VMInterface(name='Interface 1', virtual_machine=vm), - VMInterface(name='Interface 2', virtual_machine=vm), - VMInterface(name='Interface 3', virtual_machine=vm), - ) - VMInterface.objects.bulk_create(vminterfaces) - - vlans = ( - VLAN(name='VLAN 1', vid=101), - VLAN(name='VLAN 2', vid=102), - VLAN(name='VLAN 3', vid=103), - ) - VLAN.objects.bulk_create(vlans) - - l2vpns = ( - L2VPN(name='L2VPN 1', slug='l2vpn-1', type='vxlan', identifier=65001), - L2VPN(name='L2VPN 2', slug='l2vpn-2', type='vpws', identifier=65002), - L2VPN(name='L2VPN 3', slug='l2vpn-3', type='vpls'), # No RD, - ) - L2VPN.objects.bulk_create(l2vpns) - - l2vpnterminations = ( - L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[0]), - L2VPNTermination(l2vpn=l2vpns[1], assigned_object=vlans[1]), - L2VPNTermination(l2vpn=l2vpns[2], assigned_object=vlans[2]), - L2VPNTermination(l2vpn=l2vpns[0], assigned_object=interfaces[0]), - L2VPNTermination(l2vpn=l2vpns[1], assigned_object=interfaces[1]), - L2VPNTermination(l2vpn=l2vpns[2], assigned_object=interfaces[2]), - L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vminterfaces[0]), - L2VPNTermination(l2vpn=l2vpns[1], assigned_object=vminterfaces[1]), - L2VPNTermination(l2vpn=l2vpns[2], assigned_object=vminterfaces[2]), - ) - L2VPNTermination.objects.bulk_create(l2vpnterminations) - - def test_l2vpn(self): - l2vpns = L2VPN.objects.all()[:2] - params = {'l2vpn_id': [l2vpns[0].pk, l2vpns[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) - params = {'l2vpn': [l2vpns[0].slug, l2vpns[1].slug]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) - - def test_content_type(self): - params = {'assigned_object_type_id': ContentType.objects.get(model='vlan').pk} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - - def test_interface(self): - interfaces = Interface.objects.all()[:2] - params = {'interface_id': [interfaces[0].pk, interfaces[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - def test_vminterface(self): - vminterfaces = VMInterface.objects.all()[:2] - params = {'vminterface_id': [vminterfaces[0].pk, vminterfaces[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - def test_vlan(self): - vlans = VLAN.objects.all()[:2] - params = {'vlan_id': [vlans[0].pk, vlans[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - params = {'vlan': ['VLAN 1', 'VLAN 2']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - def test_site(self): - site = Site.objects.all().first() - params = {'site_id': [site.pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - params = {'site': ['site-1']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - - def test_device(self): - device = Device.objects.all().first() - params = {'device_id': [device.pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - params = {'device': ['Device 1']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - - def test_virtual_machine(self): - virtual_machine = VirtualMachine.objects.all().first() - params = {'virtual_machine_id': [virtual_machine.pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) - params = {'virtual_machine': ['Virtual Machine 1']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) diff --git a/netbox/ipam/tests/test_models.py b/netbox/ipam/tests/test_models.py index 06cd9b445..5a37807a7 100644 --- a/netbox/ipam/tests/test_models.py +++ b/netbox/ipam/tests/test_models.py @@ -1,10 +1,9 @@ -from netaddr import IPNetwork, IPSet from django.core.exceptions import ValidationError from django.test import TestCase, override_settings +from netaddr import IPNetwork, IPSet -from dcim.models import Interface, Device, DeviceRole, DeviceType, Manufacturer, Site -from ipam.choices import IPAddressRoleChoices, PrefixStatusChoices -from ipam.models import Aggregate, IPAddress, IPRange, Prefix, RIR, VLAN, VLANGroup, VRF, L2VPN, L2VPNTermination +from ipam.choices import * +from ipam.models import * class TestAggregate(TestCase): @@ -539,76 +538,3 @@ class TestVLANGroup(TestCase): VLAN.objects.create(name='VLAN 104', vid=104, group=vlangroup) self.assertEqual(vlangroup.get_next_available_vid(), 105) - - -class TestL2VPNTermination(TestCase): - - @classmethod - def setUpTestData(cls): - - site = Site.objects.create(name='Site 1') - manufacturer = Manufacturer.objects.create(name='Manufacturer 1') - device_type = DeviceType.objects.create(model='Device Type 1', manufacturer=manufacturer) - role = DeviceRole.objects.create(name='Switch') - device = Device.objects.create( - name='Device 1', - site=site, - device_type=device_type, - role=role, - status='active' - ) - - interfaces = ( - Interface(name='Interface 1', device=device, type='1000baset'), - Interface(name='Interface 2', device=device, type='1000baset'), - Interface(name='Interface 3', device=device, type='1000baset'), - Interface(name='Interface 4', device=device, type='1000baset'), - Interface(name='Interface 5', device=device, type='1000baset'), - ) - - Interface.objects.bulk_create(interfaces) - - vlans = ( - VLAN(name='VLAN 1', vid=651), - VLAN(name='VLAN 2', vid=652), - VLAN(name='VLAN 3', vid=653), - VLAN(name='VLAN 4', vid=654), - VLAN(name='VLAN 5', vid=655), - VLAN(name='VLAN 6', vid=656), - VLAN(name='VLAN 7', vid=657) - ) - - VLAN.objects.bulk_create(vlans) - - l2vpns = ( - L2VPN(name='L2VPN 1', slug='l2vpn-1', type='vxlan', identifier=650001), - L2VPN(name='L2VPN 2', slug='l2vpn-2', type='vpws', identifier=650002), - L2VPN(name='L2VPN 3', slug='l2vpn-3', type='vpls'), # No RD - ) - L2VPN.objects.bulk_create(l2vpns) - - l2vpnterminations = ( - L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[0]), - L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[1]), - L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[2]) - ) - - L2VPNTermination.objects.bulk_create(l2vpnterminations) - - def test_duplicate_interface_terminations(self): - device = Device.objects.first() - interface = Interface.objects.filter(device=device).first() - l2vpn = L2VPN.objects.first() - - L2VPNTermination.objects.create(l2vpn=l2vpn, assigned_object=interface) - duplicate = L2VPNTermination(l2vpn=l2vpn, assigned_object=interface) - - self.assertRaises(ValidationError, duplicate.clean) - - def test_duplicate_vlan_terminations(self): - vlan = Interface.objects.first() - l2vpn = L2VPN.objects.first() - - L2VPNTermination.objects.create(l2vpn=l2vpn, assigned_object=vlan) - duplicate = L2VPNTermination(l2vpn=l2vpn, assigned_object=vlan) - self.assertRaises(ValidationError, duplicate.clean) diff --git a/netbox/ipam/tests/test_views.py b/netbox/ipam/tests/test_views.py index a37584f0f..bc42341ba 100644 --- a/netbox/ipam/tests/test_views.py +++ b/netbox/ipam/tests/test_views.py @@ -9,7 +9,7 @@ from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Site, Inte from ipam.choices import * from ipam.models import * from tenancy.models import Tenant -from utilities.testing import ViewTestCases, create_test_device, create_tags +from utilities.testing import ViewTestCases, create_tags class ASNRangeTestCase(ViewTestCases.PrimaryObjectViewTestCase): @@ -986,142 +986,3 @@ class ServiceTestCase(ViewTestCases.PrimaryObjectViewTestCase): self.assertEqual(instance.protocol, service_template.protocol) self.assertEqual(instance.ports, service_template.ports) self.assertEqual(instance.description, service_template.description) - - -class L2VPNTestCase(ViewTestCases.PrimaryObjectViewTestCase): - model = L2VPN - - @classmethod - def setUpTestData(cls): - rts = ( - RouteTarget(name='64534:123'), - RouteTarget(name='64534:321') - ) - RouteTarget.objects.bulk_create(rts) - - l2vpns = ( - L2VPN(name='L2VPN 1', slug='l2vpn-1', type=L2VPNTypeChoices.TYPE_VXLAN, identifier='650001'), - L2VPN(name='L2VPN 2', slug='l2vpn-2', type=L2VPNTypeChoices.TYPE_VXLAN, identifier='650002'), - L2VPN(name='L2VPN 3', slug='l2vpn-3', type=L2VPNTypeChoices.TYPE_VXLAN, identifier='650003') - ) - L2VPN.objects.bulk_create(l2vpns) - - cls.csv_data = ( - 'name,slug,type,identifier', - 'L2VPN 5,l2vpn-5,vxlan,456', - 'L2VPN 6,l2vpn-6,vxlan,444', - ) - - cls.csv_update_data = ( - 'id,name,description', - f'{l2vpns[0].pk},L2VPN 7,New description 7', - f'{l2vpns[1].pk},L2VPN 8,New description 8', - ) - - cls.bulk_edit_data = { - 'description': 'New Description', - } - - cls.form_data = { - 'name': 'L2VPN 8', - 'slug': 'l2vpn-8', - 'type': L2VPNTypeChoices.TYPE_VXLAN, - 'identifier': 123, - 'description': 'Description', - 'import_targets': [rts[0].pk], - 'export_targets': [rts[1].pk] - } - - -class L2VPNTerminationTestCase( - ViewTestCases.GetObjectViewTestCase, - ViewTestCases.GetObjectChangelogViewTestCase, - ViewTestCases.CreateObjectViewTestCase, - ViewTestCases.EditObjectViewTestCase, - ViewTestCases.DeleteObjectViewTestCase, - ViewTestCases.ListObjectsViewTestCase, - ViewTestCases.BulkImportObjectsViewTestCase, - ViewTestCases.BulkDeleteObjectsViewTestCase, -): - - model = L2VPNTermination - - @classmethod - def setUpTestData(cls): - device = create_test_device('Device 1') - interface = Interface.objects.create(name='Interface 1', device=device, type='1000baset') - l2vpns = ( - L2VPN(name='L2VPN 1', slug='l2vpn-1', type=L2VPNTypeChoices.TYPE_VXLAN, identifier=650001), - L2VPN(name='L2VPN 2', slug='l2vpn-2', type=L2VPNTypeChoices.TYPE_VXLAN, identifier=650002), - ) - L2VPN.objects.bulk_create(l2vpns) - - vlans = ( - VLAN(name='Vlan 1', vid=1001), - VLAN(name='Vlan 2', vid=1002), - VLAN(name='Vlan 3', vid=1003), - VLAN(name='Vlan 4', vid=1004), - VLAN(name='Vlan 5', vid=1005), - VLAN(name='Vlan 6', vid=1006) - ) - VLAN.objects.bulk_create(vlans) - - terminations = ( - L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[0]), - L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[1]), - L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[2]) - ) - L2VPNTermination.objects.bulk_create(terminations) - - cls.form_data = { - 'l2vpn': l2vpns[0].pk, - 'device': device.pk, - 'interface': interface.pk, - } - - cls.csv_data = ( - "l2vpn,vlan", - "L2VPN 1,Vlan 4", - "L2VPN 1,Vlan 5", - "L2VPN 1,Vlan 6", - ) - - cls.csv_update_data = ( - f"id,l2vpn", - f"{terminations[0].pk},{l2vpns[0].name}", - f"{terminations[1].pk},{l2vpns[0].name}", - f"{terminations[2].pk},{l2vpns[0].name}", - ) - - cls.bulk_edit_data = {} - - # TODO: Fix L2VPNTerminationImportForm validation to support bulk updates - def test_bulk_update_objects_with_permission(self): - pass - - # - # Custom assertions - # - - # TODO: Remove this - def assertInstanceEqual(self, instance, data, exclude=None, api=False): - """ - Override parent - """ - if exclude is None: - exclude = [] - - fields = [k for k in data.keys() if k not in exclude] - model_dict = self.model_to_dict(instance, fields=fields, api=api) - - # Omit any dictionary keys which are not instance attributes or have been excluded - relevant_data = { - k: v for k, v in data.items() if hasattr(instance, k) and k not in exclude - } - - # Handle relations on the model - for k, v in model_dict.items(): - if isinstance(v, object) and hasattr(v, 'first'): - model_dict[k] = v.first().pk - - self.assertDictEqual(model_dict, relevant_data) diff --git a/netbox/ipam/urls.py b/netbox/ipam/urls.py index 3bfe34b7b..61deeff4b 100644 --- a/netbox/ipam/urls.py +++ b/netbox/ipam/urls.py @@ -131,20 +131,4 @@ urlpatterns = [ path('services/edit/', views.ServiceBulkEditView.as_view(), name='service_bulk_edit'), path('services/delete/', views.ServiceBulkDeleteView.as_view(), name='service_bulk_delete'), path('services//', include(get_model_urls('ipam', 'service'))), - - # L2VPN - path('l2vpns/', views.L2VPNListView.as_view(), name='l2vpn_list'), - path('l2vpns/add/', views.L2VPNEditView.as_view(), name='l2vpn_add'), - path('l2vpns/import/', views.L2VPNBulkImportView.as_view(), name='l2vpn_import'), - path('l2vpns/edit/', views.L2VPNBulkEditView.as_view(), name='l2vpn_bulk_edit'), - path('l2vpns/delete/', views.L2VPNBulkDeleteView.as_view(), name='l2vpn_bulk_delete'), - path('l2vpns//', include(get_model_urls('ipam', 'l2vpn'))), - - # L2VPN terminations - path('l2vpn-terminations/', views.L2VPNTerminationListView.as_view(), name='l2vpntermination_list'), - path('l2vpn-terminations/add/', views.L2VPNTerminationEditView.as_view(), name='l2vpntermination_add'), - path('l2vpn-terminations/import/', views.L2VPNTerminationBulkImportView.as_view(), name='l2vpntermination_import'), - path('l2vpn-terminations/edit/', views.L2VPNTerminationBulkEditView.as_view(), name='l2vpntermination_bulk_edit'), - path('l2vpn-terminations/delete/', views.L2VPNTerminationBulkDeleteView.as_view(), name='l2vpntermination_bulk_delete'), - path('l2vpn-terminations//', include(get_model_urls('ipam', 'l2vpntermination'))), ] diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 48ea637d9..5c1ac6620 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -1,5 +1,5 @@ from django.contrib.contenttypes.models import ContentType -from django.db.models import F, Prefetch +from django.db.models import Prefetch from django.db.models.expressions import RawSQL from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse @@ -9,7 +9,6 @@ from circuits.models import Provider from dcim.filtersets import InterfaceFilterSet from dcim.models import Interface, Site from netbox.views import generic -from tenancy.views import ObjectContactsView from utilities.tables import get_table_ordering from utilities.utils import count_related from utilities.views import ViewTab, register_model_view @@ -19,7 +18,6 @@ from . import filtersets, forms, tables from .choices import PrefixStatusChoices from .constants import * from .models import * -from .tables.l2vpn import L2VPNTable, L2VPNTerminationTable from .utils import add_requested_prefixes, add_available_ipaddresses, add_available_vlans @@ -1243,112 +1241,3 @@ class ServiceBulkDeleteView(generic.BulkDeleteView): queryset = Service.objects.prefetch_related('device', 'virtual_machine') filterset = filtersets.ServiceFilterSet table = tables.ServiceTable - - -# L2VPN - -class L2VPNListView(generic.ObjectListView): - queryset = L2VPN.objects.all() - table = L2VPNTable - filterset = filtersets.L2VPNFilterSet - filterset_form = forms.L2VPNFilterForm - - -@register_model_view(L2VPN) -class L2VPNView(generic.ObjectView): - queryset = L2VPN.objects.all() - - def get_extra_context(self, request, instance): - import_targets_table = tables.RouteTargetTable( - instance.import_targets.prefetch_related('tenant'), - orderable=False - ) - export_targets_table = tables.RouteTargetTable( - instance.export_targets.prefetch_related('tenant'), - orderable=False - ) - - return { - 'import_targets_table': import_targets_table, - 'export_targets_table': export_targets_table, - } - - -@register_model_view(L2VPN, 'edit') -class L2VPNEditView(generic.ObjectEditView): - queryset = L2VPN.objects.all() - form = forms.L2VPNForm - - -@register_model_view(L2VPN, 'delete') -class L2VPNDeleteView(generic.ObjectDeleteView): - queryset = L2VPN.objects.all() - - -class L2VPNBulkImportView(generic.BulkImportView): - queryset = L2VPN.objects.all() - model_form = forms.L2VPNImportForm - - -class L2VPNBulkEditView(generic.BulkEditView): - queryset = L2VPN.objects.all() - filterset = filtersets.L2VPNFilterSet - table = tables.L2VPNTable - form = forms.L2VPNBulkEditForm - - -class L2VPNBulkDeleteView(generic.BulkDeleteView): - queryset = L2VPN.objects.all() - filterset = filtersets.L2VPNFilterSet - table = tables.L2VPNTable - - -@register_model_view(L2VPN, 'contacts') -class L2VPNContactsView(ObjectContactsView): - queryset = L2VPN.objects.all() - - -# -# L2VPN terminations -# - -class L2VPNTerminationListView(generic.ObjectListView): - queryset = L2VPNTermination.objects.all() - table = L2VPNTerminationTable - filterset = filtersets.L2VPNTerminationFilterSet - filterset_form = forms.L2VPNTerminationFilterForm - - -@register_model_view(L2VPNTermination) -class L2VPNTerminationView(generic.ObjectView): - queryset = L2VPNTermination.objects.all() - - -@register_model_view(L2VPNTermination, 'edit') -class L2VPNTerminationEditView(generic.ObjectEditView): - queryset = L2VPNTermination.objects.all() - form = forms.L2VPNTerminationForm - template_name = 'ipam/l2vpntermination_edit.html' - - -@register_model_view(L2VPNTermination, 'delete') -class L2VPNTerminationDeleteView(generic.ObjectDeleteView): - queryset = L2VPNTermination.objects.all() - - -class L2VPNTerminationBulkImportView(generic.BulkImportView): - queryset = L2VPNTermination.objects.all() - model_form = forms.L2VPNTerminationImportForm - - -class L2VPNTerminationBulkEditView(generic.BulkEditView): - queryset = L2VPNTermination.objects.all() - filterset = filtersets.L2VPNTerminationFilterSet - table = tables.L2VPNTerminationTable - form = forms.L2VPNTerminationBulkEditForm - - -class L2VPNTerminationBulkDeleteView(generic.BulkDeleteView): - queryset = L2VPNTermination.objects.all() - filterset = filtersets.L2VPNTerminationFilterSet - table = tables.L2VPNTerminationTable diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index e99b84b10..49aee3540 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -209,8 +209,8 @@ VPN_MENU = Menu( MenuGroup( label=_('L2VPNs'), items=( - get_model_item('ipam', 'l2vpn', _('L2VPNs')), - get_model_item('ipam', 'l2vpntermination', _('Terminations')), + get_model_item('vpn', 'l2vpn', _('L2VPNs')), + get_model_item('vpn', 'l2vpntermination', _('Terminations')), ), ), MenuGroup( diff --git a/netbox/templates/ipam/routetarget.html b/netbox/templates/ipam/routetarget.html index 497dc8a39..7894e946f 100644 --- a/netbox/templates/ipam/routetarget.html +++ b/netbox/templates/ipam/routetarget.html @@ -59,7 +59,7 @@
    {% trans "Importing L2VPNs" %}
    @@ -68,7 +68,7 @@
    {% trans "Exporting L2VPNs" %}
    diff --git a/netbox/templates/ipam/l2vpn.html b/netbox/templates/vpn/l2vpn.html similarity index 85% rename from netbox/templates/ipam/l2vpn.html rename to netbox/templates/vpn/l2vpn.html index af95aba9f..2176a537f 100644 --- a/netbox/templates/ipam/l2vpn.html +++ b/netbox/templates/vpn/l2vpn.html @@ -34,7 +34,7 @@
    - {% include 'inc/panels/tags.html' with tags=object.tags.all url='ipam:l2vpn_list' %} + {% include 'inc/panels/tags.html' with tags=object.tags.all url='vpn:l2vpn_list' %} {% plugin_left_page object %}
    @@ -56,12 +56,12 @@
    {% trans "Terminations" %}
    - {% if perms.ipam.add_l2vpntermination %} + {% if perms.vpn.add_l2vpntermination %} diff --git a/netbox/templates/ipam/l2vpntermination.html b/netbox/templates/vpn/l2vpntermination.html similarity index 96% rename from netbox/templates/ipam/l2vpntermination.html rename to netbox/templates/vpn/l2vpntermination.html index cc316bf39..0e7539481 100644 --- a/netbox/templates/ipam/l2vpntermination.html +++ b/netbox/templates/vpn/l2vpntermination.html @@ -25,7 +25,7 @@
    {% include 'inc/panels/custom_fields.html' %} - {% include 'inc/panels/tags.html' with tags=object.tags.all url='ipam:l2vpntermination_list' %} + {% include 'inc/panels/tags.html' with tags=object.tags.all url='vpn:l2vpntermination_list' %}
    diff --git a/netbox/templates/ipam/l2vpntermination_edit.html b/netbox/templates/vpn/l2vpntermination_edit.html similarity index 100% rename from netbox/templates/ipam/l2vpntermination_edit.html rename to netbox/templates/vpn/l2vpntermination_edit.html diff --git a/netbox/virtualization/api/serializers.py b/netbox/virtualization/api/serializers.py index 95b2152a5..7ed36388b 100644 --- a/netbox/virtualization/api/serializers.py +++ b/netbox/virtualization/api/serializers.py @@ -6,15 +6,14 @@ from dcim.api.nested_serializers import ( ) from dcim.choices import InterfaceModeChoices from extras.api.nested_serializers import NestedConfigTemplateSerializer -from ipam.api.nested_serializers import ( - NestedIPAddressSerializer, NestedL2VPNTerminationSerializer, NestedVLANSerializer, NestedVRFSerializer, -) +from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedVLANSerializer, NestedVRFSerializer from ipam.models import VLAN from netbox.api.fields import ChoiceField, SerializedPKRelatedField from netbox.api.serializers import NetBoxModelSerializer from tenancy.api.nested_serializers import NestedTenantSerializer from virtualization.choices import * from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualDisk, VirtualMachine, VMInterface +from vpn.api.nested_serializers import NestedL2VPNTerminationSerializer from .nested_serializers import * diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 5eb3fea1c..ba0c4cc6d 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -4,13 +4,14 @@ from django.utils.translation import gettext_lazy as _ from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup from extras.forms import LocalConfigContextFilterForm from extras.models import ConfigTemplate -from ipam.models import L2VPN, VRF +from ipam.models import VRF from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import ContactModelFilterForm, TenancyFilterForm from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterField from virtualization.choices import * from virtualization.models import * +from vpn.models import L2VPN __all__ = ( 'ClusterFilterForm', diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index 2126f2541..1824aae99 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -358,7 +358,7 @@ class VMInterface(ComponentModel, BaseInterface, TrackingModelMixin): related_query_name='vminterface', ) l2vpn_terminations = GenericRelation( - to='ipam.L2VPNTermination', + to='vpn.L2VPNTermination', content_type_field='assigned_object_type', object_id_field='assigned_object_id', related_query_name='vminterface', diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index 1eeb06ea8..632e6878a 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -24,8 +24,8 @@ VMINTERFACE_BUTTONS = """ {% if perms.ipam.add_ipaddress %}
  • IP Address
  • {% endif %} - {% if perms.ipam.add_l2vpntermination %} -
  • L2VPN Termination
  • + {% if perms.vpn.add_l2vpntermination %} +
  • L2VPN Termination
  • {% endif %} {% if perms.ipam.add_fhrpgroupassignment %}
  • Assign FHRP Group
  • diff --git a/netbox/vpn/api/nested_serializers.py b/netbox/vpn/api/nested_serializers.py index c9c92d308..f2627869b 100644 --- a/netbox/vpn/api/nested_serializers.py +++ b/netbox/vpn/api/nested_serializers.py @@ -9,6 +9,8 @@ __all__ = ( 'NestedIPSecPolicySerializer', 'NestedIPSecProfileSerializer', 'NestedIPSecProposalSerializer', + 'NestedL2VPNSerializer', + 'NestedL2VPNTerminationSerializer', 'NestedTunnelSerializer', 'NestedTunnelTerminationSerializer', ) @@ -82,3 +84,28 @@ class NestedIPSecProfileSerializer(WritableNestedSerializer): class Meta: model = models.IPSecProfile fields = ('id', 'url', 'display', 'name') + + +# +# L2VPN +# + +class NestedL2VPNSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpn-detail') + + class Meta: + model = models.L2VPN + fields = [ + 'id', 'url', 'display', 'identifier', 'name', 'slug', 'type' + ] + + +class NestedL2VPNTerminationSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpntermination-detail') + l2vpn = NestedL2VPNSerializer() + + class Meta: + model = models.L2VPNTermination + fields = [ + 'id', 'url', 'display', 'l2vpn' + ] diff --git a/netbox/vpn/api/serializers.py b/netbox/vpn/api/serializers.py index 1a517fe59..cd464cf22 100644 --- a/netbox/vpn/api/serializers.py +++ b/netbox/vpn/api/serializers.py @@ -2,7 +2,8 @@ from django.contrib.contenttypes.models import ContentType from drf_spectacular.utils import extend_schema_field from rest_framework import serializers -from ipam.api.nested_serializers import NestedIPAddressSerializer +from ipam.api.nested_serializers import NestedIPAddressSerializer, NestedRouteTargetSerializer +from ipam.models import RouteTarget from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField from netbox.api.serializers import NetBoxModelSerializer from netbox.constants import NESTED_SERIALIZER_PREFIX @@ -18,6 +19,8 @@ __all__ = ( 'IPSecPolicySerializer', 'IPSecProfileSerializer', 'IPSecProposalSerializer', + 'L2VPNSerializer', + 'L2VPNTerminationSerializer', 'TunnelSerializer', 'TunnelTerminationSerializer', ) @@ -191,3 +194,54 @@ class IPSecProfileSerializer(NetBoxModelSerializer): 'id', 'url', 'display', 'name', 'description', 'mode', 'ike_policy', 'ipsec_policy', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ) + + +# +# L2VPN +# + +class L2VPNSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpn-detail') + type = ChoiceField(choices=L2VPNTypeChoices, required=False) + import_targets = SerializedPKRelatedField( + queryset=RouteTarget.objects.all(), + serializer=NestedRouteTargetSerializer, + required=False, + many=True + ) + export_targets = SerializedPKRelatedField( + queryset=RouteTarget.objects.all(), + serializer=NestedRouteTargetSerializer, + required=False, + many=True + ) + tenant = NestedTenantSerializer(required=False, allow_null=True) + + class Meta: + model = L2VPN + fields = [ + 'id', 'url', 'display', 'identifier', 'name', 'slug', 'type', 'import_targets', 'export_targets', + 'description', 'comments', 'tenant', 'tags', 'custom_fields', 'created', 'last_updated' + ] + + +class L2VPNTerminationSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='vpn-api:l2vpntermination-detail') + l2vpn = NestedL2VPNSerializer() + assigned_object_type = ContentTypeField( + queryset=ContentType.objects.all() + ) + assigned_object = serializers.SerializerMethodField(read_only=True) + + class Meta: + model = L2VPNTermination + fields = [ + 'id', 'url', 'display', 'l2vpn', 'assigned_object_type', 'assigned_object_id', + 'assigned_object', 'tags', 'custom_fields', 'created', 'last_updated' + ] + + @extend_schema_field(serializers.JSONField(allow_null=True)) + def get_assigned_object(self, instance): + serializer = get_serializer_for_model(instance.assigned_object, prefix=NESTED_SERIALIZER_PREFIX) + context = {'request': self.context['request']} + return serializer(instance.assigned_object, context=context).data diff --git a/netbox/vpn/api/urls.py b/netbox/vpn/api/urls.py index f646174d5..8938532dd 100644 --- a/netbox/vpn/api/urls.py +++ b/netbox/vpn/api/urls.py @@ -10,6 +10,8 @@ router.register('ipsec-proposals', views.IPSecProposalViewSet) router.register('ipsec-profiles', views.IPSecProfileViewSet) router.register('tunnels', views.TunnelViewSet) router.register('tunnel-terminations', views.TunnelTerminationViewSet) +router.register('l2vpns', views.L2VPNViewSet) +router.register('l2vpn-terminations', views.L2VPNTerminationViewSet) app_name = 'vpn-api' urlpatterns = router.urls diff --git a/netbox/vpn/api/views.py b/netbox/vpn/api/views.py index c0ccab7ab..9a691a171 100644 --- a/netbox/vpn/api/views.py +++ b/netbox/vpn/api/views.py @@ -12,6 +12,8 @@ __all__ = ( 'IPSecPolicyViewSet', 'IPSecProfileViewSet', 'IPSecProposalViewSet', + 'L2VPNViewSet', + 'L2VPNTerminationViewSet', 'TunnelTerminationViewSet', 'TunnelViewSet', 'VPNRootView', @@ -72,3 +74,15 @@ class IPSecProfileViewSet(NetBoxModelViewSet): queryset = IPSecProfile.objects.all() serializer_class = serializers.IPSecProfileSerializer filterset_class = filtersets.IPSecProfileFilterSet + + +class L2VPNViewSet(NetBoxModelViewSet): + queryset = L2VPN.objects.prefetch_related('import_targets', 'export_targets', 'tenant', 'tags') + serializer_class = serializers.L2VPNSerializer + filterset_class = filtersets.L2VPNFilterSet + + +class L2VPNTerminationViewSet(NetBoxModelViewSet): + queryset = L2VPNTermination.objects.prefetch_related('assigned_object') + serializer_class = serializers.L2VPNTerminationSerializer + filterset_class = filtersets.L2VPNTerminationFilterSet diff --git a/netbox/vpn/choices.py b/netbox/vpn/choices.py index a932c5055..a272060e9 100644 --- a/netbox/vpn/choices.py +++ b/netbox/vpn/choices.py @@ -199,3 +199,56 @@ class DHGroupChoices(ChoiceSet): (GROUP_33, _('Group {n}').format(n=33)), (GROUP_34, _('Group {n}').format(n=34)), ) + + +# +# L2VPN +# + +class L2VPNTypeChoices(ChoiceSet): + TYPE_VPLS = 'vpls' + TYPE_VPWS = 'vpws' + TYPE_EPL = 'epl' + TYPE_EVPL = 'evpl' + TYPE_EPLAN = 'ep-lan' + TYPE_EVPLAN = 'evp-lan' + TYPE_EPTREE = 'ep-tree' + TYPE_EVPTREE = 'evp-tree' + TYPE_VXLAN = 'vxlan' + TYPE_VXLAN_EVPN = 'vxlan-evpn' + TYPE_MPLS_EVPN = 'mpls-evpn' + TYPE_PBB_EVPN = 'pbb-evpn' + + CHOICES = ( + ('VPLS', ( + (TYPE_VPWS, 'VPWS'), + (TYPE_VPLS, 'VPLS'), + )), + ('VXLAN', ( + (TYPE_VXLAN, 'VXLAN'), + (TYPE_VXLAN_EVPN, 'VXLAN-EVPN'), + )), + ('L2VPN E-VPN', ( + (TYPE_MPLS_EVPN, 'MPLS EVPN'), + (TYPE_PBB_EVPN, 'PBB EVPN'), + )), + ('E-Line', ( + (TYPE_EPL, 'EPL'), + (TYPE_EVPL, 'EVPL'), + )), + ('E-LAN', ( + (TYPE_EPLAN, _('Ethernet Private LAN')), + (TYPE_EVPLAN, _('Ethernet Virtual Private LAN')), + )), + ('E-Tree', ( + (TYPE_EPTREE, _('Ethernet Private Tree')), + (TYPE_EVPTREE, _('Ethernet Virtual Private Tree')), + )), + ) + + P2P = ( + TYPE_VPWS, + TYPE_EPL, + TYPE_EPLAN, + TYPE_EPTREE + ) diff --git a/netbox/vpn/constants.py b/netbox/vpn/constants.py new file mode 100644 index 000000000..55e398dcd --- /dev/null +++ b/netbox/vpn/constants.py @@ -0,0 +1,7 @@ +from django.db.models import Q + +L2VPN_ASSIGNMENT_MODELS = Q( + Q(app_label='dcim', model='interface') | + Q(app_label='ipam', model='vlan') | + Q(app_label='virtualization', model='vminterface') +) diff --git a/netbox/vpn/filtersets.py b/netbox/vpn/filtersets.py index c0bd140c3..249de9ca2 100644 --- a/netbox/vpn/filtersets.py +++ b/netbox/vpn/filtersets.py @@ -2,12 +2,12 @@ import django_filters from django.db.models import Q from django.utils.translation import gettext as _ -from dcim.models import Interface -from ipam.models import IPAddress +from dcim.models import Device, Interface +from ipam.models import IPAddress, RouteTarget, VLAN from netbox.filtersets import NetBoxModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter -from virtualization.models import VMInterface +from virtualization.models import VirtualMachine, VMInterface from .choices import * from .models import * @@ -17,6 +17,8 @@ __all__ = ( 'IPSecPolicyFilterSet', 'IPSecProfileFilterSet', 'IPSecProposalFilterSet', + 'L2VPNFilterSet', + 'L2VPNTerminationFilterSet', 'TunnelFilterSet', 'TunnelTerminationFilterSet', ) @@ -239,3 +241,175 @@ class IPSecProfileFilterSet(NetBoxModelFilterSet): Q(description__icontains=value) | Q(comments__icontains=value) ) + + +class L2VPNFilterSet(NetBoxModelFilterSet, TenancyFilterSet): + type = django_filters.MultipleChoiceFilter( + choices=L2VPNTypeChoices, + null_value=None + ) + import_target_id = django_filters.ModelMultipleChoiceFilter( + field_name='import_targets', + queryset=RouteTarget.objects.all(), + label=_('Import target'), + ) + import_target = django_filters.ModelMultipleChoiceFilter( + field_name='import_targets__name', + queryset=RouteTarget.objects.all(), + to_field_name='name', + label=_('Import target (name)'), + ) + export_target_id = django_filters.ModelMultipleChoiceFilter( + field_name='export_targets', + queryset=RouteTarget.objects.all(), + label=_('Export target'), + ) + export_target = django_filters.ModelMultipleChoiceFilter( + field_name='export_targets__name', + queryset=RouteTarget.objects.all(), + to_field_name='name', + label=_('Export target (name)'), + ) + + class Meta: + model = L2VPN + fields = ['id', 'identifier', 'name', 'slug', 'type', 'description'] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + qs_filter = Q(name__icontains=value) | Q(description__icontains=value) + try: + qs_filter |= Q(identifier=int(value)) + except ValueError: + pass + return queryset.filter(qs_filter) + + +class L2VPNTerminationFilterSet(NetBoxModelFilterSet): + l2vpn_id = django_filters.ModelMultipleChoiceFilter( + queryset=L2VPN.objects.all(), + label=_('L2VPN (ID)'), + ) + l2vpn = django_filters.ModelMultipleChoiceFilter( + field_name='l2vpn__slug', + queryset=L2VPN.objects.all(), + to_field_name='slug', + label=_('L2VPN (slug)'), + ) + region = MultiValueCharFilter( + method='filter_region', + field_name='slug', + label=_('Region (slug)'), + ) + region_id = MultiValueNumberFilter( + method='filter_region', + field_name='pk', + label=_('Region (ID)'), + ) + site = MultiValueCharFilter( + method='filter_site', + field_name='slug', + label=_('Site (slug)'), + ) + site_id = MultiValueNumberFilter( + method='filter_site', + field_name='pk', + label=_('Site (ID)'), + ) + device = django_filters.ModelMultipleChoiceFilter( + field_name='interface__device__name', + queryset=Device.objects.all(), + to_field_name='name', + label=_('Device (name)'), + ) + device_id = django_filters.ModelMultipleChoiceFilter( + field_name='interface__device', + queryset=Device.objects.all(), + label=_('Device (ID)'), + ) + virtual_machine = django_filters.ModelMultipleChoiceFilter( + field_name='vminterface__virtual_machine__name', + queryset=VirtualMachine.objects.all(), + to_field_name='name', + label=_('Virtual machine (name)'), + ) + virtual_machine_id = django_filters.ModelMultipleChoiceFilter( + field_name='vminterface__virtual_machine', + queryset=VirtualMachine.objects.all(), + label=_('Virtual machine (ID)'), + ) + interface = django_filters.ModelMultipleChoiceFilter( + field_name='interface__name', + queryset=Interface.objects.all(), + to_field_name='name', + label=_('Interface (name)'), + ) + interface_id = django_filters.ModelMultipleChoiceFilter( + field_name='interface', + queryset=Interface.objects.all(), + label=_('Interface (ID)'), + ) + vminterface = django_filters.ModelMultipleChoiceFilter( + field_name='vminterface__name', + queryset=VMInterface.objects.all(), + to_field_name='name', + label=_('VM interface (name)'), + ) + vminterface_id = django_filters.ModelMultipleChoiceFilter( + field_name='vminterface', + queryset=VMInterface.objects.all(), + label=_('VM Interface (ID)'), + ) + vlan = django_filters.ModelMultipleChoiceFilter( + field_name='vlan__name', + queryset=VLAN.objects.all(), + to_field_name='name', + label=_('VLAN (name)'), + ) + vlan_vid = django_filters.NumberFilter( + field_name='vlan__vid', + label=_('VLAN number (1-4094)'), + ) + vlan_id = django_filters.ModelMultipleChoiceFilter( + field_name='vlan', + queryset=VLAN.objects.all(), + label=_('VLAN (ID)'), + ) + assigned_object_type = ContentTypeFilter() + + class Meta: + model = L2VPNTermination + fields = ('id', 'assigned_object_type_id') + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + qs_filter = Q(l2vpn__name__icontains=value) + return queryset.filter(qs_filter) + + def filter_assigned_object(self, queryset, name, value): + qs = queryset.filter( + Q(**{'{}__in'.format(name): value}) + ) + return qs + + def filter_site(self, queryset, name, value): + qs = queryset.filter( + Q( + Q(**{'vlan__site__{}__in'.format(name): value}) | + Q(**{'interface__device__site__{}__in'.format(name): value}) | + Q(**{'vminterface__virtual_machine__site__{}__in'.format(name): value}) + ) + ) + return qs + + def filter_region(self, queryset, name, value): + qs = queryset.filter( + Q( + Q(**{'vlan__site__region__{}__in'.format(name): value}) | + Q(**{'interface__device__site__region__{}__in'.format(name): value}) | + Q(**{'vminterface__virtual_machine__site__region__{}__in'.format(name): value}) + ) + ) + return qs diff --git a/netbox/vpn/forms/bulk_edit.py b/netbox/vpn/forms/bulk_edit.py index a7b097b5c..4cbfd950d 100644 --- a/netbox/vpn/forms/bulk_edit.py +++ b/netbox/vpn/forms/bulk_edit.py @@ -14,6 +14,8 @@ __all__ = ( 'IPSecPolicyBulkEditForm', 'IPSecProfileBulkEditForm', 'IPSecProposalBulkEditForm', + 'L2VPNBulkEditForm', + 'L2VPNTerminationBulkEditForm', 'TunnelBulkEditForm', 'TunnelTerminationBulkEditForm', ) @@ -241,3 +243,32 @@ class IPSecProfileBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ( 'description', 'comments', ) + + +class L2VPNBulkEditForm(NetBoxModelBulkEditForm): + type = forms.ChoiceField( + label=_('Type'), + choices=add_blank_choice(L2VPNTypeChoices), + required=False + ) + tenant = DynamicModelChoiceField( + label=_('Tenant'), + queryset=Tenant.objects.all(), + required=False + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + comments = CommentField() + + model = L2VPN + fieldsets = ( + (None, ('type', 'tenant', 'description')), + ) + nullable_fields = ('tenant', 'description', 'comments') + + +class L2VPNTerminationBulkEditForm(NetBoxModelBulkEditForm): + model = L2VPN diff --git a/netbox/vpn/forms/bulk_import.py b/netbox/vpn/forms/bulk_import.py index 5b42cc761..33e93d28f 100644 --- a/netbox/vpn/forms/bulk_import.py +++ b/netbox/vpn/forms/bulk_import.py @@ -1,7 +1,8 @@ +from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from dcim.models import Device, Interface -from ipam.models import IPAddress +from ipam.models import IPAddress, VLAN from netbox.forms import NetBoxModelImportForm from tenancy.models import Tenant from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, CSVModelMultipleChoiceField @@ -15,6 +16,8 @@ __all__ = ( 'IPSecPolicyImportForm', 'IPSecProfileImportForm', 'IPSecProposalImportForm', + 'L2VPNImportForm', + 'L2VPNTerminationImportForm', 'TunnelImportForm', 'TunnelTerminationImportForm', ) @@ -228,3 +231,92 @@ class IPSecProfileImportForm(NetBoxModelImportForm): fields = ( 'name', 'mode', 'ike_policy', 'ipsec_policy', 'description', 'comments', 'tags', ) + + +class L2VPNImportForm(NetBoxModelImportForm): + tenant = CSVModelChoiceField( + label=_('Tenant'), + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + ) + type = CSVChoiceField( + label=_('Type'), + choices=L2VPNTypeChoices, + help_text=_('L2VPN type') + ) + + class Meta: + model = L2VPN + fields = ('identifier', 'name', 'slug', 'tenant', 'type', 'description', + 'comments', 'tags') + + +class L2VPNTerminationImportForm(NetBoxModelImportForm): + l2vpn = CSVModelChoiceField( + queryset=L2VPN.objects.all(), + required=True, + to_field_name='name', + label=_('L2VPN'), + ) + device = CSVModelChoiceField( + label=_('Device'), + queryset=Device.objects.all(), + required=False, + to_field_name='name', + help_text=_('Parent device (for interface)') + ) + virtual_machine = CSVModelChoiceField( + label=_('Virtual machine'), + queryset=VirtualMachine.objects.all(), + required=False, + to_field_name='name', + help_text=_('Parent virtual machine (for interface)') + ) + interface = CSVModelChoiceField( + label=_('Interface'), + queryset=Interface.objects.none(), # Can also refer to VMInterface + required=False, + to_field_name='name', + help_text=_('Assigned interface (device or VM)') + ) + vlan = CSVModelChoiceField( + label=_('VLAN'), + queryset=VLAN.objects.all(), + required=False, + to_field_name='name', + help_text=_('Assigned VLAN') + ) + + class Meta: + model = L2VPNTermination + fields = ('l2vpn', 'device', 'virtual_machine', 'interface', 'vlan', 'tags') + + def __init__(self, data=None, *args, **kwargs): + super().__init__(data, *args, **kwargs) + + if data: + + # Limit interface queryset by device or VM + if data.get('device'): + self.fields['interface'].queryset = Interface.objects.filter( + **{f"device__{self.fields['device'].to_field_name}": data['device']} + ) + elif data.get('virtual_machine'): + self.fields['interface'].queryset = VMInterface.objects.filter( + **{f"virtual_machine__{self.fields['virtual_machine'].to_field_name}": data['virtual_machine']} + ) + + def clean(self): + super().clean() + + if self.cleaned_data.get('device') and self.cleaned_data.get('virtual_machine'): + raise ValidationError(_('Cannot import device and VM interface terminations simultaneously.')) + if not self.instance and not (self.cleaned_data.get('interface') or self.cleaned_data.get('vlan')): + raise ValidationError(_('Each termination must specify either an interface or a VLAN.')) + if self.cleaned_data.get('interface') and self.cleaned_data.get('vlan'): + raise ValidationError(_('Cannot assign both an interface and a VLAN.')) + + # if this is an update we might not have interface or vlan in the form data + if self.cleaned_data.get('interface') or self.cleaned_data.get('vlan'): + self.instance.assigned_object = self.cleaned_data.get('interface') or self.cleaned_data.get('vlan') diff --git a/netbox/vpn/forms/filtersets.py b/netbox/vpn/forms/filtersets.py index ec146919a..91ca8a8dc 100644 --- a/netbox/vpn/forms/filtersets.py +++ b/netbox/vpn/forms/filtersets.py @@ -1,10 +1,18 @@ from django import forms +from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext as _ +from dcim.models import Device, Region, Site +from ipam.models import RouteTarget, VLAN from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import TenancyFilterForm -from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterField +from utilities.forms.fields import ( + ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, TagFilterField, +) +from utilities.forms.utils import add_blank_choice +from virtualization.models import VirtualMachine from vpn.choices import * +from vpn.constants import L2VPN_ASSIGNMENT_MODELS from vpn.models import * __all__ = ( @@ -13,6 +21,8 @@ __all__ = ( 'IPSecPolicyFilterForm', 'IPSecProfileFilterForm', 'IPSecProposalFilterForm', + 'L2VPNFilterForm', + 'L2VPNTerminationFilterForm', 'TunnelFilterForm', 'TunnelTerminationFilterForm', ) @@ -180,3 +190,90 @@ class IPSecProfileFilterForm(NetBoxModelFilterSetForm): label=_('IPSec policy') ) tag = TagFilterField(model) + + +class L2VPNFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): + model = L2VPN + fieldsets = ( + (None, ('q', 'filter_id', 'tag')), + (_('Attributes'), ('type', 'import_target_id', 'export_target_id')), + (_('Tenant'), ('tenant_group_id', 'tenant_id')), + ) + type = forms.ChoiceField( + label=_('Type'), + choices=add_blank_choice(L2VPNTypeChoices), + required=False + ) + import_target_id = DynamicModelMultipleChoiceField( + queryset=RouteTarget.objects.all(), + required=False, + label=_('Import targets') + ) + export_target_id = DynamicModelMultipleChoiceField( + queryset=RouteTarget.objects.all(), + required=False, + label=_('Export targets') + ) + tag = TagFilterField(model) + + +class L2VPNTerminationFilterForm(NetBoxModelFilterSetForm): + model = L2VPNTermination + fieldsets = ( + (None, ('filter_id', 'l2vpn_id',)), + (_('Assigned Object'), ( + 'assigned_object_type_id', 'region_id', 'site_id', 'device_id', 'virtual_machine_id', 'vlan_id', + )), + ) + l2vpn_id = DynamicModelChoiceField( + queryset=L2VPN.objects.all(), + required=False, + label=_('L2VPN') + ) + assigned_object_type_id = ContentTypeMultipleChoiceField( + queryset=ContentType.objects.filter(L2VPN_ASSIGNMENT_MODELS), + required=False, + label=_('Assigned Object Type'), + limit_choices_to=L2VPN_ASSIGNMENT_MODELS + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region') + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + null_option='None', + query_params={ + 'region_id': '$region_id' + }, + label=_('Site') + ) + device_id = DynamicModelMultipleChoiceField( + queryset=Device.objects.all(), + required=False, + null_option='None', + query_params={ + 'site_id': '$site_id' + }, + label=_('Device') + ) + vlan_id = DynamicModelMultipleChoiceField( + queryset=VLAN.objects.all(), + required=False, + null_option='None', + query_params={ + 'site_id': '$site_id' + }, + label=_('VLAN') + ) + virtual_machine_id = DynamicModelMultipleChoiceField( + queryset=VirtualMachine.objects.all(), + required=False, + null_option='None', + query_params={ + 'site_id': '$site_id' + }, + label=_('Virtual Machine') + ) diff --git a/netbox/vpn/forms/model_forms.py b/netbox/vpn/forms/model_forms.py index 35fa2cad3..e61993ddd 100644 --- a/netbox/vpn/forms/model_forms.py +++ b/netbox/vpn/forms/model_forms.py @@ -1,11 +1,12 @@ from django import forms +from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from dcim.models import Device, Interface -from ipam.models import IPAddress +from ipam.models import IPAddress, RouteTarget, VLAN from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm -from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField +from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField from utilities.forms.utils import add_blank_choice from utilities.forms.widgets import HTMXSelect from virtualization.models import VirtualMachine, VMInterface @@ -18,6 +19,8 @@ __all__ = ( 'IPSecPolicyForm', 'IPSecProfileForm', 'IPSecProposalForm', + 'L2VPNForm', + 'L2VPNTerminationForm', 'TunnelCreateForm', 'TunnelForm', 'TunnelTerminationForm', @@ -355,3 +358,96 @@ class IPSecProfileForm(NetBoxModelForm): fields = [ 'name', 'description', 'mode', 'ike_policy', 'ipsec_policy', 'description', 'comments', 'tags', ] + + +# +# L2VPN +# + +class L2VPNForm(TenancyForm, NetBoxModelForm): + slug = SlugField() + import_targets = DynamicModelMultipleChoiceField( + label=_('Import targets'), + queryset=RouteTarget.objects.all(), + required=False + ) + export_targets = DynamicModelMultipleChoiceField( + label=_('Export targets'), + queryset=RouteTarget.objects.all(), + required=False + ) + comments = CommentField() + + fieldsets = ( + (_('L2VPN'), ('name', 'slug', 'type', 'identifier', 'description', 'tags')), + (_('Route Targets'), ('import_targets', 'export_targets')), + (_('Tenancy'), ('tenant_group', 'tenant')), + ) + + class Meta: + model = L2VPN + fields = ( + 'name', 'slug', 'type', 'identifier', 'import_targets', 'export_targets', 'tenant', 'description', + 'comments', 'tags' + ) + + +class L2VPNTerminationForm(NetBoxModelForm): + l2vpn = DynamicModelChoiceField( + queryset=L2VPN.objects.all(), + required=True, + query_params={}, + label=_('L2VPN'), + fetch_trigger='open' + ) + vlan = DynamicModelChoiceField( + queryset=VLAN.objects.all(), + required=False, + selector=True, + label=_('VLAN') + ) + interface = DynamicModelChoiceField( + label=_('Interface'), + queryset=Interface.objects.all(), + required=False, + selector=True + ) + vminterface = DynamicModelChoiceField( + queryset=VMInterface.objects.all(), + required=False, + selector=True, + label=_('Interface') + ) + + class Meta: + model = L2VPNTermination + fields = ('l2vpn', ) + + def __init__(self, *args, **kwargs): + instance = kwargs.get('instance') + initial = kwargs.get('initial', {}).copy() + + if instance: + if type(instance.assigned_object) is Interface: + initial['interface'] = instance.assigned_object + elif type(instance.assigned_object) is VLAN: + initial['vlan'] = instance.assigned_object + elif type(instance.assigned_object) is VMInterface: + initial['vminterface'] = instance.assigned_object + kwargs['initial'] = initial + + super().__init__(*args, **kwargs) + + def clean(self): + super().clean() + + interface = self.cleaned_data.get('interface') + vminterface = self.cleaned_data.get('vminterface') + vlan = self.cleaned_data.get('vlan') + + if not (interface or vminterface or vlan): + raise ValidationError(_('A termination must specify an interface or VLAN.')) + if len([x for x in (interface, vminterface, vlan) if x]) > 1: + raise ValidationError(_('A termination can only have one terminating object (an interface or VLAN).')) + + self.instance.assigned_object = interface or vminterface or vlan diff --git a/netbox/vpn/graphql/gfk_mixins.py b/netbox/vpn/graphql/gfk_mixins.py new file mode 100644 index 000000000..72272f7ad --- /dev/null +++ b/netbox/vpn/graphql/gfk_mixins.py @@ -0,0 +1,30 @@ +import graphene + +from dcim.graphql.types import InterfaceType +from dcim.models import Interface +from ipam.graphql.types import VLANType +from ipam.models import VLAN +from virtualization.graphql.types import VMInterfaceType +from virtualization.models import VMInterface + +__all__ = ( + 'L2VPNAssignmentType', +) + + +class L2VPNAssignmentType(graphene.Union): + class Meta: + types = ( + InterfaceType, + VLANType, + VMInterfaceType, + ) + + @classmethod + def resolve_type(cls, instance, info): + if type(instance) is Interface: + return InterfaceType + if type(instance) is VLAN: + return VLANType + if type(instance) is VMInterface: + return VMInterfaceType diff --git a/netbox/vpn/graphql/schema.py b/netbox/vpn/graphql/schema.py index 64e680882..9c8e1e502 100644 --- a/netbox/vpn/graphql/schema.py +++ b/netbox/vpn/graphql/schema.py @@ -38,6 +38,18 @@ class VPNQuery(graphene.ObjectType): def resolve_ipsec_proposal_list(root, info, **kwargs): return gql_query_optimizer(models.IPSecProposal.objects.all(), info) + l2vpn = ObjectField(L2VPNType) + l2vpn_list = ObjectListField(L2VPNType) + + def resolve_l2vpn_list(root, info, **kwargs): + return gql_query_optimizer(models.L2VPN.objects.all(), info) + + l2vpn_termination = ObjectField(L2VPNTerminationType) + l2vpn_termination_list = ObjectListField(L2VPNTerminationType) + + def resolve_l2vpn_termination_list(root, info, **kwargs): + return gql_query_optimizer(models.L2VPNTermination.objects.all(), info) + tunnel = ObjectField(TunnelType) tunnel_list = ObjectListField(TunnelType) diff --git a/netbox/vpn/graphql/types.py b/netbox/vpn/graphql/types.py index f46e8b697..840a44c7b 100644 --- a/netbox/vpn/graphql/types.py +++ b/netbox/vpn/graphql/types.py @@ -1,4 +1,6 @@ -from extras.graphql.mixins import CustomFieldsMixin, TagsMixin +import graphene + +from extras.graphql.mixins import ContactsMixin, CustomFieldsMixin, TagsMixin from netbox.graphql.types import ObjectType, OrganizationalObjectType, NetBoxObjectType from vpn import filtersets, models @@ -8,6 +10,8 @@ __all__ = ( 'IPSecPolicyType', 'IPSecProfileType', 'IPSecProposalType', + 'L2VPNType', + 'L2VPNTerminationType', 'TunnelTerminationType', 'TunnelType', ) @@ -67,3 +71,19 @@ class IPSecProfileType(OrganizationalObjectType): model = models.IPSecProfile fields = '__all__' filterset_class = filtersets.IPSecProfileFilterSet + + +class L2VPNType(ContactsMixin, NetBoxObjectType): + class Meta: + model = models.L2VPN + fields = '__all__' + filtersets_class = filtersets.L2VPNFilterSet + + +class L2VPNTerminationType(NetBoxObjectType): + assigned_object = graphene.Field('vpn.graphql.gfk_mixins.L2VPNAssignmentType') + + class Meta: + model = models.L2VPNTermination + exclude = ('assigned_object_type', 'assigned_object_id') + filtersets_class = filtersets.L2VPNTerminationFilterSet diff --git a/netbox/vpn/migrations/0002_move_l2vpn.py b/netbox/vpn/migrations/0002_move_l2vpn.py new file mode 100644 index 000000000..3ec49f830 --- /dev/null +++ b/netbox/vpn/migrations/0002_move_l2vpn.py @@ -0,0 +1,73 @@ +from django.db import migrations, models +import django.db.models.deletion +import taggit.managers +import utilities.json + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0099_cachedvalue_ordering'), + ('contenttypes', '0002_remove_content_type_name'), + ('tenancy', '0012_contactassignment_custom_fields'), + ('ipam', '0068_move_l2vpn'), + ('vpn', '0001_initial'), + ] + + operations = [ + migrations.SeparateDatabaseAndState( + state_operations=[ + migrations.CreateModel( + name='L2VPN', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), + ('slug', models.SlugField(max_length=100, unique=True)), + ('type', models.CharField(max_length=50)), + ('identifier', models.BigIntegerField(blank=True, null=True)), + ('export_targets', models.ManyToManyField(blank=True, related_name='exporting_l2vpns', to='ipam.routetarget')), + ('import_targets', models.ManyToManyField(blank=True, related_name='importing_l2vpns', to='ipam.routetarget')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ('tenant', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='l2vpns', to='tenancy.tenant')), + ], + options={ + 'verbose_name': 'L2VPN', + 'verbose_name_plural': 'L2VPNs', + 'ordering': ('name', 'identifier'), + }, + ), + migrations.CreateModel( + name='L2VPNTermination', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('assigned_object_id', models.PositiveBigIntegerField()), + ('assigned_object_type', models.ForeignKey(limit_choices_to=models.Q(models.Q(models.Q(('app_label', 'dcim'), ('model', 'interface')), models.Q(('app_label', 'ipam'), ('model', 'vlan')), models.Q(('app_label', 'virtualization'), ('model', 'vminterface')), _connector='OR')), on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype')), + ('l2vpn', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='terminations', to='vpn.l2vpn')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'L2VPN termination', + 'verbose_name_plural': 'L2VPN terminations', + 'ordering': ('l2vpn',), + }, + ), + ], + # Tables have been renamed from ipam + database_operations=[], + ), + migrations.AddConstraint( + model_name='l2vpntermination', + constraint=models.UniqueConstraint( + fields=('assigned_object_type', 'assigned_object_id'), + name='vpn_l2vpntermination_assigned_object' + ), + ), + ] diff --git a/netbox/vpn/models/__init__.py b/netbox/vpn/models/__init__.py index 3b70eb418..2e76b980b 100644 --- a/netbox/vpn/models/__init__.py +++ b/netbox/vpn/models/__init__.py @@ -1,2 +1,3 @@ from .crypto import * +from .l2vpn import * from .tunnels import * diff --git a/netbox/ipam/models/l2vpn.py b/netbox/vpn/models/l2vpn.py similarity index 93% rename from netbox/ipam/models/l2vpn.py rename to netbox/vpn/models/l2vpn.py index a2742a8f3..f1a142283 100644 --- a/netbox/ipam/models/l2vpn.py +++ b/netbox/vpn/models/l2vpn.py @@ -6,10 +6,10 @@ from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ from core.models import ContentType -from ipam.choices import L2VPNTypeChoices -from ipam.constants import L2VPN_ASSIGNMENT_MODELS from netbox.models import NetBoxModel, PrimaryModel from netbox.models.features import ContactsMixin +from vpn.choices import L2VPNTypeChoices +from vpn.constants import L2VPN_ASSIGNMENT_MODELS __all__ = ( 'L2VPN', @@ -69,7 +69,7 @@ class L2VPN(ContactsMixin, PrimaryModel): return f'{self.name}' def get_absolute_url(self): - return reverse('ipam:l2vpn', args=[self.pk]) + return reverse('vpn:l2vpn', args=[self.pk]) @cached_property def can_add_termination(self): @@ -81,7 +81,7 @@ class L2VPN(ContactsMixin, PrimaryModel): class L2VPNTermination(NetBoxModel): l2vpn = models.ForeignKey( - to='ipam.L2VPN', + to='vpn.L2VPN', on_delete=models.CASCADE, related_name='terminations' ) @@ -99,7 +99,7 @@ class L2VPNTermination(NetBoxModel): clone_fields = ('l2vpn',) prerequisite_models = ( - 'ipam.L2VPN', + 'vpn.L2VPN', ) class Meta: @@ -107,7 +107,7 @@ class L2VPNTermination(NetBoxModel): constraints = ( models.UniqueConstraint( fields=('assigned_object_type', 'assigned_object_id'), - name='ipam_l2vpntermination_assigned_object' + name='vpn_l2vpntermination_assigned_object' ), ) verbose_name = _('L2VPN termination') @@ -119,7 +119,7 @@ class L2VPNTermination(NetBoxModel): return super().__str__() def get_absolute_url(self): - return reverse('ipam:l2vpntermination', args=[self.pk]) + return reverse('vpn:l2vpntermination', args=[self.pk]) def clean(self): # Only check is assigned_object is set. Required otherwise we have an Integrity Error thrown. diff --git a/netbox/vpn/search.py b/netbox/vpn/search.py index 70b0c644f..d0b2ad0c6 100644 --- a/netbox/vpn/search.py +++ b/netbox/vpn/search.py @@ -63,3 +63,15 @@ class IPSecProfileIndex(SearchIndex): ('comments', 5000), ) display_attrs = ('description',) + + +@register_search +class L2VPNIndex(SearchIndex): + model = models.L2VPN + fields = ( + ('name', 100), + ('slug', 110), + ('description', 500), + ('comments', 5000), + ) + display_attrs = ('type', 'identifier', 'tenant', 'description') diff --git a/netbox/vpn/tables/__init__.py b/netbox/vpn/tables/__init__.py new file mode 100644 index 000000000..2e76b980b --- /dev/null +++ b/netbox/vpn/tables/__init__.py @@ -0,0 +1,3 @@ +from .crypto import * +from .l2vpn import * +from .tunnels import * diff --git a/netbox/vpn/tables.py b/netbox/vpn/tables/crypto.py similarity index 65% rename from netbox/vpn/tables.py rename to netbox/vpn/tables/crypto.py index 304467586..cd6d3c24d 100644 --- a/netbox/vpn/tables.py +++ b/netbox/vpn/tables/crypto.py @@ -1,8 +1,6 @@ import django_tables2 as tables from django.utils.translation import gettext_lazy as _ -from django_tables2.utils import Accessor -from tenancy.tables import TenancyColumnsMixin from netbox.tables import NetBoxTable, columns from vpn.models import * @@ -12,88 +10,9 @@ __all__ = ( 'IPSecPolicyTable', 'IPSecProposalTable', 'IPSecProfileTable', - 'TunnelTable', - 'TunnelTerminationTable', ) -class TunnelTable(TenancyColumnsMixin, NetBoxTable): - name = tables.Column( - verbose_name=_('Name'), - linkify=True - ) - status = columns.ChoiceFieldColumn( - verbose_name=_('Status') - ) - ipsec_profile = tables.Column( - verbose_name=_('IPSec profile'), - linkify=True - ) - terminations_count = columns.LinkedCountColumn( - accessor=Accessor('count_terminations'), - viewname='vpn:tunneltermination_list', - url_params={'tunnel_id': 'pk'}, - verbose_name=_('Terminations') - ) - comments = columns.MarkdownColumn( - verbose_name=_('Comments'), - ) - tags = columns.TagColumn( - url_name='vpn:tunnel_list' - ) - - class Meta(NetBoxTable.Meta): - model = Tunnel - fields = ( - 'pk', 'id', 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tenant_group', 'tunnel_id', - 'termination_count', 'description', 'comments', 'tags', 'created', 'last_updated', - ) - default_columns = ('pk', 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'terminations_count') - - -class TunnelTerminationTable(TenancyColumnsMixin, NetBoxTable): - tunnel = tables.Column( - verbose_name=_('Tunnel'), - linkify=True - ) - role = columns.ChoiceFieldColumn( - verbose_name=_('Role') - ) - termination_parent = tables.Column( - accessor='termination__parent_object', - linkify=True, - orderable=False, - verbose_name=_('Host') - ) - termination = tables.Column( - verbose_name=_('Termination'), - linkify=True - ) - ip_addresses = tables.ManyToManyColumn( - accessor=tables.A('termination__ip_addresses'), - orderable=False, - linkify_item=True, - verbose_name=_('IP Addresses') - ) - outside_ip = tables.Column( - verbose_name=_('Outside IP'), - linkify=True - ) - tags = columns.TagColumn( - url_name='vpn:tunneltermination_list' - ) - - class Meta(NetBoxTable.Meta): - model = TunnelTermination - fields = ( - 'pk', 'id', 'tunnel', 'role', 'termination_parent', 'termination', 'ip_addresses', 'outside_ip', 'tags', - 'created', 'last_updated', - ) - default_columns = ( - 'pk', 'id', 'tunnel', 'role', 'termination_parent', 'termination', 'ip_addresses', 'outside_ip', - ) - - class IKEProposalTable(NetBoxTable): name = tables.Column( verbose_name=_('Name'), diff --git a/netbox/ipam/tables/l2vpn.py b/netbox/vpn/tables/l2vpn.py similarity index 96% rename from netbox/ipam/tables/l2vpn.py rename to netbox/vpn/tables/l2vpn.py index 8635ab62a..1f8b2c0d7 100644 --- a/netbox/ipam/tables/l2vpn.py +++ b/netbox/vpn/tables/l2vpn.py @@ -1,9 +1,9 @@ -from django.utils.translation import gettext_lazy as _ import django_tables2 as tables +from django.utils.translation import gettext_lazy as _ -from ipam.models import L2VPN, L2VPNTermination from netbox.tables import NetBoxTable, columns from tenancy.tables import TenancyColumnsMixin +from vpn.models import L2VPN, L2VPNTermination __all__ = ( 'L2VPNTable', @@ -37,7 +37,7 @@ class L2VPNTable(TenancyColumnsMixin, NetBoxTable): verbose_name=_('Comments'), ) tags = columns.TagColumn( - url_name='ipam:l2vpn_list' + url_name='vpn:l2vpn_list' ) class Meta(NetBoxTable.Meta): diff --git a/netbox/vpn/tables/tunnels.py b/netbox/vpn/tables/tunnels.py new file mode 100644 index 000000000..4023607ff --- /dev/null +++ b/netbox/vpn/tables/tunnels.py @@ -0,0 +1,87 @@ +import django_tables2 as tables +from django.utils.translation import gettext_lazy as _ +from django_tables2.utils import Accessor + +from netbox.tables import NetBoxTable, columns +from tenancy.tables import TenancyColumnsMixin +from vpn.models import * + +__all__ = ( + 'TunnelTable', + 'TunnelTerminationTable', +) + + +class TunnelTable(TenancyColumnsMixin, NetBoxTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + status = columns.ChoiceFieldColumn( + verbose_name=_('Status') + ) + ipsec_profile = tables.Column( + verbose_name=_('IPSec profile'), + linkify=True + ) + terminations_count = columns.LinkedCountColumn( + accessor=Accessor('count_terminations'), + viewname='vpn:tunneltermination_list', + url_params={'tunnel_id': 'pk'}, + verbose_name=_('Terminations') + ) + comments = columns.MarkdownColumn( + verbose_name=_('Comments'), + ) + tags = columns.TagColumn( + url_name='vpn:tunnel_list' + ) + + class Meta(NetBoxTable.Meta): + model = Tunnel + fields = ( + 'pk', 'id', 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tenant_group', 'tunnel_id', + 'termination_count', 'description', 'comments', 'tags', 'created', 'last_updated', + ) + default_columns = ('pk', 'name', 'status', 'encapsulation', 'tenant', 'terminations_count') + + +class TunnelTerminationTable(TenancyColumnsMixin, NetBoxTable): + tunnel = tables.Column( + verbose_name=_('Tunnel'), + linkify=True + ) + role = columns.ChoiceFieldColumn( + verbose_name=_('Role') + ) + interface_parent = tables.Column( + accessor='interface__parent_object', + linkify=True, + orderable=False, + verbose_name=_('Host') + ) + interface = tables.Column( + verbose_name=_('Interface'), + linkify=True + ) + ip_addresses = tables.ManyToManyColumn( + accessor=tables.A('interface__ip_addresses'), + orderable=False, + linkify_item=True, + verbose_name=_('IP Addresses') + ) + outside_ip = tables.Column( + verbose_name=_('Outside IP'), + linkify=True + ) + tags = columns.TagColumn( + url_name='vpn:tunneltermination_list' + ) + + class Meta(NetBoxTable.Meta): + model = TunnelTermination + fields = ( + 'pk', 'id', 'tunnel', 'role', 'interface_parent', 'interface', 'ip_addresses', 'outside_ip', 'tags', + 'created', 'last_updated', + ) + default_columns = ('pk', 'id', 'tunnel', 'role', 'interface_parent', 'interface', 'ip_addresses', 'outside_ip') diff --git a/netbox/vpn/tests/test_api.py b/netbox/vpn/tests/test_api.py index 9bfa297ab..2714bd4fc 100644 --- a/netbox/vpn/tests/test_api.py +++ b/netbox/vpn/tests/test_api.py @@ -2,6 +2,7 @@ from django.urls import reverse from dcim.choices import InterfaceTypeChoices from dcim.models import Interface +from ipam.models import VLAN from utilities.testing import APITestCase, APIViewTestCases, create_test_device from vpn.choices import * from vpn.models import * @@ -471,3 +472,96 @@ class IPSecProfileTest(APIViewTestCases.APIViewTestCase): 'ipsec_policy': ipsec_policies[1].pk, 'description': 'New description', } + + +class L2VPNTest(APIViewTestCases.APIViewTestCase): + model = L2VPN + brief_fields = ['display', 'id', 'identifier', 'name', 'slug', 'type', 'url'] + create_data = [ + { + 'name': 'L2VPN 4', + 'slug': 'l2vpn-4', + 'type': 'vxlan', + 'identifier': 33343344 + }, + { + 'name': 'L2VPN 5', + 'slug': 'l2vpn-5', + 'type': 'vxlan', + 'identifier': 33343345 + }, + { + 'name': 'L2VPN 6', + 'slug': 'l2vpn-6', + 'type': 'vpws', + 'identifier': 33343346 + }, + ] + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + + l2vpns = ( + L2VPN(name='L2VPN 1', slug='l2vpn-1', type='vxlan', identifier=650001), + L2VPN(name='L2VPN 2', slug='l2vpn-2', type='vpws', identifier=650002), + L2VPN(name='L2VPN 3', slug='l2vpn-3', type='vpls'), # No RD + ) + L2VPN.objects.bulk_create(l2vpns) + + +class L2VPNTerminationTest(APIViewTestCases.APIViewTestCase): + model = L2VPNTermination + brief_fields = ['display', 'id', 'l2vpn', 'url'] + + @classmethod + def setUpTestData(cls): + + vlans = ( + VLAN(name='VLAN 1', vid=651), + VLAN(name='VLAN 2', vid=652), + VLAN(name='VLAN 3', vid=653), + VLAN(name='VLAN 4', vid=654), + VLAN(name='VLAN 5', vid=655), + VLAN(name='VLAN 6', vid=656), + VLAN(name='VLAN 7', vid=657) + ) + VLAN.objects.bulk_create(vlans) + + l2vpns = ( + L2VPN(name='L2VPN 1', slug='l2vpn-1', type='vxlan', identifier=650001), + L2VPN(name='L2VPN 2', slug='l2vpn-2', type='vpws', identifier=650002), + L2VPN(name='L2VPN 3', slug='l2vpn-3', type='vpls'), # No RD + ) + L2VPN.objects.bulk_create(l2vpns) + + l2vpnterminations = ( + L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[0]), + L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[1]), + L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[2]) + ) + L2VPNTermination.objects.bulk_create(l2vpnterminations) + + cls.create_data = [ + { + 'l2vpn': l2vpns[0].pk, + 'assigned_object_type': 'ipam.vlan', + 'assigned_object_id': vlans[3].pk, + }, + { + 'l2vpn': l2vpns[0].pk, + 'assigned_object_type': 'ipam.vlan', + 'assigned_object_id': vlans[4].pk, + }, + { + 'l2vpn': l2vpns[0].pk, + 'assigned_object_type': 'ipam.vlan', + 'assigned_object_id': vlans[5].pk, + }, + ] + + cls.bulk_update_data = { + 'l2vpn': l2vpns[2].pk + } diff --git a/netbox/vpn/tests/test_filtersets.py b/netbox/vpn/tests/test_filtersets.py index 966717f4a..a9eeb1203 100644 --- a/netbox/vpn/tests/test_filtersets.py +++ b/netbox/vpn/tests/test_filtersets.py @@ -1,13 +1,14 @@ +from django.contrib.contenttypes.models import ContentType from django.test import TestCase from dcim.choices import InterfaceTypeChoices -from dcim.models import Interface -from ipam.models import IPAddress -from virtualization.models import VMInterface +from dcim.models import Device, Interface, Site +from ipam.models import IPAddress, VLAN, RouteTarget +from utilities.testing import ChangeLoggedFilterSetTests, create_test_device, create_test_virtualmachine +from virtualization.models import VirtualMachine, VMInterface from vpn.choices import * from vpn.filtersets import * from vpn.models import * -from utilities.testing import ChangeLoggedFilterSetTests, create_test_device, create_test_virtualmachine class TunnelTestCase(TestCase, ChangeLoggedFilterSetTests): @@ -590,3 +591,163 @@ class IPSecProfileTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) params = {'ipsec_policy': [ipsec_policies[0].name, ipsec_policies[1].name]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class L2VPNTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = L2VPN.objects.all() + filterset = L2VPNFilterSet + + @classmethod + def setUpTestData(cls): + + route_targets = ( + RouteTarget(name='1:1'), + RouteTarget(name='1:2'), + RouteTarget(name='1:3'), + RouteTarget(name='2:1'), + RouteTarget(name='2:2'), + RouteTarget(name='2:3'), + ) + RouteTarget.objects.bulk_create(route_targets) + + l2vpns = ( + L2VPN(name='L2VPN 1', slug='l2vpn-1', type=L2VPNTypeChoices.TYPE_VXLAN, identifier=65001), + L2VPN(name='L2VPN 2', slug='l2vpn-2', type=L2VPNTypeChoices.TYPE_VPWS, identifier=65002), + L2VPN(name='L2VPN 3', slug='l2vpn-3', type=L2VPNTypeChoices.TYPE_VPLS), + ) + L2VPN.objects.bulk_create(l2vpns) + l2vpns[0].import_targets.add(route_targets[0]) + l2vpns[1].import_targets.add(route_targets[1]) + l2vpns[2].import_targets.add(route_targets[2]) + l2vpns[0].export_targets.add(route_targets[3]) + l2vpns[1].export_targets.add(route_targets[4]) + l2vpns[2].export_targets.add(route_targets[5]) + + def test_name(self): + params = {'name': ['L2VPN 1', 'L2VPN 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_slug(self): + params = {'slug': ['l2vpn-1', 'l2vpn-2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_identifier(self): + params = {'identifier': ['65001', '65002']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_type(self): + params = {'type': [L2VPNTypeChoices.TYPE_VXLAN, L2VPNTypeChoices.TYPE_VPWS]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_import_targets(self): + route_targets = RouteTarget.objects.filter(name__in=['1:1', '1:2']) + params = {'import_target_id': [route_targets[0].pk, route_targets[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'import_target': [route_targets[0].name, route_targets[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_export_targets(self): + route_targets = RouteTarget.objects.filter(name__in=['2:1', '2:2']) + params = {'export_target_id': [route_targets[0].pk, route_targets[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'export_target': [route_targets[0].name, route_targets[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class L2VPNTerminationTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = L2VPNTermination.objects.all() + filterset = L2VPNTerminationFilterSet + + @classmethod + def setUpTestData(cls): + device = create_test_device('Device 1') + interfaces = ( + Interface(name='Interface 1', device=device, type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(name='Interface 2', device=device, type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(name='Interface 3', device=device, type=InterfaceTypeChoices.TYPE_1GE_FIXED), + ) + Interface.objects.bulk_create(interfaces) + + vm = create_test_virtualmachine('Virtual Machine 1') + vminterfaces = ( + VMInterface(name='Interface 1', virtual_machine=vm), + VMInterface(name='Interface 2', virtual_machine=vm), + VMInterface(name='Interface 3', virtual_machine=vm), + ) + VMInterface.objects.bulk_create(vminterfaces) + + vlans = ( + VLAN(name='VLAN 1', vid=101), + VLAN(name='VLAN 2', vid=102), + VLAN(name='VLAN 3', vid=103), + ) + VLAN.objects.bulk_create(vlans) + + l2vpns = ( + L2VPN(name='L2VPN 1', slug='l2vpn-1', type='vxlan', identifier=65001), + L2VPN(name='L2VPN 2', slug='l2vpn-2', type='vpws', identifier=65002), + L2VPN(name='L2VPN 3', slug='l2vpn-3', type='vpls'), # No RD, + ) + L2VPN.objects.bulk_create(l2vpns) + + l2vpnterminations = ( + L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[0]), + L2VPNTermination(l2vpn=l2vpns[1], assigned_object=vlans[1]), + L2VPNTermination(l2vpn=l2vpns[2], assigned_object=vlans[2]), + L2VPNTermination(l2vpn=l2vpns[0], assigned_object=interfaces[0]), + L2VPNTermination(l2vpn=l2vpns[1], assigned_object=interfaces[1]), + L2VPNTermination(l2vpn=l2vpns[2], assigned_object=interfaces[2]), + L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vminterfaces[0]), + L2VPNTermination(l2vpn=l2vpns[1], assigned_object=vminterfaces[1]), + L2VPNTermination(l2vpn=l2vpns[2], assigned_object=vminterfaces[2]), + ) + L2VPNTermination.objects.bulk_create(l2vpnterminations) + + def test_l2vpn(self): + l2vpns = L2VPN.objects.all()[:2] + params = {'l2vpn_id': [l2vpns[0].pk, l2vpns[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + params = {'l2vpn': [l2vpns[0].slug, l2vpns[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + + def test_content_type(self): + params = {'assigned_object_type_id': ContentType.objects.get(model='vlan').pk} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + def test_interface(self): + interfaces = Interface.objects.all()[:2] + params = {'interface_id': [interfaces[0].pk, interfaces[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_vminterface(self): + vminterfaces = VMInterface.objects.all()[:2] + params = {'vminterface_id': [vminterfaces[0].pk, vminterfaces[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_vlan(self): + vlans = VLAN.objects.all()[:2] + params = {'vlan_id': [vlans[0].pk, vlans[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'vlan': ['VLAN 1', 'VLAN 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_site(self): + site = Site.objects.all().first() + params = {'site_id': [site.pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + params = {'site': ['site-1']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + def test_device(self): + device = Device.objects.all().first() + params = {'device_id': [device.pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + params = {'device': ['Device 1']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + def test_virtual_machine(self): + virtual_machine = VirtualMachine.objects.all().first() + params = {'virtual_machine_id': [virtual_machine.pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + params = {'virtual_machine': ['Virtual Machine 1']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) diff --git a/netbox/vpn/tests/test_models.py b/netbox/vpn/tests/test_models.py new file mode 100644 index 000000000..e464dccd9 --- /dev/null +++ b/netbox/vpn/tests/test_models.py @@ -0,0 +1,79 @@ +from django.core.exceptions import ValidationError +from django.test import TestCase + +from dcim.models import Interface, Device, DeviceRole, DeviceType, Manufacturer, Site +from ipam.models import VLAN +from vpn.models import * + + +class TestL2VPNTermination(TestCase): + + @classmethod + def setUpTestData(cls): + + site = Site.objects.create(name='Site 1') + manufacturer = Manufacturer.objects.create(name='Manufacturer 1') + device_type = DeviceType.objects.create(model='Device Type 1', manufacturer=manufacturer) + role = DeviceRole.objects.create(name='Switch') + device = Device.objects.create( + name='Device 1', + site=site, + device_type=device_type, + role=role, + status='active' + ) + + interfaces = ( + Interface(name='Interface 1', device=device, type='1000baset'), + Interface(name='Interface 2', device=device, type='1000baset'), + Interface(name='Interface 3', device=device, type='1000baset'), + Interface(name='Interface 4', device=device, type='1000baset'), + Interface(name='Interface 5', device=device, type='1000baset'), + ) + + Interface.objects.bulk_create(interfaces) + + vlans = ( + VLAN(name='VLAN 1', vid=651), + VLAN(name='VLAN 2', vid=652), + VLAN(name='VLAN 3', vid=653), + VLAN(name='VLAN 4', vid=654), + VLAN(name='VLAN 5', vid=655), + VLAN(name='VLAN 6', vid=656), + VLAN(name='VLAN 7', vid=657) + ) + + VLAN.objects.bulk_create(vlans) + + l2vpns = ( + L2VPN(name='L2VPN 1', slug='l2vpn-1', type='vxlan', identifier=650001), + L2VPN(name='L2VPN 2', slug='l2vpn-2', type='vpws', identifier=650002), + L2VPN(name='L2VPN 3', slug='l2vpn-3', type='vpls'), # No RD + ) + L2VPN.objects.bulk_create(l2vpns) + + l2vpnterminations = ( + L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[0]), + L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[1]), + L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[2]) + ) + + L2VPNTermination.objects.bulk_create(l2vpnterminations) + + def test_duplicate_interface_terminations(self): + device = Device.objects.first() + interface = Interface.objects.filter(device=device).first() + l2vpn = L2VPN.objects.first() + + L2VPNTermination.objects.create(l2vpn=l2vpn, assigned_object=interface) + duplicate = L2VPNTermination(l2vpn=l2vpn, assigned_object=interface) + + self.assertRaises(ValidationError, duplicate.clean) + + def test_duplicate_vlan_terminations(self): + vlan = Interface.objects.first() + l2vpn = L2VPN.objects.first() + + L2VPNTermination.objects.create(l2vpn=l2vpn, assigned_object=vlan) + duplicate = L2VPNTermination(l2vpn=l2vpn, assigned_object=vlan) + self.assertRaises(ValidationError, duplicate.clean) diff --git a/netbox/vpn/tests/test_views.py b/netbox/vpn/tests/test_views.py index 433eca467..4d9080422 100644 --- a/netbox/vpn/tests/test_views.py +++ b/netbox/vpn/tests/test_views.py @@ -1,8 +1,9 @@ from dcim.choices import InterfaceTypeChoices from dcim.models import Interface +from ipam.models import RouteTarget, VLAN +from utilities.testing import ViewTestCases, create_tags, create_test_device from vpn.choices import * from vpn.models import * -from utilities.testing import ViewTestCases, create_tags, create_test_device class TunnelTestCase(ViewTestCases.PrimaryObjectViewTestCase): @@ -506,3 +507,142 @@ class IPSecProfileTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'ike_policy': ike_policies[1].pk, 'ipsec_policy': ipsec_policies[1].pk, } + + +class L2VPNTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = L2VPN + + @classmethod + def setUpTestData(cls): + rts = ( + RouteTarget(name='64534:123'), + RouteTarget(name='64534:321') + ) + RouteTarget.objects.bulk_create(rts) + + l2vpns = ( + L2VPN(name='L2VPN 1', slug='l2vpn-1', type=L2VPNTypeChoices.TYPE_VXLAN, identifier='650001'), + L2VPN(name='L2VPN 2', slug='l2vpn-2', type=L2VPNTypeChoices.TYPE_VXLAN, identifier='650002'), + L2VPN(name='L2VPN 3', slug='l2vpn-3', type=L2VPNTypeChoices.TYPE_VXLAN, identifier='650003') + ) + L2VPN.objects.bulk_create(l2vpns) + + cls.csv_data = ( + 'name,slug,type,identifier', + 'L2VPN 5,l2vpn-5,vxlan,456', + 'L2VPN 6,l2vpn-6,vxlan,444', + ) + + cls.csv_update_data = ( + 'id,name,description', + f'{l2vpns[0].pk},L2VPN 7,New description 7', + f'{l2vpns[1].pk},L2VPN 8,New description 8', + ) + + cls.bulk_edit_data = { + 'description': 'New Description', + } + + cls.form_data = { + 'name': 'L2VPN 8', + 'slug': 'l2vpn-8', + 'type': L2VPNTypeChoices.TYPE_VXLAN, + 'identifier': 123, + 'description': 'Description', + 'import_targets': [rts[0].pk], + 'export_targets': [rts[1].pk] + } + + +class L2VPNTerminationTestCase( + ViewTestCases.GetObjectViewTestCase, + ViewTestCases.GetObjectChangelogViewTestCase, + ViewTestCases.CreateObjectViewTestCase, + ViewTestCases.EditObjectViewTestCase, + ViewTestCases.DeleteObjectViewTestCase, + ViewTestCases.ListObjectsViewTestCase, + ViewTestCases.BulkImportObjectsViewTestCase, + ViewTestCases.BulkDeleteObjectsViewTestCase, +): + + model = L2VPNTermination + + @classmethod + def setUpTestData(cls): + device = create_test_device('Device 1') + interface = Interface.objects.create(name='Interface 1', device=device, type='1000baset') + l2vpns = ( + L2VPN(name='L2VPN 1', slug='l2vpn-1', type=L2VPNTypeChoices.TYPE_VXLAN, identifier=650001), + L2VPN(name='L2VPN 2', slug='l2vpn-2', type=L2VPNTypeChoices.TYPE_VXLAN, identifier=650002), + ) + L2VPN.objects.bulk_create(l2vpns) + + vlans = ( + VLAN(name='Vlan 1', vid=1001), + VLAN(name='Vlan 2', vid=1002), + VLAN(name='Vlan 3', vid=1003), + VLAN(name='Vlan 4', vid=1004), + VLAN(name='Vlan 5', vid=1005), + VLAN(name='Vlan 6', vid=1006) + ) + VLAN.objects.bulk_create(vlans) + + terminations = ( + L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[0]), + L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[1]), + L2VPNTermination(l2vpn=l2vpns[0], assigned_object=vlans[2]) + ) + L2VPNTermination.objects.bulk_create(terminations) + + cls.form_data = { + 'l2vpn': l2vpns[0].pk, + 'device': device.pk, + 'interface': interface.pk, + } + + cls.csv_data = ( + "l2vpn,vlan", + "L2VPN 1,Vlan 4", + "L2VPN 1,Vlan 5", + "L2VPN 1,Vlan 6", + ) + + cls.csv_update_data = ( + f"id,l2vpn", + f"{terminations[0].pk},{l2vpns[0].name}", + f"{terminations[1].pk},{l2vpns[0].name}", + f"{terminations[2].pk},{l2vpns[0].name}", + ) + + cls.bulk_edit_data = {} + + # TODO: Fix L2VPNTerminationImportForm validation to support bulk updates + def test_bulk_update_objects_with_permission(self): + pass + + # + # Custom assertions + # + + # TODO: Remove this + def assertInstanceEqual(self, instance, data, exclude=None, api=False): + """ + Override parent + """ + if exclude is None: + exclude = [] + + fields = [k for k in data.keys() if k not in exclude] + model_dict = self.model_to_dict(instance, fields=fields, api=api) + + # Omit any dictionary keys which are not instance attributes or have been excluded + relevant_data = { + k: v for k, v in data.items() if hasattr(instance, k) and k not in exclude + } + + # Handle relations on the model + for k, v in model_dict.items(): + if isinstance(v, object) and hasattr(v, 'first'): + model_dict[k] = v.first().pk + + self.assertDictEqual(model_dict, relevant_data) diff --git a/netbox/vpn/urls.py b/netbox/vpn/urls.py index 7fe548245..0e1b1664e 100644 --- a/netbox/vpn/urls.py +++ b/netbox/vpn/urls.py @@ -62,4 +62,20 @@ urlpatterns = [ path('ipsec-profiles/delete/', views.IPSecProfileBulkDeleteView.as_view(), name='ipsecprofile_bulk_delete'), path('ipsec-profiles//', include(get_model_urls('vpn', 'ipsecprofile'))), + # L2VPN + path('l2vpns/', views.L2VPNListView.as_view(), name='l2vpn_list'), + path('l2vpns/add/', views.L2VPNEditView.as_view(), name='l2vpn_add'), + path('l2vpns/import/', views.L2VPNBulkImportView.as_view(), name='l2vpn_import'), + path('l2vpns/edit/', views.L2VPNBulkEditView.as_view(), name='l2vpn_bulk_edit'), + path('l2vpns/delete/', views.L2VPNBulkDeleteView.as_view(), name='l2vpn_bulk_delete'), + path('l2vpns//', include(get_model_urls('vpn', 'l2vpn'))), + + # L2VPN terminations + path('l2vpn-terminations/', views.L2VPNTerminationListView.as_view(), name='l2vpntermination_list'), + path('l2vpn-terminations/add/', views.L2VPNTerminationEditView.as_view(), name='l2vpntermination_add'), + path('l2vpn-terminations/import/', views.L2VPNTerminationBulkImportView.as_view(), name='l2vpntermination_import'), + path('l2vpn-terminations/edit/', views.L2VPNTerminationBulkEditView.as_view(), name='l2vpntermination_bulk_edit'), + path('l2vpn-terminations/delete/', views.L2VPNTerminationBulkDeleteView.as_view(), name='l2vpntermination_bulk_delete'), + path('l2vpn-terminations//', include(get_model_urls('vpn', 'l2vpntermination'))), + ] diff --git a/netbox/vpn/views.py b/netbox/vpn/views.py index 56eadc077..f230e4828 100644 --- a/netbox/vpn/views.py +++ b/netbox/vpn/views.py @@ -1,4 +1,6 @@ +from ipam.tables import RouteTargetTable from netbox.views import generic +from tenancy.views import ObjectContactsView from utilities.utils import count_related from utilities.views import register_model_view from . import filtersets, forms, tables @@ -332,3 +334,112 @@ class IPSecProfileBulkDeleteView(generic.BulkDeleteView): queryset = IPSecProfile.objects.all() filterset = filtersets.IPSecProfileFilterSet table = tables.IPSecProfileTable + + +# L2VPN + +class L2VPNListView(generic.ObjectListView): + queryset = L2VPN.objects.all() + table = tables.L2VPNTable + filterset = filtersets.L2VPNFilterSet + filterset_form = forms.L2VPNFilterForm + + +@register_model_view(L2VPN) +class L2VPNView(generic.ObjectView): + queryset = L2VPN.objects.all() + + def get_extra_context(self, request, instance): + import_targets_table = RouteTargetTable( + instance.import_targets.prefetch_related('tenant'), + orderable=False + ) + export_targets_table = RouteTargetTable( + instance.export_targets.prefetch_related('tenant'), + orderable=False + ) + + return { + 'import_targets_table': import_targets_table, + 'export_targets_table': export_targets_table, + } + + +@register_model_view(L2VPN, 'edit') +class L2VPNEditView(generic.ObjectEditView): + queryset = L2VPN.objects.all() + form = forms.L2VPNForm + + +@register_model_view(L2VPN, 'delete') +class L2VPNDeleteView(generic.ObjectDeleteView): + queryset = L2VPN.objects.all() + + +class L2VPNBulkImportView(generic.BulkImportView): + queryset = L2VPN.objects.all() + model_form = forms.L2VPNImportForm + + +class L2VPNBulkEditView(generic.BulkEditView): + queryset = L2VPN.objects.all() + filterset = filtersets.L2VPNFilterSet + table = tables.L2VPNTable + form = forms.L2VPNBulkEditForm + + +class L2VPNBulkDeleteView(generic.BulkDeleteView): + queryset = L2VPN.objects.all() + filterset = filtersets.L2VPNFilterSet + table = tables.L2VPNTable + + +@register_model_view(L2VPN, 'contacts') +class L2VPNContactsView(ObjectContactsView): + queryset = L2VPN.objects.all() + + +# +# L2VPN terminations +# + +class L2VPNTerminationListView(generic.ObjectListView): + queryset = L2VPNTermination.objects.all() + table = tables.L2VPNTerminationTable + filterset = filtersets.L2VPNTerminationFilterSet + filterset_form = forms.L2VPNTerminationFilterForm + + +@register_model_view(L2VPNTermination) +class L2VPNTerminationView(generic.ObjectView): + queryset = L2VPNTermination.objects.all() + + +@register_model_view(L2VPNTermination, 'edit') +class L2VPNTerminationEditView(generic.ObjectEditView): + queryset = L2VPNTermination.objects.all() + form = forms.L2VPNTerminationForm + template_name = 'vpn/l2vpntermination_edit.html' + + +@register_model_view(L2VPNTermination, 'delete') +class L2VPNTerminationDeleteView(generic.ObjectDeleteView): + queryset = L2VPNTermination.objects.all() + + +class L2VPNTerminationBulkImportView(generic.BulkImportView): + queryset = L2VPNTermination.objects.all() + model_form = forms.L2VPNTerminationImportForm + + +class L2VPNTerminationBulkEditView(generic.BulkEditView): + queryset = L2VPNTermination.objects.all() + filterset = filtersets.L2VPNTerminationFilterSet + table = tables.L2VPNTerminationTable + form = forms.L2VPNTerminationBulkEditForm + + +class L2VPNTerminationBulkDeleteView(generic.BulkDeleteView): + queryset = L2VPNTermination.objects.all() + filterset = filtersets.L2VPNTerminationFilterSet + table = tables.L2VPNTerminationTable From 40763b58bdad0892efff418ade3d98fc8cf184d6 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 28 Nov 2023 14:01:03 -0800 Subject: [PATCH 109/271] 14299 change webhook timestamp to isoformat (#14331) * 14299 change timestamp to isoformat * Omit redundant str() casting --------- Co-authored-by: Jeremy Stretch --- netbox/core/models/jobs.py | 2 +- netbox/extras/webhooks.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/core/models/jobs.py b/netbox/core/models/jobs.py index 61b0e64fa..d52cbe165 100644 --- a/netbox/core/models/jobs.py +++ b/netbox/core/models/jobs.py @@ -229,7 +229,7 @@ class Job(models.Model): model_name=self.object_type.model, event=event, data=self.data, - timestamp=str(timezone.now()), + timestamp=timezone.now().isoformat(), username=self.user.username, retry=get_rq_retry() ) diff --git a/netbox/extras/webhooks.py b/netbox/extras/webhooks.py index 1fc869ee8..a22f73c27 100644 --- a/netbox/extras/webhooks.py +++ b/netbox/extras/webhooks.py @@ -115,7 +115,7 @@ def flush_webhooks(queue): event=data['event'], data=data['data'], snapshots=data['snapshots'], - timestamp=str(timezone.now()), + timestamp=timezone.now().isoformat(), username=data['username'], request_id=data['request_id'], retry=get_rq_retry() From 7d413ea3c2dccb78010a4664a23ac1c2b5494a8a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 28 Nov 2023 17:02:07 -0500 Subject: [PATCH 110/271] Fixes #14343: Set order_by accessor for asn_asdot column (#14369) --- netbox/ipam/tables/asn.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/ipam/tables/asn.py b/netbox/ipam/tables/asn.py index 6bb15523e..bbe38dc1a 100644 --- a/netbox/ipam/tables/asn.py +++ b/netbox/ipam/tables/asn.py @@ -48,6 +48,7 @@ class ASNTable(TenancyColumnsMixin, NetBoxTable): asn_asdot = tables.Column( accessor=tables.A('asn_asdot'), linkify=True, + order_by=tables.A('asn'), verbose_name=_('ASDOT') ) site_count = columns.LinkedCountColumn( From 080da68b6adfd9e9d93c4ec2af92e997dc26e6c8 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 28 Nov 2023 14:46:36 -0500 Subject: [PATCH 111/271] Fixes #14349: Fix custom validation support for DataSource --- netbox/core/models/data.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index 54a43c7ef..9e41e8446 100644 --- a/netbox/core/models/data.py +++ b/netbox/core/models/data.py @@ -122,6 +122,7 @@ class DataSource(JobsMixin, PrimaryModel): ) def clean(self): + super().clean() # Ensure URL scheme matches selected type if self.type == DataSourceTypeChoices.LOCAL and self.url_scheme not in ('file', ''): From fc7d6e1387b3fcfd0490f94f249f54cea68bda04 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 28 Nov 2023 17:04:10 -0500 Subject: [PATCH 112/271] Fixes #14325: Ensure expanded numeric arrays are ordered (#14370) * Fixes #14325: Ensure expanded numeric arrays are ordered * Remove redundant casting to --- netbox/utilities/forms/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/utilities/forms/utils.py b/netbox/utilities/forms/utils.py index 4d737f163..64864a6c1 100644 --- a/netbox/utilities/forms/utils.py +++ b/netbox/utilities/forms/utils.py @@ -40,7 +40,7 @@ def parse_numeric_range(string, base=10): except ValueError: raise forms.ValidationError(f'Range "{dash_range}" is invalid.') values.extend(range(begin, end)) - return list(set(values)) + return sorted(set(values)) def parse_alphanumeric_range(string): From 01ba4ce129aa89d74a41b4fbd6994d7559019f96 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 28 Nov 2023 16:58:13 -0500 Subject: [PATCH 113/271] Fixes #14242: Enable export templates for contact assignments --- netbox/tenancy/models/contacts.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/tenancy/models/contacts.py b/netbox/tenancy/models/contacts.py index e8327248d..96ea053f7 100644 --- a/netbox/tenancy/models/contacts.py +++ b/netbox/tenancy/models/contacts.py @@ -5,7 +5,7 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ from netbox.models import ChangeLoggedModel, NestedGroupModel, OrganizationalModel, PrimaryModel -from netbox.models.features import TagsMixin +from netbox.models.features import ExportTemplatesMixin, TagsMixin from tenancy.choices import * __all__ = ( @@ -109,7 +109,7 @@ class Contact(PrimaryModel): return reverse('tenancy:contact', args=[self.pk]) -class ContactAssignment(ChangeLoggedModel, TagsMixin): +class ContactAssignment(ChangeLoggedModel, ExportTemplatesMixin, TagsMixin): content_type = models.ForeignKey( to=ContentType, on_delete=models.CASCADE From 792b353f6477ce9bb3bc2a234dd6313c9fa38402 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 28 Nov 2023 14:40:54 -0500 Subject: [PATCH 114/271] Fixes #14363: Fix bulk editing of interfaces assigned to VM with no cluster --- netbox/virtualization/forms/bulk_edit.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index a33ffac53..e5ab24f2e 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -294,9 +294,10 @@ class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm): # Check interface sites. First interface should set site, further interfaces will either continue the # loop or reset back to no site and break the loop. for interface in interfaces: + vm_site = interface.virtual_machine.site or interface.virtual_machine.cluster.site if site is None: - site = interface.virtual_machine.cluster.site - elif interface.virtual_machine.cluster.site is not site: + site = vm_site + elif vm_site is not site: site = None break From c43c63a817444703f068cb6b05fd4b5c5a702f5e Mon Sep 17 00:00:00 2001 From: Josef Johansson Date: Wed, 29 Nov 2023 08:31:33 +0100 Subject: [PATCH 115/271] 14346 fix missing function call convert In PR #13958 (commit 8224644) _get_report was modified to do the call on the variable without changing the call later on. This commit fixes that and removes the call on the variable. Signed-off-by: Josef Johansson --- netbox/extras/api/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py index f518275e0..830982e74 100644 --- a/netbox/extras/api/views.py +++ b/netbox/extras/api/views.py @@ -283,7 +283,7 @@ class ReportViewSet(ViewSet): # Retrieve and run the Report. This will create a new Job. module, report_cls = self._get_report(pk) - report = report_cls() + report = report_cls input_serializer = serializers.ReportInputSerializer( data=request.data, context={'report': report} From 3a3d43911cd45e1b9ed09a39f8e172f987ed36f8 Mon Sep 17 00:00:00 2001 From: Vincent Simonin Date: Wed, 29 Nov 2023 21:59:54 +0100 Subject: [PATCH 116/271] Fixed password was not hashed on REST API update (#14340) * Fixed password was not hashed on REST API update * When we updated a user password with a REST API call the password was stored in clear in plain text in the database. * Following code review * Move test on UserTest class * Call `super().update()` in overriding `update` method * Return directly the result of `super().update()` --- netbox/users/api/serializers.py | 10 ++++++++++ netbox/users/tests/test_api.py | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/netbox/users/api/serializers.py b/netbox/users/api/serializers.py index 75ab877cf..c9775e39a 100644 --- a/netbox/users/api/serializers.py +++ b/netbox/users/api/serializers.py @@ -52,6 +52,16 @@ class UserSerializer(ValidatedModelSerializer): return user + def update(self, instance, validated_data): + """ + Ensure proper updated password hash generation. + """ + password = validated_data.pop('password', None) + if password is not None: + instance.set_password(password) + + return super().update(instance, validated_data) + @extend_schema_field(OpenApiTypes.STR) def get_display(self, obj): if full_name := obj.get_full_name(): diff --git a/netbox/users/tests/test_api.py b/netbox/users/tests/test_api.py index 001142410..090ccc263 100644 --- a/netbox/users/tests/test_api.py +++ b/netbox/users/tests/test_api.py @@ -54,6 +54,38 @@ class UserTest(APIViewTestCases.APIViewTestCase): ) User.objects.bulk_create(users) + def test_that_password_is_changed(self): + """ + Test that password is changed + """ + + obj_perm = ObjectPermission( + name='Test permission', + actions=['change'] + ) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ContentType.objects.get_for_model(self.model)) + + user_credentials = { + 'username': 'user1', + 'password': 'abc123', + } + user = User.objects.create_user(**user_credentials) + + data = { + 'password': 'newpassword' + } + url = reverse('users-api:user-detail', kwargs={'pk': user.id}) + + response = self.client.patch(url, data, format='json', **self.header) + + self.assertEqual(response.status_code, 200) + + updated_user = User.objects.get(id=user.id) + + self.assertTrue(updated_user.check_password(data['password'])) + class GroupTest(APIViewTestCases.APIViewTestCase): model = Group From ff021a8e4ece4655590e5555c030ed0220543f32 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Thu, 30 Nov 2023 02:50:59 +0530 Subject: [PATCH 117/271] Adds region hierarchy in templates (#14213) * initial work to render hierarchical region #13735 * adds site display #13735 * cleanup #13735 * adds display region tag #13735 * refactored region hierarchy #13735 * refactored region hierarchy #13735 * renamed display_region to nested_tree #13735 * Make render_tree suitable for generic use * Remove errant item from __all__ --------- Co-authored-by: Jeremy Stretch --- netbox/templates/dcim/device.html | 23 ++----------- netbox/templates/dcim/rack.html | 23 +++++-------- netbox/templates/dcim/rackreservation.html | 38 +++++++++++----------- netbox/templates/dcim/site.html | 19 ++--------- netbox/templates/ipam/prefix.html | 20 ++++++------ netbox/templates/ipam/vlan.html | 20 ++++++------ netbox/utilities/templatetags/mptt.py | 20 ++++++++++++ 7 files changed, 73 insertions(+), 90 deletions(-) create mode 100644 netbox/utilities/templatetags/mptt.py diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html index 5fa6a3314..39e78c81b 100644 --- a/netbox/templates/dcim/device.html +++ b/netbox/templates/dcim/device.html @@ -5,6 +5,7 @@ {% load helpers %} {% load plugins %} {% load i18n %} +{% load mptt %} {% block content %}
    @@ -15,16 +16,7 @@ - + @@ -32,16 +24,7 @@ - + diff --git a/netbox/templates/dcim/rack.html b/netbox/templates/dcim/rack.html index 671c7ab2e..857061d00 100644 --- a/netbox/templates/dcim/rack.html +++ b/netbox/templates/dcim/rack.html @@ -4,6 +4,7 @@ {% load static %} {% load plugins %} {% load i18n %} +{% load mptt %} {% block content %}
    @@ -15,26 +16,18 @@
    {% trans "Region" %} - {% if object.site.region %} - {% for region in object.site.region.get_ancestors %} - {{ region|linkify }} / - {% endfor %} - {{ object.site.region|linkify }} - {% else %} - {{ ''|placeholder }} - {% endif %} - {% nested_tree object.site.region %}
    {% trans "Site" %}
    {% trans "Location" %} - {% if object.location %} - {% for location in object.location.get_ancestors %} - {{ location|linkify }} / - {% endfor %} - {{ object.location|linkify }} - {% else %} - {{ ''|placeholder }} - {% endif %} - {% nested_tree object.location %}
    {% trans "Rack" %}
    - + + + + + - + diff --git a/netbox/templates/dcim/rackreservation.html b/netbox/templates/dcim/rackreservation.html index 8edb75f32..3d145145f 100644 --- a/netbox/templates/dcim/rackreservation.html +++ b/netbox/templates/dcim/rackreservation.html @@ -4,6 +4,7 @@ {% load static %} {% load plugins %} {% load i18n %} +{% load mptt %} {% block breadcrumbs %} {{ block.super }} @@ -20,25 +21,24 @@
    {% trans "Site" %}{% trans "Region" %} - {% if object.site.region %} - {{ object.site.region|linkify }} / - {% endif %} - {{ object.site|linkify }} + {% nested_tree object.site.region %}
    {% trans "Site" %}{{ object.site|linkify }}
    {% trans "Location" %} - {% if object.location %} - {% for location in object.location.get_ancestors %} - {{ location|linkify }} / - {% endfor %} - {{ object.location|linkify }} - {% else %} - {{ ''|placeholder }} - {% endif %} - {% nested_tree object.location %}
    {% trans "Facility ID" %}
    - {% with rack=object.rack %} - - - - - - - - - - - - - {% endwith %} + + + + + + + + + + + + + + + +
    {% trans "Site" %} - {% if rack.site.region %} - {{ rack.site.region|linkify }} / - {% endif %} - {{ rack.site|linkify }} -
    {% trans "Location" %}{{ rack.location|linkify|placeholder }}
    {% trans "Rack" %}{{ rack|linkify }}
    {% trans "Region" %} + {% nested_tree object.rack.site.region %} +
    {% trans "Site" %}{{ object.rack.site|linkify }}
    {% trans "Location" %}{{ object.rack.location|linkify|placeholder }}
    {% trans "Rack" %}{{ object.rack|linkify }}
    diff --git a/netbox/templates/dcim/site.html b/netbox/templates/dcim/site.html index 7f43a0ab3..16a870182 100644 --- a/netbox/templates/dcim/site.html +++ b/netbox/templates/dcim/site.html @@ -3,6 +3,7 @@ {% load plugins %} {% load tz %} {% load i18n %} +{% load mptt %} {% block breadcrumbs %} {{ block.super }} @@ -29,27 +30,13 @@ {% trans "Region" %} - {% if object.region %} - {% for region in object.region.get_ancestors %} - {{ region|linkify }} / - {% endfor %} - {{ object.region|linkify }} - {% else %} - {{ ''|placeholder }} - {% endif %} + {% nested_tree object.region %} {% trans "Group" %} - {% if object.group %} - {% for group in object.group.get_ancestors %} - {{ group|linkify }} / - {% endfor %} - {{ object.group|linkify }} - {% else %} - {{ ''|placeholder }} - {% endif %} + {% nested_tree object.group %} diff --git a/netbox/templates/ipam/prefix.html b/netbox/templates/ipam/prefix.html index 71b240ced..ec6138d69 100644 --- a/netbox/templates/ipam/prefix.html +++ b/netbox/templates/ipam/prefix.html @@ -3,6 +3,7 @@ {% load helpers %} {% load plugins %} {% load i18n %} +{% load mptt %} {% block content %}
    @@ -44,18 +45,17 @@ {% endif %} + {% if object.site.region %} + + {% trans "Region" %} + + {% nested_tree object.site.region %} + + + {% endif %} {% trans "Site" %} - - {% if object.site %} - {% if object.site.region %} - {{ object.site.region|linkify }} / - {% endif %} - {{ object.site|linkify }} - {% else %} - {{ ''|placeholder }} - {% endif %} - + {{ object.site|linkify|placeholder }} {% trans "VLAN" %} diff --git a/netbox/templates/ipam/vlan.html b/netbox/templates/ipam/vlan.html index 4ca045d4b..a5ed9d643 100644 --- a/netbox/templates/ipam/vlan.html +++ b/netbox/templates/ipam/vlan.html @@ -3,6 +3,7 @@ {% load render_table from django_tables2 %} {% load plugins %} {% load i18n %} +{% load mptt %} {% block content %}
    @@ -13,18 +14,17 @@
    + {% if object.site.region %} + + + + + {% endif %} - + diff --git a/netbox/utilities/templatetags/mptt.py b/netbox/utilities/templatetags/mptt.py new file mode 100644 index 000000000..783c2654f --- /dev/null +++ b/netbox/utilities/templatetags/mptt.py @@ -0,0 +1,20 @@ +from django import template +from django.utils.safestring import mark_safe + +register = template.Library() + + +@register.simple_tag() +def nested_tree(obj): + """ + Renders the entire hierarchy of a recursively-nested object (such as Region or SiteGroup). + """ + if not obj: + return mark_safe('—') + + nodes = obj.get_ancestors(include_self=True) + return mark_safe( + ' / '.join( + f'{node}' for node in nodes + ) + ) From 290aae592dc670857b00de082cec9677e203ff68 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Thu, 30 Nov 2023 02:55:16 +0530 Subject: [PATCH 118/271] Raises validation error if file path and root are not unique (#14232) * raises validation error if file path and root are not unique #14187 * review changes #14187 --- netbox/core/models/files.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/netbox/core/models/files.py b/netbox/core/models/files.py index 38d82463e..a9e0e7f00 100644 --- a/netbox/core/models/files.py +++ b/netbox/core/models/files.py @@ -2,6 +2,7 @@ import logging import os from django.conf import settings +from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse from django.utils.translation import gettext as _ @@ -84,6 +85,14 @@ class ManagedFile(SyncedDataMixin, models.Model): self.file_path = os.path.basename(self.data_path) self.data_file.write_to_disk(self.full_path, overwrite=True) + def clean(self): + super().clean() + + # Ensure that the file root and path make a unique pair + if self._meta.model.objects.filter(file_root=self.file_root, file_path=self.file_path).exclude(pk=self.pk).exists(): + raise ValidationError( + f"A {self._meta.verbose_name.lower()} with this file path already exists ({self.file_root}/{self.file_path}).") + def delete(self, *args, **kwargs): # Delete file from disk try: From 6dddb6c9d22f751dc50b4b0267a768236bd275b1 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 29 Nov 2023 16:37:08 -0500 Subject: [PATCH 119/271] Fixes #14199: Fix jobs count for reports with a custom name --- netbox/extras/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 55b73d29d..2c59c5235 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1073,7 +1073,7 @@ class ReportJobsView(ContentTypePermissionRequiredMixin, View): jobs = Job.objects.filter( object_type=object_type, object_id=module.pk, - name=report.name + name=report.class_name ) jobs_table = JobTable( From 82591ad8a1ed590721f96a5778d21e4f78d9daa7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 29 Nov 2023 16:47:26 -0500 Subject: [PATCH 120/271] Fixes #14056: Record a pre-change snapshot when bulk editing objects via CSV --- netbox/netbox/views/generic/bulk_views.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 676e3f5af..c5a08c80a 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -394,6 +394,10 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): form.add_error('data', f"Row {i}: Object with ID {object_id} does not exist") raise ValidationError('') + # Take a snapshot for change logging + if instance.pk and hasattr(instance, 'snapshot'): + instance.snapshot() + # Instantiate the model form for the object model_form_kwargs = { 'data': record, From ac3fc25dfdc09a9c6fb3de76bc2cf3993e45626d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 29 Nov 2023 16:55:10 -0500 Subject: [PATCH 121/271] Fixes #14239: Fix CustomFieldChoiceSet search filter --- netbox/extras/filtersets.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index fec067263..b33e70488 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -122,8 +122,7 @@ class CustomFieldChoiceSetFilterSet(BaseFilterSet): return queryset return queryset.filter( Q(name__icontains=value) | - Q(description__icontains=value) | - Q(extra_choices__contains=value) + Q(description__icontains=value) ) def filter_by_choice(self, queryset, name, value): From 0a8eb7fcbe7beb20738aeacc5c0d3eac288cefcf Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 29 Nov 2023 17:25:10 -0500 Subject: [PATCH 122/271] Update changelog --- docs/release-notes/version-3.6.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index b8d316218..ddf571965 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -2,6 +2,25 @@ ## v3.6.6 (FUTURE) +### Enhancements + +* [#13735](https://github.com/netbox-community/netbox/issues/13735) - Show complete region hierarchy in UI for all relevant objects + +### Bug Fixes + +* [#14056](https://github.com/netbox-community/netbox/issues/14056) - Record a pre-change snapshot when bulk editing objects via CSV +* [#14187](https://github.com/netbox-community/netbox/issues/14187) - Raise a validation error when attempting to create a duplicate script or report +* [#14199](https://github.com/netbox-community/netbox/issues/14199) - Fix jobs list for reports with a custom name +* [#14239](https://github.com/netbox-community/netbox/issues/14239) - Fix CustomFieldChoiceSet search filter +* [#14242](https://github.com/netbox-community/netbox/issues/14242) - Enable export templates for contact assignments +* [#14299](https://github.com/netbox-community/netbox/issues/14299) - Webhook timestamps should be in proper ISO 8601 format +* [#14325](https://github.com/netbox-community/netbox/issues/14325) - Fix numeric ordering of service ports +* [#14339](https://github.com/netbox-community/netbox/issues/14339) - Correctly hash local user password when set via REST API +* [#14343](https://github.com/netbox-community/netbox/issues/14343) - Fix ordering ASN table by ASDOT column +* [#14346](https://github.com/netbox-community/netbox/issues/14346) - Fix running reports via REST API +* [#14349](https://github.com/netbox-community/netbox/issues/14349) - Fix custom validation support for remote data sources +* [#14363](https://github.com/netbox-community/netbox/issues/14363) - Fix bulk editing of interfaces assigned to VM with no cluster + --- ## v3.6.5 (2023-11-09) From 04fd45581d1213af0da12e7ffe74b88b5f5866b0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 29 Nov 2023 19:16:30 -0500 Subject: [PATCH 123/271] Release v3.6.6 --- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- docs/release-notes/version-3.6.md | 2 +- netbox/netbox/settings.py | 2 +- requirements.txt | 18 +++++++++--------- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 48c14a2da..5e936c5ec 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.6.5 + placeholder: v3.6.6 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 0525659ae..34103e616 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.6.5 + placeholder: v3.6.6 validations: required: true - type: dropdown diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index ddf571965..6f81e4526 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -1,6 +1,6 @@ # NetBox v3.6 -## v3.6.6 (FUTURE) +## v3.6.6 (2023-11-29) ### Enhancements diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 5a5a89984..9072dd364 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -25,7 +25,7 @@ from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW # Environment setup # -VERSION = '3.6.6-dev' +VERSION = '3.6.6' # Hostname HOSTNAME = platform.node() diff --git a/requirements.txt b/requirements.txt index 16bafe62f..b99f16e76 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,18 +1,18 @@ bleach==6.1.0 Django==4.2.7 -django-cors-headers==4.3.0 +django-cors-headers==4.3.1 django-debug-toolbar==4.2.0 -django-filter==23.3 +django-filter==23.4 django-graphiql-debug-toolbar==0.2.0 django-mptt==0.14.0 django-pglocks==1.0.4 django-prometheus==2.3.1 django-redis==5.4.0 django-rich==1.8.0 -django-rq==2.8.1 +django-rq==2.9.0 django-tables2==2.6.0 django-taggit==4.0.0 -django-timezone-field==6.0.1 +django-timezone-field==6.1.0 djangorestframework==3.14.0 drf-spectacular==0.26.5 drf-spectacular-sidecar==2023.10.1 @@ -21,16 +21,16 @@ graphene-django==3.0.0 gunicorn==21.2.0 Jinja2==3.1.2 Markdown==3.3.7 -mkdocs-material==9.4.8 -mkdocstrings[python-legacy]==0.23.0 +mkdocs-material==9.4.14 +mkdocstrings[python-legacy]==0.24.0 netaddr==0.9.0 Pillow==10.1.0 -psycopg[binary,pool]==3.1.12 +psycopg[binary,pool]==3.1.13 PyYAML==6.0.1 requests==2.31.0 -sentry-sdk==1.34.0 +sentry-sdk==1.38.0 social-auth-app-django==5.4.0 -social-auth-core[openidconnect]==4.5.0 +social-auth-core[openidconnect]==4.5.1 svgwrite==1.4.3 tablib==3.5.0 tzdata==2023.3 From 9d09916f6e237a6d18c2e952e7a9da91f21d3381 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 29 Nov 2023 19:32:45 -0500 Subject: [PATCH 124/271] PRVB --- docs/release-notes/version-3.6.md | 4 ++++ netbox/netbox/settings.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 6f81e4526..10e93be1e 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -1,5 +1,9 @@ # NetBox v3.6 +## v3.6.7 (FUTURE) + +--- + ## v3.6.6 (2023-11-29) ### Enhancements diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 9072dd364..824bc4605 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -25,7 +25,7 @@ from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW # Environment setup # -VERSION = '3.6.6' +VERSION = '3.6.7-dev' # Hostname HOSTNAME = platform.node() From a38a38218b949ec916df8eafc773be697494f41e Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Thu, 30 Nov 2023 13:36:33 -0800 Subject: [PATCH 125/271] 14132 Add EventRule - change webhook and add in script processing to events (#14267) --------- Co-authored-by: Jeremy Stretch --- docs/configuration/required-parameters.md | 9 +- docs/development/application-registry.md | 2 +- docs/development/models.md | 28 +-- docs/features/api-integration.md | 4 +- docs/features/event-rules.md | 31 +++ docs/index.md | 2 +- docs/integrations/webhooks.md | 24 +-- docs/models/extras/eventrule.md | 35 ++++ docs/plugins/development/models.md | 7 +- mkdocs.yml | 2 + netbox/core/models/contenttypes.py | 2 +- netbox/core/models/jobs.py | 37 ++-- netbox/extras/api/nested_serializers.py | 27 +++ netbox/extras/api/serializers.py | 58 ++++-- netbox/extras/api/urls.py | 1 + netbox/extras/api/views.py | 11 ++ netbox/extras/choices.py | 15 ++ netbox/extras/context_managers.py | 16 +- netbox/extras/events.py | 178 ++++++++++++++++++ netbox/extras/filtersets.py | 44 ++++- netbox/extras/forms/bulk_edit.py | 58 +++--- netbox/extras/forms/bulk_import.py | 57 +++++- netbox/extras/forms/filtersets.py | 39 +++- netbox/extras/forms/model_forms.py | 124 ++++++++++-- netbox/extras/graphql/schema.py | 6 + netbox/extras/graphql/types.py | 10 +- .../extras/management/commands/runscript.py | 14 +- netbox/extras/migrations/0101_eventrule.py | 127 +++++++++++++ ...evision.py => 0102_move_configrevision.py} | 2 +- netbox/extras/models/models.py | 153 +++++++++++---- netbox/extras/models/reports.py | 4 +- netbox/extras/models/scripts.py | 4 +- netbox/extras/scripts.py | 33 ++-- netbox/extras/signals.py | 30 +-- netbox/extras/tables/tables.py | 41 +++- netbox/extras/tests/test_api.py | 92 +++++++-- .../{test_webhooks.py => test_event_rules.py} | 177 ++++++++++------- netbox/extras/tests/test_filtersets.py | 175 ++++++++++++----- netbox/extras/tests/test_views.py | 78 ++++++-- netbox/extras/urls.py | 8 + netbox/extras/views.py | 45 +++++ netbox/extras/webhooks.py | 108 ----------- netbox/extras/webhooks_worker.py | 22 +-- netbox/netbox/context.py | 4 +- netbox/netbox/middleware.py | 6 +- netbox/netbox/models/__init__.py | 4 +- netbox/netbox/models/features.py | 8 +- netbox/netbox/navigation/menu.py | 1 + netbox/netbox/settings.py | 5 +- netbox/netbox/views/generic/bulk_views.py | 18 +- netbox/netbox/views/generic/object_views.py | 6 +- netbox/templates/extras/eventrule.html | 98 ++++++++++ netbox/templates/extras/webhook.html | 59 ------ netbox/utilities/forms/fields/fields.py | 2 +- netbox/utilities/forms/utils.py | 7 +- 55 files changed, 1569 insertions(+), 589 deletions(-) create mode 100644 docs/features/event-rules.md create mode 100644 docs/models/extras/eventrule.md create mode 100644 netbox/extras/events.py create mode 100644 netbox/extras/migrations/0101_eventrule.py rename netbox/extras/migrations/{0101_move_configrevision.py => 0102_move_configrevision.py} (96%) rename netbox/extras/tests/{test_webhooks.py => test_event_rules.py} (72%) create mode 100644 netbox/templates/extras/eventrule.html diff --git a/docs/configuration/required-parameters.md b/docs/configuration/required-parameters.md index 012d85762..bda365995 100644 --- a/docs/configuration/required-parameters.md +++ b/docs/configuration/required-parameters.md @@ -59,10 +59,7 @@ DATABASE = { ## REDIS -[Redis](https://redis.io/) is an in-memory data store similar to memcached. While Redis has been an optional component of -NetBox since the introduction of webhooks in version 2.4, it is required starting in 2.6 to support NetBox's caching -functionality (as well as other planned features). In 2.7, the connection settings were broken down into two sections for -task queuing and caching, allowing the user to connect to different Redis instances/databases per feature. +[Redis](https://redis.io/) is a lightweight in-memory data store similar to memcached. NetBox employs Redis for background task queuing and other features. Redis is configured using a configuration setting similar to `DATABASE` and these settings are the same for both of the `tasks` and `caching` subsections: @@ -81,7 +78,7 @@ REDIS = { 'tasks': { 'HOST': 'redis.example.com', 'PORT': 1234, - 'USERNAME': 'netbox' + 'USERNAME': 'netbox', 'PASSWORD': 'foobar', 'DATABASE': 0, 'SSL': False, @@ -89,7 +86,7 @@ REDIS = { 'caching': { 'HOST': 'localhost', 'PORT': 6379, - 'USERNAME': '' + 'USERNAME': '', 'PASSWORD': '', 'DATABASE': 1, 'SSL': False, diff --git a/docs/development/application-registry.md b/docs/development/application-registry.md index c845cd5a7..570563431 100644 --- a/docs/development/application-registry.md +++ b/docs/development/application-registry.md @@ -31,7 +31,7 @@ A dictionary of particular features (e.g. custom fields) mapped to the NetBox mo 'dcim': ['site', 'rack', 'devicetype', ...], ... }, - 'webhooks': { + 'event_rules': { 'extras': ['configcontext', 'tag', ...], 'dcim': ['site', 'rack', 'devicetype', ...], }, diff --git a/docs/development/models.md b/docs/development/models.md index d4838570a..f04610ad5 100644 --- a/docs/development/models.md +++ b/docs/development/models.md @@ -10,19 +10,19 @@ The Django [content types](https://docs.djangoproject.com/en/stable/ref/contrib/ Depending on its classification, each NetBox model may support various features which enhance its operation. Each feature is enabled by inheriting from its designated mixin class, and some features also make use of the [application registry](./application-registry.md#model_features). -| Feature | Feature Mixin | Registry Key | Description | -|------------------------------------------------------------|-------------------------|--------------------|--------------------------------------------------------------------------------| -| [Change logging](../features/change-logging.md) | `ChangeLoggingMixin` | - | Changes to these objects are automatically recorded in the change log | -| Cloning | `CloningMixin` | - | Provides the `clone()` method to prepare a copy | -| [Custom fields](../customization/custom-fields.md) | `CustomFieldsMixin` | `custom_fields` | These models support the addition of user-defined fields | -| [Custom links](../customization/custom-links.md) | `CustomLinksMixin` | `custom_links` | These models support the assignment of custom links | -| [Custom validation](../customization/custom-validation.md) | `CustomValidationMixin` | - | Supports the enforcement of custom validation rules | -| [Export templates](../customization/export-templates.md) | `ExportTemplatesMixin` | `export_templates` | Users can create custom export templates for these models | -| [Job results](../features/background-jobs.md) | `JobsMixin` | `jobs` | Users can create custom export templates for these models | -| [Journaling](../features/journaling.md) | `JournalingMixin` | `journaling` | These models support persistent historical commentary | -| [Synchronized data](../integrations/synchronized-data.md) | `SyncedDataMixin` | `synced_data` | Certain model data can be automatically synchronized from a remote data source | -| [Tagging](../models/extras/tag.md) | `TagsMixin` | `tags` | The models can be tagged with user-defined tags | -| [Webhooks](../integrations/webhooks.md) | `WebhooksMixin` | `webhooks` | NetBox is capable of generating outgoing webhooks for these objects | +| Feature | Feature Mixin | Registry Key | Description | +|------------------------------------------------------------|-------------------------|--------------------|-----------------------------------------------------------------------------------------| +| [Change logging](../features/change-logging.md) | `ChangeLoggingMixin` | - | Changes to these objects are automatically recorded in the change log | +| Cloning | `CloningMixin` | - | Provides the `clone()` method to prepare a copy | +| [Custom fields](../customization/custom-fields.md) | `CustomFieldsMixin` | `custom_fields` | These models support the addition of user-defined fields | +| [Custom links](../customization/custom-links.md) | `CustomLinksMixin` | `custom_links` | These models support the assignment of custom links | +| [Custom validation](../customization/custom-validation.md) | `CustomValidationMixin` | - | Supports the enforcement of custom validation rules | +| [Export templates](../customization/export-templates.md) | `ExportTemplatesMixin` | `export_templates` | Users can create custom export templates for these models | +| [Job results](../features/background-jobs.md) | `JobsMixin` | `jobs` | Users can create custom export templates for these models | +| [Journaling](../features/journaling.md) | `JournalingMixin` | `journaling` | These models support persistent historical commentary | +| [Synchronized data](../integrations/synchronized-data.md) | `SyncedDataMixin` | `synced_data` | Certain model data can be automatically synchronized from a remote data source | +| [Tagging](../models/extras/tag.md) | `TagsMixin` | `tags` | The models can be tagged with user-defined tags | +| [Event rules](../features/event-rules.md) | `EventRulesMixin` | `event_rules` | Event rules can send webhooks or run custom scripts automatically in response to events | ## Models Index @@ -111,7 +111,7 @@ Component models represent individual physical or virtual components belonging t ### Component Template Models -These function as templates to effect the replication of device and virtual machine components. Component template models support a limited feature set, including change logging, custom validation, and webhooks. +These function as templates to effect the replication of device and virtual machine components. Component template models support a limited feature set, including change logging, custom validation, and event rules. * [dcim.ConsolePortTemplate](../models/dcim/consoleporttemplate.md) * [dcim.ConsoleServerPortTemplate](../models/dcim/consoleserverporttemplate.md) diff --git a/docs/features/api-integration.md b/docs/features/api-integration.md index 8c0843bfe..94a39d731 100644 --- a/docs/features/api-integration.md +++ b/docs/features/api-integration.md @@ -26,9 +26,9 @@ To learn more about this feature, check out the [GraphQL API documentation](../i ## Webhooks -A webhook is a mechanism for conveying to some external system a change that took place in NetBox. For example, you may want to notify a monitoring system whenever the status of a device is updated in NetBox. This can be done by creating a webhook for the device model in NetBox and identifying the webhook receiver. When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. Webhooks are an excellent mechanism for building event-based automation processes. +A webhook is a mechanism for conveying to some external system a change that has taken place in NetBox. For example, you may want to notify a monitoring system whenever the status of a device is updated in NetBox. To do this, first create a [webhook](../models/extras/webhook.md) identifying the remote receiver (URL), HTTP method, and any other necessary parameters. Then, define an [event rule](../models/extras/eventrule.md) which is triggered by device changes to transmit the webhook. -To learn more about this feature, check out the [webhooks documentation](../integrations/webhooks.md). +When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. Webhooks are an excellent mechanism for building event-based automation processes. To learn more about this feature, check out the [webhooks documentation](../integrations/webhooks.md). ## Prometheus Metrics diff --git a/docs/features/event-rules.md b/docs/features/event-rules.md new file mode 100644 index 000000000..0e9535223 --- /dev/null +++ b/docs/features/event-rules.md @@ -0,0 +1,31 @@ +# Event Rules + +NetBox includes the ability to execute certain functions in response to internal object changes. These include: + +* [Scripts](../customization/custom-scripts.md) execution +* [Webhooks](../integrations/webhooks.md) execution + +For example, suppose you want to automatically configure a monitoring system to start monitoring a device when its operational status is changed to active, and remove it from monitoring for any other status. You can create a webhook in NetBox for the device model and craft its content and destination URL to effect the desired change on the receiving system. You can then associate an event rule with this webhook and the webhook will be sent automatically by NetBox whenever the configured constraints are met. + +Each event must be associated with at least one NetBox object type and at least one event (e.g. create, update, or delete). + +## Conditional Event Rules + +An event rule may include a set of conditional logic expressed in JSON used to control whether an event triggers for a specific object. For example, you may wish to trigger an event for devices only when the `status` field of an object is "active": + +```json +{ + "and": [ + { + "attr": "status.value", + "value": "active" + } + ] +} +``` + +For more detail, see the reference documentation for NetBox's [conditional logic](../reference/conditions.md). + +## Event Rule Processing + +When a change is detected, any resulting events are placed into a Redis queue for processing. This allows the user's request to complete without needing to wait for the outgoing event(s) to be processed. The events are then extracted from the queue by the `rqworker` process. The current event queue and any failed events can be inspected in the admin UI under System > Background Tasks. diff --git a/docs/index.md b/docs/index.md index 05cd79f23..84334337b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -32,7 +32,7 @@ In addition to its expansive and robust data model, NetBox offers myriad mechani * Custom fields * Custom model validation * Export templates -* Webhooks +* Event rules * Plugins * REST & GraphQL APIs diff --git a/docs/integrations/webhooks.md b/docs/integrations/webhooks.md index 9a1094988..8913fd99c 100644 --- a/docs/integrations/webhooks.md +++ b/docs/integrations/webhooks.md @@ -1,11 +1,9 @@ # Webhooks -NetBox can be configured to transmit outgoing webhooks to remote systems in response to internal object changes. The receiver can act on the data in these webhook messages to perform related tasks. +NetBox can be configured via [Event Rules](../features/event-rules.md) to transmit outgoing webhooks to remote systems in response to internal object changes. The receiver can act on the data in these webhook messages to perform related tasks. For example, suppose you want to automatically configure a monitoring system to start monitoring a device when its operational status is changed to active, and remove it from monitoring for any other status. You can create a webhook in NetBox for the device model and craft its content and destination URL to effect the desired change on the receiving system. Webhooks will be sent automatically by NetBox whenever the configured constraints are met. -Each webhook must be associated with at least one NetBox object type and at least one event (create, update, or delete). Users can specify the receiver URL, HTTP request type (`GET`, `POST`, etc.), content type, and headers. A request body can also be specified; if left blank, this will default to a serialized representation of the affected object. - !!! warning "Security Notice" Webhooks support the inclusion of user-submitted code to generate the URL, custom headers, and payloads, which may pose security risks under certain conditions. Only grant permission to create or modify webhooks to trusted users. @@ -70,26 +68,12 @@ If no body template is specified, the request body will be populated with a JSON } ``` -## Conditional Webhooks - -A webhook may include a set of conditional logic expressed in JSON used to control whether a webhook triggers for a specific object. For example, you may wish to trigger a webhook for devices only when the `status` field of an object is "active": - -```json -{ - "and": [ - { - "attr": "status.value", - "value": "active" - } - ] -} -``` - -For more detail, see the reference documentation for NetBox's [conditional logic](../reference/conditions.md). +!!! note + The setting of conditional webhooks has been moved to [Event Rules](../features/event-rules.md) since NetBox 3.7 ## Webhook Processing -When a change is detected, any resulting webhooks are placed into a Redis queue for processing. This allows the user's request to complete without needing to wait for the outgoing webhook(s) to be processed. The webhooks are then extracted from the queue by the `rqworker` process and HTTP requests are sent to their respective destinations. The current webhook queue and any failed webhooks can be inspected in the admin UI under System > Background Tasks. +Using [Event Rules](../features/event-rules.md), when a change is detected, any resulting webhooks are placed into a Redis queue for processing. This allows the user's request to complete without needing to wait for the outgoing webhook(s) to be processed. The webhooks are then extracted from the queue by the `rqworker` process and HTTP requests are sent to their respective destinations. The current webhook queue and any failed webhooks can be inspected in the admin UI under System > Background Tasks. A request is considered successful if the response has a 2XX status code; otherwise, the request is marked as having failed. Failed requests may be retried manually via the admin UI. diff --git a/docs/models/extras/eventrule.md b/docs/models/extras/eventrule.md new file mode 100644 index 000000000..89645be3c --- /dev/null +++ b/docs/models/extras/eventrule.md @@ -0,0 +1,35 @@ +# EventRule + +An event rule is a mechanism for automatically taking an action (such as running a script or sending a webhook) in response to an event in NetBox. For example, you may want to notify a monitoring system whenever the status of a device is updated in NetBox. This can be done by creating an event for device objects and designating a webhook to be transmitted. When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. + +See the [event rules documentation](../features/event-rules.md) for more information. + +## Fields + +### Name + +A unique human-friendly name. + +### Content Types + +The type(s) of object in NetBox that will trigger the rule. + +### Enabled + +If not selected, the event rule will not be processed. + +### Events + +The events which will trigger the rule. At least one event type must be selected. + +| Name | Description | +|------------|--------------------------------------| +| Creations | A new object has been created | +| Updates | An existing object has been modified | +| Deletions | An object has been deleted | +| Job starts | A job for an object starts | +| Job ends | A job for an object terminates | + +### Conditions + +A set of [prescribed conditions](../../reference/conditions.md) against which the triggering object will be evaluated. If the conditions are defined but not met by the object, no action will be taken. An event rule that does not define any conditions will _always_ trigger. diff --git a/docs/plugins/development/models.md b/docs/plugins/development/models.md index 46af135e1..902ee9c82 100644 --- a/docs/plugins/development/models.md +++ b/docs/plugins/development/models.md @@ -123,14 +123,17 @@ For more information about database migrations, see the [Django documentation](h ::: netbox.models.features.CustomValidationMixin +::: netbox.models.features.EventRulesMixin + +!!! note + `EventRulesMixin` was renamed from `WebhooksMixin` in NetBox v3.7. + ::: netbox.models.features.ExportTemplatesMixin ::: netbox.models.features.JournalingMixin ::: netbox.models.features.TagsMixin -::: netbox.models.features.WebhooksMixin - ## Choice Sets For model fields which support the selection of one or more values from a predefined list of choices, NetBox provides the `ChoiceSet` utility class. This can be used in place of a regular choices tuple to provide enhanced functionality, namely dynamic configuration and colorization. (See [Django's documentation](https://docs.djangoproject.com/en/stable/ref/models/fields/#choices) on the `choices` parameter for supported model fields.) diff --git a/mkdocs.yml b/mkdocs.yml index f927bf386..8cbfd397b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -87,6 +87,7 @@ nav: - Auth & Permissions: 'features/authentication-permissions.md' - API & Integration: 'features/api-integration.md' - Customization: 'features/customization.md' + - Event Rules: 'features/event-rules.md' - Installation & Upgrade: - Installing NetBox: 'installation/index.md' - 1. PostgreSQL: 'installation/1-postgresql.md' @@ -215,6 +216,7 @@ nav: - CustomField: 'models/extras/customfield.md' - CustomFieldChoiceSet: 'models/extras/customfieldchoiceset.md' - CustomLink: 'models/extras/customlink.md' + - EventRule: 'models/extras/eventrule.md' - ExportTemplate: 'models/extras/exporttemplate.md' - ImageAttachment: 'models/extras/imageattachment.md' - JournalEntry: 'models/extras/journalentry.md' diff --git a/netbox/core/models/contenttypes.py b/netbox/core/models/contenttypes.py index 0731871ec..c98184c3d 100644 --- a/netbox/core/models/contenttypes.py +++ b/netbox/core/models/contenttypes.py @@ -26,7 +26,7 @@ class ContentTypeManager(ContentTypeManager_): Return the ContentTypes only for models which are registered as supporting the specified feature. For example, we can find all ContentTypes for models which support webhooks with - ContentType.objects.with_feature('webhooks') + ContentType.objects.with_feature('event_rules') """ if feature not in registry['model_features']: raise KeyError( diff --git a/netbox/core/models/jobs.py b/netbox/core/models/jobs.py index ce7ac6ec7..af8191df5 100644 --- a/netbox/core/models/jobs.py +++ b/netbox/core/models/jobs.py @@ -16,7 +16,7 @@ from extras.constants import EVENT_JOB_END, EVENT_JOB_START from netbox.config import get_config from netbox.constants import RQ_QUEUE_DEFAULT from utilities.querysets import RestrictedQuerySet -from utilities.rqworker import get_queue_for_model, get_rq_retry +from utilities.rqworker import get_queue_for_model __all__ = ( 'Job', @@ -168,8 +168,8 @@ class Job(models.Model): self.status = JobStatusChoices.STATUS_RUNNING self.save() - # Handle webhooks - self.trigger_webhooks(event=EVENT_JOB_START) + # Handle events + self.process_event(event=EVENT_JOB_START) def terminate(self, status=JobStatusChoices.STATUS_COMPLETED, error=None): """ @@ -186,8 +186,8 @@ class Job(models.Model): self.completed = timezone.now() self.save() - # Handle webhooks - self.trigger_webhooks(event=EVENT_JOB_END) + # Handle events + self.process_event(event=EVENT_JOB_END) @classmethod def enqueue(cls, func, instance, name='', user=None, schedule_at=None, interval=None, **kwargs): @@ -224,27 +224,18 @@ class Job(models.Model): return job - def trigger_webhooks(self, event): - from extras.models import Webhook + def process_event(self, event): + """ + Process any EventRules relevant to the passed job event (i.e. start or stop). + """ + from extras.models import EventRule + from extras.events import process_event_rules - rq_queue_name = get_config().QUEUE_MAPPINGS.get('webhook', RQ_QUEUE_DEFAULT) - rq_queue = django_rq.get_queue(rq_queue_name, is_async=False) - - # Fetch any webhooks matching this object type and action - webhooks = Webhook.objects.filter( + # Fetch any event rules matching this object type and action + event_rules = EventRule.objects.filter( **{f'type_{event}': True}, content_types=self.object_type, enabled=True ) - for webhook in webhooks: - rq_queue.enqueue( - "extras.webhooks_worker.process_webhook", - webhook=webhook, - model_name=self.object_type.model, - event=event, - data=self.data, - timestamp=timezone.now().isoformat(), - username=self.user.username, - retry=get_rq_retry() - ) + process_event_rules(event_rules, self.object_type.model, event, self.data, self.user.username) diff --git a/netbox/extras/api/nested_serializers.py b/netbox/extras/api/nested_serializers.py index a97c630d2..4bada494f 100644 --- a/netbox/extras/api/nested_serializers.py +++ b/netbox/extras/api/nested_serializers.py @@ -10,15 +10,25 @@ __all__ = [ 'NestedCustomFieldChoiceSetSerializer', 'NestedCustomFieldSerializer', 'NestedCustomLinkSerializer', + 'NestedEventRuleSerializer', 'NestedExportTemplateSerializer', 'NestedImageAttachmentSerializer', 'NestedJournalEntrySerializer', 'NestedSavedFilterSerializer', + 'NestedScriptSerializer', 'NestedTagSerializer', # Defined in netbox.api.serializers 'NestedWebhookSerializer', ] +class NestedEventRuleSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='extras-api:eventrule-detail') + + class Meta: + model = models.EventRule + fields = ['id', 'url', 'display', 'name'] + + class NestedWebhookSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail') @@ -105,3 +115,20 @@ class NestedJournalEntrySerializer(WritableNestedSerializer): class Meta: model = models.JournalEntry fields = ['id', 'url', 'display', 'created'] + + +class NestedScriptSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField( + view_name='extras-api:script-detail', + lookup_field='full_name', + lookup_url_kwarg='pk' + ) + name = serializers.CharField(read_only=True) + display = serializers.SerializerMethodField(read_only=True) + + class Meta: + model = models.Script + fields = ['id', 'url', 'display', 'name'] + + def get_display(self, obj): + return f'{obj.name} ({obj.module})' diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 4e1b47503..82b3e1933 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -1,17 +1,17 @@ from django.contrib.auth import get_user_model from django.core.exceptions import ObjectDoesNotExist +from drf_spectacular.types import OpenApiTypes +from drf_spectacular.utils import extend_schema_field from rest_framework import serializers -from core.api.serializers import JobSerializer from core.api.nested_serializers import NestedDataSourceSerializer, NestedDataFileSerializer, NestedJobSerializer +from core.api.serializers import JobSerializer from core.models import ContentType from dcim.api.nested_serializers import ( NestedDeviceRoleSerializer, NestedDeviceTypeSerializer, NestedLocationSerializer, NestedPlatformSerializer, NestedRegionSerializer, NestedSiteSerializer, NestedSiteGroupSerializer, ) from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup -from drf_spectacular.utils import extend_schema_field -from drf_spectacular.types import OpenApiTypes from extras.choices import * from extras.models import * from netbox.api.exceptions import SerializerNotFound @@ -38,6 +38,7 @@ __all__ = ( 'CustomFieldSerializer', 'CustomLinkSerializer', 'DashboardSerializer', + 'EventRuleSerializer', 'ExportTemplateSerializer', 'ImageAttachmentSerializer', 'JournalEntrySerializer', @@ -56,24 +57,59 @@ __all__ = ( ) +# +# Event Rules +# + +class EventRuleSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='extras-api:eventrule-detail') + content_types = ContentTypeField( + queryset=ContentType.objects.with_feature('event_rules'), + many=True + ) + action_type = ChoiceField(choices=EventRuleActionChoices) + action_object_type = ContentTypeField( + queryset=ContentType.objects.with_feature('event_rules'), + ) + action_object = serializers.SerializerMethodField(read_only=True) + + class Meta: + model = EventRule + fields = [ + 'id', 'url', 'display', 'content_types', 'name', 'type_create', 'type_update', 'type_delete', + 'type_job_start', 'type_job_end', 'enabled', 'conditions', 'action_type', 'action_object_type', + 'action_object_id', 'action_object', 'description', 'custom_fields', 'tags', 'created', 'last_updated', + ] + + @extend_schema_field(OpenApiTypes.OBJECT) + def get_action_object(self, instance): + context = {'request': self.context['request']} + # We need to manually instantiate the serializer for scripts + if instance.action_type == EventRuleActionChoices.SCRIPT: + module_id, script_name = instance.action_parameters['script_choice'].split(":", maxsplit=1) + script = instance.action_object.scripts[script_name]() + return NestedScriptSerializer(script, context=context).data + else: + serializer = get_serializer_for_model( + model=instance.action_object_type.model_class(), + prefix=NESTED_SERIALIZER_PREFIX + ) + return serializer(instance.action_object, context=context).data + + # # Webhooks # class WebhookSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail') - content_types = ContentTypeField( - queryset=ContentType.objects.with_feature('webhooks'), - many=True - ) class Meta: model = Webhook fields = [ - 'id', 'url', 'display', 'content_types', 'name', 'type_create', 'type_update', 'type_delete', - 'type_job_start', 'type_job_end', 'payload_url', 'enabled', 'http_method', 'http_content_type', - 'additional_headers', 'body_template', 'secret', 'conditions', 'ssl_verification', 'ca_file_path', - 'custom_fields', 'tags', 'created', 'last_updated', + 'id', 'url', 'display', 'name', 'payload_url', 'http_method', 'http_content_type', 'additional_headers', + 'body_template', 'secret', 'ssl_verification', 'ca_file_path', 'custom_fields', 'tags', 'created', + 'last_updated', ] diff --git a/netbox/extras/api/urls.py b/netbox/extras/api/urls.py index 5f2b324e6..1616b8554 100644 --- a/netbox/extras/api/urls.py +++ b/netbox/extras/api/urls.py @@ -7,6 +7,7 @@ from . import views router = NetBoxRouter() router.APIRootView = views.ExtrasRootView +router.register('event-rules', views.EventRuleViewSet) router.register('webhooks', views.WebhookViewSet) router.register('custom-fields', views.CustomFieldViewSet) router.register('custom-field-choice-sets', views.CustomFieldChoiceSetViewSet) diff --git a/netbox/extras/api/views.py b/netbox/extras/api/views.py index 830982e74..e0fca8617 100644 --- a/netbox/extras/api/views.py +++ b/netbox/extras/api/views.py @@ -37,6 +37,17 @@ class ExtrasRootView(APIRootView): return 'Extras' +# +# EventRules +# + +class EventRuleViewSet(NetBoxModelViewSet): + metadata_class = ContentTypeMetadata + queryset = EventRule.objects.all() + serializer_class = serializers.EventRuleSerializer + filterset_class = filtersets.EventRuleFilterSet + + # # Webhooks # diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index fdb951b7d..14179fb39 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -291,3 +291,18 @@ class DashboardWidgetColorChoices(ChoiceSet): (BLACK, _('Black')), (WHITE, _('White')), ) + + +# +# Event Rules +# + +class EventRuleActionChoices(ChoiceSet): + + WEBHOOK = 'webhook' + SCRIPT = 'script' + + CHOICES = ( + (WEBHOOK, _('Webhook')), + (SCRIPT, _('Script')), + ) diff --git a/netbox/extras/context_managers.py b/netbox/extras/context_managers.py index 32323999e..8de47465e 100644 --- a/netbox/extras/context_managers.py +++ b/netbox/extras/context_managers.py @@ -1,25 +1,25 @@ from contextlib import contextmanager -from netbox.context import current_request, webhooks_queue -from .webhooks import flush_webhooks +from netbox.context import current_request, events_queue +from .events import flush_events @contextmanager -def change_logging(request): +def event_tracking(request): """ - Enable change logging by connecting the appropriate signals to their receivers before code is run, and - disconnecting them afterward. + Queue interesting events in memory while processing a request, then flush that queue for processing by the + events pipline before returning the response. :param request: WSGIRequest object with a unique `id` set """ current_request.set(request) - webhooks_queue.set([]) + events_queue.set([]) yield # Flush queued webhooks to RQ - flush_webhooks(webhooks_queue.get()) + flush_events(events_queue.get()) # Clear context vars current_request.set(None) - webhooks_queue.set([]) + events_queue.set([]) diff --git a/netbox/extras/events.py b/netbox/extras/events.py new file mode 100644 index 000000000..05352b7d1 --- /dev/null +++ b/netbox/extras/events.py @@ -0,0 +1,178 @@ +import logging + +from django.conf import settings +from django.contrib.auth import get_user_model +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ObjectDoesNotExist +from django.utils import timezone +from django.utils.module_loading import import_string +from django_rq import get_queue + +from core.models import Job +from netbox.config import get_config +from netbox.constants import RQ_QUEUE_DEFAULT +from netbox.registry import registry +from utilities.api import get_serializer_for_model +from utilities.rqworker import get_rq_retry +from utilities.utils import serialize_object +from .choices import * +from .models import EventRule, ScriptModule + +logger = logging.getLogger('netbox.events_processor') + + +def serialize_for_event(instance): + """ + Return a serialized representation of the given instance suitable for use in a queued event. + """ + serializer_class = get_serializer_for_model(instance.__class__) + serializer_context = { + 'request': None, + } + serializer = serializer_class(instance, context=serializer_context) + + return serializer.data + + +def get_snapshots(instance, action): + snapshots = { + 'prechange': getattr(instance, '_prechange_snapshot', None), + 'postchange': None, + } + if action != ObjectChangeActionChoices.ACTION_DELETE: + # Use model's serialize_object() method if defined; fall back to serialize_object() utility function + if hasattr(instance, 'serialize_object'): + snapshots['postchange'] = instance.serialize_object() + else: + snapshots['postchange'] = serialize_object(instance) + + return snapshots + + +def enqueue_object(queue, instance, user, request_id, action): + """ + Enqueue a serialized representation of a created/updated/deleted object for the processing of + events once the request has completed. + """ + # Determine whether this type of object supports event rules + app_label = instance._meta.app_label + model_name = instance._meta.model_name + if model_name not in registry['model_features']['event_rules'].get(app_label, []): + return + + queue.append({ + 'content_type': ContentType.objects.get_for_model(instance), + 'object_id': instance.pk, + 'event': action, + 'data': serialize_for_event(instance), + 'snapshots': get_snapshots(instance, action), + 'username': user.username, + 'request_id': request_id + }) + + +def process_event_rules(event_rules, model_name, event, data, username, snapshots=None, request_id=None): + try: + user = get_user_model().objects.get(username=username) + except ObjectDoesNotExist: + user = None + + for event_rule in event_rules: + + # Evaluate event rule conditions (if any) + if not event_rule.eval_conditions(data): + return + + # Webhooks + if event_rule.action_type == EventRuleActionChoices.WEBHOOK: + + # Select the appropriate RQ queue + queue_name = get_config().QUEUE_MAPPINGS.get('webhook', RQ_QUEUE_DEFAULT) + rq_queue = get_queue(queue_name) + + # Compile the task parameters + params = { + "event_rule": event_rule, + "model_name": model_name, + "event": event, + "data": data, + "snapshots": snapshots, + "timestamp": timezone.now().isoformat(), + "username": username, + "retry": get_rq_retry() + } + if snapshots: + params["snapshots"] = snapshots + if request_id: + params["request_id"] = request_id + + # Enqueue the task + rq_queue.enqueue( + "extras.webhooks_worker.process_webhook", + **params + ) + + # Scripts + elif event_rule.action_type == EventRuleActionChoices.SCRIPT: + # Resolve the script from action parameters + script_module = event_rule.action_object + _, script_name = event_rule.action_parameters['script_choice'].split(":", maxsplit=1) + script = script_module.scripts[script_name]() + + # Enqueue a Job to record the script's execution + Job.enqueue( + "extras.scripts.run_script", + instance=script_module, + name=script.class_name, + user=user, + data=data + ) + + else: + raise ValueError(f"Unknown action type for an event rule: {event_rule.action_type}") + + +def process_event_queue(events): + """ + Flush a list of object representation to RQ for EventRule processing. + """ + events_cache = { + 'type_create': {}, + 'type_update': {}, + 'type_delete': {}, + } + + for data in events: + action_flag = { + ObjectChangeActionChoices.ACTION_CREATE: 'type_create', + ObjectChangeActionChoices.ACTION_UPDATE: 'type_update', + ObjectChangeActionChoices.ACTION_DELETE: 'type_delete', + }[data['event']] + content_type = data['content_type'] + + # Cache applicable Event Rules + if content_type not in events_cache[action_flag]: + events_cache[action_flag][content_type] = EventRule.objects.filter( + **{action_flag: True}, + content_types=content_type, + enabled=True + ) + event_rules = events_cache[action_flag][content_type] + + process_event_rules( + event_rules, content_type.model, data['event'], data['data'], data['username'], + snapshots=data['snapshots'], request_id=data['request_id'] + ) + + +def flush_events(queue): + """ + Flush a list of object representation to RQ for webhook processing. + """ + if queue: + for name in settings.EVENTS_PIPELINE: + try: + func = import_string(name) + func(queue) + except Exception as e: + logger.error(f"Cannot import events pipeline {name} error: {e}") diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index e0fc44ab1..e3eeda20d 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -22,6 +22,7 @@ __all__ = ( 'CustomFieldChoiceSetFilterSet', 'CustomFieldFilterSet', 'CustomLinkFilterSet', + 'EventRuleFilterSet', 'ExportTemplateFilterSet', 'ImageAttachmentFilterSet', 'JournalEntryFilterSet', @@ -38,19 +39,18 @@ class WebhookFilterSet(NetBoxModelFilterSet): method='search', label=_('Search'), ) - content_type_id = MultiValueNumberFilter( - field_name='content_types__id' - ) - content_types = ContentTypeFilter() http_method = django_filters.MultipleChoiceFilter( choices=WebhookHttpMethodChoices ) + payload_url = MultiValueCharFilter( + lookup_expr='icontains' + ) class Meta: model = Webhook fields = [ - 'id', 'name', 'type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end', 'payload_url', - 'enabled', 'http_method', 'http_content_type', 'secret', 'ssl_verification', 'ca_file_path', + 'id', 'name', 'payload_url', 'http_method', 'http_content_type', 'secret', 'ssl_verification', + 'ca_file_path', ] def search(self, queryset, name, value): @@ -62,6 +62,38 @@ class WebhookFilterSet(NetBoxModelFilterSet): ) +class EventRuleFilterSet(NetBoxModelFilterSet): + q = django_filters.CharFilter( + method='search', + label=_('Search'), + ) + content_type_id = MultiValueNumberFilter( + field_name='content_types__id' + ) + content_types = ContentTypeFilter() + action_type = django_filters.MultipleChoiceFilter( + choices=EventRuleActionChoices + ) + action_object_type = ContentTypeFilter() + action_object_id = MultiValueNumberFilter() + + class Meta: + model = EventRule + fields = [ + 'id', 'name', 'type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end', 'enabled', + 'action_type', 'description', + ] + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) | + Q(comments__icontains=value) + ) + + class CustomFieldFilterSet(BaseFilterSet): q = django_filters.CharFilter( method='search', diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index 5da2a5dde..dade76bad 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -14,6 +14,7 @@ __all__ = ( 'CustomFieldBulkEditForm', 'CustomFieldChoiceSetBulkEditForm', 'CustomLinkBulkEditForm', + 'EventRuleBulkEditForm', 'ExportTemplateBulkEditForm', 'JournalEntryBulkEditForm', 'SavedFilterBulkEditForm', @@ -177,6 +178,39 @@ class WebhookBulkEditForm(NetBoxModelBulkEditForm): queryset=Webhook.objects.all(), widget=forms.MultipleHiddenInput ) + http_method = forms.ChoiceField( + choices=add_blank_choice(WebhookHttpMethodChoices), + required=False, + label=_('HTTP method') + ) + payload_url = forms.CharField( + required=False, + label=_('Payload URL') + ) + ssl_verification = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect(), + label=_('SSL verification') + ) + secret = forms.CharField( + label=_('Secret'), + required=False + ) + ca_file_path = forms.CharField( + required=False, + label=_('CA file path') + ) + + nullable_fields = ('secret', 'ca_file_path') + + +class EventRuleBulkEditForm(NetBoxModelBulkEditForm): + model = EventRule + + pk = forms.ModelMultipleChoiceField( + queryset=EventRule.objects.all(), + widget=forms.MultipleHiddenInput + ) enabled = forms.NullBooleanField( label=_('Enabled'), required=False, @@ -207,30 +241,8 @@ class WebhookBulkEditForm(NetBoxModelBulkEditForm): required=False, widget=BulkEditNullBooleanSelect() ) - http_method = forms.ChoiceField( - choices=add_blank_choice(WebhookHttpMethodChoices), - required=False, - label=_('HTTP method') - ) - payload_url = forms.CharField( - required=False, - label=_('Payload URL') - ) - ssl_verification = forms.NullBooleanField( - required=False, - widget=BulkEditNullBooleanSelect(), - label=_('SSL verification') - ) - secret = forms.CharField( - label=_('Secret'), - required=False - ) - ca_file_path = forms.CharField( - required=False, - label=_('CA file path') - ) - nullable_fields = ('secret', 'conditions', 'ca_file_path') + nullable_fields = ('conditions',) class TagBulkEditForm(BulkEditForm): diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index 181b1f8d3..82930e8ad 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -1,5 +1,6 @@ from django import forms from django.contrib.postgres.forms import SimpleArrayField +from django.core.exceptions import ObjectDoesNotExist from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ @@ -17,6 +18,7 @@ __all__ = ( 'CustomFieldChoiceSetImportForm', 'CustomFieldImportForm', 'CustomLinkImportForm', + 'EventRuleImportForm', 'ExportTemplateImportForm', 'JournalEntryImportForm', 'SavedFilterImportForm', @@ -143,21 +145,62 @@ class SavedFilterImportForm(CSVModelForm): class WebhookImportForm(NetBoxModelImportForm): - content_types = CSVMultipleContentTypeField( - label=_('Content types'), - queryset=ContentType.objects.with_feature('webhooks'), - help_text=_("One or more assigned object types") - ) class Meta: model = Webhook fields = ( - 'name', 'enabled', 'content_types', 'type_create', 'type_update', 'type_delete', 'type_job_start', - 'type_job_end', 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', + 'name', 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret', 'ssl_verification', 'ca_file_path', 'tags' ) +class EventRuleImportForm(NetBoxModelImportForm): + content_types = CSVMultipleContentTypeField( + label=_('Content types'), + queryset=ContentType.objects.with_feature('event_rules'), + help_text=_("One or more assigned object types") + ) + action_object = forms.CharField( + label=_('Action object'), + required=True, + help_text=_('Webhook name or script as dotted path module.Class') + ) + + class Meta: + model = EventRule + fields = ( + 'name', 'description', 'enabled', 'conditions', 'content_types', 'type_create', 'type_update', + 'type_delete', 'type_job_start', 'type_job_end', 'action_type', 'action_object', 'comments', 'tags' + ) + + def clean(self): + super().clean() + + action_object = self.cleaned_data.get('action_object') + action_type = self.cleaned_data.get('action_type') + if action_object and action_type: + if action_type == EventRuleActionChoices.WEBHOOK: + try: + webhook = Webhook.objects.get(name=action_object) + except Webhook.ObjectDoesNotExist: + raise forms.ValidationError(f"Webhook {action_object} not found") + self.instance.action_object = webhook + elif action_type == EventRuleActionChoices.SCRIPT: + from extras.scripts import get_module_and_script + module_name, script_name = action_object.split('.', 1) + try: + module, script = get_module_and_script(module_name, script_name) + except ObjectDoesNotExist: + raise forms.ValidationError(f"Script {action_object} not found") + self.instance.action_object = module + self.instance.action_object_type = ContentType.objects.get_for_model(module, for_concrete_model=False) + self.instance.action_parameters = { + 'script_choice': f"{str(module.pk)}:{script_name}", + 'script_name': script.name, + 'script_full_name': script.full_name, + } + + class TagImportForm(CSVModelForm): slug = SlugField() diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index b68845c2f..c91e3b8c6 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -22,6 +22,7 @@ __all__ = ( 'CustomFieldChoiceSetFilterForm', 'CustomFieldFilterForm', 'CustomLinkFilterForm', + 'EventRuleFilterForm', 'ExportTemplateFilterForm', 'ImageAttachmentFilterForm', 'JournalEntryFilterForm', @@ -223,23 +224,45 @@ class SavedFilterFilterForm(SavedFiltersMixin, FilterForm): class WebhookFilterForm(NetBoxModelFilterSetForm): model = Webhook - tag = TagFilterField(model) - fieldsets = ( (None, ('q', 'filter_id', 'tag')), - (_('Attributes'), ('content_type_id', 'http_method', 'enabled')), - (_('Events'), ('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end')), + (_('Attributes'), ('payload_url', 'http_method', 'http_content_type')), ) - content_type_id = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.with_feature('webhooks'), - required=False, - label=_('Object type') + http_content_type = forms.CharField( + label=_('HTTP content type'), + required=False + ) + payload_url = forms.CharField( + label=_('Payload URL'), + required=False ) http_method = forms.MultipleChoiceField( choices=WebhookHttpMethodChoices, required=False, label=_('HTTP method') ) + tag = TagFilterField(model) + + +class EventRuleFilterForm(NetBoxModelFilterSetForm): + model = EventRule + tag = TagFilterField(model) + + fieldsets = ( + (None, ('q', 'filter_id', 'tag')), + (_('Attributes'), ('content_type_id', 'action_type', 'enabled')), + (_('Events'), ('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end')), + ) + content_type_id = ContentTypeMultipleChoiceField( + queryset=ContentType.objects.with_feature('event_rules'), + required=False, + label=_('Object type') + ) + action_type = forms.ChoiceField( + choices=add_blank_choice(EventRuleActionChoices), + required=False, + label=_('Action type') + ) enabled = forms.NullBooleanField( label=_('Enabled'), required=False, diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 9553a839a..0c717246f 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -1,6 +1,7 @@ import json from django import forms +from django.contrib.contenttypes.models import ContentType from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ @@ -11,12 +12,12 @@ from extras.choices import * from extras.models import * from netbox.forms import NetBoxModelForm from tenancy.models import Tenant, TenantGroup -from utilities.forms import BootstrapMixin, add_blank_choice +from utilities.forms import BootstrapMixin, add_blank_choice, get_field_value from utilities.forms.fields import ( CommentField, ContentTypeChoiceField, ContentTypeMultipleChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, JSONField, SlugField, ) -from utilities.forms.widgets import ChoicesWidget +from utilities.forms.widgets import ChoicesWidget, HTMXSelect from virtualization.models import Cluster, ClusterGroup, ClusterType __all__ = ( @@ -26,6 +27,7 @@ __all__ = ( 'CustomFieldChoiceSetForm', 'CustomFieldForm', 'CustomLinkForm', + 'EventRuleForm', 'ExportTemplateForm', 'ImageAttachmentForm', 'JournalEntryForm', @@ -211,24 +213,59 @@ class BookmarkForm(BootstrapMixin, forms.ModelForm): class WebhookForm(NetBoxModelForm): - content_types = ContentTypeMultipleChoiceField( - label=_('Content types'), - queryset=ContentType.objects.with_feature('webhooks') - ) fieldsets = ( - (_('Webhook'), ('name', 'content_types', 'enabled', 'tags')), - (_('Events'), ('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end')), + (_('Webhook'), ('name', 'tags',)), (_('HTTP Request'), ( 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret', )), - (_('Conditions'), ('conditions',)), (_('SSL'), ('ssl_verification', 'ca_file_path')), ) class Meta: model = Webhook fields = '__all__' + widgets = { + 'additional_headers': forms.Textarea(attrs={'class': 'font-monospace'}), + 'body_template': forms.Textarea(attrs={'class': 'font-monospace'}), + } + + +class EventRuleForm(NetBoxModelForm): + content_types = ContentTypeMultipleChoiceField( + label=_('Content types'), + queryset=ContentType.objects.with_feature('event_rules'), + ) + action_choice = forms.ChoiceField( + label=_('Action choice'), + choices=[] + ) + conditions = JSONField( + required=False, + help_text=_('Enter conditions in JSON format.') + ) + action_data = JSONField( + required=False, + help_text=_('Enter parameters to pass to the action in JSON format.') + ) + + fieldsets = ( + (_('Event Rule'), ('name', 'description', 'content_types', 'enabled', 'tags')), + (_('Events'), ('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end')), + (_('Conditions'), ('conditions',)), + (_('Action'), ( + 'action_type', 'action_choice', 'action_parameters', 'action_object_type', 'action_object_id', + 'action_data', + )), + ) + + class Meta: + model = EventRule + fields = ( + 'content_types', 'name', 'description', 'type_create', 'type_update', 'type_delete', 'type_job_start', + 'type_job_end', 'enabled', 'conditions', 'action_type', 'action_object_type', 'action_object_id', + 'action_parameters', 'action_data', 'comments', 'tags' + ) labels = { 'type_create': _('Creations'), 'type_update': _('Updates'), @@ -237,11 +274,76 @@ class WebhookForm(NetBoxModelForm): 'type_job_end': _('Job terminations'), } widgets = { - 'additional_headers': forms.Textarea(attrs={'class': 'font-monospace'}), - 'body_template': forms.Textarea(attrs={'class': 'font-monospace'}), 'conditions': forms.Textarea(attrs={'class': 'font-monospace'}), + 'action_type': HTMXSelect(), + 'action_object_type': forms.HiddenInput, + 'action_object_id': forms.HiddenInput, + 'action_parameters': forms.HiddenInput, } + def init_script_choice(self): + choices = [] + for module in ScriptModule.objects.all(): + scripts = [] + for script_name in module.scripts.keys(): + name = f"{str(module.pk)}:{script_name}" + scripts.append((name, script_name)) + + if scripts: + choices.append((str(module), scripts)) + + self.fields['action_choice'].choices = choices + parameters = get_field_value(self, 'action_parameters') + initial = None + if parameters and 'script_choice' in parameters: + initial = parameters['script_choice'] + self.fields['action_choice'].initial = initial + + def init_webhook_choice(self): + initial = None + if self.fields['action_object_type'] and get_field_value(self, 'action_object_id'): + initial = Webhook.objects.get(pk=get_field_value(self, 'action_object_id')) + self.fields['action_choice'] = DynamicModelChoiceField( + label=_('Webhook'), + queryset=Webhook.objects.all(), + required=True, + initial=initial + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['action_object_type'].required = False + self.fields['action_object_id'].required = False + + # Determine the action type + action_type = get_field_value(self, 'action_type') + + if action_type == EventRuleActionChoices.WEBHOOK: + self.init_webhook_choice() + elif action_type == EventRuleActionChoices.SCRIPT: + self.init_script_choice() + + def clean(self): + super().clean() + + action_choice = self.cleaned_data.get('action_choice') + if self.cleaned_data.get('action_type') == EventRuleActionChoices.WEBHOOK: + self.cleaned_data['action_object_type'] = ContentType.objects.get_for_model(action_choice) + self.cleaned_data['action_object_id'] = action_choice.id + elif self.cleaned_data.get('action_type') == EventRuleActionChoices.SCRIPT: + module_id, script_name = action_choice.split(":", maxsplit=1) + script_module = ScriptModule.objects.get(pk=module_id) + self.cleaned_data['action_object_type'] = ContentType.objects.get_for_model(script_module, for_concrete_model=False) + self.cleaned_data['action_object_id'] = script_module.id + script = script_module.scripts[script_name]() + self.cleaned_data['action_parameters'] = { + 'script_choice': action_choice, + 'script_name': script.name, + 'script_full_name': script.full_name, + } + + return self.cleaned_data + class TagForm(BootstrapMixin, forms.ModelForm): slug = SlugField() diff --git a/netbox/extras/graphql/schema.py b/netbox/extras/graphql/schema.py index e13cc0e9f..09e399e37 100644 --- a/netbox/extras/graphql/schema.py +++ b/netbox/extras/graphql/schema.py @@ -72,3 +72,9 @@ class ExtrasQuery(graphene.ObjectType): def resolve_webhook_list(root, info, **kwargs): return gql_query_optimizer(models.Webhook.objects.all(), info) + + event_rule = ObjectField(EventRuleType) + event_rule_list = ObjectListField(EventRuleType) + + def resolve_eventrule_list(root, info, **kwargs): + return gql_query_optimizer(models.EventRule.objects.all(), info) diff --git a/netbox/extras/graphql/types.py b/netbox/extras/graphql/types.py index 068da02f2..4981ddd72 100644 --- a/netbox/extras/graphql/types.py +++ b/netbox/extras/graphql/types.py @@ -8,6 +8,7 @@ __all__ = ( 'CustomFieldChoiceSetType', 'CustomFieldType', 'CustomLinkType', + 'EventRuleType', 'ExportTemplateType', 'ImageAttachmentType', 'JournalEntryType', @@ -110,5 +111,12 @@ class WebhookType(OrganizationalObjectType): class Meta: model = models.Webhook - exclude = ('content_types', ) filterset_class = filtersets.WebhookFilterSet + + +class EventRuleType(OrganizationalObjectType): + + class Meta: + model = models.EventRule + exclude = ('content_types', ) + filterset_class = filtersets.EventRuleFilterSet diff --git a/netbox/extras/management/commands/runscript.py b/netbox/extras/management/commands/runscript.py index 3cf70281c..97ee39f50 100644 --- a/netbox/extras/management/commands/runscript.py +++ b/netbox/extras/management/commands/runscript.py @@ -11,9 +11,9 @@ from django.db import transaction from core.choices import JobStatusChoices from core.models import Job from extras.api.serializers import ScriptOutputSerializer -from extras.context_managers import change_logging +from extras.context_managers import event_tracking from extras.scripts import get_module_and_script -from extras.signals import clear_webhooks +from extras.signals import clear_events from utilities.exceptions import AbortTransaction from utilities.utils import NetBoxFakeRequest @@ -37,7 +37,7 @@ class Command(BaseCommand): def _run_script(): """ Core script execution task. We capture this within a subfunction to allow for conditionally wrapping it with - the change_logging context manager (which is bypassed if commit == False). + the event_tracking context manager (which is bypassed if commit == False). """ try: try: @@ -47,7 +47,7 @@ class Command(BaseCommand): raise AbortTransaction() except AbortTransaction: script.log_info("Database changes have been reverted automatically.") - clear_webhooks.send(request) + clear_events.send(request) job.data = ScriptOutputSerializer(script).data job.terminate() except Exception as e: @@ -57,7 +57,7 @@ class Command(BaseCommand): ) script.log_info("Database changes have been reverted due to error.") logger.error(f"Exception raised during script execution: {e}") - clear_webhooks.send(request) + clear_events.send(request) job.data = ScriptOutputSerializer(script).data job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=str(e)) @@ -136,9 +136,9 @@ class Command(BaseCommand): logger.info(f"Running script (commit={commit})") script.request = request - # Execute the script. If commit is True, wrap it with the change_logging context manager to ensure we process + # Execute the script. If commit is True, wrap it with the event_tracking context manager to ensure we process # change logging, webhooks, etc. - with change_logging(request): + with event_tracking(request): _run_script() else: logger.error('Data is not valid:') diff --git a/netbox/extras/migrations/0101_eventrule.py b/netbox/extras/migrations/0101_eventrule.py new file mode 100644 index 000000000..64e03dda0 --- /dev/null +++ b/netbox/extras/migrations/0101_eventrule.py @@ -0,0 +1,127 @@ +import django.db.models.deletion +import taggit.managers +from django.contrib.contenttypes.models import ContentType +from django.db import migrations, models + +import utilities.json +from extras.choices import * + + +def move_webhooks(apps, schema_editor): + Webhook = apps.get_model("extras", "Webhook") + EventRule = apps.get_model("extras", "EventRule") + + for webhook in Webhook.objects.all(): + event = EventRule() + + event.name = webhook.name + event.type_create = webhook.type_create + event.type_update = webhook.type_update + event.type_delete = webhook.type_delete + event.type_job_start = webhook.type_job_start + event.type_job_end = webhook.type_job_end + event.enabled = webhook.enabled + event.conditions = webhook.conditions + + event.action_type = EventRuleActionChoices.WEBHOOK + event.action_object_type_id = ContentType.objects.get_for_model(webhook).id + event.action_object_id = webhook.id + event.save() + event.content_types.add(*webhook.content_types.all()) + + +class Migration(migrations.Migration): + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('extras', '0100_customfield_ui_attrs'), + ] + + operations = [ + migrations.CreateModel( + name='EventRule', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ( + 'custom_field_data', + models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder), + ), + ('name', models.CharField(max_length=150, unique=True)), + ('description', models.CharField(blank=True, max_length=200)), + ('type_create', models.BooleanField(default=False)), + ('type_update', models.BooleanField(default=False)), + ('type_delete', models.BooleanField(default=False)), + ('type_job_start', models.BooleanField(default=False)), + ('type_job_end', models.BooleanField(default=False)), + ('enabled', models.BooleanField(default=True)), + ('conditions', models.JSONField(blank=True, null=True)), + ('action_type', models.CharField(default='webhook', max_length=30)), + ('action_object_id', models.PositiveBigIntegerField(blank=True, null=True)), + ('action_parameters', models.JSONField(blank=True, null=True)), + ('action_data', models.JSONField(blank=True, null=True)), + ('comments', models.TextField(blank=True)), + ], + options={ + 'verbose_name': 'eventrule', + 'verbose_name_plural': 'eventrules', + 'ordering': ('name',), + }, + ), + migrations.RunPython(move_webhooks), + migrations.RemoveConstraint( + model_name='webhook', + name='extras_webhook_unique_payload_url_types', + ), + migrations.RemoveField( + model_name='webhook', + name='conditions', + ), + migrations.RemoveField( + model_name='webhook', + name='content_types', + ), + migrations.RemoveField( + model_name='webhook', + name='enabled', + ), + migrations.RemoveField( + model_name='webhook', + name='type_create', + ), + migrations.RemoveField( + model_name='webhook', + name='type_delete', + ), + migrations.RemoveField( + model_name='webhook', + name='type_job_end', + ), + migrations.RemoveField( + model_name='webhook', + name='type_job_start', + ), + migrations.RemoveField( + model_name='webhook', + name='type_update', + ), + migrations.AddField( + model_name='eventrule', + name='action_object_type', + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='eventrule_actions', + to='contenttypes.contenttype', + ), + ), + migrations.AddField( + model_name='eventrule', + name='content_types', + field=models.ManyToManyField(related_name='eventrules', to='contenttypes.contenttype'), + ), + migrations.AddField( + model_name='eventrule', + name='tags', + field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'), + ), + ] diff --git a/netbox/extras/migrations/0101_move_configrevision.py b/netbox/extras/migrations/0102_move_configrevision.py similarity index 96% rename from netbox/extras/migrations/0101_move_configrevision.py rename to netbox/extras/migrations/0102_move_configrevision.py index 730e7a096..36eef1205 100644 --- a/netbox/extras/migrations/0101_move_configrevision.py +++ b/netbox/extras/migrations/0102_move_configrevision.py @@ -15,7 +15,7 @@ def update_content_type(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('extras', '0100_customfield_ui_attrs'), + ('extras', '0101_eventrule'), ] operations = [ diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index d0a2e4b61..e5f71dba3 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -2,7 +2,7 @@ import json import urllib.parse from django.conf import settings -from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation from django.core.validators import ValidationError from django.db import models from django.http import HttpResponse @@ -28,6 +28,7 @@ from utilities.utils import clean_html, dict_to_querydict, render_jinja2 __all__ = ( 'Bookmark', 'CustomLink', + 'EventRule', 'ExportTemplate', 'ImageAttachment', 'JournalEntry', @@ -36,23 +37,28 @@ __all__ = ( ) -class Webhook(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel): +class EventRule(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel): """ - A Webhook defines a request that will be sent to a remote application when an object is created, updated, and/or - delete in NetBox. The request will contain a representation of the object, which the remote application can act on. - Each Webhook can be limited to firing only on certain actions or certain object types. + An EventRule defines an action to be taken automatically in response to a specific set of events, such as when a + specific type of object is created, modified, or deleted. The action to be taken might entail transmitting a + webhook or executing a custom script. """ content_types = models.ManyToManyField( to='contenttypes.ContentType', - related_name='webhooks', + related_name='eventrules', verbose_name=_('object types'), - help_text=_("The object(s) to which this Webhook applies.") + help_text=_("The object(s) to which this rule applies.") ) name = models.CharField( verbose_name=_('name'), max_length=150, unique=True ) + description = models.CharField( + verbose_name=_('description'), + max_length=200, + blank=True + ) type_create = models.BooleanField( verbose_name=_('on create'), default=False, @@ -78,6 +84,104 @@ class Webhook(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedMo default=False, help_text=_("Triggers when a job for a matching object terminates.") ) + enabled = models.BooleanField( + verbose_name=_('enabled'), + default=True + ) + conditions = models.JSONField( + verbose_name=_('conditions'), + blank=True, + null=True, + help_text=_("A set of conditions which determine whether the event will be generated.") + ) + + # Action to take + action_type = models.CharField( + max_length=30, + choices=EventRuleActionChoices, + default=EventRuleActionChoices.WEBHOOK, + verbose_name=_('action type') + ) + action_object_type = models.ForeignKey( + to='contenttypes.ContentType', + related_name='eventrule_actions', + on_delete=models.CASCADE + ) + action_object_id = models.PositiveBigIntegerField( + blank=True, + null=True + ) + action_object = GenericForeignKey( + ct_field='action_object_type', + fk_field='action_object_id' + ) + # internal (not show in UI) - used by scripts to store function name + action_parameters = models.JSONField( + blank=True, + null=True, + ) + action_data = models.JSONField( + verbose_name=_('parameters'), + blank=True, + null=True, + help_text=_("Parameters to pass to the action.") + ) + comments = models.TextField( + verbose_name=_('comments'), + blank=True + ) + + class Meta: + ordering = ('name',) + verbose_name = _('event rule') + verbose_name_plural = _('event rules') + + def __str__(self): + return self.name + + def get_absolute_url(self): + return reverse('extras:eventrule', args=[self.pk]) + + def clean(self): + super().clean() + + # At least one action type must be selected + if not any([ + self.type_create, self.type_update, self.type_delete, self.type_job_start, self.type_job_end + ]): + raise ValidationError( + _("At least one event type must be selected: create, update, delete, job start, and/or job end.") + ) + + # Validate that any conditions are in the correct format + if self.conditions: + try: + ConditionSet(self.conditions) + except ValueError as e: + raise ValidationError({'conditions': e}) + + def eval_conditions(self, data): + """ + Test whether the given data meets the conditions of the event rule (if any). Return True + if met or no conditions are specified. + """ + if not self.conditions: + return True + + return ConditionSet(self.conditions).eval(data) + + +class Webhook(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel): + """ + A Webhook defines a request that will be sent to a remote application when an object is created, updated, and/or + delete in NetBox. The request will contain a representation of the object, which the remote application can act on. + Each Webhook can be limited to firing only on certain actions or certain object types. + """ + name = models.CharField( + verbose_name=_('name'), + max_length=150, + unique=True + ) payload_url = models.CharField( max_length=500, verbose_name=_('URL'), @@ -86,10 +190,6 @@ class Webhook(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedMo "processing is supported with the same context as the request body." ) ) - enabled = models.BooleanField( - verbose_name=_('enabled'), - default=True - ) http_method = models.CharField( max_length=30, choices=WebhookHttpMethodChoices, @@ -132,12 +232,6 @@ class Webhook(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedMo "digest of the payload body using the secret as the key. The secret is not transmitted in the request." ) ) - conditions = models.JSONField( - verbose_name=_('conditions'), - blank=True, - null=True, - help_text=_("A set of conditions which determine whether the webhook will be generated.") - ) ssl_verification = models.BooleanField( default=True, verbose_name=_('SSL verification'), @@ -152,15 +246,14 @@ class Webhook(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedMo "The specific CA certificate file to use for SSL verification. Leave blank to use the system defaults." ) ) + events = GenericRelation( + EventRule, + content_type_field='action_object_type', + object_id_field='action_object_id' + ) class Meta: ordering = ('name',) - constraints = ( - models.UniqueConstraint( - fields=('payload_url', 'type_create', 'type_update', 'type_delete'), - name='%(app_label)s_%(class)s_unique_payload_url_types' - ), - ) verbose_name = _('webhook') verbose_name_plural = _('webhooks') @@ -177,20 +270,6 @@ class Webhook(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedMo def clean(self): super().clean() - # At least one action type must be selected - if not any([ - self.type_create, self.type_update, self.type_delete, self.type_job_start, self.type_job_end - ]): - raise ValidationError( - _("At least one event type must be selected: create, update, delete, job_start, and/or job_end.") - ) - - if self.conditions: - try: - ConditionSet(self.conditions) - except ValueError as e: - raise ValidationError({'conditions': e}) - # CA file path requires SSL verification enabled if not self.ssl_verification and self.ca_file_path: raise ValidationError({ diff --git a/netbox/extras/models/reports.py b/netbox/extras/models/reports.py index 223d679bd..f6228ef24 100644 --- a/netbox/extras/models/reports.py +++ b/netbox/extras/models/reports.py @@ -9,7 +9,7 @@ from django.utils.translation import gettext_lazy as _ from core.choices import ManagedFileRootPathChoices from core.models import ManagedFile from extras.utils import is_report -from netbox.models.features import JobsMixin, WebhooksMixin +from netbox.models.features import JobsMixin, EventRulesMixin from utilities.querysets import RestrictedQuerySet from .mixins import PythonModuleMixin @@ -21,7 +21,7 @@ __all__ = ( ) -class Report(WebhooksMixin, models.Model): +class Report(EventRulesMixin, models.Model): """ Dummy model used to generate permissions for reports. Does not exist in the database. """ diff --git a/netbox/extras/models/scripts.py b/netbox/extras/models/scripts.py index 122f56f20..93275acda 100644 --- a/netbox/extras/models/scripts.py +++ b/netbox/extras/models/scripts.py @@ -9,7 +9,7 @@ from django.utils.translation import gettext_lazy as _ from core.choices import ManagedFileRootPathChoices from core.models import ManagedFile from extras.utils import is_script -from netbox.models.features import JobsMixin, WebhooksMixin +from netbox.models.features import JobsMixin, EventRulesMixin from utilities.querysets import RestrictedQuerySet from .mixins import PythonModuleMixin @@ -21,7 +21,7 @@ __all__ = ( logger = logging.getLogger('netbox.data_backends') -class Script(WebhooksMixin, models.Model): +class Script(EventRulesMixin, models.Model): """ Dummy model used to generate permissions for custom scripts. Does not exist in the database. """ diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py index df75200e6..495957fd9 100644 --- a/netbox/extras/scripts.py +++ b/netbox/extras/scripts.py @@ -17,13 +17,13 @@ from core.models import Job from extras.api.serializers import ScriptOutputSerializer from extras.choices import LogLevelChoices from extras.models import ScriptModule -from extras.signals import clear_webhooks +from extras.signals import clear_events from ipam.formfields import IPAddressFormField, IPNetworkFormField from ipam.validators import MaxPrefixLengthValidator, MinPrefixLengthValidator, prefix_validator from utilities.exceptions import AbortScript, AbortTransaction from utilities.forms import add_blank_choice from utilities.forms.fields import DynamicModelChoiceField, DynamicModelMultipleChoiceField -from .context_managers import change_logging +from .context_managers import event_tracking from .forms import ScriptForm __all__ = ( @@ -472,10 +472,16 @@ def get_module_and_script(module_name, script_name): return module, script -def run_script(data, request, job, commit=True, **kwargs): +def run_script(data, job, request=None, commit=True, **kwargs): """ A wrapper for calling Script.run(). This performs error handling and provides a hook for committing changes. It exists outside the Script class to ensure it cannot be overridden by a script author. + + Args: + data: A dictionary of data to be passed to the script upon execution + job: The Job associated with this execution + request: The WSGI request associated with this execution (if any) + commit: Passed through to Script.run() """ job.start() @@ -486,9 +492,10 @@ def run_script(data, request, job, commit=True, **kwargs): logger.info(f"Running script (commit={commit})") # Add files to form data - files = request.FILES - for field_name, fileobj in files.items(): - data[field_name] = fileobj + if request: + files = request.FILES + for field_name, fileobj in files.items(): + data[field_name] = fileobj # Add the current request as a property of the script script.request = request @@ -496,7 +503,7 @@ def run_script(data, request, job, commit=True, **kwargs): def _run_script(): """ Core script execution task. We capture this within a subfunction to allow for conditionally wrapping it with - the change_logging context manager (which is bypassed if commit == False). + the event_tracking context manager (which is bypassed if commit == False). """ try: try: @@ -506,7 +513,8 @@ def run_script(data, request, job, commit=True, **kwargs): raise AbortTransaction() except AbortTransaction: script.log_info("Database changes have been reverted automatically.") - clear_webhooks.send(request) + if request: + clear_events.send(request) job.data = ScriptOutputSerializer(script).data job.terminate() except Exception as e: @@ -520,14 +528,15 @@ def run_script(data, request, job, commit=True, **kwargs): script.log_info("Database changes have been reverted due to error.") job.data = ScriptOutputSerializer(script).data job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=str(e)) - clear_webhooks.send(request) + if request: + clear_events.send(request) logger.info(f"Script completed in {job.duration}") - # Execute the script. If commit is True, wrap it with the change_logging context manager to ensure we process - # change logging, webhooks, etc. + # Execute the script. If commit is True, wrap it with the event_tracking context manager to ensure we process + # change logging, event rules, etc. if commit: - with change_logging(request): + with event_tracking(request): _run_script() else: _run_script() diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index e1d424960..184ee6d9b 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -10,19 +10,19 @@ from django_prometheus.models import model_deletes, model_inserts, model_updates from extras.validators import CustomValidator from netbox.config import get_config -from netbox.context import current_request, webhooks_queue +from netbox.context import current_request, events_queue from netbox.signals import post_clean from utilities.exceptions import AbortRequest from .choices import ObjectChangeActionChoices +from .events import enqueue_object, get_snapshots, serialize_for_event from .models import CustomField, ObjectChange, TaggedItem -from .webhooks import enqueue_object, get_snapshots, serialize_for_webhook # # Change logging/webhooks # -# Define a custom signal that can be sent to clear any queued webhooks -clear_webhooks = Signal() +# Define a custom signal that can be sent to clear any queued events +clear_events = Signal() def is_same_object(instance, webhook_data, request_id): @@ -81,14 +81,14 @@ def handle_changed_object(sender, instance, **kwargs): objectchange.save() # If this is an M2M change, update the previously queued webhook (from post_save) - queue = webhooks_queue.get() + queue = events_queue.get() if m2m_changed and queue and is_same_object(instance, queue[-1], request.id): instance.refresh_from_db() # Ensure that we're working with fresh M2M assignments - queue[-1]['data'] = serialize_for_webhook(instance) + queue[-1]['data'] = serialize_for_event(instance) queue[-1]['snapshots']['postchange'] = get_snapshots(instance, action)['postchange'] else: enqueue_object(queue, instance, request.user, request.id, action) - webhooks_queue.set(queue) + events_queue.set(queue) # Increment metric counters if action == ObjectChangeActionChoices.ACTION_CREATE: @@ -117,22 +117,22 @@ def handle_deleted_object(sender, instance, **kwargs): objectchange.save() # Enqueue webhooks - queue = webhooks_queue.get() + queue = events_queue.get() enqueue_object(queue, instance, request.user, request.id, ObjectChangeActionChoices.ACTION_DELETE) - webhooks_queue.set(queue) + events_queue.set(queue) # Increment metric counters model_deletes.labels(instance._meta.model_name).inc() -@receiver(clear_webhooks) -def clear_webhook_queue(sender, **kwargs): +@receiver(clear_events) +def clear_events_queue(sender, **kwargs): """ - Delete any queued webhooks (e.g. because of an aborted bulk transaction) + Delete any queued events (e.g. because of an aborted bulk transaction) """ - logger = logging.getLogger('webhooks') - logger.info(f"Clearing {len(webhooks_queue.get())} queued webhooks ({sender})") - webhooks_queue.set([]) + logger = logging.getLogger('events') + logger.info(f"Clearing {len(events_queue.get())} queued events ({sender})") + events_queue.set([]) # diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index b78ab0c94..ece23093b 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -15,6 +15,7 @@ __all__ = ( 'CustomFieldChoiceSetTable', 'CustomFieldTable', 'CustomLinkTable', + 'EventRuleTable', 'ExportTemplateTable', 'ImageAttachmentTable', 'JournalEntryTable', @@ -250,6 +251,32 @@ class WebhookTable(NetBoxTable): verbose_name=_('Name'), linkify=True ) + ssl_validation = columns.BooleanColumn( + verbose_name=_('SSL Validation') + ) + tags = columns.TagColumn( + url_name='extras:webhook_list' + ) + + class Meta(NetBoxTable.Meta): + model = Webhook + fields = ( + 'pk', 'id', 'name', 'http_method', 'payload_url', 'http_content_type', 'secret', 'ssl_verification', + 'ca_file_path', 'tags', 'created', 'last_updated', + ) + default_columns = ( + 'pk', 'name', 'http_method', 'payload_url', + ) + + +class EventRuleTable(NetBoxTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + action_type = tables.Column( + verbose_name=_('Action Type'), + ) content_types = columns.ContentTypesColumn( verbose_name=_('Content Types'), ) @@ -271,23 +298,19 @@ class WebhookTable(NetBoxTable): type_job_end = columns.BooleanColumn( verbose_name=_('Job End') ) - ssl_validation = columns.BooleanColumn( - verbose_name=_('SSL Validation') - ) tags = columns.TagColumn( url_name='extras:webhook_list' ) class Meta(NetBoxTable.Meta): - model = Webhook + model = EventRule fields = ( - 'pk', 'id', 'name', 'content_types', 'enabled', 'type_create', 'type_update', 'type_delete', - 'type_job_start', 'type_job_end', 'http_method', 'payload_url', 'secret', 'ssl_validation', 'ca_file_path', - 'tags', 'created', 'last_updated', + 'pk', 'id', 'name', 'enabled', 'description', 'action_type', 'content_types', 'type_create', 'type_update', + 'type_delete', 'type_job_start', 'type_job_end', 'tags', 'created', 'last_updated', ) default_columns = ( - 'pk', 'name', 'content_types', 'enabled', 'type_create', 'type_update', 'type_delete', 'type_job_start', - 'type_job_end', 'http_method', 'payload_url', + 'pk', 'name', 'enabled', 'action_type', 'content_types', 'type_create', 'type_update', 'type_delete', + 'type_job_start', 'type_job_end', ) diff --git a/netbox/extras/tests/test_api.py b/netbox/extras/tests/test_api.py index 255457f21..b35fb8d66 100644 --- a/netbox/extras/tests/test_api.py +++ b/netbox/extras/tests/test_api.py @@ -8,6 +8,7 @@ from rest_framework import status from core.choices import ManagedFileRootPathChoices from dcim.models import Device, DeviceRole, DeviceType, Manufacturer, Rack, Location, RackRole, Site +from extras.choices import * from extras.models import * from extras.reports import Report from extras.scripts import BooleanVar, IntegerVar, Script, StringVar @@ -32,21 +33,15 @@ class WebhookTest(APIViewTestCases.APIViewTestCase): brief_fields = ['display', 'id', 'name', 'url'] create_data = [ { - 'content_types': ['dcim.device', 'dcim.devicetype'], 'name': 'Webhook 4', - 'type_create': True, 'payload_url': 'http://example.com/?4', }, { - 'content_types': ['dcim.device', 'dcim.devicetype'], 'name': 'Webhook 5', - 'type_update': True, 'payload_url': 'http://example.com/?5', }, { - 'content_types': ['dcim.device', 'dcim.devicetype'], 'name': 'Webhook 6', - 'type_delete': True, 'payload_url': 'http://example.com/?6', }, ] @@ -56,29 +51,100 @@ class WebhookTest(APIViewTestCases.APIViewTestCase): @classmethod def setUpTestData(cls): - site_ct = ContentType.objects.get_for_model(Site) - rack_ct = ContentType.objects.get_for_model(Rack) webhooks = ( Webhook( name='Webhook 1', - type_create=True, payload_url='http://example.com/?1', ), Webhook( name='Webhook 2', - type_update=True, payload_url='http://example.com/?1', ), Webhook( name='Webhook 3', - type_delete=True, payload_url='http://example.com/?1', ), ) Webhook.objects.bulk_create(webhooks) - for webhook in webhooks: - webhook.content_types.add(site_ct, rack_ct) + + +class EventRuleTest(APIViewTestCases.APIViewTestCase): + model = EventRule + brief_fields = ['display', 'id', 'name', 'url'] + bulk_update_data = { + 'enabled': False, + 'description': 'New description', + } + update_data = { + 'name': 'Event Rule X', + 'enabled': False, + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + webhooks = ( + Webhook( + name='Webhook 1', + payload_url='http://example.com/?1', + ), + Webhook( + name='Webhook 2', + payload_url='http://example.com/?1', + ), + Webhook( + name='Webhook 3', + payload_url='http://example.com/?1', + ), + Webhook( + name='Webhook 4', + payload_url='http://example.com/?1', + ), + Webhook( + name='Webhook 5', + payload_url='http://example.com/?1', + ), + Webhook( + name='Webhook 6', + payload_url='http://example.com/?1', + ), + ) + Webhook.objects.bulk_create(webhooks) + + event_rules = ( + EventRule(name='EventRule 1', type_create=True, action_object=webhooks[0]), + EventRule(name='EventRule 2', type_create=True, action_object=webhooks[1]), + EventRule(name='EventRule 3', type_create=True, action_object=webhooks[2]), + ) + EventRule.objects.bulk_create(event_rules) + + cls.create_data = [ + { + 'name': 'EventRule 4', + 'content_types': ['dcim.device', 'dcim.devicetype'], + 'type_create': True, + 'action_type': EventRuleActionChoices.WEBHOOK, + 'action_object_type': 'extras.webhook', + 'action_object_id': webhooks[3].pk, + }, + { + 'name': 'EventRule 5', + 'content_types': ['dcim.device', 'dcim.devicetype'], + 'type_create': True, + 'action_type': EventRuleActionChoices.WEBHOOK, + 'action_object_type': 'extras.webhook', + 'action_object_id': webhooks[4].pk, + }, + { + 'name': 'EventRule 6', + 'content_types': ['dcim.device', 'dcim.devicetype'], + 'type_create': True, + 'action_type': EventRuleActionChoices.WEBHOOK, + 'action_object_type': 'extras.webhook', + 'action_object_id': webhooks[5].pk, + }, + ] class CustomFieldTest(APIViewTestCases.APIViewTestCase): diff --git a/netbox/extras/tests/test_webhooks.py b/netbox/extras/tests/test_event_rules.py similarity index 72% rename from netbox/extras/tests/test_webhooks.py rename to netbox/extras/tests/test_event_rules.py index ef7637765..ed64ba891 100644 --- a/netbox/extras/tests/test_webhooks.py +++ b/netbox/extras/tests/test_event_rules.py @@ -3,22 +3,22 @@ import uuid from unittest.mock import patch import django_rq +from dcim.choices import SiteStatusChoices +from dcim.models import Site from django.contrib.contenttypes.models import ContentType from django.http import HttpResponse from django.urls import reverse +from extras.choices import EventRuleActionChoices, ObjectChangeActionChoices +from extras.events import enqueue_object, flush_events, serialize_for_event +from extras.models import EventRule, Tag, Webhook +from extras.webhooks import generate_signature +from extras.webhooks_worker import process_webhook from requests import Session from rest_framework import status - -from dcim.choices import SiteStatusChoices -from dcim.models import Site -from extras.choices import ObjectChangeActionChoices -from extras.models import Tag, Webhook -from extras.webhooks import enqueue_object, flush_webhooks, generate_signature, serialize_for_webhook -from extras.webhooks_worker import eval_conditions, process_webhook from utilities.testing import APITestCase -class WebhookTest(APITestCase): +class EventRuleTest(APITestCase): def setUp(self): super().setUp() @@ -35,12 +35,37 @@ class WebhookTest(APITestCase): DUMMY_SECRET = 'LOOKATMEIMASECRETSTRING' webhooks = Webhook.objects.bulk_create(( - Webhook(name='Webhook 1', type_create=True, payload_url=DUMMY_URL, secret=DUMMY_SECRET, additional_headers='X-Foo: Bar'), - Webhook(name='Webhook 2', type_update=True, payload_url=DUMMY_URL, secret=DUMMY_SECRET), - Webhook(name='Webhook 3', type_delete=True, payload_url=DUMMY_URL, secret=DUMMY_SECRET), + Webhook(name='Webhook 1', payload_url=DUMMY_URL, secret=DUMMY_SECRET, additional_headers='X-Foo: Bar'), + Webhook(name='Webhook 2', payload_url=DUMMY_URL, secret=DUMMY_SECRET), + Webhook(name='Webhook 3', payload_url=DUMMY_URL, secret=DUMMY_SECRET), )) - for webhook in webhooks: - webhook.content_types.set([site_ct]) + + ct = ContentType.objects.get(app_label='extras', model='webhook') + event_rules = EventRule.objects.bulk_create(( + EventRule( + name='Webhook Event 1', + type_create=True, + action_type=EventRuleActionChoices.WEBHOOK, + action_object_type=ct, + action_object_id=webhooks[0].id + ), + EventRule( + name='Webhook Event 2', + type_update=True, + action_type=EventRuleActionChoices.WEBHOOK, + action_object_type=ct, + action_object_id=webhooks[0].id + ), + EventRule( + name='Webhook Event 3', + type_delete=True, + action_type=EventRuleActionChoices.WEBHOOK, + action_object_type=ct, + action_object_id=webhooks[0].id + ), + )) + for event_rule in event_rules: + event_rule.content_types.set([site_ct]) Tag.objects.bulk_create(( Tag(name='Foo', slug='foo'), @@ -48,7 +73,42 @@ class WebhookTest(APITestCase): Tag(name='Baz', slug='baz'), )) - def test_enqueue_webhook_create(self): + def test_eventrule_conditions(self): + """ + Test evaluation of EventRule conditions. + """ + event_rule = EventRule( + name='Event Rule 1', + type_create=True, + type_update=True, + conditions={ + 'and': [ + { + 'attr': 'status.value', + 'value': 'active', + } + ] + } + ) + + # Create a Site to evaluate + site = Site.objects.create(name='Site 1', slug='site-1', status=SiteStatusChoices.STATUS_STAGING) + data = serialize_for_event(site) + + # Evaluate the conditions (status='staging') + self.assertFalse(event_rule.eval_conditions(data)) + + # Change the site's status + site.status = SiteStatusChoices.STATUS_ACTIVE + data = serialize_for_event(site) + + # Evaluate the conditions (status='active') + self.assertTrue(event_rule.eval_conditions(data)) + + def test_single_create_process_eventrule(self): + """ + Check that creating an object with an applicable EventRule queues a background task for the rule's action. + """ # Create an object via the REST API data = { 'name': 'Site 1', @@ -65,10 +125,10 @@ class WebhookTest(APITestCase): self.assertEqual(Site.objects.count(), 1) self.assertEqual(Site.objects.first().tags.count(), 2) - # Verify that a job was queued for the object creation webhook + # Verify that a background task was queued for the new object self.assertEqual(self.queue.count, 1) job = self.queue.jobs[0] - self.assertEqual(job.kwargs['webhook'], Webhook.objects.get(type_create=True)) + self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_create=True)) self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_CREATE) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], response.data['id']) @@ -76,7 +136,11 @@ class WebhookTest(APITestCase): self.assertEqual(job.kwargs['snapshots']['postchange']['name'], 'Site 1') self.assertEqual(job.kwargs['snapshots']['postchange']['tags'], ['Bar', 'Foo']) - def test_enqueue_webhook_bulk_create(self): + def test_bulk_create_process_eventrule(self): + """ + Check that bulk creating multiple objects with an applicable EventRule queues a background task for each + new object. + """ # Create multiple objects via the REST API data = [ { @@ -111,10 +175,10 @@ class WebhookTest(APITestCase): self.assertEqual(Site.objects.count(), 3) self.assertEqual(Site.objects.first().tags.count(), 2) - # Verify that a webhook was queued for each object + # Verify that a background task was queued for each new object self.assertEqual(self.queue.count, 3) for i, job in enumerate(self.queue.jobs): - self.assertEqual(job.kwargs['webhook'], Webhook.objects.get(type_create=True)) + self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_create=True)) self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_CREATE) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], response.data[i]['id']) @@ -122,7 +186,10 @@ class WebhookTest(APITestCase): self.assertEqual(job.kwargs['snapshots']['postchange']['name'], response.data[i]['name']) self.assertEqual(job.kwargs['snapshots']['postchange']['tags'], ['Bar', 'Foo']) - def test_enqueue_webhook_update(self): + def test_single_update_process_eventrule(self): + """ + Check that updating an object with an applicable EventRule queues a background task for the rule's action. + """ site = Site.objects.create(name='Site 1', slug='site-1') site.tags.set(Tag.objects.filter(name__in=['Foo', 'Bar'])) @@ -139,10 +206,10 @@ class WebhookTest(APITestCase): response = self.client.patch(url, data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_200_OK) - # Verify that a job was queued for the object update webhook + # Verify that a background task was queued for the updated object self.assertEqual(self.queue.count, 1) job = self.queue.jobs[0] - self.assertEqual(job.kwargs['webhook'], Webhook.objects.get(type_update=True)) + self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_update=True)) self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_UPDATE) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], site.pk) @@ -152,7 +219,11 @@ class WebhookTest(APITestCase): self.assertEqual(job.kwargs['snapshots']['postchange']['name'], 'Site X') self.assertEqual(job.kwargs['snapshots']['postchange']['tags'], ['Baz']) - def test_enqueue_webhook_bulk_update(self): + def test_bulk_update_process_eventrule(self): + """ + Check that bulk updating multiple objects with an applicable EventRule queues a background task for each + updated object. + """ sites = ( Site(name='Site 1', slug='site-1'), Site(name='Site 2', slug='site-2'), @@ -191,10 +262,10 @@ class WebhookTest(APITestCase): response = self.client.patch(url, data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_200_OK) - # Verify that a job was queued for the object update webhook + # Verify that a background task was queued for each updated object self.assertEqual(self.queue.count, 3) for i, job in enumerate(self.queue.jobs): - self.assertEqual(job.kwargs['webhook'], Webhook.objects.get(type_update=True)) + self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_update=True)) self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_UPDATE) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], data[i]['id']) @@ -204,7 +275,10 @@ class WebhookTest(APITestCase): self.assertEqual(job.kwargs['snapshots']['postchange']['name'], response.data[i]['name']) self.assertEqual(job.kwargs['snapshots']['postchange']['tags'], ['Baz']) - def test_enqueue_webhook_delete(self): + def test_single_delete_process_eventrule(self): + """ + Check that deleting an object with an applicable EventRule queues a background task for the rule's action. + """ site = Site.objects.create(name='Site 1', slug='site-1') site.tags.set(Tag.objects.filter(name__in=['Foo', 'Bar'])) @@ -214,17 +288,21 @@ class WebhookTest(APITestCase): response = self.client.delete(url, **self.header) self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - # Verify that a job was queued for the object update webhook + # Verify that a task was queued for the deleted object self.assertEqual(self.queue.count, 1) job = self.queue.jobs[0] - self.assertEqual(job.kwargs['webhook'], Webhook.objects.get(type_delete=True)) + self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_delete=True)) self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_DELETE) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], site.pk) self.assertEqual(job.kwargs['snapshots']['prechange']['name'], 'Site 1') self.assertEqual(job.kwargs['snapshots']['prechange']['tags'], ['Bar', 'Foo']) - def test_enqueue_webhook_bulk_delete(self): + def test_bulk_delete_process_eventrule(self): + """ + Check that bulk deleting multiple objects with an applicable EventRule queues a background task for each + deleted object. + """ sites = ( Site(name='Site 1', slug='site-1'), Site(name='Site 2', slug='site-2'), @@ -243,49 +321,17 @@ class WebhookTest(APITestCase): response = self.client.delete(url, data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_204_NO_CONTENT) - # Verify that a job was queued for the object update webhook + # Verify that a background task was queued for each deleted object self.assertEqual(self.queue.count, 3) for i, job in enumerate(self.queue.jobs): - self.assertEqual(job.kwargs['webhook'], Webhook.objects.get(type_delete=True)) + self.assertEqual(job.kwargs['event_rule'], EventRule.objects.get(type_delete=True)) self.assertEqual(job.kwargs['event'], ObjectChangeActionChoices.ACTION_DELETE) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], sites[i].pk) self.assertEqual(job.kwargs['snapshots']['prechange']['name'], sites[i].name) self.assertEqual(job.kwargs['snapshots']['prechange']['tags'], ['Bar', 'Foo']) - def test_webhook_conditions(self): - # Create a conditional Webhook - webhook = Webhook( - name='Conditional Webhook', - type_create=True, - type_update=True, - payload_url='http://localhost:9000/', - conditions={ - 'and': [ - { - 'attr': 'status.value', - 'value': 'active', - } - ] - } - ) - - # Create a Site to evaluate - site = Site.objects.create(name='Site 1', slug='site-1', status=SiteStatusChoices.STATUS_STAGING) - data = serialize_for_webhook(site) - - # Evaluate the conditions (status='staging') - self.assertFalse(eval_conditions(webhook, data)) - - # Change the site's status - site.status = SiteStatusChoices.STATUS_ACTIVE - data = serialize_for_webhook(site) - - # Evaluate the conditions (status='active') - self.assertTrue(eval_conditions(webhook, data)) - def test_webhooks_worker(self): - request_id = uuid.uuid4() def dummy_send(_, request, **kwargs): @@ -293,7 +339,8 @@ class WebhookTest(APITestCase): A dummy implementation of Session.send() to be used for testing. Always returns a 200 HTTP response. """ - webhook = Webhook.objects.get(type_create=True) + event = EventRule.objects.get(type_create=True) + webhook = event.action_object signature = generate_signature(request.body, webhook.secret) # Validate the outgoing request headers @@ -322,7 +369,7 @@ class WebhookTest(APITestCase): request_id=request_id, action=ObjectChangeActionChoices.ACTION_CREATE ) - flush_webhooks(webhooks_queue) + flush_events(webhooks_queue) # Retrieve the job from queue job = self.queue.jobs[0] diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index c5a6706c0..ddc5feb40 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -6,6 +6,7 @@ from django.contrib.contenttypes.models import ContentType from django.test import TestCase from circuits.models import Provider +from core.choices import ManagedFileRootPathChoices from dcim.filtersets import SiteFilterSet from dcim.models import DeviceRole, DeviceType, Manufacturer, Platform, Rack, Region, Site, SiteGroup from dcim.models import Location @@ -159,82 +160,174 @@ class WebhookTestCase(TestCase, BaseFilterSetTests): webhooks = ( Webhook( name='Webhook 1', - type_create=True, - type_update=False, - type_delete=False, - type_job_start=False, - type_job_end=False, payload_url='http://example.com/?1', - enabled=True, http_method='GET', ssl_verification=True, ), Webhook( name='Webhook 2', - type_create=False, - type_update=True, - type_delete=False, - type_job_start=False, - type_job_end=False, payload_url='http://example.com/?2', - enabled=True, http_method='POST', ssl_verification=True, ), Webhook( name='Webhook 3', - type_create=False, - type_update=False, - type_delete=True, - type_job_start=False, - type_job_end=False, payload_url='http://example.com/?3', - enabled=False, http_method='PATCH', ssl_verification=False, ), Webhook( name='Webhook 4', - type_create=False, - type_update=False, - type_delete=False, - type_job_start=True, - type_job_end=False, payload_url='http://example.com/?4', - enabled=False, http_method='PATCH', ssl_verification=False, ), Webhook( name='Webhook 5', - type_create=False, - type_update=False, - type_delete=False, - type_job_start=False, - type_job_end=True, payload_url='http://example.com/?5', - enabled=False, http_method='PATCH', ssl_verification=False, ), ) Webhook.objects.bulk_create(webhooks) - webhooks[0].content_types.add(content_types[0]) - webhooks[1].content_types.add(content_types[1]) - webhooks[2].content_types.add(content_types[2]) - webhooks[3].content_types.add(content_types[3]) - webhooks[4].content_types.add(content_types[4]) def test_name(self): params = {'name': ['Webhook 1', 'Webhook 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_http_method(self): + params = {'http_method': ['GET', 'POST']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_ssl_verification(self): + params = {'ssl_verification': True} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class EventRuleTestCase(TestCase, BaseFilterSetTests): + queryset = EventRule.objects.all() + filterset = EventRuleFilterSet + + @classmethod + def setUpTestData(cls): + content_types = ContentType.objects.filter( + model__in=['region', 'site', 'rack', 'location', 'device'] + ) + + webhooks = ( + Webhook( + name='Webhook 1', + payload_url='http://example.com/?1', + ), + Webhook( + name='Webhook 2', + payload_url='http://example.com/?2', + ), + Webhook( + name='Webhook 3', + payload_url='http://example.com/?3', + ), + ) + Webhook.objects.bulk_create(webhooks) + + scripts = ( + ScriptModule( + file_root=ManagedFileRootPathChoices.SCRIPTS, + file_path='/var/tmp/script1.py' + ), + ScriptModule( + file_root=ManagedFileRootPathChoices.SCRIPTS, + file_path='/var/tmp/script2.py' + ), + ) + ScriptModule.objects.bulk_create(scripts) + + event_rules = ( + EventRule( + name='Event Rule 1', + action_object=webhooks[0], + enabled=True, + type_create=True, + type_update=False, + type_delete=False, + type_job_start=False, + type_job_end=False, + action_type=EventRuleActionChoices.WEBHOOK, + ), + EventRule( + name='Event Rule 2', + action_object=webhooks[1], + enabled=True, + type_create=False, + type_update=True, + type_delete=False, + type_job_start=False, + type_job_end=False, + action_type=EventRuleActionChoices.WEBHOOK, + ), + EventRule( + name='Event Rule 3', + action_object=webhooks[2], + enabled=False, + type_create=False, + type_update=False, + type_delete=True, + type_job_start=False, + type_job_end=False, + action_type=EventRuleActionChoices.WEBHOOK, + ), + EventRule( + name='Event Rule 4', + action_object=scripts[0], + enabled=False, + type_create=False, + type_update=False, + type_delete=False, + type_job_start=True, + type_job_end=False, + action_type=EventRuleActionChoices.SCRIPT, + ), + EventRule( + name='Event Rule 5', + action_object=scripts[1], + enabled=False, + type_create=False, + type_update=False, + type_delete=False, + type_job_start=False, + type_job_end=True, + action_type=EventRuleActionChoices.SCRIPT, + ), + ) + EventRule.objects.bulk_create(event_rules) + event_rules[0].content_types.add(content_types[0]) + event_rules[1].content_types.add(content_types[1]) + event_rules[2].content_types.add(content_types[2]) + event_rules[3].content_types.add(content_types[3]) + event_rules[4].content_types.add(content_types[4]) + + def test_name(self): + params = {'name': ['Event Rule 1', 'Event Rule 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_content_types(self): params = {'content_types': 'dcim.region'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) params = {'content_type_id': [ContentType.objects.get_for_model(Region).pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_action_type(self): + params = {'action_type': [EventRuleActionChoices.WEBHOOK]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + params = {'action_type': [EventRuleActionChoices.SCRIPT]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_enabled(self): + params = {'enabled': True} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'enabled': False} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + def test_type_create(self): params = {'type_create': True} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) @@ -255,18 +348,6 @@ class WebhookTestCase(TestCase, BaseFilterSetTests): params = {'type_job_end': True} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - def test_enabled(self): - params = {'enabled': True} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - def test_http_method(self): - params = {'http_method': ['GET', 'POST']} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - - def test_ssl_verification(self): - params = {'ssl_verification': True} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - class CustomLinkTestCase(TestCase, BaseFilterSetTests): queryset = CustomLink.objects.all() diff --git a/netbox/extras/tests/test_views.py b/netbox/extras/tests/test_views.py index 3d4b3e9a9..602a9d4de 100644 --- a/netbox/extras/tests/test_views.py +++ b/netbox/extras/tests/test_views.py @@ -1,4 +1,3 @@ -import json import urllib.parse import uuid @@ -11,7 +10,6 @@ from extras.choices import * from extras.models import * from utilities.testing import ViewTestCases, TestCase - User = get_user_model() @@ -336,33 +334,26 @@ class WebhookTestCase(ViewTestCases.PrimaryObjectViewTestCase): @classmethod def setUpTestData(cls): - site_ct = ContentType.objects.get_for_model(Site) webhooks = ( - Webhook(name='Webhook 1', payload_url='http://example.com/?1', type_create=True, http_method='POST'), - Webhook(name='Webhook 2', payload_url='http://example.com/?2', type_create=True, http_method='POST'), - Webhook(name='Webhook 3', payload_url='http://example.com/?3', type_create=True, http_method='POST'), + Webhook(name='Webhook 1', payload_url='http://example.com/?1', http_method='POST'), + Webhook(name='Webhook 2', payload_url='http://example.com/?2', http_method='POST'), + Webhook(name='Webhook 3', payload_url='http://example.com/?3', http_method='POST'), ) for webhook in webhooks: webhook.save() - webhook.content_types.add(site_ct) cls.form_data = { 'name': 'Webhook X', - 'content_types': [site_ct.pk], - 'type_create': False, - 'type_update': True, - 'type_delete': True, 'payload_url': 'http://example.com/?x', 'http_method': 'GET', 'http_content_type': 'application/foo', - 'conditions': None, } cls.csv_data = ( - "name,content_types,type_create,payload_url,http_method,http_content_type", - "Webhook 4,dcim.site,True,http://example.com/?4,GET,application/json", - "Webhook 5,dcim.site,True,http://example.com/?5,GET,application/json", - "Webhook 6,dcim.site,True,http://example.com/?6,GET,application/json", + "name,payload_url,http_method,http_content_type", + "Webhook 4,http://example.com/?4,GET,application/json", + "Webhook 5,http://example.com/?5,GET,application/json", + "Webhook 6,http://example.com/?6,GET,application/json", ) cls.csv_update_data = ( @@ -373,11 +364,62 @@ class WebhookTestCase(ViewTestCases.PrimaryObjectViewTestCase): ) cls.bulk_edit_data = { - 'enabled': False, + 'http_method': 'GET', + } + + +class EventRulesTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = EventRule + + @classmethod + def setUpTestData(cls): + + webhooks = ( + Webhook(name='Webhook 1', payload_url='http://example.com/?1', http_method='POST'), + Webhook(name='Webhook 2', payload_url='http://example.com/?2', http_method='POST'), + Webhook(name='Webhook 3', payload_url='http://example.com/?3', http_method='POST'), + ) + for webhook in webhooks: + webhook.save() + + site_ct = ContentType.objects.get_for_model(Site) + event_rules = ( + EventRule(name='EventRule 1', type_create=True, action_object=webhooks[0]), + EventRule(name='EventRule 2', type_create=True, action_object=webhooks[1]), + EventRule(name='EventRule 3', type_create=True, action_object=webhooks[2]), + ) + for event in event_rules: + event.save() + event.content_types.add(site_ct) + + webhook_ct = ContentType.objects.get_for_model(Webhook) + cls.form_data = { + 'name': 'Event X', + 'content_types': [site_ct.pk], 'type_create': False, 'type_update': True, 'type_delete': True, - 'http_method': 'GET', + 'conditions': None, + 'action_type': 'webhook', + 'action_object_type': webhook_ct.pk, + 'action_object_id': webhooks[0].pk, + 'action_choice': webhooks[0] + } + + cls.csv_data = ( + "name,content_types,type_create,action_type,action_object", + "Webhook 4,dcim.site,True,webhook,Webhook 1", + ) + + cls.csv_update_data = ( + "id,name", + f"{event_rules[0].pk},Event 7", + f"{event_rules[1].pk},Event 8", + f"{event_rules[2].pk},Event 9", + ) + + cls.bulk_edit_data = { + 'type_update': True, } diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index bcab007e7..0a1786f1f 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -61,6 +61,14 @@ urlpatterns = [ path('webhooks/delete/', views.WebhookBulkDeleteView.as_view(), name='webhook_bulk_delete'), path('webhooks//', include(get_model_urls('extras', 'webhook'))), + # Event rules + path('event-rules/', views.EventRuleListView.as_view(), name='eventrule_list'), + path('event-rules/add/', views.EventRuleEditView.as_view(), name='eventrule_add'), + path('event-rules/import/', views.EventRuleBulkImportView.as_view(), name='eventrule_import'), + path('event-rules/edit/', views.EventRuleBulkEditView.as_view(), name='eventrule_bulk_edit'), + path('event-rules/delete/', views.EventRuleBulkDeleteView.as_view(), name='eventrule_bulk_delete'), + path('event-rules//', include(get_model_urls('extras', 'eventrule'))), + # Tags path('tags/', views.TagListView.as_view(), name='tag_list'), path('tags/add/', views.TagEditView.as_view(), name='tag_add'), diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 97aed673a..a3dd7f193 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -395,6 +395,51 @@ class WebhookBulkDeleteView(generic.BulkDeleteView): table = tables.WebhookTable +# +# Event Rules +# + +class EventRuleListView(generic.ObjectListView): + queryset = EventRule.objects.all() + filterset = filtersets.EventRuleFilterSet + filterset_form = forms.EventRuleFilterForm + table = tables.EventRuleTable + + +@register_model_view(EventRule) +class EventRuleView(generic.ObjectView): + queryset = EventRule.objects.all() + + +@register_model_view(EventRule, 'edit') +class EventRuleEditView(generic.ObjectEditView): + queryset = EventRule.objects.all() + form = forms.EventRuleForm + + +@register_model_view(EventRule, 'delete') +class EventRuleDeleteView(generic.ObjectDeleteView): + queryset = EventRule.objects.all() + + +class EventRuleBulkImportView(generic.BulkImportView): + queryset = EventRule.objects.all() + model_form = forms.EventRuleImportForm + + +class EventRuleBulkEditView(generic.BulkEditView): + queryset = EventRule.objects.all() + filterset = filtersets.EventRuleFilterSet + table = tables.EventRuleTable + form = forms.EventRuleBulkEditForm + + +class EventRuleBulkDeleteView(generic.BulkDeleteView): + queryset = EventRule.objects.all() + filterset = filtersets.EventRuleFilterSet + table = tables.EventRuleTable + + # # Tags # diff --git a/netbox/extras/webhooks.py b/netbox/extras/webhooks.py index a22f73c27..a48a8038b 100644 --- a/netbox/extras/webhooks.py +++ b/netbox/extras/webhooks.py @@ -1,47 +1,6 @@ import hashlib import hmac -from django.contrib.contenttypes.models import ContentType -from django.utils import timezone -from django_rq import get_queue - -from netbox.config import get_config -from netbox.constants import RQ_QUEUE_DEFAULT -from netbox.registry import registry -from utilities.api import get_serializer_for_model -from utilities.rqworker import get_rq_retry -from utilities.utils import serialize_object -from .choices import * -from .models import Webhook - - -def serialize_for_webhook(instance): - """ - Return a serialized representation of the given instance suitable for use in a webhook. - """ - serializer_class = get_serializer_for_model(instance.__class__) - serializer_context = { - 'request': None, - } - serializer = serializer_class(instance, context=serializer_context) - - return serializer.data - - -def get_snapshots(instance, action): - snapshots = { - 'prechange': getattr(instance, '_prechange_snapshot', None), - 'postchange': None, - } - if action != ObjectChangeActionChoices.ACTION_DELETE: - # Use model's serialize_object() method if defined; fall back to serialize_object() utility function - if hasattr(instance, 'serialize_object'): - snapshots['postchange'] = instance.serialize_object() - else: - snapshots['postchange'] = serialize_object(instance) - - return snapshots - def generate_signature(request_body, secret): """ @@ -53,70 +12,3 @@ def generate_signature(request_body, secret): digestmod=hashlib.sha512 ) return hmac_prep.hexdigest() - - -def enqueue_object(queue, instance, user, request_id, action): - """ - Enqueue a serialized representation of a created/updated/deleted object for the processing of - webhooks once the request has completed. - """ - # Determine whether this type of object supports webhooks - app_label = instance._meta.app_label - model_name = instance._meta.model_name - if model_name not in registry['model_features']['webhooks'].get(app_label, []): - return - - queue.append({ - 'content_type': ContentType.objects.get_for_model(instance), - 'object_id': instance.pk, - 'event': action, - 'data': serialize_for_webhook(instance), - 'snapshots': get_snapshots(instance, action), - 'username': user.username, - 'request_id': request_id - }) - - -def flush_webhooks(queue): - """ - Flush a list of object representation to RQ for webhook processing. - """ - rq_queue_name = get_config().QUEUE_MAPPINGS.get('webhook', RQ_QUEUE_DEFAULT) - rq_queue = get_queue(rq_queue_name) - webhooks_cache = { - 'type_create': {}, - 'type_update': {}, - 'type_delete': {}, - } - - for data in queue: - - action_flag = { - ObjectChangeActionChoices.ACTION_CREATE: 'type_create', - ObjectChangeActionChoices.ACTION_UPDATE: 'type_update', - ObjectChangeActionChoices.ACTION_DELETE: 'type_delete', - }[data['event']] - content_type = data['content_type'] - - # Cache applicable Webhooks - if content_type not in webhooks_cache[action_flag]: - webhooks_cache[action_flag][content_type] = Webhook.objects.filter( - **{action_flag: True}, - content_types=content_type, - enabled=True - ) - webhooks = webhooks_cache[action_flag][content_type] - - for webhook in webhooks: - rq_queue.enqueue( - "extras.webhooks_worker.process_webhook", - webhook=webhook, - model_name=content_type.model, - event=data['event'], - data=data['data'], - snapshots=data['snapshots'], - timestamp=timezone.now().isoformat(), - username=data['username'], - request_id=data['request_id'], - retry=get_rq_retry() - ) diff --git a/netbox/extras/webhooks_worker.py b/netbox/extras/webhooks_worker.py index 438231b7e..4d6d8135e 100644 --- a/netbox/extras/webhooks_worker.py +++ b/netbox/extras/webhooks_worker.py @@ -5,36 +5,18 @@ from django.conf import settings from django_rq import job from jinja2.exceptions import TemplateError -from .conditions import ConditionSet from .constants import WEBHOOK_EVENT_TYPES from .webhooks import generate_signature logger = logging.getLogger('netbox.webhooks_worker') -def eval_conditions(webhook, data): - """ - Test whether the given data meets the conditions of the webhook (if any). Return True - if met or no conditions are specified. - """ - if not webhook.conditions: - return True - - logger.debug(f'Evaluating webhook conditions: {webhook.conditions}') - if ConditionSet(webhook.conditions).eval(data): - return True - - return False - - @job('default') -def process_webhook(webhook, model_name, event, data, timestamp, username, request_id=None, snapshots=None): +def process_webhook(event_rule, model_name, event, data, timestamp, username, request_id=None, snapshots=None): """ Make a POST request to the defined Webhook """ - # Evaluate webhook conditions (if any) - if not eval_conditions(webhook, data): - return + webhook = event_rule.action_object # Prepare context data for headers & body templates context = { diff --git a/netbox/netbox/context.py b/netbox/netbox/context.py index 5461a4e94..56e41cb63 100644 --- a/netbox/netbox/context.py +++ b/netbox/netbox/context.py @@ -2,9 +2,9 @@ from contextvars import ContextVar __all__ = ( 'current_request', - 'webhooks_queue', + 'events_queue', ) current_request = ContextVar('current_request', default=None) -webhooks_queue = ContextVar('webhooks_queue', default=[]) +events_queue = ContextVar('events_queue', default=[]) diff --git a/netbox/netbox/middleware.py b/netbox/netbox/middleware.py index 18f350fd7..cb7d2c8ba 100644 --- a/netbox/netbox/middleware.py +++ b/netbox/netbox/middleware.py @@ -10,7 +10,7 @@ from django.db import connection, ProgrammingError from django.db.utils import InternalError from django.http import Http404, HttpResponseRedirect -from extras.context_managers import change_logging +from extras.context_managers import event_tracking from netbox.config import clear_config, get_config from netbox.views import handler_500 from utilities.api import is_api_request, rest_api_server_error @@ -42,8 +42,8 @@ class CoreMiddleware: login_url = f'{settings.LOGIN_URL}?next={parse.quote(request.get_full_path_info())}' return HttpResponseRedirect(login_url) - # Enable the change_logging context manager and process the request. - with change_logging(request): + # Enable the event_tracking context manager and process the request. + with event_tracking(request): response = self.get_response(request) # Attach the unique request ID as an HTTP header. diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py index 9d7696696..2c262b258 100644 --- a/netbox/netbox/models/__init__.py +++ b/netbox/netbox/models/__init__.py @@ -30,7 +30,7 @@ class NetBoxFeatureSet( ExportTemplatesMixin, JournalingMixin, TagsMixin, - WebhooksMixin + EventRulesMixin ): class Meta: abstract = True @@ -44,7 +44,7 @@ class NetBoxFeatureSet( # Base model classes # -class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, WebhooksMixin, models.Model): +class ChangeLoggedModel(ChangeLoggingMixin, CustomValidationMixin, EventRulesMixin, models.Model): """ Base model for ancillary models; provides limited functionality for models which don't support NetBox's full feature set. diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index f39f35620..ac9893e20 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -35,7 +35,7 @@ __all__ = ( 'JournalingMixin', 'SyncedDataMixin', 'TagsMixin', - 'WebhooksMixin', + 'EventRulesMixin', ) @@ -400,9 +400,9 @@ class TagsMixin(models.Model): abstract = True -class WebhooksMixin(models.Model): +class EventRulesMixin(models.Model): """ - Enables support for webhooks. + Enables support for event rules, which can be used to transmit webhooks or execute scripts automatically. """ class Meta: abstract = True @@ -555,7 +555,7 @@ FEATURES_MAP = { 'journaling': JournalingMixin, 'synced_data': SyncedDataMixin, 'tags': TagsMixin, - 'webhooks': WebhooksMixin, + 'event_rules': EventRulesMixin, } registry['model_features'].update({ diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 49aee3540..e01e65cc8 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -343,6 +343,7 @@ OPERATIONS_MENU = Menu( label=_('Integrations'), items=( get_model_item('core', 'datasource', _('Data Sources')), + get_model_item('extras', 'eventrule', _('Event Rules')), get_model_item('extras', 'webhook', _('Webhooks')), ), ), diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 4a97711ff..1181229f2 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -115,6 +115,9 @@ DEFAULT_PERMISSIONS = getattr(configuration, 'DEFAULT_PERMISSIONS', { DEVELOPER = getattr(configuration, 'DEVELOPER', False) DOCS_ROOT = getattr(configuration, 'DOCS_ROOT', os.path.join(os.path.dirname(BASE_DIR), 'docs')) EMAIL = getattr(configuration, 'EMAIL', {}) +EVENTS_PIPELINE = getattr(configuration, 'EVENTS_PIPELINE', ( + 'extras.events.process_event_queue', +)) EXEMPT_VIEW_PERMISSIONS = getattr(configuration, 'EXEMPT_VIEW_PERMISSIONS', []) FIELD_CHOICES = getattr(configuration, 'FIELD_CHOICES', {}) FILE_UPLOAD_MAX_MEMORY_SIZE = getattr(configuration, 'FILE_UPLOAD_MAX_MEMORY_SIZE', 2621440) @@ -672,7 +675,7 @@ GRAPHENE = { # -# Django RQ (Webhooks backend) +# Django RQ (events backend) # if TASKS_REDIS_USING_SENTINEL: diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 72d327453..4764642b3 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -17,7 +17,7 @@ from django.utils.safestring import mark_safe from django_tables2.export import TableExport from extras.models import ExportTemplate -from extras.signals import clear_webhooks +from extras.signals import clear_events from utilities.error_handlers import handle_protectederror from utilities.exceptions import AbortRequest, AbortTransaction, PermissionsViolation from utilities.forms import BulkRenameForm, ConfirmationForm, restrict_form_fields @@ -279,7 +279,7 @@ class BulkCreateView(GetReturnURLMixin, BaseMultiObjectView): except (AbortRequest, PermissionsViolation) as e: logger.debug(e.message) form.add_error(None, e.message) - clear_webhooks.send(sender=self) + clear_events.send(sender=self) else: logger.debug("Form validation failed") @@ -474,12 +474,12 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): return redirect(results_url) except (AbortTransaction, ValidationError): - clear_webhooks.send(sender=self) + clear_events.send(sender=self) except (AbortRequest, PermissionsViolation) as e: logger.debug(e.message) form.add_error(None, e.message) - clear_webhooks.send(sender=self) + clear_events.send(sender=self) else: logger.debug("Form validation failed") @@ -632,12 +632,12 @@ class BulkEditView(GetReturnURLMixin, BaseMultiObjectView): except ValidationError as e: messages.error(self.request, ", ".join(e.messages)) - clear_webhooks.send(sender=self) + clear_events.send(sender=self) except (AbortRequest, PermissionsViolation) as e: logger.debug(e.message) form.add_error(None, e.message) - clear_webhooks.send(sender=self) + clear_events.send(sender=self) else: logger.debug("Form validation failed") @@ -733,7 +733,7 @@ class BulkRenameView(GetReturnURLMixin, BaseMultiObjectView): except (AbortRequest, PermissionsViolation) as e: logger.debug(e.message) form.add_error(None, e.message) - clear_webhooks.send(sender=self) + clear_events.send(sender=self) else: form = self.form(initial={'pk': request.POST.getlist('pk')}) @@ -927,12 +927,12 @@ class BulkComponentCreateView(GetReturnURLMixin, BaseMultiObjectView): raise PermissionsViolation except IntegrityError: - clear_webhooks.send(sender=self) + clear_events.send(sender=self) except (AbortRequest, PermissionsViolation) as e: logger.debug(e.message) form.add_error(None, e.message) - clear_webhooks.send(sender=self) + clear_events.send(sender=self) if not form.errors: msg = "Added {} {} to {} {}.".format( diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 99508c9e3..456c2e14f 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -11,7 +11,7 @@ from django.urls import reverse from django.utils.html import escape from django.utils.safestring import mark_safe -from extras.signals import clear_webhooks +from extras.signals import clear_events from utilities.error_handlers import handle_protectederror from utilities.exceptions import AbortRequest, PermissionsViolation from utilities.forms import ConfirmationForm, restrict_form_fields @@ -300,7 +300,7 @@ class ObjectEditView(GetReturnURLMixin, BaseObjectView): except (AbortRequest, PermissionsViolation) as e: logger.debug(e.message) form.add_error(None, e.message) - clear_webhooks.send(sender=self) + clear_events.send(sender=self) else: logger.debug("Form validation failed") @@ -528,7 +528,7 @@ class ComponentCreateView(GetReturnURLMixin, BaseObjectView): except (AbortRequest, PermissionsViolation) as e: logger.debug(e.message) form.add_error(None, e.message) - clear_webhooks.send(sender=self) + clear_events.send(sender=self) return render(request, self.template_name, { 'object': instance, diff --git a/netbox/templates/extras/eventrule.html b/netbox/templates/extras/eventrule.html new file mode 100644 index 000000000..86c330121 --- /dev/null +++ b/netbox/templates/extras/eventrule.html @@ -0,0 +1,98 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load i18n %} + +{% block content %} +
    +
    +
    +
    + {% trans "Event Rule" %} +
    +
    +
    {% trans "Region" %} + {% nested_tree object.site.region %} +
    {% trans "Site" %} - {% if object.site %} - {% if object.site.region %} - {{ object.site.region|linkify }} / - {% endif %} - {{ object.site|linkify }} - {% else %} - {{ ''|placeholder }} - {% endif %} - {{ object.site|linkify|placeholder }}
    {% trans "Group" %}
    + + + + + + + + + + + + +
    {% trans "Name" %}{{ object.name }}
    {% trans "Enabled" %}{% checkmark object.enabled %}
    {% trans "Description" %}{{ object.description|placeholder }}
    +
    +
    +
    +
    + {% trans "Events" %} +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    {% trans "Create" %}{% checkmark object.type_create %}
    {% trans "Update" %}{% checkmark object.type_update %}
    {% trans "Delete" %}{% checkmark object.type_delete %}
    {% trans "Job start" %}{% checkmark object.type_job_start %}
    {% trans "Job end" %}{% checkmark object.type_job_end %}
    +
    +
    + {% plugin_left_page object %} +
    +
    +
    +
    + {% trans "Object Types" %} +
    +
    + + {% for ct in object.content_types.all %} + + + + {% endfor %} +
    {{ ct }}
    +
    +
    +
    +
    + {% trans "Conditions" %} +
    +
    + {% if object.conditions %} +
    {{ object.conditions|json }}
    + {% else %} +

    {% trans "None" %}

    + {% endif %} +
    +
    + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/tags.html' %} + {% plugin_right_page object %} +
    + +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} diff --git a/netbox/templates/extras/webhook.html b/netbox/templates/extras/webhook.html index 5137b0103..c4b41faa1 100644 --- a/netbox/templates/extras/webhook.html +++ b/netbox/templates/extras/webhook.html @@ -16,39 +16,6 @@ {% trans "Name" %} {{ object.name }} - - {% trans "Enabled" %} - {% checkmark object.enabled %} - - - - -
    -
    - {% trans "Events" %} -
    -
    - - - - - - - - - - - - - - - - - - - - -
    {% trans "Create" %}{% checkmark object.type_create %}
    {% trans "Update" %}{% checkmark object.type_update %}
    {% trans "Delete" %}{% checkmark object.type_delete %}
    {% trans "Job start" %}{% checkmark object.type_job_start %}
    {% trans "Job end" %}{% checkmark object.type_job_end %}
    @@ -97,32 +64,6 @@ {% plugin_left_page object %}
    -
    -
    - {% trans "Assigned Models" %} -
    -
    - - {% for ct in object.content_types.all %} - - - - {% endfor %} -
    {{ ct }}
    -
    -
    -
    -
    - {% trans "Conditions" %} -
    -
    - {% if object.conditions %} -
    {{ object.conditions|json }}
    - {% else %} -

    {% trans "None" %}

    - {% endif %} -
    -
    {% trans "Additional Headers" %} diff --git a/netbox/utilities/forms/fields/fields.py b/netbox/utilities/forms/fields/fields.py index db5e4a30d..d4d4ae19b 100644 --- a/netbox/utilities/forms/fields/fields.py +++ b/netbox/utilities/forms/fields/fields.py @@ -103,7 +103,7 @@ class JSONField(_JSONField): def prepare_value(self, value): if isinstance(value, InvalidJSONInput): return value - if value is None: + if value in ('', None): return '' return json.dumps(value, sort_keys=True, indent=4) diff --git a/netbox/utilities/forms/utils.py b/netbox/utilities/forms/utils.py index 64864a6c1..de8e22727 100644 --- a/netbox/utilities/forms/utils.py +++ b/netbox/utilities/forms/utils.py @@ -128,10 +128,9 @@ def get_field_value(form, field_name): """ field = form.fields[field_name] - if form.is_bound: - if data := form.data.get(field_name): - if field.valid_value(data): - return data + if form.is_bound and (data := form.data.get(field_name)): + if hasattr(field, 'valid_value') and field.valid_value(data): + return data return form.get_initial_for_field(field, field_name) From b812a50ca2f01b64a8ee2a47aaec249615330b42 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 30 Nov 2023 17:02:45 -0500 Subject: [PATCH 126/271] Closes #14361: Add a description field to Webhook (#14380) --- netbox/extras/api/serializers.py | 6 +++--- netbox/extras/filtersets.py | 1 + netbox/extras/forms/bulk_edit.py | 7 ++++++- netbox/extras/forms/bulk_import.py | 2 +- netbox/extras/forms/model_forms.py | 2 +- netbox/extras/migrations/0101_eventrule.py | 5 +++++ netbox/extras/models/models.py | 5 +++++ netbox/extras/search.py | 9 +++++++++ netbox/extras/tables/tables.py | 4 ++-- netbox/extras/tests/test_api.py | 1 + netbox/extras/tests/test_views.py | 20 +++++++++++--------- netbox/templates/extras/webhook.html | 4 ++++ 12 files changed, 49 insertions(+), 17 deletions(-) diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 82b3e1933..ffd0df9ab 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -107,9 +107,9 @@ class WebhookSerializer(NetBoxModelSerializer): class Meta: model = Webhook fields = [ - 'id', 'url', 'display', 'name', 'payload_url', 'http_method', 'http_content_type', 'additional_headers', - 'body_template', 'secret', 'ssl_verification', 'ca_file_path', 'custom_fields', 'tags', 'created', - 'last_updated', + 'id', 'url', 'display', 'name', 'description', 'payload_url', 'http_method', 'http_content_type', + 'additional_headers', 'body_template', 'secret', 'ssl_verification', 'ca_file_path', 'custom_fields', + 'tags', 'created', 'last_updated', ] diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index e3eeda20d..5d36a34c7 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -58,6 +58,7 @@ class WebhookFilterSet(NetBoxModelFilterSet): return queryset return queryset.filter( Q(name__icontains=value) | + Q(description__icontains=value) | Q(payload_url__icontains=value) ) diff --git a/netbox/extras/forms/bulk_edit.py b/netbox/extras/forms/bulk_edit.py index dade76bad..9479fef99 100644 --- a/netbox/extras/forms/bulk_edit.py +++ b/netbox/extras/forms/bulk_edit.py @@ -178,6 +178,11 @@ class WebhookBulkEditForm(NetBoxModelBulkEditForm): queryset=Webhook.objects.all(), widget=forms.MultipleHiddenInput ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) http_method = forms.ChoiceField( choices=add_blank_choice(WebhookHttpMethodChoices), required=False, @@ -242,7 +247,7 @@ class EventRuleBulkEditForm(NetBoxModelBulkEditForm): widget=BulkEditNullBooleanSelect() ) - nullable_fields = ('conditions',) + nullable_fields = ('description', 'conditions',) class TagBulkEditForm(BulkEditForm): diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index 82930e8ad..e08a6528d 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -150,7 +150,7 @@ class WebhookImportForm(NetBoxModelImportForm): model = Webhook fields = ( 'name', 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', - 'secret', 'ssl_verification', 'ca_file_path', 'tags' + 'secret', 'ssl_verification', 'ca_file_path', 'description', 'tags' ) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 0c717246f..9403165e9 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -215,7 +215,7 @@ class BookmarkForm(BootstrapMixin, forms.ModelForm): class WebhookForm(NetBoxModelForm): fieldsets = ( - (_('Webhook'), ('name', 'tags',)), + (_('Webhook'), ('name', 'description', 'tags',)), (_('HTTP Request'), ( 'payload_url', 'http_method', 'http_content_type', 'additional_headers', 'body_template', 'secret', )), diff --git a/netbox/extras/migrations/0101_eventrule.py b/netbox/extras/migrations/0101_eventrule.py index 64e03dda0..92ae0e52b 100644 --- a/netbox/extras/migrations/0101_eventrule.py +++ b/netbox/extras/migrations/0101_eventrule.py @@ -124,4 +124,9 @@ class Migration(migrations.Migration): name='tags', field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'), ), + migrations.AddField( + model_name='webhook', + name='description', + field=models.CharField(blank=True, max_length=200), + ), ] diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index e5f71dba3..f996b50b5 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -182,6 +182,11 @@ class Webhook(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedMo max_length=150, unique=True ) + description = models.CharField( + verbose_name=_('description'), + max_length=200, + blank=True + ) payload_url = models.CharField( max_length=500, verbose_name=_('URL'), diff --git a/netbox/extras/search.py b/netbox/extras/search.py index da4aa1c84..3394f37e8 100644 --- a/netbox/extras/search.py +++ b/netbox/extras/search.py @@ -9,3 +9,12 @@ class JournalEntryIndex(SearchIndex): ('comments', 5000), ) category = 'Journal' + + +@register_search +class WebhookEntryIndex(SearchIndex): + model = models.Webhook + fields = ( + ('name', 100), + ('description', 500), + ) diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index ece23093b..e02365531 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -262,10 +262,10 @@ class WebhookTable(NetBoxTable): model = Webhook fields = ( 'pk', 'id', 'name', 'http_method', 'payload_url', 'http_content_type', 'secret', 'ssl_verification', - 'ca_file_path', 'tags', 'created', 'last_updated', + 'ca_file_path', 'description', 'tags', 'created', 'last_updated', ) default_columns = ( - 'pk', 'name', 'http_method', 'payload_url', + 'pk', 'name', 'http_method', 'payload_url', 'description', ) diff --git a/netbox/extras/tests/test_api.py b/netbox/extras/tests/test_api.py index b35fb8d66..93be2d2c4 100644 --- a/netbox/extras/tests/test_api.py +++ b/netbox/extras/tests/test_api.py @@ -46,6 +46,7 @@ class WebhookTest(APIViewTestCases.APIViewTestCase): }, ] bulk_update_data = { + 'description': 'New description', 'ssl_verification': False, } diff --git a/netbox/extras/tests/test_views.py b/netbox/extras/tests/test_views.py index 602a9d4de..dcb351f75 100644 --- a/netbox/extras/tests/test_views.py +++ b/netbox/extras/tests/test_views.py @@ -347,20 +347,21 @@ class WebhookTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'payload_url': 'http://example.com/?x', 'http_method': 'GET', 'http_content_type': 'application/foo', + 'description': 'My webhook', } cls.csv_data = ( - "name,payload_url,http_method,http_content_type", - "Webhook 4,http://example.com/?4,GET,application/json", - "Webhook 5,http://example.com/?5,GET,application/json", - "Webhook 6,http://example.com/?6,GET,application/json", + "name,payload_url,http_method,http_content_type,description", + "Webhook 4,http://example.com/?4,GET,application/json,Foo", + "Webhook 5,http://example.com/?5,GET,application/json,Bar", + "Webhook 6,http://example.com/?6,GET,application/json,Baz", ) cls.csv_update_data = ( - "id,name", - f"{webhooks[0].pk},Webhook 7", - f"{webhooks[1].pk},Webhook 8", - f"{webhooks[2].pk},Webhook 9", + "id,name,description", + f"{webhooks[0].pk},Webhook 7,Foo", + f"{webhooks[1].pk},Webhook 8,Bar", + f"{webhooks[2].pk},Webhook 9,Baz", ) cls.bulk_edit_data = { @@ -403,7 +404,8 @@ class EventRulesTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'action_type': 'webhook', 'action_object_type': webhook_ct.pk, 'action_object_id': webhooks[0].pk, - 'action_choice': webhooks[0] + 'action_choice': webhooks[0], + 'description': 'New description', } cls.csv_data = ( diff --git a/netbox/templates/extras/webhook.html b/netbox/templates/extras/webhook.html index c4b41faa1..0f390d3e4 100644 --- a/netbox/templates/extras/webhook.html +++ b/netbox/templates/extras/webhook.html @@ -16,6 +16,10 @@ {% trans "Name" %} {{ object.name }} + + {% trans "Description" %} + {{ object.description|placeholder }} +
    From 4fc0a999ea8eb4c638b9c3bced40ea2ef67caf0d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 30 Nov 2023 19:36:41 -0500 Subject: [PATCH 127/271] Closes #14365: Introduce job_start and job_end signals (#14393) * Introduce job_start and job_end signals, and receivers to process event rules * Complete signals documentation --- docs/development/signals.md | 24 ++++++++++++++++++++++++ netbox/core/models/jobs.py | 25 +++++-------------------- netbox/core/signals.py | 6 ++++++ netbox/extras/signals.py | 26 ++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 20 deletions(-) diff --git a/docs/development/signals.md b/docs/development/signals.md index 8a5d8e43f..8783b74a3 100644 --- a/docs/development/signals.md +++ b/docs/development/signals.md @@ -9,3 +9,27 @@ This signal is sent by models which inherit from `CustomValidationMixin` at the ### Receivers * `extras.signals.run_custom_validators()` + +## core.job_start + +This signal is sent whenever a [background job](../features/background-jobs.md) is started. + +### Receivers + +* `extras.signals.process_job_start_event_rules()` + +## core.job_end + +This signal is sent whenever a [background job](../features/background-jobs.md) is terminated. + +### Receivers + +* `extras.signals.process_job_end_event_rules()` + +## core.pre_sync + +This signal is sent when the [DataSource](../models/core/datasource.md) model's `sync()` method is called. + +## core.post_sync + +This signal is sent when a [DataSource](../models/core/datasource.md) finishes synchronizing. diff --git a/netbox/core/models/jobs.py b/netbox/core/models/jobs.py index af8191df5..e91be980c 100644 --- a/netbox/core/models/jobs.py +++ b/netbox/core/models/jobs.py @@ -12,6 +12,7 @@ from django.utils.translation import gettext as _ from core.choices import JobStatusChoices from core.models import ContentType +from core.signals import job_end, job_start from extras.constants import EVENT_JOB_END, EVENT_JOB_START from netbox.config import get_config from netbox.constants import RQ_QUEUE_DEFAULT @@ -168,8 +169,8 @@ class Job(models.Model): self.status = JobStatusChoices.STATUS_RUNNING self.save() - # Handle events - self.process_event(event=EVENT_JOB_START) + # Send signal + job_start.send(self) def terminate(self, status=JobStatusChoices.STATUS_COMPLETED, error=None): """ @@ -186,8 +187,8 @@ class Job(models.Model): self.completed = timezone.now() self.save() - # Handle events - self.process_event(event=EVENT_JOB_END) + # Send signal + job_end.send(self) @classmethod def enqueue(cls, func, instance, name='', user=None, schedule_at=None, interval=None, **kwargs): @@ -223,19 +224,3 @@ class Job(models.Model): queue.enqueue(func, job_id=str(job.job_id), job=job, **kwargs) return job - - def process_event(self, event): - """ - Process any EventRules relevant to the passed job event (i.e. start or stop). - """ - from extras.models import EventRule - from extras.events import process_event_rules - - # Fetch any event rules matching this object type and action - event_rules = EventRule.objects.filter( - **{f'type_{event}': True}, - content_types=self.object_type, - enabled=True - ) - - process_event_rules(event_rules, self.object_type.model, event, self.data, self.user.username) diff --git a/netbox/core/signals.py b/netbox/core/signals.py index cd1633a1a..f884a27b4 100644 --- a/netbox/core/signals.py +++ b/netbox/core/signals.py @@ -4,10 +4,16 @@ from django.dispatch import Signal, receiver from .models import ConfigRevision __all__ = ( + 'job_end', + 'job_start', 'post_sync', 'pre_sync', ) +# Job signals +job_start = Signal() +job_end = Signal() + # DataSource signals pre_sync = Signal() post_sync = Signal() diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index 184ee6d9b..42204f86e 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -8,6 +8,10 @@ from django.dispatch import receiver, Signal from django.utils.translation import gettext_lazy as _ from django_prometheus.models import model_deletes, model_inserts, model_updates +from core.signals import job_end, job_start +from extras.constants import EVENT_JOB_END, EVENT_JOB_START +from extras.events import process_event_rules +from extras.models import EventRule from extras.validators import CustomValidator from netbox.config import get_config from netbox.context import current_request, events_queue @@ -235,3 +239,25 @@ def validate_assigned_tags(sender, instance, action, model, pk_set, **kwargs): for tag in model.objects.filter(pk__in=pk_set, object_types__isnull=False).prefetch_related('object_types'): if ct not in tag.object_types.all(): raise AbortRequest(f"Tag {tag} cannot be assigned to {ct.model} objects.") + + +# +# Event rules +# + +@receiver(job_start) +def process_job_start_event_rules(sender, **kwargs): + """ + Process event rules for jobs starting. + """ + event_rules = EventRule.objects.filter(type_job_start=True, enabled=True, content_types=sender.object_type) + process_event_rules(event_rules, sender.object_type.model, EVENT_JOB_START, sender.data, sender.user.username) + + +@receiver(job_end) +def process_job_end_event_rules(sender, **kwargs): + """ + Process event rules for jobs terminating. + """ + event_rules = EventRule.objects.filter(type_job_end=True, enabled=True, content_types=sender.object_type) + process_event_rules(event_rules, sender.object_type.model, EVENT_JOB_END, sender.data, sender.user.username) From 85ab7adca6b1f20027b14777cbddf63435dee174 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 07:47:19 -0500 Subject: [PATCH 128/271] Closes #14395: Move & rename process_webhook() --- netbox/extras/events.py | 2 +- netbox/extras/tests/test_event_rules.py | 7 +- netbox/extras/webhooks.py | 86 +++++++++++++++++++++++ netbox/extras/webhooks_worker.py | 91 ++----------------------- 4 files changed, 97 insertions(+), 89 deletions(-) diff --git a/netbox/extras/events.py b/netbox/extras/events.py index 05352b7d1..1d7a7ed64 100644 --- a/netbox/extras/events.py +++ b/netbox/extras/events.py @@ -108,7 +108,7 @@ def process_event_rules(event_rules, model_name, event, data, username, snapshot # Enqueue the task rq_queue.enqueue( - "extras.webhooks_worker.process_webhook", + "extras.webhooks.send_webhook", **params ) diff --git a/netbox/extras/tests/test_event_rules.py b/netbox/extras/tests/test_event_rules.py index ed64ba891..549c33478 100644 --- a/netbox/extras/tests/test_event_rules.py +++ b/netbox/extras/tests/test_event_rules.py @@ -11,8 +11,7 @@ from django.urls import reverse from extras.choices import EventRuleActionChoices, ObjectChangeActionChoices from extras.events import enqueue_object, flush_events, serialize_for_event from extras.models import EventRule, Tag, Webhook -from extras.webhooks import generate_signature -from extras.webhooks_worker import process_webhook +from extras.webhooks import generate_signature, send_webhook from requests import Session from rest_framework import status from utilities.testing import APITestCase @@ -331,7 +330,7 @@ class EventRuleTest(APITestCase): self.assertEqual(job.kwargs['snapshots']['prechange']['name'], sites[i].name) self.assertEqual(job.kwargs['snapshots']['prechange']['tags'], ['Bar', 'Foo']) - def test_webhooks_worker(self): + def test_send_webhook(self): request_id = uuid.uuid4() def dummy_send(_, request, **kwargs): @@ -376,4 +375,4 @@ class EventRuleTest(APITestCase): # Patch the Session object with our dummy_send() method, then process the webhook for sending with patch.object(Session, 'send', dummy_send) as mock_send: - process_webhook(**job.kwargs) + send_webhook(**job.kwargs) diff --git a/netbox/extras/webhooks.py b/netbox/extras/webhooks.py index a48a8038b..53ec161d7 100644 --- a/netbox/extras/webhooks.py +++ b/netbox/extras/webhooks.py @@ -1,5 +1,15 @@ import hashlib import hmac +import logging + +import requests +from django.conf import settings +from django_rq import job +from jinja2.exceptions import TemplateError + +from .constants import WEBHOOK_EVENT_TYPES + +logger = logging.getLogger('netbox.webhooks') def generate_signature(request_body, secret): @@ -12,3 +22,79 @@ def generate_signature(request_body, secret): digestmod=hashlib.sha512 ) return hmac_prep.hexdigest() + + +@job('default') +def send_webhook(event_rule, model_name, event, data, timestamp, username, request_id=None, snapshots=None): + """ + Make a POST request to the defined Webhook + """ + webhook = event_rule.action_object + + # Prepare context data for headers & body templates + context = { + 'event': WEBHOOK_EVENT_TYPES[event], + 'timestamp': timestamp, + 'model': model_name, + 'username': username, + 'request_id': request_id, + 'data': data, + } + if snapshots: + context.update({ + 'snapshots': snapshots + }) + + # Build the headers for the HTTP request + headers = { + 'Content-Type': webhook.http_content_type, + } + try: + headers.update(webhook.render_headers(context)) + except (TemplateError, ValueError) as e: + logger.error(f"Error parsing HTTP headers for webhook {webhook}: {e}") + raise e + + # Render the request body + try: + body = webhook.render_body(context) + except TemplateError as e: + logger.error(f"Error rendering request body for webhook {webhook}: {e}") + raise e + + # Prepare the HTTP request + params = { + 'method': webhook.http_method, + 'url': webhook.render_payload_url(context), + 'headers': headers, + 'data': body.encode('utf8'), + } + logger.info( + f"Sending {params['method']} request to {params['url']} ({context['model']} {context['event']})" + ) + logger.debug(params) + try: + prepared_request = requests.Request(**params).prepare() + except requests.exceptions.RequestException as e: + logger.error(f"Error forming HTTP request: {e}") + raise e + + # If a secret key is defined, sign the request with a hash of the key and its content + if webhook.secret != '': + prepared_request.headers['X-Hook-Signature'] = generate_signature(prepared_request.body, webhook.secret) + + # Send the request + with requests.Session() as session: + session.verify = webhook.ssl_verification + if webhook.ca_file_path: + session.verify = webhook.ca_file_path + response = session.send(prepared_request, proxies=settings.HTTP_PROXIES) + + if 200 <= response.status_code <= 299: + logger.info(f"Request succeeded; response status {response.status_code}") + return f"Status {response.status_code} returned, webhook successfully processed." + else: + logger.warning(f"Request failed; response status {response.status_code}: {response.content}") + raise requests.exceptions.RequestException( + f"Status {response.status_code} returned with content '{response.content}', webhook FAILED to process." + ) diff --git a/netbox/extras/webhooks_worker.py b/netbox/extras/webhooks_worker.py index 4d6d8135e..77535fafa 100644 --- a/netbox/extras/webhooks_worker.py +++ b/netbox/extras/webhooks_worker.py @@ -1,87 +1,10 @@ -import logging +import warnings -import requests -from django.conf import settings -from django_rq import job -from jinja2.exceptions import TemplateError - -from .constants import WEBHOOK_EVENT_TYPES -from .webhooks import generate_signature - -logger = logging.getLogger('netbox.webhooks_worker') +from .webhooks import send_webhook as process_webhook -@job('default') -def process_webhook(event_rule, model_name, event, data, timestamp, username, request_id=None, snapshots=None): - """ - Make a POST request to the defined Webhook - """ - webhook = event_rule.action_object - - # Prepare context data for headers & body templates - context = { - 'event': WEBHOOK_EVENT_TYPES[event], - 'timestamp': timestamp, - 'model': model_name, - 'username': username, - 'request_id': request_id, - 'data': data, - } - if snapshots: - context.update({ - 'snapshots': snapshots - }) - - # Build the headers for the HTTP request - headers = { - 'Content-Type': webhook.http_content_type, - } - try: - headers.update(webhook.render_headers(context)) - except (TemplateError, ValueError) as e: - logger.error(f"Error parsing HTTP headers for webhook {webhook}: {e}") - raise e - - # Render the request body - try: - body = webhook.render_body(context) - except TemplateError as e: - logger.error(f"Error rendering request body for webhook {webhook}: {e}") - raise e - - # Prepare the HTTP request - params = { - 'method': webhook.http_method, - 'url': webhook.render_payload_url(context), - 'headers': headers, - 'data': body.encode('utf8'), - } - logger.info( - f"Sending {params['method']} request to {params['url']} ({context['model']} {context['event']})" - ) - logger.debug(params) - try: - prepared_request = requests.Request(**params).prepare() - except requests.exceptions.RequestException as e: - logger.error(f"Error forming HTTP request: {e}") - raise e - - # If a secret key is defined, sign the request with a hash of the key and its content - if webhook.secret != '': - prepared_request.headers['X-Hook-Signature'] = generate_signature(prepared_request.body, webhook.secret) - - # Send the request - with requests.Session() as session: - session.verify = webhook.ssl_verification - if webhook.ca_file_path: - session.verify = webhook.ca_file_path - response = session.send(prepared_request, proxies=settings.HTTP_PROXIES) - - if 200 <= response.status_code <= 299: - logger.info(f"Request succeeded; response status {response.status_code}") - return f"Status {response.status_code} returned, webhook successfully processed." - else: - logger.warning(f"Request failed; response status {response.status_code}: {response.content}") - raise requests.exceptions.RequestException( - f"Status {response.status_code} returned with content '{response.content}', webhook FAILED to process." - ) +# TODO: Remove in v4.0 +warnings.warn( + f"webhooks_worker.process_webhook has been moved to webhooks.send_webhook.", + DeprecationWarning +) From dea5f94d97c593de75bfbb0536be5c4d1b4aa73a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 08:37:20 -0500 Subject: [PATCH 129/271] Finish draft release notes --- docs/release-notes/index.md | 11 +++++++++++ docs/release-notes/version-3.7.md | 22 ++++++++++++++++++---- mkdocs.yml | 2 ++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index 4e8149ad6..983570652 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -10,6 +10,17 @@ Minor releases are published in April, August, and December of each calendar yea This page contains a history of all major and minor releases since NetBox v2.0. For more detail on a specific patch release, please see the release notes page for that specific minor release. +#### [Version 3.7](./version-3.6.md) (December 2023) + +* VPN Tunnels ([#9816](https://github.com/netbox-community/netbox/issues/9816)) +* Event Rules ([#14132](https://github.com/netbox-community/netbox/issues/14132)) +* Virtual Machine Disks ([#8356](https://github.com/netbox-community/netbox/issues/8356)) +* Object Protection Rules ([#10244](https://github.com/netbox-community/netbox/issues/10244)) +* Improved Custom Field Visibility Controls ([#13299](https://github.com/netbox-community/netbox/issues/13299)) +* Improved Global Search Results ([#14134](https://github.com/netbox-community/netbox/issues/14134)) +* Table Column Registration for Plugins ([#14173](https://github.com/netbox-community/netbox/issues/14173)) +* Data Backend Registration for Plugins ([#13381](https://github.com/netbox-community/netbox/issues/13381)) + #### [Version 3.6](./version-3.6.md) (August 2023) * Relocated Admin UI Views ([#12589](https://github.com/netbox-community/netbox/issues/12589), [#12590](https://github.com/netbox-community/netbox/issues/12590), [#12591](https://github.com/netbox-community/netbox/issues/12591), [#13044](https://github.com/netbox-community/netbox/issues/13044)) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 292ed4eb0..d7a013985 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -2,11 +2,12 @@ ### Breaking Changes +* The following fields have been removed from the Webhook model: `content_types`, `type_create`, `type_update`, `type_delete`, `type_job_start`, `type_job_end`, `enabled`, and `conditions`. Webhooks are now tied to events via [event rules](../features/event-rules.md). Existing webhooks will have event rules created automatically upon upgrade. * The `ui_visibility` field on the [custom field model](../models/extras/customfield.md) has been replaced with two new fields: `ui_visible` and `ui_editable`. Existing values will be migrated automatically upon upgrade. * The `FeatureQuery` class for querying content types by model feature has been removed. Plugins should now use the new `with_feature()` manager method on NetBox's proxy model for ContentType. * The ConfigRevision model has been moved from `extras` to `core`. Configuration history will be retained throughout the upgrade process. -* The L2VPN and L2VPNTermination models have been moved from the `ipam` app to the new `vpn` app. All object data will be retained however please note that the relevant API endpoints have been moved to `/api/vpn/`. -* The `CustomFieldsMixin`, `SavedFiltersMixin`, and `TagsMixin` classes have moved from the `extras.forms.mixins` to `netbox.forms.mixins`. +* The L2VPN and L2VPNTermination models have been moved from the `ipam` app to the new `vpn` app. All object data will be retained, however please note that the relevant API endpoints have moved to `/api/vpn/`. +* The `CustomFieldsMixin`, `SavedFiltersMixin`, and `TagsMixin` classes have moved from the `extras.forms.mixins` module to `netbox.forms.mixins`. ### New Features @@ -14,11 +15,17 @@ Several new models have been introduced to enable [VPN tunnel management](../features/vpn-tunnels.md). Users can now define tunnels with two or more terminations to replicate peer-to-peer or hub-and-spoke topologies. Each termination is made to a virtual interface on a device or VM. Additionally, users can define IKE and IPSec policies which can be applied to tunnels to document encryption and authentication strategies. +#### Event Rules ([#14132](https://github.com/netbox-community/netbox/issues/14132)) + +This release introduces [event rules](../features/event-rules.md), which can be used to send webhooks or execute custom scripts automatically in response to NetBox events. For example, it's now possible to run a custom script whenever a new site is created with a particular status or tag. + +Event rules replace and extend functionality that was previously built into the webhook model. Event rules will be created for any existing webhooks upon upgrade. + #### Virtual Machine Disks ([#8356](https://github.com/netbox-community/netbox/issues/8356)) A new [VirtualDisk](../models/virtualization/virtualdisk.md) model has been introduced to enable tracking the assignment of discrete virtual disks to virtual machines. The original `size` field has been retained on the VirtualMachine model, and will be automatically updated with the aggregate size of all assigned virtual disks. (Users who opt to eschew the new model may continue using the VirtualMachine `size` attribute as before.) -#### Protection Rules ([#10244](https://github.com/netbox-community/netbox/issues/10244)) +#### Object Protection Rules ([#10244](https://github.com/netbox-community/netbox/issues/10244)) A new [`PROTECTION_RULES`](../configuration/data-validation.md#protection_rules) configuration parameter is now available. Similar to how [custom validation rules](../customization/custom-validation.md) can be used to enforce certain values for object attributes, protection rules guard against the deletion of objects which do not meet specified criteria. This enables an administrator to prevent, for example, the deletion of a site which has a status of "active." @@ -26,7 +33,7 @@ A new [`PROTECTION_RULES`](../configuration/data-validation.md#protection_rules) The old `ui_visible` field on the custom field model](../models/extras/customfield.md) has been replaced by two new fields, `ui_visible` and `ui_editable`, which control how and whether a custom field is displayed when view and editing an object, respectively. Separating these two functions into discrete fields enables more control over how each custom field is presented to users. The values of these fields will be appropriately set automatically during the upgrade process depending on the value of the original field. -#### Extend Display of Global Search Results ([#14134](https://github.com/netbox-community/netbox/issues/14134)) +#### Improved Global Search Results ([#14134](https://github.com/netbox-community/netbox/issues/14134)) Global search results now include additional context about each object, such as a description, status, and/or related objects. The set of attributes to be displayed is specific to each object type, and is defined by setting `display_attrs` under the object's [SearchIndex class](../plugins/development/search.md#netbox.search.SearchIndex). @@ -50,6 +57,8 @@ Plugins can now [register their own data backends](../plugins/development/data-b * [#13808](https://github.com/netbox-community/netbox/issues/13808) - Added a `/render-config` REST API endpoint for virtual machines * [#14035](https://github.com/netbox-community/netbox/issues/14035) - Order objects of equivalent weight by value in global search results to improve readability * [#14156](https://github.com/netbox-community/netbox/issues/14156) - Enable custom fields for contact assignments +* [#14361](https://github.com/netbox-community/netbox/issues/14361) - Add a `description` field for webhooks +* [#14365](https://github.com/netbox-community/netbox/issues/14365) - Introduced `job_start` and `job_end` signals ### Other Changes @@ -60,10 +69,12 @@ Plugins can now [register their own data backends](../plugins/development/data-b * [#14311](https://github.com/netbox-community/netbox/issues/14311) - Move the L2VPN models from the `ipam` app to the new `vpn` app * [#14312](https://github.com/netbox-community/netbox/issues/14312) - Move the ConfigRevision model from the `extras` app to `core` * [#14326](https://github.com/netbox-community/netbox/issues/14326) - Form feature mixin classes have been moved from the `extras` app to `netbox` +* [#14395](https://github.com/netbox-community/netbox/issues/14395) - Moved `extras.webhooks_worker.process_webhook()` to `extras.webhooks.send_webhook()` (backward compatibility has been retained) ### REST API Changes * Introduced the following endpoints: + * `/api/extras/event-rules/` * `/api/virtualization/virtual-disks/` * `/api/vpn/ike-policies/` * `/api/vpn/ike-proposals/` @@ -79,6 +90,9 @@ Plugins can now [register their own data backends](../plugins/development/data-b * Added the optional `color` choice field * core.Job * Added the read-only `error` character field +* extras.Webhook + * Removed the following fields: `content_types`, `type_create`, `type_update`, `type_delete`, `type_job_start`, `type_job_end`, `enabled`, and `conditions` (these have been moved to the new `EventRule` model) + * Add the optional `description` field * dcim.DeviceType * Added the `exclude_from_utilization` boolean field * extras.CustomField diff --git a/mkdocs.yml b/mkdocs.yml index 8cbfd397b..cf8fbfd51 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -254,6 +254,7 @@ nav: - ClusterGroup: 'models/virtualization/clustergroup.md' - ClusterType: 'models/virtualization/clustertype.md' - VMInterface: 'models/virtualization/vminterface.md' + - VirtualDisk: 'models/virtualization/virtualdisk.md' - VirtualMachine: 'models/virtualization/virtualmachine.md' - VPN: - IKEPolicy: 'models/vpn/ikepolicy.md' @@ -288,6 +289,7 @@ nav: - git Cheat Sheet: 'development/git-cheat-sheet.md' - Release Notes: - Summary: 'release-notes/index.md' + - Version 3.7: 'release-notes/version-3.7.md' - Version 3.6: 'release-notes/version-3.6.md' - Version 3.5: 'release-notes/version-3.5.md' - Version 3.4: 'release-notes/version-3.4.md' From 2ed261e9c23e1f0a18038ef7ba2ee5877a11b3c7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 08:47:31 -0500 Subject: [PATCH 130/271] Update developer model docs --- docs/development/models.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/development/models.md b/docs/development/models.md index f04610ad5..f55c39cf8 100644 --- a/docs/development/models.md +++ b/docs/development/models.md @@ -52,7 +52,6 @@ These are considered the "core" application models which are used to model netwo * [ipam.FHRPGroup](../models/ipam/fhrpgroup.md) * [ipam.IPAddress](../models/ipam/ipaddress.md) * [ipam.IPRange](../models/ipam/iprange.md) -* [ipam.L2VPN](../models/ipam/l2vpn.md) * [ipam.Prefix](../models/ipam/prefix.md) * [ipam.RouteTarget](../models/ipam/routetarget.md) * [ipam.Service](../models/ipam/service.md) @@ -63,6 +62,9 @@ These are considered the "core" application models which are used to model netwo * [tenancy.Tenant](../models/tenancy/tenant.md) * [virtualization.Cluster](../models/virtualization/cluster.md) * [virtualization.VirtualMachine](../models/virtualization/virtualmachine.md) +* [vpn.IPSecProfile](../models/vpn/ipsecprofile.md) +* [vpn.L2VPN](../models/vpn/l2vpn.md) +* [vpn.Tunnel](../models/vpn/tunnel.md) * [wireless.WirelessLAN](../models/wireless/wirelesslan.md) * [wireless.WirelessLink](../models/wireless/wirelesslink.md) @@ -75,6 +77,7 @@ Organization models are used to organize and classify primary models. * [dcim.Manufacturer](../models/dcim/manufacturer.md) * [dcim.Platform](../models/dcim/platform.md) * [dcim.RackRole](../models/dcim/rackrole.md) +* [ipam.ASNRange](../models/ipam/asnrange.md) * [ipam.RIR](../models/ipam/rir.md) * [ipam.Role](../models/ipam/role.md) * [ipam.VLANGroup](../models/ipam/vlangroup.md) @@ -107,6 +110,7 @@ Component models represent individual physical or virtual components belonging t * [dcim.PowerOutlet](../models/dcim/poweroutlet.md) * [dcim.PowerPort](../models/dcim/powerport.md) * [dcim.RearPort](../models/dcim/rearport.md) +* [virtualization.VirtualDisk](../models/virtualization/virtualdisk.md) * [virtualization.VMInterface](../models/virtualization/vminterface.md) ### Component Template Models From e4824db40b0ac17ebfe0a811b22b921b31b36d9d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 09:24:23 -0500 Subject: [PATCH 131/271] Improve rendering of JSON data --- netbox/templates/core/configrevision.html | 24 ++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/netbox/templates/core/configrevision.html b/netbox/templates/core/configrevision.html index 6481127fa..7e7f49f2f 100644 --- a/netbox/templates/core/configrevision.html +++ b/netbox/templates/core/configrevision.html @@ -149,11 +149,23 @@ - + {% if object.data.CUSTOM_VALIDATORS %} + + {% else %} + + {% endif %} - + {% if object.data.PROTECTION_RULES %} + + {% else %} + + {% endif %}
    {% trans "Custom validators" %}{{ object.data.CUSTOM_VALIDATORS|placeholder }} +
    {{ object.data.CUSTOM_VALIDATORS|json }}
    +
    {{ ''|placeholder }}
    {% trans "Protection rules" %}{{ object.data.PROTECTION_RULES|placeholder }} +
    {{ object.data.PROTECTION_RULES|json }}
    +
    {{ ''|placeholder }}
    @@ -165,7 +177,13 @@ - + {% if object.data.DEFAULT_USER_PREFERENCES %} + + {% else %} + + {% endif %}
    {% trans "Default user preferences" %}{{ object.data.DEFAULT_USER_PREFERENCES|placeholder }} +
    {{ object.data.DEFAULT_USER_PREFERENCES|json }}
    +
    {{ ''|placeholder }}
    From 7cec4e9e2218e0e8bf03ef6c184c8696f5421c0d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 09:51:54 -0500 Subject: [PATCH 132/271] #12135: Elegantly handle ProtectedError/RestrictedError exceptions --- netbox/netbox/views/generic/object_views.py | 22 ++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 456c2e14f..c775f12a0 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -6,6 +6,7 @@ from django.contrib import messages from django.db import router, transaction from django.db.models import ProtectedError, RestrictedError from django.db.models.deletion import Collector +from django.http import HttpResponse from django.shortcuts import redirect, render from django.urls import reverse from django.utils.html import escape @@ -343,6 +344,19 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): return dict(dependent_objects) + def _handle_protected_objects(self, obj, protected_objects, request, exc): + """ + Handle a ProtectedError or RestrictedError exception raised while attempt to resolve dependent objects. + """ + handle_protectederror(protected_objects, request, exc) + + if is_htmx(request): + return HttpResponse(headers={ + 'HX-Redirect': obj.get_absolute_url(), + }) + else: + return redirect(obj.get_absolute_url()) + # # Request handlers # @@ -356,7 +370,13 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): """ obj = self.get_object(**kwargs) form = ConfirmationForm(initial=request.GET) - dependent_objects = self._get_dependent_objects(obj) + + try: + dependent_objects = self._get_dependent_objects(obj) + except ProtectedError as e: + return self._handle_protected_objects(obj, e.protected_objects, request, e) + except RestrictedError as e: + return self._handle_protected_objects(obj, e.restricted_objects, request, e) # If this is an HTMX request, return only the rendered deletion form as modal content if is_htmx(request): From dcd3f098ce251aef9c75ac1ba41a98178521f24d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 10:10:44 -0500 Subject: [PATCH 133/271] #13230: Tweak field description --- netbox/dcim/models/devices.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 07c1c70f6..8ed8336cd 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -109,12 +109,12 @@ class DeviceType(ImageAttachmentsMixin, PrimaryModel, WeightMixin): exclude_from_utilization = models.BooleanField( default=False, verbose_name=_('exclude from utilization'), - help_text=_('Exclude from rack utilization calculations.') + help_text=_('Devices of this type are excluded when calculating rack utilization.') ) is_full_depth = models.BooleanField( default=True, verbose_name=_('is full depth'), - help_text=_('Device consumes both front and rear rack faces') + help_text=_('Device consumes both front and rear rack faces.') ) subdevice_role = models.CharField( max_length=50, From 7a63e11a700c9479cbd386b061991622ceb3cd72 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 10:23:38 -0500 Subject: [PATCH 134/271] #13299: Fix display of empty string values --- netbox/netbox/models/features.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index ac9893e20..8b0b477dc 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -236,7 +236,7 @@ class CustomFieldsMixin(models.Model): for cf in visible_custom_fields: value = self.custom_field_data.get(cf.name) - if value in (None, []) and cf.ui_visible == CustomFieldUIVisibleChoices.IF_SET: + if value in (None, '', []) and cf.ui_visible == CustomFieldUIVisibleChoices.IF_SET: continue value = cf.deserialize(value) groups[cf.group_name][cf] = value From 0340a5e8d62efe77b1593c1e5100962953f5b1c6 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 10:24:12 -0500 Subject: [PATCH 135/271] #13299: Clean up custom field form field help text --- netbox/extras/models/customfields.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index 08190d20f..189e3460b 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -519,8 +519,6 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): # Annotate read-only fields if enforce_visibility and self.ui_editable != CustomFieldUIEditableChoices.YES: field.disabled = True - prepend = '
    ' if field.help_text else '' - field.help_text += f'{prepend} ' + _('Field is not editable.') return field From 0c9919a5e801922f967ab49ca482ec122896f41a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 10:54:46 -0500 Subject: [PATCH 136/271] #13334: Capture exception class when recording job error --- netbox/core/jobs.py | 2 +- netbox/extras/management/commands/runscript.py | 2 +- netbox/extras/reports.py | 4 ++-- netbox/extras/scripts.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/netbox/core/jobs.py b/netbox/core/jobs.py index 32b546b20..264313e62 100644 --- a/netbox/core/jobs.py +++ b/netbox/core/jobs.py @@ -25,7 +25,7 @@ def sync_datasource(job, *args, **kwargs): job.terminate() except Exception as e: - job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=str(e)) + job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e)) DataSource.objects.filter(pk=datasource.pk).update(status=DataSourceStatusChoices.FAILED) if type(e) in (SyncError, JobTimeoutException): logging.error(e) diff --git a/netbox/extras/management/commands/runscript.py b/netbox/extras/management/commands/runscript.py index 97ee39f50..a5da7b3b2 100644 --- a/netbox/extras/management/commands/runscript.py +++ b/netbox/extras/management/commands/runscript.py @@ -59,7 +59,7 @@ class Command(BaseCommand): logger.error(f"Exception raised during script execution: {e}") clear_events.send(request) job.data = ScriptOutputSerializer(script).data - job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=str(e)) + job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e)) logger.info(f"Script completed in {job.duration}") diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index c8a13fe15..90641cc84 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -41,7 +41,7 @@ def run_report(job, *args, **kwargs): try: report.run(job) except Exception as e: - job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=str(e)) + job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e)) logging.error(f"Error during execution of report {job.name}") finally: # Schedule the next job if an interval has been set @@ -230,7 +230,7 @@ class Report(object): stacktrace = traceback.format_exc() self.log_failure(None, f"An exception occurred: {type(e).__name__}: {e}
    {stacktrace}
    ") logger.error(f"Exception raised during report execution: {e}") - job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=str(e)) + job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e)) # Perform any post-run tasks self.post_run() diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py index 495957fd9..f28465547 100644 --- a/netbox/extras/scripts.py +++ b/netbox/extras/scripts.py @@ -527,7 +527,7 @@ def run_script(data, job, request=None, commit=True, **kwargs): logger.error(f"Exception raised during script execution: {e}") script.log_info("Database changes have been reverted due to error.") job.data = ScriptOutputSerializer(script).data - job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=str(e)) + job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=repr(e)) if request: clear_events.send(request) From e893ffcee429f51b07977236713c7c4bde81aef4 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 11:08:09 -0500 Subject: [PATCH 137/271] #13550: Clean up bulk view docstrings --- netbox/netbox/views/generic/bulk_views.py | 5 ++--- netbox/netbox/views/generic/object_views.py | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 4764642b3..0ecb4e189 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -48,9 +48,8 @@ class ObjectListView(BaseMultiObjectView, ActionsMixin, TableMixin): Attributes: filterset: A django-filter FilterSet that is applied to the queryset filterset_form: The form class used to render filter options - actions: Supported actions for the model. When adding custom actions, bulk action names must - be prefixed with `bulk_`. Default actions: add, import, export, bulk_edit, bulk_delete - action_perms: A dictionary mapping supported actions to a set of permissions required for each + actions: A mapping of supported actions to their required permissions. When adding custom actions, bulk + action names must be prefixed with `bulk_`. (See ActionsMixin.) """ template_name = 'generic/object_list.html' filterset = None diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index c775f12a0..90b6e9495 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -86,9 +86,8 @@ class ObjectChildrenView(ObjectView, ActionsMixin, TableMixin): child_model: The model class which represents the child objects table: The django-tables2 Table class used to render the child objects list filterset: A django-filter FilterSet that is applied to the queryset - actions: Supported actions for the model. When adding custom actions, bulk action names must - be prefixed with `bulk_`. Default actions: add, import, export, bulk_edit, bulk_delete - action_perms: A dictionary mapping supported actions to a set of permissions required for each + actions: A mapping of supported actions to their required permissions. When adding custom actions, bulk + action names must be prefixed with `bulk_`. (See ActionsMixin.) """ child_model = None table = None From bf182158a78160f32d49b06ee492a0788099fe14 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 11:23:38 -0500 Subject: [PATCH 138/271] #13794: Fix alphabetical ordering of related models --- netbox/utilities/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index d7232d41b..2d11810fc 100644 --- a/netbox/utilities/utils.py +++ b/netbox/utilities/utils.py @@ -581,6 +581,6 @@ def get_related_models(model, ordered=True): ] if ordered: - return sorted(related_models, key=lambda x: x[0]._meta.verbose_name) + return sorted(related_models, key=lambda x: x[0]._meta.verbose_name.lower()) return related_models From 42ab8ee0a26b072e8920b1599be2998aa9831931 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 1 Dec 2023 11:50:48 -0500 Subject: [PATCH 139/271] #14153: Import proxy ContentType for nbshell --- netbox/core/management/commands/nbshell.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netbox/core/management/commands/nbshell.py b/netbox/core/management/commands/nbshell.py index fd86627d2..eeefe502b 100644 --- a/netbox/core/management/commands/nbshell.py +++ b/netbox/core/management/commands/nbshell.py @@ -6,9 +6,10 @@ from django import get_version from django.apps import apps from django.conf import settings from django.contrib.auth import get_user_model -from django.contrib.contenttypes.models import ContentType from django.core.management.base import BaseCommand +from core.models import ContentType + APPS = ('circuits', 'core', 'dcim', 'extras', 'ipam', 'tenancy', 'users', 'virtualization', 'vpn', 'wireless') BANNER_TEXT = """### NetBox interactive shell ({node}) From 3faf4857cb7e9f8797bd5b160b5604b0318c15d6 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 Dec 2023 08:54:10 -0500 Subject: [PATCH 140/271] #9816: Misc cleanup --- netbox/templates/vpn/ipsecprofile.html | 4 ---- netbox/vpn/forms/model_forms.py | 2 +- netbox/vpn/tables/tunnels.py | 14 ++++++++------ netbox/vpn/urls.py | 24 ++++++++++++------------ 4 files changed, 21 insertions(+), 23 deletions(-) diff --git a/netbox/templates/vpn/ipsecprofile.html b/netbox/templates/vpn/ipsecprofile.html index 08fa3074e..c1172870f 100644 --- a/netbox/templates/vpn/ipsecprofile.html +++ b/netbox/templates/vpn/ipsecprofile.html @@ -63,10 +63,6 @@ - - {% trans "Pre-Shared Key" %} - {% checkmark object.ike_policy.preshared_key %} - diff --git a/netbox/vpn/forms/model_forms.py b/netbox/vpn/forms/model_forms.py index e61993ddd..4c59fcadf 100644 --- a/netbox/vpn/forms/model_forms.py +++ b/netbox/vpn/forms/model_forms.py @@ -196,7 +196,7 @@ class TunnelCreateForm(TunnelForm): tunnel=instance, role=self.cleaned_data['termination2_role'], termination=self.cleaned_data['termination2_termination'], - outside_ip=self.cleaned_data.get('termination1_outside_ip'), + outside_ip=self.cleaned_data.get('termination2_outside_ip'), ) return instance diff --git a/netbox/vpn/tables/tunnels.py b/netbox/vpn/tables/tunnels.py index 4023607ff..9c4ba816d 100644 --- a/netbox/vpn/tables/tunnels.py +++ b/netbox/vpn/tables/tunnels.py @@ -54,18 +54,18 @@ class TunnelTerminationTable(TenancyColumnsMixin, NetBoxTable): role = columns.ChoiceFieldColumn( verbose_name=_('Role') ) - interface_parent = tables.Column( - accessor='interface__parent_object', + termination_parent = tables.Column( + accessor='termination__parent_object', linkify=True, orderable=False, verbose_name=_('Host') ) - interface = tables.Column( + termination = tables.Column( verbose_name=_('Interface'), linkify=True ) ip_addresses = tables.ManyToManyColumn( - accessor=tables.A('interface__ip_addresses'), + accessor=tables.A('termination__ip_addresses'), orderable=False, linkify_item=True, verbose_name=_('IP Addresses') @@ -81,7 +81,9 @@ class TunnelTerminationTable(TenancyColumnsMixin, NetBoxTable): class Meta(NetBoxTable.Meta): model = TunnelTermination fields = ( - 'pk', 'id', 'tunnel', 'role', 'interface_parent', 'interface', 'ip_addresses', 'outside_ip', 'tags', + 'pk', 'id', 'tunnel', 'role', 'termination_parent', 'termination', 'ip_addresses', 'outside_ip', 'tags', 'created', 'last_updated', ) - default_columns = ('pk', 'id', 'tunnel', 'role', 'interface_parent', 'interface', 'ip_addresses', 'outside_ip') + default_columns = ( + 'pk', 'id', 'tunnel', 'role', 'termination_parent', 'termination', 'ip_addresses', 'outside_ip', + ) diff --git a/netbox/vpn/urls.py b/netbox/vpn/urls.py index 0e1b1664e..2bf684313 100644 --- a/netbox/vpn/urls.py +++ b/netbox/vpn/urls.py @@ -31,12 +31,12 @@ urlpatterns = [ path('ike-proposals//', include(get_model_urls('vpn', 'ikeproposal'))), # IKE policies - path('ike-policys/', views.IKEPolicyListView.as_view(), name='ikepolicy_list'), - path('ike-policys/add/', views.IKEPolicyEditView.as_view(), name='ikepolicy_add'), - path('ike-policys/import/', views.IKEPolicyBulkImportView.as_view(), name='ikepolicy_import'), - path('ike-policys/edit/', views.IKEPolicyBulkEditView.as_view(), name='ikepolicy_bulk_edit'), - path('ike-policys/delete/', views.IKEPolicyBulkDeleteView.as_view(), name='ikepolicy_bulk_delete'), - path('ike-policys//', include(get_model_urls('vpn', 'ikepolicy'))), + path('ike-policies/', views.IKEPolicyListView.as_view(), name='ikepolicy_list'), + path('ike-policies/add/', views.IKEPolicyEditView.as_view(), name='ikepolicy_add'), + path('ike-policies/import/', views.IKEPolicyBulkImportView.as_view(), name='ikepolicy_import'), + path('ike-policies/edit/', views.IKEPolicyBulkEditView.as_view(), name='ikepolicy_bulk_edit'), + path('ike-policies/delete/', views.IKEPolicyBulkDeleteView.as_view(), name='ikepolicy_bulk_delete'), + path('ike-policies//', include(get_model_urls('vpn', 'ikepolicy'))), # IPSec proposals path('ipsec-proposals/', views.IPSecProposalListView.as_view(), name='ipsecproposal_list'), @@ -47,12 +47,12 @@ urlpatterns = [ path('ipsec-proposals//', include(get_model_urls('vpn', 'ipsecproposal'))), # IPSec policies - path('ipsec-policys/', views.IPSecPolicyListView.as_view(), name='ipsecpolicy_list'), - path('ipsec-policys/add/', views.IPSecPolicyEditView.as_view(), name='ipsecpolicy_add'), - path('ipsec-policys/import/', views.IPSecPolicyBulkImportView.as_view(), name='ipsecpolicy_import'), - path('ipsec-policys/edit/', views.IPSecPolicyBulkEditView.as_view(), name='ipsecpolicy_bulk_edit'), - path('ipsec-policys/delete/', views.IPSecPolicyBulkDeleteView.as_view(), name='ipsecpolicy_bulk_delete'), - path('ipsec-policys//', include(get_model_urls('vpn', 'ipsecpolicy'))), + path('ipsec-policies/', views.IPSecPolicyListView.as_view(), name='ipsecpolicy_list'), + path('ipsec-policies/add/', views.IPSecPolicyEditView.as_view(), name='ipsecpolicy_add'), + path('ipsec-policies/import/', views.IPSecPolicyBulkImportView.as_view(), name='ipsecpolicy_import'), + path('ipsec-policies/edit/', views.IPSecPolicyBulkEditView.as_view(), name='ipsecpolicy_bulk_edit'), + path('ipsec-policies/delete/', views.IPSecPolicyBulkDeleteView.as_view(), name='ipsecpolicy_bulk_delete'), + path('ipsec-policies//', include(get_model_urls('vpn', 'ipsecpolicy'))), # IPSec profiles path('ipsec-profiles/', views.IPSecProfileListView.as_view(), name='ipsecprofile_list'), From 5b0b366b828eaeb96a0646050bec1b059072a042 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 Dec 2023 09:19:56 -0500 Subject: [PATCH 141/271] #9816: Promote IKE & IPSec proposals and policies to primary models --- docs/development/models.md | 4 ++++ netbox/templates/vpn/ikepolicy.html | 1 + netbox/templates/vpn/ikeproposal.html | 1 + netbox/templates/vpn/ipsecpolicy.html | 1 + netbox/templates/vpn/ipsecproposal.html | 1 + netbox/vpn/api/serializers.py | 13 ++++++----- netbox/vpn/filtersets.py | 12 ++++++---- netbox/vpn/forms/bulk_import.py | 8 +++---- netbox/vpn/forms/model_forms.py | 8 +++---- netbox/vpn/migrations/0001_initial.py | 12 ++++++---- netbox/vpn/models/crypto.py | 30 +++++-------------------- netbox/vpn/search.py | 4 ++++ netbox/vpn/tables/crypto.py | 22 +++++++++++++----- 13 files changed, 65 insertions(+), 52 deletions(-) diff --git a/docs/development/models.md b/docs/development/models.md index f55c39cf8..19b7be6de 100644 --- a/docs/development/models.md +++ b/docs/development/models.md @@ -62,7 +62,11 @@ These are considered the "core" application models which are used to model netwo * [tenancy.Tenant](../models/tenancy/tenant.md) * [virtualization.Cluster](../models/virtualization/cluster.md) * [virtualization.VirtualMachine](../models/virtualization/virtualmachine.md) +* [vpn.IKEPolicy](../models/vpn/ikepolicy.md) +* [vpn.IKEProposal](../models/vpn/ikeproposal.md) +* [vpn.IPSecPolicy](../models/vpn/ipsecpolicy.md) * [vpn.IPSecProfile](../models/vpn/ipsecprofile.md) +* [vpn.IPSecProposal](../models/vpn/ipsecproposal.md) * [vpn.L2VPN](../models/vpn/l2vpn.md) * [vpn.Tunnel](../models/vpn/tunnel.md) * [wireless.WirelessLAN](../models/wireless/wirelesslan.md) diff --git a/netbox/templates/vpn/ikepolicy.html b/netbox/templates/vpn/ikepolicy.html index 559ba6d17..da116cfa2 100644 --- a/netbox/templates/vpn/ikepolicy.html +++ b/netbox/templates/vpn/ikepolicy.html @@ -48,6 +48,7 @@
    {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/comments.html' %} {% include 'inc/panels/tags.html' %} {% plugin_right_page object %}
    diff --git a/netbox/templates/vpn/ikeproposal.html b/netbox/templates/vpn/ikeproposal.html index 33cf60c81..c8b25f623 100644 --- a/netbox/templates/vpn/ikeproposal.html +++ b/netbox/templates/vpn/ikeproposal.html @@ -51,6 +51,7 @@
    {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/comments.html' %} {% include 'inc/panels/tags.html' %} {% plugin_right_page object %}
    diff --git a/netbox/templates/vpn/ipsecpolicy.html b/netbox/templates/vpn/ipsecpolicy.html index 4960d9dd3..3e75a7db7 100644 --- a/netbox/templates/vpn/ipsecpolicy.html +++ b/netbox/templates/vpn/ipsecpolicy.html @@ -35,6 +35,7 @@
    {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/comments.html' %} {% include 'inc/panels/tags.html' %} {% plugin_right_page object %}
    diff --git a/netbox/templates/vpn/ipsecproposal.html b/netbox/templates/vpn/ipsecproposal.html index 7425eef43..d97775bf8 100644 --- a/netbox/templates/vpn/ipsecproposal.html +++ b/netbox/templates/vpn/ipsecproposal.html @@ -47,6 +47,7 @@
    {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/comments.html' %} {% include 'inc/panels/tags.html' %} {% plugin_right_page object %}
    diff --git a/netbox/vpn/api/serializers.py b/netbox/vpn/api/serializers.py index cd464cf22..176deba04 100644 --- a/netbox/vpn/api/serializers.py +++ b/netbox/vpn/api/serializers.py @@ -107,7 +107,8 @@ class IKEProposalSerializer(NetBoxModelSerializer): model = IKEProposal fields = ( 'id', 'url', 'display', 'name', 'description', 'authentication_method', 'encryption_algorithm', - 'authentication_algorithm', 'group', 'sa_lifetime', 'tags', 'custom_fields', 'created', 'last_updated', + 'authentication_algorithm', 'group', 'sa_lifetime', 'comments', 'tags', 'custom_fields', 'created', + 'last_updated', ) @@ -131,8 +132,8 @@ class IKEPolicySerializer(NetBoxModelSerializer): class Meta: model = IKEPolicy fields = ( - 'id', 'url', 'display', 'name', 'description', 'version', 'mode', 'proposals', 'preshared_key', 'tags', - 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display', 'name', 'description', 'version', 'mode', 'proposals', 'preshared_key', 'comments', + 'tags', 'custom_fields', 'created', 'last_updated', ) @@ -151,7 +152,7 @@ class IPSecProposalSerializer(NetBoxModelSerializer): model = IPSecProposal fields = ( 'id', 'url', 'display', 'name', 'description', 'encryption_algorithm', 'authentication_algorithm', - 'sa_lifetime_seconds', 'sa_lifetime_data', 'tags', 'custom_fields', 'created', 'last_updated', + 'sa_lifetime_seconds', 'sa_lifetime_data', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ) @@ -173,8 +174,8 @@ class IPSecPolicySerializer(NetBoxModelSerializer): class Meta: model = IPSecPolicy fields = ( - 'id', 'url', 'display', 'name', 'description', 'proposals', 'pfs_group', 'tags', 'custom_fields', 'created', - 'last_updated', + 'id', 'url', 'display', 'name', 'description', 'proposals', 'pfs_group', 'comments', 'tags', + 'custom_fields', 'created', 'last_updated', ) diff --git a/netbox/vpn/filtersets.py b/netbox/vpn/filtersets.py index 249de9ca2..2efd0189c 100644 --- a/netbox/vpn/filtersets.py +++ b/netbox/vpn/filtersets.py @@ -128,7 +128,8 @@ class IKEProposalFilterSet(NetBoxModelFilterSet): return queryset return queryset.filter( Q(name__icontains=value) | - Q(description__icontains=value) + Q(description__icontains=value) | + Q(comments__icontains=value) ) @@ -155,7 +156,8 @@ class IKEPolicyFilterSet(NetBoxModelFilterSet): return queryset return queryset.filter( Q(name__icontains=value) | - Q(description__icontains=value) + Q(description__icontains=value) | + Q(comments__icontains=value) ) @@ -176,7 +178,8 @@ class IPSecProposalFilterSet(NetBoxModelFilterSet): return queryset return queryset.filter( Q(name__icontains=value) | - Q(description__icontains=value) + Q(description__icontains=value) | + Q(comments__icontains=value) ) @@ -200,7 +203,8 @@ class IPSecPolicyFilterSet(NetBoxModelFilterSet): return queryset return queryset.filter( Q(name__icontains=value) | - Q(description__icontains=value) + Q(description__icontains=value) | + Q(comments__icontains=value) ) diff --git a/netbox/vpn/forms/bulk_import.py b/netbox/vpn/forms/bulk_import.py index 33e93d28f..37da63da3 100644 --- a/netbox/vpn/forms/bulk_import.py +++ b/netbox/vpn/forms/bulk_import.py @@ -147,7 +147,7 @@ class IKEProposalImportForm(NetBoxModelImportForm): model = IKEProposal fields = ( 'name', 'description', 'authentication_method', 'encryption_algorithm', 'authentication_algorithm', - 'group', 'sa_lifetime', 'tags', + 'group', 'sa_lifetime', 'comments', 'tags', ) @@ -169,7 +169,7 @@ class IKEPolicyImportForm(NetBoxModelImportForm): class Meta: model = IKEPolicy fields = ( - 'name', 'description', 'version', 'mode', 'proposals', 'preshared_key', 'tags', + 'name', 'description', 'version', 'mode', 'proposals', 'preshared_key', 'comments', 'tags', ) @@ -187,7 +187,7 @@ class IPSecProposalImportForm(NetBoxModelImportForm): model = IPSecProposal fields = ( 'name', 'description', 'encryption_algorithm', 'authentication_algorithm', 'sa_lifetime_seconds', - 'sa_lifetime_data', 'tags', + 'sa_lifetime_data', 'comments', 'tags', ) @@ -205,7 +205,7 @@ class IPSecPolicyImportForm(NetBoxModelImportForm): class Meta: model = IPSecPolicy fields = ( - 'name', 'description', 'proposals', 'pfs_group', 'tags', + 'name', 'description', 'proposals', 'pfs_group', 'comments', 'tags', ) diff --git a/netbox/vpn/forms/model_forms.py b/netbox/vpn/forms/model_forms.py index 4c59fcadf..5c3db1c99 100644 --- a/netbox/vpn/forms/model_forms.py +++ b/netbox/vpn/forms/model_forms.py @@ -280,7 +280,7 @@ class IKEProposalForm(NetBoxModelForm): model = IKEProposal fields = [ 'name', 'description', 'authentication_method', 'encryption_algorithm', 'authentication_algorithm', 'group', - 'sa_lifetime', 'tags', + 'sa_lifetime', 'comments', 'tags', ] @@ -298,7 +298,7 @@ class IKEPolicyForm(NetBoxModelForm): class Meta: model = IKEPolicy fields = [ - 'name', 'description', 'version', 'mode', 'proposals', 'preshared_key', 'tags', + 'name', 'description', 'version', 'mode', 'proposals', 'preshared_key', 'comments', 'tags', ] @@ -315,7 +315,7 @@ class IPSecProposalForm(NetBoxModelForm): model = IPSecProposal fields = [ 'name', 'description', 'encryption_algorithm', 'authentication_algorithm', 'sa_lifetime_seconds', - 'sa_lifetime_data', 'tags', + 'sa_lifetime_data', 'comments', 'tags', ] @@ -333,7 +333,7 @@ class IPSecPolicyForm(NetBoxModelForm): class Meta: model = IPSecPolicy fields = [ - 'name', 'description', 'proposals', 'pfs_group', 'tags', + 'name', 'description', 'proposals', 'pfs_group', 'comments', 'tags', ] diff --git a/netbox/vpn/migrations/0001_initial.py b/netbox/vpn/migrations/0001_initial.py index f5d9ae0c1..17e000e53 100644 --- a/netbox/vpn/migrations/0001_initial.py +++ b/netbox/vpn/migrations/0001_initial.py @@ -23,8 +23,9 @@ class Migration(migrations.Migration): ('created', models.DateTimeField(auto_now_add=True, null=True)), ('last_updated', models.DateTimeField(auto_now=True, null=True)), ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), - ('name', models.CharField(max_length=100, unique=True)), ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), ('version', models.PositiveSmallIntegerField(default=2)), ('mode', models.CharField()), ('preshared_key', models.TextField(blank=True)), @@ -42,8 +43,9 @@ class Migration(migrations.Migration): ('created', models.DateTimeField(auto_now_add=True, null=True)), ('last_updated', models.DateTimeField(auto_now=True, null=True)), ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), - ('name', models.CharField(max_length=100, unique=True)), ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), ('pfs_group', models.PositiveSmallIntegerField(blank=True, null=True)), ], options={ @@ -123,8 +125,9 @@ class Migration(migrations.Migration): ('created', models.DateTimeField(auto_now_add=True, null=True)), ('last_updated', models.DateTimeField(auto_now=True, null=True)), ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), - ('name', models.CharField(max_length=100, unique=True)), ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), ('encryption_algorithm', models.CharField()), ('authentication_algorithm', models.CharField()), ('sa_lifetime_seconds', models.PositiveIntegerField(blank=True, null=True)), @@ -154,8 +157,9 @@ class Migration(migrations.Migration): ('created', models.DateTimeField(auto_now_add=True, null=True)), ('last_updated', models.DateTimeField(auto_now=True, null=True)), ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), - ('name', models.CharField(max_length=100, unique=True)), ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), ('authentication_method', models.CharField()), ('encryption_algorithm', models.CharField()), ('authentication_algorithm', models.CharField()), diff --git a/netbox/vpn/models/crypto.py b/netbox/vpn/models/crypto.py index 1954dc6a0..260f77940 100644 --- a/netbox/vpn/models/crypto.py +++ b/netbox/vpn/models/crypto.py @@ -2,7 +2,7 @@ from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from netbox.models import NetBoxModel, PrimaryModel +from netbox.models import PrimaryModel from vpn.choices import * __all__ = ( @@ -18,17 +18,12 @@ __all__ = ( # IKE # -class IKEProposal(NetBoxModel): +class IKEProposal(PrimaryModel): name = models.CharField( verbose_name=_('name'), max_length=100, unique=True ) - description = models.CharField( - verbose_name=_('description'), - max_length=200, - blank=True - ) authentication_method = models.CharField( verbose_name=('authentication method'), choices=AuthenticationMethodChoices @@ -69,17 +64,12 @@ class IKEProposal(NetBoxModel): return reverse('vpn:ikeproposal', args=[self.pk]) -class IKEPolicy(NetBoxModel): +class IKEPolicy(PrimaryModel): name = models.CharField( verbose_name=_('name'), max_length=100, unique=True ) - description = models.CharField( - verbose_name=_('description'), - max_length=200, - blank=True - ) version = models.PositiveSmallIntegerField( verbose_name=_('version'), choices=IKEVersionChoices, @@ -122,17 +112,12 @@ class IKEPolicy(NetBoxModel): # IPSec # -class IPSecProposal(NetBoxModel): +class IPSecProposal(PrimaryModel): name = models.CharField( verbose_name=_('name'), max_length=100, unique=True ) - description = models.CharField( - verbose_name=_('description'), - max_length=200, - blank=True - ) encryption_algorithm = models.CharField( verbose_name=_('encryption'), choices=EncryptionAlgorithmChoices @@ -170,17 +155,12 @@ class IPSecProposal(NetBoxModel): return reverse('vpn:ipsecproposal', args=[self.pk]) -class IPSecPolicy(NetBoxModel): +class IPSecPolicy(PrimaryModel): name = models.CharField( verbose_name=_('name'), max_length=100, unique=True ) - description = models.CharField( - verbose_name=_('description'), - max_length=200, - blank=True - ) proposals = models.ManyToManyField( to='vpn.IPSecProposal', related_name='ipsec_policies', diff --git a/netbox/vpn/search.py b/netbox/vpn/search.py index d0b2ad0c6..303653511 100644 --- a/netbox/vpn/search.py +++ b/netbox/vpn/search.py @@ -20,6 +20,7 @@ class IKEProposalIndex(SearchIndex): fields = ( ('name', 100), ('description', 500), + ('comments', 5000), ) display_attrs = ('description',) @@ -30,6 +31,7 @@ class IKEPolicyIndex(SearchIndex): fields = ( ('name', 100), ('description', 500), + ('comments', 5000), ) display_attrs = ('description',) @@ -40,6 +42,7 @@ class IPSecProposalIndex(SearchIndex): fields = ( ('name', 100), ('description', 500), + ('comments', 5000), ) display_attrs = ('description',) @@ -50,6 +53,7 @@ class IPSecPolicyIndex(SearchIndex): fields = ( ('name', 100), ('description', 500), + ('comments', 5000), ) display_attrs = ('description',) diff --git a/netbox/vpn/tables/crypto.py b/netbox/vpn/tables/crypto.py index cd6d3c24d..5e102db24 100644 --- a/netbox/vpn/tables/crypto.py +++ b/netbox/vpn/tables/crypto.py @@ -33,6 +33,9 @@ class IKEProposalTable(NetBoxTable): sa_lifetime = tables.Column( verbose_name=_('SA Lifetime') ) + comments = columns.MarkdownColumn( + verbose_name=_('Comments'), + ) tags = columns.TagColumn( url_name='vpn:ikeproposal_list' ) @@ -41,7 +44,7 @@ class IKEProposalTable(NetBoxTable): model = IKEProposal fields = ( 'pk', 'id', 'name', 'authentication_method', 'encryption_algorithm', 'authentication_algorithm', - 'group', 'sa_lifetime', 'description', 'tags', 'created', 'last_updated', + 'group', 'sa_lifetime', 'description', 'comments', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'authentication_method', 'encryption_algorithm', 'authentication_algorithm', 'group', @@ -67,6 +70,9 @@ class IKEPolicyTable(NetBoxTable): preshared_key = tables.Column( verbose_name=_('Pre-shared Key') ) + comments = columns.MarkdownColumn( + verbose_name=_('Comments'), + ) tags = columns.TagColumn( url_name='vpn:ikepolicy_list' ) @@ -74,8 +80,8 @@ class IKEPolicyTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = IKEPolicy fields = ( - 'pk', 'id', 'name', 'version', 'mode', 'proposals', 'preshared_key', 'description', 'tags', 'created', - 'last_updated', + 'pk', 'id', 'name', 'version', 'mode', 'proposals', 'preshared_key', 'description', 'comments', 'tags', + 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'version', 'mode', 'proposals', 'description', @@ -99,6 +105,9 @@ class IPSecProposalTable(NetBoxTable): sa_lifetime_data = tables.Column( verbose_name=_('SA Lifetime (KB)') ) + comments = columns.MarkdownColumn( + verbose_name=_('Comments'), + ) tags = columns.TagColumn( url_name='vpn:ipsecproposal_list' ) @@ -107,7 +116,7 @@ class IPSecProposalTable(NetBoxTable): model = IPSecProposal fields = ( 'pk', 'id', 'name', 'encryption_algorithm', 'authentication_algorithm', 'sa_lifetime_seconds', - 'sa_lifetime_data', 'description', 'tags', 'created', 'last_updated', + 'sa_lifetime_data', 'description', 'comments', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'encryption_algorithm', 'authentication_algorithm', 'sa_lifetime_seconds', @@ -127,6 +136,9 @@ class IPSecPolicyTable(NetBoxTable): pfs_group = tables.Column( verbose_name=_('PFS Group') ) + comments = columns.MarkdownColumn( + verbose_name=_('Comments'), + ) tags = columns.TagColumn( url_name='vpn:ipsecpolicy_list' ) @@ -134,7 +146,7 @@ class IPSecPolicyTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = IPSecPolicy fields = ( - 'pk', 'id', 'name', 'proposals', 'pfs_group', 'description', 'tags', 'created', 'last_updated', + 'pk', 'id', 'name', 'proposals', 'pfs_group', 'description', 'comments', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'name', 'proposals', 'pfs_group', 'description', From c0512e2c360fde7bfe855384f1f25052ce712089 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 Dec 2023 09:29:43 -0500 Subject: [PATCH 142/271] #14311: Update model documentation --- docs/models/ipam/l2vpntermination.md | 18 ------------------ docs/models/{ipam => vpn}/l2vpn.md | 4 ++-- docs/models/vpn/l2vpntermination.md | 18 ++++++++++++++++++ mkdocs.yml | 4 ++-- 4 files changed, 22 insertions(+), 22 deletions(-) delete mode 100644 docs/models/ipam/l2vpntermination.md rename docs/models/{ipam => vpn}/l2vpn.md (81%) create mode 100644 docs/models/vpn/l2vpntermination.md diff --git a/docs/models/ipam/l2vpntermination.md b/docs/models/ipam/l2vpntermination.md deleted file mode 100644 index c3c27b8d2..000000000 --- a/docs/models/ipam/l2vpntermination.md +++ /dev/null @@ -1,18 +0,0 @@ -# L2VPN Termination - -A L2VPN termination is the attachment of an [L2VPN](./l2vpn.md) to an [interface](../dcim/interface.md) or [VLAN](./vlan.md). Note that the L2VPNs of the following types may have only two terminations assigned to them: - -* VPWS -* EPL -* EP-LAN -* EP-TREE - -## Fields - -### L2VPN - -The [L2VPN](./l2vpn.md) instance. - -### VLAN or Interface - -The [VLAN](./vlan.md), [device interface](../dcim/interface.md), or [virtual machine interface](../virtualization/virtualmachine.md) attached to the L2VPN. diff --git a/docs/models/ipam/l2vpn.md b/docs/models/vpn/l2vpn.md similarity index 81% rename from docs/models/ipam/l2vpn.md rename to docs/models/vpn/l2vpn.md index e7ee1e187..79b7435bf 100644 --- a/docs/models/ipam/l2vpn.md +++ b/docs/models/vpn/l2vpn.md @@ -1,6 +1,6 @@ # L2VPN -A L2VPN object is NetBox is a representation of a layer 2 bridge technology such as VXLAN, VPLS, or EPL. Each L2VPN can be identified by name as well as by an optional unique identifier (VNI would be an example). Once created, L2VPNs can be terminated to [interfaces](../dcim/interface.md) and [VLANs](./vlan.md). +A L2VPN object is NetBox is a representation of a layer 2 bridge technology such as VXLAN, VPLS, or EPL. Each L2VPN can be identified by name as well as by an optional unique identifier (VNI would be an example). Once created, L2VPNs can be terminated to [interfaces](../dcim/interface.md) and [VLANs](../ipam/vlan.md). ## Fields @@ -38,4 +38,4 @@ An optional numeric identifier. This can be used to track a pseudowire ID, for e ### Import & Export Targets -The [route targets](./routetarget.md) associated with this L2VPN to control the import and export of forwarding information. +The [route targets](../ipam/routetarget.md) associated with this L2VPN to control the import and export of forwarding information. diff --git a/docs/models/vpn/l2vpntermination.md b/docs/models/vpn/l2vpntermination.md new file mode 100644 index 000000000..e20677d21 --- /dev/null +++ b/docs/models/vpn/l2vpntermination.md @@ -0,0 +1,18 @@ +# L2VPN Termination + +A L2VPN termination is the attachment of an [L2VPN](./l2vpn.md) to an [interface](../dcim/interface.md) or [VLAN](../ipam/vlan.md). Note that the L2VPNs of the following types may have only two terminations assigned to them: + +* VPWS +* EPL +* EP-LAN +* EP-TREE + +## Fields + +### L2VPN + +The [L2VPN](./l2vpn.md) instance. + +### VLAN or Interface + +The [VLAN](../ipam/vlan.md), [device interface](../dcim/interface.md), or [virtual machine interface](../virtualization/virtualmachine.md) attached to the L2VPN. diff --git a/mkdocs.yml b/mkdocs.yml index cf8fbfd51..eb66cc728 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -232,8 +232,6 @@ nav: - FHRPGroupAssignment: 'models/ipam/fhrpgroupassignment.md' - IPAddress: 'models/ipam/ipaddress.md' - IPRange: 'models/ipam/iprange.md' - - L2VPN: 'models/ipam/l2vpn.md' - - L2VPNTermination: 'models/ipam/l2vpntermination.md' - Prefix: 'models/ipam/prefix.md' - RIR: 'models/ipam/rir.md' - Role: 'models/ipam/role.md' @@ -262,6 +260,8 @@ nav: - IPSecPolicy: 'models/vpn/ipsecpolicy.md' - IPSecProfile: 'models/vpn/ipsecprofile.md' - IPSecProposal: 'models/vpn/ipsecproposal.md' + - L2VPN: 'models/vpn/l2vpn.md' + - L2VPNTermination: 'models/vpn/l2vpntermination.md' - Tunnel: 'models/vpn/tunnel.md' - TunnelTermination: 'models/vpn/tunneltermination.md' - Wireless: From 625825d482d57e74f503c7345d394a4e6175a9c7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 Dec 2023 10:03:47 -0500 Subject: [PATCH 143/271] Fixes #14402: Avoid nullifying disk value when editing a VM with disk(s) attached --- netbox/virtualization/models/virtualmachines.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index 1824aae99..233d51d63 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -200,7 +200,9 @@ class VirtualMachine(ContactsMixin, RenderConfigMixin, ConfigContextModel, Prima # Validate aggregate disk size if self.pk: total_disk = self.virtualdisks.aggregate(Sum('size', default=0))['size__sum'] - if total_disk and self.disk != total_disk: + if total_disk and self.disk is None: + self.disk = total_disk + elif total_disk and self.disk != total_disk: raise ValidationError({ 'disk': _( "The specified disk size ({size}) must match the aggregate size of assigned virtual disks " From cfc20f910ef69813971457911925d4089feaa507 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 Dec 2023 10:21:37 -0500 Subject: [PATCH 144/271] #14132: Fix migration --- netbox/extras/migrations/0101_eventrule.py | 50 +++++++++++++--------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/netbox/extras/migrations/0101_eventrule.py b/netbox/extras/migrations/0101_eventrule.py index 92ae0e52b..a3ce08591 100644 --- a/netbox/extras/migrations/0101_eventrule.py +++ b/netbox/extras/migrations/0101_eventrule.py @@ -11,9 +11,11 @@ def move_webhooks(apps, schema_editor): Webhook = apps.get_model("extras", "Webhook") EventRule = apps.get_model("extras", "EventRule") + webhook_ct = ContentType.objects.get_for_model(Webhook).pk for webhook in Webhook.objects.all(): event = EventRule() + # Replicate attributes from Webhook instance event.name = webhook.name event.type_create = webhook.type_create event.type_update = webhook.type_update @@ -24,7 +26,7 @@ def move_webhooks(apps, schema_editor): event.conditions = webhook.conditions event.action_type = EventRuleActionChoices.WEBHOOK - event.action_object_type_id = ContentType.objects.get_for_model(webhook).id + event.action_object_type_id = webhook_ct event.action_object_id = webhook.id event.save() event.content_types.add(*webhook.content_types.all()) @@ -37,6 +39,8 @@ class Migration(migrations.Migration): ] operations = [ + + # Create the EventRule model migrations.CreateModel( name='EventRule', fields=[ @@ -68,7 +72,30 @@ class Migration(migrations.Migration): 'ordering': ('name',), }, ), + migrations.AddField( + model_name='eventrule', + name='action_object_type', + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name='eventrule_actions', + to='contenttypes.contenttype', + ), + ), + migrations.AddField( + model_name='eventrule', + name='content_types', + field=models.ManyToManyField(related_name='eventrules', to='contenttypes.contenttype'), + ), + migrations.AddField( + model_name='eventrule', + name='tags', + field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'), + ), + + # Replicate Webhook data migrations.RunPython(move_webhooks), + + # Remove obsolete fields from Webhook migrations.RemoveConstraint( model_name='webhook', name='extras_webhook_unique_payload_url_types', @@ -105,25 +132,8 @@ class Migration(migrations.Migration): model_name='webhook', name='type_update', ), - migrations.AddField( - model_name='eventrule', - name='action_object_type', - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name='eventrule_actions', - to='contenttypes.contenttype', - ), - ), - migrations.AddField( - model_name='eventrule', - name='content_types', - field=models.ManyToManyField(related_name='eventrules', to='contenttypes.contenttype'), - ), - migrations.AddField( - model_name='eventrule', - name='tags', - field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'), - ), + + # Add description field to Webhook migrations.AddField( model_name='webhook', name='description', From 5d57e9863dcb524bc0fdaea0287d118c18325611 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 Dec 2023 10:57:29 -0500 Subject: [PATCH 145/271] #14132: Simplify form logic for script EventRules --- netbox/extras/api/serializers.py | 2 +- netbox/extras/events.py | 2 +- netbox/extras/forms/bulk_import.py | 8 ++++---- netbox/extras/forms/model_forms.py | 28 ++++++++++++++-------------- netbox/extras/models/models.py | 7 +++---- 5 files changed, 23 insertions(+), 24 deletions(-) diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index ffd0df9ab..60a30aed2 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -86,7 +86,7 @@ class EventRuleSerializer(NetBoxModelSerializer): context = {'request': self.context['request']} # We need to manually instantiate the serializer for scripts if instance.action_type == EventRuleActionChoices.SCRIPT: - module_id, script_name = instance.action_parameters['script_choice'].split(":", maxsplit=1) + script_name = instance.action_parameters['script_name'] script = instance.action_object.scripts[script_name]() return NestedScriptSerializer(script, context=context).data else: diff --git a/netbox/extras/events.py b/netbox/extras/events.py index 1d7a7ed64..6d0654929 100644 --- a/netbox/extras/events.py +++ b/netbox/extras/events.py @@ -116,7 +116,7 @@ def process_event_rules(event_rules, model_name, event, data, username, snapshot elif event_rule.action_type == EventRuleActionChoices.SCRIPT: # Resolve the script from action parameters script_module = event_rule.action_object - _, script_name = event_rule.action_parameters['script_choice'].split(":", maxsplit=1) + script_name = event_rule.action_parameters['script_name'] script = script_module.scripts[script_name]() # Enqueue a Job to record the script's execution diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index e08a6528d..243d8fa4c 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -179,12 +179,14 @@ class EventRuleImportForm(NetBoxModelImportForm): action_object = self.cleaned_data.get('action_object') action_type = self.cleaned_data.get('action_type') if action_object and action_type: + # Webhook if action_type == EventRuleActionChoices.WEBHOOK: try: webhook = Webhook.objects.get(name=action_object) - except Webhook.ObjectDoesNotExist: + except Webhook.DoesNotExist: raise forms.ValidationError(f"Webhook {action_object} not found") self.instance.action_object = webhook + # Script elif action_type == EventRuleActionChoices.SCRIPT: from extras.scripts import get_module_and_script module_name, script_name = action_object.split('.', 1) @@ -195,9 +197,7 @@ class EventRuleImportForm(NetBoxModelImportForm): self.instance.action_object = module self.instance.action_object_type = ContentType.objects.get_for_model(module, for_concrete_model=False) self.instance.action_parameters = { - 'script_choice': f"{str(module.pk)}:{script_name}", - 'script_name': script.name, - 'script_full_name': script.full_name, + 'script_name': script_name, } diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 9403165e9..8a5d319d3 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -288,16 +288,15 @@ class EventRuleForm(NetBoxModelForm): for script_name in module.scripts.keys(): name = f"{str(module.pk)}:{script_name}" scripts.append((name, script_name)) - if scripts: choices.append((str(module), scripts)) - self.fields['action_choice'].choices = choices - parameters = get_field_value(self, 'action_parameters') - initial = None - if parameters and 'script_choice' in parameters: - initial = parameters['script_choice'] - self.fields['action_choice'].initial = initial + + if self.instance.pk: + scriptmodule_id = self.instance.action_object_id + script_name = self.instance.action_parameters.get('script_name') + self.fields['action_choice'].initial = f'{scriptmodule_id}:{script_name}' + print(self.fields['action_choice'].initial) def init_webhook_choice(self): initial = None @@ -327,19 +326,20 @@ class EventRuleForm(NetBoxModelForm): super().clean() action_choice = self.cleaned_data.get('action_choice') + # Webhook if self.cleaned_data.get('action_type') == EventRuleActionChoices.WEBHOOK: self.cleaned_data['action_object_type'] = ContentType.objects.get_for_model(action_choice) self.cleaned_data['action_object_id'] = action_choice.id + # Script elif self.cleaned_data.get('action_type') == EventRuleActionChoices.SCRIPT: + self.cleaned_data['action_object_type'] = ContentType.objects.get_for_model( + ScriptModule, + for_concrete_model=False + ) module_id, script_name = action_choice.split(":", maxsplit=1) - script_module = ScriptModule.objects.get(pk=module_id) - self.cleaned_data['action_object_type'] = ContentType.objects.get_for_model(script_module, for_concrete_model=False) - self.cleaned_data['action_object_id'] = script_module.id - script = script_module.scripts[script_name]() + self.cleaned_data['action_object_id'] = module_id self.cleaned_data['action_parameters'] = { - 'script_choice': action_choice, - 'script_name': script.name, - 'script_full_name': script.full_name, + 'script_name': script_name, } return self.cleaned_data diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index f996b50b5..21319400c 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -115,16 +115,15 @@ class EventRule(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLogged ct_field='action_object_type', fk_field='action_object_id' ) - # internal (not show in UI) - used by scripts to store function name action_parameters = models.JSONField( blank=True, - null=True, + null=True ) action_data = models.JSONField( - verbose_name=_('parameters'), + verbose_name=_('data'), blank=True, null=True, - help_text=_("Parameters to pass to the action.") + help_text=_("Additional data to pass to the action object") ) comments = models.TextField( verbose_name=_('comments'), From deadde8700f270fa812993daedb904954a905b49 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 Dec 2023 11:12:20 -0500 Subject: [PATCH 146/271] #14132: Extend EventRule template --- netbox/templates/extras/eventrule.html | 63 ++++++++++++++++++++------ 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/netbox/templates/extras/eventrule.html b/netbox/templates/extras/eventrule.html index 86c330121..eff7e60e5 100644 --- a/netbox/templates/extras/eventrule.html +++ b/netbox/templates/extras/eventrule.html @@ -27,6 +27,20 @@ +
    +
    + {% trans "Object Types" %} +
    +
    + + {% for ct in object.content_types.all %} + + + + {% endfor %} +
    {{ ct }}
    +
    +
    {% trans "Events" %} @@ -59,20 +73,6 @@ {% plugin_left_page object %}
    -
    -
    - {% trans "Object Types" %} -
    -
    - - {% for ct in object.content_types.all %} - - - - {% endfor %} -
    {{ ct }}
    -
    -
    {% trans "Conditions" %} @@ -85,6 +85,41 @@ {% endif %}
    +
    +
    + {% trans "Action" %} +
    +
    + + + + + + + + + + + + + +
    {% trans "Type" %}{{ object.get_action_type_display }}
    {% trans "Object" %} + {% if object.action_type == 'script' %} + + {{ object.action_object }} / {{ object.action_parameters.script_name }} + + {% else %} + {{ object.action_object|linkify }} + {% endif %} +
    {% trans "Data" %} + {% if object.action_data %} +
    {{ object.action_data|json }}
    + {% else %} + {{ ''|placeholder }} + {% endif %} +
    +
    +
    {% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/tags.html' %} {% plugin_right_page object %} From 115111df9ed623b4f707a8bb67f4ad0c809169ff Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 Dec 2023 11:15:13 -0500 Subject: [PATCH 147/271] #14132: Fix documentation link --- docs/models/extras/eventrule.md | 2 +- mkdocs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/models/extras/eventrule.md b/docs/models/extras/eventrule.md index 89645be3c..c105a2630 100644 --- a/docs/models/extras/eventrule.md +++ b/docs/models/extras/eventrule.md @@ -2,7 +2,7 @@ An event rule is a mechanism for automatically taking an action (such as running a script or sending a webhook) in response to an event in NetBox. For example, you may want to notify a monitoring system whenever the status of a device is updated in NetBox. This can be done by creating an event for device objects and designating a webhook to be transmitted. When NetBox detects a change to a device, an HTTP request containing the details of the change and who made it be sent to the specified receiver. -See the [event rules documentation](../features/event-rules.md) for more information. +See the [event rules documentation](../../features/event-rules.md) for more information. ## Fields diff --git a/mkdocs.yml b/mkdocs.yml index eb66cc728..45f9fe7d1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -83,11 +83,11 @@ nav: - Synchronized Data: 'features/synchronized-data.md' - Change Logging: 'features/change-logging.md' - Journaling: 'features/journaling.md' + - Event Rules: 'features/event-rules.md' - Background Jobs: 'features/background-jobs.md' - Auth & Permissions: 'features/authentication-permissions.md' - API & Integration: 'features/api-integration.md' - Customization: 'features/customization.md' - - Event Rules: 'features/event-rules.md' - Installation & Upgrade: - Installing NetBox: 'installation/index.md' - 1. PostgreSQL: 'installation/1-postgresql.md' From 2b7cc1e6faaa5c0595582899c7c1d781a5f7f4cc Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 Dec 2023 13:39:04 -0500 Subject: [PATCH 148/271] Upgrade Markdown to v3.5.1 --- base_requirements.txt | 5 ++--- netbox/utilities/templatetags/builtins/filters.py | 8 +++++++- requirements.txt | 2 +- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/base_requirements.txt b/base_requirements.txt index b659c9e8d..3f661b6da 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -90,9 +90,8 @@ gunicorn Jinja2 # Simple markup language for rendering HTML -# https://python-markdown.github.io/change_log/ -# mkdocs currently requires Markdown v3.3 -Markdown<3.4 +# https://python-markdown.github.io/changelog/ +Markdown # File inclusion plugin for Python-Markdown # https://github.com/cmacmackin/markdown-include diff --git a/netbox/utilities/templatetags/builtins/filters.py b/netbox/utilities/templatetags/builtins/filters.py index a52a38116..d18524965 100644 --- a/netbox/utilities/templatetags/builtins/filters.py +++ b/netbox/utilities/templatetags/builtins/filters.py @@ -8,6 +8,7 @@ from django.contrib.contenttypes.models import ContentType from django.utils.html import escape from django.utils.safestring import mark_safe from markdown import markdown +from markdown.extensions.tables import TableExtension from netbox.config import get_config from utilities.markdown import StrikethroughExtension @@ -163,7 +164,12 @@ def render_markdown(value): return '' # Render Markdown - html = markdown(value, extensions=['def_list', 'fenced_code', 'tables', StrikethroughExtension()]) + html = markdown(value, extensions=[ + 'def_list', + 'fenced_code', + StrikethroughExtension(), + TableExtension(use_align_attribute=True), + ]) # If the string is not empty wrap it in rendered-markdown to style tables if html: diff --git a/requirements.txt b/requirements.txt index 537c5b77e..ab1318ce7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,7 +20,7 @@ feedparser==6.0.10 graphene-django==3.0.0 gunicorn==21.2.0 Jinja2==3.1.2 -Markdown==3.3.7 +Markdown==3.5.1 mkdocs-material==9.4.14 mkdocstrings[python-legacy]==0.24.0 netaddr==0.9.0 From 9f1283f0fa54c41002920a5a32106ad3c98e6072 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 Dec 2023 13:43:58 -0500 Subject: [PATCH 149/271] Upgrade django-taggit to v5.0.1 --- base_requirements.txt | 3 +-- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/base_requirements.txt b/base_requirements.txt index 3f661b6da..82c2d1abc 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -53,8 +53,7 @@ django-tables2 # User-defined tags for objects # https://github.com/jazzband/django-taggit/blob/master/CHANGELOG.rst -# TODO: Upgrade to v5.0 for NetBox v3.7 beta -django-taggit<5.0 +django-taggit # A Django field for representing time zones # https://github.com/mfogel/django-timezone-field/ diff --git a/requirements.txt b/requirements.txt index ab1318ce7..a9d7e710c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,7 +11,7 @@ django-redis==5.4.0 django-rich==1.8.0 django-rq==2.9.0 django-tables2==2.6.0 -django-taggit==4.0.0 +django-taggit==5.0.1 django-timezone-field==6.1.0 djangorestframework==3.14.0 drf-spectacular==0.26.5 From 8db1093fdc24e97cb2aba3a70566cda775f10be5 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 4 Dec 2023 15:44:52 -0500 Subject: [PATCH 150/271] #9816: Add TunnelGroup --- docs/features/vpn-tunnels.md | 2 +- docs/models/vpn/tunnel.md | 12 +- docs/models/vpn/tunnelgroup.md | 13 ++ netbox/dcim/tables/template_code.py | 2 +- netbox/netbox/navigation/menu.py | 1 + netbox/templates/vpn/tunnel.html | 4 + netbox/templates/vpn/tunnelgroup.html | 53 +++++ netbox/vpn/api/nested_serializers.py | 14 ++ netbox/vpn/api/serializers.py | 16 +- netbox/vpn/api/urls.py | 1 + netbox/vpn/api/views.py | 9 + netbox/vpn/filtersets.py | 20 +- netbox/vpn/forms/bulk_edit.py | 21 +- netbox/vpn/forms/bulk_import.py | 21 +- netbox/vpn/forms/filtersets.py | 11 + netbox/vpn/forms/model_forms.py | 26 ++- netbox/vpn/graphql/schema.py | 6 + netbox/vpn/graphql/types.py | 9 + netbox/vpn/migrations/0001_initial.py | 304 ++++++++++++++------------ netbox/vpn/models/tunnels.py | 36 ++- netbox/vpn/tables/tunnels.py | 23 ++ netbox/vpn/tests/test_api.py | 44 ++++ netbox/vpn/tests/test_filtersets.py | 43 ++++ netbox/vpn/tests/test_views.py | 70 +++++- netbox/vpn/urls.py | 8 + netbox/vpn/views.py | 60 +++++ 26 files changed, 669 insertions(+), 160 deletions(-) create mode 100644 docs/models/vpn/tunnelgroup.md create mode 100644 netbox/templates/vpn/tunnelgroup.html diff --git a/docs/features/vpn-tunnels.md b/docs/features/vpn-tunnels.md index ae6df70c8..4ebb91ab7 100644 --- a/docs/features/vpn-tunnels.md +++ b/docs/features/vpn-tunnels.md @@ -1,6 +1,6 @@ # Tunnels -NetBox can model private tunnels formed among virtual termination points across your network. Typical tunnel implementations include GRE, IP-in-IP, and IPSec. A tunnel may be terminated to two or more device or virtual machine interfaces. +NetBox can model private tunnels formed among virtual termination points across your network. Typical tunnel implementations include GRE, IP-in-IP, and IPSec. A tunnel may be terminated to two or more device or virtual machine interfaces. For convenient organization, tunnels may be assigned to user-defined groups. ```mermaid flowchart TD diff --git a/docs/models/vpn/tunnel.md b/docs/models/vpn/tunnel.md index ebe004da1..31625f7d6 100644 --- a/docs/models/vpn/tunnel.md +++ b/docs/models/vpn/tunnel.md @@ -14,15 +14,17 @@ A unique name assigned to the tunnel for identification. The operational status of the tunnel. By default, the following statuses are available: -| Name | -|----------------| -| Planned | -| Active | -| Disabled | +* Planned +* Active +* Disabled !!! tip "Custom tunnel statuses" Additional tunnel statuses may be defined by setting `Tunnel.status` under the [`FIELD_CHOICES`](../../configuration/data-validation.md#field_choices) configuration parameter. +### Group + +The [administrative group](./tunnelgroup.md) to which this tunnel is assigned (optional). + ### Encapsulation The encapsulation protocol or technique employed to effect the tunnel. NetBox supports GRE, IP-in-IP, and IPSec encapsulations. diff --git a/docs/models/vpn/tunnelgroup.md b/docs/models/vpn/tunnelgroup.md new file mode 100644 index 000000000..7e3a5c3cc --- /dev/null +++ b/docs/models/vpn/tunnelgroup.md @@ -0,0 +1,13 @@ +# Tunnel Group + +[Tunnels](./tunnel.md) can be arranged into administrative groups for organization. For example, you might crete a group to manage all peer-to-peer tunnels inside a mesh network. The assignment of a tunnel to a group is optional. + +## Fields + +### Name + +A unique human-friendly name. + +### Slug + +A unique URL-friendly identifier. (This value can be used for filtering.) diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index bf2ce9de4..1862893ff 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -361,7 +361,7 @@ INTERFACE_BUTTONS = """ {% endif %} {% elif record.type == 'virtual' %} {% if perms.vpn.add_tunnel and not record.tunnel_termination %} - + {% elif perms.vpn.delete_tunneltermination and record.tunnel_termination %} diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index e01e65cc8..d4969386e 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -203,6 +203,7 @@ VPN_MENU = Menu( label=_('Tunnels'), items=( get_model_item('vpn', 'tunnel', _('Tunnels')), + get_model_item('vpn', 'tunnelgroup', _('Tunnel Groups')), get_model_item('vpn', 'tunneltermination', _('Tunnel Terminations')), ), ), diff --git a/netbox/templates/vpn/tunnel.html b/netbox/templates/vpn/tunnel.html index 544ffadae..d1607bd95 100644 --- a/netbox/templates/vpn/tunnel.html +++ b/netbox/templates/vpn/tunnel.html @@ -26,6 +26,10 @@ {% trans "Status" %} {% badge object.get_status_display bg_color=object.get_status_color %} + + {% trans "Group" %} + {{ object.group|linkify|placeholder }} + {% trans "Description" %} {{ object.description|placeholder }} diff --git a/netbox/templates/vpn/tunnelgroup.html b/netbox/templates/vpn/tunnelgroup.html new file mode 100644 index 000000000..3afea48c4 --- /dev/null +++ b/netbox/templates/vpn/tunnelgroup.html @@ -0,0 +1,53 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load render_table from django_tables2 %} +{% load i18n %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block extra_controls %} + {% if perms.vpn.add_tunnel %} + + {% trans "Add Tunnel" %} + + {% endif %} +{% endblock extra_controls %} + +{% block content %} +
    +
    +
    +
    + {% trans "Tunnel Group" %} +
    +
    + + + + + + + + + +
    {% trans "Name" %}{{ object.name }}
    {% trans "Description" %}{{ object.description|placeholder }}
    +
    +
    + {% include 'inc/panels/tags.html' %} + {% plugin_left_page object %} +
    +
    + {% include 'inc/panels/related_objects.html' %} + {% include 'inc/panels/custom_fields.html' %} + {% plugin_right_page object %} +
    +
    +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} diff --git a/netbox/vpn/api/nested_serializers.py b/netbox/vpn/api/nested_serializers.py index f2627869b..1042b375e 100644 --- a/netbox/vpn/api/nested_serializers.py +++ b/netbox/vpn/api/nested_serializers.py @@ -1,3 +1,4 @@ +from drf_spectacular.utils import extend_schema_serializer from rest_framework import serializers from netbox.api.serializers import WritableNestedSerializer @@ -11,11 +12,24 @@ __all__ = ( 'NestedIPSecProposalSerializer', 'NestedL2VPNSerializer', 'NestedL2VPNTerminationSerializer', + 'NestedTunnelGroupSerializer', 'NestedTunnelSerializer', 'NestedTunnelTerminationSerializer', ) +@extend_schema_serializer( + exclude_fields=('tunnel_count',), +) +class NestedTunnelGroupSerializer(WritableNestedSerializer): + url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail') + tunnel_count = serializers.IntegerField(read_only=True) + + class Meta: + model = models.TunnelGroup + fields = ['id', 'url', 'display', 'name', 'slug', 'tunnel_count'] + + class NestedTunnelSerializer(WritableNestedSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:tunnel-detail' diff --git a/netbox/vpn/api/serializers.py b/netbox/vpn/api/serializers.py index 176deba04..dedcbfbf5 100644 --- a/netbox/vpn/api/serializers.py +++ b/netbox/vpn/api/serializers.py @@ -21,11 +21,24 @@ __all__ = ( 'IPSecProposalSerializer', 'L2VPNSerializer', 'L2VPNTerminationSerializer', + 'TunnelGroupSerializer', 'TunnelSerializer', 'TunnelTerminationSerializer', ) +class TunnelGroupSerializer(NetBoxModelSerializer): + url = serializers.HyperlinkedIdentityField(view_name='vpn-api:tunnelgroup-detail') + tunnel_count = serializers.IntegerField(read_only=True) + + class Meta: + model = TunnelGroup + fields = [ + 'id', 'url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', 'created', 'last_updated', + 'tunnel_count', + ] + + class TunnelSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField( view_name='vpn-api:tunnel-detail' @@ -33,6 +46,7 @@ class TunnelSerializer(NetBoxModelSerializer): status = ChoiceField( choices=TunnelStatusChoices ) + group = NestedTunnelGroupSerializer() encapsulation = ChoiceField( choices=TunnelEncapsulationChoices ) @@ -48,7 +62,7 @@ class TunnelSerializer(NetBoxModelSerializer): class Meta: model = Tunnel fields = ( - 'id', 'url', 'display', 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tunnel_id', + 'id', 'url', 'display', 'name', 'status', 'group', 'encapsulation', 'ipsec_profile', 'tenant', 'tunnel_id', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ) diff --git a/netbox/vpn/api/urls.py b/netbox/vpn/api/urls.py index 8938532dd..5358325f3 100644 --- a/netbox/vpn/api/urls.py +++ b/netbox/vpn/api/urls.py @@ -8,6 +8,7 @@ router.register('ike-proposals', views.IKEProposalViewSet) router.register('ipsec-policies', views.IPSecPolicyViewSet) router.register('ipsec-proposals', views.IPSecProposalViewSet) router.register('ipsec-profiles', views.IPSecProfileViewSet) +router.register('tunnel-groups', views.TunnelGroupViewSet) router.register('tunnels', views.TunnelViewSet) router.register('tunnel-terminations', views.TunnelTerminationViewSet) router.register('l2vpns', views.L2VPNViewSet) diff --git a/netbox/vpn/api/views.py b/netbox/vpn/api/views.py index 9a691a171..58ad2f47d 100644 --- a/netbox/vpn/api/views.py +++ b/netbox/vpn/api/views.py @@ -14,6 +14,7 @@ __all__ = ( 'IPSecProposalViewSet', 'L2VPNViewSet', 'L2VPNTerminationViewSet', + 'TunnelGroupViewSet', 'TunnelTerminationViewSet', 'TunnelViewSet', 'VPNRootView', @@ -32,6 +33,14 @@ class VPNRootView(APIRootView): # Viewsets # +class TunnelGroupViewSet(NetBoxModelViewSet): + queryset = TunnelGroup.objects.annotate( + tunnel_count=count_related(Tunnel, 'group') + ) + serializer_class = serializers.TunnelGroupSerializer + filterset_class = filtersets.TunnelGroupFilterSet + + class TunnelViewSet(NetBoxModelViewSet): queryset = Tunnel.objects.prefetch_related('ipsec_profile', 'tenant').annotate( terminations_count=count_related(TunnelTermination, 'tunnel') diff --git a/netbox/vpn/filtersets.py b/netbox/vpn/filtersets.py index 2efd0189c..fbdbb2418 100644 --- a/netbox/vpn/filtersets.py +++ b/netbox/vpn/filtersets.py @@ -4,7 +4,7 @@ from django.utils.translation import gettext as _ from dcim.models import Device, Interface from ipam.models import IPAddress, RouteTarget, VLAN -from netbox.filtersets import NetBoxModelFilterSet +from netbox.filtersets import NetBoxModelFilterSet, OrganizationalModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter from virtualization.models import VirtualMachine, VMInterface @@ -20,14 +20,32 @@ __all__ = ( 'L2VPNFilterSet', 'L2VPNTerminationFilterSet', 'TunnelFilterSet', + 'TunnelGroupFilterSet', 'TunnelTerminationFilterSet', ) +class TunnelGroupFilterSet(OrganizationalModelFilterSet): + + class Meta: + model = TunnelGroup + fields = ['id', 'name', 'slug', 'description'] + + class TunnelFilterSet(NetBoxModelFilterSet, TenancyFilterSet): status = django_filters.MultipleChoiceFilter( choices=TunnelStatusChoices ) + group_id = django_filters.ModelMultipleChoiceFilter( + queryset=TunnelGroup.objects.all(), + label=_('Tunnel group (ID)'), + ) + group = django_filters.ModelMultipleChoiceFilter( + field_name='group__slug', + queryset=TunnelGroup.objects.all(), + to_field_name='slug', + label=_('Tunnel group (slug)'), + ) encapsulation = django_filters.MultipleChoiceFilter( choices=TunnelEncapsulationChoices ) diff --git a/netbox/vpn/forms/bulk_edit.py b/netbox/vpn/forms/bulk_edit.py index 4cbfd950d..a976c5659 100644 --- a/netbox/vpn/forms/bulk_edit.py +++ b/netbox/vpn/forms/bulk_edit.py @@ -17,16 +17,33 @@ __all__ = ( 'L2VPNBulkEditForm', 'L2VPNTerminationBulkEditForm', 'TunnelBulkEditForm', + 'TunnelGroupBulkEditForm', 'TunnelTerminationBulkEditForm', ) +class TunnelGroupBulkEditForm(NetBoxModelBulkEditForm): + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + + model = TunnelGroup + nullable_fields = ('description',) + + class TunnelBulkEditForm(NetBoxModelBulkEditForm): status = forms.ChoiceField( label=_('Status'), choices=add_blank_choice(TunnelStatusChoices), required=False ) + group = DynamicModelChoiceField( + queryset=TunnelGroup.objects.all(), + label=_('Tunnel group'), + required=False + ) encapsulation = forms.ChoiceField( label=_('Encapsulation'), choices=add_blank_choice(TunnelEncapsulationChoices), @@ -55,12 +72,12 @@ class TunnelBulkEditForm(NetBoxModelBulkEditForm): model = Tunnel fieldsets = ( - (_('Tunnel'), ('status', 'encapsulation', 'tunnel_id', 'description')), + (_('Tunnel'), ('status', 'group', 'encapsulation', 'tunnel_id', 'description')), (_('Security'), ('ipsec_profile',)), (_('Tenancy'), ('tenant',)), ) nullable_fields = ( - 'ipsec_profile', 'tunnel_id', 'tenant', 'description', 'comments', + 'group', 'ipsec_profile', 'tunnel_id', 'tenant', 'description', 'comments', ) diff --git a/netbox/vpn/forms/bulk_import.py b/netbox/vpn/forms/bulk_import.py index 37da63da3..c5d53eb1d 100644 --- a/netbox/vpn/forms/bulk_import.py +++ b/netbox/vpn/forms/bulk_import.py @@ -5,7 +5,7 @@ from dcim.models import Device, Interface from ipam.models import IPAddress, VLAN from netbox.forms import NetBoxModelImportForm from tenancy.models import Tenant -from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, CSVModelMultipleChoiceField +from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, CSVModelMultipleChoiceField, SlugField from virtualization.models import VirtualMachine, VMInterface from vpn.choices import * from vpn.models import * @@ -19,16 +19,31 @@ __all__ = ( 'L2VPNImportForm', 'L2VPNTerminationImportForm', 'TunnelImportForm', + 'TunnelGroupImportForm', 'TunnelTerminationImportForm', ) +class TunnelGroupImportForm(NetBoxModelImportForm): + slug = SlugField() + + class Meta: + model = TunnelGroup + fields = ('name', 'slug', 'description', 'tags') + + class TunnelImportForm(NetBoxModelImportForm): status = CSVChoiceField( label=_('Status'), choices=TunnelStatusChoices, help_text=_('Operational status') ) + group = CSVModelChoiceField( + label=_('Tunnel group'), + queryset=TunnelGroup.objects.all(), + required=False, + to_field_name='name' + ) encapsulation = CSVChoiceField( label=_('Encapsulation'), choices=TunnelEncapsulationChoices, @@ -51,8 +66,8 @@ class TunnelImportForm(NetBoxModelImportForm): class Meta: model = Tunnel fields = ( - 'name', 'status', 'encapsulation', 'ipsec_profile', 'tenant', 'tunnel_id', 'description', 'comments', - 'tags', + 'name', 'status', 'group', 'encapsulation', 'ipsec_profile', 'tenant', 'tunnel_id', 'description', + 'comments', 'tags', ) diff --git a/netbox/vpn/forms/filtersets.py b/netbox/vpn/forms/filtersets.py index 91ca8a8dc..a9326c4bc 100644 --- a/netbox/vpn/forms/filtersets.py +++ b/netbox/vpn/forms/filtersets.py @@ -24,10 +24,16 @@ __all__ = ( 'L2VPNFilterForm', 'L2VPNTerminationFilterForm', 'TunnelFilterForm', + 'TunnelGroupFilterForm', 'TunnelTerminationFilterForm', ) +class TunnelGroupFilterForm(NetBoxModelFilterSetForm): + model = TunnelGroup + tag = TagFilterField(model) + + class TunnelFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = Tunnel fieldsets = ( @@ -41,6 +47,11 @@ class TunnelFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): choices=TunnelStatusChoices, required=False ) + group_id = DynamicModelMultipleChoiceField( + queryset=TunnelGroup.objects.all(), + required=False, + label=_('Tunnel group') + ) encapsulation = forms.MultipleChoiceField( label=_('Encapsulation'), choices=TunnelEncapsulationChoices, diff --git a/netbox/vpn/forms/model_forms.py b/netbox/vpn/forms/model_forms.py index 5c3db1c99..5b71c24aa 100644 --- a/netbox/vpn/forms/model_forms.py +++ b/netbox/vpn/forms/model_forms.py @@ -23,11 +23,31 @@ __all__ = ( 'L2VPNTerminationForm', 'TunnelCreateForm', 'TunnelForm', + 'TunnelGroupForm', 'TunnelTerminationForm', ) +class TunnelGroupForm(NetBoxModelForm): + slug = SlugField() + + fieldsets = ( + (_('Tunnel Group'), ('name', 'slug', 'description', 'tags')), + ) + + class Meta: + model = TunnelGroup + fields = [ + 'name', 'slug', 'description', 'tags', + ] + + class TunnelForm(TenancyForm, NetBoxModelForm): + group = DynamicModelChoiceField( + queryset=TunnelGroup.objects.all(), + label=_('Tunnel Group'), + required=False + ) ipsec_profile = DynamicModelChoiceField( queryset=IPSecProfile.objects.all(), label=_('IPSec Profile'), @@ -36,7 +56,7 @@ class TunnelForm(TenancyForm, NetBoxModelForm): comments = CommentField() fieldsets = ( - (_('Tunnel'), ('name', 'status', 'encapsulation', 'description', 'tunnel_id', 'tags')), + (_('Tunnel'), ('name', 'status', 'group', 'encapsulation', 'description', 'tunnel_id', 'tags')), (_('Security'), ('ipsec_profile',)), (_('Tenancy'), ('tenant_group', 'tenant')), ) @@ -44,8 +64,8 @@ class TunnelForm(TenancyForm, NetBoxModelForm): class Meta: model = Tunnel fields = [ - 'name', 'status', 'encapsulation', 'description', 'tunnel_id', 'ipsec_profile', 'tenant_group', 'tenant', - 'comments', 'tags', + 'name', 'status', 'group', 'encapsulation', 'description', 'tunnel_id', 'ipsec_profile', 'tenant_group', + 'tenant', 'comments', 'tags', ] diff --git a/netbox/vpn/graphql/schema.py b/netbox/vpn/graphql/schema.py index 9c8e1e502..6737957d4 100644 --- a/netbox/vpn/graphql/schema.py +++ b/netbox/vpn/graphql/schema.py @@ -56,6 +56,12 @@ class VPNQuery(graphene.ObjectType): def resolve_tunnel_list(root, info, **kwargs): return gql_query_optimizer(models.Tunnel.objects.all(), info) + tunnel_group = ObjectField(TunnelGroupType) + tunnel_group_list = ObjectListField(TunnelGroupType) + + def resolve_tunnel_group_list(root, info, **kwargs): + return gql_query_optimizer(models.TunnelGroup.objects.all(), info) + tunnel_termination = ObjectField(TunnelTerminationType) tunnel_termination_list = ObjectListField(TunnelTerminationType) diff --git a/netbox/vpn/graphql/types.py b/netbox/vpn/graphql/types.py index 840a44c7b..0bfebb441 100644 --- a/netbox/vpn/graphql/types.py +++ b/netbox/vpn/graphql/types.py @@ -12,11 +12,20 @@ __all__ = ( 'IPSecProposalType', 'L2VPNType', 'L2VPNTerminationType', + 'TunnelGroupType', 'TunnelTerminationType', 'TunnelType', ) +class TunnelGroupType(OrganizationalObjectType): + + class Meta: + model = models.TunnelGroup + fields = '__all__' + filterset_class = filtersets.TunnelGroupFilterSet + + class TunnelTerminationType(CustomFieldsMixin, TagsMixin, ObjectType): class Meta: diff --git a/netbox/vpn/migrations/0001_initial.py b/netbox/vpn/migrations/0001_initial.py index 17e000e53..efa799293 100644 --- a/netbox/vpn/migrations/0001_initial.py +++ b/netbox/vpn/migrations/0001_initial.py @@ -16,140 +16,7 @@ class Migration(migrations.Migration): ] operations = [ - migrations.CreateModel( - name='IKEPolicy', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), - ('created', models.DateTimeField(auto_now_add=True, null=True)), - ('last_updated', models.DateTimeField(auto_now=True, null=True)), - ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), - ('description', models.CharField(blank=True, max_length=200)), - ('comments', models.TextField(blank=True)), - ('name', models.CharField(max_length=100, unique=True)), - ('version', models.PositiveSmallIntegerField(default=2)), - ('mode', models.CharField()), - ('preshared_key', models.TextField(blank=True)), - ], - options={ - 'verbose_name': 'IKE policy', - 'verbose_name_plural': 'IKE policies', - 'ordering': ('name',), - }, - ), - migrations.CreateModel( - name='IPSecPolicy', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), - ('created', models.DateTimeField(auto_now_add=True, null=True)), - ('last_updated', models.DateTimeField(auto_now=True, null=True)), - ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), - ('description', models.CharField(blank=True, max_length=200)), - ('comments', models.TextField(blank=True)), - ('name', models.CharField(max_length=100, unique=True)), - ('pfs_group', models.PositiveSmallIntegerField(blank=True, null=True)), - ], - options={ - 'verbose_name': 'IPSec policy', - 'verbose_name_plural': 'IPSec policies', - 'ordering': ('name',), - }, - ), - migrations.CreateModel( - name='IPSecProfile', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), - ('created', models.DateTimeField(auto_now_add=True, null=True)), - ('last_updated', models.DateTimeField(auto_now=True, null=True)), - ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), - ('description', models.CharField(blank=True, max_length=200)), - ('comments', models.TextField(blank=True)), - ('name', models.CharField(max_length=100, unique=True)), - ('mode', models.CharField()), - ('ike_policy', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ipsec_profiles', to='vpn.ikepolicy')), - ('ipsec_policy', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ipsec_profiles', to='vpn.ipsecpolicy')), - ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), - ], - options={ - 'verbose_name': 'IPSec profile', - 'verbose_name_plural': 'IPSec profiles', - 'ordering': ('name',), - }, - ), - migrations.CreateModel( - name='Tunnel', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), - ('created', models.DateTimeField(auto_now_add=True, null=True)), - ('last_updated', models.DateTimeField(auto_now=True, null=True)), - ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), - ('description', models.CharField(blank=True, max_length=200)), - ('comments', models.TextField(blank=True)), - ('name', models.CharField(max_length=100, unique=True)), - ('status', models.CharField(default='active', max_length=50)), - ('encapsulation', models.CharField(max_length=50)), - ('tunnel_id', models.PositiveBigIntegerField(blank=True, null=True)), - ('ipsec_profile', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnels', to='vpn.ipsecprofile')), - ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), - ('tenant', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnels', to='tenancy.tenant')), - ], - options={ - 'verbose_name': 'tunnel', - 'verbose_name_plural': 'tunnels', - 'ordering': ('name',), - }, - ), - migrations.CreateModel( - name='TunnelTermination', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), - ('created', models.DateTimeField(auto_now_add=True, null=True)), - ('last_updated', models.DateTimeField(auto_now=True, null=True)), - ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), - ('role', models.CharField(default='peer', max_length=50)), - ('termination_id', models.PositiveBigIntegerField(blank=True, null=True)), - ('termination_type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype')), - ('outside_ip', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnel_termination', to='ipam.ipaddress')), - ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), - ('tunnel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='terminations', to='vpn.tunnel')), - ], - options={ - 'verbose_name': 'tunnel termination', - 'verbose_name_plural': 'tunnel terminations', - 'ordering': ('tunnel', 'role', 'pk'), - }, - ), - migrations.CreateModel( - name='IPSecProposal', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), - ('created', models.DateTimeField(auto_now_add=True, null=True)), - ('last_updated', models.DateTimeField(auto_now=True, null=True)), - ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), - ('description', models.CharField(blank=True, max_length=200)), - ('comments', models.TextField(blank=True)), - ('name', models.CharField(max_length=100, unique=True)), - ('encryption_algorithm', models.CharField()), - ('authentication_algorithm', models.CharField()), - ('sa_lifetime_seconds', models.PositiveIntegerField(blank=True, null=True)), - ('sa_lifetime_data', models.PositiveIntegerField(blank=True, null=True)), - ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), - ], - options={ - 'verbose_name': 'IPSec proposal', - 'verbose_name_plural': 'IPSec proposals', - 'ordering': ('name',), - }, - ), - migrations.AddField( - model_name='ipsecpolicy', - name='proposals', - field=models.ManyToManyField(related_name='ipsec_policies', to='vpn.ipsecproposal'), - ), - migrations.AddField( - model_name='ipsecpolicy', - name='tags', - field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'), - ), + # IKE migrations.CreateModel( name='IKEProposal', fields=[ @@ -173,6 +40,26 @@ class Migration(migrations.Migration): 'ordering': ('name',), }, ), + migrations.CreateModel( + name='IKEPolicy', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), + ('version', models.PositiveSmallIntegerField(default=2)), + ('mode', models.CharField()), + ('preshared_key', models.TextField(blank=True)), + ], + options={ + 'verbose_name': 'IKE policy', + 'verbose_name_plural': 'IKE policies', + 'ordering': ('name',), + }, + ), migrations.AddField( model_name='ikepolicy', name='proposals', @@ -183,6 +70,155 @@ class Migration(migrations.Migration): name='tags', field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'), ), + + # IPSec + migrations.CreateModel( + name='IPSecProposal', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), + ('encryption_algorithm', models.CharField()), + ('authentication_algorithm', models.CharField()), + ('sa_lifetime_seconds', models.PositiveIntegerField(blank=True, null=True)), + ('sa_lifetime_data', models.PositiveIntegerField(blank=True, null=True)), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'IPSec proposal', + 'verbose_name_plural': 'IPSec proposals', + 'ordering': ('name',), + }, + ), + migrations.CreateModel( + name='IPSecPolicy', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), + ('pfs_group', models.PositiveSmallIntegerField(blank=True, null=True)), + ], + options={ + 'verbose_name': 'IPSec policy', + 'verbose_name_plural': 'IPSec policies', + 'ordering': ('name',), + }, + ), + migrations.AddField( + model_name='ipsecpolicy', + name='proposals', + field=models.ManyToManyField(related_name='ipsec_policies', to='vpn.ipsecproposal'), + ), + migrations.AddField( + model_name='ipsecpolicy', + name='tags', + field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'), + ), + migrations.CreateModel( + name='IPSecProfile', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), + ('mode', models.CharField()), + ('ike_policy', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ipsec_profiles', to='vpn.ikepolicy')), + ('ipsec_policy', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='ipsec_profiles', to='vpn.ipsecpolicy')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'IPSec profile', + 'verbose_name_plural': 'IPSec profiles', + 'ordering': ('name',), + }, + ), + + # Tunnels + migrations.CreateModel( + name='TunnelGroup', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('name', models.CharField(max_length=100, unique=True)), + ('slug', models.SlugField(max_length=100, unique=True)), + ('description', models.CharField(blank=True, max_length=200)), + ], + options={ + 'verbose_name': 'tunnel group', + 'verbose_name_plural': 'tunnel groups', + 'ordering': ('name',), + }, + ), + migrations.AddField( + model_name='tunnelgroup', + name='tags', + field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'), + ), + migrations.CreateModel( + name='Tunnel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100, unique=True)), + ('status', models.CharField(default='active', max_length=50)), + ('group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnels', to='vpn.tunnelgroup')), + ('encapsulation', models.CharField(max_length=50)), + ('tunnel_id', models.PositiveBigIntegerField(blank=True, null=True)), + ('ipsec_profile', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnels', to='vpn.ipsecprofile')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ('tenant', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnels', to='tenancy.tenant')), + ], + options={ + 'verbose_name': 'tunnel', + 'verbose_name_plural': 'tunnels', + 'ordering': ('name',), + }, + ), + migrations.AddConstraint( + model_name='tunnel', + constraint=models.UniqueConstraint(fields=('group', 'name'), name='vpn_tunnel_group_name'), + ), + migrations.AddConstraint( + model_name='tunnel', + constraint=models.UniqueConstraint(condition=models.Q(('group__isnull', True)), fields=('name',), name='vpn_tunnel_name'), + ), + migrations.CreateModel( + name='TunnelTermination', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('role', models.CharField(default='peer', max_length=50)), + ('termination_id', models.PositiveBigIntegerField(blank=True, null=True)), + ('termination_type', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.contenttype')), + ('outside_ip', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnel_termination', to='ipam.ipaddress')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ('tunnel', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='terminations', to='vpn.tunnel')), + ], + options={ + 'verbose_name': 'tunnel termination', + 'verbose_name_plural': 'tunnel terminations', + 'ordering': ('tunnel', 'role', 'pk'), + }, + ), migrations.AddConstraint( model_name='tunneltermination', constraint=models.UniqueConstraint(fields=('termination_type', 'termination_id'), name='vpn_tunneltermination_termination', violation_error_message='An object may be terminated to only one tunnel at a time.'), diff --git a/netbox/vpn/models/tunnels.py b/netbox/vpn/models/tunnels.py index f7390d0b4..c1d262d3c 100644 --- a/netbox/vpn/models/tunnels.py +++ b/netbox/vpn/models/tunnels.py @@ -1,19 +1,35 @@ from django.contrib.contenttypes.fields import GenericForeignKey from django.core.exceptions import ValidationError from django.db import models +from django.db.models import Q from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from netbox.models import ChangeLoggedModel, PrimaryModel +from netbox.models import ChangeLoggedModel, OrganizationalModel, PrimaryModel from netbox.models.features import CustomFieldsMixin, CustomLinksMixin, TagsMixin from vpn.choices import * __all__ = ( 'Tunnel', + 'TunnelGroup', 'TunnelTermination', ) +class TunnelGroup(OrganizationalModel): + """ + An administrative grouping of Tunnels. This can be used to correlate peer-to-peer tunnels which form a mesh, + for example. + """ + class Meta: + ordering = ('name',) + verbose_name = _('tunnel group') + verbose_name_plural = _('tunnel groups') + + def get_absolute_url(self): + return reverse('vpn:tunnelgroup', args=[self.pk]) + + class Tunnel(PrimaryModel): name = models.CharField( verbose_name=_('name'), @@ -26,6 +42,13 @@ class Tunnel(PrimaryModel): choices=TunnelStatusChoices, default=TunnelStatusChoices.STATUS_ACTIVE ) + group = models.ForeignKey( + to='vpn.TunnelGroup', + on_delete=models.PROTECT, + related_name='tunnels', + blank=True, + null=True + ) encapsulation = models.CharField( verbose_name=_('encapsulation'), max_length=50, @@ -57,6 +80,17 @@ class Tunnel(PrimaryModel): class Meta: ordering = ('name',) + constraints = ( + models.UniqueConstraint( + fields=('group', 'name'), + name='%(app_label)s_%(class)s_group_name' + ), + models.UniqueConstraint( + fields=('name',), + name='%(app_label)s_%(class)s_name', + condition=Q(group__isnull=True) + ), + ) verbose_name = _('tunnel') verbose_name_plural = _('tunnels') diff --git a/netbox/vpn/tables/tunnels.py b/netbox/vpn/tables/tunnels.py index 9c4ba816d..c10985733 100644 --- a/netbox/vpn/tables/tunnels.py +++ b/netbox/vpn/tables/tunnels.py @@ -8,10 +8,33 @@ from vpn.models import * __all__ = ( 'TunnelTable', + 'TunnelGroupTable', 'TunnelTerminationTable', ) +class TunnelGroupTable(NetBoxTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True + ) + tunnel_count = columns.LinkedCountColumn( + viewname='vpn:tunnel_list', + url_params={'group_id': 'pk'}, + verbose_name=_('Tunnels') + ) + tags = columns.TagColumn( + url_name='vpn:tunnelgroup_list' + ) + + class Meta(NetBoxTable.Meta): + model = TunnelGroup + fields = ( + 'pk', 'id', 'name', 'tunnel_count', 'description', 'slug', 'tags', 'actions', 'created', 'last_updated', + ) + default_columns = ('pk', 'name', 'tunnel_count', 'description') + + class TunnelTable(TenancyColumnsMixin, NetBoxTable): name = tables.Column( verbose_name=_('Name'), diff --git a/netbox/vpn/tests/test_api.py b/netbox/vpn/tests/test_api.py index 2714bd4fc..eb0520c8b 100644 --- a/netbox/vpn/tests/test_api.py +++ b/netbox/vpn/tests/test_api.py @@ -17,6 +17,38 @@ class AppTest(APITestCase): self.assertEqual(response.status_code, 200) +class TunnelGroupTest(APIViewTestCases.APIViewTestCase): + model = TunnelGroup + brief_fields = ['display', 'id', 'name', 'slug', 'tunnel_count', 'url'] + create_data = ( + { + 'name': 'Tunnel Group 4', + 'slug': 'tunnel-group-4', + }, + { + 'name': 'Tunnel Group 5', + 'slug': 'tunnel-group-5', + }, + { + 'name': 'Tunnel Group 6', + 'slug': 'tunnel-group-6', + }, + ) + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + + tunnel_groups = ( + TunnelGroup(name='Tunnel Group 1', slug='tunnel-group-1'), + TunnelGroup(name='Tunnel Group 2', slug='tunnel-group-2'), + TunnelGroup(name='Tunnel Group 3', slug='tunnel-group-3'), + ) + TunnelGroup.objects.bulk_create(tunnel_groups) + + class TunnelTest(APIViewTestCases.APIViewTestCase): model = Tunnel brief_fields = ['display', 'id', 'name', 'url'] @@ -29,20 +61,29 @@ class TunnelTest(APIViewTestCases.APIViewTestCase): @classmethod def setUpTestData(cls): + tunnel_groups = ( + TunnelGroup(name='Tunnel Group 1', slug='tunnel-group-1'), + TunnelGroup(name='Tunnel Group 2', slug='tunnel-group-2'), + ) + TunnelGroup.objects.bulk_create(tunnel_groups) + tunnels = ( Tunnel( name='Tunnel 1', status=TunnelStatusChoices.STATUS_ACTIVE, + group=tunnel_groups[0], encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP ), Tunnel( name='Tunnel 2', status=TunnelStatusChoices.STATUS_ACTIVE, + group=tunnel_groups[0], encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP ), Tunnel( name='Tunnel 3', status=TunnelStatusChoices.STATUS_ACTIVE, + group=tunnel_groups[0], encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP ), ) @@ -52,16 +93,19 @@ class TunnelTest(APIViewTestCases.APIViewTestCase): { 'name': 'Tunnel 4', 'status': TunnelStatusChoices.STATUS_DISABLED, + 'group': tunnel_groups[1].pk, 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, }, { 'name': 'Tunnel 5', 'status': TunnelStatusChoices.STATUS_DISABLED, + 'group': tunnel_groups[1].pk, 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, }, { 'name': 'Tunnel 6', 'status': TunnelStatusChoices.STATUS_DISABLED, + 'group': tunnel_groups[1].pk, 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, }, ] diff --git a/netbox/vpn/tests/test_filtersets.py b/netbox/vpn/tests/test_filtersets.py index a9eeb1203..2ce3b2dde 100644 --- a/netbox/vpn/tests/test_filtersets.py +++ b/netbox/vpn/tests/test_filtersets.py @@ -11,6 +11,32 @@ from vpn.filtersets import * from vpn.models import * +class TunnelGroupTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = TunnelGroup.objects.all() + filterset = TunnelGroupFilterSet + + @classmethod + def setUpTestData(cls): + + TunnelGroup.objects.bulk_create(( + TunnelGroup(name='Tunnel Group 1', slug='tunnel-group-1', description='foobar1'), + TunnelGroup(name='Tunnel Group 2', slug='tunnel-group-2', description='foobar2'), + TunnelGroup(name='Tunnel Group 3', slug='tunnel-group-3'), + )) + + def test_name(self): + params = {'name': ['Tunnel Group 1']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_slug(self): + params = {'slug': ['tunnel-group-1']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class TunnelTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = Tunnel.objects.all() filterset = TunnelFilterSet @@ -56,10 +82,18 @@ class TunnelTestCase(TestCase, ChangeLoggedFilterSetTests): ) IPSecProfile.objects.bulk_create(ipsec_profiles) + tunnel_groups = ( + TunnelGroup(name='Tunnel Group 1', slug='tunnel-group-1'), + TunnelGroup(name='Tunnel Group 2', slug='tunnel-group-2'), + TunnelGroup(name='Tunnel Group 3', slug='tunnel-group-3'), + ) + TunnelGroup.objects.bulk_create(tunnel_groups) + tunnels = ( Tunnel( name='Tunnel 1', status=TunnelStatusChoices.STATUS_ACTIVE, + group=tunnel_groups[0], encapsulation=TunnelEncapsulationChoices.ENCAP_GRE, ipsec_profile=ipsec_profiles[0], tunnel_id=100 @@ -67,6 +101,7 @@ class TunnelTestCase(TestCase, ChangeLoggedFilterSetTests): Tunnel( name='Tunnel 2', status=TunnelStatusChoices.STATUS_PLANNED, + group=tunnel_groups[1], encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP, ipsec_profile=ipsec_profiles[0], tunnel_id=200 @@ -74,6 +109,7 @@ class TunnelTestCase(TestCase, ChangeLoggedFilterSetTests): Tunnel( name='Tunnel 3', status=TunnelStatusChoices.STATUS_DISABLED, + group=tunnel_groups[2], encapsulation=TunnelEncapsulationChoices.ENCAP_IPSEC_TUNNEL, ipsec_profile=None, tunnel_id=300 @@ -89,6 +125,13 @@ class TunnelTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'status': [TunnelStatusChoices.STATUS_ACTIVE, TunnelStatusChoices.STATUS_PLANNED]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_group(self): + tunnel_groups = TunnelGroup.objects.all()[:2] + params = {'group_id': [tunnel_groups[0].pk, tunnel_groups[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'group': [tunnel_groups[0].slug, tunnel_groups[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_encapsulation(self): params = {'encapsulation': [TunnelEncapsulationChoices.ENCAP_GRE, TunnelEncapsulationChoices.ENCAP_IP_IP]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/vpn/tests/test_views.py b/netbox/vpn/tests/test_views.py index 4d9080422..ab797d9fd 100644 --- a/netbox/vpn/tests/test_views.py +++ b/netbox/vpn/tests/test_views.py @@ -6,26 +6,78 @@ from vpn.choices import * from vpn.models import * +class TunnelGroupTestCase(ViewTestCases.OrganizationalObjectViewTestCase): + model = TunnelGroup + + @classmethod + def setUpTestData(cls): + + tunnel_groups = ( + TunnelGroup(name='Tunnel Group 1', slug='tunnel-group-1'), + TunnelGroup(name='Tunnel Group 2', slug='tunnel-group-2'), + TunnelGroup(name='Tunnel Group 3', slug='tunnel-group-3'), + ) + TunnelGroup.objects.bulk_create(tunnel_groups) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'Tunnel Group X', + 'slug': 'tunnel-group-x', + 'description': 'A new Tunnel Group', + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "name,slug", + "Tunnel Group 4,tunnel-group-4", + "Tunnel Group 5,tunnel-group-5", + "Tunnel Group 6,tunnel-group-6", + ) + + cls.csv_update_data = ( + "id,name,description", + f"{tunnel_groups[0].pk},Tunnel Group 7,New description7", + f"{tunnel_groups[1].pk},Tunnel Group 8,New description8", + f"{tunnel_groups[2].pk},Tunnel Group 9,New description9", + ) + + cls.bulk_edit_data = { + 'description': 'Foo', + } + + class TunnelTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = Tunnel @classmethod def setUpTestData(cls): + tunnel_groups = ( + TunnelGroup(name='Tunnel Group 1', slug='tunnel-group-1'), + TunnelGroup(name='Tunnel Group 2', slug='tunnel-group-2'), + TunnelGroup(name='Tunnel Group 3', slug='tunnel-group-3'), + TunnelGroup(name='Tunnel Group 4', slug='tunnel-group-4'), + ) + TunnelGroup.objects.bulk_create(tunnel_groups) + tunnels = ( Tunnel( name='Tunnel 1', status=TunnelStatusChoices.STATUS_ACTIVE, + group=tunnel_groups[0], encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP ), Tunnel( name='Tunnel 2', status=TunnelStatusChoices.STATUS_ACTIVE, + group=tunnel_groups[1], encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP ), Tunnel( name='Tunnel 3', status=TunnelStatusChoices.STATUS_ACTIVE, + group=tunnel_groups[2], encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP ), ) @@ -37,26 +89,28 @@ class TunnelTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'name': 'Tunnel X', 'description': 'New tunnel', 'status': TunnelStatusChoices.STATUS_PLANNED, + 'group': tunnel_groups[3].pk, 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, 'tags': [t.pk for t in tags], } cls.csv_data = ( - "name,status,encapsulation", - "Tunnel 4,planned,gre", - "Tunnel 5,planned,gre", - "Tunnel 6,planned,gre", + "name,status,group,encapsulation", + "Tunnel 4,planned,Tunnel Group 1,gre", + "Tunnel 5,planned,Tunnel Group 2,gre", + "Tunnel 6,planned,Tunnel Group 3,gre", ) cls.csv_update_data = ( - "id,status,encapsulation", - f"{tunnels[0].pk},active,ip-ip", - f"{tunnels[1].pk},active,ip-ip", - f"{tunnels[2].pk},active,ip-ip", + "id,status,group,encapsulation", + f"{tunnels[0].pk},active,Tunnel Group 4,ip-ip", + f"{tunnels[1].pk},active,Tunnel Group 4,ip-ip", + f"{tunnels[2].pk},active,Tunnel Group 4,ip-ip", ) cls.bulk_edit_data = { 'description': 'New description', + 'group': tunnel_groups[3].pk, 'status': TunnelStatusChoices.STATUS_DISABLED, 'encapsulation': TunnelEncapsulationChoices.ENCAP_GRE, } diff --git a/netbox/vpn/urls.py b/netbox/vpn/urls.py index 2bf684313..552f0e185 100644 --- a/netbox/vpn/urls.py +++ b/netbox/vpn/urls.py @@ -6,6 +6,14 @@ from . import views app_name = 'vpn' urlpatterns = [ + # Tunnel groups + path('tunnel-groups/', views.TunnelGroupListView.as_view(), name='tunnelgroup_list'), + path('tunnel-groups/add/', views.TunnelGroupEditView.as_view(), name='tunnelgroup_add'), + path('tunnel-groups/import/', views.TunnelGroupBulkImportView.as_view(), name='tunnelgroup_import'), + path('tunnel-groups/edit/', views.TunnelGroupBulkEditView.as_view(), name='tunnelgroup_bulk_edit'), + path('tunnel-groups/delete/', views.TunnelGroupBulkDeleteView.as_view(), name='tunnelgroup_bulk_delete'), + path('tunnel-groups//', include(get_model_urls('vpn', 'tunnelgroup'))), + # Tunnels path('tunnels/', views.TunnelListView.as_view(), name='tunnel_list'), path('tunnels/add/', views.TunnelEditView.as_view(), name='tunnel_add'), diff --git a/netbox/vpn/views.py b/netbox/vpn/views.py index f230e4828..9bf424af9 100644 --- a/netbox/vpn/views.py +++ b/netbox/vpn/views.py @@ -7,6 +7,66 @@ from . import filtersets, forms, tables from .models import * +# +# Tunnel groups +# + +class TunnelGroupListView(generic.ObjectListView): + queryset = TunnelGroup.objects.annotate( + tunnel_count=count_related(Tunnel, 'group') + ) + filterset = filtersets.TunnelGroupFilterSet + filterset_form = forms.TunnelGroupFilterForm + table = tables.TunnelGroupTable + + +@register_model_view(TunnelGroup) +class TunnelGroupView(generic.ObjectView): + queryset = TunnelGroup.objects.all() + + def get_extra_context(self, request, instance): + related_models = ( + (Tunnel.objects.restrict(request.user, 'view').filter(group=instance), 'group_id'), + ) + + return { + 'related_models': related_models, + } + + +@register_model_view(TunnelGroup, 'edit') +class TunnelGroupEditView(generic.ObjectEditView): + queryset = TunnelGroup.objects.all() + form = forms.TunnelGroupForm + + +@register_model_view(TunnelGroup, 'delete') +class TunnelGroupDeleteView(generic.ObjectDeleteView): + queryset = TunnelGroup.objects.all() + + +class TunnelGroupBulkImportView(generic.BulkImportView): + queryset = TunnelGroup.objects.all() + model_form = forms.TunnelGroupImportForm + + +class TunnelGroupBulkEditView(generic.BulkEditView): + queryset = TunnelGroup.objects.annotate( + tunnel_count=count_related(Tunnel, 'group') + ) + filterset = filtersets.TunnelGroupFilterSet + table = tables.TunnelGroupTable + form = forms.TunnelGroupBulkEditForm + + +class TunnelGroupBulkDeleteView(generic.BulkDeleteView): + queryset = TunnelGroup.objects.annotate( + tunnel_count=count_related(Tunnel, 'group') + ) + filterset = filtersets.TunnelGroupFilterSet + table = tables.TunnelGroupTable + + # # Tunnels # From 1afac47178dfd0a32de384ef3dec3796a428fbdd Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 5 Dec 2023 08:05:44 -0500 Subject: [PATCH 151/271] Documentation cleanup --- docs/introduction.md | 8 ++++++-- docs/media/misc/netbox_logo.png | Bin 0 -> 3903 bytes docs/reference/markdown.md | 8 ++++---- mkdocs.yml | 5 +++-- 4 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 docs/media/misc/netbox_logo.png diff --git a/docs/introduction.md b/docs/introduction.md index 8f62d842a..b8442dad7 100644 --- a/docs/introduction.md +++ b/docs/introduction.md @@ -19,10 +19,13 @@ NetBox was built specifically to serve the needs of network engineers and operat * Device modeling using pre-defined types * Virtual chassis and device contexts * Network, power, and console cabling with SVG traces +* Breakout cables * Power distribution modeling * Data circuit and provider tracking * Wireless LAN and point-to-point links -* L2 VPN overlays +* VPN tunnels +* IKE & IPSec policies +* Layer 2 VPN overlays * FHRP groups (VRRP, HSRP, etc.) * Application service bindings * Virtual machines & clusters @@ -30,13 +33,14 @@ NetBox was built specifically to serve the needs of network engineers and operat * Tenant ownership assignment * Device & VM configuration contexts for advanced configuration rendering * Custom fields for data model extension -* Custom validation rules +* Custom validation & protection rules * Custom reports & scripts executable directly within the UI * Extensive plugin framework for adding custom functionality * Single sign-on (SSO) authentication * Robust object-based permissions * Detailed, automatic change logging * Global search engine +* Event-driven scripts & webhooks ## What NetBox Is Not diff --git a/docs/media/misc/netbox_logo.png b/docs/media/misc/netbox_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c6e0a58e6259f957f2427afe1035e8e37a6d713c GIT binary patch literal 3903 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 N002ovPDHLkV1j7+9Wwv` literal 0 HcmV?d00001 diff --git a/docs/reference/markdown.md b/docs/reference/markdown.md index 7f280686d..0759fa2ec 100644 --- a/docs/reference/markdown.md +++ b/docs/reference/markdown.md @@ -171,23 +171,23 @@ Some text to show that the reference links can follow later. Here's the NetBox logo (hover to see the title text): Inline-style: -![alt text](/static/netbox_logo.png "Logo Title Text 1") +![alt text](/media/misc/netbox_logo.png "Logo Title Text 1") Reference-style: ![alt text][logo] -[logo]: /static/netbox_logo.png "Logo Title Text 2" +[logo]: /media/misc/netbox_logo.png "Logo Title Text 2" ``` Here's the NetBox logo (hover to see the title text): Inline-style: -![alt text](/static/netbox_logo.png "Logo Title Text 1") +![alt text](../media/misc/netbox_logo.png "Logo Title Text 1") Reference-style: ![alt text][logo] -[logo]: /static/netbox_logo.png "Logo Title Text 2" +[logo]: ../media/misc/netbox_logo.png "Logo Title Text 2" diff --git a/mkdocs.yml b/mkdocs.yml index 45f9fe7d1..5a7e00c2c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -53,8 +53,8 @@ markdown_extensions: - admonition - attr_list - pymdownx.emoji: - emoji_index: !!python/name:materialx.emoji.twemoji - emoji_generator: !!python/name:materialx.emoji.to_svg + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg - pymdownx.superfences: custom_fences: - name: mermaid @@ -263,6 +263,7 @@ nav: - L2VPN: 'models/vpn/l2vpn.md' - L2VPNTermination: 'models/vpn/l2vpntermination.md' - Tunnel: 'models/vpn/tunnel.md' + - TunnelGroup: 'models/vpn/tunnelgroup.md' - TunnelTermination: 'models/vpn/tunneltermination.md' - Wireless: - WirelessLAN: 'models/wireless/wirelesslan.md' From f58d80643c78e9a83995f568261e4758d15ea7ee Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 5 Dec 2023 08:25:48 -0500 Subject: [PATCH 152/271] Release v3.7-beta1 --- docs/release-notes/version-3.7.md | 2 +- netbox/netbox/settings.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index d7a013985..7eeedb723 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -1,4 +1,4 @@ -## v3.7-beta1 (FUTURE) +## v3.7-beta1 (2023-12-05) ### Breaking Changes diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 1181229f2..e2cf1cd8c 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -27,7 +27,7 @@ from netbox.plugins import PluginConfig # Environment setup # -VERSION = '3.6.7-dev' +VERSION = '3.7-beta1' # Hostname HOSTNAME = platform.node() From b21ed6a334eafab711e89680123556fd3717c733 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Thu, 30 Nov 2023 22:00:26 +0530 Subject: [PATCH 153/271] adds optional classes parameter #14390 --- netbox/utilities/templates/builtins/copy_content.html | 2 +- netbox/utilities/templatetags/builtins/tags.py | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/netbox/utilities/templates/builtins/copy_content.html b/netbox/utilities/templates/builtins/copy_content.html index 9025a71a1..4d9ad9431 100644 --- a/netbox/utilities/templates/builtins/copy_content.html +++ b/netbox/utilities/templates/builtins/copy_content.html @@ -1,3 +1,3 @@ - + diff --git a/netbox/utilities/templatetags/builtins/tags.py b/netbox/utilities/templatetags/builtins/tags.py index 68541ae5a..dc5d75f48 100644 --- a/netbox/utilities/templatetags/builtins/tags.py +++ b/netbox/utilities/templatetags/builtins/tags.py @@ -87,13 +87,14 @@ def checkmark(value, show_false=True, true='Yes', false='No'): @register.inclusion_tag('builtins/copy_content.html') -def copy_content(target, prefix=None, color='primary'): +def copy_content(target, prefix=None, color='primary', classes=None): """ Display a copy button to copy the content of a field. """ return { 'target': f'#{prefix or ""}{target}', - 'color': f'btn-{color}' + 'color': f'btn-{color}', + 'classes': classes or '', } From d10ac9b4a7a37ad9a441f81176f997df95052829 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 5 Dec 2023 14:03:38 -0500 Subject: [PATCH 154/271] Closes #12623: Document need for core.sync_datasource permission --- docs/features/synchronized-data.md | 4 +++- docs/integrations/synchronized-data.md | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/features/synchronized-data.md b/docs/features/synchronized-data.md index f266519b6..a070d0ce1 100644 --- a/docs/features/synchronized-data.md +++ b/docs/features/synchronized-data.md @@ -10,7 +10,6 @@ To enable remote data synchronization, the NetBox administrator first designates (Local disk paths are considered "remote" in this context as they exist outside NetBox's database. These paths could also be mapped to external network shares.) - !!! info Data backends which connect to external sources typically require the installation of one or more supporting Python libraries. The Git backend requires the [`dulwich`](https://www.dulwich.io/) package, and the S3 backend requires the [`boto3`](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) package. These must be installed within NetBox's environment to enable these backends. @@ -23,3 +22,6 @@ The following NetBox models can be associated with replicated data files: * Export templates Once a data has been designated for a local instance, its data will be replaced with the content of the replicated file. When the replicated file is updated in the future (via synchronization jobs), the local instance will be flagged as having out-of-date data. A user can then synchronize these objects individually or in bulk to effect the update. This two-stage process ensures that automated synchronization tasks do not immediately affect production data. + +!!! note "Permissions" + A user must be assigned the `core.sync_datasource` permission in order to synchronize local files from a remote data source. diff --git a/docs/integrations/synchronized-data.md b/docs/integrations/synchronized-data.md index 805cbe15b..d72501fd5 100644 --- a/docs/integrations/synchronized-data.md +++ b/docs/integrations/synchronized-data.md @@ -2,6 +2,9 @@ Some NetBox models support automatic synchronization of certain attributes from remote [data sources](../models/core/datasource.md), such as a git repository hosted on GitHub or GitLab. Data from the authoritative remote source is synchronized locally in NetBox as [data files](../models/core/datafile.md). +!!! note "Permissions" + A user must be assigned the `core.sync_datasource` permission in order to synchronize local files from a remote data source. This is accomplished by creating a permission for the "Core > Data Source" object type with the `sync` action, and assigning it to the desired user and/or group. + The following features support the use of synchronized data: * [Configuration templates](../features/configuration-rendering.md) From d2c3a39ebbdb0f5b4683193033b8e67e944ddbc5 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 5 Dec 2023 11:14:02 -0800 Subject: [PATCH 155/271] 14401 validate rack startion position > 0 --- .../0182_alter_rack_starting_unit.py | 18 ++++++++++++++++++ netbox/dcim/models/racks.py | 1 + 2 files changed, 19 insertions(+) create mode 100644 netbox/dcim/migrations/0182_alter_rack_starting_unit.py diff --git a/netbox/dcim/migrations/0182_alter_rack_starting_unit.py b/netbox/dcim/migrations/0182_alter_rack_starting_unit.py new file mode 100644 index 000000000..5b0fc6ce4 --- /dev/null +++ b/netbox/dcim/migrations/0182_alter_rack_starting_unit.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.5 on 2023-12-05 19:13 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('dcim', '0181_rename_device_role_device_role'), + ] + + operations = [ + migrations.AlterField( + model_name='rack', + name='starting_unit', + field=models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1)]), + ), + ] diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index ef0dde4da..a0614abcb 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -141,6 +141,7 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, PrimaryModel, WeightMixin): starting_unit = models.PositiveSmallIntegerField( default=RACK_STARTING_UNIT_DEFAULT, verbose_name=_('starting unit'), + validators=[MinValueValidator(1),], help_text=_('Starting unit for rack') ) desc_units = models.BooleanField( From b34daeaacbb3d18c30e18a6d34c63a16ddc0a1bd Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 5 Dec 2023 13:37:33 -0800 Subject: [PATCH 156/271] 14401 review changes - remove migration --- .../dcim/migrations/0174_rack_starting_unit.py | 3 ++- .../0182_alter_rack_starting_unit.py | 18 ------------------ 2 files changed, 2 insertions(+), 19 deletions(-) delete mode 100644 netbox/dcim/migrations/0182_alter_rack_starting_unit.py diff --git a/netbox/dcim/migrations/0174_rack_starting_unit.py b/netbox/dcim/migrations/0174_rack_starting_unit.py index e32738660..2d2b5f826 100644 --- a/netbox/dcim/migrations/0174_rack_starting_unit.py +++ b/netbox/dcim/migrations/0174_rack_starting_unit.py @@ -1,5 +1,6 @@ # Generated by Django 4.1.9 on 2023-05-31 15:47 +import django.core.validators from django.db import migrations, models @@ -12,6 +13,6 @@ class Migration(migrations.Migration): migrations.AddField( model_name='rack', name='starting_unit', - field=models.PositiveSmallIntegerField(default=1), + field=models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1)]), ), ] diff --git a/netbox/dcim/migrations/0182_alter_rack_starting_unit.py b/netbox/dcim/migrations/0182_alter_rack_starting_unit.py deleted file mode 100644 index 5b0fc6ce4..000000000 --- a/netbox/dcim/migrations/0182_alter_rack_starting_unit.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.2.5 on 2023-12-05 19:13 - -import django.core.validators -from django.db import migrations, models - - -class Migration(migrations.Migration): - dependencies = [ - ('dcim', '0181_rename_device_role_device_role'), - ] - - operations = [ - migrations.AlterField( - model_name='rack', - name='starting_unit', - field=models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1)]), - ), - ] From 32264ac3e3496a9a9cd049eeef671179d3f9c41f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 5 Dec 2023 16:05:31 -0500 Subject: [PATCH 157/271] Fixes #14322: Populate default custom field values when instantiating templated device components --- netbox/dcim/models/devices.py | 19 ++++-- netbox/dcim/tests/test_models.py | 95 ++++++++++++++++++++-------- netbox/extras/models/customfields.py | 9 +++ 3 files changed, 88 insertions(+), 35 deletions(-) diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index c9ebf898d..0ffee5c7b 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -16,7 +16,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.choices import * from dcim.constants import * -from extras.models import ConfigContextModel +from extras.models import ConfigContextModel, CustomField from extras.querysets import ConfigContextModelQuerySet from netbox.config import ConfigItem from netbox.models import OrganizationalModel, PrimaryModel @@ -985,11 +985,17 @@ class Device( bulk_create: If True, bulk_create() will be called to create all components in a single query (default). Otherwise, save() will be called on each instance individually. """ + components = [obj.instantiate(device=self) for obj in queryset] + if not components: + return + + # Set default values for any applicable custom fields + model = queryset.model.component_model + if cf_defaults := CustomField.objects.get_defaults_for_model(model): + for component in components: + component.custom_field_data = cf_defaults + if bulk_create: - components = [obj.instantiate(device=self) for obj in queryset] - if not components: - return - model = components[0]._meta.model model.objects.bulk_create(components) # Manually send the post_save signal for each of the newly created components for component in components: @@ -1002,8 +1008,7 @@ class Device( update_fields=None ) else: - for obj in queryset: - component = obj.instantiate(device=self) + for component in components: component.save() def save(self, *args, **kwargs): diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index 2e5ae0d5c..369f03ef5 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -1,9 +1,11 @@ +from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.test import TestCase from circuits.models import * from dcim.choices import * from dcim.models import * +from extras.models import CustomField from tenancy.models import Tenant from utilities.utils import drange @@ -255,6 +257,23 @@ class DeviceTestCase(TestCase): ) DeviceRole.objects.bulk_create(roles) + # Create a CustomField with a default value & assign it to all component models + cf1 = CustomField.objects.create(name='cf1', default='foo') + cf1.content_types.set( + ContentType.objects.filter(app_label='dcim', model__in=[ + 'consoleport', + 'consoleserverport', + 'powerport', + 'poweroutlet', + 'interface', + 'rearport', + 'frontport', + 'modulebay', + 'devicebay', + 'inventoryitem', + ]) + ) + # Create DeviceType components ConsolePortTemplate( device_type=device_type, @@ -266,18 +285,18 @@ class DeviceTestCase(TestCase): name='Console Server Port 1' ).save() - ppt = PowerPortTemplate( + powerport = PowerPortTemplate( device_type=device_type, name='Power Port 1', maximum_draw=1000, allocated_draw=500 ) - ppt.save() + powerport.save() PowerOutletTemplate( device_type=device_type, name='Power Outlet 1', - power_port=ppt, + power_port=powerport, feed_leg=PowerOutletFeedLegChoices.FEED_LEG_A ).save() @@ -288,19 +307,19 @@ class DeviceTestCase(TestCase): mgmt_only=True ).save() - rpt = RearPortTemplate( + rearport = RearPortTemplate( device_type=device_type, name='Rear Port 1', type=PortTypeChoices.TYPE_8P8C, positions=8 ) - rpt.save() + rearport.save() FrontPortTemplate( device_type=device_type, name='Front Port 1', type=PortTypeChoices.TYPE_8P8C, - rear_port=rpt, + rear_port=rearport, rear_port_position=2 ).save() @@ -314,73 +333,93 @@ class DeviceTestCase(TestCase): name='Device Bay 1' ).save() + InventoryItemTemplate( + device_type=device_type, + name='Inventory Item 1' + ).save() + def test_device_creation(self): """ Ensure that all Device components are copied automatically from the DeviceType. """ - d = Device( + device = Device( site=Site.objects.first(), device_type=DeviceType.objects.first(), role=DeviceRole.objects.first(), name='Test Device 1' ) - d.save() + device.save() - ConsolePort.objects.get( - device=d, + consoleport = ConsolePort.objects.get( + device=device, name='Console Port 1' ) + self.assertEqual(consoleport.cf['cf1'], 'foo') - ConsoleServerPort.objects.get( - device=d, + consoleserverport = ConsoleServerPort.objects.get( + device=device, name='Console Server Port 1' ) + self.assertEqual(consoleserverport.cf['cf1'], 'foo') - pp = PowerPort.objects.get( - device=d, + powerport = PowerPort.objects.get( + device=device, name='Power Port 1', maximum_draw=1000, allocated_draw=500 ) + self.assertEqual(powerport.cf['cf1'], 'foo') - PowerOutlet.objects.get( - device=d, + poweroutlet = PowerOutlet.objects.get( + device=device, name='Power Outlet 1', - power_port=pp, + power_port=powerport, feed_leg=PowerOutletFeedLegChoices.FEED_LEG_A ) + self.assertEqual(poweroutlet.cf['cf1'], 'foo') - Interface.objects.get( - device=d, + interface = Interface.objects.get( + device=device, name='Interface 1', type=InterfaceTypeChoices.TYPE_1GE_FIXED, mgmt_only=True ) + self.assertEqual(interface.cf['cf1'], 'foo') - rp = RearPort.objects.get( - device=d, + rearport = RearPort.objects.get( + device=device, name='Rear Port 1', type=PortTypeChoices.TYPE_8P8C, positions=8 ) + self.assertEqual(rearport.cf['cf1'], 'foo') - FrontPort.objects.get( - device=d, + frontport = FrontPort.objects.get( + device=device, name='Front Port 1', type=PortTypeChoices.TYPE_8P8C, - rear_port=rp, + rear_port=rearport, rear_port_position=2 ) + self.assertEqual(frontport.cf['cf1'], 'foo') - ModuleBay.objects.get( - device=d, + modulebay = ModuleBay.objects.get( + device=device, name='Module Bay 1' ) + self.assertEqual(modulebay.cf['cf1'], 'foo') - DeviceBay.objects.get( - device=d, + devicebay = DeviceBay.objects.get( + device=device, name='Device Bay 1' ) + self.assertEqual(devicebay.cf['cf1'], 'foo') + + inventoryitem = InventoryItem.objects.get( + device=device, + name='Inventory Item 1' + ) + self.assertEqual(inventoryitem.cf['cf1'], 'foo') def test_multiple_unnamed_devices(self): diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index 2bed464bb..f70812bc0 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -57,6 +57,15 @@ class CustomFieldManager(models.Manager.from_queryset(RestrictedQuerySet)): content_type = ContentType.objects.get_for_model(model._meta.concrete_model) return self.get_queryset().filter(content_types=content_type) + def get_defaults_for_model(self, model): + """ + Return a dictionary of serialized default values for all CustomFields applicable to the given model. + """ + custom_fields = self.get_for_model(model).filter(default__isnull=False) + return { + cf.name: cf.default for cf in custom_fields + } + class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): content_types = models.ManyToManyField( From fe3f21105ce1a32691cee4c04955bcfb6b64a34b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 6 Dec 2023 15:28:47 -0500 Subject: [PATCH 158/271] Fixes #14448: Fix exception when creating a power feed with rack and panel in different sites --- netbox/dcim/models/power.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/models/power.py b/netbox/dcim/models/power.py index a852ea5cd..62578d6c4 100644 --- a/netbox/dcim/models/power.py +++ b/netbox/dcim/models/power.py @@ -175,7 +175,7 @@ class PowerFeed(PrimaryModel, PathEndpoint, CabledObjectModel): # Rack must belong to same Site as PowerPanel if self.rack and self.rack.site != self.power_panel.site: raise ValidationError(_( - "Rack {rack} ({site}) and power panel {powerpanel} ({powerpanel_site}) are in different sites" + "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) are in different sites." ).format( rack=self.rack, rack_site=self.rack.site, From 92bdaa2120b2cbb4944d7e679aa516e14b214274 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Thu, 7 Dec 2023 20:15:30 +0530 Subject: [PATCH 159/271] Fixes IPv6 detection from headers (#14456) * fixes client ip detection for v6 * adds test for get_client_ip * Employ urlparse() to strip port numbers from IPs --------- Co-authored-by: Jeremy Stretch --- netbox/utilities/request.py | 18 ++++++++++++----- netbox/utilities/tests/test_request.py | 28 ++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 5 deletions(-) create mode 100644 netbox/utilities/tests/test_request.py diff --git a/netbox/utilities/request.py b/netbox/utilities/request.py index 0f8ee9cae..a5ca145e9 100644 --- a/netbox/utilities/request.py +++ b/netbox/utilities/request.py @@ -1,4 +1,5 @@ -from netaddr import IPAddress +from netaddr import AddrFormatError, IPAddress +from urllib.parse import urlparse __all__ = ( 'get_client_ip', @@ -17,11 +18,18 @@ def get_client_ip(request, additional_headers=()): ) for header in HTTP_HEADERS: if header in request.META: - client_ip = request.META[header].split(',')[0].partition(':')[0] + ip = request.META[header].split(',')[0].strip() try: - return IPAddress(client_ip) - except ValueError: - raise ValueError(f"Invalid IP address set for {header}: {client_ip}") + return IPAddress(ip) + except AddrFormatError: + # Parse the string with urlparse() to remove port number or any other cruft + ip = urlparse(f'//{ip}').hostname + + try: + return IPAddress(ip) + except AddrFormatError: + # We did our best + raise ValueError(f"Invalid IP address set for {header}: {ip}") # Could not determine the client IP address from request headers return None diff --git a/netbox/utilities/tests/test_request.py b/netbox/utilities/tests/test_request.py new file mode 100644 index 000000000..69f677323 --- /dev/null +++ b/netbox/utilities/tests/test_request.py @@ -0,0 +1,28 @@ +from django.test import TestCase, RequestFactory + +from netaddr import IPAddress +from utilities.request import get_client_ip + + +class GetClientIPTests(TestCase): + def setUp(self): + self.factory = RequestFactory() + + def test_ipv4_address(self): + request = self.factory.get('/', HTTP_X_FORWARDED_FOR='192.168.1.1') + self.assertEqual(get_client_ip(request), IPAddress('192.168.1.1')) + request = self.factory.get('/', HTTP_X_FORWARDED_FOR='192.168.1.1:8080') + self.assertEqual(get_client_ip(request), IPAddress('192.168.1.1')) + + def test_ipv6_address(self): + request = self.factory.get('/', HTTP_X_FORWARDED_FOR='2001:db8::8a2e:370:7334') + self.assertEqual(get_client_ip(request), IPAddress('2001:db8::8a2e:370:7334')) + request = self.factory.get('/', HTTP_X_FORWARDED_FOR='[2001:db8::8a2e:370:7334]') + self.assertEqual(get_client_ip(request), IPAddress('2001:db8::8a2e:370:7334')) + request = self.factory.get('/', HTTP_X_FORWARDED_FOR='[2001:db8::8a2e:370:7334]:8080') + self.assertEqual(get_client_ip(request), IPAddress('2001:db8::8a2e:370:7334')) + + def test_invalid_ip_address(self): + request = self.factory.get('/', HTTP_X_FORWARDED_FOR='invalid_ip') + with self.assertRaises(ValueError): + get_client_ip(request) From 5d2f499ffb6a9d4429e183568381fdfa2bf01370 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 7 Dec 2023 09:52:40 -0500 Subject: [PATCH 160/271] Fixes #14432: Fix hyperlinks for global search result attributes --- docs/release-notes/version-3.7.md | 8 ++++++++ netbox/netbox/tables/template_code.py | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 7eeedb723..c8d54cdae 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -1,3 +1,11 @@ +# NetBox v3.7 + +## v3.7-beta2 (FUTURE) + +### Bug Fixes + +* [#14432](https://github.com/netbox-community/netbox/issues/14432) - Fix hyperlinks for global search result attributes + ## v3.7-beta1 (2023-12-05) ### Breaking Changes diff --git a/netbox/netbox/tables/template_code.py b/netbox/netbox/tables/template_code.py index 24439eeb6..60bfda0c9 100644 --- a/netbox/netbox/tables/template_code.py +++ b/netbox/netbox/tables/template_code.py @@ -5,7 +5,7 @@ SEARCH_RESULT_ATTRS = """ > {{ name|bettertitle }}: {% with url=value.get_absolute_url %} - {% if url %}{% endif %} + {% if url %}{% endif %} {% if value|length > 40 %} {{ value|truncatechars:"40" }} {% else %} From e59ee3e01e29408609a4b91486fccc65456f7c7f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 5 Dec 2023 10:29:17 -0500 Subject: [PATCH 161/271] Fixes #14397: Pass a mutable copy of request data when provisioning available IPs --- netbox/ipam/api/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index 662b393de..8e815817f 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -1,3 +1,5 @@ +from copy import deepcopy + from django.core.exceptions import ObjectDoesNotExist, PermissionDenied from django.db import transaction from django.shortcuts import get_object_or_404 @@ -290,7 +292,7 @@ class AvailableObjectsView(ObjectValidationMixin, APIView): ) # Prepare object data for deserialization - requested_objects = self.prep_object_data(requested_objects, available_objects, parent) + requested_objects = self.prep_object_data(deepcopy(requested_objects), available_objects, parent) # Initialize the serializer with a list or a single object depending on what was requested serializer_class = get_serializer_for_model(self.queryset.model) From 2d1f88272497ca72d2e1eca8e291c04538c6810e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 7 Dec 2023 10:02:57 -0500 Subject: [PATCH 162/271] Closes #14458: Remove the clearcache management command --- netbox/core/management/commands/clearcache.py | 20 ------------------- upgrade.sh | 5 ----- 2 files changed, 25 deletions(-) delete mode 100644 netbox/core/management/commands/clearcache.py diff --git a/netbox/core/management/commands/clearcache.py b/netbox/core/management/commands/clearcache.py deleted file mode 100644 index 9c91efe77..000000000 --- a/netbox/core/management/commands/clearcache.py +++ /dev/null @@ -1,20 +0,0 @@ -from django.core.cache import cache -from django.core.management.base import BaseCommand - -from core.models import ConfigRevision - - -class Command(BaseCommand): - """Command to clear the entire cache.""" - help = 'Clears the cache.' - - def handle(self, *args, **kwargs): - # Fetch the current config revision from the cache - config_version = cache.get('config_version') - # Clear the cache - cache.clear() - self.stdout.write('Cache has been cleared.', ending="\n") - if config_version: - # Activate the current config revision - ConfigRevision.objects.get(id=config_version).activate() - self.stdout.write(f'Config revision ({config_version}) has been restored.', ending="\n") diff --git a/upgrade.sh b/upgrade.sh index cac046a9f..adeeb7465 100755 --- a/upgrade.sh +++ b/upgrade.sh @@ -113,11 +113,6 @@ COMMAND="python3 netbox/manage.py clearsessions" echo "Removing expired user sessions ($COMMAND)..." eval $COMMAND || exit 1 -# Clear the cache -COMMAND="python3 netbox/manage.py clearcache" -echo "Clearing the cache ($COMMAND)..." -eval $COMMAND || exit 1 - if [ -v WARN_MISSING_VENV ]; then echo "--------------------------------------------------------------------" echo "WARNING: No existing virtual environment was detected. A new one has" From b532435a6df047b1821e397a75cc727acdaa05de Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 7 Dec 2023 14:02:51 -0500 Subject: [PATCH 163/271] Closes #14436: Add indexes for all GenericForeignKey fields (#14463) * Closes #14436: Add PostgreSQL indexes for all GenericForeignKeys * Add note about GFK indexes to developer docs --- docs/development/extending-models.md | 39 ++++++++++++------- netbox/core/migrations/0010_gfk_indexes.py | 17 ++++++++ netbox/core/models/jobs.py | 3 ++ netbox/dcim/migrations/0184_gfk_indexes.py | 25 ++++++++++++ netbox/dcim/models/cables.py | 3 ++ .../dcim/models/device_component_templates.py | 3 ++ netbox/dcim/models/device_components.py | 3 ++ netbox/extras/migrations/0101_eventrule.py | 4 ++ netbox/extras/migrations/0103_gfk_indexes.py | 37 ++++++++++++++++++ netbox/extras/models/change_logging.py | 4 ++ netbox/extras/models/models.py | 12 ++++++ netbox/extras/models/staging.py | 3 ++ netbox/ipam/migrations/0069_gfk_indexes.py | 25 ++++++++++++ netbox/ipam/models/fhrp.py | 3 ++ netbox/ipam/models/ip.py | 5 ++- netbox/ipam/models/vlans.py | 3 ++ netbox/tenancy/migrations/0013_gfk_indexes.py | 17 ++++++++ netbox/tenancy/models/contacts.py | 3 ++ netbox/vpn/migrations/0001_initial.py | 4 ++ netbox/vpn/migrations/0002_move_l2vpn.py | 4 ++ netbox/vpn/models/l2vpn.py | 3 ++ netbox/vpn/models/tunnels.py | 3 ++ 22 files changed, 208 insertions(+), 15 deletions(-) create mode 100644 netbox/core/migrations/0010_gfk_indexes.py create mode 100644 netbox/dcim/migrations/0184_gfk_indexes.py create mode 100644 netbox/extras/migrations/0103_gfk_indexes.py create mode 100644 netbox/ipam/migrations/0069_gfk_indexes.py create mode 100644 netbox/tenancy/migrations/0013_gfk_indexes.py diff --git a/docs/development/extending-models.md b/docs/development/extending-models.md index b7fd5e1e5..bf5431337 100644 --- a/docs/development/extending-models.md +++ b/docs/development/extending-models.md @@ -2,12 +2,25 @@ Below is a list of tasks to consider when adding a new field to a core model. -## 1. Generate and run database migrations +## 1. Add the field to the model class + +Add the field to the model, taking care to address any of the following conditions. + +* When adding a GenericForeignKey field, also add an index under `Meta` for its two concrete fields. For example: + + ```python + class Meta: + indexes = ( + models.Index(fields=('object_type', 'object_id')), + ) + ``` + +## 2. Generate and run database migrations [Django migrations](https://docs.djangoproject.com/en/stable/topics/migrations/) are used to express changes to the database schema. In most cases, Django can generate these automatically, however very complex changes may require manual intervention. Always remember to specify a short but descriptive name when generating a new migration. ``` -./manage.py makemigrations -n +./manage.py makemigrations -n --no-header ./manage.py migrate ``` @@ -16,7 +29,7 @@ Where possible, try to merge related changes into a single migration. For exampl !!! warning "Do not alter existing migrations" Migrations can only be merged within a release. Once a new release has been published, its migrations cannot be altered (other than for the purpose of correcting a bug). -## 2. Add validation logic to `clean()` +## 3. Add validation logic to `clean()` If the new field introduces additional validation requirements (beyond what's included with the field itself), implement them in the model's `clean()` method. Remember to call the model's original method using `super()` before or after your custom validation as appropriate: @@ -31,15 +44,15 @@ class Foo(models.Model): raise ValidationError() ``` -## 3. Update relevant querysets +## 4. Update relevant querysets If you're adding a relational field (e.g. `ForeignKey`) and intend to include the data when retrieving a list of objects, be sure to include the field using `prefetch_related()` as appropriate. This will optimize the view and avoid extraneous database queries. -## 4. Update API serializer +## 5. Update API serializer Extend the model's API serializer in `.api.serializers` to include the new field. In most cases, it will not be necessary to also extend the nested serializer, which produces a minimal representation of the model. -## 5. Add fields to forms +## 6. Add fields to forms Extend any forms to include the new field(s) as appropriate. These are found under the `forms/` directory within each app. Common forms include: @@ -48,23 +61,23 @@ Extend any forms to include the new field(s) as appropriate. These are found und * **CSV import** - The form used when bulk importing objects in CSV format * **Filter** - Displays the options available for filtering a list of objects (both UI and API) -## 6. Extend object filter set +## 7. Extend object filter set If the new field should be filterable, add it to the `FilterSet` for the model. If the field should be searchable, remember to query it in the FilterSet's `search()` method. -## 7. Add column to object table +## 8. Add column to object table If the new field will be included in the object list view, add a column to the model's table. For simple fields, adding the field name to `Meta.fields` will be sufficient. More complex fields may require declaring a custom column. Also add the field name to `default_columns` if the column should be present in the table by default. -## 8. Update the SearchIndex +## 9. Update the SearchIndex Where applicable, add the new field to the model's SearchIndex for inclusion in global search. -## 9. Update the UI templates +## 10. Update the UI templates Edit the object's view template to display the new field. There may also be a custom add/edit form template that needs to be updated. -## 10. Create/extend test cases +## 11. Create/extend test cases Create or extend the relevant test cases to verify that the new field and any accompanying validation logic perform as expected. This is especially important for relational fields. NetBox incorporates various test suites, including: @@ -74,8 +87,8 @@ Create or extend the relevant test cases to verify that the new field and any ac * Model tests * View tests -Be diligent to ensure all of the relevant test suites are adapted or extended as necessary to test any new functionality. +Be diligent to ensure all the relevant test suites are adapted or extended as necessary to test any new functionality. -## 11. Update the model's documentation +## 12. Update the model's documentation Each model has a dedicated page in the documentation, at `models//.md`. Update this file to include any relevant information about the new field. diff --git a/netbox/core/migrations/0010_gfk_indexes.py b/netbox/core/migrations/0010_gfk_indexes.py new file mode 100644 index 000000000..d51bc67ad --- /dev/null +++ b/netbox/core/migrations/0010_gfk_indexes.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.7 on 2023-12-07 16:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0009_configrevision'), + ] + + operations = [ + migrations.AddIndex( + model_name='job', + index=models.Index(fields=['object_type', 'object_id'], name='core_job_object__c664ac_idx'), + ), + ] diff --git a/netbox/core/models/jobs.py b/netbox/core/models/jobs.py index e91be980c..7cc62a15a 100644 --- a/netbox/core/models/jobs.py +++ b/netbox/core/models/jobs.py @@ -106,6 +106,9 @@ class Job(models.Model): class Meta: ordering = ['-created'] + indexes = ( + models.Index(fields=('object_type', 'object_id')), + ) verbose_name = _('job') verbose_name_plural = _('jobs') diff --git a/netbox/dcim/migrations/0184_gfk_indexes.py b/netbox/dcim/migrations/0184_gfk_indexes.py new file mode 100644 index 000000000..501ddf462 --- /dev/null +++ b/netbox/dcim/migrations/0184_gfk_indexes.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.7 on 2023-12-07 16:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0183_protect_child_interfaces'), + ] + + operations = [ + migrations.AddIndex( + model_name='cabletermination', + index=models.Index(fields=['termination_type', 'termination_id'], name='dcim_cablet_termina_884752_idx'), + ), + migrations.AddIndex( + model_name='inventoryitem', + index=models.Index(fields=['component_type', 'component_id'], name='dcim_invent_compone_0560bb_idx'), + ), + migrations.AddIndex( + model_name='inventoryitemtemplate', + index=models.Index(fields=['component_type', 'component_id'], name='dcim_invent_compone_77b5f8_idx'), + ), + ] diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index e276ae3e5..90bf9501f 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -298,6 +298,9 @@ class CableTermination(ChangeLoggedModel): class Meta: ordering = ('cable', 'cable_end', 'pk') + indexes = ( + models.Index(fields=('termination_type', 'termination_id')), + ) constraints = ( models.UniqueConstraint( fields=('termination_type', 'termination_id'), diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index fb3d6333e..dacd7ec3e 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -749,6 +749,9 @@ class InventoryItemTemplate(MPTTModel, ComponentTemplateModel): class Meta: ordering = ('device_type__id', 'parent__id', '_name') + indexes = ( + models.Index(fields=('component_type', 'component_id')), + ) constraints = ( models.UniqueConstraint( fields=('device_type', 'parent', 'name'), diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 94ae2d6a6..ef235078f 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -1250,6 +1250,9 @@ class InventoryItem(MPTTModel, ComponentModel, TrackingModelMixin): class Meta: ordering = ('device__id', 'parent__id', '_name') + indexes = ( + models.Index(fields=('component_type', 'component_id')), + ) constraints = ( models.UniqueConstraint( fields=('device', 'parent', 'name'), diff --git a/netbox/extras/migrations/0101_eventrule.py b/netbox/extras/migrations/0101_eventrule.py index a3ce08591..3d236c847 100644 --- a/netbox/extras/migrations/0101_eventrule.py +++ b/netbox/extras/migrations/0101_eventrule.py @@ -91,6 +91,10 @@ class Migration(migrations.Migration): name='tags', field=taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag'), ), + migrations.AddIndex( + model_name='eventrule', + index=models.Index(fields=['action_object_type', 'action_object_id'], name='extras_even_action__d9e2af_idx'), + ), # Replicate Webhook data migrations.RunPython(move_webhooks), diff --git a/netbox/extras/migrations/0103_gfk_indexes.py b/netbox/extras/migrations/0103_gfk_indexes.py new file mode 100644 index 000000000..2ccbdb2ff --- /dev/null +++ b/netbox/extras/migrations/0103_gfk_indexes.py @@ -0,0 +1,37 @@ +# Generated by Django 4.2.7 on 2023-12-07 16:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0102_move_configrevision'), + ] + + operations = [ + migrations.AddIndex( + model_name='bookmark', + index=models.Index(fields=['object_type', 'object_id'], name='extras_book_object__2df6b4_idx'), + ), + migrations.AddIndex( + model_name='imageattachment', + index=models.Index(fields=['content_type', 'object_id'], name='extras_imag_content_94728e_idx'), + ), + migrations.AddIndex( + model_name='journalentry', + index=models.Index(fields=['assigned_object_type', 'assigned_object_id'], name='extras_jour_assigne_76510f_idx'), + ), + migrations.AddIndex( + model_name='objectchange', + index=models.Index(fields=['changed_object_type', 'changed_object_id'], name='extras_obje_changed_927fe5_idx'), + ), + migrations.AddIndex( + model_name='objectchange', + index=models.Index(fields=['related_object_type', 'related_object_id'], name='extras_obje_related_bfcdef_idx'), + ), + migrations.AddIndex( + model_name='stagedchange', + index=models.Index(fields=['object_type', 'object_id'], name='extras_stag_object__4734d5_idx'), + ), + ] diff --git a/netbox/extras/models/change_logging.py b/netbox/extras/models/change_logging.py index 5db0bba57..7befed095 100644 --- a/netbox/extras/models/change_logging.py +++ b/netbox/extras/models/change_logging.py @@ -94,6 +94,10 @@ class ObjectChange(models.Model): class Meta: ordering = ['-time'] + indexes = ( + models.Index(fields=('changed_object_type', 'changed_object_id')), + models.Index(fields=('related_object_type', 'related_object_id')), + ) verbose_name = _('object change') verbose_name_plural = _('object changes') diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 21319400c..d49536c58 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -132,6 +132,9 @@ class EventRule(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLogged class Meta: ordering = ('name',) + indexes = ( + models.Index(fields=('action_object_type', 'action_object_id')), + ) verbose_name = _('event rule') verbose_name_plural = _('event rules') @@ -631,6 +634,9 @@ class ImageAttachment(ChangeLoggedModel): class Meta: ordering = ('name', 'pk') # name may be non-unique + indexes = ( + models.Index(fields=('content_type', 'object_id')), + ) verbose_name = _('image attachment') verbose_name_plural = _('image attachments') @@ -720,6 +726,9 @@ class JournalEntry(CustomFieldsMixin, CustomLinksMixin, TagsMixin, ExportTemplat class Meta: ordering = ('-created',) + indexes = ( + models.Index(fields=('assigned_object_type', 'assigned_object_id')), + ) verbose_name = _('journal entry') verbose_name_plural = _('journal entries') @@ -769,6 +778,9 @@ class Bookmark(models.Model): class Meta: ordering = ('created', 'pk') + indexes = ( + models.Index(fields=('object_type', 'object_id')), + ) constraints = ( models.UniqueConstraint( fields=('object_type', 'object_id', 'user'), diff --git a/netbox/extras/models/staging.py b/netbox/extras/models/staging.py index 2e848a817..b2da7a622 100644 --- a/netbox/extras/models/staging.py +++ b/netbox/extras/models/staging.py @@ -90,6 +90,9 @@ class StagedChange(ChangeLoggedModel): class Meta: ordering = ('pk',) + indexes = ( + models.Index(fields=('object_type', 'object_id')), + ) verbose_name = _('staged change') verbose_name_plural = _('staged changes') diff --git a/netbox/ipam/migrations/0069_gfk_indexes.py b/netbox/ipam/migrations/0069_gfk_indexes.py new file mode 100644 index 000000000..75c016102 --- /dev/null +++ b/netbox/ipam/migrations/0069_gfk_indexes.py @@ -0,0 +1,25 @@ +# Generated by Django 4.2.7 on 2023-12-07 16:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0068_move_l2vpn'), + ] + + operations = [ + migrations.AddIndex( + model_name='fhrpgroupassignment', + index=models.Index(fields=['interface_type', 'interface_id'], name='ipam_fhrpgr_interfa_2acc3f_idx'), + ), + migrations.AddIndex( + model_name='ipaddress', + index=models.Index(fields=['assigned_object_type', 'assigned_object_id'], name='ipam_ipaddr_assigne_890ab8_idx'), + ), + migrations.AddIndex( + model_name='vlangroup', + index=models.Index(fields=['scope_type', 'scope_id'], name='ipam_vlangr_scope_t_9da557_idx'), + ), + ] diff --git a/netbox/ipam/models/fhrp.py b/netbox/ipam/models/fhrp.py index 1e4e7dac3..c3a7084b6 100644 --- a/netbox/ipam/models/fhrp.py +++ b/netbox/ipam/models/fhrp.py @@ -101,6 +101,9 @@ class FHRPGroupAssignment(ChangeLoggedModel): class Meta: ordering = ('-priority', 'pk') + indexes = ( + models.Index(fields=('interface_type', 'interface_id')), + ) constraints = ( models.UniqueConstraint( fields=('interface_type', 'interface_id', 'group'), diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index 7dc0ac445..adf130ad7 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -780,9 +780,10 @@ class IPAddress(PrimaryModel): class Meta: ordering = ('address', 'pk') # address may be non-unique - indexes = [ + indexes = ( models.Index(Cast(Host('address'), output_field=IPAddressField()), name='ipam_ipaddress_host'), - ] + models.Index(fields=('assigned_object_type', 'assigned_object_id')), + ) verbose_name = _('IP address') verbose_name_plural = _('IP addresses') diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index 1327a6e9d..7a879bc7c 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -68,6 +68,9 @@ class VLANGroup(OrganizationalModel): class Meta: ordering = ('name', 'pk') # Name may be non-unique + indexes = ( + models.Index(fields=('scope_type', 'scope_id')), + ) constraints = ( models.UniqueConstraint( fields=('scope_type', 'scope_id', 'name'), diff --git a/netbox/tenancy/migrations/0013_gfk_indexes.py b/netbox/tenancy/migrations/0013_gfk_indexes.py new file mode 100644 index 000000000..dd23cefbb --- /dev/null +++ b/netbox/tenancy/migrations/0013_gfk_indexes.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.7 on 2023-12-07 16:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tenancy', '0012_contactassignment_custom_fields'), + ] + + operations = [ + migrations.AddIndex( + model_name='contactassignment', + index=models.Index(fields=['content_type', 'object_id'], name='tenancy_con_content_693ff4_idx'), + ), + ] diff --git a/netbox/tenancy/models/contacts.py b/netbox/tenancy/models/contacts.py index 28bf92958..81e11a7dd 100644 --- a/netbox/tenancy/models/contacts.py +++ b/netbox/tenancy/models/contacts.py @@ -141,6 +141,9 @@ class ContactAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, Chan class Meta: ordering = ('priority', 'contact') + indexes = ( + models.Index(fields=('content_type', 'object_id')), + ) constraints = ( models.UniqueConstraint( fields=('content_type', 'object_id', 'contact', 'role'), diff --git a/netbox/vpn/migrations/0001_initial.py b/netbox/vpn/migrations/0001_initial.py index efa799293..20cedfe0d 100644 --- a/netbox/vpn/migrations/0001_initial.py +++ b/netbox/vpn/migrations/0001_initial.py @@ -219,6 +219,10 @@ class Migration(migrations.Migration): 'ordering': ('tunnel', 'role', 'pk'), }, ), + migrations.AddIndex( + model_name='tunneltermination', + index=models.Index(fields=['termination_type', 'termination_id'], name='vpn_tunnelt_termina_c1f04b_idx'), + ), migrations.AddConstraint( model_name='tunneltermination', constraint=models.UniqueConstraint(fields=('termination_type', 'termination_id'), name='vpn_tunneltermination_termination', violation_error_message='An object may be terminated to only one tunnel at a time.'), diff --git a/netbox/vpn/migrations/0002_move_l2vpn.py b/netbox/vpn/migrations/0002_move_l2vpn.py index 3ec49f830..b83ea4655 100644 --- a/netbox/vpn/migrations/0002_move_l2vpn.py +++ b/netbox/vpn/migrations/0002_move_l2vpn.py @@ -70,4 +70,8 @@ class Migration(migrations.Migration): name='vpn_l2vpntermination_assigned_object' ), ), + migrations.AddIndex( + model_name='l2vpntermination', + index=models.Index(fields=['assigned_object_type', 'assigned_object_id'], name='vpn_l2vpnte_assigne_9c55f8_idx'), + ), ] diff --git a/netbox/vpn/models/l2vpn.py b/netbox/vpn/models/l2vpn.py index f1a142283..31d267113 100644 --- a/netbox/vpn/models/l2vpn.py +++ b/netbox/vpn/models/l2vpn.py @@ -104,6 +104,9 @@ class L2VPNTermination(NetBoxModel): class Meta: ordering = ('l2vpn',) + indexes = ( + models.Index(fields=('assigned_object_type', 'assigned_object_id')), + ) constraints = ( models.UniqueConstraint( fields=('assigned_object_type', 'assigned_object_id'), diff --git a/netbox/vpn/models/tunnels.py b/netbox/vpn/models/tunnels.py index c1d262d3c..be1e40142 100644 --- a/netbox/vpn/models/tunnels.py +++ b/netbox/vpn/models/tunnels.py @@ -143,6 +143,9 @@ class TunnelTermination(CustomFieldsMixin, CustomLinksMixin, TagsMixin, ChangeLo class Meta: ordering = ('tunnel', 'role', 'pk') + indexes = ( + models.Index(fields=('termination_type', 'termination_id')), + ) constraints = ( models.UniqueConstraint( fields=('termination_type', 'termination_id'), From 95a8415e2d027a11c7067e0f9235bedf27349855 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 7 Dec 2023 16:21:15 -0500 Subject: [PATCH 164/271] Add deployment type to bug report template --- .github/ISSUE_TEMPLATE/bug_report.yaml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 5e936c5ec..dcc3f0a97 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -10,16 +10,25 @@ body: installation. If you're having trouble with installation or just looking for assistance with using NetBox, please visit our [discussion forum](https://github.com/netbox-community/netbox/discussions) instead. + - type: dropdown + attributes: + label: Deployment Type + description: How are you running NetBox? + options: + - Self-hosted + - NetBox Cloud + validations: + required: true - type: input attributes: - label: NetBox version + label: NetBox Version description: What version of NetBox are you currently running? placeholder: v3.6.6 validations: required: true - type: dropdown attributes: - label: Python version + label: Python Version description: What version of Python are you currently running? options: - "3.8" From 9d7192202d793b7eaf8d67b8100ecc2ad5494bd2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 5 Dec 2023 15:09:59 -0500 Subject: [PATCH 165/271] Fixes #14392: Fix admin UI bulk actions --- netbox/templates/django/forms/widgets/checkbox.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/netbox/templates/django/forms/widgets/checkbox.html b/netbox/templates/django/forms/widgets/checkbox.html index bbe201a29..359657136 100644 --- a/netbox/templates/django/forms/widgets/checkbox.html +++ b/netbox/templates/django/forms/widgets/checkbox.html @@ -1,6 +1,7 @@ {% comment %} Include a hidden field of the same name to ensure that unchecked checkboxes - are always included in the submitted form data. + are always included in the submitted form data. Omit fields names + _selected_action to avoid breaking the admin UI. {% endcomment %} - +{% if widget.name != '_selected_action' %}{% endif %} {% include "django/forms/widgets/input.html" %} From 2ef023a16045b848f9c1cb3dbb9c2ee180589dac Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 7 Dec 2023 16:34:49 -0500 Subject: [PATCH 166/271] Changelog for #14249, #14390, #14392, #14397, #14401, #14432, #14448 --- docs/release-notes/version-3.6.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 10e93be1e..a4234f8dd 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -2,6 +2,19 @@ ## v3.6.7 (FUTURE) +### Enhancements + +* [#14390](https://github.com/netbox-community/netbox/issues/14390) - Add `classes` parameter to `copy_content` template tag + +### Bug Fixes + +* [#14249](https://github.com/netbox-community/netbox/issues/14249) - Fix server error when authenticating via IP-restricted API tokens using IPv6 +* [#14392](https://github.com/netbox-community/netbox/issues/14392) - Fix bulk operations for plugin models under admin UI +* [#14397](https://github.com/netbox-community/netbox/issues/14397) - Fix exception on non-JSON request to `/available-ips/` API endpoints +* [#14401](https://github.com/netbox-community/netbox/issues/14401) - Rack `starting_unit` cannot be zero +* [#14432](https://github.com/netbox-community/netbox/issues/14432) - Populate custom field default values for components when creating a device +* [#14448](https://github.com/netbox-community/netbox/issues/14448) - Fix exception when creating a power feed with rack and panel in different sites + --- ## v3.6.6 (2023-11-29) From d428dd172c886b9fd4b0a4662f84b65982c1fffb Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 8 Dec 2023 08:45:03 -0500 Subject: [PATCH 167/271] Fixes #14472: Fix display of hidden custom fields in object edit forms --- docs/release-notes/version-3.7.md | 1 + netbox/netbox/forms/mixins.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index c8d54cdae..0b57b829c 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -5,6 +5,7 @@ ### Bug Fixes * [#14432](https://github.com/netbox-community/netbox/issues/14432) - Fix hyperlinks for global search result attributes +* [#14472](https://github.com/netbox-community/netbox/issues/14472) - Fix display of hidden custom fields in object edit forms ## v3.7-beta1 (2023-12-05) diff --git a/netbox/netbox/forms/mixins.py b/netbox/netbox/forms/mixins.py index e9fb897c0..d76eb56c8 100644 --- a/netbox/netbox/forms/mixins.py +++ b/netbox/netbox/forms/mixins.py @@ -40,7 +40,7 @@ class CustomFieldsMixin: def _get_custom_fields(self, content_type): return CustomField.objects.filter(content_types=content_type).exclude( - ui_visible=CustomFieldUIVisibleChoices.HIDDEN + ui_editable=CustomFieldUIEditableChoices.HIDDEN ) def _get_form_field(self, customfield): From 35be4f05ef376e28d9af4d7245ba10cc286bb62a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 11 Dec 2023 10:10:28 -0500 Subject: [PATCH 168/271] Add note to bug reports section --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 301fac079..471846427 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -36,6 +36,8 @@ NetBox users are welcome to participate in either role, on stage or in the crowd ## :bug: Reporting Bugs +:warning: Bug reports are used to call attention to some unintended or unexpected behavior in NetBox, such as when an error occurs or when the result of taking some action is inconsistent with the documentation. **Bug reports may not be used to suggest new functionality**; please see "feature requests" below if that is your goal. + * First, ensure that you're running the [latest stable version](https://github.com/netbox-community/netbox/releases) of NetBox. If you're running an older version, it's likely that the bug has already been fixed. * Next, search our [issues list](https://github.com/netbox-community/netbox/issues?q=is%3Aissue) to see if the bug you've found has already been reported. If you come across a bug report that seems to match, please click "add a reaction" in the top right corner of the issue and add a thumbs up (:thumbsup:). This will help draw more attention to it. Any comments you can add to provide additional information or context would also be much appreciated. From 965f2de34b249bf699f72dfabbaf7320c4334353 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Mon, 11 Dec 2023 07:50:07 -0800 Subject: [PATCH 169/271] 14424 Remove ChangeLoggedModel from StagedChange (#14476) * 14424 remove ChangeLoggedModel from StagedChange * 14424 rename migration --- ...0104_stagedchange_remove_change_logging.py | 20 +++++++++++++++++++ netbox/extras/models/staging.py | 3 ++- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 netbox/extras/migrations/0104_stagedchange_remove_change_logging.py diff --git a/netbox/extras/migrations/0104_stagedchange_remove_change_logging.py b/netbox/extras/migrations/0104_stagedchange_remove_change_logging.py new file mode 100644 index 000000000..df962bbb8 --- /dev/null +++ b/netbox/extras/migrations/0104_stagedchange_remove_change_logging.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.5 on 2023-12-08 16:03 + +from django.db import migrations + + +class Migration(migrations.Migration): + dependencies = [ + ('extras', '0103_gfk_indexes'), + ] + + operations = [ + migrations.RemoveField( + model_name='stagedchange', + name='created', + ), + migrations.RemoveField( + model_name='stagedchange', + name='last_updated', + ), + ] diff --git a/netbox/extras/models/staging.py b/netbox/extras/models/staging.py index b2da7a622..f15d8d470 100644 --- a/netbox/extras/models/staging.py +++ b/netbox/extras/models/staging.py @@ -7,6 +7,7 @@ from django.utils.translation import gettext_lazy as _ from extras.choices import ChangeActionChoices from netbox.models import ChangeLoggedModel +from netbox.models.features import * from utilities.utils import deserialize_object __all__ = ( @@ -54,7 +55,7 @@ class Branch(ChangeLoggedModel): self.staged_changes.all().delete() -class StagedChange(ChangeLoggedModel): +class StagedChange(CustomValidationMixin, EventRulesMixin, models.Model): """ The prepared creation, modification, or deletion of an object to be applied to the active database at a future point. From 81fa4265da51268e0f2652ac36a76a724ebdc4ab Mon Sep 17 00:00:00 2001 From: Prince Kumar Date: Mon, 11 Dec 2023 16:01:33 +0530 Subject: [PATCH 170/271] add tags field in L2VPN Termination --- netbox/ipam/forms/model_forms.py | 2 +- netbox/ipam/tables/l2vpn.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index bfd4f952d..41b31dc76 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -818,7 +818,7 @@ class L2VPNTerminationForm(NetBoxModelForm): class Meta: model = L2VPNTermination - fields = ('l2vpn', ) + fields = ('l2vpn', 'tags') def __init__(self, *args, **kwargs): instance = kwargs.get('instance') diff --git a/netbox/ipam/tables/l2vpn.py b/netbox/ipam/tables/l2vpn.py index 8635ab62a..6678d184c 100644 --- a/netbox/ipam/tables/l2vpn.py +++ b/netbox/ipam/tables/l2vpn.py @@ -73,12 +73,15 @@ class L2VPNTerminationTable(NetBoxTable): orderable=False, verbose_name=_('Object Site') ) + tags = columns.TagColumn( + url_name='ipam:l2vpntermination_list' + ) class Meta(NetBoxTable.Meta): model = L2VPNTermination fields = ( 'pk', 'l2vpn', 'assigned_object_type', 'assigned_object', 'assigned_object_parent', 'assigned_object_site', - 'actions', + 'tags', 'actions', ) default_columns = ( 'pk', 'l2vpn', 'assigned_object_type', 'assigned_object_parent', 'assigned_object', 'actions', From 6939ae4a47192d3d6e87061cc741a9b51f7ea215 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 12 Dec 2023 11:31:39 -0800 Subject: [PATCH 171/271] 14467 change ChoiceField separator from comma to colon (#14469) * 14467 change ChoiceField separator from comma to colon * 14467 fix test * 14467 fix test * 14467 use regex for colon detection * 14467 update tests --- netbox/extras/forms/model_forms.py | 7 ++++--- netbox/extras/tests/test_views.py | 9 ++++++++- netbox/utilities/forms/widgets/misc.py | 2 +- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 83a346420..4e4a6e0de 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -1,4 +1,5 @@ import json +import re from django import forms from django.conf import settings @@ -95,8 +96,8 @@ class CustomFieldChoiceSetForm(BootstrapMixin, forms.ModelForm): required=False, help_text=mark_safe(_( 'Enter one choice per line. An optional label may be specified for each choice by appending it with a ' - 'comma. Example:' - ) + ' choice1,First Choice') + 'colon. Example:' + ) + ' choice1:First Choice') ) class Meta: @@ -107,7 +108,7 @@ class CustomFieldChoiceSetForm(BootstrapMixin, forms.ModelForm): data = [] for line in self.cleaned_data['extra_choices'].splitlines(): try: - value, label = line.split(',', maxsplit=1) + value, label = re.split(r'(? Date: Tue, 12 Dec 2023 13:53:04 -0800 Subject: [PATCH 172/271] Fixes #14081: Fix cached counters on delete for parent-child items (#14131) * 14081 fixed cached counters on delete for parent-child items * Misc cleanup --------- Co-authored-by: Jeremy Stretch --- netbox/utilities/counters.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/netbox/utilities/counters.py b/netbox/utilities/counters.py index 0ee2606db..589dacbdb 100644 --- a/netbox/utilities/counters.py +++ b/netbox/utilities/counters.py @@ -1,6 +1,6 @@ from django.apps import apps from django.db.models import F, Count, OuterRef, Subquery -from django.db.models.signals import post_delete, post_save +from django.db.models.signals import post_delete, post_save, pre_delete from netbox.registry import registry from .fields import CounterCacheField @@ -62,6 +62,12 @@ def post_save_receiver(sender, instance, created, **kwargs): update_counter(parent_model, new_pk, counter_name, 1) +def pre_delete_receiver(sender, instance, origin, **kwargs): + model = instance._meta.model + if not model.objects.filter(pk=instance.pk).exists(): + instance._previously_removed = True + + def post_delete_receiver(sender, instance, origin, **kwargs): """ Update counter fields on related objects when a TrackingModelMixin subclass is deleted. @@ -71,10 +77,8 @@ def post_delete_receiver(sender, instance, origin, **kwargs): parent_pk = getattr(instance, field_name, None) # Decrement the parent's counter by one - if parent_pk is not None: - # MPTT sends two delete signals for child elements so guard against multiple decrements - if not origin or origin == instance: - update_counter(parent_model, parent_pk, counter_name, -1) + if parent_pk is not None and not hasattr(instance, "_previously_removed"): + update_counter(parent_model, parent_pk, counter_name, -1) # @@ -106,6 +110,12 @@ def connect_counters(*models): weak=False, dispatch_uid=f'{model._meta.label}.{field.name}' ) + pre_delete.connect( + pre_delete_receiver, + sender=to_model, + weak=False, + dispatch_uid=f'{model._meta.label}.{field.name}' + ) post_delete.connect( post_delete_receiver, sender=to_model, From 69bf1472d2e80bc2916020b06cb71d87eb9ccfaa Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Thu, 14 Dec 2023 12:18:56 -0800 Subject: [PATCH 173/271] 13983 Add nested arrays for extra_choices in CustomFieldChoiceSet (#14470) * 13983 split array fields in CSV data for CustomFieldChoices * 13983 fix help text * 13983 update tests * 13983 use re for split * 13983 replace escaped chars * 13983 fix escape handling * 13983 fix escape handling * 13983 fix escape handling --- netbox/extras/forms/bulk_import.py | 20 +++++++++++++++++++- netbox/extras/forms/model_forms.py | 14 ++++++++++++++ netbox/extras/tests/test_views.py | 12 +++++++++--- 3 files changed, 42 insertions(+), 4 deletions(-) diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index 79023a74d..745268f33 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -1,3 +1,5 @@ +import re + from django import forms from django.contrib.contenttypes.models import ContentType from django.contrib.postgres.forms import SimpleArrayField @@ -76,7 +78,10 @@ class CustomFieldChoiceSetImportForm(CSVModelForm): extra_choices = SimpleArrayField( base_field=forms.CharField(), required=False, - help_text=_('Comma-separated list of field choices') + help_text=_( + 'Quoted string of comma-separated field choices with optional labels separated by colon: ' + '"choice1:First Choice,choice2:Second Choice"' + ) ) class Meta: @@ -85,6 +90,19 @@ class CustomFieldChoiceSetImportForm(CSVModelForm): 'name', 'description', 'extra_choices', 'order_alphabetically', ) + def clean_extra_choices(self): + if isinstance(self.cleaned_data['extra_choices'], list): + data = [] + for line in self.cleaned_data['extra_choices']: + try: + value, label = re.split(r'(? Date: Thu, 14 Dec 2023 13:33:11 -0500 Subject: [PATCH 174/271] Fixes #14512: Omit unused queryset annotations for REST API requests using brief mode --- netbox/netbox/api/viewsets/mixins.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/api/viewsets/mixins.py b/netbox/netbox/api/viewsets/mixins.py index fde486fe9..315563e1a 100644 --- a/netbox/netbox/api/viewsets/mixins.py +++ b/netbox/netbox/api/viewsets/mixins.py @@ -56,8 +56,15 @@ class BriefModeMixin: def get_queryset(self): qs = super().get_queryset() - # If using brief mode, clear all prefetches from the queryset and append only brief_prefetch_fields (if any) if self.brief: + serializer_class = self.get_serializer_class() + + # Clear any annotations for fields not present on the nested serializer + for annotation in list(qs.query.annotations.keys()): + if annotation not in serializer_class().fields: + qs.query.annotations.pop(annotation) + + # Clear any prefetches from the queryset and append only brief_prefetch_fields (if any) return qs.prefetch_related(None).prefetch_related(*self.brief_prefetch_fields) return qs From 8a4233aca15e9aa62ac9b72bb5db304807cb1240 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Thu, 14 Dec 2023 08:08:09 -0600 Subject: [PATCH 175/271] Update create_userconfig to receive signals from NetBoxUser model in addition to User model. --- netbox/users/models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/users/models.py b/netbox/users/models.py index 80fd0dd09..e9ee85960 100644 --- a/netbox/users/models.py +++ b/netbox/users/models.py @@ -218,6 +218,7 @@ class UserConfig(models.Model): @receiver(post_save, sender=User) +@receiver(post_save, sender=NetBoxUser) def create_userconfig(instance, created, raw=False, **kwargs): """ Automatically create a new UserConfig when a new User is created. Skip this if importing a user from a fixture. From d14e4ab52ba6e9ed537d576b193169b4e1a34bd2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 14 Dec 2023 17:12:29 -0500 Subject: [PATCH 176/271] Changelog for #13983, #14081, #14148, #14467, #14505, #14512, #14515 --- docs/release-notes/version-3.6.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index a4234f8dd..b8d237ce1 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -4,16 +4,23 @@ ### Enhancements +* [#14148](https://github.com/netbox-community/netbox/issues/14148) - Add tags column to L2VPN terminations column * [#14390](https://github.com/netbox-community/netbox/issues/14390) - Add `classes` parameter to `copy_content` template tag +* [#14467](https://github.com/netbox-community/netbox/issues/14467) - Change custom field choice delimiter from comma to colon ### Bug Fixes +* [#13983](https://github.com/netbox-community/netbox/issues/13983) - Fix bulk import support for custom field choices +* [#14081](https://github.com/netbox-community/netbox/issues/14081) - Ensure accuracy of parent object counters when deleting related objects * [#14249](https://github.com/netbox-community/netbox/issues/14249) - Fix server error when authenticating via IP-restricted API tokens using IPv6 * [#14392](https://github.com/netbox-community/netbox/issues/14392) - Fix bulk operations for plugin models under admin UI * [#14397](https://github.com/netbox-community/netbox/issues/14397) - Fix exception on non-JSON request to `/available-ips/` API endpoints * [#14401](https://github.com/netbox-community/netbox/issues/14401) - Rack `starting_unit` cannot be zero * [#14432](https://github.com/netbox-community/netbox/issues/14432) - Populate custom field default values for components when creating a device * [#14448](https://github.com/netbox-community/netbox/issues/14448) - Fix exception when creating a power feed with rack and panel in different sites +* [#14505](https://github.com/netbox-community/netbox/issues/14505) - Fix the assignment of tags to L2VPN terminations +* [#14512](https://github.com/netbox-community/netbox/issues/14512) - Remove unneeded annotations from queries when using REST API brief mode +* [#14515](https://github.com/netbox-community/netbox/issues/14515) - Ensure user config is created automatically for all user accounts --- From 929d4d2c95d7ed4a1ffdd8f56437ce316917d62e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 14 Dec 2023 16:58:11 -0500 Subject: [PATCH 177/271] Fixes #14522: Fix filtering contact assignments by group --- netbox/tenancy/filtersets.py | 13 +++++ netbox/tenancy/tests/test_filtersets.py | 71 +++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/netbox/tenancy/filtersets.py b/netbox/tenancy/filtersets.py index 0f4900f54..8bc659a88 100644 --- a/netbox/tenancy/filtersets.py +++ b/netbox/tenancy/filtersets.py @@ -91,6 +91,19 @@ class ContactAssignmentFilterSet(ChangeLoggedModelFilterSet): queryset=Contact.objects.all(), label=_('Contact (ID)'), ) + group_id = TreeNodeMultipleChoiceFilter( + queryset=ContactGroup.objects.all(), + field_name='contact__group', + lookup_expr='in', + label=_('Contact group (ID)'), + ) + group = TreeNodeMultipleChoiceFilter( + queryset=ContactGroup.objects.all(), + field_name='contact__group', + lookup_expr='in', + to_field_name='slug', + label=_('Contact group (slug)'), + ) role_id = django_filters.ModelMultipleChoiceFilter( queryset=ContactRole.objects.all(), label=_('Contact role (ID)'), diff --git a/netbox/tenancy/tests/test_filtersets.py b/netbox/tenancy/tests/test_filtersets.py index e427c90ce..d7337396e 100644 --- a/netbox/tenancy/tests/test_filtersets.py +++ b/netbox/tenancy/tests/test_filtersets.py @@ -1,5 +1,7 @@ +from django.contrib.contenttypes.models import ContentType from django.test import TestCase +from dcim.models import Manufacturer, Site from tenancy.filtersets import * from tenancy.models import * from utilities.testing import ChangeLoggedFilterSetTests @@ -192,3 +194,72 @@ class ContactTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) params = {'group': [group[0].slug, group[1].slug]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class ContactAssignmentTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = ContactAssignment.objects.all() + filterset = ContactAssignmentFilterSet + + @classmethod + def setUpTestData(cls): + + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + sites = ( + Site(name='Site 1', slug='site-1'), + Site(name='Site 2', slug='site-2'), + Site(name='Site 3', slug='site-3'), + ) + Site.objects.bulk_create(sites) + + contact_groups = ( + ContactGroup(name='Contact Group 1', slug='contact-group-1'), + ContactGroup(name='Contact Group 2', slug='contact-group-2'), + ContactGroup(name='Contact Group 3', slug='contact-group-3'), + ) + for contactgroup in contact_groups: + contactgroup.save() + + contact_roles = ( + ContactRole(name='Contact Role 1', slug='contact-role-1'), + ContactRole(name='Contact Role 2', slug='contact-role-2'), + ContactRole(name='Contact Role 3', slug='contact-role-3'), + ) + ContactRole.objects.bulk_create(contact_roles) + + contacts = ( + Contact(name='Contact 1', group=contact_groups[0]), + Contact(name='Contact 2', group=contact_groups[1]), + Contact(name='Contact 3', group=contact_groups[2]), + ) + Contact.objects.bulk_create(contacts) + + assignments = ( + ContactAssignment(object=sites[0], contact=contacts[0], role=contact_roles[0]), + ContactAssignment(object=sites[1], contact=contacts[1], role=contact_roles[1]), + ContactAssignment(object=sites[2], contact=contacts[2], role=contact_roles[2]), + ContactAssignment(object=manufacturer, contact=contacts[2], role=contact_roles[2]), + ) + ContactAssignment.objects.bulk_create(assignments) + + def test_content_type(self): + params = {'content_type_id': ContentType.objects.get_by_natural_key('dcim', 'site')} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + + def test_contact(self): + contacts = Contact.objects.all()[:2] + params = {'contact_id': [contacts[0].pk, contacts[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_group(self): + group = ContactGroup.objects.all()[:2] + params = {'group_id': [group[0].pk, group[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'group': [group[0].slug, group[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_role(self): + role = ContactRole.objects.all()[:2] + params = {'role_id': [role[0].pk, role[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'role': [role[0].slug, role[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) From c81869c795160c01e052533f65ca8461d337f969 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 15 Dec 2023 08:21:34 -0500 Subject: [PATCH 178/271] Fixes #14533: Fix quick search under VLAN group VLANs list --- netbox/ipam/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 48ea637d9..1de53b6d2 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -953,7 +953,7 @@ class VLANGroupVLANsView(generic.ObjectChildrenView): def prep_table_data(self, request, queryset, parent): if not get_table_ordering(request, self.table): - return add_available_vlans(parent.get_child_vlans(), parent) + return add_available_vlans(queryset, parent) return queryset From 224d64007ad4205c5a567e42c608bf5d2a4bf189 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 15 Dec 2023 12:17:45 -0800 Subject: [PATCH 179/271] 14147 Prevent logging to Change Log when no changes are made (#14477) * 14147 Prevent logging to Change Log when no changes are made * 14147 add test * 14147 add exclude_fields to serialize_object * 14147 make skip empty default to True * 14147 remove override of to_objectchange * Misc cleanup --------- Co-authored-by: Jeremy Stretch --- docs/configuration/miscellaneous.md | 11 +++++ netbox/extras/models/change_logging.py | 4 ++ netbox/extras/signals.py | 7 +-- netbox/extras/tests/test_changelog.py | 61 ++++++++++++++++++++++++++ netbox/netbox/models/features.py | 21 +++++++-- netbox/netbox/settings.py | 1 + netbox/utilities/utils.py | 21 ++++++--- 7 files changed, 112 insertions(+), 14 deletions(-) diff --git a/docs/configuration/miscellaneous.md b/docs/configuration/miscellaneous.md index f143be139..2582b1928 100644 --- a/docs/configuration/miscellaneous.md +++ b/docs/configuration/miscellaneous.md @@ -80,6 +80,17 @@ changes in the database indefinitely. --- +## CHANGELOG_SKIP_EMPTY_CHANGES + +Default: True + +If enabled, a change log record will not be created when an object is updated without any changes to its existing field values. + +!!! note + The object's `last_updated` field will always reflect the time of the most recent update, regardless of this parameter. + +--- + ## DATA_UPLOAD_MAX_MEMORY_SIZE Default: `2621440` (2.5 MB) diff --git a/netbox/extras/models/change_logging.py b/netbox/extras/models/change_logging.py index 7befed095..0155849aa 100644 --- a/netbox/extras/models/change_logging.py +++ b/netbox/extras/models/change_logging.py @@ -135,3 +135,7 @@ class ObjectChange(models.Model): def get_action_color(self): return ObjectChangeActionChoices.colors.get(self.action) + + @property + def has_changes(self): + return self.prechange_data != self.postchange_data diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index 42204f86e..da0b635ff 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -80,9 +80,10 @@ def handle_changed_object(sender, instance, **kwargs): ) else: objectchange = instance.to_objectchange(action) - objectchange.user = request.user - objectchange.request_id = request.id - objectchange.save() + if objectchange and objectchange.has_changes: + objectchange.user = request.user + objectchange.request_id = request.id + objectchange.save() # If this is an M2M change, update the previously queued webhook (from post_save) queue = events_queue.get() diff --git a/netbox/extras/tests/test_changelog.py b/netbox/extras/tests/test_changelog.py index 34fd72b2b..e144c5dee 100644 --- a/netbox/extras/tests/test_changelog.py +++ b/netbox/extras/tests/test_changelog.py @@ -1,4 +1,5 @@ from django.contrib.contenttypes.models import ContentType +from django.test import override_settings from django.urls import reverse from rest_framework import status @@ -207,6 +208,66 @@ class ChangeLogViewTest(ModelViewTestCase): self.assertEqual(objectchange.prechange_data['slug'], sites[0].slug) self.assertEqual(objectchange.postchange_data, None) + @override_settings(CHANGELOG_SKIP_EMPTY_CHANGES=False) + def test_update_object_change(self): + # Create a Site + site = Site.objects.create( + name='Site 1', + slug='site-1', + status=SiteStatusChoices.STATUS_PLANNED, + custom_field_data={ + 'cf1': None, + 'cf2': None + } + ) + + # Update it with the same field values + form_data = { + 'name': site.name, + 'slug': site.slug, + 'status': SiteStatusChoices.STATUS_PLANNED, + } + request = { + 'path': self._get_url('edit', instance=site), + 'data': post_data(form_data), + } + self.add_permissions('dcim.change_site', 'extras.view_tag') + response = self.client.post(**request) + self.assertHttpStatus(response, 302) + + # Check that an ObjectChange record has been created + self.assertEqual(ObjectChange.objects.count(), 1) + + @override_settings(CHANGELOG_SKIP_EMPTY_CHANGES=True) + def test_update_object_nochange(self): + # Create a Site + site = Site.objects.create( + name='Site 1', + slug='site-1', + status=SiteStatusChoices.STATUS_PLANNED, + custom_field_data={ + 'cf1': None, + 'cf2': None + } + ) + + # Update it with the same field values + form_data = { + 'name': site.name, + 'slug': site.slug, + 'status': SiteStatusChoices.STATUS_PLANNED, + } + request = { + 'path': self._get_url('edit', instance=site), + 'data': post_data(form_data), + } + self.add_permissions('dcim.change_site', 'extras.view_tag') + response = self.client.post(**request) + self.assertHttpStatus(response, 302) + + # Check that no ObjectChange records have been created + self.assertEqual(ObjectChange.objects.count(), 0) + class ChangeLogAPITest(APITestCase): diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index 8b0b477dc..0cba27318 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -15,6 +15,7 @@ from core.choices import JobStatusChoices from core.models import ContentType from extras.choices import * from extras.utils import is_taggable, register_features +from netbox.config import get_config from netbox.registry import registry from netbox.signals import post_clean from utilities.json import CustomFieldJSONEncoder @@ -63,19 +64,26 @@ class ChangeLoggingMixin(models.Model): class Meta: abstract = True - def serialize_object(self): + def serialize_object(self, exclude=None): """ Return a JSON representation of the instance. Models can override this method to replace or extend the default serialization logic provided by the `serialize_object()` utility function. + + Args: + exclude: An iterable of attribute names to omit from the serialized output """ - return serialize_object(self) + return serialize_object(self, exclude=exclude or []) def snapshot(self): """ Save a snapshot of the object's current state in preparation for modification. The snapshot is saved as `_prechange_snapshot` on the instance. """ - self._prechange_snapshot = self.serialize_object() + exclude_fields = [] + if get_config().CHANGELOG_SKIP_EMPTY_CHANGES: + exclude_fields = ['last_updated',] + + self._prechange_snapshot = self.serialize_object(exclude=exclude_fields) snapshot.alters_data = True def to_objectchange(self, action): @@ -84,6 +92,11 @@ class ChangeLoggingMixin(models.Model): by ChangeLoggingMiddleware. """ from extras.models import ObjectChange + + exclude = [] + if get_config().CHANGELOG_SKIP_EMPTY_CHANGES: + exclude = ['last_updated'] + objectchange = ObjectChange( changed_object=self, object_repr=str(self)[:200], @@ -92,7 +105,7 @@ class ChangeLoggingMixin(models.Model): if hasattr(self, '_prechange_snapshot'): objectchange.prechange_data = self._prechange_snapshot if action in (ObjectChangeActionChoices.ACTION_CREATE, ObjectChangeActionChoices.ACTION_UPDATE): - objectchange.postchange_data = self.serialize_object() + objectchange.postchange_data = self.serialize_object(exclude=exclude) return objectchange diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index e2cf1cd8c..59e507d28 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -177,6 +177,7 @@ STORAGE_CONFIG = getattr(configuration, 'STORAGE_CONFIG', {}) TIME_FORMAT = getattr(configuration, 'TIME_FORMAT', 'g:i a') TIME_ZONE = getattr(configuration, 'TIME_ZONE', 'UTC') ENABLE_LOCALIZATION = getattr(configuration, 'ENABLE_LOCALIZATION', False) +CHANGELOG_SKIP_EMPTY_CHANGES = getattr(configuration, 'CHANGELOG_SKIP_EMPTY_CHANGES', True) # Check for hard-coded dynamic config parameters for param in PARAMS: diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index 2d11810fc..f3f8c7c50 100644 --- a/netbox/utilities/utils.py +++ b/netbox/utilities/utils.py @@ -144,15 +144,23 @@ def count_related(model, field): return Coalesce(subquery, 0) -def serialize_object(obj, resolve_tags=True, extra=None): +def serialize_object(obj, resolve_tags=True, extra=None, exclude=None): """ Return a generic JSON representation of an object using Django's built-in serializer. (This is used for things like change logging, not the REST API.) Optionally include a dictionary to supplement the object data. A list of keys can be provided to exclude them from the returned dictionary. Private fields (prefaced with an underscore) are implicitly excluded. + + Args: + obj: The object to serialize + resolve_tags: If true, any assigned tags will be represented by their names + extra: Any additional data to include in the serialized output. Keys provided in this mapping will + override object attributes. + exclude: An iterable of attributes to exclude from the serialized output """ json_str = serializers.serialize('json', [obj]) data = json.loads(json_str)[0]['fields'] + exclude = exclude or [] # Exclude any MPTTModel fields if issubclass(obj.__class__, MPTTModel): @@ -169,16 +177,15 @@ def serialize_object(obj, resolve_tags=True, extra=None): tags = getattr(obj, '_tags', None) or obj.tags.all() data['tags'] = sorted([tag.name for tag in tags]) + # Skip excluded and private (prefixes with an underscore) attributes + for key in list(data.keys()): + if key in exclude or (isinstance(key, str) and key.startswith('_')): + data.pop(key) + # Append any extra data if extra is not None: data.update(extra) - # Copy keys to list to avoid 'dictionary changed size during iteration' exception - for key in list(data): - # Private fields shouldn't be logged in the object change - if isinstance(key, str) and key.startswith('_'): - data.pop(key) - return data From 3068f2a075d38e30a00dda4e398f3fcc5fb802f7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 15 Dec 2023 15:21:38 -0500 Subject: [PATCH 180/271] Changelog for #14147, #14424, #14436, #14458 --- docs/release-notes/version-3.7.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 0b57b829c..8bb5c1b60 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -65,9 +65,11 @@ Plugins can now [register their own data backends](../plugins/development/data-b * [#13794](https://github.com/netbox-community/netbox/issues/13794) - Any models with a relationship to Tenant are now included automatically in the list of related objects under the tenant view * [#13808](https://github.com/netbox-community/netbox/issues/13808) - Added a `/render-config` REST API endpoint for virtual machines * [#14035](https://github.com/netbox-community/netbox/issues/14035) - Order objects of equivalent weight by value in global search results to improve readability +* [#14147](https://github.com/netbox-community/netbox/issues/14147) - Avoid recording empty changelog entries (and introduce `CHANGELOG_SKIP_EMPTY_CHANGES` config parameter) * [#14156](https://github.com/netbox-community/netbox/issues/14156) - Enable custom fields for contact assignments * [#14361](https://github.com/netbox-community/netbox/issues/14361) - Add a `description` field for webhooks * [#14365](https://github.com/netbox-community/netbox/issues/14365) - Introduced `job_start` and `job_end` signals +* [#14436](https://github.com/netbox-community/netbox/issues/14436) - Add PostgreSQL indexes for all GenericForeignKey fields ### Other Changes @@ -79,6 +81,8 @@ Plugins can now [register their own data backends](../plugins/development/data-b * [#14312](https://github.com/netbox-community/netbox/issues/14312) - Move the ConfigRevision model from the `extras` app to `core` * [#14326](https://github.com/netbox-community/netbox/issues/14326) - Form feature mixin classes have been moved from the `extras` app to `netbox` * [#14395](https://github.com/netbox-community/netbox/issues/14395) - Moved `extras.webhooks_worker.process_webhook()` to `extras.webhooks.send_webhook()` (backward compatibility has been retained) +* [#14424](https://github.com/netbox-community/netbox/issues/14424) - Remove change logging functionality from StagedChange +* [#14458](https://github.com/netbox-community/netbox/issues/14458) - Remove the obsolete `clearcache` management command ### REST API Changes From 8d391818429c4b2728de1bab42b52de31d2e8830 Mon Sep 17 00:00:00 2001 From: kkthxbye <400797+kkthxbye-code@users.noreply.github.com> Date: Fri, 15 Dec 2023 22:07:15 +0100 Subject: [PATCH 181/271] Fixes #12751 - Usability improvements for object selector (#14387) * Usability improvements for object selector: * Adds preselected filters * Applies the filter on selection instead of requiring the search button to be pushed * Declare selector_fields on base form class --------- Co-authored-by: Jeremy Stretch --- netbox/circuits/forms/filtersets.py | 1 + netbox/dcim/forms/filtersets.py | 8 ++++++++ netbox/ipam/forms/filtersets.py | 2 ++ netbox/netbox/forms/base.py | 4 ++++ netbox/project-static/dist/netbox.js | Bin 529867 -> 529929 bytes netbox/project-static/dist/netbox.js.map | Bin 450255 -> 450302 bytes .../src/select/api/apiSelect.ts | 5 +++++ netbox/templates/htmx/object_selector.html | 6 +++--- netbox/virtualization/forms/filtersets.py | 2 ++ 9 files changed, 25 insertions(+), 3 deletions(-) diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 1fb239023..643071be8 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -110,6 +110,7 @@ class CircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFi (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) + selector_fields = ('filter_id', 'q', 'region_id', 'site_group_id', 'site_id', 'provider_id', 'provider_network_id') type_id = DynamicModelMultipleChoiceField( queryset=CircuitType.objects.all(), required=False, diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index d0d321187..41bb417aa 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -164,6 +164,7 @@ class SiteFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilte (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) + selector_fields = ('filter_id', 'q', 'region_id', 'group_id') status = forms.MultipleChoiceField( label=_('Status'), choices=SiteStatusChoices, @@ -247,6 +248,7 @@ class RackFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilte (_('Contacts'), ('contact', 'contact_role', 'contact_group')), (_('Weight'), ('weight', 'max_weight', 'weight_unit')), ) + selector_fields = ('filter_id', 'q', 'region_id', 'site_group_id', 'site_id', 'location_id') region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -419,6 +421,7 @@ class DeviceTypeFilterForm(NetBoxModelFilterSetForm): )), (_('Weight'), ('weight', 'weight_unit')), ) + selector_fields = ('filter_id', 'q', 'manufacturer_id') manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), required=False, @@ -543,6 +546,7 @@ class ModuleTypeFilterForm(NetBoxModelFilterSetForm): )), (_('Weight'), ('weight', 'weight_unit')), ) + selector_fields = ('filter_id', 'q', 'manufacturer_id') manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), required=False, @@ -619,6 +623,7 @@ class DeviceRoleFilterForm(NetBoxModelFilterSetForm): class PlatformFilterForm(NetBoxModelFilterSetForm): model = Platform + selector_fields = ('filter_id', 'q', 'manufacturer_id') manufacturer_id = DynamicModelMultipleChoiceField( queryset=Manufacturer.objects.all(), required=False, @@ -653,6 +658,7 @@ class DeviceFilterForm( 'has_primary_ip', 'has_oob_ip', 'virtual_chassis_member', 'config_template_id', 'local_context_data', )) ) + selector_fields = ('filter_id', 'q', 'region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id') region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -996,6 +1002,7 @@ class PowerPanelFilterForm(ContactModelFilterForm, NetBoxModelFilterSetForm): (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id')), (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) + selector_fields = ('filter_id', 'q', 'site_id', 'location_id') region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, @@ -1227,6 +1234,7 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id', 'vdc_id')), (_('Connection'), ('cabled', 'connected', 'occupied')), ) + selector_fields = ('filter_id', 'q', 'device_id') vdc_id = DynamicModelMultipleChoiceField( queryset=VirtualDeviceContext.objects.all(), required=False, diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index a8ca91901..b72788387 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -300,6 +300,7 @@ class IPAddressFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Device/VM'), ('device_id', 'virtual_machine_id')), ) + selector_fields = ('filter_id', 'q', 'region_id', 'group_id', 'parent', 'status', 'role') parent = forms.CharField( required=False, widget=forms.TextInput( @@ -452,6 +453,7 @@ class VLANFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): (_('Attributes'), ('group_id', 'status', 'role_id', 'vid', 'l2vpn_id')), (_('Tenant'), ('tenant_group_id', 'tenant_id')), ) + selector_fields = ('filter_id', 'q', 'site_id') region_id = DynamicModelMultipleChoiceField( queryset=Region.objects.all(), required=False, diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 43d0850f0..51e664a39 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -145,12 +145,16 @@ class NetBoxModelFilterSetForm(BootstrapMixin, CustomFieldsMixin, SavedFiltersMi model: The model class associated with the form fieldsets: An iterable of two-tuples which define a heading and field set to display per section of the rendered form (optional). If not defined, the all fields will be rendered as a single section. + selector_fields: An iterable of names of fields to display by default when rendering the form as + a selector widget """ q = forms.CharField( required=False, label=_('Search') ) + selector_fields = ('filter_id', 'q') + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 426302ea83c97ad0ae968919b4ede00f323f214e..97c4ba79c3e5b51b62097e2d1b2dbf904da8a917 100644 GIT binary patch delta 56 zcmV-80LTB!t00N2Ab^AcgaU*Egam{Iv<4!|m-J!<6A2=7Xm58SDJCYD=gI~immlH< O7Kb#-2DdcI2bW7sdK85K delta 36 scmeBNqi}k)LPHB<3sVbo3rh>@7B;0*)0H2w3bhxVV%uJHiha5_00L7E4FCWD diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 077c4bcc0b0e1e6c7dbb1eb1722ea94132e260b2..bbb2a3cc01cdba0309a6ead9b117254ba9d182be 100644 GIT binary patch delta 115 zcmX@VSNh*x>4p}@7N!>F7M3ln>(3gyM(B7tItJ^6Iy#2x1cO+?j?R`&I)RRkfgl-A z9cM>JXB}@xM{k`(N8bV`9rx*iUzo+WpE}F>O@u3>(y7W>$KNrta{H-AtiJ3ldD>3K Q)6d(mifuQ1#X9c`0J+*HXaE2J delta 68 zcmV-K0K5PGy&KQH8-RoXgaU*Egaot&ugwHWW-LjU5%dEWxB1Nl_7n;;ctUzZEKfl+ ac(?iD1x*J8IXOZzm(M%}7PnyP1)lV-*Bbr+ diff --git a/netbox/project-static/src/select/api/apiSelect.ts b/netbox/project-static/src/select/api/apiSelect.ts index 53996910e..279340c12 100644 --- a/netbox/project-static/src/select/api/apiSelect.ts +++ b/netbox/project-static/src/select/api/apiSelect.ts @@ -264,6 +264,11 @@ export class APISelect { switch (this.trigger) { case 'collapse': if (collapse !== null) { + // If the element is collapsible but already shown, load the data immediately. + if (collapse.classList.contains('show')) { + Promise.all([this.loadData()]); + } + // If this element is part of a collapsible element, only load the data when the // collapsible element is shown. // See: https://getbootstrap.com/docs/5.0/components/collapse/#events diff --git a/netbox/templates/htmx/object_selector.html b/netbox/templates/htmx/object_selector.html index 0febb1069..280102ada 100644 --- a/netbox/templates/htmx/object_selector.html +++ b/netbox/templates/htmx/object_selector.html @@ -10,18 +10,18 @@
    - +
    {% for field in form.visible_fields %} -
    {% render_field field %}
    +
    {% render_field field %}
    {% endfor %}
    diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 99ac0cb77..4028bcc64 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -44,6 +44,7 @@ class ClusterFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFi (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Contacts'), ('contact', 'contact_role', 'contact_group')), ) + selector_fields = ('filter_id', 'q', 'group_id') type_id = DynamicModelMultipleChoiceField( queryset=ClusterType.objects.all(), required=False, @@ -186,6 +187,7 @@ class VMInterfaceFilterForm(NetBoxModelFilterSetForm): (_('Virtual Machine'), ('cluster_id', 'virtual_machine_id')), (_('Attributes'), ('enabled', 'mac_address', 'vrf_id', 'l2vpn_id')), ) + selector_fields = ('filter_id', 'q', 'virtual_machine_id') cluster_id = DynamicModelMultipleChoiceField( queryset=Cluster.objects.all(), required=False, From 4cdc30a7c524ba01cb85eaf3801e11293d16f09c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 15 Dec 2023 16:25:24 -0500 Subject: [PATCH 182/271] Release v3.6.7 --- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- docs/release-notes/version-3.6.md | 5 ++++- netbox/netbox/settings.py | 2 +- requirements.txt | 18 +++++++++--------- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index dcc3f0a97..974527bd3 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -23,7 +23,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v3.6.6 + placeholder: v3.6.7 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 34103e616..9fb14742a 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.6.6 + placeholder: v3.6.7 validations: required: true - type: dropdown diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index b8d237ce1..3478eb081 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -1,9 +1,10 @@ # NetBox v3.6 -## v3.6.7 (FUTURE) +## v3.6.7 (2023-12-15) ### Enhancements +* [#12751](https://github.com/netbox-community/netbox/issues/12751) - Designate fields to expand by default for object selector widget * [#14148](https://github.com/netbox-community/netbox/issues/14148) - Add tags column to L2VPN terminations column * [#14390](https://github.com/netbox-community/netbox/issues/14390) - Add `classes` parameter to `copy_content` template tag * [#14467](https://github.com/netbox-community/netbox/issues/14467) - Change custom field choice delimiter from comma to colon @@ -21,6 +22,8 @@ * [#14505](https://github.com/netbox-community/netbox/issues/14505) - Fix the assignment of tags to L2VPN terminations * [#14512](https://github.com/netbox-community/netbox/issues/14512) - Remove unneeded annotations from queries when using REST API brief mode * [#14515](https://github.com/netbox-community/netbox/issues/14515) - Ensure user config is created automatically for all user accounts +* [#14522](https://github.com/netbox-community/netbox/issues/14522) - Fix filtering contact assignments by group +* [#14533](https://github.com/netbox-community/netbox/issues/14533) - Fix quick search under VLAN group VLANs list --- diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 824bc4605..9cc6820bd 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -25,7 +25,7 @@ from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW # Environment setup # -VERSION = '3.6.7-dev' +VERSION = '3.6.7' # Hostname HOSTNAME = platform.node() diff --git a/requirements.txt b/requirements.txt index b99f16e76..b2771b445 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ bleach==6.1.0 -Django==4.2.7 +Django==4.2.8 django-cors-headers==4.3.1 django-debug-toolbar==4.2.0 -django-filter==23.4 +django-filter==23.5 django-graphiql-debug-toolbar==0.2.0 django-mptt==0.14.0 django-pglocks==1.0.4 @@ -10,25 +10,25 @@ django-prometheus==2.3.1 django-redis==5.4.0 django-rich==1.8.0 django-rq==2.9.0 -django-tables2==2.6.0 +django-tables2==2.7.0 django-taggit==4.0.0 django-timezone-field==6.1.0 djangorestframework==3.14.0 -drf-spectacular==0.26.5 -drf-spectacular-sidecar==2023.10.1 -feedparser==6.0.10 +drf-spectacular==0.27.0 +drf-spectacular-sidecar==2023.12.1 +feedparser==6.0.11 graphene-django==3.0.0 gunicorn==21.2.0 Jinja2==3.1.2 Markdown==3.3.7 -mkdocs-material==9.4.14 +mkdocs-material==9.5.2 mkdocstrings[python-legacy]==0.24.0 netaddr==0.9.0 Pillow==10.1.0 -psycopg[binary,pool]==3.1.13 +psycopg[binary,pool]==3.1.15 PyYAML==6.0.1 requests==2.31.0 -sentry-sdk==1.38.0 +sentry-sdk==1.39.1 social-auth-app-django==5.4.0 social-auth-core[openidconnect]==4.5.1 svgwrite==1.4.3 From ec245b968f50bdbafaadd5d6b885832d858fa167 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 15 Dec 2023 16:46:53 -0500 Subject: [PATCH 183/271] PRVB --- docs/release-notes/version-3.6.md | 4 ++++ netbox/netbox/settings.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 3478eb081..fc2328897 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -1,5 +1,9 @@ # NetBox v3.6 +## v3.6.8 (FUTURE) + +--- + ## v3.6.7 (2023-12-15) ### Enhancements diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 9cc6820bd..3fd7f1122 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -25,7 +25,7 @@ from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW # Environment setup # -VERSION = '3.6.7' +VERSION = '3.6.8-dev' # Hostname HOSTNAME = platform.node() From 96878cfca6b6cc9aa4fd96a3979720e591bf3f66 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 19 Dec 2023 10:31:18 -0500 Subject: [PATCH 184/271] Closes #14551: Show assigned tunnel (if any) under interface view --- netbox/templates/dcim/interface.html | 12 ++++++++---- netbox/templates/virtualization/vminterface.html | 4 ++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/netbox/templates/dcim/interface.html b/netbox/templates/dcim/interface.html index f4cba49ee..6b15a766d 100644 --- a/netbox/templates/dcim/interface.html +++ b/netbox/templates/dcim/interface.html @@ -86,6 +86,14 @@ {% trans "Transmit power (dBm)" %} {{ object.tx_power|placeholder }} + + {% trans "Tunnel" %} + {{ object.tunnel_termination.tunnel|linkify|placeholder }} + + + {% trans "L2VPN" %} + {{ object.l2vpn_termination.l2vpn|linkify|placeholder }} +
    @@ -105,10 +113,6 @@ {% trans "LAG" %} {{ object.lag|linkify|placeholder }} - - {% trans "L2VPN" %} - {{ object.l2vpn_termination.l2vpn|linkify|placeholder }} - diff --git a/netbox/templates/virtualization/vminterface.html b/netbox/templates/virtualization/vminterface.html index b7cfb9b98..cf22ddf89 100644 --- a/netbox/templates/virtualization/vminterface.html +++ b/netbox/templates/virtualization/vminterface.html @@ -66,6 +66,10 @@ {% trans "802.1Q Mode" %} {{ object.get_mode_display|placeholder }} + + {% trans "Tunnel" %} + {{ object.tunnel_termination.tunnel|linkify|placeholder }} + From b794bd6fb83a4928b575a6406d8f3811a87391c9 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 19 Dec 2023 11:18:26 -0500 Subject: [PATCH 185/271] Fixes #14499: Relax requirements for encryption/auth algorithms on IKE & IPSec proposals --- docs/models/vpn/ikeproposal.md | 2 +- docs/models/vpn/ipsecproposal.md | 6 ++++++ netbox/vpn/migrations/0001_initial.py | 6 +++--- netbox/vpn/models/crypto.py | 17 ++++++++++++++--- 4 files changed, 24 insertions(+), 7 deletions(-) diff --git a/docs/models/vpn/ikeproposal.md b/docs/models/vpn/ikeproposal.md index dd8d75330..312ec1f6c 100644 --- a/docs/models/vpn/ikeproposal.md +++ b/docs/models/vpn/ikeproposal.md @@ -28,7 +28,7 @@ The protocol employed for data encryption. Options include DES, 3DES, and variou ### Authentication Algorithm -The mechanism employed to ensure data integrity. Options include MD5 and SHA HMAC implementations. +The mechanism employed to ensure data integrity. Options include MD5 and SHA HMAC implementations. Specifying an authentication algorithm is optional, as some encryption algorithms (e.g. AES-GCM) provide authentication natively. ### Group diff --git a/docs/models/vpn/ipsecproposal.md b/docs/models/vpn/ipsecproposal.md index d061b1535..ad3279d7a 100644 --- a/docs/models/vpn/ipsecproposal.md +++ b/docs/models/vpn/ipsecproposal.md @@ -12,10 +12,16 @@ The unique user-assigned name for the proposal. The protocol employed for data encryption. Options include DES, 3DES, and various flavors of AES. +!!! note + If an encryption algorithm is not specified, an authentication algorithm must be specified. + ### Authentication Algorithm The mechanism employed to ensure data integrity. Options include MD5 and SHA HMAC implementations. +!!! note + If an authentication algorithm is not specified, an encryption algorithm must be specified. + ### SA Lifetime (Seconds) The maximum amount of time for which the security association (SA) may be active, in seconds. diff --git a/netbox/vpn/migrations/0001_initial.py b/netbox/vpn/migrations/0001_initial.py index 20cedfe0d..681474837 100644 --- a/netbox/vpn/migrations/0001_initial.py +++ b/netbox/vpn/migrations/0001_initial.py @@ -29,7 +29,7 @@ class Migration(migrations.Migration): ('name', models.CharField(max_length=100, unique=True)), ('authentication_method', models.CharField()), ('encryption_algorithm', models.CharField()), - ('authentication_algorithm', models.CharField()), + ('authentication_algorithm', models.CharField(blank=True)), ('group', models.PositiveSmallIntegerField()), ('sa_lifetime', models.PositiveIntegerField(blank=True, null=True)), ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), @@ -82,8 +82,8 @@ class Migration(migrations.Migration): ('description', models.CharField(blank=True, max_length=200)), ('comments', models.TextField(blank=True)), ('name', models.CharField(max_length=100, unique=True)), - ('encryption_algorithm', models.CharField()), - ('authentication_algorithm', models.CharField()), + ('encryption_algorithm', models.CharField(blank=True)), + ('authentication_algorithm', models.CharField(blank=True)), ('sa_lifetime_seconds', models.PositiveIntegerField(blank=True, null=True)), ('sa_lifetime_data', models.PositiveIntegerField(blank=True, null=True)), ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), diff --git a/netbox/vpn/models/crypto.py b/netbox/vpn/models/crypto.py index 260f77940..f89c555e4 100644 --- a/netbox/vpn/models/crypto.py +++ b/netbox/vpn/models/crypto.py @@ -1,3 +1,4 @@ +from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ @@ -34,7 +35,8 @@ class IKEProposal(PrimaryModel): ) authentication_algorithm = models.CharField( verbose_name=_('authentication algorithm'), - choices=AuthenticationAlgorithmChoices + choices=AuthenticationAlgorithmChoices, + blank=True ) group = models.PositiveSmallIntegerField( verbose_name=_('group'), @@ -120,11 +122,13 @@ class IPSecProposal(PrimaryModel): ) encryption_algorithm = models.CharField( verbose_name=_('encryption'), - choices=EncryptionAlgorithmChoices + choices=EncryptionAlgorithmChoices, + blank=True ) authentication_algorithm = models.CharField( verbose_name=_('authentication'), - choices=AuthenticationAlgorithmChoices + choices=AuthenticationAlgorithmChoices, + blank=True ) sa_lifetime_seconds = models.PositiveIntegerField( verbose_name=_('SA lifetime (seconds)'), @@ -154,6 +158,13 @@ class IPSecProposal(PrimaryModel): def get_absolute_url(self): return reverse('vpn:ipsecproposal', args=[self.pk]) + def clean(self): + super().clean() + + # Encryption and/or authentication algorithm must be defined + if not self.encryption_algorithm and not self.authentication_algorithm: + raise ValidationError(_("Encryption and/or authentication algorithm must be defined")) + class IPSecPolicy(PrimaryModel): name = models.CharField( From a233dc91fe886babb84663aa04782b128cf973f0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 19 Dec 2023 15:17:21 -0500 Subject: [PATCH 186/271] Closes #14536: Enable ENFORCE_GLOBAL_UNIQUE by default --- docs/configuration/miscellaneous.md | 7 +++++-- netbox/ipam/tests/test_models.py | 5 ----- netbox/netbox/config/parameters.py | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/docs/configuration/miscellaneous.md b/docs/configuration/miscellaneous.md index 2582b1928..4d4ca189e 100644 --- a/docs/configuration/miscellaneous.md +++ b/docs/configuration/miscellaneous.md @@ -103,9 +103,12 @@ The maximum size (in bytes) of an incoming HTTP request (i.e. `GET` or `POST` da !!! tip "Dynamic Configuration Parameter" -Default: False +Default: True -By default, NetBox will permit users to create duplicate prefixes and IP addresses in the global table (that is, those which are not assigned to any VRF). This behavior can be disabled by setting `ENFORCE_GLOBAL_UNIQUE` to True. +By default, NetBox will prevent the creation of duplicate prefixes and IP addresses in the global table (that is, those which are not assigned to any VRF). This validation can be disabled by setting `ENFORCE_GLOBAL_UNIQUE` to False. + +!!! info "Changed in v3.7" + The default value for this parameter was changed from False to True in NetBox v3.7. --- diff --git a/netbox/ipam/tests/test_models.py b/netbox/ipam/tests/test_models.py index 5a37807a7..d0f42e8a6 100644 --- a/netbox/ipam/tests/test_models.py +++ b/netbox/ipam/tests/test_models.py @@ -232,7 +232,6 @@ class TestPrefix(TestCase): duplicate_prefix = Prefix(prefix=IPNetwork('192.0.2.0/24')) self.assertIsNone(duplicate_prefix.clean()) - @override_settings(ENFORCE_GLOBAL_UNIQUE=True) def test_duplicate_global_unique(self): Prefix.objects.create(prefix=IPNetwork('192.0.2.0/24')) duplicate_prefix = Prefix(prefix=IPNetwork('192.0.2.0/24')) @@ -471,7 +470,6 @@ class TestIPAddress(TestCase): duplicate_ip = IPAddress(address=IPNetwork('192.0.2.1/24')) self.assertIsNone(duplicate_ip.clean()) - @override_settings(ENFORCE_GLOBAL_UNIQUE=True) def test_duplicate_global_unique(self): IPAddress.objects.create(address=IPNetwork('192.0.2.1/24')) duplicate_ip = IPAddress(address=IPNetwork('192.0.2.1/24')) @@ -489,19 +487,16 @@ class TestIPAddress(TestCase): duplicate_ip = IPAddress(vrf=vrf, address=IPNetwork('192.0.2.1/24')) self.assertRaises(ValidationError, duplicate_ip.clean) - @override_settings(ENFORCE_GLOBAL_UNIQUE=True) def test_duplicate_nonunique_nonrole_role(self): IPAddress.objects.create(address=IPNetwork('192.0.2.1/24')) duplicate_ip = IPAddress(address=IPNetwork('192.0.2.1/24'), role=IPAddressRoleChoices.ROLE_VIP) self.assertRaises(ValidationError, duplicate_ip.clean) - @override_settings(ENFORCE_GLOBAL_UNIQUE=True) def test_duplicate_nonunique_role_nonrole(self): IPAddress.objects.create(address=IPNetwork('192.0.2.1/24'), role=IPAddressRoleChoices.ROLE_VIP) duplicate_ip = IPAddress(address=IPNetwork('192.0.2.1/24')) self.assertRaises(ValidationError, duplicate_ip.clean) - @override_settings(ENFORCE_GLOBAL_UNIQUE=True) def test_duplicate_nonunique_role(self): IPAddress.objects.create(address=IPNetwork('192.0.2.1/24'), role=IPAddressRoleChoices.ROLE_VIP) IPAddress.objects.create(address=IPNetwork('192.0.2.1/24'), role=IPAddressRoleChoices.ROLE_VIP) diff --git a/netbox/netbox/config/parameters.py b/netbox/netbox/config/parameters.py index 0cdf8a8d2..54c9027cc 100644 --- a/netbox/netbox/config/parameters.py +++ b/netbox/netbox/config/parameters.py @@ -66,7 +66,7 @@ PARAMS = ( ConfigParam( name='ENFORCE_GLOBAL_UNIQUE', label=_('Globally unique IP space'), - default=False, + default=True, description=_("Enforce unique IP addressing within the global table"), field=forms.BooleanField ), From 12beac4f1adc5be8dba927f9823e0bd904dcf60f Mon Sep 17 00:00:00 2001 From: Prince Kumar Date: Wed, 20 Dec 2023 22:03:00 +0530 Subject: [PATCH 187/271] fix the result of script jobs #14549 --- netbox/extras/management/commands/runscript.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/extras/management/commands/runscript.py b/netbox/extras/management/commands/runscript.py index d9a9f41ae..c9cedd3a5 100644 --- a/netbox/extras/management/commands/runscript.py +++ b/netbox/extras/management/commands/runscript.py @@ -114,7 +114,7 @@ class Command(BaseCommand): # Create the job job = Job.objects.create( object=module, - name=script.name, + name=script.class_name, user=User.objects.filter(is_superuser=True).order_by('pk')[0], job_id=uuid.uuid4() ) From 3cd2432aa1f249153879b62149afc8a9fd4554e9 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 21 Dec 2023 12:58:45 -0500 Subject: [PATCH 188/271] Rebuild source messages --- netbox/translations/en/LC_MESSAGES/django.po | 5740 ++++++++++-------- 1 file changed, 3289 insertions(+), 2451 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index b04e843f2..adc38c45e 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-10-30 17:19+0000\n" +"POT-Creation-Date: 2023-12-21 17:54+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -24,14 +24,14 @@ msgstr "" msgid "Key" msgstr "" -#: account/tables.py:31 users/forms/filtersets.py:135 +#: account/tables.py:31 users/forms/filtersets.py:133 msgid "Write Enabled" msgstr "" -#: account/tables.py:34 core/tables/jobs.py:28 extras/choices.py:124 +#: account/tables.py:34 core/tables/jobs.py:29 extras/choices.py:135 #: extras/tables/tables.py:469 templates/account/token.html:44 -#: templates/core/job.html:52 templates/extras/configrevision.html:34 -#: templates/extras/configrevision_restore.html:12 +#: templates/core/configrevision.html:34 +#: templates/core/configrevision_restore.html:12 templates/core/job.html:58 #: templates/extras/htmx/report_result.html:11 #: templates/extras/htmx/script_result.html:12 #: templates/extras/journalentry.html:25 templates/generic/object.html:48 @@ -41,11 +41,11 @@ msgstr "" #: account/tables.py:37 templates/account/token.html:48 #: templates/users/token.html:40 users/forms/bulk_edit.py:97 -#: users/forms/filtersets.py:139 +#: users/forms/filtersets.py:137 msgid "Expires" msgstr "" -#: account/tables.py:40 users/forms/filtersets.py:144 +#: account/tables.py:40 users/forms/filtersets.py:142 msgid "Last Used" msgstr "" @@ -58,11 +58,11 @@ msgstr "" #: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 #: dcim/choices.py:174 dcim/choices.py:220 dcim/choices.py:1419 #: dcim/choices.py:1495 dcim/choices.py:1545 virtualization/choices.py:20 -#: virtualization/choices.py:45 +#: virtualization/choices.py:45 vpn/choices.py:18 msgid "Planned" msgstr "" -#: circuits/choices.py:22 netbox/navigation/menu.py:271 +#: circuits/choices.py:22 netbox/navigation/menu.py:290 msgid "Provisioning" msgstr "" @@ -72,7 +72,7 @@ msgstr "" #: ipam/choices.py:49 ipam/choices.py:69 ipam/choices.py:154 #: templates/extras/configcontext.html:26 templates/users/user.html:34 #: users/forms/bulk_edit.py:36 virtualization/choices.py:22 -#: virtualization/choices.py:44 wireless/choices.py:25 +#: virtualization/choices.py:44 vpn/choices.py:19 wireless/choices.py:25 msgid "Active" msgstr "" @@ -90,95 +90,96 @@ msgstr "" msgid "Decommissioned" msgstr "" -#: circuits/filtersets.py:29 circuits/filtersets.py:182 dcim/filtersets.py:118 -#: dcim/filtersets.py:179 dcim/filtersets.py:254 dcim/filtersets.py:362 -#: dcim/filtersets.py:873 dcim/filtersets.py:1179 dcim/filtersets.py:1674 -#: dcim/filtersets.py:1847 dcim/filtersets.py:1904 ipam/filtersets.py:304 -#: ipam/filtersets.py:891 ipam/filtersets.py:1122 -#: virtualization/filtersets.py:43 virtualization/filtersets.py:169 +#: circuits/filtersets.py:29 circuits/filtersets.py:182 dcim/filtersets.py:120 +#: dcim/filtersets.py:181 dcim/filtersets.py:256 dcim/filtersets.py:364 +#: dcim/filtersets.py:881 dcim/filtersets.py:1177 dcim/filtersets.py:1672 +#: dcim/filtersets.py:1845 dcim/filtersets.py:1902 ipam/filtersets.py:305 +#: ipam/filtersets.py:896 virtualization/filtersets.py:45 +#: virtualization/filtersets.py:172 vpn/filtersets.py:330 msgid "Region (ID)" msgstr "" -#: circuits/filtersets.py:36 circuits/filtersets.py:189 dcim/filtersets.py:124 -#: dcim/filtersets.py:186 dcim/filtersets.py:261 dcim/filtersets.py:369 -#: dcim/filtersets.py:880 dcim/filtersets.py:1186 dcim/filtersets.py:1681 -#: dcim/filtersets.py:1854 dcim/filtersets.py:1911 extras/filtersets.py:383 -#: ipam/filtersets.py:311 ipam/filtersets.py:898 ipam/filtersets.py:1117 -#: virtualization/filtersets.py:50 virtualization/filtersets.py:176 +#: circuits/filtersets.py:36 circuits/filtersets.py:189 dcim/filtersets.py:126 +#: dcim/filtersets.py:188 dcim/filtersets.py:263 dcim/filtersets.py:371 +#: dcim/filtersets.py:888 dcim/filtersets.py:1184 dcim/filtersets.py:1679 +#: dcim/filtersets.py:1852 dcim/filtersets.py:1909 extras/filtersets.py:414 +#: ipam/filtersets.py:312 ipam/filtersets.py:903 +#: virtualization/filtersets.py:52 virtualization/filtersets.py:179 +#: vpn/filtersets.py:325 msgid "Region (slug)" msgstr "" -#: circuits/filtersets.py:42 circuits/filtersets.py:195 dcim/filtersets.py:192 -#: dcim/filtersets.py:267 dcim/filtersets.py:375 dcim/filtersets.py:886 -#: dcim/filtersets.py:1192 dcim/filtersets.py:1687 dcim/filtersets.py:1860 -#: dcim/filtersets.py:1917 ipam/filtersets.py:317 ipam/filtersets.py:904 -#: virtualization/filtersets.py:56 virtualization/filtersets.py:182 +#: circuits/filtersets.py:42 circuits/filtersets.py:195 dcim/filtersets.py:194 +#: dcim/filtersets.py:269 dcim/filtersets.py:377 dcim/filtersets.py:894 +#: dcim/filtersets.py:1190 dcim/filtersets.py:1685 dcim/filtersets.py:1858 +#: dcim/filtersets.py:1915 ipam/filtersets.py:318 ipam/filtersets.py:909 +#: virtualization/filtersets.py:58 virtualization/filtersets.py:185 msgid "Site group (ID)" msgstr "" -#: circuits/filtersets.py:49 circuits/filtersets.py:202 dcim/filtersets.py:199 -#: dcim/filtersets.py:274 dcim/filtersets.py:382 dcim/filtersets.py:893 -#: dcim/filtersets.py:1199 dcim/filtersets.py:1694 dcim/filtersets.py:1867 -#: dcim/filtersets.py:1924 extras/filtersets.py:389 ipam/filtersets.py:324 -#: ipam/filtersets.py:911 virtualization/filtersets.py:63 -#: virtualization/filtersets.py:189 +#: circuits/filtersets.py:49 circuits/filtersets.py:202 dcim/filtersets.py:201 +#: dcim/filtersets.py:276 dcim/filtersets.py:384 dcim/filtersets.py:901 +#: dcim/filtersets.py:1197 dcim/filtersets.py:1692 dcim/filtersets.py:1865 +#: dcim/filtersets.py:1922 extras/filtersets.py:420 ipam/filtersets.py:325 +#: ipam/filtersets.py:916 virtualization/filtersets.py:65 +#: virtualization/filtersets.py:192 msgid "Site group (slug)" msgstr "" #: circuits/filtersets.py:54 circuits/forms/bulk_import.py:117 -#: circuits/forms/filtersets.py:47 circuits/forms/filtersets.py:170 +#: circuits/forms/filtersets.py:47 circuits/forms/filtersets.py:171 #: circuits/forms/model_forms.py:137 dcim/forms/bulk_edit.py:166 #: dcim/forms/bulk_edit.py:238 dcim/forms/bulk_edit.py:570 #: dcim/forms/bulk_edit.py:763 dcim/forms/bulk_import.py:130 #: dcim/forms/bulk_import.py:176 dcim/forms/bulk_import.py:249 #: dcim/forms/bulk_import.py:477 dcim/forms/bulk_import.py:1239 -#: dcim/forms/bulk_import.py:1267 dcim/forms/filtersets.py:83 -#: dcim/forms/filtersets.py:215 dcim/forms/filtersets.py:261 -#: dcim/forms/filtersets.py:370 dcim/forms/filtersets.py:673 -#: dcim/forms/filtersets.py:903 dcim/forms/filtersets.py:927 -#: dcim/forms/filtersets.py:1016 dcim/forms/filtersets.py:1054 -#: dcim/forms/filtersets.py:1459 dcim/forms/filtersets.py:1483 -#: dcim/forms/filtersets.py:1507 dcim/forms/model_forms.py:138 +#: dcim/forms/bulk_import.py:1267 dcim/forms/filtersets.py:84 +#: dcim/forms/filtersets.py:217 dcim/forms/filtersets.py:264 +#: dcim/forms/filtersets.py:373 dcim/forms/filtersets.py:680 +#: dcim/forms/filtersets.py:910 dcim/forms/filtersets.py:934 +#: dcim/forms/filtersets.py:1024 dcim/forms/filtersets.py:1062 +#: dcim/forms/filtersets.py:1468 dcim/forms/filtersets.py:1492 +#: dcim/forms/filtersets.py:1516 dcim/forms/model_forms.py:138 #: dcim/forms/model_forms.py:167 dcim/forms/model_forms.py:211 -#: dcim/forms/model_forms.py:397 dcim/forms/model_forms.py:629 -#: dcim/forms/object_create.py:357 dcim/tables/devices.py:186 -#: dcim/tables/power.py:26 dcim/tables/racks.py:62 dcim/tables/racks.py:138 -#: dcim/tables/sites.py:129 extras/filtersets.py:399 -#: ipam/forms/bulk_edit.py:217 ipam/forms/bulk_edit.py:271 -#: ipam/forms/bulk_edit.py:449 ipam/forms/bulk_edit.py:521 -#: ipam/forms/bulk_import.py:173 ipam/forms/bulk_import.py:440 -#: ipam/forms/filtersets.py:156 ipam/forms/filtersets.py:230 -#: ipam/forms/filtersets.py:420 ipam/forms/filtersets.py:472 -#: ipam/forms/filtersets.py:585 ipam/forms/model_forms.py:208 -#: ipam/forms/model_forms.py:550 ipam/forms/model_forms.py:642 -#: ipam/tables/ip.py:244 ipam/tables/vlans.py:114 ipam/tables/vlans.py:216 -#: templates/circuits/circuittermination_edit.html:20 +#: dcim/forms/model_forms.py:397 dcim/forms/model_forms.py:630 +#: dcim/forms/object_create.py:390 dcim/tables/devices.py:186 +#: dcim/tables/power.py:26 dcim/tables/power.py:93 dcim/tables/racks.py:62 +#: dcim/tables/racks.py:138 dcim/tables/sites.py:129 extras/filtersets.py:430 +#: ipam/forms/bulk_edit.py:215 ipam/forms/bulk_edit.py:269 +#: ipam/forms/bulk_edit.py:447 ipam/forms/bulk_edit.py:519 +#: ipam/forms/bulk_import.py:170 ipam/forms/bulk_import.py:437 +#: ipam/forms/filtersets.py:152 ipam/forms/filtersets.py:226 +#: ipam/forms/filtersets.py:417 ipam/forms/filtersets.py:470 +#: ipam/forms/model_forms.py:206 ipam/forms/model_forms.py:548 +#: ipam/forms/model_forms.py:640 ipam/tables/ip.py:244 ipam/tables/vlans.py:114 +#: ipam/tables/vlans.py:216 templates/circuits/circuittermination_edit.html:20 #: templates/circuits/inc/circuit_termination.html:33 -#: templates/dcim/device.html:30 templates/dcim/inc/cable_termination.html:8 +#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 #: templates/dcim/inc/cable_termination.html:33 templates/dcim/location.html:40 -#: templates/dcim/powerpanel.html:23 templates/dcim/rack.html:18 -#: templates/dcim/rackreservation.html:25 templates/dcim/site.html:26 -#: templates/ipam/prefix.html:48 templates/ipam/vlan.html:17 +#: templates/dcim/powerpanel.html:23 templates/dcim/rack.html:25 +#: templates/dcim/rackreservation.html:31 templates/dcim/site.html:27 +#: templates/ipam/prefix.html:57 templates/ipam/vlan.html:26 #: templates/ipam/vlan_edit.html:40 templates/virtualization/cluster.html:45 #: templates/virtualization/virtualmachine.html:96 -#: virtualization/forms/bulk_edit.py:88 virtualization/forms/bulk_edit.py:97 -#: virtualization/forms/bulk_edit.py:106 virtualization/forms/bulk_edit.py:121 -#: virtualization/forms/bulk_import.py:58 -#: virtualization/forms/bulk_import.py:84 virtualization/forms/filtersets.py:75 -#: virtualization/forms/filtersets.py:141 -#: virtualization/forms/model_forms.py:73 -#: virtualization/forms/model_forms.py:106 -#: virtualization/forms/model_forms.py:173 virtualization/tables/clusters.py:77 -#: virtualization/tables/virtualmachines.py:51 wireless/forms/model_forms.py:77 -#: wireless/forms/model_forms.py:117 +#: virtualization/forms/bulk_edit.py:90 virtualization/forms/bulk_edit.py:99 +#: virtualization/forms/bulk_edit.py:108 virtualization/forms/bulk_edit.py:123 +#: virtualization/forms/bulk_import.py:59 +#: virtualization/forms/bulk_import.py:85 virtualization/forms/filtersets.py:78 +#: virtualization/forms/filtersets.py:144 +#: virtualization/forms/model_forms.py:74 +#: virtualization/forms/model_forms.py:107 +#: virtualization/forms/model_forms.py:174 virtualization/tables/clusters.py:77 +#: virtualization/tables/virtualmachines.py:53 vpn/forms/filtersets.py:262 +#: wireless/forms/model_forms.py:77 wireless/forms/model_forms.py:117 msgid "Site" msgstr "" #: circuits/filtersets.py:60 circuits/filtersets.py:213 -#: circuits/filtersets.py:250 dcim/filtersets.py:209 dcim/filtersets.py:284 -#: dcim/filtersets.py:356 extras/filtersets.py:405 ipam/filtersets.py:215 -#: ipam/filtersets.py:334 ipam/filtersets.py:921 ipam/filtersets.py:1127 -#: virtualization/filtersets.py:73 virtualization/filtersets.py:199 +#: circuits/filtersets.py:250 dcim/filtersets.py:211 dcim/filtersets.py:286 +#: dcim/filtersets.py:358 extras/filtersets.py:436 ipam/filtersets.py:215 +#: ipam/filtersets.py:335 ipam/filtersets.py:926 +#: virtualization/filtersets.py:75 virtualization/filtersets.py:202 +#: vpn/filtersets.py:335 msgid "Site (slug)" msgstr "" @@ -212,28 +213,28 @@ msgstr "" msgid "Circuit type (slug)" msgstr "" -#: circuits/filtersets.py:207 circuits/filtersets.py:244 dcim/filtersets.py:203 -#: dcim/filtersets.py:278 dcim/filtersets.py:350 dcim/filtersets.py:897 -#: dcim/filtersets.py:1204 dcim/filtersets.py:1699 dcim/filtersets.py:1871 -#: dcim/filtersets.py:1929 ipam/filtersets.py:209 ipam/filtersets.py:328 -#: ipam/filtersets.py:915 ipam/filtersets.py:1132 -#: virtualization/filtersets.py:67 virtualization/filtersets.py:193 +#: circuits/filtersets.py:207 circuits/filtersets.py:244 dcim/filtersets.py:205 +#: dcim/filtersets.py:280 dcim/filtersets.py:352 dcim/filtersets.py:905 +#: dcim/filtersets.py:1202 dcim/filtersets.py:1697 dcim/filtersets.py:1869 +#: dcim/filtersets.py:1927 ipam/filtersets.py:209 ipam/filtersets.py:329 +#: ipam/filtersets.py:920 virtualization/filtersets.py:69 +#: virtualization/filtersets.py:196 vpn/filtersets.py:340 msgid "Site (ID)" msgstr "" -#: circuits/filtersets.py:236 core/filtersets.py:72 dcim/filtersets.py:631 -#: dcim/filtersets.py:1173 dcim/filtersets.py:1975 extras/filtersets.py:40 -#: extras/filtersets.py:69 extras/filtersets.py:108 extras/filtersets.py:137 -#: extras/filtersets.py:164 extras/filtersets.py:195 extras/filtersets.py:264 -#: extras/filtersets.py:312 extras/filtersets.py:372 extras/filtersets.py:531 -#: extras/filtersets.py:573 extras/filtersets.py:614 extras/filtersets.py:637 -#: ipam/forms/model_forms.py:432 netbox/filtersets.py:275 -#: netbox/forms/__init__.py:23 netbox/forms/base.py:151 -#: templates/htmx/object_selector.html:28 templates/inc/filter_list.html:53 -#: templates/ipam/ipaddress_assign.html:32 templates/search.html:7 -#: templates/search.html:26 tenancy/filtersets.py:87 users/filtersets.py:21 -#: users/filtersets.py:37 users/filtersets.py:69 users/filtersets.py:117 -#: utilities/forms/forms.py:99 +#: circuits/filtersets.py:236 core/filtersets.py:73 core/filtersets.py:132 +#: dcim/filtersets.py:633 dcim/filtersets.py:1171 dcim/filtersets.py:1973 +#: extras/filtersets.py:40 extras/filtersets.py:69 extras/filtersets.py:101 +#: extras/filtersets.py:140 extras/filtersets.py:168 extras/filtersets.py:195 +#: extras/filtersets.py:226 extras/filtersets.py:295 extras/filtersets.py:343 +#: extras/filtersets.py:403 extras/filtersets.py:562 extras/filtersets.py:604 +#: extras/filtersets.py:645 ipam/forms/model_forms.py:430 +#: netbox/filtersets.py:275 netbox/forms/__init__.py:23 +#: netbox/forms/base.py:152 templates/htmx/object_selector.html:28 +#: templates/inc/filter_list.html:53 templates/ipam/ipaddress_assign.html:32 +#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:86 +#: users/filtersets.py:21 users/filtersets.py:37 users/filtersets.py:69 +#: users/filtersets.py:117 utilities/forms/forms.py:99 msgid "Search" msgstr "" @@ -251,9 +252,9 @@ msgstr "" #: circuits/forms/bulk_edit.py:25 circuits/forms/filtersets.py:56 #: circuits/forms/model_forms.py:26 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:126 dcim/forms/filtersets.py:185 +#: dcim/forms/bulk_edit.py:126 dcim/forms/filtersets.py:187 #: dcim/forms/model_forms.py:126 dcim/tables/sites.py:94 -#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:221 +#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:219 #: netbox/navigation/menu.py:160 netbox/navigation/menu.py:163 #: templates/circuits/provider.html:24 msgid "ASNs" @@ -276,24 +277,24 @@ msgstr "" #: dcim/forms/bulk_edit.py:1022 dcim/forms/bulk_edit.py:1067 #: dcim/forms/bulk_edit.py:1094 dcim/forms/bulk_edit.py:1112 #: dcim/forms/bulk_edit.py:1130 dcim/forms/bulk_edit.py:1148 -#: dcim/forms/bulk_edit.py:1566 extras/forms/bulk_edit.py:35 -#: extras/forms/bulk_edit.py:118 extras/forms/bulk_edit.py:147 -#: extras/forms/bulk_edit.py:242 extras/forms/bulk_edit.py:266 -#: extras/forms/bulk_edit.py:280 extras/tables/tables.py:78 -#: ipam/forms/bulk_edit.py:52 ipam/forms/bulk_edit.py:72 -#: ipam/forms/bulk_edit.py:92 ipam/forms/bulk_edit.py:116 -#: ipam/forms/bulk_edit.py:145 ipam/forms/bulk_edit.py:174 -#: ipam/forms/bulk_edit.py:193 ipam/forms/bulk_edit.py:262 -#: ipam/forms/bulk_edit.py:306 ipam/forms/bulk_edit.py:354 -#: ipam/forms/bulk_edit.py:397 ipam/forms/bulk_edit.py:425 -#: ipam/forms/bulk_edit.py:553 ipam/forms/bulk_edit.py:584 -#: ipam/forms/bulk_edit.py:613 templates/account/token.html:36 +#: dcim/forms/bulk_edit.py:1566 extras/forms/bulk_edit.py:36 +#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:152 +#: extras/forms/bulk_edit.py:182 extras/forms/bulk_edit.py:263 +#: extras/forms/bulk_edit.py:287 extras/forms/bulk_edit.py:301 +#: extras/tables/tables.py:56 ipam/forms/bulk_edit.py:50 +#: ipam/forms/bulk_edit.py:70 ipam/forms/bulk_edit.py:90 +#: ipam/forms/bulk_edit.py:114 ipam/forms/bulk_edit.py:143 +#: ipam/forms/bulk_edit.py:172 ipam/forms/bulk_edit.py:191 +#: ipam/forms/bulk_edit.py:260 ipam/forms/bulk_edit.py:304 +#: ipam/forms/bulk_edit.py:352 ipam/forms/bulk_edit.py:395 +#: ipam/forms/bulk_edit.py:423 ipam/forms/bulk_edit.py:551 +#: ipam/forms/bulk_edit.py:582 templates/account/token.html:36 #: templates/circuits/circuit.html:60 templates/circuits/circuittype.html:29 #: templates/circuits/inc/circuit_termination.html:115 #: templates/circuits/provider.html:34 #: templates/circuits/providernetwork.html:35 templates/core/datasource.html:55 #: templates/dcim/cable.html:37 templates/dcim/consoleport.html:47 -#: templates/dcim/consoleserverport.html:47 templates/dcim/device.html:113 +#: templates/dcim/consoleserverport.html:47 templates/dcim/device.html:96 #: templates/dcim/devicebay.html:35 templates/dcim/devicerole.html:33 #: templates/dcim/devicetype.html:36 templates/dcim/frontport.html:61 #: templates/dcim/interface.html:70 templates/dcim/inventoryitem.html:61 @@ -302,44 +303,53 @@ msgstr "" #: templates/dcim/modulebay.html:39 templates/dcim/moduletype.html:27 #: templates/dcim/platform.html:36 templates/dcim/powerfeed.html:43 #: templates/dcim/poweroutlet.html:43 templates/dcim/powerpanel.html:31 -#: templates/dcim/powerport.html:43 templates/dcim/rack.html:61 +#: templates/dcim/powerport.html:43 templates/dcim/rack.html:54 #: templates/dcim/rackreservation.html:69 templates/dcim/rackrole.html:29 #: templates/dcim/rearport.html:57 templates/dcim/region.html:34 -#: templates/dcim/site.html:73 templates/dcim/sitegroup.html:34 +#: templates/dcim/site.html:60 templates/dcim/sitegroup.html:34 #: templates/dcim/virtualchassis.html:32 #: templates/extras/admin/plugins_list.html:26 #: templates/extras/configcontext.html:22 #: templates/extras/configtemplate.html:18 templates/extras/customfield.html:35 #: templates/extras/dashboard/widget_add.html:14 -#: templates/extras/exporttemplate.html:25 templates/extras/report_list.html:47 -#: templates/extras/savedfilter.html:18 templates/extras/script_list.html:53 -#: templates/extras/tag.html:23 templates/generic/bulk_import.html:118 +#: templates/extras/eventrule.html:24 templates/extras/exporttemplate.html:25 +#: templates/extras/report_list.html:47 templates/extras/savedfilter.html:18 +#: templates/extras/script_list.html:53 templates/extras/tag.html:23 +#: templates/extras/webhook.html:20 templates/generic/bulk_import.html:118 #: templates/ipam/aggregate.html:44 templates/ipam/asn.html:43 #: templates/ipam/asnrange.html:39 templates/ipam/fhrpgroup.html:35 #: templates/ipam/ipaddress.html:58 templates/ipam/iprange.html:70 -#: templates/ipam/l2vpn.html:27 templates/ipam/prefix.html:82 -#: templates/ipam/rir.html:29 templates/ipam/role.html:29 -#: templates/ipam/routetarget.html:22 templates/ipam/service.html:53 -#: templates/ipam/servicetemplate.html:28 templates/ipam/vlan.html:65 -#: templates/ipam/vlangroup.html:35 templates/ipam/vrf.html:36 -#: templates/tenancy/contact.html:68 templates/tenancy/contactgroup.html:28 -#: templates/tenancy/contactrole.html:23 templates/tenancy/tenant.html:25 -#: templates/tenancy/tenantgroup.html:36 +#: templates/ipam/prefix.html:82 templates/ipam/rir.html:29 +#: templates/ipam/role.html:29 templates/ipam/routetarget.html:22 +#: templates/ipam/service.html:53 templates/ipam/servicetemplate.html:28 +#: templates/ipam/vlan.html:65 templates/ipam/vlangroup.html:35 +#: templates/ipam/vrf.html:36 templates/tenancy/contact.html:68 +#: templates/tenancy/contactgroup.html:28 templates/tenancy/contactrole.html:23 +#: templates/tenancy/tenant.html:25 templates/tenancy/tenantgroup.html:36 #: templates/users/objectpermission.html:22 templates/users/token.html:28 #: templates/virtualization/cluster.html:28 #: templates/virtualization/clustergroup.html:29 #: templates/virtualization/clustertype.html:29 +#: templates/virtualization/virtualdisk.html:40 #: templates/virtualization/virtualmachine.html:34 -#: templates/virtualization/vminterface.html:54 -#: templates/wireless/wirelesslan.html:27 +#: templates/virtualization/vminterface.html:54 templates/vpn/ikepolicy.html:18 +#: templates/vpn/ikeproposal.html:18 templates/vpn/ipsecpolicy.html:18 +#: templates/vpn/ipsecprofile.html:18 templates/vpn/ipsecprofile.html:43 +#: templates/vpn/ipsecprofile.html:78 templates/vpn/ipsecproposal.html:18 +#: templates/vpn/l2vpn.html:27 templates/vpn/tunnel.html:34 +#: templates/vpn/tunnelgroup.html:33 templates/wireless/wirelesslan.html:27 #: templates/wireless/wirelesslangroup.html:34 #: templates/wireless/wirelesslink.html:37 tenancy/forms/bulk_edit.py:31 #: tenancy/forms/bulk_edit.py:79 tenancy/forms/bulk_edit.py:121 #: users/forms/bulk_edit.py:62 users/forms/bulk_edit.py:92 -#: virtualization/forms/bulk_edit.py:29 virtualization/forms/bulk_edit.py:43 -#: virtualization/forms/bulk_edit.py:174 virtualization/forms/bulk_edit.py:225 -#: wireless/forms/bulk_edit.py:28 wireless/forms/bulk_edit.py:81 -#: wireless/forms/bulk_edit.py:128 +#: virtualization/forms/bulk_edit.py:31 virtualization/forms/bulk_edit.py:45 +#: virtualization/forms/bulk_edit.py:176 virtualization/forms/bulk_edit.py:227 +#: virtualization/forms/bulk_edit.py:336 vpn/forms/bulk_edit.py:27 +#: vpn/forms/bulk_edit.py:63 vpn/forms/bulk_edit.py:120 +#: vpn/forms/bulk_edit.py:154 vpn/forms/bulk_edit.py:191 +#: vpn/forms/bulk_edit.py:216 vpn/forms/bulk_edit.py:248 +#: vpn/forms/bulk_edit.py:277 wireless/forms/bulk_edit.py:28 +#: wireless/forms/bulk_edit.py:81 wireless/forms/bulk_edit.py:128 msgid "Description" msgstr "" @@ -347,7 +357,7 @@ msgstr "" #: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:35 #: circuits/forms/bulk_import.py:50 circuits/forms/bulk_import.py:76 #: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 -#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:130 +#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 #: circuits/forms/model_forms.py:32 circuits/forms/model_forms.py:44 #: circuits/forms/model_forms.py:58 circuits/forms/model_forms.py:92 #: circuits/tables/circuits.py:55 circuits/tables/providers.py:72 @@ -368,11 +378,11 @@ msgstr "" #: dcim/forms/bulk_edit.py:204 dcim/forms/bulk_edit.py:500 #: dcim/forms/bulk_edit.py:694 dcim/forms/bulk_edit.py:1063 #: dcim/forms/bulk_edit.py:1090 dcim/forms/bulk_edit.py:1562 -#: dcim/forms/filtersets.py:970 dcim/forms/filtersets.py:1344 -#: dcim/forms/filtersets.py:1365 dcim/tables/devices.py:700 -#: dcim/tables/devices.py:760 dcim/tables/devices.py:983 +#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1353 +#: dcim/forms/filtersets.py:1374 dcim/tables/devices.py:717 +#: dcim/tables/devices.py:777 dcim/tables/devices.py:1004 #: dcim/tables/devicetypes.py:245 dcim/tables/devicetypes.py:260 -#: dcim/tables/racks.py:32 extras/forms/bulk_edit.py:238 +#: dcim/tables/racks.py:32 extras/forms/bulk_edit.py:259 #: extras/tables/tables.py:323 templates/circuits/circuittype.html:33 #: templates/dcim/cable.html:41 templates/dcim/devicerole.html:37 #: templates/dcim/frontport.html:43 templates/dcim/inventoryitemrole.html:27 @@ -382,8 +392,8 @@ msgid "Color" msgstr "" #: circuits/forms/bulk_edit.py:113 circuits/forms/bulk_import.py:89 -#: circuits/forms/filtersets.py:125 core/forms/bulk_edit.py:17 -#: core/forms/filtersets.py:30 core/tables/data.py:20 core/tables/jobs.py:18 +#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:17 +#: core/forms/filtersets.py:29 core/tables/data.py:20 core/tables/jobs.py:18 #: dcim/forms/bulk_edit.py:281 dcim/forms/bulk_edit.py:672 #: dcim/forms/bulk_edit.py:811 dcim/forms/bulk_edit.py:879 #: dcim/forms/bulk_edit.py:898 dcim/forms/bulk_edit.py:921 @@ -394,42 +404,44 @@ msgstr "" #: dcim/forms/bulk_import.py:717 dcim/forms/bulk_import.py:800 #: dcim/forms/bulk_import.py:890 dcim/forms/bulk_import.py:932 #: dcim/forms/bulk_import.py:1145 dcim/forms/bulk_import.py:1304 -#: dcim/forms/filtersets.py:283 dcim/forms/filtersets.py:860 -#: dcim/forms/filtersets.py:960 dcim/forms/filtersets.py:1080 -#: dcim/forms/filtersets.py:1150 dcim/forms/filtersets.py:1172 -#: dcim/forms/filtersets.py:1194 dcim/forms/filtersets.py:1211 -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1339 -#: dcim/forms/filtersets.py:1360 dcim/forms/object_import.py:89 +#: dcim/forms/filtersets.py:286 dcim/forms/filtersets.py:867 +#: dcim/forms/filtersets.py:967 dcim/forms/filtersets.py:1088 +#: dcim/forms/filtersets.py:1158 dcim/forms/filtersets.py:1180 +#: dcim/forms/filtersets.py:1202 dcim/forms/filtersets.py:1219 +#: dcim/forms/filtersets.py:1253 dcim/forms/filtersets.py:1348 +#: dcim/forms/filtersets.py:1369 dcim/forms/object_import.py:89 #: dcim/forms/object_import.py:118 dcim/forms/object_import.py:150 -#: dcim/tables/devices.py:211 dcim/tables/devices.py:816 -#: dcim/tables/power.py:77 extras/forms/bulk_import.py:37 +#: dcim/tables/devices.py:211 dcim/tables/devices.py:833 +#: dcim/tables/power.py:77 extras/forms/bulk_import.py:39 #: extras/tables/tables.py:345 extras/tables/tables.py:443 -#: ipam/forms/bulk_edit.py:603 ipam/forms/bulk_import.py:524 -#: ipam/forms/filtersets.py:537 netbox/tables/tables.py:225 -#: templates/circuits/circuit.html:31 templates/core/datasource.html:39 -#: templates/dcim/cable.html:16 templates/dcim/consoleport.html:39 -#: templates/dcim/consoleserverport.html:39 templates/dcim/frontport.html:39 -#: templates/dcim/interface.html:47 templates/dcim/interface.html:171 -#: templates/dcim/interface.html:319 templates/dcim/powerfeed.html:35 -#: templates/dcim/poweroutlet.html:39 templates/dcim/powerport.html:39 -#: templates/dcim/rack.html:88 templates/dcim/rearport.html:39 -#: templates/ipam/l2vpn.html:23 templates/virtualization/cluster.html:20 +#: netbox/tables/tables.py:234 templates/circuits/circuit.html:31 +#: templates/core/datasource.html:39 templates/dcim/cable.html:16 +#: templates/dcim/consoleport.html:39 templates/dcim/consoleserverport.html:39 +#: templates/dcim/frontport.html:39 templates/dcim/interface.html:47 +#: templates/dcim/interface.html:175 templates/dcim/interface.html:323 +#: templates/dcim/powerfeed.html:35 templates/dcim/poweroutlet.html:39 +#: templates/dcim/powerport.html:39 templates/dcim/rack.html:81 +#: templates/dcim/rearport.html:39 templates/extras/eventrule.html:95 +#: templates/virtualization/cluster.html:20 templates/vpn/l2vpn.html:23 #: templates/wireless/inc/authentication_attrs.html:9 #: templates/wireless/inc/wirelesslink_interface.html:14 -#: virtualization/forms/bulk_edit.py:57 virtualization/forms/bulk_import.py:40 -#: virtualization/forms/filtersets.py:50 virtualization/forms/model_forms.py:64 -#: virtualization/tables/clusters.py:66 +#: virtualization/forms/bulk_edit.py:59 virtualization/forms/bulk_import.py:41 +#: virtualization/forms/filtersets.py:53 virtualization/forms/model_forms.py:65 +#: virtualization/tables/clusters.py:66 vpn/forms/bulk_edit.py:267 +#: vpn/forms/bulk_import.py:259 vpn/forms/filtersets.py:214 +#: vpn/forms/model_forms.py:83 vpn/forms/model_forms.py:118 +#: vpn/forms/model_forms.py:232 msgid "Type" msgstr "" #: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:82 -#: circuits/forms/filtersets.py:138 circuits/forms/model_forms.py:97 +#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:97 msgid "Provider account" msgstr "" #: circuits/forms/bulk_edit.py:131 circuits/forms/bulk_import.py:95 -#: circuits/forms/filtersets.py:149 core/forms/filtersets.py:35 -#: core/forms/filtersets.py:76 core/tables/data.py:23 core/tables/jobs.py:25 +#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:34 +#: core/forms/filtersets.py:75 core/tables/data.py:23 core/tables/jobs.py:26 #: dcim/forms/bulk_edit.py:104 dcim/forms/bulk_edit.py:179 #: dcim/forms/bulk_edit.py:260 dcim/forms/bulk_edit.py:593 #: dcim/forms/bulk_edit.py:646 dcim/forms/bulk_edit.py:678 @@ -437,39 +449,41 @@ msgstr "" #: dcim/forms/bulk_import.py:87 dcim/forms/bulk_import.py:146 #: dcim/forms/bulk_import.py:194 dcim/forms/bulk_import.py:442 #: dcim/forms/bulk_import.py:596 dcim/forms/bulk_import.py:1139 -#: dcim/forms/bulk_import.py:1299 dcim/forms/filtersets.py:168 -#: dcim/forms/filtersets.py:227 dcim/forms/filtersets.py:278 -#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:828 -#: dcim/forms/filtersets.py:864 dcim/forms/filtersets.py:965 -#: dcim/forms/filtersets.py:1075 dcim/tables/devices.py:173 -#: dcim/tables/devices.py:819 dcim/tables/devices.py:1043 +#: dcim/forms/bulk_import.py:1299 dcim/forms/filtersets.py:170 +#: dcim/forms/filtersets.py:229 dcim/forms/filtersets.py:281 +#: dcim/forms/filtersets.py:726 dcim/forms/filtersets.py:835 +#: dcim/forms/filtersets.py:871 dcim/forms/filtersets.py:972 +#: dcim/forms/filtersets.py:1083 dcim/tables/devices.py:173 +#: dcim/tables/devices.py:836 dcim/tables/devices.py:1064 #: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:66 -#: dcim/tables/sites.py:82 dcim/tables/sites.py:133 ipam/forms/bulk_edit.py:242 -#: ipam/forms/bulk_edit.py:291 ipam/forms/bulk_edit.py:339 -#: ipam/forms/bulk_edit.py:543 ipam/forms/bulk_import.py:194 -#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 -#: ipam/forms/bulk_import.py:461 ipam/forms/filtersets.py:209 -#: ipam/forms/filtersets.py:274 ipam/forms/filtersets.py:344 -#: ipam/forms/filtersets.py:484 ipam/forms/model_forms.py:451 +#: dcim/tables/sites.py:82 dcim/tables/sites.py:133 ipam/forms/bulk_edit.py:240 +#: ipam/forms/bulk_edit.py:289 ipam/forms/bulk_edit.py:337 +#: ipam/forms/bulk_edit.py:541 ipam/forms/bulk_import.py:191 +#: ipam/forms/bulk_import.py:256 ipam/forms/bulk_import.py:292 +#: ipam/forms/bulk_import.py:458 ipam/forms/filtersets.py:205 +#: ipam/forms/filtersets.py:270 ipam/forms/filtersets.py:341 +#: ipam/forms/filtersets.py:482 ipam/forms/model_forms.py:449 #: ipam/tables/ip.py:236 ipam/tables/ip.py:309 ipam/tables/ip.py:359 #: ipam/tables/ip.py:421 ipam/tables/ip.py:448 ipam/tables/vlans.py:122 #: ipam/tables/vlans.py:227 templates/circuits/circuit.html:35 #: templates/core/datasource.html:47 templates/core/job.html:35 -#: templates/dcim/cable.html:20 templates/dcim/device.html:200 +#: templates/dcim/cable.html:20 templates/dcim/device.html:183 #: templates/dcim/location.html:48 templates/dcim/module.html:67 -#: templates/dcim/powerfeed.html:39 templates/dcim/rack.html:53 -#: templates/dcim/site.html:56 templates/extras/report_list.html:49 +#: templates/dcim/powerfeed.html:39 templates/dcim/rack.html:46 +#: templates/dcim/site.html:43 templates/extras/report_list.html:49 #: templates/extras/script_list.html:55 templates/ipam/ipaddress.html:40 #: templates/ipam/iprange.html:57 templates/ipam/prefix.html:74 #: templates/ipam/vlan.html:51 templates/virtualization/cluster.html:24 -#: templates/virtualization/virtualmachine.html:22 +#: templates/virtualization/virtualmachine.html:22 templates/vpn/tunnel.html:26 #: templates/wireless/wirelesslan.html:23 -#: templates/wireless/wirelesslink.html:20 users/forms/filtersets.py:35 -#: users/forms/model_forms.py:196 virtualization/forms/bulk_edit.py:67 -#: virtualization/forms/bulk_edit.py:115 virtualization/forms/bulk_import.py:53 -#: virtualization/forms/bulk_import.py:79 virtualization/forms/filtersets.py:58 -#: virtualization/forms/filtersets.py:153 virtualization/tables/clusters.py:74 -#: virtualization/tables/virtualmachines.py:48 wireless/forms/bulk_edit.py:42 +#: templates/wireless/wirelesslink.html:20 users/forms/filtersets.py:33 +#: users/forms/model_forms.py:196 virtualization/forms/bulk_edit.py:69 +#: virtualization/forms/bulk_edit.py:117 virtualization/forms/bulk_import.py:54 +#: virtualization/forms/bulk_import.py:80 virtualization/forms/filtersets.py:61 +#: virtualization/forms/filtersets.py:156 virtualization/tables/clusters.py:74 +#: virtualization/tables/virtualmachines.py:50 vpn/forms/bulk_edit.py:38 +#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:46 +#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:42 #: wireless/forms/bulk_edit.py:104 wireless/forms/bulk_import.py:43 #: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:48 #: wireless/forms/filtersets.py:82 wireless/tables/wirelesslan.py:52 @@ -485,63 +499,64 @@ msgstr "" #: dcim/forms/bulk_import.py:106 dcim/forms/bulk_import.py:151 #: dcim/forms/bulk_import.py:187 dcim/forms/bulk_import.py:274 #: dcim/forms/bulk_import.py:416 dcim/forms/bulk_import.py:1151 -#: dcim/forms/bulk_import.py:1356 dcim/forms/filtersets.py:164 -#: dcim/forms/filtersets.py:195 dcim/forms/filtersets.py:246 -#: dcim/forms/filtersets.py:330 dcim/forms/filtersets.py:351 -#: dcim/forms/filtersets.py:647 dcim/forms/filtersets.py:819 -#: dcim/forms/filtersets.py:884 dcim/forms/filtersets.py:914 -#: dcim/forms/filtersets.py:1035 dcim/tables/power.py:88 -#: extras/filtersets.py:486 extras/forms/filtersets.py:306 -#: extras/forms/filtersets.py:380 ipam/forms/bulk_edit.py:42 -#: ipam/forms/bulk_edit.py:67 ipam/forms/bulk_edit.py:111 -#: ipam/forms/bulk_edit.py:140 ipam/forms/bulk_edit.py:165 -#: ipam/forms/bulk_edit.py:237 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:334 ipam/forms/bulk_edit.py:538 -#: ipam/forms/bulk_edit.py:608 ipam/forms/bulk_import.py:40 -#: ipam/forms/bulk_import.py:69 ipam/forms/bulk_import.py:97 -#: ipam/forms/bulk_import.py:117 ipam/forms/bulk_import.py:137 -#: ipam/forms/bulk_import.py:166 ipam/forms/bulk_import.py:252 -#: ipam/forms/bulk_import.py:288 ipam/forms/bulk_import.py:454 -#: ipam/forms/bulk_import.py:518 ipam/forms/filtersets.py:51 -#: ipam/forms/filtersets.py:71 ipam/forms/filtersets.py:103 -#: ipam/forms/filtersets.py:123 ipam/forms/filtersets.py:146 -#: ipam/forms/filtersets.py:173 ipam/forms/filtersets.py:260 -#: ipam/forms/filtersets.py:300 ipam/forms/filtersets.py:453 -#: ipam/forms/filtersets.py:534 ipam/tables/ip.py:451 ipam/tables/vlans.py:224 +#: dcim/forms/bulk_import.py:1356 dcim/forms/filtersets.py:165 +#: dcim/forms/filtersets.py:197 dcim/forms/filtersets.py:248 +#: dcim/forms/filtersets.py:333 dcim/forms/filtersets.py:354 +#: dcim/forms/filtersets.py:653 dcim/forms/filtersets.py:826 +#: dcim/forms/filtersets.py:891 dcim/forms/filtersets.py:921 +#: dcim/forms/filtersets.py:1043 dcim/tables/power.py:88 +#: extras/filtersets.py:517 extras/forms/filtersets.py:331 +#: extras/forms/filtersets.py:405 ipam/forms/bulk_edit.py:40 +#: ipam/forms/bulk_edit.py:65 ipam/forms/bulk_edit.py:109 +#: ipam/forms/bulk_edit.py:138 ipam/forms/bulk_edit.py:163 +#: ipam/forms/bulk_edit.py:235 ipam/forms/bulk_edit.py:284 +#: ipam/forms/bulk_edit.py:332 ipam/forms/bulk_edit.py:536 +#: ipam/forms/bulk_import.py:37 ipam/forms/bulk_import.py:66 +#: ipam/forms/bulk_import.py:94 ipam/forms/bulk_import.py:114 +#: ipam/forms/bulk_import.py:134 ipam/forms/bulk_import.py:163 +#: ipam/forms/bulk_import.py:249 ipam/forms/bulk_import.py:285 +#: ipam/forms/bulk_import.py:451 ipam/forms/filtersets.py:47 +#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:99 +#: ipam/forms/filtersets.py:119 ipam/forms/filtersets.py:142 +#: ipam/forms/filtersets.py:169 ipam/forms/filtersets.py:256 +#: ipam/forms/filtersets.py:296 ipam/forms/filtersets.py:450 +#: ipam/tables/ip.py:451 ipam/tables/vlans.py:224 #: templates/circuits/circuit.html:39 templates/dcim/cable.html:24 -#: templates/dcim/device.html:98 templates/dcim/location.html:52 -#: templates/dcim/powerfeed.html:47 templates/dcim/rack.html:44 -#: templates/dcim/rackreservation.html:56 templates/dcim/site.html:60 +#: templates/dcim/device.html:81 templates/dcim/location.html:52 +#: templates/dcim/powerfeed.html:47 templates/dcim/rack.html:37 +#: templates/dcim/rackreservation.html:56 templates/dcim/site.html:47 #: templates/dcim/virtualdevicecontext.html:55 templates/ipam/aggregate.html:31 #: templates/ipam/asn.html:34 templates/ipam/asnrange.html:30 #: templates/ipam/ipaddress.html:31 templates/ipam/iprange.html:61 -#: templates/ipam/l2vpn.html:31 templates/ipam/prefix.html:29 -#: templates/ipam/routetarget.html:18 templates/ipam/vlan.html:42 -#: templates/ipam/vrf.html:23 templates/tenancy/tenant.html:17 -#: templates/virtualization/cluster.html:36 -#: templates/virtualization/virtualmachine.html:38 -#: templates/wireless/wirelesslan.html:35 +#: templates/ipam/prefix.html:30 templates/ipam/routetarget.html:18 +#: templates/ipam/vlan.html:42 templates/ipam/vrf.html:23 +#: templates/tenancy/tenant.html:17 templates/virtualization/cluster.html:36 +#: templates/virtualization/virtualmachine.html:38 templates/vpn/l2vpn.html:31 +#: templates/vpn/tunnel.html:50 templates/wireless/wirelesslan.html:35 #: templates/wireless/wirelesslink.html:28 tenancy/forms/forms.py:25 -#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:56 -#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:73 -#: virtualization/forms/bulk_edit.py:152 virtualization/forms/bulk_import.py:65 -#: virtualization/forms/bulk_import.py:114 -#: virtualization/forms/filtersets.py:44 virtualization/forms/filtersets.py:98 -#: wireless/forms/bulk_edit.py:62 wireless/forms/bulk_edit.py:109 -#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 -#: wireless/forms/filtersets.py:34 wireless/forms/filtersets.py:74 +#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:53 +#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:75 +#: virtualization/forms/bulk_edit.py:154 virtualization/forms/bulk_import.py:66 +#: virtualization/forms/bulk_import.py:115 +#: virtualization/forms/filtersets.py:46 virtualization/forms/filtersets.py:101 +#: vpn/forms/bulk_edit.py:58 vpn/forms/bulk_edit.py:272 +#: vpn/forms/bulk_import.py:59 vpn/forms/bulk_import.py:253 +#: vpn/forms/filtersets.py:211 wireless/forms/bulk_edit.py:62 +#: wireless/forms/bulk_edit.py:109 wireless/forms/bulk_import.py:55 +#: wireless/forms/bulk_import.py:97 wireless/forms/filtersets.py:34 +#: wireless/forms/filtersets.py:74 msgid "Tenant" msgstr "" -#: circuits/forms/bulk_edit.py:142 circuits/forms/filtersets.py:173 +#: circuits/forms/bulk_edit.py:142 circuits/forms/filtersets.py:174 msgid "Install date" msgstr "" -#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:178 +#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:179 msgid "Termination date" msgstr "" -#: circuits/forms/bulk_edit.py:153 circuits/forms/filtersets.py:185 +#: circuits/forms/bulk_edit.py:153 circuits/forms/filtersets.py:186 msgid "Commit rate (Kbps)" msgstr "" @@ -551,18 +566,19 @@ msgstr "" #: circuits/forms/bulk_edit.py:169 circuits/forms/model_forms.py:112 #: dcim/forms/model_forms.py:141 dcim/forms/model_forms.py:183 -#: dcim/forms/model_forms.py:260 dcim/forms/model_forms.py:671 -#: dcim/forms/model_forms.py:1477 ipam/forms/model_forms.py:63 -#: ipam/forms/model_forms.py:116 ipam/forms/model_forms.py:137 -#: ipam/forms/model_forms.py:161 ipam/forms/model_forms.py:233 -#: ipam/forms/model_forms.py:259 ipam/forms/model_forms.py:781 -#: netbox/navigation/menu.py:38 templates/dcim/cable_edit.html:68 -#: templates/dcim/device_edit.html:85 templates/dcim/rack_edit.html:30 -#: templates/ipam/ipaddress_bulk_add.html:27 +#: dcim/forms/model_forms.py:260 dcim/forms/model_forms.py:672 +#: dcim/forms/model_forms.py:1478 ipam/forms/model_forms.py:61 +#: ipam/forms/model_forms.py:114 ipam/forms/model_forms.py:135 +#: ipam/forms/model_forms.py:159 ipam/forms/model_forms.py:231 +#: ipam/forms/model_forms.py:257 netbox/navigation/menu.py:38 +#: templates/dcim/cable_edit.html:68 templates/dcim/device_edit.html:85 +#: templates/dcim/rack_edit.html:30 templates/ipam/ipaddress_bulk_add.html:27 #: templates/ipam/ipaddress_edit.html:27 templates/ipam/vlan_edit.html:22 -#: virtualization/forms/model_forms.py:82 -#: virtualization/forms/model_forms.py:223 wireless/forms/model_forms.py:55 -#: wireless/forms/model_forms.py:160 +#: virtualization/forms/model_forms.py:83 +#: virtualization/forms/model_forms.py:225 vpn/forms/bulk_edit.py:77 +#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 +#: vpn/forms/model_forms.py:146 vpn/forms/model_forms.py:404 +#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:160 msgid "Tenancy" msgstr "" @@ -573,7 +589,7 @@ msgstr "" #: circuits/forms/bulk_import.py:70 dcim/forms/bulk_import.py:170 #: dcim/forms/bulk_import.py:380 dcim/forms/bulk_import.py:1092 -#: dcim/forms/bulk_import.py:1171 extras/forms/bulk_import.py:167 +#: dcim/forms/bulk_import.py:1171 extras/forms/bulk_import.py:229 msgid "RGB color in hexadecimal. Example:" msgstr "" @@ -588,28 +604,28 @@ msgstr "" #: circuits/forms/bulk_import.py:97 dcim/forms/bulk_import.py:89 #: dcim/forms/bulk_import.py:148 dcim/forms/bulk_import.py:196 #: dcim/forms/bulk_import.py:444 dcim/forms/bulk_import.py:598 -#: dcim/forms/bulk_import.py:1301 ipam/forms/bulk_import.py:196 -#: ipam/forms/bulk_import.py:261 ipam/forms/bulk_import.py:297 -#: ipam/forms/bulk_import.py:463 virtualization/forms/bulk_import.py:55 -#: virtualization/forms/bulk_import.py:81 +#: dcim/forms/bulk_import.py:1301 ipam/forms/bulk_import.py:193 +#: ipam/forms/bulk_import.py:258 ipam/forms/bulk_import.py:294 +#: ipam/forms/bulk_import.py:460 virtualization/forms/bulk_import.py:56 +#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 msgid "Operational status" msgstr "" #: circuits/forms/bulk_import.py:104 dcim/forms/bulk_import.py:110 #: dcim/forms/bulk_import.py:155 dcim/forms/bulk_import.py:278 #: dcim/forms/bulk_import.py:420 dcim/forms/bulk_import.py:1155 -#: dcim/forms/bulk_import.py:1296 ipam/forms/bulk_import.py:44 -#: ipam/forms/bulk_import.py:73 ipam/forms/bulk_import.py:101 -#: ipam/forms/bulk_import.py:121 ipam/forms/bulk_import.py:141 -#: ipam/forms/bulk_import.py:170 ipam/forms/bulk_import.py:256 -#: ipam/forms/bulk_import.py:292 ipam/forms/bulk_import.py:458 -#: virtualization/forms/bulk_import.py:69 -#: virtualization/forms/bulk_import.py:118 wireless/forms/bulk_import.py:59 -#: wireless/forms/bulk_import.py:101 +#: dcim/forms/bulk_import.py:1296 ipam/forms/bulk_import.py:41 +#: ipam/forms/bulk_import.py:70 ipam/forms/bulk_import.py:98 +#: ipam/forms/bulk_import.py:118 ipam/forms/bulk_import.py:138 +#: ipam/forms/bulk_import.py:167 ipam/forms/bulk_import.py:253 +#: ipam/forms/bulk_import.py:289 ipam/forms/bulk_import.py:455 +#: virtualization/forms/bulk_import.py:70 +#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 +#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 msgid "Assigned tenant" msgstr "" -#: circuits/forms/bulk_import.py:123 circuits/forms/filtersets.py:146 +#: circuits/forms/bulk_import.py:123 circuits/forms/filtersets.py:147 #: circuits/forms/model_forms.py:143 msgid "Provider network" msgstr "" @@ -620,90 +636,92 @@ msgstr "" #: dcim/forms/bulk_edit.py:772 dcim/forms/bulk_import.py:181 #: dcim/forms/bulk_import.py:255 dcim/forms/bulk_import.py:483 #: dcim/forms/bulk_import.py:1245 dcim/forms/bulk_import.py:1279 -#: dcim/forms/filtersets.py:91 dcim/forms/filtersets.py:243 -#: dcim/forms/filtersets.py:275 dcim/forms/filtersets.py:327 -#: dcim/forms/filtersets.py:378 dcim/forms/filtersets.py:644 -#: dcim/forms/filtersets.py:682 dcim/forms/filtersets.py:883 -#: dcim/forms/filtersets.py:912 dcim/forms/filtersets.py:932 -#: dcim/forms/filtersets.py:996 dcim/forms/filtersets.py:1025 -#: dcim/forms/filtersets.py:1034 dcim/forms/filtersets.py:1145 -#: dcim/forms/filtersets.py:1167 dcim/forms/filtersets.py:1189 -#: dcim/forms/filtersets.py:1206 dcim/forms/filtersets.py:1226 -#: dcim/forms/filtersets.py:1333 dcim/forms/filtersets.py:1355 -#: dcim/forms/filtersets.py:1376 dcim/forms/filtersets.py:1391 -#: dcim/forms/filtersets.py:1402 dcim/forms/model_forms.py:182 +#: dcim/forms/filtersets.py:92 dcim/forms/filtersets.py:245 +#: dcim/forms/filtersets.py:278 dcim/forms/filtersets.py:330 +#: dcim/forms/filtersets.py:381 dcim/forms/filtersets.py:650 +#: dcim/forms/filtersets.py:689 dcim/forms/filtersets.py:890 +#: dcim/forms/filtersets.py:919 dcim/forms/filtersets.py:939 +#: dcim/forms/filtersets.py:1003 dcim/forms/filtersets.py:1033 +#: dcim/forms/filtersets.py:1042 dcim/forms/filtersets.py:1153 +#: dcim/forms/filtersets.py:1175 dcim/forms/filtersets.py:1197 +#: dcim/forms/filtersets.py:1214 dcim/forms/filtersets.py:1234 +#: dcim/forms/filtersets.py:1342 dcim/forms/filtersets.py:1364 +#: dcim/forms/filtersets.py:1385 dcim/forms/filtersets.py:1400 +#: dcim/forms/filtersets.py:1411 dcim/forms/model_forms.py:182 #: dcim/forms/model_forms.py:216 dcim/forms/model_forms.py:402 -#: dcim/forms/model_forms.py:634 dcim/tables/devices.py:190 +#: dcim/forms/model_forms.py:635 dcim/tables/devices.py:190 #: dcim/tables/power.py:30 dcim/tables/racks.py:58 dcim/tables/racks.py:143 -#: extras/filtersets.py:410 extras/forms/filtersets.py:303 -#: ipam/forms/bulk_edit.py:458 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:403 ipam/forms/filtersets.py:425 -#: ipam/forms/filtersets.py:451 ipam/forms/model_forms.py:562 -#: templates/dcim/device.html:34 templates/dcim/device_edit.html:30 +#: extras/filtersets.py:441 extras/forms/filtersets.py:328 +#: ipam/forms/bulk_edit.py:456 ipam/forms/filtersets.py:168 +#: ipam/forms/filtersets.py:400 ipam/forms/filtersets.py:422 +#: ipam/forms/filtersets.py:448 ipam/forms/model_forms.py:560 +#: templates/dcim/device.html:26 templates/dcim/device_edit.html:30 #: templates/dcim/inc/cable_termination.html:12 templates/dcim/location.html:27 -#: templates/dcim/powerpanel.html:27 templates/dcim/rack.html:27 -#: templates/dcim/rackreservation.html:34 virtualization/forms/filtersets.py:43 -#: virtualization/forms/filtersets.py:96 wireless/forms/model_forms.py:88 +#: templates/dcim/powerpanel.html:27 templates/dcim/rack.html:29 +#: templates/dcim/rackreservation.html:35 virtualization/forms/filtersets.py:45 +#: virtualization/forms/filtersets.py:99 wireless/forms/model_forms.py:88 #: wireless/forms/model_forms.py:128 msgid "Location" msgstr "" -#: circuits/forms/filtersets.py:27 ipam/forms/model_forms.py:160 +#: circuits/forms/filtersets.py:27 ipam/forms/model_forms.py:158 #: ipam/models/asns.py:108 ipam/models/asns.py:125 ipam/tables/asn.py:41 #: templates/ipam/asn.html:20 msgid "ASN" msgstr "" #: circuits/forms/filtersets.py:28 circuits/forms/filtersets.py:120 -#: dcim/forms/filtersets.py:135 dcim/forms/filtersets.py:149 -#: dcim/forms/filtersets.py:165 dcim/forms/filtersets.py:196 -#: dcim/forms/filtersets.py:247 dcim/forms/filtersets.py:331 -#: dcim/forms/filtersets.py:405 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:997 netbox/navigation/menu.py:45 +#: dcim/forms/filtersets.py:136 dcim/forms/filtersets.py:150 +#: dcim/forms/filtersets.py:166 dcim/forms/filtersets.py:198 +#: dcim/forms/filtersets.py:249 dcim/forms/filtersets.py:334 +#: dcim/forms/filtersets.py:408 dcim/forms/filtersets.py:654 +#: dcim/forms/filtersets.py:1004 netbox/navigation/menu.py:45 #: netbox/navigation/menu.py:47 tenancy/tables/columns.py:70 -#: tenancy/tables/contacts.py:25 tenancy/views.py:23 -#: virtualization/forms/filtersets.py:34 virtualization/forms/filtersets.py:45 -#: virtualization/forms/filtersets.py:99 +#: tenancy/tables/contacts.py:25 tenancy/views.py:18 +#: virtualization/forms/filtersets.py:36 virtualization/forms/filtersets.py:47 +#: virtualization/forms/filtersets.py:102 msgid "Contacts" msgstr "" -#: circuits/forms/filtersets.py:33 circuits/forms/filtersets.py:156 +#: circuits/forms/filtersets.py:33 circuits/forms/filtersets.py:157 #: dcim/forms/bulk_edit.py:110 dcim/forms/bulk_edit.py:222 #: dcim/forms/bulk_edit.py:747 dcim/forms/bulk_import.py:92 -#: dcim/forms/filtersets.py:69 dcim/forms/filtersets.py:175 -#: dcim/forms/filtersets.py:201 dcim/forms/filtersets.py:253 -#: dcim/forms/filtersets.py:356 dcim/forms/filtersets.py:659 -#: dcim/forms/filtersets.py:889 dcim/forms/filtersets.py:919 -#: dcim/forms/filtersets.py:1002 dcim/forms/filtersets.py:1041 -#: dcim/forms/filtersets.py:1451 dcim/forms/filtersets.py:1475 -#: dcim/forms/filtersets.py:1499 dcim/forms/model_forms.py:80 -#: dcim/forms/model_forms.py:115 dcim/forms/object_create.py:341 -#: dcim/tables/devices.py:176 dcim/tables/sites.py:85 extras/filtersets.py:377 -#: ipam/forms/bulk_edit.py:207 ipam/forms/bulk_edit.py:439 -#: ipam/forms/bulk_edit.py:511 ipam/forms/filtersets.py:216 -#: ipam/forms/filtersets.py:410 ipam/forms/filtersets.py:458 -#: ipam/forms/filtersets.py:576 ipam/forms/model_forms.py:534 -#: templates/dcim/device.html:17 templates/dcim/region.html:26 -#: templates/dcim/site.html:30 virtualization/forms/bulk_edit.py:78 -#: virtualization/forms/filtersets.py:55 virtualization/forms/filtersets.py:126 -#: virtualization/forms/model_forms.py:94 +#: dcim/forms/filtersets.py:70 dcim/forms/filtersets.py:177 +#: dcim/forms/filtersets.py:203 dcim/forms/filtersets.py:256 +#: dcim/forms/filtersets.py:359 dcim/forms/filtersets.py:666 +#: dcim/forms/filtersets.py:896 dcim/forms/filtersets.py:926 +#: dcim/forms/filtersets.py:1010 dcim/forms/filtersets.py:1049 +#: dcim/forms/filtersets.py:1460 dcim/forms/filtersets.py:1484 +#: dcim/forms/filtersets.py:1508 dcim/forms/model_forms.py:80 +#: dcim/forms/model_forms.py:115 dcim/forms/object_create.py:374 +#: dcim/tables/devices.py:176 dcim/tables/sites.py:85 extras/filtersets.py:408 +#: ipam/forms/bulk_edit.py:205 ipam/forms/bulk_edit.py:437 +#: ipam/forms/bulk_edit.py:509 ipam/forms/filtersets.py:212 +#: ipam/forms/filtersets.py:407 ipam/forms/filtersets.py:456 +#: ipam/forms/model_forms.py:532 templates/dcim/device.html:18 +#: templates/dcim/rack.html:19 templates/dcim/rackreservation.html:25 +#: templates/dcim/region.html:26 templates/dcim/site.html:31 +#: templates/ipam/prefix.html:50 templates/ipam/vlan.html:19 +#: virtualization/forms/bulk_edit.py:80 virtualization/forms/filtersets.py:58 +#: virtualization/forms/filtersets.py:129 +#: virtualization/forms/model_forms.py:95 vpn/forms/filtersets.py:253 msgid "Region" msgstr "" -#: circuits/forms/filtersets.py:38 circuits/forms/filtersets.py:161 +#: circuits/forms/filtersets.py:38 circuits/forms/filtersets.py:162 #: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:755 -#: dcim/forms/filtersets.py:74 dcim/forms/filtersets.py:180 -#: dcim/forms/filtersets.py:206 dcim/forms/filtersets.py:266 -#: dcim/forms/filtersets.py:361 dcim/forms/filtersets.py:664 -#: dcim/forms/filtersets.py:894 dcim/forms/filtersets.py:1007 -#: dcim/forms/filtersets.py:1046 dcim/forms/object_create.py:349 -#: extras/filtersets.py:394 ipam/forms/bulk_edit.py:212 -#: ipam/forms/bulk_edit.py:446 ipam/forms/bulk_edit.py:516 -#: ipam/forms/filtersets.py:221 ipam/forms/filtersets.py:415 -#: ipam/forms/filtersets.py:463 ipam/forms/model_forms.py:547 -#: virtualization/forms/bulk_edit.py:83 virtualization/forms/filtersets.py:65 -#: virtualization/forms/filtersets.py:131 -#: virtualization/forms/model_forms.py:100 +#: dcim/forms/filtersets.py:75 dcim/forms/filtersets.py:182 +#: dcim/forms/filtersets.py:208 dcim/forms/filtersets.py:269 +#: dcim/forms/filtersets.py:364 dcim/forms/filtersets.py:671 +#: dcim/forms/filtersets.py:901 dcim/forms/filtersets.py:1015 +#: dcim/forms/filtersets.py:1054 dcim/forms/object_create.py:382 +#: extras/filtersets.py:425 ipam/forms/bulk_edit.py:210 +#: ipam/forms/bulk_edit.py:444 ipam/forms/bulk_edit.py:514 +#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:412 +#: ipam/forms/filtersets.py:461 ipam/forms/model_forms.py:545 +#: virtualization/forms/bulk_edit.py:85 virtualization/forms/filtersets.py:68 +#: virtualization/forms/filtersets.py:134 +#: virtualization/forms/model_forms.py:101 msgid "Site group" msgstr "" @@ -713,25 +731,27 @@ msgstr "" #: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 #: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 -#: core/forms/filtersets.py:64 dcim/forms/bulk_edit.py:718 -#: dcim/forms/filtersets.py:163 dcim/forms/filtersets.py:194 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:913 -#: dcim/forms/filtersets.py:1036 dcim/forms/filtersets.py:1144 -#: dcim/forms/filtersets.py:1166 dcim/forms/filtersets.py:1188 -#: dcim/forms/filtersets.py:1205 dcim/forms/filtersets.py:1222 -#: dcim/forms/filtersets.py:1332 dcim/forms/filtersets.py:1354 -#: dcim/forms/filtersets.py:1375 dcim/forms/filtersets.py:1390 -#: dcim/forms/filtersets.py:1401 extras/forms/filtersets.py:42 -#: extras/forms/filtersets.py:108 extras/forms/filtersets.py:139 -#: extras/forms/filtersets.py:179 extras/forms/filtersets.py:195 -#: extras/forms/filtersets.py:228 extras/forms/filtersets.py:425 -#: extras/forms/filtersets.py:466 ipam/forms/filtersets.py:102 -#: ipam/forms/filtersets.py:259 ipam/forms/filtersets.py:298 -#: ipam/forms/filtersets.py:371 ipam/forms/filtersets.py:452 -#: ipam/forms/filtersets.py:510 ipam/forms/filtersets.py:533 -#: virtualization/forms/filtersets.py:42 virtualization/forms/filtersets.py:97 -#: virtualization/forms/filtersets.py:187 wireless/forms/filtersets.py:33 -#: wireless/forms/filtersets.py:73 +#: core/forms/filtersets.py:63 dcim/forms/bulk_edit.py:718 +#: dcim/forms/filtersets.py:164 dcim/forms/filtersets.py:196 +#: dcim/forms/filtersets.py:825 dcim/forms/filtersets.py:920 +#: dcim/forms/filtersets.py:1044 dcim/forms/filtersets.py:1152 +#: dcim/forms/filtersets.py:1174 dcim/forms/filtersets.py:1196 +#: dcim/forms/filtersets.py:1213 dcim/forms/filtersets.py:1230 +#: dcim/forms/filtersets.py:1341 dcim/forms/filtersets.py:1363 +#: dcim/forms/filtersets.py:1384 dcim/forms/filtersets.py:1399 +#: dcim/forms/filtersets.py:1410 extras/forms/filtersets.py:40 +#: extras/forms/filtersets.py:111 extras/forms/filtersets.py:142 +#: extras/forms/filtersets.py:182 extras/forms/filtersets.py:198 +#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:253 +#: extras/forms/filtersets.py:450 extras/forms/filtersets.py:491 +#: ipam/forms/filtersets.py:98 ipam/forms/filtersets.py:255 +#: ipam/forms/filtersets.py:294 ipam/forms/filtersets.py:368 +#: ipam/forms/filtersets.py:449 ipam/forms/filtersets.py:508 +#: ipam/forms/filtersets.py:526 netbox/tables/tables.py:250 +#: virtualization/forms/filtersets.py:44 virtualization/forms/filtersets.py:100 +#: virtualization/forms/filtersets.py:190 +#: virtualization/forms/filtersets.py:235 vpn/forms/filtersets.py:210 +#: wireless/forms/filtersets.py:33 wireless/forms/filtersets.py:73 msgid "Attributes" msgstr "" @@ -752,12 +772,12 @@ msgstr "" msgid "Circuit Type" msgstr "" -#: circuits/models/circuits.py:25 dcim/models/cables.py:68 -#: dcim/models/device_component_templates.py:492 -#: dcim/models/device_component_templates.py:592 -#: dcim/models/device_components.py:967 dcim/models/device_components.py:1041 -#: dcim/models/device_components.py:1157 dcim/models/devices.py:467 -#: dcim/models/racks.py:43 extras/models/tags.py:31 +#: circuits/models/circuits.py:25 dcim/models/cables.py:67 +#: dcim/models/device_component_templates.py:491 +#: dcim/models/device_component_templates.py:591 +#: dcim/models/device_components.py:976 dcim/models/device_components.py:1050 +#: dcim/models/device_components.py:1166 dcim/models/devices.py:467 +#: dcim/models/racks.py:43 extras/models/tags.py:28 msgid "color" msgstr "" @@ -777,15 +797,15 @@ msgstr "" msgid "Unique circuit ID" msgstr "" -#: circuits/models/circuits.py:67 core/models/data.py:55 core/models/jobs.py:85 -#: dcim/models/cables.py:50 dcim/models/devices.py:641 -#: dcim/models/devices.py:1160 dcim/models/devices.py:1369 +#: circuits/models/circuits.py:67 core/models/data.py:54 core/models/jobs.py:85 +#: dcim/models/cables.py:49 dcim/models/devices.py:641 +#: dcim/models/devices.py:1165 dcim/models/devices.py:1374 #: dcim/models/power.py:95 dcim/models/racks.py:97 dcim/models/sites.py:154 #: dcim/models/sites.py:266 ipam/models/ip.py:252 ipam/models/ip.py:521 -#: ipam/models/ip.py:729 ipam/models/vlans.py:173 +#: ipam/models/ip.py:729 ipam/models/vlans.py:175 #: virtualization/models/clusters.py:74 -#: virtualization/models/virtualmachines.py:81 wireless/models.py:94 -#: wireless/models.py:158 +#: virtualization/models/virtualmachines.py:82 vpn/models/tunnels.py:40 +#: wireless/models.py:94 wireless/models.py:158 msgid "status" msgstr "" @@ -849,15 +869,16 @@ msgstr "" msgid "Patch panel ID and port number(s)" msgstr "" -#: circuits/models/circuits.py:210 dcim/models/device_component_templates.py:62 -#: dcim/models/device_components.py:70 dcim/models/racks.py:536 +#: circuits/models/circuits.py:210 dcim/models/device_component_templates.py:61 +#: dcim/models/device_components.py:69 dcim/models/racks.py:537 #: extras/models/configs.py:45 extras/models/configs.py:219 -#: extras/models/customfields.py:116 extras/models/models.py:343 -#: extras/models/models.py:458 extras/models/staging.py:31 -#: extras/models/tags.py:35 netbox/models/__init__.py:109 +#: extras/models/customfields.py:122 extras/models/models.py:58 +#: extras/models/models.py:188 extras/models/models.py:426 +#: extras/models/models.py:541 extras/models/staging.py:31 +#: extras/models/tags.py:32 netbox/models/__init__.py:109 #: netbox/models/__init__.py:144 netbox/models/__init__.py:190 -#: users/models.py:270 users/models.py:345 -#: virtualization/models/virtualmachines.py:256 +#: users/models.py:273 users/models.py:348 +#: virtualization/models/virtualmachines.py:282 msgid "description" msgstr "" @@ -870,25 +891,28 @@ msgid "circuit terminations" msgstr "" #: circuits/models/providers.py:22 circuits/models/providers.py:66 -#: circuits/models/providers.py:104 core/models/data.py:42 -#: core/models/jobs.py:46 dcim/models/device_component_templates.py:44 -#: dcim/models/device_components.py:55 dcim/models/devices.py:581 -#: dcim/models/devices.py:1300 dcim/models/devices.py:1365 +#: circuits/models/providers.py:104 core/models/data.py:41 +#: core/models/jobs.py:46 dcim/models/device_component_templates.py:43 +#: dcim/models/device_components.py:54 dcim/models/devices.py:581 +#: dcim/models/devices.py:1305 dcim/models/devices.py:1370 #: dcim/models/power.py:39 dcim/models/power.py:91 dcim/models/racks.py:62 #: dcim/models/sites.py:138 extras/models/configs.py:36 -#: extras/models/configs.py:215 extras/models/customfields.py:83 -#: extras/models/models.py:55 extras/models/models.py:243 -#: extras/models/models.py:339 extras/models/models.py:448 -#: extras/models/models.py:543 extras/models/staging.py:26 -#: ipam/models/asns.py:18 ipam/models/fhrp.py:26 ipam/models/l2vpn.py:22 +#: extras/models/configs.py:215 extras/models/customfields.py:89 +#: extras/models/models.py:53 extras/models/models.py:183 +#: extras/models/models.py:326 extras/models/models.py:422 +#: extras/models/models.py:531 extras/models/models.py:626 +#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 #: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:27 ipam/models/vlans.py:162 ipam/models/vrfs.py:22 +#: ipam/models/vlans.py:26 ipam/models/vlans.py:164 ipam/models/vrfs.py:22 #: ipam/models/vrfs.py:79 netbox/models/__init__.py:136 -#: netbox/models/__init__.py:180 tenancy/models/contacts.py:63 +#: netbox/models/__init__.py:180 tenancy/models/contacts.py:64 #: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 -#: users/models.py:341 virtualization/models/clusters.py:57 -#: virtualization/models/virtualmachines.py:69 -#: virtualization/models/virtualmachines.py:246 wireless/models.py:50 +#: users/models.py:344 virtualization/models/clusters.py:57 +#: virtualization/models/virtualmachines.py:70 +#: virtualization/models/virtualmachines.py:272 vpn/models/crypto.py:24 +#: vpn/models/crypto.py:71 vpn/models/crypto.py:119 vpn/models/crypto.py:171 +#: vpn/models/crypto.py:209 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 +#: wireless/models.py:50 msgid "name" msgstr "" @@ -897,11 +921,10 @@ msgid "Full name of the provider" msgstr "" #: circuits/models/providers.py:28 dcim/models/devices.py:86 -#: dcim/models/sites.py:149 extras/models/models.py:453 ipam/models/asns.py:23 -#: ipam/models/l2vpn.py:27 ipam/models/vlans.py:31 -#: netbox/models/__init__.py:140 netbox/models/__init__.py:185 -#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 -#: wireless/models.py:55 +#: dcim/models/sites.py:149 extras/models/models.py:536 ipam/models/asns.py:23 +#: ipam/models/vlans.py:30 netbox/models/__init__.py:140 +#: netbox/models/__init__.py:185 tenancy/models/tenants.py:25 +#: tenancy/models/tenants.py:49 vpn/models/l2vpn.py:27 wireless/models.py:55 msgid "slug" msgstr "" @@ -939,30 +962,29 @@ msgstr "" #: circuits/tables/circuits.py:29 circuits/tables/providers.py:18 #: circuits/tables/providers.py:69 circuits/tables/providers.py:99 -#: core/tables/data.py:16 core/tables/jobs.py:14 dcim/forms/filtersets.py:59 +#: core/tables/data.py:16 core/tables/jobs.py:14 dcim/forms/filtersets.py:60 #: dcim/forms/object_create.py:42 dcim/tables/devices.py:88 #: dcim/tables/devices.py:125 dcim/tables/devices.py:167 #: dcim/tables/devices.py:318 dcim/tables/devices.py:395 -#: dcim/tables/devices.py:439 dcim/tables/devices.py:485 -#: dcim/tables/devices.py:537 dcim/tables/devices.py:646 -#: dcim/tables/devices.py:727 dcim/tables/devices.py:777 -#: dcim/tables/devices.py:843 dcim/tables/devices.py:954 -#: dcim/tables/devices.py:974 dcim/tables/devices.py:1003 -#: dcim/tables/devices.py:1033 dcim/tables/devicetypes.py:32 +#: dcim/tables/devices.py:439 dcim/tables/devices.py:491 +#: dcim/tables/devices.py:543 dcim/tables/devices.py:663 +#: dcim/tables/devices.py:744 dcim/tables/devices.py:794 +#: dcim/tables/devices.py:860 dcim/tables/devices.py:975 +#: dcim/tables/devices.py:995 dcim/tables/devices.py:1024 +#: dcim/tables/devices.py:1054 dcim/tables/devicetypes.py:32 #: dcim/tables/power.py:22 dcim/tables/power.py:62 dcim/tables/racks.py:23 #: dcim/tables/racks.py:53 dcim/tables/sites.py:24 dcim/tables/sites.py:51 #: dcim/tables/sites.py:78 dcim/tables/sites.py:125 -#: extras/forms/filtersets.py:187 extras/tables/tables.py:65 -#: extras/tables/tables.py:105 extras/tables/tables.py:137 -#: extras/tables/tables.py:161 extras/tables/tables.py:226 -#: extras/tables/tables.py:273 extras/tables/tables.py:319 -#: extras/tables/tables.py:371 extras/tables/tables.py:394 -#: ipam/forms/bulk_edit.py:392 ipam/forms/filtersets.py:375 -#: ipam/tables/asn.py:16 ipam/tables/ip.py:85 ipam/tables/ip.py:159 -#: ipam/tables/l2vpn.py:23 ipam/tables/services.py:15 -#: ipam/tables/services.py:40 ipam/tables/vlans.py:64 ipam/tables/vlans.py:110 -#: ipam/tables/vrfs.py:26 ipam/tables/vrfs.py:67 -#: templates/circuits/circuittype.html:25 +#: extras/forms/filtersets.py:190 extras/tables/tables.py:40 +#: extras/tables/tables.py:83 extras/tables/tables.py:115 +#: extras/tables/tables.py:139 extras/tables/tables.py:204 +#: extras/tables/tables.py:251 extras/tables/tables.py:274 +#: extras/tables/tables.py:319 extras/tables/tables.py:371 +#: extras/tables/tables.py:394 ipam/forms/bulk_edit.py:390 +#: ipam/forms/filtersets.py:372 ipam/tables/asn.py:16 ipam/tables/ip.py:85 +#: ipam/tables/ip.py:159 ipam/tables/services.py:15 ipam/tables/services.py:40 +#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:110 ipam/tables/vrfs.py:26 +#: ipam/tables/vrfs.py:67 templates/circuits/circuittype.html:25 #: templates/circuits/provideraccount.html:29 #: templates/circuits/providernetwork.html:27 templates/core/datasource.html:35 #: templates/core/job.html:31 templates/dcim/consoleport.html:31 @@ -970,7 +992,7 @@ msgstr "" #: templates/dcim/devicerole.html:29 templates/dcim/frontport.html:31 #: templates/dcim/inc/interface_vlans_table.html:5 #: templates/dcim/inc/panels/inventory_items.html:10 -#: templates/dcim/interface.html:39 templates/dcim/interface.html:167 +#: templates/dcim/interface.html:39 templates/dcim/interface.html:171 #: templates/dcim/inventoryitem.html:29 #: templates/dcim/inventoryitemrole.html:19 templates/dcim/location.html:32 #: templates/dcim/manufacturer.html:39 templates/dcim/modulebay.html:27 @@ -981,11 +1003,11 @@ msgstr "" #: templates/extras/admin/plugins_list.html:22 #: templates/extras/configcontext.html:14 #: templates/extras/configtemplate.html:14 templates/extras/customfield.html:16 -#: templates/extras/customlink.html:14 templates/extras/exporttemplate.html:21 -#: templates/extras/report_list.html:46 templates/extras/savedfilter.html:14 -#: templates/extras/script_list.html:52 templates/extras/tag.html:17 -#: templates/extras/webhook.html:16 templates/ipam/asnrange.html:16 -#: templates/ipam/fhrpgroup.html:31 templates/ipam/l2vpn.html:15 +#: templates/extras/customlink.html:14 templates/extras/eventrule.html:16 +#: templates/extras/exporttemplate.html:21 templates/extras/report_list.html:46 +#: templates/extras/savedfilter.html:14 templates/extras/script_list.html:52 +#: templates/extras/tag.html:17 templates/extras/webhook.html:16 +#: templates/ipam/asnrange.html:16 templates/ipam/fhrpgroup.html:31 #: templates/ipam/rir.html:25 templates/ipam/role.html:25 #: templates/ipam/routetarget.html:14 templates/ipam/service.html:27 #: templates/ipam/servicetemplate.html:16 templates/ipam/vlan.html:38 @@ -996,24 +1018,35 @@ msgstr "" #: templates/virtualization/cluster.html:16 #: templates/virtualization/clustergroup.html:25 #: templates/virtualization/clustertype.html:25 +#: templates/virtualization/virtualdisk.html:26 #: templates/virtualization/virtualmachine.html:18 -#: templates/virtualization/vminterface.html:28 +#: templates/virtualization/vminterface.html:28 templates/vpn/ikepolicy.html:14 +#: templates/vpn/ikeproposal.html:14 templates/vpn/ipsecpolicy.html:14 +#: templates/vpn/ipsecprofile.html:14 templates/vpn/ipsecprofile.html:39 +#: templates/vpn/ipsecprofile.html:74 templates/vpn/ipsecproposal.html:14 +#: templates/vpn/l2vpn.html:15 templates/vpn/tunnel.html:22 +#: templates/vpn/tunnelgroup.html:29 #: templates/wireless/wirelesslangroup.html:30 tenancy/tables/contacts.py:19 #: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 #: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 users/tables.py:62 -#: users/tables.py:79 virtualization/forms/bulk_create.py:19 -#: virtualization/forms/object_create.py:12 +#: users/tables.py:79 virtualization/forms/bulk_create.py:20 +#: virtualization/forms/object_create.py:13 +#: virtualization/forms/object_create.py:23 #: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 #: virtualization/tables/clusters.py:62 -#: virtualization/tables/virtualmachines.py:43 -#: virtualization/tables/virtualmachines.py:114 -#: wireless/tables/wirelesslan.py:18 wireless/tables/wirelesslan.py:79 +#: virtualization/tables/virtualmachines.py:45 +#: virtualization/tables/virtualmachines.py:119 +#: virtualization/tables/virtualmachines.py:172 vpn/tables/crypto.py:18 +#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 +#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 +#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 +#: wireless/tables/wirelesslan.py:79 msgid "Name" msgstr "" #: circuits/tables/circuits.py:38 circuits/tables/providers.py:45 -#: circuits/tables/providers.py:79 netbox/navigation/menu.py:235 -#: netbox/navigation/menu.py:239 netbox/navigation/menu.py:241 +#: circuits/tables/providers.py:79 netbox/navigation/menu.py:254 +#: netbox/navigation/menu.py:258 netbox/navigation/menu.py:260 #: templates/circuits/provider.html:61 #: templates/circuits/provideraccount.html:46 #: templates/circuits/providernetwork.html:54 @@ -1038,19 +1071,21 @@ msgstr "" #: circuits/tables/circuits.py:75 circuits/tables/providers.py:48 #: circuits/tables/providers.py:82 circuits/tables/providers.py:107 -#: dcim/tables/devices.py:1016 dcim/tables/devicetypes.py:92 +#: dcim/tables/devices.py:1037 dcim/tables/devicetypes.py:92 #: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 -#: dcim/tables/power.py:91 dcim/tables/racks.py:76 dcim/tables/racks.py:156 -#: dcim/tables/sites.py:103 extras/forms/bulk_edit.py:299 -#: extras/tables/tables.py:485 ipam/tables/asn.py:68 ipam/tables/fhrp.py:34 +#: dcim/tables/power.py:96 dcim/tables/racks.py:76 dcim/tables/racks.py:156 +#: dcim/tables/sites.py:103 extras/forms/bulk_edit.py:320 +#: extras/tables/tables.py:485 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 #: ipam/tables/ip.py:135 ipam/tables/ip.py:272 ipam/tables/ip.py:325 -#: ipam/tables/ip.py:392 ipam/tables/l2vpn.py:37 ipam/tables/services.py:24 -#: ipam/tables/services.py:54 ipam/tables/vlans.py:141 ipam/tables/vrfs.py:46 -#: ipam/tables/vrfs.py:71 templates/dcim/cable_edit.html:85 -#: templates/generic/bulk_edit.html:102 templates/inc/panels/comments.html:6 -#: tenancy/tables/contacts.py:68 tenancy/tables/tenants.py:46 -#: utilities/forms/fields/fields.py:29 virtualization/tables/clusters.py:91 -#: virtualization/tables/virtualmachines.py:66 +#: ipam/tables/ip.py:392 ipam/tables/services.py:24 ipam/tables/services.py:54 +#: ipam/tables/vlans.py:141 ipam/tables/vrfs.py:46 ipam/tables/vrfs.py:71 +#: templates/dcim/cable_edit.html:85 templates/generic/bulk_edit.html:102 +#: templates/inc/panels/comments.html:6 tenancy/tables/contacts.py:68 +#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 +#: virtualization/tables/clusters.py:91 +#: virtualization/tables/virtualmachines.py:68 vpn/tables/crypto.py:37 +#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 +#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:57 #: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 msgid "Comments" msgstr "" @@ -1079,47 +1114,47 @@ msgstr "" msgid "Syncing" msgstr "" -#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:40 -#: extras/choices.py:199 templates/core/job.html:69 +#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 +#: extras/choices.py:210 templates/core/job.html:75 msgid "Completed" msgstr "" #: core/choices.py:22 core/choices.py:59 dcim/choices.py:176 -#: dcim/choices.py:222 dcim/choices.py:1496 extras/choices.py:201 +#: dcim/choices.py:222 dcim/choices.py:1496 extras/choices.py:212 #: virtualization/choices.py:47 msgid "Failed" msgstr "" -#: core/choices.py:35 netbox/navigation/menu.py:311 +#: core/choices.py:35 netbox/navigation/menu.py:330 #: templates/extras/script/base.html:14 templates/extras/script_list.html:6 #: templates/extras/script_list.html:20 templates/extras/script_result.html:18 msgid "Scripts" msgstr "" -#: core/choices.py:36 netbox/navigation/menu.py:305 +#: core/choices.py:36 netbox/navigation/menu.py:324 #: templates/extras/report/base.html:13 templates/extras/report_list.html:7 #: templates/extras/report_list.html:12 msgid "Reports" msgstr "" -#: core/choices.py:54 extras/choices.py:196 +#: core/choices.py:54 extras/choices.py:207 msgid "Pending" msgstr "" -#: core/choices.py:55 core/tables/jobs.py:31 extras/choices.py:197 -#: templates/core/job.html:56 +#: core/choices.py:55 core/tables/jobs.py:32 extras/choices.py:208 +#: templates/core/job.html:62 msgid "Scheduled" msgstr "" -#: core/choices.py:56 extras/choices.py:198 +#: core/choices.py:56 extras/choices.py:209 msgid "Running" msgstr "" -#: core/choices.py:58 extras/choices.py:200 +#: core/choices.py:58 extras/choices.py:211 msgid "Errored" msgstr "" -#: core/data_backends.py:29 templates/dcim/interface.html:220 +#: core/data_backends.py:29 templates/dcim/interface.html:224 msgid "Local" msgstr "" @@ -1150,21 +1185,25 @@ msgstr "" msgid "AWS secret access key" msgstr "" -#: core/filtersets.py:48 extras/filtersets.py:172 extras/filtersets.py:507 -#: extras/filtersets.py:535 +#: core/filtersets.py:49 extras/filtersets.py:203 extras/filtersets.py:538 +#: extras/filtersets.py:566 msgid "Data source (ID)" msgstr "" -#: core/filtersets.py:54 +#: core/filtersets.py:55 msgid "Data source (name)" msgstr "" -#: core/forms/bulk_edit.py:24 ipam/forms/bulk_edit.py:49 +#: core/forms/bulk_edit.py:24 ipam/forms/bulk_edit.py:47 msgid "Enforce unique space" msgstr "" -#: core/forms/bulk_edit.py:33 extras/forms/model_forms.py:196 -#: templates/extras/savedfilter.html:57 +#: core/forms/bulk_edit.py:33 extras/forms/model_forms.py:202 +#: templates/extras/savedfilter.html:57 vpn/forms/filtersets.py:95 +#: vpn/forms/filtersets.py:124 vpn/forms/filtersets.py:148 +#: vpn/forms/filtersets.py:167 vpn/forms/model_forms.py:294 +#: vpn/forms/model_forms.py:315 vpn/forms/model_forms.py:329 +#: vpn/forms/model_forms.py:350 vpn/forms/model_forms.py:373 msgid "Parameters" msgstr "" @@ -1172,9 +1211,9 @@ msgstr "" msgid "Ignore rules" msgstr "" -#: core/forms/filtersets.py:27 core/forms/model_forms.py:89 -#: extras/forms/model_forms.py:159 extras/forms/model_forms.py:352 -#: extras/forms/model_forms.py:405 extras/tables/tables.py:171 +#: core/forms/filtersets.py:26 core/forms/model_forms.py:95 +#: extras/forms/model_forms.py:165 extras/forms/model_forms.py:455 +#: extras/forms/model_forms.py:508 extras/tables/tables.py:149 #: extras/tables/tables.py:363 extras/tables/tables.py:398 #: templates/core/datasource.html:31 #: templates/dcim/device/render_config.html:19 @@ -1185,153 +1224,253 @@ msgstr "" msgid "Data Source" msgstr "" -#: core/forms/filtersets.py:40 core/tables/data.py:26 +#: core/forms/filtersets.py:39 core/tables/data.py:26 #: dcim/forms/bulk_edit.py:1012 dcim/forms/bulk_edit.py:1285 -#: dcim/forms/filtersets.py:1261 dcim/tables/devices.py:562 -#: dcim/tables/devicetypes.py:221 extras/forms/bulk_edit.py:92 -#: extras/forms/bulk_edit.py:156 extras/forms/bulk_edit.py:177 -#: extras/forms/filtersets.py:116 extras/forms/filtersets.py:203 -#: extras/forms/filtersets.py:242 extras/tables/tables.py:144 -#: extras/tables/tables.py:233 extras/tables/tables.py:280 +#: dcim/forms/filtersets.py:1270 dcim/tables/devices.py:568 +#: dcim/tables/devicetypes.py:221 extras/forms/bulk_edit.py:97 +#: extras/forms/bulk_edit.py:161 extras/forms/bulk_edit.py:220 +#: extras/forms/filtersets.py:119 extras/forms/filtersets.py:206 +#: extras/forms/filtersets.py:267 extras/tables/tables.py:122 +#: extras/tables/tables.py:211 extras/tables/tables.py:284 #: templates/core/datasource.html:43 templates/dcim/interface.html:62 -#: templates/extras/customlink.html:18 templates/extras/savedfilter.html:26 -#: templates/extras/webhook.html:20 templates/users/objectpermission.html:26 +#: templates/extras/customlink.html:18 templates/extras/eventrule.html:20 +#: templates/extras/savedfilter.html:26 +#: templates/users/objectpermission.html:26 #: templates/virtualization/vminterface.html:32 users/forms/bulk_edit.py:69 -#: users/forms/filtersets.py:73 users/tables.py:86 -#: virtualization/forms/bulk_edit.py:214 virtualization/forms/filtersets.py:203 +#: users/forms/filtersets.py:71 users/tables.py:86 +#: virtualization/forms/bulk_edit.py:216 virtualization/forms/filtersets.py:207 msgid "Enabled" msgstr "" -#: core/forms/filtersets.py:52 core/forms/mixins.py:21 +#: core/forms/filtersets.py:51 core/forms/mixins.py:21 msgid "File" msgstr "" -#: core/forms/filtersets.py:57 core/forms/mixins.py:16 -#: extras/forms/filtersets.py:144 extras/forms/filtersets.py:311 -#: extras/forms/filtersets.py:397 +#: core/forms/filtersets.py:56 core/forms/mixins.py:16 +#: extras/forms/filtersets.py:147 extras/forms/filtersets.py:336 +#: extras/forms/filtersets.py:422 msgid "Data source" msgstr "" -#: core/forms/filtersets.py:65 extras/forms/filtersets.py:424 +#: core/forms/filtersets.py:64 extras/forms/filtersets.py:449 msgid "Creation" msgstr "" -#: core/forms/filtersets.py:71 extras/forms/filtersets.py:448 -#: extras/forms/filtersets.py:494 extras/tables/tables.py:474 -#: ipam/tables/l2vpn.py:59 templates/core/job.html:25 -#: templates/extras/objectchange.html:56 tenancy/tables/contacts.py:90 +#: core/forms/filtersets.py:70 extras/forms/filtersets.py:473 +#: extras/forms/filtersets.py:519 extras/tables/tables.py:474 +#: templates/core/job.html:25 templates/extras/objectchange.html:56 +#: tenancy/tables/contacts.py:90 vpn/tables/l2vpn.py:59 msgid "Object Type" msgstr "" -#: core/forms/filtersets.py:81 +#: core/forms/filtersets.py:80 msgid "Created after" msgstr "" -#: core/forms/filtersets.py:86 +#: core/forms/filtersets.py:85 msgid "Created before" msgstr "" -#: core/forms/filtersets.py:91 +#: core/forms/filtersets.py:90 msgid "Scheduled after" msgstr "" -#: core/forms/filtersets.py:96 +#: core/forms/filtersets.py:95 msgid "Scheduled before" msgstr "" -#: core/forms/filtersets.py:101 +#: core/forms/filtersets.py:100 msgid "Started after" msgstr "" -#: core/forms/filtersets.py:106 +#: core/forms/filtersets.py:105 msgid "Started before" msgstr "" -#: core/forms/filtersets.py:111 +#: core/forms/filtersets.py:110 msgid "Completed after" msgstr "" -#: core/forms/filtersets.py:116 +#: core/forms/filtersets.py:115 msgid "Completed before" msgstr "" -#: core/forms/filtersets.py:123 dcim/forms/bulk_edit.py:359 -#: dcim/forms/filtersets.py:349 dcim/forms/filtersets.py:393 -#: dcim/forms/model_forms.py:251 extras/forms/filtersets.py:440 -#: extras/forms/filtersets.py:486 templates/dcim/rackreservation.html:65 +#: core/forms/filtersets.py:122 dcim/forms/bulk_edit.py:359 +#: dcim/forms/filtersets.py:352 dcim/forms/filtersets.py:396 +#: dcim/forms/model_forms.py:251 extras/forms/filtersets.py:465 +#: extras/forms/filtersets.py:511 templates/dcim/rackreservation.html:65 #: templates/extras/objectchange.html:40 templates/extras/savedfilter.html:22 #: templates/users/token.html:22 templates/users/user.html:6 #: templates/users/user.html:14 users/filtersets.py:74 users/filtersets.py:134 -#: users/forms/filtersets.py:87 users/forms/filtersets.py:128 +#: users/forms/filtersets.py:85 users/forms/filtersets.py:126 #: users/forms/model_forms.py:156 users/forms/model_forms.py:194 #: users/tables.py:19 msgid "User" msgstr "" -#: core/forms/model_forms.py:46 core/tables/data.py:46 +#: core/forms/model_forms.py:52 core/tables/data.py:46 #: templates/core/datafile.html:36 templates/extras/report/base.html:33 #: templates/extras/script/base.html:32 templates/extras/script_result.html:45 msgid "Source" msgstr "" -#: core/forms/model_forms.py:50 +#: core/forms/model_forms.py:56 msgid "Backend Parameters" msgstr "" -#: core/forms/model_forms.py:88 +#: core/forms/model_forms.py:94 msgid "File Upload" msgstr "" -#: core/models/data.py:47 dcim/models/cables.py:44 -#: dcim/models/device_component_templates.py:178 -#: dcim/models/device_component_templates.py:212 -#: dcim/models/device_component_templates.py:247 -#: dcim/models/device_component_templates.py:309 -#: dcim/models/device_component_templates.py:388 -#: dcim/models/device_component_templates.py:487 -#: dcim/models/device_component_templates.py:587 -#: dcim/models/device_components.py:285 dcim/models/device_components.py:314 -#: dcim/models/device_components.py:347 dcim/models/device_components.py:465 -#: dcim/models/device_components.py:603 dcim/models/device_components.py:962 -#: dcim/models/device_components.py:1036 dcim/models/power.py:101 -#: dcim/models/racks.py:127 extras/models/customfields.py:69 -#: extras/models/search.py:41 ipam/models/l2vpn.py:32 -#: virtualization/models/clusters.py:61 +#: core/forms/model_forms.py:147 templates/core/configrevision.html:43 +#: templates/dcim/rack_elevation_list.html:6 +msgid "Rack Elevations" +msgstr "" + +#: core/forms/model_forms.py:148 dcim/choices.py:1407 +#: dcim/forms/bulk_edit.py:859 dcim/forms/bulk_edit.py:1242 +#: dcim/forms/bulk_edit.py:1260 dcim/tables/racks.py:89 +#: netbox/navigation/menu.py:276 netbox/navigation/menu.py:280 +msgid "Power" +msgstr "" + +#: core/forms/model_forms.py:149 netbox/navigation/menu.py:142 +#: templates/core/configrevision.html:79 +msgid "IPAM" +msgstr "" + +#: core/forms/model_forms.py:150 netbox/navigation/menu.py:218 +#: templates/core/configrevision.html:95 vpn/forms/bulk_edit.py:76 +#: vpn/forms/filtersets.py:42 vpn/forms/model_forms.py:60 +#: vpn/forms/model_forms.py:145 +msgid "Security" +msgstr "" + +#: core/forms/model_forms.py:151 templates/core/configrevision.html:107 +msgid "Banners" +msgstr "" + +#: core/forms/model_forms.py:152 templates/core/configrevision.html:131 +msgid "Pagination" +msgstr "" + +#: core/forms/model_forms.py:153 extras/forms/model_forms.py:63 +#: templates/core/configrevision.html:147 +msgid "Validation" +msgstr "" + +#: core/forms/model_forms.py:154 templates/account/preferences.html:6 +#: templates/core/configrevision.html:175 +msgid "User Preferences" +msgstr "" + +#: core/forms/model_forms.py:155 dcim/forms/filtersets.py:658 +#: templates/core/configrevision.html:193 users/forms/model_forms.py:63 +msgid "Miscellaneous" +msgstr "" + +#: core/forms/model_forms.py:158 +msgid "Config Revision" +msgstr "" + +#: core/forms/model_forms.py:197 +msgid "This parameter has been defined statically and cannot be modified." +msgstr "" + +#: core/forms/model_forms.py:205 +#, python-brace-format +msgid "Current value: {value}" +msgstr "" + +#: core/forms/model_forms.py:207 +msgid " (default)" +msgstr "" + +#: core/models/config.py:18 core/models/data.py:259 core/models/files.py:27 +#: core/models/jobs.py:50 extras/models/models.py:760 +#: netbox/models/features.py:52 users/models.py:248 +msgid "created" +msgstr "" + +#: core/models/config.py:22 +msgid "comment" +msgstr "" + +#: core/models/config.py:29 +msgid "configuration data" +msgstr "" + +#: core/models/config.py:36 +msgid "config revision" +msgstr "" + +#: core/models/config.py:37 +msgid "config revisions" +msgstr "" + +#: core/models/config.py:41 +msgid "Default configuration" +msgstr "" + +#: core/models/config.py:43 +msgid "Current configuration" +msgstr "" + +#: core/models/config.py:44 +#, python-brace-format +msgid "Config revision #{id}" +msgstr "" + +#: core/models/data.py:46 dcim/models/cables.py:43 +#: dcim/models/device_component_templates.py:177 +#: dcim/models/device_component_templates.py:211 +#: dcim/models/device_component_templates.py:246 +#: dcim/models/device_component_templates.py:308 +#: dcim/models/device_component_templates.py:387 +#: dcim/models/device_component_templates.py:486 +#: dcim/models/device_component_templates.py:586 +#: dcim/models/device_components.py:284 dcim/models/device_components.py:313 +#: dcim/models/device_components.py:346 dcim/models/device_components.py:464 +#: dcim/models/device_components.py:606 dcim/models/device_components.py:971 +#: dcim/models/device_components.py:1045 dcim/models/power.py:101 +#: dcim/models/racks.py:127 extras/models/customfields.py:75 +#: extras/models/search.py:43 virtualization/models/clusters.py:61 +#: vpn/models/l2vpn.py:32 msgid "type" msgstr "" -#: core/models/data.py:52 extras/choices.py:34 extras/models/models.py:86 +#: core/models/data.py:51 extras/choices.py:34 extras/models/models.py:194 #: templates/core/datasource.html:59 msgid "URL" msgstr "" -#: core/models/data.py:62 dcim/models/device_component_templates.py:393 -#: dcim/models/device_components.py:514 extras/models/models.py:93 -#: extras/models/models.py:248 extras/models/models.py:473 users/models.py:350 +#: core/models/data.py:61 dcim/models/device_component_templates.py:392 +#: dcim/models/device_components.py:513 extras/models/models.py:88 +#: extras/models/models.py:331 extras/models/models.py:556 users/models.py:353 msgid "enabled" msgstr "" -#: core/models/data.py:66 +#: core/models/data.py:65 msgid "ignore rules" msgstr "" -#: core/models/data.py:68 +#: core/models/data.py:67 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" -#: core/models/data.py:71 extras/models/models.py:481 +#: core/models/data.py:70 extras/models/models.py:564 msgid "parameters" msgstr "" -#: core/models/data.py:76 +#: core/models/data.py:75 msgid "last synced" msgstr "" -#: core/models/data.py:84 +#: core/models/data.py:83 msgid "data source" msgstr "" -#: core/models/data.py:85 +#: core/models/data.py:84 msgid "data sources" msgstr "" @@ -1340,17 +1479,11 @@ msgstr "" msgid "Unknown backend type: {type}" msgstr "" -#: core/models/data.py:259 core/models/files.py:26 core/models/jobs.py:50 -#: extras/models/models.py:663 extras/models/models.py:704 -#: netbox/models/features.py:51 users/models.py:245 -msgid "created" -msgstr "" - -#: core/models/data.py:263 core/models/files.py:30 netbox/models/features.py:57 +#: core/models/data.py:263 core/models/files.py:31 netbox/models/features.py:58 msgid "last updated" msgstr "" -#: core/models/data.py:273 dcim/models/cables.py:417 +#: core/models/data.py:273 dcim/models/cables.py:430 msgid "path" msgstr "" @@ -1382,31 +1515,31 @@ msgstr "" msgid "data files" msgstr "" -#: core/models/data.py:391 +#: core/models/data.py:393 msgid "auto sync record" msgstr "" -#: core/models/data.py:392 +#: core/models/data.py:394 msgid "auto sync records" msgstr "" -#: core/models/files.py:36 +#: core/models/files.py:37 msgid "file root" msgstr "" -#: core/models/files.py:41 +#: core/models/files.py:42 msgid "file path" msgstr "" -#: core/models/files.py:43 +#: core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "" -#: core/models/files.py:59 +#: core/models/files.py:61 msgid "managed file" msgstr "" -#: core/models/files.py:60 +#: core/models/files.py:62 msgid "managed files" msgstr "" @@ -1430,22 +1563,36 @@ msgstr "" msgid "completed" msgstr "" -#: core/models/jobs.py:91 extras/models/staging.py:87 +#: core/models/jobs.py:91 extras/models/models.py:123 +#: extras/models/staging.py:87 msgid "data" msgstr "" #: core/models/jobs.py:96 +msgid "error" +msgstr "" + +#: core/models/jobs.py:101 msgid "job ID" msgstr "" -#: core/models/jobs.py:104 +#: core/models/jobs.py:112 msgid "job" msgstr "" -#: core/models/jobs.py:105 +#: core/models/jobs.py:113 msgid "jobs" msgstr "" +#: core/models/jobs.py:135 +#, python-brace-format +msgid "Jobs cannot be assigned to this object type ({type})." +msgstr "" + +#: core/tables/config.py:21 users/forms/filtersets.py:45 users/tables.py:39 +msgid "Is Active" +msgstr "" + #: core/tables/data.py:50 templates/core/datafile.html:40 msgid "Path" msgstr "" @@ -1455,32 +1602,33 @@ msgid "Last updated" msgstr "" #: core/tables/jobs.py:10 dcim/tables/devicetypes.py:161 -#: extras/tables/tables.py:196 extras/tables/tables.py:340 -#: netbox/tables/tables.py:180 templates/dcim/virtualchassis_edit.html:53 +#: extras/tables/tables.py:174 extras/tables/tables.py:340 +#: netbox/tables/tables.py:184 templates/dcim/virtualchassis_edit.html:53 #: wireless/tables/wirelesslink.py:16 msgid "ID" msgstr "" -#: core/tables/jobs.py:21 extras/choices.py:38 extras/tables/tables.py:258 +#: core/tables/jobs.py:21 extras/choices.py:38 extras/tables/tables.py:236 #: extras/tables/tables.py:350 extras/tables/tables.py:448 -#: extras/tables/tables.py:479 ipam/tables/l2vpn.py:64 -#: netbox/tables/tables.py:229 templates/extras/htmx/report_result.html:45 +#: extras/tables/tables.py:479 netbox/tables/tables.py:238 +#: templates/extras/eventrule.html:99 +#: templates/extras/htmx/report_result.html:45 #: templates/extras/journalentry.html:21 templates/extras/objectchange.html:62 -#: tenancy/tables/contacts.py:93 +#: tenancy/tables/contacts.py:93 vpn/tables/l2vpn.py:64 msgid "Object" msgstr "" -#: core/tables/jobs.py:34 +#: core/tables/jobs.py:35 msgid "Interval" msgstr "" -#: core/tables/jobs.py:37 templates/core/job.html:65 +#: core/tables/jobs.py:38 templates/core/job.html:71 #: templates/extras/htmx/report_result.html:7 #: templates/extras/htmx/script_result.html:8 msgid "Started" msgstr "" -#: dcim/api/serializers.py:205 templates/dcim/rack.html:40 +#: dcim/api/serializers.py:205 templates/dcim/rack.html:33 msgid "Facility ID" msgstr "" @@ -1540,7 +1688,7 @@ msgstr "" msgid "Reserved" msgstr "" -#: dcim/choices.py:101 templates/dcim/device.html:279 +#: dcim/choices.py:101 templates/dcim/device.html:262 msgid "Available" msgstr "" @@ -1549,7 +1697,7 @@ msgstr "" msgid "Deprecated" msgstr "" -#: dcim/choices.py:114 templates/dcim/rack.html:135 +#: dcim/choices.py:114 templates/dcim/rack.html:128 msgid "Millimeters" msgstr "" @@ -1562,23 +1710,23 @@ msgstr "" #: dcim/forms/bulk_import.py:59 dcim/forms/bulk_import.py:73 #: dcim/forms/bulk_import.py:136 dcim/forms/bulk_import.py:503 #: dcim/forms/bulk_import.py:770 dcim/forms/bulk_import.py:1021 -#: dcim/forms/filtersets.py:224 dcim/forms/model_forms.py:73 +#: dcim/forms/filtersets.py:226 dcim/forms/model_forms.py:73 #: dcim/forms/model_forms.py:94 dcim/forms/model_forms.py:172 -#: dcim/forms/model_forms.py:954 dcim/forms/model_forms.py:1295 -#: dcim/forms/object_import.py:181 dcim/tables/devices.py:654 -#: extras/tables/tables.py:203 ipam/tables/fhrp.py:59 ipam/tables/ip.py:374 -#: ipam/tables/services.py:44 templates/dcim/interface.html:97 -#: templates/dcim/interface.html:317 templates/dcim/location.html:44 -#: templates/dcim/region.html:38 templates/dcim/sitegroup.html:38 -#: templates/ipam/service.html:31 templates/tenancy/contactgroup.html:32 -#: templates/tenancy/tenantgroup.html:40 +#: dcim/forms/model_forms.py:955 dcim/forms/model_forms.py:1296 +#: dcim/forms/object_import.py:181 dcim/tables/devices.py:671 +#: dcim/tables/devices.py:955 extras/tables/tables.py:181 +#: ipam/tables/fhrp.py:59 ipam/tables/ip.py:374 ipam/tables/services.py:44 +#: templates/dcim/interface.html:105 templates/dcim/interface.html:321 +#: templates/dcim/location.html:44 templates/dcim/region.html:38 +#: templates/dcim/sitegroup.html:38 templates/ipam/service.html:31 +#: templates/tenancy/contactgroup.html:32 templates/tenancy/tenantgroup.html:40 #: templates/virtualization/vminterface.html:42 #: templates/wireless/wirelesslangroup.html:38 tenancy/forms/bulk_edit.py:26 #: tenancy/forms/bulk_edit.py:60 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:27 -#: tenancy/forms/model_forms.py:72 virtualization/forms/bulk_edit.py:204 -#: virtualization/forms/bulk_import.py:150 -#: virtualization/tables/virtualmachines.py:136 wireless/forms/bulk_edit.py:23 +#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:24 +#: tenancy/forms/model_forms.py:69 virtualization/forms/bulk_edit.py:206 +#: virtualization/forms/bulk_import.py:151 +#: virtualization/tables/virtualmachines.py:142 wireless/forms/bulk_edit.py:23 #: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:20 msgid "Parent" msgstr "" @@ -1587,14 +1735,14 @@ msgstr "" msgid "Child" msgstr "" -#: dcim/choices.py:155 templates/dcim/device.html:362 -#: templates/dcim/rack.html:188 templates/dcim/rack_elevation_list.html:22 +#: dcim/choices.py:155 templates/dcim/device.html:345 +#: templates/dcim/rack.html:181 templates/dcim/rack_elevation_list.html:22 #: templates/dcim/rackreservation.html:84 msgid "Front" msgstr "" -#: dcim/choices.py:156 templates/dcim/device.html:368 -#: templates/dcim/rack.html:194 templates/dcim/rack_elevation_list.html:23 +#: dcim/choices.py:156 templates/dcim/device.html:351 +#: templates/dcim/rack.html:187 templates/dcim/rack_elevation_list.html:23 #: templates/dcim/rackreservation.html:90 msgid "Rear" msgstr "" @@ -1674,9 +1822,9 @@ msgid "Virtual" msgstr "" #: dcim/choices.py:796 dcim/choices.py:1019 dcim/forms/bulk_edit.py:1398 -#: dcim/forms/filtersets.py:1225 dcim/forms/model_forms.py:880 -#: dcim/forms/model_forms.py:1189 netbox/navigation/menu.py:128 -#: netbox/navigation/menu.py:132 templates/dcim/interface.html:213 +#: dcim/forms/filtersets.py:1233 dcim/forms/model_forms.py:881 +#: dcim/forms/model_forms.py:1190 netbox/navigation/menu.py:128 +#: netbox/navigation/menu.py:132 templates/dcim/interface.html:217 msgid "Wireless" msgstr "" @@ -1685,12 +1833,12 @@ msgid "Virtual interfaces" msgstr "" #: dcim/choices.py:950 dcim/forms/bulk_edit.py:1295 -#: dcim/forms/bulk_import.py:777 dcim/forms/model_forms.py:868 -#: dcim/tables/devices.py:658 templates/dcim/interface.html:101 +#: dcim/forms/bulk_import.py:777 dcim/forms/model_forms.py:869 +#: dcim/tables/devices.py:675 templates/dcim/interface.html:109 #: templates/virtualization/vminterface.html:46 -#: virtualization/forms/bulk_edit.py:209 -#: virtualization/forms/bulk_import.py:157 -#: virtualization/tables/virtualmachines.py:140 +#: virtualization/forms/bulk_edit.py:211 +#: virtualization/forms/bulk_import.py:158 +#: virtualization/tables/virtualmachines.py:146 msgid "Bridge" msgstr "" @@ -1714,9 +1862,9 @@ msgstr "" msgid "Cellular" msgstr "" -#: dcim/choices.py:1080 dcim/forms/filtersets.py:299 -#: dcim/forms/filtersets.py:729 dcim/forms/filtersets.py:869 -#: dcim/forms/filtersets.py:1417 templates/dcim/inventoryitem.html:53 +#: dcim/choices.py:1080 dcim/forms/filtersets.py:302 +#: dcim/forms/filtersets.py:736 dcim/forms/filtersets.py:876 +#: dcim/forms/filtersets.py:1426 templates/dcim/inventoryitem.html:53 #: templates/dcim/virtualchassis_edit.html:55 msgid "Serial" msgstr "" @@ -1786,14 +1934,7 @@ msgstr "" msgid "Fiber" msgstr "" -#: dcim/choices.py:1407 dcim/forms/bulk_edit.py:859 -#: dcim/forms/bulk_edit.py:1242 dcim/forms/bulk_edit.py:1260 -#: dcim/tables/racks.py:89 extras/forms/model_forms.py:489 -#: netbox/navigation/menu.py:257 netbox/navigation/menu.py:261 -msgid "Power" -msgstr "" - -#: dcim/choices.py:1418 dcim/forms/filtersets.py:1132 +#: dcim/choices.py:1418 dcim/forms/filtersets.py:1140 msgid "Connected" msgstr "" @@ -1817,8 +1958,8 @@ msgstr "" msgid "Feet" msgstr "" -#: dcim/choices.py:1457 templates/dcim/device.html:349 -#: templates/dcim/rack.html:164 +#: dcim/choices.py:1457 templates/dcim/device.html:332 +#: templates/dcim/rack.html:157 msgid "Kilograms" msgstr "" @@ -1826,7 +1967,7 @@ msgstr "" msgid "Grams" msgstr "" -#: dcim/choices.py:1459 templates/dcim/rack.html:165 +#: dcim/choices.py:1459 templates/dcim/rack.html:158 msgid "Pounds" msgstr "" @@ -1850,398 +1991,390 @@ msgstr "" msgid "Three-phase" msgstr "" -#: dcim/filtersets.py:78 +#: dcim/filtersets.py:80 msgid "Parent region (ID)" msgstr "" -#: dcim/filtersets.py:84 +#: dcim/filtersets.py:86 msgid "Parent region (slug)" msgstr "" -#: dcim/filtersets.py:95 +#: dcim/filtersets.py:97 msgid "Parent site group (ID)" msgstr "" -#: dcim/filtersets.py:101 +#: dcim/filtersets.py:103 msgid "Parent site group (slug)" msgstr "" -#: dcim/filtersets.py:130 ipam/filtersets.py:792 ipam/filtersets.py:925 +#: dcim/filtersets.py:132 ipam/filtersets.py:797 ipam/filtersets.py:930 msgid "Group (ID)" msgstr "" -#: dcim/filtersets.py:136 +#: dcim/filtersets.py:138 msgid "Group (slug)" msgstr "" -#: dcim/filtersets.py:142 dcim/filtersets.py:147 +#: dcim/filtersets.py:144 dcim/filtersets.py:149 msgid "AS (ID)" msgstr "" -#: dcim/filtersets.py:215 dcim/filtersets.py:290 dcim/filtersets.py:388 -#: dcim/filtersets.py:909 dcim/filtersets.py:1215 dcim/filtersets.py:1883 +#: dcim/filtersets.py:217 dcim/filtersets.py:292 dcim/filtersets.py:390 +#: dcim/filtersets.py:917 dcim/filtersets.py:1213 dcim/filtersets.py:1881 msgid "Location (ID)" msgstr "" -#: dcim/filtersets.py:222 dcim/filtersets.py:297 dcim/filtersets.py:395 -#: dcim/filtersets.py:1221 extras/filtersets.py:416 +#: dcim/filtersets.py:224 dcim/filtersets.py:299 dcim/filtersets.py:397 +#: dcim/filtersets.py:1219 extras/filtersets.py:447 msgid "Location (slug)" msgstr "" -#: dcim/filtersets.py:311 dcim/filtersets.py:762 dcim/filtersets.py:846 -#: dcim/filtersets.py:1621 ipam/filtersets.py:346 ipam/filtersets.py:458 -#: ipam/filtersets.py:935 virtualization/filtersets.py:206 +#: dcim/filtersets.py:313 dcim/filtersets.py:764 dcim/filtersets.py:854 +#: dcim/filtersets.py:1619 ipam/filtersets.py:347 ipam/filtersets.py:459 +#: ipam/filtersets.py:940 virtualization/filtersets.py:209 msgid "Role (ID)" msgstr "" -#: dcim/filtersets.py:317 dcim/filtersets.py:768 dcim/filtersets.py:852 -#: dcim/filtersets.py:1627 extras/filtersets.py:432 ipam/filtersets.py:352 -#: ipam/filtersets.py:464 ipam/filtersets.py:941 -#: virtualization/filtersets.py:212 +#: dcim/filtersets.py:319 dcim/filtersets.py:770 dcim/filtersets.py:860 +#: dcim/filtersets.py:1625 extras/filtersets.py:463 ipam/filtersets.py:353 +#: ipam/filtersets.py:465 ipam/filtersets.py:946 +#: virtualization/filtersets.py:215 msgid "Role (slug)" msgstr "" -#: dcim/filtersets.py:345 dcim/filtersets.py:914 dcim/filtersets.py:1226 -#: dcim/filtersets.py:1944 +#: dcim/filtersets.py:347 dcim/filtersets.py:922 dcim/filtersets.py:1224 +#: dcim/filtersets.py:1942 msgid "Rack (ID)" msgstr "" -#: dcim/filtersets.py:399 extras/filtersets.py:203 extras/filtersets.py:247 -#: extras/filtersets.py:287 extras/filtersets.py:582 +#: dcim/filtersets.py:401 extras/filtersets.py:234 extras/filtersets.py:278 +#: extras/filtersets.py:318 extras/filtersets.py:613 msgid "User (ID)" msgstr "" -#: dcim/filtersets.py:405 extras/filtersets.py:209 extras/filtersets.py:253 -#: extras/filtersets.py:293 users/filtersets.py:80 users/filtersets.py:140 +#: dcim/filtersets.py:407 extras/filtersets.py:240 extras/filtersets.py:284 +#: extras/filtersets.py:324 users/filtersets.py:80 users/filtersets.py:140 msgid "User (name)" msgstr "" -#: dcim/filtersets.py:433 dcim/filtersets.py:559 dcim/filtersets.py:752 -#: dcim/filtersets.py:803 dcim/filtersets.py:825 dcim/filtersets.py:1118 -#: dcim/filtersets.py:1611 +#: dcim/filtersets.py:435 dcim/filtersets.py:561 dcim/filtersets.py:754 +#: dcim/filtersets.py:805 dcim/filtersets.py:833 dcim/filtersets.py:1116 +#: dcim/filtersets.py:1609 msgid "Manufacturer (ID)" msgstr "" -#: dcim/filtersets.py:439 dcim/filtersets.py:565 dcim/filtersets.py:758 -#: dcim/filtersets.py:809 dcim/filtersets.py:831 dcim/filtersets.py:1124 -#: dcim/filtersets.py:1617 +#: dcim/filtersets.py:441 dcim/filtersets.py:567 dcim/filtersets.py:760 +#: dcim/filtersets.py:811 dcim/filtersets.py:839 dcim/filtersets.py:1122 +#: dcim/filtersets.py:1615 msgid "Manufacturer (slug)" msgstr "" -#: dcim/filtersets.py:443 +#: dcim/filtersets.py:445 msgid "Default platform (ID)" msgstr "" -#: dcim/filtersets.py:449 +#: dcim/filtersets.py:451 msgid "Default platform (slug)" msgstr "" -#: dcim/filtersets.py:452 dcim/forms/filtersets.py:448 +#: dcim/filtersets.py:454 dcim/forms/filtersets.py:452 msgid "Has a front image" msgstr "" -#: dcim/filtersets.py:456 dcim/forms/filtersets.py:455 +#: dcim/filtersets.py:458 dcim/forms/filtersets.py:459 msgid "Has a rear image" msgstr "" -#: dcim/filtersets.py:461 dcim/filtersets.py:569 dcim/filtersets.py:967 -#: dcim/forms/filtersets.py:462 dcim/forms/filtersets.py:558 -#: dcim/forms/filtersets.py:768 +#: dcim/filtersets.py:463 dcim/filtersets.py:571 dcim/filtersets.py:975 +#: dcim/forms/filtersets.py:466 dcim/forms/filtersets.py:563 +#: dcim/forms/filtersets.py:775 msgid "Has console ports" msgstr "" -#: dcim/filtersets.py:465 dcim/filtersets.py:573 dcim/filtersets.py:971 -#: dcim/forms/filtersets.py:469 dcim/forms/filtersets.py:565 -#: dcim/forms/filtersets.py:775 +#: dcim/filtersets.py:467 dcim/filtersets.py:575 dcim/filtersets.py:979 +#: dcim/forms/filtersets.py:473 dcim/forms/filtersets.py:570 +#: dcim/forms/filtersets.py:782 msgid "Has console server ports" msgstr "" -#: dcim/filtersets.py:469 dcim/filtersets.py:577 dcim/filtersets.py:975 -#: dcim/forms/filtersets.py:476 dcim/forms/filtersets.py:572 -#: dcim/forms/filtersets.py:782 +#: dcim/filtersets.py:471 dcim/filtersets.py:579 dcim/filtersets.py:983 +#: dcim/forms/filtersets.py:480 dcim/forms/filtersets.py:577 +#: dcim/forms/filtersets.py:789 msgid "Has power ports" msgstr "" -#: dcim/filtersets.py:473 dcim/filtersets.py:581 dcim/filtersets.py:979 -#: dcim/forms/filtersets.py:483 dcim/forms/filtersets.py:579 -#: dcim/forms/filtersets.py:789 +#: dcim/filtersets.py:475 dcim/filtersets.py:583 dcim/filtersets.py:987 +#: dcim/forms/filtersets.py:487 dcim/forms/filtersets.py:584 +#: dcim/forms/filtersets.py:796 msgid "Has power outlets" msgstr "" -#: dcim/filtersets.py:477 dcim/filtersets.py:585 dcim/filtersets.py:983 -#: dcim/forms/filtersets.py:490 dcim/forms/filtersets.py:586 -#: dcim/forms/filtersets.py:796 +#: dcim/filtersets.py:479 dcim/filtersets.py:587 dcim/filtersets.py:991 +#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:591 +#: dcim/forms/filtersets.py:803 msgid "Has interfaces" msgstr "" -#: dcim/filtersets.py:481 dcim/filtersets.py:589 dcim/filtersets.py:987 -#: dcim/forms/filtersets.py:497 dcim/forms/filtersets.py:593 -#: dcim/forms/filtersets.py:803 +#: dcim/filtersets.py:483 dcim/filtersets.py:591 dcim/filtersets.py:995 +#: dcim/forms/filtersets.py:501 dcim/forms/filtersets.py:598 +#: dcim/forms/filtersets.py:810 msgid "Has pass-through ports" msgstr "" -#: dcim/filtersets.py:485 dcim/filtersets.py:991 dcim/forms/filtersets.py:511 +#: dcim/filtersets.py:487 dcim/filtersets.py:999 dcim/forms/filtersets.py:515 msgid "Has module bays" msgstr "" -#: dcim/filtersets.py:489 dcim/filtersets.py:995 dcim/forms/filtersets.py:504 +#: dcim/filtersets.py:491 dcim/filtersets.py:1003 dcim/forms/filtersets.py:508 msgid "Has device bays" msgstr "" -#: dcim/filtersets.py:493 dcim/forms/filtersets.py:518 +#: dcim/filtersets.py:495 dcim/forms/filtersets.py:522 msgid "Has inventory items" msgstr "" -#: dcim/filtersets.py:636 dcim/filtersets.py:841 dcim/filtersets.py:1247 +#: dcim/filtersets.py:638 dcim/filtersets.py:849 dcim/filtersets.py:1245 msgid "Device type (ID)" msgstr "" -#: dcim/filtersets.py:649 dcim/filtersets.py:1129 +#: dcim/filtersets.py:651 dcim/filtersets.py:1127 msgid "Module type (ID)" msgstr "" -#: dcim/filtersets.py:748 dcim/filtersets.py:1607 +#: dcim/filtersets.py:750 dcim/filtersets.py:1605 msgid "Parent inventory item (ID)" msgstr "" -#: dcim/filtersets.py:791 dcim/filtersets.py:813 dcim/filtersets.py:963 -#: virtualization/filtersets.py:234 +#: dcim/filtersets.py:793 dcim/filtersets.py:815 dcim/filtersets.py:971 +#: virtualization/filtersets.py:237 msgid "Config template (ID)" msgstr "" -#: dcim/filtersets.py:837 +#: dcim/filtersets.py:845 msgid "Device type (slug)" msgstr "" -#: dcim/filtersets.py:857 +#: dcim/filtersets.py:865 msgid "Parent Device (ID)" msgstr "" -#: dcim/filtersets.py:861 virtualization/filtersets.py:216 +#: dcim/filtersets.py:869 virtualization/filtersets.py:219 msgid "Platform (ID)" msgstr "" -#: dcim/filtersets.py:867 extras/filtersets.py:443 -#: virtualization/filtersets.py:222 +#: dcim/filtersets.py:875 extras/filtersets.py:474 +#: virtualization/filtersets.py:225 msgid "Platform (slug)" msgstr "" -#: dcim/filtersets.py:903 dcim/filtersets.py:1210 dcim/filtersets.py:1705 -#: dcim/filtersets.py:1877 dcim/filtersets.py:1935 +#: dcim/filtersets.py:911 dcim/filtersets.py:1208 dcim/filtersets.py:1703 +#: dcim/filtersets.py:1875 dcim/filtersets.py:1933 msgid "Site name (slug)" msgstr "" -#: dcim/filtersets.py:918 +#: dcim/filtersets.py:926 msgid "VM cluster (ID)" msgstr "" -#: dcim/filtersets.py:924 +#: dcim/filtersets.py:932 msgid "Device model (slug)" msgstr "" -#: dcim/filtersets.py:935 dcim/forms/bulk_edit.py:421 +#: dcim/filtersets.py:943 dcim/forms/bulk_edit.py:421 msgid "Is full depth" msgstr "" -#: dcim/filtersets.py:939 dcim/forms/common.py:18 dcim/forms/filtersets.py:738 -#: dcim/forms/filtersets.py:1276 dcim/models/device_components.py:520 -#: virtualization/filtersets.py:226 virtualization/filtersets.py:292 -#: virtualization/forms/filtersets.py:165 -#: virtualization/forms/filtersets.py:211 +#: dcim/filtersets.py:947 dcim/forms/common.py:18 dcim/forms/filtersets.py:745 +#: dcim/forms/filtersets.py:1285 dcim/models/device_components.py:519 +#: virtualization/filtersets.py:229 virtualization/filtersets.py:295 +#: virtualization/forms/filtersets.py:168 +#: virtualization/forms/filtersets.py:215 msgid "MAC address" msgstr "" -#: dcim/filtersets.py:946 dcim/forms/filtersets.py:747 -#: dcim/forms/filtersets.py:834 virtualization/filtersets.py:230 -#: virtualization/forms/filtersets.py:169 +#: dcim/filtersets.py:954 dcim/forms/filtersets.py:754 +#: dcim/forms/filtersets.py:841 virtualization/filtersets.py:233 +#: virtualization/forms/filtersets.py:172 msgid "Has a primary IP" msgstr "" -#: dcim/filtersets.py:950 +#: dcim/filtersets.py:958 msgid "Has an out-of-band IP" msgstr "" -#: dcim/filtersets.py:955 +#: dcim/filtersets.py:963 msgid "Virtual chassis (ID)" msgstr "" -#: dcim/filtersets.py:959 +#: dcim/filtersets.py:967 msgid "Is a virtual chassis member" msgstr "" -#: dcim/filtersets.py:1000 -msgid "Primary IPv4 (ID)" -msgstr "" - -#: dcim/filtersets.py:1005 -msgid "Primary IPv6 (ID)" -msgstr "" - -#: dcim/filtersets.py:1010 +#: dcim/filtersets.py:1008 msgid "OOB IP (ID)" msgstr "" -#: dcim/filtersets.py:1135 +#: dcim/filtersets.py:1133 msgid "Module type (model)" msgstr "" -#: dcim/filtersets.py:1141 +#: dcim/filtersets.py:1139 msgid "Module Bay (ID)" msgstr "" -#: dcim/filtersets.py:1145 dcim/filtersets.py:1236 ipam/filtersets.py:567 -#: ipam/filtersets.py:802 ipam/filtersets.py:1010 ipam/filtersets.py:1143 -#: virtualization/filtersets.py:157 +#: dcim/filtersets.py:1143 dcim/filtersets.py:1234 ipam/filtersets.py:577 +#: ipam/filtersets.py:807 ipam/filtersets.py:1015 +#: virtualization/filtersets.py:160 vpn/filtersets.py:351 msgid "Device (ID)" msgstr "" -#: dcim/filtersets.py:1232 +#: dcim/filtersets.py:1230 msgid "Rack (name)" msgstr "" -#: dcim/filtersets.py:1242 ipam/filtersets.py:562 ipam/filtersets.py:797 -#: ipam/filtersets.py:1016 ipam/filtersets.py:1138 +#: dcim/filtersets.py:1240 ipam/filtersets.py:572 ipam/filtersets.py:802 +#: ipam/filtersets.py:1021 vpn/filtersets.py:346 msgid "Device (name)" msgstr "" -#: dcim/filtersets.py:1253 +#: dcim/filtersets.py:1251 msgid "Device type (model)" msgstr "" -#: dcim/filtersets.py:1258 dcim/filtersets.py:1281 +#: dcim/filtersets.py:1256 dcim/filtersets.py:1279 msgid "Device role (ID)" msgstr "" -#: dcim/filtersets.py:1264 dcim/filtersets.py:1287 +#: dcim/filtersets.py:1262 dcim/filtersets.py:1285 msgid "Device role (slug)" msgstr "" -#: dcim/filtersets.py:1269 +#: dcim/filtersets.py:1267 msgid "Virtual Chassis (ID)" msgstr "" -#: dcim/filtersets.py:1275 dcim/forms/filtersets.py:105 +#: dcim/filtersets.py:1273 dcim/forms/filtersets.py:106 #: dcim/tables/devices.py:235 netbox/navigation/menu.py:67 -#: templates/dcim/device.html:140 templates/dcim/device_edit.html:93 +#: templates/dcim/device.html:123 templates/dcim/device_edit.html:93 #: templates/dcim/virtualchassis.html:20 #: templates/dcim/virtualchassis_add.html:8 #: templates/dcim/virtualchassis_edit.html:25 msgid "Virtual Chassis" msgstr "" -#: dcim/filtersets.py:1307 +#: dcim/filtersets.py:1305 msgid "Module (ID)" msgstr "" -#: dcim/filtersets.py:1411 ipam/forms/bulk_import.py:191 -#: ipam/forms/bulk_import.py:568 +#: dcim/filtersets.py:1409 ipam/forms/bulk_import.py:188 +#: vpn/forms/bulk_import.py:303 msgid "Assigned VLAN" msgstr "" -#: dcim/filtersets.py:1415 +#: dcim/filtersets.py:1413 msgid "Assigned VID" msgstr "" -#: dcim/filtersets.py:1420 dcim/forms/bulk_edit.py:1374 -#: dcim/forms/bulk_import.py:828 dcim/forms/filtersets.py:1319 -#: dcim/forms/model_forms.py:1174 dcim/models/device_components.py:709 -#: dcim/tables/devices.py:625 ipam/filtersets.py:281 ipam/filtersets.py:292 -#: ipam/filtersets.py:448 ipam/filtersets.py:540 ipam/filtersets.py:551 -#: ipam/forms/bulk_edit.py:228 ipam/forms/bulk_edit.py:283 -#: ipam/forms/bulk_edit.py:325 ipam/forms/bulk_import.py:159 -#: ipam/forms/bulk_import.py:245 ipam/forms/bulk_import.py:281 -#: ipam/forms/filtersets.py:70 ipam/forms/filtersets.py:171 -#: ipam/forms/filtersets.py:299 ipam/forms/model_forms.py:61 -#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:248 -#: ipam/forms/model_forms.py:292 ipam/forms/model_forms.py:414 -#: ipam/forms/model_forms.py:428 ipam/forms/model_forms.py:442 +#: dcim/filtersets.py:1418 dcim/forms/bulk_edit.py:1374 +#: dcim/forms/bulk_import.py:828 dcim/forms/filtersets.py:1328 +#: dcim/forms/model_forms.py:1175 dcim/models/device_components.py:712 +#: dcim/tables/devices.py:637 ipam/filtersets.py:282 ipam/filtersets.py:293 +#: ipam/filtersets.py:449 ipam/filtersets.py:550 ipam/filtersets.py:561 +#: ipam/forms/bulk_edit.py:226 ipam/forms/bulk_edit.py:281 +#: ipam/forms/bulk_edit.py:323 ipam/forms/bulk_import.py:156 +#: ipam/forms/bulk_import.py:242 ipam/forms/bulk_import.py:278 +#: ipam/forms/filtersets.py:66 ipam/forms/filtersets.py:167 +#: ipam/forms/filtersets.py:295 ipam/forms/model_forms.py:59 +#: ipam/forms/model_forms.py:203 ipam/forms/model_forms.py:246 +#: ipam/forms/model_forms.py:290 ipam/forms/model_forms.py:412 +#: ipam/forms/model_forms.py:426 ipam/forms/model_forms.py:440 #: ipam/models/ip.py:232 ipam/models/ip.py:511 ipam/models/ip.py:719 #: ipam/models/vrfs.py:62 ipam/tables/ip.py:241 ipam/tables/ip.py:306 #: ipam/tables/ip.py:356 ipam/tables/ip.py:445 -#: templates/dcim/interface.html:134 templates/ipam/ipaddress.html:21 -#: templates/ipam/iprange.html:43 templates/ipam/prefix.html:19 +#: templates/dcim/interface.html:138 templates/ipam/ipaddress.html:21 +#: templates/ipam/iprange.html:43 templates/ipam/prefix.html:20 #: templates/ipam/vrf.html:7 templates/ipam/vrf.html:14 #: templates/virtualization/vminterface.html:50 -#: virtualization/forms/bulk_edit.py:258 -#: virtualization/forms/bulk_import.py:170 -#: virtualization/forms/filtersets.py:216 -#: virtualization/forms/model_forms.py:326 -#: virtualization/models/virtualmachines.py:286 -#: virtualization/tables/virtualmachines.py:118 +#: virtualization/forms/bulk_edit.py:260 +#: virtualization/forms/bulk_import.py:171 +#: virtualization/forms/filtersets.py:220 +#: virtualization/forms/model_forms.py:347 +#: virtualization/models/virtualmachines.py:348 +#: virtualization/tables/virtualmachines.py:123 msgid "VRF" msgstr "" -#: dcim/filtersets.py:1426 ipam/filtersets.py:287 ipam/filtersets.py:298 -#: ipam/filtersets.py:454 ipam/filtersets.py:546 ipam/filtersets.py:557 +#: dcim/filtersets.py:1424 ipam/filtersets.py:288 ipam/filtersets.py:299 +#: ipam/filtersets.py:455 ipam/filtersets.py:556 ipam/filtersets.py:567 msgid "VRF (RD)" msgstr "" -#: dcim/filtersets.py:1431 ipam/filtersets.py:958 ipam/filtersets.py:1106 +#: dcim/filtersets.py:1429 ipam/filtersets.py:963 vpn/filtersets.py:314 msgid "L2VPN (ID)" msgstr "" -#: dcim/filtersets.py:1437 dcim/forms/filtersets.py:1324 -#: dcim/tables/devices.py:579 ipam/filtersets.py:964 -#: ipam/forms/bulk_import.py:540 ipam/forms/filtersets.py:501 -#: ipam/forms/filtersets.py:565 ipam/forms/model_forms.py:779 -#: ipam/forms/model_forms.py:797 ipam/models/l2vpn.py:63 -#: ipam/tables/l2vpn.py:55 ipam/tables/vlans.py:133 -#: templates/dcim/interface.html:109 templates/ipam/l2vpntermination.html:15 -#: templates/ipam/vlan.html:69 virtualization/forms/filtersets.py:221 +#: dcim/filtersets.py:1435 dcim/forms/filtersets.py:1333 +#: dcim/tables/devices.py:585 ipam/filtersets.py:969 +#: ipam/forms/filtersets.py:499 ipam/tables/vlans.py:133 +#: templates/dcim/interface.html:94 templates/ipam/vlan.html:69 +#: templates/vpn/l2vpntermination.html:15 +#: virtualization/forms/filtersets.py:225 vpn/forms/bulk_import.py:275 +#: vpn/forms/filtersets.py:242 vpn/forms/model_forms.py:402 +#: vpn/forms/model_forms.py:420 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "" -#: dcim/filtersets.py:1469 +#: dcim/filtersets.py:1467 msgid "Virtual Chassis Interfaces for Device" msgstr "" -#: dcim/filtersets.py:1474 +#: dcim/filtersets.py:1472 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "" -#: dcim/filtersets.py:1478 +#: dcim/filtersets.py:1476 msgid "Kind of interface" msgstr "" -#: dcim/filtersets.py:1483 virtualization/filtersets.py:284 +#: dcim/filtersets.py:1481 virtualization/filtersets.py:287 msgid "Parent interface (ID)" msgstr "" -#: dcim/filtersets.py:1488 virtualization/filtersets.py:289 +#: dcim/filtersets.py:1486 virtualization/filtersets.py:292 msgid "Bridged interface (ID)" msgstr "" -#: dcim/filtersets.py:1493 +#: dcim/filtersets.py:1491 msgid "LAG interface (ID)" msgstr "" -#: dcim/filtersets.py:1662 +#: dcim/filtersets.py:1660 msgid "Master (ID)" msgstr "" -#: dcim/filtersets.py:1668 +#: dcim/filtersets.py:1666 msgid "Master (name)" msgstr "" -#: dcim/filtersets.py:1710 tenancy/filtersets.py:208 +#: dcim/filtersets.py:1708 tenancy/filtersets.py:220 msgid "Tenant (ID)" msgstr "" -#: dcim/filtersets.py:1716 extras/filtersets.py:492 tenancy/filtersets.py:214 +#: dcim/filtersets.py:1714 extras/filtersets.py:523 tenancy/filtersets.py:226 msgid "Tenant (slug)" msgstr "" -#: dcim/filtersets.py:1751 dcim/forms/filtersets.py:983 +#: dcim/filtersets.py:1749 dcim/forms/filtersets.py:990 msgid "Unterminated" msgstr "" -#: dcim/filtersets.py:1939 +#: dcim/filtersets.py:1937 msgid "Power panel (ID)" msgstr "" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:385 -#: extras/forms/mixins.py:82 extras/forms/model_forms.py:341 -#: extras/forms/model_forms.py:392 netbox/forms/base.py:71 +#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:410 +#: extras/forms/model_forms.py:444 extras/forms/model_forms.py:495 +#: netbox/forms/base.py:71 netbox/forms/mixins.py:79 #: netbox/tables/columns.py:448 #: templates/circuits/inc/circuit_termination.html:119 #: templates/generic/bulk_edit.html:81 templates/inc/panels/tags.html:5 @@ -2249,12 +2382,12 @@ msgstr "" msgid "Tags" msgstr "" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1381 -#: dcim/forms/model_forms.py:422 dcim/forms/model_forms.py:467 -#: dcim/forms/object_create.py:179 dcim/forms/object_create.py:319 -#: dcim/tables/devices.py:198 dcim/tables/devices.py:703 -#: dcim/tables/devicetypes.py:242 templates/dcim/device.html:62 -#: templates/dcim/device.html:146 templates/dcim/modulebay.html:35 +#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1390 +#: dcim/forms/model_forms.py:422 dcim/forms/model_forms.py:468 +#: dcim/forms/object_create.py:196 dcim/forms/object_create.py:352 +#: dcim/tables/devices.py:198 dcim/tables/devices.py:720 +#: dcim/tables/devicetypes.py:242 templates/dcim/device.html:45 +#: templates/dcim/device.html:129 templates/dcim/modulebay.html:35 #: templates/dcim/virtualchassis.html:59 #: templates/dcim/virtualchassis_edit.html:56 msgid "Position" @@ -2267,29 +2400,31 @@ msgid "" msgstr "" #: dcim/forms/bulk_edit.py:115 dcim/forms/bulk_import.py:99 -#: dcim/forms/model_forms.py:120 dcim/tables/sites.py:89 ipam/filtersets.py:931 -#: ipam/forms/bulk_edit.py:530 ipam/forms/bulk_import.py:447 -#: ipam/forms/model_forms.py:511 ipam/tables/fhrp.py:67 +#: dcim/forms/model_forms.py:120 dcim/tables/sites.py:89 ipam/filtersets.py:936 +#: ipam/forms/bulk_edit.py:528 ipam/forms/bulk_import.py:444 +#: ipam/forms/model_forms.py:509 ipam/tables/fhrp.py:67 #: ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 -#: templates/dcim/interface.html:290 templates/dcim/site.html:43 +#: templates/dcim/interface.html:294 templates/dcim/site.html:37 #: templates/ipam/inc/panels/fhrp_groups.html:10 templates/ipam/vlan.html:30 #: templates/tenancy/contact.html:22 templates/tenancy/tenant.html:21 #: templates/users/group.html:6 templates/users/group.html:14 -#: templates/virtualization/cluster.html:32 +#: templates/virtualization/cluster.html:32 templates/vpn/tunnel.html:30 #: templates/wireless/wirelesslan.html:19 tenancy/forms/bulk_edit.py:42 #: tenancy/forms/bulk_edit.py:93 tenancy/forms/bulk_import.py:40 -#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 -#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:98 -#: tenancy/forms/model_forms.py:49 tenancy/forms/model_forms.py:105 -#: tenancy/forms/model_forms.py:127 tenancy/tables/contacts.py:60 -#: tenancy/tables/tenants.py:42 users/filtersets.py:42 users/filtersets.py:145 -#: users/forms/filtersets.py:34 users/forms/filtersets.py:40 -#: users/forms/filtersets.py:82 virtualization/forms/bulk_edit.py:62 -#: virtualization/forms/bulk_import.py:46 virtualization/forms/filtersets.py:81 -#: virtualization/forms/model_forms.py:68 virtualization/tables/clusters.py:70 -#: wireless/forms/bulk_edit.py:47 wireless/forms/bulk_import.py:36 -#: wireless/forms/filtersets.py:45 wireless/forms/model_forms.py:41 -#: wireless/tables/wirelesslan.py:48 +#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:47 +#: tenancy/forms/filtersets.py:77 tenancy/forms/filtersets.py:96 +#: tenancy/forms/model_forms.py:46 tenancy/forms/model_forms.py:102 +#: tenancy/forms/model_forms.py:124 tenancy/tables/contacts.py:60 +#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 +#: users/filtersets.py:42 users/filtersets.py:145 users/forms/filtersets.py:32 +#: users/forms/filtersets.py:38 users/forms/filtersets.py:80 +#: virtualization/forms/bulk_edit.py:64 virtualization/forms/bulk_import.py:47 +#: virtualization/forms/filtersets.py:84 virtualization/forms/model_forms.py:69 +#: virtualization/tables/clusters.py:70 vpn/forms/bulk_edit.py:111 +#: vpn/forms/bulk_import.py:157 vpn/forms/filtersets.py:113 +#: vpn/tables/crypto.py:31 wireless/forms/bulk_edit.py:47 +#: wireless/forms/bulk_import.py:36 wireless/forms/filtersets.py:45 +#: wireless/forms/model_forms.py:41 wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "" @@ -2312,55 +2447,59 @@ msgstr "" #: dcim/forms/bulk_edit.py:266 dcim/forms/bulk_edit.py:1152 #: dcim/forms/bulk_edit.py:1539 dcim/forms/bulk_import.py:199 -#: dcim/forms/bulk_import.py:1009 dcim/forms/filtersets.py:296 -#: dcim/forms/filtersets.py:697 dcim/forms/filtersets.py:1408 -#: dcim/forms/model_forms.py:224 dcim/forms/model_forms.py:962 -#: dcim/forms/model_forms.py:1303 dcim/forms/object_import.py:186 -#: dcim/tables/devices.py:202 dcim/tables/devices.py:811 -#: dcim/tables/devices.py:922 dcim/tables/devicetypes.py:300 -#: dcim/tables/racks.py:69 extras/filtersets.py:426 ipam/forms/bulk_edit.py:247 -#: ipam/forms/bulk_edit.py:296 ipam/forms/bulk_edit.py:344 -#: ipam/forms/bulk_edit.py:548 ipam/forms/bulk_import.py:199 -#: ipam/forms/bulk_import.py:264 ipam/forms/bulk_import.py:300 -#: ipam/forms/bulk_import.py:466 ipam/forms/filtersets.py:236 -#: ipam/forms/filtersets.py:282 ipam/forms/filtersets.py:349 -#: ipam/forms/filtersets.py:492 ipam/forms/model_forms.py:189 -#: ipam/forms/model_forms.py:224 ipam/forms/model_forms.py:251 -#: ipam/forms/model_forms.py:649 ipam/tables/ip.py:257 ipam/tables/ip.py:313 +#: dcim/forms/bulk_import.py:1009 dcim/forms/filtersets.py:299 +#: dcim/forms/filtersets.py:704 dcim/forms/filtersets.py:1417 +#: dcim/forms/model_forms.py:224 dcim/forms/model_forms.py:963 +#: dcim/forms/model_forms.py:1304 dcim/forms/object_import.py:186 +#: dcim/tables/devices.py:202 dcim/tables/devices.py:828 +#: dcim/tables/devices.py:939 dcim/tables/devicetypes.py:300 +#: dcim/tables/racks.py:69 extras/filtersets.py:457 ipam/forms/bulk_edit.py:245 +#: ipam/forms/bulk_edit.py:294 ipam/forms/bulk_edit.py:342 +#: ipam/forms/bulk_edit.py:546 ipam/forms/bulk_import.py:196 +#: ipam/forms/bulk_import.py:261 ipam/forms/bulk_import.py:297 +#: ipam/forms/bulk_import.py:463 ipam/forms/filtersets.py:232 +#: ipam/forms/filtersets.py:278 ipam/forms/filtersets.py:346 +#: ipam/forms/filtersets.py:490 ipam/forms/model_forms.py:187 +#: ipam/forms/model_forms.py:222 ipam/forms/model_forms.py:249 +#: ipam/forms/model_forms.py:647 ipam/tables/ip.py:257 ipam/tables/ip.py:313 #: ipam/tables/ip.py:363 ipam/tables/vlans.py:126 ipam/tables/vlans.py:230 -#: templates/dcim/device.html:204 +#: templates/dcim/device.html:187 #: templates/dcim/inc/panels/inventory_items.html:12 -#: templates/dcim/interface.html:227 templates/dcim/inventoryitem.html:37 -#: templates/dcim/rack.html:57 templates/ipam/ipaddress.html:44 +#: templates/dcim/interface.html:231 templates/dcim/inventoryitem.html:37 +#: templates/dcim/rack.html:50 templates/ipam/ipaddress.html:44 #: templates/ipam/iprange.html:53 templates/ipam/prefix.html:78 #: templates/ipam/role.html:20 templates/ipam/vlan.html:55 #: templates/virtualization/virtualmachine.html:26 +#: templates/vpn/tunneltermination.html:18 #: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:141 tenancy/forms/filtersets.py:108 -#: tenancy/forms/model_forms.py:142 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:142 -#: virtualization/forms/bulk_import.py:105 -#: virtualization/forms/filtersets.py:150 -#: virtualization/forms/model_forms.py:197 -#: virtualization/tables/virtualmachines.py:63 +#: tenancy/forms/bulk_edit.py:141 tenancy/forms/filtersets.py:106 +#: tenancy/forms/model_forms.py:139 tenancy/tables/contacts.py:102 +#: virtualization/forms/bulk_edit.py:144 +#: virtualization/forms/bulk_import.py:106 +#: virtualization/forms/filtersets.py:153 +#: virtualization/forms/model_forms.py:198 +#: virtualization/tables/virtualmachines.py:65 vpn/forms/bulk_edit.py:86 +#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:84 +#: vpn/forms/model_forms.py:77 vpn/forms/model_forms.py:112 +#: vpn/tables/tunnels.py:78 msgid "Role" msgstr "" #: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:605 -#: dcim/forms/bulk_edit.py:654 templates/dcim/device.html:123 +#: dcim/forms/bulk_edit.py:654 templates/dcim/device.html:106 #: templates/dcim/module.html:75 templates/dcim/modulebay.html:69 -#: templates/dcim/rack.html:65 +#: templates/dcim/rack.html:58 msgid "Serial Number" msgstr "" -#: dcim/forms/bulk_edit.py:276 dcim/forms/filtersets.py:303 -#: dcim/forms/filtersets.py:733 dcim/forms/filtersets.py:873 -#: dcim/forms/filtersets.py:1421 +#: dcim/forms/bulk_edit.py:276 dcim/forms/filtersets.py:306 +#: dcim/forms/filtersets.py:740 dcim/forms/filtersets.py:880 +#: dcim/forms/filtersets.py:1430 msgid "Asset tag" msgstr "" #: dcim/forms/bulk_edit.py:286 dcim/forms/bulk_import.py:212 -#: dcim/forms/filtersets.py:288 templates/dcim/rack.html:98 +#: dcim/forms/filtersets.py:291 templates/dcim/rack.html:91 #: templates/dcim/rack_edit.html:48 msgid "Width" msgstr "" @@ -2393,16 +2532,16 @@ msgstr "" #: dcim/forms/bulk_edit.py:434 dcim/forms/bulk_edit.py:457 #: dcim/forms/bulk_edit.py:473 dcim/forms/bulk_edit.py:493 #: dcim/forms/bulk_import.py:324 dcim/forms/bulk_import.py:350 -#: dcim/forms/filtersets.py:248 dcim/forms/filtersets.py:308 -#: dcim/forms/filtersets.py:332 dcim/forms/filtersets.py:420 -#: dcim/forms/filtersets.py:525 dcim/forms/filtersets.py:544 -#: dcim/forms/filtersets.py:600 dcim/forms/model_forms.py:337 +#: dcim/forms/filtersets.py:250 dcim/forms/filtersets.py:311 +#: dcim/forms/filtersets.py:335 dcim/forms/filtersets.py:423 +#: dcim/forms/filtersets.py:529 dcim/forms/filtersets.py:548 +#: dcim/forms/filtersets.py:605 dcim/forms/model_forms.py:337 #: dcim/tables/devicetypes.py:103 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:103 extras/forms/bulk_edit.py:44 -#: extras/forms/bulk_edit.py:102 extras/forms/bulk_edit.py:152 -#: extras/forms/bulk_edit.py:256 extras/forms/filtersets.py:62 -#: extras/forms/filtersets.py:130 extras/forms/filtersets.py:217 -#: ipam/forms/bulk_edit.py:189 templates/dcim/device.html:346 +#: dcim/tables/racks.py:103 extras/forms/bulk_edit.py:45 +#: extras/forms/bulk_edit.py:107 extras/forms/bulk_edit.py:157 +#: extras/forms/bulk_edit.py:277 extras/forms/filtersets.py:60 +#: extras/forms/filtersets.py:133 extras/forms/filtersets.py:220 +#: ipam/forms/bulk_edit.py:187 templates/dcim/device.html:329 #: templates/dcim/devicetype.html:52 templates/dcim/moduletype.html:31 #: templates/dcim/rack_edit.html:60 templates/dcim/rack_edit.html:63 #: templates/extras/configcontext.html:18 templates/extras/customlink.html:26 @@ -2410,44 +2549,44 @@ msgstr "" msgid "Weight" msgstr "" -#: dcim/forms/bulk_edit.py:325 dcim/forms/filtersets.py:313 +#: dcim/forms/bulk_edit.py:325 dcim/forms/filtersets.py:316 msgid "Max weight" msgstr "" #: dcim/forms/bulk_edit.py:330 dcim/forms/bulk_edit.py:439 #: dcim/forms/bulk_edit.py:478 dcim/forms/bulk_import.py:223 #: dcim/forms/bulk_import.py:329 dcim/forms/bulk_import.py:355 -#: dcim/forms/filtersets.py:318 dcim/forms/filtersets.py:529 -#: dcim/forms/filtersets.py:604 +#: dcim/forms/filtersets.py:321 dcim/forms/filtersets.py:533 +#: dcim/forms/filtersets.py:609 msgid "Weight unit" msgstr "" #: dcim/forms/bulk_edit.py:344 dcim/forms/bulk_edit.py:800 #: dcim/forms/bulk_import.py:262 dcim/forms/bulk_import.py:265 #: dcim/forms/bulk_import.py:490 dcim/forms/bulk_import.py:1286 -#: dcim/forms/bulk_import.py:1290 dcim/forms/filtersets.py:100 -#: dcim/forms/filtersets.py:336 dcim/forms/filtersets.py:350 -#: dcim/forms/filtersets.py:388 dcim/forms/filtersets.py:692 -#: dcim/forms/filtersets.py:941 dcim/forms/filtersets.py:1072 +#: dcim/forms/bulk_import.py:1290 dcim/forms/filtersets.py:101 +#: dcim/forms/filtersets.py:339 dcim/forms/filtersets.py:353 +#: dcim/forms/filtersets.py:391 dcim/forms/filtersets.py:699 +#: dcim/forms/filtersets.py:948 dcim/forms/filtersets.py:1080 #: dcim/forms/model_forms.py:241 dcim/forms/model_forms.py:413 -#: dcim/forms/model_forms.py:661 dcim/forms/object_create.py:366 +#: dcim/forms/model_forms.py:662 dcim/forms/object_create.py:399 #: dcim/tables/devices.py:194 dcim/tables/power.py:70 dcim/tables/racks.py:148 -#: ipam/forms/bulk_edit.py:466 ipam/forms/filtersets.py:430 -#: ipam/forms/model_forms.py:573 templates/dcim/device.html:47 +#: ipam/forms/bulk_edit.py:464 ipam/forms/filtersets.py:427 +#: ipam/forms/model_forms.py:571 templates/dcim/device.html:30 #: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:31 templates/dcim/rack.html:13 +#: templates/dcim/powerfeed.html:31 templates/dcim/rack.html:14 #: templates/dcim/rack/base.html:4 templates/dcim/rack_edit.html:8 -#: templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:38 -#: virtualization/forms/model_forms.py:115 +#: templates/dcim/rackreservation.html:20 +#: templates/dcim/rackreservation.html:39 +#: virtualization/forms/model_forms.py:116 msgid "Rack" msgstr "" #: dcim/forms/bulk_edit.py:346 dcim/forms/bulk_edit.py:623 -#: dcim/forms/filtersets.py:245 dcim/forms/filtersets.py:329 -#: dcim/forms/filtersets.py:414 dcim/forms/filtersets.py:539 -#: dcim/forms/filtersets.py:646 dcim/forms/filtersets.py:846 -#: dcim/forms/model_forms.py:588 dcim/forms/model_forms.py:1373 +#: dcim/forms/filtersets.py:247 dcim/forms/filtersets.py:332 +#: dcim/forms/filtersets.py:417 dcim/forms/filtersets.py:543 +#: dcim/forms/filtersets.py:652 dcim/forms/filtersets.py:853 +#: dcim/forms/model_forms.py:589 dcim/forms/model_forms.py:1374 #: templates/dcim/device_edit.html:20 templates/dcim/inventoryitem_edit.html:23 msgid "Hardware" msgstr "" @@ -2458,14 +2597,14 @@ msgstr "" #: dcim/forms/bulk_edit.py:1544 dcim/forms/bulk_import.py:311 #: dcim/forms/bulk_import.py:345 dcim/forms/bulk_import.py:387 #: dcim/forms/bulk_import.py:423 dcim/forms/bulk_import.py:1015 -#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:549 -#: dcim/forms/filtersets.py:625 dcim/forms/filtersets.py:702 -#: dcim/forms/filtersets.py:851 dcim/forms/filtersets.py:1414 +#: dcim/forms/filtersets.py:429 dcim/forms/filtersets.py:554 +#: dcim/forms/filtersets.py:631 dcim/forms/filtersets.py:709 +#: dcim/forms/filtersets.py:858 dcim/forms/filtersets.py:1423 #: dcim/forms/model_forms.py:274 dcim/forms/model_forms.py:288 #: dcim/forms/model_forms.py:330 dcim/forms/model_forms.py:370 -#: dcim/forms/model_forms.py:967 dcim/forms/model_forms.py:1308 +#: dcim/forms/model_forms.py:968 dcim/forms/model_forms.py:1309 #: dcim/forms/object_import.py:192 dcim/tables/devices.py:129 -#: dcim/tables/devices.py:205 dcim/tables/devices.py:925 +#: dcim/tables/devices.py:205 dcim/tables/devices.py:942 #: dcim/tables/devicetypes.py:81 dcim/tables/devicetypes.py:304 #: dcim/tables/modules.py:20 dcim/tables/modules.py:60 #: templates/dcim/devicetype.html:17 templates/dcim/inventoryitem.html:45 @@ -2475,12 +2614,12 @@ msgid "Manufacturer" msgstr "" #: dcim/forms/bulk_edit.py:405 dcim/forms/bulk_import.py:317 -#: dcim/forms/filtersets.py:430 dcim/forms/model_forms.py:292 +#: dcim/forms/filtersets.py:434 dcim/forms/model_forms.py:292 msgid "Default platform" msgstr "" #: dcim/forms/bulk_edit.py:410 dcim/forms/bulk_edit.py:469 -#: dcim/forms/filtersets.py:433 dcim/forms/filtersets.py:553 +#: dcim/forms/filtersets.py:437 dcim/forms/filtersets.py:558 msgid "Part number" msgstr "" @@ -2493,14 +2632,14 @@ msgid "Exclude from utilization" msgstr "" #: dcim/forms/bulk_edit.py:429 dcim/forms/bulk_edit.py:598 -#: dcim/forms/bulk_import.py:517 dcim/forms/filtersets.py:442 -#: dcim/forms/filtersets.py:724 templates/dcim/device.html:117 +#: dcim/forms/bulk_import.py:517 dcim/forms/filtersets.py:446 +#: dcim/forms/filtersets.py:731 templates/dcim/device.html:100 #: templates/dcim/devicetype.html:68 msgid "Airflow" msgstr "" #: dcim/forms/bulk_edit.py:453 dcim/forms/model_forms.py:303 -#: dcim/tables/devicetypes.py:78 templates/dcim/device.html:107 +#: dcim/tables/devicetypes.py:78 templates/dcim/device.html:90 #: templates/dcim/devicebay.html:59 templates/dcim/module.html:59 msgid "Device Type" msgstr "" @@ -2520,37 +2659,37 @@ msgstr "" #: dcim/forms/bulk_edit.py:613 dcim/forms/bulk_import.py:368 #: dcim/forms/bulk_import.py:372 dcim/forms/bulk_import.py:394 #: dcim/forms/bulk_import.py:398 dcim/forms/bulk_import.py:523 -#: dcim/forms/bulk_import.py:527 dcim/forms/filtersets.py:615 -#: dcim/forms/filtersets.py:630 dcim/forms/filtersets.py:743 +#: dcim/forms/bulk_import.py:527 dcim/forms/filtersets.py:620 +#: dcim/forms/filtersets.py:636 dcim/forms/filtersets.py:750 #: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:375 -#: dcim/forms/model_forms.py:476 virtualization/forms/bulk_import.py:131 -#: virtualization/forms/bulk_import.py:132 -#: virtualization/forms/filtersets.py:177 -#: virtualization/forms/model_forms.py:216 +#: dcim/forms/model_forms.py:477 virtualization/forms/bulk_import.py:132 +#: virtualization/forms/bulk_import.py:133 +#: virtualization/forms/filtersets.py:180 +#: virtualization/forms/model_forms.py:218 msgid "Config template" msgstr "" #: dcim/forms/bulk_edit.py:557 dcim/forms/bulk_edit.py:951 -#: dcim/forms/bulk_import.py:429 dcim/forms/filtersets.py:110 -#: dcim/forms/model_forms.py:435 dcim/forms/model_forms.py:775 -#: dcim/forms/model_forms.py:789 extras/filtersets.py:421 +#: dcim/forms/bulk_import.py:429 dcim/forms/filtersets.py:111 +#: dcim/forms/model_forms.py:435 dcim/forms/model_forms.py:776 +#: dcim/forms/model_forms.py:790 extras/filtersets.py:452 msgid "Device type" msgstr "" #: dcim/forms/bulk_edit.py:565 dcim/forms/bulk_import.py:410 -#: dcim/forms/filtersets.py:115 dcim/forms/model_forms.py:440 +#: dcim/forms/filtersets.py:116 dcim/forms/model_forms.py:440 msgid "Device role" msgstr "" #: dcim/forms/bulk_edit.py:588 dcim/forms/bulk_import.py:435 -#: dcim/forms/filtersets.py:716 dcim/forms/model_forms.py:385 -#: dcim/forms/model_forms.py:444 extras/filtersets.py:437 -#: templates/dcim/device.html:208 templates/dcim/platform.html:27 +#: dcim/forms/filtersets.py:723 dcim/forms/model_forms.py:385 +#: dcim/forms/model_forms.py:444 extras/filtersets.py:468 +#: templates/dcim/device.html:191 templates/dcim/platform.html:27 #: templates/virtualization/virtualmachine.html:30 -#: virtualization/forms/bulk_edit.py:157 -#: virtualization/forms/bulk_import.py:121 -#: virtualization/forms/filtersets.py:161 -#: virtualization/forms/model_forms.py:205 +#: virtualization/forms/bulk_edit.py:159 +#: virtualization/forms/bulk_import.py:122 +#: virtualization/forms/filtersets.py:164 +#: virtualization/forms/model_forms.py:206 msgid "Platform" msgstr "" @@ -2562,61 +2701,65 @@ msgstr "" #: dcim/forms/bulk_import.py:879 dcim/forms/bulk_import.py:927 #: dcim/forms/bulk_import.py:944 dcim/forms/bulk_import.py:956 #: dcim/forms/bulk_import.py:1004 dcim/forms/bulk_import.py:1350 -#: dcim/forms/connections.py:23 dcim/forms/filtersets.py:127 -#: dcim/forms/filtersets.py:824 dcim/forms/filtersets.py:957 -#: dcim/forms/filtersets.py:1146 dcim/forms/filtersets.py:1168 -#: dcim/forms/filtersets.py:1190 dcim/forms/filtersets.py:1207 -#: dcim/forms/filtersets.py:1227 dcim/forms/filtersets.py:1334 -#: dcim/forms/filtersets.py:1356 dcim/forms/filtersets.py:1377 -#: dcim/forms/filtersets.py:1392 dcim/forms/filtersets.py:1403 -#: dcim/forms/filtersets.py:1467 dcim/forms/filtersets.py:1491 -#: dcim/forms/filtersets.py:1515 dcim/forms/model_forms.py:554 -#: dcim/forms/model_forms.py:752 dcim/forms/model_forms.py:1003 -#: dcim/forms/model_forms.py:1452 dcim/forms/object_create.py:239 +#: dcim/forms/connections.py:23 dcim/forms/filtersets.py:128 +#: dcim/forms/filtersets.py:831 dcim/forms/filtersets.py:964 +#: dcim/forms/filtersets.py:1154 dcim/forms/filtersets.py:1176 +#: dcim/forms/filtersets.py:1198 dcim/forms/filtersets.py:1215 +#: dcim/forms/filtersets.py:1235 dcim/forms/filtersets.py:1343 +#: dcim/forms/filtersets.py:1365 dcim/forms/filtersets.py:1386 +#: dcim/forms/filtersets.py:1401 dcim/forms/filtersets.py:1412 +#: dcim/forms/filtersets.py:1476 dcim/forms/filtersets.py:1500 +#: dcim/forms/filtersets.py:1524 dcim/forms/model_forms.py:555 +#: dcim/forms/model_forms.py:753 dcim/forms/model_forms.py:1004 +#: dcim/forms/model_forms.py:1453 dcim/forms/object_create.py:256 #: dcim/tables/connections.py:22 dcim/tables/connections.py:41 #: dcim/tables/connections.py:60 dcim/tables/devices.py:314 #: dcim/tables/devices.py:374 dcim/tables/devices.py:418 -#: dcim/tables/devices.py:463 dcim/tables/devices.py:511 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:693 -#: dcim/tables/devices.py:753 dcim/tables/devices.py:803 -#: dcim/tables/devices.py:863 dcim/tables/devices.py:915 -#: dcim/tables/devices.py:1037 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:304 ipam/forms/bulk_import.py:306 -#: ipam/forms/bulk_import.py:492 ipam/forms/bulk_import.py:543 -#: ipam/forms/filtersets.py:594 ipam/forms/model_forms.py:687 -#: ipam/tables/vlans.py:176 templates/dcim/consoleport.html:23 -#: templates/dcim/consoleserverport.html:23 templates/dcim/device.html:13 -#: templates/dcim/device.html:145 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:23 templates/dcim/devicebay.html:55 -#: templates/dcim/frontport.html:23 templates/dcim/interface.html:31 -#: templates/dcim/interface.html:163 templates/dcim/inventoryitem.html:21 -#: templates/dcim/module.html:55 templates/dcim/modulebay.html:21 -#: templates/dcim/poweroutlet.html:23 templates/dcim/powerport.html:23 -#: templates/dcim/rearport.html:23 templates/dcim/virtualchassis.html:58 +#: dcim/tables/devices.py:463 dcim/tables/devices.py:517 +#: dcim/tables/devices.py:609 dcim/tables/devices.py:710 +#: dcim/tables/devices.py:770 dcim/tables/devices.py:820 +#: dcim/tables/devices.py:880 dcim/tables/devices.py:932 +#: dcim/tables/devices.py:1058 dcim/tables/modules.py:52 +#: extras/forms/filtersets.py:329 ipam/forms/bulk_import.py:303 +#: ipam/forms/bulk_import.py:489 ipam/forms/filtersets.py:532 +#: ipam/forms/model_forms.py:685 ipam/tables/vlans.py:176 +#: templates/dcim/consoleport.html:23 templates/dcim/consoleserverport.html:23 +#: templates/dcim/device.html:14 templates/dcim/device.html:128 +#: templates/dcim/device_edit.html:10 templates/dcim/devicebay.html:23 +#: templates/dcim/devicebay.html:55 templates/dcim/frontport.html:23 +#: templates/dcim/interface.html:31 templates/dcim/interface.html:167 +#: templates/dcim/inventoryitem.html:21 templates/dcim/module.html:55 +#: templates/dcim/modulebay.html:21 templates/dcim/poweroutlet.html:23 +#: templates/dcim/powerport.html:23 templates/dcim/rearport.html:23 +#: templates/dcim/virtualchassis.html:58 #: templates/dcim/virtualchassis_edit.html:52 #: templates/dcim/virtualdevicecontext.html:25 -#: templates/ipam/ipaddress_edit.html:42 -#: templates/ipam/l2vpntermination_edit.html:22 -#: templates/ipam/service_create.html:17 templates/ipam/service_edit.html:16 +#: templates/ipam/ipaddress_edit.html:42 templates/ipam/service_create.html:17 +#: templates/ipam/service_edit.html:16 #: templates/virtualization/virtualmachine.html:115 +#: templates/vpn/l2vpntermination_edit.html:22 +#: templates/vpn/tunneltermination.html:24 #: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:163 virtualization/forms/bulk_edit.py:134 -#: virtualization/forms/bulk_import.py:98 -#: virtualization/forms/filtersets.py:121 -#: virtualization/forms/model_forms.py:187 -#: virtualization/tables/virtualmachines.py:59 +#: virtualization/filtersets.py:166 virtualization/forms/bulk_edit.py:136 +#: virtualization/forms/bulk_import.py:99 +#: virtualization/forms/filtersets.py:124 +#: virtualization/forms/model_forms.py:188 +#: virtualization/tables/virtualmachines.py:61 vpn/choices.py:44 +#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:278 +#: vpn/forms/filtersets.py:271 vpn/forms/model_forms.py:89 +#: vpn/forms/model_forms.py:124 vpn/forms/model_forms.py:237 #: wireless/forms/model_forms.py:100 wireless/forms/model_forms.py:140 #: wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "" -#: dcim/forms/bulk_edit.py:624 netbox/navigation/menu.py:421 +#: dcim/forms/bulk_edit.py:624 netbox/navigation/menu.py:441 #: templates/extras/dashboard/widget_config.html:7 msgid "Configuration" msgstr "" #: dcim/forms/bulk_edit.py:638 dcim/forms/bulk_import.py:590 -#: dcim/forms/model_forms.py:568 dcim/forms/model_forms.py:794 +#: dcim/forms/model_forms.py:569 dcim/forms/model_forms.py:795 msgid "Module type" msgstr "" @@ -2625,7 +2768,7 @@ msgstr "" #: dcim/forms/bulk_edit.py:958 dcim/forms/bulk_edit.py:1002 #: dcim/forms/bulk_edit.py:1053 dcim/forms/bulk_edit.py:1080 #: dcim/forms/bulk_edit.py:1107 dcim/forms/bulk_edit.py:1125 -#: dcim/forms/bulk_edit.py:1143 dcim/forms/filtersets.py:63 +#: dcim/forms/bulk_edit.py:1143 dcim/forms/filtersets.py:64 #: dcim/forms/object_create.py:45 templates/dcim/cable.html:33 #: templates/dcim/consoleport.html:35 templates/dcim/consoleserverport.html:35 #: templates/dcim/devicebay.html:31 templates/dcim/frontport.html:35 @@ -2637,13 +2780,13 @@ msgstr "" msgid "Label" msgstr "" -#: dcim/forms/bulk_edit.py:698 dcim/forms/filtersets.py:974 +#: dcim/forms/bulk_edit.py:698 dcim/forms/filtersets.py:981 #: templates/dcim/cable.html:51 msgid "Length" msgstr "" #: dcim/forms/bulk_edit.py:703 dcim/forms/bulk_import.py:1158 -#: dcim/forms/bulk_import.py:1161 dcim/forms/filtersets.py:978 +#: dcim/forms/bulk_import.py:1161 dcim/forms/filtersets.py:985 msgid "Length unit" msgstr "" @@ -2652,31 +2795,31 @@ msgid "Domain" msgstr "" #: dcim/forms/bulk_edit.py:795 dcim/forms/bulk_import.py:1273 -#: dcim/forms/filtersets.py:1063 dcim/forms/model_forms.py:656 +#: dcim/forms/filtersets.py:1071 dcim/forms/model_forms.py:657 msgid "Power panel" msgstr "" #: dcim/forms/bulk_edit.py:817 dcim/forms/bulk_import.py:1309 -#: dcim/forms/filtersets.py:1085 templates/dcim/powerfeed.html:90 +#: dcim/forms/filtersets.py:1093 templates/dcim/powerfeed.html:90 msgid "Supply" msgstr "" #: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1314 -#: dcim/forms/filtersets.py:1090 templates/dcim/powerfeed.html:102 +#: dcim/forms/filtersets.py:1098 templates/dcim/powerfeed.html:102 msgid "Phase" msgstr "" -#: dcim/forms/bulk_edit.py:829 dcim/forms/filtersets.py:1095 +#: dcim/forms/bulk_edit.py:829 dcim/forms/filtersets.py:1103 #: templates/dcim/powerfeed.html:94 msgid "Voltage" msgstr "" -#: dcim/forms/bulk_edit.py:833 dcim/forms/filtersets.py:1099 +#: dcim/forms/bulk_edit.py:833 dcim/forms/filtersets.py:1107 #: templates/dcim/powerfeed.html:98 msgid "Amperage" msgstr "" -#: dcim/forms/bulk_edit.py:837 dcim/forms/filtersets.py:1103 +#: dcim/forms/bulk_edit.py:837 dcim/forms/filtersets.py:1111 msgid "Max utilization" msgstr "" @@ -2691,8 +2834,8 @@ msgstr "" msgid "Maximum draw" msgstr "" -#: dcim/forms/bulk_edit.py:929 dcim/models/device_component_templates.py:257 -#: dcim/models/device_components.py:358 +#: dcim/forms/bulk_edit.py:929 dcim/models/device_component_templates.py:256 +#: dcim/models/device_components.py:357 msgid "Maximum power draw (watts)" msgstr "" @@ -2700,14 +2843,14 @@ msgstr "" msgid "Allocated draw" msgstr "" -#: dcim/forms/bulk_edit.py:935 dcim/models/device_component_templates.py:264 -#: dcim/models/device_components.py:365 +#: dcim/forms/bulk_edit.py:935 dcim/models/device_component_templates.py:263 +#: dcim/models/device_components.py:364 msgid "Allocated power draw (watts)" msgstr "" #: dcim/forms/bulk_edit.py:968 dcim/forms/bulk_import.py:723 -#: dcim/forms/model_forms.py:847 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1360 dcim/forms/object_import.py:60 +#: dcim/forms/model_forms.py:848 dcim/forms/model_forms.py:1076 +#: dcim/forms/model_forms.py:1361 dcim/forms/object_import.py:60 msgid "Power port" msgstr "" @@ -2720,27 +2863,27 @@ msgid "Management only" msgstr "" #: dcim/forms/bulk_edit.py:1029 dcim/forms/bulk_edit.py:1331 -#: dcim/forms/bulk_import.py:813 dcim/forms/filtersets.py:1285 -#: dcim/forms/object_import.py:95 dcim/models/device_component_templates.py:412 -#: dcim/models/device_components.py:668 +#: dcim/forms/bulk_import.py:813 dcim/forms/filtersets.py:1294 +#: dcim/forms/object_import.py:95 dcim/models/device_component_templates.py:411 +#: dcim/models/device_components.py:671 msgid "PoE mode" msgstr "" #: dcim/forms/bulk_edit.py:1035 dcim/forms/bulk_edit.py:1337 -#: dcim/forms/bulk_import.py:819 dcim/forms/filtersets.py:1290 +#: dcim/forms/bulk_import.py:819 dcim/forms/filtersets.py:1299 #: dcim/forms/object_import.py:100 -#: dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:674 +#: dcim/models/device_component_templates.py:417 +#: dcim/models/device_components.py:677 msgid "PoE type" msgstr "" -#: dcim/forms/bulk_edit.py:1041 dcim/forms/filtersets.py:1295 +#: dcim/forms/bulk_edit.py:1041 dcim/forms/filtersets.py:1304 #: dcim/forms/object_import.py:105 msgid "Wireless role" msgstr "" -#: dcim/forms/bulk_edit.py:1178 dcim/forms/model_forms.py:587 -#: dcim/forms/model_forms.py:1018 dcim/tables/devices.py:337 +#: dcim/forms/bulk_edit.py:1178 dcim/forms/model_forms.py:588 +#: dcim/forms/model_forms.py:1019 dcim/tables/devices.py:337 #: templates/dcim/consoleport.html:27 templates/dcim/consoleserverport.html:27 #: templates/dcim/frontport.html:27 templates/dcim/interface.html:35 #: templates/dcim/module.html:51 templates/dcim/modulebay.html:57 @@ -2749,86 +2892,91 @@ msgstr "" msgid "Module" msgstr "" -#: dcim/forms/bulk_edit.py:1305 dcim/tables/devices.py:663 -#: templates/dcim/interface.html:105 +#: dcim/forms/bulk_edit.py:1305 dcim/tables/devices.py:680 +#: templates/dcim/interface.html:113 msgid "LAG" msgstr "" -#: dcim/forms/bulk_edit.py:1310 dcim/forms/model_forms.py:1102 +#: dcim/forms/bulk_edit.py:1310 dcim/forms/model_forms.py:1103 msgid "Virtual device contexts" msgstr "" #: dcim/forms/bulk_edit.py:1316 dcim/forms/bulk_import.py:651 -#: dcim/forms/bulk_import.py:677 dcim/forms/filtersets.py:1155 -#: dcim/forms/filtersets.py:1177 dcim/forms/filtersets.py:1249 -#: dcim/tables/devices.py:609 +#: dcim/forms/bulk_import.py:677 dcim/forms/filtersets.py:1163 +#: dcim/forms/filtersets.py:1185 dcim/forms/filtersets.py:1258 +#: dcim/tables/devices.py:621 #: templates/circuits/inc/circuit_termination.html:94 #: templates/dcim/consoleport.html:43 templates/dcim/consoleserverport.html:43 msgid "Speed" msgstr "" #: dcim/forms/bulk_edit.py:1345 dcim/forms/bulk_import.py:822 -#: virtualization/forms/bulk_edit.py:230 -#: virtualization/forms/bulk_import.py:164 +#: templates/vpn/ikepolicy.html:26 templates/vpn/ipsecprofile.html:22 +#: templates/vpn/ipsecprofile.html:51 virtualization/forms/bulk_edit.py:232 +#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:145 +#: vpn/forms/bulk_edit.py:233 vpn/forms/bulk_import.py:175 +#: vpn/forms/bulk_import.py:229 vpn/forms/filtersets.py:132 +#: vpn/forms/filtersets.py:175 vpn/forms/filtersets.py:189 +#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 msgid "Mode" msgstr "" -#: dcim/forms/bulk_edit.py:1353 dcim/forms/model_forms.py:1151 -#: ipam/forms/bulk_import.py:180 ipam/forms/filtersets.py:481 -#: ipam/models/vlans.py:82 virtualization/forms/bulk_edit.py:237 -#: virtualization/forms/model_forms.py:303 +#: dcim/forms/bulk_edit.py:1353 dcim/forms/model_forms.py:1152 +#: ipam/forms/bulk_import.py:177 ipam/forms/filtersets.py:479 +#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:239 +#: virtualization/forms/model_forms.py:324 msgid "VLAN group" msgstr "" -#: dcim/forms/bulk_edit.py:1361 dcim/forms/model_forms.py:1156 -#: dcim/tables/devices.py:582 virtualization/forms/bulk_edit.py:245 -#: virtualization/forms/model_forms.py:308 +#: dcim/forms/bulk_edit.py:1361 dcim/forms/model_forms.py:1157 +#: dcim/tables/devices.py:594 virtualization/forms/bulk_edit.py:247 +#: virtualization/forms/model_forms.py:329 msgid "Untagged VLAN" msgstr "" -#: dcim/forms/bulk_edit.py:1369 dcim/forms/model_forms.py:1165 -#: dcim/tables/devices.py:588 virtualization/forms/bulk_edit.py:253 -#: virtualization/forms/model_forms.py:317 +#: dcim/forms/bulk_edit.py:1369 dcim/forms/model_forms.py:1166 +#: dcim/tables/devices.py:600 virtualization/forms/bulk_edit.py:255 +#: virtualization/forms/model_forms.py:338 msgid "Tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1379 dcim/forms/model_forms.py:1138 +#: dcim/forms/bulk_edit.py:1379 dcim/forms/model_forms.py:1139 msgid "Wireless LAN group" msgstr "" -#: dcim/forms/bulk_edit.py:1384 dcim/forms/model_forms.py:1143 -#: dcim/tables/devices.py:618 netbox/navigation/menu.py:134 -#: templates/dcim/interface.html:285 wireless/tables/wirelesslan.py:24 +#: dcim/forms/bulk_edit.py:1384 dcim/forms/model_forms.py:1144 +#: dcim/tables/devices.py:630 netbox/navigation/menu.py:134 +#: templates/dcim/interface.html:289 wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "" -#: dcim/forms/bulk_edit.py:1393 dcim/forms/filtersets.py:1223 -#: dcim/forms/model_forms.py:1184 ipam/forms/bulk_edit.py:272 -#: ipam/forms/bulk_edit.py:363 ipam/forms/filtersets.py:170 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:96 -#: virtualization/forms/model_forms.py:331 +#: dcim/forms/bulk_edit.py:1393 dcim/forms/filtersets.py:1231 +#: dcim/forms/model_forms.py:1185 ipam/forms/bulk_edit.py:270 +#: ipam/forms/bulk_edit.py:361 ipam/forms/filtersets.py:166 +#: templates/dcim/interface.html:126 templates/ipam/prefix.html:96 +#: virtualization/forms/model_forms.py:352 msgid "Addressing" msgstr "" -#: dcim/forms/bulk_edit.py:1394 dcim/forms/filtersets.py:645 -#: dcim/forms/model_forms.py:1185 virtualization/forms/model_forms.py:332 +#: dcim/forms/bulk_edit.py:1394 dcim/forms/filtersets.py:651 +#: dcim/forms/model_forms.py:1186 virtualization/forms/model_forms.py:353 msgid "Operation" msgstr "" -#: dcim/forms/bulk_edit.py:1395 dcim/forms/filtersets.py:1224 -#: dcim/forms/model_forms.py:879 dcim/forms/model_forms.py:1187 +#: dcim/forms/bulk_edit.py:1395 dcim/forms/filtersets.py:1232 +#: dcim/forms/model_forms.py:880 dcim/forms/model_forms.py:1188 msgid "PoE" msgstr "" -#: dcim/forms/bulk_edit.py:1396 dcim/forms/model_forms.py:1186 -#: templates/dcim/interface.html:93 virtualization/forms/bulk_edit.py:264 -#: virtualization/forms/model_forms.py:333 +#: dcim/forms/bulk_edit.py:1396 dcim/forms/model_forms.py:1187 +#: templates/dcim/interface.html:101 virtualization/forms/bulk_edit.py:266 +#: virtualization/forms/model_forms.py:354 msgid "Related Interfaces" msgstr "" -#: dcim/forms/bulk_edit.py:1397 dcim/forms/model_forms.py:1188 -#: virtualization/forms/bulk_edit.py:265 -#: virtualization/forms/model_forms.py:334 +#: dcim/forms/bulk_edit.py:1397 dcim/forms/model_forms.py:1189 +#: virtualization/forms/bulk_edit.py:267 +#: virtualization/forms/model_forms.py:355 msgid "802.1Q Switching" msgstr "" @@ -2862,9 +3010,9 @@ msgid "available options" msgstr "" #: dcim/forms/bulk_import.py:133 dcim/forms/bulk_import.py:480 -#: dcim/forms/bulk_import.py:1270 ipam/forms/bulk_import.py:177 -#: ipam/forms/bulk_import.py:444 virtualization/forms/bulk_import.py:62 -#: virtualization/forms/bulk_import.py:88 +#: dcim/forms/bulk_import.py:1270 ipam/forms/bulk_import.py:174 +#: ipam/forms/bulk_import.py:441 virtualization/forms/bulk_import.py:63 +#: virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "" @@ -2909,7 +3057,7 @@ msgid "Rack's location (if any)" msgstr "" #: dcim/forms/bulk_import.py:268 dcim/forms/model_forms.py:246 -#: dcim/tables/racks.py:153 templates/dcim/rackreservation.html:11 +#: dcim/tables/racks.py:153 templates/dcim/rackreservation.html:12 #: templates/dcim/rackreservation.html:52 msgid "Units" msgstr "" @@ -2958,29 +3106,29 @@ msgstr "" msgid "Device type model" msgstr "" -#: dcim/forms/bulk_import.py:439 virtualization/forms/bulk_import.py:125 +#: dcim/forms/bulk_import.py:439 virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "" #: dcim/forms/bulk_import.py:447 dcim/forms/bulk_import.py:451 -#: dcim/forms/model_forms.py:460 +#: dcim/forms/model_forms.py:461 msgid "Virtual chassis" msgstr "" -#: dcim/forms/bulk_import.py:454 dcim/forms/model_forms.py:449 -#: dcim/tables/devices.py:231 extras/filtersets.py:470 -#: extras/forms/filtersets.py:305 ipam/forms/bulk_edit.py:480 -#: ipam/forms/model_forms.py:590 templates/dcim/device.html:256 +#: dcim/forms/bulk_import.py:454 dcim/forms/model_forms.py:450 +#: dcim/tables/devices.py:231 extras/filtersets.py:501 +#: extras/forms/filtersets.py:330 ipam/forms/bulk_edit.py:478 +#: ipam/forms/model_forms.py:588 templates/dcim/device.html:239 #: templates/virtualization/cluster.html:11 #: templates/virtualization/virtualmachine.html:92 #: templates/virtualization/virtualmachine.html:102 -#: virtualization/filtersets.py:153 virtualization/filtersets.py:268 -#: virtualization/forms/bulk_edit.py:126 virtualization/forms/bulk_import.py:91 -#: virtualization/forms/filtersets.py:95 virtualization/forms/filtersets.py:116 -#: virtualization/forms/filtersets.py:192 -#: virtualization/forms/model_forms.py:81 -#: virtualization/forms/model_forms.py:178 -#: virtualization/tables/virtualmachines.py:55 +#: virtualization/filtersets.py:156 virtualization/filtersets.py:271 +#: virtualization/forms/bulk_edit.py:128 virtualization/forms/bulk_import.py:92 +#: virtualization/forms/filtersets.py:98 virtualization/forms/filtersets.py:119 +#: virtualization/forms/filtersets.py:196 +#: virtualization/forms/model_forms.py:82 +#: virtualization/forms/model_forms.py:179 +#: virtualization/tables/virtualmachines.py:57 msgid "Cluster" msgstr "" @@ -3024,7 +3172,7 @@ msgstr "" msgid "The device in which this module is installed" msgstr "" -#: dcim/forms/bulk_import.py:584 dcim/forms/model_forms.py:561 +#: dcim/forms/bulk_import.py:584 dcim/forms/model_forms.py:562 msgid "Module bay" msgstr "" @@ -3036,7 +3184,7 @@ msgstr "" msgid "The type of module" msgstr "" -#: dcim/forms/bulk_import.py:601 dcim/forms/model_forms.py:574 +#: dcim/forms/bulk_import.py:601 dcim/forms/model_forms.py:575 msgid "Replicate components" msgstr "" @@ -3046,11 +3194,11 @@ msgid "" "by default)" msgstr "" -#: dcim/forms/bulk_import.py:606 dcim/forms/model_forms.py:580 +#: dcim/forms/bulk_import.py:606 dcim/forms/model_forms.py:581 msgid "Adopt components" msgstr "" -#: dcim/forms/bulk_import.py:608 dcim/forms/model_forms.py:583 +#: dcim/forms/bulk_import.py:608 dcim/forms/model_forms.py:584 msgid "Adopt already existing components" msgstr "" @@ -3079,15 +3227,15 @@ msgstr "" msgid "Electrical phase (for three-phase circuits)" msgstr "" -#: dcim/forms/bulk_import.py:774 dcim/forms/model_forms.py:1113 -#: virtualization/forms/bulk_import.py:154 -#: virtualization/forms/model_forms.py:287 +#: dcim/forms/bulk_import.py:774 dcim/forms/model_forms.py:1114 +#: virtualization/forms/bulk_import.py:155 +#: virtualization/forms/model_forms.py:308 msgid "Parent interface" msgstr "" -#: dcim/forms/bulk_import.py:781 dcim/forms/model_forms.py:1121 -#: virtualization/forms/bulk_import.py:161 -#: virtualization/forms/model_forms.py:295 +#: dcim/forms/bulk_import.py:781 dcim/forms/model_forms.py:1122 +#: virtualization/forms/bulk_import.py:162 +#: virtualization/forms/model_forms.py:316 msgid "Bridged interface" msgstr "" @@ -3111,7 +3259,7 @@ msgstr "" msgid "Physical medium" msgstr "" -#: dcim/forms/bulk_import.py:805 dcim/forms/filtersets.py:1256 +#: dcim/forms/bulk_import.py:805 dcim/forms/filtersets.py:1265 msgid "Duplex" msgstr "" @@ -3123,14 +3271,14 @@ msgstr "" msgid "Poe type" msgstr "" -#: dcim/forms/bulk_import.py:825 virtualization/forms/bulk_import.py:167 +#: dcim/forms/bulk_import.py:825 virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "" -#: dcim/forms/bulk_import.py:832 ipam/forms/bulk_import.py:163 -#: ipam/forms/bulk_import.py:249 ipam/forms/bulk_import.py:285 -#: ipam/forms/filtersets.py:200 ipam/forms/filtersets.py:270 -#: ipam/forms/filtersets.py:325 virtualization/forms/bulk_import.py:174 +#: dcim/forms/bulk_import.py:832 ipam/forms/bulk_import.py:160 +#: ipam/forms/bulk_import.py:246 ipam/forms/bulk_import.py:282 +#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:266 +#: ipam/forms/filtersets.py:322 virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "" @@ -3142,8 +3290,8 @@ msgstr "" msgid "Wireless role (AP/station)" msgstr "" -#: dcim/forms/bulk_import.py:884 dcim/forms/model_forms.py:892 -#: dcim/forms/model_forms.py:1368 dcim/forms/object_import.py:122 +#: dcim/forms/bulk_import.py:884 dcim/forms/model_forms.py:893 +#: dcim/forms/model_forms.py:1369 dcim/forms/object_import.py:122 msgid "Rear port" msgstr "" @@ -3156,7 +3304,7 @@ msgstr "" msgid "Physical medium classification" msgstr "" -#: dcim/forms/bulk_import.py:961 dcim/tables/devices.py:824 +#: dcim/forms/bulk_import.py:961 dcim/tables/devices.py:841 msgid "Installed device" msgstr "" @@ -3228,8 +3376,8 @@ msgstr "" msgid "Connection status" msgstr "" -#: dcim/forms/bulk_import.py:1221 dcim/forms/model_forms.py:688 -#: dcim/tables/devices.py:1007 templates/dcim/device.html:147 +#: dcim/forms/bulk_import.py:1221 dcim/forms/model_forms.py:689 +#: dcim/tables/devices.py:1028 templates/dcim/device.html:130 #: templates/dcim/virtualchassis.html:28 templates/dcim/virtualchassis.html:60 msgid "Master" msgstr "" @@ -3258,10 +3406,10 @@ msgstr "" msgid "Single or three-phase" msgstr "" -#: dcim/forms/common.py:24 dcim/models/device_components.py:529 +#: dcim/forms/common.py:24 dcim/models/device_components.py:528 #: templates/dcim/interface.html:58 #: templates/virtualization/vminterface.html:58 -#: virtualization/forms/bulk_edit.py:222 +#: virtualization/forms/bulk_edit.py:224 msgid "MTU" msgstr "" @@ -3295,7 +3443,7 @@ msgstr "" msgid "Power Panel" msgstr "" -#: dcim/forms/connections.py:54 dcim/forms/model_forms.py:669 +#: dcim/forms/connections.py:54 dcim/forms/model_forms.py:670 #: templates/dcim/powerfeed.html:22 templates/dcim/powerport.html:84 msgid "Power Feed" msgstr "" @@ -3304,104 +3452,99 @@ msgstr "" msgid "Side" msgstr "" -#: dcim/forms/filtersets.py:140 +#: dcim/forms/filtersets.py:141 msgid "Parent region" msgstr "" -#: dcim/forms/filtersets.py:154 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 +#: dcim/forms/filtersets.py:155 tenancy/forms/bulk_import.py:28 +#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:32 +#: tenancy/forms/filtersets.py:61 wireless/forms/bulk_import.py:25 #: wireless/forms/filtersets.py:24 msgid "Parent group" msgstr "" -#: dcim/forms/filtersets.py:244 dcim/forms/filtersets.py:328 +#: dcim/forms/filtersets.py:246 dcim/forms/filtersets.py:331 msgid "Function" msgstr "" -#: dcim/forms/filtersets.py:415 dcim/forms/model_forms.py:308 +#: dcim/forms/filtersets.py:418 dcim/forms/model_forms.py:308 #: templates/inc/panels/image_attachments.html:5 msgid "Images" msgstr "" -#: dcim/forms/filtersets.py:416 dcim/forms/filtersets.py:540 -#: dcim/forms/filtersets.py:649 +#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:544 +#: dcim/forms/filtersets.py:655 msgid "Components" msgstr "" -#: dcim/forms/filtersets.py:437 +#: dcim/forms/filtersets.py:441 msgid "Subdevice role" msgstr "" -#: dcim/forms/filtersets.py:652 extras/forms/model_forms.py:496 -#: templates/extras/configrevision.html:171 users/forms/model_forms.py:63 -msgid "Miscellaneous" -msgstr "" - -#: dcim/forms/filtersets.py:710 +#: dcim/forms/filtersets.py:717 msgid "Model" msgstr "" -#: dcim/forms/filtersets.py:761 +#: dcim/forms/filtersets.py:768 msgid "Virtual chassis member" msgstr "" -#: dcim/forms/filtersets.py:1115 +#: dcim/forms/filtersets.py:1123 msgid "Cabled" msgstr "" -#: dcim/forms/filtersets.py:1122 +#: dcim/forms/filtersets.py:1130 msgid "Occupied" msgstr "" -#: dcim/forms/filtersets.py:1147 dcim/forms/filtersets.py:1169 -#: dcim/forms/filtersets.py:1191 dcim/forms/filtersets.py:1208 -#: dcim/forms/filtersets.py:1228 dcim/tables/devices.py:367 +#: dcim/forms/filtersets.py:1155 dcim/forms/filtersets.py:1177 +#: dcim/forms/filtersets.py:1199 dcim/forms/filtersets.py:1216 +#: dcim/forms/filtersets.py:1236 dcim/tables/devices.py:367 #: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:59 -#: templates/dcim/frontport.html:74 templates/dcim/interface.html:142 +#: templates/dcim/frontport.html:74 templates/dcim/interface.html:146 #: templates/dcim/powerfeed.html:118 templates/dcim/poweroutlet.html:63 #: templates/dcim/powerport.html:63 templates/dcim/rearport.html:70 msgid "Connection" msgstr "" -#: dcim/forms/filtersets.py:1236 dcim/forms/model_forms.py:1476 +#: dcim/forms/filtersets.py:1245 dcim/forms/model_forms.py:1477 #: templates/dcim/virtualdevicecontext.html:16 msgid "Virtual Device Context" msgstr "" -#: dcim/forms/filtersets.py:1239 extras/forms/bulk_edit.py:294 -#: extras/forms/bulk_import.py:177 extras/forms/filtersets.py:454 -#: extras/forms/model_forms.py:445 extras/tables/tables.py:482 +#: dcim/forms/filtersets.py:1248 extras/forms/bulk_edit.py:315 +#: extras/forms/bulk_import.py:239 extras/forms/filtersets.py:479 +#: extras/forms/model_forms.py:548 extras/tables/tables.py:482 #: templates/extras/journalentry.html:33 msgid "Kind" msgstr "" -#: dcim/forms/filtersets.py:1268 +#: dcim/forms/filtersets.py:1277 msgid "Mgmt only" msgstr "" -#: dcim/forms/filtersets.py:1280 dcim/forms/model_forms.py:1179 -#: dcim/models/device_components.py:627 templates/dcim/interface.html:130 +#: dcim/forms/filtersets.py:1289 dcim/forms/model_forms.py:1180 +#: dcim/models/device_components.py:630 templates/dcim/interface.html:134 msgid "WWN" msgstr "" -#: dcim/forms/filtersets.py:1300 +#: dcim/forms/filtersets.py:1309 msgid "Wireless channel" msgstr "" -#: dcim/forms/filtersets.py:1304 +#: dcim/forms/filtersets.py:1313 msgid "Channel frequency (MHz)" msgstr "" -#: dcim/forms/filtersets.py:1308 +#: dcim/forms/filtersets.py:1317 msgid "Channel width (MHz)" msgstr "" -#: dcim/forms/filtersets.py:1312 templates/dcim/interface.html:86 +#: dcim/forms/filtersets.py:1321 templates/dcim/interface.html:86 msgid "Transmit power (dBm)" msgstr "" -#: dcim/forms/filtersets.py:1335 dcim/forms/filtersets.py:1357 +#: dcim/forms/filtersets.py:1344 dcim/forms/filtersets.py:1366 #: dcim/tables/devices.py:344 templates/dcim/cable.html:12 #: templates/dcim/cable_edit.html:46 templates/dcim/cable_trace.html:43 #: templates/dcim/frontport.html:84 @@ -3410,7 +3553,7 @@ msgstr "" msgid "Cable" msgstr "" -#: dcim/forms/filtersets.py:1425 dcim/tables/devices.py:934 +#: dcim/forms/filtersets.py:1434 dcim/tables/devices.py:951 msgid "Discovered" msgstr "" @@ -3459,110 +3602,113 @@ msgstr "" msgid "The lowest-numbered unit occupied by the device" msgstr "" -#: dcim/forms/model_forms.py:468 +#: dcim/forms/model_forms.py:469 msgid "The position in the virtual chassis this device is identified by" msgstr "" -#: dcim/forms/model_forms.py:472 templates/dcim/device.html:148 +#: dcim/forms/model_forms.py:473 templates/dcim/device.html:131 #: templates/dcim/virtualchassis.html:61 #: templates/dcim/virtualchassis_edit.html:57 #: templates/ipam/inc/panels/fhrp_groups.html:13 tenancy/forms/bulk_edit.py:146 -#: tenancy/forms/filtersets.py:111 +#: tenancy/forms/filtersets.py:109 msgid "Priority" msgstr "" -#: dcim/forms/model_forms.py:473 +#: dcim/forms/model_forms.py:474 msgid "The priority of the device in the virtual chassis" msgstr "" -#: dcim/forms/model_forms.py:577 +#: dcim/forms/model_forms.py:578 msgid "Automatically populate components associated with this module type" msgstr "" -#: dcim/forms/model_forms.py:622 +#: dcim/forms/model_forms.py:623 msgid "Maximum length is 32767 (any unit)" msgstr "" -#: dcim/forms/model_forms.py:670 +#: dcim/forms/model_forms.py:671 msgid "Characteristics" msgstr "" -#: dcim/forms/model_forms.py:1129 +#: dcim/forms/model_forms.py:1130 msgid "LAG interface" msgstr "" -#: dcim/forms/model_forms.py:1183 dcim/forms/model_forms.py:1344 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:320 -#: ipam/forms/bulk_import.py:557 ipam/forms/model_forms.py:272 -#: ipam/forms/model_forms.py:281 ipam/forms/model_forms.py:807 -#: ipam/forms/model_forms.py:816 ipam/tables/fhrp.py:64 ipam/tables/ip.py:368 -#: ipam/tables/vlans.py:165 templates/circuits/inc/circuit_termination.html:78 +#: dcim/forms/model_forms.py:1184 dcim/forms/model_forms.py:1345 +#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:317 +#: ipam/forms/model_forms.py:270 ipam/forms/model_forms.py:279 +#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:368 ipam/tables/vlans.py:165 +#: templates/circuits/inc/circuit_termination.html:78 #: templates/dcim/frontport.html:113 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:186 templates/dcim/interface.html:318 +#: templates/dcim/interface.html:190 templates/dcim/interface.html:322 #: templates/dcim/inventoryitem_edit.html:54 templates/dcim/rearport.html:109 #: templates/ipam/fhrpgroupassignment_edit.html:11 #: templates/virtualization/vminterface.html:19 +#: templates/vpn/tunneltermination.html:32 #: templates/wireless/inc/wirelesslink_interface.html:10 #: templates/wireless/wirelesslink.html:10 #: templates/wireless/wirelesslink.html:49 -#: virtualization/forms/model_forms.py:330 wireless/forms/model_forms.py:112 -#: wireless/forms/model_forms.py:152 +#: virtualization/forms/model_forms.py:351 vpn/forms/bulk_import.py:292 +#: vpn/forms/model_forms.py:94 vpn/forms/model_forms.py:129 +#: vpn/forms/model_forms.py:241 vpn/forms/model_forms.py:430 +#: vpn/forms/model_forms.py:439 vpn/tables/tunnels.py:87 +#: wireless/forms/model_forms.py:112 wireless/forms/model_forms.py:152 msgid "Interface" msgstr "" -#: dcim/forms/model_forms.py:1277 +#: dcim/forms/model_forms.py:1278 msgid "Child Device" msgstr "" -#: dcim/forms/model_forms.py:1278 +#: dcim/forms/model_forms.py:1279 msgid "" "Child devices must first be created and assigned to the site and rack of the " "parent device." msgstr "" -#: dcim/forms/model_forms.py:1320 +#: dcim/forms/model_forms.py:1321 msgid "Console port" msgstr "" -#: dcim/forms/model_forms.py:1328 +#: dcim/forms/model_forms.py:1329 msgid "Console server port" msgstr "" -#: dcim/forms/model_forms.py:1336 +#: dcim/forms/model_forms.py:1337 msgid "Front port" msgstr "" -#: dcim/forms/model_forms.py:1352 +#: dcim/forms/model_forms.py:1353 msgid "Power outlet" msgstr "" -#: dcim/forms/model_forms.py:1372 templates/dcim/inventoryitem.html:17 +#: dcim/forms/model_forms.py:1373 templates/dcim/inventoryitem.html:17 #: templates/dcim/inventoryitem_edit.html:10 msgid "Inventory Item" msgstr "" -#: dcim/forms/model_forms.py:1424 +#: dcim/forms/model_forms.py:1425 msgid "An InventoryItem can only be assigned to a single component." msgstr "" -#: dcim/forms/model_forms.py:1438 templates/dcim/inventoryitemrole.html:15 +#: dcim/forms/model_forms.py:1439 templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "" -#: dcim/forms/model_forms.py:1458 templates/dcim/device.html:212 +#: dcim/forms/model_forms.py:1459 templates/dcim/device.html:195 #: templates/dcim/virtualdevicecontext.html:33 #: templates/virtualization/virtualmachine.html:51 msgid "Primary IPv4" msgstr "" -#: dcim/forms/model_forms.py:1467 templates/dcim/device.html:228 +#: dcim/forms/model_forms.py:1468 templates/dcim/device.html:211 #: templates/dcim/virtualdevicecontext.html:44 #: templates/virtualization/virtualmachine.html:67 msgid "Primary IPv6" msgstr "" -#: dcim/forms/object_create.py:47 dcim/forms/object_create.py:181 -#: dcim/forms/object_create.py:321 +#: dcim/forms/object_create.py:47 dcim/forms/object_create.py:198 +#: dcim/forms/object_create.py:354 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -3575,714 +3721,733 @@ msgid "" "expected." msgstr "" -#: dcim/forms/object_create.py:109 dcim/forms/object_create.py:253 +#: dcim/forms/object_create.py:109 dcim/forms/object_create.py:270 #: dcim/tables/devices.py:281 msgid "Rear ports" msgstr "" -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:254 +#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 msgid "Select one rear port assignment for each front port being created." msgstr "" -#: dcim/forms/object_create.py:233 +#: dcim/forms/object_create.py:163 +#, python-brace-format +msgid "" +"The number of front port templates to be created ({frontport_count}) must " +"match the selected number of rear port positions ({rearport_count})." +msgstr "" + +#: dcim/forms/object_create.py:250 #, python-brace-format msgid "" "The string {module} will be replaced with the position of the " "assigned module, if any." msgstr "" -#: dcim/forms/object_create.py:375 dcim/tables/devices.py:1013 +#: dcim/forms/object_create.py:319 +#, python-brace-format +msgid "" +"The number of front ports to be created ({frontport_count}) must match the " +"selected number of rear port positions ({rearport_count})." +msgstr "" + +#: dcim/forms/object_create.py:408 dcim/tables/devices.py:1034 #: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:54 #: templates/dcim/virtualchassis_edit.html:48 templates/ipam/fhrpgroup.html:39 msgid "Members" msgstr "" -#: dcim/forms/object_create.py:384 +#: dcim/forms/object_create.py:417 msgid "Initial position" msgstr "" -#: dcim/forms/object_create.py:387 +#: dcim/forms/object_create.py:420 msgid "" "Position of the first member device. Increases by one for each additional " "member." msgstr "" -#: dcim/forms/object_create.py:401 +#: dcim/forms/object_create.py:434 msgid "A position must be specified for the first VC member." msgstr "" -#: dcim/models/cables.py:63 dcim/models/device_component_templates.py:56 -#: dcim/models/device_components.py:64 extras/models/customfields.py:102 +#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 +#: dcim/models/device_components.py:63 extras/models/customfields.py:108 msgid "label" msgstr "" -#: dcim/models/cables.py:72 +#: dcim/models/cables.py:71 msgid "length" msgstr "" -#: dcim/models/cables.py:79 +#: dcim/models/cables.py:78 msgid "length unit" msgstr "" -#: dcim/models/cables.py:94 +#: dcim/models/cables.py:93 msgid "cable" msgstr "" -#: dcim/models/cables.py:95 +#: dcim/models/cables.py:94 msgid "cables" msgstr "" -#: dcim/models/cables.py:247 ipam/models/asns.py:37 +#: dcim/models/cables.py:190 +msgid "A and B terminations cannot connect to the same object." +msgstr "" + +#: dcim/models/cables.py:257 ipam/models/asns.py:37 msgid "end" msgstr "" -#: dcim/models/cables.py:297 +#: dcim/models/cables.py:310 msgid "cable termination" msgstr "" -#: dcim/models/cables.py:298 +#: dcim/models/cables.py:311 msgid "cable terminations" msgstr "" -#: dcim/models/cables.py:421 extras/models/configs.py:50 +#: dcim/models/cables.py:434 extras/models/configs.py:50 msgid "is active" msgstr "" -#: dcim/models/cables.py:425 +#: dcim/models/cables.py:438 msgid "is complete" msgstr "" -#: dcim/models/cables.py:429 +#: dcim/models/cables.py:442 msgid "is split" msgstr "" -#: dcim/models/cables.py:435 +#: dcim/models/cables.py:450 msgid "cable path" msgstr "" -#: dcim/models/cables.py:436 +#: dcim/models/cables.py:451 msgid "cable paths" msgstr "" -#: dcim/models/device_component_templates.py:47 +#: dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " "attached to a module type." msgstr "" -#: dcim/models/device_component_templates.py:59 -#: dcim/models/device_components.py:67 +#: dcim/models/device_component_templates.py:58 +#: dcim/models/device_components.py:66 msgid "Physical label" msgstr "" -#: dcim/models/device_component_templates.py:104 +#: dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "" -#: dcim/models/device_component_templates.py:155 +#: dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." msgstr "" -#: dcim/models/device_component_templates.py:159 +#: dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." msgstr "" -#: dcim/models/device_component_templates.py:187 +#: dcim/models/device_component_templates.py:186 msgid "console port template" msgstr "" -#: dcim/models/device_component_templates.py:188 +#: dcim/models/device_component_templates.py:187 msgid "console port templates" msgstr "" -#: dcim/models/device_component_templates.py:221 +#: dcim/models/device_component_templates.py:220 msgid "console server port template" msgstr "" -#: dcim/models/device_component_templates.py:222 +#: dcim/models/device_component_templates.py:221 msgid "console server port templates" msgstr "" -#: dcim/models/device_component_templates.py:253 -#: dcim/models/device_components.py:354 +#: dcim/models/device_component_templates.py:252 +#: dcim/models/device_components.py:353 msgid "maximum draw" msgstr "" -#: dcim/models/device_component_templates.py:260 -#: dcim/models/device_components.py:361 +#: dcim/models/device_component_templates.py:259 +#: dcim/models/device_components.py:360 msgid "allocated draw" msgstr "" -#: dcim/models/device_component_templates.py:270 +#: dcim/models/device_component_templates.py:269 msgid "power port template" msgstr "" -#: dcim/models/device_component_templates.py:271 +#: dcim/models/device_component_templates.py:270 msgid "power port templates" msgstr "" -#: dcim/models/device_component_templates.py:290 -#: dcim/models/device_components.py:384 +#: dcim/models/device_component_templates.py:289 +#: dcim/models/device_components.py:383 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" -#: dcim/models/device_component_templates.py:322 -#: dcim/models/device_components.py:479 +#: dcim/models/device_component_templates.py:321 +#: dcim/models/device_components.py:478 msgid "feed leg" msgstr "" -#: dcim/models/device_component_templates.py:326 -#: dcim/models/device_components.py:483 +#: dcim/models/device_component_templates.py:325 +#: dcim/models/device_components.py:482 msgid "Phase (for three-phase feeds)" msgstr "" -#: dcim/models/device_component_templates.py:332 +#: dcim/models/device_component_templates.py:331 msgid "power outlet template" msgstr "" -#: dcim/models/device_component_templates.py:333 +#: dcim/models/device_component_templates.py:332 msgid "power outlet templates" msgstr "" -#: dcim/models/device_component_templates.py:342 +#: dcim/models/device_component_templates.py:341 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" -#: dcim/models/device_component_templates.py:346 +#: dcim/models/device_component_templates.py:345 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" -#: dcim/models/device_component_templates.py:398 -#: dcim/models/device_components.py:609 +#: dcim/models/device_component_templates.py:397 +#: dcim/models/device_components.py:612 msgid "management only" msgstr "" -#: dcim/models/device_component_templates.py:406 -#: dcim/models/device_components.py:552 +#: dcim/models/device_component_templates.py:405 +#: dcim/models/device_components.py:551 msgid "bridge interface" msgstr "" -#: dcim/models/device_component_templates.py:424 -#: dcim/models/device_components.py:634 +#: dcim/models/device_component_templates.py:423 +#: dcim/models/device_components.py:637 msgid "wireless role" msgstr "" -#: dcim/models/device_component_templates.py:430 +#: dcim/models/device_component_templates.py:429 msgid "interface template" msgstr "" -#: dcim/models/device_component_templates.py:431 +#: dcim/models/device_component_templates.py:430 msgid "interface templates" msgstr "" -#: dcim/models/device_component_templates.py:438 -#: dcim/models/device_components.py:796 -#: virtualization/models/virtualmachines.py:340 +#: dcim/models/device_component_templates.py:437 +#: dcim/models/device_components.py:805 +#: virtualization/models/virtualmachines.py:398 msgid "An interface cannot be bridged to itself." msgstr "" -#: dcim/models/device_component_templates.py:441 +#: dcim/models/device_component_templates.py:440 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "" -#: dcim/models/device_component_templates.py:445 +#: dcim/models/device_component_templates.py:444 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "" -#: dcim/models/device_component_templates.py:501 -#: dcim/models/device_components.py:976 +#: dcim/models/device_component_templates.py:500 +#: dcim/models/device_components.py:985 msgid "rear port position" msgstr "" -#: dcim/models/device_component_templates.py:526 +#: dcim/models/device_component_templates.py:525 msgid "front port template" msgstr "" -#: dcim/models/device_component_templates.py:527 +#: dcim/models/device_component_templates.py:526 msgid "front port templates" msgstr "" -#: dcim/models/device_component_templates.py:537 +#: dcim/models/device_component_templates.py:536 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "" -#: dcim/models/device_component_templates.py:543 +#: dcim/models/device_component_templates.py:542 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " "positions" msgstr "" -#: dcim/models/device_component_templates.py:596 -#: dcim/models/device_components.py:1045 +#: dcim/models/device_component_templates.py:595 +#: dcim/models/device_components.py:1054 msgid "positions" msgstr "" -#: dcim/models/device_component_templates.py:607 +#: dcim/models/device_component_templates.py:606 msgid "rear port template" msgstr "" -#: dcim/models/device_component_templates.py:608 +#: dcim/models/device_component_templates.py:607 msgid "rear port templates" msgstr "" -#: dcim/models/device_component_templates.py:637 -#: dcim/models/device_components.py:1086 +#: dcim/models/device_component_templates.py:636 +#: dcim/models/device_components.py:1095 msgid "position" msgstr "" -#: dcim/models/device_component_templates.py:640 -#: dcim/models/device_components.py:1089 +#: dcim/models/device_component_templates.py:639 +#: dcim/models/device_components.py:1098 msgid "Identifier to reference when renaming installed components" msgstr "" -#: dcim/models/device_component_templates.py:646 +#: dcim/models/device_component_templates.py:645 msgid "module bay template" msgstr "" -#: dcim/models/device_component_templates.py:647 +#: dcim/models/device_component_templates.py:646 msgid "module bay templates" msgstr "" -#: dcim/models/device_component_templates.py:674 +#: dcim/models/device_component_templates.py:673 msgid "device bay template" msgstr "" -#: dcim/models/device_component_templates.py:675 +#: dcim/models/device_component_templates.py:674 msgid "device bay templates" msgstr "" -#: dcim/models/device_component_templates.py:688 +#: dcim/models/device_component_templates.py:687 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " "allow device bays." msgstr "" -#: dcim/models/device_component_templates.py:743 -#: dcim/models/device_components.py:1215 +#: dcim/models/device_component_templates.py:742 +#: dcim/models/device_components.py:1224 msgid "part ID" msgstr "" -#: dcim/models/device_component_templates.py:745 -#: dcim/models/device_components.py:1217 +#: dcim/models/device_component_templates.py:744 +#: dcim/models/device_components.py:1226 msgid "Manufacturer-assigned part identifier" msgstr "" -#: dcim/models/device_component_templates.py:759 +#: dcim/models/device_component_templates.py:761 msgid "inventory item template" msgstr "" -#: dcim/models/device_component_templates.py:760 +#: dcim/models/device_component_templates.py:762 msgid "inventory item templates" msgstr "" -#: dcim/models/device_components.py:107 +#: dcim/models/device_components.py:106 msgid "Components cannot be moved to a different device." msgstr "" -#: dcim/models/device_components.py:146 +#: dcim/models/device_components.py:145 msgid "cable end" msgstr "" -#: dcim/models/device_components.py:152 +#: dcim/models/device_components.py:151 msgid "mark connected" msgstr "" -#: dcim/models/device_components.py:154 +#: dcim/models/device_components.py:153 msgid "Treat as if a cable is connected" msgstr "" -#: dcim/models/device_components.py:172 +#: dcim/models/device_components.py:171 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "" -#: dcim/models/device_components.py:176 +#: dcim/models/device_components.py:175 msgid "Cable end must not be set without a cable." msgstr "" -#: dcim/models/device_components.py:180 +#: dcim/models/device_components.py:179 msgid "Cannot mark as connected with a cable attached." msgstr "" -#: dcim/models/device_components.py:204 +#: dcim/models/device_components.py:203 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "" -#: dcim/models/device_components.py:289 dcim/models/device_components.py:318 -#: dcim/models/device_components.py:351 dcim/models/device_components.py:469 +#: dcim/models/device_components.py:288 dcim/models/device_components.py:317 +#: dcim/models/device_components.py:350 dcim/models/device_components.py:468 msgid "Physical port type" msgstr "" -#: dcim/models/device_components.py:292 dcim/models/device_components.py:321 +#: dcim/models/device_components.py:291 dcim/models/device_components.py:320 msgid "speed" msgstr "" -#: dcim/models/device_components.py:296 dcim/models/device_components.py:325 +#: dcim/models/device_components.py:295 dcim/models/device_components.py:324 msgid "Port speed in bits per second" msgstr "" -#: dcim/models/device_components.py:302 +#: dcim/models/device_components.py:301 msgid "console port" msgstr "" -#: dcim/models/device_components.py:303 +#: dcim/models/device_components.py:302 msgid "console ports" msgstr "" -#: dcim/models/device_components.py:331 +#: dcim/models/device_components.py:330 msgid "console server port" msgstr "" -#: dcim/models/device_components.py:332 +#: dcim/models/device_components.py:331 msgid "console server ports" msgstr "" -#: dcim/models/device_components.py:371 +#: dcim/models/device_components.py:370 msgid "power port" msgstr "" -#: dcim/models/device_components.py:372 +#: dcim/models/device_components.py:371 msgid "power ports" msgstr "" -#: dcim/models/device_components.py:489 +#: dcim/models/device_components.py:488 msgid "power outlet" msgstr "" -#: dcim/models/device_components.py:490 +#: dcim/models/device_components.py:489 msgid "power outlets" msgstr "" -#: dcim/models/device_components.py:501 +#: dcim/models/device_components.py:500 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" -#: dcim/models/device_components.py:532 +#: dcim/models/device_components.py:531 vpn/models/crypto.py:81 +#: vpn/models/crypto.py:214 msgid "mode" msgstr "" -#: dcim/models/device_components.py:536 +#: dcim/models/device_components.py:535 msgid "IEEE 802.1Q tagging strategy" msgstr "" -#: dcim/models/device_components.py:544 +#: dcim/models/device_components.py:543 msgid "parent interface" msgstr "" -#: dcim/models/device_components.py:600 +#: dcim/models/device_components.py:603 msgid "parent LAG" msgstr "" -#: dcim/models/device_components.py:610 +#: dcim/models/device_components.py:613 msgid "This interface is used only for out-of-band management" msgstr "" -#: dcim/models/device_components.py:615 +#: dcim/models/device_components.py:618 msgid "speed (Kbps)" msgstr "" -#: dcim/models/device_components.py:618 +#: dcim/models/device_components.py:621 msgid "duplex" msgstr "" -#: dcim/models/device_components.py:628 +#: dcim/models/device_components.py:631 msgid "64-bit World Wide Name" msgstr "" -#: dcim/models/device_components.py:640 +#: dcim/models/device_components.py:643 msgid "wireless channel" msgstr "" -#: dcim/models/device_components.py:647 +#: dcim/models/device_components.py:650 msgid "channel frequency (MHz)" msgstr "" -#: dcim/models/device_components.py:648 dcim/models/device_components.py:656 +#: dcim/models/device_components.py:651 dcim/models/device_components.py:659 msgid "Populated by selected channel (if set)" msgstr "" -#: dcim/models/device_components.py:662 +#: dcim/models/device_components.py:665 msgid "transmit power (dBm)" msgstr "" -#: dcim/models/device_components.py:687 wireless/models.py:116 +#: dcim/models/device_components.py:690 wireless/models.py:116 msgid "wireless LANs" msgstr "" -#: dcim/models/device_components.py:695 -#: virtualization/models/virtualmachines.py:266 +#: dcim/models/device_components.py:698 +#: virtualization/models/virtualmachines.py:328 msgid "untagged VLAN" msgstr "" -#: dcim/models/device_components.py:701 -#: virtualization/models/virtualmachines.py:272 +#: dcim/models/device_components.py:704 +#: virtualization/models/virtualmachines.py:334 msgid "tagged VLANs" msgstr "" -#: dcim/models/device_components.py:737 -#: virtualization/models/virtualmachines.py:309 +#: dcim/models/device_components.py:746 +#: virtualization/models/virtualmachines.py:370 msgid "interface" msgstr "" -#: dcim/models/device_components.py:738 -#: virtualization/models/virtualmachines.py:310 +#: dcim/models/device_components.py:747 +#: virtualization/models/virtualmachines.py:371 msgid "interfaces" msgstr "" -#: dcim/models/device_components.py:749 +#: dcim/models/device_components.py:758 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "" -#: dcim/models/device_components.py:757 +#: dcim/models/device_components.py:766 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "" -#: dcim/models/device_components.py:766 -#: virtualization/models/virtualmachines.py:325 +#: dcim/models/device_components.py:775 +#: virtualization/models/virtualmachines.py:383 msgid "An interface cannot be its own parent." msgstr "" -#: dcim/models/device_components.py:770 +#: dcim/models/device_components.py:779 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "" -#: dcim/models/device_components.py:777 +#: dcim/models/device_components.py:786 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " "({device})" msgstr "" -#: dcim/models/device_components.py:783 +#: dcim/models/device_components.py:792 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " "not part of virtual chassis {virtual_chassis}." msgstr "" -#: dcim/models/device_components.py:803 +#: dcim/models/device_components.py:812 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " "({device})." msgstr "" -#: dcim/models/device_components.py:809 +#: dcim/models/device_components.py:818 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " "not part of virtual chassis {virtual_chassis}." msgstr "" -#: dcim/models/device_components.py:820 +#: dcim/models/device_components.py:829 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "" -#: dcim/models/device_components.py:824 +#: dcim/models/device_components.py:833 msgid "A LAG interface cannot be its own parent." msgstr "" -#: dcim/models/device_components.py:831 +#: dcim/models/device_components.py:840 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." msgstr "" -#: dcim/models/device_components.py:837 +#: dcim/models/device_components.py:846 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of " "virtual chassis {virtual_chassis}." msgstr "" -#: dcim/models/device_components.py:848 +#: dcim/models/device_components.py:857 msgid "Virtual interfaces cannot have a PoE mode." msgstr "" -#: dcim/models/device_components.py:852 +#: dcim/models/device_components.py:861 msgid "Virtual interfaces cannot have a PoE type." msgstr "" -#: dcim/models/device_components.py:858 +#: dcim/models/device_components.py:867 msgid "Must specify PoE mode when designating a PoE type." msgstr "" -#: dcim/models/device_components.py:865 +#: dcim/models/device_components.py:874 msgid "Wireless role may be set only on wireless interfaces." msgstr "" -#: dcim/models/device_components.py:867 +#: dcim/models/device_components.py:876 msgid "Channel may be set only on wireless interfaces." msgstr "" -#: dcim/models/device_components.py:873 +#: dcim/models/device_components.py:882 msgid "Channel frequency may be set only on wireless interfaces." msgstr "" -#: dcim/models/device_components.py:877 +#: dcim/models/device_components.py:886 msgid "Cannot specify custom frequency with channel selected." msgstr "" -#: dcim/models/device_components.py:883 +#: dcim/models/device_components.py:892 msgid "Channel width may be set only on wireless interfaces." msgstr "" -#: dcim/models/device_components.py:885 +#: dcim/models/device_components.py:894 msgid "Cannot specify custom width with channel selected." msgstr "" -#: dcim/models/device_components.py:893 +#: dcim/models/device_components.py:902 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " "interface's parent device, or it must be global." msgstr "" -#: dcim/models/device_components.py:982 +#: dcim/models/device_components.py:991 msgid "Mapped position on corresponding rear port" msgstr "" -#: dcim/models/device_components.py:998 +#: dcim/models/device_components.py:1007 msgid "front port" msgstr "" -#: dcim/models/device_components.py:999 +#: dcim/models/device_components.py:1008 msgid "front ports" msgstr "" -#: dcim/models/device_components.py:1013 +#: dcim/models/device_components.py:1022 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "" -#: dcim/models/device_components.py:1021 +#: dcim/models/device_components.py:1030 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only " "{positions} positions." msgstr "" -#: dcim/models/device_components.py:1051 +#: dcim/models/device_components.py:1060 msgid "Number of front ports which may be mapped" msgstr "" -#: dcim/models/device_components.py:1056 +#: dcim/models/device_components.py:1065 msgid "rear port" msgstr "" -#: dcim/models/device_components.py:1057 +#: dcim/models/device_components.py:1066 msgid "rear ports" msgstr "" -#: dcim/models/device_components.py:1071 +#: dcim/models/device_components.py:1080 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports " "({frontport_count})" msgstr "" -#: dcim/models/device_components.py:1095 +#: dcim/models/device_components.py:1104 msgid "module bay" msgstr "" -#: dcim/models/device_components.py:1096 +#: dcim/models/device_components.py:1105 msgid "module bays" msgstr "" -#: dcim/models/device_components.py:1109 +#: dcim/models/device_components.py:1118 msgid "parent_bay" msgstr "" -#: dcim/models/device_components.py:1117 +#: dcim/models/device_components.py:1126 msgid "device bay" msgstr "" -#: dcim/models/device_components.py:1118 +#: dcim/models/device_components.py:1127 msgid "device bays" msgstr "" -#: dcim/models/device_components.py:1128 +#: dcim/models/device_components.py:1137 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "" -#: dcim/models/device_components.py:1134 +#: dcim/models/device_components.py:1143 msgid "Cannot install a device into itself." msgstr "" -#: dcim/models/device_components.py:1142 +#: dcim/models/device_components.py:1151 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." msgstr "" -#: dcim/models/device_components.py:1163 +#: dcim/models/device_components.py:1172 msgid "inventory item role" msgstr "" -#: dcim/models/device_components.py:1164 +#: dcim/models/device_components.py:1173 msgid "inventory item roles" msgstr "" -#: dcim/models/device_components.py:1221 dcim/models/devices.py:595 -#: dcim/models/devices.py:1168 dcim/models/racks.py:113 +#: dcim/models/device_components.py:1230 dcim/models/devices.py:595 +#: dcim/models/devices.py:1173 dcim/models/racks.py:113 msgid "serial number" msgstr "" -#: dcim/models/device_components.py:1229 dcim/models/devices.py:603 -#: dcim/models/devices.py:1175 dcim/models/racks.py:120 +#: dcim/models/device_components.py:1238 dcim/models/devices.py:603 +#: dcim/models/devices.py:1180 dcim/models/racks.py:120 msgid "asset tag" msgstr "" -#: dcim/models/device_components.py:1230 +#: dcim/models/device_components.py:1239 msgid "A unique tag used to identify this item" msgstr "" -#: dcim/models/device_components.py:1233 +#: dcim/models/device_components.py:1242 msgid "discovered" msgstr "" -#: dcim/models/device_components.py:1235 +#: dcim/models/device_components.py:1244 msgid "This item was automatically discovered" msgstr "" -#: dcim/models/device_components.py:1250 +#: dcim/models/device_components.py:1262 msgid "inventory item" msgstr "" -#: dcim/models/device_components.py:1251 +#: dcim/models/device_components.py:1263 msgid "inventory items" msgstr "" -#: dcim/models/device_components.py:1262 +#: dcim/models/device_components.py:1274 msgid "Cannot assign self as parent." msgstr "" -#: dcim/models/device_components.py:1270 +#: dcim/models/device_components.py:1282 msgid "Parent inventory item does not belong to the same device." msgstr "" -#: dcim/models/device_components.py:1276 +#: dcim/models/device_components.py:1288 msgid "Cannot move an inventory item with dependent children" msgstr "" -#: dcim/models/device_components.py:1284 +#: dcim/models/device_components.py:1296 msgid "Cannot assign inventory item to component on another device" msgstr "" @@ -4319,7 +4484,7 @@ msgid "exclude from utilization" msgstr "" #: dcim/models/devices.py:112 -msgid "Exclude from rack utilization calculations." +msgid "Devices of this type are excluded when calculating rack utilization." msgstr "" #: dcim/models/devices.py:116 @@ -4327,7 +4492,7 @@ msgid "is full depth" msgstr "" #: dcim/models/devices.py:117 -msgid "Device consumes both front and rear rack faces" +msgid "Device consumes both front and rear rack faces." msgstr "" #: dcim/models/devices.py:123 @@ -4420,7 +4585,7 @@ msgstr "" msgid "Chassis serial number, assigned by the manufacturer" msgstr "" -#: dcim/models/devices.py:604 dcim/models/devices.py:1176 +#: dcim/models/devices.py:604 dcim/models/devices.py:1181 msgid "A unique tag used to identify this device" msgstr "" @@ -4432,13 +4597,13 @@ msgstr "" msgid "rack face" msgstr "" -#: dcim/models/devices.py:658 dcim/models/devices.py:1385 -#: virtualization/models/virtualmachines.py:97 +#: dcim/models/devices.py:658 dcim/models/devices.py:1390 +#: virtualization/models/virtualmachines.py:98 msgid "primary IPv4" msgstr "" -#: dcim/models/devices.py:666 dcim/models/devices.py:1393 -#: virtualization/models/virtualmachines.py:105 +#: dcim/models/devices.py:666 dcim/models/devices.py:1398 +#: virtualization/models/virtualmachines.py:106 msgid "primary IPv6" msgstr "" @@ -4573,74 +4738,74 @@ msgstr "" msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" -#: dcim/models/devices.py:1183 +#: dcim/models/devices.py:1188 msgid "module" msgstr "" -#: dcim/models/devices.py:1184 +#: dcim/models/devices.py:1189 msgid "modules" msgstr "" -#: dcim/models/devices.py:1200 +#: dcim/models/devices.py:1205 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " "device ({device})." msgstr "" -#: dcim/models/devices.py:1304 +#: dcim/models/devices.py:1309 msgid "domain" msgstr "" -#: dcim/models/devices.py:1317 dcim/models/devices.py:1318 +#: dcim/models/devices.py:1322 dcim/models/devices.py:1323 msgid "virtual chassis" msgstr "" -#: dcim/models/devices.py:1333 +#: dcim/models/devices.py:1338 #, python-brace-format msgid "The selected master ({master}) is not assigned to this virtual chassis." msgstr "" -#: dcim/models/devices.py:1349 +#: dcim/models/devices.py:1354 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " "form a cross-chassis LAG interfaces." msgstr "" -#: dcim/models/devices.py:1374 ipam/models/l2vpn.py:37 +#: dcim/models/devices.py:1379 vpn/models/l2vpn.py:37 msgid "identifier" msgstr "" -#: dcim/models/devices.py:1375 +#: dcim/models/devices.py:1380 msgid "Numeric identifier unique to the parent device" msgstr "" -#: dcim/models/devices.py:1403 extras/models/models.py:629 -#: netbox/models/__init__.py:114 +#: dcim/models/devices.py:1408 extras/models/models.py:129 +#: extras/models/models.py:724 netbox/models/__init__.py:114 msgid "comments" msgstr "" -#: dcim/models/devices.py:1419 +#: dcim/models/devices.py:1424 msgid "virtual device context" msgstr "" -#: dcim/models/devices.py:1420 +#: dcim/models/devices.py:1425 msgid "virtual device contexts" msgstr "" -#: dcim/models/devices.py:1452 +#: dcim/models/devices.py:1457 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "" -#: dcim/models/devices.py:1458 +#: dcim/models/devices.py:1463 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" #: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:260 extras/models/models.py:469 -#: extras/models/search.py:48 ipam/models/ip.py:193 +#: extras/models/models.py:343 extras/models/models.py:552 +#: extras/models/search.py:50 ipam/models/ip.py:193 msgid "weight" msgstr "" @@ -4705,8 +4870,8 @@ msgstr "" #: dcim/models/power.py:178 #, python-brace-format msgid "" -"Rack {rack} ({site}) and power panel {powerpanel} ({powerpanel_site}) are in " -"different sites" +"Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " +"are in different sites." msgstr "" #: dcim/models/power.py:189 @@ -4729,9 +4894,9 @@ msgstr "" msgid "Locally-assigned identifier" msgstr "" -#: dcim/models/racks.py:108 ipam/forms/bulk_import.py:203 -#: ipam/forms/bulk_import.py:268 ipam/forms/bulk_import.py:303 -#: ipam/forms/bulk_import.py:470 virtualization/forms/bulk_import.py:111 +#: dcim/models/racks.py:108 ipam/forms/bulk_import.py:200 +#: ipam/forms/bulk_import.py:265 ipam/forms/bulk_import.py:300 +#: ipam/forms/bulk_import.py:467 virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "" @@ -4755,114 +4920,114 @@ msgstr "" msgid "starting unit" msgstr "" -#: dcim/models/racks.py:144 +#: dcim/models/racks.py:145 msgid "Starting unit for rack" msgstr "" -#: dcim/models/racks.py:148 +#: dcim/models/racks.py:149 msgid "descending units" msgstr "" -#: dcim/models/racks.py:149 +#: dcim/models/racks.py:150 msgid "Units are numbered top-to-bottom" msgstr "" -#: dcim/models/racks.py:152 +#: dcim/models/racks.py:153 msgid "outer width" msgstr "" -#: dcim/models/racks.py:155 +#: dcim/models/racks.py:156 msgid "Outer dimension of rack (width)" msgstr "" -#: dcim/models/racks.py:158 +#: dcim/models/racks.py:159 msgid "outer depth" msgstr "" -#: dcim/models/racks.py:161 +#: dcim/models/racks.py:162 msgid "Outer dimension of rack (depth)" msgstr "" -#: dcim/models/racks.py:164 +#: dcim/models/racks.py:165 msgid "outer unit" msgstr "" -#: dcim/models/racks.py:170 +#: dcim/models/racks.py:171 msgid "max weight" msgstr "" -#: dcim/models/racks.py:173 +#: dcim/models/racks.py:174 msgid "Maximum load capacity for the rack" msgstr "" -#: dcim/models/racks.py:181 +#: dcim/models/racks.py:182 msgid "mounting depth" msgstr "" -#: dcim/models/racks.py:185 +#: dcim/models/racks.py:186 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this " "is the distance between the front and rear rails." msgstr "" -#: dcim/models/racks.py:219 +#: dcim/models/racks.py:220 msgid "rack" msgstr "" -#: dcim/models/racks.py:220 +#: dcim/models/racks.py:221 msgid "racks" msgstr "" -#: dcim/models/racks.py:235 +#: dcim/models/racks.py:236 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "" -#: dcim/models/racks.py:239 +#: dcim/models/racks.py:240 msgid "Must specify a unit when setting an outer width/depth" msgstr "" -#: dcim/models/racks.py:243 +#: dcim/models/racks.py:244 msgid "Must specify a unit when setting a maximum weight" msgstr "" -#: dcim/models/racks.py:253 +#: dcim/models/racks.py:254 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " "devices." msgstr "" -#: dcim/models/racks.py:260 +#: dcim/models/racks.py:261 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " "installed devices." msgstr "" -#: dcim/models/racks.py:268 +#: dcim/models/racks.py:269 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "" -#: dcim/models/racks.py:521 +#: dcim/models/racks.py:522 msgid "units" msgstr "" -#: dcim/models/racks.py:547 +#: dcim/models/racks.py:548 msgid "rack reservation" msgstr "" -#: dcim/models/racks.py:548 +#: dcim/models/racks.py:549 msgid "rack reservations" msgstr "" -#: dcim/models/racks.py:565 +#: dcim/models/racks.py:566 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "" -#: dcim/models/racks.py:578 +#: dcim/models/racks.py:579 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "" @@ -5008,7 +5173,7 @@ msgstr "" msgid "Reachable" msgstr "" -#: dcim/tables/connections.py:46 dcim/tables/devices.py:518 +#: dcim/tables/connections.py:46 dcim/tables/devices.py:524 #: templates/dcim/inventoryitem_edit.html:64 templates/dcim/poweroutlet.html:47 #: templates/dcim/powerport.html:18 msgid "Power Port" @@ -5017,7 +5182,7 @@ msgstr "" #: dcim/tables/devices.py:94 dcim/tables/devices.py:139 dcim/tables/racks.py:81 #: dcim/tables/sites.py:143 netbox/navigation/menu.py:57 #: netbox/navigation/menu.py:61 netbox/navigation/menu.py:63 -#: virtualization/forms/model_forms.py:124 virtualization/tables/clusters.py:83 +#: virtualization/forms/model_forms.py:125 virtualization/tables/clusters.py:83 #: virtualization/views.py:211 msgid "Devices" msgstr "" @@ -5028,7 +5193,7 @@ msgid "VMs" msgstr "" #: dcim/tables/devices.py:133 dcim/tables/devices.py:245 -#: extras/forms/model_forms.py:403 templates/dcim/device.html:131 +#: extras/forms/model_forms.py:506 templates/dcim/device.html:114 #: templates/dcim/device/render_config.html:11 #: templates/dcim/device/render_config.html:15 #: templates/dcim/devicerole.html:47 templates/dcim/platform.html:44 @@ -5036,25 +5201,25 @@ msgstr "" #: templates/virtualization/virtualmachine.html:47 #: templates/virtualization/virtualmachine/render_config.html:11 #: templates/virtualization/virtualmachine/render_config.html:15 -#: virtualization/tables/virtualmachines.py:88 +#: virtualization/tables/virtualmachines.py:93 msgid "Config Template" msgstr "" -#: dcim/tables/devices.py:216 dcim/tables/devices.py:1048 -#: ipam/forms/model_forms.py:298 ipam/tables/ip.py:352 ipam/tables/ip.py:418 -#: ipam/tables/ip.py:441 templates/ipam/ipaddress.html:12 -#: templates/ipam/ipaddress_edit.html:14 -#: virtualization/tables/virtualmachines.py:79 +#: dcim/tables/devices.py:216 dcim/tables/devices.py:1069 +#: ipam/forms/bulk_import.py:511 ipam/forms/model_forms.py:296 +#: ipam/tables/ip.py:352 ipam/tables/ip.py:418 ipam/tables/ip.py:441 +#: templates/ipam/ipaddress.html:12 templates/ipam/ipaddress_edit.html:14 +#: virtualization/tables/virtualmachines.py:81 msgid "IP Address" msgstr "" -#: dcim/tables/devices.py:220 dcim/tables/devices.py:1052 -#: virtualization/tables/virtualmachines.py:70 +#: dcim/tables/devices.py:220 dcim/tables/devices.py:1073 +#: virtualization/tables/virtualmachines.py:72 msgid "IPv4 Address" msgstr "" -#: dcim/tables/devices.py:224 dcim/tables/devices.py:1056 -#: virtualization/tables/virtualmachines.py:74 +#: dcim/tables/devices.py:224 dcim/tables/devices.py:1077 +#: virtualization/tables/virtualmachines.py:76 msgid "IPv6 Address" msgstr "" @@ -5091,16 +5256,17 @@ msgstr "" msgid "Power outlets" msgstr "" -#: dcim/tables/devices.py:275 dcim/tables/devices.py:1061 +#: dcim/tables/devices.py:275 dcim/tables/devices.py:1082 #: dcim/tables/devicetypes.py:125 dcim/views.py:1002 dcim/views.py:1241 #: dcim/views.py:1927 netbox/navigation/menu.py:82 -#: netbox/navigation/menu.py:220 templates/dcim/device/base.html:37 +#: netbox/navigation/menu.py:238 templates/dcim/device/base.html:37 #: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 #: templates/dcim/module.html:34 templates/dcim/moduletype/base.html:34 #: templates/dcim/virtualdevicecontext.html:64 #: templates/dcim/virtualdevicecontext.html:85 +#: templates/virtualization/virtualmachine/base.html:27 #: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:85 virtualization/views.py:368 +#: virtualization/tables/virtualmachines.py:87 virtualization/views.py:368 #: wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "" @@ -5138,63 +5304,90 @@ msgstr "" msgid "Mark Connected" msgstr "" -#: dcim/tables/devices.py:567 ipam/forms/model_forms.py:709 -#: ipam/tables/fhrp.py:28 ipam/views.py:599 ipam/views.py:673 +#: dcim/tables/devices.py:470 +msgid "Maximum draw (W)" +msgstr "" + +#: dcim/tables/devices.py:473 +msgid "Allocated draw (W)" +msgstr "" + +#: dcim/tables/devices.py:573 ipam/forms/model_forms.py:707 +#: ipam/tables/fhrp.py:28 ipam/views.py:597 ipam/views.py:671 #: netbox/navigation/menu.py:146 netbox/navigation/menu.py:148 -#: templates/dcim/interface.html:347 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:43 templates/virtualization/vminterface.html:84 +#: templates/dcim/interface.html:351 templates/ipam/ipaddress_bulk_add.html:15 +#: templates/ipam/service.html:43 templates/virtualization/vminterface.html:88 +#: vpn/tables/tunnels.py:94 msgid "IP Addresses" msgstr "" -#: dcim/tables/devices.py:573 netbox/navigation/menu.py:190 +#: dcim/tables/devices.py:579 netbox/navigation/menu.py:190 #: templates/ipam/inc/panels/fhrp_groups.html:5 msgid "FHRP Groups" msgstr "" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:224 +#: dcim/tables/devices.py:591 templates/dcim/interface.html:90 +#: templates/virtualization/vminterface.html:70 templates/vpn/tunnel.html:18 +#: templates/vpn/tunneltermination.html:14 vpn/forms/bulk_edit.py:75 +#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:41 +#: vpn/forms/filtersets.py:81 vpn/forms/model_forms.py:59 +#: vpn/forms/model_forms.py:144 vpn/tables/tunnels.py:74 +msgid "Tunnel" +msgstr "" + +#: dcim/tables/devices.py:616 dcim/tables/devicetypes.py:224 #: templates/dcim/interface.html:66 msgid "Management Only" msgstr "" -#: dcim/tables/devices.py:612 +#: dcim/tables/devices.py:624 msgid "Wireless link" msgstr "" -#: dcim/tables/devices.py:622 +#: dcim/tables/devices.py:634 msgid "VDCs" msgstr "" -#: dcim/tables/devices.py:706 +#: dcim/tables/devices.py:642 dcim/tables/devicetypes.py:48 +#: dcim/tables/devicetypes.py:140 dcim/views.py:1077 dcim/views.py:2020 +#: netbox/navigation/menu.py:91 templates/dcim/device/base.html:52 +#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 +#: templates/dcim/inc/panels/inventory_items.html:5 +#: templates/dcim/inventoryitemrole.html:33 +msgid "Inventory Items" +msgstr "" + +#: dcim/tables/devices.py:723 #: templates/circuits/inc/circuit_termination.html:80 #: templates/dcim/consoleport.html:81 templates/dcim/consoleserverport.html:81 #: templates/dcim/frontport.html:53 templates/dcim/frontport.html:125 -#: templates/dcim/interface.html:192 templates/dcim/inventoryitem_edit.html:69 +#: templates/dcim/interface.html:196 templates/dcim/inventoryitem_edit.html:69 #: templates/dcim/rearport.html:18 templates/dcim/rearport.html:115 msgid "Rear Port" msgstr "" -#: dcim/tables/devices.py:871 templates/dcim/modulebay.html:51 +#: dcim/tables/devices.py:888 templates/dcim/modulebay.html:51 msgid "Installed Module" msgstr "" -#: dcim/tables/devices.py:874 +#: dcim/tables/devices.py:891 msgid "Module Serial" msgstr "" -#: dcim/tables/devices.py:878 +#: dcim/tables/devices.py:895 msgid "Module Asset Tag" msgstr "" -#: dcim/tables/devices.py:887 +#: dcim/tables/devices.py:904 msgid "Module Status" msgstr "" -#: dcim/tables/devices.py:929 dcim/tables/devicetypes.py:308 +#: dcim/tables/devices.py:946 dcim/tables/devicetypes.py:308 #: templates/dcim/inventoryitem.html:41 msgid "Component" msgstr "" -#: dcim/tables/devices.py:980 +#: dcim/tables/devices.py:1001 msgid "Items" msgstr "" @@ -5207,17 +5400,8 @@ msgstr "" msgid "Module Types" msgstr "" -#: dcim/tables/devicetypes.py:48 dcim/tables/devicetypes.py:140 -#: dcim/views.py:1077 dcim/views.py:2020 netbox/navigation/menu.py:91 -#: templates/dcim/device/base.html:52 templates/dcim/device_list.html:71 -#: templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:5 -#: templates/dcim/inventoryitemrole.html:33 -msgid "Inventory Items" -msgstr "" - -#: dcim/tables/devicetypes.py:53 extras/forms/filtersets.py:354 -#: extras/forms/model_forms.py:311 netbox/navigation/menu.py:66 +#: dcim/tables/devicetypes.py:53 extras/forms/filtersets.py:379 +#: extras/forms/model_forms.py:414 netbox/navigation/menu.py:66 msgid "Platforms" msgstr "" @@ -5296,8 +5480,8 @@ msgstr "" msgid "Module Bays" msgstr "" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:263 -#: templates/dcim/powerpanel.html:53 templates/extras/configrevision.html:59 +#: dcim/tables/power.py:36 netbox/navigation/menu.py:282 +#: templates/core/configrevision.html:59 templates/dcim/powerpanel.html:53 msgid "Power Feeds" msgstr "" @@ -5314,8 +5498,8 @@ msgstr "" msgid "Racks" msgstr "" -#: dcim/tables/racks.py:73 templates/dcim/device.html:340 -#: templates/dcim/rack.html:102 +#: dcim/tables/racks.py:73 templates/dcim/device.html:323 +#: templates/dcim/rack.html:95 msgid "Height" msgstr "" @@ -5323,11 +5507,11 @@ msgstr "" msgid "Space" msgstr "" -#: dcim/tables/racks.py:96 templates/dcim/rack.html:112 +#: dcim/tables/racks.py:96 templates/dcim/rack.html:105 msgid "Outer Width" msgstr "" -#: dcim/tables/racks.py:100 templates/dcim/rack.html:122 +#: dcim/tables/racks.py:100 templates/dcim/rack.html:115 msgid "Outer Depth" msgstr "" @@ -5336,9 +5520,9 @@ msgid "Max Weight" msgstr "" #: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:334 extras/forms/model_forms.py:291 -#: ipam/forms/bulk_edit.py:130 ipam/forms/model_forms.py:154 -#: ipam/tables/asn.py:65 netbox/navigation/menu.py:16 +#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:394 +#: ipam/forms/bulk_edit.py:128 ipam/forms/model_forms.py:152 +#: ipam/tables/asn.py:66 netbox/navigation/menu.py:16 #: netbox/navigation/menu.py:18 msgid "Sites" msgstr "" @@ -5356,16 +5540,20 @@ msgstr "" msgid "Non-Racked Devices" msgstr "" -#: dcim/views.py:2033 extras/forms/model_forms.py:351 +#: dcim/views.py:2033 extras/forms/model_forms.py:454 #: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:226 virtualization/views.py:386 +#: virtualization/forms/model_forms.py:228 virtualization/views.py:408 msgid "Config Context" msgstr "" -#: dcim/views.py:2043 virtualization/views.py:396 +#: dcim/views.py:2043 virtualization/views.py:418 msgid "Render Config" msgstr "" +#: dcim/views.py:2971 ipam/tables/ip.py:233 +msgid "Children" +msgstr "" + #: extras/choices.py:27 extras/forms/misc.py:14 msgid "Text" msgstr "" @@ -5410,7 +5598,7 @@ msgstr "" msgid "Multiple objects" msgstr "" -#: extras/choices.py:50 templates/extras/customfield.html:69 +#: extras/choices.py:50 templates/extras/customfield.html:69 vpn/choices.py:20 #: wireless/choices.py:27 msgid "Disabled" msgstr "" @@ -5423,735 +5611,744 @@ msgstr "" msgid "Exact" msgstr "" +#: extras/choices.py:63 +msgid "Always" +msgstr "" + #: extras/choices.py:64 -msgid "Read/write" +msgid "If set" msgstr "" -#: extras/choices.py:65 -msgid "Read-only" -msgstr "" - -#: extras/choices.py:66 +#: extras/choices.py:65 extras/choices.py:78 msgid "Hidden" msgstr "" -#: extras/choices.py:67 -msgid "Hidden (if unset)" +#: extras/choices.py:76 +msgid "Yes" msgstr "" -#: extras/choices.py:94 templates/tenancy/contact.html:58 +#: extras/choices.py:77 +msgid "No" +msgstr "" + +#: extras/choices.py:105 templates/tenancy/contact.html:58 #: tenancy/forms/bulk_edit.py:117 wireless/forms/model_forms.py:159 msgid "Link" msgstr "" -#: extras/choices.py:108 +#: extras/choices.py:119 msgid "Newest" msgstr "" -#: extras/choices.py:109 +#: extras/choices.py:120 msgid "Oldest" msgstr "" -#: extras/choices.py:125 templates/generic/object.html:51 +#: extras/choices.py:136 templates/generic/object.html:51 msgid "Updated" msgstr "" -#: extras/choices.py:126 +#: extras/choices.py:137 msgid "Deleted" msgstr "" -#: extras/choices.py:143 extras/choices.py:165 +#: extras/choices.py:154 extras/choices.py:176 msgid "Info" msgstr "" -#: extras/choices.py:144 extras/choices.py:164 +#: extras/choices.py:155 extras/choices.py:175 msgid "Success" msgstr "" -#: extras/choices.py:145 extras/choices.py:166 +#: extras/choices.py:156 extras/choices.py:177 msgid "Warning" msgstr "" -#: extras/choices.py:146 +#: extras/choices.py:157 msgid "Danger" msgstr "" -#: extras/choices.py:163 utilities/choices.py:190 +#: extras/choices.py:174 utilities/choices.py:190 msgid "Default" msgstr "" -#: extras/choices.py:167 +#: extras/choices.py:178 msgid "Failure" msgstr "" -#: extras/choices.py:174 +#: extras/choices.py:185 msgid "Hourly" msgstr "" -#: extras/choices.py:175 +#: extras/choices.py:186 msgid "12 hours" msgstr "" -#: extras/choices.py:176 +#: extras/choices.py:187 msgid "Daily" msgstr "" -#: extras/choices.py:177 +#: extras/choices.py:188 msgid "Weekly" msgstr "" -#: extras/choices.py:178 +#: extras/choices.py:189 msgid "30 days" msgstr "" -#: extras/choices.py:243 extras/tables/tables.py:283 -#: templates/dcim/virtualchassis_edit.html:108 templates/extras/webhook.html:33 +#: extras/choices.py:254 extras/tables/tables.py:287 +#: templates/dcim/virtualchassis_edit.html:108 +#: templates/extras/eventrule.html:51 #: templates/generic/bulk_add_component.html:56 #: templates/generic/object_edit.html:29 templates/generic/object_edit.html:70 #: templates/ipam/inc/ipaddress_edit_header.html:10 msgid "Create" msgstr "" -#: extras/choices.py:244 extras/tables/tables.py:286 -#: templates/extras/webhook.html:37 +#: extras/choices.py:255 extras/tables/tables.py:290 +#: templates/extras/eventrule.html:55 msgid "Update" msgstr "" -#: extras/choices.py:245 extras/tables/tables.py:289 +#: extras/choices.py:256 extras/tables/tables.py:293 #: templates/circuits/inc/circuit_termination.html:22 #: templates/dcim/devicetype/component_templates.html:24 #: templates/dcim/inc/panels/inventory_items.html:29 #: templates/dcim/moduletype/component_templates.html:24 -#: templates/dcim/powerpanel.html:71 templates/extras/report_list.html:34 -#: templates/extras/script_list.html:33 templates/extras/webhook.html:41 +#: templates/dcim/powerpanel.html:71 templates/extras/eventrule.html:59 +#: templates/extras/report_list.html:34 templates/extras/script_list.html:33 #: templates/generic/bulk_delete.html:18 templates/generic/bulk_delete.html:45 -#: templates/generic/object_delete.html:15 templates/htmx/delete_form.html:23 +#: templates/generic/object_delete.html:15 templates/htmx/delete_form.html:57 #: templates/ipam/inc/panels/fhrp_groups.html:35 #: templates/users/objectpermission.html:49 #: utilities/templates/buttons/delete.html:9 msgid "Delete" msgstr "" -#: extras/choices.py:269 utilities/choices.py:143 utilities/choices.py:191 +#: extras/choices.py:280 utilities/choices.py:143 utilities/choices.py:191 msgid "Blue" msgstr "" -#: extras/choices.py:270 utilities/choices.py:142 utilities/choices.py:192 +#: extras/choices.py:281 utilities/choices.py:142 utilities/choices.py:192 msgid "Indigo" msgstr "" -#: extras/choices.py:271 utilities/choices.py:140 utilities/choices.py:193 +#: extras/choices.py:282 utilities/choices.py:140 utilities/choices.py:193 msgid "Purple" msgstr "" -#: extras/choices.py:272 utilities/choices.py:137 utilities/choices.py:194 +#: extras/choices.py:283 utilities/choices.py:137 utilities/choices.py:194 msgid "Pink" msgstr "" -#: extras/choices.py:273 utilities/choices.py:136 utilities/choices.py:195 +#: extras/choices.py:284 utilities/choices.py:136 utilities/choices.py:195 msgid "Red" msgstr "" -#: extras/choices.py:274 utilities/choices.py:154 utilities/choices.py:196 +#: extras/choices.py:285 utilities/choices.py:154 utilities/choices.py:196 msgid "Orange" msgstr "" -#: extras/choices.py:275 utilities/choices.py:152 utilities/choices.py:197 +#: extras/choices.py:286 utilities/choices.py:152 utilities/choices.py:197 msgid "Yellow" msgstr "" -#: extras/choices.py:276 utilities/choices.py:149 utilities/choices.py:198 +#: extras/choices.py:287 utilities/choices.py:149 utilities/choices.py:198 msgid "Green" msgstr "" -#: extras/choices.py:277 utilities/choices.py:146 utilities/choices.py:199 +#: extras/choices.py:288 utilities/choices.py:146 utilities/choices.py:199 msgid "Teal" msgstr "" -#: extras/choices.py:278 utilities/choices.py:145 utilities/choices.py:200 +#: extras/choices.py:289 utilities/choices.py:145 utilities/choices.py:200 msgid "Cyan" msgstr "" -#: extras/choices.py:279 utilities/choices.py:201 +#: extras/choices.py:290 utilities/choices.py:201 msgid "Gray" msgstr "" -#: extras/choices.py:280 utilities/choices.py:160 utilities/choices.py:202 +#: extras/choices.py:291 utilities/choices.py:160 utilities/choices.py:202 msgid "Black" msgstr "" -#: extras/choices.py:281 utilities/choices.py:161 utilities/choices.py:203 +#: extras/choices.py:292 utilities/choices.py:161 utilities/choices.py:203 msgid "White" msgstr "" +#: extras/choices.py:306 extras/forms/model_forms.py:233 +#: extras/forms/model_forms.py:321 templates/extras/webhook.html:11 +msgid "Webhook" +msgstr "" + +#: extras/choices.py:307 templates/extras/script/base.html:29 +msgid "Script" +msgstr "" + #: extras/dashboard/forms.py:38 msgid "Widget type" msgstr "" -#: extras/dashboard/widgets.py:146 +#: extras/dashboard/widgets.py:148 msgid "Note" msgstr "" -#: extras/dashboard/widgets.py:147 +#: extras/dashboard/widgets.py:149 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "" -#: extras/dashboard/widgets.py:160 +#: extras/dashboard/widgets.py:162 msgid "Object Counts" msgstr "" -#: extras/dashboard/widgets.py:161 +#: extras/dashboard/widgets.py:163 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." msgstr "" -#: extras/dashboard/widgets.py:171 +#: extras/dashboard/widgets.py:173 msgid "Filters to apply when counting the number of objects" msgstr "" -#: extras/dashboard/widgets.py:207 +#: extras/dashboard/widgets.py:209 msgid "Object List" msgstr "" -#: extras/dashboard/widgets.py:208 +#: extras/dashboard/widgets.py:210 msgid "Display an arbitrary list of objects." msgstr "" -#: extras/dashboard/widgets.py:221 +#: extras/dashboard/widgets.py:223 msgid "The default number of objects to display" msgstr "" -#: extras/dashboard/widgets.py:268 +#: extras/dashboard/widgets.py:270 msgid "RSS Feed" msgstr "" -#: extras/dashboard/widgets.py:273 +#: extras/dashboard/widgets.py:275 msgid "Embed an RSS feed from an external website." msgstr "" -#: extras/dashboard/widgets.py:280 +#: extras/dashboard/widgets.py:282 msgid "Feed URL" msgstr "" -#: extras/dashboard/widgets.py:285 +#: extras/dashboard/widgets.py:287 msgid "The maximum number of objects to display" msgstr "" -#: extras/dashboard/widgets.py:290 +#: extras/dashboard/widgets.py:292 msgid "How long to stored the cached content (in seconds)" msgstr "" -#: extras/dashboard/widgets.py:342 templates/account/base.html:10 +#: extras/dashboard/widgets.py:344 templates/account/base.html:10 #: templates/account/bookmarks.html:7 templates/inc/profile_button.html:29 msgid "Bookmarks" msgstr "" -#: extras/dashboard/widgets.py:346 +#: extras/dashboard/widgets.py:348 msgid "Show your personal bookmarks" msgstr "" -#: extras/filtersets.py:176 extras/filtersets.py:511 extras/filtersets.py:539 +#: extras/filtersets.py:207 extras/filtersets.py:542 extras/filtersets.py:570 msgid "Data file (ID)" msgstr "" -#: extras/filtersets.py:448 virtualization/forms/filtersets.py:111 +#: extras/filtersets.py:479 virtualization/forms/filtersets.py:114 msgid "Cluster type" msgstr "" -#: extras/filtersets.py:454 virtualization/filtersets.py:93 -#: virtualization/filtersets.py:143 +#: extras/filtersets.py:485 virtualization/filtersets.py:95 +#: virtualization/filtersets.py:146 msgid "Cluster type (slug)" msgstr "" -#: extras/filtersets.py:459 ipam/forms/bulk_edit.py:477 -#: ipam/forms/model_forms.py:587 virtualization/forms/filtersets.py:105 +#: extras/filtersets.py:490 ipam/forms/bulk_edit.py:475 +#: ipam/forms/model_forms.py:585 virtualization/forms/filtersets.py:108 msgid "Cluster group" msgstr "" -#: extras/filtersets.py:465 virtualization/filtersets.py:132 +#: extras/filtersets.py:496 virtualization/filtersets.py:135 msgid "Cluster group (slug)" msgstr "" -#: extras/filtersets.py:475 tenancy/forms/forms.py:16 tenancy/forms/forms.py:39 +#: extras/filtersets.py:506 tenancy/forms/forms.py:16 tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "" -#: extras/filtersets.py:481 tenancy/filtersets.py:151 tenancy/filtersets.py:171 +#: extras/filtersets.py:512 tenancy/filtersets.py:163 tenancy/filtersets.py:183 msgid "Tenant group (slug)" msgstr "" -#: extras/filtersets.py:497 templates/extras/tag.html:12 +#: extras/filtersets.py:528 templates/extras/tag.html:12 msgid "Tag" msgstr "" -#: extras/filtersets.py:503 +#: extras/filtersets.py:534 msgid "Tag (slug)" msgstr "" -#: extras/filtersets.py:563 extras/forms/filtersets.py:413 +#: extras/filtersets.py:594 extras/forms/filtersets.py:438 msgid "Has local config context data" msgstr "" -#: extras/filtersets.py:588 +#: extras/filtersets.py:619 msgid "User name" msgstr "" -#: extras/forms/bulk_edit.py:31 extras/forms/filtersets.py:58 +#: extras/forms/bulk_edit.py:32 extras/forms/filtersets.py:56 msgid "Group name" msgstr "" -#: extras/forms/bulk_edit.py:39 extras/forms/filtersets.py:66 -#: extras/tables/tables.py:72 templates/extras/customfield.html:39 +#: extras/forms/bulk_edit.py:40 extras/forms/filtersets.py:64 +#: extras/tables/tables.py:47 templates/extras/customfield.html:39 #: templates/generic/bulk_import.html:116 msgid "Required" msgstr "" -#: extras/forms/bulk_edit.py:52 extras/forms/bulk_import.py:56 -#: extras/forms/filtersets.py:80 extras/models/customfields.py:187 -msgid "UI visibility" +#: extras/forms/bulk_edit.py:53 extras/forms/bulk_import.py:57 +#: extras/forms/filtersets.py:78 extras/models/customfields.py:193 +msgid "UI visible" msgstr "" -#: extras/forms/bulk_edit.py:58 extras/forms/filtersets.py:83 +#: extras/forms/bulk_edit.py:58 extras/forms/bulk_import.py:63 +#: extras/forms/filtersets.py:83 extras/models/customfields.py:200 +msgid "UI editable" +msgstr "" + +#: extras/forms/bulk_edit.py:63 extras/forms/filtersets.py:86 msgid "Is cloneable" msgstr "" -#: extras/forms/bulk_edit.py:97 extras/forms/filtersets.py:123 +#: extras/forms/bulk_edit.py:102 extras/forms/filtersets.py:126 msgid "New window" msgstr "" -#: extras/forms/bulk_edit.py:106 +#: extras/forms/bulk_edit.py:111 msgid "Button class" msgstr "" -#: extras/forms/bulk_edit.py:123 extras/forms/filtersets.py:161 -#: extras/models/models.py:356 +#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:164 +#: extras/models/models.py:439 msgid "MIME type" msgstr "" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:164 +#: extras/forms/bulk_edit.py:133 extras/forms/filtersets.py:167 msgid "File extension" msgstr "" -#: extras/forms/bulk_edit.py:133 extras/forms/filtersets.py:168 +#: extras/forms/bulk_edit.py:138 extras/forms/filtersets.py:171 msgid "As attachment" msgstr "" -#: extras/forms/bulk_edit.py:161 extras/forms/filtersets.py:210 -#: extras/tables/tables.py:236 templates/extras/savedfilter.html:30 +#: extras/forms/bulk_edit.py:166 extras/forms/filtersets.py:213 +#: extras/tables/tables.py:214 templates/extras/savedfilter.html:30 msgid "Shared" msgstr "" -#: extras/forms/bulk_edit.py:182 -msgid "On create" -msgstr "" - -#: extras/forms/bulk_edit.py:187 -msgid "On update" -msgstr "" - -#: extras/forms/bulk_edit.py:192 -msgid "On delete" -msgstr "" - -#: extras/forms/bulk_edit.py:197 -msgid "On job start" -msgstr "" - -#: extras/forms/bulk_edit.py:202 -msgid "On job end" -msgstr "" - -#: extras/forms/bulk_edit.py:209 extras/forms/filtersets.py:239 -#: extras/models/models.py:100 +#: extras/forms/bulk_edit.py:189 extras/forms/filtersets.py:242 +#: extras/models/models.py:204 msgid "HTTP method" msgstr "" -#: extras/forms/bulk_edit.py:213 templates/extras/webhook.html:66 +#: extras/forms/bulk_edit.py:193 extras/forms/filtersets.py:236 +#: templates/extras/webhook.html:37 msgid "Payload URL" msgstr "" -#: extras/forms/bulk_edit.py:218 extras/models/models.py:146 +#: extras/forms/bulk_edit.py:198 extras/models/models.py:244 msgid "SSL verification" msgstr "" -#: extras/forms/bulk_edit.py:221 templates/extras/webhook.html:74 +#: extras/forms/bulk_edit.py:201 templates/extras/webhook.html:45 msgid "Secret" msgstr "" -#: extras/forms/bulk_edit.py:226 +#: extras/forms/bulk_edit.py:206 msgid "CA file path" msgstr "" -#: extras/forms/bulk_edit.py:261 +#: extras/forms/bulk_edit.py:225 +msgid "On create" +msgstr "" + +#: extras/forms/bulk_edit.py:230 +msgid "On update" +msgstr "" + +#: extras/forms/bulk_edit.py:235 +msgid "On delete" +msgstr "" + +#: extras/forms/bulk_edit.py:240 +msgid "On job start" +msgstr "" + +#: extras/forms/bulk_edit.py:245 +msgid "On job end" +msgstr "" + +#: extras/forms/bulk_edit.py:282 msgid "Is active" msgstr "" -#: extras/forms/bulk_import.py:31 extras/forms/bulk_import.py:91 -#: extras/forms/bulk_import.py:107 extras/forms/bulk_import.py:131 -#: extras/forms/bulk_import.py:145 extras/forms/filtersets.py:111 -#: extras/forms/filtersets.py:157 extras/forms/filtersets.py:198 -#: extras/forms/model_forms.py:46 extras/forms/model_forms.py:119 -#: extras/forms/model_forms.py:147 extras/forms/model_forms.py:189 -#: extras/forms/model_forms.py:227 +#: extras/forms/bulk_import.py:34 extras/forms/bulk_import.py:115 +#: extras/forms/bulk_import.py:130 extras/forms/bulk_import.py:153 +#: extras/forms/bulk_import.py:177 extras/forms/filtersets.py:114 +#: extras/forms/filtersets.py:160 extras/forms/filtersets.py:201 +#: extras/forms/model_forms.py:43 extras/forms/model_forms.py:127 +#: extras/forms/model_forms.py:154 extras/forms/model_forms.py:195 +#: extras/forms/model_forms.py:251 msgid "Content types" msgstr "" -#: extras/forms/bulk_import.py:34 extras/forms/bulk_import.py:94 -#: extras/forms/bulk_import.py:110 extras/forms/bulk_import.py:133 -#: extras/forms/bulk_import.py:148 tenancy/forms/bulk_import.py:96 +#: extras/forms/bulk_import.py:36 extras/forms/bulk_import.py:117 +#: extras/forms/bulk_import.py:132 extras/forms/bulk_import.py:155 +#: extras/forms/bulk_import.py:179 tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "" -#: extras/forms/bulk_import.py:39 +#: extras/forms/bulk_import.py:41 msgid "Field data type (e.g. text, integer, etc.)" msgstr "" -#: extras/forms/bulk_import.py:42 extras/forms/filtersets.py:50 -#: extras/forms/filtersets.py:234 extras/forms/model_forms.py:51 -#: extras/forms/model_forms.py:215 tenancy/forms/filtersets.py:93 +#: extras/forms/bulk_import.py:44 extras/forms/filtersets.py:48 +#: extras/forms/filtersets.py:259 extras/forms/model_forms.py:47 +#: extras/forms/model_forms.py:221 tenancy/forms/filtersets.py:91 msgid "Object type" msgstr "" -#: extras/forms/bulk_import.py:46 +#: extras/forms/bulk_import.py:47 msgid "Object type (for object or multi-object fields)" msgstr "" -#: extras/forms/bulk_import.py:49 extras/forms/filtersets.py:75 +#: extras/forms/bulk_import.py:50 extras/forms/filtersets.py:73 msgid "Choice set" msgstr "" -#: extras/forms/bulk_import.py:53 +#: extras/forms/bulk_import.py:54 msgid "Choice set (for selection fields)" msgstr "" -#: extras/forms/bulk_import.py:58 -msgid "How the custom field is displayed in the user interface" +#: extras/forms/bulk_import.py:60 +msgid "Whether the custom field is displayed in the UI" msgstr "" -#: extras/forms/bulk_import.py:74 +#: extras/forms/bulk_import.py:66 +msgid "Whether the custom field is editable in the UI" +msgstr "" + +#: extras/forms/bulk_import.py:82 msgid "The base set of predefined choices to use (if any)" msgstr "" -#: extras/forms/bulk_import.py:79 -msgid "Comma-separated list of field choices" +#: extras/forms/bulk_import.py:88 +msgid "" +"Quoted string of comma-separated field choices with optional labels " +"separated by colon: \"choice1:First Choice,choice2:Second Choice\"" msgstr "" -#: extras/forms/bulk_import.py:174 +#: extras/forms/bulk_import.py:182 +msgid "Action object" +msgstr "" + +#: extras/forms/bulk_import.py:184 +msgid "Webhook name or script as dotted path module.Class" +msgstr "" + +#: extras/forms/bulk_import.py:236 msgid "Assigned object type" msgstr "" -#: extras/forms/bulk_import.py:179 +#: extras/forms/bulk_import.py:241 msgid "The classification of entry" msgstr "" -#: extras/forms/filtersets.py:55 +#: extras/forms/filtersets.py:53 msgid "Field type" msgstr "" -#: extras/forms/filtersets.py:94 extras/tables/tables.py:87 +#: extras/forms/filtersets.py:97 extras/tables/tables.py:65 #: templates/generic/bulk_import.html:148 msgid "Choices" msgstr "" -#: extras/forms/filtersets.py:138 extras/forms/filtersets.py:302 -#: extras/forms/filtersets.py:392 extras/forms/model_forms.py:346 -#: templates/core/job.html:80 templates/extras/configcontext.html:86 +#: extras/forms/filtersets.py:141 extras/forms/filtersets.py:327 +#: extras/forms/filtersets.py:417 extras/forms/model_forms.py:449 +#: templates/core/job.html:86 templates/extras/configcontext.html:86 +#: templates/extras/eventrule.html:111 msgid "Data" msgstr "" -#: extras/forms/filtersets.py:149 extras/forms/filtersets.py:316 -#: extras/forms/filtersets.py:402 utilities/choices.py:219 +#: extras/forms/filtersets.py:152 extras/forms/filtersets.py:341 +#: extras/forms/filtersets.py:427 utilities/choices.py:219 #: utilities/forms/bulk_import.py:27 msgid "Data file" msgstr "" -#: extras/forms/filtersets.py:182 +#: extras/forms/filtersets.py:185 msgid "Content type" msgstr "" -#: extras/forms/filtersets.py:229 extras/forms/model_forms.py:234 -#: templates/extras/webhook.html:28 +#: extras/forms/filtersets.py:232 extras/models/models.py:209 +msgid "HTTP content type" +msgstr "" + +#: extras/forms/filtersets.py:254 extras/forms/model_forms.py:269 +#: templates/extras/eventrule.html:46 msgid "Events" msgstr "" -#: extras/forms/filtersets.py:253 +#: extras/forms/filtersets.py:264 +msgid "Action type" +msgstr "" + +#: extras/forms/filtersets.py:278 msgid "Object creations" msgstr "" -#: extras/forms/filtersets.py:260 +#: extras/forms/filtersets.py:285 msgid "Object updates" msgstr "" -#: extras/forms/filtersets.py:267 +#: extras/forms/filtersets.py:292 msgid "Object deletions" msgstr "" -#: extras/forms/filtersets.py:274 +#: extras/forms/filtersets.py:299 msgid "Job starts" msgstr "" -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:250 +#: extras/forms/filtersets.py:306 extras/forms/model_forms.py:289 msgid "Job terminations" msgstr "" -#: extras/forms/filtersets.py:290 +#: extras/forms/filtersets.py:315 msgid "Tagged object type" msgstr "" -#: extras/forms/filtersets.py:295 +#: extras/forms/filtersets.py:320 msgid "Allowed object type" msgstr "" -#: extras/forms/filtersets.py:324 extras/forms/model_forms.py:281 +#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:384 #: netbox/navigation/menu.py:19 msgid "Regions" msgstr "" -#: extras/forms/filtersets.py:329 extras/forms/model_forms.py:286 +#: extras/forms/filtersets.py:354 extras/forms/model_forms.py:389 msgid "Site groups" msgstr "" -#: extras/forms/filtersets.py:339 extras/forms/model_forms.py:296 +#: extras/forms/filtersets.py:364 extras/forms/model_forms.py:399 #: netbox/navigation/menu.py:21 msgid "Locations" msgstr "" -#: extras/forms/filtersets.py:344 extras/forms/model_forms.py:301 +#: extras/forms/filtersets.py:369 extras/forms/model_forms.py:404 msgid "Device types" msgstr "" -#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:306 +#: extras/forms/filtersets.py:374 extras/forms/model_forms.py:409 msgid "Roles" msgstr "" -#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:316 +#: extras/forms/filtersets.py:384 extras/forms/model_forms.py:419 msgid "Cluster types" msgstr "" -#: extras/forms/filtersets.py:365 extras/forms/model_forms.py:321 +#: extras/forms/filtersets.py:390 extras/forms/model_forms.py:424 msgid "Cluster groups" msgstr "" -#: extras/forms/filtersets.py:370 extras/forms/model_forms.py:326 -#: netbox/navigation/menu.py:224 netbox/navigation/menu.py:226 +#: extras/forms/filtersets.py:395 extras/forms/model_forms.py:429 +#: netbox/navigation/menu.py:243 netbox/navigation/menu.py:245 #: templates/virtualization/clustertype.html:33 #: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "" -#: extras/forms/filtersets.py:375 extras/forms/model_forms.py:331 +#: extras/forms/filtersets.py:400 extras/forms/model_forms.py:434 msgid "Tenant groups" msgstr "" -#: extras/forms/filtersets.py:429 extras/forms/filtersets.py:470 +#: extras/forms/filtersets.py:454 extras/forms/filtersets.py:495 msgid "After" msgstr "" -#: extras/forms/filtersets.py:434 extras/forms/filtersets.py:475 +#: extras/forms/filtersets.py:459 extras/forms/filtersets.py:500 msgid "Before" msgstr "" -#: extras/forms/filtersets.py:465 extras/tables/tables.py:426 +#: extras/forms/filtersets.py:490 extras/tables/tables.py:426 #: templates/extras/htmx/report_result.html:43 #: templates/extras/objectchange.html:34 msgid "Time" msgstr "" -#: extras/forms/filtersets.py:479 extras/tables/tables.py:440 +#: extras/forms/filtersets.py:504 extras/forms/model_forms.py:271 +#: extras/tables/tables.py:440 templates/extras/eventrule.html:90 #: templates/extras/objectchange.html:50 msgid "Action" msgstr "" -#: extras/forms/mixins.py:71 extras/forms/model_forms.py:195 -#: templates/extras/savedfilter.html:10 -msgid "Saved Filter" -msgstr "" - -#: extras/forms/model_forms.py:56 +#: extras/forms/model_forms.py:50 msgid "Type of the related object (for object/multi-object fields only)" msgstr "" -#: extras/forms/model_forms.py:64 templates/extras/customfield.html:11 +#: extras/forms/model_forms.py:58 templates/extras/customfield.html:11 msgid "Custom Field" msgstr "" -#: extras/forms/model_forms.py:67 templates/extras/customfield.html:60 +#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 msgid "Behavior" msgstr "" -#: extras/forms/model_forms.py:68 +#: extras/forms/model_forms.py:62 msgid "Values" msgstr "" -#: extras/forms/model_forms.py:69 extras/forms/model_forms.py:494 -#: templates/extras/configrevision.html:147 -msgid "Validation" -msgstr "" - -#: extras/forms/model_forms.py:77 +#: extras/forms/model_forms.py:71 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." msgstr "" -#: extras/forms/model_forms.py:80 +#: extras/forms/model_forms.py:74 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." msgstr "" -#: extras/forms/model_forms.py:97 +#: extras/forms/model_forms.py:91 msgid "" "Enter one choice per line. An optional label may be specified for each " -"choice by appending it with a comma. Example:" +"choice by appending it with a colon. Example:" msgstr "" -#: extras/forms/model_forms.py:125 templates/extras/customlink.html:10 +#: extras/forms/model_forms.py:132 templates/extras/customlink.html:10 msgid "Custom Link" msgstr "" -#: extras/forms/model_forms.py:126 +#: extras/forms/model_forms.py:133 msgid "Templates" msgstr "" -#: extras/forms/model_forms.py:138 +#: extras/forms/model_forms.py:145 msgid "" "Jinja2 template code for the link text. Reference the object as " "{{ object }}. Links which render as empty text will not be " "displayed." msgstr "" -#: extras/forms/model_forms.py:141 +#: extras/forms/model_forms.py:148 msgid "" "Jinja2 template code for the link URL. Reference the object as " "{{ object }}." msgstr "" -#: extras/forms/model_forms.py:152 extras/forms/model_forms.py:397 +#: extras/forms/model_forms.py:158 extras/forms/model_forms.py:500 msgid "Template code" msgstr "" -#: extras/forms/model_forms.py:158 templates/extras/exporttemplate.html:17 +#: extras/forms/model_forms.py:164 templates/extras/exporttemplate.html:17 msgid "Export Template" msgstr "" -#: extras/forms/model_forms.py:160 +#: extras/forms/model_forms.py:166 msgid "Rendering" msgstr "" -#: extras/forms/model_forms.py:174 extras/forms/model_forms.py:422 +#: extras/forms/model_forms.py:180 extras/forms/model_forms.py:525 msgid "Template content is populated from the remote source selected below." msgstr "" -#: extras/forms/model_forms.py:181 extras/forms/model_forms.py:429 +#: extras/forms/model_forms.py:187 extras/forms/model_forms.py:532 msgid "Must specify either local content or a data file" msgstr "" -#: extras/forms/model_forms.py:233 templates/extras/webhook.html:11 -msgid "Webhook" +#: extras/forms/model_forms.py:201 netbox/forms/mixins.py:68 +#: templates/extras/savedfilter.html:10 +msgid "Saved Filter" msgstr "" -#: extras/forms/model_forms.py:235 templates/extras/webhook.html:57 +#: extras/forms/model_forms.py:234 templates/extras/webhook.html:28 msgid "HTTP Request" msgstr "" -#: extras/forms/model_forms.py:238 templates/extras/webhook.html:116 -msgid "Conditions" -msgstr "" - -#: extras/forms/model_forms.py:239 templates/extras/webhook.html:82 +#: extras/forms/model_forms.py:237 templates/extras/webhook.html:53 msgid "SSL" msgstr "" -#: extras/forms/model_forms.py:246 +#: extras/forms/model_forms.py:255 +msgid "Action choice" +msgstr "" + +#: extras/forms/model_forms.py:260 +msgid "Enter conditions in JSON format." +msgstr "" + +#: extras/forms/model_forms.py:264 +msgid "" +"Enter parameters to pass to the action in JSON format." +msgstr "" + +#: extras/forms/model_forms.py:268 templates/extras/eventrule.html:11 +msgid "Event Rule" +msgstr "" + +#: extras/forms/model_forms.py:270 templates/extras/eventrule.html:78 +msgid "Conditions" +msgstr "" + +#: extras/forms/model_forms.py:285 msgid "Creations" msgstr "" -#: extras/forms/model_forms.py:247 +#: extras/forms/model_forms.py:286 msgid "Updates" msgstr "" -#: extras/forms/model_forms.py:248 +#: extras/forms/model_forms.py:287 msgid "Deletions" msgstr "" -#: extras/forms/model_forms.py:249 +#: extras/forms/model_forms.py:288 msgid "Job executions" msgstr "" -#: extras/forms/model_forms.py:262 users/forms/model_forms.py:285 +#: extras/forms/model_forms.py:366 users/forms/model_forms.py:285 msgid "Object types" msgstr "" -#: extras/forms/model_forms.py:336 netbox/navigation/menu.py:40 +#: extras/forms/model_forms.py:439 netbox/navigation/menu.py:40 #: tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "" -#: extras/forms/model_forms.py:353 ipam/forms/filtersets.py:145 -#: templates/extras/configcontext.html:62 templates/ipam/ipaddress.html:62 -#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 -#: users/forms/model_forms.py:323 +#: extras/forms/model_forms.py:456 ipam/forms/filtersets.py:141 +#: ipam/forms/filtersets.py:527 templates/extras/configcontext.html:62 +#: templates/ipam/ipaddress.html:62 templates/ipam/vlan_edit.html:30 +#: tenancy/forms/filtersets.py:86 users/forms/model_forms.py:323 msgid "Assignment" msgstr "" -#: extras/forms/model_forms.py:379 +#: extras/forms/model_forms.py:482 msgid "Data is populated from the remote source selected below." msgstr "" -#: extras/forms/model_forms.py:385 +#: extras/forms/model_forms.py:488 msgid "Must specify either local data or a data file" msgstr "" -#: extras/forms/model_forms.py:404 templates/core/datafile.html:65 +#: extras/forms/model_forms.py:507 templates/core/datafile.html:65 msgid "Content" msgstr "" -#: extras/forms/model_forms.py:488 templates/dcim/rack_elevation_list.html:6 -#: templates/extras/configrevision.html:43 -msgid "Rack Elevations" -msgstr "" - -#: extras/forms/model_forms.py:490 netbox/navigation/menu.py:142 -#: templates/extras/configrevision.html:79 -msgid "IPAM" -msgstr "" - -#: extras/forms/model_forms.py:491 templates/extras/configrevision.html:95 -msgid "Security" -msgstr "" - -#: extras/forms/model_forms.py:492 templates/extras/configrevision.html:107 -msgid "Banners" -msgstr "" - -#: extras/forms/model_forms.py:493 templates/extras/configrevision.html:131 -msgid "Pagination" -msgstr "" - -#: extras/forms/model_forms.py:495 templates/account/preferences.html:6 -#: templates/extras/configrevision.html:159 -msgid "User Preferences" -msgstr "" - -#: extras/forms/model_forms.py:499 -msgid "Config Revision" -msgstr "" - -#: extras/forms/model_forms.py:537 -msgid "This parameter has been defined statically and cannot be modified." -msgstr "" - -#: extras/forms/model_forms.py:545 -#, python-brace-format -msgid "Current value: {value}" -msgstr "" - -#: extras/forms/model_forms.py:547 -msgid " (default)" -msgstr "" - #: extras/forms/reports.py:18 extras/forms/scripts.py:24 msgid "Schedule at" msgstr "" @@ -6193,38 +6390,43 @@ msgstr "" msgid "Interval at which this script is re-run (in minutes)" msgstr "" -#: extras/models/change_logging.py:23 +#: extras/models/change_logging.py:24 msgid "time" msgstr "" -#: extras/models/change_logging.py:36 +#: extras/models/change_logging.py:37 msgid "user name" msgstr "" -#: extras/models/change_logging.py:41 +#: extras/models/change_logging.py:42 msgid "request ID" msgstr "" -#: extras/models/change_logging.py:46 extras/models/staging.py:69 +#: extras/models/change_logging.py:47 extras/models/staging.py:69 msgid "action" msgstr "" -#: extras/models/change_logging.py:80 +#: extras/models/change_logging.py:81 msgid "pre-change data" msgstr "" -#: extras/models/change_logging.py:86 +#: extras/models/change_logging.py:87 msgid "post-change data" msgstr "" -#: extras/models/change_logging.py:96 +#: extras/models/change_logging.py:101 msgid "object change" msgstr "" -#: extras/models/change_logging.py:97 +#: extras/models/change_logging.py:102 msgid "object changes" msgstr "" +#: extras/models/change_logging.py:118 +#, python-brace-format +msgid "Change logging is not supported for this object type ({type})." +msgstr "" + #: extras/models/configs.py:130 msgid "config context" msgstr "" @@ -6270,112 +6472,112 @@ msgstr "" msgid "config templates" msgstr "" -#: extras/models/customfields.py:66 +#: extras/models/customfields.py:72 msgid "The object(s) to which this field applies." msgstr "" -#: extras/models/customfields.py:73 +#: extras/models/customfields.py:79 msgid "The type of data this custom field holds" msgstr "" -#: extras/models/customfields.py:80 +#: extras/models/customfields.py:86 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "" -#: extras/models/customfields.py:86 +#: extras/models/customfields.py:92 msgid "Internal field name" msgstr "" -#: extras/models/customfields.py:90 +#: extras/models/customfields.py:96 msgid "Only alphanumeric characters and underscores are allowed." msgstr "" -#: extras/models/customfields.py:95 +#: extras/models/customfields.py:101 msgid "Double underscores are not permitted in custom field names." msgstr "" -#: extras/models/customfields.py:106 +#: extras/models/customfields.py:112 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" msgstr "" -#: extras/models/customfields.py:110 extras/models/models.py:264 +#: extras/models/customfields.py:116 extras/models/models.py:347 msgid "group name" msgstr "" -#: extras/models/customfields.py:113 +#: extras/models/customfields.py:119 msgid "Custom fields within the same group will be displayed together" msgstr "" -#: extras/models/customfields.py:121 +#: extras/models/customfields.py:127 msgid "required" msgstr "" -#: extras/models/customfields.py:123 +#: extras/models/customfields.py:129 msgid "" "If true, this field is required when creating new objects or editing an " "existing object." msgstr "" -#: extras/models/customfields.py:126 +#: extras/models/customfields.py:132 msgid "search weight" msgstr "" -#: extras/models/customfields.py:129 +#: extras/models/customfields.py:135 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." msgstr "" -#: extras/models/customfields.py:134 +#: extras/models/customfields.py:140 msgid "filter logic" msgstr "" -#: extras/models/customfields.py:138 +#: extras/models/customfields.py:144 msgid "" "Loose matches any instance of a given string; exact matches the entire field." msgstr "" -#: extras/models/customfields.py:141 +#: extras/models/customfields.py:147 msgid "default" msgstr "" -#: extras/models/customfields.py:145 +#: extras/models/customfields.py:151 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with " "double quotes (e.g. \"Foo\")." msgstr "" -#: extras/models/customfields.py:150 +#: extras/models/customfields.py:156 msgid "display weight" msgstr "" -#: extras/models/customfields.py:151 +#: extras/models/customfields.py:157 msgid "Fields with higher weights appear lower in a form." msgstr "" -#: extras/models/customfields.py:156 +#: extras/models/customfields.py:162 msgid "minimum value" msgstr "" -#: extras/models/customfields.py:157 +#: extras/models/customfields.py:163 msgid "Minimum allowed value (for numeric fields)" msgstr "" -#: extras/models/customfields.py:162 +#: extras/models/customfields.py:168 msgid "maximum value" msgstr "" -#: extras/models/customfields.py:163 +#: extras/models/customfields.py:169 msgid "Maximum allowed value (for numeric fields)" msgstr "" -#: extras/models/customfields.py:169 +#: extras/models/customfields.py:175 msgid "validation regex" msgstr "" -#: extras/models/customfields.py:171 +#: extras/models/customfields.py:177 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -6383,166 +6585,166 @@ msgid "" "values to exactly three uppercase letters." msgstr "" -#: extras/models/customfields.py:179 +#: extras/models/customfields.py:185 msgid "choice set" msgstr "" -#: extras/models/customfields.py:188 -msgid "Specifies the visibility of custom field in the UI" +#: extras/models/customfields.py:194 +msgid "Specifies whether the custom field is displayed in the UI" msgstr "" -#: extras/models/customfields.py:192 +#: extras/models/customfields.py:201 +msgid "Specifies whether the custom field value can be edited in the UI" +msgstr "" + +#: extras/models/customfields.py:205 msgid "is cloneable" msgstr "" -#: extras/models/customfields.py:193 +#: extras/models/customfields.py:206 msgid "Replicate this value when cloning objects" msgstr "" -#: extras/models/customfields.py:206 +#: extras/models/customfields.py:219 msgid "custom field" msgstr "" -#: extras/models/customfields.py:207 +#: extras/models/customfields.py:220 msgid "custom fields" msgstr "" -#: extras/models/customfields.py:290 +#: extras/models/customfields.py:309 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "" -#: extras/models/customfields.py:297 +#: extras/models/customfields.py:316 msgid "A minimum value may be set only for numeric fields" msgstr "" -#: extras/models/customfields.py:299 +#: extras/models/customfields.py:318 msgid "A maximum value may be set only for numeric fields" msgstr "" -#: extras/models/customfields.py:309 +#: extras/models/customfields.py:328 msgid "Regular expression validation is supported only for text and URL fields" msgstr "" -#: extras/models/customfields.py:319 +#: extras/models/customfields.py:338 msgid "Selection fields must specify a set of choices." msgstr "" -#: extras/models/customfields.py:323 +#: extras/models/customfields.py:342 msgid "Choices may be set only on selection fields." msgstr "" -#: extras/models/customfields.py:330 +#: extras/models/customfields.py:349 msgid "Object fields must define an object type." msgstr "" -#: extras/models/customfields.py:335 +#: extras/models/customfields.py:354 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "" -#: extras/models/customfields.py:415 +#: extras/models/customfields.py:434 msgid "True" msgstr "" -#: extras/models/customfields.py:416 +#: extras/models/customfields.py:435 msgid "False" msgstr "" -#: extras/models/customfields.py:498 +#: extras/models/customfields.py:517 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "" -#: extras/models/customfields.py:513 -msgid "Field is set to read-only." -msgstr "" - -#: extras/models/customfields.py:595 +#: extras/models/customfields.py:612 msgid "Value must be a string." msgstr "" -#: extras/models/customfields.py:597 +#: extras/models/customfields.py:614 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "" -#: extras/models/customfields.py:602 +#: extras/models/customfields.py:619 msgid "Value must be an integer." msgstr "" -#: extras/models/customfields.py:605 extras/models/customfields.py:620 +#: extras/models/customfields.py:622 extras/models/customfields.py:637 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "" -#: extras/models/customfields.py:609 extras/models/customfields.py:624 +#: extras/models/customfields.py:626 extras/models/customfields.py:641 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "" -#: extras/models/customfields.py:617 +#: extras/models/customfields.py:634 msgid "Value must be a decimal." msgstr "" -#: extras/models/customfields.py:629 +#: extras/models/customfields.py:646 msgid "Value must be true or false." msgstr "" -#: extras/models/customfields.py:637 +#: extras/models/customfields.py:654 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "" -#: extras/models/customfields.py:646 +#: extras/models/customfields.py:663 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" -#: extras/models/customfields.py:653 +#: extras/models/customfields.py:670 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "" -#: extras/models/customfields.py:663 +#: extras/models/customfields.py:680 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "" -#: extras/models/customfields.py:672 +#: extras/models/customfields.py:689 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "" -#: extras/models/customfields.py:678 +#: extras/models/customfields.py:695 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "" -#: extras/models/customfields.py:682 +#: extras/models/customfields.py:699 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "" -#: extras/models/customfields.py:685 +#: extras/models/customfields.py:702 msgid "Required field cannot be empty." msgstr "" -#: extras/models/customfields.py:704 +#: extras/models/customfields.py:721 msgid "Base set of predefined choices (optional)" msgstr "" -#: extras/models/customfields.py:716 +#: extras/models/customfields.py:733 msgid "Choices are automatically ordered alphabetically" msgstr "" -#: extras/models/customfields.py:723 +#: extras/models/customfields.py:740 msgid "custom field choice set" msgstr "" -#: extras/models/customfields.py:724 +#: extras/models/customfields.py:741 msgid "custom field choice sets" msgstr "" -#: extras/models/customfields.py:760 +#: extras/models/customfields.py:777 msgid "Must define base or extra choices." msgstr "" @@ -6562,76 +6764,103 @@ msgstr "" msgid "dashboards" msgstr "" -#: extras/models/models.py:50 +#: extras/models/models.py:49 msgid "object types" msgstr "" -#: extras/models/models.py:52 -msgid "The object(s) to which this Webhook applies." +#: extras/models/models.py:50 +msgid "The object(s) to which this rule applies." msgstr "" -#: extras/models/models.py:60 +#: extras/models/models.py:63 msgid "on create" msgstr "" -#: extras/models/models.py:62 +#: extras/models/models.py:65 msgid "Triggers when a matching object is created." msgstr "" -#: extras/models/models.py:65 +#: extras/models/models.py:68 msgid "on update" msgstr "" -#: extras/models/models.py:67 +#: extras/models/models.py:70 msgid "Triggers when a matching object is updated." msgstr "" -#: extras/models/models.py:70 +#: extras/models/models.py:73 msgid "on delete" msgstr "" -#: extras/models/models.py:72 +#: extras/models/models.py:75 msgid "Triggers when a matching object is deleted." msgstr "" -#: extras/models/models.py:75 +#: extras/models/models.py:78 msgid "on job start" msgstr "" -#: extras/models/models.py:77 +#: extras/models/models.py:80 msgid "Triggers when a job for a matching object is started." msgstr "" -#: extras/models/models.py:80 +#: extras/models/models.py:83 msgid "on job end" msgstr "" -#: extras/models/models.py:82 +#: extras/models/models.py:85 msgid "Triggers when a job for a matching object terminates." msgstr "" -#: extras/models/models.py:88 +#: extras/models/models.py:92 +msgid "conditions" +msgstr "" + +#: extras/models/models.py:95 +msgid "" +"A set of conditions which determine whether the event will be generated." +msgstr "" + +#: extras/models/models.py:103 +msgid "action type" +msgstr "" + +#: extras/models/models.py:126 +msgid "Additional data to pass to the action object" +msgstr "" + +#: extras/models/models.py:138 +msgid "event rule" +msgstr "" + +#: extras/models/models.py:139 +msgid "event rules" +msgstr "" + +#: extras/models/models.py:155 +msgid "" +"At least one event type must be selected: create, update, delete, job start, " +"and/or job end." +msgstr "" + +#: extras/models/models.py:196 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the " "request body." msgstr "" -#: extras/models/models.py:105 -msgid "HTTP content type" -msgstr "" - -#: extras/models/models.py:107 +#: extras/models/models.py:211 msgid "" "The complete list of official content types is available here." msgstr "" -#: extras/models/models.py:112 +#: extras/models/models.py:216 msgid "additional headers" msgstr "" -#: extras/models/models.py:115 +#: extras/models/models.py:219 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -6639,11 +6868,11 @@ msgid "" "as the request body (below)." msgstr "" -#: extras/models/models.py:121 +#: extras/models/models.py:225 msgid "body template" msgstr "" -#: extras/models/models.py:124 +#: extras/models/models.py:228 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -6651,238 +6880,204 @@ msgid "" "username, request_id, and data." msgstr "" -#: extras/models/models.py:130 +#: extras/models/models.py:234 msgid "secret" msgstr "" -#: extras/models/models.py:134 +#: extras/models/models.py:238 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " "the key. The secret is not transmitted in the request." msgstr "" -#: extras/models/models.py:139 -msgid "conditions" -msgstr "" - -#: extras/models/models.py:142 -msgid "" -"A set of conditions which determine whether the webhook will be generated." -msgstr "" - -#: extras/models/models.py:147 +#: extras/models/models.py:245 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "" -#: extras/models/models.py:153 templates/extras/webhook.html:91 +#: extras/models/models.py:251 templates/extras/webhook.html:62 msgid "CA File Path" msgstr "" -#: extras/models/models.py:155 +#: extras/models/models.py:253 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to " "use the system defaults." msgstr "" -#: extras/models/models.py:167 +#: extras/models/models.py:264 msgid "webhook" msgstr "" -#: extras/models/models.py:168 +#: extras/models/models.py:265 msgid "webhooks" msgstr "" -#: extras/models/models.py:188 -msgid "" -"At least one event type must be selected: create, update, delete, job_start, " -"and/or job_end." -msgstr "" - -#: extras/models/models.py:200 +#: extras/models/models.py:283 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "" -#: extras/models/models.py:240 +#: extras/models/models.py:323 msgid "The object type(s) to which this link applies." msgstr "" -#: extras/models/models.py:252 +#: extras/models/models.py:335 msgid "link text" msgstr "" -#: extras/models/models.py:253 +#: extras/models/models.py:336 msgid "Jinja2 template code for link text" msgstr "" -#: extras/models/models.py:256 +#: extras/models/models.py:339 msgid "link URL" msgstr "" -#: extras/models/models.py:257 +#: extras/models/models.py:340 msgid "Jinja2 template code for link URL" msgstr "" -#: extras/models/models.py:267 +#: extras/models/models.py:350 msgid "Links with the same group will appear as a dropdown menu" msgstr "" -#: extras/models/models.py:270 +#: extras/models/models.py:353 msgid "button class" msgstr "" -#: extras/models/models.py:274 +#: extras/models/models.py:357 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" -#: extras/models/models.py:277 +#: extras/models/models.py:360 msgid "new window" msgstr "" -#: extras/models/models.py:279 +#: extras/models/models.py:362 msgid "Force link to open in a new window" msgstr "" -#: extras/models/models.py:288 +#: extras/models/models.py:371 msgid "custom link" msgstr "" -#: extras/models/models.py:289 +#: extras/models/models.py:372 msgid "custom links" msgstr "" -#: extras/models/models.py:336 +#: extras/models/models.py:419 msgid "The object type(s) to which this template applies." msgstr "" -#: extras/models/models.py:349 +#: extras/models/models.py:432 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." msgstr "" -#: extras/models/models.py:357 +#: extras/models/models.py:440 msgid "Defaults to text/plain; charset=utf-8" msgstr "" -#: extras/models/models.py:360 +#: extras/models/models.py:443 msgid "file extension" msgstr "" -#: extras/models/models.py:363 +#: extras/models/models.py:446 msgid "Extension to append to the rendered filename" msgstr "" -#: extras/models/models.py:366 +#: extras/models/models.py:449 msgid "as attachment" msgstr "" -#: extras/models/models.py:368 +#: extras/models/models.py:451 msgid "Download file as attachment" msgstr "" -#: extras/models/models.py:377 +#: extras/models/models.py:460 msgid "export template" msgstr "" -#: extras/models/models.py:378 +#: extras/models/models.py:461 msgid "export templates" msgstr "" -#: extras/models/models.py:395 +#: extras/models/models.py:478 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "" -#: extras/models/models.py:445 +#: extras/models/models.py:528 msgid "The object type(s) to which this filter applies." msgstr "" -#: extras/models/models.py:477 +#: extras/models/models.py:560 msgid "shared" msgstr "" -#: extras/models/models.py:490 +#: extras/models/models.py:573 msgid "saved filter" msgstr "" -#: extras/models/models.py:491 +#: extras/models/models.py:574 msgid "saved filters" msgstr "" -#: extras/models/models.py:509 +#: extras/models/models.py:592 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" -#: extras/models/models.py:537 +#: extras/models/models.py:620 msgid "image height" msgstr "" -#: extras/models/models.py:540 +#: extras/models/models.py:623 msgid "image width" msgstr "" -#: extras/models/models.py:554 +#: extras/models/models.py:640 msgid "image attachment" msgstr "" -#: extras/models/models.py:555 +#: extras/models/models.py:641 msgid "image attachments" msgstr "" -#: extras/models/models.py:623 +#: extras/models/models.py:655 +#, python-brace-format +msgid "Image attachments cannot be assigned to this object type ({type})." +msgstr "" + +#: extras/models/models.py:718 msgid "kind" msgstr "" -#: extras/models/models.py:634 +#: extras/models/models.py:732 msgid "journal entry" msgstr "" -#: extras/models/models.py:635 +#: extras/models/models.py:733 msgid "journal entries" msgstr "" -#: extras/models/models.py:651 +#: extras/models/models.py:748 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "" -#: extras/models/models.py:690 +#: extras/models/models.py:790 msgid "bookmark" msgstr "" -#: extras/models/models.py:691 +#: extras/models/models.py:791 msgid "bookmarks" msgstr "" -#: extras/models/models.py:708 -msgid "comment" -msgstr "" - -#: extras/models/models.py:715 -msgid "configuration data" -msgstr "" - -#: extras/models/models.py:722 -msgid "config revision" -msgstr "" - -#: extras/models/models.py:723 -msgid "config revisions" -msgstr "" - -#: extras/models/models.py:727 -msgid "Default configuration" -msgstr "" - -#: extras/models/models.py:729 -msgid "Current configuration" -msgstr "" - -#: extras/models/models.py:730 +#: extras/models/models.py:804 #, python-brace-format -msgid "Config revision #{id}" +msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "" #: extras/models/reports.py:46 @@ -6901,23 +7096,23 @@ msgstr "" msgid "script modules" msgstr "" -#: extras/models/search.py:22 +#: extras/models/search.py:24 msgid "timestamp" msgstr "" -#: extras/models/search.py:37 +#: extras/models/search.py:39 msgid "field" msgstr "" -#: extras/models/search.py:45 +#: extras/models/search.py:47 msgid "value" msgstr "" -#: extras/models/search.py:54 +#: extras/models/search.py:58 msgid "cached value" msgstr "" -#: extras/models/search.py:55 +#: extras/models/search.py:59 msgid "cached values" msgstr "" @@ -6929,73 +7124,78 @@ msgstr "" msgid "branches" msgstr "" -#: extras/models/staging.py:94 +#: extras/models/staging.py:97 msgid "staged change" msgstr "" -#: extras/models/staging.py:95 +#: extras/models/staging.py:98 msgid "staged changes" msgstr "" -#: extras/models/tags.py:44 +#: extras/models/tags.py:40 msgid "The object type(s) to which this this tag can be applied." msgstr "" -#: extras/models/tags.py:53 +#: extras/models/tags.py:49 msgid "tag" msgstr "" -#: extras/models/tags.py:54 +#: extras/models/tags.py:50 msgid "tags" msgstr "" -#: extras/models/tags.py:80 +#: extras/models/tags.py:78 msgid "tagged item" msgstr "" -#: extras/models/tags.py:81 +#: extras/models/tags.py:79 msgid "tagged items" msgstr "" -#: extras/tables/tables.py:48 users/forms/filtersets.py:47 users/tables.py:39 -msgid "Is Active" +#: extras/signals.py:221 +#, python-brace-format +msgid "Deletion is prevented by a protection rule: {message}" msgstr "" -#: extras/tables/tables.py:69 extras/tables/tables.py:141 -#: extras/tables/tables.py:165 extras/tables/tables.py:230 -#: extras/tables/tables.py:277 +#: extras/tables/tables.py:44 extras/tables/tables.py:119 +#: extras/tables/tables.py:143 extras/tables/tables.py:208 +#: extras/tables/tables.py:281 msgid "Content Types" msgstr "" -#: extras/tables/tables.py:75 templates/extras/customfield.html:82 -msgid "UI Visibility" +#: extras/tables/tables.py:50 +msgid "Visible" msgstr "" -#: extras/tables/tables.py:82 templates/extras/customfield.html:48 +#: extras/tables/tables.py:53 +msgid "Editable" +msgstr "" + +#: extras/tables/tables.py:60 templates/extras/customfield.html:48 msgid "Choice Set" msgstr "" -#: extras/tables/tables.py:90 +#: extras/tables/tables.py:68 msgid "Is Cloneable" msgstr "" -#: extras/tables/tables.py:120 +#: extras/tables/tables.py:98 msgid "Count" msgstr "" -#: extras/tables/tables.py:123 +#: extras/tables/tables.py:101 msgid "Order Alphabetically" msgstr "" -#: extras/tables/tables.py:147 templates/extras/customlink.html:34 +#: extras/tables/tables.py:125 templates/extras/customlink.html:34 msgid "New Window" msgstr "" -#: extras/tables/tables.py:168 +#: extras/tables/tables.py:146 msgid "As Attachment" msgstr "" -#: extras/tables/tables.py:175 extras/tables/tables.py:367 +#: extras/tables/tables.py:153 extras/tables/tables.py:367 #: extras/tables/tables.py:402 templates/core/datafile.html:32 #: templates/dcim/device/render_config.html:23 #: templates/extras/configcontext.html:40 @@ -7006,41 +7206,45 @@ msgstr "" msgid "Data File" msgstr "" -#: extras/tables/tables.py:180 extras/tables/tables.py:379 +#: extras/tables/tables.py:158 extras/tables/tables.py:379 #: extras/tables/tables.py:407 msgid "Synced" msgstr "" -#: extras/tables/tables.py:200 +#: extras/tables/tables.py:178 msgid "Content Type" msgstr "" -#: extras/tables/tables.py:207 +#: extras/tables/tables.py:185 msgid "Image" msgstr "" -#: extras/tables/tables.py:212 +#: extras/tables/tables.py:190 msgid "Size (Bytes)" msgstr "" -#: extras/tables/tables.py:255 extras/tables/tables.py:326 -#: templates/extras/customfield.html:92 +#: extras/tables/tables.py:233 extras/tables/tables.py:326 +#: templates/extras/customfield.html:96 templates/extras/eventrule.html:32 #: templates/users/objectpermission.html:68 users/tables.py:83 msgid "Object Types" msgstr "" -#: extras/tables/tables.py:292 +#: extras/tables/tables.py:255 +msgid "SSL Validation" +msgstr "" + +#: extras/tables/tables.py:278 +msgid "Action Type" +msgstr "" + +#: extras/tables/tables.py:296 msgid "Job Start" msgstr "" -#: extras/tables/tables.py:295 +#: extras/tables/tables.py:299 msgid "Job End" msgstr "" -#: extras/tables/tables.py:298 -msgid "SSL Validation" -msgstr "" - #: extras/tables/tables.py:436 templates/account/profile.html:20 #: templates/users/user.html:22 msgid "Full Name" @@ -7054,7 +7258,25 @@ msgstr "" msgid "Comments (Short)" msgstr "" -#: extras/views.py:836 +#: extras/validators.py:13 +#, python-format +msgid "Ensure this value is equal to %(limit_value)s." +msgstr "" + +#: extras/validators.py:24 +#, python-format +msgid "Ensure this value does not equal %(limit_value)s." +msgstr "" + +#: extras/validators.py:35 +msgid "This field must be empty." +msgstr "" + +#: extras/validators.py:50 +msgid "This field must not be empty." +msgstr "" + +#: extras/views.py:880 msgid "Your dashboard has been reset." msgstr "" @@ -7116,19 +7338,19 @@ msgstr "" msgid "Plaintext" msgstr "" -#: ipam/filtersets.py:47 ipam/filtersets.py:1068 +#: ipam/filtersets.py:47 vpn/filtersets.py:276 msgid "Import target" msgstr "" -#: ipam/filtersets.py:53 ipam/filtersets.py:1074 +#: ipam/filtersets.py:53 vpn/filtersets.py:282 msgid "Import target (name)" msgstr "" -#: ipam/filtersets.py:58 ipam/filtersets.py:1079 +#: ipam/filtersets.py:58 vpn/filtersets.py:287 msgid "Export target" msgstr "" -#: ipam/filtersets.py:64 ipam/filtersets.py:1085 +#: ipam/filtersets.py:64 vpn/filtersets.py:293 msgid "Export target (name)" msgstr "" @@ -7148,8 +7370,8 @@ msgstr "" msgid "Export VRF (RD)" msgstr "" -#: ipam/filtersets.py:132 ipam/filtersets.py:247 ipam/forms/model_forms.py:231 -#: ipam/tables/ip.py:211 templates/ipam/prefix.html:11 +#: ipam/filtersets.py:132 ipam/filtersets.py:247 ipam/forms/model_forms.py:229 +#: ipam/tables/ip.py:211 templates/ipam/prefix.html:12 msgid "Prefix" msgstr "" @@ -7173,106 +7395,103 @@ msgstr "" msgid "Prefixes which contain this prefix or IP" msgstr "" -#: ipam/filtersets.py:338 ipam/filtersets.py:1191 +#: ipam/filtersets.py:270 ipam/filtersets.py:538 ipam/forms/bulk_edit.py:326 +#: ipam/forms/filtersets.py:191 ipam/forms/filtersets.py:317 +msgid "Mask length" +msgstr "" + +#: ipam/filtersets.py:339 vpn/filtersets.py:399 msgid "VLAN (ID)" msgstr "" -#: ipam/filtersets.py:342 ipam/filtersets.py:1186 +#: ipam/filtersets.py:343 vpn/filtersets.py:394 msgid "VLAN number (1-4094)" msgstr "" -#: ipam/filtersets.py:436 ipam/filtersets.py:440 ipam/filtersets.py:532 -#: ipam/forms/model_forms.py:446 templates/tenancy/contact.html:54 +#: ipam/filtersets.py:437 ipam/filtersets.py:441 ipam/filtersets.py:533 +#: ipam/forms/model_forms.py:444 templates/tenancy/contact.html:54 #: tenancy/forms/bulk_edit.py:112 msgid "Address" msgstr "" -#: ipam/filtersets.py:444 +#: ipam/filtersets.py:445 msgid "Ranges which contain this prefix or IP" msgstr "" -#: ipam/filtersets.py:472 ipam/filtersets.py:528 +#: ipam/filtersets.py:473 ipam/filtersets.py:529 msgid "Parent prefix" msgstr "" -#: ipam/filtersets.py:536 ipam/forms/bulk_edit.py:328 -#: ipam/forms/filtersets.py:195 ipam/forms/filtersets.py:320 -msgid "Mask length" -msgstr "" - -#: ipam/filtersets.py:572 ipam/filtersets.py:807 ipam/filtersets.py:1026 -#: ipam/filtersets.py:1149 +#: ipam/filtersets.py:582 ipam/filtersets.py:812 ipam/filtersets.py:1031 +#: vpn/filtersets.py:357 msgid "Virtual machine (name)" msgstr "" -#: ipam/filtersets.py:577 ipam/filtersets.py:812 ipam/filtersets.py:1020 -#: ipam/filtersets.py:1154 virtualization/filtersets.py:273 +#: ipam/filtersets.py:587 ipam/filtersets.py:817 ipam/filtersets.py:1025 +#: virtualization/filtersets.py:276 virtualization/filtersets.py:315 +#: vpn/filtersets.py:362 msgid "Virtual machine (ID)" msgstr "" -#: ipam/filtersets.py:583 ipam/filtersets.py:1160 +#: ipam/filtersets.py:593 vpn/filtersets.py:97 vpn/filtersets.py:368 msgid "Interface (name)" msgstr "" -#: ipam/filtersets.py:588 ipam/filtersets.py:1165 +#: ipam/filtersets.py:598 vpn/filtersets.py:102 vpn/filtersets.py:373 msgid "Interface (ID)" msgstr "" -#: ipam/filtersets.py:594 ipam/filtersets.py:1171 +#: ipam/filtersets.py:604 vpn/filtersets.py:108 vpn/filtersets.py:379 msgid "VM interface (name)" msgstr "" -#: ipam/filtersets.py:599 +#: ipam/filtersets.py:609 vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "" -#: ipam/filtersets.py:604 +#: ipam/filtersets.py:614 msgid "FHRP group (ID)" msgstr "" -#: ipam/filtersets.py:608 +#: ipam/filtersets.py:618 msgid "Is assigned to an interface" msgstr "" -#: ipam/filtersets.py:612 +#: ipam/filtersets.py:622 msgid "Is assigned" msgstr "" -#: ipam/filtersets.py:1031 +#: ipam/filtersets.py:1036 msgid "IP address (ID)" msgstr "" -#: ipam/filtersets.py:1037 ipam/models/ip.py:786 +#: ipam/filtersets.py:1042 ipam/models/ip.py:787 msgid "IP address" msgstr "" -#: ipam/filtersets.py:1112 -msgid "L2VPN (slug)" +#: ipam/filtersets.py:1068 +msgid "Primary IPv4 (ID)" msgstr "" -#: ipam/filtersets.py:1176 -msgid "VM Interface (ID)" -msgstr "" - -#: ipam/filtersets.py:1182 -msgid "VLAN (name)" +#: ipam/filtersets.py:1073 +msgid "Primary IPv6 (ID)" msgstr "" #: ipam/forms/bulk_create.py:14 msgid "Address pattern" msgstr "" -#: ipam/forms/bulk_edit.py:87 +#: ipam/forms/bulk_edit.py:85 msgid "Is private" msgstr "" -#: ipam/forms/bulk_edit.py:108 ipam/forms/bulk_edit.py:137 -#: ipam/forms/bulk_edit.py:162 ipam/forms/bulk_import.py:91 -#: ipam/forms/bulk_import.py:111 ipam/forms/bulk_import.py:131 -#: ipam/forms/filtersets.py:113 ipam/forms/filtersets.py:128 -#: ipam/forms/filtersets.py:151 ipam/forms/model_forms.py:95 -#: ipam/forms/model_forms.py:110 ipam/forms/model_forms.py:132 -#: ipam/forms/model_forms.py:150 ipam/models/asns.py:31 ipam/models/asns.py:103 +#: ipam/forms/bulk_edit.py:106 ipam/forms/bulk_edit.py:135 +#: ipam/forms/bulk_edit.py:160 ipam/forms/bulk_import.py:88 +#: ipam/forms/bulk_import.py:108 ipam/forms/bulk_import.py:128 +#: ipam/forms/filtersets.py:109 ipam/forms/filtersets.py:124 +#: ipam/forms/filtersets.py:147 ipam/forms/model_forms.py:93 +#: ipam/forms/model_forms.py:108 ipam/forms/model_forms.py:130 +#: ipam/forms/model_forms.py:148 ipam/models/asns.py:31 ipam/models/asns.py:103 #: ipam/models/ip.py:70 ipam/models/ip.py:89 ipam/tables/asn.py:20 #: ipam/tables/asn.py:45 templates/ipam/aggregate.html:19 #: templates/ipam/asn.html:28 templates/ipam/asnrange.html:20 @@ -7280,44 +7499,44 @@ msgstr "" msgid "RIR" msgstr "" -#: ipam/forms/bulk_edit.py:170 +#: ipam/forms/bulk_edit.py:168 msgid "Date added" msgstr "" -#: ipam/forms/bulk_edit.py:231 +#: ipam/forms/bulk_edit.py:229 msgid "Prefix length" msgstr "" -#: ipam/forms/bulk_edit.py:254 ipam/forms/filtersets.py:240 +#: ipam/forms/bulk_edit.py:252 ipam/forms/filtersets.py:236 #: templates/ipam/prefix.html:86 msgid "Is a pool" msgstr "" -#: ipam/forms/bulk_edit.py:259 ipam/forms/bulk_edit.py:303 +#: ipam/forms/bulk_edit.py:257 ipam/forms/bulk_edit.py:301 #: ipam/models/ip.py:271 ipam/models/ip.py:538 #, python-format msgid "Treat as 100% utilized" msgstr "" -#: ipam/forms/bulk_edit.py:351 ipam/models/ip.py:771 +#: ipam/forms/bulk_edit.py:349 ipam/models/ip.py:771 msgid "DNS name" msgstr "" -#: ipam/forms/bulk_edit.py:372 ipam/forms/bulk_edit.py:571 -#: ipam/forms/bulk_import.py:396 ipam/forms/bulk_import.py:480 -#: ipam/forms/bulk_import.py:506 ipam/forms/filtersets.py:379 -#: ipam/forms/filtersets.py:513 templates/ipam/fhrpgroup.html:23 +#: ipam/forms/bulk_edit.py:370 ipam/forms/bulk_edit.py:569 +#: ipam/forms/bulk_import.py:393 ipam/forms/bulk_import.py:477 +#: ipam/forms/bulk_import.py:503 ipam/forms/filtersets.py:376 +#: ipam/forms/filtersets.py:511 templates/ipam/fhrpgroup.html:23 #: templates/ipam/inc/panels/fhrp_groups.html:11 templates/ipam/service.html:35 #: templates/ipam/servicetemplate.html:20 msgid "Protocol" msgstr "" -#: ipam/forms/bulk_edit.py:379 ipam/forms/filtersets.py:386 +#: ipam/forms/bulk_edit.py:377 ipam/forms/filtersets.py:383 #: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:27 msgid "Group ID" msgstr "" -#: ipam/forms/bulk_edit.py:384 ipam/forms/filtersets.py:391 +#: ipam/forms/bulk_edit.py:382 ipam/forms/filtersets.py:388 #: wireless/forms/bulk_edit.py:67 wireless/forms/bulk_edit.py:114 #: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 #: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 @@ -7325,12 +7544,12 @@ msgstr "" msgid "Authentication type" msgstr "" -#: ipam/forms/bulk_edit.py:389 ipam/forms/filtersets.py:395 +#: ipam/forms/bulk_edit.py:387 ipam/forms/filtersets.py:392 msgid "Authentication key" msgstr "" -#: ipam/forms/bulk_edit.py:406 ipam/forms/filtersets.py:372 -#: ipam/forms/model_forms.py:457 netbox/navigation/menu.py:356 +#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:369 +#: ipam/forms/model_forms.py:455 netbox/navigation/menu.py:376 #: templates/ipam/fhrpgroup.html:51 #: templates/wireless/inc/authentication_attrs.html:5 #: wireless/forms/bulk_edit.py:90 wireless/forms/bulk_edit.py:137 @@ -7339,364 +7558,333 @@ msgstr "" msgid "Authentication" msgstr "" -#: ipam/forms/bulk_edit.py:416 +#: ipam/forms/bulk_edit.py:414 msgid "Minimum child VLAN VID" msgstr "" -#: ipam/forms/bulk_edit.py:422 +#: ipam/forms/bulk_edit.py:420 msgid "Maximum child VLAN VID" msgstr "" -#: ipam/forms/bulk_edit.py:430 ipam/forms/model_forms.py:529 +#: ipam/forms/bulk_edit.py:428 ipam/forms/model_forms.py:527 msgid "Scope type" msgstr "" -#: ipam/forms/bulk_edit.py:491 ipam/forms/model_forms.py:602 +#: ipam/forms/bulk_edit.py:489 ipam/forms/model_forms.py:600 #: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:39 msgid "Scope" msgstr "" -#: ipam/forms/bulk_edit.py:562 +#: ipam/forms/bulk_edit.py:560 msgid "Site & Group" msgstr "" -#: ipam/forms/bulk_edit.py:576 ipam/forms/model_forms.py:665 -#: ipam/forms/model_forms.py:699 ipam/tables/services.py:19 +#: ipam/forms/bulk_edit.py:574 ipam/forms/model_forms.py:663 +#: ipam/forms/model_forms.py:697 ipam/tables/services.py:19 #: ipam/tables/services.py:49 templates/ipam/service.html:39 #: templates/ipam/servicetemplate.html:24 msgid "Ports" msgstr "" -#: ipam/forms/bulk_import.py:50 +#: ipam/forms/bulk_import.py:47 msgid "Import route targets" msgstr "" -#: ipam/forms/bulk_import.py:56 +#: ipam/forms/bulk_import.py:53 msgid "Export route targets" msgstr "" -#: ipam/forms/bulk_import.py:94 ipam/forms/bulk_import.py:114 -#: ipam/forms/bulk_import.py:134 +#: ipam/forms/bulk_import.py:91 ipam/forms/bulk_import.py:111 +#: ipam/forms/bulk_import.py:131 msgid "Assigned RIR" msgstr "" -#: ipam/forms/bulk_import.py:184 +#: ipam/forms/bulk_import.py:181 msgid "VLAN's group (if any)" msgstr "" -#: ipam/forms/bulk_import.py:187 ipam/forms/bulk_import.py:564 -#: ipam/forms/filtersets.py:603 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:804 ipam/models/vlans.py:213 ipam/tables/ip.py:254 -#: templates/ipam/l2vpntermination_edit.html:17 templates/ipam/prefix.html:61 -#: templates/ipam/vlan.html:12 templates/ipam/vlan/base.html:6 -#: templates/ipam/vlan_edit.html:10 templates/wireless/wirelesslan.html:31 +#: ipam/forms/bulk_import.py:184 ipam/forms/model_forms.py:219 +#: ipam/models/vlans.py:214 ipam/tables/ip.py:254 templates/ipam/prefix.html:61 +#: templates/ipam/vlan.html:13 templates/ipam/vlan/base.html:6 +#: templates/ipam/vlan_edit.html:10 templates/vpn/l2vpntermination_edit.html:17 +#: templates/wireless/wirelesslan.html:31 vpn/forms/bulk_import.py:299 +#: vpn/forms/filtersets.py:280 vpn/forms/model_forms.py:427 #: wireless/forms/bulk_edit.py:54 wireless/forms/bulk_import.py:48 #: wireless/forms/model_forms.py:49 wireless/models.py:101 msgid "VLAN" msgstr "" -#: ipam/forms/bulk_import.py:310 +#: ipam/forms/bulk_import.py:307 msgid "Parent device of assigned interface (if any)" msgstr "" -#: ipam/forms/bulk_import.py:313 ipam/forms/bulk_import.py:499 -#: ipam/forms/bulk_import.py:550 ipam/forms/model_forms.py:693 -#: virtualization/filtersets.py:279 virtualization/forms/bulk_edit.py:197 -#: virtualization/forms/bulk_import.py:145 -#: virtualization/forms/filtersets.py:200 -#: virtualization/forms/model_forms.py:280 +#: ipam/forms/bulk_import.py:310 ipam/forms/bulk_import.py:496 +#: ipam/forms/model_forms.py:691 virtualization/filtersets.py:282 +#: virtualization/filtersets.py:321 virtualization/forms/bulk_edit.py:199 +#: virtualization/forms/bulk_edit.py:325 +#: virtualization/forms/bulk_import.py:146 +#: virtualization/forms/bulk_import.py:207 +#: virtualization/forms/filtersets.py:204 +#: virtualization/forms/filtersets.py:240 +#: virtualization/forms/model_forms.py:291 vpn/forms/bulk_import.py:93 +#: vpn/forms/bulk_import.py:285 msgid "Virtual machine" msgstr "" -#: ipam/forms/bulk_import.py:317 +#: ipam/forms/bulk_import.py:314 msgid "Parent VM of assigned interface (if any)" msgstr "" -#: ipam/forms/bulk_import.py:324 +#: ipam/forms/bulk_import.py:321 msgid "Assigned interface" msgstr "" -#: ipam/forms/bulk_import.py:327 +#: ipam/forms/bulk_import.py:324 msgid "Is primary" msgstr "" -#: ipam/forms/bulk_import.py:328 +#: ipam/forms/bulk_import.py:325 msgid "Make this the primary IP for the assigned device" msgstr "" -#: ipam/forms/bulk_import.py:367 +#: ipam/forms/bulk_import.py:364 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" -#: ipam/forms/bulk_import.py:371 +#: ipam/forms/bulk_import.py:368 msgid "No interface specified; cannot set as primary IP" msgstr "" -#: ipam/forms/bulk_import.py:400 +#: ipam/forms/bulk_import.py:397 msgid "Auth type" msgstr "" -#: ipam/forms/bulk_import.py:415 +#: ipam/forms/bulk_import.py:412 msgid "Scope type (app & model)" msgstr "" -#: ipam/forms/bulk_import.py:421 +#: ipam/forms/bulk_import.py:418 #, python-brace-format msgid "Minimum child VLAN VID (default: {minimum})" msgstr "" -#: ipam/forms/bulk_import.py:427 +#: ipam/forms/bulk_import.py:424 #, python-brace-format msgid "Maximum child VLAN VID (default: {maximum})" msgstr "" -#: ipam/forms/bulk_import.py:451 +#: ipam/forms/bulk_import.py:448 msgid "Assigned VLAN group" msgstr "" -#: ipam/forms/bulk_import.py:482 ipam/forms/bulk_import.py:508 +#: ipam/forms/bulk_import.py:479 ipam/forms/bulk_import.py:505 msgid "IP protocol" msgstr "" -#: ipam/forms/bulk_import.py:496 +#: ipam/forms/bulk_import.py:493 msgid "Required if not assigned to a VM" msgstr "" -#: ipam/forms/bulk_import.py:503 +#: ipam/forms/bulk_import.py:500 msgid "Required if not assigned to a device" msgstr "" -#: ipam/forms/bulk_import.py:526 -msgid "L2VPN type" +#: ipam/forms/bulk_import.py:525 +#, python-brace-format +msgid "{ip} is not assigned to this device/VM." msgstr "" -#: ipam/forms/bulk_import.py:547 -msgid "Parent device (for interface)" -msgstr "" - -#: ipam/forms/bulk_import.py:554 -msgid "Parent virtual machine (for interface)" -msgstr "" - -#: ipam/forms/bulk_import.py:561 -msgid "Assigned interface (device or VM)" -msgstr "" - -#: ipam/forms/bulk_import.py:594 -msgid "Cannot import device and VM interface terminations simultaneously." -msgstr "" - -#: ipam/forms/bulk_import.py:596 -msgid "Each termination must specify either an interface or a VLAN." -msgstr "" - -#: ipam/forms/bulk_import.py:598 -msgid "Cannot assign both an interface and a VLAN." -msgstr "" - -#: ipam/forms/filtersets.py:50 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:780 netbox/navigation/menu.py:177 +#: ipam/forms/filtersets.py:46 ipam/forms/model_forms.py:60 +#: netbox/navigation/menu.py:177 vpn/forms/model_forms.py:403 msgid "Route Targets" msgstr "" -#: ipam/forms/filtersets.py:56 ipam/forms/filtersets.py:544 -#: ipam/forms/model_forms.py:49 ipam/forms/model_forms.py:767 +#: ipam/forms/filtersets.py:52 ipam/forms/model_forms.py:47 +#: vpn/forms/filtersets.py:221 vpn/forms/model_forms.py:390 msgid "Import targets" msgstr "" -#: ipam/forms/filtersets.py:61 ipam/forms/filtersets.py:549 -#: ipam/forms/model_forms.py:54 ipam/forms/model_forms.py:772 +#: ipam/forms/filtersets.py:57 ipam/forms/model_forms.py:52 +#: vpn/forms/filtersets.py:226 vpn/forms/model_forms.py:395 msgid "Export targets" msgstr "" -#: ipam/forms/filtersets.py:76 +#: ipam/forms/filtersets.py:72 msgid "Imported by VRF" msgstr "" -#: ipam/forms/filtersets.py:81 +#: ipam/forms/filtersets.py:77 msgid "Exported by VRF" msgstr "" -#: ipam/forms/filtersets.py:90 ipam/tables/ip.py:89 templates/ipam/rir.html:33 +#: ipam/forms/filtersets.py:86 ipam/tables/ip.py:89 templates/ipam/rir.html:33 msgid "Private" msgstr "" -#: ipam/forms/filtersets.py:108 ipam/forms/filtersets.py:190 -#: ipam/forms/filtersets.py:265 ipam/forms/filtersets.py:315 +#: ipam/forms/filtersets.py:104 ipam/forms/filtersets.py:186 +#: ipam/forms/filtersets.py:261 ipam/forms/filtersets.py:312 msgid "Address family" msgstr "" -#: ipam/forms/filtersets.py:122 templates/ipam/asnrange.html:26 +#: ipam/forms/filtersets.py:118 templates/ipam/asnrange.html:26 msgid "Range" msgstr "" -#: ipam/forms/filtersets.py:131 +#: ipam/forms/filtersets.py:127 msgid "Start" msgstr "" -#: ipam/forms/filtersets.py:135 +#: ipam/forms/filtersets.py:131 msgid "End" msgstr "" -#: ipam/forms/filtersets.py:185 +#: ipam/forms/filtersets.py:181 msgid "Search within" msgstr "" -#: ipam/forms/filtersets.py:206 ipam/forms/filtersets.py:331 +#: ipam/forms/filtersets.py:202 ipam/forms/filtersets.py:328 msgid "Present in VRF" msgstr "" -#: ipam/forms/filtersets.py:247 ipam/forms/filtersets.py:286 +#: ipam/forms/filtersets.py:243 ipam/forms/filtersets.py:282 #, python-format msgid "Marked as 100% utilized" msgstr "" -#: ipam/forms/filtersets.py:301 +#: ipam/forms/filtersets.py:297 msgid "Device/VM" msgstr "" -#: ipam/forms/filtersets.py:336 +#: ipam/forms/filtersets.py:333 msgid "Assigned Device" msgstr "" -#: ipam/forms/filtersets.py:341 +#: ipam/forms/filtersets.py:338 msgid "Assigned VM" msgstr "" -#: ipam/forms/filtersets.py:355 +#: ipam/forms/filtersets.py:352 msgid "Assigned to an interface" msgstr "" -#: ipam/forms/filtersets.py:362 templates/ipam/ipaddress.html:54 +#: ipam/forms/filtersets.py:359 templates/ipam/ipaddress.html:54 msgid "DNS Name" msgstr "" -#: ipam/forms/filtersets.py:404 ipam/forms/filtersets.py:496 -#: ipam/models/vlans.py:154 templates/ipam/vlan.html:34 +#: ipam/forms/filtersets.py:401 ipam/forms/filtersets.py:494 +#: ipam/models/vlans.py:156 templates/ipam/vlan.html:34 msgid "VLAN ID" msgstr "" -#: ipam/forms/filtersets.py:436 +#: ipam/forms/filtersets.py:433 msgid "Minimum VID" msgstr "" -#: ipam/forms/filtersets.py:442 +#: ipam/forms/filtersets.py:439 msgid "Maximum VID" msgstr "" -#: ipam/forms/filtersets.py:518 +#: ipam/forms/filtersets.py:516 msgid "Port" msgstr "" -#: ipam/forms/filtersets.py:558 ipam/tables/ip.py:424 -#: templates/ipam/l2vpntermination.html:19 -msgid "Assigned Object" -msgstr "" - -#: ipam/forms/filtersets.py:570 -msgid "Assigned Object Type" -msgstr "" - -#: ipam/forms/filtersets.py:612 ipam/tables/vlans.py:191 -#: templates/ipam/ipaddress_edit.html:47 -#: templates/ipam/l2vpntermination_edit.html:27 -#: templates/ipam/service_create.html:22 templates/ipam/service_edit.html:21 +#: ipam/forms/filtersets.py:537 ipam/tables/vlans.py:191 +#: templates/ipam/ipaddress_edit.html:47 templates/ipam/service_create.html:22 +#: templates/ipam/service_edit.html:21 +#: templates/virtualization/virtualdisk.html:22 #: templates/virtualization/virtualmachine.html:13 #: templates/virtualization/vminterface.html:24 -#: virtualization/forms/filtersets.py:186 -#: virtualization/forms/model_forms.py:221 -#: virtualization/tables/virtualmachines.py:110 +#: templates/vpn/l2vpntermination_edit.html:27 +#: templates/vpn/tunneltermination.html:26 +#: virtualization/forms/filtersets.py:189 +#: virtualization/forms/filtersets.py:234 +#: virtualization/forms/model_forms.py:223 +#: virtualization/tables/virtualmachines.py:115 +#: virtualization/tables/virtualmachines.py:168 vpn/choices.py:45 +#: vpn/forms/filtersets.py:289 vpn/forms/model_forms.py:161 +#: vpn/forms/model_forms.py:172 vpn/forms/model_forms.py:269 msgid "Virtual Machine" msgstr "" -#: ipam/forms/model_forms.py:115 ipam/tables/ip.py:116 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: ipam/forms/model_forms.py:113 ipam/tables/ip.py:116 +#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:39 msgid "Aggregate" msgstr "" -#: ipam/forms/model_forms.py:136 templates/ipam/asnrange.html:12 +#: ipam/forms/model_forms.py:134 templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "" -#: ipam/forms/model_forms.py:232 +#: ipam/forms/model_forms.py:230 msgid "Site/VLAN Assignment" msgstr "" -#: ipam/forms/model_forms.py:258 templates/ipam/iprange.html:11 +#: ipam/forms/model_forms.py:256 templates/ipam/iprange.html:11 msgid "IP Range" msgstr "" -#: ipam/forms/model_forms.py:287 ipam/forms/model_forms.py:456 +#: ipam/forms/model_forms.py:285 ipam/forms/model_forms.py:454 #: templates/ipam/fhrpgroup.html:19 templates/ipam/ipaddress_edit.html:52 msgid "FHRP Group" msgstr "" -#: ipam/forms/model_forms.py:302 +#: ipam/forms/model_forms.py:300 msgid "Make this the primary IP for the device/VM" msgstr "" -#: ipam/forms/model_forms.py:353 +#: ipam/forms/model_forms.py:351 msgid "An IP address can only be assigned to a single object." msgstr "" -#: ipam/forms/model_forms.py:359 ipam/models/ip.py:877 +#: ipam/forms/model_forms.py:357 ipam/models/ip.py:878 msgid "" "Cannot reassign IP address while it is designated as the primary IP for the " "parent object" msgstr "" -#: ipam/forms/model_forms.py:369 +#: ipam/forms/model_forms.py:367 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" -#: ipam/forms/model_forms.py:375 +#: ipam/forms/model_forms.py:373 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "" -#: ipam/forms/model_forms.py:381 +#: ipam/forms/model_forms.py:379 #, python-brace-format msgid "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "" -#: ipam/forms/model_forms.py:458 +#: ipam/forms/model_forms.py:456 msgid "Virtual IP Address" msgstr "" -#: ipam/forms/model_forms.py:600 ipam/forms/model_forms.py:639 +#: ipam/forms/model_forms.py:598 ipam/forms/model_forms.py:637 #: ipam/tables/ip.py:250 templates/ipam/vlan_edit.html:37 #: templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "" -#: ipam/forms/model_forms.py:601 +#: ipam/forms/model_forms.py:599 msgid "Child VLANs" msgstr "" -#: ipam/forms/model_forms.py:670 ipam/forms/model_forms.py:704 +#: ipam/forms/model_forms.py:668 ipam/forms/model_forms.py:702 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." msgstr "" -#: ipam/forms/model_forms.py:675 templates/ipam/servicetemplate.html:12 +#: ipam/forms/model_forms.py:673 templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "" -#: ipam/forms/model_forms.py:726 +#: ipam/forms/model_forms.py:724 msgid "Service template" msgstr "" -#: ipam/forms/model_forms.py:846 -msgid "A termination must specify an interface or VLAN." -msgstr "" - -#: ipam/forms/model_forms.py:848 -msgid "" -"A termination can only have one terminating object (an interface or VLAN)." -msgstr "" - #: ipam/models/asns.py:34 msgid "start" msgstr "" @@ -7722,39 +7910,39 @@ msgstr "" msgid "16- or 32-bit autonomous system number" msgstr "" -#: ipam/models/fhrp.py:23 +#: ipam/models/fhrp.py:22 msgid "group ID" msgstr "" -#: ipam/models/fhrp.py:31 ipam/models/services.py:22 +#: ipam/models/fhrp.py:30 ipam/models/services.py:22 msgid "protocol" msgstr "" -#: ipam/models/fhrp.py:39 wireless/models.py:27 +#: ipam/models/fhrp.py:38 wireless/models.py:27 msgid "authentication type" msgstr "" -#: ipam/models/fhrp.py:44 +#: ipam/models/fhrp.py:43 msgid "authentication key" msgstr "" -#: ipam/models/fhrp.py:57 +#: ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "" -#: ipam/models/fhrp.py:58 +#: ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "" -#: ipam/models/fhrp.py:94 tenancy/models/contacts.py:133 +#: ipam/models/fhrp.py:93 tenancy/models/contacts.py:134 msgid "priority" msgstr "" -#: ipam/models/fhrp.py:111 +#: ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "" -#: ipam/models/fhrp.py:112 +#: ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "" @@ -7808,7 +7996,7 @@ msgid "" "({aggregate})." msgstr "" -#: ipam/models/ip.py:199 ipam/models/ip.py:736 +#: ipam/models/ip.py:199 ipam/models/ip.py:736 vpn/models/tunnels.py:114 msgid "role" msgstr "" @@ -7852,12 +8040,12 @@ msgstr "" msgid "Cannot create prefix with /0 mask." msgstr "" -#: ipam/models/ip.py:323 ipam/models/ip.py:853 +#: ipam/models/ip.py:323 ipam/models/ip.py:854 #, python-brace-format msgid "VRF {vrf}" msgstr "" -#: ipam/models/ip.py:323 ipam/models/ip.py:853 +#: ipam/models/ip.py:323 ipam/models/ip.py:854 msgid "global table" msgstr "" @@ -7918,7 +8106,7 @@ msgstr "" msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "" -#: ipam/models/ip.py:710 tenancy/models/contacts.py:81 +#: ipam/models/ip.py:710 tenancy/models/contacts.py:82 msgid "address" msgstr "" @@ -7942,47 +8130,23 @@ msgstr "" msgid "Hostname or FQDN (not case-sensitive)" msgstr "" -#: ipam/models/ip.py:787 ipam/models/services.py:94 +#: ipam/models/ip.py:788 ipam/models/services.py:94 msgid "IP addresses" msgstr "" -#: ipam/models/ip.py:843 +#: ipam/models/ip.py:844 msgid "Cannot create IP address with /0 mask." msgstr "" -#: ipam/models/ip.py:855 +#: ipam/models/ip.py:856 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "" -#: ipam/models/ip.py:884 +#: ipam/models/ip.py:885 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "" -#: ipam/models/l2vpn.py:64 netbox/navigation/menu.py:205 -msgid "L2VPNs" -msgstr "" - -#: ipam/models/l2vpn.py:113 -msgid "L2VPN termination" -msgstr "" - -#: ipam/models/l2vpn.py:114 -msgid "L2VPN terminations" -msgstr "" - -#: ipam/models/l2vpn.py:132 -#, python-brace-format -msgid "L2VPN Termination already assigned ({assigned_object})" -msgstr "" - -#: ipam/models/l2vpn.py:144 -#, python-brace-format -msgid "" -"{l2vpn_type} L2VPNs cannot have more than two terminations; found " -"{terminations_count} already defined." -msgstr "" - #: ipam/models/services.py:33 msgid "port numbers" msgstr "" @@ -8016,72 +8180,72 @@ msgstr "" msgid "A service must be associated with either a device or a virtual machine." msgstr "" -#: ipam/models/vlans.py:50 +#: ipam/models/vlans.py:49 msgid "minimum VLAN ID" msgstr "" -#: ipam/models/vlans.py:56 +#: ipam/models/vlans.py:55 msgid "Lowest permissible ID of a child VLAN" msgstr "" -#: ipam/models/vlans.py:59 +#: ipam/models/vlans.py:58 msgid "maximum VLAN ID" msgstr "" -#: ipam/models/vlans.py:65 +#: ipam/models/vlans.py:64 msgid "Highest permissible ID of a child VLAN" msgstr "" -#: ipam/models/vlans.py:83 +#: ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "" -#: ipam/models/vlans.py:93 +#: ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "" -#: ipam/models/vlans.py:95 +#: ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "" -#: ipam/models/vlans.py:100 +#: ipam/models/vlans.py:102 msgid "Maximum child VID must be greater than or equal to minimum child VID" msgstr "" -#: ipam/models/vlans.py:143 +#: ipam/models/vlans.py:145 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "" -#: ipam/models/vlans.py:151 +#: ipam/models/vlans.py:153 msgid "VLAN group (optional)" msgstr "" -#: ipam/models/vlans.py:159 +#: ipam/models/vlans.py:161 msgid "Numeric VLAN ID (1-4094)" msgstr "" -#: ipam/models/vlans.py:177 +#: ipam/models/vlans.py:179 msgid "Operational status of this VLAN" msgstr "" -#: ipam/models/vlans.py:185 +#: ipam/models/vlans.py:187 msgid "The primary function of this VLAN" msgstr "" -#: ipam/models/vlans.py:214 ipam/tables/ip.py:175 ipam/tables/vlans.py:78 -#: ipam/views.py:942 netbox/navigation/menu.py:181 +#: ipam/models/vlans.py:215 ipam/tables/ip.py:175 ipam/tables/vlans.py:78 +#: ipam/views.py:940 netbox/navigation/menu.py:181 #: netbox/navigation/menu.py:183 msgid "VLANs" msgstr "" -#: ipam/models/vlans.py:229 +#: ipam/models/vlans.py:230 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " "site {site}." msgstr "" -#: ipam/models/vlans.py:237 +#: ipam/models/vlans.py:238 #, python-brace-format msgid "VID must be between {minimum} and {maximum} for VLANs in group {group}" msgstr "" @@ -8119,15 +8283,15 @@ msgstr "" msgid "route targets" msgstr "" -#: ipam/tables/asn.py:51 +#: ipam/tables/asn.py:52 msgid "ASDOT" msgstr "" -#: ipam/tables/asn.py:56 +#: ipam/tables/asn.py:57 msgid "Site Count" msgstr "" -#: ipam/tables/asn.py:61 +#: ipam/tables/asn.py:62 msgid "Provider Count" msgstr "" @@ -8141,13 +8305,13 @@ msgid "Added" msgstr "" #: ipam/tables/ip.py:127 ipam/tables/ip.py:165 ipam/tables/vlans.py:138 -#: ipam/views.py:351 netbox/navigation/menu.py:153 +#: ipam/views.py:349 netbox/navigation/menu.py:153 #: netbox/navigation/menu.py:155 templates/ipam/vlan.html:87 msgid "Prefixes" msgstr "" #: ipam/tables/ip.py:130 ipam/tables/ip.py:267 ipam/tables/ip.py:320 -#: ipam/tables/vlans.py:82 templates/dcim/device.html:280 +#: ipam/tables/vlans.py:82 templates/dcim/device.html:263 #: templates/ipam/aggregate.html:25 templates/ipam/iprange.html:32 #: templates/ipam/prefix.html:100 msgid "Utilization" @@ -8165,10 +8329,6 @@ msgstr "" msgid "Depth" msgstr "" -#: ipam/tables/ip.py:233 -msgid "Children" -msgstr "" - #: ipam/tables/ip.py:261 msgid "Pool" msgstr "" @@ -8193,20 +8353,9 @@ msgstr "" msgid "Assigned" msgstr "" -#: ipam/tables/l2vpn.py:27 ipam/tables/vrfs.py:36 -msgid "Import Targets" -msgstr "" - -#: ipam/tables/l2vpn.py:32 ipam/tables/vrfs.py:41 -msgid "Export Targets" -msgstr "" - -#: ipam/tables/l2vpn.py:69 -msgid "Object Parent" -msgstr "" - -#: ipam/tables/l2vpn.py:74 -msgid "Object Site" +#: ipam/tables/ip.py:424 templates/vpn/l2vpntermination.html:19 +#: vpn/forms/filtersets.py:235 +msgid "Assigned Object" msgstr "" #: ipam/tables/vlans.py:68 @@ -8226,27 +8375,35 @@ msgstr "" msgid "Unique" msgstr "" -#: ipam/views.py:538 +#: ipam/tables/vrfs.py:36 vpn/tables/l2vpn.py:27 +msgid "Import Targets" +msgstr "" + +#: ipam/tables/vrfs.py:41 vpn/tables/l2vpn.py:32 +msgid "Export Targets" +msgstr "" + +#: ipam/views.py:536 msgid "Child Prefixes" msgstr "" -#: ipam/views.py:573 +#: ipam/views.py:571 msgid "Child Ranges" msgstr "" -#: ipam/views.py:870 +#: ipam/views.py:868 msgid "Related IPs" msgstr "" -#: ipam/views.py:1093 +#: ipam/views.py:1091 msgid "Device Interfaces" msgstr "" -#: ipam/views.py:1111 +#: ipam/views.py:1109 msgid "VM Interfaces" msgstr "" -#: netbox/config/parameters.py:22 templates/extras/configrevision.html:111 +#: netbox/config/parameters.py:22 templates/core/configrevision.html:111 msgid "Login banner" msgstr "" @@ -8254,7 +8411,7 @@ msgstr "" msgid "Additional content to display on the login page" msgstr "" -#: netbox/config/parameters.py:33 templates/extras/configrevision.html:115 +#: netbox/config/parameters.py:33 templates/core/configrevision.html:115 msgid "Maintenance banner" msgstr "" @@ -8262,7 +8419,7 @@ msgstr "" msgid "Additional content to display when in maintenance mode" msgstr "" -#: netbox/config/parameters.py:44 templates/extras/configrevision.html:119 +#: netbox/config/parameters.py:44 templates/core/configrevision.html:119 msgid "Top banner" msgstr "" @@ -8270,7 +8427,7 @@ msgstr "" msgid "Additional content to display at the top of every page" msgstr "" -#: netbox/config/parameters.py:55 templates/extras/configrevision.html:123 +#: netbox/config/parameters.py:55 templates/core/configrevision.html:123 msgid "Bottom banner" msgstr "" @@ -8286,7 +8443,7 @@ msgstr "" msgid "Enforce unique IP addressing within the global table" msgstr "" -#: netbox/config/parameters.py:75 templates/extras/configrevision.html:87 +#: netbox/config/parameters.py:75 templates/core/configrevision.html:87 msgid "Prefer IPv4" msgstr "" @@ -8334,7 +8491,7 @@ msgstr "" msgid "Default max utilization for powerfeeds" msgstr "" -#: netbox/config/parameters.py:123 templates/extras/configrevision.html:99 +#: netbox/config/parameters.py:123 templates/core/configrevision.html:99 msgid "Allowed URL schemes" msgstr "" @@ -8350,7 +8507,7 @@ msgstr "" msgid "Maximum page size" msgstr "" -#: netbox/config/parameters.py:150 templates/extras/configrevision.html:151 +#: netbox/config/parameters.py:150 templates/core/configrevision.html:151 msgid "Custom validators" msgstr "" @@ -8358,51 +8515,59 @@ msgstr "" msgid "Custom validation rules (JSON)" msgstr "" -#: netbox/config/parameters.py:164 +#: netbox/config/parameters.py:160 templates/core/configrevision.html:161 +msgid "Protection rules" +msgstr "" + +#: netbox/config/parameters.py:162 +msgid "Deletion protection rules (JSON)" +msgstr "" + +#: netbox/config/parameters.py:172 msgid "Default preferences" msgstr "" -#: netbox/config/parameters.py:166 +#: netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "" -#: netbox/config/parameters.py:173 templates/extras/configrevision.html:175 +#: netbox/config/parameters.py:181 templates/core/configrevision.html:197 msgid "Maintenance mode" msgstr "" -#: netbox/config/parameters.py:175 +#: netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "" -#: netbox/config/parameters.py:180 templates/extras/configrevision.html:179 +#: netbox/config/parameters.py:188 templates/core/configrevision.html:201 msgid "GraphQL enabled" msgstr "" -#: netbox/config/parameters.py:182 +#: netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "" -#: netbox/config/parameters.py:187 templates/extras/configrevision.html:183 +#: netbox/config/parameters.py:195 templates/core/configrevision.html:205 msgid "Changelog retention" msgstr "" -#: netbox/config/parameters.py:189 +#: netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" -#: netbox/config/parameters.py:194 +#: netbox/config/parameters.py:202 msgid "Job result retention" msgstr "" -#: netbox/config/parameters.py:196 +#: netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" -#: netbox/config/parameters.py:201 templates/extras/configrevision.html:191 +#: netbox/config/parameters.py:209 templates/core/configrevision.html:213 msgid "Maps URL" msgstr "" -#: netbox/config/parameters.py:203 +#: netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "" @@ -8434,35 +8599,35 @@ msgstr "" msgid "Id" msgstr "" -#: netbox/forms/base.py:107 +#: netbox/forms/base.py:105 msgid "Add tags" msgstr "" -#: netbox/forms/base.py:112 +#: netbox/forms/base.py:110 msgid "Remove tags" msgstr "" -#: netbox/models/features.py:422 +#: netbox/models/features.py:434 msgid "Remote data source" msgstr "" -#: netbox/models/features.py:432 +#: netbox/models/features.py:444 msgid "data path" msgstr "" -#: netbox/models/features.py:436 +#: netbox/models/features.py:448 msgid "Path to remote file (relative to data source root)" msgstr "" -#: netbox/models/features.py:439 +#: netbox/models/features.py:451 msgid "auto sync enabled" msgstr "" -#: netbox/models/features.py:441 +#: netbox/models/features.py:453 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "" -#: netbox/models/features.py:444 +#: netbox/models/features.py:456 msgid "date synced" msgstr "" @@ -8506,7 +8671,7 @@ msgstr "" msgid "Device Roles" msgstr "" -#: netbox/navigation/menu.py:68 templates/dcim/device.html:179 +#: netbox/navigation/menu.py:68 templates/dcim/device.html:162 #: templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "" @@ -8567,74 +8732,122 @@ msgstr "" msgid "Service Templates" msgstr "" -#: netbox/navigation/menu.py:192 templates/dcim/device.html:321 +#: netbox/navigation/menu.py:192 templates/dcim/device.html:304 #: templates/ipam/ipaddress.html:122 -#: templates/virtualization/virtualmachine.html:155 +#: templates/virtualization/virtualmachine.html:157 msgid "Services" msgstr "" #: netbox/navigation/menu.py:199 -msgid "Overlay" +msgid "VPN" msgstr "" -#: netbox/navigation/menu.py:206 templates/ipam/l2vpn.html:57 +#: netbox/navigation/menu.py:203 netbox/navigation/menu.py:205 +#: vpn/tables/tunnels.py:24 +msgid "Tunnels" +msgstr "" + +#: netbox/navigation/menu.py:206 templates/vpn/tunnelgroup.html:8 +msgid "Tunnel Groups" +msgstr "" + +#: netbox/navigation/menu.py:207 +msgid "Tunnel Terminations" +msgstr "" + +#: netbox/navigation/menu.py:211 netbox/navigation/menu.py:213 +#: vpn/models/l2vpn.py:64 +msgid "L2VPNs" +msgstr "" + +#: netbox/navigation/menu.py:214 templates/vpn/l2vpn.html:57 +#: templates/vpn/tunnel.html:73 vpn/tables/tunnels.py:54 msgid "Terminations" msgstr "" -#: netbox/navigation/menu.py:213 templates/dcim/device_edit.html:78 +#: netbox/navigation/menu.py:220 +msgid "IKE Proposals" +msgstr "" + +#: netbox/navigation/menu.py:221 templates/vpn/ikeproposal.html:42 +msgid "IKE Policies" +msgstr "" + +#: netbox/navigation/menu.py:222 +msgid "IPSec Proposals" +msgstr "" + +#: netbox/navigation/menu.py:223 templates/vpn/ipsecproposal.html:38 +msgid "IPSec Policies" +msgstr "" + +#: netbox/navigation/menu.py:224 templates/vpn/ikepolicy.html:39 +#: templates/vpn/ipsecpolicy.html:26 +msgid "IPSec Profiles" +msgstr "" + +#: netbox/navigation/menu.py:231 templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "" -#: netbox/navigation/menu.py:217 netbox/navigation/menu.py:219 +#: netbox/navigation/menu.py:235 netbox/navigation/menu.py:237 #: virtualization/views.py:186 msgid "Virtual Machines" msgstr "" -#: netbox/navigation/menu.py:227 +#: netbox/navigation/menu.py:239 +#: templates/virtualization/virtualmachine.html:177 +#: templates/virtualization/virtualmachine/base.html:32 +#: templates/virtualization/virtualmachine_list.html:21 +#: virtualization/tables/virtualmachines.py:90 virtualization/views.py:389 +msgid "Virtual Disks" +msgstr "" + +#: netbox/navigation/menu.py:246 msgid "Cluster Types" msgstr "" -#: netbox/navigation/menu.py:228 +#: netbox/navigation/menu.py:247 msgid "Cluster Groups" msgstr "" -#: netbox/navigation/menu.py:242 +#: netbox/navigation/menu.py:261 msgid "Circuit Types" msgstr "" -#: netbox/navigation/menu.py:246 netbox/navigation/menu.py:248 +#: netbox/navigation/menu.py:265 netbox/navigation/menu.py:267 msgid "Providers" msgstr "" -#: netbox/navigation/menu.py:249 templates/circuits/provider.html:53 +#: netbox/navigation/menu.py:268 templates/circuits/provider.html:53 msgid "Provider Accounts" msgstr "" -#: netbox/navigation/menu.py:250 +#: netbox/navigation/menu.py:269 msgid "Provider Networks" msgstr "" -#: netbox/navigation/menu.py:264 +#: netbox/navigation/menu.py:283 msgid "Power Panels" msgstr "" -#: netbox/navigation/menu.py:275 +#: netbox/navigation/menu.py:294 msgid "Configurations" msgstr "" -#: netbox/navigation/menu.py:277 +#: netbox/navigation/menu.py:296 msgid "Config Contexts" msgstr "" -#: netbox/navigation/menu.py:278 +#: netbox/navigation/menu.py:297 msgid "Config Templates" msgstr "" -#: netbox/navigation/menu.py:285 netbox/navigation/menu.py:289 +#: netbox/navigation/menu.py:304 netbox/navigation/menu.py:308 msgid "Customization" msgstr "" -#: netbox/navigation/menu.py:291 +#: netbox/navigation/menu.py:310 #: templates/circuits/circuittermination_edit.html:53 #: templates/dcim/cable_edit.html:77 templates/dcim/device_edit.html:103 #: templates/dcim/inventoryitem_edit.html:102 templates/dcim/rack_edit.html:81 @@ -8643,108 +8856,112 @@ msgstr "" #: templates/generic/bulk_edit.html:92 templates/htmx/form.html:32 #: templates/inc/panels/custom_fields.html:7 #: templates/ipam/ipaddress_bulk_add.html:35 -#: templates/ipam/ipaddress_edit.html:88 -#: templates/ipam/l2vpntermination_edit.html:51 -#: templates/ipam/service_create.html:75 templates/ipam/service_edit.html:62 -#: templates/ipam/vlan_edit.html:63 +#: templates/ipam/ipaddress_edit.html:88 templates/ipam/service_create.html:75 +#: templates/ipam/service_edit.html:62 templates/ipam/vlan_edit.html:63 +#: templates/tenancy/contactassignment_edit.html:31 +#: templates/vpn/l2vpntermination_edit.html:51 msgid "Custom Fields" msgstr "" -#: netbox/navigation/menu.py:292 +#: netbox/navigation/menu.py:311 msgid "Custom Field Choices" msgstr "" -#: netbox/navigation/menu.py:293 +#: netbox/navigation/menu.py:312 msgid "Custom Links" msgstr "" -#: netbox/navigation/menu.py:294 +#: netbox/navigation/menu.py:313 msgid "Export Templates" msgstr "" -#: netbox/navigation/menu.py:295 +#: netbox/navigation/menu.py:314 msgid "Saved Filters" msgstr "" -#: netbox/navigation/menu.py:297 +#: netbox/navigation/menu.py:316 msgid "Image Attachments" msgstr "" -#: netbox/navigation/menu.py:301 +#: netbox/navigation/menu.py:320 msgid "Reports & Scripts" msgstr "" -#: netbox/navigation/menu.py:321 +#: netbox/navigation/menu.py:340 msgid "Operations" msgstr "" -#: netbox/navigation/menu.py:325 +#: netbox/navigation/menu.py:344 msgid "Integrations" msgstr "" -#: netbox/navigation/menu.py:327 +#: netbox/navigation/menu.py:346 msgid "Data Sources" msgstr "" -#: netbox/navigation/menu.py:328 +#: netbox/navigation/menu.py:347 +msgid "Event Rules" +msgstr "" + +#: netbox/navigation/menu.py:348 msgid "Webhooks" msgstr "" -#: netbox/navigation/menu.py:332 netbox/navigation/menu.py:336 +#: netbox/navigation/menu.py:352 netbox/navigation/menu.py:356 #: netbox/views/generic/feature_views.py:151 #: templates/extras/report/base.html:37 templates/extras/script/base.html:36 msgid "Jobs" msgstr "" -#: netbox/navigation/menu.py:342 +#: netbox/navigation/menu.py:362 msgid "Logging" msgstr "" -#: netbox/navigation/menu.py:344 +#: netbox/navigation/menu.py:364 msgid "Journal Entries" msgstr "" -#: netbox/navigation/menu.py:345 templates/extras/objectchange.html:8 +#: netbox/navigation/menu.py:365 templates/extras/objectchange.html:8 #: templates/extras/objectchange_list.html:4 msgid "Change Log" msgstr "" -#: netbox/navigation/menu.py:352 templates/inc/profile_button.html:18 +#: netbox/navigation/menu.py:372 templates/inc/profile_button.html:18 msgid "Admin" msgstr "" -#: netbox/navigation/menu.py:361 templates/users/group.html:27 +#: netbox/navigation/menu.py:381 templates/users/group.html:27 #: users/forms/model_forms.py:242 users/forms/model_forms.py:255 #: users/forms/model_forms.py:309 users/tables.py:105 msgid "Users" msgstr "" -#: netbox/navigation/menu.py:384 users/forms/model_forms.py:182 +#: netbox/navigation/menu.py:404 users/forms/model_forms.py:182 #: users/forms/model_forms.py:195 users/forms/model_forms.py:314 #: users/tables.py:35 users/tables.py:109 msgid "Groups" msgstr "" -#: netbox/navigation/menu.py:406 templates/account/base.html:21 +#: netbox/navigation/menu.py:426 templates/account/base.html:21 #: templates/inc/profile_button.html:39 msgid "API Tokens" msgstr "" -#: netbox/navigation/menu.py:413 users/forms/model_forms.py:188 +#: netbox/navigation/menu.py:433 users/forms/model_forms.py:188 #: users/forms/model_forms.py:197 users/forms/model_forms.py:248 #: users/forms/model_forms.py:256 msgid "Permissions" msgstr "" -#: netbox/navigation/menu.py:425 +#: netbox/navigation/menu.py:445 msgid "Current Config" msgstr "" -#: netbox/navigation/menu.py:431 +#: netbox/navigation/menu.py:451 msgid "Config Revisions" msgstr "" -#: netbox/navigation/menu.py:471 templates/500.html:35 +#: netbox/navigation/menu.py:491 templates/500.html:35 #: templates/account/preferences.html:29 msgid "Plugins" msgstr "" @@ -8781,19 +8998,19 @@ msgstr "" msgid "Toggle Dropdown" msgstr "" -#: netbox/tables/columns.py:542 +#: netbox/tables/columns.py:542 templates/core/job.html:40 msgid "Error" msgstr "" -#: netbox/tables/tables.py:234 templates/generic/bulk_import.html:115 +#: netbox/tables/tables.py:243 templates/generic/bulk_import.html:115 msgid "Field" msgstr "" -#: netbox/tables/tables.py:237 +#: netbox/tables/tables.py:246 msgid "Value" msgstr "" -#: netbox/tables/tables.py:246 +#: netbox/tables/tables.py:259 msgid "No results found" msgstr "" @@ -8866,6 +9083,8 @@ msgid "Home Page" msgstr "" #: templates/account/base.html:7 templates/inc/profile_button.html:24 +#: vpn/forms/bulk_edit.py:256 vpn/forms/filtersets.py:186 +#: vpn/forms/model_forms.py:372 msgid "Profile" msgstr "" @@ -8878,10 +9097,10 @@ msgid "Change Password" msgstr "" #: templates/account/password.html:17 templates/account/preferences.html:82 +#: templates/core/configrevision_restore.html:80 #: templates/dcim/devicebay_populate.html:34 #: templates/dcim/virtualchassis_add_member.html:24 #: templates/dcim/virtualchassis_edit.html:104 -#: templates/extras/configrevision_restore.html:80 #: templates/extras/object_journal.html:26 templates/extras/script.html:36 #: templates/generic/bulk_add_component.html:55 #: templates/generic/bulk_delete.html:46 templates/generic/bulk_edit.html:125 @@ -8889,8 +9108,8 @@ msgstr "" #: templates/generic/bulk_import.html:97 templates/generic/bulk_remove.html:42 #: templates/generic/bulk_rename.html:44 #: templates/generic/confirmation_form.html:20 -#: templates/generic/object_edit.html:76 templates/htmx/delete_form.html:19 -#: templates/htmx/delete_form.html:21 templates/ipam/ipaddress_assign.html:31 +#: templates/generic/object_edit.html:76 templates/htmx/delete_form.html:53 +#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:31 #: templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "" @@ -8973,14 +9192,14 @@ msgstr "" #: templates/circuits/inc/circuit_termination.html:154 #: templates/dcim/devicebay.html:66 #: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/interface.html:302 templates/dcim/modulebay.html:79 -#: templates/extras/configcontext.html:73 +#: templates/dcim/interface.html:306 templates/dcim/modulebay.html:79 +#: templates/extras/configcontext.html:73 templates/extras/eventrule.html:84 #: templates/extras/htmx/script_result.html:54 #: templates/extras/object_configcontext.html:28 #: templates/extras/objectchange.html:128 -#: templates/extras/objectchange.html:145 templates/extras/webhook.html:122 -#: templates/extras/webhook.html:134 templates/extras/webhook.html:146 -#: templates/inc/panel_table.html:12 templates/inc/panels/comments.html:12 +#: templates/extras/objectchange.html:145 templates/extras/webhook.html:79 +#: templates/extras/webhook.html:91 templates/inc/panel_table.html:12 +#: templates/inc/panels/comments.html:12 #: templates/ipam/inc/panels/fhrp_groups.html:43 templates/users/group.html:32 #: templates/users/group.html:42 templates/users/objectpermission.html:81 #: templates/users/objectpermission.html:91 templates/users/user.html:56 @@ -8998,7 +9217,7 @@ msgstr "" #: templates/account/token.html:11 templates/account/token.html:19 #: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:123 +#: users/forms/filtersets.py:121 msgid "Token" msgstr "" @@ -9106,7 +9325,7 @@ msgstr "" #: templates/circuits/circuittermination_edit.html:9 #: templates/circuits/inc/circuit_termination.html:81 -#: templates/dcim/frontport.html:128 templates/dcim/interface.html:195 +#: templates/dcim/frontport.html:128 templates/dcim/interface.html:199 #: templates/dcim/rearport.html:118 msgid "Circuit Termination" msgstr "" @@ -9153,6 +9372,7 @@ msgstr "" #: templates/circuits/inc/circuit_termination.html:42 #: templates/dcim/cable.html:70 templates/dcim/cable.html:76 +#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:76 msgid "Termination" msgstr "" @@ -9170,7 +9390,7 @@ msgstr "" #: templates/circuits/inc/circuit_termination.html:59 #: templates/dcim/frontport.html:87 #: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:156 templates/dcim/rearport.html:83 +#: templates/dcim/interface.html:160 templates/dcim/rearport.html:83 msgid "Trace" msgstr "" @@ -9196,8 +9416,8 @@ msgstr "" #: templates/circuits/inc/circuit_termination.html:75 #: templates/dcim/consoleport.html:71 templates/dcim/consoleserverport.html:71 -#: templates/dcim/frontport.html:109 templates/dcim/interface.html:182 -#: templates/dcim/interface.html:202 templates/dcim/powerfeed.html:136 +#: templates/dcim/frontport.html:109 templates/dcim/interface.html:186 +#: templates/dcim/interface.html:206 templates/dcim/powerfeed.html:136 #: templates/dcim/poweroutlet.html:75 templates/dcim/poweroutlet.html:76 #: templates/dcim/powerport.html:77 templates/dcim/rearport.html:105 msgid "Connect" @@ -9206,7 +9426,7 @@ msgstr "" #: templates/circuits/inc/circuit_termination.html:79 #: templates/dcim/consoleport.html:78 templates/dcim/consoleserverport.html:78 #: templates/dcim/frontport.html:18 templates/dcim/frontport.html:122 -#: templates/dcim/interface.html:189 templates/dcim/inventoryitem_edit.html:49 +#: templates/dcim/interface.html:193 templates/dcim/inventoryitem_edit.html:49 #: templates/dcim/rearport.html:112 msgid "Front Port" msgstr "" @@ -9235,11 +9455,82 @@ msgstr "" msgid "Provider Account" msgstr "" +#: templates/core/configrevision.html:47 +msgid "Default unit height" +msgstr "" + +#: templates/core/configrevision.html:51 +msgid "Default unit width" +msgstr "" + +#: templates/core/configrevision.html:63 +msgid "Default voltage" +msgstr "" + +#: templates/core/configrevision.html:67 +msgid "Default amperage" +msgstr "" + +#: templates/core/configrevision.html:71 +msgid "Default max utilization" +msgstr "" + +#: templates/core/configrevision.html:83 +msgid "Enforce global unique" +msgstr "" + +#: templates/core/configrevision.html:135 +msgid "Paginate count" +msgstr "" + +#: templates/core/configrevision.html:139 +msgid "Max page size" +msgstr "" + +#: templates/core/configrevision.html:179 +msgid "Default user preferences" +msgstr "" + +#: templates/core/configrevision.html:209 +msgid "Job retention" +msgstr "" + +#: templates/core/configrevision.html:221 +msgid "Comment" +msgstr "" + +#: templates/core/configrevision_restore.html:8 +#: templates/core/configrevision_restore.html:43 +#: templates/core/configrevision_restore.html:79 +msgid "Restore" +msgstr "" + +#: templates/core/configrevision_restore.html:21 +msgid "Config revisions" +msgstr "" + +#: templates/core/configrevision_restore.html:54 +msgid "Parameter" +msgstr "" + +#: templates/core/configrevision_restore.html:55 +msgid "Current Value" +msgstr "" + +#: templates/core/configrevision_restore.html:56 +msgid "New Value" +msgstr "" + +#: templates/core/configrevision_restore.html:66 +msgid "Changed" +msgstr "" + #: templates/core/datafile.html:47 msgid "Last Updated" msgstr "" #: templates/core/datafile.html:51 templates/ipam/iprange.html:28 +#: templates/virtualization/virtualdisk.html:30 msgid "Size" msgstr "" @@ -9276,15 +9567,15 @@ msgstr "" msgid "Job" msgstr "" -#: templates/core/job.html:39 templates/extras/journalentry.html:29 +#: templates/core/job.html:45 templates/extras/journalentry.html:29 msgid "Created By" msgstr "" -#: templates/core/job.html:48 +#: templates/core/job.html:54 msgid "Scheduling" msgstr "" -#: templates/core/job.html:60 +#: templates/core/job.html:66 #, python-format msgid "every %(interval)s seconds" msgstr "" @@ -9369,7 +9660,7 @@ msgid "Rename Selected" msgstr "" #: templates/dcim/consoleport.html:67 templates/dcim/consoleserverport.html:67 -#: templates/dcim/frontport.html:105 templates/dcim/interface.html:178 +#: templates/dcim/frontport.html:105 templates/dcim/interface.html:182 #: templates/dcim/poweroutlet.html:73 templates/dcim/powerport.html:73 msgid "Not Connected" msgstr "" @@ -9379,85 +9670,85 @@ msgstr "" msgid "Console Server Port" msgstr "" -#: templates/dcim/device.html:52 +#: templates/dcim/device.html:35 msgid "Highlight device" msgstr "" -#: templates/dcim/device.html:74 +#: templates/dcim/device.html:57 msgid "Not racked" msgstr "" -#: templates/dcim/device.html:81 templates/dcim/site.html:109 +#: templates/dcim/device.html:64 templates/dcim/site.html:96 msgid "GPS Coordinates" msgstr "" -#: templates/dcim/device.html:87 templates/dcim/site.html:115 +#: templates/dcim/device.html:70 templates/dcim/site.html:102 msgid "Map It" msgstr "" -#: templates/dcim/device.html:127 templates/dcim/inventoryitem.html:57 +#: templates/dcim/device.html:110 templates/dcim/inventoryitem.html:57 #: templates/dcim/module.html:79 templates/dcim/modulebay.html:73 -#: templates/dcim/rack.html:69 +#: templates/dcim/rack.html:62 msgid "Asset Tag" msgstr "" -#: templates/dcim/device.html:170 +#: templates/dcim/device.html:153 msgid "View Virtual Chassis" msgstr "" -#: templates/dcim/device.html:187 +#: templates/dcim/device.html:170 msgid "Create VDC" msgstr "" -#: templates/dcim/device.html:196 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:224 +#: templates/dcim/device.html:179 templates/dcim/device_edit.html:64 +#: virtualization/forms/model_forms.py:226 msgid "Management" msgstr "" -#: templates/dcim/device.html:217 templates/dcim/device.html:233 +#: templates/dcim/device.html:200 templates/dcim/device.html:216 #: templates/virtualization/virtualmachine.html:56 #: templates/virtualization/virtualmachine.html:72 msgid "NAT for" msgstr "" -#: templates/dcim/device.html:219 templates/dcim/device.html:235 +#: templates/dcim/device.html:202 templates/dcim/device.html:218 #: templates/virtualization/virtualmachine.html:58 #: templates/virtualization/virtualmachine.html:74 msgid "NAT" msgstr "" -#: templates/dcim/device.html:271 templates/dcim/rack.html:77 +#: templates/dcim/device.html:254 templates/dcim/rack.html:70 msgid "Power Utilization" msgstr "" -#: templates/dcim/device.html:276 +#: templates/dcim/device.html:259 msgid "Input" msgstr "" -#: templates/dcim/device.html:277 +#: templates/dcim/device.html:260 msgid "Outlets" msgstr "" -#: templates/dcim/device.html:278 +#: templates/dcim/device.html:261 msgid "Allocated" msgstr "" -#: templates/dcim/device.html:287 templates/dcim/device.html:289 -#: templates/dcim/device.html:305 templates/dcim/powerfeed.html:70 +#: templates/dcim/device.html:270 templates/dcim/device.html:272 +#: templates/dcim/device.html:288 templates/dcim/powerfeed.html:70 msgid "VA" msgstr "" -#: templates/dcim/device.html:299 +#: templates/dcim/device.html:282 msgctxt "Leg of a power feed" msgid "Leg" msgstr "" -#: templates/dcim/device.html:329 -#: templates/virtualization/virtualmachine.html:163 +#: templates/dcim/device.html:312 +#: templates/virtualization/virtualmachine.html:165 msgid "Add a service" msgstr "" -#: templates/dcim/device.html:336 templates/dcim/rack.html:84 +#: templates/dcim/device.html:319 templates/dcim/rack.html:77 #: templates/dcim/rack_edit.html:38 msgid "Dimensions" msgstr "" @@ -9465,6 +9756,7 @@ msgstr "" #: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 #: templates/dcim/devicetype/base.html:18 templates/dcim/module.html:18 #: templates/dcim/moduletype/base.html:18 +#: templates/virtualization/virtualmachine/base.html:22 #: templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "" @@ -9502,7 +9794,6 @@ msgid "Hide Disconnected" msgstr "" #: templates/dcim/device/interfaces.html:28 -#: templates/virtualization/virtualmachine/base.html:21 msgid "Add Interfaces" msgstr "" @@ -9575,6 +9866,7 @@ msgstr "" #: templates/dcim/moduletype/component_templates.html:18 #: templates/generic/bulk_rename.html:34 #: templates/virtualization/virtualmachine/interfaces.html:11 +#: templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "" @@ -9658,7 +9950,7 @@ msgstr "" msgid "Rear Port Position" msgstr "" -#: templates/dcim/frontport.html:79 templates/dcim/interface.html:146 +#: templates/dcim/frontport.html:79 templates/dcim/interface.html:150 #: templates/dcim/poweroutlet.html:67 templates/dcim/powerport.html:67 #: templates/dcim/rearport.html:75 msgid "Marked as Connected" @@ -9735,40 +10027,40 @@ msgstr "" msgid "802.1Q Mode" msgstr "" -#: templates/dcim/interface.html:126 +#: templates/dcim/interface.html:130 #: templates/virtualization/vminterface.html:62 msgid "MAC Address" msgstr "" -#: templates/dcim/interface.html:153 +#: templates/dcim/interface.html:157 msgid "Wireless Link" msgstr "" -#: templates/dcim/interface.html:222 +#: templates/dcim/interface.html:226 vpn/choices.py:55 msgid "Peer" msgstr "" -#: templates/dcim/interface.html:234 +#: templates/dcim/interface.html:238 #: templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "" -#: templates/dcim/interface.html:243 +#: templates/dcim/interface.html:247 #: templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "" -#: templates/dcim/interface.html:246 templates/dcim/interface.html:254 -#: templates/dcim/interface.html:265 templates/dcim/interface.html:273 +#: templates/dcim/interface.html:250 templates/dcim/interface.html:258 +#: templates/dcim/interface.html:269 templates/dcim/interface.html:277 msgid "MHz" msgstr "" -#: templates/dcim/interface.html:262 +#: templates/dcim/interface.html:266 #: templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "" -#: templates/dcim/interface.html:291 templates/wireless/wirelesslan.html:15 +#: templates/dcim/interface.html:295 templates/wireless/wirelesslan.html:15 #: templates/wireless/wirelesslink.html:24 wireless/forms/bulk_edit.py:59 #: wireless/forms/bulk_edit.py:101 wireless/forms/filtersets.py:39 #: wireless/forms/filtersets.py:79 wireless/models.py:81 wireless/models.py:155 @@ -9776,18 +10068,18 @@ msgstr "" msgid "SSID" msgstr "" -#: templates/dcim/interface.html:312 +#: templates/dcim/interface.html:316 msgid "LAG Members" msgstr "" -#: templates/dcim/interface.html:331 +#: templates/dcim/interface.html:335 msgid "No member interfaces" msgstr "" -#: templates/dcim/interface.html:355 templates/ipam/fhrpgroup.html:80 +#: templates/dcim/interface.html:359 templates/ipam/fhrpgroup.html:80 #: templates/ipam/iprange/ip_addresses.html:7 #: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:92 +#: templates/virtualization/vminterface.html:96 msgid "Add IP Address" msgstr "" @@ -9820,11 +10112,11 @@ msgstr "" msgid "Child Locations" msgstr "" -#: templates/dcim/location.html:84 templates/dcim/site.html:150 +#: templates/dcim/location.html:84 templates/dcim/site.html:137 msgid "Add a Location" msgstr "" -#: templates/dcim/location.html:98 templates/dcim/site.html:164 +#: templates/dcim/location.html:98 templates/dcim/site.html:151 msgid "Add a Device" msgstr "" @@ -9874,47 +10166,47 @@ msgstr "" msgid "Allocated Draw" msgstr "" -#: templates/dcim/rack.html:73 +#: templates/dcim/rack.html:66 msgid "Space Utilization" msgstr "" -#: templates/dcim/rack.html:103 +#: templates/dcim/rack.html:96 msgid "descending" msgstr "" -#: templates/dcim/rack.html:103 +#: templates/dcim/rack.html:96 msgid "ascending" msgstr "" -#: templates/dcim/rack.html:106 +#: templates/dcim/rack.html:99 msgid "Starting Unit" msgstr "" -#: templates/dcim/rack.html:132 +#: templates/dcim/rack.html:125 msgid "Mounting Depth" msgstr "" -#: templates/dcim/rack.html:142 +#: templates/dcim/rack.html:135 msgid "Rack Weight" msgstr "" -#: templates/dcim/rack.html:152 templates/dcim/rack_edit.html:67 +#: templates/dcim/rack.html:145 templates/dcim/rack_edit.html:67 msgid "Maximum Weight" msgstr "" -#: templates/dcim/rack.html:162 +#: templates/dcim/rack.html:155 msgid "Total Weight" msgstr "" -#: templates/dcim/rack.html:180 templates/dcim/rack_elevation_list.html:16 +#: templates/dcim/rack.html:173 templates/dcim/rack_elevation_list.html:16 msgid "Images and Labels" msgstr "" -#: templates/dcim/rack.html:181 templates/dcim/rack_elevation_list.html:17 +#: templates/dcim/rack.html:174 templates/dcim/rack_elevation_list.html:17 msgid "Images only" msgstr "" -#: templates/dcim/rack.html:182 templates/dcim/rack_elevation_list.html:18 +#: templates/dcim/rack.html:175 templates/dcim/rack_elevation_list.html:18 msgid "Labels only" msgstr "" @@ -9974,31 +10266,31 @@ msgstr "" msgid "Add Region" msgstr "" -#: templates/dcim/site.html:69 +#: templates/dcim/site.html:56 msgid "Facility" msgstr "" -#: templates/dcim/site.html:77 +#: templates/dcim/site.html:64 msgid "Time Zone" msgstr "" -#: templates/dcim/site.html:80 +#: templates/dcim/site.html:67 msgid "UTC" msgstr "" -#: templates/dcim/site.html:81 +#: templates/dcim/site.html:68 msgid "Site time" msgstr "" -#: templates/dcim/site.html:88 +#: templates/dcim/site.html:75 msgid "Physical Address" msgstr "" -#: templates/dcim/site.html:94 +#: templates/dcim/site.html:81 msgid "Map" msgstr "" -#: templates/dcim/site.html:105 +#: templates/dcim/site.html:92 msgid "Shipping Address" msgstr "" @@ -10058,7 +10350,7 @@ msgid "" "chassis %(name)s?" msgstr "" -#: templates/dcim/virtualdevicecontext.html:29 templates/ipam/l2vpn.html:19 +#: templates/dcim/virtualdevicecontext.html:29 templates/vpn/l2vpn.html:19 msgid "Identifier" msgstr "" @@ -10158,6 +10450,8 @@ msgid "Author Email" msgstr "" #: templates/extras/admin/plugins_list.html:27 +#: templates/vpn/ipsecprofile.html:47 vpn/forms/bulk_edit.py:140 +#: vpn/forms/bulk_import.py:171 vpn/tables/crypto.py:61 msgid "Version" msgstr "" @@ -10179,76 +10473,6 @@ msgstr "" msgid "Sync Data" msgstr "" -#: templates/extras/configrevision.html:47 -msgid "Default unit height" -msgstr "" - -#: templates/extras/configrevision.html:51 -msgid "Default unit width" -msgstr "" - -#: templates/extras/configrevision.html:63 -msgid "Default voltage" -msgstr "" - -#: templates/extras/configrevision.html:67 -msgid "Default amperage" -msgstr "" - -#: templates/extras/configrevision.html:71 -msgid "Default max utilization" -msgstr "" - -#: templates/extras/configrevision.html:83 -msgid "Enforce global unique" -msgstr "" - -#: templates/extras/configrevision.html:135 -msgid "Paginate count" -msgstr "" - -#: templates/extras/configrevision.html:139 -msgid "Max page size" -msgstr "" - -#: templates/extras/configrevision.html:163 -msgid "Default user preferences" -msgstr "" - -#: templates/extras/configrevision.html:187 -msgid "Job retention" -msgstr "" - -#: templates/extras/configrevision.html:199 -msgid "Comment" -msgstr "" - -#: templates/extras/configrevision_restore.html:8 -#: templates/extras/configrevision_restore.html:43 -#: templates/extras/configrevision_restore.html:79 -msgid "Restore" -msgstr "" - -#: templates/extras/configrevision_restore.html:21 -msgid "Config revisions" -msgstr "" - -#: templates/extras/configrevision_restore.html:54 -msgid "Parameter" -msgstr "" - -#: templates/extras/configrevision_restore.html:55 -msgid "Current Value" -msgstr "" - -#: templates/extras/configrevision_restore.html:56 -msgid "New Value" -msgstr "" - -#: templates/extras/configrevision_restore.html:66 -msgid "Changed" -msgstr "" - #: templates/extras/configtemplate.html:58 msgid "Environment Parameters" msgstr "" @@ -10282,19 +10506,27 @@ msgstr "" msgid "Display Weight" msgstr "" -#: templates/extras/customfield.html:104 -msgid "Validation Rules" +#: templates/extras/customfield.html:82 +msgid "UI Visible" +msgstr "" + +#: templates/extras/customfield.html:86 +msgid "UI Editable" msgstr "" #: templates/extras/customfield.html:108 -msgid "Minimum Value" +msgid "Validation Rules" msgstr "" #: templates/extras/customfield.html:112 -msgid "Maximum Value" +msgid "Minimum Value" msgstr "" #: templates/extras/customfield.html:116 +msgid "Maximum Value" +msgstr "" + +#: templates/extras/customfield.html:120 msgid "Regular Expression" msgstr "" @@ -10303,7 +10535,7 @@ msgid "Button Class" msgstr "" #: templates/extras/customlink.html:41 templates/extras/exporttemplate.html:73 -#: templates/extras/savedfilter.html:41 templates/extras/webhook.html:102 +#: templates/extras/savedfilter.html:41 msgid "Assigned Models" msgstr "" @@ -10363,6 +10595,14 @@ msgstr "" msgid "HTTP" msgstr "" +#: templates/extras/eventrule.html:63 +msgid "Job start" +msgstr "" + +#: templates/extras/eventrule.html:67 +msgid "Job end" +msgstr "" + #: templates/extras/exporttemplate.html:29 msgid "MIME Type" msgstr "" @@ -10572,10 +10812,6 @@ msgstr "" msgid "Run Script" msgstr "" -#: templates/extras/script/base.html:29 -msgid "Script" -msgstr "" - #: templates/extras/script_list.html:44 #, python-format msgid "" @@ -10617,31 +10853,23 @@ msgstr "" msgid "Tagged Objects" msgstr "" -#: templates/extras/webhook.html:45 -msgid "Job start" -msgstr "" - -#: templates/extras/webhook.html:49 -msgid "Job end" -msgstr "" - -#: templates/extras/webhook.html:62 +#: templates/extras/webhook.html:33 msgid "HTTP Method" msgstr "" -#: templates/extras/webhook.html:70 +#: templates/extras/webhook.html:41 msgid "HTTP Content Type" msgstr "" -#: templates/extras/webhook.html:87 +#: templates/extras/webhook.html:58 msgid "SSL Verification" msgstr "" -#: templates/extras/webhook.html:128 +#: templates/extras/webhook.html:73 msgid "Additional Headers" msgstr "" -#: templates/extras/webhook.html:140 +#: templates/extras/webhook.html:85 msgid "Body Template" msgstr "" @@ -10868,6 +11096,10 @@ msgid "" "%(object_type)s %(object)s?" msgstr "" +#: templates/htmx/delete_form.html:17 +msgid "The following objects will be deleted as a result of this action." +msgstr "" + #: templates/htmx/object_selector.html:5 msgid "Select" msgstr "" @@ -10927,7 +11159,7 @@ msgid "Configure Table" msgstr "" #: templates/ipam/aggregate.html:15 templates/ipam/ipaddress.html:17 -#: templates/ipam/iprange.html:16 templates/ipam/prefix.html:15 +#: templates/ipam/iprange.html:16 templates/ipam/prefix.html:16 msgid "Family" msgstr "" @@ -10993,7 +11225,7 @@ msgid "Show All" msgstr "" #: templates/ipam/ipaddress.html:26 templates/ipam/iprange.html:48 -#: templates/ipam/prefix.html:24 +#: templates/ipam/prefix.html:25 msgid "Global" msgstr "" @@ -11037,18 +11269,6 @@ msgstr "" msgid "Marked fully utilized" msgstr "" -#: templates/ipam/l2vpn.html:11 templates/ipam/l2vpntermination.html:10 -msgid "L2VPN Attributes" -msgstr "" - -#: templates/ipam/l2vpn.html:65 -msgid "Add a Termination" -msgstr "" - -#: templates/ipam/l2vpntermination_edit.html:9 -msgid "L2VPN Termination" -msgstr "" - #: templates/ipam/prefix.html:112 msgid "Child IPs" msgstr "" @@ -11223,10 +11443,10 @@ msgid "" "Click here to attempt loading NetBox again." msgstr "" -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:123 -#: tenancy/forms/bulk_edit.py:136 tenancy/forms/filtersets.py:103 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:112 -#: tenancy/forms/model_forms.py:135 tenancy/tables/contacts.py:98 +#: templates/tenancy/contact.html:18 tenancy/filtersets.py:135 +#: tenancy/forms/bulk_edit.py:136 tenancy/forms/filtersets.py:101 +#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:109 +#: tenancy/forms/model_forms.py:132 tenancy/tables/contacts.py:98 msgid "Contact" msgstr "" @@ -11248,7 +11468,7 @@ msgid "Contact Assignment" msgstr "" #: templates/tenancy/contactgroup.html:19 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:79 +#: tenancy/forms/model_forms.py:76 msgid "Contact Group" msgstr "" @@ -11256,8 +11476,8 @@ msgstr "" msgid "Add Contact Group" msgstr "" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:128 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:93 +#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:140 +#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:90 msgid "Contact Role" msgstr "" @@ -11269,7 +11489,7 @@ msgstr "" msgid "Add Tenant" msgstr "" -#: templates/tenancy/tenantgroup.html:27 tenancy/forms/model_forms.py:34 +#: templates/tenancy/tenantgroup.html:27 tenancy/forms/model_forms.py:31 #: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "" @@ -11283,11 +11503,11 @@ msgid "Assigned Permissions" msgstr "" #: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:69 +#: templates/users/objectpermission.html:14 users/forms/filtersets.py:67 msgid "Permission" msgstr "" -#: templates/users/objectpermission.html:33 users/forms/filtersets.py:70 +#: templates/users/objectpermission.html:33 users/forms/filtersets.py:68 #: users/forms/model_forms.py:321 msgid "Actions" msgstr "" @@ -11323,12 +11543,13 @@ msgid "Memory" msgstr "" #: templates/virtualization/cluster.html:74 -#: templates/virtualization/virtualmachine.html:142 +#: templates/virtualization/virtualmachine.html:143 msgid "Disk Space" msgstr "" #: templates/virtualization/cluster.html:77 -#: templates/virtualization/virtualmachine.html:145 +#: templates/virtualization/virtualdisk.html:33 +#: templates/virtualization/virtualmachine.html:147 msgctxt "Abbreviation for gigabyte" msgid "GB" msgstr "" @@ -11364,22 +11585,169 @@ msgid "Add Cluster" msgstr "" #: templates/virtualization/clustergroup.html:20 -#: virtualization/forms/model_forms.py:50 +#: virtualization/forms/model_forms.py:51 msgid "Cluster Group" msgstr "" #: templates/virtualization/clustertype.html:20 #: templates/virtualization/virtualmachine.html:111 -#: virtualization/forms/model_forms.py:34 +#: virtualization/forms/model_forms.py:35 msgid "Cluster Type" msgstr "" +#: templates/virtualization/virtualdisk.html:18 +msgid "Virtual Disk" +msgstr "" + #: templates/virtualization/virtualmachine.html:124 -#: virtualization/forms/bulk_edit.py:187 -#: virtualization/forms/model_forms.py:225 +#: virtualization/forms/bulk_edit.py:189 +#: virtualization/forms/model_forms.py:227 msgid "Resources" msgstr "" +#: templates/virtualization/virtualmachine.html:185 +msgid "Add Virtual Disk" +msgstr "" + +#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:35 +#: vpn/tables/crypto.py:166 +msgid "IKE Policy" +msgstr "" + +#: templates/vpn/ikepolicy.html:22 +msgid "IKE Version" +msgstr "" + +#: templates/vpn/ikepolicy.html:30 +msgid "Pre-Shared Key" +msgstr "" + +#: templates/vpn/ikepolicy.html:34 +#: templates/wireless/inc/authentication_attrs.html:21 +msgid "Show Secret" +msgstr "" + +#: templates/vpn/ikepolicy.html:59 templates/vpn/ipsecpolicy.html:47 +#: templates/vpn/ipsecprofile.html:55 templates/vpn/ipsecprofile.html:82 +#: vpn/forms/model_forms.py:310 vpn/forms/model_forms.py:345 +#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +msgid "Proposals" +msgstr "" + +#: templates/vpn/ikeproposal.html:10 +msgid "IKE Proposal" +msgstr "" + +#: templates/vpn/ikeproposal.html:22 vpn/forms/bulk_edit.py:96 +#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:98 +msgid "Authentication method" +msgstr "" + +#: templates/vpn/ikeproposal.html:26 templates/vpn/ipsecproposal.html:22 +#: vpn/forms/bulk_edit.py:101 vpn/forms/bulk_edit.py:173 +#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:193 +#: vpn/forms/filtersets.py:103 vpn/forms/filtersets.py:151 +msgid "Encryption algorithm" +msgstr "" + +#: templates/vpn/ikeproposal.html:30 templates/vpn/ipsecproposal.html:26 +#: vpn/forms/bulk_edit.py:106 vpn/forms/bulk_edit.py:178 +#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:197 +#: vpn/forms/filtersets.py:108 vpn/forms/filtersets.py:156 +msgid "Authentication algorithm" +msgstr "" + +#: templates/vpn/ikeproposal.html:34 +msgid "DH group" +msgstr "" + +#: templates/vpn/ikeproposal.html:38 templates/vpn/ipsecproposal.html:30 +#: vpn/forms/bulk_edit.py:183 vpn/models/crypto.py:134 +msgid "SA lifetime (seconds)" +msgstr "" + +#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:70 +#: vpn/tables/crypto.py:170 +msgid "IPSec Policy" +msgstr "" + +#: templates/vpn/ipsecpolicy.html:22 vpn/forms/bulk_edit.py:211 +#: vpn/models/crypto.py:181 +msgid "PFS group" +msgstr "" + +#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:53 +msgid "IPSec Profile" +msgstr "" + +#: templates/vpn/ipsecprofile.html:94 vpn/tables/crypto.py:137 +msgid "PFS Group" +msgstr "" + +#: templates/vpn/ipsecproposal.html:10 +msgid "IPSec Proposal" +msgstr "" + +#: templates/vpn/ipsecproposal.html:34 vpn/forms/bulk_edit.py:187 +#: vpn/models/crypto.py:140 +msgid "SA lifetime (KB)" +msgstr "" + +#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:10 +msgid "L2VPN Attributes" +msgstr "" + +#: templates/vpn/l2vpn.html:65 templates/vpn/tunnel.html:81 +msgid "Add a Termination" +msgstr "" + +#: templates/vpn/l2vpntermination_edit.html:9 +msgid "L2VPN Termination" +msgstr "" + +#: templates/vpn/tunnel.html:9 +msgid "Add Termination" +msgstr "" + +#: templates/vpn/tunnel.html:38 vpn/forms/bulk_edit.py:48 +#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:56 +msgid "Encapsulation" +msgstr "" + +#: templates/vpn/tunnel.html:42 vpn/forms/bulk_edit.py:54 +#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:63 +#: vpn/models/crypto.py:238 vpn/tables/tunnels.py:47 +msgid "IPSec profile" +msgstr "" + +#: templates/vpn/tunnel.html:46 vpn/forms/bulk_edit.py:68 +#: vpn/forms/filtersets.py:67 +msgid "Tunnel ID" +msgstr "" + +#: templates/vpn/tunnelgroup.html:14 +msgid "Add Tunnel" +msgstr "" + +#: templates/vpn/tunnelgroup.html:24 vpn/forms/model_forms.py:35 +#: vpn/forms/model_forms.py:48 +msgid "Tunnel Group" +msgstr "" + +#: templates/vpn/tunneltermination.html:10 +msgid "Tunnel Termination" +msgstr "" + +#: templates/vpn/tunneltermination.html:36 vpn/forms/bulk_import.py:107 +#: vpn/forms/model_forms.py:101 vpn/forms/model_forms.py:137 +#: vpn/forms/model_forms.py:248 vpn/tables/tunnels.py:97 +msgid "Outside IP" +msgstr "" + +#: templates/vpn/tunneltermination.html:53 +msgid "Peer Terminations" +msgstr "" + #: templates/wireless/inc/authentication_attrs.html:13 msgid "Cipher" msgstr "" @@ -11388,10 +11756,6 @@ msgstr "" msgid "PSK" msgstr "" -#: templates/wireless/inc/authentication_attrs.html:21 -msgid "Show Secret" -msgstr "" - #: templates/wireless/inc/wirelesslink_interface.html:35 #: templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" @@ -11430,39 +11794,39 @@ msgstr "" msgid "Inactive" msgstr "" -#: tenancy/filtersets.py:30 tenancy/filtersets.py:56 +#: tenancy/filtersets.py:29 tenancy/filtersets.py:55 tenancy/filtersets.py:97 msgid "Contact group (ID)" msgstr "" -#: tenancy/filtersets.py:36 tenancy/filtersets.py:63 +#: tenancy/filtersets.py:35 tenancy/filtersets.py:62 tenancy/filtersets.py:104 msgid "Contact group (slug)" msgstr "" -#: tenancy/filtersets.py:92 +#: tenancy/filtersets.py:91 msgid "Contact (ID)" msgstr "" -#: tenancy/filtersets.py:96 +#: tenancy/filtersets.py:108 msgid "Contact role (ID)" msgstr "" -#: tenancy/filtersets.py:102 +#: tenancy/filtersets.py:114 msgid "Contact role (slug)" msgstr "" -#: tenancy/filtersets.py:134 +#: tenancy/filtersets.py:146 msgid "Contact group" msgstr "" -#: tenancy/filtersets.py:145 tenancy/filtersets.py:164 +#: tenancy/filtersets.py:157 tenancy/filtersets.py:176 msgid "Tenant group (ID)" msgstr "" -#: tenancy/filtersets.py:197 +#: tenancy/filtersets.py:209 msgid "Tenant Group (ID)" msgstr "" -#: tenancy/filtersets.py:204 +#: tenancy/filtersets.py:216 msgid "Tenant Group (slug)" msgstr "" @@ -11474,54 +11838,59 @@ msgstr "" msgid "Assigned contact" msgstr "" -#: tenancy/models/contacts.py:31 +#: tenancy/models/contacts.py:32 msgid "contact group" msgstr "" -#: tenancy/models/contacts.py:32 +#: tenancy/models/contacts.py:33 msgid "contact groups" msgstr "" -#: tenancy/models/contacts.py:47 +#: tenancy/models/contacts.py:48 msgid "contact role" msgstr "" -#: tenancy/models/contacts.py:48 +#: tenancy/models/contacts.py:49 msgid "contact roles" msgstr "" -#: tenancy/models/contacts.py:67 +#: tenancy/models/contacts.py:68 msgid "title" msgstr "" -#: tenancy/models/contacts.py:72 +#: tenancy/models/contacts.py:73 msgid "phone" msgstr "" -#: tenancy/models/contacts.py:77 +#: tenancy/models/contacts.py:78 msgid "email" msgstr "" -#: tenancy/models/contacts.py:86 +#: tenancy/models/contacts.py:87 msgid "link" msgstr "" -#: tenancy/models/contacts.py:102 +#: tenancy/models/contacts.py:103 msgid "contact" msgstr "" -#: tenancy/models/contacts.py:103 +#: tenancy/models/contacts.py:104 msgid "contacts" msgstr "" -#: tenancy/models/contacts.py:149 +#: tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "" -#: tenancy/models/contacts.py:150 +#: tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "" +#: tenancy/models/contacts.py:170 +#, python-brace-format +msgid "Contacts cannot be assigned to this object type ({type})." +msgstr "" + #: tenancy/models/tenants.py:32 msgid "tenant group" msgstr "" @@ -11546,27 +11915,27 @@ msgstr "" msgid "tenants" msgstr "" -#: tenancy/tables/contacts.py:107 +#: tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "" -#: tenancy/tables/contacts.py:111 +#: tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "" -#: tenancy/tables/contacts.py:115 +#: tenancy/tables/contacts.py:120 msgid "Contact Email" msgstr "" -#: tenancy/tables/contacts.py:119 +#: tenancy/tables/contacts.py:124 msgid "Contact Address" msgstr "" -#: tenancy/tables/contacts.py:123 +#: tenancy/tables/contacts.py:128 msgid "Contact Link" msgstr "" -#: tenancy/tables/contacts.py:127 +#: tenancy/tables/contacts.py:132 msgid "Contact Description" msgstr "" @@ -11594,27 +11963,27 @@ msgstr "" msgid "If no key is provided, one will be generated automatically." msgstr "" -#: users/forms/filtersets.py:54 users/tables.py:42 +#: users/forms/filtersets.py:52 users/tables.py:42 msgid "Is Staff" msgstr "" -#: users/forms/filtersets.py:61 users/tables.py:45 +#: users/forms/filtersets.py:59 users/tables.py:45 msgid "Is Superuser" msgstr "" -#: users/forms/filtersets.py:94 users/tables.py:89 +#: users/forms/filtersets.py:92 users/tables.py:89 msgid "Can View" msgstr "" -#: users/forms/filtersets.py:101 users/tables.py:92 +#: users/forms/filtersets.py:99 users/tables.py:92 msgid "Can Add" msgstr "" -#: users/forms/filtersets.py:108 users/tables.py:95 +#: users/forms/filtersets.py:106 users/tables.py:95 msgid "Can Change" msgstr "" -#: users/forms/filtersets.py:115 users/tables.py:98 +#: users/forms/filtersets.py:113 users/tables.py:98 msgid "Can Delete" msgstr "" @@ -11688,7 +12057,7 @@ msgstr "" msgid "A user with this username already exists." msgstr "" -#: users/models.py:78 +#: users/models.py:78 vpn/models/crypto.py:42 msgid "group" msgstr "" @@ -11696,75 +12065,75 @@ msgstr "" msgid "groups" msgstr "" -#: users/models.py:104 users/models.py:105 +#: users/models.py:106 users/models.py:107 msgid "user preferences" msgstr "" -#: users/models.py:172 +#: users/models.py:174 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "" -#: users/models.py:184 +#: users/models.py:186 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "" -#: users/models.py:249 +#: users/models.py:252 msgid "expires" msgstr "" -#: users/models.py:254 +#: users/models.py:257 msgid "last used" msgstr "" -#: users/models.py:259 +#: users/models.py:262 msgid "key" msgstr "" -#: users/models.py:265 +#: users/models.py:268 msgid "write enabled" msgstr "" -#: users/models.py:267 +#: users/models.py:270 msgid "Permit create/update/delete operations using this key" msgstr "" -#: users/models.py:278 +#: users/models.py:281 msgid "allowed IPs" msgstr "" -#: users/models.py:280 +#: users/models.py:283 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for " "no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" msgstr "" -#: users/models.py:288 +#: users/models.py:291 msgid "token" msgstr "" -#: users/models.py:289 +#: users/models.py:292 msgid "tokens" msgstr "" -#: users/models.py:370 +#: users/models.py:373 msgid "The list of actions granted by this permission" msgstr "" -#: users/models.py:375 +#: users/models.py:378 msgid "constraints" msgstr "" -#: users/models.py:376 +#: users/models.py:379 msgid "Queryset filter matching the applicable objects of the selected type(s)" msgstr "" -#: users/models.py:383 +#: users/models.py:386 msgid "permission" msgstr "" -#: users/models.py:384 +#: users/models.py:387 msgid "permissions" msgstr "" @@ -11861,6 +12230,17 @@ msgstr "" msgid "Tab" msgstr "" +#: utilities/error_handlers.py:20 +#, python-brace-format +msgid "" +"Unable to delete {objects}. {count} dependent objects were " +"found: " +msgstr "" + +#: utilities/error_handlers.py:22 +msgid "More than 50" +msgstr "" + #: utilities/fields.py:162 #, python-format msgid "" @@ -12067,70 +12447,82 @@ msgstr "" msgid "Testing" msgstr "" -#: virtualization/filtersets.py:77 +#: virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "" -#: virtualization/filtersets.py:83 +#: virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "" -#: virtualization/filtersets.py:87 virtualization/filtersets.py:137 +#: virtualization/filtersets.py:89 virtualization/filtersets.py:140 msgid "Cluster type (ID)" msgstr "" -#: virtualization/filtersets.py:126 +#: virtualization/filtersets.py:129 msgid "Cluster group (ID)" msgstr "" -#: virtualization/filtersets.py:147 virtualization/filtersets.py:262 +#: virtualization/filtersets.py:150 virtualization/filtersets.py:265 msgid "Cluster (ID)" msgstr "" -#: virtualization/forms/bulk_edit.py:163 -#: virtualization/models/virtualmachines.py:112 +#: virtualization/forms/bulk_edit.py:165 +#: virtualization/models/virtualmachines.py:113 msgid "vCPUs" msgstr "" -#: virtualization/forms/bulk_edit.py:167 +#: virtualization/forms/bulk_edit.py:169 msgid "Memory (MB)" msgstr "" -#: virtualization/forms/bulk_edit.py:171 +#: virtualization/forms/bulk_edit.py:173 msgid "Disk (GB)" msgstr "" -#: virtualization/forms/bulk_import.py:43 +#: virtualization/forms/bulk_edit.py:333 virtualization/forms/filtersets.py:243 +msgid "Size (GB)" +msgstr "" + +#: virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "" -#: virtualization/forms/bulk_import.py:50 +#: virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "" -#: virtualization/forms/bulk_import.py:95 +#: virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "" -#: virtualization/forms/bulk_import.py:102 +#: virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "" -#: virtualization/forms/model_forms.py:155 +#: virtualization/forms/model_forms.py:156 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " "({cluster_site})" msgstr "" -#: virtualization/forms/model_forms.py:194 +#: virtualization/forms/model_forms.py:195 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" -#: virtualization/forms/model_forms.py:222 +#: virtualization/forms/model_forms.py:224 msgid "Site/Cluster" msgstr "" +#: virtualization/forms/model_forms.py:247 +msgid "Disk size is managed via the attachment of virtual disks." +msgstr "" + +#: virtualization/forms/model_forms.py:375 +msgid "Disk" +msgstr "" + #: virtualization/models/clusters.py:25 msgid "cluster type" msgstr "" @@ -12162,76 +12554,531 @@ msgid "" "{site}" msgstr "" -#: virtualization/models/virtualmachines.py:120 +#: virtualization/models/virtualmachines.py:121 msgid "memory (MB)" msgstr "" -#: virtualization/models/virtualmachines.py:125 +#: virtualization/models/virtualmachines.py:126 msgid "disk (GB)" msgstr "" -#: virtualization/models/virtualmachines.py:154 +#: virtualization/models/virtualmachines.py:159 msgid "Virtual machine name must be unique per cluster." msgstr "" -#: virtualization/models/virtualmachines.py:157 +#: virtualization/models/virtualmachines.py:162 msgid "virtual machine" msgstr "" -#: virtualization/models/virtualmachines.py:158 +#: virtualization/models/virtualmachines.py:163 msgid "virtual machines" msgstr "" -#: virtualization/models/virtualmachines.py:172 +#: virtualization/models/virtualmachines.py:177 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "" -#: virtualization/models/virtualmachines.py:179 +#: virtualization/models/virtualmachines.py:184 #, python-brace-format msgid "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "" -#: virtualization/models/virtualmachines.py:186 +#: virtualization/models/virtualmachines.py:191 msgid "Must specify a cluster when assigning a host device." msgstr "" -#: virtualization/models/virtualmachines.py:191 +#: virtualization/models/virtualmachines.py:196 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." msgstr "" -#: virtualization/models/virtualmachines.py:204 +#: virtualization/models/virtualmachines.py:208 +#, python-brace-format +msgid "" +"The specified disk size ({size}) must match the aggregate size of assigned " +"virtual disks ({total_size})." +msgstr "" + +#: virtualization/models/virtualmachines.py:222 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "" -#: virtualization/models/virtualmachines.py:213 +#: virtualization/models/virtualmachines.py:231 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "" -#: virtualization/models/virtualmachines.py:331 +#: virtualization/models/virtualmachines.py:389 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " "machine ({virtual_machine})." msgstr "" -#: virtualization/models/virtualmachines.py:346 +#: virtualization/models/virtualmachines.py:404 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " "machine ({virtual_machine})." msgstr "" -#: virtualization/models/virtualmachines.py:357 +#: virtualization/models/virtualmachines.py:415 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " "interface's parent virtual machine, or it must be global." msgstr "" +#: virtualization/models/virtualmachines.py:427 +msgid "size (GB)" +msgstr "" + +#: virtualization/models/virtualmachines.py:431 +msgid "virtual disk" +msgstr "" + +#: virtualization/models/virtualmachines.py:432 +msgid "virtual disks" +msgstr "" + +#: vpn/choices.py:31 +msgid "IPsec - Transport" +msgstr "" + +#: vpn/choices.py:32 +msgid "IPsec - Tunnel" +msgstr "" + +#: vpn/choices.py:33 +msgid "IP-in-IP" +msgstr "" + +#: vpn/choices.py:34 +msgid "GRE" +msgstr "" + +#: vpn/choices.py:56 +msgid "Hub" +msgstr "" + +#: vpn/choices.py:57 +msgid "Spoke" +msgstr "" + +#: vpn/choices.py:80 +msgid "Aggressive" +msgstr "" + +#: vpn/choices.py:81 +msgid "Main" +msgstr "" + +#: vpn/choices.py:92 +msgid "Pre-shared keys" +msgstr "" + +#: vpn/choices.py:93 +msgid "Certificates" +msgstr "" + +#: vpn/choices.py:94 +msgid "RSA signatures" +msgstr "" + +#: vpn/choices.py:95 +msgid "DSA signatures" +msgstr "" + +#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 +#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 +#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 +#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 +#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 +#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 +#, python-brace-format +msgid "Group {n}" +msgstr "" + +#: vpn/choices.py:240 +msgid "Ethernet Private LAN" +msgstr "" + +#: vpn/choices.py:241 +msgid "Ethernet Virtual Private LAN" +msgstr "" + +#: vpn/choices.py:244 +msgid "Ethernet Private Tree" +msgstr "" + +#: vpn/choices.py:245 +msgid "Ethernet Virtual Private Tree" +msgstr "" + +#: vpn/filtersets.py:41 +msgid "Tunnel group (ID)" +msgstr "" + +#: vpn/filtersets.py:47 +msgid "Tunnel group (slug)" +msgstr "" + +#: vpn/filtersets.py:54 +msgid "IPSec profile (ID)" +msgstr "" + +#: vpn/filtersets.py:60 +msgid "IPSec profile (name)" +msgstr "" + +#: vpn/filtersets.py:81 +msgid "Tunnel (ID)" +msgstr "" + +#: vpn/filtersets.py:87 +msgid "Tunnel (name)" +msgstr "" + +#: vpn/filtersets.py:118 +msgid "Outside IP (ID)" +msgstr "" + +#: vpn/filtersets.py:235 +msgid "IKE policy (ID)" +msgstr "" + +#: vpn/filtersets.py:241 +msgid "IKE policy (name)" +msgstr "" + +#: vpn/filtersets.py:245 +msgid "IPSec policy (ID)" +msgstr "" + +#: vpn/filtersets.py:251 +msgid "IPSec policy (name)" +msgstr "" + +#: vpn/filtersets.py:320 +msgid "L2VPN (slug)" +msgstr "" + +#: vpn/filtersets.py:384 +msgid "VM Interface (ID)" +msgstr "" + +#: vpn/filtersets.py:390 +msgid "VLAN (name)" +msgstr "" + +#: vpn/forms/bulk_edit.py:44 vpn/forms/bulk_import.py:42 +#: vpn/forms/filtersets.py:53 +msgid "Tunnel group" +msgstr "" + +#: vpn/forms/bulk_edit.py:116 vpn/models/crypto.py:47 +msgid "SA lifetime" +msgstr "" + +#: vpn/forms/bulk_edit.py:150 wireless/forms/bulk_edit.py:78 +#: wireless/forms/bulk_edit.py:125 wireless/forms/filtersets.py:63 +#: wireless/forms/filtersets.py:97 +msgid "Pre-shared key" +msgstr "" + +#: vpn/forms/bulk_edit.py:238 vpn/forms/bulk_import.py:234 +#: vpn/forms/filtersets.py:196 vpn/forms/model_forms.py:363 +#: vpn/models/crypto.py:103 +msgid "IKE policy" +msgstr "" + +#: vpn/forms/bulk_edit.py:243 vpn/forms/bulk_import.py:239 +#: vpn/forms/filtersets.py:201 vpn/forms/model_forms.py:367 +#: vpn/models/crypto.py:197 +msgid "IPSec policy" +msgstr "" + +#: vpn/forms/bulk_import.py:50 +msgid "Tunnel encapsulation" +msgstr "" + +#: vpn/forms/bulk_import.py:83 +msgid "Operational role" +msgstr "" + +#: vpn/forms/bulk_import.py:90 +msgid "Parent device of assigned interface" +msgstr "" + +#: vpn/forms/bulk_import.py:97 +msgid "Parent VM of assigned interface" +msgstr "" + +#: vpn/forms/bulk_import.py:104 +msgid "Device or virtual machine interface" +msgstr "" + +#: vpn/forms/bulk_import.py:181 +msgid "IKE proposal(s)" +msgstr "" + +#: vpn/forms/bulk_import.py:211 vpn/models/crypto.py:185 +msgid "Diffie-Hellman group for Perfect Forward Secrecy" +msgstr "" + +#: vpn/forms/bulk_import.py:217 +msgid "IPSec proposal(s)" +msgstr "" + +#: vpn/forms/bulk_import.py:231 +msgid "IPSec protocol" +msgstr "" + +#: vpn/forms/bulk_import.py:261 +msgid "L2VPN type" +msgstr "" + +#: vpn/forms/bulk_import.py:282 +msgid "Parent device (for interface)" +msgstr "" + +#: vpn/forms/bulk_import.py:289 +msgid "Parent virtual machine (for interface)" +msgstr "" + +#: vpn/forms/bulk_import.py:296 +msgid "Assigned interface (device or VM)" +msgstr "" + +#: vpn/forms/bulk_import.py:329 +msgid "Cannot import device and VM interface terminations simultaneously." +msgstr "" + +#: vpn/forms/bulk_import.py:331 +msgid "Each termination must specify either an interface or a VLAN." +msgstr "" + +#: vpn/forms/bulk_import.py:333 +msgid "Cannot assign both an interface and a VLAN." +msgstr "" + +#: vpn/forms/filtersets.py:127 +msgid "IKE version" +msgstr "" + +#: vpn/forms/filtersets.py:139 vpn/forms/filtersets.py:172 +#: vpn/forms/model_forms.py:293 vpn/forms/model_forms.py:328 +msgid "Proposal" +msgstr "" + +#: vpn/forms/filtersets.py:247 +msgid "Assigned Object Type" +msgstr "" + +#: vpn/forms/model_forms.py:147 +msgid "First Termination" +msgstr "" + +#: vpn/forms/model_forms.py:151 +msgid "Second Termination" +msgstr "" + +#: vpn/forms/model_forms.py:198 +msgid "This parameter is required when defining a termination." +msgstr "" + +#: vpn/forms/model_forms.py:314 vpn/forms/model_forms.py:349 +msgid "Policy" +msgstr "" + +#: vpn/forms/model_forms.py:469 +msgid "A termination must specify an interface or VLAN." +msgstr "" + +#: vpn/forms/model_forms.py:471 +msgid "" +"A termination can only have one terminating object (an interface or VLAN)." +msgstr "" + +#: vpn/models/crypto.py:33 +msgid "encryption algorithm" +msgstr "" + +#: vpn/models/crypto.py:37 +msgid "authentication algorithm" +msgstr "" + +#: vpn/models/crypto.py:44 +msgid "Diffie-Hellman group ID" +msgstr "" + +#: vpn/models/crypto.py:50 +msgid "Security association lifetime (in seconds)" +msgstr "" + +#: vpn/models/crypto.py:59 +msgid "IKE proposal" +msgstr "" + +#: vpn/models/crypto.py:60 +msgid "IKE proposals" +msgstr "" + +#: vpn/models/crypto.py:76 +msgid "version" +msgstr "" + +#: vpn/models/crypto.py:87 vpn/models/crypto.py:178 +msgid "proposals" +msgstr "" + +#: vpn/models/crypto.py:90 wireless/models.py:38 +msgid "pre-shared key" +msgstr "" + +#: vpn/models/crypto.py:104 +msgid "IKE policies" +msgstr "" + +#: vpn/models/crypto.py:124 +msgid "encryption" +msgstr "" + +#: vpn/models/crypto.py:129 +msgid "authentication" +msgstr "" + +#: vpn/models/crypto.py:137 +msgid "Security association lifetime (seconds)" +msgstr "" + +#: vpn/models/crypto.py:143 +msgid "Security association lifetime (in kilobytes)" +msgstr "" + +#: vpn/models/crypto.py:152 +msgid "IPSec proposal" +msgstr "" + +#: vpn/models/crypto.py:153 +msgid "IPSec proposals" +msgstr "" + +#: vpn/models/crypto.py:166 +msgid "Encryption and/or authentication algorithm must be defined" +msgstr "" + +#: vpn/models/crypto.py:198 +msgid "IPSec policies" +msgstr "" + +#: vpn/models/crypto.py:239 +msgid "IPSec profiles" +msgstr "" + +#: vpn/models/l2vpn.py:116 +msgid "L2VPN termination" +msgstr "" + +#: vpn/models/l2vpn.py:117 +msgid "L2VPN terminations" +msgstr "" + +#: vpn/models/l2vpn.py:135 +#, python-brace-format +msgid "L2VPN Termination already assigned ({assigned_object})" +msgstr "" + +#: vpn/models/l2vpn.py:147 +#, python-brace-format +msgid "" +"{l2vpn_type} L2VPNs cannot have more than two terminations; found " +"{terminations_count} already defined." +msgstr "" + +#: vpn/models/tunnels.py:26 +msgid "tunnel group" +msgstr "" + +#: vpn/models/tunnels.py:27 +msgid "tunnel groups" +msgstr "" + +#: vpn/models/tunnels.py:53 +msgid "encapsulation" +msgstr "" + +#: vpn/models/tunnels.py:72 +msgid "tunnel ID" +msgstr "" + +#: vpn/models/tunnels.py:94 +msgid "tunnel" +msgstr "" + +#: vpn/models/tunnels.py:95 +msgid "tunnels" +msgstr "" + +#: vpn/models/tunnels.py:153 +msgid "An object may be terminated to only one tunnel at a time." +msgstr "" + +#: vpn/models/tunnels.py:156 +msgid "tunnel termination" +msgstr "" + +#: vpn/models/tunnels.py:157 +msgid "tunnel terminations" +msgstr "" + +#: vpn/models/tunnels.py:174 +#, python-brace-format +msgid "{name} is already attached to a tunnel ({tunnel})." +msgstr "" + +#: vpn/tables/crypto.py:22 +msgid "Authentication Method" +msgstr "" + +#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +msgid "Encryption Algorithm" +msgstr "" + +#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +msgid "Authentication Algorithm" +msgstr "" + +#: vpn/tables/crypto.py:34 +msgid "SA Lifetime" +msgstr "" + +#: vpn/tables/crypto.py:71 +msgid "Pre-shared Key" +msgstr "" + +#: vpn/tables/crypto.py:103 +msgid "SA Lifetime (Seconds)" +msgstr "" + +#: vpn/tables/crypto.py:106 +msgid "SA Lifetime (KB)" +msgstr "" + +#: vpn/tables/l2vpn.py:69 +msgid "Object Parent" +msgstr "" + +#: vpn/tables/l2vpn.py:74 +msgid "Object Site" +msgstr "" + +#: vpn/tables/tunnels.py:84 +msgid "Host" +msgstr "" + #: wireless/choices.py:11 msgid "Access point" msgstr "" @@ -12259,11 +13106,6 @@ msgstr "" msgid "Authentication cipher" msgstr "" -#: wireless/forms/bulk_edit.py:78 wireless/forms/bulk_edit.py:125 -#: wireless/forms/filtersets.py:63 wireless/forms/filtersets.py:97 -msgid "Pre-shared key" -msgstr "" - #: wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "" @@ -12284,10 +13126,6 @@ msgstr "" msgid "authentication cipher" msgstr "" -#: wireless/models.py:38 -msgid "pre-shared key" -msgstr "" - #: wireless/models.py:68 msgid "wireless LAN group" msgstr "" From 3905ddf1637e371e25e6bd4866c28978a1e81c7a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 21 Dec 2023 13:31:16 -0500 Subject: [PATCH 189/271] Add initial message maps for es, fr, pt, and ru --- netbox/translations/en/LC_MESSAGES/django.mo | Bin 0 -> 380 bytes netbox/translations/es/LC_MESSAGES/django.mo | Bin 0 -> 200184 bytes netbox/translations/es/LC_MESSAGES/django.po | 13639 ++++++++++++++++ netbox/translations/fr/LC_MESSAGES/django.mo | Bin 0 -> 201516 bytes netbox/translations/fr/LC_MESSAGES/django.po | 13654 +++++++++++++++++ netbox/translations/pt/LC_MESSAGES/django.mo | Bin 0 -> 197485 bytes netbox/translations/pt/LC_MESSAGES/django.po | 13589 ++++++++++++++++ netbox/translations/ru/LC_MESSAGES/django.mo | Bin 0 -> 253842 bytes netbox/translations/ru/LC_MESSAGES/django.po | 13582 ++++++++++++++++ 9 files changed, 54464 insertions(+) create mode 100644 netbox/translations/en/LC_MESSAGES/django.mo create mode 100644 netbox/translations/es/LC_MESSAGES/django.mo create mode 100644 netbox/translations/es/LC_MESSAGES/django.po create mode 100644 netbox/translations/fr/LC_MESSAGES/django.mo create mode 100644 netbox/translations/fr/LC_MESSAGES/django.po create mode 100644 netbox/translations/pt/LC_MESSAGES/django.mo create mode 100644 netbox/translations/pt/LC_MESSAGES/django.po create mode 100644 netbox/translations/ru/LC_MESSAGES/django.mo create mode 100644 netbox/translations/ru/LC_MESSAGES/django.po diff --git a/netbox/translations/en/LC_MESSAGES/django.mo b/netbox/translations/en/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..71cbdf3e9d8d54be31066ec4ad8628bc2c1f2845 GIT binary patch literal 380 zcmYL@K~KUk7=|%=+R?Lz&%}d9i{c3jGZa>EvE7z2Nc2{r&Y96JZ6W$Y{CoZuJ5A(G zp7i_Dx9RhJeDu}vIq;l#&OC>nD^HugXY4QU{MmN?lNtRkR}RH%w3NnHT4Bh@vF%H^(V-=Ii1iQ$Qo9Pt!I1Rhe%oml#`f^NEGFCKEL->Rc=KoQ6a?!10%_7(V7ey8`V`;n{war z20Z3;uifk31QV^CRQ|iq#``$=;jWunRB8aLH({)F;i8zL{=V00y-I_qTIqGAN(}v% i$^}`yHKImSZ8jEzYJOK6-VWez49^vuhS0kh1f3tbb!oc* literal 0 HcmV?d00001 diff --git a/netbox/translations/es/LC_MESSAGES/django.mo b/netbox/translations/es/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..5759ed6735e92d5c510c5451be44c84afbb664f6 GIT binary patch literal 200184 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 literal 0 HcmV?d00001 diff --git a/netbox/translations/es/LC_MESSAGES/django.po b/netbox/translations/es/LC_MESSAGES/django.po new file mode 100644 index 000000000..3b0da01e8 --- /dev/null +++ b/netbox/translations/es/LC_MESSAGES/django.po @@ -0,0 +1,13639 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Jeremy Stretch, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-21 17:54+0000\n" +"PO-Revision-Date: 2023-10-30 17:48+0000\n" +"Last-Translator: Jeremy Stretch, 2023\n" +"Language-Team: Spanish (https://app.transifex.com/netbox-community/teams/178115/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: es\n" +"Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#: account/tables.py:27 templates/account/token.html:23 +#: templates/users/token.html:18 users/forms/bulk_import.py:41 +#: users/forms/model_forms.py:113 +msgid "Key" +msgstr "Llave" + +#: account/tables.py:31 users/forms/filtersets.py:133 +msgid "Write Enabled" +msgstr "Escritura habilitada" + +#: account/tables.py:34 core/tables/jobs.py:29 extras/choices.py:135 +#: extras/tables/tables.py:469 templates/account/token.html:44 +#: templates/core/configrevision.html:34 +#: templates/core/configrevision_restore.html:12 templates/core/job.html:58 +#: templates/extras/htmx/report_result.html:11 +#: templates/extras/htmx/script_result.html:12 +#: templates/extras/journalentry.html:25 templates/generic/object.html:48 +#: templates/users/token.html:36 +msgid "Created" +msgstr "Creado" + +#: account/tables.py:37 templates/account/token.html:48 +#: templates/users/token.html:40 users/forms/bulk_edit.py:97 +#: users/forms/filtersets.py:137 +msgid "Expires" +msgstr "Caduca" + +#: account/tables.py:40 users/forms/filtersets.py:142 +msgid "Last Used" +msgstr "Utilizado por última vez" + +#: account/tables.py:43 templates/account/token.html:56 +#: templates/users/token.html:48 users/forms/bulk_edit.py:102 +#: users/forms/model_forms.py:125 +msgid "Allowed IPs" +msgstr "IPs permitidas" + +#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 +#: dcim/choices.py:174 dcim/choices.py:220 dcim/choices.py:1419 +#: dcim/choices.py:1495 dcim/choices.py:1545 virtualization/choices.py:20 +#: virtualization/choices.py:45 vpn/choices.py:18 +msgid "Planned" +msgstr "Planificado" + +#: circuits/choices.py:22 netbox/navigation/menu.py:290 +msgid "Provisioning" +msgstr "Aprovisionamiento" + +#: circuits/choices.py:23 dcim/choices.py:22 dcim/choices.py:103 +#: dcim/choices.py:173 dcim/choices.py:219 dcim/choices.py:1494 +#: dcim/choices.py:1544 extras/tables/tables.py:375 ipam/choices.py:31 +#: ipam/choices.py:49 ipam/choices.py:69 ipam/choices.py:154 +#: templates/extras/configcontext.html:26 templates/users/user.html:34 +#: users/forms/bulk_edit.py:36 virtualization/choices.py:22 +#: virtualization/choices.py:44 vpn/choices.py:19 wireless/choices.py:25 +msgid "Active" +msgstr "Activo" + +#: circuits/choices.py:24 dcim/choices.py:172 dcim/choices.py:218 +#: dcim/choices.py:1493 dcim/choices.py:1546 virtualization/choices.py:24 +#: virtualization/choices.py:43 +msgid "Offline" +msgstr "Desconectado" + +#: circuits/choices.py:25 +msgid "Deprovisioning" +msgstr "Desaprovisionamiento" + +#: circuits/choices.py:26 +msgid "Decommissioned" +msgstr "Desmantelado" + +#: circuits/filtersets.py:29 circuits/filtersets.py:182 dcim/filtersets.py:120 +#: dcim/filtersets.py:181 dcim/filtersets.py:256 dcim/filtersets.py:364 +#: dcim/filtersets.py:881 dcim/filtersets.py:1177 dcim/filtersets.py:1672 +#: dcim/filtersets.py:1845 dcim/filtersets.py:1902 ipam/filtersets.py:305 +#: ipam/filtersets.py:896 virtualization/filtersets.py:45 +#: virtualization/filtersets.py:172 vpn/filtersets.py:330 +msgid "Region (ID)" +msgstr "Región (ID)" + +#: circuits/filtersets.py:36 circuits/filtersets.py:189 dcim/filtersets.py:126 +#: dcim/filtersets.py:188 dcim/filtersets.py:263 dcim/filtersets.py:371 +#: dcim/filtersets.py:888 dcim/filtersets.py:1184 dcim/filtersets.py:1679 +#: dcim/filtersets.py:1852 dcim/filtersets.py:1909 extras/filtersets.py:414 +#: ipam/filtersets.py:312 ipam/filtersets.py:903 +#: virtualization/filtersets.py:52 virtualization/filtersets.py:179 +#: vpn/filtersets.py:325 +msgid "Region (slug)" +msgstr "Región (slug)" + +#: circuits/filtersets.py:42 circuits/filtersets.py:195 dcim/filtersets.py:194 +#: dcim/filtersets.py:269 dcim/filtersets.py:377 dcim/filtersets.py:894 +#: dcim/filtersets.py:1190 dcim/filtersets.py:1685 dcim/filtersets.py:1858 +#: dcim/filtersets.py:1915 ipam/filtersets.py:318 ipam/filtersets.py:909 +#: virtualization/filtersets.py:58 virtualization/filtersets.py:185 +msgid "Site group (ID)" +msgstr "Grupo de sitios (ID)" + +#: circuits/filtersets.py:49 circuits/filtersets.py:202 dcim/filtersets.py:201 +#: dcim/filtersets.py:276 dcim/filtersets.py:384 dcim/filtersets.py:901 +#: dcim/filtersets.py:1197 dcim/filtersets.py:1692 dcim/filtersets.py:1865 +#: dcim/filtersets.py:1922 extras/filtersets.py:420 ipam/filtersets.py:325 +#: ipam/filtersets.py:916 virtualization/filtersets.py:65 +#: virtualization/filtersets.py:192 +msgid "Site group (slug)" +msgstr "Grupo de sitios (slug)" + +#: circuits/filtersets.py:54 circuits/forms/bulk_import.py:117 +#: circuits/forms/filtersets.py:47 circuits/forms/filtersets.py:171 +#: circuits/forms/model_forms.py:137 dcim/forms/bulk_edit.py:166 +#: dcim/forms/bulk_edit.py:238 dcim/forms/bulk_edit.py:570 +#: dcim/forms/bulk_edit.py:763 dcim/forms/bulk_import.py:130 +#: dcim/forms/bulk_import.py:176 dcim/forms/bulk_import.py:249 +#: dcim/forms/bulk_import.py:477 dcim/forms/bulk_import.py:1239 +#: dcim/forms/bulk_import.py:1267 dcim/forms/filtersets.py:84 +#: dcim/forms/filtersets.py:217 dcim/forms/filtersets.py:264 +#: dcim/forms/filtersets.py:373 dcim/forms/filtersets.py:680 +#: dcim/forms/filtersets.py:910 dcim/forms/filtersets.py:934 +#: dcim/forms/filtersets.py:1024 dcim/forms/filtersets.py:1062 +#: dcim/forms/filtersets.py:1468 dcim/forms/filtersets.py:1492 +#: dcim/forms/filtersets.py:1516 dcim/forms/model_forms.py:138 +#: dcim/forms/model_forms.py:167 dcim/forms/model_forms.py:211 +#: dcim/forms/model_forms.py:397 dcim/forms/model_forms.py:630 +#: dcim/forms/object_create.py:390 dcim/tables/devices.py:186 +#: dcim/tables/power.py:26 dcim/tables/power.py:93 dcim/tables/racks.py:62 +#: dcim/tables/racks.py:138 dcim/tables/sites.py:129 extras/filtersets.py:430 +#: ipam/forms/bulk_edit.py:215 ipam/forms/bulk_edit.py:269 +#: ipam/forms/bulk_edit.py:447 ipam/forms/bulk_edit.py:519 +#: ipam/forms/bulk_import.py:170 ipam/forms/bulk_import.py:437 +#: ipam/forms/filtersets.py:152 ipam/forms/filtersets.py:226 +#: ipam/forms/filtersets.py:417 ipam/forms/filtersets.py:470 +#: ipam/forms/model_forms.py:206 ipam/forms/model_forms.py:548 +#: ipam/forms/model_forms.py:640 ipam/tables/ip.py:244 +#: ipam/tables/vlans.py:114 ipam/tables/vlans.py:216 +#: templates/circuits/circuittermination_edit.html:20 +#: templates/circuits/inc/circuit_termination.html:33 +#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 +#: templates/dcim/inc/cable_termination.html:33 +#: templates/dcim/location.html:40 templates/dcim/powerpanel.html:23 +#: templates/dcim/rack.html:25 templates/dcim/rackreservation.html:31 +#: templates/dcim/site.html:27 templates/ipam/prefix.html:57 +#: templates/ipam/vlan.html:26 templates/ipam/vlan_edit.html:40 +#: templates/virtualization/cluster.html:45 +#: templates/virtualization/virtualmachine.html:96 +#: virtualization/forms/bulk_edit.py:90 virtualization/forms/bulk_edit.py:99 +#: virtualization/forms/bulk_edit.py:108 virtualization/forms/bulk_edit.py:123 +#: virtualization/forms/bulk_import.py:59 +#: virtualization/forms/bulk_import.py:85 +#: virtualization/forms/filtersets.py:78 +#: virtualization/forms/filtersets.py:144 +#: virtualization/forms/model_forms.py:74 +#: virtualization/forms/model_forms.py:107 +#: virtualization/forms/model_forms.py:174 +#: virtualization/tables/clusters.py:77 +#: virtualization/tables/virtualmachines.py:53 vpn/forms/filtersets.py:262 +#: wireless/forms/model_forms.py:77 wireless/forms/model_forms.py:117 +msgid "Site" +msgstr "Sitio" + +#: circuits/filtersets.py:60 circuits/filtersets.py:213 +#: circuits/filtersets.py:250 dcim/filtersets.py:211 dcim/filtersets.py:286 +#: dcim/filtersets.py:358 extras/filtersets.py:436 ipam/filtersets.py:215 +#: ipam/filtersets.py:335 ipam/filtersets.py:926 +#: virtualization/filtersets.py:75 virtualization/filtersets.py:202 +#: vpn/filtersets.py:335 +msgid "Site (slug)" +msgstr "Sitio (babosa)" + +#: circuits/filtersets.py:65 +msgid "ASN (ID)" +msgstr "ASN (ID)" + +#: circuits/filtersets.py:86 circuits/filtersets.py:112 +#: circuits/filtersets.py:146 +msgid "Provider (ID)" +msgstr "Proveedor (ID)" + +#: circuits/filtersets.py:92 circuits/filtersets.py:118 +#: circuits/filtersets.py:152 +msgid "Provider (slug)" +msgstr "Proveedor (babosa)" + +#: circuits/filtersets.py:157 +msgid "Provider account (ID)" +msgstr "Cuenta de proveedor (ID)" + +#: circuits/filtersets.py:162 +msgid "Provider network (ID)" +msgstr "Red de proveedores (ID)" + +#: circuits/filtersets.py:166 +msgid "Circuit type (ID)" +msgstr "Tipo de circuito (ID)" + +#: circuits/filtersets.py:172 +msgid "Circuit type (slug)" +msgstr "Tipo de circuito (slug)" + +#: circuits/filtersets.py:207 circuits/filtersets.py:244 +#: dcim/filtersets.py:205 dcim/filtersets.py:280 dcim/filtersets.py:352 +#: dcim/filtersets.py:905 dcim/filtersets.py:1202 dcim/filtersets.py:1697 +#: dcim/filtersets.py:1869 dcim/filtersets.py:1927 ipam/filtersets.py:209 +#: ipam/filtersets.py:329 ipam/filtersets.py:920 +#: virtualization/filtersets.py:69 virtualization/filtersets.py:196 +#: vpn/filtersets.py:340 +msgid "Site (ID)" +msgstr "Sitio (ID)" + +#: circuits/filtersets.py:236 core/filtersets.py:73 core/filtersets.py:132 +#: dcim/filtersets.py:633 dcim/filtersets.py:1171 dcim/filtersets.py:1973 +#: extras/filtersets.py:40 extras/filtersets.py:69 extras/filtersets.py:101 +#: extras/filtersets.py:140 extras/filtersets.py:168 extras/filtersets.py:195 +#: extras/filtersets.py:226 extras/filtersets.py:295 extras/filtersets.py:343 +#: extras/filtersets.py:403 extras/filtersets.py:562 extras/filtersets.py:604 +#: extras/filtersets.py:645 ipam/forms/model_forms.py:430 +#: netbox/filtersets.py:275 netbox/forms/__init__.py:23 +#: netbox/forms/base.py:152 templates/htmx/object_selector.html:28 +#: templates/inc/filter_list.html:53 templates/ipam/ipaddress_assign.html:32 +#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:86 +#: users/filtersets.py:21 users/filtersets.py:37 users/filtersets.py:69 +#: users/filtersets.py:117 utilities/forms/forms.py:99 +msgid "Search" +msgstr "Búsqueda" + +#: circuits/filtersets.py:240 circuits/forms/bulk_edit.py:167 +#: circuits/forms/model_forms.py:110 circuits/forms/model_forms.py:132 +#: dcim/forms/connections.py:66 templates/circuits/circuit.html:15 +#: templates/dcim/inc/cable_termination.html:55 +#: templates/dcim/trace/circuit.html:4 +msgid "Circuit" +msgstr "Circuito" + +#: circuits/filtersets.py:254 +msgid "ProviderNetwork (ID)" +msgstr "Red de proveedores (ID)" + +#: circuits/forms/bulk_edit.py:25 circuits/forms/filtersets.py:56 +#: circuits/forms/model_forms.py:26 circuits/tables/providers.py:33 +#: dcim/forms/bulk_edit.py:126 dcim/forms/filtersets.py:187 +#: dcim/forms/model_forms.py:126 dcim/tables/sites.py:94 +#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:219 +#: netbox/navigation/menu.py:160 netbox/navigation/menu.py:163 +#: templates/circuits/provider.html:24 +msgid "ASNs" +msgstr "ASNs" + +#: circuits/forms/bulk_edit.py:29 circuits/forms/bulk_edit.py:51 +#: circuits/forms/bulk_edit.py:78 circuits/forms/bulk_edit.py:99 +#: circuits/forms/bulk_edit.py:159 core/forms/bulk_edit.py:27 +#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:71 +#: dcim/forms/bulk_edit.py:90 dcim/forms/bulk_edit.py:149 +#: dcim/forms/bulk_edit.py:190 dcim/forms/bulk_edit.py:208 +#: dcim/forms/bulk_edit.py:336 dcim/forms/bulk_edit.py:371 +#: dcim/forms/bulk_edit.py:386 dcim/forms/bulk_edit.py:445 +#: dcim/forms/bulk_edit.py:484 dcim/forms/bulk_edit.py:514 +#: dcim/forms/bulk_edit.py:538 dcim/forms/bulk_edit.py:608 +#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:709 +#: dcim/forms/bulk_edit.py:732 dcim/forms/bulk_edit.py:780 +#: dcim/forms/bulk_edit.py:850 dcim/forms/bulk_edit.py:903 +#: dcim/forms/bulk_edit.py:938 dcim/forms/bulk_edit.py:978 +#: dcim/forms/bulk_edit.py:1022 dcim/forms/bulk_edit.py:1067 +#: dcim/forms/bulk_edit.py:1094 dcim/forms/bulk_edit.py:1112 +#: dcim/forms/bulk_edit.py:1130 dcim/forms/bulk_edit.py:1148 +#: dcim/forms/bulk_edit.py:1566 extras/forms/bulk_edit.py:36 +#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:152 +#: extras/forms/bulk_edit.py:182 extras/forms/bulk_edit.py:263 +#: extras/forms/bulk_edit.py:287 extras/forms/bulk_edit.py:301 +#: extras/tables/tables.py:56 ipam/forms/bulk_edit.py:50 +#: ipam/forms/bulk_edit.py:70 ipam/forms/bulk_edit.py:90 +#: ipam/forms/bulk_edit.py:114 ipam/forms/bulk_edit.py:143 +#: ipam/forms/bulk_edit.py:172 ipam/forms/bulk_edit.py:191 +#: ipam/forms/bulk_edit.py:260 ipam/forms/bulk_edit.py:304 +#: ipam/forms/bulk_edit.py:352 ipam/forms/bulk_edit.py:395 +#: ipam/forms/bulk_edit.py:423 ipam/forms/bulk_edit.py:551 +#: ipam/forms/bulk_edit.py:582 templates/account/token.html:36 +#: templates/circuits/circuit.html:60 templates/circuits/circuittype.html:29 +#: templates/circuits/inc/circuit_termination.html:115 +#: templates/circuits/provider.html:34 +#: templates/circuits/providernetwork.html:35 +#: templates/core/datasource.html:55 templates/dcim/cable.html:37 +#: templates/dcim/consoleport.html:47 templates/dcim/consoleserverport.html:47 +#: templates/dcim/device.html:96 templates/dcim/devicebay.html:35 +#: templates/dcim/devicerole.html:33 templates/dcim/devicetype.html:36 +#: templates/dcim/frontport.html:61 templates/dcim/interface.html:70 +#: templates/dcim/inventoryitem.html:61 +#: templates/dcim/inventoryitemrole.html:23 templates/dcim/location.html:36 +#: templates/dcim/manufacturer.html:43 templates/dcim/module.html:71 +#: templates/dcim/modulebay.html:39 templates/dcim/moduletype.html:27 +#: templates/dcim/platform.html:36 templates/dcim/powerfeed.html:43 +#: templates/dcim/poweroutlet.html:43 templates/dcim/powerpanel.html:31 +#: templates/dcim/powerport.html:43 templates/dcim/rack.html:54 +#: templates/dcim/rackreservation.html:69 templates/dcim/rackrole.html:29 +#: templates/dcim/rearport.html:57 templates/dcim/region.html:34 +#: templates/dcim/site.html:60 templates/dcim/sitegroup.html:34 +#: templates/dcim/virtualchassis.html:32 +#: templates/extras/admin/plugins_list.html:26 +#: templates/extras/configcontext.html:22 +#: templates/extras/configtemplate.html:18 +#: templates/extras/customfield.html:35 +#: templates/extras/dashboard/widget_add.html:14 +#: templates/extras/eventrule.html:24 templates/extras/exporttemplate.html:25 +#: templates/extras/report_list.html:47 templates/extras/savedfilter.html:18 +#: templates/extras/script_list.html:53 templates/extras/tag.html:23 +#: templates/extras/webhook.html:20 templates/generic/bulk_import.html:118 +#: templates/ipam/aggregate.html:44 templates/ipam/asn.html:43 +#: templates/ipam/asnrange.html:39 templates/ipam/fhrpgroup.html:35 +#: templates/ipam/ipaddress.html:58 templates/ipam/iprange.html:70 +#: templates/ipam/prefix.html:82 templates/ipam/rir.html:29 +#: templates/ipam/role.html:29 templates/ipam/routetarget.html:22 +#: templates/ipam/service.html:53 templates/ipam/servicetemplate.html:28 +#: templates/ipam/vlan.html:65 templates/ipam/vlangroup.html:35 +#: templates/ipam/vrf.html:36 templates/tenancy/contact.html:68 +#: templates/tenancy/contactgroup.html:28 +#: templates/tenancy/contactrole.html:23 templates/tenancy/tenant.html:25 +#: templates/tenancy/tenantgroup.html:36 +#: templates/users/objectpermission.html:22 templates/users/token.html:28 +#: templates/virtualization/cluster.html:28 +#: templates/virtualization/clustergroup.html:29 +#: templates/virtualization/clustertype.html:29 +#: templates/virtualization/virtualdisk.html:40 +#: templates/virtualization/virtualmachine.html:34 +#: templates/virtualization/vminterface.html:54 +#: templates/vpn/ikepolicy.html:18 templates/vpn/ikeproposal.html:18 +#: templates/vpn/ipsecpolicy.html:18 templates/vpn/ipsecprofile.html:18 +#: templates/vpn/ipsecprofile.html:43 templates/vpn/ipsecprofile.html:78 +#: templates/vpn/ipsecproposal.html:18 templates/vpn/l2vpn.html:27 +#: templates/vpn/tunnel.html:34 templates/vpn/tunnelgroup.html:33 +#: templates/wireless/wirelesslan.html:27 +#: templates/wireless/wirelesslangroup.html:34 +#: templates/wireless/wirelesslink.html:37 tenancy/forms/bulk_edit.py:31 +#: tenancy/forms/bulk_edit.py:79 tenancy/forms/bulk_edit.py:121 +#: users/forms/bulk_edit.py:62 users/forms/bulk_edit.py:92 +#: virtualization/forms/bulk_edit.py:31 virtualization/forms/bulk_edit.py:45 +#: virtualization/forms/bulk_edit.py:176 virtualization/forms/bulk_edit.py:227 +#: virtualization/forms/bulk_edit.py:336 vpn/forms/bulk_edit.py:27 +#: vpn/forms/bulk_edit.py:63 vpn/forms/bulk_edit.py:120 +#: vpn/forms/bulk_edit.py:154 vpn/forms/bulk_edit.py:191 +#: vpn/forms/bulk_edit.py:216 vpn/forms/bulk_edit.py:248 +#: vpn/forms/bulk_edit.py:277 wireless/forms/bulk_edit.py:28 +#: wireless/forms/bulk_edit.py:81 wireless/forms/bulk_edit.py:128 +msgid "Description" +msgstr "Descripción" + +#: circuits/forms/bulk_edit.py:46 circuits/forms/bulk_edit.py:68 +#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:35 +#: circuits/forms/bulk_import.py:50 circuits/forms/bulk_import.py:76 +#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 +#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 +#: circuits/forms/model_forms.py:32 circuits/forms/model_forms.py:44 +#: circuits/forms/model_forms.py:58 circuits/forms/model_forms.py:92 +#: circuits/tables/circuits.py:55 circuits/tables/providers.py:72 +#: circuits/tables/providers.py:103 templates/circuits/circuit.html:19 +#: templates/circuits/provider.html:20 +#: templates/circuits/provideraccount.html:21 +#: templates/circuits/providernetwork.html:23 +#: templates/dcim/inc/cable_termination.html:51 +msgid "Provider" +msgstr "Proveedor" + +#: circuits/forms/bulk_edit.py:75 circuits/forms/filtersets.py:91 +#: templates/circuits/providernetwork.html:31 +msgid "Service ID" +msgstr "ID de servicio" + +#: circuits/forms/bulk_edit.py:95 circuits/forms/filtersets.py:107 +#: dcim/forms/bulk_edit.py:204 dcim/forms/bulk_edit.py:500 +#: dcim/forms/bulk_edit.py:694 dcim/forms/bulk_edit.py:1063 +#: dcim/forms/bulk_edit.py:1090 dcim/forms/bulk_edit.py:1562 +#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1353 +#: dcim/forms/filtersets.py:1374 dcim/tables/devices.py:717 +#: dcim/tables/devices.py:777 dcim/tables/devices.py:1004 +#: dcim/tables/devicetypes.py:245 dcim/tables/devicetypes.py:260 +#: dcim/tables/racks.py:32 extras/forms/bulk_edit.py:259 +#: extras/tables/tables.py:323 templates/circuits/circuittype.html:33 +#: templates/dcim/cable.html:41 templates/dcim/devicerole.html:37 +#: templates/dcim/frontport.html:43 templates/dcim/inventoryitemrole.html:27 +#: templates/dcim/rackrole.html:33 templates/dcim/rearport.html:43 +#: templates/extras/tag.html:29 +msgid "Color" +msgstr "Color" + +#: circuits/forms/bulk_edit.py:113 circuits/forms/bulk_import.py:89 +#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:17 +#: core/forms/filtersets.py:29 core/tables/data.py:20 core/tables/jobs.py:18 +#: dcim/forms/bulk_edit.py:281 dcim/forms/bulk_edit.py:672 +#: dcim/forms/bulk_edit.py:811 dcim/forms/bulk_edit.py:879 +#: dcim/forms/bulk_edit.py:898 dcim/forms/bulk_edit.py:921 +#: dcim/forms/bulk_edit.py:963 dcim/forms/bulk_edit.py:1007 +#: dcim/forms/bulk_edit.py:1058 dcim/forms/bulk_edit.py:1085 +#: dcim/forms/bulk_import.py:206 dcim/forms/bulk_import.py:645 +#: dcim/forms/bulk_import.py:671 dcim/forms/bulk_import.py:697 +#: dcim/forms/bulk_import.py:717 dcim/forms/bulk_import.py:800 +#: dcim/forms/bulk_import.py:890 dcim/forms/bulk_import.py:932 +#: dcim/forms/bulk_import.py:1145 dcim/forms/bulk_import.py:1304 +#: dcim/forms/filtersets.py:286 dcim/forms/filtersets.py:867 +#: dcim/forms/filtersets.py:967 dcim/forms/filtersets.py:1088 +#: dcim/forms/filtersets.py:1158 dcim/forms/filtersets.py:1180 +#: dcim/forms/filtersets.py:1202 dcim/forms/filtersets.py:1219 +#: dcim/forms/filtersets.py:1253 dcim/forms/filtersets.py:1348 +#: dcim/forms/filtersets.py:1369 dcim/forms/object_import.py:89 +#: dcim/forms/object_import.py:118 dcim/forms/object_import.py:150 +#: dcim/tables/devices.py:211 dcim/tables/devices.py:833 +#: dcim/tables/power.py:77 extras/forms/bulk_import.py:39 +#: extras/tables/tables.py:345 extras/tables/tables.py:443 +#: netbox/tables/tables.py:234 templates/circuits/circuit.html:31 +#: templates/core/datasource.html:39 templates/dcim/cable.html:16 +#: templates/dcim/consoleport.html:39 templates/dcim/consoleserverport.html:39 +#: templates/dcim/frontport.html:39 templates/dcim/interface.html:47 +#: templates/dcim/interface.html:175 templates/dcim/interface.html:323 +#: templates/dcim/powerfeed.html:35 templates/dcim/poweroutlet.html:39 +#: templates/dcim/powerport.html:39 templates/dcim/rack.html:81 +#: templates/dcim/rearport.html:39 templates/extras/eventrule.html:95 +#: templates/virtualization/cluster.html:20 templates/vpn/l2vpn.html:23 +#: templates/wireless/inc/authentication_attrs.html:9 +#: templates/wireless/inc/wirelesslink_interface.html:14 +#: virtualization/forms/bulk_edit.py:59 virtualization/forms/bulk_import.py:41 +#: virtualization/forms/filtersets.py:53 +#: virtualization/forms/model_forms.py:65 virtualization/tables/clusters.py:66 +#: vpn/forms/bulk_edit.py:267 vpn/forms/bulk_import.py:259 +#: vpn/forms/filtersets.py:214 vpn/forms/model_forms.py:83 +#: vpn/forms/model_forms.py:118 vpn/forms/model_forms.py:232 +msgid "Type" +msgstr "Tipo" + +#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:82 +#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:97 +msgid "Provider account" +msgstr "Cuenta de proveedor" + +#: circuits/forms/bulk_edit.py:131 circuits/forms/bulk_import.py:95 +#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:34 +#: core/forms/filtersets.py:75 core/tables/data.py:23 core/tables/jobs.py:26 +#: dcim/forms/bulk_edit.py:104 dcim/forms/bulk_edit.py:179 +#: dcim/forms/bulk_edit.py:260 dcim/forms/bulk_edit.py:593 +#: dcim/forms/bulk_edit.py:646 dcim/forms/bulk_edit.py:678 +#: dcim/forms/bulk_edit.py:805 dcim/forms/bulk_edit.py:1585 +#: dcim/forms/bulk_import.py:87 dcim/forms/bulk_import.py:146 +#: dcim/forms/bulk_import.py:194 dcim/forms/bulk_import.py:442 +#: dcim/forms/bulk_import.py:596 dcim/forms/bulk_import.py:1139 +#: dcim/forms/bulk_import.py:1299 dcim/forms/filtersets.py:170 +#: dcim/forms/filtersets.py:229 dcim/forms/filtersets.py:281 +#: dcim/forms/filtersets.py:726 dcim/forms/filtersets.py:835 +#: dcim/forms/filtersets.py:871 dcim/forms/filtersets.py:972 +#: dcim/forms/filtersets.py:1083 dcim/tables/devices.py:173 +#: dcim/tables/devices.py:836 dcim/tables/devices.py:1064 +#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:66 +#: dcim/tables/sites.py:82 dcim/tables/sites.py:133 +#: ipam/forms/bulk_edit.py:240 ipam/forms/bulk_edit.py:289 +#: ipam/forms/bulk_edit.py:337 ipam/forms/bulk_edit.py:541 +#: ipam/forms/bulk_import.py:191 ipam/forms/bulk_import.py:256 +#: ipam/forms/bulk_import.py:292 ipam/forms/bulk_import.py:458 +#: ipam/forms/filtersets.py:205 ipam/forms/filtersets.py:270 +#: ipam/forms/filtersets.py:341 ipam/forms/filtersets.py:482 +#: ipam/forms/model_forms.py:449 ipam/tables/ip.py:236 ipam/tables/ip.py:309 +#: ipam/tables/ip.py:359 ipam/tables/ip.py:421 ipam/tables/ip.py:448 +#: ipam/tables/vlans.py:122 ipam/tables/vlans.py:227 +#: templates/circuits/circuit.html:35 templates/core/datasource.html:47 +#: templates/core/job.html:35 templates/dcim/cable.html:20 +#: templates/dcim/device.html:183 templates/dcim/location.html:48 +#: templates/dcim/module.html:67 templates/dcim/powerfeed.html:39 +#: templates/dcim/rack.html:46 templates/dcim/site.html:43 +#: templates/extras/report_list.html:49 templates/extras/script_list.html:55 +#: templates/ipam/ipaddress.html:40 templates/ipam/iprange.html:57 +#: templates/ipam/prefix.html:74 templates/ipam/vlan.html:51 +#: templates/virtualization/cluster.html:24 +#: templates/virtualization/virtualmachine.html:22 +#: templates/vpn/tunnel.html:26 templates/wireless/wirelesslan.html:23 +#: templates/wireless/wirelesslink.html:20 users/forms/filtersets.py:33 +#: users/forms/model_forms.py:196 virtualization/forms/bulk_edit.py:69 +#: virtualization/forms/bulk_edit.py:117 +#: virtualization/forms/bulk_import.py:54 +#: virtualization/forms/bulk_import.py:80 +#: virtualization/forms/filtersets.py:61 +#: virtualization/forms/filtersets.py:156 virtualization/tables/clusters.py:74 +#: virtualization/tables/virtualmachines.py:50 vpn/forms/bulk_edit.py:38 +#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:46 +#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:42 +#: wireless/forms/bulk_edit.py:104 wireless/forms/bulk_import.py:43 +#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:48 +#: wireless/forms/filtersets.py:82 wireless/tables/wirelesslan.py:52 +#: wireless/tables/wirelesslink.py:19 +msgid "Status" +msgstr "Estado" + +#: circuits/forms/bulk_edit.py:137 circuits/forms/bulk_import.py:100 +#: circuits/forms/filtersets.py:119 dcim/forms/bulk_edit.py:120 +#: dcim/forms/bulk_edit.py:185 dcim/forms/bulk_edit.py:255 +#: dcim/forms/bulk_edit.py:366 dcim/forms/bulk_edit.py:583 +#: dcim/forms/bulk_edit.py:684 dcim/forms/bulk_edit.py:1590 +#: dcim/forms/bulk_import.py:106 dcim/forms/bulk_import.py:151 +#: dcim/forms/bulk_import.py:187 dcim/forms/bulk_import.py:274 +#: dcim/forms/bulk_import.py:416 dcim/forms/bulk_import.py:1151 +#: dcim/forms/bulk_import.py:1356 dcim/forms/filtersets.py:165 +#: dcim/forms/filtersets.py:197 dcim/forms/filtersets.py:248 +#: dcim/forms/filtersets.py:333 dcim/forms/filtersets.py:354 +#: dcim/forms/filtersets.py:653 dcim/forms/filtersets.py:826 +#: dcim/forms/filtersets.py:891 dcim/forms/filtersets.py:921 +#: dcim/forms/filtersets.py:1043 dcim/tables/power.py:88 +#: extras/filtersets.py:517 extras/forms/filtersets.py:331 +#: extras/forms/filtersets.py:405 ipam/forms/bulk_edit.py:40 +#: ipam/forms/bulk_edit.py:65 ipam/forms/bulk_edit.py:109 +#: ipam/forms/bulk_edit.py:138 ipam/forms/bulk_edit.py:163 +#: ipam/forms/bulk_edit.py:235 ipam/forms/bulk_edit.py:284 +#: ipam/forms/bulk_edit.py:332 ipam/forms/bulk_edit.py:536 +#: ipam/forms/bulk_import.py:37 ipam/forms/bulk_import.py:66 +#: ipam/forms/bulk_import.py:94 ipam/forms/bulk_import.py:114 +#: ipam/forms/bulk_import.py:134 ipam/forms/bulk_import.py:163 +#: ipam/forms/bulk_import.py:249 ipam/forms/bulk_import.py:285 +#: ipam/forms/bulk_import.py:451 ipam/forms/filtersets.py:47 +#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:99 +#: ipam/forms/filtersets.py:119 ipam/forms/filtersets.py:142 +#: ipam/forms/filtersets.py:169 ipam/forms/filtersets.py:256 +#: ipam/forms/filtersets.py:296 ipam/forms/filtersets.py:450 +#: ipam/tables/ip.py:451 ipam/tables/vlans.py:224 +#: templates/circuits/circuit.html:39 templates/dcim/cable.html:24 +#: templates/dcim/device.html:81 templates/dcim/location.html:52 +#: templates/dcim/powerfeed.html:47 templates/dcim/rack.html:37 +#: templates/dcim/rackreservation.html:56 templates/dcim/site.html:47 +#: templates/dcim/virtualdevicecontext.html:55 +#: templates/ipam/aggregate.html:31 templates/ipam/asn.html:34 +#: templates/ipam/asnrange.html:30 templates/ipam/ipaddress.html:31 +#: templates/ipam/iprange.html:61 templates/ipam/prefix.html:30 +#: templates/ipam/routetarget.html:18 templates/ipam/vlan.html:42 +#: templates/ipam/vrf.html:23 templates/tenancy/tenant.html:17 +#: templates/virtualization/cluster.html:36 +#: templates/virtualization/virtualmachine.html:38 templates/vpn/l2vpn.html:31 +#: templates/vpn/tunnel.html:50 templates/wireless/wirelesslan.html:35 +#: templates/wireless/wirelesslink.html:28 tenancy/forms/forms.py:25 +#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:53 +#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:75 +#: virtualization/forms/bulk_edit.py:154 +#: virtualization/forms/bulk_import.py:66 +#: virtualization/forms/bulk_import.py:115 +#: virtualization/forms/filtersets.py:46 +#: virtualization/forms/filtersets.py:101 vpn/forms/bulk_edit.py:58 +#: vpn/forms/bulk_edit.py:272 vpn/forms/bulk_import.py:59 +#: vpn/forms/bulk_import.py:253 vpn/forms/filtersets.py:211 +#: wireless/forms/bulk_edit.py:62 wireless/forms/bulk_edit.py:109 +#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 +#: wireless/forms/filtersets.py:34 wireless/forms/filtersets.py:74 +msgid "Tenant" +msgstr "Inquilino" + +#: circuits/forms/bulk_edit.py:142 circuits/forms/filtersets.py:174 +msgid "Install date" +msgstr "Fecha de instalación" + +#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:179 +msgid "Termination date" +msgstr "Fecha de terminación" + +#: circuits/forms/bulk_edit.py:153 circuits/forms/filtersets.py:186 +msgid "Commit rate (Kbps)" +msgstr "Velocidad de confirmación (Kbps)" + +#: circuits/forms/bulk_edit.py:168 circuits/forms/model_forms.py:111 +msgid "Service Parameters" +msgstr "Parámetros de servicio" + +#: circuits/forms/bulk_edit.py:169 circuits/forms/model_forms.py:112 +#: dcim/forms/model_forms.py:141 dcim/forms/model_forms.py:183 +#: dcim/forms/model_forms.py:260 dcim/forms/model_forms.py:672 +#: dcim/forms/model_forms.py:1478 ipam/forms/model_forms.py:61 +#: ipam/forms/model_forms.py:114 ipam/forms/model_forms.py:135 +#: ipam/forms/model_forms.py:159 ipam/forms/model_forms.py:231 +#: ipam/forms/model_forms.py:257 netbox/navigation/menu.py:38 +#: templates/dcim/cable_edit.html:68 templates/dcim/device_edit.html:85 +#: templates/dcim/rack_edit.html:30 templates/ipam/ipaddress_bulk_add.html:27 +#: templates/ipam/ipaddress_edit.html:27 templates/ipam/vlan_edit.html:22 +#: virtualization/forms/model_forms.py:83 +#: virtualization/forms/model_forms.py:225 vpn/forms/bulk_edit.py:77 +#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 +#: vpn/forms/model_forms.py:146 vpn/forms/model_forms.py:404 +#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:160 +msgid "Tenancy" +msgstr "Arrendamiento" + +#: circuits/forms/bulk_import.py:38 circuits/forms/bulk_import.py:53 +#: circuits/forms/bulk_import.py:79 +msgid "Assigned provider" +msgstr "Proveedor asignado" + +#: circuits/forms/bulk_import.py:70 dcim/forms/bulk_import.py:170 +#: dcim/forms/bulk_import.py:380 dcim/forms/bulk_import.py:1092 +#: dcim/forms/bulk_import.py:1171 extras/forms/bulk_import.py:229 +msgid "RGB color in hexadecimal. Example:" +msgstr "Color RGB en hexadecimal. Ejemplo:" + +#: circuits/forms/bulk_import.py:85 +msgid "Assigned provider account" +msgstr "Cuenta de proveedor asignada" + +#: circuits/forms/bulk_import.py:92 +msgid "Type of circuit" +msgstr "Tipo de circuito" + +#: circuits/forms/bulk_import.py:97 dcim/forms/bulk_import.py:89 +#: dcim/forms/bulk_import.py:148 dcim/forms/bulk_import.py:196 +#: dcim/forms/bulk_import.py:444 dcim/forms/bulk_import.py:598 +#: dcim/forms/bulk_import.py:1301 ipam/forms/bulk_import.py:193 +#: ipam/forms/bulk_import.py:258 ipam/forms/bulk_import.py:294 +#: ipam/forms/bulk_import.py:460 virtualization/forms/bulk_import.py:56 +#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 +msgid "Operational status" +msgstr "Estado operativo" + +#: circuits/forms/bulk_import.py:104 dcim/forms/bulk_import.py:110 +#: dcim/forms/bulk_import.py:155 dcim/forms/bulk_import.py:278 +#: dcim/forms/bulk_import.py:420 dcim/forms/bulk_import.py:1155 +#: dcim/forms/bulk_import.py:1296 ipam/forms/bulk_import.py:41 +#: ipam/forms/bulk_import.py:70 ipam/forms/bulk_import.py:98 +#: ipam/forms/bulk_import.py:118 ipam/forms/bulk_import.py:138 +#: ipam/forms/bulk_import.py:167 ipam/forms/bulk_import.py:253 +#: ipam/forms/bulk_import.py:289 ipam/forms/bulk_import.py:455 +#: virtualization/forms/bulk_import.py:70 +#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 +#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +msgid "Assigned tenant" +msgstr "Inquilino asignado" + +#: circuits/forms/bulk_import.py:123 circuits/forms/filtersets.py:147 +#: circuits/forms/model_forms.py:143 +msgid "Provider network" +msgstr "Red de proveedores" + +#: circuits/forms/filtersets.py:26 circuits/forms/filtersets.py:118 +#: dcim/forms/bulk_edit.py:247 dcim/forms/bulk_edit.py:345 +#: dcim/forms/bulk_edit.py:575 dcim/forms/bulk_edit.py:622 +#: dcim/forms/bulk_edit.py:772 dcim/forms/bulk_import.py:181 +#: dcim/forms/bulk_import.py:255 dcim/forms/bulk_import.py:483 +#: dcim/forms/bulk_import.py:1245 dcim/forms/bulk_import.py:1279 +#: dcim/forms/filtersets.py:92 dcim/forms/filtersets.py:245 +#: dcim/forms/filtersets.py:278 dcim/forms/filtersets.py:330 +#: dcim/forms/filtersets.py:381 dcim/forms/filtersets.py:650 +#: dcim/forms/filtersets.py:689 dcim/forms/filtersets.py:890 +#: dcim/forms/filtersets.py:919 dcim/forms/filtersets.py:939 +#: dcim/forms/filtersets.py:1003 dcim/forms/filtersets.py:1033 +#: dcim/forms/filtersets.py:1042 dcim/forms/filtersets.py:1153 +#: dcim/forms/filtersets.py:1175 dcim/forms/filtersets.py:1197 +#: dcim/forms/filtersets.py:1214 dcim/forms/filtersets.py:1234 +#: dcim/forms/filtersets.py:1342 dcim/forms/filtersets.py:1364 +#: dcim/forms/filtersets.py:1385 dcim/forms/filtersets.py:1400 +#: dcim/forms/filtersets.py:1411 dcim/forms/model_forms.py:182 +#: dcim/forms/model_forms.py:216 dcim/forms/model_forms.py:402 +#: dcim/forms/model_forms.py:635 dcim/tables/devices.py:190 +#: dcim/tables/power.py:30 dcim/tables/racks.py:58 dcim/tables/racks.py:143 +#: extras/filtersets.py:441 extras/forms/filtersets.py:328 +#: ipam/forms/bulk_edit.py:456 ipam/forms/filtersets.py:168 +#: ipam/forms/filtersets.py:400 ipam/forms/filtersets.py:422 +#: ipam/forms/filtersets.py:448 ipam/forms/model_forms.py:560 +#: templates/dcim/device.html:26 templates/dcim/device_edit.html:30 +#: templates/dcim/inc/cable_termination.html:12 +#: templates/dcim/location.html:27 templates/dcim/powerpanel.html:27 +#: templates/dcim/rack.html:29 templates/dcim/rackreservation.html:35 +#: virtualization/forms/filtersets.py:45 virtualization/forms/filtersets.py:99 +#: wireless/forms/model_forms.py:88 wireless/forms/model_forms.py:128 +msgid "Location" +msgstr "Ubicación" + +#: circuits/forms/filtersets.py:27 ipam/forms/model_forms.py:158 +#: ipam/models/asns.py:108 ipam/models/asns.py:125 ipam/tables/asn.py:41 +#: templates/ipam/asn.html:20 +msgid "ASN" +msgstr "ASN" + +#: circuits/forms/filtersets.py:28 circuits/forms/filtersets.py:120 +#: dcim/forms/filtersets.py:136 dcim/forms/filtersets.py:150 +#: dcim/forms/filtersets.py:166 dcim/forms/filtersets.py:198 +#: dcim/forms/filtersets.py:249 dcim/forms/filtersets.py:334 +#: dcim/forms/filtersets.py:408 dcim/forms/filtersets.py:654 +#: dcim/forms/filtersets.py:1004 netbox/navigation/menu.py:45 +#: netbox/navigation/menu.py:47 tenancy/tables/columns.py:70 +#: tenancy/tables/contacts.py:25 tenancy/views.py:18 +#: virtualization/forms/filtersets.py:36 virtualization/forms/filtersets.py:47 +#: virtualization/forms/filtersets.py:102 +msgid "Contacts" +msgstr "Contactos" + +#: circuits/forms/filtersets.py:33 circuits/forms/filtersets.py:157 +#: dcim/forms/bulk_edit.py:110 dcim/forms/bulk_edit.py:222 +#: dcim/forms/bulk_edit.py:747 dcim/forms/bulk_import.py:92 +#: dcim/forms/filtersets.py:70 dcim/forms/filtersets.py:177 +#: dcim/forms/filtersets.py:203 dcim/forms/filtersets.py:256 +#: dcim/forms/filtersets.py:359 dcim/forms/filtersets.py:666 +#: dcim/forms/filtersets.py:896 dcim/forms/filtersets.py:926 +#: dcim/forms/filtersets.py:1010 dcim/forms/filtersets.py:1049 +#: dcim/forms/filtersets.py:1460 dcim/forms/filtersets.py:1484 +#: dcim/forms/filtersets.py:1508 dcim/forms/model_forms.py:80 +#: dcim/forms/model_forms.py:115 dcim/forms/object_create.py:374 +#: dcim/tables/devices.py:176 dcim/tables/sites.py:85 extras/filtersets.py:408 +#: ipam/forms/bulk_edit.py:205 ipam/forms/bulk_edit.py:437 +#: ipam/forms/bulk_edit.py:509 ipam/forms/filtersets.py:212 +#: ipam/forms/filtersets.py:407 ipam/forms/filtersets.py:456 +#: ipam/forms/model_forms.py:532 templates/dcim/device.html:18 +#: templates/dcim/rack.html:19 templates/dcim/rackreservation.html:25 +#: templates/dcim/region.html:26 templates/dcim/site.html:31 +#: templates/ipam/prefix.html:50 templates/ipam/vlan.html:19 +#: virtualization/forms/bulk_edit.py:80 virtualization/forms/filtersets.py:58 +#: virtualization/forms/filtersets.py:129 +#: virtualization/forms/model_forms.py:95 vpn/forms/filtersets.py:253 +msgid "Region" +msgstr "Región" + +#: circuits/forms/filtersets.py:38 circuits/forms/filtersets.py:162 +#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:755 +#: dcim/forms/filtersets.py:75 dcim/forms/filtersets.py:182 +#: dcim/forms/filtersets.py:208 dcim/forms/filtersets.py:269 +#: dcim/forms/filtersets.py:364 dcim/forms/filtersets.py:671 +#: dcim/forms/filtersets.py:901 dcim/forms/filtersets.py:1015 +#: dcim/forms/filtersets.py:1054 dcim/forms/object_create.py:382 +#: extras/filtersets.py:425 ipam/forms/bulk_edit.py:210 +#: ipam/forms/bulk_edit.py:444 ipam/forms/bulk_edit.py:514 +#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:412 +#: ipam/forms/filtersets.py:461 ipam/forms/model_forms.py:545 +#: virtualization/forms/bulk_edit.py:85 virtualization/forms/filtersets.py:68 +#: virtualization/forms/filtersets.py:134 +#: virtualization/forms/model_forms.py:101 +msgid "Site group" +msgstr "Grupo de sitios" + +#: circuits/forms/filtersets.py:51 +msgid "ASN (legacy)" +msgstr "ASN (legado)" + +#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 +#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 +#: core/forms/filtersets.py:63 dcim/forms/bulk_edit.py:718 +#: dcim/forms/filtersets.py:164 dcim/forms/filtersets.py:196 +#: dcim/forms/filtersets.py:825 dcim/forms/filtersets.py:920 +#: dcim/forms/filtersets.py:1044 dcim/forms/filtersets.py:1152 +#: dcim/forms/filtersets.py:1174 dcim/forms/filtersets.py:1196 +#: dcim/forms/filtersets.py:1213 dcim/forms/filtersets.py:1230 +#: dcim/forms/filtersets.py:1341 dcim/forms/filtersets.py:1363 +#: dcim/forms/filtersets.py:1384 dcim/forms/filtersets.py:1399 +#: dcim/forms/filtersets.py:1410 extras/forms/filtersets.py:40 +#: extras/forms/filtersets.py:111 extras/forms/filtersets.py:142 +#: extras/forms/filtersets.py:182 extras/forms/filtersets.py:198 +#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:253 +#: extras/forms/filtersets.py:450 extras/forms/filtersets.py:491 +#: ipam/forms/filtersets.py:98 ipam/forms/filtersets.py:255 +#: ipam/forms/filtersets.py:294 ipam/forms/filtersets.py:368 +#: ipam/forms/filtersets.py:449 ipam/forms/filtersets.py:508 +#: ipam/forms/filtersets.py:526 netbox/tables/tables.py:250 +#: virtualization/forms/filtersets.py:44 +#: virtualization/forms/filtersets.py:100 +#: virtualization/forms/filtersets.py:190 +#: virtualization/forms/filtersets.py:235 vpn/forms/filtersets.py:210 +#: wireless/forms/filtersets.py:33 wireless/forms/filtersets.py:73 +msgid "Attributes" +msgstr "Atributos" + +#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:60 +#: circuits/tables/providers.py:66 templates/circuits/circuit.html:23 +#: templates/circuits/provideraccount.html:25 +msgid "Account" +msgstr "Cuenta" + +#: circuits/forms/model_forms.py:64 +#: templates/circuits/circuittermination_edit.html:23 +#: templates/circuits/inc/circuit_termination.html:89 +#: templates/circuits/providernetwork.html:18 +msgid "Provider Network" +msgstr "Red de proveedores" + +#: circuits/forms/model_forms.py:78 templates/circuits/circuittype.html:20 +msgid "Circuit Type" +msgstr "Tipo de circuito" + +#: circuits/models/circuits.py:25 dcim/models/cables.py:67 +#: dcim/models/device_component_templates.py:491 +#: dcim/models/device_component_templates.py:591 +#: dcim/models/device_components.py:976 dcim/models/device_components.py:1050 +#: dcim/models/device_components.py:1166 dcim/models/devices.py:467 +#: dcim/models/racks.py:43 extras/models/tags.py:28 +msgid "color" +msgstr "color" + +#: circuits/models/circuits.py:34 +msgid "circuit type" +msgstr "tipo de circuito" + +#: circuits/models/circuits.py:35 +msgid "circuit types" +msgstr "tipos de circuitos" + +#: circuits/models/circuits.py:46 +msgid "circuit ID" +msgstr "ID de circuito" + +#: circuits/models/circuits.py:47 +msgid "Unique circuit ID" +msgstr "ID de circuito único" + +#: circuits/models/circuits.py:67 core/models/data.py:54 +#: core/models/jobs.py:85 dcim/models/cables.py:49 dcim/models/devices.py:641 +#: dcim/models/devices.py:1165 dcim/models/devices.py:1374 +#: dcim/models/power.py:95 dcim/models/racks.py:97 dcim/models/sites.py:154 +#: dcim/models/sites.py:266 ipam/models/ip.py:252 ipam/models/ip.py:521 +#: ipam/models/ip.py:729 ipam/models/vlans.py:175 +#: virtualization/models/clusters.py:74 +#: virtualization/models/virtualmachines.py:82 vpn/models/tunnels.py:40 +#: wireless/models.py:94 wireless/models.py:158 +msgid "status" +msgstr "estado" + +#: circuits/models/circuits.py:82 +msgid "installed" +msgstr "instalada" + +#: circuits/models/circuits.py:87 +msgid "terminates" +msgstr "termina" + +#: circuits/models/circuits.py:92 +msgid "commit rate (Kbps)" +msgstr "velocidad de confirmación (Kbps)" + +#: circuits/models/circuits.py:93 +msgid "Committed rate" +msgstr "Tarifa comprometida" + +#: circuits/models/circuits.py:135 +msgid "circuit" +msgstr "circuito" + +#: circuits/models/circuits.py:136 +msgid "circuits" +msgstr "circuitos" + +#: circuits/models/circuits.py:169 +msgid "termination" +msgstr "terminación" + +#: circuits/models/circuits.py:186 +msgid "port speed (Kbps)" +msgstr "velocidad de puerto (Kbps)" + +#: circuits/models/circuits.py:189 +msgid "Physical circuit speed" +msgstr "Velocidad del circuito físico" + +#: circuits/models/circuits.py:194 +msgid "upstream speed (Kbps)" +msgstr "velocidad de subida (Kbps)" + +#: circuits/models/circuits.py:195 +msgid "Upstream speed, if different from port speed" +msgstr "Velocidad ascendente, si es diferente de la velocidad del puerto" + +#: circuits/models/circuits.py:200 +msgid "cross-connect ID" +msgstr "ID de conexión cruzada" + +#: circuits/models/circuits.py:201 +msgid "ID of the local cross-connect" +msgstr "ID de la conexión cruzada local" + +#: circuits/models/circuits.py:206 +msgid "patch panel/port(s)" +msgstr "panel de parche/puerto(s)" + +#: circuits/models/circuits.py:207 +msgid "Patch panel ID and port number(s)" +msgstr "ID del panel de conexiones y números de puerto" + +#: circuits/models/circuits.py:210 +#: dcim/models/device_component_templates.py:61 +#: dcim/models/device_components.py:69 dcim/models/racks.py:537 +#: extras/models/configs.py:45 extras/models/configs.py:219 +#: extras/models/customfields.py:122 extras/models/models.py:58 +#: extras/models/models.py:188 extras/models/models.py:426 +#: extras/models/models.py:541 extras/models/staging.py:31 +#: extras/models/tags.py:32 netbox/models/__init__.py:109 +#: netbox/models/__init__.py:144 netbox/models/__init__.py:190 +#: users/models.py:273 users/models.py:348 +#: virtualization/models/virtualmachines.py:282 +msgid "description" +msgstr "descripción" + +#: circuits/models/circuits.py:223 +msgid "circuit termination" +msgstr "terminación de circuito" + +#: circuits/models/circuits.py:224 +msgid "circuit terminations" +msgstr "terminaciones de circuitos" + +#: circuits/models/providers.py:22 circuits/models/providers.py:66 +#: circuits/models/providers.py:104 core/models/data.py:41 +#: core/models/jobs.py:46 dcim/models/device_component_templates.py:43 +#: dcim/models/device_components.py:54 dcim/models/devices.py:581 +#: dcim/models/devices.py:1305 dcim/models/devices.py:1370 +#: dcim/models/power.py:39 dcim/models/power.py:91 dcim/models/racks.py:62 +#: dcim/models/sites.py:138 extras/models/configs.py:36 +#: extras/models/configs.py:215 extras/models/customfields.py:89 +#: extras/models/models.py:53 extras/models/models.py:183 +#: extras/models/models.py:326 extras/models/models.py:422 +#: extras/models/models.py:531 extras/models/models.py:626 +#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 +#: ipam/models/services.py:52 ipam/models/services.py:88 +#: ipam/models/vlans.py:26 ipam/models/vlans.py:164 ipam/models/vrfs.py:22 +#: ipam/models/vrfs.py:79 netbox/models/__init__.py:136 +#: netbox/models/__init__.py:180 tenancy/models/contacts.py:64 +#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 +#: users/models.py:344 virtualization/models/clusters.py:57 +#: virtualization/models/virtualmachines.py:70 +#: virtualization/models/virtualmachines.py:272 vpn/models/crypto.py:24 +#: vpn/models/crypto.py:71 vpn/models/crypto.py:119 vpn/models/crypto.py:171 +#: vpn/models/crypto.py:209 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 +#: wireless/models.py:50 +msgid "name" +msgstr "nombre" + +#: circuits/models/providers.py:25 +msgid "Full name of the provider" +msgstr "Nombre completo del proveedor" + +#: circuits/models/providers.py:28 dcim/models/devices.py:86 +#: dcim/models/sites.py:149 extras/models/models.py:536 ipam/models/asns.py:23 +#: ipam/models/vlans.py:30 netbox/models/__init__.py:140 +#: netbox/models/__init__.py:185 tenancy/models/tenants.py:25 +#: tenancy/models/tenants.py:49 vpn/models/l2vpn.py:27 wireless/models.py:55 +msgid "slug" +msgstr "pegar" + +#: circuits/models/providers.py:42 +msgid "provider" +msgstr "proveedora" + +#: circuits/models/providers.py:43 +msgid "providers" +msgstr "proveedores" + +#: circuits/models/providers.py:63 +msgid "account ID" +msgstr "ID de cuenta" + +#: circuits/models/providers.py:86 +msgid "provider account" +msgstr "cuenta de proveedor" + +#: circuits/models/providers.py:87 +msgid "provider accounts" +msgstr "cuentas de proveedores" + +#: circuits/models/providers.py:115 +msgid "service ID" +msgstr "ID de servicio" + +#: circuits/models/providers.py:126 +msgid "provider network" +msgstr "red de proveedores" + +#: circuits/models/providers.py:127 +msgid "provider networks" +msgstr "redes de proveedores" + +#: circuits/tables/circuits.py:29 circuits/tables/providers.py:18 +#: circuits/tables/providers.py:69 circuits/tables/providers.py:99 +#: core/tables/data.py:16 core/tables/jobs.py:14 dcim/forms/filtersets.py:60 +#: dcim/forms/object_create.py:42 dcim/tables/devices.py:88 +#: dcim/tables/devices.py:125 dcim/tables/devices.py:167 +#: dcim/tables/devices.py:318 dcim/tables/devices.py:395 +#: dcim/tables/devices.py:439 dcim/tables/devices.py:491 +#: dcim/tables/devices.py:543 dcim/tables/devices.py:663 +#: dcim/tables/devices.py:744 dcim/tables/devices.py:794 +#: dcim/tables/devices.py:860 dcim/tables/devices.py:975 +#: dcim/tables/devices.py:995 dcim/tables/devices.py:1024 +#: dcim/tables/devices.py:1054 dcim/tables/devicetypes.py:32 +#: dcim/tables/power.py:22 dcim/tables/power.py:62 dcim/tables/racks.py:23 +#: dcim/tables/racks.py:53 dcim/tables/sites.py:24 dcim/tables/sites.py:51 +#: dcim/tables/sites.py:78 dcim/tables/sites.py:125 +#: extras/forms/filtersets.py:190 extras/tables/tables.py:40 +#: extras/tables/tables.py:83 extras/tables/tables.py:115 +#: extras/tables/tables.py:139 extras/tables/tables.py:204 +#: extras/tables/tables.py:251 extras/tables/tables.py:274 +#: extras/tables/tables.py:319 extras/tables/tables.py:371 +#: extras/tables/tables.py:394 ipam/forms/bulk_edit.py:390 +#: ipam/forms/filtersets.py:372 ipam/tables/asn.py:16 ipam/tables/ip.py:85 +#: ipam/tables/ip.py:159 ipam/tables/services.py:15 ipam/tables/services.py:40 +#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:110 ipam/tables/vrfs.py:26 +#: ipam/tables/vrfs.py:67 templates/circuits/circuittype.html:25 +#: templates/circuits/provideraccount.html:29 +#: templates/circuits/providernetwork.html:27 +#: templates/core/datasource.html:35 templates/core/job.html:31 +#: templates/dcim/consoleport.html:31 templates/dcim/consoleserverport.html:31 +#: templates/dcim/devicebay.html:27 templates/dcim/devicerole.html:29 +#: templates/dcim/frontport.html:31 +#: templates/dcim/inc/interface_vlans_table.html:5 +#: templates/dcim/inc/panels/inventory_items.html:10 +#: templates/dcim/interface.html:39 templates/dcim/interface.html:171 +#: templates/dcim/inventoryitem.html:29 +#: templates/dcim/inventoryitemrole.html:19 templates/dcim/location.html:32 +#: templates/dcim/manufacturer.html:39 templates/dcim/modulebay.html:27 +#: templates/dcim/platform.html:32 templates/dcim/poweroutlet.html:31 +#: templates/dcim/powerport.html:31 templates/dcim/rackrole.html:25 +#: templates/dcim/rearport.html:31 templates/dcim/region.html:30 +#: templates/dcim/sitegroup.html:30 +#: templates/dcim/virtualdevicecontext.html:21 +#: templates/extras/admin/plugins_list.html:22 +#: templates/extras/configcontext.html:14 +#: templates/extras/configtemplate.html:14 +#: templates/extras/customfield.html:16 templates/extras/customlink.html:14 +#: templates/extras/eventrule.html:16 templates/extras/exporttemplate.html:21 +#: templates/extras/report_list.html:46 templates/extras/savedfilter.html:14 +#: templates/extras/script_list.html:52 templates/extras/tag.html:17 +#: templates/extras/webhook.html:16 templates/ipam/asnrange.html:16 +#: templates/ipam/fhrpgroup.html:31 templates/ipam/rir.html:25 +#: templates/ipam/role.html:25 templates/ipam/routetarget.html:14 +#: templates/ipam/service.html:27 templates/ipam/servicetemplate.html:16 +#: templates/ipam/vlan.html:38 templates/ipam/vlangroup.html:31 +#: templates/tenancy/contact.html:26 templates/tenancy/contactgroup.html:24 +#: templates/tenancy/contactrole.html:19 templates/tenancy/tenantgroup.html:32 +#: templates/users/group.html:18 templates/users/objectpermission.html:18 +#: templates/virtualization/cluster.html:16 +#: templates/virtualization/clustergroup.html:25 +#: templates/virtualization/clustertype.html:25 +#: templates/virtualization/virtualdisk.html:26 +#: templates/virtualization/virtualmachine.html:18 +#: templates/virtualization/vminterface.html:28 +#: templates/vpn/ikepolicy.html:14 templates/vpn/ikeproposal.html:14 +#: templates/vpn/ipsecpolicy.html:14 templates/vpn/ipsecprofile.html:14 +#: templates/vpn/ipsecprofile.html:39 templates/vpn/ipsecprofile.html:74 +#: templates/vpn/ipsecproposal.html:14 templates/vpn/l2vpn.html:15 +#: templates/vpn/tunnel.html:22 templates/vpn/tunnelgroup.html:29 +#: templates/wireless/wirelesslangroup.html:30 tenancy/tables/contacts.py:19 +#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 +#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 +#: users/tables.py:62 users/tables.py:79 +#: virtualization/forms/bulk_create.py:20 +#: virtualization/forms/object_create.py:13 +#: virtualization/forms/object_create.py:23 +#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 +#: virtualization/tables/clusters.py:62 +#: virtualization/tables/virtualmachines.py:45 +#: virtualization/tables/virtualmachines.py:119 +#: virtualization/tables/virtualmachines.py:172 vpn/tables/crypto.py:18 +#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 +#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 +#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 +#: wireless/tables/wirelesslan.py:79 +msgid "Name" +msgstr "Nombre" + +#: circuits/tables/circuits.py:38 circuits/tables/providers.py:45 +#: circuits/tables/providers.py:79 netbox/navigation/menu.py:254 +#: netbox/navigation/menu.py:258 netbox/navigation/menu.py:260 +#: templates/circuits/provider.html:61 +#: templates/circuits/provideraccount.html:46 +#: templates/circuits/providernetwork.html:54 +msgid "Circuits" +msgstr "Circuitos" + +#: circuits/tables/circuits.py:52 templates/circuits/circuit.html:27 +msgid "Circuit ID" +msgstr "ID de circuito" + +#: circuits/tables/circuits.py:65 wireless/forms/model_forms.py:157 +msgid "Side A" +msgstr "Lado A" + +#: circuits/tables/circuits.py:69 +msgid "Side Z" +msgstr "Lado Z" + +#: circuits/tables/circuits.py:72 templates/circuits/circuit.html:56 +msgid "Commit Rate" +msgstr "Tasa de compromiso" + +#: circuits/tables/circuits.py:75 circuits/tables/providers.py:48 +#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 +#: dcim/tables/devices.py:1037 dcim/tables/devicetypes.py:92 +#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 +#: dcim/tables/power.py:96 dcim/tables/racks.py:76 dcim/tables/racks.py:156 +#: dcim/tables/sites.py:103 extras/forms/bulk_edit.py:320 +#: extras/tables/tables.py:485 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 +#: ipam/tables/ip.py:135 ipam/tables/ip.py:272 ipam/tables/ip.py:325 +#: ipam/tables/ip.py:392 ipam/tables/services.py:24 ipam/tables/services.py:54 +#: ipam/tables/vlans.py:141 ipam/tables/vrfs.py:46 ipam/tables/vrfs.py:71 +#: templates/dcim/cable_edit.html:85 templates/generic/bulk_edit.html:102 +#: templates/inc/panels/comments.html:6 tenancy/tables/contacts.py:68 +#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 +#: virtualization/tables/clusters.py:91 +#: virtualization/tables/virtualmachines.py:68 vpn/tables/crypto.py:37 +#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 +#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:57 +#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +msgid "Comments" +msgstr "Comentarios" + +#: circuits/tables/providers.py:23 +msgid "Accounts" +msgstr "Cuentas" + +#: circuits/tables/providers.py:29 +msgid "Account Count" +msgstr "Recuento de cuentas" + +#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +msgid "ASN Count" +msgstr "Recuento de ASN" + +#: core/choices.py:18 +msgid "New" +msgstr "Nuevo" + +#: core/choices.py:19 +msgid "Queued" +msgstr "En cola" + +#: core/choices.py:20 +msgid "Syncing" +msgstr "Sincronización" + +#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 +#: extras/choices.py:210 templates/core/job.html:75 +msgid "Completed" +msgstr "Completado" + +#: core/choices.py:22 core/choices.py:59 dcim/choices.py:176 +#: dcim/choices.py:222 dcim/choices.py:1496 extras/choices.py:212 +#: virtualization/choices.py:47 +msgid "Failed" +msgstr "Falló" + +#: core/choices.py:35 netbox/navigation/menu.py:330 +#: templates/extras/script/base.html:14 templates/extras/script_list.html:6 +#: templates/extras/script_list.html:20 templates/extras/script_result.html:18 +msgid "Scripts" +msgstr "Guiones" + +#: core/choices.py:36 netbox/navigation/menu.py:324 +#: templates/extras/report/base.html:13 templates/extras/report_list.html:7 +#: templates/extras/report_list.html:12 +msgid "Reports" +msgstr "Informes" + +#: core/choices.py:54 extras/choices.py:207 +msgid "Pending" +msgstr "Pendiente" + +#: core/choices.py:55 core/tables/jobs.py:32 extras/choices.py:208 +#: templates/core/job.html:62 +msgid "Scheduled" +msgstr "Programado" + +#: core/choices.py:56 extras/choices.py:209 +msgid "Running" +msgstr "Corriendo" + +#: core/choices.py:58 extras/choices.py:211 +msgid "Errored" +msgstr "Erróneo" + +#: core/data_backends.py:29 templates/dcim/interface.html:224 +msgid "Local" +msgstr "Local" + +#: core/data_backends.py:47 extras/tables/tables.py:431 +#: templates/account/profile.html:16 templates/users/user.html:18 +#: users/tables.py:31 +msgid "Username" +msgstr "Nombre de usuario" + +#: core/data_backends.py:49 core/data_backends.py:55 +msgid "Only used for cloning with HTTP(S)" +msgstr "Solo se usa para clonar con HTTP (S)" + +#: core/data_backends.py:53 templates/account/base.html:17 +#: templates/account/password.html:11 users/forms/model_forms.py:171 +msgid "Password" +msgstr "Contraseña" + +#: core/data_backends.py:59 +msgid "Branch" +msgstr "Rama" + +#: core/data_backends.py:118 +msgid "AWS access key ID" +msgstr "ID de clave de acceso de AWS" + +#: core/data_backends.py:122 +msgid "AWS secret access key" +msgstr "Clave de acceso secreta de AWS" + +#: core/filtersets.py:49 extras/filtersets.py:203 extras/filtersets.py:538 +#: extras/filtersets.py:566 +msgid "Data source (ID)" +msgstr "Fuente de datos (ID)" + +#: core/filtersets.py:55 +msgid "Data source (name)" +msgstr "Fuente de datos (nombre)" + +#: core/forms/bulk_edit.py:24 ipam/forms/bulk_edit.py:47 +msgid "Enforce unique space" +msgstr "Haga valer un espacio único" + +#: core/forms/bulk_edit.py:33 extras/forms/model_forms.py:202 +#: templates/extras/savedfilter.html:57 vpn/forms/filtersets.py:95 +#: vpn/forms/filtersets.py:124 vpn/forms/filtersets.py:148 +#: vpn/forms/filtersets.py:167 vpn/forms/model_forms.py:294 +#: vpn/forms/model_forms.py:315 vpn/forms/model_forms.py:329 +#: vpn/forms/model_forms.py:350 vpn/forms/model_forms.py:373 +msgid "Parameters" +msgstr "Parámetros" + +#: core/forms/bulk_edit.py:37 templates/core/datasource.html:69 +msgid "Ignore rules" +msgstr "Ignorar las reglas" + +#: core/forms/filtersets.py:26 core/forms/model_forms.py:95 +#: extras/forms/model_forms.py:165 extras/forms/model_forms.py:455 +#: extras/forms/model_forms.py:508 extras/tables/tables.py:149 +#: extras/tables/tables.py:363 extras/tables/tables.py:398 +#: templates/core/datasource.html:31 +#: templates/dcim/device/render_config.html:19 +#: templates/extras/configcontext.html:30 +#: templates/extras/configtemplate.html:22 +#: templates/extras/exporttemplate.html:41 +#: templates/virtualization/virtualmachine/render_config.html:19 +msgid "Data Source" +msgstr "Fuente de datos" + +#: core/forms/filtersets.py:39 core/tables/data.py:26 +#: dcim/forms/bulk_edit.py:1012 dcim/forms/bulk_edit.py:1285 +#: dcim/forms/filtersets.py:1270 dcim/tables/devices.py:568 +#: dcim/tables/devicetypes.py:221 extras/forms/bulk_edit.py:97 +#: extras/forms/bulk_edit.py:161 extras/forms/bulk_edit.py:220 +#: extras/forms/filtersets.py:119 extras/forms/filtersets.py:206 +#: extras/forms/filtersets.py:267 extras/tables/tables.py:122 +#: extras/tables/tables.py:211 extras/tables/tables.py:284 +#: templates/core/datasource.html:43 templates/dcim/interface.html:62 +#: templates/extras/customlink.html:18 templates/extras/eventrule.html:20 +#: templates/extras/savedfilter.html:26 +#: templates/users/objectpermission.html:26 +#: templates/virtualization/vminterface.html:32 users/forms/bulk_edit.py:69 +#: users/forms/filtersets.py:71 users/tables.py:86 +#: virtualization/forms/bulk_edit.py:216 +#: virtualization/forms/filtersets.py:207 +msgid "Enabled" +msgstr "Habilitado" + +#: core/forms/filtersets.py:51 core/forms/mixins.py:21 +msgid "File" +msgstr "Expediente" + +#: core/forms/filtersets.py:56 core/forms/mixins.py:16 +#: extras/forms/filtersets.py:147 extras/forms/filtersets.py:336 +#: extras/forms/filtersets.py:422 +msgid "Data source" +msgstr "Fuente de datos" + +#: core/forms/filtersets.py:64 extras/forms/filtersets.py:449 +msgid "Creation" +msgstr "Creación" + +#: core/forms/filtersets.py:70 extras/forms/filtersets.py:473 +#: extras/forms/filtersets.py:519 extras/tables/tables.py:474 +#: templates/core/job.html:25 templates/extras/objectchange.html:56 +#: tenancy/tables/contacts.py:90 vpn/tables/l2vpn.py:59 +msgid "Object Type" +msgstr "Tipo de objeto" + +#: core/forms/filtersets.py:80 +msgid "Created after" +msgstr "Creado después" + +#: core/forms/filtersets.py:85 +msgid "Created before" +msgstr "Creado antes" + +#: core/forms/filtersets.py:90 +msgid "Scheduled after" +msgstr "Programado después" + +#: core/forms/filtersets.py:95 +msgid "Scheduled before" +msgstr "Programado antes" + +#: core/forms/filtersets.py:100 +msgid "Started after" +msgstr "Comenzó después" + +#: core/forms/filtersets.py:105 +msgid "Started before" +msgstr "Comenzó antes" + +#: core/forms/filtersets.py:110 +msgid "Completed after" +msgstr "Completado después" + +#: core/forms/filtersets.py:115 +msgid "Completed before" +msgstr "Completado antes" + +#: core/forms/filtersets.py:122 dcim/forms/bulk_edit.py:359 +#: dcim/forms/filtersets.py:352 dcim/forms/filtersets.py:396 +#: dcim/forms/model_forms.py:251 extras/forms/filtersets.py:465 +#: extras/forms/filtersets.py:511 templates/dcim/rackreservation.html:65 +#: templates/extras/objectchange.html:40 templates/extras/savedfilter.html:22 +#: templates/users/token.html:22 templates/users/user.html:6 +#: templates/users/user.html:14 users/filtersets.py:74 users/filtersets.py:134 +#: users/forms/filtersets.py:85 users/forms/filtersets.py:126 +#: users/forms/model_forms.py:156 users/forms/model_forms.py:194 +#: users/tables.py:19 +msgid "User" +msgstr "usuario" + +#: core/forms/model_forms.py:52 core/tables/data.py:46 +#: templates/core/datafile.html:36 templates/extras/report/base.html:33 +#: templates/extras/script/base.html:32 templates/extras/script_result.html:45 +msgid "Source" +msgstr "Fuente" + +#: core/forms/model_forms.py:56 +msgid "Backend Parameters" +msgstr "Parámetros de backend" + +#: core/forms/model_forms.py:94 +msgid "File Upload" +msgstr "Carga de archivos" + +#: core/forms/model_forms.py:147 templates/core/configrevision.html:43 +#: templates/dcim/rack_elevation_list.html:6 +msgid "Rack Elevations" +msgstr "Elevaciones de estanterías" + +#: core/forms/model_forms.py:148 dcim/choices.py:1407 +#: dcim/forms/bulk_edit.py:859 dcim/forms/bulk_edit.py:1242 +#: dcim/forms/bulk_edit.py:1260 dcim/tables/racks.py:89 +#: netbox/navigation/menu.py:276 netbox/navigation/menu.py:280 +msgid "Power" +msgstr "Potencia" + +#: core/forms/model_forms.py:149 netbox/navigation/menu.py:142 +#: templates/core/configrevision.html:79 +msgid "IPAM" +msgstr "IPAM" + +#: core/forms/model_forms.py:150 netbox/navigation/menu.py:218 +#: templates/core/configrevision.html:95 vpn/forms/bulk_edit.py:76 +#: vpn/forms/filtersets.py:42 vpn/forms/model_forms.py:60 +#: vpn/forms/model_forms.py:145 +msgid "Security" +msgstr "Seguridad" + +#: core/forms/model_forms.py:151 templates/core/configrevision.html:107 +msgid "Banners" +msgstr "Banners" + +#: core/forms/model_forms.py:152 templates/core/configrevision.html:131 +msgid "Pagination" +msgstr "Paginación" + +#: core/forms/model_forms.py:153 extras/forms/model_forms.py:63 +#: templates/core/configrevision.html:147 +msgid "Validation" +msgstr "Validación" + +#: core/forms/model_forms.py:154 templates/account/preferences.html:6 +#: templates/core/configrevision.html:175 +msgid "User Preferences" +msgstr "Preferencias de usuario" + +#: core/forms/model_forms.py:155 dcim/forms/filtersets.py:658 +#: templates/core/configrevision.html:193 users/forms/model_forms.py:63 +msgid "Miscellaneous" +msgstr "Misceláneo" + +#: core/forms/model_forms.py:158 +msgid "Config Revision" +msgstr "Revisión de configuración" + +#: core/forms/model_forms.py:197 +msgid "This parameter has been defined statically and cannot be modified." +msgstr "Este parámetro se ha definido estáticamente y no se puede modificar." + +#: core/forms/model_forms.py:205 +#, python-brace-format +msgid "Current value: {value}" +msgstr "Valor actual: {value}" + +#: core/forms/model_forms.py:207 +msgid " (default)" +msgstr " (predeterminado)" + +#: core/models/config.py:18 core/models/data.py:259 core/models/files.py:27 +#: core/models/jobs.py:50 extras/models/models.py:760 +#: netbox/models/features.py:52 users/models.py:248 +msgid "created" +msgstr "creado" + +#: core/models/config.py:22 +msgid "comment" +msgstr "comentario" + +#: core/models/config.py:29 +msgid "configuration data" +msgstr "datos de configuración" + +#: core/models/config.py:36 +msgid "config revision" +msgstr "revisión de configuración" + +#: core/models/config.py:37 +msgid "config revisions" +msgstr "revisiones de configuración" + +#: core/models/config.py:41 +msgid "Default configuration" +msgstr "Configuración predeterminada" + +#: core/models/config.py:43 +msgid "Current configuration" +msgstr "Configuración actual" + +#: core/models/config.py:44 +#, python-brace-format +msgid "Config revision #{id}" +msgstr "Revisión de configuración #{id}" + +#: core/models/data.py:46 dcim/models/cables.py:43 +#: dcim/models/device_component_templates.py:177 +#: dcim/models/device_component_templates.py:211 +#: dcim/models/device_component_templates.py:246 +#: dcim/models/device_component_templates.py:308 +#: dcim/models/device_component_templates.py:387 +#: dcim/models/device_component_templates.py:486 +#: dcim/models/device_component_templates.py:586 +#: dcim/models/device_components.py:284 dcim/models/device_components.py:313 +#: dcim/models/device_components.py:346 dcim/models/device_components.py:464 +#: dcim/models/device_components.py:606 dcim/models/device_components.py:971 +#: dcim/models/device_components.py:1045 dcim/models/power.py:101 +#: dcim/models/racks.py:127 extras/models/customfields.py:75 +#: extras/models/search.py:43 virtualization/models/clusters.py:61 +#: vpn/models/l2vpn.py:32 +msgid "type" +msgstr "tipo" + +#: core/models/data.py:51 extras/choices.py:34 extras/models/models.py:194 +#: templates/core/datasource.html:59 +msgid "URL" +msgstr "URL" + +#: core/models/data.py:61 dcim/models/device_component_templates.py:392 +#: dcim/models/device_components.py:513 extras/models/models.py:88 +#: extras/models/models.py:331 extras/models/models.py:556 users/models.py:353 +msgid "enabled" +msgstr "habilitado" + +#: core/models/data.py:65 +msgid "ignore rules" +msgstr "ignorar reglas" + +#: core/models/data.py:67 +msgid "Patterns (one per line) matching files to ignore when syncing" +msgstr "" +"Patrones (uno por línea) que coinciden con los archivos para ignorarlos al " +"sincronizar" + +#: core/models/data.py:70 extras/models/models.py:564 +msgid "parameters" +msgstr "parámetros" + +#: core/models/data.py:75 +msgid "last synced" +msgstr "sincronizado por última vez" + +#: core/models/data.py:83 +msgid "data source" +msgstr "fuente de datos" + +#: core/models/data.py:84 +msgid "data sources" +msgstr "fuentes de datos" + +#: core/models/data.py:124 +#, python-brace-format +msgid "Unknown backend type: {type}" +msgstr "Tipo de backend desconocido: {type}" + +#: core/models/data.py:263 core/models/files.py:31 +#: netbox/models/features.py:58 +msgid "last updated" +msgstr "última actualización" + +#: core/models/data.py:273 dcim/models/cables.py:430 +msgid "path" +msgstr "ruta" + +#: core/models/data.py:276 +msgid "File path relative to the data source's root" +msgstr "Ruta del archivo relativa a la raíz de la fuente de datos" + +#: core/models/data.py:280 ipam/models/ip.py:502 +msgid "size" +msgstr "tamaño" + +#: core/models/data.py:283 +msgid "hash" +msgstr "picadillo" + +#: core/models/data.py:287 +msgid "Length must be 64 hexadecimal characters." +msgstr "La longitud debe ser de 64 caracteres hexadecimales." + +#: core/models/data.py:289 +msgid "SHA256 hash of the file data" +msgstr "Hash SHA256 de los datos del archivo" + +#: core/models/data.py:306 +msgid "data file" +msgstr "archivo de datos" + +#: core/models/data.py:307 +msgid "data files" +msgstr "archivos de datos" + +#: core/models/data.py:393 +msgid "auto sync record" +msgstr "registro de sincronización automática" + +#: core/models/data.py:394 +msgid "auto sync records" +msgstr "sincronización automática de registros" + +#: core/models/files.py:37 +msgid "file root" +msgstr "raíz del archivo" + +#: core/models/files.py:42 +msgid "file path" +msgstr "ruta del archivo" + +#: core/models/files.py:44 +msgid "File path relative to the designated root path" +msgstr "Ruta del archivo relativa a la ruta raíz designada" + +#: core/models/files.py:61 +msgid "managed file" +msgstr "archivo gestionado" + +#: core/models/files.py:62 +msgid "managed files" +msgstr "archivos gestionados" + +#: core/models/jobs.py:54 +msgid "scheduled" +msgstr "programado" + +#: core/models/jobs.py:59 +msgid "interval" +msgstr "intervalo" + +#: core/models/jobs.py:65 +msgid "Recurrence interval (in minutes)" +msgstr "Intervalo de recurrencia (en minutos)" + +#: core/models/jobs.py:68 +msgid "started" +msgstr "iniciado" + +#: core/models/jobs.py:73 +msgid "completed" +msgstr "completado" + +#: core/models/jobs.py:91 extras/models/models.py:123 +#: extras/models/staging.py:87 +msgid "data" +msgstr "dato" + +#: core/models/jobs.py:96 +msgid "error" +msgstr "error" + +#: core/models/jobs.py:101 +msgid "job ID" +msgstr "ID de trabajo" + +#: core/models/jobs.py:112 +msgid "job" +msgstr "trabajo" + +#: core/models/jobs.py:113 +msgid "jobs" +msgstr "trabajos" + +#: core/models/jobs.py:135 +#, python-brace-format +msgid "Jobs cannot be assigned to this object type ({type})." +msgstr "No se pueden asignar trabajos a este tipo de objeto ({type})." + +#: core/tables/config.py:21 users/forms/filtersets.py:45 users/tables.py:39 +msgid "Is Active" +msgstr "Está activo" + +#: core/tables/data.py:50 templates/core/datafile.html:40 +msgid "Path" +msgstr "Ruta" + +#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +msgid "Last updated" +msgstr "Última actualización" + +#: core/tables/jobs.py:10 dcim/tables/devicetypes.py:161 +#: extras/tables/tables.py:174 extras/tables/tables.py:340 +#: netbox/tables/tables.py:184 templates/dcim/virtualchassis_edit.html:53 +#: wireless/tables/wirelesslink.py:16 +msgid "ID" +msgstr "ID" + +#: core/tables/jobs.py:21 extras/choices.py:38 extras/tables/tables.py:236 +#: extras/tables/tables.py:350 extras/tables/tables.py:448 +#: extras/tables/tables.py:479 netbox/tables/tables.py:238 +#: templates/extras/eventrule.html:99 +#: templates/extras/htmx/report_result.html:45 +#: templates/extras/journalentry.html:21 templates/extras/objectchange.html:62 +#: tenancy/tables/contacts.py:93 vpn/tables/l2vpn.py:64 +msgid "Object" +msgstr "Objeto" + +#: core/tables/jobs.py:35 +msgid "Interval" +msgstr "Intervalo" + +#: core/tables/jobs.py:38 templates/core/job.html:71 +#: templates/extras/htmx/report_result.html:7 +#: templates/extras/htmx/script_result.html:8 +msgid "Started" +msgstr "Empezado" + +#: dcim/api/serializers.py:205 templates/dcim/rack.html:33 +msgid "Facility ID" +msgstr "ID de la instalación" + +#: dcim/api/serializers.py:321 dcim/api/serializers.py:680 +msgid "Position (U)" +msgstr "Posición (U)" + +#: dcim/choices.py:21 virtualization/choices.py:21 +msgid "Staging" +msgstr "Puesta en escena" + +#: dcim/choices.py:23 dcim/choices.py:178 dcim/choices.py:223 +#: dcim/choices.py:1420 virtualization/choices.py:23 +#: virtualization/choices.py:48 +msgid "Decommissioning" +msgstr "Desmantelamiento" + +#: dcim/choices.py:24 +msgid "Retired" +msgstr "Retirado" + +#: dcim/choices.py:65 +msgid "2-post frame" +msgstr "Marco de 2 postes" + +#: dcim/choices.py:66 +msgid "4-post frame" +msgstr "Marco de 4 postes" + +#: dcim/choices.py:67 +msgid "4-post cabinet" +msgstr "Armario de 4 postes" + +#: dcim/choices.py:68 +msgid "Wall-mounted frame" +msgstr "Marco de pared" + +#: dcim/choices.py:69 +msgid "Wall-mounted frame (vertical)" +msgstr "Marco de pared (vertical)" + +#: dcim/choices.py:70 +msgid "Wall-mounted cabinet" +msgstr "Armario de pared" + +#: dcim/choices.py:71 +msgid "Wall-mounted cabinet (vertical)" +msgstr "Armario de pared (vertical)" + +#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#, python-brace-format +msgid "{n} inches" +msgstr "{n} pulgadas" + +#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 +#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +msgid "Reserved" +msgstr "Reservado" + +#: dcim/choices.py:101 templates/dcim/device.html:262 +msgid "Available" +msgstr "Disponible" + +#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 +#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +msgid "Deprecated" +msgstr "Obsoleto" + +#: dcim/choices.py:114 templates/dcim/rack.html:128 +msgid "Millimeters" +msgstr "Milímetros" + +#: dcim/choices.py:115 dcim/choices.py:1442 +msgid "Inches" +msgstr "Pulgadas" + +#: dcim/choices.py:140 dcim/forms/bulk_edit.py:66 dcim/forms/bulk_edit.py:85 +#: dcim/forms/bulk_edit.py:171 dcim/forms/bulk_edit.py:1290 +#: dcim/forms/bulk_import.py:59 dcim/forms/bulk_import.py:73 +#: dcim/forms/bulk_import.py:136 dcim/forms/bulk_import.py:503 +#: dcim/forms/bulk_import.py:770 dcim/forms/bulk_import.py:1021 +#: dcim/forms/filtersets.py:226 dcim/forms/model_forms.py:73 +#: dcim/forms/model_forms.py:94 dcim/forms/model_forms.py:172 +#: dcim/forms/model_forms.py:955 dcim/forms/model_forms.py:1296 +#: dcim/forms/object_import.py:181 dcim/tables/devices.py:671 +#: dcim/tables/devices.py:955 extras/tables/tables.py:181 +#: ipam/tables/fhrp.py:59 ipam/tables/ip.py:374 ipam/tables/services.py:44 +#: templates/dcim/interface.html:105 templates/dcim/interface.html:321 +#: templates/dcim/location.html:44 templates/dcim/region.html:38 +#: templates/dcim/sitegroup.html:38 templates/ipam/service.html:31 +#: templates/tenancy/contactgroup.html:32 +#: templates/tenancy/tenantgroup.html:40 +#: templates/virtualization/vminterface.html:42 +#: templates/wireless/wirelesslangroup.html:38 tenancy/forms/bulk_edit.py:26 +#: tenancy/forms/bulk_edit.py:60 tenancy/forms/bulk_import.py:24 +#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:24 +#: tenancy/forms/model_forms.py:69 virtualization/forms/bulk_edit.py:206 +#: virtualization/forms/bulk_import.py:151 +#: virtualization/tables/virtualmachines.py:142 wireless/forms/bulk_edit.py:23 +#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:20 +msgid "Parent" +msgstr "Padre" + +#: dcim/choices.py:141 +msgid "Child" +msgstr "Niño" + +#: dcim/choices.py:155 templates/dcim/device.html:345 +#: templates/dcim/rack.html:181 templates/dcim/rack_elevation_list.html:22 +#: templates/dcim/rackreservation.html:84 +msgid "Front" +msgstr "Delantera" + +#: dcim/choices.py:156 templates/dcim/device.html:351 +#: templates/dcim/rack.html:187 templates/dcim/rack_elevation_list.html:23 +#: templates/dcim/rackreservation.html:90 +msgid "Rear" +msgstr "Trasera" + +#: dcim/choices.py:175 dcim/choices.py:221 virtualization/choices.py:46 +msgid "Staged" +msgstr "Escenificado" + +#: dcim/choices.py:177 +msgid "Inventory" +msgstr "Inventario" + +#: dcim/choices.py:193 +msgid "Front to rear" +msgstr "De adelante hacia atrás" + +#: dcim/choices.py:194 +msgid "Rear to front" +msgstr "De atrás hacia adelante" + +#: dcim/choices.py:195 +msgid "Left to right" +msgstr "De izquierda a derecha" + +#: dcim/choices.py:196 +msgid "Right to left" +msgstr "De derecha a izquierda" + +#: dcim/choices.py:197 +msgid "Side to rear" +msgstr "De lado a atrás" + +#: dcim/choices.py:198 dcim/choices.py:1215 +msgid "Passive" +msgstr "Pasivo" + +#: dcim/choices.py:199 +msgid "Mixed" +msgstr "Mezclado" + +#: dcim/choices.py:443 dcim/choices.py:680 +msgid "NEMA (Non-locking)" +msgstr "NEMA (sin bloqueo)" + +#: dcim/choices.py:465 dcim/choices.py:702 +msgid "NEMA (Locking)" +msgstr "NEMA (Bloqueo)" + +#: dcim/choices.py:488 dcim/choices.py:725 +msgid "California Style" +msgstr "Estilo californiano" + +#: dcim/choices.py:496 +msgid "International/ITA" +msgstr "Internacional/ITA" + +#: dcim/choices.py:526 dcim/choices.py:755 +msgid "Proprietary" +msgstr "Proprietario" + +#: dcim/choices.py:534 dcim/choices.py:764 dcim/choices.py:1131 +#: dcim/choices.py:1133 dcim/choices.py:1338 dcim/choices.py:1340 +#: netbox/navigation/menu.py:188 +msgid "Other" +msgstr "Otros" + +#: dcim/choices.py:733 +msgid "ITA/International" +msgstr "ITA/Internacional" + +#: dcim/choices.py:794 +msgid "Physical" +msgstr "Físico" + +#: dcim/choices.py:795 dcim/choices.py:949 +msgid "Virtual" +msgstr "Virtual" + +#: dcim/choices.py:796 dcim/choices.py:1019 dcim/forms/bulk_edit.py:1398 +#: dcim/forms/filtersets.py:1233 dcim/forms/model_forms.py:881 +#: dcim/forms/model_forms.py:1190 netbox/navigation/menu.py:128 +#: netbox/navigation/menu.py:132 templates/dcim/interface.html:217 +msgid "Wireless" +msgstr "inalámbrico" + +#: dcim/choices.py:947 +msgid "Virtual interfaces" +msgstr "Interfaces virtuales" + +#: dcim/choices.py:950 dcim/forms/bulk_edit.py:1295 +#: dcim/forms/bulk_import.py:777 dcim/forms/model_forms.py:869 +#: dcim/tables/devices.py:675 templates/dcim/interface.html:109 +#: templates/virtualization/vminterface.html:46 +#: virtualization/forms/bulk_edit.py:211 +#: virtualization/forms/bulk_import.py:158 +#: virtualization/tables/virtualmachines.py:146 +msgid "Bridge" +msgstr "puente" + +#: dcim/choices.py:951 +msgid "Link Aggregation Group (LAG)" +msgstr "Grupo de agregación de enlaces (LAG)" + +#: dcim/choices.py:955 +msgid "Ethernet (fixed)" +msgstr "Ethernet (fijo)" + +#: dcim/choices.py:969 +msgid "Ethernet (modular)" +msgstr "Ethernet (modular)" + +#: dcim/choices.py:1005 +msgid "Ethernet (backplane)" +msgstr "Ethernet (placa base)" + +#: dcim/choices.py:1033 +msgid "Cellular" +msgstr "Celular" + +#: dcim/choices.py:1080 dcim/forms/filtersets.py:302 +#: dcim/forms/filtersets.py:736 dcim/forms/filtersets.py:876 +#: dcim/forms/filtersets.py:1426 templates/dcim/inventoryitem.html:53 +#: templates/dcim/virtualchassis_edit.html:55 +msgid "Serial" +msgstr "serie" + +#: dcim/choices.py:1095 +msgid "Coaxial" +msgstr "Coaxial" + +#: dcim/choices.py:1112 +msgid "Stacking" +msgstr "Apilamiento" + +#: dcim/choices.py:1162 +msgid "Half" +msgstr "Mitad" + +#: dcim/choices.py:1163 +msgid "Full" +msgstr "Lleno" + +#: dcim/choices.py:1164 wireless/choices.py:480 +msgid "Auto" +msgstr "Auto" + +#: dcim/choices.py:1175 +msgid "Access" +msgstr "Acceso" + +#: dcim/choices.py:1176 ipam/tables/vlans.py:168 ipam/tables/vlans.py:213 +#: templates/dcim/inc/interface_vlans_table.html:7 +msgid "Tagged" +msgstr "Etiquetado" + +#: dcim/choices.py:1177 +msgid "Tagged (All)" +msgstr "Etiquetado (Todos)" + +#: dcim/choices.py:1206 +msgid "IEEE Standard" +msgstr "Estándar IEEE" + +#: dcim/choices.py:1217 +msgid "Passive 24V (2-pair)" +msgstr "Pasivo 24 V (2 pares)" + +#: dcim/choices.py:1218 +msgid "Passive 24V (4-pair)" +msgstr "Pasivo de 24 V (4 pares)" + +#: dcim/choices.py:1219 +msgid "Passive 48V (2-pair)" +msgstr "Pasivo 48 V (2 pares)" + +#: dcim/choices.py:1220 +msgid "Passive 48V (4-pair)" +msgstr "Pasivo de 48 V (4 pares)" + +#: dcim/choices.py:1282 dcim/choices.py:1378 +msgid "Copper" +msgstr "Cobre" + +#: dcim/choices.py:1305 +msgid "Fiber Optic" +msgstr "Fibra óptica" + +#: dcim/choices.py:1394 +msgid "Fiber" +msgstr "Fibra" + +#: dcim/choices.py:1418 dcim/forms/filtersets.py:1140 +msgid "Connected" +msgstr "Conectado" + +#: dcim/choices.py:1437 +msgid "Kilometers" +msgstr "Kilómetros" + +#: dcim/choices.py:1438 templates/dcim/cable_trace.html:62 +msgid "Meters" +msgstr "Medidores" + +#: dcim/choices.py:1439 +msgid "Centimeters" +msgstr "Centímetros" + +#: dcim/choices.py:1440 +msgid "Miles" +msgstr "Millas" + +#: dcim/choices.py:1441 templates/dcim/cable_trace.html:63 +msgid "Feet" +msgstr "Pies" + +#: dcim/choices.py:1457 templates/dcim/device.html:332 +#: templates/dcim/rack.html:157 +msgid "Kilograms" +msgstr "Kilogramos" + +#: dcim/choices.py:1458 +msgid "Grams" +msgstr "Gramos" + +#: dcim/choices.py:1459 templates/dcim/rack.html:158 +msgid "Pounds" +msgstr "Libras" + +#: dcim/choices.py:1460 +msgid "Ounces" +msgstr "Onzas" + +#: dcim/choices.py:1506 tenancy/choices.py:17 +msgid "Primary" +msgstr "Primaria" + +#: dcim/choices.py:1507 +msgid "Redundant" +msgstr "Redundante" + +#: dcim/choices.py:1528 +msgid "Single phase" +msgstr "Monofásico" + +#: dcim/choices.py:1529 +msgid "Three-phase" +msgstr "Trifásico" + +#: dcim/filtersets.py:80 +msgid "Parent region (ID)" +msgstr "Región principal (ID)" + +#: dcim/filtersets.py:86 +msgid "Parent region (slug)" +msgstr "Región principal (babosa)" + +#: dcim/filtersets.py:97 +msgid "Parent site group (ID)" +msgstr "Grupo de sitio principal (ID)" + +#: dcim/filtersets.py:103 +msgid "Parent site group (slug)" +msgstr "Grupo de sitios principal (slug)" + +#: dcim/filtersets.py:132 ipam/filtersets.py:797 ipam/filtersets.py:930 +msgid "Group (ID)" +msgstr "Grupo (ID)" + +#: dcim/filtersets.py:138 +msgid "Group (slug)" +msgstr "Grupo (babosa)" + +#: dcim/filtersets.py:144 dcim/filtersets.py:149 +msgid "AS (ID)" +msgstr "COMO (ID)" + +#: dcim/filtersets.py:217 dcim/filtersets.py:292 dcim/filtersets.py:390 +#: dcim/filtersets.py:917 dcim/filtersets.py:1213 dcim/filtersets.py:1881 +msgid "Location (ID)" +msgstr "Ubicación (ID)" + +#: dcim/filtersets.py:224 dcim/filtersets.py:299 dcim/filtersets.py:397 +#: dcim/filtersets.py:1219 extras/filtersets.py:447 +msgid "Location (slug)" +msgstr "Ubicación (babosa)" + +#: dcim/filtersets.py:313 dcim/filtersets.py:764 dcim/filtersets.py:854 +#: dcim/filtersets.py:1619 ipam/filtersets.py:347 ipam/filtersets.py:459 +#: ipam/filtersets.py:940 virtualization/filtersets.py:209 +msgid "Role (ID)" +msgstr "Función (ID)" + +#: dcim/filtersets.py:319 dcim/filtersets.py:770 dcim/filtersets.py:860 +#: dcim/filtersets.py:1625 extras/filtersets.py:463 ipam/filtersets.py:353 +#: ipam/filtersets.py:465 ipam/filtersets.py:946 +#: virtualization/filtersets.py:215 +msgid "Role (slug)" +msgstr "Rol (babosa)" + +#: dcim/filtersets.py:347 dcim/filtersets.py:922 dcim/filtersets.py:1224 +#: dcim/filtersets.py:1942 +msgid "Rack (ID)" +msgstr "Rack (ID)" + +#: dcim/filtersets.py:401 extras/filtersets.py:234 extras/filtersets.py:278 +#: extras/filtersets.py:318 extras/filtersets.py:613 +msgid "User (ID)" +msgstr "Usuario (ID)" + +#: dcim/filtersets.py:407 extras/filtersets.py:240 extras/filtersets.py:284 +#: extras/filtersets.py:324 users/filtersets.py:80 users/filtersets.py:140 +msgid "User (name)" +msgstr "Usuario (nombre)" + +#: dcim/filtersets.py:435 dcim/filtersets.py:561 dcim/filtersets.py:754 +#: dcim/filtersets.py:805 dcim/filtersets.py:833 dcim/filtersets.py:1116 +#: dcim/filtersets.py:1609 +msgid "Manufacturer (ID)" +msgstr "Fabricante (ID)" + +#: dcim/filtersets.py:441 dcim/filtersets.py:567 dcim/filtersets.py:760 +#: dcim/filtersets.py:811 dcim/filtersets.py:839 dcim/filtersets.py:1122 +#: dcim/filtersets.py:1615 +msgid "Manufacturer (slug)" +msgstr "Fabricante (babosa)" + +#: dcim/filtersets.py:445 +msgid "Default platform (ID)" +msgstr "Plataforma predeterminada (ID)" + +#: dcim/filtersets.py:451 +msgid "Default platform (slug)" +msgstr "Plataforma predeterminada (slug)" + +#: dcim/filtersets.py:454 dcim/forms/filtersets.py:452 +msgid "Has a front image" +msgstr "Tiene una imagen frontal" + +#: dcim/filtersets.py:458 dcim/forms/filtersets.py:459 +msgid "Has a rear image" +msgstr "Tiene una imagen trasera" + +#: dcim/filtersets.py:463 dcim/filtersets.py:571 dcim/filtersets.py:975 +#: dcim/forms/filtersets.py:466 dcim/forms/filtersets.py:563 +#: dcim/forms/filtersets.py:775 +msgid "Has console ports" +msgstr "Tiene puertos de consola" + +#: dcim/filtersets.py:467 dcim/filtersets.py:575 dcim/filtersets.py:979 +#: dcim/forms/filtersets.py:473 dcim/forms/filtersets.py:570 +#: dcim/forms/filtersets.py:782 +msgid "Has console server ports" +msgstr "Tiene puertos de servidor de consola" + +#: dcim/filtersets.py:471 dcim/filtersets.py:579 dcim/filtersets.py:983 +#: dcim/forms/filtersets.py:480 dcim/forms/filtersets.py:577 +#: dcim/forms/filtersets.py:789 +msgid "Has power ports" +msgstr "Tiene puertos de alimentación" + +#: dcim/filtersets.py:475 dcim/filtersets.py:583 dcim/filtersets.py:987 +#: dcim/forms/filtersets.py:487 dcim/forms/filtersets.py:584 +#: dcim/forms/filtersets.py:796 +msgid "Has power outlets" +msgstr "Tiene tomas de corriente" + +#: dcim/filtersets.py:479 dcim/filtersets.py:587 dcim/filtersets.py:991 +#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:591 +#: dcim/forms/filtersets.py:803 +msgid "Has interfaces" +msgstr "Tiene interfaces" + +#: dcim/filtersets.py:483 dcim/filtersets.py:591 dcim/filtersets.py:995 +#: dcim/forms/filtersets.py:501 dcim/forms/filtersets.py:598 +#: dcim/forms/filtersets.py:810 +msgid "Has pass-through ports" +msgstr "Tiene puertos de paso" + +#: dcim/filtersets.py:487 dcim/filtersets.py:999 dcim/forms/filtersets.py:515 +msgid "Has module bays" +msgstr "Tiene compartimentos para módulos" + +#: dcim/filtersets.py:491 dcim/filtersets.py:1003 dcim/forms/filtersets.py:508 +msgid "Has device bays" +msgstr "Tiene compartimentos para dispositivos" + +#: dcim/filtersets.py:495 dcim/forms/filtersets.py:522 +msgid "Has inventory items" +msgstr "Tiene artículos de inventario" + +#: dcim/filtersets.py:638 dcim/filtersets.py:849 dcim/filtersets.py:1245 +msgid "Device type (ID)" +msgstr "Tipo de dispositivo (ID)" + +#: dcim/filtersets.py:651 dcim/filtersets.py:1127 +msgid "Module type (ID)" +msgstr "Tipo de módulo (ID)" + +#: dcim/filtersets.py:750 dcim/filtersets.py:1605 +msgid "Parent inventory item (ID)" +msgstr "Artículo del inventario principal (ID)" + +#: dcim/filtersets.py:793 dcim/filtersets.py:815 dcim/filtersets.py:971 +#: virtualization/filtersets.py:237 +msgid "Config template (ID)" +msgstr "Plantilla de configuración (ID)" + +#: dcim/filtersets.py:845 +msgid "Device type (slug)" +msgstr "Tipo de dispositivo (slug)" + +#: dcim/filtersets.py:865 +msgid "Parent Device (ID)" +msgstr "Dispositivo principal (ID)" + +#: dcim/filtersets.py:869 virtualization/filtersets.py:219 +msgid "Platform (ID)" +msgstr "Plataforma (ID)" + +#: dcim/filtersets.py:875 extras/filtersets.py:474 +#: virtualization/filtersets.py:225 +msgid "Platform (slug)" +msgstr "Plataforma (babosa)" + +#: dcim/filtersets.py:911 dcim/filtersets.py:1208 dcim/filtersets.py:1703 +#: dcim/filtersets.py:1875 dcim/filtersets.py:1933 +msgid "Site name (slug)" +msgstr "Nombre del sitio (slug)" + +#: dcim/filtersets.py:926 +msgid "VM cluster (ID)" +msgstr "Clúster de máquinas virtuales (ID)" + +#: dcim/filtersets.py:932 +msgid "Device model (slug)" +msgstr "Modelo de dispositivo (slug)" + +#: dcim/filtersets.py:943 dcim/forms/bulk_edit.py:421 +msgid "Is full depth" +msgstr "Es de profundidad total" + +#: dcim/filtersets.py:947 dcim/forms/common.py:18 dcim/forms/filtersets.py:745 +#: dcim/forms/filtersets.py:1285 dcim/models/device_components.py:519 +#: virtualization/filtersets.py:229 virtualization/filtersets.py:295 +#: virtualization/forms/filtersets.py:168 +#: virtualization/forms/filtersets.py:215 +msgid "MAC address" +msgstr "Dirección MAC" + +#: dcim/filtersets.py:954 dcim/forms/filtersets.py:754 +#: dcim/forms/filtersets.py:841 virtualization/filtersets.py:233 +#: virtualization/forms/filtersets.py:172 +msgid "Has a primary IP" +msgstr "Tiene una IP principal" + +#: dcim/filtersets.py:958 +msgid "Has an out-of-band IP" +msgstr "Tiene una IP fuera de banda" + +#: dcim/filtersets.py:963 +msgid "Virtual chassis (ID)" +msgstr "Chasis virtual (ID)" + +#: dcim/filtersets.py:967 +msgid "Is a virtual chassis member" +msgstr "Es un miembro del chasis virtual" + +#: dcim/filtersets.py:1008 +msgid "OOB IP (ID)" +msgstr "LOB VIP (ID)" + +#: dcim/filtersets.py:1133 +msgid "Module type (model)" +msgstr "Tipo de módulo (modelo)" + +#: dcim/filtersets.py:1139 +msgid "Module Bay (ID)" +msgstr "Bahía de módulos (ID)" + +#: dcim/filtersets.py:1143 dcim/filtersets.py:1234 ipam/filtersets.py:577 +#: ipam/filtersets.py:807 ipam/filtersets.py:1015 +#: virtualization/filtersets.py:160 vpn/filtersets.py:351 +msgid "Device (ID)" +msgstr "Dispositivo (ID)" + +#: dcim/filtersets.py:1230 +msgid "Rack (name)" +msgstr "Rack (nombre)" + +#: dcim/filtersets.py:1240 ipam/filtersets.py:572 ipam/filtersets.py:802 +#: ipam/filtersets.py:1021 vpn/filtersets.py:346 +msgid "Device (name)" +msgstr "Dispositivo (nombre)" + +#: dcim/filtersets.py:1251 +msgid "Device type (model)" +msgstr "Tipo de dispositivo (modelo)" + +#: dcim/filtersets.py:1256 dcim/filtersets.py:1279 +msgid "Device role (ID)" +msgstr "Función del dispositivo (ID)" + +#: dcim/filtersets.py:1262 dcim/filtersets.py:1285 +msgid "Device role (slug)" +msgstr "Función del dispositivo (slug)" + +#: dcim/filtersets.py:1267 +msgid "Virtual Chassis (ID)" +msgstr "Chasis virtual (ID)" + +#: dcim/filtersets.py:1273 dcim/forms/filtersets.py:106 +#: dcim/tables/devices.py:235 netbox/navigation/menu.py:67 +#: templates/dcim/device.html:123 templates/dcim/device_edit.html:93 +#: templates/dcim/virtualchassis.html:20 +#: templates/dcim/virtualchassis_add.html:8 +#: templates/dcim/virtualchassis_edit.html:25 +msgid "Virtual Chassis" +msgstr "Chasis virtual" + +#: dcim/filtersets.py:1305 +msgid "Module (ID)" +msgstr "Módulo (ID)" + +#: dcim/filtersets.py:1409 ipam/forms/bulk_import.py:188 +#: vpn/forms/bulk_import.py:303 +msgid "Assigned VLAN" +msgstr "VLAN asignada" + +#: dcim/filtersets.py:1413 +msgid "Assigned VID" +msgstr "VID asignado" + +#: dcim/filtersets.py:1418 dcim/forms/bulk_edit.py:1374 +#: dcim/forms/bulk_import.py:828 dcim/forms/filtersets.py:1328 +#: dcim/forms/model_forms.py:1175 dcim/models/device_components.py:712 +#: dcim/tables/devices.py:637 ipam/filtersets.py:282 ipam/filtersets.py:293 +#: ipam/filtersets.py:449 ipam/filtersets.py:550 ipam/filtersets.py:561 +#: ipam/forms/bulk_edit.py:226 ipam/forms/bulk_edit.py:281 +#: ipam/forms/bulk_edit.py:323 ipam/forms/bulk_import.py:156 +#: ipam/forms/bulk_import.py:242 ipam/forms/bulk_import.py:278 +#: ipam/forms/filtersets.py:66 ipam/forms/filtersets.py:167 +#: ipam/forms/filtersets.py:295 ipam/forms/model_forms.py:59 +#: ipam/forms/model_forms.py:203 ipam/forms/model_forms.py:246 +#: ipam/forms/model_forms.py:290 ipam/forms/model_forms.py:412 +#: ipam/forms/model_forms.py:426 ipam/forms/model_forms.py:440 +#: ipam/models/ip.py:232 ipam/models/ip.py:511 ipam/models/ip.py:719 +#: ipam/models/vrfs.py:62 ipam/tables/ip.py:241 ipam/tables/ip.py:306 +#: ipam/tables/ip.py:356 ipam/tables/ip.py:445 +#: templates/dcim/interface.html:138 templates/ipam/ipaddress.html:21 +#: templates/ipam/iprange.html:43 templates/ipam/prefix.html:20 +#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:14 +#: templates/virtualization/vminterface.html:50 +#: virtualization/forms/bulk_edit.py:260 +#: virtualization/forms/bulk_import.py:171 +#: virtualization/forms/filtersets.py:220 +#: virtualization/forms/model_forms.py:347 +#: virtualization/models/virtualmachines.py:348 +#: virtualization/tables/virtualmachines.py:123 +msgid "VRF" +msgstr "VRF" + +#: dcim/filtersets.py:1424 ipam/filtersets.py:288 ipam/filtersets.py:299 +#: ipam/filtersets.py:455 ipam/filtersets.py:556 ipam/filtersets.py:567 +msgid "VRF (RD)" +msgstr "VRF (ROJO)" + +#: dcim/filtersets.py:1429 ipam/filtersets.py:963 vpn/filtersets.py:314 +msgid "L2VPN (ID)" +msgstr "L2VPN (ID)" + +#: dcim/filtersets.py:1435 dcim/forms/filtersets.py:1333 +#: dcim/tables/devices.py:585 ipam/filtersets.py:969 +#: ipam/forms/filtersets.py:499 ipam/tables/vlans.py:133 +#: templates/dcim/interface.html:94 templates/ipam/vlan.html:69 +#: templates/vpn/l2vpntermination.html:15 +#: virtualization/forms/filtersets.py:225 vpn/forms/bulk_import.py:275 +#: vpn/forms/filtersets.py:242 vpn/forms/model_forms.py:402 +#: vpn/forms/model_forms.py:420 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +msgid "L2VPN" +msgstr "L2VPN" + +#: dcim/filtersets.py:1467 +msgid "Virtual Chassis Interfaces for Device" +msgstr "Interfaces de chasis virtuales para dispositivos" + +#: dcim/filtersets.py:1472 +msgid "Virtual Chassis Interfaces for Device (ID)" +msgstr "Interfaces de chasis virtuales para dispositivos (ID)" + +#: dcim/filtersets.py:1476 +msgid "Kind of interface" +msgstr "Tipo de interfaz" + +#: dcim/filtersets.py:1481 virtualization/filtersets.py:287 +msgid "Parent interface (ID)" +msgstr "Interfaz principal (ID)" + +#: dcim/filtersets.py:1486 virtualization/filtersets.py:292 +msgid "Bridged interface (ID)" +msgstr "Interfaz puenteada (ID)" + +#: dcim/filtersets.py:1491 +msgid "LAG interface (ID)" +msgstr "Interfaz LAG (ID)" + +#: dcim/filtersets.py:1660 +msgid "Master (ID)" +msgstr "Maestro (ID)" + +#: dcim/filtersets.py:1666 +msgid "Master (name)" +msgstr "Maestro (nombre)" + +#: dcim/filtersets.py:1708 tenancy/filtersets.py:220 +msgid "Tenant (ID)" +msgstr "Inquilino (ID)" + +#: dcim/filtersets.py:1714 extras/filtersets.py:523 tenancy/filtersets.py:226 +msgid "Tenant (slug)" +msgstr "Inquilino (babosa)" + +#: dcim/filtersets.py:1749 dcim/forms/filtersets.py:990 +msgid "Unterminated" +msgstr "Inacabado" + +#: dcim/filtersets.py:1937 +msgid "Power panel (ID)" +msgstr "Panel de alimentación (ID)" + +#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:410 +#: extras/forms/model_forms.py:444 extras/forms/model_forms.py:495 +#: netbox/forms/base.py:71 netbox/forms/mixins.py:79 +#: netbox/tables/columns.py:448 +#: templates/circuits/inc/circuit_termination.html:119 +#: templates/generic/bulk_edit.html:81 templates/inc/panels/tags.html:5 +#: utilities/forms/fields/fields.py:81 +msgid "Tags" +msgstr "Etiquetas" + +#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1390 +#: dcim/forms/model_forms.py:422 dcim/forms/model_forms.py:468 +#: dcim/forms/object_create.py:196 dcim/forms/object_create.py:352 +#: dcim/tables/devices.py:198 dcim/tables/devices.py:720 +#: dcim/tables/devicetypes.py:242 templates/dcim/device.html:45 +#: templates/dcim/device.html:129 templates/dcim/modulebay.html:35 +#: templates/dcim/virtualchassis.html:59 +#: templates/dcim/virtualchassis_edit.html:56 +msgid "Position" +msgstr "Posición" + +#: dcim/forms/bulk_create.py:114 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of names being " +"created.)" +msgstr "" +"Se admiten los rangos alfanuméricos. (Debe coincidir con el número de " +"nombres que se están creando)." + +#: dcim/forms/bulk_edit.py:115 dcim/forms/bulk_import.py:99 +#: dcim/forms/model_forms.py:120 dcim/tables/sites.py:89 +#: ipam/filtersets.py:936 ipam/forms/bulk_edit.py:528 +#: ipam/forms/bulk_import.py:444 ipam/forms/model_forms.py:509 +#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 +#: templates/dcim/interface.html:294 templates/dcim/site.html:37 +#: templates/ipam/inc/panels/fhrp_groups.html:10 templates/ipam/vlan.html:30 +#: templates/tenancy/contact.html:22 templates/tenancy/tenant.html:21 +#: templates/users/group.html:6 templates/users/group.html:14 +#: templates/virtualization/cluster.html:32 templates/vpn/tunnel.html:30 +#: templates/wireless/wirelesslan.html:19 tenancy/forms/bulk_edit.py:42 +#: tenancy/forms/bulk_edit.py:93 tenancy/forms/bulk_import.py:40 +#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:47 +#: tenancy/forms/filtersets.py:77 tenancy/forms/filtersets.py:96 +#: tenancy/forms/model_forms.py:46 tenancy/forms/model_forms.py:102 +#: tenancy/forms/model_forms.py:124 tenancy/tables/contacts.py:60 +#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 +#: users/filtersets.py:42 users/filtersets.py:145 users/forms/filtersets.py:32 +#: users/forms/filtersets.py:38 users/forms/filtersets.py:80 +#: virtualization/forms/bulk_edit.py:64 virtualization/forms/bulk_import.py:47 +#: virtualization/forms/filtersets.py:84 +#: virtualization/forms/model_forms.py:69 virtualization/tables/clusters.py:70 +#: vpn/forms/bulk_edit.py:111 vpn/forms/bulk_import.py:157 +#: vpn/forms/filtersets.py:113 vpn/tables/crypto.py:31 +#: wireless/forms/bulk_edit.py:47 wireless/forms/bulk_import.py:36 +#: wireless/forms/filtersets.py:45 wireless/forms/model_forms.py:41 +#: wireless/tables/wirelesslan.py:48 +msgid "Group" +msgstr "Grupo" + +#: dcim/forms/bulk_edit.py:130 +msgid "Contact name" +msgstr "Nombre de contacto" + +#: dcim/forms/bulk_edit.py:135 +msgid "Contact phone" +msgstr "Teléfono de contacto" + +#: dcim/forms/bulk_edit.py:141 +msgid "Contact E-mail" +msgstr "Correo electrónico de contacto" + +#: dcim/forms/bulk_edit.py:144 dcim/forms/bulk_import.py:122 +#: dcim/forms/model_forms.py:131 +msgid "Time zone" +msgstr "Zona horaria" + +#: dcim/forms/bulk_edit.py:266 dcim/forms/bulk_edit.py:1152 +#: dcim/forms/bulk_edit.py:1539 dcim/forms/bulk_import.py:199 +#: dcim/forms/bulk_import.py:1009 dcim/forms/filtersets.py:299 +#: dcim/forms/filtersets.py:704 dcim/forms/filtersets.py:1417 +#: dcim/forms/model_forms.py:224 dcim/forms/model_forms.py:963 +#: dcim/forms/model_forms.py:1304 dcim/forms/object_import.py:186 +#: dcim/tables/devices.py:202 dcim/tables/devices.py:828 +#: dcim/tables/devices.py:939 dcim/tables/devicetypes.py:300 +#: dcim/tables/racks.py:69 extras/filtersets.py:457 +#: ipam/forms/bulk_edit.py:245 ipam/forms/bulk_edit.py:294 +#: ipam/forms/bulk_edit.py:342 ipam/forms/bulk_edit.py:546 +#: ipam/forms/bulk_import.py:196 ipam/forms/bulk_import.py:261 +#: ipam/forms/bulk_import.py:297 ipam/forms/bulk_import.py:463 +#: ipam/forms/filtersets.py:232 ipam/forms/filtersets.py:278 +#: ipam/forms/filtersets.py:346 ipam/forms/filtersets.py:490 +#: ipam/forms/model_forms.py:187 ipam/forms/model_forms.py:222 +#: ipam/forms/model_forms.py:249 ipam/forms/model_forms.py:647 +#: ipam/tables/ip.py:257 ipam/tables/ip.py:313 ipam/tables/ip.py:363 +#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:230 +#: templates/dcim/device.html:187 +#: templates/dcim/inc/panels/inventory_items.html:12 +#: templates/dcim/interface.html:231 templates/dcim/inventoryitem.html:37 +#: templates/dcim/rack.html:50 templates/ipam/ipaddress.html:44 +#: templates/ipam/iprange.html:53 templates/ipam/prefix.html:78 +#: templates/ipam/role.html:20 templates/ipam/vlan.html:55 +#: templates/virtualization/virtualmachine.html:26 +#: templates/vpn/tunneltermination.html:18 +#: templates/wireless/inc/wirelesslink_interface.html:20 +#: tenancy/forms/bulk_edit.py:141 tenancy/forms/filtersets.py:106 +#: tenancy/forms/model_forms.py:139 tenancy/tables/contacts.py:102 +#: virtualization/forms/bulk_edit.py:144 +#: virtualization/forms/bulk_import.py:106 +#: virtualization/forms/filtersets.py:153 +#: virtualization/forms/model_forms.py:198 +#: virtualization/tables/virtualmachines.py:65 vpn/forms/bulk_edit.py:86 +#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:84 +#: vpn/forms/model_forms.py:77 vpn/forms/model_forms.py:112 +#: vpn/tables/tunnels.py:78 +msgid "Role" +msgstr "Rol" + +#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:605 +#: dcim/forms/bulk_edit.py:654 templates/dcim/device.html:106 +#: templates/dcim/module.html:75 templates/dcim/modulebay.html:69 +#: templates/dcim/rack.html:58 +msgid "Serial Number" +msgstr "Número de serie" + +#: dcim/forms/bulk_edit.py:276 dcim/forms/filtersets.py:306 +#: dcim/forms/filtersets.py:740 dcim/forms/filtersets.py:880 +#: dcim/forms/filtersets.py:1430 +msgid "Asset tag" +msgstr "Etiqueta de activo" + +#: dcim/forms/bulk_edit.py:286 dcim/forms/bulk_import.py:212 +#: dcim/forms/filtersets.py:291 templates/dcim/rack.html:91 +#: templates/dcim/rack_edit.html:48 +msgid "Width" +msgstr "Anchura" + +#: dcim/forms/bulk_edit.py:292 +msgid "Height (U)" +msgstr "Altura (U)" + +#: dcim/forms/bulk_edit.py:297 +msgid "Descending units" +msgstr "Unidades descendentes" + +#: dcim/forms/bulk_edit.py:300 +msgid "Outer width" +msgstr "Anchura exterior" + +#: dcim/forms/bulk_edit.py:305 +msgid "Outer depth" +msgstr "Profundidad exterior" + +#: dcim/forms/bulk_edit.py:310 dcim/forms/bulk_import.py:217 +msgid "Outer unit" +msgstr "Unidad exterior" + +#: dcim/forms/bulk_edit.py:315 +msgid "Mounting depth" +msgstr "Profundidad de montaje" + +#: dcim/forms/bulk_edit.py:320 dcim/forms/bulk_edit.py:349 +#: dcim/forms/bulk_edit.py:434 dcim/forms/bulk_edit.py:457 +#: dcim/forms/bulk_edit.py:473 dcim/forms/bulk_edit.py:493 +#: dcim/forms/bulk_import.py:324 dcim/forms/bulk_import.py:350 +#: dcim/forms/filtersets.py:250 dcim/forms/filtersets.py:311 +#: dcim/forms/filtersets.py:335 dcim/forms/filtersets.py:423 +#: dcim/forms/filtersets.py:529 dcim/forms/filtersets.py:548 +#: dcim/forms/filtersets.py:605 dcim/forms/model_forms.py:337 +#: dcim/tables/devicetypes.py:103 dcim/tables/modules.py:35 +#: dcim/tables/racks.py:103 extras/forms/bulk_edit.py:45 +#: extras/forms/bulk_edit.py:107 extras/forms/bulk_edit.py:157 +#: extras/forms/bulk_edit.py:277 extras/forms/filtersets.py:60 +#: extras/forms/filtersets.py:133 extras/forms/filtersets.py:220 +#: ipam/forms/bulk_edit.py:187 templates/dcim/device.html:329 +#: templates/dcim/devicetype.html:52 templates/dcim/moduletype.html:31 +#: templates/dcim/rack_edit.html:60 templates/dcim/rack_edit.html:63 +#: templates/extras/configcontext.html:18 templates/extras/customlink.html:26 +#: templates/extras/savedfilter.html:34 templates/ipam/role.html:33 +msgid "Weight" +msgstr "Peso" + +#: dcim/forms/bulk_edit.py:325 dcim/forms/filtersets.py:316 +msgid "Max weight" +msgstr "Peso máximo" + +#: dcim/forms/bulk_edit.py:330 dcim/forms/bulk_edit.py:439 +#: dcim/forms/bulk_edit.py:478 dcim/forms/bulk_import.py:223 +#: dcim/forms/bulk_import.py:329 dcim/forms/bulk_import.py:355 +#: dcim/forms/filtersets.py:321 dcim/forms/filtersets.py:533 +#: dcim/forms/filtersets.py:609 +msgid "Weight unit" +msgstr "Unidad de peso" + +#: dcim/forms/bulk_edit.py:344 dcim/forms/bulk_edit.py:800 +#: dcim/forms/bulk_import.py:262 dcim/forms/bulk_import.py:265 +#: dcim/forms/bulk_import.py:490 dcim/forms/bulk_import.py:1286 +#: dcim/forms/bulk_import.py:1290 dcim/forms/filtersets.py:101 +#: dcim/forms/filtersets.py:339 dcim/forms/filtersets.py:353 +#: dcim/forms/filtersets.py:391 dcim/forms/filtersets.py:699 +#: dcim/forms/filtersets.py:948 dcim/forms/filtersets.py:1080 +#: dcim/forms/model_forms.py:241 dcim/forms/model_forms.py:413 +#: dcim/forms/model_forms.py:662 dcim/forms/object_create.py:399 +#: dcim/tables/devices.py:194 dcim/tables/power.py:70 dcim/tables/racks.py:148 +#: ipam/forms/bulk_edit.py:464 ipam/forms/filtersets.py:427 +#: ipam/forms/model_forms.py:571 templates/dcim/device.html:30 +#: templates/dcim/inc/cable_termination.html:16 +#: templates/dcim/powerfeed.html:31 templates/dcim/rack.html:14 +#: templates/dcim/rack/base.html:4 templates/dcim/rack_edit.html:8 +#: templates/dcim/rackreservation.html:20 +#: templates/dcim/rackreservation.html:39 +#: virtualization/forms/model_forms.py:116 +msgid "Rack" +msgstr "Estante" + +#: dcim/forms/bulk_edit.py:346 dcim/forms/bulk_edit.py:623 +#: dcim/forms/filtersets.py:247 dcim/forms/filtersets.py:332 +#: dcim/forms/filtersets.py:417 dcim/forms/filtersets.py:543 +#: dcim/forms/filtersets.py:652 dcim/forms/filtersets.py:853 +#: dcim/forms/model_forms.py:589 dcim/forms/model_forms.py:1374 +#: templates/dcim/device_edit.html:20 +#: templates/dcim/inventoryitem_edit.html:23 +msgid "Hardware" +msgstr "Hardware" + +#: dcim/forms/bulk_edit.py:400 dcim/forms/bulk_edit.py:464 +#: dcim/forms/bulk_edit.py:528 dcim/forms/bulk_edit.py:552 +#: dcim/forms/bulk_edit.py:633 dcim/forms/bulk_edit.py:1157 +#: dcim/forms/bulk_edit.py:1544 dcim/forms/bulk_import.py:311 +#: dcim/forms/bulk_import.py:345 dcim/forms/bulk_import.py:387 +#: dcim/forms/bulk_import.py:423 dcim/forms/bulk_import.py:1015 +#: dcim/forms/filtersets.py:429 dcim/forms/filtersets.py:554 +#: dcim/forms/filtersets.py:631 dcim/forms/filtersets.py:709 +#: dcim/forms/filtersets.py:858 dcim/forms/filtersets.py:1423 +#: dcim/forms/model_forms.py:274 dcim/forms/model_forms.py:288 +#: dcim/forms/model_forms.py:330 dcim/forms/model_forms.py:370 +#: dcim/forms/model_forms.py:968 dcim/forms/model_forms.py:1309 +#: dcim/forms/object_import.py:192 dcim/tables/devices.py:129 +#: dcim/tables/devices.py:205 dcim/tables/devices.py:942 +#: dcim/tables/devicetypes.py:81 dcim/tables/devicetypes.py:304 +#: dcim/tables/modules.py:20 dcim/tables/modules.py:60 +#: templates/dcim/devicetype.html:17 templates/dcim/inventoryitem.html:45 +#: templates/dcim/manufacturer.html:34 templates/dcim/modulebay.html:61 +#: templates/dcim/moduletype.html:15 templates/dcim/platform.html:40 +msgid "Manufacturer" +msgstr "fabricante" + +#: dcim/forms/bulk_edit.py:405 dcim/forms/bulk_import.py:317 +#: dcim/forms/filtersets.py:434 dcim/forms/model_forms.py:292 +msgid "Default platform" +msgstr "Plataforma predeterminada" + +#: dcim/forms/bulk_edit.py:410 dcim/forms/bulk_edit.py:469 +#: dcim/forms/filtersets.py:437 dcim/forms/filtersets.py:558 +msgid "Part number" +msgstr "Número de pieza" + +#: dcim/forms/bulk_edit.py:414 +msgid "U height" +msgstr "Altura en U" + +#: dcim/forms/bulk_edit.py:426 +msgid "Exclude from utilization" +msgstr "Excluir de la utilización" + +#: dcim/forms/bulk_edit.py:429 dcim/forms/bulk_edit.py:598 +#: dcim/forms/bulk_import.py:517 dcim/forms/filtersets.py:446 +#: dcim/forms/filtersets.py:731 templates/dcim/device.html:100 +#: templates/dcim/devicetype.html:68 +msgid "Airflow" +msgstr "Flujo de aire" + +#: dcim/forms/bulk_edit.py:453 dcim/forms/model_forms.py:303 +#: dcim/tables/devicetypes.py:78 templates/dcim/device.html:90 +#: templates/dcim/devicebay.html:59 templates/dcim/module.html:59 +msgid "Device Type" +msgstr "Tipo de dispositivo" + +#: dcim/forms/bulk_edit.py:492 dcim/forms/model_forms.py:336 +#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 +#: templates/dcim/module.html:63 templates/dcim/modulebay.html:65 +#: templates/dcim/moduletype.html:11 +msgid "Module Type" +msgstr "Tipo de módulo" + +#: dcim/forms/bulk_edit.py:506 dcim/models/devices.py:472 +msgid "VM role" +msgstr "Función de máquina virtual" + +#: dcim/forms/bulk_edit.py:509 dcim/forms/bulk_edit.py:533 +#: dcim/forms/bulk_edit.py:613 dcim/forms/bulk_import.py:368 +#: dcim/forms/bulk_import.py:372 dcim/forms/bulk_import.py:394 +#: dcim/forms/bulk_import.py:398 dcim/forms/bulk_import.py:523 +#: dcim/forms/bulk_import.py:527 dcim/forms/filtersets.py:620 +#: dcim/forms/filtersets.py:636 dcim/forms/filtersets.py:750 +#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:375 +#: dcim/forms/model_forms.py:477 virtualization/forms/bulk_import.py:132 +#: virtualization/forms/bulk_import.py:133 +#: virtualization/forms/filtersets.py:180 +#: virtualization/forms/model_forms.py:218 +msgid "Config template" +msgstr "Plantilla de configuración" + +#: dcim/forms/bulk_edit.py:557 dcim/forms/bulk_edit.py:951 +#: dcim/forms/bulk_import.py:429 dcim/forms/filtersets.py:111 +#: dcim/forms/model_forms.py:435 dcim/forms/model_forms.py:776 +#: dcim/forms/model_forms.py:790 extras/filtersets.py:452 +msgid "Device type" +msgstr "Tipo de dispositivo" + +#: dcim/forms/bulk_edit.py:565 dcim/forms/bulk_import.py:410 +#: dcim/forms/filtersets.py:116 dcim/forms/model_forms.py:440 +msgid "Device role" +msgstr "Función del dispositivo" + +#: dcim/forms/bulk_edit.py:588 dcim/forms/bulk_import.py:435 +#: dcim/forms/filtersets.py:723 dcim/forms/model_forms.py:385 +#: dcim/forms/model_forms.py:444 extras/filtersets.py:468 +#: templates/dcim/device.html:191 templates/dcim/platform.html:27 +#: templates/virtualization/virtualmachine.html:30 +#: virtualization/forms/bulk_edit.py:159 +#: virtualization/forms/bulk_import.py:122 +#: virtualization/forms/filtersets.py:164 +#: virtualization/forms/model_forms.py:206 +msgid "Platform" +msgstr "Plataforma" + +#: dcim/forms/bulk_edit.py:621 dcim/forms/bulk_edit.py:1171 +#: dcim/forms/bulk_edit.py:1534 dcim/forms/bulk_edit.py:1580 +#: dcim/forms/bulk_import.py:578 dcim/forms/bulk_import.py:640 +#: dcim/forms/bulk_import.py:666 dcim/forms/bulk_import.py:692 +#: dcim/forms/bulk_import.py:712 dcim/forms/bulk_import.py:765 +#: dcim/forms/bulk_import.py:879 dcim/forms/bulk_import.py:927 +#: dcim/forms/bulk_import.py:944 dcim/forms/bulk_import.py:956 +#: dcim/forms/bulk_import.py:1004 dcim/forms/bulk_import.py:1350 +#: dcim/forms/connections.py:23 dcim/forms/filtersets.py:128 +#: dcim/forms/filtersets.py:831 dcim/forms/filtersets.py:964 +#: dcim/forms/filtersets.py:1154 dcim/forms/filtersets.py:1176 +#: dcim/forms/filtersets.py:1198 dcim/forms/filtersets.py:1215 +#: dcim/forms/filtersets.py:1235 dcim/forms/filtersets.py:1343 +#: dcim/forms/filtersets.py:1365 dcim/forms/filtersets.py:1386 +#: dcim/forms/filtersets.py:1401 dcim/forms/filtersets.py:1412 +#: dcim/forms/filtersets.py:1476 dcim/forms/filtersets.py:1500 +#: dcim/forms/filtersets.py:1524 dcim/forms/model_forms.py:555 +#: dcim/forms/model_forms.py:753 dcim/forms/model_forms.py:1004 +#: dcim/forms/model_forms.py:1453 dcim/forms/object_create.py:256 +#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 +#: dcim/tables/connections.py:60 dcim/tables/devices.py:314 +#: dcim/tables/devices.py:374 dcim/tables/devices.py:418 +#: dcim/tables/devices.py:463 dcim/tables/devices.py:517 +#: dcim/tables/devices.py:609 dcim/tables/devices.py:710 +#: dcim/tables/devices.py:770 dcim/tables/devices.py:820 +#: dcim/tables/devices.py:880 dcim/tables/devices.py:932 +#: dcim/tables/devices.py:1058 dcim/tables/modules.py:52 +#: extras/forms/filtersets.py:329 ipam/forms/bulk_import.py:303 +#: ipam/forms/bulk_import.py:489 ipam/forms/filtersets.py:532 +#: ipam/forms/model_forms.py:685 ipam/tables/vlans.py:176 +#: templates/dcim/consoleport.html:23 templates/dcim/consoleserverport.html:23 +#: templates/dcim/device.html:14 templates/dcim/device.html:128 +#: templates/dcim/device_edit.html:10 templates/dcim/devicebay.html:23 +#: templates/dcim/devicebay.html:55 templates/dcim/frontport.html:23 +#: templates/dcim/interface.html:31 templates/dcim/interface.html:167 +#: templates/dcim/inventoryitem.html:21 templates/dcim/module.html:55 +#: templates/dcim/modulebay.html:21 templates/dcim/poweroutlet.html:23 +#: templates/dcim/powerport.html:23 templates/dcim/rearport.html:23 +#: templates/dcim/virtualchassis.html:58 +#: templates/dcim/virtualchassis_edit.html:52 +#: templates/dcim/virtualdevicecontext.html:25 +#: templates/ipam/ipaddress_edit.html:42 templates/ipam/service_create.html:17 +#: templates/ipam/service_edit.html:16 +#: templates/virtualization/virtualmachine.html:115 +#: templates/vpn/l2vpntermination_edit.html:22 +#: templates/vpn/tunneltermination.html:24 +#: templates/wireless/inc/wirelesslink_interface.html:6 +#: virtualization/filtersets.py:166 virtualization/forms/bulk_edit.py:136 +#: virtualization/forms/bulk_import.py:99 +#: virtualization/forms/filtersets.py:124 +#: virtualization/forms/model_forms.py:188 +#: virtualization/tables/virtualmachines.py:61 vpn/choices.py:44 +#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:278 +#: vpn/forms/filtersets.py:271 vpn/forms/model_forms.py:89 +#: vpn/forms/model_forms.py:124 vpn/forms/model_forms.py:237 +#: wireless/forms/model_forms.py:100 wireless/forms/model_forms.py:140 +#: wireless/tables/wirelesslan.py:75 +msgid "Device" +msgstr "Dispositivo" + +#: dcim/forms/bulk_edit.py:624 netbox/navigation/menu.py:441 +#: templates/extras/dashboard/widget_config.html:7 +msgid "Configuration" +msgstr "Configuración" + +#: dcim/forms/bulk_edit.py:638 dcim/forms/bulk_import.py:590 +#: dcim/forms/model_forms.py:569 dcim/forms/model_forms.py:795 +msgid "Module type" +msgstr "Tipo de módulo" + +#: dcim/forms/bulk_edit.py:689 dcim/forms/bulk_edit.py:874 +#: dcim/forms/bulk_edit.py:893 dcim/forms/bulk_edit.py:916 +#: dcim/forms/bulk_edit.py:958 dcim/forms/bulk_edit.py:1002 +#: dcim/forms/bulk_edit.py:1053 dcim/forms/bulk_edit.py:1080 +#: dcim/forms/bulk_edit.py:1107 dcim/forms/bulk_edit.py:1125 +#: dcim/forms/bulk_edit.py:1143 dcim/forms/filtersets.py:64 +#: dcim/forms/object_create.py:45 templates/dcim/cable.html:33 +#: templates/dcim/consoleport.html:35 templates/dcim/consoleserverport.html:35 +#: templates/dcim/devicebay.html:31 templates/dcim/frontport.html:35 +#: templates/dcim/inc/panels/inventory_items.html:11 +#: templates/dcim/interface.html:43 templates/dcim/inventoryitem.html:33 +#: templates/dcim/modulebay.html:31 templates/dcim/poweroutlet.html:35 +#: templates/dcim/powerport.html:35 templates/dcim/rearport.html:35 +#: templates/extras/customfield.html:27 templates/generic/bulk_import.html:155 +msgid "Label" +msgstr "Etiqueta" + +#: dcim/forms/bulk_edit.py:698 dcim/forms/filtersets.py:981 +#: templates/dcim/cable.html:51 +msgid "Length" +msgstr "Longitud" + +#: dcim/forms/bulk_edit.py:703 dcim/forms/bulk_import.py:1158 +#: dcim/forms/bulk_import.py:1161 dcim/forms/filtersets.py:985 +msgid "Length unit" +msgstr "Unidad de longitud" + +#: dcim/forms/bulk_edit.py:727 templates/dcim/virtualchassis.html:24 +msgid "Domain" +msgstr "Dominio" + +#: dcim/forms/bulk_edit.py:795 dcim/forms/bulk_import.py:1273 +#: dcim/forms/filtersets.py:1071 dcim/forms/model_forms.py:657 +msgid "Power panel" +msgstr "Panel de alimentación" + +#: dcim/forms/bulk_edit.py:817 dcim/forms/bulk_import.py:1309 +#: dcim/forms/filtersets.py:1093 templates/dcim/powerfeed.html:90 +msgid "Supply" +msgstr "Suministro" + +#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1314 +#: dcim/forms/filtersets.py:1098 templates/dcim/powerfeed.html:102 +msgid "Phase" +msgstr "Fase" + +#: dcim/forms/bulk_edit.py:829 dcim/forms/filtersets.py:1103 +#: templates/dcim/powerfeed.html:94 +msgid "Voltage" +msgstr "Tensión" + +#: dcim/forms/bulk_edit.py:833 dcim/forms/filtersets.py:1107 +#: templates/dcim/powerfeed.html:98 +msgid "Amperage" +msgstr "Amperaje" + +#: dcim/forms/bulk_edit.py:837 dcim/forms/filtersets.py:1111 +msgid "Max utilization" +msgstr "Utilización máxima" + +#: dcim/forms/bulk_edit.py:841 dcim/forms/bulk_edit.py:1200 +#: dcim/forms/bulk_edit.py:1217 dcim/forms/bulk_edit.py:1234 +#: dcim/forms/bulk_edit.py:1252 dcim/forms/bulk_edit.py:1340 +#: dcim/forms/bulk_edit.py:1478 dcim/forms/bulk_edit.py:1495 +msgid "Mark connected" +msgstr "Marcar conectado" + +#: dcim/forms/bulk_edit.py:926 +msgid "Maximum draw" +msgstr "Sorteo máximo" + +#: dcim/forms/bulk_edit.py:929 dcim/models/device_component_templates.py:256 +#: dcim/models/device_components.py:357 +msgid "Maximum power draw (watts)" +msgstr "Consumo máximo de energía (vatios)" + +#: dcim/forms/bulk_edit.py:932 +msgid "Allocated draw" +msgstr "Sorteo asignado" + +#: dcim/forms/bulk_edit.py:935 dcim/models/device_component_templates.py:263 +#: dcim/models/device_components.py:364 +msgid "Allocated power draw (watts)" +msgstr "Consumo de energía asignado (vatios)" + +#: dcim/forms/bulk_edit.py:968 dcim/forms/bulk_import.py:723 +#: dcim/forms/model_forms.py:848 dcim/forms/model_forms.py:1076 +#: dcim/forms/model_forms.py:1361 dcim/forms/object_import.py:60 +msgid "Power port" +msgstr "Puerto de alimentación" + +#: dcim/forms/bulk_edit.py:973 +msgid "Feed leg" +msgstr "Pierna de alimentación" + +#: dcim/forms/bulk_edit.py:1019 dcim/forms/bulk_edit.py:1325 +msgid "Management only" +msgstr "Solo administración" + +#: dcim/forms/bulk_edit.py:1029 dcim/forms/bulk_edit.py:1331 +#: dcim/forms/bulk_import.py:813 dcim/forms/filtersets.py:1294 +#: dcim/forms/object_import.py:95 +#: dcim/models/device_component_templates.py:411 +#: dcim/models/device_components.py:671 +msgid "PoE mode" +msgstr "Modo PoE" + +#: dcim/forms/bulk_edit.py:1035 dcim/forms/bulk_edit.py:1337 +#: dcim/forms/bulk_import.py:819 dcim/forms/filtersets.py:1299 +#: dcim/forms/object_import.py:100 +#: dcim/models/device_component_templates.py:417 +#: dcim/models/device_components.py:677 +msgid "PoE type" +msgstr "Tipo de PoE" + +#: dcim/forms/bulk_edit.py:1041 dcim/forms/filtersets.py:1304 +#: dcim/forms/object_import.py:105 +msgid "Wireless role" +msgstr "Función inalámbrica" + +#: dcim/forms/bulk_edit.py:1178 dcim/forms/model_forms.py:588 +#: dcim/forms/model_forms.py:1019 dcim/tables/devices.py:337 +#: templates/dcim/consoleport.html:27 templates/dcim/consoleserverport.html:27 +#: templates/dcim/frontport.html:27 templates/dcim/interface.html:35 +#: templates/dcim/module.html:51 templates/dcim/modulebay.html:57 +#: templates/dcim/poweroutlet.html:27 templates/dcim/powerport.html:27 +#: templates/dcim/rearport.html:27 +msgid "Module" +msgstr "Módulo" + +#: dcim/forms/bulk_edit.py:1305 dcim/tables/devices.py:680 +#: templates/dcim/interface.html:113 +msgid "LAG" +msgstr "DESFASE" + +#: dcim/forms/bulk_edit.py:1310 dcim/forms/model_forms.py:1103 +msgid "Virtual device contexts" +msgstr "Contextos de dispositivos virtuales" + +#: dcim/forms/bulk_edit.py:1316 dcim/forms/bulk_import.py:651 +#: dcim/forms/bulk_import.py:677 dcim/forms/filtersets.py:1163 +#: dcim/forms/filtersets.py:1185 dcim/forms/filtersets.py:1258 +#: dcim/tables/devices.py:621 +#: templates/circuits/inc/circuit_termination.html:94 +#: templates/dcim/consoleport.html:43 templates/dcim/consoleserverport.html:43 +msgid "Speed" +msgstr "Velocidad" + +#: dcim/forms/bulk_edit.py:1345 dcim/forms/bulk_import.py:822 +#: templates/vpn/ikepolicy.html:26 templates/vpn/ipsecprofile.html:22 +#: templates/vpn/ipsecprofile.html:51 virtualization/forms/bulk_edit.py:232 +#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:145 +#: vpn/forms/bulk_edit.py:233 vpn/forms/bulk_import.py:175 +#: vpn/forms/bulk_import.py:229 vpn/forms/filtersets.py:132 +#: vpn/forms/filtersets.py:175 vpn/forms/filtersets.py:189 +#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +msgid "Mode" +msgstr "Modo" + +#: dcim/forms/bulk_edit.py:1353 dcim/forms/model_forms.py:1152 +#: ipam/forms/bulk_import.py:177 ipam/forms/filtersets.py:479 +#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:239 +#: virtualization/forms/model_forms.py:324 +msgid "VLAN group" +msgstr "Grupo de VLAN" + +#: dcim/forms/bulk_edit.py:1361 dcim/forms/model_forms.py:1157 +#: dcim/tables/devices.py:594 virtualization/forms/bulk_edit.py:247 +#: virtualization/forms/model_forms.py:329 +msgid "Untagged VLAN" +msgstr "VLAN sin etiquetar" + +#: dcim/forms/bulk_edit.py:1369 dcim/forms/model_forms.py:1166 +#: dcim/tables/devices.py:600 virtualization/forms/bulk_edit.py:255 +#: virtualization/forms/model_forms.py:338 +msgid "Tagged VLANs" +msgstr "VLAN etiquetadas" + +#: dcim/forms/bulk_edit.py:1379 dcim/forms/model_forms.py:1139 +msgid "Wireless LAN group" +msgstr "Grupo LAN inalámbrico" + +#: dcim/forms/bulk_edit.py:1384 dcim/forms/model_forms.py:1144 +#: dcim/tables/devices.py:630 netbox/navigation/menu.py:134 +#: templates/dcim/interface.html:289 wireless/tables/wirelesslan.py:24 +msgid "Wireless LANs" +msgstr "LAN inalámbricas" + +#: dcim/forms/bulk_edit.py:1393 dcim/forms/filtersets.py:1231 +#: dcim/forms/model_forms.py:1185 ipam/forms/bulk_edit.py:270 +#: ipam/forms/bulk_edit.py:361 ipam/forms/filtersets.py:166 +#: templates/dcim/interface.html:126 templates/ipam/prefix.html:96 +#: virtualization/forms/model_forms.py:352 +msgid "Addressing" +msgstr "Dirigiéndose" + +#: dcim/forms/bulk_edit.py:1394 dcim/forms/filtersets.py:651 +#: dcim/forms/model_forms.py:1186 virtualization/forms/model_forms.py:353 +msgid "Operation" +msgstr "Operación" + +#: dcim/forms/bulk_edit.py:1395 dcim/forms/filtersets.py:1232 +#: dcim/forms/model_forms.py:880 dcim/forms/model_forms.py:1188 +msgid "PoE" +msgstr "PoE" + +#: dcim/forms/bulk_edit.py:1396 dcim/forms/model_forms.py:1187 +#: templates/dcim/interface.html:101 virtualization/forms/bulk_edit.py:266 +#: virtualization/forms/model_forms.py:354 +msgid "Related Interfaces" +msgstr "Interfaces relacionadas" + +#: dcim/forms/bulk_edit.py:1397 dcim/forms/model_forms.py:1189 +#: virtualization/forms/bulk_edit.py:267 +#: virtualization/forms/model_forms.py:355 +msgid "802.1Q Switching" +msgstr "Conmutación 802.1Q" + +#: dcim/forms/bulk_edit.py:1458 dcim/forms/bulk_edit.py:1460 +msgid "Interface mode must be specified to assign VLANs" +msgstr "Se debe especificar el modo de interfaz para asignar las VLAN" + +#: dcim/forms/bulk_edit.py:1465 dcim/forms/common.py:50 +msgid "An access interface cannot have tagged VLANs assigned." +msgstr "Una interfaz de acceso no puede tener asignadas VLAN etiquetadas." + +#: dcim/forms/bulk_import.py:63 +msgid "Name of parent region" +msgstr "Nombre de la región principal" + +#: dcim/forms/bulk_import.py:77 +msgid "Name of parent site group" +msgstr "Nombre del grupo de sitios principal" + +#: dcim/forms/bulk_import.py:96 +msgid "Assigned region" +msgstr "Región asignada" + +#: dcim/forms/bulk_import.py:103 tenancy/forms/bulk_import.py:44 +#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +msgid "Assigned group" +msgstr "Grupo asignado" + +#: dcim/forms/bulk_import.py:122 +msgid "available options" +msgstr "opciones disponibles" + +#: dcim/forms/bulk_import.py:133 dcim/forms/bulk_import.py:480 +#: dcim/forms/bulk_import.py:1270 ipam/forms/bulk_import.py:174 +#: ipam/forms/bulk_import.py:441 virtualization/forms/bulk_import.py:63 +#: virtualization/forms/bulk_import.py:89 +msgid "Assigned site" +msgstr "Sitio asignado" + +#: dcim/forms/bulk_import.py:140 +msgid "Parent location" +msgstr "Ubicación de los padres" + +#: dcim/forms/bulk_import.py:142 +msgid "Location not found." +msgstr "No se encontró la ubicación." + +#: dcim/forms/bulk_import.py:191 +msgid "Name of assigned tenant" +msgstr "Nombre del inquilino asignado" + +#: dcim/forms/bulk_import.py:203 +msgid "Name of assigned role" +msgstr "Nombre de la función asignada" + +#: dcim/forms/bulk_import.py:209 +msgid "Rack type" +msgstr "Tipo de bastidor" + +#: dcim/forms/bulk_import.py:214 +msgid "Rail-to-rail width (in inches)" +msgstr "Ancho de raíl a raíl (en pulgadas)" + +#: dcim/forms/bulk_import.py:220 +msgid "Unit for outer dimensions" +msgstr "Unidad para dimensiones exteriores" + +#: dcim/forms/bulk_import.py:226 +msgid "Unit for rack weights" +msgstr "Unidad para pesas de cremallera" + +#: dcim/forms/bulk_import.py:252 +msgid "Parent site" +msgstr "Sitio para padres" + +#: dcim/forms/bulk_import.py:259 dcim/forms/bulk_import.py:1283 +msgid "Rack's location (if any)" +msgstr "Ubicación del bastidor (si existe)" + +#: dcim/forms/bulk_import.py:268 dcim/forms/model_forms.py:246 +#: dcim/tables/racks.py:153 templates/dcim/rackreservation.html:12 +#: templates/dcim/rackreservation.html:52 +msgid "Units" +msgstr "Unidades" + +#: dcim/forms/bulk_import.py:271 +msgid "Comma-separated list of individual unit numbers" +msgstr "Lista separada por comas de números de unidades individuales" + +#: dcim/forms/bulk_import.py:314 +msgid "The manufacturer which produces this device type" +msgstr "El fabricante que produce este tipo de dispositivo" + +#: dcim/forms/bulk_import.py:321 +msgid "The default platform for devices of this type (optional)" +msgstr "" +"La plataforma predeterminada para dispositivos de este tipo (opcional)" + +#: dcim/forms/bulk_import.py:326 +msgid "Device weight" +msgstr "Peso del dispositivo" + +#: dcim/forms/bulk_import.py:332 +msgid "Unit for device weight" +msgstr "Unidad para el peso del dispositivo" + +#: dcim/forms/bulk_import.py:352 +msgid "Module weight" +msgstr "Peso del módulo" + +#: dcim/forms/bulk_import.py:358 +msgid "Unit for module weight" +msgstr "Unidad para el peso del módulo" + +#: dcim/forms/bulk_import.py:391 +msgid "Limit platform assignments to this manufacturer" +msgstr "Limite las asignaciones de plataforma a este fabricante" + +#: dcim/forms/bulk_import.py:413 tenancy/forms/bulk_import.py:106 +msgid "Assigned role" +msgstr "Función asignada" + +#: dcim/forms/bulk_import.py:426 +msgid "Device type manufacturer" +msgstr "Fabricante del tipo de dispositivo" + +#: dcim/forms/bulk_import.py:432 +msgid "Device type model" +msgstr "Modelo de tipo de dispositivo" + +#: dcim/forms/bulk_import.py:439 virtualization/forms/bulk_import.py:126 +msgid "Assigned platform" +msgstr "Plataforma asignada" + +#: dcim/forms/bulk_import.py:447 dcim/forms/bulk_import.py:451 +#: dcim/forms/model_forms.py:461 +msgid "Virtual chassis" +msgstr "Chasis virtual" + +#: dcim/forms/bulk_import.py:454 dcim/forms/model_forms.py:450 +#: dcim/tables/devices.py:231 extras/filtersets.py:501 +#: extras/forms/filtersets.py:330 ipam/forms/bulk_edit.py:478 +#: ipam/forms/model_forms.py:588 templates/dcim/device.html:239 +#: templates/virtualization/cluster.html:11 +#: templates/virtualization/virtualmachine.html:92 +#: templates/virtualization/virtualmachine.html:102 +#: virtualization/filtersets.py:156 virtualization/filtersets.py:271 +#: virtualization/forms/bulk_edit.py:128 +#: virtualization/forms/bulk_import.py:92 +#: virtualization/forms/filtersets.py:98 +#: virtualization/forms/filtersets.py:119 +#: virtualization/forms/filtersets.py:196 +#: virtualization/forms/model_forms.py:82 +#: virtualization/forms/model_forms.py:179 +#: virtualization/tables/virtualmachines.py:57 +msgid "Cluster" +msgstr "Clúster" + +#: dcim/forms/bulk_import.py:458 +msgid "Virtualization cluster" +msgstr "Clúster de virtualización" + +#: dcim/forms/bulk_import.py:487 +msgid "Assigned location (if any)" +msgstr "Ubicación asignada (si la hay)" + +#: dcim/forms/bulk_import.py:494 +msgid "Assigned rack (if any)" +msgstr "Bastidor asignado (si lo hay)" + +#: dcim/forms/bulk_import.py:497 +msgid "Face" +msgstr "Cara" + +#: dcim/forms/bulk_import.py:500 +msgid "Mounted rack face" +msgstr "Cara de bastidor montada" + +#: dcim/forms/bulk_import.py:507 +msgid "Parent device (for child devices)" +msgstr "Dispositivo principal (para dispositivos infantiles)" + +#: dcim/forms/bulk_import.py:510 +msgid "Device bay" +msgstr "Compartimento para dispositivos" + +#: dcim/forms/bulk_import.py:514 +msgid "Device bay in which this device is installed (for child devices)" +msgstr "" +"Compartimento de dispositivos en el que está instalado este dispositivo " +"(para dispositivos infantiles)" + +#: dcim/forms/bulk_import.py:520 +msgid "Airflow direction" +msgstr "Dirección del flujo de aire" + +#: dcim/forms/bulk_import.py:581 +msgid "The device in which this module is installed" +msgstr "El dispositivo en el que está instalado este módulo" + +#: dcim/forms/bulk_import.py:584 dcim/forms/model_forms.py:562 +msgid "Module bay" +msgstr "Compartimento de módulos" + +#: dcim/forms/bulk_import.py:587 +msgid "The module bay in which this module is installed" +msgstr "El compartimiento del módulo en el que está instalado este módulo" + +#: dcim/forms/bulk_import.py:593 +msgid "The type of module" +msgstr "El tipo de módulo" + +#: dcim/forms/bulk_import.py:601 dcim/forms/model_forms.py:575 +msgid "Replicate components" +msgstr "Replicar componentes" + +#: dcim/forms/bulk_import.py:603 +msgid "" +"Automatically populate components associated with this module type (enabled " +"by default)" +msgstr "" +"Rellenar automáticamente los componentes asociados a este tipo de módulo " +"(activado de forma predeterminada)" + +#: dcim/forms/bulk_import.py:606 dcim/forms/model_forms.py:581 +msgid "Adopt components" +msgstr "Adopte componentes" + +#: dcim/forms/bulk_import.py:608 dcim/forms/model_forms.py:584 +msgid "Adopt already existing components" +msgstr "Adopte los componentes ya existentes" + +#: dcim/forms/bulk_import.py:648 dcim/forms/bulk_import.py:674 +#: dcim/forms/bulk_import.py:700 +msgid "Port type" +msgstr "Tipo de puerto" + +#: dcim/forms/bulk_import.py:656 dcim/forms/bulk_import.py:682 +msgid "Port speed in bps" +msgstr "Velocidad de puerto en bps" + +#: dcim/forms/bulk_import.py:720 +msgid "Outlet type" +msgstr "Tipo de toma" + +#: dcim/forms/bulk_import.py:727 +msgid "Local power port which feeds this outlet" +msgstr "Puerto de alimentación local que alimenta esta toma" + +#: dcim/forms/bulk_import.py:730 +msgid "Feed lag" +msgstr "Retraso de alimentación" + +#: dcim/forms/bulk_import.py:733 +msgid "Electrical phase (for three-phase circuits)" +msgstr "Fase eléctrica (para circuitos trifásicos)" + +#: dcim/forms/bulk_import.py:774 dcim/forms/model_forms.py:1114 +#: virtualization/forms/bulk_import.py:155 +#: virtualization/forms/model_forms.py:308 +msgid "Parent interface" +msgstr "Interfaz principal" + +#: dcim/forms/bulk_import.py:781 dcim/forms/model_forms.py:1122 +#: virtualization/forms/bulk_import.py:162 +#: virtualization/forms/model_forms.py:316 +msgid "Bridged interface" +msgstr "Interfaz puenteada" + +#: dcim/forms/bulk_import.py:784 +msgid "Lag" +msgstr "Retraso" + +#: dcim/forms/bulk_import.py:788 +msgid "Parent LAG interface" +msgstr "Interfaz LAG principal" + +#: dcim/forms/bulk_import.py:791 +msgid "Vdcs" +msgstr "VDC" + +#: dcim/forms/bulk_import.py:796 +msgid "VDC names separated by commas, encased with double quotes. Example:" +msgstr "" +"Los nombres de los VDC están separados por comas y entre comillas dobles. " +"Ejemplo:" + +#: dcim/forms/bulk_import.py:802 +msgid "Physical medium" +msgstr "Medio físico" + +#: dcim/forms/bulk_import.py:805 dcim/forms/filtersets.py:1265 +msgid "Duplex" +msgstr "Dúplex" + +#: dcim/forms/bulk_import.py:810 +msgid "Poe mode" +msgstr "Modo Poe" + +#: dcim/forms/bulk_import.py:816 +msgid "Poe type" +msgstr "Tipo de Poe" + +#: dcim/forms/bulk_import.py:825 virtualization/forms/bulk_import.py:168 +msgid "IEEE 802.1Q operational mode (for L2 interfaces)" +msgstr "Modo operativo IEEE 802.1Q (para interfaces L2)" + +#: dcim/forms/bulk_import.py:832 ipam/forms/bulk_import.py:160 +#: ipam/forms/bulk_import.py:246 ipam/forms/bulk_import.py:282 +#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:266 +#: ipam/forms/filtersets.py:322 virtualization/forms/bulk_import.py:175 +msgid "Assigned VRF" +msgstr "VRF asignado" + +#: dcim/forms/bulk_import.py:835 +msgid "Rf role" +msgstr "Rol RF" + +#: dcim/forms/bulk_import.py:838 +msgid "Wireless role (AP/station)" +msgstr "Función inalámbrica (AP/estación)" + +#: dcim/forms/bulk_import.py:884 dcim/forms/model_forms.py:893 +#: dcim/forms/model_forms.py:1369 dcim/forms/object_import.py:122 +msgid "Rear port" +msgstr "Puerto trasero" + +#: dcim/forms/bulk_import.py:887 +msgid "Corresponding rear port" +msgstr "Puerto trasero correspondiente" + +#: dcim/forms/bulk_import.py:892 dcim/forms/bulk_import.py:933 +#: dcim/forms/bulk_import.py:1148 +msgid "Physical medium classification" +msgstr "Clasificación de medios físicos" + +#: dcim/forms/bulk_import.py:961 dcim/tables/devices.py:841 +msgid "Installed device" +msgstr "Dispositivo instalado" + +#: dcim/forms/bulk_import.py:965 +msgid "Child device installed within this bay" +msgstr "Dispositivo infantil instalado en esta bahía" + +#: dcim/forms/bulk_import.py:967 +msgid "Child device not found." +msgstr "No se encontró el dispositivo infantil." + +#: dcim/forms/bulk_import.py:1025 +msgid "Parent inventory item" +msgstr "Artículo del inventario principal" + +#: dcim/forms/bulk_import.py:1028 +msgid "Component type" +msgstr "Tipo de componente" + +#: dcim/forms/bulk_import.py:1032 +msgid "Component Type" +msgstr "Tipo de componente" + +#: dcim/forms/bulk_import.py:1035 +msgid "Compnent name" +msgstr "Nombre del componente" + +#: dcim/forms/bulk_import.py:1037 +msgid "Component Name" +msgstr "Nombre del componente" + +#: dcim/forms/bulk_import.py:1103 +msgid "Side A device" +msgstr "Dispositivo del lado A" + +#: dcim/forms/bulk_import.py:1106 dcim/forms/bulk_import.py:1124 +msgid "Device name" +msgstr "Nombre del dispositivo" + +#: dcim/forms/bulk_import.py:1109 +msgid "Side A type" +msgstr "Tipo de lado A" + +#: dcim/forms/bulk_import.py:1112 dcim/forms/bulk_import.py:1130 +msgid "Termination type" +msgstr "Tipo de terminación" + +#: dcim/forms/bulk_import.py:1115 +msgid "Side A name" +msgstr "Nombre de la cara A" + +#: dcim/forms/bulk_import.py:1116 dcim/forms/bulk_import.py:1134 +msgid "Termination name" +msgstr "Nombre de terminación" + +#: dcim/forms/bulk_import.py:1121 +msgid "Side B device" +msgstr "Dispositivo Side B" + +#: dcim/forms/bulk_import.py:1127 +msgid "Side B type" +msgstr "Tipo de lado B" + +#: dcim/forms/bulk_import.py:1133 +msgid "Side B name" +msgstr "Nombre de la cara B" + +#: dcim/forms/bulk_import.py:1142 wireless/forms/bulk_import.py:86 +msgid "Connection status" +msgstr "Estado de conexión" + +#: dcim/forms/bulk_import.py:1221 dcim/forms/model_forms.py:689 +#: dcim/tables/devices.py:1028 templates/dcim/device.html:130 +#: templates/dcim/virtualchassis.html:28 templates/dcim/virtualchassis.html:60 +msgid "Master" +msgstr "Maestro" + +#: dcim/forms/bulk_import.py:1225 +msgid "Master device" +msgstr "Dispositivo maestro" + +#: dcim/forms/bulk_import.py:1242 +msgid "Name of parent site" +msgstr "Nombre del sitio principal" + +#: dcim/forms/bulk_import.py:1276 +msgid "Upstream power panel" +msgstr "Panel de alimentación ascendente" + +#: dcim/forms/bulk_import.py:1306 +msgid "Primary or redundant" +msgstr "Primario o redundante" + +#: dcim/forms/bulk_import.py:1311 +msgid "Supply type (AC/DC)" +msgstr "Tipo de alimentación (AC/DC)" + +#: dcim/forms/bulk_import.py:1316 +msgid "Single or three-phase" +msgstr "Monofásico o trifásico" + +#: dcim/forms/common.py:24 dcim/models/device_components.py:528 +#: templates/dcim/interface.html:58 +#: templates/virtualization/vminterface.html:58 +#: virtualization/forms/bulk_edit.py:224 +msgid "MTU" +msgstr "MUT" + +#: dcim/forms/common.py:65 +#, python-brace-format +msgid "" +"The tagged VLANs ({vlans}) must belong to the same site as the interface's " +"parent device/VM, or they must be global" +msgstr "" +"Las VLAN etiquetadas ({vlans}) deben pertenecer al mismo sitio que el " +"dispositivo o máquina virtual principal de la interfaz o deben ser globales" + +#: dcim/forms/common.py:110 +msgid "" +"Cannot install module with placeholder values in a module bay with no " +"position defined." +msgstr "" +"No se puede instalar el módulo con valores de marcador de posición en un " +"compartimento de módulos sin una posición definida." + +#: dcim/forms/common.py:119 +#, python-brace-format +msgid "Cannot adopt {model} {name} as it already belongs to a module" +msgstr "No puede adoptar {model} {name} porque ya pertenece a un módulo" + +#: dcim/forms/common.py:128 +#, python-brace-format +msgid "A {model} named {name} already exists" +msgstr "UN {model} llamado {name} ya existe" + +#: dcim/forms/connections.py:45 dcim/tables/power.py:66 +#: templates/dcim/inc/cable_termination.html:37 +#: templates/dcim/powerfeed.html:27 templates/dcim/powerpanel.html:19 +#: templates/dcim/trace/powerpanel.html:4 +msgid "Power Panel" +msgstr "Panel de alimentación" + +#: dcim/forms/connections.py:54 dcim/forms/model_forms.py:670 +#: templates/dcim/powerfeed.html:22 templates/dcim/powerport.html:84 +msgid "Power Feed" +msgstr "Alimentación eléctrica" + +#: dcim/forms/connections.py:74 +msgid "Side" +msgstr "Lado" + +#: dcim/forms/filtersets.py:141 +msgid "Parent region" +msgstr "Región principal" + +#: dcim/forms/filtersets.py:155 tenancy/forms/bulk_import.py:28 +#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:32 +#: tenancy/forms/filtersets.py:61 wireless/forms/bulk_import.py:25 +#: wireless/forms/filtersets.py:24 +msgid "Parent group" +msgstr "Grupo de padres" + +#: dcim/forms/filtersets.py:246 dcim/forms/filtersets.py:331 +msgid "Function" +msgstr "Función" + +#: dcim/forms/filtersets.py:418 dcim/forms/model_forms.py:308 +#: templates/inc/panels/image_attachments.html:5 +msgid "Images" +msgstr "Imágenes" + +#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:544 +#: dcim/forms/filtersets.py:655 +msgid "Components" +msgstr "Componentes" + +#: dcim/forms/filtersets.py:441 +msgid "Subdevice role" +msgstr "Función de subdispositivo" + +#: dcim/forms/filtersets.py:717 +msgid "Model" +msgstr "modelo" + +#: dcim/forms/filtersets.py:768 +msgid "Virtual chassis member" +msgstr "Miembro del chasis virtual" + +#: dcim/forms/filtersets.py:1123 +msgid "Cabled" +msgstr "Cableado" + +#: dcim/forms/filtersets.py:1130 +msgid "Occupied" +msgstr "Ocupado" + +#: dcim/forms/filtersets.py:1155 dcim/forms/filtersets.py:1177 +#: dcim/forms/filtersets.py:1199 dcim/forms/filtersets.py:1216 +#: dcim/forms/filtersets.py:1236 dcim/tables/devices.py:367 +#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:59 +#: templates/dcim/frontport.html:74 templates/dcim/interface.html:146 +#: templates/dcim/powerfeed.html:118 templates/dcim/poweroutlet.html:63 +#: templates/dcim/powerport.html:63 templates/dcim/rearport.html:70 +msgid "Connection" +msgstr "Conexión" + +#: dcim/forms/filtersets.py:1245 dcim/forms/model_forms.py:1477 +#: templates/dcim/virtualdevicecontext.html:16 +msgid "Virtual Device Context" +msgstr "Contexto de dispositivo virtual" + +#: dcim/forms/filtersets.py:1248 extras/forms/bulk_edit.py:315 +#: extras/forms/bulk_import.py:239 extras/forms/filtersets.py:479 +#: extras/forms/model_forms.py:548 extras/tables/tables.py:482 +#: templates/extras/journalentry.html:33 +msgid "Kind" +msgstr "Amable" + +#: dcim/forms/filtersets.py:1277 +msgid "Mgmt only" +msgstr "Solo administración" + +#: dcim/forms/filtersets.py:1289 dcim/forms/model_forms.py:1180 +#: dcim/models/device_components.py:630 templates/dcim/interface.html:134 +msgid "WWN" +msgstr "WWN" + +#: dcim/forms/filtersets.py:1309 +msgid "Wireless channel" +msgstr "Canal inalámbrico" + +#: dcim/forms/filtersets.py:1313 +msgid "Channel frequency (MHz)" +msgstr "Frecuencia de canal (MHz)" + +#: dcim/forms/filtersets.py:1317 +msgid "Channel width (MHz)" +msgstr "Ancho de canal (MHz)" + +#: dcim/forms/filtersets.py:1321 templates/dcim/interface.html:86 +msgid "Transmit power (dBm)" +msgstr "Potencia de transmisión (dBm)" + +#: dcim/forms/filtersets.py:1344 dcim/forms/filtersets.py:1366 +#: dcim/tables/devices.py:344 templates/dcim/cable.html:12 +#: templates/dcim/cable_edit.html:46 templates/dcim/cable_trace.html:43 +#: templates/dcim/frontport.html:84 +#: templates/dcim/inc/connection_endpoints.html:4 +#: templates/dcim/rearport.html:80 templates/dcim/trace/cable.html:7 +msgid "Cable" +msgstr "Cable" + +#: dcim/forms/filtersets.py:1434 dcim/tables/devices.py:951 +msgid "Discovered" +msgstr "Descubierto" + +#: dcim/forms/formsets.py:20 +#, python-brace-format +msgid "A virtual chassis member already exists in position {vc_position}." +msgstr "Ya existe un miembro del chasis virtual en posición {vc_position}." + +#: dcim/forms/model_forms.py:101 dcim/tables/devices.py:183 +#: templates/dcim/sitegroup.html:26 +msgid "Site Group" +msgstr "Grupo de sitios" + +#: dcim/forms/model_forms.py:142 +msgid "Contact Info" +msgstr "Información de contacto" + +#: dcim/forms/model_forms.py:197 templates/dcim/rackrole.html:20 +msgid "Rack Role" +msgstr "Rol de bastidor" + +#: dcim/forms/model_forms.py:248 +msgid "" +"Comma-separated list of numeric unit IDs. A range may be specified using a " +"hyphen." +msgstr "" +"Lista de identificadores de unidades numéricas separados por comas. Se puede" +" especificar un rango mediante un guión." + +#: dcim/forms/model_forms.py:259 dcim/tables/racks.py:133 +msgid "Reservation" +msgstr "Reservación" + +#: dcim/forms/model_forms.py:297 dcim/forms/model_forms.py:380 +#: utilities/forms/fields/fields.py:47 +msgid "Slug" +msgstr "Babosa" + +#: dcim/forms/model_forms.py:304 templates/dcim/devicetype.html:12 +msgid "Chassis" +msgstr "Chasis" + +#: dcim/forms/model_forms.py:356 templates/dcim/devicerole.html:24 +msgid "Device Role" +msgstr "Función del dispositivo" + +#: dcim/forms/model_forms.py:424 dcim/models/devices.py:632 +msgid "The lowest-numbered unit occupied by the device" +msgstr "La unidad con el número más bajo ocupado por el dispositivo" + +#: dcim/forms/model_forms.py:469 +msgid "The position in the virtual chassis this device is identified by" +msgstr "" +"La posición en el chasis virtual por la que se identifica este dispositivo" + +#: dcim/forms/model_forms.py:473 templates/dcim/device.html:131 +#: templates/dcim/virtualchassis.html:61 +#: templates/dcim/virtualchassis_edit.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:13 +#: tenancy/forms/bulk_edit.py:146 tenancy/forms/filtersets.py:109 +msgid "Priority" +msgstr "Prioridad" + +#: dcim/forms/model_forms.py:474 +msgid "The priority of the device in the virtual chassis" +msgstr "La prioridad del dispositivo en el chasis virtual" + +#: dcim/forms/model_forms.py:578 +msgid "Automatically populate components associated with this module type" +msgstr "" +"Rellenar automáticamente los componentes asociados a este tipo de módulo" + +#: dcim/forms/model_forms.py:623 +msgid "Maximum length is 32767 (any unit)" +msgstr "La longitud máxima es 32767 (cualquier unidad)" + +#: dcim/forms/model_forms.py:671 +msgid "Characteristics" +msgstr "Características" + +#: dcim/forms/model_forms.py:1130 +msgid "LAG interface" +msgstr "Interfaz LAG" + +#: dcim/forms/model_forms.py:1184 dcim/forms/model_forms.py:1345 +#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:317 +#: ipam/forms/model_forms.py:270 ipam/forms/model_forms.py:279 +#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:368 ipam/tables/vlans.py:165 +#: templates/circuits/inc/circuit_termination.html:78 +#: templates/dcim/frontport.html:113 templates/dcim/interface.html:27 +#: templates/dcim/interface.html:190 templates/dcim/interface.html:322 +#: templates/dcim/inventoryitem_edit.html:54 templates/dcim/rearport.html:109 +#: templates/ipam/fhrpgroupassignment_edit.html:11 +#: templates/virtualization/vminterface.html:19 +#: templates/vpn/tunneltermination.html:32 +#: templates/wireless/inc/wirelesslink_interface.html:10 +#: templates/wireless/wirelesslink.html:10 +#: templates/wireless/wirelesslink.html:49 +#: virtualization/forms/model_forms.py:351 vpn/forms/bulk_import.py:292 +#: vpn/forms/model_forms.py:94 vpn/forms/model_forms.py:129 +#: vpn/forms/model_forms.py:241 vpn/forms/model_forms.py:430 +#: vpn/forms/model_forms.py:439 vpn/tables/tunnels.py:87 +#: wireless/forms/model_forms.py:112 wireless/forms/model_forms.py:152 +msgid "Interface" +msgstr "Interfaz" + +#: dcim/forms/model_forms.py:1278 +msgid "Child Device" +msgstr "Dispositivo infantil" + +#: dcim/forms/model_forms.py:1279 +msgid "" +"Child devices must first be created and assigned to the site and rack of the" +" parent device." +msgstr "" +"Los dispositivos secundarios primero deben crearse y asignarse al sitio y al" +" rack del dispositivo principal." + +#: dcim/forms/model_forms.py:1321 +msgid "Console port" +msgstr "Puerto de consola" + +#: dcim/forms/model_forms.py:1329 +msgid "Console server port" +msgstr "Puerto de servidor de consola" + +#: dcim/forms/model_forms.py:1337 +msgid "Front port" +msgstr "Puerto frontal" + +#: dcim/forms/model_forms.py:1353 +msgid "Power outlet" +msgstr "toma de corriente" + +#: dcim/forms/model_forms.py:1373 templates/dcim/inventoryitem.html:17 +#: templates/dcim/inventoryitem_edit.html:10 +msgid "Inventory Item" +msgstr "Artículo de inventario" + +#: dcim/forms/model_forms.py:1425 +msgid "An InventoryItem can only be assigned to a single component." +msgstr "Un InventoryItem solo se puede asignar a un único componente." + +#: dcim/forms/model_forms.py:1439 templates/dcim/inventoryitemrole.html:15 +msgid "Inventory Item Role" +msgstr "Función del artículo de inventario" + +#: dcim/forms/model_forms.py:1459 templates/dcim/device.html:195 +#: templates/dcim/virtualdevicecontext.html:33 +#: templates/virtualization/virtualmachine.html:51 +msgid "Primary IPv4" +msgstr "IPv4 principal" + +#: dcim/forms/model_forms.py:1468 templates/dcim/device.html:211 +#: templates/dcim/virtualdevicecontext.html:44 +#: templates/virtualization/virtualmachine.html:67 +msgid "Primary IPv6" +msgstr "IPv6 principal" + +#: dcim/forms/object_create.py:47 dcim/forms/object_create.py:198 +#: dcim/forms/object_create.py:354 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of objects being " +"created.)" +msgstr "" +"Se admiten los rangos alfanuméricos. (Debe coincidir con el número de " +"objetos que se están creando)." + +#: dcim/forms/object_create.py:67 +#, python-brace-format +msgid "" +"The provided pattern specifies {value_count} values, but {pattern_count} are" +" expected." +msgstr "" +"El patrón proporcionado especifica {value_count} valores, pero " +"{pattern_count} se esperan." + +#: dcim/forms/object_create.py:109 dcim/forms/object_create.py:270 +#: dcim/tables/devices.py:281 +msgid "Rear ports" +msgstr "Puertos traseros" + +#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 +msgid "Select one rear port assignment for each front port being created." +msgstr "" +"Seleccione una asignación de puerto posterior para cada puerto frontal que " +"se vaya a crear." + +#: dcim/forms/object_create.py:163 +#, python-brace-format +msgid "" +"The number of front port templates to be created ({frontport_count}) must " +"match the selected number of rear port positions ({rearport_count})." +msgstr "" +"El número de plantillas de puertos frontales que se van a crear " +"({frontport_count}) debe coincidir con el número seleccionado de posiciones " +"de los puertos traseros ({rearport_count})." + +#: dcim/forms/object_create.py:250 +#, python-brace-format +msgid "" +"The string {module} will be replaced with the position of the " +"assigned module, if any." +msgstr "" +"La cadena {module} se sustituirá por la posición del módulo " +"asignado, si lo hubiera." + +#: dcim/forms/object_create.py:319 +#, python-brace-format +msgid "" +"The number of front ports to be created ({frontport_count}) must match the " +"selected number of rear port positions ({rearport_count})." +msgstr "" +"El número de puertos frontales que se van a crear ({frontport_count}) debe " +"coincidir con el número seleccionado de posiciones de los puertos traseros " +"({rearport_count})." + +#: dcim/forms/object_create.py:408 dcim/tables/devices.py:1034 +#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:54 +#: templates/dcim/virtualchassis_edit.html:48 templates/ipam/fhrpgroup.html:39 +msgid "Members" +msgstr "Miembros" + +#: dcim/forms/object_create.py:417 +msgid "Initial position" +msgstr "Posición inicial" + +#: dcim/forms/object_create.py:420 +msgid "" +"Position of the first member device. Increases by one for each additional " +"member." +msgstr "" +"Posición del primer dispositivo miembro. Aumenta en uno por cada miembro " +"adicional." + +#: dcim/forms/object_create.py:434 +msgid "A position must be specified for the first VC member." +msgstr "Se debe especificar un puesto para el primer miembro del VC." + +#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 +#: dcim/models/device_components.py:63 extras/models/customfields.py:108 +msgid "label" +msgstr "etiqueta" + +#: dcim/models/cables.py:71 +msgid "length" +msgstr "longitud" + +#: dcim/models/cables.py:78 +msgid "length unit" +msgstr "unidad de longitud" + +#: dcim/models/cables.py:93 +msgid "cable" +msgstr "cable" + +#: dcim/models/cables.py:94 +msgid "cables" +msgstr "cables" + +#: dcim/models/cables.py:190 +msgid "A and B terminations cannot connect to the same object." +msgstr "Las terminaciones A y B no pueden conectarse al mismo objeto." + +#: dcim/models/cables.py:257 ipam/models/asns.py:37 +msgid "end" +msgstr "fin" + +#: dcim/models/cables.py:310 +msgid "cable termination" +msgstr "terminación de cable" + +#: dcim/models/cables.py:311 +msgid "cable terminations" +msgstr "terminaciones de cables" + +#: dcim/models/cables.py:434 extras/models/configs.py:50 +msgid "is active" +msgstr "está activo" + +#: dcim/models/cables.py:438 +msgid "is complete" +msgstr "está completo" + +#: dcim/models/cables.py:442 +msgid "is split" +msgstr "está dividido" + +#: dcim/models/cables.py:450 +msgid "cable path" +msgstr "ruta de cable" + +#: dcim/models/cables.py:451 +msgid "cable paths" +msgstr "rutas de cable" + +#: dcim/models/device_component_templates.py:46 +#, python-brace-format +msgid "" +"{module} is accepted as a substitution for the module bay position when " +"attached to a module type." +msgstr "" +"{module} se acepta como sustituto de la posición del compartimiento del " +"módulo cuando se conecta a un tipo de módulo." + +#: dcim/models/device_component_templates.py:58 +#: dcim/models/device_components.py:66 +msgid "Physical label" +msgstr "Etiqueta física" + +#: dcim/models/device_component_templates.py:103 +msgid "Component templates cannot be moved to a different device type." +msgstr "" +"Las plantillas de componentes no se pueden mover a un tipo de dispositivo " +"diferente." + +#: dcim/models/device_component_templates.py:154 +msgid "" +"A component template cannot be associated with both a device type and a " +"module type." +msgstr "" +"Una plantilla de componente no se puede asociar a un tipo de dispositivo ni " +"a un tipo de módulo." + +#: dcim/models/device_component_templates.py:158 +msgid "" +"A component template must be associated with either a device type or a " +"module type." +msgstr "" +"Una plantilla de componente debe estar asociada a un tipo de dispositivo o a" +" un tipo de módulo." + +#: dcim/models/device_component_templates.py:186 +msgid "console port template" +msgstr "plantilla de puerto de consola" + +#: dcim/models/device_component_templates.py:187 +msgid "console port templates" +msgstr "plantillas de puertos de consola" + +#: dcim/models/device_component_templates.py:220 +msgid "console server port template" +msgstr "plantilla de puerto de servidor de consola" + +#: dcim/models/device_component_templates.py:221 +msgid "console server port templates" +msgstr "plantillas de puertos de servidor de consola" + +#: dcim/models/device_component_templates.py:252 +#: dcim/models/device_components.py:353 +msgid "maximum draw" +msgstr "sorteo máximo" + +#: dcim/models/device_component_templates.py:259 +#: dcim/models/device_components.py:360 +msgid "allocated draw" +msgstr "sorteo asignado" + +#: dcim/models/device_component_templates.py:269 +msgid "power port template" +msgstr "plantilla de puerto de alimentación" + +#: dcim/models/device_component_templates.py:270 +msgid "power port templates" +msgstr "plantillas de puertos de alimentación" + +#: dcim/models/device_component_templates.py:289 +#: dcim/models/device_components.py:383 +#, python-brace-format +msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." +msgstr "" +"El sorteo asignado no puede superar el sorteo máximo ({maximum_draw}W)." + +#: dcim/models/device_component_templates.py:321 +#: dcim/models/device_components.py:478 +msgid "feed leg" +msgstr "pierna de alimentación" + +#: dcim/models/device_component_templates.py:325 +#: dcim/models/device_components.py:482 +msgid "Phase (for three-phase feeds)" +msgstr "Fase (para alimentaciones trifásicas)" + +#: dcim/models/device_component_templates.py:331 +msgid "power outlet template" +msgstr "plantilla de toma de corriente" + +#: dcim/models/device_component_templates.py:332 +msgid "power outlet templates" +msgstr "plantillas de tomas de corriente" + +#: dcim/models/device_component_templates.py:341 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device type" +msgstr "" +"Puerto de alimentación principal ({power_port}) debe pertenecer al mismo " +"tipo de dispositivo" + +#: dcim/models/device_component_templates.py:345 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same module type" +msgstr "" +"Puerto de alimentación principal ({power_port}) debe pertenecer al mismo " +"tipo de módulo" + +#: dcim/models/device_component_templates.py:397 +#: dcim/models/device_components.py:612 +msgid "management only" +msgstr "solo administración" + +#: dcim/models/device_component_templates.py:405 +#: dcim/models/device_components.py:551 +msgid "bridge interface" +msgstr "interfaz de puente" + +#: dcim/models/device_component_templates.py:423 +#: dcim/models/device_components.py:637 +msgid "wireless role" +msgstr "función inalámbrica" + +#: dcim/models/device_component_templates.py:429 +msgid "interface template" +msgstr "plantilla de interfaz" + +#: dcim/models/device_component_templates.py:430 +msgid "interface templates" +msgstr "plantillas de interfaz" + +#: dcim/models/device_component_templates.py:437 +#: dcim/models/device_components.py:805 +#: virtualization/models/virtualmachines.py:398 +msgid "An interface cannot be bridged to itself." +msgstr "Una interfaz no se puede conectar a sí misma." + +#: dcim/models/device_component_templates.py:440 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same device type" +msgstr "" +"Interfaz de puente ({bridge}) debe pertenecer al mismo tipo de dispositivo" + +#: dcim/models/device_component_templates.py:444 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same module type" +msgstr "Interfaz de puente ({bridge}) debe pertenecer al mismo tipo de módulo" + +#: dcim/models/device_component_templates.py:500 +#: dcim/models/device_components.py:985 +msgid "rear port position" +msgstr "posición del puerto trasero" + +#: dcim/models/device_component_templates.py:525 +msgid "front port template" +msgstr "plantilla de puerto frontal" + +#: dcim/models/device_component_templates.py:526 +msgid "front port templates" +msgstr "plantillas de puertos frontales" + +#: dcim/models/device_component_templates.py:536 +#, python-brace-format +msgid "Rear port ({name}) must belong to the same device type" +msgstr "Puerto trasero ({name}) debe pertenecer al mismo tipo de dispositivo" + +#: dcim/models/device_component_templates.py:542 +#, python-brace-format +msgid "" +"Invalid rear port position ({position}); rear port {name} has only {count} " +"positions" +msgstr "" +"Posición del puerto trasero no válida ({position}); puerto trasero {name} " +"solo tiene {count} posiciones" + +#: dcim/models/device_component_templates.py:595 +#: dcim/models/device_components.py:1054 +msgid "positions" +msgstr "posiciones" + +#: dcim/models/device_component_templates.py:606 +msgid "rear port template" +msgstr "plantilla de puerto trasero" + +#: dcim/models/device_component_templates.py:607 +msgid "rear port templates" +msgstr "plantillas de puertos traseros" + +#: dcim/models/device_component_templates.py:636 +#: dcim/models/device_components.py:1095 +msgid "position" +msgstr "posición" + +#: dcim/models/device_component_templates.py:639 +#: dcim/models/device_components.py:1098 +msgid "Identifier to reference when renaming installed components" +msgstr "" +"Identificador al que se debe hacer referencia al cambiar el nombre de los " +"componentes instalados" + +#: dcim/models/device_component_templates.py:645 +msgid "module bay template" +msgstr "plantilla de bahía de módulos" + +#: dcim/models/device_component_templates.py:646 +msgid "module bay templates" +msgstr "plantillas de compartimentos de módulos" + +#: dcim/models/device_component_templates.py:673 +msgid "device bay template" +msgstr "plantilla de compartimento de dispositivos" + +#: dcim/models/device_component_templates.py:674 +msgid "device bay templates" +msgstr "plantillas de compartimentos de dispositivos" + +#: dcim/models/device_component_templates.py:687 +#, python-brace-format +msgid "" +"Subdevice role of device type ({device_type}) must be set to \"parent\" to " +"allow device bays." +msgstr "" +"Función de subdispositivo del tipo de dispositivo ({device_type}) debe " +"configurarse como «principal» para permitir compartimentos para " +"dispositivos." + +#: dcim/models/device_component_templates.py:742 +#: dcim/models/device_components.py:1224 +msgid "part ID" +msgstr "ID de pieza" + +#: dcim/models/device_component_templates.py:744 +#: dcim/models/device_components.py:1226 +msgid "Manufacturer-assigned part identifier" +msgstr "Identificador de pieza asignado por el fabricante" + +#: dcim/models/device_component_templates.py:761 +msgid "inventory item template" +msgstr "plantilla de artículos de inventario" + +#: dcim/models/device_component_templates.py:762 +msgid "inventory item templates" +msgstr "plantillas de artículos de inventario" + +#: dcim/models/device_components.py:106 +msgid "Components cannot be moved to a different device." +msgstr "Los componentes no se pueden mover a un dispositivo diferente." + +#: dcim/models/device_components.py:145 +msgid "cable end" +msgstr "extremo del cable" + +#: dcim/models/device_components.py:151 +msgid "mark connected" +msgstr "marcar conectado" + +#: dcim/models/device_components.py:153 +msgid "Treat as if a cable is connected" +msgstr "Tratar como si hubiera un cable conectado" + +#: dcim/models/device_components.py:171 +msgid "Must specify cable end (A or B) when attaching a cable." +msgstr "Debe especificar el extremo del cable (A o B) al conectar un cable." + +#: dcim/models/device_components.py:175 +msgid "Cable end must not be set without a cable." +msgstr "El extremo del cable no se debe colocar sin cable." + +#: dcim/models/device_components.py:179 +msgid "Cannot mark as connected with a cable attached." +msgstr "No se puede marcar como conectado con un cable conectado." + +#: dcim/models/device_components.py:203 +#, python-brace-format +msgid "{class_name} models must declare a parent_object property" +msgstr "{class_name} los modelos deben declarar una propiedad parent_object" + +#: dcim/models/device_components.py:288 dcim/models/device_components.py:317 +#: dcim/models/device_components.py:350 dcim/models/device_components.py:468 +msgid "Physical port type" +msgstr "Tipo de puerto físico" + +#: dcim/models/device_components.py:291 dcim/models/device_components.py:320 +msgid "speed" +msgstr "velocidad" + +#: dcim/models/device_components.py:295 dcim/models/device_components.py:324 +msgid "Port speed in bits per second" +msgstr "Velocidad de puerto en bits por segundo" + +#: dcim/models/device_components.py:301 +msgid "console port" +msgstr "puerto de consola" + +#: dcim/models/device_components.py:302 +msgid "console ports" +msgstr "puertos de consola" + +#: dcim/models/device_components.py:330 +msgid "console server port" +msgstr "puerto de servidor de consola" + +#: dcim/models/device_components.py:331 +msgid "console server ports" +msgstr "puertos de servidor de consola" + +#: dcim/models/device_components.py:370 +msgid "power port" +msgstr "puerto de alimentación" + +#: dcim/models/device_components.py:371 +msgid "power ports" +msgstr "puertos de alimentación" + +#: dcim/models/device_components.py:488 +msgid "power outlet" +msgstr "toma de corriente" + +#: dcim/models/device_components.py:489 +msgid "power outlets" +msgstr "tomas de corriente" + +#: dcim/models/device_components.py:500 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device" +msgstr "" +"Puerto de alimentación principal ({power_port}) debe pertenecer al mismo " +"dispositivo" + +#: dcim/models/device_components.py:531 vpn/models/crypto.py:81 +#: vpn/models/crypto.py:214 +msgid "mode" +msgstr "modo" + +#: dcim/models/device_components.py:535 +msgid "IEEE 802.1Q tagging strategy" +msgstr "Estrategia de etiquetado IEEE 802.1Q" + +#: dcim/models/device_components.py:543 +msgid "parent interface" +msgstr "interfaz principal" + +#: dcim/models/device_components.py:603 +msgid "parent LAG" +msgstr "LAG principal" + +#: dcim/models/device_components.py:613 +msgid "This interface is used only for out-of-band management" +msgstr "Esta interfaz se usa solo para la administración fuera de banda" + +#: dcim/models/device_components.py:618 +msgid "speed (Kbps)" +msgstr "velocidad (Kbps)" + +#: dcim/models/device_components.py:621 +msgid "duplex" +msgstr "dúplex" + +#: dcim/models/device_components.py:631 +msgid "64-bit World Wide Name" +msgstr "Nombre mundial de 64 bits" + +#: dcim/models/device_components.py:643 +msgid "wireless channel" +msgstr "canal inalámbrico" + +#: dcim/models/device_components.py:650 +msgid "channel frequency (MHz)" +msgstr "frecuencia de canal (MHz)" + +#: dcim/models/device_components.py:651 dcim/models/device_components.py:659 +msgid "Populated by selected channel (if set)" +msgstr "Se rellena por el canal seleccionado (si está configurado)" + +#: dcim/models/device_components.py:665 +msgid "transmit power (dBm)" +msgstr "potencia de transmisión (dBm)" + +#: dcim/models/device_components.py:690 wireless/models.py:116 +msgid "wireless LANs" +msgstr "LAN inalámbricas" + +#: dcim/models/device_components.py:698 +#: virtualization/models/virtualmachines.py:328 +msgid "untagged VLAN" +msgstr "VLAN sin etiquetar" + +#: dcim/models/device_components.py:704 +#: virtualization/models/virtualmachines.py:334 +msgid "tagged VLANs" +msgstr "VLAN etiquetadas" + +#: dcim/models/device_components.py:746 +#: virtualization/models/virtualmachines.py:370 +msgid "interface" +msgstr "interfaz" + +#: dcim/models/device_components.py:747 +#: virtualization/models/virtualmachines.py:371 +msgid "interfaces" +msgstr "interfaz" + +#: dcim/models/device_components.py:758 +#, python-brace-format +msgid "{display_type} interfaces cannot have a cable attached." +msgstr "{display_type} las interfaces no pueden tener un cable conectado." + +#: dcim/models/device_components.py:766 +#, python-brace-format +msgid "{display_type} interfaces cannot be marked as connected." +msgstr "{display_type} las interfaces no se pueden marcar como conectadas." + +#: dcim/models/device_components.py:775 +#: virtualization/models/virtualmachines.py:383 +msgid "An interface cannot be its own parent." +msgstr "Una interfaz no puede ser su propia interfaz principal." + +#: dcim/models/device_components.py:779 +msgid "Only virtual interfaces may be assigned to a parent interface." +msgstr "Solo se pueden asignar interfaces virtuales a una interfaz principal." + +#: dcim/models/device_components.py:786 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to a different device " +"({device})" +msgstr "" +"La interfaz principal seleccionada ({interface}) pertenece a un dispositivo " +"diferente ({device})" + +#: dcim/models/device_components.py:792 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" +"La interfaz principal seleccionada ({interface}) pertenece a {device}, que " +"no forma parte del chasis virtual {virtual_chassis}." + +#: dcim/models/device_components.py:812 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different device " +"({device})." +msgstr "" +"La interfaz de puente seleccionada ({bridge}) pertenece a un dispositivo " +"diferente ({device})." + +#: dcim/models/device_components.py:818 +#, python-brace-format +msgid "" +"The selected bridge interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" +"La interfaz de puente seleccionada ({interface}) pertenece a {device}, que " +"no forma parte del chasis virtual {virtual_chassis}." + +#: dcim/models/device_components.py:829 +msgid "Virtual interfaces cannot have a parent LAG interface." +msgstr "Las interfaces virtuales no pueden tener una interfaz LAG principal." + +#: dcim/models/device_components.py:833 +msgid "A LAG interface cannot be its own parent." +msgstr "Una interfaz LAG no puede ser su propia interfaz principal." + +#: dcim/models/device_components.py:840 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to a different device ({device})." +msgstr "" +"La interfaz LAG seleccionada ({lag}) pertenece a un dispositivo diferente " +"({device})." + +#: dcim/models/device_components.py:846 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to {device}, which is not part of" +" virtual chassis {virtual_chassis}." +msgstr "" +"La interfaz LAG seleccionada ({lag}) pertenece a {device}, que no forma " +"parte del chasis virtual {virtual_chassis}." + +#: dcim/models/device_components.py:857 +msgid "Virtual interfaces cannot have a PoE mode." +msgstr "Las interfaces virtuales no pueden tener un modo PoE." + +#: dcim/models/device_components.py:861 +msgid "Virtual interfaces cannot have a PoE type." +msgstr "Las interfaces virtuales no pueden tener un tipo PoE." + +#: dcim/models/device_components.py:867 +msgid "Must specify PoE mode when designating a PoE type." +msgstr "Debe especificar el modo PoE al designar un tipo de PoE." + +#: dcim/models/device_components.py:874 +msgid "Wireless role may be set only on wireless interfaces." +msgstr "" +"La función inalámbrica solo se puede configurar en las interfaces " +"inalámbricas." + +#: dcim/models/device_components.py:876 +msgid "Channel may be set only on wireless interfaces." +msgstr "El canal solo se puede configurar en las interfaces inalámbricas." + +#: dcim/models/device_components.py:882 +msgid "Channel frequency may be set only on wireless interfaces." +msgstr "" +"La frecuencia del canal solo se puede configurar en las interfaces " +"inalámbricas." + +#: dcim/models/device_components.py:886 +msgid "Cannot specify custom frequency with channel selected." +msgstr "" +"No se puede especificar la frecuencia personalizada con el canal " +"seleccionado." + +#: dcim/models/device_components.py:892 +msgid "Channel width may be set only on wireless interfaces." +msgstr "" +"El ancho del canal solo se puede establecer en las interfaces inalámbricas." + +#: dcim/models/device_components.py:894 +msgid "Cannot specify custom width with channel selected." +msgstr "" +"No se puede especificar un ancho personalizado con el canal seleccionado." + +#: dcim/models/device_components.py:902 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent device, or it must be global." +msgstr "" +"La VLAN sin etiquetar ({untagged_vlan}) debe pertenecer al mismo sitio que " +"el dispositivo principal de la interfaz o debe ser global." + +#: dcim/models/device_components.py:991 +msgid "Mapped position on corresponding rear port" +msgstr "Posición mapeada en el puerto trasero correspondiente" + +#: dcim/models/device_components.py:1007 +msgid "front port" +msgstr "puerto frontal" + +#: dcim/models/device_components.py:1008 +msgid "front ports" +msgstr "puertos frontales" + +#: dcim/models/device_components.py:1022 +#, python-brace-format +msgid "Rear port ({rear_port}) must belong to the same device" +msgstr "Puerto trasero ({rear_port}) debe pertenecer al mismo dispositivo" + +#: dcim/models/device_components.py:1030 +#, python-brace-format +msgid "" +"Invalid rear port position ({rear_port_position}): Rear port {name} has only" +" {positions} positions." +msgstr "" +"Posición del puerto trasero no válida ({rear_port_position}): puerto trasero" +" {name} solo tiene {positions} posiciones." + +#: dcim/models/device_components.py:1060 +msgid "Number of front ports which may be mapped" +msgstr "Número de puertos frontales que se pueden mapear" + +#: dcim/models/device_components.py:1065 +msgid "rear port" +msgstr "puerto trasero" + +#: dcim/models/device_components.py:1066 +msgid "rear ports" +msgstr "puertos traseros" + +#: dcim/models/device_components.py:1080 +#, python-brace-format +msgid "" +"The number of positions cannot be less than the number of mapped front ports" +" ({frontport_count})" +msgstr "" +"El número de posiciones no puede ser inferior al número de puertos frontales" +" mapeados ({frontport_count})" + +#: dcim/models/device_components.py:1104 +msgid "module bay" +msgstr "compartimiento de módulos" + +#: dcim/models/device_components.py:1105 +msgid "module bays" +msgstr "compartimentos de módulos" + +#: dcim/models/device_components.py:1118 +msgid "parent_bay" +msgstr "parent_bay" + +#: dcim/models/device_components.py:1126 +msgid "device bay" +msgstr "compartimiento de dispositivos" + +#: dcim/models/device_components.py:1127 +msgid "device bays" +msgstr "compartimentos para dispositivos" + +#: dcim/models/device_components.py:1137 +#, python-brace-format +msgid "This type of device ({device_type}) does not support device bays." +msgstr "" +"Este tipo de dispositivo ({device_type}) no admite compartimentos para " +"dispositivos." + +#: dcim/models/device_components.py:1143 +msgid "Cannot install a device into itself." +msgstr "No se puede instalar un dispositivo en sí mismo." + +#: dcim/models/device_components.py:1151 +#, python-brace-format +msgid "" +"Cannot install the specified device; device is already installed in {bay}." +msgstr "" +"No se puede instalar el dispositivo especificado; el dispositivo ya está " +"instalado en {bay}." + +#: dcim/models/device_components.py:1172 +msgid "inventory item role" +msgstr "rol de artículo de inventario" + +#: dcim/models/device_components.py:1173 +msgid "inventory item roles" +msgstr "roles de artículos de inventario" + +#: dcim/models/device_components.py:1230 dcim/models/devices.py:595 +#: dcim/models/devices.py:1173 dcim/models/racks.py:113 +msgid "serial number" +msgstr "número de serie" + +#: dcim/models/device_components.py:1238 dcim/models/devices.py:603 +#: dcim/models/devices.py:1180 dcim/models/racks.py:120 +msgid "asset tag" +msgstr "etiqueta de activo" + +#: dcim/models/device_components.py:1239 +msgid "A unique tag used to identify this item" +msgstr "Una etiqueta única que se utiliza para identificar este artículo" + +#: dcim/models/device_components.py:1242 +msgid "discovered" +msgstr "descubierto" + +#: dcim/models/device_components.py:1244 +msgid "This item was automatically discovered" +msgstr "Este artículo se descubrió automáticamente" + +#: dcim/models/device_components.py:1262 +msgid "inventory item" +msgstr "artículo de inventario" + +#: dcim/models/device_components.py:1263 +msgid "inventory items" +msgstr "artículos de inventario" + +#: dcim/models/device_components.py:1274 +msgid "Cannot assign self as parent." +msgstr "No se puede asignar a sí mismo como padre." + +#: dcim/models/device_components.py:1282 +msgid "Parent inventory item does not belong to the same device." +msgstr "" +"El artículo del inventario principal no pertenece al mismo dispositivo." + +#: dcim/models/device_components.py:1288 +msgid "Cannot move an inventory item with dependent children" +msgstr "No se puede mover un artículo del inventario con hijos a cargo" + +#: dcim/models/device_components.py:1296 +msgid "Cannot assign inventory item to component on another device" +msgstr "" +"No se puede asignar un artículo de inventario a un componente de otro " +"dispositivo" + +#: dcim/models/devices.py:54 +msgid "manufacturer" +msgstr "fabricante" + +#: dcim/models/devices.py:55 +msgid "manufacturers" +msgstr "fabricantes" + +#: dcim/models/devices.py:82 dcim/models/devices.py:381 +msgid "model" +msgstr "modelo" + +#: dcim/models/devices.py:95 +msgid "default platform" +msgstr "plataforma predeterminada" + +#: dcim/models/devices.py:98 dcim/models/devices.py:385 +msgid "part number" +msgstr "número de pieza" + +#: dcim/models/devices.py:101 dcim/models/devices.py:388 +msgid "Discrete part number (optional)" +msgstr "Número de pieza discreto (opcional)" + +#: dcim/models/devices.py:107 dcim/models/racks.py:137 +msgid "height (U)" +msgstr "altura (U)" + +#: dcim/models/devices.py:111 +msgid "exclude from utilization" +msgstr "excluir de la utilización" + +#: dcim/models/devices.py:112 +msgid "Devices of this type are excluded when calculating rack utilization." +msgstr "" +"Los dispositivos de este tipo se excluyen al calcular la utilización de los " +"racks." + +#: dcim/models/devices.py:116 +msgid "is full depth" +msgstr "es de profundidad total" + +#: dcim/models/devices.py:117 +msgid "Device consumes both front and rear rack faces." +msgstr "El dispositivo consume las caras delantera y trasera del bastidor." + +#: dcim/models/devices.py:123 +msgid "parent/child status" +msgstr "estado de padre/hijo" + +#: dcim/models/devices.py:124 +msgid "" +"Parent devices house child devices in device bays. Leave blank if this " +"device type is neither a parent nor a child." +msgstr "" +"Los dispositivos principales alojan los dispositivos infantiles en " +"compartimentos para dispositivos. Déjelo en blanco si este tipo de " +"dispositivo no es para padres ni para niños." + +#: dcim/models/devices.py:128 dcim/models/devices.py:647 +msgid "airflow" +msgstr "flujo de aire" + +#: dcim/models/devices.py:204 +msgid "device type" +msgstr "tipo de dispositivo" + +#: dcim/models/devices.py:205 +msgid "device types" +msgstr "tipos de dispositivos" + +#: dcim/models/devices.py:289 +msgid "U height must be in increments of 0.5 rack units." +msgstr "La altura en U debe ser en incrementos de 0,5 unidades de bastidor." + +#: dcim/models/devices.py:306 +#, python-brace-format +msgid "" +"Device {device} in rack {rack} does not have sufficient space to accommodate" +" a height of {height}U" +msgstr "" +"Dispositivo {device} en un estante {rack} no tiene espacio suficiente para " +"acomodar una altura de {height}U" + +#: dcim/models/devices.py:321 +#, python-brace-format +msgid "" +"Unable to set 0U height: Found {racked_instance_count} " +"instances already mounted within racks." +msgstr "" +"No se puede establecer la altura 0U: encontrado {racked_instance_count} instancias ya está montado dentro" +" de bastidores." + +#: dcim/models/devices.py:330 +msgid "" +"Must delete all device bay templates associated with this device before " +"declassifying it as a parent device." +msgstr "" +"Debe eliminar todas las plantillas de compartimentos de dispositivos " +"asociadas a este dispositivo antes de desclasificarlo como dispositivo " +"principal." + +#: dcim/models/devices.py:336 +msgid "Child device types must be 0U." +msgstr "Los tipos de dispositivos secundarios deben ser 0U." + +#: dcim/models/devices.py:404 +msgid "module type" +msgstr "tipo de módulo" + +#: dcim/models/devices.py:405 +msgid "module types" +msgstr "tipos de módulos" + +#: dcim/models/devices.py:473 +msgid "Virtual machines may be assigned to this role" +msgstr "Se pueden asignar máquinas virtuales a esta función" + +#: dcim/models/devices.py:485 +msgid "device role" +msgstr "rol del dispositivo" + +#: dcim/models/devices.py:486 +msgid "device roles" +msgstr "funciones del dispositivo" + +#: dcim/models/devices.py:503 +msgid "Optionally limit this platform to devices of a certain manufacturer" +msgstr "" +"Si lo desea, limite esta plataforma a dispositivos de un fabricante " +"determinado." + +#: dcim/models/devices.py:515 +msgid "platform" +msgstr "plataforma" + +#: dcim/models/devices.py:516 +msgid "platforms" +msgstr "plataformas" + +#: dcim/models/devices.py:564 +msgid "The function this device serves" +msgstr "La función que cumple este dispositivo" + +#: dcim/models/devices.py:596 +msgid "Chassis serial number, assigned by the manufacturer" +msgstr "Número de serie del chasis, asignado por el fabricante" + +#: dcim/models/devices.py:604 dcim/models/devices.py:1181 +msgid "A unique tag used to identify this device" +msgstr "Una etiqueta única que se utiliza para identificar este dispositivo" + +#: dcim/models/devices.py:631 +msgid "position (U)" +msgstr "posición (U)" + +#: dcim/models/devices.py:638 +msgid "rack face" +msgstr "cara del estante" + +#: dcim/models/devices.py:658 dcim/models/devices.py:1390 +#: virtualization/models/virtualmachines.py:98 +msgid "primary IPv4" +msgstr "IPv4 principal" + +#: dcim/models/devices.py:666 dcim/models/devices.py:1398 +#: virtualization/models/virtualmachines.py:106 +msgid "primary IPv6" +msgstr "IPv6 principal" + +#: dcim/models/devices.py:674 +msgid "out-of-band IP" +msgstr "IP fuera de banda" + +#: dcim/models/devices.py:691 +msgid "VC position" +msgstr "Posición VC" + +#: dcim/models/devices.py:695 +msgid "Virtual chassis position" +msgstr "Posición virtual del chasis" + +#: dcim/models/devices.py:698 +msgid "VC priority" +msgstr "Prioridad VC" + +#: dcim/models/devices.py:702 +msgid "Virtual chassis master election priority" +msgstr "Prioridad de elección del maestro del chasis virtual" + +#: dcim/models/devices.py:705 dcim/models/sites.py:207 +msgid "latitude" +msgstr "latitud" + +#: dcim/models/devices.py:710 dcim/models/devices.py:718 +#: dcim/models/sites.py:212 dcim/models/sites.py:220 +msgid "GPS coordinate in decimal format (xx.yyyyyy)" +msgstr "Coordenada GPS en formato decimal (xx.aaaaa)" + +#: dcim/models/devices.py:713 dcim/models/sites.py:215 +msgid "longitude" +msgstr "longitud" + +#: dcim/models/devices.py:786 +msgid "Device name must be unique per site." +msgstr "El nombre del dispositivo debe ser único por sitio." + +#: dcim/models/devices.py:797 ipam/models/services.py:75 +msgid "device" +msgstr "dispositivo" + +#: dcim/models/devices.py:798 +msgid "devices" +msgstr "dispositivos" + +#: dcim/models/devices.py:838 +#, python-brace-format +msgid "Rack {rack} does not belong to site {site}." +msgstr "Estante {rack} no pertenece al sitio {site}." + +#: dcim/models/devices.py:843 +#, python-brace-format +msgid "Location {location} does not belong to site {site}." +msgstr "Ubicación {location} no pertenece al sitio {site}." + +#: dcim/models/devices.py:849 +#, python-brace-format +msgid "Rack {rack} does not belong to location {location}." +msgstr "Estante {rack} no pertenece a la ubicación {location}." + +#: dcim/models/devices.py:856 +msgid "Cannot select a rack face without assigning a rack." +msgstr "No se puede seleccionar una cara de bastidor sin asignar un bastidor." + +#: dcim/models/devices.py:860 +msgid "Cannot select a rack position without assigning a rack." +msgstr "" +"No se puede seleccionar una posición de cremallera sin asignar una " +"cremallera." + +#: dcim/models/devices.py:866 +msgid "Position must be in increments of 0.5 rack units." +msgstr "La posición debe estar en incrementos de 0,5 unidades de estante." + +#: dcim/models/devices.py:870 +msgid "Must specify rack face when defining rack position." +msgstr "" +"Debe especificar la cara de la cremallera al definir la posición de la " +"cremallera." + +#: dcim/models/devices.py:878 +#, python-brace-format +msgid "" +"A U0 device type ({device_type}) cannot be assigned to a rack position." +msgstr "" +"Un tipo de dispositivo U0 ({device_type}) no se puede asignar a una posición" +" de cremallera." + +#: dcim/models/devices.py:889 +msgid "" +"Child device types cannot be assigned to a rack face. This is an attribute " +"of the parent device." +msgstr "" +"Los tipos de dispositivos secundarios no se pueden asignar a la cara de un " +"bastidor. Este es un atributo del dispositivo principal." + +#: dcim/models/devices.py:896 +msgid "" +"Child device types cannot be assigned to a rack position. This is an " +"attribute of the parent device." +msgstr "" +"Los tipos de dispositivos secundarios no se pueden asignar a una posición de" +" bastidor. Este es un atributo del dispositivo principal." + +#: dcim/models/devices.py:910 +#, python-brace-format +msgid "" +"U{position} is already occupied or does not have sufficient space to " +"accommodate this device type: {device_type} ({u_height}U)" +msgstr "" +"U{position} ya está ocupado o no tiene espacio suficiente para este tipo de " +"dispositivo: {device_type} ({u_height}U)" + +#: dcim/models/devices.py:925 +#, python-brace-format +msgid "{ip} is not an IPv4 address." +msgstr "{ip} no es una dirección IPv4." + +#: dcim/models/devices.py:934 dcim/models/devices.py:949 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this device." +msgstr "" +"La dirección IP especificada ({ip}) no está asignado a este dispositivo." + +#: dcim/models/devices.py:940 +#, python-brace-format +msgid "{ip} is not an IPv6 address." +msgstr "{ip} no es una dirección IPv6." + +#: dcim/models/devices.py:967 +#, python-brace-format +msgid "" +"The assigned platform is limited to {platform_manufacturer} device types, " +"but this device's type belongs to {devicetype_manufacturer}." +msgstr "" +"La plataforma asignada está limitada a {platform_manufacturer} tipos de " +"dispositivos, pero el tipo de este dispositivo pertenece a " +"{devicetype_manufacturer}." + +#: dcim/models/devices.py:978 +#, python-brace-format +msgid "The assigned cluster belongs to a different site ({site})" +msgstr "El clúster asignado pertenece a un sitio diferente ({site})" + +#: dcim/models/devices.py:986 +msgid "A device assigned to a virtual chassis must have its position defined." +msgstr "" +"Un dispositivo asignado a un chasis virtual debe tener su posición definida." + +#: dcim/models/devices.py:1188 +msgid "module" +msgstr "módulo" + +#: dcim/models/devices.py:1189 +msgid "modules" +msgstr "módulos" + +#: dcim/models/devices.py:1205 +#, python-brace-format +msgid "" +"Module must be installed within a module bay belonging to the assigned " +"device ({device})." +msgstr "" +"El módulo debe instalarse en un compartimiento de módulos que pertenezca al " +"dispositivo asignado ({device})." + +#: dcim/models/devices.py:1309 +msgid "domain" +msgstr "dominio" + +#: dcim/models/devices.py:1322 dcim/models/devices.py:1323 +msgid "virtual chassis" +msgstr "chasis virtual" + +#: dcim/models/devices.py:1338 +#, python-brace-format +msgid "" +"The selected master ({master}) is not assigned to this virtual chassis." +msgstr "" +"El maestro seleccionado ({master}) no está asignado a este chasis virtual." + +#: dcim/models/devices.py:1354 +#, python-brace-format +msgid "" +"Unable to delete virtual chassis {self}. There are member interfaces which " +"form a cross-chassis LAG interfaces." +msgstr "" +"No se puede eliminar el chasis virtual {self}. Hay interfaces miembros que " +"forman interfaces LAG entre chasis." + +#: dcim/models/devices.py:1379 vpn/models/l2vpn.py:37 +msgid "identifier" +msgstr "identificador" + +#: dcim/models/devices.py:1380 +msgid "Numeric identifier unique to the parent device" +msgstr "Identificador numérico exclusivo del dispositivo principal" + +#: dcim/models/devices.py:1408 extras/models/models.py:129 +#: extras/models/models.py:724 netbox/models/__init__.py:114 +msgid "comments" +msgstr "comentarios" + +#: dcim/models/devices.py:1424 +msgid "virtual device context" +msgstr "contexto de dispositivo virtual" + +#: dcim/models/devices.py:1425 +msgid "virtual device contexts" +msgstr "contextos de dispositivos virtuales" + +#: dcim/models/devices.py:1457 +#, python-brace-format +msgid "{ip} is not an IPv{family} address." +msgstr "{ip} no es un IPv{family} dirección." + +#: dcim/models/devices.py:1463 +msgid "Primary IP address must belong to an interface on the assigned device." +msgstr "" +"La dirección IP principal debe pertenecer a una interfaz del dispositivo " +"asignado." + +#: dcim/models/mixins.py:15 extras/models/configs.py:41 +#: extras/models/models.py:343 extras/models/models.py:552 +#: extras/models/search.py:50 ipam/models/ip.py:193 +msgid "weight" +msgstr "peso" + +#: dcim/models/mixins.py:22 +msgid "weight unit" +msgstr "unidad de peso" + +#: dcim/models/mixins.py:51 +msgid "Must specify a unit when setting a weight" +msgstr "Debe especificar una unidad al establecer un peso" + +#: dcim/models/power.py:55 +msgid "power panel" +msgstr "panel de alimentación" + +#: dcim/models/power.py:56 +msgid "power panels" +msgstr "paneles de alimentación" + +#: dcim/models/power.py:70 +#, python-brace-format +msgid "" +"Location {location} ({location_site}) is in a different site than {site}" +msgstr "" +"Ubicación {location} ({location_site}) está en un sitio diferente al {site}" + +#: dcim/models/power.py:107 +msgid "supply" +msgstr "suministrar" + +#: dcim/models/power.py:113 +msgid "phase" +msgstr "fase" + +#: dcim/models/power.py:119 +msgid "voltage" +msgstr "voltaje" + +#: dcim/models/power.py:124 +msgid "amperage" +msgstr "amperaje" + +#: dcim/models/power.py:129 +msgid "max utilization" +msgstr "utilización máxima" + +#: dcim/models/power.py:132 +msgid "Maximum permissible draw (percentage)" +msgstr "Consumo máximo permitido (porcentaje)" + +#: dcim/models/power.py:135 +msgid "available power" +msgstr "potencia disponible" + +#: dcim/models/power.py:163 +msgid "power feed" +msgstr "alimentación" + +#: dcim/models/power.py:164 +msgid "power feeds" +msgstr "fuentes de alimentación" + +#: dcim/models/power.py:178 +#, python-brace-format +msgid "" +"Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " +"are in different sites." +msgstr "" +"Estante {rack} ({rack_site}) y panel de alimentación {powerpanel} " +"({powerpanel_site}) están en diferentes sitios." + +#: dcim/models/power.py:189 +msgid "Voltage cannot be negative for AC supply" +msgstr "" +"La tensión no puede ser negativa para el suministro de corriente alterna" + +#: dcim/models/racks.py:49 +msgid "rack role" +msgstr "rol de bastidor" + +#: dcim/models/racks.py:50 +msgid "rack roles" +msgstr "roles de seguimiento" + +#: dcim/models/racks.py:74 +msgid "facility ID" +msgstr "ID de la instalación" + +#: dcim/models/racks.py:75 +msgid "Locally-assigned identifier" +msgstr "Identificador asignado localmente" + +#: dcim/models/racks.py:108 ipam/forms/bulk_import.py:200 +#: ipam/forms/bulk_import.py:265 ipam/forms/bulk_import.py:300 +#: ipam/forms/bulk_import.py:467 virtualization/forms/bulk_import.py:112 +msgid "Functional role" +msgstr "Función funcional" + +#: dcim/models/racks.py:121 +msgid "A unique tag used to identify this rack" +msgstr "Una etiqueta única que se utiliza para identificar este estante" + +#: dcim/models/racks.py:132 +msgid "width" +msgstr "anchura" + +#: dcim/models/racks.py:133 +msgid "Rail-to-rail width" +msgstr "Ancho de riel a riel" + +#: dcim/models/racks.py:139 +msgid "Height in rack units" +msgstr "Altura en unidades de estantería" + +#: dcim/models/racks.py:143 +msgid "starting unit" +msgstr "unidad de arranque" + +#: dcim/models/racks.py:145 +msgid "Starting unit for rack" +msgstr "Unidad de arranque para bastidor" + +#: dcim/models/racks.py:149 +msgid "descending units" +msgstr "unidades descendentes" + +#: dcim/models/racks.py:150 +msgid "Units are numbered top-to-bottom" +msgstr "Las unidades están numeradas de arriba a abajo" + +#: dcim/models/racks.py:153 +msgid "outer width" +msgstr "ancho exterior" + +#: dcim/models/racks.py:156 +msgid "Outer dimension of rack (width)" +msgstr "Dimensión exterior del estante (ancho)" + +#: dcim/models/racks.py:159 +msgid "outer depth" +msgstr "profundidad exterior" + +#: dcim/models/racks.py:162 +msgid "Outer dimension of rack (depth)" +msgstr "Dimensión exterior del bastidor (profundidad)" + +#: dcim/models/racks.py:165 +msgid "outer unit" +msgstr "unidad exterior" + +#: dcim/models/racks.py:171 +msgid "max weight" +msgstr "peso máximo" + +#: dcim/models/racks.py:174 +msgid "Maximum load capacity for the rack" +msgstr "Capacidad de carga máxima del bastidor" + +#: dcim/models/racks.py:182 +msgid "mounting depth" +msgstr "profundidad de montaje" + +#: dcim/models/racks.py:186 +msgid "" +"Maximum depth of a mounted device, in millimeters. For four-post racks, this" +" is the distance between the front and rear rails." +msgstr "" +"Profundidad máxima de un dispositivo montado, en milímetros. En el caso de " +"los estantes de cuatro postes, esta es la distancia entre los rieles " +"delantero y trasero." + +#: dcim/models/racks.py:220 +msgid "rack" +msgstr "estante" + +#: dcim/models/racks.py:221 +msgid "racks" +msgstr "bastidores" + +#: dcim/models/racks.py:236 +#, python-brace-format +msgid "Assigned location must belong to parent site ({site})." +msgstr "La ubicación asignada debe pertenecer al sitio principal ({site})." + +#: dcim/models/racks.py:240 +msgid "Must specify a unit when setting an outer width/depth" +msgstr "" +"Debe especificar una unidad al establecer una anchura o profundidad " +"exteriores" + +#: dcim/models/racks.py:244 +msgid "Must specify a unit when setting a maximum weight" +msgstr "Debe especificar una unidad al establecer un peso máximo" + +#: dcim/models/racks.py:254 +#, python-brace-format +msgid "" +"Rack must be at least {min_height}U tall to house currently installed " +"devices." +msgstr "" +"El estante debe tener al menos {min_height}Hablo para alojar los " +"dispositivos instalados actualmente." + +#: dcim/models/racks.py:261 +#, python-brace-format +msgid "" +"Rack unit numbering must begin at {position} or less to house currently " +"installed devices." +msgstr "" +"La numeración de las unidades del bastidor debe comenzar en {position} o " +"menos para alojar los dispositivos actualmente instalados." + +#: dcim/models/racks.py:269 +#, python-brace-format +msgid "Location must be from the same site, {site}." +msgstr "La ubicación debe ser del mismo sitio, {site}." + +#: dcim/models/racks.py:522 +msgid "units" +msgstr "unidades" + +#: dcim/models/racks.py:548 +msgid "rack reservation" +msgstr "reserva de seguimiento" + +#: dcim/models/racks.py:549 +msgid "rack reservations" +msgstr "Seguimiento de reservas" + +#: dcim/models/racks.py:566 +#, python-brace-format +msgid "Invalid unit(s) for {height}U rack: {unit_list}" +msgstr "" +"Unidad (es) no válida (s) para {height}Rack de Reino Unido: {unit_list}" + +#: dcim/models/racks.py:579 +#, python-brace-format +msgid "The following units have already been reserved: {unit_list}" +msgstr "Ya se han reservado las siguientes unidades: {unit_list}" + +#: dcim/models/sites.py:49 +msgid "A top-level region with this name already exists." +msgstr "Ya existe una región de nivel superior con este nombre." + +#: dcim/models/sites.py:59 +msgid "A top-level region with this slug already exists." +msgstr "Ya existe una región de alto nivel con esta babosa." + +#: dcim/models/sites.py:62 +msgid "region" +msgstr "región" + +#: dcim/models/sites.py:63 +msgid "regions" +msgstr "regiones" + +#: dcim/models/sites.py:102 +msgid "A top-level site group with this name already exists." +msgstr "Ya existe un grupo de sitio de nivel superior con este nombre." + +#: dcim/models/sites.py:112 +msgid "A top-level site group with this slug already exists." +msgstr "Ya existe un grupo de sitios de nivel superior con este slug." + +#: dcim/models/sites.py:115 +msgid "site group" +msgstr "grupo de sitios" + +#: dcim/models/sites.py:116 +msgid "site groups" +msgstr "grupos de sitios" + +#: dcim/models/sites.py:141 +msgid "Full name of the site" +msgstr "Nombre completo del sitio" + +#: dcim/models/sites.py:181 +msgid "facility" +msgstr "instalaciones" + +#: dcim/models/sites.py:184 +msgid "Local facility ID or description" +msgstr "ID o descripción de la instalación local" + +#: dcim/models/sites.py:195 +msgid "physical address" +msgstr "dirección física" + +#: dcim/models/sites.py:198 +msgid "Physical location of the building" +msgstr "Ubicación física del edificio" + +#: dcim/models/sites.py:201 +msgid "shipping address" +msgstr "dirección de envío" + +#: dcim/models/sites.py:204 +msgid "If different from the physical address" +msgstr "Si es diferente de la dirección física" + +#: dcim/models/sites.py:238 +msgid "site" +msgstr "sitio" + +#: dcim/models/sites.py:239 +msgid "sites" +msgstr "sitios" + +#: dcim/models/sites.py:303 +msgid "A location with this name already exists within the specified site." +msgstr "Ya existe una ubicación con este nombre en el sitio especificado." + +#: dcim/models/sites.py:313 +msgid "A location with this slug already exists within the specified site." +msgstr "Ya existe una ubicación con esta babosa en el sitio especificado." + +#: dcim/models/sites.py:316 +msgid "location" +msgstr "ubicación" + +#: dcim/models/sites.py:317 +msgid "locations" +msgstr "ubicaciones" + +#: dcim/models/sites.py:331 +#, python-brace-format +msgid "Parent location ({parent}) must belong to the same site ({site})." +msgstr "" +"Ubicación de los padres ({parent}) debe pertenecer al mismo sitio ({site})." + +#: dcim/tables/cables.py:54 +msgid "Termination A" +msgstr "Terminación A" + +#: dcim/tables/cables.py:59 +msgid "Termination B" +msgstr "Terminación B" + +#: dcim/tables/cables.py:65 wireless/tables/wirelesslink.py:22 +msgid "Device A" +msgstr "Dispositivo A" + +#: dcim/tables/cables.py:71 wireless/tables/wirelesslink.py:31 +msgid "Device B" +msgstr "Dispositivo B" + +#: dcim/tables/cables.py:77 +msgid "Location A" +msgstr "Ubicación A" + +#: dcim/tables/cables.py:83 +msgid "Location B" +msgstr "Ubicación B" + +#: dcim/tables/cables.py:89 +msgid "Rack A" +msgstr "Bastidor A" + +#: dcim/tables/cables.py:95 +msgid "Rack B" +msgstr "Estante B" + +#: dcim/tables/cables.py:101 +msgid "Site A" +msgstr "Sitio A" + +#: dcim/tables/cables.py:107 +msgid "Site B" +msgstr "Sitio B" + +#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:18 +#: templates/dcim/consoleserverport.html:75 templates/dcim/frontport.html:119 +#: templates/dcim/inventoryitem_edit.html:39 +msgid "Console Port" +msgstr "Puerto de consola" + +#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 +#: dcim/tables/connections.py:71 +#: templates/dcim/inc/connection_endpoints.html:16 +msgid "Reachable" +msgstr "Accesible" + +#: dcim/tables/connections.py:46 dcim/tables/devices.py:524 +#: templates/dcim/inventoryitem_edit.html:64 +#: templates/dcim/poweroutlet.html:47 templates/dcim/powerport.html:18 +msgid "Power Port" +msgstr "Puerto de alimentación" + +#: dcim/tables/devices.py:94 dcim/tables/devices.py:139 +#: dcim/tables/racks.py:81 dcim/tables/sites.py:143 +#: netbox/navigation/menu.py:57 netbox/navigation/menu.py:61 +#: netbox/navigation/menu.py:63 virtualization/forms/model_forms.py:125 +#: virtualization/tables/clusters.py:83 virtualization/views.py:211 +msgid "Devices" +msgstr "Dispositivos" + +#: dcim/tables/devices.py:99 dcim/tables/devices.py:144 +#: virtualization/tables/clusters.py:88 +msgid "VMs" +msgstr "VM" + +#: dcim/tables/devices.py:133 dcim/tables/devices.py:245 +#: extras/forms/model_forms.py:506 templates/dcim/device.html:114 +#: templates/dcim/device/render_config.html:11 +#: templates/dcim/device/render_config.html:15 +#: templates/dcim/devicerole.html:47 templates/dcim/platform.html:44 +#: templates/extras/configtemplate.html:10 +#: templates/virtualization/virtualmachine.html:47 +#: templates/virtualization/virtualmachine/render_config.html:11 +#: templates/virtualization/virtualmachine/render_config.html:15 +#: virtualization/tables/virtualmachines.py:93 +msgid "Config Template" +msgstr "Plantilla de configuración" + +#: dcim/tables/devices.py:216 dcim/tables/devices.py:1069 +#: ipam/forms/bulk_import.py:511 ipam/forms/model_forms.py:296 +#: ipam/tables/ip.py:352 ipam/tables/ip.py:418 ipam/tables/ip.py:441 +#: templates/ipam/ipaddress.html:12 templates/ipam/ipaddress_edit.html:14 +#: virtualization/tables/virtualmachines.py:81 +msgid "IP Address" +msgstr "Dirección IP" + +#: dcim/tables/devices.py:220 dcim/tables/devices.py:1073 +#: virtualization/tables/virtualmachines.py:72 +msgid "IPv4 Address" +msgstr "Dirección IPv4" + +#: dcim/tables/devices.py:224 dcim/tables/devices.py:1077 +#: virtualization/tables/virtualmachines.py:76 +msgid "IPv6 Address" +msgstr "Dirección IPv6" + +#: dcim/tables/devices.py:239 +msgid "VC Position" +msgstr "Posición VC" + +#: dcim/tables/devices.py:242 +msgid "VC Priority" +msgstr "Prioridad VC" + +#: dcim/tables/devices.py:249 templates/dcim/device_edit.html:38 +#: templates/dcim/devicebay_populate.html:16 +msgid "Parent Device" +msgstr "Dispositivo principal" + +#: dcim/tables/devices.py:254 +msgid "Position (Device Bay)" +msgstr "Posición (bahía de dispositivos)" + +#: dcim/tables/devices.py:263 +msgid "Console ports" +msgstr "Puertos de consola" + +#: dcim/tables/devices.py:266 +msgid "Console server ports" +msgstr "Puertos de servidor de consola" + +#: dcim/tables/devices.py:269 +msgid "Power ports" +msgstr "Puertos de alimentación" + +#: dcim/tables/devices.py:272 +msgid "Power outlets" +msgstr "tomas de corriente" + +#: dcim/tables/devices.py:275 dcim/tables/devices.py:1082 +#: dcim/tables/devicetypes.py:125 dcim/views.py:1002 dcim/views.py:1241 +#: dcim/views.py:1927 netbox/navigation/menu.py:82 +#: netbox/navigation/menu.py:238 templates/dcim/device/base.html:37 +#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 +#: templates/dcim/module.html:34 templates/dcim/moduletype/base.html:34 +#: templates/dcim/virtualdevicecontext.html:64 +#: templates/dcim/virtualdevicecontext.html:85 +#: templates/virtualization/virtualmachine/base.html:27 +#: templates/virtualization/virtualmachine_list.html:14 +#: virtualization/tables/virtualmachines.py:87 virtualization/views.py:368 +#: wireless/tables/wirelesslan.py:55 +msgid "Interfaces" +msgstr "Interfaces" + +#: dcim/tables/devices.py:278 +msgid "Front ports" +msgstr "Puertos frontales" + +#: dcim/tables/devices.py:284 +msgid "Device bays" +msgstr "Compartimentos para dispositivos" + +#: dcim/tables/devices.py:287 +msgid "Module bays" +msgstr "Bahías de módulos" + +#: dcim/tables/devices.py:290 +msgid "Inventory items" +msgstr "Artículos de inventario" + +#: dcim/tables/devices.py:329 dcim/tables/modules.py:56 +#: templates/dcim/modulebay.html:17 +msgid "Module Bay" +msgstr "Bahía de módulos" + +#: dcim/tables/devices.py:350 +msgid "Cable Color" +msgstr "Color del cable" + +#: dcim/tables/devices.py:356 +msgid "Link Peers" +msgstr "Vincula a tus compañeros" + +#: dcim/tables/devices.py:359 +msgid "Mark Connected" +msgstr "Marcar conectado" + +#: dcim/tables/devices.py:470 +msgid "Maximum draw (W)" +msgstr "Consumo máximo (W)" + +#: dcim/tables/devices.py:473 +msgid "Allocated draw (W)" +msgstr "Sorteo asignado (W)" + +#: dcim/tables/devices.py:573 ipam/forms/model_forms.py:707 +#: ipam/tables/fhrp.py:28 ipam/views.py:597 ipam/views.py:671 +#: netbox/navigation/menu.py:146 netbox/navigation/menu.py:148 +#: templates/dcim/interface.html:351 templates/ipam/ipaddress_bulk_add.html:15 +#: templates/ipam/service.html:43 templates/virtualization/vminterface.html:88 +#: vpn/tables/tunnels.py:94 +msgid "IP Addresses" +msgstr "Direcciones IP" + +#: dcim/tables/devices.py:579 netbox/navigation/menu.py:190 +#: templates/ipam/inc/panels/fhrp_groups.html:5 +msgid "FHRP Groups" +msgstr "Grupos FHRP" + +#: dcim/tables/devices.py:591 templates/dcim/interface.html:90 +#: templates/virtualization/vminterface.html:70 templates/vpn/tunnel.html:18 +#: templates/vpn/tunneltermination.html:14 vpn/forms/bulk_edit.py:75 +#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:41 +#: vpn/forms/filtersets.py:81 vpn/forms/model_forms.py:59 +#: vpn/forms/model_forms.py:144 vpn/tables/tunnels.py:74 +msgid "Tunnel" +msgstr "Túnel" + +#: dcim/tables/devices.py:616 dcim/tables/devicetypes.py:224 +#: templates/dcim/interface.html:66 +msgid "Management Only" +msgstr "Solo administración" + +#: dcim/tables/devices.py:624 +msgid "Wireless link" +msgstr "Enlace inalámbrico" + +#: dcim/tables/devices.py:634 +msgid "VDCs" +msgstr "VDC" + +#: dcim/tables/devices.py:642 dcim/tables/devicetypes.py:48 +#: dcim/tables/devicetypes.py:140 dcim/views.py:1077 dcim/views.py:2020 +#: netbox/navigation/menu.py:91 templates/dcim/device/base.html:52 +#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 +#: templates/dcim/inc/panels/inventory_items.html:5 +#: templates/dcim/inventoryitemrole.html:33 +msgid "Inventory Items" +msgstr "Artículos de inventario" + +#: dcim/tables/devices.py:723 +#: templates/circuits/inc/circuit_termination.html:80 +#: templates/dcim/consoleport.html:81 templates/dcim/consoleserverport.html:81 +#: templates/dcim/frontport.html:53 templates/dcim/frontport.html:125 +#: templates/dcim/interface.html:196 templates/dcim/inventoryitem_edit.html:69 +#: templates/dcim/rearport.html:18 templates/dcim/rearport.html:115 +msgid "Rear Port" +msgstr "Puerto trasero" + +#: dcim/tables/devices.py:888 templates/dcim/modulebay.html:51 +msgid "Installed Module" +msgstr "Módulo instalado" + +#: dcim/tables/devices.py:891 +msgid "Module Serial" +msgstr "Serie del módulo" + +#: dcim/tables/devices.py:895 +msgid "Module Asset Tag" +msgstr "Etiqueta de activo del módulo" + +#: dcim/tables/devices.py:904 +msgid "Module Status" +msgstr "Estado del módulo" + +#: dcim/tables/devices.py:946 dcim/tables/devicetypes.py:308 +#: templates/dcim/inventoryitem.html:41 +msgid "Component" +msgstr "Componente" + +#: dcim/tables/devices.py:1001 +msgid "Items" +msgstr "Artículos" + +#: dcim/tables/devicetypes.py:38 netbox/navigation/menu.py:72 +#: netbox/navigation/menu.py:74 +msgid "Device Types" +msgstr "Tipos de dispositivos" + +#: dcim/tables/devicetypes.py:43 netbox/navigation/menu.py:75 +msgid "Module Types" +msgstr "Tipos de módulos" + +#: dcim/tables/devicetypes.py:53 extras/forms/filtersets.py:379 +#: extras/forms/model_forms.py:414 netbox/navigation/menu.py:66 +msgid "Platforms" +msgstr "Plataformas" + +#: dcim/tables/devicetypes.py:85 templates/dcim/devicetype.html:32 +msgid "Default Platform" +msgstr "Plataforma predeterminada" + +#: dcim/tables/devicetypes.py:89 templates/dcim/devicetype.html:48 +msgid "Full Depth" +msgstr "Profundidad total" + +#: dcim/tables/devicetypes.py:98 +msgid "U Height" +msgstr "Altura en U" + +#: dcim/tables/devicetypes.py:110 dcim/tables/modules.py:26 +msgid "Instances" +msgstr "Instancias" + +#: dcim/tables/devicetypes.py:113 dcim/views.py:942 dcim/views.py:1181 +#: dcim/views.py:1867 netbox/navigation/menu.py:85 +#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 +#: templates/dcim/devicetype/base.html:22 templates/dcim/module.html:22 +#: templates/dcim/moduletype/base.html:22 +msgid "Console Ports" +msgstr "Puertos de consola" + +#: dcim/tables/devicetypes.py:116 dcim/views.py:957 dcim/views.py:1196 +#: dcim/views.py:1882 netbox/navigation/menu.py:86 +#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 +#: templates/dcim/devicetype/base.html:25 templates/dcim/module.html:25 +#: templates/dcim/moduletype/base.html:25 +msgid "Console Server Ports" +msgstr "Puertos de servidor de consola" + +#: dcim/tables/devicetypes.py:119 dcim/views.py:972 dcim/views.py:1211 +#: dcim/views.py:1897 netbox/navigation/menu.py:87 +#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 +#: templates/dcim/devicetype/base.html:28 templates/dcim/module.html:28 +#: templates/dcim/moduletype/base.html:28 +msgid "Power Ports" +msgstr "Puertos de alimentación" + +#: dcim/tables/devicetypes.py:122 dcim/views.py:987 dcim/views.py:1226 +#: dcim/views.py:1912 netbox/navigation/menu.py:88 +#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 +#: templates/dcim/devicetype/base.html:31 templates/dcim/module.html:31 +#: templates/dcim/moduletype/base.html:31 +msgid "Power Outlets" +msgstr "Tomas de corriente" + +#: dcim/tables/devicetypes.py:128 dcim/views.py:1017 dcim/views.py:1256 +#: dcim/views.py:1948 netbox/navigation/menu.py:83 +#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 +#: templates/dcim/module.html:37 templates/dcim/moduletype/base.html:37 +msgid "Front Ports" +msgstr "Puertos frontales" + +#: dcim/tables/devicetypes.py:131 dcim/views.py:1032 dcim/views.py:1271 +#: dcim/views.py:1963 netbox/navigation/menu.py:84 +#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 +#: templates/dcim/devicetype/base.html:40 templates/dcim/module.html:40 +#: templates/dcim/moduletype/base.html:40 +msgid "Rear Ports" +msgstr "Puertos traseros" + +#: dcim/tables/devicetypes.py:134 dcim/views.py:1062 dcim/views.py:2001 +#: netbox/navigation/menu.py:90 templates/dcim/device/base.html:49 +#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +msgid "Device Bays" +msgstr "Bahías de dispositivos" + +#: dcim/tables/devicetypes.py:137 dcim/views.py:1047 dcim/views.py:1982 +#: netbox/navigation/menu.py:89 templates/dcim/device/base.html:46 +#: templates/dcim/device_list.html:64 templates/dcim/devicetype/base.html:43 +msgid "Module Bays" +msgstr "Bahías de módulos" + +#: dcim/tables/power.py:36 netbox/navigation/menu.py:282 +#: templates/core/configrevision.html:59 templates/dcim/powerpanel.html:53 +msgid "Power Feeds" +msgstr "Fuentes de alimentación" + +#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:106 +msgid "Max Utilization" +msgstr "Utilización máxima" + +#: dcim/tables/power.py:84 +msgid "Available Power (VA)" +msgstr "Potencia disponible (VA)" + +#: dcim/tables/racks.py:29 dcim/tables/sites.py:138 +#: netbox/navigation/menu.py:25 netbox/navigation/menu.py:27 +msgid "Racks" +msgstr "Bastidores" + +#: dcim/tables/racks.py:73 templates/dcim/device.html:323 +#: templates/dcim/rack.html:95 +msgid "Height" +msgstr "Altura" + +#: dcim/tables/racks.py:85 +msgid "Space" +msgstr "Espacio" + +#: dcim/tables/racks.py:96 templates/dcim/rack.html:105 +msgid "Outer Width" +msgstr "Anchura exterior" + +#: dcim/tables/racks.py:100 templates/dcim/rack.html:115 +msgid "Outer Depth" +msgstr "Profundidad exterior" + +#: dcim/tables/racks.py:108 +msgid "Max Weight" +msgstr "Peso máximo" + +#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 +#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:394 +#: ipam/forms/bulk_edit.py:128 ipam/forms/model_forms.py:152 +#: ipam/tables/asn.py:66 netbox/navigation/menu.py:16 +#: netbox/navigation/menu.py:18 +msgid "Sites" +msgstr "Sitios" + +#: dcim/views.py:131 +#, python-brace-format +msgid "Disconnected {count} {type}" +msgstr "Desconectado {count} {type}" + +#: dcim/views.py:692 netbox/navigation/menu.py:29 +msgid "Reservations" +msgstr "Reservaciones" + +#: dcim/views.py:711 +msgid "Non-Racked Devices" +msgstr "Dispositivos no rakeados" + +#: dcim/views.py:2033 extras/forms/model_forms.py:454 +#: templates/extras/configcontext.html:10 +#: virtualization/forms/model_forms.py:228 virtualization/views.py:408 +msgid "Config Context" +msgstr "Contexto de configuración" + +#: dcim/views.py:2043 virtualization/views.py:418 +msgid "Render Config" +msgstr "Configuración de renderizado" + +#: dcim/views.py:2971 ipam/tables/ip.py:233 +msgid "Children" +msgstr "Niños" + +#: extras/choices.py:27 extras/forms/misc.py:14 +msgid "Text" +msgstr "Texto" + +#: extras/choices.py:28 +msgid "Text (long)" +msgstr "Texto (largo)" + +#: extras/choices.py:29 +msgid "Integer" +msgstr "Número entero" + +#: extras/choices.py:30 +msgid "Decimal" +msgstr "Decimal" + +#: extras/choices.py:31 +msgid "Boolean (true/false)" +msgstr "Booleano (verdadero o falso)" + +#: extras/choices.py:32 +msgid "Date" +msgstr "Fecha" + +#: extras/choices.py:33 +msgid "Date & time" +msgstr "Fecha y hora" + +#: extras/choices.py:35 +msgid "JSON" +msgstr "JSON" + +#: extras/choices.py:36 +msgid "Selection" +msgstr "Selección" + +#: extras/choices.py:37 +msgid "Multiple selection" +msgstr "Selección múltiple" + +#: extras/choices.py:39 +msgid "Multiple objects" +msgstr "Objetos múltiples" + +#: extras/choices.py:50 templates/extras/customfield.html:69 vpn/choices.py:20 +#: wireless/choices.py:27 +msgid "Disabled" +msgstr "Discapacitado" + +#: extras/choices.py:51 +msgid "Loose" +msgstr "Suelto" + +#: extras/choices.py:52 +msgid "Exact" +msgstr "Exacto" + +#: extras/choices.py:63 +msgid "Always" +msgstr "Siempre" + +#: extras/choices.py:64 +msgid "If set" +msgstr "Si está configurado" + +#: extras/choices.py:65 extras/choices.py:78 +msgid "Hidden" +msgstr "Oculto" + +#: extras/choices.py:76 +msgid "Yes" +msgstr "Sí" + +#: extras/choices.py:77 +msgid "No" +msgstr "No" + +#: extras/choices.py:105 templates/tenancy/contact.html:58 +#: tenancy/forms/bulk_edit.py:117 wireless/forms/model_forms.py:159 +msgid "Link" +msgstr "Enlace" + +#: extras/choices.py:119 +msgid "Newest" +msgstr "El más reciente" + +#: extras/choices.py:120 +msgid "Oldest" +msgstr "El más antiguo" + +#: extras/choices.py:136 templates/generic/object.html:51 +msgid "Updated" +msgstr "Actualizado" + +#: extras/choices.py:137 +msgid "Deleted" +msgstr "Eliminado" + +#: extras/choices.py:154 extras/choices.py:176 +msgid "Info" +msgstr "Información" + +#: extras/choices.py:155 extras/choices.py:175 +msgid "Success" +msgstr "Éxito" + +#: extras/choices.py:156 extras/choices.py:177 +msgid "Warning" +msgstr "Advertencia" + +#: extras/choices.py:157 +msgid "Danger" +msgstr "Peligro" + +#: extras/choices.py:174 utilities/choices.py:190 +msgid "Default" +msgstr "Predeterminado" + +#: extras/choices.py:178 +msgid "Failure" +msgstr "Fracaso" + +#: extras/choices.py:185 +msgid "Hourly" +msgstr "Cada hora" + +#: extras/choices.py:186 +msgid "12 hours" +msgstr "12 horas" + +#: extras/choices.py:187 +msgid "Daily" +msgstr "Diariamente" + +#: extras/choices.py:188 +msgid "Weekly" +msgstr "Semanal" + +#: extras/choices.py:189 +msgid "30 days" +msgstr "30 días" + +#: extras/choices.py:254 extras/tables/tables.py:287 +#: templates/dcim/virtualchassis_edit.html:108 +#: templates/extras/eventrule.html:51 +#: templates/generic/bulk_add_component.html:56 +#: templates/generic/object_edit.html:29 templates/generic/object_edit.html:70 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +msgid "Create" +msgstr "Crear" + +#: extras/choices.py:255 extras/tables/tables.py:290 +#: templates/extras/eventrule.html:55 +msgid "Update" +msgstr "Actualización" + +#: extras/choices.py:256 extras/tables/tables.py:293 +#: templates/circuits/inc/circuit_termination.html:22 +#: templates/dcim/devicetype/component_templates.html:24 +#: templates/dcim/inc/panels/inventory_items.html:29 +#: templates/dcim/moduletype/component_templates.html:24 +#: templates/dcim/powerpanel.html:71 templates/extras/eventrule.html:59 +#: templates/extras/report_list.html:34 templates/extras/script_list.html:33 +#: templates/generic/bulk_delete.html:18 templates/generic/bulk_delete.html:45 +#: templates/generic/object_delete.html:15 templates/htmx/delete_form.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:35 +#: templates/users/objectpermission.html:49 +#: utilities/templates/buttons/delete.html:9 +msgid "Delete" +msgstr "Eliminar" + +#: extras/choices.py:280 utilities/choices.py:143 utilities/choices.py:191 +msgid "Blue" +msgstr "Azul" + +#: extras/choices.py:281 utilities/choices.py:142 utilities/choices.py:192 +msgid "Indigo" +msgstr "añil" + +#: extras/choices.py:282 utilities/choices.py:140 utilities/choices.py:193 +msgid "Purple" +msgstr "Morado" + +#: extras/choices.py:283 utilities/choices.py:137 utilities/choices.py:194 +msgid "Pink" +msgstr "Rosado" + +#: extras/choices.py:284 utilities/choices.py:136 utilities/choices.py:195 +msgid "Red" +msgstr "rojo" + +#: extras/choices.py:285 utilities/choices.py:154 utilities/choices.py:196 +msgid "Orange" +msgstr "naranja" + +#: extras/choices.py:286 utilities/choices.py:152 utilities/choices.py:197 +msgid "Yellow" +msgstr "Amarillo" + +#: extras/choices.py:287 utilities/choices.py:149 utilities/choices.py:198 +msgid "Green" +msgstr "Verde" + +#: extras/choices.py:288 utilities/choices.py:146 utilities/choices.py:199 +msgid "Teal" +msgstr "Verde azulado" + +#: extras/choices.py:289 utilities/choices.py:145 utilities/choices.py:200 +msgid "Cyan" +msgstr "Cian" + +#: extras/choices.py:290 utilities/choices.py:201 +msgid "Gray" +msgstr "Gris" + +#: extras/choices.py:291 utilities/choices.py:160 utilities/choices.py:202 +msgid "Black" +msgstr "Negro" + +#: extras/choices.py:292 utilities/choices.py:161 utilities/choices.py:203 +msgid "White" +msgstr "blanco" + +#: extras/choices.py:306 extras/forms/model_forms.py:233 +#: extras/forms/model_forms.py:321 templates/extras/webhook.html:11 +msgid "Webhook" +msgstr "Webhook" + +#: extras/choices.py:307 templates/extras/script/base.html:29 +msgid "Script" +msgstr "Guión" + +#: extras/dashboard/forms.py:38 +msgid "Widget type" +msgstr "Tipo de widget" + +#: extras/dashboard/widgets.py:148 +msgid "Note" +msgstr "Nota" + +#: extras/dashboard/widgets.py:149 +msgid "Display some arbitrary custom content. Markdown is supported." +msgstr "Muestra contenido personalizado arbitrario. Markdown es compatible." + +#: extras/dashboard/widgets.py:162 +msgid "Object Counts" +msgstr "Recuentos de objetos" + +#: extras/dashboard/widgets.py:163 +msgid "" +"Display a set of NetBox models and the number of objects created for each " +"type." +msgstr "" +"Muestre un conjunto de modelos de NetBox y el número de objetos creados para" +" cada tipo." + +#: extras/dashboard/widgets.py:173 +msgid "Filters to apply when counting the number of objects" +msgstr "Filtros para aplicar al contar el número de objetos" + +#: extras/dashboard/widgets.py:209 +msgid "Object List" +msgstr "Lista de objetos" + +#: extras/dashboard/widgets.py:210 +msgid "Display an arbitrary list of objects." +msgstr "Muestra una lista arbitraria de objetos." + +#: extras/dashboard/widgets.py:223 +msgid "The default number of objects to display" +msgstr "El número predeterminado de objetos que se van a mostrar" + +#: extras/dashboard/widgets.py:270 +msgid "RSS Feed" +msgstr "Fuente RSS" + +#: extras/dashboard/widgets.py:275 +msgid "Embed an RSS feed from an external website." +msgstr "Inserte una fuente RSS desde un sitio web externo." + +#: extras/dashboard/widgets.py:282 +msgid "Feed URL" +msgstr "URL del feed" + +#: extras/dashboard/widgets.py:287 +msgid "The maximum number of objects to display" +msgstr "El número máximo de objetos que se van a mostrar" + +#: extras/dashboard/widgets.py:292 +msgid "How long to stored the cached content (in seconds)" +msgstr "Cuánto tiempo se debe almacenar el contenido en caché (en segundos)" + +#: extras/dashboard/widgets.py:344 templates/account/base.html:10 +#: templates/account/bookmarks.html:7 templates/inc/profile_button.html:29 +msgid "Bookmarks" +msgstr "Marcadores" + +#: extras/dashboard/widgets.py:348 +msgid "Show your personal bookmarks" +msgstr "Muestra tus marcadores personales" + +#: extras/filtersets.py:207 extras/filtersets.py:542 extras/filtersets.py:570 +msgid "Data file (ID)" +msgstr "Archivo de datos (ID)" + +#: extras/filtersets.py:479 virtualization/forms/filtersets.py:114 +msgid "Cluster type" +msgstr "Tipo de clúster" + +#: extras/filtersets.py:485 virtualization/filtersets.py:95 +#: virtualization/filtersets.py:146 +msgid "Cluster type (slug)" +msgstr "Tipo de clúster (babosa)" + +#: extras/filtersets.py:490 ipam/forms/bulk_edit.py:475 +#: ipam/forms/model_forms.py:585 virtualization/forms/filtersets.py:108 +msgid "Cluster group" +msgstr "Grupo de clústeres" + +#: extras/filtersets.py:496 virtualization/filtersets.py:135 +msgid "Cluster group (slug)" +msgstr "Grupo de racimos (babosa)" + +#: extras/filtersets.py:506 tenancy/forms/forms.py:16 +#: tenancy/forms/forms.py:39 +msgid "Tenant group" +msgstr "Grupo de inquilinos" + +#: extras/filtersets.py:512 tenancy/filtersets.py:163 +#: tenancy/filtersets.py:183 +msgid "Tenant group (slug)" +msgstr "Grupo de inquilinos (slug)" + +#: extras/filtersets.py:528 templates/extras/tag.html:12 +msgid "Tag" +msgstr "Etiqueta" + +#: extras/filtersets.py:534 +msgid "Tag (slug)" +msgstr "Etiqueta (babosa)" + +#: extras/filtersets.py:594 extras/forms/filtersets.py:438 +msgid "Has local config context data" +msgstr "Tiene datos de contexto de configuración local" + +#: extras/filtersets.py:619 +msgid "User name" +msgstr "Nombre de usuario" + +#: extras/forms/bulk_edit.py:32 extras/forms/filtersets.py:56 +msgid "Group name" +msgstr "Nombre del grupo" + +#: extras/forms/bulk_edit.py:40 extras/forms/filtersets.py:64 +#: extras/tables/tables.py:47 templates/extras/customfield.html:39 +#: templates/generic/bulk_import.html:116 +msgid "Required" +msgstr "Obligatorio" + +#: extras/forms/bulk_edit.py:53 extras/forms/bulk_import.py:57 +#: extras/forms/filtersets.py:78 extras/models/customfields.py:193 +msgid "UI visible" +msgstr "Interfaz de usuario visible" + +#: extras/forms/bulk_edit.py:58 extras/forms/bulk_import.py:63 +#: extras/forms/filtersets.py:83 extras/models/customfields.py:200 +msgid "UI editable" +msgstr "Interfaz de usuario editable" + +#: extras/forms/bulk_edit.py:63 extras/forms/filtersets.py:86 +msgid "Is cloneable" +msgstr "Es clonable" + +#: extras/forms/bulk_edit.py:102 extras/forms/filtersets.py:126 +msgid "New window" +msgstr "Ventana nueva" + +#: extras/forms/bulk_edit.py:111 +msgid "Button class" +msgstr "Clase de botones" + +#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:164 +#: extras/models/models.py:439 +msgid "MIME type" +msgstr "Tipo MIME" + +#: extras/forms/bulk_edit.py:133 extras/forms/filtersets.py:167 +msgid "File extension" +msgstr "Extensión de archivo" + +#: extras/forms/bulk_edit.py:138 extras/forms/filtersets.py:171 +msgid "As attachment" +msgstr "Como archivo adjunto" + +#: extras/forms/bulk_edit.py:166 extras/forms/filtersets.py:213 +#: extras/tables/tables.py:214 templates/extras/savedfilter.html:30 +msgid "Shared" +msgstr "Compartido" + +#: extras/forms/bulk_edit.py:189 extras/forms/filtersets.py:242 +#: extras/models/models.py:204 +msgid "HTTP method" +msgstr "Método HTTP" + +#: extras/forms/bulk_edit.py:193 extras/forms/filtersets.py:236 +#: templates/extras/webhook.html:37 +msgid "Payload URL" +msgstr "URL de carga" + +#: extras/forms/bulk_edit.py:198 extras/models/models.py:244 +msgid "SSL verification" +msgstr "Verificación SSL" + +#: extras/forms/bulk_edit.py:201 templates/extras/webhook.html:45 +msgid "Secret" +msgstr "Secreto" + +#: extras/forms/bulk_edit.py:206 +msgid "CA file path" +msgstr "Ruta del archivo CA" + +#: extras/forms/bulk_edit.py:225 +msgid "On create" +msgstr "Al crear" + +#: extras/forms/bulk_edit.py:230 +msgid "On update" +msgstr "En la actualización" + +#: extras/forms/bulk_edit.py:235 +msgid "On delete" +msgstr "Al eliminar" + +#: extras/forms/bulk_edit.py:240 +msgid "On job start" +msgstr "Empezando a trabajar" + +#: extras/forms/bulk_edit.py:245 +msgid "On job end" +msgstr "Al final del trabajo" + +#: extras/forms/bulk_edit.py:282 +msgid "Is active" +msgstr "Está activo" + +#: extras/forms/bulk_import.py:34 extras/forms/bulk_import.py:115 +#: extras/forms/bulk_import.py:130 extras/forms/bulk_import.py:153 +#: extras/forms/bulk_import.py:177 extras/forms/filtersets.py:114 +#: extras/forms/filtersets.py:160 extras/forms/filtersets.py:201 +#: extras/forms/model_forms.py:43 extras/forms/model_forms.py:127 +#: extras/forms/model_forms.py:154 extras/forms/model_forms.py:195 +#: extras/forms/model_forms.py:251 +msgid "Content types" +msgstr "Tipos de contenido" + +#: extras/forms/bulk_import.py:36 extras/forms/bulk_import.py:117 +#: extras/forms/bulk_import.py:132 extras/forms/bulk_import.py:155 +#: extras/forms/bulk_import.py:179 tenancy/forms/bulk_import.py:96 +msgid "One or more assigned object types" +msgstr "Uno o más tipos de objetos asignados" + +#: extras/forms/bulk_import.py:41 +msgid "Field data type (e.g. text, integer, etc.)" +msgstr "Tipo de datos de campo (por ejemplo, texto, entero, etc.)" + +#: extras/forms/bulk_import.py:44 extras/forms/filtersets.py:48 +#: extras/forms/filtersets.py:259 extras/forms/model_forms.py:47 +#: extras/forms/model_forms.py:221 tenancy/forms/filtersets.py:91 +msgid "Object type" +msgstr "Tipo de objeto" + +#: extras/forms/bulk_import.py:47 +msgid "Object type (for object or multi-object fields)" +msgstr "Tipo de objeto (para campos de objetos o de varios objetos)" + +#: extras/forms/bulk_import.py:50 extras/forms/filtersets.py:73 +msgid "Choice set" +msgstr "Set de elección" + +#: extras/forms/bulk_import.py:54 +msgid "Choice set (for selection fields)" +msgstr "Conjunto de opciones (para campos de selección)" + +#: extras/forms/bulk_import.py:60 +msgid "Whether the custom field is displayed in the UI" +msgstr "Si el campo personalizado se muestra en la interfaz de usuario" + +#: extras/forms/bulk_import.py:66 +msgid "Whether the custom field is editable in the UI" +msgstr "Si el campo personalizado se puede editar en la interfaz de usuario" + +#: extras/forms/bulk_import.py:82 +msgid "The base set of predefined choices to use (if any)" +msgstr "" +"El conjunto base de opciones predefinidas que se van a utilizar (si las hay)" + +#: extras/forms/bulk_import.py:88 +msgid "" +"Quoted string of comma-separated field choices with optional labels " +"separated by colon: \"choice1:First Choice,choice2:Second Choice\"" +msgstr "" +"Cadena entre comillas de opciones de campo separadas por comas con etiquetas" +" opcionales separadas por dos puntos: «Choice1:First Choice, Choice2:Second " +"Choice»" + +#: extras/forms/bulk_import.py:182 +msgid "Action object" +msgstr "Objeto de acción" + +#: extras/forms/bulk_import.py:184 +msgid "Webhook name or script as dotted path module.Class" +msgstr "Nombre o script del webhook como ruta punteada module.Class" + +#: extras/forms/bulk_import.py:236 +msgid "Assigned object type" +msgstr "Tipo de objeto asignado" + +#: extras/forms/bulk_import.py:241 +msgid "The classification of entry" +msgstr "La clasificación de entrada" + +#: extras/forms/filtersets.py:53 +msgid "Field type" +msgstr "Tipo de campo" + +#: extras/forms/filtersets.py:97 extras/tables/tables.py:65 +#: templates/generic/bulk_import.html:148 +msgid "Choices" +msgstr "Opciones" + +#: extras/forms/filtersets.py:141 extras/forms/filtersets.py:327 +#: extras/forms/filtersets.py:417 extras/forms/model_forms.py:449 +#: templates/core/job.html:86 templates/extras/configcontext.html:86 +#: templates/extras/eventrule.html:111 +msgid "Data" +msgstr "Datos" + +#: extras/forms/filtersets.py:152 extras/forms/filtersets.py:341 +#: extras/forms/filtersets.py:427 utilities/choices.py:219 +#: utilities/forms/bulk_import.py:27 +msgid "Data file" +msgstr "Archivo de datos" + +#: extras/forms/filtersets.py:185 +msgid "Content type" +msgstr "Tipo de contenido" + +#: extras/forms/filtersets.py:232 extras/models/models.py:209 +msgid "HTTP content type" +msgstr "Tipo de contenido HTTP" + +#: extras/forms/filtersets.py:254 extras/forms/model_forms.py:269 +#: templates/extras/eventrule.html:46 +msgid "Events" +msgstr "Eventos" + +#: extras/forms/filtersets.py:264 +msgid "Action type" +msgstr "Tipo de acción" + +#: extras/forms/filtersets.py:278 +msgid "Object creations" +msgstr "Creaciones de objetos" + +#: extras/forms/filtersets.py:285 +msgid "Object updates" +msgstr "Actualizaciones de objetos" + +#: extras/forms/filtersets.py:292 +msgid "Object deletions" +msgstr "Eliminaciones de objetos" + +#: extras/forms/filtersets.py:299 +msgid "Job starts" +msgstr "Comienza el trabajo" + +#: extras/forms/filtersets.py:306 extras/forms/model_forms.py:289 +msgid "Job terminations" +msgstr "Cese de puestos" + +#: extras/forms/filtersets.py:315 +msgid "Tagged object type" +msgstr "Tipo de objeto etiquetado" + +#: extras/forms/filtersets.py:320 +msgid "Allowed object type" +msgstr "Tipo de objeto permitido" + +#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:384 +#: netbox/navigation/menu.py:19 +msgid "Regions" +msgstr "Regiones" + +#: extras/forms/filtersets.py:354 extras/forms/model_forms.py:389 +msgid "Site groups" +msgstr "Grupos de sitios" + +#: extras/forms/filtersets.py:364 extras/forms/model_forms.py:399 +#: netbox/navigation/menu.py:21 +msgid "Locations" +msgstr "Ubicaciones" + +#: extras/forms/filtersets.py:369 extras/forms/model_forms.py:404 +msgid "Device types" +msgstr "Tipos de dispositivos" + +#: extras/forms/filtersets.py:374 extras/forms/model_forms.py:409 +msgid "Roles" +msgstr "Funciones" + +#: extras/forms/filtersets.py:384 extras/forms/model_forms.py:419 +msgid "Cluster types" +msgstr "Tipos de clústeres" + +#: extras/forms/filtersets.py:390 extras/forms/model_forms.py:424 +msgid "Cluster groups" +msgstr "Grupos de clústeres" + +#: extras/forms/filtersets.py:395 extras/forms/model_forms.py:429 +#: netbox/navigation/menu.py:243 netbox/navigation/menu.py:245 +#: templates/virtualization/clustertype.html:33 +#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +msgid "Clusters" +msgstr "Clústers" + +#: extras/forms/filtersets.py:400 extras/forms/model_forms.py:434 +msgid "Tenant groups" +msgstr "Grupos de inquilinos" + +#: extras/forms/filtersets.py:454 extras/forms/filtersets.py:495 +msgid "After" +msgstr "Después" + +#: extras/forms/filtersets.py:459 extras/forms/filtersets.py:500 +msgid "Before" +msgstr "Antes" + +#: extras/forms/filtersets.py:490 extras/tables/tables.py:426 +#: templates/extras/htmx/report_result.html:43 +#: templates/extras/objectchange.html:34 +msgid "Time" +msgstr "Hora" + +#: extras/forms/filtersets.py:504 extras/forms/model_forms.py:271 +#: extras/tables/tables.py:440 templates/extras/eventrule.html:90 +#: templates/extras/objectchange.html:50 +msgid "Action" +msgstr "Acción" + +#: extras/forms/model_forms.py:50 +msgid "Type of the related object (for object/multi-object fields only)" +msgstr "Tipo del objeto relacionado (solo para campos de objeto/multiobjeto)" + +#: extras/forms/model_forms.py:58 templates/extras/customfield.html:11 +msgid "Custom Field" +msgstr "Campo personalizado" + +#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +msgid "Behavior" +msgstr "Comportamiento" + +#: extras/forms/model_forms.py:62 +msgid "Values" +msgstr "Valores" + +#: extras/forms/model_forms.py:71 +msgid "" +"The type of data stored in this field. For object/multi-object fields, " +"select the related object type below." +msgstr "" +"El tipo de datos almacenados en este campo. Para los campos de objetos o " +"multiobjetos, seleccione el tipo de objeto relacionado a continuación." + +#: extras/forms/model_forms.py:74 +msgid "" +"This will be displayed as help text for the form field. Markdown is " +"supported." +msgstr "" +"Esto se mostrará como texto de ayuda para el campo del formulario. Markdown " +"es compatible." + +#: extras/forms/model_forms.py:91 +msgid "" +"Enter one choice per line. An optional label may be specified for each " +"choice by appending it with a colon. Example:" +msgstr "" +"Introduzca una opción por línea. Se puede especificar una etiqueta opcional " +"para cada elección añadiendo dos puntos. Ejemplo:" + +#: extras/forms/model_forms.py:132 templates/extras/customlink.html:10 +msgid "Custom Link" +msgstr "Vínculo personalizado" + +#: extras/forms/model_forms.py:133 +msgid "Templates" +msgstr "Plantillas" + +#: extras/forms/model_forms.py:145 +msgid "" +"Jinja2 template code for the link text. Reference the object as {{ " +"object }}. Links which render as empty text will not be displayed." +msgstr "" + +#: extras/forms/model_forms.py:148 +msgid "" +"Jinja2 template code for the link URL. Reference the object as {{ " +"object }}." +msgstr "" + +#: extras/forms/model_forms.py:158 extras/forms/model_forms.py:500 +msgid "Template code" +msgstr "Código de plantilla" + +#: extras/forms/model_forms.py:164 templates/extras/exporttemplate.html:17 +msgid "Export Template" +msgstr "Plantilla de exportación" + +#: extras/forms/model_forms.py:166 +msgid "Rendering" +msgstr "Renderización" + +#: extras/forms/model_forms.py:180 extras/forms/model_forms.py:525 +msgid "Template content is populated from the remote source selected below." +msgstr "" +"El contenido de la plantilla se rellena desde la fuente remota seleccionada " +"a continuación." + +#: extras/forms/model_forms.py:187 extras/forms/model_forms.py:532 +msgid "Must specify either local content or a data file" +msgstr "Debe especificar el contenido local o un archivo de datos" + +#: extras/forms/model_forms.py:201 netbox/forms/mixins.py:68 +#: templates/extras/savedfilter.html:10 +msgid "Saved Filter" +msgstr "Filtro guardado" + +#: extras/forms/model_forms.py:234 templates/extras/webhook.html:28 +msgid "HTTP Request" +msgstr "Solicitud HTTP" + +#: extras/forms/model_forms.py:237 templates/extras/webhook.html:53 +msgid "SSL" +msgstr "SSL" + +#: extras/forms/model_forms.py:255 +msgid "Action choice" +msgstr "Elección de acción" + +#: extras/forms/model_forms.py:260 +msgid "Enter conditions in JSON format." +msgstr "" +"Introduzca las condiciones en JSON " +"formato." + +#: extras/forms/model_forms.py:264 +msgid "" +"Enter parameters to pass to the action in JSON format." +msgstr "" +"Introduzca los parámetros para pasar a la acción en JSON formato." + +#: extras/forms/model_forms.py:268 templates/extras/eventrule.html:11 +msgid "Event Rule" +msgstr "Regla del evento" + +#: extras/forms/model_forms.py:270 templates/extras/eventrule.html:78 +msgid "Conditions" +msgstr "Condiciones" + +#: extras/forms/model_forms.py:285 +msgid "Creations" +msgstr "Creaciones" + +#: extras/forms/model_forms.py:286 +msgid "Updates" +msgstr "Actualizaciones" + +#: extras/forms/model_forms.py:287 +msgid "Deletions" +msgstr "Eliminaciones" + +#: extras/forms/model_forms.py:288 +msgid "Job executions" +msgstr "Ejecuciones de trabajos" + +#: extras/forms/model_forms.py:366 users/forms/model_forms.py:285 +msgid "Object types" +msgstr "Tipos de objetos" + +#: extras/forms/model_forms.py:439 netbox/navigation/menu.py:40 +#: tenancy/tables/tenants.py:22 +msgid "Tenants" +msgstr "Inquilinos" + +#: extras/forms/model_forms.py:456 ipam/forms/filtersets.py:141 +#: ipam/forms/filtersets.py:527 templates/extras/configcontext.html:62 +#: templates/ipam/ipaddress.html:62 templates/ipam/vlan_edit.html:30 +#: tenancy/forms/filtersets.py:86 users/forms/model_forms.py:323 +msgid "Assignment" +msgstr "Asignación" + +#: extras/forms/model_forms.py:482 +msgid "Data is populated from the remote source selected below." +msgstr "" +"Los datos se rellenan desde la fuente remota seleccionada a continuación." + +#: extras/forms/model_forms.py:488 +msgid "Must specify either local data or a data file" +msgstr "Debe especificar datos locales o un archivo de datos" + +#: extras/forms/model_forms.py:507 templates/core/datafile.html:65 +msgid "Content" +msgstr "Contenido" + +#: extras/forms/reports.py:18 extras/forms/scripts.py:24 +msgid "Schedule at" +msgstr "Programe en" + +#: extras/forms/reports.py:19 +msgid "Schedule execution of report to a set time" +msgstr "Programe la ejecución del informe a una hora determinada" + +#: extras/forms/reports.py:24 extras/forms/scripts.py:30 +msgid "Recurs every" +msgstr "Se repite cada" + +#: extras/forms/reports.py:28 +msgid "Interval at which this report is re-run (in minutes)" +msgstr "Intervalo en el que se vuelve a ejecutar este informe (en minutos)" + +#: extras/forms/reports.py:36 extras/forms/scripts.py:42 +#, python-brace-format +msgid " (current time: {now})" +msgstr " (hora actual: {now})" + +#: extras/forms/reports.py:46 extras/forms/scripts.py:52 +msgid "Scheduled time must be in the future." +msgstr "La hora programada debe estar en el futuro." + +#: extras/forms/scripts.py:18 +msgid "Commit changes" +msgstr "Confirmar cambios" + +#: extras/forms/scripts.py:19 +msgid "Commit changes to the database (uncheck for a dry-run)" +msgstr "" +"Confirme los cambios en la base de datos (desactive la casilla para una " +"ejecución en seco)" + +#: extras/forms/scripts.py:25 +msgid "Schedule execution of script to a set time" +msgstr "Programe la ejecución del script a una hora determinada" + +#: extras/forms/scripts.py:34 +msgid "Interval at which this script is re-run (in minutes)" +msgstr "Intervalo en el que se vuelve a ejecutar este script (en minutos)" + +#: extras/models/change_logging.py:24 +msgid "time" +msgstr "tiempo" + +#: extras/models/change_logging.py:37 +msgid "user name" +msgstr "nombre de usuario" + +#: extras/models/change_logging.py:42 +msgid "request ID" +msgstr "ID de solicitud" + +#: extras/models/change_logging.py:47 extras/models/staging.py:69 +msgid "action" +msgstr "acción" + +#: extras/models/change_logging.py:81 +msgid "pre-change data" +msgstr "datos de cambio previo" + +#: extras/models/change_logging.py:87 +msgid "post-change data" +msgstr "datos posteriores al cambio" + +#: extras/models/change_logging.py:101 +msgid "object change" +msgstr "cambio de objeto" + +#: extras/models/change_logging.py:102 +msgid "object changes" +msgstr "cambios de objetos" + +#: extras/models/change_logging.py:118 +#, python-brace-format +msgid "Change logging is not supported for this object type ({type})." +msgstr "" +"El registro de cambios no es compatible con este tipo de objeto ({type})." + +#: extras/models/configs.py:130 +msgid "config context" +msgstr "contexto de configuración" + +#: extras/models/configs.py:131 +msgid "config contexts" +msgstr "contextos de configuración" + +#: extras/models/configs.py:149 extras/models/configs.py:205 +msgid "JSON data must be in object form. Example:" +msgstr "Los datos JSON deben estar en forma de objeto. Ejemplo:" + +#: extras/models/configs.py:169 +msgid "" +"Local config context data takes precedence over source contexts in the final" +" rendered config context" +msgstr "" +"Los datos del contexto de configuración local tienen prioridad sobre los " +"contextos de origen en el contexto de configuración renderizado final." + +#: extras/models/configs.py:224 +msgid "template code" +msgstr "código de plantilla" + +#: extras/models/configs.py:225 +msgid "Jinja2 template code." +msgstr "Código de plantilla Jinja2." + +#: extras/models/configs.py:228 +msgid "environment parameters" +msgstr "parámetros ambientales" + +#: extras/models/configs.py:233 +msgid "" +"Any additional" +" parameters to pass when constructing the Jinja2 environment." +msgstr "" +"Cualquier parámetros" +" adicionales para pasar al construir el entorno Jinja2." + +#: extras/models/configs.py:240 +msgid "config template" +msgstr "plantilla de configuración" + +#: extras/models/configs.py:241 +msgid "config templates" +msgstr "plantillas de configuración" + +#: extras/models/customfields.py:72 +msgid "The object(s) to which this field applies." +msgstr "Los objetos a los que se aplica este campo." + +#: extras/models/customfields.py:79 +msgid "The type of data this custom field holds" +msgstr "El tipo de datos que contiene este campo personalizado" + +#: extras/models/customfields.py:86 +msgid "The type of NetBox object this field maps to (for object fields)" +msgstr "" +"El tipo de objeto NetBox al que se asigna este campo (para campos de " +"objetos)" + +#: extras/models/customfields.py:92 +msgid "Internal field name" +msgstr "Nombre del campo interno" + +#: extras/models/customfields.py:96 +msgid "Only alphanumeric characters and underscores are allowed." +msgstr "Solo se permiten caracteres alfanuméricos y guiones bajos." + +#: extras/models/customfields.py:101 +msgid "Double underscores are not permitted in custom field names." +msgstr "" +"No se permiten los guiones dobles de subrayado en los nombres de campo " +"personalizados." + +#: extras/models/customfields.py:112 +msgid "" +"Name of the field as displayed to users (if not provided, 'the field's name " +"will be used)" +msgstr "" +"Nombre del campo tal como se muestra a los usuarios (si no se proporciona, " +"se usará el nombre del campo)" + +#: extras/models/customfields.py:116 extras/models/models.py:347 +msgid "group name" +msgstr "nombre del grupo" + +#: extras/models/customfields.py:119 +msgid "Custom fields within the same group will be displayed together" +msgstr "Los campos personalizados del mismo grupo se mostrarán juntos" + +#: extras/models/customfields.py:127 +msgid "required" +msgstr "requerido" + +#: extras/models/customfields.py:129 +msgid "" +"If true, this field is required when creating new objects or editing an " +"existing object." +msgstr "" +"Si es verdadero, este campo es obligatorio al crear objetos nuevos o editar " +"un objeto existente." + +#: extras/models/customfields.py:132 +msgid "search weight" +msgstr "peso de búsqueda" + +#: extras/models/customfields.py:135 +msgid "" +"Weighting for search. Lower values are considered more important. Fields " +"with a search weight of zero will be ignored." +msgstr "" +"Ponderación para la búsqueda. Los valores más bajos se consideran más " +"importantes. Los campos con un peso de búsqueda de cero se ignorarán." + +#: extras/models/customfields.py:140 +msgid "filter logic" +msgstr "lógica de filtros" + +#: extras/models/customfields.py:144 +msgid "" +"Loose matches any instance of a given string; exact matches the entire " +"field." +msgstr "" +"Loose coincide con cualquier instancia de una cadena determinada; exact " +"coincide con todo el campo." + +#: extras/models/customfields.py:147 +msgid "default" +msgstr "predeterminado" + +#: extras/models/customfields.py:151 +msgid "" +"Default value for the field (must be a JSON value). Encapsulate strings with" +" double quotes (e.g. \"Foo\")." +msgstr "" +"Valor predeterminado para el campo (debe ser un valor JSON). Encapsula " +"cadenas con comillas dobles (por ejemplo, «Foo»)." + +#: extras/models/customfields.py:156 +msgid "display weight" +msgstr "peso de la pantalla" + +#: extras/models/customfields.py:157 +msgid "Fields with higher weights appear lower in a form." +msgstr "Los campos con pesos más altos aparecen más abajo en un formulario." + +#: extras/models/customfields.py:162 +msgid "minimum value" +msgstr "valor mínimo" + +#: extras/models/customfields.py:163 +msgid "Minimum allowed value (for numeric fields)" +msgstr "Valor mínimo permitido (para campos numéricos)" + +#: extras/models/customfields.py:168 +msgid "maximum value" +msgstr "valor máximo" + +#: extras/models/customfields.py:169 +msgid "Maximum allowed value (for numeric fields)" +msgstr "Valor máximo permitido (para campos numéricos)" + +#: extras/models/customfields.py:175 +msgid "validation regex" +msgstr "expresión regular de validación" + +#: extras/models/customfields.py:177 +#, python-brace-format +msgid "" +"Regular expression to enforce on text field values. Use ^ and $ to force " +"matching of entire string. For example, ^[A-Z]{3}$ will limit " +"values to exactly three uppercase letters." +msgstr "" +"Expresión regular para aplicar en los valores de los campos de texto. Use ^ " +"y $ para forzar la coincidencia de toda la cadena. Por ejemplo, ^ " +"[A-Z]{3}$ limitará los valores a exactamente tres letras mayúsculas." + +#: extras/models/customfields.py:185 +msgid "choice set" +msgstr "conjunto de opciones" + +#: extras/models/customfields.py:194 +msgid "Specifies whether the custom field is displayed in the UI" +msgstr "" +"Especifica si el campo personalizado se muestra en la interfaz de usuario" + +#: extras/models/customfields.py:201 +msgid "Specifies whether the custom field value can be edited in the UI" +msgstr "" +"Especifica si el valor del campo personalizado se puede editar en la " +"interfaz de usuario" + +#: extras/models/customfields.py:205 +msgid "is cloneable" +msgstr "es clonable" + +#: extras/models/customfields.py:206 +msgid "Replicate this value when cloning objects" +msgstr "Replique este valor al clonar objetos" + +#: extras/models/customfields.py:219 +msgid "custom field" +msgstr "campo personalizado" + +#: extras/models/customfields.py:220 +msgid "custom fields" +msgstr "campos personalizados" + +#: extras/models/customfields.py:309 +#, python-brace-format +msgid "Invalid default value \"{value}\": {error}" +msgstr "Valor predeterminado no válido»{value}«: {error}" + +#: extras/models/customfields.py:316 +msgid "A minimum value may be set only for numeric fields" +msgstr "Solo se puede establecer un valor mínimo para los campos numéricos" + +#: extras/models/customfields.py:318 +msgid "A maximum value may be set only for numeric fields" +msgstr "Solo se puede establecer un valor máximo para los campos numéricos" + +#: extras/models/customfields.py:328 +msgid "" +"Regular expression validation is supported only for text and URL fields" +msgstr "" +"La validación de expresiones regulares solo se admite para campos de texto y" +" URL" + +#: extras/models/customfields.py:338 +msgid "Selection fields must specify a set of choices." +msgstr "Los campos de selección deben especificar un conjunto de opciones." + +#: extras/models/customfields.py:342 +msgid "Choices may be set only on selection fields." +msgstr "Las elecciones solo se pueden establecer en los campos de selección." + +#: extras/models/customfields.py:349 +msgid "Object fields must define an object type." +msgstr "Los campos de objeto deben definir un tipo de objeto." + +#: extras/models/customfields.py:354 +#, python-brace-format +msgid "{type} fields may not define an object type." +msgstr "{type} es posible que los campos no definan un tipo de objeto." + +#: extras/models/customfields.py:434 +msgid "True" +msgstr "Cierto" + +#: extras/models/customfields.py:435 +msgid "False" +msgstr "Falso" + +#: extras/models/customfields.py:517 +#, python-brace-format +msgid "Values must match this regex: {regex}" +msgstr "" +"Los valores deben coincidir con esta expresión regular: {regex}" + +#: extras/models/customfields.py:612 +msgid "Value must be a string." +msgstr "El valor debe ser una cadena." + +#: extras/models/customfields.py:614 +#, python-brace-format +msgid "Value must match regex '{regex}'" +msgstr "El valor debe coincidir con la expresión regular '{regex}'" + +#: extras/models/customfields.py:619 +msgid "Value must be an integer." +msgstr "El valor debe ser un número entero." + +#: extras/models/customfields.py:622 extras/models/customfields.py:637 +#, python-brace-format +msgid "Value must be at least {minimum}" +msgstr "El valor debe ser al menos {minimum}" + +#: extras/models/customfields.py:626 extras/models/customfields.py:641 +#, python-brace-format +msgid "Value must not exceed {maximum}" +msgstr "El valor no debe superar {maximum}" + +#: extras/models/customfields.py:634 +msgid "Value must be a decimal." +msgstr "El valor debe ser decimal." + +#: extras/models/customfields.py:646 +msgid "Value must be true or false." +msgstr "El valor debe ser verdadero o falso." + +#: extras/models/customfields.py:654 +msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." +msgstr "Los valores de fecha deben estar en formato ISO 8601 (AAAA-MM-DD)." + +#: extras/models/customfields.py:663 +msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." +msgstr "" +"Los valores de fecha y hora deben estar en formato ISO 8601 (AAAA-MM-DD " +"HH:MM:SS)." + +#: extras/models/customfields.py:670 +#, python-brace-format +msgid "Invalid choice ({value}) for choice set {choiceset}." +msgstr "" +"Elección no válida ({value}) para el conjunto de opciones {choiceset}." + +#: extras/models/customfields.py:680 +#, python-brace-format +msgid "Invalid choice(s) ({value}) for choice set {choiceset}." +msgstr "" +"Elecciones no válidas ({value}) para el conjunto de opciones {choiceset}." + +#: extras/models/customfields.py:689 +#, python-brace-format +msgid "Value must be an object ID, not {type}" +msgstr "El valor debe ser un ID de objeto, no {type}" + +#: extras/models/customfields.py:695 +#, python-brace-format +msgid "Value must be a list of object IDs, not {type}" +msgstr "El valor debe ser una lista de identificadores de objetos, no {type}" + +#: extras/models/customfields.py:699 +#, python-brace-format +msgid "Found invalid object ID: {id}" +msgstr "Se encontró un ID de objeto no válido: {id}" + +#: extras/models/customfields.py:702 +msgid "Required field cannot be empty." +msgstr "El campo obligatorio no puede estar vacío." + +#: extras/models/customfields.py:721 +msgid "Base set of predefined choices (optional)" +msgstr "Conjunto básico de opciones predefinidas (opcional)" + +#: extras/models/customfields.py:733 +msgid "Choices are automatically ordered alphabetically" +msgstr "Las opciones se ordenan alfabéticamente automáticamente" + +#: extras/models/customfields.py:740 +msgid "custom field choice set" +msgstr "conjunto de opciones de campo personalizadas" + +#: extras/models/customfields.py:741 +msgid "custom field choice sets" +msgstr "conjuntos de opciones de campo personalizadas" + +#: extras/models/customfields.py:777 +msgid "Must define base or extra choices." +msgstr "Debe definir opciones básicas o adicionales." + +#: extras/models/dashboard.py:19 +msgid "layout" +msgstr "diseño" + +#: extras/models/dashboard.py:23 +msgid "config" +msgstr "configuración" + +#: extras/models/dashboard.py:28 +msgid "dashboard" +msgstr "salpicadero" + +#: extras/models/dashboard.py:29 +msgid "dashboards" +msgstr "tableros" + +#: extras/models/models.py:49 +msgid "object types" +msgstr "tipos de objetos" + +#: extras/models/models.py:50 +msgid "The object(s) to which this rule applies." +msgstr "Los objetos a los que se aplica esta regla." + +#: extras/models/models.py:63 +msgid "on create" +msgstr "al crear" + +#: extras/models/models.py:65 +msgid "Triggers when a matching object is created." +msgstr "Se activa cuando se crea un objeto coincidente." + +#: extras/models/models.py:68 +msgid "on update" +msgstr "en la actualización" + +#: extras/models/models.py:70 +msgid "Triggers when a matching object is updated." +msgstr "Se activa cuando se actualiza un objeto coincidente." + +#: extras/models/models.py:73 +msgid "on delete" +msgstr "al eliminar" + +#: extras/models/models.py:75 +msgid "Triggers when a matching object is deleted." +msgstr "Se activa cuando se elimina un objeto coincidente." + +#: extras/models/models.py:78 +msgid "on job start" +msgstr "al iniciar el trabajo" + +#: extras/models/models.py:80 +msgid "Triggers when a job for a matching object is started." +msgstr "Se activa cuando se inicia un trabajo para un objeto coincidente." + +#: extras/models/models.py:83 +msgid "on job end" +msgstr "al final del trabajo" + +#: extras/models/models.py:85 +msgid "Triggers when a job for a matching object terminates." +msgstr "Se activa cuando finaliza un trabajo para un objeto coincidente." + +#: extras/models/models.py:92 +msgid "conditions" +msgstr "condiciones" + +#: extras/models/models.py:95 +msgid "" +"A set of conditions which determine whether the event will be generated." +msgstr "Conjunto de condiciones que determinan si se generará el evento." + +#: extras/models/models.py:103 +msgid "action type" +msgstr "tipo de acción" + +#: extras/models/models.py:126 +msgid "Additional data to pass to the action object" +msgstr "Datos adicionales para pasar al objeto de acción" + +#: extras/models/models.py:138 +msgid "event rule" +msgstr "regla de evento" + +#: extras/models/models.py:139 +msgid "event rules" +msgstr "reglas del evento" + +#: extras/models/models.py:155 +msgid "" +"At least one event type must be selected: create, update, delete, job start," +" and/or job end." +msgstr "" +"Debe seleccionarse al menos un tipo de evento: crear, actualizar, eliminar, " +"iniciar o finalizar el trabajo." + +#: extras/models/models.py:196 +msgid "" +"This URL will be called using the HTTP method defined when the webhook is " +"called. Jinja2 template processing is supported with the same context as the" +" request body." +msgstr "" +"Esta URL se llamará mediante el método HTTP definido cuando se llame al " +"webhook. El procesamiento de plantillas de Jinja2 se admite en el mismo " +"contexto que el cuerpo de la solicitud." + +#: extras/models/models.py:211 +msgid "" +"The complete list of official content types is available here." +msgstr "" +"La lista completa de tipos de contenido oficial está disponible aquí." + +#: extras/models/models.py:216 +msgid "additional headers" +msgstr "encabezados adicionales" + +#: extras/models/models.py:219 +msgid "" +"User-supplied HTTP headers to be sent with the request in addition to the " +"HTTP content type. Headers should be defined in the format Name: " +"Value. Jinja2 template processing is supported with the same context " +"as the request body (below)." +msgstr "" +"Encabezados HTTP proporcionados por el usuario que se enviarán con la " +"solicitud además del tipo de contenido HTTP. Los encabezados deben definirse" +" en el formato Nombre: Value. El procesamiento de plantillas de" +" Jinja2 se admite en el mismo contexto que el cuerpo de la solicitud (a " +"continuación)." + +#: extras/models/models.py:225 +msgid "body template" +msgstr "plantilla corporal" + +#: extras/models/models.py:228 +msgid "" +"Jinja2 template for a custom request body. If blank, a JSON object " +"representing the change will be included. Available context data includes: " +"event, model, timestamp, " +"username, request_id, and data." +msgstr "" +"Plantilla Jinja2 para un cuerpo de solicitud personalizado. Si está en " +"blanco, se incluirá un objeto JSON que representa el cambio. Los datos " +"contextuales disponibles incluyen: acto, modelo, " +"marca de tiempo, nombre de usuario, " +"id_solicitud, y dato." + +#: extras/models/models.py:234 +msgid "secret" +msgstr "secreto" + +#: extras/models/models.py:238 +msgid "" +"When provided, the request will include a X-Hook-Signature " +"header containing a HMAC hex digest of the payload body using the secret as " +"the key. The secret is not transmitted in the request." +msgstr "" +"Cuando se proporcione, la solicitud incluirá un Firma de X-Hook" +" encabezado que contiene un resumen hexadecimal en HMAC del cuerpo de la " +"carga utilizando el secreto como clave. El secreto no se transmite en la " +"solicitud." + +#: extras/models/models.py:245 +msgid "Enable SSL certificate verification. Disable with caution!" +msgstr "" +"Habilita la verificación del certificado SSL. ¡Desactívala con precaución!" + +#: extras/models/models.py:251 templates/extras/webhook.html:62 +msgid "CA File Path" +msgstr "Ruta del archivo CA" + +#: extras/models/models.py:253 +msgid "" +"The specific CA certificate file to use for SSL verification. Leave blank to" +" use the system defaults." +msgstr "" +"El archivo de certificado de CA específico que se utilizará para la " +"verificación SSL. Déjelo en blanco para usar los valores predeterminados del" +" sistema." + +#: extras/models/models.py:264 +msgid "webhook" +msgstr "webhook" + +#: extras/models/models.py:265 +msgid "webhooks" +msgstr "webhooks" + +#: extras/models/models.py:283 +msgid "Do not specify a CA certificate file if SSL verification is disabled." +msgstr "" +"No especifique un archivo de certificado de CA si la verificación SSL está " +"deshabilitada." + +#: extras/models/models.py:323 +msgid "The object type(s) to which this link applies." +msgstr "Los tipos de objeto a los que se aplica este enlace." + +#: extras/models/models.py:335 +msgid "link text" +msgstr "texto de enlace" + +#: extras/models/models.py:336 +msgid "Jinja2 template code for link text" +msgstr "Código de plantilla Jinja2 para texto de enlace" + +#: extras/models/models.py:339 +msgid "link URL" +msgstr "URL del enlace" + +#: extras/models/models.py:340 +msgid "Jinja2 template code for link URL" +msgstr "Código de plantilla Jinja2 para la URL del enlace" + +#: extras/models/models.py:350 +msgid "Links with the same group will appear as a dropdown menu" +msgstr "Los enlaces con el mismo grupo aparecerán en un menú desplegable" + +#: extras/models/models.py:353 +msgid "button class" +msgstr "clase de botones" + +#: extras/models/models.py:357 +msgid "" +"The class of the first link in a group will be used for the dropdown button" +msgstr "" +"La clase del primer enlace de un grupo se usará para el botón desplegable" + +#: extras/models/models.py:360 +msgid "new window" +msgstr "ventana nueva" + +#: extras/models/models.py:362 +msgid "Force link to open in a new window" +msgstr "Forzar que el enlace se abra en una ventana nueva" + +#: extras/models/models.py:371 +msgid "custom link" +msgstr "enlace personalizado" + +#: extras/models/models.py:372 +msgid "custom links" +msgstr "enlaces personalizados" + +#: extras/models/models.py:419 +msgid "The object type(s) to which this template applies." +msgstr "Los tipos de objeto a los que se aplica esta plantilla." + +#: extras/models/models.py:432 +msgid "" +"Jinja2 template code. The list of objects being exported is passed as a " +"context variable named queryset." +msgstr "" +"Código de plantilla Jinja2. La lista de objetos que se exportan se pasa como" +" una variable de contexto denominada conjunto de consultas." + +#: extras/models/models.py:440 +msgid "Defaults to text/plain; charset=utf-8" +msgstr "El valor predeterminado es texto/plano; charset=utf-8" + +#: extras/models/models.py:443 +msgid "file extension" +msgstr "extensión de archivo" + +#: extras/models/models.py:446 +msgid "Extension to append to the rendered filename" +msgstr "Extensión para añadir al nombre de archivo renderizado" + +#: extras/models/models.py:449 +msgid "as attachment" +msgstr "como adjunto" + +#: extras/models/models.py:451 +msgid "Download file as attachment" +msgstr "Descargar archivo como archivo adjunto" + +#: extras/models/models.py:460 +msgid "export template" +msgstr "plantilla de exportación" + +#: extras/models/models.py:461 +msgid "export templates" +msgstr "plantillas de exportación" + +#: extras/models/models.py:478 +#, python-brace-format +msgid "\"{name}\" is a reserved name. Please choose a different name." +msgstr "«{name}\"es un nombre reservado. Elija un nombre diferente." + +#: extras/models/models.py:528 +msgid "The object type(s) to which this filter applies." +msgstr "Los tipos de objeto a los que se aplica este filtro." + +#: extras/models/models.py:560 +msgid "shared" +msgstr "compartido" + +#: extras/models/models.py:573 +msgid "saved filter" +msgstr "filtro guardado" + +#: extras/models/models.py:574 +msgid "saved filters" +msgstr "filtros guardados" + +#: extras/models/models.py:592 +msgid "Filter parameters must be stored as a dictionary of keyword arguments." +msgstr "" +"Los parámetros de filtro se deben almacenar como un diccionario de " +"argumentos de palabras clave." + +#: extras/models/models.py:620 +msgid "image height" +msgstr "altura de la imagen" + +#: extras/models/models.py:623 +msgid "image width" +msgstr "ancho de imagen" + +#: extras/models/models.py:640 +msgid "image attachment" +msgstr "adjunto de imagen" + +#: extras/models/models.py:641 +msgid "image attachments" +msgstr "archivos adjuntos de imágenes" + +#: extras/models/models.py:655 +#, python-brace-format +msgid "Image attachments cannot be assigned to this object type ({type})." +msgstr "" +"Los archivos adjuntos de imágenes no se pueden asignar a este tipo de objeto" +" ({type})." + +#: extras/models/models.py:718 +msgid "kind" +msgstr "amable" + +#: extras/models/models.py:732 +msgid "journal entry" +msgstr "entrada de diario" + +#: extras/models/models.py:733 +msgid "journal entries" +msgstr "entradas de diario" + +#: extras/models/models.py:748 +#, python-brace-format +msgid "Journaling is not supported for this object type ({type})." +msgstr "No se admite el registro en diario para este tipo de objeto ({type})." + +#: extras/models/models.py:790 +msgid "bookmark" +msgstr "marcalibros" + +#: extras/models/models.py:791 +msgid "bookmarks" +msgstr "marcapáginas" + +#: extras/models/models.py:804 +#, python-brace-format +msgid "Bookmarks cannot be assigned to this object type ({type})." +msgstr "No se pueden asignar marcadores a este tipo de objeto ({type})." + +#: extras/models/reports.py:46 +msgid "report module" +msgstr "módulo de informes" + +#: extras/models/reports.py:47 +msgid "report modules" +msgstr "módulos de informes" + +#: extras/models/scripts.py:46 +msgid "script module" +msgstr "módulo de script" + +#: extras/models/scripts.py:47 +msgid "script modules" +msgstr "módulos de script" + +#: extras/models/search.py:24 +msgid "timestamp" +msgstr "marca de tiempo" + +#: extras/models/search.py:39 +msgid "field" +msgstr "campo" + +#: extras/models/search.py:47 +msgid "value" +msgstr "valor" + +#: extras/models/search.py:58 +msgid "cached value" +msgstr "valor almacenado en caché" + +#: extras/models/search.py:59 +msgid "cached values" +msgstr "valores en caché" + +#: extras/models/staging.py:44 +msgid "branch" +msgstr "sucursal" + +#: extras/models/staging.py:45 +msgid "branches" +msgstr "sucursales" + +#: extras/models/staging.py:97 +msgid "staged change" +msgstr "cambio por etapas" + +#: extras/models/staging.py:98 +msgid "staged changes" +msgstr "cambios por etapas" + +#: extras/models/tags.py:40 +msgid "The object type(s) to which this this tag can be applied." +msgstr "Los tipos de objeto a los que se puede aplicar esta etiqueta." + +#: extras/models/tags.py:49 +msgid "tag" +msgstr "etiqueta" + +#: extras/models/tags.py:50 +msgid "tags" +msgstr "etiquetas" + +#: extras/models/tags.py:78 +msgid "tagged item" +msgstr "artículo etiquetado" + +#: extras/models/tags.py:79 +msgid "tagged items" +msgstr "artículos etiquetados" + +#: extras/signals.py:221 +#, python-brace-format +msgid "Deletion is prevented by a protection rule: {message}" +msgstr "La eliminación se impide mediante una regla de protección: {message}" + +#: extras/tables/tables.py:44 extras/tables/tables.py:119 +#: extras/tables/tables.py:143 extras/tables/tables.py:208 +#: extras/tables/tables.py:281 +msgid "Content Types" +msgstr "Tipos de contenido" + +#: extras/tables/tables.py:50 +msgid "Visible" +msgstr "Visible" + +#: extras/tables/tables.py:53 +msgid "Editable" +msgstr "Editable" + +#: extras/tables/tables.py:60 templates/extras/customfield.html:48 +msgid "Choice Set" +msgstr "Set de elección" + +#: extras/tables/tables.py:68 +msgid "Is Cloneable" +msgstr "Se puede clonar" + +#: extras/tables/tables.py:98 +msgid "Count" +msgstr "Contar" + +#: extras/tables/tables.py:101 +msgid "Order Alphabetically" +msgstr "Ordenar alfabéticamente" + +#: extras/tables/tables.py:125 templates/extras/customlink.html:34 +msgid "New Window" +msgstr "Ventana nueva" + +#: extras/tables/tables.py:146 +msgid "As Attachment" +msgstr "Como archivo adjunto" + +#: extras/tables/tables.py:153 extras/tables/tables.py:367 +#: extras/tables/tables.py:402 templates/core/datafile.html:32 +#: templates/dcim/device/render_config.html:23 +#: templates/extras/configcontext.html:40 +#: templates/extras/configtemplate.html:32 +#: templates/extras/exporttemplate.html:51 +#: templates/generic/bulk_import.html:30 +#: templates/virtualization/virtualmachine/render_config.html:23 +msgid "Data File" +msgstr "Archivo de datos" + +#: extras/tables/tables.py:158 extras/tables/tables.py:379 +#: extras/tables/tables.py:407 +msgid "Synced" +msgstr "Sincronizado" + +#: extras/tables/tables.py:178 +msgid "Content Type" +msgstr "Tipo de contenido" + +#: extras/tables/tables.py:185 +msgid "Image" +msgstr "Imagen" + +#: extras/tables/tables.py:190 +msgid "Size (Bytes)" +msgstr "Tamaño (bytes)" + +#: extras/tables/tables.py:233 extras/tables/tables.py:326 +#: templates/extras/customfield.html:96 templates/extras/eventrule.html:32 +#: templates/users/objectpermission.html:68 users/tables.py:83 +msgid "Object Types" +msgstr "Tipos de objetos" + +#: extras/tables/tables.py:255 +msgid "SSL Validation" +msgstr "Validación SSL" + +#: extras/tables/tables.py:278 +msgid "Action Type" +msgstr "Tipo de acción" + +#: extras/tables/tables.py:296 +msgid "Job Start" +msgstr "Inicio del trabajo" + +#: extras/tables/tables.py:299 +msgid "Job End" +msgstr "Fin del trabajo" + +#: extras/tables/tables.py:436 templates/account/profile.html:20 +#: templates/users/user.html:22 +msgid "Full Name" +msgstr "Nombre completo" + +#: extras/tables/tables.py:453 templates/extras/objectchange.html:72 +msgid "Request ID" +msgstr "ID de solicitud" + +#: extras/tables/tables.py:490 +msgid "Comments (Short)" +msgstr "Comentarios (cortos)" + +#: extras/validators.py:13 +#, python-format +msgid "Ensure this value is equal to %(limit_value)s." +msgstr "Asegúrese de que este valor sea igual a %(limit_value)s." + +#: extras/validators.py:24 +#, python-format +msgid "Ensure this value does not equal %(limit_value)s." +msgstr "Asegúrese de que este valor no sea igual %(limit_value)s." + +#: extras/validators.py:35 +msgid "This field must be empty." +msgstr "Este campo debe estar vacío." + +#: extras/validators.py:50 +msgid "This field must not be empty." +msgstr "Este campo no debe estar vacío." + +#: extras/views.py:880 +msgid "Your dashboard has been reset." +msgstr "Tu panel de control se ha restablecido." + +#: ipam/api/field_serializers.py:17 +msgid "Enter a valid IPv4 or IPv6 address with optional mask." +msgstr "Introduzca una dirección IPv4 o IPv6 válida con máscara opcional." + +#: ipam/api/field_serializers.py:24 +#, python-brace-format +msgid "Invalid IP address format: {data}" +msgstr "Formato de dirección IP no válido: {data}" + +#: ipam/api/field_serializers.py:37 +msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." +msgstr "" +"Introduzca un prefijo y una máscara IPv4 o IPv6 válidos en notación CIDR." + +#: ipam/api/field_serializers.py:44 +#, python-brace-format +msgid "Invalid IP prefix format: {data}" +msgstr "Formato de prefijo IP no válido: {data}" + +#: ipam/choices.py:30 +msgid "Container" +msgstr "Contenedor" + +#: ipam/choices.py:72 +msgid "DHCP" +msgstr "DHCP" + +#: ipam/choices.py:73 +msgid "SLAAC" +msgstr "SLACO" + +#: ipam/choices.py:89 +msgid "Loopback" +msgstr "Bucle invertido" + +#: ipam/choices.py:90 tenancy/choices.py:18 +msgid "Secondary" +msgstr "Secundaria" + +#: ipam/choices.py:91 +msgid "Anycast" +msgstr "Anycast" + +#: ipam/choices.py:115 +msgid "Standard" +msgstr "Estándar" + +#: ipam/choices.py:120 +msgid "CheckPoint" +msgstr "Punto de control" + +#: ipam/choices.py:123 +msgid "Cisco" +msgstr "Cisco" + +#: ipam/choices.py:137 +msgid "Plaintext" +msgstr "Texto plano" + +#: ipam/filtersets.py:47 vpn/filtersets.py:276 +msgid "Import target" +msgstr "Objetivo de importación" + +#: ipam/filtersets.py:53 vpn/filtersets.py:282 +msgid "Import target (name)" +msgstr "Destino de importación (nombre)" + +#: ipam/filtersets.py:58 vpn/filtersets.py:287 +msgid "Export target" +msgstr "Objetivo de exportación" + +#: ipam/filtersets.py:64 vpn/filtersets.py:293 +msgid "Export target (name)" +msgstr "Destino de exportación (nombre)" + +#: ipam/filtersets.py:85 +msgid "Importing VRF" +msgstr "Importación de VRF" + +#: ipam/filtersets.py:91 +msgid "Import VRF (RD)" +msgstr "Importar VRF (RD)" + +#: ipam/filtersets.py:96 +msgid "Exporting VRF" +msgstr "Exportación de VRF" + +#: ipam/filtersets.py:102 +msgid "Export VRF (RD)" +msgstr "Exportar VRF (RD)" + +#: ipam/filtersets.py:132 ipam/filtersets.py:247 ipam/forms/model_forms.py:229 +#: ipam/tables/ip.py:211 templates/ipam/prefix.html:12 +msgid "Prefix" +msgstr "Prefijo" + +#: ipam/filtersets.py:136 ipam/filtersets.py:175 ipam/filtersets.py:198 +msgid "RIR (ID)" +msgstr "RIR (ID)" + +#: ipam/filtersets.py:142 ipam/filtersets.py:181 ipam/filtersets.py:204 +msgid "RIR (slug)" +msgstr "RIR (babosa)" + +#: ipam/filtersets.py:251 +msgid "Within prefix" +msgstr "Dentro del prefijo" + +#: ipam/filtersets.py:255 +msgid "Within and including prefix" +msgstr "Dentro del prefijo e incluído" + +#: ipam/filtersets.py:259 +msgid "Prefixes which contain this prefix or IP" +msgstr "Prefijos que contienen este prefijo o IP" + +#: ipam/filtersets.py:270 ipam/filtersets.py:538 ipam/forms/bulk_edit.py:326 +#: ipam/forms/filtersets.py:191 ipam/forms/filtersets.py:317 +msgid "Mask length" +msgstr "Longitud de la máscara" + +#: ipam/filtersets.py:339 vpn/filtersets.py:399 +msgid "VLAN (ID)" +msgstr "VLAN (ID)" + +#: ipam/filtersets.py:343 vpn/filtersets.py:394 +msgid "VLAN number (1-4094)" +msgstr "Número de VLAN (1-4094)" + +#: ipam/filtersets.py:437 ipam/filtersets.py:441 ipam/filtersets.py:533 +#: ipam/forms/model_forms.py:444 templates/tenancy/contact.html:54 +#: tenancy/forms/bulk_edit.py:112 +msgid "Address" +msgstr "Dirección" + +#: ipam/filtersets.py:445 +msgid "Ranges which contain this prefix or IP" +msgstr "Intervalos que contienen este prefijo o IP" + +#: ipam/filtersets.py:473 ipam/filtersets.py:529 +msgid "Parent prefix" +msgstr "Prefijo principal" + +#: ipam/filtersets.py:582 ipam/filtersets.py:812 ipam/filtersets.py:1031 +#: vpn/filtersets.py:357 +msgid "Virtual machine (name)" +msgstr "Máquina virtual (nombre)" + +#: ipam/filtersets.py:587 ipam/filtersets.py:817 ipam/filtersets.py:1025 +#: virtualization/filtersets.py:276 virtualization/filtersets.py:315 +#: vpn/filtersets.py:362 +msgid "Virtual machine (ID)" +msgstr "Máquina virtual (ID)" + +#: ipam/filtersets.py:593 vpn/filtersets.py:97 vpn/filtersets.py:368 +msgid "Interface (name)" +msgstr "Interfaz (nombre)" + +#: ipam/filtersets.py:598 vpn/filtersets.py:102 vpn/filtersets.py:373 +msgid "Interface (ID)" +msgstr "Interfaz (ID)" + +#: ipam/filtersets.py:604 vpn/filtersets.py:108 vpn/filtersets.py:379 +msgid "VM interface (name)" +msgstr "Interfaz VM (nombre)" + +#: ipam/filtersets.py:609 vpn/filtersets.py:113 +msgid "VM interface (ID)" +msgstr "Interfaz de máquina virtual (ID)" + +#: ipam/filtersets.py:614 +msgid "FHRP group (ID)" +msgstr "Grupo FHRP (ID)" + +#: ipam/filtersets.py:618 +msgid "Is assigned to an interface" +msgstr "Está asignado a una interfaz" + +#: ipam/filtersets.py:622 +msgid "Is assigned" +msgstr "Está asignado" + +#: ipam/filtersets.py:1036 +msgid "IP address (ID)" +msgstr "Dirección IP (ID)" + +#: ipam/filtersets.py:1042 ipam/models/ip.py:787 +msgid "IP address" +msgstr "dirección IP" + +#: ipam/filtersets.py:1068 +msgid "Primary IPv4 (ID)" +msgstr "IPv4 principal (ID)" + +#: ipam/filtersets.py:1073 +msgid "Primary IPv6 (ID)" +msgstr "IPv6 principal (ID)" + +#: ipam/forms/bulk_create.py:14 +msgid "Address pattern" +msgstr "Patrón de direcciones" + +#: ipam/forms/bulk_edit.py:85 +msgid "Is private" +msgstr "Es privado" + +#: ipam/forms/bulk_edit.py:106 ipam/forms/bulk_edit.py:135 +#: ipam/forms/bulk_edit.py:160 ipam/forms/bulk_import.py:88 +#: ipam/forms/bulk_import.py:108 ipam/forms/bulk_import.py:128 +#: ipam/forms/filtersets.py:109 ipam/forms/filtersets.py:124 +#: ipam/forms/filtersets.py:147 ipam/forms/model_forms.py:93 +#: ipam/forms/model_forms.py:108 ipam/forms/model_forms.py:130 +#: ipam/forms/model_forms.py:148 ipam/models/asns.py:31 +#: ipam/models/asns.py:103 ipam/models/ip.py:70 ipam/models/ip.py:89 +#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 +#: templates/ipam/aggregate.html:19 templates/ipam/asn.html:28 +#: templates/ipam/asnrange.html:20 templates/ipam/rir.html:20 +msgid "RIR" +msgstr "RIR" + +#: ipam/forms/bulk_edit.py:168 +msgid "Date added" +msgstr "Fecha añadida" + +#: ipam/forms/bulk_edit.py:229 +msgid "Prefix length" +msgstr "Longitud del prefijo" + +#: ipam/forms/bulk_edit.py:252 ipam/forms/filtersets.py:236 +#: templates/ipam/prefix.html:86 +msgid "Is a pool" +msgstr "Es una piscina" + +#: ipam/forms/bulk_edit.py:257 ipam/forms/bulk_edit.py:301 +#: ipam/models/ip.py:271 ipam/models/ip.py:538 +#, python-format +msgid "Treat as 100%% utilized" +msgstr "Tratar como utilizado al 100%%" + +#: ipam/forms/bulk_edit.py:349 ipam/models/ip.py:771 +msgid "DNS name" +msgstr "Nombre DNS" + +#: ipam/forms/bulk_edit.py:370 ipam/forms/bulk_edit.py:569 +#: ipam/forms/bulk_import.py:393 ipam/forms/bulk_import.py:477 +#: ipam/forms/bulk_import.py:503 ipam/forms/filtersets.py:376 +#: ipam/forms/filtersets.py:511 templates/ipam/fhrpgroup.html:23 +#: templates/ipam/inc/panels/fhrp_groups.html:11 +#: templates/ipam/service.html:35 templates/ipam/servicetemplate.html:20 +msgid "Protocol" +msgstr "Protocolo" + +#: ipam/forms/bulk_edit.py:377 ipam/forms/filtersets.py:383 +#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:27 +msgid "Group ID" +msgstr "ID de grupo" + +#: ipam/forms/bulk_edit.py:382 ipam/forms/filtersets.py:388 +#: wireless/forms/bulk_edit.py:67 wireless/forms/bulk_edit.py:114 +#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 +#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 +#: wireless/forms/filtersets.py:53 wireless/forms/filtersets.py:87 +msgid "Authentication type" +msgstr "Tipo de autenticación" + +#: ipam/forms/bulk_edit.py:387 ipam/forms/filtersets.py:392 +msgid "Authentication key" +msgstr "Clave de autenticación" + +#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:369 +#: ipam/forms/model_forms.py:455 netbox/navigation/menu.py:376 +#: templates/ipam/fhrpgroup.html:51 +#: templates/wireless/inc/authentication_attrs.html:5 +#: wireless/forms/bulk_edit.py:90 wireless/forms/bulk_edit.py:137 +#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: wireless/forms/model_forms.py:56 wireless/forms/model_forms.py:161 +msgid "Authentication" +msgstr "AUTENTICACIÓN" + +#: ipam/forms/bulk_edit.py:414 +msgid "Minimum child VLAN VID" +msgstr "VLAN (VID) secundaria mínima" + +#: ipam/forms/bulk_edit.py:420 +msgid "Maximum child VLAN VID" +msgstr "VLAN (VID) secundaria máxima" + +#: ipam/forms/bulk_edit.py:428 ipam/forms/model_forms.py:527 +msgid "Scope type" +msgstr "Tipo de ámbito" + +#: ipam/forms/bulk_edit.py:489 ipam/forms/model_forms.py:600 +#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:39 +msgid "Scope" +msgstr "Alcance" + +#: ipam/forms/bulk_edit.py:560 +msgid "Site & Group" +msgstr "Sitio y grupo" + +#: ipam/forms/bulk_edit.py:574 ipam/forms/model_forms.py:663 +#: ipam/forms/model_forms.py:697 ipam/tables/services.py:19 +#: ipam/tables/services.py:49 templates/ipam/service.html:39 +#: templates/ipam/servicetemplate.html:24 +msgid "Ports" +msgstr "Puertos" + +#: ipam/forms/bulk_import.py:47 +msgid "Import route targets" +msgstr "Importar destinos de ruta" + +#: ipam/forms/bulk_import.py:53 +msgid "Export route targets" +msgstr "Exportar destinos de ruta" + +#: ipam/forms/bulk_import.py:91 ipam/forms/bulk_import.py:111 +#: ipam/forms/bulk_import.py:131 +msgid "Assigned RIR" +msgstr "RIR asignado" + +#: ipam/forms/bulk_import.py:181 +msgid "VLAN's group (if any)" +msgstr "Grupo de VLAN (si lo hay)" + +#: ipam/forms/bulk_import.py:184 ipam/forms/model_forms.py:219 +#: ipam/models/vlans.py:214 ipam/tables/ip.py:254 +#: templates/ipam/prefix.html:61 templates/ipam/vlan.html:13 +#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 +#: templates/vpn/l2vpntermination_edit.html:17 +#: templates/wireless/wirelesslan.html:31 vpn/forms/bulk_import.py:299 +#: vpn/forms/filtersets.py:280 vpn/forms/model_forms.py:427 +#: wireless/forms/bulk_edit.py:54 wireless/forms/bulk_import.py:48 +#: wireless/forms/model_forms.py:49 wireless/models.py:101 +msgid "VLAN" +msgstr "VLAN" + +#: ipam/forms/bulk_import.py:307 +msgid "Parent device of assigned interface (if any)" +msgstr "Dispositivo principal de la interfaz asignada (si existe)" + +#: ipam/forms/bulk_import.py:310 ipam/forms/bulk_import.py:496 +#: ipam/forms/model_forms.py:691 virtualization/filtersets.py:282 +#: virtualization/filtersets.py:321 virtualization/forms/bulk_edit.py:199 +#: virtualization/forms/bulk_edit.py:325 +#: virtualization/forms/bulk_import.py:146 +#: virtualization/forms/bulk_import.py:207 +#: virtualization/forms/filtersets.py:204 +#: virtualization/forms/filtersets.py:240 +#: virtualization/forms/model_forms.py:291 vpn/forms/bulk_import.py:93 +#: vpn/forms/bulk_import.py:285 +msgid "Virtual machine" +msgstr "Máquina virtual" + +#: ipam/forms/bulk_import.py:314 +msgid "Parent VM of assigned interface (if any)" +msgstr "VM principal de la interfaz asignada (si existe)" + +#: ipam/forms/bulk_import.py:321 +msgid "Assigned interface" +msgstr "Interfaz asignada" + +#: ipam/forms/bulk_import.py:324 +msgid "Is primary" +msgstr "Es primaria" + +#: ipam/forms/bulk_import.py:325 +msgid "Make this the primary IP for the assigned device" +msgstr "Conviértase en la IP principal del dispositivo asignado" + +#: ipam/forms/bulk_import.py:364 +msgid "No device or virtual machine specified; cannot set as primary IP" +msgstr "" +"No se especificó ningún dispositivo o máquina virtual; no se puede " +"establecer como IP principal" + +#: ipam/forms/bulk_import.py:368 +msgid "No interface specified; cannot set as primary IP" +msgstr "" +"No se especificó ninguna interfaz; no se puede establecer como IP principal" + +#: ipam/forms/bulk_import.py:397 +msgid "Auth type" +msgstr "Tipo de autenticación" + +#: ipam/forms/bulk_import.py:412 +msgid "Scope type (app & model)" +msgstr "Tipo de ámbito (aplicación y modelo)" + +#: ipam/forms/bulk_import.py:418 +#, python-brace-format +msgid "Minimum child VLAN VID (default: {minimum})" +msgstr "VLAN (VID) secundaria mínima (predeterminado): {minimum})" + +#: ipam/forms/bulk_import.py:424 +#, python-brace-format +msgid "Maximum child VLAN VID (default: {maximum})" +msgstr "Número máximo de VID de VLAN secundaria (predeterminado: {maximum})" + +#: ipam/forms/bulk_import.py:448 +msgid "Assigned VLAN group" +msgstr "Grupo de VLAN asignado" + +#: ipam/forms/bulk_import.py:479 ipam/forms/bulk_import.py:505 +msgid "IP protocol" +msgstr "Protocolo IP" + +#: ipam/forms/bulk_import.py:493 +msgid "Required if not assigned to a VM" +msgstr "Obligatorio si no está asignado a una VM" + +#: ipam/forms/bulk_import.py:500 +msgid "Required if not assigned to a device" +msgstr "Obligatorio si no está asignado a un dispositivo" + +#: ipam/forms/bulk_import.py:525 +#, python-brace-format +msgid "{ip} is not assigned to this device/VM." +msgstr "{ip} no está asignado a este dispositivo/máquina virtual." + +#: ipam/forms/filtersets.py:46 ipam/forms/model_forms.py:60 +#: netbox/navigation/menu.py:177 vpn/forms/model_forms.py:403 +msgid "Route Targets" +msgstr "Objetivos de ruta" + +#: ipam/forms/filtersets.py:52 ipam/forms/model_forms.py:47 +#: vpn/forms/filtersets.py:221 vpn/forms/model_forms.py:390 +msgid "Import targets" +msgstr "Importar objetivos" + +#: ipam/forms/filtersets.py:57 ipam/forms/model_forms.py:52 +#: vpn/forms/filtersets.py:226 vpn/forms/model_forms.py:395 +msgid "Export targets" +msgstr "Objetivos de exportación" + +#: ipam/forms/filtersets.py:72 +msgid "Imported by VRF" +msgstr "Importado por VRF" + +#: ipam/forms/filtersets.py:77 +msgid "Exported by VRF" +msgstr "Exportado por VRF" + +#: ipam/forms/filtersets.py:86 ipam/tables/ip.py:89 templates/ipam/rir.html:33 +msgid "Private" +msgstr "Privada" + +#: ipam/forms/filtersets.py:104 ipam/forms/filtersets.py:186 +#: ipam/forms/filtersets.py:261 ipam/forms/filtersets.py:312 +msgid "Address family" +msgstr "Familia de direcciones" + +#: ipam/forms/filtersets.py:118 templates/ipam/asnrange.html:26 +msgid "Range" +msgstr "Alcance" + +#: ipam/forms/filtersets.py:127 +msgid "Start" +msgstr "Comenzar" + +#: ipam/forms/filtersets.py:131 +msgid "End" +msgstr "Fin" + +#: ipam/forms/filtersets.py:181 +msgid "Search within" +msgstr "Busca dentro" + +#: ipam/forms/filtersets.py:202 ipam/forms/filtersets.py:328 +msgid "Present in VRF" +msgstr "Presente en VRF" + +#: ipam/forms/filtersets.py:243 ipam/forms/filtersets.py:282 +#, python-format +msgid "Marked as 100% utilized" +msgstr "Marcado como 100% utilizado" + +#: ipam/forms/filtersets.py:297 +msgid "Device/VM" +msgstr "Dispositivo/VM" + +#: ipam/forms/filtersets.py:333 +msgid "Assigned Device" +msgstr "Dispositivo asignado" + +#: ipam/forms/filtersets.py:338 +msgid "Assigned VM" +msgstr "VM asignada" + +#: ipam/forms/filtersets.py:352 +msgid "Assigned to an interface" +msgstr "Asignado a una interfaz" + +#: ipam/forms/filtersets.py:359 templates/ipam/ipaddress.html:54 +msgid "DNS Name" +msgstr "Nombre DNS" + +#: ipam/forms/filtersets.py:401 ipam/forms/filtersets.py:494 +#: ipam/models/vlans.py:156 templates/ipam/vlan.html:34 +msgid "VLAN ID" +msgstr "IDENTIFICADOR DE VLAN" + +#: ipam/forms/filtersets.py:433 +msgid "Minimum VID" +msgstr "VID mínimo" + +#: ipam/forms/filtersets.py:439 +msgid "Maximum VID" +msgstr "VID máximo" + +#: ipam/forms/filtersets.py:516 +msgid "Port" +msgstr "Puerto" + +#: ipam/forms/filtersets.py:537 ipam/tables/vlans.py:191 +#: templates/ipam/ipaddress_edit.html:47 templates/ipam/service_create.html:22 +#: templates/ipam/service_edit.html:21 +#: templates/virtualization/virtualdisk.html:22 +#: templates/virtualization/virtualmachine.html:13 +#: templates/virtualization/vminterface.html:24 +#: templates/vpn/l2vpntermination_edit.html:27 +#: templates/vpn/tunneltermination.html:26 +#: virtualization/forms/filtersets.py:189 +#: virtualization/forms/filtersets.py:234 +#: virtualization/forms/model_forms.py:223 +#: virtualization/tables/virtualmachines.py:115 +#: virtualization/tables/virtualmachines.py:168 vpn/choices.py:45 +#: vpn/forms/filtersets.py:289 vpn/forms/model_forms.py:161 +#: vpn/forms/model_forms.py:172 vpn/forms/model_forms.py:269 +msgid "Virtual Machine" +msgstr "Máquina virtual" + +#: ipam/forms/model_forms.py:113 ipam/tables/ip.py:116 +#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:39 +msgid "Aggregate" +msgstr "Agregado" + +#: ipam/forms/model_forms.py:134 templates/ipam/asnrange.html:12 +msgid "ASN Range" +msgstr "Gama ASN" + +#: ipam/forms/model_forms.py:230 +msgid "Site/VLAN Assignment" +msgstr "Asignación de sitio/VLAN" + +#: ipam/forms/model_forms.py:256 templates/ipam/iprange.html:11 +msgid "IP Range" +msgstr "Rango de IP" + +#: ipam/forms/model_forms.py:285 ipam/forms/model_forms.py:454 +#: templates/ipam/fhrpgroup.html:19 templates/ipam/ipaddress_edit.html:52 +msgid "FHRP Group" +msgstr "Grupo FHRP" + +#: ipam/forms/model_forms.py:300 +msgid "Make this the primary IP for the device/VM" +msgstr "Haga que esta sea la IP principal del dispositivo/VM" + +#: ipam/forms/model_forms.py:351 +msgid "An IP address can only be assigned to a single object." +msgstr "Solo se puede asignar una dirección IP a un único objeto." + +#: ipam/forms/model_forms.py:357 ipam/models/ip.py:878 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"No se puede reasignar la dirección IP mientras esté designada como la IP " +"principal del objeto principal" + +#: ipam/forms/model_forms.py:367 +msgid "" +"Only IP addresses assigned to an interface can be designated as primary IPs." +msgstr "" +"Solo las direcciones IP asignadas a una interfaz se pueden designar como IP " +"principales." + +#: ipam/forms/model_forms.py:373 +#, python-brace-format +msgid "{ip} is a network ID, which may not be assigned to an interface." +msgstr "{ip} es un ID de red, que no puede asignarse a una interfaz." + +#: ipam/forms/model_forms.py:379 +#, python-brace-format +msgid "" +"{ip} is a broadcast address, which may not be assigned to an interface." +msgstr "" +"{ip} es una dirección de transmisión, que puede no estar asignada a una " +"interfaz." + +#: ipam/forms/model_forms.py:456 +msgid "Virtual IP Address" +msgstr "Dirección IP virtual" + +#: ipam/forms/model_forms.py:598 ipam/forms/model_forms.py:637 +#: ipam/tables/ip.py:250 templates/ipam/vlan_edit.html:37 +#: templates/ipam/vlangroup.html:27 +msgid "VLAN Group" +msgstr "Grupo VLAN" + +#: ipam/forms/model_forms.py:599 +msgid "Child VLANs" +msgstr "VLAN secundarias" + +#: ipam/forms/model_forms.py:668 ipam/forms/model_forms.py:702 +msgid "" +"Comma-separated list of one or more port numbers. A range may be specified " +"using a hyphen." +msgstr "" +"Lista separada por comas de uno o más números de puerto. Se puede " +"especificar un rango mediante un guión." + +#: ipam/forms/model_forms.py:673 templates/ipam/servicetemplate.html:12 +msgid "Service Template" +msgstr "Plantilla de servicio" + +#: ipam/forms/model_forms.py:724 +msgid "Service template" +msgstr "Plantilla de servicio" + +#: ipam/models/asns.py:34 +msgid "start" +msgstr "comienzo" + +#: ipam/models/asns.py:51 +msgid "ASN range" +msgstr "Gama ASN" + +#: ipam/models/asns.py:52 +msgid "ASN ranges" +msgstr "Gamas de ASN" + +#: ipam/models/asns.py:72 +#, python-brace-format +msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." +msgstr "Iniciar ASN ({start}) debe ser inferior al ASN final ({end})." + +#: ipam/models/asns.py:104 +msgid "Regional Internet Registry responsible for this AS number space" +msgstr "Registro regional de Internet responsable de este espacio numérico AS" + +#: ipam/models/asns.py:109 +msgid "16- or 32-bit autonomous system number" +msgstr "Número de sistema autónomo de 16 o 32 bits" + +#: ipam/models/fhrp.py:22 +msgid "group ID" +msgstr "ID de grupo" + +#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +msgid "protocol" +msgstr "protocolo" + +#: ipam/models/fhrp.py:38 wireless/models.py:27 +msgid "authentication type" +msgstr "tipo de autenticación" + +#: ipam/models/fhrp.py:43 +msgid "authentication key" +msgstr "clave de autenticación" + +#: ipam/models/fhrp.py:56 +msgid "FHRP group" +msgstr "Grupo FHRP" + +#: ipam/models/fhrp.py:57 +msgid "FHRP groups" +msgstr "Grupos FHRP" + +#: ipam/models/fhrp.py:93 tenancy/models/contacts.py:134 +msgid "priority" +msgstr "prioridad" + +#: ipam/models/fhrp.py:113 +msgid "FHRP group assignment" +msgstr "Asignación grupal de FHRP" + +#: ipam/models/fhrp.py:114 +msgid "FHRP group assignments" +msgstr "Tareas grupales de FHRP" + +#: ipam/models/ip.py:64 +msgid "private" +msgstr "privado" + +#: ipam/models/ip.py:65 +msgid "IP space managed by this RIR is considered private" +msgstr "El espacio IP administrado por este RIR se considera privado" + +#: ipam/models/ip.py:71 netbox/navigation/menu.py:170 +msgid "RIRs" +msgstr "RIR" + +#: ipam/models/ip.py:83 +msgid "IPv4 or IPv6 network" +msgstr "Red IPv4 o IPv6" + +#: ipam/models/ip.py:90 +msgid "Regional Internet Registry responsible for this IP space" +msgstr "Registro regional de Internet responsable de este espacio IP" + +#: ipam/models/ip.py:100 +msgid "date added" +msgstr "fecha añadida" + +#: ipam/models/ip.py:114 +msgid "aggregate" +msgstr "agregado" + +#: ipam/models/ip.py:115 +msgid "aggregates" +msgstr "agregados" + +#: ipam/models/ip.py:131 +msgid "Cannot create aggregate with /0 mask." +msgstr "No se puede crear un agregado con la máscara /0." + +#: ipam/models/ip.py:143 +#, python-brace-format +msgid "" +"Aggregates cannot overlap. {prefix} is already covered by an existing " +"aggregate ({aggregate})." +msgstr "" +"Los agregados no pueden superponerse. {prefix} ya está cubierto por un " +"agregado existente ({aggregate})." + +#: ipam/models/ip.py:157 +#, python-brace-format +msgid "" +"Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " +"({aggregate})." +msgstr "" +"Los prefijos no pueden superponerse a los agregados. {prefix} cubre un " +"agregado existente ({aggregate})." + +#: ipam/models/ip.py:199 ipam/models/ip.py:736 vpn/models/tunnels.py:114 +msgid "role" +msgstr "papel" + +#: ipam/models/ip.py:200 +msgid "roles" +msgstr "papeles" + +#: ipam/models/ip.py:216 ipam/models/ip.py:292 +msgid "prefix" +msgstr "prefijo" + +#: ipam/models/ip.py:217 +msgid "IPv4 or IPv6 network with mask" +msgstr "Red IPv4 o IPv6 con máscara" + +#: ipam/models/ip.py:253 +msgid "Operational status of this prefix" +msgstr "Estado operativo de este prefijo" + +#: ipam/models/ip.py:261 +msgid "The primary function of this prefix" +msgstr "La función principal de este prefijo" + +#: ipam/models/ip.py:264 +msgid "is a pool" +msgstr "es una piscina" + +#: ipam/models/ip.py:266 +msgid "All IP addresses within this prefix are considered usable" +msgstr "" +"Todas las direcciones IP incluidas en este prefijo se consideran " +"utilizables." + +#: ipam/models/ip.py:269 ipam/models/ip.py:536 +msgid "mark utilized" +msgstr "marca utilizada" + +#: ipam/models/ip.py:293 +msgid "prefixes" +msgstr "prefijos" + +#: ipam/models/ip.py:316 +msgid "Cannot create prefix with /0 mask." +msgstr "No se puede crear un prefijo con la máscara /0." + +#: ipam/models/ip.py:323 ipam/models/ip.py:854 +#, python-brace-format +msgid "VRF {vrf}" +msgstr "VRF {vrf}" + +#: ipam/models/ip.py:323 ipam/models/ip.py:854 +msgid "global table" +msgstr "tabla global" + +#: ipam/models/ip.py:325 +#, python-brace-format +msgid "Duplicate prefix found in {table}: {prefix}" +msgstr "Se encuentra un prefijo duplicado en {table}: {prefix}" + +#: ipam/models/ip.py:494 +msgid "start address" +msgstr "dirección de inicio" + +#: ipam/models/ip.py:495 ipam/models/ip.py:499 ipam/models/ip.py:711 +msgid "IPv4 or IPv6 address (with mask)" +msgstr "Dirección IPv4 o IPv6 (con máscara)" + +#: ipam/models/ip.py:498 +msgid "end address" +msgstr "dirección final" + +#: ipam/models/ip.py:525 +msgid "Operational status of this range" +msgstr "Estado operativo de esta gama" + +#: ipam/models/ip.py:533 +msgid "The primary function of this range" +msgstr "La función principal de esta gama" + +#: ipam/models/ip.py:547 +msgid "IP range" +msgstr "Rango IP" + +#: ipam/models/ip.py:548 +msgid "IP ranges" +msgstr "Intervalos de IP" + +#: ipam/models/ip.py:564 +msgid "Starting and ending IP address versions must match" +msgstr "Las versiones de la dirección IP inicial y final deben coincidir" + +#: ipam/models/ip.py:570 +msgid "Starting and ending IP address masks must match" +msgstr "Las máscaras de direcciones IP iniciales y finales deben coincidir" + +#: ipam/models/ip.py:577 +#, python-brace-format +msgid "" +"Ending address must be lower than the starting address ({start_address})" +msgstr "" +"La dirección final debe ser inferior a la dirección inicial " +"({start_address})" + +#: ipam/models/ip.py:589 +#, python-brace-format +msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" +msgstr "" +"Las direcciones definidas se superponen con el rango {overlapping_range} en " +"VRF {vrf}" + +#: ipam/models/ip.py:598 +#, python-brace-format +msgid "Defined range exceeds maximum supported size ({max_size})" +msgstr "El rango definido supera el tamaño máximo admitido ({max_size})" + +#: ipam/models/ip.py:710 tenancy/models/contacts.py:82 +msgid "address" +msgstr "dirección" + +#: ipam/models/ip.py:733 +msgid "The operational status of this IP" +msgstr "El estado operativo de esta IP" + +#: ipam/models/ip.py:740 +msgid "The functional role of this IP" +msgstr "La función funcional de esta propiedad intelectual" + +#: ipam/models/ip.py:764 templates/ipam/ipaddress.html:75 +msgid "NAT (inside)" +msgstr "NAT (interior)" + +#: ipam/models/ip.py:765 +msgid "The IP for which this address is the \"outside\" IP" +msgstr "La IP para la que esta dirección es la IP «externa»" + +#: ipam/models/ip.py:772 +msgid "Hostname or FQDN (not case-sensitive)" +msgstr "Nombre de host o FQDN (no distingue mayúsculas de minúsculas)" + +#: ipam/models/ip.py:788 ipam/models/services.py:94 +msgid "IP addresses" +msgstr "direcciones IP" + +#: ipam/models/ip.py:844 +msgid "Cannot create IP address with /0 mask." +msgstr "No se puede crear una dirección IP con la máscara /0." + +#: ipam/models/ip.py:856 +#, python-brace-format +msgid "Duplicate IP address found in {table}: {ipaddress}" +msgstr "Se encontró una dirección IP duplicada en {table}: {ipaddress}" + +#: ipam/models/ip.py:885 +msgid "Only IPv6 addresses can be assigned SLAAC status" +msgstr "Solo a las direcciones IPv6 se les puede asignar el estado SLAAC" + +#: ipam/models/services.py:33 +msgid "port numbers" +msgstr "números de puerto" + +#: ipam/models/services.py:59 +msgid "service template" +msgstr "plantilla de servicio" + +#: ipam/models/services.py:60 +msgid "service templates" +msgstr "plantillas de servicio" + +#: ipam/models/services.py:95 +msgid "The specific IP addresses (if any) to which this service is bound" +msgstr "" +"Las direcciones IP específicas (si las hay) a las que está vinculado este " +"servicio" + +#: ipam/models/services.py:102 +msgid "service" +msgstr "servicio" + +#: ipam/models/services.py:103 +msgid "services" +msgstr "servicios" + +#: ipam/models/services.py:117 +msgid "" +"A service cannot be associated with both a device and a virtual machine." +msgstr "" +"No se puede asociar un servicio tanto a un dispositivo como a una máquina " +"virtual." + +#: ipam/models/services.py:119 +msgid "" +"A service must be associated with either a device or a virtual machine." +msgstr "" +"Un servicio debe estar asociado a un dispositivo o a una máquina virtual." + +#: ipam/models/vlans.py:49 +msgid "minimum VLAN ID" +msgstr "ID de VLAN mínimo" + +#: ipam/models/vlans.py:55 +msgid "Lowest permissible ID of a child VLAN" +msgstr "El ID más bajo permitido de una VLAN secundaria" + +#: ipam/models/vlans.py:58 +msgid "maximum VLAN ID" +msgstr "ID de VLAN máximo" + +#: ipam/models/vlans.py:64 +msgid "Highest permissible ID of a child VLAN" +msgstr "El ID más alto permitido de una VLAN secundaria" + +#: ipam/models/vlans.py:85 +msgid "VLAN groups" +msgstr "Grupos de VLAN" + +#: ipam/models/vlans.py:95 +msgid "Cannot set scope_type without scope_id." +msgstr "No se puede establecer scope_type sin scope_id." + +#: ipam/models/vlans.py:97 +msgid "Cannot set scope_id without scope_type." +msgstr "No se puede establecer scope_id sin scope_type." + +#: ipam/models/vlans.py:102 +msgid "Maximum child VID must be greater than or equal to minimum child VID" +msgstr "" +"El número máximo de VID para niños debe ser mayor o igual al número mínimo " +"de VID para niños" + +#: ipam/models/vlans.py:145 +msgid "The specific site to which this VLAN is assigned (if any)" +msgstr "El sitio específico al que está asignada esta VLAN (si existe)" + +#: ipam/models/vlans.py:153 +msgid "VLAN group (optional)" +msgstr "Grupo de VLAN (opcional)" + +#: ipam/models/vlans.py:161 +msgid "Numeric VLAN ID (1-4094)" +msgstr "ID de VLAN numérico (1-4094)" + +#: ipam/models/vlans.py:179 +msgid "Operational status of this VLAN" +msgstr "Estado operativo de esta VLAN" + +#: ipam/models/vlans.py:187 +msgid "The primary function of this VLAN" +msgstr "La función principal de esta VLAN" + +#: ipam/models/vlans.py:215 ipam/tables/ip.py:175 ipam/tables/vlans.py:78 +#: ipam/views.py:940 netbox/navigation/menu.py:181 +#: netbox/navigation/menu.py:183 +msgid "VLANs" +msgstr "VLAN" + +#: ipam/models/vlans.py:230 +#, python-brace-format +msgid "" +"VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " +"site {site}." +msgstr "" +"La VLAN está asignada al grupo {group} (alcance: {scope}); no se puede " +"asignar también al sitio {site}." + +#: ipam/models/vlans.py:238 +#, python-brace-format +msgid "VID must be between {minimum} and {maximum} for VLANs in group {group}" +msgstr "" +"El VID debe estar entre {minimum} y {maximum} para las VLAN del grupo " +"{group}" + +#: ipam/models/vrfs.py:30 +msgid "route distinguisher" +msgstr "distinguidor de rutas" + +#: ipam/models/vrfs.py:31 +msgid "Unique route distinguisher (as defined in RFC 4364)" +msgstr "Distintor de ruta único (tal como se define en el RFC 4364)" + +#: ipam/models/vrfs.py:42 +msgid "enforce unique space" +msgstr "reforzar un espacio único" + +#: ipam/models/vrfs.py:43 +msgid "Prevent duplicate prefixes/IP addresses within this VRF" +msgstr "Evite la duplicación de prefijos/direcciones IP en este VRF" + +#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:174 +#: netbox/navigation/menu.py:176 +msgid "VRFs" +msgstr "VRFs" + +#: ipam/models/vrfs.py:82 +msgid "Route target value (formatted in accordance with RFC 4360)" +msgstr "Valor objetivo de ruta (formateado de acuerdo con el RFC 4360)" + +#: ipam/models/vrfs.py:94 +msgid "route target" +msgstr "destino de ruta" + +#: ipam/models/vrfs.py:95 +msgid "route targets" +msgstr "objetivos de ruta" + +#: ipam/tables/asn.py:52 +msgid "ASDOT" +msgstr "COMO PUNTO" + +#: ipam/tables/asn.py:57 +msgid "Site Count" +msgstr "Recuento de sitios" + +#: ipam/tables/asn.py:62 +msgid "Provider Count" +msgstr "Recuento de proveedores" + +#: ipam/tables/ip.py:94 netbox/navigation/menu.py:167 +#: netbox/navigation/menu.py:169 +msgid "Aggregates" +msgstr "Agregados" + +#: ipam/tables/ip.py:124 +msgid "Added" +msgstr "Añadido" + +#: ipam/tables/ip.py:127 ipam/tables/ip.py:165 ipam/tables/vlans.py:138 +#: ipam/views.py:349 netbox/navigation/menu.py:153 +#: netbox/navigation/menu.py:155 templates/ipam/vlan.html:87 +msgid "Prefixes" +msgstr "Prefijos" + +#: ipam/tables/ip.py:130 ipam/tables/ip.py:267 ipam/tables/ip.py:320 +#: ipam/tables/vlans.py:82 templates/dcim/device.html:263 +#: templates/ipam/aggregate.html:25 templates/ipam/iprange.html:32 +#: templates/ipam/prefix.html:100 +msgid "Utilization" +msgstr "Utilización" + +#: ipam/tables/ip.py:170 netbox/navigation/menu.py:149 +msgid "IP Ranges" +msgstr "Intervalos de IP" + +#: ipam/tables/ip.py:220 +msgid "Prefix (Flat)" +msgstr "Prefijo (plano)" + +#: ipam/tables/ip.py:224 templates/dcim/rack_edit.html:52 +msgid "Depth" +msgstr "Profundidad" + +#: ipam/tables/ip.py:261 +msgid "Pool" +msgstr "Piscina" + +#: ipam/tables/ip.py:264 ipam/tables/ip.py:317 +msgid "Marked Utilized" +msgstr "Marcado como utilizado" + +#: ipam/tables/ip.py:301 +msgid "Start address" +msgstr "Dirección de inicio" + +#: ipam/tables/ip.py:379 +msgid "NAT (Inside)" +msgstr "NAT (interior)" + +#: ipam/tables/ip.py:384 +msgid "NAT (Outside)" +msgstr "NAT (exterior)" + +#: ipam/tables/ip.py:389 +msgid "Assigned" +msgstr "Asignado" + +#: ipam/tables/ip.py:424 templates/vpn/l2vpntermination.html:19 +#: vpn/forms/filtersets.py:235 +msgid "Assigned Object" +msgstr "Objeto asignado" + +#: ipam/tables/vlans.py:68 +msgid "Scope Type" +msgstr "Tipo de ámbito" + +#: ipam/tables/vlans.py:107 ipam/tables/vlans.py:210 +#: templates/dcim/inc/interface_vlans_table.html:4 +msgid "VID" +msgstr "VÍDEO" + +#: ipam/tables/vrfs.py:30 +msgid "RD" +msgstr "ROJO" + +#: ipam/tables/vrfs.py:33 +msgid "Unique" +msgstr "Único" + +#: ipam/tables/vrfs.py:36 vpn/tables/l2vpn.py:27 +msgid "Import Targets" +msgstr "Objetivos de importación" + +#: ipam/tables/vrfs.py:41 vpn/tables/l2vpn.py:32 +msgid "Export Targets" +msgstr "Objetivos de exportación" + +#: ipam/views.py:536 +msgid "Child Prefixes" +msgstr "Prefijos infantiles" + +#: ipam/views.py:571 +msgid "Child Ranges" +msgstr "Rangos infantiles" + +#: ipam/views.py:868 +msgid "Related IPs" +msgstr "IPs relacionadas" + +#: ipam/views.py:1091 +msgid "Device Interfaces" +msgstr "Interfaces de dispositivos" + +#: ipam/views.py:1109 +msgid "VM Interfaces" +msgstr "Interfaces de VM" + +#: netbox/config/parameters.py:22 templates/core/configrevision.html:111 +msgid "Login banner" +msgstr "banner de inicio de sesión" + +#: netbox/config/parameters.py:24 +msgid "Additional content to display on the login page" +msgstr "Contenido adicional para mostrar en la página de inicio de sesión" + +#: netbox/config/parameters.py:33 templates/core/configrevision.html:115 +msgid "Maintenance banner" +msgstr "Banner de mantenimiento" + +#: netbox/config/parameters.py:35 +msgid "Additional content to display when in maintenance mode" +msgstr "Contenido adicional para mostrar en modo de mantenimiento" + +#: netbox/config/parameters.py:44 templates/core/configrevision.html:119 +msgid "Top banner" +msgstr "Banner superior" + +#: netbox/config/parameters.py:46 +msgid "Additional content to display at the top of every page" +msgstr "Contenido adicional para mostrar en la parte superior de cada página" + +#: netbox/config/parameters.py:55 templates/core/configrevision.html:123 +msgid "Bottom banner" +msgstr "Banner inferior" + +#: netbox/config/parameters.py:57 +msgid "Additional content to display at the bottom of every page" +msgstr "Contenido adicional para mostrar en la parte inferior de cada página" + +#: netbox/config/parameters.py:68 +msgid "Globally unique IP space" +msgstr "Espacio IP único a nivel mundial" + +#: netbox/config/parameters.py:70 +msgid "Enforce unique IP addressing within the global table" +msgstr "Imponga un direccionamiento IP único dentro de la tabla global" + +#: netbox/config/parameters.py:75 templates/core/configrevision.html:87 +msgid "Prefer IPv4" +msgstr "Prefiero IPv4" + +#: netbox/config/parameters.py:77 +msgid "Prefer IPv4 addresses over IPv6" +msgstr "Prefiere las direcciones IPv4 en lugar de IPv6" + +#: netbox/config/parameters.py:84 +msgid "Rack unit height" +msgstr "Altura de la unidad de estantería" + +#: netbox/config/parameters.py:86 +msgid "Default unit height for rendered rack elevations" +msgstr "" +"Altura unitaria predeterminada para elevaciones de estanterías renderizadas" + +#: netbox/config/parameters.py:91 +msgid "Rack unit width" +msgstr "Ancho de la unidad de bastidor" + +#: netbox/config/parameters.py:93 +msgid "Default unit width for rendered rack elevations" +msgstr "" +"Ancho de unidad predeterminado para las elevaciones de estanterías " +"renderizadas" + +#: netbox/config/parameters.py:100 +msgid "Powerfeed voltage" +msgstr "Tensión de alimentación" + +#: netbox/config/parameters.py:102 +msgid "Default voltage for powerfeeds" +msgstr "Tensión predeterminada para las alimentaciones" + +#: netbox/config/parameters.py:107 +msgid "Powerfeed amperage" +msgstr "Amperaje de alimentación" + +#: netbox/config/parameters.py:109 +msgid "Default amperage for powerfeeds" +msgstr "Amperaje predeterminado para las alimentaciones" + +#: netbox/config/parameters.py:114 +msgid "Powerfeed max utilization" +msgstr "Utilización máxima de Powerfeed" + +#: netbox/config/parameters.py:116 +msgid "Default max utilization for powerfeeds" +msgstr "Utilización máxima predeterminada de las fuentes de alimentación" + +#: netbox/config/parameters.py:123 templates/core/configrevision.html:99 +msgid "Allowed URL schemes" +msgstr "Esquemas de URL permitidos" + +#: netbox/config/parameters.py:128 +msgid "Permitted schemes for URLs in user-provided content" +msgstr "" +"Esquemas permitidos para las URL en el contenido proporcionado por el " +"usuario" + +#: netbox/config/parameters.py:136 +msgid "Default page size" +msgstr "Tamaño de página predeterminado" + +#: netbox/config/parameters.py:142 +msgid "Maximum page size" +msgstr "Tamaño máximo de página" + +#: netbox/config/parameters.py:150 templates/core/configrevision.html:151 +msgid "Custom validators" +msgstr "Validadores personalizados" + +#: netbox/config/parameters.py:152 +msgid "Custom validation rules (JSON)" +msgstr "Reglas de validación personalizadas (JSON)" + +#: netbox/config/parameters.py:160 templates/core/configrevision.html:161 +msgid "Protection rules" +msgstr "Normas de protección" + +#: netbox/config/parameters.py:162 +msgid "Deletion protection rules (JSON)" +msgstr "Reglas de protección contra eliminaciones (JSON)" + +#: netbox/config/parameters.py:172 +msgid "Default preferences" +msgstr "Preferencias predeterminadas" + +#: netbox/config/parameters.py:174 +msgid "Default preferences for new users" +msgstr "Preferencias predeterminadas para usuarios nuevos" + +#: netbox/config/parameters.py:181 templates/core/configrevision.html:197 +msgid "Maintenance mode" +msgstr "Modo de mantenimiento" + +#: netbox/config/parameters.py:183 +msgid "Enable maintenance mode" +msgstr "Habilitar el modo de mantenimiento" + +#: netbox/config/parameters.py:188 templates/core/configrevision.html:201 +msgid "GraphQL enabled" +msgstr "GraphQL habilitado" + +#: netbox/config/parameters.py:190 +msgid "Enable the GraphQL API" +msgstr "Habilita la API de GraphQL" + +#: netbox/config/parameters.py:195 templates/core/configrevision.html:205 +msgid "Changelog retention" +msgstr "Retención del registro de cambios" + +#: netbox/config/parameters.py:197 +msgid "Days to retain changelog history (set to zero for unlimited)" +msgstr "" +"Días para conservar el historial de cambios (se establece en cero de forma " +"ilimitada)" + +#: netbox/config/parameters.py:202 +msgid "Job result retention" +msgstr "Retención de resultados laborales" + +#: netbox/config/parameters.py:204 +msgid "Days to retain job result history (set to zero for unlimited)" +msgstr "" +"Días para conservar el historial de resultados del trabajo (establecido en " +"cero para un número ilimitado)" + +#: netbox/config/parameters.py:209 templates/core/configrevision.html:213 +msgid "Maps URL" +msgstr "URL de mapas" + +#: netbox/config/parameters.py:211 +msgid "Base URL for mapping geographic locations" +msgstr "URL base para mapear ubicaciones geográficas" + +#: netbox/forms/__init__.py:13 +msgid "Partial match" +msgstr "Coincidencia parcial" + +#: netbox/forms/__init__.py:14 +msgid "Exact match" +msgstr "Coincidencia exacta" + +#: netbox/forms/__init__.py:15 +msgid "Starts with" +msgstr "Empieza con" + +#: netbox/forms/__init__.py:16 +msgid "Ends with" +msgstr "Termina con" + +#: netbox/forms/__init__.py:17 +msgid "Regex" +msgstr "Regex" + +#: netbox/forms/__init__.py:35 +msgid "Object type(s)" +msgstr "Tipo(s) de objeto(s)" + +#: netbox/forms/base.py:66 +msgid "Id" +msgstr "ID" + +#: netbox/forms/base.py:105 +msgid "Add tags" +msgstr "Añadir etiquetas" + +#: netbox/forms/base.py:110 +msgid "Remove tags" +msgstr "Eliminar etiquetas" + +#: netbox/models/features.py:434 +msgid "Remote data source" +msgstr "Fuente de datos remota" + +#: netbox/models/features.py:444 +msgid "data path" +msgstr "ruta de datos" + +#: netbox/models/features.py:448 +msgid "Path to remote file (relative to data source root)" +msgstr "Ruta al archivo remoto (relativa a la raíz de la fuente de datos)" + +#: netbox/models/features.py:451 +msgid "auto sync enabled" +msgstr "sincronización automática habilitada" + +#: netbox/models/features.py:453 +msgid "Enable automatic synchronization of data when the data file is updated" +msgstr "" +"Habilitar la sincronización automática de datos cuando se actualiza el " +"archivo de datos" + +#: netbox/models/features.py:456 +msgid "date synced" +msgstr "fecha sincronizada" + +#: netbox/navigation/menu.py:12 +msgid "Organization" +msgstr "Organización" + +#: netbox/navigation/menu.py:20 +msgid "Site Groups" +msgstr "Grupos de sitios" + +#: netbox/navigation/menu.py:28 +msgid "Rack Roles" +msgstr "Roles de bastidor" + +#: netbox/navigation/menu.py:32 +msgid "Elevations" +msgstr "Elevaciones" + +#: netbox/navigation/menu.py:41 +msgid "Tenant Groups" +msgstr "Grupos de inquilinos" + +#: netbox/navigation/menu.py:48 +msgid "Contact Groups" +msgstr "Grupos de contactos" + +#: netbox/navigation/menu.py:49 templates/tenancy/contactrole.html:8 +msgid "Contact Roles" +msgstr "Funciones de contacto" + +#: netbox/navigation/menu.py:50 +msgid "Contact Assignments" +msgstr "Asignaciones de contactos" + +#: netbox/navigation/menu.py:64 +msgid "Modules" +msgstr "Módulos" + +#: netbox/navigation/menu.py:65 templates/dcim/devicerole.html:8 +msgid "Device Roles" +msgstr "Funciones del dispositivo" + +#: netbox/navigation/menu.py:68 templates/dcim/device.html:162 +#: templates/dcim/virtualdevicecontext.html:8 +msgid "Virtual Device Contexts" +msgstr "Contextos de dispositivos virtuales" + +#: netbox/navigation/menu.py:76 +msgid "Manufacturers" +msgstr "fabricantes" + +#: netbox/navigation/menu.py:80 +msgid "Device Components" +msgstr "Componentes del dispositivo" + +#: netbox/navigation/menu.py:92 templates/dcim/inventoryitemrole.html:8 +msgid "Inventory Item Roles" +msgstr "Funciones de los artículos de inventario" + +#: netbox/navigation/menu.py:99 netbox/navigation/menu.py:103 +msgid "Connections" +msgstr "Conexiones" + +#: netbox/navigation/menu.py:105 +msgid "Cables" +msgstr "Cables" + +#: netbox/navigation/menu.py:106 +msgid "Wireless Links" +msgstr "Vínculos inalámbricos" + +#: netbox/navigation/menu.py:109 +msgid "Interface Connections" +msgstr "Conexiones de interfaz" + +#: netbox/navigation/menu.py:114 +msgid "Console Connections" +msgstr "Conexiones de consola" + +#: netbox/navigation/menu.py:119 +msgid "Power Connections" +msgstr "Conexiones de alimentación" + +#: netbox/navigation/menu.py:135 +msgid "Wireless LAN Groups" +msgstr "Grupos de LAN inalámbrica" + +#: netbox/navigation/menu.py:156 +msgid "Prefix & VLAN Roles" +msgstr "Funciones de prefijo y VLAN" + +#: netbox/navigation/menu.py:162 +msgid "ASN Ranges" +msgstr "Rangos de ASN" + +#: netbox/navigation/menu.py:184 +msgid "VLAN Groups" +msgstr "Grupos de VLAN" + +#: netbox/navigation/menu.py:191 +msgid "Service Templates" +msgstr "Plantillas de servicio" + +#: netbox/navigation/menu.py:192 templates/dcim/device.html:304 +#: templates/ipam/ipaddress.html:122 +#: templates/virtualization/virtualmachine.html:157 +msgid "Services" +msgstr "Servicios" + +#: netbox/navigation/menu.py:199 +msgid "VPN" +msgstr "VPN" + +#: netbox/navigation/menu.py:203 netbox/navigation/menu.py:205 +#: vpn/tables/tunnels.py:24 +msgid "Tunnels" +msgstr "Túneles" + +#: netbox/navigation/menu.py:206 templates/vpn/tunnelgroup.html:8 +msgid "Tunnel Groups" +msgstr "Grupos de túneles" + +#: netbox/navigation/menu.py:207 +msgid "Tunnel Terminations" +msgstr "Terminaciones de túneles" + +#: netbox/navigation/menu.py:211 netbox/navigation/menu.py:213 +#: vpn/models/l2vpn.py:64 +msgid "L2VPNs" +msgstr "VPNs L2" + +#: netbox/navigation/menu.py:214 templates/vpn/l2vpn.html:57 +#: templates/vpn/tunnel.html:73 vpn/tables/tunnels.py:54 +msgid "Terminations" +msgstr "Terminaciones" + +#: netbox/navigation/menu.py:220 +msgid "IKE Proposals" +msgstr "Propuestas IKE" + +#: netbox/navigation/menu.py:221 templates/vpn/ikeproposal.html:42 +msgid "IKE Policies" +msgstr "Políticas de IKE" + +#: netbox/navigation/menu.py:222 +msgid "IPSec Proposals" +msgstr "Propuestas de IPSec" + +#: netbox/navigation/menu.py:223 templates/vpn/ipsecproposal.html:38 +msgid "IPSec Policies" +msgstr "Políticas IPSec" + +#: netbox/navigation/menu.py:224 templates/vpn/ikepolicy.html:39 +#: templates/vpn/ipsecpolicy.html:26 +msgid "IPSec Profiles" +msgstr "Perfiles IPSec" + +#: netbox/navigation/menu.py:231 templates/dcim/device_edit.html:78 +msgid "Virtualization" +msgstr "Virtualización" + +#: netbox/navigation/menu.py:235 netbox/navigation/menu.py:237 +#: virtualization/views.py:186 +msgid "Virtual Machines" +msgstr "Máquinas virtuales" + +#: netbox/navigation/menu.py:239 +#: templates/virtualization/virtualmachine.html:177 +#: templates/virtualization/virtualmachine/base.html:32 +#: templates/virtualization/virtualmachine_list.html:21 +#: virtualization/tables/virtualmachines.py:90 virtualization/views.py:389 +msgid "Virtual Disks" +msgstr "Discos virtuales" + +#: netbox/navigation/menu.py:246 +msgid "Cluster Types" +msgstr "Tipos de clústeres" + +#: netbox/navigation/menu.py:247 +msgid "Cluster Groups" +msgstr "Grupos de clústeres" + +#: netbox/navigation/menu.py:261 +msgid "Circuit Types" +msgstr "Tipos de circuitos" + +#: netbox/navigation/menu.py:265 netbox/navigation/menu.py:267 +msgid "Providers" +msgstr "Proveedores" + +#: netbox/navigation/menu.py:268 templates/circuits/provider.html:53 +msgid "Provider Accounts" +msgstr "Cuentas de proveedores" + +#: netbox/navigation/menu.py:269 +msgid "Provider Networks" +msgstr "Redes de proveedores" + +#: netbox/navigation/menu.py:283 +msgid "Power Panels" +msgstr "Paneles de alimentación" + +#: netbox/navigation/menu.py:294 +msgid "Configurations" +msgstr "Configuraciones" + +#: netbox/navigation/menu.py:296 +msgid "Config Contexts" +msgstr "Contextos de configuración" + +#: netbox/navigation/menu.py:297 +msgid "Config Templates" +msgstr "Plantillas de configuración" + +#: netbox/navigation/menu.py:304 netbox/navigation/menu.py:308 +msgid "Customization" +msgstr "Personalización" + +#: netbox/navigation/menu.py:310 +#: templates/circuits/circuittermination_edit.html:53 +#: templates/dcim/cable_edit.html:77 templates/dcim/device_edit.html:103 +#: templates/dcim/inventoryitem_edit.html:102 templates/dcim/rack_edit.html:81 +#: templates/dcim/virtualchassis_add.html:31 +#: templates/dcim/virtualchassis_edit.html:41 +#: templates/generic/bulk_edit.html:92 templates/htmx/form.html:32 +#: templates/inc/panels/custom_fields.html:7 +#: templates/ipam/ipaddress_bulk_add.html:35 +#: templates/ipam/ipaddress_edit.html:88 templates/ipam/service_create.html:75 +#: templates/ipam/service_edit.html:62 templates/ipam/vlan_edit.html:63 +#: templates/tenancy/contactassignment_edit.html:31 +#: templates/vpn/l2vpntermination_edit.html:51 +msgid "Custom Fields" +msgstr "Campos personalizados" + +#: netbox/navigation/menu.py:311 +msgid "Custom Field Choices" +msgstr "Opciones de campo personalizadas" + +#: netbox/navigation/menu.py:312 +msgid "Custom Links" +msgstr "Vínculos personalizados" + +#: netbox/navigation/menu.py:313 +msgid "Export Templates" +msgstr "Plantillas de exportación" + +#: netbox/navigation/menu.py:314 +msgid "Saved Filters" +msgstr "Filtros guardados" + +#: netbox/navigation/menu.py:316 +msgid "Image Attachments" +msgstr "Adjuntos de imágenes" + +#: netbox/navigation/menu.py:320 +msgid "Reports & Scripts" +msgstr "Informes y guiones" + +#: netbox/navigation/menu.py:340 +msgid "Operations" +msgstr "Operaciones" + +#: netbox/navigation/menu.py:344 +msgid "Integrations" +msgstr "Integraciones" + +#: netbox/navigation/menu.py:346 +msgid "Data Sources" +msgstr "Fuentes de datos" + +#: netbox/navigation/menu.py:347 +msgid "Event Rules" +msgstr "Reglas del evento" + +#: netbox/navigation/menu.py:348 +msgid "Webhooks" +msgstr "Webhooks" + +#: netbox/navigation/menu.py:352 netbox/navigation/menu.py:356 +#: netbox/views/generic/feature_views.py:151 +#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +msgid "Jobs" +msgstr "Trabajos" + +#: netbox/navigation/menu.py:362 +msgid "Logging" +msgstr "Explotación" + +#: netbox/navigation/menu.py:364 +msgid "Journal Entries" +msgstr "Entradas del diario" + +#: netbox/navigation/menu.py:365 templates/extras/objectchange.html:8 +#: templates/extras/objectchange_list.html:4 +msgid "Change Log" +msgstr "Registro de cambios" + +#: netbox/navigation/menu.py:372 templates/inc/profile_button.html:18 +msgid "Admin" +msgstr "Admin" + +#: netbox/navigation/menu.py:381 templates/users/group.html:27 +#: users/forms/model_forms.py:242 users/forms/model_forms.py:255 +#: users/forms/model_forms.py:309 users/tables.py:105 +msgid "Users" +msgstr "usuarios" + +#: netbox/navigation/menu.py:404 users/forms/model_forms.py:182 +#: users/forms/model_forms.py:195 users/forms/model_forms.py:314 +#: users/tables.py:35 users/tables.py:109 +msgid "Groups" +msgstr "Grupos" + +#: netbox/navigation/menu.py:426 templates/account/base.html:21 +#: templates/inc/profile_button.html:39 +msgid "API Tokens" +msgstr "Tokens de API" + +#: netbox/navigation/menu.py:433 users/forms/model_forms.py:188 +#: users/forms/model_forms.py:197 users/forms/model_forms.py:248 +#: users/forms/model_forms.py:256 +msgid "Permissions" +msgstr "Permisos" + +#: netbox/navigation/menu.py:445 +msgid "Current Config" +msgstr "Configuración actual" + +#: netbox/navigation/menu.py:451 +msgid "Config Revisions" +msgstr "Revisiones de configuración" + +#: netbox/navigation/menu.py:491 templates/500.html:35 +#: templates/account/preferences.html:29 +msgid "Plugins" +msgstr "Plugins" + +#: netbox/preferences.py:17 +msgid "Color mode" +msgstr "Modo de color" + +#: netbox/preferences.py:25 +msgid "Page length" +msgstr "Longitud de página" + +#: netbox/preferences.py:27 +msgid "The default number of objects to display per page" +msgstr "El número predeterminado de objetos que se mostrarán por página" + +#: netbox/preferences.py:31 +msgid "Paginator placement" +msgstr "Colocación del paginador" + +#: netbox/preferences.py:37 +msgid "Where the paginator controls will be displayed relative to a table" +msgstr "" +"Dónde se mostrarán los controles del paginador en relación con una tabla" + +#: netbox/preferences.py:43 +msgid "Data format" +msgstr "Formato de datos" + +#: netbox/tables/columns.py:175 +msgid "Toggle all" +msgstr "Alternar todo" + +#: netbox/tables/columns.py:277 templates/inc/profile_button.html:56 +msgid "Toggle Dropdown" +msgstr "Alternar menú desplegable" + +#: netbox/tables/columns.py:542 templates/core/job.html:40 +msgid "Error" +msgstr "Error" + +#: netbox/tables/tables.py:243 templates/generic/bulk_import.html:115 +msgid "Field" +msgstr "Campo" + +#: netbox/tables/tables.py:246 +msgid "Value" +msgstr "Valor" + +#: netbox/tables/tables.py:259 +msgid "No results found" +msgstr "No se han encontrado resultados" + +#: netbox/tests/dummy_plugin/navigation.py:29 +msgid "Dummy Plugin" +msgstr "Plugin ficticio" + +#: netbox/views/generic/feature_views.py:38 +msgid "Changelog" +msgstr "Registro de cambios" + +#: netbox/views/generic/feature_views.py:91 +msgid "Journal" +msgstr "diario" + +#: templates/403.html:4 +msgid "Access Denied" +msgstr "Acceso denegado" + +#: templates/403.html:9 +msgid "You do not have permission to access this page" +msgstr "No tienes permiso para acceder a esta página" + +#: templates/404.html:4 +msgid "Page Not Found" +msgstr "No se encontró la página" + +#: templates/404.html:9 +msgid "The requested page does not exist" +msgstr "La página solicitada no existe" + +#: templates/500.html:7 templates/500.html:18 +msgid "Server Error" +msgstr "Error de servidor" + +#: templates/500.html:23 +msgid "There was a problem with your request. Please contact an administrator" +msgstr "" +"Ha surgido un problema con tu solicitud. Póngase en contacto con un " +"administrador" + +#: templates/500.html:28 +msgid "The complete exception is provided below" +msgstr "La excepción completa se proporciona a continuación" + +#: templates/500.html:33 +msgid "Python version" +msgstr "Versión de Python" + +#: templates/500.html:34 +msgid "NetBox version" +msgstr "Versión NetBox" + +#: templates/500.html:36 +msgid "None installed" +msgstr "No hay ninguno instalado" + +#: templates/500.html:39 +msgid "If further assistance is required, please post to the" +msgstr "Si necesita más ayuda, envíela por correo a" + +#: templates/500.html:39 +msgid "NetBox discussion forum" +msgstr "Foro de discusión de NetBox" + +#: templates/500.html:39 +msgid "on GitHub" +msgstr "en GitHub" + +#: templates/500.html:42 templates/base/40x.html:17 +msgid "Home Page" +msgstr "Página de inicio" + +#: templates/account/base.html:7 templates/inc/profile_button.html:24 +#: vpn/forms/bulk_edit.py:256 vpn/forms/filtersets.py:186 +#: vpn/forms/model_forms.py:372 +msgid "Profile" +msgstr "Perfil" + +#: templates/account/base.html:13 templates/inc/profile_button.html:34 +msgid "Preferences" +msgstr "Preferencias" + +#: templates/account/password.html:5 +msgid "Change Password" +msgstr "Cambiar contraseña" + +#: templates/account/password.html:17 templates/account/preferences.html:82 +#: templates/core/configrevision_restore.html:80 +#: templates/dcim/devicebay_populate.html:34 +#: templates/dcim/virtualchassis_add_member.html:24 +#: templates/dcim/virtualchassis_edit.html:104 +#: templates/extras/object_journal.html:26 templates/extras/script.html:36 +#: templates/generic/bulk_add_component.html:55 +#: templates/generic/bulk_delete.html:46 templates/generic/bulk_edit.html:125 +#: templates/generic/bulk_import.html:53 templates/generic/bulk_import.html:75 +#: templates/generic/bulk_import.html:97 templates/generic/bulk_remove.html:42 +#: templates/generic/bulk_rename.html:44 +#: templates/generic/confirmation_form.html:20 +#: templates/generic/object_edit.html:76 templates/htmx/delete_form.html:53 +#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:31 +#: templates/virtualization/cluster_add_devices.html:30 +msgid "Cancel" +msgstr "Cancelar" + +#: templates/account/password.html:18 templates/account/preferences.html:83 +#: templates/dcim/devicebay_populate.html:35 +#: templates/dcim/virtualchassis_add_member.html:26 +#: templates/dcim/virtualchassis_edit.html:106 +#: templates/extras/dashboard/widget_add.html:26 +#: templates/extras/dashboard/widget_config.html:19 +#: templates/extras/object_journal.html:27 +#: templates/generic/object_edit.html:66 +#: utilities/templates/helpers/applied_filters.html:16 +#: utilities/templates/helpers/table_config_form.html:40 +msgid "Save" +msgstr "Guardar" + +#: templates/account/preferences.html:41 +msgid "Table Configurations" +msgstr "Configuraciones de tablas" + +#: templates/account/preferences.html:46 +msgid "Clear table preferences" +msgstr "Borrar preferencias de mesa" + +#: templates/account/preferences.html:53 +msgid "Toggle All" +msgstr "Alternar todo" + +#: templates/account/preferences.html:55 +msgid "Table" +msgstr "Tabla" + +#: templates/account/preferences.html:56 +msgid "Ordering" +msgstr "Pedido" + +#: templates/account/preferences.html:57 +msgid "Columns" +msgstr "Columnas" + +#: templates/account/preferences.html:76 templates/dcim/cable_trace.html:113 +#: templates/extras/object_configcontext.html:55 +msgid "None found" +msgstr "No se encontró ninguno" + +#: templates/account/profile.html:6 +msgid "User Profile" +msgstr "Perfil de usuario" + +#: templates/account/profile.html:12 +msgid "Account Details" +msgstr "Detalles de la cuenta" + +#: templates/account/profile.html:30 templates/tenancy/contact.html:44 +#: templates/users/user.html:26 tenancy/forms/bulk_edit.py:108 +msgid "Email" +msgstr "Correo electrónico" + +#: templates/account/profile.html:34 templates/users/user.html:30 +msgid "Account Created" +msgstr "Cuenta creada" + +#: templates/account/profile.html:38 templates/users/user.html:42 +msgid "Superuser" +msgstr "Superusuario" + +#: templates/account/profile.html:42 +msgid "Admin Access" +msgstr "Acceso de administrador" + +#: templates/account/profile.html:51 templates/users/objectpermission.html:86 +#: templates/users/user.html:51 +msgid "Assigned Groups" +msgstr "Grupos asignados" + +#: templates/account/profile.html:56 +#: templates/circuits/circuit_terminations_swap.html:18 +#: templates/circuits/circuit_terminations_swap.html:26 +#: templates/circuits/inc/circuit_termination.html:154 +#: templates/dcim/devicebay.html:66 +#: templates/dcim/inc/panels/inventory_items.html:37 +#: templates/dcim/interface.html:306 templates/dcim/modulebay.html:79 +#: templates/extras/configcontext.html:73 templates/extras/eventrule.html:84 +#: templates/extras/htmx/script_result.html:54 +#: templates/extras/object_configcontext.html:28 +#: templates/extras/objectchange.html:128 +#: templates/extras/objectchange.html:145 templates/extras/webhook.html:79 +#: templates/extras/webhook.html:91 templates/inc/panel_table.html:12 +#: templates/inc/panels/comments.html:12 +#: templates/ipam/inc/panels/fhrp_groups.html:43 templates/users/group.html:32 +#: templates/users/group.html:42 templates/users/objectpermission.html:81 +#: templates/users/objectpermission.html:91 templates/users/user.html:56 +#: templates/users/user.html:66 +msgid "None" +msgstr "Ninguna" + +#: templates/account/profile.html:66 templates/users/user.html:76 +msgid "Recent Activity" +msgstr "Actividad reciente" + +#: templates/account/token.html:8 templates/account/token_list.html:6 +msgid "My API Tokens" +msgstr "Mis fichas de API" + +#: templates/account/token.html:11 templates/account/token.html:19 +#: templates/users/token.html:6 templates/users/token.html:14 +#: users/forms/filtersets.py:121 +msgid "Token" +msgstr "Símbolo" + +#: templates/account/token.html:40 templates/users/token.html:32 +#: users/forms/bulk_edit.py:87 +msgid "Write enabled" +msgstr "Escritura habilitada" + +#: templates/account/token.html:52 templates/users/token.html:44 +msgid "Last used" +msgstr "Utilizado por última vez" + +#: templates/account/token_list.html:12 +msgid "Add a Token" +msgstr "Añadir un token" + +#: templates/admin/index.html:10 +msgid "System" +msgstr "Sistema" + +#: templates/admin/index.html:14 +msgid "Background Tasks" +msgstr "Tareas en segundo plano" + +#: templates/admin/index.html:19 +msgid "Installed plugins" +msgstr "Plugins instalados" + +#: templates/base/base.html:28 templates/extras/admin/plugins_list.html:8 +#: templates/home.html:24 +msgid "Home" +msgstr "Inicio" + +#: templates/base/layout.html:27 templates/base/layout.html:37 +#: templates/login.html:34 +msgid "NetBox logo" +msgstr "Logotipo de NetBox" + +#: templates/base/layout.html:76 +msgid "Debug mode is enabled" +msgstr "El modo de depuración está activado" + +#: templates/base/layout.html:77 +msgid "" +"Performance may be limited. Debugging should never be enabled on a " +"production system" +msgstr "" +"El rendimiento puede ser limitado. La depuración nunca debe habilitarse en " +"un sistema de producción" + +#: templates/base/layout.html:83 +msgid "Maintenance Mode" +msgstr "Modo de mantenimiento" + +#: templates/base/layout.html:134 +msgid "Docs" +msgstr "Documentos" + +#: templates/base/layout.html:139 templates/rest_framework/api.html:10 +msgid "REST API" +msgstr "API DE DESCANSO" + +#: templates/base/layout.html:144 +msgid "REST API documentation" +msgstr "Documentación de la API REST" + +#: templates/base/layout.html:150 +msgid "GraphQL API" +msgstr "API de GraphQL" + +#: templates/base/layout.html:156 +msgid "Source Code" +msgstr "Código fuente" + +#: templates/base/layout.html:161 +msgid "Community" +msgstr "Comunidad" + +#: templates/base/sidenav.html:12 templates/base/sidenav.html:17 +msgid "NetBox Logo" +msgstr "Logotipo de NetBox" + +#: templates/circuits/circuit.html:48 +msgid "Install Date" +msgstr "Fecha de instalación" + +#: templates/circuits/circuit.html:52 +msgid "Termination Date" +msgstr "Fecha de terminación" + +#: templates/circuits/circuit_terminations_swap.html:4 +msgid "Swap Circuit Terminations" +msgstr "Intercambiar terminaciones de circuitos" + +#: templates/circuits/circuit_terminations_swap.html:8 +#, python-format +msgid "Swap these terminations for circuit %(circuit)s?" +msgstr "Cambie estas terminaciones por circuito %(circuit)s?" + +#: templates/circuits/circuit_terminations_swap.html:14 +msgid "A side" +msgstr "Un lado" + +#: templates/circuits/circuit_terminations_swap.html:22 +msgid "Z side" +msgstr "Lado Z" + +#: templates/circuits/circuittermination_edit.html:9 +#: templates/circuits/inc/circuit_termination.html:81 +#: templates/dcim/frontport.html:128 templates/dcim/interface.html:199 +#: templates/dcim/rearport.html:118 +msgid "Circuit Termination" +msgstr "Terminación del circuito" + +#: templates/circuits/circuittermination_edit.html:41 +msgid "Termination Details" +msgstr "Detalles de terminación" + +#: templates/circuits/circuittype.html:10 +msgid "Add Circuit" +msgstr "Agregar circuito" + +#: templates/circuits/inc/circuit_termination.html:9 +#: templates/dcim/devicetype/component_templates.html:30 +#: templates/dcim/manufacturer.html:11 +#: templates/dcim/moduletype/component_templates.html:30 +#: templates/generic/bulk_add_component.html:8 +#: templates/users/objectpermission.html:41 +#: utilities/templates/buttons/add.html:4 +#: utilities/templates/helpers/table_config_form.html:20 +msgid "Add" +msgstr "Añadir" + +#: templates/circuits/inc/circuit_termination.html:14 +#: templates/circuits/inc/circuit_termination.html:63 +#: templates/dcim/devicetype/component_templates.html:21 +#: templates/dcim/inc/panels/inventory_items.html:24 +#: templates/dcim/moduletype/component_templates.html:21 +#: templates/dcim/powerpanel.html:61 templates/generic/object_edit.html:29 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +#: templates/ipam/inc/panels/fhrp_groups.html:30 +#: utilities/templates/buttons/edit.html:3 +msgid "Edit" +msgstr "Editar" + +#: templates/circuits/inc/circuit_termination.html:17 +msgid "Swap" +msgstr "Intercambiar" + +#: templates/circuits/inc/circuit_termination.html:26 +#, python-format +msgid "Termination %(side)s" +msgstr "Terminación %(side)s" + +#: templates/circuits/inc/circuit_termination.html:42 +#: templates/dcim/cable.html:70 templates/dcim/cable.html:76 +#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:76 +msgid "Termination" +msgstr "Terminación" + +#: templates/circuits/inc/circuit_termination.html:46 +#: templates/dcim/consoleport.html:62 templates/dcim/consoleserverport.html:62 +#: templates/dcim/powerfeed.html:122 +msgid "Marked as connected" +msgstr "Marcado como conectado" + +#: templates/circuits/inc/circuit_termination.html:48 +msgid "to" +msgstr "a" + +#: templates/circuits/inc/circuit_termination.html:58 +#: templates/circuits/inc/circuit_termination.html:59 +#: templates/dcim/frontport.html:87 +#: templates/dcim/inc/connection_endpoints.html:7 +#: templates/dcim/interface.html:160 templates/dcim/rearport.html:83 +msgid "Trace" +msgstr "Rastrear" + +#: templates/circuits/inc/circuit_termination.html:62 +msgid "Edit cable" +msgstr "Editar cable" + +#: templates/circuits/inc/circuit_termination.html:67 +msgid "Remove cable" +msgstr "Quitar el cable" + +#: templates/circuits/inc/circuit_termination.html:68 +#: templates/dcim/bulk_disconnect.html:5 +#: templates/dcim/device/consoleports.html:12 +#: templates/dcim/device/consoleserverports.html:12 +#: templates/dcim/device/frontports.html:12 +#: templates/dcim/device/interfaces.html:16 +#: templates/dcim/device/poweroutlets.html:12 +#: templates/dcim/device/powerports.html:12 +#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:66 +msgid "Disconnect" +msgstr "Desconectar" + +#: templates/circuits/inc/circuit_termination.html:75 +#: templates/dcim/consoleport.html:71 templates/dcim/consoleserverport.html:71 +#: templates/dcim/frontport.html:109 templates/dcim/interface.html:186 +#: templates/dcim/interface.html:206 templates/dcim/powerfeed.html:136 +#: templates/dcim/poweroutlet.html:75 templates/dcim/poweroutlet.html:76 +#: templates/dcim/powerport.html:77 templates/dcim/rearport.html:105 +msgid "Connect" +msgstr "Conectar" + +#: templates/circuits/inc/circuit_termination.html:79 +#: templates/dcim/consoleport.html:78 templates/dcim/consoleserverport.html:78 +#: templates/dcim/frontport.html:18 templates/dcim/frontport.html:122 +#: templates/dcim/interface.html:193 templates/dcim/inventoryitem_edit.html:49 +#: templates/dcim/rearport.html:112 +msgid "Front Port" +msgstr "Puerto frontal" + +#: templates/circuits/inc/circuit_termination.html:97 +msgid "Downstream" +msgstr "Río abajo" + +#: templates/circuits/inc/circuit_termination.html:98 +msgid "Upstream" +msgstr "Aguas arriba" + +#: templates/circuits/inc/circuit_termination.html:107 +msgid "Cross-Connect" +msgstr "Conexión cruzada" + +#: templates/circuits/inc/circuit_termination.html:111 +msgid "Patch Panel/Port" +msgstr "Panel de conexión/puerto" + +#: templates/circuits/provider.html:11 +msgid "Add circuit" +msgstr "Añadir circuito" + +#: templates/circuits/provideraccount.html:17 +msgid "Provider Account" +msgstr "Cuenta de proveedor" + +#: templates/core/configrevision.html:47 +msgid "Default unit height" +msgstr "Altura por defecto de la unidad" + +#: templates/core/configrevision.html:51 +msgid "Default unit width" +msgstr "Ancho de unidad predeterminado" + +#: templates/core/configrevision.html:63 +msgid "Default voltage" +msgstr "Tensión predeterminada" + +#: templates/core/configrevision.html:67 +msgid "Default amperage" +msgstr "Amperaje predeterminado" + +#: templates/core/configrevision.html:71 +msgid "Default max utilization" +msgstr "Utilización máxima predeterminada" + +#: templates/core/configrevision.html:83 +msgid "Enforce global unique" +msgstr "Imponga la exclusividad global" + +#: templates/core/configrevision.html:135 +msgid "Paginate count" +msgstr "Recuento de paginaciones" + +#: templates/core/configrevision.html:139 +msgid "Max page size" +msgstr "Tamaño máximo de página" + +#: templates/core/configrevision.html:179 +msgid "Default user preferences" +msgstr "Preferencias de usuario predeterminadas" + +#: templates/core/configrevision.html:209 +msgid "Job retention" +msgstr "Retención de empleo" + +#: templates/core/configrevision.html:221 +msgid "Comment" +msgstr "Comentar" + +#: templates/core/configrevision_restore.html:8 +#: templates/core/configrevision_restore.html:43 +#: templates/core/configrevision_restore.html:79 +msgid "Restore" +msgstr "Restaurar" + +#: templates/core/configrevision_restore.html:21 +msgid "Config revisions" +msgstr "Revisiones de configuración" + +#: templates/core/configrevision_restore.html:54 +msgid "Parameter" +msgstr "Parámetro" + +#: templates/core/configrevision_restore.html:55 +msgid "Current Value" +msgstr "Valor actual" + +#: templates/core/configrevision_restore.html:56 +msgid "New Value" +msgstr "Nuevo valor" + +#: templates/core/configrevision_restore.html:66 +msgid "Changed" +msgstr "Cambiado" + +#: templates/core/datafile.html:47 +msgid "Last Updated" +msgstr "Última actualización" + +#: templates/core/datafile.html:51 templates/ipam/iprange.html:28 +#: templates/virtualization/virtualdisk.html:30 +msgid "Size" +msgstr "Tamaño" + +#: templates/core/datafile.html:52 +msgid "bytes" +msgstr "bytes" + +#: templates/core/datafile.html:55 +msgid "SHA256 Hash" +msgstr "Hash SHA256" + +#: templates/core/datasource.html:14 templates/core/datasource.html:20 +#: utilities/templates/buttons/sync.html:5 +msgid "Sync" +msgstr "Sincronizar" + +#: templates/core/datasource.html:51 +msgid "Last synced" +msgstr "Última sincronización" + +#: templates/core/datasource.html:86 +msgid "Backend" +msgstr "Backend" + +#: templates/core/datasource.html:102 +msgid "No parameters defined" +msgstr "No hay parámetros definidos" + +#: templates/core/datasource.html:118 +msgid "Files" +msgstr "Expedientes" + +#: templates/core/job.html:21 +msgid "Job" +msgstr "Trabajo" + +#: templates/core/job.html:45 templates/extras/journalentry.html:29 +msgid "Created By" +msgstr "Creado por" + +#: templates/core/job.html:54 +msgid "Scheduling" +msgstr "Programación" + +#: templates/core/job.html:66 +#, python-format +msgid "every %(interval)s seconds" +msgstr "cada %(interval)s segundos" + +#: templates/dcim/bulk_disconnect.html:9 +#, python-format +msgid "" +"Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" +msgstr "" +"¿Está seguro de que desea desconectarlos? %(count)s %(obj_type_plural)s?" + +#: templates/dcim/cable_edit.html:12 +msgid "A Side" +msgstr "Un lado" + +#: templates/dcim/cable_edit.html:29 +msgid "B Side" +msgstr "Lado B" + +#: templates/dcim/cable_trace.html:6 +#, python-format +msgid "Cable Trace for %(object_type)s %(object)s" +msgstr "Cable Trace para %(object_type)s %(object)s" + +#: templates/dcim/cable_trace.html:21 templates/dcim/inc/rack_elevation.html:7 +msgid "Download SVG" +msgstr "Descargar SVG" + +#: templates/dcim/cable_trace.html:27 +msgid "Asymmetric Path" +msgstr "Ruta asimétrica" + +#: templates/dcim/cable_trace.html:28 +msgid "The nodes below have no links and result in an asymmetric path" +msgstr "" +"Los nodos siguientes no tienen enlaces y dan como resultado una ruta " +"asimétrica" + +#: templates/dcim/cable_trace.html:35 +msgid "Path split" +msgstr "Ruta dividida" + +#: templates/dcim/cable_trace.html:36 +msgid "Select a node below to continue" +msgstr "Seleccione un nodo de los siguientes para continuar" + +#: templates/dcim/cable_trace.html:52 +msgid "Trace Completed" +msgstr "Rastreo completado" + +#: templates/dcim/cable_trace.html:55 +msgid "Total segments" +msgstr "Total de segmentos" + +#: templates/dcim/cable_trace.html:59 +msgid "Total length" +msgstr "Longitud total" + +#: templates/dcim/cable_trace.html:74 +msgid "No paths found" +msgstr "No se encontró ninguna ruta" + +#: templates/dcim/cable_trace.html:83 +msgid "Related Paths" +msgstr "Rutas relacionadas" + +#: templates/dcim/cable_trace.html:89 +msgid "Origin" +msgstr "Origen" + +#: templates/dcim/cable_trace.html:90 +msgid "Destination" +msgstr "Destino" + +#: templates/dcim/cable_trace.html:91 +msgid "Segments" +msgstr "Segmentos" + +#: templates/dcim/cable_trace.html:104 +msgid "Incomplete" +msgstr "Incompleto" + +#: templates/dcim/component_list.html:14 +msgid "Rename Selected" +msgstr "Cambiar nombre seleccionado" + +#: templates/dcim/consoleport.html:67 templates/dcim/consoleserverport.html:67 +#: templates/dcim/frontport.html:105 templates/dcim/interface.html:182 +#: templates/dcim/poweroutlet.html:73 templates/dcim/powerport.html:73 +msgid "Not Connected" +msgstr "No conectado" + +#: templates/dcim/consoleport.html:75 templates/dcim/consoleserverport.html:18 +#: templates/dcim/frontport.html:116 templates/dcim/inventoryitem_edit.html:44 +msgid "Console Server Port" +msgstr "Puerto de servidor de consola" + +#: templates/dcim/device.html:35 +msgid "Highlight device" +msgstr "Resaltar dispositivo" + +#: templates/dcim/device.html:57 +msgid "Not racked" +msgstr "No está atormentado" + +#: templates/dcim/device.html:64 templates/dcim/site.html:96 +msgid "GPS Coordinates" +msgstr "Coordenadas GPS" + +#: templates/dcim/device.html:70 templates/dcim/site.html:102 +msgid "Map It" +msgstr "Mapearlo" + +#: templates/dcim/device.html:110 templates/dcim/inventoryitem.html:57 +#: templates/dcim/module.html:79 templates/dcim/modulebay.html:73 +#: templates/dcim/rack.html:62 +msgid "Asset Tag" +msgstr "Etiqueta de activo" + +#: templates/dcim/device.html:153 +msgid "View Virtual Chassis" +msgstr "Ver chasis virtual" + +#: templates/dcim/device.html:170 +msgid "Create VDC" +msgstr "Crear VDC" + +#: templates/dcim/device.html:179 templates/dcim/device_edit.html:64 +#: virtualization/forms/model_forms.py:226 +msgid "Management" +msgstr "Administración" + +#: templates/dcim/device.html:200 templates/dcim/device.html:216 +#: templates/virtualization/virtualmachine.html:56 +#: templates/virtualization/virtualmachine.html:72 +msgid "NAT for" +msgstr "NAT para" + +#: templates/dcim/device.html:202 templates/dcim/device.html:218 +#: templates/virtualization/virtualmachine.html:58 +#: templates/virtualization/virtualmachine.html:74 +msgid "NAT" +msgstr "NATA" + +#: templates/dcim/device.html:254 templates/dcim/rack.html:70 +msgid "Power Utilization" +msgstr "Utilización de energía" + +#: templates/dcim/device.html:259 +msgid "Input" +msgstr "Entrada" + +#: templates/dcim/device.html:260 +msgid "Outlets" +msgstr "Puntos de venta" + +#: templates/dcim/device.html:261 +msgid "Allocated" +msgstr "Asignado" + +#: templates/dcim/device.html:270 templates/dcim/device.html:272 +#: templates/dcim/device.html:288 templates/dcim/powerfeed.html:70 +msgid "VA" +msgstr "VA" + +#: templates/dcim/device.html:282 +msgctxt "Leg of a power feed" +msgid "Leg" +msgstr "Pierna" + +#: templates/dcim/device.html:312 +#: templates/virtualization/virtualmachine.html:165 +msgid "Add a service" +msgstr "Añadir un servicio" + +#: templates/dcim/device.html:319 templates/dcim/rack.html:77 +#: templates/dcim/rack_edit.html:38 +msgid "Dimensions" +msgstr "Dimensiones" + +#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 +#: templates/dcim/devicetype/base.html:18 templates/dcim/module.html:18 +#: templates/dcim/moduletype/base.html:18 +#: templates/virtualization/virtualmachine/base.html:22 +#: templates/virtualization/virtualmachine_list.html:8 +msgid "Add Components" +msgstr "Agregar componentes" + +#: templates/dcim/device/consoleports.html:24 +msgid "Add Console Ports" +msgstr "Agregar puertos de consola" + +#: templates/dcim/device/consoleserverports.html:24 +msgid "Add Console Server Ports" +msgstr "Agregar puertos de servidor de consola" + +#: templates/dcim/device/devicebays.html:10 +msgid "Add Device Bays" +msgstr "Agregar compartimentos de dispositivos" + +#: templates/dcim/device/frontports.html:24 +msgid "Add Front Ports" +msgstr "Agregar puertos frontales" + +#: templates/dcim/device/inc/interface_table_controls.html:9 +msgid "Hide Enabled" +msgstr "Ocultar activado" + +#: templates/dcim/device/inc/interface_table_controls.html:10 +msgid "Hide Disabled" +msgstr "Ocultar desactivado" + +#: templates/dcim/device/inc/interface_table_controls.html:11 +msgid "Hide Virtual" +msgstr "Ocultar virtual" + +#: templates/dcim/device/inc/interface_table_controls.html:12 +msgid "Hide Disconnected" +msgstr "Ocultar desconectado" + +#: templates/dcim/device/interfaces.html:28 +msgid "Add Interfaces" +msgstr "Agregar interfaces" + +#: templates/dcim/device/inventory.html:10 +#: templates/dcim/inc/panels/inventory_items.html:46 +msgid "Add Inventory Item" +msgstr "Añadir artículo de inventario" + +#: templates/dcim/device/modulebays.html:10 +msgid "Add Module Bays" +msgstr "Agregar compartimentos de módulos" + +#: templates/dcim/device/poweroutlets.html:24 +msgid "Add Power Outlets" +msgstr "Añadir tomas de corriente" + +#: templates/dcim/device/powerports.html:24 +msgid "Add Power Port" +msgstr "Agregar puerto de alimentación" + +#: templates/dcim/device/rearports.html:24 +msgid "Add Rear Ports" +msgstr "Agregar puertos traseros" + +#: templates/dcim/device/render_config.html:5 +#: templates/virtualization/virtualmachine/render_config.html:5 +msgid "Config" +msgstr "Configuración" + +#: templates/dcim/device/render_config.html:37 +#: templates/virtualization/virtualmachine/render_config.html:37 +msgid "Context Data" +msgstr "Datos de contexto" + +#: templates/dcim/device/render_config.html:57 +#: templates/virtualization/virtualmachine/render_config.html:57 +msgid "Download" +msgstr "Descargar" + +#: templates/dcim/device/render_config.html:60 +#: templates/virtualization/virtualmachine/render_config.html:60 +msgid "Rendered Config" +msgstr "Configuración renderizada" + +#: templates/dcim/device/render_config.html:65 +#: templates/virtualization/virtualmachine/render_config.html:65 +msgid "No configuration template found" +msgstr "No se encontró ninguna plantilla de configuración" + +#: templates/dcim/device_edit.html:44 +msgid "Parent Bay" +msgstr "Bahía para padres" + +#: templates/dcim/device_edit.html:48 +#: utilities/templates/form_helpers/render_field.html:20 +msgid "Regenerate Slug" +msgstr "Regenera a Slug" + +#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:7 +#: utilities/templates/helpers/table_config_form.html:23 +msgid "Remove" +msgstr "Eliminar" + +#: templates/dcim/device_edit.html:110 +msgid "Local Config Context Data" +msgstr "Datos de contexto de configuración local" + +#: templates/dcim/device_list.html:82 +#: templates/dcim/devicetype/component_templates.html:18 +#: templates/dcim/moduletype/component_templates.html:18 +#: templates/generic/bulk_rename.html:34 +#: templates/virtualization/virtualmachine/interfaces.html:11 +#: templates/virtualization/virtualmachine/virtual_disks.html:11 +msgid "Rename" +msgstr "Cambiar nombre" + +#: templates/dcim/devicebay.html:18 +msgid "Device Bay" +msgstr "Bahía de dispositivos" + +#: templates/dcim/devicebay.html:48 +msgid "Installed Device" +msgstr "Dispositivo instalado" + +#: templates/dcim/devicebay_delete.html:6 +#, python-format +msgid "Delete device bay %(devicebay)s?" +msgstr "Eliminar compartimento de dispositivos %(devicebay)s?" + +#: templates/dcim/devicebay_delete.html:11 +#, python-format +msgid "" +"Are you sure you want to delete this device bay from " +"%(device)s?" +msgstr "" +"¿Confirma que desea eliminar este compartimento para dispositivos de " +"%(device)s?" + +#: templates/dcim/devicebay_depopulate.html:6 +#, python-format +msgid "Remove %(device)s from %(device_bay)s?" +msgstr "Eliminar %(device)s de %(device_bay)s?" + +#: templates/dcim/devicebay_depopulate.html:13 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from " +"%(device_bay)s?" +msgstr "" +"¿Estás seguro de que quieres eliminar? %(device)s de " +"%(device_bay)s?" + +#: templates/dcim/devicebay_populate.html:13 +msgid "Populate" +msgstr "Poblar" + +#: templates/dcim/devicebay_populate.html:22 +msgid "Bay" +msgstr "Bahía" + +#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +msgid "Add Device" +msgstr "Agregar dispositivo" + +#: templates/dcim/devicerole.html:43 +msgid "VM Role" +msgstr "Función de máquina virtual" + +#: templates/dcim/devicetype.html:21 templates/dcim/moduletype.html:19 +msgid "Model Name" +msgstr "Nombre del modelo" + +#: templates/dcim/devicetype.html:28 templates/dcim/moduletype.html:23 +msgid "Part Number" +msgstr "Número de pieza" + +#: templates/dcim/devicetype.html:40 +msgid "Height (U" +msgstr "Altura (U)" + +#: templates/dcim/devicetype.html:44 +msgid "Exclude From Utilization" +msgstr "Excluir de la utilización" + +#: templates/dcim/devicetype.html:62 +msgid "Parent/Child" +msgstr "Padre/hijo" + +#: templates/dcim/devicetype.html:74 +msgid "Front Image" +msgstr "Imagen frontal" + +#: templates/dcim/devicetype.html:86 +msgid "Rear Image" +msgstr "Imagen trasera" + +#: templates/dcim/frontport.html:57 +msgid "Rear Port Position" +msgstr "Posición del puerto trasero" + +#: templates/dcim/frontport.html:79 templates/dcim/interface.html:150 +#: templates/dcim/poweroutlet.html:67 templates/dcim/powerport.html:67 +#: templates/dcim/rearport.html:75 +msgid "Marked as Connected" +msgstr "Marcado como conectado" + +#: templates/dcim/frontport.html:93 templates/dcim/rearport.html:89 +msgid "Connection Status" +msgstr "Estado de conexión" + +#: templates/dcim/inc/cable_termination.html:65 +msgid "No termination" +msgstr "Sin rescisión" + +#: templates/dcim/inc/cable_toggle_buttons.html:4 +msgid "Mark Planned" +msgstr "Marcar como planificado" + +#: templates/dcim/inc/cable_toggle_buttons.html:8 +msgid "Mark Installed" +msgstr "Marcar como instalado" + +#: templates/dcim/inc/connection_endpoints.html:13 +msgid "Path Status" +msgstr "Estado de la ruta" + +#: templates/dcim/inc/connection_endpoints.html:18 +msgid "Not Reachable" +msgstr "No accesible" + +#: templates/dcim/inc/connection_endpoints.html:23 +msgid "Path Endpoints" +msgstr "Puntos finales de ruta" + +#: templates/dcim/inc/endpoint_connection.html:8 +#: templates/dcim/powerfeed.html:128 templates/dcim/rearport.html:101 +msgid "Not connected" +msgstr "No conectado" + +#: templates/dcim/inc/interface_vlans_table.html:6 +msgid "Untagged" +msgstr "Sin etiquetar" + +#: templates/dcim/inc/interface_vlans_table.html:37 +msgid "No VLANs Assigned" +msgstr "No hay VLAN asignadas" + +#: templates/dcim/inc/interface_vlans_table.html:44 +#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +msgid "Clear" +msgstr "Borrar" + +#: templates/dcim/inc/interface_vlans_table.html:47 +msgid "Clear All" +msgstr "Borrar todo" + +#: templates/dcim/interface.html:17 +msgid "Add Child Interface" +msgstr "Agregar interfaz secundaria" + +#: templates/dcim/interface.html:51 +msgid "Speed/Duplex" +msgstr "Velocidad/dúplex" + +#: templates/dcim/interface.html:74 +msgid "PoE Mode" +msgstr "Modo PoE" + +#: templates/dcim/interface.html:78 +msgid "PoE Type" +msgstr "Tipo de PoE" + +#: templates/dcim/interface.html:82 +#: templates/virtualization/vminterface.html:66 +msgid "802.1Q Mode" +msgstr "Modo 802.1Q" + +#: templates/dcim/interface.html:130 +#: templates/virtualization/vminterface.html:62 +msgid "MAC Address" +msgstr "Dirección MAC" + +#: templates/dcim/interface.html:157 +msgid "Wireless Link" +msgstr "Enlace inalámbrico" + +#: templates/dcim/interface.html:226 vpn/choices.py:55 +msgid "Peer" +msgstr "Par" + +#: templates/dcim/interface.html:238 +#: templates/wireless/inc/wirelesslink_interface.html:26 +msgid "Channel" +msgstr "Canal" + +#: templates/dcim/interface.html:247 +#: templates/wireless/inc/wirelesslink_interface.html:32 +msgid "Channel Frequency" +msgstr "Frecuencia de canal" + +#: templates/dcim/interface.html:250 templates/dcim/interface.html:258 +#: templates/dcim/interface.html:269 templates/dcim/interface.html:277 +msgid "MHz" +msgstr "megahercio" + +#: templates/dcim/interface.html:266 +#: templates/wireless/inc/wirelesslink_interface.html:42 +msgid "Channel Width" +msgstr "Ancho de canal" + +#: templates/dcim/interface.html:295 templates/wireless/wirelesslan.html:15 +#: templates/wireless/wirelesslink.html:24 wireless/forms/bulk_edit.py:59 +#: wireless/forms/bulk_edit.py:101 wireless/forms/filtersets.py:39 +#: wireless/forms/filtersets.py:79 wireless/models.py:81 +#: wireless/models.py:155 wireless/tables/wirelesslan.py:44 +msgid "SSID" +msgstr "SSID" + +#: templates/dcim/interface.html:316 +msgid "LAG Members" +msgstr "Miembros del LAG" + +#: templates/dcim/interface.html:335 +msgid "No member interfaces" +msgstr "Sin interfaces de miembros" + +#: templates/dcim/interface.html:359 templates/ipam/fhrpgroup.html:80 +#: templates/ipam/iprange/ip_addresses.html:7 +#: templates/ipam/prefix/ip_addresses.html:7 +#: templates/virtualization/vminterface.html:96 +msgid "Add IP Address" +msgstr "Agregar dirección IP" + +#: templates/dcim/inventoryitem.html:25 +msgid "Parent Item" +msgstr "Artículo principal" + +#: templates/dcim/inventoryitem.html:49 +msgid "Part ID" +msgstr "ID de pieza" + +#: templates/dcim/inventoryitem_bulk_delete.html:5 +msgid "This will also delete all child inventory items of those listed" +msgstr "" +"Esto también eliminará todos los artículos del inventario infantil de los " +"listados." + +#: templates/dcim/inventoryitem_edit.html:33 +msgid "Component Assignment" +msgstr "Asignación de componentes" + +#: templates/dcim/inventoryitem_edit.html:59 +#: templates/dcim/poweroutlet.html:18 templates/dcim/powerport.html:81 +msgid "Power Outlet" +msgstr "Toma de corriente" + +#: templates/dcim/location.html:17 +msgid "Add Child Location" +msgstr "Agregar ubicación infantil" + +#: templates/dcim/location.html:76 +msgid "Child Locations" +msgstr "Ubicaciones para niños" + +#: templates/dcim/location.html:84 templates/dcim/site.html:137 +msgid "Add a Location" +msgstr "Agregar una ubicación" + +#: templates/dcim/location.html:98 templates/dcim/site.html:151 +msgid "Add a Device" +msgstr "Agregar un dispositivo" + +#: templates/dcim/manufacturer.html:16 +msgid "Add Device Type" +msgstr "Agregar tipo de dispositivo" + +#: templates/dcim/manufacturer.html:21 +msgid "Add Module Type" +msgstr "Agregar tipo de módulo" + +#: templates/dcim/powerfeed.html:56 +msgid "Connected Device" +msgstr "Dispositivo conectado" + +#: templates/dcim/powerfeed.html:66 +msgid "Utilization (Allocated" +msgstr "Utilización (asignada)" + +#: templates/dcim/powerfeed.html:85 +msgid "Electrical Characteristics" +msgstr "Características eléctricas" + +#: templates/dcim/powerfeed.html:95 +msgctxt "Abbreviation for volts" +msgid "V" +msgstr "V" + +#: templates/dcim/powerfeed.html:99 +msgctxt "Abbreviation for amperes" +msgid "A" +msgstr "UN" + +#: templates/dcim/poweroutlet.html:51 +msgid "Feed Leg" +msgstr "Pierna de alimentación" + +#: templates/dcim/powerpanel.html:77 +msgid "Add Power Feeds" +msgstr "Añadir fuentes de alimentación" + +#: templates/dcim/powerport.html:47 +msgid "Maximum Draw" +msgstr "Sorteo máximo" + +#: templates/dcim/powerport.html:51 +msgid "Allocated Draw" +msgstr "Sorteo asignado" + +#: templates/dcim/rack.html:66 +msgid "Space Utilization" +msgstr "Utilización del espacio" + +#: templates/dcim/rack.html:96 +msgid "descending" +msgstr "descendiendo" + +#: templates/dcim/rack.html:96 +msgid "ascending" +msgstr "ascendiendo" + +#: templates/dcim/rack.html:99 +msgid "Starting Unit" +msgstr "Unidad inicial" + +#: templates/dcim/rack.html:125 +msgid "Mounting Depth" +msgstr "Profundidad de montaje" + +#: templates/dcim/rack.html:135 +msgid "Rack Weight" +msgstr "Peso del estante" + +#: templates/dcim/rack.html:145 templates/dcim/rack_edit.html:67 +msgid "Maximum Weight" +msgstr "Peso máximo" + +#: templates/dcim/rack.html:155 +msgid "Total Weight" +msgstr "Peso total" + +#: templates/dcim/rack.html:173 templates/dcim/rack_elevation_list.html:16 +msgid "Images and Labels" +msgstr "Imágenes y etiquetas" + +#: templates/dcim/rack.html:174 templates/dcim/rack_elevation_list.html:17 +msgid "Images only" +msgstr "Solo imágenes" + +#: templates/dcim/rack.html:175 templates/dcim/rack_elevation_list.html:18 +msgid "Labels only" +msgstr "Solo etiquetas" + +#: templates/dcim/rack/reservations.html:9 +msgid "Add reservation" +msgstr "Añadir reserva" + +#: templates/dcim/rack_edit.html:21 +msgid "Inventory Control" +msgstr "Control de inventario" + +#: templates/dcim/rack_edit.html:45 +msgid "Outer Dimensions" +msgstr "Dimensiones exteriores" + +#: templates/dcim/rack_edit.html:56 templates/dcim/rack_edit.html:71 +msgid "Unit" +msgstr "Unidad" + +#: templates/dcim/rack_elevation_list.html:12 +msgid "View List" +msgstr "Ver lista" + +#: templates/dcim/rack_elevation_list.html:27 +msgid "Sort By" +msgstr "Ordenar por" + +#: templates/dcim/rack_elevation_list.html:77 +msgid "No Racks Found" +msgstr "No se encontró ningún estante" + +#: templates/dcim/rack_list.html:8 +msgid "View Elevations" +msgstr "Ver elevaciones" + +#: templates/dcim/rackreservation.html:47 +msgid "Reservation Details" +msgstr "Detalles de la reserva" + +#: templates/dcim/rackrole.html:10 +msgid "Add Rack" +msgstr "Añadir estante" + +#: templates/dcim/rearport.html:53 +msgid "Positions" +msgstr "Posiciones" + +#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +msgid "Add Site" +msgstr "Agregar sitio" + +#: templates/dcim/region.html:56 +msgid "Child Regions" +msgstr "Regiones infantiles" + +#: templates/dcim/region.html:64 +msgid "Add Region" +msgstr "Agregar región" + +#: templates/dcim/site.html:56 +msgid "Facility" +msgstr "Instalación" + +#: templates/dcim/site.html:64 +msgid "Time Zone" +msgstr "Zona horaria" + +#: templates/dcim/site.html:67 +msgid "UTC" +msgstr "UTC" + +#: templates/dcim/site.html:68 +msgid "Site time" +msgstr "Hora del sitio" + +#: templates/dcim/site.html:75 +msgid "Physical Address" +msgstr "Dirección física" + +#: templates/dcim/site.html:81 +msgid "Map" +msgstr "Mapa" + +#: templates/dcim/site.html:92 +msgid "Shipping Address" +msgstr "Dirección de envío" + +#: templates/dcim/sitegroup.html:56 templates/tenancy/contactgroup.html:49 +#: templates/tenancy/tenantgroup.html:58 +#: templates/wireless/wirelesslangroup.html:56 +msgid "Child Groups" +msgstr "Grupos de niños" + +#: templates/dcim/sitegroup.html:64 +msgid "Add Site Group" +msgstr "Agregar grupo de sitios" + +#: templates/dcim/trace/attachment.html:5 +#: templates/extras/exporttemplate.html:37 +msgid "Attachment" +msgstr "Fijación" + +#: templates/dcim/virtualchassis.html:86 +msgid "Add Member" +msgstr "Agregar miembro" + +#: templates/dcim/virtualchassis_add.html:18 +msgid "Member Devices" +msgstr "Dispositivos de los miembros" + +#: templates/dcim/virtualchassis_add_member.html:6 +#, python-format +msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" +msgstr "Agregar un nuevo miembro al chasis virtual %(virtual_chassis)s" + +#: templates/dcim/virtualchassis_add_member.html:17 +msgid "Add New Member" +msgstr "Agregar nuevo miembro" + +#: templates/dcim/virtualchassis_add_member.html:25 +msgid "Add Another" +msgstr "Añadir otro" + +#: templates/dcim/virtualchassis_edit.html:7 +#, python-format +msgid "Editing Virtual Chassis %(name)s" +msgstr "Edición de chasis virtuales %(name)s" + +#: templates/dcim/virtualchassis_edit.html:54 +msgid "Rack/Unit" +msgstr "Bastidor/unidad" + +#: templates/dcim/virtualchassis_remove_member.html:5 +msgid "Remove Virtual Chassis Member" +msgstr "Eliminar miembro del chasis virtual" + +#: templates/dcim/virtualchassis_remove_member.html:9 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from virtual " +"chassis %(name)s?" +msgstr "" +"¿Estás seguro de que quieres eliminar? %(device)s desde un " +"chasis virtual %(name)s?" + +#: templates/dcim/virtualdevicecontext.html:29 templates/vpn/l2vpn.html:19 +msgid "Identifier" +msgstr "Identificador" + +#: templates/exceptions/import_error.html:6 +msgid "" +"A module import error occurred during this request. Common causes include " +"the following:" +msgstr "" +"Se ha producido un error de importación del módulo durante esta solicitud. " +"Entre las causas más frecuentes se incluyen las siguientes:" + +#: templates/exceptions/import_error.html:10 +msgid "Missing required packages" +msgstr "Faltan paquetes requeridos" + +#: templates/exceptions/import_error.html:11 +msgid "" +"This installation of NetBox might be missing one or more required Python " +"packages. These packages are listed in requirements.txt and " +"local_requirements.txt, and are normally installed as part of " +"the installation or upgrade process. To verify installed packages, run " +"pip freeze from the console and compare the output to the list " +"of required packages." +msgstr "" +"Es posible que a esta instalación de NetBox le falten uno o más paquetes de " +"Python necesarios. Estos paquetes se enumeran en " +"requirements.txt y local_requirements.txt, y " +"normalmente se instalan como parte del proceso de instalación o " +"actualización. Para comprobar los paquetes instalados, ejecute pipa " +"congelada desde la consola y compare el resultado con la lista de " +"paquetes necesarios." + +#: templates/exceptions/import_error.html:20 +msgid "WSGI service not restarted after upgrade" +msgstr "El servicio WSGI no se reinicia después de la actualización" + +#: templates/exceptions/import_error.html:21 +msgid "" +"If this installation has recently been upgraded, check that the WSGI service" +" (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" +" is running." +msgstr "" +"Si esta instalación se actualizó recientemente, compruebe que el servicio " +"WSGI (por ejemplo, gunicorn o uWSGI) se haya reiniciado. Esto garantiza que " +"el nuevo código se esté ejecutando." + +#: templates/exceptions/permission_error.html:6 +msgid "" +"A file permission error was detected while processing this request. Common " +"causes include the following:" +msgstr "" +"Se detectó un error de permisos de archivos al procesar esta solicitud. " +"Entre las causas más frecuentes se incluyen las siguientes:" + +#: templates/exceptions/permission_error.html:10 +msgid "Insufficient write permission to the media root" +msgstr "Permisos de escritura insuficientes en la raíz multimedia" + +#: templates/exceptions/permission_error.html:11 +#, python-format +msgid "" +"The configured media root is %(media_root)s. Ensure that the " +"user NetBox runs as has access to write files to all locations within this " +"path." +msgstr "" +"La raíz de medios configurada es %(media_root)s. Asegúrese de " +"que el usuario NetBox se ejecute con acceso para escribir archivos en todas " +"las ubicaciones de esta ruta." + +#: templates/exceptions/programming_error.html:6 +msgid "" +"A database programming error was detected while processing this request. " +"Common causes include the following:" +msgstr "" +"Se detectó un error de programación de la base de datos al procesar esta " +"solicitud. Entre las causas más frecuentes se incluyen las siguientes:" + +#: templates/exceptions/programming_error.html:10 +msgid "Database migrations missing" +msgstr "Faltan migraciones de bases de datos" + +#: templates/exceptions/programming_error.html:11 +msgid "" +"When upgrading to a new NetBox release, the upgrade script must be run to " +"apply any new database migrations. You can run migrations manually by " +"executing python3 manage.py migrate from the command line." +msgstr "" +"Al actualizar a una nueva versión de NetBox, se debe ejecutar el script de " +"actualización para aplicar cualquier migración nueva de bases de datos. " +"Puede ejecutar las migraciones manualmente mediante la ejecución " +"python3 manage.py migre desde la línea de comandos." + +#: templates/exceptions/programming_error.html:18 +msgid "Unsupported PostgreSQL version" +msgstr "Versión de PostgreSQL no compatible" + +#: templates/exceptions/programming_error.html:19 +msgid "" +"Ensure that PostgreSQL version 12 or later is in use. You can check this by " +"connecting to the database using NetBox's credentials and issuing a query " +"for SELECT VERSION()." +msgstr "" +"Asegúrese de que la versión 12 o posterior de PostgreSQL esté en uso. Para " +"comprobarlo, conéctese a la base de datos utilizando las credenciales de " +"NetBox y emitiendo una consulta para SELECCIONE LA VERSIÓN ()." + +#: templates/extras/admin/plugins_list.html:4 +#: templates/extras/admin/plugins_list.html:9 +#: templates/extras/admin/plugins_list.html:13 +msgid "Installed Plugins" +msgstr "Plugins instalados" + +#: templates/extras/admin/plugins_list.html:23 +msgid "Package Name" +msgstr "Nombre del paquete" + +#: templates/extras/admin/plugins_list.html:24 +msgid "Author" +msgstr "autor" + +#: templates/extras/admin/plugins_list.html:25 +msgid "Author Email" +msgstr "Correo electrónico del autor" + +#: templates/extras/admin/plugins_list.html:27 +#: templates/vpn/ipsecprofile.html:47 vpn/forms/bulk_edit.py:140 +#: vpn/forms/bulk_import.py:171 vpn/tables/crypto.py:61 +msgid "Version" +msgstr "Versión" + +#: templates/extras/configcontext.html:46 +#: templates/extras/configtemplate.html:38 +#: templates/extras/exporttemplate.html:57 +msgid "The data file associated with this object has been deleted" +msgstr "Se ha eliminado el archivo de datos asociado a este objeto" + +#: templates/extras/configcontext.html:55 +#: templates/extras/configtemplate.html:47 +#: templates/extras/exporttemplate.html:66 +msgid "Data Synced" +msgstr "Datos sincronizados" + +#: templates/extras/configcontext_list.html:7 +#: templates/extras/configtemplate_list.html:7 +#: templates/extras/exporttemplate_list.html:7 +msgid "Sync Data" +msgstr "Sincronizar datos" + +#: templates/extras/configtemplate.html:58 +msgid "Environment Parameters" +msgstr "Parámetros del entorno" + +#: templates/extras/configtemplate.html:69 +#: templates/extras/exporttemplate.html:88 +msgid "Template" +msgstr "plantilla" + +#: templates/extras/customfield.html:31 templates/extras/customlink.html:22 +msgid "Group Name" +msgstr "Nombre del grupo" + +#: templates/extras/customfield.html:43 +msgid "Cloneable" +msgstr "Clonable" + +#: templates/extras/customfield.html:53 +msgid "Default Value" +msgstr "Valor predeterminado" + +#: templates/extras/customfield.html:64 +msgid "Search Weight" +msgstr "Peso de búsqueda" + +#: templates/extras/customfield.html:74 +msgid "Filter Logic" +msgstr "Lógica de filtros" + +#: templates/extras/customfield.html:78 +msgid "Display Weight" +msgstr "Peso de la pantalla" + +#: templates/extras/customfield.html:82 +msgid "UI Visible" +msgstr "Interfaz de usuario visible" + +#: templates/extras/customfield.html:86 +msgid "UI Editable" +msgstr "Interfaz de usuario editable" + +#: templates/extras/customfield.html:108 +msgid "Validation Rules" +msgstr "Reglas de validación" + +#: templates/extras/customfield.html:112 +msgid "Minimum Value" +msgstr "Valor mínimo" + +#: templates/extras/customfield.html:116 +msgid "Maximum Value" +msgstr "Valor máximo" + +#: templates/extras/customfield.html:120 +msgid "Regular Expression" +msgstr "Expresión regular" + +#: templates/extras/customlink.html:30 +msgid "Button Class" +msgstr "Clase de botones" + +#: templates/extras/customlink.html:41 templates/extras/exporttemplate.html:73 +#: templates/extras/savedfilter.html:41 +msgid "Assigned Models" +msgstr "Modelos asignados" + +#: templates/extras/customlink.html:57 +msgid "Link Text" +msgstr "Texto del enlace" + +#: templates/extras/customlink.html:65 +msgid "Link URL" +msgstr "URL del enlace" + +#: templates/extras/dashboard/reset.html:4 templates/home.html:63 +msgid "Reset Dashboard" +msgstr "Restablecer panel" + +#: templates/extras/dashboard/reset.html:8 +msgid "" +"This will remove all configured widgets and restore the " +"default dashboard configuration." +msgstr "" +"Esto eliminará todo configuró los widgets y restauró la " +"configuración predeterminada del panel de control." + +#: templates/extras/dashboard/reset.html:13 +msgid "" +"This change affects only your dashboard, and will not impact other " +"users." +msgstr "" +"Este cambio solo afecta vuestro panel de control, y no afectará a " +"otros usuarios." + +#: templates/extras/dashboard/widget_add.html:7 +msgid "Add a Widget" +msgstr "Añadir un widget" + +#: templates/extras/dashboard/widgets/bookmarks.html:14 +msgid "No bookmarks have been added yet." +msgstr "Aún no se ha añadido ningún marcador." + +#: templates/extras/dashboard/widgets/objectcounts.html:15 +msgid "No permission" +msgstr "Sin permiso" + +#: templates/extras/dashboard/widgets/objectlist.html:6 +msgid "No permission to view this content" +msgstr "Sin permiso para ver este contenido" + +#: templates/extras/dashboard/widgets/objectlist.html:10 +msgid "Unable to load content. Invalid view name" +msgstr "No se puede cargar el contenido. Nombre de vista no válido" + +#: templates/extras/dashboard/widgets/rssfeed.html:12 +msgid "No content found" +msgstr "No se ha encontrado contenido" + +#: templates/extras/dashboard/widgets/rssfeed.html:18 +msgid "There was a problem fetching the RSS feed" +msgstr "Se ha producido un problema al obtener la fuente RSS" + +#: templates/extras/dashboard/widgets/rssfeed.html:21 +msgid "HTTP" +msgstr "HTTP" + +#: templates/extras/eventrule.html:63 +msgid "Job start" +msgstr "Inicio del trabajo" + +#: templates/extras/eventrule.html:67 +msgid "Job end" +msgstr "Fin del trabajo" + +#: templates/extras/exporttemplate.html:29 +msgid "MIME Type" +msgstr "Tipo MIME" + +#: templates/extras/exporttemplate.html:33 +msgid "File Extension" +msgstr "Extensión de archivo" + +#: templates/extras/htmx/report_result.html:9 +#: templates/extras/htmx/script_result.html:10 +msgid "Scheduled for" +msgstr "Programado para" + +#: templates/extras/htmx/report_result.html:14 +#: templates/extras/htmx/script_result.html:15 +msgid "Duration" +msgstr "Duración" + +#: templates/extras/htmx/report_result.html:20 +msgid "Report Methods" +msgstr "Métodos de informe" + +#: templates/extras/htmx/report_result.html:38 +msgid "Report Results" +msgstr "Resultados del informe" + +#: templates/extras/htmx/report_result.html:44 +#: templates/extras/htmx/script_result.html:26 +msgid "Level" +msgstr "Nivel" + +#: templates/extras/htmx/report_result.html:46 +#: templates/extras/htmx/script_result.html:27 +msgid "Message" +msgstr "Mensaje" + +#: templates/extras/htmx/script_result.html:21 +msgid "Script Log" +msgstr "Registro de scripts" + +#: templates/extras/htmx/script_result.html:25 +msgid "Line" +msgstr "Línea" + +#: templates/extras/htmx/script_result.html:38 +msgid "No log output" +msgstr "Sin salida de registro" + +#: templates/extras/htmx/script_result.html:46 +msgid "Exec Time" +msgstr "Hora ejecutiva" + +#: templates/extras/htmx/script_result.html:46 +msgctxt "Unit of time" +msgid "seconds" +msgstr "segundos" + +#: templates/extras/htmx/script_result.html:50 +msgid "Output" +msgstr "Salida" + +#: templates/extras/inc/result_pending.html:4 +msgid "Loading" +msgstr "Cargando" + +#: templates/extras/inc/result_pending.html:6 +msgid "Results pending" +msgstr "Resultados pendientes" + +#: templates/extras/journalentry.html:16 +msgid "Journal Entry" +msgstr "Entrada de diario" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Change log retention" +msgstr "Cambiar la retención de registros" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "days" +msgstr "días" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Indefinite" +msgstr "Indefinido" + +#: templates/extras/object_configcontext.html:11 +msgid "Rendered Context" +msgstr "Contexto renderizado" + +#: templates/extras/object_configcontext.html:22 +msgid "Local Context" +msgstr "Contexto local" + +#: templates/extras/object_configcontext.html:34 +msgid "The local config context overwrites all source contexts" +msgstr "" +"El contexto de configuración local sobrescribe todos los contextos fuente" + +#: templates/extras/object_configcontext.html:40 +msgid "Source Contexts" +msgstr "Contextos de origen" + +#: templates/extras/object_journal.html:18 +msgid "New Journal Entry" +msgstr "Nueva entrada de diario" + +#: templates/extras/objectchange.html:29 +#: templates/users/objectpermission.html:45 +msgid "Change" +msgstr "Cambiar" + +#: templates/extras/objectchange.html:84 +msgid "Difference" +msgstr "Diferencia" + +#: templates/extras/objectchange.html:87 +msgid "Previous" +msgstr "Anterior" + +#: templates/extras/objectchange.html:90 +msgid "Next" +msgstr "Próxima" + +#: templates/extras/objectchange.html:98 +msgid "Object Created" +msgstr "Objeto creado" + +#: templates/extras/objectchange.html:100 +msgid "Object Deleted" +msgstr "Objeto eliminado" + +#: templates/extras/objectchange.html:102 +msgid "No Changes" +msgstr "Sin cambios" + +#: templates/extras/objectchange.html:117 +msgid "Pre-Change Data" +msgstr "Datos previos al cambio" + +#: templates/extras/objectchange.html:126 +msgid "Warning: Comparing non-atomic change to previous change record" +msgstr "" +"Advertencia: comparación del cambio no atómico con el registro de cambios " +"anterior" + +#: templates/extras/objectchange.html:136 +msgid "Post-Change Data" +msgstr "Datos posteriores al cambio" + +#: templates/extras/objectchange.html:157 +#, python-format +msgid "See All %(count)s Changes" +msgstr "Ver todos %(count)s Cambios" + +#: templates/extras/report.html:14 +msgid "This report is invalid and cannot be run." +msgstr "Este informe no es válido y no se puede ejecutar." + +#: templates/extras/report.html:23 templates/extras/report_list.html:88 +msgid "Run Again" +msgstr "Corre otra vez" + +#: templates/extras/report.html:25 templates/extras/report_list.html:90 +msgid "Run Report" +msgstr "Ejecutar informe" + +#: templates/extras/report.html:36 +msgid "Last run" +msgstr "Última ejecución" + +#: templates/extras/report/base.html:30 +msgid "Report" +msgstr "Informe" + +#: templates/extras/report_list.html:48 templates/extras/script_list.html:54 +msgid "Last Run" +msgstr "Última ejecución" + +#: templates/extras/report_list.html:70 templates/extras/script_list.html:77 +msgid "Never" +msgstr "Nunca" + +#: templates/extras/report_list.html:75 +msgid "Report has no test methods" +msgstr "El informe no tiene métodos de prueba" + +#: templates/extras/report_list.html:76 +msgid "Invalid" +msgstr "No válido" + +#: templates/extras/report_list.html:125 +msgid "No Reports Found" +msgstr "No se encontró ningún informe" + +#: templates/extras/report_list.html:128 +#, python-format +msgid "" +"Get started by creating a report from " +"an uploaded file or data source." +msgstr "" +"Comience por crear un informe desde un" +" archivo o fuente de datos cargados." + +#: templates/extras/script.html:13 +msgid "You do not have permission to run scripts" +msgstr "No tiene permiso para ejecutar scripts" + +#: templates/extras/script.html:37 +msgid "Run Script" +msgstr "Ejecutar script" + +#: templates/extras/script_list.html:44 +#, python-format +msgid "" +"Script file at %(file_path)s could not be " +"loaded." +msgstr "" +"Archivo de script en %(file_path)s no se pudo " +"cargar." + +#: templates/extras/script_list.html:91 +msgid "No Scripts Found" +msgstr "No se encontró ningún script" + +#: templates/extras/script_list.html:94 +#, python-format +msgid "" +"Get started by creating a script from " +"an uploaded file or data source." +msgstr "" +"Comience por crear un guion desde un " +"archivo o fuente de datos cargados." + +#: templates/extras/script_result.html:42 +msgid "Log" +msgstr "Registro" + +#: templates/extras/tag.html:35 +msgid "Tagged Items" +msgstr "Artículos etiquetados" + +#: templates/extras/tag.html:47 +msgid "Allowed Object Types" +msgstr "Tipos de objetos permitidos" + +#: templates/extras/tag.html:56 +msgid "Any" +msgstr "Cualquier" + +#: templates/extras/tag.html:63 +msgid "Tagged Item Types" +msgstr "Tipos de artículos etiquetados" + +#: templates/extras/tag.html:89 +msgid "Tagged Objects" +msgstr "Objetos etiquetados" + +#: templates/extras/webhook.html:33 +msgid "HTTP Method" +msgstr "Método HTTP" + +#: templates/extras/webhook.html:41 +msgid "HTTP Content Type" +msgstr "Tipo de contenido HTTP" + +#: templates/extras/webhook.html:58 +msgid "SSL Verification" +msgstr "Verificación SSL" + +#: templates/extras/webhook.html:73 +msgid "Additional Headers" +msgstr "Encabezados adicionales" + +#: templates/extras/webhook.html:85 +msgid "Body Template" +msgstr "Plantilla corporal" + +#: templates/generic/bulk_add_component.html:15 +msgid "Bulk Creation" +msgstr "Creación masiva" + +#: templates/generic/bulk_add_component.html:20 +#: templates/generic/bulk_edit.html:28 +msgid "Selected Objects" +msgstr "Objetos seleccionados" + +#: templates/generic/bulk_add_component.html:46 +msgid "to Add" +msgstr "añadir" + +#: templates/generic/bulk_delete.html:24 +msgid "Confirm Bulk Deletion" +msgstr "Confirme la eliminación masiva" + +#: templates/generic/bulk_delete.html:26 +msgctxt "Noun" +msgid "Warning" +msgstr "Advertencia" + +#: templates/generic/bulk_delete.html:27 +#, python-format +msgid "" +"The following operation will delete %(count)s " +"%(type_plural)s. Please carefully review the objects to be deleted and " +"confirm below." +msgstr "" +"La siguiente operación eliminará %(count)s %(type_plural)s." +" Revise detenidamente los objetos que desee eliminar y confírmelos a " +"continuación." + +#: templates/generic/bulk_edit.html:16 templates/generic/object_edit.html:17 +msgid "Editing" +msgstr "Edición" + +#: templates/generic/bulk_edit.html:23 +msgid "Bulk Edit" +msgstr "Edición masiva" + +#: templates/generic/bulk_edit.html:124 templates/generic/bulk_rename.html:42 +msgid "Apply" +msgstr "Aplica" + +#: templates/generic/bulk_import.html:14 +msgid "Bulk Import" +msgstr "Importación masiva" + +#: templates/generic/bulk_import.html:20 +msgid "Direct Import" +msgstr "Importación directa" + +#: templates/generic/bulk_import.html:25 +msgid "Upload File" +msgstr "Cargar archivo" + +#: templates/generic/bulk_import.html:51 templates/generic/bulk_import.html:73 +#: templates/generic/bulk_import.html:95 +msgid "Submit" +msgstr "Enviar" + +#: templates/generic/bulk_import.html:110 +msgid "Field Options" +msgstr "Opciones de campo" + +#: templates/generic/bulk_import.html:117 +msgid "Accessor" +msgstr "Accesor" + +#: templates/generic/bulk_import.html:154 +msgid "Import Value" +msgstr "Valor de importación" + +#: templates/generic/bulk_import.html:181 +msgid "Format: YYYY-MM-DD" +msgstr "Formato: AAAA-MM-DD" + +#: templates/generic/bulk_import.html:183 +msgid "Specify true or false" +msgstr "Especifique verdadero o falso" + +#: templates/generic/bulk_import.html:195 +msgid "Required fields must be specified for all objects." +msgstr "" +"Campos obligatorios mosto especificarse para todos los " +"objetos." + +#: templates/generic/bulk_import.html:201 +#, python-format +msgid "" +"Related objects may be referenced by any unique attribute. For example, " +"%(example)s would identify a VRF by its route distinguisher." +msgstr "" +"Se puede hacer referencia a los objetos relacionados mediante cualquier " +"atributo único. Por ejemplo, %(example)s identificaría un VRF " +"por su identificador de ruta." + +#: templates/generic/bulk_remove.html:13 +msgid "Confirm Bulk Removal" +msgstr "Confirme la eliminación masiva" + +#: templates/generic/bulk_remove.html:15 +#, python-format +msgid "" +"Warning: The following operation will remove %(count)s " +"%(obj_type_plural)s from %(parent_obj)s." +msgstr "" +"Advertencia: La siguiente operación eliminará %(count)s " +"%(obj_type_plural)s de %(parent_obj)s." + +#: templates/generic/bulk_remove.html:21 +#, python-format +msgid "" +"Please carefully review the %(obj_type_plural)s to be removed and confirm " +"below." +msgstr "" +"Revise detenidamente el %(obj_type_plural)s se eliminará y se confirmará a " +"continuación." + +#: templates/generic/bulk_remove.html:38 +#, python-format +msgid "Delete these %(count)s %(obj_type_plural)s" +msgstr "Elimine estos %(count)s %(obj_type_plural)s" + +#: templates/generic/bulk_rename.html:7 +msgid "Renaming" +msgstr "Cambiar el nombre" + +#: templates/generic/bulk_rename.html:16 +msgid "Current Name" +msgstr "Nombre actual" + +#: templates/generic/bulk_rename.html:17 +msgid "New Name" +msgstr "Nombre nuevo" + +#: templates/generic/bulk_rename.html:40 +#: utilities/templates/widgets/markdown_input.html:11 +msgid "Preview" +msgstr "Vista previa" + +#: templates/generic/confirmation_form.html:16 +msgid "Are you sure" +msgstr "¿Estás seguro" + +#: templates/generic/confirmation_form.html:19 +msgid "Confirm" +msgstr "Confirmar" + +#: templates/generic/object.html:51 +msgid "ago" +msgstr "hace" + +#: templates/generic/object_children.html:27 +#: utilities/templates/buttons/bulk_edit.html:4 +msgid "Edit Selected" +msgstr "Editar seleccionado" + +#: templates/generic/object_children.html:41 +#: utilities/templates/buttons/bulk_delete.html:4 +msgid "Delete Selected" +msgstr "Eliminar seleccionado" + +#: templates/generic/object_edit.html:19 +#, python-format +msgid "Add a new %(object_type)s" +msgstr "Añadir una nueva %(object_type)s" + +#: templates/generic/object_edit.html:47 +msgid "View model documentation" +msgstr "Ver la documentación del modelo" + +#: templates/generic/object_edit.html:48 +msgid "Help" +msgstr "Ayuda" + +#: templates/generic/object_edit.html:73 +msgid "Create & Add Another" +msgstr "Crear y agregar otro" + +#: templates/generic/object_list.html:48 templates/search.html:13 +msgid "Results" +msgstr "Resultados" + +#: templates/generic/object_list.html:54 +msgid "Filters" +msgstr "Filtros" + +#: templates/generic/object_list.html:94 +#, python-format +msgid "" +"Select all %(count)s %(object_type_plural)s matching query" +msgstr "" +"Seleccione todo %(count)s %(object_type_plural)s consulta " +"coincidente" + +#: templates/home.html:12 +msgid "New Release Available" +msgstr "Nueva versión disponible" + +#: templates/home.html:14 +msgid "is available" +msgstr "está disponible" + +#: templates/home.html:17 +msgctxt "Document title" +msgid "Upgrade Instructions" +msgstr "Instrucciones de actualización" + +#: templates/home.html:37 +msgid "Unlock Dashboard" +msgstr "Desbloquear panel" + +#: templates/home.html:46 +msgid "Lock Dashboard" +msgstr "Panel de control de bloqueo" + +#: templates/home.html:57 +msgid "Add Widget" +msgstr "Agregar widget" + +#: templates/home.html:60 +msgid "Save Layout" +msgstr "Guardar diseño" + +#: templates/htmx/delete_form.html:7 +msgid "Confirm Deletion" +msgstr "Confirme la eliminación" + +#: templates/htmx/delete_form.html:11 +#, python-format +msgid "" +"Are you sure you want to delete " +"%(object_type)s %(object)s?" +msgstr "" +"¿Estás seguro de que quieres eliminar" +" %(object_type)s %(object)s?" + +#: templates/htmx/delete_form.html:17 +msgid "The following objects will be deleted as a result of this action." +msgstr "Como resultado de esta acción, se eliminarán los siguientes objetos." + +#: templates/htmx/object_selector.html:5 +msgid "Select" +msgstr "Seleccione" + +#: templates/inc/filter_list.html:50 +#: utilities/templates/helpers/table_config_form.html:39 +msgid "Reset" +msgstr "Restablecer" + +#: templates/inc/missing_prerequisites.html:7 +#, python-format +msgid "" +"Before you can add a %(model)s you must first create a " +"%(prerequisite_model)s." +msgstr "" +"Antes de poder añadir un %(model)s primero debes crear un " +"%(prerequisite_model)s." + +#: templates/inc/paginator.html:38 templates/inc/paginator_htmx.html:53 +msgid "Per Page" +msgstr "Por página" + +#: templates/inc/paginator.html:49 templates/inc/paginator_htmx.html:69 +#, python-format +msgid "Showing %(start)s-%(end)s of %(total)s" +msgstr "Mostrando %(start)s-%(end)s de %(total)s" + +#: templates/inc/panels/image_attachments.html:10 +msgid "Attach an image" +msgstr "Adjunta una imagen" + +#: templates/inc/panels/related_objects.html:5 +msgid "Related Objects" +msgstr "Objetos relacionados" + +#: templates/inc/panels/tags.html:11 +msgid "No tags assigned" +msgstr "No hay etiquetas asignadas" + +#: templates/inc/profile_button.html:12 templates/inc/profile_button.html:62 +msgid "Dark Mode" +msgstr "Modo oscuro" + +#: templates/inc/profile_button.html:45 +msgid "Log Out" +msgstr "Cerrar sesión" + +#: templates/inc/profile_button.html:53 +msgid "Log In" +msgstr "Iniciar sesión" + +#: templates/inc/sync_warning.html:7 +msgid "Data is out of sync with upstream file" +msgstr "Los datos no están sincronizados con el archivo anterior" + +#: templates/inc/table_controls_htmx.html:16 +#: templates/inc/table_controls_htmx.html:18 +msgid "Configure Table" +msgstr "Configurar tabla" + +#: templates/ipam/aggregate.html:15 templates/ipam/ipaddress.html:17 +#: templates/ipam/iprange.html:16 templates/ipam/prefix.html:16 +msgid "Family" +msgstr "Familia" + +#: templates/ipam/aggregate.html:40 +msgid "Date Added" +msgstr "Fecha añadida" + +#: templates/ipam/aggregate/prefixes.html:8 +#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +msgid "Add Prefix" +msgstr "Agregar prefijo" + +#: templates/ipam/asn.html:24 +msgid "AS Number" +msgstr "Número AS" + +#: templates/ipam/fhrpgroup.html:55 +msgid "Authentication Type" +msgstr "Tipo de autenticación" + +#: templates/ipam/fhrpgroup.html:59 +msgid "Authentication Key" +msgstr "Clave de autenticación" + +#: templates/ipam/fhrpgroup.html:72 +msgid "Virtual IP Addresses" +msgstr "Direcciones IP virtuales" + +#: templates/ipam/fhrpgroupassignment_edit.html:8 +msgid "FHRP Group Assignment" +msgstr "Asignación grupal de FHRP" + +#: templates/ipam/inc/ipaddress_edit_header.html:19 +msgid "Assign IP" +msgstr "Asignar IP" + +#: templates/ipam/inc/ipaddress_edit_header.html:28 +msgid "Bulk Create" +msgstr "Creación masiva" + +#: templates/ipam/inc/panels/fhrp_groups.html:12 +msgid "Virtual IPs" +msgstr "IP virtuales" + +#: templates/ipam/inc/panels/fhrp_groups.html:52 +msgid "Create Group" +msgstr "Crear grupo" + +#: templates/ipam/inc/panels/fhrp_groups.html:57 +msgid "Assign Group" +msgstr "Asignar grupo" + +#: templates/ipam/inc/toggle_available.html:7 +msgid "Show Assigned" +msgstr "Mostrar asignado" + +#: templates/ipam/inc/toggle_available.html:10 +msgid "Show Available" +msgstr "Mostrar disponible" + +#: templates/ipam/inc/toggle_available.html:13 +msgid "Show All" +msgstr "Mostrar todo" + +#: templates/ipam/ipaddress.html:26 templates/ipam/iprange.html:48 +#: templates/ipam/prefix.html:25 +msgid "Global" +msgstr "Global" + +#: templates/ipam/ipaddress.html:88 +msgid "NAT (outside)" +msgstr "NAT (exterior)" + +#: templates/ipam/ipaddress_assign.html:8 +msgid "Assign an IP Address" +msgstr "Asignar una dirección IP" + +#: templates/ipam/ipaddress_assign.html:23 +msgid "Select IP Address" +msgstr "Seleccione la dirección IP" + +#: templates/ipam/ipaddress_assign.html:39 +msgid "Search Results" +msgstr "Resultados de la búsqueda" + +#: templates/ipam/ipaddress_bulk_add.html:6 +msgid "Bulk Add IP Addresses" +msgstr "Agregar direcciones IP de forma masiva" + +#: templates/ipam/ipaddress_edit.html:35 +msgid "Interface Assignment" +msgstr "Asignación de interfaz" + +#: templates/ipam/ipaddress_edit.html:74 +msgid "NAT IP (Inside" +msgstr "NAT IP (interior)" + +#: templates/ipam/iprange.html:20 +msgid "Starting Address" +msgstr "Dirección inicial" + +#: templates/ipam/iprange.html:24 +msgid "Ending Address" +msgstr "Dirección final" + +#: templates/ipam/iprange.html:36 templates/ipam/prefix.html:104 +msgid "Marked fully utilized" +msgstr "Marcado como totalmente utilizado" + +#: templates/ipam/prefix.html:112 +msgid "Child IPs" +msgstr "IP para niños" + +#: templates/ipam/prefix.html:120 +msgid "Available IPs" +msgstr "IPs disponibles" + +#: templates/ipam/prefix.html:132 +msgid "First available IP" +msgstr "Primera IP disponible" + +#: templates/ipam/prefix.html:151 +msgid "Addressing Details" +msgstr "Detalles de direccionamiento" + +#: templates/ipam/prefix.html:181 +msgid "Prefix Details" +msgstr "Detalles del prefijo" + +#: templates/ipam/prefix.html:187 +msgid "Network Address" +msgstr "Dirección de red" + +#: templates/ipam/prefix.html:191 +msgid "Network Mask" +msgstr "Máscara de red" + +#: templates/ipam/prefix.html:195 +msgid "Wildcard Mask" +msgstr "Máscara Wildcard" + +#: templates/ipam/prefix.html:199 +msgid "Broadcast Address" +msgstr "Dirección de transmisión" + +#: templates/ipam/prefix/ip_ranges.html:7 +msgid "Add IP Range" +msgstr "Agregar rango de IP" + +#: templates/ipam/prefix_list.html:7 +msgid "Hide Depth Indicators" +msgstr "Ocultar indicadores de profundidad" + +#: templates/ipam/prefix_list.html:11 +msgid "Max Depth" +msgstr "Profundidad máxima" + +#: templates/ipam/prefix_list.html:28 +msgid "Max Length" +msgstr "Longitud máxima" + +#: templates/ipam/rir.html:10 +msgid "Add Aggregate" +msgstr "Agregar agregado" + +#: templates/ipam/routetarget.html:10 +msgid "Route Target" +msgstr "Objetivo de ruta" + +#: templates/ipam/routetarget.html:40 +msgid "Importing VRFs" +msgstr "Importación de VRF" + +#: templates/ipam/routetarget.html:49 +msgid "Exporting VRFs" +msgstr "Exportación de VRF" + +#: templates/ipam/routetarget.html:60 +msgid "Importing L2VPNs" +msgstr "Importación de VPNs L2" + +#: templates/ipam/routetarget.html:69 +msgid "Exporting L2VPNs" +msgstr "Exportación de VPNs L2" + +#: templates/ipam/service.html:22 templates/ipam/service_create.html:8 +#: templates/ipam/service_edit.html:8 +msgid "Service" +msgstr "Servicio" + +#: templates/ipam/service_create.html:43 +msgid "From Template" +msgstr "Desde plantilla" + +#: templates/ipam/service_create.html:48 +msgid "Custom" +msgstr "Personalizado" + +#: templates/ipam/service_edit.html:37 +msgid "Port(s)" +msgstr "Puerto (s)" + +#: templates/ipam/vlan.html:95 +msgid "Add a Prefix" +msgstr "Agregar un prefijo" + +#: templates/ipam/vlangroup.html:18 +msgid "Add VLAN" +msgstr "Agregar VLAN" + +#: templates/ipam/vlangroup.html:43 +msgid "Permitted VIDs" +msgstr "VÍDEOS permitidos" + +#: templates/ipam/vrf.html:19 +msgid "Route Distinguisher" +msgstr "Distinguidor de rutas" + +#: templates/ipam/vrf.html:32 +msgid "Unique IP Space" +msgstr "Espacio IP único" + +#: templates/login.html:20 +#: utilities/templates/form_helpers/render_errors.html:7 +msgid "Errors" +msgstr "Errores" + +#: templates/login.html:48 +msgid "Sign In" +msgstr "Iniciar sesión" + +#: templates/login.html:54 +msgid "Or use a single sign-on (SSO) provider" +msgstr "O usa un proveedor de inicio de sesión único (SSO)" + +#: templates/login.html:68 +msgid "Toggle Color Mode" +msgstr "Alternar modo de color" + +#: templates/media_failure.html:7 +msgid "Static Media Failure - NetBox" +msgstr "Fallo de medios estáticos - NetBox" + +#: templates/media_failure.html:21 +msgid "Static Media Failure" +msgstr "Fallo de medios estáticos" + +#: templates/media_failure.html:23 +msgid "The following static media file failed to load" +msgstr "No se pudo cargar el siguiente archivo multimedia estático" + +#: templates/media_failure.html:26 +msgid "Check the following" +msgstr "Compruebe lo siguiente" + +#: templates/media_failure.html:29 +msgid "" +"manage.py collectstatic was run during the most recent upgrade." +" This installs the most recent iteration of each static file into the static" +" root path." +msgstr "" +"manage.py recopila estática se ejecutó durante la actualización" +" más reciente. Esto instala la iteración más reciente de cada archivo " +"estático en la ruta raíz estática." + +#: templates/media_failure.html:35 +#, python-format +msgid "" +"The HTTP service (e.g. nginx or Apache) is configured to serve files from " +"the STATIC_ROOT path. Refer to the " +"installation documentation for further guidance." +msgstr "" +"El servicio HTTP (por ejemplo, nginx o Apache) está configurado para servir " +"archivos desde RAÍZ_ESTÁTICA camino. Consulte la documentación de instalación para obtener más " +"información." + +#: templates/media_failure.html:47 +#, python-format +msgid "" +"The file %(filename)s exists in the static root directory and " +"is readable by the HTTP server." +msgstr "" +"El archivo %(filename)s existe en el directorio raíz estático y" +" el servidor HTTP lo puede leer." + +#: templates/media_failure.html:55 +#, python-format +msgid "Click here to attempt loading NetBox again." +msgstr "" +"Haga clic aquí para intentar cargar NetBox de " +"nuevo." + +#: templates/tenancy/contact.html:18 tenancy/filtersets.py:135 +#: tenancy/forms/bulk_edit.py:136 tenancy/forms/filtersets.py:101 +#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:109 +#: tenancy/forms/model_forms.py:132 tenancy/tables/contacts.py:98 +msgid "Contact" +msgstr "Contacto" + +#: templates/tenancy/contact.html:30 tenancy/forms/bulk_edit.py:98 +msgid "Title" +msgstr "Título" + +#: templates/tenancy/contact.html:34 tenancy/forms/bulk_edit.py:103 +#: tenancy/tables/contacts.py:64 +msgid "Phone" +msgstr "Teléfono" + +#: templates/tenancy/contact.html:86 tenancy/tables/contacts.py:73 +msgid "Assignments" +msgstr "Asignaciones" + +#: templates/tenancy/contactassignment_edit.html:12 +msgid "Contact Assignment" +msgstr "Asignación de contactos" + +#: templates/tenancy/contactgroup.html:19 tenancy/forms/forms.py:66 +#: tenancy/forms/model_forms.py:76 +msgid "Contact Group" +msgstr "Grupo de contacto" + +#: templates/tenancy/contactgroup.html:57 +msgid "Add Contact Group" +msgstr "Agregar grupo de contactos" + +#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:140 +#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:90 +msgid "Contact Role" +msgstr "Función de contacto" + +#: templates/tenancy/object_contacts.html:9 +msgid "Add a contact" +msgstr "Añadir un contacto" + +#: templates/tenancy/tenantgroup.html:17 +msgid "Add Tenant" +msgstr "Agregar inquilino" + +#: templates/tenancy/tenantgroup.html:27 tenancy/forms/model_forms.py:31 +#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +msgid "Tenant Group" +msgstr "Grupo de inquilinos" + +#: templates/tenancy/tenantgroup.html:66 +msgid "Add Tenant Group" +msgstr "Agregar grupo de inquilinos" + +#: templates/users/group.html:37 templates/users/user.html:61 +msgid "Assigned Permissions" +msgstr "Permisos asignados" + +#: templates/users/objectpermission.html:6 +#: templates/users/objectpermission.html:14 users/forms/filtersets.py:67 +msgid "Permission" +msgstr "Permiso" + +#: templates/users/objectpermission.html:33 users/forms/filtersets.py:68 +#: users/forms/model_forms.py:321 +msgid "Actions" +msgstr "Acciones" + +#: templates/users/objectpermission.html:37 +msgid "View" +msgstr "Ver" + +#: templates/users/objectpermission.html:56 users/forms/model_forms.py:324 +msgid "Constraints" +msgstr "Restricciones" + +#: templates/users/objectpermission.html:76 +msgid "Assigned Users" +msgstr "Usuarios asignados" + +#: templates/users/user.html:38 +msgid "Staff" +msgstr "Personal" + +#: templates/virtualization/cluster.html:56 +msgid "Allocated Resources" +msgstr "Recursos asignados" + +#: templates/virtualization/cluster.html:60 +#: templates/virtualization/virtualmachine.html:128 +msgid "Virtual CPUs" +msgstr "CPUs virtuales" + +#: templates/virtualization/cluster.html:64 +#: templates/virtualization/virtualmachine.html:132 +msgid "Memory" +msgstr "Memoria" + +#: templates/virtualization/cluster.html:74 +#: templates/virtualization/virtualmachine.html:143 +msgid "Disk Space" +msgstr "Espacio en disco" + +#: templates/virtualization/cluster.html:77 +#: templates/virtualization/virtualdisk.html:33 +#: templates/virtualization/virtualmachine.html:147 +msgctxt "Abbreviation for gigabyte" +msgid "GB" +msgstr "GB" + +#: templates/virtualization/cluster/base.html:18 +msgid "Add Virtual Machine" +msgstr "Agregar máquina virtual" + +#: templates/virtualization/cluster/base.html:24 +msgid "Assign Device" +msgstr "Asignar dispositivo" + +#: templates/virtualization/cluster/devices.html:10 +msgid "Remove Selected" +msgstr "Eliminar seleccionado" + +#: templates/virtualization/cluster_add_devices.html:9 +#, python-format +msgid "Add Device to Cluster %(cluster)s" +msgstr "Agregar dispositivo al clúster %(cluster)s" + +#: templates/virtualization/cluster_add_devices.html:23 +msgid "Device Selection" +msgstr "Selección de dispositivos" + +#: templates/virtualization/cluster_add_devices.html:31 +msgid "Add Devices" +msgstr "Agregar dispositivos" + +#: templates/virtualization/clustergroup.html:10 +#: templates/virtualization/clustertype.html:10 +msgid "Add Cluster" +msgstr "Agregar clúster" + +#: templates/virtualization/clustergroup.html:20 +#: virtualization/forms/model_forms.py:51 +msgid "Cluster Group" +msgstr "Grupo de clústeres" + +#: templates/virtualization/clustertype.html:20 +#: templates/virtualization/virtualmachine.html:111 +#: virtualization/forms/model_forms.py:35 +msgid "Cluster Type" +msgstr "Tipo de clúster" + +#: templates/virtualization/virtualdisk.html:18 +msgid "Virtual Disk" +msgstr "Disco virtual" + +#: templates/virtualization/virtualmachine.html:124 +#: virtualization/forms/bulk_edit.py:189 +#: virtualization/forms/model_forms.py:227 +msgid "Resources" +msgstr "Recursos" + +#: templates/virtualization/virtualmachine.html:185 +msgid "Add Virtual Disk" +msgstr "Agregar disco virtual" + +#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:35 +#: vpn/tables/crypto.py:166 +msgid "IKE Policy" +msgstr "Política de IKE" + +#: templates/vpn/ikepolicy.html:22 +msgid "IKE Version" +msgstr "Versión IKE" + +#: templates/vpn/ikepolicy.html:30 +msgid "Pre-Shared Key" +msgstr "Clave previamente compartida" + +#: templates/vpn/ikepolicy.html:34 +#: templates/wireless/inc/authentication_attrs.html:21 +msgid "Show Secret" +msgstr "Mostrar secreto" + +#: templates/vpn/ikepolicy.html:59 templates/vpn/ipsecpolicy.html:47 +#: templates/vpn/ipsecprofile.html:55 templates/vpn/ipsecprofile.html:82 +#: vpn/forms/model_forms.py:310 vpn/forms/model_forms.py:345 +#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +msgid "Proposals" +msgstr "Propuestas" + +#: templates/vpn/ikeproposal.html:10 +msgid "IKE Proposal" +msgstr "Propuesta IKE" + +#: templates/vpn/ikeproposal.html:22 vpn/forms/bulk_edit.py:96 +#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:98 +msgid "Authentication method" +msgstr "Método de autenticación" + +#: templates/vpn/ikeproposal.html:26 templates/vpn/ipsecproposal.html:22 +#: vpn/forms/bulk_edit.py:101 vpn/forms/bulk_edit.py:173 +#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:193 +#: vpn/forms/filtersets.py:103 vpn/forms/filtersets.py:151 +msgid "Encryption algorithm" +msgstr "Algoritmo de cifrado" + +#: templates/vpn/ikeproposal.html:30 templates/vpn/ipsecproposal.html:26 +#: vpn/forms/bulk_edit.py:106 vpn/forms/bulk_edit.py:178 +#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:197 +#: vpn/forms/filtersets.py:108 vpn/forms/filtersets.py:156 +msgid "Authentication algorithm" +msgstr "Algoritmo de autenticación" + +#: templates/vpn/ikeproposal.html:34 +msgid "DH group" +msgstr "Grupo DH" + +#: templates/vpn/ikeproposal.html:38 templates/vpn/ipsecproposal.html:30 +#: vpn/forms/bulk_edit.py:183 vpn/models/crypto.py:134 +msgid "SA lifetime (seconds)" +msgstr "Una vida útil (segundos)" + +#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:70 +#: vpn/tables/crypto.py:170 +msgid "IPSec Policy" +msgstr "Política IPSec" + +#: templates/vpn/ipsecpolicy.html:22 vpn/forms/bulk_edit.py:211 +#: vpn/models/crypto.py:181 +msgid "PFS group" +msgstr "Grupo PFS" + +#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:53 +msgid "IPSec Profile" +msgstr "Perfil IPSec" + +#: templates/vpn/ipsecprofile.html:94 vpn/tables/crypto.py:137 +msgid "PFS Group" +msgstr "Grupo PFS" + +#: templates/vpn/ipsecproposal.html:10 +msgid "IPSec Proposal" +msgstr "Propuesta de IPSec" + +#: templates/vpn/ipsecproposal.html:34 vpn/forms/bulk_edit.py:187 +#: vpn/models/crypto.py:140 +msgid "SA lifetime (KB)" +msgstr "Una vida útil (KB)" + +#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:10 +msgid "L2VPN Attributes" +msgstr "Atributos de L2VPN" + +#: templates/vpn/l2vpn.html:65 templates/vpn/tunnel.html:81 +msgid "Add a Termination" +msgstr "Agregar una terminación" + +#: templates/vpn/l2vpntermination_edit.html:9 +msgid "L2VPN Termination" +msgstr "Terminación de L2VPN" + +#: templates/vpn/tunnel.html:9 +msgid "Add Termination" +msgstr "Agregar terminación" + +#: templates/vpn/tunnel.html:38 vpn/forms/bulk_edit.py:48 +#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:56 +msgid "Encapsulation" +msgstr "Encapsulación" + +#: templates/vpn/tunnel.html:42 vpn/forms/bulk_edit.py:54 +#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:63 +#: vpn/models/crypto.py:238 vpn/tables/tunnels.py:47 +msgid "IPSec profile" +msgstr "Perfil IPSec" + +#: templates/vpn/tunnel.html:46 vpn/forms/bulk_edit.py:68 +#: vpn/forms/filtersets.py:67 +msgid "Tunnel ID" +msgstr "ID de túnel" + +#: templates/vpn/tunnelgroup.html:14 +msgid "Add Tunnel" +msgstr "Añadir túnel" + +#: templates/vpn/tunnelgroup.html:24 vpn/forms/model_forms.py:35 +#: vpn/forms/model_forms.py:48 +msgid "Tunnel Group" +msgstr "Grupo Tunnel" + +#: templates/vpn/tunneltermination.html:10 +msgid "Tunnel Termination" +msgstr "Terminación del túnel" + +#: templates/vpn/tunneltermination.html:36 vpn/forms/bulk_import.py:107 +#: vpn/forms/model_forms.py:101 vpn/forms/model_forms.py:137 +#: vpn/forms/model_forms.py:248 vpn/tables/tunnels.py:97 +msgid "Outside IP" +msgstr "IP externa" + +#: templates/vpn/tunneltermination.html:53 +msgid "Peer Terminations" +msgstr "Terminaciones de pares" + +#: templates/wireless/inc/authentication_attrs.html:13 +msgid "Cipher" +msgstr "Cifrar" + +#: templates/wireless/inc/authentication_attrs.html:17 +msgid "PSK" +msgstr "PSK" + +#: templates/wireless/inc/wirelesslink_interface.html:35 +#: templates/wireless/inc/wirelesslink_interface.html:45 +msgctxt "Abbreviation for megahertz" +msgid "MHz" +msgstr "megahercio" + +#: templates/wireless/wirelesslan.html:11 wireless/forms/model_forms.py:54 +msgid "Wireless LAN" +msgstr "LAN inalámbrica" + +#: templates/wireless/wirelesslan.html:59 +msgid "Attached Interfaces" +msgstr "Interfaces conectadas" + +#: templates/wireless/wirelesslangroup.html:17 +msgid "Add Wireless LAN" +msgstr "Agregar LAN inalámbrica" + +#: templates/wireless/wirelesslangroup.html:26 +#: wireless/forms/model_forms.py:27 +msgid "Wireless LAN Group" +msgstr "Grupo de LAN inalámbrica" + +#: templates/wireless/wirelesslangroup.html:64 +msgid "Add Wireless LAN Group" +msgstr "Agregar grupo de LAN inalámbrica" + +#: templates/wireless/wirelesslink.html:16 +msgid "Link Properties" +msgstr "Propiedades del enlace" + +#: tenancy/choices.py:19 +msgid "Tertiary" +msgstr "Terciario" + +#: tenancy/choices.py:20 +msgid "Inactive" +msgstr "Inactivo" + +#: tenancy/filtersets.py:29 tenancy/filtersets.py:55 tenancy/filtersets.py:97 +msgid "Contact group (ID)" +msgstr "Grupo de contactos (ID)" + +#: tenancy/filtersets.py:35 tenancy/filtersets.py:62 tenancy/filtersets.py:104 +msgid "Contact group (slug)" +msgstr "Grupo de contacto (slug)" + +#: tenancy/filtersets.py:91 +msgid "Contact (ID)" +msgstr "Contacto (ID)" + +#: tenancy/filtersets.py:108 +msgid "Contact role (ID)" +msgstr "Rol de contacto (ID)" + +#: tenancy/filtersets.py:114 +msgid "Contact role (slug)" +msgstr "Rol de contacto (babosa)" + +#: tenancy/filtersets.py:146 +msgid "Contact group" +msgstr "Grupo de contactos" + +#: tenancy/filtersets.py:157 tenancy/filtersets.py:176 +msgid "Tenant group (ID)" +msgstr "Grupo de inquilinos (ID)" + +#: tenancy/filtersets.py:209 +msgid "Tenant Group (ID)" +msgstr "Grupo de inquilinos (ID)" + +#: tenancy/filtersets.py:216 +msgid "Tenant Group (slug)" +msgstr "Grupo de inquilinos (babosa)" + +#: tenancy/forms/bulk_edit.py:65 +msgid "Desciption" +msgstr "Descripción" + +#: tenancy/forms/bulk_import.py:101 +msgid "Assigned contact" +msgstr "Contacto asignado" + +#: tenancy/models/contacts.py:32 +msgid "contact group" +msgstr "grupo de contacto" + +#: tenancy/models/contacts.py:33 +msgid "contact groups" +msgstr "grupos de contacto" + +#: tenancy/models/contacts.py:48 +msgid "contact role" +msgstr "rol de contacto" + +#: tenancy/models/contacts.py:49 +msgid "contact roles" +msgstr "roles de contacto" + +#: tenancy/models/contacts.py:68 +msgid "title" +msgstr "título" + +#: tenancy/models/contacts.py:73 +msgid "phone" +msgstr "llamar por teléfono" + +#: tenancy/models/contacts.py:78 +msgid "email" +msgstr "correo electrónico" + +#: tenancy/models/contacts.py:87 +msgid "link" +msgstr "eslabón" + +#: tenancy/models/contacts.py:103 +msgid "contact" +msgstr "contacto" + +#: tenancy/models/contacts.py:104 +msgid "contacts" +msgstr "contactos" + +#: tenancy/models/contacts.py:153 +msgid "contact assignment" +msgstr "asignación de contactos" + +#: tenancy/models/contacts.py:154 +msgid "contact assignments" +msgstr "asignaciones de contactos" + +#: tenancy/models/contacts.py:170 +#, python-brace-format +msgid "Contacts cannot be assigned to this object type ({type})." +msgstr "No se pueden asignar contactos a este tipo de objeto ({type})." + +#: tenancy/models/tenants.py:32 +msgid "tenant group" +msgstr "grupo de inquilinos" + +#: tenancy/models/tenants.py:33 +msgid "tenant groups" +msgstr "grupos de inquilinos" + +#: tenancy/models/tenants.py:70 +msgid "Tenant name must be unique per group." +msgstr "El nombre del inquilino debe ser único por grupo." + +#: tenancy/models/tenants.py:80 +msgid "Tenant slug must be unique per group." +msgstr "La babosa del inquilino debe ser única por grupo." + +#: tenancy/models/tenants.py:88 +msgid "tenant" +msgstr "inquilino" + +#: tenancy/models/tenants.py:89 +msgid "tenants" +msgstr "inquilinos" + +#: tenancy/tables/contacts.py:112 +msgid "Contact Title" +msgstr "Título del contacto" + +#: tenancy/tables/contacts.py:116 +msgid "Contact Phone" +msgstr "Teléfono de contacto" + +#: tenancy/tables/contacts.py:120 +msgid "Contact Email" +msgstr "Correo electrónico de contacto" + +#: tenancy/tables/contacts.py:124 +msgid "Contact Address" +msgstr "Dirección de contacto" + +#: tenancy/tables/contacts.py:128 +msgid "Contact Link" +msgstr "Enlace de contacto" + +#: tenancy/tables/contacts.py:132 +msgid "Contact Description" +msgstr "Descripción del contacto" + +#: users/filtersets.py:48 users/filtersets.py:151 +msgid "Group (name)" +msgstr "Grupo (nombre)" + +#: users/forms/bulk_edit.py:24 +msgid "First name" +msgstr "Nombre de pila" + +#: users/forms/bulk_edit.py:29 +msgid "Last name" +msgstr "Apellido" + +#: users/forms/bulk_edit.py:41 +msgid "Staff status" +msgstr "Situación del personal" + +#: users/forms/bulk_edit.py:46 +msgid "Superuser status" +msgstr "Estado de superusuario" + +#: users/forms/bulk_import.py:43 +msgid "If no key is provided, one will be generated automatically." +msgstr "Si no se proporciona ninguna clave, se generará una automáticamente." + +#: users/forms/filtersets.py:52 users/tables.py:42 +msgid "Is Staff" +msgstr "Es personal" + +#: users/forms/filtersets.py:59 users/tables.py:45 +msgid "Is Superuser" +msgstr "Es superusuario" + +#: users/forms/filtersets.py:92 users/tables.py:89 +msgid "Can View" +msgstr "Puede ver" + +#: users/forms/filtersets.py:99 users/tables.py:92 +msgid "Can Add" +msgstr "Puede agregar" + +#: users/forms/filtersets.py:106 users/tables.py:95 +msgid "Can Change" +msgstr "Puede cambiar" + +#: users/forms/filtersets.py:113 users/tables.py:98 +msgid "Can Delete" +msgstr "Puede eliminar" + +#: users/forms/model_forms.py:58 +msgid "User Interface" +msgstr "Interfaz de usuario" + +#: users/forms/model_forms.py:115 +msgid "" +"Keys must be at least 40 characters in length. Be sure to record " +"your key prior to submitting this form, as it may no longer be " +"accessible once the token has been created." +msgstr "" +"Las claves deben tener al menos 40 caracteres. Asegúrese de grabar " +"su clave antes de enviar este formulario, ya que es posible que ya " +"no se pueda acceder a él una vez que se haya creado el token." + +#: users/forms/model_forms.py:127 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" +" no restrictions. Example: " +"10.1.1.0/24,192.168.10.16/32,2001:db8:1::/64" +msgstr "" +"Redes IPv4/IPv6 permitidas desde las que se puede usar el token. Déjelo en " +"blanco para que no haya restricciones. Ejemplo: 10.1.1.0/24, " +"192.168.10.16/32, 2001:db 8:1: :/64" + +#: users/forms/model_forms.py:176 +msgid "Confirm password" +msgstr "Confirme la contraseña" + +#: users/forms/model_forms.py:179 +msgid "Enter the same password as before, for verification." +msgstr "Introduce la misma contraseña que antes para verificarla." + +#: users/forms/model_forms.py:237 +msgid "Passwords do not match! Please check your input and try again." +msgstr "" +"¡Las contraseñas no coinciden! Compruebe los datos introducidos e inténtelo " +"de nuevo." + +#: users/forms/model_forms.py:303 +msgid "Additional actions" +msgstr "Acciones adicionales" + +#: users/forms/model_forms.py:306 +msgid "Actions granted in addition to those listed above" +msgstr "Acciones concedidas además de las enumeradas anteriormente" + +#: users/forms/model_forms.py:322 +msgid "Objects" +msgstr "Objetos" + +#: users/forms/model_forms.py:334 +msgid "" +"JSON expression of a queryset filter that will return only permitted " +"objects. Leave null to match all objects of this type. A list of multiple " +"objects will result in a logical OR operation." +msgstr "" +"Expresión JSON de un filtro de conjunto de consultas que devolverá solo los " +"objetos permitidos. Deje nulo para que coincida con todos los objetos de " +"este tipo. Una lista de varios objetos dará como resultado una operación OR " +"lógica." + +#: users/forms/model_forms.py:372 +msgid "At least one action must be selected." +msgstr "Debe seleccionarse al menos una acción." + +#: users/forms/model_forms.py:389 +#, python-brace-format +msgid "Invalid filter for {model}: {error}" +msgstr "Filtro no válido para {model}: {error}" + +#: users/models.py:54 +msgid "user" +msgstr "usuario" + +#: users/models.py:55 +msgid "users" +msgstr "usuarios" + +#: users/models.py:66 +msgid "A user with this username already exists." +msgstr "Ya existe un usuario con este nombre de usuario." + +#: users/models.py:78 vpn/models/crypto.py:42 +msgid "group" +msgstr "grupo" + +#: users/models.py:79 +msgid "groups" +msgstr "grupos" + +#: users/models.py:106 users/models.py:107 +msgid "user preferences" +msgstr "preferencias de usuario" + +#: users/models.py:174 +#, python-brace-format +msgid "Key '{path}' is a leaf node; cannot assign new keys" +msgstr "Clave '{path}'es un nodo de hoja; no se pueden asignar claves nuevas" + +#: users/models.py:186 +#, python-brace-format +msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" +msgstr "" +"Clave '{path}'es un diccionario; no puede asignar un valor que no sea de " +"diccionario" + +#: users/models.py:252 +msgid "expires" +msgstr "caduca" + +#: users/models.py:257 +msgid "last used" +msgstr "utilizado por última vez" + +#: users/models.py:262 +msgid "key" +msgstr "clave" + +#: users/models.py:268 +msgid "write enabled" +msgstr "escritura habilitada" + +#: users/models.py:270 +msgid "Permit create/update/delete operations using this key" +msgstr "" +"Permitir operaciones de creación/actualización/eliminación con esta clave" + +#: users/models.py:281 +msgid "allowed IPs" +msgstr "IP permitidas" + +#: users/models.py:283 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" +" no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" +msgstr "" +"Redes IPv4/IPv6 permitidas desde las que se puede usar el token. Déjelo en " +"blanco para que no haya restricciones. Por ejemplo: «10.1.1.0/24, " +"192.168.10.16/32, 2001:DB 8:1: :/64\"" + +#: users/models.py:291 +msgid "token" +msgstr "simbólico" + +#: users/models.py:292 +msgid "tokens" +msgstr "fichas" + +#: users/models.py:373 +msgid "The list of actions granted by this permission" +msgstr "La lista de acciones concedidas por este permiso" + +#: users/models.py:378 +msgid "constraints" +msgstr "restricciones" + +#: users/models.py:379 +msgid "" +"Queryset filter matching the applicable objects of the selected type(s)" +msgstr "" +"Filtro Queryset que coincide con los objetos aplicables de los tipos " +"seleccionados" + +#: users/models.py:386 +msgid "permission" +msgstr "permiso" + +#: users/models.py:387 +msgid "permissions" +msgstr "permisos" + +#: users/tables.py:101 +msgid "Custom Actions" +msgstr "Acciones personalizadas" + +#: utilities/choices.py:16 +#, python-brace-format +msgid "{name} has a key defined but CHOICES is not a list" +msgstr "{name} tiene una clave definida, pero CHOICES no es una lista" + +#: utilities/choices.py:135 +msgid "Dark Red" +msgstr "rojo oscuro" + +#: utilities/choices.py:138 +msgid "Rose" +msgstr "Rosa" + +#: utilities/choices.py:139 +msgid "Fuchsia" +msgstr "Fucsia" + +#: utilities/choices.py:141 +msgid "Dark Purple" +msgstr "Púrpura oscuro" + +#: utilities/choices.py:144 +msgid "Light Blue" +msgstr "Azul claro" + +#: utilities/choices.py:147 +msgid "Aqua" +msgstr "Aguamarina" + +#: utilities/choices.py:148 +msgid "Dark Green" +msgstr "Verde oscuro" + +#: utilities/choices.py:150 +msgid "Light Green" +msgstr "Verde claro" + +#: utilities/choices.py:151 +msgid "Lime" +msgstr "Lima" + +#: utilities/choices.py:153 +msgid "Amber" +msgstr "Ámbar" + +#: utilities/choices.py:155 +msgid "Dark Orange" +msgstr "Naranja oscuro" + +#: utilities/choices.py:156 +msgid "Brown" +msgstr "Marrón" + +#: utilities/choices.py:157 +msgid "Light Grey" +msgstr "Gris claro" + +#: utilities/choices.py:158 +msgid "Grey" +msgstr "Gris" + +#: utilities/choices.py:159 +msgid "Dark Grey" +msgstr "Gris oscuro" + +#: utilities/choices.py:217 +msgid "Direct" +msgstr "Directo" + +#: utilities/choices.py:218 +msgid "Upload" +msgstr "Cargar" + +#: utilities/choices.py:230 utilities/choices.py:244 +msgid "Auto-detect" +msgstr "Detección automática" + +#: utilities/choices.py:245 +msgid "Comma" +msgstr "Coma" + +#: utilities/choices.py:246 +msgid "Semicolon" +msgstr "Punto y coma" + +#: utilities/choices.py:247 +msgid "Tab" +msgstr "Pestaña" + +#: utilities/error_handlers.py:20 +#, python-brace-format +msgid "" +"Unable to delete {objects}. {count} dependent objects were " +"found: " +msgstr "" +"No se puede eliminar {objects}. {count} se encontraron " +"objetos dependientes: " + +#: utilities/error_handlers.py:22 +msgid "More than 50" +msgstr "Más de 50" + +#: utilities/fields.py:162 +#, python-format +msgid "" +"%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " +"in the format 'app.model'" +msgstr "" +"%s(%r) no es válido. El parámetro to_model de CounterCacheField debe ser una" +" cadena con el formato 'app.model'" + +#: utilities/fields.py:172 +#, python-format +msgid "" +"%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " +"in the format 'field'" +msgstr "" +"%s(%r) no es válido. El parámetro to_field de CounterCacheField debe ser una" +" cadena con el formato 'campo'" + +#: utilities/forms/bulk_import.py:24 +msgid "Enter object data in CSV, JSON or YAML format." +msgstr "Introduzca los datos del objeto en formato CSV, JSON o YAML." + +#: utilities/forms/bulk_import.py:37 +msgid "CSV delimiter" +msgstr "Delimitador CSV" + +#: utilities/forms/bulk_import.py:38 +msgid "The character which delimits CSV fields. Applies only to CSV format." +msgstr "" +"El carácter que delimita los campos CSV. Se aplica solo al formato CSV." + +#: utilities/forms/bulk_import.py:101 +msgid "Unable to detect data format. Please specify." +msgstr "No se pudo detectar el formato de los datos. Especifique." + +#: utilities/forms/bulk_import.py:124 +msgid "Invalid CSV delimiter" +msgstr "Delimitador CSV no válido" + +#: utilities/forms/bulk_import.py:168 +msgid "" +"Invalid YAML data. Data must be in the form of multiple documents, or a " +"single document comprising a list of dictionaries." +msgstr "" +"Datos YAML no válidos. Los datos deben estar en forma de varios documentos o" +" de un solo documento que contenga una lista de diccionarios." + +#: utilities/forms/fields/array.py:17 +#, python-brace-format +msgid "" +"Invalid list ({value}). Must be numeric and ranges must be in ascending " +"order." +msgstr "" +"Lista no válida ({value}). Debe ser numérico y los rangos deben estar en " +"orden ascendente." + +#: utilities/forms/fields/csv.py:44 +#, python-brace-format +msgid "Invalid value for a multiple choice field: {value}" +msgstr "Valor no válido para un campo de opción múltiple: {value}" + +#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:74 +#, python-format +msgid "Object not found: %(value)s" +msgstr "Objeto no encontrado: %(value)s" + +#: utilities/forms/fields/csv.py:65 +#, python-brace-format +msgid "" +"\"{value}\" is not a unique value for this field; multiple objects were " +"found" +msgstr "" +"«{value}\"no es un valor único para este campo; se han encontrado varios " +"objetos" + +#: utilities/forms/fields/csv.py:97 +msgid "Object type must be specified as \".\"" +msgstr "El tipo de objeto debe especificarse como».»" + +#: utilities/forms/fields/csv.py:101 +msgid "Invalid object type" +msgstr "Tipo de objeto no válido" + +#: utilities/forms/fields/expandable.py:25 +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9])." +msgstr "" +"Los rangos alfanuméricos son compatibles para la creación masiva. No se " +"admiten casos y tipos mixtos dentro de un único rango (por ejemplo: " +"[Edad, sexo] -0/0/ [0-9])." + +#: utilities/forms/fields/expandable.py:46 +msgid "" +"Specify a numeric range to create multiple IPs.
    Example: " +"192.0.2.[1,5,100-254]/24" +msgstr "" +"Especifique un rango numérico para crear varias direcciones IP.
    Ejemplo: 192.0.2. [1,5,100-254] /24" + +#: utilities/forms/fields/fields.py:31 +#, python-brace-format +msgid "" +" Markdown syntax is supported" +msgstr "" +" Markdown se admite la sintaxis" + +#: utilities/forms/fields/fields.py:48 +msgid "URL-friendly unique shorthand" +msgstr "Abreviatura única compatible con URL" + +#: utilities/forms/fields/fields.py:99 +msgid "Enter context data in JSON format." +msgstr "" +"Introduzca los datos de contexto en JSON " +"formato." + +#: utilities/forms/fields/fields.py:117 +msgid "MAC address must be in EUI-48 format" +msgstr "La dirección MAC debe estar en formato EUI-48" + +#: utilities/forms/forms.py:53 +msgid "Use regular expressions" +msgstr "Usa expresiones regulares" + +#: utilities/forms/forms.py:87 +#, python-brace-format +msgid "Unrecognized header: {name}" +msgstr "Encabezado no reconocido: {name}" + +#: utilities/forms/forms.py:113 +msgid "Available Columns" +msgstr "Columnas disponibles" + +#: utilities/forms/forms.py:121 +msgid "Selected Columns" +msgstr "Columnas seleccionadas" + +#: utilities/forms/mixins.py:101 +msgid "" +"This object has been modified since the form was rendered. Please consult " +"the object's change log for details." +msgstr "" +"Este objeto se ha modificado desde que se renderizó el formulario. Consulte " +"el registro de cambios del objeto para obtener más información." + +#: utilities/templates/builtins/customfield_value.html:30 +msgid "Not defined" +msgstr "No definido" + +#: utilities/templates/buttons/bookmark.html:9 +msgid "Unbookmark" +msgstr "Desmarcar" + +#: utilities/templates/buttons/bookmark.html:13 +msgid "Bookmark" +msgstr "Marcador" + +#: utilities/templates/buttons/clone.html:4 +msgid "Clone" +msgstr "Clon" + +#: utilities/templates/buttons/export.html:4 +msgid "Export" +msgstr "Exportación" + +#: utilities/templates/buttons/export.html:7 +msgid "Current View" +msgstr "Vista actual" + +#: utilities/templates/buttons/export.html:8 +msgid "All Data" +msgstr "Todos los datos" + +#: utilities/templates/buttons/export.html:28 +msgid "Add export template" +msgstr "Añadir plantilla de exportación" + +#: utilities/templates/buttons/import.html:4 +msgid "Import" +msgstr "Importar" + +#: utilities/templates/form_helpers/render_field.html:36 +msgid "Copy to clipboard" +msgstr "Copiar al portapapeles" + +#: utilities/templates/form_helpers/render_field.html:52 +msgid "This field is required" +msgstr "Este campo es obligatorio" + +#: utilities/templates/form_helpers/render_field.html:65 +msgid "Set Null" +msgstr "Establecer nulo" + +#: utilities/templates/helpers/applied_filters.html:11 +msgid "Clear all" +msgstr "Borrar todo" + +#: utilities/templates/helpers/table_config_form.html:8 +msgid "Table Configuration" +msgstr "Configuración de tablas" + +#: utilities/templates/helpers/table_config_form.html:31 +msgid "Move Up" +msgstr "Muévete hacia arriba" + +#: utilities/templates/helpers/table_config_form.html:34 +msgid "Move Down" +msgstr "Muévete hacia abajo" + +#: utilities/templates/widgets/apiselect.html:7 +msgid "Open selector" +msgstr "Selector abierto" + +#: utilities/templates/widgets/clearable_file_input.html:12 +msgid "None assigned" +msgstr "No se ha asignado ninguno" + +#: utilities/templates/widgets/markdown_input.html:6 +msgid "Write" +msgstr "Escribe" + +#: utilities/templates/widgets/markdown_input.html:20 +msgid "Testing" +msgstr "Probando" + +#: virtualization/filtersets.py:79 +msgid "Parent group (ID)" +msgstr "Grupo de padres (ID)" + +#: virtualization/filtersets.py:85 +msgid "Parent group (slug)" +msgstr "Grupo de padres (babosas)" + +#: virtualization/filtersets.py:89 virtualization/filtersets.py:140 +msgid "Cluster type (ID)" +msgstr "Tipo de clúster (ID)" + +#: virtualization/filtersets.py:129 +msgid "Cluster group (ID)" +msgstr "Grupo de clústeres (ID)" + +#: virtualization/filtersets.py:150 virtualization/filtersets.py:265 +msgid "Cluster (ID)" +msgstr "Clúster (ID)" + +#: virtualization/forms/bulk_edit.py:165 +#: virtualization/models/virtualmachines.py:113 +msgid "vCPUs" +msgstr "CPU virtuales" + +#: virtualization/forms/bulk_edit.py:169 +msgid "Memory (MB)" +msgstr "Memoria (MB)" + +#: virtualization/forms/bulk_edit.py:173 +msgid "Disk (GB)" +msgstr "Disco (GB)" + +#: virtualization/forms/bulk_edit.py:333 +#: virtualization/forms/filtersets.py:243 +msgid "Size (GB)" +msgstr "Tamaño (GB)" + +#: virtualization/forms/bulk_import.py:44 +msgid "Type of cluster" +msgstr "Tipo de clúster" + +#: virtualization/forms/bulk_import.py:51 +msgid "Assigned cluster group" +msgstr "Grupo de clústeres asignado" + +#: virtualization/forms/bulk_import.py:96 +msgid "Assigned cluster" +msgstr "Clúster asignado" + +#: virtualization/forms/bulk_import.py:103 +msgid "Assigned device within cluster" +msgstr "Dispositivo asignado dentro del clúster" + +#: virtualization/forms/model_forms.py:156 +#, python-brace-format +msgid "" +"{device} belongs to a different site ({device_site}) than the cluster " +"({cluster_site})" +msgstr "" +"{device} pertenece a un sitio diferente ({device_site}) que el clúster " +"({cluster_site})" + +#: virtualization/forms/model_forms.py:195 +msgid "Optionally pin this VM to a specific host device within the cluster" +msgstr "" +"Si lo desea, puede anclar esta máquina virtual a un dispositivo host " +"específico dentro del clúster" + +#: virtualization/forms/model_forms.py:224 +msgid "Site/Cluster" +msgstr "Sitio/Clúster" + +#: virtualization/forms/model_forms.py:247 +msgid "Disk size is managed via the attachment of virtual disks." +msgstr "" +"El tamaño del disco se administra mediante la conexión de discos virtuales." + +#: virtualization/forms/model_forms.py:375 +msgid "Disk" +msgstr "Disco" + +#: virtualization/models/clusters.py:25 +msgid "cluster type" +msgstr "tipo de clúster" + +#: virtualization/models/clusters.py:26 +msgid "cluster types" +msgstr "tipos de clústeres" + +#: virtualization/models/clusters.py:45 +msgid "cluster group" +msgstr "grupo de clústeres" + +#: virtualization/models/clusters.py:46 +msgid "cluster groups" +msgstr "grupos de clústeres" + +#: virtualization/models/clusters.py:121 +msgid "cluster" +msgstr "racimo" + +#: virtualization/models/clusters.py:122 +msgid "clusters" +msgstr "racimos" + +#: virtualization/models/clusters.py:141 +#, python-brace-format +msgid "" +"{count} devices are assigned as hosts for this cluster but are not in site " +"{site}" +msgstr "" +"{count} los dispositivos se asignan como hosts para este clúster, pero no " +"están en el sitio {site}" + +#: virtualization/models/virtualmachines.py:121 +msgid "memory (MB)" +msgstr "memoria (MB)" + +#: virtualization/models/virtualmachines.py:126 +msgid "disk (GB)" +msgstr "disco (GB)" + +#: virtualization/models/virtualmachines.py:159 +msgid "Virtual machine name must be unique per cluster." +msgstr "El nombre de la máquina virtual debe ser único por clúster." + +#: virtualization/models/virtualmachines.py:162 +msgid "virtual machine" +msgstr "máquina virtual" + +#: virtualization/models/virtualmachines.py:163 +msgid "virtual machines" +msgstr "máquinas virtuales" + +#: virtualization/models/virtualmachines.py:177 +msgid "A virtual machine must be assigned to a site and/or cluster." +msgstr "Se debe asignar una máquina virtual a un sitio o clúster." + +#: virtualization/models/virtualmachines.py:184 +#, python-brace-format +msgid "" +"The selected cluster ({cluster}) is not assigned to this site ({site})." +msgstr "" +"El clúster seleccionado ({cluster}) no está asignado a este sitio ({site})." + +#: virtualization/models/virtualmachines.py:191 +msgid "Must specify a cluster when assigning a host device." +msgstr "Debe especificar un clúster al asignar un dispositivo host." + +#: virtualization/models/virtualmachines.py:196 +#, python-brace-format +msgid "" +"The selected device ({device}) is not assigned to this cluster ({cluster})." +msgstr "" +"El dispositivo seleccionado ({device}) no está asignado a este clúster " +"({cluster})." + +#: virtualization/models/virtualmachines.py:208 +#, python-brace-format +msgid "" +"The specified disk size ({size}) must match the aggregate size of assigned " +"virtual disks ({total_size})." +msgstr "" +"El tamaño de disco especificado ({size}) debe coincidir con el tamaño " +"agregado de los discos virtuales asignados ({total_size})." + +#: virtualization/models/virtualmachines.py:222 +#, python-brace-format +msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" +msgstr "" +"Debe ser un IPv{family} dirección. ({ip} es un IPv{version} dirección.)" + +#: virtualization/models/virtualmachines.py:231 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this VM." +msgstr "" +"La dirección IP especificada ({ip}) no está asignado a esta máquina virtual." + +#: virtualization/models/virtualmachines.py:389 +#, python-brace-format +msgid "" +"The selected parent interface ({parent}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "" +"La interfaz principal seleccionada ({parent}) pertenece a una máquina " +"virtual diferente ({virtual_machine})." + +#: virtualization/models/virtualmachines.py:404 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "" +"La interfaz de puente seleccionada ({bridge}) pertenece a una máquina " +"virtual diferente ({virtual_machine})." + +#: virtualization/models/virtualmachines.py:415 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent virtual machine, or it must be global." +msgstr "" +"La VLAN sin etiquetar ({untagged_vlan}) debe pertenecer al mismo sitio que " +"la máquina virtual principal de la interfaz o debe ser global." + +#: virtualization/models/virtualmachines.py:427 +msgid "size (GB)" +msgstr "tamaño (GB)" + +#: virtualization/models/virtualmachines.py:431 +msgid "virtual disk" +msgstr "disco virtual" + +#: virtualization/models/virtualmachines.py:432 +msgid "virtual disks" +msgstr "discos virtuales" + +#: vpn/choices.py:31 +msgid "IPsec - Transport" +msgstr "IPSec - Transporte" + +#: vpn/choices.py:32 +msgid "IPsec - Tunnel" +msgstr "IPSec - Túnel" + +#: vpn/choices.py:33 +msgid "IP-in-IP" +msgstr "IP en IP" + +#: vpn/choices.py:34 +msgid "GRE" +msgstr "GRIS" + +#: vpn/choices.py:56 +msgid "Hub" +msgstr "Hub" + +#: vpn/choices.py:57 +msgid "Spoke" +msgstr "Habló" + +#: vpn/choices.py:80 +msgid "Aggressive" +msgstr "Agresivo" + +#: vpn/choices.py:81 +msgid "Main" +msgstr "Principal" + +#: vpn/choices.py:92 +msgid "Pre-shared keys" +msgstr "Claves previamente compartidas" + +#: vpn/choices.py:93 +msgid "Certificates" +msgstr "Certificados" + +#: vpn/choices.py:94 +msgid "RSA signatures" +msgstr "Firmas RSA" + +#: vpn/choices.py:95 +msgid "DSA signatures" +msgstr "Firmas de la DSA" + +#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 +#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 +#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 +#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 +#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 +#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 +#, python-brace-format +msgid "Group {n}" +msgstr "Grupo {n}" + +#: vpn/choices.py:240 +msgid "Ethernet Private LAN" +msgstr "LAN privada Ethernet" + +#: vpn/choices.py:241 +msgid "Ethernet Virtual Private LAN" +msgstr "LAN privada virtual Ethernet" + +#: vpn/choices.py:244 +msgid "Ethernet Private Tree" +msgstr "Árbol privado de Ethernet" + +#: vpn/choices.py:245 +msgid "Ethernet Virtual Private Tree" +msgstr "Árbol privado virtual de Ethernet" + +#: vpn/filtersets.py:41 +msgid "Tunnel group (ID)" +msgstr "Grupo de túneles (ID)" + +#: vpn/filtersets.py:47 +msgid "Tunnel group (slug)" +msgstr "Grupo de túneles (babosas)" + +#: vpn/filtersets.py:54 +msgid "IPSec profile (ID)" +msgstr "Perfil IPSec (ID)" + +#: vpn/filtersets.py:60 +msgid "IPSec profile (name)" +msgstr "Perfil IPSec (nombre)" + +#: vpn/filtersets.py:81 +msgid "Tunnel (ID)" +msgstr "Túnel (ID)" + +#: vpn/filtersets.py:87 +msgid "Tunnel (name)" +msgstr "Túnel (nombre)" + +#: vpn/filtersets.py:118 +msgid "Outside IP (ID)" +msgstr "IP externa (ID)" + +#: vpn/filtersets.py:235 +msgid "IKE policy (ID)" +msgstr "Política de IKE (ID)" + +#: vpn/filtersets.py:241 +msgid "IKE policy (name)" +msgstr "Política IKE (nombre)" + +#: vpn/filtersets.py:245 +msgid "IPSec policy (ID)" +msgstr "Política IPSec (ID)" + +#: vpn/filtersets.py:251 +msgid "IPSec policy (name)" +msgstr "Política IPSec (nombre)" + +#: vpn/filtersets.py:320 +msgid "L2VPN (slug)" +msgstr "VPN L2 (babosa)" + +#: vpn/filtersets.py:384 +msgid "VM Interface (ID)" +msgstr "Interfaz VM (ID)" + +#: vpn/filtersets.py:390 +msgid "VLAN (name)" +msgstr "VLAN (nombre)" + +#: vpn/forms/bulk_edit.py:44 vpn/forms/bulk_import.py:42 +#: vpn/forms/filtersets.py:53 +msgid "Tunnel group" +msgstr "Grupo de túneles" + +#: vpn/forms/bulk_edit.py:116 vpn/models/crypto.py:47 +msgid "SA lifetime" +msgstr "Toda una vida" + +#: vpn/forms/bulk_edit.py:150 wireless/forms/bulk_edit.py:78 +#: wireless/forms/bulk_edit.py:125 wireless/forms/filtersets.py:63 +#: wireless/forms/filtersets.py:97 +msgid "Pre-shared key" +msgstr "Clave previamente compartida" + +#: vpn/forms/bulk_edit.py:238 vpn/forms/bulk_import.py:234 +#: vpn/forms/filtersets.py:196 vpn/forms/model_forms.py:363 +#: vpn/models/crypto.py:103 +msgid "IKE policy" +msgstr "Política de IKE" + +#: vpn/forms/bulk_edit.py:243 vpn/forms/bulk_import.py:239 +#: vpn/forms/filtersets.py:201 vpn/forms/model_forms.py:367 +#: vpn/models/crypto.py:197 +msgid "IPSec policy" +msgstr "Política IPSec" + +#: vpn/forms/bulk_import.py:50 +msgid "Tunnel encapsulation" +msgstr "Encapsulación de túneles" + +#: vpn/forms/bulk_import.py:83 +msgid "Operational role" +msgstr "Función operativa" + +#: vpn/forms/bulk_import.py:90 +msgid "Parent device of assigned interface" +msgstr "Dispositivo principal de la interfaz asignada" + +#: vpn/forms/bulk_import.py:97 +msgid "Parent VM of assigned interface" +msgstr "VM principal de la interfaz asignada" + +#: vpn/forms/bulk_import.py:104 +msgid "Device or virtual machine interface" +msgstr "Interfaz de dispositivo o máquina virtual" + +#: vpn/forms/bulk_import.py:181 +msgid "IKE proposal(s)" +msgstr "Propuesta (s) de IKE" + +#: vpn/forms/bulk_import.py:211 vpn/models/crypto.py:185 +msgid "Diffie-Hellman group for Perfect Forward Secrecy" +msgstr "Grupo Diffie-Hellman para Perfect Forward Secrecy" + +#: vpn/forms/bulk_import.py:217 +msgid "IPSec proposal(s)" +msgstr "Propuestas de IPSec" + +#: vpn/forms/bulk_import.py:231 +msgid "IPSec protocol" +msgstr "Protocolo IPSec" + +#: vpn/forms/bulk_import.py:261 +msgid "L2VPN type" +msgstr "Tipo L2VPN" + +#: vpn/forms/bulk_import.py:282 +msgid "Parent device (for interface)" +msgstr "Dispositivo principal (para interfaz)" + +#: vpn/forms/bulk_import.py:289 +msgid "Parent virtual machine (for interface)" +msgstr "Máquina virtual principal (para interfaz)" + +#: vpn/forms/bulk_import.py:296 +msgid "Assigned interface (device or VM)" +msgstr "Interfaz asignada (dispositivo o máquina virtual)" + +#: vpn/forms/bulk_import.py:329 +msgid "Cannot import device and VM interface terminations simultaneously." +msgstr "" +"No se pueden importar las terminaciones de la interfaz de máquina virtual y " +"del dispositivo de forma simultánea." + +#: vpn/forms/bulk_import.py:331 +msgid "Each termination must specify either an interface or a VLAN." +msgstr "Cada terminación debe especificar una interfaz o una VLAN." + +#: vpn/forms/bulk_import.py:333 +msgid "Cannot assign both an interface and a VLAN." +msgstr "No se puede asignar una interfaz y una VLAN a la vez." + +#: vpn/forms/filtersets.py:127 +msgid "IKE version" +msgstr "Versión IKE" + +#: vpn/forms/filtersets.py:139 vpn/forms/filtersets.py:172 +#: vpn/forms/model_forms.py:293 vpn/forms/model_forms.py:328 +msgid "Proposal" +msgstr "Propuesta" + +#: vpn/forms/filtersets.py:247 +msgid "Assigned Object Type" +msgstr "Tipo de objeto asignado" + +#: vpn/forms/model_forms.py:147 +msgid "First Termination" +msgstr "Primera rescisión" + +#: vpn/forms/model_forms.py:151 +msgid "Second Termination" +msgstr "Segunda terminación" + +#: vpn/forms/model_forms.py:198 +msgid "This parameter is required when defining a termination." +msgstr "Este parámetro es obligatorio para definir una terminación." + +#: vpn/forms/model_forms.py:314 vpn/forms/model_forms.py:349 +msgid "Policy" +msgstr "Política" + +#: vpn/forms/model_forms.py:469 +msgid "A termination must specify an interface or VLAN." +msgstr "Una terminación debe especificar una interfaz o VLAN." + +#: vpn/forms/model_forms.py:471 +msgid "" +"A termination can only have one terminating object (an interface or VLAN)." +msgstr "" +"Una terminación solo puede tener un objeto de terminación (una interfaz o " +"VLAN)." + +#: vpn/models/crypto.py:33 +msgid "encryption algorithm" +msgstr "algoritmo de cifrado" + +#: vpn/models/crypto.py:37 +msgid "authentication algorithm" +msgstr "algoritmo de autenticación" + +#: vpn/models/crypto.py:44 +msgid "Diffie-Hellman group ID" +msgstr "ID de grupo Diffie-Hellman" + +#: vpn/models/crypto.py:50 +msgid "Security association lifetime (in seconds)" +msgstr "Duración de la asociación de seguridad (en segundos)" + +#: vpn/models/crypto.py:59 +msgid "IKE proposal" +msgstr "Propuesta IKE" + +#: vpn/models/crypto.py:60 +msgid "IKE proposals" +msgstr "Propuestas de IKE" + +#: vpn/models/crypto.py:76 +msgid "version" +msgstr "versión" + +#: vpn/models/crypto.py:87 vpn/models/crypto.py:178 +msgid "proposals" +msgstr "propuestas" + +#: vpn/models/crypto.py:90 wireless/models.py:38 +msgid "pre-shared key" +msgstr "clave previamente compartida" + +#: vpn/models/crypto.py:104 +msgid "IKE policies" +msgstr "Políticas de IKE" + +#: vpn/models/crypto.py:124 +msgid "encryption" +msgstr "cifrado" + +#: vpn/models/crypto.py:129 +msgid "authentication" +msgstr "autenticación" + +#: vpn/models/crypto.py:137 +msgid "Security association lifetime (seconds)" +msgstr "Duración de la asociación de seguridad (segundos)" + +#: vpn/models/crypto.py:143 +msgid "Security association lifetime (in kilobytes)" +msgstr "Duración de la asociación de seguridad (en kilobytes)" + +#: vpn/models/crypto.py:152 +msgid "IPSec proposal" +msgstr "Propuesta de IPSec" + +#: vpn/models/crypto.py:153 +msgid "IPSec proposals" +msgstr "Propuestas de IPSec" + +#: vpn/models/crypto.py:166 +msgid "Encryption and/or authentication algorithm must be defined" +msgstr "Debe definirse un algoritmo de cifrado y/o autenticación" + +#: vpn/models/crypto.py:198 +msgid "IPSec policies" +msgstr "Políticas IPSec" + +#: vpn/models/crypto.py:239 +msgid "IPSec profiles" +msgstr "Perfiles IPSec" + +#: vpn/models/l2vpn.py:116 +msgid "L2VPN termination" +msgstr "Terminación de L2VPN" + +#: vpn/models/l2vpn.py:117 +msgid "L2VPN terminations" +msgstr "Terminaciones de L2VPN" + +#: vpn/models/l2vpn.py:135 +#, python-brace-format +msgid "L2VPN Termination already assigned ({assigned_object})" +msgstr "La terminación de L2VPN ya está asignada ({assigned_object})" + +#: vpn/models/l2vpn.py:147 +#, python-brace-format +msgid "" +"{l2vpn_type} L2VPNs cannot have more than two terminations; found " +"{terminations_count} already defined." +msgstr "" +"{l2vpn_type} Las VPN de nivel 2 no pueden tener más de dos terminaciones; se" +" encuentran {terminations_count} ya definido." + +#: vpn/models/tunnels.py:26 +msgid "tunnel group" +msgstr "grupo de túneles" + +#: vpn/models/tunnels.py:27 +msgid "tunnel groups" +msgstr "grupos de túneles" + +#: vpn/models/tunnels.py:53 +msgid "encapsulation" +msgstr "encapsulamiento" + +#: vpn/models/tunnels.py:72 +msgid "tunnel ID" +msgstr "ID de túnel" + +#: vpn/models/tunnels.py:94 +msgid "tunnel" +msgstr "túnel" + +#: vpn/models/tunnels.py:95 +msgid "tunnels" +msgstr "túneles" + +#: vpn/models/tunnels.py:153 +msgid "An object may be terminated to only one tunnel at a time." +msgstr "Un objeto solo puede terminar en un túnel a la vez." + +#: vpn/models/tunnels.py:156 +msgid "tunnel termination" +msgstr "terminación de túnel" + +#: vpn/models/tunnels.py:157 +msgid "tunnel terminations" +msgstr "terminaciones de túneles" + +#: vpn/models/tunnels.py:174 +#, python-brace-format +msgid "{name} is already attached to a tunnel ({tunnel})." +msgstr "{name} ya está conectado a un túnel ({tunnel})." + +#: vpn/tables/crypto.py:22 +msgid "Authentication Method" +msgstr "Método de autenticación" + +#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +msgid "Encryption Algorithm" +msgstr "Algoritmo de cifrado" + +#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +msgid "Authentication Algorithm" +msgstr "Algoritmo de autenticación" + +#: vpn/tables/crypto.py:34 +msgid "SA Lifetime" +msgstr "Toda una vida" + +#: vpn/tables/crypto.py:71 +msgid "Pre-shared Key" +msgstr "Clave previamente compartida" + +#: vpn/tables/crypto.py:103 +msgid "SA Lifetime (Seconds)" +msgstr "Una vida útil (segundos)" + +#: vpn/tables/crypto.py:106 +msgid "SA Lifetime (KB)" +msgstr "SA Lifetime (KB)" + +#: vpn/tables/l2vpn.py:69 +msgid "Object Parent" +msgstr "Objeto principal" + +#: vpn/tables/l2vpn.py:74 +msgid "Object Site" +msgstr "Sitio del objeto" + +#: vpn/tables/tunnels.py:84 +msgid "Host" +msgstr "Anfitrión" + +#: wireless/choices.py:11 +msgid "Access point" +msgstr "Punto de acceso" + +#: wireless/choices.py:12 +msgid "Station" +msgstr "Estación" + +#: wireless/choices.py:467 +msgid "Open" +msgstr "Abrir" + +#: wireless/choices.py:469 +msgid "WPA Personal (PSK)" +msgstr "WPA Personal (PSK)" + +#: wireless/choices.py:470 +msgid "WPA Enterprise" +msgstr "Empresa WPA" + +#: wireless/forms/bulk_edit.py:72 wireless/forms/bulk_edit.py:119 +#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 +#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 +#: wireless/forms/filtersets.py:58 wireless/forms/filtersets.py:92 +msgid "Authentication cipher" +msgstr "Cifrado de autenticación" + +#: wireless/forms/bulk_import.py:52 +msgid "Bridged VLAN" +msgstr "VLAN puenteada" + +#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:27 +msgid "Interface A" +msgstr "Interfaz A" + +#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:36 +msgid "Interface B" +msgstr "Interfaz B" + +#: wireless/forms/model_forms.py:158 +msgid "Side B" +msgstr "Lado B" + +#: wireless/models.py:30 +msgid "authentication cipher" +msgstr "cifrado de autenticación" + +#: wireless/models.py:68 +msgid "wireless LAN group" +msgstr "grupo LAN inalámbrico" + +#: wireless/models.py:69 +msgid "wireless LAN groups" +msgstr "grupos LAN inalámbricos" + +#: wireless/models.py:115 +msgid "wireless LAN" +msgstr "LAN inalámbrica" + +#: wireless/models.py:143 +msgid "interface A" +msgstr "interfaz A" + +#: wireless/models.py:150 +msgid "interface B" +msgstr "interfaz B" + +#: wireless/models.py:198 +msgid "wireless link" +msgstr "enlace inalámbrico" + +#: wireless/models.py:199 +msgid "wireless links" +msgstr "enlaces inalámbricos" + +#: wireless/models.py:216 wireless/models.py:222 +#, python-brace-format +msgid "{type} is not a wireless interface." +msgstr "{type} no es una interfaz inalámbrica." diff --git a/netbox/translations/fr/LC_MESSAGES/django.mo b/netbox/translations/fr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..daded1363f105d2626d678a3f72fc70e00cff1ea GIT binary patch literal 201516 zcmYh@3AENz`?&FQPJ;$CC@RuP^E?kqgXVcwQj|20l0wENGKE43Wk?}JC~2Sw74lMu z5Q!9uqLkr(U1#6_wSKK-ecrvld${+#_x?W5Iq`m7H1`7;{CTiIM#ee#exHnt(x+!+ z-0+OG85xJa&B&;PzadRBN`9A-aRHXc&UiUqj?d#TEVMTxBOgx2ig**AicjGwxDpvY z(Tp5uWiwMg~jB=#0Jb zF&u|Su^kTiF(YFnK7*~X=>BA1tV?-e_yJx_Ipe2{j0VsjJK#O&e4j@-`#_3g6n3Ki zO011*u@3$mo_jEj(<8hUtMGgsR>B{`(|=C&4Y3vVgVB6Hi4|}U7Qno}qcoOqs zv0pPXPQ$a&d8?ptG{jS|MLchhg(zPX4nx~bM#s4c3*szvy!*n%QU5$T-WoK|8_|A8 z(Dk1{`~8cKbLt_^2A060SRJiz5q8GYDfdIyJse%vwNbtg&DWDy2ww;{U|Gr^qT?No z`oGcfPCcCRa5h@5jLzQ(9j_A>!i&OTXuHYixtkgFucL8ojpw`3{s+;#{TcQDMg8f& zrTUWSc;}(*>tJEL0G+pM)L)8@Gcuk}MDsO0oCAz;`(D6Tw@;)p=`FAuQ zxqnaX3Zwf`8cSleD7Qu1^+x9#gvK=qjb{dWuJ6L4I5&I>&!_wvHpJht7FIcu%KfoA z<$KX{vL20dGdlhbG#}q%Q9OjslXW!3n-AUB;%L4aq0c*@_oy4%|6;rhuZZ#{biNPJ zJnTf*@go}VVYGkMKT(Kl5I+~}?a4zn}$8gG@+&Mh!SQ@8# z*b*P5z7O`o-?0z2J)Z8#LUcWkqwy_6^Y|kAzWFiA<^M|WqXAfv`dR2YoF7Cr4*mRi5eMOF^cLVwWTWv_MCYxB zK0hCgs}(lEE@(Wrq3s?)$9*<@30qKpEj*5{zj5xguD0kt_lxp)^q$^==J{4MKaZf} zKaI}6D(c@v$9q5A75)$&LHlLoN#mZ5j#mt;Vs_XWjeAOXBbvvVXnr3+&&i|V(`Y_k zM*FS9X80CX!_2&y8BMVUmc~(75pP4!;|q8m?m+kb7?#H-r=pGDWT5*_~s zH18+SbCKuN6nDX}1R75Tbevk~y=@WCyP@$6K-WDA-G|9&e2?H@d<>pkLTTN_!cypZv%{+BI_hIP?1JWLUOayYjqgcxzUAnAuc3K*C+c@b{deJE^nLO# zdJc*dPVFnA<1|3yZH2C<4?6BhH0~+ryf>rq+=j0I?x-_*7cXxOo>W`!2 zoN{Ke7}~CElxs!#g0NF~F*@IHG`{Q5apuJHhtYgIgT}KKJ%8KL_t@uX9*drp)^iTp zzdSmBohY}6a+fGyg1!$%pyQ86@9iz<{a6ss7ol-Ig^v3=x=-(-`TID^U!e2t!<=)0 z#+g+j#a9r0UL1X14jr#<)VGLoSM>Z`f|c+}G|mNRzr|?37tpxYqT_yq?(5g_`~dnn zaSYGJh9%QFFGAaoK)+8+M&q0s#w3PKff2ScdW( zbetE^^Yu2mj@{_F%T+q{FOIgWh_<@`J@0+c&$W?Jz5{DhUWBf9JJ!PQ(C@`X&&|yF z{ZchF&im2*UxIbu{ zMe~=9_N#*4hx$?Ofu73&=>51Jo%fb_eg}Fk9zgeVJ9fvfu>#htknTqx^c>Aa$N3!1 z(^u%eW>!q!xAUR#v_aS16^-W-G`=ZOKMn0S2R)|`U^RRX?SB-#pZ}oqHK~-=+X5Y@ zE86a2^t@h<**FUQIrk29yrqvO7T=J{Rp z{kt{4wXQ1c${-|Gu z#=8#B!H?0OpAMmUJgsKB7bVc~%A@mCi~2g~`EM5XMe{HLjpI7B-!$~R%|_ot^U-*g zMfo)}&iBy#e--6}XuphFsb3+qUm3JrZS;9_td3pLxTm7)nuWe69*+8D==>|=`6hJ# zKS$dgLeJkx^t@%%PWAcGbreU}bq<<`@=;$EZC@vB61EPzpyOVI_PYd~Z*Y{yqU*T| ztKu!_I+mmNWfj{0Cv?5PqW%Aga{fAL{Uxv_^=;94u14?WRBVU0q49r+o}W+A_g2BW z>0FdX=dF$BVbiF;3_TYU(Kzox$A1)!<4LsNiYUJx<#(d|Kg`)zbpC_rdXAv|j-%%$ zSG~-f-$$K>?q4M|ug%bXYZvxK_j@>cALrp{oF8V@Py00vJ)c*j@!pNbI}aUiF&f8; zc>YS1Uyt$|XndQ|Jbn~@g~oLto*xPSMc0wPL7M*zbo^3ip39)~*Fnc?7WJK?ejwU@ zBs%`Mcs>O^_p`%?(EL0b&)-DX`7ye#gXlRqiGE%cXqfizT=e+`=(+EL#&t#1Pe#xA zEOZ@rq3eGTy`PVx@vTDJtwrP5gzoR>=y*S%>pLFiX_USf6-C!^J~~b(be`@}?vE8H zUxto96FvWTqWio7vv3o79yeoc+>5@yiZxDg)IsNOfyUn@%KhT`P;?)ziu#+-c6Xxr zc@SO4(s=$_)Ne-DxfAWb7wvZlo$my?Z>OA})>RmNUJ4zz0@|(t+P@Xrz8ji{e&~8H zkNW%3JUxo;=M!lEm(VyiME(2Wm*_kPqI?2vpT9|3&zb0XsEqc%0R24ZgzoR9=sZ`2 z)6hKJi;nw5)US;CjZyvto##8u#zW|Mg`1}DrxnoWZP4+0qWgFSnxEn5=j%kQh|ggI z`~;g~{tME1Xp2iIcfpJCH+0-i&C>nuhmLf#xYsWzcdBw0$eIeNXf}UykPUs(5}2y07=3^DjWxxj1|_>R(0ocO5#;M)W=P zF&f9`;l6nOdzh<5T4yn|U&SalLeEi0tcAVN_w5XHygTFh0?av2X#bbcylg_(`C*jz zqWAj{*2X+7(>fZW=jcK--xs0l9f9@n%J3<4{x8sRzC(ZBIgZ&_>cY&NzkhFv_FILG z@E}&ka;?($&Mw%E@|EbkZ(tw%1h2r#t`ey zhrQ8$SD^VChpuaClxM{Ad(rQ?3!}UW&EK0*|32D(KYA|yK=(ga+vMr!K9@xIzYJEz z^0*$mqj@^5UHTlZh32mpPR5Z~ER%DKz887Erq<0*me$2n-cmC^PM(fK;Y z^X_Q-0q8ytLgyce#yvT_IiBB+jyo4^wF^F{3X!1 z&qeF2M7aT)pO)zTZ5!pu;Z*c=T-&bI>@;h1Jmf)_zL$-d25Ky+Xh{42Xx%- z==!Fjd6^N;MaO+S$}eEfyy*G*0G(%F_!s(qIIUO8M>%w!T2XF@?su!O2f81Zq3arn zjz1~NGtl;PqW+Pne-4dnHJbOg(RLr9@qdl3>lbW;C3>gtnU`WU%2(q}_!v4)nLa81 z)zP0fnuUYWe9l1g_yCr|wdg#bqUU8Fy3SwFc#cMW#zm<L*s9R z#@!bEUVJ4Q?``q?W%S-`M929OJwM+@`3E$QKcn#+L+AMyJzoX-rsrp)d9H{)Z-_bj z684Dt%h3FcM#sG->ZfCW%5$Q;A07WFdLHuhOXHP9^HT{Orxu#e3()*^3ok|UGZt+> z1s(4u^gi5!evf(r-Jg9p7V}-4K4&MRpW9Dk9sCNbV4?o$^W%K<^Lzq&pO#?_{2YBR z-t+XTHI9ng5YM1B7#kBIWsX#CUBc<+nyLukBDqx-TJy$^4q_vO;3%kejUg*4+qWdv6yb+ye4*LDzG4%I+o8tL**pl)QG~e|vP5B*$e*RBF^D-M9 ze^ESt9^K!y=zL#?htPHzm!7S( z0rcEFf&Lu(KGwv2Xuo2EQogb=XI^x^24NetUGI24D9Yo)>(F^-q3fF)K8eoz3i^5X zH9F1-tc7_8r#v=9=No~JGbPG1&~rE!-S>r2eiGf^<>>ye4A-ISe+M1se^LK6x}W>8 z3l_LM&D#&pr#u_opH1lB`|LyWSAIy!M-_CQM(Fx3MDIf{^n46M$Df7SxD1WsJ#3Ai zglAome*PMO#y=fBH@BnfTZG2FES|rD-h;JK-iYS!Jv5FTQQjB+hQ{+xSbAuRqZ!(- zL)Zt+>tHmFk!ZXV(0e!)UGE*?{pdYhgvR#-x?d~MaW_PHD>}|D^gZxBI?nN^&l;BI zI}L4D3_WjU(0tZF$7_k^r3<>A%ds*}L-YJB`umCZu^b-2>UjF_%#2Cc6peEQdY{*! z@qCEp?K||I9trc0NS}XY(DTp)&BN7rAs?+KTLYtVD_A$pEKL)Uxe=#;lg z=(+BQ?q4@_zDv>l7=?B5YHWtf;`u(b-*0F>|3u@>Hzv(j82eBziH=h`|3l;a z5*>Fhn$Mrn{wL6O1;%A&^uS_h`(fyLABXmv7)}jmgm;Axgp1Jov`f&QGYSoepu9BiNWXzXol;G0I!99p#VFe3iT^#a|IEH;!^!^nUh3`;SG(n;hO4^|R3Z znuD%u0h+fZ@%+_r1G=7f(et_!ZMP52-=F9@^G!L9lXnvQV^FEEXTZzWI3C-JkXkNCX<9&&K zj{Ss}M4#V_&hsQX-phC&Zj9%>uTS$1NAofcZGS)d zzFUIEzX@~VLgV}rZTB5|o_;7Ryr}j>dZ@`ktAOu46gc|1~u48_{*Vi^lmG zI`6mPPx1V>C}-Z3p65r`TLe8nWzhcR(Rpj4<2Q-tEzvmIqH**``wvHdZ+JD@e+9bE zHR0Q6JloN6KSS@wUi3Y2H0lf7oa)a+>now{o1woS>xjlP9F2D@dLAdD`JarAJ2QL$ zZMPI1XE_@8YBcV*qyA&8O8M(B|1D`9_0haGN5}1k_8Wv1a2&eMd1zdVqP!$rf!^!a z(R1=i)PI4UDept`QfFFvem=U6mgqd)!%NY7Fb2)uYCIyPe^JdA$s zm6)E|)kXU?MdxpYp36DtIeZLT;hX4sbInK=L+7o4wXjx{2chGQLgT#>&F@X0UG@bh^7J-V)g=(>)h=QCqgsy`E*uUwQXqxoup&esBsqjT5` z%}f7qDB5m9l&?q6-K}Vz9*pNtqxpLU9e*<#*LL*1v>QE#zoGFQi|2o%?epK7>d!#e zQ38!C8=b!rI&VF6oYv_49nqgp24G8k0I$GL(L6M{Ew%4~#?v>-SD^bkD#};I^J~$0 zXQ6T2g|@pNo%d06zn+ZeFGYC`y6^9zKPP;O=A+o`)V>0GKI>s!yaN4x@F2Rr=g~Z^ zK|dEhMCbn*jpryj{z)8w1#VCE!_ju*&^%5?=e;?e--|i#XEg82(R=qI*2b+-e-iDV zaYq`r06K1wD3?UvXW3{T%A?~}MdNNB&wHcirym;k5H#?FMI}l{vP`C#4*fy zPv4);-yqD1E6QuIIqeSM9IWy{X2vXh4F_ZM2UEYr=(r!D_vt_MJy3Uk`kWbyRVdF# ze?H!bEpcy@%P&a3CuxU%KOc?e^=|BoZ=n6od?@{XtT9fYJPUi_A2<{{EX>Tf7N5uV zSn=VM_wi`?b?k##kEC|}(0(7`Fl_K>%ICvq{9j>HJZn+c6V15U$6kEeXB!FH7Q;u5U-MEW^@JNiD#eloou8lmr@p2#aY zV*>iU{EsE+bFBJPnHl3L_eMXLH=+BRXK9+J8D28oFgN8F z(EI#yxE}LReiwb8e1P8H&(Y6;15tkhZI|ci)UF_UpUw=+;pvoXqwQLt{oA7V_9ArM zqcIz&VFP?3{2Z%MKK+?wlW;g1_gwV7GatRDi_rJLvuGTzMR_y2zE9Bo`3ik697f~F z{cLJq5?yCS^m$|Seb5D+uMZl3|8NwxqF|$Ec#xr zj_!BuD0jo&lzXA)eks<#GoMTQ+Xk z%&5N$&Cfiv|6+9hr?EP&NB@5202+VRinNcXp#6%V=c_atS9NsWX6Sx*!oRQ&I)1ko z)4KYh{VzrHF$!rNWBXns#;3xTc`{cs+W*Z;twR&^WfC^XXkLy-ea6bP4+YWoWw9^TK=U#)ofwn*VhD%y9Ju(PU!pt(4S*2$C@}5-LGfRbF~pG;+L3>S+AsX zR1Ph-L_e=CN6*PLtc$bJdDo)rc{9rIq3ikpjqfWoFF&Gj{EfCR{%Sf0rP20P(RNL+ z0(Qr$I2qml$I!S}qvvNkn$O+n`{DrF{~vT;impoIo{Q$AW|Ui??Yd)S9Ey&AHyYm( zbe{F-xI57}_J?PzPVf2VXxx+0@n)gpEX3OQ68b*)4n6;cUrW!+pzCiKHb>)Vhqjx5 z&U;hT--n*t*U@=4p!@L&+U^MYUdp>Bjawf5eo#HiW3VpeN$9y*itgiza21-b^*9B$ z;8tw;dS=FFSa5Cn{Mw7PC|6vU&QV|Ve9c1p-x=lk=)OFP&bJ)huUF7`H=^f!N0j%Y z?N5gJ*QY$3h3;EL^m(JOE&BVJ-stDhc=YcHm&Efo(YQX0@{aI3blr#1d>%vZ!%3`y zRX3#fWFNHMB=kN_jq)sXop+(@Sb*;1a`c?PjJ98oj{jafe;?h~9ccf(XkHGX>pG71 z&-+HQFxtKpdLFBw@BLQjyceVS8-u=AZbtKTUzDE+UqR33JLo*0qVs-_&i4zt&SO#k zFFMXCZ>Ie!f#$J7SPku02VG}VbUp3RIC`P+4MoSj2Hp3Y(E0B~@6|(S|CiAGt&8&8 z=(@I}=X@{P|2Wz|&&Cx08EC(A(E9RdzUrdwFO2$b=z0gD>llXi8x!@D(0Fe^*L4pX z*F$LhOVDwbqj`Ki+=}MuizpwA@=0{OQ#YkJ%AosJ9eppfLgVd^u5$$Xd3`;4e;1(Z zUWMj$8yfFt=(yjY{eDNs$@^A{uNb=Sa%g>RbluI-{_W9tyQA#}qx&!pJzulXev8m~ zpF`WdhUR56nwRb9`~Hil|0e2xit9cMAx?i2{P(f)s;@#cCry$6b+^%c>1>Y?$q2s=i7?{E-$zQ>?(-h|FS7meppbe&7% z`K#zUwxH+uYc!94qWLTIUYf5=SOtxzUf2?it1G&%{n2?wp!<0x=A1ip-Pfbz-h#Hj z7j3sFoh2$o_`hfzo2oRMAw_KHLWKv zI^JpM{*^%Yr#d>$g<)58p8n{0AC5Wkq2u0&jx!yNX#QrR z?dGEG7NPx@qw8CR?$cJZ-8bm@IEd!$Bzj&8e30TUf{s%vtQ7V2(fl++<82%D-NTE~ z_%BD-c~z8WM)?7>-!e3xFGYD3+V4%Y-~Xb1FS?Fj&^#ZH`hU^)NWKq~XQS(^iMDTr zuBR&+Zyz*I1JU)4M%!J7?$b;(p1aX`=Az>*K=be%+J8-y-;MGPbUoii`Db+e6H(5; zJ;iYr+W%ZMp6clQ_0e^=K-b*^jb{iN|Co4w6&l|RwBKxWALpU*E{^9x^AhmL68dZ2L(M8_L~u5$uXfB*U`_QcAcq~Ci?#m1EXhmEknj`VxoR@jpA9q9MmZQ*__M>)^V z^!J=qa0KO^I0V;VT|DR0WOwvDOvmbYH`@Pod?J(2f2>A%+UF_m=dmT_b$BWMgOhN; zuFQ;Ua67tR?Y~Gr*Y`y8e*>DwdFcK=67?(5d~HGV`W2eTpKufYjkEBLFEcZ4#J0QB z?+4yO=Q)A>G51&L_fePOSjtb}C0OX|%#4R|Gf+w^V6Tgk9IdLC<`?~4ZL`|W(Redq9EG~Qw8 zzE6nq)F{tH``?4!mwD*->E)P(?}S^>cJCv{B;zCWete9c?_J@3be?1JJnP34SAO(< zoQ>{x74+U+fR589o_9vq(H|XmOw>e>&gU z=)7&he&{(JjkcSHm2naJ^W(edc>6FL|3dRp>Zf$h8=&WUFj_wa9q&H$_eoDj`MoHA zgRbj8biN`7((emvh8?ga^+WJHd=ic09rX9j-=p#5I+)&HXQA^}LhD;aecz}bj=ry_ zq47M3ey?AJ#<3lJUw(@v@i%n7f1pMdPrq5U`F1l$(&O%JF0)&{*l zJ<&Xk!oGMT8qW@NzTN2j2hnwB{FdS@iCrjG$0~Ro+WtxW2v_2Eobh|wuii(Jrq7Fs*wW|d{_MlG z_$Ru~mB-R}@1URWAEEbuCr-pYH~@PcPw&wea6IL|a5RqmE3M-bbo^h?bMtRl{0&0ab1m9$I=bHvM0pvS$Jfz3Z9&ib9`t>5BI@&U(nCX+phN+laZN~Gyhp=|61tp@0(yfybe95&!e9oD{&0I zhJJ3A&q~khgbmSgo1*ddLg%{-+v9LFz8BDad<&g-SNJ`;u0z-c8{|skOhxzMR&@LY z=r}9TJiU$CxD9RhGv?e2bYF_(&dRwD=b_IVh8@sxE(s@~=W!-F?)_-{hp`$yk1cQ) zx~`IWl4a3$RnWXN4LhLwa1nZ5hNAt(V@I5VP4P|agMXvvuV>z@ocGEt=sv6t58_pn z%bb#x^Y_PdaXRIKo^Rv+!x3EiK8=;!4q^gPW( z<9Rq-fwq4O-H)B zfu8qq=z3m8`>#XedOQ3QJ(s_uab*=v=e8Kyt_s?}B|3gbbicZz>m3k|#PXCUV^3U& zp7Wp4{zuUH|3>@eJ|nH82%4X4G>-ac9Bt5i_eI}hqtJbvhB^5}+pj?H*&ArQJJ9|I z(Ru#~^A=0<7eePh3w>Tb>T6&t$_;Q9UW>Qlzvy~r6;J){L-&0VI?pR;T<_pG+=G5@ zbUQP(AA|P47M*V<8u#7kK0b<`)9288ydFJ2??(N1=sZWTKjt|rl?S2YPDJnHjp%r9 zqn{(6pmBYRj&~A0$7hzv%K1E~kKV5yXuDCEjWgo;l6d|m+HV&+?lE+pJS9^eilK2= zMbB~lurE6PwdlUwhqik9Rzz+B>nxDd@)44ty zoxdD9Z@nnDiEz{Fb~L^Ru^K*)j=KxZ(~oGr|3kmuoKYs_r!G2v2lPEK z0DbRWiPdoxdJguY>-ZP_-ccw!#aRq3pNp=)Tv!d=k9uJ%G;cl8b98YyG`tdx_lEEe zbX^P3eR~Rx{{=MOO;O&7uJ5NPXO>Opp*Y&UCbq;@=>4C8_Wug)cNjfC`OeGA`MIeq zx}J_`Jl)VZ28N@sFXbud`|bmrfQ8FtWn7Q9U^f1Z#$CF6%3DQr{~Dp|Z;$R*Z#16K z=y|;n&HFs`+`fs~_ysn?ljwfbtC0G4L(ktZ^gK>O`z^-CxCZ^X`FHGsMJuNAAhdil zR>1dhj_uIAO{@1M~2xvHn{ZN;%3<#uQs zQ_=b7p!>HBoo5p|-pA-TKcef;tdZW!CD8T_(D8eq;|;-yI0ZdV`_cV4ik~4FRQUV{)4@-ZR7Ow%|kew@=m-0FFQXg=l9K< z(DfH-lJZ*{T}Pv^1-j1m=sCUuJ;#&K_t0$geYO;RzpRV;@6h)JKZxeshZ1OB>tG&i zj`nL4&o2olVa|S``@I<5&!y;iE6{%LqWk+5dJd1`d6@TtR9^+ne@nFACFtkcRp>pK zfv#&lI^WA!3*SM{`=4muvzn#2OQZEw(Qz80&)cKp4?)*A6^;8g^q$T^<6MBQV+Gpo zHS}I=M)SQDbKVc=JU^oAJQDT!o2R^;8~G`=@BX zy-_}b?qf!qtq_c3%m zZ=(6xjGl}4(a+7_(R*94eace>^jtT<8rT8N!xVI$JJI*(JoG$0fz9!0^j!Ri#{Cz% z&kZ}IxSF8rXorn(D4L%~(EPoDj=L4j_bznbenijDF?46kB z4@T!5hK@4@?SCs8_dGOTk7LgJ5N-bs+Ws>%o*&Wo(%)$RqMcK}GMKY&bi6iE-wSO& zG@egI$Gbb8KZ@pg1v=gabRV{%^Zkn1n5#>AULK9J4rXC%G#~A-JNCjF_yl&vkFY(S z+co85IKD@DB2L97-O@h2ik_b>=(*UAJ@6MakIlQMb#z4MAB5(8A{yt^sJ|!5kE8ct z75aYs96i^E;(7iaDZl5U=cE>zzt&-2^n8y(@5w~;K3^M7kNUgNxaXm9J%sjKj*k0s z_%1sBm*~F!8s-1OqCHdl3g|rNqxYyaI{$QZUvH1+^U-~K9No_s(S3LmeQ&%UjVfK6Ng-?;oLYeiTuZfoT4&LeKLJ=zO<_kE82dgPxCVX!~E#{2oKkU!IFoxg7f5s1xN*Xj~Vg`*H<( zzel6{H32`y7qB8u>z}?)KaIxmG0w#Ucv&VthhCD#**zfb=Uz0v-=my+VA{Vk(DACG z`RIwZ8y;SZ?(-e!`Fk8Y;xkb`f}Y2d=s7HOY5FbC%9q(f_uV16{?MK(~PndgX>Q@jw@6E9{_Cwdd z9NmY#==Yi5&~tX$uyoIgqx*aw8drTZzpc^zx&)o?3cMOeV-@@cjW7T3WO1~GtR=zI;)xZ0uTp?}nmM#q^N^|wcPA=>^K9E0nkzVd{$kB!jt+Zi2y zC>qz*=)5}udmT~{y@)1-Ye7JyOhHElrP6S@j+~h=S@t1uQ(EY z-@Jl3-`BAR<%U2sntI^PrMeSJB~tHbxgUEu*Vu9N7#7rHu? zOQ7qoj*in7T~9}J-v*=Sc`BO6x#&JWg_H0tbiW!+PUovNTD}b3kI`seuZ!~S=($*c z=6NytUR#Ftdn?M@(S8Tfdv-EBZAz*ygPzk`Xx!(c>uZL7Pw5#>#B(X%hwkHx=)Kq+ z{*1Oi$n<;T&y97VscoOW$0*FwkXfX;U*R>p~Fo)+RcxH6t^N6*b(blrcU z`<8KCYF`9>UIo2}EyAwh05mV7(DOJM-M?Gn`R!Pf@_aOp?_gd04voL~)O7D^qWP?k z-s3h=?uqWxqKO2n*9|GpMbYzE35~CL)b~Kg9frQ&rr=n73|rx8H)dsAggvkh zF2&yXIXZ9ko6`98(D^!`>+2VeLDzLN`g7T$a3i`O-(xpCjAO9H&FP*lN5}sG9q$+P zoMzsV@>399Zwa(rHu_$ygs!s&dXCzl{Rc+j&ncyURWIEHE2HGM%VLEls`lJ?M3g) z5p?`~(^L5@tVg*zHpIc`KF!B$+=A}w0rdS?Y(^IUjuG#BG`@_PDPKj=&$TLH8}xh* zLhr+5%*OlhLR=Zok79Sq1!kr9@FnQIUy42PFEswnwllNc-&@diKZMTn6nb7Z zVs+eu?#F4jrF}mejk|K#1byBG&D$mD{$Czm8{QKxMepN!H14hFd#lv!bPt=L=V}64 ze+?S{d~_d|q3e4MFUEqmr*ktD{XD)F-Paq@eV&iLXP&@`xE!6o^c^Ygs@RWmV{~8d z#g4cbJJX>!9no8$It2MtLFH?#U>x2ww{~qU+m=&bJHA^WN|v)}?#| zjj!U}>HB0gG@sqkyp2NVpMvJ+<|xlXKTqeN?ViK-xCRGf=A1O|5cG3pEP7sUN8`8` zeP1j<`@e{utMzD}x1r~5H+sH)Mce1OC+&Y}^jz0L<86ob8;tgwi1wR-?$<)}eX|Pf zw-vn)-=O<<9Bp6f-t?ZTgSPJ43HwQ&v_&l_ky zwxH|#7>(;&^xhnb`uq!1eFMB|!*w!0y`3yu2`bidw0^Zfz#!*9{^bN`@B0iiKg-c^R-*B(Mc*SIp!0kk&wobq{6{>`vpk)rGtvGP z(0gAq>N}wO)DO+e1oS*kjpsL``#lGpX8{_|((rk7zE{Gx(YSU*c^|s&KhXRYcrHCJ zi>|jWI&NDuZ@tm|8jQ|+9Xj6(be=oVbGtC=mtxNQBg(7e`35vkTcdtAy3W1W8BgM+ z*#7yfjO*|z^m&;V(tbBW?_moxZ{5OvXqZui*ZD$}H=_C3 zhOTEf8qd#YyT&V0+?~<$c`3HV#pu1?ht8k*V)`6C9jj2Th3;E_bpFfGd=JID@Om_! zd@rT-6-DDHh2EQLXujH^^IVLs`)c&(@*A-sK8DW!8G4SskMh6hdJ3*g{mw@Btvq^v zs-f-cg6Hf3_AYn@q8mMa z6Ma4nz1GQo}vx5p?E*ug1c}yUa~bS=l>^m zBX*(OcU$`RkDf&HSLyw9?+4*@$`kQ!Jc=!G`Uh$Jw{RonGd@iFx)VL89k-`@Fa)zH z-+=2f`S*d)_%8WhI!BAp@wcJt?e=jxe~)2P%KNc5mj5LEz4^5`g7R*>5!>uY=Y13A zq5M92e?AVsjrzmr{rD4&FZa$AS824qIoiJqdJlVHK^%#`FRn)W%|zQh8ud@2pUW>} zHhzND@F;e`>`&8rMxl9q3H|=^6JCJjKTGfD%hC7ZaCF{r=zYBojqg_UJ#;@B-?DH$ zo<;c+G`@rA`#SgM={K$Hz#ybg}cU`yzJ5&A?v+=xL>GvhA z(emX{o{qUFKZaFtNtCzaD9WGU3~csA+W(DcKJt8-m2sQ(==*##nukxL{1y8C`xQMm zxpt@L?XfiFZs`3QiU9^7}^nQ;)^Zx)E&*Nx5 zR)%lH^Y_tx`8?`>K=u)43>w7gDZ;6>uUt{(N-&C(-?S1>M(o(0F#E zr+>reZ6@alZQpuNit8eDydmi4`gpt(XJHl=`8M5$V(2=`MY(pATVNOJyP*5`5Ssr- zu`ez`&&x?Po{aC(=hhkMyyv3hR>d>0QPg)v&t1QGekFR(Z;bkkz3KN&CDHMlV>xV% z?#~Exe{YZaW#Kj~PyHeE`$@6y)4a9N_*;kV(S7KQejfIT`peMI-63ec$D!+;fzE#i zw#66FIF6$C`^G!;q(YU6e^|R2p?nb{yJc#b+ zi+B!hLf7{V+CKM>>HMFHo|m#{+;y=wc0k`J*Wr2i3TESH=zH)u+V7P8X`B-1IjMo3 z-!|y{z0my|inhNNo#%FReT&h2??BJzABnk(D&d>G~SJ9UOqzCe<1uFdr&@sw(EQ_#d`_be>|G!<>>PjXuKPuybB$7Kf3O$ zpR;oQ`})G@JU65JejBx_Pv|}R6V2~G zX#NWxN$ahMKCg-1#|BYuf%b2Qp3C0o`52A1n~uhNSCk(`-$Toy{&jR++t73Q6WTxD z(PTDypBkfaUy3#HPBhQ2qj~-ioqsPH=LvM5GXF^Li~Q(%i=lZh9o9nIUl?{k?@f0! z?qO)WQ==s7)r<|X%^sa+AYU&*jGdLG)N=V&k**Oh3T)6ux@ zMCYH2uJuC@!g=VpYtgtrL(j<`bl(r4>&*Hq zt?x{58_@W-q4#eux*tEG`~Dl6_k1T)`3!WQs-p8XMCWUP-h#qs)o*6H|m?B_r5jSuP3_S zm!j{HYtZ-9_2|Cdf$rl|=y)5^^}mPi!yfe9{T1ai|4Hp?q5IGf%}WK|g z7IdC_&~cxP`q$C(uqE7$=KoOm7dlR^|B{8!an459R|}21P1rr^FG0VrOu%fs2R#oj zMtM8B&co>b=Vf=C_e?b2Y;=9K!VA#-=!nKM1kJ?D zzXM(WL+JT_8J+i|c>Zma52O7vbLGm}ul(peDuc#b4xP6Fn#T_4_=C`OjYrpUT|A$I z_IoPItI>HsMAz|6)c=Bxn>%;f&$G~duZE7>2py*tI)0z1ABCQqtK<1JEJt}By8hMi zd;>b)HuPNVLdX9Gjprab&)-phN}g1I2D;Aj=(%W$&esOr_nv4z2Soj~=sdH~ap$4$ zn37@b*x0!y#n+sec7@f2yPNG(+2UkLN?8eiY{1Cv^T9XuJE+@s^OpWs0=sM=3`FRG-|BK;T zbpChHexIT7A3*2(4~_Gbf@%D-(C1|_=W`DouS?huJr_gJ^-PHR$x*%qUH`37e`nM` zh{pE_`u=?~%5S0LZAI7d85-wL==^`9`&snV6mL~@{JLoV8lmfJjkfC(^<&ZTu0`+F z9q2sIpzB+Op090aT;HJi_yHa7SM=xG|F8m{cUsz)4(RiK==dYiai*gE=Y$WU=VKA( zoL4l@&&TuiXgr(I{vV@p{ea$+lju1pc6yqx99pg)wnp>R3p?U49EmINA}moTSI)mT zHXgfB-hkE@ESxLn_rjNBHsx2somi3bpV$UV7s-_|8HeB`{2ZHNm!i3Hemh0@GV$?e6iM1c{U9vEz(eWRlQw62 z=>N~3qA^A(lggjzJRjqM;7>OL;?F&pE7~2P-BWBtE$Rv|-(8H^*^P-mrT@?PU;m%~ zJ(BsKrOim{%Ep4;VxFJ*=WXf_;A^-Zt1|9=jDI6mW!?+;=cX)vr^Of_#yp#-TS_eD zW2{*`_fJ{IFTogdsV~PrTO+n6^c}#M{#g=rFU6X-(QX3$dZ))3>q9BdSpKV`*2}UD;M#w<$9-Gcz+YGcz+Y z|3BYz&fI%fR_J}--}AqEu4d-UIcMMwoH=u5_AKBcJrnpdp?xs<`Xh8t1o+Fqy$<2G z6PJN^K76;5hgXxwQQq%HdBk%Fod3Y@wZQKJ{5*J_1)OEQJs*U2ljy;tc7}yu!g{q|TVccHbV*2 z80qP`Hn?wt$7_iHZ_s@)=rkrg6nJ_b88jz@ujkajdjRRbEd0vukD+-rxQ_&O0|57j z@0WnTs>JK_gpY^Mvm(tKiZGtLP__?3|FeiYpYX4s{b}ILQ`XlJuEBp5c+G%+IPl*E z{9(ku4fs3ozl8F>1R6b0#D8sI{qYSPN?D>^vQ=%*r{VP!XkGyBcKjazdMR=D=iLd9 z(|Io??l+|I6W&{p-aElR0N&5Y6IW>3^FC-lhab_%o;GE^C%)f<|3&Cd#gBT_o)^RK zLSXC2%e!$86Mjzc5yCUzF%InI#9f5THc@3K?^l6ele9ks{5iqvBK%J#jc4LMB)-?P zq7EKLo;uL{68KH!_SFJ&keyjo%i_w?gwv%^vb<>|I9l@SzaD|pASxY z9stj$@U8^syx_Gt^85|>FF@BI{0-vo0sVGpPXJ#s-nYO%L|iZ7{{a6LINt*2H{|(c z)K#;Tw+}_yJD__t@DBL*1aB+;Cy)l$W>!7{>@B=c1NL=z-4q^sh+D(^7t;6;_><)6 z_wd+^|GudZ;l2eP2Z+CZr1etZw}w}h_dNJMgzyyccY$|${taBuwCG6hJkrv019)6Y z-1*?Xgm9a<@AIA#w36*#O<2#F&(+?T=Y9#Mx+Cv82S$2~dl6@CUZ6X3mp zbT&hCAIkS>VBaVFVdBrhujd(rZyA1t?*rdAfPXyrde)NWn{ju5w_A9)dR`at@_!h7 z)V29@X6|GDgyuaZ{@0?+Um;(5jw3C}Fl$Tkf^Uy<+!VaE;eP|^{RO;>p}7-zcmV0$ z30`BA``h4rjy${v|BG$Uc@gwPlDggfoI@+J@R`!++~rUtx=}kz+M2(ZGqp5 z^iUm}?Z}%WpU)w#{77!%x^;V|aUTiY$H?0d{s-~C3i^%kxhL>vlm5+!`%jeXYQVo3 zw09!z1?1tw#MJ|K65$($e;582lJ;@%`w=|a_~(gx3;E*uUwgiU{}H4!6XAJqUIX2c z$n($fPs5+>gJ#UUO`~{xJ;(uMhpB8!kIqq$FA3@xoNc)!1PVj!3@I44W0lH1_`50-k zC1ua@;PJf3$0T?!0sj+(-&D%$rSLgB(h=d^iMv+NUJSej{#M{Gg?1A>9?1JK(m-^z z=N6EI`Q>6QSXwKw)kb~^rgIfZ>33*)$kJ~_Z3jPOybK}U%Tf@Bx`8YNF zAA%-5O<>Q4_Ex33cm!n|0%tdIe}?D1@UtCMc|Uyh9MAh`{Fi|Dc+wk&_Ky))A$+^Y z^Q)kHGyXl`e>KwlU6l2A(A+KX#Pcc8-3Rxfr1zD8|CaQ(lJ9Rq`|il!0wh1#?!n{l^A z-d_*RpGZ3cuIGKgZwKG>Jdd)yg}_PRT?pONh`ScJPf7^5Y}?!OSJE7fGzD0O|DNE# zKguT9M)=>6Fe;YHT+j*rLHr*F{&C{(K->z_Jt6XO-{9FG{?Fk4g!=kC{zJS!Cj5~o z%hSVs7Vb1Wwuv#%VcpndL`FTpf_kjC+;yws(R4J7Q z;p!QNc7}B3NcS}S(nX}_U8MCBUg;s83H_aje+};?k%xBzD?cwFu!%D7gx5RpzZ<+w zyf+Da;obq7bEBTtQ^$H96JfSoDn0P$ihFzBhkrSFy(xJ;AJ}svy>;;WCm8P`JWN~z z{~_>}gVP^ry$t_d;rE^3HHEuCdJl%@uBa0wauRuM6MiN1Pa*zzXwD+MJ^1V*tY^PF z_J1ClkHPPir2h?Q-Ue+QycOgH^?Bv)q@iaD|L1}CMff4mtOWnM;GM(!ao)dxcLI1P z^6I%Y_$TvjA^jD&hrqc8{`*3=%uy;&jQmgIo(`NXv##g+rO*kH_J82Df*GU(KuMdhop&aT5{044T!@d>{8@N2z>< zxIz3|s4qP~!2Kuu-xYbf3+|1e(KAE--iQBh;CzrYE+S9&g8o&Jo^YNQxGx3vv8XS> z+rVEzSbD#=!1KlMXhZvC()za$;yDw#g~-dr_&*8VafDyO`+M-WlIA%6OCp_(z&;AU zuM<8A_lLM=Qoa}B{}Ji&6AP7llg57tUqJX)#JwDvF~Sdp*XKz0!}!mqY)d^vRp!Cd z(+BPS;k5-m_aL3$z~>Ew^}L33^gN6>J)h-$1hBV)w*bz);D0`_FTwC?!0)EI!+j*M z1Ijz@TY0C!y^wb&yuS#qesGo%|5jihP-b{O6RwAt55jXF@ZZmSZ_@fa_&kf#j%58&$gbL9VL_`gBgFUS2hasLA6UEn_%etKT$PNgTpRp@>| z{B6KHk#tUm<`sl*9`Vl(_eSvi4sbm`h30kOJ&yMuh?Dd5NMHUn!B76rkdNy?*C3DlbV=o!;GIGI z?{Ke6_{PM&k#`o@ok-)mz+Mdh`+)y$aNf-O4PHI#DbEVxZvg&lcwZgxW#CSi(!4)> zHh}js_}nsZt__Z!YXd*FR4?Dee}{;BEb-rl&n4jO19mmikj{ED?~keH#}Ri6;$B6W z^bC{Em!ba?Zyo>ZfZrNd&nRh^pRd8|vyqPAZz5mEfb%B!Ef9WnAb){$jw78{5Vs#* z3%uLoTi=3o=71jr_B`AX+}Ysyvnc)MI?jRd9iD$8?$P9Z2KPq1dY&Dw{5OlbkpD^Gy@~g63V?Gp=+}_e_k!== z@n57ko-OWF-iy1Ad_EsOU&jBl$lDrV%b+`xa=rzg1H7*%j|0U23%pavdj}V@xXL?7 zX9~PS_`e+a`5EEz^H69XLHr*g@2`XZFF|;7xnxHn4VYi-iq{o z2+w)a`Y$+tf!7^*KMBq&!T$vON5DIqa3|>A4J+x+d}*3$jevA|A~bEP1>hJdnU9OM>)pet7q1o$|UYLfUO1RSlnxX zujjS!*K@z%*^ID5sSCmxY3MnTJbf3ub8#C1dkcAZd-y*N&)*Pt2f}{`{~pBENvnga z=YzPL2|qT{dMUX70r&Bgug&{W(mIIydf@K>PtOf0&(kBX4x!yf8PA4xCGYJC_u=lQ zY;*X3AsBo<1CPJ*9s_(;fa$pg@MD3!825U>b_UIZN%u_BDnAEPy+?lj2<~6;|DE(c6m%z2 z54VB;NZ@=CnomZZ?E>ef#C;dO_k;1LOU$1G>=5C%E~+n~JdyY5#D62=s^m=%KPPn5 zvy-%59%+wKrh9{XE_D9^_l1#N)J&3p)0>2*alX2HU`&;5aDqi4xiudm1;~>Eo688<{$4?|n>>6`<%qaX5jR45 zXTZBk++(BOdPw^vginp|H=%hgZ+dPF-494d&kVH3;XWX6Tcp(ojH5M`U-AA6x_3ue z#(-}od@XQpO1fWz$BFp=Mq2mB|3==EBb_azq36BO-V?f&;J*!ji#qsK#GQ=0-q9*| zBmOn;xdk{k!2fLAGYHqf*Ta@`TL|ShJK1$wSLq1-HU(cf>4<~`6=i^Z} z4>5*<_iO@>A)Q-7_hayH!#hLxG~6eF|1aRzBYX+3o^#0S0PeVjkhLl6-NC&H?!6=3 zbMX&D`zBmHPlNWDh`T-E55VK2xang;o}CGi)LhMrpxm!3z3|5D=5BHgF(J`EmIgipbLhoHG1 zb&#H0!}q1cT^pSH;eQ`-J4oa1yn5zJsGjP8OydT={yqnKC2mX6`p8+2|UjgS8yw8iaA=pQGk0o6_Q|?sW zgS#2Jdjg*Tze-wPCC}f1&+XxR2JX#yYxw_3dPnfD$A1bqKZWir+;PPL{|f$h!{_nv zd?5b2mD2te{tpnhp8WnW%AqW*)4zD00>4q>Z&s?yyAt;k=+5TV^F3(K0#DD4aK9P2 zhe>Zk;3)17A3*+VZh7J!-)T9#6P!`_s0k9Anwb+ISXD7 zCLj00FI$&mDgSj;cfs$Az@7>2ec|y(^00^Zbns6FU(XN8_icHv1>O51od?15@%V4Y zTj$*XuN~0MLH99UJ3B}YIuGP?9Zfs5jbM^ zlb{#QD*^l({HMd`5!C-nz}pYrqltSybb3Au&L?nR#`_rZeK`2v5dU8z-LC`tE40rC z_lCTifnNmAy9MqJcz-+UQats%Ao$Dw81SA_F7v&r}xP zbAUgM_!q_T=jG7chkR@!{7vv*3I30OZNz_f{O5x69_T+3_@WsF z{%FE~P#~Vwz`jr2z90D4$>-U?UyJ`{xGTuhCB%J+@NuN|Y1})5e;#gnE+qa(qz`GXib%B2%%6T0A1Hc=+7XrHtWqCBOo~z^DIrv>jcs=~9;HBrQ;D0Rza9=~* zAn#2`qeXtt2--K1#(whgUhw}54?Vw*`ddR9P2M%cO@V(baaY6t6L?^fm_H`~doba9 z!uJ5Y^t>~8eHZrv!gnUF{2UKWdcGX#U7x)C2H-1zb*MV4DSijX+|1E z<wAV*o#e^iPaDJTc0Ct;plW&^#CaE8x2wns*R>Ht%Vr zJimhYRpjA;xDDR-6Mq5e48rSd;Ch}0{q=#pmiRH!zgf^9j=CDe{WI{rxZmZSfbIvR z_gr8v$2}8X{qVh&v$Ov<;{Q$I_b}r1d~jI=&O++pBXhjt#=i=a!-3V8hk{2ub6XD#m?;Q2mq|Au=h@6&+of=zb-s41a^?{ zqrl&d|5~K`bmD%8|7yVZf^#kWyYRm)@_ZxV5?&4e1H}C_(i$fGMZ#N&`)Z{7Ny2AD zKA%DSbKw67crFWG4<~#F=-Jie+c(cz@A3@=isGhknm^Wv6Xi@ z>3kXY+rZw8|AFA2M)>c6yASvP{=JchBgEf>^zH?GdE{F>-$9;V4V|8YxTECZozR?$ z`xyAXf%wyjn}+W3@VgVRb;R`${t^D$1+6jQ-y49vly?m{dVb+f<>$a&1TQ^rh0l4E z>wMld&|eVw86s|yw8!AB=Mlu~c?kG7hhII?S_#fm@SgzP9f^Moar@x?V_=t(&I6%; zFX7+fox9`2XH)$=yeyA^znkf$BQ_49s<`1OPb@%Ion68X3lG%o%PAdk^@} zA^un7VLkBAM?G8z_fGJ5J8@qpy&LnM8s&Qec(+OlZB=Gk^dmONP5Z;6T&G6LogP?h2@cISuABNX&fIl?Ke{zNPQ4Zs(`>jkz6x}EU-JnntKyOgrr6!&r9zANxw5NUh}{y!$}6y8VT{{eJ*9!(nm z;=L<8D!}zz2%jG4*8v|Vts6k2=RVNf8oWcm-b!40z6ag6z_~rJJ%OvZ2g74I-|$J$ z+z59Yc>f~)?$GNq+z);aA?~><1Nr<4usxCADPV8ot;q#{NcrRWKJ>SS_-o+(T}sf&ynhb;I?`GLot_`MQ@O8j;dhHD<6UsC1I-9{-v<8^ z(A|mn|3=;)4g7_??;xME0ed)gxH7@TgaPAr3@5%W89ciByY5fD7e@8w? zpkG0rZUL>Hhk<*4+`r@gmG@xKwBYl0!{9qXa~<;d)1Y}fczRZn{|A7l=UVW;Iq`qR zzbW$gQ)u+u7re&>?3R&F!T*haKk4;~j`(9D?yl7L*PwYS@OOcCIPxT#SMk1(xZ}Zp zQot`J+{^n9;;x~#7WowZLkJ&^e7pc0J+C7?8)f(oxGM-hi?q)muFo*odj$S{$~F}F zejV{wr;NwLuLbQ>dH)9PJ%ODK-_L?KK%AZ*@m`1UcEVR9kHfqd0~;fqBa!E0pt(M@ zZ^Hcuyk5z>k+@Ir?gH-z;5Xs%blitTd45eEZU@gh0)H|7??SKV9nhv{53py!a|`i$ zo&x;Ov76Z&_6H$dE;$a9K(4xWpMyAe1)CSFes{%?u2ZX4fw1MZGULpTS(y%jWv zNc)qx&n3?b_&4JIhVmQ=UhfP(+k^Hogg*$*?}+~aczT|N|B3K_82)dA_XTi%$ot!% zxdHw^K=Ti9-ftAezftnq3;b`S{Ww=SKOy2Hj)G z@86(%1pZs$)*?={pM&N)z@H0`Cz1EtgZm(0yNFv)p6(0&7UF&c{EfJs$mdHVA0HGG zo~J@{H*kIpd<|t@8+C9Sc<<-E1e_;8{~U16Bb=TO0edSvzYhLt{H7GaSqF^75Lea_9G0Fs^WW1@}}n= zcy1khKM8IxJeTqQllSTH(zBtIZVT9T$=gBR*Heb8k=6x~k6Su=<&C8KYy96NPru+* za!=r2FYjHU+XRm{Lvw`p0lZHH|6SnS1b!zHekweFi2oyz{uby?BX5`T_VGReeox{3 zH#B;l1>V)6xg&9Nk=NzG-^6=5v`>Pko=NZ?37(#Pr1?wmufh9S;CBS)YsB4_xD%jB z&xydUNjmQYXB-+mf1nIc1@;B}FDIX0=GF5V;BN%~LU`)A0pTY_dVd4w2?4(`u*bvi z=Y;nH-^%+yV9$W(djsbml;Z-zkK$cPe%=lKfl|IQ!jI+E^C;jihi(==cP5YLM4I2i ze-HS40Jxs-@V*HD9?JSl;O(fZdjX#Z{xSIdjP#BTe9`FH$h!^Pe^Z`2!}}m|ev zgF6B44e?j;|2^_P44*S1Z(kz551L-w3vj;_c@y7{!0!aYJMq5|9{+{ralF^0Ja>lI zzEXKl0p~=*p9cThzNIl8t^Yi`hvfS@a+QU7xDcCKSpKFdM4&uty-g#b?URV z_1Wp|POI6N-f+0lJb2{v{s^rAZ?ZO3ouBEfs4P3&sLs}oEX(TcteUlI?ON+VZ88(E zFB_hzRok^}Vqdd~Q_UvpQ&TnLZ}AWxsLsp>b)(q`ea|$Y3?<`Y_8fOKb;!f zn%O4M@ouV4?5k}NU)Z)g*|;)D3G0n%IFPIuw`QxI>;z+S!eyi|+nlV;{BKjJ&dv21 zqZ2Bt*JS&e^R0Ge^}61S@}Ib-cf3x`%y*iN=4^AmowXO*o!V^Hn4cZ5wJK|R=bB`H zN+qnExGI~hF0?Ca9XL@PuQzI)6m*<*YmMPK%@##Jr#@NBc8c_rRcrcIpPlWXILSYH zu-=*2M}<^Qp8&jJw%Vvp*ZSrbvWe!*j6Oi8+Nn>R-fywl!D>5e%{Q{id8Gf=4rrK_wv21p-p7Hk98~z1h*4v!#%upB0Hk{sH-;kYN&GxlwQ)etY zJl~q3@ph`M>00NEWqZeGs*U{$Q*o2ELuV}OUA=6>j%sWFWbk}KNy zXxMu@3v;!-b2Ia;>I|@{R&$mJnlP2Pm-rR!zREzhePF99qt=?LPSC@u4Rs&daGhR3 zR@ETE7v?CR7-u(4qjsPUviN5`hdpGe9a&N0Ko!=f8}wmnnjT%9*q_nD>iQ&NS8YsY z8#5A~tvBpDwG-_`v(cbYh|azcttvXI=q8%8bIpd0Ew$OXnQEt;Ytn2^)PYTAw7GrR zc$0sO7o`j<-6{=ga-L?OB3uU3yfZIiS%WVFKsQtR*HJttt9*S8TXU@@Eq0c2PG_}N z3tYAENyd>0%jiBeNRTFK)EGE6QnhLfU+qpG!_4d~jd-Fu->#{-Pt45I)l@Ngdst7k zL=n3y{Xo6dnXk?;a0=e`0cu~BwxZ9Qz6P{YH0eoIgmn&D*K8dElKp>{-cfb6O<9#NzrdbA4+Dn;HN_{b##hu0a z$&!4i@G1IsW6}l)KK#BqL$*4J28bHrn)N$1{MrF^e;fMvSktwJMniAEZ6Bmc!-@*& zAJZB>Lq{>_Xec!aAnO6C7zWAap6vrWSEz_(R#r@};ROb;qbZD_IoCTw7BwzUs}Egn z3%>%2CE9a0h5AA^-D=LyU6pi}q`Hi>LXzrKr!$5i8_ucZMyEct;6s%UJyg{dVv^U{ zD}$%WLU^>(QmGVNVvJCIq$ZUQbk@`t4+IP(d4D;4U}A3y94WJi)?Em5UDKFV9NnRx zCc;RJ0A(HOunAp9OkADJT$EjudSzgEC>v|;uQeD$Mzfxw!4-0My7Vx;|YUU+C11*}C!Q$XRmC1lhUdm>t_LIXe14 zbEeZiW>00n@)S-sSZgq_r_fxJt{8!4OCHHJ$xZd(&}ozlpP}F$FONiy zaI!IG{N!gn!6=wQJ`$vmB!loL7H#@j6;WxDexFq*eWY?JMaz;ICM@Er$SIX^2cJs@Z5a zktT+jX1XDxT2HmQBRW;2tgRY5jCjzbq>?w=s5OB2dQ?CeJjco?%%@V zuTx5TXgGr@jmx76S~Iqk@|uXahQ|74i2iYzvF{6fCS=axuJ#QlF?DGRcZIVoL&xcO`<2XclG$voEN@B6=^f@ixTG z8q4Goh>S2|bb*vV2_3YX$$FbKnEweOjIhM$u(Hx3lMc4Pf=NSj!T+);JI%SPM20A# z1ZSGln#is=8AK+DDA{aPk`1j1iBI!XId@v5s8DlAZa$PDf?M%JG7@s?sdBTa>TG>x zA%P+6Fb6WcIvVSjlD8O)ClTU^;D44z{>kPXGf-LF*WxE%-l_V9Q3gzrRHZbQrco8# z+?#}2M&Z^>b*?WvJZEk4h-sE0xe3KGSdW_+XKM{5UQJwB*5>{r5(5>1AfO?=-kM?= zo?My(dI_IlSc(r)pOpbT3~E)c5>{>bDh3JPbCa>GR->1^s*KFHtK%~;XNAwYNG&w^ zvcXoB)bij+t&LiT3B3fH>_$;A>p2IhA*V7>i2Joe6AWh7meT6SDGo<)uYyO;QMq#l zb2bV(-a)>3+qoZv(a^Bx#r+4?_74poSeKzMI@oOO55)s*kpipvb|eCsP>$>_fwC{# zUel7)R3^USY9cyIh35URFWY=*eYR}%s=n3yt?FO1c4fBuRJ2U%PU#bHUH^$|R%UBf zty;Z)aN{ZKSFc~+zi#a^%lrS!EFmDxNVjQ9t8(U!%9~|vay(@%^jvuccli=TvsO`& zyGOQXZ8VFsC0MLgTr`=P+gD9XQy2KGP36iYtI6^Cnf)1}o(+P1*^c@lzSjgw36!kp zLBuISDSE>n?4aty`JArulZ7-uZTs4I?`WpL~wD zG_m_yt<$c}OkF1CQF=ZW%ibPC7eZzjwKXPbelV?wt)Wfi&?LzGfs$VdFe@|`3Z3Y_ zPG_#YzQ6yXdgG#M-&_?{Z>No(%T(@tl)b;!=s%GzeW<@WSMNX8@YeKgZXky>8?#Ke z%Qi5EnnHkyI#<58O@EpuEt};ul6G42j2EUqt7T^@%{5uA;AI)4=_6yz&1nL=c%G4( zL202mPa|(J_?7|&J%|9NLWf#5sf9bWL!I79t+rarHlVaeM^Pwh7l|#2c0+=%AosEV zaretk(Yewum@q=KH;%|*I^3irUe4x;v^ZCiW4%o!xn6Z2yDJjdFI!uDIav#3^X24X z>1^($09P)nS2l$Z*K_UW@*a&GE81kfoegx5C-YtM($Kj1?i1-PMdsb5BY4 z7!lFbg(I)p!on<@l~P>~v$0hf=w#YPm1aAa@sr+`DZ(}*7$nPBu4q+tZr*pk za`lg7g08JEn>$$UrERYN0~T2it4Nk9wrn`B|-?bBHYx@{nsx zdiD&gsBH9&#f@l6Xd{(yX|l1^-ZqfN3k24&YJ0x`Ok|998@0P8L0S6BS@ym)`%l-j z+cwAc0V`#1B!OwWI#XJJ#fFy*3Yb9KSq}?MR{ZRf!gHaru?E9hI3@{b4*^jGS!a2V zmeATzmE2(c$2V9^%BEwLW_(i8eokH8d2f*Avwt7_k?iVx`i(PE6K%wTp|Y{b-q%>t zVr*5y=#$GL-K9@@EvzNv(hB>t|4Req(05q~5B&AyaRCT6Zqr9%Z z7`G~|Y((~-*oPzWF`UvaN6%pwEZOH>G_Xp7Z!`NQX~kN$v$<;YubAigHfozL*a&53B;9IF0c{h#j(dby8r5&^?o2;+cfAtf-zx&6SD$G`7vFa-i zqXlzRI*NaQXaH*2nrSgkpaD)Ofj&o_bVr0Uby{_!Ud={33rsefXbIGYxu`(3cOcN9 z$+PC&Q?DJAX9CqCj?$`{N+#`gq~m%o^1OtR3*R=l&+i9rQ!e$t|k6uaGsw;THx8I!{iFJ z3;OCQvovT-L<3;ULt6;w*OMR^pCIja2id{;B!ZZIfF($3Gc(8~3}}+b%utSjhrK|| zHl)=g5Ce@l>>W%8gh8|2MqS8o3uA#U9qWZ?HuAONxDl}7?|1W3abMnL+ z*1_=TM6`<{Y*odUR6{w09Se=-5nt3`4?CSJmVhs|CNW!p*i^}$E%9(AEP^U zhg}6uG-YNb_Acua_I+r_xvTA#I;t1f%^}ZQBX{{vodiR^d3r$y?Fk=!Ukwv4fpfzo zhYj0yu5EMz(01pb?=*VA*4awZHbT)QyDx1lrSPz6@vRLB(RK_|oNuS4km<;ROFmwj zm0%1wj7!#97@NA$)T+!1RNq9Y1i3m~Zk~3O8ZaLWl1ZYJs~XIF@gkLGX+&|BS3Q9= za{O--NlU&}ySwuc)?qHpQbwO95qX)g^6$>9qoPQlwFoQv<&@7xWfQWqQT7=(xfgMz z3Cy~5krCrP%rbS{oK-+T;VHGLsj&6voYjT*-8KEni5Xk8{`p?ppvB!L@@xq4% zArhse3kr%L2Hi}ZUY6UPF7MgboUQG}`gBEm*#>R0B;_dWk7Wd_d8Abn^5 z)=~G!juHc>P7H=(yEJ~;*C)FRBtZMtcMR?rTpBX(Lc^Dw_@;z>+y{&6gjG$JXotD`u6 z0m^w%d+mu<-E?HiqOscCYnsYD*cFNyBTy|=a2w({Mb2h>y|F(J4DX|>=AjYk#1nr7 z3KnB^tgrGon=!gW-NiP9tS4rP$W@FUUYfbCl%Oc#4GN8EnJMew$-l-3D-0WmibB+ycU>vNGqGYB%H{PsjP1WQuR-56- z1Ob-Ed0UcMWhlSg$&NP_*?{X+A}*}I0%OnMrhvoQx978s4B+97K|4Ze$X3vLU3e%} ztJ!Y%QXKWU%BDCkM%YHa2=25IJ_37m#w*8k?Nmffl!u!f#SVX!PM=x0IDZD7mcrp+ zm!uq$F<&6tk*=;lmP@21j2zz^vd74uN4Pv|Yi3(`grd~jWHMq8qcWRru*lP>`2$qo`^!;YTv4cLdb#@-C z5phO@fdE@L&@Cr5I+j!-22dCC!m^4gd0A-*Cu!=^N{v=CG`cH0W!_D+XOjeXh#*kj{G3Yk5-HXRoOtVm|wHf1)xDZYD5Nl;AWviVMZCUvvRfL|6< znQhYJE-A8+Z!afK2@vfqN>@OA63VelYr`dAmJgZJ>hJ`8Ex6g*WM8d5y^rp6G|Z@2 zaQgDv7WwD}4|v<|CNO=|5}+%|f?RbiZ&PM$s5TzzuQr5cJ*h)fGYx^>&{tp`*qEr! z(dN|nWi_bX2Uig{=e2ykc%IJAxLNC)?#q^KX*QRs)kmpy9--VSB5X+?-6*W1xW%7D z@_xQby>XiQOp8u(#(Zb0_mpJbM+!PsS26<)lT^=~TiG2Bn6@tW8VEbpMz&{UOLq7` zYwC#dX zsWc}&t9*xI8^-i&6D55n>+pg>&X@77%~3~;Bz0&OQ!_+PDgT&JTg8S4>gu4?usxH6 z>VUaW;dzihZ4;-XVaTVZJj|J(Fi2)xvsLnlq9fOgr-USXm;GJesw|jCCZzsJ`0{t* zJHYau*Mh^+xN5a;pf2@xiMh>KnxAsiyb=$lG1a2tY_xT08$}Q6|B-C6Ni|E^Y^I&< z`6>2C>JstWbJ|m4u9Y1T=YA(OrlB7)t`c?*yZ6ZMNWFj0j_{={AQwsBObf6wu#Lr8 z+6f&RW*bQ-0x%(&&|s;~VwoyUXMC4XbZ{<8-g>Qf8@oExgbR{Vj4lb6>IW;eDf)W0 zrP(^jx`Q!if?i8&MX15jUBdOCS<8o$#hyAxRAT1OjTFH^KbltWhs~(!Nam&t9%lyp z=G8utHhGh3u58W$oBcxCpY?3r$Oo5iRF&*r8#SpazmZ^)wum(=6AsE#TB8(5s?F3w zC!tpRj{_j*#J5i8K@cPjJv6P>#K#O0;`Ssw}dz0s{*P{t4b`sk=J$QfJWwgvVgkjJ7}>dSk16km?$>tOn}a? zsv8~Mo>9@hf5!(D8*0J6mbkEG#6Lz2El;&3KW4Yz&X5fygIxRSDD64_G3fI#hCIk3 z6PVagJ2X#q1O^6_kE#ucpk4@{^)-yB(kX;g*|{eh-Ltg_*h+!j+~UJooUaEegY&bq z3kZnwY#$O}nR3V++m$TadfVoYvT)cm??;%f>T`(bWVOwN1*MZnBVRwnmy=Oa7rMs? zH#A|JX-MTwejgIkwrV;ctv&9TE2Qa7#t>$HqJPEwZ6P!9sK{&TGU9>f#z8f>rQ&2_qc&-_mFZkmj|tACaLZs7>zQgVCBl( z+CgD&qm3D0YJ^XCSi8z5b8l+Qe8k42%gOi{f~bV)ndZ3fa&Y%V4rQ&Nn{*0e3bB=Z zO}kfB1y!`fU=>6*pTSA?^~#)1fwnuGr5dGf`QoN^=B65&yu|mG#uwPKSn12o#lCKW z;`r8rZ`kU_7@HK7hsE0vzMJBs?+G@%+A($P+-wkLAvtd~!h%2t^)&3dC_lP+`{qq! z*`CcKqeHuP_N)jAUQIPJPPTkSlF!`O^-)#Jdu%1V*CKVH%Fz^%Ixg8=0$qi!iaAyu zoSRy!s<87@>BHGdCfO&3iPC0`6-$%F$fQ|E=1i*1O+$kt8e~oERTf1|J!;TkbQVg! zpO~N7Xmd+Tvo+nnY=hQXwy8*kp?fGX&=Sad*#C@0m?>HxRX#`etn`%~b#U&$4zuel zrHB@Q#-L4MO&3gw+(D5Ia9$;hH)%p>a45Fl;gRpM<@0M0Yh8k-)Vmc!tJScMpt2jP zvu1wCDe6hPfo{p7_O`?^$^Ti=)p5*TGVNZ-EXtLoE3IXA4Tt0UR-P6Fq62{^`tP*CrQ zQ^qM)hlg{L#gR^Gmv@Y?7OZT}z2sVcoI}h>{+|!Y*)aSjykd@n)za>g<|Regp_q~k z3q@@r8woo6L;8x(j`p^nx*Zqz{e33H8&COlh;ZP_+5 z9NPQBn-yC;l>*v!zwf0OICf2B%1{dX4u|cnE(tC3!7ovpe<;k@X+%p3HR*Y&ammk!_ol7Uq62A)qYTtWQg{=X z%t=pD*)l(|uU)U=V#A|<8Tu*|ROa2uOyWM3&DZI&?upYxhEtBQV?bLlt}s1T@*sAY zMr7;oXtt@z$Fb9y?TW$^d05pn>56n~oZ2)vbf|B^o)wj?BbzH*nIlXn^r0x10XP|G zE7QHLno66Diwx)jlt;KwpkWy)jinK*GdNAD`7?prtnM2neOH{6?=LTrlt)~Zq)dpd zY&C~gS%|MLj3U|3QduSWKKaxB1K|Y_wDHA%d38gI{dZMTc=f5MNyR2Lmg7wJY1k#)j=5Us7ukx`u`xfwMTCWd0Gq4bCHCaqs)V79FRHwpC}QD%;S! zpnZXfb>}H-wd|+RupLquI|slNd?gGds`*ZDbE=m^AreXrjYQ3MK`nxO!#hE`ED;nj z>3T7gla83LY*SEEeKP5Hm`>_&O`YxH%E={5OUWb@4mBr+l9_s0nKtLA_nB3MGw~}5 z$UAD~G9+L~>yO6%EO$$cx5moDQ9F)Wf`P@9>nY^$?B*N{{5o{VCH5wc4D!7yl2 zUZoJ(5Azd)_@Z*skwYRPz_IM#l0t<8Fg1+XkQ6kpP(*fK+1uULJjk@=i>Da%C5ld{bs0pr!Vu`?Ff7|?cg%<7E6LNek+rN*(R)#ij-kinNpZV>Sd{QaFT$8YUjm@>L z4qwqlptJ27SkTrWc1|yN}i$X-eT$*3&&l$zz~c=P5QV z`E19#2sbDZ>;NS3x>=7_MC)O@9M(Fna?vOQdS>y2JI_t5ab z4*sF5Emd+6q@Fy`YHDQf4k=|L%qyuYn4*i?x9C*=r9gavE=YU>hjpb+RoE;O^`so+ zpe3mCY;@tm)=?DLigQkByivfhj%S`F-I5DYlZ=n%ho$yV;gM_*zY-(#yxEy-y* z<#j$QHQkf4B+!?pB2x6aqFId%^bctn?^{`F{&W-5cAzwEmAsOg@*QHA&{!oPWz*e? z9U}G`!dS5~ga$3Qb!773%oSaJZr?)Nw1#TUu$FaX4axZWp4d*?~ud$(0#e zR;dxGQL`QZSIjwSqL?VnvKz;-mK~Wlod(+| zN?5l8GvSXjai>dyVV=}S2tX>yIip*LVC45-`j+rCA_CfIroC1+ulNh)_R5!p_*=Y<^tmRc_ELVC~`6M%FiHo`kNm)XczJpk#Jpr;% zb7iiCs{CRikB0Gd14-QtfhsPo+W%}I->{(ZYO*hB!s-8hrf$*61*^vpj(uH}9~Ctg z!O68}+ofB{A-V>Hbi6B=ldq~BYCG7rXii}>#)v@o3OazXg6;~X6?7L+xlqb3wrYv& zVbx`Z`?n8Qe@3kDdJRpz6KeEo6RM7G3)*j%YF5!KR3-vlkD@>q(o z5Y_VNNKOYvzNI83>rn`%4iybsBmB?R{s?Lsg`|Fv^q604KN-7nZAMpVisP!H1ZK#Z zMG}bP2WfLLU-~0xG1f$xLTlO+ckHiFVo49H9nZs#fR}@w-9*Sq*rZT3+|7UG=;(g> zJ%G@*=lA+kA9fRUQDX=Id@svO97jGH$I6wb&t@q5icAkuOW2LhTHcr_6=$D_qCTs+ zDT$pgD#}zED)VyM+DU^^J~mL`G)x>>ahhobhyx)`OKYyOTa?nKcEVOO_g1tdQvtcL zmi2fdII?0r#{Xf=do=rm);^Nwt@Kry^E&!G`k1*v*is1{q!e`4{v=$}E5XT1=1+x)ZdgSDpPz+{O6N^Rx%VCB-g}L!32K9DU z9BTqR+Nn-WDSmXG5mIJw3SgMTZ3yl|wcdS8x?eCVtemBfOz0~GWx8t=4VH>ow5fxayLPlV_3qNfgrU|BF<_W!q^}xnPfOh~ zI)(`-@#_Gb&qTPzez2gg5;t>Ea+x&h5=4Y2wL(+!N!NS%7*Y)^iLx|n$!&f& zuj(n~)i0N$4qc3>>yiL&g9;TW%Oz7l9H?^oRZDYCIFqqim?}EoBwU(Q4XyxJ{?oTQD7F28DxnTd*{flGwZcuaGv^En6?Q|WX znczhZS4PG)?anNM$=n#JV|H#4T-`*4UIdQPa3VdA&=~5wsLDuy`4r7@y&0R#=F$sU zH3`DLo4f4N*tUM#g3)k_GvC7P4w2E|VLqp060qy(w38`D{_maa3RBtUBX}>1^eTO9jqC^-m0Kk4{}r(rU$|fB)}-tO1g8)&s1R z(xp-k7%N&(kd`3%trq#9&&{wg{_96nFsH%P))|$W;?a>P6G5`zI}2 zE=<=ivzV^K7GV`%irIjUf0~!CIWpgH&u+VpYcc|iY3?(b*)WlO9i)R3DLR?P7zVu` zs@jyT+gs8<65^*4q@8pn>l7Pw$7q9YyS15c@~LaxT1*xXu^nKB{H12rmoOz^;OAEo zD%(xLX}2G_*H!Pie*p~Seg4suax-}U2-=3U9VqK~UG|!s!4VOs%k(e5ft_(83za=p z&!H`X>HH>+%{G$jix`{c3|rbe;dKr8o$CIY*;?}jYwAL>BTolf0@FIR zvWW#b({R2!+|4hNWN~MEw5En;_oj5>&vW4)-XvLHQ>hI|5khBoox5|IS?En2BtyN! zoMtL1F|lo|MYgfTO5Dn|z1f_TEeBA3Xu$uwq(&Ry;zM%HjA*SuU341V2KswD z32_=aB&66JTg^e=1SOJ5?W(SWS7Ik($H1ms`zU|X1D5=G?yIJF1vu>R+ep(x`IcxSjMvbkS3m{}bKdTZ>szrg4Hp&swp4bjf zWcen$d@&)(>sj_uN8zy7mbW;DrI6>MKnx>(qU?8`26el73g}|h+;2L~6e`#o6>BJZ z7AECF@-48Wcd(v^$|+ICjvqU0X?(*%lC@FTbJCo13qoXFY-PH38} zGe&>JO5BGe?qxYBjl4}nwi#_|7wIiHu|9)JB2T_t&wkT9ci5*`ZyXwq7m!oujc&o{zHq|=M69uBJ1eE9nYoGnPuD^GwEflLj#>*2IhT7*z`HF)n5|Pa?$BdJpXJI2H zrP%^pHi6+>9(LZGJvYAV#^*42l5D8l1)ac1Kby95V64K+@L=W)D?EVMEaQd<(VdF` z>yjdbWEg}-hm=^^xp~Jx)+4E$ihzLyccONo*a51t^xVlmn--Je*X-|(f|>-|$+4q7 z#!cS|JD^%vEXK6OhOH*^7@IV0`tmsJW7R^vO#c~j??P$#wJ9g+BfNP^L) z10(X#TtjYUZ`>80SqKqR^f4~D<7{U1bM2& zTOY{*F=o*V(gs61;p%;iAH2&oc2eB)g^NXuQq1*QF<4w70Uu0DacxaQK5GI=!NsbI z=Ep~n7!qT(m0lW2sqCUCNhIQw6MTx0+T8&z1$IF%3M>>?-j+BZJQe#S!XU+@rX|?u z)hDBJ2W@v;IYU{afBB-#Ln%u{D~#&nZZ9b{2YMdcJC5@tv$pCIrtKZtuP8{MUfsKP)v0UgSP@aI;F9Sn zwWdzlH9u8$?b@ids;TvM`A zhlxfdf6m-ZdZjs!Sfmm=$e#mzsp9LBnB0*On!at}vu2Pss9*bB>pA9RiyqD!Mw}4K zeqRm+7dnXTCG|!)t&U2x`MN0YIqEITPUn+s=sVqnsSV4@3CKXNM4xBG)to7a%Wv?` z>6a&WO-;>6VYrK{l2xTFsjcGWvq~YVk$%V^d3{3yxU&UpQV)WE(T>Y?MS9wV}K-R4~IXtY8;ZIoHwc188f=sID_J0=q0Ttwc*3 z09uvN{}~yIlew|hh@>=u*s4mKoRS>Oq)i6MJ)=~&ik3#YycjxKZO5_l9I2eCFXU*X zfN8(|!#GQaRGFOt#TnY%CpD(_h|7RfxP%RkgVddENouyVN0a37ZhEl<(;UMME^`)C zWt=&q%x3N33FX>p3hBeYoyJF$M5T<5i^?b|i%LAW{v)!wLxU{#8g3Rdk(Fdkt8YVO zgD~#v+=a;+vUYCZA;Gq{iD}E|=<>ETAf*0J<=hgb~!)gVe66NSCWE5X&*?IPMkV7tE9`}<5^0@{GZZ$SN|Vp0wDoq zR5ug5#3AJ?)@hM|hq^vO0(E_HTgL@Wv3~2KD}%de(`1>J1xt6P{!Ka$qFi>^n{(I2 zRrfQM>kOpgWuoebW`{KhVBs2Wwr1^~tY=N{T(!W*>kwMpc8Pm+oJvCivDF|#kz;AqJ}Y4 zA~dT2XtCl(C}0COPrtx5gvA%XS+ zn@EdnrS+tWNEvH5Dhlz+r0-RIC%MEa z8IomFP9BYeTcx24ZAna@8D|3MDEggTj#6njpr86BO{}#na~f++!%}dxoOgO%Gi7$# zB*vObaOO$>pHvr=FW?zR*;PHo&&<2u#oCBSGOkD2s2MTlPpslQh?TqvT;2+G4o#Dv zgM|kYvW>tILi`R>|XEn?EWi^Hv2cZCri#Viee zn5|V5-Ci6S{S*nPa?Tpja4;hGCosPEy2w`|EmcV+p z(35Fx9vakDshoz1U|JklWX_JZ6Bd0+l%FCmeqJ0YHUCv|`zdmnaTKS0ir<`C^fTn1 z9*kWxB@LWbl{Q+>dDdvAtb0I|IjK5>4!{tUY?)0iy1=T|=C`^_wG%sFzGx0Q{Ro)o z>xkZX>a*Mokld0gBdKW8;nFT$29uM9;e2J13#s|bqD7| zd!Xs}?R{~$2w*IYldJfYyaz*xeiWcYk$zV+rwPEKyfor4VU8AnZnUJd_ii1zh{Uv* zx0%v!a~@vc=dBv)s;0`>x;d$2WuA*h_IbGl0)uaDq`NB5hF@Emm`aB(t-)U7JbdOE z^Ul`ItjH2(s-(56EG- z)oEL+Q}ej2kGEYJ>Aq%Lm!#R4FD-aQ|ANeX+O%2W&;fTgy0f{sboD5^E%k z^r|CR#d#QQKq5k$G;?KBHP){4v9#j~%^q`;<({t{$KF~F_Q0?;A>U%FSA3R?lm#Ofbtl z%*;B*jX~X34dG-rOSKDak#U^V(d5?_sId%YoTj2>Lh1vzTZ3U|szbEtw8@3%5A>dQ z!Qm5+92aLoXv7RRt}M6hAsYqEI+ZcU)`aY%uwKy36^s&`Qo_(IFHtG`P^Vu+z#6PL zfYHsVP9dX;g%zQ7A%bT8p(h5|{rhm)~{m z_Gp|B(%EZ2W3Xh^EbocBTG7ty##Z>Tb*O8zk=nHK&=SfIOUs^)p_LyKMj@|iv0pGK zDKQL$%11F6{-jI2Svs1rbPDf9Nvd1E1I@3Uwzh9%d*Un{YZ#hOJHw1k+NHquYeyrX zJzgTz2)U>P%^v{@5`5dl2-!eF9{lb3Fwfx|t~jY8~~ zs)k=+@FE$U~FcDa#{Vm!fS+0WveIlezbiz zVn;s6_zZ_kDlW$Wk0I53AwA)TovhwRSfpavR_+D?8?*cTx&opRI-)&S{grHR5m+?} zNH9T6Z?R-xWV3zDku96DwI{Ay#YD={@PTO-R_04B37|ItK}|$PsM}tjqG)u0lAoVC z!{)OK;1VZuG*EtqIVVZ}oTLD_(nKWN2G*RkF55=6CqE5#pKnddil2JZFi^3r-pc4G z4U=n|^=5nWk65qP6Xqe=^%*2d%pT?aHXG3z9w^>;Bwd zODFnlkIy<_Y-Vbs&T1)=$j z^@(RJn?2OKdfA5MJ^EOC=a^E8k)O4qbi3>}(*6AkHRVn}SU@!+7I6ipJ6Y;o5e!K` zLcVkd)z&s8wR3>9#wC&ym2&27iJUxIn48Td(oNnzO;*~^k-PB)yC30-k=vHGnrtL+ z8GK84HT~)(bCs=_nW|iMrh-qK{tl0f0m8}0O%03%k*Q0;>eiSR<7&Q0W#G125KE~p zl6Kh>VHDLVO4p~V;Zl=Kx!i;t@lpdyQ1x92AAgn0LN{0#55a}Dm9BW_i>4KD`pwB4 zkR%QVNWRQ{A-i}R_NhU#f%=Hn%KrPP;yug#H7H*2>F0XG$#(kA5I}7l_+7CI=suEg zHH#(ha5dkfPN1={%FS^SKwrqO&|$}6PLfpuD5gWwTz}|lJe>NRe%_?0?tNTB#&;)1 z9^?$2rjJm%2hxMIBx|ukw4Eg6LvAKU!p;r$3{mWt_h9zH4_UT*5wIGQv?eNPc~6In zk5QmkMv<=UA3x|JKS$YPPK=NVGU2zSuK71Q^2RRYjsELdju0b-Sf1y|v>mk*0@IjF z^I6EAlp>P)^Xt?T)b3U%pep1aL(EnkDD;476AT`NKF=0WY57t>f>2e`73o7WJo`6=0g7n)%^1!H$8k^W^p8)FQyz*bF< zT2+l|ZOKo^jhYw{4&~8@GLYm%$%XLZ!~szK?>g5r8rR2Y#fy+fJJ%@R^#cM(v4!Pq zOar@z;Kk`w^h=jR>GEZmROwnKmmHKr&OjZKHJsT5nvso-9DIK2J-;G>MMvN1E(vl>mVUoPvqV}8&q}mJhl|X$zVd-Bi33kh|efs`C5F z9;>0)cce$>$9!M8i80V-lO;82MkvWcuzl_nH5vt@HtnGP*8p-QLA60zC6RN&19 zFOD6q$7QV4j%?w}n*!@>PBMa_YkNKEfld8`o9LGZIcKPUS^D+rk|;qpR1EE(6*^1j zWYKG<{j;<+%f#$I6rp9Ne%H_b`F5CsYFDvmKI%Kx{3dLLmxY1-kJVxN0gWYKZ4jsR zrojoX8n-)~beKUzi@*>wl*x5Q1eRSZlLylD8`x$Uo=AP|<>Nc?(A1b+(;S$45EK}( z64=BBNd=5MSNW$06B8xXU~RJCZYLZcxGjoHI(>;0As_n7fi7f=UWz1A>ck`w3~a{e zVi1t7G!2$Bu*o8+oas|iglPNMu=-L7#K3zY^6q6}iD%xr%6?7qOtehrB?Kn)a%f{$ zXt2t}T8>UD-7<{zQ#X>y0%Z&n2uc9U00uY6lVfNDG@_2l9zg%H9&Lir0GTK3dR{uA z{T!5EH`rkOJ*2^WfZ1$c&5oTTYTDrfS|`GT@O@<$${Wo%@lzFJ17ky*_Kxh@HI{To zbF3%&SR9~>5^?DoXErg~=}Kj>2*tjw{=0WL((gOumpYp_|T6x1LOy<_v2ACRI%yIGj3ES~;b}N>ZIw8etWq z@*Pg_y=7xsPT{+SfIbvQQOB`2G98hFQMubNSIR|+2wve>ZrN$|OBy=ky zvP8_)_sTg&5zHVRK7&^j3q{>o!K#K^;oPd73w*RmhR|WkO1M~@Y=AgrVoYR#qKQG( z>ZS=8rrYm$aI#;Lp(|3=dy+l2Q1k01D0zqZC+C%~_{EfQNi9~HjVlk?b)LWwS1Uga zSiTvkIiC5Y8!=t{)U;nKLj>3QNCTZ!xu}av-1A15eoy4!!GnGEYNKkuDdL~l7I^(K zys7pYi?YA((7w*>%(4wgbX-DI-4K;ibQ7avQf1*x%HBDa_ZW1qnR6xGDtmP4S6o<@ ztEx09#&pe1n%H}x|C0_7jZo}O`GtzPxtErkX~)JT0}~@vUsd{^RTD#qpNh*Dy)=GP zELk&*sYJ=x*&;W*V#d;^i#zXPD}c}B*w$G>biLAuHssF9xU9@N^%?8N-X)@uQ3&f9 zJ!xOndtvk@%3134=su+Lfh6A|v{Xz7l|F$28a@jZhuvbDUq;e)naaN0Bw9h4`XfXm z=D`=adD1qJ?E>S{@F|_Q3N+P};3K&))loX$7B#Am$(@&e4ViT#*y{ZUJ z8K-qTF;%MRGK62A3!=#~mSGvmP+OV@LY6ZEzue&pJ6$w-WNhgWuS9Q<5=p&W0=j(| z_7*gRQ&>KJv`koGAyaKH%yJr!A7rzU#7bUdsH9CohBYmV4GA6G`G`*L;G~H0MI@~mMd%avPfz8-g9zA{CtB``V=?)8^ z&`x+_ljXcERSsQ5y+po_M%8ciF2YQsCH+~0)O<04#L$pFP13a|`*!3a+e<9>Lq-b3 zMf9u4MH)QpBVdd*i$t9dLHXEY2e{PDFB1b14KuyV=VI!agknZwNzN)}JN1}F`3?%R z)xsiO8%SKI+0NBRe(h;=zt}=|0aQ2r2|2~Fd`H}Zkgn@rs^y!BRDq`K;$VkOnU-+g zeY;Nl&|Ud4BszOZpe>8lQJ|zykitdPcjcL-TP;>bKj3?5j{*&Z>7Ex=5m&$ZzVY7p z*4zZ#mEL%(K1umX$6*dT=zm^>{{hRC>-@k)p6!4fRZmMKl9!=7>;K0UmX=LDhr>r| z@eT3?5`&a=sjfBDqKZGNAzUVxB~o0(3#FTeLH)?MJeQNBRMF8I7V&X4R##)Vj7q)S zCf(h_t~}HK<1e*D!Vcbc@}=!49}l0VPO=hqTc3-iT$x!s500#QSo9}!6_ zj+n|~D4WnSKi2gKFllMKXf8~;3>xFOY}@@SqPCAkILY%WC=CfSC@!XhtE`kG=QIm$Mi zurm~!NXYG5eTAgk%9&h`B=t>NzqGJzVRs{6G&0$xa}KtQDQQNW1DA4zNPSSksScRsWv(VD%QxCzg$j|XWXaf+XN^)!)| zG=;kAJ62>qCb{7*0+`8)cCsxbCRc>`D$`b;FtEjQ{2WnQS{t6*PdR1(61N1bj492^ zVW+#OgOX_GVtCY0`lWhPc(3aDe_PE~$1HD> z?$m!!*E5|G@*@fVX9=e^8za!=>3Jv`%zwR7nfNDDF=blwbM`4=w!**>$ z%qbSkI=H|dyp}+d>>|iSQa`B$8%7FQ?WJD9>QRf|bSf=00<4*^=h867oelA`_R0>w zF};tATr|fyVPCfRc5aFxEsrz^U=_xLp{k*0sC&d(RLTVLjr{v9-kwROHq31?NzpIf zhdS@{`UVyE^#1w=nsk^+aS1ZZJ}ZwTsQN5gUt}oQ+R=U4I9jQ_$B-u_X4XBQz8QH|yJ9lR8 z+?gxaeXV4;{z)^YE3_JAeS6cc;aZu2dsaIf`z@ zvO?o@SF|B@=E_@gQ7dW{uvuSQomA)acLe%Rs8%8&@fG{w z6__8x9I!XU0@gQ{9T-|G57HABnal-dIi!UyIzUInAU~wL(ze{|O^ewM;wWDM8WB4$ zr#6FC(*UrfS+kOqFb5O~sF+l%Pk-)wUTf1#m{2{d-m2KymBPc(v3wR2LjrBr%l`p`?gEN^fd@DZBF2)1S#dfE?oLRa}vB zW7s7_F}i_u{CDyamnOdHmW`nCa5HmXml}+h%iojXW%u}5$!feS$D9(c5;qx07dNxw z1IDRq_ODI~uI)fAtimLV7XH_c%9gEf&WFX;6p~Q_aj}lG|Of zosgT}z97&fC;HI_Q0~6s^&Xo|D-?bZ%-VamV$;}IZtc-rt0iwp_1@wemeftn@_W_I zEbpp|Tib4&T^B!T>~&Gevzt%8wm(vT1D_NXZ)}#U-QHju54)n;fOt!ILShu`ftI&- zR4yvF1_69~yz$)|lP!FQ?BBrkJx*Pcs{@yEDJsR!OEJlsVSrX25tw+i4;4%sIY|IG zZjX&U+}+(6?j9M2p+a+3i`T*Y&JZsWR}g9%nqjKSA6pi?tOUOVg2<#@i+vU*F{OC& znNJTNy)iRDGZDmv6mzL9GSy+D#Sx*Y{u?Q<;ClLRIF(0cn9#x&TBuaWrpP$0wzDjl zK|4BK!@Vx(frIC5wr@3MzP(l!?2Aa})9mA~IS}>DM_)RQY`TBnOa)}KDC^2ScEmln zm^7}GyvSk~S$TO3`BREJBIA_fL;gsp4bQbGE`Tbx%Pe7UVF8C$wCE08jcay3U~7_| z>ExKB&8hz+bvEhBT%mgA;t*T%tnyY{?}4I&*E3;LZJ>`RN1I1|wv;^m{+IOBb>S@j zdfh|C4#7D+ex@L`2glf)pHkuXM`WG_!IRt%zDcwg1C)N=@DTp5&whXR2;<-JV=_+B z(GyHp(-SId301k0K?R?kk`H_5w>N7T>fIE_sMpD5x+{2=ZQ^q<@~7PL5pfcG{K&bT zwR*-@neH+Eyg>4XN8UaA0T#3R%}s2qoO&e zQ^5QDq)?DyLAfZEI zrGpf|_RpKaMi^`JOq}CN3&9sE#rW4|6WS#&SFr}5U-!~ol4U1z=w*9X$VOVF^b6PA z`_Uu^0wWS{FUQ(ru<5om*YFEat z?MwXJflHKD)w%L~bKj)Cn5j`o&e*MR2)%cUp0;lf%F>{iKOdQ@i`UOj9x>;4uJgP_ z@w7`0{84C>cU}CgYmBNn4>?cu?fkRFRR==Zc{|akP8u`T;K@ku7v1j>pG|E_qUW zep|=o2&xK&a|0c@JC9ys23RO|`ht_R{QKro-&%WEE=}x?3f1vEC#!cGj*aYI%E@Wj zXK}#3xBrlK;XORuQ!WhsnQXOCeBa-Me#eu0;{eJi1Z|KkXPi?YD^ej&AKci!%bUtg z@J#df35VlK4NSuicQd>q=DJ#5YusV9EKc|J<>TTu$W0X9t&+6g^$xzL1lN>tv?76R zeuAQL%k?e1A(eu4?!Hw>KD1USd}(a5?6DN4vC7U5a&Bv=b-rRmxR$q;_6;p({Xp=N z86zU0G^m@s4YU;%%oGkf(10xmkO9)!>szaew7f^v)Y*^t>((q)y!DOM=wxJ-!>EOc zo#u*FTG7H;bL~yUxA3y1Szk>w9sZdgfAA`(_V~77QwAJ@(!JwDm^|Pje#?}?lpIYT z(}P@Pq2Nk$8-DHIZLjP2J~BRV!tHd>?KV5uVM8lq`@B4i4gnX&z$+(%8yxCTG>XG_ z-`yU*Lwm7W_<{0C2E6=626$#CV=N_Dz^j8CpY4$a0ypd%OPl@lOA4IvE$Hj{QE&QzOB7YyA5q`CoYTf^` z`VCfqRfS*eDcrNDqJu&97T$yXv99qOonXabbujg0ldme~XPM1U=XQ412LvMG(TZ7s zoKu#D`3@JuwFsE7Wmq$n>hW&4`6;2V*89a*`uz7ap`oNu)-fHWgP&@uwR7zX3n%rp z+BtYbhu|DRkR&_XWf=v3rt({x{QdEnc8e9>t=ztHfG3`UFCmpag_EI#j{ceR{rp^Y z*mG;ou=}~gI)|2cG&*s^;vJPX+uy~)s~krbrN{+7geuwZTJ2cSrV+I=MmyIN5K0hM znfC7=!1cEJMYAG#M}s0<>$@jt)raq_Aq_V`u8Hya4#n=nJr1|Lr6UZ!!}20`vU)Lr z864dtpIa*Gc@&M?B){8N>nkXWV0$L-z;>%mPIA3gAa}BMXB1l7>JC|F8+DJdDX1qu zA>21JRfRp-l^+9A_=i%V5g!&X6dGF5*iHh^^s35dc3WZl^0(kjRJ2>>XPFly+Oorm;)7^=O$UCp>W9>}2jNFT=r3hB~^M)_8!eTku| zdGNrtIDo;{*s`-%&J`cPwjdFR+OT&9bm9e5c0=1GP8}kKxL}E||Ut;yhVANP#7r8tBJiFkqu6P( z0iqru+=}zMzIk<-a-{|Xt)C7>wOpdxfTVIcdVPev^`j)AWh8Mbqm|!0ct&_WMQK9;Lq{@8)l&pg{!E0r z70wi;<+jv<`bu4`S$C^?Un^9w$O`4YR4B)&h-|47n_9&rjBc3C3@-1h)KYg=Teds& zLoi}i%hm3>vfBQw50`cqh0u2}r?2J3pl-sO!5WL4{`sO>Jqbf;lvK4zv)L+@WW17orT1eQ-M}0+Kql7=%F1vvXytUKUkWN3ZI|Xw)hMWgATz|Z z{Lv9(-DQJ-6zb&MUtmq$RFiPI_OfKTu4^SD*nAKhGH$5QjP+cS;qPn0-jf3=%K3ea z`=pssT29i7O}RN73XUFI%D6juX+%tga@i3G;Yz983;injy;4}S7Ly9k53nB#LRp%c z?O}Ry0_KPeq4N9gE@!&NBl}|#&4KRV@h?jy3GCr3g_^}|w^_pe3{5oOuo$Xft9_Z- z`TN;`Zq0`d*9$?j6UQEMwzNT&zc4u9qA**;t%R4jQW%l07#y)Cj}IOWEli=itgE}M zjB)r}N)2{4g!dKHSw_0R#-Sf%XmKHFI4)-cdYUIgmZuVRSbux6vV@($@#4-<&-dxC-K{tFXB1N-!qGo0nE0=_Vj%=smm$kx2urPQA%% zkn?F?#!l~$a#QLJd0F>t7F-RVB*}ebW{yhA?x#z$1^x|_2W7aiOq>Gss_>kW@EVIY zfoy1(bO&Oa@>hO8&q@~jLR?BT=}<1HPoJ5~GH+}UC9#=V&Z#@R=;s;EGhLZiMBf&_3-Q9eyn=l1(;XKypznCRVTs%6C%+#q8J5fnwl1_Pdp}>uz z3ffDZ;Ml5UL8~$wG$NjvN75yaO0;3Snv|9AiYmRT z^}E%pW$MmJSmQ^xUZL3h<2yYJt2fw8moO#!gIT%Y;gUKn0NmQ zEgS1`C#;nkd#OVBR|6Qz4Fh}HU(a;IpA-wBa!?mILnVHXpOmip8`W10{T460dMQ%u zq*nUFpq@VCR&I``$NXPLEPmv;=)ZKa%rn}z&G_3*(QsCLRYt1=dvY@9Pb4Vwm5>d(cw{U3;L&V&Zd)Uyyrj{!1#}474!>{F z9#P@+47g;a6}>r>`xJI0qe?@tytu0_BVny%BVoBKmZ`aW+NQ-P-T8<7opB-e_52Ay z3c^`cn$p(xHwh1mMRZowpf>l{J3+RzueHFe+~}@rYittfB8uQf#2zztUwp?K;eja{ zaO>`UY&BZ)a{S@_WIlx1F&w=dnxmdj035I?7dHr$i8>1~Y`nIm6-AJ8ov5m859qtS zwZrXUD6wuA#fiFZ^^w*c!7R?%C9QdRK@CF8?CEqHM-ivHOXW;p&70>pY$%9=VOL&s z?cEL2P#Oxr5SJ7yTaO=~JUAf<0^TotawHBb5vo#jYX&eJ)j5-OA)FN~?DYL4)nm8* zs1Ecdx)$9o18KdthxKUAWe*pQS+Aez4$8vw5uLvgF+d9KgEHh&b%kk zR<~HjKhV0l=Fa{W%Nbse>ILP#dp^eFBo<38EP6b$FTysyDv*_QuB6&IHNMQ(`~+ z(uBe?;Bo(nVu{2vVpSC0>m$AaWi%)-TwRc{Y=|sS6K~a$=BCWi>BpZR@2_Z}f;^}H zoE-lSMcnF*{ndMcJHME0uW$Tj{p+pCy{$VtH@?07vq&PmdTaLhV1M>!#kqqF>aE- z2BANFIoZK)5x)M4n^BAW;85pP(v&^L-BmdM$z-LZ;K5+HX7WV>;umYk&{x?54~}1; zNqqWLBgAu^x^Zi(eby&y*M7Dk#DBzan3*qttrw?P z5d#j6@WO)kKxO``ySvv{f6?lRVnTpcw~ip!FaTdne!c&vYV|tK zzq2nUN0DJ=_N$-&Es8%q`PItNONXs3X*ZE|nQ>0*b|S5~&p4hToW$MTGoQN=ZNV8Z%F zJse$9AI|{xvm+7>>>V;J(J|OmwhY%;9hkE!(T)AR2! zF(04t^4ak5Y~|yV%ahixsrpm_z`O<(-}#?4lGEe+q4>p0?tG!slMR_guKR5H{bMWy z=l`OL8WsaM|G)U%JJZg_<7%RzyZsM;`r+R{;GL#^?C2l+PJyiZ@OwY`6f+&mI2&%C zJw5*(PXT&XMDzKdaZiy6iwU1jKKUF0aq{y|eE`|8@#OrU#lK9>|1|j&)B_VGR*?NA zt(KY4l#BcR8hwa0y{uJ|@9PZwmYI-Gp|S-jvD6n^rHYoD%t^4noUJ1Ok2r6|nm zq0Esv9W#y64~zdjcvu`0_HtRLFV4Szc%}u$mLm_-$)TM2@C-TsGh-xX&jUR|L$-Ie zHre1z1JD|M(dXpw(g7_qqY)3-IfQ-DA-h$%auU5O!&8YpwlA&43Ph-gmLPB^rgcdYvQl)uAd+f5Rvq&kM8?C zR#I2We`bIB;#VIjBlfL~d$Nl?Lq_d(y7vNguQrLCcTlfr*z_@!{kjf=ddm5R4wqvi z*FcBK%}dA6>IBTr5S#Vk5;2gnN%e#l+mR5LXI!zROh0QjCqaNTCTw8l>SJL6CQdxs zWqbH5>=2@9cTl-nF-6a&&?s%@*gJR_F=~#K^46oVq826(&;N~O(UoY)Wd9OCP1l_2 za`zgJ!of}lDQ6!qbQ%GsKm^0n<}8x41}XV^ZMX@inAH4$AeDy-t?C*=Z24qf7gjM+t76WG(+*Hh^P+$)ke)qARoqsP5J2xKa zULh!y<<2{k7mvhGmeEt9^GLX0Bkvo#is3?<(#FAeL0b*jg47{OlhBGrDlb4d15SsV zQgXv$i(}fqBqC7&VZ6owe4;E1Ms^&n_*rxb1uKlxUDl?2>LnpR_DlWHvd8~tejgBS zxjYWP=3DLZC5k43>5Mka;Q9BzW9fju841!kkS@fP85>vGn4zcIDSbZ{G$p^QCua{G zcU7>LMVWCwmBLz;4Y95892>SwCcg99SOAR{&GZ+B(=RPK~Ue(V6ajBHf?nt*gQ}J$b@3Nz-X-0y$vsp_#Syj zd#&|MCTXdg4$I<0vC0K!H}UBj8+^SSnC5pVPH({?%4sP z^Za|*siWBLjDb{}+(JweAS)7wl?uU0sJ2eQ-g9^ede*LN1-ssD(#;U4MUB7FOY+rqPmNN+~Kt6}*9{9-|lc_|}d19?kpxCmcvlQ$<9KHlg9d z+AiTpZ)tNcA3m7S*SxEjeoRYnf`@~$j9D{hZR^(zYT`ZKOtfGWr1-?bUIO4kE%cpp zZF6JHH67D$kC-?FYH68VabTJ67vF!BpYT0~6M?_z@3Am89>y7X| z{CURmjUi?D^%OQ8;JCEDePh`8_SUVfh(RbU{rb+ZzO(u5E`M+9pPp{r-o0`C#`^8u z%Ta<`8Nsoa2iS3=rc0{(HH4n9^l}9oR4&_96z-rSBqRzzeaIAwBYXJp{Lei5ZfDpS zl}JO607bVvy30Gh8t@Mr?hWg1kv|g@tY?7Nuzk$#uKnpLo}`j4Bp9GOsRIrcOIr7M zfOYZwdpg(zhVTJldd|#*(IhG$r-b{Wq;9`KGy~!0n6qj5kVC$~CErR?Y!$}UH=%A( zuk@#T`Hhe&ECY_Ax>$Tkd}Fws zEqQ3}1RpYXq~;>(wO)8%!*xPM%<1T9MJfGzAM7dZvoTP4K58__KG$JsS}UUnSj3k~ zmWiv&trvZDsXH!>kG7l3-r0+;Z{+5EBx-~MEYxMVA~xU)99GyH@!0ua%X7V_(y{g; zjWqBf?ZW#5Z`pqBlbNV5Qb#c_%yV!*qwZo(%A?wh7agJhKn9-gaN&v2*1fc3Y=k9) zsY{DP$yPWwh3TKBkB8X7BABhNZ`YtLoF){R>#t84fen%uG}dGG2u9%1yhxI(UHAot z(!G-tOaAqdRwjvkS7w6S-#73Sz8+1f{Z8hWrPZ&G`$m4}3}Q5%2)-pWto^IS&-C|L z3dCI}m)AX6LV3EUcxxz?NngTuV?RY;kh%gFnf_V(fKtndWNF>9L;CgvQJ?kqOV;S( zNdV)5i_7LIE1 z;qg}W=#}%)mmuRA=IL1f^}udkh_gZLjh$^|MzJL zL3)B@`(v8Uz}=9O$f{}_egsP-lKCDZ=Dp%%V2y<3bPmUK*eoi8xlgrXF|5L{jiE?9 zykxaXBg5-~M2G7fiYZlHL#xBBqIM~mc8JPg-;N!~hbmle3DY1@ERA`WE{&Q?_wm|C zC9Oqnbg)R@W)2~|EbP*H!#eQ)XP#Dao))su4 zFLfR)h6I0CxdCJdn$G z#gT+crl@$xI8@6zTIN}ih7rINK7r{jdp^`R>{ud5ECI$G!dxapj!eni5dQ&RJnSBv zh)^mVM7MXu@%d29QbgTShkXKCFQ>yUG@h({cbN$$^+w-i6*4u$42U1_g7mdnulVUH zFROE!-+aVQ{m@VfBvb=VAnoT z)y=OazxcveS3m#EwuAp)e9%_=m@o@;pVNKK6@N|rnEeOc$CS8qG4_B%AR4&7x;UI2 z`2<8PSh=J`irteG1_C$La&KvKdvtS%-(RQrimi~$4p=c%@v(4VS4k}aTf&%vOWB>+ zOuQW_L=uEJINTo&@ZZ)bQ|pJG1ng=BbnuznT4^d6*Xx?zf5KtO6$E0|{_!yZk}szJ zG+DiN_1e|RKVDn?n}5oA0p>M;5Bi+7$;zfAUgRLak3+ga)*32Otffnf<1r#xj7*Kn zhp%bF{>1MqYpVHP_CgR^nyxgyVg0F%9#95J^NHfvw-s;1X6z(+^i(O#S5=iYCd-)j zi+Yi=tLvoFn3#Y20zZ%-2OgQH5_97*IuSfni9*QSR4o(~t(;18CKrM=(HUDgA&GU> zF!kV?1&rnAtKvJ-YgH@Z5{5d(RH8{zupQbZx7JZ+!G62sn+qi)@+A zX^gFqie^g`RU^4Z(oX3OGA1NdpOG!K{}_FWHZ-ibat(0{&+*^R_DI);nQk&W|M!z& zYqomI*5*>1<2fhVN*$U8J0w;x!>>M)r@$(-mNa`GeJLi&M!9Cao8yB^b570Gx;#A9 zc`|9T|GVM*e+Qqe@}?L;|JvF$)JA$d$(Mqtl%c(Ui!HGnivGTR3!_1TnMLOfJdqSG zZ}ZDbEsF0s%(o0id~~I>-HfEs5J#K$9eJCT_k5jH*$alKk5}ZaqjUYXkp0B20S}XB z$f!{E-%0y5)su0-`5&uJRU4ZlABH7G>!E3c6X3;Vv4&A;2zjHjP+N3Odkk1=!e{}z zVRNl$aQIs3idav8lSm!;QY0(h7kz7WTB#EG1(WD@Y}|TheWP{Nna+kgH}16i;cipt z_AgO>rrIbnB(>WZW<*!C(p&S!lhy%=GDsiPs&1shsFh@wY}HgDbz`=C#3I#cSu%Bv zj#qV5&Sqrd#A&)LZ7Q0YlBYt>HK$H9<~$$nl{DS7f0+ddYA<^BkT^42qC`I zn+;o4tFsMJ$a3H%aUrs+2_h_T=+3FyL${jzQCY=d8=os3G>!mJJDuY71*=M=0+LAk z>QL4~5QsMt$19b7?dJ|Uo?3O;2f(A+ic`RiGw;v;jqfb?ae{BXyQ%o|@%z`EjT&lY z(%g~MA)c678#bphS0R?1>8MqueaZd#bq*;oXV-?nO(Rvc^%Rtlim6E`IM!YL5rIS zy!gH-^!tUC9r|*7NjS3trzTQ?vw)8-^Y#OT3i(dOU%j7K+rqth!a1_gWDSB(SKvF* zGSdOaF+OnBnnb1ffq%9jCQ>d>$zbBEVk$+B#ExUwN?je^!ho8{z*j_~f-;WC&V&ol zRe6=E8h@MOr2>=J?&@-H3~sEAieUbe^D=W zzgQ3hs^x*!sBaYX1I>~!#g_ffoGa5QXD^^PWyT4TuBvD$7JGFX(`5y~uu()~iSQ55 z!jDU$5}X#!K0rvRb0acDnbJ_k#M4f4gEv11&B$oHtR!3(r3Fl{#*OtM{TRoEn-DFX z#wwc3nXALY^M8(=4qB0&4^}2i6lFYtHnOw5<%$4eAHBlqTObk3@#2&Zre8LE?L*+_ zb(T6Kr>)0gIJ4iDfr@bWquw&h}&+b(XeQ8DSNj1@@+dX?~f+u2dN4&4zf>|=jERpGTNXxx;PA#{ z0FSU>Mow@&N!g_Rl_SFc^ztXjE0q)k;WzvDeciGX`9=~=ppYpDSW-Pqc{9!^1 z;V37vhBi&Ri20T!OFKlWc5!MUl$W;D1x3LwJk+z|pOQ}PNu^-*E*`?%mlwaO^Y7(G z&k*OHclL<<_A<8Dh}8JS^luVKh}htpk18GT3E`g>{$c<*b~BMlN_QlOv2k-gz!FSM zZvs6?j&v*%2n2VUw(xTZ+7uqo<8F*s?TsTaFV-R{`s6E)dP=m%p3}TAL|P42L+-#F ztqaaGsGJhH6;oAgmAR33jDBty7zJZw*{cJUwXMfYsCfSK7dxp740wJ(M+pe*45k0Q z&lw=L1jn7I=lq-J8koR#O%8}F8&7e8oAR+tISVfqkN7-vhUActMw1CmWI?nWkpSHn zF0TGupNH~g2d8~Vhq(D4a$*8v+OPqNK8TnO$e|qJEwFHHs_+VNC{kSrqS%=682WAP zM$lYuS>p!l2gPFL12p>7ES6%?GYMmSqI{S0vN;*gy`YOhvB98I;RokhnE3^UD+T}= zym;^%%g5!7GyY5_LcuG;^|pAT%UUSDA|}5UEUAvFoaN~}Sr^T) z&6%1NDWjZBUj?bfV-Ry4B#c^*_V)I3V{hXuAY~R=@c3hgxPh1=A9(C97Ucw0;fX#9 zxH0!@W+$I=bW>4sSfT>J9__*KGGin~R&{v2SKwg`CDIW}VeR0IS@D=NR)vv5+kwmy zK4C>;XW&WXSe16r7FP?Ytlmf^QoP6XGB#SNx6NwG>t?RlUW0RGcR~-Nh15_;#zJae zn3-{hRi)Uyh88BJg`6}EbW@{^t2>ZO9B0OHfW|BkR&8}x{UWiZOulJ{C}@wR*Csc> zP?t!`DRqI^uBaZ&K@~Sr8}=8Bq8F}4WE@gwy71Ev1RmQWUa;8L?#Ac~m)J;ZsaM3) zs4qTH<|+835`ckBlgdFAo&|Lh6SX)`0j6w`V`*auRduGd`P-df!b0X=@mgBpAtSh1 zxJEnB8%Q#@7#sC%5$$v+<^yd_(XgS|9NcDGrL49O(*3w=A9$dfp+q*b5w<~|SQrc9 zcxahUhKmf}>~^!NVWEGT+6Hh$(vbQ15~akFyf&qmZ? zvXxU!ddnj?OKETI-7%Ry62x)$;2s971PF#(^aMVodVMA z(c0gc8u;?8m?G3&RO{v^3aqD$87wsx)%ZmV-}N(k->6)nG?yDfeaEXMO61t0%eqwM zyP`i8kB6Bbshxs*3XCTgmbt}v&}rTjm7DUEKbETRrp_1CYr`Mmm|j6&610Vw_YZI( zvF8ap2v{gP!U9P2fJP{~xKy0>f!)5Bk)y+fy{t{{Y9rYl*4F319)+(HJ19XI|0Bj~ z42w5dB3l?QaFRz+hDld!+Hb zBkv&DYq9F+i!Jvn%!J4IU15P>mhs0gBXdAj$zMX2DKey7EyMPprB>m~&fwY@zz~S4 zyI^c~aw`vD>cy`RQ(*j7oX6D(0*fAXHWV-5!}5fHVFLZ!wxBjosutis8pcg@ z#C>nOjzV*qz`i)_*5U{A9WEI4w0j_2)>XM^U|qkECmmX{P_yuf6${7YyyxJe(;Twl zDV8n*9bwDMqy#37g-Rj&$61)bHR#}^Zg=O?qq7c&14(&b=c^QysVMiO3e`bfa}F|w zInu7!K-8Av=$QAxcSs*0-JfjhvY)9mwhsFE2sUBSiX)_`o@j|d`UIo{Uh@(By{0SRI5OV}fzSscGK^5UOj?`|f)eW{$xFHFPzP#!-0mtK)H@n%tS8LYKhUMQw!pXFJg#f)|YAt?D9M+ z4O!3Y8RFOIX*QYbN&GBxJ*w%V#d;$7%lZvgGwhAAK*FTJOGaym*(hPtP{coT(63<( zm40EhMz81T%CC36z0Ij-QG?lD7|nK@j$F={7`gNHo8JtZ-)wAq(Kc`I)L$8OG2;NH zlg*uVNp|7ZFD>M3*bEaG>6UclwY-I~M9G zH$pwtSz3vT+l#7Vx>!Sjmp$dYF&9`naBGC&*_2r>%sIO;Jo?RWkMNIk0l5gUwuy9n zqd5a`4U!rPZPjf5QsjavN}&+vQ1(Pho5_uxZzsR_{MsjzmA~h|)myh#H#aBWeDlSv zTVL$#q<{H*x9{$2o&VI=uYXM!(sOH@9D$DQCXWt6F%*|L2Ss^2q)gWGKkXIxHtm4h z)08H;N!}Y0i(aAH;6x~T6((jz<+o0tk?h^)-(SAyeRkZ)9;Kh1e?3@NC&cebXm&mn zCFHii<`+v{J$f^PKBGJ-PnLWuRUjFq|KV5#fJ$BKOd;p~Fz1)|+}mX(z;&ci>(upD34fj4mk zF7D~o4&#a z48N`nPiR-Bij@kE%ZoQdXC^3-1$NQ@yITF#s<6vjqXtS{P$OT|Oa5|Oz}xTqU+mKA z#T4kE#ez>Wsvt3VxL%5DeN95+88au{M&;y)GRZ2I&7c#^P5+YQ=R5=9e>)q#eSn0m zJQzaB^bm@Y2pPc<`WWVFpWRLXQmAK{cXQ{`nz27Oi|k4i=jf6w{lO6yB}3CTm|rNx z$tBd=^;S<#mItXX1UBqQK64oaRs^vXR;8G5i4?Y3y*b7Ok}2gg=1uO`t*2yoL z&H64ug+fL{sh#=V1hbE@um}N(V}XmR!lESjv;(g-Z_U=GgWClAFI8*I8)8q-TGA1gzHA+m6nunqx>^FN3Q|ph1`Rw|T9< zr0D^+<=-rQJC2I9_POUXCDLJ)tN&K)BRpNF;wi;rP92w@1pf6C#E2)SZ|>GzNsi)r z9SZ0&QGN@8)Tut!Vu%kBqF6o}hj<~!M-;j$q7{UnlLXd?`+ii|k<8#z#7G_-Ojo~Q zf50*p4Uww1(%5B4qmRIm6Qry^=+ws@AKeL(62m7VsY^wd2hS-7A@bPS0I?tCLV~lN zdrhtBE3>jiOFAjZyz^*n8ev*d?0fG_k&#j?gAWiLIbv@*a|WZaL*mNU$Hc;fLmk!G z8X^x#)tJ2~GdjQt+-&&s1M=xuuO8Y~O>I;|Fj7twgbvadA0HIZ5!z<?;<2Qt~&x#^yvX=Ty*l+9y~1;5c^DGk@-^sLlD_lhTyn4Q9;ksIJpF6!D~w#8II z9)?*N95r*Pq~rPVQ+K>nmjhR4{+Ne&HDUbj?zn{jillm-YB@0zRW<=yB3Hp)RhbrRNbtU?iWxEf8$%}%{FptYwC-xnAH!D?`UFc z{rMlmz(s^&TmY7IT_{}HHgIqe2steHOqD1Z5ijtvj?w9hVAI8w6gLQF1S+ee4u>gGk#DQ8yxjcqg62=5*$ZJ3BjyWkwS%((K_nyp5Bf5eFcdI-Xam zNd;&ufVahqx(Q|i_q9nyaI`QJj-~W_(wzzm{_v;&kiCUvs_LHtM+%HH63B?VDuB9# z#$}&Km!~~mz*6W5^eKf@dqt`bw3SLKmijTuAvgJ2!7#tQ87*L%i|mw~Wfw~&=>m!n zu~Q`Q$ir26>-foCcEd#vL3+x42ko5;yy{sOaD^lq)P5k-+&;X6G9m_wGj0_0&AP~v zbSY?U=@L#z=~2+got)k;y9`-{&FGzCUP*K}eOiQNp}QwCuCqVPO`+ye{%Qhzx@swk zNyx&RIBO;nDwfGf9E(Q)mMlXL1OC##J6gzeg}(MxL}hCO3)s;8iiVTATbuL{;B`_; z&-pgTSpdpAzYPos} z?r;cnN%cQjxtvliyKa6)!owkD>6Wvd9gW@!q+*TTeV(5YWc{x85(l#-pSsX^3%jJ3 z2`H#2oYN{;2j_F)E%I3L{szTm+yiWWMuM%eld=a#iy4*syot-E~se>cx5L8Ut!&4{S@#N7`=alo#FYqAhnWb?4Viebwcy!CSiMa)~G8Hvb+nt=qL5sjx*a77A* zGp^4Br~N%#YdFteMjDI^a*-PjUXfu2!0nw0O#%qv(l!5u zi@}!|=?Sp?+7|H1^>6NwS<~Lp(H%`vYW1V2Hj8?Fo9;UF3vcNJ+lggYu~QdzevjA< z;^VK!p}UMQlHdyT#J?+Hfi^FEC@4tD%-{nbNp0!`c-NIUG!xjdfrZ%Mf;u}%1S>~A zHuwbCl>PY{OPg&UOgT*W`hk)eJbOggfh)`2RdN5Wi2)qVq8TH;Ci)PlleiRqg?8|2Tmvw z(CMbk4>RebJvwH)?*oX0N9@l2fZL1+vhpoxaX4IAOkH60Lr6+!c6yTI&(tGvwVmI& zBi$s~GBV7Z(kd#OhGmug$o6)W*Z^7fEQDh^gUWEuIV1pH=sIUS>z(B>l49B6!*y}JQ20xs#4!>*gWyA_ z%_@sev@J{;+DFqPD>2myX-L}mW&rlK%OI#Dc;jTmQlhrzUJi-p|C`9UP4Z&eje0XK z|Az8hgf2E*=B$=YKecw<)kw`P`gd^^R^o~^*G)+=d!4L}vx7bR`{;Dl?Zc@+3i+X^ z_iuyfG{bt@U0Z~MF~-?J8BgXPNf>1wj?8+bLRQ`w5+-%d-o`Oe3@P?azTVzhC=iYn zz{t~3svK;^la&`Q)?WHQ+`;Z_Y0yB8#1g@E^;?^$}RibuD_qml? z)~uLyJt{~Yu20Y^o#nhEh!D>SDmPsJ-!X_d4D^CQ#KXUM3|}7}lXq>3DFzJo44r)^ z(lL)A{2?+kT?pBo_?%+&1h&FvdHK@}_oS}$RS=^>(|R|&@Zd;dB?*R?l26k4)q@ln zA}V2;yUT_g(3YKJJl@^iZfIKGY$yO-ShK14?oJWQ-nYR`oju0^EReQadm)OV^8#C+ z{~2tfS zPZynEr6jfiExv&j~8OQ~UI>O&V%Huk9r!vImWtd~` zoFvR*17gbuW}cjTWqd0EEC33H1WK$eV`&b*QqhC1RSpiYVN!xv*I=7qlm3 z1Gbt)>!?iyaT#+ZMQt3^)M1Jd@`xSz#PX2BlBCv@|iQTb`R zkLsXP%MYWbOM5D>Q9tRzGcJN9xh&KBvvQ);+zT-=Ue*U4UYdKbIFj|M9V*I7>TKtE z8s!22FPcj~U2G&m6IT1^&(#>Ak17`#8p1oH^~eM zbz5rAsPAv8Dsjb1#HU7WP0P~j3ajd+FAUvdH0wM5e7Lc@eicgx+8(oMSf+05_YtW5 zwIl)fxndUv+d18-L>hVi78#2T!+scrLRGhk8JYDacC8S^kqsd_lZ0!2IXB3&CogB( z`>HKwftVTl#{#YLpg~U2%Ph#KpU8HF{7IyWe2-p%=*T6D5CLPEzB%x=>Mb*$NYu$R z3XwvP#(I&}m=H$DbuWyWn>&GI`WGNC9oayo9dYazJl!1Usd0ie-`51*CQh4MGrP~rf zs{`D<%|!!Xt%YWqX3F36(5Im(71tF$D#d)w?=dP1&YE%h!p^$XG57U7FX{=Z_Dn+p zg#&3eUJIg;_OYbK$KB-d(J?8@Oz6YK3X8833`Q!!StdMn43pU^Jq)4PY-Fpz5~BB= zj}<9l`v4^%%%|BYqGT6s`N%e@5FN(*A(&G9m!zsWDg_7%IJLM=YhqPi)44T2hWfOr z=I$Xf$QGB`hYT*QnzzjocSr?fwQQ4u`mUQ@ zvat8z1Kxm{Ur{w(HwL4xdTEwhl}KZ)!Qor=s=U6onn z=&yoYQPs%{j6P@J54PT%rjBPdGJXH}VXEj-D*};_-&PijOT(eV-UuRI;phXJ?=^iW z^qlRY8yBW+X7~*E+XQ0~AFD^hAof~6Y=!A53A&=Oc-;2wAJoCUz<#0OZvk%ZT0%FE+fOi{V60KR5fz&J*y>(3 z@?Gx>$@cdJj&Fus{;mTzhA|5>f(Wwnq$&sB0UA%8;LGWW22jvJRgQq_B5#q2l@;9} z>rkW^`PG`eGx3GbS$dYaDq@5wYX{kD;M8}NZowY~Db&@&l8l6#Rghltb{Wct4px=; zcDUH-NwFeImAhfyOS||P9*S~i%bIy8Y_W8*`o%@cHQK9dW~eC7Btc?$)T{BfDNq^a z)NWY1W7(MZITf@XROOqyOleStKytv!Yrr<0ir!Q*x1WsLiV4DO-`Jl10`z5bT3Gze z9U^3visbjekR!y+VGeA#@``_I-sKR$^JOr^!x#dK|A8LAUEbYzjlu~^~&4a^Ej zGUcQ(FIHG$LuUr%oTIrYHG1V~OES%lpgOB6bQ6w7T`KkbrYrd*Cx5OKt}nXPu?UBAMsxz^%BoObD1AFJ`B!JXaqVZE)^^mI1h9rvnI>gGjU7b za`gZFA7}d*K&|q4%WL@fVlG7~!*FBveO2+bSV>p}MrGTTq@&NSp)5weiNLb88k;}z zwPRtAPNt6`^^)M9AL}#JbB){&)2LPeY?B^R5JnM&u;Qa@fY(ArC$?BQm`Sk89dpBh zzG?qQc`lgL1ZvWB43JbNaSmFz!LJR!IRFc%y-n98d8gbE3hUO$;LT5wcL)EKDApZ( zoMpwnwjS$+xhR_KcFxill!(#Q5qy;-qi}yM9TxuR`}ajq9-b2W_ST;2>m00t93GxD z`LlWc$Bp%y>tAmTw|r_z2$saKj0 zw{f&UiTD*877$1IXrpajIw?YwZV+d|9Ncsc^w4T0APC(UKOuaSgH9N^wnK?eq8UKK zUzmh6*dnXup^z3aB-mukP^^VlUqa@M}ve}h}{uG;e!s6xwy&N zM{m|Ev!zBED{RYx>CyKRYvaxc0zqggas4~2~lAY)`mGND4s0gS`OtO5nnLF zD7?E^F2&hZ-|7@i8mhfGoDJA5w0&|XB00}Ww$bpD-EElK)0w2`HPt3$-u{ch-beY(U-c!*< zbQe=9g2{G{=_O%Z?BcGJ^KF1xc>(|nXOs2#`AP<#)-+%r+Kx0sTp6<(3oVzCE0fpy zLDuhk1yi!X&&3dqAH3EV36kG{)XFvCygJ!OINZ%Z-cU6OI+S;MeobDyZS=C*5212l zK^1Glvf}pzJ#r^ykT?6xvn0=BfK;JhpNAnC;aC(A4EO8g0(QLUnQseD1qkp>IMA1B z$qsbqPtd2UIsw;LC^{7#J>2wJB48Lr^ELTGDCnr)ayi{aKcuYzjcx^Zi(ySlY|7c>L+OaKz8B+?lCRP1CP;M-2{U2~WofH?V-}S)BdST>Eq7hG6feaeYZ+&p9;aZJmIP!;T!R0Xx#wYq6YR z0rv7#Q2)ubYd`$y*B3cdao>jk)I8yyyhI*hDSsE#yZ~O1V(6T zI9pZgL4`+=*mTnawmAhD2EO%OOYY_YbRyZcFakh*d-fF6C0nHd1H95|y-(9Px487A zW9{m72ox8*GqrK$X~Q6JsMgDgm9S!tn8-6Ef2YVnFApD8-@+SGr$ObwH!vHGxk9<6 zhOl3DZfTJ-Y(IB`4M@|r(8-{ucC5*-i5mHe_B0C0jD@ijhD5q$D?7{a%<$MtRx6OD zc^e#ZP^`#QBj07L5X$63`USL79EuG2Fl!}~GyBTML((IOe^eu2cXq{sOXmDGev$W% z&#D3nsi^tHpo%*|_<|zd7o9Kq<4r9v;j)M$wR&lpyeI%pIdhBbscRv_quGQ z^qAAcgl-d56f(?!(;;4i+K_oc>V0CdZz22fGTx>9c*;t)1TWum@_7E%6*RnHSmJb- zr$r6zTkY7g5eg_)Qu?lq&_FbLUIfv6rDnKu5?cnP(F0JriD)72on!%gC=i2g4H1_B zd#B@KhIFj6iLL%fxmcV#Q#F;gP-=!v)c!$D#1mI4d##b5Ym|y#?Y-7+oDeCz?n9DV^_x|ueezn_qe3epCW!No@nEp zY~F*twQx31qqZw0JA=~nq*UFFR$D4=V-m(yx)c)`#&4CZ(r4ewDZ;GmFaE1*um;F< zxx*5{K)M^@@TkVJzY;wp-a~?Vv zk{o0j=ho?=k0WlXcqUx{?YVnk$OBl@Y7g3+&H7^sS>j^Q4}{8#MMUB1b%+^CRcJS; z+?)lPq*@zZ3!J5p5$2&7z^O}P1~3KNZy|Ptdnt5^4yCRM8P0Zz(*zkRF80ENN%<_s zp>|Tv%CeHtU6?GkR4R7=T-KL^h$YO{zC0k!dDoePXOd7Ze3rzGpabvj} zhYCq1PeQqhL|K?2B=|!07dk|kS$cZg%DQ}-zPj9x5mS3N>*f5m`DN3DOKpHEA|!13 zp{zs^u%JbMzAzZs{mR2=Ou_p%2RN)>E8F{`H8M9)tf>VVU?kyX)>|?NMb!_t*LU@A zvVs7W6L>ia+KgtwTWjE*u(TVob;IqgTkD*%ScGGf?kKZiww5DI^DcsL_~$XlvA9JS zUy3dE+x;%Iny}_>;BOYFnC+GNu(YrUAA7JAMaY8Ct{&Rt&JHb4&4gkLJ4}7B&{7Hb z1I>@K;9;Y-&iImQNof#HeUY4v9d3h6O3~;jWWqCl4wobk1o-#I#~GF`#}D`&0T71R zGf)Z~d_=5|s@+Qu<9t-)Z9aY`Eg@2b43*^;tt0_$d>g)LJoT@be=&&?-*{ayP-GpA zxz$TdtTC07Q)?e#LTGhsNK~y+OK!q*i%RiMad09&%(JY`w-JEX<5W1%A!sz?0bFL3 zF3D2v3E|FYEf32c&x>!*MbFcL=c31ElPaOkJ|FEpN2TXi5^scqV7}S$pb7$tS10w* z41y3kZQgi<1zB7)ggMj6Ul5xy?|;(M*OrEEabo>GD0v zJ_q9VYkZ0=Tu@GY_Ne_}Lu0533jld-(;CqCyOPf2?s%NBj+IO=e0 zYhh#MYcE>$F#S~?Q@cO|mUhr6?MR-dZ~>sjCC|!asg=}KG~v`_YeWbiRH~N}=L>RF zv@M?!f@Fj}ImrMjRw?{!m3RubqK_$3aFf6%E1#@>cI|II!$GdoDRs{w#Q0K#;&6`V z8P<1p?`~{OcJAJp+`P1PYy0N6I2bFv`?qrC;KO2YC4AGRKD(0-iksxxxDS7;l0k|E z5?7@U%S;aVMoZz_?t_hvzRh-v?#Tp(56K4LV36s`cElit0lF)_34KVlL~+~QPtUDf z1#6pwM~m*)a_oSAQDn>1|M3d=Qb|8j2Ixjs2DYdQDI*q}U^aU-z5oGz&N|Gf%4)Wq z4NTz*E=u!D*5=E#Uy9>A{PKr?jWIZYq#H-~-Lkb=?;z^Hv=*0+JFJxs-D$aFgRmvp+dzb)RQispnhpid1uuL4 zd36y-fggu$SChQ3JaR2o=$)JEsLM6p7%p1VVhSf`5t*dg=Chl)K8ac5a2!EDwr;P6 zRglg+Ruv3#tV`xY96DTrD8a4)YNi%b@6(SNvgDT z>3pUn^ljwGDlPw*-R6g%&e>7e(_0G+ZahfxUGYqZorin3vbFYYe<*gtIM}1v@i1=47$j$b zySZF>w$ixS8rqgL0!&r^MJ?)>7Ax3fTA%l0o}Zu$Nw7d!1l#e)Ect?)VA5`^o;#=atY+w|A%R~-M_8JGUT74uQ|y0>AEaRaB!z&LBd|*D-~C2wNBhl=kEio z<|;Mc6pIDfQv=Cf@iPyX{WH9sBDwX&I4e;KZu}`(WBcpv&lWmq-mb4e99H(D$Jv!;?HXFXTMlldsN(N-|A0@6T(qe z9uJ!LL3Jcdm(*lJIShjwp_6+e(ayRX?w2z(O(+7eG_ry+oxPmCQX)9ST7X+y0(VMc zTY~STnq*SP{EN(8SS$G5V~2xiBGqVzVJO-SlZX%e1Y>pHk?gn7AS74U?pc|PLFI5! z*iL-NoD@lFE@|Ye8rQ~Dr=k16JWN;(i&>Ssm5~k@{7p3kSvG zUr;I)-9+rN*7goAXLt=OJmdk|@{%E$8&( zy41pDG8*b=Tf-Vz8JxTKf;v~n3*`PtlocJrv}Xuiy_l?s_0!g9j%=z7iIa6fNpf)X zXttuJLn3kqYpK3KTL2v+C|zq~vT*InUr8tG`tQZ2WT!wOdbFo9huUbM;z#Lm zu{K#hd#r94lN}SY7jH#oP!emXi06&D?FA$pin$eEOw_)pRcAN2sk0C@6=%}0$W5f4 zLu%V}_!W^Fx^39e4NWDx8J&OwK-DSCjY|?90le4j5Go{fx0l zEE0x5G-N#C6$DZ`>gbLR2*B>@HaOG4R&E*?S!ql+Wm;D=Z!ZUjOnB4 zbRV>l2@*%|Z;L1m%-*3i-QM9?IY;Zc0rCW(&cEj*OSC3rkij441IpM}qsCfa_)Az9 z)E`P!(%)+gomP)j%FrAtecmdi0wY+|D27+HChkNwOVSxgufMfxYRGZ& zx2u|hHMB4+En6ymiO09GHMHvED&1`oxYB{9hlD6#?nD=`9UwI1+J<(LBRo-1!wg|@Cqlsk*orH zhwa&&^VasBdaM3T*3P(JP#|5JB&!A%;>T9cTW7D5!wj`_!RVDLQL*c@=R3}dv}P5&>wtL8K`OV{&Y zd1|8gxfGZ~8Zlr-MeTM*oHb+Ewq!xmIE3U+P>y8c-q_yg5BYIpE-L$lVe$!WP4bYc z75|n<9_a;^vR4`&Oa%|8hYA5|ccm$8o3-O2N<#ixxX|XbgkMbP!T^>j`-o0Eo3!wt z_iUxNEsbgdNf=g^Xn60iu2*A)+R&QSLr&aU9Q{_yLtp5eiYybNJehKBsY1|_H*doy z@1o_uuHFXgC0Xzd<+`dq4bUa~b`I-OYgoP!Ln3)4B3iNF3zM^pDCY1UYj;O!gdk+` zfRr2|&nRYiKo^eY_|WwV)L-QrE%HlN$`r zXC^QxRdFbxytQVcPZ}+(8{V~8lF;SV*ow*ej^6hp`hfS-_<5DmnHQ%C%?Z@V0WcR7 z3ye)Uk@FPq{UW2#gAGYC$9Nr-NnVU%rTnjw_Wx6$Pt;aU(v6rPF%7EH6KTGX_Dm?9 zIpU4A^N5J5K#r|vr$(lO|2p}{&8^A$ggo5;@K3LQ{^mbr$^$J28yRmsakAm&X5plZ zlmpQmNM(p2hdM1?>Y6YxP0C^F!a)+Ii)TqUOFWR*pv6snM+8cM378&J0pnf`VQy+P z9s5e_0V7-elo5Ij3GxvI%F}z9(r@kaQcGaXtn+MjLeeOlO?7)N(ne4=#+~^W3kNa| z|0wLWe7N-iODFu}6=o2v30^Q|s%0XPxtZC9okvzd9^iZfVjZpU!-Zi|sze@Mz8sB$ zwvJd}oGsuwW7(^3ZG^(GX?Kd#ce_HfghM#oPAHV%sGNUY8mB0~KX;xhbeeqom8a`^ zVz8;K0K1puIK^#`y+y|shRPvibua zcTEu~4rh3s~Msx<@W6d zUr{o;O@5w)FCrsoLhpdWyw?P_h@dd!ZjsCF!DKEMuvrmy*aq6!ewU8gMcUs4NjqnP zCL{7F(3pqux6nJ)Zq&}KIJ`NE=uK!AqI;Y^-XjB0TjV+sW$%zg6dO#(<@fe1o;+OI zYO-Pz2}1|0*nT7q2_2}04NkaoePi<3&p*G$Nkoz9hRx2CBeX7>u2LvIzwVAvVE{DS z^$b6#NUd$yc#gjBE?~8eT_g`{+2f~gGKeq-cIY)kPd6>H#WJvsQ|Y^`#5QENF!l*b?fZGB_%t1 z@(9CNg+j{wh;eSA?>1T?^hsE*IbVRMD3ZHFHUr@0k0`RhLKGtfoQ9%6#Fs@3i#YK> zMY$K9$-H?hE8~iw;LY%w}j%Z^iqiFnf;v z+eS7x8$=0lNmi2qL66SJ1&S6tx=tr~j+ID^Aqdac4p)(q-yjk4QvV%7Y?(_eHIhCkoVZ_5ywn3na5y zZK9Zq*}(f&nQ?i7@9~cLbmOI#!Co7RH)1O>6I3-CP=AII1l(23%+?`r z#S?qCTRO<28>%rG(tiv~a|AkLVKZJ)#=6QXkBa*#wCx$PYgst9W~_`0+8c zXr*GTpUw!V(Pjr(6kiZ!j^3TGx2Xv#&tWbiAmlbF4)rpdVrqsD?HUYkIDjaeryK$e zT%EQ%2{M&_RECIIul2hiqgn>)1M;1T zBL{@9=G%Q$F|oV(sxnNXnQ6<8?8tlRaz3<>&ljo#M26^VV+D;>6 zeS`3%W`~JaCJodCfyNatvG&UcCzGpRwv$OSW#lJ+^XZjqS3X^v{NpE+zq)p9vij*? zefCe2tDkk7=hWk2GS z4F~HxoS_qkHWxi)EK57>*&@RwRRoJF#l~w8le{~ZjO1?htSDo<$=q0&+sPU-BZI9k;A?`2_RL3eGK$VpW*Z(tFW;=vJfmualTjubLwMeJykqw^FqJ@bB@B=}X4O5E;vC0eq~ebq%an=ugQtiJs^oun6}spK-ZBFBoI~ z5u|9&P8q!X$aP|}vc7S3b3=#8gBBEzvD7IZr8<1W+ zdBWa52`7V&y0?e_<6m&IM%dT4hWs4(H#E_j-DHeV&NH8Q2eJcvdVz)Qiz{nZHH9-Z)NAAy~H^UYw z9@r4E3m>9;W%LPW&K2aK$BrdUMt>54f10thl}wHZ72$`7HT_JL?-aZg1V+*} z+LkCWcC>%3YWjlvMB1GpQ|NS1Jbh9nOV-w{T@Ciym)e{y>IZ1%;~tAF^zAJ)j&zPEOK^7ty6DX4~ZJXfDi zIrnGPJ@?mZFP@w}J^biPy4OzdY{8-_rG!Js(PGoiD(!>Ep-k4dgh}+{7594oRFkcl1_VXLePi2bUpn51-fpbHbnT)C>naKff8pW zpK90?f1p*MpxO{>;3N}I2#IH7^R7iF9a=lK9eYIpA4Iz(4iOJ(mu5A`>Sob569TA3 z2xyXgKz@R3_Uf{#-Q$I3R#k7e&D_^b@BY<##lkP!YWQL6^aBj&73Bj1T2`E~Aw4ESK$X3FQ0VbM zvQ%E-|1i4yexjp zQ!ui&>5?ze9KiaDG9?8s;Dq){SQ$VNrm%5xR#_L%-MiZvSU$K_!V1*3a7yp@Iwi8O z1e@~|Vo&w~i1oeXp6Nd_RFKPGx>#K=iz7A1<8=OdNOKMJ8zHXFV#F3L09&cnypK)L zrnYGtf(#Owu0<#Z)LZe^XT37XNMOte*q}x&?y3SUEU=heMPaKx5P;r+ z@K9_Fg#gcgiU6%FY;cv$l$3{(<*uj0>XVj?z7BywrE^qjMBW#QaQu;=BipN$mCDc| zR7*I&0zvq&J#+`1wpdvjMu-F5{A(1j;2M9zqAXLttSHx{)%;OimMp1PjO5wPs1U<# z2Nr}ETeJ1#{GZ`~?fR~)D@@J7$?4hN;eEhU4>(Mqf4Miin3Ay$W#u&))b}4t2l!(@ z>%)6iG8RdHczVv|cjH*Z{EB=wKZh5-Ow`@!+!ns%C!0++K+3hFNdzvkoL9G#jH>t= zO!!#T)!I~eneQ!Bv*XUXv*g77=Qz4I)1xNT`A_FNjN);JCGAFzZhjYzfd{Y?{T}tJ z{c!Q5L+WFV>sPj2F@nnv@A@ZO&u+J0G>Rx+04dpwJ`99K8mrrgvL4~+iG)4bSg+Vk z!X(T@RUf1xrW{k9@;H7&7bPrlgW6n_n&D?ko8V_tm=pe(r7l`<1NYM`Tm5+81P+0= zkq(0oH@#Q?fTDPI%(4P@&DaLTq!zSdNwyYEN+a@DdHuq2Xk5Z3W(O(;xgze;VWFerU>_eIKahD8s1n;* zgqWgdX@C_>S)28XGYDGC8=cW#QJMHOQx>Jyv7jvN&LBwLoH@L!eG0-WJz@+$=h0ZJ zHl|5Rn&teUZVZ|{iHi0J7Mgc5qO|O$#ieT(tFNBCTuOhtt%9wRohhH%1;ip~Odr#9=6&?#AKd-N?Nbr(A*PXgW>xLd0 z@l>R5UndZ7ARo$Xd>J-~jhH&QhIc5NXNpPR*q*&2j~RU%-;PKuH}bGO2wBq$Pf8*b zu?*5~oK5~PeemS?`1ejsVz1%|ljuxqc>-vBJZz#Iz#^=oFy4`4si-DkHF=ZZFOLdk zJjK0jjW1AZEUZ#T3PvGe&_I+JG;`T655Dx&{POC-m&H+9pQR(AIN8IAi%B8?DUfo2 z%)Lw&>Y%V9o0f92nKkF0Gnn;w=hJ5+DcL)o| zamFEXfIgfdfqt5&2cwH)AR-*rGr=TE*7sWWMizZ#nCRCg8{m)H*1`v1X8oeHP>EXt zdHa9~kTnxJTRVM$m%Yz$)l@|V8S)PAUr^0c>KBkK=jq;IEJ9U<=9{#hqND;D;24AV z3>%ORT5dKXeK=oWA7j4n2u0!ES)x6(an5TLt5iR%y@p{_kM9`u_QA8s^^@uJRXLHB z&Y$Td4d4m5nJJ{yx<()%L%uR?auCTd8Hh60*LeyI5ZXo+0~js>WVD$&SS*|qk$-lQ zDv*;A*qPUcv(1zq0G3QF-SN}V{c2g3R0ie3xItUXMP^s?IB-&^G7~kZJpgQfx$05ky_PWEz`qQ9 zzDMDQZf`YQvv}MA1gkkqxS!%Z-h>{9dwGG`fpa>jgcRisXKN>gTo4cJYAaEN_L^G2 zphsTfI>YD0i(Hx;I)JdM&(=&mF59BoRH_ezC%zpw9e_^JxPHHX{0BT^O`duTUEZ^30MLgt z-TxmXxTA_>Tcrt_nIh#FJra_V_Fxm1QX|UvzGBu9+-6jZhA(7Im~~0oG}sMsxPIn@ z2kasn&*yG;IcpOudhdyiTL^jk$qXc_1LQFU5&qsDM35=qJ9m=hxSwB7u}{+IsK9tT z)+&AA%^~CK5oe8}amV&u^MCqI-!&^f;JcW37_9y#G=n;ZZSWHjV3bi8a(Xla8#*EC z%KleRaiQVEMcFZAvdjhLh#KT!X;A@>B3Hou5qc8GW@y7odBX~1O7k6W?}wPB(1m-y zL5U<###ziENHG}Uw2t*{~YJ?wMSj^C!G=qA1fHq(@Iy>zr~<-H_P1REf$>TALvIYZz{M zsd0AcW9#VQ-ZSug+g904zFp9iuUjaY_aw@S#Q}IX+wCIsROjh*M{DG@FQJCktAhS&VJ;yzot8{MM8gJs*Y3(XoRijEL|&hr9KQMJOXtr(=rxB5 zLN9gzu??jR3cB}Yu|4Y)L9ui42GD0g8Ga8lu?e%@6y?(s<-SHv7{UP_|L+8x48biP zqXA79hh-LUTZuz;jCk#A8!}mqq~wqZUdX`mM|9~~WLy!)Sh$|@v@jZ3rKox49`k|9 z^cJ4aozvEAR8P=tgQ#9P^`Uc1jkno!{OxIAOPf z#4&;ZJ>pSx1}LYkGNtpH3O@{L$W!~vC#}&2*Zc7YBhs6PSRhYbtXmi$x8 z>vW@nEdqofRM=eM3Gwqnst97i(DwYi1 zVUzgl-!1-Tg5Qf0EM%?FM??!>2N@a_;5NV+C(CfOqct=40q@dq#u-7K-m6F25ePJ@ zRMvDBT8>PWC6&{-H%;~Q==t$WP>(e)Ac0i7XkkNCDxU4)FpXH;snjA88UlD2=t!lQ z!V{X->Pi=)D=0}&N!adL5nlf%DOe_WnipSY6uricqe<%)i0ztc5^VkbHSw&6hsQuT z5v+H+1V)CU@U%(C5{dlMkmw{U07()SYdJf^5pSlfIieF8(-XuHa(On@xt{RA?9x!g z7A)kQ+=mlL`&cqQkyrEHI=p(gCTQXAZ2(5)sCeDHy zXAJA6G6qH=?7zq1UisR;Z;V+2z2IoRb$j>5^&9KAcbNh5AddM`m84U6rb+A?Oi0Dz z3fX;E+2w@ecP?^KDSOd}>1A5;s^k}-k4Fl;S+#6W*%AWnb#!F(8;)fATT9^8i=+wD z=`2z0hjeZgaycCSw)5&73!*%fdTbJ7%TX|M@d%VZGCssqb;yTKo-P`Rb#PKePzI2! zRLv-?JiVtt1`W}%Dst7B{$9%{=v8J3Ow-uCT5$sm;g zX5|hatBcpqPaXkcDu$Bmn~d;{ed`Oz5Lpi!! zR44Utmr!J2kbp6lV`Fh4v-VMJ+v}j<7xn^}Df!Ta@6moE0`cPK-RsNS-|OW-w%8ze zJ}02_{$2jDio&yN6K<}M)rFxn0T?|hG)Xa0q*<80kh42^x43$9sq0$vE4*T?Dx5{9 zCk=^c^;nW%qGEZN*Cml^dRHi$8%>u!s$`bZb`83fgGdE(;JJu!tC7O>0xkbY!x6$M>yhDA8< z^S1l!^=5(2I!sg+`UI|8%BO6X_X?5Sn#X{pr1q{_?>ViF_9`Z>oKXzziwv-4E9d8q z6I1OZo+A|JS*kShU57t<{LX2sICk_gH<{yu!h-fsk}5gFfOZ(c?=U68tWq=jVBimL zYlh}WwQcsuNjugD9CG23wRH{1Td0_P0>l!^p$}tQCXMLYju5&v7-EXjEeP?I>B~l= z$wMRWnM)d;PDNBUt_er#*u1hf2QldgrI)xpxt9tV1bPXT!hv}?<{g}BinJ1>SjM=N z8*xD#l0rtxxIN4!CpxU@(eT~&`eaM2omjJ}Z?{Y6^JImip=`hiGw^YqTdARCS3uJAeqDYmN z0T99!D|M8#wPxI%{Fl{lu(($%ZP83He1KknE1f?x!De6<`vkv}Z*Hw`7%O(Rbv}ku zt1K&9QE?VRU3^;P`N+x8DIS(Xv$R>;im9Ub?3XWz?=8q<1oLs2y@1ZyxfJ3jB?jA9 z)x(T!r=Wxu3dftK=OwE}FZMJ<(cx-N2xp}Y*hX)7dhocJqe}2xr$7`$0yoc50u^(z zl!f51(opD(Y&dl04S*P#6*cj}1*tBK)-&g?{<-So>AUvqWmz${J=?AY7yEEXeY8MM zwqerNo&Vo{Z7G4)!wC1o?{-a9JZ zVF#iCd*SF9erm5b3C0x?oG$<|loxNXifrd{yU-$Jy!w26OL~B96!IoxrW7HDmD-g^ z1vLZ(SrsdHkm8rpu^^=t#8sma{sFc4bS`uRF9k)SQVUO&n}Fo^WSsJa0#zrtz9=2O zvN`bV|LyEtcI>EuFkFwq1`!qzi3NLv5CIagKw`lLP2fy2=r9wdCkTjm8D51KYI5JMXf2p0+ebfo`wca zT4m6f>pwk;JpDT@Jjg73BCiO_4#x^(HMj}}`iRNdIJENGm!<)V0EggeF3UFJ`r7(7 zaKgCli5!s*LV7~HBhXoKi8OfHTFYvfHAG?MQ9>t-_uBZr%Z;CQb$+4Hg_pAJU)%?3 zxbt3LhXc=Hv54uxYxRlto$c#7ko4d#mW> zibmcn(iK_Q&keDR9q1QvISKveZ`lB83>BSY?-}4zj2AZxm45PBp!ujcL8sc;+h(aS zahk{O`3ceMlt7UqnE)Dm&A`|~{&A3q992Df_Tc`(Z1ZeMb$~^E` z3mKktM}0h8Ywhl!UiN(0lhz(-L~Eapu9gaBcd?5x$pdyXj!7692XNkl@&2*}14MH8 zQrTuF0jRH|)~kEQ!NOv%iyX+*kISuy#UvZKXlrP=SLf+Di9;lB&=5ncSZZ$I&JCr9 zm{706L5?4u@o-o7xCM`CTxyy?(DIOBgP`iH&<(VWe&l~u&)%N{YRlOaLb8YXFdI0~ zV}mM}4v3s@C0WY?w7!X6*@+#lHun|}utS~hC{zOS!+}!6{y;KKxj0VY0Vj62z;GC8 z(X_G^Q{>A7L4l_+)lmLaF%G3rGml2zY4)aL`i^3sNcaXqc1uC$4Z3)N8L@%A(I#WM z!_>&6-fM;?-z;o9wLcow^um+WAeQ1IJ=I>zsb>^!KS2rYXS_^x6}awz;+6wxKA@jx z6B`0w$lja$irC1_XDl3vcJ3&FcP)kp{vEFQWVlbVEV?5Axg>8rNDl=mAburz2fl*v zD41Dq5SVXWxU!Qc+~nxVw4hz7aWkwe4!D2pwSZHgIluqNi9DG9Ls-nX#gF6kJG2Kb z)0->lL<^5{8-{QoGU73XhGL@)G`xV*|2XOd0?<%&kXr5HfuQ2QCaZhk1hEtx!=x8w zu&*P7O*jIz3|A0k3IXvJHVJUogiG-jY?` zx=~*;FSEP~K2|Y6xfbl&=IzEW5{5REte}04hoo9CZNsiQUP_LU&BT6A?_IAcHKwy2 zb&~m(2=};EMoVkCKK?@$#-I+{pSIv}2ggtuV5Mbwb+c&~nHywX%5Zc1;HCBG_X>!u z)kAYfde9o3PuhmK?-P~%vz9bkfaMXYAl1a(P41QOAWfJ^m}l+rotHl71=9)^$Zv_2 zV1+!|LXja_mecJH`;U^+45=lHLygQ+8o*J{FMg4iO|p>Sg8E$FKnf zd3J}b+wXaZ_vM&ybslnxKRW(wB&suo3O7ip|Mrv88y!AFCeMo!-zZ5yvluFU0Vp{k zducHtp7~(jJECLnSS_oZorJ1DWc*9T;PvU&l`lff65Qj&B&2T|D*#^HtG0y^8@QiUV)S0^oL?2E^$r;%(xwS zu!0j;xLJ6aK+j>A|j9`d5j^zqw-=%pt` z#JB`0ibggWlu429O9whaT-^t^>DMW;yR>ALK4@%RnGTkc{VMk>S|4%C(*%JYh+ANik zBEH&czr9IPq2@ypOn^6>kd~g>%7=E%v*1s74o=7wkYNeV2}{AD#Q)QG-+`i^sD?OP zKk7uZJf-P(PJcPOP3jCiF8Z_p#QzH7gAm7`kOsk03PDN?SbqxxPIQn_;HYzdg%VCv zm}ntVu@Zke-0} z9xBkJT%KN?plj`n@ev1Q5>R4|Fv!TJCO?2mvt0DjnJ9E8wOvY(7GiY?ad8@Ue9p;` zhT1z`y|t&8bs#-DSg5z$OhAlsZqw-;YTRTzEse&o4LfHpY3?LoYyJ6~CgIqT|KZd$Py9^&PkYn*`Ydt-aZ?kG-MqqsJT(C`c1CT-of3Dq zo#1O1D&4Nzkr9Y5+ml*a?F%8bIJx`&v&|UfWs}3NL_4O2D-JOGe6Yf&2Nj5s`u^=T zDM-(M{8f!zRO@-heu9lkJ?mrNUoy^K9CI2ufAZU_+g$OdtmD&9@R&aK4D5({MRU)H zSRU>bMfNreqz~9CWQ+r(=W7>xDe1zY@AiJrq4Lw@<-Acpk59~--RRh`IB$I`uvOUrmSPC2myvg z$#-2@6jQ+m2NMdnZdY$ke>ihNzLa9SKrbv@yZuDLmFS))nx0Qn4h4;WhlIFL SPAi(nU%OHD4sLgjkL_Pb_^)LE literal 0 HcmV?d00001 diff --git a/netbox/translations/fr/LC_MESSAGES/django.po b/netbox/translations/fr/LC_MESSAGES/django.po new file mode 100644 index 000000000..91740bb5c --- /dev/null +++ b/netbox/translations/fr/LC_MESSAGES/django.po @@ -0,0 +1,13654 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Jeremy Stretch, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-21 17:54+0000\n" +"PO-Revision-Date: 2023-10-30 17:48+0000\n" +"Last-Translator: Jeremy Stretch, 2023\n" +"Language-Team: French (https://app.transifex.com/netbox-community/teams/178115/fr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: fr\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#: account/tables.py:27 templates/account/token.html:23 +#: templates/users/token.html:18 users/forms/bulk_import.py:41 +#: users/forms/model_forms.py:113 +msgid "Key" +msgstr "Clé" + +#: account/tables.py:31 users/forms/filtersets.py:133 +msgid "Write Enabled" +msgstr "Écriture activée" + +#: account/tables.py:34 core/tables/jobs.py:29 extras/choices.py:135 +#: extras/tables/tables.py:469 templates/account/token.html:44 +#: templates/core/configrevision.html:34 +#: templates/core/configrevision_restore.html:12 templates/core/job.html:58 +#: templates/extras/htmx/report_result.html:11 +#: templates/extras/htmx/script_result.html:12 +#: templates/extras/journalentry.html:25 templates/generic/object.html:48 +#: templates/users/token.html:36 +msgid "Created" +msgstr "Créé" + +#: account/tables.py:37 templates/account/token.html:48 +#: templates/users/token.html:40 users/forms/bulk_edit.py:97 +#: users/forms/filtersets.py:137 +msgid "Expires" +msgstr "Expire" + +#: account/tables.py:40 users/forms/filtersets.py:142 +msgid "Last Used" +msgstr "Dernière utilisation" + +#: account/tables.py:43 templates/account/token.html:56 +#: templates/users/token.html:48 users/forms/bulk_edit.py:102 +#: users/forms/model_forms.py:125 +msgid "Allowed IPs" +msgstr "IP autorisées" + +#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 +#: dcim/choices.py:174 dcim/choices.py:220 dcim/choices.py:1419 +#: dcim/choices.py:1495 dcim/choices.py:1545 virtualization/choices.py:20 +#: virtualization/choices.py:45 vpn/choices.py:18 +msgid "Planned" +msgstr "Planifié" + +#: circuits/choices.py:22 netbox/navigation/menu.py:290 +msgid "Provisioning" +msgstr "Approvisionnement" + +#: circuits/choices.py:23 dcim/choices.py:22 dcim/choices.py:103 +#: dcim/choices.py:173 dcim/choices.py:219 dcim/choices.py:1494 +#: dcim/choices.py:1544 extras/tables/tables.py:375 ipam/choices.py:31 +#: ipam/choices.py:49 ipam/choices.py:69 ipam/choices.py:154 +#: templates/extras/configcontext.html:26 templates/users/user.html:34 +#: users/forms/bulk_edit.py:36 virtualization/choices.py:22 +#: virtualization/choices.py:44 vpn/choices.py:19 wireless/choices.py:25 +msgid "Active" +msgstr "Actif" + +#: circuits/choices.py:24 dcim/choices.py:172 dcim/choices.py:218 +#: dcim/choices.py:1493 dcim/choices.py:1546 virtualization/choices.py:24 +#: virtualization/choices.py:43 +msgid "Offline" +msgstr "Hors ligne" + +#: circuits/choices.py:25 +msgid "Deprovisioning" +msgstr "Déprovisionnement" + +#: circuits/choices.py:26 +msgid "Decommissioned" +msgstr "Mis hors service" + +#: circuits/filtersets.py:29 circuits/filtersets.py:182 dcim/filtersets.py:120 +#: dcim/filtersets.py:181 dcim/filtersets.py:256 dcim/filtersets.py:364 +#: dcim/filtersets.py:881 dcim/filtersets.py:1177 dcim/filtersets.py:1672 +#: dcim/filtersets.py:1845 dcim/filtersets.py:1902 ipam/filtersets.py:305 +#: ipam/filtersets.py:896 virtualization/filtersets.py:45 +#: virtualization/filtersets.py:172 vpn/filtersets.py:330 +msgid "Region (ID)" +msgstr "Région (ID)" + +#: circuits/filtersets.py:36 circuits/filtersets.py:189 dcim/filtersets.py:126 +#: dcim/filtersets.py:188 dcim/filtersets.py:263 dcim/filtersets.py:371 +#: dcim/filtersets.py:888 dcim/filtersets.py:1184 dcim/filtersets.py:1679 +#: dcim/filtersets.py:1852 dcim/filtersets.py:1909 extras/filtersets.py:414 +#: ipam/filtersets.py:312 ipam/filtersets.py:903 +#: virtualization/filtersets.py:52 virtualization/filtersets.py:179 +#: vpn/filtersets.py:325 +msgid "Region (slug)" +msgstr "Région (limace)" + +#: circuits/filtersets.py:42 circuits/filtersets.py:195 dcim/filtersets.py:194 +#: dcim/filtersets.py:269 dcim/filtersets.py:377 dcim/filtersets.py:894 +#: dcim/filtersets.py:1190 dcim/filtersets.py:1685 dcim/filtersets.py:1858 +#: dcim/filtersets.py:1915 ipam/filtersets.py:318 ipam/filtersets.py:909 +#: virtualization/filtersets.py:58 virtualization/filtersets.py:185 +msgid "Site group (ID)" +msgstr "Groupe de sites (ID)" + +#: circuits/filtersets.py:49 circuits/filtersets.py:202 dcim/filtersets.py:201 +#: dcim/filtersets.py:276 dcim/filtersets.py:384 dcim/filtersets.py:901 +#: dcim/filtersets.py:1197 dcim/filtersets.py:1692 dcim/filtersets.py:1865 +#: dcim/filtersets.py:1922 extras/filtersets.py:420 ipam/filtersets.py:325 +#: ipam/filtersets.py:916 virtualization/filtersets.py:65 +#: virtualization/filtersets.py:192 +msgid "Site group (slug)" +msgstr "Groupe de sites (slug)" + +#: circuits/filtersets.py:54 circuits/forms/bulk_import.py:117 +#: circuits/forms/filtersets.py:47 circuits/forms/filtersets.py:171 +#: circuits/forms/model_forms.py:137 dcim/forms/bulk_edit.py:166 +#: dcim/forms/bulk_edit.py:238 dcim/forms/bulk_edit.py:570 +#: dcim/forms/bulk_edit.py:763 dcim/forms/bulk_import.py:130 +#: dcim/forms/bulk_import.py:176 dcim/forms/bulk_import.py:249 +#: dcim/forms/bulk_import.py:477 dcim/forms/bulk_import.py:1239 +#: dcim/forms/bulk_import.py:1267 dcim/forms/filtersets.py:84 +#: dcim/forms/filtersets.py:217 dcim/forms/filtersets.py:264 +#: dcim/forms/filtersets.py:373 dcim/forms/filtersets.py:680 +#: dcim/forms/filtersets.py:910 dcim/forms/filtersets.py:934 +#: dcim/forms/filtersets.py:1024 dcim/forms/filtersets.py:1062 +#: dcim/forms/filtersets.py:1468 dcim/forms/filtersets.py:1492 +#: dcim/forms/filtersets.py:1516 dcim/forms/model_forms.py:138 +#: dcim/forms/model_forms.py:167 dcim/forms/model_forms.py:211 +#: dcim/forms/model_forms.py:397 dcim/forms/model_forms.py:630 +#: dcim/forms/object_create.py:390 dcim/tables/devices.py:186 +#: dcim/tables/power.py:26 dcim/tables/power.py:93 dcim/tables/racks.py:62 +#: dcim/tables/racks.py:138 dcim/tables/sites.py:129 extras/filtersets.py:430 +#: ipam/forms/bulk_edit.py:215 ipam/forms/bulk_edit.py:269 +#: ipam/forms/bulk_edit.py:447 ipam/forms/bulk_edit.py:519 +#: ipam/forms/bulk_import.py:170 ipam/forms/bulk_import.py:437 +#: ipam/forms/filtersets.py:152 ipam/forms/filtersets.py:226 +#: ipam/forms/filtersets.py:417 ipam/forms/filtersets.py:470 +#: ipam/forms/model_forms.py:206 ipam/forms/model_forms.py:548 +#: ipam/forms/model_forms.py:640 ipam/tables/ip.py:244 +#: ipam/tables/vlans.py:114 ipam/tables/vlans.py:216 +#: templates/circuits/circuittermination_edit.html:20 +#: templates/circuits/inc/circuit_termination.html:33 +#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 +#: templates/dcim/inc/cable_termination.html:33 +#: templates/dcim/location.html:40 templates/dcim/powerpanel.html:23 +#: templates/dcim/rack.html:25 templates/dcim/rackreservation.html:31 +#: templates/dcim/site.html:27 templates/ipam/prefix.html:57 +#: templates/ipam/vlan.html:26 templates/ipam/vlan_edit.html:40 +#: templates/virtualization/cluster.html:45 +#: templates/virtualization/virtualmachine.html:96 +#: virtualization/forms/bulk_edit.py:90 virtualization/forms/bulk_edit.py:99 +#: virtualization/forms/bulk_edit.py:108 virtualization/forms/bulk_edit.py:123 +#: virtualization/forms/bulk_import.py:59 +#: virtualization/forms/bulk_import.py:85 +#: virtualization/forms/filtersets.py:78 +#: virtualization/forms/filtersets.py:144 +#: virtualization/forms/model_forms.py:74 +#: virtualization/forms/model_forms.py:107 +#: virtualization/forms/model_forms.py:174 +#: virtualization/tables/clusters.py:77 +#: virtualization/tables/virtualmachines.py:53 vpn/forms/filtersets.py:262 +#: wireless/forms/model_forms.py:77 wireless/forms/model_forms.py:117 +msgid "Site" +msgstr "Site" + +#: circuits/filtersets.py:60 circuits/filtersets.py:213 +#: circuits/filtersets.py:250 dcim/filtersets.py:211 dcim/filtersets.py:286 +#: dcim/filtersets.py:358 extras/filtersets.py:436 ipam/filtersets.py:215 +#: ipam/filtersets.py:335 ipam/filtersets.py:926 +#: virtualization/filtersets.py:75 virtualization/filtersets.py:202 +#: vpn/filtersets.py:335 +msgid "Site (slug)" +msgstr "Site (limace)" + +#: circuits/filtersets.py:65 +msgid "ASN (ID)" +msgstr "ASN (IDENTIFIANT)" + +#: circuits/filtersets.py:86 circuits/filtersets.py:112 +#: circuits/filtersets.py:146 +msgid "Provider (ID)" +msgstr "Fournisseur (ID)" + +#: circuits/filtersets.py:92 circuits/filtersets.py:118 +#: circuits/filtersets.py:152 +msgid "Provider (slug)" +msgstr "Fournisseur (slug)" + +#: circuits/filtersets.py:157 +msgid "Provider account (ID)" +msgstr "Compte fournisseur (ID)" + +#: circuits/filtersets.py:162 +msgid "Provider network (ID)" +msgstr "Réseau de fournisseurs (ID)" + +#: circuits/filtersets.py:166 +msgid "Circuit type (ID)" +msgstr "Type de circuit (ID)" + +#: circuits/filtersets.py:172 +msgid "Circuit type (slug)" +msgstr "Type de circuit (slug)" + +#: circuits/filtersets.py:207 circuits/filtersets.py:244 +#: dcim/filtersets.py:205 dcim/filtersets.py:280 dcim/filtersets.py:352 +#: dcim/filtersets.py:905 dcim/filtersets.py:1202 dcim/filtersets.py:1697 +#: dcim/filtersets.py:1869 dcim/filtersets.py:1927 ipam/filtersets.py:209 +#: ipam/filtersets.py:329 ipam/filtersets.py:920 +#: virtualization/filtersets.py:69 virtualization/filtersets.py:196 +#: vpn/filtersets.py:340 +msgid "Site (ID)" +msgstr "Site (ID)" + +#: circuits/filtersets.py:236 core/filtersets.py:73 core/filtersets.py:132 +#: dcim/filtersets.py:633 dcim/filtersets.py:1171 dcim/filtersets.py:1973 +#: extras/filtersets.py:40 extras/filtersets.py:69 extras/filtersets.py:101 +#: extras/filtersets.py:140 extras/filtersets.py:168 extras/filtersets.py:195 +#: extras/filtersets.py:226 extras/filtersets.py:295 extras/filtersets.py:343 +#: extras/filtersets.py:403 extras/filtersets.py:562 extras/filtersets.py:604 +#: extras/filtersets.py:645 ipam/forms/model_forms.py:430 +#: netbox/filtersets.py:275 netbox/forms/__init__.py:23 +#: netbox/forms/base.py:152 templates/htmx/object_selector.html:28 +#: templates/inc/filter_list.html:53 templates/ipam/ipaddress_assign.html:32 +#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:86 +#: users/filtersets.py:21 users/filtersets.py:37 users/filtersets.py:69 +#: users/filtersets.py:117 utilities/forms/forms.py:99 +msgid "Search" +msgstr "Rechercher" + +#: circuits/filtersets.py:240 circuits/forms/bulk_edit.py:167 +#: circuits/forms/model_forms.py:110 circuits/forms/model_forms.py:132 +#: dcim/forms/connections.py:66 templates/circuits/circuit.html:15 +#: templates/dcim/inc/cable_termination.html:55 +#: templates/dcim/trace/circuit.html:4 +msgid "Circuit" +msgstr "Circuit" + +#: circuits/filtersets.py:254 +msgid "ProviderNetwork (ID)" +msgstr "Réseau de fournisseurs (ID)" + +#: circuits/forms/bulk_edit.py:25 circuits/forms/filtersets.py:56 +#: circuits/forms/model_forms.py:26 circuits/tables/providers.py:33 +#: dcim/forms/bulk_edit.py:126 dcim/forms/filtersets.py:187 +#: dcim/forms/model_forms.py:126 dcim/tables/sites.py:94 +#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:219 +#: netbox/navigation/menu.py:160 netbox/navigation/menu.py:163 +#: templates/circuits/provider.html:24 +msgid "ASNs" +msgstr "SAN" + +#: circuits/forms/bulk_edit.py:29 circuits/forms/bulk_edit.py:51 +#: circuits/forms/bulk_edit.py:78 circuits/forms/bulk_edit.py:99 +#: circuits/forms/bulk_edit.py:159 core/forms/bulk_edit.py:27 +#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:71 +#: dcim/forms/bulk_edit.py:90 dcim/forms/bulk_edit.py:149 +#: dcim/forms/bulk_edit.py:190 dcim/forms/bulk_edit.py:208 +#: dcim/forms/bulk_edit.py:336 dcim/forms/bulk_edit.py:371 +#: dcim/forms/bulk_edit.py:386 dcim/forms/bulk_edit.py:445 +#: dcim/forms/bulk_edit.py:484 dcim/forms/bulk_edit.py:514 +#: dcim/forms/bulk_edit.py:538 dcim/forms/bulk_edit.py:608 +#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:709 +#: dcim/forms/bulk_edit.py:732 dcim/forms/bulk_edit.py:780 +#: dcim/forms/bulk_edit.py:850 dcim/forms/bulk_edit.py:903 +#: dcim/forms/bulk_edit.py:938 dcim/forms/bulk_edit.py:978 +#: dcim/forms/bulk_edit.py:1022 dcim/forms/bulk_edit.py:1067 +#: dcim/forms/bulk_edit.py:1094 dcim/forms/bulk_edit.py:1112 +#: dcim/forms/bulk_edit.py:1130 dcim/forms/bulk_edit.py:1148 +#: dcim/forms/bulk_edit.py:1566 extras/forms/bulk_edit.py:36 +#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:152 +#: extras/forms/bulk_edit.py:182 extras/forms/bulk_edit.py:263 +#: extras/forms/bulk_edit.py:287 extras/forms/bulk_edit.py:301 +#: extras/tables/tables.py:56 ipam/forms/bulk_edit.py:50 +#: ipam/forms/bulk_edit.py:70 ipam/forms/bulk_edit.py:90 +#: ipam/forms/bulk_edit.py:114 ipam/forms/bulk_edit.py:143 +#: ipam/forms/bulk_edit.py:172 ipam/forms/bulk_edit.py:191 +#: ipam/forms/bulk_edit.py:260 ipam/forms/bulk_edit.py:304 +#: ipam/forms/bulk_edit.py:352 ipam/forms/bulk_edit.py:395 +#: ipam/forms/bulk_edit.py:423 ipam/forms/bulk_edit.py:551 +#: ipam/forms/bulk_edit.py:582 templates/account/token.html:36 +#: templates/circuits/circuit.html:60 templates/circuits/circuittype.html:29 +#: templates/circuits/inc/circuit_termination.html:115 +#: templates/circuits/provider.html:34 +#: templates/circuits/providernetwork.html:35 +#: templates/core/datasource.html:55 templates/dcim/cable.html:37 +#: templates/dcim/consoleport.html:47 templates/dcim/consoleserverport.html:47 +#: templates/dcim/device.html:96 templates/dcim/devicebay.html:35 +#: templates/dcim/devicerole.html:33 templates/dcim/devicetype.html:36 +#: templates/dcim/frontport.html:61 templates/dcim/interface.html:70 +#: templates/dcim/inventoryitem.html:61 +#: templates/dcim/inventoryitemrole.html:23 templates/dcim/location.html:36 +#: templates/dcim/manufacturer.html:43 templates/dcim/module.html:71 +#: templates/dcim/modulebay.html:39 templates/dcim/moduletype.html:27 +#: templates/dcim/platform.html:36 templates/dcim/powerfeed.html:43 +#: templates/dcim/poweroutlet.html:43 templates/dcim/powerpanel.html:31 +#: templates/dcim/powerport.html:43 templates/dcim/rack.html:54 +#: templates/dcim/rackreservation.html:69 templates/dcim/rackrole.html:29 +#: templates/dcim/rearport.html:57 templates/dcim/region.html:34 +#: templates/dcim/site.html:60 templates/dcim/sitegroup.html:34 +#: templates/dcim/virtualchassis.html:32 +#: templates/extras/admin/plugins_list.html:26 +#: templates/extras/configcontext.html:22 +#: templates/extras/configtemplate.html:18 +#: templates/extras/customfield.html:35 +#: templates/extras/dashboard/widget_add.html:14 +#: templates/extras/eventrule.html:24 templates/extras/exporttemplate.html:25 +#: templates/extras/report_list.html:47 templates/extras/savedfilter.html:18 +#: templates/extras/script_list.html:53 templates/extras/tag.html:23 +#: templates/extras/webhook.html:20 templates/generic/bulk_import.html:118 +#: templates/ipam/aggregate.html:44 templates/ipam/asn.html:43 +#: templates/ipam/asnrange.html:39 templates/ipam/fhrpgroup.html:35 +#: templates/ipam/ipaddress.html:58 templates/ipam/iprange.html:70 +#: templates/ipam/prefix.html:82 templates/ipam/rir.html:29 +#: templates/ipam/role.html:29 templates/ipam/routetarget.html:22 +#: templates/ipam/service.html:53 templates/ipam/servicetemplate.html:28 +#: templates/ipam/vlan.html:65 templates/ipam/vlangroup.html:35 +#: templates/ipam/vrf.html:36 templates/tenancy/contact.html:68 +#: templates/tenancy/contactgroup.html:28 +#: templates/tenancy/contactrole.html:23 templates/tenancy/tenant.html:25 +#: templates/tenancy/tenantgroup.html:36 +#: templates/users/objectpermission.html:22 templates/users/token.html:28 +#: templates/virtualization/cluster.html:28 +#: templates/virtualization/clustergroup.html:29 +#: templates/virtualization/clustertype.html:29 +#: templates/virtualization/virtualdisk.html:40 +#: templates/virtualization/virtualmachine.html:34 +#: templates/virtualization/vminterface.html:54 +#: templates/vpn/ikepolicy.html:18 templates/vpn/ikeproposal.html:18 +#: templates/vpn/ipsecpolicy.html:18 templates/vpn/ipsecprofile.html:18 +#: templates/vpn/ipsecprofile.html:43 templates/vpn/ipsecprofile.html:78 +#: templates/vpn/ipsecproposal.html:18 templates/vpn/l2vpn.html:27 +#: templates/vpn/tunnel.html:34 templates/vpn/tunnelgroup.html:33 +#: templates/wireless/wirelesslan.html:27 +#: templates/wireless/wirelesslangroup.html:34 +#: templates/wireless/wirelesslink.html:37 tenancy/forms/bulk_edit.py:31 +#: tenancy/forms/bulk_edit.py:79 tenancy/forms/bulk_edit.py:121 +#: users/forms/bulk_edit.py:62 users/forms/bulk_edit.py:92 +#: virtualization/forms/bulk_edit.py:31 virtualization/forms/bulk_edit.py:45 +#: virtualization/forms/bulk_edit.py:176 virtualization/forms/bulk_edit.py:227 +#: virtualization/forms/bulk_edit.py:336 vpn/forms/bulk_edit.py:27 +#: vpn/forms/bulk_edit.py:63 vpn/forms/bulk_edit.py:120 +#: vpn/forms/bulk_edit.py:154 vpn/forms/bulk_edit.py:191 +#: vpn/forms/bulk_edit.py:216 vpn/forms/bulk_edit.py:248 +#: vpn/forms/bulk_edit.py:277 wireless/forms/bulk_edit.py:28 +#: wireless/forms/bulk_edit.py:81 wireless/forms/bulk_edit.py:128 +msgid "Description" +msgstr "Descriptif" + +#: circuits/forms/bulk_edit.py:46 circuits/forms/bulk_edit.py:68 +#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:35 +#: circuits/forms/bulk_import.py:50 circuits/forms/bulk_import.py:76 +#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 +#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 +#: circuits/forms/model_forms.py:32 circuits/forms/model_forms.py:44 +#: circuits/forms/model_forms.py:58 circuits/forms/model_forms.py:92 +#: circuits/tables/circuits.py:55 circuits/tables/providers.py:72 +#: circuits/tables/providers.py:103 templates/circuits/circuit.html:19 +#: templates/circuits/provider.html:20 +#: templates/circuits/provideraccount.html:21 +#: templates/circuits/providernetwork.html:23 +#: templates/dcim/inc/cable_termination.html:51 +msgid "Provider" +msgstr "Prestataire" + +#: circuits/forms/bulk_edit.py:75 circuits/forms/filtersets.py:91 +#: templates/circuits/providernetwork.html:31 +msgid "Service ID" +msgstr "Identifiant du service" + +#: circuits/forms/bulk_edit.py:95 circuits/forms/filtersets.py:107 +#: dcim/forms/bulk_edit.py:204 dcim/forms/bulk_edit.py:500 +#: dcim/forms/bulk_edit.py:694 dcim/forms/bulk_edit.py:1063 +#: dcim/forms/bulk_edit.py:1090 dcim/forms/bulk_edit.py:1562 +#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1353 +#: dcim/forms/filtersets.py:1374 dcim/tables/devices.py:717 +#: dcim/tables/devices.py:777 dcim/tables/devices.py:1004 +#: dcim/tables/devicetypes.py:245 dcim/tables/devicetypes.py:260 +#: dcim/tables/racks.py:32 extras/forms/bulk_edit.py:259 +#: extras/tables/tables.py:323 templates/circuits/circuittype.html:33 +#: templates/dcim/cable.html:41 templates/dcim/devicerole.html:37 +#: templates/dcim/frontport.html:43 templates/dcim/inventoryitemrole.html:27 +#: templates/dcim/rackrole.html:33 templates/dcim/rearport.html:43 +#: templates/extras/tag.html:29 +msgid "Color" +msgstr "Couleur" + +#: circuits/forms/bulk_edit.py:113 circuits/forms/bulk_import.py:89 +#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:17 +#: core/forms/filtersets.py:29 core/tables/data.py:20 core/tables/jobs.py:18 +#: dcim/forms/bulk_edit.py:281 dcim/forms/bulk_edit.py:672 +#: dcim/forms/bulk_edit.py:811 dcim/forms/bulk_edit.py:879 +#: dcim/forms/bulk_edit.py:898 dcim/forms/bulk_edit.py:921 +#: dcim/forms/bulk_edit.py:963 dcim/forms/bulk_edit.py:1007 +#: dcim/forms/bulk_edit.py:1058 dcim/forms/bulk_edit.py:1085 +#: dcim/forms/bulk_import.py:206 dcim/forms/bulk_import.py:645 +#: dcim/forms/bulk_import.py:671 dcim/forms/bulk_import.py:697 +#: dcim/forms/bulk_import.py:717 dcim/forms/bulk_import.py:800 +#: dcim/forms/bulk_import.py:890 dcim/forms/bulk_import.py:932 +#: dcim/forms/bulk_import.py:1145 dcim/forms/bulk_import.py:1304 +#: dcim/forms/filtersets.py:286 dcim/forms/filtersets.py:867 +#: dcim/forms/filtersets.py:967 dcim/forms/filtersets.py:1088 +#: dcim/forms/filtersets.py:1158 dcim/forms/filtersets.py:1180 +#: dcim/forms/filtersets.py:1202 dcim/forms/filtersets.py:1219 +#: dcim/forms/filtersets.py:1253 dcim/forms/filtersets.py:1348 +#: dcim/forms/filtersets.py:1369 dcim/forms/object_import.py:89 +#: dcim/forms/object_import.py:118 dcim/forms/object_import.py:150 +#: dcim/tables/devices.py:211 dcim/tables/devices.py:833 +#: dcim/tables/power.py:77 extras/forms/bulk_import.py:39 +#: extras/tables/tables.py:345 extras/tables/tables.py:443 +#: netbox/tables/tables.py:234 templates/circuits/circuit.html:31 +#: templates/core/datasource.html:39 templates/dcim/cable.html:16 +#: templates/dcim/consoleport.html:39 templates/dcim/consoleserverport.html:39 +#: templates/dcim/frontport.html:39 templates/dcim/interface.html:47 +#: templates/dcim/interface.html:175 templates/dcim/interface.html:323 +#: templates/dcim/powerfeed.html:35 templates/dcim/poweroutlet.html:39 +#: templates/dcim/powerport.html:39 templates/dcim/rack.html:81 +#: templates/dcim/rearport.html:39 templates/extras/eventrule.html:95 +#: templates/virtualization/cluster.html:20 templates/vpn/l2vpn.html:23 +#: templates/wireless/inc/authentication_attrs.html:9 +#: templates/wireless/inc/wirelesslink_interface.html:14 +#: virtualization/forms/bulk_edit.py:59 virtualization/forms/bulk_import.py:41 +#: virtualization/forms/filtersets.py:53 +#: virtualization/forms/model_forms.py:65 virtualization/tables/clusters.py:66 +#: vpn/forms/bulk_edit.py:267 vpn/forms/bulk_import.py:259 +#: vpn/forms/filtersets.py:214 vpn/forms/model_forms.py:83 +#: vpn/forms/model_forms.py:118 vpn/forms/model_forms.py:232 +msgid "Type" +msgstr "Type" + +#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:82 +#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:97 +msgid "Provider account" +msgstr "Compte du fournisseur" + +#: circuits/forms/bulk_edit.py:131 circuits/forms/bulk_import.py:95 +#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:34 +#: core/forms/filtersets.py:75 core/tables/data.py:23 core/tables/jobs.py:26 +#: dcim/forms/bulk_edit.py:104 dcim/forms/bulk_edit.py:179 +#: dcim/forms/bulk_edit.py:260 dcim/forms/bulk_edit.py:593 +#: dcim/forms/bulk_edit.py:646 dcim/forms/bulk_edit.py:678 +#: dcim/forms/bulk_edit.py:805 dcim/forms/bulk_edit.py:1585 +#: dcim/forms/bulk_import.py:87 dcim/forms/bulk_import.py:146 +#: dcim/forms/bulk_import.py:194 dcim/forms/bulk_import.py:442 +#: dcim/forms/bulk_import.py:596 dcim/forms/bulk_import.py:1139 +#: dcim/forms/bulk_import.py:1299 dcim/forms/filtersets.py:170 +#: dcim/forms/filtersets.py:229 dcim/forms/filtersets.py:281 +#: dcim/forms/filtersets.py:726 dcim/forms/filtersets.py:835 +#: dcim/forms/filtersets.py:871 dcim/forms/filtersets.py:972 +#: dcim/forms/filtersets.py:1083 dcim/tables/devices.py:173 +#: dcim/tables/devices.py:836 dcim/tables/devices.py:1064 +#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:66 +#: dcim/tables/sites.py:82 dcim/tables/sites.py:133 +#: ipam/forms/bulk_edit.py:240 ipam/forms/bulk_edit.py:289 +#: ipam/forms/bulk_edit.py:337 ipam/forms/bulk_edit.py:541 +#: ipam/forms/bulk_import.py:191 ipam/forms/bulk_import.py:256 +#: ipam/forms/bulk_import.py:292 ipam/forms/bulk_import.py:458 +#: ipam/forms/filtersets.py:205 ipam/forms/filtersets.py:270 +#: ipam/forms/filtersets.py:341 ipam/forms/filtersets.py:482 +#: ipam/forms/model_forms.py:449 ipam/tables/ip.py:236 ipam/tables/ip.py:309 +#: ipam/tables/ip.py:359 ipam/tables/ip.py:421 ipam/tables/ip.py:448 +#: ipam/tables/vlans.py:122 ipam/tables/vlans.py:227 +#: templates/circuits/circuit.html:35 templates/core/datasource.html:47 +#: templates/core/job.html:35 templates/dcim/cable.html:20 +#: templates/dcim/device.html:183 templates/dcim/location.html:48 +#: templates/dcim/module.html:67 templates/dcim/powerfeed.html:39 +#: templates/dcim/rack.html:46 templates/dcim/site.html:43 +#: templates/extras/report_list.html:49 templates/extras/script_list.html:55 +#: templates/ipam/ipaddress.html:40 templates/ipam/iprange.html:57 +#: templates/ipam/prefix.html:74 templates/ipam/vlan.html:51 +#: templates/virtualization/cluster.html:24 +#: templates/virtualization/virtualmachine.html:22 +#: templates/vpn/tunnel.html:26 templates/wireless/wirelesslan.html:23 +#: templates/wireless/wirelesslink.html:20 users/forms/filtersets.py:33 +#: users/forms/model_forms.py:196 virtualization/forms/bulk_edit.py:69 +#: virtualization/forms/bulk_edit.py:117 +#: virtualization/forms/bulk_import.py:54 +#: virtualization/forms/bulk_import.py:80 +#: virtualization/forms/filtersets.py:61 +#: virtualization/forms/filtersets.py:156 virtualization/tables/clusters.py:74 +#: virtualization/tables/virtualmachines.py:50 vpn/forms/bulk_edit.py:38 +#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:46 +#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:42 +#: wireless/forms/bulk_edit.py:104 wireless/forms/bulk_import.py:43 +#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:48 +#: wireless/forms/filtersets.py:82 wireless/tables/wirelesslan.py:52 +#: wireless/tables/wirelesslink.py:19 +msgid "Status" +msgstr "État" + +#: circuits/forms/bulk_edit.py:137 circuits/forms/bulk_import.py:100 +#: circuits/forms/filtersets.py:119 dcim/forms/bulk_edit.py:120 +#: dcim/forms/bulk_edit.py:185 dcim/forms/bulk_edit.py:255 +#: dcim/forms/bulk_edit.py:366 dcim/forms/bulk_edit.py:583 +#: dcim/forms/bulk_edit.py:684 dcim/forms/bulk_edit.py:1590 +#: dcim/forms/bulk_import.py:106 dcim/forms/bulk_import.py:151 +#: dcim/forms/bulk_import.py:187 dcim/forms/bulk_import.py:274 +#: dcim/forms/bulk_import.py:416 dcim/forms/bulk_import.py:1151 +#: dcim/forms/bulk_import.py:1356 dcim/forms/filtersets.py:165 +#: dcim/forms/filtersets.py:197 dcim/forms/filtersets.py:248 +#: dcim/forms/filtersets.py:333 dcim/forms/filtersets.py:354 +#: dcim/forms/filtersets.py:653 dcim/forms/filtersets.py:826 +#: dcim/forms/filtersets.py:891 dcim/forms/filtersets.py:921 +#: dcim/forms/filtersets.py:1043 dcim/tables/power.py:88 +#: extras/filtersets.py:517 extras/forms/filtersets.py:331 +#: extras/forms/filtersets.py:405 ipam/forms/bulk_edit.py:40 +#: ipam/forms/bulk_edit.py:65 ipam/forms/bulk_edit.py:109 +#: ipam/forms/bulk_edit.py:138 ipam/forms/bulk_edit.py:163 +#: ipam/forms/bulk_edit.py:235 ipam/forms/bulk_edit.py:284 +#: ipam/forms/bulk_edit.py:332 ipam/forms/bulk_edit.py:536 +#: ipam/forms/bulk_import.py:37 ipam/forms/bulk_import.py:66 +#: ipam/forms/bulk_import.py:94 ipam/forms/bulk_import.py:114 +#: ipam/forms/bulk_import.py:134 ipam/forms/bulk_import.py:163 +#: ipam/forms/bulk_import.py:249 ipam/forms/bulk_import.py:285 +#: ipam/forms/bulk_import.py:451 ipam/forms/filtersets.py:47 +#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:99 +#: ipam/forms/filtersets.py:119 ipam/forms/filtersets.py:142 +#: ipam/forms/filtersets.py:169 ipam/forms/filtersets.py:256 +#: ipam/forms/filtersets.py:296 ipam/forms/filtersets.py:450 +#: ipam/tables/ip.py:451 ipam/tables/vlans.py:224 +#: templates/circuits/circuit.html:39 templates/dcim/cable.html:24 +#: templates/dcim/device.html:81 templates/dcim/location.html:52 +#: templates/dcim/powerfeed.html:47 templates/dcim/rack.html:37 +#: templates/dcim/rackreservation.html:56 templates/dcim/site.html:47 +#: templates/dcim/virtualdevicecontext.html:55 +#: templates/ipam/aggregate.html:31 templates/ipam/asn.html:34 +#: templates/ipam/asnrange.html:30 templates/ipam/ipaddress.html:31 +#: templates/ipam/iprange.html:61 templates/ipam/prefix.html:30 +#: templates/ipam/routetarget.html:18 templates/ipam/vlan.html:42 +#: templates/ipam/vrf.html:23 templates/tenancy/tenant.html:17 +#: templates/virtualization/cluster.html:36 +#: templates/virtualization/virtualmachine.html:38 templates/vpn/l2vpn.html:31 +#: templates/vpn/tunnel.html:50 templates/wireless/wirelesslan.html:35 +#: templates/wireless/wirelesslink.html:28 tenancy/forms/forms.py:25 +#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:53 +#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:75 +#: virtualization/forms/bulk_edit.py:154 +#: virtualization/forms/bulk_import.py:66 +#: virtualization/forms/bulk_import.py:115 +#: virtualization/forms/filtersets.py:46 +#: virtualization/forms/filtersets.py:101 vpn/forms/bulk_edit.py:58 +#: vpn/forms/bulk_edit.py:272 vpn/forms/bulk_import.py:59 +#: vpn/forms/bulk_import.py:253 vpn/forms/filtersets.py:211 +#: wireless/forms/bulk_edit.py:62 wireless/forms/bulk_edit.py:109 +#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 +#: wireless/forms/filtersets.py:34 wireless/forms/filtersets.py:74 +msgid "Tenant" +msgstr "Locataire" + +#: circuits/forms/bulk_edit.py:142 circuits/forms/filtersets.py:174 +msgid "Install date" +msgstr "Date d'installation" + +#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:179 +msgid "Termination date" +msgstr "Date de résiliation" + +#: circuits/forms/bulk_edit.py:153 circuits/forms/filtersets.py:186 +msgid "Commit rate (Kbps)" +msgstr "Taux de validation (Kbits/s)" + +#: circuits/forms/bulk_edit.py:168 circuits/forms/model_forms.py:111 +msgid "Service Parameters" +msgstr "Paramètres du service" + +#: circuits/forms/bulk_edit.py:169 circuits/forms/model_forms.py:112 +#: dcim/forms/model_forms.py:141 dcim/forms/model_forms.py:183 +#: dcim/forms/model_forms.py:260 dcim/forms/model_forms.py:672 +#: dcim/forms/model_forms.py:1478 ipam/forms/model_forms.py:61 +#: ipam/forms/model_forms.py:114 ipam/forms/model_forms.py:135 +#: ipam/forms/model_forms.py:159 ipam/forms/model_forms.py:231 +#: ipam/forms/model_forms.py:257 netbox/navigation/menu.py:38 +#: templates/dcim/cable_edit.html:68 templates/dcim/device_edit.html:85 +#: templates/dcim/rack_edit.html:30 templates/ipam/ipaddress_bulk_add.html:27 +#: templates/ipam/ipaddress_edit.html:27 templates/ipam/vlan_edit.html:22 +#: virtualization/forms/model_forms.py:83 +#: virtualization/forms/model_forms.py:225 vpn/forms/bulk_edit.py:77 +#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 +#: vpn/forms/model_forms.py:146 vpn/forms/model_forms.py:404 +#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:160 +msgid "Tenancy" +msgstr "Location" + +#: circuits/forms/bulk_import.py:38 circuits/forms/bulk_import.py:53 +#: circuits/forms/bulk_import.py:79 +msgid "Assigned provider" +msgstr "Prestataire assigné" + +#: circuits/forms/bulk_import.py:70 dcim/forms/bulk_import.py:170 +#: dcim/forms/bulk_import.py:380 dcim/forms/bulk_import.py:1092 +#: dcim/forms/bulk_import.py:1171 extras/forms/bulk_import.py:229 +msgid "RGB color in hexadecimal. Example:" +msgstr "Couleur RGB en hexadécimal. Exemple :" + +#: circuits/forms/bulk_import.py:85 +msgid "Assigned provider account" +msgstr "Compte fournisseur attribué" + +#: circuits/forms/bulk_import.py:92 +msgid "Type of circuit" +msgstr "Type de circuit" + +#: circuits/forms/bulk_import.py:97 dcim/forms/bulk_import.py:89 +#: dcim/forms/bulk_import.py:148 dcim/forms/bulk_import.py:196 +#: dcim/forms/bulk_import.py:444 dcim/forms/bulk_import.py:598 +#: dcim/forms/bulk_import.py:1301 ipam/forms/bulk_import.py:193 +#: ipam/forms/bulk_import.py:258 ipam/forms/bulk_import.py:294 +#: ipam/forms/bulk_import.py:460 virtualization/forms/bulk_import.py:56 +#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 +msgid "Operational status" +msgstr "État opérationnel" + +#: circuits/forms/bulk_import.py:104 dcim/forms/bulk_import.py:110 +#: dcim/forms/bulk_import.py:155 dcim/forms/bulk_import.py:278 +#: dcim/forms/bulk_import.py:420 dcim/forms/bulk_import.py:1155 +#: dcim/forms/bulk_import.py:1296 ipam/forms/bulk_import.py:41 +#: ipam/forms/bulk_import.py:70 ipam/forms/bulk_import.py:98 +#: ipam/forms/bulk_import.py:118 ipam/forms/bulk_import.py:138 +#: ipam/forms/bulk_import.py:167 ipam/forms/bulk_import.py:253 +#: ipam/forms/bulk_import.py:289 ipam/forms/bulk_import.py:455 +#: virtualization/forms/bulk_import.py:70 +#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 +#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +msgid "Assigned tenant" +msgstr "Locataire assigné" + +#: circuits/forms/bulk_import.py:123 circuits/forms/filtersets.py:147 +#: circuits/forms/model_forms.py:143 +msgid "Provider network" +msgstr "Réseau de fournisseurs" + +#: circuits/forms/filtersets.py:26 circuits/forms/filtersets.py:118 +#: dcim/forms/bulk_edit.py:247 dcim/forms/bulk_edit.py:345 +#: dcim/forms/bulk_edit.py:575 dcim/forms/bulk_edit.py:622 +#: dcim/forms/bulk_edit.py:772 dcim/forms/bulk_import.py:181 +#: dcim/forms/bulk_import.py:255 dcim/forms/bulk_import.py:483 +#: dcim/forms/bulk_import.py:1245 dcim/forms/bulk_import.py:1279 +#: dcim/forms/filtersets.py:92 dcim/forms/filtersets.py:245 +#: dcim/forms/filtersets.py:278 dcim/forms/filtersets.py:330 +#: dcim/forms/filtersets.py:381 dcim/forms/filtersets.py:650 +#: dcim/forms/filtersets.py:689 dcim/forms/filtersets.py:890 +#: dcim/forms/filtersets.py:919 dcim/forms/filtersets.py:939 +#: dcim/forms/filtersets.py:1003 dcim/forms/filtersets.py:1033 +#: dcim/forms/filtersets.py:1042 dcim/forms/filtersets.py:1153 +#: dcim/forms/filtersets.py:1175 dcim/forms/filtersets.py:1197 +#: dcim/forms/filtersets.py:1214 dcim/forms/filtersets.py:1234 +#: dcim/forms/filtersets.py:1342 dcim/forms/filtersets.py:1364 +#: dcim/forms/filtersets.py:1385 dcim/forms/filtersets.py:1400 +#: dcim/forms/filtersets.py:1411 dcim/forms/model_forms.py:182 +#: dcim/forms/model_forms.py:216 dcim/forms/model_forms.py:402 +#: dcim/forms/model_forms.py:635 dcim/tables/devices.py:190 +#: dcim/tables/power.py:30 dcim/tables/racks.py:58 dcim/tables/racks.py:143 +#: extras/filtersets.py:441 extras/forms/filtersets.py:328 +#: ipam/forms/bulk_edit.py:456 ipam/forms/filtersets.py:168 +#: ipam/forms/filtersets.py:400 ipam/forms/filtersets.py:422 +#: ipam/forms/filtersets.py:448 ipam/forms/model_forms.py:560 +#: templates/dcim/device.html:26 templates/dcim/device_edit.html:30 +#: templates/dcim/inc/cable_termination.html:12 +#: templates/dcim/location.html:27 templates/dcim/powerpanel.html:27 +#: templates/dcim/rack.html:29 templates/dcim/rackreservation.html:35 +#: virtualization/forms/filtersets.py:45 virtualization/forms/filtersets.py:99 +#: wireless/forms/model_forms.py:88 wireless/forms/model_forms.py:128 +msgid "Location" +msgstr "Emplacement" + +#: circuits/forms/filtersets.py:27 ipam/forms/model_forms.py:158 +#: ipam/models/asns.py:108 ipam/models/asns.py:125 ipam/tables/asn.py:41 +#: templates/ipam/asn.html:20 +msgid "ASN" +msgstr "ASN" + +#: circuits/forms/filtersets.py:28 circuits/forms/filtersets.py:120 +#: dcim/forms/filtersets.py:136 dcim/forms/filtersets.py:150 +#: dcim/forms/filtersets.py:166 dcim/forms/filtersets.py:198 +#: dcim/forms/filtersets.py:249 dcim/forms/filtersets.py:334 +#: dcim/forms/filtersets.py:408 dcim/forms/filtersets.py:654 +#: dcim/forms/filtersets.py:1004 netbox/navigation/menu.py:45 +#: netbox/navigation/menu.py:47 tenancy/tables/columns.py:70 +#: tenancy/tables/contacts.py:25 tenancy/views.py:18 +#: virtualization/forms/filtersets.py:36 virtualization/forms/filtersets.py:47 +#: virtualization/forms/filtersets.py:102 +msgid "Contacts" +msgstr "Contacts" + +#: circuits/forms/filtersets.py:33 circuits/forms/filtersets.py:157 +#: dcim/forms/bulk_edit.py:110 dcim/forms/bulk_edit.py:222 +#: dcim/forms/bulk_edit.py:747 dcim/forms/bulk_import.py:92 +#: dcim/forms/filtersets.py:70 dcim/forms/filtersets.py:177 +#: dcim/forms/filtersets.py:203 dcim/forms/filtersets.py:256 +#: dcim/forms/filtersets.py:359 dcim/forms/filtersets.py:666 +#: dcim/forms/filtersets.py:896 dcim/forms/filtersets.py:926 +#: dcim/forms/filtersets.py:1010 dcim/forms/filtersets.py:1049 +#: dcim/forms/filtersets.py:1460 dcim/forms/filtersets.py:1484 +#: dcim/forms/filtersets.py:1508 dcim/forms/model_forms.py:80 +#: dcim/forms/model_forms.py:115 dcim/forms/object_create.py:374 +#: dcim/tables/devices.py:176 dcim/tables/sites.py:85 extras/filtersets.py:408 +#: ipam/forms/bulk_edit.py:205 ipam/forms/bulk_edit.py:437 +#: ipam/forms/bulk_edit.py:509 ipam/forms/filtersets.py:212 +#: ipam/forms/filtersets.py:407 ipam/forms/filtersets.py:456 +#: ipam/forms/model_forms.py:532 templates/dcim/device.html:18 +#: templates/dcim/rack.html:19 templates/dcim/rackreservation.html:25 +#: templates/dcim/region.html:26 templates/dcim/site.html:31 +#: templates/ipam/prefix.html:50 templates/ipam/vlan.html:19 +#: virtualization/forms/bulk_edit.py:80 virtualization/forms/filtersets.py:58 +#: virtualization/forms/filtersets.py:129 +#: virtualization/forms/model_forms.py:95 vpn/forms/filtersets.py:253 +msgid "Region" +msgstr "Région" + +#: circuits/forms/filtersets.py:38 circuits/forms/filtersets.py:162 +#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:755 +#: dcim/forms/filtersets.py:75 dcim/forms/filtersets.py:182 +#: dcim/forms/filtersets.py:208 dcim/forms/filtersets.py:269 +#: dcim/forms/filtersets.py:364 dcim/forms/filtersets.py:671 +#: dcim/forms/filtersets.py:901 dcim/forms/filtersets.py:1015 +#: dcim/forms/filtersets.py:1054 dcim/forms/object_create.py:382 +#: extras/filtersets.py:425 ipam/forms/bulk_edit.py:210 +#: ipam/forms/bulk_edit.py:444 ipam/forms/bulk_edit.py:514 +#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:412 +#: ipam/forms/filtersets.py:461 ipam/forms/model_forms.py:545 +#: virtualization/forms/bulk_edit.py:85 virtualization/forms/filtersets.py:68 +#: virtualization/forms/filtersets.py:134 +#: virtualization/forms/model_forms.py:101 +msgid "Site group" +msgstr "Groupe de sites" + +#: circuits/forms/filtersets.py:51 +msgid "ASN (legacy)" +msgstr "ASN (ancien)" + +#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 +#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 +#: core/forms/filtersets.py:63 dcim/forms/bulk_edit.py:718 +#: dcim/forms/filtersets.py:164 dcim/forms/filtersets.py:196 +#: dcim/forms/filtersets.py:825 dcim/forms/filtersets.py:920 +#: dcim/forms/filtersets.py:1044 dcim/forms/filtersets.py:1152 +#: dcim/forms/filtersets.py:1174 dcim/forms/filtersets.py:1196 +#: dcim/forms/filtersets.py:1213 dcim/forms/filtersets.py:1230 +#: dcim/forms/filtersets.py:1341 dcim/forms/filtersets.py:1363 +#: dcim/forms/filtersets.py:1384 dcim/forms/filtersets.py:1399 +#: dcim/forms/filtersets.py:1410 extras/forms/filtersets.py:40 +#: extras/forms/filtersets.py:111 extras/forms/filtersets.py:142 +#: extras/forms/filtersets.py:182 extras/forms/filtersets.py:198 +#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:253 +#: extras/forms/filtersets.py:450 extras/forms/filtersets.py:491 +#: ipam/forms/filtersets.py:98 ipam/forms/filtersets.py:255 +#: ipam/forms/filtersets.py:294 ipam/forms/filtersets.py:368 +#: ipam/forms/filtersets.py:449 ipam/forms/filtersets.py:508 +#: ipam/forms/filtersets.py:526 netbox/tables/tables.py:250 +#: virtualization/forms/filtersets.py:44 +#: virtualization/forms/filtersets.py:100 +#: virtualization/forms/filtersets.py:190 +#: virtualization/forms/filtersets.py:235 vpn/forms/filtersets.py:210 +#: wireless/forms/filtersets.py:33 wireless/forms/filtersets.py:73 +msgid "Attributes" +msgstr "Attributs" + +#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:60 +#: circuits/tables/providers.py:66 templates/circuits/circuit.html:23 +#: templates/circuits/provideraccount.html:25 +msgid "Account" +msgstr "Compte" + +#: circuits/forms/model_forms.py:64 +#: templates/circuits/circuittermination_edit.html:23 +#: templates/circuits/inc/circuit_termination.html:89 +#: templates/circuits/providernetwork.html:18 +msgid "Provider Network" +msgstr "Réseau de fournisseurs" + +#: circuits/forms/model_forms.py:78 templates/circuits/circuittype.html:20 +msgid "Circuit Type" +msgstr "Type de circuit" + +#: circuits/models/circuits.py:25 dcim/models/cables.py:67 +#: dcim/models/device_component_templates.py:491 +#: dcim/models/device_component_templates.py:591 +#: dcim/models/device_components.py:976 dcim/models/device_components.py:1050 +#: dcim/models/device_components.py:1166 dcim/models/devices.py:467 +#: dcim/models/racks.py:43 extras/models/tags.py:28 +msgid "color" +msgstr "couleur" + +#: circuits/models/circuits.py:34 +msgid "circuit type" +msgstr "type de circuit" + +#: circuits/models/circuits.py:35 +msgid "circuit types" +msgstr "types de circuits" + +#: circuits/models/circuits.py:46 +msgid "circuit ID" +msgstr "identifiant du circuit" + +#: circuits/models/circuits.py:47 +msgid "Unique circuit ID" +msgstr "ID de circuit unique" + +#: circuits/models/circuits.py:67 core/models/data.py:54 +#: core/models/jobs.py:85 dcim/models/cables.py:49 dcim/models/devices.py:641 +#: dcim/models/devices.py:1165 dcim/models/devices.py:1374 +#: dcim/models/power.py:95 dcim/models/racks.py:97 dcim/models/sites.py:154 +#: dcim/models/sites.py:266 ipam/models/ip.py:252 ipam/models/ip.py:521 +#: ipam/models/ip.py:729 ipam/models/vlans.py:175 +#: virtualization/models/clusters.py:74 +#: virtualization/models/virtualmachines.py:82 vpn/models/tunnels.py:40 +#: wireless/models.py:94 wireless/models.py:158 +msgid "status" +msgstr "statut" + +#: circuits/models/circuits.py:82 +msgid "installed" +msgstr "installé" + +#: circuits/models/circuits.py:87 +msgid "terminates" +msgstr "met fin à" + +#: circuits/models/circuits.py:92 +msgid "commit rate (Kbps)" +msgstr "taux de validation (Kbits/s)" + +#: circuits/models/circuits.py:93 +msgid "Committed rate" +msgstr "Taux engagé" + +#: circuits/models/circuits.py:135 +msgid "circuit" +msgstr "circuit" + +#: circuits/models/circuits.py:136 +msgid "circuits" +msgstr "circuits" + +#: circuits/models/circuits.py:169 +msgid "termination" +msgstr "résiliation" + +#: circuits/models/circuits.py:186 +msgid "port speed (Kbps)" +msgstr "vitesse du port (Kbps)" + +#: circuits/models/circuits.py:189 +msgid "Physical circuit speed" +msgstr "Vitesse du circuit physique" + +#: circuits/models/circuits.py:194 +msgid "upstream speed (Kbps)" +msgstr "vitesse montante (Kbps)" + +#: circuits/models/circuits.py:195 +msgid "Upstream speed, if different from port speed" +msgstr "Vitesse ascendante, si elle est différente de la vitesse du port" + +#: circuits/models/circuits.py:200 +msgid "cross-connect ID" +msgstr "ID de connexion croisée" + +#: circuits/models/circuits.py:201 +msgid "ID of the local cross-connect" +msgstr "ID de l'interconnexion locale" + +#: circuits/models/circuits.py:206 +msgid "patch panel/port(s)" +msgstr "panneau de raccordement ou port (s)" + +#: circuits/models/circuits.py:207 +msgid "Patch panel ID and port number(s)" +msgstr "ID du panneau de raccordement et numéro (s) de port" + +#: circuits/models/circuits.py:210 +#: dcim/models/device_component_templates.py:61 +#: dcim/models/device_components.py:69 dcim/models/racks.py:537 +#: extras/models/configs.py:45 extras/models/configs.py:219 +#: extras/models/customfields.py:122 extras/models/models.py:58 +#: extras/models/models.py:188 extras/models/models.py:426 +#: extras/models/models.py:541 extras/models/staging.py:31 +#: extras/models/tags.py:32 netbox/models/__init__.py:109 +#: netbox/models/__init__.py:144 netbox/models/__init__.py:190 +#: users/models.py:273 users/models.py:348 +#: virtualization/models/virtualmachines.py:282 +msgid "description" +msgstr "description" + +#: circuits/models/circuits.py:223 +msgid "circuit termination" +msgstr "terminaison du circuit" + +#: circuits/models/circuits.py:224 +msgid "circuit terminations" +msgstr "terminaisons de circuits" + +#: circuits/models/providers.py:22 circuits/models/providers.py:66 +#: circuits/models/providers.py:104 core/models/data.py:41 +#: core/models/jobs.py:46 dcim/models/device_component_templates.py:43 +#: dcim/models/device_components.py:54 dcim/models/devices.py:581 +#: dcim/models/devices.py:1305 dcim/models/devices.py:1370 +#: dcim/models/power.py:39 dcim/models/power.py:91 dcim/models/racks.py:62 +#: dcim/models/sites.py:138 extras/models/configs.py:36 +#: extras/models/configs.py:215 extras/models/customfields.py:89 +#: extras/models/models.py:53 extras/models/models.py:183 +#: extras/models/models.py:326 extras/models/models.py:422 +#: extras/models/models.py:531 extras/models/models.py:626 +#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 +#: ipam/models/services.py:52 ipam/models/services.py:88 +#: ipam/models/vlans.py:26 ipam/models/vlans.py:164 ipam/models/vrfs.py:22 +#: ipam/models/vrfs.py:79 netbox/models/__init__.py:136 +#: netbox/models/__init__.py:180 tenancy/models/contacts.py:64 +#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 +#: users/models.py:344 virtualization/models/clusters.py:57 +#: virtualization/models/virtualmachines.py:70 +#: virtualization/models/virtualmachines.py:272 vpn/models/crypto.py:24 +#: vpn/models/crypto.py:71 vpn/models/crypto.py:119 vpn/models/crypto.py:171 +#: vpn/models/crypto.py:209 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 +#: wireless/models.py:50 +msgid "name" +msgstr "nom" + +#: circuits/models/providers.py:25 +msgid "Full name of the provider" +msgstr "Nom complet du fournisseur" + +#: circuits/models/providers.py:28 dcim/models/devices.py:86 +#: dcim/models/sites.py:149 extras/models/models.py:536 ipam/models/asns.py:23 +#: ipam/models/vlans.py:30 netbox/models/__init__.py:140 +#: netbox/models/__init__.py:185 tenancy/models/tenants.py:25 +#: tenancy/models/tenants.py:49 vpn/models/l2vpn.py:27 wireless/models.py:55 +msgid "slug" +msgstr "limace" + +#: circuits/models/providers.py:42 +msgid "provider" +msgstr "fournisseur" + +#: circuits/models/providers.py:43 +msgid "providers" +msgstr "fournisseurs" + +#: circuits/models/providers.py:63 +msgid "account ID" +msgstr "ID de compte" + +#: circuits/models/providers.py:86 +msgid "provider account" +msgstr "compte fournisseur" + +#: circuits/models/providers.py:87 +msgid "provider accounts" +msgstr "comptes fournisseurs" + +#: circuits/models/providers.py:115 +msgid "service ID" +msgstr "ID de service" + +#: circuits/models/providers.py:126 +msgid "provider network" +msgstr "réseau de fournisseurs" + +#: circuits/models/providers.py:127 +msgid "provider networks" +msgstr "réseaux de fournisseurs" + +#: circuits/tables/circuits.py:29 circuits/tables/providers.py:18 +#: circuits/tables/providers.py:69 circuits/tables/providers.py:99 +#: core/tables/data.py:16 core/tables/jobs.py:14 dcim/forms/filtersets.py:60 +#: dcim/forms/object_create.py:42 dcim/tables/devices.py:88 +#: dcim/tables/devices.py:125 dcim/tables/devices.py:167 +#: dcim/tables/devices.py:318 dcim/tables/devices.py:395 +#: dcim/tables/devices.py:439 dcim/tables/devices.py:491 +#: dcim/tables/devices.py:543 dcim/tables/devices.py:663 +#: dcim/tables/devices.py:744 dcim/tables/devices.py:794 +#: dcim/tables/devices.py:860 dcim/tables/devices.py:975 +#: dcim/tables/devices.py:995 dcim/tables/devices.py:1024 +#: dcim/tables/devices.py:1054 dcim/tables/devicetypes.py:32 +#: dcim/tables/power.py:22 dcim/tables/power.py:62 dcim/tables/racks.py:23 +#: dcim/tables/racks.py:53 dcim/tables/sites.py:24 dcim/tables/sites.py:51 +#: dcim/tables/sites.py:78 dcim/tables/sites.py:125 +#: extras/forms/filtersets.py:190 extras/tables/tables.py:40 +#: extras/tables/tables.py:83 extras/tables/tables.py:115 +#: extras/tables/tables.py:139 extras/tables/tables.py:204 +#: extras/tables/tables.py:251 extras/tables/tables.py:274 +#: extras/tables/tables.py:319 extras/tables/tables.py:371 +#: extras/tables/tables.py:394 ipam/forms/bulk_edit.py:390 +#: ipam/forms/filtersets.py:372 ipam/tables/asn.py:16 ipam/tables/ip.py:85 +#: ipam/tables/ip.py:159 ipam/tables/services.py:15 ipam/tables/services.py:40 +#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:110 ipam/tables/vrfs.py:26 +#: ipam/tables/vrfs.py:67 templates/circuits/circuittype.html:25 +#: templates/circuits/provideraccount.html:29 +#: templates/circuits/providernetwork.html:27 +#: templates/core/datasource.html:35 templates/core/job.html:31 +#: templates/dcim/consoleport.html:31 templates/dcim/consoleserverport.html:31 +#: templates/dcim/devicebay.html:27 templates/dcim/devicerole.html:29 +#: templates/dcim/frontport.html:31 +#: templates/dcim/inc/interface_vlans_table.html:5 +#: templates/dcim/inc/panels/inventory_items.html:10 +#: templates/dcim/interface.html:39 templates/dcim/interface.html:171 +#: templates/dcim/inventoryitem.html:29 +#: templates/dcim/inventoryitemrole.html:19 templates/dcim/location.html:32 +#: templates/dcim/manufacturer.html:39 templates/dcim/modulebay.html:27 +#: templates/dcim/platform.html:32 templates/dcim/poweroutlet.html:31 +#: templates/dcim/powerport.html:31 templates/dcim/rackrole.html:25 +#: templates/dcim/rearport.html:31 templates/dcim/region.html:30 +#: templates/dcim/sitegroup.html:30 +#: templates/dcim/virtualdevicecontext.html:21 +#: templates/extras/admin/plugins_list.html:22 +#: templates/extras/configcontext.html:14 +#: templates/extras/configtemplate.html:14 +#: templates/extras/customfield.html:16 templates/extras/customlink.html:14 +#: templates/extras/eventrule.html:16 templates/extras/exporttemplate.html:21 +#: templates/extras/report_list.html:46 templates/extras/savedfilter.html:14 +#: templates/extras/script_list.html:52 templates/extras/tag.html:17 +#: templates/extras/webhook.html:16 templates/ipam/asnrange.html:16 +#: templates/ipam/fhrpgroup.html:31 templates/ipam/rir.html:25 +#: templates/ipam/role.html:25 templates/ipam/routetarget.html:14 +#: templates/ipam/service.html:27 templates/ipam/servicetemplate.html:16 +#: templates/ipam/vlan.html:38 templates/ipam/vlangroup.html:31 +#: templates/tenancy/contact.html:26 templates/tenancy/contactgroup.html:24 +#: templates/tenancy/contactrole.html:19 templates/tenancy/tenantgroup.html:32 +#: templates/users/group.html:18 templates/users/objectpermission.html:18 +#: templates/virtualization/cluster.html:16 +#: templates/virtualization/clustergroup.html:25 +#: templates/virtualization/clustertype.html:25 +#: templates/virtualization/virtualdisk.html:26 +#: templates/virtualization/virtualmachine.html:18 +#: templates/virtualization/vminterface.html:28 +#: templates/vpn/ikepolicy.html:14 templates/vpn/ikeproposal.html:14 +#: templates/vpn/ipsecpolicy.html:14 templates/vpn/ipsecprofile.html:14 +#: templates/vpn/ipsecprofile.html:39 templates/vpn/ipsecprofile.html:74 +#: templates/vpn/ipsecproposal.html:14 templates/vpn/l2vpn.html:15 +#: templates/vpn/tunnel.html:22 templates/vpn/tunnelgroup.html:29 +#: templates/wireless/wirelesslangroup.html:30 tenancy/tables/contacts.py:19 +#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 +#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 +#: users/tables.py:62 users/tables.py:79 +#: virtualization/forms/bulk_create.py:20 +#: virtualization/forms/object_create.py:13 +#: virtualization/forms/object_create.py:23 +#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 +#: virtualization/tables/clusters.py:62 +#: virtualization/tables/virtualmachines.py:45 +#: virtualization/tables/virtualmachines.py:119 +#: virtualization/tables/virtualmachines.py:172 vpn/tables/crypto.py:18 +#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 +#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 +#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 +#: wireless/tables/wirelesslan.py:79 +msgid "Name" +msgstr "Nom" + +#: circuits/tables/circuits.py:38 circuits/tables/providers.py:45 +#: circuits/tables/providers.py:79 netbox/navigation/menu.py:254 +#: netbox/navigation/menu.py:258 netbox/navigation/menu.py:260 +#: templates/circuits/provider.html:61 +#: templates/circuits/provideraccount.html:46 +#: templates/circuits/providernetwork.html:54 +msgid "Circuits" +msgstr "Circuits" + +#: circuits/tables/circuits.py:52 templates/circuits/circuit.html:27 +msgid "Circuit ID" +msgstr "Identifiant du circuit" + +#: circuits/tables/circuits.py:65 wireless/forms/model_forms.py:157 +msgid "Side A" +msgstr "Côté A" + +#: circuits/tables/circuits.py:69 +msgid "Side Z" +msgstr "Côté Z" + +#: circuits/tables/circuits.py:72 templates/circuits/circuit.html:56 +msgid "Commit Rate" +msgstr "Taux d'engagement" + +#: circuits/tables/circuits.py:75 circuits/tables/providers.py:48 +#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 +#: dcim/tables/devices.py:1037 dcim/tables/devicetypes.py:92 +#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 +#: dcim/tables/power.py:96 dcim/tables/racks.py:76 dcim/tables/racks.py:156 +#: dcim/tables/sites.py:103 extras/forms/bulk_edit.py:320 +#: extras/tables/tables.py:485 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 +#: ipam/tables/ip.py:135 ipam/tables/ip.py:272 ipam/tables/ip.py:325 +#: ipam/tables/ip.py:392 ipam/tables/services.py:24 ipam/tables/services.py:54 +#: ipam/tables/vlans.py:141 ipam/tables/vrfs.py:46 ipam/tables/vrfs.py:71 +#: templates/dcim/cable_edit.html:85 templates/generic/bulk_edit.html:102 +#: templates/inc/panels/comments.html:6 tenancy/tables/contacts.py:68 +#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 +#: virtualization/tables/clusters.py:91 +#: virtualization/tables/virtualmachines.py:68 vpn/tables/crypto.py:37 +#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 +#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:57 +#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +msgid "Comments" +msgstr "Commentaires" + +#: circuits/tables/providers.py:23 +msgid "Accounts" +msgstr "Comptes" + +#: circuits/tables/providers.py:29 +msgid "Account Count" +msgstr "Nombre de comptes" + +#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +msgid "ASN Count" +msgstr "Nombre d'ASN" + +#: core/choices.py:18 +msgid "New" +msgstr "Nouveau" + +#: core/choices.py:19 +msgid "Queued" +msgstr "En file d'attente" + +#: core/choices.py:20 +msgid "Syncing" +msgstr "Synchronisation" + +#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 +#: extras/choices.py:210 templates/core/job.html:75 +msgid "Completed" +msgstr "Terminé" + +#: core/choices.py:22 core/choices.py:59 dcim/choices.py:176 +#: dcim/choices.py:222 dcim/choices.py:1496 extras/choices.py:212 +#: virtualization/choices.py:47 +msgid "Failed" +msgstr "Échoué" + +#: core/choices.py:35 netbox/navigation/menu.py:330 +#: templates/extras/script/base.html:14 templates/extras/script_list.html:6 +#: templates/extras/script_list.html:20 templates/extras/script_result.html:18 +msgid "Scripts" +msgstr "Scripts" + +#: core/choices.py:36 netbox/navigation/menu.py:324 +#: templates/extras/report/base.html:13 templates/extras/report_list.html:7 +#: templates/extras/report_list.html:12 +msgid "Reports" +msgstr "Rapports" + +#: core/choices.py:54 extras/choices.py:207 +msgid "Pending" +msgstr "En attente" + +#: core/choices.py:55 core/tables/jobs.py:32 extras/choices.py:208 +#: templates/core/job.html:62 +msgid "Scheduled" +msgstr "Programmé" + +#: core/choices.py:56 extras/choices.py:209 +msgid "Running" +msgstr "Courir" + +#: core/choices.py:58 extras/choices.py:211 +msgid "Errored" +msgstr "Errulé" + +#: core/data_backends.py:29 templates/dcim/interface.html:224 +msgid "Local" +msgstr "Local" + +#: core/data_backends.py:47 extras/tables/tables.py:431 +#: templates/account/profile.html:16 templates/users/user.html:18 +#: users/tables.py:31 +msgid "Username" +msgstr "Nom d'utilisateur" + +#: core/data_backends.py:49 core/data_backends.py:55 +msgid "Only used for cloning with HTTP(S)" +msgstr "Utilisé uniquement pour le clonage avec HTTP (S)" + +#: core/data_backends.py:53 templates/account/base.html:17 +#: templates/account/password.html:11 users/forms/model_forms.py:171 +msgid "Password" +msgstr "Mot de passe" + +#: core/data_backends.py:59 +msgid "Branch" +msgstr "Succursale" + +#: core/data_backends.py:118 +msgid "AWS access key ID" +msgstr "ID de clé d'accès AWS" + +#: core/data_backends.py:122 +msgid "AWS secret access key" +msgstr "Clé d'accès secrète AWS" + +#: core/filtersets.py:49 extras/filtersets.py:203 extras/filtersets.py:538 +#: extras/filtersets.py:566 +msgid "Data source (ID)" +msgstr "Source de données (ID)" + +#: core/filtersets.py:55 +msgid "Data source (name)" +msgstr "Source de données (nom)" + +#: core/forms/bulk_edit.py:24 ipam/forms/bulk_edit.py:47 +msgid "Enforce unique space" +msgstr "Renforcez un espace unique" + +#: core/forms/bulk_edit.py:33 extras/forms/model_forms.py:202 +#: templates/extras/savedfilter.html:57 vpn/forms/filtersets.py:95 +#: vpn/forms/filtersets.py:124 vpn/forms/filtersets.py:148 +#: vpn/forms/filtersets.py:167 vpn/forms/model_forms.py:294 +#: vpn/forms/model_forms.py:315 vpn/forms/model_forms.py:329 +#: vpn/forms/model_forms.py:350 vpn/forms/model_forms.py:373 +msgid "Parameters" +msgstr "Paramètres" + +#: core/forms/bulk_edit.py:37 templates/core/datasource.html:69 +msgid "Ignore rules" +msgstr "Ignorer les règles" + +#: core/forms/filtersets.py:26 core/forms/model_forms.py:95 +#: extras/forms/model_forms.py:165 extras/forms/model_forms.py:455 +#: extras/forms/model_forms.py:508 extras/tables/tables.py:149 +#: extras/tables/tables.py:363 extras/tables/tables.py:398 +#: templates/core/datasource.html:31 +#: templates/dcim/device/render_config.html:19 +#: templates/extras/configcontext.html:30 +#: templates/extras/configtemplate.html:22 +#: templates/extras/exporttemplate.html:41 +#: templates/virtualization/virtualmachine/render_config.html:19 +msgid "Data Source" +msgstr "Source de données" + +#: core/forms/filtersets.py:39 core/tables/data.py:26 +#: dcim/forms/bulk_edit.py:1012 dcim/forms/bulk_edit.py:1285 +#: dcim/forms/filtersets.py:1270 dcim/tables/devices.py:568 +#: dcim/tables/devicetypes.py:221 extras/forms/bulk_edit.py:97 +#: extras/forms/bulk_edit.py:161 extras/forms/bulk_edit.py:220 +#: extras/forms/filtersets.py:119 extras/forms/filtersets.py:206 +#: extras/forms/filtersets.py:267 extras/tables/tables.py:122 +#: extras/tables/tables.py:211 extras/tables/tables.py:284 +#: templates/core/datasource.html:43 templates/dcim/interface.html:62 +#: templates/extras/customlink.html:18 templates/extras/eventrule.html:20 +#: templates/extras/savedfilter.html:26 +#: templates/users/objectpermission.html:26 +#: templates/virtualization/vminterface.html:32 users/forms/bulk_edit.py:69 +#: users/forms/filtersets.py:71 users/tables.py:86 +#: virtualization/forms/bulk_edit.py:216 +#: virtualization/forms/filtersets.py:207 +msgid "Enabled" +msgstr "Activé" + +#: core/forms/filtersets.py:51 core/forms/mixins.py:21 +msgid "File" +msgstr "Dossier" + +#: core/forms/filtersets.py:56 core/forms/mixins.py:16 +#: extras/forms/filtersets.py:147 extras/forms/filtersets.py:336 +#: extras/forms/filtersets.py:422 +msgid "Data source" +msgstr "Source de données" + +#: core/forms/filtersets.py:64 extras/forms/filtersets.py:449 +msgid "Creation" +msgstr "Création" + +#: core/forms/filtersets.py:70 extras/forms/filtersets.py:473 +#: extras/forms/filtersets.py:519 extras/tables/tables.py:474 +#: templates/core/job.html:25 templates/extras/objectchange.html:56 +#: tenancy/tables/contacts.py:90 vpn/tables/l2vpn.py:59 +msgid "Object Type" +msgstr "Type d'objet" + +#: core/forms/filtersets.py:80 +msgid "Created after" +msgstr "Créé après" + +#: core/forms/filtersets.py:85 +msgid "Created before" +msgstr "Créé avant" + +#: core/forms/filtersets.py:90 +msgid "Scheduled after" +msgstr "Planifié après" + +#: core/forms/filtersets.py:95 +msgid "Scheduled before" +msgstr "Planifié avant" + +#: core/forms/filtersets.py:100 +msgid "Started after" +msgstr "Commencé après" + +#: core/forms/filtersets.py:105 +msgid "Started before" +msgstr "Commencé avant" + +#: core/forms/filtersets.py:110 +msgid "Completed after" +msgstr "Terminé après" + +#: core/forms/filtersets.py:115 +msgid "Completed before" +msgstr "Terminé avant" + +#: core/forms/filtersets.py:122 dcim/forms/bulk_edit.py:359 +#: dcim/forms/filtersets.py:352 dcim/forms/filtersets.py:396 +#: dcim/forms/model_forms.py:251 extras/forms/filtersets.py:465 +#: extras/forms/filtersets.py:511 templates/dcim/rackreservation.html:65 +#: templates/extras/objectchange.html:40 templates/extras/savedfilter.html:22 +#: templates/users/token.html:22 templates/users/user.html:6 +#: templates/users/user.html:14 users/filtersets.py:74 users/filtersets.py:134 +#: users/forms/filtersets.py:85 users/forms/filtersets.py:126 +#: users/forms/model_forms.py:156 users/forms/model_forms.py:194 +#: users/tables.py:19 +msgid "User" +msgstr "Utilisateur" + +#: core/forms/model_forms.py:52 core/tables/data.py:46 +#: templates/core/datafile.html:36 templates/extras/report/base.html:33 +#: templates/extras/script/base.html:32 templates/extras/script_result.html:45 +msgid "Source" +msgstr "Source" + +#: core/forms/model_forms.py:56 +msgid "Backend Parameters" +msgstr "Paramètres du backend" + +#: core/forms/model_forms.py:94 +msgid "File Upload" +msgstr "Téléchargement de fichiers" + +#: core/forms/model_forms.py:147 templates/core/configrevision.html:43 +#: templates/dcim/rack_elevation_list.html:6 +msgid "Rack Elevations" +msgstr "Élévations des rayonnages" + +#: core/forms/model_forms.py:148 dcim/choices.py:1407 +#: dcim/forms/bulk_edit.py:859 dcim/forms/bulk_edit.py:1242 +#: dcim/forms/bulk_edit.py:1260 dcim/tables/racks.py:89 +#: netbox/navigation/menu.py:276 netbox/navigation/menu.py:280 +msgid "Power" +msgstr "Pouvoir" + +#: core/forms/model_forms.py:149 netbox/navigation/menu.py:142 +#: templates/core/configrevision.html:79 +msgid "IPAM" +msgstr "IPAM" + +#: core/forms/model_forms.py:150 netbox/navigation/menu.py:218 +#: templates/core/configrevision.html:95 vpn/forms/bulk_edit.py:76 +#: vpn/forms/filtersets.py:42 vpn/forms/model_forms.py:60 +#: vpn/forms/model_forms.py:145 +msgid "Security" +msgstr "Sécurité" + +#: core/forms/model_forms.py:151 templates/core/configrevision.html:107 +msgid "Banners" +msgstr "Bannières" + +#: core/forms/model_forms.py:152 templates/core/configrevision.html:131 +msgid "Pagination" +msgstr "Pagination" + +#: core/forms/model_forms.py:153 extras/forms/model_forms.py:63 +#: templates/core/configrevision.html:147 +msgid "Validation" +msgstr "Validation" + +#: core/forms/model_forms.py:154 templates/account/preferences.html:6 +#: templates/core/configrevision.html:175 +msgid "User Preferences" +msgstr "Préférences de l'utilisateur" + +#: core/forms/model_forms.py:155 dcim/forms/filtersets.py:658 +#: templates/core/configrevision.html:193 users/forms/model_forms.py:63 +msgid "Miscellaneous" +msgstr "Divers" + +#: core/forms/model_forms.py:158 +msgid "Config Revision" +msgstr "Révision de la configuration" + +#: core/forms/model_forms.py:197 +msgid "This parameter has been defined statically and cannot be modified." +msgstr "" +"Ce paramètre a été défini de manière statique et ne peut pas être modifié." + +#: core/forms/model_forms.py:205 +#, python-brace-format +msgid "Current value: {value}" +msgstr "Valeur actuelle : {value}" + +#: core/forms/model_forms.py:207 +msgid " (default)" +msgstr " (par défaut)" + +#: core/models/config.py:18 core/models/data.py:259 core/models/files.py:27 +#: core/models/jobs.py:50 extras/models/models.py:760 +#: netbox/models/features.py:52 users/models.py:248 +msgid "created" +msgstr "créé" + +#: core/models/config.py:22 +msgid "comment" +msgstr "commentaire" + +#: core/models/config.py:29 +msgid "configuration data" +msgstr "données de configuration" + +#: core/models/config.py:36 +msgid "config revision" +msgstr "révision de la configuration" + +#: core/models/config.py:37 +msgid "config revisions" +msgstr "révisions de configuration" + +#: core/models/config.py:41 +msgid "Default configuration" +msgstr "Configuration par défaut" + +#: core/models/config.py:43 +msgid "Current configuration" +msgstr "Configuration actuelle" + +#: core/models/config.py:44 +#, python-brace-format +msgid "Config revision #{id}" +msgstr "Révision de configuration #{id}" + +#: core/models/data.py:46 dcim/models/cables.py:43 +#: dcim/models/device_component_templates.py:177 +#: dcim/models/device_component_templates.py:211 +#: dcim/models/device_component_templates.py:246 +#: dcim/models/device_component_templates.py:308 +#: dcim/models/device_component_templates.py:387 +#: dcim/models/device_component_templates.py:486 +#: dcim/models/device_component_templates.py:586 +#: dcim/models/device_components.py:284 dcim/models/device_components.py:313 +#: dcim/models/device_components.py:346 dcim/models/device_components.py:464 +#: dcim/models/device_components.py:606 dcim/models/device_components.py:971 +#: dcim/models/device_components.py:1045 dcim/models/power.py:101 +#: dcim/models/racks.py:127 extras/models/customfields.py:75 +#: extras/models/search.py:43 virtualization/models/clusters.py:61 +#: vpn/models/l2vpn.py:32 +msgid "type" +msgstr "type" + +#: core/models/data.py:51 extras/choices.py:34 extras/models/models.py:194 +#: templates/core/datasource.html:59 +msgid "URL" +msgstr "URL" + +#: core/models/data.py:61 dcim/models/device_component_templates.py:392 +#: dcim/models/device_components.py:513 extras/models/models.py:88 +#: extras/models/models.py:331 extras/models/models.py:556 users/models.py:353 +msgid "enabled" +msgstr "activé" + +#: core/models/data.py:65 +msgid "ignore rules" +msgstr "ignorer les règles" + +#: core/models/data.py:67 +msgid "Patterns (one per line) matching files to ignore when syncing" +msgstr "" +"Modèles (un par ligne) correspondant aux fichiers à ignorer lors de la " +"synchronisation" + +#: core/models/data.py:70 extras/models/models.py:564 +msgid "parameters" +msgstr "paramètres" + +#: core/models/data.py:75 +msgid "last synced" +msgstr "dernière synchronisation" + +#: core/models/data.py:83 +msgid "data source" +msgstr "source de données" + +#: core/models/data.py:84 +msgid "data sources" +msgstr "sources de données" + +#: core/models/data.py:124 +#, python-brace-format +msgid "Unknown backend type: {type}" +msgstr "Type de backend inconnu : {type}" + +#: core/models/data.py:263 core/models/files.py:31 +#: netbox/models/features.py:58 +msgid "last updated" +msgstr "dernière mise à jour" + +#: core/models/data.py:273 dcim/models/cables.py:430 +msgid "path" +msgstr "chemin" + +#: core/models/data.py:276 +msgid "File path relative to the data source's root" +msgstr "Chemin du fichier par rapport à la racine de la source de données" + +#: core/models/data.py:280 ipam/models/ip.py:502 +msgid "size" +msgstr "taille" + +#: core/models/data.py:283 +msgid "hash" +msgstr "hachage" + +#: core/models/data.py:287 +msgid "Length must be 64 hexadecimal characters." +msgstr "La longueur doit être de 64 caractères hexadécimaux." + +#: core/models/data.py:289 +msgid "SHA256 hash of the file data" +msgstr "Hachage SHA256 des données du fichier" + +#: core/models/data.py:306 +msgid "data file" +msgstr "fichier de données" + +#: core/models/data.py:307 +msgid "data files" +msgstr "fichiers de données" + +#: core/models/data.py:393 +msgid "auto sync record" +msgstr "enregistrement de synchronisation automatique" + +#: core/models/data.py:394 +msgid "auto sync records" +msgstr "enregistrements de synchronisation automatique" + +#: core/models/files.py:37 +msgid "file root" +msgstr "racine du fichier" + +#: core/models/files.py:42 +msgid "file path" +msgstr "chemin du fichier" + +#: core/models/files.py:44 +msgid "File path relative to the designated root path" +msgstr "Chemin du fichier par rapport au chemin racine désigné" + +#: core/models/files.py:61 +msgid "managed file" +msgstr "fichier géré" + +#: core/models/files.py:62 +msgid "managed files" +msgstr "fichiers gérés" + +#: core/models/jobs.py:54 +msgid "scheduled" +msgstr "prévu" + +#: core/models/jobs.py:59 +msgid "interval" +msgstr "intervalle" + +#: core/models/jobs.py:65 +msgid "Recurrence interval (in minutes)" +msgstr "Intervalle de récurrence (en minutes)" + +#: core/models/jobs.py:68 +msgid "started" +msgstr "commencé" + +#: core/models/jobs.py:73 +msgid "completed" +msgstr "terminé" + +#: core/models/jobs.py:91 extras/models/models.py:123 +#: extras/models/staging.py:87 +msgid "data" +msgstr "données" + +#: core/models/jobs.py:96 +msgid "error" +msgstr "erreur" + +#: core/models/jobs.py:101 +msgid "job ID" +msgstr "ID de tâche" + +#: core/models/jobs.py:112 +msgid "job" +msgstr "emploi" + +#: core/models/jobs.py:113 +msgid "jobs" +msgstr "emplois" + +#: core/models/jobs.py:135 +#, python-brace-format +msgid "Jobs cannot be assigned to this object type ({type})." +msgstr "Les tâches ne peuvent pas être attribuées à ce type d'objet ({type})." + +#: core/tables/config.py:21 users/forms/filtersets.py:45 users/tables.py:39 +msgid "Is Active" +msgstr "Est actif" + +#: core/tables/data.py:50 templates/core/datafile.html:40 +msgid "Path" +msgstr "Sentier" + +#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +msgid "Last updated" +msgstr "Dernière mise à jour" + +#: core/tables/jobs.py:10 dcim/tables/devicetypes.py:161 +#: extras/tables/tables.py:174 extras/tables/tables.py:340 +#: netbox/tables/tables.py:184 templates/dcim/virtualchassis_edit.html:53 +#: wireless/tables/wirelesslink.py:16 +msgid "ID" +msgstr "IDENTIFIANT" + +#: core/tables/jobs.py:21 extras/choices.py:38 extras/tables/tables.py:236 +#: extras/tables/tables.py:350 extras/tables/tables.py:448 +#: extras/tables/tables.py:479 netbox/tables/tables.py:238 +#: templates/extras/eventrule.html:99 +#: templates/extras/htmx/report_result.html:45 +#: templates/extras/journalentry.html:21 templates/extras/objectchange.html:62 +#: tenancy/tables/contacts.py:93 vpn/tables/l2vpn.py:64 +msgid "Object" +msgstr "Objet" + +#: core/tables/jobs.py:35 +msgid "Interval" +msgstr "Intervalle" + +#: core/tables/jobs.py:38 templates/core/job.html:71 +#: templates/extras/htmx/report_result.html:7 +#: templates/extras/htmx/script_result.html:8 +msgid "Started" +msgstr "Commencé" + +#: dcim/api/serializers.py:205 templates/dcim/rack.html:33 +msgid "Facility ID" +msgstr "ID de l'établissement" + +#: dcim/api/serializers.py:321 dcim/api/serializers.py:680 +msgid "Position (U)" +msgstr "Position (U)" + +#: dcim/choices.py:21 virtualization/choices.py:21 +msgid "Staging" +msgstr "Mise en scène" + +#: dcim/choices.py:23 dcim/choices.py:178 dcim/choices.py:223 +#: dcim/choices.py:1420 virtualization/choices.py:23 +#: virtualization/choices.py:48 +msgid "Decommissioning" +msgstr "Démantèlement" + +#: dcim/choices.py:24 +msgid "Retired" +msgstr "Retraité" + +#: dcim/choices.py:65 +msgid "2-post frame" +msgstr "Châssis à 2 montants" + +#: dcim/choices.py:66 +msgid "4-post frame" +msgstr "Châssis à 4 montants" + +#: dcim/choices.py:67 +msgid "4-post cabinet" +msgstr "Armoire à 4 montants" + +#: dcim/choices.py:68 +msgid "Wall-mounted frame" +msgstr "Châssis mural" + +#: dcim/choices.py:69 +msgid "Wall-mounted frame (vertical)" +msgstr "Châssis mural (vertical)" + +#: dcim/choices.py:70 +msgid "Wall-mounted cabinet" +msgstr "Armoire murale" + +#: dcim/choices.py:71 +msgid "Wall-mounted cabinet (vertical)" +msgstr "Armoire murale (verticale)" + +#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#, python-brace-format +msgid "{n} inches" +msgstr "{n} pouces" + +#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 +#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +msgid "Reserved" +msgstr "Réservé" + +#: dcim/choices.py:101 templates/dcim/device.html:262 +msgid "Available" +msgstr "Disponible" + +#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 +#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +msgid "Deprecated" +msgstr "Obsolète" + +#: dcim/choices.py:114 templates/dcim/rack.html:128 +msgid "Millimeters" +msgstr "Millimètres" + +#: dcim/choices.py:115 dcim/choices.py:1442 +msgid "Inches" +msgstr "Pouces" + +#: dcim/choices.py:140 dcim/forms/bulk_edit.py:66 dcim/forms/bulk_edit.py:85 +#: dcim/forms/bulk_edit.py:171 dcim/forms/bulk_edit.py:1290 +#: dcim/forms/bulk_import.py:59 dcim/forms/bulk_import.py:73 +#: dcim/forms/bulk_import.py:136 dcim/forms/bulk_import.py:503 +#: dcim/forms/bulk_import.py:770 dcim/forms/bulk_import.py:1021 +#: dcim/forms/filtersets.py:226 dcim/forms/model_forms.py:73 +#: dcim/forms/model_forms.py:94 dcim/forms/model_forms.py:172 +#: dcim/forms/model_forms.py:955 dcim/forms/model_forms.py:1296 +#: dcim/forms/object_import.py:181 dcim/tables/devices.py:671 +#: dcim/tables/devices.py:955 extras/tables/tables.py:181 +#: ipam/tables/fhrp.py:59 ipam/tables/ip.py:374 ipam/tables/services.py:44 +#: templates/dcim/interface.html:105 templates/dcim/interface.html:321 +#: templates/dcim/location.html:44 templates/dcim/region.html:38 +#: templates/dcim/sitegroup.html:38 templates/ipam/service.html:31 +#: templates/tenancy/contactgroup.html:32 +#: templates/tenancy/tenantgroup.html:40 +#: templates/virtualization/vminterface.html:42 +#: templates/wireless/wirelesslangroup.html:38 tenancy/forms/bulk_edit.py:26 +#: tenancy/forms/bulk_edit.py:60 tenancy/forms/bulk_import.py:24 +#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:24 +#: tenancy/forms/model_forms.py:69 virtualization/forms/bulk_edit.py:206 +#: virtualization/forms/bulk_import.py:151 +#: virtualization/tables/virtualmachines.py:142 wireless/forms/bulk_edit.py:23 +#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:20 +msgid "Parent" +msgstr "Parent" + +#: dcim/choices.py:141 +msgid "Child" +msgstr "Enfant" + +#: dcim/choices.py:155 templates/dcim/device.html:345 +#: templates/dcim/rack.html:181 templates/dcim/rack_elevation_list.html:22 +#: templates/dcim/rackreservation.html:84 +msgid "Front" +msgstr "Avant" + +#: dcim/choices.py:156 templates/dcim/device.html:351 +#: templates/dcim/rack.html:187 templates/dcim/rack_elevation_list.html:23 +#: templates/dcim/rackreservation.html:90 +msgid "Rear" +msgstr "Arrière" + +#: dcim/choices.py:175 dcim/choices.py:221 virtualization/choices.py:46 +msgid "Staged" +msgstr "Mis en scène" + +#: dcim/choices.py:177 +msgid "Inventory" +msgstr "Inventaire" + +#: dcim/choices.py:193 +msgid "Front to rear" +msgstr "De l'avant vers l'arrière" + +#: dcim/choices.py:194 +msgid "Rear to front" +msgstr "De l'arrière vers l'avant" + +#: dcim/choices.py:195 +msgid "Left to right" +msgstr "De gauche à droite" + +#: dcim/choices.py:196 +msgid "Right to left" +msgstr "De droite à gauche" + +#: dcim/choices.py:197 +msgid "Side to rear" +msgstr "D'un côté à l'arrière" + +#: dcim/choices.py:198 dcim/choices.py:1215 +msgid "Passive" +msgstr "Passif" + +#: dcim/choices.py:199 +msgid "Mixed" +msgstr "Mixte" + +#: dcim/choices.py:443 dcim/choices.py:680 +msgid "NEMA (Non-locking)" +msgstr "NEMA (non verrouillable)" + +#: dcim/choices.py:465 dcim/choices.py:702 +msgid "NEMA (Locking)" +msgstr "NEMA (verrouillage)" + +#: dcim/choices.py:488 dcim/choices.py:725 +msgid "California Style" +msgstr "Style californien" + +#: dcim/choices.py:496 +msgid "International/ITA" +msgstr "International/ITA" + +#: dcim/choices.py:526 dcim/choices.py:755 +msgid "Proprietary" +msgstr "Propriétaire" + +#: dcim/choices.py:534 dcim/choices.py:764 dcim/choices.py:1131 +#: dcim/choices.py:1133 dcim/choices.py:1338 dcim/choices.py:1340 +#: netbox/navigation/menu.py:188 +msgid "Other" +msgstr "Autres" + +#: dcim/choices.py:733 +msgid "ITA/International" +msgstr "ITA/International" + +#: dcim/choices.py:794 +msgid "Physical" +msgstr "Physique" + +#: dcim/choices.py:795 dcim/choices.py:949 +msgid "Virtual" +msgstr "Virtuel" + +#: dcim/choices.py:796 dcim/choices.py:1019 dcim/forms/bulk_edit.py:1398 +#: dcim/forms/filtersets.py:1233 dcim/forms/model_forms.py:881 +#: dcim/forms/model_forms.py:1190 netbox/navigation/menu.py:128 +#: netbox/navigation/menu.py:132 templates/dcim/interface.html:217 +msgid "Wireless" +msgstr "Sans fil" + +#: dcim/choices.py:947 +msgid "Virtual interfaces" +msgstr "Interfaces virtuelles" + +#: dcim/choices.py:950 dcim/forms/bulk_edit.py:1295 +#: dcim/forms/bulk_import.py:777 dcim/forms/model_forms.py:869 +#: dcim/tables/devices.py:675 templates/dcim/interface.html:109 +#: templates/virtualization/vminterface.html:46 +#: virtualization/forms/bulk_edit.py:211 +#: virtualization/forms/bulk_import.py:158 +#: virtualization/tables/virtualmachines.py:146 +msgid "Bridge" +msgstr "Passerelle" + +#: dcim/choices.py:951 +msgid "Link Aggregation Group (LAG)" +msgstr "Groupe d'agrégation de liens (LAG)" + +#: dcim/choices.py:955 +msgid "Ethernet (fixed)" +msgstr "Ethernet (fixe)" + +#: dcim/choices.py:969 +msgid "Ethernet (modular)" +msgstr "Ethernet (modulaire)" + +#: dcim/choices.py:1005 +msgid "Ethernet (backplane)" +msgstr "Ethernet (panneau arrière)" + +#: dcim/choices.py:1033 +msgid "Cellular" +msgstr "Cellulaire" + +#: dcim/choices.py:1080 dcim/forms/filtersets.py:302 +#: dcim/forms/filtersets.py:736 dcim/forms/filtersets.py:876 +#: dcim/forms/filtersets.py:1426 templates/dcim/inventoryitem.html:53 +#: templates/dcim/virtualchassis_edit.html:55 +msgid "Serial" +msgstr "Série" + +#: dcim/choices.py:1095 +msgid "Coaxial" +msgstr "Coaxiale" + +#: dcim/choices.py:1112 +msgid "Stacking" +msgstr "Empilage" + +#: dcim/choices.py:1162 +msgid "Half" +msgstr "La moitié" + +#: dcim/choices.py:1163 +msgid "Full" +msgstr "Complet" + +#: dcim/choices.py:1164 wireless/choices.py:480 +msgid "Auto" +msgstr "Automatique" + +#: dcim/choices.py:1175 +msgid "Access" +msgstr "Accès" + +#: dcim/choices.py:1176 ipam/tables/vlans.py:168 ipam/tables/vlans.py:213 +#: templates/dcim/inc/interface_vlans_table.html:7 +msgid "Tagged" +msgstr "Tagué" + +#: dcim/choices.py:1177 +msgid "Tagged (All)" +msgstr "Tagué (Tous)" + +#: dcim/choices.py:1206 +msgid "IEEE Standard" +msgstr "Norme IEEE" + +#: dcim/choices.py:1217 +msgid "Passive 24V (2-pair)" +msgstr "24 V passif (2 paires)" + +#: dcim/choices.py:1218 +msgid "Passive 24V (4-pair)" +msgstr "24 V passif (4 paires)" + +#: dcim/choices.py:1219 +msgid "Passive 48V (2-pair)" +msgstr "48 V passif (2 paires)" + +#: dcim/choices.py:1220 +msgid "Passive 48V (4-pair)" +msgstr "48 V passif (4 paires)" + +#: dcim/choices.py:1282 dcim/choices.py:1378 +msgid "Copper" +msgstr "Cuivre" + +#: dcim/choices.py:1305 +msgid "Fiber Optic" +msgstr "fibre optique" + +#: dcim/choices.py:1394 +msgid "Fiber" +msgstr "Fibre" + +#: dcim/choices.py:1418 dcim/forms/filtersets.py:1140 +msgid "Connected" +msgstr "Connecté" + +#: dcim/choices.py:1437 +msgid "Kilometers" +msgstr "Kilomètres" + +#: dcim/choices.py:1438 templates/dcim/cable_trace.html:62 +msgid "Meters" +msgstr "Compteurs" + +#: dcim/choices.py:1439 +msgid "Centimeters" +msgstr "Centimètres" + +#: dcim/choices.py:1440 +msgid "Miles" +msgstr "Miles" + +#: dcim/choices.py:1441 templates/dcim/cable_trace.html:63 +msgid "Feet" +msgstr "Pieds" + +#: dcim/choices.py:1457 templates/dcim/device.html:332 +#: templates/dcim/rack.html:157 +msgid "Kilograms" +msgstr "Kilogrammes" + +#: dcim/choices.py:1458 +msgid "Grams" +msgstr "Grammes" + +#: dcim/choices.py:1459 templates/dcim/rack.html:158 +msgid "Pounds" +msgstr "Livres" + +#: dcim/choices.py:1460 +msgid "Ounces" +msgstr "Onces" + +#: dcim/choices.py:1506 tenancy/choices.py:17 +msgid "Primary" +msgstr "Primaire" + +#: dcim/choices.py:1507 +msgid "Redundant" +msgstr "Redondant" + +#: dcim/choices.py:1528 +msgid "Single phase" +msgstr "Monophasé" + +#: dcim/choices.py:1529 +msgid "Three-phase" +msgstr "Triphasé" + +#: dcim/filtersets.py:80 +msgid "Parent region (ID)" +msgstr "Région parente (ID)" + +#: dcim/filtersets.py:86 +msgid "Parent region (slug)" +msgstr "Région parente (limace)" + +#: dcim/filtersets.py:97 +msgid "Parent site group (ID)" +msgstr "Groupe de sites parent (ID)" + +#: dcim/filtersets.py:103 +msgid "Parent site group (slug)" +msgstr "Groupe de sites parents (slug)" + +#: dcim/filtersets.py:132 ipam/filtersets.py:797 ipam/filtersets.py:930 +msgid "Group (ID)" +msgstr "Groupe (ID)" + +#: dcim/filtersets.py:138 +msgid "Group (slug)" +msgstr "Groupe (limace)" + +#: dcim/filtersets.py:144 dcim/filtersets.py:149 +msgid "AS (ID)" +msgstr "COMME (ID)" + +#: dcim/filtersets.py:217 dcim/filtersets.py:292 dcim/filtersets.py:390 +#: dcim/filtersets.py:917 dcim/filtersets.py:1213 dcim/filtersets.py:1881 +msgid "Location (ID)" +msgstr "Lieu (ID)" + +#: dcim/filtersets.py:224 dcim/filtersets.py:299 dcim/filtersets.py:397 +#: dcim/filtersets.py:1219 extras/filtersets.py:447 +msgid "Location (slug)" +msgstr "Emplacement (limace)" + +#: dcim/filtersets.py:313 dcim/filtersets.py:764 dcim/filtersets.py:854 +#: dcim/filtersets.py:1619 ipam/filtersets.py:347 ipam/filtersets.py:459 +#: ipam/filtersets.py:940 virtualization/filtersets.py:209 +msgid "Role (ID)" +msgstr "Rôle (ID)" + +#: dcim/filtersets.py:319 dcim/filtersets.py:770 dcim/filtersets.py:860 +#: dcim/filtersets.py:1625 extras/filtersets.py:463 ipam/filtersets.py:353 +#: ipam/filtersets.py:465 ipam/filtersets.py:946 +#: virtualization/filtersets.py:215 +msgid "Role (slug)" +msgstr "Rôle (limace)" + +#: dcim/filtersets.py:347 dcim/filtersets.py:922 dcim/filtersets.py:1224 +#: dcim/filtersets.py:1942 +msgid "Rack (ID)" +msgstr "Étagère (ID)" + +#: dcim/filtersets.py:401 extras/filtersets.py:234 extras/filtersets.py:278 +#: extras/filtersets.py:318 extras/filtersets.py:613 +msgid "User (ID)" +msgstr "Utilisateur (ID)" + +#: dcim/filtersets.py:407 extras/filtersets.py:240 extras/filtersets.py:284 +#: extras/filtersets.py:324 users/filtersets.py:80 users/filtersets.py:140 +msgid "User (name)" +msgstr "Utilisateur (nom)" + +#: dcim/filtersets.py:435 dcim/filtersets.py:561 dcim/filtersets.py:754 +#: dcim/filtersets.py:805 dcim/filtersets.py:833 dcim/filtersets.py:1116 +#: dcim/filtersets.py:1609 +msgid "Manufacturer (ID)" +msgstr "Fabricant (ID)" + +#: dcim/filtersets.py:441 dcim/filtersets.py:567 dcim/filtersets.py:760 +#: dcim/filtersets.py:811 dcim/filtersets.py:839 dcim/filtersets.py:1122 +#: dcim/filtersets.py:1615 +msgid "Manufacturer (slug)" +msgstr "Fabricant (limace)" + +#: dcim/filtersets.py:445 +msgid "Default platform (ID)" +msgstr "Plateforme par défaut (ID)" + +#: dcim/filtersets.py:451 +msgid "Default platform (slug)" +msgstr "Plateforme par défaut (slug)" + +#: dcim/filtersets.py:454 dcim/forms/filtersets.py:452 +msgid "Has a front image" +msgstr "Possède une image frontale" + +#: dcim/filtersets.py:458 dcim/forms/filtersets.py:459 +msgid "Has a rear image" +msgstr "Possède une image arrière" + +#: dcim/filtersets.py:463 dcim/filtersets.py:571 dcim/filtersets.py:975 +#: dcim/forms/filtersets.py:466 dcim/forms/filtersets.py:563 +#: dcim/forms/filtersets.py:775 +msgid "Has console ports" +msgstr "Possède des ports de console" + +#: dcim/filtersets.py:467 dcim/filtersets.py:575 dcim/filtersets.py:979 +#: dcim/forms/filtersets.py:473 dcim/forms/filtersets.py:570 +#: dcim/forms/filtersets.py:782 +msgid "Has console server ports" +msgstr "Possède des ports de serveur de console" + +#: dcim/filtersets.py:471 dcim/filtersets.py:579 dcim/filtersets.py:983 +#: dcim/forms/filtersets.py:480 dcim/forms/filtersets.py:577 +#: dcim/forms/filtersets.py:789 +msgid "Has power ports" +msgstr "Possède des ports d'alimentation" + +#: dcim/filtersets.py:475 dcim/filtersets.py:583 dcim/filtersets.py:987 +#: dcim/forms/filtersets.py:487 dcim/forms/filtersets.py:584 +#: dcim/forms/filtersets.py:796 +msgid "Has power outlets" +msgstr "Dispose de prises de courant" + +#: dcim/filtersets.py:479 dcim/filtersets.py:587 dcim/filtersets.py:991 +#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:591 +#: dcim/forms/filtersets.py:803 +msgid "Has interfaces" +msgstr "Possède des interfaces" + +#: dcim/filtersets.py:483 dcim/filtersets.py:591 dcim/filtersets.py:995 +#: dcim/forms/filtersets.py:501 dcim/forms/filtersets.py:598 +#: dcim/forms/filtersets.py:810 +msgid "Has pass-through ports" +msgstr "Possède des ports d'intercommunication" + +#: dcim/filtersets.py:487 dcim/filtersets.py:999 dcim/forms/filtersets.py:515 +msgid "Has module bays" +msgstr "Dispose de baies pour modules" + +#: dcim/filtersets.py:491 dcim/filtersets.py:1003 dcim/forms/filtersets.py:508 +msgid "Has device bays" +msgstr "Dispose de baies pour appareils" + +#: dcim/filtersets.py:495 dcim/forms/filtersets.py:522 +msgid "Has inventory items" +msgstr "Possède des articles en inventaire" + +#: dcim/filtersets.py:638 dcim/filtersets.py:849 dcim/filtersets.py:1245 +msgid "Device type (ID)" +msgstr "Type d'appareil (ID)" + +#: dcim/filtersets.py:651 dcim/filtersets.py:1127 +msgid "Module type (ID)" +msgstr "Type de module (ID)" + +#: dcim/filtersets.py:750 dcim/filtersets.py:1605 +msgid "Parent inventory item (ID)" +msgstr "Article d'inventaire parent (ID)" + +#: dcim/filtersets.py:793 dcim/filtersets.py:815 dcim/filtersets.py:971 +#: virtualization/filtersets.py:237 +msgid "Config template (ID)" +msgstr "Modèle de configuration (ID)" + +#: dcim/filtersets.py:845 +msgid "Device type (slug)" +msgstr "Type d'appareil (slug)" + +#: dcim/filtersets.py:865 +msgid "Parent Device (ID)" +msgstr "Appareil parent (ID)" + +#: dcim/filtersets.py:869 virtualization/filtersets.py:219 +msgid "Platform (ID)" +msgstr "Plateforme (ID)" + +#: dcim/filtersets.py:875 extras/filtersets.py:474 +#: virtualization/filtersets.py:225 +msgid "Platform (slug)" +msgstr "Plateforme (slug)" + +#: dcim/filtersets.py:911 dcim/filtersets.py:1208 dcim/filtersets.py:1703 +#: dcim/filtersets.py:1875 dcim/filtersets.py:1933 +msgid "Site name (slug)" +msgstr "Nom du site (slug)" + +#: dcim/filtersets.py:926 +msgid "VM cluster (ID)" +msgstr "Cluster de machines virtuelles (ID)" + +#: dcim/filtersets.py:932 +msgid "Device model (slug)" +msgstr "Modèle d'appareil (slug)" + +#: dcim/filtersets.py:943 dcim/forms/bulk_edit.py:421 +msgid "Is full depth" +msgstr "Est en pleine profondeur" + +#: dcim/filtersets.py:947 dcim/forms/common.py:18 dcim/forms/filtersets.py:745 +#: dcim/forms/filtersets.py:1285 dcim/models/device_components.py:519 +#: virtualization/filtersets.py:229 virtualization/filtersets.py:295 +#: virtualization/forms/filtersets.py:168 +#: virtualization/forms/filtersets.py:215 +msgid "MAC address" +msgstr "Adresse MAC" + +#: dcim/filtersets.py:954 dcim/forms/filtersets.py:754 +#: dcim/forms/filtersets.py:841 virtualization/filtersets.py:233 +#: virtualization/forms/filtersets.py:172 +msgid "Has a primary IP" +msgstr "Possède une adresse IP principale" + +#: dcim/filtersets.py:958 +msgid "Has an out-of-band IP" +msgstr "Possède une adresse IP hors bande" + +#: dcim/filtersets.py:963 +msgid "Virtual chassis (ID)" +msgstr "Châssis virtuel (ID)" + +#: dcim/filtersets.py:967 +msgid "Is a virtual chassis member" +msgstr "Est un membre virtuel du châssis" + +#: dcim/filtersets.py:1008 +msgid "OOB IP (ID)" +msgstr "ASTUCE SUR L'EMPLOI (ID)" + +#: dcim/filtersets.py:1133 +msgid "Module type (model)" +msgstr "Type de module (modèle)" + +#: dcim/filtersets.py:1139 +msgid "Module Bay (ID)" +msgstr "Module Bay (ID)" + +#: dcim/filtersets.py:1143 dcim/filtersets.py:1234 ipam/filtersets.py:577 +#: ipam/filtersets.py:807 ipam/filtersets.py:1015 +#: virtualization/filtersets.py:160 vpn/filtersets.py:351 +msgid "Device (ID)" +msgstr "Appareil (ID)" + +#: dcim/filtersets.py:1230 +msgid "Rack (name)" +msgstr "Rack (nom)" + +#: dcim/filtersets.py:1240 ipam/filtersets.py:572 ipam/filtersets.py:802 +#: ipam/filtersets.py:1021 vpn/filtersets.py:346 +msgid "Device (name)" +msgstr "Appareil (nom)" + +#: dcim/filtersets.py:1251 +msgid "Device type (model)" +msgstr "Type d'appareil (modèle)" + +#: dcim/filtersets.py:1256 dcim/filtersets.py:1279 +msgid "Device role (ID)" +msgstr "Rôle de l'appareil (ID)" + +#: dcim/filtersets.py:1262 dcim/filtersets.py:1285 +msgid "Device role (slug)" +msgstr "Rôle de l'appareil (slug)" + +#: dcim/filtersets.py:1267 +msgid "Virtual Chassis (ID)" +msgstr "Châssis virtuel (ID)" + +#: dcim/filtersets.py:1273 dcim/forms/filtersets.py:106 +#: dcim/tables/devices.py:235 netbox/navigation/menu.py:67 +#: templates/dcim/device.html:123 templates/dcim/device_edit.html:93 +#: templates/dcim/virtualchassis.html:20 +#: templates/dcim/virtualchassis_add.html:8 +#: templates/dcim/virtualchassis_edit.html:25 +msgid "Virtual Chassis" +msgstr "Châssis virtuel" + +#: dcim/filtersets.py:1305 +msgid "Module (ID)" +msgstr "Module (ID)" + +#: dcim/filtersets.py:1409 ipam/forms/bulk_import.py:188 +#: vpn/forms/bulk_import.py:303 +msgid "Assigned VLAN" +msgstr "VLAN attribué" + +#: dcim/filtersets.py:1413 +msgid "Assigned VID" +msgstr "VID attribué" + +#: dcim/filtersets.py:1418 dcim/forms/bulk_edit.py:1374 +#: dcim/forms/bulk_import.py:828 dcim/forms/filtersets.py:1328 +#: dcim/forms/model_forms.py:1175 dcim/models/device_components.py:712 +#: dcim/tables/devices.py:637 ipam/filtersets.py:282 ipam/filtersets.py:293 +#: ipam/filtersets.py:449 ipam/filtersets.py:550 ipam/filtersets.py:561 +#: ipam/forms/bulk_edit.py:226 ipam/forms/bulk_edit.py:281 +#: ipam/forms/bulk_edit.py:323 ipam/forms/bulk_import.py:156 +#: ipam/forms/bulk_import.py:242 ipam/forms/bulk_import.py:278 +#: ipam/forms/filtersets.py:66 ipam/forms/filtersets.py:167 +#: ipam/forms/filtersets.py:295 ipam/forms/model_forms.py:59 +#: ipam/forms/model_forms.py:203 ipam/forms/model_forms.py:246 +#: ipam/forms/model_forms.py:290 ipam/forms/model_forms.py:412 +#: ipam/forms/model_forms.py:426 ipam/forms/model_forms.py:440 +#: ipam/models/ip.py:232 ipam/models/ip.py:511 ipam/models/ip.py:719 +#: ipam/models/vrfs.py:62 ipam/tables/ip.py:241 ipam/tables/ip.py:306 +#: ipam/tables/ip.py:356 ipam/tables/ip.py:445 +#: templates/dcim/interface.html:138 templates/ipam/ipaddress.html:21 +#: templates/ipam/iprange.html:43 templates/ipam/prefix.html:20 +#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:14 +#: templates/virtualization/vminterface.html:50 +#: virtualization/forms/bulk_edit.py:260 +#: virtualization/forms/bulk_import.py:171 +#: virtualization/forms/filtersets.py:220 +#: virtualization/forms/model_forms.py:347 +#: virtualization/models/virtualmachines.py:348 +#: virtualization/tables/virtualmachines.py:123 +msgid "VRF" +msgstr "VRF" + +#: dcim/filtersets.py:1424 ipam/filtersets.py:288 ipam/filtersets.py:299 +#: ipam/filtersets.py:455 ipam/filtersets.py:556 ipam/filtersets.py:567 +msgid "VRF (RD)" +msgstr "VRF (RD)" + +#: dcim/filtersets.py:1429 ipam/filtersets.py:963 vpn/filtersets.py:314 +msgid "L2VPN (ID)" +msgstr "L2VPN (IDENTIFIANT)" + +#: dcim/filtersets.py:1435 dcim/forms/filtersets.py:1333 +#: dcim/tables/devices.py:585 ipam/filtersets.py:969 +#: ipam/forms/filtersets.py:499 ipam/tables/vlans.py:133 +#: templates/dcim/interface.html:94 templates/ipam/vlan.html:69 +#: templates/vpn/l2vpntermination.html:15 +#: virtualization/forms/filtersets.py:225 vpn/forms/bulk_import.py:275 +#: vpn/forms/filtersets.py:242 vpn/forms/model_forms.py:402 +#: vpn/forms/model_forms.py:420 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +msgid "L2VPN" +msgstr "L2VPN" + +#: dcim/filtersets.py:1467 +msgid "Virtual Chassis Interfaces for Device" +msgstr "Interfaces de châssis virtuelles pour appareils" + +#: dcim/filtersets.py:1472 +msgid "Virtual Chassis Interfaces for Device (ID)" +msgstr "Interfaces de châssis virtuel pour le périphérique (ID)" + +#: dcim/filtersets.py:1476 +msgid "Kind of interface" +msgstr "Type d'interface" + +#: dcim/filtersets.py:1481 virtualization/filtersets.py:287 +msgid "Parent interface (ID)" +msgstr "Interface parent (ID)" + +#: dcim/filtersets.py:1486 virtualization/filtersets.py:292 +msgid "Bridged interface (ID)" +msgstr "Interface pontée (ID)" + +#: dcim/filtersets.py:1491 +msgid "LAG interface (ID)" +msgstr "Interface LAG (ID)" + +#: dcim/filtersets.py:1660 +msgid "Master (ID)" +msgstr "Maître (ID)" + +#: dcim/filtersets.py:1666 +msgid "Master (name)" +msgstr "Master (nom)" + +#: dcim/filtersets.py:1708 tenancy/filtersets.py:220 +msgid "Tenant (ID)" +msgstr "Locataire (ID)" + +#: dcim/filtersets.py:1714 extras/filtersets.py:523 tenancy/filtersets.py:226 +msgid "Tenant (slug)" +msgstr "Locataire (limace)" + +#: dcim/filtersets.py:1749 dcim/forms/filtersets.py:990 +msgid "Unterminated" +msgstr "Non terminé" + +#: dcim/filtersets.py:1937 +msgid "Power panel (ID)" +msgstr "Panneau d'alimentation (ID)" + +#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:410 +#: extras/forms/model_forms.py:444 extras/forms/model_forms.py:495 +#: netbox/forms/base.py:71 netbox/forms/mixins.py:79 +#: netbox/tables/columns.py:448 +#: templates/circuits/inc/circuit_termination.html:119 +#: templates/generic/bulk_edit.html:81 templates/inc/panels/tags.html:5 +#: utilities/forms/fields/fields.py:81 +msgid "Tags" +msgstr "Balises" + +#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1390 +#: dcim/forms/model_forms.py:422 dcim/forms/model_forms.py:468 +#: dcim/forms/object_create.py:196 dcim/forms/object_create.py:352 +#: dcim/tables/devices.py:198 dcim/tables/devices.py:720 +#: dcim/tables/devicetypes.py:242 templates/dcim/device.html:45 +#: templates/dcim/device.html:129 templates/dcim/modulebay.html:35 +#: templates/dcim/virtualchassis.html:59 +#: templates/dcim/virtualchassis_edit.html:56 +msgid "Position" +msgstr "Position" + +#: dcim/forms/bulk_create.py:114 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of names being " +"created.)" +msgstr "" +"Les plages alphanumériques sont prises en charge. (Doit correspondre au " +"nombre de noms en cours de création.)" + +#: dcim/forms/bulk_edit.py:115 dcim/forms/bulk_import.py:99 +#: dcim/forms/model_forms.py:120 dcim/tables/sites.py:89 +#: ipam/filtersets.py:936 ipam/forms/bulk_edit.py:528 +#: ipam/forms/bulk_import.py:444 ipam/forms/model_forms.py:509 +#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 +#: templates/dcim/interface.html:294 templates/dcim/site.html:37 +#: templates/ipam/inc/panels/fhrp_groups.html:10 templates/ipam/vlan.html:30 +#: templates/tenancy/contact.html:22 templates/tenancy/tenant.html:21 +#: templates/users/group.html:6 templates/users/group.html:14 +#: templates/virtualization/cluster.html:32 templates/vpn/tunnel.html:30 +#: templates/wireless/wirelesslan.html:19 tenancy/forms/bulk_edit.py:42 +#: tenancy/forms/bulk_edit.py:93 tenancy/forms/bulk_import.py:40 +#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:47 +#: tenancy/forms/filtersets.py:77 tenancy/forms/filtersets.py:96 +#: tenancy/forms/model_forms.py:46 tenancy/forms/model_forms.py:102 +#: tenancy/forms/model_forms.py:124 tenancy/tables/contacts.py:60 +#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 +#: users/filtersets.py:42 users/filtersets.py:145 users/forms/filtersets.py:32 +#: users/forms/filtersets.py:38 users/forms/filtersets.py:80 +#: virtualization/forms/bulk_edit.py:64 virtualization/forms/bulk_import.py:47 +#: virtualization/forms/filtersets.py:84 +#: virtualization/forms/model_forms.py:69 virtualization/tables/clusters.py:70 +#: vpn/forms/bulk_edit.py:111 vpn/forms/bulk_import.py:157 +#: vpn/forms/filtersets.py:113 vpn/tables/crypto.py:31 +#: wireless/forms/bulk_edit.py:47 wireless/forms/bulk_import.py:36 +#: wireless/forms/filtersets.py:45 wireless/forms/model_forms.py:41 +#: wireless/tables/wirelesslan.py:48 +msgid "Group" +msgstr "Groupe" + +#: dcim/forms/bulk_edit.py:130 +msgid "Contact name" +msgstr "Nom du contact" + +#: dcim/forms/bulk_edit.py:135 +msgid "Contact phone" +msgstr "Téléphone de contact" + +#: dcim/forms/bulk_edit.py:141 +msgid "Contact E-mail" +msgstr "Adresse électronique de contact" + +#: dcim/forms/bulk_edit.py:144 dcim/forms/bulk_import.py:122 +#: dcim/forms/model_forms.py:131 +msgid "Time zone" +msgstr "Fuseau horaire" + +#: dcim/forms/bulk_edit.py:266 dcim/forms/bulk_edit.py:1152 +#: dcim/forms/bulk_edit.py:1539 dcim/forms/bulk_import.py:199 +#: dcim/forms/bulk_import.py:1009 dcim/forms/filtersets.py:299 +#: dcim/forms/filtersets.py:704 dcim/forms/filtersets.py:1417 +#: dcim/forms/model_forms.py:224 dcim/forms/model_forms.py:963 +#: dcim/forms/model_forms.py:1304 dcim/forms/object_import.py:186 +#: dcim/tables/devices.py:202 dcim/tables/devices.py:828 +#: dcim/tables/devices.py:939 dcim/tables/devicetypes.py:300 +#: dcim/tables/racks.py:69 extras/filtersets.py:457 +#: ipam/forms/bulk_edit.py:245 ipam/forms/bulk_edit.py:294 +#: ipam/forms/bulk_edit.py:342 ipam/forms/bulk_edit.py:546 +#: ipam/forms/bulk_import.py:196 ipam/forms/bulk_import.py:261 +#: ipam/forms/bulk_import.py:297 ipam/forms/bulk_import.py:463 +#: ipam/forms/filtersets.py:232 ipam/forms/filtersets.py:278 +#: ipam/forms/filtersets.py:346 ipam/forms/filtersets.py:490 +#: ipam/forms/model_forms.py:187 ipam/forms/model_forms.py:222 +#: ipam/forms/model_forms.py:249 ipam/forms/model_forms.py:647 +#: ipam/tables/ip.py:257 ipam/tables/ip.py:313 ipam/tables/ip.py:363 +#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:230 +#: templates/dcim/device.html:187 +#: templates/dcim/inc/panels/inventory_items.html:12 +#: templates/dcim/interface.html:231 templates/dcim/inventoryitem.html:37 +#: templates/dcim/rack.html:50 templates/ipam/ipaddress.html:44 +#: templates/ipam/iprange.html:53 templates/ipam/prefix.html:78 +#: templates/ipam/role.html:20 templates/ipam/vlan.html:55 +#: templates/virtualization/virtualmachine.html:26 +#: templates/vpn/tunneltermination.html:18 +#: templates/wireless/inc/wirelesslink_interface.html:20 +#: tenancy/forms/bulk_edit.py:141 tenancy/forms/filtersets.py:106 +#: tenancy/forms/model_forms.py:139 tenancy/tables/contacts.py:102 +#: virtualization/forms/bulk_edit.py:144 +#: virtualization/forms/bulk_import.py:106 +#: virtualization/forms/filtersets.py:153 +#: virtualization/forms/model_forms.py:198 +#: virtualization/tables/virtualmachines.py:65 vpn/forms/bulk_edit.py:86 +#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:84 +#: vpn/forms/model_forms.py:77 vpn/forms/model_forms.py:112 +#: vpn/tables/tunnels.py:78 +msgid "Role" +msgstr "Rôle" + +#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:605 +#: dcim/forms/bulk_edit.py:654 templates/dcim/device.html:106 +#: templates/dcim/module.html:75 templates/dcim/modulebay.html:69 +#: templates/dcim/rack.html:58 +msgid "Serial Number" +msgstr "Numéro de série" + +#: dcim/forms/bulk_edit.py:276 dcim/forms/filtersets.py:306 +#: dcim/forms/filtersets.py:740 dcim/forms/filtersets.py:880 +#: dcim/forms/filtersets.py:1430 +msgid "Asset tag" +msgstr "Étiquette d'actif" + +#: dcim/forms/bulk_edit.py:286 dcim/forms/bulk_import.py:212 +#: dcim/forms/filtersets.py:291 templates/dcim/rack.html:91 +#: templates/dcim/rack_edit.html:48 +msgid "Width" +msgstr "Largeur" + +#: dcim/forms/bulk_edit.py:292 +msgid "Height (U)" +msgstr "Hauteur (U)" + +#: dcim/forms/bulk_edit.py:297 +msgid "Descending units" +msgstr "Unités décroissantes" + +#: dcim/forms/bulk_edit.py:300 +msgid "Outer width" +msgstr "Largeur extérieure" + +#: dcim/forms/bulk_edit.py:305 +msgid "Outer depth" +msgstr "Profondeur extérieure" + +#: dcim/forms/bulk_edit.py:310 dcim/forms/bulk_import.py:217 +msgid "Outer unit" +msgstr "Unité extérieure" + +#: dcim/forms/bulk_edit.py:315 +msgid "Mounting depth" +msgstr "Profondeur de montage" + +#: dcim/forms/bulk_edit.py:320 dcim/forms/bulk_edit.py:349 +#: dcim/forms/bulk_edit.py:434 dcim/forms/bulk_edit.py:457 +#: dcim/forms/bulk_edit.py:473 dcim/forms/bulk_edit.py:493 +#: dcim/forms/bulk_import.py:324 dcim/forms/bulk_import.py:350 +#: dcim/forms/filtersets.py:250 dcim/forms/filtersets.py:311 +#: dcim/forms/filtersets.py:335 dcim/forms/filtersets.py:423 +#: dcim/forms/filtersets.py:529 dcim/forms/filtersets.py:548 +#: dcim/forms/filtersets.py:605 dcim/forms/model_forms.py:337 +#: dcim/tables/devicetypes.py:103 dcim/tables/modules.py:35 +#: dcim/tables/racks.py:103 extras/forms/bulk_edit.py:45 +#: extras/forms/bulk_edit.py:107 extras/forms/bulk_edit.py:157 +#: extras/forms/bulk_edit.py:277 extras/forms/filtersets.py:60 +#: extras/forms/filtersets.py:133 extras/forms/filtersets.py:220 +#: ipam/forms/bulk_edit.py:187 templates/dcim/device.html:329 +#: templates/dcim/devicetype.html:52 templates/dcim/moduletype.html:31 +#: templates/dcim/rack_edit.html:60 templates/dcim/rack_edit.html:63 +#: templates/extras/configcontext.html:18 templates/extras/customlink.html:26 +#: templates/extras/savedfilter.html:34 templates/ipam/role.html:33 +msgid "Weight" +msgstr "Poids" + +#: dcim/forms/bulk_edit.py:325 dcim/forms/filtersets.py:316 +msgid "Max weight" +msgstr "Poids maximum" + +#: dcim/forms/bulk_edit.py:330 dcim/forms/bulk_edit.py:439 +#: dcim/forms/bulk_edit.py:478 dcim/forms/bulk_import.py:223 +#: dcim/forms/bulk_import.py:329 dcim/forms/bulk_import.py:355 +#: dcim/forms/filtersets.py:321 dcim/forms/filtersets.py:533 +#: dcim/forms/filtersets.py:609 +msgid "Weight unit" +msgstr "Unité de poids" + +#: dcim/forms/bulk_edit.py:344 dcim/forms/bulk_edit.py:800 +#: dcim/forms/bulk_import.py:262 dcim/forms/bulk_import.py:265 +#: dcim/forms/bulk_import.py:490 dcim/forms/bulk_import.py:1286 +#: dcim/forms/bulk_import.py:1290 dcim/forms/filtersets.py:101 +#: dcim/forms/filtersets.py:339 dcim/forms/filtersets.py:353 +#: dcim/forms/filtersets.py:391 dcim/forms/filtersets.py:699 +#: dcim/forms/filtersets.py:948 dcim/forms/filtersets.py:1080 +#: dcim/forms/model_forms.py:241 dcim/forms/model_forms.py:413 +#: dcim/forms/model_forms.py:662 dcim/forms/object_create.py:399 +#: dcim/tables/devices.py:194 dcim/tables/power.py:70 dcim/tables/racks.py:148 +#: ipam/forms/bulk_edit.py:464 ipam/forms/filtersets.py:427 +#: ipam/forms/model_forms.py:571 templates/dcim/device.html:30 +#: templates/dcim/inc/cable_termination.html:16 +#: templates/dcim/powerfeed.html:31 templates/dcim/rack.html:14 +#: templates/dcim/rack/base.html:4 templates/dcim/rack_edit.html:8 +#: templates/dcim/rackreservation.html:20 +#: templates/dcim/rackreservation.html:39 +#: virtualization/forms/model_forms.py:116 +msgid "Rack" +msgstr "Étagère" + +#: dcim/forms/bulk_edit.py:346 dcim/forms/bulk_edit.py:623 +#: dcim/forms/filtersets.py:247 dcim/forms/filtersets.py:332 +#: dcim/forms/filtersets.py:417 dcim/forms/filtersets.py:543 +#: dcim/forms/filtersets.py:652 dcim/forms/filtersets.py:853 +#: dcim/forms/model_forms.py:589 dcim/forms/model_forms.py:1374 +#: templates/dcim/device_edit.html:20 +#: templates/dcim/inventoryitem_edit.html:23 +msgid "Hardware" +msgstr "Matériel" + +#: dcim/forms/bulk_edit.py:400 dcim/forms/bulk_edit.py:464 +#: dcim/forms/bulk_edit.py:528 dcim/forms/bulk_edit.py:552 +#: dcim/forms/bulk_edit.py:633 dcim/forms/bulk_edit.py:1157 +#: dcim/forms/bulk_edit.py:1544 dcim/forms/bulk_import.py:311 +#: dcim/forms/bulk_import.py:345 dcim/forms/bulk_import.py:387 +#: dcim/forms/bulk_import.py:423 dcim/forms/bulk_import.py:1015 +#: dcim/forms/filtersets.py:429 dcim/forms/filtersets.py:554 +#: dcim/forms/filtersets.py:631 dcim/forms/filtersets.py:709 +#: dcim/forms/filtersets.py:858 dcim/forms/filtersets.py:1423 +#: dcim/forms/model_forms.py:274 dcim/forms/model_forms.py:288 +#: dcim/forms/model_forms.py:330 dcim/forms/model_forms.py:370 +#: dcim/forms/model_forms.py:968 dcim/forms/model_forms.py:1309 +#: dcim/forms/object_import.py:192 dcim/tables/devices.py:129 +#: dcim/tables/devices.py:205 dcim/tables/devices.py:942 +#: dcim/tables/devicetypes.py:81 dcim/tables/devicetypes.py:304 +#: dcim/tables/modules.py:20 dcim/tables/modules.py:60 +#: templates/dcim/devicetype.html:17 templates/dcim/inventoryitem.html:45 +#: templates/dcim/manufacturer.html:34 templates/dcim/modulebay.html:61 +#: templates/dcim/moduletype.html:15 templates/dcim/platform.html:40 +msgid "Manufacturer" +msgstr "Fabricant" + +#: dcim/forms/bulk_edit.py:405 dcim/forms/bulk_import.py:317 +#: dcim/forms/filtersets.py:434 dcim/forms/model_forms.py:292 +msgid "Default platform" +msgstr "Plateforme par défaut" + +#: dcim/forms/bulk_edit.py:410 dcim/forms/bulk_edit.py:469 +#: dcim/forms/filtersets.py:437 dcim/forms/filtersets.py:558 +msgid "Part number" +msgstr "Numéro de pièce" + +#: dcim/forms/bulk_edit.py:414 +msgid "U height" +msgstr "Hauteur en U" + +#: dcim/forms/bulk_edit.py:426 +msgid "Exclude from utilization" +msgstr "Exclure de l'utilisation" + +#: dcim/forms/bulk_edit.py:429 dcim/forms/bulk_edit.py:598 +#: dcim/forms/bulk_import.py:517 dcim/forms/filtersets.py:446 +#: dcim/forms/filtersets.py:731 templates/dcim/device.html:100 +#: templates/dcim/devicetype.html:68 +msgid "Airflow" +msgstr "Débit d'air" + +#: dcim/forms/bulk_edit.py:453 dcim/forms/model_forms.py:303 +#: dcim/tables/devicetypes.py:78 templates/dcim/device.html:90 +#: templates/dcim/devicebay.html:59 templates/dcim/module.html:59 +msgid "Device Type" +msgstr "Type d'appareil" + +#: dcim/forms/bulk_edit.py:492 dcim/forms/model_forms.py:336 +#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 +#: templates/dcim/module.html:63 templates/dcim/modulebay.html:65 +#: templates/dcim/moduletype.html:11 +msgid "Module Type" +msgstr "Type de module" + +#: dcim/forms/bulk_edit.py:506 dcim/models/devices.py:472 +msgid "VM role" +msgstr "rôle de machine virtuelle" + +#: dcim/forms/bulk_edit.py:509 dcim/forms/bulk_edit.py:533 +#: dcim/forms/bulk_edit.py:613 dcim/forms/bulk_import.py:368 +#: dcim/forms/bulk_import.py:372 dcim/forms/bulk_import.py:394 +#: dcim/forms/bulk_import.py:398 dcim/forms/bulk_import.py:523 +#: dcim/forms/bulk_import.py:527 dcim/forms/filtersets.py:620 +#: dcim/forms/filtersets.py:636 dcim/forms/filtersets.py:750 +#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:375 +#: dcim/forms/model_forms.py:477 virtualization/forms/bulk_import.py:132 +#: virtualization/forms/bulk_import.py:133 +#: virtualization/forms/filtersets.py:180 +#: virtualization/forms/model_forms.py:218 +msgid "Config template" +msgstr "Modèle de configuration" + +#: dcim/forms/bulk_edit.py:557 dcim/forms/bulk_edit.py:951 +#: dcim/forms/bulk_import.py:429 dcim/forms/filtersets.py:111 +#: dcim/forms/model_forms.py:435 dcim/forms/model_forms.py:776 +#: dcim/forms/model_forms.py:790 extras/filtersets.py:452 +msgid "Device type" +msgstr "Type d'appareil" + +#: dcim/forms/bulk_edit.py:565 dcim/forms/bulk_import.py:410 +#: dcim/forms/filtersets.py:116 dcim/forms/model_forms.py:440 +msgid "Device role" +msgstr "Rôle de l'appareil" + +#: dcim/forms/bulk_edit.py:588 dcim/forms/bulk_import.py:435 +#: dcim/forms/filtersets.py:723 dcim/forms/model_forms.py:385 +#: dcim/forms/model_forms.py:444 extras/filtersets.py:468 +#: templates/dcim/device.html:191 templates/dcim/platform.html:27 +#: templates/virtualization/virtualmachine.html:30 +#: virtualization/forms/bulk_edit.py:159 +#: virtualization/forms/bulk_import.py:122 +#: virtualization/forms/filtersets.py:164 +#: virtualization/forms/model_forms.py:206 +msgid "Platform" +msgstr "Plateforme" + +#: dcim/forms/bulk_edit.py:621 dcim/forms/bulk_edit.py:1171 +#: dcim/forms/bulk_edit.py:1534 dcim/forms/bulk_edit.py:1580 +#: dcim/forms/bulk_import.py:578 dcim/forms/bulk_import.py:640 +#: dcim/forms/bulk_import.py:666 dcim/forms/bulk_import.py:692 +#: dcim/forms/bulk_import.py:712 dcim/forms/bulk_import.py:765 +#: dcim/forms/bulk_import.py:879 dcim/forms/bulk_import.py:927 +#: dcim/forms/bulk_import.py:944 dcim/forms/bulk_import.py:956 +#: dcim/forms/bulk_import.py:1004 dcim/forms/bulk_import.py:1350 +#: dcim/forms/connections.py:23 dcim/forms/filtersets.py:128 +#: dcim/forms/filtersets.py:831 dcim/forms/filtersets.py:964 +#: dcim/forms/filtersets.py:1154 dcim/forms/filtersets.py:1176 +#: dcim/forms/filtersets.py:1198 dcim/forms/filtersets.py:1215 +#: dcim/forms/filtersets.py:1235 dcim/forms/filtersets.py:1343 +#: dcim/forms/filtersets.py:1365 dcim/forms/filtersets.py:1386 +#: dcim/forms/filtersets.py:1401 dcim/forms/filtersets.py:1412 +#: dcim/forms/filtersets.py:1476 dcim/forms/filtersets.py:1500 +#: dcim/forms/filtersets.py:1524 dcim/forms/model_forms.py:555 +#: dcim/forms/model_forms.py:753 dcim/forms/model_forms.py:1004 +#: dcim/forms/model_forms.py:1453 dcim/forms/object_create.py:256 +#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 +#: dcim/tables/connections.py:60 dcim/tables/devices.py:314 +#: dcim/tables/devices.py:374 dcim/tables/devices.py:418 +#: dcim/tables/devices.py:463 dcim/tables/devices.py:517 +#: dcim/tables/devices.py:609 dcim/tables/devices.py:710 +#: dcim/tables/devices.py:770 dcim/tables/devices.py:820 +#: dcim/tables/devices.py:880 dcim/tables/devices.py:932 +#: dcim/tables/devices.py:1058 dcim/tables/modules.py:52 +#: extras/forms/filtersets.py:329 ipam/forms/bulk_import.py:303 +#: ipam/forms/bulk_import.py:489 ipam/forms/filtersets.py:532 +#: ipam/forms/model_forms.py:685 ipam/tables/vlans.py:176 +#: templates/dcim/consoleport.html:23 templates/dcim/consoleserverport.html:23 +#: templates/dcim/device.html:14 templates/dcim/device.html:128 +#: templates/dcim/device_edit.html:10 templates/dcim/devicebay.html:23 +#: templates/dcim/devicebay.html:55 templates/dcim/frontport.html:23 +#: templates/dcim/interface.html:31 templates/dcim/interface.html:167 +#: templates/dcim/inventoryitem.html:21 templates/dcim/module.html:55 +#: templates/dcim/modulebay.html:21 templates/dcim/poweroutlet.html:23 +#: templates/dcim/powerport.html:23 templates/dcim/rearport.html:23 +#: templates/dcim/virtualchassis.html:58 +#: templates/dcim/virtualchassis_edit.html:52 +#: templates/dcim/virtualdevicecontext.html:25 +#: templates/ipam/ipaddress_edit.html:42 templates/ipam/service_create.html:17 +#: templates/ipam/service_edit.html:16 +#: templates/virtualization/virtualmachine.html:115 +#: templates/vpn/l2vpntermination_edit.html:22 +#: templates/vpn/tunneltermination.html:24 +#: templates/wireless/inc/wirelesslink_interface.html:6 +#: virtualization/filtersets.py:166 virtualization/forms/bulk_edit.py:136 +#: virtualization/forms/bulk_import.py:99 +#: virtualization/forms/filtersets.py:124 +#: virtualization/forms/model_forms.py:188 +#: virtualization/tables/virtualmachines.py:61 vpn/choices.py:44 +#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:278 +#: vpn/forms/filtersets.py:271 vpn/forms/model_forms.py:89 +#: vpn/forms/model_forms.py:124 vpn/forms/model_forms.py:237 +#: wireless/forms/model_forms.py:100 wireless/forms/model_forms.py:140 +#: wireless/tables/wirelesslan.py:75 +msgid "Device" +msgstr "Appareil" + +#: dcim/forms/bulk_edit.py:624 netbox/navigation/menu.py:441 +#: templates/extras/dashboard/widget_config.html:7 +msgid "Configuration" +msgstr "Configuration" + +#: dcim/forms/bulk_edit.py:638 dcim/forms/bulk_import.py:590 +#: dcim/forms/model_forms.py:569 dcim/forms/model_forms.py:795 +msgid "Module type" +msgstr "Type de module" + +#: dcim/forms/bulk_edit.py:689 dcim/forms/bulk_edit.py:874 +#: dcim/forms/bulk_edit.py:893 dcim/forms/bulk_edit.py:916 +#: dcim/forms/bulk_edit.py:958 dcim/forms/bulk_edit.py:1002 +#: dcim/forms/bulk_edit.py:1053 dcim/forms/bulk_edit.py:1080 +#: dcim/forms/bulk_edit.py:1107 dcim/forms/bulk_edit.py:1125 +#: dcim/forms/bulk_edit.py:1143 dcim/forms/filtersets.py:64 +#: dcim/forms/object_create.py:45 templates/dcim/cable.html:33 +#: templates/dcim/consoleport.html:35 templates/dcim/consoleserverport.html:35 +#: templates/dcim/devicebay.html:31 templates/dcim/frontport.html:35 +#: templates/dcim/inc/panels/inventory_items.html:11 +#: templates/dcim/interface.html:43 templates/dcim/inventoryitem.html:33 +#: templates/dcim/modulebay.html:31 templates/dcim/poweroutlet.html:35 +#: templates/dcim/powerport.html:35 templates/dcim/rearport.html:35 +#: templates/extras/customfield.html:27 templates/generic/bulk_import.html:155 +msgid "Label" +msgstr "Libellé" + +#: dcim/forms/bulk_edit.py:698 dcim/forms/filtersets.py:981 +#: templates/dcim/cable.html:51 +msgid "Length" +msgstr "Longueur" + +#: dcim/forms/bulk_edit.py:703 dcim/forms/bulk_import.py:1158 +#: dcim/forms/bulk_import.py:1161 dcim/forms/filtersets.py:985 +msgid "Length unit" +msgstr "Unité de longueur" + +#: dcim/forms/bulk_edit.py:727 templates/dcim/virtualchassis.html:24 +msgid "Domain" +msgstr "Domaine" + +#: dcim/forms/bulk_edit.py:795 dcim/forms/bulk_import.py:1273 +#: dcim/forms/filtersets.py:1071 dcim/forms/model_forms.py:657 +msgid "Power panel" +msgstr "panneau d'alimentation" + +#: dcim/forms/bulk_edit.py:817 dcim/forms/bulk_import.py:1309 +#: dcim/forms/filtersets.py:1093 templates/dcim/powerfeed.html:90 +msgid "Supply" +msgstr "Approvisionnement" + +#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1314 +#: dcim/forms/filtersets.py:1098 templates/dcim/powerfeed.html:102 +msgid "Phase" +msgstr "Phase" + +#: dcim/forms/bulk_edit.py:829 dcim/forms/filtersets.py:1103 +#: templates/dcim/powerfeed.html:94 +msgid "Voltage" +msgstr "tension" + +#: dcim/forms/bulk_edit.py:833 dcim/forms/filtersets.py:1107 +#: templates/dcim/powerfeed.html:98 +msgid "Amperage" +msgstr "Ampérage" + +#: dcim/forms/bulk_edit.py:837 dcim/forms/filtersets.py:1111 +msgid "Max utilization" +msgstr "Utilisation maximale" + +#: dcim/forms/bulk_edit.py:841 dcim/forms/bulk_edit.py:1200 +#: dcim/forms/bulk_edit.py:1217 dcim/forms/bulk_edit.py:1234 +#: dcim/forms/bulk_edit.py:1252 dcim/forms/bulk_edit.py:1340 +#: dcim/forms/bulk_edit.py:1478 dcim/forms/bulk_edit.py:1495 +msgid "Mark connected" +msgstr "Marquer comme connecté" + +#: dcim/forms/bulk_edit.py:926 +msgid "Maximum draw" +msgstr "Tirage maximum" + +#: dcim/forms/bulk_edit.py:929 dcim/models/device_component_templates.py:256 +#: dcim/models/device_components.py:357 +msgid "Maximum power draw (watts)" +msgstr "Consommation électrique maximale (watts)" + +#: dcim/forms/bulk_edit.py:932 +msgid "Allocated draw" +msgstr "Tirage au sort attribué" + +#: dcim/forms/bulk_edit.py:935 dcim/models/device_component_templates.py:263 +#: dcim/models/device_components.py:364 +msgid "Allocated power draw (watts)" +msgstr "Consommation électrique allouée (watts)" + +#: dcim/forms/bulk_edit.py:968 dcim/forms/bulk_import.py:723 +#: dcim/forms/model_forms.py:848 dcim/forms/model_forms.py:1076 +#: dcim/forms/model_forms.py:1361 dcim/forms/object_import.py:60 +msgid "Power port" +msgstr "port d'alimentation" + +#: dcim/forms/bulk_edit.py:973 +msgid "Feed leg" +msgstr "Patte d'alimentation" + +#: dcim/forms/bulk_edit.py:1019 dcim/forms/bulk_edit.py:1325 +msgid "Management only" +msgstr "Gestion uniquement" + +#: dcim/forms/bulk_edit.py:1029 dcim/forms/bulk_edit.py:1331 +#: dcim/forms/bulk_import.py:813 dcim/forms/filtersets.py:1294 +#: dcim/forms/object_import.py:95 +#: dcim/models/device_component_templates.py:411 +#: dcim/models/device_components.py:671 +msgid "PoE mode" +msgstr "Mode PoE" + +#: dcim/forms/bulk_edit.py:1035 dcim/forms/bulk_edit.py:1337 +#: dcim/forms/bulk_import.py:819 dcim/forms/filtersets.py:1299 +#: dcim/forms/object_import.py:100 +#: dcim/models/device_component_templates.py:417 +#: dcim/models/device_components.py:677 +msgid "PoE type" +msgstr "Type PoE" + +#: dcim/forms/bulk_edit.py:1041 dcim/forms/filtersets.py:1304 +#: dcim/forms/object_import.py:105 +msgid "Wireless role" +msgstr "Rôle sans fil" + +#: dcim/forms/bulk_edit.py:1178 dcim/forms/model_forms.py:588 +#: dcim/forms/model_forms.py:1019 dcim/tables/devices.py:337 +#: templates/dcim/consoleport.html:27 templates/dcim/consoleserverport.html:27 +#: templates/dcim/frontport.html:27 templates/dcim/interface.html:35 +#: templates/dcim/module.html:51 templates/dcim/modulebay.html:57 +#: templates/dcim/poweroutlet.html:27 templates/dcim/powerport.html:27 +#: templates/dcim/rearport.html:27 +msgid "Module" +msgstr "Modules" + +#: dcim/forms/bulk_edit.py:1305 dcim/tables/devices.py:680 +#: templates/dcim/interface.html:113 +msgid "LAG" +msgstr "DÉCALAGE" + +#: dcim/forms/bulk_edit.py:1310 dcim/forms/model_forms.py:1103 +msgid "Virtual device contexts" +msgstr "Contextes des appareils virtuels" + +#: dcim/forms/bulk_edit.py:1316 dcim/forms/bulk_import.py:651 +#: dcim/forms/bulk_import.py:677 dcim/forms/filtersets.py:1163 +#: dcim/forms/filtersets.py:1185 dcim/forms/filtersets.py:1258 +#: dcim/tables/devices.py:621 +#: templates/circuits/inc/circuit_termination.html:94 +#: templates/dcim/consoleport.html:43 templates/dcim/consoleserverport.html:43 +msgid "Speed" +msgstr "Vitesse" + +#: dcim/forms/bulk_edit.py:1345 dcim/forms/bulk_import.py:822 +#: templates/vpn/ikepolicy.html:26 templates/vpn/ipsecprofile.html:22 +#: templates/vpn/ipsecprofile.html:51 virtualization/forms/bulk_edit.py:232 +#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:145 +#: vpn/forms/bulk_edit.py:233 vpn/forms/bulk_import.py:175 +#: vpn/forms/bulk_import.py:229 vpn/forms/filtersets.py:132 +#: vpn/forms/filtersets.py:175 vpn/forms/filtersets.py:189 +#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +msgid "Mode" +msgstr "Mode" + +#: dcim/forms/bulk_edit.py:1353 dcim/forms/model_forms.py:1152 +#: ipam/forms/bulk_import.py:177 ipam/forms/filtersets.py:479 +#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:239 +#: virtualization/forms/model_forms.py:324 +msgid "VLAN group" +msgstr "groupe VLAN" + +#: dcim/forms/bulk_edit.py:1361 dcim/forms/model_forms.py:1157 +#: dcim/tables/devices.py:594 virtualization/forms/bulk_edit.py:247 +#: virtualization/forms/model_forms.py:329 +msgid "Untagged VLAN" +msgstr "VLAN non balisé" + +#: dcim/forms/bulk_edit.py:1369 dcim/forms/model_forms.py:1166 +#: dcim/tables/devices.py:600 virtualization/forms/bulk_edit.py:255 +#: virtualization/forms/model_forms.py:338 +msgid "Tagged VLANs" +msgstr "VLAN balisés" + +#: dcim/forms/bulk_edit.py:1379 dcim/forms/model_forms.py:1139 +msgid "Wireless LAN group" +msgstr "Groupe LAN sans fil" + +#: dcim/forms/bulk_edit.py:1384 dcim/forms/model_forms.py:1144 +#: dcim/tables/devices.py:630 netbox/navigation/menu.py:134 +#: templates/dcim/interface.html:289 wireless/tables/wirelesslan.py:24 +msgid "Wireless LANs" +msgstr "Réseaux locaux sans fil" + +#: dcim/forms/bulk_edit.py:1393 dcim/forms/filtersets.py:1231 +#: dcim/forms/model_forms.py:1185 ipam/forms/bulk_edit.py:270 +#: ipam/forms/bulk_edit.py:361 ipam/forms/filtersets.py:166 +#: templates/dcim/interface.html:126 templates/ipam/prefix.html:96 +#: virtualization/forms/model_forms.py:352 +msgid "Addressing" +msgstr "Adressage" + +#: dcim/forms/bulk_edit.py:1394 dcim/forms/filtersets.py:651 +#: dcim/forms/model_forms.py:1186 virtualization/forms/model_forms.py:353 +msgid "Operation" +msgstr "Fonctionnement" + +#: dcim/forms/bulk_edit.py:1395 dcim/forms/filtersets.py:1232 +#: dcim/forms/model_forms.py:880 dcim/forms/model_forms.py:1188 +msgid "PoE" +msgstr "PoE" + +#: dcim/forms/bulk_edit.py:1396 dcim/forms/model_forms.py:1187 +#: templates/dcim/interface.html:101 virtualization/forms/bulk_edit.py:266 +#: virtualization/forms/model_forms.py:354 +msgid "Related Interfaces" +msgstr "Interfaces associées" + +#: dcim/forms/bulk_edit.py:1397 dcim/forms/model_forms.py:1189 +#: virtualization/forms/bulk_edit.py:267 +#: virtualization/forms/model_forms.py:355 +msgid "802.1Q Switching" +msgstr "Commutation 802.1Q" + +#: dcim/forms/bulk_edit.py:1458 dcim/forms/bulk_edit.py:1460 +msgid "Interface mode must be specified to assign VLANs" +msgstr "Le mode d'interface doit être spécifié pour attribuer des VLAN" + +#: dcim/forms/bulk_edit.py:1465 dcim/forms/common.py:50 +msgid "An access interface cannot have tagged VLANs assigned." +msgstr "" +"Les VLAN balisés ne peuvent pas être attribués à une interface d'accès." + +#: dcim/forms/bulk_import.py:63 +msgid "Name of parent region" +msgstr "Nom de la région mère" + +#: dcim/forms/bulk_import.py:77 +msgid "Name of parent site group" +msgstr "Nom du groupe de sites parent" + +#: dcim/forms/bulk_import.py:96 +msgid "Assigned region" +msgstr "Région assignée" + +#: dcim/forms/bulk_import.py:103 tenancy/forms/bulk_import.py:44 +#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +msgid "Assigned group" +msgstr "Groupe assigné" + +#: dcim/forms/bulk_import.py:122 +msgid "available options" +msgstr "options disponibles" + +#: dcim/forms/bulk_import.py:133 dcim/forms/bulk_import.py:480 +#: dcim/forms/bulk_import.py:1270 ipam/forms/bulk_import.py:174 +#: ipam/forms/bulk_import.py:441 virtualization/forms/bulk_import.py:63 +#: virtualization/forms/bulk_import.py:89 +msgid "Assigned site" +msgstr "Site assigné" + +#: dcim/forms/bulk_import.py:140 +msgid "Parent location" +msgstr "Emplacement du parent" + +#: dcim/forms/bulk_import.py:142 +msgid "Location not found." +msgstr "Emplacement introuvable." + +#: dcim/forms/bulk_import.py:191 +msgid "Name of assigned tenant" +msgstr "Nom du locataire assigné" + +#: dcim/forms/bulk_import.py:203 +msgid "Name of assigned role" +msgstr "Nom du rôle attribué" + +#: dcim/forms/bulk_import.py:209 +msgid "Rack type" +msgstr "Type de rack" + +#: dcim/forms/bulk_import.py:214 +msgid "Rail-to-rail width (in inches)" +msgstr "Largeur rail à rail (en pouces)" + +#: dcim/forms/bulk_import.py:220 +msgid "Unit for outer dimensions" +msgstr "Unité pour les dimensions extérieures" + +#: dcim/forms/bulk_import.py:226 +msgid "Unit for rack weights" +msgstr "Unité pour supports de pesage" + +#: dcim/forms/bulk_import.py:252 +msgid "Parent site" +msgstr "Site parent" + +#: dcim/forms/bulk_import.py:259 dcim/forms/bulk_import.py:1283 +msgid "Rack's location (if any)" +msgstr "Emplacement du rack (le cas échéant)" + +#: dcim/forms/bulk_import.py:268 dcim/forms/model_forms.py:246 +#: dcim/tables/racks.py:153 templates/dcim/rackreservation.html:12 +#: templates/dcim/rackreservation.html:52 +msgid "Units" +msgstr "Unités" + +#: dcim/forms/bulk_import.py:271 +msgid "Comma-separated list of individual unit numbers" +msgstr "Liste de numéros d'unités individuels séparés par des virgules" + +#: dcim/forms/bulk_import.py:314 +msgid "The manufacturer which produces this device type" +msgstr "Le fabricant qui produit ce type d'appareil" + +#: dcim/forms/bulk_import.py:321 +msgid "The default platform for devices of this type (optional)" +msgstr "Plateforme par défaut pour les appareils de ce type (facultatif)" + +#: dcim/forms/bulk_import.py:326 +msgid "Device weight" +msgstr "Poids de l'appareil" + +#: dcim/forms/bulk_import.py:332 +msgid "Unit for device weight" +msgstr "Unité de poids de l'appareil" + +#: dcim/forms/bulk_import.py:352 +msgid "Module weight" +msgstr "Poids du module" + +#: dcim/forms/bulk_import.py:358 +msgid "Unit for module weight" +msgstr "Unité pour le poids du module" + +#: dcim/forms/bulk_import.py:391 +msgid "Limit platform assignments to this manufacturer" +msgstr "Limiter les attributions de plateforme à ce fabricant" + +#: dcim/forms/bulk_import.py:413 tenancy/forms/bulk_import.py:106 +msgid "Assigned role" +msgstr "Rôle assigné" + +#: dcim/forms/bulk_import.py:426 +msgid "Device type manufacturer" +msgstr "Fabricant du type d'appareil" + +#: dcim/forms/bulk_import.py:432 +msgid "Device type model" +msgstr "Type d'appareil et modèle" + +#: dcim/forms/bulk_import.py:439 virtualization/forms/bulk_import.py:126 +msgid "Assigned platform" +msgstr "Plateforme attribuée" + +#: dcim/forms/bulk_import.py:447 dcim/forms/bulk_import.py:451 +#: dcim/forms/model_forms.py:461 +msgid "Virtual chassis" +msgstr "Châssis virtuel" + +#: dcim/forms/bulk_import.py:454 dcim/forms/model_forms.py:450 +#: dcim/tables/devices.py:231 extras/filtersets.py:501 +#: extras/forms/filtersets.py:330 ipam/forms/bulk_edit.py:478 +#: ipam/forms/model_forms.py:588 templates/dcim/device.html:239 +#: templates/virtualization/cluster.html:11 +#: templates/virtualization/virtualmachine.html:92 +#: templates/virtualization/virtualmachine.html:102 +#: virtualization/filtersets.py:156 virtualization/filtersets.py:271 +#: virtualization/forms/bulk_edit.py:128 +#: virtualization/forms/bulk_import.py:92 +#: virtualization/forms/filtersets.py:98 +#: virtualization/forms/filtersets.py:119 +#: virtualization/forms/filtersets.py:196 +#: virtualization/forms/model_forms.py:82 +#: virtualization/forms/model_forms.py:179 +#: virtualization/tables/virtualmachines.py:57 +msgid "Cluster" +msgstr "Cluster" + +#: dcim/forms/bulk_import.py:458 +msgid "Virtualization cluster" +msgstr "Cluster de virtualisation" + +#: dcim/forms/bulk_import.py:487 +msgid "Assigned location (if any)" +msgstr "Emplacement attribué (le cas échéant)" + +#: dcim/forms/bulk_import.py:494 +msgid "Assigned rack (if any)" +msgstr "Rack assigné (le cas échéant)" + +#: dcim/forms/bulk_import.py:497 +msgid "Face" +msgstr "Visage" + +#: dcim/forms/bulk_import.py:500 +msgid "Mounted rack face" +msgstr "Face du rack montée" + +#: dcim/forms/bulk_import.py:507 +msgid "Parent device (for child devices)" +msgstr "Appareil parent (pour les appareils pour enfants)" + +#: dcim/forms/bulk_import.py:510 +msgid "Device bay" +msgstr "Baie pour appareils" + +#: dcim/forms/bulk_import.py:514 +msgid "Device bay in which this device is installed (for child devices)" +msgstr "" +"Baie d'appareils dans laquelle cet appareil est installé (pour les appareils" +" pour enfants)" + +#: dcim/forms/bulk_import.py:520 +msgid "Airflow direction" +msgstr "Direction du flux d'air" + +#: dcim/forms/bulk_import.py:581 +msgid "The device in which this module is installed" +msgstr "L'appareil sur lequel ce module est installé" + +#: dcim/forms/bulk_import.py:584 dcim/forms/model_forms.py:562 +msgid "Module bay" +msgstr "Baie modulaire" + +#: dcim/forms/bulk_import.py:587 +msgid "The module bay in which this module is installed" +msgstr "La baie du module dans laquelle ce module est installé" + +#: dcim/forms/bulk_import.py:593 +msgid "The type of module" +msgstr "Le type de module" + +#: dcim/forms/bulk_import.py:601 dcim/forms/model_forms.py:575 +msgid "Replicate components" +msgstr "Répliquer les composants" + +#: dcim/forms/bulk_import.py:603 +msgid "" +"Automatically populate components associated with this module type (enabled " +"by default)" +msgstr "" +"Remplir automatiquement les composants associés à ce type de module (activé " +"par défaut)" + +#: dcim/forms/bulk_import.py:606 dcim/forms/model_forms.py:581 +msgid "Adopt components" +msgstr "Adoptez des composants" + +#: dcim/forms/bulk_import.py:608 dcim/forms/model_forms.py:584 +msgid "Adopt already existing components" +msgstr "Adoptez des composants déjà existants" + +#: dcim/forms/bulk_import.py:648 dcim/forms/bulk_import.py:674 +#: dcim/forms/bulk_import.py:700 +msgid "Port type" +msgstr "Type de port" + +#: dcim/forms/bulk_import.py:656 dcim/forms/bulk_import.py:682 +msgid "Port speed in bps" +msgstr "Vitesse du port en bits/s" + +#: dcim/forms/bulk_import.py:720 +msgid "Outlet type" +msgstr "Type de prise" + +#: dcim/forms/bulk_import.py:727 +msgid "Local power port which feeds this outlet" +msgstr "Port d'alimentation local qui alimente cette prise" + +#: dcim/forms/bulk_import.py:730 +msgid "Feed lag" +msgstr "Retard d'alimentation" + +#: dcim/forms/bulk_import.py:733 +msgid "Electrical phase (for three-phase circuits)" +msgstr "Phase électrique (pour circuits triphasés)" + +#: dcim/forms/bulk_import.py:774 dcim/forms/model_forms.py:1114 +#: virtualization/forms/bulk_import.py:155 +#: virtualization/forms/model_forms.py:308 +msgid "Parent interface" +msgstr "Interface pour les parents" + +#: dcim/forms/bulk_import.py:781 dcim/forms/model_forms.py:1122 +#: virtualization/forms/bulk_import.py:162 +#: virtualization/forms/model_forms.py:316 +msgid "Bridged interface" +msgstr "Interface pontée" + +#: dcim/forms/bulk_import.py:784 +msgid "Lag" +msgstr "Retard" + +#: dcim/forms/bulk_import.py:788 +msgid "Parent LAG interface" +msgstr "Interface LAG parent" + +#: dcim/forms/bulk_import.py:791 +msgid "Vdcs" +msgstr "VDC" + +#: dcim/forms/bulk_import.py:796 +msgid "VDC names separated by commas, encased with double quotes. Example:" +msgstr "" +"Noms de VDC séparés par des virgules, entre guillemets doubles. Exemple :" + +#: dcim/forms/bulk_import.py:802 +msgid "Physical medium" +msgstr "Support physique" + +#: dcim/forms/bulk_import.py:805 dcim/forms/filtersets.py:1265 +msgid "Duplex" +msgstr "Duplex" + +#: dcim/forms/bulk_import.py:810 +msgid "Poe mode" +msgstr "Mode PoE" + +#: dcim/forms/bulk_import.py:816 +msgid "Poe type" +msgstr "Type de poteau" + +#: dcim/forms/bulk_import.py:825 virtualization/forms/bulk_import.py:168 +msgid "IEEE 802.1Q operational mode (for L2 interfaces)" +msgstr "Mode de fonctionnement IEEE 802.1Q (pour interfaces L2)" + +#: dcim/forms/bulk_import.py:832 ipam/forms/bulk_import.py:160 +#: ipam/forms/bulk_import.py:246 ipam/forms/bulk_import.py:282 +#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:266 +#: ipam/forms/filtersets.py:322 virtualization/forms/bulk_import.py:175 +msgid "Assigned VRF" +msgstr "VRF attribué" + +#: dcim/forms/bulk_import.py:835 +msgid "Rf role" +msgstr "Rôle RF" + +#: dcim/forms/bulk_import.py:838 +msgid "Wireless role (AP/station)" +msgstr "Rôle sans fil (AP/station)" + +#: dcim/forms/bulk_import.py:884 dcim/forms/model_forms.py:893 +#: dcim/forms/model_forms.py:1369 dcim/forms/object_import.py:122 +msgid "Rear port" +msgstr "Port arrière" + +#: dcim/forms/bulk_import.py:887 +msgid "Corresponding rear port" +msgstr "Port arrière correspondant" + +#: dcim/forms/bulk_import.py:892 dcim/forms/bulk_import.py:933 +#: dcim/forms/bulk_import.py:1148 +msgid "Physical medium classification" +msgstr "Classification des supports physiques" + +#: dcim/forms/bulk_import.py:961 dcim/tables/devices.py:841 +msgid "Installed device" +msgstr "Appareil installé" + +#: dcim/forms/bulk_import.py:965 +msgid "Child device installed within this bay" +msgstr "Appareil pour enfant installé dans cette baie" + +#: dcim/forms/bulk_import.py:967 +msgid "Child device not found." +msgstr "Appareil pour enfant introuvable." + +#: dcim/forms/bulk_import.py:1025 +msgid "Parent inventory item" +msgstr "Article d'inventaire parent" + +#: dcim/forms/bulk_import.py:1028 +msgid "Component type" +msgstr "Type de composant" + +#: dcim/forms/bulk_import.py:1032 +msgid "Component Type" +msgstr "Type de composant" + +#: dcim/forms/bulk_import.py:1035 +msgid "Compnent name" +msgstr "Nom du composant" + +#: dcim/forms/bulk_import.py:1037 +msgid "Component Name" +msgstr "Nom du composant" + +#: dcim/forms/bulk_import.py:1103 +msgid "Side A device" +msgstr "Appareil côté A" + +#: dcim/forms/bulk_import.py:1106 dcim/forms/bulk_import.py:1124 +msgid "Device name" +msgstr "Nom de l'appareil" + +#: dcim/forms/bulk_import.py:1109 +msgid "Side A type" +msgstr "Côté A type" + +#: dcim/forms/bulk_import.py:1112 dcim/forms/bulk_import.py:1130 +msgid "Termination type" +msgstr "Type de terminaison" + +#: dcim/forms/bulk_import.py:1115 +msgid "Side A name" +msgstr "Nom de la face A" + +#: dcim/forms/bulk_import.py:1116 dcim/forms/bulk_import.py:1134 +msgid "Termination name" +msgstr "Nom de résiliation" + +#: dcim/forms/bulk_import.py:1121 +msgid "Side B device" +msgstr "Appareil Side B" + +#: dcim/forms/bulk_import.py:1127 +msgid "Side B type" +msgstr "Type de face B" + +#: dcim/forms/bulk_import.py:1133 +msgid "Side B name" +msgstr "Nom de la face B" + +#: dcim/forms/bulk_import.py:1142 wireless/forms/bulk_import.py:86 +msgid "Connection status" +msgstr "État de la connexion" + +#: dcim/forms/bulk_import.py:1221 dcim/forms/model_forms.py:689 +#: dcim/tables/devices.py:1028 templates/dcim/device.html:130 +#: templates/dcim/virtualchassis.html:28 templates/dcim/virtualchassis.html:60 +msgid "Master" +msgstr "Maître" + +#: dcim/forms/bulk_import.py:1225 +msgid "Master device" +msgstr "Appareil principal" + +#: dcim/forms/bulk_import.py:1242 +msgid "Name of parent site" +msgstr "Nom du site parent" + +#: dcim/forms/bulk_import.py:1276 +msgid "Upstream power panel" +msgstr "Panneau d'alimentation en amont" + +#: dcim/forms/bulk_import.py:1306 +msgid "Primary or redundant" +msgstr "Principal ou redondant" + +#: dcim/forms/bulk_import.py:1311 +msgid "Supply type (AC/DC)" +msgstr "Type d'alimentation (AC/DC)" + +#: dcim/forms/bulk_import.py:1316 +msgid "Single or three-phase" +msgstr "Monophasé ou triphasé" + +#: dcim/forms/common.py:24 dcim/models/device_components.py:528 +#: templates/dcim/interface.html:58 +#: templates/virtualization/vminterface.html:58 +#: virtualization/forms/bulk_edit.py:224 +msgid "MTU" +msgstr "MTU" + +#: dcim/forms/common.py:65 +#, python-brace-format +msgid "" +"The tagged VLANs ({vlans}) must belong to the same site as the interface's " +"parent device/VM, or they must be global" +msgstr "" +"Les VLAN balisés ({vlans}) doivent appartenir au même site que l'appareil/la" +" machine virtuelle parent de l'interface, ou ils doivent être globaux" + +#: dcim/forms/common.py:110 +msgid "" +"Cannot install module with placeholder values in a module bay with no " +"position defined." +msgstr "" +"Impossible d'installer le module avec des valeurs d'espace réservé dans une " +"baie de modules dont aucune position n'est définie." + +#: dcim/forms/common.py:119 +#, python-brace-format +msgid "Cannot adopt {model} {name} as it already belongs to a module" +msgstr "" +"Impossible d'adopter {model} {name} car il appartient déjà à un module" + +#: dcim/forms/common.py:128 +#, python-brace-format +msgid "A {model} named {name} already exists" +msgstr "UN {model} nommé {name} existe déjà" + +#: dcim/forms/connections.py:45 dcim/tables/power.py:66 +#: templates/dcim/inc/cable_termination.html:37 +#: templates/dcim/powerfeed.html:27 templates/dcim/powerpanel.html:19 +#: templates/dcim/trace/powerpanel.html:4 +msgid "Power Panel" +msgstr "Panneau d'alimentation" + +#: dcim/forms/connections.py:54 dcim/forms/model_forms.py:670 +#: templates/dcim/powerfeed.html:22 templates/dcim/powerport.html:84 +msgid "Power Feed" +msgstr "Alimentation" + +#: dcim/forms/connections.py:74 +msgid "Side" +msgstr "Côté" + +#: dcim/forms/filtersets.py:141 +msgid "Parent region" +msgstr "Région parente" + +#: dcim/forms/filtersets.py:155 tenancy/forms/bulk_import.py:28 +#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:32 +#: tenancy/forms/filtersets.py:61 wireless/forms/bulk_import.py:25 +#: wireless/forms/filtersets.py:24 +msgid "Parent group" +msgstr "Groupe de parents" + +#: dcim/forms/filtersets.py:246 dcim/forms/filtersets.py:331 +msgid "Function" +msgstr "Fonction" + +#: dcim/forms/filtersets.py:418 dcim/forms/model_forms.py:308 +#: templates/inc/panels/image_attachments.html:5 +msgid "Images" +msgstr "Des images" + +#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:544 +#: dcim/forms/filtersets.py:655 +msgid "Components" +msgstr "Composantes" + +#: dcim/forms/filtersets.py:441 +msgid "Subdevice role" +msgstr "Rôle du sous-appareil" + +#: dcim/forms/filtersets.py:717 +msgid "Model" +msgstr "Modèle" + +#: dcim/forms/filtersets.py:768 +msgid "Virtual chassis member" +msgstr "Membre virtuel du châssis" + +#: dcim/forms/filtersets.py:1123 +msgid "Cabled" +msgstr "câblé" + +#: dcim/forms/filtersets.py:1130 +msgid "Occupied" +msgstr "Occupé" + +#: dcim/forms/filtersets.py:1155 dcim/forms/filtersets.py:1177 +#: dcim/forms/filtersets.py:1199 dcim/forms/filtersets.py:1216 +#: dcim/forms/filtersets.py:1236 dcim/tables/devices.py:367 +#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:59 +#: templates/dcim/frontport.html:74 templates/dcim/interface.html:146 +#: templates/dcim/powerfeed.html:118 templates/dcim/poweroutlet.html:63 +#: templates/dcim/powerport.html:63 templates/dcim/rearport.html:70 +msgid "Connection" +msgstr "Connexion" + +#: dcim/forms/filtersets.py:1245 dcim/forms/model_forms.py:1477 +#: templates/dcim/virtualdevicecontext.html:16 +msgid "Virtual Device Context" +msgstr "Contexte du périphérique virtuel" + +#: dcim/forms/filtersets.py:1248 extras/forms/bulk_edit.py:315 +#: extras/forms/bulk_import.py:239 extras/forms/filtersets.py:479 +#: extras/forms/model_forms.py:548 extras/tables/tables.py:482 +#: templates/extras/journalentry.html:33 +msgid "Kind" +msgstr "Type" + +#: dcim/forms/filtersets.py:1277 +msgid "Mgmt only" +msgstr "Gestion uniquement" + +#: dcim/forms/filtersets.py:1289 dcim/forms/model_forms.py:1180 +#: dcim/models/device_components.py:630 templates/dcim/interface.html:134 +msgid "WWN" +msgstr "WWN" + +#: dcim/forms/filtersets.py:1309 +msgid "Wireless channel" +msgstr "Canal sans fil" + +#: dcim/forms/filtersets.py:1313 +msgid "Channel frequency (MHz)" +msgstr "Fréquence du canal (MHz)" + +#: dcim/forms/filtersets.py:1317 +msgid "Channel width (MHz)" +msgstr "Largeur du canal (MHz)" + +#: dcim/forms/filtersets.py:1321 templates/dcim/interface.html:86 +msgid "Transmit power (dBm)" +msgstr "Puissance de transmission (dBm)" + +#: dcim/forms/filtersets.py:1344 dcim/forms/filtersets.py:1366 +#: dcim/tables/devices.py:344 templates/dcim/cable.html:12 +#: templates/dcim/cable_edit.html:46 templates/dcim/cable_trace.html:43 +#: templates/dcim/frontport.html:84 +#: templates/dcim/inc/connection_endpoints.html:4 +#: templates/dcim/rearport.html:80 templates/dcim/trace/cable.html:7 +msgid "Cable" +msgstr "câble" + +#: dcim/forms/filtersets.py:1434 dcim/tables/devices.py:951 +msgid "Discovered" +msgstr "Découvert" + +#: dcim/forms/formsets.py:20 +#, python-brace-format +msgid "A virtual chassis member already exists in position {vc_position}." +msgstr "Un élément de châssis virtuel existe déjà en place {vc_position}." + +#: dcim/forms/model_forms.py:101 dcim/tables/devices.py:183 +#: templates/dcim/sitegroup.html:26 +msgid "Site Group" +msgstr "Groupe de sites" + +#: dcim/forms/model_forms.py:142 +msgid "Contact Info" +msgstr "Informations de contact" + +#: dcim/forms/model_forms.py:197 templates/dcim/rackrole.html:20 +msgid "Rack Role" +msgstr "Role Rack" + +#: dcim/forms/model_forms.py:248 +msgid "" +"Comma-separated list of numeric unit IDs. A range may be specified using a " +"hyphen." +msgstr "" +"Liste d'identifiants d'unités numériques séparés par des virgules. Une plage" +" peut être spécifiée à l'aide d'un trait d'union." + +#: dcim/forms/model_forms.py:259 dcim/tables/racks.py:133 +msgid "Reservation" +msgstr "Réservation" + +#: dcim/forms/model_forms.py:297 dcim/forms/model_forms.py:380 +#: utilities/forms/fields/fields.py:47 +msgid "Slug" +msgstr "limace" + +#: dcim/forms/model_forms.py:304 templates/dcim/devicetype.html:12 +msgid "Chassis" +msgstr "Châssis" + +#: dcim/forms/model_forms.py:356 templates/dcim/devicerole.html:24 +msgid "Device Role" +msgstr "Rôle de l'appareil" + +#: dcim/forms/model_forms.py:424 dcim/models/devices.py:632 +msgid "The lowest-numbered unit occupied by the device" +msgstr "L'unité la moins numérotée occupée par l'appareil" + +#: dcim/forms/model_forms.py:469 +msgid "The position in the virtual chassis this device is identified by" +msgstr "" +"La position dans le châssis virtuel par laquelle cet appareil est identifié" + +#: dcim/forms/model_forms.py:473 templates/dcim/device.html:131 +#: templates/dcim/virtualchassis.html:61 +#: templates/dcim/virtualchassis_edit.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:13 +#: tenancy/forms/bulk_edit.py:146 tenancy/forms/filtersets.py:109 +msgid "Priority" +msgstr "Priorité" + +#: dcim/forms/model_forms.py:474 +msgid "The priority of the device in the virtual chassis" +msgstr "La priorité de l'appareil dans le châssis virtuel" + +#: dcim/forms/model_forms.py:578 +msgid "Automatically populate components associated with this module type" +msgstr "Remplir automatiquement les composants associés à ce type de module" + +#: dcim/forms/model_forms.py:623 +msgid "Maximum length is 32767 (any unit)" +msgstr "La longueur maximale est de 32 767 (n'importe quelle unité)" + +#: dcim/forms/model_forms.py:671 +msgid "Characteristics" +msgstr "Caractéristiques" + +#: dcim/forms/model_forms.py:1130 +msgid "LAG interface" +msgstr "Interface LAG" + +#: dcim/forms/model_forms.py:1184 dcim/forms/model_forms.py:1345 +#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:317 +#: ipam/forms/model_forms.py:270 ipam/forms/model_forms.py:279 +#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:368 ipam/tables/vlans.py:165 +#: templates/circuits/inc/circuit_termination.html:78 +#: templates/dcim/frontport.html:113 templates/dcim/interface.html:27 +#: templates/dcim/interface.html:190 templates/dcim/interface.html:322 +#: templates/dcim/inventoryitem_edit.html:54 templates/dcim/rearport.html:109 +#: templates/ipam/fhrpgroupassignment_edit.html:11 +#: templates/virtualization/vminterface.html:19 +#: templates/vpn/tunneltermination.html:32 +#: templates/wireless/inc/wirelesslink_interface.html:10 +#: templates/wireless/wirelesslink.html:10 +#: templates/wireless/wirelesslink.html:49 +#: virtualization/forms/model_forms.py:351 vpn/forms/bulk_import.py:292 +#: vpn/forms/model_forms.py:94 vpn/forms/model_forms.py:129 +#: vpn/forms/model_forms.py:241 vpn/forms/model_forms.py:430 +#: vpn/forms/model_forms.py:439 vpn/tables/tunnels.py:87 +#: wireless/forms/model_forms.py:112 wireless/forms/model_forms.py:152 +msgid "Interface" +msgstr "Interface" + +#: dcim/forms/model_forms.py:1278 +msgid "Child Device" +msgstr "Appareil pour enfants" + +#: dcim/forms/model_forms.py:1279 +msgid "" +"Child devices must first be created and assigned to the site and rack of the" +" parent device." +msgstr "" +"Les appareils enfants doivent d'abord être créés et affectés au site et au " +"rack de l'appareil parent." + +#: dcim/forms/model_forms.py:1321 +msgid "Console port" +msgstr "Port de console" + +#: dcim/forms/model_forms.py:1329 +msgid "Console server port" +msgstr "Port du serveur de console" + +#: dcim/forms/model_forms.py:1337 +msgid "Front port" +msgstr "Port avant" + +#: dcim/forms/model_forms.py:1353 +msgid "Power outlet" +msgstr "prise de courant" + +#: dcim/forms/model_forms.py:1373 templates/dcim/inventoryitem.html:17 +#: templates/dcim/inventoryitem_edit.html:10 +msgid "Inventory Item" +msgstr "Article d'inventaire" + +#: dcim/forms/model_forms.py:1425 +msgid "An InventoryItem can only be assigned to a single component." +msgstr "Un article d'inventaire ne peut être attribué qu'à un seul composant." + +#: dcim/forms/model_forms.py:1439 templates/dcim/inventoryitemrole.html:15 +msgid "Inventory Item Role" +msgstr "Rôle de l'article d'inventaire" + +#: dcim/forms/model_forms.py:1459 templates/dcim/device.html:195 +#: templates/dcim/virtualdevicecontext.html:33 +#: templates/virtualization/virtualmachine.html:51 +msgid "Primary IPv4" +msgstr "IPv4 principal" + +#: dcim/forms/model_forms.py:1468 templates/dcim/device.html:211 +#: templates/dcim/virtualdevicecontext.html:44 +#: templates/virtualization/virtualmachine.html:67 +msgid "Primary IPv6" +msgstr "IPv6 principal" + +#: dcim/forms/object_create.py:47 dcim/forms/object_create.py:198 +#: dcim/forms/object_create.py:354 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of objects being " +"created.)" +msgstr "" +"Les plages alphanumériques sont prises en charge. (Doit correspondre au " +"nombre d'objets en cours de création.)" + +#: dcim/forms/object_create.py:67 +#, python-brace-format +msgid "" +"The provided pattern specifies {value_count} values, but {pattern_count} are" +" expected." +msgstr "" +"Le modèle fourni spécifie {value_count} des valeurs, mais {pattern_count} " +"sont attendus." + +#: dcim/forms/object_create.py:109 dcim/forms/object_create.py:270 +#: dcim/tables/devices.py:281 +msgid "Rear ports" +msgstr "Ports arrière" + +#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 +msgid "Select one rear port assignment for each front port being created." +msgstr "" +"Sélectionnez une attribution de port arrière pour chaque port avant en cours" +" de création." + +#: dcim/forms/object_create.py:163 +#, python-brace-format +msgid "" +"The number of front port templates to be created ({frontport_count}) must " +"match the selected number of rear port positions ({rearport_count})." +msgstr "" +"Le nombre de modèles de port frontal à créer ({frontport_count}) doit " +"correspondre au nombre sélectionné de positions des ports arrière " +"({rearport_count})." + +#: dcim/forms/object_create.py:250 +#, python-brace-format +msgid "" +"The string {module} will be replaced with the position of the " +"assigned module, if any." +msgstr "" +"La ficelle {module} sera remplacé par la position du module " +"attribué, le cas échéant." + +#: dcim/forms/object_create.py:319 +#, python-brace-format +msgid "" +"The number of front ports to be created ({frontport_count}) must match the " +"selected number of rear port positions ({rearport_count})." +msgstr "" +"Le nombre de ports frontaux à créer ({frontport_count}) doit correspondre au" +" nombre sélectionné de positions des ports arrière ({rearport_count})." + +#: dcim/forms/object_create.py:408 dcim/tables/devices.py:1034 +#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:54 +#: templates/dcim/virtualchassis_edit.html:48 templates/ipam/fhrpgroup.html:39 +msgid "Members" +msgstr "Membres" + +#: dcim/forms/object_create.py:417 +msgid "Initial position" +msgstr "Position initiale" + +#: dcim/forms/object_create.py:420 +msgid "" +"Position of the first member device. Increases by one for each additional " +"member." +msgstr "" +"Position du premier dispositif membre. Augmente d'une unité pour chaque " +"membre supplémentaire." + +#: dcim/forms/object_create.py:434 +msgid "A position must be specified for the first VC member." +msgstr "Une position doit être spécifiée pour le premier membre du VC." + +#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 +#: dcim/models/device_components.py:63 extras/models/customfields.py:108 +msgid "label" +msgstr "étiquette" + +#: dcim/models/cables.py:71 +msgid "length" +msgstr "longueur" + +#: dcim/models/cables.py:78 +msgid "length unit" +msgstr "unité de longueur" + +#: dcim/models/cables.py:93 +msgid "cable" +msgstr "câble" + +#: dcim/models/cables.py:94 +msgid "cables" +msgstr "câbles" + +#: dcim/models/cables.py:190 +msgid "A and B terminations cannot connect to the same object." +msgstr "Les terminaisons A et B ne peuvent pas se connecter au même objet." + +#: dcim/models/cables.py:257 ipam/models/asns.py:37 +msgid "end" +msgstr "fin" + +#: dcim/models/cables.py:310 +msgid "cable termination" +msgstr "terminaison de câble" + +#: dcim/models/cables.py:311 +msgid "cable terminations" +msgstr "terminaisons de câble" + +#: dcim/models/cables.py:434 extras/models/configs.py:50 +msgid "is active" +msgstr "est actif" + +#: dcim/models/cables.py:438 +msgid "is complete" +msgstr "est terminé" + +#: dcim/models/cables.py:442 +msgid "is split" +msgstr "est divisé" + +#: dcim/models/cables.py:450 +msgid "cable path" +msgstr "chemin de câble" + +#: dcim/models/cables.py:451 +msgid "cable paths" +msgstr "chemins de câbles" + +#: dcim/models/device_component_templates.py:46 +#, python-brace-format +msgid "" +"{module} is accepted as a substitution for the module bay position when " +"attached to a module type." +msgstr "" +"{module} est accepté en remplacement de la position de la baie du module " +"lorsqu'il est fixé à un type de module." + +#: dcim/models/device_component_templates.py:58 +#: dcim/models/device_components.py:66 +msgid "Physical label" +msgstr "Etiquette physique" + +#: dcim/models/device_component_templates.py:103 +msgid "Component templates cannot be moved to a different device type." +msgstr "" +"Les modèles de composants ne peuvent pas être déplacés vers un autre type " +"d'appareil." + +#: dcim/models/device_component_templates.py:154 +msgid "" +"A component template cannot be associated with both a device type and a " +"module type." +msgstr "" +"Un modèle de composant ne peut pas être associé à la fois à un type " +"d'appareil et à un type de module." + +#: dcim/models/device_component_templates.py:158 +msgid "" +"A component template must be associated with either a device type or a " +"module type." +msgstr "" +"Un modèle de composant doit être associé à un type d'appareil ou à un type " +"de module." + +#: dcim/models/device_component_templates.py:186 +msgid "console port template" +msgstr "modèle de port de console" + +#: dcim/models/device_component_templates.py:187 +msgid "console port templates" +msgstr "modèles de ports de console" + +#: dcim/models/device_component_templates.py:220 +msgid "console server port template" +msgstr "modèle de port de serveur de console" + +#: dcim/models/device_component_templates.py:221 +msgid "console server port templates" +msgstr "modèles de ports de serveur de console" + +#: dcim/models/device_component_templates.py:252 +#: dcim/models/device_components.py:353 +msgid "maximum draw" +msgstr "tirage maximum" + +#: dcim/models/device_component_templates.py:259 +#: dcim/models/device_components.py:360 +msgid "allocated draw" +msgstr "tirage au sort alloué" + +#: dcim/models/device_component_templates.py:269 +msgid "power port template" +msgstr "modèle de port d'alimentation" + +#: dcim/models/device_component_templates.py:270 +msgid "power port templates" +msgstr "modèles de ports d'alimentation" + +#: dcim/models/device_component_templates.py:289 +#: dcim/models/device_components.py:383 +#, python-brace-format +msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." +msgstr "" +"Le tirage alloué ne peut pas dépasser le tirage maximum ({maximum_draw}W)." + +#: dcim/models/device_component_templates.py:321 +#: dcim/models/device_components.py:478 +msgid "feed leg" +msgstr "patte d'alimentation" + +#: dcim/models/device_component_templates.py:325 +#: dcim/models/device_components.py:482 +msgid "Phase (for three-phase feeds)" +msgstr "Phase (pour les alimentations triphasées)" + +#: dcim/models/device_component_templates.py:331 +msgid "power outlet template" +msgstr "modèle de prise de courant" + +#: dcim/models/device_component_templates.py:332 +msgid "power outlet templates" +msgstr "modèles de prises de courant" + +#: dcim/models/device_component_templates.py:341 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device type" +msgstr "" +"Port d'alimentation parent ({power_port}) doit appartenir au même type " +"d'appareil" + +#: dcim/models/device_component_templates.py:345 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same module type" +msgstr "" +"Port d'alimentation parent ({power_port}) doit appartenir au même type de " +"module" + +#: dcim/models/device_component_templates.py:397 +#: dcim/models/device_components.py:612 +msgid "management only" +msgstr "gestion uniquement" + +#: dcim/models/device_component_templates.py:405 +#: dcim/models/device_components.py:551 +msgid "bridge interface" +msgstr "interface de pont" + +#: dcim/models/device_component_templates.py:423 +#: dcim/models/device_components.py:637 +msgid "wireless role" +msgstr "rôle sans fil" + +#: dcim/models/device_component_templates.py:429 +msgid "interface template" +msgstr "modèle d'interface" + +#: dcim/models/device_component_templates.py:430 +msgid "interface templates" +msgstr "modèles d'interface" + +#: dcim/models/device_component_templates.py:437 +#: dcim/models/device_components.py:805 +#: virtualization/models/virtualmachines.py:398 +msgid "An interface cannot be bridged to itself." +msgstr "Une interface ne peut pas être reliée à elle-même." + +#: dcim/models/device_component_templates.py:440 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same device type" +msgstr "Interface de pont ({bridge}) doit appartenir au même type d'appareil" + +#: dcim/models/device_component_templates.py:444 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same module type" +msgstr "Interface de pont ({bridge}) doit appartenir au même type de module" + +#: dcim/models/device_component_templates.py:500 +#: dcim/models/device_components.py:985 +msgid "rear port position" +msgstr "position du port arrière" + +#: dcim/models/device_component_templates.py:525 +msgid "front port template" +msgstr "modèle de port avant" + +#: dcim/models/device_component_templates.py:526 +msgid "front port templates" +msgstr "modèles de port avant" + +#: dcim/models/device_component_templates.py:536 +#, python-brace-format +msgid "Rear port ({name}) must belong to the same device type" +msgstr "Port arrière ({name}) doit appartenir au même type d'appareil" + +#: dcim/models/device_component_templates.py:542 +#, python-brace-format +msgid "" +"Invalid rear port position ({position}); rear port {name} has only {count} " +"positions" +msgstr "" +"Position du port arrière non valide ({position}) ; port arrière {name} n'a " +"que {count} positions" + +#: dcim/models/device_component_templates.py:595 +#: dcim/models/device_components.py:1054 +msgid "positions" +msgstr "positions" + +#: dcim/models/device_component_templates.py:606 +msgid "rear port template" +msgstr "modèle de port arrière" + +#: dcim/models/device_component_templates.py:607 +msgid "rear port templates" +msgstr "modèles de port arrière" + +#: dcim/models/device_component_templates.py:636 +#: dcim/models/device_components.py:1095 +msgid "position" +msgstr "position" + +#: dcim/models/device_component_templates.py:639 +#: dcim/models/device_components.py:1098 +msgid "Identifier to reference when renaming installed components" +msgstr "" +"Identifiant à référencer lors du changement de nom des composants installés" + +#: dcim/models/device_component_templates.py:645 +msgid "module bay template" +msgstr "modèle de baie modulaire" + +#: dcim/models/device_component_templates.py:646 +msgid "module bay templates" +msgstr "modèles de baies de modules" + +#: dcim/models/device_component_templates.py:673 +msgid "device bay template" +msgstr "modèle de baie pour appareils" + +#: dcim/models/device_component_templates.py:674 +msgid "device bay templates" +msgstr "modèles de baies d'appareils" + +#: dcim/models/device_component_templates.py:687 +#, python-brace-format +msgid "" +"Subdevice role of device type ({device_type}) must be set to \"parent\" to " +"allow device bays." +msgstr "" +"Rôle du sous-appareil du type d'appareil ({device_type}) doit être défini " +"sur « parent » pour autoriser les baies de périphériques." + +#: dcim/models/device_component_templates.py:742 +#: dcim/models/device_components.py:1224 +msgid "part ID" +msgstr "ID de pièce" + +#: dcim/models/device_component_templates.py:744 +#: dcim/models/device_components.py:1226 +msgid "Manufacturer-assigned part identifier" +msgstr "Identifiant de pièce attribué par le fabricant" + +#: dcim/models/device_component_templates.py:761 +msgid "inventory item template" +msgstr "modèle d'article d'inventaire" + +#: dcim/models/device_component_templates.py:762 +msgid "inventory item templates" +msgstr "modèles d'articles d'inventaire" + +#: dcim/models/device_components.py:106 +msgid "Components cannot be moved to a different device." +msgstr "Les composants ne peuvent pas être déplacés vers un autre appareil." + +#: dcim/models/device_components.py:145 +msgid "cable end" +msgstr "extrémité du câble" + +#: dcim/models/device_components.py:151 +msgid "mark connected" +msgstr "marque connectée" + +#: dcim/models/device_components.py:153 +msgid "Treat as if a cable is connected" +msgstr "Traitez comme si un câble était connecté" + +#: dcim/models/device_components.py:171 +msgid "Must specify cable end (A or B) when attaching a cable." +msgstr "" +"Doit spécifier l'extrémité du câble (A ou B) lors de la fixation d'un câble." + +#: dcim/models/device_components.py:175 +msgid "Cable end must not be set without a cable." +msgstr "L'extrémité du câble ne doit pas être réglée sans câble." + +#: dcim/models/device_components.py:179 +msgid "Cannot mark as connected with a cable attached." +msgstr "Impossible de marquer comme connecté avec un câble branché." + +#: dcim/models/device_components.py:203 +#, python-brace-format +msgid "{class_name} models must declare a parent_object property" +msgstr "{class_name} les modèles doivent déclarer une propriété parent_object" + +#: dcim/models/device_components.py:288 dcim/models/device_components.py:317 +#: dcim/models/device_components.py:350 dcim/models/device_components.py:468 +msgid "Physical port type" +msgstr "Type de port physique" + +#: dcim/models/device_components.py:291 dcim/models/device_components.py:320 +msgid "speed" +msgstr "vitesse" + +#: dcim/models/device_components.py:295 dcim/models/device_components.py:324 +msgid "Port speed in bits per second" +msgstr "Vitesse du port en bits par seconde" + +#: dcim/models/device_components.py:301 +msgid "console port" +msgstr "port de console" + +#: dcim/models/device_components.py:302 +msgid "console ports" +msgstr "ports de console" + +#: dcim/models/device_components.py:330 +msgid "console server port" +msgstr "port du serveur de console" + +#: dcim/models/device_components.py:331 +msgid "console server ports" +msgstr "ports du serveur de console" + +#: dcim/models/device_components.py:370 +msgid "power port" +msgstr "port d'alimentation" + +#: dcim/models/device_components.py:371 +msgid "power ports" +msgstr "ports d'alimentation" + +#: dcim/models/device_components.py:488 +msgid "power outlet" +msgstr "prise de courant" + +#: dcim/models/device_components.py:489 +msgid "power outlets" +msgstr "prises de courant" + +#: dcim/models/device_components.py:500 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device" +msgstr "" +"Port d'alimentation parent ({power_port}) doit appartenir au même appareil" + +#: dcim/models/device_components.py:531 vpn/models/crypto.py:81 +#: vpn/models/crypto.py:214 +msgid "mode" +msgstr "mode" + +#: dcim/models/device_components.py:535 +msgid "IEEE 802.1Q tagging strategy" +msgstr "Stratégie de marquage IEEE 802.1Q" + +#: dcim/models/device_components.py:543 +msgid "parent interface" +msgstr "interface parente" + +#: dcim/models/device_components.py:603 +msgid "parent LAG" +msgstr "GAL parent" + +#: dcim/models/device_components.py:613 +msgid "This interface is used only for out-of-band management" +msgstr "Cette interface est utilisée uniquement pour la gestion hors bande" + +#: dcim/models/device_components.py:618 +msgid "speed (Kbps)" +msgstr "vitesse (Kbps)" + +#: dcim/models/device_components.py:621 +msgid "duplex" +msgstr "duplex" + +#: dcim/models/device_components.py:631 +msgid "64-bit World Wide Name" +msgstr "Nom mondial 64 bits" + +#: dcim/models/device_components.py:643 +msgid "wireless channel" +msgstr "canal sans fil" + +#: dcim/models/device_components.py:650 +msgid "channel frequency (MHz)" +msgstr "fréquence du canal (MHz)" + +#: dcim/models/device_components.py:651 dcim/models/device_components.py:659 +msgid "Populated by selected channel (if set)" +msgstr "Rempli par la chaîne sélectionnée (si définie)" + +#: dcim/models/device_components.py:665 +msgid "transmit power (dBm)" +msgstr "puissance de transmission (dBm)" + +#: dcim/models/device_components.py:690 wireless/models.py:116 +msgid "wireless LANs" +msgstr "réseaux locaux sans fil" + +#: dcim/models/device_components.py:698 +#: virtualization/models/virtualmachines.py:328 +msgid "untagged VLAN" +msgstr "VLAN non balisé" + +#: dcim/models/device_components.py:704 +#: virtualization/models/virtualmachines.py:334 +msgid "tagged VLANs" +msgstr "VLAN étiquetés" + +#: dcim/models/device_components.py:746 +#: virtualization/models/virtualmachines.py:370 +msgid "interface" +msgstr "interface" + +#: dcim/models/device_components.py:747 +#: virtualization/models/virtualmachines.py:371 +msgid "interfaces" +msgstr "interfaces" + +#: dcim/models/device_components.py:758 +#, python-brace-format +msgid "{display_type} interfaces cannot have a cable attached." +msgstr "" +"{display_type} les interfaces ne peuvent pas être connectées à un câble." + +#: dcim/models/device_components.py:766 +#, python-brace-format +msgid "{display_type} interfaces cannot be marked as connected." +msgstr "" +"{display_type} les interfaces ne peuvent pas être marquées comme connectées." + +#: dcim/models/device_components.py:775 +#: virtualization/models/virtualmachines.py:383 +msgid "An interface cannot be its own parent." +msgstr "Une interface ne peut pas être son propre parent." + +#: dcim/models/device_components.py:779 +msgid "Only virtual interfaces may be assigned to a parent interface." +msgstr "" +"Seules les interfaces virtuelles peuvent être attribuées à une interface " +"parent." + +#: dcim/models/device_components.py:786 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to a different device " +"({device})" +msgstr "" +"L'interface parent sélectionnée ({interface}) appartient à un autre appareil" +" ({device})" + +#: dcim/models/device_components.py:792 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" +"L'interface parent sélectionnée ({interface}) appartient à {device}, qui ne " +"fait pas partie du châssis virtuel {virtual_chassis}." + +#: dcim/models/device_components.py:812 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different device " +"({device})." +msgstr "" +"L'interface de pont sélectionnée ({bridge}) appartient à un autre appareil " +"({device})." + +#: dcim/models/device_components.py:818 +#, python-brace-format +msgid "" +"The selected bridge interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" +"L'interface de pont sélectionnée ({interface}) appartient à {device}, qui ne" +" fait pas partie du châssis virtuel {virtual_chassis}." + +#: dcim/models/device_components.py:829 +msgid "Virtual interfaces cannot have a parent LAG interface." +msgstr "" +"Les interfaces virtuelles ne peuvent pas avoir d'interface LAG parente." + +#: dcim/models/device_components.py:833 +msgid "A LAG interface cannot be its own parent." +msgstr "Une interface LAG ne peut pas être son propre parent." + +#: dcim/models/device_components.py:840 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to a different device ({device})." +msgstr "" +"L'interface LAG sélectionnée ({lag}) appartient à un autre appareil " +"({device})." + +#: dcim/models/device_components.py:846 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to {device}, which is not part of" +" virtual chassis {virtual_chassis}." +msgstr "" +"L'interface LAG sélectionnée ({lag}) appartient à {device}, qui ne fait pas " +"partie du châssis virtuel {virtual_chassis}." + +#: dcim/models/device_components.py:857 +msgid "Virtual interfaces cannot have a PoE mode." +msgstr "Les interfaces virtuelles ne peuvent pas avoir de mode PoE." + +#: dcim/models/device_components.py:861 +msgid "Virtual interfaces cannot have a PoE type." +msgstr "Les interfaces virtuelles ne peuvent pas avoir de type PoE." + +#: dcim/models/device_components.py:867 +msgid "Must specify PoE mode when designating a PoE type." +msgstr "Doit spécifier le mode PoE lors de la désignation d'un type de PoE." + +#: dcim/models/device_components.py:874 +msgid "Wireless role may be set only on wireless interfaces." +msgstr "Le rôle sans fil ne peut être défini que sur les interfaces sans fil." + +#: dcim/models/device_components.py:876 +msgid "Channel may be set only on wireless interfaces." +msgstr "Le canal ne peut être défini que sur les interfaces sans fil." + +#: dcim/models/device_components.py:882 +msgid "Channel frequency may be set only on wireless interfaces." +msgstr "" +"La fréquence des canaux ne peut être réglée que sur les interfaces sans fil." + +#: dcim/models/device_components.py:886 +msgid "Cannot specify custom frequency with channel selected." +msgstr "" +"Impossible de spécifier une fréquence personnalisée avec le canal " +"sélectionné." + +#: dcim/models/device_components.py:892 +msgid "Channel width may be set only on wireless interfaces." +msgstr "" +"La largeur de canal ne peut être réglée que sur les interfaces sans fil." + +#: dcim/models/device_components.py:894 +msgid "Cannot specify custom width with channel selected." +msgstr "" +"Impossible de spécifier une largeur personnalisée avec le canal sélectionné." + +#: dcim/models/device_components.py:902 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent device, or it must be global." +msgstr "" +"Le VLAN non balisé ({untagged_vlan}) doit appartenir au même site que " +"l'appareil parent de l'interface, ou il doit être global." + +#: dcim/models/device_components.py:991 +msgid "Mapped position on corresponding rear port" +msgstr "Position cartographiée sur le port arrière correspondant" + +#: dcim/models/device_components.py:1007 +msgid "front port" +msgstr "port avant" + +#: dcim/models/device_components.py:1008 +msgid "front ports" +msgstr "ports avant" + +#: dcim/models/device_components.py:1022 +#, python-brace-format +msgid "Rear port ({rear_port}) must belong to the same device" +msgstr "Port arrière ({rear_port}) doit appartenir au même appareil" + +#: dcim/models/device_components.py:1030 +#, python-brace-format +msgid "" +"Invalid rear port position ({rear_port_position}): Rear port {name} has only" +" {positions} positions." +msgstr "" +"Position du port arrière non valide ({rear_port_position}) : Port arrière " +"{name} n'a que {positions} positions." + +#: dcim/models/device_components.py:1060 +msgid "Number of front ports which may be mapped" +msgstr "Nombre de ports frontaux pouvant être mappés" + +#: dcim/models/device_components.py:1065 +msgid "rear port" +msgstr "port arrière" + +#: dcim/models/device_components.py:1066 +msgid "rear ports" +msgstr "ports arrière" + +#: dcim/models/device_components.py:1080 +#, python-brace-format +msgid "" +"The number of positions cannot be less than the number of mapped front ports" +" ({frontport_count})" +msgstr "" +"Le nombre de positions ne peut pas être inférieur au nombre de ports " +"frontaux mappés ({frontport_count})" + +#: dcim/models/device_components.py:1104 +msgid "module bay" +msgstr "baie modulaire" + +#: dcim/models/device_components.py:1105 +msgid "module bays" +msgstr "baies de modules" + +#: dcim/models/device_components.py:1118 +msgid "parent_bay" +msgstr "parent_bay" + +#: dcim/models/device_components.py:1126 +msgid "device bay" +msgstr "baie pour appareils" + +#: dcim/models/device_components.py:1127 +msgid "device bays" +msgstr "baies pour appareils" + +#: dcim/models/device_components.py:1137 +#, python-brace-format +msgid "This type of device ({device_type}) does not support device bays." +msgstr "" +"Ce type d'appareil ({device_type}) ne prend pas en charge les baies pour " +"appareils." + +#: dcim/models/device_components.py:1143 +msgid "Cannot install a device into itself." +msgstr "Impossible d'installer un appareil sur lui-même." + +#: dcim/models/device_components.py:1151 +#, python-brace-format +msgid "" +"Cannot install the specified device; device is already installed in {bay}." +msgstr "" +"Impossible d'installer le périphérique spécifié ; le périphérique est déjà " +"installé dans {bay}." + +#: dcim/models/device_components.py:1172 +msgid "inventory item role" +msgstr "rôle des articles d'inventaire" + +#: dcim/models/device_components.py:1173 +msgid "inventory item roles" +msgstr "rôles des articles d'inventaire" + +#: dcim/models/device_components.py:1230 dcim/models/devices.py:595 +#: dcim/models/devices.py:1173 dcim/models/racks.py:113 +msgid "serial number" +msgstr "numéro de série" + +#: dcim/models/device_components.py:1238 dcim/models/devices.py:603 +#: dcim/models/devices.py:1180 dcim/models/racks.py:120 +msgid "asset tag" +msgstr "étiquette d'actif" + +#: dcim/models/device_components.py:1239 +msgid "A unique tag used to identify this item" +msgstr "Une étiquette unique utilisée pour identifier cet article" + +#: dcim/models/device_components.py:1242 +msgid "discovered" +msgstr "découvert" + +#: dcim/models/device_components.py:1244 +msgid "This item was automatically discovered" +msgstr "Cet objet a été découvert automatiquement" + +#: dcim/models/device_components.py:1262 +msgid "inventory item" +msgstr "article d'inventaire" + +#: dcim/models/device_components.py:1263 +msgid "inventory items" +msgstr "articles d'inventaire" + +#: dcim/models/device_components.py:1274 +msgid "Cannot assign self as parent." +msgstr "Impossible de s'attribuer le statut de parent." + +#: dcim/models/device_components.py:1282 +msgid "Parent inventory item does not belong to the same device." +msgstr "L'article d'inventaire parent n'appartient pas au même appareil." + +#: dcim/models/device_components.py:1288 +msgid "Cannot move an inventory item with dependent children" +msgstr "Impossible de déplacer un article en stock avec des enfants à charge" + +#: dcim/models/device_components.py:1296 +msgid "Cannot assign inventory item to component on another device" +msgstr "" +"Impossible d'attribuer un article d'inventaire à un composant sur un autre " +"appareil" + +#: dcim/models/devices.py:54 +msgid "manufacturer" +msgstr "fabricant" + +#: dcim/models/devices.py:55 +msgid "manufacturers" +msgstr "fabricants" + +#: dcim/models/devices.py:82 dcim/models/devices.py:381 +msgid "model" +msgstr "modèle" + +#: dcim/models/devices.py:95 +msgid "default platform" +msgstr "plateforme par défaut" + +#: dcim/models/devices.py:98 dcim/models/devices.py:385 +msgid "part number" +msgstr "numéro de pièce" + +#: dcim/models/devices.py:101 dcim/models/devices.py:388 +msgid "Discrete part number (optional)" +msgstr "Numéro de pièce discret (facultatif)" + +#: dcim/models/devices.py:107 dcim/models/racks.py:137 +msgid "height (U)" +msgstr "hauteur (U)" + +#: dcim/models/devices.py:111 +msgid "exclude from utilization" +msgstr "exclure de l'utilisation" + +#: dcim/models/devices.py:112 +msgid "Devices of this type are excluded when calculating rack utilization." +msgstr "" +"Les appareils de ce type sont exclus du calcul de l'utilisation des racks." + +#: dcim/models/devices.py:116 +msgid "is full depth" +msgstr "est en pleine profondeur" + +#: dcim/models/devices.py:117 +msgid "Device consumes both front and rear rack faces." +msgstr "L'appareil consomme à la fois les faces avant et arrière du châssis." + +#: dcim/models/devices.py:123 +msgid "parent/child status" +msgstr "statut parent/enfant" + +#: dcim/models/devices.py:124 +msgid "" +"Parent devices house child devices in device bays. Leave blank if this " +"device type is neither a parent nor a child." +msgstr "" +"Les appareils parents hébergent les appareils des enfants dans des baies " +"pour appareils. Laissez ce champ vide si ce type d'appareil n'est ni un " +"parent ni un enfant." + +#: dcim/models/devices.py:128 dcim/models/devices.py:647 +msgid "airflow" +msgstr "débit d'air" + +#: dcim/models/devices.py:204 +msgid "device type" +msgstr "type d'appareil" + +#: dcim/models/devices.py:205 +msgid "device types" +msgstr "types d'appareils" + +#: dcim/models/devices.py:289 +msgid "U height must be in increments of 0.5 rack units." +msgstr "" +"La hauteur en U doit être exprimée par incréments de 0,5 unité de rack." + +#: dcim/models/devices.py:306 +#, python-brace-format +msgid "" +"Device {device} in rack {rack} does not have sufficient space to accommodate" +" a height of {height}U" +msgstr "" +"Appareil {device} en rack {rack} ne dispose pas de suffisamment d'espace " +"pour accueillir une hauteur de {height}U" + +#: dcim/models/devices.py:321 +#, python-brace-format +msgid "" +"Unable to set 0U height: Found {racked_instance_count} " +"instances already mounted within racks." +msgstr "" +"Impossible de définir la hauteur 0U : trouvé {racked_instance_count} les instances déjà monté dans des" +" racks." + +#: dcim/models/devices.py:330 +msgid "" +"Must delete all device bay templates associated with this device before " +"declassifying it as a parent device." +msgstr "" +"Vous devez supprimer tous les modèles de baies d'appareils associés à cet " +"appareil avant de le déclassifier en tant qu'appareil parent." + +#: dcim/models/devices.py:336 +msgid "Child device types must be 0U." +msgstr "Les types d'appareils pour enfants doivent être 0U." + +#: dcim/models/devices.py:404 +msgid "module type" +msgstr "type de module" + +#: dcim/models/devices.py:405 +msgid "module types" +msgstr "types de modules" + +#: dcim/models/devices.py:473 +msgid "Virtual machines may be assigned to this role" +msgstr "Des machines virtuelles peuvent être affectées à ce rôle" + +#: dcim/models/devices.py:485 +msgid "device role" +msgstr "rôle de l'appareil" + +#: dcim/models/devices.py:486 +msgid "device roles" +msgstr "rôles des appareils" + +#: dcim/models/devices.py:503 +msgid "Optionally limit this platform to devices of a certain manufacturer" +msgstr "" +"Limitez éventuellement cette plate-forme aux appareils d'un certain " +"fabricant" + +#: dcim/models/devices.py:515 +msgid "platform" +msgstr "plateforme" + +#: dcim/models/devices.py:516 +msgid "platforms" +msgstr "plateformes" + +#: dcim/models/devices.py:564 +msgid "The function this device serves" +msgstr "La fonction de cet appareil" + +#: dcim/models/devices.py:596 +msgid "Chassis serial number, assigned by the manufacturer" +msgstr "Numéro de série du châssis, attribué par le fabricant" + +#: dcim/models/devices.py:604 dcim/models/devices.py:1181 +msgid "A unique tag used to identify this device" +msgstr "Un tag unique utilisé pour identifier cet appareil" + +#: dcim/models/devices.py:631 +msgid "position (U)" +msgstr "position (U)" + +#: dcim/models/devices.py:638 +msgid "rack face" +msgstr "face du rack" + +#: dcim/models/devices.py:658 dcim/models/devices.py:1390 +#: virtualization/models/virtualmachines.py:98 +msgid "primary IPv4" +msgstr "IPv4 principal" + +#: dcim/models/devices.py:666 dcim/models/devices.py:1398 +#: virtualization/models/virtualmachines.py:106 +msgid "primary IPv6" +msgstr "IPv6 principal" + +#: dcim/models/devices.py:674 +msgid "out-of-band IP" +msgstr "IP hors bande" + +#: dcim/models/devices.py:691 +msgid "VC position" +msgstr "Position en VC" + +#: dcim/models/devices.py:695 +msgid "Virtual chassis position" +msgstr "Position virtuelle du châssis" + +#: dcim/models/devices.py:698 +msgid "VC priority" +msgstr "Priorité VC" + +#: dcim/models/devices.py:702 +msgid "Virtual chassis master election priority" +msgstr "Priorité d'élection principale du châssis virtuel" + +#: dcim/models/devices.py:705 dcim/models/sites.py:207 +msgid "latitude" +msgstr "latitude" + +#: dcim/models/devices.py:710 dcim/models/devices.py:718 +#: dcim/models/sites.py:212 dcim/models/sites.py:220 +msgid "GPS coordinate in decimal format (xx.yyyyyy)" +msgstr "Coordonnées GPS au format décimal (xx.yyyyyy)" + +#: dcim/models/devices.py:713 dcim/models/sites.py:215 +msgid "longitude" +msgstr "longitude" + +#: dcim/models/devices.py:786 +msgid "Device name must be unique per site." +msgstr "Le nom de l'appareil doit être unique par site." + +#: dcim/models/devices.py:797 ipam/models/services.py:75 +msgid "device" +msgstr "appareil" + +#: dcim/models/devices.py:798 +msgid "devices" +msgstr "appareils" + +#: dcim/models/devices.py:838 +#, python-brace-format +msgid "Rack {rack} does not belong to site {site}." +msgstr "Étagère {rack} n'appartient pas au site {site}." + +#: dcim/models/devices.py:843 +#, python-brace-format +msgid "Location {location} does not belong to site {site}." +msgstr "Emplacement {location} n'appartient pas au site {site}." + +#: dcim/models/devices.py:849 +#, python-brace-format +msgid "Rack {rack} does not belong to location {location}." +msgstr "Étagère {rack} n'appartient pas au lieu {location}." + +#: dcim/models/devices.py:856 +msgid "Cannot select a rack face without assigning a rack." +msgstr "Impossible de sélectionner une face de rack sans attribuer un rack." + +#: dcim/models/devices.py:860 +msgid "Cannot select a rack position without assigning a rack." +msgstr "" +"Impossible de sélectionner une position de rack sans attribuer un rack." + +#: dcim/models/devices.py:866 +msgid "Position must be in increments of 0.5 rack units." +msgstr "La position doit être exprimée par incréments de 0,5 unité de rack." + +#: dcim/models/devices.py:870 +msgid "Must specify rack face when defining rack position." +msgstr "" +"Doit spécifier la face du rack lors de la définition de la position du rack." + +#: dcim/models/devices.py:878 +#, python-brace-format +msgid "" +"A U0 device type ({device_type}) cannot be assigned to a rack position." +msgstr "" +"Un type d'appareil U0 ({device_type}) ne peut pas être affecté à une " +"position de rack." + +#: dcim/models/devices.py:889 +msgid "" +"Child device types cannot be assigned to a rack face. This is an attribute " +"of the parent device." +msgstr "" +"Les types d'appareils pour enfants ne peuvent pas être attribués à une face " +"de rack. Il s'agit d'un attribut de l'appareil parent." + +#: dcim/models/devices.py:896 +msgid "" +"Child device types cannot be assigned to a rack position. This is an " +"attribute of the parent device." +msgstr "" +"Les types d'appareils pour enfants ne peuvent pas être affectés à une " +"position en rack. Il s'agit d'un attribut de l'appareil parent." + +#: dcim/models/devices.py:910 +#, python-brace-format +msgid "" +"U{position} is already occupied or does not have sufficient space to " +"accommodate this device type: {device_type} ({u_height}U)" +msgstr "" +"U{position} est déjà occupé ou ne dispose pas de suffisamment d'espace pour " +"accueillir ce type d'appareil : {device_type} ({u_height}U)" + +#: dcim/models/devices.py:925 +#, python-brace-format +msgid "{ip} is not an IPv4 address." +msgstr "{ip} n'est pas une adresse IPv4." + +#: dcim/models/devices.py:934 dcim/models/devices.py:949 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this device." +msgstr "L'adresse IP spécifiée ({ip}) n'est pas attribué à cet appareil." + +#: dcim/models/devices.py:940 +#, python-brace-format +msgid "{ip} is not an IPv6 address." +msgstr "{ip} n'est pas une adresse IPv6." + +#: dcim/models/devices.py:967 +#, python-brace-format +msgid "" +"The assigned platform is limited to {platform_manufacturer} device types, " +"but this device's type belongs to {devicetype_manufacturer}." +msgstr "" +"La plateforme attribuée est limitée à {platform_manufacturer} types " +"d'appareils, mais le type de cet appareil appartient à " +"{devicetype_manufacturer}." + +#: dcim/models/devices.py:978 +#, python-brace-format +msgid "The assigned cluster belongs to a different site ({site})" +msgstr "Le cluster attribué appartient à un autre site ({site})" + +#: dcim/models/devices.py:986 +msgid "A device assigned to a virtual chassis must have its position defined." +msgstr "" +"La position d'un appareil affecté à un châssis virtuel doit être définie." + +#: dcim/models/devices.py:1188 +msgid "module" +msgstr "module" + +#: dcim/models/devices.py:1189 +msgid "modules" +msgstr "modules" + +#: dcim/models/devices.py:1205 +#, python-brace-format +msgid "" +"Module must be installed within a module bay belonging to the assigned " +"device ({device})." +msgstr "" +"Le module doit être installé dans une baie de modules appartenant au " +"périphérique attribué ({device})." + +#: dcim/models/devices.py:1309 +msgid "domain" +msgstr "domaine" + +#: dcim/models/devices.py:1322 dcim/models/devices.py:1323 +msgid "virtual chassis" +msgstr "châssis virtuel" + +#: dcim/models/devices.py:1338 +#, python-brace-format +msgid "" +"The selected master ({master}) is not assigned to this virtual chassis." +msgstr "" +"Le master sélectionné ({master}) n'est pas attribué à ce châssis virtuel." + +#: dcim/models/devices.py:1354 +#, python-brace-format +msgid "" +"Unable to delete virtual chassis {self}. There are member interfaces which " +"form a cross-chassis LAG interfaces." +msgstr "" +"Impossible de supprimer le châssis virtuel {self}. Il existe des interfaces " +"membres qui forment des interfaces LAG inter-châssis." + +#: dcim/models/devices.py:1379 vpn/models/l2vpn.py:37 +msgid "identifier" +msgstr "identificateur" + +#: dcim/models/devices.py:1380 +msgid "Numeric identifier unique to the parent device" +msgstr "Identifiant numérique propre à l'appareil parent" + +#: dcim/models/devices.py:1408 extras/models/models.py:129 +#: extras/models/models.py:724 netbox/models/__init__.py:114 +msgid "comments" +msgstr "commentaires" + +#: dcim/models/devices.py:1424 +msgid "virtual device context" +msgstr "contexte du périphérique virtuel" + +#: dcim/models/devices.py:1425 +msgid "virtual device contexts" +msgstr "contextes de périphériques virtuels" + +#: dcim/models/devices.py:1457 +#, python-brace-format +msgid "{ip} is not an IPv{family} address." +msgstr "{ip} n'est pas un IPV{family} adresse." + +#: dcim/models/devices.py:1463 +msgid "Primary IP address must belong to an interface on the assigned device." +msgstr "" +"L'adresse IP principale doit appartenir à une interface sur l'appareil " +"attribué." + +#: dcim/models/mixins.py:15 extras/models/configs.py:41 +#: extras/models/models.py:343 extras/models/models.py:552 +#: extras/models/search.py:50 ipam/models/ip.py:193 +msgid "weight" +msgstr "poids" + +#: dcim/models/mixins.py:22 +msgid "weight unit" +msgstr "unité de poids" + +#: dcim/models/mixins.py:51 +msgid "Must specify a unit when setting a weight" +msgstr "Doit spécifier une unité lors de la définition d'un poids" + +#: dcim/models/power.py:55 +msgid "power panel" +msgstr "panneau d'alimentation" + +#: dcim/models/power.py:56 +msgid "power panels" +msgstr "panneaux d'alimentation" + +#: dcim/models/power.py:70 +#, python-brace-format +msgid "" +"Location {location} ({location_site}) is in a different site than {site}" +msgstr "" +"Emplacement {location} ({location_site}) se trouve sur un site différent de " +"{site}" + +#: dcim/models/power.py:107 +msgid "supply" +msgstr "fourniture" + +#: dcim/models/power.py:113 +msgid "phase" +msgstr "phase" + +#: dcim/models/power.py:119 +msgid "voltage" +msgstr "tension" + +#: dcim/models/power.py:124 +msgid "amperage" +msgstr "ampérage" + +#: dcim/models/power.py:129 +msgid "max utilization" +msgstr "utilisation maximale" + +#: dcim/models/power.py:132 +msgid "Maximum permissible draw (percentage)" +msgstr "Tirage maximum autorisé (pourcentage)" + +#: dcim/models/power.py:135 +msgid "available power" +msgstr "puissance disponible" + +#: dcim/models/power.py:163 +msgid "power feed" +msgstr "alimentation" + +#: dcim/models/power.py:164 +msgid "power feeds" +msgstr "alimentations" + +#: dcim/models/power.py:178 +#, python-brace-format +msgid "" +"Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " +"are in different sites." +msgstr "" +"Étagère {rack} ({rack_site}) et panneau d'alimentation {powerpanel} " +"({powerpanel_site}) se trouvent sur des sites différents." + +#: dcim/models/power.py:189 +msgid "Voltage cannot be negative for AC supply" +msgstr "" +"La tension ne peut pas être négative pour l'alimentation en courant " +"alternatif" + +#: dcim/models/racks.py:49 +msgid "rack role" +msgstr "rôle de rack" + +#: dcim/models/racks.py:50 +msgid "rack roles" +msgstr "rôles de rack" + +#: dcim/models/racks.py:74 +msgid "facility ID" +msgstr "ID de l'établissement" + +#: dcim/models/racks.py:75 +msgid "Locally-assigned identifier" +msgstr "Identifiant attribué localement" + +#: dcim/models/racks.py:108 ipam/forms/bulk_import.py:200 +#: ipam/forms/bulk_import.py:265 ipam/forms/bulk_import.py:300 +#: ipam/forms/bulk_import.py:467 virtualization/forms/bulk_import.py:112 +msgid "Functional role" +msgstr "Rôle fonctionnel" + +#: dcim/models/racks.py:121 +msgid "A unique tag used to identify this rack" +msgstr "Une étiquette unique utilisée pour identifier ce rack" + +#: dcim/models/racks.py:132 +msgid "width" +msgstr "largeur" + +#: dcim/models/racks.py:133 +msgid "Rail-to-rail width" +msgstr "Largeur rail à rail" + +#: dcim/models/racks.py:139 +msgid "Height in rack units" +msgstr "Hauteur en unités de rayonnage" + +#: dcim/models/racks.py:143 +msgid "starting unit" +msgstr "unité de départ" + +#: dcim/models/racks.py:145 +msgid "Starting unit for rack" +msgstr "Unité de départ pour rack" + +#: dcim/models/racks.py:149 +msgid "descending units" +msgstr "unités décroissantes" + +#: dcim/models/racks.py:150 +msgid "Units are numbered top-to-bottom" +msgstr "Les unités sont numérotées de haut en bas" + +#: dcim/models/racks.py:153 +msgid "outer width" +msgstr "largeur extérieure" + +#: dcim/models/racks.py:156 +msgid "Outer dimension of rack (width)" +msgstr "Dimension extérieure du rack (largeur)" + +#: dcim/models/racks.py:159 +msgid "outer depth" +msgstr "profondeur extérieure" + +#: dcim/models/racks.py:162 +msgid "Outer dimension of rack (depth)" +msgstr "Dimension extérieure du rack (profondeur)" + +#: dcim/models/racks.py:165 +msgid "outer unit" +msgstr "unité extérieure" + +#: dcim/models/racks.py:171 +msgid "max weight" +msgstr "poids maximum" + +#: dcim/models/racks.py:174 +msgid "Maximum load capacity for the rack" +msgstr "Capacité de charge maximale du rack" + +#: dcim/models/racks.py:182 +msgid "mounting depth" +msgstr "profondeur de montage" + +#: dcim/models/racks.py:186 +msgid "" +"Maximum depth of a mounted device, in millimeters. For four-post racks, this" +" is the distance between the front and rear rails." +msgstr "" +"Profondeur maximale d'un appareil monté, en millimètres. Pour les supports à" +" quatre montants, il s'agit de la distance entre les rails avant et arrière." + +#: dcim/models/racks.py:220 +msgid "rack" +msgstr "rack" + +#: dcim/models/racks.py:221 +msgid "racks" +msgstr "étagères" + +#: dcim/models/racks.py:236 +#, python-brace-format +msgid "Assigned location must belong to parent site ({site})." +msgstr "L'emplacement attribué doit appartenir au site parent ({site})." + +#: dcim/models/racks.py:240 +msgid "Must specify a unit when setting an outer width/depth" +msgstr "" +"Doit spécifier une unité lors du réglage d'une largeur/profondeur extérieure" + +#: dcim/models/racks.py:244 +msgid "Must specify a unit when setting a maximum weight" +msgstr "Doit spécifier une unité lors de la définition d'un poids maximum" + +#: dcim/models/racks.py:254 +#, python-brace-format +msgid "" +"Rack must be at least {min_height}U tall to house currently installed " +"devices." +msgstr "" +"Le rack doit être au moins {min_height}Je parle pour héberger les appareils " +"actuellement installés." + +#: dcim/models/racks.py:261 +#, python-brace-format +msgid "" +"Rack unit numbering must begin at {position} or less to house currently " +"installed devices." +msgstr "" +"La numérotation des unités de rayonnage doit commencer à {position} ou moins" +" pour héberger les appareils actuellement installés." + +#: dcim/models/racks.py:269 +#, python-brace-format +msgid "Location must be from the same site, {site}." +msgstr "L'emplacement doit provenir du même site, {site}." + +#: dcim/models/racks.py:522 +msgid "units" +msgstr "des unités" + +#: dcim/models/racks.py:548 +msgid "rack reservation" +msgstr "réservation de rayonnages" + +#: dcim/models/racks.py:549 +msgid "rack reservations" +msgstr "réservations de racks" + +#: dcim/models/racks.py:566 +#, python-brace-format +msgid "Invalid unit(s) for {height}U rack: {unit_list}" +msgstr "Unité (s) non valide (s) pour {height}Étagère en U : {unit_list}" + +#: dcim/models/racks.py:579 +#, python-brace-format +msgid "The following units have already been reserved: {unit_list}" +msgstr "Les unités suivantes ont déjà été réservées : {unit_list}" + +#: dcim/models/sites.py:49 +msgid "A top-level region with this name already exists." +msgstr "Une région de niveau supérieur portant ce nom existe déjà." + +#: dcim/models/sites.py:59 +msgid "A top-level region with this slug already exists." +msgstr "Une région de niveau supérieur contenant cette limace existe déjà." + +#: dcim/models/sites.py:62 +msgid "region" +msgstr "région" + +#: dcim/models/sites.py:63 +msgid "regions" +msgstr "régions" + +#: dcim/models/sites.py:102 +msgid "A top-level site group with this name already exists." +msgstr "Un groupe de sites de niveau supérieur portant ce nom existe déjà." + +#: dcim/models/sites.py:112 +msgid "A top-level site group with this slug already exists." +msgstr "Un groupe de sites de niveau supérieur contenant ce slug existe déjà." + +#: dcim/models/sites.py:115 +msgid "site group" +msgstr "groupe de sites" + +#: dcim/models/sites.py:116 +msgid "site groups" +msgstr "groupes de sites" + +#: dcim/models/sites.py:141 +msgid "Full name of the site" +msgstr "Nom complet du site" + +#: dcim/models/sites.py:181 +msgid "facility" +msgstr "installation" + +#: dcim/models/sites.py:184 +msgid "Local facility ID or description" +msgstr "Identifiant ou description de l'établissement local" + +#: dcim/models/sites.py:195 +msgid "physical address" +msgstr "adresse physique" + +#: dcim/models/sites.py:198 +msgid "Physical location of the building" +msgstr "Emplacement physique du bâtiment" + +#: dcim/models/sites.py:201 +msgid "shipping address" +msgstr "adresse de livraison" + +#: dcim/models/sites.py:204 +msgid "If different from the physical address" +msgstr "Si elle est différente de l'adresse physique" + +#: dcim/models/sites.py:238 +msgid "site" +msgstr "site" + +#: dcim/models/sites.py:239 +msgid "sites" +msgstr "sites" + +#: dcim/models/sites.py:303 +msgid "A location with this name already exists within the specified site." +msgstr "Un emplacement portant ce nom existe déjà au sein du site spécifié." + +#: dcim/models/sites.py:313 +msgid "A location with this slug already exists within the specified site." +msgstr "Un emplacement contenant ce slug existe déjà dans le site spécifié." + +#: dcim/models/sites.py:316 +msgid "location" +msgstr "emplacement" + +#: dcim/models/sites.py:317 +msgid "locations" +msgstr "les lieux" + +#: dcim/models/sites.py:331 +#, python-brace-format +msgid "Parent location ({parent}) must belong to the same site ({site})." +msgstr "" +"Lieu de résidence du parent ({parent}) doit appartenir au même site " +"({site})." + +#: dcim/tables/cables.py:54 +msgid "Termination A" +msgstr "Résiliation A" + +#: dcim/tables/cables.py:59 +msgid "Termination B" +msgstr "Résiliation B" + +#: dcim/tables/cables.py:65 wireless/tables/wirelesslink.py:22 +msgid "Device A" +msgstr "Appareil A" + +#: dcim/tables/cables.py:71 wireless/tables/wirelesslink.py:31 +msgid "Device B" +msgstr "Appareil B" + +#: dcim/tables/cables.py:77 +msgid "Location A" +msgstr "Lieu A" + +#: dcim/tables/cables.py:83 +msgid "Location B" +msgstr "Lieu B" + +#: dcim/tables/cables.py:89 +msgid "Rack A" +msgstr "Étagère A" + +#: dcim/tables/cables.py:95 +msgid "Rack B" +msgstr "Étagère B" + +#: dcim/tables/cables.py:101 +msgid "Site A" +msgstr "Site A" + +#: dcim/tables/cables.py:107 +msgid "Site B" +msgstr "Site B" + +#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:18 +#: templates/dcim/consoleserverport.html:75 templates/dcim/frontport.html:119 +#: templates/dcim/inventoryitem_edit.html:39 +msgid "Console Port" +msgstr "Port de console" + +#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 +#: dcim/tables/connections.py:71 +#: templates/dcim/inc/connection_endpoints.html:16 +msgid "Reachable" +msgstr "Joignable" + +#: dcim/tables/connections.py:46 dcim/tables/devices.py:524 +#: templates/dcim/inventoryitem_edit.html:64 +#: templates/dcim/poweroutlet.html:47 templates/dcim/powerport.html:18 +msgid "Power Port" +msgstr "Port d'alimentation" + +#: dcim/tables/devices.py:94 dcim/tables/devices.py:139 +#: dcim/tables/racks.py:81 dcim/tables/sites.py:143 +#: netbox/navigation/menu.py:57 netbox/navigation/menu.py:61 +#: netbox/navigation/menu.py:63 virtualization/forms/model_forms.py:125 +#: virtualization/tables/clusters.py:83 virtualization/views.py:211 +msgid "Devices" +msgstr "Appareils" + +#: dcim/tables/devices.py:99 dcim/tables/devices.py:144 +#: virtualization/tables/clusters.py:88 +msgid "VMs" +msgstr "machines virtuelles" + +#: dcim/tables/devices.py:133 dcim/tables/devices.py:245 +#: extras/forms/model_forms.py:506 templates/dcim/device.html:114 +#: templates/dcim/device/render_config.html:11 +#: templates/dcim/device/render_config.html:15 +#: templates/dcim/devicerole.html:47 templates/dcim/platform.html:44 +#: templates/extras/configtemplate.html:10 +#: templates/virtualization/virtualmachine.html:47 +#: templates/virtualization/virtualmachine/render_config.html:11 +#: templates/virtualization/virtualmachine/render_config.html:15 +#: virtualization/tables/virtualmachines.py:93 +msgid "Config Template" +msgstr "Modèle de configuration" + +#: dcim/tables/devices.py:216 dcim/tables/devices.py:1069 +#: ipam/forms/bulk_import.py:511 ipam/forms/model_forms.py:296 +#: ipam/tables/ip.py:352 ipam/tables/ip.py:418 ipam/tables/ip.py:441 +#: templates/ipam/ipaddress.html:12 templates/ipam/ipaddress_edit.html:14 +#: virtualization/tables/virtualmachines.py:81 +msgid "IP Address" +msgstr "Adresse IP" + +#: dcim/tables/devices.py:220 dcim/tables/devices.py:1073 +#: virtualization/tables/virtualmachines.py:72 +msgid "IPv4 Address" +msgstr "Adresse IPv4" + +#: dcim/tables/devices.py:224 dcim/tables/devices.py:1077 +#: virtualization/tables/virtualmachines.py:76 +msgid "IPv6 Address" +msgstr "Adresse IPv6" + +#: dcim/tables/devices.py:239 +msgid "VC Position" +msgstr "Position en VC" + +#: dcim/tables/devices.py:242 +msgid "VC Priority" +msgstr "Priorité VC" + +#: dcim/tables/devices.py:249 templates/dcim/device_edit.html:38 +#: templates/dcim/devicebay_populate.html:16 +msgid "Parent Device" +msgstr "Appareil parent" + +#: dcim/tables/devices.py:254 +msgid "Position (Device Bay)" +msgstr "Position (baie de l'appareil)" + +#: dcim/tables/devices.py:263 +msgid "Console ports" +msgstr "Ports de console" + +#: dcim/tables/devices.py:266 +msgid "Console server ports" +msgstr "Ports du serveur de consoles" + +#: dcim/tables/devices.py:269 +msgid "Power ports" +msgstr "Ports d'alimentation" + +#: dcim/tables/devices.py:272 +msgid "Power outlets" +msgstr "Prises de courant" + +#: dcim/tables/devices.py:275 dcim/tables/devices.py:1082 +#: dcim/tables/devicetypes.py:125 dcim/views.py:1002 dcim/views.py:1241 +#: dcim/views.py:1927 netbox/navigation/menu.py:82 +#: netbox/navigation/menu.py:238 templates/dcim/device/base.html:37 +#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 +#: templates/dcim/module.html:34 templates/dcim/moduletype/base.html:34 +#: templates/dcim/virtualdevicecontext.html:64 +#: templates/dcim/virtualdevicecontext.html:85 +#: templates/virtualization/virtualmachine/base.html:27 +#: templates/virtualization/virtualmachine_list.html:14 +#: virtualization/tables/virtualmachines.py:87 virtualization/views.py:368 +#: wireless/tables/wirelesslan.py:55 +msgid "Interfaces" +msgstr "Interfaces" + +#: dcim/tables/devices.py:278 +msgid "Front ports" +msgstr "Ports avant" + +#: dcim/tables/devices.py:284 +msgid "Device bays" +msgstr "Baies pour appareils" + +#: dcim/tables/devices.py:287 +msgid "Module bays" +msgstr "Baies pour modules" + +#: dcim/tables/devices.py:290 +msgid "Inventory items" +msgstr "Articles d'inventaire" + +#: dcim/tables/devices.py:329 dcim/tables/modules.py:56 +#: templates/dcim/modulebay.html:17 +msgid "Module Bay" +msgstr "Module Bay" + +#: dcim/tables/devices.py:350 +msgid "Cable Color" +msgstr "Couleur du câble" + +#: dcim/tables/devices.py:356 +msgid "Link Peers" +msgstr "Lier les pairs" + +#: dcim/tables/devices.py:359 +msgid "Mark Connected" +msgstr "Marquer comme connecté" + +#: dcim/tables/devices.py:470 +msgid "Maximum draw (W)" +msgstr "Tirage maximal (W)" + +#: dcim/tables/devices.py:473 +msgid "Allocated draw (W)" +msgstr "Tirage alloué (W)" + +#: dcim/tables/devices.py:573 ipam/forms/model_forms.py:707 +#: ipam/tables/fhrp.py:28 ipam/views.py:597 ipam/views.py:671 +#: netbox/navigation/menu.py:146 netbox/navigation/menu.py:148 +#: templates/dcim/interface.html:351 templates/ipam/ipaddress_bulk_add.html:15 +#: templates/ipam/service.html:43 templates/virtualization/vminterface.html:88 +#: vpn/tables/tunnels.py:94 +msgid "IP Addresses" +msgstr "Adresses IP" + +#: dcim/tables/devices.py:579 netbox/navigation/menu.py:190 +#: templates/ipam/inc/panels/fhrp_groups.html:5 +msgid "FHRP Groups" +msgstr "Groupes FHRP" + +#: dcim/tables/devices.py:591 templates/dcim/interface.html:90 +#: templates/virtualization/vminterface.html:70 templates/vpn/tunnel.html:18 +#: templates/vpn/tunneltermination.html:14 vpn/forms/bulk_edit.py:75 +#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:41 +#: vpn/forms/filtersets.py:81 vpn/forms/model_forms.py:59 +#: vpn/forms/model_forms.py:144 vpn/tables/tunnels.py:74 +msgid "Tunnel" +msgstr "Tunnel" + +#: dcim/tables/devices.py:616 dcim/tables/devicetypes.py:224 +#: templates/dcim/interface.html:66 +msgid "Management Only" +msgstr "Gestion uniquement" + +#: dcim/tables/devices.py:624 +msgid "Wireless link" +msgstr "Liaison sans fil" + +#: dcim/tables/devices.py:634 +msgid "VDCs" +msgstr "VDC" + +#: dcim/tables/devices.py:642 dcim/tables/devicetypes.py:48 +#: dcim/tables/devicetypes.py:140 dcim/views.py:1077 dcim/views.py:2020 +#: netbox/navigation/menu.py:91 templates/dcim/device/base.html:52 +#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 +#: templates/dcim/inc/panels/inventory_items.html:5 +#: templates/dcim/inventoryitemrole.html:33 +msgid "Inventory Items" +msgstr "Articles d'inventaire" + +#: dcim/tables/devices.py:723 +#: templates/circuits/inc/circuit_termination.html:80 +#: templates/dcim/consoleport.html:81 templates/dcim/consoleserverport.html:81 +#: templates/dcim/frontport.html:53 templates/dcim/frontport.html:125 +#: templates/dcim/interface.html:196 templates/dcim/inventoryitem_edit.html:69 +#: templates/dcim/rearport.html:18 templates/dcim/rearport.html:115 +msgid "Rear Port" +msgstr "Port arrière" + +#: dcim/tables/devices.py:888 templates/dcim/modulebay.html:51 +msgid "Installed Module" +msgstr "Module installé" + +#: dcim/tables/devices.py:891 +msgid "Module Serial" +msgstr "Série du module" + +#: dcim/tables/devices.py:895 +msgid "Module Asset Tag" +msgstr "Étiquette d'actif du module" + +#: dcim/tables/devices.py:904 +msgid "Module Status" +msgstr "État du module" + +#: dcim/tables/devices.py:946 dcim/tables/devicetypes.py:308 +#: templates/dcim/inventoryitem.html:41 +msgid "Component" +msgstr "Composant" + +#: dcim/tables/devices.py:1001 +msgid "Items" +msgstr "Objets" + +#: dcim/tables/devicetypes.py:38 netbox/navigation/menu.py:72 +#: netbox/navigation/menu.py:74 +msgid "Device Types" +msgstr "Types d'appareils" + +#: dcim/tables/devicetypes.py:43 netbox/navigation/menu.py:75 +msgid "Module Types" +msgstr "Types de modules" + +#: dcim/tables/devicetypes.py:53 extras/forms/filtersets.py:379 +#: extras/forms/model_forms.py:414 netbox/navigation/menu.py:66 +msgid "Platforms" +msgstr "Plateformes" + +#: dcim/tables/devicetypes.py:85 templates/dcim/devicetype.html:32 +msgid "Default Platform" +msgstr "Plateforme par défaut" + +#: dcim/tables/devicetypes.py:89 templates/dcim/devicetype.html:48 +msgid "Full Depth" +msgstr "Pleine profondeur" + +#: dcim/tables/devicetypes.py:98 +msgid "U Height" +msgstr "Hauteur en U" + +#: dcim/tables/devicetypes.py:110 dcim/tables/modules.py:26 +msgid "Instances" +msgstr "Instances" + +#: dcim/tables/devicetypes.py:113 dcim/views.py:942 dcim/views.py:1181 +#: dcim/views.py:1867 netbox/navigation/menu.py:85 +#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 +#: templates/dcim/devicetype/base.html:22 templates/dcim/module.html:22 +#: templates/dcim/moduletype/base.html:22 +msgid "Console Ports" +msgstr "Ports de console" + +#: dcim/tables/devicetypes.py:116 dcim/views.py:957 dcim/views.py:1196 +#: dcim/views.py:1882 netbox/navigation/menu.py:86 +#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 +#: templates/dcim/devicetype/base.html:25 templates/dcim/module.html:25 +#: templates/dcim/moduletype/base.html:25 +msgid "Console Server Ports" +msgstr "Ports du serveur de consoles" + +#: dcim/tables/devicetypes.py:119 dcim/views.py:972 dcim/views.py:1211 +#: dcim/views.py:1897 netbox/navigation/menu.py:87 +#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 +#: templates/dcim/devicetype/base.html:28 templates/dcim/module.html:28 +#: templates/dcim/moduletype/base.html:28 +msgid "Power Ports" +msgstr "Ports d'alimentation" + +#: dcim/tables/devicetypes.py:122 dcim/views.py:987 dcim/views.py:1226 +#: dcim/views.py:1912 netbox/navigation/menu.py:88 +#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 +#: templates/dcim/devicetype/base.html:31 templates/dcim/module.html:31 +#: templates/dcim/moduletype/base.html:31 +msgid "Power Outlets" +msgstr "Prises de courant" + +#: dcim/tables/devicetypes.py:128 dcim/views.py:1017 dcim/views.py:1256 +#: dcim/views.py:1948 netbox/navigation/menu.py:83 +#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 +#: templates/dcim/module.html:37 templates/dcim/moduletype/base.html:37 +msgid "Front Ports" +msgstr "Ports avant" + +#: dcim/tables/devicetypes.py:131 dcim/views.py:1032 dcim/views.py:1271 +#: dcim/views.py:1963 netbox/navigation/menu.py:84 +#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 +#: templates/dcim/devicetype/base.html:40 templates/dcim/module.html:40 +#: templates/dcim/moduletype/base.html:40 +msgid "Rear Ports" +msgstr "Ports arrière" + +#: dcim/tables/devicetypes.py:134 dcim/views.py:1062 dcim/views.py:2001 +#: netbox/navigation/menu.py:90 templates/dcim/device/base.html:49 +#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +msgid "Device Bays" +msgstr "Baies pour appareils" + +#: dcim/tables/devicetypes.py:137 dcim/views.py:1047 dcim/views.py:1982 +#: netbox/navigation/menu.py:89 templates/dcim/device/base.html:46 +#: templates/dcim/device_list.html:64 templates/dcim/devicetype/base.html:43 +msgid "Module Bays" +msgstr "Baies pour modules" + +#: dcim/tables/power.py:36 netbox/navigation/menu.py:282 +#: templates/core/configrevision.html:59 templates/dcim/powerpanel.html:53 +msgid "Power Feeds" +msgstr "Alimentations" + +#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:106 +msgid "Max Utilization" +msgstr "Utilisation maximale" + +#: dcim/tables/power.py:84 +msgid "Available Power (VA)" +msgstr "Puissance disponible (VA)" + +#: dcim/tables/racks.py:29 dcim/tables/sites.py:138 +#: netbox/navigation/menu.py:25 netbox/navigation/menu.py:27 +msgid "Racks" +msgstr "Étagères" + +#: dcim/tables/racks.py:73 templates/dcim/device.html:323 +#: templates/dcim/rack.html:95 +msgid "Height" +msgstr "Hauteur" + +#: dcim/tables/racks.py:85 +msgid "Space" +msgstr "Espace" + +#: dcim/tables/racks.py:96 templates/dcim/rack.html:105 +msgid "Outer Width" +msgstr "Largeur extérieure" + +#: dcim/tables/racks.py:100 templates/dcim/rack.html:115 +msgid "Outer Depth" +msgstr "Profondeur extérieure" + +#: dcim/tables/racks.py:108 +msgid "Max Weight" +msgstr "Poids maximum" + +#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 +#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:394 +#: ipam/forms/bulk_edit.py:128 ipam/forms/model_forms.py:152 +#: ipam/tables/asn.py:66 netbox/navigation/menu.py:16 +#: netbox/navigation/menu.py:18 +msgid "Sites" +msgstr "Des sites" + +#: dcim/views.py:131 +#, python-brace-format +msgid "Disconnected {count} {type}" +msgstr "Déconnecté {count} {type}" + +#: dcim/views.py:692 netbox/navigation/menu.py:29 +msgid "Reservations" +msgstr "Réservations" + +#: dcim/views.py:711 +msgid "Non-Racked Devices" +msgstr "Appareils non rackés" + +#: dcim/views.py:2033 extras/forms/model_forms.py:454 +#: templates/extras/configcontext.html:10 +#: virtualization/forms/model_forms.py:228 virtualization/views.py:408 +msgid "Config Context" +msgstr "Contexte de configuration" + +#: dcim/views.py:2043 virtualization/views.py:418 +msgid "Render Config" +msgstr "Configuration du rendu" + +#: dcim/views.py:2971 ipam/tables/ip.py:233 +msgid "Children" +msgstr "Enfants" + +#: extras/choices.py:27 extras/forms/misc.py:14 +msgid "Text" +msgstr "Texte" + +#: extras/choices.py:28 +msgid "Text (long)" +msgstr "Texte (long)" + +#: extras/choices.py:29 +msgid "Integer" +msgstr "Entier" + +#: extras/choices.py:30 +msgid "Decimal" +msgstr "Décimal" + +#: extras/choices.py:31 +msgid "Boolean (true/false)" +msgstr "Booléen (vrai/faux)" + +#: extras/choices.py:32 +msgid "Date" +msgstr "Date" + +#: extras/choices.py:33 +msgid "Date & time" +msgstr "Date et heure" + +#: extras/choices.py:35 +msgid "JSON" +msgstr "JSON" + +#: extras/choices.py:36 +msgid "Selection" +msgstr "Sélection" + +#: extras/choices.py:37 +msgid "Multiple selection" +msgstr "Sélection multiple" + +#: extras/choices.py:39 +msgid "Multiple objects" +msgstr "Objets multiples" + +#: extras/choices.py:50 templates/extras/customfield.html:69 vpn/choices.py:20 +#: wireless/choices.py:27 +msgid "Disabled" +msgstr "Désactivé" + +#: extras/choices.py:51 +msgid "Loose" +msgstr "Lâche" + +#: extras/choices.py:52 +msgid "Exact" +msgstr "Exact" + +#: extras/choices.py:63 +msgid "Always" +msgstr "Toujours" + +#: extras/choices.py:64 +msgid "If set" +msgstr "Si défini" + +#: extras/choices.py:65 extras/choices.py:78 +msgid "Hidden" +msgstr "Caché" + +#: extras/choices.py:76 +msgid "Yes" +msgstr "Oui" + +#: extras/choices.py:77 +msgid "No" +msgstr "Non" + +#: extras/choices.py:105 templates/tenancy/contact.html:58 +#: tenancy/forms/bulk_edit.py:117 wireless/forms/model_forms.py:159 +msgid "Link" +msgstr "Lien" + +#: extras/choices.py:119 +msgid "Newest" +msgstr "Le plus récent" + +#: extras/choices.py:120 +msgid "Oldest" +msgstr "Le plus ancien" + +#: extras/choices.py:136 templates/generic/object.html:51 +msgid "Updated" +msgstr "Mis à jour" + +#: extras/choices.py:137 +msgid "Deleted" +msgstr "Supprimé" + +#: extras/choices.py:154 extras/choices.py:176 +msgid "Info" +msgstr "Infos" + +#: extras/choices.py:155 extras/choices.py:175 +msgid "Success" +msgstr "Succès" + +#: extras/choices.py:156 extras/choices.py:177 +msgid "Warning" +msgstr "Avertissement" + +#: extras/choices.py:157 +msgid "Danger" +msgstr "Danger" + +#: extras/choices.py:174 utilities/choices.py:190 +msgid "Default" +msgstr "Par défaut" + +#: extras/choices.py:178 +msgid "Failure" +msgstr "Défaillance" + +#: extras/choices.py:185 +msgid "Hourly" +msgstr "Toutes les heures" + +#: extras/choices.py:186 +msgid "12 hours" +msgstr "12 heures" + +#: extras/choices.py:187 +msgid "Daily" +msgstr "Tous les jours" + +#: extras/choices.py:188 +msgid "Weekly" +msgstr "Hebdo" + +#: extras/choices.py:189 +msgid "30 days" +msgstr "30 jours" + +#: extras/choices.py:254 extras/tables/tables.py:287 +#: templates/dcim/virtualchassis_edit.html:108 +#: templates/extras/eventrule.html:51 +#: templates/generic/bulk_add_component.html:56 +#: templates/generic/object_edit.html:29 templates/generic/object_edit.html:70 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +msgid "Create" +msgstr "Créez" + +#: extras/choices.py:255 extras/tables/tables.py:290 +#: templates/extras/eventrule.html:55 +msgid "Update" +msgstr "Mise à jour" + +#: extras/choices.py:256 extras/tables/tables.py:293 +#: templates/circuits/inc/circuit_termination.html:22 +#: templates/dcim/devicetype/component_templates.html:24 +#: templates/dcim/inc/panels/inventory_items.html:29 +#: templates/dcim/moduletype/component_templates.html:24 +#: templates/dcim/powerpanel.html:71 templates/extras/eventrule.html:59 +#: templates/extras/report_list.html:34 templates/extras/script_list.html:33 +#: templates/generic/bulk_delete.html:18 templates/generic/bulk_delete.html:45 +#: templates/generic/object_delete.html:15 templates/htmx/delete_form.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:35 +#: templates/users/objectpermission.html:49 +#: utilities/templates/buttons/delete.html:9 +msgid "Delete" +msgstr "Supprimer" + +#: extras/choices.py:280 utilities/choices.py:143 utilities/choices.py:191 +msgid "Blue" +msgstr "Bleu" + +#: extras/choices.py:281 utilities/choices.py:142 utilities/choices.py:192 +msgid "Indigo" +msgstr "Indigo" + +#: extras/choices.py:282 utilities/choices.py:140 utilities/choices.py:193 +msgid "Purple" +msgstr "Violet" + +#: extras/choices.py:283 utilities/choices.py:137 utilities/choices.py:194 +msgid "Pink" +msgstr "Rose" + +#: extras/choices.py:284 utilities/choices.py:136 utilities/choices.py:195 +msgid "Red" +msgstr "rouge" + +#: extras/choices.py:285 utilities/choices.py:154 utilities/choices.py:196 +msgid "Orange" +msgstr "Orange" + +#: extras/choices.py:286 utilities/choices.py:152 utilities/choices.py:197 +msgid "Yellow" +msgstr "Jaune" + +#: extras/choices.py:287 utilities/choices.py:149 utilities/choices.py:198 +msgid "Green" +msgstr "Vert" + +#: extras/choices.py:288 utilities/choices.py:146 utilities/choices.py:199 +msgid "Teal" +msgstr "Sarcelle" + +#: extras/choices.py:289 utilities/choices.py:145 utilities/choices.py:200 +msgid "Cyan" +msgstr "Cyan" + +#: extras/choices.py:290 utilities/choices.py:201 +msgid "Gray" +msgstr "gris" + +#: extras/choices.py:291 utilities/choices.py:160 utilities/choices.py:202 +msgid "Black" +msgstr "noir" + +#: extras/choices.py:292 utilities/choices.py:161 utilities/choices.py:203 +msgid "White" +msgstr "blanc" + +#: extras/choices.py:306 extras/forms/model_forms.py:233 +#: extras/forms/model_forms.py:321 templates/extras/webhook.html:11 +msgid "Webhook" +msgstr "Webhook" + +#: extras/choices.py:307 templates/extras/script/base.html:29 +msgid "Script" +msgstr "Scénario" + +#: extras/dashboard/forms.py:38 +msgid "Widget type" +msgstr "Type de widget" + +#: extras/dashboard/widgets.py:148 +msgid "Note" +msgstr "Remarque" + +#: extras/dashboard/widgets.py:149 +msgid "Display some arbitrary custom content. Markdown is supported." +msgstr "" +"Affichez du contenu personnalisé arbitraire. Markdown est pris en charge." + +#: extras/dashboard/widgets.py:162 +msgid "Object Counts" +msgstr "Nombre d'objets" + +#: extras/dashboard/widgets.py:163 +msgid "" +"Display a set of NetBox models and the number of objects created for each " +"type." +msgstr "" +"Affichez un ensemble de modèles NetBox et le nombre d'objets créés pour " +"chaque type." + +#: extras/dashboard/widgets.py:173 +msgid "Filters to apply when counting the number of objects" +msgstr "Filtres à appliquer lors du comptage du nombre d'objets" + +#: extras/dashboard/widgets.py:209 +msgid "Object List" +msgstr "Liste d'objets" + +#: extras/dashboard/widgets.py:210 +msgid "Display an arbitrary list of objects." +msgstr "Afficher une liste arbitraire d'objets." + +#: extras/dashboard/widgets.py:223 +msgid "The default number of objects to display" +msgstr "Le nombre d'objets à afficher par défaut" + +#: extras/dashboard/widgets.py:270 +msgid "RSS Feed" +msgstr "Fil RSS" + +#: extras/dashboard/widgets.py:275 +msgid "Embed an RSS feed from an external website." +msgstr "Intégrez un flux RSS provenant d'un site Web externe." + +#: extras/dashboard/widgets.py:282 +msgid "Feed URL" +msgstr "URL du flux" + +#: extras/dashboard/widgets.py:287 +msgid "The maximum number of objects to display" +msgstr "Le nombre maximum d'objets à afficher" + +#: extras/dashboard/widgets.py:292 +msgid "How long to stored the cached content (in seconds)" +msgstr "Durée de conservation du contenu mis en cache (en secondes)" + +#: extras/dashboard/widgets.py:344 templates/account/base.html:10 +#: templates/account/bookmarks.html:7 templates/inc/profile_button.html:29 +msgid "Bookmarks" +msgstr "Signets" + +#: extras/dashboard/widgets.py:348 +msgid "Show your personal bookmarks" +msgstr "Afficher vos favoris personnels" + +#: extras/filtersets.py:207 extras/filtersets.py:542 extras/filtersets.py:570 +msgid "Data file (ID)" +msgstr "Fichier de données (ID)" + +#: extras/filtersets.py:479 virtualization/forms/filtersets.py:114 +msgid "Cluster type" +msgstr "Type de cluster" + +#: extras/filtersets.py:485 virtualization/filtersets.py:95 +#: virtualization/filtersets.py:146 +msgid "Cluster type (slug)" +msgstr "Type de cluster (slug)" + +#: extras/filtersets.py:490 ipam/forms/bulk_edit.py:475 +#: ipam/forms/model_forms.py:585 virtualization/forms/filtersets.py:108 +msgid "Cluster group" +msgstr "Groupe de clusters" + +#: extras/filtersets.py:496 virtualization/filtersets.py:135 +msgid "Cluster group (slug)" +msgstr "Groupe de clusters (slug)" + +#: extras/filtersets.py:506 tenancy/forms/forms.py:16 +#: tenancy/forms/forms.py:39 +msgid "Tenant group" +msgstr "Groupe de locataires" + +#: extras/filtersets.py:512 tenancy/filtersets.py:163 +#: tenancy/filtersets.py:183 +msgid "Tenant group (slug)" +msgstr "Groupe de locataires (slug)" + +#: extras/filtersets.py:528 templates/extras/tag.html:12 +msgid "Tag" +msgstr "Balise" + +#: extras/filtersets.py:534 +msgid "Tag (slug)" +msgstr "Tag (limace)" + +#: extras/filtersets.py:594 extras/forms/filtersets.py:438 +msgid "Has local config context data" +msgstr "Possède des données contextuelles de configuration locales" + +#: extras/filtersets.py:619 +msgid "User name" +msgstr "Nom d'utilisateur" + +#: extras/forms/bulk_edit.py:32 extras/forms/filtersets.py:56 +msgid "Group name" +msgstr "Nom du groupe" + +#: extras/forms/bulk_edit.py:40 extras/forms/filtersets.py:64 +#: extras/tables/tables.py:47 templates/extras/customfield.html:39 +#: templates/generic/bulk_import.html:116 +msgid "Required" +msgstr "Obligatoire" + +#: extras/forms/bulk_edit.py:53 extras/forms/bulk_import.py:57 +#: extras/forms/filtersets.py:78 extras/models/customfields.py:193 +msgid "UI visible" +msgstr "Interface utilisateur visible" + +#: extras/forms/bulk_edit.py:58 extras/forms/bulk_import.py:63 +#: extras/forms/filtersets.py:83 extras/models/customfields.py:200 +msgid "UI editable" +msgstr "Interface utilisateur modifiable" + +#: extras/forms/bulk_edit.py:63 extras/forms/filtersets.py:86 +msgid "Is cloneable" +msgstr "Est cloneable" + +#: extras/forms/bulk_edit.py:102 extras/forms/filtersets.py:126 +msgid "New window" +msgstr "Nouvelle fenêtre" + +#: extras/forms/bulk_edit.py:111 +msgid "Button class" +msgstr "Classe de boutons" + +#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:164 +#: extras/models/models.py:439 +msgid "MIME type" +msgstr "Type MIME" + +#: extras/forms/bulk_edit.py:133 extras/forms/filtersets.py:167 +msgid "File extension" +msgstr "Extension de fichier" + +#: extras/forms/bulk_edit.py:138 extras/forms/filtersets.py:171 +msgid "As attachment" +msgstr "En pièce jointe" + +#: extras/forms/bulk_edit.py:166 extras/forms/filtersets.py:213 +#: extras/tables/tables.py:214 templates/extras/savedfilter.html:30 +msgid "Shared" +msgstr "Partagé" + +#: extras/forms/bulk_edit.py:189 extras/forms/filtersets.py:242 +#: extras/models/models.py:204 +msgid "HTTP method" +msgstr "Méthode HTTP" + +#: extras/forms/bulk_edit.py:193 extras/forms/filtersets.py:236 +#: templates/extras/webhook.html:37 +msgid "Payload URL" +msgstr "URL de charge utile" + +#: extras/forms/bulk_edit.py:198 extras/models/models.py:244 +msgid "SSL verification" +msgstr "Vérification SSL" + +#: extras/forms/bulk_edit.py:201 templates/extras/webhook.html:45 +msgid "Secret" +msgstr "Secret" + +#: extras/forms/bulk_edit.py:206 +msgid "CA file path" +msgstr "chemin du fichier CA" + +#: extras/forms/bulk_edit.py:225 +msgid "On create" +msgstr "Lors de la création" + +#: extras/forms/bulk_edit.py:230 +msgid "On update" +msgstr "Sur mise à jour" + +#: extras/forms/bulk_edit.py:235 +msgid "On delete" +msgstr "Lors de la suppression" + +#: extras/forms/bulk_edit.py:240 +msgid "On job start" +msgstr "Au début du travail" + +#: extras/forms/bulk_edit.py:245 +msgid "On job end" +msgstr "En fin de travail" + +#: extras/forms/bulk_edit.py:282 +msgid "Is active" +msgstr "Est actif" + +#: extras/forms/bulk_import.py:34 extras/forms/bulk_import.py:115 +#: extras/forms/bulk_import.py:130 extras/forms/bulk_import.py:153 +#: extras/forms/bulk_import.py:177 extras/forms/filtersets.py:114 +#: extras/forms/filtersets.py:160 extras/forms/filtersets.py:201 +#: extras/forms/model_forms.py:43 extras/forms/model_forms.py:127 +#: extras/forms/model_forms.py:154 extras/forms/model_forms.py:195 +#: extras/forms/model_forms.py:251 +msgid "Content types" +msgstr "Types de contenu" + +#: extras/forms/bulk_import.py:36 extras/forms/bulk_import.py:117 +#: extras/forms/bulk_import.py:132 extras/forms/bulk_import.py:155 +#: extras/forms/bulk_import.py:179 tenancy/forms/bulk_import.py:96 +msgid "One or more assigned object types" +msgstr "Un ou plusieurs types d'objets attribués" + +#: extras/forms/bulk_import.py:41 +msgid "Field data type (e.g. text, integer, etc.)" +msgstr "Type de données de champ (par exemple texte, entier, etc.)" + +#: extras/forms/bulk_import.py:44 extras/forms/filtersets.py:48 +#: extras/forms/filtersets.py:259 extras/forms/model_forms.py:47 +#: extras/forms/model_forms.py:221 tenancy/forms/filtersets.py:91 +msgid "Object type" +msgstr "Type d'objet" + +#: extras/forms/bulk_import.py:47 +msgid "Object type (for object or multi-object fields)" +msgstr "Type d'objet (pour les champs d'objets ou multi-objets)" + +#: extras/forms/bulk_import.py:50 extras/forms/filtersets.py:73 +msgid "Choice set" +msgstr "Coffret Choice" + +#: extras/forms/bulk_import.py:54 +msgid "Choice set (for selection fields)" +msgstr "Set de choix (pour les champs de sélection)" + +#: extras/forms/bulk_import.py:60 +msgid "Whether the custom field is displayed in the UI" +msgstr "Si le champ personnalisé est affiché dans l'interface utilisateur" + +#: extras/forms/bulk_import.py:66 +msgid "Whether the custom field is editable in the UI" +msgstr "Si le champ personnalisé est modifiable dans l'interface utilisateur" + +#: extras/forms/bulk_import.py:82 +msgid "The base set of predefined choices to use (if any)" +msgstr "L'ensemble de base de choix prédéfinis à utiliser (le cas échéant)" + +#: extras/forms/bulk_import.py:88 +msgid "" +"Quoted string of comma-separated field choices with optional labels " +"separated by colon: \"choice1:First Choice,choice2:Second Choice\"" +msgstr "" +"Chaîne entre guillemets contenant des choix de champs séparés par des " +"virgules avec des libellés facultatifs séparés par deux points : " +"« Choice1:First Choice, Choice2:Second Choice »" + +#: extras/forms/bulk_import.py:182 +msgid "Action object" +msgstr "Objet d'action" + +#: extras/forms/bulk_import.py:184 +msgid "Webhook name or script as dotted path module.Class" +msgstr "Nom du webhook ou script sous forme de chemin pointillé module.Class" + +#: extras/forms/bulk_import.py:236 +msgid "Assigned object type" +msgstr "Type d'objet attribué" + +#: extras/forms/bulk_import.py:241 +msgid "The classification of entry" +msgstr "La classification de l'entrée" + +#: extras/forms/filtersets.py:53 +msgid "Field type" +msgstr "Type de champ" + +#: extras/forms/filtersets.py:97 extras/tables/tables.py:65 +#: templates/generic/bulk_import.html:148 +msgid "Choices" +msgstr "Choix" + +#: extras/forms/filtersets.py:141 extras/forms/filtersets.py:327 +#: extras/forms/filtersets.py:417 extras/forms/model_forms.py:449 +#: templates/core/job.html:86 templates/extras/configcontext.html:86 +#: templates/extras/eventrule.html:111 +msgid "Data" +msgstr "Données" + +#: extras/forms/filtersets.py:152 extras/forms/filtersets.py:341 +#: extras/forms/filtersets.py:427 utilities/choices.py:219 +#: utilities/forms/bulk_import.py:27 +msgid "Data file" +msgstr "Fichier de données" + +#: extras/forms/filtersets.py:185 +msgid "Content type" +msgstr "Type de contenu" + +#: extras/forms/filtersets.py:232 extras/models/models.py:209 +msgid "HTTP content type" +msgstr "Type de contenu HTTP" + +#: extras/forms/filtersets.py:254 extras/forms/model_forms.py:269 +#: templates/extras/eventrule.html:46 +msgid "Events" +msgstr "Évènements" + +#: extras/forms/filtersets.py:264 +msgid "Action type" +msgstr "Type d'action" + +#: extras/forms/filtersets.py:278 +msgid "Object creations" +msgstr "Créations d'objets" + +#: extras/forms/filtersets.py:285 +msgid "Object updates" +msgstr "mises à jour des objets" + +#: extras/forms/filtersets.py:292 +msgid "Object deletions" +msgstr "Suppressions d'objets" + +#: extras/forms/filtersets.py:299 +msgid "Job starts" +msgstr "Début du travail" + +#: extras/forms/filtersets.py:306 extras/forms/model_forms.py:289 +msgid "Job terminations" +msgstr "Résiliations d'emploi" + +#: extras/forms/filtersets.py:315 +msgid "Tagged object type" +msgstr "Type d'objet balisé" + +#: extras/forms/filtersets.py:320 +msgid "Allowed object type" +msgstr "Type d'objet autorisé" + +#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:384 +#: netbox/navigation/menu.py:19 +msgid "Regions" +msgstr "Régions" + +#: extras/forms/filtersets.py:354 extras/forms/model_forms.py:389 +msgid "Site groups" +msgstr "Groupes de sites" + +#: extras/forms/filtersets.py:364 extras/forms/model_forms.py:399 +#: netbox/navigation/menu.py:21 +msgid "Locations" +msgstr "Localisations" + +#: extras/forms/filtersets.py:369 extras/forms/model_forms.py:404 +msgid "Device types" +msgstr "Types d'appareils" + +#: extras/forms/filtersets.py:374 extras/forms/model_forms.py:409 +msgid "Roles" +msgstr "Rôles" + +#: extras/forms/filtersets.py:384 extras/forms/model_forms.py:419 +msgid "Cluster types" +msgstr "Types de clusters" + +#: extras/forms/filtersets.py:390 extras/forms/model_forms.py:424 +msgid "Cluster groups" +msgstr "Groupes de clusters" + +#: extras/forms/filtersets.py:395 extras/forms/model_forms.py:429 +#: netbox/navigation/menu.py:243 netbox/navigation/menu.py:245 +#: templates/virtualization/clustertype.html:33 +#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +msgid "Clusters" +msgstr "Clusters" + +#: extras/forms/filtersets.py:400 extras/forms/model_forms.py:434 +msgid "Tenant groups" +msgstr "Groupes de locataires" + +#: extras/forms/filtersets.py:454 extras/forms/filtersets.py:495 +msgid "After" +msgstr "Après" + +#: extras/forms/filtersets.py:459 extras/forms/filtersets.py:500 +msgid "Before" +msgstr "Avant" + +#: extras/forms/filtersets.py:490 extras/tables/tables.py:426 +#: templates/extras/htmx/report_result.html:43 +#: templates/extras/objectchange.html:34 +msgid "Time" +msgstr "Heure" + +#: extras/forms/filtersets.py:504 extras/forms/model_forms.py:271 +#: extras/tables/tables.py:440 templates/extras/eventrule.html:90 +#: templates/extras/objectchange.html:50 +msgid "Action" +msgstr "Action" + +#: extras/forms/model_forms.py:50 +msgid "Type of the related object (for object/multi-object fields only)" +msgstr "" +"Type de l'objet associé (pour les champs objet/multi-objets uniquement)" + +#: extras/forms/model_forms.py:58 templates/extras/customfield.html:11 +msgid "Custom Field" +msgstr "Champ personnalisé" + +#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +msgid "Behavior" +msgstr "Comportement" + +#: extras/forms/model_forms.py:62 +msgid "Values" +msgstr "Valeurs" + +#: extras/forms/model_forms.py:71 +msgid "" +"The type of data stored in this field. For object/multi-object fields, " +"select the related object type below." +msgstr "" +"Le type de données stockées dans ce champ. Pour les champs objet/multi-" +"objets, sélectionnez le type d'objet associé ci-dessous." + +#: extras/forms/model_forms.py:74 +msgid "" +"This will be displayed as help text for the form field. Markdown is " +"supported." +msgstr "" +"Cela sera affiché sous forme de texte d'aide pour le champ du formulaire. " +"Markdown est pris en charge." + +#: extras/forms/model_forms.py:91 +msgid "" +"Enter one choice per line. An optional label may be specified for each " +"choice by appending it with a colon. Example:" +msgstr "" +"Entrez un choix par ligne. Une étiquette facultative peut être spécifiée " +"pour chaque choix en l'ajoutant par deux points. Exemple :" + +#: extras/forms/model_forms.py:132 templates/extras/customlink.html:10 +msgid "Custom Link" +msgstr "Lien personnalisé" + +#: extras/forms/model_forms.py:133 +msgid "Templates" +msgstr "Modèles" + +#: extras/forms/model_forms.py:145 +msgid "" +"Jinja2 template code for the link text. Reference the object as {{ " +"object }}. Links which render as empty text will not be displayed." +msgstr "" + +#: extras/forms/model_forms.py:148 +msgid "" +"Jinja2 template code for the link URL. Reference the object as {{ " +"object }}." +msgstr "" + +#: extras/forms/model_forms.py:158 extras/forms/model_forms.py:500 +msgid "Template code" +msgstr "Code du modèle" + +#: extras/forms/model_forms.py:164 templates/extras/exporttemplate.html:17 +msgid "Export Template" +msgstr "Modèle d'exportation" + +#: extras/forms/model_forms.py:166 +msgid "Rendering" +msgstr "Rendu" + +#: extras/forms/model_forms.py:180 extras/forms/model_forms.py:525 +msgid "Template content is populated from the remote source selected below." +msgstr "" +"Le contenu du modèle est renseigné à partir de la source distante " +"sélectionnée ci-dessous." + +#: extras/forms/model_forms.py:187 extras/forms/model_forms.py:532 +msgid "Must specify either local content or a data file" +msgstr "Doit spécifier un contenu local ou un fichier de données" + +#: extras/forms/model_forms.py:201 netbox/forms/mixins.py:68 +#: templates/extras/savedfilter.html:10 +msgid "Saved Filter" +msgstr "Filtre enregistré" + +#: extras/forms/model_forms.py:234 templates/extras/webhook.html:28 +msgid "HTTP Request" +msgstr "Requête HTTP" + +#: extras/forms/model_forms.py:237 templates/extras/webhook.html:53 +msgid "SSL" +msgstr "SLL" + +#: extras/forms/model_forms.py:255 +msgid "Action choice" +msgstr "Choix de l'action" + +#: extras/forms/model_forms.py:260 +msgid "Enter conditions in JSON format." +msgstr "Entrez les conditions dans JSON format." + +#: extras/forms/model_forms.py:264 +msgid "" +"Enter parameters to pass to the action in JSON format." +msgstr "" +"Entrez les paramètres à transmettre à l'action dans JSON format." + +#: extras/forms/model_forms.py:268 templates/extras/eventrule.html:11 +msgid "Event Rule" +msgstr "Règle de l'événement" + +#: extras/forms/model_forms.py:270 templates/extras/eventrule.html:78 +msgid "Conditions" +msgstr "Les conditions" + +#: extras/forms/model_forms.py:285 +msgid "Creations" +msgstr "Créations" + +#: extras/forms/model_forms.py:286 +msgid "Updates" +msgstr "mises à jour" + +#: extras/forms/model_forms.py:287 +msgid "Deletions" +msgstr "Suppressions" + +#: extras/forms/model_forms.py:288 +msgid "Job executions" +msgstr "Exécutions de tâches" + +#: extras/forms/model_forms.py:366 users/forms/model_forms.py:285 +msgid "Object types" +msgstr "Types d'objets" + +#: extras/forms/model_forms.py:439 netbox/navigation/menu.py:40 +#: tenancy/tables/tenants.py:22 +msgid "Tenants" +msgstr "Locataires" + +#: extras/forms/model_forms.py:456 ipam/forms/filtersets.py:141 +#: ipam/forms/filtersets.py:527 templates/extras/configcontext.html:62 +#: templates/ipam/ipaddress.html:62 templates/ipam/vlan_edit.html:30 +#: tenancy/forms/filtersets.py:86 users/forms/model_forms.py:323 +msgid "Assignment" +msgstr "Affectation" + +#: extras/forms/model_forms.py:482 +msgid "Data is populated from the remote source selected below." +msgstr "" +"Les données sont renseignées à partir de la source distante sélectionnée ci-" +"dessous." + +#: extras/forms/model_forms.py:488 +msgid "Must specify either local data or a data file" +msgstr "Doit spécifier des données locales ou un fichier de données" + +#: extras/forms/model_forms.py:507 templates/core/datafile.html:65 +msgid "Content" +msgstr "Contenu" + +#: extras/forms/reports.py:18 extras/forms/scripts.py:24 +msgid "Schedule at" +msgstr "Horaire à" + +#: extras/forms/reports.py:19 +msgid "Schedule execution of report to a set time" +msgstr "Planifier l'exécution du rapport à une heure définie" + +#: extras/forms/reports.py:24 extras/forms/scripts.py:30 +msgid "Recurs every" +msgstr "Récurrent chaque fois" + +#: extras/forms/reports.py:28 +msgid "Interval at which this report is re-run (in minutes)" +msgstr "Intervalle auquel ce rapport est réexécuté (en minutes)" + +#: extras/forms/reports.py:36 extras/forms/scripts.py:42 +#, python-brace-format +msgid " (current time: {now})" +msgstr " (heure actuelle : {now})" + +#: extras/forms/reports.py:46 extras/forms/scripts.py:52 +msgid "Scheduled time must be in the future." +msgstr "L'heure prévue doit se situer dans le futur." + +#: extras/forms/scripts.py:18 +msgid "Commit changes" +msgstr "Valider les modifications" + +#: extras/forms/scripts.py:19 +msgid "Commit changes to the database (uncheck for a dry-run)" +msgstr "" +"Validez les modifications apportées à la base de données (décochez cette " +"case pour une exécution à sec)" + +#: extras/forms/scripts.py:25 +msgid "Schedule execution of script to a set time" +msgstr "Planifier l'exécution du script à une heure définie" + +#: extras/forms/scripts.py:34 +msgid "Interval at which this script is re-run (in minutes)" +msgstr "Intervalle auquel ce script est réexécuté (en minutes)" + +#: extras/models/change_logging.py:24 +msgid "time" +msgstr "temps" + +#: extras/models/change_logging.py:37 +msgid "user name" +msgstr "nom d'utilisateur" + +#: extras/models/change_logging.py:42 +msgid "request ID" +msgstr "ID de demande" + +#: extras/models/change_logging.py:47 extras/models/staging.py:69 +msgid "action" +msgstr "action" + +#: extras/models/change_logging.py:81 +msgid "pre-change data" +msgstr "données de pré-modification" + +#: extras/models/change_logging.py:87 +msgid "post-change data" +msgstr "données après modification" + +#: extras/models/change_logging.py:101 +msgid "object change" +msgstr "changement d'objet" + +#: extras/models/change_logging.py:102 +msgid "object changes" +msgstr "modifications d'objets" + +#: extras/models/change_logging.py:118 +#, python-brace-format +msgid "Change logging is not supported for this object type ({type})." +msgstr "" +"La journalisation des modifications n'est pas prise en charge pour ce type " +"d'objet ({type})." + +#: extras/models/configs.py:130 +msgid "config context" +msgstr "contexte de configuration" + +#: extras/models/configs.py:131 +msgid "config contexts" +msgstr "contextes de configuration" + +#: extras/models/configs.py:149 extras/models/configs.py:205 +msgid "JSON data must be in object form. Example:" +msgstr "Les données JSON doivent être sous forme d'objet. Exemple :" + +#: extras/models/configs.py:169 +msgid "" +"Local config context data takes precedence over source contexts in the final" +" rendered config context" +msgstr "" +"Les données du contexte de configuration local ont priorité sur les " +"contextes source dans le contexte de configuration final rendu" + +#: extras/models/configs.py:224 +msgid "template code" +msgstr "code du modèle" + +#: extras/models/configs.py:225 +msgid "Jinja2 template code." +msgstr "Code du modèle Jinja2." + +#: extras/models/configs.py:228 +msgid "environment parameters" +msgstr "paramètres d'environnement" + +#: extras/models/configs.py:233 +msgid "" +"Any additional" +" parameters to pass when constructing the Jinja2 environment." +msgstr "" +"N'importe lequel paramètres" +" supplémentaires à passer lors de la construction de l'environnement " +"Jinja2." + +#: extras/models/configs.py:240 +msgid "config template" +msgstr "modèle de configuration" + +#: extras/models/configs.py:241 +msgid "config templates" +msgstr "modèles de configuration" + +#: extras/models/customfields.py:72 +msgid "The object(s) to which this field applies." +msgstr "Le ou les objets auxquels ce champ s'applique." + +#: extras/models/customfields.py:79 +msgid "The type of data this custom field holds" +msgstr "Le type de données que contient ce champ personnalisé" + +#: extras/models/customfields.py:86 +msgid "The type of NetBox object this field maps to (for object fields)" +msgstr "" +"Le type d'objet NetBox auquel ce champ correspond (pour les champs d'objets)" + +#: extras/models/customfields.py:92 +msgid "Internal field name" +msgstr "Nom du champ interne" + +#: extras/models/customfields.py:96 +msgid "Only alphanumeric characters and underscores are allowed." +msgstr "" +"Seuls les caractères alphanumériques et les traits de soulignement sont " +"autorisés." + +#: extras/models/customfields.py:101 +msgid "Double underscores are not permitted in custom field names." +msgstr "" +"Les doubles soulignements ne sont pas autorisés dans les noms de champs " +"personnalisés." + +#: extras/models/customfields.py:112 +msgid "" +"Name of the field as displayed to users (if not provided, 'the field's name " +"will be used)" +msgstr "" +"Nom du champ tel qu'il est affiché aux utilisateurs (s'il n'est pas fourni, " +"« le nom du champ sera utilisé) »" + +#: extras/models/customfields.py:116 extras/models/models.py:347 +msgid "group name" +msgstr "nom du groupe" + +#: extras/models/customfields.py:119 +msgid "Custom fields within the same group will be displayed together" +msgstr "Les champs personnalisés d'un même groupe seront affichés ensemble" + +#: extras/models/customfields.py:127 +msgid "required" +msgstr "requis" + +#: extras/models/customfields.py:129 +msgid "" +"If true, this field is required when creating new objects or editing an " +"existing object." +msgstr "" +"Si c'est vrai, ce champ est obligatoire lors de la création de nouveaux " +"objets ou de la modification d'un objet existant." + +#: extras/models/customfields.py:132 +msgid "search weight" +msgstr "poids de recherche" + +#: extras/models/customfields.py:135 +msgid "" +"Weighting for search. Lower values are considered more important. Fields " +"with a search weight of zero will be ignored." +msgstr "" +"Pondération pour la recherche. Les valeurs inférieures sont considérées " +"comme plus importantes. Les champs dont le poids de recherche est nul seront" +" ignorés." + +#: extras/models/customfields.py:140 +msgid "filter logic" +msgstr "logique de filtrage" + +#: extras/models/customfields.py:144 +msgid "" +"Loose matches any instance of a given string; exact matches the entire " +"field." +msgstr "" +"Loose correspond à n'importe quelle instance d'une chaîne donnée ; " +"correspond exactement à l'ensemble du champ." + +#: extras/models/customfields.py:147 +msgid "default" +msgstr "défaut" + +#: extras/models/customfields.py:151 +msgid "" +"Default value for the field (must be a JSON value). Encapsulate strings with" +" double quotes (e.g. \"Foo\")." +msgstr "" +"Valeur par défaut pour le champ (doit être une valeur JSON). Encapsulez des " +"chaînes avec des guillemets doubles (par exemple, « Foo »)." + +#: extras/models/customfields.py:156 +msgid "display weight" +msgstr "poids de l'écran" + +#: extras/models/customfields.py:157 +msgid "Fields with higher weights appear lower in a form." +msgstr "" +"Les champs dont le poids est plus élevé apparaissent plus bas dans un " +"formulaire." + +#: extras/models/customfields.py:162 +msgid "minimum value" +msgstr "valeur minimale" + +#: extras/models/customfields.py:163 +msgid "Minimum allowed value (for numeric fields)" +msgstr "Valeur minimale autorisée (pour les champs numériques)" + +#: extras/models/customfields.py:168 +msgid "maximum value" +msgstr "valeur maximale" + +#: extras/models/customfields.py:169 +msgid "Maximum allowed value (for numeric fields)" +msgstr "Valeur maximale autorisée (pour les champs numériques)" + +#: extras/models/customfields.py:175 +msgid "validation regex" +msgstr "regex de validation" + +#: extras/models/customfields.py:177 +#, python-brace-format +msgid "" +"Regular expression to enforce on text field values. Use ^ and $ to force " +"matching of entire string. For example, ^[A-Z]{3}$ will limit " +"values to exactly three uppercase letters." +msgstr "" +"Expression régulière à appliquer aux valeurs des champs de texte. Utilisez ^" +" et $ pour forcer la mise en correspondance de la chaîne entière. Par " +"exemple, ^ [DE A À Z]{3}$ limitera les valeurs à exactement " +"trois lettres majuscules." + +#: extras/models/customfields.py:185 +msgid "choice set" +msgstr "set de choix" + +#: extras/models/customfields.py:194 +msgid "Specifies whether the custom field is displayed in the UI" +msgstr "" +"Indique si le champ personnalisé est affiché dans l'interface utilisateur" + +#: extras/models/customfields.py:201 +msgid "Specifies whether the custom field value can be edited in the UI" +msgstr "" +"Indique si la valeur du champ personnalisé peut être modifiée dans " +"l'interface utilisateur" + +#: extras/models/customfields.py:205 +msgid "is cloneable" +msgstr "est clonable" + +#: extras/models/customfields.py:206 +msgid "Replicate this value when cloning objects" +msgstr "Répliquez cette valeur lors du clonage d'objets" + +#: extras/models/customfields.py:219 +msgid "custom field" +msgstr "champ personnalisé" + +#: extras/models/customfields.py:220 +msgid "custom fields" +msgstr "champs personnalisés" + +#: extras/models/customfields.py:309 +#, python-brace-format +msgid "Invalid default value \"{value}\": {error}" +msgstr "Valeur par défaut non valide »{value}« : {error}" + +#: extras/models/customfields.py:316 +msgid "A minimum value may be set only for numeric fields" +msgstr "" +"Une valeur minimale ne peut être définie que pour les champs numériques" + +#: extras/models/customfields.py:318 +msgid "A maximum value may be set only for numeric fields" +msgstr "" +"Une valeur maximale ne peut être définie que pour les champs numériques" + +#: extras/models/customfields.py:328 +msgid "" +"Regular expression validation is supported only for text and URL fields" +msgstr "" +"La validation des expressions régulières est prise en charge uniquement pour" +" les champs de texte et d'URL" + +#: extras/models/customfields.py:338 +msgid "Selection fields must specify a set of choices." +msgstr "Les champs de sélection doivent spécifier un ensemble de choix." + +#: extras/models/customfields.py:342 +msgid "Choices may be set only on selection fields." +msgstr "Les choix ne peuvent être définis que sur les champs de sélection." + +#: extras/models/customfields.py:349 +msgid "Object fields must define an object type." +msgstr "Les champs d'objet doivent définir un type d'objet." + +#: extras/models/customfields.py:354 +#, python-brace-format +msgid "{type} fields may not define an object type." +msgstr "{type} les champs ne peuvent pas définir de type d'objet." + +#: extras/models/customfields.py:434 +msgid "True" +msgstr "Vrai" + +#: extras/models/customfields.py:435 +msgid "False" +msgstr "Faux" + +#: extras/models/customfields.py:517 +#, python-brace-format +msgid "Values must match this regex: {regex}" +msgstr "" +"Les valeurs doivent correspondre à cette expression régulière : " +"{regex}" + +#: extras/models/customfields.py:612 +msgid "Value must be a string." +msgstr "La valeur doit être une chaîne." + +#: extras/models/customfields.py:614 +#, python-brace-format +msgid "Value must match regex '{regex}'" +msgstr "La valeur doit correspondre à « regex »{regex}'" + +#: extras/models/customfields.py:619 +msgid "Value must be an integer." +msgstr "La valeur doit être un entier." + +#: extras/models/customfields.py:622 extras/models/customfields.py:637 +#, python-brace-format +msgid "Value must be at least {minimum}" +msgstr "La valeur doit être d'au moins {minimum}" + +#: extras/models/customfields.py:626 extras/models/customfields.py:641 +#, python-brace-format +msgid "Value must not exceed {maximum}" +msgstr "La valeur ne doit pas dépasser {maximum}" + +#: extras/models/customfields.py:634 +msgid "Value must be a decimal." +msgstr "La valeur doit être une décimale." + +#: extras/models/customfields.py:646 +msgid "Value must be true or false." +msgstr "La valeur doit être vraie ou fausse." + +#: extras/models/customfields.py:654 +msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." +msgstr "Les valeurs de date doivent être au format ISO 8601 (AAAA-MM-JJ)." + +#: extras/models/customfields.py:663 +msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." +msgstr "" +"Les valeurs de date et d'heure doivent être au format ISO 8601 (YYYY-MM-DD " +"HH:MM:SS)." + +#: extras/models/customfields.py:670 +#, python-brace-format +msgid "Invalid choice ({value}) for choice set {choiceset}." +msgstr "Choix non valide ({value}) pour le set de choix {choiceset}." + +#: extras/models/customfields.py:680 +#, python-brace-format +msgid "Invalid choice(s) ({value}) for choice set {choiceset}." +msgstr "Choix (s) non valide ({value}) pour le set de choix {choiceset}." + +#: extras/models/customfields.py:689 +#, python-brace-format +msgid "Value must be an object ID, not {type}" +msgstr "La valeur doit être un identifiant d'objet, et non {type}" + +#: extras/models/customfields.py:695 +#, python-brace-format +msgid "Value must be a list of object IDs, not {type}" +msgstr "La valeur doit être une liste d'identifiants d'objets, et non {type}" + +#: extras/models/customfields.py:699 +#, python-brace-format +msgid "Found invalid object ID: {id}" +msgstr "ID d'objet non valide trouvé : {id}" + +#: extras/models/customfields.py:702 +msgid "Required field cannot be empty." +msgstr "Le champ obligatoire ne peut pas être vide." + +#: extras/models/customfields.py:721 +msgid "Base set of predefined choices (optional)" +msgstr "Ensemble de base de choix prédéfinis (facultatif)" + +#: extras/models/customfields.py:733 +msgid "Choices are automatically ordered alphabetically" +msgstr "Les choix sont automatiquement classés par ordre alphabétique" + +#: extras/models/customfields.py:740 +msgid "custom field choice set" +msgstr "ensemble de choix de champs personnalisés" + +#: extras/models/customfields.py:741 +msgid "custom field choice sets" +msgstr "ensembles de choix de champs personnalisés" + +#: extras/models/customfields.py:777 +msgid "Must define base or extra choices." +msgstr "Doit définir des choix de base ou supplémentaires." + +#: extras/models/dashboard.py:19 +msgid "layout" +msgstr "disposition" + +#: extras/models/dashboard.py:23 +msgid "config" +msgstr "config" + +#: extras/models/dashboard.py:28 +msgid "dashboard" +msgstr "tableau de bord" + +#: extras/models/dashboard.py:29 +msgid "dashboards" +msgstr "tableaux de bord" + +#: extras/models/models.py:49 +msgid "object types" +msgstr "types d'objets" + +#: extras/models/models.py:50 +msgid "The object(s) to which this rule applies." +msgstr "Le ou les objets auxquels cette règle s'applique." + +#: extras/models/models.py:63 +msgid "on create" +msgstr "lors de la création" + +#: extras/models/models.py:65 +msgid "Triggers when a matching object is created." +msgstr "Se déclenche lorsqu'un objet correspondant est créé." + +#: extras/models/models.py:68 +msgid "on update" +msgstr "sur mise à jour" + +#: extras/models/models.py:70 +msgid "Triggers when a matching object is updated." +msgstr "Se déclenche lorsqu'un objet correspondant est mis à jour." + +#: extras/models/models.py:73 +msgid "on delete" +msgstr "lors de la suppression" + +#: extras/models/models.py:75 +msgid "Triggers when a matching object is deleted." +msgstr "Se déclenche lorsqu'un objet correspondant est supprimé." + +#: extras/models/models.py:78 +msgid "on job start" +msgstr "au début de la tâche" + +#: extras/models/models.py:80 +msgid "Triggers when a job for a matching object is started." +msgstr "Se déclenche lorsqu'une tâche est lancée pour un objet correspondant." + +#: extras/models/models.py:83 +msgid "on job end" +msgstr "en fin de travail" + +#: extras/models/models.py:85 +msgid "Triggers when a job for a matching object terminates." +msgstr "Se déclenche lorsqu'une tâche pour un objet correspondant se termine." + +#: extras/models/models.py:92 +msgid "conditions" +msgstr "conditions" + +#: extras/models/models.py:95 +msgid "" +"A set of conditions which determine whether the event will be generated." +msgstr "Un ensemble de conditions qui déterminent si l'événement sera généré." + +#: extras/models/models.py:103 +msgid "action type" +msgstr "type d'action" + +#: extras/models/models.py:126 +msgid "Additional data to pass to the action object" +msgstr "Données supplémentaires à transmettre à l'objet d'action" + +#: extras/models/models.py:138 +msgid "event rule" +msgstr "règle de l'événement" + +#: extras/models/models.py:139 +msgid "event rules" +msgstr "règles de l'événement" + +#: extras/models/models.py:155 +msgid "" +"At least one event type must be selected: create, update, delete, job start," +" and/or job end." +msgstr "" +"Au moins un type d'événement doit être sélectionné : création, mise à jour, " +"suppression, début et/ou fin de tâche." + +#: extras/models/models.py:196 +msgid "" +"This URL will be called using the HTTP method defined when the webhook is " +"called. Jinja2 template processing is supported with the same context as the" +" request body." +msgstr "" +"Cette URL sera appelée à l'aide de la méthode HTTP définie lors de l'appel " +"du webhook. Le traitement du modèle Jinja2 est pris en charge dans le même " +"contexte que le corps de la requête." + +#: extras/models/models.py:211 +msgid "" +"The complete list of official content types is available here." +msgstr "" +"La liste complète des types de contenu officiels est disponible ici." + +#: extras/models/models.py:216 +msgid "additional headers" +msgstr "en-têtes supplémentaires" + +#: extras/models/models.py:219 +msgid "" +"User-supplied HTTP headers to be sent with the request in addition to the " +"HTTP content type. Headers should be defined in the format Name: " +"Value. Jinja2 template processing is supported with the same context " +"as the request body (below)." +msgstr "" +"En-têtes HTTP fournis par l'utilisateur à envoyer avec la demande en plus du" +" type de contenu HTTP. Les en-têtes doivent être définis au format " +"Nom : Value. Le traitement du modèle Jinja2 est pris en charge " +"dans le même contexte que le corps de la requête (ci-dessous)." + +#: extras/models/models.py:225 +msgid "body template" +msgstr "modèle de carrosserie" + +#: extras/models/models.py:228 +msgid "" +"Jinja2 template for a custom request body. If blank, a JSON object " +"representing the change will be included. Available context data includes: " +"event, model, timestamp, " +"username, request_id, and data." +msgstr "" +"Modèle Jinja2 pour un corps de requête personnalisé. Si ce champ est vide, " +"un objet JSON représentant la modification sera inclus. Les données " +"contextuelles disponibles incluent : événement, " +"modèle, horodatage, nom " +"d'utilisateur, identifiant_demande, et " +"données." + +#: extras/models/models.py:234 +msgid "secret" +msgstr "secret" + +#: extras/models/models.py:238 +msgid "" +"When provided, the request will include a X-Hook-Signature " +"header containing a HMAC hex digest of the payload body using the secret as " +"the key. The secret is not transmitted in the request." +msgstr "" +"Lorsqu'elle sera fournie, la demande comprendra un Signature " +"X-Hook en-tête contenant un condensé hexadécimal HMAC du corps de la " +"charge utile en utilisant le secret comme clé. Le secret n'est pas transmis " +"dans la demande." + +#: extras/models/models.py:245 +msgid "Enable SSL certificate verification. Disable with caution!" +msgstr "" +"Activez la vérification des certificats SSL. Désactivez avec précaution !" + +#: extras/models/models.py:251 templates/extras/webhook.html:62 +msgid "CA File Path" +msgstr "Chemin du fichier CA" + +#: extras/models/models.py:253 +msgid "" +"The specific CA certificate file to use for SSL verification. Leave blank to" +" use the system defaults." +msgstr "" +"Le fichier de certificat CA spécifique à utiliser pour la vérification SSL. " +"Laissez ce champ vide pour utiliser les paramètres par défaut du système." + +#: extras/models/models.py:264 +msgid "webhook" +msgstr "webhook" + +#: extras/models/models.py:265 +msgid "webhooks" +msgstr "webhooks" + +#: extras/models/models.py:283 +msgid "Do not specify a CA certificate file if SSL verification is disabled." +msgstr "" +"Ne spécifiez pas de fichier de certificat CA si la vérification SSL est " +"désactivée." + +#: extras/models/models.py:323 +msgid "The object type(s) to which this link applies." +msgstr "Le ou les types d'objets auxquels ce lien s'applique." + +#: extras/models/models.py:335 +msgid "link text" +msgstr "texte du lien" + +#: extras/models/models.py:336 +msgid "Jinja2 template code for link text" +msgstr "Code modèle Jinja2 pour le texte du lien" + +#: extras/models/models.py:339 +msgid "link URL" +msgstr "URL du lien" + +#: extras/models/models.py:340 +msgid "Jinja2 template code for link URL" +msgstr "Code modèle Jinja2 pour l'URL du lien" + +#: extras/models/models.py:350 +msgid "Links with the same group will appear as a dropdown menu" +msgstr "Les liens avec le même groupe apparaîtront dans un menu déroulant" + +#: extras/models/models.py:353 +msgid "button class" +msgstr "classe de boutons" + +#: extras/models/models.py:357 +msgid "" +"The class of the first link in a group will be used for the dropdown button" +msgstr "" +"La classe du premier lien d'un groupe sera utilisée pour le bouton déroulant" + +#: extras/models/models.py:360 +msgid "new window" +msgstr "nouvelle fenêtre" + +#: extras/models/models.py:362 +msgid "Force link to open in a new window" +msgstr "Forcer l'ouverture du lien dans une nouvelle fenêtre" + +#: extras/models/models.py:371 +msgid "custom link" +msgstr "lien personnalisé" + +#: extras/models/models.py:372 +msgid "custom links" +msgstr "liens personnalisés" + +#: extras/models/models.py:419 +msgid "The object type(s) to which this template applies." +msgstr "Le ou les types d'objets auxquels ce modèle s'applique." + +#: extras/models/models.py:432 +msgid "" +"Jinja2 template code. The list of objects being exported is passed as a " +"context variable named queryset." +msgstr "" +"Code du modèle Jinja2. La liste des objets exportés est transmise sous forme" +" de variable de contexte nommée ensemble de requêtes." + +#: extras/models/models.py:440 +msgid "Defaults to text/plain; charset=utf-8" +msgstr "" +"La valeur par défaut est texte/plain ; jeu de caractères = " +"utf-8" + +#: extras/models/models.py:443 +msgid "file extension" +msgstr "extension de fichier" + +#: extras/models/models.py:446 +msgid "Extension to append to the rendered filename" +msgstr "Extension à ajouter au nom de fichier affiché" + +#: extras/models/models.py:449 +msgid "as attachment" +msgstr "en pièce jointe" + +#: extras/models/models.py:451 +msgid "Download file as attachment" +msgstr "Télécharger le fichier en pièce jointe" + +#: extras/models/models.py:460 +msgid "export template" +msgstr "modèle d'exportation" + +#: extras/models/models.py:461 +msgid "export templates" +msgstr "modèles d'exportation" + +#: extras/models/models.py:478 +#, python-brace-format +msgid "\"{name}\" is a reserved name. Please choose a different name." +msgstr "«{name}« est un nom réservé. Veuillez choisir un autre nom." + +#: extras/models/models.py:528 +msgid "The object type(s) to which this filter applies." +msgstr "Le ou les types d'objets auxquels ce filtre s'applique." + +#: extras/models/models.py:560 +msgid "shared" +msgstr "partagé" + +#: extras/models/models.py:573 +msgid "saved filter" +msgstr "filtre enregistré" + +#: extras/models/models.py:574 +msgid "saved filters" +msgstr "filtres enregistrés" + +#: extras/models/models.py:592 +msgid "Filter parameters must be stored as a dictionary of keyword arguments." +msgstr "" +"Les paramètres de filtre doivent être stockés sous la forme d'un " +"dictionnaire d'arguments de mots-clés." + +#: extras/models/models.py:620 +msgid "image height" +msgstr "hauteur de l'image" + +#: extras/models/models.py:623 +msgid "image width" +msgstr "largeur de l'image" + +#: extras/models/models.py:640 +msgid "image attachment" +msgstr "image en pièce jointe" + +#: extras/models/models.py:641 +msgid "image attachments" +msgstr "images jointes" + +#: extras/models/models.py:655 +#, python-brace-format +msgid "Image attachments cannot be assigned to this object type ({type})." +msgstr "" +"Les images jointes ne peuvent pas être attribuées à ce type d'objet " +"({type})." + +#: extras/models/models.py:718 +msgid "kind" +msgstr "sorte" + +#: extras/models/models.py:732 +msgid "journal entry" +msgstr "entrée de journal" + +#: extras/models/models.py:733 +msgid "journal entries" +msgstr "entrées de journal" + +#: extras/models/models.py:748 +#, python-brace-format +msgid "Journaling is not supported for this object type ({type})." +msgstr "" +"La journalisation n'est pas prise en charge pour ce type d'objet ({type})." + +#: extras/models/models.py:790 +msgid "bookmark" +msgstr "signet" + +#: extras/models/models.py:791 +msgid "bookmarks" +msgstr "signets" + +#: extras/models/models.py:804 +#, python-brace-format +msgid "Bookmarks cannot be assigned to this object type ({type})." +msgstr "Les signets ne peuvent pas être affectés à ce type d'objet ({type})." + +#: extras/models/reports.py:46 +msgid "report module" +msgstr "module de rapport" + +#: extras/models/reports.py:47 +msgid "report modules" +msgstr "modules de rapports" + +#: extras/models/scripts.py:46 +msgid "script module" +msgstr "module de script" + +#: extras/models/scripts.py:47 +msgid "script modules" +msgstr "modules de script" + +#: extras/models/search.py:24 +msgid "timestamp" +msgstr "horodatage" + +#: extras/models/search.py:39 +msgid "field" +msgstr "champ" + +#: extras/models/search.py:47 +msgid "value" +msgstr "valeur" + +#: extras/models/search.py:58 +msgid "cached value" +msgstr "valeur mise en cache" + +#: extras/models/search.py:59 +msgid "cached values" +msgstr "valeurs mises en cache" + +#: extras/models/staging.py:44 +msgid "branch" +msgstr "succursale" + +#: extras/models/staging.py:45 +msgid "branches" +msgstr "branches" + +#: extras/models/staging.py:97 +msgid "staged change" +msgstr "changement par étapes" + +#: extras/models/staging.py:98 +msgid "staged changes" +msgstr "modifications échelonnées" + +#: extras/models/tags.py:40 +msgid "The object type(s) to which this this tag can be applied." +msgstr "Le ou les types d'objets auxquels cette balise peut être appliquée." + +#: extras/models/tags.py:49 +msgid "tag" +msgstr "étiquette" + +#: extras/models/tags.py:50 +msgid "tags" +msgstr "balises" + +#: extras/models/tags.py:78 +msgid "tagged item" +msgstr "article étiqueté" + +#: extras/models/tags.py:79 +msgid "tagged items" +msgstr "articles étiquetés" + +#: extras/signals.py:221 +#, python-brace-format +msgid "Deletion is prevented by a protection rule: {message}" +msgstr "La suppression est empêchée par une règle de protection : {message}" + +#: extras/tables/tables.py:44 extras/tables/tables.py:119 +#: extras/tables/tables.py:143 extras/tables/tables.py:208 +#: extras/tables/tables.py:281 +msgid "Content Types" +msgstr "Types de contenu" + +#: extras/tables/tables.py:50 +msgid "Visible" +msgstr "Visible" + +#: extras/tables/tables.py:53 +msgid "Editable" +msgstr "Modifiable" + +#: extras/tables/tables.py:60 templates/extras/customfield.html:48 +msgid "Choice Set" +msgstr "Coffret Choice" + +#: extras/tables/tables.py:68 +msgid "Is Cloneable" +msgstr "Est clonable" + +#: extras/tables/tables.py:98 +msgid "Count" +msgstr "Compter" + +#: extras/tables/tables.py:101 +msgid "Order Alphabetically" +msgstr "Ordre alphabétique" + +#: extras/tables/tables.py:125 templates/extras/customlink.html:34 +msgid "New Window" +msgstr "Nouvelle fenêtre" + +#: extras/tables/tables.py:146 +msgid "As Attachment" +msgstr "En tant que pièce jointe" + +#: extras/tables/tables.py:153 extras/tables/tables.py:367 +#: extras/tables/tables.py:402 templates/core/datafile.html:32 +#: templates/dcim/device/render_config.html:23 +#: templates/extras/configcontext.html:40 +#: templates/extras/configtemplate.html:32 +#: templates/extras/exporttemplate.html:51 +#: templates/generic/bulk_import.html:30 +#: templates/virtualization/virtualmachine/render_config.html:23 +msgid "Data File" +msgstr "Fichier de données" + +#: extras/tables/tables.py:158 extras/tables/tables.py:379 +#: extras/tables/tables.py:407 +msgid "Synced" +msgstr "Synchronisé" + +#: extras/tables/tables.py:178 +msgid "Content Type" +msgstr "Type de contenu" + +#: extras/tables/tables.py:185 +msgid "Image" +msgstr "Image" + +#: extras/tables/tables.py:190 +msgid "Size (Bytes)" +msgstr "Taille (octets)" + +#: extras/tables/tables.py:233 extras/tables/tables.py:326 +#: templates/extras/customfield.html:96 templates/extras/eventrule.html:32 +#: templates/users/objectpermission.html:68 users/tables.py:83 +msgid "Object Types" +msgstr "Types d'objets" + +#: extras/tables/tables.py:255 +msgid "SSL Validation" +msgstr "Validation SSL" + +#: extras/tables/tables.py:278 +msgid "Action Type" +msgstr "Type d'action" + +#: extras/tables/tables.py:296 +msgid "Job Start" +msgstr "Début du travail" + +#: extras/tables/tables.py:299 +msgid "Job End" +msgstr "Fin du travail" + +#: extras/tables/tables.py:436 templates/account/profile.html:20 +#: templates/users/user.html:22 +msgid "Full Name" +msgstr "Nom complet" + +#: extras/tables/tables.py:453 templates/extras/objectchange.html:72 +msgid "Request ID" +msgstr "ID de demande" + +#: extras/tables/tables.py:490 +msgid "Comments (Short)" +msgstr "Commentaires (courts)" + +#: extras/validators.py:13 +#, python-format +msgid "Ensure this value is equal to %(limit_value)s." +msgstr "Assurez-vous que cette valeur est égale à %(limit_value)s." + +#: extras/validators.py:24 +#, python-format +msgid "Ensure this value does not equal %(limit_value)s." +msgstr "Assurez-vous que cette valeur n'est pas égale %(limit_value)s." + +#: extras/validators.py:35 +msgid "This field must be empty." +msgstr "Ce champ doit être vide." + +#: extras/validators.py:50 +msgid "This field must not be empty." +msgstr "Ce champ ne doit pas être vide." + +#: extras/views.py:880 +msgid "Your dashboard has been reset." +msgstr "Votre tableau de bord a été réinitialisé." + +#: ipam/api/field_serializers.py:17 +msgid "Enter a valid IPv4 or IPv6 address with optional mask." +msgstr "Entrez une adresse IPv4 ou IPv6 valide avec un masque facultatif." + +#: ipam/api/field_serializers.py:24 +#, python-brace-format +msgid "Invalid IP address format: {data}" +msgstr "Format d'adresse IP non valide : {data}" + +#: ipam/api/field_serializers.py:37 +msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." +msgstr "Entrez un préfixe IPv4 ou IPv6 valide et un masque en notation CIDR." + +#: ipam/api/field_serializers.py:44 +#, python-brace-format +msgid "Invalid IP prefix format: {data}" +msgstr "Format de préfixe IP non valide : {data}" + +#: ipam/choices.py:30 +msgid "Container" +msgstr "Récipient" + +#: ipam/choices.py:72 +msgid "DHCP" +msgstr "DHCP" + +#: ipam/choices.py:73 +msgid "SLAAC" +msgstr "SLAAC" + +#: ipam/choices.py:89 +msgid "Loopback" +msgstr "Bouclage" + +#: ipam/choices.py:90 tenancy/choices.py:18 +msgid "Secondary" +msgstr "Secondaire" + +#: ipam/choices.py:91 +msgid "Anycast" +msgstr "N'importe quel cast" + +#: ipam/choices.py:115 +msgid "Standard" +msgstr "Norme" + +#: ipam/choices.py:120 +msgid "CheckPoint" +msgstr "Point de contrôle" + +#: ipam/choices.py:123 +msgid "Cisco" +msgstr "Cisco" + +#: ipam/choices.py:137 +msgid "Plaintext" +msgstr "Texte brut" + +#: ipam/filtersets.py:47 vpn/filtersets.py:276 +msgid "Import target" +msgstr "Objectif d'importation" + +#: ipam/filtersets.py:53 vpn/filtersets.py:282 +msgid "Import target (name)" +msgstr "Cible d'importation (nom)" + +#: ipam/filtersets.py:58 vpn/filtersets.py:287 +msgid "Export target" +msgstr "Objectif d'exportation" + +#: ipam/filtersets.py:64 vpn/filtersets.py:293 +msgid "Export target (name)" +msgstr "Cible d'exportation (nom)" + +#: ipam/filtersets.py:85 +msgid "Importing VRF" +msgstr "Importation de VRF" + +#: ipam/filtersets.py:91 +msgid "Import VRF (RD)" +msgstr "Importer VRF (RD)" + +#: ipam/filtersets.py:96 +msgid "Exporting VRF" +msgstr "Exportation de fichiers VRF" + +#: ipam/filtersets.py:102 +msgid "Export VRF (RD)" +msgstr "Exporter VRF (RD)" + +#: ipam/filtersets.py:132 ipam/filtersets.py:247 ipam/forms/model_forms.py:229 +#: ipam/tables/ip.py:211 templates/ipam/prefix.html:12 +msgid "Prefix" +msgstr "Préfixe" + +#: ipam/filtersets.py:136 ipam/filtersets.py:175 ipam/filtersets.py:198 +msgid "RIR (ID)" +msgstr "RIRE (ID)" + +#: ipam/filtersets.py:142 ipam/filtersets.py:181 ipam/filtersets.py:204 +msgid "RIR (slug)" +msgstr "RIR (limace)" + +#: ipam/filtersets.py:251 +msgid "Within prefix" +msgstr "Dans le préfixe" + +#: ipam/filtersets.py:255 +msgid "Within and including prefix" +msgstr "Dans le préfixe et y compris" + +#: ipam/filtersets.py:259 +msgid "Prefixes which contain this prefix or IP" +msgstr "Préfixes contenant ce préfixe ou cette adresse IP" + +#: ipam/filtersets.py:270 ipam/filtersets.py:538 ipam/forms/bulk_edit.py:326 +#: ipam/forms/filtersets.py:191 ipam/forms/filtersets.py:317 +msgid "Mask length" +msgstr "Longueur du masque" + +#: ipam/filtersets.py:339 vpn/filtersets.py:399 +msgid "VLAN (ID)" +msgstr "VLAN (IDENTIFIANT)" + +#: ipam/filtersets.py:343 vpn/filtersets.py:394 +msgid "VLAN number (1-4094)" +msgstr "Numéro de VLAN (1-4094)" + +#: ipam/filtersets.py:437 ipam/filtersets.py:441 ipam/filtersets.py:533 +#: ipam/forms/model_forms.py:444 templates/tenancy/contact.html:54 +#: tenancy/forms/bulk_edit.py:112 +msgid "Address" +msgstr "Adresse" + +#: ipam/filtersets.py:445 +msgid "Ranges which contain this prefix or IP" +msgstr "Plages contenant ce préfixe ou cette adresse IP" + +#: ipam/filtersets.py:473 ipam/filtersets.py:529 +msgid "Parent prefix" +msgstr "Préfixe parent" + +#: ipam/filtersets.py:582 ipam/filtersets.py:812 ipam/filtersets.py:1031 +#: vpn/filtersets.py:357 +msgid "Virtual machine (name)" +msgstr "Machine virtuelle (nom)" + +#: ipam/filtersets.py:587 ipam/filtersets.py:817 ipam/filtersets.py:1025 +#: virtualization/filtersets.py:276 virtualization/filtersets.py:315 +#: vpn/filtersets.py:362 +msgid "Virtual machine (ID)" +msgstr "Machine virtuelle (ID)" + +#: ipam/filtersets.py:593 vpn/filtersets.py:97 vpn/filtersets.py:368 +msgid "Interface (name)" +msgstr "Interface (nom)" + +#: ipam/filtersets.py:598 vpn/filtersets.py:102 vpn/filtersets.py:373 +msgid "Interface (ID)" +msgstr "Interface (ID)" + +#: ipam/filtersets.py:604 vpn/filtersets.py:108 vpn/filtersets.py:379 +msgid "VM interface (name)" +msgstr "Interface de machine virtuelle (nom)" + +#: ipam/filtersets.py:609 vpn/filtersets.py:113 +msgid "VM interface (ID)" +msgstr "Interface de machine virtuelle (ID)" + +#: ipam/filtersets.py:614 +msgid "FHRP group (ID)" +msgstr "Groupe FHRP (ID)" + +#: ipam/filtersets.py:618 +msgid "Is assigned to an interface" +msgstr "Est affecté à une interface" + +#: ipam/filtersets.py:622 +msgid "Is assigned" +msgstr "Est attribué" + +#: ipam/filtersets.py:1036 +msgid "IP address (ID)" +msgstr "Adresse IP (ID)" + +#: ipam/filtersets.py:1042 ipam/models/ip.py:787 +msgid "IP address" +msgstr "Adresse IP" + +#: ipam/filtersets.py:1068 +msgid "Primary IPv4 (ID)" +msgstr "IPv4 principal (ID)" + +#: ipam/filtersets.py:1073 +msgid "Primary IPv6 (ID)" +msgstr "IPv6 principal (ID)" + +#: ipam/forms/bulk_create.py:14 +msgid "Address pattern" +msgstr "Modèle d'adresse" + +#: ipam/forms/bulk_edit.py:85 +msgid "Is private" +msgstr "Est privé" + +#: ipam/forms/bulk_edit.py:106 ipam/forms/bulk_edit.py:135 +#: ipam/forms/bulk_edit.py:160 ipam/forms/bulk_import.py:88 +#: ipam/forms/bulk_import.py:108 ipam/forms/bulk_import.py:128 +#: ipam/forms/filtersets.py:109 ipam/forms/filtersets.py:124 +#: ipam/forms/filtersets.py:147 ipam/forms/model_forms.py:93 +#: ipam/forms/model_forms.py:108 ipam/forms/model_forms.py:130 +#: ipam/forms/model_forms.py:148 ipam/models/asns.py:31 +#: ipam/models/asns.py:103 ipam/models/ip.py:70 ipam/models/ip.py:89 +#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 +#: templates/ipam/aggregate.html:19 templates/ipam/asn.html:28 +#: templates/ipam/asnrange.html:20 templates/ipam/rir.html:20 +msgid "RIR" +msgstr "RIR" + +#: ipam/forms/bulk_edit.py:168 +msgid "Date added" +msgstr "Date d'ajout" + +#: ipam/forms/bulk_edit.py:229 +msgid "Prefix length" +msgstr "Longueur du préfixe" + +#: ipam/forms/bulk_edit.py:252 ipam/forms/filtersets.py:236 +#: templates/ipam/prefix.html:86 +msgid "Is a pool" +msgstr "C'est une piscine" + +#: ipam/forms/bulk_edit.py:257 ipam/forms/bulk_edit.py:301 +#: ipam/models/ip.py:271 ipam/models/ip.py:538 +#, python-format +msgid "Treat as 100% utilized" +msgstr "Traiter comme utilisé à 100 %" + +#: ipam/forms/bulk_edit.py:349 ipam/models/ip.py:771 +msgid "DNS name" +msgstr "Nom DNS" + +#: ipam/forms/bulk_edit.py:370 ipam/forms/bulk_edit.py:569 +#: ipam/forms/bulk_import.py:393 ipam/forms/bulk_import.py:477 +#: ipam/forms/bulk_import.py:503 ipam/forms/filtersets.py:376 +#: ipam/forms/filtersets.py:511 templates/ipam/fhrpgroup.html:23 +#: templates/ipam/inc/panels/fhrp_groups.html:11 +#: templates/ipam/service.html:35 templates/ipam/servicetemplate.html:20 +msgid "Protocol" +msgstr "Protocole" + +#: ipam/forms/bulk_edit.py:377 ipam/forms/filtersets.py:383 +#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:27 +msgid "Group ID" +msgstr "ID de groupe" + +#: ipam/forms/bulk_edit.py:382 ipam/forms/filtersets.py:388 +#: wireless/forms/bulk_edit.py:67 wireless/forms/bulk_edit.py:114 +#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 +#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 +#: wireless/forms/filtersets.py:53 wireless/forms/filtersets.py:87 +msgid "Authentication type" +msgstr "Type d'authentification" + +#: ipam/forms/bulk_edit.py:387 ipam/forms/filtersets.py:392 +msgid "Authentication key" +msgstr "Clé d'authentification" + +#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:369 +#: ipam/forms/model_forms.py:455 netbox/navigation/menu.py:376 +#: templates/ipam/fhrpgroup.html:51 +#: templates/wireless/inc/authentication_attrs.html:5 +#: wireless/forms/bulk_edit.py:90 wireless/forms/bulk_edit.py:137 +#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: wireless/forms/model_forms.py:56 wireless/forms/model_forms.py:161 +msgid "Authentication" +msgstr "Authentification" + +#: ipam/forms/bulk_edit.py:414 +msgid "Minimum child VLAN VID" +msgstr "VID VLAN minimum pour enfants" + +#: ipam/forms/bulk_edit.py:420 +msgid "Maximum child VLAN VID" +msgstr "VID VLAN maximum pour enfants" + +#: ipam/forms/bulk_edit.py:428 ipam/forms/model_forms.py:527 +msgid "Scope type" +msgstr "Type de portée" + +#: ipam/forms/bulk_edit.py:489 ipam/forms/model_forms.py:600 +#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:39 +msgid "Scope" +msgstr "Champ" + +#: ipam/forms/bulk_edit.py:560 +msgid "Site & Group" +msgstr "Site et groupe" + +#: ipam/forms/bulk_edit.py:574 ipam/forms/model_forms.py:663 +#: ipam/forms/model_forms.py:697 ipam/tables/services.py:19 +#: ipam/tables/services.py:49 templates/ipam/service.html:39 +#: templates/ipam/servicetemplate.html:24 +msgid "Ports" +msgstr "Ports" + +#: ipam/forms/bulk_import.py:47 +msgid "Import route targets" +msgstr "Importer des cibles d'itinéraire" + +#: ipam/forms/bulk_import.py:53 +msgid "Export route targets" +msgstr "Cibles d'itinéraire d'exportation" + +#: ipam/forms/bulk_import.py:91 ipam/forms/bulk_import.py:111 +#: ipam/forms/bulk_import.py:131 +msgid "Assigned RIR" +msgstr "RIR attribué" + +#: ipam/forms/bulk_import.py:181 +msgid "VLAN's group (if any)" +msgstr "Le groupe du VLAN (le cas échéant)" + +#: ipam/forms/bulk_import.py:184 ipam/forms/model_forms.py:219 +#: ipam/models/vlans.py:214 ipam/tables/ip.py:254 +#: templates/ipam/prefix.html:61 templates/ipam/vlan.html:13 +#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 +#: templates/vpn/l2vpntermination_edit.html:17 +#: templates/wireless/wirelesslan.html:31 vpn/forms/bulk_import.py:299 +#: vpn/forms/filtersets.py:280 vpn/forms/model_forms.py:427 +#: wireless/forms/bulk_edit.py:54 wireless/forms/bulk_import.py:48 +#: wireless/forms/model_forms.py:49 wireless/models.py:101 +msgid "VLAN" +msgstr "VLAN" + +#: ipam/forms/bulk_import.py:307 +msgid "Parent device of assigned interface (if any)" +msgstr "Appareil parent auquel est attribuée l'interface (le cas échéant)" + +#: ipam/forms/bulk_import.py:310 ipam/forms/bulk_import.py:496 +#: ipam/forms/model_forms.py:691 virtualization/filtersets.py:282 +#: virtualization/filtersets.py:321 virtualization/forms/bulk_edit.py:199 +#: virtualization/forms/bulk_edit.py:325 +#: virtualization/forms/bulk_import.py:146 +#: virtualization/forms/bulk_import.py:207 +#: virtualization/forms/filtersets.py:204 +#: virtualization/forms/filtersets.py:240 +#: virtualization/forms/model_forms.py:291 vpn/forms/bulk_import.py:93 +#: vpn/forms/bulk_import.py:285 +msgid "Virtual machine" +msgstr "Machine virtuelle" + +#: ipam/forms/bulk_import.py:314 +msgid "Parent VM of assigned interface (if any)" +msgstr "VM parent de l'interface attribuée (le cas échéant)" + +#: ipam/forms/bulk_import.py:321 +msgid "Assigned interface" +msgstr "Interface attribuée" + +#: ipam/forms/bulk_import.py:324 +msgid "Is primary" +msgstr "Est principal" + +#: ipam/forms/bulk_import.py:325 +msgid "Make this the primary IP for the assigned device" +msgstr "Faites-en l'adresse IP principale de l'appareil attribué" + +#: ipam/forms/bulk_import.py:364 +msgid "No device or virtual machine specified; cannot set as primary IP" +msgstr "" +"Aucun périphérique ou machine virtuelle spécifié ; impossible de le définir " +"comme adresse IP principale" + +#: ipam/forms/bulk_import.py:368 +msgid "No interface specified; cannot set as primary IP" +msgstr "" +"Aucune interface spécifiée ; impossible de définir comme adresse IP " +"principale" + +#: ipam/forms/bulk_import.py:397 +msgid "Auth type" +msgstr "Type d'authentification" + +#: ipam/forms/bulk_import.py:412 +msgid "Scope type (app & model)" +msgstr "Type de scope (application et modèle)" + +#: ipam/forms/bulk_import.py:418 +#, python-brace-format +msgid "Minimum child VLAN VID (default: {minimum})" +msgstr "VID minimum du VLAN enfant (par défaut) : {minimum})" + +#: ipam/forms/bulk_import.py:424 +#, python-brace-format +msgid "Maximum child VLAN VID (default: {maximum})" +msgstr "VID VLAN enfant maximal (par défaut) : {maximum})" + +#: ipam/forms/bulk_import.py:448 +msgid "Assigned VLAN group" +msgstr "Groupe VLAN attribué" + +#: ipam/forms/bulk_import.py:479 ipam/forms/bulk_import.py:505 +msgid "IP protocol" +msgstr "Protocole IP" + +#: ipam/forms/bulk_import.py:493 +msgid "Required if not assigned to a VM" +msgstr "Obligatoire s'il n'est pas attribué à une machine virtuelle" + +#: ipam/forms/bulk_import.py:500 +msgid "Required if not assigned to a device" +msgstr "Obligatoire s'il n'est pas attribué à un appareil" + +#: ipam/forms/bulk_import.py:525 +#, python-brace-format +msgid "{ip} is not assigned to this device/VM." +msgstr "{ip} n'est pas attribué à cet appareil/à cette machine virtuelle." + +#: ipam/forms/filtersets.py:46 ipam/forms/model_forms.py:60 +#: netbox/navigation/menu.py:177 vpn/forms/model_forms.py:403 +msgid "Route Targets" +msgstr "Cibles de l'itinéraire" + +#: ipam/forms/filtersets.py:52 ipam/forms/model_forms.py:47 +#: vpn/forms/filtersets.py:221 vpn/forms/model_forms.py:390 +msgid "Import targets" +msgstr "Cibles d'importation" + +#: ipam/forms/filtersets.py:57 ipam/forms/model_forms.py:52 +#: vpn/forms/filtersets.py:226 vpn/forms/model_forms.py:395 +msgid "Export targets" +msgstr "Objectifs d'exportation" + +#: ipam/forms/filtersets.py:72 +msgid "Imported by VRF" +msgstr "Importé par VRF" + +#: ipam/forms/filtersets.py:77 +msgid "Exported by VRF" +msgstr "Exporté par VRF" + +#: ipam/forms/filtersets.py:86 ipam/tables/ip.py:89 templates/ipam/rir.html:33 +msgid "Private" +msgstr "Privé" + +#: ipam/forms/filtersets.py:104 ipam/forms/filtersets.py:186 +#: ipam/forms/filtersets.py:261 ipam/forms/filtersets.py:312 +msgid "Address family" +msgstr "Famille d'adresses" + +#: ipam/forms/filtersets.py:118 templates/ipam/asnrange.html:26 +msgid "Range" +msgstr "Gamme" + +#: ipam/forms/filtersets.py:127 +msgid "Start" +msgstr "Démarrer" + +#: ipam/forms/filtersets.py:131 +msgid "End" +msgstr "Fin" + +#: ipam/forms/filtersets.py:181 +msgid "Search within" +msgstr "Rechercher dans" + +#: ipam/forms/filtersets.py:202 ipam/forms/filtersets.py:328 +msgid "Present in VRF" +msgstr "Présent en VRF" + +#: ipam/forms/filtersets.py:243 ipam/forms/filtersets.py:282 +#, python-format +msgid "Marked as 100% utilized" +msgstr "Marqué comme étant utilisé à 100 %" + +#: ipam/forms/filtersets.py:297 +msgid "Device/VM" +msgstr "Appareil/VM" + +#: ipam/forms/filtersets.py:333 +msgid "Assigned Device" +msgstr "Appareil attribué" + +#: ipam/forms/filtersets.py:338 +msgid "Assigned VM" +msgstr "Machine virtuelle attribuée" + +#: ipam/forms/filtersets.py:352 +msgid "Assigned to an interface" +msgstr "Affecté à une interface" + +#: ipam/forms/filtersets.py:359 templates/ipam/ipaddress.html:54 +msgid "DNS Name" +msgstr "Nom DNS" + +#: ipam/forms/filtersets.py:401 ipam/forms/filtersets.py:494 +#: ipam/models/vlans.py:156 templates/ipam/vlan.html:34 +msgid "VLAN ID" +msgstr "IDENTIFIANT DE VLAN" + +#: ipam/forms/filtersets.py:433 +msgid "Minimum VID" +msgstr "VID minimum" + +#: ipam/forms/filtersets.py:439 +msgid "Maximum VID" +msgstr "VID maximum" + +#: ipam/forms/filtersets.py:516 +msgid "Port" +msgstr "Port" + +#: ipam/forms/filtersets.py:537 ipam/tables/vlans.py:191 +#: templates/ipam/ipaddress_edit.html:47 templates/ipam/service_create.html:22 +#: templates/ipam/service_edit.html:21 +#: templates/virtualization/virtualdisk.html:22 +#: templates/virtualization/virtualmachine.html:13 +#: templates/virtualization/vminterface.html:24 +#: templates/vpn/l2vpntermination_edit.html:27 +#: templates/vpn/tunneltermination.html:26 +#: virtualization/forms/filtersets.py:189 +#: virtualization/forms/filtersets.py:234 +#: virtualization/forms/model_forms.py:223 +#: virtualization/tables/virtualmachines.py:115 +#: virtualization/tables/virtualmachines.py:168 vpn/choices.py:45 +#: vpn/forms/filtersets.py:289 vpn/forms/model_forms.py:161 +#: vpn/forms/model_forms.py:172 vpn/forms/model_forms.py:269 +msgid "Virtual Machine" +msgstr "Machine virtuelle" + +#: ipam/forms/model_forms.py:113 ipam/tables/ip.py:116 +#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:39 +msgid "Aggregate" +msgstr "Agrégat" + +#: ipam/forms/model_forms.py:134 templates/ipam/asnrange.html:12 +msgid "ASN Range" +msgstr "Gamme ASN" + +#: ipam/forms/model_forms.py:230 +msgid "Site/VLAN Assignment" +msgstr "Affectation de site/VLAN" + +#: ipam/forms/model_forms.py:256 templates/ipam/iprange.html:11 +msgid "IP Range" +msgstr "Gamme IP" + +#: ipam/forms/model_forms.py:285 ipam/forms/model_forms.py:454 +#: templates/ipam/fhrpgroup.html:19 templates/ipam/ipaddress_edit.html:52 +msgid "FHRP Group" +msgstr "Groupe FHRP" + +#: ipam/forms/model_forms.py:300 +msgid "Make this the primary IP for the device/VM" +msgstr "" +"Faites-en l'adresse IP principale de l'appareil/de la machine virtuelle" + +#: ipam/forms/model_forms.py:351 +msgid "An IP address can only be assigned to a single object." +msgstr "Une adresse IP ne peut être attribuée qu'à un seul objet." + +#: ipam/forms/model_forms.py:357 ipam/models/ip.py:878 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Impossible de réattribuer l'adresse IP lorsqu'elle est désignée comme " +"adresse IP principale pour l'objet parent" + +#: ipam/forms/model_forms.py:367 +msgid "" +"Only IP addresses assigned to an interface can be designated as primary IPs." +msgstr "" +"Seules les adresses IP attribuées à une interface peuvent être désignées " +"comme adresses IP principales." + +#: ipam/forms/model_forms.py:373 +#, python-brace-format +msgid "{ip} is a network ID, which may not be assigned to an interface." +msgstr "" +"{ip} est un identifiant réseau, qui ne peut pas être attribué à une " +"interface." + +#: ipam/forms/model_forms.py:379 +#, python-brace-format +msgid "" +"{ip} is a broadcast address, which may not be assigned to an interface." +msgstr "" +"{ip} est une adresse de diffusion, qui ne peut pas être attribuée à une " +"interface." + +#: ipam/forms/model_forms.py:456 +msgid "Virtual IP Address" +msgstr "Adresse IP virtuelle" + +#: ipam/forms/model_forms.py:598 ipam/forms/model_forms.py:637 +#: ipam/tables/ip.py:250 templates/ipam/vlan_edit.html:37 +#: templates/ipam/vlangroup.html:27 +msgid "VLAN Group" +msgstr "Groupe VLAN" + +#: ipam/forms/model_forms.py:599 +msgid "Child VLANs" +msgstr "VLAN pour enfants" + +#: ipam/forms/model_forms.py:668 ipam/forms/model_forms.py:702 +msgid "" +"Comma-separated list of one or more port numbers. A range may be specified " +"using a hyphen." +msgstr "" +"Liste séparée par des virgules d'un ou de plusieurs numéros de port. Une " +"plage peut être spécifiée à l'aide d'un trait d'union." + +#: ipam/forms/model_forms.py:673 templates/ipam/servicetemplate.html:12 +msgid "Service Template" +msgstr "Modèle de service" + +#: ipam/forms/model_forms.py:724 +msgid "Service template" +msgstr "Modèle de service" + +#: ipam/models/asns.py:34 +msgid "start" +msgstr "démarrer" + +#: ipam/models/asns.py:51 +msgid "ASN range" +msgstr "Gamme ASN" + +#: ipam/models/asns.py:52 +msgid "ASN ranges" +msgstr "Gammes ASN" + +#: ipam/models/asns.py:72 +#, python-brace-format +msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." +msgstr "" +"Démarrage de l'ASN ({start}) doit être inférieur à l'ASN final ({end})." + +#: ipam/models/asns.py:104 +msgid "Regional Internet Registry responsible for this AS number space" +msgstr "Registre Internet régional responsable de cet espace numérique AS" + +#: ipam/models/asns.py:109 +msgid "16- or 32-bit autonomous system number" +msgstr "Numéro de système autonome 16 ou 32 bits" + +#: ipam/models/fhrp.py:22 +msgid "group ID" +msgstr "ID de groupe" + +#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +msgid "protocol" +msgstr "protocole" + +#: ipam/models/fhrp.py:38 wireless/models.py:27 +msgid "authentication type" +msgstr "type d'authentification" + +#: ipam/models/fhrp.py:43 +msgid "authentication key" +msgstr "clé d'authentification" + +#: ipam/models/fhrp.py:56 +msgid "FHRP group" +msgstr "Groupe FHRP" + +#: ipam/models/fhrp.py:57 +msgid "FHRP groups" +msgstr "Groupes FHRP" + +#: ipam/models/fhrp.py:93 tenancy/models/contacts.py:134 +msgid "priority" +msgstr "priorité" + +#: ipam/models/fhrp.py:113 +msgid "FHRP group assignment" +msgstr "Affectation au groupe FHRP" + +#: ipam/models/fhrp.py:114 +msgid "FHRP group assignments" +msgstr "Missions du groupe FHRP" + +#: ipam/models/ip.py:64 +msgid "private" +msgstr "privé" + +#: ipam/models/ip.py:65 +msgid "IP space managed by this RIR is considered private" +msgstr "L'espace IP géré par ce RIR est considéré comme privé" + +#: ipam/models/ip.py:71 netbox/navigation/menu.py:170 +msgid "RIRs" +msgstr "IR" + +#: ipam/models/ip.py:83 +msgid "IPv4 or IPv6 network" +msgstr "Réseau IPv4 ou IPv6" + +#: ipam/models/ip.py:90 +msgid "Regional Internet Registry responsible for this IP space" +msgstr "Registre Internet régional responsable de cet espace IP" + +#: ipam/models/ip.py:100 +msgid "date added" +msgstr "date d'ajout" + +#: ipam/models/ip.py:114 +msgid "aggregate" +msgstr "global" + +#: ipam/models/ip.py:115 +msgid "aggregates" +msgstr "agrégats" + +#: ipam/models/ip.py:131 +msgid "Cannot create aggregate with /0 mask." +msgstr "Impossible de créer un agrégat avec le masque /0." + +#: ipam/models/ip.py:143 +#, python-brace-format +msgid "" +"Aggregates cannot overlap. {prefix} is already covered by an existing " +"aggregate ({aggregate})." +msgstr "" +"Les agrégats ne peuvent pas se chevaucher. {prefix} est déjà couvert par un " +"agrégat existant ({aggregate})." + +#: ipam/models/ip.py:157 +#, python-brace-format +msgid "" +"Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " +"({aggregate})." +msgstr "" +"Les préfixes ne peuvent pas chevaucher des agrégats. {prefix} couvre un " +"agrégat existant ({aggregate})." + +#: ipam/models/ip.py:199 ipam/models/ip.py:736 vpn/models/tunnels.py:114 +msgid "role" +msgstr "rôle" + +#: ipam/models/ip.py:200 +msgid "roles" +msgstr "rôles" + +#: ipam/models/ip.py:216 ipam/models/ip.py:292 +msgid "prefix" +msgstr "préfixe" + +#: ipam/models/ip.py:217 +msgid "IPv4 or IPv6 network with mask" +msgstr "Réseau IPv4 ou IPv6 avec masque" + +#: ipam/models/ip.py:253 +msgid "Operational status of this prefix" +msgstr "État opérationnel de ce préfixe" + +#: ipam/models/ip.py:261 +msgid "The primary function of this prefix" +msgstr "La fonction principale de ce préfixe" + +#: ipam/models/ip.py:264 +msgid "is a pool" +msgstr "est une piscine" + +#: ipam/models/ip.py:266 +msgid "All IP addresses within this prefix are considered usable" +msgstr "" +"Toutes les adresses IP comprises dans ce préfixe sont considérées comme " +"utilisables" + +#: ipam/models/ip.py:269 ipam/models/ip.py:536 +msgid "mark utilized" +msgstr "marque utilisée" + +#: ipam/models/ip.py:293 +msgid "prefixes" +msgstr "préfixes" + +#: ipam/models/ip.py:316 +msgid "Cannot create prefix with /0 mask." +msgstr "Impossible de créer un préfixe avec le masque /0." + +#: ipam/models/ip.py:323 ipam/models/ip.py:854 +#, python-brace-format +msgid "VRF {vrf}" +msgstr "VRF {vrf}" + +#: ipam/models/ip.py:323 ipam/models/ip.py:854 +msgid "global table" +msgstr "tableau global" + +#: ipam/models/ip.py:325 +#, python-brace-format +msgid "Duplicate prefix found in {table}: {prefix}" +msgstr "Préfixe dupliqué trouvé dans {table}: {prefix}" + +#: ipam/models/ip.py:494 +msgid "start address" +msgstr "adresse de départ" + +#: ipam/models/ip.py:495 ipam/models/ip.py:499 ipam/models/ip.py:711 +msgid "IPv4 or IPv6 address (with mask)" +msgstr "Adresse IPv4 ou IPv6 (avec masque)" + +#: ipam/models/ip.py:498 +msgid "end address" +msgstr "adresse finale" + +#: ipam/models/ip.py:525 +msgid "Operational status of this range" +msgstr "État opérationnel de cette gamme" + +#: ipam/models/ip.py:533 +msgid "The primary function of this range" +msgstr "La principale fonction de cette gamme" + +#: ipam/models/ip.py:547 +msgid "IP range" +msgstr "plage IP" + +#: ipam/models/ip.py:548 +msgid "IP ranges" +msgstr "Gammes IP" + +#: ipam/models/ip.py:564 +msgid "Starting and ending IP address versions must match" +msgstr "Les versions des adresses IP de début et de fin doivent correspondre" + +#: ipam/models/ip.py:570 +msgid "Starting and ending IP address masks must match" +msgstr "Les masques d'adresse IP de début et de fin doivent correspondre" + +#: ipam/models/ip.py:577 +#, python-brace-format +msgid "" +"Ending address must be lower than the starting address ({start_address})" +msgstr "" +"L'adresse de fin doit être inférieure à l'adresse de départ " +"({start_address})" + +#: ipam/models/ip.py:589 +#, python-brace-format +msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" +msgstr "" +"Les adresses définies se chevauchent avec la plage {overlapping_range} en " +"VRF {vrf}" + +#: ipam/models/ip.py:598 +#, python-brace-format +msgid "Defined range exceeds maximum supported size ({max_size})" +msgstr "" +"La plage définie dépasse la taille maximale prise en charge ({max_size})" + +#: ipam/models/ip.py:710 tenancy/models/contacts.py:82 +msgid "address" +msgstr "adresse" + +#: ipam/models/ip.py:733 +msgid "The operational status of this IP" +msgstr "L'état opérationnel de cette adresse IP" + +#: ipam/models/ip.py:740 +msgid "The functional role of this IP" +msgstr "Le rôle fonctionnel de cette propriété intellectuelle" + +#: ipam/models/ip.py:764 templates/ipam/ipaddress.html:75 +msgid "NAT (inside)" +msgstr "NAT (intérieur)" + +#: ipam/models/ip.py:765 +msgid "The IP for which this address is the \"outside\" IP" +msgstr "" +"L'adresse IP pour laquelle cette adresse est l'adresse IP « extérieure »" + +#: ipam/models/ip.py:772 +msgid "Hostname or FQDN (not case-sensitive)" +msgstr "Nom d'hôte ou FQDN (pas de distinction majuscules/minuscules)" + +#: ipam/models/ip.py:788 ipam/models/services.py:94 +msgid "IP addresses" +msgstr "Adresses IP" + +#: ipam/models/ip.py:844 +msgid "Cannot create IP address with /0 mask." +msgstr "Impossible de créer une adresse IP avec le masque /0." + +#: ipam/models/ip.py:856 +#, python-brace-format +msgid "Duplicate IP address found in {table}: {ipaddress}" +msgstr "Adresse IP dupliquée trouvée dans {table}: {ipaddress}" + +#: ipam/models/ip.py:885 +msgid "Only IPv6 addresses can be assigned SLAAC status" +msgstr "Seules les adresses IPv6 peuvent se voir attribuer le statut SLAAC" + +#: ipam/models/services.py:33 +msgid "port numbers" +msgstr "numéros de port" + +#: ipam/models/services.py:59 +msgid "service template" +msgstr "modèle de service" + +#: ipam/models/services.py:60 +msgid "service templates" +msgstr "modèles de services" + +#: ipam/models/services.py:95 +msgid "The specific IP addresses (if any) to which this service is bound" +msgstr "" +"Les adresses IP spécifiques (le cas échéant) auxquelles ce service est lié" + +#: ipam/models/services.py:102 +msgid "service" +msgstr "service" + +#: ipam/models/services.py:103 +msgid "services" +msgstr "services" + +#: ipam/models/services.py:117 +msgid "" +"A service cannot be associated with both a device and a virtual machine." +msgstr "" +"Un service ne peut pas être associé à la fois à un appareil et à une machine" +" virtuelle." + +#: ipam/models/services.py:119 +msgid "" +"A service must be associated with either a device or a virtual machine." +msgstr "" +"Un service doit être associé à un appareil ou à une machine virtuelle." + +#: ipam/models/vlans.py:49 +msgid "minimum VLAN ID" +msgstr "ID de VLAN minimal" + +#: ipam/models/vlans.py:55 +msgid "Lowest permissible ID of a child VLAN" +msgstr "ID le plus bas autorisé d'un VLAN enfant" + +#: ipam/models/vlans.py:58 +msgid "maximum VLAN ID" +msgstr "ID VLAN maximal" + +#: ipam/models/vlans.py:64 +msgid "Highest permissible ID of a child VLAN" +msgstr "ID le plus élevé autorisé d'un VLAN enfant" + +#: ipam/models/vlans.py:85 +msgid "VLAN groups" +msgstr "groupes VLAN" + +#: ipam/models/vlans.py:95 +msgid "Cannot set scope_type without scope_id." +msgstr "Impossible de définir scope_type sans scope_id." + +#: ipam/models/vlans.py:97 +msgid "Cannot set scope_id without scope_type." +msgstr "Impossible de définir scope_id sans scope_type." + +#: ipam/models/vlans.py:102 +msgid "Maximum child VID must be greater than or equal to minimum child VID" +msgstr "" +"La VID maximale pour les enfants doit être supérieure ou égale à la VID " +"minimale pour les enfants" + +#: ipam/models/vlans.py:145 +msgid "The specific site to which this VLAN is assigned (if any)" +msgstr "Le site spécifique auquel ce VLAN est attribué (le cas échéant)" + +#: ipam/models/vlans.py:153 +msgid "VLAN group (optional)" +msgstr "Groupe VLAN (facultatif)" + +#: ipam/models/vlans.py:161 +msgid "Numeric VLAN ID (1-4094)" +msgstr "ID VLAN numérique (1-4094)" + +#: ipam/models/vlans.py:179 +msgid "Operational status of this VLAN" +msgstr "État opérationnel de ce VLAN" + +#: ipam/models/vlans.py:187 +msgid "The primary function of this VLAN" +msgstr "La principale fonction de ce VLAN" + +#: ipam/models/vlans.py:215 ipam/tables/ip.py:175 ipam/tables/vlans.py:78 +#: ipam/views.py:940 netbox/navigation/menu.py:181 +#: netbox/navigation/menu.py:183 +msgid "VLANs" +msgstr "VLAN" + +#: ipam/models/vlans.py:230 +#, python-brace-format +msgid "" +"VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " +"site {site}." +msgstr "" +"Le VLAN est attribué au groupe {group} (champ d'application : {scope}) ; ne " +"peut pas également être attribué au site {site}." + +#: ipam/models/vlans.py:238 +#, python-brace-format +msgid "VID must be between {minimum} and {maximum} for VLANs in group {group}" +msgstr "" +"Le VID doit être compris entre {minimum} et {maximum} pour les VLAN du " +"groupe {group}" + +#: ipam/models/vrfs.py:30 +msgid "route distinguisher" +msgstr "Distincteur d'itinéraire" + +#: ipam/models/vrfs.py:31 +msgid "Unique route distinguisher (as defined in RFC 4364)" +msgstr "Distincteur d'itinéraire unique (tel que défini dans la RFC 4364)" + +#: ipam/models/vrfs.py:42 +msgid "enforce unique space" +msgstr "renforcer un espace unique" + +#: ipam/models/vrfs.py:43 +msgid "Prevent duplicate prefixes/IP addresses within this VRF" +msgstr "Empêchez les préfixes/adresses IP dupliqués dans ce VRF" + +#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:174 +#: netbox/navigation/menu.py:176 +msgid "VRFs" +msgstr "VRF" + +#: ipam/models/vrfs.py:82 +msgid "Route target value (formatted in accordance with RFC 4360)" +msgstr "Valeur cible de l'itinéraire (formatée conformément à la RFC 4360)" + +#: ipam/models/vrfs.py:94 +msgid "route target" +msgstr "cible de l'itinéraire" + +#: ipam/models/vrfs.py:95 +msgid "route targets" +msgstr "cibles de l'itinéraire" + +#: ipam/tables/asn.py:52 +msgid "ASDOT" +msgstr "ASDOT" + +#: ipam/tables/asn.py:57 +msgid "Site Count" +msgstr "Nombre de sites" + +#: ipam/tables/asn.py:62 +msgid "Provider Count" +msgstr "Nombre de fournisseurs" + +#: ipam/tables/ip.py:94 netbox/navigation/menu.py:167 +#: netbox/navigation/menu.py:169 +msgid "Aggregates" +msgstr "Agrégats" + +#: ipam/tables/ip.py:124 +msgid "Added" +msgstr "Ajouté" + +#: ipam/tables/ip.py:127 ipam/tables/ip.py:165 ipam/tables/vlans.py:138 +#: ipam/views.py:349 netbox/navigation/menu.py:153 +#: netbox/navigation/menu.py:155 templates/ipam/vlan.html:87 +msgid "Prefixes" +msgstr "Préfixes" + +#: ipam/tables/ip.py:130 ipam/tables/ip.py:267 ipam/tables/ip.py:320 +#: ipam/tables/vlans.py:82 templates/dcim/device.html:263 +#: templates/ipam/aggregate.html:25 templates/ipam/iprange.html:32 +#: templates/ipam/prefix.html:100 +msgid "Utilization" +msgstr "Utilisation" + +#: ipam/tables/ip.py:170 netbox/navigation/menu.py:149 +msgid "IP Ranges" +msgstr "Gammes d'adresses IP" + +#: ipam/tables/ip.py:220 +msgid "Prefix (Flat)" +msgstr "Préfixe (plat)" + +#: ipam/tables/ip.py:224 templates/dcim/rack_edit.html:52 +msgid "Depth" +msgstr "Profondeur" + +#: ipam/tables/ip.py:261 +msgid "Pool" +msgstr "Piscine" + +#: ipam/tables/ip.py:264 ipam/tables/ip.py:317 +msgid "Marked Utilized" +msgstr "Marqué comme utilisé" + +#: ipam/tables/ip.py:301 +msgid "Start address" +msgstr "Adresse de départ" + +#: ipam/tables/ip.py:379 +msgid "NAT (Inside)" +msgstr "NAT (intérieur)" + +#: ipam/tables/ip.py:384 +msgid "NAT (Outside)" +msgstr "NAT (extérieur)" + +#: ipam/tables/ip.py:389 +msgid "Assigned" +msgstr "Attribué" + +#: ipam/tables/ip.py:424 templates/vpn/l2vpntermination.html:19 +#: vpn/forms/filtersets.py:235 +msgid "Assigned Object" +msgstr "Objet assigné" + +#: ipam/tables/vlans.py:68 +msgid "Scope Type" +msgstr "Type de portée" + +#: ipam/tables/vlans.py:107 ipam/tables/vlans.py:210 +#: templates/dcim/inc/interface_vlans_table.html:4 +msgid "VID" +msgstr "VIDÉO" + +#: ipam/tables/vrfs.py:30 +msgid "RD" +msgstr "RD" + +#: ipam/tables/vrfs.py:33 +msgid "Unique" +msgstr "Unique" + +#: ipam/tables/vrfs.py:36 vpn/tables/l2vpn.py:27 +msgid "Import Targets" +msgstr "Cibles d'importation" + +#: ipam/tables/vrfs.py:41 vpn/tables/l2vpn.py:32 +msgid "Export Targets" +msgstr "Objectifs d'exportation" + +#: ipam/views.py:536 +msgid "Child Prefixes" +msgstr "Préfixes pour enfants" + +#: ipam/views.py:571 +msgid "Child Ranges" +msgstr "Gammes pour enfants" + +#: ipam/views.py:868 +msgid "Related IPs" +msgstr "IP associées" + +#: ipam/views.py:1091 +msgid "Device Interfaces" +msgstr "Interfaces des appareils" + +#: ipam/views.py:1109 +msgid "VM Interfaces" +msgstr "Interfaces de machines virtuelles" + +#: netbox/config/parameters.py:22 templates/core/configrevision.html:111 +msgid "Login banner" +msgstr "Bannière de connexion" + +#: netbox/config/parameters.py:24 +msgid "Additional content to display on the login page" +msgstr "Contenu supplémentaire à afficher sur la page de connexion" + +#: netbox/config/parameters.py:33 templates/core/configrevision.html:115 +msgid "Maintenance banner" +msgstr "Bannière de maintenance" + +#: netbox/config/parameters.py:35 +msgid "Additional content to display when in maintenance mode" +msgstr "Contenu supplémentaire à afficher en mode maintenance" + +#: netbox/config/parameters.py:44 templates/core/configrevision.html:119 +msgid "Top banner" +msgstr "Bannière supérieure" + +#: netbox/config/parameters.py:46 +msgid "Additional content to display at the top of every page" +msgstr "Contenu supplémentaire à afficher en haut de chaque page" + +#: netbox/config/parameters.py:55 templates/core/configrevision.html:123 +msgid "Bottom banner" +msgstr "Bannière inférieure" + +#: netbox/config/parameters.py:57 +msgid "Additional content to display at the bottom of every page" +msgstr "Contenu supplémentaire à afficher au bas de chaque page" + +#: netbox/config/parameters.py:68 +msgid "Globally unique IP space" +msgstr "Un espace IP unique au monde" + +#: netbox/config/parameters.py:70 +msgid "Enforce unique IP addressing within the global table" +msgstr "Appliquez un adressage IP unique dans le tableau global" + +#: netbox/config/parameters.py:75 templates/core/configrevision.html:87 +msgid "Prefer IPv4" +msgstr "Préférez IPv4" + +#: netbox/config/parameters.py:77 +msgid "Prefer IPv4 addresses over IPv6" +msgstr "Préférez les adresses IPv4 à IPv6" + +#: netbox/config/parameters.py:84 +msgid "Rack unit height" +msgstr "Hauteur de l'unité de rayonnage" + +#: netbox/config/parameters.py:86 +msgid "Default unit height for rendered rack elevations" +msgstr "" +"Hauteur unitaire par défaut pour les élévations des rayonnages affichées" + +#: netbox/config/parameters.py:91 +msgid "Rack unit width" +msgstr "Largeur de l'unité de rack" + +#: netbox/config/parameters.py:93 +msgid "Default unit width for rendered rack elevations" +msgstr "" +"Largeur unitaire par défaut pour les élévations des rayonnages affichées" + +#: netbox/config/parameters.py:100 +msgid "Powerfeed voltage" +msgstr "Tension d'alimentation" + +#: netbox/config/parameters.py:102 +msgid "Default voltage for powerfeeds" +msgstr "Tension par défaut pour les alimentations" + +#: netbox/config/parameters.py:107 +msgid "Powerfeed amperage" +msgstr "Ampérage d'alimentation" + +#: netbox/config/parameters.py:109 +msgid "Default amperage for powerfeeds" +msgstr "Ampérage par défaut pour les alimentations" + +#: netbox/config/parameters.py:114 +msgid "Powerfeed max utilization" +msgstr "Utilisation maximale de Powerfeed" + +#: netbox/config/parameters.py:116 +msgid "Default max utilization for powerfeeds" +msgstr "Utilisation maximale par défaut pour les alimentations" + +#: netbox/config/parameters.py:123 templates/core/configrevision.html:99 +msgid "Allowed URL schemes" +msgstr "Schémas d'URL autorisés" + +#: netbox/config/parameters.py:128 +msgid "Permitted schemes for URLs in user-provided content" +msgstr "" +"Schémas autorisés pour les URL dans le contenu fourni par l'utilisateur" + +#: netbox/config/parameters.py:136 +msgid "Default page size" +msgstr "Taille de page par défaut" + +#: netbox/config/parameters.py:142 +msgid "Maximum page size" +msgstr "Taille de page maximale" + +#: netbox/config/parameters.py:150 templates/core/configrevision.html:151 +msgid "Custom validators" +msgstr "Validateurs personnalisés" + +#: netbox/config/parameters.py:152 +msgid "Custom validation rules (JSON)" +msgstr "Règles de validation personnalisées (JSON)" + +#: netbox/config/parameters.py:160 templates/core/configrevision.html:161 +msgid "Protection rules" +msgstr "Règles de protection" + +#: netbox/config/parameters.py:162 +msgid "Deletion protection rules (JSON)" +msgstr "Règles de protection contre la suppression (JSON)" + +#: netbox/config/parameters.py:172 +msgid "Default preferences" +msgstr "Préférences par défaut" + +#: netbox/config/parameters.py:174 +msgid "Default preferences for new users" +msgstr "Préférences par défaut pour les nouveaux utilisateurs" + +#: netbox/config/parameters.py:181 templates/core/configrevision.html:197 +msgid "Maintenance mode" +msgstr "Mode de maintenance" + +#: netbox/config/parameters.py:183 +msgid "Enable maintenance mode" +msgstr "Activer le mode maintenance" + +#: netbox/config/parameters.py:188 templates/core/configrevision.html:201 +msgid "GraphQL enabled" +msgstr "GraphQL activé" + +#: netbox/config/parameters.py:190 +msgid "Enable the GraphQL API" +msgstr "Activez l'API GraphQL" + +#: netbox/config/parameters.py:195 templates/core/configrevision.html:205 +msgid "Changelog retention" +msgstr "Conservation du journal des modifications" + +#: netbox/config/parameters.py:197 +msgid "Days to retain changelog history (set to zero for unlimited)" +msgstr "" +"Jours pendant lesquels l'historique des modifications est conservé (défini à" +" zéro pour un nombre illimité)" + +#: netbox/config/parameters.py:202 +msgid "Job result retention" +msgstr "Maintien des résultats professionnels" + +#: netbox/config/parameters.py:204 +msgid "Days to retain job result history (set to zero for unlimited)" +msgstr "" +"Jours pendant lesquels vous conservez l'historique des résultats du travail " +"(défini sur zéro pour une durée illimitée)" + +#: netbox/config/parameters.py:209 templates/core/configrevision.html:213 +msgid "Maps URL" +msgstr "URL des cartes" + +#: netbox/config/parameters.py:211 +msgid "Base URL for mapping geographic locations" +msgstr "URL de base pour cartographier les emplacements géographiques" + +#: netbox/forms/__init__.py:13 +msgid "Partial match" +msgstr "Match partiel" + +#: netbox/forms/__init__.py:14 +msgid "Exact match" +msgstr "Correspondance exacte" + +#: netbox/forms/__init__.py:15 +msgid "Starts with" +msgstr "Commence par" + +#: netbox/forms/__init__.py:16 +msgid "Ends with" +msgstr "Se termine par" + +#: netbox/forms/__init__.py:17 +msgid "Regex" +msgstr "Regex" + +#: netbox/forms/__init__.py:35 +msgid "Object type(s)" +msgstr "Type (s) d'objet" + +#: netbox/forms/base.py:66 +msgid "Id" +msgstr "Id" + +#: netbox/forms/base.py:105 +msgid "Add tags" +msgstr "Ajouter des tags" + +#: netbox/forms/base.py:110 +msgid "Remove tags" +msgstr "Supprimer les tags" + +#: netbox/models/features.py:434 +msgid "Remote data source" +msgstr "Source de données distante" + +#: netbox/models/features.py:444 +msgid "data path" +msgstr "chemin de données" + +#: netbox/models/features.py:448 +msgid "Path to remote file (relative to data source root)" +msgstr "" +"Chemin vers le fichier distant (par rapport à la racine de la source de " +"données)" + +#: netbox/models/features.py:451 +msgid "auto sync enabled" +msgstr "synchronisation automatique activée" + +#: netbox/models/features.py:453 +msgid "Enable automatic synchronization of data when the data file is updated" +msgstr "" +"Activer la synchronisation automatique des données lors de la mise à jour du" +" fichier de données" + +#: netbox/models/features.py:456 +msgid "date synced" +msgstr "date de synchronisation" + +#: netbox/navigation/menu.py:12 +msgid "Organization" +msgstr "Organisation" + +#: netbox/navigation/menu.py:20 +msgid "Site Groups" +msgstr "Groupes de sites" + +#: netbox/navigation/menu.py:28 +msgid "Rack Roles" +msgstr "Rôles des racks" + +#: netbox/navigation/menu.py:32 +msgid "Elevations" +msgstr "Élévations" + +#: netbox/navigation/menu.py:41 +msgid "Tenant Groups" +msgstr "Groupes de locataires" + +#: netbox/navigation/menu.py:48 +msgid "Contact Groups" +msgstr "Groupes de contacts" + +#: netbox/navigation/menu.py:49 templates/tenancy/contactrole.html:8 +msgid "Contact Roles" +msgstr "Rôles de contact" + +#: netbox/navigation/menu.py:50 +msgid "Contact Assignments" +msgstr "Assignations de contact" + +#: netbox/navigation/menu.py:64 +msgid "Modules" +msgstr "Modules" + +#: netbox/navigation/menu.py:65 templates/dcim/devicerole.html:8 +msgid "Device Roles" +msgstr "Rôles des appareils" + +#: netbox/navigation/menu.py:68 templates/dcim/device.html:162 +#: templates/dcim/virtualdevicecontext.html:8 +msgid "Virtual Device Contexts" +msgstr "Contextes des appareils virtuels" + +#: netbox/navigation/menu.py:76 +msgid "Manufacturers" +msgstr "Fabricants" + +#: netbox/navigation/menu.py:80 +msgid "Device Components" +msgstr "Composants de l'appareil" + +#: netbox/navigation/menu.py:92 templates/dcim/inventoryitemrole.html:8 +msgid "Inventory Item Roles" +msgstr "Rôles des articles d'inventaire" + +#: netbox/navigation/menu.py:99 netbox/navigation/menu.py:103 +msgid "Connections" +msgstr "Connexions" + +#: netbox/navigation/menu.py:105 +msgid "Cables" +msgstr "Câbles" + +#: netbox/navigation/menu.py:106 +msgid "Wireless Links" +msgstr "Liaisons sans fil" + +#: netbox/navigation/menu.py:109 +msgid "Interface Connections" +msgstr "Connexions d'interface" + +#: netbox/navigation/menu.py:114 +msgid "Console Connections" +msgstr "Connexions à la console" + +#: netbox/navigation/menu.py:119 +msgid "Power Connections" +msgstr "Connexions électriques" + +#: netbox/navigation/menu.py:135 +msgid "Wireless LAN Groups" +msgstr "Groupes LAN sans fil" + +#: netbox/navigation/menu.py:156 +msgid "Prefix & VLAN Roles" +msgstr "Préfixes et rôles VLAN" + +#: netbox/navigation/menu.py:162 +msgid "ASN Ranges" +msgstr "Gammes ASN" + +#: netbox/navigation/menu.py:184 +msgid "VLAN Groups" +msgstr "Groupes VLAN" + +#: netbox/navigation/menu.py:191 +msgid "Service Templates" +msgstr "Modèles de services" + +#: netbox/navigation/menu.py:192 templates/dcim/device.html:304 +#: templates/ipam/ipaddress.html:122 +#: templates/virtualization/virtualmachine.html:157 +msgid "Services" +msgstr "Des services" + +#: netbox/navigation/menu.py:199 +msgid "VPN" +msgstr "VPN" + +#: netbox/navigation/menu.py:203 netbox/navigation/menu.py:205 +#: vpn/tables/tunnels.py:24 +msgid "Tunnels" +msgstr "Tunnels" + +#: netbox/navigation/menu.py:206 templates/vpn/tunnelgroup.html:8 +msgid "Tunnel Groups" +msgstr "Groupes de tunnels" + +#: netbox/navigation/menu.py:207 +msgid "Tunnel Terminations" +msgstr "Terminaisons de tunnels" + +#: netbox/navigation/menu.py:211 netbox/navigation/menu.py:213 +#: vpn/models/l2vpn.py:64 +msgid "L2VPNs" +msgstr "VPN L2" + +#: netbox/navigation/menu.py:214 templates/vpn/l2vpn.html:57 +#: templates/vpn/tunnel.html:73 vpn/tables/tunnels.py:54 +msgid "Terminations" +msgstr "Résiliations" + +#: netbox/navigation/menu.py:220 +msgid "IKE Proposals" +msgstr "Propositions IKE" + +#: netbox/navigation/menu.py:221 templates/vpn/ikeproposal.html:42 +msgid "IKE Policies" +msgstr "Politiques IKE" + +#: netbox/navigation/menu.py:222 +msgid "IPSec Proposals" +msgstr "Propositions IPSec" + +#: netbox/navigation/menu.py:223 templates/vpn/ipsecproposal.html:38 +msgid "IPSec Policies" +msgstr "Politiques IPSec" + +#: netbox/navigation/menu.py:224 templates/vpn/ikepolicy.html:39 +#: templates/vpn/ipsecpolicy.html:26 +msgid "IPSec Profiles" +msgstr "Profils IPSec" + +#: netbox/navigation/menu.py:231 templates/dcim/device_edit.html:78 +msgid "Virtualization" +msgstr "Virtualisation" + +#: netbox/navigation/menu.py:235 netbox/navigation/menu.py:237 +#: virtualization/views.py:186 +msgid "Virtual Machines" +msgstr "Machines virtuelles" + +#: netbox/navigation/menu.py:239 +#: templates/virtualization/virtualmachine.html:177 +#: templates/virtualization/virtualmachine/base.html:32 +#: templates/virtualization/virtualmachine_list.html:21 +#: virtualization/tables/virtualmachines.py:90 virtualization/views.py:389 +msgid "Virtual Disks" +msgstr "Disques virtuels" + +#: netbox/navigation/menu.py:246 +msgid "Cluster Types" +msgstr "Types de clusters" + +#: netbox/navigation/menu.py:247 +msgid "Cluster Groups" +msgstr "Groupes de clusters" + +#: netbox/navigation/menu.py:261 +msgid "Circuit Types" +msgstr "Types de circuits" + +#: netbox/navigation/menu.py:265 netbox/navigation/menu.py:267 +msgid "Providers" +msgstr "Prestataires" + +#: netbox/navigation/menu.py:268 templates/circuits/provider.html:53 +msgid "Provider Accounts" +msgstr "Comptes des fournisseurs" + +#: netbox/navigation/menu.py:269 +msgid "Provider Networks" +msgstr "Réseaux de fournisseurs" + +#: netbox/navigation/menu.py:283 +msgid "Power Panels" +msgstr "Panneaux d'alimentation" + +#: netbox/navigation/menu.py:294 +msgid "Configurations" +msgstr "Configurations" + +#: netbox/navigation/menu.py:296 +msgid "Config Contexts" +msgstr "Contextes de configuration" + +#: netbox/navigation/menu.py:297 +msgid "Config Templates" +msgstr "Modèles de configuration" + +#: netbox/navigation/menu.py:304 netbox/navigation/menu.py:308 +msgid "Customization" +msgstr "Personnalisation" + +#: netbox/navigation/menu.py:310 +#: templates/circuits/circuittermination_edit.html:53 +#: templates/dcim/cable_edit.html:77 templates/dcim/device_edit.html:103 +#: templates/dcim/inventoryitem_edit.html:102 templates/dcim/rack_edit.html:81 +#: templates/dcim/virtualchassis_add.html:31 +#: templates/dcim/virtualchassis_edit.html:41 +#: templates/generic/bulk_edit.html:92 templates/htmx/form.html:32 +#: templates/inc/panels/custom_fields.html:7 +#: templates/ipam/ipaddress_bulk_add.html:35 +#: templates/ipam/ipaddress_edit.html:88 templates/ipam/service_create.html:75 +#: templates/ipam/service_edit.html:62 templates/ipam/vlan_edit.html:63 +#: templates/tenancy/contactassignment_edit.html:31 +#: templates/vpn/l2vpntermination_edit.html:51 +msgid "Custom Fields" +msgstr "Champs personnalisés" + +#: netbox/navigation/menu.py:311 +msgid "Custom Field Choices" +msgstr "Choix de champs personnalisés" + +#: netbox/navigation/menu.py:312 +msgid "Custom Links" +msgstr "Liens personnalisés" + +#: netbox/navigation/menu.py:313 +msgid "Export Templates" +msgstr "Modèles d'exportation" + +#: netbox/navigation/menu.py:314 +msgid "Saved Filters" +msgstr "Filtres enregistrés" + +#: netbox/navigation/menu.py:316 +msgid "Image Attachments" +msgstr "Pièces jointes à des images" + +#: netbox/navigation/menu.py:320 +msgid "Reports & Scripts" +msgstr "Rapports et scripts" + +#: netbox/navigation/menu.py:340 +msgid "Operations" +msgstr "Opérations" + +#: netbox/navigation/menu.py:344 +msgid "Integrations" +msgstr "Intégrations" + +#: netbox/navigation/menu.py:346 +msgid "Data Sources" +msgstr "Sources de données" + +#: netbox/navigation/menu.py:347 +msgid "Event Rules" +msgstr "Règles de l'événement" + +#: netbox/navigation/menu.py:348 +msgid "Webhooks" +msgstr "Webhooks" + +#: netbox/navigation/menu.py:352 netbox/navigation/menu.py:356 +#: netbox/views/generic/feature_views.py:151 +#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +msgid "Jobs" +msgstr "Emplois" + +#: netbox/navigation/menu.py:362 +msgid "Logging" +msgstr "Journalisation" + +#: netbox/navigation/menu.py:364 +msgid "Journal Entries" +msgstr "Entrées de journal" + +#: netbox/navigation/menu.py:365 templates/extras/objectchange.html:8 +#: templates/extras/objectchange_list.html:4 +msgid "Change Log" +msgstr "Journal des modifications" + +#: netbox/navigation/menu.py:372 templates/inc/profile_button.html:18 +msgid "Admin" +msgstr "Administrateur" + +#: netbox/navigation/menu.py:381 templates/users/group.html:27 +#: users/forms/model_forms.py:242 users/forms/model_forms.py:255 +#: users/forms/model_forms.py:309 users/tables.py:105 +msgid "Users" +msgstr "Utilisateurs" + +#: netbox/navigation/menu.py:404 users/forms/model_forms.py:182 +#: users/forms/model_forms.py:195 users/forms/model_forms.py:314 +#: users/tables.py:35 users/tables.py:109 +msgid "Groups" +msgstr "Groupes" + +#: netbox/navigation/menu.py:426 templates/account/base.html:21 +#: templates/inc/profile_button.html:39 +msgid "API Tokens" +msgstr "Jetons d'API" + +#: netbox/navigation/menu.py:433 users/forms/model_forms.py:188 +#: users/forms/model_forms.py:197 users/forms/model_forms.py:248 +#: users/forms/model_forms.py:256 +msgid "Permissions" +msgstr "Autorisations" + +#: netbox/navigation/menu.py:445 +msgid "Current Config" +msgstr "Config actuelle" + +#: netbox/navigation/menu.py:451 +msgid "Config Revisions" +msgstr "Révisions de configuration" + +#: netbox/navigation/menu.py:491 templates/500.html:35 +#: templates/account/preferences.html:29 +msgid "Plugins" +msgstr "Plug-ins" + +#: netbox/preferences.py:17 +msgid "Color mode" +msgstr "Mode couleur" + +#: netbox/preferences.py:25 +msgid "Page length" +msgstr "Longueur de page" + +#: netbox/preferences.py:27 +msgid "The default number of objects to display per page" +msgstr "Le nombre d'objets par défaut à afficher par page" + +#: netbox/preferences.py:31 +msgid "Paginator placement" +msgstr "Emplacement du paginateur" + +#: netbox/preferences.py:37 +msgid "Where the paginator controls will be displayed relative to a table" +msgstr "" +"Où les commandes du paginateur seront affichées par rapport à un tableau" + +#: netbox/preferences.py:43 +msgid "Data format" +msgstr "Format des données" + +#: netbox/tables/columns.py:175 +msgid "Toggle all" +msgstr "Tout afficher" + +#: netbox/tables/columns.py:277 templates/inc/profile_button.html:56 +msgid "Toggle Dropdown" +msgstr "Basculer vers le menu déroulant" + +#: netbox/tables/columns.py:542 templates/core/job.html:40 +msgid "Error" +msgstr "Erreur" + +#: netbox/tables/tables.py:243 templates/generic/bulk_import.html:115 +msgid "Field" +msgstr "Champ" + +#: netbox/tables/tables.py:246 +msgid "Value" +msgstr "Valeur" + +#: netbox/tables/tables.py:259 +msgid "No results found" +msgstr "Aucun résultat trouvé" + +#: netbox/tests/dummy_plugin/navigation.py:29 +msgid "Dummy Plugin" +msgstr "Plugin Dummy" + +#: netbox/views/generic/feature_views.py:38 +msgid "Changelog" +msgstr "Journal des modifications" + +#: netbox/views/generic/feature_views.py:91 +msgid "Journal" +msgstr "Journal" + +#: templates/403.html:4 +msgid "Access Denied" +msgstr "Accès refusé" + +#: templates/403.html:9 +msgid "You do not have permission to access this page" +msgstr "Vous n'êtes pas autorisé à accéder à cette page" + +#: templates/404.html:4 +msgid "Page Not Found" +msgstr "Page non trouvée" + +#: templates/404.html:9 +msgid "The requested page does not exist" +msgstr "La page demandée n'existe pas" + +#: templates/500.html:7 templates/500.html:18 +msgid "Server Error" +msgstr "Erreur du serveur" + +#: templates/500.html:23 +msgid "There was a problem with your request. Please contact an administrator" +msgstr "" +"Il y a eu un problème avec votre demande. Veuillez contacter un " +"administrateur" + +#: templates/500.html:28 +msgid "The complete exception is provided below" +msgstr "L'exception complète est fournie ci-dessous" + +#: templates/500.html:33 +msgid "Python version" +msgstr "Version Python" + +#: templates/500.html:34 +msgid "NetBox version" +msgstr "Version NetBox" + +#: templates/500.html:36 +msgid "None installed" +msgstr "Aucun n'est installé" + +#: templates/500.html:39 +msgid "If further assistance is required, please post to the" +msgstr "" +"Si une assistance supplémentaire est requise, veuillez envoyer un message au" + +#: templates/500.html:39 +msgid "NetBox discussion forum" +msgstr "Forum de discussion NetBox" + +#: templates/500.html:39 +msgid "on GitHub" +msgstr "sur GitHub" + +#: templates/500.html:42 templates/base/40x.html:17 +msgid "Home Page" +msgstr "Page d'accueil" + +#: templates/account/base.html:7 templates/inc/profile_button.html:24 +#: vpn/forms/bulk_edit.py:256 vpn/forms/filtersets.py:186 +#: vpn/forms/model_forms.py:372 +msgid "Profile" +msgstr "Profil" + +#: templates/account/base.html:13 templates/inc/profile_button.html:34 +msgid "Preferences" +msgstr "Préférences" + +#: templates/account/password.html:5 +msgid "Change Password" +msgstr "Modifier le mot de passe" + +#: templates/account/password.html:17 templates/account/preferences.html:82 +#: templates/core/configrevision_restore.html:80 +#: templates/dcim/devicebay_populate.html:34 +#: templates/dcim/virtualchassis_add_member.html:24 +#: templates/dcim/virtualchassis_edit.html:104 +#: templates/extras/object_journal.html:26 templates/extras/script.html:36 +#: templates/generic/bulk_add_component.html:55 +#: templates/generic/bulk_delete.html:46 templates/generic/bulk_edit.html:125 +#: templates/generic/bulk_import.html:53 templates/generic/bulk_import.html:75 +#: templates/generic/bulk_import.html:97 templates/generic/bulk_remove.html:42 +#: templates/generic/bulk_rename.html:44 +#: templates/generic/confirmation_form.html:20 +#: templates/generic/object_edit.html:76 templates/htmx/delete_form.html:53 +#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:31 +#: templates/virtualization/cluster_add_devices.html:30 +msgid "Cancel" +msgstr "Annuler" + +#: templates/account/password.html:18 templates/account/preferences.html:83 +#: templates/dcim/devicebay_populate.html:35 +#: templates/dcim/virtualchassis_add_member.html:26 +#: templates/dcim/virtualchassis_edit.html:106 +#: templates/extras/dashboard/widget_add.html:26 +#: templates/extras/dashboard/widget_config.html:19 +#: templates/extras/object_journal.html:27 +#: templates/generic/object_edit.html:66 +#: utilities/templates/helpers/applied_filters.html:16 +#: utilities/templates/helpers/table_config_form.html:40 +msgid "Save" +msgstr "Sauver" + +#: templates/account/preferences.html:41 +msgid "Table Configurations" +msgstr "Configurations des tables" + +#: templates/account/preferences.html:46 +msgid "Clear table preferences" +msgstr "Effacer les préférences du tableau" + +#: templates/account/preferences.html:53 +msgid "Toggle All" +msgstr "Tout afficher" + +#: templates/account/preferences.html:55 +msgid "Table" +msgstr "Tableau" + +#: templates/account/preferences.html:56 +msgid "Ordering" +msgstr "Commander" + +#: templates/account/preferences.html:57 +msgid "Columns" +msgstr "Colonnes" + +#: templates/account/preferences.html:76 templates/dcim/cable_trace.html:113 +#: templates/extras/object_configcontext.html:55 +msgid "None found" +msgstr "Aucun n'a été trouvé" + +#: templates/account/profile.html:6 +msgid "User Profile" +msgstr "Profil utilisateur" + +#: templates/account/profile.html:12 +msgid "Account Details" +msgstr "Détails du compte" + +#: templates/account/profile.html:30 templates/tenancy/contact.html:44 +#: templates/users/user.html:26 tenancy/forms/bulk_edit.py:108 +msgid "Email" +msgstr "Courrier électronique" + +#: templates/account/profile.html:34 templates/users/user.html:30 +msgid "Account Created" +msgstr "Compte créé" + +#: templates/account/profile.html:38 templates/users/user.html:42 +msgid "Superuser" +msgstr "Superutilisateur" + +#: templates/account/profile.html:42 +msgid "Admin Access" +msgstr "Accès administrateur" + +#: templates/account/profile.html:51 templates/users/objectpermission.html:86 +#: templates/users/user.html:51 +msgid "Assigned Groups" +msgstr "Groupes assignés" + +#: templates/account/profile.html:56 +#: templates/circuits/circuit_terminations_swap.html:18 +#: templates/circuits/circuit_terminations_swap.html:26 +#: templates/circuits/inc/circuit_termination.html:154 +#: templates/dcim/devicebay.html:66 +#: templates/dcim/inc/panels/inventory_items.html:37 +#: templates/dcim/interface.html:306 templates/dcim/modulebay.html:79 +#: templates/extras/configcontext.html:73 templates/extras/eventrule.html:84 +#: templates/extras/htmx/script_result.html:54 +#: templates/extras/object_configcontext.html:28 +#: templates/extras/objectchange.html:128 +#: templates/extras/objectchange.html:145 templates/extras/webhook.html:79 +#: templates/extras/webhook.html:91 templates/inc/panel_table.html:12 +#: templates/inc/panels/comments.html:12 +#: templates/ipam/inc/panels/fhrp_groups.html:43 templates/users/group.html:32 +#: templates/users/group.html:42 templates/users/objectpermission.html:81 +#: templates/users/objectpermission.html:91 templates/users/user.html:56 +#: templates/users/user.html:66 +msgid "None" +msgstr "Aucune" + +#: templates/account/profile.html:66 templates/users/user.html:76 +msgid "Recent Activity" +msgstr "Activité récente" + +#: templates/account/token.html:8 templates/account/token_list.html:6 +msgid "My API Tokens" +msgstr "Mes jetons d'API" + +#: templates/account/token.html:11 templates/account/token.html:19 +#: templates/users/token.html:6 templates/users/token.html:14 +#: users/forms/filtersets.py:121 +msgid "Token" +msgstr "Jeton" + +#: templates/account/token.html:40 templates/users/token.html:32 +#: users/forms/bulk_edit.py:87 +msgid "Write enabled" +msgstr "Écriture activée" + +#: templates/account/token.html:52 templates/users/token.html:44 +msgid "Last used" +msgstr "Dernière utilisation" + +#: templates/account/token_list.html:12 +msgid "Add a Token" +msgstr "Ajouter un jeton" + +#: templates/admin/index.html:10 +msgid "System" +msgstr "Système" + +#: templates/admin/index.html:14 +msgid "Background Tasks" +msgstr "Tâches d'arrière-plan" + +#: templates/admin/index.html:19 +msgid "Installed plugins" +msgstr "Plug-ins installés" + +#: templates/base/base.html:28 templates/extras/admin/plugins_list.html:8 +#: templates/home.html:24 +msgid "Home" +msgstr "Accueil" + +#: templates/base/layout.html:27 templates/base/layout.html:37 +#: templates/login.html:34 +msgid "NetBox logo" +msgstr "Logo NetBox" + +#: templates/base/layout.html:76 +msgid "Debug mode is enabled" +msgstr "Le mode de débogage est activé" + +#: templates/base/layout.html:77 +msgid "" +"Performance may be limited. Debugging should never be enabled on a " +"production system" +msgstr "" +"Les performances peuvent être limitées. Le débogage ne doit jamais être " +"activé sur un système de production" + +#: templates/base/layout.html:83 +msgid "Maintenance Mode" +msgstr "Mode de maintenance" + +#: templates/base/layout.html:134 +msgid "Docs" +msgstr "Docs" + +#: templates/base/layout.html:139 templates/rest_framework/api.html:10 +msgid "REST API" +msgstr "API REST" + +#: templates/base/layout.html:144 +msgid "REST API documentation" +msgstr "Documentation de l'API REST" + +#: templates/base/layout.html:150 +msgid "GraphQL API" +msgstr "API GraphQL" + +#: templates/base/layout.html:156 +msgid "Source Code" +msgstr "Code source" + +#: templates/base/layout.html:161 +msgid "Community" +msgstr "Communauté" + +#: templates/base/sidenav.html:12 templates/base/sidenav.html:17 +msgid "NetBox Logo" +msgstr "Logo NetBox" + +#: templates/circuits/circuit.html:48 +msgid "Install Date" +msgstr "Date d'installation" + +#: templates/circuits/circuit.html:52 +msgid "Termination Date" +msgstr "Date de résiliation" + +#: templates/circuits/circuit_terminations_swap.html:4 +msgid "Swap Circuit Terminations" +msgstr "Terminaisons du circuit d'échange" + +#: templates/circuits/circuit_terminations_swap.html:8 +#, python-format +msgid "Swap these terminations for circuit %(circuit)s?" +msgstr "Remplacez ces terminaisons par un circuit %(circuit)s?" + +#: templates/circuits/circuit_terminations_swap.html:14 +msgid "A side" +msgstr "Un côté" + +#: templates/circuits/circuit_terminations_swap.html:22 +msgid "Z side" +msgstr "Côté Z" + +#: templates/circuits/circuittermination_edit.html:9 +#: templates/circuits/inc/circuit_termination.html:81 +#: templates/dcim/frontport.html:128 templates/dcim/interface.html:199 +#: templates/dcim/rearport.html:118 +msgid "Circuit Termination" +msgstr "Terminaison du circuit" + +#: templates/circuits/circuittermination_edit.html:41 +msgid "Termination Details" +msgstr "Détails de résiliation" + +#: templates/circuits/circuittype.html:10 +msgid "Add Circuit" +msgstr "Ajouter un circuit" + +#: templates/circuits/inc/circuit_termination.html:9 +#: templates/dcim/devicetype/component_templates.html:30 +#: templates/dcim/manufacturer.html:11 +#: templates/dcim/moduletype/component_templates.html:30 +#: templates/generic/bulk_add_component.html:8 +#: templates/users/objectpermission.html:41 +#: utilities/templates/buttons/add.html:4 +#: utilities/templates/helpers/table_config_form.html:20 +msgid "Add" +msgstr "Ajouter" + +#: templates/circuits/inc/circuit_termination.html:14 +#: templates/circuits/inc/circuit_termination.html:63 +#: templates/dcim/devicetype/component_templates.html:21 +#: templates/dcim/inc/panels/inventory_items.html:24 +#: templates/dcim/moduletype/component_templates.html:21 +#: templates/dcim/powerpanel.html:61 templates/generic/object_edit.html:29 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +#: templates/ipam/inc/panels/fhrp_groups.html:30 +#: utilities/templates/buttons/edit.html:3 +msgid "Edit" +msgstr "Modifier" + +#: templates/circuits/inc/circuit_termination.html:17 +msgid "Swap" +msgstr "Échange" + +#: templates/circuits/inc/circuit_termination.html:26 +#, python-format +msgid "Termination %(side)s" +msgstr "Résiliation %(side)s" + +#: templates/circuits/inc/circuit_termination.html:42 +#: templates/dcim/cable.html:70 templates/dcim/cable.html:76 +#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:76 +msgid "Termination" +msgstr "Résiliation" + +#: templates/circuits/inc/circuit_termination.html:46 +#: templates/dcim/consoleport.html:62 templates/dcim/consoleserverport.html:62 +#: templates/dcim/powerfeed.html:122 +msgid "Marked as connected" +msgstr "Marqué comme connecté" + +#: templates/circuits/inc/circuit_termination.html:48 +msgid "to" +msgstr "pour" + +#: templates/circuits/inc/circuit_termination.html:58 +#: templates/circuits/inc/circuit_termination.html:59 +#: templates/dcim/frontport.html:87 +#: templates/dcim/inc/connection_endpoints.html:7 +#: templates/dcim/interface.html:160 templates/dcim/rearport.html:83 +msgid "Trace" +msgstr "Trace" + +#: templates/circuits/inc/circuit_termination.html:62 +msgid "Edit cable" +msgstr "Modifier le câble" + +#: templates/circuits/inc/circuit_termination.html:67 +msgid "Remove cable" +msgstr "Retirez le câble" + +#: templates/circuits/inc/circuit_termination.html:68 +#: templates/dcim/bulk_disconnect.html:5 +#: templates/dcim/device/consoleports.html:12 +#: templates/dcim/device/consoleserverports.html:12 +#: templates/dcim/device/frontports.html:12 +#: templates/dcim/device/interfaces.html:16 +#: templates/dcim/device/poweroutlets.html:12 +#: templates/dcim/device/powerports.html:12 +#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:66 +msgid "Disconnect" +msgstr "Déconnectez" + +#: templates/circuits/inc/circuit_termination.html:75 +#: templates/dcim/consoleport.html:71 templates/dcim/consoleserverport.html:71 +#: templates/dcim/frontport.html:109 templates/dcim/interface.html:186 +#: templates/dcim/interface.html:206 templates/dcim/powerfeed.html:136 +#: templates/dcim/poweroutlet.html:75 templates/dcim/poweroutlet.html:76 +#: templates/dcim/powerport.html:77 templates/dcim/rearport.html:105 +msgid "Connect" +msgstr "Connecter" + +#: templates/circuits/inc/circuit_termination.html:79 +#: templates/dcim/consoleport.html:78 templates/dcim/consoleserverport.html:78 +#: templates/dcim/frontport.html:18 templates/dcim/frontport.html:122 +#: templates/dcim/interface.html:193 templates/dcim/inventoryitem_edit.html:49 +#: templates/dcim/rearport.html:112 +msgid "Front Port" +msgstr "Port avant" + +#: templates/circuits/inc/circuit_termination.html:97 +msgid "Downstream" +msgstr "En aval" + +#: templates/circuits/inc/circuit_termination.html:98 +msgid "Upstream" +msgstr "En amont" + +#: templates/circuits/inc/circuit_termination.html:107 +msgid "Cross-Connect" +msgstr "Connexion croisée" + +#: templates/circuits/inc/circuit_termination.html:111 +msgid "Patch Panel/Port" +msgstr "Panneau de raccordement et port" + +#: templates/circuits/provider.html:11 +msgid "Add circuit" +msgstr "Ajouter un circuit" + +#: templates/circuits/provideraccount.html:17 +msgid "Provider Account" +msgstr "Compte du fournisseur" + +#: templates/core/configrevision.html:47 +msgid "Default unit height" +msgstr "Hauteur de l'unité par défaut" + +#: templates/core/configrevision.html:51 +msgid "Default unit width" +msgstr "Largeur de l'unité par défaut" + +#: templates/core/configrevision.html:63 +msgid "Default voltage" +msgstr "Tension par défaut" + +#: templates/core/configrevision.html:67 +msgid "Default amperage" +msgstr "Ampérage par défaut" + +#: templates/core/configrevision.html:71 +msgid "Default max utilization" +msgstr "Utilisation maximale par défaut" + +#: templates/core/configrevision.html:83 +msgid "Enforce global unique" +msgstr "Appliquez une approche unique au monde" + +#: templates/core/configrevision.html:135 +msgid "Paginate count" +msgstr "Nombre de pages" + +#: templates/core/configrevision.html:139 +msgid "Max page size" +msgstr "Taille de page maximale" + +#: templates/core/configrevision.html:179 +msgid "Default user preferences" +msgstr "Préférences utilisateur par défaut" + +#: templates/core/configrevision.html:209 +msgid "Job retention" +msgstr "Maintien de l'emploi" + +#: templates/core/configrevision.html:221 +msgid "Comment" +msgstr "Commentaire" + +#: templates/core/configrevision_restore.html:8 +#: templates/core/configrevision_restore.html:43 +#: templates/core/configrevision_restore.html:79 +msgid "Restore" +msgstr "Restaurer" + +#: templates/core/configrevision_restore.html:21 +msgid "Config revisions" +msgstr "Révisions de configuration" + +#: templates/core/configrevision_restore.html:54 +msgid "Parameter" +msgstr "Paramètre" + +#: templates/core/configrevision_restore.html:55 +msgid "Current Value" +msgstr "Valeur actuelle" + +#: templates/core/configrevision_restore.html:56 +msgid "New Value" +msgstr "Nouvelle valeur" + +#: templates/core/configrevision_restore.html:66 +msgid "Changed" +msgstr "Modifié" + +#: templates/core/datafile.html:47 +msgid "Last Updated" +msgstr "Dernière mise à jour" + +#: templates/core/datafile.html:51 templates/ipam/iprange.html:28 +#: templates/virtualization/virtualdisk.html:30 +msgid "Size" +msgstr "Taille" + +#: templates/core/datafile.html:52 +msgid "bytes" +msgstr "octets" + +#: templates/core/datafile.html:55 +msgid "SHA256 Hash" +msgstr "Hachage SHA256" + +#: templates/core/datasource.html:14 templates/core/datasource.html:20 +#: utilities/templates/buttons/sync.html:5 +msgid "Sync" +msgstr "Synchroniser" + +#: templates/core/datasource.html:51 +msgid "Last synced" +msgstr "Dernière synchronisation" + +#: templates/core/datasource.html:86 +msgid "Backend" +msgstr "Backend" + +#: templates/core/datasource.html:102 +msgid "No parameters defined" +msgstr "Aucun paramètre défini" + +#: templates/core/datasource.html:118 +msgid "Files" +msgstr "Dossiers" + +#: templates/core/job.html:21 +msgid "Job" +msgstr "Emploi" + +#: templates/core/job.html:45 templates/extras/journalentry.html:29 +msgid "Created By" +msgstr "Créé par" + +#: templates/core/job.html:54 +msgid "Scheduling" +msgstr "Planification" + +#: templates/core/job.html:66 +#, python-format +msgid "every %(interval)s seconds" +msgstr "chaque %(interval)s secondes" + +#: templates/dcim/bulk_disconnect.html:9 +#, python-format +msgid "" +"Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" +msgstr "" +"Êtes-vous sûr de vouloir les déconnecter %(count)s %(obj_type_plural)s?" + +#: templates/dcim/cable_edit.html:12 +msgid "A Side" +msgstr "Un côté" + +#: templates/dcim/cable_edit.html:29 +msgid "B Side" +msgstr "Côté B" + +#: templates/dcim/cable_trace.html:6 +#, python-format +msgid "Cable Trace for %(object_type)s %(object)s" +msgstr "Cable Trace pour %(object_type)s %(object)s" + +#: templates/dcim/cable_trace.html:21 templates/dcim/inc/rack_elevation.html:7 +msgid "Download SVG" +msgstr "Télécharger SVG" + +#: templates/dcim/cable_trace.html:27 +msgid "Asymmetric Path" +msgstr "Trajectoire asymétrique" + +#: templates/dcim/cable_trace.html:28 +msgid "The nodes below have no links and result in an asymmetric path" +msgstr "" +"Les nœuds ci-dessous n'ont aucun lien et génèrent un chemin asymétrique" + +#: templates/dcim/cable_trace.html:35 +msgid "Path split" +msgstr "Parcours divisé" + +#: templates/dcim/cable_trace.html:36 +msgid "Select a node below to continue" +msgstr "Sélectionnez un nœud ci-dessous pour continuer" + +#: templates/dcim/cable_trace.html:52 +msgid "Trace Completed" +msgstr "Trace terminée" + +#: templates/dcim/cable_trace.html:55 +msgid "Total segments" +msgstr "Nombre total de segments" + +#: templates/dcim/cable_trace.html:59 +msgid "Total length" +msgstr "Longueur totale" + +#: templates/dcim/cable_trace.html:74 +msgid "No paths found" +msgstr "Aucun chemin trouvé" + +#: templates/dcim/cable_trace.html:83 +msgid "Related Paths" +msgstr "Chemins associés" + +#: templates/dcim/cable_trace.html:89 +msgid "Origin" +msgstr "Origine" + +#: templates/dcim/cable_trace.html:90 +msgid "Destination" +msgstr "Destination" + +#: templates/dcim/cable_trace.html:91 +msgid "Segments" +msgstr "Segments" + +#: templates/dcim/cable_trace.html:104 +msgid "Incomplete" +msgstr "Incomplet" + +#: templates/dcim/component_list.html:14 +msgid "Rename Selected" +msgstr "Renommer la sélection" + +#: templates/dcim/consoleport.html:67 templates/dcim/consoleserverport.html:67 +#: templates/dcim/frontport.html:105 templates/dcim/interface.html:182 +#: templates/dcim/poweroutlet.html:73 templates/dcim/powerport.html:73 +msgid "Not Connected" +msgstr "Non connecté" + +#: templates/dcim/consoleport.html:75 templates/dcim/consoleserverport.html:18 +#: templates/dcim/frontport.html:116 templates/dcim/inventoryitem_edit.html:44 +msgid "Console Server Port" +msgstr "Port du serveur de consoles" + +#: templates/dcim/device.html:35 +msgid "Highlight device" +msgstr "Surligner l'appareil" + +#: templates/dcim/device.html:57 +msgid "Not racked" +msgstr "Non rincé" + +#: templates/dcim/device.html:64 templates/dcim/site.html:96 +msgid "GPS Coordinates" +msgstr "Coordonnées GPS" + +#: templates/dcim/device.html:70 templates/dcim/site.html:102 +msgid "Map It" +msgstr "Cartographiez-le" + +#: templates/dcim/device.html:110 templates/dcim/inventoryitem.html:57 +#: templates/dcim/module.html:79 templates/dcim/modulebay.html:73 +#: templates/dcim/rack.html:62 +msgid "Asset Tag" +msgstr "Étiquette d'actif" + +#: templates/dcim/device.html:153 +msgid "View Virtual Chassis" +msgstr "Afficher le châssis virtuel" + +#: templates/dcim/device.html:170 +msgid "Create VDC" +msgstr "Créer un VDC" + +#: templates/dcim/device.html:179 templates/dcim/device_edit.html:64 +#: virtualization/forms/model_forms.py:226 +msgid "Management" +msgstr "Gestion" + +#: templates/dcim/device.html:200 templates/dcim/device.html:216 +#: templates/virtualization/virtualmachine.html:56 +#: templates/virtualization/virtualmachine.html:72 +msgid "NAT for" +msgstr "NAT pour" + +#: templates/dcim/device.html:202 templates/dcim/device.html:218 +#: templates/virtualization/virtualmachine.html:58 +#: templates/virtualization/virtualmachine.html:74 +msgid "NAT" +msgstr "NAT" + +#: templates/dcim/device.html:254 templates/dcim/rack.html:70 +msgid "Power Utilization" +msgstr "Utilisation de l'énergie" + +#: templates/dcim/device.html:259 +msgid "Input" +msgstr "Entrée" + +#: templates/dcim/device.html:260 +msgid "Outlets" +msgstr "Prises" + +#: templates/dcim/device.html:261 +msgid "Allocated" +msgstr "Alloué" + +#: templates/dcim/device.html:270 templates/dcim/device.html:272 +#: templates/dcim/device.html:288 templates/dcim/powerfeed.html:70 +msgid "VA" +msgstr "VA" + +#: templates/dcim/device.html:282 +msgctxt "Leg of a power feed" +msgid "Leg" +msgstr "Jambe" + +#: templates/dcim/device.html:312 +#: templates/virtualization/virtualmachine.html:165 +msgid "Add a service" +msgstr "Ajouter un service" + +#: templates/dcim/device.html:319 templates/dcim/rack.html:77 +#: templates/dcim/rack_edit.html:38 +msgid "Dimensions" +msgstr "Dimensions" + +#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 +#: templates/dcim/devicetype/base.html:18 templates/dcim/module.html:18 +#: templates/dcim/moduletype/base.html:18 +#: templates/virtualization/virtualmachine/base.html:22 +#: templates/virtualization/virtualmachine_list.html:8 +msgid "Add Components" +msgstr "Ajouter des composants" + +#: templates/dcim/device/consoleports.html:24 +msgid "Add Console Ports" +msgstr "Ajouter des ports de console" + +#: templates/dcim/device/consoleserverports.html:24 +msgid "Add Console Server Ports" +msgstr "Ajouter des ports au serveur de consoles" + +#: templates/dcim/device/devicebays.html:10 +msgid "Add Device Bays" +msgstr "Ajouter des baies pour appareils" + +#: templates/dcim/device/frontports.html:24 +msgid "Add Front Ports" +msgstr "Ajouter des ports frontaux" + +#: templates/dcim/device/inc/interface_table_controls.html:9 +msgid "Hide Enabled" +msgstr "Masquer activé" + +#: templates/dcim/device/inc/interface_table_controls.html:10 +msgid "Hide Disabled" +msgstr "Masquer les désactivés" + +#: templates/dcim/device/inc/interface_table_controls.html:11 +msgid "Hide Virtual" +msgstr "Masquer le virtuel" + +#: templates/dcim/device/inc/interface_table_controls.html:12 +msgid "Hide Disconnected" +msgstr "Masquer les déconnectés" + +#: templates/dcim/device/interfaces.html:28 +msgid "Add Interfaces" +msgstr "Ajouter des interfaces" + +#: templates/dcim/device/inventory.html:10 +#: templates/dcim/inc/panels/inventory_items.html:46 +msgid "Add Inventory Item" +msgstr "Ajouter un article d'inventaire" + +#: templates/dcim/device/modulebays.html:10 +msgid "Add Module Bays" +msgstr "Ajouter des baies de modules" + +#: templates/dcim/device/poweroutlets.html:24 +msgid "Add Power Outlets" +msgstr "Ajouter des prises de courant" + +#: templates/dcim/device/powerports.html:24 +msgid "Add Power Port" +msgstr "Ajouter un port d'alimentation" + +#: templates/dcim/device/rearports.html:24 +msgid "Add Rear Ports" +msgstr "Ajouter des ports arrière" + +#: templates/dcim/device/render_config.html:5 +#: templates/virtualization/virtualmachine/render_config.html:5 +msgid "Config" +msgstr "Configuration" + +#: templates/dcim/device/render_config.html:37 +#: templates/virtualization/virtualmachine/render_config.html:37 +msgid "Context Data" +msgstr "Données contextuelles" + +#: templates/dcim/device/render_config.html:57 +#: templates/virtualization/virtualmachine/render_config.html:57 +msgid "Download" +msgstr "Télécharger" + +#: templates/dcim/device/render_config.html:60 +#: templates/virtualization/virtualmachine/render_config.html:60 +msgid "Rendered Config" +msgstr "Configuration rendue" + +#: templates/dcim/device/render_config.html:65 +#: templates/virtualization/virtualmachine/render_config.html:65 +msgid "No configuration template found" +msgstr "Aucun modèle de configuration trouvé" + +#: templates/dcim/device_edit.html:44 +msgid "Parent Bay" +msgstr "Baie Parent" + +#: templates/dcim/device_edit.html:48 +#: utilities/templates/form_helpers/render_field.html:20 +msgid "Regenerate Slug" +msgstr "Régénérez la limace" + +#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:7 +#: utilities/templates/helpers/table_config_form.html:23 +msgid "Remove" +msgstr "Supprimer" + +#: templates/dcim/device_edit.html:110 +msgid "Local Config Context Data" +msgstr "Données contextuelles de configuration locales" + +#: templates/dcim/device_list.html:82 +#: templates/dcim/devicetype/component_templates.html:18 +#: templates/dcim/moduletype/component_templates.html:18 +#: templates/generic/bulk_rename.html:34 +#: templates/virtualization/virtualmachine/interfaces.html:11 +#: templates/virtualization/virtualmachine/virtual_disks.html:11 +msgid "Rename" +msgstr "Renommer" + +#: templates/dcim/devicebay.html:18 +msgid "Device Bay" +msgstr "Baie pour appareils" + +#: templates/dcim/devicebay.html:48 +msgid "Installed Device" +msgstr "Appareil installé" + +#: templates/dcim/devicebay_delete.html:6 +#, python-format +msgid "Delete device bay %(devicebay)s?" +msgstr "Supprimer la baie de l'appareil %(devicebay)s?" + +#: templates/dcim/devicebay_delete.html:11 +#, python-format +msgid "" +"Are you sure you want to delete this device bay from " +"%(device)s?" +msgstr "" +"Êtes-vous sûr de vouloir supprimer cette baie d'appareils de " +"%(device)s?" + +#: templates/dcim/devicebay_depopulate.html:6 +#, python-format +msgid "Remove %(device)s from %(device_bay)s?" +msgstr "Supprimer %(device)s à partir de %(device_bay)s?" + +#: templates/dcim/devicebay_depopulate.html:13 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from " +"%(device_bay)s?" +msgstr "" +"Êtes-vous sûr de vouloir supprimer %(device)s à partir de " +"%(device_bay)s?" + +#: templates/dcim/devicebay_populate.html:13 +msgid "Populate" +msgstr "Peupler" + +#: templates/dcim/devicebay_populate.html:22 +msgid "Bay" +msgstr "Baie" + +#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +msgid "Add Device" +msgstr "Ajouter un appareil" + +#: templates/dcim/devicerole.html:43 +msgid "VM Role" +msgstr "Rôle de la machine virtuelle" + +#: templates/dcim/devicetype.html:21 templates/dcim/moduletype.html:19 +msgid "Model Name" +msgstr "Nom du modèle" + +#: templates/dcim/devicetype.html:28 templates/dcim/moduletype.html:23 +msgid "Part Number" +msgstr "Numéro de pièce" + +#: templates/dcim/devicetype.html:40 +msgid "Height (U" +msgstr "Hauteur (U)" + +#: templates/dcim/devicetype.html:44 +msgid "Exclude From Utilization" +msgstr "Exclure de l'utilisation" + +#: templates/dcim/devicetype.html:62 +msgid "Parent/Child" +msgstr "Parent/Enfant" + +#: templates/dcim/devicetype.html:74 +msgid "Front Image" +msgstr "Image avant" + +#: templates/dcim/devicetype.html:86 +msgid "Rear Image" +msgstr "Image arrière" + +#: templates/dcim/frontport.html:57 +msgid "Rear Port Position" +msgstr "Position du port arrière" + +#: templates/dcim/frontport.html:79 templates/dcim/interface.html:150 +#: templates/dcim/poweroutlet.html:67 templates/dcim/powerport.html:67 +#: templates/dcim/rearport.html:75 +msgid "Marked as Connected" +msgstr "Marqué comme connecté" + +#: templates/dcim/frontport.html:93 templates/dcim/rearport.html:89 +msgid "Connection Status" +msgstr "État de la connexion" + +#: templates/dcim/inc/cable_termination.html:65 +msgid "No termination" +msgstr "Pas de résiliation" + +#: templates/dcim/inc/cable_toggle_buttons.html:4 +msgid "Mark Planned" +msgstr "Marquer comme prévu" + +#: templates/dcim/inc/cable_toggle_buttons.html:8 +msgid "Mark Installed" +msgstr "Marquer comme installé" + +#: templates/dcim/inc/connection_endpoints.html:13 +msgid "Path Status" +msgstr "État du chemin" + +#: templates/dcim/inc/connection_endpoints.html:18 +msgid "Not Reachable" +msgstr "Non joignable" + +#: templates/dcim/inc/connection_endpoints.html:23 +msgid "Path Endpoints" +msgstr "Points de terminaison du chemin" + +#: templates/dcim/inc/endpoint_connection.html:8 +#: templates/dcim/powerfeed.html:128 templates/dcim/rearport.html:101 +msgid "Not connected" +msgstr "Non connecté" + +#: templates/dcim/inc/interface_vlans_table.html:6 +msgid "Untagged" +msgstr "Non marqué" + +#: templates/dcim/inc/interface_vlans_table.html:37 +msgid "No VLANs Assigned" +msgstr "Aucun VLAN attribué" + +#: templates/dcim/inc/interface_vlans_table.html:44 +#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +msgid "Clear" +msgstr "Transparent" + +#: templates/dcim/inc/interface_vlans_table.html:47 +msgid "Clear All" +msgstr "Tout effacer" + +#: templates/dcim/interface.html:17 +msgid "Add Child Interface" +msgstr "Ajouter une interface enfant" + +#: templates/dcim/interface.html:51 +msgid "Speed/Duplex" +msgstr "Vitesse/Duplex" + +#: templates/dcim/interface.html:74 +msgid "PoE Mode" +msgstr "Mode PoE" + +#: templates/dcim/interface.html:78 +msgid "PoE Type" +msgstr "Type de PoE" + +#: templates/dcim/interface.html:82 +#: templates/virtualization/vminterface.html:66 +msgid "802.1Q Mode" +msgstr "Mode 802.1Q" + +#: templates/dcim/interface.html:130 +#: templates/virtualization/vminterface.html:62 +msgid "MAC Address" +msgstr "Adresse MAC" + +#: templates/dcim/interface.html:157 +msgid "Wireless Link" +msgstr "Liaison sans fil" + +#: templates/dcim/interface.html:226 vpn/choices.py:55 +msgid "Peer" +msgstr "Pair" + +#: templates/dcim/interface.html:238 +#: templates/wireless/inc/wirelesslink_interface.html:26 +msgid "Channel" +msgstr "Chaîne" + +#: templates/dcim/interface.html:247 +#: templates/wireless/inc/wirelesslink_interface.html:32 +msgid "Channel Frequency" +msgstr "Fréquence du canal" + +#: templates/dcim/interface.html:250 templates/dcim/interface.html:258 +#: templates/dcim/interface.html:269 templates/dcim/interface.html:277 +msgid "MHz" +msgstr "MHz" + +#: templates/dcim/interface.html:266 +#: templates/wireless/inc/wirelesslink_interface.html:42 +msgid "Channel Width" +msgstr "Largeur du canal" + +#: templates/dcim/interface.html:295 templates/wireless/wirelesslan.html:15 +#: templates/wireless/wirelesslink.html:24 wireless/forms/bulk_edit.py:59 +#: wireless/forms/bulk_edit.py:101 wireless/forms/filtersets.py:39 +#: wireless/forms/filtersets.py:79 wireless/models.py:81 +#: wireless/models.py:155 wireless/tables/wirelesslan.py:44 +msgid "SSID" +msgstr "SAID" + +#: templates/dcim/interface.html:316 +msgid "LAG Members" +msgstr "Membres du GAL" + +#: templates/dcim/interface.html:335 +msgid "No member interfaces" +msgstr "Aucune interface pour les membres" + +#: templates/dcim/interface.html:359 templates/ipam/fhrpgroup.html:80 +#: templates/ipam/iprange/ip_addresses.html:7 +#: templates/ipam/prefix/ip_addresses.html:7 +#: templates/virtualization/vminterface.html:96 +msgid "Add IP Address" +msgstr "Ajouter une adresse IP" + +#: templates/dcim/inventoryitem.html:25 +msgid "Parent Item" +msgstr "Article parent" + +#: templates/dcim/inventoryitem.html:49 +msgid "Part ID" +msgstr "ID de pièce" + +#: templates/dcim/inventoryitem_bulk_delete.html:5 +msgid "This will also delete all child inventory items of those listed" +msgstr "" +"Cela supprimera également tous les articles de l'inventaire pour enfants " +"parmi ceux répertoriés." + +#: templates/dcim/inventoryitem_edit.html:33 +msgid "Component Assignment" +msgstr "Affectation des composants" + +#: templates/dcim/inventoryitem_edit.html:59 +#: templates/dcim/poweroutlet.html:18 templates/dcim/powerport.html:81 +msgid "Power Outlet" +msgstr "Prise de courant" + +#: templates/dcim/location.html:17 +msgid "Add Child Location" +msgstr "Ajouter la localisation de l'enfant" + +#: templates/dcim/location.html:76 +msgid "Child Locations" +msgstr "Localisations pour enfants" + +#: templates/dcim/location.html:84 templates/dcim/site.html:137 +msgid "Add a Location" +msgstr "Ajouter un lieu" + +#: templates/dcim/location.html:98 templates/dcim/site.html:151 +msgid "Add a Device" +msgstr "Ajouter un appareil" + +#: templates/dcim/manufacturer.html:16 +msgid "Add Device Type" +msgstr "Ajouter un type d'appareil" + +#: templates/dcim/manufacturer.html:21 +msgid "Add Module Type" +msgstr "Ajouter un type de module" + +#: templates/dcim/powerfeed.html:56 +msgid "Connected Device" +msgstr "Appareil connecté" + +#: templates/dcim/powerfeed.html:66 +msgid "Utilization (Allocated" +msgstr "Utilisation (allouée)" + +#: templates/dcim/powerfeed.html:85 +msgid "Electrical Characteristics" +msgstr "Caractéristiques électriques" + +#: templates/dcim/powerfeed.html:95 +msgctxt "Abbreviation for volts" +msgid "V" +msgstr "V" + +#: templates/dcim/powerfeed.html:99 +msgctxt "Abbreviation for amperes" +msgid "A" +msgstr "UN" + +#: templates/dcim/poweroutlet.html:51 +msgid "Feed Leg" +msgstr "Patte d'alimentation" + +#: templates/dcim/powerpanel.html:77 +msgid "Add Power Feeds" +msgstr "Ajouter des sources d'alimentation" + +#: templates/dcim/powerport.html:47 +msgid "Maximum Draw" +msgstr "Tirage maximum" + +#: templates/dcim/powerport.html:51 +msgid "Allocated Draw" +msgstr "Tirage alloué" + +#: templates/dcim/rack.html:66 +msgid "Space Utilization" +msgstr "Utilisation de l'espace" + +#: templates/dcim/rack.html:96 +msgid "descending" +msgstr "descendant" + +#: templates/dcim/rack.html:96 +msgid "ascending" +msgstr "ascendant" + +#: templates/dcim/rack.html:99 +msgid "Starting Unit" +msgstr "Unité de départ" + +#: templates/dcim/rack.html:125 +msgid "Mounting Depth" +msgstr "Profondeur de montage" + +#: templates/dcim/rack.html:135 +msgid "Rack Weight" +msgstr "Poids du rack" + +#: templates/dcim/rack.html:145 templates/dcim/rack_edit.html:67 +msgid "Maximum Weight" +msgstr "Poids maximum" + +#: templates/dcim/rack.html:155 +msgid "Total Weight" +msgstr "Poids total" + +#: templates/dcim/rack.html:173 templates/dcim/rack_elevation_list.html:16 +msgid "Images and Labels" +msgstr "Images et étiquettes" + +#: templates/dcim/rack.html:174 templates/dcim/rack_elevation_list.html:17 +msgid "Images only" +msgstr "Images uniquement" + +#: templates/dcim/rack.html:175 templates/dcim/rack_elevation_list.html:18 +msgid "Labels only" +msgstr "Étiquettes uniquement" + +#: templates/dcim/rack/reservations.html:9 +msgid "Add reservation" +msgstr "Ajouter une réservation" + +#: templates/dcim/rack_edit.html:21 +msgid "Inventory Control" +msgstr "Contrôle des stocks" + +#: templates/dcim/rack_edit.html:45 +msgid "Outer Dimensions" +msgstr "Dimensions extérieures" + +#: templates/dcim/rack_edit.html:56 templates/dcim/rack_edit.html:71 +msgid "Unit" +msgstr "Unité" + +#: templates/dcim/rack_elevation_list.html:12 +msgid "View List" +msgstr "Afficher la liste" + +#: templates/dcim/rack_elevation_list.html:27 +msgid "Sort By" +msgstr "Trier par" + +#: templates/dcim/rack_elevation_list.html:77 +msgid "No Racks Found" +msgstr "Aucun support n'a été trouvé" + +#: templates/dcim/rack_list.html:8 +msgid "View Elevations" +msgstr "Afficher les élévations" + +#: templates/dcim/rackreservation.html:47 +msgid "Reservation Details" +msgstr "Détails de la réservation" + +#: templates/dcim/rackrole.html:10 +msgid "Add Rack" +msgstr "Ajouter un rack" + +#: templates/dcim/rearport.html:53 +msgid "Positions" +msgstr "Positions" + +#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +msgid "Add Site" +msgstr "Ajouter un site" + +#: templates/dcim/region.html:56 +msgid "Child Regions" +msgstr "Régions infantiles" + +#: templates/dcim/region.html:64 +msgid "Add Region" +msgstr "Ajouter une région" + +#: templates/dcim/site.html:56 +msgid "Facility" +msgstr "Facilité" + +#: templates/dcim/site.html:64 +msgid "Time Zone" +msgstr "Fuseau horaire" + +#: templates/dcim/site.html:67 +msgid "UTC" +msgstr "UTC" + +#: templates/dcim/site.html:68 +msgid "Site time" +msgstr "Heure du site" + +#: templates/dcim/site.html:75 +msgid "Physical Address" +msgstr "Adresse physique" + +#: templates/dcim/site.html:81 +msgid "Map" +msgstr "Carte" + +#: templates/dcim/site.html:92 +msgid "Shipping Address" +msgstr "Adresse de livraison" + +#: templates/dcim/sitegroup.html:56 templates/tenancy/contactgroup.html:49 +#: templates/tenancy/tenantgroup.html:58 +#: templates/wireless/wirelesslangroup.html:56 +msgid "Child Groups" +msgstr "Groupes d'enfants" + +#: templates/dcim/sitegroup.html:64 +msgid "Add Site Group" +msgstr "Ajouter un groupe de sites" + +#: templates/dcim/trace/attachment.html:5 +#: templates/extras/exporttemplate.html:37 +msgid "Attachment" +msgstr "Pièce jointe" + +#: templates/dcim/virtualchassis.html:86 +msgid "Add Member" +msgstr "Ajouter un membre" + +#: templates/dcim/virtualchassis_add.html:18 +msgid "Member Devices" +msgstr "Appareils pour les membres" + +#: templates/dcim/virtualchassis_add_member.html:6 +#, python-format +msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" +msgstr "Ajouter un nouveau membre à Virtual Chassis %(virtual_chassis)s" + +#: templates/dcim/virtualchassis_add_member.html:17 +msgid "Add New Member" +msgstr "Ajouter un nouveau membre" + +#: templates/dcim/virtualchassis_add_member.html:25 +msgid "Add Another" +msgstr "Ajouter un autre" + +#: templates/dcim/virtualchassis_edit.html:7 +#, python-format +msgid "Editing Virtual Chassis %(name)s" +msgstr "Édition d'un châssis virtuel %(name)s" + +#: templates/dcim/virtualchassis_edit.html:54 +msgid "Rack/Unit" +msgstr "Rack/unité" + +#: templates/dcim/virtualchassis_remove_member.html:5 +msgid "Remove Virtual Chassis Member" +msgstr "Supprimer un membre du châssis virtuel" + +#: templates/dcim/virtualchassis_remove_member.html:9 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from virtual " +"chassis %(name)s?" +msgstr "" +"Êtes-vous sûr de vouloir supprimer %(device)s à partir d'un" +" châssis virtuel %(name)s?" + +#: templates/dcim/virtualdevicecontext.html:29 templates/vpn/l2vpn.html:19 +msgid "Identifier" +msgstr "Identifiant" + +#: templates/exceptions/import_error.html:6 +msgid "" +"A module import error occurred during this request. Common causes include " +"the following:" +msgstr "" +"Une erreur d'importation de module s'est produite lors de cette demande. Les" +" causes les plus courantes sont les suivantes :" + +#: templates/exceptions/import_error.html:10 +msgid "Missing required packages" +msgstr "Packages requis manquants" + +#: templates/exceptions/import_error.html:11 +msgid "" +"This installation of NetBox might be missing one or more required Python " +"packages. These packages are listed in requirements.txt and " +"local_requirements.txt, and are normally installed as part of " +"the installation or upgrade process. To verify installed packages, run " +"pip freeze from the console and compare the output to the list " +"of required packages." +msgstr "" +"Il se peut qu'il manque un ou plusieurs packages Python requis à cette " +"installation de NetBox. Ces packages sont répertoriés dans " +"requirements.txt et local_requirements.txt, et " +"sont normalement installés dans le cadre du processus d'installation ou de " +"mise à niveau. Pour vérifier les packages installés, exécutez Pip " +"Freeze depuis la console et comparez la sortie à la liste des " +"packages requis." + +#: templates/exceptions/import_error.html:20 +msgid "WSGI service not restarted after upgrade" +msgstr "Le service WSGI n'a pas redémarré après la mise à niveau" + +#: templates/exceptions/import_error.html:21 +msgid "" +"If this installation has recently been upgraded, check that the WSGI service" +" (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" +" is running." +msgstr "" +"Si cette installation a récemment été mise à niveau, vérifiez que le service" +" WSGI (par exemple gunicorn ou uWSGI) a été redémarré. Cela garantit que le " +"nouveau code est en cours d'exécution." + +#: templates/exceptions/permission_error.html:6 +msgid "" +"A file permission error was detected while processing this request. Common " +"causes include the following:" +msgstr "" +"Une erreur d'autorisation de fichier a été détectée lors du traitement de " +"cette demande. Les causes les plus courantes sont les suivantes :" + +#: templates/exceptions/permission_error.html:10 +msgid "Insufficient write permission to the media root" +msgstr "Autorisation d'écriture insuffisante pour la racine du média" + +#: templates/exceptions/permission_error.html:11 +#, python-format +msgid "" +"The configured media root is %(media_root)s. Ensure that the " +"user NetBox runs as has access to write files to all locations within this " +"path." +msgstr "" +"La racine multimédia configurée est %(media_root)s. Assurez-" +"vous que l'utilisateur NetBox s'exécute et qu'il a accès pour écrire des " +"fichiers à tous les emplacements situés dans ce chemin." + +#: templates/exceptions/programming_error.html:6 +msgid "" +"A database programming error was detected while processing this request. " +"Common causes include the following:" +msgstr "" +"Une erreur de programmation de base de données a été détectée lors du " +"traitement de cette demande. Les causes les plus courantes sont les " +"suivantes :" + +#: templates/exceptions/programming_error.html:10 +msgid "Database migrations missing" +msgstr "Migration de base de données manquante" + +#: templates/exceptions/programming_error.html:11 +msgid "" +"When upgrading to a new NetBox release, the upgrade script must be run to " +"apply any new database migrations. You can run migrations manually by " +"executing python3 manage.py migrate from the command line." +msgstr "" +"Lors de la mise à niveau vers une nouvelle version de NetBox, le script de " +"mise à niveau doit être exécuté pour appliquer toute nouvelle migration de " +"base de données. Vous pouvez exécuter les migrations manuellement en " +"exécutant migrer python3 manage.py à partir de la ligne de " +"commande." + +#: templates/exceptions/programming_error.html:18 +msgid "Unsupported PostgreSQL version" +msgstr "Version de PostgreSQL non prise en charge" + +#: templates/exceptions/programming_error.html:19 +msgid "" +"Ensure that PostgreSQL version 12 or later is in use. You can check this by " +"connecting to the database using NetBox's credentials and issuing a query " +"for SELECT VERSION()." +msgstr "" +"Assurez-vous que la version 12 ou ultérieure de PostgreSQL est utilisée. " +"Vous pouvez vérifier cela en vous connectant à la base de données à l'aide " +"des informations d'identification de NetBox et en émettant une requête pour " +"SÉLECTIONNER LA VERSION ()." + +#: templates/extras/admin/plugins_list.html:4 +#: templates/extras/admin/plugins_list.html:9 +#: templates/extras/admin/plugins_list.html:13 +msgid "Installed Plugins" +msgstr "Plugins installés" + +#: templates/extras/admin/plugins_list.html:23 +msgid "Package Name" +msgstr "Nom du package" + +#: templates/extras/admin/plugins_list.html:24 +msgid "Author" +msgstr "Auteur" + +#: templates/extras/admin/plugins_list.html:25 +msgid "Author Email" +msgstr "Adresse électronique de l'auteur" + +#: templates/extras/admin/plugins_list.html:27 +#: templates/vpn/ipsecprofile.html:47 vpn/forms/bulk_edit.py:140 +#: vpn/forms/bulk_import.py:171 vpn/tables/crypto.py:61 +msgid "Version" +msgstr "Version" + +#: templates/extras/configcontext.html:46 +#: templates/extras/configtemplate.html:38 +#: templates/extras/exporttemplate.html:57 +msgid "The data file associated with this object has been deleted" +msgstr "Le fichier de données associé à cet objet a été supprimé" + +#: templates/extras/configcontext.html:55 +#: templates/extras/configtemplate.html:47 +#: templates/extras/exporttemplate.html:66 +msgid "Data Synced" +msgstr "Données synchronisées" + +#: templates/extras/configcontext_list.html:7 +#: templates/extras/configtemplate_list.html:7 +#: templates/extras/exporttemplate_list.html:7 +msgid "Sync Data" +msgstr "Synchroniser les données" + +#: templates/extras/configtemplate.html:58 +msgid "Environment Parameters" +msgstr "Paramètres de l'environnement" + +#: templates/extras/configtemplate.html:69 +#: templates/extras/exporttemplate.html:88 +msgid "Template" +msgstr "Modèle" + +#: templates/extras/customfield.html:31 templates/extras/customlink.html:22 +msgid "Group Name" +msgstr "Nom du groupe" + +#: templates/extras/customfield.html:43 +msgid "Cloneable" +msgstr "Clonable" + +#: templates/extras/customfield.html:53 +msgid "Default Value" +msgstr "Valeur par défaut" + +#: templates/extras/customfield.html:64 +msgid "Search Weight" +msgstr "Poids de recherche" + +#: templates/extras/customfield.html:74 +msgid "Filter Logic" +msgstr "Logique des filtres" + +#: templates/extras/customfield.html:78 +msgid "Display Weight" +msgstr "Poids de l'écran" + +#: templates/extras/customfield.html:82 +msgid "UI Visible" +msgstr "Interface utilisateur visible" + +#: templates/extras/customfield.html:86 +msgid "UI Editable" +msgstr "Interface utilisateur modifiable" + +#: templates/extras/customfield.html:108 +msgid "Validation Rules" +msgstr "Règles de validation" + +#: templates/extras/customfield.html:112 +msgid "Minimum Value" +msgstr "Valeur minimale" + +#: templates/extras/customfield.html:116 +msgid "Maximum Value" +msgstr "Valeur maximale" + +#: templates/extras/customfield.html:120 +msgid "Regular Expression" +msgstr "Expression régulière" + +#: templates/extras/customlink.html:30 +msgid "Button Class" +msgstr "Classe de boutons" + +#: templates/extras/customlink.html:41 templates/extras/exporttemplate.html:73 +#: templates/extras/savedfilter.html:41 +msgid "Assigned Models" +msgstr "Modèles assignés" + +#: templates/extras/customlink.html:57 +msgid "Link Text" +msgstr "Texte du lien" + +#: templates/extras/customlink.html:65 +msgid "Link URL" +msgstr "URL du lien" + +#: templates/extras/dashboard/reset.html:4 templates/home.html:63 +msgid "Reset Dashboard" +msgstr "Réinitialisation du tableau" + +#: templates/extras/dashboard/reset.html:8 +msgid "" +"This will remove all configured widgets and restore the " +"default dashboard configuration." +msgstr "" +"Cela supprimera tous widgets configurés et restauration de " +"la configuration par défaut du tableau de bord." + +#: templates/extras/dashboard/reset.html:13 +msgid "" +"This change affects only your dashboard, and will not impact other " +"users." +msgstr "" +"Ce changement concerne uniquement votre tableau de bord, et n'aura " +"aucun impact sur les autres utilisateurs." + +#: templates/extras/dashboard/widget_add.html:7 +msgid "Add a Widget" +msgstr "Ajouter un widget" + +#: templates/extras/dashboard/widgets/bookmarks.html:14 +msgid "No bookmarks have been added yet." +msgstr "Aucun favori n'a encore été ajouté." + +#: templates/extras/dashboard/widgets/objectcounts.html:15 +msgid "No permission" +msgstr "Aucune autorisation" + +#: templates/extras/dashboard/widgets/objectlist.html:6 +msgid "No permission to view this content" +msgstr "Aucune autorisation pour voir ce contenu" + +#: templates/extras/dashboard/widgets/objectlist.html:10 +msgid "Unable to load content. Invalid view name" +msgstr "Impossible de charger le contenu. Nom de vue non valide" + +#: templates/extras/dashboard/widgets/rssfeed.html:12 +msgid "No content found" +msgstr "Aucun contenu n'a été trouvé" + +#: templates/extras/dashboard/widgets/rssfeed.html:18 +msgid "There was a problem fetching the RSS feed" +msgstr "Un problème s'est produit lors de la récupération du flux RSS" + +#: templates/extras/dashboard/widgets/rssfeed.html:21 +msgid "HTTP" +msgstr "HTTP" + +#: templates/extras/eventrule.html:63 +msgid "Job start" +msgstr "Début du travail" + +#: templates/extras/eventrule.html:67 +msgid "Job end" +msgstr "Fin du travail" + +#: templates/extras/exporttemplate.html:29 +msgid "MIME Type" +msgstr "Type MIME" + +#: templates/extras/exporttemplate.html:33 +msgid "File Extension" +msgstr "Extension de fichier" + +#: templates/extras/htmx/report_result.html:9 +#: templates/extras/htmx/script_result.html:10 +msgid "Scheduled for" +msgstr "Prévu pour" + +#: templates/extras/htmx/report_result.html:14 +#: templates/extras/htmx/script_result.html:15 +msgid "Duration" +msgstr "Durée" + +#: templates/extras/htmx/report_result.html:20 +msgid "Report Methods" +msgstr "Méthodes de rapport" + +#: templates/extras/htmx/report_result.html:38 +msgid "Report Results" +msgstr "Résultats du rapport" + +#: templates/extras/htmx/report_result.html:44 +#: templates/extras/htmx/script_result.html:26 +msgid "Level" +msgstr "Niveau" + +#: templates/extras/htmx/report_result.html:46 +#: templates/extras/htmx/script_result.html:27 +msgid "Message" +msgstr "Message" + +#: templates/extras/htmx/script_result.html:21 +msgid "Script Log" +msgstr "Journal des scripts" + +#: templates/extras/htmx/script_result.html:25 +msgid "Line" +msgstr "Ligne" + +#: templates/extras/htmx/script_result.html:38 +msgid "No log output" +msgstr "Aucune sortie de journal" + +#: templates/extras/htmx/script_result.html:46 +msgid "Exec Time" +msgstr "Heure d'exécution" + +#: templates/extras/htmx/script_result.html:46 +msgctxt "Unit of time" +msgid "seconds" +msgstr "secondes" + +#: templates/extras/htmx/script_result.html:50 +msgid "Output" +msgstr "sortie" + +#: templates/extras/inc/result_pending.html:4 +msgid "Loading" +msgstr "Chargement" + +#: templates/extras/inc/result_pending.html:6 +msgid "Results pending" +msgstr "Résultats en attente" + +#: templates/extras/journalentry.html:16 +msgid "Journal Entry" +msgstr "Entrée de journal" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Change log retention" +msgstr "Modifier la conservation du journal" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "days" +msgstr "jours" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Indefinite" +msgstr "Indéfini" + +#: templates/extras/object_configcontext.html:11 +msgid "Rendered Context" +msgstr "Contexte rendu" + +#: templates/extras/object_configcontext.html:22 +msgid "Local Context" +msgstr "Contexte local" + +#: templates/extras/object_configcontext.html:34 +msgid "The local config context overwrites all source contexts" +msgstr "Le contexte de configuration local remplace tous les contextes source" + +#: templates/extras/object_configcontext.html:40 +msgid "Source Contexts" +msgstr "Contextes sources" + +#: templates/extras/object_journal.html:18 +msgid "New Journal Entry" +msgstr "Nouvelle entrée de journal" + +#: templates/extras/objectchange.html:29 +#: templates/users/objectpermission.html:45 +msgid "Change" +msgstr "Changez" + +#: templates/extras/objectchange.html:84 +msgid "Difference" +msgstr "Différence" + +#: templates/extras/objectchange.html:87 +msgid "Previous" +msgstr "Précédent" + +#: templates/extras/objectchange.html:90 +msgid "Next" +msgstr "Prochaine" + +#: templates/extras/objectchange.html:98 +msgid "Object Created" +msgstr "Objet créé" + +#: templates/extras/objectchange.html:100 +msgid "Object Deleted" +msgstr "Objet supprimé" + +#: templates/extras/objectchange.html:102 +msgid "No Changes" +msgstr "Aucune modification" + +#: templates/extras/objectchange.html:117 +msgid "Pre-Change Data" +msgstr "Données préalables à la modification" + +#: templates/extras/objectchange.html:126 +msgid "Warning: Comparing non-atomic change to previous change record" +msgstr "" +"Avertissement : Comparaison d'une modification non atomique avec " +"l'enregistrement de modification précédent" + +#: templates/extras/objectchange.html:136 +msgid "Post-Change Data" +msgstr "Données après modification" + +#: templates/extras/objectchange.html:157 +#, python-format +msgid "See All %(count)s Changes" +msgstr "Tout afficher %(count)s Changements" + +#: templates/extras/report.html:14 +msgid "This report is invalid and cannot be run." +msgstr "Ce rapport n'est pas valide et ne peut pas être exécuté." + +#: templates/extras/report.html:23 templates/extras/report_list.html:88 +msgid "Run Again" +msgstr "Exécutez à nouveau" + +#: templates/extras/report.html:25 templates/extras/report_list.html:90 +msgid "Run Report" +msgstr "Exécuter le rapport" + +#: templates/extras/report.html:36 +msgid "Last run" +msgstr "Dernière course" + +#: templates/extras/report/base.html:30 +msgid "Report" +msgstr "Rapport" + +#: templates/extras/report_list.html:48 templates/extras/script_list.html:54 +msgid "Last Run" +msgstr "Dernière course" + +#: templates/extras/report_list.html:70 templates/extras/script_list.html:77 +msgid "Never" +msgstr "Jamais" + +#: templates/extras/report_list.html:75 +msgid "Report has no test methods" +msgstr "Le rapport ne contient aucune méthode de test" + +#: templates/extras/report_list.html:76 +msgid "Invalid" +msgstr "Non valide" + +#: templates/extras/report_list.html:125 +msgid "No Reports Found" +msgstr "Aucun rapport n'a été trouvé" + +#: templates/extras/report_list.html:128 +#, python-format +msgid "" +"Get started by creating a report from " +"an uploaded file or data source." +msgstr "" +"Commencez par création d'un rapport à " +"partir d'un fichier ou d'une source de données chargé." + +#: templates/extras/script.html:13 +msgid "You do not have permission to run scripts" +msgstr "Vous n'êtes pas autorisé à exécuter des scripts" + +#: templates/extras/script.html:37 +msgid "Run Script" +msgstr "Exécuter le script" + +#: templates/extras/script_list.html:44 +#, python-format +msgid "" +"Script file at %(file_path)s could not be " +"loaded." +msgstr "" +"Fichier de script sur %(file_path)s n'a pas pu " +"être chargé." + +#: templates/extras/script_list.html:91 +msgid "No Scripts Found" +msgstr "Aucun script n'a été trouvé" + +#: templates/extras/script_list.html:94 +#, python-format +msgid "" +"Get started by creating a script from " +"an uploaded file or data source." +msgstr "" +"Commencez par création d'un script à " +"partir d'un fichier ou d'une source de données chargé." + +#: templates/extras/script_result.html:42 +msgid "Log" +msgstr "Journal" + +#: templates/extras/tag.html:35 +msgid "Tagged Items" +msgstr "Articles tagués" + +#: templates/extras/tag.html:47 +msgid "Allowed Object Types" +msgstr "Types d'objets autorisés" + +#: templates/extras/tag.html:56 +msgid "Any" +msgstr "N'importe lequel" + +#: templates/extras/tag.html:63 +msgid "Tagged Item Types" +msgstr "Types d'articles tagués" + +#: templates/extras/tag.html:89 +msgid "Tagged Objects" +msgstr "Objets balisés" + +#: templates/extras/webhook.html:33 +msgid "HTTP Method" +msgstr "Méthode HTTP" + +#: templates/extras/webhook.html:41 +msgid "HTTP Content Type" +msgstr "Type de contenu HTTP" + +#: templates/extras/webhook.html:58 +msgid "SSL Verification" +msgstr "Vérification SSL" + +#: templates/extras/webhook.html:73 +msgid "Additional Headers" +msgstr "En-têtes supplémentaires" + +#: templates/extras/webhook.html:85 +msgid "Body Template" +msgstr "Modèle de carrosserie" + +#: templates/generic/bulk_add_component.html:15 +msgid "Bulk Creation" +msgstr "Création en masse" + +#: templates/generic/bulk_add_component.html:20 +#: templates/generic/bulk_edit.html:28 +msgid "Selected Objects" +msgstr "Objets sélectionnés" + +#: templates/generic/bulk_add_component.html:46 +msgid "to Add" +msgstr "à ajouter" + +#: templates/generic/bulk_delete.html:24 +msgid "Confirm Bulk Deletion" +msgstr "Confirmer la suppression groupée" + +#: templates/generic/bulk_delete.html:26 +msgctxt "Noun" +msgid "Warning" +msgstr "Avertissement" + +#: templates/generic/bulk_delete.html:27 +#, python-format +msgid "" +"The following operation will delete %(count)s " +"%(type_plural)s. Please carefully review the objects to be deleted and " +"confirm below." +msgstr "" +"L'opération suivante supprimera %(count)s %(type_plural)s. " +"Veuillez examiner attentivement les objets à supprimer et confirmer ci-" +"dessous." + +#: templates/generic/bulk_edit.html:16 templates/generic/object_edit.html:17 +msgid "Editing" +msgstr "Édition" + +#: templates/generic/bulk_edit.html:23 +msgid "Bulk Edit" +msgstr "Modifier en bloc" + +#: templates/generic/bulk_edit.html:124 templates/generic/bulk_rename.html:42 +msgid "Apply" +msgstr "Appliquer" + +#: templates/generic/bulk_import.html:14 +msgid "Bulk Import" +msgstr "Importation en vrac" + +#: templates/generic/bulk_import.html:20 +msgid "Direct Import" +msgstr "Importation directe" + +#: templates/generic/bulk_import.html:25 +msgid "Upload File" +msgstr "Charger un fichier" + +#: templates/generic/bulk_import.html:51 templates/generic/bulk_import.html:73 +#: templates/generic/bulk_import.html:95 +msgid "Submit" +msgstr "Soumettre" + +#: templates/generic/bulk_import.html:110 +msgid "Field Options" +msgstr "Options de terrain" + +#: templates/generic/bulk_import.html:117 +msgid "Accessor" +msgstr "Accessoire" + +#: templates/generic/bulk_import.html:154 +msgid "Import Value" +msgstr "Valeur d'importation" + +#: templates/generic/bulk_import.html:181 +msgid "Format: YYYY-MM-DD" +msgstr "Format : AAAA-MM-JJ" + +#: templates/generic/bulk_import.html:183 +msgid "Specify true or false" +msgstr "Spécifiez vrai ou faux" + +#: templates/generic/bulk_import.html:195 +msgid "Required fields must be specified for all objects." +msgstr "" +"Champs obligatoires doit être spécifiée pour tous les " +"objets." + +#: templates/generic/bulk_import.html:201 +#, python-format +msgid "" +"Related objects may be referenced by any unique attribute. For example, " +"%(example)s would identify a VRF by its route distinguisher." +msgstr "" +"Les objets associés peuvent être référencés par n'importe quel attribut " +"unique. Par exemple, %(example)s identifierait un VRF grâce à " +"son identificateur d'itinéraire." + +#: templates/generic/bulk_remove.html:13 +msgid "Confirm Bulk Removal" +msgstr "Confirmer la suppression groupée" + +#: templates/generic/bulk_remove.html:15 +#, python-format +msgid "" +"Warning: The following operation will remove %(count)s " +"%(obj_type_plural)s from %(parent_obj)s." +msgstr "" +"Avertissement : L'opération suivante supprimera %(count)s " +"%(obj_type_plural)s à partir de %(parent_obj)s." + +#: templates/generic/bulk_remove.html:21 +#, python-format +msgid "" +"Please carefully review the %(obj_type_plural)s to be removed and confirm " +"below." +msgstr "" +"Veuillez lire attentivement le %(obj_type_plural)s à supprimer et à " +"confirmer ci-dessous." + +#: templates/generic/bulk_remove.html:38 +#, python-format +msgid "Delete these %(count)s %(obj_type_plural)s" +msgstr "Supprimez-les %(count)s %(obj_type_plural)s" + +#: templates/generic/bulk_rename.html:7 +msgid "Renaming" +msgstr "Renommer" + +#: templates/generic/bulk_rename.html:16 +msgid "Current Name" +msgstr "Nom actuel" + +#: templates/generic/bulk_rename.html:17 +msgid "New Name" +msgstr "Nouveau nom" + +#: templates/generic/bulk_rename.html:40 +#: utilities/templates/widgets/markdown_input.html:11 +msgid "Preview" +msgstr "Aperçu" + +#: templates/generic/confirmation_form.html:16 +msgid "Are you sure" +msgstr "Tu es sûr" + +#: templates/generic/confirmation_form.html:19 +msgid "Confirm" +msgstr "Confirmez" + +#: templates/generic/object.html:51 +msgid "ago" +msgstr "depuis" + +#: templates/generic/object_children.html:27 +#: utilities/templates/buttons/bulk_edit.html:4 +msgid "Edit Selected" +msgstr "Modifier la sélection" + +#: templates/generic/object_children.html:41 +#: utilities/templates/buttons/bulk_delete.html:4 +msgid "Delete Selected" +msgstr "Supprimer la sélection" + +#: templates/generic/object_edit.html:19 +#, python-format +msgid "Add a new %(object_type)s" +msgstr "Ajouter un nouveau %(object_type)s" + +#: templates/generic/object_edit.html:47 +msgid "View model documentation" +msgstr "Afficher la documentation du modèle" + +#: templates/generic/object_edit.html:48 +msgid "Help" +msgstr "Aide" + +#: templates/generic/object_edit.html:73 +msgid "Create & Add Another" +msgstr "Créez et ajoutez-en un autre" + +#: templates/generic/object_list.html:48 templates/search.html:13 +msgid "Results" +msgstr "Résultats" + +#: templates/generic/object_list.html:54 +msgid "Filters" +msgstr "Filtres" + +#: templates/generic/object_list.html:94 +#, python-format +msgid "" +"Select all %(count)s %(object_type_plural)s matching query" +msgstr "" +"Sélectionnez tous %(count)s %(object_type_plural)s requête " +"correspondante" + +#: templates/home.html:12 +msgid "New Release Available" +msgstr "Nouvelle version disponible" + +#: templates/home.html:14 +msgid "is available" +msgstr "est disponible" + +#: templates/home.html:17 +msgctxt "Document title" +msgid "Upgrade Instructions" +msgstr "Instructions de mise à niveau" + +#: templates/home.html:37 +msgid "Unlock Dashboard" +msgstr "Ouvrez le tableau de bord" + +#: templates/home.html:46 +msgid "Lock Dashboard" +msgstr "Tableau de bord verrouillé" + +#: templates/home.html:57 +msgid "Add Widget" +msgstr "Ajouter un widget" + +#: templates/home.html:60 +msgid "Save Layout" +msgstr "Enregistrer la mise en page" + +#: templates/htmx/delete_form.html:7 +msgid "Confirm Deletion" +msgstr "Confirmer la suppression" + +#: templates/htmx/delete_form.html:11 +#, python-format +msgid "" +"Are you sure you want to delete " +"%(object_type)s %(object)s?" +msgstr "" +"Es-tu sûr de vouloir supprimer " +"%(object_type)s %(object)s?" + +#: templates/htmx/delete_form.html:17 +msgid "The following objects will be deleted as a result of this action." +msgstr "Les objets suivants seront supprimés à la suite de cette action." + +#: templates/htmx/object_selector.html:5 +msgid "Select" +msgstr "Sélectionnez" + +#: templates/inc/filter_list.html:50 +#: utilities/templates/helpers/table_config_form.html:39 +msgid "Reset" +msgstr "Réinitialiser" + +#: templates/inc/missing_prerequisites.html:7 +#, python-format +msgid "" +"Before you can add a %(model)s you must first create a " +"%(prerequisite_model)s." +msgstr "" +"Avant de pouvoir ajouter un %(model)s vous devez d'abord créer un " +"%(prerequisite_model)s." + +#: templates/inc/paginator.html:38 templates/inc/paginator_htmx.html:53 +msgid "Per Page" +msgstr "Par page" + +#: templates/inc/paginator.html:49 templates/inc/paginator_htmx.html:69 +#, python-format +msgid "Showing %(start)s-%(end)s of %(total)s" +msgstr "Montrant %(start)s-%(end)s de %(total)s" + +#: templates/inc/panels/image_attachments.html:10 +msgid "Attach an image" +msgstr "Joindre une image" + +#: templates/inc/panels/related_objects.html:5 +msgid "Related Objects" +msgstr "Objets associés" + +#: templates/inc/panels/tags.html:11 +msgid "No tags assigned" +msgstr "Aucune étiquette attribuée" + +#: templates/inc/profile_button.html:12 templates/inc/profile_button.html:62 +msgid "Dark Mode" +msgstr "Mode sombre" + +#: templates/inc/profile_button.html:45 +msgid "Log Out" +msgstr "Déconnectez-vous" + +#: templates/inc/profile_button.html:53 +msgid "Log In" +msgstr "Se connecter" + +#: templates/inc/sync_warning.html:7 +msgid "Data is out of sync with upstream file" +msgstr "Les données ne sont pas synchronisées avec le fichier en amont" + +#: templates/inc/table_controls_htmx.html:16 +#: templates/inc/table_controls_htmx.html:18 +msgid "Configure Table" +msgstr "Configurer le tableau" + +#: templates/ipam/aggregate.html:15 templates/ipam/ipaddress.html:17 +#: templates/ipam/iprange.html:16 templates/ipam/prefix.html:16 +msgid "Family" +msgstr "Famille" + +#: templates/ipam/aggregate.html:40 +msgid "Date Added" +msgstr "Date d'ajout" + +#: templates/ipam/aggregate/prefixes.html:8 +#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +msgid "Add Prefix" +msgstr "Ajouter un préfixe" + +#: templates/ipam/asn.html:24 +msgid "AS Number" +msgstr "Numéro AS" + +#: templates/ipam/fhrpgroup.html:55 +msgid "Authentication Type" +msgstr "Type d'authentification" + +#: templates/ipam/fhrpgroup.html:59 +msgid "Authentication Key" +msgstr "Clé d'authentification" + +#: templates/ipam/fhrpgroup.html:72 +msgid "Virtual IP Addresses" +msgstr "Adresses IP virtuelles" + +#: templates/ipam/fhrpgroupassignment_edit.html:8 +msgid "FHRP Group Assignment" +msgstr "Affectation au groupe FHRP" + +#: templates/ipam/inc/ipaddress_edit_header.html:19 +msgid "Assign IP" +msgstr "Attribuer une IP" + +#: templates/ipam/inc/ipaddress_edit_header.html:28 +msgid "Bulk Create" +msgstr "Création en bloc" + +#: templates/ipam/inc/panels/fhrp_groups.html:12 +msgid "Virtual IPs" +msgstr "IP virtuelles" + +#: templates/ipam/inc/panels/fhrp_groups.html:52 +msgid "Create Group" +msgstr "Créer un groupe" + +#: templates/ipam/inc/panels/fhrp_groups.html:57 +msgid "Assign Group" +msgstr "Attribuer un groupe" + +#: templates/ipam/inc/toggle_available.html:7 +msgid "Show Assigned" +msgstr "Afficher les données attribuées" + +#: templates/ipam/inc/toggle_available.html:10 +msgid "Show Available" +msgstr "Afficher disponible" + +#: templates/ipam/inc/toggle_available.html:13 +msgid "Show All" +msgstr "Afficher tout" + +#: templates/ipam/ipaddress.html:26 templates/ipam/iprange.html:48 +#: templates/ipam/prefix.html:25 +msgid "Global" +msgstr "Globale" + +#: templates/ipam/ipaddress.html:88 +msgid "NAT (outside)" +msgstr "NAT (extérieur)" + +#: templates/ipam/ipaddress_assign.html:8 +msgid "Assign an IP Address" +msgstr "Attribuer une adresse IP" + +#: templates/ipam/ipaddress_assign.html:23 +msgid "Select IP Address" +msgstr "Sélectionnez l'adresse IP" + +#: templates/ipam/ipaddress_assign.html:39 +msgid "Search Results" +msgstr "Résultats de recherche" + +#: templates/ipam/ipaddress_bulk_add.html:6 +msgid "Bulk Add IP Addresses" +msgstr "Ajouter des adresses IP en masse" + +#: templates/ipam/ipaddress_edit.html:35 +msgid "Interface Assignment" +msgstr "Affectation d'interface" + +#: templates/ipam/ipaddress_edit.html:74 +msgid "NAT IP (Inside" +msgstr "IP NAT (intérieur)" + +#: templates/ipam/iprange.html:20 +msgid "Starting Address" +msgstr "Adresse de départ" + +#: templates/ipam/iprange.html:24 +msgid "Ending Address" +msgstr "Adresse de fin" + +#: templates/ipam/iprange.html:36 templates/ipam/prefix.html:104 +msgid "Marked fully utilized" +msgstr "Marqué comme entièrement utilisé" + +#: templates/ipam/prefix.html:112 +msgid "Child IPs" +msgstr "IP d'enfants" + +#: templates/ipam/prefix.html:120 +msgid "Available IPs" +msgstr "IP disponibles" + +#: templates/ipam/prefix.html:132 +msgid "First available IP" +msgstr "Première adresse IP disponible" + +#: templates/ipam/prefix.html:151 +msgid "Addressing Details" +msgstr "Détails d'adressage" + +#: templates/ipam/prefix.html:181 +msgid "Prefix Details" +msgstr "Détails du préfixe" + +#: templates/ipam/prefix.html:187 +msgid "Network Address" +msgstr "Adresse réseau" + +#: templates/ipam/prefix.html:191 +msgid "Network Mask" +msgstr "Masque réseau" + +#: templates/ipam/prefix.html:195 +msgid "Wildcard Mask" +msgstr "Masque Wildcard" + +#: templates/ipam/prefix.html:199 +msgid "Broadcast Address" +msgstr "Adresse de diffusion" + +#: templates/ipam/prefix/ip_ranges.html:7 +msgid "Add IP Range" +msgstr "Ajouter une plage d'adresses IP" + +#: templates/ipam/prefix_list.html:7 +msgid "Hide Depth Indicators" +msgstr "Masquer les indicateurs de profondeur" + +#: templates/ipam/prefix_list.html:11 +msgid "Max Depth" +msgstr "Profondeur maximale" + +#: templates/ipam/prefix_list.html:28 +msgid "Max Length" +msgstr "Longueur maximale" + +#: templates/ipam/rir.html:10 +msgid "Add Aggregate" +msgstr "Ajouter un agrégat" + +#: templates/ipam/routetarget.html:10 +msgid "Route Target" +msgstr "Cible de l'itinéraire" + +#: templates/ipam/routetarget.html:40 +msgid "Importing VRFs" +msgstr "Importation de VRF" + +#: templates/ipam/routetarget.html:49 +msgid "Exporting VRFs" +msgstr "Exportation de VRF" + +#: templates/ipam/routetarget.html:60 +msgid "Importing L2VPNs" +msgstr "Importer des VPN L2" + +#: templates/ipam/routetarget.html:69 +msgid "Exporting L2VPNs" +msgstr "Exporter des VPN L2" + +#: templates/ipam/service.html:22 templates/ipam/service_create.html:8 +#: templates/ipam/service_edit.html:8 +msgid "Service" +msgstr "Service" + +#: templates/ipam/service_create.html:43 +msgid "From Template" +msgstr "À partir du modèle" + +#: templates/ipam/service_create.html:48 +msgid "Custom" +msgstr "Personnalisé" + +#: templates/ipam/service_edit.html:37 +msgid "Port(s)" +msgstr "Port (x)" + +#: templates/ipam/vlan.html:95 +msgid "Add a Prefix" +msgstr "Ajouter un préfixe" + +#: templates/ipam/vlangroup.html:18 +msgid "Add VLAN" +msgstr "Ajouter un VLAN" + +#: templates/ipam/vlangroup.html:43 +msgid "Permitted VIDs" +msgstr "VID autorisés" + +#: templates/ipam/vrf.html:19 +msgid "Route Distinguisher" +msgstr "Distincteur d'itinéraires" + +#: templates/ipam/vrf.html:32 +msgid "Unique IP Space" +msgstr "Espace IP unique" + +#: templates/login.html:20 +#: utilities/templates/form_helpers/render_errors.html:7 +msgid "Errors" +msgstr "Erreurs" + +#: templates/login.html:48 +msgid "Sign In" +msgstr "Connectez-vous" + +#: templates/login.html:54 +msgid "Or use a single sign-on (SSO) provider" +msgstr "Ou utilisez un fournisseur d'authentification unique (SSO)" + +#: templates/login.html:68 +msgid "Toggle Color Mode" +msgstr "Basculer en mode couleur" + +#: templates/media_failure.html:7 +msgid "Static Media Failure - NetBox" +msgstr "Défaillance du support statique - NetBox" + +#: templates/media_failure.html:21 +msgid "Static Media Failure" +msgstr "Défaillance du support statique" + +#: templates/media_failure.html:23 +msgid "The following static media file failed to load" +msgstr "Le fichier multimédia statique suivant n'a pas pu être chargé" + +#: templates/media_failure.html:26 +msgid "Check the following" +msgstr "Vérifiez les points suivants" + +#: templates/media_failure.html:29 +msgid "" +"manage.py collectstatic was run during the most recent upgrade." +" This installs the most recent iteration of each static file into the static" +" root path." +msgstr "" +"manage.py collectstatic a été exécuté lors de la dernière mise " +"à niveau. Cela installe l'itération la plus récente de chaque fichier " +"statique dans le chemin racine statique." + +#: templates/media_failure.html:35 +#, python-format +msgid "" +"The HTTP service (e.g. nginx or Apache) is configured to serve files from " +"the STATIC_ROOT path. Refer to the " +"installation documentation for further guidance." +msgstr "" +"Le service HTTP (par exemple nginx ou Apache) est configuré pour servir des " +"fichiers provenant du RACINE_STATIQUE chemin. Reportez-vous à " +"la documentation d'installation pour de plus " +"amples informations." + +#: templates/media_failure.html:47 +#, python-format +msgid "" +"The file %(filename)s exists in the static root directory and " +"is readable by the HTTP server." +msgstr "" +"Le dossier %(filename)s existe dans le répertoire racine " +"statique et est lisible par le serveur HTTP." + +#: templates/media_failure.html:55 +#, python-format +msgid "Click here to attempt loading NetBox again." +msgstr "" +"Cliquez ici pour essayer à nouveau de charger " +"NetBox." + +#: templates/tenancy/contact.html:18 tenancy/filtersets.py:135 +#: tenancy/forms/bulk_edit.py:136 tenancy/forms/filtersets.py:101 +#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:109 +#: tenancy/forms/model_forms.py:132 tenancy/tables/contacts.py:98 +msgid "Contact" +msgstr "Contacter" + +#: templates/tenancy/contact.html:30 tenancy/forms/bulk_edit.py:98 +msgid "Title" +msgstr "Titre" + +#: templates/tenancy/contact.html:34 tenancy/forms/bulk_edit.py:103 +#: tenancy/tables/contacts.py:64 +msgid "Phone" +msgstr "Téléphone" + +#: templates/tenancy/contact.html:86 tenancy/tables/contacts.py:73 +msgid "Assignments" +msgstr "Devoirs" + +#: templates/tenancy/contactassignment_edit.html:12 +msgid "Contact Assignment" +msgstr "Affectation des contacts" + +#: templates/tenancy/contactgroup.html:19 tenancy/forms/forms.py:66 +#: tenancy/forms/model_forms.py:76 +msgid "Contact Group" +msgstr "Groupe de contact" + +#: templates/tenancy/contactgroup.html:57 +msgid "Add Contact Group" +msgstr "Ajouter un groupe de contacts" + +#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:140 +#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:90 +msgid "Contact Role" +msgstr "Rôle du contact" + +#: templates/tenancy/object_contacts.html:9 +msgid "Add a contact" +msgstr "Ajouter un contact" + +#: templates/tenancy/tenantgroup.html:17 +msgid "Add Tenant" +msgstr "Ajouter un locataire" + +#: templates/tenancy/tenantgroup.html:27 tenancy/forms/model_forms.py:31 +#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +msgid "Tenant Group" +msgstr "Groupe de locataires" + +#: templates/tenancy/tenantgroup.html:66 +msgid "Add Tenant Group" +msgstr "Ajouter un groupe de locataires" + +#: templates/users/group.html:37 templates/users/user.html:61 +msgid "Assigned Permissions" +msgstr "Autorisations attribuées" + +#: templates/users/objectpermission.html:6 +#: templates/users/objectpermission.html:14 users/forms/filtersets.py:67 +msgid "Permission" +msgstr "Autorisation" + +#: templates/users/objectpermission.html:33 users/forms/filtersets.py:68 +#: users/forms/model_forms.py:321 +msgid "Actions" +msgstr "Des actions" + +#: templates/users/objectpermission.html:37 +msgid "View" +msgstr "Afficher" + +#: templates/users/objectpermission.html:56 users/forms/model_forms.py:324 +msgid "Constraints" +msgstr "Contraintes" + +#: templates/users/objectpermission.html:76 +msgid "Assigned Users" +msgstr "Utilisateurs assignés" + +#: templates/users/user.html:38 +msgid "Staff" +msgstr "Le personnel" + +#: templates/virtualization/cluster.html:56 +msgid "Allocated Resources" +msgstr "Ressources allouées" + +#: templates/virtualization/cluster.html:60 +#: templates/virtualization/virtualmachine.html:128 +msgid "Virtual CPUs" +msgstr "Processeurs virtuels" + +#: templates/virtualization/cluster.html:64 +#: templates/virtualization/virtualmachine.html:132 +msgid "Memory" +msgstr "Mémoire" + +#: templates/virtualization/cluster.html:74 +#: templates/virtualization/virtualmachine.html:143 +msgid "Disk Space" +msgstr "Espace disque" + +#: templates/virtualization/cluster.html:77 +#: templates/virtualization/virtualdisk.html:33 +#: templates/virtualization/virtualmachine.html:147 +msgctxt "Abbreviation for gigabyte" +msgid "GB" +msgstr "GB" + +#: templates/virtualization/cluster/base.html:18 +msgid "Add Virtual Machine" +msgstr "Ajouter une machine virtuelle" + +#: templates/virtualization/cluster/base.html:24 +msgid "Assign Device" +msgstr "Attribuer un appareil" + +#: templates/virtualization/cluster/devices.html:10 +msgid "Remove Selected" +msgstr "Supprimer la sélection" + +#: templates/virtualization/cluster_add_devices.html:9 +#, python-format +msgid "Add Device to Cluster %(cluster)s" +msgstr "Ajouter un appareil au cluster %(cluster)s" + +#: templates/virtualization/cluster_add_devices.html:23 +msgid "Device Selection" +msgstr "Sélection de l'appareil" + +#: templates/virtualization/cluster_add_devices.html:31 +msgid "Add Devices" +msgstr "Ajouter des appareils" + +#: templates/virtualization/clustergroup.html:10 +#: templates/virtualization/clustertype.html:10 +msgid "Add Cluster" +msgstr "Ajouter un cluster" + +#: templates/virtualization/clustergroup.html:20 +#: virtualization/forms/model_forms.py:51 +msgid "Cluster Group" +msgstr "Groupe Cluster" + +#: templates/virtualization/clustertype.html:20 +#: templates/virtualization/virtualmachine.html:111 +#: virtualization/forms/model_forms.py:35 +msgid "Cluster Type" +msgstr "Type de cluster" + +#: templates/virtualization/virtualdisk.html:18 +msgid "Virtual Disk" +msgstr "Disque virtuel" + +#: templates/virtualization/virtualmachine.html:124 +#: virtualization/forms/bulk_edit.py:189 +#: virtualization/forms/model_forms.py:227 +msgid "Resources" +msgstr "Ressources" + +#: templates/virtualization/virtualmachine.html:185 +msgid "Add Virtual Disk" +msgstr "Ajouter un disque virtuel" + +#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:35 +#: vpn/tables/crypto.py:166 +msgid "IKE Policy" +msgstr "Politique IKE" + +#: templates/vpn/ikepolicy.html:22 +msgid "IKE Version" +msgstr "Version IKE" + +#: templates/vpn/ikepolicy.html:30 +msgid "Pre-Shared Key" +msgstr "Clé pré-partagée" + +#: templates/vpn/ikepolicy.html:34 +#: templates/wireless/inc/authentication_attrs.html:21 +msgid "Show Secret" +msgstr "Afficher le secret" + +#: templates/vpn/ikepolicy.html:59 templates/vpn/ipsecpolicy.html:47 +#: templates/vpn/ipsecprofile.html:55 templates/vpn/ipsecprofile.html:82 +#: vpn/forms/model_forms.py:310 vpn/forms/model_forms.py:345 +#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +msgid "Proposals" +msgstr "Propositions" + +#: templates/vpn/ikeproposal.html:10 +msgid "IKE Proposal" +msgstr "Proposition IKE" + +#: templates/vpn/ikeproposal.html:22 vpn/forms/bulk_edit.py:96 +#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:98 +msgid "Authentication method" +msgstr "Méthode d'authentification" + +#: templates/vpn/ikeproposal.html:26 templates/vpn/ipsecproposal.html:22 +#: vpn/forms/bulk_edit.py:101 vpn/forms/bulk_edit.py:173 +#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:193 +#: vpn/forms/filtersets.py:103 vpn/forms/filtersets.py:151 +msgid "Encryption algorithm" +msgstr "Algorithme de chiffrement" + +#: templates/vpn/ikeproposal.html:30 templates/vpn/ipsecproposal.html:26 +#: vpn/forms/bulk_edit.py:106 vpn/forms/bulk_edit.py:178 +#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:197 +#: vpn/forms/filtersets.py:108 vpn/forms/filtersets.py:156 +msgid "Authentication algorithm" +msgstr "Algorithme d'authentification" + +#: templates/vpn/ikeproposal.html:34 +msgid "DH group" +msgstr "groupe DH" + +#: templates/vpn/ikeproposal.html:38 templates/vpn/ipsecproposal.html:30 +#: vpn/forms/bulk_edit.py:183 vpn/models/crypto.py:134 +msgid "SA lifetime (seconds)" +msgstr "Une durée de vie (secondes)" + +#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:70 +#: vpn/tables/crypto.py:170 +msgid "IPSec Policy" +msgstr "Politique IPSec" + +#: templates/vpn/ipsecpolicy.html:22 vpn/forms/bulk_edit.py:211 +#: vpn/models/crypto.py:181 +msgid "PFS group" +msgstr "groupe PFS" + +#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:53 +msgid "IPSec Profile" +msgstr "Profil IPSec" + +#: templates/vpn/ipsecprofile.html:94 vpn/tables/crypto.py:137 +msgid "PFS Group" +msgstr "Groupe PFS" + +#: templates/vpn/ipsecproposal.html:10 +msgid "IPSec Proposal" +msgstr "Proposition IPSec" + +#: templates/vpn/ipsecproposal.html:34 vpn/forms/bulk_edit.py:187 +#: vpn/models/crypto.py:140 +msgid "SA lifetime (KB)" +msgstr "Une durée de vie (KB)" + +#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:10 +msgid "L2VPN Attributes" +msgstr "Attributs L2VPN" + +#: templates/vpn/l2vpn.html:65 templates/vpn/tunnel.html:81 +msgid "Add a Termination" +msgstr "Ajouter une résiliation" + +#: templates/vpn/l2vpntermination_edit.html:9 +msgid "L2VPN Termination" +msgstr "Terminaison L2VPN" + +#: templates/vpn/tunnel.html:9 +msgid "Add Termination" +msgstr "Ajouter une résiliation" + +#: templates/vpn/tunnel.html:38 vpn/forms/bulk_edit.py:48 +#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:56 +msgid "Encapsulation" +msgstr "Encapsulation" + +#: templates/vpn/tunnel.html:42 vpn/forms/bulk_edit.py:54 +#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:63 +#: vpn/models/crypto.py:238 vpn/tables/tunnels.py:47 +msgid "IPSec profile" +msgstr "profil IPSec" + +#: templates/vpn/tunnel.html:46 vpn/forms/bulk_edit.py:68 +#: vpn/forms/filtersets.py:67 +msgid "Tunnel ID" +msgstr "Identifiant du tunnel" + +#: templates/vpn/tunnelgroup.html:14 +msgid "Add Tunnel" +msgstr "Ajouter un tunnel" + +#: templates/vpn/tunnelgroup.html:24 vpn/forms/model_forms.py:35 +#: vpn/forms/model_forms.py:48 +msgid "Tunnel Group" +msgstr "Groupe Tunnel" + +#: templates/vpn/tunneltermination.html:10 +msgid "Tunnel Termination" +msgstr "Terminaison du tunnel" + +#: templates/vpn/tunneltermination.html:36 vpn/forms/bulk_import.py:107 +#: vpn/forms/model_forms.py:101 vpn/forms/model_forms.py:137 +#: vpn/forms/model_forms.py:248 vpn/tables/tunnels.py:97 +msgid "Outside IP" +msgstr "IP externe" + +#: templates/vpn/tunneltermination.html:53 +msgid "Peer Terminations" +msgstr "Résiliations entre pairs" + +#: templates/wireless/inc/authentication_attrs.html:13 +msgid "Cipher" +msgstr "Chiffrer" + +#: templates/wireless/inc/authentication_attrs.html:17 +msgid "PSK" +msgstr "PSK" + +#: templates/wireless/inc/wirelesslink_interface.html:35 +#: templates/wireless/inc/wirelesslink_interface.html:45 +msgctxt "Abbreviation for megahertz" +msgid "MHz" +msgstr "MHz" + +#: templates/wireless/wirelesslan.html:11 wireless/forms/model_forms.py:54 +msgid "Wireless LAN" +msgstr "LAN sans fil" + +#: templates/wireless/wirelesslan.html:59 +msgid "Attached Interfaces" +msgstr "Interfaces attachées" + +#: templates/wireless/wirelesslangroup.html:17 +msgid "Add Wireless LAN" +msgstr "Ajouter un réseau sans fil" + +#: templates/wireless/wirelesslangroup.html:26 +#: wireless/forms/model_forms.py:27 +msgid "Wireless LAN Group" +msgstr "Groupe LAN sans fil" + +#: templates/wireless/wirelesslangroup.html:64 +msgid "Add Wireless LAN Group" +msgstr "Ajouter un groupe de réseau local sans fil" + +#: templates/wireless/wirelesslink.html:16 +msgid "Link Properties" +msgstr "Propriétés du lien" + +#: tenancy/choices.py:19 +msgid "Tertiary" +msgstr "Tertiaire" + +#: tenancy/choices.py:20 +msgid "Inactive" +msgstr "Inactif" + +#: tenancy/filtersets.py:29 tenancy/filtersets.py:55 tenancy/filtersets.py:97 +msgid "Contact group (ID)" +msgstr "Groupe de contacts (ID)" + +#: tenancy/filtersets.py:35 tenancy/filtersets.py:62 tenancy/filtersets.py:104 +msgid "Contact group (slug)" +msgstr "Groupe de contact (slug)" + +#: tenancy/filtersets.py:91 +msgid "Contact (ID)" +msgstr "Contact (ID)" + +#: tenancy/filtersets.py:108 +msgid "Contact role (ID)" +msgstr "Rôle du contact (ID)" + +#: tenancy/filtersets.py:114 +msgid "Contact role (slug)" +msgstr "Rôle de contact (limace)" + +#: tenancy/filtersets.py:146 +msgid "Contact group" +msgstr "Groupe de contact" + +#: tenancy/filtersets.py:157 tenancy/filtersets.py:176 +msgid "Tenant group (ID)" +msgstr "Groupe de locataires (ID)" + +#: tenancy/filtersets.py:209 +msgid "Tenant Group (ID)" +msgstr "Groupe de locataires (ID)" + +#: tenancy/filtersets.py:216 +msgid "Tenant Group (slug)" +msgstr "Groupe de locataires (slug)" + +#: tenancy/forms/bulk_edit.py:65 +msgid "Desciption" +msgstr "Descriptif" + +#: tenancy/forms/bulk_import.py:101 +msgid "Assigned contact" +msgstr "Contact assigné" + +#: tenancy/models/contacts.py:32 +msgid "contact group" +msgstr "groupe de contact" + +#: tenancy/models/contacts.py:33 +msgid "contact groups" +msgstr "groupes de contacts" + +#: tenancy/models/contacts.py:48 +msgid "contact role" +msgstr "rôle de contact" + +#: tenancy/models/contacts.py:49 +msgid "contact roles" +msgstr "rôles de contact" + +#: tenancy/models/contacts.py:68 +msgid "title" +msgstr "titre" + +#: tenancy/models/contacts.py:73 +msgid "phone" +msgstr "téléphone" + +#: tenancy/models/contacts.py:78 +msgid "email" +msgstr "courriel" + +#: tenancy/models/contacts.py:87 +msgid "link" +msgstr "lien" + +#: tenancy/models/contacts.py:103 +msgid "contact" +msgstr "contacter" + +#: tenancy/models/contacts.py:104 +msgid "contacts" +msgstr "contacts" + +#: tenancy/models/contacts.py:153 +msgid "contact assignment" +msgstr "attribution de contacts" + +#: tenancy/models/contacts.py:154 +msgid "contact assignments" +msgstr "missions de contact" + +#: tenancy/models/contacts.py:170 +#, python-brace-format +msgid "Contacts cannot be assigned to this object type ({type})." +msgstr "Les contacts ne peuvent pas être affectés à ce type d'objet ({type})." + +#: tenancy/models/tenants.py:32 +msgid "tenant group" +msgstr "groupe de locataires" + +#: tenancy/models/tenants.py:33 +msgid "tenant groups" +msgstr "groupes de locataires" + +#: tenancy/models/tenants.py:70 +msgid "Tenant name must be unique per group." +msgstr "Le nom du locataire doit être unique par groupe." + +#: tenancy/models/tenants.py:80 +msgid "Tenant slug must be unique per group." +msgstr "Le slug tenant doit être unique par groupe." + +#: tenancy/models/tenants.py:88 +msgid "tenant" +msgstr "locataire" + +#: tenancy/models/tenants.py:89 +msgid "tenants" +msgstr "locataires" + +#: tenancy/tables/contacts.py:112 +msgid "Contact Title" +msgstr "Titre du contact" + +#: tenancy/tables/contacts.py:116 +msgid "Contact Phone" +msgstr "Téléphone de contact" + +#: tenancy/tables/contacts.py:120 +msgid "Contact Email" +msgstr "Email de contact" + +#: tenancy/tables/contacts.py:124 +msgid "Contact Address" +msgstr "Adresse de contact" + +#: tenancy/tables/contacts.py:128 +msgid "Contact Link" +msgstr "Lien de contact" + +#: tenancy/tables/contacts.py:132 +msgid "Contact Description" +msgstr "Description du contact" + +#: users/filtersets.py:48 users/filtersets.py:151 +msgid "Group (name)" +msgstr "Groupe (nom)" + +#: users/forms/bulk_edit.py:24 +msgid "First name" +msgstr "Prénom" + +#: users/forms/bulk_edit.py:29 +msgid "Last name" +msgstr "Nom de famille" + +#: users/forms/bulk_edit.py:41 +msgid "Staff status" +msgstr "Statut du personnel" + +#: users/forms/bulk_edit.py:46 +msgid "Superuser status" +msgstr "Statut de superutilisateur" + +#: users/forms/bulk_import.py:43 +msgid "If no key is provided, one will be generated automatically." +msgstr "Si aucune clé n'est fournie, une clé sera générée automatiquement." + +#: users/forms/filtersets.py:52 users/tables.py:42 +msgid "Is Staff" +msgstr "Est-ce que le personnel" + +#: users/forms/filtersets.py:59 users/tables.py:45 +msgid "Is Superuser" +msgstr "Est un superutilisateur" + +#: users/forms/filtersets.py:92 users/tables.py:89 +msgid "Can View" +msgstr "Peut voir" + +#: users/forms/filtersets.py:99 users/tables.py:92 +msgid "Can Add" +msgstr "Peut ajouter" + +#: users/forms/filtersets.py:106 users/tables.py:95 +msgid "Can Change" +msgstr "Peut changer" + +#: users/forms/filtersets.py:113 users/tables.py:98 +msgid "Can Delete" +msgstr "Peut supprimer" + +#: users/forms/model_forms.py:58 +msgid "User Interface" +msgstr "Interface utilisateur" + +#: users/forms/model_forms.py:115 +msgid "" +"Keys must be at least 40 characters in length. Be sure to record " +"your key prior to submitting this form, as it may no longer be " +"accessible once the token has been created." +msgstr "" +"Les clés doivent comporter au moins 40 caractères. Assurez-vous " +"d'enregistrer votre clé avant de soumettre ce formulaire, car il se" +" peut qu'il ne soit plus accessible une fois le jeton créé." + +#: users/forms/model_forms.py:127 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" +" no restrictions. Example: " +"10.1.1.0/24,192.168.10.16/32,2001:db8:1::/64" +msgstr "" +"Réseaux IPv4/IPv6 autorisés à partir desquels le jeton peut être utilisé. " +"Laissez ce champ vide pour éviter toute restriction. Exemple : " +"10.1.1.0/24 192.168.10,16/32 2001 : db 8:1 : /64" + +#: users/forms/model_forms.py:176 +msgid "Confirm password" +msgstr "Confirmer mot de passe" + +#: users/forms/model_forms.py:179 +msgid "Enter the same password as before, for verification." +msgstr "" +"Entrez le même mot de passe que précédemment, à des fins de vérification." + +#: users/forms/model_forms.py:237 +msgid "Passwords do not match! Please check your input and try again." +msgstr "" +"Les mots de passe ne correspondent pas ! Vérifiez votre saisie et réessayez." + +#: users/forms/model_forms.py:303 +msgid "Additional actions" +msgstr "Actions supplémentaires" + +#: users/forms/model_forms.py:306 +msgid "Actions granted in addition to those listed above" +msgstr "Actions accordées en plus de celles énumérées ci-dessus" + +#: users/forms/model_forms.py:322 +msgid "Objects" +msgstr "Objets" + +#: users/forms/model_forms.py:334 +msgid "" +"JSON expression of a queryset filter that will return only permitted " +"objects. Leave null to match all objects of this type. A list of multiple " +"objects will result in a logical OR operation." +msgstr "" +"Expression JSON d'un filtre queryset qui ne renverra que les objets " +"autorisés. Laissez null pour correspondre à tous les objets de ce type. Une " +"liste de plusieurs objets entraînera une opération OR logique." + +#: users/forms/model_forms.py:372 +msgid "At least one action must be selected." +msgstr "Au moins une action doit être sélectionnée." + +#: users/forms/model_forms.py:389 +#, python-brace-format +msgid "Invalid filter for {model}: {error}" +msgstr "Filtre non valide pour {model}: {error}" + +#: users/models.py:54 +msgid "user" +msgstr "utilisateur" + +#: users/models.py:55 +msgid "users" +msgstr "utilisateurs" + +#: users/models.py:66 +msgid "A user with this username already exists." +msgstr "Un utilisateur avec ce nom d'utilisateur existe déjà." + +#: users/models.py:78 vpn/models/crypto.py:42 +msgid "group" +msgstr "groupe" + +#: users/models.py:79 +msgid "groups" +msgstr "groupes" + +#: users/models.py:106 users/models.py:107 +msgid "user preferences" +msgstr "préférences de l'utilisateur" + +#: users/models.py:174 +#, python-brace-format +msgid "Key '{path}' is a leaf node; cannot assign new keys" +msgstr "" +"Clé '{path}'est un nœud feuille ; impossible d'attribuer de nouvelles clés" + +#: users/models.py:186 +#, python-brace-format +msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" +msgstr "" +"Clé '{path}'est un dictionnaire ; impossible d'attribuer une valeur autre " +"que celle du dictionnaire" + +#: users/models.py:252 +msgid "expires" +msgstr "expire" + +#: users/models.py:257 +msgid "last used" +msgstr "utilisé pour la dernière fois" + +#: users/models.py:262 +msgid "key" +msgstr "clé" + +#: users/models.py:268 +msgid "write enabled" +msgstr "écriture activée" + +#: users/models.py:270 +msgid "Permit create/update/delete operations using this key" +msgstr "" +"Autoriser les opérations de création/mise à jour/suppression à l'aide de " +"cette clé" + +#: users/models.py:281 +msgid "allowed IPs" +msgstr "adresses IP autorisées" + +#: users/models.py:283 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" +" no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" +msgstr "" +"Réseaux IPv4/IPv6 autorisés à partir desquels le jeton peut être utilisé. " +"Laissez ce champ vide pour éviter toute restriction. Par exemple : " +"« 10.1.1.0/24, 192.168.10.16/32, 2001 : DB 8:1 : /64 »" + +#: users/models.py:291 +msgid "token" +msgstr "jeton" + +#: users/models.py:292 +msgid "tokens" +msgstr "jetons" + +#: users/models.py:373 +msgid "The list of actions granted by this permission" +msgstr "La liste des actions accordées par cette autorisation" + +#: users/models.py:378 +msgid "constraints" +msgstr "entraves" + +#: users/models.py:379 +msgid "" +"Queryset filter matching the applicable objects of the selected type(s)" +msgstr "" +"Filtre Queryset correspondant aux objets applicables du ou des types " +"sélectionnés" + +#: users/models.py:386 +msgid "permission" +msgstr "autorisation" + +#: users/models.py:387 +msgid "permissions" +msgstr "autorisations" + +#: users/tables.py:101 +msgid "Custom Actions" +msgstr "Actions personnalisées" + +#: utilities/choices.py:16 +#, python-brace-format +msgid "{name} has a key defined but CHOICES is not a list" +msgstr "{name} a une clé définie mais CHOICES n'est pas une liste" + +#: utilities/choices.py:135 +msgid "Dark Red" +msgstr "Rouge foncé" + +#: utilities/choices.py:138 +msgid "Rose" +msgstr "Rose" + +#: utilities/choices.py:139 +msgid "Fuchsia" +msgstr "Fuchsia" + +#: utilities/choices.py:141 +msgid "Dark Purple" +msgstr "Violet foncé" + +#: utilities/choices.py:144 +msgid "Light Blue" +msgstr "Bleu clair" + +#: utilities/choices.py:147 +msgid "Aqua" +msgstr "Aqua" + +#: utilities/choices.py:148 +msgid "Dark Green" +msgstr "Vert foncé" + +#: utilities/choices.py:150 +msgid "Light Green" +msgstr "Vert clair" + +#: utilities/choices.py:151 +msgid "Lime" +msgstr "Citron" + +#: utilities/choices.py:153 +msgid "Amber" +msgstr "Ambre" + +#: utilities/choices.py:155 +msgid "Dark Orange" +msgstr "Orange foncé" + +#: utilities/choices.py:156 +msgid "Brown" +msgstr "Marron" + +#: utilities/choices.py:157 +msgid "Light Grey" +msgstr "gris clair" + +#: utilities/choices.py:158 +msgid "Grey" +msgstr "gris" + +#: utilities/choices.py:159 +msgid "Dark Grey" +msgstr "gris foncé" + +#: utilities/choices.py:217 +msgid "Direct" +msgstr "Directement" + +#: utilities/choices.py:218 +msgid "Upload" +msgstr "Téléverser" + +#: utilities/choices.py:230 utilities/choices.py:244 +msgid "Auto-detect" +msgstr "Détection automatique" + +#: utilities/choices.py:245 +msgid "Comma" +msgstr "Virgule" + +#: utilities/choices.py:246 +msgid "Semicolon" +msgstr "Point-virgule" + +#: utilities/choices.py:247 +msgid "Tab" +msgstr "Onglet" + +#: utilities/error_handlers.py:20 +#, python-brace-format +msgid "" +"Unable to delete {objects}. {count} dependent objects were " +"found: " +msgstr "" +"Impossible de supprimer {objects}. {count} des objets " +"dépendants ont été trouvés : " + +#: utilities/error_handlers.py:22 +msgid "More than 50" +msgstr "Plus de 50" + +#: utilities/fields.py:162 +#, python-format +msgid "" +"%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " +"in the format 'app.model'" +msgstr "" +"%s(%r) n'est pas valide. Le paramètre to_model de CounterCacheField doit " +"être une chaîne au format « app.model »" + +#: utilities/fields.py:172 +#, python-format +msgid "" +"%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " +"in the format 'field'" +msgstr "" +"%s(%r) n'est pas valide. Le paramètre to_field de CounterCacheField doit " +"être une chaîne au format « field »" + +#: utilities/forms/bulk_import.py:24 +msgid "Enter object data in CSV, JSON or YAML format." +msgstr "Entrez les données de l'objet au format CSV, JSON ou YAML." + +#: utilities/forms/bulk_import.py:37 +msgid "CSV delimiter" +msgstr "Délimiteur CSV" + +#: utilities/forms/bulk_import.py:38 +msgid "The character which delimits CSV fields. Applies only to CSV format." +msgstr "" +"Le caractère qui délimite les champs CSV. S'applique uniquement au format " +"CSV." + +#: utilities/forms/bulk_import.py:101 +msgid "Unable to detect data format. Please specify." +msgstr "Impossible de détecter le format des données. Veuillez préciser." + +#: utilities/forms/bulk_import.py:124 +msgid "Invalid CSV delimiter" +msgstr "Délimiteur CSV non valide" + +#: utilities/forms/bulk_import.py:168 +msgid "" +"Invalid YAML data. Data must be in the form of multiple documents, or a " +"single document comprising a list of dictionaries." +msgstr "" +"Données YAML non valides. Les données doivent se présenter sous la forme de " +"plusieurs documents ou d'un seul document comprenant une liste de " +"dictionnaires." + +#: utilities/forms/fields/array.py:17 +#, python-brace-format +msgid "" +"Invalid list ({value}). Must be numeric and ranges must be in ascending " +"order." +msgstr "" +"Liste non valide ({value}). Doit être numérique et les plages doivent être " +"classées par ordre croissant." + +#: utilities/forms/fields/csv.py:44 +#, python-brace-format +msgid "Invalid value for a multiple choice field: {value}" +msgstr "Valeur non valide pour un champ à choix multiples : {value}" + +#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:74 +#, python-format +msgid "Object not found: %(value)s" +msgstr "Objet introuvable : %(value)s" + +#: utilities/forms/fields/csv.py:65 +#, python-brace-format +msgid "" +"\"{value}\" is not a unique value for this field; multiple objects were " +"found" +msgstr "" +"«{value}« n'est pas une valeur unique pour ce champ ; plusieurs objets ont " +"été trouvés" + +#: utilities/forms/fields/csv.py:97 +msgid "Object type must be specified as \".\"" +msgstr "Le type d'objet doit être spécifié comme ».«" + +#: utilities/forms/fields/csv.py:101 +msgid "Invalid object type" +msgstr "Type d'objet non valide" + +#: utilities/forms/fields/expandable.py:25 +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9])." +msgstr "" +"Les plages alphanumériques sont prises en charge pour la création en masse. " +"Les cas et les types mixtes au sein d'une même plage ne sont pas pris en " +"charge (exemple : [ge, xe] -0/0/ [0-9])." + +#: utilities/forms/fields/expandable.py:46 +msgid "" +"Specify a numeric range to create multiple IPs.
    Example: " +"192.0.2.[1,5,100-254]/24" +msgstr "" +"Spécifiez une plage numérique pour créer plusieurs adresses IP.
    Exemple : 192,0,2. [1 500 -254] /24" + +#: utilities/forms/fields/fields.py:31 +#, python-brace-format +msgid "" +" Markdown syntax is supported" +msgstr "" +" Markdown la syntaxe est prise en " +"charge" + +#: utilities/forms/fields/fields.py:48 +msgid "URL-friendly unique shorthand" +msgstr "Raccourci unique et convivial pour les URL" + +#: utilities/forms/fields/fields.py:99 +msgid "Enter context data in JSON format." +msgstr "" +"Entrez les données contextuelles dans JSON" +" format." + +#: utilities/forms/fields/fields.py:117 +msgid "MAC address must be in EUI-48 format" +msgstr "L'adresse MAC doit être au format EUI-48" + +#: utilities/forms/forms.py:53 +msgid "Use regular expressions" +msgstr "Utiliser des expressions régulières" + +#: utilities/forms/forms.py:87 +#, python-brace-format +msgid "Unrecognized header: {name}" +msgstr "En-tête non reconnu : {name}" + +#: utilities/forms/forms.py:113 +msgid "Available Columns" +msgstr "Colonnes disponibles" + +#: utilities/forms/forms.py:121 +msgid "Selected Columns" +msgstr "Colonnes sélectionnées" + +#: utilities/forms/mixins.py:101 +msgid "" +"This object has been modified since the form was rendered. Please consult " +"the object's change log for details." +msgstr "" +"Cet objet a été modifié depuis le rendu du formulaire. Consultez le journal " +"des modifications de l'objet pour plus de détails." + +#: utilities/templates/builtins/customfield_value.html:30 +msgid "Not defined" +msgstr "Non défini" + +#: utilities/templates/buttons/bookmark.html:9 +msgid "Unbookmark" +msgstr "Désélectionner" + +#: utilities/templates/buttons/bookmark.html:13 +msgid "Bookmark" +msgstr "Marque-page" + +#: utilities/templates/buttons/clone.html:4 +msgid "Clone" +msgstr "Cloner" + +#: utilities/templates/buttons/export.html:4 +msgid "Export" +msgstr "Exporter" + +#: utilities/templates/buttons/export.html:7 +msgid "Current View" +msgstr "Vue actuelle" + +#: utilities/templates/buttons/export.html:8 +msgid "All Data" +msgstr "Toutes les données" + +#: utilities/templates/buttons/export.html:28 +msgid "Add export template" +msgstr "Ajouter un modèle d'exportation" + +#: utilities/templates/buttons/import.html:4 +msgid "Import" +msgstr "Importer" + +#: utilities/templates/form_helpers/render_field.html:36 +msgid "Copy to clipboard" +msgstr "Copier dans le presse-papiers" + +#: utilities/templates/form_helpers/render_field.html:52 +msgid "This field is required" +msgstr "Ce champ est obligatoire" + +#: utilities/templates/form_helpers/render_field.html:65 +msgid "Set Null" +msgstr "Définir Null" + +#: utilities/templates/helpers/applied_filters.html:11 +msgid "Clear all" +msgstr "Tout effacer" + +#: utilities/templates/helpers/table_config_form.html:8 +msgid "Table Configuration" +msgstr "Configuration de la table" + +#: utilities/templates/helpers/table_config_form.html:31 +msgid "Move Up" +msgstr "Déplacer vers le haut" + +#: utilities/templates/helpers/table_config_form.html:34 +msgid "Move Down" +msgstr "Déplacer vers le bas" + +#: utilities/templates/widgets/apiselect.html:7 +msgid "Open selector" +msgstr "Ouvrir le sélecteur" + +#: utilities/templates/widgets/clearable_file_input.html:12 +msgid "None assigned" +msgstr "Aucune assignée" + +#: utilities/templates/widgets/markdown_input.html:6 +msgid "Write" +msgstr "Écrivez" + +#: utilities/templates/widgets/markdown_input.html:20 +msgid "Testing" +msgstr "Tests" + +#: virtualization/filtersets.py:79 +msgid "Parent group (ID)" +msgstr "Groupe de parents (ID)" + +#: virtualization/filtersets.py:85 +msgid "Parent group (slug)" +msgstr "Groupe de parents (limace)" + +#: virtualization/filtersets.py:89 virtualization/filtersets.py:140 +msgid "Cluster type (ID)" +msgstr "Type de cluster (ID)" + +#: virtualization/filtersets.py:129 +msgid "Cluster group (ID)" +msgstr "Groupe de clusters (ID)" + +#: virtualization/filtersets.py:150 virtualization/filtersets.py:265 +msgid "Cluster (ID)" +msgstr "Cluster (ID)" + +#: virtualization/forms/bulk_edit.py:165 +#: virtualization/models/virtualmachines.py:113 +msgid "vCPUs" +msgstr "processeurs virtuels" + +#: virtualization/forms/bulk_edit.py:169 +msgid "Memory (MB)" +msgstr "Mémoire (Mo)" + +#: virtualization/forms/bulk_edit.py:173 +msgid "Disk (GB)" +msgstr "Disque (Go)" + +#: virtualization/forms/bulk_edit.py:333 +#: virtualization/forms/filtersets.py:243 +msgid "Size (GB)" +msgstr "Taille (Go)" + +#: virtualization/forms/bulk_import.py:44 +msgid "Type of cluster" +msgstr "Type de cluster" + +#: virtualization/forms/bulk_import.py:51 +msgid "Assigned cluster group" +msgstr "Groupe de clusters attribué" + +#: virtualization/forms/bulk_import.py:96 +msgid "Assigned cluster" +msgstr "Cluster attribué" + +#: virtualization/forms/bulk_import.py:103 +msgid "Assigned device within cluster" +msgstr "Appareil attribué au sein du cluster" + +#: virtualization/forms/model_forms.py:156 +#, python-brace-format +msgid "" +"{device} belongs to a different site ({device_site}) than the cluster " +"({cluster_site})" +msgstr "" +"{device} appartient à un autre site ({device_site}) puis le cluster " +"({cluster_site})" + +#: virtualization/forms/model_forms.py:195 +msgid "Optionally pin this VM to a specific host device within the cluster" +msgstr "" +"Épinglez éventuellement cette machine virtuelle à un périphérique hôte " +"spécifique au sein du cluster" + +#: virtualization/forms/model_forms.py:224 +msgid "Site/Cluster" +msgstr "Site/Cluster" + +#: virtualization/forms/model_forms.py:247 +msgid "Disk size is managed via the attachment of virtual disks." +msgstr "La taille du disque est gérée via la connexion de disques virtuels." + +#: virtualization/forms/model_forms.py:375 +msgid "Disk" +msgstr "Disque" + +#: virtualization/models/clusters.py:25 +msgid "cluster type" +msgstr "type de cluster" + +#: virtualization/models/clusters.py:26 +msgid "cluster types" +msgstr "types de clusters" + +#: virtualization/models/clusters.py:45 +msgid "cluster group" +msgstr "groupe de clusters" + +#: virtualization/models/clusters.py:46 +msgid "cluster groups" +msgstr "groupes de clusters" + +#: virtualization/models/clusters.py:121 +msgid "cluster" +msgstr "grappe" + +#: virtualization/models/clusters.py:122 +msgid "clusters" +msgstr "entrelas" + +#: virtualization/models/clusters.py:141 +#, python-brace-format +msgid "" +"{count} devices are assigned as hosts for this cluster but are not in site " +"{site}" +msgstr "" +"{count} les appareils sont affectés en tant qu'hôtes à ce cluster mais ne " +"sont pas sur le site {site}" + +#: virtualization/models/virtualmachines.py:121 +msgid "memory (MB)" +msgstr "mémoire (Mo)" + +#: virtualization/models/virtualmachines.py:126 +msgid "disk (GB)" +msgstr "disque (Go)" + +#: virtualization/models/virtualmachines.py:159 +msgid "Virtual machine name must be unique per cluster." +msgstr "Le nom de la machine virtuelle doit être unique par cluster." + +#: virtualization/models/virtualmachines.py:162 +msgid "virtual machine" +msgstr "machine virtuelle" + +#: virtualization/models/virtualmachines.py:163 +msgid "virtual machines" +msgstr "machines virtuelles" + +#: virtualization/models/virtualmachines.py:177 +msgid "A virtual machine must be assigned to a site and/or cluster." +msgstr "" +"Une machine virtuelle doit être attribuée à un site et/ou à un cluster." + +#: virtualization/models/virtualmachines.py:184 +#, python-brace-format +msgid "" +"The selected cluster ({cluster}) is not assigned to this site ({site})." +msgstr "" +"Le cluster sélectionné ({cluster}) n'est pas attribué à ce site ({site})." + +#: virtualization/models/virtualmachines.py:191 +msgid "Must specify a cluster when assigning a host device." +msgstr "" +"Doit spécifier un cluster lors de l'attribution d'un périphérique hôte." + +#: virtualization/models/virtualmachines.py:196 +#, python-brace-format +msgid "" +"The selected device ({device}) is not assigned to this cluster ({cluster})." +msgstr "" +"L'appareil sélectionné ({device}) n'est pas affecté à ce cluster " +"({cluster})." + +#: virtualization/models/virtualmachines.py:208 +#, python-brace-format +msgid "" +"The specified disk size ({size}) must match the aggregate size of assigned " +"virtual disks ({total_size})." +msgstr "" +"La taille de disque spécifiée ({size}) doit correspondre à la taille agrégée" +" des disques virtuels assignés ({total_size})." + +#: virtualization/models/virtualmachines.py:222 +#, python-brace-format +msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" +msgstr "Doit être un IPV{family} adresse. ({ip} est un IPV{version} adresse.)" + +#: virtualization/models/virtualmachines.py:231 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this VM." +msgstr "" +"L'adresse IP spécifiée ({ip}) n'est pas attribué à cette machine virtuelle." + +#: virtualization/models/virtualmachines.py:389 +#, python-brace-format +msgid "" +"The selected parent interface ({parent}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "" +"L'interface parent sélectionnée ({parent}) appartient à une autre machine " +"virtuelle ({virtual_machine})." + +#: virtualization/models/virtualmachines.py:404 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "" +"L'interface de pont sélectionnée ({bridge}) appartient à une autre machine " +"virtuelle ({virtual_machine})." + +#: virtualization/models/virtualmachines.py:415 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent virtual machine, or it must be global." +msgstr "" +"Le VLAN non balisé ({untagged_vlan}) doit appartenir au même site que la " +"machine virtuelle parente de l'interface, ou il doit être global." + +#: virtualization/models/virtualmachines.py:427 +msgid "size (GB)" +msgstr "taille (Go)" + +#: virtualization/models/virtualmachines.py:431 +msgid "virtual disk" +msgstr "disque virtuel" + +#: virtualization/models/virtualmachines.py:432 +msgid "virtual disks" +msgstr "disques virtuels" + +#: vpn/choices.py:31 +msgid "IPsec - Transport" +msgstr "IPSec - Transport" + +#: vpn/choices.py:32 +msgid "IPsec - Tunnel" +msgstr "IPsec - Tunnel" + +#: vpn/choices.py:33 +msgid "IP-in-IP" +msgstr "IP dans IP" + +#: vpn/choices.py:34 +msgid "GRE" +msgstr "GRE" + +#: vpn/choices.py:56 +msgid "Hub" +msgstr "Hub" + +#: vpn/choices.py:57 +msgid "Spoke" +msgstr "A parlé" + +#: vpn/choices.py:80 +msgid "Aggressive" +msgstr "Agressif" + +#: vpn/choices.py:81 +msgid "Main" +msgstr "Principal" + +#: vpn/choices.py:92 +msgid "Pre-shared keys" +msgstr "Clés pré-partagées" + +#: vpn/choices.py:93 +msgid "Certificates" +msgstr "Certificats" + +#: vpn/choices.py:94 +msgid "RSA signatures" +msgstr "Signatures RSA" + +#: vpn/choices.py:95 +msgid "DSA signatures" +msgstr "Signatures DSA" + +#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 +#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 +#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 +#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 +#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 +#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 +#, python-brace-format +msgid "Group {n}" +msgstr "Groupe {n}" + +#: vpn/choices.py:240 +msgid "Ethernet Private LAN" +msgstr "Réseau local privé Ethernet" + +#: vpn/choices.py:241 +msgid "Ethernet Virtual Private LAN" +msgstr "Réseau local privé virtuel Ethernet" + +#: vpn/choices.py:244 +msgid "Ethernet Private Tree" +msgstr "Arbre privé Ethernet" + +#: vpn/choices.py:245 +msgid "Ethernet Virtual Private Tree" +msgstr "Arbre privé virtuel Ethernet" + +#: vpn/filtersets.py:41 +msgid "Tunnel group (ID)" +msgstr "Groupe de tunnels (ID)" + +#: vpn/filtersets.py:47 +msgid "Tunnel group (slug)" +msgstr "Groupe de tunnels (slug)" + +#: vpn/filtersets.py:54 +msgid "IPSec profile (ID)" +msgstr "profil IPSec (ID)" + +#: vpn/filtersets.py:60 +msgid "IPSec profile (name)" +msgstr "Profil IPSec (nom)" + +#: vpn/filtersets.py:81 +msgid "Tunnel (ID)" +msgstr "Tunnel (ID)" + +#: vpn/filtersets.py:87 +msgid "Tunnel (name)" +msgstr "Tunnel (nom)" + +#: vpn/filtersets.py:118 +msgid "Outside IP (ID)" +msgstr "IP externe (ID)" + +#: vpn/filtersets.py:235 +msgid "IKE policy (ID)" +msgstr "Politique IKE (ID)" + +#: vpn/filtersets.py:241 +msgid "IKE policy (name)" +msgstr "Politique IKE (nom)" + +#: vpn/filtersets.py:245 +msgid "IPSec policy (ID)" +msgstr "Politique IPSec (ID)" + +#: vpn/filtersets.py:251 +msgid "IPSec policy (name)" +msgstr "Politique IPSec (nom)" + +#: vpn/filtersets.py:320 +msgid "L2VPN (slug)" +msgstr "L2VPN (limace)" + +#: vpn/filtersets.py:384 +msgid "VM Interface (ID)" +msgstr "Interface de machine virtuelle (ID)" + +#: vpn/filtersets.py:390 +msgid "VLAN (name)" +msgstr "VLAN (nom)" + +#: vpn/forms/bulk_edit.py:44 vpn/forms/bulk_import.py:42 +#: vpn/forms/filtersets.py:53 +msgid "Tunnel group" +msgstr "Groupe de tunnels" + +#: vpn/forms/bulk_edit.py:116 vpn/models/crypto.py:47 +msgid "SA lifetime" +msgstr "Toute une vie" + +#: vpn/forms/bulk_edit.py:150 wireless/forms/bulk_edit.py:78 +#: wireless/forms/bulk_edit.py:125 wireless/forms/filtersets.py:63 +#: wireless/forms/filtersets.py:97 +msgid "Pre-shared key" +msgstr "Clé pré-partagée" + +#: vpn/forms/bulk_edit.py:238 vpn/forms/bulk_import.py:234 +#: vpn/forms/filtersets.py:196 vpn/forms/model_forms.py:363 +#: vpn/models/crypto.py:103 +msgid "IKE policy" +msgstr "Politique IKE" + +#: vpn/forms/bulk_edit.py:243 vpn/forms/bulk_import.py:239 +#: vpn/forms/filtersets.py:201 vpn/forms/model_forms.py:367 +#: vpn/models/crypto.py:197 +msgid "IPSec policy" +msgstr "Politique IPSec" + +#: vpn/forms/bulk_import.py:50 +msgid "Tunnel encapsulation" +msgstr "Encapsulation par tunnel" + +#: vpn/forms/bulk_import.py:83 +msgid "Operational role" +msgstr "Rôle opérationnel" + +#: vpn/forms/bulk_import.py:90 +msgid "Parent device of assigned interface" +msgstr "Appareil parent à l'interface attribuée" + +#: vpn/forms/bulk_import.py:97 +msgid "Parent VM of assigned interface" +msgstr "Machine virtuelle parente de l'interface attribuée" + +#: vpn/forms/bulk_import.py:104 +msgid "Device or virtual machine interface" +msgstr "Interface de périphérique ou de machine virtuelle" + +#: vpn/forms/bulk_import.py:181 +msgid "IKE proposal(s)" +msgstr "Proposition (s) de l'IKE" + +#: vpn/forms/bulk_import.py:211 vpn/models/crypto.py:185 +msgid "Diffie-Hellman group for Perfect Forward Secrecy" +msgstr "Groupe Diffie-Hellman pour Perfect Forward Secrets" + +#: vpn/forms/bulk_import.py:217 +msgid "IPSec proposal(s)" +msgstr "Proposition (s) IPSec" + +#: vpn/forms/bulk_import.py:231 +msgid "IPSec protocol" +msgstr "Protocole IPSec" + +#: vpn/forms/bulk_import.py:261 +msgid "L2VPN type" +msgstr "Type de VPN L2" + +#: vpn/forms/bulk_import.py:282 +msgid "Parent device (for interface)" +msgstr "Appareil parent (pour interface)" + +#: vpn/forms/bulk_import.py:289 +msgid "Parent virtual machine (for interface)" +msgstr "Machine virtuelle parente (pour l'interface)" + +#: vpn/forms/bulk_import.py:296 +msgid "Assigned interface (device or VM)" +msgstr "Interface attribuée (appareil ou machine virtuelle)" + +#: vpn/forms/bulk_import.py:329 +msgid "Cannot import device and VM interface terminations simultaneously." +msgstr "" +"Impossible d'importer simultanément les terminaisons de l'interface du " +"périphérique et de la machine virtuelle." + +#: vpn/forms/bulk_import.py:331 +msgid "Each termination must specify either an interface or a VLAN." +msgstr "Chaque terminaison doit spécifier une interface ou un VLAN." + +#: vpn/forms/bulk_import.py:333 +msgid "Cannot assign both an interface and a VLAN." +msgstr "Impossible d'attribuer à la fois une interface et un VLAN." + +#: vpn/forms/filtersets.py:127 +msgid "IKE version" +msgstr "Version IKE" + +#: vpn/forms/filtersets.py:139 vpn/forms/filtersets.py:172 +#: vpn/forms/model_forms.py:293 vpn/forms/model_forms.py:328 +msgid "Proposal" +msgstr "Proposition" + +#: vpn/forms/filtersets.py:247 +msgid "Assigned Object Type" +msgstr "Type d'objet attribué" + +#: vpn/forms/model_forms.py:147 +msgid "First Termination" +msgstr "Première résiliation" + +#: vpn/forms/model_forms.py:151 +msgid "Second Termination" +msgstr "Deuxième résiliation" + +#: vpn/forms/model_forms.py:198 +msgid "This parameter is required when defining a termination." +msgstr "Ce paramètre est obligatoire lors de la définition d'une terminaison." + +#: vpn/forms/model_forms.py:314 vpn/forms/model_forms.py:349 +msgid "Policy" +msgstr "Politique" + +#: vpn/forms/model_forms.py:469 +msgid "A termination must specify an interface or VLAN." +msgstr "Une terminaison doit spécifier une interface ou un VLAN." + +#: vpn/forms/model_forms.py:471 +msgid "" +"A termination can only have one terminating object (an interface or VLAN)." +msgstr "" +"Une terminaison ne peut avoir qu'un seul objet de terminaison (une interface" +" ou un VLAN)." + +#: vpn/models/crypto.py:33 +msgid "encryption algorithm" +msgstr "algorithme de chiffrement" + +#: vpn/models/crypto.py:37 +msgid "authentication algorithm" +msgstr "algorithme d'authentification" + +#: vpn/models/crypto.py:44 +msgid "Diffie-Hellman group ID" +msgstr "ID de groupe Diffie-Hellman" + +#: vpn/models/crypto.py:50 +msgid "Security association lifetime (in seconds)" +msgstr "Durée de vie de l'association de sécurité (en secondes)" + +#: vpn/models/crypto.py:59 +msgid "IKE proposal" +msgstr "Proposition IKE" + +#: vpn/models/crypto.py:60 +msgid "IKE proposals" +msgstr "Propositions IKE" + +#: vpn/models/crypto.py:76 +msgid "version" +msgstr "version" + +#: vpn/models/crypto.py:87 vpn/models/crypto.py:178 +msgid "proposals" +msgstr "propositions" + +#: vpn/models/crypto.py:90 wireless/models.py:38 +msgid "pre-shared key" +msgstr "clé pré-partagée" + +#: vpn/models/crypto.py:104 +msgid "IKE policies" +msgstr "Politiques IKE" + +#: vpn/models/crypto.py:124 +msgid "encryption" +msgstr "chiffrement" + +#: vpn/models/crypto.py:129 +msgid "authentication" +msgstr "authentification" + +#: vpn/models/crypto.py:137 +msgid "Security association lifetime (seconds)" +msgstr "Durée de vie de l'association de sécurité (secondes)" + +#: vpn/models/crypto.py:143 +msgid "Security association lifetime (in kilobytes)" +msgstr "Durée de vie de l'association de sécurité (en kilo-octets)" + +#: vpn/models/crypto.py:152 +msgid "IPSec proposal" +msgstr "Proposition IPSec" + +#: vpn/models/crypto.py:153 +msgid "IPSec proposals" +msgstr "Propositions IPSec" + +#: vpn/models/crypto.py:166 +msgid "Encryption and/or authentication algorithm must be defined" +msgstr "" +"Un algorithme de chiffrement et/ou d'authentification doit être défini" + +#: vpn/models/crypto.py:198 +msgid "IPSec policies" +msgstr "Politiques IPSec" + +#: vpn/models/crypto.py:239 +msgid "IPSec profiles" +msgstr "Profils IPSec" + +#: vpn/models/l2vpn.py:116 +msgid "L2VPN termination" +msgstr "Terminaison L2VPN" + +#: vpn/models/l2vpn.py:117 +msgid "L2VPN terminations" +msgstr "Terminaisons L2VPN" + +#: vpn/models/l2vpn.py:135 +#, python-brace-format +msgid "L2VPN Termination already assigned ({assigned_object})" +msgstr "Terminaison L2VPN déjà attribuée ({assigned_object})" + +#: vpn/models/l2vpn.py:147 +#, python-brace-format +msgid "" +"{l2vpn_type} L2VPNs cannot have more than two terminations; found " +"{terminations_count} already defined." +msgstr "" +"{l2vpn_type} Les L2VPN ne peuvent pas avoir plus de deux terminaisons ; " +"trouvé {terminations_count} déjà défini." + +#: vpn/models/tunnels.py:26 +msgid "tunnel group" +msgstr "groupe de tunnels" + +#: vpn/models/tunnels.py:27 +msgid "tunnel groups" +msgstr "groupes de tunnels" + +#: vpn/models/tunnels.py:53 +msgid "encapsulation" +msgstr "encapsulation" + +#: vpn/models/tunnels.py:72 +msgid "tunnel ID" +msgstr "ID du tunnel" + +#: vpn/models/tunnels.py:94 +msgid "tunnel" +msgstr "tunnel" + +#: vpn/models/tunnels.py:95 +msgid "tunnels" +msgstr "tunnels" + +#: vpn/models/tunnels.py:153 +msgid "An object may be terminated to only one tunnel at a time." +msgstr "Un objet ne peut être renvoyé qu'à un seul tunnel à la fois." + +#: vpn/models/tunnels.py:156 +msgid "tunnel termination" +msgstr "terminaison du tunnel" + +#: vpn/models/tunnels.py:157 +msgid "tunnel terminations" +msgstr "terminaisons de tunnels" + +#: vpn/models/tunnels.py:174 +#, python-brace-format +msgid "{name} is already attached to a tunnel ({tunnel})." +msgstr "{name} est déjà rattaché à un tunnel ({tunnel})." + +#: vpn/tables/crypto.py:22 +msgid "Authentication Method" +msgstr "Méthode d'authentification" + +#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +msgid "Encryption Algorithm" +msgstr "Algorithme de chiffrement" + +#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +msgid "Authentication Algorithm" +msgstr "Algorithme d'authentification" + +#: vpn/tables/crypto.py:34 +msgid "SA Lifetime" +msgstr "Toute une vie" + +#: vpn/tables/crypto.py:71 +msgid "Pre-shared Key" +msgstr "Clé pré-partagée" + +#: vpn/tables/crypto.py:103 +msgid "SA Lifetime (Seconds)" +msgstr "Une durée de vie (secondes)" + +#: vpn/tables/crypto.py:106 +msgid "SA Lifetime (KB)" +msgstr "Une vie entière (KB)" + +#: vpn/tables/l2vpn.py:69 +msgid "Object Parent" +msgstr "Parent de l'objet" + +#: vpn/tables/l2vpn.py:74 +msgid "Object Site" +msgstr "Site de l'objet" + +#: vpn/tables/tunnels.py:84 +msgid "Host" +msgstr "Hôte" + +#: wireless/choices.py:11 +msgid "Access point" +msgstr "Point d'accès" + +#: wireless/choices.py:12 +msgid "Station" +msgstr "Gare" + +#: wireless/choices.py:467 +msgid "Open" +msgstr "Ouvert" + +#: wireless/choices.py:469 +msgid "WPA Personal (PSK)" +msgstr "WPA Personnel (PSK)" + +#: wireless/choices.py:470 +msgid "WPA Enterprise" +msgstr "WPA Entreprise" + +#: wireless/forms/bulk_edit.py:72 wireless/forms/bulk_edit.py:119 +#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 +#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 +#: wireless/forms/filtersets.py:58 wireless/forms/filtersets.py:92 +msgid "Authentication cipher" +msgstr "Chiffrement d'authentification" + +#: wireless/forms/bulk_import.py:52 +msgid "Bridged VLAN" +msgstr "VLAN ponté" + +#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:27 +msgid "Interface A" +msgstr "Interface A" + +#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:36 +msgid "Interface B" +msgstr "Interface B" + +#: wireless/forms/model_forms.py:158 +msgid "Side B" +msgstr "Côté B" + +#: wireless/models.py:30 +msgid "authentication cipher" +msgstr "chiffrement d'authentification" + +#: wireless/models.py:68 +msgid "wireless LAN group" +msgstr "groupe LAN sans fil" + +#: wireless/models.py:69 +msgid "wireless LAN groups" +msgstr "groupes LAN sans fil" + +#: wireless/models.py:115 +msgid "wireless LAN" +msgstr "LAN sans fil" + +#: wireless/models.py:143 +msgid "interface A" +msgstr "interface A" + +#: wireless/models.py:150 +msgid "interface B" +msgstr "interface B" + +#: wireless/models.py:198 +msgid "wireless link" +msgstr "liaison sans fil" + +#: wireless/models.py:199 +msgid "wireless links" +msgstr "liens sans fil" + +#: wireless/models.py:216 wireless/models.py:222 +#, python-brace-format +msgid "{type} is not a wireless interface." +msgstr "{type} n'est pas une interface sans fil." diff --git a/netbox/translations/pt/LC_MESSAGES/django.mo b/netbox/translations/pt/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..dba8e89f7565589c8e2913d7f6a4e9bf4a11e9db GIT binary patch literal 197485 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 J*#KdGwBPjgLCydG literal 0 HcmV?d00001 diff --git a/netbox/translations/pt/LC_MESSAGES/django.po b/netbox/translations/pt/LC_MESSAGES/django.po new file mode 100644 index 000000000..2392a316a --- /dev/null +++ b/netbox/translations/pt/LC_MESSAGES/django.po @@ -0,0 +1,13589 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Renato Almeida de Oliveira, 2023 +# Jeremy Stretch, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-21 17:54+0000\n" +"PO-Revision-Date: 2023-10-30 17:48+0000\n" +"Last-Translator: Jeremy Stretch, 2023\n" +"Language-Team: Portuguese (https://app.transifex.com/netbox-community/teams/178115/pt/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: pt\n" +"Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" + +#: account/tables.py:27 templates/account/token.html:23 +#: templates/users/token.html:18 users/forms/bulk_import.py:41 +#: users/forms/model_forms.py:113 +msgid "Key" +msgstr "Chave" + +#: account/tables.py:31 users/forms/filtersets.py:133 +msgid "Write Enabled" +msgstr "Gravação ativada" + +#: account/tables.py:34 core/tables/jobs.py:29 extras/choices.py:135 +#: extras/tables/tables.py:469 templates/account/token.html:44 +#: templates/core/configrevision.html:34 +#: templates/core/configrevision_restore.html:12 templates/core/job.html:58 +#: templates/extras/htmx/report_result.html:11 +#: templates/extras/htmx/script_result.html:12 +#: templates/extras/journalentry.html:25 templates/generic/object.html:48 +#: templates/users/token.html:36 +msgid "Created" +msgstr "Criado" + +#: account/tables.py:37 templates/account/token.html:48 +#: templates/users/token.html:40 users/forms/bulk_edit.py:97 +#: users/forms/filtersets.py:137 +msgid "Expires" +msgstr "Expira" + +#: account/tables.py:40 users/forms/filtersets.py:142 +msgid "Last Used" +msgstr "Usado pela última vez" + +#: account/tables.py:43 templates/account/token.html:56 +#: templates/users/token.html:48 users/forms/bulk_edit.py:102 +#: users/forms/model_forms.py:125 +msgid "Allowed IPs" +msgstr "IPs permitidos" + +#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 +#: dcim/choices.py:174 dcim/choices.py:220 dcim/choices.py:1419 +#: dcim/choices.py:1495 dcim/choices.py:1545 virtualization/choices.py:20 +#: virtualization/choices.py:45 vpn/choices.py:18 +msgid "Planned" +msgstr "Planejado" + +#: circuits/choices.py:22 netbox/navigation/menu.py:290 +msgid "Provisioning" +msgstr "Provisionamento" + +#: circuits/choices.py:23 dcim/choices.py:22 dcim/choices.py:103 +#: dcim/choices.py:173 dcim/choices.py:219 dcim/choices.py:1494 +#: dcim/choices.py:1544 extras/tables/tables.py:375 ipam/choices.py:31 +#: ipam/choices.py:49 ipam/choices.py:69 ipam/choices.py:154 +#: templates/extras/configcontext.html:26 templates/users/user.html:34 +#: users/forms/bulk_edit.py:36 virtualization/choices.py:22 +#: virtualization/choices.py:44 vpn/choices.py:19 wireless/choices.py:25 +msgid "Active" +msgstr "Ativo" + +#: circuits/choices.py:24 dcim/choices.py:172 dcim/choices.py:218 +#: dcim/choices.py:1493 dcim/choices.py:1546 virtualization/choices.py:24 +#: virtualization/choices.py:43 +msgid "Offline" +msgstr "Off-line" + +#: circuits/choices.py:25 +msgid "Deprovisioning" +msgstr "Desprovisionamento" + +#: circuits/choices.py:26 +msgid "Decommissioned" +msgstr "Desativado" + +#: circuits/filtersets.py:29 circuits/filtersets.py:182 dcim/filtersets.py:120 +#: dcim/filtersets.py:181 dcim/filtersets.py:256 dcim/filtersets.py:364 +#: dcim/filtersets.py:881 dcim/filtersets.py:1177 dcim/filtersets.py:1672 +#: dcim/filtersets.py:1845 dcim/filtersets.py:1902 ipam/filtersets.py:305 +#: ipam/filtersets.py:896 virtualization/filtersets.py:45 +#: virtualization/filtersets.py:172 vpn/filtersets.py:330 +msgid "Region (ID)" +msgstr "Região (ID)" + +#: circuits/filtersets.py:36 circuits/filtersets.py:189 dcim/filtersets.py:126 +#: dcim/filtersets.py:188 dcim/filtersets.py:263 dcim/filtersets.py:371 +#: dcim/filtersets.py:888 dcim/filtersets.py:1184 dcim/filtersets.py:1679 +#: dcim/filtersets.py:1852 dcim/filtersets.py:1909 extras/filtersets.py:414 +#: ipam/filtersets.py:312 ipam/filtersets.py:903 +#: virtualization/filtersets.py:52 virtualization/filtersets.py:179 +#: vpn/filtersets.py:325 +msgid "Region (slug)" +msgstr "Região (slug)" + +#: circuits/filtersets.py:42 circuits/filtersets.py:195 dcim/filtersets.py:194 +#: dcim/filtersets.py:269 dcim/filtersets.py:377 dcim/filtersets.py:894 +#: dcim/filtersets.py:1190 dcim/filtersets.py:1685 dcim/filtersets.py:1858 +#: dcim/filtersets.py:1915 ipam/filtersets.py:318 ipam/filtersets.py:909 +#: virtualization/filtersets.py:58 virtualization/filtersets.py:185 +msgid "Site group (ID)" +msgstr "Grupo de sites (ID)" + +#: circuits/filtersets.py:49 circuits/filtersets.py:202 dcim/filtersets.py:201 +#: dcim/filtersets.py:276 dcim/filtersets.py:384 dcim/filtersets.py:901 +#: dcim/filtersets.py:1197 dcim/filtersets.py:1692 dcim/filtersets.py:1865 +#: dcim/filtersets.py:1922 extras/filtersets.py:420 ipam/filtersets.py:325 +#: ipam/filtersets.py:916 virtualization/filtersets.py:65 +#: virtualization/filtersets.py:192 +msgid "Site group (slug)" +msgstr "Grupo de sites (slug)" + +#: circuits/filtersets.py:54 circuits/forms/bulk_import.py:117 +#: circuits/forms/filtersets.py:47 circuits/forms/filtersets.py:171 +#: circuits/forms/model_forms.py:137 dcim/forms/bulk_edit.py:166 +#: dcim/forms/bulk_edit.py:238 dcim/forms/bulk_edit.py:570 +#: dcim/forms/bulk_edit.py:763 dcim/forms/bulk_import.py:130 +#: dcim/forms/bulk_import.py:176 dcim/forms/bulk_import.py:249 +#: dcim/forms/bulk_import.py:477 dcim/forms/bulk_import.py:1239 +#: dcim/forms/bulk_import.py:1267 dcim/forms/filtersets.py:84 +#: dcim/forms/filtersets.py:217 dcim/forms/filtersets.py:264 +#: dcim/forms/filtersets.py:373 dcim/forms/filtersets.py:680 +#: dcim/forms/filtersets.py:910 dcim/forms/filtersets.py:934 +#: dcim/forms/filtersets.py:1024 dcim/forms/filtersets.py:1062 +#: dcim/forms/filtersets.py:1468 dcim/forms/filtersets.py:1492 +#: dcim/forms/filtersets.py:1516 dcim/forms/model_forms.py:138 +#: dcim/forms/model_forms.py:167 dcim/forms/model_forms.py:211 +#: dcim/forms/model_forms.py:397 dcim/forms/model_forms.py:630 +#: dcim/forms/object_create.py:390 dcim/tables/devices.py:186 +#: dcim/tables/power.py:26 dcim/tables/power.py:93 dcim/tables/racks.py:62 +#: dcim/tables/racks.py:138 dcim/tables/sites.py:129 extras/filtersets.py:430 +#: ipam/forms/bulk_edit.py:215 ipam/forms/bulk_edit.py:269 +#: ipam/forms/bulk_edit.py:447 ipam/forms/bulk_edit.py:519 +#: ipam/forms/bulk_import.py:170 ipam/forms/bulk_import.py:437 +#: ipam/forms/filtersets.py:152 ipam/forms/filtersets.py:226 +#: ipam/forms/filtersets.py:417 ipam/forms/filtersets.py:470 +#: ipam/forms/model_forms.py:206 ipam/forms/model_forms.py:548 +#: ipam/forms/model_forms.py:640 ipam/tables/ip.py:244 +#: ipam/tables/vlans.py:114 ipam/tables/vlans.py:216 +#: templates/circuits/circuittermination_edit.html:20 +#: templates/circuits/inc/circuit_termination.html:33 +#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 +#: templates/dcim/inc/cable_termination.html:33 +#: templates/dcim/location.html:40 templates/dcim/powerpanel.html:23 +#: templates/dcim/rack.html:25 templates/dcim/rackreservation.html:31 +#: templates/dcim/site.html:27 templates/ipam/prefix.html:57 +#: templates/ipam/vlan.html:26 templates/ipam/vlan_edit.html:40 +#: templates/virtualization/cluster.html:45 +#: templates/virtualization/virtualmachine.html:96 +#: virtualization/forms/bulk_edit.py:90 virtualization/forms/bulk_edit.py:99 +#: virtualization/forms/bulk_edit.py:108 virtualization/forms/bulk_edit.py:123 +#: virtualization/forms/bulk_import.py:59 +#: virtualization/forms/bulk_import.py:85 +#: virtualization/forms/filtersets.py:78 +#: virtualization/forms/filtersets.py:144 +#: virtualization/forms/model_forms.py:74 +#: virtualization/forms/model_forms.py:107 +#: virtualization/forms/model_forms.py:174 +#: virtualization/tables/clusters.py:77 +#: virtualization/tables/virtualmachines.py:53 vpn/forms/filtersets.py:262 +#: wireless/forms/model_forms.py:77 wireless/forms/model_forms.py:117 +msgid "Site" +msgstr "Site" + +#: circuits/filtersets.py:60 circuits/filtersets.py:213 +#: circuits/filtersets.py:250 dcim/filtersets.py:211 dcim/filtersets.py:286 +#: dcim/filtersets.py:358 extras/filtersets.py:436 ipam/filtersets.py:215 +#: ipam/filtersets.py:335 ipam/filtersets.py:926 +#: virtualization/filtersets.py:75 virtualization/filtersets.py:202 +#: vpn/filtersets.py:335 +msgid "Site (slug)" +msgstr "Site (slug)" + +#: circuits/filtersets.py:65 +msgid "ASN (ID)" +msgstr "ASN (ID)" + +#: circuits/filtersets.py:86 circuits/filtersets.py:112 +#: circuits/filtersets.py:146 +msgid "Provider (ID)" +msgstr "Provedor (ID)" + +#: circuits/filtersets.py:92 circuits/filtersets.py:118 +#: circuits/filtersets.py:152 +msgid "Provider (slug)" +msgstr "Provedor (slug)" + +#: circuits/filtersets.py:157 +msgid "Provider account (ID)" +msgstr "Conta do provedor (ID)" + +#: circuits/filtersets.py:162 +msgid "Provider network (ID)" +msgstr "Rede do provedor (ID)" + +#: circuits/filtersets.py:166 +msgid "Circuit type (ID)" +msgstr "Tipo de circuito (ID)" + +#: circuits/filtersets.py:172 +msgid "Circuit type (slug)" +msgstr "Tipo de circuito (slug)" + +#: circuits/filtersets.py:207 circuits/filtersets.py:244 +#: dcim/filtersets.py:205 dcim/filtersets.py:280 dcim/filtersets.py:352 +#: dcim/filtersets.py:905 dcim/filtersets.py:1202 dcim/filtersets.py:1697 +#: dcim/filtersets.py:1869 dcim/filtersets.py:1927 ipam/filtersets.py:209 +#: ipam/filtersets.py:329 ipam/filtersets.py:920 +#: virtualization/filtersets.py:69 virtualization/filtersets.py:196 +#: vpn/filtersets.py:340 +msgid "Site (ID)" +msgstr "Site (ID)" + +#: circuits/filtersets.py:236 core/filtersets.py:73 core/filtersets.py:132 +#: dcim/filtersets.py:633 dcim/filtersets.py:1171 dcim/filtersets.py:1973 +#: extras/filtersets.py:40 extras/filtersets.py:69 extras/filtersets.py:101 +#: extras/filtersets.py:140 extras/filtersets.py:168 extras/filtersets.py:195 +#: extras/filtersets.py:226 extras/filtersets.py:295 extras/filtersets.py:343 +#: extras/filtersets.py:403 extras/filtersets.py:562 extras/filtersets.py:604 +#: extras/filtersets.py:645 ipam/forms/model_forms.py:430 +#: netbox/filtersets.py:275 netbox/forms/__init__.py:23 +#: netbox/forms/base.py:152 templates/htmx/object_selector.html:28 +#: templates/inc/filter_list.html:53 templates/ipam/ipaddress_assign.html:32 +#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:86 +#: users/filtersets.py:21 users/filtersets.py:37 users/filtersets.py:69 +#: users/filtersets.py:117 utilities/forms/forms.py:99 +msgid "Search" +msgstr "Busca" + +#: circuits/filtersets.py:240 circuits/forms/bulk_edit.py:167 +#: circuits/forms/model_forms.py:110 circuits/forms/model_forms.py:132 +#: dcim/forms/connections.py:66 templates/circuits/circuit.html:15 +#: templates/dcim/inc/cable_termination.html:55 +#: templates/dcim/trace/circuit.html:4 +msgid "Circuit" +msgstr "Circuito" + +#: circuits/filtersets.py:254 +msgid "ProviderNetwork (ID)" +msgstr "Rede do provedor (ID)" + +#: circuits/forms/bulk_edit.py:25 circuits/forms/filtersets.py:56 +#: circuits/forms/model_forms.py:26 circuits/tables/providers.py:33 +#: dcim/forms/bulk_edit.py:126 dcim/forms/filtersets.py:187 +#: dcim/forms/model_forms.py:126 dcim/tables/sites.py:94 +#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:219 +#: netbox/navigation/menu.py:160 netbox/navigation/menu.py:163 +#: templates/circuits/provider.html:24 +msgid "ASNs" +msgstr "ASNs" + +#: circuits/forms/bulk_edit.py:29 circuits/forms/bulk_edit.py:51 +#: circuits/forms/bulk_edit.py:78 circuits/forms/bulk_edit.py:99 +#: circuits/forms/bulk_edit.py:159 core/forms/bulk_edit.py:27 +#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:71 +#: dcim/forms/bulk_edit.py:90 dcim/forms/bulk_edit.py:149 +#: dcim/forms/bulk_edit.py:190 dcim/forms/bulk_edit.py:208 +#: dcim/forms/bulk_edit.py:336 dcim/forms/bulk_edit.py:371 +#: dcim/forms/bulk_edit.py:386 dcim/forms/bulk_edit.py:445 +#: dcim/forms/bulk_edit.py:484 dcim/forms/bulk_edit.py:514 +#: dcim/forms/bulk_edit.py:538 dcim/forms/bulk_edit.py:608 +#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:709 +#: dcim/forms/bulk_edit.py:732 dcim/forms/bulk_edit.py:780 +#: dcim/forms/bulk_edit.py:850 dcim/forms/bulk_edit.py:903 +#: dcim/forms/bulk_edit.py:938 dcim/forms/bulk_edit.py:978 +#: dcim/forms/bulk_edit.py:1022 dcim/forms/bulk_edit.py:1067 +#: dcim/forms/bulk_edit.py:1094 dcim/forms/bulk_edit.py:1112 +#: dcim/forms/bulk_edit.py:1130 dcim/forms/bulk_edit.py:1148 +#: dcim/forms/bulk_edit.py:1566 extras/forms/bulk_edit.py:36 +#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:152 +#: extras/forms/bulk_edit.py:182 extras/forms/bulk_edit.py:263 +#: extras/forms/bulk_edit.py:287 extras/forms/bulk_edit.py:301 +#: extras/tables/tables.py:56 ipam/forms/bulk_edit.py:50 +#: ipam/forms/bulk_edit.py:70 ipam/forms/bulk_edit.py:90 +#: ipam/forms/bulk_edit.py:114 ipam/forms/bulk_edit.py:143 +#: ipam/forms/bulk_edit.py:172 ipam/forms/bulk_edit.py:191 +#: ipam/forms/bulk_edit.py:260 ipam/forms/bulk_edit.py:304 +#: ipam/forms/bulk_edit.py:352 ipam/forms/bulk_edit.py:395 +#: ipam/forms/bulk_edit.py:423 ipam/forms/bulk_edit.py:551 +#: ipam/forms/bulk_edit.py:582 templates/account/token.html:36 +#: templates/circuits/circuit.html:60 templates/circuits/circuittype.html:29 +#: templates/circuits/inc/circuit_termination.html:115 +#: templates/circuits/provider.html:34 +#: templates/circuits/providernetwork.html:35 +#: templates/core/datasource.html:55 templates/dcim/cable.html:37 +#: templates/dcim/consoleport.html:47 templates/dcim/consoleserverport.html:47 +#: templates/dcim/device.html:96 templates/dcim/devicebay.html:35 +#: templates/dcim/devicerole.html:33 templates/dcim/devicetype.html:36 +#: templates/dcim/frontport.html:61 templates/dcim/interface.html:70 +#: templates/dcim/inventoryitem.html:61 +#: templates/dcim/inventoryitemrole.html:23 templates/dcim/location.html:36 +#: templates/dcim/manufacturer.html:43 templates/dcim/module.html:71 +#: templates/dcim/modulebay.html:39 templates/dcim/moduletype.html:27 +#: templates/dcim/platform.html:36 templates/dcim/powerfeed.html:43 +#: templates/dcim/poweroutlet.html:43 templates/dcim/powerpanel.html:31 +#: templates/dcim/powerport.html:43 templates/dcim/rack.html:54 +#: templates/dcim/rackreservation.html:69 templates/dcim/rackrole.html:29 +#: templates/dcim/rearport.html:57 templates/dcim/region.html:34 +#: templates/dcim/site.html:60 templates/dcim/sitegroup.html:34 +#: templates/dcim/virtualchassis.html:32 +#: templates/extras/admin/plugins_list.html:26 +#: templates/extras/configcontext.html:22 +#: templates/extras/configtemplate.html:18 +#: templates/extras/customfield.html:35 +#: templates/extras/dashboard/widget_add.html:14 +#: templates/extras/eventrule.html:24 templates/extras/exporttemplate.html:25 +#: templates/extras/report_list.html:47 templates/extras/savedfilter.html:18 +#: templates/extras/script_list.html:53 templates/extras/tag.html:23 +#: templates/extras/webhook.html:20 templates/generic/bulk_import.html:118 +#: templates/ipam/aggregate.html:44 templates/ipam/asn.html:43 +#: templates/ipam/asnrange.html:39 templates/ipam/fhrpgroup.html:35 +#: templates/ipam/ipaddress.html:58 templates/ipam/iprange.html:70 +#: templates/ipam/prefix.html:82 templates/ipam/rir.html:29 +#: templates/ipam/role.html:29 templates/ipam/routetarget.html:22 +#: templates/ipam/service.html:53 templates/ipam/servicetemplate.html:28 +#: templates/ipam/vlan.html:65 templates/ipam/vlangroup.html:35 +#: templates/ipam/vrf.html:36 templates/tenancy/contact.html:68 +#: templates/tenancy/contactgroup.html:28 +#: templates/tenancy/contactrole.html:23 templates/tenancy/tenant.html:25 +#: templates/tenancy/tenantgroup.html:36 +#: templates/users/objectpermission.html:22 templates/users/token.html:28 +#: templates/virtualization/cluster.html:28 +#: templates/virtualization/clustergroup.html:29 +#: templates/virtualization/clustertype.html:29 +#: templates/virtualization/virtualdisk.html:40 +#: templates/virtualization/virtualmachine.html:34 +#: templates/virtualization/vminterface.html:54 +#: templates/vpn/ikepolicy.html:18 templates/vpn/ikeproposal.html:18 +#: templates/vpn/ipsecpolicy.html:18 templates/vpn/ipsecprofile.html:18 +#: templates/vpn/ipsecprofile.html:43 templates/vpn/ipsecprofile.html:78 +#: templates/vpn/ipsecproposal.html:18 templates/vpn/l2vpn.html:27 +#: templates/vpn/tunnel.html:34 templates/vpn/tunnelgroup.html:33 +#: templates/wireless/wirelesslan.html:27 +#: templates/wireless/wirelesslangroup.html:34 +#: templates/wireless/wirelesslink.html:37 tenancy/forms/bulk_edit.py:31 +#: tenancy/forms/bulk_edit.py:79 tenancy/forms/bulk_edit.py:121 +#: users/forms/bulk_edit.py:62 users/forms/bulk_edit.py:92 +#: virtualization/forms/bulk_edit.py:31 virtualization/forms/bulk_edit.py:45 +#: virtualization/forms/bulk_edit.py:176 virtualization/forms/bulk_edit.py:227 +#: virtualization/forms/bulk_edit.py:336 vpn/forms/bulk_edit.py:27 +#: vpn/forms/bulk_edit.py:63 vpn/forms/bulk_edit.py:120 +#: vpn/forms/bulk_edit.py:154 vpn/forms/bulk_edit.py:191 +#: vpn/forms/bulk_edit.py:216 vpn/forms/bulk_edit.py:248 +#: vpn/forms/bulk_edit.py:277 wireless/forms/bulk_edit.py:28 +#: wireless/forms/bulk_edit.py:81 wireless/forms/bulk_edit.py:128 +msgid "Description" +msgstr "Descrição" + +#: circuits/forms/bulk_edit.py:46 circuits/forms/bulk_edit.py:68 +#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:35 +#: circuits/forms/bulk_import.py:50 circuits/forms/bulk_import.py:76 +#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 +#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 +#: circuits/forms/model_forms.py:32 circuits/forms/model_forms.py:44 +#: circuits/forms/model_forms.py:58 circuits/forms/model_forms.py:92 +#: circuits/tables/circuits.py:55 circuits/tables/providers.py:72 +#: circuits/tables/providers.py:103 templates/circuits/circuit.html:19 +#: templates/circuits/provider.html:20 +#: templates/circuits/provideraccount.html:21 +#: templates/circuits/providernetwork.html:23 +#: templates/dcim/inc/cable_termination.html:51 +msgid "Provider" +msgstr "Provedor" + +#: circuits/forms/bulk_edit.py:75 circuits/forms/filtersets.py:91 +#: templates/circuits/providernetwork.html:31 +msgid "Service ID" +msgstr "ID do serviço" + +#: circuits/forms/bulk_edit.py:95 circuits/forms/filtersets.py:107 +#: dcim/forms/bulk_edit.py:204 dcim/forms/bulk_edit.py:500 +#: dcim/forms/bulk_edit.py:694 dcim/forms/bulk_edit.py:1063 +#: dcim/forms/bulk_edit.py:1090 dcim/forms/bulk_edit.py:1562 +#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1353 +#: dcim/forms/filtersets.py:1374 dcim/tables/devices.py:717 +#: dcim/tables/devices.py:777 dcim/tables/devices.py:1004 +#: dcim/tables/devicetypes.py:245 dcim/tables/devicetypes.py:260 +#: dcim/tables/racks.py:32 extras/forms/bulk_edit.py:259 +#: extras/tables/tables.py:323 templates/circuits/circuittype.html:33 +#: templates/dcim/cable.html:41 templates/dcim/devicerole.html:37 +#: templates/dcim/frontport.html:43 templates/dcim/inventoryitemrole.html:27 +#: templates/dcim/rackrole.html:33 templates/dcim/rearport.html:43 +#: templates/extras/tag.html:29 +msgid "Color" +msgstr "Cor" + +#: circuits/forms/bulk_edit.py:113 circuits/forms/bulk_import.py:89 +#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:17 +#: core/forms/filtersets.py:29 core/tables/data.py:20 core/tables/jobs.py:18 +#: dcim/forms/bulk_edit.py:281 dcim/forms/bulk_edit.py:672 +#: dcim/forms/bulk_edit.py:811 dcim/forms/bulk_edit.py:879 +#: dcim/forms/bulk_edit.py:898 dcim/forms/bulk_edit.py:921 +#: dcim/forms/bulk_edit.py:963 dcim/forms/bulk_edit.py:1007 +#: dcim/forms/bulk_edit.py:1058 dcim/forms/bulk_edit.py:1085 +#: dcim/forms/bulk_import.py:206 dcim/forms/bulk_import.py:645 +#: dcim/forms/bulk_import.py:671 dcim/forms/bulk_import.py:697 +#: dcim/forms/bulk_import.py:717 dcim/forms/bulk_import.py:800 +#: dcim/forms/bulk_import.py:890 dcim/forms/bulk_import.py:932 +#: dcim/forms/bulk_import.py:1145 dcim/forms/bulk_import.py:1304 +#: dcim/forms/filtersets.py:286 dcim/forms/filtersets.py:867 +#: dcim/forms/filtersets.py:967 dcim/forms/filtersets.py:1088 +#: dcim/forms/filtersets.py:1158 dcim/forms/filtersets.py:1180 +#: dcim/forms/filtersets.py:1202 dcim/forms/filtersets.py:1219 +#: dcim/forms/filtersets.py:1253 dcim/forms/filtersets.py:1348 +#: dcim/forms/filtersets.py:1369 dcim/forms/object_import.py:89 +#: dcim/forms/object_import.py:118 dcim/forms/object_import.py:150 +#: dcim/tables/devices.py:211 dcim/tables/devices.py:833 +#: dcim/tables/power.py:77 extras/forms/bulk_import.py:39 +#: extras/tables/tables.py:345 extras/tables/tables.py:443 +#: netbox/tables/tables.py:234 templates/circuits/circuit.html:31 +#: templates/core/datasource.html:39 templates/dcim/cable.html:16 +#: templates/dcim/consoleport.html:39 templates/dcim/consoleserverport.html:39 +#: templates/dcim/frontport.html:39 templates/dcim/interface.html:47 +#: templates/dcim/interface.html:175 templates/dcim/interface.html:323 +#: templates/dcim/powerfeed.html:35 templates/dcim/poweroutlet.html:39 +#: templates/dcim/powerport.html:39 templates/dcim/rack.html:81 +#: templates/dcim/rearport.html:39 templates/extras/eventrule.html:95 +#: templates/virtualization/cluster.html:20 templates/vpn/l2vpn.html:23 +#: templates/wireless/inc/authentication_attrs.html:9 +#: templates/wireless/inc/wirelesslink_interface.html:14 +#: virtualization/forms/bulk_edit.py:59 virtualization/forms/bulk_import.py:41 +#: virtualization/forms/filtersets.py:53 +#: virtualization/forms/model_forms.py:65 virtualization/tables/clusters.py:66 +#: vpn/forms/bulk_edit.py:267 vpn/forms/bulk_import.py:259 +#: vpn/forms/filtersets.py:214 vpn/forms/model_forms.py:83 +#: vpn/forms/model_forms.py:118 vpn/forms/model_forms.py:232 +msgid "Type" +msgstr "Tipo" + +#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:82 +#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:97 +msgid "Provider account" +msgstr "Conta do provedor" + +#: circuits/forms/bulk_edit.py:131 circuits/forms/bulk_import.py:95 +#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:34 +#: core/forms/filtersets.py:75 core/tables/data.py:23 core/tables/jobs.py:26 +#: dcim/forms/bulk_edit.py:104 dcim/forms/bulk_edit.py:179 +#: dcim/forms/bulk_edit.py:260 dcim/forms/bulk_edit.py:593 +#: dcim/forms/bulk_edit.py:646 dcim/forms/bulk_edit.py:678 +#: dcim/forms/bulk_edit.py:805 dcim/forms/bulk_edit.py:1585 +#: dcim/forms/bulk_import.py:87 dcim/forms/bulk_import.py:146 +#: dcim/forms/bulk_import.py:194 dcim/forms/bulk_import.py:442 +#: dcim/forms/bulk_import.py:596 dcim/forms/bulk_import.py:1139 +#: dcim/forms/bulk_import.py:1299 dcim/forms/filtersets.py:170 +#: dcim/forms/filtersets.py:229 dcim/forms/filtersets.py:281 +#: dcim/forms/filtersets.py:726 dcim/forms/filtersets.py:835 +#: dcim/forms/filtersets.py:871 dcim/forms/filtersets.py:972 +#: dcim/forms/filtersets.py:1083 dcim/tables/devices.py:173 +#: dcim/tables/devices.py:836 dcim/tables/devices.py:1064 +#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:66 +#: dcim/tables/sites.py:82 dcim/tables/sites.py:133 +#: ipam/forms/bulk_edit.py:240 ipam/forms/bulk_edit.py:289 +#: ipam/forms/bulk_edit.py:337 ipam/forms/bulk_edit.py:541 +#: ipam/forms/bulk_import.py:191 ipam/forms/bulk_import.py:256 +#: ipam/forms/bulk_import.py:292 ipam/forms/bulk_import.py:458 +#: ipam/forms/filtersets.py:205 ipam/forms/filtersets.py:270 +#: ipam/forms/filtersets.py:341 ipam/forms/filtersets.py:482 +#: ipam/forms/model_forms.py:449 ipam/tables/ip.py:236 ipam/tables/ip.py:309 +#: ipam/tables/ip.py:359 ipam/tables/ip.py:421 ipam/tables/ip.py:448 +#: ipam/tables/vlans.py:122 ipam/tables/vlans.py:227 +#: templates/circuits/circuit.html:35 templates/core/datasource.html:47 +#: templates/core/job.html:35 templates/dcim/cable.html:20 +#: templates/dcim/device.html:183 templates/dcim/location.html:48 +#: templates/dcim/module.html:67 templates/dcim/powerfeed.html:39 +#: templates/dcim/rack.html:46 templates/dcim/site.html:43 +#: templates/extras/report_list.html:49 templates/extras/script_list.html:55 +#: templates/ipam/ipaddress.html:40 templates/ipam/iprange.html:57 +#: templates/ipam/prefix.html:74 templates/ipam/vlan.html:51 +#: templates/virtualization/cluster.html:24 +#: templates/virtualization/virtualmachine.html:22 +#: templates/vpn/tunnel.html:26 templates/wireless/wirelesslan.html:23 +#: templates/wireless/wirelesslink.html:20 users/forms/filtersets.py:33 +#: users/forms/model_forms.py:196 virtualization/forms/bulk_edit.py:69 +#: virtualization/forms/bulk_edit.py:117 +#: virtualization/forms/bulk_import.py:54 +#: virtualization/forms/bulk_import.py:80 +#: virtualization/forms/filtersets.py:61 +#: virtualization/forms/filtersets.py:156 virtualization/tables/clusters.py:74 +#: virtualization/tables/virtualmachines.py:50 vpn/forms/bulk_edit.py:38 +#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:46 +#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:42 +#: wireless/forms/bulk_edit.py:104 wireless/forms/bulk_import.py:43 +#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:48 +#: wireless/forms/filtersets.py:82 wireless/tables/wirelesslan.py:52 +#: wireless/tables/wirelesslink.py:19 +msgid "Status" +msgstr "Status" + +#: circuits/forms/bulk_edit.py:137 circuits/forms/bulk_import.py:100 +#: circuits/forms/filtersets.py:119 dcim/forms/bulk_edit.py:120 +#: dcim/forms/bulk_edit.py:185 dcim/forms/bulk_edit.py:255 +#: dcim/forms/bulk_edit.py:366 dcim/forms/bulk_edit.py:583 +#: dcim/forms/bulk_edit.py:684 dcim/forms/bulk_edit.py:1590 +#: dcim/forms/bulk_import.py:106 dcim/forms/bulk_import.py:151 +#: dcim/forms/bulk_import.py:187 dcim/forms/bulk_import.py:274 +#: dcim/forms/bulk_import.py:416 dcim/forms/bulk_import.py:1151 +#: dcim/forms/bulk_import.py:1356 dcim/forms/filtersets.py:165 +#: dcim/forms/filtersets.py:197 dcim/forms/filtersets.py:248 +#: dcim/forms/filtersets.py:333 dcim/forms/filtersets.py:354 +#: dcim/forms/filtersets.py:653 dcim/forms/filtersets.py:826 +#: dcim/forms/filtersets.py:891 dcim/forms/filtersets.py:921 +#: dcim/forms/filtersets.py:1043 dcim/tables/power.py:88 +#: extras/filtersets.py:517 extras/forms/filtersets.py:331 +#: extras/forms/filtersets.py:405 ipam/forms/bulk_edit.py:40 +#: ipam/forms/bulk_edit.py:65 ipam/forms/bulk_edit.py:109 +#: ipam/forms/bulk_edit.py:138 ipam/forms/bulk_edit.py:163 +#: ipam/forms/bulk_edit.py:235 ipam/forms/bulk_edit.py:284 +#: ipam/forms/bulk_edit.py:332 ipam/forms/bulk_edit.py:536 +#: ipam/forms/bulk_import.py:37 ipam/forms/bulk_import.py:66 +#: ipam/forms/bulk_import.py:94 ipam/forms/bulk_import.py:114 +#: ipam/forms/bulk_import.py:134 ipam/forms/bulk_import.py:163 +#: ipam/forms/bulk_import.py:249 ipam/forms/bulk_import.py:285 +#: ipam/forms/bulk_import.py:451 ipam/forms/filtersets.py:47 +#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:99 +#: ipam/forms/filtersets.py:119 ipam/forms/filtersets.py:142 +#: ipam/forms/filtersets.py:169 ipam/forms/filtersets.py:256 +#: ipam/forms/filtersets.py:296 ipam/forms/filtersets.py:450 +#: ipam/tables/ip.py:451 ipam/tables/vlans.py:224 +#: templates/circuits/circuit.html:39 templates/dcim/cable.html:24 +#: templates/dcim/device.html:81 templates/dcim/location.html:52 +#: templates/dcim/powerfeed.html:47 templates/dcim/rack.html:37 +#: templates/dcim/rackreservation.html:56 templates/dcim/site.html:47 +#: templates/dcim/virtualdevicecontext.html:55 +#: templates/ipam/aggregate.html:31 templates/ipam/asn.html:34 +#: templates/ipam/asnrange.html:30 templates/ipam/ipaddress.html:31 +#: templates/ipam/iprange.html:61 templates/ipam/prefix.html:30 +#: templates/ipam/routetarget.html:18 templates/ipam/vlan.html:42 +#: templates/ipam/vrf.html:23 templates/tenancy/tenant.html:17 +#: templates/virtualization/cluster.html:36 +#: templates/virtualization/virtualmachine.html:38 templates/vpn/l2vpn.html:31 +#: templates/vpn/tunnel.html:50 templates/wireless/wirelesslan.html:35 +#: templates/wireless/wirelesslink.html:28 tenancy/forms/forms.py:25 +#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:53 +#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:75 +#: virtualization/forms/bulk_edit.py:154 +#: virtualization/forms/bulk_import.py:66 +#: virtualization/forms/bulk_import.py:115 +#: virtualization/forms/filtersets.py:46 +#: virtualization/forms/filtersets.py:101 vpn/forms/bulk_edit.py:58 +#: vpn/forms/bulk_edit.py:272 vpn/forms/bulk_import.py:59 +#: vpn/forms/bulk_import.py:253 vpn/forms/filtersets.py:211 +#: wireless/forms/bulk_edit.py:62 wireless/forms/bulk_edit.py:109 +#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 +#: wireless/forms/filtersets.py:34 wireless/forms/filtersets.py:74 +msgid "Tenant" +msgstr "Inquilino" + +#: circuits/forms/bulk_edit.py:142 circuits/forms/filtersets.py:174 +msgid "Install date" +msgstr "Data de instalação" + +#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:179 +msgid "Termination date" +msgstr "Data de rescisão" + +#: circuits/forms/bulk_edit.py:153 circuits/forms/filtersets.py:186 +msgid "Commit rate (Kbps)" +msgstr "Taxa de confirmação (Kbps)" + +#: circuits/forms/bulk_edit.py:168 circuits/forms/model_forms.py:111 +msgid "Service Parameters" +msgstr "Parâmetros de serviço" + +#: circuits/forms/bulk_edit.py:169 circuits/forms/model_forms.py:112 +#: dcim/forms/model_forms.py:141 dcim/forms/model_forms.py:183 +#: dcim/forms/model_forms.py:260 dcim/forms/model_forms.py:672 +#: dcim/forms/model_forms.py:1478 ipam/forms/model_forms.py:61 +#: ipam/forms/model_forms.py:114 ipam/forms/model_forms.py:135 +#: ipam/forms/model_forms.py:159 ipam/forms/model_forms.py:231 +#: ipam/forms/model_forms.py:257 netbox/navigation/menu.py:38 +#: templates/dcim/cable_edit.html:68 templates/dcim/device_edit.html:85 +#: templates/dcim/rack_edit.html:30 templates/ipam/ipaddress_bulk_add.html:27 +#: templates/ipam/ipaddress_edit.html:27 templates/ipam/vlan_edit.html:22 +#: virtualization/forms/model_forms.py:83 +#: virtualization/forms/model_forms.py:225 vpn/forms/bulk_edit.py:77 +#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 +#: vpn/forms/model_forms.py:146 vpn/forms/model_forms.py:404 +#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:160 +msgid "Tenancy" +msgstr "Locação" + +#: circuits/forms/bulk_import.py:38 circuits/forms/bulk_import.py:53 +#: circuits/forms/bulk_import.py:79 +msgid "Assigned provider" +msgstr "Provedor atribuído" + +#: circuits/forms/bulk_import.py:70 dcim/forms/bulk_import.py:170 +#: dcim/forms/bulk_import.py:380 dcim/forms/bulk_import.py:1092 +#: dcim/forms/bulk_import.py:1171 extras/forms/bulk_import.py:229 +msgid "RGB color in hexadecimal. Example:" +msgstr "Cor RGB em hexadecimal. Exemplo:" + +#: circuits/forms/bulk_import.py:85 +msgid "Assigned provider account" +msgstr "Conta de provedor atribuída" + +#: circuits/forms/bulk_import.py:92 +msgid "Type of circuit" +msgstr "Tipo de circuito" + +#: circuits/forms/bulk_import.py:97 dcim/forms/bulk_import.py:89 +#: dcim/forms/bulk_import.py:148 dcim/forms/bulk_import.py:196 +#: dcim/forms/bulk_import.py:444 dcim/forms/bulk_import.py:598 +#: dcim/forms/bulk_import.py:1301 ipam/forms/bulk_import.py:193 +#: ipam/forms/bulk_import.py:258 ipam/forms/bulk_import.py:294 +#: ipam/forms/bulk_import.py:460 virtualization/forms/bulk_import.py:56 +#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 +msgid "Operational status" +msgstr "Status operacional" + +#: circuits/forms/bulk_import.py:104 dcim/forms/bulk_import.py:110 +#: dcim/forms/bulk_import.py:155 dcim/forms/bulk_import.py:278 +#: dcim/forms/bulk_import.py:420 dcim/forms/bulk_import.py:1155 +#: dcim/forms/bulk_import.py:1296 ipam/forms/bulk_import.py:41 +#: ipam/forms/bulk_import.py:70 ipam/forms/bulk_import.py:98 +#: ipam/forms/bulk_import.py:118 ipam/forms/bulk_import.py:138 +#: ipam/forms/bulk_import.py:167 ipam/forms/bulk_import.py:253 +#: ipam/forms/bulk_import.py:289 ipam/forms/bulk_import.py:455 +#: virtualization/forms/bulk_import.py:70 +#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 +#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +msgid "Assigned tenant" +msgstr "Inquilino designado" + +#: circuits/forms/bulk_import.py:123 circuits/forms/filtersets.py:147 +#: circuits/forms/model_forms.py:143 +msgid "Provider network" +msgstr "Rede de provedores" + +#: circuits/forms/filtersets.py:26 circuits/forms/filtersets.py:118 +#: dcim/forms/bulk_edit.py:247 dcim/forms/bulk_edit.py:345 +#: dcim/forms/bulk_edit.py:575 dcim/forms/bulk_edit.py:622 +#: dcim/forms/bulk_edit.py:772 dcim/forms/bulk_import.py:181 +#: dcim/forms/bulk_import.py:255 dcim/forms/bulk_import.py:483 +#: dcim/forms/bulk_import.py:1245 dcim/forms/bulk_import.py:1279 +#: dcim/forms/filtersets.py:92 dcim/forms/filtersets.py:245 +#: dcim/forms/filtersets.py:278 dcim/forms/filtersets.py:330 +#: dcim/forms/filtersets.py:381 dcim/forms/filtersets.py:650 +#: dcim/forms/filtersets.py:689 dcim/forms/filtersets.py:890 +#: dcim/forms/filtersets.py:919 dcim/forms/filtersets.py:939 +#: dcim/forms/filtersets.py:1003 dcim/forms/filtersets.py:1033 +#: dcim/forms/filtersets.py:1042 dcim/forms/filtersets.py:1153 +#: dcim/forms/filtersets.py:1175 dcim/forms/filtersets.py:1197 +#: dcim/forms/filtersets.py:1214 dcim/forms/filtersets.py:1234 +#: dcim/forms/filtersets.py:1342 dcim/forms/filtersets.py:1364 +#: dcim/forms/filtersets.py:1385 dcim/forms/filtersets.py:1400 +#: dcim/forms/filtersets.py:1411 dcim/forms/model_forms.py:182 +#: dcim/forms/model_forms.py:216 dcim/forms/model_forms.py:402 +#: dcim/forms/model_forms.py:635 dcim/tables/devices.py:190 +#: dcim/tables/power.py:30 dcim/tables/racks.py:58 dcim/tables/racks.py:143 +#: extras/filtersets.py:441 extras/forms/filtersets.py:328 +#: ipam/forms/bulk_edit.py:456 ipam/forms/filtersets.py:168 +#: ipam/forms/filtersets.py:400 ipam/forms/filtersets.py:422 +#: ipam/forms/filtersets.py:448 ipam/forms/model_forms.py:560 +#: templates/dcim/device.html:26 templates/dcim/device_edit.html:30 +#: templates/dcim/inc/cable_termination.html:12 +#: templates/dcim/location.html:27 templates/dcim/powerpanel.html:27 +#: templates/dcim/rack.html:29 templates/dcim/rackreservation.html:35 +#: virtualization/forms/filtersets.py:45 virtualization/forms/filtersets.py:99 +#: wireless/forms/model_forms.py:88 wireless/forms/model_forms.py:128 +msgid "Location" +msgstr "Localização" + +#: circuits/forms/filtersets.py:27 ipam/forms/model_forms.py:158 +#: ipam/models/asns.py:108 ipam/models/asns.py:125 ipam/tables/asn.py:41 +#: templates/ipam/asn.html:20 +msgid "ASN" +msgstr "ASN" + +#: circuits/forms/filtersets.py:28 circuits/forms/filtersets.py:120 +#: dcim/forms/filtersets.py:136 dcim/forms/filtersets.py:150 +#: dcim/forms/filtersets.py:166 dcim/forms/filtersets.py:198 +#: dcim/forms/filtersets.py:249 dcim/forms/filtersets.py:334 +#: dcim/forms/filtersets.py:408 dcim/forms/filtersets.py:654 +#: dcim/forms/filtersets.py:1004 netbox/navigation/menu.py:45 +#: netbox/navigation/menu.py:47 tenancy/tables/columns.py:70 +#: tenancy/tables/contacts.py:25 tenancy/views.py:18 +#: virtualization/forms/filtersets.py:36 virtualization/forms/filtersets.py:47 +#: virtualization/forms/filtersets.py:102 +msgid "Contacts" +msgstr "Contatos" + +#: circuits/forms/filtersets.py:33 circuits/forms/filtersets.py:157 +#: dcim/forms/bulk_edit.py:110 dcim/forms/bulk_edit.py:222 +#: dcim/forms/bulk_edit.py:747 dcim/forms/bulk_import.py:92 +#: dcim/forms/filtersets.py:70 dcim/forms/filtersets.py:177 +#: dcim/forms/filtersets.py:203 dcim/forms/filtersets.py:256 +#: dcim/forms/filtersets.py:359 dcim/forms/filtersets.py:666 +#: dcim/forms/filtersets.py:896 dcim/forms/filtersets.py:926 +#: dcim/forms/filtersets.py:1010 dcim/forms/filtersets.py:1049 +#: dcim/forms/filtersets.py:1460 dcim/forms/filtersets.py:1484 +#: dcim/forms/filtersets.py:1508 dcim/forms/model_forms.py:80 +#: dcim/forms/model_forms.py:115 dcim/forms/object_create.py:374 +#: dcim/tables/devices.py:176 dcim/tables/sites.py:85 extras/filtersets.py:408 +#: ipam/forms/bulk_edit.py:205 ipam/forms/bulk_edit.py:437 +#: ipam/forms/bulk_edit.py:509 ipam/forms/filtersets.py:212 +#: ipam/forms/filtersets.py:407 ipam/forms/filtersets.py:456 +#: ipam/forms/model_forms.py:532 templates/dcim/device.html:18 +#: templates/dcim/rack.html:19 templates/dcim/rackreservation.html:25 +#: templates/dcim/region.html:26 templates/dcim/site.html:31 +#: templates/ipam/prefix.html:50 templates/ipam/vlan.html:19 +#: virtualization/forms/bulk_edit.py:80 virtualization/forms/filtersets.py:58 +#: virtualization/forms/filtersets.py:129 +#: virtualization/forms/model_forms.py:95 vpn/forms/filtersets.py:253 +msgid "Region" +msgstr "Região" + +#: circuits/forms/filtersets.py:38 circuits/forms/filtersets.py:162 +#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:755 +#: dcim/forms/filtersets.py:75 dcim/forms/filtersets.py:182 +#: dcim/forms/filtersets.py:208 dcim/forms/filtersets.py:269 +#: dcim/forms/filtersets.py:364 dcim/forms/filtersets.py:671 +#: dcim/forms/filtersets.py:901 dcim/forms/filtersets.py:1015 +#: dcim/forms/filtersets.py:1054 dcim/forms/object_create.py:382 +#: extras/filtersets.py:425 ipam/forms/bulk_edit.py:210 +#: ipam/forms/bulk_edit.py:444 ipam/forms/bulk_edit.py:514 +#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:412 +#: ipam/forms/filtersets.py:461 ipam/forms/model_forms.py:545 +#: virtualization/forms/bulk_edit.py:85 virtualization/forms/filtersets.py:68 +#: virtualization/forms/filtersets.py:134 +#: virtualization/forms/model_forms.py:101 +msgid "Site group" +msgstr "Grupo de sites" + +#: circuits/forms/filtersets.py:51 +msgid "ASN (legacy)" +msgstr "ASN (legado)" + +#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 +#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 +#: core/forms/filtersets.py:63 dcim/forms/bulk_edit.py:718 +#: dcim/forms/filtersets.py:164 dcim/forms/filtersets.py:196 +#: dcim/forms/filtersets.py:825 dcim/forms/filtersets.py:920 +#: dcim/forms/filtersets.py:1044 dcim/forms/filtersets.py:1152 +#: dcim/forms/filtersets.py:1174 dcim/forms/filtersets.py:1196 +#: dcim/forms/filtersets.py:1213 dcim/forms/filtersets.py:1230 +#: dcim/forms/filtersets.py:1341 dcim/forms/filtersets.py:1363 +#: dcim/forms/filtersets.py:1384 dcim/forms/filtersets.py:1399 +#: dcim/forms/filtersets.py:1410 extras/forms/filtersets.py:40 +#: extras/forms/filtersets.py:111 extras/forms/filtersets.py:142 +#: extras/forms/filtersets.py:182 extras/forms/filtersets.py:198 +#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:253 +#: extras/forms/filtersets.py:450 extras/forms/filtersets.py:491 +#: ipam/forms/filtersets.py:98 ipam/forms/filtersets.py:255 +#: ipam/forms/filtersets.py:294 ipam/forms/filtersets.py:368 +#: ipam/forms/filtersets.py:449 ipam/forms/filtersets.py:508 +#: ipam/forms/filtersets.py:526 netbox/tables/tables.py:250 +#: virtualization/forms/filtersets.py:44 +#: virtualization/forms/filtersets.py:100 +#: virtualization/forms/filtersets.py:190 +#: virtualization/forms/filtersets.py:235 vpn/forms/filtersets.py:210 +#: wireless/forms/filtersets.py:33 wireless/forms/filtersets.py:73 +msgid "Attributes" +msgstr "Atributos" + +#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:60 +#: circuits/tables/providers.py:66 templates/circuits/circuit.html:23 +#: templates/circuits/provideraccount.html:25 +msgid "Account" +msgstr "Conta" + +#: circuits/forms/model_forms.py:64 +#: templates/circuits/circuittermination_edit.html:23 +#: templates/circuits/inc/circuit_termination.html:89 +#: templates/circuits/providernetwork.html:18 +msgid "Provider Network" +msgstr "Rede de provedores" + +#: circuits/forms/model_forms.py:78 templates/circuits/circuittype.html:20 +msgid "Circuit Type" +msgstr "Tipo de circuito" + +#: circuits/models/circuits.py:25 dcim/models/cables.py:67 +#: dcim/models/device_component_templates.py:491 +#: dcim/models/device_component_templates.py:591 +#: dcim/models/device_components.py:976 dcim/models/device_components.py:1050 +#: dcim/models/device_components.py:1166 dcim/models/devices.py:467 +#: dcim/models/racks.py:43 extras/models/tags.py:28 +msgid "color" +msgstr "cor" + +#: circuits/models/circuits.py:34 +msgid "circuit type" +msgstr "tipo de circuito" + +#: circuits/models/circuits.py:35 +msgid "circuit types" +msgstr "tipos de circuito" + +#: circuits/models/circuits.py:46 +msgid "circuit ID" +msgstr "ID do circuito" + +#: circuits/models/circuits.py:47 +msgid "Unique circuit ID" +msgstr "ID de circuito exclusivo" + +#: circuits/models/circuits.py:67 core/models/data.py:54 +#: core/models/jobs.py:85 dcim/models/cables.py:49 dcim/models/devices.py:641 +#: dcim/models/devices.py:1165 dcim/models/devices.py:1374 +#: dcim/models/power.py:95 dcim/models/racks.py:97 dcim/models/sites.py:154 +#: dcim/models/sites.py:266 ipam/models/ip.py:252 ipam/models/ip.py:521 +#: ipam/models/ip.py:729 ipam/models/vlans.py:175 +#: virtualization/models/clusters.py:74 +#: virtualization/models/virtualmachines.py:82 vpn/models/tunnels.py:40 +#: wireless/models.py:94 wireless/models.py:158 +msgid "status" +msgstr "status" + +#: circuits/models/circuits.py:82 +msgid "installed" +msgstr "instalada" + +#: circuits/models/circuits.py:87 +msgid "terminates" +msgstr "termina" + +#: circuits/models/circuits.py:92 +msgid "commit rate (Kbps)" +msgstr "taxa de confirmação (Kbps)" + +#: circuits/models/circuits.py:93 +msgid "Committed rate" +msgstr "Taxa comprometida" + +#: circuits/models/circuits.py:135 +msgid "circuit" +msgstr "circuito" + +#: circuits/models/circuits.py:136 +msgid "circuits" +msgstr "circuitos" + +#: circuits/models/circuits.py:169 +msgid "termination" +msgstr "terminação" + +#: circuits/models/circuits.py:186 +msgid "port speed (Kbps)" +msgstr "velocidade da porta (Kbps)" + +#: circuits/models/circuits.py:189 +msgid "Physical circuit speed" +msgstr "Velocidade do circuito físico" + +#: circuits/models/circuits.py:194 +msgid "upstream speed (Kbps)" +msgstr "velocidade de upstream (Kbps)" + +#: circuits/models/circuits.py:195 +msgid "Upstream speed, if different from port speed" +msgstr "Velocidade de upstream, se diferente da velocidade da porta" + +#: circuits/models/circuits.py:200 +msgid "cross-connect ID" +msgstr "ID de conexão cruzada" + +#: circuits/models/circuits.py:201 +msgid "ID of the local cross-connect" +msgstr "ID da conexão cruzada local" + +#: circuits/models/circuits.py:206 +msgid "patch panel/port(s)" +msgstr "painel de remendo/porta (s)" + +#: circuits/models/circuits.py:207 +msgid "Patch panel ID and port number(s)" +msgstr "ID do painel de patch e número (s) de porta" + +#: circuits/models/circuits.py:210 +#: dcim/models/device_component_templates.py:61 +#: dcim/models/device_components.py:69 dcim/models/racks.py:537 +#: extras/models/configs.py:45 extras/models/configs.py:219 +#: extras/models/customfields.py:122 extras/models/models.py:58 +#: extras/models/models.py:188 extras/models/models.py:426 +#: extras/models/models.py:541 extras/models/staging.py:31 +#: extras/models/tags.py:32 netbox/models/__init__.py:109 +#: netbox/models/__init__.py:144 netbox/models/__init__.py:190 +#: users/models.py:273 users/models.py:348 +#: virtualization/models/virtualmachines.py:282 +msgid "description" +msgstr "descrição" + +#: circuits/models/circuits.py:223 +msgid "circuit termination" +msgstr "terminação do circuito" + +#: circuits/models/circuits.py:224 +msgid "circuit terminations" +msgstr "terminações de circuito" + +#: circuits/models/providers.py:22 circuits/models/providers.py:66 +#: circuits/models/providers.py:104 core/models/data.py:41 +#: core/models/jobs.py:46 dcim/models/device_component_templates.py:43 +#: dcim/models/device_components.py:54 dcim/models/devices.py:581 +#: dcim/models/devices.py:1305 dcim/models/devices.py:1370 +#: dcim/models/power.py:39 dcim/models/power.py:91 dcim/models/racks.py:62 +#: dcim/models/sites.py:138 extras/models/configs.py:36 +#: extras/models/configs.py:215 extras/models/customfields.py:89 +#: extras/models/models.py:53 extras/models/models.py:183 +#: extras/models/models.py:326 extras/models/models.py:422 +#: extras/models/models.py:531 extras/models/models.py:626 +#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 +#: ipam/models/services.py:52 ipam/models/services.py:88 +#: ipam/models/vlans.py:26 ipam/models/vlans.py:164 ipam/models/vrfs.py:22 +#: ipam/models/vrfs.py:79 netbox/models/__init__.py:136 +#: netbox/models/__init__.py:180 tenancy/models/contacts.py:64 +#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 +#: users/models.py:344 virtualization/models/clusters.py:57 +#: virtualization/models/virtualmachines.py:70 +#: virtualization/models/virtualmachines.py:272 vpn/models/crypto.py:24 +#: vpn/models/crypto.py:71 vpn/models/crypto.py:119 vpn/models/crypto.py:171 +#: vpn/models/crypto.py:209 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 +#: wireless/models.py:50 +msgid "name" +msgstr "nome" + +#: circuits/models/providers.py:25 +msgid "Full name of the provider" +msgstr "Nome completo do provedor" + +#: circuits/models/providers.py:28 dcim/models/devices.py:86 +#: dcim/models/sites.py:149 extras/models/models.py:536 ipam/models/asns.py:23 +#: ipam/models/vlans.py:30 netbox/models/__init__.py:140 +#: netbox/models/__init__.py:185 tenancy/models/tenants.py:25 +#: tenancy/models/tenants.py:49 vpn/models/l2vpn.py:27 wireless/models.py:55 +msgid "slug" +msgstr "slug" + +#: circuits/models/providers.py:42 +msgid "provider" +msgstr "provedor" + +#: circuits/models/providers.py:43 +msgid "providers" +msgstr "provedores" + +#: circuits/models/providers.py:63 +msgid "account ID" +msgstr "ID da conta" + +#: circuits/models/providers.py:86 +msgid "provider account" +msgstr "conta do provedor" + +#: circuits/models/providers.py:87 +msgid "provider accounts" +msgstr "contas de provedores" + +#: circuits/models/providers.py:115 +msgid "service ID" +msgstr "ID do serviço" + +#: circuits/models/providers.py:126 +msgid "provider network" +msgstr "rede do provedor" + +#: circuits/models/providers.py:127 +msgid "provider networks" +msgstr "redes de provedores" + +#: circuits/tables/circuits.py:29 circuits/tables/providers.py:18 +#: circuits/tables/providers.py:69 circuits/tables/providers.py:99 +#: core/tables/data.py:16 core/tables/jobs.py:14 dcim/forms/filtersets.py:60 +#: dcim/forms/object_create.py:42 dcim/tables/devices.py:88 +#: dcim/tables/devices.py:125 dcim/tables/devices.py:167 +#: dcim/tables/devices.py:318 dcim/tables/devices.py:395 +#: dcim/tables/devices.py:439 dcim/tables/devices.py:491 +#: dcim/tables/devices.py:543 dcim/tables/devices.py:663 +#: dcim/tables/devices.py:744 dcim/tables/devices.py:794 +#: dcim/tables/devices.py:860 dcim/tables/devices.py:975 +#: dcim/tables/devices.py:995 dcim/tables/devices.py:1024 +#: dcim/tables/devices.py:1054 dcim/tables/devicetypes.py:32 +#: dcim/tables/power.py:22 dcim/tables/power.py:62 dcim/tables/racks.py:23 +#: dcim/tables/racks.py:53 dcim/tables/sites.py:24 dcim/tables/sites.py:51 +#: dcim/tables/sites.py:78 dcim/tables/sites.py:125 +#: extras/forms/filtersets.py:190 extras/tables/tables.py:40 +#: extras/tables/tables.py:83 extras/tables/tables.py:115 +#: extras/tables/tables.py:139 extras/tables/tables.py:204 +#: extras/tables/tables.py:251 extras/tables/tables.py:274 +#: extras/tables/tables.py:319 extras/tables/tables.py:371 +#: extras/tables/tables.py:394 ipam/forms/bulk_edit.py:390 +#: ipam/forms/filtersets.py:372 ipam/tables/asn.py:16 ipam/tables/ip.py:85 +#: ipam/tables/ip.py:159 ipam/tables/services.py:15 ipam/tables/services.py:40 +#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:110 ipam/tables/vrfs.py:26 +#: ipam/tables/vrfs.py:67 templates/circuits/circuittype.html:25 +#: templates/circuits/provideraccount.html:29 +#: templates/circuits/providernetwork.html:27 +#: templates/core/datasource.html:35 templates/core/job.html:31 +#: templates/dcim/consoleport.html:31 templates/dcim/consoleserverport.html:31 +#: templates/dcim/devicebay.html:27 templates/dcim/devicerole.html:29 +#: templates/dcim/frontport.html:31 +#: templates/dcim/inc/interface_vlans_table.html:5 +#: templates/dcim/inc/panels/inventory_items.html:10 +#: templates/dcim/interface.html:39 templates/dcim/interface.html:171 +#: templates/dcim/inventoryitem.html:29 +#: templates/dcim/inventoryitemrole.html:19 templates/dcim/location.html:32 +#: templates/dcim/manufacturer.html:39 templates/dcim/modulebay.html:27 +#: templates/dcim/platform.html:32 templates/dcim/poweroutlet.html:31 +#: templates/dcim/powerport.html:31 templates/dcim/rackrole.html:25 +#: templates/dcim/rearport.html:31 templates/dcim/region.html:30 +#: templates/dcim/sitegroup.html:30 +#: templates/dcim/virtualdevicecontext.html:21 +#: templates/extras/admin/plugins_list.html:22 +#: templates/extras/configcontext.html:14 +#: templates/extras/configtemplate.html:14 +#: templates/extras/customfield.html:16 templates/extras/customlink.html:14 +#: templates/extras/eventrule.html:16 templates/extras/exporttemplate.html:21 +#: templates/extras/report_list.html:46 templates/extras/savedfilter.html:14 +#: templates/extras/script_list.html:52 templates/extras/tag.html:17 +#: templates/extras/webhook.html:16 templates/ipam/asnrange.html:16 +#: templates/ipam/fhrpgroup.html:31 templates/ipam/rir.html:25 +#: templates/ipam/role.html:25 templates/ipam/routetarget.html:14 +#: templates/ipam/service.html:27 templates/ipam/servicetemplate.html:16 +#: templates/ipam/vlan.html:38 templates/ipam/vlangroup.html:31 +#: templates/tenancy/contact.html:26 templates/tenancy/contactgroup.html:24 +#: templates/tenancy/contactrole.html:19 templates/tenancy/tenantgroup.html:32 +#: templates/users/group.html:18 templates/users/objectpermission.html:18 +#: templates/virtualization/cluster.html:16 +#: templates/virtualization/clustergroup.html:25 +#: templates/virtualization/clustertype.html:25 +#: templates/virtualization/virtualdisk.html:26 +#: templates/virtualization/virtualmachine.html:18 +#: templates/virtualization/vminterface.html:28 +#: templates/vpn/ikepolicy.html:14 templates/vpn/ikeproposal.html:14 +#: templates/vpn/ipsecpolicy.html:14 templates/vpn/ipsecprofile.html:14 +#: templates/vpn/ipsecprofile.html:39 templates/vpn/ipsecprofile.html:74 +#: templates/vpn/ipsecproposal.html:14 templates/vpn/l2vpn.html:15 +#: templates/vpn/tunnel.html:22 templates/vpn/tunnelgroup.html:29 +#: templates/wireless/wirelesslangroup.html:30 tenancy/tables/contacts.py:19 +#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 +#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 +#: users/tables.py:62 users/tables.py:79 +#: virtualization/forms/bulk_create.py:20 +#: virtualization/forms/object_create.py:13 +#: virtualization/forms/object_create.py:23 +#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 +#: virtualization/tables/clusters.py:62 +#: virtualization/tables/virtualmachines.py:45 +#: virtualization/tables/virtualmachines.py:119 +#: virtualization/tables/virtualmachines.py:172 vpn/tables/crypto.py:18 +#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 +#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 +#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 +#: wireless/tables/wirelesslan.py:79 +msgid "Name" +msgstr "Nome" + +#: circuits/tables/circuits.py:38 circuits/tables/providers.py:45 +#: circuits/tables/providers.py:79 netbox/navigation/menu.py:254 +#: netbox/navigation/menu.py:258 netbox/navigation/menu.py:260 +#: templates/circuits/provider.html:61 +#: templates/circuits/provideraccount.html:46 +#: templates/circuits/providernetwork.html:54 +msgid "Circuits" +msgstr "Circuitos" + +#: circuits/tables/circuits.py:52 templates/circuits/circuit.html:27 +msgid "Circuit ID" +msgstr "ID do circuito" + +#: circuits/tables/circuits.py:65 wireless/forms/model_forms.py:157 +msgid "Side A" +msgstr "Lado A" + +#: circuits/tables/circuits.py:69 +msgid "Side Z" +msgstr "Lado Z" + +#: circuits/tables/circuits.py:72 templates/circuits/circuit.html:56 +msgid "Commit Rate" +msgstr "Taxa de comprometimento" + +#: circuits/tables/circuits.py:75 circuits/tables/providers.py:48 +#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 +#: dcim/tables/devices.py:1037 dcim/tables/devicetypes.py:92 +#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 +#: dcim/tables/power.py:96 dcim/tables/racks.py:76 dcim/tables/racks.py:156 +#: dcim/tables/sites.py:103 extras/forms/bulk_edit.py:320 +#: extras/tables/tables.py:485 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 +#: ipam/tables/ip.py:135 ipam/tables/ip.py:272 ipam/tables/ip.py:325 +#: ipam/tables/ip.py:392 ipam/tables/services.py:24 ipam/tables/services.py:54 +#: ipam/tables/vlans.py:141 ipam/tables/vrfs.py:46 ipam/tables/vrfs.py:71 +#: templates/dcim/cable_edit.html:85 templates/generic/bulk_edit.html:102 +#: templates/inc/panels/comments.html:6 tenancy/tables/contacts.py:68 +#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 +#: virtualization/tables/clusters.py:91 +#: virtualization/tables/virtualmachines.py:68 vpn/tables/crypto.py:37 +#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 +#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:57 +#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +msgid "Comments" +msgstr "Comentários" + +#: circuits/tables/providers.py:23 +msgid "Accounts" +msgstr "Contas" + +#: circuits/tables/providers.py:29 +msgid "Account Count" +msgstr "Contagem de contas" + +#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +msgid "ASN Count" +msgstr "Contagem de ASN" + +#: core/choices.py:18 +msgid "New" +msgstr "Novo" + +#: core/choices.py:19 +msgid "Queued" +msgstr "Em fila" + +#: core/choices.py:20 +msgid "Syncing" +msgstr "Sincronizando" + +#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 +#: extras/choices.py:210 templates/core/job.html:75 +msgid "Completed" +msgstr "Concluído" + +#: core/choices.py:22 core/choices.py:59 dcim/choices.py:176 +#: dcim/choices.py:222 dcim/choices.py:1496 extras/choices.py:212 +#: virtualization/choices.py:47 +msgid "Failed" +msgstr "Falhou" + +#: core/choices.py:35 netbox/navigation/menu.py:330 +#: templates/extras/script/base.html:14 templates/extras/script_list.html:6 +#: templates/extras/script_list.html:20 templates/extras/script_result.html:18 +msgid "Scripts" +msgstr "Scripts" + +#: core/choices.py:36 netbox/navigation/menu.py:324 +#: templates/extras/report/base.html:13 templates/extras/report_list.html:7 +#: templates/extras/report_list.html:12 +msgid "Reports" +msgstr "Relatórios" + +#: core/choices.py:54 extras/choices.py:207 +msgid "Pending" +msgstr "Pendente" + +#: core/choices.py:55 core/tables/jobs.py:32 extras/choices.py:208 +#: templates/core/job.html:62 +msgid "Scheduled" +msgstr "Programado" + +#: core/choices.py:56 extras/choices.py:209 +msgid "Running" +msgstr "Correndo" + +#: core/choices.py:58 extras/choices.py:211 +msgid "Errored" +msgstr "Errado" + +#: core/data_backends.py:29 templates/dcim/interface.html:224 +msgid "Local" +msgstr "Local" + +#: core/data_backends.py:47 extras/tables/tables.py:431 +#: templates/account/profile.html:16 templates/users/user.html:18 +#: users/tables.py:31 +msgid "Username" +msgstr "Nome de usuário" + +#: core/data_backends.py:49 core/data_backends.py:55 +msgid "Only used for cloning with HTTP(S)" +msgstr "Usado apenas para clonagem com HTTP (S)" + +#: core/data_backends.py:53 templates/account/base.html:17 +#: templates/account/password.html:11 users/forms/model_forms.py:171 +msgid "Password" +msgstr "Senha" + +#: core/data_backends.py:59 +msgid "Branch" +msgstr "Filial" + +#: core/data_backends.py:118 +msgid "AWS access key ID" +msgstr "ID da chave de acesso da AWS" + +#: core/data_backends.py:122 +msgid "AWS secret access key" +msgstr "Chave de acesso secreta da AWS" + +#: core/filtersets.py:49 extras/filtersets.py:203 extras/filtersets.py:538 +#: extras/filtersets.py:566 +msgid "Data source (ID)" +msgstr "Fonte de dados (ID)" + +#: core/filtersets.py:55 +msgid "Data source (name)" +msgstr "Fonte de dados (nome)" + +#: core/forms/bulk_edit.py:24 ipam/forms/bulk_edit.py:47 +msgid "Enforce unique space" +msgstr "Imponha um espaço exclusivo" + +#: core/forms/bulk_edit.py:33 extras/forms/model_forms.py:202 +#: templates/extras/savedfilter.html:57 vpn/forms/filtersets.py:95 +#: vpn/forms/filtersets.py:124 vpn/forms/filtersets.py:148 +#: vpn/forms/filtersets.py:167 vpn/forms/model_forms.py:294 +#: vpn/forms/model_forms.py:315 vpn/forms/model_forms.py:329 +#: vpn/forms/model_forms.py:350 vpn/forms/model_forms.py:373 +msgid "Parameters" +msgstr "Parâmetros" + +#: core/forms/bulk_edit.py:37 templates/core/datasource.html:69 +msgid "Ignore rules" +msgstr "Ignorar regras" + +#: core/forms/filtersets.py:26 core/forms/model_forms.py:95 +#: extras/forms/model_forms.py:165 extras/forms/model_forms.py:455 +#: extras/forms/model_forms.py:508 extras/tables/tables.py:149 +#: extras/tables/tables.py:363 extras/tables/tables.py:398 +#: templates/core/datasource.html:31 +#: templates/dcim/device/render_config.html:19 +#: templates/extras/configcontext.html:30 +#: templates/extras/configtemplate.html:22 +#: templates/extras/exporttemplate.html:41 +#: templates/virtualization/virtualmachine/render_config.html:19 +msgid "Data Source" +msgstr "Fonte de dados" + +#: core/forms/filtersets.py:39 core/tables/data.py:26 +#: dcim/forms/bulk_edit.py:1012 dcim/forms/bulk_edit.py:1285 +#: dcim/forms/filtersets.py:1270 dcim/tables/devices.py:568 +#: dcim/tables/devicetypes.py:221 extras/forms/bulk_edit.py:97 +#: extras/forms/bulk_edit.py:161 extras/forms/bulk_edit.py:220 +#: extras/forms/filtersets.py:119 extras/forms/filtersets.py:206 +#: extras/forms/filtersets.py:267 extras/tables/tables.py:122 +#: extras/tables/tables.py:211 extras/tables/tables.py:284 +#: templates/core/datasource.html:43 templates/dcim/interface.html:62 +#: templates/extras/customlink.html:18 templates/extras/eventrule.html:20 +#: templates/extras/savedfilter.html:26 +#: templates/users/objectpermission.html:26 +#: templates/virtualization/vminterface.html:32 users/forms/bulk_edit.py:69 +#: users/forms/filtersets.py:71 users/tables.py:86 +#: virtualization/forms/bulk_edit.py:216 +#: virtualization/forms/filtersets.py:207 +msgid "Enabled" +msgstr "Habilitado" + +#: core/forms/filtersets.py:51 core/forms/mixins.py:21 +msgid "File" +msgstr "Arquivo" + +#: core/forms/filtersets.py:56 core/forms/mixins.py:16 +#: extras/forms/filtersets.py:147 extras/forms/filtersets.py:336 +#: extras/forms/filtersets.py:422 +msgid "Data source" +msgstr "Fonte de dados" + +#: core/forms/filtersets.py:64 extras/forms/filtersets.py:449 +msgid "Creation" +msgstr "Criação" + +#: core/forms/filtersets.py:70 extras/forms/filtersets.py:473 +#: extras/forms/filtersets.py:519 extras/tables/tables.py:474 +#: templates/core/job.html:25 templates/extras/objectchange.html:56 +#: tenancy/tables/contacts.py:90 vpn/tables/l2vpn.py:59 +msgid "Object Type" +msgstr "Tipo de objeto" + +#: core/forms/filtersets.py:80 +msgid "Created after" +msgstr "Criado após" + +#: core/forms/filtersets.py:85 +msgid "Created before" +msgstr "Criado antes" + +#: core/forms/filtersets.py:90 +msgid "Scheduled after" +msgstr "Programado após" + +#: core/forms/filtersets.py:95 +msgid "Scheduled before" +msgstr "Programado antes" + +#: core/forms/filtersets.py:100 +msgid "Started after" +msgstr "Começou depois" + +#: core/forms/filtersets.py:105 +msgid "Started before" +msgstr "Começou antes" + +#: core/forms/filtersets.py:110 +msgid "Completed after" +msgstr "Concluído após" + +#: core/forms/filtersets.py:115 +msgid "Completed before" +msgstr "Concluído antes" + +#: core/forms/filtersets.py:122 dcim/forms/bulk_edit.py:359 +#: dcim/forms/filtersets.py:352 dcim/forms/filtersets.py:396 +#: dcim/forms/model_forms.py:251 extras/forms/filtersets.py:465 +#: extras/forms/filtersets.py:511 templates/dcim/rackreservation.html:65 +#: templates/extras/objectchange.html:40 templates/extras/savedfilter.html:22 +#: templates/users/token.html:22 templates/users/user.html:6 +#: templates/users/user.html:14 users/filtersets.py:74 users/filtersets.py:134 +#: users/forms/filtersets.py:85 users/forms/filtersets.py:126 +#: users/forms/model_forms.py:156 users/forms/model_forms.py:194 +#: users/tables.py:19 +msgid "User" +msgstr "Usuário" + +#: core/forms/model_forms.py:52 core/tables/data.py:46 +#: templates/core/datafile.html:36 templates/extras/report/base.html:33 +#: templates/extras/script/base.html:32 templates/extras/script_result.html:45 +msgid "Source" +msgstr "Fonte" + +#: core/forms/model_forms.py:56 +msgid "Backend Parameters" +msgstr "Parâmetros de back-end" + +#: core/forms/model_forms.py:94 +msgid "File Upload" +msgstr "Upload de arquivo" + +#: core/forms/model_forms.py:147 templates/core/configrevision.html:43 +#: templates/dcim/rack_elevation_list.html:6 +msgid "Rack Elevations" +msgstr "Elevações da cremalheira" + +#: core/forms/model_forms.py:148 dcim/choices.py:1407 +#: dcim/forms/bulk_edit.py:859 dcim/forms/bulk_edit.py:1242 +#: dcim/forms/bulk_edit.py:1260 dcim/tables/racks.py:89 +#: netbox/navigation/menu.py:276 netbox/navigation/menu.py:280 +msgid "Power" +msgstr "Poder" + +#: core/forms/model_forms.py:149 netbox/navigation/menu.py:142 +#: templates/core/configrevision.html:79 +msgid "IPAM" +msgstr "IPAM" + +#: core/forms/model_forms.py:150 netbox/navigation/menu.py:218 +#: templates/core/configrevision.html:95 vpn/forms/bulk_edit.py:76 +#: vpn/forms/filtersets.py:42 vpn/forms/model_forms.py:60 +#: vpn/forms/model_forms.py:145 +msgid "Security" +msgstr "Segurança" + +#: core/forms/model_forms.py:151 templates/core/configrevision.html:107 +msgid "Banners" +msgstr "Banners" + +#: core/forms/model_forms.py:152 templates/core/configrevision.html:131 +msgid "Pagination" +msgstr "Paginação" + +#: core/forms/model_forms.py:153 extras/forms/model_forms.py:63 +#: templates/core/configrevision.html:147 +msgid "Validation" +msgstr "Validação" + +#: core/forms/model_forms.py:154 templates/account/preferences.html:6 +#: templates/core/configrevision.html:175 +msgid "User Preferences" +msgstr "Preferências do usuário" + +#: core/forms/model_forms.py:155 dcim/forms/filtersets.py:658 +#: templates/core/configrevision.html:193 users/forms/model_forms.py:63 +msgid "Miscellaneous" +msgstr "Diversos" + +#: core/forms/model_forms.py:158 +msgid "Config Revision" +msgstr "Revisão de configuração" + +#: core/forms/model_forms.py:197 +msgid "This parameter has been defined statically and cannot be modified." +msgstr "Esse parâmetro foi definido estaticamente e não pode ser modificado." + +#: core/forms/model_forms.py:205 +#, python-brace-format +msgid "Current value: {value}" +msgstr "Valor atual: {value}" + +#: core/forms/model_forms.py:207 +msgid " (default)" +msgstr " (padrão)" + +#: core/models/config.py:18 core/models/data.py:259 core/models/files.py:27 +#: core/models/jobs.py:50 extras/models/models.py:760 +#: netbox/models/features.py:52 users/models.py:248 +msgid "created" +msgstr "criada" + +#: core/models/config.py:22 +msgid "comment" +msgstr "comentário" + +#: core/models/config.py:29 +msgid "configuration data" +msgstr "dados de configuração" + +#: core/models/config.py:36 +msgid "config revision" +msgstr "revisão de configuração" + +#: core/models/config.py:37 +msgid "config revisions" +msgstr "revisões de configuração" + +#: core/models/config.py:41 +msgid "Default configuration" +msgstr "Configuração padrão" + +#: core/models/config.py:43 +msgid "Current configuration" +msgstr "Configuração atual" + +#: core/models/config.py:44 +#, python-brace-format +msgid "Config revision #{id}" +msgstr "Revisão de configuração #{id}" + +#: core/models/data.py:46 dcim/models/cables.py:43 +#: dcim/models/device_component_templates.py:177 +#: dcim/models/device_component_templates.py:211 +#: dcim/models/device_component_templates.py:246 +#: dcim/models/device_component_templates.py:308 +#: dcim/models/device_component_templates.py:387 +#: dcim/models/device_component_templates.py:486 +#: dcim/models/device_component_templates.py:586 +#: dcim/models/device_components.py:284 dcim/models/device_components.py:313 +#: dcim/models/device_components.py:346 dcim/models/device_components.py:464 +#: dcim/models/device_components.py:606 dcim/models/device_components.py:971 +#: dcim/models/device_components.py:1045 dcim/models/power.py:101 +#: dcim/models/racks.py:127 extras/models/customfields.py:75 +#: extras/models/search.py:43 virtualization/models/clusters.py:61 +#: vpn/models/l2vpn.py:32 +msgid "type" +msgstr "tipo" + +#: core/models/data.py:51 extras/choices.py:34 extras/models/models.py:194 +#: templates/core/datasource.html:59 +msgid "URL" +msgstr "URL" + +#: core/models/data.py:61 dcim/models/device_component_templates.py:392 +#: dcim/models/device_components.py:513 extras/models/models.py:88 +#: extras/models/models.py:331 extras/models/models.py:556 users/models.py:353 +msgid "enabled" +msgstr "permitido" + +#: core/models/data.py:65 +msgid "ignore rules" +msgstr "ignorar regras" + +#: core/models/data.py:67 +msgid "Patterns (one per line) matching files to ignore when syncing" +msgstr "" +"Padrões (um por linha) de arquivos correspondentes a serem ignorados ao " +"sincronizar" + +#: core/models/data.py:70 extras/models/models.py:564 +msgid "parameters" +msgstr "parâmetros" + +#: core/models/data.py:75 +msgid "last synced" +msgstr "sincronizado pela última vez" + +#: core/models/data.py:83 +msgid "data source" +msgstr "fonte de dados" + +#: core/models/data.py:84 +msgid "data sources" +msgstr "fontes de dados" + +#: core/models/data.py:124 +#, python-brace-format +msgid "Unknown backend type: {type}" +msgstr "Tipo de back-end desconhecido: {type}" + +#: core/models/data.py:263 core/models/files.py:31 +#: netbox/models/features.py:58 +msgid "last updated" +msgstr "última atualização" + +#: core/models/data.py:273 dcim/models/cables.py:430 +msgid "path" +msgstr "caminho" + +#: core/models/data.py:276 +msgid "File path relative to the data source's root" +msgstr "Caminho do arquivo relativo à raiz da fonte de dados" + +#: core/models/data.py:280 ipam/models/ip.py:502 +msgid "size" +msgstr "tamanho" + +#: core/models/data.py:283 +msgid "hash" +msgstr "jogo da velha" + +#: core/models/data.py:287 +msgid "Length must be 64 hexadecimal characters." +msgstr "O comprimento deve ser de 64 caracteres hexadecimais." + +#: core/models/data.py:289 +msgid "SHA256 hash of the file data" +msgstr "Hash SHA256 dos dados do arquivo" + +#: core/models/data.py:306 +msgid "data file" +msgstr "arquivo de dados" + +#: core/models/data.py:307 +msgid "data files" +msgstr "arquivos de dados" + +#: core/models/data.py:393 +msgid "auto sync record" +msgstr "registro de sincronização automática" + +#: core/models/data.py:394 +msgid "auto sync records" +msgstr "registros de sincronização automática" + +#: core/models/files.py:37 +msgid "file root" +msgstr "raiz do arquivo" + +#: core/models/files.py:42 +msgid "file path" +msgstr "caminho do arquivo" + +#: core/models/files.py:44 +msgid "File path relative to the designated root path" +msgstr "Caminho do arquivo em relação ao caminho raiz designado" + +#: core/models/files.py:61 +msgid "managed file" +msgstr "arquivo gerenciado" + +#: core/models/files.py:62 +msgid "managed files" +msgstr "arquivos gerenciados" + +#: core/models/jobs.py:54 +msgid "scheduled" +msgstr "agendada" + +#: core/models/jobs.py:59 +msgid "interval" +msgstr "intervalo" + +#: core/models/jobs.py:65 +msgid "Recurrence interval (in minutes)" +msgstr "Intervalo de recorrência (em minutos)" + +#: core/models/jobs.py:68 +msgid "started" +msgstr "iniciada" + +#: core/models/jobs.py:73 +msgid "completed" +msgstr "concluído" + +#: core/models/jobs.py:91 extras/models/models.py:123 +#: extras/models/staging.py:87 +msgid "data" +msgstr "dados" + +#: core/models/jobs.py:96 +msgid "error" +msgstr "erro" + +#: core/models/jobs.py:101 +msgid "job ID" +msgstr "ID do trabalho" + +#: core/models/jobs.py:112 +msgid "job" +msgstr "trabalho" + +#: core/models/jobs.py:113 +msgid "jobs" +msgstr "empregos" + +#: core/models/jobs.py:135 +#, python-brace-format +msgid "Jobs cannot be assigned to this object type ({type})." +msgstr "Os trabalhos não podem ser atribuídos a esse tipo de objeto ({type})." + +#: core/tables/config.py:21 users/forms/filtersets.py:45 users/tables.py:39 +msgid "Is Active" +msgstr "Está ativo" + +#: core/tables/data.py:50 templates/core/datafile.html:40 +msgid "Path" +msgstr "Caminho" + +#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +msgid "Last updated" +msgstr "Última atualização" + +#: core/tables/jobs.py:10 dcim/tables/devicetypes.py:161 +#: extras/tables/tables.py:174 extras/tables/tables.py:340 +#: netbox/tables/tables.py:184 templates/dcim/virtualchassis_edit.html:53 +#: wireless/tables/wirelesslink.py:16 +msgid "ID" +msgstr "CARTEIRA DE IDENTIDADE" + +#: core/tables/jobs.py:21 extras/choices.py:38 extras/tables/tables.py:236 +#: extras/tables/tables.py:350 extras/tables/tables.py:448 +#: extras/tables/tables.py:479 netbox/tables/tables.py:238 +#: templates/extras/eventrule.html:99 +#: templates/extras/htmx/report_result.html:45 +#: templates/extras/journalentry.html:21 templates/extras/objectchange.html:62 +#: tenancy/tables/contacts.py:93 vpn/tables/l2vpn.py:64 +msgid "Object" +msgstr "Objeto" + +#: core/tables/jobs.py:35 +msgid "Interval" +msgstr "Intervalo" + +#: core/tables/jobs.py:38 templates/core/job.html:71 +#: templates/extras/htmx/report_result.html:7 +#: templates/extras/htmx/script_result.html:8 +msgid "Started" +msgstr "Iniciado" + +#: dcim/api/serializers.py:205 templates/dcim/rack.html:33 +msgid "Facility ID" +msgstr "ID da instalação" + +#: dcim/api/serializers.py:321 dcim/api/serializers.py:680 +msgid "Position (U)" +msgstr "Posição (U)" + +#: dcim/choices.py:21 virtualization/choices.py:21 +msgid "Staging" +msgstr "Encenação" + +#: dcim/choices.py:23 dcim/choices.py:178 dcim/choices.py:223 +#: dcim/choices.py:1420 virtualization/choices.py:23 +#: virtualization/choices.py:48 +msgid "Decommissioning" +msgstr "Descomissionamento" + +#: dcim/choices.py:24 +msgid "Retired" +msgstr "Aposentado" + +#: dcim/choices.py:65 +msgid "2-post frame" +msgstr "Moldura de 2 postes" + +#: dcim/choices.py:66 +msgid "4-post frame" +msgstr "moldura de 4 postes" + +#: dcim/choices.py:67 +msgid "4-post cabinet" +msgstr "Armário de 4 colunas" + +#: dcim/choices.py:68 +msgid "Wall-mounted frame" +msgstr "Estrutura montada na parede" + +#: dcim/choices.py:69 +msgid "Wall-mounted frame (vertical)" +msgstr "Estrutura montada na parede (vertical)" + +#: dcim/choices.py:70 +msgid "Wall-mounted cabinet" +msgstr "Armário montado na parede" + +#: dcim/choices.py:71 +msgid "Wall-mounted cabinet (vertical)" +msgstr "Armário montado na parede (vertical)" + +#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#, python-brace-format +msgid "{n} inches" +msgstr "{n} polegadas" + +#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 +#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +msgid "Reserved" +msgstr "Reservado" + +#: dcim/choices.py:101 templates/dcim/device.html:262 +msgid "Available" +msgstr "Disponível" + +#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 +#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +msgid "Deprecated" +msgstr "Obsoleto" + +#: dcim/choices.py:114 templates/dcim/rack.html:128 +msgid "Millimeters" +msgstr "Milímetros" + +#: dcim/choices.py:115 dcim/choices.py:1442 +msgid "Inches" +msgstr "Polegadas" + +#: dcim/choices.py:140 dcim/forms/bulk_edit.py:66 dcim/forms/bulk_edit.py:85 +#: dcim/forms/bulk_edit.py:171 dcim/forms/bulk_edit.py:1290 +#: dcim/forms/bulk_import.py:59 dcim/forms/bulk_import.py:73 +#: dcim/forms/bulk_import.py:136 dcim/forms/bulk_import.py:503 +#: dcim/forms/bulk_import.py:770 dcim/forms/bulk_import.py:1021 +#: dcim/forms/filtersets.py:226 dcim/forms/model_forms.py:73 +#: dcim/forms/model_forms.py:94 dcim/forms/model_forms.py:172 +#: dcim/forms/model_forms.py:955 dcim/forms/model_forms.py:1296 +#: dcim/forms/object_import.py:181 dcim/tables/devices.py:671 +#: dcim/tables/devices.py:955 extras/tables/tables.py:181 +#: ipam/tables/fhrp.py:59 ipam/tables/ip.py:374 ipam/tables/services.py:44 +#: templates/dcim/interface.html:105 templates/dcim/interface.html:321 +#: templates/dcim/location.html:44 templates/dcim/region.html:38 +#: templates/dcim/sitegroup.html:38 templates/ipam/service.html:31 +#: templates/tenancy/contactgroup.html:32 +#: templates/tenancy/tenantgroup.html:40 +#: templates/virtualization/vminterface.html:42 +#: templates/wireless/wirelesslangroup.html:38 tenancy/forms/bulk_edit.py:26 +#: tenancy/forms/bulk_edit.py:60 tenancy/forms/bulk_import.py:24 +#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:24 +#: tenancy/forms/model_forms.py:69 virtualization/forms/bulk_edit.py:206 +#: virtualization/forms/bulk_import.py:151 +#: virtualization/tables/virtualmachines.py:142 wireless/forms/bulk_edit.py:23 +#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:20 +msgid "Parent" +msgstr "Pai" + +#: dcim/choices.py:141 +msgid "Child" +msgstr "Criança" + +#: dcim/choices.py:155 templates/dcim/device.html:345 +#: templates/dcim/rack.html:181 templates/dcim/rack_elevation_list.html:22 +#: templates/dcim/rackreservation.html:84 +msgid "Front" +msgstr "Frente" + +#: dcim/choices.py:156 templates/dcim/device.html:351 +#: templates/dcim/rack.html:187 templates/dcim/rack_elevation_list.html:23 +#: templates/dcim/rackreservation.html:90 +msgid "Rear" +msgstr "Traseira" + +#: dcim/choices.py:175 dcim/choices.py:221 virtualization/choices.py:46 +msgid "Staged" +msgstr "Encenado" + +#: dcim/choices.py:177 +msgid "Inventory" +msgstr "Inventário" + +#: dcim/choices.py:193 +msgid "Front to rear" +msgstr "Da frente para trás" + +#: dcim/choices.py:194 +msgid "Rear to front" +msgstr "De trás para frente" + +#: dcim/choices.py:195 +msgid "Left to right" +msgstr "Da esquerda para a direita" + +#: dcim/choices.py:196 +msgid "Right to left" +msgstr "Da direita para a esquerda" + +#: dcim/choices.py:197 +msgid "Side to rear" +msgstr "De lado para trás" + +#: dcim/choices.py:198 dcim/choices.py:1215 +msgid "Passive" +msgstr "Passivo" + +#: dcim/choices.py:199 +msgid "Mixed" +msgstr "Misto" + +#: dcim/choices.py:443 dcim/choices.py:680 +msgid "NEMA (Non-locking)" +msgstr "NEMA (sem bloqueio)" + +#: dcim/choices.py:465 dcim/choices.py:702 +msgid "NEMA (Locking)" +msgstr "NEMA (Bloqueio)" + +#: dcim/choices.py:488 dcim/choices.py:725 +msgid "California Style" +msgstr "Estilo da Califórnia" + +#: dcim/choices.py:496 +msgid "International/ITA" +msgstr "Internacional/ITA" + +#: dcim/choices.py:526 dcim/choices.py:755 +msgid "Proprietary" +msgstr "Proprietário" + +#: dcim/choices.py:534 dcim/choices.py:764 dcim/choices.py:1131 +#: dcim/choices.py:1133 dcim/choices.py:1338 dcim/choices.py:1340 +#: netbox/navigation/menu.py:188 +msgid "Other" +msgstr "Outros" + +#: dcim/choices.py:733 +msgid "ITA/International" +msgstr "ITA/Internacional" + +#: dcim/choices.py:794 +msgid "Physical" +msgstr "Físico" + +#: dcim/choices.py:795 dcim/choices.py:949 +msgid "Virtual" +msgstr "Virtual" + +#: dcim/choices.py:796 dcim/choices.py:1019 dcim/forms/bulk_edit.py:1398 +#: dcim/forms/filtersets.py:1233 dcim/forms/model_forms.py:881 +#: dcim/forms/model_forms.py:1190 netbox/navigation/menu.py:128 +#: netbox/navigation/menu.py:132 templates/dcim/interface.html:217 +msgid "Wireless" +msgstr "Sem fio" + +#: dcim/choices.py:947 +msgid "Virtual interfaces" +msgstr "Interfaces virtuais" + +#: dcim/choices.py:950 dcim/forms/bulk_edit.py:1295 +#: dcim/forms/bulk_import.py:777 dcim/forms/model_forms.py:869 +#: dcim/tables/devices.py:675 templates/dcim/interface.html:109 +#: templates/virtualization/vminterface.html:46 +#: virtualization/forms/bulk_edit.py:211 +#: virtualization/forms/bulk_import.py:158 +#: virtualization/tables/virtualmachines.py:146 +msgid "Bridge" +msgstr "Ponte" + +#: dcim/choices.py:951 +msgid "Link Aggregation Group (LAG)" +msgstr "Grupo de agregação de links (LAG)" + +#: dcim/choices.py:955 +msgid "Ethernet (fixed)" +msgstr "Ethernet (fixa)" + +#: dcim/choices.py:969 +msgid "Ethernet (modular)" +msgstr "Ethernet (modular)" + +#: dcim/choices.py:1005 +msgid "Ethernet (backplane)" +msgstr "Ethernet (painel traseiro)" + +#: dcim/choices.py:1033 +msgid "Cellular" +msgstr "Celular" + +#: dcim/choices.py:1080 dcim/forms/filtersets.py:302 +#: dcim/forms/filtersets.py:736 dcim/forms/filtersets.py:876 +#: dcim/forms/filtersets.py:1426 templates/dcim/inventoryitem.html:53 +#: templates/dcim/virtualchassis_edit.html:55 +msgid "Serial" +msgstr "Serial" + +#: dcim/choices.py:1095 +msgid "Coaxial" +msgstr "Coaxial" + +#: dcim/choices.py:1112 +msgid "Stacking" +msgstr "Empilhamento" + +#: dcim/choices.py:1162 +msgid "Half" +msgstr "Metade" + +#: dcim/choices.py:1163 +msgid "Full" +msgstr "Completo" + +#: dcim/choices.py:1164 wireless/choices.py:480 +msgid "Auto" +msgstr "Automático" + +#: dcim/choices.py:1175 +msgid "Access" +msgstr "Acesso" + +#: dcim/choices.py:1176 ipam/tables/vlans.py:168 ipam/tables/vlans.py:213 +#: templates/dcim/inc/interface_vlans_table.html:7 +msgid "Tagged" +msgstr "Marcado" + +#: dcim/choices.py:1177 +msgid "Tagged (All)" +msgstr "Marcado (Todos)" + +#: dcim/choices.py:1206 +msgid "IEEE Standard" +msgstr "Padrão IEEE" + +#: dcim/choices.py:1217 +msgid "Passive 24V (2-pair)" +msgstr "24V passivo (2 pares)" + +#: dcim/choices.py:1218 +msgid "Passive 24V (4-pair)" +msgstr "24V passivo (4 pares)" + +#: dcim/choices.py:1219 +msgid "Passive 48V (2-pair)" +msgstr "48V passivo (2 pares)" + +#: dcim/choices.py:1220 +msgid "Passive 48V (4-pair)" +msgstr "48V passivo (4 pares)" + +#: dcim/choices.py:1282 dcim/choices.py:1378 +msgid "Copper" +msgstr "Cobre" + +#: dcim/choices.py:1305 +msgid "Fiber Optic" +msgstr "Fibra óptica" + +#: dcim/choices.py:1394 +msgid "Fiber" +msgstr "Fibra" + +#: dcim/choices.py:1418 dcim/forms/filtersets.py:1140 +msgid "Connected" +msgstr "Conectado" + +#: dcim/choices.py:1437 +msgid "Kilometers" +msgstr "Quilômetros" + +#: dcim/choices.py:1438 templates/dcim/cable_trace.html:62 +msgid "Meters" +msgstr "Metros" + +#: dcim/choices.py:1439 +msgid "Centimeters" +msgstr "Centímetros" + +#: dcim/choices.py:1440 +msgid "Miles" +msgstr "Miles" + +#: dcim/choices.py:1441 templates/dcim/cable_trace.html:63 +msgid "Feet" +msgstr "Pés" + +#: dcim/choices.py:1457 templates/dcim/device.html:332 +#: templates/dcim/rack.html:157 +msgid "Kilograms" +msgstr "Quilogramas" + +#: dcim/choices.py:1458 +msgid "Grams" +msgstr "Gramas" + +#: dcim/choices.py:1459 templates/dcim/rack.html:158 +msgid "Pounds" +msgstr "Libras" + +#: dcim/choices.py:1460 +msgid "Ounces" +msgstr "Onças" + +#: dcim/choices.py:1506 tenancy/choices.py:17 +msgid "Primary" +msgstr "Primário" + +#: dcim/choices.py:1507 +msgid "Redundant" +msgstr "Redundante" + +#: dcim/choices.py:1528 +msgid "Single phase" +msgstr "Fase única" + +#: dcim/choices.py:1529 +msgid "Three-phase" +msgstr "Trifásico" + +#: dcim/filtersets.py:80 +msgid "Parent region (ID)" +msgstr "Região principal (ID)" + +#: dcim/filtersets.py:86 +msgid "Parent region (slug)" +msgstr "Região parental (lesma)" + +#: dcim/filtersets.py:97 +msgid "Parent site group (ID)" +msgstr "Grupo de sites principais (ID)" + +#: dcim/filtersets.py:103 +msgid "Parent site group (slug)" +msgstr "Grupo de sites principais (slug)" + +#: dcim/filtersets.py:132 ipam/filtersets.py:797 ipam/filtersets.py:930 +msgid "Group (ID)" +msgstr "Grupo (ID)" + +#: dcim/filtersets.py:138 +msgid "Group (slug)" +msgstr "Grupo (lesma)" + +#: dcim/filtersets.py:144 dcim/filtersets.py:149 +msgid "AS (ID)" +msgstr "COMO (ID)" + +#: dcim/filtersets.py:217 dcim/filtersets.py:292 dcim/filtersets.py:390 +#: dcim/filtersets.py:917 dcim/filtersets.py:1213 dcim/filtersets.py:1881 +msgid "Location (ID)" +msgstr "Localização (ID)" + +#: dcim/filtersets.py:224 dcim/filtersets.py:299 dcim/filtersets.py:397 +#: dcim/filtersets.py:1219 extras/filtersets.py:447 +msgid "Location (slug)" +msgstr "Localização (lesma)" + +#: dcim/filtersets.py:313 dcim/filtersets.py:764 dcim/filtersets.py:854 +#: dcim/filtersets.py:1619 ipam/filtersets.py:347 ipam/filtersets.py:459 +#: ipam/filtersets.py:940 virtualization/filtersets.py:209 +msgid "Role (ID)" +msgstr "Função (ID)" + +#: dcim/filtersets.py:319 dcim/filtersets.py:770 dcim/filtersets.py:860 +#: dcim/filtersets.py:1625 extras/filtersets.py:463 ipam/filtersets.py:353 +#: ipam/filtersets.py:465 ipam/filtersets.py:946 +#: virtualization/filtersets.py:215 +msgid "Role (slug)" +msgstr "Papel (lesma)" + +#: dcim/filtersets.py:347 dcim/filtersets.py:922 dcim/filtersets.py:1224 +#: dcim/filtersets.py:1942 +msgid "Rack (ID)" +msgstr "Prateleira (ID)" + +#: dcim/filtersets.py:401 extras/filtersets.py:234 extras/filtersets.py:278 +#: extras/filtersets.py:318 extras/filtersets.py:613 +msgid "User (ID)" +msgstr "Usuário (ID)" + +#: dcim/filtersets.py:407 extras/filtersets.py:240 extras/filtersets.py:284 +#: extras/filtersets.py:324 users/filtersets.py:80 users/filtersets.py:140 +msgid "User (name)" +msgstr "Usuário (nome)" + +#: dcim/filtersets.py:435 dcim/filtersets.py:561 dcim/filtersets.py:754 +#: dcim/filtersets.py:805 dcim/filtersets.py:833 dcim/filtersets.py:1116 +#: dcim/filtersets.py:1609 +msgid "Manufacturer (ID)" +msgstr "Fabricante (ID)" + +#: dcim/filtersets.py:441 dcim/filtersets.py:567 dcim/filtersets.py:760 +#: dcim/filtersets.py:811 dcim/filtersets.py:839 dcim/filtersets.py:1122 +#: dcim/filtersets.py:1615 +msgid "Manufacturer (slug)" +msgstr "Fabricante (lesma)" + +#: dcim/filtersets.py:445 +msgid "Default platform (ID)" +msgstr "Plataforma padrão (ID)" + +#: dcim/filtersets.py:451 +msgid "Default platform (slug)" +msgstr "Plataforma padrão (slug)" + +#: dcim/filtersets.py:454 dcim/forms/filtersets.py:452 +msgid "Has a front image" +msgstr "Tem uma imagem frontal" + +#: dcim/filtersets.py:458 dcim/forms/filtersets.py:459 +msgid "Has a rear image" +msgstr "Tem uma imagem traseira" + +#: dcim/filtersets.py:463 dcim/filtersets.py:571 dcim/filtersets.py:975 +#: dcim/forms/filtersets.py:466 dcim/forms/filtersets.py:563 +#: dcim/forms/filtersets.py:775 +msgid "Has console ports" +msgstr "Tem portas de console" + +#: dcim/filtersets.py:467 dcim/filtersets.py:575 dcim/filtersets.py:979 +#: dcim/forms/filtersets.py:473 dcim/forms/filtersets.py:570 +#: dcim/forms/filtersets.py:782 +msgid "Has console server ports" +msgstr "Tem portas de servidor de console" + +#: dcim/filtersets.py:471 dcim/filtersets.py:579 dcim/filtersets.py:983 +#: dcim/forms/filtersets.py:480 dcim/forms/filtersets.py:577 +#: dcim/forms/filtersets.py:789 +msgid "Has power ports" +msgstr "Tem portas de alimentação" + +#: dcim/filtersets.py:475 dcim/filtersets.py:583 dcim/filtersets.py:987 +#: dcim/forms/filtersets.py:487 dcim/forms/filtersets.py:584 +#: dcim/forms/filtersets.py:796 +msgid "Has power outlets" +msgstr "Tem tomadas elétricas" + +#: dcim/filtersets.py:479 dcim/filtersets.py:587 dcim/filtersets.py:991 +#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:591 +#: dcim/forms/filtersets.py:803 +msgid "Has interfaces" +msgstr "Tem interfaces" + +#: dcim/filtersets.py:483 dcim/filtersets.py:591 dcim/filtersets.py:995 +#: dcim/forms/filtersets.py:501 dcim/forms/filtersets.py:598 +#: dcim/forms/filtersets.py:810 +msgid "Has pass-through ports" +msgstr "Tem portas de passagem" + +#: dcim/filtersets.py:487 dcim/filtersets.py:999 dcim/forms/filtersets.py:515 +msgid "Has module bays" +msgstr "Tem compartimentos de módulos" + +#: dcim/filtersets.py:491 dcim/filtersets.py:1003 dcim/forms/filtersets.py:508 +msgid "Has device bays" +msgstr "Tem compartimentos para dispositivos" + +#: dcim/filtersets.py:495 dcim/forms/filtersets.py:522 +msgid "Has inventory items" +msgstr "Tem itens de inventário" + +#: dcim/filtersets.py:638 dcim/filtersets.py:849 dcim/filtersets.py:1245 +msgid "Device type (ID)" +msgstr "Tipo de dispositivo (ID)" + +#: dcim/filtersets.py:651 dcim/filtersets.py:1127 +msgid "Module type (ID)" +msgstr "Tipo de módulo (ID)" + +#: dcim/filtersets.py:750 dcim/filtersets.py:1605 +msgid "Parent inventory item (ID)" +msgstr "Item do inventário principal (ID)" + +#: dcim/filtersets.py:793 dcim/filtersets.py:815 dcim/filtersets.py:971 +#: virtualization/filtersets.py:237 +msgid "Config template (ID)" +msgstr "Modelo de configuração (ID)" + +#: dcim/filtersets.py:845 +msgid "Device type (slug)" +msgstr "Tipo de dispositivo (lesma)" + +#: dcim/filtersets.py:865 +msgid "Parent Device (ID)" +msgstr "Dispositivo principal (ID)" + +#: dcim/filtersets.py:869 virtualization/filtersets.py:219 +msgid "Platform (ID)" +msgstr "Plataforma (ID)" + +#: dcim/filtersets.py:875 extras/filtersets.py:474 +#: virtualization/filtersets.py:225 +msgid "Platform (slug)" +msgstr "Plataforma (lesma)" + +#: dcim/filtersets.py:911 dcim/filtersets.py:1208 dcim/filtersets.py:1703 +#: dcim/filtersets.py:1875 dcim/filtersets.py:1933 +msgid "Site name (slug)" +msgstr "Nome do site (slug)" + +#: dcim/filtersets.py:926 +msgid "VM cluster (ID)" +msgstr "Cluster de VMs (ID)" + +#: dcim/filtersets.py:932 +msgid "Device model (slug)" +msgstr "Modelo do dispositivo (slug)" + +#: dcim/filtersets.py:943 dcim/forms/bulk_edit.py:421 +msgid "Is full depth" +msgstr "É de profundidade total" + +#: dcim/filtersets.py:947 dcim/forms/common.py:18 dcim/forms/filtersets.py:745 +#: dcim/forms/filtersets.py:1285 dcim/models/device_components.py:519 +#: virtualization/filtersets.py:229 virtualization/filtersets.py:295 +#: virtualization/forms/filtersets.py:168 +#: virtualization/forms/filtersets.py:215 +msgid "MAC address" +msgstr "Endereço MAC" + +#: dcim/filtersets.py:954 dcim/forms/filtersets.py:754 +#: dcim/forms/filtersets.py:841 virtualization/filtersets.py:233 +#: virtualization/forms/filtersets.py:172 +msgid "Has a primary IP" +msgstr "Tem um IP primário" + +#: dcim/filtersets.py:958 +msgid "Has an out-of-band IP" +msgstr "Tem um IP fora de banda" + +#: dcim/filtersets.py:963 +msgid "Virtual chassis (ID)" +msgstr "Chassi virtual (ID)" + +#: dcim/filtersets.py:967 +msgid "Is a virtual chassis member" +msgstr "É membro do chassi virtual" + +#: dcim/filtersets.py:1008 +msgid "OOB IP (ID)" +msgstr "COTOB IP (ID)" + +#: dcim/filtersets.py:1133 +msgid "Module type (model)" +msgstr "Tipo de módulo (modelo)" + +#: dcim/filtersets.py:1139 +msgid "Module Bay (ID)" +msgstr "Compartimento do módulo (ID)" + +#: dcim/filtersets.py:1143 dcim/filtersets.py:1234 ipam/filtersets.py:577 +#: ipam/filtersets.py:807 ipam/filtersets.py:1015 +#: virtualization/filtersets.py:160 vpn/filtersets.py:351 +msgid "Device (ID)" +msgstr "Dispositivo (ID)" + +#: dcim/filtersets.py:1230 +msgid "Rack (name)" +msgstr "Rack (nome)" + +#: dcim/filtersets.py:1240 ipam/filtersets.py:572 ipam/filtersets.py:802 +#: ipam/filtersets.py:1021 vpn/filtersets.py:346 +msgid "Device (name)" +msgstr "Dispositivo (nome)" + +#: dcim/filtersets.py:1251 +msgid "Device type (model)" +msgstr "Tipo de dispositivo (modelo)" + +#: dcim/filtersets.py:1256 dcim/filtersets.py:1279 +msgid "Device role (ID)" +msgstr "Função do dispositivo (ID)" + +#: dcim/filtersets.py:1262 dcim/filtersets.py:1285 +msgid "Device role (slug)" +msgstr "Função do dispositivo (slug)" + +#: dcim/filtersets.py:1267 +msgid "Virtual Chassis (ID)" +msgstr "Chassi virtual (ID)" + +#: dcim/filtersets.py:1273 dcim/forms/filtersets.py:106 +#: dcim/tables/devices.py:235 netbox/navigation/menu.py:67 +#: templates/dcim/device.html:123 templates/dcim/device_edit.html:93 +#: templates/dcim/virtualchassis.html:20 +#: templates/dcim/virtualchassis_add.html:8 +#: templates/dcim/virtualchassis_edit.html:25 +msgid "Virtual Chassis" +msgstr "Chassi virtual" + +#: dcim/filtersets.py:1305 +msgid "Module (ID)" +msgstr "Módulo (ID)" + +#: dcim/filtersets.py:1409 ipam/forms/bulk_import.py:188 +#: vpn/forms/bulk_import.py:303 +msgid "Assigned VLAN" +msgstr "VLAN atribuída" + +#: dcim/filtersets.py:1413 +msgid "Assigned VID" +msgstr "VID atribuído" + +#: dcim/filtersets.py:1418 dcim/forms/bulk_edit.py:1374 +#: dcim/forms/bulk_import.py:828 dcim/forms/filtersets.py:1328 +#: dcim/forms/model_forms.py:1175 dcim/models/device_components.py:712 +#: dcim/tables/devices.py:637 ipam/filtersets.py:282 ipam/filtersets.py:293 +#: ipam/filtersets.py:449 ipam/filtersets.py:550 ipam/filtersets.py:561 +#: ipam/forms/bulk_edit.py:226 ipam/forms/bulk_edit.py:281 +#: ipam/forms/bulk_edit.py:323 ipam/forms/bulk_import.py:156 +#: ipam/forms/bulk_import.py:242 ipam/forms/bulk_import.py:278 +#: ipam/forms/filtersets.py:66 ipam/forms/filtersets.py:167 +#: ipam/forms/filtersets.py:295 ipam/forms/model_forms.py:59 +#: ipam/forms/model_forms.py:203 ipam/forms/model_forms.py:246 +#: ipam/forms/model_forms.py:290 ipam/forms/model_forms.py:412 +#: ipam/forms/model_forms.py:426 ipam/forms/model_forms.py:440 +#: ipam/models/ip.py:232 ipam/models/ip.py:511 ipam/models/ip.py:719 +#: ipam/models/vrfs.py:62 ipam/tables/ip.py:241 ipam/tables/ip.py:306 +#: ipam/tables/ip.py:356 ipam/tables/ip.py:445 +#: templates/dcim/interface.html:138 templates/ipam/ipaddress.html:21 +#: templates/ipam/iprange.html:43 templates/ipam/prefix.html:20 +#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:14 +#: templates/virtualization/vminterface.html:50 +#: virtualization/forms/bulk_edit.py:260 +#: virtualization/forms/bulk_import.py:171 +#: virtualization/forms/filtersets.py:220 +#: virtualization/forms/model_forms.py:347 +#: virtualization/models/virtualmachines.py:348 +#: virtualization/tables/virtualmachines.py:123 +msgid "VRF" +msgstr "VRF" + +#: dcim/filtersets.py:1424 ipam/filtersets.py:288 ipam/filtersets.py:299 +#: ipam/filtersets.py:455 ipam/filtersets.py:556 ipam/filtersets.py:567 +msgid "VRF (RD)" +msgstr "VRF (VERMELHO)" + +#: dcim/filtersets.py:1429 ipam/filtersets.py:963 vpn/filtersets.py:314 +msgid "L2VPN (ID)" +msgstr "L2VPN (ID)" + +#: dcim/filtersets.py:1435 dcim/forms/filtersets.py:1333 +#: dcim/tables/devices.py:585 ipam/filtersets.py:969 +#: ipam/forms/filtersets.py:499 ipam/tables/vlans.py:133 +#: templates/dcim/interface.html:94 templates/ipam/vlan.html:69 +#: templates/vpn/l2vpntermination.html:15 +#: virtualization/forms/filtersets.py:225 vpn/forms/bulk_import.py:275 +#: vpn/forms/filtersets.py:242 vpn/forms/model_forms.py:402 +#: vpn/forms/model_forms.py:420 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +msgid "L2VPN" +msgstr "L2VPN" + +#: dcim/filtersets.py:1467 +msgid "Virtual Chassis Interfaces for Device" +msgstr "Interfaces de chassi virtual para dispositivo" + +#: dcim/filtersets.py:1472 +msgid "Virtual Chassis Interfaces for Device (ID)" +msgstr "Interfaces de chassi virtual para dispositivo (ID)" + +#: dcim/filtersets.py:1476 +msgid "Kind of interface" +msgstr "Tipo de interface" + +#: dcim/filtersets.py:1481 virtualization/filtersets.py:287 +msgid "Parent interface (ID)" +msgstr "Interface principal (ID)" + +#: dcim/filtersets.py:1486 virtualization/filtersets.py:292 +msgid "Bridged interface (ID)" +msgstr "Interface interligada (ID)" + +#: dcim/filtersets.py:1491 +msgid "LAG interface (ID)" +msgstr "Interface LAG (ID)" + +#: dcim/filtersets.py:1660 +msgid "Master (ID)" +msgstr "Mestre (ID)" + +#: dcim/filtersets.py:1666 +msgid "Master (name)" +msgstr "Mestre (nome)" + +#: dcim/filtersets.py:1708 tenancy/filtersets.py:220 +msgid "Tenant (ID)" +msgstr "Inquilino (ID)" + +#: dcim/filtersets.py:1714 extras/filtersets.py:523 tenancy/filtersets.py:226 +msgid "Tenant (slug)" +msgstr "Inquilino (lesma)" + +#: dcim/filtersets.py:1749 dcim/forms/filtersets.py:990 +msgid "Unterminated" +msgstr "Não terminado" + +#: dcim/filtersets.py:1937 +msgid "Power panel (ID)" +msgstr "Painel de alimentação (ID)" + +#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:410 +#: extras/forms/model_forms.py:444 extras/forms/model_forms.py:495 +#: netbox/forms/base.py:71 netbox/forms/mixins.py:79 +#: netbox/tables/columns.py:448 +#: templates/circuits/inc/circuit_termination.html:119 +#: templates/generic/bulk_edit.html:81 templates/inc/panels/tags.html:5 +#: utilities/forms/fields/fields.py:81 +msgid "Tags" +msgstr "Etiquetas" + +#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1390 +#: dcim/forms/model_forms.py:422 dcim/forms/model_forms.py:468 +#: dcim/forms/object_create.py:196 dcim/forms/object_create.py:352 +#: dcim/tables/devices.py:198 dcim/tables/devices.py:720 +#: dcim/tables/devicetypes.py:242 templates/dcim/device.html:45 +#: templates/dcim/device.html:129 templates/dcim/modulebay.html:35 +#: templates/dcim/virtualchassis.html:59 +#: templates/dcim/virtualchassis_edit.html:56 +msgid "Position" +msgstr "Posição" + +#: dcim/forms/bulk_create.py:114 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of names being " +"created.)" +msgstr "" +"Os intervalos alfanuméricos são suportados. (Deve corresponder ao número de " +"nomes que estão sendo criados.)" + +#: dcim/forms/bulk_edit.py:115 dcim/forms/bulk_import.py:99 +#: dcim/forms/model_forms.py:120 dcim/tables/sites.py:89 +#: ipam/filtersets.py:936 ipam/forms/bulk_edit.py:528 +#: ipam/forms/bulk_import.py:444 ipam/forms/model_forms.py:509 +#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 +#: templates/dcim/interface.html:294 templates/dcim/site.html:37 +#: templates/ipam/inc/panels/fhrp_groups.html:10 templates/ipam/vlan.html:30 +#: templates/tenancy/contact.html:22 templates/tenancy/tenant.html:21 +#: templates/users/group.html:6 templates/users/group.html:14 +#: templates/virtualization/cluster.html:32 templates/vpn/tunnel.html:30 +#: templates/wireless/wirelesslan.html:19 tenancy/forms/bulk_edit.py:42 +#: tenancy/forms/bulk_edit.py:93 tenancy/forms/bulk_import.py:40 +#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:47 +#: tenancy/forms/filtersets.py:77 tenancy/forms/filtersets.py:96 +#: tenancy/forms/model_forms.py:46 tenancy/forms/model_forms.py:102 +#: tenancy/forms/model_forms.py:124 tenancy/tables/contacts.py:60 +#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 +#: users/filtersets.py:42 users/filtersets.py:145 users/forms/filtersets.py:32 +#: users/forms/filtersets.py:38 users/forms/filtersets.py:80 +#: virtualization/forms/bulk_edit.py:64 virtualization/forms/bulk_import.py:47 +#: virtualization/forms/filtersets.py:84 +#: virtualization/forms/model_forms.py:69 virtualization/tables/clusters.py:70 +#: vpn/forms/bulk_edit.py:111 vpn/forms/bulk_import.py:157 +#: vpn/forms/filtersets.py:113 vpn/tables/crypto.py:31 +#: wireless/forms/bulk_edit.py:47 wireless/forms/bulk_import.py:36 +#: wireless/forms/filtersets.py:45 wireless/forms/model_forms.py:41 +#: wireless/tables/wirelesslan.py:48 +msgid "Group" +msgstr "Grupo" + +#: dcim/forms/bulk_edit.py:130 +msgid "Contact name" +msgstr "Nome do contato" + +#: dcim/forms/bulk_edit.py:135 +msgid "Contact phone" +msgstr "Telefone de contato" + +#: dcim/forms/bulk_edit.py:141 +msgid "Contact E-mail" +msgstr "E-mail de contato" + +#: dcim/forms/bulk_edit.py:144 dcim/forms/bulk_import.py:122 +#: dcim/forms/model_forms.py:131 +msgid "Time zone" +msgstr "Fuso horário" + +#: dcim/forms/bulk_edit.py:266 dcim/forms/bulk_edit.py:1152 +#: dcim/forms/bulk_edit.py:1539 dcim/forms/bulk_import.py:199 +#: dcim/forms/bulk_import.py:1009 dcim/forms/filtersets.py:299 +#: dcim/forms/filtersets.py:704 dcim/forms/filtersets.py:1417 +#: dcim/forms/model_forms.py:224 dcim/forms/model_forms.py:963 +#: dcim/forms/model_forms.py:1304 dcim/forms/object_import.py:186 +#: dcim/tables/devices.py:202 dcim/tables/devices.py:828 +#: dcim/tables/devices.py:939 dcim/tables/devicetypes.py:300 +#: dcim/tables/racks.py:69 extras/filtersets.py:457 +#: ipam/forms/bulk_edit.py:245 ipam/forms/bulk_edit.py:294 +#: ipam/forms/bulk_edit.py:342 ipam/forms/bulk_edit.py:546 +#: ipam/forms/bulk_import.py:196 ipam/forms/bulk_import.py:261 +#: ipam/forms/bulk_import.py:297 ipam/forms/bulk_import.py:463 +#: ipam/forms/filtersets.py:232 ipam/forms/filtersets.py:278 +#: ipam/forms/filtersets.py:346 ipam/forms/filtersets.py:490 +#: ipam/forms/model_forms.py:187 ipam/forms/model_forms.py:222 +#: ipam/forms/model_forms.py:249 ipam/forms/model_forms.py:647 +#: ipam/tables/ip.py:257 ipam/tables/ip.py:313 ipam/tables/ip.py:363 +#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:230 +#: templates/dcim/device.html:187 +#: templates/dcim/inc/panels/inventory_items.html:12 +#: templates/dcim/interface.html:231 templates/dcim/inventoryitem.html:37 +#: templates/dcim/rack.html:50 templates/ipam/ipaddress.html:44 +#: templates/ipam/iprange.html:53 templates/ipam/prefix.html:78 +#: templates/ipam/role.html:20 templates/ipam/vlan.html:55 +#: templates/virtualization/virtualmachine.html:26 +#: templates/vpn/tunneltermination.html:18 +#: templates/wireless/inc/wirelesslink_interface.html:20 +#: tenancy/forms/bulk_edit.py:141 tenancy/forms/filtersets.py:106 +#: tenancy/forms/model_forms.py:139 tenancy/tables/contacts.py:102 +#: virtualization/forms/bulk_edit.py:144 +#: virtualization/forms/bulk_import.py:106 +#: virtualization/forms/filtersets.py:153 +#: virtualization/forms/model_forms.py:198 +#: virtualization/tables/virtualmachines.py:65 vpn/forms/bulk_edit.py:86 +#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:84 +#: vpn/forms/model_forms.py:77 vpn/forms/model_forms.py:112 +#: vpn/tables/tunnels.py:78 +msgid "Role" +msgstr "Função" + +#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:605 +#: dcim/forms/bulk_edit.py:654 templates/dcim/device.html:106 +#: templates/dcim/module.html:75 templates/dcim/modulebay.html:69 +#: templates/dcim/rack.html:58 +msgid "Serial Number" +msgstr "Número de série" + +#: dcim/forms/bulk_edit.py:276 dcim/forms/filtersets.py:306 +#: dcim/forms/filtersets.py:740 dcim/forms/filtersets.py:880 +#: dcim/forms/filtersets.py:1430 +msgid "Asset tag" +msgstr "Etiqueta de ativo" + +#: dcim/forms/bulk_edit.py:286 dcim/forms/bulk_import.py:212 +#: dcim/forms/filtersets.py:291 templates/dcim/rack.html:91 +#: templates/dcim/rack_edit.html:48 +msgid "Width" +msgstr "Largura" + +#: dcim/forms/bulk_edit.py:292 +msgid "Height (U)" +msgstr "Altura (U)" + +#: dcim/forms/bulk_edit.py:297 +msgid "Descending units" +msgstr "Unidades descendentes" + +#: dcim/forms/bulk_edit.py:300 +msgid "Outer width" +msgstr "Largura externa" + +#: dcim/forms/bulk_edit.py:305 +msgid "Outer depth" +msgstr "Profundidade externa" + +#: dcim/forms/bulk_edit.py:310 dcim/forms/bulk_import.py:217 +msgid "Outer unit" +msgstr "Unidade externa" + +#: dcim/forms/bulk_edit.py:315 +msgid "Mounting depth" +msgstr "Profundidade de montagem" + +#: dcim/forms/bulk_edit.py:320 dcim/forms/bulk_edit.py:349 +#: dcim/forms/bulk_edit.py:434 dcim/forms/bulk_edit.py:457 +#: dcim/forms/bulk_edit.py:473 dcim/forms/bulk_edit.py:493 +#: dcim/forms/bulk_import.py:324 dcim/forms/bulk_import.py:350 +#: dcim/forms/filtersets.py:250 dcim/forms/filtersets.py:311 +#: dcim/forms/filtersets.py:335 dcim/forms/filtersets.py:423 +#: dcim/forms/filtersets.py:529 dcim/forms/filtersets.py:548 +#: dcim/forms/filtersets.py:605 dcim/forms/model_forms.py:337 +#: dcim/tables/devicetypes.py:103 dcim/tables/modules.py:35 +#: dcim/tables/racks.py:103 extras/forms/bulk_edit.py:45 +#: extras/forms/bulk_edit.py:107 extras/forms/bulk_edit.py:157 +#: extras/forms/bulk_edit.py:277 extras/forms/filtersets.py:60 +#: extras/forms/filtersets.py:133 extras/forms/filtersets.py:220 +#: ipam/forms/bulk_edit.py:187 templates/dcim/device.html:329 +#: templates/dcim/devicetype.html:52 templates/dcim/moduletype.html:31 +#: templates/dcim/rack_edit.html:60 templates/dcim/rack_edit.html:63 +#: templates/extras/configcontext.html:18 templates/extras/customlink.html:26 +#: templates/extras/savedfilter.html:34 templates/ipam/role.html:33 +msgid "Weight" +msgstr "Peso" + +#: dcim/forms/bulk_edit.py:325 dcim/forms/filtersets.py:316 +msgid "Max weight" +msgstr "Peso máximo" + +#: dcim/forms/bulk_edit.py:330 dcim/forms/bulk_edit.py:439 +#: dcim/forms/bulk_edit.py:478 dcim/forms/bulk_import.py:223 +#: dcim/forms/bulk_import.py:329 dcim/forms/bulk_import.py:355 +#: dcim/forms/filtersets.py:321 dcim/forms/filtersets.py:533 +#: dcim/forms/filtersets.py:609 +msgid "Weight unit" +msgstr "Unidade de peso" + +#: dcim/forms/bulk_edit.py:344 dcim/forms/bulk_edit.py:800 +#: dcim/forms/bulk_import.py:262 dcim/forms/bulk_import.py:265 +#: dcim/forms/bulk_import.py:490 dcim/forms/bulk_import.py:1286 +#: dcim/forms/bulk_import.py:1290 dcim/forms/filtersets.py:101 +#: dcim/forms/filtersets.py:339 dcim/forms/filtersets.py:353 +#: dcim/forms/filtersets.py:391 dcim/forms/filtersets.py:699 +#: dcim/forms/filtersets.py:948 dcim/forms/filtersets.py:1080 +#: dcim/forms/model_forms.py:241 dcim/forms/model_forms.py:413 +#: dcim/forms/model_forms.py:662 dcim/forms/object_create.py:399 +#: dcim/tables/devices.py:194 dcim/tables/power.py:70 dcim/tables/racks.py:148 +#: ipam/forms/bulk_edit.py:464 ipam/forms/filtersets.py:427 +#: ipam/forms/model_forms.py:571 templates/dcim/device.html:30 +#: templates/dcim/inc/cable_termination.html:16 +#: templates/dcim/powerfeed.html:31 templates/dcim/rack.html:14 +#: templates/dcim/rack/base.html:4 templates/dcim/rack_edit.html:8 +#: templates/dcim/rackreservation.html:20 +#: templates/dcim/rackreservation.html:39 +#: virtualization/forms/model_forms.py:116 +msgid "Rack" +msgstr "Rack" + +#: dcim/forms/bulk_edit.py:346 dcim/forms/bulk_edit.py:623 +#: dcim/forms/filtersets.py:247 dcim/forms/filtersets.py:332 +#: dcim/forms/filtersets.py:417 dcim/forms/filtersets.py:543 +#: dcim/forms/filtersets.py:652 dcim/forms/filtersets.py:853 +#: dcim/forms/model_forms.py:589 dcim/forms/model_forms.py:1374 +#: templates/dcim/device_edit.html:20 +#: templates/dcim/inventoryitem_edit.html:23 +msgid "Hardware" +msgstr "Hardware" + +#: dcim/forms/bulk_edit.py:400 dcim/forms/bulk_edit.py:464 +#: dcim/forms/bulk_edit.py:528 dcim/forms/bulk_edit.py:552 +#: dcim/forms/bulk_edit.py:633 dcim/forms/bulk_edit.py:1157 +#: dcim/forms/bulk_edit.py:1544 dcim/forms/bulk_import.py:311 +#: dcim/forms/bulk_import.py:345 dcim/forms/bulk_import.py:387 +#: dcim/forms/bulk_import.py:423 dcim/forms/bulk_import.py:1015 +#: dcim/forms/filtersets.py:429 dcim/forms/filtersets.py:554 +#: dcim/forms/filtersets.py:631 dcim/forms/filtersets.py:709 +#: dcim/forms/filtersets.py:858 dcim/forms/filtersets.py:1423 +#: dcim/forms/model_forms.py:274 dcim/forms/model_forms.py:288 +#: dcim/forms/model_forms.py:330 dcim/forms/model_forms.py:370 +#: dcim/forms/model_forms.py:968 dcim/forms/model_forms.py:1309 +#: dcim/forms/object_import.py:192 dcim/tables/devices.py:129 +#: dcim/tables/devices.py:205 dcim/tables/devices.py:942 +#: dcim/tables/devicetypes.py:81 dcim/tables/devicetypes.py:304 +#: dcim/tables/modules.py:20 dcim/tables/modules.py:60 +#: templates/dcim/devicetype.html:17 templates/dcim/inventoryitem.html:45 +#: templates/dcim/manufacturer.html:34 templates/dcim/modulebay.html:61 +#: templates/dcim/moduletype.html:15 templates/dcim/platform.html:40 +msgid "Manufacturer" +msgstr "Fabricante" + +#: dcim/forms/bulk_edit.py:405 dcim/forms/bulk_import.py:317 +#: dcim/forms/filtersets.py:434 dcim/forms/model_forms.py:292 +msgid "Default platform" +msgstr "Plataforma padrão" + +#: dcim/forms/bulk_edit.py:410 dcim/forms/bulk_edit.py:469 +#: dcim/forms/filtersets.py:437 dcim/forms/filtersets.py:558 +msgid "Part number" +msgstr "Número da peça" + +#: dcim/forms/bulk_edit.py:414 +msgid "U height" +msgstr "Altura em U" + +#: dcim/forms/bulk_edit.py:426 +msgid "Exclude from utilization" +msgstr "Excluir da utilização" + +#: dcim/forms/bulk_edit.py:429 dcim/forms/bulk_edit.py:598 +#: dcim/forms/bulk_import.py:517 dcim/forms/filtersets.py:446 +#: dcim/forms/filtersets.py:731 templates/dcim/device.html:100 +#: templates/dcim/devicetype.html:68 +msgid "Airflow" +msgstr "Fluxo de ar" + +#: dcim/forms/bulk_edit.py:453 dcim/forms/model_forms.py:303 +#: dcim/tables/devicetypes.py:78 templates/dcim/device.html:90 +#: templates/dcim/devicebay.html:59 templates/dcim/module.html:59 +msgid "Device Type" +msgstr "Tipo de dispositivo" + +#: dcim/forms/bulk_edit.py:492 dcim/forms/model_forms.py:336 +#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 +#: templates/dcim/module.html:63 templates/dcim/modulebay.html:65 +#: templates/dcim/moduletype.html:11 +msgid "Module Type" +msgstr "Tipo de módulo" + +#: dcim/forms/bulk_edit.py:506 dcim/models/devices.py:472 +msgid "VM role" +msgstr "Função da VM" + +#: dcim/forms/bulk_edit.py:509 dcim/forms/bulk_edit.py:533 +#: dcim/forms/bulk_edit.py:613 dcim/forms/bulk_import.py:368 +#: dcim/forms/bulk_import.py:372 dcim/forms/bulk_import.py:394 +#: dcim/forms/bulk_import.py:398 dcim/forms/bulk_import.py:523 +#: dcim/forms/bulk_import.py:527 dcim/forms/filtersets.py:620 +#: dcim/forms/filtersets.py:636 dcim/forms/filtersets.py:750 +#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:375 +#: dcim/forms/model_forms.py:477 virtualization/forms/bulk_import.py:132 +#: virtualization/forms/bulk_import.py:133 +#: virtualization/forms/filtersets.py:180 +#: virtualization/forms/model_forms.py:218 +msgid "Config template" +msgstr "Modelo de configuração" + +#: dcim/forms/bulk_edit.py:557 dcim/forms/bulk_edit.py:951 +#: dcim/forms/bulk_import.py:429 dcim/forms/filtersets.py:111 +#: dcim/forms/model_forms.py:435 dcim/forms/model_forms.py:776 +#: dcim/forms/model_forms.py:790 extras/filtersets.py:452 +msgid "Device type" +msgstr "Tipo de dispositivo" + +#: dcim/forms/bulk_edit.py:565 dcim/forms/bulk_import.py:410 +#: dcim/forms/filtersets.py:116 dcim/forms/model_forms.py:440 +msgid "Device role" +msgstr "Função do dispositivo" + +#: dcim/forms/bulk_edit.py:588 dcim/forms/bulk_import.py:435 +#: dcim/forms/filtersets.py:723 dcim/forms/model_forms.py:385 +#: dcim/forms/model_forms.py:444 extras/filtersets.py:468 +#: templates/dcim/device.html:191 templates/dcim/platform.html:27 +#: templates/virtualization/virtualmachine.html:30 +#: virtualization/forms/bulk_edit.py:159 +#: virtualization/forms/bulk_import.py:122 +#: virtualization/forms/filtersets.py:164 +#: virtualization/forms/model_forms.py:206 +msgid "Platform" +msgstr "Plataforma" + +#: dcim/forms/bulk_edit.py:621 dcim/forms/bulk_edit.py:1171 +#: dcim/forms/bulk_edit.py:1534 dcim/forms/bulk_edit.py:1580 +#: dcim/forms/bulk_import.py:578 dcim/forms/bulk_import.py:640 +#: dcim/forms/bulk_import.py:666 dcim/forms/bulk_import.py:692 +#: dcim/forms/bulk_import.py:712 dcim/forms/bulk_import.py:765 +#: dcim/forms/bulk_import.py:879 dcim/forms/bulk_import.py:927 +#: dcim/forms/bulk_import.py:944 dcim/forms/bulk_import.py:956 +#: dcim/forms/bulk_import.py:1004 dcim/forms/bulk_import.py:1350 +#: dcim/forms/connections.py:23 dcim/forms/filtersets.py:128 +#: dcim/forms/filtersets.py:831 dcim/forms/filtersets.py:964 +#: dcim/forms/filtersets.py:1154 dcim/forms/filtersets.py:1176 +#: dcim/forms/filtersets.py:1198 dcim/forms/filtersets.py:1215 +#: dcim/forms/filtersets.py:1235 dcim/forms/filtersets.py:1343 +#: dcim/forms/filtersets.py:1365 dcim/forms/filtersets.py:1386 +#: dcim/forms/filtersets.py:1401 dcim/forms/filtersets.py:1412 +#: dcim/forms/filtersets.py:1476 dcim/forms/filtersets.py:1500 +#: dcim/forms/filtersets.py:1524 dcim/forms/model_forms.py:555 +#: dcim/forms/model_forms.py:753 dcim/forms/model_forms.py:1004 +#: dcim/forms/model_forms.py:1453 dcim/forms/object_create.py:256 +#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 +#: dcim/tables/connections.py:60 dcim/tables/devices.py:314 +#: dcim/tables/devices.py:374 dcim/tables/devices.py:418 +#: dcim/tables/devices.py:463 dcim/tables/devices.py:517 +#: dcim/tables/devices.py:609 dcim/tables/devices.py:710 +#: dcim/tables/devices.py:770 dcim/tables/devices.py:820 +#: dcim/tables/devices.py:880 dcim/tables/devices.py:932 +#: dcim/tables/devices.py:1058 dcim/tables/modules.py:52 +#: extras/forms/filtersets.py:329 ipam/forms/bulk_import.py:303 +#: ipam/forms/bulk_import.py:489 ipam/forms/filtersets.py:532 +#: ipam/forms/model_forms.py:685 ipam/tables/vlans.py:176 +#: templates/dcim/consoleport.html:23 templates/dcim/consoleserverport.html:23 +#: templates/dcim/device.html:14 templates/dcim/device.html:128 +#: templates/dcim/device_edit.html:10 templates/dcim/devicebay.html:23 +#: templates/dcim/devicebay.html:55 templates/dcim/frontport.html:23 +#: templates/dcim/interface.html:31 templates/dcim/interface.html:167 +#: templates/dcim/inventoryitem.html:21 templates/dcim/module.html:55 +#: templates/dcim/modulebay.html:21 templates/dcim/poweroutlet.html:23 +#: templates/dcim/powerport.html:23 templates/dcim/rearport.html:23 +#: templates/dcim/virtualchassis.html:58 +#: templates/dcim/virtualchassis_edit.html:52 +#: templates/dcim/virtualdevicecontext.html:25 +#: templates/ipam/ipaddress_edit.html:42 templates/ipam/service_create.html:17 +#: templates/ipam/service_edit.html:16 +#: templates/virtualization/virtualmachine.html:115 +#: templates/vpn/l2vpntermination_edit.html:22 +#: templates/vpn/tunneltermination.html:24 +#: templates/wireless/inc/wirelesslink_interface.html:6 +#: virtualization/filtersets.py:166 virtualization/forms/bulk_edit.py:136 +#: virtualization/forms/bulk_import.py:99 +#: virtualization/forms/filtersets.py:124 +#: virtualization/forms/model_forms.py:188 +#: virtualization/tables/virtualmachines.py:61 vpn/choices.py:44 +#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:278 +#: vpn/forms/filtersets.py:271 vpn/forms/model_forms.py:89 +#: vpn/forms/model_forms.py:124 vpn/forms/model_forms.py:237 +#: wireless/forms/model_forms.py:100 wireless/forms/model_forms.py:140 +#: wireless/tables/wirelesslan.py:75 +msgid "Device" +msgstr "Dispositivo" + +#: dcim/forms/bulk_edit.py:624 netbox/navigation/menu.py:441 +#: templates/extras/dashboard/widget_config.html:7 +msgid "Configuration" +msgstr "Configuração" + +#: dcim/forms/bulk_edit.py:638 dcim/forms/bulk_import.py:590 +#: dcim/forms/model_forms.py:569 dcim/forms/model_forms.py:795 +msgid "Module type" +msgstr "Tipo de módulo" + +#: dcim/forms/bulk_edit.py:689 dcim/forms/bulk_edit.py:874 +#: dcim/forms/bulk_edit.py:893 dcim/forms/bulk_edit.py:916 +#: dcim/forms/bulk_edit.py:958 dcim/forms/bulk_edit.py:1002 +#: dcim/forms/bulk_edit.py:1053 dcim/forms/bulk_edit.py:1080 +#: dcim/forms/bulk_edit.py:1107 dcim/forms/bulk_edit.py:1125 +#: dcim/forms/bulk_edit.py:1143 dcim/forms/filtersets.py:64 +#: dcim/forms/object_create.py:45 templates/dcim/cable.html:33 +#: templates/dcim/consoleport.html:35 templates/dcim/consoleserverport.html:35 +#: templates/dcim/devicebay.html:31 templates/dcim/frontport.html:35 +#: templates/dcim/inc/panels/inventory_items.html:11 +#: templates/dcim/interface.html:43 templates/dcim/inventoryitem.html:33 +#: templates/dcim/modulebay.html:31 templates/dcim/poweroutlet.html:35 +#: templates/dcim/powerport.html:35 templates/dcim/rearport.html:35 +#: templates/extras/customfield.html:27 templates/generic/bulk_import.html:155 +msgid "Label" +msgstr "Rótulo" + +#: dcim/forms/bulk_edit.py:698 dcim/forms/filtersets.py:981 +#: templates/dcim/cable.html:51 +msgid "Length" +msgstr "Comprimento" + +#: dcim/forms/bulk_edit.py:703 dcim/forms/bulk_import.py:1158 +#: dcim/forms/bulk_import.py:1161 dcim/forms/filtersets.py:985 +msgid "Length unit" +msgstr "Unidade de comprimento" + +#: dcim/forms/bulk_edit.py:727 templates/dcim/virtualchassis.html:24 +msgid "Domain" +msgstr "Domínio" + +#: dcim/forms/bulk_edit.py:795 dcim/forms/bulk_import.py:1273 +#: dcim/forms/filtersets.py:1071 dcim/forms/model_forms.py:657 +msgid "Power panel" +msgstr "Painel de alimentação" + +#: dcim/forms/bulk_edit.py:817 dcim/forms/bulk_import.py:1309 +#: dcim/forms/filtersets.py:1093 templates/dcim/powerfeed.html:90 +msgid "Supply" +msgstr "Fornecimento" + +#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1314 +#: dcim/forms/filtersets.py:1098 templates/dcim/powerfeed.html:102 +msgid "Phase" +msgstr "Estágio" + +#: dcim/forms/bulk_edit.py:829 dcim/forms/filtersets.py:1103 +#: templates/dcim/powerfeed.html:94 +msgid "Voltage" +msgstr "Voltagem" + +#: dcim/forms/bulk_edit.py:833 dcim/forms/filtersets.py:1107 +#: templates/dcim/powerfeed.html:98 +msgid "Amperage" +msgstr "Amperagem" + +#: dcim/forms/bulk_edit.py:837 dcim/forms/filtersets.py:1111 +msgid "Max utilization" +msgstr "Utilização máxima" + +#: dcim/forms/bulk_edit.py:841 dcim/forms/bulk_edit.py:1200 +#: dcim/forms/bulk_edit.py:1217 dcim/forms/bulk_edit.py:1234 +#: dcim/forms/bulk_edit.py:1252 dcim/forms/bulk_edit.py:1340 +#: dcim/forms/bulk_edit.py:1478 dcim/forms/bulk_edit.py:1495 +msgid "Mark connected" +msgstr "Marcar conectado" + +#: dcim/forms/bulk_edit.py:926 +msgid "Maximum draw" +msgstr "Sorteio máximo" + +#: dcim/forms/bulk_edit.py:929 dcim/models/device_component_templates.py:256 +#: dcim/models/device_components.py:357 +msgid "Maximum power draw (watts)" +msgstr "Consumo máximo de energia (watts)" + +#: dcim/forms/bulk_edit.py:932 +msgid "Allocated draw" +msgstr "Sorteio alocado" + +#: dcim/forms/bulk_edit.py:935 dcim/models/device_component_templates.py:263 +#: dcim/models/device_components.py:364 +msgid "Allocated power draw (watts)" +msgstr "Consumo de energia alocado (watts)" + +#: dcim/forms/bulk_edit.py:968 dcim/forms/bulk_import.py:723 +#: dcim/forms/model_forms.py:848 dcim/forms/model_forms.py:1076 +#: dcim/forms/model_forms.py:1361 dcim/forms/object_import.py:60 +msgid "Power port" +msgstr "Porta de alimentação" + +#: dcim/forms/bulk_edit.py:973 +msgid "Feed leg" +msgstr "Perna de alimentação" + +#: dcim/forms/bulk_edit.py:1019 dcim/forms/bulk_edit.py:1325 +msgid "Management only" +msgstr "Somente gerenciamento" + +#: dcim/forms/bulk_edit.py:1029 dcim/forms/bulk_edit.py:1331 +#: dcim/forms/bulk_import.py:813 dcim/forms/filtersets.py:1294 +#: dcim/forms/object_import.py:95 +#: dcim/models/device_component_templates.py:411 +#: dcim/models/device_components.py:671 +msgid "PoE mode" +msgstr "Modo PoE" + +#: dcim/forms/bulk_edit.py:1035 dcim/forms/bulk_edit.py:1337 +#: dcim/forms/bulk_import.py:819 dcim/forms/filtersets.py:1299 +#: dcim/forms/object_import.py:100 +#: dcim/models/device_component_templates.py:417 +#: dcim/models/device_components.py:677 +msgid "PoE type" +msgstr "Tipo PoE" + +#: dcim/forms/bulk_edit.py:1041 dcim/forms/filtersets.py:1304 +#: dcim/forms/object_import.py:105 +msgid "Wireless role" +msgstr "Função sem fio" + +#: dcim/forms/bulk_edit.py:1178 dcim/forms/model_forms.py:588 +#: dcim/forms/model_forms.py:1019 dcim/tables/devices.py:337 +#: templates/dcim/consoleport.html:27 templates/dcim/consoleserverport.html:27 +#: templates/dcim/frontport.html:27 templates/dcim/interface.html:35 +#: templates/dcim/module.html:51 templates/dcim/modulebay.html:57 +#: templates/dcim/poweroutlet.html:27 templates/dcim/powerport.html:27 +#: templates/dcim/rearport.html:27 +msgid "Module" +msgstr "Módulo" + +#: dcim/forms/bulk_edit.py:1305 dcim/tables/devices.py:680 +#: templates/dcim/interface.html:113 +msgid "LAG" +msgstr "DEFASAGEM" + +#: dcim/forms/bulk_edit.py:1310 dcim/forms/model_forms.py:1103 +msgid "Virtual device contexts" +msgstr "Contextos de dispositivos virtuais" + +#: dcim/forms/bulk_edit.py:1316 dcim/forms/bulk_import.py:651 +#: dcim/forms/bulk_import.py:677 dcim/forms/filtersets.py:1163 +#: dcim/forms/filtersets.py:1185 dcim/forms/filtersets.py:1258 +#: dcim/tables/devices.py:621 +#: templates/circuits/inc/circuit_termination.html:94 +#: templates/dcim/consoleport.html:43 templates/dcim/consoleserverport.html:43 +msgid "Speed" +msgstr "Rapidez" + +#: dcim/forms/bulk_edit.py:1345 dcim/forms/bulk_import.py:822 +#: templates/vpn/ikepolicy.html:26 templates/vpn/ipsecprofile.html:22 +#: templates/vpn/ipsecprofile.html:51 virtualization/forms/bulk_edit.py:232 +#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:145 +#: vpn/forms/bulk_edit.py:233 vpn/forms/bulk_import.py:175 +#: vpn/forms/bulk_import.py:229 vpn/forms/filtersets.py:132 +#: vpn/forms/filtersets.py:175 vpn/forms/filtersets.py:189 +#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +msgid "Mode" +msgstr "Modo" + +#: dcim/forms/bulk_edit.py:1353 dcim/forms/model_forms.py:1152 +#: ipam/forms/bulk_import.py:177 ipam/forms/filtersets.py:479 +#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:239 +#: virtualization/forms/model_forms.py:324 +msgid "VLAN group" +msgstr "Grupo de VLAN" + +#: dcim/forms/bulk_edit.py:1361 dcim/forms/model_forms.py:1157 +#: dcim/tables/devices.py:594 virtualization/forms/bulk_edit.py:247 +#: virtualization/forms/model_forms.py:329 +msgid "Untagged VLAN" +msgstr "VLAN sem etiqueta" + +#: dcim/forms/bulk_edit.py:1369 dcim/forms/model_forms.py:1166 +#: dcim/tables/devices.py:600 virtualization/forms/bulk_edit.py:255 +#: virtualization/forms/model_forms.py:338 +msgid "Tagged VLANs" +msgstr "VLANs marcadas" + +#: dcim/forms/bulk_edit.py:1379 dcim/forms/model_forms.py:1139 +msgid "Wireless LAN group" +msgstr "Grupo de LAN sem fio" + +#: dcim/forms/bulk_edit.py:1384 dcim/forms/model_forms.py:1144 +#: dcim/tables/devices.py:630 netbox/navigation/menu.py:134 +#: templates/dcim/interface.html:289 wireless/tables/wirelesslan.py:24 +msgid "Wireless LANs" +msgstr "LANs sem fio" + +#: dcim/forms/bulk_edit.py:1393 dcim/forms/filtersets.py:1231 +#: dcim/forms/model_forms.py:1185 ipam/forms/bulk_edit.py:270 +#: ipam/forms/bulk_edit.py:361 ipam/forms/filtersets.py:166 +#: templates/dcim/interface.html:126 templates/ipam/prefix.html:96 +#: virtualization/forms/model_forms.py:352 +msgid "Addressing" +msgstr "Endereçando" + +#: dcim/forms/bulk_edit.py:1394 dcim/forms/filtersets.py:651 +#: dcim/forms/model_forms.py:1186 virtualization/forms/model_forms.py:353 +msgid "Operation" +msgstr "Operação" + +#: dcim/forms/bulk_edit.py:1395 dcim/forms/filtersets.py:1232 +#: dcim/forms/model_forms.py:880 dcim/forms/model_forms.py:1188 +msgid "PoE" +msgstr "PoE" + +#: dcim/forms/bulk_edit.py:1396 dcim/forms/model_forms.py:1187 +#: templates/dcim/interface.html:101 virtualization/forms/bulk_edit.py:266 +#: virtualization/forms/model_forms.py:354 +msgid "Related Interfaces" +msgstr "Interfaces relacionadas" + +#: dcim/forms/bulk_edit.py:1397 dcim/forms/model_forms.py:1189 +#: virtualization/forms/bulk_edit.py:267 +#: virtualization/forms/model_forms.py:355 +msgid "802.1Q Switching" +msgstr "Comutação 802.1Q" + +#: dcim/forms/bulk_edit.py:1458 dcim/forms/bulk_edit.py:1460 +msgid "Interface mode must be specified to assign VLANs" +msgstr "O modo de interface deve ser especificado para atribuir VLANs" + +#: dcim/forms/bulk_edit.py:1465 dcim/forms/common.py:50 +msgid "An access interface cannot have tagged VLANs assigned." +msgstr "Uma interface de acesso não pode ter VLANs marcadas atribuídas." + +#: dcim/forms/bulk_import.py:63 +msgid "Name of parent region" +msgstr "Nome da região principal" + +#: dcim/forms/bulk_import.py:77 +msgid "Name of parent site group" +msgstr "Nome do grupo de sites principal" + +#: dcim/forms/bulk_import.py:96 +msgid "Assigned region" +msgstr "Região atribuída" + +#: dcim/forms/bulk_import.py:103 tenancy/forms/bulk_import.py:44 +#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +msgid "Assigned group" +msgstr "Grupo atribuído" + +#: dcim/forms/bulk_import.py:122 +msgid "available options" +msgstr "opções disponíveis" + +#: dcim/forms/bulk_import.py:133 dcim/forms/bulk_import.py:480 +#: dcim/forms/bulk_import.py:1270 ipam/forms/bulk_import.py:174 +#: ipam/forms/bulk_import.py:441 virtualization/forms/bulk_import.py:63 +#: virtualization/forms/bulk_import.py:89 +msgid "Assigned site" +msgstr "Site atribuído" + +#: dcim/forms/bulk_import.py:140 +msgid "Parent location" +msgstr "Localização dos pais" + +#: dcim/forms/bulk_import.py:142 +msgid "Location not found." +msgstr "Localização não encontrada." + +#: dcim/forms/bulk_import.py:191 +msgid "Name of assigned tenant" +msgstr "Nome do inquilino designado" + +#: dcim/forms/bulk_import.py:203 +msgid "Name of assigned role" +msgstr "Nome da função atribuída" + +#: dcim/forms/bulk_import.py:209 +msgid "Rack type" +msgstr "Tipo de rack" + +#: dcim/forms/bulk_import.py:214 +msgid "Rail-to-rail width (in inches)" +msgstr "Largura de trilho a trilho (em polegadas)" + +#: dcim/forms/bulk_import.py:220 +msgid "Unit for outer dimensions" +msgstr "Unidade para dimensões externas" + +#: dcim/forms/bulk_import.py:226 +msgid "Unit for rack weights" +msgstr "Unidade para pesos de rack" + +#: dcim/forms/bulk_import.py:252 +msgid "Parent site" +msgstr "Site principal" + +#: dcim/forms/bulk_import.py:259 dcim/forms/bulk_import.py:1283 +msgid "Rack's location (if any)" +msgstr "Localização do rack (se houver)" + +#: dcim/forms/bulk_import.py:268 dcim/forms/model_forms.py:246 +#: dcim/tables/racks.py:153 templates/dcim/rackreservation.html:12 +#: templates/dcim/rackreservation.html:52 +msgid "Units" +msgstr "Unidades" + +#: dcim/forms/bulk_import.py:271 +msgid "Comma-separated list of individual unit numbers" +msgstr "Lista separada por vírgula de números de unidades individuais" + +#: dcim/forms/bulk_import.py:314 +msgid "The manufacturer which produces this device type" +msgstr "O fabricante que produz esse tipo de dispositivo" + +#: dcim/forms/bulk_import.py:321 +msgid "The default platform for devices of this type (optional)" +msgstr "A plataforma padrão para dispositivos desse tipo (opcional)" + +#: dcim/forms/bulk_import.py:326 +msgid "Device weight" +msgstr "Peso do dispositivo" + +#: dcim/forms/bulk_import.py:332 +msgid "Unit for device weight" +msgstr "Unidade para peso do dispositivo" + +#: dcim/forms/bulk_import.py:352 +msgid "Module weight" +msgstr "Peso do módulo" + +#: dcim/forms/bulk_import.py:358 +msgid "Unit for module weight" +msgstr "Unidade para peso do módulo" + +#: dcim/forms/bulk_import.py:391 +msgid "Limit platform assignments to this manufacturer" +msgstr "Limitar as atribuições de plataforma a este fabricante" + +#: dcim/forms/bulk_import.py:413 tenancy/forms/bulk_import.py:106 +msgid "Assigned role" +msgstr "Função atribuída" + +#: dcim/forms/bulk_import.py:426 +msgid "Device type manufacturer" +msgstr "Fabricante do tipo de dispositivo" + +#: dcim/forms/bulk_import.py:432 +msgid "Device type model" +msgstr "Tipo de dispositivo: modelo" + +#: dcim/forms/bulk_import.py:439 virtualization/forms/bulk_import.py:126 +msgid "Assigned platform" +msgstr "Plataforma atribuída" + +#: dcim/forms/bulk_import.py:447 dcim/forms/bulk_import.py:451 +#: dcim/forms/model_forms.py:461 +msgid "Virtual chassis" +msgstr "Chassi virtual" + +#: dcim/forms/bulk_import.py:454 dcim/forms/model_forms.py:450 +#: dcim/tables/devices.py:231 extras/filtersets.py:501 +#: extras/forms/filtersets.py:330 ipam/forms/bulk_edit.py:478 +#: ipam/forms/model_forms.py:588 templates/dcim/device.html:239 +#: templates/virtualization/cluster.html:11 +#: templates/virtualization/virtualmachine.html:92 +#: templates/virtualization/virtualmachine.html:102 +#: virtualization/filtersets.py:156 virtualization/filtersets.py:271 +#: virtualization/forms/bulk_edit.py:128 +#: virtualization/forms/bulk_import.py:92 +#: virtualization/forms/filtersets.py:98 +#: virtualization/forms/filtersets.py:119 +#: virtualization/forms/filtersets.py:196 +#: virtualization/forms/model_forms.py:82 +#: virtualization/forms/model_forms.py:179 +#: virtualization/tables/virtualmachines.py:57 +msgid "Cluster" +msgstr "Cluster" + +#: dcim/forms/bulk_import.py:458 +msgid "Virtualization cluster" +msgstr "Cluster de virtualização" + +#: dcim/forms/bulk_import.py:487 +msgid "Assigned location (if any)" +msgstr "Local atribuído (se houver)" + +#: dcim/forms/bulk_import.py:494 +msgid "Assigned rack (if any)" +msgstr "Rack atribuído (se houver)" + +#: dcim/forms/bulk_import.py:497 +msgid "Face" +msgstr "Rosto" + +#: dcim/forms/bulk_import.py:500 +msgid "Mounted rack face" +msgstr "Face de rack montada" + +#: dcim/forms/bulk_import.py:507 +msgid "Parent device (for child devices)" +msgstr "Dispositivo principal (para dispositivos infantis)" + +#: dcim/forms/bulk_import.py:510 +msgid "Device bay" +msgstr "Compartimento de dispositivos" + +#: dcim/forms/bulk_import.py:514 +msgid "Device bay in which this device is installed (for child devices)" +msgstr "" +"Compartimento de dispositivos no qual este dispositivo está instalado (para " +"dispositivos infantis)" + +#: dcim/forms/bulk_import.py:520 +msgid "Airflow direction" +msgstr "Direção do fluxo de ar" + +#: dcim/forms/bulk_import.py:581 +msgid "The device in which this module is installed" +msgstr "O dispositivo no qual este módulo está instalado" + +#: dcim/forms/bulk_import.py:584 dcim/forms/model_forms.py:562 +msgid "Module bay" +msgstr "Compartimento do módulo" + +#: dcim/forms/bulk_import.py:587 +msgid "The module bay in which this module is installed" +msgstr "O compartimento do módulo no qual este módulo está instalado" + +#: dcim/forms/bulk_import.py:593 +msgid "The type of module" +msgstr "O tipo de módulo" + +#: dcim/forms/bulk_import.py:601 dcim/forms/model_forms.py:575 +msgid "Replicate components" +msgstr "Replicar componentes" + +#: dcim/forms/bulk_import.py:603 +msgid "" +"Automatically populate components associated with this module type (enabled " +"by default)" +msgstr "" +"Preencher automaticamente os componentes associados a esse tipo de módulo " +"(ativado por padrão)" + +#: dcim/forms/bulk_import.py:606 dcim/forms/model_forms.py:581 +msgid "Adopt components" +msgstr "Adote componentes" + +#: dcim/forms/bulk_import.py:608 dcim/forms/model_forms.py:584 +msgid "Adopt already existing components" +msgstr "Adote componentes já existentes" + +#: dcim/forms/bulk_import.py:648 dcim/forms/bulk_import.py:674 +#: dcim/forms/bulk_import.py:700 +msgid "Port type" +msgstr "Tipo de porta" + +#: dcim/forms/bulk_import.py:656 dcim/forms/bulk_import.py:682 +msgid "Port speed in bps" +msgstr "Velocidade da porta em bps" + +#: dcim/forms/bulk_import.py:720 +msgid "Outlet type" +msgstr "Tipo de tomada" + +#: dcim/forms/bulk_import.py:727 +msgid "Local power port which feeds this outlet" +msgstr "Porta de alimentação local que alimenta esta tomada" + +#: dcim/forms/bulk_import.py:730 +msgid "Feed lag" +msgstr "Atraso de alimentação" + +#: dcim/forms/bulk_import.py:733 +msgid "Electrical phase (for three-phase circuits)" +msgstr "Fase elétrica (para circuitos trifásicos)" + +#: dcim/forms/bulk_import.py:774 dcim/forms/model_forms.py:1114 +#: virtualization/forms/bulk_import.py:155 +#: virtualization/forms/model_forms.py:308 +msgid "Parent interface" +msgstr "Interface principal" + +#: dcim/forms/bulk_import.py:781 dcim/forms/model_forms.py:1122 +#: virtualization/forms/bulk_import.py:162 +#: virtualization/forms/model_forms.py:316 +msgid "Bridged interface" +msgstr "Interface interligada" + +#: dcim/forms/bulk_import.py:784 +msgid "Lag" +msgstr "Atraso" + +#: dcim/forms/bulk_import.py:788 +msgid "Parent LAG interface" +msgstr "Interface LAG principal" + +#: dcim/forms/bulk_import.py:791 +msgid "Vdcs" +msgstr "Vdcs" + +#: dcim/forms/bulk_import.py:796 +msgid "VDC names separated by commas, encased with double quotes. Example:" +msgstr "Nomes VDC separados por vírgulas, entre aspas duplas. Exemplo:" + +#: dcim/forms/bulk_import.py:802 +msgid "Physical medium" +msgstr "Meio físico" + +#: dcim/forms/bulk_import.py:805 dcim/forms/filtersets.py:1265 +msgid "Duplex" +msgstr "Duplex" + +#: dcim/forms/bulk_import.py:810 +msgid "Poe mode" +msgstr "Modo Poe" + +#: dcim/forms/bulk_import.py:816 +msgid "Poe type" +msgstr "Tipo de poe" + +#: dcim/forms/bulk_import.py:825 virtualization/forms/bulk_import.py:168 +msgid "IEEE 802.1Q operational mode (for L2 interfaces)" +msgstr "Modo operacional IEEE 802.1Q (para interfaces L2)" + +#: dcim/forms/bulk_import.py:832 ipam/forms/bulk_import.py:160 +#: ipam/forms/bulk_import.py:246 ipam/forms/bulk_import.py:282 +#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:266 +#: ipam/forms/filtersets.py:322 virtualization/forms/bulk_import.py:175 +msgid "Assigned VRF" +msgstr "VRF atribuído" + +#: dcim/forms/bulk_import.py:835 +msgid "Rf role" +msgstr "Função Rf" + +#: dcim/forms/bulk_import.py:838 +msgid "Wireless role (AP/station)" +msgstr "Função sem fio (AP/estação)" + +#: dcim/forms/bulk_import.py:884 dcim/forms/model_forms.py:893 +#: dcim/forms/model_forms.py:1369 dcim/forms/object_import.py:122 +msgid "Rear port" +msgstr "Porta traseira" + +#: dcim/forms/bulk_import.py:887 +msgid "Corresponding rear port" +msgstr "Porta traseira correspondente" + +#: dcim/forms/bulk_import.py:892 dcim/forms/bulk_import.py:933 +#: dcim/forms/bulk_import.py:1148 +msgid "Physical medium classification" +msgstr "Classificação física do meio" + +#: dcim/forms/bulk_import.py:961 dcim/tables/devices.py:841 +msgid "Installed device" +msgstr "Dispositivo instalado" + +#: dcim/forms/bulk_import.py:965 +msgid "Child device installed within this bay" +msgstr "Dispositivo infantil instalado dentro deste compartimento" + +#: dcim/forms/bulk_import.py:967 +msgid "Child device not found." +msgstr "Dispositivo infantil não encontrado." + +#: dcim/forms/bulk_import.py:1025 +msgid "Parent inventory item" +msgstr "Item do inventário principal" + +#: dcim/forms/bulk_import.py:1028 +msgid "Component type" +msgstr "Tipo de componente" + +#: dcim/forms/bulk_import.py:1032 +msgid "Component Type" +msgstr "Tipo de componente" + +#: dcim/forms/bulk_import.py:1035 +msgid "Compnent name" +msgstr "Nome do componente" + +#: dcim/forms/bulk_import.py:1037 +msgid "Component Name" +msgstr "Nome do componente" + +#: dcim/forms/bulk_import.py:1103 +msgid "Side A device" +msgstr "Dispositivo do lado A" + +#: dcim/forms/bulk_import.py:1106 dcim/forms/bulk_import.py:1124 +msgid "Device name" +msgstr "Nome do dispositivo" + +#: dcim/forms/bulk_import.py:1109 +msgid "Side A type" +msgstr "Tipo de lado A" + +#: dcim/forms/bulk_import.py:1112 dcim/forms/bulk_import.py:1130 +msgid "Termination type" +msgstr "Tipo de rescisão" + +#: dcim/forms/bulk_import.py:1115 +msgid "Side A name" +msgstr "Nome do lado A" + +#: dcim/forms/bulk_import.py:1116 dcim/forms/bulk_import.py:1134 +msgid "Termination name" +msgstr "Nome da rescisão" + +#: dcim/forms/bulk_import.py:1121 +msgid "Side B device" +msgstr "Dispositivo do lado B" + +#: dcim/forms/bulk_import.py:1127 +msgid "Side B type" +msgstr "Tipo de lado B" + +#: dcim/forms/bulk_import.py:1133 +msgid "Side B name" +msgstr "Nome do lado B" + +#: dcim/forms/bulk_import.py:1142 wireless/forms/bulk_import.py:86 +msgid "Connection status" +msgstr "Status da conexão" + +#: dcim/forms/bulk_import.py:1221 dcim/forms/model_forms.py:689 +#: dcim/tables/devices.py:1028 templates/dcim/device.html:130 +#: templates/dcim/virtualchassis.html:28 templates/dcim/virtualchassis.html:60 +msgid "Master" +msgstr "Dominar" + +#: dcim/forms/bulk_import.py:1225 +msgid "Master device" +msgstr "Dispositivo principal" + +#: dcim/forms/bulk_import.py:1242 +msgid "Name of parent site" +msgstr "Nome do site principal" + +#: dcim/forms/bulk_import.py:1276 +msgid "Upstream power panel" +msgstr "Painel de alimentação upstream" + +#: dcim/forms/bulk_import.py:1306 +msgid "Primary or redundant" +msgstr "Primário ou redundante" + +#: dcim/forms/bulk_import.py:1311 +msgid "Supply type (AC/DC)" +msgstr "Tipo de alimentação (AC/DC)" + +#: dcim/forms/bulk_import.py:1316 +msgid "Single or three-phase" +msgstr "Monofásico ou trifásico" + +#: dcim/forms/common.py:24 dcim/models/device_components.py:528 +#: templates/dcim/interface.html:58 +#: templates/virtualization/vminterface.html:58 +#: virtualization/forms/bulk_edit.py:224 +msgid "MTU" +msgstr "MTU" + +#: dcim/forms/common.py:65 +#, python-brace-format +msgid "" +"The tagged VLANs ({vlans}) must belong to the same site as the interface's " +"parent device/VM, or they must be global" +msgstr "" +"As VLANs marcadas ({vlans}) devem pertencer ao mesmo site do dispositivo/VM " +"pai da interface ou devem ser globais" + +#: dcim/forms/common.py:110 +msgid "" +"Cannot install module with placeholder values in a module bay with no " +"position defined." +msgstr "" +"Não é possível instalar o módulo com valores de espaço reservado em um " +"compartimento de módulo sem posição definida." + +#: dcim/forms/common.py:119 +#, python-brace-format +msgid "Cannot adopt {model} {name} as it already belongs to a module" +msgstr "Não pode adotar {model} {name} pois já pertence a um módulo" + +#: dcim/forms/common.py:128 +#, python-brace-format +msgid "A {model} named {name} already exists" +msgstr "UMA {model} nomeado {name} já existe" + +#: dcim/forms/connections.py:45 dcim/tables/power.py:66 +#: templates/dcim/inc/cable_termination.html:37 +#: templates/dcim/powerfeed.html:27 templates/dcim/powerpanel.html:19 +#: templates/dcim/trace/powerpanel.html:4 +msgid "Power Panel" +msgstr "Painel de alimentação" + +#: dcim/forms/connections.py:54 dcim/forms/model_forms.py:670 +#: templates/dcim/powerfeed.html:22 templates/dcim/powerport.html:84 +msgid "Power Feed" +msgstr "Alimentação de energia" + +#: dcim/forms/connections.py:74 +msgid "Side" +msgstr "Lado" + +#: dcim/forms/filtersets.py:141 +msgid "Parent region" +msgstr "Região principal" + +#: dcim/forms/filtersets.py:155 tenancy/forms/bulk_import.py:28 +#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:32 +#: tenancy/forms/filtersets.py:61 wireless/forms/bulk_import.py:25 +#: wireless/forms/filtersets.py:24 +msgid "Parent group" +msgstr "Grupo de pais" + +#: dcim/forms/filtersets.py:246 dcim/forms/filtersets.py:331 +msgid "Function" +msgstr "Função" + +#: dcim/forms/filtersets.py:418 dcim/forms/model_forms.py:308 +#: templates/inc/panels/image_attachments.html:5 +msgid "Images" +msgstr "Imagens" + +#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:544 +#: dcim/forms/filtersets.py:655 +msgid "Components" +msgstr "Componentes" + +#: dcim/forms/filtersets.py:441 +msgid "Subdevice role" +msgstr "Função do subdispositivo" + +#: dcim/forms/filtersets.py:717 +msgid "Model" +msgstr "modelo" + +#: dcim/forms/filtersets.py:768 +msgid "Virtual chassis member" +msgstr "Membro do chassi virtual" + +#: dcim/forms/filtersets.py:1123 +msgid "Cabled" +msgstr "Cablado" + +#: dcim/forms/filtersets.py:1130 +msgid "Occupied" +msgstr "Ocupado" + +#: dcim/forms/filtersets.py:1155 dcim/forms/filtersets.py:1177 +#: dcim/forms/filtersets.py:1199 dcim/forms/filtersets.py:1216 +#: dcim/forms/filtersets.py:1236 dcim/tables/devices.py:367 +#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:59 +#: templates/dcim/frontport.html:74 templates/dcim/interface.html:146 +#: templates/dcim/powerfeed.html:118 templates/dcim/poweroutlet.html:63 +#: templates/dcim/powerport.html:63 templates/dcim/rearport.html:70 +msgid "Connection" +msgstr "Conexão" + +#: dcim/forms/filtersets.py:1245 dcim/forms/model_forms.py:1477 +#: templates/dcim/virtualdevicecontext.html:16 +msgid "Virtual Device Context" +msgstr "Contexto do dispositivo virtual" + +#: dcim/forms/filtersets.py:1248 extras/forms/bulk_edit.py:315 +#: extras/forms/bulk_import.py:239 extras/forms/filtersets.py:479 +#: extras/forms/model_forms.py:548 extras/tables/tables.py:482 +#: templates/extras/journalentry.html:33 +msgid "Kind" +msgstr "Gentil" + +#: dcim/forms/filtersets.py:1277 +msgid "Mgmt only" +msgstr "Somente gerenciamento" + +#: dcim/forms/filtersets.py:1289 dcim/forms/model_forms.py:1180 +#: dcim/models/device_components.py:630 templates/dcim/interface.html:134 +msgid "WWN" +msgstr "WWN" + +#: dcim/forms/filtersets.py:1309 +msgid "Wireless channel" +msgstr "Canal sem fio" + +#: dcim/forms/filtersets.py:1313 +msgid "Channel frequency (MHz)" +msgstr "Frequência do canal (MHz)" + +#: dcim/forms/filtersets.py:1317 +msgid "Channel width (MHz)" +msgstr "Largura do canal (MHz)" + +#: dcim/forms/filtersets.py:1321 templates/dcim/interface.html:86 +msgid "Transmit power (dBm)" +msgstr "Potência de transmissão (dBm)" + +#: dcim/forms/filtersets.py:1344 dcim/forms/filtersets.py:1366 +#: dcim/tables/devices.py:344 templates/dcim/cable.html:12 +#: templates/dcim/cable_edit.html:46 templates/dcim/cable_trace.html:43 +#: templates/dcim/frontport.html:84 +#: templates/dcim/inc/connection_endpoints.html:4 +#: templates/dcim/rearport.html:80 templates/dcim/trace/cable.html:7 +msgid "Cable" +msgstr "Cabo" + +#: dcim/forms/filtersets.py:1434 dcim/tables/devices.py:951 +msgid "Discovered" +msgstr "Descoberto" + +#: dcim/forms/formsets.py:20 +#, python-brace-format +msgid "A virtual chassis member already exists in position {vc_position}." +msgstr "Já existe um membro do chassi virtual em posição {vc_position}." + +#: dcim/forms/model_forms.py:101 dcim/tables/devices.py:183 +#: templates/dcim/sitegroup.html:26 +msgid "Site Group" +msgstr "Grupo de sites" + +#: dcim/forms/model_forms.py:142 +msgid "Contact Info" +msgstr "Informações de contato" + +#: dcim/forms/model_forms.py:197 templates/dcim/rackrole.html:20 +msgid "Rack Role" +msgstr "Função de rack" + +#: dcim/forms/model_forms.py:248 +msgid "" +"Comma-separated list of numeric unit IDs. A range may be specified using a " +"hyphen." +msgstr "" +"Lista separada por vírgulas de IDs de unidades numéricas. Um intervalo pode " +"ser especificado usando um hífen." + +#: dcim/forms/model_forms.py:259 dcim/tables/racks.py:133 +msgid "Reservation" +msgstr "Reserva" + +#: dcim/forms/model_forms.py:297 dcim/forms/model_forms.py:380 +#: utilities/forms/fields/fields.py:47 +msgid "Slug" +msgstr "Lesma" + +#: dcim/forms/model_forms.py:304 templates/dcim/devicetype.html:12 +msgid "Chassis" +msgstr "Chassi" + +#: dcim/forms/model_forms.py:356 templates/dcim/devicerole.html:24 +msgid "Device Role" +msgstr "Função do dispositivo" + +#: dcim/forms/model_forms.py:424 dcim/models/devices.py:632 +msgid "The lowest-numbered unit occupied by the device" +msgstr "A unidade de menor número ocupada pelo dispositivo" + +#: dcim/forms/model_forms.py:469 +msgid "The position in the virtual chassis this device is identified by" +msgstr "A posição no chassi virtual pela qual este dispositivo é identificado" + +#: dcim/forms/model_forms.py:473 templates/dcim/device.html:131 +#: templates/dcim/virtualchassis.html:61 +#: templates/dcim/virtualchassis_edit.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:13 +#: tenancy/forms/bulk_edit.py:146 tenancy/forms/filtersets.py:109 +msgid "Priority" +msgstr "Prioridade" + +#: dcim/forms/model_forms.py:474 +msgid "The priority of the device in the virtual chassis" +msgstr "A prioridade do dispositivo no chassi virtual" + +#: dcim/forms/model_forms.py:578 +msgid "Automatically populate components associated with this module type" +msgstr "" +"Preencher automaticamente os componentes associados a esse tipo de módulo" + +#: dcim/forms/model_forms.py:623 +msgid "Maximum length is 32767 (any unit)" +msgstr "O comprimento máximo é 32767 (qualquer unidade)" + +#: dcim/forms/model_forms.py:671 +msgid "Characteristics" +msgstr "Características" + +#: dcim/forms/model_forms.py:1130 +msgid "LAG interface" +msgstr "Interface LAG" + +#: dcim/forms/model_forms.py:1184 dcim/forms/model_forms.py:1345 +#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:317 +#: ipam/forms/model_forms.py:270 ipam/forms/model_forms.py:279 +#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:368 ipam/tables/vlans.py:165 +#: templates/circuits/inc/circuit_termination.html:78 +#: templates/dcim/frontport.html:113 templates/dcim/interface.html:27 +#: templates/dcim/interface.html:190 templates/dcim/interface.html:322 +#: templates/dcim/inventoryitem_edit.html:54 templates/dcim/rearport.html:109 +#: templates/ipam/fhrpgroupassignment_edit.html:11 +#: templates/virtualization/vminterface.html:19 +#: templates/vpn/tunneltermination.html:32 +#: templates/wireless/inc/wirelesslink_interface.html:10 +#: templates/wireless/wirelesslink.html:10 +#: templates/wireless/wirelesslink.html:49 +#: virtualization/forms/model_forms.py:351 vpn/forms/bulk_import.py:292 +#: vpn/forms/model_forms.py:94 vpn/forms/model_forms.py:129 +#: vpn/forms/model_forms.py:241 vpn/forms/model_forms.py:430 +#: vpn/forms/model_forms.py:439 vpn/tables/tunnels.py:87 +#: wireless/forms/model_forms.py:112 wireless/forms/model_forms.py:152 +msgid "Interface" +msgstr "Interface" + +#: dcim/forms/model_forms.py:1278 +msgid "Child Device" +msgstr "Dispositivo infantil" + +#: dcim/forms/model_forms.py:1279 +msgid "" +"Child devices must first be created and assigned to the site and rack of the" +" parent device." +msgstr "" +"Os dispositivos secundários devem primeiro ser criados e atribuídos ao site " +"e ao rack do dispositivo principal." + +#: dcim/forms/model_forms.py:1321 +msgid "Console port" +msgstr "Porta de console" + +#: dcim/forms/model_forms.py:1329 +msgid "Console server port" +msgstr "Porta do servidor do console" + +#: dcim/forms/model_forms.py:1337 +msgid "Front port" +msgstr "Porta frontal" + +#: dcim/forms/model_forms.py:1353 +msgid "Power outlet" +msgstr "Tomada elétrica" + +#: dcim/forms/model_forms.py:1373 templates/dcim/inventoryitem.html:17 +#: templates/dcim/inventoryitem_edit.html:10 +msgid "Inventory Item" +msgstr "Item de inventário" + +#: dcim/forms/model_forms.py:1425 +msgid "An InventoryItem can only be assigned to a single component." +msgstr "Um item de inventário só pode ser atribuído a um único componente." + +#: dcim/forms/model_forms.py:1439 templates/dcim/inventoryitemrole.html:15 +msgid "Inventory Item Role" +msgstr "Função do item de inventário" + +#: dcim/forms/model_forms.py:1459 templates/dcim/device.html:195 +#: templates/dcim/virtualdevicecontext.html:33 +#: templates/virtualization/virtualmachine.html:51 +msgid "Primary IPv4" +msgstr "IPv4 primário" + +#: dcim/forms/model_forms.py:1468 templates/dcim/device.html:211 +#: templates/dcim/virtualdevicecontext.html:44 +#: templates/virtualization/virtualmachine.html:67 +msgid "Primary IPv6" +msgstr "IPv6 primário" + +#: dcim/forms/object_create.py:47 dcim/forms/object_create.py:198 +#: dcim/forms/object_create.py:354 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of objects being " +"created.)" +msgstr "" +"Os intervalos alfanuméricos são suportados. (Deve corresponder ao número de " +"objetos que estão sendo criados.)" + +#: dcim/forms/object_create.py:67 +#, python-brace-format +msgid "" +"The provided pattern specifies {value_count} values, but {pattern_count} are" +" expected." +msgstr "" +"O padrão fornecido especifica {value_count} valores, mas {pattern_count} são" +" esperados." + +#: dcim/forms/object_create.py:109 dcim/forms/object_create.py:270 +#: dcim/tables/devices.py:281 +msgid "Rear ports" +msgstr "Portas traseiras" + +#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 +msgid "Select one rear port assignment for each front port being created." +msgstr "" +"Selecione uma atribuição de porta traseira para cada porta frontal que está " +"sendo criada." + +#: dcim/forms/object_create.py:163 +#, python-brace-format +msgid "" +"The number of front port templates to be created ({frontport_count}) must " +"match the selected number of rear port positions ({rearport_count})." +msgstr "" +"O número de modelos de porta frontal a serem criados ({frontport_count}) " +"deve corresponder ao número selecionado de posições da porta traseira " +"({rearport_count})." + +#: dcim/forms/object_create.py:250 +#, python-brace-format +msgid "" +"The string {module} will be replaced with the position of the " +"assigned module, if any." +msgstr "" +"A corda {module} será substituído pela posição do módulo " +"atribuído, se houver." + +#: dcim/forms/object_create.py:319 +#, python-brace-format +msgid "" +"The number of front ports to be created ({frontport_count}) must match the " +"selected number of rear port positions ({rearport_count})." +msgstr "" +"O número de portas frontais a serem criadas ({frontport_count}) deve " +"corresponder ao número selecionado de posições da porta traseira " +"({rearport_count})." + +#: dcim/forms/object_create.py:408 dcim/tables/devices.py:1034 +#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:54 +#: templates/dcim/virtualchassis_edit.html:48 templates/ipam/fhrpgroup.html:39 +msgid "Members" +msgstr "Membros" + +#: dcim/forms/object_create.py:417 +msgid "Initial position" +msgstr "Posição inicial" + +#: dcim/forms/object_create.py:420 +msgid "" +"Position of the first member device. Increases by one for each additional " +"member." +msgstr "" +"Posição do primeiro dispositivo membro. Aumenta em um para cada membro " +"adicional." + +#: dcim/forms/object_create.py:434 +msgid "A position must be specified for the first VC member." +msgstr "Uma posição deve ser especificada para o primeiro membro do VC." + +#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 +#: dcim/models/device_components.py:63 extras/models/customfields.py:108 +msgid "label" +msgstr "etiqueta" + +#: dcim/models/cables.py:71 +msgid "length" +msgstr "comprimento" + +#: dcim/models/cables.py:78 +msgid "length unit" +msgstr "unidade de comprimento" + +#: dcim/models/cables.py:93 +msgid "cable" +msgstr "cabo" + +#: dcim/models/cables.py:94 +msgid "cables" +msgstr "cabos" + +#: dcim/models/cables.py:190 +msgid "A and B terminations cannot connect to the same object." +msgstr "As terminações A e B não podem se conectar ao mesmo objeto." + +#: dcim/models/cables.py:257 ipam/models/asns.py:37 +msgid "end" +msgstr "fim" + +#: dcim/models/cables.py:310 +msgid "cable termination" +msgstr "terminação de cabo" + +#: dcim/models/cables.py:311 +msgid "cable terminations" +msgstr "terminações de cabos" + +#: dcim/models/cables.py:434 extras/models/configs.py:50 +msgid "is active" +msgstr "está ativo" + +#: dcim/models/cables.py:438 +msgid "is complete" +msgstr "está completo" + +#: dcim/models/cables.py:442 +msgid "is split" +msgstr "é dividido" + +#: dcim/models/cables.py:450 +msgid "cable path" +msgstr "caminho do cabo" + +#: dcim/models/cables.py:451 +msgid "cable paths" +msgstr "caminhos de cabos" + +#: dcim/models/device_component_templates.py:46 +#, python-brace-format +msgid "" +"{module} is accepted as a substitution for the module bay position when " +"attached to a module type." +msgstr "" +"{module} é aceito como uma substituição para a posição do compartimento do " +"módulo quando conectado a um tipo de módulo." + +#: dcim/models/device_component_templates.py:58 +#: dcim/models/device_components.py:66 +msgid "Physical label" +msgstr "Rótulo físico" + +#: dcim/models/device_component_templates.py:103 +msgid "Component templates cannot be moved to a different device type." +msgstr "" +"Os modelos de componentes não podem ser movidos para um tipo de dispositivo " +"diferente." + +#: dcim/models/device_component_templates.py:154 +msgid "" +"A component template cannot be associated with both a device type and a " +"module type." +msgstr "" +"Um modelo de componente não pode ser associado a um tipo de dispositivo e a " +"um tipo de módulo." + +#: dcim/models/device_component_templates.py:158 +msgid "" +"A component template must be associated with either a device type or a " +"module type." +msgstr "" +"Um modelo de componente deve estar associado a um tipo de dispositivo ou a " +"um tipo de módulo." + +#: dcim/models/device_component_templates.py:186 +msgid "console port template" +msgstr "modelo de porta de console" + +#: dcim/models/device_component_templates.py:187 +msgid "console port templates" +msgstr "modelos de porta de console" + +#: dcim/models/device_component_templates.py:220 +msgid "console server port template" +msgstr "modelo de porta de servidor de console" + +#: dcim/models/device_component_templates.py:221 +msgid "console server port templates" +msgstr "modelos de porta de servidor de console" + +#: dcim/models/device_component_templates.py:252 +#: dcim/models/device_components.py:353 +msgid "maximum draw" +msgstr "sorteio máximo" + +#: dcim/models/device_component_templates.py:259 +#: dcim/models/device_components.py:360 +msgid "allocated draw" +msgstr "sorteio alocado" + +#: dcim/models/device_component_templates.py:269 +msgid "power port template" +msgstr "modelo de porta de alimentação" + +#: dcim/models/device_component_templates.py:270 +msgid "power port templates" +msgstr "modelos de porta de alimentação" + +#: dcim/models/device_component_templates.py:289 +#: dcim/models/device_components.py:383 +#, python-brace-format +msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." +msgstr "" +"O sorteio alocado não pode exceder o sorteio máximo ({maximum_draw}W)." + +#: dcim/models/device_component_templates.py:321 +#: dcim/models/device_components.py:478 +msgid "feed leg" +msgstr "perna de alimentação" + +#: dcim/models/device_component_templates.py:325 +#: dcim/models/device_components.py:482 +msgid "Phase (for three-phase feeds)" +msgstr "Fase (para alimentações trifásicas)" + +#: dcim/models/device_component_templates.py:331 +msgid "power outlet template" +msgstr "modelo de tomada elétrica" + +#: dcim/models/device_component_templates.py:332 +msgid "power outlet templates" +msgstr "modelos de tomadas elétricas" + +#: dcim/models/device_component_templates.py:341 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device type" +msgstr "" +"Porta de alimentação principal ({power_port}) devem pertencer ao mesmo tipo " +"de dispositivo" + +#: dcim/models/device_component_templates.py:345 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same module type" +msgstr "" +"Porta de alimentação principal ({power_port}) devem pertencer ao mesmo tipo " +"de módulo" + +#: dcim/models/device_component_templates.py:397 +#: dcim/models/device_components.py:612 +msgid "management only" +msgstr "somente gerenciamento" + +#: dcim/models/device_component_templates.py:405 +#: dcim/models/device_components.py:551 +msgid "bridge interface" +msgstr "interface de ponte" + +#: dcim/models/device_component_templates.py:423 +#: dcim/models/device_components.py:637 +msgid "wireless role" +msgstr "função sem fio" + +#: dcim/models/device_component_templates.py:429 +msgid "interface template" +msgstr "modelo de interface" + +#: dcim/models/device_component_templates.py:430 +msgid "interface templates" +msgstr "modelos de interface" + +#: dcim/models/device_component_templates.py:437 +#: dcim/models/device_components.py:805 +#: virtualization/models/virtualmachines.py:398 +msgid "An interface cannot be bridged to itself." +msgstr "Uma interface não pode ser conectada a si mesma." + +#: dcim/models/device_component_templates.py:440 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same device type" +msgstr "" +"Interface de ponte ({bridge}) devem pertencer ao mesmo tipo de dispositivo" + +#: dcim/models/device_component_templates.py:444 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same module type" +msgstr "Interface de ponte ({bridge}) devem pertencer ao mesmo tipo de módulo" + +#: dcim/models/device_component_templates.py:500 +#: dcim/models/device_components.py:985 +msgid "rear port position" +msgstr "posição da porta traseira" + +#: dcim/models/device_component_templates.py:525 +msgid "front port template" +msgstr "modelo de porta frontal" + +#: dcim/models/device_component_templates.py:526 +msgid "front port templates" +msgstr "modelos de porta frontal" + +#: dcim/models/device_component_templates.py:536 +#, python-brace-format +msgid "Rear port ({name}) must belong to the same device type" +msgstr "Porta traseira ({name}) devem pertencer ao mesmo tipo de dispositivo" + +#: dcim/models/device_component_templates.py:542 +#, python-brace-format +msgid "" +"Invalid rear port position ({position}); rear port {name} has only {count} " +"positions" +msgstr "" +"Posição inválida da porta traseira ({position}); porta traseira {name} tem " +"apenas {count} posições" + +#: dcim/models/device_component_templates.py:595 +#: dcim/models/device_components.py:1054 +msgid "positions" +msgstr "posições" + +#: dcim/models/device_component_templates.py:606 +msgid "rear port template" +msgstr "modelo de porta traseira" + +#: dcim/models/device_component_templates.py:607 +msgid "rear port templates" +msgstr "modelos de porta traseira" + +#: dcim/models/device_component_templates.py:636 +#: dcim/models/device_components.py:1095 +msgid "position" +msgstr "posição" + +#: dcim/models/device_component_templates.py:639 +#: dcim/models/device_components.py:1098 +msgid "Identifier to reference when renaming installed components" +msgstr "Identificador a ser referenciado ao renomear componentes instalados" + +#: dcim/models/device_component_templates.py:645 +msgid "module bay template" +msgstr "modelo de compartimento de módulo" + +#: dcim/models/device_component_templates.py:646 +msgid "module bay templates" +msgstr "modelos de compartimento de módulos" + +#: dcim/models/device_component_templates.py:673 +msgid "device bay template" +msgstr "modelo de compartimento de dispositivos" + +#: dcim/models/device_component_templates.py:674 +msgid "device bay templates" +msgstr "modelos de compartimento de dispositivos" + +#: dcim/models/device_component_templates.py:687 +#, python-brace-format +msgid "" +"Subdevice role of device type ({device_type}) must be set to \"parent\" to " +"allow device bays." +msgstr "" +"Função do subdispositivo do tipo de dispositivo ({device_type}) deve ser " +"definido como “pai” para permitir compartimentos de dispositivos." + +#: dcim/models/device_component_templates.py:742 +#: dcim/models/device_components.py:1224 +msgid "part ID" +msgstr "ID da peça" + +#: dcim/models/device_component_templates.py:744 +#: dcim/models/device_components.py:1226 +msgid "Manufacturer-assigned part identifier" +msgstr "Identificador de peça atribuído pelo fabricante" + +#: dcim/models/device_component_templates.py:761 +msgid "inventory item template" +msgstr "modelo de item de inventário" + +#: dcim/models/device_component_templates.py:762 +msgid "inventory item templates" +msgstr "modelos de itens de inventário" + +#: dcim/models/device_components.py:106 +msgid "Components cannot be moved to a different device." +msgstr "Os componentes não podem ser movidos para um dispositivo diferente." + +#: dcim/models/device_components.py:145 +msgid "cable end" +msgstr "extremidade do cabo" + +#: dcim/models/device_components.py:151 +msgid "mark connected" +msgstr "marca conectada" + +#: dcim/models/device_components.py:153 +msgid "Treat as if a cable is connected" +msgstr "Trate como se um cabo estivesse conectado" + +#: dcim/models/device_components.py:171 +msgid "Must specify cable end (A or B) when attaching a cable." +msgstr "Deve especificar a extremidade do cabo (A ou B) ao conectar um cabo." + +#: dcim/models/device_components.py:175 +msgid "Cable end must not be set without a cable." +msgstr "A extremidade do cabo não deve ser ajustada sem um cabo." + +#: dcim/models/device_components.py:179 +msgid "Cannot mark as connected with a cable attached." +msgstr "Não é possível marcar como conectado com um cabo conectado." + +#: dcim/models/device_components.py:203 +#, python-brace-format +msgid "{class_name} models must declare a parent_object property" +msgstr "{class_name} os modelos devem declarar uma propriedade parent_object" + +#: dcim/models/device_components.py:288 dcim/models/device_components.py:317 +#: dcim/models/device_components.py:350 dcim/models/device_components.py:468 +msgid "Physical port type" +msgstr "Tipo de porta física" + +#: dcim/models/device_components.py:291 dcim/models/device_components.py:320 +msgid "speed" +msgstr "rapidez" + +#: dcim/models/device_components.py:295 dcim/models/device_components.py:324 +msgid "Port speed in bits per second" +msgstr "Velocidade da porta em bits por segundo" + +#: dcim/models/device_components.py:301 +msgid "console port" +msgstr "porta de console" + +#: dcim/models/device_components.py:302 +msgid "console ports" +msgstr "portas de console" + +#: dcim/models/device_components.py:330 +msgid "console server port" +msgstr "porta do servidor de console" + +#: dcim/models/device_components.py:331 +msgid "console server ports" +msgstr "portas do servidor de console" + +#: dcim/models/device_components.py:370 +msgid "power port" +msgstr "porta de alimentação" + +#: dcim/models/device_components.py:371 +msgid "power ports" +msgstr "portas de alimentação" + +#: dcim/models/device_components.py:488 +msgid "power outlet" +msgstr "tomada elétrica" + +#: dcim/models/device_components.py:489 +msgid "power outlets" +msgstr "tomadas elétricas" + +#: dcim/models/device_components.py:500 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device" +msgstr "" +"Porta de alimentação principal ({power_port}) devem pertencer ao mesmo " +"dispositivo" + +#: dcim/models/device_components.py:531 vpn/models/crypto.py:81 +#: vpn/models/crypto.py:214 +msgid "mode" +msgstr "modo" + +#: dcim/models/device_components.py:535 +msgid "IEEE 802.1Q tagging strategy" +msgstr "Estratégia de marcação IEEE 802.1Q" + +#: dcim/models/device_components.py:543 +msgid "parent interface" +msgstr "interface principal" + +#: dcim/models/device_components.py:603 +msgid "parent LAG" +msgstr "LAG principal" + +#: dcim/models/device_components.py:613 +msgid "This interface is used only for out-of-band management" +msgstr "Essa interface é usada somente para gerenciamento fora da banda" + +#: dcim/models/device_components.py:618 +msgid "speed (Kbps)" +msgstr "velocidade (Kbps)" + +#: dcim/models/device_components.py:621 +msgid "duplex" +msgstr "duplex" + +#: dcim/models/device_components.py:631 +msgid "64-bit World Wide Name" +msgstr "Nome mundial de 64 bits" + +#: dcim/models/device_components.py:643 +msgid "wireless channel" +msgstr "canal sem fio" + +#: dcim/models/device_components.py:650 +msgid "channel frequency (MHz)" +msgstr "frequência do canal (MHz)" + +#: dcim/models/device_components.py:651 dcim/models/device_components.py:659 +msgid "Populated by selected channel (if set)" +msgstr "Preenchido pelo canal selecionado (se definido)" + +#: dcim/models/device_components.py:665 +msgid "transmit power (dBm)" +msgstr "potência de transmissão (dBm)" + +#: dcim/models/device_components.py:690 wireless/models.py:116 +msgid "wireless LANs" +msgstr "LANs sem fio" + +#: dcim/models/device_components.py:698 +#: virtualization/models/virtualmachines.py:328 +msgid "untagged VLAN" +msgstr "VLAN sem etiqueta" + +#: dcim/models/device_components.py:704 +#: virtualization/models/virtualmachines.py:334 +msgid "tagged VLANs" +msgstr "VLANs marcadas" + +#: dcim/models/device_components.py:746 +#: virtualization/models/virtualmachines.py:370 +msgid "interface" +msgstr "interface" + +#: dcim/models/device_components.py:747 +#: virtualization/models/virtualmachines.py:371 +msgid "interfaces" +msgstr "interfaces" + +#: dcim/models/device_components.py:758 +#, python-brace-format +msgid "{display_type} interfaces cannot have a cable attached." +msgstr "{display_type} as interfaces não podem ter um cabo conectado." + +#: dcim/models/device_components.py:766 +#, python-brace-format +msgid "{display_type} interfaces cannot be marked as connected." +msgstr "{display_type} as interfaces não podem ser marcadas como conectadas." + +#: dcim/models/device_components.py:775 +#: virtualization/models/virtualmachines.py:383 +msgid "An interface cannot be its own parent." +msgstr "Uma interface não pode ser sua própria mãe." + +#: dcim/models/device_components.py:779 +msgid "Only virtual interfaces may be assigned to a parent interface." +msgstr "" +"Somente interfaces virtuais podem ser atribuídas a uma interface principal." + +#: dcim/models/device_components.py:786 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to a different device " +"({device})" +msgstr "" +"A interface principal selecionada ({interface}) pertence a um dispositivo " +"diferente ({device})" + +#: dcim/models/device_components.py:792 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" +"A interface principal selecionada ({interface}) pertence a {device}, que não" +" faz parte do chassi virtual {virtual_chassis}." + +#: dcim/models/device_components.py:812 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different device " +"({device})." +msgstr "" +"A interface de ponte selecionada ({bridge}) pertence a um dispositivo " +"diferente ({device})." + +#: dcim/models/device_components.py:818 +#, python-brace-format +msgid "" +"The selected bridge interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" +"A interface de ponte selecionada ({interface}) pertence a {device}, que não " +"faz parte do chassi virtual {virtual_chassis}." + +#: dcim/models/device_components.py:829 +msgid "Virtual interfaces cannot have a parent LAG interface." +msgstr "As interfaces virtuais não podem ter uma interface LAG principal." + +#: dcim/models/device_components.py:833 +msgid "A LAG interface cannot be its own parent." +msgstr "Uma interface LAG não pode ser sua própria mãe." + +#: dcim/models/device_components.py:840 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to a different device ({device})." +msgstr "" +"A interface LAG selecionada ({lag}) pertence a um dispositivo diferente " +"({device})." + +#: dcim/models/device_components.py:846 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to {device}, which is not part of" +" virtual chassis {virtual_chassis}." +msgstr "" +"A interface LAG selecionada ({lag}) pertence a {device}, que não faz parte " +"do chassi virtual {virtual_chassis}." + +#: dcim/models/device_components.py:857 +msgid "Virtual interfaces cannot have a PoE mode." +msgstr "As interfaces virtuais não podem ter um modo PoE." + +#: dcim/models/device_components.py:861 +msgid "Virtual interfaces cannot have a PoE type." +msgstr "As interfaces virtuais não podem ter um tipo PoE." + +#: dcim/models/device_components.py:867 +msgid "Must specify PoE mode when designating a PoE type." +msgstr "Deve especificar o modo PoE ao designar um tipo de PoE." + +#: dcim/models/device_components.py:874 +msgid "Wireless role may be set only on wireless interfaces." +msgstr "A função sem fio pode ser definida somente em interfaces sem fio." + +#: dcim/models/device_components.py:876 +msgid "Channel may be set only on wireless interfaces." +msgstr "O canal pode ser configurado somente em interfaces sem fio." + +#: dcim/models/device_components.py:882 +msgid "Channel frequency may be set only on wireless interfaces." +msgstr "" +"A frequência do canal pode ser definida somente em interfaces sem fio." + +#: dcim/models/device_components.py:886 +msgid "Cannot specify custom frequency with channel selected." +msgstr "" +"Não é possível especificar a frequência personalizada com o canal " +"selecionado." + +#: dcim/models/device_components.py:892 +msgid "Channel width may be set only on wireless interfaces." +msgstr "A largura do canal pode ser definida somente em interfaces sem fio." + +#: dcim/models/device_components.py:894 +msgid "Cannot specify custom width with channel selected." +msgstr "" +"Não é possível especificar a largura personalizada com o canal selecionado." + +#: dcim/models/device_components.py:902 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent device, or it must be global." +msgstr "" +"A VLAN não marcada ({untagged_vlan}) deve pertencer ao mesmo site do " +"dispositivo pai da interface ou deve ser global." + +#: dcim/models/device_components.py:991 +msgid "Mapped position on corresponding rear port" +msgstr "Posição mapeada na porta traseira correspondente" + +#: dcim/models/device_components.py:1007 +msgid "front port" +msgstr "porta frontal" + +#: dcim/models/device_components.py:1008 +msgid "front ports" +msgstr "portas frontais" + +#: dcim/models/device_components.py:1022 +#, python-brace-format +msgid "Rear port ({rear_port}) must belong to the same device" +msgstr "Porta traseira ({rear_port}) devem pertencer ao mesmo dispositivo" + +#: dcim/models/device_components.py:1030 +#, python-brace-format +msgid "" +"Invalid rear port position ({rear_port_position}): Rear port {name} has only" +" {positions} positions." +msgstr "" +"Posição inválida da porta traseira ({rear_port_position}): Porta traseira " +"{name} tem apenas {positions} posições." + +#: dcim/models/device_components.py:1060 +msgid "Number of front ports which may be mapped" +msgstr "Número de portas frontais que podem ser mapeadas" + +#: dcim/models/device_components.py:1065 +msgid "rear port" +msgstr "porta traseira" + +#: dcim/models/device_components.py:1066 +msgid "rear ports" +msgstr "portas traseiras" + +#: dcim/models/device_components.py:1080 +#, python-brace-format +msgid "" +"The number of positions cannot be less than the number of mapped front ports" +" ({frontport_count})" +msgstr "" +"O número de posições não pode ser menor que o número de portas frontais " +"mapeadas ({frontport_count})" + +#: dcim/models/device_components.py:1104 +msgid "module bay" +msgstr "compartimento de módulos" + +#: dcim/models/device_components.py:1105 +msgid "module bays" +msgstr "compartimentos de módulos" + +#: dcim/models/device_components.py:1118 +msgid "parent_bay" +msgstr "parent_bay" + +#: dcim/models/device_components.py:1126 +msgid "device bay" +msgstr "compartimento de dispositivos" + +#: dcim/models/device_components.py:1127 +msgid "device bays" +msgstr "compartimentos de dispositivos" + +#: dcim/models/device_components.py:1137 +#, python-brace-format +msgid "This type of device ({device_type}) does not support device bays." +msgstr "" +"Esse tipo de dispositivo ({device_type}) não suporta compartimentos de " +"dispositivos." + +#: dcim/models/device_components.py:1143 +msgid "Cannot install a device into itself." +msgstr "Não é possível instalar um dispositivo em si mesmo." + +#: dcim/models/device_components.py:1151 +#, python-brace-format +msgid "" +"Cannot install the specified device; device is already installed in {bay}." +msgstr "" +"Não é possível instalar o dispositivo especificado; o dispositivo já está " +"instalado no {bay}." + +#: dcim/models/device_components.py:1172 +msgid "inventory item role" +msgstr "função do item de inventário" + +#: dcim/models/device_components.py:1173 +msgid "inventory item roles" +msgstr "funções do item de inventário" + +#: dcim/models/device_components.py:1230 dcim/models/devices.py:595 +#: dcim/models/devices.py:1173 dcim/models/racks.py:113 +msgid "serial number" +msgstr "número de série" + +#: dcim/models/device_components.py:1238 dcim/models/devices.py:603 +#: dcim/models/devices.py:1180 dcim/models/racks.py:120 +msgid "asset tag" +msgstr "etiqueta de ativo" + +#: dcim/models/device_components.py:1239 +msgid "A unique tag used to identify this item" +msgstr "Uma tag exclusiva usada para identificar esse item" + +#: dcim/models/device_components.py:1242 +msgid "discovered" +msgstr "descoberto" + +#: dcim/models/device_components.py:1244 +msgid "This item was automatically discovered" +msgstr "Este item foi descoberto automaticamente" + +#: dcim/models/device_components.py:1262 +msgid "inventory item" +msgstr "item de inventário" + +#: dcim/models/device_components.py:1263 +msgid "inventory items" +msgstr "itens de inventário" + +#: dcim/models/device_components.py:1274 +msgid "Cannot assign self as parent." +msgstr "Não é possível designar a si mesmo como pai." + +#: dcim/models/device_components.py:1282 +msgid "Parent inventory item does not belong to the same device." +msgstr "O item do inventário principal não pertence ao mesmo dispositivo." + +#: dcim/models/device_components.py:1288 +msgid "Cannot move an inventory item with dependent children" +msgstr "Não é possível mover um item de inventário com filhos dependentes" + +#: dcim/models/device_components.py:1296 +msgid "Cannot assign inventory item to component on another device" +msgstr "" +"Não é possível atribuir item de inventário ao componente em outro " +"dispositivo" + +#: dcim/models/devices.py:54 +msgid "manufacturer" +msgstr "fabricante" + +#: dcim/models/devices.py:55 +msgid "manufacturers" +msgstr "fabricantes" + +#: dcim/models/devices.py:82 dcim/models/devices.py:381 +msgid "model" +msgstr "modelo" + +#: dcim/models/devices.py:95 +msgid "default platform" +msgstr "plataforma padrão" + +#: dcim/models/devices.py:98 dcim/models/devices.py:385 +msgid "part number" +msgstr "número da peça" + +#: dcim/models/devices.py:101 dcim/models/devices.py:388 +msgid "Discrete part number (optional)" +msgstr "Número de peça discreto (opcional)" + +#: dcim/models/devices.py:107 dcim/models/racks.py:137 +msgid "height (U)" +msgstr "altura (U)" + +#: dcim/models/devices.py:111 +msgid "exclude from utilization" +msgstr "excluir da utilização" + +#: dcim/models/devices.py:112 +msgid "Devices of this type are excluded when calculating rack utilization." +msgstr "" +"Dispositivos desse tipo são excluídos ao calcular a utilização do rack." + +#: dcim/models/devices.py:116 +msgid "is full depth" +msgstr "é profundidade total" + +#: dcim/models/devices.py:117 +msgid "Device consumes both front and rear rack faces." +msgstr "O dispositivo consome as faces frontal e traseira do rack." + +#: dcim/models/devices.py:123 +msgid "parent/child status" +msgstr "status de pai/filho" + +#: dcim/models/devices.py:124 +msgid "" +"Parent devices house child devices in device bays. Leave blank if this " +"device type is neither a parent nor a child." +msgstr "" +"Os dispositivos parentais abrigam dispositivos infantis em compartimentos de" +" dispositivos. Deixe em branco se esse tipo de dispositivo não for pai nem " +"filho." + +#: dcim/models/devices.py:128 dcim/models/devices.py:647 +msgid "airflow" +msgstr "fluxo de ar" + +#: dcim/models/devices.py:204 +msgid "device type" +msgstr "tipo de dispositivo" + +#: dcim/models/devices.py:205 +msgid "device types" +msgstr "tipos de dispositivos" + +#: dcim/models/devices.py:289 +msgid "U height must be in increments of 0.5 rack units." +msgstr "A altura U deve estar em incrementos de 0,5 unidades de rack." + +#: dcim/models/devices.py:306 +#, python-brace-format +msgid "" +"Device {device} in rack {rack} does not have sufficient space to accommodate" +" a height of {height}U" +msgstr "" +"Dispositivo {device} na prateleira {rack} não tem espaço suficiente para " +"acomodar uma altura de {height}U" + +#: dcim/models/devices.py:321 +#, python-brace-format +msgid "" +"Unable to set 0U height: Found {racked_instance_count} " +"instances already mounted within racks." +msgstr "" +"Não é possível definir a altura de 0U: encontrado {racked_instance_count} instâncias já montado dentro de " +"racks." + +#: dcim/models/devices.py:330 +msgid "" +"Must delete all device bay templates associated with this device before " +"declassifying it as a parent device." +msgstr "" +"É necessário excluir todos os modelos de compartimento de dispositivos " +"associados a esse dispositivo antes de desclassificá-lo como dispositivo " +"principal." + +#: dcim/models/devices.py:336 +msgid "Child device types must be 0U." +msgstr "Os tipos de dispositivos infantis devem ser 0U." + +#: dcim/models/devices.py:404 +msgid "module type" +msgstr "tipo de módulo" + +#: dcim/models/devices.py:405 +msgid "module types" +msgstr "tipos de módulo" + +#: dcim/models/devices.py:473 +msgid "Virtual machines may be assigned to this role" +msgstr "Máquinas virtuais podem ser atribuídas a essa função" + +#: dcim/models/devices.py:485 +msgid "device role" +msgstr "função do dispositivo" + +#: dcim/models/devices.py:486 +msgid "device roles" +msgstr "funções do dispositivo" + +#: dcim/models/devices.py:503 +msgid "Optionally limit this platform to devices of a certain manufacturer" +msgstr "" +"Opcionalmente, limite essa plataforma a dispositivos de um determinado " +"fabricante" + +#: dcim/models/devices.py:515 +msgid "platform" +msgstr "plataforma" + +#: dcim/models/devices.py:516 +msgid "platforms" +msgstr "plataformas" + +#: dcim/models/devices.py:564 +msgid "The function this device serves" +msgstr "A função que este dispositivo serve" + +#: dcim/models/devices.py:596 +msgid "Chassis serial number, assigned by the manufacturer" +msgstr "Número de série do chassi, atribuído pelo fabricante" + +#: dcim/models/devices.py:604 dcim/models/devices.py:1181 +msgid "A unique tag used to identify this device" +msgstr "Uma tag exclusiva usada para identificar esse dispositivo" + +#: dcim/models/devices.py:631 +msgid "position (U)" +msgstr "posição (U)" + +#: dcim/models/devices.py:638 +msgid "rack face" +msgstr "face de cremalheira" + +#: dcim/models/devices.py:658 dcim/models/devices.py:1390 +#: virtualization/models/virtualmachines.py:98 +msgid "primary IPv4" +msgstr "IPv4 primário" + +#: dcim/models/devices.py:666 dcim/models/devices.py:1398 +#: virtualization/models/virtualmachines.py:106 +msgid "primary IPv6" +msgstr "IPv6 primário" + +#: dcim/models/devices.py:674 +msgid "out-of-band IP" +msgstr "IP fora de banda" + +#: dcim/models/devices.py:691 +msgid "VC position" +msgstr "Posição VC" + +#: dcim/models/devices.py:695 +msgid "Virtual chassis position" +msgstr "Posição do chassi virtual" + +#: dcim/models/devices.py:698 +msgid "VC priority" +msgstr "Prioridade VC" + +#: dcim/models/devices.py:702 +msgid "Virtual chassis master election priority" +msgstr "Prioridade de eleição do mestre do chassi virtual" + +#: dcim/models/devices.py:705 dcim/models/sites.py:207 +msgid "latitude" +msgstr "latitude" + +#: dcim/models/devices.py:710 dcim/models/devices.py:718 +#: dcim/models/sites.py:212 dcim/models/sites.py:220 +msgid "GPS coordinate in decimal format (xx.yyyyyy)" +msgstr "Coordenada GPS em formato decimal (xx.yyyyyy)" + +#: dcim/models/devices.py:713 dcim/models/sites.py:215 +msgid "longitude" +msgstr "longitude" + +#: dcim/models/devices.py:786 +msgid "Device name must be unique per site." +msgstr "O nome do dispositivo deve ser exclusivo por site." + +#: dcim/models/devices.py:797 ipam/models/services.py:75 +msgid "device" +msgstr "dispositivo" + +#: dcim/models/devices.py:798 +msgid "devices" +msgstr "dispositivos" + +#: dcim/models/devices.py:838 +#, python-brace-format +msgid "Rack {rack} does not belong to site {site}." +msgstr "Rack {rack} não pertence ao site {site}." + +#: dcim/models/devices.py:843 +#, python-brace-format +msgid "Location {location} does not belong to site {site}." +msgstr "Localização {location} não pertence ao site {site}." + +#: dcim/models/devices.py:849 +#, python-brace-format +msgid "Rack {rack} does not belong to location {location}." +msgstr "Rack {rack} não pertence à localização {location}." + +#: dcim/models/devices.py:856 +msgid "Cannot select a rack face without assigning a rack." +msgstr "Não é possível selecionar uma face de rack sem atribuir um rack." + +#: dcim/models/devices.py:860 +msgid "Cannot select a rack position without assigning a rack." +msgstr "Não é possível selecionar uma posição de rack sem atribuir um rack." + +#: dcim/models/devices.py:866 +msgid "Position must be in increments of 0.5 rack units." +msgstr "A posição deve estar em incrementos de 0,5 unidades de rack." + +#: dcim/models/devices.py:870 +msgid "Must specify rack face when defining rack position." +msgstr "Deve especificar a face do rack ao definir a posição do rack." + +#: dcim/models/devices.py:878 +#, python-brace-format +msgid "" +"A U0 device type ({device_type}) cannot be assigned to a rack position." +msgstr "" +"Um tipo de dispositivo U0 ({device_type}) não pode ser atribuído a uma " +"posição de rack." + +#: dcim/models/devices.py:889 +msgid "" +"Child device types cannot be assigned to a rack face. This is an attribute " +"of the parent device." +msgstr "" +"Os tipos de dispositivos secundários não podem ser atribuídos a uma face de " +"rack. Esse é um atributo do dispositivo principal." + +#: dcim/models/devices.py:896 +msgid "" +"Child device types cannot be assigned to a rack position. This is an " +"attribute of the parent device." +msgstr "" +"Os tipos de dispositivos infantis não podem ser atribuídos a uma posição de " +"rack. Esse é um atributo do dispositivo principal." + +#: dcim/models/devices.py:910 +#, python-brace-format +msgid "" +"U{position} is already occupied or does not have sufficient space to " +"accommodate this device type: {device_type} ({u_height}U)" +msgstr "" +"U{position} já está ocupado ou não tem espaço suficiente para acomodar este " +"tipo de dispositivo: {device_type} ({u_height}U)" + +#: dcim/models/devices.py:925 +#, python-brace-format +msgid "{ip} is not an IPv4 address." +msgstr "{ip} não é um endereço IPv4." + +#: dcim/models/devices.py:934 dcim/models/devices.py:949 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this device." +msgstr "" +"O endereço IP especificado ({ip}) não está atribuído a este dispositivo." + +#: dcim/models/devices.py:940 +#, python-brace-format +msgid "{ip} is not an IPv6 address." +msgstr "{ip} não é um endereço IPv6." + +#: dcim/models/devices.py:967 +#, python-brace-format +msgid "" +"The assigned platform is limited to {platform_manufacturer} device types, " +"but this device's type belongs to {devicetype_manufacturer}." +msgstr "" +"A plataforma atribuída está limitada a {platform_manufacturer} tipos de " +"dispositivo, mas o tipo desse dispositivo pertence a " +"{devicetype_manufacturer}." + +#: dcim/models/devices.py:978 +#, python-brace-format +msgid "The assigned cluster belongs to a different site ({site})" +msgstr "O cluster atribuído pertence a um site diferente ({site})" + +#: dcim/models/devices.py:986 +msgid "A device assigned to a virtual chassis must have its position defined." +msgstr "" +"Um dispositivo atribuído a um chassi virtual deve ter sua posição definida." + +#: dcim/models/devices.py:1188 +msgid "module" +msgstr "módulo" + +#: dcim/models/devices.py:1189 +msgid "modules" +msgstr "módulos" + +#: dcim/models/devices.py:1205 +#, python-brace-format +msgid "" +"Module must be installed within a module bay belonging to the assigned " +"device ({device})." +msgstr "" +"O módulo deve ser instalado dentro de um compartimento de módulo pertencente" +" ao dispositivo atribuído ({device})." + +#: dcim/models/devices.py:1309 +msgid "domain" +msgstr "dominar" + +#: dcim/models/devices.py:1322 dcim/models/devices.py:1323 +msgid "virtual chassis" +msgstr "chassi virtual" + +#: dcim/models/devices.py:1338 +#, python-brace-format +msgid "" +"The selected master ({master}) is not assigned to this virtual chassis." +msgstr "" +"O mestre selecionado ({master}) não está atribuído a esse chassi virtual." + +#: dcim/models/devices.py:1354 +#, python-brace-format +msgid "" +"Unable to delete virtual chassis {self}. There are member interfaces which " +"form a cross-chassis LAG interfaces." +msgstr "" +"Não é possível excluir o chassi virtual {self}. Existem interfaces de " +"membros que formam interfaces LAG entre chassis." + +#: dcim/models/devices.py:1379 vpn/models/l2vpn.py:37 +msgid "identifier" +msgstr "identificador" + +#: dcim/models/devices.py:1380 +msgid "Numeric identifier unique to the parent device" +msgstr "Identificador numérico exclusivo para o dispositivo principal" + +#: dcim/models/devices.py:1408 extras/models/models.py:129 +#: extras/models/models.py:724 netbox/models/__init__.py:114 +msgid "comments" +msgstr "comentários" + +#: dcim/models/devices.py:1424 +msgid "virtual device context" +msgstr "contexto de dispositivo virtual" + +#: dcim/models/devices.py:1425 +msgid "virtual device contexts" +msgstr "contextos de dispositivos virtuais" + +#: dcim/models/devices.py:1457 +#, python-brace-format +msgid "{ip} is not an IPv{family} address." +msgstr "{ip} não é um IPv{family} endereço." + +#: dcim/models/devices.py:1463 +msgid "Primary IP address must belong to an interface on the assigned device." +msgstr "" +"O endereço IP principal deve pertencer a uma interface no dispositivo " +"atribuído." + +#: dcim/models/mixins.py:15 extras/models/configs.py:41 +#: extras/models/models.py:343 extras/models/models.py:552 +#: extras/models/search.py:50 ipam/models/ip.py:193 +msgid "weight" +msgstr "peso" + +#: dcim/models/mixins.py:22 +msgid "weight unit" +msgstr "unidade de peso" + +#: dcim/models/mixins.py:51 +msgid "Must specify a unit when setting a weight" +msgstr "Deve especificar uma unidade ao definir um peso" + +#: dcim/models/power.py:55 +msgid "power panel" +msgstr "painel de alimentação" + +#: dcim/models/power.py:56 +msgid "power panels" +msgstr "painéis de energia" + +#: dcim/models/power.py:70 +#, python-brace-format +msgid "" +"Location {location} ({location_site}) is in a different site than {site}" +msgstr "" +"Localização {location} ({location_site}) está em um site diferente do {site}" + +#: dcim/models/power.py:107 +msgid "supply" +msgstr "fornecem" + +#: dcim/models/power.py:113 +msgid "phase" +msgstr "estágio" + +#: dcim/models/power.py:119 +msgid "voltage" +msgstr "voltagem" + +#: dcim/models/power.py:124 +msgid "amperage" +msgstr "amperagem" + +#: dcim/models/power.py:129 +msgid "max utilization" +msgstr "utilização máxima" + +#: dcim/models/power.py:132 +msgid "Maximum permissible draw (percentage)" +msgstr "Sorteio máximo permitido (porcentagem)" + +#: dcim/models/power.py:135 +msgid "available power" +msgstr "potência disponível" + +#: dcim/models/power.py:163 +msgid "power feed" +msgstr "alimentação de energia" + +#: dcim/models/power.py:164 +msgid "power feeds" +msgstr "alimentações de energia" + +#: dcim/models/power.py:178 +#, python-brace-format +msgid "" +"Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " +"are in different sites." +msgstr "" +"Rack {rack} ({rack_site}) e painel de alimentação {powerpanel} " +"({powerpanel_site}) estão em sites diferentes." + +#: dcim/models/power.py:189 +msgid "Voltage cannot be negative for AC supply" +msgstr "A tensão não pode ser negativa para a alimentação CA" + +#: dcim/models/racks.py:49 +msgid "rack role" +msgstr "papel de rack" + +#: dcim/models/racks.py:50 +msgid "rack roles" +msgstr "funções de rack" + +#: dcim/models/racks.py:74 +msgid "facility ID" +msgstr "ID da instalação" + +#: dcim/models/racks.py:75 +msgid "Locally-assigned identifier" +msgstr "Identificador atribuído localmente" + +#: dcim/models/racks.py:108 ipam/forms/bulk_import.py:200 +#: ipam/forms/bulk_import.py:265 ipam/forms/bulk_import.py:300 +#: ipam/forms/bulk_import.py:467 virtualization/forms/bulk_import.py:112 +msgid "Functional role" +msgstr "Papel funcional" + +#: dcim/models/racks.py:121 +msgid "A unique tag used to identify this rack" +msgstr "Uma etiqueta exclusiva usada para identificar esse rack" + +#: dcim/models/racks.py:132 +msgid "width" +msgstr "largura" + +#: dcim/models/racks.py:133 +msgid "Rail-to-rail width" +msgstr "Largura de trilho a trilho" + +#: dcim/models/racks.py:139 +msgid "Height in rack units" +msgstr "Altura em unidades de rack" + +#: dcim/models/racks.py:143 +msgid "starting unit" +msgstr "unidade inicial" + +#: dcim/models/racks.py:145 +msgid "Starting unit for rack" +msgstr "Unidade inicial para rack" + +#: dcim/models/racks.py:149 +msgid "descending units" +msgstr "unidades descendentes" + +#: dcim/models/racks.py:150 +msgid "Units are numbered top-to-bottom" +msgstr "As unidades são numeradas de cima para baixo" + +#: dcim/models/racks.py:153 +msgid "outer width" +msgstr "largura externa" + +#: dcim/models/racks.py:156 +msgid "Outer dimension of rack (width)" +msgstr "Dimensão externa do rack (largura)" + +#: dcim/models/racks.py:159 +msgid "outer depth" +msgstr "profundidade externa" + +#: dcim/models/racks.py:162 +msgid "Outer dimension of rack (depth)" +msgstr "Dimensão externa do rack (profundidade)" + +#: dcim/models/racks.py:165 +msgid "outer unit" +msgstr "unidade externa" + +#: dcim/models/racks.py:171 +msgid "max weight" +msgstr "peso máximo" + +#: dcim/models/racks.py:174 +msgid "Maximum load capacity for the rack" +msgstr "Capacidade máxima de carga para o rack" + +#: dcim/models/racks.py:182 +msgid "mounting depth" +msgstr "profundidade de montagem" + +#: dcim/models/racks.py:186 +msgid "" +"Maximum depth of a mounted device, in millimeters. For four-post racks, this" +" is the distance between the front and rear rails." +msgstr "" +"Profundidade máxima de um dispositivo montado, em milímetros. Para racks de " +"quatro postes, essa é a distância entre os trilhos dianteiro e traseiro." + +#: dcim/models/racks.py:220 +msgid "rack" +msgstr "prateleira" + +#: dcim/models/racks.py:221 +msgid "racks" +msgstr "prateleiras" + +#: dcim/models/racks.py:236 +#, python-brace-format +msgid "Assigned location must belong to parent site ({site})." +msgstr "O local atribuído deve pertencer ao site principal ({site})." + +#: dcim/models/racks.py:240 +msgid "Must specify a unit when setting an outer width/depth" +msgstr "" +"Deve especificar uma unidade ao definir uma largura/profundidade externa" + +#: dcim/models/racks.py:244 +msgid "Must specify a unit when setting a maximum weight" +msgstr "Deve especificar uma unidade ao definir um peso máximo" + +#: dcim/models/racks.py:254 +#, python-brace-format +msgid "" +"Rack must be at least {min_height}U tall to house currently installed " +"devices." +msgstr "" +"O rack deve ter pelo menos {min_height}Eu ligo para a casa dos dispositivos " +"atualmente instalados." + +#: dcim/models/racks.py:261 +#, python-brace-format +msgid "" +"Rack unit numbering must begin at {position} or less to house currently " +"installed devices." +msgstr "" +"A numeração das unidades de rack deve começar em {position} ou menos para " +"abrigar dispositivos atualmente instalados." + +#: dcim/models/racks.py:269 +#, python-brace-format +msgid "Location must be from the same site, {site}." +msgstr "A localização deve ser do mesmo site, {site}." + +#: dcim/models/racks.py:522 +msgid "units" +msgstr "unidades" + +#: dcim/models/racks.py:548 +msgid "rack reservation" +msgstr "reserva de estantes" + +#: dcim/models/racks.py:549 +msgid "rack reservations" +msgstr "Reservas de rack" + +#: dcim/models/racks.py:566 +#, python-brace-format +msgid "Invalid unit(s) for {height}U rack: {unit_list}" +msgstr "Unidade (s) inválida (s) para {height}Rack U: {unit_list}" + +#: dcim/models/racks.py:579 +#, python-brace-format +msgid "The following units have already been reserved: {unit_list}" +msgstr "As seguintes unidades já foram reservadas: {unit_list}" + +#: dcim/models/sites.py:49 +msgid "A top-level region with this name already exists." +msgstr "Já existe uma região de nível superior com esse nome." + +#: dcim/models/sites.py:59 +msgid "A top-level region with this slug already exists." +msgstr "Já existe uma região de alto nível com essa lesma." + +#: dcim/models/sites.py:62 +msgid "region" +msgstr "região" + +#: dcim/models/sites.py:63 +msgid "regions" +msgstr "regiões" + +#: dcim/models/sites.py:102 +msgid "A top-level site group with this name already exists." +msgstr "Já existe um grupo de sites de nível superior com esse nome." + +#: dcim/models/sites.py:112 +msgid "A top-level site group with this slug already exists." +msgstr "Já existe um grupo de sites de alto nível com esse slug." + +#: dcim/models/sites.py:115 +msgid "site group" +msgstr "grupo de sites" + +#: dcim/models/sites.py:116 +msgid "site groups" +msgstr "grupos de sites" + +#: dcim/models/sites.py:141 +msgid "Full name of the site" +msgstr "Nome completo do site" + +#: dcim/models/sites.py:181 +msgid "facility" +msgstr "instalação" + +#: dcim/models/sites.py:184 +msgid "Local facility ID or description" +msgstr "ID ou descrição da instalação local" + +#: dcim/models/sites.py:195 +msgid "physical address" +msgstr "endereço físico" + +#: dcim/models/sites.py:198 +msgid "Physical location of the building" +msgstr "Localização física do edifício" + +#: dcim/models/sites.py:201 +msgid "shipping address" +msgstr "endereço de entrega" + +#: dcim/models/sites.py:204 +msgid "If different from the physical address" +msgstr "Se for diferente do endereço físico" + +#: dcim/models/sites.py:238 +msgid "site" +msgstr "local" + +#: dcim/models/sites.py:239 +msgid "sites" +msgstr "sites" + +#: dcim/models/sites.py:303 +msgid "A location with this name already exists within the specified site." +msgstr "Já existe um local com esse nome no site especificado." + +#: dcim/models/sites.py:313 +msgid "A location with this slug already exists within the specified site." +msgstr "Já existe um local com esse slug no site especificado." + +#: dcim/models/sites.py:316 +msgid "location" +msgstr "localização" + +#: dcim/models/sites.py:317 +msgid "locations" +msgstr "localizações" + +#: dcim/models/sites.py:331 +#, python-brace-format +msgid "Parent location ({parent}) must belong to the same site ({site})." +msgstr "" +"Localização dos pais ({parent}) deve pertencer ao mesmo site ({site})." + +#: dcim/tables/cables.py:54 +msgid "Termination A" +msgstr "Rescisão A" + +#: dcim/tables/cables.py:59 +msgid "Termination B" +msgstr "Rescisão B" + +#: dcim/tables/cables.py:65 wireless/tables/wirelesslink.py:22 +msgid "Device A" +msgstr "Dispositivo A" + +#: dcim/tables/cables.py:71 wireless/tables/wirelesslink.py:31 +msgid "Device B" +msgstr "Dispositivo B" + +#: dcim/tables/cables.py:77 +msgid "Location A" +msgstr "Localização A" + +#: dcim/tables/cables.py:83 +msgid "Location B" +msgstr "Localização B" + +#: dcim/tables/cables.py:89 +msgid "Rack A" +msgstr "Prateleira A" + +#: dcim/tables/cables.py:95 +msgid "Rack B" +msgstr "Prateleira B" + +#: dcim/tables/cables.py:101 +msgid "Site A" +msgstr "Sítio A" + +#: dcim/tables/cables.py:107 +msgid "Site B" +msgstr "Sítio B" + +#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:18 +#: templates/dcim/consoleserverport.html:75 templates/dcim/frontport.html:119 +#: templates/dcim/inventoryitem_edit.html:39 +msgid "Console Port" +msgstr "Porta de console" + +#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 +#: dcim/tables/connections.py:71 +#: templates/dcim/inc/connection_endpoints.html:16 +msgid "Reachable" +msgstr "Acessível" + +#: dcim/tables/connections.py:46 dcim/tables/devices.py:524 +#: templates/dcim/inventoryitem_edit.html:64 +#: templates/dcim/poweroutlet.html:47 templates/dcim/powerport.html:18 +msgid "Power Port" +msgstr "Porta de alimentação" + +#: dcim/tables/devices.py:94 dcim/tables/devices.py:139 +#: dcim/tables/racks.py:81 dcim/tables/sites.py:143 +#: netbox/navigation/menu.py:57 netbox/navigation/menu.py:61 +#: netbox/navigation/menu.py:63 virtualization/forms/model_forms.py:125 +#: virtualization/tables/clusters.py:83 virtualization/views.py:211 +msgid "Devices" +msgstr "Dispositivos" + +#: dcim/tables/devices.py:99 dcim/tables/devices.py:144 +#: virtualization/tables/clusters.py:88 +msgid "VMs" +msgstr "VMs" + +#: dcim/tables/devices.py:133 dcim/tables/devices.py:245 +#: extras/forms/model_forms.py:506 templates/dcim/device.html:114 +#: templates/dcim/device/render_config.html:11 +#: templates/dcim/device/render_config.html:15 +#: templates/dcim/devicerole.html:47 templates/dcim/platform.html:44 +#: templates/extras/configtemplate.html:10 +#: templates/virtualization/virtualmachine.html:47 +#: templates/virtualization/virtualmachine/render_config.html:11 +#: templates/virtualization/virtualmachine/render_config.html:15 +#: virtualization/tables/virtualmachines.py:93 +msgid "Config Template" +msgstr "Modelo de configuração" + +#: dcim/tables/devices.py:216 dcim/tables/devices.py:1069 +#: ipam/forms/bulk_import.py:511 ipam/forms/model_forms.py:296 +#: ipam/tables/ip.py:352 ipam/tables/ip.py:418 ipam/tables/ip.py:441 +#: templates/ipam/ipaddress.html:12 templates/ipam/ipaddress_edit.html:14 +#: virtualization/tables/virtualmachines.py:81 +msgid "IP Address" +msgstr "Endereço IP" + +#: dcim/tables/devices.py:220 dcim/tables/devices.py:1073 +#: virtualization/tables/virtualmachines.py:72 +msgid "IPv4 Address" +msgstr "Endereço IPv4" + +#: dcim/tables/devices.py:224 dcim/tables/devices.py:1077 +#: virtualization/tables/virtualmachines.py:76 +msgid "IPv6 Address" +msgstr "Endereço IPv6" + +#: dcim/tables/devices.py:239 +msgid "VC Position" +msgstr "Posição VC" + +#: dcim/tables/devices.py:242 +msgid "VC Priority" +msgstr "Prioridade VC" + +#: dcim/tables/devices.py:249 templates/dcim/device_edit.html:38 +#: templates/dcim/devicebay_populate.html:16 +msgid "Parent Device" +msgstr "Dispositivo principal" + +#: dcim/tables/devices.py:254 +msgid "Position (Device Bay)" +msgstr "Posição (compartimento do dispositivo)" + +#: dcim/tables/devices.py:263 +msgid "Console ports" +msgstr "Portas de console" + +#: dcim/tables/devices.py:266 +msgid "Console server ports" +msgstr "Portas do servidor de console" + +#: dcim/tables/devices.py:269 +msgid "Power ports" +msgstr "Portas de alimentação" + +#: dcim/tables/devices.py:272 +msgid "Power outlets" +msgstr "Tomadas elétricas" + +#: dcim/tables/devices.py:275 dcim/tables/devices.py:1082 +#: dcim/tables/devicetypes.py:125 dcim/views.py:1002 dcim/views.py:1241 +#: dcim/views.py:1927 netbox/navigation/menu.py:82 +#: netbox/navigation/menu.py:238 templates/dcim/device/base.html:37 +#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 +#: templates/dcim/module.html:34 templates/dcim/moduletype/base.html:34 +#: templates/dcim/virtualdevicecontext.html:64 +#: templates/dcim/virtualdevicecontext.html:85 +#: templates/virtualization/virtualmachine/base.html:27 +#: templates/virtualization/virtualmachine_list.html:14 +#: virtualization/tables/virtualmachines.py:87 virtualization/views.py:368 +#: wireless/tables/wirelesslan.py:55 +msgid "Interfaces" +msgstr "Interfaces" + +#: dcim/tables/devices.py:278 +msgid "Front ports" +msgstr "Portas frontais" + +#: dcim/tables/devices.py:284 +msgid "Device bays" +msgstr "Compartimentos para dispositivos" + +#: dcim/tables/devices.py:287 +msgid "Module bays" +msgstr "Compartimentos de módulos" + +#: dcim/tables/devices.py:290 +msgid "Inventory items" +msgstr "Itens de inventário" + +#: dcim/tables/devices.py:329 dcim/tables/modules.py:56 +#: templates/dcim/modulebay.html:17 +msgid "Module Bay" +msgstr "Compartimento do módulo" + +#: dcim/tables/devices.py:350 +msgid "Cable Color" +msgstr "Cor do cabo" + +#: dcim/tables/devices.py:356 +msgid "Link Peers" +msgstr "Vincular pares" + +#: dcim/tables/devices.py:359 +msgid "Mark Connected" +msgstr "Marcar Conectado" + +#: dcim/tables/devices.py:470 +msgid "Maximum draw (W)" +msgstr "Consumo máximo (W)" + +#: dcim/tables/devices.py:473 +msgid "Allocated draw (W)" +msgstr "Sorteio alocado (W)" + +#: dcim/tables/devices.py:573 ipam/forms/model_forms.py:707 +#: ipam/tables/fhrp.py:28 ipam/views.py:597 ipam/views.py:671 +#: netbox/navigation/menu.py:146 netbox/navigation/menu.py:148 +#: templates/dcim/interface.html:351 templates/ipam/ipaddress_bulk_add.html:15 +#: templates/ipam/service.html:43 templates/virtualization/vminterface.html:88 +#: vpn/tables/tunnels.py:94 +msgid "IP Addresses" +msgstr "Endereços IP" + +#: dcim/tables/devices.py:579 netbox/navigation/menu.py:190 +#: templates/ipam/inc/panels/fhrp_groups.html:5 +msgid "FHRP Groups" +msgstr "Grupos FHRP" + +#: dcim/tables/devices.py:591 templates/dcim/interface.html:90 +#: templates/virtualization/vminterface.html:70 templates/vpn/tunnel.html:18 +#: templates/vpn/tunneltermination.html:14 vpn/forms/bulk_edit.py:75 +#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:41 +#: vpn/forms/filtersets.py:81 vpn/forms/model_forms.py:59 +#: vpn/forms/model_forms.py:144 vpn/tables/tunnels.py:74 +msgid "Tunnel" +msgstr "Túnel" + +#: dcim/tables/devices.py:616 dcim/tables/devicetypes.py:224 +#: templates/dcim/interface.html:66 +msgid "Management Only" +msgstr "Somente gerenciamento" + +#: dcim/tables/devices.py:624 +msgid "Wireless link" +msgstr "Link sem fio" + +#: dcim/tables/devices.py:634 +msgid "VDCs" +msgstr "VDCs" + +#: dcim/tables/devices.py:642 dcim/tables/devicetypes.py:48 +#: dcim/tables/devicetypes.py:140 dcim/views.py:1077 dcim/views.py:2020 +#: netbox/navigation/menu.py:91 templates/dcim/device/base.html:52 +#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 +#: templates/dcim/inc/panels/inventory_items.html:5 +#: templates/dcim/inventoryitemrole.html:33 +msgid "Inventory Items" +msgstr "Itens de inventário" + +#: dcim/tables/devices.py:723 +#: templates/circuits/inc/circuit_termination.html:80 +#: templates/dcim/consoleport.html:81 templates/dcim/consoleserverport.html:81 +#: templates/dcim/frontport.html:53 templates/dcim/frontport.html:125 +#: templates/dcim/interface.html:196 templates/dcim/inventoryitem_edit.html:69 +#: templates/dcim/rearport.html:18 templates/dcim/rearport.html:115 +msgid "Rear Port" +msgstr "Porta traseira" + +#: dcim/tables/devices.py:888 templates/dcim/modulebay.html:51 +msgid "Installed Module" +msgstr "Módulo instalado" + +#: dcim/tables/devices.py:891 +msgid "Module Serial" +msgstr "Módulo serial" + +#: dcim/tables/devices.py:895 +msgid "Module Asset Tag" +msgstr "Etiqueta de ativo do módulo" + +#: dcim/tables/devices.py:904 +msgid "Module Status" +msgstr "Status do módulo" + +#: dcim/tables/devices.py:946 dcim/tables/devicetypes.py:308 +#: templates/dcim/inventoryitem.html:41 +msgid "Component" +msgstr "Parte" + +#: dcim/tables/devices.py:1001 +msgid "Items" +msgstr "Itens" + +#: dcim/tables/devicetypes.py:38 netbox/navigation/menu.py:72 +#: netbox/navigation/menu.py:74 +msgid "Device Types" +msgstr "Tipos de dispositivos" + +#: dcim/tables/devicetypes.py:43 netbox/navigation/menu.py:75 +msgid "Module Types" +msgstr "Tipos de módulo" + +#: dcim/tables/devicetypes.py:53 extras/forms/filtersets.py:379 +#: extras/forms/model_forms.py:414 netbox/navigation/menu.py:66 +msgid "Platforms" +msgstr "Plataformas" + +#: dcim/tables/devicetypes.py:85 templates/dcim/devicetype.html:32 +msgid "Default Platform" +msgstr "Plataforma padrão" + +#: dcim/tables/devicetypes.py:89 templates/dcim/devicetype.html:48 +msgid "Full Depth" +msgstr "Profundidade total" + +#: dcim/tables/devicetypes.py:98 +msgid "U Height" +msgstr "Altura U" + +#: dcim/tables/devicetypes.py:110 dcim/tables/modules.py:26 +msgid "Instances" +msgstr "Instâncias" + +#: dcim/tables/devicetypes.py:113 dcim/views.py:942 dcim/views.py:1181 +#: dcim/views.py:1867 netbox/navigation/menu.py:85 +#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 +#: templates/dcim/devicetype/base.html:22 templates/dcim/module.html:22 +#: templates/dcim/moduletype/base.html:22 +msgid "Console Ports" +msgstr "Portas de console" + +#: dcim/tables/devicetypes.py:116 dcim/views.py:957 dcim/views.py:1196 +#: dcim/views.py:1882 netbox/navigation/menu.py:86 +#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 +#: templates/dcim/devicetype/base.html:25 templates/dcim/module.html:25 +#: templates/dcim/moduletype/base.html:25 +msgid "Console Server Ports" +msgstr "Portas do servidor de console" + +#: dcim/tables/devicetypes.py:119 dcim/views.py:972 dcim/views.py:1211 +#: dcim/views.py:1897 netbox/navigation/menu.py:87 +#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 +#: templates/dcim/devicetype/base.html:28 templates/dcim/module.html:28 +#: templates/dcim/moduletype/base.html:28 +msgid "Power Ports" +msgstr "Portas de alimentação" + +#: dcim/tables/devicetypes.py:122 dcim/views.py:987 dcim/views.py:1226 +#: dcim/views.py:1912 netbox/navigation/menu.py:88 +#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 +#: templates/dcim/devicetype/base.html:31 templates/dcim/module.html:31 +#: templates/dcim/moduletype/base.html:31 +msgid "Power Outlets" +msgstr "Tomadas elétricas" + +#: dcim/tables/devicetypes.py:128 dcim/views.py:1017 dcim/views.py:1256 +#: dcim/views.py:1948 netbox/navigation/menu.py:83 +#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 +#: templates/dcim/module.html:37 templates/dcim/moduletype/base.html:37 +msgid "Front Ports" +msgstr "Portas frontais" + +#: dcim/tables/devicetypes.py:131 dcim/views.py:1032 dcim/views.py:1271 +#: dcim/views.py:1963 netbox/navigation/menu.py:84 +#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 +#: templates/dcim/devicetype/base.html:40 templates/dcim/module.html:40 +#: templates/dcim/moduletype/base.html:40 +msgid "Rear Ports" +msgstr "Portas traseiras" + +#: dcim/tables/devicetypes.py:134 dcim/views.py:1062 dcim/views.py:2001 +#: netbox/navigation/menu.py:90 templates/dcim/device/base.html:49 +#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +msgid "Device Bays" +msgstr "Compartimentos de dispositivos" + +#: dcim/tables/devicetypes.py:137 dcim/views.py:1047 dcim/views.py:1982 +#: netbox/navigation/menu.py:89 templates/dcim/device/base.html:46 +#: templates/dcim/device_list.html:64 templates/dcim/devicetype/base.html:43 +msgid "Module Bays" +msgstr "Compartimentos de módulos" + +#: dcim/tables/power.py:36 netbox/navigation/menu.py:282 +#: templates/core/configrevision.html:59 templates/dcim/powerpanel.html:53 +msgid "Power Feeds" +msgstr "Alimentações de energia" + +#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:106 +msgid "Max Utilization" +msgstr "Utilização máxima" + +#: dcim/tables/power.py:84 +msgid "Available Power (VA)" +msgstr "Potência disponível (VA)" + +#: dcim/tables/racks.py:29 dcim/tables/sites.py:138 +#: netbox/navigation/menu.py:25 netbox/navigation/menu.py:27 +msgid "Racks" +msgstr "Prateleiras" + +#: dcim/tables/racks.py:73 templates/dcim/device.html:323 +#: templates/dcim/rack.html:95 +msgid "Height" +msgstr "Altura" + +#: dcim/tables/racks.py:85 +msgid "Space" +msgstr "Espaço" + +#: dcim/tables/racks.py:96 templates/dcim/rack.html:105 +msgid "Outer Width" +msgstr "Largura externa" + +#: dcim/tables/racks.py:100 templates/dcim/rack.html:115 +msgid "Outer Depth" +msgstr "Profundidade externa" + +#: dcim/tables/racks.py:108 +msgid "Max Weight" +msgstr "Peso máximo" + +#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 +#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:394 +#: ipam/forms/bulk_edit.py:128 ipam/forms/model_forms.py:152 +#: ipam/tables/asn.py:66 netbox/navigation/menu.py:16 +#: netbox/navigation/menu.py:18 +msgid "Sites" +msgstr "Sites" + +#: dcim/views.py:131 +#, python-brace-format +msgid "Disconnected {count} {type}" +msgstr "Desconectado {count} {type}" + +#: dcim/views.py:692 netbox/navigation/menu.py:29 +msgid "Reservations" +msgstr "Reservas" + +#: dcim/views.py:711 +msgid "Non-Racked Devices" +msgstr "Dispositivos sem rack" + +#: dcim/views.py:2033 extras/forms/model_forms.py:454 +#: templates/extras/configcontext.html:10 +#: virtualization/forms/model_forms.py:228 virtualization/views.py:408 +msgid "Config Context" +msgstr "Contexto de configuração" + +#: dcim/views.py:2043 virtualization/views.py:418 +msgid "Render Config" +msgstr "Configuração de renderização" + +#: dcim/views.py:2971 ipam/tables/ip.py:233 +msgid "Children" +msgstr "Crianças" + +#: extras/choices.py:27 extras/forms/misc.py:14 +msgid "Text" +msgstr "Texto" + +#: extras/choices.py:28 +msgid "Text (long)" +msgstr "Texto (longo)" + +#: extras/choices.py:29 +msgid "Integer" +msgstr "Número inteiro" + +#: extras/choices.py:30 +msgid "Decimal" +msgstr "Decimal" + +#: extras/choices.py:31 +msgid "Boolean (true/false)" +msgstr "Boolean (verdadeiro/falso)" + +#: extras/choices.py:32 +msgid "Date" +msgstr "Encontro" + +#: extras/choices.py:33 +msgid "Date & time" +msgstr "Data e hora" + +#: extras/choices.py:35 +msgid "JSON" +msgstr "JSON" + +#: extras/choices.py:36 +msgid "Selection" +msgstr "Seleção" + +#: extras/choices.py:37 +msgid "Multiple selection" +msgstr "Seleção múltipla" + +#: extras/choices.py:39 +msgid "Multiple objects" +msgstr "Vários objetos" + +#: extras/choices.py:50 templates/extras/customfield.html:69 vpn/choices.py:20 +#: wireless/choices.py:27 +msgid "Disabled" +msgstr "Desativado" + +#: extras/choices.py:51 +msgid "Loose" +msgstr "Solto" + +#: extras/choices.py:52 +msgid "Exact" +msgstr "Exato" + +#: extras/choices.py:63 +msgid "Always" +msgstr "Sempre" + +#: extras/choices.py:64 +msgid "If set" +msgstr "Se definido" + +#: extras/choices.py:65 extras/choices.py:78 +msgid "Hidden" +msgstr "Escondido" + +#: extras/choices.py:76 +msgid "Yes" +msgstr "sim" + +#: extras/choices.py:77 +msgid "No" +msgstr "Não" + +#: extras/choices.py:105 templates/tenancy/contact.html:58 +#: tenancy/forms/bulk_edit.py:117 wireless/forms/model_forms.py:159 +msgid "Link" +msgstr "Link" + +#: extras/choices.py:119 +msgid "Newest" +msgstr "Mais recente" + +#: extras/choices.py:120 +msgid "Oldest" +msgstr "Mais antigo" + +#: extras/choices.py:136 templates/generic/object.html:51 +msgid "Updated" +msgstr "Atualizado" + +#: extras/choices.py:137 +msgid "Deleted" +msgstr "Excluído" + +#: extras/choices.py:154 extras/choices.py:176 +msgid "Info" +msgstr "Informações" + +#: extras/choices.py:155 extras/choices.py:175 +msgid "Success" +msgstr "Sucesso" + +#: extras/choices.py:156 extras/choices.py:177 +msgid "Warning" +msgstr "Aviso" + +#: extras/choices.py:157 +msgid "Danger" +msgstr "Perigo" + +#: extras/choices.py:174 utilities/choices.py:190 +msgid "Default" +msgstr "Padrão" + +#: extras/choices.py:178 +msgid "Failure" +msgstr "Falha" + +#: extras/choices.py:185 +msgid "Hourly" +msgstr "A cada hora" + +#: extras/choices.py:186 +msgid "12 hours" +msgstr "12 horas" + +#: extras/choices.py:187 +msgid "Daily" +msgstr "Diariamente" + +#: extras/choices.py:188 +msgid "Weekly" +msgstr "Semanalmente" + +#: extras/choices.py:189 +msgid "30 days" +msgstr "30 dias" + +#: extras/choices.py:254 extras/tables/tables.py:287 +#: templates/dcim/virtualchassis_edit.html:108 +#: templates/extras/eventrule.html:51 +#: templates/generic/bulk_add_component.html:56 +#: templates/generic/object_edit.html:29 templates/generic/object_edit.html:70 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +msgid "Create" +msgstr "Criar" + +#: extras/choices.py:255 extras/tables/tables.py:290 +#: templates/extras/eventrule.html:55 +msgid "Update" +msgstr "Atualizar" + +#: extras/choices.py:256 extras/tables/tables.py:293 +#: templates/circuits/inc/circuit_termination.html:22 +#: templates/dcim/devicetype/component_templates.html:24 +#: templates/dcim/inc/panels/inventory_items.html:29 +#: templates/dcim/moduletype/component_templates.html:24 +#: templates/dcim/powerpanel.html:71 templates/extras/eventrule.html:59 +#: templates/extras/report_list.html:34 templates/extras/script_list.html:33 +#: templates/generic/bulk_delete.html:18 templates/generic/bulk_delete.html:45 +#: templates/generic/object_delete.html:15 templates/htmx/delete_form.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:35 +#: templates/users/objectpermission.html:49 +#: utilities/templates/buttons/delete.html:9 +msgid "Delete" +msgstr "Excluir" + +#: extras/choices.py:280 utilities/choices.py:143 utilities/choices.py:191 +msgid "Blue" +msgstr "Azul" + +#: extras/choices.py:281 utilities/choices.py:142 utilities/choices.py:192 +msgid "Indigo" +msgstr "Índigo" + +#: extras/choices.py:282 utilities/choices.py:140 utilities/choices.py:193 +msgid "Purple" +msgstr "Roxa" + +#: extras/choices.py:283 utilities/choices.py:137 utilities/choices.py:194 +msgid "Pink" +msgstr "Rosa" + +#: extras/choices.py:284 utilities/choices.py:136 utilities/choices.py:195 +msgid "Red" +msgstr "Vermelho" + +#: extras/choices.py:285 utilities/choices.py:154 utilities/choices.py:196 +msgid "Orange" +msgstr "Alaranjado" + +#: extras/choices.py:286 utilities/choices.py:152 utilities/choices.py:197 +msgid "Yellow" +msgstr "Amarelo" + +#: extras/choices.py:287 utilities/choices.py:149 utilities/choices.py:198 +msgid "Green" +msgstr "Verde" + +#: extras/choices.py:288 utilities/choices.py:146 utilities/choices.py:199 +msgid "Teal" +msgstr "- Marinho" + +#: extras/choices.py:289 utilities/choices.py:145 utilities/choices.py:200 +msgid "Cyan" +msgstr "Ciano" + +#: extras/choices.py:290 utilities/choices.py:201 +msgid "Gray" +msgstr "Cinza" + +#: extras/choices.py:291 utilities/choices.py:160 utilities/choices.py:202 +msgid "Black" +msgstr "Preto" + +#: extras/choices.py:292 utilities/choices.py:161 utilities/choices.py:203 +msgid "White" +msgstr "Branco" + +#: extras/choices.py:306 extras/forms/model_forms.py:233 +#: extras/forms/model_forms.py:321 templates/extras/webhook.html:11 +msgid "Webhook" +msgstr "Webhook" + +#: extras/choices.py:307 templates/extras/script/base.html:29 +msgid "Script" +msgstr "Roteiro" + +#: extras/dashboard/forms.py:38 +msgid "Widget type" +msgstr "Tipo de widget" + +#: extras/dashboard/widgets.py:148 +msgid "Note" +msgstr "Nota" + +#: extras/dashboard/widgets.py:149 +msgid "Display some arbitrary custom content. Markdown is supported." +msgstr "" +"Exiba algum conteúdo personalizado arbitrário. O Markdown é suportado." + +#: extras/dashboard/widgets.py:162 +msgid "Object Counts" +msgstr "Contagens de objetos" + +#: extras/dashboard/widgets.py:163 +msgid "" +"Display a set of NetBox models and the number of objects created for each " +"type." +msgstr "" +"Exiba um conjunto de modelos NetBox e o número de objetos criados para cada " +"tipo." + +#: extras/dashboard/widgets.py:173 +msgid "Filters to apply when counting the number of objects" +msgstr "Filtros a serem aplicados ao contar o número de objetos" + +#: extras/dashboard/widgets.py:209 +msgid "Object List" +msgstr "Lista de objetos" + +#: extras/dashboard/widgets.py:210 +msgid "Display an arbitrary list of objects." +msgstr "Exiba uma lista arbitrária de objetos." + +#: extras/dashboard/widgets.py:223 +msgid "The default number of objects to display" +msgstr "O número padrão de objetos a serem exibidos" + +#: extras/dashboard/widgets.py:270 +msgid "RSS Feed" +msgstr "Feed RSS" + +#: extras/dashboard/widgets.py:275 +msgid "Embed an RSS feed from an external website." +msgstr "Incorpore um feed RSS de um site externo." + +#: extras/dashboard/widgets.py:282 +msgid "Feed URL" +msgstr "URL do feed" + +#: extras/dashboard/widgets.py:287 +msgid "The maximum number of objects to display" +msgstr "O número máximo de objetos a serem exibidos" + +#: extras/dashboard/widgets.py:292 +msgid "How long to stored the cached content (in seconds)" +msgstr "" +"Por quanto tempo o conteúdo em cache deve ser armazenado (em segundos)" + +#: extras/dashboard/widgets.py:344 templates/account/base.html:10 +#: templates/account/bookmarks.html:7 templates/inc/profile_button.html:29 +msgid "Bookmarks" +msgstr "Favoritos" + +#: extras/dashboard/widgets.py:348 +msgid "Show your personal bookmarks" +msgstr "Mostre seus favoritos pessoais" + +#: extras/filtersets.py:207 extras/filtersets.py:542 extras/filtersets.py:570 +msgid "Data file (ID)" +msgstr "Arquivo de dados (ID)" + +#: extras/filtersets.py:479 virtualization/forms/filtersets.py:114 +msgid "Cluster type" +msgstr "Tipo de cluster" + +#: extras/filtersets.py:485 virtualization/filtersets.py:95 +#: virtualization/filtersets.py:146 +msgid "Cluster type (slug)" +msgstr "Tipo de cluster (lesma)" + +#: extras/filtersets.py:490 ipam/forms/bulk_edit.py:475 +#: ipam/forms/model_forms.py:585 virtualization/forms/filtersets.py:108 +msgid "Cluster group" +msgstr "Grupo de clusters" + +#: extras/filtersets.py:496 virtualization/filtersets.py:135 +msgid "Cluster group (slug)" +msgstr "Grupo de clusters (lesma)" + +#: extras/filtersets.py:506 tenancy/forms/forms.py:16 +#: tenancy/forms/forms.py:39 +msgid "Tenant group" +msgstr "Grupo de inquilinos" + +#: extras/filtersets.py:512 tenancy/filtersets.py:163 +#: tenancy/filtersets.py:183 +msgid "Tenant group (slug)" +msgstr "Grupo de inquilinos (lesma)" + +#: extras/filtersets.py:528 templates/extras/tag.html:12 +msgid "Tag" +msgstr "Tag" + +#: extras/filtersets.py:534 +msgid "Tag (slug)" +msgstr "Tag (lesma)" + +#: extras/filtersets.py:594 extras/forms/filtersets.py:438 +msgid "Has local config context data" +msgstr "Tem dados de contexto de configuração local" + +#: extras/filtersets.py:619 +msgid "User name" +msgstr "Nome de usuário" + +#: extras/forms/bulk_edit.py:32 extras/forms/filtersets.py:56 +msgid "Group name" +msgstr "Nome do grupo" + +#: extras/forms/bulk_edit.py:40 extras/forms/filtersets.py:64 +#: extras/tables/tables.py:47 templates/extras/customfield.html:39 +#: templates/generic/bulk_import.html:116 +msgid "Required" +msgstr "Obrigatório" + +#: extras/forms/bulk_edit.py:53 extras/forms/bulk_import.py:57 +#: extras/forms/filtersets.py:78 extras/models/customfields.py:193 +msgid "UI visible" +msgstr "UI visível" + +#: extras/forms/bulk_edit.py:58 extras/forms/bulk_import.py:63 +#: extras/forms/filtersets.py:83 extras/models/customfields.py:200 +msgid "UI editable" +msgstr "UI editável" + +#: extras/forms/bulk_edit.py:63 extras/forms/filtersets.py:86 +msgid "Is cloneable" +msgstr "É clonável" + +#: extras/forms/bulk_edit.py:102 extras/forms/filtersets.py:126 +msgid "New window" +msgstr "Nova janela" + +#: extras/forms/bulk_edit.py:111 +msgid "Button class" +msgstr "Classe de botão" + +#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:164 +#: extras/models/models.py:439 +msgid "MIME type" +msgstr "Tipo MIME" + +#: extras/forms/bulk_edit.py:133 extras/forms/filtersets.py:167 +msgid "File extension" +msgstr "Extensão de arquivo" + +#: extras/forms/bulk_edit.py:138 extras/forms/filtersets.py:171 +msgid "As attachment" +msgstr "Como anexo" + +#: extras/forms/bulk_edit.py:166 extras/forms/filtersets.py:213 +#: extras/tables/tables.py:214 templates/extras/savedfilter.html:30 +msgid "Shared" +msgstr "Compartilhado" + +#: extras/forms/bulk_edit.py:189 extras/forms/filtersets.py:242 +#: extras/models/models.py:204 +msgid "HTTP method" +msgstr "Método HTTP" + +#: extras/forms/bulk_edit.py:193 extras/forms/filtersets.py:236 +#: templates/extras/webhook.html:37 +msgid "Payload URL" +msgstr "URL do payload" + +#: extras/forms/bulk_edit.py:198 extras/models/models.py:244 +msgid "SSL verification" +msgstr "Verificação SSL" + +#: extras/forms/bulk_edit.py:201 templates/extras/webhook.html:45 +msgid "Secret" +msgstr "Segredo" + +#: extras/forms/bulk_edit.py:206 +msgid "CA file path" +msgstr "Caminho do arquivo CA" + +#: extras/forms/bulk_edit.py:225 +msgid "On create" +msgstr "Ao criar" + +#: extras/forms/bulk_edit.py:230 +msgid "On update" +msgstr "Em atualização" + +#: extras/forms/bulk_edit.py:235 +msgid "On delete" +msgstr "Ao excluir" + +#: extras/forms/bulk_edit.py:240 +msgid "On job start" +msgstr "No início do trabalho" + +#: extras/forms/bulk_edit.py:245 +msgid "On job end" +msgstr "No final do trabalho" + +#: extras/forms/bulk_edit.py:282 +msgid "Is active" +msgstr "Está ativo" + +#: extras/forms/bulk_import.py:34 extras/forms/bulk_import.py:115 +#: extras/forms/bulk_import.py:130 extras/forms/bulk_import.py:153 +#: extras/forms/bulk_import.py:177 extras/forms/filtersets.py:114 +#: extras/forms/filtersets.py:160 extras/forms/filtersets.py:201 +#: extras/forms/model_forms.py:43 extras/forms/model_forms.py:127 +#: extras/forms/model_forms.py:154 extras/forms/model_forms.py:195 +#: extras/forms/model_forms.py:251 +msgid "Content types" +msgstr "Tipos de conteúdo" + +#: extras/forms/bulk_import.py:36 extras/forms/bulk_import.py:117 +#: extras/forms/bulk_import.py:132 extras/forms/bulk_import.py:155 +#: extras/forms/bulk_import.py:179 tenancy/forms/bulk_import.py:96 +msgid "One or more assigned object types" +msgstr "Um ou mais tipos de objetos atribuídos" + +#: extras/forms/bulk_import.py:41 +msgid "Field data type (e.g. text, integer, etc.)" +msgstr "Tipo de dados de campo (por exemplo, texto, número inteiro etc.)" + +#: extras/forms/bulk_import.py:44 extras/forms/filtersets.py:48 +#: extras/forms/filtersets.py:259 extras/forms/model_forms.py:47 +#: extras/forms/model_forms.py:221 tenancy/forms/filtersets.py:91 +msgid "Object type" +msgstr "Tipo de objeto" + +#: extras/forms/bulk_import.py:47 +msgid "Object type (for object or multi-object fields)" +msgstr "Tipo de objeto (para campos de objeto ou de vários objetos)" + +#: extras/forms/bulk_import.py:50 extras/forms/filtersets.py:73 +msgid "Choice set" +msgstr "Conjunto de opções" + +#: extras/forms/bulk_import.py:54 +msgid "Choice set (for selection fields)" +msgstr "Conjunto de opções (para campos de seleção)" + +#: extras/forms/bulk_import.py:60 +msgid "Whether the custom field is displayed in the UI" +msgstr "Se o campo personalizado é exibido na interface do usuário" + +#: extras/forms/bulk_import.py:66 +msgid "Whether the custom field is editable in the UI" +msgstr "Se o campo personalizado é editável na interface do usuário" + +#: extras/forms/bulk_import.py:82 +msgid "The base set of predefined choices to use (if any)" +msgstr "O conjunto básico de opções predefinidas a serem usadas (se houver)" + +#: extras/forms/bulk_import.py:88 +msgid "" +"Quoted string of comma-separated field choices with optional labels " +"separated by colon: \"choice1:First Choice,choice2:Second Choice\"" +msgstr "" +"Sequência entre aspas de opções de campo separadas por vírgula com rótulos " +"opcionais separados por dois pontos: “Choice1:First Choice, Choice2:Second " +"Choice”" + +#: extras/forms/bulk_import.py:182 +msgid "Action object" +msgstr "Objeto de ação" + +#: extras/forms/bulk_import.py:184 +msgid "Webhook name or script as dotted path module.Class" +msgstr "Nome do webhook ou script como caminho pontilhado module.Class" + +#: extras/forms/bulk_import.py:236 +msgid "Assigned object type" +msgstr "Tipo de objeto atribuído" + +#: extras/forms/bulk_import.py:241 +msgid "The classification of entry" +msgstr "A classificação da entrada" + +#: extras/forms/filtersets.py:53 +msgid "Field type" +msgstr "Tipo de campo" + +#: extras/forms/filtersets.py:97 extras/tables/tables.py:65 +#: templates/generic/bulk_import.html:148 +msgid "Choices" +msgstr "Escolhas" + +#: extras/forms/filtersets.py:141 extras/forms/filtersets.py:327 +#: extras/forms/filtersets.py:417 extras/forms/model_forms.py:449 +#: templates/core/job.html:86 templates/extras/configcontext.html:86 +#: templates/extras/eventrule.html:111 +msgid "Data" +msgstr "Dados" + +#: extras/forms/filtersets.py:152 extras/forms/filtersets.py:341 +#: extras/forms/filtersets.py:427 utilities/choices.py:219 +#: utilities/forms/bulk_import.py:27 +msgid "Data file" +msgstr "Arquivo de dados" + +#: extras/forms/filtersets.py:185 +msgid "Content type" +msgstr "Tipo de conteúdo" + +#: extras/forms/filtersets.py:232 extras/models/models.py:209 +msgid "HTTP content type" +msgstr "Tipo de conteúdo HTTP" + +#: extras/forms/filtersets.py:254 extras/forms/model_forms.py:269 +#: templates/extras/eventrule.html:46 +msgid "Events" +msgstr "Eventos" + +#: extras/forms/filtersets.py:264 +msgid "Action type" +msgstr "Tipo de ação" + +#: extras/forms/filtersets.py:278 +msgid "Object creations" +msgstr "Criações de objetos" + +#: extras/forms/filtersets.py:285 +msgid "Object updates" +msgstr "Atualizações de objetos" + +#: extras/forms/filtersets.py:292 +msgid "Object deletions" +msgstr "Exclusões de objetos" + +#: extras/forms/filtersets.py:299 +msgid "Job starts" +msgstr "Início do trabalho" + +#: extras/forms/filtersets.py:306 extras/forms/model_forms.py:289 +msgid "Job terminations" +msgstr "Rescisões de trabalho" + +#: extras/forms/filtersets.py:315 +msgid "Tagged object type" +msgstr "Tipo de objeto marcado" + +#: extras/forms/filtersets.py:320 +msgid "Allowed object type" +msgstr "Tipo de objeto permitido" + +#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:384 +#: netbox/navigation/menu.py:19 +msgid "Regions" +msgstr "Regiões" + +#: extras/forms/filtersets.py:354 extras/forms/model_forms.py:389 +msgid "Site groups" +msgstr "Grupos de sites" + +#: extras/forms/filtersets.py:364 extras/forms/model_forms.py:399 +#: netbox/navigation/menu.py:21 +msgid "Locations" +msgstr "Localizações" + +#: extras/forms/filtersets.py:369 extras/forms/model_forms.py:404 +msgid "Device types" +msgstr "Tipos de dispositivos" + +#: extras/forms/filtersets.py:374 extras/forms/model_forms.py:409 +msgid "Roles" +msgstr "Funções" + +#: extras/forms/filtersets.py:384 extras/forms/model_forms.py:419 +msgid "Cluster types" +msgstr "Tipos de cluster" + +#: extras/forms/filtersets.py:390 extras/forms/model_forms.py:424 +msgid "Cluster groups" +msgstr "Grupos de clusters" + +#: extras/forms/filtersets.py:395 extras/forms/model_forms.py:429 +#: netbox/navigation/menu.py:243 netbox/navigation/menu.py:245 +#: templates/virtualization/clustertype.html:33 +#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +msgid "Clusters" +msgstr "Clusters" + +#: extras/forms/filtersets.py:400 extras/forms/model_forms.py:434 +msgid "Tenant groups" +msgstr "Grupos de inquilinos" + +#: extras/forms/filtersets.py:454 extras/forms/filtersets.py:495 +msgid "After" +msgstr "Depois" + +#: extras/forms/filtersets.py:459 extras/forms/filtersets.py:500 +msgid "Before" +msgstr "Antes" + +#: extras/forms/filtersets.py:490 extras/tables/tables.py:426 +#: templates/extras/htmx/report_result.html:43 +#: templates/extras/objectchange.html:34 +msgid "Time" +msgstr "Tempo" + +#: extras/forms/filtersets.py:504 extras/forms/model_forms.py:271 +#: extras/tables/tables.py:440 templates/extras/eventrule.html:90 +#: templates/extras/objectchange.html:50 +msgid "Action" +msgstr "Ação" + +#: extras/forms/model_forms.py:50 +msgid "Type of the related object (for object/multi-object fields only)" +msgstr "" +"Tipo do objeto relacionado (somente para campos de objeto/vários objetos)" + +#: extras/forms/model_forms.py:58 templates/extras/customfield.html:11 +msgid "Custom Field" +msgstr "Campo personalizado" + +#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +msgid "Behavior" +msgstr "Comportamento" + +#: extras/forms/model_forms.py:62 +msgid "Values" +msgstr "Valores" + +#: extras/forms/model_forms.py:71 +msgid "" +"The type of data stored in this field. For object/multi-object fields, " +"select the related object type below." +msgstr "" +"O tipo de dados armazenados nesse campo. Para campos de objeto/multiobjeto, " +"selecione o tipo de objeto relacionado abaixo." + +#: extras/forms/model_forms.py:74 +msgid "" +"This will be displayed as help text for the form field. Markdown is " +"supported." +msgstr "" +"Isso será exibido como texto de ajuda para o campo do formulário. O Markdown" +" é suportado." + +#: extras/forms/model_forms.py:91 +msgid "" +"Enter one choice per line. An optional label may be specified for each " +"choice by appending it with a colon. Example:" +msgstr "" +"Insira uma opção por linha. Um rótulo opcional pode ser especificado para " +"cada opção anexando-o com dois pontos. Exemplo:" + +#: extras/forms/model_forms.py:132 templates/extras/customlink.html:10 +msgid "Custom Link" +msgstr "Link personalizado" + +#: extras/forms/model_forms.py:133 +msgid "Templates" +msgstr "Modelos" + +#: extras/forms/model_forms.py:145 +msgid "" +"Jinja2 template code for the link text. Reference the object as {{ " +"object }}. Links which render as empty text will not be displayed." +msgstr "" + +#: extras/forms/model_forms.py:148 +msgid "" +"Jinja2 template code for the link URL. Reference the object as {{ " +"object }}." +msgstr "" + +#: extras/forms/model_forms.py:158 extras/forms/model_forms.py:500 +msgid "Template code" +msgstr "Código do modelo" + +#: extras/forms/model_forms.py:164 templates/extras/exporttemplate.html:17 +msgid "Export Template" +msgstr "Modelo de exportação" + +#: extras/forms/model_forms.py:166 +msgid "Rendering" +msgstr "Renderização" + +#: extras/forms/model_forms.py:180 extras/forms/model_forms.py:525 +msgid "Template content is populated from the remote source selected below." +msgstr "" +"O conteúdo do modelo é preenchido a partir da fonte remota selecionada " +"abaixo." + +#: extras/forms/model_forms.py:187 extras/forms/model_forms.py:532 +msgid "Must specify either local content or a data file" +msgstr "Deve especificar o conteúdo local ou um arquivo de dados" + +#: extras/forms/model_forms.py:201 netbox/forms/mixins.py:68 +#: templates/extras/savedfilter.html:10 +msgid "Saved Filter" +msgstr "Filtro salvo" + +#: extras/forms/model_forms.py:234 templates/extras/webhook.html:28 +msgid "HTTP Request" +msgstr "Solicitação HTTP" + +#: extras/forms/model_forms.py:237 templates/extras/webhook.html:53 +msgid "SSL" +msgstr "SSL" + +#: extras/forms/model_forms.py:255 +msgid "Action choice" +msgstr "Escolha de ação" + +#: extras/forms/model_forms.py:260 +msgid "Enter conditions in JSON format." +msgstr "Insira as condições em JSON formato." + +#: extras/forms/model_forms.py:264 +msgid "" +"Enter parameters to pass to the action in JSON format." +msgstr "" +"Insira os parâmetros a serem passados para a ação em JSON formato." + +#: extras/forms/model_forms.py:268 templates/extras/eventrule.html:11 +msgid "Event Rule" +msgstr "Regra do evento" + +#: extras/forms/model_forms.py:270 templates/extras/eventrule.html:78 +msgid "Conditions" +msgstr "Condições" + +#: extras/forms/model_forms.py:285 +msgid "Creations" +msgstr "Criações" + +#: extras/forms/model_forms.py:286 +msgid "Updates" +msgstr "Atualizações" + +#: extras/forms/model_forms.py:287 +msgid "Deletions" +msgstr "Exclusões" + +#: extras/forms/model_forms.py:288 +msgid "Job executions" +msgstr "Execuções de empregos" + +#: extras/forms/model_forms.py:366 users/forms/model_forms.py:285 +msgid "Object types" +msgstr "Tipos de objetos" + +#: extras/forms/model_forms.py:439 netbox/navigation/menu.py:40 +#: tenancy/tables/tenants.py:22 +msgid "Tenants" +msgstr "Inquilinos" + +#: extras/forms/model_forms.py:456 ipam/forms/filtersets.py:141 +#: ipam/forms/filtersets.py:527 templates/extras/configcontext.html:62 +#: templates/ipam/ipaddress.html:62 templates/ipam/vlan_edit.html:30 +#: tenancy/forms/filtersets.py:86 users/forms/model_forms.py:323 +msgid "Assignment" +msgstr "Atribuição" + +#: extras/forms/model_forms.py:482 +msgid "Data is populated from the remote source selected below." +msgstr "Os dados são preenchidos a partir da fonte remota selecionada abaixo." + +#: extras/forms/model_forms.py:488 +msgid "Must specify either local data or a data file" +msgstr "Deve especificar dados locais ou um arquivo de dados" + +#: extras/forms/model_forms.py:507 templates/core/datafile.html:65 +msgid "Content" +msgstr "Conteúdo" + +#: extras/forms/reports.py:18 extras/forms/scripts.py:24 +msgid "Schedule at" +msgstr "Agende em" + +#: extras/forms/reports.py:19 +msgid "Schedule execution of report to a set time" +msgstr "Programe a execução do relatório em um horário definido" + +#: extras/forms/reports.py:24 extras/forms/scripts.py:30 +msgid "Recurs every" +msgstr "Recorre a cada" + +#: extras/forms/reports.py:28 +msgid "Interval at which this report is re-run (in minutes)" +msgstr "Intervalo no qual esse relatório é executado novamente (em minutos)" + +#: extras/forms/reports.py:36 extras/forms/scripts.py:42 +#, python-brace-format +msgid " (current time: {now})" +msgstr " (hora atual: {now})" + +#: extras/forms/reports.py:46 extras/forms/scripts.py:52 +msgid "Scheduled time must be in the future." +msgstr "O horário agendado deve ser no futuro." + +#: extras/forms/scripts.py:18 +msgid "Commit changes" +msgstr "Confirmar alterações" + +#: extras/forms/scripts.py:19 +msgid "Commit changes to the database (uncheck for a dry-run)" +msgstr "" +"Confirme as alterações no banco de dados (desmarque para uma execução a " +"seco)" + +#: extras/forms/scripts.py:25 +msgid "Schedule execution of script to a set time" +msgstr "Programe a execução do script para um horário definido" + +#: extras/forms/scripts.py:34 +msgid "Interval at which this script is re-run (in minutes)" +msgstr "Intervalo no qual esse script é executado novamente (em minutos)" + +#: extras/models/change_logging.py:24 +msgid "time" +msgstr "horas" + +#: extras/models/change_logging.py:37 +msgid "user name" +msgstr "nome de usuário" + +#: extras/models/change_logging.py:42 +msgid "request ID" +msgstr "ID da solicitação" + +#: extras/models/change_logging.py:47 extras/models/staging.py:69 +msgid "action" +msgstr "ação" + +#: extras/models/change_logging.py:81 +msgid "pre-change data" +msgstr "dados de pré-alteração" + +#: extras/models/change_logging.py:87 +msgid "post-change data" +msgstr "dados pós-alteração" + +#: extras/models/change_logging.py:101 +msgid "object change" +msgstr "mudança de objeto" + +#: extras/models/change_logging.py:102 +msgid "object changes" +msgstr "mudanças de objeto" + +#: extras/models/change_logging.py:118 +#, python-brace-format +msgid "Change logging is not supported for this object type ({type})." +msgstr "" +"O registro de alterações não é suportado para esse tipo de objeto ({type})." + +#: extras/models/configs.py:130 +msgid "config context" +msgstr "contexto de configuração" + +#: extras/models/configs.py:131 +msgid "config contexts" +msgstr "contextos de configuração" + +#: extras/models/configs.py:149 extras/models/configs.py:205 +msgid "JSON data must be in object form. Example:" +msgstr "Os dados JSON devem estar no formato de objeto. Exemplo:" + +#: extras/models/configs.py:169 +msgid "" +"Local config context data takes precedence over source contexts in the final" +" rendered config context" +msgstr "" +"Os dados do contexto de configuração local têm precedência sobre os " +"contextos de origem no contexto de configuração renderizado final" + +#: extras/models/configs.py:224 +msgid "template code" +msgstr "código de modelo" + +#: extras/models/configs.py:225 +msgid "Jinja2 template code." +msgstr "Código do modelo Jinja2." + +#: extras/models/configs.py:228 +msgid "environment parameters" +msgstr "parâmetros do ambiente" + +#: extras/models/configs.py:233 +msgid "" +"Any additional" +" parameters to pass when constructing the Jinja2 environment." +msgstr "" +"Qualquer parâmetros" +" adicionais para passar ao construir o ambiente Jinja2." + +#: extras/models/configs.py:240 +msgid "config template" +msgstr "modelo de configuração" + +#: extras/models/configs.py:241 +msgid "config templates" +msgstr "modelos de configuração" + +#: extras/models/customfields.py:72 +msgid "The object(s) to which this field applies." +msgstr "O (s) objeto (s) aos quais esse campo se aplica." + +#: extras/models/customfields.py:79 +msgid "The type of data this custom field holds" +msgstr "O tipo de dados que esse campo personalizado contém" + +#: extras/models/customfields.py:86 +msgid "The type of NetBox object this field maps to (for object fields)" +msgstr "" +"O tipo de objeto NetBox para o qual esse campo é mapeado (para campos de " +"objeto)" + +#: extras/models/customfields.py:92 +msgid "Internal field name" +msgstr "Nome do campo interno" + +#: extras/models/customfields.py:96 +msgid "Only alphanumeric characters and underscores are allowed." +msgstr "Somente caracteres alfanuméricos e sublinhados são permitidos." + +#: extras/models/customfields.py:101 +msgid "Double underscores are not permitted in custom field names." +msgstr "" +"Sublinhados duplos não são permitidos em nomes de campos personalizados." + +#: extras/models/customfields.py:112 +msgid "" +"Name of the field as displayed to users (if not provided, 'the field's name " +"will be used)" +msgstr "" +"Nome do campo exibido aos usuários (se não for fornecido, 'o nome do campo " +"será usado)" + +#: extras/models/customfields.py:116 extras/models/models.py:347 +msgid "group name" +msgstr "nome do grupo" + +#: extras/models/customfields.py:119 +msgid "Custom fields within the same group will be displayed together" +msgstr "Os campos personalizados dentro do mesmo grupo serão exibidos juntos" + +#: extras/models/customfields.py:127 +msgid "required" +msgstr "requeridos" + +#: extras/models/customfields.py:129 +msgid "" +"If true, this field is required when creating new objects or editing an " +"existing object." +msgstr "" +"Se verdadeiro, esse campo é obrigatório ao criar novos objetos ou editar um " +"objeto existente." + +#: extras/models/customfields.py:132 +msgid "search weight" +msgstr "peso de pesquisa" + +#: extras/models/customfields.py:135 +msgid "" +"Weighting for search. Lower values are considered more important. Fields " +"with a search weight of zero will be ignored." +msgstr "" +"Ponderação para pesquisa. Valores mais baixos são considerados mais " +"importantes. Os campos com peso de pesquisa zero serão ignorados." + +#: extras/models/customfields.py:140 +msgid "filter logic" +msgstr "lógica de filtro" + +#: extras/models/customfields.py:144 +msgid "" +"Loose matches any instance of a given string; exact matches the entire " +"field." +msgstr "" +"Loose corresponde a qualquer instância de uma determinada string; a exata " +"corresponde a todo o campo." + +#: extras/models/customfields.py:147 +msgid "default" +msgstr "padrão" + +#: extras/models/customfields.py:151 +msgid "" +"Default value for the field (must be a JSON value). Encapsulate strings with" +" double quotes (e.g. \"Foo\")." +msgstr "" +"Valor padrão para o campo (deve ser um valor JSON). Encapsular cadeias de " +"caracteres com aspas duplas (por exemplo, “Foo”)." + +#: extras/models/customfields.py:156 +msgid "display weight" +msgstr "peso da tela" + +#: extras/models/customfields.py:157 +msgid "Fields with higher weights appear lower in a form." +msgstr "Os campos com pesos maiores aparecem mais abaixo em um formulário." + +#: extras/models/customfields.py:162 +msgid "minimum value" +msgstr "valor mínimo" + +#: extras/models/customfields.py:163 +msgid "Minimum allowed value (for numeric fields)" +msgstr "Valor mínimo permitido (para campos numéricos)" + +#: extras/models/customfields.py:168 +msgid "maximum value" +msgstr "valor máximo" + +#: extras/models/customfields.py:169 +msgid "Maximum allowed value (for numeric fields)" +msgstr "Valor máximo permitido (para campos numéricos)" + +#: extras/models/customfields.py:175 +msgid "validation regex" +msgstr "regex de validação" + +#: extras/models/customfields.py:177 +#, python-brace-format +msgid "" +"Regular expression to enforce on text field values. Use ^ and $ to force " +"matching of entire string. For example, ^[A-Z]{3}$ will limit " +"values to exactly three uppercase letters." +msgstr "" +"Expressão regular para impor valores de campo de texto. Use ^ e $ para " +"forçar a correspondência de toda a string. Por exemplo, ^ " +"[A-Z]{3}$ limitará os valores a exatamente três letras maiúsculas." + +#: extras/models/customfields.py:185 +msgid "choice set" +msgstr "conjunto de opções" + +#: extras/models/customfields.py:194 +msgid "Specifies whether the custom field is displayed in the UI" +msgstr "Especifica se o campo personalizado é exibido na interface do usuário" + +#: extras/models/customfields.py:201 +msgid "Specifies whether the custom field value can be edited in the UI" +msgstr "" +"Especifica se o valor do campo personalizado pode ser editado na interface " +"do usuário" + +#: extras/models/customfields.py:205 +msgid "is cloneable" +msgstr "é clonável" + +#: extras/models/customfields.py:206 +msgid "Replicate this value when cloning objects" +msgstr "Replique esse valor ao clonar objetos" + +#: extras/models/customfields.py:219 +msgid "custom field" +msgstr "campo personalizado" + +#: extras/models/customfields.py:220 +msgid "custom fields" +msgstr "campos personalizados" + +#: extras/models/customfields.py:309 +#, python-brace-format +msgid "Invalid default value \"{value}\": {error}" +msgstr "Valor padrão inválido”{value}“: {error}" + +#: extras/models/customfields.py:316 +msgid "A minimum value may be set only for numeric fields" +msgstr "Um valor mínimo pode ser definido somente para campos numéricos" + +#: extras/models/customfields.py:318 +msgid "A maximum value may be set only for numeric fields" +msgstr "Um valor máximo pode ser definido somente para campos numéricos" + +#: extras/models/customfields.py:328 +msgid "" +"Regular expression validation is supported only for text and URL fields" +msgstr "" +"A validação de expressões regulares é suportada somente para campos de texto" +" e URL" + +#: extras/models/customfields.py:338 +msgid "Selection fields must specify a set of choices." +msgstr "Os campos de seleção devem especificar um conjunto de opções." + +#: extras/models/customfields.py:342 +msgid "Choices may be set only on selection fields." +msgstr "As opções podem ser definidas somente nos campos de seleção." + +#: extras/models/customfields.py:349 +msgid "Object fields must define an object type." +msgstr "Os campos de objeto devem definir um tipo de objeto." + +#: extras/models/customfields.py:354 +#, python-brace-format +msgid "{type} fields may not define an object type." +msgstr "{type} os campos não podem definir um tipo de objeto." + +#: extras/models/customfields.py:434 +msgid "True" +msgstr "É verdade" + +#: extras/models/customfields.py:435 +msgid "False" +msgstr "Falso" + +#: extras/models/customfields.py:517 +#, python-brace-format +msgid "Values must match this regex: {regex}" +msgstr "Os valores devem corresponder a esse regex: {regex}" + +#: extras/models/customfields.py:612 +msgid "Value must be a string." +msgstr "O valor deve ser uma string." + +#: extras/models/customfields.py:614 +#, python-brace-format +msgid "Value must match regex '{regex}'" +msgstr "O valor deve corresponder ao regex '{regex}'" + +#: extras/models/customfields.py:619 +msgid "Value must be an integer." +msgstr "O valor deve ser um número inteiro." + +#: extras/models/customfields.py:622 extras/models/customfields.py:637 +#, python-brace-format +msgid "Value must be at least {minimum}" +msgstr "O valor deve ser pelo menos {minimum}" + +#: extras/models/customfields.py:626 extras/models/customfields.py:641 +#, python-brace-format +msgid "Value must not exceed {maximum}" +msgstr "O valor não deve exceder {maximum}" + +#: extras/models/customfields.py:634 +msgid "Value must be a decimal." +msgstr "O valor deve ser decimal." + +#: extras/models/customfields.py:646 +msgid "Value must be true or false." +msgstr "O valor deve ser verdadeiro ou falso." + +#: extras/models/customfields.py:654 +msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." +msgstr "Os valores de data devem estar no formato ISO 8601 (AAAA-MM-DD)." + +#: extras/models/customfields.py:663 +msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." +msgstr "" +"Os valores de data e hora devem estar no formato ISO 8601 (AAAA-MM-DD " +"HH:MM:SS)." + +#: extras/models/customfields.py:670 +#, python-brace-format +msgid "Invalid choice ({value}) for choice set {choiceset}." +msgstr "Escolha inválida ({value}) para conjunto de escolha {choiceset}." + +#: extras/models/customfields.py:680 +#, python-brace-format +msgid "Invalid choice(s) ({value}) for choice set {choiceset}." +msgstr "" +"Escolha (s) inválida (s){value}) para conjunto de escolha {choiceset}." + +#: extras/models/customfields.py:689 +#, python-brace-format +msgid "Value must be an object ID, not {type}" +msgstr "O valor deve ser um ID de objeto, não {type}" + +#: extras/models/customfields.py:695 +#, python-brace-format +msgid "Value must be a list of object IDs, not {type}" +msgstr "O valor deve ser uma lista de IDs de objetos, não {type}" + +#: extras/models/customfields.py:699 +#, python-brace-format +msgid "Found invalid object ID: {id}" +msgstr "ID de objeto inválida encontrada: {id}" + +#: extras/models/customfields.py:702 +msgid "Required field cannot be empty." +msgstr "O campo obrigatório não pode estar vazio." + +#: extras/models/customfields.py:721 +msgid "Base set of predefined choices (optional)" +msgstr "Conjunto básico de opções predefinidas (opcional)" + +#: extras/models/customfields.py:733 +msgid "Choices are automatically ordered alphabetically" +msgstr "As opções são ordenadas automaticamente em ordem alfabética" + +#: extras/models/customfields.py:740 +msgid "custom field choice set" +msgstr "conjunto de opções de campo personalizado" + +#: extras/models/customfields.py:741 +msgid "custom field choice sets" +msgstr "conjuntos de opções de campo personalizados" + +#: extras/models/customfields.py:777 +msgid "Must define base or extra choices." +msgstr "Deve definir opções básicas ou extras." + +#: extras/models/dashboard.py:19 +msgid "layout" +msgstr "layout" + +#: extras/models/dashboard.py:23 +msgid "config" +msgstr "configuração" + +#: extras/models/dashboard.py:28 +msgid "dashboard" +msgstr "painel de controle" + +#: extras/models/dashboard.py:29 +msgid "dashboards" +msgstr "painéis" + +#: extras/models/models.py:49 +msgid "object types" +msgstr "tipos de objetos" + +#: extras/models/models.py:50 +msgid "The object(s) to which this rule applies." +msgstr "O (s) objeto (s) aos quais essa regra se aplica." + +#: extras/models/models.py:63 +msgid "on create" +msgstr "na criação" + +#: extras/models/models.py:65 +msgid "Triggers when a matching object is created." +msgstr "É acionado quando um objeto correspondente é criado." + +#: extras/models/models.py:68 +msgid "on update" +msgstr "na atualização" + +#: extras/models/models.py:70 +msgid "Triggers when a matching object is updated." +msgstr "É acionado quando um objeto correspondente é atualizado." + +#: extras/models/models.py:73 +msgid "on delete" +msgstr "ao excluir" + +#: extras/models/models.py:75 +msgid "Triggers when a matching object is deleted." +msgstr "É acionado quando um objeto correspondente é excluído." + +#: extras/models/models.py:78 +msgid "on job start" +msgstr "no início do trabalho" + +#: extras/models/models.py:80 +msgid "Triggers when a job for a matching object is started." +msgstr "" +"É acionado quando um trabalho para um objeto correspondente é iniciado." + +#: extras/models/models.py:83 +msgid "on job end" +msgstr "no final do trabalho" + +#: extras/models/models.py:85 +msgid "Triggers when a job for a matching object terminates." +msgstr "" +"É acionado quando um trabalho para um objeto correspondente é encerrado." + +#: extras/models/models.py:92 +msgid "conditions" +msgstr "condições" + +#: extras/models/models.py:95 +msgid "" +"A set of conditions which determine whether the event will be generated." +msgstr "Um conjunto de condições que determinam se o evento será gerado." + +#: extras/models/models.py:103 +msgid "action type" +msgstr "tipo de ação" + +#: extras/models/models.py:126 +msgid "Additional data to pass to the action object" +msgstr "Dados adicionais para passar para o objeto de ação" + +#: extras/models/models.py:138 +msgid "event rule" +msgstr "regra do evento" + +#: extras/models/models.py:139 +msgid "event rules" +msgstr "regras do evento" + +#: extras/models/models.py:155 +msgid "" +"At least one event type must be selected: create, update, delete, job start," +" and/or job end." +msgstr "" +"Pelo menos um tipo de evento deve ser selecionado: criar, atualizar, " +"excluir, início e/ou fim do trabalho." + +#: extras/models/models.py:196 +msgid "" +"This URL will be called using the HTTP method defined when the webhook is " +"called. Jinja2 template processing is supported with the same context as the" +" request body." +msgstr "" +"Esse URL será chamado usando o método HTTP definido quando o webhook for " +"chamado. O processamento do modelo Jinja2 é suportado com o mesmo contexto " +"do corpo da solicitação." + +#: extras/models/models.py:211 +msgid "" +"The complete list of official content types is available here." +msgstr "" +"A lista completa dos tipos de conteúdo oficial está disponível aqui." + +#: extras/models/models.py:216 +msgid "additional headers" +msgstr "cabeçalhos adicionais" + +#: extras/models/models.py:219 +msgid "" +"User-supplied HTTP headers to be sent with the request in addition to the " +"HTTP content type. Headers should be defined in the format Name: " +"Value. Jinja2 template processing is supported with the same context " +"as the request body (below)." +msgstr "" +"Cabeçalhos HTTP fornecidos pelo usuário a serem enviados com a solicitação, " +"além do tipo de conteúdo HTTP. Os cabeçalhos devem ser definidos no formato " +"Nome: Valor. O processamento do modelo Jinja2 é suportado com o" +" mesmo contexto do corpo da solicitação (abaixo)." + +#: extras/models/models.py:225 +msgid "body template" +msgstr "modelo de corpo" + +#: extras/models/models.py:228 +msgid "" +"Jinja2 template for a custom request body. If blank, a JSON object " +"representing the change will be included. Available context data includes: " +"event, model, timestamp, " +"username, request_id, and data." +msgstr "" +"Modelo Jinja2 para um corpo de solicitação personalizado. Se estiver em " +"branco, um objeto JSON representando a alteração será incluído. Os dados de " +"contexto disponíveis incluem: evento, modelo, " +"timestamp, nome de usuário, ID da " +"solicitação, e dados." + +#: extras/models/models.py:234 +msgid "secret" +msgstr "secreto" + +#: extras/models/models.py:238 +msgid "" +"When provided, the request will include a X-Hook-Signature " +"header containing a HMAC hex digest of the payload body using the secret as " +"the key. The secret is not transmitted in the request." +msgstr "" +"Quando fornecida, a solicitação incluirá um Assinatura X-Hook " +"cabeçalho contendo um resumo hexadecimal HMAC do corpo da carga usando o " +"segredo como chave. O segredo não é transmitido na solicitação." + +#: extras/models/models.py:245 +msgid "Enable SSL certificate verification. Disable with caution!" +msgstr "Ative a verificação do certificado SSL. Desative com cuidado!" + +#: extras/models/models.py:251 templates/extras/webhook.html:62 +msgid "CA File Path" +msgstr "Caminho do arquivo CA" + +#: extras/models/models.py:253 +msgid "" +"The specific CA certificate file to use for SSL verification. Leave blank to" +" use the system defaults." +msgstr "" +"O arquivo de certificado CA específico a ser usado para verificação SSL. " +"Deixe em branco para usar os padrões do sistema." + +#: extras/models/models.py:264 +msgid "webhook" +msgstr "webhook" + +#: extras/models/models.py:265 +msgid "webhooks" +msgstr "webhooks" + +#: extras/models/models.py:283 +msgid "Do not specify a CA certificate file if SSL verification is disabled." +msgstr "" +"Não especifique um arquivo de certificado CA se a verificação SSL estiver " +"desativada." + +#: extras/models/models.py:323 +msgid "The object type(s) to which this link applies." +msgstr "O (s) tipo (s) de objeto aos quais esse link se aplica." + +#: extras/models/models.py:335 +msgid "link text" +msgstr "texto do link" + +#: extras/models/models.py:336 +msgid "Jinja2 template code for link text" +msgstr "Código de modelo Jinja2 para texto do link" + +#: extras/models/models.py:339 +msgid "link URL" +msgstr "URL do link" + +#: extras/models/models.py:340 +msgid "Jinja2 template code for link URL" +msgstr "Código de modelo Jinja2 para URL do link" + +#: extras/models/models.py:350 +msgid "Links with the same group will appear as a dropdown menu" +msgstr "Links com o mesmo grupo aparecerão como um menu suspenso" + +#: extras/models/models.py:353 +msgid "button class" +msgstr "classe de botão" + +#: extras/models/models.py:357 +msgid "" +"The class of the first link in a group will be used for the dropdown button" +msgstr "" +"A classe do primeiro link em um grupo será usada para o botão suspenso" + +#: extras/models/models.py:360 +msgid "new window" +msgstr "nova janela" + +#: extras/models/models.py:362 +msgid "Force link to open in a new window" +msgstr "Forçar o link a abrir em uma nova janela" + +#: extras/models/models.py:371 +msgid "custom link" +msgstr "link personalizado" + +#: extras/models/models.py:372 +msgid "custom links" +msgstr "links personalizados" + +#: extras/models/models.py:419 +msgid "The object type(s) to which this template applies." +msgstr "O (s) tipo (s) de objeto aos quais esse modelo se aplica." + +#: extras/models/models.py:432 +msgid "" +"Jinja2 template code. The list of objects being exported is passed as a " +"context variable named queryset." +msgstr "" +"Código do modelo Jinja2. A lista de objetos que estão sendo exportados é " +"passada como uma variável de contexto chamada conjunto de " +"consultas." + +#: extras/models/models.py:440 +msgid "Defaults to text/plain; charset=utf-8" +msgstr "O padrão é texto/simples; charset=utf-8" + +#: extras/models/models.py:443 +msgid "file extension" +msgstr "extensão de arquivo" + +#: extras/models/models.py:446 +msgid "Extension to append to the rendered filename" +msgstr "Extensão para anexar ao nome do arquivo renderizado" + +#: extras/models/models.py:449 +msgid "as attachment" +msgstr "como anexo" + +#: extras/models/models.py:451 +msgid "Download file as attachment" +msgstr "Baixar arquivo como anexo" + +#: extras/models/models.py:460 +msgid "export template" +msgstr "modelo de exportação" + +#: extras/models/models.py:461 +msgid "export templates" +msgstr "modelos de exportação" + +#: extras/models/models.py:478 +#, python-brace-format +msgid "\"{name}\" is a reserved name. Please choose a different name." +msgstr "“{name}“é um nome reservado. Escolha um nome diferente." + +#: extras/models/models.py:528 +msgid "The object type(s) to which this filter applies." +msgstr "O (s) tipo (s) de objeto aos quais esse filtro se aplica." + +#: extras/models/models.py:560 +msgid "shared" +msgstr "compartilhado" + +#: extras/models/models.py:573 +msgid "saved filter" +msgstr "filtro salvo" + +#: extras/models/models.py:574 +msgid "saved filters" +msgstr "filtros salvos" + +#: extras/models/models.py:592 +msgid "Filter parameters must be stored as a dictionary of keyword arguments." +msgstr "" +"Os parâmetros do filtro devem ser armazenados como um dicionário de " +"argumentos de palavras-chave." + +#: extras/models/models.py:620 +msgid "image height" +msgstr "altura da imagem" + +#: extras/models/models.py:623 +msgid "image width" +msgstr "largura da imagem" + +#: extras/models/models.py:640 +msgid "image attachment" +msgstr "anexo de imagem" + +#: extras/models/models.py:641 +msgid "image attachments" +msgstr "anexos de imagem" + +#: extras/models/models.py:655 +#, python-brace-format +msgid "Image attachments cannot be assigned to this object type ({type})." +msgstr "" +"Os anexos de imagem não podem ser atribuídos a esse tipo de objeto ({type})." + +#: extras/models/models.py:718 +msgid "kind" +msgstr "gentil" + +#: extras/models/models.py:732 +msgid "journal entry" +msgstr "entrada no diário" + +#: extras/models/models.py:733 +msgid "journal entries" +msgstr "entradas de diário" + +#: extras/models/models.py:748 +#, python-brace-format +msgid "Journaling is not supported for this object type ({type})." +msgstr "" +"O registro no diário não é suportado para esse tipo de objeto ({type})." + +#: extras/models/models.py:790 +msgid "bookmark" +msgstr "marca páginas" + +#: extras/models/models.py:791 +msgid "bookmarks" +msgstr "marcadores" + +#: extras/models/models.py:804 +#, python-brace-format +msgid "Bookmarks cannot be assigned to this object type ({type})." +msgstr "" +"Os marcadores não podem ser atribuídos a esse tipo de objeto ({type})." + +#: extras/models/reports.py:46 +msgid "report module" +msgstr "módulo de relatório" + +#: extras/models/reports.py:47 +msgid "report modules" +msgstr "módulos de relatório" + +#: extras/models/scripts.py:46 +msgid "script module" +msgstr "módulo de script" + +#: extras/models/scripts.py:47 +msgid "script modules" +msgstr "módulos de script" + +#: extras/models/search.py:24 +msgid "timestamp" +msgstr "timestamp" + +#: extras/models/search.py:39 +msgid "field" +msgstr "campo" + +#: extras/models/search.py:47 +msgid "value" +msgstr "valor" + +#: extras/models/search.py:58 +msgid "cached value" +msgstr "valor em cache" + +#: extras/models/search.py:59 +msgid "cached values" +msgstr "valores em cache" + +#: extras/models/staging.py:44 +msgid "branch" +msgstr "filial" + +#: extras/models/staging.py:45 +msgid "branches" +msgstr "ramos" + +#: extras/models/staging.py:97 +msgid "staged change" +msgstr "mudança encenada" + +#: extras/models/staging.py:98 +msgid "staged changes" +msgstr "mudanças encenadas" + +#: extras/models/tags.py:40 +msgid "The object type(s) to which this this tag can be applied." +msgstr "O (s) tipo (s) de objeto aos quais essa tag pode ser aplicada." + +#: extras/models/tags.py:49 +msgid "tag" +msgstr "marcar" + +#: extras/models/tags.py:50 +msgid "tags" +msgstr "tags" + +#: extras/models/tags.py:78 +msgid "tagged item" +msgstr "item marcado" + +#: extras/models/tags.py:79 +msgid "tagged items" +msgstr "itens marcados" + +#: extras/signals.py:221 +#, python-brace-format +msgid "Deletion is prevented by a protection rule: {message}" +msgstr "A exclusão é impedida por uma regra de proteção: {message}" + +#: extras/tables/tables.py:44 extras/tables/tables.py:119 +#: extras/tables/tables.py:143 extras/tables/tables.py:208 +#: extras/tables/tables.py:281 +msgid "Content Types" +msgstr "Tipos de conteúdo" + +#: extras/tables/tables.py:50 +msgid "Visible" +msgstr "Visível" + +#: extras/tables/tables.py:53 +msgid "Editable" +msgstr "Editável" + +#: extras/tables/tables.py:60 templates/extras/customfield.html:48 +msgid "Choice Set" +msgstr "Conjunto de opções" + +#: extras/tables/tables.py:68 +msgid "Is Cloneable" +msgstr "É clonável" + +#: extras/tables/tables.py:98 +msgid "Count" +msgstr "Contar" + +#: extras/tables/tables.py:101 +msgid "Order Alphabetically" +msgstr "Ordenar alfabeticamente" + +#: extras/tables/tables.py:125 templates/extras/customlink.html:34 +msgid "New Window" +msgstr "Nova janela" + +#: extras/tables/tables.py:146 +msgid "As Attachment" +msgstr "Como anexo" + +#: extras/tables/tables.py:153 extras/tables/tables.py:367 +#: extras/tables/tables.py:402 templates/core/datafile.html:32 +#: templates/dcim/device/render_config.html:23 +#: templates/extras/configcontext.html:40 +#: templates/extras/configtemplate.html:32 +#: templates/extras/exporttemplate.html:51 +#: templates/generic/bulk_import.html:30 +#: templates/virtualization/virtualmachine/render_config.html:23 +msgid "Data File" +msgstr "Arquivo de dados" + +#: extras/tables/tables.py:158 extras/tables/tables.py:379 +#: extras/tables/tables.py:407 +msgid "Synced" +msgstr "Sincronizado" + +#: extras/tables/tables.py:178 +msgid "Content Type" +msgstr "Tipo de conteúdo" + +#: extras/tables/tables.py:185 +msgid "Image" +msgstr "Imagem" + +#: extras/tables/tables.py:190 +msgid "Size (Bytes)" +msgstr "Tamanho (bytes)" + +#: extras/tables/tables.py:233 extras/tables/tables.py:326 +#: templates/extras/customfield.html:96 templates/extras/eventrule.html:32 +#: templates/users/objectpermission.html:68 users/tables.py:83 +msgid "Object Types" +msgstr "Tipos de objetos" + +#: extras/tables/tables.py:255 +msgid "SSL Validation" +msgstr "Validação SSL" + +#: extras/tables/tables.py:278 +msgid "Action Type" +msgstr "Tipo de ação" + +#: extras/tables/tables.py:296 +msgid "Job Start" +msgstr "Início do trabalho" + +#: extras/tables/tables.py:299 +msgid "Job End" +msgstr "Fim do trabalho" + +#: extras/tables/tables.py:436 templates/account/profile.html:20 +#: templates/users/user.html:22 +msgid "Full Name" +msgstr "Nome completo" + +#: extras/tables/tables.py:453 templates/extras/objectchange.html:72 +msgid "Request ID" +msgstr "ID da solicitação" + +#: extras/tables/tables.py:490 +msgid "Comments (Short)" +msgstr "Comentários (curtos)" + +#: extras/validators.py:13 +#, python-format +msgid "Ensure this value is equal to %(limit_value)s." +msgstr "Verifique se esse valor é igual a %(limit_value)s." + +#: extras/validators.py:24 +#, python-format +msgid "Ensure this value does not equal %(limit_value)s." +msgstr "Certifique-se de que esse valor não seja igual %(limit_value)s." + +#: extras/validators.py:35 +msgid "This field must be empty." +msgstr "Esse campo deve estar vazio." + +#: extras/validators.py:50 +msgid "This field must not be empty." +msgstr "Esse campo não deve estar vazio." + +#: extras/views.py:880 +msgid "Your dashboard has been reset." +msgstr "Seu painel foi redefinido." + +#: ipam/api/field_serializers.py:17 +msgid "Enter a valid IPv4 or IPv6 address with optional mask." +msgstr "Insira um endereço IPv4 ou IPv6 válido com máscara opcional." + +#: ipam/api/field_serializers.py:24 +#, python-brace-format +msgid "Invalid IP address format: {data}" +msgstr "Formato de endereço IP inválido: {data}" + +#: ipam/api/field_serializers.py:37 +msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." +msgstr "Insira um prefixo IPv4 ou IPv6 válido e uma máscara na notação CIDR." + +#: ipam/api/field_serializers.py:44 +#, python-brace-format +msgid "Invalid IP prefix format: {data}" +msgstr "Formato de prefixo IP inválido: {data}" + +#: ipam/choices.py:30 +msgid "Container" +msgstr "Contêiner" + +#: ipam/choices.py:72 +msgid "DHCP" +msgstr "DHCP" + +#: ipam/choices.py:73 +msgid "SLAAC" +msgstr "ESBRAVEJAR" + +#: ipam/choices.py:89 +msgid "Loopback" +msgstr "Loopback" + +#: ipam/choices.py:90 tenancy/choices.py:18 +msgid "Secondary" +msgstr "Secundário" + +#: ipam/choices.py:91 +msgid "Anycast" +msgstr "Anycast" + +#: ipam/choices.py:115 +msgid "Standard" +msgstr "Padrão" + +#: ipam/choices.py:120 +msgid "CheckPoint" +msgstr "Ponto de verificação" + +#: ipam/choices.py:123 +msgid "Cisco" +msgstr "Cisco" + +#: ipam/choices.py:137 +msgid "Plaintext" +msgstr "Texto sem formatação" + +#: ipam/filtersets.py:47 vpn/filtersets.py:276 +msgid "Import target" +msgstr "Alvo de importação" + +#: ipam/filtersets.py:53 vpn/filtersets.py:282 +msgid "Import target (name)" +msgstr "Destino de importação (nome)" + +#: ipam/filtersets.py:58 vpn/filtersets.py:287 +msgid "Export target" +msgstr "Alvo de exportação" + +#: ipam/filtersets.py:64 vpn/filtersets.py:293 +msgid "Export target (name)" +msgstr "Alvo de exportação (nome)" + +#: ipam/filtersets.py:85 +msgid "Importing VRF" +msgstr "Importando VRF" + +#: ipam/filtersets.py:91 +msgid "Import VRF (RD)" +msgstr "Importar VRF (RD)" + +#: ipam/filtersets.py:96 +msgid "Exporting VRF" +msgstr "Exportando VRF" + +#: ipam/filtersets.py:102 +msgid "Export VRF (RD)" +msgstr "Exportar VRF (RD)" + +#: ipam/filtersets.py:132 ipam/filtersets.py:247 ipam/forms/model_forms.py:229 +#: ipam/tables/ip.py:211 templates/ipam/prefix.html:12 +msgid "Prefix" +msgstr "Prefixo" + +#: ipam/filtersets.py:136 ipam/filtersets.py:175 ipam/filtersets.py:198 +msgid "RIR (ID)" +msgstr "RIR (ID)" + +#: ipam/filtersets.py:142 ipam/filtersets.py:181 ipam/filtersets.py:204 +msgid "RIR (slug)" +msgstr "RIR (lesma)" + +#: ipam/filtersets.py:251 +msgid "Within prefix" +msgstr "Dentro do prefixo" + +#: ipam/filtersets.py:255 +msgid "Within and including prefix" +msgstr "Dentro e incluindo o prefixo" + +#: ipam/filtersets.py:259 +msgid "Prefixes which contain this prefix or IP" +msgstr "Prefixos que contêm esse prefixo ou IP" + +#: ipam/filtersets.py:270 ipam/filtersets.py:538 ipam/forms/bulk_edit.py:326 +#: ipam/forms/filtersets.py:191 ipam/forms/filtersets.py:317 +msgid "Mask length" +msgstr "Comprimento da máscara" + +#: ipam/filtersets.py:339 vpn/filtersets.py:399 +msgid "VLAN (ID)" +msgstr "VLAN (ID)" + +#: ipam/filtersets.py:343 vpn/filtersets.py:394 +msgid "VLAN number (1-4094)" +msgstr "Número da VLAN (1-4094)" + +#: ipam/filtersets.py:437 ipam/filtersets.py:441 ipam/filtersets.py:533 +#: ipam/forms/model_forms.py:444 templates/tenancy/contact.html:54 +#: tenancy/forms/bulk_edit.py:112 +msgid "Address" +msgstr "Endereço" + +#: ipam/filtersets.py:445 +msgid "Ranges which contain this prefix or IP" +msgstr "Intervalos que contêm esse prefixo ou IP" + +#: ipam/filtersets.py:473 ipam/filtersets.py:529 +msgid "Parent prefix" +msgstr "Prefixo principal" + +#: ipam/filtersets.py:582 ipam/filtersets.py:812 ipam/filtersets.py:1031 +#: vpn/filtersets.py:357 +msgid "Virtual machine (name)" +msgstr "Máquina virtual (nome)" + +#: ipam/filtersets.py:587 ipam/filtersets.py:817 ipam/filtersets.py:1025 +#: virtualization/filtersets.py:276 virtualization/filtersets.py:315 +#: vpn/filtersets.py:362 +msgid "Virtual machine (ID)" +msgstr "Máquina virtual (ID)" + +#: ipam/filtersets.py:593 vpn/filtersets.py:97 vpn/filtersets.py:368 +msgid "Interface (name)" +msgstr "Interface (nome)" + +#: ipam/filtersets.py:598 vpn/filtersets.py:102 vpn/filtersets.py:373 +msgid "Interface (ID)" +msgstr "Interface (ID)" + +#: ipam/filtersets.py:604 vpn/filtersets.py:108 vpn/filtersets.py:379 +msgid "VM interface (name)" +msgstr "Interface da VM (nome)" + +#: ipam/filtersets.py:609 vpn/filtersets.py:113 +msgid "VM interface (ID)" +msgstr "Interface de VM (ID)" + +#: ipam/filtersets.py:614 +msgid "FHRP group (ID)" +msgstr "Grupo FHRP (ID)" + +#: ipam/filtersets.py:618 +msgid "Is assigned to an interface" +msgstr "É atribuído a uma interface" + +#: ipam/filtersets.py:622 +msgid "Is assigned" +msgstr "É atribuído" + +#: ipam/filtersets.py:1036 +msgid "IP address (ID)" +msgstr "Endereço IP (ID)" + +#: ipam/filtersets.py:1042 ipam/models/ip.py:787 +msgid "IP address" +msgstr "Endereço IP" + +#: ipam/filtersets.py:1068 +msgid "Primary IPv4 (ID)" +msgstr "IPv4 primário (ID)" + +#: ipam/filtersets.py:1073 +msgid "Primary IPv6 (ID)" +msgstr "IPv6 primário (ID)" + +#: ipam/forms/bulk_create.py:14 +msgid "Address pattern" +msgstr "Padrão de endereço" + +#: ipam/forms/bulk_edit.py:85 +msgid "Is private" +msgstr "É privado" + +#: ipam/forms/bulk_edit.py:106 ipam/forms/bulk_edit.py:135 +#: ipam/forms/bulk_edit.py:160 ipam/forms/bulk_import.py:88 +#: ipam/forms/bulk_import.py:108 ipam/forms/bulk_import.py:128 +#: ipam/forms/filtersets.py:109 ipam/forms/filtersets.py:124 +#: ipam/forms/filtersets.py:147 ipam/forms/model_forms.py:93 +#: ipam/forms/model_forms.py:108 ipam/forms/model_forms.py:130 +#: ipam/forms/model_forms.py:148 ipam/models/asns.py:31 +#: ipam/models/asns.py:103 ipam/models/ip.py:70 ipam/models/ip.py:89 +#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 +#: templates/ipam/aggregate.html:19 templates/ipam/asn.html:28 +#: templates/ipam/asnrange.html:20 templates/ipam/rir.html:20 +msgid "RIR" +msgstr "RIR" + +#: ipam/forms/bulk_edit.py:168 +msgid "Date added" +msgstr "Data adicionada" + +#: ipam/forms/bulk_edit.py:229 +msgid "Prefix length" +msgstr "Comprimento do prefixo" + +#: ipam/forms/bulk_edit.py:252 ipam/forms/filtersets.py:236 +#: templates/ipam/prefix.html:86 +msgid "Is a pool" +msgstr "É uma piscina" + +#: ipam/forms/bulk_edit.py:257 ipam/forms/bulk_edit.py:301 +#: ipam/models/ip.py:271 ipam/models/ip.py:538 +#, python-format +msgid "Treat as 100% utilized" +msgstr "Trate como 100% utilizado" + +#: ipam/forms/bulk_edit.py:349 ipam/models/ip.py:771 +msgid "DNS name" +msgstr "Nome DNS" + +#: ipam/forms/bulk_edit.py:370 ipam/forms/bulk_edit.py:569 +#: ipam/forms/bulk_import.py:393 ipam/forms/bulk_import.py:477 +#: ipam/forms/bulk_import.py:503 ipam/forms/filtersets.py:376 +#: ipam/forms/filtersets.py:511 templates/ipam/fhrpgroup.html:23 +#: templates/ipam/inc/panels/fhrp_groups.html:11 +#: templates/ipam/service.html:35 templates/ipam/servicetemplate.html:20 +msgid "Protocol" +msgstr "Protocolo" + +#: ipam/forms/bulk_edit.py:377 ipam/forms/filtersets.py:383 +#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:27 +msgid "Group ID" +msgstr "ID do grupo" + +#: ipam/forms/bulk_edit.py:382 ipam/forms/filtersets.py:388 +#: wireless/forms/bulk_edit.py:67 wireless/forms/bulk_edit.py:114 +#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 +#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 +#: wireless/forms/filtersets.py:53 wireless/forms/filtersets.py:87 +msgid "Authentication type" +msgstr "Tipo de autenticação" + +#: ipam/forms/bulk_edit.py:387 ipam/forms/filtersets.py:392 +msgid "Authentication key" +msgstr "Chave de autenticação" + +#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:369 +#: ipam/forms/model_forms.py:455 netbox/navigation/menu.py:376 +#: templates/ipam/fhrpgroup.html:51 +#: templates/wireless/inc/authentication_attrs.html:5 +#: wireless/forms/bulk_edit.py:90 wireless/forms/bulk_edit.py:137 +#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: wireless/forms/model_forms.py:56 wireless/forms/model_forms.py:161 +msgid "Authentication" +msgstr "Autenticação" + +#: ipam/forms/bulk_edit.py:414 +msgid "Minimum child VLAN VID" +msgstr "VLAN infantil mínima VID" + +#: ipam/forms/bulk_edit.py:420 +msgid "Maximum child VLAN VID" +msgstr "VLAN infantil máximo VID" + +#: ipam/forms/bulk_edit.py:428 ipam/forms/model_forms.py:527 +msgid "Scope type" +msgstr "Tipo de escopo" + +#: ipam/forms/bulk_edit.py:489 ipam/forms/model_forms.py:600 +#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:39 +msgid "Scope" +msgstr "Escopo" + +#: ipam/forms/bulk_edit.py:560 +msgid "Site & Group" +msgstr "Site e grupo" + +#: ipam/forms/bulk_edit.py:574 ipam/forms/model_forms.py:663 +#: ipam/forms/model_forms.py:697 ipam/tables/services.py:19 +#: ipam/tables/services.py:49 templates/ipam/service.html:39 +#: templates/ipam/servicetemplate.html:24 +msgid "Ports" +msgstr "Portos" + +#: ipam/forms/bulk_import.py:47 +msgid "Import route targets" +msgstr "Importar destinos de rota" + +#: ipam/forms/bulk_import.py:53 +msgid "Export route targets" +msgstr "Exportar destinos de rota" + +#: ipam/forms/bulk_import.py:91 ipam/forms/bulk_import.py:111 +#: ipam/forms/bulk_import.py:131 +msgid "Assigned RIR" +msgstr "RIR atribuído" + +#: ipam/forms/bulk_import.py:181 +msgid "VLAN's group (if any)" +msgstr "Grupo de VLANs (se houver)" + +#: ipam/forms/bulk_import.py:184 ipam/forms/model_forms.py:219 +#: ipam/models/vlans.py:214 ipam/tables/ip.py:254 +#: templates/ipam/prefix.html:61 templates/ipam/vlan.html:13 +#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 +#: templates/vpn/l2vpntermination_edit.html:17 +#: templates/wireless/wirelesslan.html:31 vpn/forms/bulk_import.py:299 +#: vpn/forms/filtersets.py:280 vpn/forms/model_forms.py:427 +#: wireless/forms/bulk_edit.py:54 wireless/forms/bulk_import.py:48 +#: wireless/forms/model_forms.py:49 wireless/models.py:101 +msgid "VLAN" +msgstr "VLAN" + +#: ipam/forms/bulk_import.py:307 +msgid "Parent device of assigned interface (if any)" +msgstr "Dispositivo principal da interface atribuída (se houver)" + +#: ipam/forms/bulk_import.py:310 ipam/forms/bulk_import.py:496 +#: ipam/forms/model_forms.py:691 virtualization/filtersets.py:282 +#: virtualization/filtersets.py:321 virtualization/forms/bulk_edit.py:199 +#: virtualization/forms/bulk_edit.py:325 +#: virtualization/forms/bulk_import.py:146 +#: virtualization/forms/bulk_import.py:207 +#: virtualization/forms/filtersets.py:204 +#: virtualization/forms/filtersets.py:240 +#: virtualization/forms/model_forms.py:291 vpn/forms/bulk_import.py:93 +#: vpn/forms/bulk_import.py:285 +msgid "Virtual machine" +msgstr "Máquina virtual" + +#: ipam/forms/bulk_import.py:314 +msgid "Parent VM of assigned interface (if any)" +msgstr "VM principal da interface atribuída (se houver)" + +#: ipam/forms/bulk_import.py:321 +msgid "Assigned interface" +msgstr "Interface atribuída" + +#: ipam/forms/bulk_import.py:324 +msgid "Is primary" +msgstr "É primário" + +#: ipam/forms/bulk_import.py:325 +msgid "Make this the primary IP for the assigned device" +msgstr "Torne esse o IP primário do dispositivo atribuído" + +#: ipam/forms/bulk_import.py:364 +msgid "No device or virtual machine specified; cannot set as primary IP" +msgstr "" +"Nenhum dispositivo ou máquina virtual especificado; não pode ser definido " +"como IP primário" + +#: ipam/forms/bulk_import.py:368 +msgid "No interface specified; cannot set as primary IP" +msgstr "" +"Nenhuma interface especificada; não é possível definir como IP primário" + +#: ipam/forms/bulk_import.py:397 +msgid "Auth type" +msgstr "Tipo de autenticação" + +#: ipam/forms/bulk_import.py:412 +msgid "Scope type (app & model)" +msgstr "Tipo de escopo (aplicativo e modelo)" + +#: ipam/forms/bulk_import.py:418 +#, python-brace-format +msgid "Minimum child VLAN VID (default: {minimum})" +msgstr "VLAN filho mínimo (VID) (padrão: {minimum})" + +#: ipam/forms/bulk_import.py:424 +#, python-brace-format +msgid "Maximum child VLAN VID (default: {maximum})" +msgstr "VLAN filho máximo (VID) (padrão): {maximum})" + +#: ipam/forms/bulk_import.py:448 +msgid "Assigned VLAN group" +msgstr "Grupo de VLAN atribuído" + +#: ipam/forms/bulk_import.py:479 ipam/forms/bulk_import.py:505 +msgid "IP protocol" +msgstr "Protocolo IP" + +#: ipam/forms/bulk_import.py:493 +msgid "Required if not assigned to a VM" +msgstr "Obrigatório se não for atribuído a uma VM" + +#: ipam/forms/bulk_import.py:500 +msgid "Required if not assigned to a device" +msgstr "Obrigatório se não estiver atribuído a um dispositivo" + +#: ipam/forms/bulk_import.py:525 +#, python-brace-format +msgid "{ip} is not assigned to this device/VM." +msgstr "{ip} não está atribuído a esse dispositivo/VM." + +#: ipam/forms/filtersets.py:46 ipam/forms/model_forms.py:60 +#: netbox/navigation/menu.py:177 vpn/forms/model_forms.py:403 +msgid "Route Targets" +msgstr "Alvos da rota" + +#: ipam/forms/filtersets.py:52 ipam/forms/model_forms.py:47 +#: vpn/forms/filtersets.py:221 vpn/forms/model_forms.py:390 +msgid "Import targets" +msgstr "Alvos de importação" + +#: ipam/forms/filtersets.py:57 ipam/forms/model_forms.py:52 +#: vpn/forms/filtersets.py:226 vpn/forms/model_forms.py:395 +msgid "Export targets" +msgstr "Alvos de exportação" + +#: ipam/forms/filtersets.py:72 +msgid "Imported by VRF" +msgstr "Importado pela VRF" + +#: ipam/forms/filtersets.py:77 +msgid "Exported by VRF" +msgstr "Exportado por VRF" + +#: ipam/forms/filtersets.py:86 ipam/tables/ip.py:89 templates/ipam/rir.html:33 +msgid "Private" +msgstr "Privado" + +#: ipam/forms/filtersets.py:104 ipam/forms/filtersets.py:186 +#: ipam/forms/filtersets.py:261 ipam/forms/filtersets.py:312 +msgid "Address family" +msgstr "Família de endereços" + +#: ipam/forms/filtersets.py:118 templates/ipam/asnrange.html:26 +msgid "Range" +msgstr "Alcance" + +#: ipam/forms/filtersets.py:127 +msgid "Start" +msgstr "Iniciar" + +#: ipam/forms/filtersets.py:131 +msgid "End" +msgstr "Fim" + +#: ipam/forms/filtersets.py:181 +msgid "Search within" +msgstr "Pesquisar dentro" + +#: ipam/forms/filtersets.py:202 ipam/forms/filtersets.py:328 +msgid "Present in VRF" +msgstr "Presente em VRF" + +#: ipam/forms/filtersets.py:243 ipam/forms/filtersets.py:282 +#, python-format +msgid "Marked as 100% utilized" +msgstr "Marcado como 100% utilizado" + +#: ipam/forms/filtersets.py:297 +msgid "Device/VM" +msgstr "Dispositivo/VM" + +#: ipam/forms/filtersets.py:333 +msgid "Assigned Device" +msgstr "Dispositivo atribuído" + +#: ipam/forms/filtersets.py:338 +msgid "Assigned VM" +msgstr "VM atribuída" + +#: ipam/forms/filtersets.py:352 +msgid "Assigned to an interface" +msgstr "Atribuído a uma interface" + +#: ipam/forms/filtersets.py:359 templates/ipam/ipaddress.html:54 +msgid "DNS Name" +msgstr "Nome do DNS" + +#: ipam/forms/filtersets.py:401 ipam/forms/filtersets.py:494 +#: ipam/models/vlans.py:156 templates/ipam/vlan.html:34 +msgid "VLAN ID" +msgstr "ID DA VLAN" + +#: ipam/forms/filtersets.py:433 +msgid "Minimum VID" +msgstr "VID mínimo" + +#: ipam/forms/filtersets.py:439 +msgid "Maximum VID" +msgstr "VID máximo" + +#: ipam/forms/filtersets.py:516 +msgid "Port" +msgstr "Porto" + +#: ipam/forms/filtersets.py:537 ipam/tables/vlans.py:191 +#: templates/ipam/ipaddress_edit.html:47 templates/ipam/service_create.html:22 +#: templates/ipam/service_edit.html:21 +#: templates/virtualization/virtualdisk.html:22 +#: templates/virtualization/virtualmachine.html:13 +#: templates/virtualization/vminterface.html:24 +#: templates/vpn/l2vpntermination_edit.html:27 +#: templates/vpn/tunneltermination.html:26 +#: virtualization/forms/filtersets.py:189 +#: virtualization/forms/filtersets.py:234 +#: virtualization/forms/model_forms.py:223 +#: virtualization/tables/virtualmachines.py:115 +#: virtualization/tables/virtualmachines.py:168 vpn/choices.py:45 +#: vpn/forms/filtersets.py:289 vpn/forms/model_forms.py:161 +#: vpn/forms/model_forms.py:172 vpn/forms/model_forms.py:269 +msgid "Virtual Machine" +msgstr "Máquina virtual" + +#: ipam/forms/model_forms.py:113 ipam/tables/ip.py:116 +#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:39 +msgid "Aggregate" +msgstr "Agregar" + +#: ipam/forms/model_forms.py:134 templates/ipam/asnrange.html:12 +msgid "ASN Range" +msgstr "Intervalo ASN" + +#: ipam/forms/model_forms.py:230 +msgid "Site/VLAN Assignment" +msgstr "Atribuição de site/VLAN" + +#: ipam/forms/model_forms.py:256 templates/ipam/iprange.html:11 +msgid "IP Range" +msgstr "Intervalo de IP" + +#: ipam/forms/model_forms.py:285 ipam/forms/model_forms.py:454 +#: templates/ipam/fhrpgroup.html:19 templates/ipam/ipaddress_edit.html:52 +msgid "FHRP Group" +msgstr "Grupo FHRP" + +#: ipam/forms/model_forms.py:300 +msgid "Make this the primary IP for the device/VM" +msgstr "Torne esse o IP primário do dispositivo/VM" + +#: ipam/forms/model_forms.py:351 +msgid "An IP address can only be assigned to a single object." +msgstr "Um endereço IP só pode ser atribuído a um único objeto." + +#: ipam/forms/model_forms.py:357 ipam/models/ip.py:878 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Não é possível reatribuir o endereço IP enquanto ele estiver designado como " +"o IP principal do objeto pai" + +#: ipam/forms/model_forms.py:367 +msgid "" +"Only IP addresses assigned to an interface can be designated as primary IPs." +msgstr "" +"Somente endereços IP atribuídos a uma interface podem ser designados como " +"IPs primários." + +#: ipam/forms/model_forms.py:373 +#, python-brace-format +msgid "{ip} is a network ID, which may not be assigned to an interface." +msgstr "{ip} é uma ID de rede, que não pode ser atribuída a uma interface." + +#: ipam/forms/model_forms.py:379 +#, python-brace-format +msgid "" +"{ip} is a broadcast address, which may not be assigned to an interface." +msgstr "" +"{ip} é um endereço de transmissão, que não pode ser atribuído a uma " +"interface." + +#: ipam/forms/model_forms.py:456 +msgid "Virtual IP Address" +msgstr "Endereço IP virtual" + +#: ipam/forms/model_forms.py:598 ipam/forms/model_forms.py:637 +#: ipam/tables/ip.py:250 templates/ipam/vlan_edit.html:37 +#: templates/ipam/vlangroup.html:27 +msgid "VLAN Group" +msgstr "Grupo VLAN" + +#: ipam/forms/model_forms.py:599 +msgid "Child VLANs" +msgstr "VLANs secundários" + +#: ipam/forms/model_forms.py:668 ipam/forms/model_forms.py:702 +msgid "" +"Comma-separated list of one or more port numbers. A range may be specified " +"using a hyphen." +msgstr "" +"Lista separada por vírgula de um ou mais números de porta. Um intervalo pode" +" ser especificado usando um hífen." + +#: ipam/forms/model_forms.py:673 templates/ipam/servicetemplate.html:12 +msgid "Service Template" +msgstr "Modelo de serviço" + +#: ipam/forms/model_forms.py:724 +msgid "Service template" +msgstr "Modelo de serviço" + +#: ipam/models/asns.py:34 +msgid "start" +msgstr "iniciar" + +#: ipam/models/asns.py:51 +msgid "ASN range" +msgstr "faixa ASN" + +#: ipam/models/asns.py:52 +msgid "ASN ranges" +msgstr "Intervalos ASN" + +#: ipam/models/asns.py:72 +#, python-brace-format +msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." +msgstr "Iniciando o ASN ({start}) deve ser menor do que o ASN final ({end})." + +#: ipam/models/asns.py:104 +msgid "Regional Internet Registry responsible for this AS number space" +msgstr "Registro regional da Internet responsável por esse espaço numérico AS" + +#: ipam/models/asns.py:109 +msgid "16- or 32-bit autonomous system number" +msgstr "Número de sistema autônomo de 16 ou 32 bits" + +#: ipam/models/fhrp.py:22 +msgid "group ID" +msgstr "ID do grupo" + +#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +msgid "protocol" +msgstr "protocolo" + +#: ipam/models/fhrp.py:38 wireless/models.py:27 +msgid "authentication type" +msgstr "tipo de autenticação" + +#: ipam/models/fhrp.py:43 +msgid "authentication key" +msgstr "chave de autenticação" + +#: ipam/models/fhrp.py:56 +msgid "FHRP group" +msgstr "Grupo FHRP" + +#: ipam/models/fhrp.py:57 +msgid "FHRP groups" +msgstr "Grupos FHRP" + +#: ipam/models/fhrp.py:93 tenancy/models/contacts.py:134 +msgid "priority" +msgstr "prioridade" + +#: ipam/models/fhrp.py:113 +msgid "FHRP group assignment" +msgstr "Atribuição em grupo do FHRP" + +#: ipam/models/fhrp.py:114 +msgid "FHRP group assignments" +msgstr "Atribuições em grupo do FHRP" + +#: ipam/models/ip.py:64 +msgid "private" +msgstr "privado" + +#: ipam/models/ip.py:65 +msgid "IP space managed by this RIR is considered private" +msgstr "O espaço IP gerenciado por este RIR é considerado privado" + +#: ipam/models/ip.py:71 netbox/navigation/menu.py:170 +msgid "RIRs" +msgstr "RIRs" + +#: ipam/models/ip.py:83 +msgid "IPv4 or IPv6 network" +msgstr "Rede IPv4 ou IPv6" + +#: ipam/models/ip.py:90 +msgid "Regional Internet Registry responsible for this IP space" +msgstr "Registro regional da Internet responsável por esse espaço IP" + +#: ipam/models/ip.py:100 +msgid "date added" +msgstr "data adicionada" + +#: ipam/models/ip.py:114 +msgid "aggregate" +msgstr "agregar" + +#: ipam/models/ip.py:115 +msgid "aggregates" +msgstr "agregados" + +#: ipam/models/ip.py:131 +msgid "Cannot create aggregate with /0 mask." +msgstr "Não é possível criar agregação com máscara /0." + +#: ipam/models/ip.py:143 +#, python-brace-format +msgid "" +"Aggregates cannot overlap. {prefix} is already covered by an existing " +"aggregate ({aggregate})." +msgstr "" +"Os agregados não podem se sobrepor. {prefix} já está coberto por um agregado" +" existente ({aggregate})." + +#: ipam/models/ip.py:157 +#, python-brace-format +msgid "" +"Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " +"({aggregate})." +msgstr "" +"Os prefixos não podem se sobrepor aos agregados. {prefix} cobre um agregado " +"existente ({aggregate})." + +#: ipam/models/ip.py:199 ipam/models/ip.py:736 vpn/models/tunnels.py:114 +msgid "role" +msgstr "função" + +#: ipam/models/ip.py:200 +msgid "roles" +msgstr "papéis" + +#: ipam/models/ip.py:216 ipam/models/ip.py:292 +msgid "prefix" +msgstr "prefixo" + +#: ipam/models/ip.py:217 +msgid "IPv4 or IPv6 network with mask" +msgstr "Rede IPv4 ou IPv6 com máscara" + +#: ipam/models/ip.py:253 +msgid "Operational status of this prefix" +msgstr "Status operacional desse prefixo" + +#: ipam/models/ip.py:261 +msgid "The primary function of this prefix" +msgstr "A função primária desse prefixo" + +#: ipam/models/ip.py:264 +msgid "is a pool" +msgstr "é uma piscina" + +#: ipam/models/ip.py:266 +msgid "All IP addresses within this prefix are considered usable" +msgstr "" +"Todos os endereços IP dentro desse prefixo são considerados utilizáveis" + +#: ipam/models/ip.py:269 ipam/models/ip.py:536 +msgid "mark utilized" +msgstr "marca utilizada" + +#: ipam/models/ip.py:293 +msgid "prefixes" +msgstr "prefixos" + +#: ipam/models/ip.py:316 +msgid "Cannot create prefix with /0 mask." +msgstr "Não é possível criar prefixo com a máscara /0." + +#: ipam/models/ip.py:323 ipam/models/ip.py:854 +#, python-brace-format +msgid "VRF {vrf}" +msgstr "VRF {vrf}" + +#: ipam/models/ip.py:323 ipam/models/ip.py:854 +msgid "global table" +msgstr "tabela global" + +#: ipam/models/ip.py:325 +#, python-brace-format +msgid "Duplicate prefix found in {table}: {prefix}" +msgstr "Prefixo duplicado encontrado em {table}: {prefix}" + +#: ipam/models/ip.py:494 +msgid "start address" +msgstr "endereço inicial" + +#: ipam/models/ip.py:495 ipam/models/ip.py:499 ipam/models/ip.py:711 +msgid "IPv4 or IPv6 address (with mask)" +msgstr "Endereço IPv4 ou IPv6 (com máscara)" + +#: ipam/models/ip.py:498 +msgid "end address" +msgstr "endereço final" + +#: ipam/models/ip.py:525 +msgid "Operational status of this range" +msgstr "Status operacional dessa faixa" + +#: ipam/models/ip.py:533 +msgid "The primary function of this range" +msgstr "A função principal desse intervalo" + +#: ipam/models/ip.py:547 +msgid "IP range" +msgstr "Intervalo de IP" + +#: ipam/models/ip.py:548 +msgid "IP ranges" +msgstr "Intervalos de IP" + +#: ipam/models/ip.py:564 +msgid "Starting and ending IP address versions must match" +msgstr "As versões inicial e final do endereço IP devem corresponder" + +#: ipam/models/ip.py:570 +msgid "Starting and ending IP address masks must match" +msgstr "As máscaras de endereço IP inicial e final devem corresponder" + +#: ipam/models/ip.py:577 +#, python-brace-format +msgid "" +"Ending address must be lower than the starting address ({start_address})" +msgstr "" +"O endereço final deve ser menor que o endereço inicial ({start_address})" + +#: ipam/models/ip.py:589 +#, python-brace-format +msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" +msgstr "" +"Endereços definidos se sobrepõem ao intervalo {overlapping_range} em VRF " +"{vrf}" + +#: ipam/models/ip.py:598 +#, python-brace-format +msgid "Defined range exceeds maximum supported size ({max_size})" +msgstr "O intervalo definido excede o tamanho máximo suportado ({max_size})" + +#: ipam/models/ip.py:710 tenancy/models/contacts.py:82 +msgid "address" +msgstr "abordar" + +#: ipam/models/ip.py:733 +msgid "The operational status of this IP" +msgstr "O status operacional desse IP" + +#: ipam/models/ip.py:740 +msgid "The functional role of this IP" +msgstr "O papel funcional desse IP" + +#: ipam/models/ip.py:764 templates/ipam/ipaddress.html:75 +msgid "NAT (inside)" +msgstr "NAT (interno)" + +#: ipam/models/ip.py:765 +msgid "The IP for which this address is the \"outside\" IP" +msgstr "O IP para o qual esse endereço é o IP “externo”" + +#: ipam/models/ip.py:772 +msgid "Hostname or FQDN (not case-sensitive)" +msgstr "Nome do host ou FQDN (não diferencia maiúsculas de minúsculas)" + +#: ipam/models/ip.py:788 ipam/models/services.py:94 +msgid "IP addresses" +msgstr "Endereços IP" + +#: ipam/models/ip.py:844 +msgid "Cannot create IP address with /0 mask." +msgstr "Não é possível criar endereço IP com máscara /0." + +#: ipam/models/ip.py:856 +#, python-brace-format +msgid "Duplicate IP address found in {table}: {ipaddress}" +msgstr "Endereço IP duplicado encontrado em {table}: {ipaddress}" + +#: ipam/models/ip.py:885 +msgid "Only IPv6 addresses can be assigned SLAAC status" +msgstr "Somente endereços IPv6 podem receber o status SLAAC" + +#: ipam/models/services.py:33 +msgid "port numbers" +msgstr "números de porta" + +#: ipam/models/services.py:59 +msgid "service template" +msgstr "modelo de serviço" + +#: ipam/models/services.py:60 +msgid "service templates" +msgstr "modelos de serviço" + +#: ipam/models/services.py:95 +msgid "The specific IP addresses (if any) to which this service is bound" +msgstr "" +"Os endereços IP específicos (se houver) aos quais esse serviço está " +"vinculado" + +#: ipam/models/services.py:102 +msgid "service" +msgstr "manutenção" + +#: ipam/models/services.py:103 +msgid "services" +msgstr "serviços" + +#: ipam/models/services.py:117 +msgid "" +"A service cannot be associated with both a device and a virtual machine." +msgstr "" +"Um serviço não pode ser associado a um dispositivo e a uma máquina virtual." + +#: ipam/models/services.py:119 +msgid "" +"A service must be associated with either a device or a virtual machine." +msgstr "" +"Um serviço deve estar associado a um dispositivo ou a uma máquina virtual." + +#: ipam/models/vlans.py:49 +msgid "minimum VLAN ID" +msgstr "ID mínimo de VLAN" + +#: ipam/models/vlans.py:55 +msgid "Lowest permissible ID of a child VLAN" +msgstr "ID mais baixa permitida de uma VLAN secundária" + +#: ipam/models/vlans.py:58 +msgid "maximum VLAN ID" +msgstr "ID máximo de VLAN" + +#: ipam/models/vlans.py:64 +msgid "Highest permissible ID of a child VLAN" +msgstr "ID mais alta permitida de uma VLAN secundária" + +#: ipam/models/vlans.py:85 +msgid "VLAN groups" +msgstr "Grupos de VLAN" + +#: ipam/models/vlans.py:95 +msgid "Cannot set scope_type without scope_id." +msgstr "Não é possível definir scope_type sem scope_id." + +#: ipam/models/vlans.py:97 +msgid "Cannot set scope_id without scope_type." +msgstr "Não é possível definir scope_id sem scope_type." + +#: ipam/models/vlans.py:102 +msgid "Maximum child VID must be greater than or equal to minimum child VID" +msgstr "" +"O VID máximo da criança deve ser maior ou igual ao VID mínimo da criança" + +#: ipam/models/vlans.py:145 +msgid "The specific site to which this VLAN is assigned (if any)" +msgstr "O site específico ao qual essa VLAN está atribuída (se houver)" + +#: ipam/models/vlans.py:153 +msgid "VLAN group (optional)" +msgstr "Grupo de VLAN (opcional)" + +#: ipam/models/vlans.py:161 +msgid "Numeric VLAN ID (1-4094)" +msgstr "ID numérica da VLAN (1-4094)" + +#: ipam/models/vlans.py:179 +msgid "Operational status of this VLAN" +msgstr "Status operacional desta VLAN" + +#: ipam/models/vlans.py:187 +msgid "The primary function of this VLAN" +msgstr "A função principal desta VLAN" + +#: ipam/models/vlans.py:215 ipam/tables/ip.py:175 ipam/tables/vlans.py:78 +#: ipam/views.py:940 netbox/navigation/menu.py:181 +#: netbox/navigation/menu.py:183 +msgid "VLANs" +msgstr "VLANs" + +#: ipam/models/vlans.py:230 +#, python-brace-format +msgid "" +"VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " +"site {site}." +msgstr "" +"A VLAN é atribuída ao grupo {group} (escopo: {scope}); também não pode " +"atribuir ao site {site}." + +#: ipam/models/vlans.py:238 +#, python-brace-format +msgid "VID must be between {minimum} and {maximum} for VLANs in group {group}" +msgstr "" +"O VID deve estar entre {minimum} e {maximum} para VLANs em grupo {group}" + +#: ipam/models/vrfs.py:30 +msgid "route distinguisher" +msgstr "distintor de rota" + +#: ipam/models/vrfs.py:31 +msgid "Unique route distinguisher (as defined in RFC 4364)" +msgstr "Distintivo de rota exclusivo (conforme definido na RFC 4364)" + +#: ipam/models/vrfs.py:42 +msgid "enforce unique space" +msgstr "imponha um espaço exclusivo" + +#: ipam/models/vrfs.py:43 +msgid "Prevent duplicate prefixes/IP addresses within this VRF" +msgstr "Evite prefixos/endereços IP duplicados dentro deste VRF" + +#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:174 +#: netbox/navigation/menu.py:176 +msgid "VRFs" +msgstr "VRFs" + +#: ipam/models/vrfs.py:82 +msgid "Route target value (formatted in accordance with RFC 4360)" +msgstr "Valor alvo da rota (formatado de acordo com a RFC 4360)" + +#: ipam/models/vrfs.py:94 +msgid "route target" +msgstr "alvo da rota" + +#: ipam/models/vrfs.py:95 +msgid "route targets" +msgstr "alvos da rota" + +#: ipam/tables/asn.py:52 +msgid "ASDOT" +msgstr "ASDOT" + +#: ipam/tables/asn.py:57 +msgid "Site Count" +msgstr "Contagem de sites" + +#: ipam/tables/asn.py:62 +msgid "Provider Count" +msgstr "Contagem de fornecedores" + +#: ipam/tables/ip.py:94 netbox/navigation/menu.py:167 +#: netbox/navigation/menu.py:169 +msgid "Aggregates" +msgstr "Agregados" + +#: ipam/tables/ip.py:124 +msgid "Added" +msgstr "Adicionado" + +#: ipam/tables/ip.py:127 ipam/tables/ip.py:165 ipam/tables/vlans.py:138 +#: ipam/views.py:349 netbox/navigation/menu.py:153 +#: netbox/navigation/menu.py:155 templates/ipam/vlan.html:87 +msgid "Prefixes" +msgstr "Prefixos" + +#: ipam/tables/ip.py:130 ipam/tables/ip.py:267 ipam/tables/ip.py:320 +#: ipam/tables/vlans.py:82 templates/dcim/device.html:263 +#: templates/ipam/aggregate.html:25 templates/ipam/iprange.html:32 +#: templates/ipam/prefix.html:100 +msgid "Utilization" +msgstr "Utilização" + +#: ipam/tables/ip.py:170 netbox/navigation/menu.py:149 +msgid "IP Ranges" +msgstr "Intervalos de IP" + +#: ipam/tables/ip.py:220 +msgid "Prefix (Flat)" +msgstr "Prefixo (plano)" + +#: ipam/tables/ip.py:224 templates/dcim/rack_edit.html:52 +msgid "Depth" +msgstr "Profundidade" + +#: ipam/tables/ip.py:261 +msgid "Pool" +msgstr "Piscina" + +#: ipam/tables/ip.py:264 ipam/tables/ip.py:317 +msgid "Marked Utilized" +msgstr "Marcado como utilizado" + +#: ipam/tables/ip.py:301 +msgid "Start address" +msgstr "Endereço inicial" + +#: ipam/tables/ip.py:379 +msgid "NAT (Inside)" +msgstr "NAT (interno)" + +#: ipam/tables/ip.py:384 +msgid "NAT (Outside)" +msgstr "NAT (ao ar livre)" + +#: ipam/tables/ip.py:389 +msgid "Assigned" +msgstr "Atribuído" + +#: ipam/tables/ip.py:424 templates/vpn/l2vpntermination.html:19 +#: vpn/forms/filtersets.py:235 +msgid "Assigned Object" +msgstr "Objeto atribuído" + +#: ipam/tables/vlans.py:68 +msgid "Scope Type" +msgstr "Tipo de escopo" + +#: ipam/tables/vlans.py:107 ipam/tables/vlans.py:210 +#: templates/dcim/inc/interface_vlans_table.html:4 +msgid "VID" +msgstr "VÍDEO" + +#: ipam/tables/vrfs.py:30 +msgid "RD" +msgstr "VERMELHO" + +#: ipam/tables/vrfs.py:33 +msgid "Unique" +msgstr "Único" + +#: ipam/tables/vrfs.py:36 vpn/tables/l2vpn.py:27 +msgid "Import Targets" +msgstr "Alvos de importação" + +#: ipam/tables/vrfs.py:41 vpn/tables/l2vpn.py:32 +msgid "Export Targets" +msgstr "Alvos de exportação" + +#: ipam/views.py:536 +msgid "Child Prefixes" +msgstr "Prefixos infantis" + +#: ipam/views.py:571 +msgid "Child Ranges" +msgstr "Intervalos para crianças" + +#: ipam/views.py:868 +msgid "Related IPs" +msgstr "IPs relacionados" + +#: ipam/views.py:1091 +msgid "Device Interfaces" +msgstr "Interfaces de dispositivos" + +#: ipam/views.py:1109 +msgid "VM Interfaces" +msgstr "Interfaces de VM" + +#: netbox/config/parameters.py:22 templates/core/configrevision.html:111 +msgid "Login banner" +msgstr "Banner de login" + +#: netbox/config/parameters.py:24 +msgid "Additional content to display on the login page" +msgstr "Conteúdo adicional para exibir na página de login" + +#: netbox/config/parameters.py:33 templates/core/configrevision.html:115 +msgid "Maintenance banner" +msgstr "Banner de manutenção" + +#: netbox/config/parameters.py:35 +msgid "Additional content to display when in maintenance mode" +msgstr "Conteúdo adicional a ser exibido no modo de manutenção" + +#: netbox/config/parameters.py:44 templates/core/configrevision.html:119 +msgid "Top banner" +msgstr "Banner superior" + +#: netbox/config/parameters.py:46 +msgid "Additional content to display at the top of every page" +msgstr "Conteúdo adicional para exibir na parte superior de cada página" + +#: netbox/config/parameters.py:55 templates/core/configrevision.html:123 +msgid "Bottom banner" +msgstr "Banner inferior" + +#: netbox/config/parameters.py:57 +msgid "Additional content to display at the bottom of every page" +msgstr "Conteúdo adicional para exibir na parte inferior de cada página" + +#: netbox/config/parameters.py:68 +msgid "Globally unique IP space" +msgstr "Espaço IP globalmente exclusivo" + +#: netbox/config/parameters.py:70 +msgid "Enforce unique IP addressing within the global table" +msgstr "Imponha o endereçamento IP exclusivo na tabela global" + +#: netbox/config/parameters.py:75 templates/core/configrevision.html:87 +msgid "Prefer IPv4" +msgstr "Prefiro IPv4" + +#: netbox/config/parameters.py:77 +msgid "Prefer IPv4 addresses over IPv6" +msgstr "Prefira endereços IPv4 em vez de IPv6" + +#: netbox/config/parameters.py:84 +msgid "Rack unit height" +msgstr "Altura da unidade de rack" + +#: netbox/config/parameters.py:86 +msgid "Default unit height for rendered rack elevations" +msgstr "Altura padrão da unidade para elevações de rack renderizadas" + +#: netbox/config/parameters.py:91 +msgid "Rack unit width" +msgstr "Largura da unidade de rack" + +#: netbox/config/parameters.py:93 +msgid "Default unit width for rendered rack elevations" +msgstr "Largura padrão da unidade para elevações de rack renderizadas" + +#: netbox/config/parameters.py:100 +msgid "Powerfeed voltage" +msgstr "Tensão de alimentação" + +#: netbox/config/parameters.py:102 +msgid "Default voltage for powerfeeds" +msgstr "Tensão padrão para alimentações de energia" + +#: netbox/config/parameters.py:107 +msgid "Powerfeed amperage" +msgstr "Amperagem de alimentação de energia" + +#: netbox/config/parameters.py:109 +msgid "Default amperage for powerfeeds" +msgstr "Amperagem padrão para alimentações de energia" + +#: netbox/config/parameters.py:114 +msgid "Powerfeed max utilization" +msgstr "Utilização máxima da alimentação de energia" + +#: netbox/config/parameters.py:116 +msgid "Default max utilization for powerfeeds" +msgstr "Utilização máxima padrão para alimentações de energia" + +#: netbox/config/parameters.py:123 templates/core/configrevision.html:99 +msgid "Allowed URL schemes" +msgstr "Esquemas de URL permitidos" + +#: netbox/config/parameters.py:128 +msgid "Permitted schemes for URLs in user-provided content" +msgstr "Esquemas permitidos para URLs em conteúdo fornecido pelo usuário" + +#: netbox/config/parameters.py:136 +msgid "Default page size" +msgstr "Tamanho de página padrão" + +#: netbox/config/parameters.py:142 +msgid "Maximum page size" +msgstr "Tamanho máximo da página" + +#: netbox/config/parameters.py:150 templates/core/configrevision.html:151 +msgid "Custom validators" +msgstr "Validadores personalizados" + +#: netbox/config/parameters.py:152 +msgid "Custom validation rules (JSON)" +msgstr "Regras de validação personalizadas (JSON)" + +#: netbox/config/parameters.py:160 templates/core/configrevision.html:161 +msgid "Protection rules" +msgstr "Regras de proteção" + +#: netbox/config/parameters.py:162 +msgid "Deletion protection rules (JSON)" +msgstr "Regras de proteção contra exclusão (JSON)" + +#: netbox/config/parameters.py:172 +msgid "Default preferences" +msgstr "Preferências padrão" + +#: netbox/config/parameters.py:174 +msgid "Default preferences for new users" +msgstr "Preferências padrão para novos usuários" + +#: netbox/config/parameters.py:181 templates/core/configrevision.html:197 +msgid "Maintenance mode" +msgstr "Modo de manutenção" + +#: netbox/config/parameters.py:183 +msgid "Enable maintenance mode" +msgstr "Ativar o modo de manutenção" + +#: netbox/config/parameters.py:188 templates/core/configrevision.html:201 +msgid "GraphQL enabled" +msgstr "GraphQL habilitado" + +#: netbox/config/parameters.py:190 +msgid "Enable the GraphQL API" +msgstr "Habilite a API GraphQL" + +#: netbox/config/parameters.py:195 templates/core/configrevision.html:205 +msgid "Changelog retention" +msgstr "Retenção do changelog" + +#: netbox/config/parameters.py:197 +msgid "Days to retain changelog history (set to zero for unlimited)" +msgstr "" +"Dias para reter o histórico do changelog (definido como zero para uso " +"ilimitado)" + +#: netbox/config/parameters.py:202 +msgid "Job result retention" +msgstr "Retenção de resultados de trabalho" + +#: netbox/config/parameters.py:204 +msgid "Days to retain job result history (set to zero for unlimited)" +msgstr "" +"Dias para reter o histórico de resultados do trabalho (definido como zero " +"para uso ilimitado)" + +#: netbox/config/parameters.py:209 templates/core/configrevision.html:213 +msgid "Maps URL" +msgstr "URL dos mapas" + +#: netbox/config/parameters.py:211 +msgid "Base URL for mapping geographic locations" +msgstr "URL base para mapear localizações geográficas" + +#: netbox/forms/__init__.py:13 +msgid "Partial match" +msgstr "Correspondência parcial" + +#: netbox/forms/__init__.py:14 +msgid "Exact match" +msgstr "Correspondência exata" + +#: netbox/forms/__init__.py:15 +msgid "Starts with" +msgstr "Começa com" + +#: netbox/forms/__init__.py:16 +msgid "Ends with" +msgstr "Termina com" + +#: netbox/forms/__init__.py:17 +msgid "Regex" +msgstr "Regex" + +#: netbox/forms/__init__.py:35 +msgid "Object type(s)" +msgstr "Tipo (s) de objeto" + +#: netbox/forms/base.py:66 +msgid "Id" +msgstr "Id" + +#: netbox/forms/base.py:105 +msgid "Add tags" +msgstr "Adicionar etiquetas" + +#: netbox/forms/base.py:110 +msgid "Remove tags" +msgstr "Remover etiquetas" + +#: netbox/models/features.py:434 +msgid "Remote data source" +msgstr "Fonte de dados remota" + +#: netbox/models/features.py:444 +msgid "data path" +msgstr "caminho de dados" + +#: netbox/models/features.py:448 +msgid "Path to remote file (relative to data source root)" +msgstr "Caminho para o arquivo remoto (em relação à raiz da fonte de dados)" + +#: netbox/models/features.py:451 +msgid "auto sync enabled" +msgstr "sincronização automática ativada" + +#: netbox/models/features.py:453 +msgid "Enable automatic synchronization of data when the data file is updated" +msgstr "" +"Habilitar a sincronização automática de dados quando o arquivo de dados for " +"atualizado" + +#: netbox/models/features.py:456 +msgid "date synced" +msgstr "data sincronizada" + +#: netbox/navigation/menu.py:12 +msgid "Organization" +msgstr "Organização" + +#: netbox/navigation/menu.py:20 +msgid "Site Groups" +msgstr "Grupos de sites" + +#: netbox/navigation/menu.py:28 +msgid "Rack Roles" +msgstr "Funções de rack" + +#: netbox/navigation/menu.py:32 +msgid "Elevations" +msgstr "Elevações" + +#: netbox/navigation/menu.py:41 +msgid "Tenant Groups" +msgstr "Grupos de inquilinos" + +#: netbox/navigation/menu.py:48 +msgid "Contact Groups" +msgstr "Grupos de contato" + +#: netbox/navigation/menu.py:49 templates/tenancy/contactrole.html:8 +msgid "Contact Roles" +msgstr "Funções de contato" + +#: netbox/navigation/menu.py:50 +msgid "Contact Assignments" +msgstr "Atribuições de contato" + +#: netbox/navigation/menu.py:64 +msgid "Modules" +msgstr "Módulos" + +#: netbox/navigation/menu.py:65 templates/dcim/devicerole.html:8 +msgid "Device Roles" +msgstr "Funções do dispositivo" + +#: netbox/navigation/menu.py:68 templates/dcim/device.html:162 +#: templates/dcim/virtualdevicecontext.html:8 +msgid "Virtual Device Contexts" +msgstr "Contextos de dispositivos virtuais" + +#: netbox/navigation/menu.py:76 +msgid "Manufacturers" +msgstr "Fabricantes" + +#: netbox/navigation/menu.py:80 +msgid "Device Components" +msgstr "Componentes do dispositivo" + +#: netbox/navigation/menu.py:92 templates/dcim/inventoryitemrole.html:8 +msgid "Inventory Item Roles" +msgstr "Funções do item de inventário" + +#: netbox/navigation/menu.py:99 netbox/navigation/menu.py:103 +msgid "Connections" +msgstr "Conexões" + +#: netbox/navigation/menu.py:105 +msgid "Cables" +msgstr "Cabos" + +#: netbox/navigation/menu.py:106 +msgid "Wireless Links" +msgstr "Links sem fio" + +#: netbox/navigation/menu.py:109 +msgid "Interface Connections" +msgstr "Conexões de interface" + +#: netbox/navigation/menu.py:114 +msgid "Console Connections" +msgstr "Conexões do console" + +#: netbox/navigation/menu.py:119 +msgid "Power Connections" +msgstr "Conexões de alimentação" + +#: netbox/navigation/menu.py:135 +msgid "Wireless LAN Groups" +msgstr "Grupos de LAN sem fio" + +#: netbox/navigation/menu.py:156 +msgid "Prefix & VLAN Roles" +msgstr "Funções de prefixo e VLAN" + +#: netbox/navigation/menu.py:162 +msgid "ASN Ranges" +msgstr "Intervalos ASN" + +#: netbox/navigation/menu.py:184 +msgid "VLAN Groups" +msgstr "Grupos de VLAN" + +#: netbox/navigation/menu.py:191 +msgid "Service Templates" +msgstr "Modelos de serviço" + +#: netbox/navigation/menu.py:192 templates/dcim/device.html:304 +#: templates/ipam/ipaddress.html:122 +#: templates/virtualization/virtualmachine.html:157 +msgid "Services" +msgstr "Serviços" + +#: netbox/navigation/menu.py:199 +msgid "VPN" +msgstr "VPN" + +#: netbox/navigation/menu.py:203 netbox/navigation/menu.py:205 +#: vpn/tables/tunnels.py:24 +msgid "Tunnels" +msgstr "Túneis" + +#: netbox/navigation/menu.py:206 templates/vpn/tunnelgroup.html:8 +msgid "Tunnel Groups" +msgstr "grupos de túneis" + +#: netbox/navigation/menu.py:207 +msgid "Tunnel Terminations" +msgstr "Terminações de túneis" + +#: netbox/navigation/menu.py:211 netbox/navigation/menu.py:213 +#: vpn/models/l2vpn.py:64 +msgid "L2VPNs" +msgstr "VPNs L2" + +#: netbox/navigation/menu.py:214 templates/vpn/l2vpn.html:57 +#: templates/vpn/tunnel.html:73 vpn/tables/tunnels.py:54 +msgid "Terminations" +msgstr "Rescisões" + +#: netbox/navigation/menu.py:220 +msgid "IKE Proposals" +msgstr "Propostas do IKE" + +#: netbox/navigation/menu.py:221 templates/vpn/ikeproposal.html:42 +msgid "IKE Policies" +msgstr "Políticas da IKE" + +#: netbox/navigation/menu.py:222 +msgid "IPSec Proposals" +msgstr "Propostas de IPsec" + +#: netbox/navigation/menu.py:223 templates/vpn/ipsecproposal.html:38 +msgid "IPSec Policies" +msgstr "Políticas IPsec" + +#: netbox/navigation/menu.py:224 templates/vpn/ikepolicy.html:39 +#: templates/vpn/ipsecpolicy.html:26 +msgid "IPSec Profiles" +msgstr "Perfis IPsec" + +#: netbox/navigation/menu.py:231 templates/dcim/device_edit.html:78 +msgid "Virtualization" +msgstr "Virtualização" + +#: netbox/navigation/menu.py:235 netbox/navigation/menu.py:237 +#: virtualization/views.py:186 +msgid "Virtual Machines" +msgstr "Máquinas virtuais" + +#: netbox/navigation/menu.py:239 +#: templates/virtualization/virtualmachine.html:177 +#: templates/virtualization/virtualmachine/base.html:32 +#: templates/virtualization/virtualmachine_list.html:21 +#: virtualization/tables/virtualmachines.py:90 virtualization/views.py:389 +msgid "Virtual Disks" +msgstr "Discos virtuais" + +#: netbox/navigation/menu.py:246 +msgid "Cluster Types" +msgstr "Tipos de cluster" + +#: netbox/navigation/menu.py:247 +msgid "Cluster Groups" +msgstr "Grupos de clusters" + +#: netbox/navigation/menu.py:261 +msgid "Circuit Types" +msgstr "Tipos de circuito" + +#: netbox/navigation/menu.py:265 netbox/navigation/menu.py:267 +msgid "Providers" +msgstr "Provedores" + +#: netbox/navigation/menu.py:268 templates/circuits/provider.html:53 +msgid "Provider Accounts" +msgstr "Contas de provedores" + +#: netbox/navigation/menu.py:269 +msgid "Provider Networks" +msgstr "Redes de provedores" + +#: netbox/navigation/menu.py:283 +msgid "Power Panels" +msgstr "Painéis de energia" + +#: netbox/navigation/menu.py:294 +msgid "Configurations" +msgstr "Configurações" + +#: netbox/navigation/menu.py:296 +msgid "Config Contexts" +msgstr "Contextos de configuração" + +#: netbox/navigation/menu.py:297 +msgid "Config Templates" +msgstr "Modelos de configuração" + +#: netbox/navigation/menu.py:304 netbox/navigation/menu.py:308 +msgid "Customization" +msgstr "Personalização" + +#: netbox/navigation/menu.py:310 +#: templates/circuits/circuittermination_edit.html:53 +#: templates/dcim/cable_edit.html:77 templates/dcim/device_edit.html:103 +#: templates/dcim/inventoryitem_edit.html:102 templates/dcim/rack_edit.html:81 +#: templates/dcim/virtualchassis_add.html:31 +#: templates/dcim/virtualchassis_edit.html:41 +#: templates/generic/bulk_edit.html:92 templates/htmx/form.html:32 +#: templates/inc/panels/custom_fields.html:7 +#: templates/ipam/ipaddress_bulk_add.html:35 +#: templates/ipam/ipaddress_edit.html:88 templates/ipam/service_create.html:75 +#: templates/ipam/service_edit.html:62 templates/ipam/vlan_edit.html:63 +#: templates/tenancy/contactassignment_edit.html:31 +#: templates/vpn/l2vpntermination_edit.html:51 +msgid "Custom Fields" +msgstr "Campos personalizados" + +#: netbox/navigation/menu.py:311 +msgid "Custom Field Choices" +msgstr "Opções de campo personalizadas" + +#: netbox/navigation/menu.py:312 +msgid "Custom Links" +msgstr "Links personalizados" + +#: netbox/navigation/menu.py:313 +msgid "Export Templates" +msgstr "Modelos de exportação" + +#: netbox/navigation/menu.py:314 +msgid "Saved Filters" +msgstr "Filtros salvos" + +#: netbox/navigation/menu.py:316 +msgid "Image Attachments" +msgstr "Anexos de imagem" + +#: netbox/navigation/menu.py:320 +msgid "Reports & Scripts" +msgstr "Relatórios e scripts" + +#: netbox/navigation/menu.py:340 +msgid "Operations" +msgstr "Operações" + +#: netbox/navigation/menu.py:344 +msgid "Integrations" +msgstr "Integrações" + +#: netbox/navigation/menu.py:346 +msgid "Data Sources" +msgstr "Fontes de dados" + +#: netbox/navigation/menu.py:347 +msgid "Event Rules" +msgstr "Regras do evento" + +#: netbox/navigation/menu.py:348 +msgid "Webhooks" +msgstr "Webhooks" + +#: netbox/navigation/menu.py:352 netbox/navigation/menu.py:356 +#: netbox/views/generic/feature_views.py:151 +#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +msgid "Jobs" +msgstr "Empregos" + +#: netbox/navigation/menu.py:362 +msgid "Logging" +msgstr "Exploração de" + +#: netbox/navigation/menu.py:364 +msgid "Journal Entries" +msgstr "Entradas de diário" + +#: netbox/navigation/menu.py:365 templates/extras/objectchange.html:8 +#: templates/extras/objectchange_list.html:4 +msgid "Change Log" +msgstr "Registro de alterações" + +#: netbox/navigation/menu.py:372 templates/inc/profile_button.html:18 +msgid "Admin" +msgstr "Administrador" + +#: netbox/navigation/menu.py:381 templates/users/group.html:27 +#: users/forms/model_forms.py:242 users/forms/model_forms.py:255 +#: users/forms/model_forms.py:309 users/tables.py:105 +msgid "Users" +msgstr "Usuários" + +#: netbox/navigation/menu.py:404 users/forms/model_forms.py:182 +#: users/forms/model_forms.py:195 users/forms/model_forms.py:314 +#: users/tables.py:35 users/tables.py:109 +msgid "Groups" +msgstr "Grupos" + +#: netbox/navigation/menu.py:426 templates/account/base.html:21 +#: templates/inc/profile_button.html:39 +msgid "API Tokens" +msgstr "Tokens de API" + +#: netbox/navigation/menu.py:433 users/forms/model_forms.py:188 +#: users/forms/model_forms.py:197 users/forms/model_forms.py:248 +#: users/forms/model_forms.py:256 +msgid "Permissions" +msgstr "Permissões" + +#: netbox/navigation/menu.py:445 +msgid "Current Config" +msgstr "Configuração atual" + +#: netbox/navigation/menu.py:451 +msgid "Config Revisions" +msgstr "Revisões de configuração" + +#: netbox/navigation/menu.py:491 templates/500.html:35 +#: templates/account/preferences.html:29 +msgid "Plugins" +msgstr "Plugins" + +#: netbox/preferences.py:17 +msgid "Color mode" +msgstr "Modo de cor" + +#: netbox/preferences.py:25 +msgid "Page length" +msgstr "Comprimento da página" + +#: netbox/preferences.py:27 +msgid "The default number of objects to display per page" +msgstr "O número padrão de objetos a serem exibidos por página" + +#: netbox/preferences.py:31 +msgid "Paginator placement" +msgstr "Posicionamento do paginador" + +#: netbox/preferences.py:37 +msgid "Where the paginator controls will be displayed relative to a table" +msgstr "Onde os controles do paginador serão exibidos em relação a uma tabela" + +#: netbox/preferences.py:43 +msgid "Data format" +msgstr "Formato de dados" + +#: netbox/tables/columns.py:175 +msgid "Toggle all" +msgstr "Alternar tudo" + +#: netbox/tables/columns.py:277 templates/inc/profile_button.html:56 +msgid "Toggle Dropdown" +msgstr "Alternar lista suspensa" + +#: netbox/tables/columns.py:542 templates/core/job.html:40 +msgid "Error" +msgstr "Erro" + +#: netbox/tables/tables.py:243 templates/generic/bulk_import.html:115 +msgid "Field" +msgstr "Campo" + +#: netbox/tables/tables.py:246 +msgid "Value" +msgstr "Valor" + +#: netbox/tables/tables.py:259 +msgid "No results found" +msgstr "Nenhum resultado encontrado" + +#: netbox/tests/dummy_plugin/navigation.py:29 +msgid "Dummy Plugin" +msgstr "Plugin fictício" + +#: netbox/views/generic/feature_views.py:38 +msgid "Changelog" +msgstr "Registro de alterações" + +#: netbox/views/generic/feature_views.py:91 +msgid "Journal" +msgstr "Diário" + +#: templates/403.html:4 +msgid "Access Denied" +msgstr "Acesso negado" + +#: templates/403.html:9 +msgid "You do not have permission to access this page" +msgstr "Você não tem permissão para acessar esta página" + +#: templates/404.html:4 +msgid "Page Not Found" +msgstr "Página não encontrada" + +#: templates/404.html:9 +msgid "The requested page does not exist" +msgstr "A página solicitada não existe" + +#: templates/500.html:7 templates/500.html:18 +msgid "Server Error" +msgstr "Erro no servidor" + +#: templates/500.html:23 +msgid "There was a problem with your request. Please contact an administrator" +msgstr "" +"Houve um problema com sua solicitação. Entre em contato com um administrador" + +#: templates/500.html:28 +msgid "The complete exception is provided below" +msgstr "A exceção completa é fornecida abaixo" + +#: templates/500.html:33 +msgid "Python version" +msgstr "Versão Python" + +#: templates/500.html:34 +msgid "NetBox version" +msgstr "Versão NetBox" + +#: templates/500.html:36 +msgid "None installed" +msgstr "Nenhum instalado" + +#: templates/500.html:39 +msgid "If further assistance is required, please post to the" +msgstr "Se for necessária mais assistência, por favor poste no" + +#: templates/500.html:39 +msgid "NetBox discussion forum" +msgstr "Fórum de discussão NetBox" + +#: templates/500.html:39 +msgid "on GitHub" +msgstr "no GitHub" + +#: templates/500.html:42 templates/base/40x.html:17 +msgid "Home Page" +msgstr "Página inicial" + +#: templates/account/base.html:7 templates/inc/profile_button.html:24 +#: vpn/forms/bulk_edit.py:256 vpn/forms/filtersets.py:186 +#: vpn/forms/model_forms.py:372 +msgid "Profile" +msgstr "Perfil" + +#: templates/account/base.html:13 templates/inc/profile_button.html:34 +msgid "Preferences" +msgstr "Preferências" + +#: templates/account/password.html:5 +msgid "Change Password" +msgstr "Alterar senha" + +#: templates/account/password.html:17 templates/account/preferences.html:82 +#: templates/core/configrevision_restore.html:80 +#: templates/dcim/devicebay_populate.html:34 +#: templates/dcim/virtualchassis_add_member.html:24 +#: templates/dcim/virtualchassis_edit.html:104 +#: templates/extras/object_journal.html:26 templates/extras/script.html:36 +#: templates/generic/bulk_add_component.html:55 +#: templates/generic/bulk_delete.html:46 templates/generic/bulk_edit.html:125 +#: templates/generic/bulk_import.html:53 templates/generic/bulk_import.html:75 +#: templates/generic/bulk_import.html:97 templates/generic/bulk_remove.html:42 +#: templates/generic/bulk_rename.html:44 +#: templates/generic/confirmation_form.html:20 +#: templates/generic/object_edit.html:76 templates/htmx/delete_form.html:53 +#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:31 +#: templates/virtualization/cluster_add_devices.html:30 +msgid "Cancel" +msgstr "Cancelar" + +#: templates/account/password.html:18 templates/account/preferences.html:83 +#: templates/dcim/devicebay_populate.html:35 +#: templates/dcim/virtualchassis_add_member.html:26 +#: templates/dcim/virtualchassis_edit.html:106 +#: templates/extras/dashboard/widget_add.html:26 +#: templates/extras/dashboard/widget_config.html:19 +#: templates/extras/object_journal.html:27 +#: templates/generic/object_edit.html:66 +#: utilities/templates/helpers/applied_filters.html:16 +#: utilities/templates/helpers/table_config_form.html:40 +msgid "Save" +msgstr "Salvar" + +#: templates/account/preferences.html:41 +msgid "Table Configurations" +msgstr "Configurações de tabela" + +#: templates/account/preferences.html:46 +msgid "Clear table preferences" +msgstr "Limpar preferências de tabela" + +#: templates/account/preferences.html:53 +msgid "Toggle All" +msgstr "Alternar tudo" + +#: templates/account/preferences.html:55 +msgid "Table" +msgstr "Tabela" + +#: templates/account/preferences.html:56 +msgid "Ordering" +msgstr "Pedido" + +#: templates/account/preferences.html:57 +msgid "Columns" +msgstr "Colunas" + +#: templates/account/preferences.html:76 templates/dcim/cable_trace.html:113 +#: templates/extras/object_configcontext.html:55 +msgid "None found" +msgstr "Nenhum encontrado" + +#: templates/account/profile.html:6 +msgid "User Profile" +msgstr "Perfil do usuário" + +#: templates/account/profile.html:12 +msgid "Account Details" +msgstr "Detalhes da conta" + +#: templates/account/profile.html:30 templates/tenancy/contact.html:44 +#: templates/users/user.html:26 tenancy/forms/bulk_edit.py:108 +msgid "Email" +msgstr "E-mail" + +#: templates/account/profile.html:34 templates/users/user.html:30 +msgid "Account Created" +msgstr "Conta criada" + +#: templates/account/profile.html:38 templates/users/user.html:42 +msgid "Superuser" +msgstr "Superusuário" + +#: templates/account/profile.html:42 +msgid "Admin Access" +msgstr "Acesso de administrador" + +#: templates/account/profile.html:51 templates/users/objectpermission.html:86 +#: templates/users/user.html:51 +msgid "Assigned Groups" +msgstr "Grupos atribuídos" + +#: templates/account/profile.html:56 +#: templates/circuits/circuit_terminations_swap.html:18 +#: templates/circuits/circuit_terminations_swap.html:26 +#: templates/circuits/inc/circuit_termination.html:154 +#: templates/dcim/devicebay.html:66 +#: templates/dcim/inc/panels/inventory_items.html:37 +#: templates/dcim/interface.html:306 templates/dcim/modulebay.html:79 +#: templates/extras/configcontext.html:73 templates/extras/eventrule.html:84 +#: templates/extras/htmx/script_result.html:54 +#: templates/extras/object_configcontext.html:28 +#: templates/extras/objectchange.html:128 +#: templates/extras/objectchange.html:145 templates/extras/webhook.html:79 +#: templates/extras/webhook.html:91 templates/inc/panel_table.html:12 +#: templates/inc/panels/comments.html:12 +#: templates/ipam/inc/panels/fhrp_groups.html:43 templates/users/group.html:32 +#: templates/users/group.html:42 templates/users/objectpermission.html:81 +#: templates/users/objectpermission.html:91 templates/users/user.html:56 +#: templates/users/user.html:66 +msgid "None" +msgstr "Nenhum" + +#: templates/account/profile.html:66 templates/users/user.html:76 +msgid "Recent Activity" +msgstr "Atividade recente" + +#: templates/account/token.html:8 templates/account/token_list.html:6 +msgid "My API Tokens" +msgstr "Meus tokens de API" + +#: templates/account/token.html:11 templates/account/token.html:19 +#: templates/users/token.html:6 templates/users/token.html:14 +#: users/forms/filtersets.py:121 +msgid "Token" +msgstr "Ficha" + +#: templates/account/token.html:40 templates/users/token.html:32 +#: users/forms/bulk_edit.py:87 +msgid "Write enabled" +msgstr "Gravação ativada" + +#: templates/account/token.html:52 templates/users/token.html:44 +msgid "Last used" +msgstr "Usado pela última vez" + +#: templates/account/token_list.html:12 +msgid "Add a Token" +msgstr "Adicionar um token" + +#: templates/admin/index.html:10 +msgid "System" +msgstr "Sistema" + +#: templates/admin/index.html:14 +msgid "Background Tasks" +msgstr "Tarefas de fundo" + +#: templates/admin/index.html:19 +msgid "Installed plugins" +msgstr "Plugins instalados" + +#: templates/base/base.html:28 templates/extras/admin/plugins_list.html:8 +#: templates/home.html:24 +msgid "Home" +msgstr "Início" + +#: templates/base/layout.html:27 templates/base/layout.html:37 +#: templates/login.html:34 +msgid "NetBox logo" +msgstr "Logotipo da NetBox" + +#: templates/base/layout.html:76 +msgid "Debug mode is enabled" +msgstr "O modo de depuração está ativado" + +#: templates/base/layout.html:77 +msgid "" +"Performance may be limited. Debugging should never be enabled on a " +"production system" +msgstr "" +"O desempenho pode ser limitado. A depuração nunca deve ser ativada em um " +"sistema de produção" + +#: templates/base/layout.html:83 +msgid "Maintenance Mode" +msgstr "Modo de manutenção" + +#: templates/base/layout.html:134 +msgid "Docs" +msgstr "Documentos" + +#: templates/base/layout.html:139 templates/rest_framework/api.html:10 +msgid "REST API" +msgstr "API DE DESCANSO" + +#: templates/base/layout.html:144 +msgid "REST API documentation" +msgstr "Documentação da API REST" + +#: templates/base/layout.html:150 +msgid "GraphQL API" +msgstr "API do GraphQL" + +#: templates/base/layout.html:156 +msgid "Source Code" +msgstr "Código-fonte" + +#: templates/base/layout.html:161 +msgid "Community" +msgstr "Comunidade" + +#: templates/base/sidenav.html:12 templates/base/sidenav.html:17 +msgid "NetBox Logo" +msgstr "Logotipo da NetBox" + +#: templates/circuits/circuit.html:48 +msgid "Install Date" +msgstr "Data de instalação" + +#: templates/circuits/circuit.html:52 +msgid "Termination Date" +msgstr "Data de rescisão" + +#: templates/circuits/circuit_terminations_swap.html:4 +msgid "Swap Circuit Terminations" +msgstr "Terminações do circuito de troca" + +#: templates/circuits/circuit_terminations_swap.html:8 +#, python-format +msgid "Swap these terminations for circuit %(circuit)s?" +msgstr "Troque essas terminações por circuito %(circuit)s?" + +#: templates/circuits/circuit_terminations_swap.html:14 +msgid "A side" +msgstr "Um lado" + +#: templates/circuits/circuit_terminations_swap.html:22 +msgid "Z side" +msgstr "Lado Z" + +#: templates/circuits/circuittermination_edit.html:9 +#: templates/circuits/inc/circuit_termination.html:81 +#: templates/dcim/frontport.html:128 templates/dcim/interface.html:199 +#: templates/dcim/rearport.html:118 +msgid "Circuit Termination" +msgstr "Terminação do circuito" + +#: templates/circuits/circuittermination_edit.html:41 +msgid "Termination Details" +msgstr "Detalhes da rescisão" + +#: templates/circuits/circuittype.html:10 +msgid "Add Circuit" +msgstr "Adicionar circuito" + +#: templates/circuits/inc/circuit_termination.html:9 +#: templates/dcim/devicetype/component_templates.html:30 +#: templates/dcim/manufacturer.html:11 +#: templates/dcim/moduletype/component_templates.html:30 +#: templates/generic/bulk_add_component.html:8 +#: templates/users/objectpermission.html:41 +#: utilities/templates/buttons/add.html:4 +#: utilities/templates/helpers/table_config_form.html:20 +msgid "Add" +msgstr "Adicionar" + +#: templates/circuits/inc/circuit_termination.html:14 +#: templates/circuits/inc/circuit_termination.html:63 +#: templates/dcim/devicetype/component_templates.html:21 +#: templates/dcim/inc/panels/inventory_items.html:24 +#: templates/dcim/moduletype/component_templates.html:21 +#: templates/dcim/powerpanel.html:61 templates/generic/object_edit.html:29 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +#: templates/ipam/inc/panels/fhrp_groups.html:30 +#: utilities/templates/buttons/edit.html:3 +msgid "Edit" +msgstr "Editar" + +#: templates/circuits/inc/circuit_termination.html:17 +msgid "Swap" +msgstr "Troca" + +#: templates/circuits/inc/circuit_termination.html:26 +#, python-format +msgid "Termination %(side)s" +msgstr "Rescisão %(side)s" + +#: templates/circuits/inc/circuit_termination.html:42 +#: templates/dcim/cable.html:70 templates/dcim/cable.html:76 +#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:76 +msgid "Termination" +msgstr "Rescisão" + +#: templates/circuits/inc/circuit_termination.html:46 +#: templates/dcim/consoleport.html:62 templates/dcim/consoleserverport.html:62 +#: templates/dcim/powerfeed.html:122 +msgid "Marked as connected" +msgstr "Marcado como conectado" + +#: templates/circuits/inc/circuit_termination.html:48 +msgid "to" +msgstr "para" + +#: templates/circuits/inc/circuit_termination.html:58 +#: templates/circuits/inc/circuit_termination.html:59 +#: templates/dcim/frontport.html:87 +#: templates/dcim/inc/connection_endpoints.html:7 +#: templates/dcim/interface.html:160 templates/dcim/rearport.html:83 +msgid "Trace" +msgstr "Traço" + +#: templates/circuits/inc/circuit_termination.html:62 +msgid "Edit cable" +msgstr "Editar cabo" + +#: templates/circuits/inc/circuit_termination.html:67 +msgid "Remove cable" +msgstr "Remova o cabo" + +#: templates/circuits/inc/circuit_termination.html:68 +#: templates/dcim/bulk_disconnect.html:5 +#: templates/dcim/device/consoleports.html:12 +#: templates/dcim/device/consoleserverports.html:12 +#: templates/dcim/device/frontports.html:12 +#: templates/dcim/device/interfaces.html:16 +#: templates/dcim/device/poweroutlets.html:12 +#: templates/dcim/device/powerports.html:12 +#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:66 +msgid "Disconnect" +msgstr "Desconectar" + +#: templates/circuits/inc/circuit_termination.html:75 +#: templates/dcim/consoleport.html:71 templates/dcim/consoleserverport.html:71 +#: templates/dcim/frontport.html:109 templates/dcim/interface.html:186 +#: templates/dcim/interface.html:206 templates/dcim/powerfeed.html:136 +#: templates/dcim/poweroutlet.html:75 templates/dcim/poweroutlet.html:76 +#: templates/dcim/powerport.html:77 templates/dcim/rearport.html:105 +msgid "Connect" +msgstr "Conectar" + +#: templates/circuits/inc/circuit_termination.html:79 +#: templates/dcim/consoleport.html:78 templates/dcim/consoleserverport.html:78 +#: templates/dcim/frontport.html:18 templates/dcim/frontport.html:122 +#: templates/dcim/interface.html:193 templates/dcim/inventoryitem_edit.html:49 +#: templates/dcim/rearport.html:112 +msgid "Front Port" +msgstr "Porta frontal" + +#: templates/circuits/inc/circuit_termination.html:97 +msgid "Downstream" +msgstr "Rio abaixo" + +#: templates/circuits/inc/circuit_termination.html:98 +msgid "Upstream" +msgstr "Rio acima" + +#: templates/circuits/inc/circuit_termination.html:107 +msgid "Cross-Connect" +msgstr "Conexão cruzada" + +#: templates/circuits/inc/circuit_termination.html:111 +msgid "Patch Panel/Port" +msgstr "Painel de remendo/porta" + +#: templates/circuits/provider.html:11 +msgid "Add circuit" +msgstr "Adicionar circuito" + +#: templates/circuits/provideraccount.html:17 +msgid "Provider Account" +msgstr "Conta do provedor" + +#: templates/core/configrevision.html:47 +msgid "Default unit height" +msgstr "Altura padrão da unidade" + +#: templates/core/configrevision.html:51 +msgid "Default unit width" +msgstr "Largura da unidade padrão" + +#: templates/core/configrevision.html:63 +msgid "Default voltage" +msgstr "Tensão padrão" + +#: templates/core/configrevision.html:67 +msgid "Default amperage" +msgstr "Amperagem padrão" + +#: templates/core/configrevision.html:71 +msgid "Default max utilization" +msgstr "Utilização máxima padrão" + +#: templates/core/configrevision.html:83 +msgid "Enforce global unique" +msgstr "Imponha uma exclusividade global" + +#: templates/core/configrevision.html:135 +msgid "Paginate count" +msgstr "Contagem de paginações" + +#: templates/core/configrevision.html:139 +msgid "Max page size" +msgstr "Tamanho máximo da página" + +#: templates/core/configrevision.html:179 +msgid "Default user preferences" +msgstr "Preferências padrão do usuário" + +#: templates/core/configrevision.html:209 +msgid "Job retention" +msgstr "Retenção de emprego" + +#: templates/core/configrevision.html:221 +msgid "Comment" +msgstr "Comentar" + +#: templates/core/configrevision_restore.html:8 +#: templates/core/configrevision_restore.html:43 +#: templates/core/configrevision_restore.html:79 +msgid "Restore" +msgstr "Restaurar" + +#: templates/core/configrevision_restore.html:21 +msgid "Config revisions" +msgstr "Revisões de configuração" + +#: templates/core/configrevision_restore.html:54 +msgid "Parameter" +msgstr "Parâmetro" + +#: templates/core/configrevision_restore.html:55 +msgid "Current Value" +msgstr "Valor atual" + +#: templates/core/configrevision_restore.html:56 +msgid "New Value" +msgstr "Novo valor" + +#: templates/core/configrevision_restore.html:66 +msgid "Changed" +msgstr "Alterado" + +#: templates/core/datafile.html:47 +msgid "Last Updated" +msgstr "Última atualização" + +#: templates/core/datafile.html:51 templates/ipam/iprange.html:28 +#: templates/virtualization/virtualdisk.html:30 +msgid "Size" +msgstr "Tamanho" + +#: templates/core/datafile.html:52 +msgid "bytes" +msgstr "bytes" + +#: templates/core/datafile.html:55 +msgid "SHA256 Hash" +msgstr "Hash SHA256" + +#: templates/core/datasource.html:14 templates/core/datasource.html:20 +#: utilities/templates/buttons/sync.html:5 +msgid "Sync" +msgstr "Sync" + +#: templates/core/datasource.html:51 +msgid "Last synced" +msgstr "Última sincronização" + +#: templates/core/datasource.html:86 +msgid "Backend" +msgstr "Back-end" + +#: templates/core/datasource.html:102 +msgid "No parameters defined" +msgstr "Nenhum parâmetro definido" + +#: templates/core/datasource.html:118 +msgid "Files" +msgstr "Arquivos" + +#: templates/core/job.html:21 +msgid "Job" +msgstr "Emprego" + +#: templates/core/job.html:45 templates/extras/journalentry.html:29 +msgid "Created By" +msgstr "Criado por" + +#: templates/core/job.html:54 +msgid "Scheduling" +msgstr "Agendamento" + +#: templates/core/job.html:66 +#, python-format +msgid "every %(interval)s seconds" +msgstr "cada %(interval)s segundos" + +#: templates/dcim/bulk_disconnect.html:9 +#, python-format +msgid "" +"Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" +msgstr "" +"Tem certeza de que deseja desconectá-los %(count)s %(obj_type_plural)s?" + +#: templates/dcim/cable_edit.html:12 +msgid "A Side" +msgstr "Um lado" + +#: templates/dcim/cable_edit.html:29 +msgid "B Side" +msgstr "Lado B" + +#: templates/dcim/cable_trace.html:6 +#, python-format +msgid "Cable Trace for %(object_type)s %(object)s" +msgstr "Cable Trace para %(object_type)s %(object)s" + +#: templates/dcim/cable_trace.html:21 templates/dcim/inc/rack_elevation.html:7 +msgid "Download SVG" +msgstr "Baixar SVG" + +#: templates/dcim/cable_trace.html:27 +msgid "Asymmetric Path" +msgstr "Caminho assimétrico" + +#: templates/dcim/cable_trace.html:28 +msgid "The nodes below have no links and result in an asymmetric path" +msgstr "Os nós abaixo não têm links e resultam em um caminho assimétrico" + +#: templates/dcim/cable_trace.html:35 +msgid "Path split" +msgstr "Divisão de caminho" + +#: templates/dcim/cable_trace.html:36 +msgid "Select a node below to continue" +msgstr "Selecione um nó abaixo para continuar" + +#: templates/dcim/cable_trace.html:52 +msgid "Trace Completed" +msgstr "Rastreamento concluído" + +#: templates/dcim/cable_trace.html:55 +msgid "Total segments" +msgstr "Total de segmentos" + +#: templates/dcim/cable_trace.html:59 +msgid "Total length" +msgstr "Comprimento total" + +#: templates/dcim/cable_trace.html:74 +msgid "No paths found" +msgstr "Nenhum caminho encontrado" + +#: templates/dcim/cable_trace.html:83 +msgid "Related Paths" +msgstr "Caminhos relacionados" + +#: templates/dcim/cable_trace.html:89 +msgid "Origin" +msgstr "Origem" + +#: templates/dcim/cable_trace.html:90 +msgid "Destination" +msgstr "Destino" + +#: templates/dcim/cable_trace.html:91 +msgid "Segments" +msgstr "Segmentos" + +#: templates/dcim/cable_trace.html:104 +msgid "Incomplete" +msgstr "Incompleto" + +#: templates/dcim/component_list.html:14 +msgid "Rename Selected" +msgstr "Renomear selecionado" + +#: templates/dcim/consoleport.html:67 templates/dcim/consoleserverport.html:67 +#: templates/dcim/frontport.html:105 templates/dcim/interface.html:182 +#: templates/dcim/poweroutlet.html:73 templates/dcim/powerport.html:73 +msgid "Not Connected" +msgstr "Não conectado" + +#: templates/dcim/consoleport.html:75 templates/dcim/consoleserverport.html:18 +#: templates/dcim/frontport.html:116 templates/dcim/inventoryitem_edit.html:44 +msgid "Console Server Port" +msgstr "Porta do servidor do console" + +#: templates/dcim/device.html:35 +msgid "Highlight device" +msgstr "Dispositivo de destaque" + +#: templates/dcim/device.html:57 +msgid "Not racked" +msgstr "Não estackeado" + +#: templates/dcim/device.html:64 templates/dcim/site.html:96 +msgid "GPS Coordinates" +msgstr "Coordenadas GPS" + +#: templates/dcim/device.html:70 templates/dcim/site.html:102 +msgid "Map It" +msgstr "Mapeie-o" + +#: templates/dcim/device.html:110 templates/dcim/inventoryitem.html:57 +#: templates/dcim/module.html:79 templates/dcim/modulebay.html:73 +#: templates/dcim/rack.html:62 +msgid "Asset Tag" +msgstr "Etiqueta de ativo" + +#: templates/dcim/device.html:153 +msgid "View Virtual Chassis" +msgstr "Exibir chassi virtual" + +#: templates/dcim/device.html:170 +msgid "Create VDC" +msgstr "Criar VDC" + +#: templates/dcim/device.html:179 templates/dcim/device_edit.html:64 +#: virtualization/forms/model_forms.py:226 +msgid "Management" +msgstr "Gestão" + +#: templates/dcim/device.html:200 templates/dcim/device.html:216 +#: templates/virtualization/virtualmachine.html:56 +#: templates/virtualization/virtualmachine.html:72 +msgid "NAT for" +msgstr "NAT para" + +#: templates/dcim/device.html:202 templates/dcim/device.html:218 +#: templates/virtualization/virtualmachine.html:58 +#: templates/virtualization/virtualmachine.html:74 +msgid "NAT" +msgstr "NAT" + +#: templates/dcim/device.html:254 templates/dcim/rack.html:70 +msgid "Power Utilization" +msgstr "Utilização de energia" + +#: templates/dcim/device.html:259 +msgid "Input" +msgstr "Entrada" + +#: templates/dcim/device.html:260 +msgid "Outlets" +msgstr "Outlets" + +#: templates/dcim/device.html:261 +msgid "Allocated" +msgstr "Alocado" + +#: templates/dcim/device.html:270 templates/dcim/device.html:272 +#: templates/dcim/device.html:288 templates/dcim/powerfeed.html:70 +msgid "VA" +msgstr "VA" + +#: templates/dcim/device.html:282 +msgctxt "Leg of a power feed" +msgid "Leg" +msgstr "Perna" + +#: templates/dcim/device.html:312 +#: templates/virtualization/virtualmachine.html:165 +msgid "Add a service" +msgstr "Adicionar um serviço" + +#: templates/dcim/device.html:319 templates/dcim/rack.html:77 +#: templates/dcim/rack_edit.html:38 +msgid "Dimensions" +msgstr "Dimensões" + +#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 +#: templates/dcim/devicetype/base.html:18 templates/dcim/module.html:18 +#: templates/dcim/moduletype/base.html:18 +#: templates/virtualization/virtualmachine/base.html:22 +#: templates/virtualization/virtualmachine_list.html:8 +msgid "Add Components" +msgstr "Adicionar componentes" + +#: templates/dcim/device/consoleports.html:24 +msgid "Add Console Ports" +msgstr "Adicionar portas de console" + +#: templates/dcim/device/consoleserverports.html:24 +msgid "Add Console Server Ports" +msgstr "Adicionar portas do servidor de console" + +#: templates/dcim/device/devicebays.html:10 +msgid "Add Device Bays" +msgstr "Adicionar compartimentos de dispositivos" + +#: templates/dcim/device/frontports.html:24 +msgid "Add Front Ports" +msgstr "Adicionar portas frontais" + +#: templates/dcim/device/inc/interface_table_controls.html:9 +msgid "Hide Enabled" +msgstr "Ocultar ativado" + +#: templates/dcim/device/inc/interface_table_controls.html:10 +msgid "Hide Disabled" +msgstr "Ocultar desativado" + +#: templates/dcim/device/inc/interface_table_controls.html:11 +msgid "Hide Virtual" +msgstr "Ocultar virtual" + +#: templates/dcim/device/inc/interface_table_controls.html:12 +msgid "Hide Disconnected" +msgstr "Ocultar Desconectado" + +#: templates/dcim/device/interfaces.html:28 +msgid "Add Interfaces" +msgstr "Adicionar interfaces" + +#: templates/dcim/device/inventory.html:10 +#: templates/dcim/inc/panels/inventory_items.html:46 +msgid "Add Inventory Item" +msgstr "Adicionar item de inventário" + +#: templates/dcim/device/modulebays.html:10 +msgid "Add Module Bays" +msgstr "Adicionar compartimentos de módulo" + +#: templates/dcim/device/poweroutlets.html:24 +msgid "Add Power Outlets" +msgstr "Adicionar tomadas elétricas" + +#: templates/dcim/device/powerports.html:24 +msgid "Add Power Port" +msgstr "Adicionar porta de alimentação" + +#: templates/dcim/device/rearports.html:24 +msgid "Add Rear Ports" +msgstr "Adicionar portas traseiras" + +#: templates/dcim/device/render_config.html:5 +#: templates/virtualization/virtualmachine/render_config.html:5 +msgid "Config" +msgstr "Configuração" + +#: templates/dcim/device/render_config.html:37 +#: templates/virtualization/virtualmachine/render_config.html:37 +msgid "Context Data" +msgstr "Dados de contexto" + +#: templates/dcim/device/render_config.html:57 +#: templates/virtualization/virtualmachine/render_config.html:57 +msgid "Download" +msgstr "Baixar" + +#: templates/dcim/device/render_config.html:60 +#: templates/virtualization/virtualmachine/render_config.html:60 +msgid "Rendered Config" +msgstr "Configuração renderizada" + +#: templates/dcim/device/render_config.html:65 +#: templates/virtualization/virtualmachine/render_config.html:65 +msgid "No configuration template found" +msgstr "Nenhum modelo de configuração encontrado" + +#: templates/dcim/device_edit.html:44 +msgid "Parent Bay" +msgstr "Baía dos Pais" + +#: templates/dcim/device_edit.html:48 +#: utilities/templates/form_helpers/render_field.html:20 +msgid "Regenerate Slug" +msgstr "Regenerar lesma" + +#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:7 +#: utilities/templates/helpers/table_config_form.html:23 +msgid "Remove" +msgstr "Remover" + +#: templates/dcim/device_edit.html:110 +msgid "Local Config Context Data" +msgstr "Dados de contexto de configuração local" + +#: templates/dcim/device_list.html:82 +#: templates/dcim/devicetype/component_templates.html:18 +#: templates/dcim/moduletype/component_templates.html:18 +#: templates/generic/bulk_rename.html:34 +#: templates/virtualization/virtualmachine/interfaces.html:11 +#: templates/virtualization/virtualmachine/virtual_disks.html:11 +msgid "Rename" +msgstr "Renomear" + +#: templates/dcim/devicebay.html:18 +msgid "Device Bay" +msgstr "Compartimento de dispositivos" + +#: templates/dcim/devicebay.html:48 +msgid "Installed Device" +msgstr "Dispositivo instalado" + +#: templates/dcim/devicebay_delete.html:6 +#, python-format +msgid "Delete device bay %(devicebay)s?" +msgstr "Excluir compartimento do dispositivo %(devicebay)s?" + +#: templates/dcim/devicebay_delete.html:11 +#, python-format +msgid "" +"Are you sure you want to delete this device bay from " +"%(device)s?" +msgstr "" +"Tem certeza de que deseja excluir este compartimento de dispositivo do " +"%(device)s?" + +#: templates/dcim/devicebay_depopulate.html:6 +#, python-format +msgid "Remove %(device)s from %(device_bay)s?" +msgstr "Remover %(device)s desde %(device_bay)s?" + +#: templates/dcim/devicebay_depopulate.html:13 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from " +"%(device_bay)s?" +msgstr "" +"Tem certeza de que deseja remover %(device)s desde " +"%(device_bay)s?" + +#: templates/dcim/devicebay_populate.html:13 +msgid "Populate" +msgstr "Preencher" + +#: templates/dcim/devicebay_populate.html:22 +msgid "Bay" +msgstr "Baía" + +#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +msgid "Add Device" +msgstr "Adicionar dispositivo" + +#: templates/dcim/devicerole.html:43 +msgid "VM Role" +msgstr "Função da VM" + +#: templates/dcim/devicetype.html:21 templates/dcim/moduletype.html:19 +msgid "Model Name" +msgstr "Nome do modelo" + +#: templates/dcim/devicetype.html:28 templates/dcim/moduletype.html:23 +msgid "Part Number" +msgstr "Número da peça" + +#: templates/dcim/devicetype.html:40 +msgid "Height (U" +msgstr "Altura (U)" + +#: templates/dcim/devicetype.html:44 +msgid "Exclude From Utilization" +msgstr "Excluir da utilização" + +#: templates/dcim/devicetype.html:62 +msgid "Parent/Child" +msgstr "Pai/filho" + +#: templates/dcim/devicetype.html:74 +msgid "Front Image" +msgstr "Imagem frontal" + +#: templates/dcim/devicetype.html:86 +msgid "Rear Image" +msgstr "Imagem traseira" + +#: templates/dcim/frontport.html:57 +msgid "Rear Port Position" +msgstr "Posição da porta traseira" + +#: templates/dcim/frontport.html:79 templates/dcim/interface.html:150 +#: templates/dcim/poweroutlet.html:67 templates/dcim/powerport.html:67 +#: templates/dcim/rearport.html:75 +msgid "Marked as Connected" +msgstr "Marcado como conectado" + +#: templates/dcim/frontport.html:93 templates/dcim/rearport.html:89 +msgid "Connection Status" +msgstr "Status da conexão" + +#: templates/dcim/inc/cable_termination.html:65 +msgid "No termination" +msgstr "Sem rescisão" + +#: templates/dcim/inc/cable_toggle_buttons.html:4 +msgid "Mark Planned" +msgstr "Marca planejada" + +#: templates/dcim/inc/cable_toggle_buttons.html:8 +msgid "Mark Installed" +msgstr "Marcar instalado" + +#: templates/dcim/inc/connection_endpoints.html:13 +msgid "Path Status" +msgstr "Status do caminho" + +#: templates/dcim/inc/connection_endpoints.html:18 +msgid "Not Reachable" +msgstr "Não acessível" + +#: templates/dcim/inc/connection_endpoints.html:23 +msgid "Path Endpoints" +msgstr "Pontos finais do caminho" + +#: templates/dcim/inc/endpoint_connection.html:8 +#: templates/dcim/powerfeed.html:128 templates/dcim/rearport.html:101 +msgid "Not connected" +msgstr "Não conectado" + +#: templates/dcim/inc/interface_vlans_table.html:6 +msgid "Untagged" +msgstr "Sem etiqueta" + +#: templates/dcim/inc/interface_vlans_table.html:37 +msgid "No VLANs Assigned" +msgstr "Nenhuma VLAN atribuída" + +#: templates/dcim/inc/interface_vlans_table.html:44 +#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +msgid "Clear" +msgstr "Claro" + +#: templates/dcim/inc/interface_vlans_table.html:47 +msgid "Clear All" +msgstr "Limpar tudo" + +#: templates/dcim/interface.html:17 +msgid "Add Child Interface" +msgstr "Adicionar interface infantil" + +#: templates/dcim/interface.html:51 +msgid "Speed/Duplex" +msgstr "Velocidade/Duplex" + +#: templates/dcim/interface.html:74 +msgid "PoE Mode" +msgstr "Modo PoE" + +#: templates/dcim/interface.html:78 +msgid "PoE Type" +msgstr "Tipo PoE" + +#: templates/dcim/interface.html:82 +#: templates/virtualization/vminterface.html:66 +msgid "802.1Q Mode" +msgstr "Modo 802.1Q" + +#: templates/dcim/interface.html:130 +#: templates/virtualization/vminterface.html:62 +msgid "MAC Address" +msgstr "Endereço MAC" + +#: templates/dcim/interface.html:157 +msgid "Wireless Link" +msgstr "Link sem fio" + +#: templates/dcim/interface.html:226 vpn/choices.py:55 +msgid "Peer" +msgstr "Par" + +#: templates/dcim/interface.html:238 +#: templates/wireless/inc/wirelesslink_interface.html:26 +msgid "Channel" +msgstr "Canal" + +#: templates/dcim/interface.html:247 +#: templates/wireless/inc/wirelesslink_interface.html:32 +msgid "Channel Frequency" +msgstr "Frequência do canal" + +#: templates/dcim/interface.html:250 templates/dcim/interface.html:258 +#: templates/dcim/interface.html:269 templates/dcim/interface.html:277 +msgid "MHz" +msgstr "MHz" + +#: templates/dcim/interface.html:266 +#: templates/wireless/inc/wirelesslink_interface.html:42 +msgid "Channel Width" +msgstr "Largura do canal" + +#: templates/dcim/interface.html:295 templates/wireless/wirelesslan.html:15 +#: templates/wireless/wirelesslink.html:24 wireless/forms/bulk_edit.py:59 +#: wireless/forms/bulk_edit.py:101 wireless/forms/filtersets.py:39 +#: wireless/forms/filtersets.py:79 wireless/models.py:81 +#: wireless/models.py:155 wireless/tables/wirelesslan.py:44 +msgid "SSID" +msgstr "DISSE" + +#: templates/dcim/interface.html:316 +msgid "LAG Members" +msgstr "Membros do LAG" + +#: templates/dcim/interface.html:335 +msgid "No member interfaces" +msgstr "Sem interfaces de membros" + +#: templates/dcim/interface.html:359 templates/ipam/fhrpgroup.html:80 +#: templates/ipam/iprange/ip_addresses.html:7 +#: templates/ipam/prefix/ip_addresses.html:7 +#: templates/virtualization/vminterface.html:96 +msgid "Add IP Address" +msgstr "Adicionar endereço IP" + +#: templates/dcim/inventoryitem.html:25 +msgid "Parent Item" +msgstr "Item principal" + +#: templates/dcim/inventoryitem.html:49 +msgid "Part ID" +msgstr "ID da peça" + +#: templates/dcim/inventoryitem_bulk_delete.html:5 +msgid "This will also delete all child inventory items of those listed" +msgstr "" +"Isso também excluirá todos os itens do inventário infantil dos listados." + +#: templates/dcim/inventoryitem_edit.html:33 +msgid "Component Assignment" +msgstr "Atribuição de componentes" + +#: templates/dcim/inventoryitem_edit.html:59 +#: templates/dcim/poweroutlet.html:18 templates/dcim/powerport.html:81 +msgid "Power Outlet" +msgstr "Tomada elétrica" + +#: templates/dcim/location.html:17 +msgid "Add Child Location" +msgstr "Adicionar localização da criança" + +#: templates/dcim/location.html:76 +msgid "Child Locations" +msgstr "Localizações para crianças" + +#: templates/dcim/location.html:84 templates/dcim/site.html:137 +msgid "Add a Location" +msgstr "Adicionar um local" + +#: templates/dcim/location.html:98 templates/dcim/site.html:151 +msgid "Add a Device" +msgstr "Adicionar um dispositivo" + +#: templates/dcim/manufacturer.html:16 +msgid "Add Device Type" +msgstr "Adicionar tipo de dispositivo" + +#: templates/dcim/manufacturer.html:21 +msgid "Add Module Type" +msgstr "Adicionar tipo de módulo" + +#: templates/dcim/powerfeed.html:56 +msgid "Connected Device" +msgstr "Dispositivo conectado" + +#: templates/dcim/powerfeed.html:66 +msgid "Utilization (Allocated" +msgstr "Utilização (alocada)" + +#: templates/dcim/powerfeed.html:85 +msgid "Electrical Characteristics" +msgstr "Características elétricas" + +#: templates/dcim/powerfeed.html:95 +msgctxt "Abbreviation for volts" +msgid "V" +msgstr "V" + +#: templates/dcim/powerfeed.html:99 +msgctxt "Abbreviation for amperes" +msgid "A" +msgstr "UMA" + +#: templates/dcim/poweroutlet.html:51 +msgid "Feed Leg" +msgstr "Perna de alimentação" + +#: templates/dcim/powerpanel.html:77 +msgid "Add Power Feeds" +msgstr "Adicionar feeds de energia" + +#: templates/dcim/powerport.html:47 +msgid "Maximum Draw" +msgstr "Sorteio máximo" + +#: templates/dcim/powerport.html:51 +msgid "Allocated Draw" +msgstr "Sorteio alocado" + +#: templates/dcim/rack.html:66 +msgid "Space Utilization" +msgstr "Utilização do espaço" + +#: templates/dcim/rack.html:96 +msgid "descending" +msgstr "descedentes" + +#: templates/dcim/rack.html:96 +msgid "ascending" +msgstr "ascendente" + +#: templates/dcim/rack.html:99 +msgid "Starting Unit" +msgstr "Unidade inicial" + +#: templates/dcim/rack.html:125 +msgid "Mounting Depth" +msgstr "Profundidade de montagem" + +#: templates/dcim/rack.html:135 +msgid "Rack Weight" +msgstr "Peso da cremalheira" + +#: templates/dcim/rack.html:145 templates/dcim/rack_edit.html:67 +msgid "Maximum Weight" +msgstr "Peso máximo" + +#: templates/dcim/rack.html:155 +msgid "Total Weight" +msgstr "Peso total" + +#: templates/dcim/rack.html:173 templates/dcim/rack_elevation_list.html:16 +msgid "Images and Labels" +msgstr "Imagens e rótulos" + +#: templates/dcim/rack.html:174 templates/dcim/rack_elevation_list.html:17 +msgid "Images only" +msgstr "Somente imagens" + +#: templates/dcim/rack.html:175 templates/dcim/rack_elevation_list.html:18 +msgid "Labels only" +msgstr "Somente rótulos" + +#: templates/dcim/rack/reservations.html:9 +msgid "Add reservation" +msgstr "Adicionar reserva" + +#: templates/dcim/rack_edit.html:21 +msgid "Inventory Control" +msgstr "Controle de inventário" + +#: templates/dcim/rack_edit.html:45 +msgid "Outer Dimensions" +msgstr "Dimensões externas" + +#: templates/dcim/rack_edit.html:56 templates/dcim/rack_edit.html:71 +msgid "Unit" +msgstr "Unidade" + +#: templates/dcim/rack_elevation_list.html:12 +msgid "View List" +msgstr "Exibir lista" + +#: templates/dcim/rack_elevation_list.html:27 +msgid "Sort By" +msgstr "Ordenar por" + +#: templates/dcim/rack_elevation_list.html:77 +msgid "No Racks Found" +msgstr "Nenhuma prateleira encontrada" + +#: templates/dcim/rack_list.html:8 +msgid "View Elevations" +msgstr "Exibir elevações" + +#: templates/dcim/rackreservation.html:47 +msgid "Reservation Details" +msgstr "Detalhes da reserva" + +#: templates/dcim/rackrole.html:10 +msgid "Add Rack" +msgstr "Adicionar rack" + +#: templates/dcim/rearport.html:53 +msgid "Positions" +msgstr "Posições" + +#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +msgid "Add Site" +msgstr "Adicionar site" + +#: templates/dcim/region.html:56 +msgid "Child Regions" +msgstr "Regiões infantis" + +#: templates/dcim/region.html:64 +msgid "Add Region" +msgstr "Adicionar região" + +#: templates/dcim/site.html:56 +msgid "Facility" +msgstr "Instalação" + +#: templates/dcim/site.html:64 +msgid "Time Zone" +msgstr "Fuso horário" + +#: templates/dcim/site.html:67 +msgid "UTC" +msgstr "UTC" + +#: templates/dcim/site.html:68 +msgid "Site time" +msgstr "Hora do site" + +#: templates/dcim/site.html:75 +msgid "Physical Address" +msgstr "Endereço físico" + +#: templates/dcim/site.html:81 +msgid "Map" +msgstr "Mapa" + +#: templates/dcim/site.html:92 +msgid "Shipping Address" +msgstr "Endereço de entrega" + +#: templates/dcim/sitegroup.html:56 templates/tenancy/contactgroup.html:49 +#: templates/tenancy/tenantgroup.html:58 +#: templates/wireless/wirelesslangroup.html:56 +msgid "Child Groups" +msgstr "Grupos infantis" + +#: templates/dcim/sitegroup.html:64 +msgid "Add Site Group" +msgstr "Adicionar grupo de sites" + +#: templates/dcim/trace/attachment.html:5 +#: templates/extras/exporttemplate.html:37 +msgid "Attachment" +msgstr "Anexo" + +#: templates/dcim/virtualchassis.html:86 +msgid "Add Member" +msgstr "Adicionar membro" + +#: templates/dcim/virtualchassis_add.html:18 +msgid "Member Devices" +msgstr "Dispositivos membros" + +#: templates/dcim/virtualchassis_add_member.html:6 +#, python-format +msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" +msgstr "Adicionar novo membro ao chassi virtual %(virtual_chassis)s" + +#: templates/dcim/virtualchassis_add_member.html:17 +msgid "Add New Member" +msgstr "Adicionar novo membro" + +#: templates/dcim/virtualchassis_add_member.html:25 +msgid "Add Another" +msgstr "Adicionar outro" + +#: templates/dcim/virtualchassis_edit.html:7 +#, python-format +msgid "Editing Virtual Chassis %(name)s" +msgstr "Editando chassi virtual %(name)s" + +#: templates/dcim/virtualchassis_edit.html:54 +msgid "Rack/Unit" +msgstr "Rack/unidade" + +#: templates/dcim/virtualchassis_remove_member.html:5 +msgid "Remove Virtual Chassis Member" +msgstr "Remover membro do chassi virtual" + +#: templates/dcim/virtualchassis_remove_member.html:9 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from virtual " +"chassis %(name)s?" +msgstr "" +"Tem certeza de que deseja remover %(device)s do chassi " +"virtual %(name)s?" + +#: templates/dcim/virtualdevicecontext.html:29 templates/vpn/l2vpn.html:19 +msgid "Identifier" +msgstr "Identificador" + +#: templates/exceptions/import_error.html:6 +msgid "" +"A module import error occurred during this request. Common causes include " +"the following:" +msgstr "" +"Ocorreu um erro de importação do módulo durante essa solicitação. As causas " +"comuns incluem o seguinte:" + +#: templates/exceptions/import_error.html:10 +msgid "Missing required packages" +msgstr "Pacotes necessários ausentes" + +#: templates/exceptions/import_error.html:11 +msgid "" +"This installation of NetBox might be missing one or more required Python " +"packages. These packages are listed in requirements.txt and " +"local_requirements.txt, and are normally installed as part of " +"the installation or upgrade process. To verify installed packages, run " +"pip freeze from the console and compare the output to the list " +"of required packages." +msgstr "" +"Essa instalação do NetBox pode não ter um ou mais pacotes Python " +"necessários. Esses pacotes estão listados em requirements.txt e" +" local_requirements.txt, e normalmente são instalados como " +"parte do processo de instalação ou atualização. Para verificar os pacotes " +"instalados, execute congelamento de sementes do console e " +"compare a saída com a lista de pacotes necessários." + +#: templates/exceptions/import_error.html:20 +msgid "WSGI service not restarted after upgrade" +msgstr "O serviço WSGI não foi reiniciado após a atualização" + +#: templates/exceptions/import_error.html:21 +msgid "" +"If this installation has recently been upgraded, check that the WSGI service" +" (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" +" is running." +msgstr "" +"Se essa instalação foi atualizada recentemente, verifique se o serviço WSGI " +"(por exemplo, gunicorn ou uWSGI) foi reiniciado. Isso garante que o novo " +"código esteja em execução." + +#: templates/exceptions/permission_error.html:6 +msgid "" +"A file permission error was detected while processing this request. Common " +"causes include the following:" +msgstr "" +"Um erro de permissão de arquivo foi detectado ao processar essa solicitação." +" As causas comuns incluem o seguinte:" + +#: templates/exceptions/permission_error.html:10 +msgid "Insufficient write permission to the media root" +msgstr "Permissão de gravação insuficiente para a raiz da mídia" + +#: templates/exceptions/permission_error.html:11 +#, python-format +msgid "" +"The configured media root is %(media_root)s. Ensure that the " +"user NetBox runs as has access to write files to all locations within this " +"path." +msgstr "" +"A raiz de mídia configurada é %(media_root)s. Certifique-se de " +"que o usuário NetBox seja executado como se tivesse acesso para gravar " +"arquivos em todos os locais dentro desse caminho." + +#: templates/exceptions/programming_error.html:6 +msgid "" +"A database programming error was detected while processing this request. " +"Common causes include the following:" +msgstr "" +"Um erro de programação do banco de dados foi detectado ao processar essa " +"solicitação. As causas comuns incluem o seguinte:" + +#: templates/exceptions/programming_error.html:10 +msgid "Database migrations missing" +msgstr "Migrações de banco de dados ausentes" + +#: templates/exceptions/programming_error.html:11 +msgid "" +"When upgrading to a new NetBox release, the upgrade script must be run to " +"apply any new database migrations. You can run migrations manually by " +"executing python3 manage.py migrate from the command line." +msgstr "" +"Ao atualizar para uma nova versão do NetBox, o script de atualização deve " +"ser executado para aplicar qualquer nova migração de banco de dados. Você " +"pode executar migrações manualmente executando python3 manage.py " +"migrar da linha de comando." + +#: templates/exceptions/programming_error.html:18 +msgid "Unsupported PostgreSQL version" +msgstr "Versão não suportada do PostgreSQL" + +#: templates/exceptions/programming_error.html:19 +msgid "" +"Ensure that PostgreSQL version 12 or later is in use. You can check this by " +"connecting to the database using NetBox's credentials and issuing a query " +"for SELECT VERSION()." +msgstr "" +"Certifique-se de que o PostgreSQL versão 12 ou posterior esteja em uso. Você" +" pode verificar isso conectando-se ao banco de dados usando as credenciais " +"do NetBox e emitindo uma consulta para SELECIONE A VERSÃO ()." + +#: templates/extras/admin/plugins_list.html:4 +#: templates/extras/admin/plugins_list.html:9 +#: templates/extras/admin/plugins_list.html:13 +msgid "Installed Plugins" +msgstr "Plugins instalados" + +#: templates/extras/admin/plugins_list.html:23 +msgid "Package Name" +msgstr "Nome do pacote" + +#: templates/extras/admin/plugins_list.html:24 +msgid "Author" +msgstr "Autor" + +#: templates/extras/admin/plugins_list.html:25 +msgid "Author Email" +msgstr "E-mail do autor" + +#: templates/extras/admin/plugins_list.html:27 +#: templates/vpn/ipsecprofile.html:47 vpn/forms/bulk_edit.py:140 +#: vpn/forms/bulk_import.py:171 vpn/tables/crypto.py:61 +msgid "Version" +msgstr "Versão" + +#: templates/extras/configcontext.html:46 +#: templates/extras/configtemplate.html:38 +#: templates/extras/exporttemplate.html:57 +msgid "The data file associated with this object has been deleted" +msgstr "O arquivo de dados associado a esse objeto foi excluído" + +#: templates/extras/configcontext.html:55 +#: templates/extras/configtemplate.html:47 +#: templates/extras/exporttemplate.html:66 +msgid "Data Synced" +msgstr "Dados sincronizados" + +#: templates/extras/configcontext_list.html:7 +#: templates/extras/configtemplate_list.html:7 +#: templates/extras/exporttemplate_list.html:7 +msgid "Sync Data" +msgstr "Sincronizar dados" + +#: templates/extras/configtemplate.html:58 +msgid "Environment Parameters" +msgstr "Parâmetros do ambiente" + +#: templates/extras/configtemplate.html:69 +#: templates/extras/exporttemplate.html:88 +msgid "Template" +msgstr "Modelo" + +#: templates/extras/customfield.html:31 templates/extras/customlink.html:22 +msgid "Group Name" +msgstr "Nome do grupo" + +#: templates/extras/customfield.html:43 +msgid "Cloneable" +msgstr "Clonável" + +#: templates/extras/customfield.html:53 +msgid "Default Value" +msgstr "Valor padrão" + +#: templates/extras/customfield.html:64 +msgid "Search Weight" +msgstr "Peso da pesquisa" + +#: templates/extras/customfield.html:74 +msgid "Filter Logic" +msgstr "Lógica do filtro" + +#: templates/extras/customfield.html:78 +msgid "Display Weight" +msgstr "Peso da tela" + +#: templates/extras/customfield.html:82 +msgid "UI Visible" +msgstr "UI visível" + +#: templates/extras/customfield.html:86 +msgid "UI Editable" +msgstr "UI editável" + +#: templates/extras/customfield.html:108 +msgid "Validation Rules" +msgstr "Regras de validação" + +#: templates/extras/customfield.html:112 +msgid "Minimum Value" +msgstr "Valor mínimo" + +#: templates/extras/customfield.html:116 +msgid "Maximum Value" +msgstr "Valor máximo" + +#: templates/extras/customfield.html:120 +msgid "Regular Expression" +msgstr "Expressão regular" + +#: templates/extras/customlink.html:30 +msgid "Button Class" +msgstr "Classe de botão" + +#: templates/extras/customlink.html:41 templates/extras/exporttemplate.html:73 +#: templates/extras/savedfilter.html:41 +msgid "Assigned Models" +msgstr "Modelos atribuídos" + +#: templates/extras/customlink.html:57 +msgid "Link Text" +msgstr "Texto do link" + +#: templates/extras/customlink.html:65 +msgid "Link URL" +msgstr "URL do link" + +#: templates/extras/dashboard/reset.html:4 templates/home.html:63 +msgid "Reset Dashboard" +msgstr "Redefinir painel" + +#: templates/extras/dashboard/reset.html:8 +msgid "" +"This will remove all configured widgets and restore the " +"default dashboard configuration." +msgstr "" +"Isso removerá tudo configurou widgets e restaurou a " +"configuração padrão do painel." + +#: templates/extras/dashboard/reset.html:13 +msgid "" +"This change affects only your dashboard, and will not impact other " +"users." +msgstr "" +"Essa mudança afeta apenas seu painel de controle e não afetará outros" +" usuários." + +#: templates/extras/dashboard/widget_add.html:7 +msgid "Add a Widget" +msgstr "Adicionar um widget" + +#: templates/extras/dashboard/widgets/bookmarks.html:14 +msgid "No bookmarks have been added yet." +msgstr "Nenhum marcador foi adicionado ainda." + +#: templates/extras/dashboard/widgets/objectcounts.html:15 +msgid "No permission" +msgstr "Sem permissão" + +#: templates/extras/dashboard/widgets/objectlist.html:6 +msgid "No permission to view this content" +msgstr "Sem permissão para visualizar este conteúdo" + +#: templates/extras/dashboard/widgets/objectlist.html:10 +msgid "Unable to load content. Invalid view name" +msgstr "Não é possível carregar o conteúdo. Nome de exibição inválido" + +#: templates/extras/dashboard/widgets/rssfeed.html:12 +msgid "No content found" +msgstr "Nenhum conteúdo encontrado" + +#: templates/extras/dashboard/widgets/rssfeed.html:18 +msgid "There was a problem fetching the RSS feed" +msgstr "Houve um problema ao obter o feed RSS" + +#: templates/extras/dashboard/widgets/rssfeed.html:21 +msgid "HTTP" +msgstr "HTTP" + +#: templates/extras/eventrule.html:63 +msgid "Job start" +msgstr "Início do trabalho" + +#: templates/extras/eventrule.html:67 +msgid "Job end" +msgstr "Fim do trabalho" + +#: templates/extras/exporttemplate.html:29 +msgid "MIME Type" +msgstr "Tipo MIME" + +#: templates/extras/exporttemplate.html:33 +msgid "File Extension" +msgstr "Extensão de arquivo" + +#: templates/extras/htmx/report_result.html:9 +#: templates/extras/htmx/script_result.html:10 +msgid "Scheduled for" +msgstr "Programado para" + +#: templates/extras/htmx/report_result.html:14 +#: templates/extras/htmx/script_result.html:15 +msgid "Duration" +msgstr "Duração" + +#: templates/extras/htmx/report_result.html:20 +msgid "Report Methods" +msgstr "Métodos de relatório" + +#: templates/extras/htmx/report_result.html:38 +msgid "Report Results" +msgstr "Resultados do relatório" + +#: templates/extras/htmx/report_result.html:44 +#: templates/extras/htmx/script_result.html:26 +msgid "Level" +msgstr "Nível" + +#: templates/extras/htmx/report_result.html:46 +#: templates/extras/htmx/script_result.html:27 +msgid "Message" +msgstr "Mensagem" + +#: templates/extras/htmx/script_result.html:21 +msgid "Script Log" +msgstr "Registro de scripts" + +#: templates/extras/htmx/script_result.html:25 +msgid "Line" +msgstr "Linha" + +#: templates/extras/htmx/script_result.html:38 +msgid "No log output" +msgstr "Sem saída de log" + +#: templates/extras/htmx/script_result.html:46 +msgid "Exec Time" +msgstr "Hora de execução" + +#: templates/extras/htmx/script_result.html:46 +msgctxt "Unit of time" +msgid "seconds" +msgstr "segundos" + +#: templates/extras/htmx/script_result.html:50 +msgid "Output" +msgstr "Saída" + +#: templates/extras/inc/result_pending.html:4 +msgid "Loading" +msgstr "Carregando" + +#: templates/extras/inc/result_pending.html:6 +msgid "Results pending" +msgstr "Resultados pendentes" + +#: templates/extras/journalentry.html:16 +msgid "Journal Entry" +msgstr "Entrada de diário" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Change log retention" +msgstr "Retenção de registros de alterações" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "days" +msgstr "dias" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Indefinite" +msgstr "Indefinido" + +#: templates/extras/object_configcontext.html:11 +msgid "Rendered Context" +msgstr "Contexto renderizado" + +#: templates/extras/object_configcontext.html:22 +msgid "Local Context" +msgstr "Contexto local" + +#: templates/extras/object_configcontext.html:34 +msgid "The local config context overwrites all source contexts" +msgstr "" +"O contexto de configuração local substitui todos os contextos de origem" + +#: templates/extras/object_configcontext.html:40 +msgid "Source Contexts" +msgstr "Contextos de origem" + +#: templates/extras/object_journal.html:18 +msgid "New Journal Entry" +msgstr "Nova entrada no diário" + +#: templates/extras/objectchange.html:29 +#: templates/users/objectpermission.html:45 +msgid "Change" +msgstr "Mudança" + +#: templates/extras/objectchange.html:84 +msgid "Difference" +msgstr "Diferença" + +#: templates/extras/objectchange.html:87 +msgid "Previous" +msgstr "Anterior" + +#: templates/extras/objectchange.html:90 +msgid "Next" +msgstr "Próximo" + +#: templates/extras/objectchange.html:98 +msgid "Object Created" +msgstr "Objeto criado" + +#: templates/extras/objectchange.html:100 +msgid "Object Deleted" +msgstr "Objeto excluído" + +#: templates/extras/objectchange.html:102 +msgid "No Changes" +msgstr "Sem alterações" + +#: templates/extras/objectchange.html:117 +msgid "Pre-Change Data" +msgstr "Dados anteriores à alteração" + +#: templates/extras/objectchange.html:126 +msgid "Warning: Comparing non-atomic change to previous change record" +msgstr "" +"Aviso: Comparando a mudança não atômica com o registro de alteração anterior" + +#: templates/extras/objectchange.html:136 +msgid "Post-Change Data" +msgstr "Dados pós-alteração" + +#: templates/extras/objectchange.html:157 +#, python-format +msgid "See All %(count)s Changes" +msgstr "Ver tudo %(count)s Mudanças" + +#: templates/extras/report.html:14 +msgid "This report is invalid and cannot be run." +msgstr "Esse relatório é inválido e não pode ser executado." + +#: templates/extras/report.html:23 templates/extras/report_list.html:88 +msgid "Run Again" +msgstr "Corra novamente" + +#: templates/extras/report.html:25 templates/extras/report_list.html:90 +msgid "Run Report" +msgstr "Executar relatório" + +#: templates/extras/report.html:36 +msgid "Last run" +msgstr "Última corrida" + +#: templates/extras/report/base.html:30 +msgid "Report" +msgstr "Relatório" + +#: templates/extras/report_list.html:48 templates/extras/script_list.html:54 +msgid "Last Run" +msgstr "Última corrida" + +#: templates/extras/report_list.html:70 templates/extras/script_list.html:77 +msgid "Never" +msgstr "Nunca" + +#: templates/extras/report_list.html:75 +msgid "Report has no test methods" +msgstr "O relatório não tem métodos de teste" + +#: templates/extras/report_list.html:76 +msgid "Invalid" +msgstr "Inválido" + +#: templates/extras/report_list.html:125 +msgid "No Reports Found" +msgstr "Nenhum relatório encontrado" + +#: templates/extras/report_list.html:128 +#, python-format +msgid "" +"Get started by creating a report from " +"an uploaded file or data source." +msgstr "" +"Comece por criando um relatório de um " +"arquivo ou fonte de dados carregado." + +#: templates/extras/script.html:13 +msgid "You do not have permission to run scripts" +msgstr "Você não tem permissão para executar scripts" + +#: templates/extras/script.html:37 +msgid "Run Script" +msgstr "Executar script" + +#: templates/extras/script_list.html:44 +#, python-format +msgid "" +"Script file at %(file_path)s could not be " +"loaded." +msgstr "" +"Arquivo de script em %(file_path)s não pôde ser " +"carregado." + +#: templates/extras/script_list.html:91 +msgid "No Scripts Found" +msgstr "Nenhum script encontrado" + +#: templates/extras/script_list.html:94 +#, python-format +msgid "" +"Get started by creating a script from " +"an uploaded file or data source." +msgstr "" +"Comece por criando um script de um " +"arquivo ou fonte de dados carregado." + +#: templates/extras/script_result.html:42 +msgid "Log" +msgstr "Registro" + +#: templates/extras/tag.html:35 +msgid "Tagged Items" +msgstr "Itens marcados" + +#: templates/extras/tag.html:47 +msgid "Allowed Object Types" +msgstr "Tipos de objetos permitidos" + +#: templates/extras/tag.html:56 +msgid "Any" +msgstr "Qualquer" + +#: templates/extras/tag.html:63 +msgid "Tagged Item Types" +msgstr "Tipos de itens marcados" + +#: templates/extras/tag.html:89 +msgid "Tagged Objects" +msgstr "Objetos marcados" + +#: templates/extras/webhook.html:33 +msgid "HTTP Method" +msgstr "Método HTTP" + +#: templates/extras/webhook.html:41 +msgid "HTTP Content Type" +msgstr "Tipo de conteúdo HTTP" + +#: templates/extras/webhook.html:58 +msgid "SSL Verification" +msgstr "Verificação SSL" + +#: templates/extras/webhook.html:73 +msgid "Additional Headers" +msgstr "Cabeçalhos adicionais" + +#: templates/extras/webhook.html:85 +msgid "Body Template" +msgstr "Modelo de corpo" + +#: templates/generic/bulk_add_component.html:15 +msgid "Bulk Creation" +msgstr "Criação em massa" + +#: templates/generic/bulk_add_component.html:20 +#: templates/generic/bulk_edit.html:28 +msgid "Selected Objects" +msgstr "Objetos selecionados" + +#: templates/generic/bulk_add_component.html:46 +msgid "to Add" +msgstr "para adicionar" + +#: templates/generic/bulk_delete.html:24 +msgid "Confirm Bulk Deletion" +msgstr "Confirme a exclusão em massa" + +#: templates/generic/bulk_delete.html:26 +msgctxt "Noun" +msgid "Warning" +msgstr "Aviso" + +#: templates/generic/bulk_delete.html:27 +#, python-format +msgid "" +"The following operation will delete %(count)s " +"%(type_plural)s. Please carefully review the objects to be deleted and " +"confirm below." +msgstr "" +"A operação a seguir será excluída %(count)s " +"%(type_plural)s. Analise cuidadosamente os objetos a serem excluídos e " +"confirme abaixo." + +#: templates/generic/bulk_edit.html:16 templates/generic/object_edit.html:17 +msgid "Editing" +msgstr "Editando" + +#: templates/generic/bulk_edit.html:23 +msgid "Bulk Edit" +msgstr "Edição em massa" + +#: templates/generic/bulk_edit.html:124 templates/generic/bulk_rename.html:42 +msgid "Apply" +msgstr "Aplique" + +#: templates/generic/bulk_import.html:14 +msgid "Bulk Import" +msgstr "Importação em massa" + +#: templates/generic/bulk_import.html:20 +msgid "Direct Import" +msgstr "Importação direta" + +#: templates/generic/bulk_import.html:25 +msgid "Upload File" +msgstr "Carregar arquivo" + +#: templates/generic/bulk_import.html:51 templates/generic/bulk_import.html:73 +#: templates/generic/bulk_import.html:95 +msgid "Submit" +msgstr "Enviar" + +#: templates/generic/bulk_import.html:110 +msgid "Field Options" +msgstr "Opções de campo" + +#: templates/generic/bulk_import.html:117 +msgid "Accessor" +msgstr "Acessador" + +#: templates/generic/bulk_import.html:154 +msgid "Import Value" +msgstr "Valor de importação" + +#: templates/generic/bulk_import.html:181 +msgid "Format: YYYY-MM-DD" +msgstr "Formato: AAAA-MM-DD" + +#: templates/generic/bulk_import.html:183 +msgid "Specify true or false" +msgstr "Especifique verdadeiro ou falso" + +#: templates/generic/bulk_import.html:195 +msgid "Required fields must be specified for all objects." +msgstr "" +"Campos obrigatórios mosto ser especificado para todos os " +"objetos." + +#: templates/generic/bulk_import.html:201 +#, python-format +msgid "" +"Related objects may be referenced by any unique attribute. For example, " +"%(example)s would identify a VRF by its route distinguisher." +msgstr "" +"Objetos relacionados podem ser referenciados por qualquer atributo " +"exclusivo. Por exemplo, %(example)s identificaria um VRF por " +"seu distintor de rota." + +#: templates/generic/bulk_remove.html:13 +msgid "Confirm Bulk Removal" +msgstr "Confirme a remoção em massa" + +#: templates/generic/bulk_remove.html:15 +#, python-format +msgid "" +"Warning: The following operation will remove %(count)s " +"%(obj_type_plural)s from %(parent_obj)s." +msgstr "" +"Aviso: A operação a seguir removerá %(count)s " +"%(obj_type_plural)s desde %(parent_obj)s." + +#: templates/generic/bulk_remove.html:21 +#, python-format +msgid "" +"Please carefully review the %(obj_type_plural)s to be removed and confirm " +"below." +msgstr "" +"Por favor, revise cuidadosamente o %(obj_type_plural)s a ser removido e " +"confirme abaixo." + +#: templates/generic/bulk_remove.html:38 +#, python-format +msgid "Delete these %(count)s %(obj_type_plural)s" +msgstr "Exclua esses %(count)s %(obj_type_plural)s" + +#: templates/generic/bulk_rename.html:7 +msgid "Renaming" +msgstr "Renomeando" + +#: templates/generic/bulk_rename.html:16 +msgid "Current Name" +msgstr "Nome atual" + +#: templates/generic/bulk_rename.html:17 +msgid "New Name" +msgstr "Novo nome" + +#: templates/generic/bulk_rename.html:40 +#: utilities/templates/widgets/markdown_input.html:11 +msgid "Preview" +msgstr "prévia" + +#: templates/generic/confirmation_form.html:16 +msgid "Are you sure" +msgstr "Você tem certeza" + +#: templates/generic/confirmation_form.html:19 +msgid "Confirm" +msgstr "Confirme" + +#: templates/generic/object.html:51 +msgid "ago" +msgstr "atrás" + +#: templates/generic/object_children.html:27 +#: utilities/templates/buttons/bulk_edit.html:4 +msgid "Edit Selected" +msgstr "Editar selecionado" + +#: templates/generic/object_children.html:41 +#: utilities/templates/buttons/bulk_delete.html:4 +msgid "Delete Selected" +msgstr "Excluir selecionado" + +#: templates/generic/object_edit.html:19 +#, python-format +msgid "Add a new %(object_type)s" +msgstr "Adicionar um novo %(object_type)s" + +#: templates/generic/object_edit.html:47 +msgid "View model documentation" +msgstr "Veja a documentação do modelo" + +#: templates/generic/object_edit.html:48 +msgid "Help" +msgstr "Socorro" + +#: templates/generic/object_edit.html:73 +msgid "Create & Add Another" +msgstr "Criar e adicionar outro" + +#: templates/generic/object_list.html:48 templates/search.html:13 +msgid "Results" +msgstr "Resultados" + +#: templates/generic/object_list.html:54 +msgid "Filters" +msgstr "Filtros" + +#: templates/generic/object_list.html:94 +#, python-format +msgid "" +"Select all %(count)s %(object_type_plural)s matching query" +msgstr "" +"Selecionar tudo %(count)s %(object_type_plural)s consulta " +"correspondente" + +#: templates/home.html:12 +msgid "New Release Available" +msgstr "Nova versão disponível" + +#: templates/home.html:14 +msgid "is available" +msgstr "está disponível" + +#: templates/home.html:17 +msgctxt "Document title" +msgid "Upgrade Instructions" +msgstr "Instruções de atualização" + +#: templates/home.html:37 +msgid "Unlock Dashboard" +msgstr "Desbloquear painel" + +#: templates/home.html:46 +msgid "Lock Dashboard" +msgstr "Bloquear painel" + +#: templates/home.html:57 +msgid "Add Widget" +msgstr "Adicionar widget" + +#: templates/home.html:60 +msgid "Save Layout" +msgstr "Salvar layout" + +#: templates/htmx/delete_form.html:7 +msgid "Confirm Deletion" +msgstr "Confirmar exclusão" + +#: templates/htmx/delete_form.html:11 +#, python-format +msgid "" +"Are you sure you want to delete " +"%(object_type)s %(object)s?" +msgstr "" +"Tem certeza de que quer deletar " +"%(object_type)s %(object)s?" + +#: templates/htmx/delete_form.html:17 +msgid "The following objects will be deleted as a result of this action." +msgstr "Os objetos a seguir serão excluídos como resultado dessa ação." + +#: templates/htmx/object_selector.html:5 +msgid "Select" +msgstr "Selecionar" + +#: templates/inc/filter_list.html:50 +#: utilities/templates/helpers/table_config_form.html:39 +msgid "Reset" +msgstr "Redefinir" + +#: templates/inc/missing_prerequisites.html:7 +#, python-format +msgid "" +"Before you can add a %(model)s you must first create a " +"%(prerequisite_model)s." +msgstr "" +"Antes que você possa adicionar um %(model)s você deve primeiro criar um " +"%(prerequisite_model)s." + +#: templates/inc/paginator.html:38 templates/inc/paginator_htmx.html:53 +msgid "Per Page" +msgstr "Por página" + +#: templates/inc/paginator.html:49 templates/inc/paginator_htmx.html:69 +#, python-format +msgid "Showing %(start)s-%(end)s of %(total)s" +msgstr "Mostrando %(start)s-%(end)s do %(total)s" + +#: templates/inc/panels/image_attachments.html:10 +msgid "Attach an image" +msgstr "Anexar uma imagem" + +#: templates/inc/panels/related_objects.html:5 +msgid "Related Objects" +msgstr "Objetos relacionados" + +#: templates/inc/panels/tags.html:11 +msgid "No tags assigned" +msgstr "Nenhuma tag atribuída" + +#: templates/inc/profile_button.html:12 templates/inc/profile_button.html:62 +msgid "Dark Mode" +msgstr "Modo escuro" + +#: templates/inc/profile_button.html:45 +msgid "Log Out" +msgstr "Sair" + +#: templates/inc/profile_button.html:53 +msgid "Log In" +msgstr "Faça login" + +#: templates/inc/sync_warning.html:7 +msgid "Data is out of sync with upstream file" +msgstr "Os dados estão fora de sincronia com o arquivo upstream" + +#: templates/inc/table_controls_htmx.html:16 +#: templates/inc/table_controls_htmx.html:18 +msgid "Configure Table" +msgstr "Configurar tabela" + +#: templates/ipam/aggregate.html:15 templates/ipam/ipaddress.html:17 +#: templates/ipam/iprange.html:16 templates/ipam/prefix.html:16 +msgid "Family" +msgstr "Família" + +#: templates/ipam/aggregate.html:40 +msgid "Date Added" +msgstr "Data adicionada" + +#: templates/ipam/aggregate/prefixes.html:8 +#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +msgid "Add Prefix" +msgstr "Adicionar prefixo" + +#: templates/ipam/asn.html:24 +msgid "AS Number" +msgstr "Número AS" + +#: templates/ipam/fhrpgroup.html:55 +msgid "Authentication Type" +msgstr "Tipo de autenticação" + +#: templates/ipam/fhrpgroup.html:59 +msgid "Authentication Key" +msgstr "Chave de autenticação" + +#: templates/ipam/fhrpgroup.html:72 +msgid "Virtual IP Addresses" +msgstr "Endereços IP virtuais" + +#: templates/ipam/fhrpgroupassignment_edit.html:8 +msgid "FHRP Group Assignment" +msgstr "Atribuição de grupo do FHRP" + +#: templates/ipam/inc/ipaddress_edit_header.html:19 +msgid "Assign IP" +msgstr "Atribuir IP" + +#: templates/ipam/inc/ipaddress_edit_header.html:28 +msgid "Bulk Create" +msgstr "Criação em massa" + +#: templates/ipam/inc/panels/fhrp_groups.html:12 +msgid "Virtual IPs" +msgstr "IPs virtuais" + +#: templates/ipam/inc/panels/fhrp_groups.html:52 +msgid "Create Group" +msgstr "Criar grupo" + +#: templates/ipam/inc/panels/fhrp_groups.html:57 +msgid "Assign Group" +msgstr "Atribuir grupo" + +#: templates/ipam/inc/toggle_available.html:7 +msgid "Show Assigned" +msgstr "Mostrar atribuído" + +#: templates/ipam/inc/toggle_available.html:10 +msgid "Show Available" +msgstr "Mostrar disponível" + +#: templates/ipam/inc/toggle_available.html:13 +msgid "Show All" +msgstr "Mostrar tudo" + +#: templates/ipam/ipaddress.html:26 templates/ipam/iprange.html:48 +#: templates/ipam/prefix.html:25 +msgid "Global" +msgstr "Global" + +#: templates/ipam/ipaddress.html:88 +msgid "NAT (outside)" +msgstr "NAT (externo)" + +#: templates/ipam/ipaddress_assign.html:8 +msgid "Assign an IP Address" +msgstr "Atribuir um endereço IP" + +#: templates/ipam/ipaddress_assign.html:23 +msgid "Select IP Address" +msgstr "Selecione o endereço IP" + +#: templates/ipam/ipaddress_assign.html:39 +msgid "Search Results" +msgstr "Resultados da pesquisa" + +#: templates/ipam/ipaddress_bulk_add.html:6 +msgid "Bulk Add IP Addresses" +msgstr "Adicionar endereços IP em massa" + +#: templates/ipam/ipaddress_edit.html:35 +msgid "Interface Assignment" +msgstr "Atribuição de interface" + +#: templates/ipam/ipaddress_edit.html:74 +msgid "NAT IP (Inside" +msgstr "NAT IP (interno)" + +#: templates/ipam/iprange.html:20 +msgid "Starting Address" +msgstr "Endereço inicial" + +#: templates/ipam/iprange.html:24 +msgid "Ending Address" +msgstr "Endereço final" + +#: templates/ipam/iprange.html:36 templates/ipam/prefix.html:104 +msgid "Marked fully utilized" +msgstr "Marcado como totalmente utilizado" + +#: templates/ipam/prefix.html:112 +msgid "Child IPs" +msgstr "IPs de crianças" + +#: templates/ipam/prefix.html:120 +msgid "Available IPs" +msgstr "IPs disponíveis" + +#: templates/ipam/prefix.html:132 +msgid "First available IP" +msgstr "Primeiro IP disponível" + +#: templates/ipam/prefix.html:151 +msgid "Addressing Details" +msgstr "Detalhes de endereçamento" + +#: templates/ipam/prefix.html:181 +msgid "Prefix Details" +msgstr "Detalhes do prefixo" + +#: templates/ipam/prefix.html:187 +msgid "Network Address" +msgstr "Endereço de rede" + +#: templates/ipam/prefix.html:191 +msgid "Network Mask" +msgstr "Máscara de rede" + +#: templates/ipam/prefix.html:195 +msgid "Wildcard Mask" +msgstr "Máscara Wildcard" + +#: templates/ipam/prefix.html:199 +msgid "Broadcast Address" +msgstr "Endereço de transmissão" + +#: templates/ipam/prefix/ip_ranges.html:7 +msgid "Add IP Range" +msgstr "Adicionar intervalo de IP" + +#: templates/ipam/prefix_list.html:7 +msgid "Hide Depth Indicators" +msgstr "Ocultar indicadores de profundidade" + +#: templates/ipam/prefix_list.html:11 +msgid "Max Depth" +msgstr "Profundidade máxima" + +#: templates/ipam/prefix_list.html:28 +msgid "Max Length" +msgstr "Comprimento máximo" + +#: templates/ipam/rir.html:10 +msgid "Add Aggregate" +msgstr "Adicionar agregado" + +#: templates/ipam/routetarget.html:10 +msgid "Route Target" +msgstr "Alvo da rota" + +#: templates/ipam/routetarget.html:40 +msgid "Importing VRFs" +msgstr "Importando VRFs" + +#: templates/ipam/routetarget.html:49 +msgid "Exporting VRFs" +msgstr "Exportando VRFs" + +#: templates/ipam/routetarget.html:60 +msgid "Importing L2VPNs" +msgstr "Importando L2VPNs" + +#: templates/ipam/routetarget.html:69 +msgid "Exporting L2VPNs" +msgstr "Exportando L2VPNs" + +#: templates/ipam/service.html:22 templates/ipam/service_create.html:8 +#: templates/ipam/service_edit.html:8 +msgid "Service" +msgstr "Serviço" + +#: templates/ipam/service_create.html:43 +msgid "From Template" +msgstr "Do modelo" + +#: templates/ipam/service_create.html:48 +msgid "Custom" +msgstr "Personalizado" + +#: templates/ipam/service_edit.html:37 +msgid "Port(s)" +msgstr "Porta (s)" + +#: templates/ipam/vlan.html:95 +msgid "Add a Prefix" +msgstr "Adicionar um prefixo" + +#: templates/ipam/vlangroup.html:18 +msgid "Add VLAN" +msgstr "Adicionar VLAN" + +#: templates/ipam/vlangroup.html:43 +msgid "Permitted VIDs" +msgstr "VIDs permitidos" + +#: templates/ipam/vrf.html:19 +msgid "Route Distinguisher" +msgstr "Distintor de rotas" + +#: templates/ipam/vrf.html:32 +msgid "Unique IP Space" +msgstr "Espaço IP exclusivo" + +#: templates/login.html:20 +#: utilities/templates/form_helpers/render_errors.html:7 +msgid "Errors" +msgstr "Erros" + +#: templates/login.html:48 +msgid "Sign In" +msgstr "Entrar" + +#: templates/login.html:54 +msgid "Or use a single sign-on (SSO) provider" +msgstr "Ou use um provedor de login único (SSO)" + +#: templates/login.html:68 +msgid "Toggle Color Mode" +msgstr "Alternar modo de cor" + +#: templates/media_failure.html:7 +msgid "Static Media Failure - NetBox" +msgstr "Falha de mídia estática - NetBox" + +#: templates/media_failure.html:21 +msgid "Static Media Failure" +msgstr "Falha de mídia estática" + +#: templates/media_failure.html:23 +msgid "The following static media file failed to load" +msgstr "O seguinte arquivo de mídia estática falhou ao carregar" + +#: templates/media_failure.html:26 +msgid "Check the following" +msgstr "Verifique o seguinte" + +#: templates/media_failure.html:29 +msgid "" +"manage.py collectstatic was run during the most recent upgrade." +" This installs the most recent iteration of each static file into the static" +" root path." +msgstr "" +"manage.py coleta estática foi executado durante a atualização " +"mais recente. Isso instala a iteração mais recente de cada arquivo estático " +"no caminho raiz estático." + +#: templates/media_failure.html:35 +#, python-format +msgid "" +"The HTTP service (e.g. nginx or Apache) is configured to serve files from " +"the STATIC_ROOT path. Refer to the " +"installation documentation for further guidance." +msgstr "" +"O serviço HTTP (por exemplo, nginx ou Apache) está configurado para servir " +"arquivos do RAIZ_ESTÁTICA caminho. Consulte a documentação de instalação para obter mais " +"orientações." + +#: templates/media_failure.html:47 +#, python-format +msgid "" +"The file %(filename)s exists in the static root directory and " +"is readable by the HTTP server." +msgstr "" +"O arquivo %(filename)s existe no diretório raiz estático e pode" +" ser lido pelo servidor HTTP." + +#: templates/media_failure.html:55 +#, python-format +msgid "Click here to attempt loading NetBox again." +msgstr "" +"Clique aqui para tentar carregar o NetBox " +"novamente." + +#: templates/tenancy/contact.html:18 tenancy/filtersets.py:135 +#: tenancy/forms/bulk_edit.py:136 tenancy/forms/filtersets.py:101 +#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:109 +#: tenancy/forms/model_forms.py:132 tenancy/tables/contacts.py:98 +msgid "Contact" +msgstr "Contato" + +#: templates/tenancy/contact.html:30 tenancy/forms/bulk_edit.py:98 +msgid "Title" +msgstr "Título" + +#: templates/tenancy/contact.html:34 tenancy/forms/bulk_edit.py:103 +#: tenancy/tables/contacts.py:64 +msgid "Phone" +msgstr "Telefone" + +#: templates/tenancy/contact.html:86 tenancy/tables/contacts.py:73 +msgid "Assignments" +msgstr "Atribuições" + +#: templates/tenancy/contactassignment_edit.html:12 +msgid "Contact Assignment" +msgstr "Atribuição de contato" + +#: templates/tenancy/contactgroup.html:19 tenancy/forms/forms.py:66 +#: tenancy/forms/model_forms.py:76 +msgid "Contact Group" +msgstr "Grupo de contato" + +#: templates/tenancy/contactgroup.html:57 +msgid "Add Contact Group" +msgstr "Adicionar grupo de contato" + +#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:140 +#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:90 +msgid "Contact Role" +msgstr "Função de contato" + +#: templates/tenancy/object_contacts.html:9 +msgid "Add a contact" +msgstr "Adicionar um contato" + +#: templates/tenancy/tenantgroup.html:17 +msgid "Add Tenant" +msgstr "Adicionar inquilino" + +#: templates/tenancy/tenantgroup.html:27 tenancy/forms/model_forms.py:31 +#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +msgid "Tenant Group" +msgstr "Grupo de inquilinos" + +#: templates/tenancy/tenantgroup.html:66 +msgid "Add Tenant Group" +msgstr "Adicionar grupo de inquilinos" + +#: templates/users/group.html:37 templates/users/user.html:61 +msgid "Assigned Permissions" +msgstr "Permissões atribuídas" + +#: templates/users/objectpermission.html:6 +#: templates/users/objectpermission.html:14 users/forms/filtersets.py:67 +msgid "Permission" +msgstr "Permissão" + +#: templates/users/objectpermission.html:33 users/forms/filtersets.py:68 +#: users/forms/model_forms.py:321 +msgid "Actions" +msgstr "Ações" + +#: templates/users/objectpermission.html:37 +msgid "View" +msgstr "Visualizar" + +#: templates/users/objectpermission.html:56 users/forms/model_forms.py:324 +msgid "Constraints" +msgstr "Restrições" + +#: templates/users/objectpermission.html:76 +msgid "Assigned Users" +msgstr "Usuários atribuídos" + +#: templates/users/user.html:38 +msgid "Staff" +msgstr "Pessoal" + +#: templates/virtualization/cluster.html:56 +msgid "Allocated Resources" +msgstr "Recursos alocados" + +#: templates/virtualization/cluster.html:60 +#: templates/virtualization/virtualmachine.html:128 +msgid "Virtual CPUs" +msgstr "CPUs virtuais" + +#: templates/virtualization/cluster.html:64 +#: templates/virtualization/virtualmachine.html:132 +msgid "Memory" +msgstr "Memória" + +#: templates/virtualization/cluster.html:74 +#: templates/virtualization/virtualmachine.html:143 +msgid "Disk Space" +msgstr "Espaço em disco" + +#: templates/virtualization/cluster.html:77 +#: templates/virtualization/virtualdisk.html:33 +#: templates/virtualization/virtualmachine.html:147 +msgctxt "Abbreviation for gigabyte" +msgid "GB" +msgstr "GB" + +#: templates/virtualization/cluster/base.html:18 +msgid "Add Virtual Machine" +msgstr "Adicionar máquina virtual" + +#: templates/virtualization/cluster/base.html:24 +msgid "Assign Device" +msgstr "Atribuir dispositivo" + +#: templates/virtualization/cluster/devices.html:10 +msgid "Remove Selected" +msgstr "Remover selecionado" + +#: templates/virtualization/cluster_add_devices.html:9 +#, python-format +msgid "Add Device to Cluster %(cluster)s" +msgstr "Adicionar dispositivo ao cluster %(cluster)s" + +#: templates/virtualization/cluster_add_devices.html:23 +msgid "Device Selection" +msgstr "Seleção de dispositivos" + +#: templates/virtualization/cluster_add_devices.html:31 +msgid "Add Devices" +msgstr "Adicionar dispositivos" + +#: templates/virtualization/clustergroup.html:10 +#: templates/virtualization/clustertype.html:10 +msgid "Add Cluster" +msgstr "Adicionar cluster" + +#: templates/virtualization/clustergroup.html:20 +#: virtualization/forms/model_forms.py:51 +msgid "Cluster Group" +msgstr "Grupo de clusters" + +#: templates/virtualization/clustertype.html:20 +#: templates/virtualization/virtualmachine.html:111 +#: virtualization/forms/model_forms.py:35 +msgid "Cluster Type" +msgstr "Tipo de cluster" + +#: templates/virtualization/virtualdisk.html:18 +msgid "Virtual Disk" +msgstr "Disco virtual" + +#: templates/virtualization/virtualmachine.html:124 +#: virtualization/forms/bulk_edit.py:189 +#: virtualization/forms/model_forms.py:227 +msgid "Resources" +msgstr "Recursos" + +#: templates/virtualization/virtualmachine.html:185 +msgid "Add Virtual Disk" +msgstr "Adicionar disco virtual" + +#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:35 +#: vpn/tables/crypto.py:166 +msgid "IKE Policy" +msgstr "Política da IKE" + +#: templates/vpn/ikepolicy.html:22 +msgid "IKE Version" +msgstr "Versão IKE" + +#: templates/vpn/ikepolicy.html:30 +msgid "Pre-Shared Key" +msgstr "Chave pré-compartilhada" + +#: templates/vpn/ikepolicy.html:34 +#: templates/wireless/inc/authentication_attrs.html:21 +msgid "Show Secret" +msgstr "Mostrar segredo" + +#: templates/vpn/ikepolicy.html:59 templates/vpn/ipsecpolicy.html:47 +#: templates/vpn/ipsecprofile.html:55 templates/vpn/ipsecprofile.html:82 +#: vpn/forms/model_forms.py:310 vpn/forms/model_forms.py:345 +#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +msgid "Proposals" +msgstr "Propostas" + +#: templates/vpn/ikeproposal.html:10 +msgid "IKE Proposal" +msgstr "Proposta IKE" + +#: templates/vpn/ikeproposal.html:22 vpn/forms/bulk_edit.py:96 +#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:98 +msgid "Authentication method" +msgstr "Método de autenticação" + +#: templates/vpn/ikeproposal.html:26 templates/vpn/ipsecproposal.html:22 +#: vpn/forms/bulk_edit.py:101 vpn/forms/bulk_edit.py:173 +#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:193 +#: vpn/forms/filtersets.py:103 vpn/forms/filtersets.py:151 +msgid "Encryption algorithm" +msgstr "algoritmo de criptografia" + +#: templates/vpn/ikeproposal.html:30 templates/vpn/ipsecproposal.html:26 +#: vpn/forms/bulk_edit.py:106 vpn/forms/bulk_edit.py:178 +#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:197 +#: vpn/forms/filtersets.py:108 vpn/forms/filtersets.py:156 +msgid "Authentication algorithm" +msgstr "algoritmo de autenticação" + +#: templates/vpn/ikeproposal.html:34 +msgid "DH group" +msgstr "Grupo DH" + +#: templates/vpn/ikeproposal.html:38 templates/vpn/ipsecproposal.html:30 +#: vpn/forms/bulk_edit.py:183 vpn/models/crypto.py:134 +msgid "SA lifetime (seconds)" +msgstr "Vida útil da SA (segundos)" + +#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:70 +#: vpn/tables/crypto.py:170 +msgid "IPSec Policy" +msgstr "Política IPsec" + +#: templates/vpn/ipsecpolicy.html:22 vpn/forms/bulk_edit.py:211 +#: vpn/models/crypto.py:181 +msgid "PFS group" +msgstr "Grupo PFS" + +#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:53 +msgid "IPSec Profile" +msgstr "Perfil IPsec" + +#: templates/vpn/ipsecprofile.html:94 vpn/tables/crypto.py:137 +msgid "PFS Group" +msgstr "Grupo PFS" + +#: templates/vpn/ipsecproposal.html:10 +msgid "IPSec Proposal" +msgstr "Proposta IPsec" + +#: templates/vpn/ipsecproposal.html:34 vpn/forms/bulk_edit.py:187 +#: vpn/models/crypto.py:140 +msgid "SA lifetime (KB)" +msgstr "Vida útil da SA (KB)" + +#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:10 +msgid "L2VPN Attributes" +msgstr "Atributos L2VPN" + +#: templates/vpn/l2vpn.html:65 templates/vpn/tunnel.html:81 +msgid "Add a Termination" +msgstr "Adicionar uma rescisão" + +#: templates/vpn/l2vpntermination_edit.html:9 +msgid "L2VPN Termination" +msgstr "Terminação L2VPN" + +#: templates/vpn/tunnel.html:9 +msgid "Add Termination" +msgstr "Adicionar rescisão" + +#: templates/vpn/tunnel.html:38 vpn/forms/bulk_edit.py:48 +#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:56 +msgid "Encapsulation" +msgstr "Encapsulamento" + +#: templates/vpn/tunnel.html:42 vpn/forms/bulk_edit.py:54 +#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:63 +#: vpn/models/crypto.py:238 vpn/tables/tunnels.py:47 +msgid "IPSec profile" +msgstr "Perfil IPsec" + +#: templates/vpn/tunnel.html:46 vpn/forms/bulk_edit.py:68 +#: vpn/forms/filtersets.py:67 +msgid "Tunnel ID" +msgstr "ID do túnel" + +#: templates/vpn/tunnelgroup.html:14 +msgid "Add Tunnel" +msgstr "Adicionar túnel" + +#: templates/vpn/tunnelgroup.html:24 vpn/forms/model_forms.py:35 +#: vpn/forms/model_forms.py:48 +msgid "Tunnel Group" +msgstr "Grupo de túneis" + +#: templates/vpn/tunneltermination.html:10 +msgid "Tunnel Termination" +msgstr "Terminação do túnel" + +#: templates/vpn/tunneltermination.html:36 vpn/forms/bulk_import.py:107 +#: vpn/forms/model_forms.py:101 vpn/forms/model_forms.py:137 +#: vpn/forms/model_forms.py:248 vpn/tables/tunnels.py:97 +msgid "Outside IP" +msgstr "IP externo" + +#: templates/vpn/tunneltermination.html:53 +msgid "Peer Terminations" +msgstr "Rescisões de pares" + +#: templates/wireless/inc/authentication_attrs.html:13 +msgid "Cipher" +msgstr "Cifra" + +#: templates/wireless/inc/authentication_attrs.html:17 +msgid "PSK" +msgstr "PSK" + +#: templates/wireless/inc/wirelesslink_interface.html:35 +#: templates/wireless/inc/wirelesslink_interface.html:45 +msgctxt "Abbreviation for megahertz" +msgid "MHz" +msgstr "MHz" + +#: templates/wireless/wirelesslan.html:11 wireless/forms/model_forms.py:54 +msgid "Wireless LAN" +msgstr "LAN sem fio" + +#: templates/wireless/wirelesslan.html:59 +msgid "Attached Interfaces" +msgstr "Interfaces anexadas" + +#: templates/wireless/wirelesslangroup.html:17 +msgid "Add Wireless LAN" +msgstr "Adicionar LAN sem fio" + +#: templates/wireless/wirelesslangroup.html:26 +#: wireless/forms/model_forms.py:27 +msgid "Wireless LAN Group" +msgstr "Grupo de LAN sem fio" + +#: templates/wireless/wirelesslangroup.html:64 +msgid "Add Wireless LAN Group" +msgstr "Adicionar grupo de LAN sem fio" + +#: templates/wireless/wirelesslink.html:16 +msgid "Link Properties" +msgstr "Propriedades do link" + +#: tenancy/choices.py:19 +msgid "Tertiary" +msgstr "Terciário" + +#: tenancy/choices.py:20 +msgid "Inactive" +msgstr "Inativo" + +#: tenancy/filtersets.py:29 tenancy/filtersets.py:55 tenancy/filtersets.py:97 +msgid "Contact group (ID)" +msgstr "Grupo de contato (ID)" + +#: tenancy/filtersets.py:35 tenancy/filtersets.py:62 tenancy/filtersets.py:104 +msgid "Contact group (slug)" +msgstr "Grupo de contato (slug)" + +#: tenancy/filtersets.py:91 +msgid "Contact (ID)" +msgstr "Contato (ID)" + +#: tenancy/filtersets.py:108 +msgid "Contact role (ID)" +msgstr "Função de contato (ID)" + +#: tenancy/filtersets.py:114 +msgid "Contact role (slug)" +msgstr "Função de contato (lesma)" + +#: tenancy/filtersets.py:146 +msgid "Contact group" +msgstr "Grupo de contato" + +#: tenancy/filtersets.py:157 tenancy/filtersets.py:176 +msgid "Tenant group (ID)" +msgstr "Grupo de inquilinos (ID)" + +#: tenancy/filtersets.py:209 +msgid "Tenant Group (ID)" +msgstr "Grupo de inquilinos (ID)" + +#: tenancy/filtersets.py:216 +msgid "Tenant Group (slug)" +msgstr "Grupo de inquilinos (lesma)" + +#: tenancy/forms/bulk_edit.py:65 +msgid "Desciption" +msgstr "Descrição" + +#: tenancy/forms/bulk_import.py:101 +msgid "Assigned contact" +msgstr "Contato atribuído" + +#: tenancy/models/contacts.py:32 +msgid "contact group" +msgstr "grupo de contato" + +#: tenancy/models/contacts.py:33 +msgid "contact groups" +msgstr "grupos de contato" + +#: tenancy/models/contacts.py:48 +msgid "contact role" +msgstr "função de contato" + +#: tenancy/models/contacts.py:49 +msgid "contact roles" +msgstr "funções de contato" + +#: tenancy/models/contacts.py:68 +msgid "title" +msgstr "título" + +#: tenancy/models/contacts.py:73 +msgid "phone" +msgstr "telefone" + +#: tenancy/models/contacts.py:78 +msgid "email" +msgstr "e-mail" + +#: tenancy/models/contacts.py:87 +msgid "link" +msgstr "vincular" + +#: tenancy/models/contacts.py:103 +msgid "contact" +msgstr "contato" + +#: tenancy/models/contacts.py:104 +msgid "contacts" +msgstr "contatos" + +#: tenancy/models/contacts.py:153 +msgid "contact assignment" +msgstr "atribuição de contato" + +#: tenancy/models/contacts.py:154 +msgid "contact assignments" +msgstr "atribuições de contato" + +#: tenancy/models/contacts.py:170 +#, python-brace-format +msgid "Contacts cannot be assigned to this object type ({type})." +msgstr "Os contatos não podem ser atribuídos a esse tipo de objeto ({type})." + +#: tenancy/models/tenants.py:32 +msgid "tenant group" +msgstr "grupo de inquilinos" + +#: tenancy/models/tenants.py:33 +msgid "tenant groups" +msgstr "grupos de inquilinos" + +#: tenancy/models/tenants.py:70 +msgid "Tenant name must be unique per group." +msgstr "O nome do inquilino deve ser exclusivo por grupo." + +#: tenancy/models/tenants.py:80 +msgid "Tenant slug must be unique per group." +msgstr "A lesma do inquilino deve ser exclusiva por grupo." + +#: tenancy/models/tenants.py:88 +msgid "tenant" +msgstr "inquilina" + +#: tenancy/models/tenants.py:89 +msgid "tenants" +msgstr "inquilinos" + +#: tenancy/tables/contacts.py:112 +msgid "Contact Title" +msgstr "Título do contato" + +#: tenancy/tables/contacts.py:116 +msgid "Contact Phone" +msgstr "Telefone de contato" + +#: tenancy/tables/contacts.py:120 +msgid "Contact Email" +msgstr "E-mail de contato" + +#: tenancy/tables/contacts.py:124 +msgid "Contact Address" +msgstr "Endereço de contato" + +#: tenancy/tables/contacts.py:128 +msgid "Contact Link" +msgstr "Link de contato" + +#: tenancy/tables/contacts.py:132 +msgid "Contact Description" +msgstr "Descrição do contato" + +#: users/filtersets.py:48 users/filtersets.py:151 +msgid "Group (name)" +msgstr "Grupo (nome)" + +#: users/forms/bulk_edit.py:24 +msgid "First name" +msgstr "Primeiro nome" + +#: users/forms/bulk_edit.py:29 +msgid "Last name" +msgstr "Último nome" + +#: users/forms/bulk_edit.py:41 +msgid "Staff status" +msgstr "Status da equipe" + +#: users/forms/bulk_edit.py:46 +msgid "Superuser status" +msgstr "Status de superusuário" + +#: users/forms/bulk_import.py:43 +msgid "If no key is provided, one will be generated automatically." +msgstr "Se nenhuma chave for fornecida, uma será gerada automaticamente." + +#: users/forms/filtersets.py:52 users/tables.py:42 +msgid "Is Staff" +msgstr "É a equipe" + +#: users/forms/filtersets.py:59 users/tables.py:45 +msgid "Is Superuser" +msgstr "É superusuário" + +#: users/forms/filtersets.py:92 users/tables.py:89 +msgid "Can View" +msgstr "Pode ver" + +#: users/forms/filtersets.py:99 users/tables.py:92 +msgid "Can Add" +msgstr "Pode adicionar" + +#: users/forms/filtersets.py:106 users/tables.py:95 +msgid "Can Change" +msgstr "Pode mudar" + +#: users/forms/filtersets.py:113 users/tables.py:98 +msgid "Can Delete" +msgstr "Pode excluir" + +#: users/forms/model_forms.py:58 +msgid "User Interface" +msgstr "Interface de usuário" + +#: users/forms/model_forms.py:115 +msgid "" +"Keys must be at least 40 characters in length. Be sure to record " +"your key prior to submitting this form, as it may no longer be " +"accessible once the token has been created." +msgstr "" +"As chaves devem ter pelo menos 40 caracteres. Certifique-se de " +"gravar sua chave antes de enviar este formulário, pois ele pode não" +" estar mais acessível depois que o token for criado." + +#: users/forms/model_forms.py:127 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" +" no restrictions. Example: " +"10.1.1.0/24,192.168.10.16/32,2001:db8:1::/64" +msgstr "" +"Redes IPv4/IPv6 permitidas de onde o token pode ser usado. Deixe em branco " +"sem restrições. Exemplo: 10.1.1.0/24.192.168.10.16/32, 2001:db 8:1: " +":/64" + +#: users/forms/model_forms.py:176 +msgid "Confirm password" +msgstr "Confirme a senha" + +#: users/forms/model_forms.py:179 +msgid "Enter the same password as before, for verification." +msgstr "Digite a mesma senha de antes, para verificação." + +#: users/forms/model_forms.py:237 +msgid "Passwords do not match! Please check your input and try again." +msgstr "As senhas não coincidem! Verifique sua entrada e tente novamente." + +#: users/forms/model_forms.py:303 +msgid "Additional actions" +msgstr "Ações adicionais" + +#: users/forms/model_forms.py:306 +msgid "Actions granted in addition to those listed above" +msgstr "Ações concedidas além das listadas acima" + +#: users/forms/model_forms.py:322 +msgid "Objects" +msgstr "Objetos" + +#: users/forms/model_forms.py:334 +msgid "" +"JSON expression of a queryset filter that will return only permitted " +"objects. Leave null to match all objects of this type. A list of multiple " +"objects will result in a logical OR operation." +msgstr "" +"Expressão JSON de um filtro queryset que retornará somente objetos " +"permitidos. Deixe null para corresponder a todos os objetos desse tipo. Uma " +"lista de vários objetos resultará em uma operação OR lógica." + +#: users/forms/model_forms.py:372 +msgid "At least one action must be selected." +msgstr "Pelo menos uma ação deve ser selecionada." + +#: users/forms/model_forms.py:389 +#, python-brace-format +msgid "Invalid filter for {model}: {error}" +msgstr "Filtro inválido para {model}: {error}" + +#: users/models.py:54 +msgid "user" +msgstr "usuária" + +#: users/models.py:55 +msgid "users" +msgstr "usuários" + +#: users/models.py:66 +msgid "A user with this username already exists." +msgstr "Já existe um usuário com esse nome de usuário." + +#: users/models.py:78 vpn/models/crypto.py:42 +msgid "group" +msgstr "grupo" + +#: users/models.py:79 +msgid "groups" +msgstr "grupos" + +#: users/models.py:106 users/models.py:107 +msgid "user preferences" +msgstr "preferências do usuário" + +#: users/models.py:174 +#, python-brace-format +msgid "Key '{path}' is a leaf node; cannot assign new keys" +msgstr "Chave '{path}'é um nó de folha; não é possível atribuir novas chaves" + +#: users/models.py:186 +#, python-brace-format +msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" +msgstr "" +"Chave '{path}'é um dicionário; não pode atribuir um valor que não seja do " +"dicionário" + +#: users/models.py:252 +msgid "expires" +msgstr "expira" + +#: users/models.py:257 +msgid "last used" +msgstr "usado pela última vez" + +#: users/models.py:262 +msgid "key" +msgstr "chave" + +#: users/models.py:268 +msgid "write enabled" +msgstr "gravação habilitada" + +#: users/models.py:270 +msgid "Permit create/update/delete operations using this key" +msgstr "Permitir operações de criação/atualização/exclusão usando essa chave" + +#: users/models.py:281 +msgid "allowed IPs" +msgstr "IPs permitidos" + +#: users/models.py:283 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" +" no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" +msgstr "" +"Redes IPv4/IPv6 permitidas de onde o token pode ser usado. Deixe em branco " +"sem restrições. Ex: “10.1.1.0/24, 192.168.10.16/32, 2001:DB 8:1: :/64\"" + +#: users/models.py:291 +msgid "token" +msgstr "ficha" + +#: users/models.py:292 +msgid "tokens" +msgstr "tokens" + +#: users/models.py:373 +msgid "The list of actions granted by this permission" +msgstr "A lista de ações concedidas por essa permissão" + +#: users/models.py:378 +msgid "constraints" +msgstr "restrições" + +#: users/models.py:379 +msgid "" +"Queryset filter matching the applicable objects of the selected type(s)" +msgstr "" +"Filtro do conjunto de consultas que corresponde aos objetos aplicáveis do " +"(s) tipo (s) selecionado (s)" + +#: users/models.py:386 +msgid "permission" +msgstr "permissão" + +#: users/models.py:387 +msgid "permissions" +msgstr "permissões" + +#: users/tables.py:101 +msgid "Custom Actions" +msgstr "Ações personalizadas" + +#: utilities/choices.py:16 +#, python-brace-format +msgid "{name} has a key defined but CHOICES is not a list" +msgstr "{name} tem uma chave definida, mas CHOICES não é uma lista" + +#: utilities/choices.py:135 +msgid "Dark Red" +msgstr "Vermelho escuro" + +#: utilities/choices.py:138 +msgid "Rose" +msgstr "Rose" + +#: utilities/choices.py:139 +msgid "Fuchsia" +msgstr "Fúcsia" + +#: utilities/choices.py:141 +msgid "Dark Purple" +msgstr "Roxo escuro" + +#: utilities/choices.py:144 +msgid "Light Blue" +msgstr "Azul claro" + +#: utilities/choices.py:147 +msgid "Aqua" +msgstr "Aqua" + +#: utilities/choices.py:148 +msgid "Dark Green" +msgstr "Verde escuro" + +#: utilities/choices.py:150 +msgid "Light Green" +msgstr "Verde claro" + +#: utilities/choices.py:151 +msgid "Lime" +msgstr "Limão" + +#: utilities/choices.py:153 +msgid "Amber" +msgstr "Âmbar" + +#: utilities/choices.py:155 +msgid "Dark Orange" +msgstr "Laranja escuro" + +#: utilities/choices.py:156 +msgid "Brown" +msgstr "Castanho" + +#: utilities/choices.py:157 +msgid "Light Grey" +msgstr "Cinza claro" + +#: utilities/choices.py:158 +msgid "Grey" +msgstr "Cinza" + +#: utilities/choices.py:159 +msgid "Dark Grey" +msgstr "Cinza escuro" + +#: utilities/choices.py:217 +msgid "Direct" +msgstr "Direto" + +#: utilities/choices.py:218 +msgid "Upload" +msgstr "Carregar" + +#: utilities/choices.py:230 utilities/choices.py:244 +msgid "Auto-detect" +msgstr "Detecção automática" + +#: utilities/choices.py:245 +msgid "Comma" +msgstr "Vírgula" + +#: utilities/choices.py:246 +msgid "Semicolon" +msgstr "Ponto e vírgula" + +#: utilities/choices.py:247 +msgid "Tab" +msgstr "Aba" + +#: utilities/error_handlers.py:20 +#, python-brace-format +msgid "" +"Unable to delete {objects}. {count} dependent objects were " +"found: " +msgstr "" +"Não é possível excluir {objects}. {count} objetos " +"dependentes foram encontrados: " + +#: utilities/error_handlers.py:22 +msgid "More than 50" +msgstr "Mais de 50" + +#: utilities/fields.py:162 +#, python-format +msgid "" +"%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " +"in the format 'app.model'" +msgstr "" +"%s(%r) é inválido. O parâmetro to_model para CounterCacheField deve ser uma " +"string no formato 'app.model'" + +#: utilities/fields.py:172 +#, python-format +msgid "" +"%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " +"in the format 'field'" +msgstr "" +"%s(%r) é inválido. O parâmetro to_field para CounterCacheField deve ser uma " +"string no formato 'field'" + +#: utilities/forms/bulk_import.py:24 +msgid "Enter object data in CSV, JSON or YAML format." +msgstr "Insira os dados do objeto no formato CSV, JSON ou YAML." + +#: utilities/forms/bulk_import.py:37 +msgid "CSV delimiter" +msgstr "Delimitador CSV" + +#: utilities/forms/bulk_import.py:38 +msgid "The character which delimits CSV fields. Applies only to CSV format." +msgstr "" +"O caractere que delimita os campos CSV. Aplica-se somente ao formato CSV." + +#: utilities/forms/bulk_import.py:101 +msgid "Unable to detect data format. Please specify." +msgstr "" +"Não foi possível detectar o formato dos dados. Por favor, especifique." + +#: utilities/forms/bulk_import.py:124 +msgid "Invalid CSV delimiter" +msgstr "Delimitador CSV inválido" + +#: utilities/forms/bulk_import.py:168 +msgid "" +"Invalid YAML data. Data must be in the form of multiple documents, or a " +"single document comprising a list of dictionaries." +msgstr "" +"Dados YAML inválidos. Os dados devem estar na forma de vários documentos ou " +"de um único documento contendo uma lista de dicionários." + +#: utilities/forms/fields/array.py:17 +#, python-brace-format +msgid "" +"Invalid list ({value}). Must be numeric and ranges must be in ascending " +"order." +msgstr "" +"Lista inválida ({value}). Deve ser numérico e os intervalos devem estar em " +"ordem crescente." + +#: utilities/forms/fields/csv.py:44 +#, python-brace-format +msgid "Invalid value for a multiple choice field: {value}" +msgstr "Valor inválido para um campo de múltipla escolha: {value}" + +#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:74 +#, python-format +msgid "Object not found: %(value)s" +msgstr "Objeto não encontrado: %(value)s" + +#: utilities/forms/fields/csv.py:65 +#, python-brace-format +msgid "" +"\"{value}\" is not a unique value for this field; multiple objects were " +"found" +msgstr "" +"“{value}“não é um valor exclusivo para esse campo; vários objetos foram " +"encontrados" + +#: utilities/forms/fields/csv.py:97 +msgid "Object type must be specified as \".\"" +msgstr "O tipo de objeto deve ser especificado como”.“" + +#: utilities/forms/fields/csv.py:101 +msgid "Invalid object type" +msgstr "Tipo de objeto inválido" + +#: utilities/forms/fields/expandable.py:25 +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9])." +msgstr "" +"Os intervalos alfanuméricos são suportados para criação em massa. Casos e " +"tipos mistos dentro de um único intervalo não são suportados (exemplo: " +"[ge, xe] -0/0/ [0-9])." + +#: utilities/forms/fields/expandable.py:46 +msgid "" +"Specify a numeric range to create multiple IPs.
    Example: " +"192.0.2.[1,5,100-254]/24" +msgstr "" +"Especifique um intervalo numérico para criar vários IPs.
    Exemplo: " +"192,0.2. [1,5,100-254] /24" + +#: utilities/forms/fields/fields.py:31 +#, python-brace-format +msgid "" +" Markdown syntax is supported" +msgstr "" +" Markdown a sintaxe é suportada" + +#: utilities/forms/fields/fields.py:48 +msgid "URL-friendly unique shorthand" +msgstr "Abreviatura exclusiva e compatível com URL" + +#: utilities/forms/fields/fields.py:99 +msgid "Enter context data in JSON format." +msgstr "" +"Inserir dados de contexto em JSON formato." + +#: utilities/forms/fields/fields.py:117 +msgid "MAC address must be in EUI-48 format" +msgstr "O endereço MAC deve estar no formato EUI-48" + +#: utilities/forms/forms.py:53 +msgid "Use regular expressions" +msgstr "Use expressões regulares" + +#: utilities/forms/forms.py:87 +#, python-brace-format +msgid "Unrecognized header: {name}" +msgstr "Cabeçalho não reconhecido: {name}" + +#: utilities/forms/forms.py:113 +msgid "Available Columns" +msgstr "Colunas disponíveis" + +#: utilities/forms/forms.py:121 +msgid "Selected Columns" +msgstr "Colunas selecionadas" + +#: utilities/forms/mixins.py:101 +msgid "" +"This object has been modified since the form was rendered. Please consult " +"the object's change log for details." +msgstr "" +"Esse objeto foi modificado desde que o formulário foi renderizado. Consulte " +"o registro de alterações do objeto para obter detalhes." + +#: utilities/templates/builtins/customfield_value.html:30 +msgid "Not defined" +msgstr "Não definido" + +#: utilities/templates/buttons/bookmark.html:9 +msgid "Unbookmark" +msgstr "Desmarcar" + +#: utilities/templates/buttons/bookmark.html:13 +msgid "Bookmark" +msgstr "Marcador" + +#: utilities/templates/buttons/clone.html:4 +msgid "Clone" +msgstr "Clonar" + +#: utilities/templates/buttons/export.html:4 +msgid "Export" +msgstr "Exportar" + +#: utilities/templates/buttons/export.html:7 +msgid "Current View" +msgstr "Visualização atual" + +#: utilities/templates/buttons/export.html:8 +msgid "All Data" +msgstr "Todos os dados" + +#: utilities/templates/buttons/export.html:28 +msgid "Add export template" +msgstr "Adicionar modelo de exportação" + +#: utilities/templates/buttons/import.html:4 +msgid "Import" +msgstr "Importar" + +#: utilities/templates/form_helpers/render_field.html:36 +msgid "Copy to clipboard" +msgstr "Copiar para a prancheta" + +#: utilities/templates/form_helpers/render_field.html:52 +msgid "This field is required" +msgstr "Esse campo é obrigatório" + +#: utilities/templates/form_helpers/render_field.html:65 +msgid "Set Null" +msgstr "Definir como nulo" + +#: utilities/templates/helpers/applied_filters.html:11 +msgid "Clear all" +msgstr "Limpar tudo" + +#: utilities/templates/helpers/table_config_form.html:8 +msgid "Table Configuration" +msgstr "Configuração da tabela" + +#: utilities/templates/helpers/table_config_form.html:31 +msgid "Move Up" +msgstr "Mova-se para cima" + +#: utilities/templates/helpers/table_config_form.html:34 +msgid "Move Down" +msgstr "Mover para baixo" + +#: utilities/templates/widgets/apiselect.html:7 +msgid "Open selector" +msgstr "Abrir seletor" + +#: utilities/templates/widgets/clearable_file_input.html:12 +msgid "None assigned" +msgstr "Nenhum atribuído" + +#: utilities/templates/widgets/markdown_input.html:6 +msgid "Write" +msgstr "Escreva" + +#: utilities/templates/widgets/markdown_input.html:20 +msgid "Testing" +msgstr "Testando" + +#: virtualization/filtersets.py:79 +msgid "Parent group (ID)" +msgstr "Grupo de pais (ID)" + +#: virtualization/filtersets.py:85 +msgid "Parent group (slug)" +msgstr "Grupo de pais (lesma)" + +#: virtualization/filtersets.py:89 virtualization/filtersets.py:140 +msgid "Cluster type (ID)" +msgstr "Tipo de cluster (ID)" + +#: virtualization/filtersets.py:129 +msgid "Cluster group (ID)" +msgstr "Grupo de clusters (ID)" + +#: virtualization/filtersets.py:150 virtualization/filtersets.py:265 +msgid "Cluster (ID)" +msgstr "Cluster (ID)" + +#: virtualization/forms/bulk_edit.py:165 +#: virtualization/models/virtualmachines.py:113 +msgid "vCPUs" +msgstr "vCPUs" + +#: virtualization/forms/bulk_edit.py:169 +msgid "Memory (MB)" +msgstr "Memória (MB)" + +#: virtualization/forms/bulk_edit.py:173 +msgid "Disk (GB)" +msgstr "Disco (GB)" + +#: virtualization/forms/bulk_edit.py:333 +#: virtualization/forms/filtersets.py:243 +msgid "Size (GB)" +msgstr "Tamanho (GB)" + +#: virtualization/forms/bulk_import.py:44 +msgid "Type of cluster" +msgstr "Tipo de cluster" + +#: virtualization/forms/bulk_import.py:51 +msgid "Assigned cluster group" +msgstr "Grupo de clusters atribuído" + +#: virtualization/forms/bulk_import.py:96 +msgid "Assigned cluster" +msgstr "Cluster atribuído" + +#: virtualization/forms/bulk_import.py:103 +msgid "Assigned device within cluster" +msgstr "Dispositivo atribuído dentro do cluster" + +#: virtualization/forms/model_forms.py:156 +#, python-brace-format +msgid "" +"{device} belongs to a different site ({device_site}) than the cluster " +"({cluster_site})" +msgstr "" +"{device} pertence a um site diferente ({device_site}) do que o cluster " +"({cluster_site})" + +#: virtualization/forms/model_forms.py:195 +msgid "Optionally pin this VM to a specific host device within the cluster" +msgstr "" +"Opcionalmente, fixe essa VM em um dispositivo host específico dentro do " +"cluster" + +#: virtualization/forms/model_forms.py:224 +msgid "Site/Cluster" +msgstr "Site/Cluster" + +#: virtualization/forms/model_forms.py:247 +msgid "Disk size is managed via the attachment of virtual disks." +msgstr "" +"O tamanho do disco é gerenciado por meio da conexão de discos virtuais." + +#: virtualization/forms/model_forms.py:375 +msgid "Disk" +msgstr "Disco" + +#: virtualization/models/clusters.py:25 +msgid "cluster type" +msgstr "tipo de cluster" + +#: virtualization/models/clusters.py:26 +msgid "cluster types" +msgstr "tipos de cluster" + +#: virtualization/models/clusters.py:45 +msgid "cluster group" +msgstr "grupo de clusters" + +#: virtualization/models/clusters.py:46 +msgid "cluster groups" +msgstr "grupos de clusters" + +#: virtualization/models/clusters.py:121 +msgid "cluster" +msgstr "grupo" + +#: virtualization/models/clusters.py:122 +msgid "clusters" +msgstr "aglomerados" + +#: virtualization/models/clusters.py:141 +#, python-brace-format +msgid "" +"{count} devices are assigned as hosts for this cluster but are not in site " +"{site}" +msgstr "" +"{count} os dispositivos são atribuídos como hosts para esse cluster, mas não" +" estão no site {site}" + +#: virtualization/models/virtualmachines.py:121 +msgid "memory (MB)" +msgstr "memória (MB)" + +#: virtualization/models/virtualmachines.py:126 +msgid "disk (GB)" +msgstr "disco (GB)" + +#: virtualization/models/virtualmachines.py:159 +msgid "Virtual machine name must be unique per cluster." +msgstr "O nome da máquina virtual deve ser exclusivo por cluster." + +#: virtualization/models/virtualmachines.py:162 +msgid "virtual machine" +msgstr "máquina virtual" + +#: virtualization/models/virtualmachines.py:163 +msgid "virtual machines" +msgstr "máquinas virtuais" + +#: virtualization/models/virtualmachines.py:177 +msgid "A virtual machine must be assigned to a site and/or cluster." +msgstr "Uma máquina virtual deve ser atribuída a um site e/ou cluster." + +#: virtualization/models/virtualmachines.py:184 +#, python-brace-format +msgid "" +"The selected cluster ({cluster}) is not assigned to this site ({site})." +msgstr "" +"O cluster selecionado ({cluster}) não está atribuído a este site ({site})." + +#: virtualization/models/virtualmachines.py:191 +msgid "Must specify a cluster when assigning a host device." +msgstr "É necessário especificar um cluster ao atribuir um dispositivo host." + +#: virtualization/models/virtualmachines.py:196 +#, python-brace-format +msgid "" +"The selected device ({device}) is not assigned to this cluster ({cluster})." +msgstr "" +"O dispositivo selecionado ({device}) não está atribuído a esse cluster " +"({cluster})." + +#: virtualization/models/virtualmachines.py:208 +#, python-brace-format +msgid "" +"The specified disk size ({size}) must match the aggregate size of assigned " +"virtual disks ({total_size})." +msgstr "" +"O tamanho do disco especificado ({size}) deve corresponder ao tamanho " +"agregado dos discos virtuais atribuídos ({total_size})." + +#: virtualization/models/virtualmachines.py:222 +#, python-brace-format +msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" +msgstr "Deve ser um IPv{family} endereço. ({ip} é um IPv{version} endereço.)" + +#: virtualization/models/virtualmachines.py:231 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this VM." +msgstr "O endereço IP especificado ({ip}) não está atribuído a essa VM." + +#: virtualization/models/virtualmachines.py:389 +#, python-brace-format +msgid "" +"The selected parent interface ({parent}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "" +"A interface principal selecionada ({parent}) pertence a uma máquina virtual " +"diferente ({virtual_machine})." + +#: virtualization/models/virtualmachines.py:404 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "" +"A interface de ponte selecionada ({bridge}) pertence a uma máquina virtual " +"diferente ({virtual_machine})." + +#: virtualization/models/virtualmachines.py:415 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent virtual machine, or it must be global." +msgstr "" +"A VLAN não marcada ({untagged_vlan}) deve pertencer ao mesmo site da máquina" +" virtual principal da interface ou deve ser global." + +#: virtualization/models/virtualmachines.py:427 +msgid "size (GB)" +msgstr "tamanho (GB)" + +#: virtualization/models/virtualmachines.py:431 +msgid "virtual disk" +msgstr "disco virtual" + +#: virtualization/models/virtualmachines.py:432 +msgid "virtual disks" +msgstr "discos virtuais" + +#: vpn/choices.py:31 +msgid "IPsec - Transport" +msgstr "IPsec - Transporte" + +#: vpn/choices.py:32 +msgid "IPsec - Tunnel" +msgstr "IPsec - Túnel" + +#: vpn/choices.py:33 +msgid "IP-in-IP" +msgstr "IP-in-IP" + +#: vpn/choices.py:34 +msgid "GRE" +msgstr "CINZENTO" + +#: vpn/choices.py:56 +msgid "Hub" +msgstr "Hub" + +#: vpn/choices.py:57 +msgid "Spoke" +msgstr "Falou" + +#: vpn/choices.py:80 +msgid "Aggressive" +msgstr "Agressivo" + +#: vpn/choices.py:81 +msgid "Main" +msgstr "Principal" + +#: vpn/choices.py:92 +msgid "Pre-shared keys" +msgstr "Chaves pré-compartilhadas" + +#: vpn/choices.py:93 +msgid "Certificates" +msgstr "Certificados" + +#: vpn/choices.py:94 +msgid "RSA signatures" +msgstr "Assinaturas RSA" + +#: vpn/choices.py:95 +msgid "DSA signatures" +msgstr "Assinaturas do DSA" + +#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 +#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 +#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 +#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 +#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 +#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 +#, python-brace-format +msgid "Group {n}" +msgstr "Grupo {n}" + +#: vpn/choices.py:240 +msgid "Ethernet Private LAN" +msgstr "LAN privada Ethernet" + +#: vpn/choices.py:241 +msgid "Ethernet Virtual Private LAN" +msgstr "LAN privada virtual Ethernet" + +#: vpn/choices.py:244 +msgid "Ethernet Private Tree" +msgstr "Árvore privada Ethernet" + +#: vpn/choices.py:245 +msgid "Ethernet Virtual Private Tree" +msgstr "Árvore privada virtual Ethernet" + +#: vpn/filtersets.py:41 +msgid "Tunnel group (ID)" +msgstr "Grupo de túneis (ID)" + +#: vpn/filtersets.py:47 +msgid "Tunnel group (slug)" +msgstr "Grupo de túneis (lesma)" + +#: vpn/filtersets.py:54 +msgid "IPSec profile (ID)" +msgstr "Perfil IPsec (ID)" + +#: vpn/filtersets.py:60 +msgid "IPSec profile (name)" +msgstr "Perfil IPsec (nome)" + +#: vpn/filtersets.py:81 +msgid "Tunnel (ID)" +msgstr "Túnel (ID)" + +#: vpn/filtersets.py:87 +msgid "Tunnel (name)" +msgstr "Túnel (nome)" + +#: vpn/filtersets.py:118 +msgid "Outside IP (ID)" +msgstr "IP externo (ID)" + +#: vpn/filtersets.py:235 +msgid "IKE policy (ID)" +msgstr "Política IKE (ID)" + +#: vpn/filtersets.py:241 +msgid "IKE policy (name)" +msgstr "Política IKE (nome)" + +#: vpn/filtersets.py:245 +msgid "IPSec policy (ID)" +msgstr "Política IPsec (ID)" + +#: vpn/filtersets.py:251 +msgid "IPSec policy (name)" +msgstr "Política IPsec (nome)" + +#: vpn/filtersets.py:320 +msgid "L2VPN (slug)" +msgstr "L2VPN (slug)" + +#: vpn/filtersets.py:384 +msgid "VM Interface (ID)" +msgstr "Interface de VM (ID)" + +#: vpn/filtersets.py:390 +msgid "VLAN (name)" +msgstr "VLAN (nome)" + +#: vpn/forms/bulk_edit.py:44 vpn/forms/bulk_import.py:42 +#: vpn/forms/filtersets.py:53 +msgid "Tunnel group" +msgstr "Grupo de túneis" + +#: vpn/forms/bulk_edit.py:116 vpn/models/crypto.py:47 +msgid "SA lifetime" +msgstr "Uma vida útil" + +#: vpn/forms/bulk_edit.py:150 wireless/forms/bulk_edit.py:78 +#: wireless/forms/bulk_edit.py:125 wireless/forms/filtersets.py:63 +#: wireless/forms/filtersets.py:97 +msgid "Pre-shared key" +msgstr "Chave pré-compartilhada" + +#: vpn/forms/bulk_edit.py:238 vpn/forms/bulk_import.py:234 +#: vpn/forms/filtersets.py:196 vpn/forms/model_forms.py:363 +#: vpn/models/crypto.py:103 +msgid "IKE policy" +msgstr "Política do IKE" + +#: vpn/forms/bulk_edit.py:243 vpn/forms/bulk_import.py:239 +#: vpn/forms/filtersets.py:201 vpn/forms/model_forms.py:367 +#: vpn/models/crypto.py:197 +msgid "IPSec policy" +msgstr "Política IPsec" + +#: vpn/forms/bulk_import.py:50 +msgid "Tunnel encapsulation" +msgstr "Encapsulamento de túneis" + +#: vpn/forms/bulk_import.py:83 +msgid "Operational role" +msgstr "Função operacional" + +#: vpn/forms/bulk_import.py:90 +msgid "Parent device of assigned interface" +msgstr "Dispositivo principal da interface atribuída" + +#: vpn/forms/bulk_import.py:97 +msgid "Parent VM of assigned interface" +msgstr "VM principal da interface atribuída" + +#: vpn/forms/bulk_import.py:104 +msgid "Device or virtual machine interface" +msgstr "Interface de dispositivo ou máquina virtual" + +#: vpn/forms/bulk_import.py:181 +msgid "IKE proposal(s)" +msgstr "Proposta (s) do IKE" + +#: vpn/forms/bulk_import.py:211 vpn/models/crypto.py:185 +msgid "Diffie-Hellman group for Perfect Forward Secrecy" +msgstr "Grupo Diffie-Hellman para Perfect Forward Secrecy" + +#: vpn/forms/bulk_import.py:217 +msgid "IPSec proposal(s)" +msgstr "Proposta (s) de IPsec" + +#: vpn/forms/bulk_import.py:231 +msgid "IPSec protocol" +msgstr "Protocolo IPsec" + +#: vpn/forms/bulk_import.py:261 +msgid "L2VPN type" +msgstr "Tipo L2VPN" + +#: vpn/forms/bulk_import.py:282 +msgid "Parent device (for interface)" +msgstr "Dispositivo principal (para interface)" + +#: vpn/forms/bulk_import.py:289 +msgid "Parent virtual machine (for interface)" +msgstr "Máquina virtual principal (para interface)" + +#: vpn/forms/bulk_import.py:296 +msgid "Assigned interface (device or VM)" +msgstr "Interface atribuída (dispositivo ou VM)" + +#: vpn/forms/bulk_import.py:329 +msgid "Cannot import device and VM interface terminations simultaneously." +msgstr "" +"Não é possível importar terminações do dispositivo e da interface da VM " +"simultaneamente." + +#: vpn/forms/bulk_import.py:331 +msgid "Each termination must specify either an interface or a VLAN." +msgstr "Cada terminação deve especificar uma interface ou uma VLAN." + +#: vpn/forms/bulk_import.py:333 +msgid "Cannot assign both an interface and a VLAN." +msgstr "Não é possível atribuir uma interface e uma VLAN." + +#: vpn/forms/filtersets.py:127 +msgid "IKE version" +msgstr "Versão IKE" + +#: vpn/forms/filtersets.py:139 vpn/forms/filtersets.py:172 +#: vpn/forms/model_forms.py:293 vpn/forms/model_forms.py:328 +msgid "Proposal" +msgstr "Proposta" + +#: vpn/forms/filtersets.py:247 +msgid "Assigned Object Type" +msgstr "Tipo de objeto atribuído" + +#: vpn/forms/model_forms.py:147 +msgid "First Termination" +msgstr "Primeira rescisão" + +#: vpn/forms/model_forms.py:151 +msgid "Second Termination" +msgstr "Segunda rescisão" + +#: vpn/forms/model_forms.py:198 +msgid "This parameter is required when defining a termination." +msgstr "Esse parâmetro é necessário ao definir uma terminação." + +#: vpn/forms/model_forms.py:314 vpn/forms/model_forms.py:349 +msgid "Policy" +msgstr "Política" + +#: vpn/forms/model_forms.py:469 +msgid "A termination must specify an interface or VLAN." +msgstr "Uma terminação deve especificar uma interface ou VLAN." + +#: vpn/forms/model_forms.py:471 +msgid "" +"A termination can only have one terminating object (an interface or VLAN)." +msgstr "" +"Uma terminação só pode ter um objeto de terminação (uma interface ou VLAN)." + +#: vpn/models/crypto.py:33 +msgid "encryption algorithm" +msgstr "algoritmo de criptografia" + +#: vpn/models/crypto.py:37 +msgid "authentication algorithm" +msgstr "algoritmo de autenticação" + +#: vpn/models/crypto.py:44 +msgid "Diffie-Hellman group ID" +msgstr "ID do grupo Diffie-Hellman" + +#: vpn/models/crypto.py:50 +msgid "Security association lifetime (in seconds)" +msgstr "Vida útil da associação de segurança (em segundos)" + +#: vpn/models/crypto.py:59 +msgid "IKE proposal" +msgstr "Proposta IKE" + +#: vpn/models/crypto.py:60 +msgid "IKE proposals" +msgstr "Propostas do IKE" + +#: vpn/models/crypto.py:76 +msgid "version" +msgstr "versão" + +#: vpn/models/crypto.py:87 vpn/models/crypto.py:178 +msgid "proposals" +msgstr "propostas" + +#: vpn/models/crypto.py:90 wireless/models.py:38 +msgid "pre-shared key" +msgstr "chave pré-compartilhada" + +#: vpn/models/crypto.py:104 +msgid "IKE policies" +msgstr "Políticas do IKE" + +#: vpn/models/crypto.py:124 +msgid "encryption" +msgstr "criptografia" + +#: vpn/models/crypto.py:129 +msgid "authentication" +msgstr "autenticação" + +#: vpn/models/crypto.py:137 +msgid "Security association lifetime (seconds)" +msgstr "Vida útil da associação de segurança (segundos)" + +#: vpn/models/crypto.py:143 +msgid "Security association lifetime (in kilobytes)" +msgstr "Vida útil da associação de segurança (em kilobytes)" + +#: vpn/models/crypto.py:152 +msgid "IPSec proposal" +msgstr "Proposta IPsec" + +#: vpn/models/crypto.py:153 +msgid "IPSec proposals" +msgstr "Propostas de IPsec" + +#: vpn/models/crypto.py:166 +msgid "Encryption and/or authentication algorithm must be defined" +msgstr "O algoritmo de criptografia e/ou autenticação deve ser definido" + +#: vpn/models/crypto.py:198 +msgid "IPSec policies" +msgstr "Políticas IPsec" + +#: vpn/models/crypto.py:239 +msgid "IPSec profiles" +msgstr "Perfis IPsec" + +#: vpn/models/l2vpn.py:116 +msgid "L2VPN termination" +msgstr "Terminação L2VPN" + +#: vpn/models/l2vpn.py:117 +msgid "L2VPN terminations" +msgstr "Terminações L2VPN" + +#: vpn/models/l2vpn.py:135 +#, python-brace-format +msgid "L2VPN Termination already assigned ({assigned_object})" +msgstr "Terminação L2VPN já atribuída ({assigned_object})" + +#: vpn/models/l2vpn.py:147 +#, python-brace-format +msgid "" +"{l2vpn_type} L2VPNs cannot have more than two terminations; found " +"{terminations_count} already defined." +msgstr "" +"{l2vpn_type} L2VPNs não podem ter mais de duas terminações; encontrado " +"{terminations_count} já definido." + +#: vpn/models/tunnels.py:26 +msgid "tunnel group" +msgstr "grupo de túneis" + +#: vpn/models/tunnels.py:27 +msgid "tunnel groups" +msgstr "grupos de túneis" + +#: vpn/models/tunnels.py:53 +msgid "encapsulation" +msgstr "encapsulamento" + +#: vpn/models/tunnels.py:72 +msgid "tunnel ID" +msgstr "ID do túnel" + +#: vpn/models/tunnels.py:94 +msgid "tunnel" +msgstr "túnel" + +#: vpn/models/tunnels.py:95 +msgid "tunnels" +msgstr "túneis" + +#: vpn/models/tunnels.py:153 +msgid "An object may be terminated to only one tunnel at a time." +msgstr "Um objeto pode ser encerrado em apenas um túnel por vez." + +#: vpn/models/tunnels.py:156 +msgid "tunnel termination" +msgstr "terminação do túnel" + +#: vpn/models/tunnels.py:157 +msgid "tunnel terminations" +msgstr "terminações de túneis" + +#: vpn/models/tunnels.py:174 +#, python-brace-format +msgid "{name} is already attached to a tunnel ({tunnel})." +msgstr "{name} já está conectado a um túnel ({tunnel})." + +#: vpn/tables/crypto.py:22 +msgid "Authentication Method" +msgstr "Método de autenticação" + +#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +msgid "Encryption Algorithm" +msgstr "algoritmo de criptografia" + +#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +msgid "Authentication Algorithm" +msgstr "algoritmo de autenticação" + +#: vpn/tables/crypto.py:34 +msgid "SA Lifetime" +msgstr "Vida útil de SA" + +#: vpn/tables/crypto.py:71 +msgid "Pre-shared Key" +msgstr "Chave pré-compartilhada" + +#: vpn/tables/crypto.py:103 +msgid "SA Lifetime (Seconds)" +msgstr "Vida útil do SA (segundos)" + +#: vpn/tables/crypto.py:106 +msgid "SA Lifetime (KB)" +msgstr "Vida útil da SA (KB)" + +#: vpn/tables/l2vpn.py:69 +msgid "Object Parent" +msgstr "Pai do objeto" + +#: vpn/tables/l2vpn.py:74 +msgid "Object Site" +msgstr "Site do objeto" + +#: vpn/tables/tunnels.py:84 +msgid "Host" +msgstr "Hospedeiro" + +#: wireless/choices.py:11 +msgid "Access point" +msgstr "Ponto de acesso" + +#: wireless/choices.py:12 +msgid "Station" +msgstr "Estação" + +#: wireless/choices.py:467 +msgid "Open" +msgstr "Aberto" + +#: wireless/choices.py:469 +msgid "WPA Personal (PSK)" +msgstr "WPA pessoal (PSK)" + +#: wireless/choices.py:470 +msgid "WPA Enterprise" +msgstr "WPA Empresarial" + +#: wireless/forms/bulk_edit.py:72 wireless/forms/bulk_edit.py:119 +#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 +#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 +#: wireless/forms/filtersets.py:58 wireless/forms/filtersets.py:92 +msgid "Authentication cipher" +msgstr "Cifra de autenticação" + +#: wireless/forms/bulk_import.py:52 +msgid "Bridged VLAN" +msgstr "VLAN interligada" + +#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:27 +msgid "Interface A" +msgstr "Interface A" + +#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:36 +msgid "Interface B" +msgstr "Interface B" + +#: wireless/forms/model_forms.py:158 +msgid "Side B" +msgstr "Lado B" + +#: wireless/models.py:30 +msgid "authentication cipher" +msgstr "cifra de autenticação" + +#: wireless/models.py:68 +msgid "wireless LAN group" +msgstr "grupo de LAN sem fio" + +#: wireless/models.py:69 +msgid "wireless LAN groups" +msgstr "grupos de LAN sem fio" + +#: wireless/models.py:115 +msgid "wireless LAN" +msgstr "LAN sem fio" + +#: wireless/models.py:143 +msgid "interface A" +msgstr "interface A" + +#: wireless/models.py:150 +msgid "interface B" +msgstr "interface B" + +#: wireless/models.py:198 +msgid "wireless link" +msgstr "link sem fio" + +#: wireless/models.py:199 +msgid "wireless links" +msgstr "links sem fio" + +#: wireless/models.py:216 wireless/models.py:222 +#, python-brace-format +msgid "{type} is not a wireless interface." +msgstr "{type} não é uma interface sem fio." diff --git a/netbox/translations/ru/LC_MESSAGES/django.mo b/netbox/translations/ru/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..4b4aced04cbc4175433e57e54f7f53a11283d19a GIT binary patch literal 253842 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 literal 0 HcmV?d00001 diff --git a/netbox/translations/ru/LC_MESSAGES/django.po b/netbox/translations/ru/LC_MESSAGES/django.po new file mode 100644 index 000000000..7e2932449 --- /dev/null +++ b/netbox/translations/ru/LC_MESSAGES/django.po @@ -0,0 +1,13582 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Jeremy Stretch, 2023 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-12-21 17:54+0000\n" +"PO-Revision-Date: 2023-10-30 17:48+0000\n" +"Last-Translator: Jeremy Stretch, 2023\n" +"Language-Team: Russian (https://app.transifex.com/netbox-community/teams/178115/ru/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ru\n" +"Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" + +#: account/tables.py:27 templates/account/token.html:23 +#: templates/users/token.html:18 users/forms/bulk_import.py:41 +#: users/forms/model_forms.py:113 +msgid "Key" +msgstr "Ключ" + +#: account/tables.py:31 users/forms/filtersets.py:133 +msgid "Write Enabled" +msgstr "Запись включена" + +#: account/tables.py:34 core/tables/jobs.py:29 extras/choices.py:135 +#: extras/tables/tables.py:469 templates/account/token.html:44 +#: templates/core/configrevision.html:34 +#: templates/core/configrevision_restore.html:12 templates/core/job.html:58 +#: templates/extras/htmx/report_result.html:11 +#: templates/extras/htmx/script_result.html:12 +#: templates/extras/journalentry.html:25 templates/generic/object.html:48 +#: templates/users/token.html:36 +msgid "Created" +msgstr "Создан" + +#: account/tables.py:37 templates/account/token.html:48 +#: templates/users/token.html:40 users/forms/bulk_edit.py:97 +#: users/forms/filtersets.py:137 +msgid "Expires" +msgstr "Истекает" + +#: account/tables.py:40 users/forms/filtersets.py:142 +msgid "Last Used" +msgstr "Последний раз использованный" + +#: account/tables.py:43 templates/account/token.html:56 +#: templates/users/token.html:48 users/forms/bulk_edit.py:102 +#: users/forms/model_forms.py:125 +msgid "Allowed IPs" +msgstr "Разрешенные IP-адреса" + +#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 +#: dcim/choices.py:174 dcim/choices.py:220 dcim/choices.py:1419 +#: dcim/choices.py:1495 dcim/choices.py:1545 virtualization/choices.py:20 +#: virtualization/choices.py:45 vpn/choices.py:18 +msgid "Planned" +msgstr "Запланировано" + +#: circuits/choices.py:22 netbox/navigation/menu.py:290 +msgid "Provisioning" +msgstr "Выделение ресурсов" + +#: circuits/choices.py:23 dcim/choices.py:22 dcim/choices.py:103 +#: dcim/choices.py:173 dcim/choices.py:219 dcim/choices.py:1494 +#: dcim/choices.py:1544 extras/tables/tables.py:375 ipam/choices.py:31 +#: ipam/choices.py:49 ipam/choices.py:69 ipam/choices.py:154 +#: templates/extras/configcontext.html:26 templates/users/user.html:34 +#: users/forms/bulk_edit.py:36 virtualization/choices.py:22 +#: virtualization/choices.py:44 vpn/choices.py:19 wireless/choices.py:25 +msgid "Active" +msgstr "Активный" + +#: circuits/choices.py:24 dcim/choices.py:172 dcim/choices.py:218 +#: dcim/choices.py:1493 dcim/choices.py:1546 virtualization/choices.py:24 +#: virtualization/choices.py:43 +msgid "Offline" +msgstr "Не в сети" + +#: circuits/choices.py:25 +msgid "Deprovisioning" +msgstr "Выделение резервов" + +#: circuits/choices.py:26 +msgid "Decommissioned" +msgstr "Списан" + +#: circuits/filtersets.py:29 circuits/filtersets.py:182 dcim/filtersets.py:120 +#: dcim/filtersets.py:181 dcim/filtersets.py:256 dcim/filtersets.py:364 +#: dcim/filtersets.py:881 dcim/filtersets.py:1177 dcim/filtersets.py:1672 +#: dcim/filtersets.py:1845 dcim/filtersets.py:1902 ipam/filtersets.py:305 +#: ipam/filtersets.py:896 virtualization/filtersets.py:45 +#: virtualization/filtersets.py:172 vpn/filtersets.py:330 +msgid "Region (ID)" +msgstr "Регион (ID)" + +#: circuits/filtersets.py:36 circuits/filtersets.py:189 dcim/filtersets.py:126 +#: dcim/filtersets.py:188 dcim/filtersets.py:263 dcim/filtersets.py:371 +#: dcim/filtersets.py:888 dcim/filtersets.py:1184 dcim/filtersets.py:1679 +#: dcim/filtersets.py:1852 dcim/filtersets.py:1909 extras/filtersets.py:414 +#: ipam/filtersets.py:312 ipam/filtersets.py:903 +#: virtualization/filtersets.py:52 virtualization/filtersets.py:179 +#: vpn/filtersets.py:325 +msgid "Region (slug)" +msgstr "Регион (пуля)" + +#: circuits/filtersets.py:42 circuits/filtersets.py:195 dcim/filtersets.py:194 +#: dcim/filtersets.py:269 dcim/filtersets.py:377 dcim/filtersets.py:894 +#: dcim/filtersets.py:1190 dcim/filtersets.py:1685 dcim/filtersets.py:1858 +#: dcim/filtersets.py:1915 ipam/filtersets.py:318 ipam/filtersets.py:909 +#: virtualization/filtersets.py:58 virtualization/filtersets.py:185 +msgid "Site group (ID)" +msgstr "Группа сайтов (ID)" + +#: circuits/filtersets.py:49 circuits/filtersets.py:202 dcim/filtersets.py:201 +#: dcim/filtersets.py:276 dcim/filtersets.py:384 dcim/filtersets.py:901 +#: dcim/filtersets.py:1197 dcim/filtersets.py:1692 dcim/filtersets.py:1865 +#: dcim/filtersets.py:1922 extras/filtersets.py:420 ipam/filtersets.py:325 +#: ipam/filtersets.py:916 virtualization/filtersets.py:65 +#: virtualization/filtersets.py:192 +msgid "Site group (slug)" +msgstr "Группа сайтов (слизень)" + +#: circuits/filtersets.py:54 circuits/forms/bulk_import.py:117 +#: circuits/forms/filtersets.py:47 circuits/forms/filtersets.py:171 +#: circuits/forms/model_forms.py:137 dcim/forms/bulk_edit.py:166 +#: dcim/forms/bulk_edit.py:238 dcim/forms/bulk_edit.py:570 +#: dcim/forms/bulk_edit.py:763 dcim/forms/bulk_import.py:130 +#: dcim/forms/bulk_import.py:176 dcim/forms/bulk_import.py:249 +#: dcim/forms/bulk_import.py:477 dcim/forms/bulk_import.py:1239 +#: dcim/forms/bulk_import.py:1267 dcim/forms/filtersets.py:84 +#: dcim/forms/filtersets.py:217 dcim/forms/filtersets.py:264 +#: dcim/forms/filtersets.py:373 dcim/forms/filtersets.py:680 +#: dcim/forms/filtersets.py:910 dcim/forms/filtersets.py:934 +#: dcim/forms/filtersets.py:1024 dcim/forms/filtersets.py:1062 +#: dcim/forms/filtersets.py:1468 dcim/forms/filtersets.py:1492 +#: dcim/forms/filtersets.py:1516 dcim/forms/model_forms.py:138 +#: dcim/forms/model_forms.py:167 dcim/forms/model_forms.py:211 +#: dcim/forms/model_forms.py:397 dcim/forms/model_forms.py:630 +#: dcim/forms/object_create.py:390 dcim/tables/devices.py:186 +#: dcim/tables/power.py:26 dcim/tables/power.py:93 dcim/tables/racks.py:62 +#: dcim/tables/racks.py:138 dcim/tables/sites.py:129 extras/filtersets.py:430 +#: ipam/forms/bulk_edit.py:215 ipam/forms/bulk_edit.py:269 +#: ipam/forms/bulk_edit.py:447 ipam/forms/bulk_edit.py:519 +#: ipam/forms/bulk_import.py:170 ipam/forms/bulk_import.py:437 +#: ipam/forms/filtersets.py:152 ipam/forms/filtersets.py:226 +#: ipam/forms/filtersets.py:417 ipam/forms/filtersets.py:470 +#: ipam/forms/model_forms.py:206 ipam/forms/model_forms.py:548 +#: ipam/forms/model_forms.py:640 ipam/tables/ip.py:244 +#: ipam/tables/vlans.py:114 ipam/tables/vlans.py:216 +#: templates/circuits/circuittermination_edit.html:20 +#: templates/circuits/inc/circuit_termination.html:33 +#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 +#: templates/dcim/inc/cable_termination.html:33 +#: templates/dcim/location.html:40 templates/dcim/powerpanel.html:23 +#: templates/dcim/rack.html:25 templates/dcim/rackreservation.html:31 +#: templates/dcim/site.html:27 templates/ipam/prefix.html:57 +#: templates/ipam/vlan.html:26 templates/ipam/vlan_edit.html:40 +#: templates/virtualization/cluster.html:45 +#: templates/virtualization/virtualmachine.html:96 +#: virtualization/forms/bulk_edit.py:90 virtualization/forms/bulk_edit.py:99 +#: virtualization/forms/bulk_edit.py:108 virtualization/forms/bulk_edit.py:123 +#: virtualization/forms/bulk_import.py:59 +#: virtualization/forms/bulk_import.py:85 +#: virtualization/forms/filtersets.py:78 +#: virtualization/forms/filtersets.py:144 +#: virtualization/forms/model_forms.py:74 +#: virtualization/forms/model_forms.py:107 +#: virtualization/forms/model_forms.py:174 +#: virtualization/tables/clusters.py:77 +#: virtualization/tables/virtualmachines.py:53 vpn/forms/filtersets.py:262 +#: wireless/forms/model_forms.py:77 wireless/forms/model_forms.py:117 +msgid "Site" +msgstr "Сайт" + +#: circuits/filtersets.py:60 circuits/filtersets.py:213 +#: circuits/filtersets.py:250 dcim/filtersets.py:211 dcim/filtersets.py:286 +#: dcim/filtersets.py:358 extras/filtersets.py:436 ipam/filtersets.py:215 +#: ipam/filtersets.py:335 ipam/filtersets.py:926 +#: virtualization/filtersets.py:75 virtualization/filtersets.py:202 +#: vpn/filtersets.py:335 +msgid "Site (slug)" +msgstr "Сайт (слизень)" + +#: circuits/filtersets.py:65 +msgid "ASN (ID)" +msgstr "ЯСЕНЬ (РЕБЕНОК)" + +#: circuits/filtersets.py:86 circuits/filtersets.py:112 +#: circuits/filtersets.py:146 +msgid "Provider (ID)" +msgstr "Поставщик (ID)" + +#: circuits/filtersets.py:92 circuits/filtersets.py:118 +#: circuits/filtersets.py:152 +msgid "Provider (slug)" +msgstr "Поставщик (пуля)" + +#: circuits/filtersets.py:157 +msgid "Provider account (ID)" +msgstr "Учетная запись поставщика (ID)" + +#: circuits/filtersets.py:162 +msgid "Provider network (ID)" +msgstr "Сеть провайдеров (ID)" + +#: circuits/filtersets.py:166 +msgid "Circuit type (ID)" +msgstr "Тип цепи (ID)" + +#: circuits/filtersets.py:172 +msgid "Circuit type (slug)" +msgstr "Тип цепи (заглушка)" + +#: circuits/filtersets.py:207 circuits/filtersets.py:244 +#: dcim/filtersets.py:205 dcim/filtersets.py:280 dcim/filtersets.py:352 +#: dcim/filtersets.py:905 dcim/filtersets.py:1202 dcim/filtersets.py:1697 +#: dcim/filtersets.py:1869 dcim/filtersets.py:1927 ipam/filtersets.py:209 +#: ipam/filtersets.py:329 ipam/filtersets.py:920 +#: virtualization/filtersets.py:69 virtualization/filtersets.py:196 +#: vpn/filtersets.py:340 +msgid "Site (ID)" +msgstr "Сайт (ID)" + +#: circuits/filtersets.py:236 core/filtersets.py:73 core/filtersets.py:132 +#: dcim/filtersets.py:633 dcim/filtersets.py:1171 dcim/filtersets.py:1973 +#: extras/filtersets.py:40 extras/filtersets.py:69 extras/filtersets.py:101 +#: extras/filtersets.py:140 extras/filtersets.py:168 extras/filtersets.py:195 +#: extras/filtersets.py:226 extras/filtersets.py:295 extras/filtersets.py:343 +#: extras/filtersets.py:403 extras/filtersets.py:562 extras/filtersets.py:604 +#: extras/filtersets.py:645 ipam/forms/model_forms.py:430 +#: netbox/filtersets.py:275 netbox/forms/__init__.py:23 +#: netbox/forms/base.py:152 templates/htmx/object_selector.html:28 +#: templates/inc/filter_list.html:53 templates/ipam/ipaddress_assign.html:32 +#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:86 +#: users/filtersets.py:21 users/filtersets.py:37 users/filtersets.py:69 +#: users/filtersets.py:117 utilities/forms/forms.py:99 +msgid "Search" +msgstr "Поиск" + +#: circuits/filtersets.py:240 circuits/forms/bulk_edit.py:167 +#: circuits/forms/model_forms.py:110 circuits/forms/model_forms.py:132 +#: dcim/forms/connections.py:66 templates/circuits/circuit.html:15 +#: templates/dcim/inc/cable_termination.html:55 +#: templates/dcim/trace/circuit.html:4 +msgid "Circuit" +msgstr "Цепь" + +#: circuits/filtersets.py:254 +msgid "ProviderNetwork (ID)" +msgstr "Сеть провайдеров (ID)" + +#: circuits/forms/bulk_edit.py:25 circuits/forms/filtersets.py:56 +#: circuits/forms/model_forms.py:26 circuits/tables/providers.py:33 +#: dcim/forms/bulk_edit.py:126 dcim/forms/filtersets.py:187 +#: dcim/forms/model_forms.py:126 dcim/tables/sites.py:94 +#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:219 +#: netbox/navigation/menu.py:160 netbox/navigation/menu.py:163 +#: templates/circuits/provider.html:24 +msgid "ASNs" +msgstr "SAN" + +#: circuits/forms/bulk_edit.py:29 circuits/forms/bulk_edit.py:51 +#: circuits/forms/bulk_edit.py:78 circuits/forms/bulk_edit.py:99 +#: circuits/forms/bulk_edit.py:159 core/forms/bulk_edit.py:27 +#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:71 +#: dcim/forms/bulk_edit.py:90 dcim/forms/bulk_edit.py:149 +#: dcim/forms/bulk_edit.py:190 dcim/forms/bulk_edit.py:208 +#: dcim/forms/bulk_edit.py:336 dcim/forms/bulk_edit.py:371 +#: dcim/forms/bulk_edit.py:386 dcim/forms/bulk_edit.py:445 +#: dcim/forms/bulk_edit.py:484 dcim/forms/bulk_edit.py:514 +#: dcim/forms/bulk_edit.py:538 dcim/forms/bulk_edit.py:608 +#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:709 +#: dcim/forms/bulk_edit.py:732 dcim/forms/bulk_edit.py:780 +#: dcim/forms/bulk_edit.py:850 dcim/forms/bulk_edit.py:903 +#: dcim/forms/bulk_edit.py:938 dcim/forms/bulk_edit.py:978 +#: dcim/forms/bulk_edit.py:1022 dcim/forms/bulk_edit.py:1067 +#: dcim/forms/bulk_edit.py:1094 dcim/forms/bulk_edit.py:1112 +#: dcim/forms/bulk_edit.py:1130 dcim/forms/bulk_edit.py:1148 +#: dcim/forms/bulk_edit.py:1566 extras/forms/bulk_edit.py:36 +#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:152 +#: extras/forms/bulk_edit.py:182 extras/forms/bulk_edit.py:263 +#: extras/forms/bulk_edit.py:287 extras/forms/bulk_edit.py:301 +#: extras/tables/tables.py:56 ipam/forms/bulk_edit.py:50 +#: ipam/forms/bulk_edit.py:70 ipam/forms/bulk_edit.py:90 +#: ipam/forms/bulk_edit.py:114 ipam/forms/bulk_edit.py:143 +#: ipam/forms/bulk_edit.py:172 ipam/forms/bulk_edit.py:191 +#: ipam/forms/bulk_edit.py:260 ipam/forms/bulk_edit.py:304 +#: ipam/forms/bulk_edit.py:352 ipam/forms/bulk_edit.py:395 +#: ipam/forms/bulk_edit.py:423 ipam/forms/bulk_edit.py:551 +#: ipam/forms/bulk_edit.py:582 templates/account/token.html:36 +#: templates/circuits/circuit.html:60 templates/circuits/circuittype.html:29 +#: templates/circuits/inc/circuit_termination.html:115 +#: templates/circuits/provider.html:34 +#: templates/circuits/providernetwork.html:35 +#: templates/core/datasource.html:55 templates/dcim/cable.html:37 +#: templates/dcim/consoleport.html:47 templates/dcim/consoleserverport.html:47 +#: templates/dcim/device.html:96 templates/dcim/devicebay.html:35 +#: templates/dcim/devicerole.html:33 templates/dcim/devicetype.html:36 +#: templates/dcim/frontport.html:61 templates/dcim/interface.html:70 +#: templates/dcim/inventoryitem.html:61 +#: templates/dcim/inventoryitemrole.html:23 templates/dcim/location.html:36 +#: templates/dcim/manufacturer.html:43 templates/dcim/module.html:71 +#: templates/dcim/modulebay.html:39 templates/dcim/moduletype.html:27 +#: templates/dcim/platform.html:36 templates/dcim/powerfeed.html:43 +#: templates/dcim/poweroutlet.html:43 templates/dcim/powerpanel.html:31 +#: templates/dcim/powerport.html:43 templates/dcim/rack.html:54 +#: templates/dcim/rackreservation.html:69 templates/dcim/rackrole.html:29 +#: templates/dcim/rearport.html:57 templates/dcim/region.html:34 +#: templates/dcim/site.html:60 templates/dcim/sitegroup.html:34 +#: templates/dcim/virtualchassis.html:32 +#: templates/extras/admin/plugins_list.html:26 +#: templates/extras/configcontext.html:22 +#: templates/extras/configtemplate.html:18 +#: templates/extras/customfield.html:35 +#: templates/extras/dashboard/widget_add.html:14 +#: templates/extras/eventrule.html:24 templates/extras/exporttemplate.html:25 +#: templates/extras/report_list.html:47 templates/extras/savedfilter.html:18 +#: templates/extras/script_list.html:53 templates/extras/tag.html:23 +#: templates/extras/webhook.html:20 templates/generic/bulk_import.html:118 +#: templates/ipam/aggregate.html:44 templates/ipam/asn.html:43 +#: templates/ipam/asnrange.html:39 templates/ipam/fhrpgroup.html:35 +#: templates/ipam/ipaddress.html:58 templates/ipam/iprange.html:70 +#: templates/ipam/prefix.html:82 templates/ipam/rir.html:29 +#: templates/ipam/role.html:29 templates/ipam/routetarget.html:22 +#: templates/ipam/service.html:53 templates/ipam/servicetemplate.html:28 +#: templates/ipam/vlan.html:65 templates/ipam/vlangroup.html:35 +#: templates/ipam/vrf.html:36 templates/tenancy/contact.html:68 +#: templates/tenancy/contactgroup.html:28 +#: templates/tenancy/contactrole.html:23 templates/tenancy/tenant.html:25 +#: templates/tenancy/tenantgroup.html:36 +#: templates/users/objectpermission.html:22 templates/users/token.html:28 +#: templates/virtualization/cluster.html:28 +#: templates/virtualization/clustergroup.html:29 +#: templates/virtualization/clustertype.html:29 +#: templates/virtualization/virtualdisk.html:40 +#: templates/virtualization/virtualmachine.html:34 +#: templates/virtualization/vminterface.html:54 +#: templates/vpn/ikepolicy.html:18 templates/vpn/ikeproposal.html:18 +#: templates/vpn/ipsecpolicy.html:18 templates/vpn/ipsecprofile.html:18 +#: templates/vpn/ipsecprofile.html:43 templates/vpn/ipsecprofile.html:78 +#: templates/vpn/ipsecproposal.html:18 templates/vpn/l2vpn.html:27 +#: templates/vpn/tunnel.html:34 templates/vpn/tunnelgroup.html:33 +#: templates/wireless/wirelesslan.html:27 +#: templates/wireless/wirelesslangroup.html:34 +#: templates/wireless/wirelesslink.html:37 tenancy/forms/bulk_edit.py:31 +#: tenancy/forms/bulk_edit.py:79 tenancy/forms/bulk_edit.py:121 +#: users/forms/bulk_edit.py:62 users/forms/bulk_edit.py:92 +#: virtualization/forms/bulk_edit.py:31 virtualization/forms/bulk_edit.py:45 +#: virtualization/forms/bulk_edit.py:176 virtualization/forms/bulk_edit.py:227 +#: virtualization/forms/bulk_edit.py:336 vpn/forms/bulk_edit.py:27 +#: vpn/forms/bulk_edit.py:63 vpn/forms/bulk_edit.py:120 +#: vpn/forms/bulk_edit.py:154 vpn/forms/bulk_edit.py:191 +#: vpn/forms/bulk_edit.py:216 vpn/forms/bulk_edit.py:248 +#: vpn/forms/bulk_edit.py:277 wireless/forms/bulk_edit.py:28 +#: wireless/forms/bulk_edit.py:81 wireless/forms/bulk_edit.py:128 +msgid "Description" +msgstr "Описание" + +#: circuits/forms/bulk_edit.py:46 circuits/forms/bulk_edit.py:68 +#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:35 +#: circuits/forms/bulk_import.py:50 circuits/forms/bulk_import.py:76 +#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 +#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 +#: circuits/forms/model_forms.py:32 circuits/forms/model_forms.py:44 +#: circuits/forms/model_forms.py:58 circuits/forms/model_forms.py:92 +#: circuits/tables/circuits.py:55 circuits/tables/providers.py:72 +#: circuits/tables/providers.py:103 templates/circuits/circuit.html:19 +#: templates/circuits/provider.html:20 +#: templates/circuits/provideraccount.html:21 +#: templates/circuits/providernetwork.html:23 +#: templates/dcim/inc/cable_termination.html:51 +msgid "Provider" +msgstr "Поставщик" + +#: circuits/forms/bulk_edit.py:75 circuits/forms/filtersets.py:91 +#: templates/circuits/providernetwork.html:31 +msgid "Service ID" +msgstr "Идентификатор услуги" + +#: circuits/forms/bulk_edit.py:95 circuits/forms/filtersets.py:107 +#: dcim/forms/bulk_edit.py:204 dcim/forms/bulk_edit.py:500 +#: dcim/forms/bulk_edit.py:694 dcim/forms/bulk_edit.py:1063 +#: dcim/forms/bulk_edit.py:1090 dcim/forms/bulk_edit.py:1562 +#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1353 +#: dcim/forms/filtersets.py:1374 dcim/tables/devices.py:717 +#: dcim/tables/devices.py:777 dcim/tables/devices.py:1004 +#: dcim/tables/devicetypes.py:245 dcim/tables/devicetypes.py:260 +#: dcim/tables/racks.py:32 extras/forms/bulk_edit.py:259 +#: extras/tables/tables.py:323 templates/circuits/circuittype.html:33 +#: templates/dcim/cable.html:41 templates/dcim/devicerole.html:37 +#: templates/dcim/frontport.html:43 templates/dcim/inventoryitemrole.html:27 +#: templates/dcim/rackrole.html:33 templates/dcim/rearport.html:43 +#: templates/extras/tag.html:29 +msgid "Color" +msgstr "Цвет" + +#: circuits/forms/bulk_edit.py:113 circuits/forms/bulk_import.py:89 +#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:17 +#: core/forms/filtersets.py:29 core/tables/data.py:20 core/tables/jobs.py:18 +#: dcim/forms/bulk_edit.py:281 dcim/forms/bulk_edit.py:672 +#: dcim/forms/bulk_edit.py:811 dcim/forms/bulk_edit.py:879 +#: dcim/forms/bulk_edit.py:898 dcim/forms/bulk_edit.py:921 +#: dcim/forms/bulk_edit.py:963 dcim/forms/bulk_edit.py:1007 +#: dcim/forms/bulk_edit.py:1058 dcim/forms/bulk_edit.py:1085 +#: dcim/forms/bulk_import.py:206 dcim/forms/bulk_import.py:645 +#: dcim/forms/bulk_import.py:671 dcim/forms/bulk_import.py:697 +#: dcim/forms/bulk_import.py:717 dcim/forms/bulk_import.py:800 +#: dcim/forms/bulk_import.py:890 dcim/forms/bulk_import.py:932 +#: dcim/forms/bulk_import.py:1145 dcim/forms/bulk_import.py:1304 +#: dcim/forms/filtersets.py:286 dcim/forms/filtersets.py:867 +#: dcim/forms/filtersets.py:967 dcim/forms/filtersets.py:1088 +#: dcim/forms/filtersets.py:1158 dcim/forms/filtersets.py:1180 +#: dcim/forms/filtersets.py:1202 dcim/forms/filtersets.py:1219 +#: dcim/forms/filtersets.py:1253 dcim/forms/filtersets.py:1348 +#: dcim/forms/filtersets.py:1369 dcim/forms/object_import.py:89 +#: dcim/forms/object_import.py:118 dcim/forms/object_import.py:150 +#: dcim/tables/devices.py:211 dcim/tables/devices.py:833 +#: dcim/tables/power.py:77 extras/forms/bulk_import.py:39 +#: extras/tables/tables.py:345 extras/tables/tables.py:443 +#: netbox/tables/tables.py:234 templates/circuits/circuit.html:31 +#: templates/core/datasource.html:39 templates/dcim/cable.html:16 +#: templates/dcim/consoleport.html:39 templates/dcim/consoleserverport.html:39 +#: templates/dcim/frontport.html:39 templates/dcim/interface.html:47 +#: templates/dcim/interface.html:175 templates/dcim/interface.html:323 +#: templates/dcim/powerfeed.html:35 templates/dcim/poweroutlet.html:39 +#: templates/dcim/powerport.html:39 templates/dcim/rack.html:81 +#: templates/dcim/rearport.html:39 templates/extras/eventrule.html:95 +#: templates/virtualization/cluster.html:20 templates/vpn/l2vpn.html:23 +#: templates/wireless/inc/authentication_attrs.html:9 +#: templates/wireless/inc/wirelesslink_interface.html:14 +#: virtualization/forms/bulk_edit.py:59 virtualization/forms/bulk_import.py:41 +#: virtualization/forms/filtersets.py:53 +#: virtualization/forms/model_forms.py:65 virtualization/tables/clusters.py:66 +#: vpn/forms/bulk_edit.py:267 vpn/forms/bulk_import.py:259 +#: vpn/forms/filtersets.py:214 vpn/forms/model_forms.py:83 +#: vpn/forms/model_forms.py:118 vpn/forms/model_forms.py:232 +msgid "Type" +msgstr "Тип" + +#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:82 +#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:97 +msgid "Provider account" +msgstr "Учетная запись поставщика" + +#: circuits/forms/bulk_edit.py:131 circuits/forms/bulk_import.py:95 +#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:34 +#: core/forms/filtersets.py:75 core/tables/data.py:23 core/tables/jobs.py:26 +#: dcim/forms/bulk_edit.py:104 dcim/forms/bulk_edit.py:179 +#: dcim/forms/bulk_edit.py:260 dcim/forms/bulk_edit.py:593 +#: dcim/forms/bulk_edit.py:646 dcim/forms/bulk_edit.py:678 +#: dcim/forms/bulk_edit.py:805 dcim/forms/bulk_edit.py:1585 +#: dcim/forms/bulk_import.py:87 dcim/forms/bulk_import.py:146 +#: dcim/forms/bulk_import.py:194 dcim/forms/bulk_import.py:442 +#: dcim/forms/bulk_import.py:596 dcim/forms/bulk_import.py:1139 +#: dcim/forms/bulk_import.py:1299 dcim/forms/filtersets.py:170 +#: dcim/forms/filtersets.py:229 dcim/forms/filtersets.py:281 +#: dcim/forms/filtersets.py:726 dcim/forms/filtersets.py:835 +#: dcim/forms/filtersets.py:871 dcim/forms/filtersets.py:972 +#: dcim/forms/filtersets.py:1083 dcim/tables/devices.py:173 +#: dcim/tables/devices.py:836 dcim/tables/devices.py:1064 +#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:66 +#: dcim/tables/sites.py:82 dcim/tables/sites.py:133 +#: ipam/forms/bulk_edit.py:240 ipam/forms/bulk_edit.py:289 +#: ipam/forms/bulk_edit.py:337 ipam/forms/bulk_edit.py:541 +#: ipam/forms/bulk_import.py:191 ipam/forms/bulk_import.py:256 +#: ipam/forms/bulk_import.py:292 ipam/forms/bulk_import.py:458 +#: ipam/forms/filtersets.py:205 ipam/forms/filtersets.py:270 +#: ipam/forms/filtersets.py:341 ipam/forms/filtersets.py:482 +#: ipam/forms/model_forms.py:449 ipam/tables/ip.py:236 ipam/tables/ip.py:309 +#: ipam/tables/ip.py:359 ipam/tables/ip.py:421 ipam/tables/ip.py:448 +#: ipam/tables/vlans.py:122 ipam/tables/vlans.py:227 +#: templates/circuits/circuit.html:35 templates/core/datasource.html:47 +#: templates/core/job.html:35 templates/dcim/cable.html:20 +#: templates/dcim/device.html:183 templates/dcim/location.html:48 +#: templates/dcim/module.html:67 templates/dcim/powerfeed.html:39 +#: templates/dcim/rack.html:46 templates/dcim/site.html:43 +#: templates/extras/report_list.html:49 templates/extras/script_list.html:55 +#: templates/ipam/ipaddress.html:40 templates/ipam/iprange.html:57 +#: templates/ipam/prefix.html:74 templates/ipam/vlan.html:51 +#: templates/virtualization/cluster.html:24 +#: templates/virtualization/virtualmachine.html:22 +#: templates/vpn/tunnel.html:26 templates/wireless/wirelesslan.html:23 +#: templates/wireless/wirelesslink.html:20 users/forms/filtersets.py:33 +#: users/forms/model_forms.py:196 virtualization/forms/bulk_edit.py:69 +#: virtualization/forms/bulk_edit.py:117 +#: virtualization/forms/bulk_import.py:54 +#: virtualization/forms/bulk_import.py:80 +#: virtualization/forms/filtersets.py:61 +#: virtualization/forms/filtersets.py:156 virtualization/tables/clusters.py:74 +#: virtualization/tables/virtualmachines.py:50 vpn/forms/bulk_edit.py:38 +#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:46 +#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:42 +#: wireless/forms/bulk_edit.py:104 wireless/forms/bulk_import.py:43 +#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:48 +#: wireless/forms/filtersets.py:82 wireless/tables/wirelesslan.py:52 +#: wireless/tables/wirelesslink.py:19 +msgid "Status" +msgstr "Статус" + +#: circuits/forms/bulk_edit.py:137 circuits/forms/bulk_import.py:100 +#: circuits/forms/filtersets.py:119 dcim/forms/bulk_edit.py:120 +#: dcim/forms/bulk_edit.py:185 dcim/forms/bulk_edit.py:255 +#: dcim/forms/bulk_edit.py:366 dcim/forms/bulk_edit.py:583 +#: dcim/forms/bulk_edit.py:684 dcim/forms/bulk_edit.py:1590 +#: dcim/forms/bulk_import.py:106 dcim/forms/bulk_import.py:151 +#: dcim/forms/bulk_import.py:187 dcim/forms/bulk_import.py:274 +#: dcim/forms/bulk_import.py:416 dcim/forms/bulk_import.py:1151 +#: dcim/forms/bulk_import.py:1356 dcim/forms/filtersets.py:165 +#: dcim/forms/filtersets.py:197 dcim/forms/filtersets.py:248 +#: dcim/forms/filtersets.py:333 dcim/forms/filtersets.py:354 +#: dcim/forms/filtersets.py:653 dcim/forms/filtersets.py:826 +#: dcim/forms/filtersets.py:891 dcim/forms/filtersets.py:921 +#: dcim/forms/filtersets.py:1043 dcim/tables/power.py:88 +#: extras/filtersets.py:517 extras/forms/filtersets.py:331 +#: extras/forms/filtersets.py:405 ipam/forms/bulk_edit.py:40 +#: ipam/forms/bulk_edit.py:65 ipam/forms/bulk_edit.py:109 +#: ipam/forms/bulk_edit.py:138 ipam/forms/bulk_edit.py:163 +#: ipam/forms/bulk_edit.py:235 ipam/forms/bulk_edit.py:284 +#: ipam/forms/bulk_edit.py:332 ipam/forms/bulk_edit.py:536 +#: ipam/forms/bulk_import.py:37 ipam/forms/bulk_import.py:66 +#: ipam/forms/bulk_import.py:94 ipam/forms/bulk_import.py:114 +#: ipam/forms/bulk_import.py:134 ipam/forms/bulk_import.py:163 +#: ipam/forms/bulk_import.py:249 ipam/forms/bulk_import.py:285 +#: ipam/forms/bulk_import.py:451 ipam/forms/filtersets.py:47 +#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:99 +#: ipam/forms/filtersets.py:119 ipam/forms/filtersets.py:142 +#: ipam/forms/filtersets.py:169 ipam/forms/filtersets.py:256 +#: ipam/forms/filtersets.py:296 ipam/forms/filtersets.py:450 +#: ipam/tables/ip.py:451 ipam/tables/vlans.py:224 +#: templates/circuits/circuit.html:39 templates/dcim/cable.html:24 +#: templates/dcim/device.html:81 templates/dcim/location.html:52 +#: templates/dcim/powerfeed.html:47 templates/dcim/rack.html:37 +#: templates/dcim/rackreservation.html:56 templates/dcim/site.html:47 +#: templates/dcim/virtualdevicecontext.html:55 +#: templates/ipam/aggregate.html:31 templates/ipam/asn.html:34 +#: templates/ipam/asnrange.html:30 templates/ipam/ipaddress.html:31 +#: templates/ipam/iprange.html:61 templates/ipam/prefix.html:30 +#: templates/ipam/routetarget.html:18 templates/ipam/vlan.html:42 +#: templates/ipam/vrf.html:23 templates/tenancy/tenant.html:17 +#: templates/virtualization/cluster.html:36 +#: templates/virtualization/virtualmachine.html:38 templates/vpn/l2vpn.html:31 +#: templates/vpn/tunnel.html:50 templates/wireless/wirelesslan.html:35 +#: templates/wireless/wirelesslink.html:28 tenancy/forms/forms.py:25 +#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:53 +#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:75 +#: virtualization/forms/bulk_edit.py:154 +#: virtualization/forms/bulk_import.py:66 +#: virtualization/forms/bulk_import.py:115 +#: virtualization/forms/filtersets.py:46 +#: virtualization/forms/filtersets.py:101 vpn/forms/bulk_edit.py:58 +#: vpn/forms/bulk_edit.py:272 vpn/forms/bulk_import.py:59 +#: vpn/forms/bulk_import.py:253 vpn/forms/filtersets.py:211 +#: wireless/forms/bulk_edit.py:62 wireless/forms/bulk_edit.py:109 +#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 +#: wireless/forms/filtersets.py:34 wireless/forms/filtersets.py:74 +msgid "Tenant" +msgstr "Арендатор" + +#: circuits/forms/bulk_edit.py:142 circuits/forms/filtersets.py:174 +msgid "Install date" +msgstr "Дата установки" + +#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:179 +msgid "Termination date" +msgstr "Дата увольнения" + +#: circuits/forms/bulk_edit.py:153 circuits/forms/filtersets.py:186 +msgid "Commit rate (Kbps)" +msgstr "Скорость коммитирования (Кбит/с)" + +#: circuits/forms/bulk_edit.py:168 circuits/forms/model_forms.py:111 +msgid "Service Parameters" +msgstr "Параметры сервиса" + +#: circuits/forms/bulk_edit.py:169 circuits/forms/model_forms.py:112 +#: dcim/forms/model_forms.py:141 dcim/forms/model_forms.py:183 +#: dcim/forms/model_forms.py:260 dcim/forms/model_forms.py:672 +#: dcim/forms/model_forms.py:1478 ipam/forms/model_forms.py:61 +#: ipam/forms/model_forms.py:114 ipam/forms/model_forms.py:135 +#: ipam/forms/model_forms.py:159 ipam/forms/model_forms.py:231 +#: ipam/forms/model_forms.py:257 netbox/navigation/menu.py:38 +#: templates/dcim/cable_edit.html:68 templates/dcim/device_edit.html:85 +#: templates/dcim/rack_edit.html:30 templates/ipam/ipaddress_bulk_add.html:27 +#: templates/ipam/ipaddress_edit.html:27 templates/ipam/vlan_edit.html:22 +#: virtualization/forms/model_forms.py:83 +#: virtualization/forms/model_forms.py:225 vpn/forms/bulk_edit.py:77 +#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 +#: vpn/forms/model_forms.py:146 vpn/forms/model_forms.py:404 +#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:160 +msgid "Tenancy" +msgstr "Сдача в аренду" + +#: circuits/forms/bulk_import.py:38 circuits/forms/bulk_import.py:53 +#: circuits/forms/bulk_import.py:79 +msgid "Assigned provider" +msgstr "Назначенный поставщик" + +#: circuits/forms/bulk_import.py:70 dcim/forms/bulk_import.py:170 +#: dcim/forms/bulk_import.py:380 dcim/forms/bulk_import.py:1092 +#: dcim/forms/bulk_import.py:1171 extras/forms/bulk_import.py:229 +msgid "RGB color in hexadecimal. Example:" +msgstr "Цвет RGB в шестнадцатеричном формате. Пример:" + +#: circuits/forms/bulk_import.py:85 +msgid "Assigned provider account" +msgstr "Учетная запись назначенного поставщика" + +#: circuits/forms/bulk_import.py:92 +msgid "Type of circuit" +msgstr "Тип схемы" + +#: circuits/forms/bulk_import.py:97 dcim/forms/bulk_import.py:89 +#: dcim/forms/bulk_import.py:148 dcim/forms/bulk_import.py:196 +#: dcim/forms/bulk_import.py:444 dcim/forms/bulk_import.py:598 +#: dcim/forms/bulk_import.py:1301 ipam/forms/bulk_import.py:193 +#: ipam/forms/bulk_import.py:258 ipam/forms/bulk_import.py:294 +#: ipam/forms/bulk_import.py:460 virtualization/forms/bulk_import.py:56 +#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 +msgid "Operational status" +msgstr "Эксплуатационный статус" + +#: circuits/forms/bulk_import.py:104 dcim/forms/bulk_import.py:110 +#: dcim/forms/bulk_import.py:155 dcim/forms/bulk_import.py:278 +#: dcim/forms/bulk_import.py:420 dcim/forms/bulk_import.py:1155 +#: dcim/forms/bulk_import.py:1296 ipam/forms/bulk_import.py:41 +#: ipam/forms/bulk_import.py:70 ipam/forms/bulk_import.py:98 +#: ipam/forms/bulk_import.py:118 ipam/forms/bulk_import.py:138 +#: ipam/forms/bulk_import.py:167 ipam/forms/bulk_import.py:253 +#: ipam/forms/bulk_import.py:289 ipam/forms/bulk_import.py:455 +#: virtualization/forms/bulk_import.py:70 +#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 +#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +msgid "Assigned tenant" +msgstr "Назначение арендатора" + +#: circuits/forms/bulk_import.py:123 circuits/forms/filtersets.py:147 +#: circuits/forms/model_forms.py:143 +msgid "Provider network" +msgstr "Сеть провайдеров" + +#: circuits/forms/filtersets.py:26 circuits/forms/filtersets.py:118 +#: dcim/forms/bulk_edit.py:247 dcim/forms/bulk_edit.py:345 +#: dcim/forms/bulk_edit.py:575 dcim/forms/bulk_edit.py:622 +#: dcim/forms/bulk_edit.py:772 dcim/forms/bulk_import.py:181 +#: dcim/forms/bulk_import.py:255 dcim/forms/bulk_import.py:483 +#: dcim/forms/bulk_import.py:1245 dcim/forms/bulk_import.py:1279 +#: dcim/forms/filtersets.py:92 dcim/forms/filtersets.py:245 +#: dcim/forms/filtersets.py:278 dcim/forms/filtersets.py:330 +#: dcim/forms/filtersets.py:381 dcim/forms/filtersets.py:650 +#: dcim/forms/filtersets.py:689 dcim/forms/filtersets.py:890 +#: dcim/forms/filtersets.py:919 dcim/forms/filtersets.py:939 +#: dcim/forms/filtersets.py:1003 dcim/forms/filtersets.py:1033 +#: dcim/forms/filtersets.py:1042 dcim/forms/filtersets.py:1153 +#: dcim/forms/filtersets.py:1175 dcim/forms/filtersets.py:1197 +#: dcim/forms/filtersets.py:1214 dcim/forms/filtersets.py:1234 +#: dcim/forms/filtersets.py:1342 dcim/forms/filtersets.py:1364 +#: dcim/forms/filtersets.py:1385 dcim/forms/filtersets.py:1400 +#: dcim/forms/filtersets.py:1411 dcim/forms/model_forms.py:182 +#: dcim/forms/model_forms.py:216 dcim/forms/model_forms.py:402 +#: dcim/forms/model_forms.py:635 dcim/tables/devices.py:190 +#: dcim/tables/power.py:30 dcim/tables/racks.py:58 dcim/tables/racks.py:143 +#: extras/filtersets.py:441 extras/forms/filtersets.py:328 +#: ipam/forms/bulk_edit.py:456 ipam/forms/filtersets.py:168 +#: ipam/forms/filtersets.py:400 ipam/forms/filtersets.py:422 +#: ipam/forms/filtersets.py:448 ipam/forms/model_forms.py:560 +#: templates/dcim/device.html:26 templates/dcim/device_edit.html:30 +#: templates/dcim/inc/cable_termination.html:12 +#: templates/dcim/location.html:27 templates/dcim/powerpanel.html:27 +#: templates/dcim/rack.html:29 templates/dcim/rackreservation.html:35 +#: virtualization/forms/filtersets.py:45 virtualization/forms/filtersets.py:99 +#: wireless/forms/model_forms.py:88 wireless/forms/model_forms.py:128 +msgid "Location" +msgstr "Местоположение" + +#: circuits/forms/filtersets.py:27 ipam/forms/model_forms.py:158 +#: ipam/models/asns.py:108 ipam/models/asns.py:125 ipam/tables/asn.py:41 +#: templates/ipam/asn.html:20 +msgid "ASN" +msgstr "ЗОЛ" + +#: circuits/forms/filtersets.py:28 circuits/forms/filtersets.py:120 +#: dcim/forms/filtersets.py:136 dcim/forms/filtersets.py:150 +#: dcim/forms/filtersets.py:166 dcim/forms/filtersets.py:198 +#: dcim/forms/filtersets.py:249 dcim/forms/filtersets.py:334 +#: dcim/forms/filtersets.py:408 dcim/forms/filtersets.py:654 +#: dcim/forms/filtersets.py:1004 netbox/navigation/menu.py:45 +#: netbox/navigation/menu.py:47 tenancy/tables/columns.py:70 +#: tenancy/tables/contacts.py:25 tenancy/views.py:18 +#: virtualization/forms/filtersets.py:36 virtualization/forms/filtersets.py:47 +#: virtualization/forms/filtersets.py:102 +msgid "Contacts" +msgstr "Контакты" + +#: circuits/forms/filtersets.py:33 circuits/forms/filtersets.py:157 +#: dcim/forms/bulk_edit.py:110 dcim/forms/bulk_edit.py:222 +#: dcim/forms/bulk_edit.py:747 dcim/forms/bulk_import.py:92 +#: dcim/forms/filtersets.py:70 dcim/forms/filtersets.py:177 +#: dcim/forms/filtersets.py:203 dcim/forms/filtersets.py:256 +#: dcim/forms/filtersets.py:359 dcim/forms/filtersets.py:666 +#: dcim/forms/filtersets.py:896 dcim/forms/filtersets.py:926 +#: dcim/forms/filtersets.py:1010 dcim/forms/filtersets.py:1049 +#: dcim/forms/filtersets.py:1460 dcim/forms/filtersets.py:1484 +#: dcim/forms/filtersets.py:1508 dcim/forms/model_forms.py:80 +#: dcim/forms/model_forms.py:115 dcim/forms/object_create.py:374 +#: dcim/tables/devices.py:176 dcim/tables/sites.py:85 extras/filtersets.py:408 +#: ipam/forms/bulk_edit.py:205 ipam/forms/bulk_edit.py:437 +#: ipam/forms/bulk_edit.py:509 ipam/forms/filtersets.py:212 +#: ipam/forms/filtersets.py:407 ipam/forms/filtersets.py:456 +#: ipam/forms/model_forms.py:532 templates/dcim/device.html:18 +#: templates/dcim/rack.html:19 templates/dcim/rackreservation.html:25 +#: templates/dcim/region.html:26 templates/dcim/site.html:31 +#: templates/ipam/prefix.html:50 templates/ipam/vlan.html:19 +#: virtualization/forms/bulk_edit.py:80 virtualization/forms/filtersets.py:58 +#: virtualization/forms/filtersets.py:129 +#: virtualization/forms/model_forms.py:95 vpn/forms/filtersets.py:253 +msgid "Region" +msgstr "Регион" + +#: circuits/forms/filtersets.py:38 circuits/forms/filtersets.py:162 +#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:755 +#: dcim/forms/filtersets.py:75 dcim/forms/filtersets.py:182 +#: dcim/forms/filtersets.py:208 dcim/forms/filtersets.py:269 +#: dcim/forms/filtersets.py:364 dcim/forms/filtersets.py:671 +#: dcim/forms/filtersets.py:901 dcim/forms/filtersets.py:1015 +#: dcim/forms/filtersets.py:1054 dcim/forms/object_create.py:382 +#: extras/filtersets.py:425 ipam/forms/bulk_edit.py:210 +#: ipam/forms/bulk_edit.py:444 ipam/forms/bulk_edit.py:514 +#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:412 +#: ipam/forms/filtersets.py:461 ipam/forms/model_forms.py:545 +#: virtualization/forms/bulk_edit.py:85 virtualization/forms/filtersets.py:68 +#: virtualization/forms/filtersets.py:134 +#: virtualization/forms/model_forms.py:101 +msgid "Site group" +msgstr "Группа сайта" + +#: circuits/forms/filtersets.py:51 +msgid "ASN (legacy)" +msgstr "ASN (устаревшая версия)" + +#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 +#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 +#: core/forms/filtersets.py:63 dcim/forms/bulk_edit.py:718 +#: dcim/forms/filtersets.py:164 dcim/forms/filtersets.py:196 +#: dcim/forms/filtersets.py:825 dcim/forms/filtersets.py:920 +#: dcim/forms/filtersets.py:1044 dcim/forms/filtersets.py:1152 +#: dcim/forms/filtersets.py:1174 dcim/forms/filtersets.py:1196 +#: dcim/forms/filtersets.py:1213 dcim/forms/filtersets.py:1230 +#: dcim/forms/filtersets.py:1341 dcim/forms/filtersets.py:1363 +#: dcim/forms/filtersets.py:1384 dcim/forms/filtersets.py:1399 +#: dcim/forms/filtersets.py:1410 extras/forms/filtersets.py:40 +#: extras/forms/filtersets.py:111 extras/forms/filtersets.py:142 +#: extras/forms/filtersets.py:182 extras/forms/filtersets.py:198 +#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:253 +#: extras/forms/filtersets.py:450 extras/forms/filtersets.py:491 +#: ipam/forms/filtersets.py:98 ipam/forms/filtersets.py:255 +#: ipam/forms/filtersets.py:294 ipam/forms/filtersets.py:368 +#: ipam/forms/filtersets.py:449 ipam/forms/filtersets.py:508 +#: ipam/forms/filtersets.py:526 netbox/tables/tables.py:250 +#: virtualization/forms/filtersets.py:44 +#: virtualization/forms/filtersets.py:100 +#: virtualization/forms/filtersets.py:190 +#: virtualization/forms/filtersets.py:235 vpn/forms/filtersets.py:210 +#: wireless/forms/filtersets.py:33 wireless/forms/filtersets.py:73 +msgid "Attributes" +msgstr "Атрибуты" + +#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:60 +#: circuits/tables/providers.py:66 templates/circuits/circuit.html:23 +#: templates/circuits/provideraccount.html:25 +msgid "Account" +msgstr "Аккаунт" + +#: circuits/forms/model_forms.py:64 +#: templates/circuits/circuittermination_edit.html:23 +#: templates/circuits/inc/circuit_termination.html:89 +#: templates/circuits/providernetwork.html:18 +msgid "Provider Network" +msgstr "Сеть провайдеров" + +#: circuits/forms/model_forms.py:78 templates/circuits/circuittype.html:20 +msgid "Circuit Type" +msgstr "Тип цепи" + +#: circuits/models/circuits.py:25 dcim/models/cables.py:67 +#: dcim/models/device_component_templates.py:491 +#: dcim/models/device_component_templates.py:591 +#: dcim/models/device_components.py:976 dcim/models/device_components.py:1050 +#: dcim/models/device_components.py:1166 dcim/models/devices.py:467 +#: dcim/models/racks.py:43 extras/models/tags.py:28 +msgid "color" +msgstr "цвет" + +#: circuits/models/circuits.py:34 +msgid "circuit type" +msgstr "тип схемы" + +#: circuits/models/circuits.py:35 +msgid "circuit types" +msgstr "типы цепей" + +#: circuits/models/circuits.py:46 +msgid "circuit ID" +msgstr "идентификатор цепи" + +#: circuits/models/circuits.py:47 +msgid "Unique circuit ID" +msgstr "Уникальный идентификатор схемы" + +#: circuits/models/circuits.py:67 core/models/data.py:54 +#: core/models/jobs.py:85 dcim/models/cables.py:49 dcim/models/devices.py:641 +#: dcim/models/devices.py:1165 dcim/models/devices.py:1374 +#: dcim/models/power.py:95 dcim/models/racks.py:97 dcim/models/sites.py:154 +#: dcim/models/sites.py:266 ipam/models/ip.py:252 ipam/models/ip.py:521 +#: ipam/models/ip.py:729 ipam/models/vlans.py:175 +#: virtualization/models/clusters.py:74 +#: virtualization/models/virtualmachines.py:82 vpn/models/tunnels.py:40 +#: wireless/models.py:94 wireless/models.py:158 +msgid "status" +msgstr "статус" + +#: circuits/models/circuits.py:82 +msgid "installed" +msgstr "установлены" + +#: circuits/models/circuits.py:87 +msgid "terminates" +msgstr "завершаясь" + +#: circuits/models/circuits.py:92 +msgid "commit rate (Kbps)" +msgstr "скорость коммитирования (Кбит/с)" + +#: circuits/models/circuits.py:93 +msgid "Committed rate" +msgstr "Подтвержденная ставка" + +#: circuits/models/circuits.py:135 +msgid "circuit" +msgstr "схема" + +#: circuits/models/circuits.py:136 +msgid "circuits" +msgstr "схемы" + +#: circuits/models/circuits.py:169 +msgid "termination" +msgstr "прекращение" + +#: circuits/models/circuits.py:186 +msgid "port speed (Kbps)" +msgstr "скорость порта (Кбит/с)" + +#: circuits/models/circuits.py:189 +msgid "Physical circuit speed" +msgstr "Физическая скорость цепи" + +#: circuits/models/circuits.py:194 +msgid "upstream speed (Kbps)" +msgstr "скорость восходящего потока (Кбит/с)" + +#: circuits/models/circuits.py:195 +msgid "Upstream speed, if different from port speed" +msgstr "Скорость восходящего потока, если она отличается от скорости порта" + +#: circuits/models/circuits.py:200 +msgid "cross-connect ID" +msgstr "идентификатор кросс-соединения" + +#: circuits/models/circuits.py:201 +msgid "ID of the local cross-connect" +msgstr "Идентификатор локального кросс-соединения" + +#: circuits/models/circuits.py:206 +msgid "patch panel/port(s)" +msgstr "патч-панель/порт (ы)" + +#: circuits/models/circuits.py:207 +msgid "Patch panel ID and port number(s)" +msgstr "Идентификатор патч-панели и номера портов" + +#: circuits/models/circuits.py:210 +#: dcim/models/device_component_templates.py:61 +#: dcim/models/device_components.py:69 dcim/models/racks.py:537 +#: extras/models/configs.py:45 extras/models/configs.py:219 +#: extras/models/customfields.py:122 extras/models/models.py:58 +#: extras/models/models.py:188 extras/models/models.py:426 +#: extras/models/models.py:541 extras/models/staging.py:31 +#: extras/models/tags.py:32 netbox/models/__init__.py:109 +#: netbox/models/__init__.py:144 netbox/models/__init__.py:190 +#: users/models.py:273 users/models.py:348 +#: virtualization/models/virtualmachines.py:282 +msgid "description" +msgstr "описание" + +#: circuits/models/circuits.py:223 +msgid "circuit termination" +msgstr "прекращение цепи" + +#: circuits/models/circuits.py:224 +msgid "circuit terminations" +msgstr "концевые разъемы" + +#: circuits/models/providers.py:22 circuits/models/providers.py:66 +#: circuits/models/providers.py:104 core/models/data.py:41 +#: core/models/jobs.py:46 dcim/models/device_component_templates.py:43 +#: dcim/models/device_components.py:54 dcim/models/devices.py:581 +#: dcim/models/devices.py:1305 dcim/models/devices.py:1370 +#: dcim/models/power.py:39 dcim/models/power.py:91 dcim/models/racks.py:62 +#: dcim/models/sites.py:138 extras/models/configs.py:36 +#: extras/models/configs.py:215 extras/models/customfields.py:89 +#: extras/models/models.py:53 extras/models/models.py:183 +#: extras/models/models.py:326 extras/models/models.py:422 +#: extras/models/models.py:531 extras/models/models.py:626 +#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 +#: ipam/models/services.py:52 ipam/models/services.py:88 +#: ipam/models/vlans.py:26 ipam/models/vlans.py:164 ipam/models/vrfs.py:22 +#: ipam/models/vrfs.py:79 netbox/models/__init__.py:136 +#: netbox/models/__init__.py:180 tenancy/models/contacts.py:64 +#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 +#: users/models.py:344 virtualization/models/clusters.py:57 +#: virtualization/models/virtualmachines.py:70 +#: virtualization/models/virtualmachines.py:272 vpn/models/crypto.py:24 +#: vpn/models/crypto.py:71 vpn/models/crypto.py:119 vpn/models/crypto.py:171 +#: vpn/models/crypto.py:209 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 +#: wireless/models.py:50 +msgid "name" +msgstr "имя" + +#: circuits/models/providers.py:25 +msgid "Full name of the provider" +msgstr "Полное имя провайдера" + +#: circuits/models/providers.py:28 dcim/models/devices.py:86 +#: dcim/models/sites.py:149 extras/models/models.py:536 ipam/models/asns.py:23 +#: ipam/models/vlans.py:30 netbox/models/__init__.py:140 +#: netbox/models/__init__.py:185 tenancy/models/tenants.py:25 +#: tenancy/models/tenants.py:49 vpn/models/l2vpn.py:27 wireless/models.py:55 +msgid "slug" +msgstr "слизень" + +#: circuits/models/providers.py:42 +msgid "provider" +msgstr "поставщика" + +#: circuits/models/providers.py:43 +msgid "providers" +msgstr "провайдеры" + +#: circuits/models/providers.py:63 +msgid "account ID" +msgstr "идентификатор учетной записи" + +#: circuits/models/providers.py:86 +msgid "provider account" +msgstr "учетная запись провайдера" + +#: circuits/models/providers.py:87 +msgid "provider accounts" +msgstr "учетные записи поставщиков" + +#: circuits/models/providers.py:115 +msgid "service ID" +msgstr "идентификатор сервиса" + +#: circuits/models/providers.py:126 +msgid "provider network" +msgstr "сеть провайдеров" + +#: circuits/models/providers.py:127 +msgid "provider networks" +msgstr "сети провайдеров" + +#: circuits/tables/circuits.py:29 circuits/tables/providers.py:18 +#: circuits/tables/providers.py:69 circuits/tables/providers.py:99 +#: core/tables/data.py:16 core/tables/jobs.py:14 dcim/forms/filtersets.py:60 +#: dcim/forms/object_create.py:42 dcim/tables/devices.py:88 +#: dcim/tables/devices.py:125 dcim/tables/devices.py:167 +#: dcim/tables/devices.py:318 dcim/tables/devices.py:395 +#: dcim/tables/devices.py:439 dcim/tables/devices.py:491 +#: dcim/tables/devices.py:543 dcim/tables/devices.py:663 +#: dcim/tables/devices.py:744 dcim/tables/devices.py:794 +#: dcim/tables/devices.py:860 dcim/tables/devices.py:975 +#: dcim/tables/devices.py:995 dcim/tables/devices.py:1024 +#: dcim/tables/devices.py:1054 dcim/tables/devicetypes.py:32 +#: dcim/tables/power.py:22 dcim/tables/power.py:62 dcim/tables/racks.py:23 +#: dcim/tables/racks.py:53 dcim/tables/sites.py:24 dcim/tables/sites.py:51 +#: dcim/tables/sites.py:78 dcim/tables/sites.py:125 +#: extras/forms/filtersets.py:190 extras/tables/tables.py:40 +#: extras/tables/tables.py:83 extras/tables/tables.py:115 +#: extras/tables/tables.py:139 extras/tables/tables.py:204 +#: extras/tables/tables.py:251 extras/tables/tables.py:274 +#: extras/tables/tables.py:319 extras/tables/tables.py:371 +#: extras/tables/tables.py:394 ipam/forms/bulk_edit.py:390 +#: ipam/forms/filtersets.py:372 ipam/tables/asn.py:16 ipam/tables/ip.py:85 +#: ipam/tables/ip.py:159 ipam/tables/services.py:15 ipam/tables/services.py:40 +#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:110 ipam/tables/vrfs.py:26 +#: ipam/tables/vrfs.py:67 templates/circuits/circuittype.html:25 +#: templates/circuits/provideraccount.html:29 +#: templates/circuits/providernetwork.html:27 +#: templates/core/datasource.html:35 templates/core/job.html:31 +#: templates/dcim/consoleport.html:31 templates/dcim/consoleserverport.html:31 +#: templates/dcim/devicebay.html:27 templates/dcim/devicerole.html:29 +#: templates/dcim/frontport.html:31 +#: templates/dcim/inc/interface_vlans_table.html:5 +#: templates/dcim/inc/panels/inventory_items.html:10 +#: templates/dcim/interface.html:39 templates/dcim/interface.html:171 +#: templates/dcim/inventoryitem.html:29 +#: templates/dcim/inventoryitemrole.html:19 templates/dcim/location.html:32 +#: templates/dcim/manufacturer.html:39 templates/dcim/modulebay.html:27 +#: templates/dcim/platform.html:32 templates/dcim/poweroutlet.html:31 +#: templates/dcim/powerport.html:31 templates/dcim/rackrole.html:25 +#: templates/dcim/rearport.html:31 templates/dcim/region.html:30 +#: templates/dcim/sitegroup.html:30 +#: templates/dcim/virtualdevicecontext.html:21 +#: templates/extras/admin/plugins_list.html:22 +#: templates/extras/configcontext.html:14 +#: templates/extras/configtemplate.html:14 +#: templates/extras/customfield.html:16 templates/extras/customlink.html:14 +#: templates/extras/eventrule.html:16 templates/extras/exporttemplate.html:21 +#: templates/extras/report_list.html:46 templates/extras/savedfilter.html:14 +#: templates/extras/script_list.html:52 templates/extras/tag.html:17 +#: templates/extras/webhook.html:16 templates/ipam/asnrange.html:16 +#: templates/ipam/fhrpgroup.html:31 templates/ipam/rir.html:25 +#: templates/ipam/role.html:25 templates/ipam/routetarget.html:14 +#: templates/ipam/service.html:27 templates/ipam/servicetemplate.html:16 +#: templates/ipam/vlan.html:38 templates/ipam/vlangroup.html:31 +#: templates/tenancy/contact.html:26 templates/tenancy/contactgroup.html:24 +#: templates/tenancy/contactrole.html:19 templates/tenancy/tenantgroup.html:32 +#: templates/users/group.html:18 templates/users/objectpermission.html:18 +#: templates/virtualization/cluster.html:16 +#: templates/virtualization/clustergroup.html:25 +#: templates/virtualization/clustertype.html:25 +#: templates/virtualization/virtualdisk.html:26 +#: templates/virtualization/virtualmachine.html:18 +#: templates/virtualization/vminterface.html:28 +#: templates/vpn/ikepolicy.html:14 templates/vpn/ikeproposal.html:14 +#: templates/vpn/ipsecpolicy.html:14 templates/vpn/ipsecprofile.html:14 +#: templates/vpn/ipsecprofile.html:39 templates/vpn/ipsecprofile.html:74 +#: templates/vpn/ipsecproposal.html:14 templates/vpn/l2vpn.html:15 +#: templates/vpn/tunnel.html:22 templates/vpn/tunnelgroup.html:29 +#: templates/wireless/wirelesslangroup.html:30 tenancy/tables/contacts.py:19 +#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 +#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 +#: users/tables.py:62 users/tables.py:79 +#: virtualization/forms/bulk_create.py:20 +#: virtualization/forms/object_create.py:13 +#: virtualization/forms/object_create.py:23 +#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 +#: virtualization/tables/clusters.py:62 +#: virtualization/tables/virtualmachines.py:45 +#: virtualization/tables/virtualmachines.py:119 +#: virtualization/tables/virtualmachines.py:172 vpn/tables/crypto.py:18 +#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 +#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 +#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 +#: wireless/tables/wirelesslan.py:79 +msgid "Name" +msgstr "Имя" + +#: circuits/tables/circuits.py:38 circuits/tables/providers.py:45 +#: circuits/tables/providers.py:79 netbox/navigation/menu.py:254 +#: netbox/navigation/menu.py:258 netbox/navigation/menu.py:260 +#: templates/circuits/provider.html:61 +#: templates/circuits/provideraccount.html:46 +#: templates/circuits/providernetwork.html:54 +msgid "Circuits" +msgstr "Схемы" + +#: circuits/tables/circuits.py:52 templates/circuits/circuit.html:27 +msgid "Circuit ID" +msgstr "Идентификатор цепи" + +#: circuits/tables/circuits.py:65 wireless/forms/model_forms.py:157 +msgid "Side A" +msgstr "Сторона А" + +#: circuits/tables/circuits.py:69 +msgid "Side Z" +msgstr "Сторона Z" + +#: circuits/tables/circuits.py:72 templates/circuits/circuit.html:56 +msgid "Commit Rate" +msgstr "Процент коммитов" + +#: circuits/tables/circuits.py:75 circuits/tables/providers.py:48 +#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 +#: dcim/tables/devices.py:1037 dcim/tables/devicetypes.py:92 +#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 +#: dcim/tables/power.py:96 dcim/tables/racks.py:76 dcim/tables/racks.py:156 +#: dcim/tables/sites.py:103 extras/forms/bulk_edit.py:320 +#: extras/tables/tables.py:485 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 +#: ipam/tables/ip.py:135 ipam/tables/ip.py:272 ipam/tables/ip.py:325 +#: ipam/tables/ip.py:392 ipam/tables/services.py:24 ipam/tables/services.py:54 +#: ipam/tables/vlans.py:141 ipam/tables/vrfs.py:46 ipam/tables/vrfs.py:71 +#: templates/dcim/cable_edit.html:85 templates/generic/bulk_edit.html:102 +#: templates/inc/panels/comments.html:6 tenancy/tables/contacts.py:68 +#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 +#: virtualization/tables/clusters.py:91 +#: virtualization/tables/virtualmachines.py:68 vpn/tables/crypto.py:37 +#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 +#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:57 +#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +msgid "Comments" +msgstr "Комментарии" + +#: circuits/tables/providers.py:23 +msgid "Accounts" +msgstr "Счета" + +#: circuits/tables/providers.py:29 +msgid "Account Count" +msgstr "Количество учетных записей" + +#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +msgid "ASN Count" +msgstr "Количество ASN" + +#: core/choices.py:18 +msgid "New" +msgstr "Новое" + +#: core/choices.py:19 +msgid "Queued" +msgstr "В очереди" + +#: core/choices.py:20 +msgid "Syncing" +msgstr "Синхронизация" + +#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 +#: extras/choices.py:210 templates/core/job.html:75 +msgid "Completed" +msgstr "Завершено" + +#: core/choices.py:22 core/choices.py:59 dcim/choices.py:176 +#: dcim/choices.py:222 dcim/choices.py:1496 extras/choices.py:212 +#: virtualization/choices.py:47 +msgid "Failed" +msgstr "Не удалось" + +#: core/choices.py:35 netbox/navigation/menu.py:330 +#: templates/extras/script/base.html:14 templates/extras/script_list.html:6 +#: templates/extras/script_list.html:20 templates/extras/script_result.html:18 +msgid "Scripts" +msgstr "Сценарии" + +#: core/choices.py:36 netbox/navigation/menu.py:324 +#: templates/extras/report/base.html:13 templates/extras/report_list.html:7 +#: templates/extras/report_list.html:12 +msgid "Reports" +msgstr "Отчеты" + +#: core/choices.py:54 extras/choices.py:207 +msgid "Pending" +msgstr "В ожидании" + +#: core/choices.py:55 core/tables/jobs.py:32 extras/choices.py:208 +#: templates/core/job.html:62 +msgid "Scheduled" +msgstr "Запланировано" + +#: core/choices.py:56 extras/choices.py:209 +msgid "Running" +msgstr "Бег" + +#: core/choices.py:58 extras/choices.py:211 +msgid "Errored" +msgstr "Ошибка" + +#: core/data_backends.py:29 templates/dcim/interface.html:224 +msgid "Local" +msgstr "Местный" + +#: core/data_backends.py:47 extras/tables/tables.py:431 +#: templates/account/profile.html:16 templates/users/user.html:18 +#: users/tables.py:31 +msgid "Username" +msgstr "Имя пользователя" + +#: core/data_backends.py:49 core/data_backends.py:55 +msgid "Only used for cloning with HTTP(S)" +msgstr "Используется только для клонирования с помощью HTTP (S)" + +#: core/data_backends.py:53 templates/account/base.html:17 +#: templates/account/password.html:11 users/forms/model_forms.py:171 +msgid "Password" +msgstr "Пароль" + +#: core/data_backends.py:59 +msgid "Branch" +msgstr "Ветка" + +#: core/data_backends.py:118 +msgid "AWS access key ID" +msgstr "Идентификатор ключа доступа AWS" + +#: core/data_backends.py:122 +msgid "AWS secret access key" +msgstr "Секретный ключ доступа AWS" + +#: core/filtersets.py:49 extras/filtersets.py:203 extras/filtersets.py:538 +#: extras/filtersets.py:566 +msgid "Data source (ID)" +msgstr "Источник данных (ID)" + +#: core/filtersets.py:55 +msgid "Data source (name)" +msgstr "Источник данных (имя)" + +#: core/forms/bulk_edit.py:24 ipam/forms/bulk_edit.py:47 +msgid "Enforce unique space" +msgstr "Обеспечьте уникальное пространство" + +#: core/forms/bulk_edit.py:33 extras/forms/model_forms.py:202 +#: templates/extras/savedfilter.html:57 vpn/forms/filtersets.py:95 +#: vpn/forms/filtersets.py:124 vpn/forms/filtersets.py:148 +#: vpn/forms/filtersets.py:167 vpn/forms/model_forms.py:294 +#: vpn/forms/model_forms.py:315 vpn/forms/model_forms.py:329 +#: vpn/forms/model_forms.py:350 vpn/forms/model_forms.py:373 +msgid "Parameters" +msgstr "параметры" + +#: core/forms/bulk_edit.py:37 templates/core/datasource.html:69 +msgid "Ignore rules" +msgstr "Игнорируйте правила" + +#: core/forms/filtersets.py:26 core/forms/model_forms.py:95 +#: extras/forms/model_forms.py:165 extras/forms/model_forms.py:455 +#: extras/forms/model_forms.py:508 extras/tables/tables.py:149 +#: extras/tables/tables.py:363 extras/tables/tables.py:398 +#: templates/core/datasource.html:31 +#: templates/dcim/device/render_config.html:19 +#: templates/extras/configcontext.html:30 +#: templates/extras/configtemplate.html:22 +#: templates/extras/exporttemplate.html:41 +#: templates/virtualization/virtualmachine/render_config.html:19 +msgid "Data Source" +msgstr "Источник данных" + +#: core/forms/filtersets.py:39 core/tables/data.py:26 +#: dcim/forms/bulk_edit.py:1012 dcim/forms/bulk_edit.py:1285 +#: dcim/forms/filtersets.py:1270 dcim/tables/devices.py:568 +#: dcim/tables/devicetypes.py:221 extras/forms/bulk_edit.py:97 +#: extras/forms/bulk_edit.py:161 extras/forms/bulk_edit.py:220 +#: extras/forms/filtersets.py:119 extras/forms/filtersets.py:206 +#: extras/forms/filtersets.py:267 extras/tables/tables.py:122 +#: extras/tables/tables.py:211 extras/tables/tables.py:284 +#: templates/core/datasource.html:43 templates/dcim/interface.html:62 +#: templates/extras/customlink.html:18 templates/extras/eventrule.html:20 +#: templates/extras/savedfilter.html:26 +#: templates/users/objectpermission.html:26 +#: templates/virtualization/vminterface.html:32 users/forms/bulk_edit.py:69 +#: users/forms/filtersets.py:71 users/tables.py:86 +#: virtualization/forms/bulk_edit.py:216 +#: virtualization/forms/filtersets.py:207 +msgid "Enabled" +msgstr "Включено" + +#: core/forms/filtersets.py:51 core/forms/mixins.py:21 +msgid "File" +msgstr "Файл" + +#: core/forms/filtersets.py:56 core/forms/mixins.py:16 +#: extras/forms/filtersets.py:147 extras/forms/filtersets.py:336 +#: extras/forms/filtersets.py:422 +msgid "Data source" +msgstr "Источник данных" + +#: core/forms/filtersets.py:64 extras/forms/filtersets.py:449 +msgid "Creation" +msgstr "Творчество" + +#: core/forms/filtersets.py:70 extras/forms/filtersets.py:473 +#: extras/forms/filtersets.py:519 extras/tables/tables.py:474 +#: templates/core/job.html:25 templates/extras/objectchange.html:56 +#: tenancy/tables/contacts.py:90 vpn/tables/l2vpn.py:59 +msgid "Object Type" +msgstr "Тип объекта" + +#: core/forms/filtersets.py:80 +msgid "Created after" +msgstr "Создано после" + +#: core/forms/filtersets.py:85 +msgid "Created before" +msgstr "Создано ранее" + +#: core/forms/filtersets.py:90 +msgid "Scheduled after" +msgstr "Запланировано позже" + +#: core/forms/filtersets.py:95 +msgid "Scheduled before" +msgstr "Запланировано ранее" + +#: core/forms/filtersets.py:100 +msgid "Started after" +msgstr "Началось после" + +#: core/forms/filtersets.py:105 +msgid "Started before" +msgstr "Начиналось раньше" + +#: core/forms/filtersets.py:110 +msgid "Completed after" +msgstr "Завершено после" + +#: core/forms/filtersets.py:115 +msgid "Completed before" +msgstr "Выполнено ранее" + +#: core/forms/filtersets.py:122 dcim/forms/bulk_edit.py:359 +#: dcim/forms/filtersets.py:352 dcim/forms/filtersets.py:396 +#: dcim/forms/model_forms.py:251 extras/forms/filtersets.py:465 +#: extras/forms/filtersets.py:511 templates/dcim/rackreservation.html:65 +#: templates/extras/objectchange.html:40 templates/extras/savedfilter.html:22 +#: templates/users/token.html:22 templates/users/user.html:6 +#: templates/users/user.html:14 users/filtersets.py:74 users/filtersets.py:134 +#: users/forms/filtersets.py:85 users/forms/filtersets.py:126 +#: users/forms/model_forms.py:156 users/forms/model_forms.py:194 +#: users/tables.py:19 +msgid "User" +msgstr "Пользователь" + +#: core/forms/model_forms.py:52 core/tables/data.py:46 +#: templates/core/datafile.html:36 templates/extras/report/base.html:33 +#: templates/extras/script/base.html:32 templates/extras/script_result.html:45 +msgid "Source" +msgstr "Источник" + +#: core/forms/model_forms.py:56 +msgid "Backend Parameters" +msgstr "Параметры бэкенда" + +#: core/forms/model_forms.py:94 +msgid "File Upload" +msgstr "Загрузка файла" + +#: core/forms/model_forms.py:147 templates/core/configrevision.html:43 +#: templates/dcim/rack_elevation_list.html:6 +msgid "Rack Elevations" +msgstr "Высота стеллажей" + +#: core/forms/model_forms.py:148 dcim/choices.py:1407 +#: dcim/forms/bulk_edit.py:859 dcim/forms/bulk_edit.py:1242 +#: dcim/forms/bulk_edit.py:1260 dcim/tables/racks.py:89 +#: netbox/navigation/menu.py:276 netbox/navigation/menu.py:280 +msgid "Power" +msgstr "Мощность" + +#: core/forms/model_forms.py:149 netbox/navigation/menu.py:142 +#: templates/core/configrevision.html:79 +msgid "IPAM" +msgstr "ИПАМ" + +#: core/forms/model_forms.py:150 netbox/navigation/menu.py:218 +#: templates/core/configrevision.html:95 vpn/forms/bulk_edit.py:76 +#: vpn/forms/filtersets.py:42 vpn/forms/model_forms.py:60 +#: vpn/forms/model_forms.py:145 +msgid "Security" +msgstr "Охрана" + +#: core/forms/model_forms.py:151 templates/core/configrevision.html:107 +msgid "Banners" +msgstr "Баннеры" + +#: core/forms/model_forms.py:152 templates/core/configrevision.html:131 +msgid "Pagination" +msgstr "Разбивка на страницы" + +#: core/forms/model_forms.py:153 extras/forms/model_forms.py:63 +#: templates/core/configrevision.html:147 +msgid "Validation" +msgstr "Валидация" + +#: core/forms/model_forms.py:154 templates/account/preferences.html:6 +#: templates/core/configrevision.html:175 +msgid "User Preferences" +msgstr "Пользовательские предпочтения" + +#: core/forms/model_forms.py:155 dcim/forms/filtersets.py:658 +#: templates/core/configrevision.html:193 users/forms/model_forms.py:63 +msgid "Miscellaneous" +msgstr "Разное" + +#: core/forms/model_forms.py:158 +msgid "Config Revision" +msgstr "Редакция конфигурации" + +#: core/forms/model_forms.py:197 +msgid "This parameter has been defined statically and cannot be modified." +msgstr "Этот параметр определен статически и не может быть изменен." + +#: core/forms/model_forms.py:205 +#, python-brace-format +msgid "Current value: {value}" +msgstr "Текущее значение: {value}" + +#: core/forms/model_forms.py:207 +msgid " (default)" +msgstr " (по умолчанию)" + +#: core/models/config.py:18 core/models/data.py:259 core/models/files.py:27 +#: core/models/jobs.py:50 extras/models/models.py:760 +#: netbox/models/features.py:52 users/models.py:248 +msgid "created" +msgstr "созданный" + +#: core/models/config.py:22 +msgid "comment" +msgstr "комментарий" + +#: core/models/config.py:29 +msgid "configuration data" +msgstr "конфигурационные данные" + +#: core/models/config.py:36 +msgid "config revision" +msgstr "ревизия конфигурации" + +#: core/models/config.py:37 +msgid "config revisions" +msgstr "ревизии конфигурации" + +#: core/models/config.py:41 +msgid "Default configuration" +msgstr "Конфигурация по умолчанию" + +#: core/models/config.py:43 +msgid "Current configuration" +msgstr "Текущая конфигурация" + +#: core/models/config.py:44 +#, python-brace-format +msgid "Config revision #{id}" +msgstr "Версия конфигурации #{id}" + +#: core/models/data.py:46 dcim/models/cables.py:43 +#: dcim/models/device_component_templates.py:177 +#: dcim/models/device_component_templates.py:211 +#: dcim/models/device_component_templates.py:246 +#: dcim/models/device_component_templates.py:308 +#: dcim/models/device_component_templates.py:387 +#: dcim/models/device_component_templates.py:486 +#: dcim/models/device_component_templates.py:586 +#: dcim/models/device_components.py:284 dcim/models/device_components.py:313 +#: dcim/models/device_components.py:346 dcim/models/device_components.py:464 +#: dcim/models/device_components.py:606 dcim/models/device_components.py:971 +#: dcim/models/device_components.py:1045 dcim/models/power.py:101 +#: dcim/models/racks.py:127 extras/models/customfields.py:75 +#: extras/models/search.py:43 virtualization/models/clusters.py:61 +#: vpn/models/l2vpn.py:32 +msgid "type" +msgstr "типа" + +#: core/models/data.py:51 extras/choices.py:34 extras/models/models.py:194 +#: templates/core/datasource.html:59 +msgid "URL" +msgstr "URL" + +#: core/models/data.py:61 dcim/models/device_component_templates.py:392 +#: dcim/models/device_components.py:513 extras/models/models.py:88 +#: extras/models/models.py:331 extras/models/models.py:556 users/models.py:353 +msgid "enabled" +msgstr "включен" + +#: core/models/data.py:65 +msgid "ignore rules" +msgstr "игнорировать правила" + +#: core/models/data.py:67 +msgid "Patterns (one per line) matching files to ignore when syncing" +msgstr "" +"Шаблоны (по одному в строке), соответствующие файлам, которые следует " +"игнорировать при синхронизации" + +#: core/models/data.py:70 extras/models/models.py:564 +msgid "parameters" +msgstr "параметры" + +#: core/models/data.py:75 +msgid "last synced" +msgstr "последняя синхронизация" + +#: core/models/data.py:83 +msgid "data source" +msgstr "источник данных" + +#: core/models/data.py:84 +msgid "data sources" +msgstr "источники данных" + +#: core/models/data.py:124 +#, python-brace-format +msgid "Unknown backend type: {type}" +msgstr "Неизвестный тип бэкэнда: {type}" + +#: core/models/data.py:263 core/models/files.py:31 +#: netbox/models/features.py:58 +msgid "last updated" +msgstr "последнее обновление" + +#: core/models/data.py:273 dcim/models/cables.py:430 +msgid "path" +msgstr "дорожка" + +#: core/models/data.py:276 +msgid "File path relative to the data source's root" +msgstr "Путь к файлу относительно корня источника данных" + +#: core/models/data.py:280 ipam/models/ip.py:502 +msgid "size" +msgstr "размер" + +#: core/models/data.py:283 +msgid "hash" +msgstr "нарубить" + +#: core/models/data.py:287 +msgid "Length must be 64 hexadecimal characters." +msgstr "Длина должна быть 64 шестнадцатеричных символа." + +#: core/models/data.py:289 +msgid "SHA256 hash of the file data" +msgstr "Хэш SHA256 данных файла" + +#: core/models/data.py:306 +msgid "data file" +msgstr "файл данных" + +#: core/models/data.py:307 +msgid "data files" +msgstr "файлы данных" + +#: core/models/data.py:393 +msgid "auto sync record" +msgstr "запись автоматической синхронизации" + +#: core/models/data.py:394 +msgid "auto sync records" +msgstr "автоматическая синхронизация записей" + +#: core/models/files.py:37 +msgid "file root" +msgstr "корень файла" + +#: core/models/files.py:42 +msgid "file path" +msgstr "путь к файлу" + +#: core/models/files.py:44 +msgid "File path relative to the designated root path" +msgstr "Путь к файлу относительно указанного корневого пути" + +#: core/models/files.py:61 +msgid "managed file" +msgstr "управляемый файл" + +#: core/models/files.py:62 +msgid "managed files" +msgstr "управляемые файлы" + +#: core/models/jobs.py:54 +msgid "scheduled" +msgstr "по расписанию" + +#: core/models/jobs.py:59 +msgid "interval" +msgstr "интервал" + +#: core/models/jobs.py:65 +msgid "Recurrence interval (in minutes)" +msgstr "Интервал повторения (в минутах)" + +#: core/models/jobs.py:68 +msgid "started" +msgstr "начали" + +#: core/models/jobs.py:73 +msgid "completed" +msgstr "завершил" + +#: core/models/jobs.py:91 extras/models/models.py:123 +#: extras/models/staging.py:87 +msgid "data" +msgstr "данные" + +#: core/models/jobs.py:96 +msgid "error" +msgstr "ошибка" + +#: core/models/jobs.py:101 +msgid "job ID" +msgstr "идентификатор задания" + +#: core/models/jobs.py:112 +msgid "job" +msgstr "задание" + +#: core/models/jobs.py:113 +msgid "jobs" +msgstr "рабочие места" + +#: core/models/jobs.py:135 +#, python-brace-format +msgid "Jobs cannot be assigned to this object type ({type})." +msgstr "Задания нельзя присвоить этому типу объектов ({type})." + +#: core/tables/config.py:21 users/forms/filtersets.py:45 users/tables.py:39 +msgid "Is Active" +msgstr "Активен" + +#: core/tables/data.py:50 templates/core/datafile.html:40 +msgid "Path" +msgstr "Путь" + +#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +msgid "Last updated" +msgstr "Последнее обновление" + +#: core/tables/jobs.py:10 dcim/tables/devicetypes.py:161 +#: extras/tables/tables.py:174 extras/tables/tables.py:340 +#: netbox/tables/tables.py:184 templates/dcim/virtualchassis_edit.html:53 +#: wireless/tables/wirelesslink.py:16 +msgid "ID" +msgstr "ИДЕНТИФИКАТОР" + +#: core/tables/jobs.py:21 extras/choices.py:38 extras/tables/tables.py:236 +#: extras/tables/tables.py:350 extras/tables/tables.py:448 +#: extras/tables/tables.py:479 netbox/tables/tables.py:238 +#: templates/extras/eventrule.html:99 +#: templates/extras/htmx/report_result.html:45 +#: templates/extras/journalentry.html:21 templates/extras/objectchange.html:62 +#: tenancy/tables/contacts.py:93 vpn/tables/l2vpn.py:64 +msgid "Object" +msgstr "Объект" + +#: core/tables/jobs.py:35 +msgid "Interval" +msgstr "Интервал" + +#: core/tables/jobs.py:38 templates/core/job.html:71 +#: templates/extras/htmx/report_result.html:7 +#: templates/extras/htmx/script_result.html:8 +msgid "Started" +msgstr "Запущено" + +#: dcim/api/serializers.py:205 templates/dcim/rack.html:33 +msgid "Facility ID" +msgstr "Идентификатор объекта" + +#: dcim/api/serializers.py:321 dcim/api/serializers.py:680 +msgid "Position (U)" +msgstr "Позиция (U)" + +#: dcim/choices.py:21 virtualization/choices.py:21 +msgid "Staging" +msgstr "Инсценировка" + +#: dcim/choices.py:23 dcim/choices.py:178 dcim/choices.py:223 +#: dcim/choices.py:1420 virtualization/choices.py:23 +#: virtualization/choices.py:48 +msgid "Decommissioning" +msgstr "Вывод из эксплуатации" + +#: dcim/choices.py:24 +msgid "Retired" +msgstr "В отставке" + +#: dcim/choices.py:65 +msgid "2-post frame" +msgstr "2-стоечная рама" + +#: dcim/choices.py:66 +msgid "4-post frame" +msgstr "4-стоечная рама" + +#: dcim/choices.py:67 +msgid "4-post cabinet" +msgstr "Шкаф с 4 стойками" + +#: dcim/choices.py:68 +msgid "Wall-mounted frame" +msgstr "Настенная рама" + +#: dcim/choices.py:69 +msgid "Wall-mounted frame (vertical)" +msgstr "Настенная рама (вертикальная)" + +#: dcim/choices.py:70 +msgid "Wall-mounted cabinet" +msgstr "Настенный шкаф" + +#: dcim/choices.py:71 +msgid "Wall-mounted cabinet (vertical)" +msgstr "Настенный шкаф (вертикальный)" + +#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#, python-brace-format +msgid "{n} inches" +msgstr "{n} дюймов" + +#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 +#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +msgid "Reserved" +msgstr "Зарезервировано" + +#: dcim/choices.py:101 templates/dcim/device.html:262 +msgid "Available" +msgstr "Доступно" + +#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 +#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +msgid "Deprecated" +msgstr "Устарело" + +#: dcim/choices.py:114 templates/dcim/rack.html:128 +msgid "Millimeters" +msgstr "Миллиметры" + +#: dcim/choices.py:115 dcim/choices.py:1442 +msgid "Inches" +msgstr "Дюймы" + +#: dcim/choices.py:140 dcim/forms/bulk_edit.py:66 dcim/forms/bulk_edit.py:85 +#: dcim/forms/bulk_edit.py:171 dcim/forms/bulk_edit.py:1290 +#: dcim/forms/bulk_import.py:59 dcim/forms/bulk_import.py:73 +#: dcim/forms/bulk_import.py:136 dcim/forms/bulk_import.py:503 +#: dcim/forms/bulk_import.py:770 dcim/forms/bulk_import.py:1021 +#: dcim/forms/filtersets.py:226 dcim/forms/model_forms.py:73 +#: dcim/forms/model_forms.py:94 dcim/forms/model_forms.py:172 +#: dcim/forms/model_forms.py:955 dcim/forms/model_forms.py:1296 +#: dcim/forms/object_import.py:181 dcim/tables/devices.py:671 +#: dcim/tables/devices.py:955 extras/tables/tables.py:181 +#: ipam/tables/fhrp.py:59 ipam/tables/ip.py:374 ipam/tables/services.py:44 +#: templates/dcim/interface.html:105 templates/dcim/interface.html:321 +#: templates/dcim/location.html:44 templates/dcim/region.html:38 +#: templates/dcim/sitegroup.html:38 templates/ipam/service.html:31 +#: templates/tenancy/contactgroup.html:32 +#: templates/tenancy/tenantgroup.html:40 +#: templates/virtualization/vminterface.html:42 +#: templates/wireless/wirelesslangroup.html:38 tenancy/forms/bulk_edit.py:26 +#: tenancy/forms/bulk_edit.py:60 tenancy/forms/bulk_import.py:24 +#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:24 +#: tenancy/forms/model_forms.py:69 virtualization/forms/bulk_edit.py:206 +#: virtualization/forms/bulk_import.py:151 +#: virtualization/tables/virtualmachines.py:142 wireless/forms/bulk_edit.py:23 +#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:20 +msgid "Parent" +msgstr "Родитель" + +#: dcim/choices.py:141 +msgid "Child" +msgstr "Ребенок" + +#: dcim/choices.py:155 templates/dcim/device.html:345 +#: templates/dcim/rack.html:181 templates/dcim/rack_elevation_list.html:22 +#: templates/dcim/rackreservation.html:84 +msgid "Front" +msgstr "Передняя" + +#: dcim/choices.py:156 templates/dcim/device.html:351 +#: templates/dcim/rack.html:187 templates/dcim/rack_elevation_list.html:23 +#: templates/dcim/rackreservation.html:90 +msgid "Rear" +msgstr "Задний" + +#: dcim/choices.py:175 dcim/choices.py:221 virtualization/choices.py:46 +msgid "Staged" +msgstr "Поставил" + +#: dcim/choices.py:177 +msgid "Inventory" +msgstr "Инвентарь" + +#: dcim/choices.py:193 +msgid "Front to rear" +msgstr "Спереди назад" + +#: dcim/choices.py:194 +msgid "Rear to front" +msgstr "Сзади вперед" + +#: dcim/choices.py:195 +msgid "Left to right" +msgstr "Слева направо" + +#: dcim/choices.py:196 +msgid "Right to left" +msgstr "Справа налево" + +#: dcim/choices.py:197 +msgid "Side to rear" +msgstr "Бок назад" + +#: dcim/choices.py:198 dcim/choices.py:1215 +msgid "Passive" +msgstr "Пассивный" + +#: dcim/choices.py:199 +msgid "Mixed" +msgstr "Смешанный" + +#: dcim/choices.py:443 dcim/choices.py:680 +msgid "NEMA (Non-locking)" +msgstr "NEMA (без блокировки)" + +#: dcim/choices.py:465 dcim/choices.py:702 +msgid "NEMA (Locking)" +msgstr "NEMA (блокировка)" + +#: dcim/choices.py:488 dcim/choices.py:725 +msgid "California Style" +msgstr "Калифорнийский стиль" + +#: dcim/choices.py:496 +msgid "International/ITA" +msgstr "Международная/ITA" + +#: dcim/choices.py:526 dcim/choices.py:755 +msgid "Proprietary" +msgstr "Собственный" + +#: dcim/choices.py:534 dcim/choices.py:764 dcim/choices.py:1131 +#: dcim/choices.py:1133 dcim/choices.py:1338 dcim/choices.py:1340 +#: netbox/navigation/menu.py:188 +msgid "Other" +msgstr "Другой" + +#: dcim/choices.py:733 +msgid "ITA/International" +msgstr "ITA/Международный" + +#: dcim/choices.py:794 +msgid "Physical" +msgstr "Физический" + +#: dcim/choices.py:795 dcim/choices.py:949 +msgid "Virtual" +msgstr "Виртуальный" + +#: dcim/choices.py:796 dcim/choices.py:1019 dcim/forms/bulk_edit.py:1398 +#: dcim/forms/filtersets.py:1233 dcim/forms/model_forms.py:881 +#: dcim/forms/model_forms.py:1190 netbox/navigation/menu.py:128 +#: netbox/navigation/menu.py:132 templates/dcim/interface.html:217 +msgid "Wireless" +msgstr "Беспроводная" + +#: dcim/choices.py:947 +msgid "Virtual interfaces" +msgstr "Виртуальные интерфейсы" + +#: dcim/choices.py:950 dcim/forms/bulk_edit.py:1295 +#: dcim/forms/bulk_import.py:777 dcim/forms/model_forms.py:869 +#: dcim/tables/devices.py:675 templates/dcim/interface.html:109 +#: templates/virtualization/vminterface.html:46 +#: virtualization/forms/bulk_edit.py:211 +#: virtualization/forms/bulk_import.py:158 +#: virtualization/tables/virtualmachines.py:146 +msgid "Bridge" +msgstr "Мост" + +#: dcim/choices.py:951 +msgid "Link Aggregation Group (LAG)" +msgstr "Группа агрегации каналов (LAG)" + +#: dcim/choices.py:955 +msgid "Ethernet (fixed)" +msgstr "Ethernet (стационарный)" + +#: dcim/choices.py:969 +msgid "Ethernet (modular)" +msgstr "Ethernet (модульный)" + +#: dcim/choices.py:1005 +msgid "Ethernet (backplane)" +msgstr "Ethernet (объединительная плата)" + +#: dcim/choices.py:1033 +msgid "Cellular" +msgstr "Сотовая связь" + +#: dcim/choices.py:1080 dcim/forms/filtersets.py:302 +#: dcim/forms/filtersets.py:736 dcim/forms/filtersets.py:876 +#: dcim/forms/filtersets.py:1426 templates/dcim/inventoryitem.html:53 +#: templates/dcim/virtualchassis_edit.html:55 +msgid "Serial" +msgstr "Серийный" + +#: dcim/choices.py:1095 +msgid "Coaxial" +msgstr "Коаксиальный" + +#: dcim/choices.py:1112 +msgid "Stacking" +msgstr "Штабелирование" + +#: dcim/choices.py:1162 +msgid "Half" +msgstr "Половина" + +#: dcim/choices.py:1163 +msgid "Full" +msgstr "Полный" + +#: dcim/choices.py:1164 wireless/choices.py:480 +msgid "Auto" +msgstr "авто" + +#: dcim/choices.py:1175 +msgid "Access" +msgstr "Доступ" + +#: dcim/choices.py:1176 ipam/tables/vlans.py:168 ipam/tables/vlans.py:213 +#: templates/dcim/inc/interface_vlans_table.html:7 +msgid "Tagged" +msgstr "Помеченные" + +#: dcim/choices.py:1177 +msgid "Tagged (All)" +msgstr "С метками (все)" + +#: dcim/choices.py:1206 +msgid "IEEE Standard" +msgstr "Стандарт IEEE" + +#: dcim/choices.py:1217 +msgid "Passive 24V (2-pair)" +msgstr "Пассивный режим 24 В (2 пары)" + +#: dcim/choices.py:1218 +msgid "Passive 24V (4-pair)" +msgstr "Пассивное напряжение 24 В (4 пары)" + +#: dcim/choices.py:1219 +msgid "Passive 48V (2-pair)" +msgstr "Пассивное напряжение 48 В (2 пары)" + +#: dcim/choices.py:1220 +msgid "Passive 48V (4-pair)" +msgstr "Пассивное напряжение 48 В (4 пары)" + +#: dcim/choices.py:1282 dcim/choices.py:1378 +msgid "Copper" +msgstr "Медь" + +#: dcim/choices.py:1305 +msgid "Fiber Optic" +msgstr "Оптоволоконное" + +#: dcim/choices.py:1394 +msgid "Fiber" +msgstr "волокно" + +#: dcim/choices.py:1418 dcim/forms/filtersets.py:1140 +msgid "Connected" +msgstr "Подключено" + +#: dcim/choices.py:1437 +msgid "Kilometers" +msgstr "Километры" + +#: dcim/choices.py:1438 templates/dcim/cable_trace.html:62 +msgid "Meters" +msgstr "Счетчики" + +#: dcim/choices.py:1439 +msgid "Centimeters" +msgstr "Сантиметры" + +#: dcim/choices.py:1440 +msgid "Miles" +msgstr "Мили" + +#: dcim/choices.py:1441 templates/dcim/cable_trace.html:63 +msgid "Feet" +msgstr "Ноги" + +#: dcim/choices.py:1457 templates/dcim/device.html:332 +#: templates/dcim/rack.html:157 +msgid "Kilograms" +msgstr "Килограммы" + +#: dcim/choices.py:1458 +msgid "Grams" +msgstr "Граммы" + +#: dcim/choices.py:1459 templates/dcim/rack.html:158 +msgid "Pounds" +msgstr "Фунты" + +#: dcim/choices.py:1460 +msgid "Ounces" +msgstr "Унции" + +#: dcim/choices.py:1506 tenancy/choices.py:17 +msgid "Primary" +msgstr "Начальное" + +#: dcim/choices.py:1507 +msgid "Redundant" +msgstr "Резервный" + +#: dcim/choices.py:1528 +msgid "Single phase" +msgstr "Однофазный" + +#: dcim/choices.py:1529 +msgid "Three-phase" +msgstr "Трехфазный" + +#: dcim/filtersets.py:80 +msgid "Parent region (ID)" +msgstr "Родительский регион (ID)" + +#: dcim/filtersets.py:86 +msgid "Parent region (slug)" +msgstr "Родительский регион (пуля)" + +#: dcim/filtersets.py:97 +msgid "Parent site group (ID)" +msgstr "Родительская группа сайтов (ID)" + +#: dcim/filtersets.py:103 +msgid "Parent site group (slug)" +msgstr "Родительская группа сайтов (slug)" + +#: dcim/filtersets.py:132 ipam/filtersets.py:797 ipam/filtersets.py:930 +msgid "Group (ID)" +msgstr "Группа (ID)" + +#: dcim/filtersets.py:138 +msgid "Group (slug)" +msgstr "Группа (слизень)" + +#: dcim/filtersets.py:144 dcim/filtersets.py:149 +msgid "AS (ID)" +msgstr "КАК (ID)" + +#: dcim/filtersets.py:217 dcim/filtersets.py:292 dcim/filtersets.py:390 +#: dcim/filtersets.py:917 dcim/filtersets.py:1213 dcim/filtersets.py:1881 +msgid "Location (ID)" +msgstr "Местонахождение (ID)" + +#: dcim/filtersets.py:224 dcim/filtersets.py:299 dcim/filtersets.py:397 +#: dcim/filtersets.py:1219 extras/filtersets.py:447 +msgid "Location (slug)" +msgstr "Местоположение (пуля)" + +#: dcim/filtersets.py:313 dcim/filtersets.py:764 dcim/filtersets.py:854 +#: dcim/filtersets.py:1619 ipam/filtersets.py:347 ipam/filtersets.py:459 +#: ipam/filtersets.py:940 virtualization/filtersets.py:209 +msgid "Role (ID)" +msgstr "Роль (идентификатор)" + +#: dcim/filtersets.py:319 dcim/filtersets.py:770 dcim/filtersets.py:860 +#: dcim/filtersets.py:1625 extras/filtersets.py:463 ipam/filtersets.py:353 +#: ipam/filtersets.py:465 ipam/filtersets.py:946 +#: virtualization/filtersets.py:215 +msgid "Role (slug)" +msgstr "Роль (пуля)" + +#: dcim/filtersets.py:347 dcim/filtersets.py:922 dcim/filtersets.py:1224 +#: dcim/filtersets.py:1942 +msgid "Rack (ID)" +msgstr "Стеллаж (ID)" + +#: dcim/filtersets.py:401 extras/filtersets.py:234 extras/filtersets.py:278 +#: extras/filtersets.py:318 extras/filtersets.py:613 +msgid "User (ID)" +msgstr "Пользователь (ID)" + +#: dcim/filtersets.py:407 extras/filtersets.py:240 extras/filtersets.py:284 +#: extras/filtersets.py:324 users/filtersets.py:80 users/filtersets.py:140 +msgid "User (name)" +msgstr "Пользователь (имя)" + +#: dcim/filtersets.py:435 dcim/filtersets.py:561 dcim/filtersets.py:754 +#: dcim/filtersets.py:805 dcim/filtersets.py:833 dcim/filtersets.py:1116 +#: dcim/filtersets.py:1609 +msgid "Manufacturer (ID)" +msgstr "Производитель (ID)" + +#: dcim/filtersets.py:441 dcim/filtersets.py:567 dcim/filtersets.py:760 +#: dcim/filtersets.py:811 dcim/filtersets.py:839 dcim/filtersets.py:1122 +#: dcim/filtersets.py:1615 +msgid "Manufacturer (slug)" +msgstr "Производитель (slug)" + +#: dcim/filtersets.py:445 +msgid "Default platform (ID)" +msgstr "Платформа по умолчанию (ID)" + +#: dcim/filtersets.py:451 +msgid "Default platform (slug)" +msgstr "Платформа по умолчанию (slug)" + +#: dcim/filtersets.py:454 dcim/forms/filtersets.py:452 +msgid "Has a front image" +msgstr "Имеет фронтальное изображение" + +#: dcim/filtersets.py:458 dcim/forms/filtersets.py:459 +msgid "Has a rear image" +msgstr "Имеет изображение сзади" + +#: dcim/filtersets.py:463 dcim/filtersets.py:571 dcim/filtersets.py:975 +#: dcim/forms/filtersets.py:466 dcim/forms/filtersets.py:563 +#: dcim/forms/filtersets.py:775 +msgid "Has console ports" +msgstr "Имеет консольные порты" + +#: dcim/filtersets.py:467 dcim/filtersets.py:575 dcim/filtersets.py:979 +#: dcim/forms/filtersets.py:473 dcim/forms/filtersets.py:570 +#: dcim/forms/filtersets.py:782 +msgid "Has console server ports" +msgstr "Имеет порты консольного сервера" + +#: dcim/filtersets.py:471 dcim/filtersets.py:579 dcim/filtersets.py:983 +#: dcim/forms/filtersets.py:480 dcim/forms/filtersets.py:577 +#: dcim/forms/filtersets.py:789 +msgid "Has power ports" +msgstr "Имеет порты питания" + +#: dcim/filtersets.py:475 dcim/filtersets.py:583 dcim/filtersets.py:987 +#: dcim/forms/filtersets.py:487 dcim/forms/filtersets.py:584 +#: dcim/forms/filtersets.py:796 +msgid "Has power outlets" +msgstr "Имеет розетки" + +#: dcim/filtersets.py:479 dcim/filtersets.py:587 dcim/filtersets.py:991 +#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:591 +#: dcim/forms/filtersets.py:803 +msgid "Has interfaces" +msgstr "Имеет интерфейсы" + +#: dcim/filtersets.py:483 dcim/filtersets.py:591 dcim/filtersets.py:995 +#: dcim/forms/filtersets.py:501 dcim/forms/filtersets.py:598 +#: dcim/forms/filtersets.py:810 +msgid "Has pass-through ports" +msgstr "Имеет сквозные порты" + +#: dcim/filtersets.py:487 dcim/filtersets.py:999 dcim/forms/filtersets.py:515 +msgid "Has module bays" +msgstr "Имеет отсеки для модулей" + +#: dcim/filtersets.py:491 dcim/filtersets.py:1003 dcim/forms/filtersets.py:508 +msgid "Has device bays" +msgstr "Имеет отсеки для устройств" + +#: dcim/filtersets.py:495 dcim/forms/filtersets.py:522 +msgid "Has inventory items" +msgstr "Имеет инвентарь" + +#: dcim/filtersets.py:638 dcim/filtersets.py:849 dcim/filtersets.py:1245 +msgid "Device type (ID)" +msgstr "Тип устройства (ID)" + +#: dcim/filtersets.py:651 dcim/filtersets.py:1127 +msgid "Module type (ID)" +msgstr "Тип модуля (ID)" + +#: dcim/filtersets.py:750 dcim/filtersets.py:1605 +msgid "Parent inventory item (ID)" +msgstr "Родительский инвентарь (ID)" + +#: dcim/filtersets.py:793 dcim/filtersets.py:815 dcim/filtersets.py:971 +#: virtualization/filtersets.py:237 +msgid "Config template (ID)" +msgstr "Шаблон конфигурации (ID)" + +#: dcim/filtersets.py:845 +msgid "Device type (slug)" +msgstr "Тип устройства (заглушка)" + +#: dcim/filtersets.py:865 +msgid "Parent Device (ID)" +msgstr "Родительское устройство (ID)" + +#: dcim/filtersets.py:869 virtualization/filtersets.py:219 +msgid "Platform (ID)" +msgstr "Платформа (ID)" + +#: dcim/filtersets.py:875 extras/filtersets.py:474 +#: virtualization/filtersets.py:225 +msgid "Platform (slug)" +msgstr "Платформа (пуля)" + +#: dcim/filtersets.py:911 dcim/filtersets.py:1208 dcim/filtersets.py:1703 +#: dcim/filtersets.py:1875 dcim/filtersets.py:1933 +msgid "Site name (slug)" +msgstr "Название сайта (slug)" + +#: dcim/filtersets.py:926 +msgid "VM cluster (ID)" +msgstr "Кластер виртуальных машин (ID)" + +#: dcim/filtersets.py:932 +msgid "Device model (slug)" +msgstr "Модель устройства (заглушка)" + +#: dcim/filtersets.py:943 dcim/forms/bulk_edit.py:421 +msgid "Is full depth" +msgstr "Это полная глубина" + +#: dcim/filtersets.py:947 dcim/forms/common.py:18 dcim/forms/filtersets.py:745 +#: dcim/forms/filtersets.py:1285 dcim/models/device_components.py:519 +#: virtualization/filtersets.py:229 virtualization/filtersets.py:295 +#: virtualization/forms/filtersets.py:168 +#: virtualization/forms/filtersets.py:215 +msgid "MAC address" +msgstr "MAC-адрес" + +#: dcim/filtersets.py:954 dcim/forms/filtersets.py:754 +#: dcim/forms/filtersets.py:841 virtualization/filtersets.py:233 +#: virtualization/forms/filtersets.py:172 +msgid "Has a primary IP" +msgstr "Имеет основной IP-адрес" + +#: dcim/filtersets.py:958 +msgid "Has an out-of-band IP" +msgstr "Имеет внеполосный IP-адрес" + +#: dcim/filtersets.py:963 +msgid "Virtual chassis (ID)" +msgstr "Виртуальное шасси (ID)" + +#: dcim/filtersets.py:967 +msgid "Is a virtual chassis member" +msgstr "Является виртуальным членом шасси" + +#: dcim/filtersets.py:1008 +msgid "OOB IP (ID)" +msgstr "ПОДГУЗНИК (ID)" + +#: dcim/filtersets.py:1133 +msgid "Module type (model)" +msgstr "Тип модуля (модель)" + +#: dcim/filtersets.py:1139 +msgid "Module Bay (ID)" +msgstr "Отсек для модулей (ID)" + +#: dcim/filtersets.py:1143 dcim/filtersets.py:1234 ipam/filtersets.py:577 +#: ipam/filtersets.py:807 ipam/filtersets.py:1015 +#: virtualization/filtersets.py:160 vpn/filtersets.py:351 +msgid "Device (ID)" +msgstr "Устройство (идентификатор)" + +#: dcim/filtersets.py:1230 +msgid "Rack (name)" +msgstr "Стеллаж (название)" + +#: dcim/filtersets.py:1240 ipam/filtersets.py:572 ipam/filtersets.py:802 +#: ipam/filtersets.py:1021 vpn/filtersets.py:346 +msgid "Device (name)" +msgstr "Устройство (имя)" + +#: dcim/filtersets.py:1251 +msgid "Device type (model)" +msgstr "Тип устройства (модель)" + +#: dcim/filtersets.py:1256 dcim/filtersets.py:1279 +msgid "Device role (ID)" +msgstr "Роль устройства (ID)" + +#: dcim/filtersets.py:1262 dcim/filtersets.py:1285 +msgid "Device role (slug)" +msgstr "Роль устройства (slug)" + +#: dcim/filtersets.py:1267 +msgid "Virtual Chassis (ID)" +msgstr "Виртуальное шасси (ID)" + +#: dcim/filtersets.py:1273 dcim/forms/filtersets.py:106 +#: dcim/tables/devices.py:235 netbox/navigation/menu.py:67 +#: templates/dcim/device.html:123 templates/dcim/device_edit.html:93 +#: templates/dcim/virtualchassis.html:20 +#: templates/dcim/virtualchassis_add.html:8 +#: templates/dcim/virtualchassis_edit.html:25 +msgid "Virtual Chassis" +msgstr "Виртуальное шасси" + +#: dcim/filtersets.py:1305 +msgid "Module (ID)" +msgstr "Модуль (идентификатор)" + +#: dcim/filtersets.py:1409 ipam/forms/bulk_import.py:188 +#: vpn/forms/bulk_import.py:303 +msgid "Assigned VLAN" +msgstr "Назначенная VLAN" + +#: dcim/filtersets.py:1413 +msgid "Assigned VID" +msgstr "Назначенный VID" + +#: dcim/filtersets.py:1418 dcim/forms/bulk_edit.py:1374 +#: dcim/forms/bulk_import.py:828 dcim/forms/filtersets.py:1328 +#: dcim/forms/model_forms.py:1175 dcim/models/device_components.py:712 +#: dcim/tables/devices.py:637 ipam/filtersets.py:282 ipam/filtersets.py:293 +#: ipam/filtersets.py:449 ipam/filtersets.py:550 ipam/filtersets.py:561 +#: ipam/forms/bulk_edit.py:226 ipam/forms/bulk_edit.py:281 +#: ipam/forms/bulk_edit.py:323 ipam/forms/bulk_import.py:156 +#: ipam/forms/bulk_import.py:242 ipam/forms/bulk_import.py:278 +#: ipam/forms/filtersets.py:66 ipam/forms/filtersets.py:167 +#: ipam/forms/filtersets.py:295 ipam/forms/model_forms.py:59 +#: ipam/forms/model_forms.py:203 ipam/forms/model_forms.py:246 +#: ipam/forms/model_forms.py:290 ipam/forms/model_forms.py:412 +#: ipam/forms/model_forms.py:426 ipam/forms/model_forms.py:440 +#: ipam/models/ip.py:232 ipam/models/ip.py:511 ipam/models/ip.py:719 +#: ipam/models/vrfs.py:62 ipam/tables/ip.py:241 ipam/tables/ip.py:306 +#: ipam/tables/ip.py:356 ipam/tables/ip.py:445 +#: templates/dcim/interface.html:138 templates/ipam/ipaddress.html:21 +#: templates/ipam/iprange.html:43 templates/ipam/prefix.html:20 +#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:14 +#: templates/virtualization/vminterface.html:50 +#: virtualization/forms/bulk_edit.py:260 +#: virtualization/forms/bulk_import.py:171 +#: virtualization/forms/filtersets.py:220 +#: virtualization/forms/model_forms.py:347 +#: virtualization/models/virtualmachines.py:348 +#: virtualization/tables/virtualmachines.py:123 +msgid "VRF" +msgstr "VRF" + +#: dcim/filtersets.py:1424 ipam/filtersets.py:288 ipam/filtersets.py:299 +#: ipam/filtersets.py:455 ipam/filtersets.py:556 ipam/filtersets.py:567 +msgid "VRF (RD)" +msgstr "VRF (КРАСНЫЙ)" + +#: dcim/filtersets.py:1429 ipam/filtersets.py:963 vpn/filtersets.py:314 +msgid "L2VPN (ID)" +msgstr "L2VPN (ИДЕНТИФИКАТОР)" + +#: dcim/filtersets.py:1435 dcim/forms/filtersets.py:1333 +#: dcim/tables/devices.py:585 ipam/filtersets.py:969 +#: ipam/forms/filtersets.py:499 ipam/tables/vlans.py:133 +#: templates/dcim/interface.html:94 templates/ipam/vlan.html:69 +#: templates/vpn/l2vpntermination.html:15 +#: virtualization/forms/filtersets.py:225 vpn/forms/bulk_import.py:275 +#: vpn/forms/filtersets.py:242 vpn/forms/model_forms.py:402 +#: vpn/forms/model_forms.py:420 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +msgid "L2VPN" +msgstr "L2VPN" + +#: dcim/filtersets.py:1467 +msgid "Virtual Chassis Interfaces for Device" +msgstr "Интерфейсы виртуального корпуса для устройства" + +#: dcim/filtersets.py:1472 +msgid "Virtual Chassis Interfaces for Device (ID)" +msgstr "Интерфейсы виртуального корпуса для устройства (ID)" + +#: dcim/filtersets.py:1476 +msgid "Kind of interface" +msgstr "Вид интерфейса" + +#: dcim/filtersets.py:1481 virtualization/filtersets.py:287 +msgid "Parent interface (ID)" +msgstr "Родительский интерфейс (ID)" + +#: dcim/filtersets.py:1486 virtualization/filtersets.py:292 +msgid "Bridged interface (ID)" +msgstr "Мостовой интерфейс (ID)" + +#: dcim/filtersets.py:1491 +msgid "LAG interface (ID)" +msgstr "Интерфейс LAG (ID)" + +#: dcim/filtersets.py:1660 +msgid "Master (ID)" +msgstr "Мастер (удостоверение личности)" + +#: dcim/filtersets.py:1666 +msgid "Master (name)" +msgstr "Мастер (имя)" + +#: dcim/filtersets.py:1708 tenancy/filtersets.py:220 +msgid "Tenant (ID)" +msgstr "Арендатор (ID)" + +#: dcim/filtersets.py:1714 extras/filtersets.py:523 tenancy/filtersets.py:226 +msgid "Tenant (slug)" +msgstr "Арендатор (пуля)" + +#: dcim/filtersets.py:1749 dcim/forms/filtersets.py:990 +msgid "Unterminated" +msgstr "Нерасторгнутый" + +#: dcim/filtersets.py:1937 +msgid "Power panel (ID)" +msgstr "Панель питания (ID)" + +#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:410 +#: extras/forms/model_forms.py:444 extras/forms/model_forms.py:495 +#: netbox/forms/base.py:71 netbox/forms/mixins.py:79 +#: netbox/tables/columns.py:448 +#: templates/circuits/inc/circuit_termination.html:119 +#: templates/generic/bulk_edit.html:81 templates/inc/panels/tags.html:5 +#: utilities/forms/fields/fields.py:81 +msgid "Tags" +msgstr "Теги" + +#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1390 +#: dcim/forms/model_forms.py:422 dcim/forms/model_forms.py:468 +#: dcim/forms/object_create.py:196 dcim/forms/object_create.py:352 +#: dcim/tables/devices.py:198 dcim/tables/devices.py:720 +#: dcim/tables/devicetypes.py:242 templates/dcim/device.html:45 +#: templates/dcim/device.html:129 templates/dcim/modulebay.html:35 +#: templates/dcim/virtualchassis.html:59 +#: templates/dcim/virtualchassis_edit.html:56 +msgid "Position" +msgstr "Должность" + +#: dcim/forms/bulk_create.py:114 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of names being " +"created.)" +msgstr "" +"Поддерживаются алфавитно-цифровые диапазоны. (Должно совпадать с количеством" +" создаваемых имен.)" + +#: dcim/forms/bulk_edit.py:115 dcim/forms/bulk_import.py:99 +#: dcim/forms/model_forms.py:120 dcim/tables/sites.py:89 +#: ipam/filtersets.py:936 ipam/forms/bulk_edit.py:528 +#: ipam/forms/bulk_import.py:444 ipam/forms/model_forms.py:509 +#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 +#: templates/dcim/interface.html:294 templates/dcim/site.html:37 +#: templates/ipam/inc/panels/fhrp_groups.html:10 templates/ipam/vlan.html:30 +#: templates/tenancy/contact.html:22 templates/tenancy/tenant.html:21 +#: templates/users/group.html:6 templates/users/group.html:14 +#: templates/virtualization/cluster.html:32 templates/vpn/tunnel.html:30 +#: templates/wireless/wirelesslan.html:19 tenancy/forms/bulk_edit.py:42 +#: tenancy/forms/bulk_edit.py:93 tenancy/forms/bulk_import.py:40 +#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:47 +#: tenancy/forms/filtersets.py:77 tenancy/forms/filtersets.py:96 +#: tenancy/forms/model_forms.py:46 tenancy/forms/model_forms.py:102 +#: tenancy/forms/model_forms.py:124 tenancy/tables/contacts.py:60 +#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 +#: users/filtersets.py:42 users/filtersets.py:145 users/forms/filtersets.py:32 +#: users/forms/filtersets.py:38 users/forms/filtersets.py:80 +#: virtualization/forms/bulk_edit.py:64 virtualization/forms/bulk_import.py:47 +#: virtualization/forms/filtersets.py:84 +#: virtualization/forms/model_forms.py:69 virtualization/tables/clusters.py:70 +#: vpn/forms/bulk_edit.py:111 vpn/forms/bulk_import.py:157 +#: vpn/forms/filtersets.py:113 vpn/tables/crypto.py:31 +#: wireless/forms/bulk_edit.py:47 wireless/forms/bulk_import.py:36 +#: wireless/forms/filtersets.py:45 wireless/forms/model_forms.py:41 +#: wireless/tables/wirelesslan.py:48 +msgid "Group" +msgstr "Группа" + +#: dcim/forms/bulk_edit.py:130 +msgid "Contact name" +msgstr "Имя контактного лица" + +#: dcim/forms/bulk_edit.py:135 +msgid "Contact phone" +msgstr "Контактный телефон" + +#: dcim/forms/bulk_edit.py:141 +msgid "Contact E-mail" +msgstr "Контактный адрес электронной почты" + +#: dcim/forms/bulk_edit.py:144 dcim/forms/bulk_import.py:122 +#: dcim/forms/model_forms.py:131 +msgid "Time zone" +msgstr "Часовой пояс" + +#: dcim/forms/bulk_edit.py:266 dcim/forms/bulk_edit.py:1152 +#: dcim/forms/bulk_edit.py:1539 dcim/forms/bulk_import.py:199 +#: dcim/forms/bulk_import.py:1009 dcim/forms/filtersets.py:299 +#: dcim/forms/filtersets.py:704 dcim/forms/filtersets.py:1417 +#: dcim/forms/model_forms.py:224 dcim/forms/model_forms.py:963 +#: dcim/forms/model_forms.py:1304 dcim/forms/object_import.py:186 +#: dcim/tables/devices.py:202 dcim/tables/devices.py:828 +#: dcim/tables/devices.py:939 dcim/tables/devicetypes.py:300 +#: dcim/tables/racks.py:69 extras/filtersets.py:457 +#: ipam/forms/bulk_edit.py:245 ipam/forms/bulk_edit.py:294 +#: ipam/forms/bulk_edit.py:342 ipam/forms/bulk_edit.py:546 +#: ipam/forms/bulk_import.py:196 ipam/forms/bulk_import.py:261 +#: ipam/forms/bulk_import.py:297 ipam/forms/bulk_import.py:463 +#: ipam/forms/filtersets.py:232 ipam/forms/filtersets.py:278 +#: ipam/forms/filtersets.py:346 ipam/forms/filtersets.py:490 +#: ipam/forms/model_forms.py:187 ipam/forms/model_forms.py:222 +#: ipam/forms/model_forms.py:249 ipam/forms/model_forms.py:647 +#: ipam/tables/ip.py:257 ipam/tables/ip.py:313 ipam/tables/ip.py:363 +#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:230 +#: templates/dcim/device.html:187 +#: templates/dcim/inc/panels/inventory_items.html:12 +#: templates/dcim/interface.html:231 templates/dcim/inventoryitem.html:37 +#: templates/dcim/rack.html:50 templates/ipam/ipaddress.html:44 +#: templates/ipam/iprange.html:53 templates/ipam/prefix.html:78 +#: templates/ipam/role.html:20 templates/ipam/vlan.html:55 +#: templates/virtualization/virtualmachine.html:26 +#: templates/vpn/tunneltermination.html:18 +#: templates/wireless/inc/wirelesslink_interface.html:20 +#: tenancy/forms/bulk_edit.py:141 tenancy/forms/filtersets.py:106 +#: tenancy/forms/model_forms.py:139 tenancy/tables/contacts.py:102 +#: virtualization/forms/bulk_edit.py:144 +#: virtualization/forms/bulk_import.py:106 +#: virtualization/forms/filtersets.py:153 +#: virtualization/forms/model_forms.py:198 +#: virtualization/tables/virtualmachines.py:65 vpn/forms/bulk_edit.py:86 +#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:84 +#: vpn/forms/model_forms.py:77 vpn/forms/model_forms.py:112 +#: vpn/tables/tunnels.py:78 +msgid "Role" +msgstr "Роль" + +#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:605 +#: dcim/forms/bulk_edit.py:654 templates/dcim/device.html:106 +#: templates/dcim/module.html:75 templates/dcim/modulebay.html:69 +#: templates/dcim/rack.html:58 +msgid "Serial Number" +msgstr "Серийный номер" + +#: dcim/forms/bulk_edit.py:276 dcim/forms/filtersets.py:306 +#: dcim/forms/filtersets.py:740 dcim/forms/filtersets.py:880 +#: dcim/forms/filtersets.py:1430 +msgid "Asset tag" +msgstr "Тег актива" + +#: dcim/forms/bulk_edit.py:286 dcim/forms/bulk_import.py:212 +#: dcim/forms/filtersets.py:291 templates/dcim/rack.html:91 +#: templates/dcim/rack_edit.html:48 +msgid "Width" +msgstr "Ширина" + +#: dcim/forms/bulk_edit.py:292 +msgid "Height (U)" +msgstr "Высота (U)" + +#: dcim/forms/bulk_edit.py:297 +msgid "Descending units" +msgstr "Единицы по убыванию" + +#: dcim/forms/bulk_edit.py:300 +msgid "Outer width" +msgstr "Наружная ширина" + +#: dcim/forms/bulk_edit.py:305 +msgid "Outer depth" +msgstr "Внешняя глубина" + +#: dcim/forms/bulk_edit.py:310 dcim/forms/bulk_import.py:217 +msgid "Outer unit" +msgstr "Внешний блок" + +#: dcim/forms/bulk_edit.py:315 +msgid "Mounting depth" +msgstr "Глубина крепления" + +#: dcim/forms/bulk_edit.py:320 dcim/forms/bulk_edit.py:349 +#: dcim/forms/bulk_edit.py:434 dcim/forms/bulk_edit.py:457 +#: dcim/forms/bulk_edit.py:473 dcim/forms/bulk_edit.py:493 +#: dcim/forms/bulk_import.py:324 dcim/forms/bulk_import.py:350 +#: dcim/forms/filtersets.py:250 dcim/forms/filtersets.py:311 +#: dcim/forms/filtersets.py:335 dcim/forms/filtersets.py:423 +#: dcim/forms/filtersets.py:529 dcim/forms/filtersets.py:548 +#: dcim/forms/filtersets.py:605 dcim/forms/model_forms.py:337 +#: dcim/tables/devicetypes.py:103 dcim/tables/modules.py:35 +#: dcim/tables/racks.py:103 extras/forms/bulk_edit.py:45 +#: extras/forms/bulk_edit.py:107 extras/forms/bulk_edit.py:157 +#: extras/forms/bulk_edit.py:277 extras/forms/filtersets.py:60 +#: extras/forms/filtersets.py:133 extras/forms/filtersets.py:220 +#: ipam/forms/bulk_edit.py:187 templates/dcim/device.html:329 +#: templates/dcim/devicetype.html:52 templates/dcim/moduletype.html:31 +#: templates/dcim/rack_edit.html:60 templates/dcim/rack_edit.html:63 +#: templates/extras/configcontext.html:18 templates/extras/customlink.html:26 +#: templates/extras/savedfilter.html:34 templates/ipam/role.html:33 +msgid "Weight" +msgstr "Вес" + +#: dcim/forms/bulk_edit.py:325 dcim/forms/filtersets.py:316 +msgid "Max weight" +msgstr "Максимальный вес" + +#: dcim/forms/bulk_edit.py:330 dcim/forms/bulk_edit.py:439 +#: dcim/forms/bulk_edit.py:478 dcim/forms/bulk_import.py:223 +#: dcim/forms/bulk_import.py:329 dcim/forms/bulk_import.py:355 +#: dcim/forms/filtersets.py:321 dcim/forms/filtersets.py:533 +#: dcim/forms/filtersets.py:609 +msgid "Weight unit" +msgstr "Весовая единица" + +#: dcim/forms/bulk_edit.py:344 dcim/forms/bulk_edit.py:800 +#: dcim/forms/bulk_import.py:262 dcim/forms/bulk_import.py:265 +#: dcim/forms/bulk_import.py:490 dcim/forms/bulk_import.py:1286 +#: dcim/forms/bulk_import.py:1290 dcim/forms/filtersets.py:101 +#: dcim/forms/filtersets.py:339 dcim/forms/filtersets.py:353 +#: dcim/forms/filtersets.py:391 dcim/forms/filtersets.py:699 +#: dcim/forms/filtersets.py:948 dcim/forms/filtersets.py:1080 +#: dcim/forms/model_forms.py:241 dcim/forms/model_forms.py:413 +#: dcim/forms/model_forms.py:662 dcim/forms/object_create.py:399 +#: dcim/tables/devices.py:194 dcim/tables/power.py:70 dcim/tables/racks.py:148 +#: ipam/forms/bulk_edit.py:464 ipam/forms/filtersets.py:427 +#: ipam/forms/model_forms.py:571 templates/dcim/device.html:30 +#: templates/dcim/inc/cable_termination.html:16 +#: templates/dcim/powerfeed.html:31 templates/dcim/rack.html:14 +#: templates/dcim/rack/base.html:4 templates/dcim/rack_edit.html:8 +#: templates/dcim/rackreservation.html:20 +#: templates/dcim/rackreservation.html:39 +#: virtualization/forms/model_forms.py:116 +msgid "Rack" +msgstr "Стеллаж" + +#: dcim/forms/bulk_edit.py:346 dcim/forms/bulk_edit.py:623 +#: dcim/forms/filtersets.py:247 dcim/forms/filtersets.py:332 +#: dcim/forms/filtersets.py:417 dcim/forms/filtersets.py:543 +#: dcim/forms/filtersets.py:652 dcim/forms/filtersets.py:853 +#: dcim/forms/model_forms.py:589 dcim/forms/model_forms.py:1374 +#: templates/dcim/device_edit.html:20 +#: templates/dcim/inventoryitem_edit.html:23 +msgid "Hardware" +msgstr "аппаратное обеспечение" + +#: dcim/forms/bulk_edit.py:400 dcim/forms/bulk_edit.py:464 +#: dcim/forms/bulk_edit.py:528 dcim/forms/bulk_edit.py:552 +#: dcim/forms/bulk_edit.py:633 dcim/forms/bulk_edit.py:1157 +#: dcim/forms/bulk_edit.py:1544 dcim/forms/bulk_import.py:311 +#: dcim/forms/bulk_import.py:345 dcim/forms/bulk_import.py:387 +#: dcim/forms/bulk_import.py:423 dcim/forms/bulk_import.py:1015 +#: dcim/forms/filtersets.py:429 dcim/forms/filtersets.py:554 +#: dcim/forms/filtersets.py:631 dcim/forms/filtersets.py:709 +#: dcim/forms/filtersets.py:858 dcim/forms/filtersets.py:1423 +#: dcim/forms/model_forms.py:274 dcim/forms/model_forms.py:288 +#: dcim/forms/model_forms.py:330 dcim/forms/model_forms.py:370 +#: dcim/forms/model_forms.py:968 dcim/forms/model_forms.py:1309 +#: dcim/forms/object_import.py:192 dcim/tables/devices.py:129 +#: dcim/tables/devices.py:205 dcim/tables/devices.py:942 +#: dcim/tables/devicetypes.py:81 dcim/tables/devicetypes.py:304 +#: dcim/tables/modules.py:20 dcim/tables/modules.py:60 +#: templates/dcim/devicetype.html:17 templates/dcim/inventoryitem.html:45 +#: templates/dcim/manufacturer.html:34 templates/dcim/modulebay.html:61 +#: templates/dcim/moduletype.html:15 templates/dcim/platform.html:40 +msgid "Manufacturer" +msgstr "Изготовитель" + +#: dcim/forms/bulk_edit.py:405 dcim/forms/bulk_import.py:317 +#: dcim/forms/filtersets.py:434 dcim/forms/model_forms.py:292 +msgid "Default platform" +msgstr "Платформа по умолчанию" + +#: dcim/forms/bulk_edit.py:410 dcim/forms/bulk_edit.py:469 +#: dcim/forms/filtersets.py:437 dcim/forms/filtersets.py:558 +msgid "Part number" +msgstr "номер детали" + +#: dcim/forms/bulk_edit.py:414 +msgid "U height" +msgstr "Высота U" + +#: dcim/forms/bulk_edit.py:426 +msgid "Exclude from utilization" +msgstr "Исключить из использования" + +#: dcim/forms/bulk_edit.py:429 dcim/forms/bulk_edit.py:598 +#: dcim/forms/bulk_import.py:517 dcim/forms/filtersets.py:446 +#: dcim/forms/filtersets.py:731 templates/dcim/device.html:100 +#: templates/dcim/devicetype.html:68 +msgid "Airflow" +msgstr "Воздушный поток" + +#: dcim/forms/bulk_edit.py:453 dcim/forms/model_forms.py:303 +#: dcim/tables/devicetypes.py:78 templates/dcim/device.html:90 +#: templates/dcim/devicebay.html:59 templates/dcim/module.html:59 +msgid "Device Type" +msgstr "Тип устройства" + +#: dcim/forms/bulk_edit.py:492 dcim/forms/model_forms.py:336 +#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 +#: templates/dcim/module.html:63 templates/dcim/modulebay.html:65 +#: templates/dcim/moduletype.html:11 +msgid "Module Type" +msgstr "Тип модуля" + +#: dcim/forms/bulk_edit.py:506 dcim/models/devices.py:472 +msgid "VM role" +msgstr "Роль виртуальной машины" + +#: dcim/forms/bulk_edit.py:509 dcim/forms/bulk_edit.py:533 +#: dcim/forms/bulk_edit.py:613 dcim/forms/bulk_import.py:368 +#: dcim/forms/bulk_import.py:372 dcim/forms/bulk_import.py:394 +#: dcim/forms/bulk_import.py:398 dcim/forms/bulk_import.py:523 +#: dcim/forms/bulk_import.py:527 dcim/forms/filtersets.py:620 +#: dcim/forms/filtersets.py:636 dcim/forms/filtersets.py:750 +#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:375 +#: dcim/forms/model_forms.py:477 virtualization/forms/bulk_import.py:132 +#: virtualization/forms/bulk_import.py:133 +#: virtualization/forms/filtersets.py:180 +#: virtualization/forms/model_forms.py:218 +msgid "Config template" +msgstr "Шаблон конфигурации" + +#: dcim/forms/bulk_edit.py:557 dcim/forms/bulk_edit.py:951 +#: dcim/forms/bulk_import.py:429 dcim/forms/filtersets.py:111 +#: dcim/forms/model_forms.py:435 dcim/forms/model_forms.py:776 +#: dcim/forms/model_forms.py:790 extras/filtersets.py:452 +msgid "Device type" +msgstr "Тип устройства" + +#: dcim/forms/bulk_edit.py:565 dcim/forms/bulk_import.py:410 +#: dcim/forms/filtersets.py:116 dcim/forms/model_forms.py:440 +msgid "Device role" +msgstr "Роль устройства" + +#: dcim/forms/bulk_edit.py:588 dcim/forms/bulk_import.py:435 +#: dcim/forms/filtersets.py:723 dcim/forms/model_forms.py:385 +#: dcim/forms/model_forms.py:444 extras/filtersets.py:468 +#: templates/dcim/device.html:191 templates/dcim/platform.html:27 +#: templates/virtualization/virtualmachine.html:30 +#: virtualization/forms/bulk_edit.py:159 +#: virtualization/forms/bulk_import.py:122 +#: virtualization/forms/filtersets.py:164 +#: virtualization/forms/model_forms.py:206 +msgid "Platform" +msgstr "Платформа" + +#: dcim/forms/bulk_edit.py:621 dcim/forms/bulk_edit.py:1171 +#: dcim/forms/bulk_edit.py:1534 dcim/forms/bulk_edit.py:1580 +#: dcim/forms/bulk_import.py:578 dcim/forms/bulk_import.py:640 +#: dcim/forms/bulk_import.py:666 dcim/forms/bulk_import.py:692 +#: dcim/forms/bulk_import.py:712 dcim/forms/bulk_import.py:765 +#: dcim/forms/bulk_import.py:879 dcim/forms/bulk_import.py:927 +#: dcim/forms/bulk_import.py:944 dcim/forms/bulk_import.py:956 +#: dcim/forms/bulk_import.py:1004 dcim/forms/bulk_import.py:1350 +#: dcim/forms/connections.py:23 dcim/forms/filtersets.py:128 +#: dcim/forms/filtersets.py:831 dcim/forms/filtersets.py:964 +#: dcim/forms/filtersets.py:1154 dcim/forms/filtersets.py:1176 +#: dcim/forms/filtersets.py:1198 dcim/forms/filtersets.py:1215 +#: dcim/forms/filtersets.py:1235 dcim/forms/filtersets.py:1343 +#: dcim/forms/filtersets.py:1365 dcim/forms/filtersets.py:1386 +#: dcim/forms/filtersets.py:1401 dcim/forms/filtersets.py:1412 +#: dcim/forms/filtersets.py:1476 dcim/forms/filtersets.py:1500 +#: dcim/forms/filtersets.py:1524 dcim/forms/model_forms.py:555 +#: dcim/forms/model_forms.py:753 dcim/forms/model_forms.py:1004 +#: dcim/forms/model_forms.py:1453 dcim/forms/object_create.py:256 +#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 +#: dcim/tables/connections.py:60 dcim/tables/devices.py:314 +#: dcim/tables/devices.py:374 dcim/tables/devices.py:418 +#: dcim/tables/devices.py:463 dcim/tables/devices.py:517 +#: dcim/tables/devices.py:609 dcim/tables/devices.py:710 +#: dcim/tables/devices.py:770 dcim/tables/devices.py:820 +#: dcim/tables/devices.py:880 dcim/tables/devices.py:932 +#: dcim/tables/devices.py:1058 dcim/tables/modules.py:52 +#: extras/forms/filtersets.py:329 ipam/forms/bulk_import.py:303 +#: ipam/forms/bulk_import.py:489 ipam/forms/filtersets.py:532 +#: ipam/forms/model_forms.py:685 ipam/tables/vlans.py:176 +#: templates/dcim/consoleport.html:23 templates/dcim/consoleserverport.html:23 +#: templates/dcim/device.html:14 templates/dcim/device.html:128 +#: templates/dcim/device_edit.html:10 templates/dcim/devicebay.html:23 +#: templates/dcim/devicebay.html:55 templates/dcim/frontport.html:23 +#: templates/dcim/interface.html:31 templates/dcim/interface.html:167 +#: templates/dcim/inventoryitem.html:21 templates/dcim/module.html:55 +#: templates/dcim/modulebay.html:21 templates/dcim/poweroutlet.html:23 +#: templates/dcim/powerport.html:23 templates/dcim/rearport.html:23 +#: templates/dcim/virtualchassis.html:58 +#: templates/dcim/virtualchassis_edit.html:52 +#: templates/dcim/virtualdevicecontext.html:25 +#: templates/ipam/ipaddress_edit.html:42 templates/ipam/service_create.html:17 +#: templates/ipam/service_edit.html:16 +#: templates/virtualization/virtualmachine.html:115 +#: templates/vpn/l2vpntermination_edit.html:22 +#: templates/vpn/tunneltermination.html:24 +#: templates/wireless/inc/wirelesslink_interface.html:6 +#: virtualization/filtersets.py:166 virtualization/forms/bulk_edit.py:136 +#: virtualization/forms/bulk_import.py:99 +#: virtualization/forms/filtersets.py:124 +#: virtualization/forms/model_forms.py:188 +#: virtualization/tables/virtualmachines.py:61 vpn/choices.py:44 +#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:278 +#: vpn/forms/filtersets.py:271 vpn/forms/model_forms.py:89 +#: vpn/forms/model_forms.py:124 vpn/forms/model_forms.py:237 +#: wireless/forms/model_forms.py:100 wireless/forms/model_forms.py:140 +#: wireless/tables/wirelesslan.py:75 +msgid "Device" +msgstr "Устройство" + +#: dcim/forms/bulk_edit.py:624 netbox/navigation/menu.py:441 +#: templates/extras/dashboard/widget_config.html:7 +msgid "Configuration" +msgstr "Конфигурация" + +#: dcim/forms/bulk_edit.py:638 dcim/forms/bulk_import.py:590 +#: dcim/forms/model_forms.py:569 dcim/forms/model_forms.py:795 +msgid "Module type" +msgstr "Тип модуля" + +#: dcim/forms/bulk_edit.py:689 dcim/forms/bulk_edit.py:874 +#: dcim/forms/bulk_edit.py:893 dcim/forms/bulk_edit.py:916 +#: dcim/forms/bulk_edit.py:958 dcim/forms/bulk_edit.py:1002 +#: dcim/forms/bulk_edit.py:1053 dcim/forms/bulk_edit.py:1080 +#: dcim/forms/bulk_edit.py:1107 dcim/forms/bulk_edit.py:1125 +#: dcim/forms/bulk_edit.py:1143 dcim/forms/filtersets.py:64 +#: dcim/forms/object_create.py:45 templates/dcim/cable.html:33 +#: templates/dcim/consoleport.html:35 templates/dcim/consoleserverport.html:35 +#: templates/dcim/devicebay.html:31 templates/dcim/frontport.html:35 +#: templates/dcim/inc/panels/inventory_items.html:11 +#: templates/dcim/interface.html:43 templates/dcim/inventoryitem.html:33 +#: templates/dcim/modulebay.html:31 templates/dcim/poweroutlet.html:35 +#: templates/dcim/powerport.html:35 templates/dcim/rearport.html:35 +#: templates/extras/customfield.html:27 templates/generic/bulk_import.html:155 +msgid "Label" +msgstr "Этикетка" + +#: dcim/forms/bulk_edit.py:698 dcim/forms/filtersets.py:981 +#: templates/dcim/cable.html:51 +msgid "Length" +msgstr "Длина" + +#: dcim/forms/bulk_edit.py:703 dcim/forms/bulk_import.py:1158 +#: dcim/forms/bulk_import.py:1161 dcim/forms/filtersets.py:985 +msgid "Length unit" +msgstr "Единица длины" + +#: dcim/forms/bulk_edit.py:727 templates/dcim/virtualchassis.html:24 +msgid "Domain" +msgstr "Домен" + +#: dcim/forms/bulk_edit.py:795 dcim/forms/bulk_import.py:1273 +#: dcim/forms/filtersets.py:1071 dcim/forms/model_forms.py:657 +msgid "Power panel" +msgstr "Панель питания" + +#: dcim/forms/bulk_edit.py:817 dcim/forms/bulk_import.py:1309 +#: dcim/forms/filtersets.py:1093 templates/dcim/powerfeed.html:90 +msgid "Supply" +msgstr "Снабжение" + +#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1314 +#: dcim/forms/filtersets.py:1098 templates/dcim/powerfeed.html:102 +msgid "Phase" +msgstr "Фаза" + +#: dcim/forms/bulk_edit.py:829 dcim/forms/filtersets.py:1103 +#: templates/dcim/powerfeed.html:94 +msgid "Voltage" +msgstr "Напряжение" + +#: dcim/forms/bulk_edit.py:833 dcim/forms/filtersets.py:1107 +#: templates/dcim/powerfeed.html:98 +msgid "Amperage" +msgstr "Сила тока" + +#: dcim/forms/bulk_edit.py:837 dcim/forms/filtersets.py:1111 +msgid "Max utilization" +msgstr "Максимальное использование" + +#: dcim/forms/bulk_edit.py:841 dcim/forms/bulk_edit.py:1200 +#: dcim/forms/bulk_edit.py:1217 dcim/forms/bulk_edit.py:1234 +#: dcim/forms/bulk_edit.py:1252 dcim/forms/bulk_edit.py:1340 +#: dcim/forms/bulk_edit.py:1478 dcim/forms/bulk_edit.py:1495 +msgid "Mark connected" +msgstr "Отметить подключение" + +#: dcim/forms/bulk_edit.py:926 +msgid "Maximum draw" +msgstr "Максимальная ничья" + +#: dcim/forms/bulk_edit.py:929 dcim/models/device_component_templates.py:256 +#: dcim/models/device_components.py:357 +msgid "Maximum power draw (watts)" +msgstr "Максимальная потребляемая мощность (Вт)" + +#: dcim/forms/bulk_edit.py:932 +msgid "Allocated draw" +msgstr "Распределенная ничья" + +#: dcim/forms/bulk_edit.py:935 dcim/models/device_component_templates.py:263 +#: dcim/models/device_components.py:364 +msgid "Allocated power draw (watts)" +msgstr "Распределенная потребляемая мощность (Вт)" + +#: dcim/forms/bulk_edit.py:968 dcim/forms/bulk_import.py:723 +#: dcim/forms/model_forms.py:848 dcim/forms/model_forms.py:1076 +#: dcim/forms/model_forms.py:1361 dcim/forms/object_import.py:60 +msgid "Power port" +msgstr "Порт питания" + +#: dcim/forms/bulk_edit.py:973 +msgid "Feed leg" +msgstr "Кормовая ножка" + +#: dcim/forms/bulk_edit.py:1019 dcim/forms/bulk_edit.py:1325 +msgid "Management only" +msgstr "Только управление" + +#: dcim/forms/bulk_edit.py:1029 dcim/forms/bulk_edit.py:1331 +#: dcim/forms/bulk_import.py:813 dcim/forms/filtersets.py:1294 +#: dcim/forms/object_import.py:95 +#: dcim/models/device_component_templates.py:411 +#: dcim/models/device_components.py:671 +msgid "PoE mode" +msgstr "Режим PoE" + +#: dcim/forms/bulk_edit.py:1035 dcim/forms/bulk_edit.py:1337 +#: dcim/forms/bulk_import.py:819 dcim/forms/filtersets.py:1299 +#: dcim/forms/object_import.py:100 +#: dcim/models/device_component_templates.py:417 +#: dcim/models/device_components.py:677 +msgid "PoE type" +msgstr "Тип PoE" + +#: dcim/forms/bulk_edit.py:1041 dcim/forms/filtersets.py:1304 +#: dcim/forms/object_import.py:105 +msgid "Wireless role" +msgstr "Роль беспроводной связи" + +#: dcim/forms/bulk_edit.py:1178 dcim/forms/model_forms.py:588 +#: dcim/forms/model_forms.py:1019 dcim/tables/devices.py:337 +#: templates/dcim/consoleport.html:27 templates/dcim/consoleserverport.html:27 +#: templates/dcim/frontport.html:27 templates/dcim/interface.html:35 +#: templates/dcim/module.html:51 templates/dcim/modulebay.html:57 +#: templates/dcim/poweroutlet.html:27 templates/dcim/powerport.html:27 +#: templates/dcim/rearport.html:27 +msgid "Module" +msgstr "Модуль" + +#: dcim/forms/bulk_edit.py:1305 dcim/tables/devices.py:680 +#: templates/dcim/interface.html:113 +msgid "LAG" +msgstr "ОТСТАВАТЬ" + +#: dcim/forms/bulk_edit.py:1310 dcim/forms/model_forms.py:1103 +msgid "Virtual device contexts" +msgstr "Контексты виртуальных устройств" + +#: dcim/forms/bulk_edit.py:1316 dcim/forms/bulk_import.py:651 +#: dcim/forms/bulk_import.py:677 dcim/forms/filtersets.py:1163 +#: dcim/forms/filtersets.py:1185 dcim/forms/filtersets.py:1258 +#: dcim/tables/devices.py:621 +#: templates/circuits/inc/circuit_termination.html:94 +#: templates/dcim/consoleport.html:43 templates/dcim/consoleserverport.html:43 +msgid "Speed" +msgstr "Скорость" + +#: dcim/forms/bulk_edit.py:1345 dcim/forms/bulk_import.py:822 +#: templates/vpn/ikepolicy.html:26 templates/vpn/ipsecprofile.html:22 +#: templates/vpn/ipsecprofile.html:51 virtualization/forms/bulk_edit.py:232 +#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:145 +#: vpn/forms/bulk_edit.py:233 vpn/forms/bulk_import.py:175 +#: vpn/forms/bulk_import.py:229 vpn/forms/filtersets.py:132 +#: vpn/forms/filtersets.py:175 vpn/forms/filtersets.py:189 +#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +msgid "Mode" +msgstr "Режим" + +#: dcim/forms/bulk_edit.py:1353 dcim/forms/model_forms.py:1152 +#: ipam/forms/bulk_import.py:177 ipam/forms/filtersets.py:479 +#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:239 +#: virtualization/forms/model_forms.py:324 +msgid "VLAN group" +msgstr "Группа VLAN" + +#: dcim/forms/bulk_edit.py:1361 dcim/forms/model_forms.py:1157 +#: dcim/tables/devices.py:594 virtualization/forms/bulk_edit.py:247 +#: virtualization/forms/model_forms.py:329 +msgid "Untagged VLAN" +msgstr "VLAN без тегов" + +#: dcim/forms/bulk_edit.py:1369 dcim/forms/model_forms.py:1166 +#: dcim/tables/devices.py:600 virtualization/forms/bulk_edit.py:255 +#: virtualization/forms/model_forms.py:338 +msgid "Tagged VLANs" +msgstr "VLAN с тегами" + +#: dcim/forms/bulk_edit.py:1379 dcim/forms/model_forms.py:1139 +msgid "Wireless LAN group" +msgstr "Группа беспроводной локальной сети" + +#: dcim/forms/bulk_edit.py:1384 dcim/forms/model_forms.py:1144 +#: dcim/tables/devices.py:630 netbox/navigation/menu.py:134 +#: templates/dcim/interface.html:289 wireless/tables/wirelesslan.py:24 +msgid "Wireless LANs" +msgstr "Беспроводные локальные сети" + +#: dcim/forms/bulk_edit.py:1393 dcim/forms/filtersets.py:1231 +#: dcim/forms/model_forms.py:1185 ipam/forms/bulk_edit.py:270 +#: ipam/forms/bulk_edit.py:361 ipam/forms/filtersets.py:166 +#: templates/dcim/interface.html:126 templates/ipam/prefix.html:96 +#: virtualization/forms/model_forms.py:352 +msgid "Addressing" +msgstr "Адресация" + +#: dcim/forms/bulk_edit.py:1394 dcim/forms/filtersets.py:651 +#: dcim/forms/model_forms.py:1186 virtualization/forms/model_forms.py:353 +msgid "Operation" +msgstr "Операция" + +#: dcim/forms/bulk_edit.py:1395 dcim/forms/filtersets.py:1232 +#: dcim/forms/model_forms.py:880 dcim/forms/model_forms.py:1188 +msgid "PoE" +msgstr "PoE" + +#: dcim/forms/bulk_edit.py:1396 dcim/forms/model_forms.py:1187 +#: templates/dcim/interface.html:101 virtualization/forms/bulk_edit.py:266 +#: virtualization/forms/model_forms.py:354 +msgid "Related Interfaces" +msgstr "Связанные интерфейсы" + +#: dcim/forms/bulk_edit.py:1397 dcim/forms/model_forms.py:1189 +#: virtualization/forms/bulk_edit.py:267 +#: virtualization/forms/model_forms.py:355 +msgid "802.1Q Switching" +msgstr "Коммутация 802.1Q" + +#: dcim/forms/bulk_edit.py:1458 dcim/forms/bulk_edit.py:1460 +msgid "Interface mode must be specified to assign VLANs" +msgstr "Для назначения VLAN необходимо указать режим интерфейса" + +#: dcim/forms/bulk_edit.py:1465 dcim/forms/common.py:50 +msgid "An access interface cannot have tagged VLANs assigned." +msgstr "Интерфейсу доступа нельзя назначать VLAN с тегами." + +#: dcim/forms/bulk_import.py:63 +msgid "Name of parent region" +msgstr "Название родительского региона" + +#: dcim/forms/bulk_import.py:77 +msgid "Name of parent site group" +msgstr "Имя родительской группы сайтов" + +#: dcim/forms/bulk_import.py:96 +msgid "Assigned region" +msgstr "Назначенный регион" + +#: dcim/forms/bulk_import.py:103 tenancy/forms/bulk_import.py:44 +#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +msgid "Assigned group" +msgstr "Назначенная группа" + +#: dcim/forms/bulk_import.py:122 +msgid "available options" +msgstr "доступные опции" + +#: dcim/forms/bulk_import.py:133 dcim/forms/bulk_import.py:480 +#: dcim/forms/bulk_import.py:1270 ipam/forms/bulk_import.py:174 +#: ipam/forms/bulk_import.py:441 virtualization/forms/bulk_import.py:63 +#: virtualization/forms/bulk_import.py:89 +msgid "Assigned site" +msgstr "Назначенный сайт" + +#: dcim/forms/bulk_import.py:140 +msgid "Parent location" +msgstr "Местонахождение родителей" + +#: dcim/forms/bulk_import.py:142 +msgid "Location not found." +msgstr "Местоположение не найдено." + +#: dcim/forms/bulk_import.py:191 +msgid "Name of assigned tenant" +msgstr "Имя назначенного арендатора" + +#: dcim/forms/bulk_import.py:203 +msgid "Name of assigned role" +msgstr "Название назначенной роли" + +#: dcim/forms/bulk_import.py:209 +msgid "Rack type" +msgstr "Тип стеллажа" + +#: dcim/forms/bulk_import.py:214 +msgid "Rail-to-rail width (in inches)" +msgstr "Ширина от рельса до рельса (в дюймах)" + +#: dcim/forms/bulk_import.py:220 +msgid "Unit for outer dimensions" +msgstr "Единица измерения внешних размеров" + +#: dcim/forms/bulk_import.py:226 +msgid "Unit for rack weights" +msgstr "Устройство для стоечных весов" + +#: dcim/forms/bulk_import.py:252 +msgid "Parent site" +msgstr "Родительский сайт" + +#: dcim/forms/bulk_import.py:259 dcim/forms/bulk_import.py:1283 +msgid "Rack's location (if any)" +msgstr "Местоположение стойки (если есть)" + +#: dcim/forms/bulk_import.py:268 dcim/forms/model_forms.py:246 +#: dcim/tables/racks.py:153 templates/dcim/rackreservation.html:12 +#: templates/dcim/rackreservation.html:52 +msgid "Units" +msgstr "Единицы" + +#: dcim/forms/bulk_import.py:271 +msgid "Comma-separated list of individual unit numbers" +msgstr "Список отдельных номеров объектов, разделенных запятыми" + +#: dcim/forms/bulk_import.py:314 +msgid "The manufacturer which produces this device type" +msgstr "Производитель, выпускающий этот тип устройства" + +#: dcim/forms/bulk_import.py:321 +msgid "The default platform for devices of this type (optional)" +msgstr "Платформа по умолчанию для устройств этого типа (опционально)" + +#: dcim/forms/bulk_import.py:326 +msgid "Device weight" +msgstr "Вес устройства" + +#: dcim/forms/bulk_import.py:332 +msgid "Unit for device weight" +msgstr "Единица измерения веса устройства" + +#: dcim/forms/bulk_import.py:352 +msgid "Module weight" +msgstr "Вес модуля" + +#: dcim/forms/bulk_import.py:358 +msgid "Unit for module weight" +msgstr "Единица измерения веса модуля" + +#: dcim/forms/bulk_import.py:391 +msgid "Limit platform assignments to this manufacturer" +msgstr "Ограничьте назначение платформ этому производителю" + +#: dcim/forms/bulk_import.py:413 tenancy/forms/bulk_import.py:106 +msgid "Assigned role" +msgstr "Назначенная роль" + +#: dcim/forms/bulk_import.py:426 +msgid "Device type manufacturer" +msgstr "Производитель типа устройства" + +#: dcim/forms/bulk_import.py:432 +msgid "Device type model" +msgstr "Тип устройства, модель" + +#: dcim/forms/bulk_import.py:439 virtualization/forms/bulk_import.py:126 +msgid "Assigned platform" +msgstr "Назначенная платформа" + +#: dcim/forms/bulk_import.py:447 dcim/forms/bulk_import.py:451 +#: dcim/forms/model_forms.py:461 +msgid "Virtual chassis" +msgstr "Виртуальное шасси" + +#: dcim/forms/bulk_import.py:454 dcim/forms/model_forms.py:450 +#: dcim/tables/devices.py:231 extras/filtersets.py:501 +#: extras/forms/filtersets.py:330 ipam/forms/bulk_edit.py:478 +#: ipam/forms/model_forms.py:588 templates/dcim/device.html:239 +#: templates/virtualization/cluster.html:11 +#: templates/virtualization/virtualmachine.html:92 +#: templates/virtualization/virtualmachine.html:102 +#: virtualization/filtersets.py:156 virtualization/filtersets.py:271 +#: virtualization/forms/bulk_edit.py:128 +#: virtualization/forms/bulk_import.py:92 +#: virtualization/forms/filtersets.py:98 +#: virtualization/forms/filtersets.py:119 +#: virtualization/forms/filtersets.py:196 +#: virtualization/forms/model_forms.py:82 +#: virtualization/forms/model_forms.py:179 +#: virtualization/tables/virtualmachines.py:57 +msgid "Cluster" +msgstr "Кластер" + +#: dcim/forms/bulk_import.py:458 +msgid "Virtualization cluster" +msgstr "Кластер виртуализации" + +#: dcim/forms/bulk_import.py:487 +msgid "Assigned location (if any)" +msgstr "Назначенное местоположение (если есть)" + +#: dcim/forms/bulk_import.py:494 +msgid "Assigned rack (if any)" +msgstr "Назначенная стойка (если есть)" + +#: dcim/forms/bulk_import.py:497 +msgid "Face" +msgstr "Лицо" + +#: dcim/forms/bulk_import.py:500 +msgid "Mounted rack face" +msgstr "Смонтированная поверхность стойки" + +#: dcim/forms/bulk_import.py:507 +msgid "Parent device (for child devices)" +msgstr "Родительское устройство (для дочерних устройств)" + +#: dcim/forms/bulk_import.py:510 +msgid "Device bay" +msgstr "Отсек для устройств" + +#: dcim/forms/bulk_import.py:514 +msgid "Device bay in which this device is installed (for child devices)" +msgstr "" +"Отсек для устройств, в котором установлено данное устройство (для детских " +"устройств)" + +#: dcim/forms/bulk_import.py:520 +msgid "Airflow direction" +msgstr "Направление воздушного потока" + +#: dcim/forms/bulk_import.py:581 +msgid "The device in which this module is installed" +msgstr "Устройство, в котором установлен данный модуль" + +#: dcim/forms/bulk_import.py:584 dcim/forms/model_forms.py:562 +msgid "Module bay" +msgstr "Отсек для модулей" + +#: dcim/forms/bulk_import.py:587 +msgid "The module bay in which this module is installed" +msgstr "Отсек для модулей, в котором установлен данный модуль" + +#: dcim/forms/bulk_import.py:593 +msgid "The type of module" +msgstr "Тип модуля" + +#: dcim/forms/bulk_import.py:601 dcim/forms/model_forms.py:575 +msgid "Replicate components" +msgstr "Репликация компонентов" + +#: dcim/forms/bulk_import.py:603 +msgid "" +"Automatically populate components associated with this module type (enabled " +"by default)" +msgstr "" +"Автоматическое заполнение компонентов, связанных с этим типом модуля " +"(включено по умолчанию)" + +#: dcim/forms/bulk_import.py:606 dcim/forms/model_forms.py:581 +msgid "Adopt components" +msgstr "Применяйте компоненты" + +#: dcim/forms/bulk_import.py:608 dcim/forms/model_forms.py:584 +msgid "Adopt already existing components" +msgstr "Используйте уже существующие компоненты" + +#: dcim/forms/bulk_import.py:648 dcim/forms/bulk_import.py:674 +#: dcim/forms/bulk_import.py:700 +msgid "Port type" +msgstr "Тип порта" + +#: dcim/forms/bulk_import.py:656 dcim/forms/bulk_import.py:682 +msgid "Port speed in bps" +msgstr "Скорость порта в бит/с" + +#: dcim/forms/bulk_import.py:720 +msgid "Outlet type" +msgstr "Тип розетки" + +#: dcim/forms/bulk_import.py:727 +msgid "Local power port which feeds this outlet" +msgstr "Локальный порт питания, питающий эту розетку" + +#: dcim/forms/bulk_import.py:730 +msgid "Feed lag" +msgstr "Задержка подачи" + +#: dcim/forms/bulk_import.py:733 +msgid "Electrical phase (for three-phase circuits)" +msgstr "Электрическая фаза (для трехфазных цепей)" + +#: dcim/forms/bulk_import.py:774 dcim/forms/model_forms.py:1114 +#: virtualization/forms/bulk_import.py:155 +#: virtualization/forms/model_forms.py:308 +msgid "Parent interface" +msgstr "Родительский интерфейс" + +#: dcim/forms/bulk_import.py:781 dcim/forms/model_forms.py:1122 +#: virtualization/forms/bulk_import.py:162 +#: virtualization/forms/model_forms.py:316 +msgid "Bridged interface" +msgstr "Мостовой интерфейс" + +#: dcim/forms/bulk_import.py:784 +msgid "Lag" +msgstr "Отставание" + +#: dcim/forms/bulk_import.py:788 +msgid "Parent LAG interface" +msgstr "Родительский интерфейс LAG" + +#: dcim/forms/bulk_import.py:791 +msgid "Vdcs" +msgstr "Видеомагнитофоны" + +#: dcim/forms/bulk_import.py:796 +msgid "VDC names separated by commas, encased with double quotes. Example:" +msgstr "Имена VDC разделены запятыми и заключены в двойные кавычки. Пример:" + +#: dcim/forms/bulk_import.py:802 +msgid "Physical medium" +msgstr "Физическая среда" + +#: dcim/forms/bulk_import.py:805 dcim/forms/filtersets.py:1265 +msgid "Duplex" +msgstr "Двухуровневый" + +#: dcim/forms/bulk_import.py:810 +msgid "Poe mode" +msgstr "Режим Poe" + +#: dcim/forms/bulk_import.py:816 +msgid "Poe type" +msgstr "Тип Poe" + +#: dcim/forms/bulk_import.py:825 virtualization/forms/bulk_import.py:168 +msgid "IEEE 802.1Q operational mode (for L2 interfaces)" +msgstr "Рабочий режим IEEE 802.1Q (для интерфейсов L2)" + +#: dcim/forms/bulk_import.py:832 ipam/forms/bulk_import.py:160 +#: ipam/forms/bulk_import.py:246 ipam/forms/bulk_import.py:282 +#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:266 +#: ipam/forms/filtersets.py:322 virtualization/forms/bulk_import.py:175 +msgid "Assigned VRF" +msgstr "Назначенный VRF" + +#: dcim/forms/bulk_import.py:835 +msgid "Rf role" +msgstr "Роль Rf" + +#: dcim/forms/bulk_import.py:838 +msgid "Wireless role (AP/station)" +msgstr "Роль беспроводной сети (точка доступа/станция)" + +#: dcim/forms/bulk_import.py:884 dcim/forms/model_forms.py:893 +#: dcim/forms/model_forms.py:1369 dcim/forms/object_import.py:122 +msgid "Rear port" +msgstr "Задний порт" + +#: dcim/forms/bulk_import.py:887 +msgid "Corresponding rear port" +msgstr "Соответствующий задний порт" + +#: dcim/forms/bulk_import.py:892 dcim/forms/bulk_import.py:933 +#: dcim/forms/bulk_import.py:1148 +msgid "Physical medium classification" +msgstr "Классификация физических сред" + +#: dcim/forms/bulk_import.py:961 dcim/tables/devices.py:841 +msgid "Installed device" +msgstr "Установленное устройство" + +#: dcim/forms/bulk_import.py:965 +msgid "Child device installed within this bay" +msgstr "Детское устройство, установленное в этом отсеке" + +#: dcim/forms/bulk_import.py:967 +msgid "Child device not found." +msgstr "Детское устройство не найдено." + +#: dcim/forms/bulk_import.py:1025 +msgid "Parent inventory item" +msgstr "Предмет родительского инвентаря" + +#: dcim/forms/bulk_import.py:1028 +msgid "Component type" +msgstr "Тип компонента" + +#: dcim/forms/bulk_import.py:1032 +msgid "Component Type" +msgstr "Тип компонента" + +#: dcim/forms/bulk_import.py:1035 +msgid "Compnent name" +msgstr "Имя компонента" + +#: dcim/forms/bulk_import.py:1037 +msgid "Component Name" +msgstr "Имя компонента" + +#: dcim/forms/bulk_import.py:1103 +msgid "Side A device" +msgstr "Устройство на стороне А" + +#: dcim/forms/bulk_import.py:1106 dcim/forms/bulk_import.py:1124 +msgid "Device name" +msgstr "Имя устройства" + +#: dcim/forms/bulk_import.py:1109 +msgid "Side A type" +msgstr "Сторона типа А" + +#: dcim/forms/bulk_import.py:1112 dcim/forms/bulk_import.py:1130 +msgid "Termination type" +msgstr "Тип прекращения" + +#: dcim/forms/bulk_import.py:1115 +msgid "Side A name" +msgstr "Название стороны А" + +#: dcim/forms/bulk_import.py:1116 dcim/forms/bulk_import.py:1134 +msgid "Termination name" +msgstr "Название увольнения" + +#: dcim/forms/bulk_import.py:1121 +msgid "Side B device" +msgstr "Устройство на стороне B" + +#: dcim/forms/bulk_import.py:1127 +msgid "Side B type" +msgstr "Тип стороны B" + +#: dcim/forms/bulk_import.py:1133 +msgid "Side B name" +msgstr "Название стороны B" + +#: dcim/forms/bulk_import.py:1142 wireless/forms/bulk_import.py:86 +msgid "Connection status" +msgstr "Состояние подключения" + +#: dcim/forms/bulk_import.py:1221 dcim/forms/model_forms.py:689 +#: dcim/tables/devices.py:1028 templates/dcim/device.html:130 +#: templates/dcim/virtualchassis.html:28 templates/dcim/virtualchassis.html:60 +msgid "Master" +msgstr "Мастер" + +#: dcim/forms/bulk_import.py:1225 +msgid "Master device" +msgstr "Мастер-устройство" + +#: dcim/forms/bulk_import.py:1242 +msgid "Name of parent site" +msgstr "Название родительского сайта" + +#: dcim/forms/bulk_import.py:1276 +msgid "Upstream power panel" +msgstr "Панель питания в восходящем направлении" + +#: dcim/forms/bulk_import.py:1306 +msgid "Primary or redundant" +msgstr "Основное или резервное" + +#: dcim/forms/bulk_import.py:1311 +msgid "Supply type (AC/DC)" +msgstr "Тип питания (AC/DC)" + +#: dcim/forms/bulk_import.py:1316 +msgid "Single or three-phase" +msgstr "Однофазный или трехфазный" + +#: dcim/forms/common.py:24 dcim/models/device_components.py:528 +#: templates/dcim/interface.html:58 +#: templates/virtualization/vminterface.html:58 +#: virtualization/forms/bulk_edit.py:224 +msgid "MTU" +msgstr "МАТУ" + +#: dcim/forms/common.py:65 +#, python-brace-format +msgid "" +"The tagged VLANs ({vlans}) must belong to the same site as the interface's " +"parent device/VM, or they must be global" +msgstr "" +"VLAN с тегами ({vlans}) должны принадлежать тому же сайту, что и " +"родительское устройство/виртуальная машина интерфейса, или они должны быть " +"глобальными" + +#: dcim/forms/common.py:110 +msgid "" +"Cannot install module with placeholder values in a module bay with no " +"position defined." +msgstr "" +"Невозможно установить модуль со значениями-заполнителями в модульном отсеке " +"без определенного положения." + +#: dcim/forms/common.py:119 +#, python-brace-format +msgid "Cannot adopt {model} {name} as it already belongs to a module" +msgstr "" +"Невозможно усыновить {model} {name} поскольку оно уже принадлежит модулю" + +#: dcim/forms/common.py:128 +#, python-brace-format +msgid "A {model} named {name} already exists" +msgstr "A {model} названный {name} уже существует" + +#: dcim/forms/connections.py:45 dcim/tables/power.py:66 +#: templates/dcim/inc/cable_termination.html:37 +#: templates/dcim/powerfeed.html:27 templates/dcim/powerpanel.html:19 +#: templates/dcim/trace/powerpanel.html:4 +msgid "Power Panel" +msgstr "Панель питания" + +#: dcim/forms/connections.py:54 dcim/forms/model_forms.py:670 +#: templates/dcim/powerfeed.html:22 templates/dcim/powerport.html:84 +msgid "Power Feed" +msgstr "Подача питания" + +#: dcim/forms/connections.py:74 +msgid "Side" +msgstr "Сторона" + +#: dcim/forms/filtersets.py:141 +msgid "Parent region" +msgstr "Родительский регион" + +#: dcim/forms/filtersets.py:155 tenancy/forms/bulk_import.py:28 +#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:32 +#: tenancy/forms/filtersets.py:61 wireless/forms/bulk_import.py:25 +#: wireless/forms/filtersets.py:24 +msgid "Parent group" +msgstr "Родительская группа" + +#: dcim/forms/filtersets.py:246 dcim/forms/filtersets.py:331 +msgid "Function" +msgstr "Функция" + +#: dcim/forms/filtersets.py:418 dcim/forms/model_forms.py:308 +#: templates/inc/panels/image_attachments.html:5 +msgid "Images" +msgstr "Изображения" + +#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:544 +#: dcim/forms/filtersets.py:655 +msgid "Components" +msgstr "Компоненты" + +#: dcim/forms/filtersets.py:441 +msgid "Subdevice role" +msgstr "Роль подустройства" + +#: dcim/forms/filtersets.py:717 +msgid "Model" +msgstr "модель" + +#: dcim/forms/filtersets.py:768 +msgid "Virtual chassis member" +msgstr "Элемент виртуального шасси" + +#: dcim/forms/filtersets.py:1123 +msgid "Cabled" +msgstr "Кабельный" + +#: dcim/forms/filtersets.py:1130 +msgid "Occupied" +msgstr "Оккупированный" + +#: dcim/forms/filtersets.py:1155 dcim/forms/filtersets.py:1177 +#: dcim/forms/filtersets.py:1199 dcim/forms/filtersets.py:1216 +#: dcim/forms/filtersets.py:1236 dcim/tables/devices.py:367 +#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:59 +#: templates/dcim/frontport.html:74 templates/dcim/interface.html:146 +#: templates/dcim/powerfeed.html:118 templates/dcim/poweroutlet.html:63 +#: templates/dcim/powerport.html:63 templates/dcim/rearport.html:70 +msgid "Connection" +msgstr "Подключение" + +#: dcim/forms/filtersets.py:1245 dcim/forms/model_forms.py:1477 +#: templates/dcim/virtualdevicecontext.html:16 +msgid "Virtual Device Context" +msgstr "Контекст виртуального устройства" + +#: dcim/forms/filtersets.py:1248 extras/forms/bulk_edit.py:315 +#: extras/forms/bulk_import.py:239 extras/forms/filtersets.py:479 +#: extras/forms/model_forms.py:548 extras/tables/tables.py:482 +#: templates/extras/journalentry.html:33 +msgid "Kind" +msgstr "Добрый" + +#: dcim/forms/filtersets.py:1277 +msgid "Mgmt only" +msgstr "Только менеджмент" + +#: dcim/forms/filtersets.py:1289 dcim/forms/model_forms.py:1180 +#: dcim/models/device_components.py:630 templates/dcim/interface.html:134 +msgid "WWN" +msgstr "ЛЕБЕДЬ" + +#: dcim/forms/filtersets.py:1309 +msgid "Wireless channel" +msgstr "Беспроводной канал" + +#: dcim/forms/filtersets.py:1313 +msgid "Channel frequency (MHz)" +msgstr "Частота канала (МГц)" + +#: dcim/forms/filtersets.py:1317 +msgid "Channel width (MHz)" +msgstr "Ширина канала (МГц)" + +#: dcim/forms/filtersets.py:1321 templates/dcim/interface.html:86 +msgid "Transmit power (dBm)" +msgstr "Мощность передачи (дБм)" + +#: dcim/forms/filtersets.py:1344 dcim/forms/filtersets.py:1366 +#: dcim/tables/devices.py:344 templates/dcim/cable.html:12 +#: templates/dcim/cable_edit.html:46 templates/dcim/cable_trace.html:43 +#: templates/dcim/frontport.html:84 +#: templates/dcim/inc/connection_endpoints.html:4 +#: templates/dcim/rearport.html:80 templates/dcim/trace/cable.html:7 +msgid "Cable" +msgstr "Кабель" + +#: dcim/forms/filtersets.py:1434 dcim/tables/devices.py:951 +msgid "Discovered" +msgstr "Обнаружено" + +#: dcim/forms/formsets.py:20 +#, python-brace-format +msgid "A virtual chassis member already exists in position {vc_position}." +msgstr "Виртуальный элемент шасси уже находится на месте {vc_position}." + +#: dcim/forms/model_forms.py:101 dcim/tables/devices.py:183 +#: templates/dcim/sitegroup.html:26 +msgid "Site Group" +msgstr "Группа сайтов" + +#: dcim/forms/model_forms.py:142 +msgid "Contact Info" +msgstr "Контактная информация" + +#: dcim/forms/model_forms.py:197 templates/dcim/rackrole.html:20 +msgid "Rack Role" +msgstr "Роль стойки" + +#: dcim/forms/model_forms.py:248 +msgid "" +"Comma-separated list of numeric unit IDs. A range may be specified using a " +"hyphen." +msgstr "" +"Список идентификаторов числовых единиц, разделенных запятыми. Диапазон можно" +" указать с помощью дефиса." + +#: dcim/forms/model_forms.py:259 dcim/tables/racks.py:133 +msgid "Reservation" +msgstr "Резервирование" + +#: dcim/forms/model_forms.py:297 dcim/forms/model_forms.py:380 +#: utilities/forms/fields/fields.py:47 +msgid "Slug" +msgstr "Пуля" + +#: dcim/forms/model_forms.py:304 templates/dcim/devicetype.html:12 +msgid "Chassis" +msgstr "Шасси" + +#: dcim/forms/model_forms.py:356 templates/dcim/devicerole.html:24 +msgid "Device Role" +msgstr "Роль устройства" + +#: dcim/forms/model_forms.py:424 dcim/models/devices.py:632 +msgid "The lowest-numbered unit occupied by the device" +msgstr "Устройство с наименьшим номером, занимаемое устройством" + +#: dcim/forms/model_forms.py:469 +msgid "The position in the virtual chassis this device is identified by" +msgstr "Положение в виртуальном корпусе этого устройства определяется по" + +#: dcim/forms/model_forms.py:473 templates/dcim/device.html:131 +#: templates/dcim/virtualchassis.html:61 +#: templates/dcim/virtualchassis_edit.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:13 +#: tenancy/forms/bulk_edit.py:146 tenancy/forms/filtersets.py:109 +msgid "Priority" +msgstr "Приоритет" + +#: dcim/forms/model_forms.py:474 +msgid "The priority of the device in the virtual chassis" +msgstr "Приоритет устройства в виртуальном шасси" + +#: dcim/forms/model_forms.py:578 +msgid "Automatically populate components associated with this module type" +msgstr "Автоматическое заполнение компонентов, связанных с этим типом модуля" + +#: dcim/forms/model_forms.py:623 +msgid "Maximum length is 32767 (any unit)" +msgstr "Максимальная длина 32767 (любая единица измерения)" + +#: dcim/forms/model_forms.py:671 +msgid "Characteristics" +msgstr "Характеристики" + +#: dcim/forms/model_forms.py:1130 +msgid "LAG interface" +msgstr "Интерфейс LAG" + +#: dcim/forms/model_forms.py:1184 dcim/forms/model_forms.py:1345 +#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:317 +#: ipam/forms/model_forms.py:270 ipam/forms/model_forms.py:279 +#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:368 ipam/tables/vlans.py:165 +#: templates/circuits/inc/circuit_termination.html:78 +#: templates/dcim/frontport.html:113 templates/dcim/interface.html:27 +#: templates/dcim/interface.html:190 templates/dcim/interface.html:322 +#: templates/dcim/inventoryitem_edit.html:54 templates/dcim/rearport.html:109 +#: templates/ipam/fhrpgroupassignment_edit.html:11 +#: templates/virtualization/vminterface.html:19 +#: templates/vpn/tunneltermination.html:32 +#: templates/wireless/inc/wirelesslink_interface.html:10 +#: templates/wireless/wirelesslink.html:10 +#: templates/wireless/wirelesslink.html:49 +#: virtualization/forms/model_forms.py:351 vpn/forms/bulk_import.py:292 +#: vpn/forms/model_forms.py:94 vpn/forms/model_forms.py:129 +#: vpn/forms/model_forms.py:241 vpn/forms/model_forms.py:430 +#: vpn/forms/model_forms.py:439 vpn/tables/tunnels.py:87 +#: wireless/forms/model_forms.py:112 wireless/forms/model_forms.py:152 +msgid "Interface" +msgstr "Интерфейс" + +#: dcim/forms/model_forms.py:1278 +msgid "Child Device" +msgstr "Детское устройство" + +#: dcim/forms/model_forms.py:1279 +msgid "" +"Child devices must first be created and assigned to the site and rack of the" +" parent device." +msgstr "" +"Сначала необходимо создать дочерние устройства и назначить их сайту и стойке" +" родительского устройства." + +#: dcim/forms/model_forms.py:1321 +msgid "Console port" +msgstr "Консольный порт" + +#: dcim/forms/model_forms.py:1329 +msgid "Console server port" +msgstr "Порт консольного сервера" + +#: dcim/forms/model_forms.py:1337 +msgid "Front port" +msgstr "Передний порт" + +#: dcim/forms/model_forms.py:1353 +msgid "Power outlet" +msgstr "Розетка питания" + +#: dcim/forms/model_forms.py:1373 templates/dcim/inventoryitem.html:17 +#: templates/dcim/inventoryitem_edit.html:10 +msgid "Inventory Item" +msgstr "Предмет инвентаря" + +#: dcim/forms/model_forms.py:1425 +msgid "An InventoryItem can only be assigned to a single component." +msgstr "InventoryItem можно присвоить только одному компоненту." + +#: dcim/forms/model_forms.py:1439 templates/dcim/inventoryitemrole.html:15 +msgid "Inventory Item Role" +msgstr "Роль инвентарного предмета" + +#: dcim/forms/model_forms.py:1459 templates/dcim/device.html:195 +#: templates/dcim/virtualdevicecontext.html:33 +#: templates/virtualization/virtualmachine.html:51 +msgid "Primary IPv4" +msgstr "Основной IPv4" + +#: dcim/forms/model_forms.py:1468 templates/dcim/device.html:211 +#: templates/dcim/virtualdevicecontext.html:44 +#: templates/virtualization/virtualmachine.html:67 +msgid "Primary IPv6" +msgstr "Основной IPv6" + +#: dcim/forms/object_create.py:47 dcim/forms/object_create.py:198 +#: dcim/forms/object_create.py:354 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of objects being " +"created.)" +msgstr "" +"Поддерживаются алфавитно-цифровые диапазоны. (Количество создаваемых " +"объектов должно соответствовать количеству создаваемых объектов.)" + +#: dcim/forms/object_create.py:67 +#, python-brace-format +msgid "" +"The provided pattern specifies {value_count} values, but {pattern_count} are" +" expected." +msgstr "" +"Предоставленный шаблон определяет {value_count} ценности, но {pattern_count}" +" ожидаются." + +#: dcim/forms/object_create.py:109 dcim/forms/object_create.py:270 +#: dcim/tables/devices.py:281 +msgid "Rear ports" +msgstr "Задние порты" + +#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 +msgid "Select one rear port assignment for each front port being created." +msgstr "" +"Выберите одно назначение заднего порта для каждого создаваемого переднего " +"порта." + +#: dcim/forms/object_create.py:163 +#, python-brace-format +msgid "" +"The number of front port templates to be created ({frontport_count}) must " +"match the selected number of rear port positions ({rearport_count})." +msgstr "" +"Количество создаваемых шаблонов фронтальных портов ({frontport_count}) " +"должно соответствовать выбранному количеству положений задних портов " +"({rearport_count})." + +#: dcim/forms/object_create.py:250 +#, python-brace-format +msgid "" +"The string {module} will be replaced with the position of the " +"assigned module, if any." +msgstr "" +"Струна {module} будет заменено позицией назначенного модуля, " +"если таковая имеется." + +#: dcim/forms/object_create.py:319 +#, python-brace-format +msgid "" +"The number of front ports to be created ({frontport_count}) must match the " +"selected number of rear port positions ({rearport_count})." +msgstr "" +"Количество создаваемых фронтальных портов ({frontport_count}) должно " +"соответствовать выбранному количеству положений задних портов " +"({rearport_count})." + +#: dcim/forms/object_create.py:408 dcim/tables/devices.py:1034 +#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:54 +#: templates/dcim/virtualchassis_edit.html:48 templates/ipam/fhrpgroup.html:39 +msgid "Members" +msgstr "Члены" + +#: dcim/forms/object_create.py:417 +msgid "Initial position" +msgstr "Исходное положение" + +#: dcim/forms/object_create.py:420 +msgid "" +"Position of the first member device. Increases by one for each additional " +"member." +msgstr "" +"Положение первого элементного устройства. Увеличивается на единицу за каждый" +" дополнительный элемент." + +#: dcim/forms/object_create.py:434 +msgid "A position must be specified for the first VC member." +msgstr "Должность должна быть указана для первого члена VC." + +#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 +#: dcim/models/device_components.py:63 extras/models/customfields.py:108 +msgid "label" +msgstr "бирка" + +#: dcim/models/cables.py:71 +msgid "length" +msgstr "длина" + +#: dcim/models/cables.py:78 +msgid "length unit" +msgstr "единица длины" + +#: dcim/models/cables.py:93 +msgid "cable" +msgstr "кабель" + +#: dcim/models/cables.py:94 +msgid "cables" +msgstr "кабели" + +#: dcim/models/cables.py:190 +msgid "A and B terminations cannot connect to the same object." +msgstr "Терминалы A и B не могут подключаться к одному и тому же объекту." + +#: dcim/models/cables.py:257 ipam/models/asns.py:37 +msgid "end" +msgstr "конец" + +#: dcim/models/cables.py:310 +msgid "cable termination" +msgstr "заделение кабеля" + +#: dcim/models/cables.py:311 +msgid "cable terminations" +msgstr "кабельные концевые разъемы" + +#: dcim/models/cables.py:434 extras/models/configs.py:50 +msgid "is active" +msgstr "активен" + +#: dcim/models/cables.py:438 +msgid "is complete" +msgstr "завершен" + +#: dcim/models/cables.py:442 +msgid "is split" +msgstr "разделен" + +#: dcim/models/cables.py:450 +msgid "cable path" +msgstr "кабельная трасса" + +#: dcim/models/cables.py:451 +msgid "cable paths" +msgstr "кабельные трассы" + +#: dcim/models/device_component_templates.py:46 +#, python-brace-format +msgid "" +"{module} is accepted as a substitution for the module bay position when " +"attached to a module type." +msgstr "" +"{module} принимается в качестве замены положения отсека для модулей при " +"подключении к модулю того или иного типа." + +#: dcim/models/device_component_templates.py:58 +#: dcim/models/device_components.py:66 +msgid "Physical label" +msgstr "Физическая этикетка" + +#: dcim/models/device_component_templates.py:103 +msgid "Component templates cannot be moved to a different device type." +msgstr "Шаблоны компонентов нельзя перемещать на устройства другого типа." + +#: dcim/models/device_component_templates.py:154 +msgid "" +"A component template cannot be associated with both a device type and a " +"module type." +msgstr "" +"Шаблон компонента нельзя связать как с типом устройства, так и с типом " +"модуля." + +#: dcim/models/device_component_templates.py:158 +msgid "" +"A component template must be associated with either a device type or a " +"module type." +msgstr "" +"Шаблон компонента должен быть связан с типом устройства или типом модуля." + +#: dcim/models/device_component_templates.py:186 +msgid "console port template" +msgstr "шаблон консольного порта" + +#: dcim/models/device_component_templates.py:187 +msgid "console port templates" +msgstr "шаблоны консольных портов" + +#: dcim/models/device_component_templates.py:220 +msgid "console server port template" +msgstr "шаблон порта консольного сервера" + +#: dcim/models/device_component_templates.py:221 +msgid "console server port templates" +msgstr "шаблоны портов консольного сервера" + +#: dcim/models/device_component_templates.py:252 +#: dcim/models/device_components.py:353 +msgid "maximum draw" +msgstr "максимальная ничья" + +#: dcim/models/device_component_templates.py:259 +#: dcim/models/device_components.py:360 +msgid "allocated draw" +msgstr "назначенная ничья" + +#: dcim/models/device_component_templates.py:269 +msgid "power port template" +msgstr "шаблон порта питания" + +#: dcim/models/device_component_templates.py:270 +msgid "power port templates" +msgstr "шаблоны портов питания" + +#: dcim/models/device_component_templates.py:289 +#: dcim/models/device_components.py:383 +#, python-brace-format +msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." +msgstr "" +"Выделенная ничья не может превышать максимальное количество розыгрышей " +"({maximum_draw}Ж)." + +#: dcim/models/device_component_templates.py:321 +#: dcim/models/device_components.py:478 +msgid "feed leg" +msgstr "кормовая ножка" + +#: dcim/models/device_component_templates.py:325 +#: dcim/models/device_components.py:482 +msgid "Phase (for three-phase feeds)" +msgstr "Фаза (для трехфазных кормов)" + +#: dcim/models/device_component_templates.py:331 +msgid "power outlet template" +msgstr "шаблон розетки" + +#: dcim/models/device_component_templates.py:332 +msgid "power outlet templates" +msgstr "шаблоны розеток" + +#: dcim/models/device_component_templates.py:341 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device type" +msgstr "" +"Родительский порт питания ({power_port}) должно принадлежать к тому же типу " +"устройства" + +#: dcim/models/device_component_templates.py:345 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same module type" +msgstr "" +"Родительский порт питания ({power_port}) должен принадлежать к одному типу " +"модулей" + +#: dcim/models/device_component_templates.py:397 +#: dcim/models/device_components.py:612 +msgid "management only" +msgstr "только управление" + +#: dcim/models/device_component_templates.py:405 +#: dcim/models/device_components.py:551 +msgid "bridge interface" +msgstr "интерфейс моста" + +#: dcim/models/device_component_templates.py:423 +#: dcim/models/device_components.py:637 +msgid "wireless role" +msgstr "роль беспроводной сети" + +#: dcim/models/device_component_templates.py:429 +msgid "interface template" +msgstr "шаблон интерфейса" + +#: dcim/models/device_component_templates.py:430 +msgid "interface templates" +msgstr "шаблоны интерфейсов" + +#: dcim/models/device_component_templates.py:437 +#: dcim/models/device_components.py:805 +#: virtualization/models/virtualmachines.py:398 +msgid "An interface cannot be bridged to itself." +msgstr "Интерфейс не может быть подключен к самому себе." + +#: dcim/models/device_component_templates.py:440 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same device type" +msgstr "" +"Интерфейс моста ({bridge}) должно принадлежать к тому же типу устройства" + +#: dcim/models/device_component_templates.py:444 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same module type" +msgstr "Интерфейс моста ({bridge}) должен принадлежать к одному типу модулей" + +#: dcim/models/device_component_templates.py:500 +#: dcim/models/device_components.py:985 +msgid "rear port position" +msgstr "положение заднего порта" + +#: dcim/models/device_component_templates.py:525 +msgid "front port template" +msgstr "шаблон переднего порта" + +#: dcim/models/device_component_templates.py:526 +msgid "front port templates" +msgstr "шаблоны передних портов" + +#: dcim/models/device_component_templates.py:536 +#, python-brace-format +msgid "Rear port ({name}) must belong to the same device type" +msgstr "Задний порт ({name}) должно принадлежать к тому же типу устройства" + +#: dcim/models/device_component_templates.py:542 +#, python-brace-format +msgid "" +"Invalid rear port position ({position}); rear port {name} has only {count} " +"positions" +msgstr "" +"Неверное положение заднего порта ({position}); задний порт {name} имеет " +"только {count} позиции" + +#: dcim/models/device_component_templates.py:595 +#: dcim/models/device_components.py:1054 +msgid "positions" +msgstr "позиции" + +#: dcim/models/device_component_templates.py:606 +msgid "rear port template" +msgstr "шаблон заднего порта" + +#: dcim/models/device_component_templates.py:607 +msgid "rear port templates" +msgstr "шаблоны задних портов" + +#: dcim/models/device_component_templates.py:636 +#: dcim/models/device_components.py:1095 +msgid "position" +msgstr "позиция" + +#: dcim/models/device_component_templates.py:639 +#: dcim/models/device_components.py:1098 +msgid "Identifier to reference when renaming installed components" +msgstr "" +"Идентификатор, на который следует ссылаться при переименовании установленных" +" компонентов" + +#: dcim/models/device_component_templates.py:645 +msgid "module bay template" +msgstr "шаблон модульного отсека" + +#: dcim/models/device_component_templates.py:646 +msgid "module bay templates" +msgstr "шаблоны модульных отсеков" + +#: dcim/models/device_component_templates.py:673 +msgid "device bay template" +msgstr "шаблон отсека для устройств" + +#: dcim/models/device_component_templates.py:674 +msgid "device bay templates" +msgstr "шаблоны отсеков для устройств" + +#: dcim/models/device_component_templates.py:687 +#, python-brace-format +msgid "" +"Subdevice role of device type ({device_type}) must be set to \"parent\" to " +"allow device bays." +msgstr "" +"Роль подустройства типа устройства ({device_type}) должно быть установлено " +"значение «родительский», чтобы разрешить отсеки для устройств." + +#: dcim/models/device_component_templates.py:742 +#: dcim/models/device_components.py:1224 +msgid "part ID" +msgstr "идентификатор детали" + +#: dcim/models/device_component_templates.py:744 +#: dcim/models/device_components.py:1226 +msgid "Manufacturer-assigned part identifier" +msgstr "Идентификатор детали, присвоенный производителем" + +#: dcim/models/device_component_templates.py:761 +msgid "inventory item template" +msgstr "шаблон инвентарного товара" + +#: dcim/models/device_component_templates.py:762 +msgid "inventory item templates" +msgstr "шаблоны товаров инвентаря" + +#: dcim/models/device_components.py:106 +msgid "Components cannot be moved to a different device." +msgstr "Компоненты нельзя перемещать на другое устройство." + +#: dcim/models/device_components.py:145 +msgid "cable end" +msgstr "конец кабеля" + +#: dcim/models/device_components.py:151 +msgid "mark connected" +msgstr "отметка подключена" + +#: dcim/models/device_components.py:153 +msgid "Treat as if a cable is connected" +msgstr "Обращайтесь так, как будто кабель подключен" + +#: dcim/models/device_components.py:171 +msgid "Must specify cable end (A or B) when attaching a cable." +msgstr "При подключении кабеля необходимо указать конец кабеля (A или B)." + +#: dcim/models/device_components.py:175 +msgid "Cable end must not be set without a cable." +msgstr "Конец кабеля нельзя устанавливать без кабеля." + +#: dcim/models/device_components.py:179 +msgid "Cannot mark as connected with a cable attached." +msgstr "Невозможно пометить как подключенный к подключенному кабелю." + +#: dcim/models/device_components.py:203 +#, python-brace-format +msgid "{class_name} models must declare a parent_object property" +msgstr "{class_name} модели должны объявить свойство parent_object" + +#: dcim/models/device_components.py:288 dcim/models/device_components.py:317 +#: dcim/models/device_components.py:350 dcim/models/device_components.py:468 +msgid "Physical port type" +msgstr "Тип физического порта" + +#: dcim/models/device_components.py:291 dcim/models/device_components.py:320 +msgid "speed" +msgstr "скорость" + +#: dcim/models/device_components.py:295 dcim/models/device_components.py:324 +msgid "Port speed in bits per second" +msgstr "Скорость порта в битах в секунду" + +#: dcim/models/device_components.py:301 +msgid "console port" +msgstr "консольный порт" + +#: dcim/models/device_components.py:302 +msgid "console ports" +msgstr "консольные порты" + +#: dcim/models/device_components.py:330 +msgid "console server port" +msgstr "порт консольного сервера" + +#: dcim/models/device_components.py:331 +msgid "console server ports" +msgstr "порты консольного сервера" + +#: dcim/models/device_components.py:370 +msgid "power port" +msgstr "порт питания" + +#: dcim/models/device_components.py:371 +msgid "power ports" +msgstr "порты питания" + +#: dcim/models/device_components.py:488 +msgid "power outlet" +msgstr "розетка" + +#: dcim/models/device_components.py:489 +msgid "power outlets" +msgstr "розетки" + +#: dcim/models/device_components.py:500 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device" +msgstr "" +"Родительский порт питания ({power_port}) должно принадлежать одному и тому " +"же устройству" + +#: dcim/models/device_components.py:531 vpn/models/crypto.py:81 +#: vpn/models/crypto.py:214 +msgid "mode" +msgstr "режим" + +#: dcim/models/device_components.py:535 +msgid "IEEE 802.1Q tagging strategy" +msgstr "Стратегия маркировки IEEE 802.1Q" + +#: dcim/models/device_components.py:543 +msgid "parent interface" +msgstr "родительский интерфейс" + +#: dcim/models/device_components.py:603 +msgid "parent LAG" +msgstr "родительский LAG" + +#: dcim/models/device_components.py:613 +msgid "This interface is used only for out-of-band management" +msgstr "Этот интерфейс используется только для внеполосного управления" + +#: dcim/models/device_components.py:618 +msgid "speed (Kbps)" +msgstr "скорость (Кбит/с)" + +#: dcim/models/device_components.py:621 +msgid "duplex" +msgstr "двойной" + +#: dcim/models/device_components.py:631 +msgid "64-bit World Wide Name" +msgstr "64-битное всемирное имя" + +#: dcim/models/device_components.py:643 +msgid "wireless channel" +msgstr "беспроводной канал" + +#: dcim/models/device_components.py:650 +msgid "channel frequency (MHz)" +msgstr "частота канала (МГц)" + +#: dcim/models/device_components.py:651 dcim/models/device_components.py:659 +msgid "Populated by selected channel (if set)" +msgstr "Заполнено выбранным каналом (если задано)" + +#: dcim/models/device_components.py:665 +msgid "transmit power (dBm)" +msgstr "мощность передачи (дБм)" + +#: dcim/models/device_components.py:690 wireless/models.py:116 +msgid "wireless LANs" +msgstr "беспроводные локальные сети" + +#: dcim/models/device_components.py:698 +#: virtualization/models/virtualmachines.py:328 +msgid "untagged VLAN" +msgstr "VLAN без тегов" + +#: dcim/models/device_components.py:704 +#: virtualization/models/virtualmachines.py:334 +msgid "tagged VLANs" +msgstr "помеченные VLAN" + +#: dcim/models/device_components.py:746 +#: virtualization/models/virtualmachines.py:370 +msgid "interface" +msgstr "интерфейс" + +#: dcim/models/device_components.py:747 +#: virtualization/models/virtualmachines.py:371 +msgid "interfaces" +msgstr "интерфейсов" + +#: dcim/models/device_components.py:758 +#, python-brace-format +msgid "{display_type} interfaces cannot have a cable attached." +msgstr "{display_type} к интерфейсам нельзя подключать кабель." + +#: dcim/models/device_components.py:766 +#, python-brace-format +msgid "{display_type} interfaces cannot be marked as connected." +msgstr "{display_type} интерфейсы нельзя пометить как подключенные." + +#: dcim/models/device_components.py:775 +#: virtualization/models/virtualmachines.py:383 +msgid "An interface cannot be its own parent." +msgstr "Интерфейс не может быть собственным родителем." + +#: dcim/models/device_components.py:779 +msgid "Only virtual interfaces may be assigned to a parent interface." +msgstr "" +"Родительскому интерфейсу могут быть назначены только виртуальные интерфейсы." + +#: dcim/models/device_components.py:786 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to a different device " +"({device})" +msgstr "" +"Выбранный родительский интерфейс ({interface}) принадлежит другому " +"устройству ({device})" + +#: dcim/models/device_components.py:792 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" +"Выбранный родительский интерфейс ({interface}) принадлежит {device}, который" +" не является частью виртуального шасси {virtual_chassis}." + +#: dcim/models/device_components.py:812 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different device " +"({device})." +msgstr "" +"Выбранный интерфейс моста ({bridge}) принадлежит другому устройству " +"({device})." + +#: dcim/models/device_components.py:818 +#, python-brace-format +msgid "" +"The selected bridge interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" +"Выбранный интерфейс моста ({interface}) принадлежит {device}, который не " +"является частью виртуального шасси {virtual_chassis}." + +#: dcim/models/device_components.py:829 +msgid "Virtual interfaces cannot have a parent LAG interface." +msgstr "Виртуальные интерфейсы не могут иметь родительский интерфейс LAG." + +#: dcim/models/device_components.py:833 +msgid "A LAG interface cannot be its own parent." +msgstr "Интерфейс LAG не может быть собственным родителем." + +#: dcim/models/device_components.py:840 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to a different device ({device})." +msgstr "" +"Выбранный интерфейс LAG ({lag}) принадлежит другому устройству ({device})." + +#: dcim/models/device_components.py:846 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to {device}, which is not part of" +" virtual chassis {virtual_chassis}." +msgstr "" +"Выбранный интерфейс LAG ({lag}) принадлежит {device}, который не является " +"частью виртуального шасси {virtual_chassis}." + +#: dcim/models/device_components.py:857 +msgid "Virtual interfaces cannot have a PoE mode." +msgstr "Виртуальные интерфейсы не могут иметь режим PoE." + +#: dcim/models/device_components.py:861 +msgid "Virtual interfaces cannot have a PoE type." +msgstr "Виртуальные интерфейсы не могут иметь тип PoE." + +#: dcim/models/device_components.py:867 +msgid "Must specify PoE mode when designating a PoE type." +msgstr "При назначении типа PoE необходимо указать режим PoE." + +#: dcim/models/device_components.py:874 +msgid "Wireless role may be set only on wireless interfaces." +msgstr "" +"Роль беспроводной связи может быть установлена только на беспроводных " +"интерфейсах." + +#: dcim/models/device_components.py:876 +msgid "Channel may be set only on wireless interfaces." +msgstr "Канал можно настроить только на беспроводных интерфейсах." + +#: dcim/models/device_components.py:882 +msgid "Channel frequency may be set only on wireless interfaces." +msgstr "" +"Частота канала может быть установлена только на беспроводных интерфейсах." + +#: dcim/models/device_components.py:886 +msgid "Cannot specify custom frequency with channel selected." +msgstr "Невозможно указать собственную частоту при выбранном канале." + +#: dcim/models/device_components.py:892 +msgid "Channel width may be set only on wireless interfaces." +msgstr "" +"Ширина канала может быть установлена только на беспроводных интерфейсах." + +#: dcim/models/device_components.py:894 +msgid "Cannot specify custom width with channel selected." +msgstr "Невозможно указать произвольную ширину при выбранном канале." + +#: dcim/models/device_components.py:902 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent device, or it must be global." +msgstr "" +"VLAN без тегов ({untagged_vlan}) должно принадлежать тому же сайту, что и " +"родительское устройство интерфейса, или оно должно быть глобальным." + +#: dcim/models/device_components.py:991 +msgid "Mapped position on corresponding rear port" +msgstr "Нанесенное на карту положение на соответствующем заднем порту" + +#: dcim/models/device_components.py:1007 +msgid "front port" +msgstr "передний порт" + +#: dcim/models/device_components.py:1008 +msgid "front ports" +msgstr "передние порты" + +#: dcim/models/device_components.py:1022 +#, python-brace-format +msgid "Rear port ({rear_port}) must belong to the same device" +msgstr "" +"Задний порт ({rear_port}) должно принадлежать одному и тому же устройству" + +#: dcim/models/device_components.py:1030 +#, python-brace-format +msgid "" +"Invalid rear port position ({rear_port_position}): Rear port {name} has only" +" {positions} positions." +msgstr "" +"Неверное положение заднего порта ({rear_port_position}): Задний порт {name} " +"имеет только {positions} позиции." + +#: dcim/models/device_components.py:1060 +msgid "Number of front ports which may be mapped" +msgstr "Количество передних портов, которые можно сопоставить" + +#: dcim/models/device_components.py:1065 +msgid "rear port" +msgstr "задний порт" + +#: dcim/models/device_components.py:1066 +msgid "rear ports" +msgstr "задние порты" + +#: dcim/models/device_components.py:1080 +#, python-brace-format +msgid "" +"The number of positions cannot be less than the number of mapped front ports" +" ({frontport_count})" +msgstr "" +"Количество позиций не может быть меньше количества сопоставленных передних " +"портов ({frontport_count})" + +#: dcim/models/device_components.py:1104 +msgid "module bay" +msgstr "модульный отсек" + +#: dcim/models/device_components.py:1105 +msgid "module bays" +msgstr "отсеки для модулей" + +#: dcim/models/device_components.py:1118 +msgid "parent_bay" +msgstr "родитель_ребенок" + +#: dcim/models/device_components.py:1126 +msgid "device bay" +msgstr "отсек для устройств" + +#: dcim/models/device_components.py:1127 +msgid "device bays" +msgstr "отсеки для устройств" + +#: dcim/models/device_components.py:1137 +#, python-brace-format +msgid "This type of device ({device_type}) does not support device bays." +msgstr "" +"Этот тип устройства ({device_type}) не поддерживает отсеки для устройств." + +#: dcim/models/device_components.py:1143 +msgid "Cannot install a device into itself." +msgstr "Невозможно установить устройство в само по себе." + +#: dcim/models/device_components.py:1151 +#, python-brace-format +msgid "" +"Cannot install the specified device; device is already installed in {bay}." +msgstr "" +"Невозможно установить указанное устройство; устройство уже установлено в " +"{bay}." + +#: dcim/models/device_components.py:1172 +msgid "inventory item role" +msgstr "роль инвентарного товара" + +#: dcim/models/device_components.py:1173 +msgid "inventory item roles" +msgstr "роли предметов инвентаря" + +#: dcim/models/device_components.py:1230 dcim/models/devices.py:595 +#: dcim/models/devices.py:1173 dcim/models/racks.py:113 +msgid "serial number" +msgstr "серийный номер" + +#: dcim/models/device_components.py:1238 dcim/models/devices.py:603 +#: dcim/models/devices.py:1180 dcim/models/racks.py:120 +msgid "asset tag" +msgstr "тег актива" + +#: dcim/models/device_components.py:1239 +msgid "A unique tag used to identify this item" +msgstr "Уникальный тег, используемый для идентификации этого товара" + +#: dcim/models/device_components.py:1242 +msgid "discovered" +msgstr "обнаружил" + +#: dcim/models/device_components.py:1244 +msgid "This item was automatically discovered" +msgstr "Этот предмет был обнаружен автоматически" + +#: dcim/models/device_components.py:1262 +msgid "inventory item" +msgstr "инвентарный предмет" + +#: dcim/models/device_components.py:1263 +msgid "inventory items" +msgstr "предметы инвентаря" + +#: dcim/models/device_components.py:1274 +msgid "Cannot assign self as parent." +msgstr "Невозможно назначить себя родителем." + +#: dcim/models/device_components.py:1282 +msgid "Parent inventory item does not belong to the same device." +msgstr "" +"Предмет родительского инвентаря не принадлежит одному и тому же устройству." + +#: dcim/models/device_components.py:1288 +msgid "Cannot move an inventory item with dependent children" +msgstr "Невозможно переместить инвентарь вместе с детьми-иждивенцами" + +#: dcim/models/device_components.py:1296 +msgid "Cannot assign inventory item to component on another device" +msgstr "" +"Невозможно присвоить инвентарный предмет компоненту на другом устройстве" + +#: dcim/models/devices.py:54 +msgid "manufacturer" +msgstr "производитель" + +#: dcim/models/devices.py:55 +msgid "manufacturers" +msgstr "производителей" + +#: dcim/models/devices.py:82 dcim/models/devices.py:381 +msgid "model" +msgstr "модель" + +#: dcim/models/devices.py:95 +msgid "default platform" +msgstr "платформа по умолчанию" + +#: dcim/models/devices.py:98 dcim/models/devices.py:385 +msgid "part number" +msgstr "номер детали" + +#: dcim/models/devices.py:101 dcim/models/devices.py:388 +msgid "Discrete part number (optional)" +msgstr "Дискретный номер детали (опционально)" + +#: dcim/models/devices.py:107 dcim/models/racks.py:137 +msgid "height (U)" +msgstr "высота (U)" + +#: dcim/models/devices.py:111 +msgid "exclude from utilization" +msgstr "исключить из использования" + +#: dcim/models/devices.py:112 +msgid "Devices of this type are excluded when calculating rack utilization." +msgstr "Устройства этого типа исключаются при расчете использования стоек." + +#: dcim/models/devices.py:116 +msgid "is full depth" +msgstr "полная глубина" + +#: dcim/models/devices.py:117 +msgid "Device consumes both front and rear rack faces." +msgstr "Устройство потребляет как переднюю, так и заднюю поверхности стойки." + +#: dcim/models/devices.py:123 +msgid "parent/child status" +msgstr "статус родителя/ребенка" + +#: dcim/models/devices.py:124 +msgid "" +"Parent devices house child devices in device bays. Leave blank if this " +"device type is neither a parent nor a child." +msgstr "" +"На родительских устройствах дочерние устройства размещены в отсеках для " +"устройств. Оставьте поле пустым, если этот тип устройства не относится ни к " +"родительскому, ни к дочернему." + +#: dcim/models/devices.py:128 dcim/models/devices.py:647 +msgid "airflow" +msgstr "расход воздуха" + +#: dcim/models/devices.py:204 +msgid "device type" +msgstr "тип устройства" + +#: dcim/models/devices.py:205 +msgid "device types" +msgstr "типы устройств" + +#: dcim/models/devices.py:289 +msgid "U height must be in increments of 0.5 rack units." +msgstr "Высота U должна быть с шагом 0,5 единицы стойки." + +#: dcim/models/devices.py:306 +#, python-brace-format +msgid "" +"Device {device} in rack {rack} does not have sufficient space to accommodate" +" a height of {height}U" +msgstr "" +"Устройство {device} в стойке {rack} не имеет достаточного места для " +"размещения на высоте {height}У" + +#: dcim/models/devices.py:321 +#, python-brace-format +msgid "" +"Unable to set 0U height: Found {racked_instance_count} " +"instances already mounted within racks." +msgstr "" +"Невозможно установить высоту 0U: найдено {racked_instance_count} экземпляры уже смонтирован в " +"стойках." + +#: dcim/models/devices.py:330 +msgid "" +"Must delete all device bay templates associated with this device before " +"declassifying it as a parent device." +msgstr "" +"Необходимо удалить все шаблоны отсеков устройств, связанные с этим " +"устройством, прежде чем рассекретить его как родительское устройство." + +#: dcim/models/devices.py:336 +msgid "Child device types must be 0U." +msgstr "Типы дочерних устройств должны быть 0U." + +#: dcim/models/devices.py:404 +msgid "module type" +msgstr "тип модуля" + +#: dcim/models/devices.py:405 +msgid "module types" +msgstr "типы модулей" + +#: dcim/models/devices.py:473 +msgid "Virtual machines may be assigned to this role" +msgstr "Эта роль может быть назначена виртуальным машинам." + +#: dcim/models/devices.py:485 +msgid "device role" +msgstr "роль устройства" + +#: dcim/models/devices.py:486 +msgid "device roles" +msgstr "роли устройств" + +#: dcim/models/devices.py:503 +msgid "Optionally limit this platform to devices of a certain manufacturer" +msgstr "" +"Опционально ограничьте эту платформу устройствами определенного " +"производителя" + +#: dcim/models/devices.py:515 +msgid "platform" +msgstr "платформы" + +#: dcim/models/devices.py:516 +msgid "platforms" +msgstr "платформ" + +#: dcim/models/devices.py:564 +msgid "The function this device serves" +msgstr "Функция, которую выполняет это устройство" + +#: dcim/models/devices.py:596 +msgid "Chassis serial number, assigned by the manufacturer" +msgstr "Серийный номер корпуса, присвоенный производителем" + +#: dcim/models/devices.py:604 dcim/models/devices.py:1181 +msgid "A unique tag used to identify this device" +msgstr "Уникальный тег, используемый для идентификации этого устройства" + +#: dcim/models/devices.py:631 +msgid "position (U)" +msgstr "положение (U)" + +#: dcim/models/devices.py:638 +msgid "rack face" +msgstr "лицевая сторона стойки" + +#: dcim/models/devices.py:658 dcim/models/devices.py:1390 +#: virtualization/models/virtualmachines.py:98 +msgid "primary IPv4" +msgstr "основной IPv4" + +#: dcim/models/devices.py:666 dcim/models/devices.py:1398 +#: virtualization/models/virtualmachines.py:106 +msgid "primary IPv6" +msgstr "основной IPv6" + +#: dcim/models/devices.py:674 +msgid "out-of-band IP" +msgstr "внеполосный IP-адрес" + +#: dcim/models/devices.py:691 +msgid "VC position" +msgstr "Позиция VC" + +#: dcim/models/devices.py:695 +msgid "Virtual chassis position" +msgstr "Положение виртуального шасси" + +#: dcim/models/devices.py:698 +msgid "VC priority" +msgstr "Приоритет VC" + +#: dcim/models/devices.py:702 +msgid "Virtual chassis master election priority" +msgstr "Приоритет выбора основного виртуального шасси" + +#: dcim/models/devices.py:705 dcim/models/sites.py:207 +msgid "latitude" +msgstr "широта" + +#: dcim/models/devices.py:710 dcim/models/devices.py:718 +#: dcim/models/sites.py:212 dcim/models/sites.py:220 +msgid "GPS coordinate in decimal format (xx.yyyyyy)" +msgstr "Координата GPS в десятичном формате (xx.yyyyyy)" + +#: dcim/models/devices.py:713 dcim/models/sites.py:215 +msgid "longitude" +msgstr "долгота" + +#: dcim/models/devices.py:786 +msgid "Device name must be unique per site." +msgstr "Имя устройства должно быть уникальным для каждого сайта." + +#: dcim/models/devices.py:797 ipam/models/services.py:75 +msgid "device" +msgstr "устройство" + +#: dcim/models/devices.py:798 +msgid "devices" +msgstr "приборы" + +#: dcim/models/devices.py:838 +#, python-brace-format +msgid "Rack {rack} does not belong to site {site}." +msgstr "Стеллаж {rack} не принадлежит сайту {site}." + +#: dcim/models/devices.py:843 +#, python-brace-format +msgid "Location {location} does not belong to site {site}." +msgstr "Местоположение {location} не принадлежит сайту {site}." + +#: dcim/models/devices.py:849 +#, python-brace-format +msgid "Rack {rack} does not belong to location {location}." +msgstr "Стеллаж {rack} не принадлежит локации {location}." + +#: dcim/models/devices.py:856 +msgid "Cannot select a rack face without assigning a rack." +msgstr "Невозможно выбрать грань стойки без назначения стойки." + +#: dcim/models/devices.py:860 +msgid "Cannot select a rack position without assigning a rack." +msgstr "Невозможно выбрать положение стойки без назначения стойки." + +#: dcim/models/devices.py:866 +msgid "Position must be in increments of 0.5 rack units." +msgstr "Положение должно быть с шагом 0,5 единицы стойки." + +#: dcim/models/devices.py:870 +msgid "Must specify rack face when defining rack position." +msgstr "При определении положения стойки необходимо указать грань стойки." + +#: dcim/models/devices.py:878 +#, python-brace-format +msgid "" +"A U0 device type ({device_type}) cannot be assigned to a rack position." +msgstr "Тип устройства U0 ({device_type}) не может быть отнесено к стойке." + +#: dcim/models/devices.py:889 +msgid "" +"Child device types cannot be assigned to a rack face. This is an attribute " +"of the parent device." +msgstr "" +"Типы дочерних устройств нельзя присвоить поверхности стойки. Это атрибут " +"родительского устройства." + +#: dcim/models/devices.py:896 +msgid "" +"Child device types cannot be assigned to a rack position. This is an " +"attribute of the parent device." +msgstr "" +"Типы детских устройств нельзя отнести к позиции в стойке. Это атрибут " +"родительского устройства." + +#: dcim/models/devices.py:910 +#, python-brace-format +msgid "" +"U{position} is already occupied or does not have sufficient space to " +"accommodate this device type: {device_type} ({u_height}U)" +msgstr "" +"U{position} уже занят или в нем недостаточно места для размещения этого типа" +" устройств: {device_type} ({u_height}U)" + +#: dcim/models/devices.py:925 +#, python-brace-format +msgid "{ip} is not an IPv4 address." +msgstr "{ip} не является адресом IPv4." + +#: dcim/models/devices.py:934 dcim/models/devices.py:949 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this device." +msgstr "Указанный IP-адрес ({ip}) не назначено этому устройству." + +#: dcim/models/devices.py:940 +#, python-brace-format +msgid "{ip} is not an IPv6 address." +msgstr "{ip} не является адресом IPv6." + +#: dcim/models/devices.py:967 +#, python-brace-format +msgid "" +"The assigned platform is limited to {platform_manufacturer} device types, " +"but this device's type belongs to {devicetype_manufacturer}." +msgstr "" +"Назначенная платформа ограничена {platform_manufacturer} типы устройств, но " +"данный тип устройства относится к {devicetype_manufacturer}." + +#: dcim/models/devices.py:978 +#, python-brace-format +msgid "The assigned cluster belongs to a different site ({site})" +msgstr "Назначенный кластер принадлежит другому сайту ({site})" + +#: dcim/models/devices.py:986 +msgid "A device assigned to a virtual chassis must have its position defined." +msgstr "" +"Положение устройства, назначенного виртуальному шасси, должно быть " +"определено." + +#: dcim/models/devices.py:1188 +msgid "module" +msgstr "модуль" + +#: dcim/models/devices.py:1189 +msgid "modules" +msgstr "модулей" + +#: dcim/models/devices.py:1205 +#, python-brace-format +msgid "" +"Module must be installed within a module bay belonging to the assigned " +"device ({device})." +msgstr "" +"Модуль должен быть установлен в модульном отсеке, принадлежащем назначенному" +" устройству ({device})." + +#: dcim/models/devices.py:1309 +msgid "domain" +msgstr "сфера" + +#: dcim/models/devices.py:1322 dcim/models/devices.py:1323 +msgid "virtual chassis" +msgstr "виртуальное шасси" + +#: dcim/models/devices.py:1338 +#, python-brace-format +msgid "" +"The selected master ({master}) is not assigned to this virtual chassis." +msgstr "Выбранный мастер ({master}) не назначено этому виртуальному шасси." + +#: dcim/models/devices.py:1354 +#, python-brace-format +msgid "" +"Unable to delete virtual chassis {self}. There are member interfaces which " +"form a cross-chassis LAG interfaces." +msgstr "" +"Невозможно удалить виртуальное шасси {self}. Существуют интерфейсы-члены, " +"которые образуют межкорпусные интерфейсы LAG." + +#: dcim/models/devices.py:1379 vpn/models/l2vpn.py:37 +msgid "identifier" +msgstr "идентификатор" + +#: dcim/models/devices.py:1380 +msgid "Numeric identifier unique to the parent device" +msgstr "Цифровой идентификатор, уникальный для родительского устройства" + +#: dcim/models/devices.py:1408 extras/models/models.py:129 +#: extras/models/models.py:724 netbox/models/__init__.py:114 +msgid "comments" +msgstr "комментарии" + +#: dcim/models/devices.py:1424 +msgid "virtual device context" +msgstr "контекст виртуального устройства" + +#: dcim/models/devices.py:1425 +msgid "virtual device contexts" +msgstr "контексты виртуальных устройств" + +#: dcim/models/devices.py:1457 +#, python-brace-format +msgid "{ip} is not an IPv{family} address." +msgstr "{ip} не является IPV{family} адрес." + +#: dcim/models/devices.py:1463 +msgid "Primary IP address must belong to an interface on the assigned device." +msgstr "" +"Основной IP-адрес должен принадлежать интерфейсу на назначенном устройстве." + +#: dcim/models/mixins.py:15 extras/models/configs.py:41 +#: extras/models/models.py:343 extras/models/models.py:552 +#: extras/models/search.py:50 ipam/models/ip.py:193 +msgid "weight" +msgstr "вес" + +#: dcim/models/mixins.py:22 +msgid "weight unit" +msgstr "весовая единица" + +#: dcim/models/mixins.py:51 +msgid "Must specify a unit when setting a weight" +msgstr "При установке веса необходимо указать единицу измерения" + +#: dcim/models/power.py:55 +msgid "power panel" +msgstr "панель питания" + +#: dcim/models/power.py:56 +msgid "power panels" +msgstr "панели питания" + +#: dcim/models/power.py:70 +#, python-brace-format +msgid "" +"Location {location} ({location_site}) is in a different site than {site}" +msgstr "" +"Местоположение {location} ({location_site}) находится на другом сайте, чем " +"{site}" + +#: dcim/models/power.py:107 +msgid "supply" +msgstr "запас" + +#: dcim/models/power.py:113 +msgid "phase" +msgstr "фаза" + +#: dcim/models/power.py:119 +msgid "voltage" +msgstr "напряжение" + +#: dcim/models/power.py:124 +msgid "amperage" +msgstr "сила тока" + +#: dcim/models/power.py:129 +msgid "max utilization" +msgstr "максимальное использование" + +#: dcim/models/power.py:132 +msgid "Maximum permissible draw (percentage)" +msgstr "Максимально допустимая ничья (в процентах)" + +#: dcim/models/power.py:135 +msgid "available power" +msgstr "доступная мощность" + +#: dcim/models/power.py:163 +msgid "power feed" +msgstr "подача питания" + +#: dcim/models/power.py:164 +msgid "power feeds" +msgstr "источники питания" + +#: dcim/models/power.py:178 +#, python-brace-format +msgid "" +"Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " +"are in different sites." +msgstr "" +"Стеллаж {rack} ({rack_site}) и панель питания {powerpanel} " +"({powerpanel_site}) находятся на разных сайтах." + +#: dcim/models/power.py:189 +msgid "Voltage cannot be negative for AC supply" +msgstr "Напряжение питания переменного тока не может быть отрицательным" + +#: dcim/models/racks.py:49 +msgid "rack role" +msgstr "роль стойки" + +#: dcim/models/racks.py:50 +msgid "rack roles" +msgstr "роли стеллажей" + +#: dcim/models/racks.py:74 +msgid "facility ID" +msgstr "идентификатор объекта" + +#: dcim/models/racks.py:75 +msgid "Locally-assigned identifier" +msgstr "Локально назначенный идентификатор" + +#: dcim/models/racks.py:108 ipam/forms/bulk_import.py:200 +#: ipam/forms/bulk_import.py:265 ipam/forms/bulk_import.py:300 +#: ipam/forms/bulk_import.py:467 virtualization/forms/bulk_import.py:112 +msgid "Functional role" +msgstr "Функциональная роль" + +#: dcim/models/racks.py:121 +msgid "A unique tag used to identify this rack" +msgstr "Уникальный тег, используемый для идентификации этой стойки" + +#: dcim/models/racks.py:132 +msgid "width" +msgstr "ширина" + +#: dcim/models/racks.py:133 +msgid "Rail-to-rail width" +msgstr "Ширина от рельса до рельса" + +#: dcim/models/racks.py:139 +msgid "Height in rack units" +msgstr "Высота в стеллажах" + +#: dcim/models/racks.py:143 +msgid "starting unit" +msgstr "пусковой блок" + +#: dcim/models/racks.py:145 +msgid "Starting unit for rack" +msgstr "Пусковой блок для стойки" + +#: dcim/models/racks.py:149 +msgid "descending units" +msgstr "единицы по убыванию" + +#: dcim/models/racks.py:150 +msgid "Units are numbered top-to-bottom" +msgstr "Единицы нумеруются сверху вниз" + +#: dcim/models/racks.py:153 +msgid "outer width" +msgstr "внешняя ширина" + +#: dcim/models/racks.py:156 +msgid "Outer dimension of rack (width)" +msgstr "Наружный размер стойки (ширина)" + +#: dcim/models/racks.py:159 +msgid "outer depth" +msgstr "внешняя глубина" + +#: dcim/models/racks.py:162 +msgid "Outer dimension of rack (depth)" +msgstr "Внешний размер стойки (глубина)" + +#: dcim/models/racks.py:165 +msgid "outer unit" +msgstr "внешний блок" + +#: dcim/models/racks.py:171 +msgid "max weight" +msgstr "максимальный вес" + +#: dcim/models/racks.py:174 +msgid "Maximum load capacity for the rack" +msgstr "Максимальная грузоподъемность стеллажа" + +#: dcim/models/racks.py:182 +msgid "mounting depth" +msgstr "глубина монтажа" + +#: dcim/models/racks.py:186 +msgid "" +"Maximum depth of a mounted device, in millimeters. For four-post racks, this" +" is the distance between the front and rear rails." +msgstr "" +"Максимальная глубина установленного устройства в миллиметрах. Для " +"четырехстоечных стоек это расстояние между передними и задними " +"направляющими." + +#: dcim/models/racks.py:220 +msgid "rack" +msgstr "стеллаж" + +#: dcim/models/racks.py:221 +msgid "racks" +msgstr "стойки" + +#: dcim/models/racks.py:236 +#, python-brace-format +msgid "Assigned location must belong to parent site ({site})." +msgstr "" +"Назначенное местоположение должно принадлежать родительскому сайту ({site})." + +#: dcim/models/racks.py:240 +msgid "Must specify a unit when setting an outer width/depth" +msgstr "" +"При настройке внешней ширины/глубины необходимо указать единицу измерения" + +#: dcim/models/racks.py:244 +msgid "Must specify a unit when setting a maximum weight" +msgstr "При установке максимального веса необходимо указать единицу измерения" + +#: dcim/models/racks.py:254 +#, python-brace-format +msgid "" +"Rack must be at least {min_height}U tall to house currently installed " +"devices." +msgstr "" +"Стеллаж должен быть не менее {min_height}Я разговариваю с домом, " +"установленными в настоящее время устройствами." + +#: dcim/models/racks.py:261 +#, python-brace-format +msgid "" +"Rack unit numbering must begin at {position} or less to house currently " +"installed devices." +msgstr "" +"Нумерация стеллажей должна начинаться с {position} или меньше для размещения" +" установленных в настоящее время устройств." + +#: dcim/models/racks.py:269 +#, python-brace-format +msgid "Location must be from the same site, {site}." +msgstr "Местоположение должно быть с того же сайта, {site}." + +#: dcim/models/racks.py:522 +msgid "units" +msgstr "единиц" + +#: dcim/models/racks.py:548 +msgid "rack reservation" +msgstr "бронирование стеллажей" + +#: dcim/models/racks.py:549 +msgid "rack reservations" +msgstr "бронирование стеллажей" + +#: dcim/models/racks.py:566 +#, python-brace-format +msgid "Invalid unit(s) for {height}U rack: {unit_list}" +msgstr "Неверные единицы измерения для {height}U-образная стойка: {unit_list}" + +#: dcim/models/racks.py:579 +#, python-brace-format +msgid "The following units have already been reserved: {unit_list}" +msgstr "Следующие номера уже зарезервированы: {unit_list}" + +#: dcim/models/sites.py:49 +msgid "A top-level region with this name already exists." +msgstr "Регион верхнего уровня с таким названием уже существует." + +#: dcim/models/sites.py:59 +msgid "A top-level region with this slug already exists." +msgstr "Регион верхнего уровня с этим слагнем уже существует." + +#: dcim/models/sites.py:62 +msgid "region" +msgstr "область, край" + +#: dcim/models/sites.py:63 +msgid "regions" +msgstr "районы" + +#: dcim/models/sites.py:102 +msgid "A top-level site group with this name already exists." +msgstr "Группа сайтов верхнего уровня с таким именем уже существует." + +#: dcim/models/sites.py:112 +msgid "A top-level site group with this slug already exists." +msgstr "Группа сайтов верхнего уровня с этим слайгом уже существует." + +#: dcim/models/sites.py:115 +msgid "site group" +msgstr "группа сайта" + +#: dcim/models/sites.py:116 +msgid "site groups" +msgstr "группы сайтов" + +#: dcim/models/sites.py:141 +msgid "Full name of the site" +msgstr "Полное название сайта" + +#: dcim/models/sites.py:181 +msgid "facility" +msgstr "объект" + +#: dcim/models/sites.py:184 +msgid "Local facility ID or description" +msgstr "Идентификатор или описание местного объекта" + +#: dcim/models/sites.py:195 +msgid "physical address" +msgstr "физический адрес" + +#: dcim/models/sites.py:198 +msgid "Physical location of the building" +msgstr "Физическое местоположение здания" + +#: dcim/models/sites.py:201 +msgid "shipping address" +msgstr "адрес доставки" + +#: dcim/models/sites.py:204 +msgid "If different from the physical address" +msgstr "Если отличается от физического адреса" + +#: dcim/models/sites.py:238 +msgid "site" +msgstr "место" + +#: dcim/models/sites.py:239 +msgid "sites" +msgstr "сайтов" + +#: dcim/models/sites.py:303 +msgid "A location with this name already exists within the specified site." +msgstr "Местоположение с таким именем уже существует на указанном сайте." + +#: dcim/models/sites.py:313 +msgid "A location with this slug already exists within the specified site." +msgstr "Местоположение с этим слайгом уже существует на указанном сайте." + +#: dcim/models/sites.py:316 +msgid "location" +msgstr "расположение" + +#: dcim/models/sites.py:317 +msgid "locations" +msgstr "локаций" + +#: dcim/models/sites.py:331 +#, python-brace-format +msgid "Parent location ({parent}) must belong to the same site ({site})." +msgstr "" +"Местонахождение родителя ({parent}) должен принадлежать тому же сайту " +"({site})." + +#: dcim/tables/cables.py:54 +msgid "Termination A" +msgstr "Прекращение действия A" + +#: dcim/tables/cables.py:59 +msgid "Termination B" +msgstr "Прекращение В" + +#: dcim/tables/cables.py:65 wireless/tables/wirelesslink.py:22 +msgid "Device A" +msgstr "Устройство A" + +#: dcim/tables/cables.py:71 wireless/tables/wirelesslink.py:31 +msgid "Device B" +msgstr "Устройство B" + +#: dcim/tables/cables.py:77 +msgid "Location A" +msgstr "Местоположение A" + +#: dcim/tables/cables.py:83 +msgid "Location B" +msgstr "Местоположение B" + +#: dcim/tables/cables.py:89 +msgid "Rack A" +msgstr "Стеллаж A" + +#: dcim/tables/cables.py:95 +msgid "Rack B" +msgstr "Стеллаж B" + +#: dcim/tables/cables.py:101 +msgid "Site A" +msgstr "Сайт A" + +#: dcim/tables/cables.py:107 +msgid "Site B" +msgstr "Сайт B" + +#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:18 +#: templates/dcim/consoleserverport.html:75 templates/dcim/frontport.html:119 +#: templates/dcim/inventoryitem_edit.html:39 +msgid "Console Port" +msgstr "Консольный порт" + +#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 +#: dcim/tables/connections.py:71 +#: templates/dcim/inc/connection_endpoints.html:16 +msgid "Reachable" +msgstr "Доступен" + +#: dcim/tables/connections.py:46 dcim/tables/devices.py:524 +#: templates/dcim/inventoryitem_edit.html:64 +#: templates/dcim/poweroutlet.html:47 templates/dcim/powerport.html:18 +msgid "Power Port" +msgstr "Порт питания" + +#: dcim/tables/devices.py:94 dcim/tables/devices.py:139 +#: dcim/tables/racks.py:81 dcim/tables/sites.py:143 +#: netbox/navigation/menu.py:57 netbox/navigation/menu.py:61 +#: netbox/navigation/menu.py:63 virtualization/forms/model_forms.py:125 +#: virtualization/tables/clusters.py:83 virtualization/views.py:211 +msgid "Devices" +msgstr "Устройства" + +#: dcim/tables/devices.py:99 dcim/tables/devices.py:144 +#: virtualization/tables/clusters.py:88 +msgid "VMs" +msgstr "виртуальные машины" + +#: dcim/tables/devices.py:133 dcim/tables/devices.py:245 +#: extras/forms/model_forms.py:506 templates/dcim/device.html:114 +#: templates/dcim/device/render_config.html:11 +#: templates/dcim/device/render_config.html:15 +#: templates/dcim/devicerole.html:47 templates/dcim/platform.html:44 +#: templates/extras/configtemplate.html:10 +#: templates/virtualization/virtualmachine.html:47 +#: templates/virtualization/virtualmachine/render_config.html:11 +#: templates/virtualization/virtualmachine/render_config.html:15 +#: virtualization/tables/virtualmachines.py:93 +msgid "Config Template" +msgstr "Шаблон конфигурации" + +#: dcim/tables/devices.py:216 dcim/tables/devices.py:1069 +#: ipam/forms/bulk_import.py:511 ipam/forms/model_forms.py:296 +#: ipam/tables/ip.py:352 ipam/tables/ip.py:418 ipam/tables/ip.py:441 +#: templates/ipam/ipaddress.html:12 templates/ipam/ipaddress_edit.html:14 +#: virtualization/tables/virtualmachines.py:81 +msgid "IP Address" +msgstr "IP-адрес" + +#: dcim/tables/devices.py:220 dcim/tables/devices.py:1073 +#: virtualization/tables/virtualmachines.py:72 +msgid "IPv4 Address" +msgstr "Адрес IPv4" + +#: dcim/tables/devices.py:224 dcim/tables/devices.py:1077 +#: virtualization/tables/virtualmachines.py:76 +msgid "IPv6 Address" +msgstr "Адрес IPv6" + +#: dcim/tables/devices.py:239 +msgid "VC Position" +msgstr "Позиция VC" + +#: dcim/tables/devices.py:242 +msgid "VC Priority" +msgstr "Приоритет VC" + +#: dcim/tables/devices.py:249 templates/dcim/device_edit.html:38 +#: templates/dcim/devicebay_populate.html:16 +msgid "Parent Device" +msgstr "Родительское устройство" + +#: dcim/tables/devices.py:254 +msgid "Position (Device Bay)" +msgstr "Положение (отсек для устройств)" + +#: dcim/tables/devices.py:263 +msgid "Console ports" +msgstr "Консольные порты" + +#: dcim/tables/devices.py:266 +msgid "Console server ports" +msgstr "Порты консольного сервера" + +#: dcim/tables/devices.py:269 +msgid "Power ports" +msgstr "Порты питания" + +#: dcim/tables/devices.py:272 +msgid "Power outlets" +msgstr "Розетки питания" + +#: dcim/tables/devices.py:275 dcim/tables/devices.py:1082 +#: dcim/tables/devicetypes.py:125 dcim/views.py:1002 dcim/views.py:1241 +#: dcim/views.py:1927 netbox/navigation/menu.py:82 +#: netbox/navigation/menu.py:238 templates/dcim/device/base.html:37 +#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 +#: templates/dcim/module.html:34 templates/dcim/moduletype/base.html:34 +#: templates/dcim/virtualdevicecontext.html:64 +#: templates/dcim/virtualdevicecontext.html:85 +#: templates/virtualization/virtualmachine/base.html:27 +#: templates/virtualization/virtualmachine_list.html:14 +#: virtualization/tables/virtualmachines.py:87 virtualization/views.py:368 +#: wireless/tables/wirelesslan.py:55 +msgid "Interfaces" +msgstr "Интерфейсы" + +#: dcim/tables/devices.py:278 +msgid "Front ports" +msgstr "Передние порты" + +#: dcim/tables/devices.py:284 +msgid "Device bays" +msgstr "Отсеки для устройств" + +#: dcim/tables/devices.py:287 +msgid "Module bays" +msgstr "Отсеки для модулей" + +#: dcim/tables/devices.py:290 +msgid "Inventory items" +msgstr "Инвентарные предметы" + +#: dcim/tables/devices.py:329 dcim/tables/modules.py:56 +#: templates/dcim/modulebay.html:17 +msgid "Module Bay" +msgstr "Модульный отсек" + +#: dcim/tables/devices.py:350 +msgid "Cable Color" +msgstr "Цвет кабеля" + +#: dcim/tables/devices.py:356 +msgid "Link Peers" +msgstr "Узлы ссылок" + +#: dcim/tables/devices.py:359 +msgid "Mark Connected" +msgstr "Отметить подключение" + +#: dcim/tables/devices.py:470 +msgid "Maximum draw (W)" +msgstr "Максимальная потребляемая мощность (Вт)" + +#: dcim/tables/devices.py:473 +msgid "Allocated draw (W)" +msgstr "Распределенная жеребьевка (W)" + +#: dcim/tables/devices.py:573 ipam/forms/model_forms.py:707 +#: ipam/tables/fhrp.py:28 ipam/views.py:597 ipam/views.py:671 +#: netbox/navigation/menu.py:146 netbox/navigation/menu.py:148 +#: templates/dcim/interface.html:351 templates/ipam/ipaddress_bulk_add.html:15 +#: templates/ipam/service.html:43 templates/virtualization/vminterface.html:88 +#: vpn/tables/tunnels.py:94 +msgid "IP Addresses" +msgstr "IP-адреса" + +#: dcim/tables/devices.py:579 netbox/navigation/menu.py:190 +#: templates/ipam/inc/panels/fhrp_groups.html:5 +msgid "FHRP Groups" +msgstr "Группы FHRP" + +#: dcim/tables/devices.py:591 templates/dcim/interface.html:90 +#: templates/virtualization/vminterface.html:70 templates/vpn/tunnel.html:18 +#: templates/vpn/tunneltermination.html:14 vpn/forms/bulk_edit.py:75 +#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:41 +#: vpn/forms/filtersets.py:81 vpn/forms/model_forms.py:59 +#: vpn/forms/model_forms.py:144 vpn/tables/tunnels.py:74 +msgid "Tunnel" +msgstr "Туннель" + +#: dcim/tables/devices.py:616 dcim/tables/devicetypes.py:224 +#: templates/dcim/interface.html:66 +msgid "Management Only" +msgstr "Только управление" + +#: dcim/tables/devices.py:624 +msgid "Wireless link" +msgstr "Беспроводная связь" + +#: dcim/tables/devices.py:634 +msgid "VDCs" +msgstr "VDC" + +#: dcim/tables/devices.py:642 dcim/tables/devicetypes.py:48 +#: dcim/tables/devicetypes.py:140 dcim/views.py:1077 dcim/views.py:2020 +#: netbox/navigation/menu.py:91 templates/dcim/device/base.html:52 +#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 +#: templates/dcim/inc/panels/inventory_items.html:5 +#: templates/dcim/inventoryitemrole.html:33 +msgid "Inventory Items" +msgstr "Предметы инвентаря" + +#: dcim/tables/devices.py:723 +#: templates/circuits/inc/circuit_termination.html:80 +#: templates/dcim/consoleport.html:81 templates/dcim/consoleserverport.html:81 +#: templates/dcim/frontport.html:53 templates/dcim/frontport.html:125 +#: templates/dcim/interface.html:196 templates/dcim/inventoryitem_edit.html:69 +#: templates/dcim/rearport.html:18 templates/dcim/rearport.html:115 +msgid "Rear Port" +msgstr "Задний порт" + +#: dcim/tables/devices.py:888 templates/dcim/modulebay.html:51 +msgid "Installed Module" +msgstr "Установленный модуль" + +#: dcim/tables/devices.py:891 +msgid "Module Serial" +msgstr "Серийный номер модуля" + +#: dcim/tables/devices.py:895 +msgid "Module Asset Tag" +msgstr "Тег активов модуля" + +#: dcim/tables/devices.py:904 +msgid "Module Status" +msgstr "Состояние модуля" + +#: dcim/tables/devices.py:946 dcim/tables/devicetypes.py:308 +#: templates/dcim/inventoryitem.html:41 +msgid "Component" +msgstr "Компонент" + +#: dcim/tables/devices.py:1001 +msgid "Items" +msgstr "Предметы" + +#: dcim/tables/devicetypes.py:38 netbox/navigation/menu.py:72 +#: netbox/navigation/menu.py:74 +msgid "Device Types" +msgstr "Типы устройств" + +#: dcim/tables/devicetypes.py:43 netbox/navigation/menu.py:75 +msgid "Module Types" +msgstr "Типы модулей" + +#: dcim/tables/devicetypes.py:53 extras/forms/filtersets.py:379 +#: extras/forms/model_forms.py:414 netbox/navigation/menu.py:66 +msgid "Platforms" +msgstr "Платформы" + +#: dcim/tables/devicetypes.py:85 templates/dcim/devicetype.html:32 +msgid "Default Platform" +msgstr "Платформа по умолчанию" + +#: dcim/tables/devicetypes.py:89 templates/dcim/devicetype.html:48 +msgid "Full Depth" +msgstr "Полная глубина" + +#: dcim/tables/devicetypes.py:98 +msgid "U Height" +msgstr "Высота U" + +#: dcim/tables/devicetypes.py:110 dcim/tables/modules.py:26 +msgid "Instances" +msgstr "Инстансы" + +#: dcim/tables/devicetypes.py:113 dcim/views.py:942 dcim/views.py:1181 +#: dcim/views.py:1867 netbox/navigation/menu.py:85 +#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 +#: templates/dcim/devicetype/base.html:22 templates/dcim/module.html:22 +#: templates/dcim/moduletype/base.html:22 +msgid "Console Ports" +msgstr "Порты консоли" + +#: dcim/tables/devicetypes.py:116 dcim/views.py:957 dcim/views.py:1196 +#: dcim/views.py:1882 netbox/navigation/menu.py:86 +#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 +#: templates/dcim/devicetype/base.html:25 templates/dcim/module.html:25 +#: templates/dcim/moduletype/base.html:25 +msgid "Console Server Ports" +msgstr "Порты консольного сервера" + +#: dcim/tables/devicetypes.py:119 dcim/views.py:972 dcim/views.py:1211 +#: dcim/views.py:1897 netbox/navigation/menu.py:87 +#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 +#: templates/dcim/devicetype/base.html:28 templates/dcim/module.html:28 +#: templates/dcim/moduletype/base.html:28 +msgid "Power Ports" +msgstr "Порты питания" + +#: dcim/tables/devicetypes.py:122 dcim/views.py:987 dcim/views.py:1226 +#: dcim/views.py:1912 netbox/navigation/menu.py:88 +#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 +#: templates/dcim/devicetype/base.html:31 templates/dcim/module.html:31 +#: templates/dcim/moduletype/base.html:31 +msgid "Power Outlets" +msgstr "Розетки питания" + +#: dcim/tables/devicetypes.py:128 dcim/views.py:1017 dcim/views.py:1256 +#: dcim/views.py:1948 netbox/navigation/menu.py:83 +#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 +#: templates/dcim/module.html:37 templates/dcim/moduletype/base.html:37 +msgid "Front Ports" +msgstr "Передние порты" + +#: dcim/tables/devicetypes.py:131 dcim/views.py:1032 dcim/views.py:1271 +#: dcim/views.py:1963 netbox/navigation/menu.py:84 +#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 +#: templates/dcim/devicetype/base.html:40 templates/dcim/module.html:40 +#: templates/dcim/moduletype/base.html:40 +msgid "Rear Ports" +msgstr "Задние порты" + +#: dcim/tables/devicetypes.py:134 dcim/views.py:1062 dcim/views.py:2001 +#: netbox/navigation/menu.py:90 templates/dcim/device/base.html:49 +#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +msgid "Device Bays" +msgstr "Отсеки для устройств" + +#: dcim/tables/devicetypes.py:137 dcim/views.py:1047 dcim/views.py:1982 +#: netbox/navigation/menu.py:89 templates/dcim/device/base.html:46 +#: templates/dcim/device_list.html:64 templates/dcim/devicetype/base.html:43 +msgid "Module Bays" +msgstr "Отсеки для модулей" + +#: dcim/tables/power.py:36 netbox/navigation/menu.py:282 +#: templates/core/configrevision.html:59 templates/dcim/powerpanel.html:53 +msgid "Power Feeds" +msgstr "Источники питания" + +#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:106 +msgid "Max Utilization" +msgstr "Максимальное использование" + +#: dcim/tables/power.py:84 +msgid "Available Power (VA)" +msgstr "Доступная мощность (ВА)" + +#: dcim/tables/racks.py:29 dcim/tables/sites.py:138 +#: netbox/navigation/menu.py:25 netbox/navigation/menu.py:27 +msgid "Racks" +msgstr "Стеллажи" + +#: dcim/tables/racks.py:73 templates/dcim/device.html:323 +#: templates/dcim/rack.html:95 +msgid "Height" +msgstr "Высота" + +#: dcim/tables/racks.py:85 +msgid "Space" +msgstr "Космос" + +#: dcim/tables/racks.py:96 templates/dcim/rack.html:105 +msgid "Outer Width" +msgstr "Внешняя ширина" + +#: dcim/tables/racks.py:100 templates/dcim/rack.html:115 +msgid "Outer Depth" +msgstr "Внешняя глубина" + +#: dcim/tables/racks.py:108 +msgid "Max Weight" +msgstr "Максимальный вес" + +#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 +#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:394 +#: ipam/forms/bulk_edit.py:128 ipam/forms/model_forms.py:152 +#: ipam/tables/asn.py:66 netbox/navigation/menu.py:16 +#: netbox/navigation/menu.py:18 +msgid "Sites" +msgstr "Сайты" + +#: dcim/views.py:131 +#, python-brace-format +msgid "Disconnected {count} {type}" +msgstr "Отключен {count} {type}" + +#: dcim/views.py:692 netbox/navigation/menu.py:29 +msgid "Reservations" +msgstr "Бронирование" + +#: dcim/views.py:711 +msgid "Non-Racked Devices" +msgstr "Устройства без стоек" + +#: dcim/views.py:2033 extras/forms/model_forms.py:454 +#: templates/extras/configcontext.html:10 +#: virtualization/forms/model_forms.py:228 virtualization/views.py:408 +msgid "Config Context" +msgstr "Контекст конфигурации" + +#: dcim/views.py:2043 virtualization/views.py:418 +msgid "Render Config" +msgstr "Конфигурация рендера" + +#: dcim/views.py:2971 ipam/tables/ip.py:233 +msgid "Children" +msgstr "Дети" + +#: extras/choices.py:27 extras/forms/misc.py:14 +msgid "Text" +msgstr "Текст" + +#: extras/choices.py:28 +msgid "Text (long)" +msgstr "Текст (длинный)" + +#: extras/choices.py:29 +msgid "Integer" +msgstr "Целое число" + +#: extras/choices.py:30 +msgid "Decimal" +msgstr "Десятичный" + +#: extras/choices.py:31 +msgid "Boolean (true/false)" +msgstr "Логическое значение (истинно/ложь)" + +#: extras/choices.py:32 +msgid "Date" +msgstr "Дата" + +#: extras/choices.py:33 +msgid "Date & time" +msgstr "Дата и время" + +#: extras/choices.py:35 +msgid "JSON" +msgstr "JSON" + +#: extras/choices.py:36 +msgid "Selection" +msgstr "Отбор" + +#: extras/choices.py:37 +msgid "Multiple selection" +msgstr "Множественный выбор" + +#: extras/choices.py:39 +msgid "Multiple objects" +msgstr "Несколько объектов" + +#: extras/choices.py:50 templates/extras/customfield.html:69 vpn/choices.py:20 +#: wireless/choices.py:27 +msgid "Disabled" +msgstr "Инвалид" + +#: extras/choices.py:51 +msgid "Loose" +msgstr "Свободный" + +#: extras/choices.py:52 +msgid "Exact" +msgstr "Точный" + +#: extras/choices.py:63 +msgid "Always" +msgstr "Всегда" + +#: extras/choices.py:64 +msgid "If set" +msgstr "Если установлено" + +#: extras/choices.py:65 extras/choices.py:78 +msgid "Hidden" +msgstr "Скрытый" + +#: extras/choices.py:76 +msgid "Yes" +msgstr "Да" + +#: extras/choices.py:77 +msgid "No" +msgstr "Нет" + +#: extras/choices.py:105 templates/tenancy/contact.html:58 +#: tenancy/forms/bulk_edit.py:117 wireless/forms/model_forms.py:159 +msgid "Link" +msgstr "Ссылка" + +#: extras/choices.py:119 +msgid "Newest" +msgstr "Новейший" + +#: extras/choices.py:120 +msgid "Oldest" +msgstr "Самый старый" + +#: extras/choices.py:136 templates/generic/object.html:51 +msgid "Updated" +msgstr "Обновлено" + +#: extras/choices.py:137 +msgid "Deleted" +msgstr "Удалено" + +#: extras/choices.py:154 extras/choices.py:176 +msgid "Info" +msgstr "Информация" + +#: extras/choices.py:155 extras/choices.py:175 +msgid "Success" +msgstr "Успех" + +#: extras/choices.py:156 extras/choices.py:177 +msgid "Warning" +msgstr "Предупреждение" + +#: extras/choices.py:157 +msgid "Danger" +msgstr "Опасность" + +#: extras/choices.py:174 utilities/choices.py:190 +msgid "Default" +msgstr "По умолчанию" + +#: extras/choices.py:178 +msgid "Failure" +msgstr "Неудача" + +#: extras/choices.py:185 +msgid "Hourly" +msgstr "Ежечасно" + +#: extras/choices.py:186 +msgid "12 hours" +msgstr "12 часов" + +#: extras/choices.py:187 +msgid "Daily" +msgstr "Ежедневно" + +#: extras/choices.py:188 +msgid "Weekly" +msgstr "Еженедельно" + +#: extras/choices.py:189 +msgid "30 days" +msgstr "30 дней" + +#: extras/choices.py:254 extras/tables/tables.py:287 +#: templates/dcim/virtualchassis_edit.html:108 +#: templates/extras/eventrule.html:51 +#: templates/generic/bulk_add_component.html:56 +#: templates/generic/object_edit.html:29 templates/generic/object_edit.html:70 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +msgid "Create" +msgstr "Создайте" + +#: extras/choices.py:255 extras/tables/tables.py:290 +#: templates/extras/eventrule.html:55 +msgid "Update" +msgstr "Обновить" + +#: extras/choices.py:256 extras/tables/tables.py:293 +#: templates/circuits/inc/circuit_termination.html:22 +#: templates/dcim/devicetype/component_templates.html:24 +#: templates/dcim/inc/panels/inventory_items.html:29 +#: templates/dcim/moduletype/component_templates.html:24 +#: templates/dcim/powerpanel.html:71 templates/extras/eventrule.html:59 +#: templates/extras/report_list.html:34 templates/extras/script_list.html:33 +#: templates/generic/bulk_delete.html:18 templates/generic/bulk_delete.html:45 +#: templates/generic/object_delete.html:15 templates/htmx/delete_form.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:35 +#: templates/users/objectpermission.html:49 +#: utilities/templates/buttons/delete.html:9 +msgid "Delete" +msgstr "Удалить" + +#: extras/choices.py:280 utilities/choices.py:143 utilities/choices.py:191 +msgid "Blue" +msgstr "голубой" + +#: extras/choices.py:281 utilities/choices.py:142 utilities/choices.py:192 +msgid "Indigo" +msgstr "Индиго" + +#: extras/choices.py:282 utilities/choices.py:140 utilities/choices.py:193 +msgid "Purple" +msgstr "Пурпурный" + +#: extras/choices.py:283 utilities/choices.py:137 utilities/choices.py:194 +msgid "Pink" +msgstr "Розовый" + +#: extras/choices.py:284 utilities/choices.py:136 utilities/choices.py:195 +msgid "Red" +msgstr "Красный" + +#: extras/choices.py:285 utilities/choices.py:154 utilities/choices.py:196 +msgid "Orange" +msgstr "оранжевый" + +#: extras/choices.py:286 utilities/choices.py:152 utilities/choices.py:197 +msgid "Yellow" +msgstr "Желтый" + +#: extras/choices.py:287 utilities/choices.py:149 utilities/choices.py:198 +msgid "Green" +msgstr "Зелёный" + +#: extras/choices.py:288 utilities/choices.py:146 utilities/choices.py:199 +msgid "Teal" +msgstr "чирок" + +#: extras/choices.py:289 utilities/choices.py:145 utilities/choices.py:200 +msgid "Cyan" +msgstr "Голубой" + +#: extras/choices.py:290 utilities/choices.py:201 +msgid "Gray" +msgstr "Серый" + +#: extras/choices.py:291 utilities/choices.py:160 utilities/choices.py:202 +msgid "Black" +msgstr "Черный" + +#: extras/choices.py:292 utilities/choices.py:161 utilities/choices.py:203 +msgid "White" +msgstr "белый" + +#: extras/choices.py:306 extras/forms/model_forms.py:233 +#: extras/forms/model_forms.py:321 templates/extras/webhook.html:11 +msgid "Webhook" +msgstr "Вебхук" + +#: extras/choices.py:307 templates/extras/script/base.html:29 +msgid "Script" +msgstr "Сценарий" + +#: extras/dashboard/forms.py:38 +msgid "Widget type" +msgstr "Тип виджета" + +#: extras/dashboard/widgets.py:148 +msgid "Note" +msgstr "Примечание" + +#: extras/dashboard/widgets.py:149 +msgid "Display some arbitrary custom content. Markdown is supported." +msgstr "" +"Отобразите произвольный пользовательский контент. Поддерживается Markdown." + +#: extras/dashboard/widgets.py:162 +msgid "Object Counts" +msgstr "Количество объектов" + +#: extras/dashboard/widgets.py:163 +msgid "" +"Display a set of NetBox models and the number of objects created for each " +"type." +msgstr "" +"Отобразите набор моделей NetBox и количество объектов, созданных для каждого" +" типа." + +#: extras/dashboard/widgets.py:173 +msgid "Filters to apply when counting the number of objects" +msgstr "Фильтры, применяемые при подсчете количества объектов" + +#: extras/dashboard/widgets.py:209 +msgid "Object List" +msgstr "Список объектов" + +#: extras/dashboard/widgets.py:210 +msgid "Display an arbitrary list of objects." +msgstr "Отобразите произвольный список объектов." + +#: extras/dashboard/widgets.py:223 +msgid "The default number of objects to display" +msgstr "Количество отображаемых объектов по умолчанию" + +#: extras/dashboard/widgets.py:270 +msgid "RSS Feed" +msgstr "RSS-канал" + +#: extras/dashboard/widgets.py:275 +msgid "Embed an RSS feed from an external website." +msgstr "Вставьте RSS-канал с внешнего веб-сайта." + +#: extras/dashboard/widgets.py:282 +msgid "Feed URL" +msgstr "URL-адрес ленты" + +#: extras/dashboard/widgets.py:287 +msgid "The maximum number of objects to display" +msgstr "Максимальное количество отображаемых объектов" + +#: extras/dashboard/widgets.py:292 +msgid "How long to stored the cached content (in seconds)" +msgstr "Как долго хранить кэшированный контент (в секундах)" + +#: extras/dashboard/widgets.py:344 templates/account/base.html:10 +#: templates/account/bookmarks.html:7 templates/inc/profile_button.html:29 +msgid "Bookmarks" +msgstr "Закладки" + +#: extras/dashboard/widgets.py:348 +msgid "Show your personal bookmarks" +msgstr "Покажите свои личные закладки" + +#: extras/filtersets.py:207 extras/filtersets.py:542 extras/filtersets.py:570 +msgid "Data file (ID)" +msgstr "Файл данных (ID)" + +#: extras/filtersets.py:479 virtualization/forms/filtersets.py:114 +msgid "Cluster type" +msgstr "Тип кластера" + +#: extras/filtersets.py:485 virtualization/filtersets.py:95 +#: virtualization/filtersets.py:146 +msgid "Cluster type (slug)" +msgstr "Тип кластера (слизень)" + +#: extras/filtersets.py:490 ipam/forms/bulk_edit.py:475 +#: ipam/forms/model_forms.py:585 virtualization/forms/filtersets.py:108 +msgid "Cluster group" +msgstr "Кластерная группа" + +#: extras/filtersets.py:496 virtualization/filtersets.py:135 +msgid "Cluster group (slug)" +msgstr "Кластерная группа (slug)" + +#: extras/filtersets.py:506 tenancy/forms/forms.py:16 +#: tenancy/forms/forms.py:39 +msgid "Tenant group" +msgstr "Группа арендаторов" + +#: extras/filtersets.py:512 tenancy/filtersets.py:163 +#: tenancy/filtersets.py:183 +msgid "Tenant group (slug)" +msgstr "Группа арендаторов (slug)" + +#: extras/filtersets.py:528 templates/extras/tag.html:12 +msgid "Tag" +msgstr "Тег" + +#: extras/filtersets.py:534 +msgid "Tag (slug)" +msgstr "Тег (пуля)" + +#: extras/filtersets.py:594 extras/forms/filtersets.py:438 +msgid "Has local config context data" +msgstr "Имеет локальные контекстные данные конфигурации" + +#: extras/filtersets.py:619 +msgid "User name" +msgstr "Имя пользователя" + +#: extras/forms/bulk_edit.py:32 extras/forms/filtersets.py:56 +msgid "Group name" +msgstr "Название группы" + +#: extras/forms/bulk_edit.py:40 extras/forms/filtersets.py:64 +#: extras/tables/tables.py:47 templates/extras/customfield.html:39 +#: templates/generic/bulk_import.html:116 +msgid "Required" +msgstr "Требуется" + +#: extras/forms/bulk_edit.py:53 extras/forms/bulk_import.py:57 +#: extras/forms/filtersets.py:78 extras/models/customfields.py:193 +msgid "UI visible" +msgstr "Видимый пользовательский интерфейс" + +#: extras/forms/bulk_edit.py:58 extras/forms/bulk_import.py:63 +#: extras/forms/filtersets.py:83 extras/models/customfields.py:200 +msgid "UI editable" +msgstr "Редактируемый пользовательский интерфейс" + +#: extras/forms/bulk_edit.py:63 extras/forms/filtersets.py:86 +msgid "Is cloneable" +msgstr "Можно клонировать" + +#: extras/forms/bulk_edit.py:102 extras/forms/filtersets.py:126 +msgid "New window" +msgstr "Новое окно" + +#: extras/forms/bulk_edit.py:111 +msgid "Button class" +msgstr "Класс кнопки" + +#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:164 +#: extras/models/models.py:439 +msgid "MIME type" +msgstr "Тип MIME" + +#: extras/forms/bulk_edit.py:133 extras/forms/filtersets.py:167 +msgid "File extension" +msgstr "Расширение файла" + +#: extras/forms/bulk_edit.py:138 extras/forms/filtersets.py:171 +msgid "As attachment" +msgstr "В качестве вложения" + +#: extras/forms/bulk_edit.py:166 extras/forms/filtersets.py:213 +#: extras/tables/tables.py:214 templates/extras/savedfilter.html:30 +msgid "Shared" +msgstr "Общий" + +#: extras/forms/bulk_edit.py:189 extras/forms/filtersets.py:242 +#: extras/models/models.py:204 +msgid "HTTP method" +msgstr "Метод HTTP" + +#: extras/forms/bulk_edit.py:193 extras/forms/filtersets.py:236 +#: templates/extras/webhook.html:37 +msgid "Payload URL" +msgstr "URL-адрес полезной нагрузки" + +#: extras/forms/bulk_edit.py:198 extras/models/models.py:244 +msgid "SSL verification" +msgstr "Проверка SSL" + +#: extras/forms/bulk_edit.py:201 templates/extras/webhook.html:45 +msgid "Secret" +msgstr "Секрет" + +#: extras/forms/bulk_edit.py:206 +msgid "CA file path" +msgstr "Путь к файлу CA" + +#: extras/forms/bulk_edit.py:225 +msgid "On create" +msgstr "При создании" + +#: extras/forms/bulk_edit.py:230 +msgid "On update" +msgstr "При обновлении" + +#: extras/forms/bulk_edit.py:235 +msgid "On delete" +msgstr "При удалении" + +#: extras/forms/bulk_edit.py:240 +msgid "On job start" +msgstr "При начале работы" + +#: extras/forms/bulk_edit.py:245 +msgid "On job end" +msgstr "По окончании работы" + +#: extras/forms/bulk_edit.py:282 +msgid "Is active" +msgstr "Активен" + +#: extras/forms/bulk_import.py:34 extras/forms/bulk_import.py:115 +#: extras/forms/bulk_import.py:130 extras/forms/bulk_import.py:153 +#: extras/forms/bulk_import.py:177 extras/forms/filtersets.py:114 +#: extras/forms/filtersets.py:160 extras/forms/filtersets.py:201 +#: extras/forms/model_forms.py:43 extras/forms/model_forms.py:127 +#: extras/forms/model_forms.py:154 extras/forms/model_forms.py:195 +#: extras/forms/model_forms.py:251 +msgid "Content types" +msgstr "Типы контента" + +#: extras/forms/bulk_import.py:36 extras/forms/bulk_import.py:117 +#: extras/forms/bulk_import.py:132 extras/forms/bulk_import.py:155 +#: extras/forms/bulk_import.py:179 tenancy/forms/bulk_import.py:96 +msgid "One or more assigned object types" +msgstr "Один или несколько назначенных типов объектов" + +#: extras/forms/bulk_import.py:41 +msgid "Field data type (e.g. text, integer, etc.)" +msgstr "Тип данных поля (например, текст, целое число и т. д.)" + +#: extras/forms/bulk_import.py:44 extras/forms/filtersets.py:48 +#: extras/forms/filtersets.py:259 extras/forms/model_forms.py:47 +#: extras/forms/model_forms.py:221 tenancy/forms/filtersets.py:91 +msgid "Object type" +msgstr "Тип объекта" + +#: extras/forms/bulk_import.py:47 +msgid "Object type (for object or multi-object fields)" +msgstr "" +"Тип объекта (для полей объектов или полей, состоящих из нескольких объектов)" + +#: extras/forms/bulk_import.py:50 extras/forms/filtersets.py:73 +msgid "Choice set" +msgstr "Набор для выбора" + +#: extras/forms/bulk_import.py:54 +msgid "Choice set (for selection fields)" +msgstr "Набор вариантов (для полей выбора)" + +#: extras/forms/bulk_import.py:60 +msgid "Whether the custom field is displayed in the UI" +msgstr "Отображается ли настраиваемое поле в пользовательском интерфейсе" + +#: extras/forms/bulk_import.py:66 +msgid "Whether the custom field is editable in the UI" +msgstr "" +"Доступно ли редактирование настраиваемого поля в пользовательском интерфейсе" + +#: extras/forms/bulk_import.py:82 +msgid "The base set of predefined choices to use (if any)" +msgstr "Базовый набор стандартных вариантов для использования (если есть)" + +#: extras/forms/bulk_import.py:88 +msgid "" +"Quoted string of comma-separated field choices with optional labels " +"separated by colon: \"choice1:First Choice,choice2:Second Choice\"" +msgstr "" +"Цитируемая строка с вариантами выбора полей, разделенных запятыми, с " +"дополнительными метками, разделенными двоеточием: «Choice1:First Choice, " +"Choice2:Second Choice»" + +#: extras/forms/bulk_import.py:182 +msgid "Action object" +msgstr "Объект действия" + +#: extras/forms/bulk_import.py:184 +msgid "Webhook name or script as dotted path module.Class" +msgstr "Имя веб-хука или скрипт в виде пунктирного пути module.Class" + +#: extras/forms/bulk_import.py:236 +msgid "Assigned object type" +msgstr "Назначенный тип объекта" + +#: extras/forms/bulk_import.py:241 +msgid "The classification of entry" +msgstr "Классификация записей" + +#: extras/forms/filtersets.py:53 +msgid "Field type" +msgstr "Тип поля" + +#: extras/forms/filtersets.py:97 extras/tables/tables.py:65 +#: templates/generic/bulk_import.html:148 +msgid "Choices" +msgstr "Варианты" + +#: extras/forms/filtersets.py:141 extras/forms/filtersets.py:327 +#: extras/forms/filtersets.py:417 extras/forms/model_forms.py:449 +#: templates/core/job.html:86 templates/extras/configcontext.html:86 +#: templates/extras/eventrule.html:111 +msgid "Data" +msgstr "Данные" + +#: extras/forms/filtersets.py:152 extras/forms/filtersets.py:341 +#: extras/forms/filtersets.py:427 utilities/choices.py:219 +#: utilities/forms/bulk_import.py:27 +msgid "Data file" +msgstr "Файл данных" + +#: extras/forms/filtersets.py:185 +msgid "Content type" +msgstr "Тип контента" + +#: extras/forms/filtersets.py:232 extras/models/models.py:209 +msgid "HTTP content type" +msgstr "Тип содержимого HTTP" + +#: extras/forms/filtersets.py:254 extras/forms/model_forms.py:269 +#: templates/extras/eventrule.html:46 +msgid "Events" +msgstr "События" + +#: extras/forms/filtersets.py:264 +msgid "Action type" +msgstr "Тип действия" + +#: extras/forms/filtersets.py:278 +msgid "Object creations" +msgstr "Создание объектов" + +#: extras/forms/filtersets.py:285 +msgid "Object updates" +msgstr "Обновления объектов" + +#: extras/forms/filtersets.py:292 +msgid "Object deletions" +msgstr "Удаление объектов" + +#: extras/forms/filtersets.py:299 +msgid "Job starts" +msgstr "Задание начинается" + +#: extras/forms/filtersets.py:306 extras/forms/model_forms.py:289 +msgid "Job terminations" +msgstr "Прекращение работы" + +#: extras/forms/filtersets.py:315 +msgid "Tagged object type" +msgstr "Тип объекта с тегами" + +#: extras/forms/filtersets.py:320 +msgid "Allowed object type" +msgstr "Разрешенный тип объекта" + +#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:384 +#: netbox/navigation/menu.py:19 +msgid "Regions" +msgstr "Регионы" + +#: extras/forms/filtersets.py:354 extras/forms/model_forms.py:389 +msgid "Site groups" +msgstr "Группы сайтов" + +#: extras/forms/filtersets.py:364 extras/forms/model_forms.py:399 +#: netbox/navigation/menu.py:21 +msgid "Locations" +msgstr "Местоположения" + +#: extras/forms/filtersets.py:369 extras/forms/model_forms.py:404 +msgid "Device types" +msgstr "Типы устройств" + +#: extras/forms/filtersets.py:374 extras/forms/model_forms.py:409 +msgid "Roles" +msgstr "Роли" + +#: extras/forms/filtersets.py:384 extras/forms/model_forms.py:419 +msgid "Cluster types" +msgstr "Типы кластеров" + +#: extras/forms/filtersets.py:390 extras/forms/model_forms.py:424 +msgid "Cluster groups" +msgstr "Кластерные группы" + +#: extras/forms/filtersets.py:395 extras/forms/model_forms.py:429 +#: netbox/navigation/menu.py:243 netbox/navigation/menu.py:245 +#: templates/virtualization/clustertype.html:33 +#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +msgid "Clusters" +msgstr "Кластеры" + +#: extras/forms/filtersets.py:400 extras/forms/model_forms.py:434 +msgid "Tenant groups" +msgstr "Группы арендаторов" + +#: extras/forms/filtersets.py:454 extras/forms/filtersets.py:495 +msgid "After" +msgstr "После" + +#: extras/forms/filtersets.py:459 extras/forms/filtersets.py:500 +msgid "Before" +msgstr "До" + +#: extras/forms/filtersets.py:490 extras/tables/tables.py:426 +#: templates/extras/htmx/report_result.html:43 +#: templates/extras/objectchange.html:34 +msgid "Time" +msgstr "Время" + +#: extras/forms/filtersets.py:504 extras/forms/model_forms.py:271 +#: extras/tables/tables.py:440 templates/extras/eventrule.html:90 +#: templates/extras/objectchange.html:50 +msgid "Action" +msgstr "Действие" + +#: extras/forms/model_forms.py:50 +msgid "Type of the related object (for object/multi-object fields only)" +msgstr "" +"Тип связанного объекта (только для полей объектов/нескольких объектов)" + +#: extras/forms/model_forms.py:58 templates/extras/customfield.html:11 +msgid "Custom Field" +msgstr "Настраиваемое поле" + +#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +msgid "Behavior" +msgstr "Поведение" + +#: extras/forms/model_forms.py:62 +msgid "Values" +msgstr "Ценности" + +#: extras/forms/model_forms.py:71 +msgid "" +"The type of data stored in this field. For object/multi-object fields, " +"select the related object type below." +msgstr "" +"Тип данных, хранящихся в этом поле. Для полей объектов или полей, состоящих " +"из нескольких объектов, выберите соответствующий тип объекта ниже." + +#: extras/forms/model_forms.py:74 +msgid "" +"This will be displayed as help text for the form field. Markdown is " +"supported." +msgstr "" +"Это будет отображаться в виде справочного текста для поля формы. " +"Поддерживается функция Markdown." + +#: extras/forms/model_forms.py:91 +msgid "" +"Enter one choice per line. An optional label may be specified for each " +"choice by appending it with a colon. Example:" +msgstr "" +"Введите по одному варианту в строке. Для каждого варианта можно указать " +"дополнительную метку, добавив ее двоеточием. Пример:" + +#: extras/forms/model_forms.py:132 templates/extras/customlink.html:10 +msgid "Custom Link" +msgstr "Настраиваемая ссылка" + +#: extras/forms/model_forms.py:133 +msgid "Templates" +msgstr "Шаблоны" + +#: extras/forms/model_forms.py:145 +msgid "" +"Jinja2 template code for the link text. Reference the object as {{ " +"object }}. Links which render as empty text will not be displayed." +msgstr "" + +#: extras/forms/model_forms.py:148 +msgid "" +"Jinja2 template code for the link URL. Reference the object as {{ " +"object }}." +msgstr "" + +#: extras/forms/model_forms.py:158 extras/forms/model_forms.py:500 +msgid "Template code" +msgstr "Код шаблона" + +#: extras/forms/model_forms.py:164 templates/extras/exporttemplate.html:17 +msgid "Export Template" +msgstr "Шаблон экспорта" + +#: extras/forms/model_forms.py:166 +msgid "Rendering" +msgstr "Рендеринг" + +#: extras/forms/model_forms.py:180 extras/forms/model_forms.py:525 +msgid "Template content is populated from the remote source selected below." +msgstr "" +"Содержимое шаблона заполняется из удаленного источника, выбранного ниже." + +#: extras/forms/model_forms.py:187 extras/forms/model_forms.py:532 +msgid "Must specify either local content or a data file" +msgstr "Необходимо указать локальное содержимое или файл данных" + +#: extras/forms/model_forms.py:201 netbox/forms/mixins.py:68 +#: templates/extras/savedfilter.html:10 +msgid "Saved Filter" +msgstr "Сохраненный фильтр" + +#: extras/forms/model_forms.py:234 templates/extras/webhook.html:28 +msgid "HTTP Request" +msgstr "HTTP-запрос" + +#: extras/forms/model_forms.py:237 templates/extras/webhook.html:53 +msgid "SSL" +msgstr "SSL" + +#: extras/forms/model_forms.py:255 +msgid "Action choice" +msgstr "Выбор действия" + +#: extras/forms/model_forms.py:260 +msgid "Enter conditions in JSON format." +msgstr "Введите условия в JSON формат." + +#: extras/forms/model_forms.py:264 +msgid "" +"Enter parameters to pass to the action in JSON format." +msgstr "" +"Введите параметры для перехода к действию в JSON формат." + +#: extras/forms/model_forms.py:268 templates/extras/eventrule.html:11 +msgid "Event Rule" +msgstr "Правило мероприятия" + +#: extras/forms/model_forms.py:270 templates/extras/eventrule.html:78 +msgid "Conditions" +msgstr "условия" + +#: extras/forms/model_forms.py:285 +msgid "Creations" +msgstr "Творения" + +#: extras/forms/model_forms.py:286 +msgid "Updates" +msgstr "Обновления" + +#: extras/forms/model_forms.py:287 +msgid "Deletions" +msgstr "Удаления" + +#: extras/forms/model_forms.py:288 +msgid "Job executions" +msgstr "Выполнение заданий" + +#: extras/forms/model_forms.py:366 users/forms/model_forms.py:285 +msgid "Object types" +msgstr "Типы объектов" + +#: extras/forms/model_forms.py:439 netbox/navigation/menu.py:40 +#: tenancy/tables/tenants.py:22 +msgid "Tenants" +msgstr "Арендаторы" + +#: extras/forms/model_forms.py:456 ipam/forms/filtersets.py:141 +#: ipam/forms/filtersets.py:527 templates/extras/configcontext.html:62 +#: templates/ipam/ipaddress.html:62 templates/ipam/vlan_edit.html:30 +#: tenancy/forms/filtersets.py:86 users/forms/model_forms.py:323 +msgid "Assignment" +msgstr "Задание" + +#: extras/forms/model_forms.py:482 +msgid "Data is populated from the remote source selected below." +msgstr "Данные заполняются из удаленного источника, выбранного ниже." + +#: extras/forms/model_forms.py:488 +msgid "Must specify either local data or a data file" +msgstr "Необходимо указать локальные данные или файл данных" + +#: extras/forms/model_forms.py:507 templates/core/datafile.html:65 +msgid "Content" +msgstr "Контент" + +#: extras/forms/reports.py:18 extras/forms/scripts.py:24 +msgid "Schedule at" +msgstr "Расписание на" + +#: extras/forms/reports.py:19 +msgid "Schedule execution of report to a set time" +msgstr "Запланировать выполнение отчета на установленное время" + +#: extras/forms/reports.py:24 extras/forms/scripts.py:30 +msgid "Recurs every" +msgstr "Повторяется каждый" + +#: extras/forms/reports.py:28 +msgid "Interval at which this report is re-run (in minutes)" +msgstr "Интервал повторного запуска отчета (в минутах)" + +#: extras/forms/reports.py:36 extras/forms/scripts.py:42 +#, python-brace-format +msgid " (current time: {now})" +msgstr " (текущее время: {now})" + +#: extras/forms/reports.py:46 extras/forms/scripts.py:52 +msgid "Scheduled time must be in the future." +msgstr "Запланированное время должно быть в будущем." + +#: extras/forms/scripts.py:18 +msgid "Commit changes" +msgstr "Зафиксируйте изменения" + +#: extras/forms/scripts.py:19 +msgid "Commit changes to the database (uncheck for a dry-run)" +msgstr "" +"Зафиксируйте изменения в базе данных (снимите флажок для пробного запуска)" + +#: extras/forms/scripts.py:25 +msgid "Schedule execution of script to a set time" +msgstr "Запланируйте выполнение скрипта на заданное время" + +#: extras/forms/scripts.py:34 +msgid "Interval at which this script is re-run (in minutes)" +msgstr "Интервал повторного запуска этого скрипта (в минутах)" + +#: extras/models/change_logging.py:24 +msgid "time" +msgstr "время" + +#: extras/models/change_logging.py:37 +msgid "user name" +msgstr "имя пользователя" + +#: extras/models/change_logging.py:42 +msgid "request ID" +msgstr "идентификатор запроса" + +#: extras/models/change_logging.py:47 extras/models/staging.py:69 +msgid "action" +msgstr "действие" + +#: extras/models/change_logging.py:81 +msgid "pre-change data" +msgstr "данные перед изменением" + +#: extras/models/change_logging.py:87 +msgid "post-change data" +msgstr "данные после изменений" + +#: extras/models/change_logging.py:101 +msgid "object change" +msgstr "изменение объекта" + +#: extras/models/change_logging.py:102 +msgid "object changes" +msgstr "изменения объекта" + +#: extras/models/change_logging.py:118 +#, python-brace-format +msgid "Change logging is not supported for this object type ({type})." +msgstr "" +"Ведение журнала изменений не поддерживается для этого типа объектов " +"({type})." + +#: extras/models/configs.py:130 +msgid "config context" +msgstr "контекст конфигурации" + +#: extras/models/configs.py:131 +msgid "config contexts" +msgstr "контексты конфигурации" + +#: extras/models/configs.py:149 extras/models/configs.py:205 +msgid "JSON data must be in object form. Example:" +msgstr "Данные JSON должны быть в форме объекта. Пример:" + +#: extras/models/configs.py:169 +msgid "" +"Local config context data takes precedence over source contexts in the final" +" rendered config context" +msgstr "" +"Данные контекста локальной конфигурации имеют приоритет над исходными " +"контекстами в окончательном визуализированном контексте конфигурации" + +#: extras/models/configs.py:224 +msgid "template code" +msgstr "код шаблона" + +#: extras/models/configs.py:225 +msgid "Jinja2 template code." +msgstr "Код шаблона Jinja2." + +#: extras/models/configs.py:228 +msgid "environment parameters" +msgstr "параметры окружения" + +#: extras/models/configs.py:233 +msgid "" +"Any additional" +" parameters to pass when constructing the Jinja2 environment." +msgstr "" +"Любое дополнительные" +" параметры пройти тест при построении среды Jinja2." + +#: extras/models/configs.py:240 +msgid "config template" +msgstr "шаблон конфигурации" + +#: extras/models/configs.py:241 +msgid "config templates" +msgstr "шаблоны конфигураций" + +#: extras/models/customfields.py:72 +msgid "The object(s) to which this field applies." +msgstr "Объекты, к которым относится это поле." + +#: extras/models/customfields.py:79 +msgid "The type of data this custom field holds" +msgstr "Тип данных, которые содержит это настраиваемое поле" + +#: extras/models/customfields.py:86 +msgid "The type of NetBox object this field maps to (for object fields)" +msgstr "" +"Тип объекта NetBox, которому соответствует это поле (для полей объектов)" + +#: extras/models/customfields.py:92 +msgid "Internal field name" +msgstr "Имя внутреннего поля" + +#: extras/models/customfields.py:96 +msgid "Only alphanumeric characters and underscores are allowed." +msgstr "Допустимы только буквенно-цифровые символы и символы подчеркивания." + +#: extras/models/customfields.py:101 +msgid "Double underscores are not permitted in custom field names." +msgstr "" +"В именах настраиваемых полей недопустимо использовать двойное подчеркивание." + +#: extras/models/customfields.py:112 +msgid "" +"Name of the field as displayed to users (if not provided, 'the field's name " +"will be used)" +msgstr "" +"Имя поля, отображаемое пользователям (если оно не указано, будет " +"использовано имя поля)" + +#: extras/models/customfields.py:116 extras/models/models.py:347 +msgid "group name" +msgstr "имя группы" + +#: extras/models/customfields.py:119 +msgid "Custom fields within the same group will be displayed together" +msgstr "Настраиваемые поля в одной группе будут отображаться вместе" + +#: extras/models/customfields.py:127 +msgid "required" +msgstr "требуется" + +#: extras/models/customfields.py:129 +msgid "" +"If true, this field is required when creating new objects or editing an " +"existing object." +msgstr "" +"Если это правда, это поле обязательно для создания новых объектов или " +"редактирования существующего объекта." + +#: extras/models/customfields.py:132 +msgid "search weight" +msgstr "вес поиска" + +#: extras/models/customfields.py:135 +msgid "" +"Weighting for search. Lower values are considered more important. Fields " +"with a search weight of zero will be ignored." +msgstr "" +"Взвешивание для поиска. Более низкие значения считаются более важными. Поля " +"с нулевым весом поиска будут проигнорированы." + +#: extras/models/customfields.py:140 +msgid "filter logic" +msgstr "логика фильтрации" + +#: extras/models/customfields.py:144 +msgid "" +"Loose matches any instance of a given string; exact matches the entire " +"field." +msgstr "" +"Loose соответствует любому экземпляру заданной строки; точно соответствует " +"всему полю." + +#: extras/models/customfields.py:147 +msgid "default" +msgstr "дефолт" + +#: extras/models/customfields.py:151 +msgid "" +"Default value for the field (must be a JSON value). Encapsulate strings with" +" double quotes (e.g. \"Foo\")." +msgstr "" +"Значение по умолчанию для поля (должно быть JSON-значением). Заключайте " +"строки в двойные кавычки (например, «Foo»)." + +#: extras/models/customfields.py:156 +msgid "display weight" +msgstr "вес дисплея" + +#: extras/models/customfields.py:157 +msgid "Fields with higher weights appear lower in a form." +msgstr "Поля с большим весом отображаются в форме ниже." + +#: extras/models/customfields.py:162 +msgid "minimum value" +msgstr "минимальное значение" + +#: extras/models/customfields.py:163 +msgid "Minimum allowed value (for numeric fields)" +msgstr "Минимальное допустимое значение (для числовых полей)" + +#: extras/models/customfields.py:168 +msgid "maximum value" +msgstr "максимальное значение" + +#: extras/models/customfields.py:169 +msgid "Maximum allowed value (for numeric fields)" +msgstr "Максимально допустимое значение (для числовых полей)" + +#: extras/models/customfields.py:175 +msgid "validation regex" +msgstr "регулярное выражение валидации" + +#: extras/models/customfields.py:177 +#, python-brace-format +msgid "" +"Regular expression to enforce on text field values. Use ^ and $ to force " +"matching of entire string. For example, ^[A-Z]{3}$ will limit " +"values to exactly three uppercase letters." +msgstr "" +"Регулярное выражение для применения к значениям текстовых полей. Используйте" +" ^ и $ для принудительного сопоставления всей строки. Например, ^ " +"[A-Z]{3}$ ограничит значения ровно тремя заглавными буквами." + +#: extras/models/customfields.py:185 +msgid "choice set" +msgstr "набор для выбора" + +#: extras/models/customfields.py:194 +msgid "Specifies whether the custom field is displayed in the UI" +msgstr "" +"Указывает, отображается ли настраиваемое поле в пользовательском интерфейсе" + +#: extras/models/customfields.py:201 +msgid "Specifies whether the custom field value can be edited in the UI" +msgstr "" +"Указывает, можно ли редактировать значение настраиваемого поля в " +"пользовательском интерфейсе" + +#: extras/models/customfields.py:205 +msgid "is cloneable" +msgstr "клонируется" + +#: extras/models/customfields.py:206 +msgid "Replicate this value when cloning objects" +msgstr "Реплицируйте это значение при клонировании объектов" + +#: extras/models/customfields.py:219 +msgid "custom field" +msgstr "настраиваемое поле" + +#: extras/models/customfields.py:220 +msgid "custom fields" +msgstr "настраиваемые поля" + +#: extras/models/customfields.py:309 +#, python-brace-format +msgid "Invalid default value \"{value}\": {error}" +msgstr "Неверное значение по умолчанию»{value}«: {error}" + +#: extras/models/customfields.py:316 +msgid "A minimum value may be set only for numeric fields" +msgstr "Минимальное значение может быть установлено только для числовых полей" + +#: extras/models/customfields.py:318 +msgid "A maximum value may be set only for numeric fields" +msgstr "" +"Максимальное значение может быть установлено только для числовых полей" + +#: extras/models/customfields.py:328 +msgid "" +"Regular expression validation is supported only for text and URL fields" +msgstr "" +"Проверка регулярных выражений поддерживается только для текстовых полей и " +"полей URL" + +#: extras/models/customfields.py:338 +msgid "Selection fields must specify a set of choices." +msgstr "В полях выбора должен быть указан набор вариантов." + +#: extras/models/customfields.py:342 +msgid "Choices may be set only on selection fields." +msgstr "Варианты могут быть заданы только в полях выбора." + +#: extras/models/customfields.py:349 +msgid "Object fields must define an object type." +msgstr "Поля объекта должны определять тип объекта." + +#: extras/models/customfields.py:354 +#, python-brace-format +msgid "{type} fields may not define an object type." +msgstr "{type} поля не могут определять тип объекта." + +#: extras/models/customfields.py:434 +msgid "True" +msgstr "Верно" + +#: extras/models/customfields.py:435 +msgid "False" +msgstr "Ложь" + +#: extras/models/customfields.py:517 +#, python-brace-format +msgid "Values must match this regex: {regex}" +msgstr "" +"Значения должны соответствовать этому регулярному вырагу: " +"{regex}" + +#: extras/models/customfields.py:612 +msgid "Value must be a string." +msgstr "Значение должно быть строкой." + +#: extras/models/customfields.py:614 +#, python-brace-format +msgid "Value must match regex '{regex}'" +msgstr "Значение должно совпадать с регулярным выраженностью '{regex}'" + +#: extras/models/customfields.py:619 +msgid "Value must be an integer." +msgstr "Значение должно быть целым числом." + +#: extras/models/customfields.py:622 extras/models/customfields.py:637 +#, python-brace-format +msgid "Value must be at least {minimum}" +msgstr "Значение должно быть не менее {minimum}" + +#: extras/models/customfields.py:626 extras/models/customfields.py:641 +#, python-brace-format +msgid "Value must not exceed {maximum}" +msgstr "Значение не должно превышать {maximum}" + +#: extras/models/customfields.py:634 +msgid "Value must be a decimal." +msgstr "Значение должно быть десятичным." + +#: extras/models/customfields.py:646 +msgid "Value must be true or false." +msgstr "Значение должно быть истинным или ложным." + +#: extras/models/customfields.py:654 +msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." +msgstr "Значения дат должны быть в формате ISO 8601 (YYYY-MM-DD)." + +#: extras/models/customfields.py:663 +msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." +msgstr "" +"Значения даты и времени должны быть в формате ISO 8601 (YYYY-MM-DD " +"HH:MM:SS)." + +#: extras/models/customfields.py:670 +#, python-brace-format +msgid "Invalid choice ({value}) for choice set {choiceset}." +msgstr "Неверный выбор ({value}2) для выбора набора {choiceset}." + +#: extras/models/customfields.py:680 +#, python-brace-format +msgid "Invalid choice(s) ({value}) for choice set {choiceset}." +msgstr "Неверный выбор (ы){value}2) для выбора набора {choiceset}." + +#: extras/models/customfields.py:689 +#, python-brace-format +msgid "Value must be an object ID, not {type}" +msgstr "Значение должно быть идентификатором объекта, а не {type}" + +#: extras/models/customfields.py:695 +#, python-brace-format +msgid "Value must be a list of object IDs, not {type}" +msgstr "Значение должно быть списком идентификаторов объектов, а не {type}" + +#: extras/models/customfields.py:699 +#, python-brace-format +msgid "Found invalid object ID: {id}" +msgstr "Обнаружен неправильный идентификатор объекта: {id}" + +#: extras/models/customfields.py:702 +msgid "Required field cannot be empty." +msgstr "Обязательное поле не может быть пустым." + +#: extras/models/customfields.py:721 +msgid "Base set of predefined choices (optional)" +msgstr "Базовый набор предопределенных вариантов (опционально)" + +#: extras/models/customfields.py:733 +msgid "Choices are automatically ordered alphabetically" +msgstr "Варианты автоматически упорядочены в алфавитном порядке" + +#: extras/models/customfields.py:740 +msgid "custom field choice set" +msgstr "набор вариантов настраиваемых полей" + +#: extras/models/customfields.py:741 +msgid "custom field choice sets" +msgstr "настраиваемые наборы для выбора полей" + +#: extras/models/customfields.py:777 +msgid "Must define base or extra choices." +msgstr "Должен определить базовые или дополнительные варианты." + +#: extras/models/dashboard.py:19 +msgid "layout" +msgstr "макет" + +#: extras/models/dashboard.py:23 +msgid "config" +msgstr "конфигурации" + +#: extras/models/dashboard.py:28 +msgid "dashboard" +msgstr "панель управления" + +#: extras/models/dashboard.py:29 +msgid "dashboards" +msgstr "щитки" + +#: extras/models/models.py:49 +msgid "object types" +msgstr "типы объектов" + +#: extras/models/models.py:50 +msgid "The object(s) to which this rule applies." +msgstr "Объект (объекты), к которым применяется данное правило." + +#: extras/models/models.py:63 +msgid "on create" +msgstr "при создании" + +#: extras/models/models.py:65 +msgid "Triggers when a matching object is created." +msgstr "Срабатывает при создании совпадающего объекта." + +#: extras/models/models.py:68 +msgid "on update" +msgstr "при обновлении" + +#: extras/models/models.py:70 +msgid "Triggers when a matching object is updated." +msgstr "Срабатывает при обновлении совпадающего объекта." + +#: extras/models/models.py:73 +msgid "on delete" +msgstr "при удалении" + +#: extras/models/models.py:75 +msgid "Triggers when a matching object is deleted." +msgstr "Срабатывает при удалении совпадающего объекта." + +#: extras/models/models.py:78 +msgid "on job start" +msgstr "при начале работы" + +#: extras/models/models.py:80 +msgid "Triggers when a job for a matching object is started." +msgstr "Срабатывает при запуске задания для совпадающего объекта." + +#: extras/models/models.py:83 +msgid "on job end" +msgstr "по окончании работы" + +#: extras/models/models.py:85 +msgid "Triggers when a job for a matching object terminates." +msgstr "Срабатывает, когда задание на совпадающий объект завершается." + +#: extras/models/models.py:92 +msgid "conditions" +msgstr "условия" + +#: extras/models/models.py:95 +msgid "" +"A set of conditions which determine whether the event will be generated." +msgstr "Набор условий, определяющих, будет ли создано событие." + +#: extras/models/models.py:103 +msgid "action type" +msgstr "тип действия" + +#: extras/models/models.py:126 +msgid "Additional data to pass to the action object" +msgstr "Дополнительные данные для передачи объекту действия" + +#: extras/models/models.py:138 +msgid "event rule" +msgstr "правило события" + +#: extras/models/models.py:139 +msgid "event rules" +msgstr "правила мероприятия" + +#: extras/models/models.py:155 +msgid "" +"At least one event type must be selected: create, update, delete, job start," +" and/or job end." +msgstr "" +"Необходимо выбрать хотя бы один тип события: создание, обновление, удаление," +" начало задания и/или завершение задания." + +#: extras/models/models.py:196 +msgid "" +"This URL will be called using the HTTP method defined when the webhook is " +"called. Jinja2 template processing is supported with the same context as the" +" request body." +msgstr "" +"Этот URL-адрес будет вызываться с помощью метода HTTP, определенного при " +"вызове веб-хука. Обработка шаблона Jinja2 поддерживается в том же контексте," +" что и тело запроса." + +#: extras/models/models.py:211 +msgid "" +"The complete list of official content types is available here." +msgstr "" +"Доступен полный список официальных типов контента здесь." + +#: extras/models/models.py:216 +msgid "additional headers" +msgstr "дополнительные заголовки" + +#: extras/models/models.py:219 +msgid "" +"User-supplied HTTP headers to be sent with the request in addition to the " +"HTTP content type. Headers should be defined in the format Name: " +"Value. Jinja2 template processing is supported with the same context " +"as the request body (below)." +msgstr "" +"Заголовки HTTP, предоставляемые пользователем, которые будут отправлены " +"вместе с запросом в дополнение к типу содержимого HTTP. Заголовки должны " +"быть определены в формате Название: Значение. Обработка шаблона" +" Jinja2 поддерживается в том же контексте, что и тело запроса (см. ниже)." + +#: extras/models/models.py:225 +msgid "body template" +msgstr "шаблон тела" + +#: extras/models/models.py:228 +msgid "" +"Jinja2 template for a custom request body. If blank, a JSON object " +"representing the change will be included. Available context data includes: " +"event, model, timestamp, " +"username, request_id, and data." +msgstr "" +"Шаблон Jinja2 для настраиваемого тела запроса. Если поле пусто, будет " +"добавлен объект JSON, представляющий изменение. Доступные контекстные данные" +" включают: событие, модель, отметка " +"времени, имя пользователя, идентификатор " +"запроса, и данные." + +#: extras/models/models.py:234 +msgid "secret" +msgstr "секретный" + +#: extras/models/models.py:238 +msgid "" +"When provided, the request will include a X-Hook-Signature " +"header containing a HMAC hex digest of the payload body using the secret as " +"the key. The secret is not transmitted in the request." +msgstr "" +"Если запрос будет предоставлен, он будет включать Подпись " +"X-Hook заголовок, содержащий шестнадцатеричный дайджест тела полезной" +" нагрузки в формате HMAC, в котором в качестве ключа используется секрет. " +"Секрет не передается в запросе." + +#: extras/models/models.py:245 +msgid "Enable SSL certificate verification. Disable with caution!" +msgstr "Включите проверку сертификата SSL. Отключайте с осторожностью!" + +#: extras/models/models.py:251 templates/extras/webhook.html:62 +msgid "CA File Path" +msgstr "Путь к файлу CA" + +#: extras/models/models.py:253 +msgid "" +"The specific CA certificate file to use for SSL verification. Leave blank to" +" use the system defaults." +msgstr "" +"Конкретный файл сертификата CA, используемый для проверки SSL. Оставьте поле" +" пустым, чтобы использовать системные настройки по умолчанию." + +#: extras/models/models.py:264 +msgid "webhook" +msgstr "вебхук" + +#: extras/models/models.py:265 +msgid "webhooks" +msgstr "вебхуки" + +#: extras/models/models.py:283 +msgid "Do not specify a CA certificate file if SSL verification is disabled." +msgstr "Не указывайте файл сертификата CA, если проверка SSL отключена." + +#: extras/models/models.py:323 +msgid "The object type(s) to which this link applies." +msgstr "Тип (ы) объекта, к которому относится эта ссылка." + +#: extras/models/models.py:335 +msgid "link text" +msgstr "текст ссылки" + +#: extras/models/models.py:336 +msgid "Jinja2 template code for link text" +msgstr "Код шаблона Jinja2 для текста ссылки" + +#: extras/models/models.py:339 +msgid "link URL" +msgstr "URL-адрес ссылки" + +#: extras/models/models.py:340 +msgid "Jinja2 template code for link URL" +msgstr "Код шаблона Jinja2 для URL-адреса ссылки" + +#: extras/models/models.py:350 +msgid "Links with the same group will appear as a dropdown menu" +msgstr "Ссылки с той же группой появятся в выпадающем меню" + +#: extras/models/models.py:353 +msgid "button class" +msgstr "класс кнопок" + +#: extras/models/models.py:357 +msgid "" +"The class of the first link in a group will be used for the dropdown button" +msgstr "" +"Класс первой ссылки в группе будет использоваться для кнопки раскрывающегося" +" списка" + +#: extras/models/models.py:360 +msgid "new window" +msgstr "новое окно" + +#: extras/models/models.py:362 +msgid "Force link to open in a new window" +msgstr "Принудительно открыть ссылку в новом окне" + +#: extras/models/models.py:371 +msgid "custom link" +msgstr "настраиваемая ссылка" + +#: extras/models/models.py:372 +msgid "custom links" +msgstr "настраиваемые ссылки" + +#: extras/models/models.py:419 +msgid "The object type(s) to which this template applies." +msgstr "Тип (типы) объектов, к которым применим этот шаблон." + +#: extras/models/models.py:432 +msgid "" +"Jinja2 template code. The list of objects being exported is passed as a " +"context variable named queryset." +msgstr "" +"Код шаблона Jinja2. Список экспортируемых объектов передается в виде " +"контекстной переменной с именем набор запросов." + +#: extras/models/models.py:440 +msgid "Defaults to text/plain; charset=utf-8" +msgstr "По умолчанию текстовый/обычный; кодировка=utf-8" + +#: extras/models/models.py:443 +msgid "file extension" +msgstr "расширение файла" + +#: extras/models/models.py:446 +msgid "Extension to append to the rendered filename" +msgstr "Расширение для добавления к отображаемому имени файла" + +#: extras/models/models.py:449 +msgid "as attachment" +msgstr "в качестве вложения" + +#: extras/models/models.py:451 +msgid "Download file as attachment" +msgstr "Загрузить файл в виде вложения" + +#: extras/models/models.py:460 +msgid "export template" +msgstr "шаблон экспорта" + +#: extras/models/models.py:461 +msgid "export templates" +msgstr "шаблоны экспорта" + +#: extras/models/models.py:478 +#, python-brace-format +msgid "\"{name}\" is a reserved name. Please choose a different name." +msgstr "«{name}\"— зарезервированное имя. Пожалуйста, выберите другое имя." + +#: extras/models/models.py:528 +msgid "The object type(s) to which this filter applies." +msgstr "Тип (типы) объектов, к которым применяется этот фильтр." + +#: extras/models/models.py:560 +msgid "shared" +msgstr "общий" + +#: extras/models/models.py:573 +msgid "saved filter" +msgstr "сохраненный фильтр" + +#: extras/models/models.py:574 +msgid "saved filters" +msgstr "сохраненные фильтры" + +#: extras/models/models.py:592 +msgid "Filter parameters must be stored as a dictionary of keyword arguments." +msgstr "" +"Параметры фильтра должны храниться в виде словаря аргументов ключевых слов." + +#: extras/models/models.py:620 +msgid "image height" +msgstr "высота изображения" + +#: extras/models/models.py:623 +msgid "image width" +msgstr "ширина изображения" + +#: extras/models/models.py:640 +msgid "image attachment" +msgstr "вложение изображения" + +#: extras/models/models.py:641 +msgid "image attachments" +msgstr "вложения изображений" + +#: extras/models/models.py:655 +#, python-brace-format +msgid "Image attachments cannot be assigned to this object type ({type})." +msgstr "Вложенные изображения нельзя присвоить этому типу объекта ({type})." + +#: extras/models/models.py:718 +msgid "kind" +msgstr "добрый" + +#: extras/models/models.py:732 +msgid "journal entry" +msgstr "запись в журнале" + +#: extras/models/models.py:733 +msgid "journal entries" +msgstr "записи в журнале" + +#: extras/models/models.py:748 +#, python-brace-format +msgid "Journaling is not supported for this object type ({type})." +msgstr "Ведение журнала не поддерживается для этого типа объектов ({type})." + +#: extras/models/models.py:790 +msgid "bookmark" +msgstr "закладка" + +#: extras/models/models.py:791 +msgid "bookmarks" +msgstr "закладки" + +#: extras/models/models.py:804 +#, python-brace-format +msgid "Bookmarks cannot be assigned to this object type ({type})." +msgstr "Закладки нельзя присвоить этому типу объекта ({type})." + +#: extras/models/reports.py:46 +msgid "report module" +msgstr "модуль отчетов" + +#: extras/models/reports.py:47 +msgid "report modules" +msgstr "модули отчетов" + +#: extras/models/scripts.py:46 +msgid "script module" +msgstr "скриптовый модуль" + +#: extras/models/scripts.py:47 +msgid "script modules" +msgstr "скриптовые модули" + +#: extras/models/search.py:24 +msgid "timestamp" +msgstr "отметка времени" + +#: extras/models/search.py:39 +msgid "field" +msgstr "сфера" + +#: extras/models/search.py:47 +msgid "value" +msgstr "значение" + +#: extras/models/search.py:58 +msgid "cached value" +msgstr "кэшированное значение" + +#: extras/models/search.py:59 +msgid "cached values" +msgstr "кэшированные значения" + +#: extras/models/staging.py:44 +msgid "branch" +msgstr "филиал" + +#: extras/models/staging.py:45 +msgid "branches" +msgstr "ветвей" + +#: extras/models/staging.py:97 +msgid "staged change" +msgstr "поэтапное изменение" + +#: extras/models/staging.py:98 +msgid "staged changes" +msgstr "поэтапные изменения" + +#: extras/models/tags.py:40 +msgid "The object type(s) to which this this tag can be applied." +msgstr "Тип (ы) объекта, к которому можно применить этот тег." + +#: extras/models/tags.py:49 +msgid "tag" +msgstr "тег" + +#: extras/models/tags.py:50 +msgid "tags" +msgstr "ярлыки" + +#: extras/models/tags.py:78 +msgid "tagged item" +msgstr "помеченный товар" + +#: extras/models/tags.py:79 +msgid "tagged items" +msgstr "помеченные товары" + +#: extras/signals.py:221 +#, python-brace-format +msgid "Deletion is prevented by a protection rule: {message}" +msgstr "Удаление предотвращается правилом защиты: {message}" + +#: extras/tables/tables.py:44 extras/tables/tables.py:119 +#: extras/tables/tables.py:143 extras/tables/tables.py:208 +#: extras/tables/tables.py:281 +msgid "Content Types" +msgstr "Типы контента" + +#: extras/tables/tables.py:50 +msgid "Visible" +msgstr "Видимый" + +#: extras/tables/tables.py:53 +msgid "Editable" +msgstr "Редактируемый" + +#: extras/tables/tables.py:60 templates/extras/customfield.html:48 +msgid "Choice Set" +msgstr "Набор для выбора" + +#: extras/tables/tables.py:68 +msgid "Is Cloneable" +msgstr "Можно ли клонировать" + +#: extras/tables/tables.py:98 +msgid "Count" +msgstr "Сосчитайте" + +#: extras/tables/tables.py:101 +msgid "Order Alphabetically" +msgstr "Упорядочить в алфавитном порядке" + +#: extras/tables/tables.py:125 templates/extras/customlink.html:34 +msgid "New Window" +msgstr "Новое окно" + +#: extras/tables/tables.py:146 +msgid "As Attachment" +msgstr "В качестве вложения" + +#: extras/tables/tables.py:153 extras/tables/tables.py:367 +#: extras/tables/tables.py:402 templates/core/datafile.html:32 +#: templates/dcim/device/render_config.html:23 +#: templates/extras/configcontext.html:40 +#: templates/extras/configtemplate.html:32 +#: templates/extras/exporttemplate.html:51 +#: templates/generic/bulk_import.html:30 +#: templates/virtualization/virtualmachine/render_config.html:23 +msgid "Data File" +msgstr "Файл данных" + +#: extras/tables/tables.py:158 extras/tables/tables.py:379 +#: extras/tables/tables.py:407 +msgid "Synced" +msgstr "Синхронизировано" + +#: extras/tables/tables.py:178 +msgid "Content Type" +msgstr "Тип контента" + +#: extras/tables/tables.py:185 +msgid "Image" +msgstr "Изображение" + +#: extras/tables/tables.py:190 +msgid "Size (Bytes)" +msgstr "Размер (байты)" + +#: extras/tables/tables.py:233 extras/tables/tables.py:326 +#: templates/extras/customfield.html:96 templates/extras/eventrule.html:32 +#: templates/users/objectpermission.html:68 users/tables.py:83 +msgid "Object Types" +msgstr "Типы объектов" + +#: extras/tables/tables.py:255 +msgid "SSL Validation" +msgstr "Валидация SSL" + +#: extras/tables/tables.py:278 +msgid "Action Type" +msgstr "Тип действия" + +#: extras/tables/tables.py:296 +msgid "Job Start" +msgstr "Начало работы" + +#: extras/tables/tables.py:299 +msgid "Job End" +msgstr "Завершение задания" + +#: extras/tables/tables.py:436 templates/account/profile.html:20 +#: templates/users/user.html:22 +msgid "Full Name" +msgstr "Полное имя" + +#: extras/tables/tables.py:453 templates/extras/objectchange.html:72 +msgid "Request ID" +msgstr "Идентификатор запроса" + +#: extras/tables/tables.py:490 +msgid "Comments (Short)" +msgstr "Комментарии (короткие)" + +#: extras/validators.py:13 +#, python-format +msgid "Ensure this value is equal to %(limit_value)s." +msgstr "Убедитесь, что это значение равно %(limit_value)s." + +#: extras/validators.py:24 +#, python-format +msgid "Ensure this value does not equal %(limit_value)s." +msgstr "Убедитесь, что это значение не равно %(limit_value)s." + +#: extras/validators.py:35 +msgid "This field must be empty." +msgstr "Это поле должно быть пустым." + +#: extras/validators.py:50 +msgid "This field must not be empty." +msgstr "Это поле не должно быть пустым." + +#: extras/views.py:880 +msgid "Your dashboard has been reset." +msgstr "Панель управления была перезагружена." + +#: ipam/api/field_serializers.py:17 +msgid "Enter a valid IPv4 or IPv6 address with optional mask." +msgstr "Введите действительный адрес IPv4 или IPv6 с дополнительной маской." + +#: ipam/api/field_serializers.py:24 +#, python-brace-format +msgid "Invalid IP address format: {data}" +msgstr "Неверный формат IP-адреса: {data}" + +#: ipam/api/field_serializers.py:37 +msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." +msgstr "Введите действительный префикс и маску IPv4 или IPv6 в нотации CIDR." + +#: ipam/api/field_serializers.py:44 +#, python-brace-format +msgid "Invalid IP prefix format: {data}" +msgstr "Неверный формат IP-префикса: {data}" + +#: ipam/choices.py:30 +msgid "Container" +msgstr "Контейнер" + +#: ipam/choices.py:72 +msgid "DHCP" +msgstr "DHCP" + +#: ipam/choices.py:73 +msgid "SLAAC" +msgstr "СЛАБАК" + +#: ipam/choices.py:89 +msgid "Loopback" +msgstr "Обратная петля" + +#: ipam/choices.py:90 tenancy/choices.py:18 +msgid "Secondary" +msgstr "Вторичный" + +#: ipam/choices.py:91 +msgid "Anycast" +msgstr "Anycast" + +#: ipam/choices.py:115 +msgid "Standard" +msgstr "Стандарт" + +#: ipam/choices.py:120 +msgid "CheckPoint" +msgstr "Контрольная точка" + +#: ipam/choices.py:123 +msgid "Cisco" +msgstr "Cisco" + +#: ipam/choices.py:137 +msgid "Plaintext" +msgstr "Обычный текст" + +#: ipam/filtersets.py:47 vpn/filtersets.py:276 +msgid "Import target" +msgstr "Цель импорта" + +#: ipam/filtersets.py:53 vpn/filtersets.py:282 +msgid "Import target (name)" +msgstr "Цель импорта (имя)" + +#: ipam/filtersets.py:58 vpn/filtersets.py:287 +msgid "Export target" +msgstr "Цель экспорта" + +#: ipam/filtersets.py:64 vpn/filtersets.py:293 +msgid "Export target (name)" +msgstr "Цель экспорта (имя)" + +#: ipam/filtersets.py:85 +msgid "Importing VRF" +msgstr "Импорт VRF" + +#: ipam/filtersets.py:91 +msgid "Import VRF (RD)" +msgstr "Импорт VRF (RD)" + +#: ipam/filtersets.py:96 +msgid "Exporting VRF" +msgstr "Экспорт VRF" + +#: ipam/filtersets.py:102 +msgid "Export VRF (RD)" +msgstr "Экспорт VRF (RD)" + +#: ipam/filtersets.py:132 ipam/filtersets.py:247 ipam/forms/model_forms.py:229 +#: ipam/tables/ip.py:211 templates/ipam/prefix.html:12 +msgid "Prefix" +msgstr "Префикс" + +#: ipam/filtersets.py:136 ipam/filtersets.py:175 ipam/filtersets.py:198 +msgid "RIR (ID)" +msgstr "RIR (ID)" + +#: ipam/filtersets.py:142 ipam/filtersets.py:181 ipam/filtersets.py:204 +msgid "RIR (slug)" +msgstr "RIR (пуля)" + +#: ipam/filtersets.py:251 +msgid "Within prefix" +msgstr "В префиксе" + +#: ipam/filtersets.py:255 +msgid "Within and including prefix" +msgstr "В префиксе и включительно" + +#: ipam/filtersets.py:259 +msgid "Prefixes which contain this prefix or IP" +msgstr "Префиксы, содержащие этот префикс или IP-адрес" + +#: ipam/filtersets.py:270 ipam/filtersets.py:538 ipam/forms/bulk_edit.py:326 +#: ipam/forms/filtersets.py:191 ipam/forms/filtersets.py:317 +msgid "Mask length" +msgstr "Длина маски" + +#: ipam/filtersets.py:339 vpn/filtersets.py:399 +msgid "VLAN (ID)" +msgstr "VLAN (ID)" + +#: ipam/filtersets.py:343 vpn/filtersets.py:394 +msgid "VLAN number (1-4094)" +msgstr "Номер VLAN (1-4094)" + +#: ipam/filtersets.py:437 ipam/filtersets.py:441 ipam/filtersets.py:533 +#: ipam/forms/model_forms.py:444 templates/tenancy/contact.html:54 +#: tenancy/forms/bulk_edit.py:112 +msgid "Address" +msgstr "Адрес" + +#: ipam/filtersets.py:445 +msgid "Ranges which contain this prefix or IP" +msgstr "Диапазоны, содержащие этот префикс или IP-адрес" + +#: ipam/filtersets.py:473 ipam/filtersets.py:529 +msgid "Parent prefix" +msgstr "Родительский префикс" + +#: ipam/filtersets.py:582 ipam/filtersets.py:812 ipam/filtersets.py:1031 +#: vpn/filtersets.py:357 +msgid "Virtual machine (name)" +msgstr "Виртуальная машина (имя)" + +#: ipam/filtersets.py:587 ipam/filtersets.py:817 ipam/filtersets.py:1025 +#: virtualization/filtersets.py:276 virtualization/filtersets.py:315 +#: vpn/filtersets.py:362 +msgid "Virtual machine (ID)" +msgstr "Виртуальная машина (ID)" + +#: ipam/filtersets.py:593 vpn/filtersets.py:97 vpn/filtersets.py:368 +msgid "Interface (name)" +msgstr "Интерфейс (имя)" + +#: ipam/filtersets.py:598 vpn/filtersets.py:102 vpn/filtersets.py:373 +msgid "Interface (ID)" +msgstr "Интерфейс (ID)" + +#: ipam/filtersets.py:604 vpn/filtersets.py:108 vpn/filtersets.py:379 +msgid "VM interface (name)" +msgstr "Интерфейс виртуальной машины (имя)" + +#: ipam/filtersets.py:609 vpn/filtersets.py:113 +msgid "VM interface (ID)" +msgstr "Интерфейс виртуальной машины (ID)" + +#: ipam/filtersets.py:614 +msgid "FHRP group (ID)" +msgstr "Группа FHRP (идентификатор)" + +#: ipam/filtersets.py:618 +msgid "Is assigned to an interface" +msgstr "Присваивается интерфейсу" + +#: ipam/filtersets.py:622 +msgid "Is assigned" +msgstr "Назначено" + +#: ipam/filtersets.py:1036 +msgid "IP address (ID)" +msgstr "IP-адрес (ID)" + +#: ipam/filtersets.py:1042 ipam/models/ip.py:787 +msgid "IP address" +msgstr "IP-адрес" + +#: ipam/filtersets.py:1068 +msgid "Primary IPv4 (ID)" +msgstr "Основной IPv4 (ID)" + +#: ipam/filtersets.py:1073 +msgid "Primary IPv6 (ID)" +msgstr "Основной IPv6 (ID)" + +#: ipam/forms/bulk_create.py:14 +msgid "Address pattern" +msgstr "Шаблон адреса" + +#: ipam/forms/bulk_edit.py:85 +msgid "Is private" +msgstr "Является частным" + +#: ipam/forms/bulk_edit.py:106 ipam/forms/bulk_edit.py:135 +#: ipam/forms/bulk_edit.py:160 ipam/forms/bulk_import.py:88 +#: ipam/forms/bulk_import.py:108 ipam/forms/bulk_import.py:128 +#: ipam/forms/filtersets.py:109 ipam/forms/filtersets.py:124 +#: ipam/forms/filtersets.py:147 ipam/forms/model_forms.py:93 +#: ipam/forms/model_forms.py:108 ipam/forms/model_forms.py:130 +#: ipam/forms/model_forms.py:148 ipam/models/asns.py:31 +#: ipam/models/asns.py:103 ipam/models/ip.py:70 ipam/models/ip.py:89 +#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 +#: templates/ipam/aggregate.html:19 templates/ipam/asn.html:28 +#: templates/ipam/asnrange.html:20 templates/ipam/rir.html:20 +msgid "RIR" +msgstr "ВСАДНИКИ" + +#: ipam/forms/bulk_edit.py:168 +msgid "Date added" +msgstr "Дата добавления" + +#: ipam/forms/bulk_edit.py:229 +msgid "Prefix length" +msgstr "Длина префикса" + +#: ipam/forms/bulk_edit.py:252 ipam/forms/filtersets.py:236 +#: templates/ipam/prefix.html:86 +msgid "Is a pool" +msgstr "Это бассейн" + +#: ipam/forms/bulk_edit.py:257 ipam/forms/bulk_edit.py:301 +#: ipam/models/ip.py:271 ipam/models/ip.py:538 +#, python-format +msgid "Treat as 100% utilized" +msgstr "Отнестись к использованию на 100%" + +#: ipam/forms/bulk_edit.py:349 ipam/models/ip.py:771 +msgid "DNS name" +msgstr "DNS-имя" + +#: ipam/forms/bulk_edit.py:370 ipam/forms/bulk_edit.py:569 +#: ipam/forms/bulk_import.py:393 ipam/forms/bulk_import.py:477 +#: ipam/forms/bulk_import.py:503 ipam/forms/filtersets.py:376 +#: ipam/forms/filtersets.py:511 templates/ipam/fhrpgroup.html:23 +#: templates/ipam/inc/panels/fhrp_groups.html:11 +#: templates/ipam/service.html:35 templates/ipam/servicetemplate.html:20 +msgid "Protocol" +msgstr "протокол" + +#: ipam/forms/bulk_edit.py:377 ipam/forms/filtersets.py:383 +#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:27 +msgid "Group ID" +msgstr "Идентификатор группы" + +#: ipam/forms/bulk_edit.py:382 ipam/forms/filtersets.py:388 +#: wireless/forms/bulk_edit.py:67 wireless/forms/bulk_edit.py:114 +#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 +#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 +#: wireless/forms/filtersets.py:53 wireless/forms/filtersets.py:87 +msgid "Authentication type" +msgstr "Тип аутентификации" + +#: ipam/forms/bulk_edit.py:387 ipam/forms/filtersets.py:392 +msgid "Authentication key" +msgstr "Ключ аутентификации" + +#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:369 +#: ipam/forms/model_forms.py:455 netbox/navigation/menu.py:376 +#: templates/ipam/fhrpgroup.html:51 +#: templates/wireless/inc/authentication_attrs.html:5 +#: wireless/forms/bulk_edit.py:90 wireless/forms/bulk_edit.py:137 +#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: wireless/forms/model_forms.py:56 wireless/forms/model_forms.py:161 +msgid "Authentication" +msgstr "аутентификация" + +#: ipam/forms/bulk_edit.py:414 +msgid "Minimum child VLAN VID" +msgstr "Минимальное количество VLAN VID для детей" + +#: ipam/forms/bulk_edit.py:420 +msgid "Maximum child VLAN VID" +msgstr "Максимальное количество идентификаторов VLAN для детей" + +#: ipam/forms/bulk_edit.py:428 ipam/forms/model_forms.py:527 +msgid "Scope type" +msgstr "Тип прицела" + +#: ipam/forms/bulk_edit.py:489 ipam/forms/model_forms.py:600 +#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:39 +msgid "Scope" +msgstr "Область применения" + +#: ipam/forms/bulk_edit.py:560 +msgid "Site & Group" +msgstr "Сайт и группа" + +#: ipam/forms/bulk_edit.py:574 ipam/forms/model_forms.py:663 +#: ipam/forms/model_forms.py:697 ipam/tables/services.py:19 +#: ipam/tables/services.py:49 templates/ipam/service.html:39 +#: templates/ipam/servicetemplate.html:24 +msgid "Ports" +msgstr "Порты" + +#: ipam/forms/bulk_import.py:47 +msgid "Import route targets" +msgstr "Импортируйте цели маршрута" + +#: ipam/forms/bulk_import.py:53 +msgid "Export route targets" +msgstr "Экспортные цели маршрута" + +#: ipam/forms/bulk_import.py:91 ipam/forms/bulk_import.py:111 +#: ipam/forms/bulk_import.py:131 +msgid "Assigned RIR" +msgstr "Назначенный RIR" + +#: ipam/forms/bulk_import.py:181 +msgid "VLAN's group (if any)" +msgstr "Группа VLAN (если есть)" + +#: ipam/forms/bulk_import.py:184 ipam/forms/model_forms.py:219 +#: ipam/models/vlans.py:214 ipam/tables/ip.py:254 +#: templates/ipam/prefix.html:61 templates/ipam/vlan.html:13 +#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 +#: templates/vpn/l2vpntermination_edit.html:17 +#: templates/wireless/wirelesslan.html:31 vpn/forms/bulk_import.py:299 +#: vpn/forms/filtersets.py:280 vpn/forms/model_forms.py:427 +#: wireless/forms/bulk_edit.py:54 wireless/forms/bulk_import.py:48 +#: wireless/forms/model_forms.py:49 wireless/models.py:101 +msgid "VLAN" +msgstr "VLAN" + +#: ipam/forms/bulk_import.py:307 +msgid "Parent device of assigned interface (if any)" +msgstr "Родительское устройство назначенного интерфейса (если есть)" + +#: ipam/forms/bulk_import.py:310 ipam/forms/bulk_import.py:496 +#: ipam/forms/model_forms.py:691 virtualization/filtersets.py:282 +#: virtualization/filtersets.py:321 virtualization/forms/bulk_edit.py:199 +#: virtualization/forms/bulk_edit.py:325 +#: virtualization/forms/bulk_import.py:146 +#: virtualization/forms/bulk_import.py:207 +#: virtualization/forms/filtersets.py:204 +#: virtualization/forms/filtersets.py:240 +#: virtualization/forms/model_forms.py:291 vpn/forms/bulk_import.py:93 +#: vpn/forms/bulk_import.py:285 +msgid "Virtual machine" +msgstr "Виртуальная машина" + +#: ipam/forms/bulk_import.py:314 +msgid "Parent VM of assigned interface (if any)" +msgstr "Родительская виртуальная машина назначенного интерфейса (если есть)" + +#: ipam/forms/bulk_import.py:321 +msgid "Assigned interface" +msgstr "Назначенный интерфейс" + +#: ipam/forms/bulk_import.py:324 +msgid "Is primary" +msgstr "Является основным" + +#: ipam/forms/bulk_import.py:325 +msgid "Make this the primary IP for the assigned device" +msgstr "Сделайте этот IP-адрес основным для назначенного устройства" + +#: ipam/forms/bulk_import.py:364 +msgid "No device or virtual machine specified; cannot set as primary IP" +msgstr "" +"Не указано устройство или виртуальная машина; невозможно установить в " +"качестве основного IP-адреса" + +#: ipam/forms/bulk_import.py:368 +msgid "No interface specified; cannot set as primary IP" +msgstr "" +"Интерфейс не указан; невозможно установить в качестве основного IP-адреса" + +#: ipam/forms/bulk_import.py:397 +msgid "Auth type" +msgstr "Тип авторизации" + +#: ipam/forms/bulk_import.py:412 +msgid "Scope type (app & model)" +msgstr "Тип прицела (приложение и модель)" + +#: ipam/forms/bulk_import.py:418 +#, python-brace-format +msgid "Minimum child VLAN VID (default: {minimum})" +msgstr "" +"Минимальное количество идентификаторов VLAN для детей (по умолчанию): " +"{minimum})" + +#: ipam/forms/bulk_import.py:424 +#, python-brace-format +msgid "Maximum child VLAN VID (default: {maximum})" +msgstr "" +"Максимальное количество идентификаторов VLAN для детей (по умолчанию): " +"{maximum})" + +#: ipam/forms/bulk_import.py:448 +msgid "Assigned VLAN group" +msgstr "Назначенная группа VLAN" + +#: ipam/forms/bulk_import.py:479 ipam/forms/bulk_import.py:505 +msgid "IP protocol" +msgstr "протокол IP" + +#: ipam/forms/bulk_import.py:493 +msgid "Required if not assigned to a VM" +msgstr "Требуется, если не назначено виртуальной машине" + +#: ipam/forms/bulk_import.py:500 +msgid "Required if not assigned to a device" +msgstr "Требуется, если не назначено устройству" + +#: ipam/forms/bulk_import.py:525 +#, python-brace-format +msgid "{ip} is not assigned to this device/VM." +msgstr "{ip} не назначено этому устройству/виртуальной машине." + +#: ipam/forms/filtersets.py:46 ipam/forms/model_forms.py:60 +#: netbox/navigation/menu.py:177 vpn/forms/model_forms.py:403 +msgid "Route Targets" +msgstr "Цели маршрута" + +#: ipam/forms/filtersets.py:52 ipam/forms/model_forms.py:47 +#: vpn/forms/filtersets.py:221 vpn/forms/model_forms.py:390 +msgid "Import targets" +msgstr "Цели импорта" + +#: ipam/forms/filtersets.py:57 ipam/forms/model_forms.py:52 +#: vpn/forms/filtersets.py:226 vpn/forms/model_forms.py:395 +msgid "Export targets" +msgstr "Экспортные цели" + +#: ipam/forms/filtersets.py:72 +msgid "Imported by VRF" +msgstr "Импортировано компанией VRF" + +#: ipam/forms/filtersets.py:77 +msgid "Exported by VRF" +msgstr "Экспортируется компанией VRF" + +#: ipam/forms/filtersets.py:86 ipam/tables/ip.py:89 templates/ipam/rir.html:33 +msgid "Private" +msgstr "Частное" + +#: ipam/forms/filtersets.py:104 ipam/forms/filtersets.py:186 +#: ipam/forms/filtersets.py:261 ipam/forms/filtersets.py:312 +msgid "Address family" +msgstr "Семейство адресов" + +#: ipam/forms/filtersets.py:118 templates/ipam/asnrange.html:26 +msgid "Range" +msgstr "Ассортимент" + +#: ipam/forms/filtersets.py:127 +msgid "Start" +msgstr "Начните" + +#: ipam/forms/filtersets.py:131 +msgid "End" +msgstr "Конец" + +#: ipam/forms/filtersets.py:181 +msgid "Search within" +msgstr "Поиск внутри" + +#: ipam/forms/filtersets.py:202 ipam/forms/filtersets.py:328 +msgid "Present in VRF" +msgstr "Присутствует в VRF" + +#: ipam/forms/filtersets.py:243 ipam/forms/filtersets.py:282 +#, python-format +msgid "Marked as 100% utilized" +msgstr "Отмечено как использовано на 100%" + +#: ipam/forms/filtersets.py:297 +msgid "Device/VM" +msgstr "Устройство/виртуальная машина" + +#: ipam/forms/filtersets.py:333 +msgid "Assigned Device" +msgstr "Назначенное устройство" + +#: ipam/forms/filtersets.py:338 +msgid "Assigned VM" +msgstr "назначенная виртуальная машина" + +#: ipam/forms/filtersets.py:352 +msgid "Assigned to an interface" +msgstr "Назначено интерфейсу" + +#: ipam/forms/filtersets.py:359 templates/ipam/ipaddress.html:54 +msgid "DNS Name" +msgstr "DNS-имя" + +#: ipam/forms/filtersets.py:401 ipam/forms/filtersets.py:494 +#: ipam/models/vlans.py:156 templates/ipam/vlan.html:34 +msgid "VLAN ID" +msgstr "ИДЕНТИФИКАТОР КЛАНА" + +#: ipam/forms/filtersets.py:433 +msgid "Minimum VID" +msgstr "Минимальный VID" + +#: ipam/forms/filtersets.py:439 +msgid "Maximum VID" +msgstr "Максимальное значение VID" + +#: ipam/forms/filtersets.py:516 +msgid "Port" +msgstr "Порт" + +#: ipam/forms/filtersets.py:537 ipam/tables/vlans.py:191 +#: templates/ipam/ipaddress_edit.html:47 templates/ipam/service_create.html:22 +#: templates/ipam/service_edit.html:21 +#: templates/virtualization/virtualdisk.html:22 +#: templates/virtualization/virtualmachine.html:13 +#: templates/virtualization/vminterface.html:24 +#: templates/vpn/l2vpntermination_edit.html:27 +#: templates/vpn/tunneltermination.html:26 +#: virtualization/forms/filtersets.py:189 +#: virtualization/forms/filtersets.py:234 +#: virtualization/forms/model_forms.py:223 +#: virtualization/tables/virtualmachines.py:115 +#: virtualization/tables/virtualmachines.py:168 vpn/choices.py:45 +#: vpn/forms/filtersets.py:289 vpn/forms/model_forms.py:161 +#: vpn/forms/model_forms.py:172 vpn/forms/model_forms.py:269 +msgid "Virtual Machine" +msgstr "Виртуальная машина" + +#: ipam/forms/model_forms.py:113 ipam/tables/ip.py:116 +#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:39 +msgid "Aggregate" +msgstr "агрегат" + +#: ipam/forms/model_forms.py:134 templates/ipam/asnrange.html:12 +msgid "ASN Range" +msgstr "Диапазон ASN" + +#: ipam/forms/model_forms.py:230 +msgid "Site/VLAN Assignment" +msgstr "Назначение сайта/VLAN" + +#: ipam/forms/model_forms.py:256 templates/ipam/iprange.html:11 +msgid "IP Range" +msgstr "Диапазон IP-адресов" + +#: ipam/forms/model_forms.py:285 ipam/forms/model_forms.py:454 +#: templates/ipam/fhrpgroup.html:19 templates/ipam/ipaddress_edit.html:52 +msgid "FHRP Group" +msgstr "Группа компаний FHRP" + +#: ipam/forms/model_forms.py:300 +msgid "Make this the primary IP for the device/VM" +msgstr "Сделайте этот IP-адрес основным для устройства/виртуальной машины" + +#: ipam/forms/model_forms.py:351 +msgid "An IP address can only be assigned to a single object." +msgstr "IP-адрес можно присвоить только одному объекту." + +#: ipam/forms/model_forms.py:357 ipam/models/ip.py:878 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Невозможно переназначить IP-адрес, если он назначен основным IP-адресом " +"родительского объекта" + +#: ipam/forms/model_forms.py:367 +msgid "" +"Only IP addresses assigned to an interface can be designated as primary IPs." +msgstr "" +"В качестве основных IP-адресов можно назначить только IP-адреса, назначенные" +" интерфейсу." + +#: ipam/forms/model_forms.py:373 +#, python-brace-format +msgid "{ip} is a network ID, which may not be assigned to an interface." +msgstr "" +"{ip} это сетевой идентификатор, который не может быть присвоен интерфейсу." + +#: ipam/forms/model_forms.py:379 +#, python-brace-format +msgid "" +"{ip} is a broadcast address, which may not be assigned to an interface." +msgstr "" +"{ip} это широковещательный адрес, который может не быть присвоен интерфейсу." + +#: ipam/forms/model_forms.py:456 +msgid "Virtual IP Address" +msgstr "Виртуальный IP-адрес" + +#: ipam/forms/model_forms.py:598 ipam/forms/model_forms.py:637 +#: ipam/tables/ip.py:250 templates/ipam/vlan_edit.html:37 +#: templates/ipam/vlangroup.html:27 +msgid "VLAN Group" +msgstr "Группа VLAN" + +#: ipam/forms/model_forms.py:599 +msgid "Child VLANs" +msgstr "Детские сети VLAN" + +#: ipam/forms/model_forms.py:668 ipam/forms/model_forms.py:702 +msgid "" +"Comma-separated list of one or more port numbers. A range may be specified " +"using a hyphen." +msgstr "" +"Список одного или нескольких номеров портов, разделенных запятыми. Диапазон " +"можно указать с помощью дефиса." + +#: ipam/forms/model_forms.py:673 templates/ipam/servicetemplate.html:12 +msgid "Service Template" +msgstr "Шаблон услуги" + +#: ipam/forms/model_forms.py:724 +msgid "Service template" +msgstr "Шаблон услуги" + +#: ipam/models/asns.py:34 +msgid "start" +msgstr "начните" + +#: ipam/models/asns.py:51 +msgid "ASN range" +msgstr "Диапазон ASN" + +#: ipam/models/asns.py:52 +msgid "ASN ranges" +msgstr "Диапазоны ASN" + +#: ipam/models/asns.py:72 +#, python-brace-format +msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." +msgstr "Запуск ASN ({start}) должно быть меньше, чем конечный ASN ({end})." + +#: ipam/models/asns.py:104 +msgid "Regional Internet Registry responsible for this AS number space" +msgstr "" +"Региональный интернет-реестр, отвечающий за это номерное пространство AS" + +#: ipam/models/asns.py:109 +msgid "16- or 32-bit autonomous system number" +msgstr "16- или 32-разрядный номер автономной системы" + +#: ipam/models/fhrp.py:22 +msgid "group ID" +msgstr "идентификатор группы" + +#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +msgid "protocol" +msgstr "протокол" + +#: ipam/models/fhrp.py:38 wireless/models.py:27 +msgid "authentication type" +msgstr "тип аутентификации" + +#: ipam/models/fhrp.py:43 +msgid "authentication key" +msgstr "ключ аутентификации" + +#: ipam/models/fhrp.py:56 +msgid "FHRP group" +msgstr "Группа FHRP" + +#: ipam/models/fhrp.py:57 +msgid "FHRP groups" +msgstr "Группы FHRP" + +#: ipam/models/fhrp.py:93 tenancy/models/contacts.py:134 +msgid "priority" +msgstr "приоритет" + +#: ipam/models/fhrp.py:113 +msgid "FHRP group assignment" +msgstr "Групповое назначение FHRP" + +#: ipam/models/fhrp.py:114 +msgid "FHRP group assignments" +msgstr "Групповые задания FHRP" + +#: ipam/models/ip.py:64 +msgid "private" +msgstr "частного" + +#: ipam/models/ip.py:65 +msgid "IP space managed by this RIR is considered private" +msgstr "IP-пространство, управляемое этим RIR, считается частным" + +#: ipam/models/ip.py:71 netbox/navigation/menu.py:170 +msgid "RIRs" +msgstr "РИР" + +#: ipam/models/ip.py:83 +msgid "IPv4 or IPv6 network" +msgstr "Сеть IPv4 или IPv6" + +#: ipam/models/ip.py:90 +msgid "Regional Internet Registry responsible for this IP space" +msgstr "Региональный реестр Интернета, отвечающий за это IP-пространство" + +#: ipam/models/ip.py:100 +msgid "date added" +msgstr "дата добавления" + +#: ipam/models/ip.py:114 +msgid "aggregate" +msgstr "совокупный" + +#: ipam/models/ip.py:115 +msgid "aggregates" +msgstr "сводные показатели" + +#: ipam/models/ip.py:131 +msgid "Cannot create aggregate with /0 mask." +msgstr "Невозможно создать агрегат с маской /0." + +#: ipam/models/ip.py:143 +#, python-brace-format +msgid "" +"Aggregates cannot overlap. {prefix} is already covered by an existing " +"aggregate ({aggregate})." +msgstr "" +"Агрегаты не могут перекрываться. {prefix} уже покрывается существующим " +"агрегатом ({aggregate})." + +#: ipam/models/ip.py:157 +#, python-brace-format +msgid "" +"Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " +"({aggregate})." +msgstr "" +"Префиксы не могут перекрывать агрегаты. {prefix} охватывает существующий " +"агрегат ({aggregate})." + +#: ipam/models/ip.py:199 ipam/models/ip.py:736 vpn/models/tunnels.py:114 +msgid "role" +msgstr "роль" + +#: ipam/models/ip.py:200 +msgid "roles" +msgstr "ролей" + +#: ipam/models/ip.py:216 ipam/models/ip.py:292 +msgid "prefix" +msgstr "приставка" + +#: ipam/models/ip.py:217 +msgid "IPv4 or IPv6 network with mask" +msgstr "Сеть IPv4 или IPv6 с маской" + +#: ipam/models/ip.py:253 +msgid "Operational status of this prefix" +msgstr "Рабочий статус этого префикса" + +#: ipam/models/ip.py:261 +msgid "The primary function of this prefix" +msgstr "Основная функция этого префикса" + +#: ipam/models/ip.py:264 +msgid "is a pool" +msgstr "это бассейн" + +#: ipam/models/ip.py:266 +msgid "All IP addresses within this prefix are considered usable" +msgstr "Все IP-адреса в этом префиксе считаются пригодными для использования" + +#: ipam/models/ip.py:269 ipam/models/ip.py:536 +msgid "mark utilized" +msgstr "использованная марка" + +#: ipam/models/ip.py:293 +msgid "prefixes" +msgstr "префиксы" + +#: ipam/models/ip.py:316 +msgid "Cannot create prefix with /0 mask." +msgstr "Невозможно создать префикс с маской /0." + +#: ipam/models/ip.py:323 ipam/models/ip.py:854 +#, python-brace-format +msgid "VRF {vrf}" +msgstr "VRF {vrf}" + +#: ipam/models/ip.py:323 ipam/models/ip.py:854 +msgid "global table" +msgstr "глобальная таблица" + +#: ipam/models/ip.py:325 +#, python-brace-format +msgid "Duplicate prefix found in {table}: {prefix}" +msgstr "Дубликат префикса обнаружен в {table}: {prefix}" + +#: ipam/models/ip.py:494 +msgid "start address" +msgstr "начальный адрес" + +#: ipam/models/ip.py:495 ipam/models/ip.py:499 ipam/models/ip.py:711 +msgid "IPv4 or IPv6 address (with mask)" +msgstr "Адрес IPv4 или IPv6 (с маской)" + +#: ipam/models/ip.py:498 +msgid "end address" +msgstr "конечный адрес" + +#: ipam/models/ip.py:525 +msgid "Operational status of this range" +msgstr "Эксплуатационное состояние этой линейки" + +#: ipam/models/ip.py:533 +msgid "The primary function of this range" +msgstr "Основная функция этого диапазона" + +#: ipam/models/ip.py:547 +msgid "IP range" +msgstr "Диапазон IP-адресов" + +#: ipam/models/ip.py:548 +msgid "IP ranges" +msgstr "Диапазоны IP-адресов" + +#: ipam/models/ip.py:564 +msgid "Starting and ending IP address versions must match" +msgstr "Начальная и конечная версии IP-адресов должны совпадать" + +#: ipam/models/ip.py:570 +msgid "Starting and ending IP address masks must match" +msgstr "Маски начального и конечного IP-адресов должны совпадать" + +#: ipam/models/ip.py:577 +#, python-brace-format +msgid "" +"Ending address must be lower than the starting address ({start_address})" +msgstr "Конечный адрес должен быть ниже начального ({start_address})" + +#: ipam/models/ip.py:589 +#, python-brace-format +msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" +msgstr "" +"Определенные адреса пересекаются с диапазоном {overlapping_range} в формате " +"VRF {vrf}" + +#: ipam/models/ip.py:598 +#, python-brace-format +msgid "Defined range exceeds maximum supported size ({max_size})" +msgstr "" +"Заданный диапазон превышает максимальный поддерживаемый размер ({max_size})" + +#: ipam/models/ip.py:710 tenancy/models/contacts.py:82 +msgid "address" +msgstr "адрес" + +#: ipam/models/ip.py:733 +msgid "The operational status of this IP" +msgstr "Рабочий статус этого IP-адреса" + +#: ipam/models/ip.py:740 +msgid "The functional role of this IP" +msgstr "Функциональная роль этого IP" + +#: ipam/models/ip.py:764 templates/ipam/ipaddress.html:75 +msgid "NAT (inside)" +msgstr "NAT (внутри)" + +#: ipam/models/ip.py:765 +msgid "The IP for which this address is the \"outside\" IP" +msgstr "IP-адрес, для которого этот адрес является «внешним»" + +#: ipam/models/ip.py:772 +msgid "Hostname or FQDN (not case-sensitive)" +msgstr "Имя хоста или полное доменное имя (без учета регистра)" + +#: ipam/models/ip.py:788 ipam/models/services.py:94 +msgid "IP addresses" +msgstr "IP-адреса" + +#: ipam/models/ip.py:844 +msgid "Cannot create IP address with /0 mask." +msgstr "Невозможно создать IP-адрес с маской /0." + +#: ipam/models/ip.py:856 +#, python-brace-format +msgid "Duplicate IP address found in {table}: {ipaddress}" +msgstr "Дубликат IP-адреса обнаружен в {table}: {ipaddress}" + +#: ipam/models/ip.py:885 +msgid "Only IPv6 addresses can be assigned SLAAC status" +msgstr "Только адресам IPv6 можно присвоить статус SLAAC" + +#: ipam/models/services.py:33 +msgid "port numbers" +msgstr "номера портов" + +#: ipam/models/services.py:59 +msgid "service template" +msgstr "шаблон сервиса" + +#: ipam/models/services.py:60 +msgid "service templates" +msgstr "шаблоны сервисов" + +#: ipam/models/services.py:95 +msgid "The specific IP addresses (if any) to which this service is bound" +msgstr "Конкретные IP-адреса (если есть), к которым привязана эта служба" + +#: ipam/models/services.py:102 +msgid "service" +msgstr "служба" + +#: ipam/models/services.py:103 +msgid "services" +msgstr "услуги" + +#: ipam/models/services.py:117 +msgid "" +"A service cannot be associated with both a device and a virtual machine." +msgstr "Службу нельзя связать как с устройством, так и с виртуальной машиной." + +#: ipam/models/services.py:119 +msgid "" +"A service must be associated with either a device or a virtual machine." +msgstr "Служба должна быть связана с устройством или виртуальной машиной." + +#: ipam/models/vlans.py:49 +msgid "minimum VLAN ID" +msgstr "минимальный идентификатор VLAN" + +#: ipam/models/vlans.py:55 +msgid "Lowest permissible ID of a child VLAN" +msgstr "Наименьший допустимый идентификатор дочерней VLAN" + +#: ipam/models/vlans.py:58 +msgid "maximum VLAN ID" +msgstr "максимальный идентификатор VLAN" + +#: ipam/models/vlans.py:64 +msgid "Highest permissible ID of a child VLAN" +msgstr "Максимально допустимый идентификатор детской VLAN" + +#: ipam/models/vlans.py:85 +msgid "VLAN groups" +msgstr "Группы VLAN" + +#: ipam/models/vlans.py:95 +msgid "Cannot set scope_type without scope_id." +msgstr "Невозможно установить scope_type без scope_id." + +#: ipam/models/vlans.py:97 +msgid "Cannot set scope_id without scope_type." +msgstr "Невозможно установить scope_id без scope_type." + +#: ipam/models/vlans.py:102 +msgid "Maximum child VID must be greater than or equal to minimum child VID" +msgstr "" +"Максимальное количество детских VID должно быть больше или равно " +"минимальному детскому VID" + +#: ipam/models/vlans.py:145 +msgid "The specific site to which this VLAN is assigned (if any)" +msgstr "Конкретный сайт, которому назначена эта VLAN (если есть)" + +#: ipam/models/vlans.py:153 +msgid "VLAN group (optional)" +msgstr "Группа VLAN (опционально)" + +#: ipam/models/vlans.py:161 +msgid "Numeric VLAN ID (1-4094)" +msgstr "Цифровой идентификатор VLAN (1-4094)" + +#: ipam/models/vlans.py:179 +msgid "Operational status of this VLAN" +msgstr "Рабочее состояние этой VLAN" + +#: ipam/models/vlans.py:187 +msgid "The primary function of this VLAN" +msgstr "Основная функция этой VLAN" + +#: ipam/models/vlans.py:215 ipam/tables/ip.py:175 ipam/tables/vlans.py:78 +#: ipam/views.py:940 netbox/navigation/menu.py:181 +#: netbox/navigation/menu.py:183 +msgid "VLANs" +msgstr "VLAN" + +#: ipam/models/vlans.py:230 +#, python-brace-format +msgid "" +"VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " +"site {site}." +msgstr "" +"VLAN назначена группе {group} (область применения: {scope}); также не может " +"быть присвоено сайту {site}." + +#: ipam/models/vlans.py:238 +#, python-brace-format +msgid "VID must be between {minimum} and {maximum} for VLANs in group {group}" +msgstr "" +"VID должен быть между {minimum} а также {maximum} для виртуальных локальных " +"сетей в группе {group}" + +#: ipam/models/vrfs.py:30 +msgid "route distinguisher" +msgstr "разграничитель маршрута" + +#: ipam/models/vrfs.py:31 +msgid "Unique route distinguisher (as defined in RFC 4364)" +msgstr "Уникальный отличитель маршрута (как определено в RFC 4364)" + +#: ipam/models/vrfs.py:42 +msgid "enforce unique space" +msgstr "создайте уникальное пространство" + +#: ipam/models/vrfs.py:43 +msgid "Prevent duplicate prefixes/IP addresses within this VRF" +msgstr "Предотвращение дублирования префиксов/IP-адресов в этом VRF" + +#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:174 +#: netbox/navigation/menu.py:176 +msgid "VRFs" +msgstr "VRF" + +#: ipam/models/vrfs.py:82 +msgid "Route target value (formatted in accordance with RFC 4360)" +msgstr "Целевое значение маршрута (отформатировано в соответствии с RFC 4360)" + +#: ipam/models/vrfs.py:94 +msgid "route target" +msgstr "цель маршрута" + +#: ipam/models/vrfs.py:95 +msgid "route targets" +msgstr "цели маршрута" + +#: ipam/tables/asn.py:52 +msgid "ASDOT" +msgstr "АСДОТ" + +#: ipam/tables/asn.py:57 +msgid "Site Count" +msgstr "Количество сайтов" + +#: ipam/tables/asn.py:62 +msgid "Provider Count" +msgstr "Количество провайдеров" + +#: ipam/tables/ip.py:94 netbox/navigation/menu.py:167 +#: netbox/navigation/menu.py:169 +msgid "Aggregates" +msgstr "Агрегаты" + +#: ipam/tables/ip.py:124 +msgid "Added" +msgstr "Добавлено" + +#: ipam/tables/ip.py:127 ipam/tables/ip.py:165 ipam/tables/vlans.py:138 +#: ipam/views.py:349 netbox/navigation/menu.py:153 +#: netbox/navigation/menu.py:155 templates/ipam/vlan.html:87 +msgid "Prefixes" +msgstr "Префиксы" + +#: ipam/tables/ip.py:130 ipam/tables/ip.py:267 ipam/tables/ip.py:320 +#: ipam/tables/vlans.py:82 templates/dcim/device.html:263 +#: templates/ipam/aggregate.html:25 templates/ipam/iprange.html:32 +#: templates/ipam/prefix.html:100 +msgid "Utilization" +msgstr "Использование" + +#: ipam/tables/ip.py:170 netbox/navigation/menu.py:149 +msgid "IP Ranges" +msgstr "Диапазоны IP-адресов" + +#: ipam/tables/ip.py:220 +msgid "Prefix (Flat)" +msgstr "Префикс (плоский)" + +#: ipam/tables/ip.py:224 templates/dcim/rack_edit.html:52 +msgid "Depth" +msgstr "Глубина" + +#: ipam/tables/ip.py:261 +msgid "Pool" +msgstr "Бассейн" + +#: ipam/tables/ip.py:264 ipam/tables/ip.py:317 +msgid "Marked Utilized" +msgstr "Отмечено как использованный" + +#: ipam/tables/ip.py:301 +msgid "Start address" +msgstr "Начальный адрес" + +#: ipam/tables/ip.py:379 +msgid "NAT (Inside)" +msgstr "NAT (внутри)" + +#: ipam/tables/ip.py:384 +msgid "NAT (Outside)" +msgstr "NAT (за пределами сети)" + +#: ipam/tables/ip.py:389 +msgid "Assigned" +msgstr "Назначено" + +#: ipam/tables/ip.py:424 templates/vpn/l2vpntermination.html:19 +#: vpn/forms/filtersets.py:235 +msgid "Assigned Object" +msgstr "Назначенный объект" + +#: ipam/tables/vlans.py:68 +msgid "Scope Type" +msgstr "Тип прицела" + +#: ipam/tables/vlans.py:107 ipam/tables/vlans.py:210 +#: templates/dcim/inc/interface_vlans_table.html:4 +msgid "VID" +msgstr "ВИДЕО" + +#: ipam/tables/vrfs.py:30 +msgid "RD" +msgstr "КРАСНЫЙ" + +#: ipam/tables/vrfs.py:33 +msgid "Unique" +msgstr "Уникальный" + +#: ipam/tables/vrfs.py:36 vpn/tables/l2vpn.py:27 +msgid "Import Targets" +msgstr "Цели импорта" + +#: ipam/tables/vrfs.py:41 vpn/tables/l2vpn.py:32 +msgid "Export Targets" +msgstr "Цели экспорта" + +#: ipam/views.py:536 +msgid "Child Prefixes" +msgstr "Дочерние префиксы" + +#: ipam/views.py:571 +msgid "Child Ranges" +msgstr "Детские диапазоны" + +#: ipam/views.py:868 +msgid "Related IPs" +msgstr "Связанные IP-адреса" + +#: ipam/views.py:1091 +msgid "Device Interfaces" +msgstr "Интерфейсы устройств" + +#: ipam/views.py:1109 +msgid "VM Interfaces" +msgstr "Интерфейсы виртуальных машин" + +#: netbox/config/parameters.py:22 templates/core/configrevision.html:111 +msgid "Login banner" +msgstr "Баннер для входа" + +#: netbox/config/parameters.py:24 +msgid "Additional content to display on the login page" +msgstr "Дополнительный контент для отображения на странице входа" + +#: netbox/config/parameters.py:33 templates/core/configrevision.html:115 +msgid "Maintenance banner" +msgstr "Баннер технического обслуживания" + +#: netbox/config/parameters.py:35 +msgid "Additional content to display when in maintenance mode" +msgstr "Дополнительный контент для отображения в режиме обслуживания" + +#: netbox/config/parameters.py:44 templates/core/configrevision.html:119 +msgid "Top banner" +msgstr "Верхний баннер" + +#: netbox/config/parameters.py:46 +msgid "Additional content to display at the top of every page" +msgstr "" +"Дополнительный контент для отображения в верхней части каждой страницы" + +#: netbox/config/parameters.py:55 templates/core/configrevision.html:123 +msgid "Bottom banner" +msgstr "Нижний баннер" + +#: netbox/config/parameters.py:57 +msgid "Additional content to display at the bottom of every page" +msgstr "Дополнительный контент для отображения внизу каждой страницы" + +#: netbox/config/parameters.py:68 +msgid "Globally unique IP space" +msgstr "Уникальное в глобальном масштабе IP-пространство" + +#: netbox/config/parameters.py:70 +msgid "Enforce unique IP addressing within the global table" +msgstr "Обеспечьте уникальную IP-адресацию в глобальной таблице" + +#: netbox/config/parameters.py:75 templates/core/configrevision.html:87 +msgid "Prefer IPv4" +msgstr "Предпочитаю IPv4" + +#: netbox/config/parameters.py:77 +msgid "Prefer IPv4 addresses over IPv6" +msgstr "Предпочитайте адреса IPv4, а не IPv6" + +#: netbox/config/parameters.py:84 +msgid "Rack unit height" +msgstr "Высота стеллажа" + +#: netbox/config/parameters.py:86 +msgid "Default unit height for rendered rack elevations" +msgstr "" +"Высота единиц измерения по умолчанию для визуализированных высот стеллажей" + +#: netbox/config/parameters.py:91 +msgid "Rack unit width" +msgstr "Ширина стеллажа" + +#: netbox/config/parameters.py:93 +msgid "Default unit width for rendered rack elevations" +msgstr "" +"Ширина единиц измерения по умолчанию для визуализированных высот стеллажей" + +#: netbox/config/parameters.py:100 +msgid "Powerfeed voltage" +msgstr "Напряжение питания" + +#: netbox/config/parameters.py:102 +msgid "Default voltage for powerfeeds" +msgstr "Напряжение по умолчанию для источников питания" + +#: netbox/config/parameters.py:107 +msgid "Powerfeed amperage" +msgstr "Сила тока в питающей сети" + +#: netbox/config/parameters.py:109 +msgid "Default amperage for powerfeeds" +msgstr "Сила тока по умолчанию для источников питания" + +#: netbox/config/parameters.py:114 +msgid "Powerfeed max utilization" +msgstr "Максимальное использование Powerfeed" + +#: netbox/config/parameters.py:116 +msgid "Default max utilization for powerfeeds" +msgstr "Максимальное использование по умолчанию для Powerfeeds" + +#: netbox/config/parameters.py:123 templates/core/configrevision.html:99 +msgid "Allowed URL schemes" +msgstr "Разрешенные схемы URL-адресов" + +#: netbox/config/parameters.py:128 +msgid "Permitted schemes for URLs in user-provided content" +msgstr "" +"Разрешенные схемы URL-адресов в предоставляемом пользователем контенте" + +#: netbox/config/parameters.py:136 +msgid "Default page size" +msgstr "Размер страницы по умолчанию" + +#: netbox/config/parameters.py:142 +msgid "Maximum page size" +msgstr "Максимальный размер страницы" + +#: netbox/config/parameters.py:150 templates/core/configrevision.html:151 +msgid "Custom validators" +msgstr "Настраиваемые валидаторы" + +#: netbox/config/parameters.py:152 +msgid "Custom validation rules (JSON)" +msgstr "Настраиваемые правила проверки (JSON)" + +#: netbox/config/parameters.py:160 templates/core/configrevision.html:161 +msgid "Protection rules" +msgstr "Правила защиты" + +#: netbox/config/parameters.py:162 +msgid "Deletion protection rules (JSON)" +msgstr "Правила защиты от удаления (JSON)" + +#: netbox/config/parameters.py:172 +msgid "Default preferences" +msgstr "Настройки по умолчанию" + +#: netbox/config/parameters.py:174 +msgid "Default preferences for new users" +msgstr "Настройки по умолчанию для новых пользователей" + +#: netbox/config/parameters.py:181 templates/core/configrevision.html:197 +msgid "Maintenance mode" +msgstr "Режим обслуживания" + +#: netbox/config/parameters.py:183 +msgid "Enable maintenance mode" +msgstr "Включить режим обслуживания" + +#: netbox/config/parameters.py:188 templates/core/configrevision.html:201 +msgid "GraphQL enabled" +msgstr "GraphQL включен" + +#: netbox/config/parameters.py:190 +msgid "Enable the GraphQL API" +msgstr "Включите API GraphQL" + +#: netbox/config/parameters.py:195 templates/core/configrevision.html:205 +msgid "Changelog retention" +msgstr "Хранение журнала изменений" + +#: netbox/config/parameters.py:197 +msgid "Days to retain changelog history (set to zero for unlimited)" +msgstr "" +"Количество дней для хранения истории изменений (равно нулю без ограничений)" + +#: netbox/config/parameters.py:202 +msgid "Job result retention" +msgstr "Сохранение результатов работы" + +#: netbox/config/parameters.py:204 +msgid "Days to retain job result history (set to zero for unlimited)" +msgstr "" +"Количество дней для хранения истории результатов работы (нулевое значение не" +" ограничено)" + +#: netbox/config/parameters.py:209 templates/core/configrevision.html:213 +msgid "Maps URL" +msgstr "URL-адрес карты" + +#: netbox/config/parameters.py:211 +msgid "Base URL for mapping geographic locations" +msgstr "Базовый URL-адрес для картографирования географических местоположений" + +#: netbox/forms/__init__.py:13 +msgid "Partial match" +msgstr "Частичное совпадение" + +#: netbox/forms/__init__.py:14 +msgid "Exact match" +msgstr "Точное совпадение" + +#: netbox/forms/__init__.py:15 +msgid "Starts with" +msgstr "Начинается с" + +#: netbox/forms/__init__.py:16 +msgid "Ends with" +msgstr "Заканчивается на" + +#: netbox/forms/__init__.py:17 +msgid "Regex" +msgstr "Regex" + +#: netbox/forms/__init__.py:35 +msgid "Object type(s)" +msgstr "Тип (ы) объекта" + +#: netbox/forms/base.py:66 +msgid "Id" +msgstr "Я" + +#: netbox/forms/base.py:105 +msgid "Add tags" +msgstr "Добавить теги" + +#: netbox/forms/base.py:110 +msgid "Remove tags" +msgstr "Удалить теги" + +#: netbox/models/features.py:434 +msgid "Remote data source" +msgstr "Удаленный источник данных" + +#: netbox/models/features.py:444 +msgid "data path" +msgstr "путь к данным" + +#: netbox/models/features.py:448 +msgid "Path to remote file (relative to data source root)" +msgstr "Путь к удаленному файлу (относительно корня источника данных)" + +#: netbox/models/features.py:451 +msgid "auto sync enabled" +msgstr "автоматическая синхронизация включена" + +#: netbox/models/features.py:453 +msgid "Enable automatic synchronization of data when the data file is updated" +msgstr "" +"Включить автоматическую синхронизацию данных при обновлении файла данных" + +#: netbox/models/features.py:456 +msgid "date synced" +msgstr "дата синхронизирована" + +#: netbox/navigation/menu.py:12 +msgid "Organization" +msgstr "Организация" + +#: netbox/navigation/menu.py:20 +msgid "Site Groups" +msgstr "Группы сайтов" + +#: netbox/navigation/menu.py:28 +msgid "Rack Roles" +msgstr "Роли стоек" + +#: netbox/navigation/menu.py:32 +msgid "Elevations" +msgstr "Возвышения" + +#: netbox/navigation/menu.py:41 +msgid "Tenant Groups" +msgstr "Группы арендаторов" + +#: netbox/navigation/menu.py:48 +msgid "Contact Groups" +msgstr "Контактные группы" + +#: netbox/navigation/menu.py:49 templates/tenancy/contactrole.html:8 +msgid "Contact Roles" +msgstr "Роли контактов" + +#: netbox/navigation/menu.py:50 +msgid "Contact Assignments" +msgstr "Назначения контактов" + +#: netbox/navigation/menu.py:64 +msgid "Modules" +msgstr "Модули" + +#: netbox/navigation/menu.py:65 templates/dcim/devicerole.html:8 +msgid "Device Roles" +msgstr "Роли устройств" + +#: netbox/navigation/menu.py:68 templates/dcim/device.html:162 +#: templates/dcim/virtualdevicecontext.html:8 +msgid "Virtual Device Contexts" +msgstr "Контексты виртуальных устройств" + +#: netbox/navigation/menu.py:76 +msgid "Manufacturers" +msgstr "Производители" + +#: netbox/navigation/menu.py:80 +msgid "Device Components" +msgstr "Компоненты устройства" + +#: netbox/navigation/menu.py:92 templates/dcim/inventoryitemrole.html:8 +msgid "Inventory Item Roles" +msgstr "Роли предметов инвентаря" + +#: netbox/navigation/menu.py:99 netbox/navigation/menu.py:103 +msgid "Connections" +msgstr "Подключения" + +#: netbox/navigation/menu.py:105 +msgid "Cables" +msgstr "Кабели" + +#: netbox/navigation/menu.py:106 +msgid "Wireless Links" +msgstr "Беспроводные каналы" + +#: netbox/navigation/menu.py:109 +msgid "Interface Connections" +msgstr "Интерфейсные подключения" + +#: netbox/navigation/menu.py:114 +msgid "Console Connections" +msgstr "Подключения к консоли" + +#: netbox/navigation/menu.py:119 +msgid "Power Connections" +msgstr "Подключения питания" + +#: netbox/navigation/menu.py:135 +msgid "Wireless LAN Groups" +msgstr "Группы беспроводных локальных сетей" + +#: netbox/navigation/menu.py:156 +msgid "Prefix & VLAN Roles" +msgstr "Роли префиксов и VLAN" + +#: netbox/navigation/menu.py:162 +msgid "ASN Ranges" +msgstr "Диапазоны ASN" + +#: netbox/navigation/menu.py:184 +msgid "VLAN Groups" +msgstr "Группы VLAN" + +#: netbox/navigation/menu.py:191 +msgid "Service Templates" +msgstr "Шаблоны услуг" + +#: netbox/navigation/menu.py:192 templates/dcim/device.html:304 +#: templates/ipam/ipaddress.html:122 +#: templates/virtualization/virtualmachine.html:157 +msgid "Services" +msgstr "Сервисы" + +#: netbox/navigation/menu.py:199 +msgid "VPN" +msgstr "VPN" + +#: netbox/navigation/menu.py:203 netbox/navigation/menu.py:205 +#: vpn/tables/tunnels.py:24 +msgid "Tunnels" +msgstr "Тоннели" + +#: netbox/navigation/menu.py:206 templates/vpn/tunnelgroup.html:8 +msgid "Tunnel Groups" +msgstr "Группы туннелей" + +#: netbox/navigation/menu.py:207 +msgid "Tunnel Terminations" +msgstr "Окончание туннелей" + +#: netbox/navigation/menu.py:211 netbox/navigation/menu.py:213 +#: vpn/models/l2vpn.py:64 +msgid "L2VPNs" +msgstr "VPN-сервисы L2P" + +#: netbox/navigation/menu.py:214 templates/vpn/l2vpn.html:57 +#: templates/vpn/tunnel.html:73 vpn/tables/tunnels.py:54 +msgid "Terminations" +msgstr "Прекращения" + +#: netbox/navigation/menu.py:220 +msgid "IKE Proposals" +msgstr "Предложения IKE" + +#: netbox/navigation/menu.py:221 templates/vpn/ikeproposal.html:42 +msgid "IKE Policies" +msgstr "Политики IKE" + +#: netbox/navigation/menu.py:222 +msgid "IPSec Proposals" +msgstr "Предложения IPsec" + +#: netbox/navigation/menu.py:223 templates/vpn/ipsecproposal.html:38 +msgid "IPSec Policies" +msgstr "Политики IPsec" + +#: netbox/navigation/menu.py:224 templates/vpn/ikepolicy.html:39 +#: templates/vpn/ipsecpolicy.html:26 +msgid "IPSec Profiles" +msgstr "Профили IPsec" + +#: netbox/navigation/menu.py:231 templates/dcim/device_edit.html:78 +msgid "Virtualization" +msgstr "Виртуализация" + +#: netbox/navigation/menu.py:235 netbox/navigation/menu.py:237 +#: virtualization/views.py:186 +msgid "Virtual Machines" +msgstr "Виртуальные машины" + +#: netbox/navigation/menu.py:239 +#: templates/virtualization/virtualmachine.html:177 +#: templates/virtualization/virtualmachine/base.html:32 +#: templates/virtualization/virtualmachine_list.html:21 +#: virtualization/tables/virtualmachines.py:90 virtualization/views.py:389 +msgid "Virtual Disks" +msgstr "Виртуальные диски" + +#: netbox/navigation/menu.py:246 +msgid "Cluster Types" +msgstr "Типы кластеров" + +#: netbox/navigation/menu.py:247 +msgid "Cluster Groups" +msgstr "Кластерные группы" + +#: netbox/navigation/menu.py:261 +msgid "Circuit Types" +msgstr "Типы цепей" + +#: netbox/navigation/menu.py:265 netbox/navigation/menu.py:267 +msgid "Providers" +msgstr "Поставщики" + +#: netbox/navigation/menu.py:268 templates/circuits/provider.html:53 +msgid "Provider Accounts" +msgstr "Учетные записи поставщиков" + +#: netbox/navigation/menu.py:269 +msgid "Provider Networks" +msgstr "Сети провайдеров" + +#: netbox/navigation/menu.py:283 +msgid "Power Panels" +msgstr "Панели питания" + +#: netbox/navigation/menu.py:294 +msgid "Configurations" +msgstr "Конфигурации" + +#: netbox/navigation/menu.py:296 +msgid "Config Contexts" +msgstr "Контексты конфигурации" + +#: netbox/navigation/menu.py:297 +msgid "Config Templates" +msgstr "Шаблоны конфигурации" + +#: netbox/navigation/menu.py:304 netbox/navigation/menu.py:308 +msgid "Customization" +msgstr "Настройка" + +#: netbox/navigation/menu.py:310 +#: templates/circuits/circuittermination_edit.html:53 +#: templates/dcim/cable_edit.html:77 templates/dcim/device_edit.html:103 +#: templates/dcim/inventoryitem_edit.html:102 templates/dcim/rack_edit.html:81 +#: templates/dcim/virtualchassis_add.html:31 +#: templates/dcim/virtualchassis_edit.html:41 +#: templates/generic/bulk_edit.html:92 templates/htmx/form.html:32 +#: templates/inc/panels/custom_fields.html:7 +#: templates/ipam/ipaddress_bulk_add.html:35 +#: templates/ipam/ipaddress_edit.html:88 templates/ipam/service_create.html:75 +#: templates/ipam/service_edit.html:62 templates/ipam/vlan_edit.html:63 +#: templates/tenancy/contactassignment_edit.html:31 +#: templates/vpn/l2vpntermination_edit.html:51 +msgid "Custom Fields" +msgstr "Настраиваемые поля" + +#: netbox/navigation/menu.py:311 +msgid "Custom Field Choices" +msgstr "Выбор настраиваемых полей" + +#: netbox/navigation/menu.py:312 +msgid "Custom Links" +msgstr "Настраиваемые ссылки" + +#: netbox/navigation/menu.py:313 +msgid "Export Templates" +msgstr "Шаблоны экспорта" + +#: netbox/navigation/menu.py:314 +msgid "Saved Filters" +msgstr "Сохраненные фильтры" + +#: netbox/navigation/menu.py:316 +msgid "Image Attachments" +msgstr "Вложения изображений" + +#: netbox/navigation/menu.py:320 +msgid "Reports & Scripts" +msgstr "Отчеты и сценарии" + +#: netbox/navigation/menu.py:340 +msgid "Operations" +msgstr "Операции" + +#: netbox/navigation/menu.py:344 +msgid "Integrations" +msgstr "Интеграции" + +#: netbox/navigation/menu.py:346 +msgid "Data Sources" +msgstr "Источники данных" + +#: netbox/navigation/menu.py:347 +msgid "Event Rules" +msgstr "Правила мероприятия" + +#: netbox/navigation/menu.py:348 +msgid "Webhooks" +msgstr "Вебхуки" + +#: netbox/navigation/menu.py:352 netbox/navigation/menu.py:356 +#: netbox/views/generic/feature_views.py:151 +#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +msgid "Jobs" +msgstr "Вакансии" + +#: netbox/navigation/menu.py:362 +msgid "Logging" +msgstr "Ведение журнала" + +#: netbox/navigation/menu.py:364 +msgid "Journal Entries" +msgstr "Записи в журнале" + +#: netbox/navigation/menu.py:365 templates/extras/objectchange.html:8 +#: templates/extras/objectchange_list.html:4 +msgid "Change Log" +msgstr "Журнал изменений" + +#: netbox/navigation/menu.py:372 templates/inc/profile_button.html:18 +msgid "Admin" +msgstr "Администратор" + +#: netbox/navigation/menu.py:381 templates/users/group.html:27 +#: users/forms/model_forms.py:242 users/forms/model_forms.py:255 +#: users/forms/model_forms.py:309 users/tables.py:105 +msgid "Users" +msgstr "Пользователи" + +#: netbox/navigation/menu.py:404 users/forms/model_forms.py:182 +#: users/forms/model_forms.py:195 users/forms/model_forms.py:314 +#: users/tables.py:35 users/tables.py:109 +msgid "Groups" +msgstr "Группы" + +#: netbox/navigation/menu.py:426 templates/account/base.html:21 +#: templates/inc/profile_button.html:39 +msgid "API Tokens" +msgstr "Токены API" + +#: netbox/navigation/menu.py:433 users/forms/model_forms.py:188 +#: users/forms/model_forms.py:197 users/forms/model_forms.py:248 +#: users/forms/model_forms.py:256 +msgid "Permissions" +msgstr "Разрешения" + +#: netbox/navigation/menu.py:445 +msgid "Current Config" +msgstr "Текущая конфигурация" + +#: netbox/navigation/menu.py:451 +msgid "Config Revisions" +msgstr "Ревизии конфигурации" + +#: netbox/navigation/menu.py:491 templates/500.html:35 +#: templates/account/preferences.html:29 +msgid "Plugins" +msgstr "Плагины" + +#: netbox/preferences.py:17 +msgid "Color mode" +msgstr "Цветовой режим" + +#: netbox/preferences.py:25 +msgid "Page length" +msgstr "Длина страницы" + +#: netbox/preferences.py:27 +msgid "The default number of objects to display per page" +msgstr "Количество объектов, отображаемых на странице по умолчанию" + +#: netbox/preferences.py:31 +msgid "Paginator placement" +msgstr "Размещение пагинатора" + +#: netbox/preferences.py:37 +msgid "Where the paginator controls will be displayed relative to a table" +msgstr "" +"Где элементы управления пагинатором будут отображаться относительно таблицы" + +#: netbox/preferences.py:43 +msgid "Data format" +msgstr "Формат данных" + +#: netbox/tables/columns.py:175 +msgid "Toggle all" +msgstr "Переключить все" + +#: netbox/tables/columns.py:277 templates/inc/profile_button.html:56 +msgid "Toggle Dropdown" +msgstr "Переключить выпадающий список" + +#: netbox/tables/columns.py:542 templates/core/job.html:40 +msgid "Error" +msgstr "Ошибка" + +#: netbox/tables/tables.py:243 templates/generic/bulk_import.html:115 +msgid "Field" +msgstr "Поле" + +#: netbox/tables/tables.py:246 +msgid "Value" +msgstr "Ценность" + +#: netbox/tables/tables.py:259 +msgid "No results found" +msgstr "Результаты не найдены" + +#: netbox/tests/dummy_plugin/navigation.py:29 +msgid "Dummy Plugin" +msgstr "Фиктивный плагин" + +#: netbox/views/generic/feature_views.py:38 +msgid "Changelog" +msgstr "Журнал изменений" + +#: netbox/views/generic/feature_views.py:91 +msgid "Journal" +msgstr "журнал" + +#: templates/403.html:4 +msgid "Access Denied" +msgstr "Отказано в доступе" + +#: templates/403.html:9 +msgid "You do not have permission to access this page" +msgstr "У вас нет разрешения на доступ к этой странице" + +#: templates/404.html:4 +msgid "Page Not Found" +msgstr "Страница не найдена" + +#: templates/404.html:9 +msgid "The requested page does not exist" +msgstr "Запрошенная страница не существует" + +#: templates/500.html:7 templates/500.html:18 +msgid "Server Error" +msgstr "Ошибка сервера" + +#: templates/500.html:23 +msgid "There was a problem with your request. Please contact an administrator" +msgstr "С вашим запросом возникла проблема. Обратитесь к администратору" + +#: templates/500.html:28 +msgid "The complete exception is provided below" +msgstr "Полное исключение приведено ниже" + +#: templates/500.html:33 +msgid "Python version" +msgstr "Версия для Python" + +#: templates/500.html:34 +msgid "NetBox version" +msgstr "Версия NetBox" + +#: templates/500.html:36 +msgid "None installed" +msgstr "Ничего не установлено" + +#: templates/500.html:39 +msgid "If further assistance is required, please post to the" +msgstr "Если требуется дополнительная помощь, отправьте сообщение по адресу" + +#: templates/500.html:39 +msgid "NetBox discussion forum" +msgstr "Дискуссионный форум NetBox" + +#: templates/500.html:39 +msgid "on GitHub" +msgstr "на GitHub" + +#: templates/500.html:42 templates/base/40x.html:17 +msgid "Home Page" +msgstr "Домашняя страница" + +#: templates/account/base.html:7 templates/inc/profile_button.html:24 +#: vpn/forms/bulk_edit.py:256 vpn/forms/filtersets.py:186 +#: vpn/forms/model_forms.py:372 +msgid "Profile" +msgstr "Профиль" + +#: templates/account/base.html:13 templates/inc/profile_button.html:34 +msgid "Preferences" +msgstr "Предпочтения" + +#: templates/account/password.html:5 +msgid "Change Password" +msgstr "Изменить пароль" + +#: templates/account/password.html:17 templates/account/preferences.html:82 +#: templates/core/configrevision_restore.html:80 +#: templates/dcim/devicebay_populate.html:34 +#: templates/dcim/virtualchassis_add_member.html:24 +#: templates/dcim/virtualchassis_edit.html:104 +#: templates/extras/object_journal.html:26 templates/extras/script.html:36 +#: templates/generic/bulk_add_component.html:55 +#: templates/generic/bulk_delete.html:46 templates/generic/bulk_edit.html:125 +#: templates/generic/bulk_import.html:53 templates/generic/bulk_import.html:75 +#: templates/generic/bulk_import.html:97 templates/generic/bulk_remove.html:42 +#: templates/generic/bulk_rename.html:44 +#: templates/generic/confirmation_form.html:20 +#: templates/generic/object_edit.html:76 templates/htmx/delete_form.html:53 +#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:31 +#: templates/virtualization/cluster_add_devices.html:30 +msgid "Cancel" +msgstr "Отменить" + +#: templates/account/password.html:18 templates/account/preferences.html:83 +#: templates/dcim/devicebay_populate.html:35 +#: templates/dcim/virtualchassis_add_member.html:26 +#: templates/dcim/virtualchassis_edit.html:106 +#: templates/extras/dashboard/widget_add.html:26 +#: templates/extras/dashboard/widget_config.html:19 +#: templates/extras/object_journal.html:27 +#: templates/generic/object_edit.html:66 +#: utilities/templates/helpers/applied_filters.html:16 +#: utilities/templates/helpers/table_config_form.html:40 +msgid "Save" +msgstr "Сохранить" + +#: templates/account/preferences.html:41 +msgid "Table Configurations" +msgstr "Конфигурации таблиц" + +#: templates/account/preferences.html:46 +msgid "Clear table preferences" +msgstr "Очистить настройки таблицы" + +#: templates/account/preferences.html:53 +msgid "Toggle All" +msgstr "Переключить все" + +#: templates/account/preferences.html:55 +msgid "Table" +msgstr "Таблица" + +#: templates/account/preferences.html:56 +msgid "Ordering" +msgstr "Заказ" + +#: templates/account/preferences.html:57 +msgid "Columns" +msgstr "Колонны" + +#: templates/account/preferences.html:76 templates/dcim/cable_trace.html:113 +#: templates/extras/object_configcontext.html:55 +msgid "None found" +msgstr "Ничего не найдено" + +#: templates/account/profile.html:6 +msgid "User Profile" +msgstr "Профиль пользователя" + +#: templates/account/profile.html:12 +msgid "Account Details" +msgstr "Сведения об учетной записи" + +#: templates/account/profile.html:30 templates/tenancy/contact.html:44 +#: templates/users/user.html:26 tenancy/forms/bulk_edit.py:108 +msgid "Email" +msgstr "Электронная почта" + +#: templates/account/profile.html:34 templates/users/user.html:30 +msgid "Account Created" +msgstr "Учетная запись создана" + +#: templates/account/profile.html:38 templates/users/user.html:42 +msgid "Superuser" +msgstr "Суперпользователь" + +#: templates/account/profile.html:42 +msgid "Admin Access" +msgstr "Доступ администратора" + +#: templates/account/profile.html:51 templates/users/objectpermission.html:86 +#: templates/users/user.html:51 +msgid "Assigned Groups" +msgstr "Назначенные группы" + +#: templates/account/profile.html:56 +#: templates/circuits/circuit_terminations_swap.html:18 +#: templates/circuits/circuit_terminations_swap.html:26 +#: templates/circuits/inc/circuit_termination.html:154 +#: templates/dcim/devicebay.html:66 +#: templates/dcim/inc/panels/inventory_items.html:37 +#: templates/dcim/interface.html:306 templates/dcim/modulebay.html:79 +#: templates/extras/configcontext.html:73 templates/extras/eventrule.html:84 +#: templates/extras/htmx/script_result.html:54 +#: templates/extras/object_configcontext.html:28 +#: templates/extras/objectchange.html:128 +#: templates/extras/objectchange.html:145 templates/extras/webhook.html:79 +#: templates/extras/webhook.html:91 templates/inc/panel_table.html:12 +#: templates/inc/panels/comments.html:12 +#: templates/ipam/inc/panels/fhrp_groups.html:43 templates/users/group.html:32 +#: templates/users/group.html:42 templates/users/objectpermission.html:81 +#: templates/users/objectpermission.html:91 templates/users/user.html:56 +#: templates/users/user.html:66 +msgid "None" +msgstr "Нет" + +#: templates/account/profile.html:66 templates/users/user.html:76 +msgid "Recent Activity" +msgstr "Недавняя активность" + +#: templates/account/token.html:8 templates/account/token_list.html:6 +msgid "My API Tokens" +msgstr "Мои токены API" + +#: templates/account/token.html:11 templates/account/token.html:19 +#: templates/users/token.html:6 templates/users/token.html:14 +#: users/forms/filtersets.py:121 +msgid "Token" +msgstr "Токен" + +#: templates/account/token.html:40 templates/users/token.html:32 +#: users/forms/bulk_edit.py:87 +msgid "Write enabled" +msgstr "Запись включена" + +#: templates/account/token.html:52 templates/users/token.html:44 +msgid "Last used" +msgstr "Последний раз использованный" + +#: templates/account/token_list.html:12 +msgid "Add a Token" +msgstr "Добавить токен" + +#: templates/admin/index.html:10 +msgid "System" +msgstr "система" + +#: templates/admin/index.html:14 +msgid "Background Tasks" +msgstr "Фоновые задачи" + +#: templates/admin/index.html:19 +msgid "Installed plugins" +msgstr "Установленные плагины" + +#: templates/base/base.html:28 templates/extras/admin/plugins_list.html:8 +#: templates/home.html:24 +msgid "Home" +msgstr "Главная" + +#: templates/base/layout.html:27 templates/base/layout.html:37 +#: templates/login.html:34 +msgid "NetBox logo" +msgstr "Логотип NetBox" + +#: templates/base/layout.html:76 +msgid "Debug mode is enabled" +msgstr "Включен режим отладки" + +#: templates/base/layout.html:77 +msgid "" +"Performance may be limited. Debugging should never be enabled on a " +"production system" +msgstr "" +"Производительность может быть ограничена. В производственной системе ни в " +"коем случае нельзя включать отладку" + +#: templates/base/layout.html:83 +msgid "Maintenance Mode" +msgstr "Режим обслуживания" + +#: templates/base/layout.html:134 +msgid "Docs" +msgstr "Документы" + +#: templates/base/layout.html:139 templates/rest_framework/api.html:10 +msgid "REST API" +msgstr "ОСТАЛЬНОЕ API" + +#: templates/base/layout.html:144 +msgid "REST API documentation" +msgstr "Документация по REST API" + +#: templates/base/layout.html:150 +msgid "GraphQL API" +msgstr "API GraphQL" + +#: templates/base/layout.html:156 +msgid "Source Code" +msgstr "Исходный код" + +#: templates/base/layout.html:161 +msgid "Community" +msgstr "Сообщество" + +#: templates/base/sidenav.html:12 templates/base/sidenav.html:17 +msgid "NetBox Logo" +msgstr "Логотип NetBox" + +#: templates/circuits/circuit.html:48 +msgid "Install Date" +msgstr "Дата установки" + +#: templates/circuits/circuit.html:52 +msgid "Termination Date" +msgstr "Дата увольнения" + +#: templates/circuits/circuit_terminations_swap.html:4 +msgid "Swap Circuit Terminations" +msgstr "Прерывания цепей Swap" + +#: templates/circuits/circuit_terminations_swap.html:8 +#, python-format +msgid "Swap these terminations for circuit %(circuit)s?" +msgstr "Замените эти разъемы на схему %(circuit)s?" + +#: templates/circuits/circuit_terminations_swap.html:14 +msgid "A side" +msgstr "Сторона" + +#: templates/circuits/circuit_terminations_swap.html:22 +msgid "Z side" +msgstr "Сторона Z" + +#: templates/circuits/circuittermination_edit.html:9 +#: templates/circuits/inc/circuit_termination.html:81 +#: templates/dcim/frontport.html:128 templates/dcim/interface.html:199 +#: templates/dcim/rearport.html:118 +msgid "Circuit Termination" +msgstr "Прекращение цепи" + +#: templates/circuits/circuittermination_edit.html:41 +msgid "Termination Details" +msgstr "Сведения об увольнении" + +#: templates/circuits/circuittype.html:10 +msgid "Add Circuit" +msgstr "Добавить цепь" + +#: templates/circuits/inc/circuit_termination.html:9 +#: templates/dcim/devicetype/component_templates.html:30 +#: templates/dcim/manufacturer.html:11 +#: templates/dcim/moduletype/component_templates.html:30 +#: templates/generic/bulk_add_component.html:8 +#: templates/users/objectpermission.html:41 +#: utilities/templates/buttons/add.html:4 +#: utilities/templates/helpers/table_config_form.html:20 +msgid "Add" +msgstr "Добавить" + +#: templates/circuits/inc/circuit_termination.html:14 +#: templates/circuits/inc/circuit_termination.html:63 +#: templates/dcim/devicetype/component_templates.html:21 +#: templates/dcim/inc/panels/inventory_items.html:24 +#: templates/dcim/moduletype/component_templates.html:21 +#: templates/dcim/powerpanel.html:61 templates/generic/object_edit.html:29 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +#: templates/ipam/inc/panels/fhrp_groups.html:30 +#: utilities/templates/buttons/edit.html:3 +msgid "Edit" +msgstr "Редактировать" + +#: templates/circuits/inc/circuit_termination.html:17 +msgid "Swap" +msgstr "Обмен" + +#: templates/circuits/inc/circuit_termination.html:26 +#, python-format +msgid "Termination %(side)s" +msgstr "Прекращение %(side)s" + +#: templates/circuits/inc/circuit_termination.html:42 +#: templates/dcim/cable.html:70 templates/dcim/cable.html:76 +#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:76 +msgid "Termination" +msgstr "Прекращение" + +#: templates/circuits/inc/circuit_termination.html:46 +#: templates/dcim/consoleport.html:62 templates/dcim/consoleserverport.html:62 +#: templates/dcim/powerfeed.html:122 +msgid "Marked as connected" +msgstr "Отмечено как подключенное" + +#: templates/circuits/inc/circuit_termination.html:48 +msgid "to" +msgstr "к" + +#: templates/circuits/inc/circuit_termination.html:58 +#: templates/circuits/inc/circuit_termination.html:59 +#: templates/dcim/frontport.html:87 +#: templates/dcim/inc/connection_endpoints.html:7 +#: templates/dcim/interface.html:160 templates/dcim/rearport.html:83 +msgid "Trace" +msgstr "Следить" + +#: templates/circuits/inc/circuit_termination.html:62 +msgid "Edit cable" +msgstr "Редактирование кабеля" + +#: templates/circuits/inc/circuit_termination.html:67 +msgid "Remove cable" +msgstr "Извлеките кабель" + +#: templates/circuits/inc/circuit_termination.html:68 +#: templates/dcim/bulk_disconnect.html:5 +#: templates/dcim/device/consoleports.html:12 +#: templates/dcim/device/consoleserverports.html:12 +#: templates/dcim/device/frontports.html:12 +#: templates/dcim/device/interfaces.html:16 +#: templates/dcim/device/poweroutlets.html:12 +#: templates/dcim/device/powerports.html:12 +#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:66 +msgid "Disconnect" +msgstr "Отключить" + +#: templates/circuits/inc/circuit_termination.html:75 +#: templates/dcim/consoleport.html:71 templates/dcim/consoleserverport.html:71 +#: templates/dcim/frontport.html:109 templates/dcim/interface.html:186 +#: templates/dcim/interface.html:206 templates/dcim/powerfeed.html:136 +#: templates/dcim/poweroutlet.html:75 templates/dcim/poweroutlet.html:76 +#: templates/dcim/powerport.html:77 templates/dcim/rearport.html:105 +msgid "Connect" +msgstr "Подключить" + +#: templates/circuits/inc/circuit_termination.html:79 +#: templates/dcim/consoleport.html:78 templates/dcim/consoleserverport.html:78 +#: templates/dcim/frontport.html:18 templates/dcim/frontport.html:122 +#: templates/dcim/interface.html:193 templates/dcim/inventoryitem_edit.html:49 +#: templates/dcim/rearport.html:112 +msgid "Front Port" +msgstr "Передний порт" + +#: templates/circuits/inc/circuit_termination.html:97 +msgid "Downstream" +msgstr "Ниже по течению" + +#: templates/circuits/inc/circuit_termination.html:98 +msgid "Upstream" +msgstr "Вверх по течению" + +#: templates/circuits/inc/circuit_termination.html:107 +msgid "Cross-Connect" +msgstr "Кросс-коннект" + +#: templates/circuits/inc/circuit_termination.html:111 +msgid "Patch Panel/Port" +msgstr "Патч-панель/порт" + +#: templates/circuits/provider.html:11 +msgid "Add circuit" +msgstr "Добавить цепь" + +#: templates/circuits/provideraccount.html:17 +msgid "Provider Account" +msgstr "Учетная запись поставщика" + +#: templates/core/configrevision.html:47 +msgid "Default unit height" +msgstr "Высота единицы измерения по умолчанию" + +#: templates/core/configrevision.html:51 +msgid "Default unit width" +msgstr "Ширина блока по умолчанию" + +#: templates/core/configrevision.html:63 +msgid "Default voltage" +msgstr "Напряжение по умолчанию" + +#: templates/core/configrevision.html:67 +msgid "Default amperage" +msgstr "Сила тока по умолчанию" + +#: templates/core/configrevision.html:71 +msgid "Default max utilization" +msgstr "Максимальное использование по умолчанию" + +#: templates/core/configrevision.html:83 +msgid "Enforce global unique" +msgstr "Обеспечьте глобальную уникальность" + +#: templates/core/configrevision.html:135 +msgid "Paginate count" +msgstr "Количество страниц" + +#: templates/core/configrevision.html:139 +msgid "Max page size" +msgstr "Максимальный размер страницы" + +#: templates/core/configrevision.html:179 +msgid "Default user preferences" +msgstr "Пользовательские настройки по умолчанию" + +#: templates/core/configrevision.html:209 +msgid "Job retention" +msgstr "Сохранение рабочих мест" + +#: templates/core/configrevision.html:221 +msgid "Comment" +msgstr "Комментарий" + +#: templates/core/configrevision_restore.html:8 +#: templates/core/configrevision_restore.html:43 +#: templates/core/configrevision_restore.html:79 +msgid "Restore" +msgstr "Восстановить" + +#: templates/core/configrevision_restore.html:21 +msgid "Config revisions" +msgstr "Ревизии конфигурации" + +#: templates/core/configrevision_restore.html:54 +msgid "Parameter" +msgstr "Параметр" + +#: templates/core/configrevision_restore.html:55 +msgid "Current Value" +msgstr "Текущее значение" + +#: templates/core/configrevision_restore.html:56 +msgid "New Value" +msgstr "Новое значение" + +#: templates/core/configrevision_restore.html:66 +msgid "Changed" +msgstr "Изменено" + +#: templates/core/datafile.html:47 +msgid "Last Updated" +msgstr "Последнее обновление" + +#: templates/core/datafile.html:51 templates/ipam/iprange.html:28 +#: templates/virtualization/virtualdisk.html:30 +msgid "Size" +msgstr "Размер" + +#: templates/core/datafile.html:52 +msgid "bytes" +msgstr "байтов" + +#: templates/core/datafile.html:55 +msgid "SHA256 Hash" +msgstr "Хэш SHA256" + +#: templates/core/datasource.html:14 templates/core/datasource.html:20 +#: utilities/templates/buttons/sync.html:5 +msgid "Sync" +msgstr "Синхронизация" + +#: templates/core/datasource.html:51 +msgid "Last synced" +msgstr "Последняя синхронизация" + +#: templates/core/datasource.html:86 +msgid "Backend" +msgstr "Серверная часть" + +#: templates/core/datasource.html:102 +msgid "No parameters defined" +msgstr "Параметры не определены" + +#: templates/core/datasource.html:118 +msgid "Files" +msgstr "файлы" + +#: templates/core/job.html:21 +msgid "Job" +msgstr "Задание" + +#: templates/core/job.html:45 templates/extras/journalentry.html:29 +msgid "Created By" +msgstr "Создано" + +#: templates/core/job.html:54 +msgid "Scheduling" +msgstr "Планирование" + +#: templates/core/job.html:66 +#, python-format +msgid "every %(interval)s seconds" +msgstr "каждый %(interval)s секунды" + +#: templates/dcim/bulk_disconnect.html:9 +#, python-format +msgid "" +"Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" +msgstr "Вы действительно хотите отключить их? %(count)s %(obj_type_plural)s?" + +#: templates/dcim/cable_edit.html:12 +msgid "A Side" +msgstr "Сторона «А»" + +#: templates/dcim/cable_edit.html:29 +msgid "B Side" +msgstr "Сторона «Б»" + +#: templates/dcim/cable_trace.html:6 +#, python-format +msgid "Cable Trace for %(object_type)s %(object)s" +msgstr "Трассировка кабелей для %(object_type)s %(object)s" + +#: templates/dcim/cable_trace.html:21 templates/dcim/inc/rack_elevation.html:7 +msgid "Download SVG" +msgstr "Загрузить SVG" + +#: templates/dcim/cable_trace.html:27 +msgid "Asymmetric Path" +msgstr "Асимметричный путь" + +#: templates/dcim/cable_trace.html:28 +msgid "The nodes below have no links and result in an asymmetric path" +msgstr "" +"Приведенные ниже узлы не имеют ссылок и обеспечивают асимметричный путь" + +#: templates/dcim/cable_trace.html:35 +msgid "Path split" +msgstr "Разделение путей" + +#: templates/dcim/cable_trace.html:36 +msgid "Select a node below to continue" +msgstr "Выберите узел ниже, чтобы продолжить" + +#: templates/dcim/cable_trace.html:52 +msgid "Trace Completed" +msgstr "Трассировка завершена" + +#: templates/dcim/cable_trace.html:55 +msgid "Total segments" +msgstr "Всего сегментов" + +#: templates/dcim/cable_trace.html:59 +msgid "Total length" +msgstr "Общая длина" + +#: templates/dcim/cable_trace.html:74 +msgid "No paths found" +msgstr "Пути не найдены" + +#: templates/dcim/cable_trace.html:83 +msgid "Related Paths" +msgstr "Связанные пути" + +#: templates/dcim/cable_trace.html:89 +msgid "Origin" +msgstr "Происхождение" + +#: templates/dcim/cable_trace.html:90 +msgid "Destination" +msgstr "Пункт назначения" + +#: templates/dcim/cable_trace.html:91 +msgid "Segments" +msgstr "Сегменты" + +#: templates/dcim/cable_trace.html:104 +msgid "Incomplete" +msgstr "Неполный" + +#: templates/dcim/component_list.html:14 +msgid "Rename Selected" +msgstr "Переименовать выбранное" + +#: templates/dcim/consoleport.html:67 templates/dcim/consoleserverport.html:67 +#: templates/dcim/frontport.html:105 templates/dcim/interface.html:182 +#: templates/dcim/poweroutlet.html:73 templates/dcim/powerport.html:73 +msgid "Not Connected" +msgstr "Не подключено" + +#: templates/dcim/consoleport.html:75 templates/dcim/consoleserverport.html:18 +#: templates/dcim/frontport.html:116 templates/dcim/inventoryitem_edit.html:44 +msgid "Console Server Port" +msgstr "Порт консольного сервера" + +#: templates/dcim/device.html:35 +msgid "Highlight device" +msgstr "Выделите устройство" + +#: templates/dcim/device.html:57 +msgid "Not racked" +msgstr "Не треснул" + +#: templates/dcim/device.html:64 templates/dcim/site.html:96 +msgid "GPS Coordinates" +msgstr "Координаты GPS" + +#: templates/dcim/device.html:70 templates/dcim/site.html:102 +msgid "Map It" +msgstr "Нанесите на карту" + +#: templates/dcim/device.html:110 templates/dcim/inventoryitem.html:57 +#: templates/dcim/module.html:79 templates/dcim/modulebay.html:73 +#: templates/dcim/rack.html:62 +msgid "Asset Tag" +msgstr "Тег актива" + +#: templates/dcim/device.html:153 +msgid "View Virtual Chassis" +msgstr "Смотреть виртуальное шасси" + +#: templates/dcim/device.html:170 +msgid "Create VDC" +msgstr "Создайте VDC" + +#: templates/dcim/device.html:179 templates/dcim/device_edit.html:64 +#: virtualization/forms/model_forms.py:226 +msgid "Management" +msgstr "Управление" + +#: templates/dcim/device.html:200 templates/dcim/device.html:216 +#: templates/virtualization/virtualmachine.html:56 +#: templates/virtualization/virtualmachine.html:72 +msgid "NAT for" +msgstr "NAT для" + +#: templates/dcim/device.html:202 templates/dcim/device.html:218 +#: templates/virtualization/virtualmachine.html:58 +#: templates/virtualization/virtualmachine.html:74 +msgid "NAT" +msgstr "КОТ" + +#: templates/dcim/device.html:254 templates/dcim/rack.html:70 +msgid "Power Utilization" +msgstr "Использование энергии" + +#: templates/dcim/device.html:259 +msgid "Input" +msgstr "Ввод" + +#: templates/dcim/device.html:260 +msgid "Outlets" +msgstr "Торговые точки" + +#: templates/dcim/device.html:261 +msgid "Allocated" +msgstr "Выделено" + +#: templates/dcim/device.html:270 templates/dcim/device.html:272 +#: templates/dcim/device.html:288 templates/dcim/powerfeed.html:70 +msgid "VA" +msgstr "ВА" + +#: templates/dcim/device.html:282 +msgctxt "Leg of a power feed" +msgid "Leg" +msgstr "Ножка" + +#: templates/dcim/device.html:312 +#: templates/virtualization/virtualmachine.html:165 +msgid "Add a service" +msgstr "Добавить услугу" + +#: templates/dcim/device.html:319 templates/dcim/rack.html:77 +#: templates/dcim/rack_edit.html:38 +msgid "Dimensions" +msgstr "Габариты" + +#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 +#: templates/dcim/devicetype/base.html:18 templates/dcim/module.html:18 +#: templates/dcim/moduletype/base.html:18 +#: templates/virtualization/virtualmachine/base.html:22 +#: templates/virtualization/virtualmachine_list.html:8 +msgid "Add Components" +msgstr "Добавить компоненты" + +#: templates/dcim/device/consoleports.html:24 +msgid "Add Console Ports" +msgstr "Добавить консольные порты" + +#: templates/dcim/device/consoleserverports.html:24 +msgid "Add Console Server Ports" +msgstr "Добавить порты консольного сервера" + +#: templates/dcim/device/devicebays.html:10 +msgid "Add Device Bays" +msgstr "Добавить отсеки для устройств" + +#: templates/dcim/device/frontports.html:24 +msgid "Add Front Ports" +msgstr "Добавить передние порты" + +#: templates/dcim/device/inc/interface_table_controls.html:9 +msgid "Hide Enabled" +msgstr "Скрыть включено" + +#: templates/dcim/device/inc/interface_table_controls.html:10 +msgid "Hide Disabled" +msgstr "Скрыть отключено" + +#: templates/dcim/device/inc/interface_table_controls.html:11 +msgid "Hide Virtual" +msgstr "Скрыть виртуальное" + +#: templates/dcim/device/inc/interface_table_controls.html:12 +msgid "Hide Disconnected" +msgstr "Скрыть отключено" + +#: templates/dcim/device/interfaces.html:28 +msgid "Add Interfaces" +msgstr "Добавить интерфейсы" + +#: templates/dcim/device/inventory.html:10 +#: templates/dcim/inc/panels/inventory_items.html:46 +msgid "Add Inventory Item" +msgstr "Добавить инвентарь" + +#: templates/dcim/device/modulebays.html:10 +msgid "Add Module Bays" +msgstr "Добавить отсеки для модулей" + +#: templates/dcim/device/poweroutlets.html:24 +msgid "Add Power Outlets" +msgstr "Добавить розетки" + +#: templates/dcim/device/powerports.html:24 +msgid "Add Power Port" +msgstr "Добавить порт питания" + +#: templates/dcim/device/rearports.html:24 +msgid "Add Rear Ports" +msgstr "Добавить задние порты" + +#: templates/dcim/device/render_config.html:5 +#: templates/virtualization/virtualmachine/render_config.html:5 +msgid "Config" +msgstr "Конфигурация" + +#: templates/dcim/device/render_config.html:37 +#: templates/virtualization/virtualmachine/render_config.html:37 +msgid "Context Data" +msgstr "Контекстные данные" + +#: templates/dcim/device/render_config.html:57 +#: templates/virtualization/virtualmachine/render_config.html:57 +msgid "Download" +msgstr "Загрузить" + +#: templates/dcim/device/render_config.html:60 +#: templates/virtualization/virtualmachine/render_config.html:60 +msgid "Rendered Config" +msgstr "Отображенная конфигурация" + +#: templates/dcim/device/render_config.html:65 +#: templates/virtualization/virtualmachine/render_config.html:65 +msgid "No configuration template found" +msgstr "Шаблон конфигурации не найден" + +#: templates/dcim/device_edit.html:44 +msgid "Parent Bay" +msgstr "Родительский залив" + +#: templates/dcim/device_edit.html:48 +#: utilities/templates/form_helpers/render_field.html:20 +msgid "Regenerate Slug" +msgstr "Регенерирующий слизень" + +#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:7 +#: utilities/templates/helpers/table_config_form.html:23 +msgid "Remove" +msgstr "Удалить" + +#: templates/dcim/device_edit.html:110 +msgid "Local Config Context Data" +msgstr "Контекстные данные локальной конфигурации" + +#: templates/dcim/device_list.html:82 +#: templates/dcim/devicetype/component_templates.html:18 +#: templates/dcim/moduletype/component_templates.html:18 +#: templates/generic/bulk_rename.html:34 +#: templates/virtualization/virtualmachine/interfaces.html:11 +#: templates/virtualization/virtualmachine/virtual_disks.html:11 +msgid "Rename" +msgstr "Переименовать" + +#: templates/dcim/devicebay.html:18 +msgid "Device Bay" +msgstr "Отсек для устройств" + +#: templates/dcim/devicebay.html:48 +msgid "Installed Device" +msgstr "Установленное устройство" + +#: templates/dcim/devicebay_delete.html:6 +#, python-format +msgid "Delete device bay %(devicebay)s?" +msgstr "Удалить отсек для устройств %(devicebay)s?" + +#: templates/dcim/devicebay_delete.html:11 +#, python-format +msgid "" +"Are you sure you want to delete this device bay from " +"%(device)s?" +msgstr "" +"Вы действительно хотите удалить этот отсек для устройства из " +"%(device)s?" + +#: templates/dcim/devicebay_depopulate.html:6 +#, python-format +msgid "Remove %(device)s from %(device_bay)s?" +msgstr "Удалить %(device)s из %(device_bay)s?" + +#: templates/dcim/devicebay_depopulate.html:13 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from " +"%(device_bay)s?" +msgstr "" +"Вы действительно хотите удалить %(device)s из " +"%(device_bay)s?" + +#: templates/dcim/devicebay_populate.html:13 +msgid "Populate" +msgstr "Заселить" + +#: templates/dcim/devicebay_populate.html:22 +msgid "Bay" +msgstr "залив" + +#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +msgid "Add Device" +msgstr "Добавить устройство" + +#: templates/dcim/devicerole.html:43 +msgid "VM Role" +msgstr "Роль виртуальной машины" + +#: templates/dcim/devicetype.html:21 templates/dcim/moduletype.html:19 +msgid "Model Name" +msgstr "Название модели" + +#: templates/dcim/devicetype.html:28 templates/dcim/moduletype.html:23 +msgid "Part Number" +msgstr "Номер детали" + +#: templates/dcim/devicetype.html:40 +msgid "Height (U" +msgstr "Высота (U)" + +#: templates/dcim/devicetype.html:44 +msgid "Exclude From Utilization" +msgstr "Исключить из использования" + +#: templates/dcim/devicetype.html:62 +msgid "Parent/Child" +msgstr "Родитель/ребенок" + +#: templates/dcim/devicetype.html:74 +msgid "Front Image" +msgstr "Изображение на передней панели" + +#: templates/dcim/devicetype.html:86 +msgid "Rear Image" +msgstr "Изображение сзади" + +#: templates/dcim/frontport.html:57 +msgid "Rear Port Position" +msgstr "Положение заднего порта" + +#: templates/dcim/frontport.html:79 templates/dcim/interface.html:150 +#: templates/dcim/poweroutlet.html:67 templates/dcim/powerport.html:67 +#: templates/dcim/rearport.html:75 +msgid "Marked as Connected" +msgstr "Отмечено как подключенное" + +#: templates/dcim/frontport.html:93 templates/dcim/rearport.html:89 +msgid "Connection Status" +msgstr "Состояние подключения" + +#: templates/dcim/inc/cable_termination.html:65 +msgid "No termination" +msgstr "Без увольнения" + +#: templates/dcim/inc/cable_toggle_buttons.html:4 +msgid "Mark Planned" +msgstr "Отметить как запланированное" + +#: templates/dcim/inc/cable_toggle_buttons.html:8 +msgid "Mark Installed" +msgstr "Отметить как установленное" + +#: templates/dcim/inc/connection_endpoints.html:13 +msgid "Path Status" +msgstr "Состояние пути" + +#: templates/dcim/inc/connection_endpoints.html:18 +msgid "Not Reachable" +msgstr "Недоступно" + +#: templates/dcim/inc/connection_endpoints.html:23 +msgid "Path Endpoints" +msgstr "Конечные точки пути" + +#: templates/dcim/inc/endpoint_connection.html:8 +#: templates/dcim/powerfeed.html:128 templates/dcim/rearport.html:101 +msgid "Not connected" +msgstr "Не подключен" + +#: templates/dcim/inc/interface_vlans_table.html:6 +msgid "Untagged" +msgstr "Без тегов" + +#: templates/dcim/inc/interface_vlans_table.html:37 +msgid "No VLANs Assigned" +msgstr "VLAN не назначены" + +#: templates/dcim/inc/interface_vlans_table.html:44 +#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +msgid "Clear" +msgstr "Чисто" + +#: templates/dcim/inc/interface_vlans_table.html:47 +msgid "Clear All" +msgstr "Очистить все" + +#: templates/dcim/interface.html:17 +msgid "Add Child Interface" +msgstr "Добавить дочерний интерфейс" + +#: templates/dcim/interface.html:51 +msgid "Speed/Duplex" +msgstr "Скорость/дуплекс" + +#: templates/dcim/interface.html:74 +msgid "PoE Mode" +msgstr "Режим PoE" + +#: templates/dcim/interface.html:78 +msgid "PoE Type" +msgstr "Тип PoE" + +#: templates/dcim/interface.html:82 +#: templates/virtualization/vminterface.html:66 +msgid "802.1Q Mode" +msgstr "Режим 802.1Q" + +#: templates/dcim/interface.html:130 +#: templates/virtualization/vminterface.html:62 +msgid "MAC Address" +msgstr "MAC-адрес" + +#: templates/dcim/interface.html:157 +msgid "Wireless Link" +msgstr "Беспроводная связь" + +#: templates/dcim/interface.html:226 vpn/choices.py:55 +msgid "Peer" +msgstr "сверстник" + +#: templates/dcim/interface.html:238 +#: templates/wireless/inc/wirelesslink_interface.html:26 +msgid "Channel" +msgstr "Канал" + +#: templates/dcim/interface.html:247 +#: templates/wireless/inc/wirelesslink_interface.html:32 +msgid "Channel Frequency" +msgstr "Частота канала" + +#: templates/dcim/interface.html:250 templates/dcim/interface.html:258 +#: templates/dcim/interface.html:269 templates/dcim/interface.html:277 +msgid "MHz" +msgstr "МГц" + +#: templates/dcim/interface.html:266 +#: templates/wireless/inc/wirelesslink_interface.html:42 +msgid "Channel Width" +msgstr "Ширина канала" + +#: templates/dcim/interface.html:295 templates/wireless/wirelesslan.html:15 +#: templates/wireless/wirelesslink.html:24 wireless/forms/bulk_edit.py:59 +#: wireless/forms/bulk_edit.py:101 wireless/forms/filtersets.py:39 +#: wireless/forms/filtersets.py:79 wireless/models.py:81 +#: wireless/models.py:155 wireless/tables/wirelesslan.py:44 +msgid "SSID" +msgstr "СКАЗАЛ" + +#: templates/dcim/interface.html:316 +msgid "LAG Members" +msgstr "Члены LAG" + +#: templates/dcim/interface.html:335 +msgid "No member interfaces" +msgstr "Нет интерфейсов участников" + +#: templates/dcim/interface.html:359 templates/ipam/fhrpgroup.html:80 +#: templates/ipam/iprange/ip_addresses.html:7 +#: templates/ipam/prefix/ip_addresses.html:7 +#: templates/virtualization/vminterface.html:96 +msgid "Add IP Address" +msgstr "Добавить IP-адрес" + +#: templates/dcim/inventoryitem.html:25 +msgid "Parent Item" +msgstr "Родительский товар" + +#: templates/dcim/inventoryitem.html:49 +msgid "Part ID" +msgstr "Идентификатор детали" + +#: templates/dcim/inventoryitem_bulk_delete.html:5 +msgid "This will also delete all child inventory items of those listed" +msgstr "" +"Это также приведет к удалению всего детского инвентаря из перечисленных" + +#: templates/dcim/inventoryitem_edit.html:33 +msgid "Component Assignment" +msgstr "Назначение компонентов" + +#: templates/dcim/inventoryitem_edit.html:59 +#: templates/dcim/poweroutlet.html:18 templates/dcim/powerport.html:81 +msgid "Power Outlet" +msgstr "Розетка питания" + +#: templates/dcim/location.html:17 +msgid "Add Child Location" +msgstr "Добавить местоположение ребенка" + +#: templates/dcim/location.html:76 +msgid "Child Locations" +msgstr "Местонахождение детей" + +#: templates/dcim/location.html:84 templates/dcim/site.html:137 +msgid "Add a Location" +msgstr "Добавить местоположение" + +#: templates/dcim/location.html:98 templates/dcim/site.html:151 +msgid "Add a Device" +msgstr "Добавить устройство" + +#: templates/dcim/manufacturer.html:16 +msgid "Add Device Type" +msgstr "Добавить тип устройства" + +#: templates/dcim/manufacturer.html:21 +msgid "Add Module Type" +msgstr "Добавить тип модуля" + +#: templates/dcim/powerfeed.html:56 +msgid "Connected Device" +msgstr "Подключенное устройство" + +#: templates/dcim/powerfeed.html:66 +msgid "Utilization (Allocated" +msgstr "Использование (распределенное)" + +#: templates/dcim/powerfeed.html:85 +msgid "Electrical Characteristics" +msgstr "Электрические характеристики" + +#: templates/dcim/powerfeed.html:95 +msgctxt "Abbreviation for volts" +msgid "V" +msgstr "V" + +#: templates/dcim/powerfeed.html:99 +msgctxt "Abbreviation for amperes" +msgid "A" +msgstr "A" + +#: templates/dcim/poweroutlet.html:51 +msgid "Feed Leg" +msgstr "Кормовая ножка" + +#: templates/dcim/powerpanel.html:77 +msgid "Add Power Feeds" +msgstr "Добавить каналы питания" + +#: templates/dcim/powerport.html:47 +msgid "Maximum Draw" +msgstr "Максимальная ничья" + +#: templates/dcim/powerport.html:51 +msgid "Allocated Draw" +msgstr "Распределенная ничья" + +#: templates/dcim/rack.html:66 +msgid "Space Utilization" +msgstr "Использование пространства" + +#: templates/dcim/rack.html:96 +msgid "descending" +msgstr "спускаясь" + +#: templates/dcim/rack.html:96 +msgid "ascending" +msgstr "по возрастанию" + +#: templates/dcim/rack.html:99 +msgid "Starting Unit" +msgstr "Пусковой блок" + +#: templates/dcim/rack.html:125 +msgid "Mounting Depth" +msgstr "Глубина монтажа" + +#: templates/dcim/rack.html:135 +msgid "Rack Weight" +msgstr "Вес стойки" + +#: templates/dcim/rack.html:145 templates/dcim/rack_edit.html:67 +msgid "Maximum Weight" +msgstr "Максимальный вес" + +#: templates/dcim/rack.html:155 +msgid "Total Weight" +msgstr "Общий вес" + +#: templates/dcim/rack.html:173 templates/dcim/rack_elevation_list.html:16 +msgid "Images and Labels" +msgstr "Изображения и этикетки" + +#: templates/dcim/rack.html:174 templates/dcim/rack_elevation_list.html:17 +msgid "Images only" +msgstr "Только изображения" + +#: templates/dcim/rack.html:175 templates/dcim/rack_elevation_list.html:18 +msgid "Labels only" +msgstr "Только этикетки" + +#: templates/dcim/rack/reservations.html:9 +msgid "Add reservation" +msgstr "Добавить бронирование" + +#: templates/dcim/rack_edit.html:21 +msgid "Inventory Control" +msgstr "Управление запасами" + +#: templates/dcim/rack_edit.html:45 +msgid "Outer Dimensions" +msgstr "Внешние размеры" + +#: templates/dcim/rack_edit.html:56 templates/dcim/rack_edit.html:71 +msgid "Unit" +msgstr "Единица" + +#: templates/dcim/rack_elevation_list.html:12 +msgid "View List" +msgstr "Показать список" + +#: templates/dcim/rack_elevation_list.html:27 +msgid "Sort By" +msgstr "Сортировать по" + +#: templates/dcim/rack_elevation_list.html:77 +msgid "No Racks Found" +msgstr "Стойки не найдены" + +#: templates/dcim/rack_list.html:8 +msgid "View Elevations" +msgstr "Просмотр высот" + +#: templates/dcim/rackreservation.html:47 +msgid "Reservation Details" +msgstr "Сведения о бронировании" + +#: templates/dcim/rackrole.html:10 +msgid "Add Rack" +msgstr "Добавить стойку" + +#: templates/dcim/rearport.html:53 +msgid "Positions" +msgstr "Позиции" + +#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +msgid "Add Site" +msgstr "Добавить сайт" + +#: templates/dcim/region.html:56 +msgid "Child Regions" +msgstr "Детские регионы" + +#: templates/dcim/region.html:64 +msgid "Add Region" +msgstr "Добавить регион" + +#: templates/dcim/site.html:56 +msgid "Facility" +msgstr "Объект" + +#: templates/dcim/site.html:64 +msgid "Time Zone" +msgstr "Часовой пояс" + +#: templates/dcim/site.html:67 +msgid "UTC" +msgstr "UTC" + +#: templates/dcim/site.html:68 +msgid "Site time" +msgstr "Время работы сайта" + +#: templates/dcim/site.html:75 +msgid "Physical Address" +msgstr "Физический адрес" + +#: templates/dcim/site.html:81 +msgid "Map" +msgstr "карта" + +#: templates/dcim/site.html:92 +msgid "Shipping Address" +msgstr "Адрес доставки" + +#: templates/dcim/sitegroup.html:56 templates/tenancy/contactgroup.html:49 +#: templates/tenancy/tenantgroup.html:58 +#: templates/wireless/wirelesslangroup.html:56 +msgid "Child Groups" +msgstr "Детские группы" + +#: templates/dcim/sitegroup.html:64 +msgid "Add Site Group" +msgstr "Добавить группу сайтов" + +#: templates/dcim/trace/attachment.html:5 +#: templates/extras/exporttemplate.html:37 +msgid "Attachment" +msgstr "Вложение" + +#: templates/dcim/virtualchassis.html:86 +msgid "Add Member" +msgstr "Добавить участника" + +#: templates/dcim/virtualchassis_add.html:18 +msgid "Member Devices" +msgstr "Устройства для участников" + +#: templates/dcim/virtualchassis_add_member.html:6 +#, python-format +msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" +msgstr "Добавить нового участника в виртуальное шасси %(virtual_chassis)s" + +#: templates/dcim/virtualchassis_add_member.html:17 +msgid "Add New Member" +msgstr "Добавить нового участника" + +#: templates/dcim/virtualchassis_add_member.html:25 +msgid "Add Another" +msgstr "Добавить еще" + +#: templates/dcim/virtualchassis_edit.html:7 +#, python-format +msgid "Editing Virtual Chassis %(name)s" +msgstr "Редактирование виртуального корпуса %(name)s" + +#: templates/dcim/virtualchassis_edit.html:54 +msgid "Rack/Unit" +msgstr "Стойка/блок" + +#: templates/dcim/virtualchassis_remove_member.html:5 +msgid "Remove Virtual Chassis Member" +msgstr "Удалить элемент виртуального шасси" + +#: templates/dcim/virtualchassis_remove_member.html:9 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from virtual " +"chassis %(name)s?" +msgstr "" +"Вы действительно хотите удалить %(device)s из виртуального " +"шасси %(name)s?" + +#: templates/dcim/virtualdevicecontext.html:29 templates/vpn/l2vpn.html:19 +msgid "Identifier" +msgstr "Идентификатор" + +#: templates/exceptions/import_error.html:6 +msgid "" +"A module import error occurred during this request. Common causes include " +"the following:" +msgstr "" +"Во время этого запроса произошла ошибка импорта модуля. К распространенным " +"причинам относятся следующие:" + +#: templates/exceptions/import_error.html:10 +msgid "Missing required packages" +msgstr "Отсутствуют необходимые пакеты" + +#: templates/exceptions/import_error.html:11 +msgid "" +"This installation of NetBox might be missing one or more required Python " +"packages. These packages are listed in requirements.txt and " +"local_requirements.txt, and are normally installed as part of " +"the installation or upgrade process. To verify installed packages, run " +"pip freeze from the console and compare the output to the list " +"of required packages." +msgstr "" +"В этой установке NetBox может отсутствовать один или несколько необходимых " +"пакетов Python. Эти пакеты перечислены в requirements.txt а " +"также local_requirements.txt, и обычно устанавливаются в " +"процессе установки или обновления. Чтобы проверить установленные пакеты, " +"запустите замораживание губ из консоли и сравните выходные " +"данные со списком необходимых пакетов." + +#: templates/exceptions/import_error.html:20 +msgid "WSGI service not restarted after upgrade" +msgstr "Служба WSGI не перезапущена после обновления" + +#: templates/exceptions/import_error.html:21 +msgid "" +"If this installation has recently been upgraded, check that the WSGI service" +" (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" +" is running." +msgstr "" +"Если эта установка была недавно обновлена, убедитесь, что служба WSGI " +"(например, gunicorn или uWSGI) перезапущена. Это гарантирует, что новый код " +"работает." + +#: templates/exceptions/permission_error.html:6 +msgid "" +"A file permission error was detected while processing this request. Common " +"causes include the following:" +msgstr "" +"При обработке этого запроса была обнаружена ошибка разрешения на доступ к " +"файлу. К распространенным причинам относятся следующие:" + +#: templates/exceptions/permission_error.html:10 +msgid "Insufficient write permission to the media root" +msgstr "Недостаточное разрешение на запись в корень носителя" + +#: templates/exceptions/permission_error.html:11 +#, python-format +msgid "" +"The configured media root is %(media_root)s. Ensure that the " +"user NetBox runs as has access to write files to all locations within this " +"path." +msgstr "" +"Настроенный корень носителя %(media_root)s. Убедитесь, что " +"пользователь NetBox, запущенный от имени пользователя, имеет доступ к записи" +" файлов во все места на этом пути." + +#: templates/exceptions/programming_error.html:6 +msgid "" +"A database programming error was detected while processing this request. " +"Common causes include the following:" +msgstr "" +"При обработке этого запроса была обнаружена ошибка программирования базы " +"данных. К распространенным причинам относятся следующие:" + +#: templates/exceptions/programming_error.html:10 +msgid "Database migrations missing" +msgstr "Отсутствует миграция баз данных" + +#: templates/exceptions/programming_error.html:11 +msgid "" +"When upgrading to a new NetBox release, the upgrade script must be run to " +"apply any new database migrations. You can run migrations manually by " +"executing python3 manage.py migrate from the command line." +msgstr "" +"При обновлении до новой версии NetBox необходимо запустить сценарий " +"обновления, чтобы применить любые новые миграции баз данных. Перенос можно " +"запустить вручную, выполнив Миграция manage.py на python3 из " +"командной строки." + +#: templates/exceptions/programming_error.html:18 +msgid "Unsupported PostgreSQL version" +msgstr "Неподдерживаемая версия PostgreSQL" + +#: templates/exceptions/programming_error.html:19 +msgid "" +"Ensure that PostgreSQL version 12 or later is in use. You can check this by " +"connecting to the database using NetBox's credentials and issuing a query " +"for SELECT VERSION()." +msgstr "" +"Убедитесь, что используется PostgreSQL версии 12 или более поздней. Вы " +"можете проверить это, подключившись к базе данных NetBox, и отправив запрос " +"на ВЫБЕРИТЕ ВЕРСИЮ ()." + +#: templates/extras/admin/plugins_list.html:4 +#: templates/extras/admin/plugins_list.html:9 +#: templates/extras/admin/plugins_list.html:13 +msgid "Installed Plugins" +msgstr "Установленные плагины" + +#: templates/extras/admin/plugins_list.html:23 +msgid "Package Name" +msgstr "Имя пакета" + +#: templates/extras/admin/plugins_list.html:24 +msgid "Author" +msgstr "Автор" + +#: templates/extras/admin/plugins_list.html:25 +msgid "Author Email" +msgstr "Электронная почта автора" + +#: templates/extras/admin/plugins_list.html:27 +#: templates/vpn/ipsecprofile.html:47 vpn/forms/bulk_edit.py:140 +#: vpn/forms/bulk_import.py:171 vpn/tables/crypto.py:61 +msgid "Version" +msgstr "Версия" + +#: templates/extras/configcontext.html:46 +#: templates/extras/configtemplate.html:38 +#: templates/extras/exporttemplate.html:57 +msgid "The data file associated with this object has been deleted" +msgstr "Файл данных, связанный с этим объектом, был удален" + +#: templates/extras/configcontext.html:55 +#: templates/extras/configtemplate.html:47 +#: templates/extras/exporttemplate.html:66 +msgid "Data Synced" +msgstr "Синхронизация данных" + +#: templates/extras/configcontext_list.html:7 +#: templates/extras/configtemplate_list.html:7 +#: templates/extras/exporttemplate_list.html:7 +msgid "Sync Data" +msgstr "Синхронизация данных" + +#: templates/extras/configtemplate.html:58 +msgid "Environment Parameters" +msgstr "Параметры окружающей среды" + +#: templates/extras/configtemplate.html:69 +#: templates/extras/exporttemplate.html:88 +msgid "Template" +msgstr "Шаблон" + +#: templates/extras/customfield.html:31 templates/extras/customlink.html:22 +msgid "Group Name" +msgstr "Название группы" + +#: templates/extras/customfield.html:43 +msgid "Cloneable" +msgstr "Клонируемый" + +#: templates/extras/customfield.html:53 +msgid "Default Value" +msgstr "Значение по умолчанию" + +#: templates/extras/customfield.html:64 +msgid "Search Weight" +msgstr "Вес поиска" + +#: templates/extras/customfield.html:74 +msgid "Filter Logic" +msgstr "Логика фильтрации" + +#: templates/extras/customfield.html:78 +msgid "Display Weight" +msgstr "Вес дисплея" + +#: templates/extras/customfield.html:82 +msgid "UI Visible" +msgstr "Видимый пользовательский интерфейс" + +#: templates/extras/customfield.html:86 +msgid "UI Editable" +msgstr "Редактируемый пользовательский интерфейс" + +#: templates/extras/customfield.html:108 +msgid "Validation Rules" +msgstr "Правила валидации" + +#: templates/extras/customfield.html:112 +msgid "Minimum Value" +msgstr "Минимальное значение" + +#: templates/extras/customfield.html:116 +msgid "Maximum Value" +msgstr "Максимальное значение" + +#: templates/extras/customfield.html:120 +msgid "Regular Expression" +msgstr "Регулярное выражение" + +#: templates/extras/customlink.html:30 +msgid "Button Class" +msgstr "Класс кнопок" + +#: templates/extras/customlink.html:41 templates/extras/exporttemplate.html:73 +#: templates/extras/savedfilter.html:41 +msgid "Assigned Models" +msgstr "Назначенные модели" + +#: templates/extras/customlink.html:57 +msgid "Link Text" +msgstr "Текст ссылки" + +#: templates/extras/customlink.html:65 +msgid "Link URL" +msgstr "URL-адрес ссылки" + +#: templates/extras/dashboard/reset.html:4 templates/home.html:63 +msgid "Reset Dashboard" +msgstr "Сбросить панель управления" + +#: templates/extras/dashboard/reset.html:8 +msgid "" +"This will remove all configured widgets and restore the " +"default dashboard configuration." +msgstr "" +"Это удалит все настроили виджеты и восстановите " +"конфигурацию панели управления по умолчанию." + +#: templates/extras/dashboard/reset.html:13 +msgid "" +"This change affects only your dashboard, and will not impact other " +"users." +msgstr "" +"Это изменение затрагивает только ваш панель управления и не повлияет " +"на других пользователей." + +#: templates/extras/dashboard/widget_add.html:7 +msgid "Add a Widget" +msgstr "Добавить виджет" + +#: templates/extras/dashboard/widgets/bookmarks.html:14 +msgid "No bookmarks have been added yet." +msgstr "Пока не добавлено ни одной закладки." + +#: templates/extras/dashboard/widgets/objectcounts.html:15 +msgid "No permission" +msgstr "Нет разрешения" + +#: templates/extras/dashboard/widgets/objectlist.html:6 +msgid "No permission to view this content" +msgstr "Нет разрешения на просмотр этого контента" + +#: templates/extras/dashboard/widgets/objectlist.html:10 +msgid "Unable to load content. Invalid view name" +msgstr "Невозможно загрузить содержимое. Неверное имя представления" + +#: templates/extras/dashboard/widgets/rssfeed.html:12 +msgid "No content found" +msgstr "Контент не найден" + +#: templates/extras/dashboard/widgets/rssfeed.html:18 +msgid "There was a problem fetching the RSS feed" +msgstr "Возникла проблема при загрузке RSS-канала" + +#: templates/extras/dashboard/widgets/rssfeed.html:21 +msgid "HTTP" +msgstr "HTTP" + +#: templates/extras/eventrule.html:63 +msgid "Job start" +msgstr "Начало работы" + +#: templates/extras/eventrule.html:67 +msgid "Job end" +msgstr "Завершение задания" + +#: templates/extras/exporttemplate.html:29 +msgid "MIME Type" +msgstr "Тип MIME" + +#: templates/extras/exporttemplate.html:33 +msgid "File Extension" +msgstr "Расширение файла" + +#: templates/extras/htmx/report_result.html:9 +#: templates/extras/htmx/script_result.html:10 +msgid "Scheduled for" +msgstr "Запланировано на" + +#: templates/extras/htmx/report_result.html:14 +#: templates/extras/htmx/script_result.html:15 +msgid "Duration" +msgstr "Продолжительность" + +#: templates/extras/htmx/report_result.html:20 +msgid "Report Methods" +msgstr "Методы отчета" + +#: templates/extras/htmx/report_result.html:38 +msgid "Report Results" +msgstr "Результаты отчета" + +#: templates/extras/htmx/report_result.html:44 +#: templates/extras/htmx/script_result.html:26 +msgid "Level" +msgstr "Уровень" + +#: templates/extras/htmx/report_result.html:46 +#: templates/extras/htmx/script_result.html:27 +msgid "Message" +msgstr "Послание" + +#: templates/extras/htmx/script_result.html:21 +msgid "Script Log" +msgstr "Журнал сценариев" + +#: templates/extras/htmx/script_result.html:25 +msgid "Line" +msgstr "Линия" + +#: templates/extras/htmx/script_result.html:38 +msgid "No log output" +msgstr "Нет вывода журнала" + +#: templates/extras/htmx/script_result.html:46 +msgid "Exec Time" +msgstr "Время работы" + +#: templates/extras/htmx/script_result.html:46 +msgctxt "Unit of time" +msgid "seconds" +msgstr "секунды" + +#: templates/extras/htmx/script_result.html:50 +msgid "Output" +msgstr "Вывод" + +#: templates/extras/inc/result_pending.html:4 +msgid "Loading" +msgstr "Загрузка" + +#: templates/extras/inc/result_pending.html:6 +msgid "Results pending" +msgstr "Результаты ожидаются" + +#: templates/extras/journalentry.html:16 +msgid "Journal Entry" +msgstr "Запись в журнале" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Change log retention" +msgstr "Хранение журнала изменений" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "days" +msgstr "дни" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Indefinite" +msgstr "Бессрочно" + +#: templates/extras/object_configcontext.html:11 +msgid "Rendered Context" +msgstr "Отображаемый контекст" + +#: templates/extras/object_configcontext.html:22 +msgid "Local Context" +msgstr "Локальный контекст" + +#: templates/extras/object_configcontext.html:34 +msgid "The local config context overwrites all source contexts" +msgstr "Локальный контекст конфигурации перезаписывает все исходные контексты" + +#: templates/extras/object_configcontext.html:40 +msgid "Source Contexts" +msgstr "Исходные контексты" + +#: templates/extras/object_journal.html:18 +msgid "New Journal Entry" +msgstr "Новая запись в журнале" + +#: templates/extras/objectchange.html:29 +#: templates/users/objectpermission.html:45 +msgid "Change" +msgstr "Изменить" + +#: templates/extras/objectchange.html:84 +msgid "Difference" +msgstr "Разница" + +#: templates/extras/objectchange.html:87 +msgid "Previous" +msgstr "Предыдущее" + +#: templates/extras/objectchange.html:90 +msgid "Next" +msgstr "Следующий" + +#: templates/extras/objectchange.html:98 +msgid "Object Created" +msgstr "Объект создан" + +#: templates/extras/objectchange.html:100 +msgid "Object Deleted" +msgstr "Объект удален" + +#: templates/extras/objectchange.html:102 +msgid "No Changes" +msgstr "Без изменений" + +#: templates/extras/objectchange.html:117 +msgid "Pre-Change Data" +msgstr "Данные перед изменением" + +#: templates/extras/objectchange.html:126 +msgid "Warning: Comparing non-atomic change to previous change record" +msgstr "" +"Предупреждение: сравнение неатомарного изменения с предыдущей записью " +"изменений" + +#: templates/extras/objectchange.html:136 +msgid "Post-Change Data" +msgstr "Данные после изменений" + +#: templates/extras/objectchange.html:157 +#, python-format +msgid "See All %(count)s Changes" +msgstr "Показать все %(count)s Изменения" + +#: templates/extras/report.html:14 +msgid "This report is invalid and cannot be run." +msgstr "Этот отчет недействителен и не может быть запущен." + +#: templates/extras/report.html:23 templates/extras/report_list.html:88 +msgid "Run Again" +msgstr "Беги снова" + +#: templates/extras/report.html:25 templates/extras/report_list.html:90 +msgid "Run Report" +msgstr "Запустить отчет" + +#: templates/extras/report.html:36 +msgid "Last run" +msgstr "Последний забег" + +#: templates/extras/report/base.html:30 +msgid "Report" +msgstr "Отчет" + +#: templates/extras/report_list.html:48 templates/extras/script_list.html:54 +msgid "Last Run" +msgstr "Последний забег" + +#: templates/extras/report_list.html:70 templates/extras/script_list.html:77 +msgid "Never" +msgstr "Никогда" + +#: templates/extras/report_list.html:75 +msgid "Report has no test methods" +msgstr "В отчете нет методов тестирования" + +#: templates/extras/report_list.html:76 +msgid "Invalid" +msgstr "Недействительный" + +#: templates/extras/report_list.html:125 +msgid "No Reports Found" +msgstr "Отчеты не найдены" + +#: templates/extras/report_list.html:128 +#, python-format +msgid "" +"Get started by creating a report from " +"an uploaded file or data source." +msgstr "" +"Начните с создание отчета из " +"загруженного файла или источника данных." + +#: templates/extras/script.html:13 +msgid "You do not have permission to run scripts" +msgstr "У вас нет разрешения на запуск сценариев" + +#: templates/extras/script.html:37 +msgid "Run Script" +msgstr "Запустить скрипт" + +#: templates/extras/script_list.html:44 +#, python-format +msgid "" +"Script file at %(file_path)s could not be " +"loaded." +msgstr "" +"Файл сценария по адресу %(file_path)s не удалось" +" загрузить." + +#: templates/extras/script_list.html:91 +msgid "No Scripts Found" +msgstr "Сценарии не найдены" + +#: templates/extras/script_list.html:94 +#, python-format +msgid "" +"Get started by creating a script from " +"an uploaded file or data source." +msgstr "" +"Начните с создание сценария из " +"загруженного файла или источника данных." + +#: templates/extras/script_result.html:42 +msgid "Log" +msgstr "журнал" + +#: templates/extras/tag.html:35 +msgid "Tagged Items" +msgstr "Помеченные товары" + +#: templates/extras/tag.html:47 +msgid "Allowed Object Types" +msgstr "Разрешенные типы объектов" + +#: templates/extras/tag.html:56 +msgid "Any" +msgstr "Любое" + +#: templates/extras/tag.html:63 +msgid "Tagged Item Types" +msgstr "Типы товаров с тегами" + +#: templates/extras/tag.html:89 +msgid "Tagged Objects" +msgstr "Объекты с тегами" + +#: templates/extras/webhook.html:33 +msgid "HTTP Method" +msgstr "Метод HTTP" + +#: templates/extras/webhook.html:41 +msgid "HTTP Content Type" +msgstr "Тип содержимого HTTP" + +#: templates/extras/webhook.html:58 +msgid "SSL Verification" +msgstr "Проверка SSL" + +#: templates/extras/webhook.html:73 +msgid "Additional Headers" +msgstr "Дополнительные заголовки" + +#: templates/extras/webhook.html:85 +msgid "Body Template" +msgstr "Шаблон тела" + +#: templates/generic/bulk_add_component.html:15 +msgid "Bulk Creation" +msgstr "Массовое создание" + +#: templates/generic/bulk_add_component.html:20 +#: templates/generic/bulk_edit.html:28 +msgid "Selected Objects" +msgstr "Выбранные объекты" + +#: templates/generic/bulk_add_component.html:46 +msgid "to Add" +msgstr "добавить" + +#: templates/generic/bulk_delete.html:24 +msgid "Confirm Bulk Deletion" +msgstr "Подтвердить массовое удаление" + +#: templates/generic/bulk_delete.html:26 +msgctxt "Noun" +msgid "Warning" +msgstr "Предупреждение" + +#: templates/generic/bulk_delete.html:27 +#, python-format +msgid "" +"The following operation will delete %(count)s " +"%(type_plural)s. Please carefully review the objects to be deleted and " +"confirm below." +msgstr "" +"Следующая операция удалит %(count)s %(type_plural)s. " +"Пожалуйста, внимательно просмотрите объекты, которые необходимо удалить, и " +"подтвердите их ниже." + +#: templates/generic/bulk_edit.html:16 templates/generic/object_edit.html:17 +msgid "Editing" +msgstr "Редактирование" + +#: templates/generic/bulk_edit.html:23 +msgid "Bulk Edit" +msgstr "Массовое редактирование" + +#: templates/generic/bulk_edit.html:124 templates/generic/bulk_rename.html:42 +msgid "Apply" +msgstr "Подать заявку" + +#: templates/generic/bulk_import.html:14 +msgid "Bulk Import" +msgstr "Массовый импорт" + +#: templates/generic/bulk_import.html:20 +msgid "Direct Import" +msgstr "Прямой импорт" + +#: templates/generic/bulk_import.html:25 +msgid "Upload File" +msgstr "Загрузить файл" + +#: templates/generic/bulk_import.html:51 templates/generic/bulk_import.html:73 +#: templates/generic/bulk_import.html:95 +msgid "Submit" +msgstr "Отправить" + +#: templates/generic/bulk_import.html:110 +msgid "Field Options" +msgstr "Опции полей" + +#: templates/generic/bulk_import.html:117 +msgid "Accessor" +msgstr "Аксессор" + +#: templates/generic/bulk_import.html:154 +msgid "Import Value" +msgstr "Стоимость импорта" + +#: templates/generic/bulk_import.html:181 +msgid "Format: YYYY-MM-DD" +msgstr "Формат: ГГГГ-ММ-ДД" + +#: templates/generic/bulk_import.html:183 +msgid "Specify true or false" +msgstr "Укажите истину или ложь" + +#: templates/generic/bulk_import.html:195 +msgid "Required fields must be specified for all objects." +msgstr "" +"Обязательные поля должен должно быть указано для всех " +"объектов." + +#: templates/generic/bulk_import.html:201 +#, python-format +msgid "" +"Related objects may be referenced by any unique attribute. For example, " +"%(example)s would identify a VRF by its route distinguisher." +msgstr "" +"На связанные объекты можно ссылаться с помощью любого уникального атрибута. " +"Например, %(example)s будет идентифицировать VRF по " +"идентификатору маршрута." + +#: templates/generic/bulk_remove.html:13 +msgid "Confirm Bulk Removal" +msgstr "Подтвердите массовое удаление" + +#: templates/generic/bulk_remove.html:15 +#, python-format +msgid "" +"Warning: The following operation will remove %(count)s " +"%(obj_type_plural)s from %(parent_obj)s." +msgstr "" +"Предупреждение: Следующая операция приведет к удалению " +"%(count)s %(obj_type_plural)s из %(parent_obj)s." + +#: templates/generic/bulk_remove.html:21 +#, python-format +msgid "" +"Please carefully review the %(obj_type_plural)s to be removed and confirm " +"below." +msgstr "" +"Пожалуйста, внимательно ознакомьтесь с %(obj_type_plural)s должно быть " +"удалено и подтверждено ниже." + +#: templates/generic/bulk_remove.html:38 +#, python-format +msgid "Delete these %(count)s %(obj_type_plural)s" +msgstr "Удалите эти %(count)s %(obj_type_plural)s" + +#: templates/generic/bulk_rename.html:7 +msgid "Renaming" +msgstr "Переименование" + +#: templates/generic/bulk_rename.html:16 +msgid "Current Name" +msgstr "Текущее имя" + +#: templates/generic/bulk_rename.html:17 +msgid "New Name" +msgstr "Новое имя" + +#: templates/generic/bulk_rename.html:40 +#: utilities/templates/widgets/markdown_input.html:11 +msgid "Preview" +msgstr "Предварительный просмотр" + +#: templates/generic/confirmation_form.html:16 +msgid "Are you sure" +msgstr "Вы уверены" + +#: templates/generic/confirmation_form.html:19 +msgid "Confirm" +msgstr "Подтвердить" + +#: templates/generic/object.html:51 +msgid "ago" +msgstr "тому назад" + +#: templates/generic/object_children.html:27 +#: utilities/templates/buttons/bulk_edit.html:4 +msgid "Edit Selected" +msgstr "Изменить выбранное" + +#: templates/generic/object_children.html:41 +#: utilities/templates/buttons/bulk_delete.html:4 +msgid "Delete Selected" +msgstr "Удалить выбранное" + +#: templates/generic/object_edit.html:19 +#, python-format +msgid "Add a new %(object_type)s" +msgstr "Добавить новое %(object_type)s" + +#: templates/generic/object_edit.html:47 +msgid "View model documentation" +msgstr "Смотреть документацию по модели" + +#: templates/generic/object_edit.html:48 +msgid "Help" +msgstr "Помощь" + +#: templates/generic/object_edit.html:73 +msgid "Create & Add Another" +msgstr "Создайте и добавьте еще" + +#: templates/generic/object_list.html:48 templates/search.html:13 +msgid "Results" +msgstr "Результаты" + +#: templates/generic/object_list.html:54 +msgid "Filters" +msgstr "Фильтры" + +#: templates/generic/object_list.html:94 +#, python-format +msgid "" +"Select all %(count)s %(object_type_plural)s matching query" +msgstr "" +"Выберите все %(count)s %(object_type_plural)s " +"соответствующий запрос" + +#: templates/home.html:12 +msgid "New Release Available" +msgstr "Доступен новый релиз" + +#: templates/home.html:14 +msgid "is available" +msgstr "доступен" + +#: templates/home.html:17 +msgctxt "Document title" +msgid "Upgrade Instructions" +msgstr "Инструкции по обновлению" + +#: templates/home.html:37 +msgid "Unlock Dashboard" +msgstr "Разблокируйте панель управления" + +#: templates/home.html:46 +msgid "Lock Dashboard" +msgstr "Заблокировать панель управления" + +#: templates/home.html:57 +msgid "Add Widget" +msgstr "Добавить виджет" + +#: templates/home.html:60 +msgid "Save Layout" +msgstr "Сохранить макет" + +#: templates/htmx/delete_form.html:7 +msgid "Confirm Deletion" +msgstr "Подтвердить удаление" + +#: templates/htmx/delete_form.html:11 +#, python-format +msgid "" +"Are you sure you want to delete " +"%(object_type)s %(object)s?" +msgstr "" +"Вы уверены, что хотите удалить " +"%(object_type)s %(object)s?" + +#: templates/htmx/delete_form.html:17 +msgid "The following objects will be deleted as a result of this action." +msgstr "В результате этого действия следующие объекты будут удалены." + +#: templates/htmx/object_selector.html:5 +msgid "Select" +msgstr "Выберите" + +#: templates/inc/filter_list.html:50 +#: utilities/templates/helpers/table_config_form.html:39 +msgid "Reset" +msgstr "Сбросить" + +#: templates/inc/missing_prerequisites.html:7 +#, python-format +msgid "" +"Before you can add a %(model)s you must first create a " +"%(prerequisite_model)s." +msgstr "" +"Прежде чем вы сможете добавить %(model)s вы должны сначала создать " +"%(prerequisite_model)s." + +#: templates/inc/paginator.html:38 templates/inc/paginator_htmx.html:53 +msgid "Per Page" +msgstr "На страницу" + +#: templates/inc/paginator.html:49 templates/inc/paginator_htmx.html:69 +#, python-format +msgid "Showing %(start)s-%(end)s of %(total)s" +msgstr "показывая %(start)s-%(end)s из %(total)s" + +#: templates/inc/panels/image_attachments.html:10 +msgid "Attach an image" +msgstr "Прикрепите изображение" + +#: templates/inc/panels/related_objects.html:5 +msgid "Related Objects" +msgstr "Связанные объекты" + +#: templates/inc/panels/tags.html:11 +msgid "No tags assigned" +msgstr "Теги не назначены" + +#: templates/inc/profile_button.html:12 templates/inc/profile_button.html:62 +msgid "Dark Mode" +msgstr "Темный режим" + +#: templates/inc/profile_button.html:45 +msgid "Log Out" +msgstr "Выйти из системы" + +#: templates/inc/profile_button.html:53 +msgid "Log In" +msgstr "Войти" + +#: templates/inc/sync_warning.html:7 +msgid "Data is out of sync with upstream file" +msgstr "Данные не синхронизированы с вышестоящим файлом" + +#: templates/inc/table_controls_htmx.html:16 +#: templates/inc/table_controls_htmx.html:18 +msgid "Configure Table" +msgstr "Настроить таблицу" + +#: templates/ipam/aggregate.html:15 templates/ipam/ipaddress.html:17 +#: templates/ipam/iprange.html:16 templates/ipam/prefix.html:16 +msgid "Family" +msgstr "Семья" + +#: templates/ipam/aggregate.html:40 +msgid "Date Added" +msgstr "Дата добавления" + +#: templates/ipam/aggregate/prefixes.html:8 +#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +msgid "Add Prefix" +msgstr "Добавить префикс" + +#: templates/ipam/asn.html:24 +msgid "AS Number" +msgstr "Номер AS" + +#: templates/ipam/fhrpgroup.html:55 +msgid "Authentication Type" +msgstr "Тип аутентификации" + +#: templates/ipam/fhrpgroup.html:59 +msgid "Authentication Key" +msgstr "Ключ аутентификации" + +#: templates/ipam/fhrpgroup.html:72 +msgid "Virtual IP Addresses" +msgstr "Виртуальные IP-адреса" + +#: templates/ipam/fhrpgroupassignment_edit.html:8 +msgid "FHRP Group Assignment" +msgstr "Групповое назначение FHRP" + +#: templates/ipam/inc/ipaddress_edit_header.html:19 +msgid "Assign IP" +msgstr "Назначить IP-адрес" + +#: templates/ipam/inc/ipaddress_edit_header.html:28 +msgid "Bulk Create" +msgstr "Массовое создание" + +#: templates/ipam/inc/panels/fhrp_groups.html:12 +msgid "Virtual IPs" +msgstr "Виртуальные IP-адреса" + +#: templates/ipam/inc/panels/fhrp_groups.html:52 +msgid "Create Group" +msgstr "Создать группу" + +#: templates/ipam/inc/panels/fhrp_groups.html:57 +msgid "Assign Group" +msgstr "Назначить группу" + +#: templates/ipam/inc/toggle_available.html:7 +msgid "Show Assigned" +msgstr "Показать назначенное" + +#: templates/ipam/inc/toggle_available.html:10 +msgid "Show Available" +msgstr "Показать доступные" + +#: templates/ipam/inc/toggle_available.html:13 +msgid "Show All" +msgstr "Показать все" + +#: templates/ipam/ipaddress.html:26 templates/ipam/iprange.html:48 +#: templates/ipam/prefix.html:25 +msgid "Global" +msgstr "Глобальный" + +#: templates/ipam/ipaddress.html:88 +msgid "NAT (outside)" +msgstr "NAT (снаружи)" + +#: templates/ipam/ipaddress_assign.html:8 +msgid "Assign an IP Address" +msgstr "Назначьте IP-адрес" + +#: templates/ipam/ipaddress_assign.html:23 +msgid "Select IP Address" +msgstr "Выберите IP-адрес" + +#: templates/ipam/ipaddress_assign.html:39 +msgid "Search Results" +msgstr "Результаты поиска" + +#: templates/ipam/ipaddress_bulk_add.html:6 +msgid "Bulk Add IP Addresses" +msgstr "Массовое добавление IP-адресов" + +#: templates/ipam/ipaddress_edit.html:35 +msgid "Interface Assignment" +msgstr "Назначение интерфейса" + +#: templates/ipam/ipaddress_edit.html:74 +msgid "NAT IP (Inside" +msgstr "NAT IP (внутренний)" + +#: templates/ipam/iprange.html:20 +msgid "Starting Address" +msgstr "Начальный адрес" + +#: templates/ipam/iprange.html:24 +msgid "Ending Address" +msgstr "Конечный адрес" + +#: templates/ipam/iprange.html:36 templates/ipam/prefix.html:104 +msgid "Marked fully utilized" +msgstr "Отмечено как полностью использованное" + +#: templates/ipam/prefix.html:112 +msgid "Child IPs" +msgstr "Детские IP-адреса" + +#: templates/ipam/prefix.html:120 +msgid "Available IPs" +msgstr "Доступные IP-адреса" + +#: templates/ipam/prefix.html:132 +msgid "First available IP" +msgstr "Первый доступный IP-адрес" + +#: templates/ipam/prefix.html:151 +msgid "Addressing Details" +msgstr "Детали адресации" + +#: templates/ipam/prefix.html:181 +msgid "Prefix Details" +msgstr "Детали префикса" + +#: templates/ipam/prefix.html:187 +msgid "Network Address" +msgstr "Сетевой адрес" + +#: templates/ipam/prefix.html:191 +msgid "Network Mask" +msgstr "Сетевая маска" + +#: templates/ipam/prefix.html:195 +msgid "Wildcard Mask" +msgstr "Маска подстановочных знаков" + +#: templates/ipam/prefix.html:199 +msgid "Broadcast Address" +msgstr "Адрес вещания" + +#: templates/ipam/prefix/ip_ranges.html:7 +msgid "Add IP Range" +msgstr "Добавить диапазон IP-адресов" + +#: templates/ipam/prefix_list.html:7 +msgid "Hide Depth Indicators" +msgstr "Скрыть индикаторы глубины" + +#: templates/ipam/prefix_list.html:11 +msgid "Max Depth" +msgstr "Максимальная глубина" + +#: templates/ipam/prefix_list.html:28 +msgid "Max Length" +msgstr "Максимальная длина" + +#: templates/ipam/rir.html:10 +msgid "Add Aggregate" +msgstr "Добавить агрегат" + +#: templates/ipam/routetarget.html:10 +msgid "Route Target" +msgstr "Цель маршрута" + +#: templates/ipam/routetarget.html:40 +msgid "Importing VRFs" +msgstr "Импорт VRF" + +#: templates/ipam/routetarget.html:49 +msgid "Exporting VRFs" +msgstr "Экспорт файлов VRF" + +#: templates/ipam/routetarget.html:60 +msgid "Importing L2VPNs" +msgstr "Импорт L2VPN" + +#: templates/ipam/routetarget.html:69 +msgid "Exporting L2VPNs" +msgstr "Экспорт L2VPN" + +#: templates/ipam/service.html:22 templates/ipam/service_create.html:8 +#: templates/ipam/service_edit.html:8 +msgid "Service" +msgstr "Услуга" + +#: templates/ipam/service_create.html:43 +msgid "From Template" +msgstr "Из шаблона" + +#: templates/ipam/service_create.html:48 +msgid "Custom" +msgstr "Обычай" + +#: templates/ipam/service_edit.html:37 +msgid "Port(s)" +msgstr "Порт (ы)" + +#: templates/ipam/vlan.html:95 +msgid "Add a Prefix" +msgstr "Добавить префикс" + +#: templates/ipam/vlangroup.html:18 +msgid "Add VLAN" +msgstr "Добавить VLAN" + +#: templates/ipam/vlangroup.html:43 +msgid "Permitted VIDs" +msgstr "Разрешенные видео" + +#: templates/ipam/vrf.html:19 +msgid "Route Distinguisher" +msgstr "Дифференцировщик маршрута" + +#: templates/ipam/vrf.html:32 +msgid "Unique IP Space" +msgstr "Уникальное IP-пространство" + +#: templates/login.html:20 +#: utilities/templates/form_helpers/render_errors.html:7 +msgid "Errors" +msgstr "Ошибки" + +#: templates/login.html:48 +msgid "Sign In" +msgstr "Войти" + +#: templates/login.html:54 +msgid "Or use a single sign-on (SSO) provider" +msgstr "Или воспользуйтесь услугой единого входа (SSO)" + +#: templates/login.html:68 +msgid "Toggle Color Mode" +msgstr "Переключить цветовой режим" + +#: templates/media_failure.html:7 +msgid "Static Media Failure - NetBox" +msgstr "Сбой статического носителя - NetBox" + +#: templates/media_failure.html:21 +msgid "Static Media Failure" +msgstr "Сбой статического носителя" + +#: templates/media_failure.html:23 +msgid "The following static media file failed to load" +msgstr "Не удалось загрузить следующий статический медиафайл" + +#: templates/media_failure.html:26 +msgid "Check the following" +msgstr "Проверьте следующее" + +#: templates/media_failure.html:29 +msgid "" +"manage.py collectstatic was run during the most recent upgrade." +" This installs the most recent iteration of each static file into the static" +" root path." +msgstr "" +"manage.py собирает статические данные был запущен во время " +"последнего обновления. При этом последняя итерация каждого статического " +"файла устанавливается в статический корневой путь." + +#: templates/media_failure.html:35 +#, python-format +msgid "" +"The HTTP service (e.g. nginx or Apache) is configured to serve files from " +"the STATIC_ROOT path. Refer to the " +"installation documentation for further guidance." +msgstr "" +"Служба HTTP (например, nginx или Apache) настроена на обслуживание файлов из" +" СТАТИЧЕСКИЙ КОРЕНЬ путь. Обратитесь к документация по установке для получения " +"дополнительных рекомендаций." + +#: templates/media_failure.html:47 +#, python-format +msgid "" +"The file %(filename)s exists in the static root directory and " +"is readable by the HTTP server." +msgstr "" +"Файл %(filename)s существует в статическом корневом каталоге и " +"доступен для чтения HTTP-сервером." + +#: templates/media_failure.html:55 +#, python-format +msgid "Click here to attempt loading NetBox again." +msgstr "" +"Нажмите здесь чтобы снова попытаться загрузить " +"NetBox." + +#: templates/tenancy/contact.html:18 tenancy/filtersets.py:135 +#: tenancy/forms/bulk_edit.py:136 tenancy/forms/filtersets.py:101 +#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:109 +#: tenancy/forms/model_forms.py:132 tenancy/tables/contacts.py:98 +msgid "Contact" +msgstr "Связаться" + +#: templates/tenancy/contact.html:30 tenancy/forms/bulk_edit.py:98 +msgid "Title" +msgstr "Заголовок" + +#: templates/tenancy/contact.html:34 tenancy/forms/bulk_edit.py:103 +#: tenancy/tables/contacts.py:64 +msgid "Phone" +msgstr "Телефон" + +#: templates/tenancy/contact.html:86 tenancy/tables/contacts.py:73 +msgid "Assignments" +msgstr "Задания" + +#: templates/tenancy/contactassignment_edit.html:12 +msgid "Contact Assignment" +msgstr "Назначение контакта" + +#: templates/tenancy/contactgroup.html:19 tenancy/forms/forms.py:66 +#: tenancy/forms/model_forms.py:76 +msgid "Contact Group" +msgstr "Контактная группа" + +#: templates/tenancy/contactgroup.html:57 +msgid "Add Contact Group" +msgstr "Добавить контактную группу" + +#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:140 +#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:90 +msgid "Contact Role" +msgstr "Роль контакта" + +#: templates/tenancy/object_contacts.html:9 +msgid "Add a contact" +msgstr "Добавить контакт" + +#: templates/tenancy/tenantgroup.html:17 +msgid "Add Tenant" +msgstr "Добавить арендатора" + +#: templates/tenancy/tenantgroup.html:27 tenancy/forms/model_forms.py:31 +#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +msgid "Tenant Group" +msgstr "Группа арендаторов" + +#: templates/tenancy/tenantgroup.html:66 +msgid "Add Tenant Group" +msgstr "Добавить группу арендаторов" + +#: templates/users/group.html:37 templates/users/user.html:61 +msgid "Assigned Permissions" +msgstr "Назначенные разрешения" + +#: templates/users/objectpermission.html:6 +#: templates/users/objectpermission.html:14 users/forms/filtersets.py:67 +msgid "Permission" +msgstr "Разрешение" + +#: templates/users/objectpermission.html:33 users/forms/filtersets.py:68 +#: users/forms/model_forms.py:321 +msgid "Actions" +msgstr "Действия" + +#: templates/users/objectpermission.html:37 +msgid "View" +msgstr "Вид" + +#: templates/users/objectpermission.html:56 users/forms/model_forms.py:324 +msgid "Constraints" +msgstr "Ограничения" + +#: templates/users/objectpermission.html:76 +msgid "Assigned Users" +msgstr "Назначенные пользователи" + +#: templates/users/user.html:38 +msgid "Staff" +msgstr "Персонал" + +#: templates/virtualization/cluster.html:56 +msgid "Allocated Resources" +msgstr "Выделенные ресурсы" + +#: templates/virtualization/cluster.html:60 +#: templates/virtualization/virtualmachine.html:128 +msgid "Virtual CPUs" +msgstr "Виртуальные процессоры" + +#: templates/virtualization/cluster.html:64 +#: templates/virtualization/virtualmachine.html:132 +msgid "Memory" +msgstr "Память" + +#: templates/virtualization/cluster.html:74 +#: templates/virtualization/virtualmachine.html:143 +msgid "Disk Space" +msgstr "Дисковое пространство" + +#: templates/virtualization/cluster.html:77 +#: templates/virtualization/virtualdisk.html:33 +#: templates/virtualization/virtualmachine.html:147 +msgctxt "Abbreviation for gigabyte" +msgid "GB" +msgstr "ГИГАБАЙТ" + +#: templates/virtualization/cluster/base.html:18 +msgid "Add Virtual Machine" +msgstr "Добавить виртуальную машину" + +#: templates/virtualization/cluster/base.html:24 +msgid "Assign Device" +msgstr "Назначить устройство" + +#: templates/virtualization/cluster/devices.html:10 +msgid "Remove Selected" +msgstr "Удалить выбранное" + +#: templates/virtualization/cluster_add_devices.html:9 +#, python-format +msgid "Add Device to Cluster %(cluster)s" +msgstr "Добавить устройство в кластер %(cluster)s" + +#: templates/virtualization/cluster_add_devices.html:23 +msgid "Device Selection" +msgstr "Выбор устройства" + +#: templates/virtualization/cluster_add_devices.html:31 +msgid "Add Devices" +msgstr "Добавить устройства" + +#: templates/virtualization/clustergroup.html:10 +#: templates/virtualization/clustertype.html:10 +msgid "Add Cluster" +msgstr "Добавить кластер" + +#: templates/virtualization/clustergroup.html:20 +#: virtualization/forms/model_forms.py:51 +msgid "Cluster Group" +msgstr "Кластерная группа" + +#: templates/virtualization/clustertype.html:20 +#: templates/virtualization/virtualmachine.html:111 +#: virtualization/forms/model_forms.py:35 +msgid "Cluster Type" +msgstr "Тип кластера" + +#: templates/virtualization/virtualdisk.html:18 +msgid "Virtual Disk" +msgstr "Виртуальный диск" + +#: templates/virtualization/virtualmachine.html:124 +#: virtualization/forms/bulk_edit.py:189 +#: virtualization/forms/model_forms.py:227 +msgid "Resources" +msgstr "Ресурсы" + +#: templates/virtualization/virtualmachine.html:185 +msgid "Add Virtual Disk" +msgstr "Добавить виртуальный диск" + +#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:35 +#: vpn/tables/crypto.py:166 +msgid "IKE Policy" +msgstr "Политика IKE" + +#: templates/vpn/ikepolicy.html:22 +msgid "IKE Version" +msgstr "Версия IKE" + +#: templates/vpn/ikepolicy.html:30 +msgid "Pre-Shared Key" +msgstr "Предварительный общий ключ" + +#: templates/vpn/ikepolicy.html:34 +#: templates/wireless/inc/authentication_attrs.html:21 +msgid "Show Secret" +msgstr "Показать секрет" + +#: templates/vpn/ikepolicy.html:59 templates/vpn/ipsecpolicy.html:47 +#: templates/vpn/ipsecprofile.html:55 templates/vpn/ipsecprofile.html:82 +#: vpn/forms/model_forms.py:310 vpn/forms/model_forms.py:345 +#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +msgid "Proposals" +msgstr "Предложения" + +#: templates/vpn/ikeproposal.html:10 +msgid "IKE Proposal" +msgstr "Предложение IKE" + +#: templates/vpn/ikeproposal.html:22 vpn/forms/bulk_edit.py:96 +#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:98 +msgid "Authentication method" +msgstr "Метод аутентификации" + +#: templates/vpn/ikeproposal.html:26 templates/vpn/ipsecproposal.html:22 +#: vpn/forms/bulk_edit.py:101 vpn/forms/bulk_edit.py:173 +#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:193 +#: vpn/forms/filtersets.py:103 vpn/forms/filtersets.py:151 +msgid "Encryption algorithm" +msgstr "Алгоритм шифрования" + +#: templates/vpn/ikeproposal.html:30 templates/vpn/ipsecproposal.html:26 +#: vpn/forms/bulk_edit.py:106 vpn/forms/bulk_edit.py:178 +#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:197 +#: vpn/forms/filtersets.py:108 vpn/forms/filtersets.py:156 +msgid "Authentication algorithm" +msgstr "Алгоритм аутентификации" + +#: templates/vpn/ikeproposal.html:34 +msgid "DH group" +msgstr "Группа DH" + +#: templates/vpn/ikeproposal.html:38 templates/vpn/ipsecproposal.html:30 +#: vpn/forms/bulk_edit.py:183 vpn/models/crypto.py:134 +msgid "SA lifetime (seconds)" +msgstr "Срок службы SA (в секундах)" + +#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:70 +#: vpn/tables/crypto.py:170 +msgid "IPSec Policy" +msgstr "Политика IPsec" + +#: templates/vpn/ipsecpolicy.html:22 vpn/forms/bulk_edit.py:211 +#: vpn/models/crypto.py:181 +msgid "PFS group" +msgstr "Группа PFS" + +#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:53 +msgid "IPSec Profile" +msgstr "Профиль IPsec" + +#: templates/vpn/ipsecprofile.html:94 vpn/tables/crypto.py:137 +msgid "PFS Group" +msgstr "Группа компаний PFS" + +#: templates/vpn/ipsecproposal.html:10 +msgid "IPSec Proposal" +msgstr "Предложение IPsec" + +#: templates/vpn/ipsecproposal.html:34 vpn/forms/bulk_edit.py:187 +#: vpn/models/crypto.py:140 +msgid "SA lifetime (KB)" +msgstr "Срок службы (КБ)" + +#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:10 +msgid "L2VPN Attributes" +msgstr "Атрибуты L2VPN" + +#: templates/vpn/l2vpn.html:65 templates/vpn/tunnel.html:81 +msgid "Add a Termination" +msgstr "Добавить увольнение" + +#: templates/vpn/l2vpntermination_edit.html:9 +msgid "L2VPN Termination" +msgstr "Прекращение действия L2VPN" + +#: templates/vpn/tunnel.html:9 +msgid "Add Termination" +msgstr "Добавить прекращение" + +#: templates/vpn/tunnel.html:38 vpn/forms/bulk_edit.py:48 +#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:56 +msgid "Encapsulation" +msgstr "Инкапсуляция" + +#: templates/vpn/tunnel.html:42 vpn/forms/bulk_edit.py:54 +#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:63 +#: vpn/models/crypto.py:238 vpn/tables/tunnels.py:47 +msgid "IPSec profile" +msgstr "Профиль IPsec" + +#: templates/vpn/tunnel.html:46 vpn/forms/bulk_edit.py:68 +#: vpn/forms/filtersets.py:67 +msgid "Tunnel ID" +msgstr "Идентификатор туннеля" + +#: templates/vpn/tunnelgroup.html:14 +msgid "Add Tunnel" +msgstr "Добавить туннель" + +#: templates/vpn/tunnelgroup.html:24 vpn/forms/model_forms.py:35 +#: vpn/forms/model_forms.py:48 +msgid "Tunnel Group" +msgstr "Туннельная группа" + +#: templates/vpn/tunneltermination.html:10 +msgid "Tunnel Termination" +msgstr "Прекращение туннеля" + +#: templates/vpn/tunneltermination.html:36 vpn/forms/bulk_import.py:107 +#: vpn/forms/model_forms.py:101 vpn/forms/model_forms.py:137 +#: vpn/forms/model_forms.py:248 vpn/tables/tunnels.py:97 +msgid "Outside IP" +msgstr "Внешний IP-адрес" + +#: templates/vpn/tunneltermination.html:53 +msgid "Peer Terminations" +msgstr "Прекращение контрактов со стороны коллег" + +#: templates/wireless/inc/authentication_attrs.html:13 +msgid "Cipher" +msgstr "Шифр" + +#: templates/wireless/inc/authentication_attrs.html:17 +msgid "PSK" +msgstr "ПСК" + +#: templates/wireless/inc/wirelesslink_interface.html:35 +#: templates/wireless/inc/wirelesslink_interface.html:45 +msgctxt "Abbreviation for megahertz" +msgid "MHz" +msgstr "МГц" + +#: templates/wireless/wirelesslan.html:11 wireless/forms/model_forms.py:54 +msgid "Wireless LAN" +msgstr "Беспроводная сеть" + +#: templates/wireless/wirelesslan.html:59 +msgid "Attached Interfaces" +msgstr "Подключенные интерфейсы" + +#: templates/wireless/wirelesslangroup.html:17 +msgid "Add Wireless LAN" +msgstr "Добавить беспроводную локальную сеть" + +#: templates/wireless/wirelesslangroup.html:26 +#: wireless/forms/model_forms.py:27 +msgid "Wireless LAN Group" +msgstr "Группа беспроводных локальных сетей" + +#: templates/wireless/wirelesslangroup.html:64 +msgid "Add Wireless LAN Group" +msgstr "Добавить группу беспроводной локальной сети" + +#: templates/wireless/wirelesslink.html:16 +msgid "Link Properties" +msgstr "Свойства ссылки" + +#: tenancy/choices.py:19 +msgid "Tertiary" +msgstr "Высшее образование" + +#: tenancy/choices.py:20 +msgid "Inactive" +msgstr "Неактивный" + +#: tenancy/filtersets.py:29 tenancy/filtersets.py:55 tenancy/filtersets.py:97 +msgid "Contact group (ID)" +msgstr "Контактная группа (ID)" + +#: tenancy/filtersets.py:35 tenancy/filtersets.py:62 tenancy/filtersets.py:104 +msgid "Contact group (slug)" +msgstr "Контактная группа (slug)" + +#: tenancy/filtersets.py:91 +msgid "Contact (ID)" +msgstr "Контактное лицо (ID)" + +#: tenancy/filtersets.py:108 +msgid "Contact role (ID)" +msgstr "Роль контакта (ID)" + +#: tenancy/filtersets.py:114 +msgid "Contact role (slug)" +msgstr "Контактная роль (пуля)" + +#: tenancy/filtersets.py:146 +msgid "Contact group" +msgstr "Контактная группа" + +#: tenancy/filtersets.py:157 tenancy/filtersets.py:176 +msgid "Tenant group (ID)" +msgstr "Группа арендаторов (ID)" + +#: tenancy/filtersets.py:209 +msgid "Tenant Group (ID)" +msgstr "Группа арендаторов (ID)" + +#: tenancy/filtersets.py:216 +msgid "Tenant Group (slug)" +msgstr "Группа арендаторов (slug)" + +#: tenancy/forms/bulk_edit.py:65 +msgid "Desciption" +msgstr "Описание" + +#: tenancy/forms/bulk_import.py:101 +msgid "Assigned contact" +msgstr "Назначенный контакт" + +#: tenancy/models/contacts.py:32 +msgid "contact group" +msgstr "контактная группа" + +#: tenancy/models/contacts.py:33 +msgid "contact groups" +msgstr "контактные группы" + +#: tenancy/models/contacts.py:48 +msgid "contact role" +msgstr "роль контакта" + +#: tenancy/models/contacts.py:49 +msgid "contact roles" +msgstr "контактные роли" + +#: tenancy/models/contacts.py:68 +msgid "title" +msgstr "титул" + +#: tenancy/models/contacts.py:73 +msgid "phone" +msgstr "телефон" + +#: tenancy/models/contacts.py:78 +msgid "email" +msgstr "письмо" + +#: tenancy/models/contacts.py:87 +msgid "link" +msgstr "ссылка на сайт" + +#: tenancy/models/contacts.py:103 +msgid "contact" +msgstr "контакт" + +#: tenancy/models/contacts.py:104 +msgid "contacts" +msgstr "контакты" + +#: tenancy/models/contacts.py:153 +msgid "contact assignment" +msgstr "назначение контакта" + +#: tenancy/models/contacts.py:154 +msgid "contact assignments" +msgstr "назначение контактов" + +#: tenancy/models/contacts.py:170 +#, python-brace-format +msgid "Contacts cannot be assigned to this object type ({type})." +msgstr "Контакты не могут быть присвоены этому типу объекта ({type})." + +#: tenancy/models/tenants.py:32 +msgid "tenant group" +msgstr "группа арендаторов" + +#: tenancy/models/tenants.py:33 +msgid "tenant groups" +msgstr "группы арендаторов" + +#: tenancy/models/tenants.py:70 +msgid "Tenant name must be unique per group." +msgstr "Имя арендатора должно быть уникальным для каждой группы." + +#: tenancy/models/tenants.py:80 +msgid "Tenant slug must be unique per group." +msgstr "Заголовок арендатора должен быть уникальным для каждой группы." + +#: tenancy/models/tenants.py:88 +msgid "tenant" +msgstr "арендатор" + +#: tenancy/models/tenants.py:89 +msgid "tenants" +msgstr "арендаторы" + +#: tenancy/tables/contacts.py:112 +msgid "Contact Title" +msgstr "Название контактного лица" + +#: tenancy/tables/contacts.py:116 +msgid "Contact Phone" +msgstr "Контактный телефон" + +#: tenancy/tables/contacts.py:120 +msgid "Contact Email" +msgstr "Контактный адрес электронной почты" + +#: tenancy/tables/contacts.py:124 +msgid "Contact Address" +msgstr "Контактный адрес" + +#: tenancy/tables/contacts.py:128 +msgid "Contact Link" +msgstr "Контактная ссылка" + +#: tenancy/tables/contacts.py:132 +msgid "Contact Description" +msgstr "Описание контакта" + +#: users/filtersets.py:48 users/filtersets.py:151 +msgid "Group (name)" +msgstr "Группа (название)" + +#: users/forms/bulk_edit.py:24 +msgid "First name" +msgstr "Имя" + +#: users/forms/bulk_edit.py:29 +msgid "Last name" +msgstr "Фамилия" + +#: users/forms/bulk_edit.py:41 +msgid "Staff status" +msgstr "Статус персонала" + +#: users/forms/bulk_edit.py:46 +msgid "Superuser status" +msgstr "Статус суперпользователя" + +#: users/forms/bulk_import.py:43 +msgid "If no key is provided, one will be generated automatically." +msgstr "Если ключ не указан, он будет сгенерирован автоматически." + +#: users/forms/filtersets.py:52 users/tables.py:42 +msgid "Is Staff" +msgstr "Является ли персонал" + +#: users/forms/filtersets.py:59 users/tables.py:45 +msgid "Is Superuser" +msgstr "Является суперпользователем" + +#: users/forms/filtersets.py:92 users/tables.py:89 +msgid "Can View" +msgstr "Может просматривать" + +#: users/forms/filtersets.py:99 users/tables.py:92 +msgid "Can Add" +msgstr "Можно добавить" + +#: users/forms/filtersets.py:106 users/tables.py:95 +msgid "Can Change" +msgstr "Может измениться" + +#: users/forms/filtersets.py:113 users/tables.py:98 +msgid "Can Delete" +msgstr "Можно удалить" + +#: users/forms/model_forms.py:58 +msgid "User Interface" +msgstr "Пользовательский интерфейс" + +#: users/forms/model_forms.py:115 +msgid "" +"Keys must be at least 40 characters in length. Be sure to record " +"your key prior to submitting this form, as it may no longer be " +"accessible once the token has been created." +msgstr "" +"Длина ключей должна быть не менее 40 символов. Обязательно запишите " +"свой ключ до отправки этой формы, так как после создания токена она" +" может быть недоступна." + +#: users/forms/model_forms.py:127 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" +" no restrictions. Example: " +"10.1.1.0/24,192.168.10.16/32,2001:db8:1::/64" +msgstr "" +"Разрешенные сети IPv4/IPv6, из которых можно использовать токен. Оставьте " +"поле пустым, чтобы не было ограничений. Пример: 10.1.1.0/24, " +"192.168.10.16/32, 2001 год: дБ 8:1:/64" + +#: users/forms/model_forms.py:176 +msgid "Confirm password" +msgstr "Подтвердите пароль" + +#: users/forms/model_forms.py:179 +msgid "Enter the same password as before, for verification." +msgstr "Введите тот же пароль, что и раньше, для проверки." + +#: users/forms/model_forms.py:237 +msgid "Passwords do not match! Please check your input and try again." +msgstr "" +"Пароли не совпадают! Пожалуйста, проверьте введенные данные и попробуйте " +"снова." + +#: users/forms/model_forms.py:303 +msgid "Additional actions" +msgstr "Дополнительные действия" + +#: users/forms/model_forms.py:306 +msgid "Actions granted in addition to those listed above" +msgstr "Действия, предпринятые в дополнение к перечисленным выше" + +#: users/forms/model_forms.py:322 +msgid "Objects" +msgstr "Объекты" + +#: users/forms/model_forms.py:334 +msgid "" +"JSON expression of a queryset filter that will return only permitted " +"objects. Leave null to match all objects of this type. A list of multiple " +"objects will result in a logical OR operation." +msgstr "" +"JSON-выражение фильтра queryset, возвращающее только разрешенные объекты. " +"Оставьте значение null для соответствия всем объектам этого типа. Список из " +"нескольких объектов приведет к логической операции ИЛИ." + +#: users/forms/model_forms.py:372 +msgid "At least one action must be selected." +msgstr "Должно быть выбрано хотя бы одно действие." + +#: users/forms/model_forms.py:389 +#, python-brace-format +msgid "Invalid filter for {model}: {error}" +msgstr "Неверный фильтр для {model}: {error}" + +#: users/models.py:54 +msgid "user" +msgstr "пользователя" + +#: users/models.py:55 +msgid "users" +msgstr "пользователей" + +#: users/models.py:66 +msgid "A user with this username already exists." +msgstr "Пользователь с таким именем уже существует." + +#: users/models.py:78 vpn/models/crypto.py:42 +msgid "group" +msgstr "группа" + +#: users/models.py:79 +msgid "groups" +msgstr "групп" + +#: users/models.py:106 users/models.py:107 +msgid "user preferences" +msgstr "пользовательские предпочтения" + +#: users/models.py:174 +#, python-brace-format +msgid "Key '{path}' is a leaf node; cannot assign new keys" +msgstr "Ключ '{path}'является листовым узлом; не может назначать новые ключи" + +#: users/models.py:186 +#, python-brace-format +msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" +msgstr "" +"Ключ '{path}'— словарь; не может присвоить значение, отличное от словаря" + +#: users/models.py:252 +msgid "expires" +msgstr "истекает" + +#: users/models.py:257 +msgid "last used" +msgstr "последний раз использованный" + +#: users/models.py:262 +msgid "key" +msgstr "ключ" + +#: users/models.py:268 +msgid "write enabled" +msgstr "запись включена" + +#: users/models.py:270 +msgid "Permit create/update/delete operations using this key" +msgstr "" +"Разрешить операции создания/обновления/удаления с использованием этого ключа" + +#: users/models.py:281 +msgid "allowed IPs" +msgstr "разрешенные IP-адреса" + +#: users/models.py:283 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" +" no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" +msgstr "" +"Разрешенные сети IPv4/IPv6, из которых можно использовать токен. Оставьте " +"поле пустым, чтобы не было ограничений. Пример: «10.1.1.0/24, " +"192.168.10.16/32, 2001: БД 8:1: /64»" + +#: users/models.py:291 +msgid "token" +msgstr "токен" + +#: users/models.py:292 +msgid "tokens" +msgstr "токены" + +#: users/models.py:373 +msgid "The list of actions granted by this permission" +msgstr "Список действий, предусмотренных этим разрешением" + +#: users/models.py:378 +msgid "constraints" +msgstr "ограничения" + +#: users/models.py:379 +msgid "" +"Queryset filter matching the applicable objects of the selected type(s)" +msgstr "" +"Фильтр Queryset, соответствующий применимым объектам выбранного типа (типов)" + +#: users/models.py:386 +msgid "permission" +msgstr "разрешение" + +#: users/models.py:387 +msgid "permissions" +msgstr "разрешения" + +#: users/tables.py:101 +msgid "Custom Actions" +msgstr "Настраиваемые действия" + +#: utilities/choices.py:16 +#, python-brace-format +msgid "{name} has a key defined but CHOICES is not a list" +msgstr "{name} имеет определенный ключ, но CHOICES не является списком" + +#: utilities/choices.py:135 +msgid "Dark Red" +msgstr "Темно-красный" + +#: utilities/choices.py:138 +msgid "Rose" +msgstr "Роза" + +#: utilities/choices.py:139 +msgid "Fuchsia" +msgstr "фуксия" + +#: utilities/choices.py:141 +msgid "Dark Purple" +msgstr "Темно-фиолетовый" + +#: utilities/choices.py:144 +msgid "Light Blue" +msgstr "Светло-синий" + +#: utilities/choices.py:147 +msgid "Aqua" +msgstr "вода" + +#: utilities/choices.py:148 +msgid "Dark Green" +msgstr "Темно-зеленый" + +#: utilities/choices.py:150 +msgid "Light Green" +msgstr "Светло-зеленый" + +#: utilities/choices.py:151 +msgid "Lime" +msgstr "Лайм" + +#: utilities/choices.py:153 +msgid "Amber" +msgstr "янтарь" + +#: utilities/choices.py:155 +msgid "Dark Orange" +msgstr "Темно-оранжевый" + +#: utilities/choices.py:156 +msgid "Brown" +msgstr "коричневый" + +#: utilities/choices.py:157 +msgid "Light Grey" +msgstr "Светло-серый" + +#: utilities/choices.py:158 +msgid "Grey" +msgstr "Серый" + +#: utilities/choices.py:159 +msgid "Dark Grey" +msgstr "Темно-серый" + +#: utilities/choices.py:217 +msgid "Direct" +msgstr "Прямой" + +#: utilities/choices.py:218 +msgid "Upload" +msgstr "Загрузить" + +#: utilities/choices.py:230 utilities/choices.py:244 +msgid "Auto-detect" +msgstr "Автоматическое обнаружение" + +#: utilities/choices.py:245 +msgid "Comma" +msgstr "Запятая" + +#: utilities/choices.py:246 +msgid "Semicolon" +msgstr "Точка с запятой" + +#: utilities/choices.py:247 +msgid "Tab" +msgstr "Вкладка" + +#: utilities/error_handlers.py:20 +#, python-brace-format +msgid "" +"Unable to delete {objects}. {count} dependent objects were " +"found: " +msgstr "" +"Невозможно удалить {objects}. {count} найдены зависимые " +"объекты: " + +#: utilities/error_handlers.py:22 +msgid "More than 50" +msgstr "Более 50" + +#: utilities/fields.py:162 +#, python-format +msgid "" +"%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " +"in the format 'app.model'" +msgstr "" +"%s(%r) недействителен. Параметр to_model для CounterCacheField должен быть " +"строкой в формате app.model" + +#: utilities/fields.py:172 +#, python-format +msgid "" +"%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " +"in the format 'field'" +msgstr "" +"%s(%r) недействителен. Параметр to_field для CounterCacheField должен быть " +"строкой в формате «поле»" + +#: utilities/forms/bulk_import.py:24 +msgid "Enter object data in CSV, JSON or YAML format." +msgstr "Введите объектные данные в формате CSV, JSON или YAML." + +#: utilities/forms/bulk_import.py:37 +msgid "CSV delimiter" +msgstr "CSV-разделитель" + +#: utilities/forms/bulk_import.py:38 +msgid "The character which delimits CSV fields. Applies only to CSV format." +msgstr "Символ, ограничивающий поля CSV. Применяется только к формату CSV." + +#: utilities/forms/bulk_import.py:101 +msgid "Unable to detect data format. Please specify." +msgstr "Не удалось определить формат данных. Пожалуйста, укажите." + +#: utilities/forms/bulk_import.py:124 +msgid "Invalid CSV delimiter" +msgstr "Неверный разделитель CSV" + +#: utilities/forms/bulk_import.py:168 +msgid "" +"Invalid YAML data. Data must be in the form of multiple documents, or a " +"single document comprising a list of dictionaries." +msgstr "" +"Неверные данные YAML. Данные должны быть в форме нескольких документов или " +"одного документа, содержащего список словарей." + +#: utilities/forms/fields/array.py:17 +#, python-brace-format +msgid "" +"Invalid list ({value}). Must be numeric and ranges must be in ascending " +"order." +msgstr "" +"Неверный список ({value}). Должен быть числовым, а диапазоны — в порядке " +"возрастания." + +#: utilities/forms/fields/csv.py:44 +#, python-brace-format +msgid "Invalid value for a multiple choice field: {value}" +msgstr "Неверное значение для поля с несколькими вариантами ответов: {value}" + +#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:74 +#, python-format +msgid "Object not found: %(value)s" +msgstr "Объект не найден: %(value)s" + +#: utilities/forms/fields/csv.py:65 +#, python-brace-format +msgid "" +"\"{value}\" is not a unique value for this field; multiple objects were " +"found" +msgstr "" +"«{value}\"не является уникальным значением для этого поля; найдено несколько" +" объектов" + +#: utilities/forms/fields/csv.py:97 +msgid "Object type must be specified as \".\"" +msgstr "Тип объекта должен быть указан как».»" + +#: utilities/forms/fields/csv.py:101 +msgid "Invalid object type" +msgstr "Неверный тип объекта" + +#: utilities/forms/fields/expandable.py:25 +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9])." +msgstr "" +"Для массового создания поддерживаются алфавитно-цифровые диапазоны. " +"Смешанные регистр и типы в одном диапазоне не поддерживаются (например: " +"[возраст, пол] -0/0/ [0-9])." + +#: utilities/forms/fields/expandable.py:46 +msgid "" +"Specify a numeric range to create multiple IPs.
    Example: " +"192.0.2.[1,5,100-254]/24" +msgstr "" +"Укажите числовой диапазон для создания нескольких IP-адресов.
    Пример: " +"192.0.2 [1,5,100-254] /24" + +#: utilities/forms/fields/fields.py:31 +#, python-brace-format +msgid "" +" Markdown syntax is supported" +msgstr "" +" Уценка поддерживается синтаксис" + +#: utilities/forms/fields/fields.py:48 +msgid "URL-friendly unique shorthand" +msgstr "Уникальное сокращение, удобное для URL-адресов" + +#: utilities/forms/fields/fields.py:99 +msgid "Enter context data in JSON format." +msgstr "" +"Введите контекстные данные в JSON формат." + +#: utilities/forms/fields/fields.py:117 +msgid "MAC address must be in EUI-48 format" +msgstr "MAC-адрес должен быть в формате EUI-48" + +#: utilities/forms/forms.py:53 +msgid "Use regular expressions" +msgstr "Используйте регулярные выражения" + +#: utilities/forms/forms.py:87 +#, python-brace-format +msgid "Unrecognized header: {name}" +msgstr "Неизвестный заголовок: {name}" + +#: utilities/forms/forms.py:113 +msgid "Available Columns" +msgstr "Доступные столбцы" + +#: utilities/forms/forms.py:121 +msgid "Selected Columns" +msgstr "Выбранные столбцы" + +#: utilities/forms/mixins.py:101 +msgid "" +"This object has been modified since the form was rendered. Please consult " +"the object's change log for details." +msgstr "" +"Этот объект был изменен с момента визуализации формы. Подробности см. в " +"журнале изменений объекта." + +#: utilities/templates/builtins/customfield_value.html:30 +msgid "Not defined" +msgstr "Не определено" + +#: utilities/templates/buttons/bookmark.html:9 +msgid "Unbookmark" +msgstr "Удалить закладки" + +#: utilities/templates/buttons/bookmark.html:13 +msgid "Bookmark" +msgstr "Закладка" + +#: utilities/templates/buttons/clone.html:4 +msgid "Clone" +msgstr "Клон" + +#: utilities/templates/buttons/export.html:4 +msgid "Export" +msgstr "Экспорт" + +#: utilities/templates/buttons/export.html:7 +msgid "Current View" +msgstr "Текущий вид" + +#: utilities/templates/buttons/export.html:8 +msgid "All Data" +msgstr "Все данные" + +#: utilities/templates/buttons/export.html:28 +msgid "Add export template" +msgstr "Добавить шаблон экспорта" + +#: utilities/templates/buttons/import.html:4 +msgid "Import" +msgstr "Импорт" + +#: utilities/templates/form_helpers/render_field.html:36 +msgid "Copy to clipboard" +msgstr "Скопировать в буфер обмена" + +#: utilities/templates/form_helpers/render_field.html:52 +msgid "This field is required" +msgstr "Это поле обязательно" + +#: utilities/templates/form_helpers/render_field.html:65 +msgid "Set Null" +msgstr "Установить значение Null" + +#: utilities/templates/helpers/applied_filters.html:11 +msgid "Clear all" +msgstr "Очистить все" + +#: utilities/templates/helpers/table_config_form.html:8 +msgid "Table Configuration" +msgstr "Конфигурация таблицы" + +#: utilities/templates/helpers/table_config_form.html:31 +msgid "Move Up" +msgstr "Двигаться вверх" + +#: utilities/templates/helpers/table_config_form.html:34 +msgid "Move Down" +msgstr "Переместить вниз" + +#: utilities/templates/widgets/apiselect.html:7 +msgid "Open selector" +msgstr "Открыть селектор" + +#: utilities/templates/widgets/clearable_file_input.html:12 +msgid "None assigned" +msgstr "Ничего не назначено" + +#: utilities/templates/widgets/markdown_input.html:6 +msgid "Write" +msgstr "Напишите" + +#: utilities/templates/widgets/markdown_input.html:20 +msgid "Testing" +msgstr "Тестирование" + +#: virtualization/filtersets.py:79 +msgid "Parent group (ID)" +msgstr "Родительская группа (ID)" + +#: virtualization/filtersets.py:85 +msgid "Parent group (slug)" +msgstr "Родительская группа (слизень)" + +#: virtualization/filtersets.py:89 virtualization/filtersets.py:140 +msgid "Cluster type (ID)" +msgstr "Тип кластера (ID)" + +#: virtualization/filtersets.py:129 +msgid "Cluster group (ID)" +msgstr "Кластерная группа (ID)" + +#: virtualization/filtersets.py:150 virtualization/filtersets.py:265 +msgid "Cluster (ID)" +msgstr "Кластер (ID)" + +#: virtualization/forms/bulk_edit.py:165 +#: virtualization/models/virtualmachines.py:113 +msgid "vCPUs" +msgstr "Виртуальные процессоры" + +#: virtualization/forms/bulk_edit.py:169 +msgid "Memory (MB)" +msgstr "Память (МБ)" + +#: virtualization/forms/bulk_edit.py:173 +msgid "Disk (GB)" +msgstr "Диск (ГБ)" + +#: virtualization/forms/bulk_edit.py:333 +#: virtualization/forms/filtersets.py:243 +msgid "Size (GB)" +msgstr "Размер (ГБ)" + +#: virtualization/forms/bulk_import.py:44 +msgid "Type of cluster" +msgstr "Тип кластера" + +#: virtualization/forms/bulk_import.py:51 +msgid "Assigned cluster group" +msgstr "Назначенная кластерная группа" + +#: virtualization/forms/bulk_import.py:96 +msgid "Assigned cluster" +msgstr "Назначенный кластер" + +#: virtualization/forms/bulk_import.py:103 +msgid "Assigned device within cluster" +msgstr "Назначенное устройство в кластере" + +#: virtualization/forms/model_forms.py:156 +#, python-brace-format +msgid "" +"{device} belongs to a different site ({device_site}) than the cluster " +"({cluster_site})" +msgstr "" +"{device} принадлежит другому сайту ({device_site}), чем кластер " +"({cluster_site})" + +#: virtualization/forms/model_forms.py:195 +msgid "Optionally pin this VM to a specific host device within the cluster" +msgstr "" +"Дополнительно подключите эту виртуальную машину к определенному хост-" +"устройству в кластере." + +#: virtualization/forms/model_forms.py:224 +msgid "Site/Cluster" +msgstr "Сайт/кластер" + +#: virtualization/forms/model_forms.py:247 +msgid "Disk size is managed via the attachment of virtual disks." +msgstr "Размер диска регулируется путем вложения виртуальных дисков." + +#: virtualization/forms/model_forms.py:375 +msgid "Disk" +msgstr "Диск" + +#: virtualization/models/clusters.py:25 +msgid "cluster type" +msgstr "тип кластера" + +#: virtualization/models/clusters.py:26 +msgid "cluster types" +msgstr "типы кластеров" + +#: virtualization/models/clusters.py:45 +msgid "cluster group" +msgstr "кластерная группа" + +#: virtualization/models/clusters.py:46 +msgid "cluster groups" +msgstr "кластерные группы" + +#: virtualization/models/clusters.py:121 +msgid "cluster" +msgstr "кластер" + +#: virtualization/models/clusters.py:122 +msgid "clusters" +msgstr "кластеры" + +#: virtualization/models/clusters.py:141 +#, python-brace-format +msgid "" +"{count} devices are assigned as hosts for this cluster but are not in site " +"{site}" +msgstr "" +"{count} устройства назначены в качестве хостов для этого кластера, но их нет" +" на сайте {site}" + +#: virtualization/models/virtualmachines.py:121 +msgid "memory (MB)" +msgstr "память (МБ)" + +#: virtualization/models/virtualmachines.py:126 +msgid "disk (GB)" +msgstr "диск (ГБ)" + +#: virtualization/models/virtualmachines.py:159 +msgid "Virtual machine name must be unique per cluster." +msgstr "Имя виртуальной машины должно быть уникальным для каждого кластера." + +#: virtualization/models/virtualmachines.py:162 +msgid "virtual machine" +msgstr "виртуальная машина" + +#: virtualization/models/virtualmachines.py:163 +msgid "virtual machines" +msgstr "виртуальные машины" + +#: virtualization/models/virtualmachines.py:177 +msgid "A virtual machine must be assigned to a site and/or cluster." +msgstr "Виртуальная машина должна быть назначена сайту и/или кластеру." + +#: virtualization/models/virtualmachines.py:184 +#, python-brace-format +msgid "" +"The selected cluster ({cluster}) is not assigned to this site ({site})." +msgstr "Выбранный кластер ({cluster}) не относится к этому сайту ({site})." + +#: virtualization/models/virtualmachines.py:191 +msgid "Must specify a cluster when assigning a host device." +msgstr "При назначении хост-устройства необходимо указать кластер." + +#: virtualization/models/virtualmachines.py:196 +#, python-brace-format +msgid "" +"The selected device ({device}) is not assigned to this cluster ({cluster})." +msgstr "" +"Выбранное устройство ({device}) не относится к этому кластеру ({cluster})." + +#: virtualization/models/virtualmachines.py:208 +#, python-brace-format +msgid "" +"The specified disk size ({size}) must match the aggregate size of assigned " +"virtual disks ({total_size})." +msgstr "" +"Указанный размер диска ({size}) должен соответствовать совокупному размеру " +"назначенных виртуальных дисков ({total_size})." + +#: virtualization/models/virtualmachines.py:222 +#, python-brace-format +msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" +msgstr "" +"Должен быть IPV{family} адрес. ({ip} является IP-адресом{version} адрес.)" + +#: virtualization/models/virtualmachines.py:231 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this VM." +msgstr "Указанный IP-адрес ({ip}) не назначено этой виртуальной машине." + +#: virtualization/models/virtualmachines.py:389 +#, python-brace-format +msgid "" +"The selected parent interface ({parent}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "" +"Выбранный родительский интерфейс ({parent}) принадлежит другой виртуальной " +"машине ({virtual_machine})." + +#: virtualization/models/virtualmachines.py:404 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "" +"Выбранный интерфейс моста ({bridge}) принадлежит другой виртуальной машине " +"({virtual_machine})." + +#: virtualization/models/virtualmachines.py:415 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent virtual machine, or it must be global." +msgstr "" +"VLAN без тегов ({untagged_vlan}) должна принадлежать тому же сайту, что и " +"родительская виртуальная машина интерфейса, или она должна быть глобальной." + +#: virtualization/models/virtualmachines.py:427 +msgid "size (GB)" +msgstr "размер (ГБ)" + +#: virtualization/models/virtualmachines.py:431 +msgid "virtual disk" +msgstr "виртуальный диск" + +#: virtualization/models/virtualmachines.py:432 +msgid "virtual disks" +msgstr "виртуальные диски" + +#: vpn/choices.py:31 +msgid "IPsec - Transport" +msgstr "IPsec — транспорт" + +#: vpn/choices.py:32 +msgid "IPsec - Tunnel" +msgstr "IPsec — туннель" + +#: vpn/choices.py:33 +msgid "IP-in-IP" +msgstr "IP-адрес в IP-адресе" + +#: vpn/choices.py:34 +msgid "GRE" +msgstr "СЕРЫЙ" + +#: vpn/choices.py:56 +msgid "Hub" +msgstr "хаб" + +#: vpn/choices.py:57 +msgid "Spoke" +msgstr "Говорил" + +#: vpn/choices.py:80 +msgid "Aggressive" +msgstr "агрессивный" + +#: vpn/choices.py:81 +msgid "Main" +msgstr "Главная" + +#: vpn/choices.py:92 +msgid "Pre-shared keys" +msgstr "Предварительно общие ключи" + +#: vpn/choices.py:93 +msgid "Certificates" +msgstr "Сертификаты" + +#: vpn/choices.py:94 +msgid "RSA signatures" +msgstr "Подписи RSA" + +#: vpn/choices.py:95 +msgid "DSA signatures" +msgstr "Подписи DSA" + +#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 +#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 +#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 +#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 +#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 +#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 +#, python-brace-format +msgid "Group {n}" +msgstr "Группа {n}" + +#: vpn/choices.py:240 +msgid "Ethernet Private LAN" +msgstr "Частная локальная сеть Ethernet" + +#: vpn/choices.py:241 +msgid "Ethernet Virtual Private LAN" +msgstr "Виртуальная частная локальная сеть Ethernet" + +#: vpn/choices.py:244 +msgid "Ethernet Private Tree" +msgstr "Частное дерево Ethernet" + +#: vpn/choices.py:245 +msgid "Ethernet Virtual Private Tree" +msgstr "Виртуальное частное дерево Ethernet" + +#: vpn/filtersets.py:41 +msgid "Tunnel group (ID)" +msgstr "Группа туннелей (ID)" + +#: vpn/filtersets.py:47 +msgid "Tunnel group (slug)" +msgstr "Туннельная группа (пуля)" + +#: vpn/filtersets.py:54 +msgid "IPSec profile (ID)" +msgstr "Профиль IPsec (ID)" + +#: vpn/filtersets.py:60 +msgid "IPSec profile (name)" +msgstr "Профиль IPsec (имя)" + +#: vpn/filtersets.py:81 +msgid "Tunnel (ID)" +msgstr "Туннель (ID)" + +#: vpn/filtersets.py:87 +msgid "Tunnel (name)" +msgstr "Туннель (название)" + +#: vpn/filtersets.py:118 +msgid "Outside IP (ID)" +msgstr "Внешний IP-адрес (ID)" + +#: vpn/filtersets.py:235 +msgid "IKE policy (ID)" +msgstr "Политика IKE (ID)" + +#: vpn/filtersets.py:241 +msgid "IKE policy (name)" +msgstr "Политика IKE (название)" + +#: vpn/filtersets.py:245 +msgid "IPSec policy (ID)" +msgstr "Политика IPsec (ID)" + +#: vpn/filtersets.py:251 +msgid "IPSec policy (name)" +msgstr "Политика IPsec (имя)" + +#: vpn/filtersets.py:320 +msgid "L2VPN (slug)" +msgstr "L2VPN (слаггер)" + +#: vpn/filtersets.py:384 +msgid "VM Interface (ID)" +msgstr "Интерфейс виртуальной машины (ID)" + +#: vpn/filtersets.py:390 +msgid "VLAN (name)" +msgstr "VLAN (название)" + +#: vpn/forms/bulk_edit.py:44 vpn/forms/bulk_import.py:42 +#: vpn/forms/filtersets.py:53 +msgid "Tunnel group" +msgstr "Группа туннелей" + +#: vpn/forms/bulk_edit.py:116 vpn/models/crypto.py:47 +msgid "SA lifetime" +msgstr "На всю жизнь" + +#: vpn/forms/bulk_edit.py:150 wireless/forms/bulk_edit.py:78 +#: wireless/forms/bulk_edit.py:125 wireless/forms/filtersets.py:63 +#: wireless/forms/filtersets.py:97 +msgid "Pre-shared key" +msgstr "Предварительный общий ключ" + +#: vpn/forms/bulk_edit.py:238 vpn/forms/bulk_import.py:234 +#: vpn/forms/filtersets.py:196 vpn/forms/model_forms.py:363 +#: vpn/models/crypto.py:103 +msgid "IKE policy" +msgstr "Политика IKE" + +#: vpn/forms/bulk_edit.py:243 vpn/forms/bulk_import.py:239 +#: vpn/forms/filtersets.py:201 vpn/forms/model_forms.py:367 +#: vpn/models/crypto.py:197 +msgid "IPSec policy" +msgstr "Политика IPsec" + +#: vpn/forms/bulk_import.py:50 +msgid "Tunnel encapsulation" +msgstr "Инкапсуляция туннелей" + +#: vpn/forms/bulk_import.py:83 +msgid "Operational role" +msgstr "Операционная роль" + +#: vpn/forms/bulk_import.py:90 +msgid "Parent device of assigned interface" +msgstr "Родительское устройство назначенного интерфейса" + +#: vpn/forms/bulk_import.py:97 +msgid "Parent VM of assigned interface" +msgstr "Родительская виртуальная машина назначенного интерфейса" + +#: vpn/forms/bulk_import.py:104 +msgid "Device or virtual machine interface" +msgstr "Интерфейс устройства или виртуальной машины" + +#: vpn/forms/bulk_import.py:181 +msgid "IKE proposal(s)" +msgstr "Предложение (предложения) IKE" + +#: vpn/forms/bulk_import.py:211 vpn/models/crypto.py:185 +msgid "Diffie-Hellman group for Perfect Forward Secrecy" +msgstr "Группа Диффи-Хеллмана за Perfect Forward Secrecy" + +#: vpn/forms/bulk_import.py:217 +msgid "IPSec proposal(s)" +msgstr "Предложение (предложения) IPsec" + +#: vpn/forms/bulk_import.py:231 +msgid "IPSec protocol" +msgstr "Протокол IPsec" + +#: vpn/forms/bulk_import.py:261 +msgid "L2VPN type" +msgstr "Тип L2VPN" + +#: vpn/forms/bulk_import.py:282 +msgid "Parent device (for interface)" +msgstr "Родительское устройство (для интерфейса)" + +#: vpn/forms/bulk_import.py:289 +msgid "Parent virtual machine (for interface)" +msgstr "Родительская виртуальная машина (для интерфейса)" + +#: vpn/forms/bulk_import.py:296 +msgid "Assigned interface (device or VM)" +msgstr "Назначенный интерфейс (устройство или виртуальная машина)" + +#: vpn/forms/bulk_import.py:329 +msgid "Cannot import device and VM interface terminations simultaneously." +msgstr "" +"Невозможно одновременно импортировать терминалы интерфейса устройства и " +"виртуальной машины." + +#: vpn/forms/bulk_import.py:331 +msgid "Each termination must specify either an interface or a VLAN." +msgstr "Каждое оконечное устройство должно указывать интерфейс или VLAN." + +#: vpn/forms/bulk_import.py:333 +msgid "Cannot assign both an interface and a VLAN." +msgstr "Невозможно назначить одновременно интерфейс и VLAN." + +#: vpn/forms/filtersets.py:127 +msgid "IKE version" +msgstr "Версия IKE" + +#: vpn/forms/filtersets.py:139 vpn/forms/filtersets.py:172 +#: vpn/forms/model_forms.py:293 vpn/forms/model_forms.py:328 +msgid "Proposal" +msgstr "Предложение" + +#: vpn/forms/filtersets.py:247 +msgid "Assigned Object Type" +msgstr "Назначенный тип объекта" + +#: vpn/forms/model_forms.py:147 +msgid "First Termination" +msgstr "Первое увольнение" + +#: vpn/forms/model_forms.py:151 +msgid "Second Termination" +msgstr "Второе расторжение" + +#: vpn/forms/model_forms.py:198 +msgid "This parameter is required when defining a termination." +msgstr "Этот параметр необходим при определении прекращения." + +#: vpn/forms/model_forms.py:314 vpn/forms/model_forms.py:349 +msgid "Policy" +msgstr "Политика" + +#: vpn/forms/model_forms.py:469 +msgid "A termination must specify an interface or VLAN." +msgstr "В терминации должен быть указан интерфейс или VLAN." + +#: vpn/forms/model_forms.py:471 +msgid "" +"A termination can only have one terminating object (an interface or VLAN)." +msgstr "" +"Терминал может иметь только один конечный объект (интерфейс или VLAN)." + +#: vpn/models/crypto.py:33 +msgid "encryption algorithm" +msgstr "алгоритм шифрования" + +#: vpn/models/crypto.py:37 +msgid "authentication algorithm" +msgstr "алгоритм аутентификации" + +#: vpn/models/crypto.py:44 +msgid "Diffie-Hellman group ID" +msgstr "Идентификатор группы Диффи-Хеллман" + +#: vpn/models/crypto.py:50 +msgid "Security association lifetime (in seconds)" +msgstr "Срок службы охранной ассоциации (в секундах)" + +#: vpn/models/crypto.py:59 +msgid "IKE proposal" +msgstr "Предложение IKE" + +#: vpn/models/crypto.py:60 +msgid "IKE proposals" +msgstr "Предложения IKE" + +#: vpn/models/crypto.py:76 +msgid "version" +msgstr "версия" + +#: vpn/models/crypto.py:87 vpn/models/crypto.py:178 +msgid "proposals" +msgstr "предложений" + +#: vpn/models/crypto.py:90 wireless/models.py:38 +msgid "pre-shared key" +msgstr "предварительный общий ключ" + +#: vpn/models/crypto.py:104 +msgid "IKE policies" +msgstr "Политики IKE" + +#: vpn/models/crypto.py:124 +msgid "encryption" +msgstr "шифрование" + +#: vpn/models/crypto.py:129 +msgid "authentication" +msgstr "аутентификация" + +#: vpn/models/crypto.py:137 +msgid "Security association lifetime (seconds)" +msgstr "Срок действия ассоциации безопасности (в секундах)" + +#: vpn/models/crypto.py:143 +msgid "Security association lifetime (in kilobytes)" +msgstr "Срок действия ассоциации безопасности (в килобайтах)" + +#: vpn/models/crypto.py:152 +msgid "IPSec proposal" +msgstr "Предложение IPsec" + +#: vpn/models/crypto.py:153 +msgid "IPSec proposals" +msgstr "Предложения IPsec" + +#: vpn/models/crypto.py:166 +msgid "Encryption and/or authentication algorithm must be defined" +msgstr "Необходимо определить алгоритм шифрования и/или аутентификации" + +#: vpn/models/crypto.py:198 +msgid "IPSec policies" +msgstr "Политики IPsec" + +#: vpn/models/crypto.py:239 +msgid "IPSec profiles" +msgstr "Профили IPsec" + +#: vpn/models/l2vpn.py:116 +msgid "L2VPN termination" +msgstr "Завершение работы L2VPN" + +#: vpn/models/l2vpn.py:117 +msgid "L2VPN terminations" +msgstr "Прекращения работы L2VPN" + +#: vpn/models/l2vpn.py:135 +#, python-brace-format +msgid "L2VPN Termination already assigned ({assigned_object})" +msgstr "Терминация L2VPN уже назначена ({assigned_object})" + +#: vpn/models/l2vpn.py:147 +#, python-brace-format +msgid "" +"{l2vpn_type} L2VPNs cannot have more than two terminations; found " +"{terminations_count} already defined." +msgstr "" +"{l2vpn_type} У L2VPN не может быть более двух терминаций; найдено " +"{terminations_count} уже определено." + +#: vpn/models/tunnels.py:26 +msgid "tunnel group" +msgstr "группа туннелей" + +#: vpn/models/tunnels.py:27 +msgid "tunnel groups" +msgstr "группы туннелей" + +#: vpn/models/tunnels.py:53 +msgid "encapsulation" +msgstr "инкапсуляция" + +#: vpn/models/tunnels.py:72 +msgid "tunnel ID" +msgstr "идентификатор туннеля" + +#: vpn/models/tunnels.py:94 +msgid "tunnel" +msgstr "тоннель" + +#: vpn/models/tunnels.py:95 +msgid "tunnels" +msgstr "туннели" + +#: vpn/models/tunnels.py:153 +msgid "An object may be terminated to only one tunnel at a time." +msgstr "Одновременно объект может быть отправлен только в один туннель." + +#: vpn/models/tunnels.py:156 +msgid "tunnel termination" +msgstr "завершение туннеля" + +#: vpn/models/tunnels.py:157 +msgid "tunnel terminations" +msgstr "терминалы туннелей" + +#: vpn/models/tunnels.py:174 +#, python-brace-format +msgid "{name} is already attached to a tunnel ({tunnel})." +msgstr "{name} уже подключен к туннелю ({tunnel})." + +#: vpn/tables/crypto.py:22 +msgid "Authentication Method" +msgstr "Метод аутентификации" + +#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +msgid "Encryption Algorithm" +msgstr "Алгоритм шифрования" + +#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +msgid "Authentication Algorithm" +msgstr "Алгоритм аутентификации" + +#: vpn/tables/crypto.py:34 +msgid "SA Lifetime" +msgstr "Срок службы" + +#: vpn/tables/crypto.py:71 +msgid "Pre-shared Key" +msgstr "Предварительный общий ключ" + +#: vpn/tables/crypto.py:103 +msgid "SA Lifetime (Seconds)" +msgstr "Срок службы SA (в секундах)" + +#: vpn/tables/crypto.py:106 +msgid "SA Lifetime (KB)" +msgstr "Срок службы SA (КБ)" + +#: vpn/tables/l2vpn.py:69 +msgid "Object Parent" +msgstr "Родитель объекта" + +#: vpn/tables/l2vpn.py:74 +msgid "Object Site" +msgstr "Объектный сайт" + +#: vpn/tables/tunnels.py:84 +msgid "Host" +msgstr "Хозяин" + +#: wireless/choices.py:11 +msgid "Access point" +msgstr "Точка доступа" + +#: wireless/choices.py:12 +msgid "Station" +msgstr "станция" + +#: wireless/choices.py:467 +msgid "Open" +msgstr "Открыть" + +#: wireless/choices.py:469 +msgid "WPA Personal (PSK)" +msgstr "Персонал WPA (PSK)" + +#: wireless/choices.py:470 +msgid "WPA Enterprise" +msgstr "Предприятие WPA" + +#: wireless/forms/bulk_edit.py:72 wireless/forms/bulk_edit.py:119 +#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 +#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 +#: wireless/forms/filtersets.py:58 wireless/forms/filtersets.py:92 +msgid "Authentication cipher" +msgstr "Шифр аутентификации" + +#: wireless/forms/bulk_import.py:52 +msgid "Bridged VLAN" +msgstr "Мостовая VLAN" + +#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:27 +msgid "Interface A" +msgstr "Интерфейс A" + +#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:36 +msgid "Interface B" +msgstr "Интерфейс B" + +#: wireless/forms/model_forms.py:158 +msgid "Side B" +msgstr "Сторона B" + +#: wireless/models.py:30 +msgid "authentication cipher" +msgstr "шифр аутентификации" + +#: wireless/models.py:68 +msgid "wireless LAN group" +msgstr "группа беспроводной локальной сети" + +#: wireless/models.py:69 +msgid "wireless LAN groups" +msgstr "группы беспроводной локальной сети" + +#: wireless/models.py:115 +msgid "wireless LAN" +msgstr "беспроводная локальная сеть" + +#: wireless/models.py:143 +msgid "interface A" +msgstr "интерфейс A" + +#: wireless/models.py:150 +msgid "interface B" +msgstr "интерфейс B" + +#: wireless/models.py:198 +msgid "wireless link" +msgstr "беспроводная связь" + +#: wireless/models.py:199 +msgid "wireless links" +msgstr "беспроводные ссылки" + +#: wireless/models.py:216 wireless/models.py:222 +#, python-brace-format +msgid "{type} is not a wireless interface." +msgstr "{type} не является беспроводным интерфейсом." From 326b54b7e0474164941021878560babaaf34f1de Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 21 Dec 2023 12:11:30 -0500 Subject: [PATCH 190/271] Closes #14579: Add user language preference --- netbox/account/views.py | 13 +++++++++++-- netbox/netbox/preferences.py | 19 ++++++++++++++----- netbox/netbox/settings.py | 9 +++++++++ netbox/users/forms/model_forms.py | 1 + 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/netbox/account/views.py b/netbox/account/views.py index 3156b2102..3dbba9b29 100644 --- a/netbox/account/views.py +++ b/netbox/account/views.py @@ -13,6 +13,7 @@ from django.shortcuts import render, resolve_url from django.urls import reverse from django.utils.decorators import method_decorator from django.utils.http import url_has_allowed_host_and_scheme, urlencode +from django.utils.translation import gettext_lazy as _ from django.views.decorators.debug import sensitive_post_parameters from django.views.generic import View from social_core.backends.utils import load_backends @@ -193,8 +194,16 @@ class UserConfigView(LoginRequiredMixin, View): if form.is_valid(): form.save() - messages.success(request, "Your preferences have been updated.") - return redirect('account:preferences') + messages.success(request, _("Your preferences have been updated.")) + response = redirect('account:preferences') + + # Set/clear language cookie + if language := form.cleaned_data['locale.language']: + response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language) + else: + response.delete_cookie(settings.LANGUAGE_COOKIE_NAME) + + return response return render(request, self.template_name, { 'form': form, diff --git a/netbox/netbox/preferences.py b/netbox/netbox/preferences.py index 5ef216259..9a6fe490c 100644 --- a/netbox/netbox/preferences.py +++ b/netbox/netbox/preferences.py @@ -1,4 +1,6 @@ +from django.conf import settings from django.utils.translation import gettext as _ + from netbox.registry import registry from users.preferences import UserPreference from utilities.paginator import EnhancedPaginator @@ -16,11 +18,18 @@ PREFERENCES = { 'ui.colormode': UserPreference( label=_('Color mode'), choices=( - ('light', 'Light'), - ('dark', 'Dark'), + ('light', _('Light')), + ('dark', _('Dark')), ), default='light', ), + 'locale.language': UserPreference( + label=_('Language'), + choices=( + ('', _('Auto')), + *settings.LANGUAGES, + ) + ), 'pagination.per_page': UserPreference( label=_('Page length'), choices=get_page_lengths(), @@ -30,9 +39,9 @@ PREFERENCES = { 'pagination.placement': UserPreference( label=_('Paginator placement'), choices=( - ('bottom', 'Bottom'), - ('top', 'Top'), - ('both', 'Both'), + ('bottom', _('Bottom')), + ('top', _('Top')), + ('both', _('Both')), ), description=_('Where the paginator controls will be displayed relative to a table'), default='bottom' diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 59e507d28..00f7c33b4 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -13,6 +13,7 @@ from django.contrib.messages import constants as messages from django.core.exceptions import ImproperlyConfigured, ValidationError from django.core.validators import URLValidator from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ try: import sentry_sdk except ModuleNotFoundError: @@ -721,6 +722,14 @@ RQ_QUEUES.update({ # Localization # +LANGUAGES = ( + ('en', _('English')), + ('es', _('Spanish')), + ('fr', _('French')), + ('pt', _('Portuguese')), + ('ru', _('Russian')), +) + LOCALE_PATHS = ( BASE_DIR + '/translations', ) diff --git a/netbox/users/forms/model_forms.py b/netbox/users/forms/model_forms.py index b0a43ef22..99320fa25 100644 --- a/netbox/users/forms/model_forms.py +++ b/netbox/users/forms/model_forms.py @@ -56,6 +56,7 @@ class UserConfigFormMetaclass(forms.models.ModelFormMetaclass): class UserConfigForm(BootstrapMixin, forms.ModelForm, metaclass=UserConfigFormMetaclass): fieldsets = ( (_('User Interface'), ( + 'locale.language', 'pagination.per_page', 'pagination.placement', 'ui.colormode', From 58f925c2614f9d087c462b88fb18e88350f77f34 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 21 Dec 2023 14:24:05 -0500 Subject: [PATCH 191/271] Closes #14503: Include additional display attributes for search indexers --- netbox/core/search.py | 1 + netbox/dcim/search.py | 29 ++++++++++++++++------------- netbox/extras/search.py | 2 ++ netbox/virtualization/search.py | 4 ++-- netbox/vpn/search.py | 2 +- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/netbox/core/search.py b/netbox/core/search.py index 5ea9db761..158911e6a 100644 --- a/netbox/core/search.py +++ b/netbox/core/search.py @@ -20,3 +20,4 @@ class DataFileIndex(SearchIndex): fields = ( ('path', 200), ) + display_attrs = ('source',) diff --git a/netbox/dcim/search.py b/netbox/dcim/search.py index 0784cfaf8..18cf75a9a 100644 --- a/netbox/dcim/search.py +++ b/netbox/dcim/search.py @@ -22,7 +22,7 @@ class ConsolePortIndex(SearchIndex): ('description', 500), ('speed', 2000), ) - display_attrs = ('device', 'label', 'description') + display_attrs = ('device', 'label', 'type', 'description') @register_search @@ -34,7 +34,7 @@ class ConsoleServerPortIndex(SearchIndex): ('description', 500), ('speed', 2000), ) - display_attrs = ('device', 'label', 'description') + display_attrs = ('device', 'label', 'type', 'description') @register_search @@ -48,7 +48,8 @@ class DeviceIndex(SearchIndex): ('comments', 5000), ) display_attrs = ( - 'site', 'location', 'rack', 'device_type', 'role', 'tenant', 'platform', 'serial', 'asset_tag', 'description', + 'site', 'location', 'rack', 'status', 'device_type', 'role', 'tenant', 'platform', 'serial', 'asset_tag', + 'description', ) @@ -94,7 +95,7 @@ class FrontPortIndex(SearchIndex): ('label', 200), ('description', 500), ) - display_attrs = ('device', 'label', 'description') + display_attrs = ('device', 'label', 'type', 'description') @register_search @@ -109,7 +110,7 @@ class InterfaceIndex(SearchIndex): ('mtu', 2000), ('speed', 2000), ) - display_attrs = ('device', 'label', 'description') + display_attrs = ('device', 'label', 'type', 'mac_address', 'wwn', 'description') @register_search @@ -123,7 +124,7 @@ class InventoryItemIndex(SearchIndex): ('description', 500), ('part_id', 2000), ) - display_attrs = ('device', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description') + display_attrs = ('device', 'manufacturer', 'parent', 'part_id', 'serial', 'asset_tag', 'description') @register_search @@ -213,7 +214,7 @@ class PowerOutletIndex(SearchIndex): ('label', 200), ('description', 500), ) - display_attrs = ('device', 'label', 'description') + display_attrs = ('device', 'label', 'type', 'description') @register_search @@ -237,7 +238,7 @@ class PowerPortIndex(SearchIndex): ('maximum_draw', 2000), ('allocated_draw', 2000), ) - display_attrs = ('device', 'label', 'description') + display_attrs = ('device', 'label', 'type', 'description') @register_search @@ -251,7 +252,9 @@ class RackIndex(SearchIndex): ('description', 500), ('comments', 5000), ) - display_attrs = ('site', 'location', 'facility_id', 'tenant', 'status', 'role', 'description') + display_attrs = ( + 'site', 'location', 'facility_id', 'tenant', 'status', 'role', 'serial', 'asset_tag', 'description', + ) @register_search @@ -272,7 +275,7 @@ class RackRoleIndex(SearchIndex): ('slug', 110), ('description', 500), ) - display_attrs = ('device', 'label', 'description',) + display_attrs = ('description',) @register_search @@ -283,7 +286,7 @@ class RearPortIndex(SearchIndex): ('label', 200), ('description', 500), ) - display_attrs = ('device', 'label', 'description') + display_attrs = ('device', 'label', 'type', 'description') @register_search @@ -309,7 +312,7 @@ class SiteIndex(SearchIndex): ('shipping_address', 2000), ('comments', 5000), ) - display_attrs = ('region', 'group', 'status', 'description') + display_attrs = ('region', 'group', 'status', 'tenant', 'facility', 'description') @register_search @@ -344,4 +347,4 @@ class VirtualDeviceContextIndex(SearchIndex): ('description', 500), ('comments', 5000), ) - display_attrs = ('device', 'status', 'identifier', 'description') + display_attrs = ('device', 'status', 'identifier', 'tenant', 'description') diff --git a/netbox/extras/search.py b/netbox/extras/search.py index 3394f37e8..fff59fa77 100644 --- a/netbox/extras/search.py +++ b/netbox/extras/search.py @@ -9,6 +9,7 @@ class JournalEntryIndex(SearchIndex): ('comments', 5000), ) category = 'Journal' + display_attrs = ('kind', 'created_by') @register_search @@ -18,3 +19,4 @@ class WebhookEntryIndex(SearchIndex): ('name', 100), ('description', 500), ) + display_attrs = ('description',) diff --git a/netbox/virtualization/search.py b/netbox/virtualization/search.py index 9e67a0af2..c72b3345b 100644 --- a/netbox/virtualization/search.py +++ b/netbox/virtualization/search.py @@ -55,7 +55,7 @@ class VMInterfaceIndex(SearchIndex): ('description', 500), ('mtu', 2000), ) - display_attrs = ('virtual_machine', 'description') + display_attrs = ('virtual_machine', 'mac_address', 'description') @register_search @@ -65,4 +65,4 @@ class VirtualDiskIndex(SearchIndex): ('name', 100), ('description', 500), ) - display_attrs = ('virtual_machine', 'description') + display_attrs = ('virtual_machine', 'size', 'description') diff --git a/netbox/vpn/search.py b/netbox/vpn/search.py index 303653511..066bc68bb 100644 --- a/netbox/vpn/search.py +++ b/netbox/vpn/search.py @@ -11,7 +11,7 @@ class TunnelIndex(SearchIndex): ('description', 500), ('comments', 5000), ) - display_attrs = ('status', 'encapsulation', 'tenant', 'description') + display_attrs = ('group', 'status', 'encapsulation', 'tenant', 'tunnel_id', 'description') @register_search From 3f4a65cc5cd315a4222dde83a702e77794e0e854 Mon Sep 17 00:00:00 2001 From: Azmodeszer <101867524+Azmodeszer@users.noreply.github.com> Date: Thu, 21 Dec 2023 17:17:18 +0100 Subject: [PATCH 192/271] added ! to safe characters --- netbox/extras/models/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 90e8027b4..74110cf22 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -315,7 +315,7 @@ class CustomLink(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): text = clean_html(text, allowed_schemes) # Sanitize link - link = urllib.parse.quote(link, safe='/:?&=%+[]@#,;') + link = urllib.parse.quote(link, safe='/:?&=%+[]@#,;!') # Verify link scheme is allowed result = urllib.parse.urlparse(link) From c1cf037eafa6be55c729938188a370e5953e725a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markku=20Leini=C3=B6?= Date: Thu, 21 Dec 2023 22:13:40 +0200 Subject: [PATCH 193/271] Print NetBox version in upgrade.sh (#14547) --- upgrade.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/upgrade.sh b/upgrade.sh index cac046a9f..27f3e3d46 100755 --- a/upgrade.sh +++ b/upgrade.sh @@ -7,6 +7,10 @@ # Python 3.8 or later. cd "$(dirname "$0")" + +NETBOX_VERSION="$(grep ^VERSION netbox/netbox/settings.py | cut -d\' -f2)" +echo "You are installing (or upgrading to) NetBox version ${NETBOX_VERSION}" + VIRTUALENV="$(pwd -P)/venv" PYTHON="${PYTHON:-python3}" From 8dfec7e2b29d8c6ff8a1a1a61becf69a8f888a00 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Thu, 21 Dec 2023 14:40:57 -0600 Subject: [PATCH 194/271] Closes #14538 - Add available_at_site filter (#14541) * Closes #14538 - Add available_at_site filter * Add tests * Fix tests --- netbox/ipam/filtersets.py | 8 ++++++++ netbox/ipam/querysets.py | 29 ++++++++++++++++++++++++++++ netbox/ipam/tests/test_filtersets.py | 13 +++++++++++-- 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index ba944e3ad..8a65defff 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -950,6 +950,10 @@ class VLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet): choices=VLANStatusChoices, null_value=None ) + available_at_site = django_filters.ModelChoiceFilter( + queryset=Site.objects.all(), + method='get_for_site' + ) available_on_device = django_filters.ModelChoiceFilter( queryset=Device.objects.all(), method='get_for_device' @@ -984,6 +988,10 @@ class VLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet): pass return queryset.filter(qs_filter) + @extend_schema_field(OpenApiTypes.STR) + def get_for_site(self, queryset, name, value): + return queryset.get_for_site(value) + @extend_schema_field(OpenApiTypes.STR) def get_for_device(self, queryset, name, value): return queryset.get_for_device(value) diff --git a/netbox/ipam/querysets.py b/netbox/ipam/querysets.py index 39da0c3a2..2ff8a8b6e 100644 --- a/netbox/ipam/querysets.py +++ b/netbox/ipam/querysets.py @@ -69,6 +69,35 @@ class VLANGroupQuerySet(RestrictedQuerySet): class VLANQuerySet(RestrictedQuerySet): + def get_for_site(self, site): + """ + Return all VLANs in the specified site + """ + from .models import VLANGroup + q = Q() + q |= Q( + scope_type=ContentType.objects.get_by_natural_key('dcim', 'site'), + scope_id=site.pk + ) + + if site.region: + q |= Q( + scope_type=ContentType.objects.get_by_natural_key('dcim', 'region'), + scope_id__in=site.region.get_ancestors(include_self=True) + ) + if site.group: + q |= Q( + scope_type=ContentType.objects.get_by_natural_key('dcim', 'sitegroup'), + scope_id__in=site.group.get_ancestors(include_self=True) + ) + + return self.filter( + Q(group__in=VLANGroup.objects.filter(q)) | + Q(site=site) | + Q(group__scope_id__isnull=True, site__isnull=True) | # Global group VLANs + Q(group__isnull=True, site__isnull=True) # Global VLANs + ) + def get_for_device(self, device): """ Return all VLANs available to the specified Device. diff --git a/netbox/ipam/tests/test_filtersets.py b/netbox/ipam/tests/test_filtersets.py index 952376056..8d0b0113a 100644 --- a/netbox/ipam/tests/test_filtersets.py +++ b/netbox/ipam/tests/test_filtersets.py @@ -1359,6 +1359,7 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTests): VLANGroup(name='VLAN Group 1', slug='vlan-group-1'), VLANGroup(name='VLAN Group 2', slug='vlan-group-2'), VLANGroup(name='VLAN Group 3', slug='vlan-group-3'), + VLANGroup(name='VLAN Group 4', slug='vlan-group-4'), ) VLANGroup.objects.bulk_create(groups) @@ -1415,6 +1416,9 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTests): VLAN(vid=301, name='VLAN 301', site=sites[5], group=groups[23], role=roles[2], tenant=tenants[2], status=VLANStatusChoices.STATUS_RESERVED), VLAN(vid=302, name='VLAN 302', site=sites[5], group=groups[23], role=roles[2], tenant=tenants[2], status=VLANStatusChoices.STATUS_RESERVED), + # Create one globally available VLAN on a VLAN group + VLAN(vid=500, name='VLAN Group 1', group=groups[24]), + # Create one globally available VLAN VLAN(vid=1000, name='Global VLAN'), ) @@ -1488,12 +1492,17 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTests): def test_available_on_device(self): device_id = Device.objects.first().pk params = {'available_on_device': device_id} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) # 5 scoped + 1 global + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 7) # 5 scoped + 1 global group + 1 global def test_available_on_virtualmachine(self): vm_id = VirtualMachine.objects.first().pk params = {'available_on_virtualmachine': vm_id} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) # 5 scoped + 1 global + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 7) # 5 scoped + 1 global group + 1 global + + def test_available_at_site(self): + site_id = Site.objects.first().pk + params = {'available_at_site': site_id} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5) # 4 scoped + 1 global group + 1 global class ServiceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): From f0b9008529a5f014e718b2b8dd1e9cc8f6672b47 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 21 Dec 2023 15:50:15 -0500 Subject: [PATCH 195/271] Fixes #14575: Fix display of the tags column under VDC table --- netbox/dcim/tables/devices.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index b72c37daa..f786ae0d9 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -1078,7 +1078,7 @@ class VirtualDeviceContextTable(TenancyColumnsMixin, NetBoxTable): comments = columns.MarkdownColumn() tags = columns.TagColumn( - url_name='dcim:vdc_list' + url_name='dcim:virtualdevicecontext_list' ) class Meta(NetBoxTable.Meta): From e5c565cbf4740b9f48133ff7dd4a102ef0cf5181 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 21 Dec 2023 16:26:20 -0500 Subject: [PATCH 196/271] Closes #14119: Remove redundant check for to_objectchange() --- netbox/extras/signals.py | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index d6550309f..b5a55ccfa 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -62,21 +62,20 @@ def handle_changed_object(sender, instance, **kwargs): else: return - # Record an ObjectChange if applicable - if hasattr(instance, 'to_objectchange'): - if m2m_changed: - ObjectChange.objects.filter( - changed_object_type=ContentType.objects.get_for_model(instance), - changed_object_id=instance.pk, - request_id=request.id - ).update( - postchange_data=instance.to_objectchange(action).postchange_data - ) - else: - objectchange = instance.to_objectchange(action) - objectchange.user = request.user - objectchange.request_id = request.id - objectchange.save() + # Record an ObjectChange + if m2m_changed: + ObjectChange.objects.filter( + changed_object_type=ContentType.objects.get_for_model(instance), + changed_object_id=instance.pk, + request_id=request.id + ).update( + postchange_data=instance.to_objectchange(action).postchange_data + ) + else: + objectchange = instance.to_objectchange(action) + objectchange.user = request.user + objectchange.request_id = request.id + objectchange.save() # If this is an M2M change, update the previously queued webhook (from post_save) queue = webhooks_queue.get() From 169207058f8db4b297fabaedf0a476b7049f7e58 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Thu, 21 Dec 2023 14:33:22 -0600 Subject: [PATCH 197/271] Update search to add note --- docs/features/search.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/features/search.md b/docs/features/search.md index 07394af97..92422cad9 100644 --- a/docs/features/search.md +++ b/docs/features/search.md @@ -8,6 +8,9 @@ When entering a search query, the user can choose a specific lookup type: exact Custom fields defined by NetBox administrators are also included in search results if configured with a search weight. Additionally, NetBox plugins can register their own custom models for inclusion alongside core models. +!!! note + NetBox does not index any static choice field's (including custom fields of type "Selection" or "Multiple selection"). + ## Saved Filters Each type of object in NetBox is accompanied by an extensive set of filters, each tied to a specific attribute, which enable the creation of complex queries. Often you'll find that certain queries are used routinely to apply some set of prescribed conditions to a query. Once a set of filters has been applied, NetBox offers the option to save it for future use. From c289dda649b04c9078edbfdfc33e7fa8ffb8b2a6 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 21 Dec 2023 16:36:24 -0500 Subject: [PATCH 198/271] Changelog for #14507, #14538, #14549, #14560, #14575 --- docs/release-notes/version-3.6.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index fc2328897..44478b899 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -2,6 +2,17 @@ ## v3.6.8 (FUTURE) +### Enhancements + +* [#14507](https://github.com/netbox-community/netbox/issues/14507) - Print new NetBox version when running upgrade script +* [#14538](https://github.com/netbox-community/netbox/issues/14538) - Add the `available_at_site` filter for VLANs + +### Bug Fixes + +* [#14549](https://github.com/netbox-community/netbox/issues/14549) - Fix association of job results when executing scripts via `runscript` management command +* [#14560](https://github.com/netbox-community/netbox/issues/14560) - Do not escape exclamation marks in custom link URLs +* [#14575](https://github.com/netbox-community/netbox/issues/14575) - Fix display of the tags column under VDC table + --- ## v3.6.7 (2023-12-15) From 0d08205ab13c9eb9fb18ba8546764ce7af26f9fc Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 21 Dec 2023 16:20:13 -0500 Subject: [PATCH 199/271] Fixes #14532: Device/VM change record should accurately reflect when primary/OOB IP is deleted --- netbox/ipam/signals.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/netbox/ipam/signals.py b/netbox/ipam/signals.py index 2a985c294..3b36b561f 100644 --- a/netbox/ipam/signals.py +++ b/netbox/ipam/signals.py @@ -56,8 +56,12 @@ def clear_primary_ip(instance, **kwargs): """ field_name = f'primary_ip{instance.family}' if device := Device.objects.filter(**{field_name: instance}).first(): + device.snapshot() + setattr(device, field_name, None) device.save() if virtualmachine := VirtualMachine.objects.filter(**{field_name: instance}).first(): + virtualmachine.snapshot() + setattr(virtualmachine, field_name, None) virtualmachine.save() @@ -67,4 +71,6 @@ def clear_oob_ip(instance, **kwargs): When an IPAddress is deleted, trigger save() on any Devices for which it was a OOB IP. """ if device := Device.objects.filter(oob_ip=instance).first(): + device.snapshot() + device.oob_ip = None device.save() From 00807d1e52987a0fb63102329e17388d3b0807c4 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 22 Dec 2023 09:54:08 -0500 Subject: [PATCH 200/271] Fixes #14550: Fix changing event rule action type from webhook to script (#14571) * Fixes #14550: Fix changing event rule action type from webhook to script * Remove action_parameters from form; set on instance under save() --- netbox/extras/forms/model_forms.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 336c60fef..346225c8a 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -269,8 +269,7 @@ class EventRuleForm(NetBoxModelForm): (_('Events'), ('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end')), (_('Conditions'), ('conditions',)), (_('Action'), ( - 'action_type', 'action_choice', 'action_parameters', 'action_object_type', 'action_object_id', - 'action_data', + 'action_type', 'action_choice', 'action_object_type', 'action_object_id', 'action_data', )), ) @@ -279,7 +278,7 @@ class EventRuleForm(NetBoxModelForm): fields = ( 'content_types', 'name', 'description', 'type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end', 'enabled', 'conditions', 'action_type', 'action_object_type', 'action_object_id', - 'action_parameters', 'action_data', 'comments', 'tags' + 'action_data', 'comments', 'tags' ) labels = { 'type_create': _('Creations'), @@ -293,7 +292,6 @@ class EventRuleForm(NetBoxModelForm): 'action_type': HTMXSelect(), 'action_object_type': forms.HiddenInput, 'action_object_id': forms.HiddenInput, - 'action_parameters': forms.HiddenInput, } def init_script_choice(self): @@ -307,16 +305,16 @@ class EventRuleForm(NetBoxModelForm): choices.append((str(module), scripts)) self.fields['action_choice'].choices = choices - if self.instance.pk: + if self.instance.action_type == EventRuleActionChoices.SCRIPT and self.instance.action_parameters: scriptmodule_id = self.instance.action_object_id script_name = self.instance.action_parameters.get('script_name') self.fields['action_choice'].initial = f'{scriptmodule_id}:{script_name}' - print(self.fields['action_choice'].initial) def init_webhook_choice(self): initial = None - if self.fields['action_object_type'] and get_field_value(self, 'action_object_id'): - initial = Webhook.objects.get(pk=get_field_value(self, 'action_object_id')) + if self.instance.action_type == EventRuleActionChoices.WEBHOOK: + webhook_id = get_field_value(self, 'action_object_id') + initial = Webhook.objects.get(pk=webhook_id) if webhook_id else None self.fields['action_choice'] = DynamicModelChoiceField( label=_('Webhook'), queryset=Webhook.objects.all(), @@ -353,12 +351,21 @@ class EventRuleForm(NetBoxModelForm): ) module_id, script_name = action_choice.split(":", maxsplit=1) self.cleaned_data['action_object_id'] = module_id - self.cleaned_data['action_parameters'] = { - 'script_name': script_name, - } return self.cleaned_data + def save(self, *args, **kwargs): + # Set action_parameters on the instance + if self.cleaned_data['action_type'] == EventRuleActionChoices.SCRIPT: + module_id, script_name = self.cleaned_data.get('action_choice').split(":", maxsplit=1) + self.instance.action_parameters = { + 'script_name': script_name, + } + else: + self.instance.action_parameters = None + + return super().save(*args, **kwargs) + class TagForm(BootstrapMixin, forms.ModelForm): slug = SlugField() From 99467e8f66f29338f8c46b4113b42ddcb4c34718 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 22 Dec 2023 10:01:05 -0500 Subject: [PATCH 201/271] Fixes #12731: Support custom validation for many-to-many fields (#14516) * WIP * Enforce custom validators during bulk edit * Add bulk edit M2M validation test * Clean up tests * Add custom validation test for bulk import * Misc cleanup --- netbox/extras/tests/test_custom_validation.py | 265 ++++++++++++++++++ netbox/extras/validators.py | 26 +- netbox/netbox/api/serializers/base.py | 13 +- netbox/netbox/forms/base.py | 11 + netbox/netbox/views/generic/bulk_views.py | 8 + 5 files changed, 314 insertions(+), 9 deletions(-) create mode 100644 netbox/extras/tests/test_custom_validation.py diff --git a/netbox/extras/tests/test_custom_validation.py b/netbox/extras/tests/test_custom_validation.py new file mode 100644 index 000000000..e375b49f5 --- /dev/null +++ b/netbox/extras/tests/test_custom_validation.py @@ -0,0 +1,265 @@ +from django.test import TestCase +from django.test import override_settings + +from circuits.api.serializers import ProviderSerializer +from circuits.forms import ProviderForm +from circuits.models import Provider +from ipam.models import ASN, RIR +from utilities.choices import CSVDelimiterChoices, ImportFormatChoices +from utilities.testing import APITestCase, ModelViewTestCase, create_tags, post_data + + +class ModelFormCustomValidationTest(TestCase): + + @override_settings(CUSTOM_VALIDATORS={ + 'circuits.provider': [ + {'tags': {'required': True}} + ] + }) + def test_tags_validation(self): + """ + Check that custom validation rules work for tag assignment. + """ + data = { + 'name': 'Provider 1', + 'slug': 'provider-1', + } + form = ProviderForm(data) + self.assertFalse(form.is_valid()) + + tags = create_tags('Tag1', 'Tag2', 'Tag3') + data['tags'] = [tag.pk for tag in tags] + form = ProviderForm(data) + self.assertTrue(form.is_valid()) + + @override_settings(CUSTOM_VALIDATORS={ + 'circuits.provider': [ + {'asns': {'required': True}} + ] + }) + def test_m2m_validation(self): + """ + Check that custom validation rules work for many-to-many fields. + """ + data = { + 'name': 'Provider 1', + 'slug': 'provider-1', + } + form = ProviderForm(data) + self.assertFalse(form.is_valid()) + + rir = RIR.objects.create(name='RIR 1', slug='rir-1') + asns = ASN.objects.bulk_create(( + ASN(rir=rir, asn=65001), + ASN(rir=rir, asn=65002), + ASN(rir=rir, asn=65003), + )) + data['asns'] = [asn.pk for asn in asns] + form = ProviderForm(data) + self.assertTrue(form.is_valid()) + + +class BulkEditCustomValidationTest(ModelViewTestCase): + model = Provider + + @classmethod + def setUpTestData(cls): + rir = RIR.objects.create(name='RIR 1', slug='rir-1') + asns = ASN.objects.bulk_create(( + ASN(rir=rir, asn=65001), + ASN(rir=rir, asn=65002), + ASN(rir=rir, asn=65003), + )) + + providers = ( + Provider(name='Provider 1', slug='provider-1'), + Provider(name='Provider 2', slug='provider-2'), + Provider(name='Provider 3', slug='provider-3'), + ) + Provider.objects.bulk_create(providers) + for provider in providers: + provider.asns.set(asns) + + @override_settings(CUSTOM_VALIDATORS={ + 'circuits.provider': [ + {'asns': {'required': True}} + ] + }) + def test_bulk_edit_without_m2m(self): + """ + Check that custom validation rules do not interfere with bulk editing. + """ + data = { + 'pk': list(Provider.objects.values_list('pk', flat=True)), + '_apply': '', + 'description': 'New description', + } + self.add_permissions( + 'circuits.view_provider', + 'circuits.change_provider', + ) + + # Bulk edit the description without changing ASN assignments + request = { + 'path': self._get_url('bulk_edit'), + 'data': post_data(data), + } + response = self.client.post(**request) + self.assertHttpStatus(response, 302) + self.assertEqual( + Provider.objects.filter(description=data['description']).count(), + len(data['pk']) + ) + + @override_settings(CUSTOM_VALIDATORS={ + 'circuits.provider': [ + {'asns': {'required': True}} + ] + }) + def test_bulk_edit_m2m(self): + """ + Test that custom validation rules are enforced during bulk editing. + """ + data = { + 'pk': list(Provider.objects.values_list('pk', flat=True)), + '_apply': '', + 'description': 'New description', + } + self.add_permissions( + 'circuits.view_provider', + 'circuits.change_provider', + 'ipam.view_asn', + ) + + # Change the ASN assignments + asn = ASN.objects.first() + data['asns'] = [asn.pk] + request = { + 'path': self._get_url('bulk_edit'), + 'data': post_data(data), + } + response = self.client.post(**request) + self.assertHttpStatus(response, 302) + for provider in Provider.objects.all(): + self.assertEqual(len(provider.asns.all()), 1) + + # Attempt to remove the ASN assignments + data.pop('asns') + data['_nullify'] = 'asns' + request = { + 'path': self._get_url('bulk_edit'), + 'data': post_data(data), + } + response = self.client.post(**request) + self.assertHttpStatus(response, 200) + for provider in Provider.objects.all(): + self.assertTrue(provider.asns.exists()) + + +class BulkImportCustomValidationTest(ModelViewTestCase): + model = Provider + + @classmethod + def setUpTestData(cls): + create_tags('Tag1', 'Tag2', 'Tag3') + + @override_settings(CUSTOM_VALIDATORS={ + 'circuits.provider': [ + {'tags': {'required': True}} + ] + }) + def test_bulk_import_invalid(self): + """ + Test that custom validation rules are enforced during bulk import. + """ + csv_data = ( + "name,slug", + "Provider 1,provider-1", + "Provider 2,provider-2", + "Provider 3,provider-3", + ) + data = { + 'data': '\n'.join(csv_data), + 'format': ImportFormatChoices.CSV, + 'csv_delimiter': CSVDelimiterChoices.COMMA, + } + self.add_permissions( + 'circuits.view_provider', + 'circuits.add_provider', + 'extras.view_tag', + ) + + # Attempt to import providers without tags + request = { + 'path': self._get_url('import'), + 'data': post_data(data), + } + response = self.client.post(**request) + self.assertHttpStatus(response, 200) + self.assertFalse(Provider.objects.exists()) + + # Import providers successfully with tag assignments + csv_data = ( + "name,slug,tags", + "Provider 1,provider-1,tag1", + "Provider 2,provider-2,tag2", + "Provider 3,provider-3,tag3", + ) + data['data'] = '\n'.join(csv_data) + request = { + 'path': self._get_url('import'), + 'data': post_data(data), + } + response = self.client.post(**request) + self.assertHttpStatus(response, 302) + self.assertTrue(Provider.objects.exists()) + + +class APISerializerCustomValidationTest(APITestCase): + + @override_settings(CUSTOM_VALIDATORS={ + 'circuits.provider': [ + {'tags': {'required': True}} + ] + }) + def test_tags_validation(self): + """ + Check that custom validation rules work for tag assignment. + """ + data = { + 'name': 'Provider 1', + 'slug': 'provider-1', + } + serializer = ProviderSerializer(data=data) + self.assertFalse(serializer.is_valid()) + + tags = create_tags('Tag1', 'Tag2', 'Tag3') + data['tags'] = [tag.pk for tag in tags] + serializer = ProviderSerializer(data=data) + self.assertTrue(serializer.is_valid()) + + @override_settings(CUSTOM_VALIDATORS={ + 'circuits.provider': [ + {'asns': {'required': True}} + ] + }) + def test_m2m_validation(self): + """ + Check that custom validation rules work for many-to-many fields. + """ + data = { + 'name': 'Provider 1', + 'slug': 'provider-1', + } + serializer = ProviderSerializer(data=data) + self.assertFalse(serializer.is_valid()) + + rir = RIR.objects.create(name='RIR 1', slug='rir-1') + asns = ASN.objects.bulk_create(( + ASN(rir=rir, asn=65001), + ASN(rir=rir, asn=65002), + ASN(rir=rir, asn=65003), + )) + data['asns'] = [asn.pk for asn in asns] + serializer = ProviderSerializer(data=data) + self.assertTrue(serializer.is_valid()) diff --git a/netbox/extras/validators.py b/netbox/extras/validators.py index 686c9b032..366d3a426 100644 --- a/netbox/extras/validators.py +++ b/netbox/extras/validators.py @@ -1,5 +1,6 @@ -from django.core.exceptions import ValidationError from django.core import validators +from django.core.exceptions import ValidationError +from django.utils.translation import gettext_lazy as _ # NOTE: As this module may be imported by configuration.py, we cannot import # anything from NetBox itself. @@ -66,8 +67,7 @@ class CustomValidator: def __call__(self, instance): # Validate instance attributes per validation rules for attr_name, rules in self.validation_rules.items(): - assert hasattr(instance, attr_name), f"Invalid attribute '{attr_name}' for {instance.__class__.__name__}" - attr = getattr(instance, attr_name) + attr = self._getattr(instance, attr_name) for descriptor, value in rules.items(): validator = self.get_validator(descriptor, value) try: @@ -79,6 +79,26 @@ class CustomValidator: # Execute custom validation logic (if any) self.validate(instance) + @staticmethod + def _getattr(instance, name): + # Attempt to resolve many-to-many fields to their stored values + m2m_fields = [f.name for f in instance._meta.local_many_to_many] + if name in m2m_fields: + if name in getattr(instance, '_m2m_values', []): + return instance._m2m_values[name] + if instance.pk: + return list(getattr(instance, name).all()) + return [] + + # Raise a ValidationError for unknown attributes + if not hasattr(instance, name): + raise ValidationError(_('Invalid attribute "{name}" for {model}').format( + name=name, + model=instance.__class__.__name__ + )) + + return getattr(instance, name) + def get_validator(self, descriptor, value): """ Instantiate and return the appropriate validator based on the descriptor given. For diff --git a/netbox/netbox/api/serializers/base.py b/netbox/netbox/api/serializers/base.py index 5ee74bf8c..d513c8000 100644 --- a/netbox/netbox/api/serializers/base.py +++ b/netbox/netbox/api/serializers/base.py @@ -23,16 +23,16 @@ class ValidatedModelSerializer(BaseModelSerializer): validation. (DRF does not do this by default; see https://github.com/encode/django-rest-framework/issues/3144) """ def validate(self, data): - - # Remove custom fields data and tags (if any) prior to model validation attrs = data.copy() + + # Remove custom field data (if any) prior to model validation attrs.pop('custom_fields', None) - attrs.pop('tags', None) # Skip ManyToManyFields - for field in self.Meta.model._meta.get_fields(): - if isinstance(field, ManyToManyField): - attrs.pop(field.name, None) + m2m_values = {} + for field in self.Meta.model._meta.local_many_to_many: + if field.name in attrs: + m2m_values[field.name] = attrs.pop(field.name) # Run clean() on an instance of the model if self.instance is None: @@ -41,6 +41,7 @@ class ValidatedModelSerializer(BaseModelSerializer): instance = self.instance for k, v in attrs.items(): setattr(instance, k, v) + instance._m2m_values = m2m_values instance.full_clean() return data diff --git a/netbox/netbox/forms/base.py b/netbox/netbox/forms/base.py index 51e664a39..070a5d26c 100644 --- a/netbox/netbox/forms/base.py +++ b/netbox/netbox/forms/base.py @@ -57,6 +57,17 @@ class NetBoxModelForm(BootstrapMixin, CheckLastUpdatedMixin, CustomFieldsMixin, return super().clean() + def _post_clean(self): + """ + Override BaseModelForm's _post_clean() to store many-to-many field values on the model instance. + """ + self.instance._m2m_values = {} + for field in self.instance._meta.local_many_to_many: + if field.name in self.cleaned_data: + self.instance._m2m_values[field.name] = list(self.cleaned_data[field.name]) + + return super()._post_clean() + class NetBoxModelImportForm(CSVModelForm, NetBoxModelForm): """ diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index c5a08c80a..69bb85c41 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -557,6 +557,14 @@ class BulkEditView(GetReturnURLMixin, BaseMultiObjectView): elif name in form.changed_data: obj.custom_field_data[cf_name] = customfield.serialize(form.cleaned_data[name]) + # Store M2M values for validation + obj._m2m_values = {} + for field in obj._meta.local_many_to_many: + if value := form.cleaned_data.get(field.name): + obj._m2m_values[field.name] = list(value) + elif field.name in nullified_fields: + obj._m2m_values[field.name] = [] + obj.full_clean() obj.save() updated_objects.append(obj) From 43909ee33f44b97600dcceb2c09754fe7793e39c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 22 Dec 2023 10:32:06 -0500 Subject: [PATCH 202/271] Fixes #13649: Permit zero-length cables --- .../migrations/0182_zero_length_cable_fix.py | 22 +++++++++++++++++++ netbox/dcim/models/cables.py | 2 +- netbox/dcim/svg/cables.py | 4 ++-- netbox/templates/dcim/cable.html | 2 +- 4 files changed, 26 insertions(+), 4 deletions(-) create mode 100644 netbox/dcim/migrations/0182_zero_length_cable_fix.py diff --git a/netbox/dcim/migrations/0182_zero_length_cable_fix.py b/netbox/dcim/migrations/0182_zero_length_cable_fix.py new file mode 100644 index 000000000..080e00717 --- /dev/null +++ b/netbox/dcim/migrations/0182_zero_length_cable_fix.py @@ -0,0 +1,22 @@ +from django.db import migrations + + +def update_cable_lengths(apps, schema_editor): + Cable = apps.get_model('dcim', 'Cable') + + # Set the absolute length for any zero-length Cables + Cable.objects.filter(length=0).update(_abs_length=0) + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0181_rename_device_role_device_role'), + ] + + operations = [ + migrations.RunPython( + code=update_cable_lengths, + reverse_code=migrations.RunPython.noop + ), + ] diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index f240659dd..86b4b9320 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -201,7 +201,7 @@ class Cable(PrimaryModel): _created = self.pk is None # Store the given length (if any) in meters for use in database ordering - if self.length and self.length_unit: + if self.length is not None and self.length_unit: self._abs_length = to_meters(self.length, self.length_unit) else: self._abs_length = None diff --git a/netbox/dcim/svg/cables.py b/netbox/dcim/svg/cables.py index acc4fcad9..85b60ead1 100644 --- a/netbox/dcim/svg/cables.py +++ b/netbox/dcim/svg/cables.py @@ -274,7 +274,7 @@ class CableTraceSVG: if cable.type: # Include the cable type in the tooltip description.append(cable.get_type_display()) - if cable.length and cable.length_unit: + if cable.length is not None and cable.length_unit: # Include the cable length in the tooltip description.append(f'{cable.length} {cable.get_length_unit_display()}') else: @@ -285,7 +285,7 @@ class CableTraceSVG: description = [] if cable.type: labels.append(cable.get_type_display()) - if cable.length and cable.length_unit: + if cable.length is not None and cable.length_unit: # Include the cable length in the tooltip labels.append(f'{cable.length} {cable.get_length_unit_display()}') diff --git a/netbox/templates/dcim/cable.html b/netbox/templates/dcim/cable.html index 535b96977..caa1a9fe0 100644 --- a/netbox/templates/dcim/cable.html +++ b/netbox/templates/dcim/cable.html @@ -50,7 +50,7 @@ {% trans "Length" %} - {% if object.length %} + {% if object.length is not None %} {{ object.length|floatformat }} {{ object.get_length_unit_display }} {% else %} {{ ''|placeholder }} From 031b7540b39e12c5f2dfaa2a8eaa2cef18b8bc74 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Dec 2023 13:35:03 -0500 Subject: [PATCH 203/271] Fixes #13741: Update docs to correctly reflect inventory item uniqueness requirements --- docs/models/dcim/inventoryitem.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/models/dcim/inventoryitem.md b/docs/models/dcim/inventoryitem.md index f61586eda..b9029f75c 100644 --- a/docs/models/dcim/inventoryitem.md +++ b/docs/models/dcim/inventoryitem.md @@ -19,7 +19,7 @@ The parent inventory item to which this item is assigned (optional). ### Name -The inventory item's name. Must be unique to the parent device. +The inventory item's name. If the inventory item is assigned to a parent item, its name must be unique among its siblings (all items belonging to the same parent item). ### Label From 634681a72e9cdb1fefcf5779eceb8ec95ae6c13f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Dec 2023 13:15:23 -0500 Subject: [PATCH 204/271] Fixes #13606: Fix filtering by null for multiselect custom fields --- netbox/extras/models/customfields.py | 4 +--- netbox/extras/tests/test_customfields.py | 13 +++++++------ netbox/utilities/filters.py | 16 ++++++++++++++++ 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index f70812bc0..ff887ddeb 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -10,7 +10,6 @@ from django.contrib.postgres.fields import ArrayField from django.core.validators import RegexValidator, ValidationError from django.db import models from django.urls import reverse -from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ @@ -571,8 +570,7 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): # Multiselect elif self.type == CustomFieldTypeChoices.TYPE_MULTISELECT: - filter_class = filters.MultiValueCharFilter - kwargs['lookup_expr'] = 'has_key' + filter_class = filters.MultiValueArrayFilter # Object elif self.type == CustomFieldTypeChoices.TYPE_OBJECT: diff --git a/netbox/extras/tests/test_customfields.py b/netbox/extras/tests/test_customfields.py index 7ac6b2035..574452a81 100644 --- a/netbox/extras/tests/test_customfields.py +++ b/netbox/extras/tests/test_customfields.py @@ -1329,7 +1329,7 @@ class CustomFieldModelFilterTest(TestCase): choice_set = CustomFieldChoiceSet.objects.create( name='Custom Field Choice Set 1', - extra_choices=(('a', 'A'), ('b', 'B'), ('c', 'C'), ('x', 'X')) + extra_choices=(('a', 'A'), ('b', 'B'), ('c', 'C')) ) # Integer filtering @@ -1435,7 +1435,7 @@ class CustomFieldModelFilterTest(TestCase): 'cf7': 'http://a.example.com', 'cf8': 'http://a.example.com', 'cf9': 'A', - 'cf10': ['A', 'X'], + 'cf10': ['A', 'B'], 'cf11': manufacturers[0].pk, 'cf12': [manufacturers[0].pk, manufacturers[3].pk], }), @@ -1449,7 +1449,7 @@ class CustomFieldModelFilterTest(TestCase): 'cf7': 'http://b.example.com', 'cf8': 'http://b.example.com', 'cf9': 'B', - 'cf10': ['B', 'X'], + 'cf10': ['B', 'C'], 'cf11': manufacturers[1].pk, 'cf12': [manufacturers[1].pk, manufacturers[3].pk], }), @@ -1463,7 +1463,7 @@ class CustomFieldModelFilterTest(TestCase): 'cf7': 'http://c.example.com', 'cf8': 'http://c.example.com', 'cf9': 'C', - 'cf10': ['C', 'X'], + 'cf10': None, 'cf11': manufacturers[2].pk, 'cf12': [manufacturers[2].pk, manufacturers[3].pk], }), @@ -1531,8 +1531,9 @@ class CustomFieldModelFilterTest(TestCase): self.assertEqual(self.filterset({'cf_cf9': ['A', 'B']}, self.queryset).qs.count(), 2) def test_filter_multiselect(self): - self.assertEqual(self.filterset({'cf_cf10': ['A', 'B']}, self.queryset).qs.count(), 2) - self.assertEqual(self.filterset({'cf_cf10': ['X']}, self.queryset).qs.count(), 3) + self.assertEqual(self.filterset({'cf_cf10': ['A']}, self.queryset).qs.count(), 1) + self.assertEqual(self.filterset({'cf_cf10': ['A', 'C']}, self.queryset).qs.count(), 2) + self.assertEqual(self.filterset({'cf_cf10': ['null']}, self.queryset).qs.count(), 1) def test_filter_object(self): manufacturer_ids = Manufacturer.objects.values_list('id', flat=True) diff --git a/netbox/utilities/filters.py b/netbox/utilities/filters.py index 1bf17beae..72c9124a1 100644 --- a/netbox/utilities/filters.py +++ b/netbox/utilities/filters.py @@ -9,6 +9,7 @@ from drf_spectacular.types import OpenApiTypes __all__ = ( 'ContentTypeFilter', 'MACAddressFilter', + 'MultiValueArrayFilter', 'MultiValueCharFilter', 'MultiValueDateFilter', 'MultiValueDateTimeFilter', @@ -85,6 +86,21 @@ class MultiValueTimeFilter(django_filters.MultipleChoiceFilter): field_class = multivalue_field_factory(forms.TimeField) +@extend_schema_field(OpenApiTypes.STR) +class MultiValueArrayFilter(django_filters.MultipleChoiceFilter): + field_class = multivalue_field_factory(forms.CharField) + + def __init__(self, *args, lookup_expr='contains', **kwargs): + # Set default lookup_expr to 'contains' + super().__init__(*args, lookup_expr=lookup_expr, **kwargs) + + def get_filter_predicate(self, v): + # If filtering for null values, ignore lookup_expr + if v is None: + return {self.field_name: None} + return super().get_filter_predicate(v) + + class MACAddressFilter(django_filters.CharFilter): pass From a67236fc3c2d6d6dffc606cad720fbeca14d7e19 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Dec 2023 14:29:09 -0500 Subject: [PATCH 205/271] Fixes #13812: Record data source sync failure when run via syncdatasource command --- netbox/core/management/commands/syncdatasource.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/netbox/core/management/commands/syncdatasource.py b/netbox/core/management/commands/syncdatasource.py index 3d73f70ab..aa8137952 100644 --- a/netbox/core/management/commands/syncdatasource.py +++ b/netbox/core/management/commands/syncdatasource.py @@ -1,5 +1,6 @@ from django.core.management.base import BaseCommand, CommandError +from core.choices import DataSourceStatusChoices from core.models import DataSource @@ -33,9 +34,13 @@ class Command(BaseCommand): for i, datasource in enumerate(datasources, start=1): self.stdout.write(f"[{i}] Syncing {datasource}... ", ending='') self.stdout.flush() - datasource.sync() - self.stdout.write(datasource.get_status_display()) - self.stdout.flush() + try: + datasource.sync() + self.stdout.write(datasource.get_status_display()) + self.stdout.flush() + except Exception as e: + DataSource.objects.filter(pk=datasource.pk).update(status=DataSourceStatusChoices.FAILED) + raise e if len(options['name']) > 1: self.stdout.write(f"Finished.") From e6642b5f5b1fc868cef95cb508eb666996872a8e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 27 Dec 2023 09:44:15 -0500 Subject: [PATCH 206/271] Fixes #11816: Detach group/site validation error from group field --- netbox/ipam/models/vlans.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index aa5b36a57..d2365aa37 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -224,11 +224,11 @@ class VLAN(PrimaryModel): # Validate VLAN group (if assigned) if self.group and self.site and self.group.scope != self.site: - raise ValidationError({ - 'group': _( + raise ValidationError( + _( "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to site {site}." ).format(group=self.group, scope=self.group.scope, site=self.site) - }) + ) # Validate group min/max VIDs if self.group and not self.group.min_vid <= self.vid <= self.group.max_vid: From d6c8d1581c665f2a6ae05c338ce3f94747732a30 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 27 Dec 2023 11:49:13 -0500 Subject: [PATCH 207/271] Closes #11039: List parent prefixes under IP range view --- netbox/ipam/views.py | 20 ++++++++++++++++++++ netbox/templates/ipam/iprange.html | 5 +++++ 2 files changed, 25 insertions(+) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 1de53b6d2..5fc4301bb 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -661,6 +661,26 @@ class IPRangeListView(generic.ObjectListView): class IPRangeView(generic.ObjectView): queryset = IPRange.objects.all() + def get_extra_context(self, request, instance): + + # Parent prefixes table + parent_prefixes = Prefix.objects.restrict(request.user, 'view').filter( + Q(prefix__net_contains_or_equals=str(instance.start_address.ip)), + Q(prefix__net_contains_or_equals=str(instance.end_address.ip)), + vrf=instance.vrf + ).prefetch_related( + 'site', 'role', 'tenant', 'vlan', 'role' + ) + parent_prefixes_table = tables.PrefixTable( + list(parent_prefixes), + exclude=('vrf', 'utilization'), + orderable=False + ) + + return { + 'parent_prefixes_table': parent_prefixes_table, + } + @register_model_view(IPRange, 'ipaddresses', path='ip-addresses') class IPRangeIPAddressesView(generic.ObjectChildrenView): diff --git a/netbox/templates/ipam/iprange.html b/netbox/templates/ipam/iprange.html index 3e79e6690..13bfe4902 100644 --- a/netbox/templates/ipam/iprange.html +++ b/netbox/templates/ipam/iprange.html @@ -82,6 +82,11 @@ {% plugin_right_page object %} +
    +
    + {% include 'inc/panel_table.html' with table=parent_prefixes_table heading='Parent Prefixes' %} +
    +
    {% plugin_full_width_page object %} From b955751349383dbd0b36f4308de8e78466f8f2d6 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 27 Dec 2023 13:42:26 -0500 Subject: [PATCH 208/271] Fixes #14517: Ensure reservations tab is always displayed under rack view --- docs/release-notes/version-3.6.md | 1 + netbox/dcim/views.py | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 44478b899..5b666fa86 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -9,6 +9,7 @@ ### Bug Fixes +* [#14517](https://github.com/netbox-community/netbox/issues/14517) - Ensure reservations tab is always displayed under rack view * [#14549](https://github.com/netbox-community/netbox/issues/14549) - Fix association of job results when executing scripts via `runscript` management command * [#14560](https://github.com/netbox-community/netbox/issues/14560) - Do not escape exclamation marks in custom link URLs * [#14575](https://github.com/netbox-community/netbox/issues/14575) - Fix display of the tags column under VDC table diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index c67dfaade..6d549c49d 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -695,8 +695,7 @@ class RackRackReservationsView(generic.ObjectChildrenView): label=_('Reservations'), badge=lambda obj: obj.reservations.count(), permission='dcim.view_rackreservation', - weight=510, - hide_if_empty=True + weight=510 ) def get_children(self, request, parent): From cc0fc03ec3bd64e6333f7973d41fc82c2c9b8ef2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 27 Dec 2023 13:45:06 -0500 Subject: [PATCH 209/271] Changelog for #11039, #11816, #12731, #13606, #13649, #13812, #14532 --- docs/release-notes/version-3.6.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 5b666fa86..1b05c7f9e 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -4,12 +4,19 @@ ### Enhancements +* [#11039](https://github.com/netbox-community/netbox/issues/11039) - List parent prefixes under IP range view * [#14507](https://github.com/netbox-community/netbox/issues/14507) - Print new NetBox version when running upgrade script * [#14538](https://github.com/netbox-community/netbox/issues/14538) - Add the `available_at_site` filter for VLANs ### Bug Fixes +* [#11816](https://github.com/netbox-community/netbox/issues/11816) - Correct display of error message when attempting invalid VLAN site & group assignment +* [#12731](https://github.com/netbox-community/netbox/issues/12731) - Fix custom validation for many-to-many fields +* [#13606](https://github.com/netbox-community/netbox/issues/13606) - Fix filtering custom multi-choice fields by null +* [#13649](https://github.com/netbox-community/netbox/issues/13649) - Correct calculation of absolute lengths for zero-length cables +* [#13812](https://github.com/netbox-community/netbox/issues/13812) - Update status of remote data source when syncing fails via `syncdatasource` management command * [#14517](https://github.com/netbox-community/netbox/issues/14517) - Ensure reservations tab is always displayed under rack view +* [#14532](https://github.com/netbox-community/netbox/issues/14532) - Device/VM change record should accurately reflect when primary/OOB IP is deleted * [#14549](https://github.com/netbox-community/netbox/issues/14549) - Fix association of job results when executing scripts via `runscript` management command * [#14560](https://github.com/netbox-community/netbox/issues/14560) - Do not escape exclamation marks in custom link URLs * [#14575](https://github.com/netbox-community/netbox/issues/14575) - Fix display of the tags column under VDC table From 8a237561ef73c782d8cc269161c09c974b1b5a4d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 27 Dec 2023 13:49:39 -0500 Subject: [PATCH 210/271] Closes #14596: Match against description field when searching for devices --- docs/release-notes/version-3.6.md | 1 + netbox/dcim/filtersets.py | 1 + 2 files changed, 2 insertions(+) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 1b05c7f9e..ce207ddc6 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -7,6 +7,7 @@ * [#11039](https://github.com/netbox-community/netbox/issues/11039) - List parent prefixes under IP range view * [#14507](https://github.com/netbox-community/netbox/issues/14507) - Print new NetBox version when running upgrade script * [#14538](https://github.com/netbox-community/netbox/issues/14538) - Add the `available_at_site` filter for VLANs +* [#14596](https://github.com/netbox-community/netbox/issues/14596) - Match against description field when searching for devices ### Bug Fixes diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index b5bdaf269..9f4359764 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1018,6 +1018,7 @@ class DeviceFilterSet( Q(serial__icontains=value.strip()) | Q(inventoryitems__serial__icontains=value.strip()) | Q(asset_tag__icontains=value.strip()) | + Q(description_icontains=value.strip()) | Q(comments__icontains=value) | Q(primary_ip4__address__startswith=value) | Q(primary_ip6__address__startswith=value) From 113c60a44af7fa6ad61a8034b8bfc7867fb78660 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 27 Dec 2023 14:20:30 -0500 Subject: [PATCH 211/271] Fixes #13909: Ignore empty choices when populating dynamic choice fields from initial data --- netbox/utilities/forms/fields/dynamic.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/utilities/forms/fields/dynamic.py b/netbox/utilities/forms/fields/dynamic.py index 94870451d..00a1f823e 100644 --- a/netbox/utilities/forms/fields/dynamic.py +++ b/netbox/utilities/forms/fields/dynamic.py @@ -43,7 +43,7 @@ class DynamicMultipleChoiceField(forms.MultipleChoiceField): if data is not None: self.choices = [ - choice for choice in self.choices if choice[0] in data + choice for choice in self.choices if choice[0] and choice[0] in data ] return bound_field From 0613e8e95caa1008f9f68818158a44bd5ff8eb34 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 27 Dec 2023 15:13:23 -0500 Subject: [PATCH 212/271] Fixes #14613: Fix display of current configuration parameters --- netbox/core/views.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/netbox/core/views.py b/netbox/core/views.py index e3c1a67aa..0d18371e1 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -1,4 +1,5 @@ from django.contrib import messages +from django.core.cache import cache from django.shortcuts import get_object_or_404, redirect from extras.models import ConfigRevision @@ -153,9 +154,11 @@ class ConfigView(generic.ObjectView): queryset = ConfigRevision.objects.all() def get_object(self, **kwargs): - if config := self.queryset.first(): - return config - # Instantiate a dummy default config if none has been created yet - return ConfigRevision( - data=get_config().defaults - ) + revision_id = cache.get('config_version') + try: + return ConfigRevision.objects.get(pk=revision_id) + except ConfigRevision.DoesNotExist: + # Fall back to using the active config data if no record is found + return ConfigRevision( + data=get_config() + ) From 4eadc8cfe473e599776e3181ba1186884b2d10b8 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 27 Dec 2023 15:28:40 -0500 Subject: [PATCH 213/271] Closes #14240: Increase min/max validation values for custom fields --- .../0105_customfield_min_max_values.py | 23 +++++++++++++++++++ netbox/extras/models/customfields.py | 4 ++-- 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 netbox/extras/migrations/0105_customfield_min_max_values.py diff --git a/netbox/extras/migrations/0105_customfield_min_max_values.py b/netbox/extras/migrations/0105_customfield_min_max_values.py new file mode 100644 index 000000000..bcf3f97bd --- /dev/null +++ b/netbox/extras/migrations/0105_customfield_min_max_values.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.8 on 2023-12-27 20:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0104_stagedchange_remove_change_logging'), + ] + + operations = [ + migrations.AlterField( + model_name='customfield', + name='validation_maximum', + field=models.BigIntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='customfield', + name='validation_minimum', + field=models.BigIntegerField(blank=True, null=True), + ), + ] diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index d667c9a22..e8bc0fa5d 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -156,13 +156,13 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): verbose_name=_('display weight'), help_text=_('Fields with higher weights appear lower in a form.') ) - validation_minimum = models.IntegerField( + validation_minimum = models.BigIntegerField( blank=True, null=True, verbose_name=_('minimum value'), help_text=_('Minimum allowed value (for numeric fields)') ) - validation_maximum = models.IntegerField( + validation_maximum = models.BigIntegerField( blank=True, null=True, verbose_name=_('maximum value'), From 07da3f6d3366652c425b72e398def0a5a5a9412c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 27 Dec 2023 16:00:16 -0500 Subject: [PATCH 214/271] Release v3.6.8 --- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- docs/release-notes/version-3.6.md | 4 +++- netbox/netbox/settings.py | 2 +- requirements.txt | 6 +++--- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 974527bd3..ed29534f6 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -23,7 +23,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v3.6.7 + placeholder: v3.6.8 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 9fb14742a..330f3b2bb 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.6.7 + placeholder: v3.6.8 validations: required: true - type: dropdown diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index ce207ddc6..952319488 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -1,6 +1,6 @@ # NetBox v3.6 -## v3.6.8 (FUTURE) +## v3.6.8 (2023-12-27) ### Enhancements @@ -16,11 +16,13 @@ * [#13606](https://github.com/netbox-community/netbox/issues/13606) - Fix filtering custom multi-choice fields by null * [#13649](https://github.com/netbox-community/netbox/issues/13649) - Correct calculation of absolute lengths for zero-length cables * [#13812](https://github.com/netbox-community/netbox/issues/13812) - Update status of remote data source when syncing fails via `syncdatasource` management command +* [#13909](https://github.com/netbox-community/netbox/issues/13909) - Fix cloning of objects which have a multi-choice custom field * [#14517](https://github.com/netbox-community/netbox/issues/14517) - Ensure reservations tab is always displayed under rack view * [#14532](https://github.com/netbox-community/netbox/issues/14532) - Device/VM change record should accurately reflect when primary/OOB IP is deleted * [#14549](https://github.com/netbox-community/netbox/issues/14549) - Fix association of job results when executing scripts via `runscript` management command * [#14560](https://github.com/netbox-community/netbox/issues/14560) - Do not escape exclamation marks in custom link URLs * [#14575](https://github.com/netbox-community/netbox/issues/14575) - Fix display of the tags column under VDC table +* [#14613](https://github.com/netbox-community/netbox/issues/14613) - Fix display of current configuration parameters in UI --- diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 3fd7f1122..5941ffec5 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -25,7 +25,7 @@ from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW # Environment setup # -VERSION = '3.6.8-dev' +VERSION = '3.6.8' # Hostname HOSTNAME = platform.node() diff --git a/requirements.txt b/requirements.txt index b2771b445..6cc9089ae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,7 @@ django-pglocks==1.0.4 django-prometheus==2.3.1 django-redis==5.4.0 django-rich==1.8.0 -django-rq==2.9.0 +django-rq==2.10.1 django-tables2==2.7.0 django-taggit==4.0.0 django-timezone-field==6.1.0 @@ -21,11 +21,11 @@ graphene-django==3.0.0 gunicorn==21.2.0 Jinja2==3.1.2 Markdown==3.3.7 -mkdocs-material==9.5.2 +mkdocs-material==9.5.3 mkdocstrings[python-legacy]==0.24.0 netaddr==0.9.0 Pillow==10.1.0 -psycopg[binary,pool]==3.1.15 +psycopg[binary,pool]==3.1.16 PyYAML==6.0.1 requests==2.31.0 sentry-sdk==1.39.1 From 11bc460551c4c1a48438961e8b2b7ffb7e192ebe Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 27 Dec 2023 17:22:04 -0500 Subject: [PATCH 215/271] Update release notes --- docs/release-notes/index.md | 2 +- docs/release-notes/version-3.7.md | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index 983570652..f01d3160f 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -10,7 +10,7 @@ Minor releases are published in April, August, and December of each calendar yea This page contains a history of all major and minor releases since NetBox v2.0. For more detail on a specific patch release, please see the release notes page for that specific minor release. -#### [Version 3.7](./version-3.6.md) (December 2023) +#### [Version 3.7](./version-3.7.md) (December 2023) * VPN Tunnels ([#9816](https://github.com/netbox-community/netbox/issues/9816)) * Event Rules ([#14132](https://github.com/netbox-community/netbox/issues/14132)) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 8bb5c1b60..fc06ba16d 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -6,6 +6,8 @@ * [#14432](https://github.com/netbox-community/netbox/issues/14432) - Fix hyperlinks for global search result attributes * [#14472](https://github.com/netbox-community/netbox/issues/14472) - Fix display of hidden custom fields in object edit forms +* [#14499](https://github.com/netbox-community/netbox/issues/14499) - Relax requirements for encryption/auth algorithms on IKE & IPSec proposals +* [#14550](https://github.com/netbox-community/netbox/issues/14550) - Fix changing action type of existing event rule ## v3.7-beta1 (2023-12-05) @@ -40,7 +42,7 @@ A new [`PROTECTION_RULES`](../configuration/data-validation.md#protection_rules) #### Improved Custom Field Visibility Controls ([#13299](https://github.com/netbox-community/netbox/issues/13299)) -The old `ui_visible` field on the custom field model](../models/extras/customfield.md) has been replaced by two new fields, `ui_visible` and `ui_editable`, which control how and whether a custom field is displayed when view and editing an object, respectively. Separating these two functions into discrete fields enables more control over how each custom field is presented to users. The values of these fields will be appropriately set automatically during the upgrade process depending on the value of the original field. +The old `ui_visible` field on [the custom field model](../models/extras/customfield.md) has been replaced by two new fields, `ui_visible` and `ui_editable`, which control how and whether a custom field is displayed when view and editing an object, respectively. Separating these two functions into discrete fields enables more control over how each custom field is presented to users. The values of these fields will be appropriately set automatically during the upgrade process depending on the value of the original field. #### Improved Global Search Results ([#14134](https://github.com/netbox-community/netbox/issues/14134)) @@ -67,9 +69,11 @@ Plugins can now [register their own data backends](../plugins/development/data-b * [#14035](https://github.com/netbox-community/netbox/issues/14035) - Order objects of equivalent weight by value in global search results to improve readability * [#14147](https://github.com/netbox-community/netbox/issues/14147) - Avoid recording empty changelog entries (and introduce `CHANGELOG_SKIP_EMPTY_CHANGES` config parameter) * [#14156](https://github.com/netbox-community/netbox/issues/14156) - Enable custom fields for contact assignments +* [#14240](https://github.com/netbox-community/netbox/issues/14240) - Increase maximum values for custom fields minimum & maximum validators * [#14361](https://github.com/netbox-community/netbox/issues/14361) - Add a `description` field for webhooks * [#14365](https://github.com/netbox-community/netbox/issues/14365) - Introduced `job_start` and `job_end` signals * [#14436](https://github.com/netbox-community/netbox/issues/14436) - Add PostgreSQL indexes for all GenericForeignKey fields +* [#14579](https://github.com/netbox-community/netbox/issues/14579) - Allow users to specify a preferred language for UI translations ### Other Changes @@ -83,6 +87,7 @@ Plugins can now [register their own data backends](../plugins/development/data-b * [#14395](https://github.com/netbox-community/netbox/issues/14395) - Moved `extras.webhooks_worker.process_webhook()` to `extras.webhooks.send_webhook()` (backward compatibility has been retained) * [#14424](https://github.com/netbox-community/netbox/issues/14424) - Remove change logging functionality from StagedChange * [#14458](https://github.com/netbox-community/netbox/issues/14458) - Remove the obsolete `clearcache` management command +* [#14536](https://github.com/netbox-community/netbox/issues/14536) - Enforce uniqueness by default for non-VRF prefixes & IP addresses (`ENFORCE_GLOBAL_UNIQUE` now defaults to true) ### REST API Changes From 359c0cf3a0aec271bc25479238872f20d3d4f9d2 Mon Sep 17 00:00:00 2001 From: MengYX Date: Thu, 28 Dec 2023 15:33:20 +0800 Subject: [PATCH 216/271] Fix typo in `filtersets.py` fix typo which causing exception `Cannot resolve keyword 'description_icontains' into field` --- netbox/dcim/filtersets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 9f4359764..1e837ce0a 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1018,7 +1018,7 @@ class DeviceFilterSet( Q(serial__icontains=value.strip()) | Q(inventoryitems__serial__icontains=value.strip()) | Q(asset_tag__icontains=value.strip()) | - Q(description_icontains=value.strip()) | + Q(description__icontains=value.strip()) | Q(comments__icontains=value) | Q(primary_ip4__address__startswith=value) | Q(primary_ip6__address__startswith=value) From fedcbaf4c883aa7bc9ac51618ed55af30df14209 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 28 Dec 2023 10:06:25 -0500 Subject: [PATCH 217/271] Fixes #14620: Permit setting device type U height to 0 during bulk edit --- netbox/dcim/forms/bulk_edit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index cacf1f72b..9209d8ef4 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -412,7 +412,7 @@ class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): ) u_height = forms.IntegerField( label=_('U height'), - min_value=1, + min_value=0, required=False ) is_full_depth = forms.NullBooleanField( From 45c646dcecdf8eedd9aec08b7fc9df1c694c8d7c Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Thu, 28 Dec 2023 12:28:05 -0600 Subject: [PATCH 218/271] Fixes #14482 - Fix validation error when primary IP is moved (#14514) * Fix validation when primary IP is moved. * Fix views test * Work on excluding assigned_objects * Modify clean() on model and form to properly catch error * Fix test failure * Fix test to check for PK * Remove model_form check --- netbox/ipam/models/ip.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index d176d3bff..5d3fe4a3a 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -864,11 +864,9 @@ class IPAddress(PrimaryModel): is_primary = True if is_primary and (parent != original_parent): - raise ValidationError({ - 'assigned_object': _( - "Cannot reassign IP address while it is designated as the primary IP for the parent object" - ) - }) + raise ValidationError( + _("Cannot reassign IP address while it is designated as the primary IP for the parent object") + ) # Validate IP status selection if self.status == IPAddressStatusChoices.STATUS_SLAAC and self.family != 6: From 3bacee16bd4198531344e281ffc40c57b2d3b189 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 28 Dec 2023 13:20:02 -0500 Subject: [PATCH 219/271] Closes #14631: Ensure description filters are available on all relevant models --- netbox/circuits/filtersets.py | 4 +- netbox/core/filtersets.py | 2 +- netbox/dcim/filtersets.py | 70 +++++++++++++++++++---------- netbox/extras/filtersets.py | 2 +- netbox/ipam/filtersets.py | 9 ++-- netbox/netbox/filtersets.py | 3 +- netbox/tenancy/filtersets.py | 3 +- netbox/virtualization/filtersets.py | 6 ++- 8 files changed, 65 insertions(+), 34 deletions(-) diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index e28238fea..9d0b3f647 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -67,13 +67,14 @@ class ProviderFilterSet(NetBoxModelFilterSet, ContactModelFilterSet): class Meta: model = Provider - fields = ['id', 'name', 'slug'] + fields = ['id', 'name', 'slug', 'description'] def search(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter( Q(name__icontains=value) | + Q(description__icontains=value) | Q(accounts__account__icontains=value) | Q(accounts__name__icontains=value) | Q(comments__icontains=value) @@ -101,6 +102,7 @@ class ProviderAccountFilterSet(NetBoxModelFilterSet): return queryset return queryset.filter( Q(name__icontains=value) | + Q(description__icontains=value) | Q(account__icontains=value) | Q(comments__icontains=value) ).distinct() diff --git a/netbox/core/filtersets.py b/netbox/core/filtersets.py index 62a58086a..25dea9c2c 100644 --- a/netbox/core/filtersets.py +++ b/netbox/core/filtersets.py @@ -26,7 +26,7 @@ class DataSourceFilterSet(NetBoxModelFilterSet): class Meta: model = DataSource - fields = ('id', 'name', 'enabled') + fields = ('id', 'name', 'enabled', 'description') def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 1e837ce0a..07692719f 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -325,7 +325,7 @@ class RackFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSe model = Rack fields = [ 'id', 'name', 'facility_id', 'asset_tag', 'u_height', 'starting_unit', 'desc_units', 'outer_width', - 'outer_depth', 'outer_unit', 'mounting_depth', 'weight', 'max_weight', 'weight_unit' + 'outer_depth', 'outer_unit', 'mounting_depth', 'weight', 'max_weight', 'weight_unit', 'description', ] def search(self, queryset, name, value): @@ -336,6 +336,7 @@ class RackFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSe Q(facility_id__icontains=value) | Q(serial__icontains=value.strip()) | Q(asset_tag__icontains=value.strip()) | + Q(description__icontains=value) | Q(comments__icontains=value) ) @@ -497,7 +498,8 @@ class DeviceTypeFilterSet(NetBoxModelFilterSet): class Meta: model = DeviceType fields = [ - 'id', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', 'airflow', 'weight', 'weight_unit', + 'id', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', 'airflow', 'weight', + 'weight_unit', 'description', ] def search(self, queryset, name, value): @@ -507,6 +509,7 @@ class DeviceTypeFilterSet(NetBoxModelFilterSet): Q(manufacturer__name__icontains=value) | Q(model__icontains=value) | Q(part_number__icontains=value) | + Q(description__icontains=value) | Q(comments__icontains=value) ) @@ -591,7 +594,7 @@ class ModuleTypeFilterSet(NetBoxModelFilterSet): class Meta: model = ModuleType - fields = ['id', 'model', 'part_number', 'weight', 'weight_unit'] + fields = ['id', 'model', 'part_number', 'weight', 'weight_unit', 'description'] def search(self, queryset, name, value): if not value.strip(): @@ -600,6 +603,7 @@ class ModuleTypeFilterSet(NetBoxModelFilterSet): Q(manufacturer__name__icontains=value) | Q(model__icontains=value) | Q(part_number__icontains=value) | + Q(description__icontains=value) | Q(comments__icontains=value) ) @@ -639,7 +643,10 @@ class DeviceTypeComponentFilterSet(django_filters.FilterSet): def search(self, queryset, name, value): if not value.strip(): return queryset - return queryset.filter(name__icontains=value) + return queryset.filter( + Q(name__icontains=value) | + Q(description__icontains=value) + ) class ModularDeviceTypeComponentFilterSet(DeviceTypeComponentFilterSet): @@ -654,21 +661,21 @@ class ConsolePortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceType class Meta: model = ConsolePortTemplate - fields = ['id', 'name', 'type'] + fields = ['id', 'name', 'type', 'description'] class ConsoleServerPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class Meta: model = ConsoleServerPortTemplate - fields = ['id', 'name', 'type'] + fields = ['id', 'name', 'type', 'description'] class PowerPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): class Meta: model = PowerPortTemplate - fields = ['id', 'name', 'type', 'maximum_draw', 'allocated_draw'] + fields = ['id', 'name', 'type', 'maximum_draw', 'allocated_draw', 'description'] class PowerOutletTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): @@ -679,7 +686,7 @@ class PowerOutletTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceType class Meta: model = PowerOutletTemplate - fields = ['id', 'name', 'type', 'feed_leg'] + fields = ['id', 'name', 'type', 'feed_leg', 'description'] class InterfaceTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): @@ -703,7 +710,7 @@ class InterfaceTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCo class Meta: model = InterfaceTemplate - fields = ['id', 'name', 'type', 'enabled', 'mgmt_only'] + fields = ['id', 'name', 'type', 'enabled', 'mgmt_only', 'description'] class FrontPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): @@ -714,7 +721,7 @@ class FrontPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCo class Meta: model = FrontPortTemplate - fields = ['id', 'name', 'type', 'color'] + fields = ['id', 'name', 'type', 'color', 'description'] class RearPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeComponentFilterSet): @@ -725,21 +732,21 @@ class RearPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCom class Meta: model = RearPortTemplate - fields = ['id', 'name', 'type', 'color', 'positions'] + fields = ['id', 'name', 'type', 'color', 'positions', 'description'] class ModuleBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet): class Meta: model = ModuleBayTemplate - fields = ['id', 'name'] + fields = ['id', 'name', 'description'] class DeviceBayTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet): class Meta: model = DeviceBayTemplate - fields = ['id', 'name'] + fields = ['id', 'name', 'description'] class InventoryItemTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeComponentFilterSet): @@ -772,7 +779,7 @@ class InventoryItemTemplateFilterSet(ChangeLoggedModelFilterSet, DeviceTypeCompo class Meta: model = InventoryItemTemplate - fields = ['id', 'name', 'label', 'part_id'] + fields = ['id', 'name', 'label', 'part_id', 'description'] def search(self, queryset, name, value): if not value.strip(): @@ -1008,7 +1015,10 @@ class DeviceFilterSet( class Meta: model = Device - fields = ['id', 'asset_tag', 'face', 'position', 'latitude', 'longitude', 'airflow', 'vc_position', 'vc_priority'] + fields = [ + 'id', 'asset_tag', 'face', 'position', 'latitude', 'longitude', 'airflow', 'vc_position', 'vc_priority', + 'description', + ] def search(self, queryset, name, value): if not value.strip(): @@ -1088,13 +1098,16 @@ class VirtualDeviceContextFilterSet(NetBoxModelFilterSet, TenancyFilterSet, Prim class Meta: model = VirtualDeviceContext - fields = ['id', 'device', 'name'] + fields = ['id', 'device', 'name', 'description'] def search(self, queryset, name, value): if not value.strip(): return queryset - qs_filter = Q(name__icontains=value) + qs_filter = ( + Q(name__icontains=value) | + Q(description__icontains=value) + ) try: qs_filter |= Q(identifier=int(value)) except ValueError: @@ -1151,7 +1164,7 @@ class ModuleFilterSet(NetBoxModelFilterSet): class Meta: model = Module - fields = ['id', 'status', 'asset_tag'] + fields = ['id', 'status', 'asset_tag', 'description'] def search(self, queryset, name, value): if not value.strip(): @@ -1160,6 +1173,7 @@ class ModuleFilterSet(NetBoxModelFilterSet): Q(device__name__icontains=value.strip()) | Q(serial__icontains=value.strip()) | Q(asset_tag__icontains=value.strip()) | + Q(description__icontains=value) | Q(comments__icontains=value) ).distinct() @@ -1650,7 +1664,7 @@ class InventoryItemRoleFilterSet(OrganizationalModelFilterSet): class Meta: model = InventoryItemRole - fields = ['id', 'name', 'slug', 'color'] + fields = ['id', 'name', 'slug', 'color', 'description'] class VirtualChassisFilterSet(NetBoxModelFilterSet): @@ -1715,13 +1729,14 @@ class VirtualChassisFilterSet(NetBoxModelFilterSet): class Meta: model = VirtualChassis - fields = ['id', 'domain', 'name'] + fields = ['id', 'domain', 'name', 'description'] def search(self, queryset, name, value): if not value.strip(): return queryset qs_filter = ( Q(name__icontains=value) | + Q(description__icontains=value) | Q(members__name__icontains=value) | Q(domain__icontains=value) ) @@ -1790,12 +1805,16 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet): class Meta: model = Cable - fields = ['id', 'label', 'length', 'length_unit'] + fields = ['id', 'label', 'length', 'length_unit', 'description'] def search(self, queryset, name, value): if not value.strip(): return queryset - return queryset.filter(label__icontains=value) + qs_filter = ( + Q(label__icontains=value) | + Q(description__icontains=value) + ) + return queryset.filter(qs_filter) def filter_by_termination(self, queryset, name, value): # Filter by a related object cached on CableTermination. Note the underscore preceding the field name. @@ -1882,13 +1901,14 @@ class PowerPanelFilterSet(NetBoxModelFilterSet, ContactModelFilterSet): class Meta: model = PowerPanel - fields = ['id', 'name'] + fields = ['id', 'name', 'description'] def search(self, queryset, name, value): if not value.strip(): return queryset qs_filter = ( - Q(name__icontains=value) + Q(name__icontains=value) | + Q(description__icontains=value) ) return queryset.filter(qs_filter) @@ -1949,6 +1969,7 @@ class PowerFeedFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet, PathEndpoi model = PowerFeed fields = [ 'id', 'name', 'status', 'type', 'supply', 'phase', 'voltage', 'amperage', 'max_utilization', 'cable_end', + 'description', ] def search(self, queryset, name, value): @@ -1956,6 +1977,7 @@ class PowerFeedFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet, PathEndpoi return queryset qs_filter = ( Q(name__icontains=value) | + Q(description__icontains=value) | Q(power_panel__name__icontains=value) | Q(comments__icontains=value) ) diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index b33e70488..0b9e5309b 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -512,7 +512,7 @@ class ConfigContextFilterSet(ChangeLoggedModelFilterSet): class Meta: model = ConfigContext - fields = ['id', 'name', 'is_active', 'data_synced'] + fields = ['id', 'name', 'is_active', 'data_synced', 'description'] def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 8a65defff..2628ec2af 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -759,7 +759,7 @@ class FHRPGroupFilterSet(NetBoxModelFilterSet): class Meta: model = FHRPGroup - fields = ['id', 'group_id', 'name', 'auth_key'] + fields = ['id', 'group_id', 'name', 'auth_key', 'description'] def search(self, queryset, name, value): if not value.strip(): @@ -1009,12 +1009,15 @@ class ServiceTemplateFilterSet(NetBoxModelFilterSet): class Meta: model = ServiceTemplate - fields = ['id', 'name', 'protocol'] + fields = ['id', 'name', 'protocol', 'description'] def search(self, queryset, name, value): if not value.strip(): return queryset - qs_filter = Q(name__icontains=value) | Q(description__icontains=value) + qs_filter = ( + Q(name__icontains=value) | + Q(description__icontains=value) + ) return queryset.filter(qs_filter) diff --git a/netbox/netbox/filtersets.py b/netbox/netbox/filtersets.py index 49596dc98..ebb98d15f 100644 --- a/netbox/netbox/filtersets.py +++ b/netbox/netbox/filtersets.py @@ -315,5 +315,6 @@ class OrganizationalModelFilterSet(NetBoxModelFilterSet): return queryset return queryset.filter( models.Q(name__icontains=value) | - models.Q(slug__icontains=value) + models.Q(slug__icontains=value) | + models.Q(description__icontains=value) ) diff --git a/netbox/tenancy/filtersets.py b/netbox/tenancy/filtersets.py index 8bc659a88..7c1d1c470 100644 --- a/netbox/tenancy/filtersets.py +++ b/netbox/tenancy/filtersets.py @@ -65,7 +65,7 @@ class ContactFilterSet(NetBoxModelFilterSet): class Meta: model = Contact - fields = ['id', 'name', 'title', 'phone', 'email', 'address', 'link'] + fields = ['id', 'name', 'title', 'phone', 'email', 'address', 'link', 'description'] def search(self, queryset, name, value): if not value.strip(): @@ -77,6 +77,7 @@ class ContactFilterSet(NetBoxModelFilterSet): Q(email__icontains=value) | Q(address__icontains=value) | Q(link__icontains=value) | + Q(description__icontains=value) | Q(comments__icontains=value) ) diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index b23808b31..ba13394fe 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -100,13 +100,14 @@ class ClusterFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilte class Meta: model = Cluster - fields = ['id', 'name'] + fields = ['id', 'name', 'description'] def search(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter( Q(name__icontains=value) | + Q(description__icontains=value) | Q(comments__icontains=value) ) @@ -238,13 +239,14 @@ class VirtualMachineFilterSet( class Meta: model = VirtualMachine - fields = ['id', 'cluster', 'vcpus', 'memory', 'disk'] + fields = ['id', 'cluster', 'vcpus', 'memory', 'disk', 'description'] def search(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter( Q(name__icontains=value) | + Q(description__icontains=value) | Q(comments__icontains=value) | Q(primary_ip4__address__startswith=value) | Q(primary_ip6__address__startswith=value) From 3ef2db81e8cc7faa27e445a34dec55a300d99085 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 28 Dec 2023 13:20:45 -0500 Subject: [PATCH 220/271] Closes #14629: Add filter tests for all q and description filters --- netbox/circuits/tests/test_filtersets.py | 32 +- netbox/core/tests/test_filtersets.py | 18 +- netbox/dcim/tests/test_filtersets.py | 884 +++++++++++++++--- netbox/extras/tests/test_filtersets.py | 107 ++- netbox/ipam/tests/test_filtersets.py | 399 ++++++-- netbox/tenancy/tests/test_filtersets.py | 80 +- netbox/users/tests/test_filtersets.py | 16 + .../virtualization/tests/test_filtersets.py | 150 ++- netbox/wireless/tests/test_filtersets.py | 25 +- 9 files changed, 1445 insertions(+), 266 deletions(-) diff --git a/netbox/circuits/tests/test_filtersets.py b/netbox/circuits/tests/test_filtersets.py index e3380a1e5..6553179ec 100644 --- a/netbox/circuits/tests/test_filtersets.py +++ b/netbox/circuits/tests/test_filtersets.py @@ -25,8 +25,8 @@ class ProviderTestCase(TestCase, ChangeLoggedFilterSetTests): ASN.objects.bulk_create(asns) providers = ( - Provider(name='Provider 1', slug='provider-1'), - Provider(name='Provider 2', slug='provider-2'), + Provider(name='Provider 1', slug='provider-1', description='foobar1'), + Provider(name='Provider 2', slug='provider-2', description='foobar2'), Provider(name='Provider 3', slug='provider-3'), Provider(name='Provider 4', slug='provider-4'), Provider(name='Provider 5', slug='provider-5'), @@ -74,6 +74,10 @@ class ProviderTestCase(TestCase, ChangeLoggedFilterSetTests): CircuitTermination(circuit=circuits[1], site=sites[0], term_side='A'), )) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Provider 1', 'Provider 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -82,6 +86,10 @@ class ProviderTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'slug': ['provider-1', 'provider-2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_asn_id(self): # ASN object assignment asns = ASN.objects.all()[:2] params = {'asn_id': [asns[0].pk, asns[1].pk]} @@ -122,6 +130,10 @@ class CircuitTypeTestCase(TestCase, ChangeLoggedFilterSetTests): CircuitType(name='Circuit Type 3', slug='circuit-type-3'), )) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Circuit Type 1']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) @@ -227,6 +239,10 @@ class CircuitTestCase(TestCase, ChangeLoggedFilterSetTests): )) CircuitTermination.objects.bulk_create(circuit_terminations) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_cid(self): params = {'cid': ['Test Circuit 1', 'Test Circuit 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -369,6 +385,10 @@ class CircuitTerminationTestCase(TestCase, ChangeLoggedFilterSetTests): Cable(a_terminations=[circuit_terminations[0]], b_terminations=[circuit_terminations[1]]).save() + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_term_side(self): params = {'term_side': 'A'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 7) @@ -440,6 +460,10 @@ class ProviderNetworkTestCase(TestCase, ChangeLoggedFilterSetTests): ) ProviderNetwork.objects.bulk_create(provider_networks) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Provider Network 1', 'Provider Network 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -477,6 +501,10 @@ class ProviderAccountTestCase(TestCase, ChangeLoggedFilterSetTests): ) ProviderAccount.objects.bulk_create(provider_accounts) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Provider Account 1', 'Provider Account 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/core/tests/test_filtersets.py b/netbox/core/tests/test_filtersets.py index e1e916f70..d16f32f54 100644 --- a/netbox/core/tests/test_filtersets.py +++ b/netbox/core/tests/test_filtersets.py @@ -21,14 +21,16 @@ class DataSourceTestCase(TestCase, ChangeLoggedFilterSetTests): type=DataSourceTypeChoices.LOCAL, source_url='file:///var/tmp/source1/', status=DataSourceStatusChoices.NEW, - enabled=True + enabled=True, + description='foobar1' ), DataSource( name='Data Source 2', type=DataSourceTypeChoices.LOCAL, source_url='file:///var/tmp/source2/', status=DataSourceStatusChoices.SYNCING, - enabled=True + enabled=True, + description='foobar2' ), DataSource( name='Data Source 3', @@ -40,10 +42,18 @@ class DataSourceTestCase(TestCase, ChangeLoggedFilterSetTests): ) DataSource.objects.bulk_create(data_sources) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Data Source 1', 'Data Source 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_type(self): params = {'type': [DataSourceTypeChoices.LOCAL]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -97,6 +107,10 @@ class DataFileTestCase(TestCase, ChangeLoggedFilterSetTests): ) DataFile.objects.bulk_create(data_files) + def test_q(self): + params = {'q': 'file1.txt'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_source(self): sources = DataSource.objects.all() params = {'source_id': [sources[0].pk, sources[1].pk]} diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 8fbef126e..d941b1658 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -17,6 +17,14 @@ User = get_user_model() class DeviceComponentFilterSetTests: + def test_q(self): + params = {'q': 'First'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_description(self): + params = {'description': ['First', 'Second']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_device_type(self): device_types = DeviceType.objects.all()[:2] params = {'device_type_id': [device_types[0].pk, device_types[1].pk]} @@ -32,6 +40,22 @@ class DeviceComponentFilterSetTests: self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) +class DeviceComponentTemplateFilterSetTests: + + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_devicetype_id(self): + device_types = DeviceType.objects.all()[:2] + params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class RegionTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = Region.objects.all() filterset = RegionFilterSet @@ -40,9 +64,9 @@ class RegionTestCase(TestCase, ChangeLoggedFilterSetTests): def setUpTestData(cls): regions = ( - Region(name='Region 1', slug='region-1', description='A'), - Region(name='Region 2', slug='region-2', description='B'), - Region(name='Region 3', slug='region-3', description='C'), + Region(name='Region 1', slug='region-1', description='foobar1'), + Region(name='Region 2', slug='region-2', description='foobar2'), + Region(name='Region 3', slug='region-3', description='foobar3'), ) for region in regions: region.save() @@ -58,6 +82,10 @@ class RegionTestCase(TestCase, ChangeLoggedFilterSetTests): for region in child_regions: region.save() + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Region 1', 'Region 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -67,7 +95,7 @@ class RegionTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['A', 'B']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_parent(self): @@ -86,9 +114,9 @@ class SiteGroupTestCase(TestCase, ChangeLoggedFilterSetTests): def setUpTestData(cls): sitegroups = ( - SiteGroup(name='Site Group 1', slug='site-group-1', description='A'), - SiteGroup(name='Site Group 2', slug='site-group-2', description='B'), - SiteGroup(name='Site Group 3', slug='site-group-3', description='C'), + SiteGroup(name='Site Group 1', slug='site-group-1', description='foobar1'), + SiteGroup(name='Site Group 2', slug='site-group-2', description='foobar2'), + SiteGroup(name='Site Group 3', slug='site-group-3', description='foobar3'), ) for sitegroup in sitegroups: sitegroup.save() @@ -104,6 +132,10 @@ class SiteGroupTestCase(TestCase, ChangeLoggedFilterSetTests): for sitegroup in child_sitegroups: sitegroup.save() + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Site Group 1', 'Site Group 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -113,7 +145,7 @@ class SiteGroupTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['A', 'B']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_parent(self): @@ -172,7 +204,7 @@ class SiteTestCase(TestCase, ChangeLoggedFilterSetTests): sites = ( Site(name='Site 1', slug='site-1', region=regions[0], group=groups[0], tenant=tenants[0], status=SiteStatusChoices.STATUS_ACTIVE, facility='Facility 1', latitude=10, longitude=10, description='foobar1'), - Site(name='Site 2', slug='site-2', region=regions[1], group=groups[1], tenant=tenants[1], status=SiteStatusChoices.STATUS_PLANNED, facility='Facility 2', latitude=20, longitude=20, description='foobar1'), + Site(name='Site 2', slug='site-2', region=regions[1], group=groups[1], tenant=tenants[1], status=SiteStatusChoices.STATUS_PLANNED, facility='Facility 2', latitude=20, longitude=20, description='foobar2'), Site(name='Site 3', slug='site-3', region=regions[2], group=groups[2], tenant=tenants[2], status=SiteStatusChoices.STATUS_RETIRED, facility='Facility 3', latitude=30, longitude=30), ) Site.objects.bulk_create(sites) @@ -180,6 +212,10 @@ class SiteTestCase(TestCase, ChangeLoggedFilterSetTests): sites[1].asns.set([asns[1]]) sites[2].asns.set([asns[2]]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Site 1', 'Site 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -285,13 +321,17 @@ class LocationTestCase(TestCase, ChangeLoggedFilterSetTests): location.save() locations = ( - Location(name='Location 1', slug='location-1', site=sites[0], parent=parent_locations[0], status=LocationStatusChoices.STATUS_PLANNED, description='A'), - Location(name='Location 2', slug='location-2', site=sites[1], parent=parent_locations[1], status=LocationStatusChoices.STATUS_STAGING, description='B'), - Location(name='Location 3', slug='location-3', site=sites[2], parent=parent_locations[2], status=LocationStatusChoices.STATUS_DECOMMISSIONING, description='C'), + Location(name='Location 1', slug='location-1', site=sites[0], parent=parent_locations[0], status=LocationStatusChoices.STATUS_PLANNED, description='foobar1'), + Location(name='Location 2', slug='location-2', site=sites[1], parent=parent_locations[1], status=LocationStatusChoices.STATUS_STAGING, description='foobar2'), + Location(name='Location 3', slug='location-3', site=sites[2], parent=parent_locations[2], status=LocationStatusChoices.STATUS_DECOMMISSIONING, description='foobar3'), ) for location in locations: location.save() + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Location 1', 'Location 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -305,7 +345,7 @@ class LocationTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['A', 'B']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_region(self): @@ -351,6 +391,10 @@ class RackRoleTestCase(TestCase, ChangeLoggedFilterSetTests): ) RackRole.objects.bulk_create(rack_roles) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Rack Role 1', 'Rack Role 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -429,12 +473,79 @@ class RackTestCase(TestCase, ChangeLoggedFilterSetTests): Tenant.objects.bulk_create(tenants) racks = ( - Rack(name='Rack 1', facility_id='rack-1', site=sites[0], location=locations[0], tenant=tenants[0], status=RackStatusChoices.STATUS_ACTIVE, role=rack_roles[0], serial='ABC', asset_tag='1001', type=RackTypeChoices.TYPE_2POST, width=RackWidthChoices.WIDTH_19IN, u_height=42, desc_units=False, outer_width=100, outer_depth=100, outer_unit=RackDimensionUnitChoices.UNIT_MILLIMETER, weight=10, max_weight=1000, weight_unit=WeightUnitChoices.UNIT_POUND), - Rack(name='Rack 2', facility_id='rack-2', site=sites[1], location=locations[1], tenant=tenants[1], status=RackStatusChoices.STATUS_PLANNED, role=rack_roles[1], serial='DEF', asset_tag='1002', type=RackTypeChoices.TYPE_4POST, width=RackWidthChoices.WIDTH_21IN, u_height=43, desc_units=False, outer_width=200, outer_depth=200, outer_unit=RackDimensionUnitChoices.UNIT_MILLIMETER, weight=20, max_weight=2000, weight_unit=WeightUnitChoices.UNIT_POUND), - Rack(name='Rack 3', facility_id='rack-3', site=sites[2], location=locations[2], tenant=tenants[2], status=RackStatusChoices.STATUS_RESERVED, role=rack_roles[2], serial='GHI', asset_tag='1003', type=RackTypeChoices.TYPE_CABINET, width=RackWidthChoices.WIDTH_23IN, u_height=44, desc_units=True, outer_width=300, outer_depth=300, outer_unit=RackDimensionUnitChoices.UNIT_INCH, weight=30, max_weight=3000, weight_unit=WeightUnitChoices.UNIT_KILOGRAM), + Rack( + name='Rack 1', + facility_id='rack-1', + site=sites[0], + location=locations[0], + tenant=tenants[0], + status=RackStatusChoices.STATUS_ACTIVE, + role=rack_roles[0], + serial='ABC', + asset_tag='1001', + type=RackTypeChoices.TYPE_2POST, + width=RackWidthChoices.WIDTH_19IN, + u_height=42, + desc_units=False, + outer_width=100, + outer_depth=100, + outer_unit=RackDimensionUnitChoices.UNIT_MILLIMETER, + weight=10, + max_weight=1000, + weight_unit=WeightUnitChoices.UNIT_POUND, + description='foobar1' + ), + Rack( + name='Rack 2', + facility_id='rack-2', + site=sites[1], + location=locations[1], + tenant=tenants[1], + status=RackStatusChoices.STATUS_PLANNED, + role=rack_roles[1], + serial='DEF', + asset_tag='1002', + type=RackTypeChoices.TYPE_4POST, + width=RackWidthChoices.WIDTH_21IN, + u_height=43, + desc_units=False, + outer_width=200, + outer_depth=200, + outer_unit=RackDimensionUnitChoices.UNIT_MILLIMETER, + weight=20, + max_weight=2000, + weight_unit=WeightUnitChoices.UNIT_POUND, + description='foobar2' + ), + Rack( + name='Rack 3', + facility_id='rack-3', + site=sites[2], + location=locations[2], + tenant=tenants[2], + status=RackStatusChoices.STATUS_RESERVED, + role=rack_roles[2], + serial='GHI', + asset_tag='1003', + type=RackTypeChoices.TYPE_CABINET, + width=RackWidthChoices.WIDTH_23IN, + u_height=44, + desc_units=True, + outer_width=300, + outer_depth=300, + outer_unit=RackDimensionUnitChoices.UNIT_INCH, + weight=30, + max_weight=3000, + weight_unit=WeightUnitChoices.UNIT_KILOGRAM, + description='foobar3' + ), ) Rack.objects.bulk_create(racks) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Rack 1', 'Rack 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -447,6 +558,10 @@ class RackTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'asset_tag': ['1001', '1002']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_type(self): params = {'type': [RackTypeChoices.TYPE_2POST, RackTypeChoices.TYPE_4POST]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -626,10 +741,14 @@ class RackReservationTestCase(TestCase, ChangeLoggedFilterSetTests): reservations = ( RackReservation(rack=racks[0], units=[1, 2, 3], user=users[0], tenant=tenants[0], description='foobar1'), RackReservation(rack=racks[1], units=[4, 5, 6], user=users[1], tenant=tenants[1], description='foobar2'), - RackReservation(rack=racks[2], units=[7, 8, 9], user=users[2], tenant=tenants[2]), + RackReservation(rack=racks[2], units=[7, 8, 9], user=users[2], tenant=tenants[2], description='foobar3'), ) RackReservation.objects.bulk_create(reservations) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_region(self): regions = Region.objects.all()[:2] params = {'region_id': [regions[0].pk, regions[1].pk]} @@ -692,12 +811,16 @@ class ManufacturerTestCase(TestCase, ChangeLoggedFilterSetTests): def setUpTestData(cls): manufacturers = ( - Manufacturer(name='Manufacturer 1', slug='manufacturer-1', description='A'), - Manufacturer(name='Manufacturer 2', slug='manufacturer-2', description='B'), - Manufacturer(name='Manufacturer 3', slug='manufacturer-3', description='C'), + Manufacturer(name='Manufacturer 1', slug='manufacturer-1', description='foobar1'), + Manufacturer(name='Manufacturer 2', slug='manufacturer-2', description='foobar2'), + Manufacturer(name='Manufacturer 3', slug='manufacturer-3', description='foobar3'), ) Manufacturer.objects.bulk_create(manufacturers) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Manufacturer 1', 'Manufacturer 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -707,7 +830,7 @@ class ManufacturerTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['A', 'B']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -733,9 +856,47 @@ class DeviceTypeTestCase(TestCase, ChangeLoggedFilterSetTests): Platform.objects.bulk_create(platforms) device_types = ( - DeviceType(manufacturer=manufacturers[0], default_platform=platforms[0], model='Model 1', slug='model-1', part_number='Part Number 1', u_height=1, is_full_depth=True, front_image='front.png', rear_image='rear.png', weight=10, weight_unit=WeightUnitChoices.UNIT_POUND), - DeviceType(manufacturer=manufacturers[1], default_platform=platforms[1], model='Model 2', slug='model-2', part_number='Part Number 2', u_height=2, is_full_depth=True, subdevice_role=SubdeviceRoleChoices.ROLE_PARENT, airflow=DeviceAirflowChoices.AIRFLOW_FRONT_TO_REAR, weight=20, weight_unit=WeightUnitChoices.UNIT_POUND), - DeviceType(manufacturer=manufacturers[2], model='Model 3', slug='model-3', part_number='Part Number 3', u_height=3, is_full_depth=False, subdevice_role=SubdeviceRoleChoices.ROLE_CHILD, airflow=DeviceAirflowChoices.AIRFLOW_REAR_TO_FRONT, weight=30, weight_unit=WeightUnitChoices.UNIT_KILOGRAM), + DeviceType( + manufacturer=manufacturers[0], + default_platform=platforms[0], + model='Model 1', + slug='model-1', + part_number='Part Number 1', + u_height=1, + is_full_depth=True, + front_image='front.png', + rear_image='rear.png', + weight=10, + weight_unit=WeightUnitChoices.UNIT_POUND, + description='foobar1' + ), + DeviceType( + manufacturer=manufacturers[1], + default_platform=platforms[1], + model='Model 2', + slug='model-2', + part_number='Part Number 2', + u_height=2, + is_full_depth=True, + subdevice_role=SubdeviceRoleChoices.ROLE_PARENT, + airflow=DeviceAirflowChoices.AIRFLOW_FRONT_TO_REAR, + weight=20, + weight_unit=WeightUnitChoices.UNIT_POUND, + description='foobar2' + ), + DeviceType( + manufacturer=manufacturers[2], + model='Model 3', + slug='model-3', + part_number='Part Number 3', + u_height=3, + is_full_depth=False, + subdevice_role=SubdeviceRoleChoices.ROLE_CHILD, + airflow=DeviceAirflowChoices.AIRFLOW_REAR_TO_FRONT, + weight=30, + weight_unit=WeightUnitChoices.UNIT_KILOGRAM, + description='foobar3' + ), ) DeviceType.objects.bulk_create(device_types) @@ -781,6 +942,10 @@ class DeviceTypeTestCase(TestCase, ChangeLoggedFilterSetTests): inventory_item = InventoryItemTemplate(device_type=device_types[1], name='Inventory Item 1') inventory_item.save() + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_model(self): params = {'model': ['Model 1', 'Model 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -793,6 +958,10 @@ class DeviceTypeTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'part_number': ['Part Number 1', 'Part Number 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_u_height(self): params = {'u_height': [1, 2]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -915,9 +1084,30 @@ class ModuleTypeTestCase(TestCase, ChangeLoggedFilterSetTests): Manufacturer.objects.bulk_create(manufacturers) module_types = ( - ModuleType(manufacturer=manufacturers[0], model='Model 1', part_number='Part Number 1', weight=10, weight_unit=WeightUnitChoices.UNIT_POUND), - ModuleType(manufacturer=manufacturers[1], model='Model 2', part_number='Part Number 2', weight=20, weight_unit=WeightUnitChoices.UNIT_POUND), - ModuleType(manufacturer=manufacturers[2], model='Model 3', part_number='Part Number 3', weight=30, weight_unit=WeightUnitChoices.UNIT_KILOGRAM), + ModuleType( + manufacturer=manufacturers[0], + model='Model 1', + part_number='Part Number 1', + weight=10, + weight_unit=WeightUnitChoices.UNIT_POUND, + description='foobar1' + ), + ModuleType( + manufacturer=manufacturers[1], + model='Model 2', + part_number='Part Number 2', + weight=20, + weight_unit=WeightUnitChoices.UNIT_POUND, + description='foobar2' + ), + ModuleType( + manufacturer=manufacturers[2], + model='Model 3', + part_number='Part Number 3', + weight=30, + weight_unit=WeightUnitChoices.UNIT_KILOGRAM, + description='foobar3' + ), ) ModuleType.objects.bulk_create(module_types) @@ -952,6 +1142,10 @@ class ModuleTypeTestCase(TestCase, ChangeLoggedFilterSetTests): FrontPortTemplate(module_type=module_types[1], name='Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[1]), )) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_model(self): params = {'model': ['Model 1', 'Model 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -960,6 +1154,10 @@ class ModuleTypeTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'part_number': ['Part Number 1', 'Part Number 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_manufacturer(self): manufacturers = Manufacturer.objects.all()[:2] params = {'manufacturer_id': [manufacturers[0].pk, manufacturers[1].pk]} @@ -1012,7 +1210,7 @@ class ModuleTypeTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) -class ConsolePortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): +class ConsolePortTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = ConsolePortTemplate.objects.all() filterset = ConsolePortTemplateFilterSet @@ -1029,22 +1227,17 @@ class ConsolePortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): DeviceType.objects.bulk_create(device_types) ConsolePortTemplate.objects.bulk_create(( - ConsolePortTemplate(device_type=device_types[0], name='Console Port 1'), - ConsolePortTemplate(device_type=device_types[1], name='Console Port 2'), - ConsolePortTemplate(device_type=device_types[2], name='Console Port 3'), + ConsolePortTemplate(device_type=device_types[0], name='Console Port 1', description='foobar1'), + ConsolePortTemplate(device_type=device_types[1], name='Console Port 2', description='foobar2'), + ConsolePortTemplate(device_type=device_types[2], name='Console Port 3', description='foobar3'), )) def test_name(self): params = {'name': ['Console Port 1', 'Console Port 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_devicetype_id(self): - device_types = DeviceType.objects.all()[:2] - params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - -class ConsoleServerPortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): +class ConsoleServerPortTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = ConsoleServerPortTemplate.objects.all() filterset = ConsoleServerPortTemplateFilterSet @@ -1061,22 +1254,17 @@ class ConsoleServerPortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): DeviceType.objects.bulk_create(device_types) ConsoleServerPortTemplate.objects.bulk_create(( - ConsoleServerPortTemplate(device_type=device_types[0], name='Console Server Port 1'), - ConsoleServerPortTemplate(device_type=device_types[1], name='Console Server Port 2'), - ConsoleServerPortTemplate(device_type=device_types[2], name='Console Server Port 3'), + ConsoleServerPortTemplate(device_type=device_types[0], name='Console Server Port 1', description='foobar1'), + ConsoleServerPortTemplate(device_type=device_types[1], name='Console Server Port 2', description='foobar2'), + ConsoleServerPortTemplate(device_type=device_types[2], name='Console Server Port 3', description='foobar3'), )) def test_name(self): params = {'name': ['Console Server Port 1', 'Console Server Port 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_devicetype_id(self): - device_types = DeviceType.objects.all()[:2] - params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - -class PowerPortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): +class PowerPortTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = PowerPortTemplate.objects.all() filterset = PowerPortTemplateFilterSet @@ -1093,20 +1281,33 @@ class PowerPortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): DeviceType.objects.bulk_create(device_types) PowerPortTemplate.objects.bulk_create(( - PowerPortTemplate(device_type=device_types[0], name='Power Port 1', maximum_draw=100, allocated_draw=50), - PowerPortTemplate(device_type=device_types[1], name='Power Port 2', maximum_draw=200, allocated_draw=100), - PowerPortTemplate(device_type=device_types[2], name='Power Port 3', maximum_draw=300, allocated_draw=150), + PowerPortTemplate( + device_type=device_types[0], + name='Power Port 1', + maximum_draw=100, + allocated_draw=50, + description='foobar1' + ), + PowerPortTemplate( + device_type=device_types[1], + name='Power Port 2', + maximum_draw=200, + allocated_draw=100, + description='foobar2' + ), + PowerPortTemplate( + device_type=device_types[2], + name='Power Port 3', + maximum_draw=300, + allocated_draw=150, + description='foobar3' + ), )) def test_name(self): params = {'name': ['Power Port 1', 'Power Port 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_devicetype_id(self): - device_types = DeviceType.objects.all()[:2] - params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_maximum_draw(self): params = {'maximum_draw': [100, 200]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1116,7 +1317,7 @@ class PowerPortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) -class PowerOutletTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): +class PowerOutletTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = PowerOutletTemplate.objects.all() filterset = PowerOutletTemplateFilterSet @@ -1133,26 +1334,36 @@ class PowerOutletTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): DeviceType.objects.bulk_create(device_types) PowerOutletTemplate.objects.bulk_create(( - PowerOutletTemplate(device_type=device_types[0], name='Power Outlet 1', feed_leg=PowerOutletFeedLegChoices.FEED_LEG_A), - PowerOutletTemplate(device_type=device_types[1], name='Power Outlet 2', feed_leg=PowerOutletFeedLegChoices.FEED_LEG_B), - PowerOutletTemplate(device_type=device_types[2], name='Power Outlet 3', feed_leg=PowerOutletFeedLegChoices.FEED_LEG_C), + PowerOutletTemplate( + device_type=device_types[0], + name='Power Outlet 1', + feed_leg=PowerOutletFeedLegChoices.FEED_LEG_A, + description='foobar1' + ), + PowerOutletTemplate( + device_type=device_types[1], + name='Power Outlet 2', + feed_leg=PowerOutletFeedLegChoices.FEED_LEG_B, + description='foobar2' + ), + PowerOutletTemplate( + device_type=device_types[2], + name='Power Outlet 3', + feed_leg=PowerOutletFeedLegChoices.FEED_LEG_C, + description='foobar3' + ), )) def test_name(self): params = {'name': ['Power Outlet 1', 'Power Outlet 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_devicetype_id(self): - device_types = DeviceType.objects.all()[:2] - params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_feed_leg(self): params = {'feed_leg': [PowerOutletFeedLegChoices.FEED_LEG_A, PowerOutletFeedLegChoices.FEED_LEG_B]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) -class InterfaceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): +class InterfaceTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = InterfaceTemplate.objects.all() filterset = InterfaceTemplateFilterSet @@ -1176,7 +1387,8 @@ class InterfaceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): enabled=True, mgmt_only=True, poe_mode=InterfacePoEModeChoices.MODE_PD, - poe_type=InterfacePoETypeChoices.TYPE_1_8023AF + poe_type=InterfacePoETypeChoices.TYPE_1_8023AF, + description='foobar1' ), InterfaceTemplate( device_type=device_types[1], @@ -1185,13 +1397,15 @@ class InterfaceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): enabled=False, mgmt_only=False, poe_mode=InterfacePoEModeChoices.MODE_PSE, - poe_type=InterfacePoETypeChoices.TYPE_2_8023AT + poe_type=InterfacePoETypeChoices.TYPE_2_8023AT, + description='foobar2' ), InterfaceTemplate( device_type=device_types[2], name='Interface 3', type=InterfaceTypeChoices.TYPE_1GE_SFP, - mgmt_only=False + mgmt_only=False, + description='foobar3' ), ) InterfaceTemplate.objects.bulk_create(interface_templates) @@ -1203,11 +1417,6 @@ class InterfaceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'name': ['Interface 1', 'Interface 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_devicetype_id(self): - device_types = DeviceType.objects.all()[:2] - params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_type(self): params = {'type': [InterfaceTypeChoices.TYPE_1GE_FIXED, InterfaceTypeChoices.TYPE_1GE_GBIC]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1237,7 +1446,7 @@ class InterfaceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) -class FrontPortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): +class FrontPortTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = FrontPortTemplate.objects.all() filterset = FrontPortTemplateFilterSet @@ -1261,20 +1470,36 @@ class FrontPortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): RearPortTemplate.objects.bulk_create(rear_ports) FrontPortTemplate.objects.bulk_create(( - FrontPortTemplate(device_type=device_types[0], name='Front Port 1', rear_port=rear_ports[0], type=PortTypeChoices.TYPE_8P8C, color=ColorChoices.COLOR_RED), - FrontPortTemplate(device_type=device_types[1], name='Front Port 2', rear_port=rear_ports[1], type=PortTypeChoices.TYPE_110_PUNCH, color=ColorChoices.COLOR_GREEN), - FrontPortTemplate(device_type=device_types[2], name='Front Port 3', rear_port=rear_ports[2], type=PortTypeChoices.TYPE_BNC, color=ColorChoices.COLOR_BLUE), + FrontPortTemplate( + device_type=device_types[0], + name='Front Port 1', + rear_port=rear_ports[0], + type=PortTypeChoices.TYPE_8P8C, + color=ColorChoices.COLOR_RED, + description='foobar1' + ), + FrontPortTemplate( + device_type=device_types[1], + name='Front Port 2', + rear_port=rear_ports[1], + type=PortTypeChoices.TYPE_110_PUNCH, + color=ColorChoices.COLOR_GREEN, + description='foobar2' + ), + FrontPortTemplate( + device_type=device_types[2], + name='Front Port 3', + rear_port=rear_ports[2], + type=PortTypeChoices.TYPE_BNC, + color=ColorChoices.COLOR_BLUE, + description='foobar3' + ), )) def test_name(self): params = {'name': ['Front Port 1', 'Front Port 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_devicetype_id(self): - device_types = DeviceType.objects.all()[:2] - params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_type(self): params = {'type': [PortTypeChoices.TYPE_8P8C, PortTypeChoices.TYPE_110_PUNCH]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1284,7 +1509,7 @@ class FrontPortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) -class RearPortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): +class RearPortTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = RearPortTemplate.objects.all() filterset = RearPortTemplateFilterSet @@ -1301,20 +1526,36 @@ class RearPortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): DeviceType.objects.bulk_create(device_types) RearPortTemplate.objects.bulk_create(( - RearPortTemplate(device_type=device_types[0], name='Rear Port 1', type=PortTypeChoices.TYPE_8P8C, color=ColorChoices.COLOR_RED, positions=1), - RearPortTemplate(device_type=device_types[1], name='Rear Port 2', type=PortTypeChoices.TYPE_110_PUNCH, color=ColorChoices.COLOR_GREEN, positions=2), - RearPortTemplate(device_type=device_types[2], name='Rear Port 3', type=PortTypeChoices.TYPE_BNC, color=ColorChoices.COLOR_BLUE, positions=3), + RearPortTemplate( + device_type=device_types[0], + name='Rear Port 1', + type=PortTypeChoices.TYPE_8P8C, + color=ColorChoices.COLOR_RED, + positions=1, + description='foobar1' + ), + RearPortTemplate( + device_type=device_types[1], + name='Rear Port 2', + type=PortTypeChoices.TYPE_110_PUNCH, + color=ColorChoices.COLOR_GREEN, + positions=2, + description='foobar2' + ), + RearPortTemplate( + device_type=device_types[2], + name='Rear Port 3', + type=PortTypeChoices.TYPE_BNC, + color=ColorChoices.COLOR_BLUE, + positions=3, + description='foobar3' + ), )) def test_name(self): params = {'name': ['Rear Port 1', 'Rear Port 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_devicetype_id(self): - device_types = DeviceType.objects.all()[:2] - params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_type(self): params = {'type': [PortTypeChoices.TYPE_8P8C, PortTypeChoices.TYPE_110_PUNCH]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1328,7 +1569,7 @@ class RearPortTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) -class ModuleBayTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): +class ModuleBayTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = ModuleBayTemplate.objects.all() filterset = ModuleBayTemplateFilterSet @@ -1345,22 +1586,17 @@ class ModuleBayTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): DeviceType.objects.bulk_create(device_types) ModuleBayTemplate.objects.bulk_create(( - ModuleBayTemplate(device_type=device_types[0], name='Module Bay 1'), - ModuleBayTemplate(device_type=device_types[1], name='Module Bay 2'), - ModuleBayTemplate(device_type=device_types[2], name='Module Bay 3'), + ModuleBayTemplate(device_type=device_types[0], name='Module Bay 1', description='foobar1'), + ModuleBayTemplate(device_type=device_types[1], name='Module Bay 2', description='foobar2'), + ModuleBayTemplate(device_type=device_types[2], name='Module Bay 3', description='foobar3'), )) def test_name(self): params = {'name': ['Module Bay 1', 'Module Bay 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_devicetype_id(self): - device_types = DeviceType.objects.all()[:2] - params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - -class DeviceBayTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): +class DeviceBayTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = DeviceBayTemplate.objects.all() filterset = DeviceBayTemplateFilterSet @@ -1377,22 +1613,17 @@ class DeviceBayTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): DeviceType.objects.bulk_create(device_types) DeviceBayTemplate.objects.bulk_create(( - DeviceBayTemplate(device_type=device_types[0], name='Device Bay 1'), - DeviceBayTemplate(device_type=device_types[1], name='Device Bay 2'), - DeviceBayTemplate(device_type=device_types[2], name='Device Bay 3'), + DeviceBayTemplate(device_type=device_types[0], name='Device Bay 1', description='foobar1'), + DeviceBayTemplate(device_type=device_types[1], name='Device Bay 2', description='foobar2'), + DeviceBayTemplate(device_type=device_types[2], name='Device Bay 3', description='foobar3'), )) def test_name(self): params = {'name': ['Device Bay 1', 'Device Bay 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_devicetype_id(self): - device_types = DeviceType.objects.all()[:2] - params = {'devicetype_id': [device_types[0].pk, device_types[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - -class InventoryItemTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): +class InventoryItemTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ChangeLoggedFilterSetTests): queryset = InventoryItemTemplate.objects.all() filterset = InventoryItemTemplateFilterSet @@ -1420,9 +1651,33 @@ class InventoryItemTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): InventoryItemRole.objects.bulk_create(inventory_item_roles) inventory_item_templates = ( - InventoryItemTemplate(device_type=device_types[0], name='Inventory Item 1', label='A', role=inventory_item_roles[0], manufacturer=manufacturers[0], part_id='1001'), - InventoryItemTemplate(device_type=device_types[1], name='Inventory Item 2', label='B', role=inventory_item_roles[1], manufacturer=manufacturers[1], part_id='1002'), - InventoryItemTemplate(device_type=device_types[2], name='Inventory Item 3', label='C', role=inventory_item_roles[2], manufacturer=manufacturers[2], part_id='1003'), + InventoryItemTemplate( + device_type=device_types[0], + name='Inventory Item 1', + label='A', + role=inventory_item_roles[0], + manufacturer=manufacturers[0], + part_id='1001', + description='foobar1' + ), + InventoryItemTemplate( + device_type=device_types[1], + name='Inventory Item 2', + label='B', + role=inventory_item_roles[1], + manufacturer=manufacturers[1], + part_id='1002', + description='foobar2' + ), + InventoryItemTemplate( + device_type=device_types[2], + name='Inventory Item 3', + label='C', + role=inventory_item_roles[2], + manufacturer=manufacturers[2], + part_id='1003', + description='foobar3' + ), ) for item in inventory_item_templates: item.save() @@ -1486,6 +1741,10 @@ class DeviceRoleTestCase(TestCase, ChangeLoggedFilterSetTests): ) DeviceRole.objects.bulk_create(roles) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Device Role 1', 'Device Role 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1524,12 +1783,16 @@ class PlatformTestCase(TestCase, ChangeLoggedFilterSetTests): Manufacturer.objects.bulk_create(manufacturers) platforms = ( - Platform(name='Platform 1', slug='platform-1', manufacturer=manufacturers[0], description='A'), - Platform(name='Platform 2', slug='platform-2', manufacturer=manufacturers[1], description='B'), - Platform(name='Platform 3', slug='platform-3', manufacturer=manufacturers[2], description='C'), + Platform(name='Platform 1', slug='platform-1', manufacturer=manufacturers[0], description='foobar1'), + Platform(name='Platform 2', slug='platform-2', manufacturer=manufacturers[1], description='foobar2'), + Platform(name='Platform 3', slug='platform-3', manufacturer=manufacturers[2], description='foobar3'), ) Platform.objects.bulk_create(platforms) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Platform 1', 'Platform 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1539,7 +1802,7 @@ class PlatformTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['A', 'B']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_manufacturer(self): @@ -1647,9 +1910,66 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests): Tenant.objects.bulk_create(tenants) devices = ( - Device(name='Device 1', device_type=device_types[0], role=roles[0], platform=platforms[0], tenant=tenants[0], serial='ABC', asset_tag='1001', site=sites[0], location=locations[0], rack=racks[0], position=1, face=DeviceFaceChoices.FACE_FRONT, latitude=10, longitude=10, status=DeviceStatusChoices.STATUS_ACTIVE, cluster=clusters[0], local_context_data={"foo": 123}), - Device(name='Device 2', device_type=device_types[1], role=roles[1], platform=platforms[1], tenant=tenants[1], serial='DEF', asset_tag='1002', site=sites[1], location=locations[1], rack=racks[1], position=2, face=DeviceFaceChoices.FACE_FRONT, latitude=20, longitude=20, status=DeviceStatusChoices.STATUS_STAGED, airflow=DeviceAirflowChoices.AIRFLOW_FRONT_TO_REAR, cluster=clusters[1]), - Device(name='Device 3', device_type=device_types[2], role=roles[2], platform=platforms[2], tenant=tenants[2], serial='GHI', asset_tag='1003', site=sites[2], location=locations[2], rack=racks[2], position=3, face=DeviceFaceChoices.FACE_REAR, latitude=30, longitude=30, status=DeviceStatusChoices.STATUS_FAILED, airflow=DeviceAirflowChoices.AIRFLOW_REAR_TO_FRONT, cluster=clusters[2]), + Device( + name='Device 1', + device_type=device_types[0], + role=roles[0], + platform=platforms[0], + tenant=tenants[0], + serial='ABC', + asset_tag='1001', + site=sites[0], + location=locations[0], + rack=racks[0], + position=1, + face=DeviceFaceChoices.FACE_FRONT, + latitude=10, + longitude=10, + status=DeviceStatusChoices.STATUS_ACTIVE, + cluster=clusters[0], + local_context_data={"foo": 123}, + description='foobar1' + ), + Device( + name='Device 2', + device_type=device_types[1], + role=roles[1], + platform=platforms[1], + tenant=tenants[1], + serial='DEF', + asset_tag='1002', + site=sites[1], + location=locations[1], + rack=racks[1], + position=2, + face=DeviceFaceChoices.FACE_FRONT, + latitude=20, + longitude=20, + status=DeviceStatusChoices.STATUS_STAGED, + airflow=DeviceAirflowChoices.AIRFLOW_FRONT_TO_REAR, + cluster=clusters[1], + description='foobar2' + ), + Device( + name='Device 3', + device_type=device_types[2], + role=roles[2], + platform=platforms[2], + tenant=tenants[2], + serial='GHI', + asset_tag='1003', + site=sites[2], + location=locations[2], + rack=racks[2], + position=3, + face=DeviceFaceChoices.FACE_REAR, + latitude=30, + longitude=30, + status=DeviceStatusChoices.STATUS_FAILED, + airflow=DeviceAirflowChoices.AIRFLOW_REAR_TO_FRONT, + cluster=clusters[2], + description='foobar3' + ), ) Device.objects.bulk_create(devices) @@ -1711,6 +2031,10 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests): Device.objects.filter(pk=devices[0].pk).update(virtual_chassis=virtual_chassis, vc_position=1, vc_priority=1) Device.objects.filter(pk=devices[1].pk).update(virtual_chassis=virtual_chassis, vc_position=2, vc_priority=2) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Device 1', 'Device 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1718,6 +2042,10 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'name': ['DEVICE 1', 'DEVICE 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_asset_tag(self): params = {'asset_tag': ['1001', '1002']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1977,18 +2305,88 @@ class ModuleTestCase(TestCase, ChangeLoggedFilterSetTests): ModuleBay.objects.bulk_create(module_bays) modules = ( - Module(device=devices[0], module_bay=module_bays[0], module_type=module_types[0], status=ModuleStatusChoices.STATUS_ACTIVE, serial='A', asset_tag='A'), - Module(device=devices[0], module_bay=module_bays[1], module_type=module_types[1], status=ModuleStatusChoices.STATUS_ACTIVE, serial='B', asset_tag='B'), - Module(device=devices[0], module_bay=module_bays[2], module_type=module_types[2], status=ModuleStatusChoices.STATUS_ACTIVE, serial='C', asset_tag='C'), - Module(device=devices[1], module_bay=module_bays[3], module_type=module_types[0], status=ModuleStatusChoices.STATUS_ACTIVE, serial='D', asset_tag='D'), - Module(device=devices[1], module_bay=module_bays[4], module_type=module_types[1], status=ModuleStatusChoices.STATUS_ACTIVE, serial='E', asset_tag='E'), - Module(device=devices[1], module_bay=module_bays[5], module_type=module_types[2], status=ModuleStatusChoices.STATUS_ACTIVE, serial='F', asset_tag='F'), - Module(device=devices[2], module_bay=module_bays[6], module_type=module_types[0], status=ModuleStatusChoices.STATUS_ACTIVE, serial='G', asset_tag='G'), - Module(device=devices[2], module_bay=module_bays[7], module_type=module_types[1], status=ModuleStatusChoices.STATUS_PLANNED, serial='H', asset_tag='H'), - Module(device=devices[2], module_bay=module_bays[8], module_type=module_types[2], status=ModuleStatusChoices.STATUS_FAILED, serial='I', asset_tag='I'), + Module( + device=devices[0], + module_bay=module_bays[0], + module_type=module_types[0], + status=ModuleStatusChoices.STATUS_ACTIVE, + serial='A', + asset_tag='A', + description='foobar1' + ), + Module( + device=devices[0], + module_bay=module_bays[1], + module_type=module_types[1], + status=ModuleStatusChoices.STATUS_ACTIVE, + serial='B', + asset_tag='B', + description='foobar2' + ), + Module( + device=devices[0], + module_bay=module_bays[2], + module_type=module_types[2], + status=ModuleStatusChoices.STATUS_ACTIVE, + serial='C', + asset_tag='C', + description='foobar3' + ), + Module( + device=devices[1], + module_bay=module_bays[3], + module_type=module_types[0], + status=ModuleStatusChoices.STATUS_ACTIVE, + serial='D', + asset_tag='D' + ), + Module( + device=devices[1], + module_bay=module_bays[4], + module_type=module_types[1], + status=ModuleStatusChoices.STATUS_ACTIVE, + serial='E', + asset_tag='E' + ), + Module( + device=devices[1], + module_bay=module_bays[5], + module_type=module_types[2], + status=ModuleStatusChoices.STATUS_ACTIVE, + serial='F', + asset_tag='F' + ), + Module( + device=devices[2], + module_bay=module_bays[6], + module_type=module_types[0], + status=ModuleStatusChoices.STATUS_ACTIVE, + serial='G', + asset_tag='G' + ), + Module( + device=devices[2], + module_bay=module_bays[7], + module_type=module_types[1], + status=ModuleStatusChoices.STATUS_PLANNED, + serial='H', + asset_tag='H' + ), + Module( + device=devices[2], + module_bay=module_bays[8], + module_type=module_types[2], + status=ModuleStatusChoices.STATUS_FAILED, + serial='I', + asset_tag='I' + ), ) Module.objects.bulk_create(modules) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_manufacturer(self): manufacturers = Manufacturer.objects.all()[:2] params = {'manufacturer_id': [manufacturers[0].pk, manufacturers[1].pk]} @@ -2003,6 +2401,10 @@ class ModuleTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'module_type': [module_types[0].model, module_types[1].model]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_module_bay(self): module_bays = ModuleBay.objects.all()[:2] params = {'module_bay_id': [module_bays[0].pk, module_bays[1].pk]} @@ -4101,12 +4503,31 @@ class InventoryItemRoleTestCase(TestCase, ChangeLoggedFilterSetTests): def setUpTestData(cls): roles = ( - InventoryItemRole(name='Inventory Item Role 1', slug='inventory-item-role-1', color='ff0000'), - InventoryItemRole(name='Inventory Item Role 2', slug='inventory-item-role-2', color='00ff00'), - InventoryItemRole(name='Inventory Item Role 3', slug='inventory-item-role-3', color='0000ff'), + InventoryItemRole( + name='Inventory Item Role 1', + slug='inventory-item-role-1', + color='ff0000', + description='foobar1' + ), + InventoryItemRole( + name='Inventory Item Role 2', + slug='inventory-item-role-2', + color='00ff00', + description='foobar2' + ), + InventoryItemRole( + name='Inventory Item Role 3', + slug='inventory-item-role-3', + color='0000ff', + description='foobar3' + ), ) InventoryItemRole.objects.bulk_create(roles) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Inventory Item Role 1', 'Inventory Item Role 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -4115,6 +4536,10 @@ class InventoryItemRoleTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'slug': ['inventory-item-role-1', 'inventory-item-role-2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_color(self): params = {'color': ['ff0000', '00ff00']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -4165,9 +4590,9 @@ class VirtualChassisTestCase(TestCase, ChangeLoggedFilterSetTests): Device.objects.bulk_create(devices) virtual_chassis = ( - VirtualChassis(name='VC 1', master=devices[0], domain='Domain 1'), - VirtualChassis(name='VC 2', master=devices[2], domain='Domain 2'), - VirtualChassis(name='VC 3', master=devices[4], domain='Domain 3'), + VirtualChassis(name='VC 1', master=devices[0], domain='Domain 1', description='foobar1'), + VirtualChassis(name='VC 2', master=devices[2], domain='Domain 2', description='foobar2'), + VirtualChassis(name='VC 3', master=devices[4], domain='Domain 3', description='foobar3'), ) VirtualChassis.objects.bulk_create(virtual_chassis) @@ -4175,6 +4600,10 @@ class VirtualChassisTestCase(TestCase, ChangeLoggedFilterSetTests): Device.objects.filter(pk=devices[3].pk).update(virtual_chassis=virtual_chassis[1]) Device.objects.filter(pk=devices[5].pk).update(virtual_chassis=virtual_chassis[2]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_domain(self): params = {'domain': ['Domain 1', 'Domain 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -4190,6 +4619,10 @@ class VirtualChassisTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'name': ['VC 1', 'VC 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_region(self): regions = Region.objects.all()[:2] params = {'region_id': [regions[0].pk, regions[1].pk]} @@ -4283,16 +4716,96 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): console_server_port = ConsoleServerPort.objects.create(device=devices[0], name='Console Server Port 1') # Cables - Cable(a_terminations=[interfaces[1]], b_terminations=[interfaces[2]], label='Cable 1', type=CableTypeChoices.TYPE_CAT3, tenant=tenants[0], status=LinkStatusChoices.STATUS_CONNECTED, color='aa1409', length=10, length_unit=CableLengthUnitChoices.UNIT_FOOT).save() - Cable(a_terminations=[interfaces[3]], b_terminations=[interfaces[4]], label='Cable 2', type=CableTypeChoices.TYPE_CAT3, tenant=tenants[0], status=LinkStatusChoices.STATUS_CONNECTED, color='aa1409', length=20, length_unit=CableLengthUnitChoices.UNIT_FOOT).save() - Cable(a_terminations=[interfaces[5]], b_terminations=[interfaces[6]], label='Cable 3', type=CableTypeChoices.TYPE_CAT5E, tenant=tenants[1], status=LinkStatusChoices.STATUS_CONNECTED, color='f44336', length=30, length_unit=CableLengthUnitChoices.UNIT_FOOT).save() - Cable(a_terminations=[interfaces[7]], b_terminations=[interfaces[8]], label='Cable 4', type=CableTypeChoices.TYPE_CAT5E, tenant=tenants[1], status=LinkStatusChoices.STATUS_PLANNED, color='f44336', length=40, length_unit=CableLengthUnitChoices.UNIT_FOOT).save() - Cable(a_terminations=[interfaces[9]], b_terminations=[interfaces[10]], label='Cable 5', type=CableTypeChoices.TYPE_CAT6, tenant=tenants[2], status=LinkStatusChoices.STATUS_PLANNED, color='e91e63', length=10, length_unit=CableLengthUnitChoices.UNIT_METER).save() - Cable(a_terminations=[interfaces[11]], b_terminations=[interfaces[0]], label='Cable 6', type=CableTypeChoices.TYPE_CAT6, tenant=tenants[2], status=LinkStatusChoices.STATUS_PLANNED, color='e91e63', length=20, length_unit=CableLengthUnitChoices.UNIT_METER).save() - Cable(a_terminations=[console_port], b_terminations=[console_server_port], label='Cable 7').save() + cables = ( + Cable( + a_terminations=[interfaces[1]], + b_terminations=[interfaces[2]], + label='Cable 1', + type=CableTypeChoices.TYPE_CAT3, + tenant=tenants[0], + status=LinkStatusChoices.STATUS_CONNECTED, + color='aa1409', + length=10, + length_unit=CableLengthUnitChoices.UNIT_FOOT, + description='foobar1' + ), + Cable( + a_terminations=[interfaces[3]], + b_terminations=[interfaces[4]], + label='Cable 2', + type=CableTypeChoices.TYPE_CAT3, + tenant=tenants[0], + status=LinkStatusChoices.STATUS_CONNECTED, + color='aa1409', + length=20, + length_unit=CableLengthUnitChoices.UNIT_FOOT, + description='foobar2' + ), + Cable( + a_terminations=[interfaces[5]], + b_terminations=[interfaces[6]], + label='Cable 3', + type=CableTypeChoices.TYPE_CAT5E, + tenant=tenants[1], + status=LinkStatusChoices.STATUS_CONNECTED, + color='f44336', + length=30, + length_unit=CableLengthUnitChoices.UNIT_FOOT, + description='foobar3' + ), + Cable( + a_terminations=[interfaces[7]], + b_terminations=[interfaces[8]], + label='Cable 4', + type=CableTypeChoices.TYPE_CAT5E, + tenant=tenants[1], + status=LinkStatusChoices.STATUS_PLANNED, + color='f44336', + length=40, + length_unit=CableLengthUnitChoices.UNIT_FOOT + ), + Cable( + a_terminations=[interfaces[9]], + b_terminations=[interfaces[10]], + label='Cable 5', + type=CableTypeChoices.TYPE_CAT6, + tenant=tenants[2], + status=LinkStatusChoices.STATUS_PLANNED, + color='e91e63', + length=10, + length_unit=CableLengthUnitChoices.UNIT_METER + ), + Cable( + a_terminations=[interfaces[11]], + b_terminations=[interfaces[0]], + label='Cable 6', + type=CableTypeChoices.TYPE_CAT6, + tenant=tenants[2], + status=LinkStatusChoices.STATUS_PLANNED, + color='e91e63', + length=20, + length_unit=CableLengthUnitChoices.UNIT_METER + ), + Cable( + a_terminations=[console_port], + b_terminations=[console_server_port], + label='Cable 7' + ), - # Cable for unterminated test - Cable(a_terminations=[interfaces[12]], label='Cable 8', type=CableTypeChoices.TYPE_CAT6, status=LinkStatusChoices.STATUS_DECOMMISSIONING).save() + # Cable for unterminated test + Cable( + a_terminations=[interfaces[12]], + label='Cable 8', + type=CableTypeChoices.TYPE_CAT6, + status=LinkStatusChoices.STATUS_DECOMMISSIONING + ), + ) + for cable in cables: + cable.save() + + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) def test_label(self): params = {'label': ['Cable 1', 'Cable 2']} @@ -4320,6 +4833,10 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'color': ['aa1409', 'f44336']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_device(self): devices = Device.objects.all()[:2] params = {'device_id': [devices[0].pk, devices[1].pk]} @@ -4418,16 +4935,24 @@ class PowerPanelTestCase(TestCase, ChangeLoggedFilterSetTests): location.save() power_panels = ( - PowerPanel(name='Power Panel 1', site=sites[0], location=locations[0]), - PowerPanel(name='Power Panel 2', site=sites[1], location=locations[1]), - PowerPanel(name='Power Panel 3', site=sites[2], location=locations[2]), + PowerPanel(name='Power Panel 1', site=sites[0], location=locations[0], description='foobar1'), + PowerPanel(name='Power Panel 2', site=sites[1], location=locations[1], description='foobar2'), + PowerPanel(name='Power Panel 3', site=sites[2], location=locations[2], description='foobar3'), ) PowerPanel.objects.bulk_create(power_panels) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Power Panel 1', 'Power Panel 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_region(self): regions = Region.objects.all()[:2] params = {'region_id': [regions[0].pk, regions[1].pk]} @@ -4526,7 +5051,8 @@ class PowerFeedTestCase(TestCase, ChangeLoggedFilterSetTests): phase=PowerFeedPhaseChoices.PHASE_3PHASE, voltage=100, amperage=100, - max_utilization=10 + max_utilization=10, + description='foobar1' ), PowerFeed( power_panel=power_panels[1], @@ -4539,7 +5065,9 @@ class PowerFeedTestCase(TestCase, ChangeLoggedFilterSetTests): phase=PowerFeedPhaseChoices.PHASE_3PHASE, voltage=200, amperage=200, - max_utilization=20), + max_utilization=20, + description='foobar2' + ), PowerFeed( power_panel=power_panels[2], rack=racks[2], @@ -4551,7 +5079,8 @@ class PowerFeedTestCase(TestCase, ChangeLoggedFilterSetTests): phase=PowerFeedPhaseChoices.PHASE_SINGLE, voltage=300, amperage=300, - max_utilization=30 + max_utilization=30, + description='foobar3' ), ) PowerFeed.objects.bulk_create(power_feeds) @@ -4568,6 +5097,10 @@ class PowerFeedTestCase(TestCase, ChangeLoggedFilterSetTests): Cable(a_terminations=[power_feeds[0]], b_terminations=[power_ports[0]]).save() Cable(a_terminations=[power_feeds[1]], b_terminations=[power_ports[1]]).save() + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Power Feed 1', 'Power Feed 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -4600,6 +5133,10 @@ class PowerFeedTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'max_utilization': [10, 20]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_region(self): regions = Region.objects.all()[:2] params = {'region_id': [regions[0].pk, regions[1].pk]} @@ -4691,12 +5228,41 @@ class VirtualDeviceContextTestCase(TestCase, ChangeLoggedFilterSetTests): Device.objects.bulk_create(devices) vdcs = ( - VirtualDeviceContext(device=devices[0], name='VDC 1', identifier=1, status=VirtualDeviceContextStatusChoices.STATUS_ACTIVE), - VirtualDeviceContext(device=devices[0], name='VDC 2', identifier=2, status=VirtualDeviceContextStatusChoices.STATUS_PLANNED), - VirtualDeviceContext(device=devices[1], name='VDC 1', status=VirtualDeviceContextStatusChoices.STATUS_OFFLINE), - VirtualDeviceContext(device=devices[1], name='VDC 2', status=VirtualDeviceContextStatusChoices.STATUS_PLANNED), - VirtualDeviceContext(device=devices[2], name='VDC 1', status=VirtualDeviceContextStatusChoices.STATUS_ACTIVE), - VirtualDeviceContext(device=devices[2], name='VDC 2', status=VirtualDeviceContextStatusChoices.STATUS_ACTIVE), + VirtualDeviceContext( + device=devices[0], + name='VDC 1', + identifier=1, + status=VirtualDeviceContextStatusChoices.STATUS_ACTIVE, + description='foobar1' + ), + VirtualDeviceContext( + device=devices[0], + name='VDC 2', + identifier=2, + status=VirtualDeviceContextStatusChoices.STATUS_PLANNED, + description='foobar2' + ), + VirtualDeviceContext( + device=devices[1], + name='VDC 1', + status=VirtualDeviceContextStatusChoices.STATUS_OFFLINE, + description='foobar3' + ), + VirtualDeviceContext( + device=devices[1], + name='VDC 2', + status=VirtualDeviceContextStatusChoices.STATUS_PLANNED + ), + VirtualDeviceContext( + device=devices[2], + name='VDC 1', + status=VirtualDeviceContextStatusChoices.STATUS_ACTIVE + ), + VirtualDeviceContext( + device=devices[2], + name='VDC 2', + status=VirtualDeviceContextStatusChoices.STATUS_ACTIVE + ), ) VirtualDeviceContext.objects.bulk_create(vdcs) @@ -4726,6 +5292,10 @@ class VirtualDeviceContextTestCase(TestCase, ChangeLoggedFilterSetTests): vdcs[1].primary_ip6 = addresses[4] vdcs[1].save() + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_device(self): params = {'device': ['Device 1', 'Device 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) @@ -4734,6 +5304,10 @@ class VirtualDeviceContextTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'status': ['active']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_device_id(self): devices = Device.objects.filter(name__in=['Device 1', 'Device 2']) params = {'device_id': [devices[0].pk, devices[1].pk]} diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index 69111e6a7..27a30092c 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -40,7 +40,8 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests): required=True, weight=100, filter_logic=CustomFieldFilterLogicChoices.FILTER_LOOSE, - ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_READ_WRITE + ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_READ_WRITE, + description='foobar1' ), CustomField( name='Custom Field 2', @@ -48,7 +49,8 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests): required=False, weight=200, filter_logic=CustomFieldFilterLogicChoices.FILTER_EXACT, - ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_READ_ONLY + ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_READ_ONLY, + description='foobar2' ), CustomField( name='Custom Field 3', @@ -56,7 +58,8 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests): required=False, weight=300, filter_logic=CustomFieldFilterLogicChoices.FILTER_DISABLED, - ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_HIDDEN + ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_HIDDEN, + description='foobar3' ), CustomField( name='Custom Field 4', @@ -84,6 +87,10 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests): custom_fields[3].content_types.add(ContentType.objects.get_by_natural_key('dcim', 'device')) custom_fields[4].content_types.add(ContentType.objects.get_by_natural_key('dcim', 'device')) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Custom Field 1', 'Custom Field 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -116,6 +123,10 @@ class CustomFieldTestCase(TestCase, BaseFilterSetTests): params = {'choice_set_id': CustomFieldChoiceSet.objects.values_list('pk', flat=True)} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + class CustomFieldChoiceSetTestCase(TestCase, BaseFilterSetTests): queryset = CustomFieldChoiceSet.objects.all() @@ -124,12 +135,16 @@ class CustomFieldChoiceSetTestCase(TestCase, BaseFilterSetTests): @classmethod def setUpTestData(cls): choice_sets = ( - CustomFieldChoiceSet(name='Choice Set 1', extra_choices=['A', 'B', 'C']), - CustomFieldChoiceSet(name='Choice Set 2', extra_choices=['D', 'E', 'F']), - CustomFieldChoiceSet(name='Choice Set 3', extra_choices=['G', 'H', 'I']), + CustomFieldChoiceSet(name='Choice Set 1', extra_choices=['A', 'B', 'C'], description='foobar1'), + CustomFieldChoiceSet(name='Choice Set 2', extra_choices=['D', 'E', 'F'], description='foobar2'), + CustomFieldChoiceSet(name='Choice Set 3', extra_choices=['G', 'H', 'I'], description='foobar3'), ) CustomFieldChoiceSet.objects.bulk_create(choice_sets) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Choice Set 1', 'Choice Set 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -138,6 +153,10 @@ class CustomFieldChoiceSetTestCase(TestCase, BaseFilterSetTests): params = {'choice': ['A', 'D']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + class WebhookTestCase(TestCase, BaseFilterSetTests): queryset = Webhook.objects.all() @@ -216,6 +235,10 @@ class WebhookTestCase(TestCase, BaseFilterSetTests): webhooks[3].content_types.add(content_types[3]) webhooks[4].content_types.add(content_types[4]) + def test_q(self): + params = {'q': 'Webhook 1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Webhook 1', 'Webhook 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -297,6 +320,10 @@ class CustomLinkTestCase(TestCase, BaseFilterSetTests): for i, custom_link in enumerate(custom_links): custom_link.content_types.set([content_types[i]]) + def test_q(self): + params = {'q': 'Custom Link 1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Custom Link 1', 'Custom Link 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -347,7 +374,8 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests): weight=100, enabled=True, shared=True, - parameters={'status': ['active']} + parameters={'status': ['active']}, + description='foobar1' ), SavedFilter( name='Saved Filter 2', @@ -356,7 +384,8 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests): weight=200, enabled=True, shared=True, - parameters={'status': ['planned']} + parameters={'status': ['planned']}, + description='foobar2' ), SavedFilter( name='Saved Filter 3', @@ -365,13 +394,18 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests): weight=300, enabled=False, shared=False, - parameters={'status': ['retired']} + parameters={'status': ['retired']}, + description='foobar3' ), ) SavedFilter.objects.bulk_create(saved_filters) for i, savedfilter in enumerate(saved_filters): savedfilter.content_types.set([content_types[i]]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Saved Filter 1', 'Saved Filter 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -380,6 +414,10 @@ class SavedFilterTestCase(TestCase, BaseFilterSetTests): params = {'slug': ['saved-filter-1', 'saved-filter-2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_content_types(self): params = {'content_types': 'dcim.site'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) @@ -423,8 +461,6 @@ class BookmarkTestCase(TestCase, BaseFilterSetTests): @classmethod def setUpTestData(cls): - content_types = ContentType.objects.filter(model__in=['site', 'rack', 'device']) - users = ( User(username='User 1'), User(username='User 2'), @@ -505,6 +541,10 @@ class ExportTemplateTestCase(TestCase, BaseFilterSetTests): for i, et in enumerate(export_templates): et.content_types.set([content_types[i]]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Export Template 1', 'Export Template 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -578,6 +618,10 @@ class ImageAttachmentTestCase(TestCase, BaseFilterSetTests): ) ImageAttachment.objects.bulk_create(image_attachments) + def test_q(self): + params = {'q': 'Attachment 1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Image Attachment 1', 'Image Attachment 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -630,41 +674,45 @@ class JournalEntryTestCase(TestCase, ChangeLoggedFilterSetTests): assigned_object=sites[0], created_by=users[0], kind=JournalEntryKindChoices.KIND_INFO, - comments='New journal entry' + comments='foobar1' ), JournalEntry( assigned_object=sites[0], created_by=users[1], kind=JournalEntryKindChoices.KIND_SUCCESS, - comments='New journal entry' + comments='foobar2' ), JournalEntry( assigned_object=sites[1], created_by=users[2], kind=JournalEntryKindChoices.KIND_WARNING, - comments='New journal entry' + comments='foobar3' ), JournalEntry( assigned_object=racks[0], created_by=users[0], kind=JournalEntryKindChoices.KIND_INFO, - comments='New journal entry' + comments='foobar4' ), JournalEntry( assigned_object=racks[0], created_by=users[1], kind=JournalEntryKindChoices.KIND_SUCCESS, - comments='New journal entry' + comments='foobar5' ), JournalEntry( assigned_object=racks[1], created_by=users[2], kind=JournalEntryKindChoices.KIND_WARNING, - comments='New journal entry' + comments='foobar6' ), ) JournalEntry.objects.bulk_create(journal_entries) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_created_by(self): users = User.objects.filter(username__in=['Alice', 'Bob']) params = {'created_by': [users[0].username, users[1].username]} @@ -800,9 +848,10 @@ class ConfigContextTestCase(TestCase, ChangeLoggedFilterSetTests): for i in range(0, 3): is_active = bool(i % 2) c = ConfigContext.objects.create( - name='Config Context {}'.format(i + 1), + name=f"Config Context {i + 1}", is_active=is_active, - data='{"foo": 123}' + data='{"foo": 123}', + description=f"foobar{i + 1}" ) c.regions.set([regions[i]]) c.site_groups.set([site_groups[i]]) @@ -818,6 +867,10 @@ class ConfigContextTestCase(TestCase, ChangeLoggedFilterSetTests): c.tenants.set([tenants[i]]) c.tags.set([tags[i]]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Config Context 1', 'Config Context 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -828,6 +881,10 @@ class ConfigContextTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'is_active': False} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_region(self): regions = Region.objects.all()[:2] params = {'region_id': [regions[0].pk, regions[1].pk]} @@ -929,6 +986,10 @@ class ConfigTemplateTestCase(TestCase, BaseFilterSetTests): ) ConfigTemplate.objects.bulk_create(config_templates) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Config Template 1', 'Config Template 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -965,6 +1026,10 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests): site.tags.set([tags[0]]) provider.tags.set([tags[1]]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Tag 1', 'Tag 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1076,6 +1141,10 @@ class ObjectChangeTestCase(TestCase, BaseFilterSetTests): ) ObjectChange.objects.bulk_create(object_changes) + def test_q(self): + params = {'q': 'Site 1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + def test_user(self): params = {'user_id': User.objects.filter(username__in=['user1', 'user2']).values_list('pk', flat=True)} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) diff --git a/netbox/ipam/tests/test_filtersets.py b/netbox/ipam/tests/test_filtersets.py index 8d0b0113a..215d9bf74 100644 --- a/netbox/ipam/tests/test_filtersets.py +++ b/netbox/ipam/tests/test_filtersets.py @@ -39,7 +39,7 @@ class ASNRangeTestCase(TestCase, ChangeLoggedFilterSetTests): tenant=None, start=65000, end=65009, - description='aaa' + description='foobar1' ), ASNRange( name='ASN Range 2', @@ -48,7 +48,7 @@ class ASNRangeTestCase(TestCase, ChangeLoggedFilterSetTests): tenant=tenants[0], start=65010, end=65019, - description='bbb' + description='foobar2' ), ASNRange( name='ASN Range 3', @@ -57,11 +57,15 @@ class ASNRangeTestCase(TestCase, ChangeLoggedFilterSetTests): tenant=tenants[1], start=65020, end=65029, - description='ccc' + description='foobar3' ), ) ASNRange.objects.bulk_create(asn_ranges) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['ASN Range 1', 'ASN Range 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -89,7 +93,7 @@ class ASNRangeTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['aaa', 'bbb']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -123,9 +127,9 @@ class ASNTestCase(TestCase, ChangeLoggedFilterSetTests): Tenant.objects.bulk_create(tenants) asns = ( - ASN(asn=65001, rir=rirs[0], tenant=tenants[0], description='aaa'), - ASN(asn=65002, rir=rirs[1], tenant=tenants[1], description='bbb'), - ASN(asn=65003, rir=rirs[2], tenant=tenants[2], description='ccc'), + ASN(asn=65001, rir=rirs[0], tenant=tenants[0], description='foobar1'), + ASN(asn=65002, rir=rirs[1], tenant=tenants[1], description='foobar2'), + ASN(asn=65003, rir=rirs[2], tenant=tenants[2], description='foobar3'), ASN(asn=4200000000, rir=rirs[0], tenant=tenants[0]), ASN(asn=4200000001, rir=rirs[1], tenant=tenants[1]), ASN(asn=4200000002, rir=rirs[2], tenant=tenants[2]), @@ -139,6 +143,10 @@ class ASNTestCase(TestCase, ChangeLoggedFilterSetTests): asns[4].sites.set([sites[1]]) asns[5].sites.set([sites[2]]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_asn(self): params = {'asn': [65001, 4200000000]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -165,7 +173,7 @@ class ASNTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) def test_description(self): - params = {'description': ['aaa', 'bbb']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -214,6 +222,10 @@ class VRFTestCase(TestCase, ChangeLoggedFilterSetTests): vrfs[2].import_targets.add(route_targets[2]) vrfs[2].export_targets.add(route_targets[2]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['VRF 1', 'VRF 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -310,6 +322,10 @@ class RouteTargetTestCase(TestCase, ChangeLoggedFilterSetTests): vrfs[1].import_targets.add(route_targets[4], route_targets[5]) vrfs[1].export_targets.add(route_targets[6], route_targets[7]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['65000:1001', '65000:1002', '65000:1003']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) @@ -355,15 +371,19 @@ class RIRTestCase(TestCase, ChangeLoggedFilterSetTests): def setUpTestData(cls): rirs = ( - RIR(name='RIR 1', slug='rir-1', is_private=False, description='A'), - RIR(name='RIR 2', slug='rir-2', is_private=False, description='B'), - RIR(name='RIR 3', slug='rir-3', is_private=False, description='C'), - RIR(name='RIR 4', slug='rir-4', is_private=True, description='D'), - RIR(name='RIR 5', slug='rir-5', is_private=True, description='E'), - RIR(name='RIR 6', slug='rir-6', is_private=True, description='F'), + RIR(name='RIR 1', slug='rir-1', is_private=False, description='foobar1'), + RIR(name='RIR 2', slug='rir-2', is_private=False, description='foobar2'), + RIR(name='RIR 3', slug='rir-3', is_private=False, description='foobar3'), + RIR(name='RIR 4', slug='rir-4', is_private=True), + RIR(name='RIR 5', slug='rir-5', is_private=True), + RIR(name='RIR 6', slug='rir-6', is_private=True), ) RIR.objects.bulk_create(rirs) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['RIR 1', 'RIR 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -373,7 +393,7 @@ class RIRTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['A', 'B']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_is_private(self): @@ -422,6 +442,10 @@ class AggregateTestCase(TestCase, ChangeLoggedFilterSetTests): ) Aggregate.objects.bulk_create(aggregates) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_family(self): params = {'family': '4'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) @@ -475,6 +499,10 @@ class RoleTestCase(TestCase, ChangeLoggedFilterSetTests): ) Role.objects.bulk_create(roles) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Role 1', 'Role 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -579,6 +607,10 @@ class PrefixTestCase(TestCase, ChangeLoggedFilterSetTests): for prefix in prefixes: prefix.save() + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_family(self): params = {'family': '6'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 5) @@ -745,17 +777,87 @@ class IPRangeTestCase(TestCase, ChangeLoggedFilterSetTests): Tenant.objects.bulk_create(tenants) ip_ranges = ( - IPRange(start_address='10.0.1.100/24', end_address='10.0.1.199/24', size=100, vrf=None, tenant=None, role=None, status=IPRangeStatusChoices.STATUS_ACTIVE, description='foobar1'), - IPRange(start_address='10.0.2.100/24', end_address='10.0.2.199/24', size=100, vrf=vrfs[0], tenant=tenants[0], role=roles[0], status=IPRangeStatusChoices.STATUS_ACTIVE, description='foobar2'), - IPRange(start_address='10.0.3.100/24', end_address='10.0.3.199/24', size=100, vrf=vrfs[1], tenant=tenants[1], role=roles[1], status=IPRangeStatusChoices.STATUS_DEPRECATED), - IPRange(start_address='10.0.4.100/24', end_address='10.0.4.199/24', size=100, vrf=vrfs[2], tenant=tenants[2], role=roles[2], status=IPRangeStatusChoices.STATUS_RESERVED), - IPRange(start_address='2001:db8:0:1::1/64', end_address='2001:db8:0:1::100/64', size=100, vrf=None, tenant=None, role=None, status=IPRangeStatusChoices.STATUS_ACTIVE), - IPRange(start_address='2001:db8:0:2::1/64', end_address='2001:db8:0:2::100/64', size=100, vrf=vrfs[0], tenant=tenants[0], role=roles[0], status=IPRangeStatusChoices.STATUS_ACTIVE), - IPRange(start_address='2001:db8:0:3::1/64', end_address='2001:db8:0:3::100/64', size=100, vrf=vrfs[1], tenant=tenants[1], role=roles[1], status=IPRangeStatusChoices.STATUS_DEPRECATED), - IPRange(start_address='2001:db8:0:4::1/64', end_address='2001:db8:0:4::100/64', size=100, vrf=vrfs[2], tenant=tenants[2], role=roles[2], status=IPRangeStatusChoices.STATUS_RESERVED), + IPRange( + start_address='10.0.1.100/24', + end_address='10.0.1.199/24', + size=100, + vrf=None, + tenant=None, + role=None, + status=IPRangeStatusChoices.STATUS_ACTIVE, + description='foobar1' + ), + IPRange( + start_address='10.0.2.100/24', + end_address='10.0.2.199/24', + size=100, + vrf=vrfs[0], + tenant=tenants[0], + role=roles[0], + status=IPRangeStatusChoices.STATUS_ACTIVE, + description='foobar2' + ), + IPRange( + start_address='10.0.3.100/24', + end_address='10.0.3.199/24', + size=100, + vrf=vrfs[1], + tenant=tenants[1], + role=roles[1], + status=IPRangeStatusChoices.STATUS_DEPRECATED + ), + IPRange( + start_address='10.0.4.100/24', + end_address='10.0.4.199/24', + size=100, + vrf=vrfs[2], + tenant=tenants[2], + role=roles[2], + status=IPRangeStatusChoices.STATUS_RESERVED + ), + IPRange( + start_address='2001:db8:0:1::1/64', + end_address='2001:db8:0:1::100/64', + size=100, + vrf=None, + tenant=None, + role=None, + status=IPRangeStatusChoices.STATUS_ACTIVE + ), + IPRange( + start_address='2001:db8:0:2::1/64', + end_address='2001:db8:0:2::100/64', + size=100, + vrf=vrfs[0], + tenant=tenants[0], + role=roles[0], + status=IPRangeStatusChoices.STATUS_ACTIVE + ), + IPRange( + start_address='2001:db8:0:3::1/64', + end_address='2001:db8:0:3::100/64', + size=100, + vrf=vrfs[1], + tenant=tenants[1], + role=roles[1], + status=IPRangeStatusChoices.STATUS_DEPRECATED + ), + IPRange( + start_address='2001:db8:0:4::1/64', + end_address='2001:db8:0:4::100/64', + size=100, + vrf=vrfs[2], + tenant=tenants[2], + role=roles[2], + status=IPRangeStatusChoices.STATUS_RESERVED + ), ) IPRange.objects.bulk_create(ip_ranges) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_family(self): params = {'family': '6'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) @@ -889,21 +991,111 @@ class IPAddressTestCase(TestCase, ChangeLoggedFilterSetTests): Tenant.objects.bulk_create(tenants) ipaddresses = ( - IPAddress(address='10.0.0.1/24', tenant=None, vrf=None, assigned_object=None, status=IPAddressStatusChoices.STATUS_ACTIVE, dns_name='ipaddress-a', description='foobar1'), - IPAddress(address='10.0.0.2/24', tenant=tenants[0], vrf=vrfs[0], assigned_object=interfaces[0], status=IPAddressStatusChoices.STATUS_ACTIVE, dns_name='ipaddress-b'), - IPAddress(address='10.0.0.3/24', tenant=tenants[1], vrf=vrfs[1], assigned_object=interfaces[1], status=IPAddressStatusChoices.STATUS_RESERVED, role=IPAddressRoleChoices.ROLE_VIP, dns_name='ipaddress-c'), - IPAddress(address='10.0.0.4/24', tenant=tenants[2], vrf=vrfs[2], assigned_object=interfaces[2], status=IPAddressStatusChoices.STATUS_DEPRECATED, role=IPAddressRoleChoices.ROLE_SECONDARY, dns_name='ipaddress-d'), - IPAddress(address='10.0.0.5/24', tenant=None, vrf=None, assigned_object=fhrp_groups[0], status=IPAddressStatusChoices.STATUS_ACTIVE), - IPAddress(address='10.0.0.1/25', tenant=None, vrf=None, assigned_object=None, status=IPAddressStatusChoices.STATUS_ACTIVE), - IPAddress(address='2001:db8::1/64', tenant=None, vrf=None, assigned_object=None, status=IPAddressStatusChoices.STATUS_ACTIVE, dns_name='ipaddress-a', description='foobar2'), - IPAddress(address='2001:db8::2/64', tenant=tenants[0], vrf=vrfs[0], assigned_object=vminterfaces[0], status=IPAddressStatusChoices.STATUS_ACTIVE, dns_name='ipaddress-b'), - IPAddress(address='2001:db8::3/64', tenant=tenants[1], vrf=vrfs[1], assigned_object=vminterfaces[1], status=IPAddressStatusChoices.STATUS_RESERVED, role=IPAddressRoleChoices.ROLE_VIP, dns_name='ipaddress-c'), - IPAddress(address='2001:db8::4/64', tenant=tenants[2], vrf=vrfs[2], assigned_object=vminterfaces[2], status=IPAddressStatusChoices.STATUS_DEPRECATED, role=IPAddressRoleChoices.ROLE_SECONDARY, dns_name='ipaddress-d'), - IPAddress(address='2001:db8::5/64', tenant=None, vrf=None, assigned_object=fhrp_groups[1], status=IPAddressStatusChoices.STATUS_ACTIVE), - IPAddress(address='2001:db8::1/65', tenant=None, vrf=None, assigned_object=None, status=IPAddressStatusChoices.STATUS_ACTIVE), + IPAddress( + address='10.0.0.1/24', + tenant=None, + vrf=None, + assigned_object=None, + status=IPAddressStatusChoices.STATUS_ACTIVE, + dns_name='ipaddress-a', + description='foobar1' + ), + IPAddress( + address='10.0.0.2/24', + tenant=tenants[0], + vrf=vrfs[0], + assigned_object=interfaces[0], + status=IPAddressStatusChoices.STATUS_ACTIVE, + dns_name='ipaddress-b' + ), + IPAddress( + address='10.0.0.3/24', + tenant=tenants[1], + vrf=vrfs[1], + assigned_object=interfaces[1], + status=IPAddressStatusChoices.STATUS_RESERVED, + role=IPAddressRoleChoices.ROLE_VIP, + dns_name='ipaddress-c' + ), + IPAddress( + address='10.0.0.4/24', + tenant=tenants[2], + vrf=vrfs[2], + assigned_object=interfaces[2], + status=IPAddressStatusChoices.STATUS_DEPRECATED, + role=IPAddressRoleChoices.ROLE_SECONDARY, + dns_name='ipaddress-d' + ), + IPAddress( + address='10.0.0.5/24', + tenant=None, + vrf=None, + assigned_object=fhrp_groups[0], + status=IPAddressStatusChoices.STATUS_ACTIVE + ), + IPAddress( + address='10.0.0.1/25', + tenant=None, + vrf=None, + assigned_object=None, + status=IPAddressStatusChoices.STATUS_ACTIVE + ), + IPAddress( + address='2001:db8::1/64', + tenant=None, + vrf=None, + assigned_object=None, + status=IPAddressStatusChoices.STATUS_ACTIVE, + dns_name='ipaddress-a', + description='foobar2' + ), + IPAddress( + address='2001:db8::2/64', + tenant=tenants[0], + vrf=vrfs[0], + assigned_object=vminterfaces[0], + status=IPAddressStatusChoices.STATUS_ACTIVE, + dns_name='ipaddress-b' + ), + IPAddress( + address='2001:db8::3/64', + tenant=tenants[1], + vrf=vrfs[1], + assigned_object=vminterfaces[1], + status=IPAddressStatusChoices.STATUS_RESERVED, + role=IPAddressRoleChoices.ROLE_VIP, + dns_name='ipaddress-c' + ), + IPAddress( + address='2001:db8::4/64', + tenant=tenants[2], + vrf=vrfs[2], + assigned_object=vminterfaces[2], + status=IPAddressStatusChoices.STATUS_DEPRECATED, + role=IPAddressRoleChoices.ROLE_SECONDARY, + dns_name='ipaddress-d' + ), + IPAddress( + address='2001:db8::5/64', + tenant=None, + vrf=None, + assigned_object=fhrp_groups[1], + status=IPAddressStatusChoices.STATUS_ACTIVE + ), + IPAddress( + address='2001:db8::1/65', + tenant=None, + vrf=None, + assigned_object=None, + status=IPAddressStatusChoices.STATUS_ACTIVE + ), ) IPAddress.objects.bulk_create(ipaddresses) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_family(self): params = {'family': '4'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) @@ -1055,15 +1247,36 @@ class FHRPGroupTestCase(TestCase, ChangeLoggedFilterSetTests): IPAddress.objects.bulk_create(ip_addresses) fhrp_groups = ( - FHRPGroup(protocol=FHRPGroupProtocolChoices.PROTOCOL_VRRP2, group_id=10, auth_type=FHRPGroupAuthTypeChoices.AUTHENTICATION_PLAINTEXT, auth_key='foo123'), - FHRPGroup(protocol=FHRPGroupProtocolChoices.PROTOCOL_VRRP3, group_id=20, auth_type=FHRPGroupAuthTypeChoices.AUTHENTICATION_MD5, auth_key='bar456', name='bar123'), - FHRPGroup(protocol=FHRPGroupProtocolChoices.PROTOCOL_HSRP, group_id=30), + FHRPGroup( + protocol=FHRPGroupProtocolChoices.PROTOCOL_VRRP2, + group_id=10, + auth_type=FHRPGroupAuthTypeChoices.AUTHENTICATION_PLAINTEXT, + auth_key='foo123', + description='foobar1' + ), + FHRPGroup( + protocol=FHRPGroupProtocolChoices.PROTOCOL_VRRP3, + group_id=20, + auth_type=FHRPGroupAuthTypeChoices.AUTHENTICATION_MD5, + auth_key='bar456', + name='bar123', + description='foobar2' + ), + FHRPGroup( + protocol=FHRPGroupProtocolChoices.PROTOCOL_HSRP, + group_id=30, + description='foobar3' + ), ) FHRPGroup.objects.bulk_create(fhrp_groups) fhrp_groups[0].ip_addresses.set([ip_addresses[0]]) fhrp_groups[1].ip_addresses.set([ip_addresses[1]]) fhrp_groups[2].ip_addresses.set([ip_addresses[2]]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_protocol(self): params = {'protocol': [FHRPGroupProtocolChoices.PROTOCOL_VRRP2, FHRPGroupProtocolChoices.PROTOCOL_VRRP3]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1084,6 +1297,10 @@ class FHRPGroupTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'name': ['bar123', ]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_related_ip(self): # Create some regular IPs to query for related IPs ipaddresses = ( @@ -1199,17 +1416,21 @@ class VLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests): cluster.save() vlan_groups = ( - VLANGroup(name='VLAN Group 1', slug='vlan-group-1', scope=region, description='A'), - VLANGroup(name='VLAN Group 2', slug='vlan-group-2', scope=sitegroup, description='B'), - VLANGroup(name='VLAN Group 3', slug='vlan-group-3', scope=site, description='C'), - VLANGroup(name='VLAN Group 4', slug='vlan-group-4', scope=location, description='D'), - VLANGroup(name='VLAN Group 5', slug='vlan-group-5', scope=rack, description='E'), - VLANGroup(name='VLAN Group 6', slug='vlan-group-6', scope=clustergroup, description='F'), - VLANGroup(name='VLAN Group 7', slug='vlan-group-7', scope=cluster, description='G'), + VLANGroup(name='VLAN Group 1', slug='vlan-group-1', scope=region, description='foobar1'), + VLANGroup(name='VLAN Group 2', slug='vlan-group-2', scope=sitegroup, description='foobar2'), + VLANGroup(name='VLAN Group 3', slug='vlan-group-3', scope=site, description='foobar3'), + VLANGroup(name='VLAN Group 4', slug='vlan-group-4', scope=location), + VLANGroup(name='VLAN Group 5', slug='vlan-group-5', scope=rack), + VLANGroup(name='VLAN Group 6', slug='vlan-group-6', scope=clustergroup), + VLANGroup(name='VLAN Group 7', slug='vlan-group-7', scope=cluster), VLANGroup(name='VLAN Group 8', slug='vlan-group-8'), ) VLANGroup.objects.bulk_create(vlan_groups) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['VLAN Group 1', 'VLAN Group 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1219,7 +1440,7 @@ class VLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['A', 'B']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_region(self): @@ -1424,6 +1645,10 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTests): ) VLAN.objects.bulk_create(vlans) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['VLAN 101', 'VLAN 102']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1512,15 +1737,46 @@ class ServiceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): @classmethod def setUpTestData(cls): service_templates = ( - ServiceTemplate(name='Service Template 1', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[1001]), - ServiceTemplate(name='Service Template 2', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[1002]), - ServiceTemplate(name='Service Template 3', protocol=ServiceProtocolChoices.PROTOCOL_UDP, ports=[1003]), - ServiceTemplate(name='Service Template 4', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[2001]), - ServiceTemplate(name='Service Template 5', protocol=ServiceProtocolChoices.PROTOCOL_TCP, ports=[2002]), - ServiceTemplate(name='Service Template 6', protocol=ServiceProtocolChoices.PROTOCOL_UDP, ports=[2003]), + ServiceTemplate( + name='Service Template 1', + protocol=ServiceProtocolChoices.PROTOCOL_TCP, + ports=[1001], + description='foobar1' + ), + ServiceTemplate( + name='Service Template 2', + protocol=ServiceProtocolChoices.PROTOCOL_TCP, + ports=[1002], + description='foobar2' + ), + ServiceTemplate( + name='Service Template 3', + protocol=ServiceProtocolChoices.PROTOCOL_UDP, + ports=[1003], + description='foobar3' + ), + ServiceTemplate( + name='Service Template 4', + protocol=ServiceProtocolChoices.PROTOCOL_TCP, + ports=[2001] + ), + ServiceTemplate( + name='Service Template 5', + protocol=ServiceProtocolChoices.PROTOCOL_TCP, + ports=[2002] + ), + ServiceTemplate( + name='Service Template 6', + protocol=ServiceProtocolChoices.PROTOCOL_UDP, + ports=[2003] + ), ) ServiceTemplate.objects.bulk_create(service_templates) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Service Template 1', 'Service Template 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1533,6 +1789,10 @@ class ServiceTemplateTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'port': '1001'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + class ServiceTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = Service.objects.all() @@ -1589,6 +1849,10 @@ class ServiceTestCase(TestCase, ChangeLoggedFilterSetTests): services[1].ipaddresses.add(ip_addresses[1]) services[2].ipaddresses.add(ip_addresses[2]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Service 1', 'Service 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1645,9 +1909,26 @@ class L2VPNTestCase(TestCase, ChangeLoggedFilterSetTests): RouteTarget.objects.bulk_create(route_targets) l2vpns = ( - L2VPN(name='L2VPN 1', slug='l2vpn-1', type=L2VPNTypeChoices.TYPE_VXLAN, identifier=65001), - L2VPN(name='L2VPN 2', slug='l2vpn-2', type=L2VPNTypeChoices.TYPE_VPWS, identifier=65002), - L2VPN(name='L2VPN 3', slug='l2vpn-3', type=L2VPNTypeChoices.TYPE_VPLS), + L2VPN( + name='L2VPN 1', + slug='l2vpn-1', + type=L2VPNTypeChoices.TYPE_VXLAN, + identifier=65001, + description='foobar1' + ), + L2VPN( + name='L2VPN 2', + slug='l2vpn-2', + type=L2VPNTypeChoices.TYPE_VPWS, + identifier=65002, + description='foobar2' + ), + L2VPN( + name='L2VPN 3', + slug='l2vpn-3', + type=L2VPNTypeChoices.TYPE_VPLS, + description='foobar3' + ), ) L2VPN.objects.bulk_create(l2vpns) l2vpns[0].import_targets.add(route_targets[0]) @@ -1657,6 +1938,10 @@ class L2VPNTestCase(TestCase, ChangeLoggedFilterSetTests): l2vpns[1].export_targets.add(route_targets[4]) l2vpns[2].export_targets.add(route_targets[5]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['L2VPN 1', 'L2VPN 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1673,6 +1958,10 @@ class L2VPNTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'type': [L2VPNTypeChoices.TYPE_VXLAN, L2VPNTypeChoices.TYPE_VPWS]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_import_targets(self): route_targets = RouteTarget.objects.filter(name__in=['1:1', '1:2']) params = {'import_target_id': [route_targets[0].pk, route_targets[1].pk]} diff --git a/netbox/tenancy/tests/test_filtersets.py b/netbox/tenancy/tests/test_filtersets.py index d7337396e..ab72bd39f 100644 --- a/netbox/tenancy/tests/test_filtersets.py +++ b/netbox/tenancy/tests/test_filtersets.py @@ -23,13 +23,32 @@ class TenantGroupTestCase(TestCase, ChangeLoggedFilterSetTests): tenantgroup.save() tenant_groups = ( - TenantGroup(name='Tenant Group 1', slug='tenant-group-1', parent=parent_tenant_groups[0], description='A'), - TenantGroup(name='Tenant Group 2', slug='tenant-group-2', parent=parent_tenant_groups[1], description='B'), - TenantGroup(name='Tenant Group 3', slug='tenant-group-3', parent=parent_tenant_groups[2], description='C'), + TenantGroup( + name='Tenant Group 1', + slug='tenant-group-1', + parent=parent_tenant_groups[0], + description='foobar1' + ), + TenantGroup( + name='Tenant Group 2', + slug='tenant-group-2', + parent=parent_tenant_groups[1], + description='foobar2' + ), + TenantGroup( + name='Tenant Group 3', + slug='tenant-group-3', + parent=parent_tenant_groups[2], + description='foobar3' + ), ) for tenantgroup in tenant_groups: tenantgroup.save() + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Tenant Group 1', 'Tenant Group 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -39,7 +58,7 @@ class TenantGroupTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['A', 'B']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_parent(self): @@ -68,10 +87,14 @@ class TenantTestCase(TestCase, ChangeLoggedFilterSetTests): tenants = ( Tenant(name='Tenant 1', slug='tenant-1', group=tenant_groups[0], description='foobar1'), Tenant(name='Tenant 2', slug='tenant-2', group=tenant_groups[1], description='foobar2'), - Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2]), + Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2], description='foobar3'), ) Tenant.objects.bulk_create(tenants) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Tenant 1', 'Tenant 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -108,13 +131,32 @@ class ContactGroupTestCase(TestCase, ChangeLoggedFilterSetTests): contactgroup.save() contact_groups = ( - ContactGroup(name='Contact Group 1', slug='contact-group-1', parent=parent_contact_groups[0], description='A'), - ContactGroup(name='Contact Group 2', slug='contact-group-2', parent=parent_contact_groups[1], description='B'), - ContactGroup(name='Contact Group 3', slug='contact-group-3', parent=parent_contact_groups[2], description='C'), + ContactGroup( + name='Contact Group 1', + slug='contact-group-1', + parent=parent_contact_groups[0], + description='foobar1' + ), + ContactGroup( + name='Contact Group 2', + slug='contact-group-2', + parent=parent_contact_groups[1], + description='foobar2' + ), + ContactGroup( + name='Contact Group 3', + slug='contact-group-3', + parent=parent_contact_groups[2], + description='foobar3' + ), ) for contactgroup in contact_groups: contactgroup.save() + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Contact Group 1', 'Contact Group 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -124,7 +166,7 @@ class ContactGroupTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['A', 'B']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_parent(self): @@ -145,10 +187,14 @@ class ContactRoleTestCase(TestCase, ChangeLoggedFilterSetTests): contact_roles = ( ContactRole(name='Contact Role 1', slug='contact-role-1', description='foobar1'), ContactRole(name='Contact Role 2', slug='contact-role-2', description='foobar2'), - ContactRole(name='Contact Role 3', slug='contact-role-3'), + ContactRole(name='Contact Role 3', slug='contact-role-3', description='foobar3'), ) ContactRole.objects.bulk_create(contact_roles) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Contact Role 1', 'Contact Role 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -178,16 +224,24 @@ class ContactTestCase(TestCase, ChangeLoggedFilterSetTests): contactgroup.save() contacts = ( - Contact(name='Contact 1', group=contact_groups[0]), - Contact(name='Contact 2', group=contact_groups[1]), - Contact(name='Contact 3', group=contact_groups[2]), + Contact(name='Contact 1', group=contact_groups[0], description='foobar1'), + Contact(name='Contact 2', group=contact_groups[1], description='foobar2'), + Contact(name='Contact 3', group=contact_groups[2], description='foobar3'), ) Contact.objects.bulk_create(contacts) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Contact 1', 'Contact 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_group(self): group = ContactGroup.objects.all()[:2] params = {'group_id': [group[0].pk, group[1].pk]} diff --git a/netbox/users/tests/test_filtersets.py b/netbox/users/tests/test_filtersets.py index 542b40b83..38a0df813 100644 --- a/netbox/users/tests/test_filtersets.py +++ b/netbox/users/tests/test_filtersets.py @@ -67,6 +67,10 @@ class UserTestCase(TestCase, BaseFilterSetTests): users[1].groups.set([groups[1]]) users[2].groups.set([groups[2]]) + def test_q(self): + params = {'q': 'user1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_username(self): params = {'username': ['User1', 'User2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -117,6 +121,10 @@ class GroupTestCase(TestCase, BaseFilterSetTests): ) Group.objects.bulk_create(groups) + def test_q(self): + params = {'q': 'group 1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Group 1', 'Group 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -164,6 +172,10 @@ class ObjectPermissionTestCase(TestCase, BaseFilterSetTests): permissions[i].users.set([users[i]]) permissions[i].object_types.set([object_types[i]]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Permission 1', 'Permission 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -235,6 +247,10 @@ class TokenTestCase(TestCase, BaseFilterSetTests): ) Token.objects.bulk_create(tokens) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_user(self): users = User.objects.order_by('id')[:2] params = {'user_id': [users[0].pk, users[1].pk]} diff --git a/netbox/virtualization/tests/test_filtersets.py b/netbox/virtualization/tests/test_filtersets.py index e6fe90297..04e213d8b 100644 --- a/netbox/virtualization/tests/test_filtersets.py +++ b/netbox/virtualization/tests/test_filtersets.py @@ -17,12 +17,16 @@ class ClusterTypeTestCase(TestCase, ChangeLoggedFilterSetTests): def setUpTestData(cls): cluster_types = ( - ClusterType(name='Cluster Type 1', slug='cluster-type-1', description='A'), - ClusterType(name='Cluster Type 2', slug='cluster-type-2', description='B'), - ClusterType(name='Cluster Type 3', slug='cluster-type-3', description='C'), + ClusterType(name='Cluster Type 1', slug='cluster-type-1', description='foobar1'), + ClusterType(name='Cluster Type 2', slug='cluster-type-2', description='foobar2'), + ClusterType(name='Cluster Type 3', slug='cluster-type-3', description='foobar3'), ) ClusterType.objects.bulk_create(cluster_types) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Cluster Type 1', 'Cluster Type 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -32,7 +36,7 @@ class ClusterTypeTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['A', 'B']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -44,12 +48,16 @@ class ClusterGroupTestCase(TestCase, ChangeLoggedFilterSetTests): def setUpTestData(cls): cluster_groups = ( - ClusterGroup(name='Cluster Group 1', slug='cluster-group-1', description='A'), - ClusterGroup(name='Cluster Group 2', slug='cluster-group-2', description='B'), - ClusterGroup(name='Cluster Group 3', slug='cluster-group-3', description='C'), + ClusterGroup(name='Cluster Group 1', slug='cluster-group-1', description='foobar1'), + ClusterGroup(name='Cluster Group 2', slug='cluster-group-2', description='foobar2'), + ClusterGroup(name='Cluster Group 3', slug='cluster-group-3', description='foobar3'), ) ClusterGroup.objects.bulk_create(cluster_groups) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Cluster Group 1', 'Cluster Group 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -59,7 +67,7 @@ class ClusterGroupTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['A', 'B']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -123,16 +131,48 @@ class ClusterTestCase(TestCase, ChangeLoggedFilterSetTests): Tenant.objects.bulk_create(tenants) clusters = ( - Cluster(name='Cluster 1', type=cluster_types[0], group=cluster_groups[0], status=ClusterStatusChoices.STATUS_PLANNED, site=sites[0], tenant=tenants[0]), - Cluster(name='Cluster 2', type=cluster_types[1], group=cluster_groups[1], status=ClusterStatusChoices.STATUS_STAGING, site=sites[1], tenant=tenants[1]), - Cluster(name='Cluster 3', type=cluster_types[2], group=cluster_groups[2], status=ClusterStatusChoices.STATUS_ACTIVE, site=sites[2], tenant=tenants[2]), + Cluster( + name='Cluster 1', + type=cluster_types[0], + group=cluster_groups[0], + status=ClusterStatusChoices.STATUS_PLANNED, + site=sites[0], + tenant=tenants[0], + description='foobar1' + ), + Cluster( + name='Cluster 2', + type=cluster_types[1], + group=cluster_groups[1], + status=ClusterStatusChoices.STATUS_STAGING, + site=sites[1], + tenant=tenants[1], + description='foobar2' + ), + Cluster( + name='Cluster 3', + type=cluster_types[2], + group=cluster_groups[2], + status=ClusterStatusChoices.STATUS_ACTIVE, + site=sites[2], + tenant=tenants[2], + description='foobar3' + ), ) Cluster.objects.bulk_create(clusters) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Cluster 1', 'Cluster 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_region(self): regions = Region.objects.all()[:2] params = {'region_id': [regions[0].pk, regions[1].pk]} @@ -274,9 +314,49 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests): Tenant.objects.bulk_create(tenants) vms = ( - VirtualMachine(name='Virtual Machine 1', site=sites[0], cluster=clusters[0], device=devices[0], platform=platforms[0], role=roles[0], tenant=tenants[0], status=VirtualMachineStatusChoices.STATUS_ACTIVE, vcpus=1, memory=1, disk=1, local_context_data={"foo": 123}), - VirtualMachine(name='Virtual Machine 2', site=sites[1], cluster=clusters[1], device=devices[1], platform=platforms[1], role=roles[1], tenant=tenants[1], status=VirtualMachineStatusChoices.STATUS_STAGED, vcpus=2, memory=2, disk=2), - VirtualMachine(name='Virtual Machine 3', site=sites[2], cluster=clusters[2], device=devices[2], platform=platforms[2], role=roles[2], tenant=tenants[2], status=VirtualMachineStatusChoices.STATUS_OFFLINE, vcpus=3, memory=3, disk=3), + VirtualMachine( + name='Virtual Machine 1', + site=sites[0], + cluster=clusters[0], + device=devices[0], + platform=platforms[0], + role=roles[0], + tenant=tenants[0], + status=VirtualMachineStatusChoices.STATUS_ACTIVE, + vcpus=1, + memory=1, + disk=1, + description='foobar1', + local_context_data={"foo": 123} + ), + VirtualMachine( + name='Virtual Machine 2', + site=sites[1], + cluster=clusters[1], + device=devices[1], + platform=platforms[1], + role=roles[1], + tenant=tenants[1], + status=VirtualMachineStatusChoices.STATUS_STAGED, + vcpus=2, + memory=2, + disk=2, + description='foobar2' + ), + VirtualMachine( + name='Virtual Machine 3', + site=sites[2], + cluster=clusters[2], + device=devices[2], + platform=platforms[2], + role=roles[2], + tenant=tenants[2], + status=VirtualMachineStatusChoices.STATUS_OFFLINE, + vcpus=3, + memory=3, + disk=3, + description='foobar3' + ), ) VirtualMachine.objects.bulk_create(vms) @@ -300,6 +380,10 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests): VirtualMachine.objects.filter(pk=vms[0].pk).update(primary_ip4=ipaddresses[0], primary_ip6=ipaddresses[3]) VirtualMachine.objects.filter(pk=vms[1].pk).update(primary_ip4=ipaddresses[1], primary_ip6=ipaddresses[4]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Virtual Machine 1', 'Virtual Machine 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -307,6 +391,10 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'name': ['VIRTUAL MACHINE 1', 'VIRTUAL MACHINE 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_vcpus(self): params = {'vcpus': [1, 2]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -467,12 +555,40 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): VirtualMachine.objects.bulk_create(vms) interfaces = ( - VMInterface(virtual_machine=vms[0], name='Interface 1', enabled=True, mtu=100, mac_address='00-00-00-00-00-01', vrf=vrfs[0], description='foobar1'), - VMInterface(virtual_machine=vms[1], name='Interface 2', enabled=True, mtu=200, mac_address='00-00-00-00-00-02', vrf=vrfs[1], description='foobar2'), - VMInterface(virtual_machine=vms[2], name='Interface 3', enabled=False, mtu=300, mac_address='00-00-00-00-00-03', vrf=vrfs[2]), + VMInterface( + virtual_machine=vms[0], + name='Interface 1', + enabled=True, + mtu=100, + mac_address='00-00-00-00-00-01', + vrf=vrfs[0], + description='foobar1' + ), + VMInterface( + virtual_machine=vms[1], + name='Interface 2', + enabled=True, + mtu=200, + mac_address='00-00-00-00-00-02', + vrf=vrfs[1], + description='foobar2' + ), + VMInterface( + virtual_machine=vms[2], + name='Interface 3', + enabled=False, + mtu=300, + mac_address='00-00-00-00-00-03', + vrf=vrfs[2], + description='foobar3' + ), ) VMInterface.objects.bulk_create(interfaces) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Interface 1', 'Interface 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/wireless/tests/test_filtersets.py b/netbox/wireless/tests/test_filtersets.py index 0629fea07..4184d5392 100644 --- a/netbox/wireless/tests/test_filtersets.py +++ b/netbox/wireless/tests/test_filtersets.py @@ -36,6 +36,10 @@ class WirelessLANGroupTestCase(TestCase, ChangeLoggedFilterSetTests): for group in child_groups: group.save() + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Wireless LAN Group 1', 'Wireless LAN Group 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -103,7 +107,8 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests): tenant=tenants[0], auth_type=WirelessAuthTypeChoices.TYPE_OPEN, auth_cipher=WirelessAuthCipherChoices.CIPHER_AUTO, - auth_psk='PSK1' + auth_psk='PSK1', + description='foobar1' ), WirelessLAN( ssid='WLAN2', @@ -113,7 +118,8 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests): tenant=tenants[1], auth_type=WirelessAuthTypeChoices.TYPE_WEP, auth_cipher=WirelessAuthCipherChoices.CIPHER_TKIP, - auth_psk='PSK2' + auth_psk='PSK2', + description='foobar2' ), WirelessLAN( ssid='WLAN3', @@ -123,11 +129,16 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests): tenant=tenants[2], auth_type=WirelessAuthTypeChoices.TYPE_WPA_PERSONAL, auth_cipher=WirelessAuthCipherChoices.CIPHER_AES, - auth_psk='PSK3' + auth_psk='PSK3', + description='foobar3' ), ) WirelessLAN.objects.bulk_create(wireless_lans) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_ssid(self): params = {'ssid': ['WLAN1', 'WLAN2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -160,6 +171,10 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'auth_psk': ['PSK1', 'PSK2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_tenant(self): tenants = Tenant.objects.all()[:2] params = {'tenant_id': [tenants[0].pk, tenants[1].pk]} @@ -240,6 +255,10 @@ class WirelessLinkTestCase(TestCase, ChangeLoggedFilterSetTests): ssid='LINK4' ).save() + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_ssid(self): params = {'ssid': ['LINK1', 'LINK2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) From 199685d98be39038d2609c22bec74b67f620410e Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 28 Dec 2023 13:58:34 -0500 Subject: [PATCH 221/271] Release v3.6.9 --- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- docs/release-notes/version-3.6.md | 14 ++++++++++++++ netbox/netbox/settings.py | 2 +- 4 files changed, 17 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index ed29534f6..37848a318 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -23,7 +23,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v3.6.8 + placeholder: v3.6.9 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 330f3b2bb..006fb64fc 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.6.8 + placeholder: v3.6.9 validations: required: true - type: dropdown diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 952319488..75a51c9cf 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -1,5 +1,19 @@ # NetBox v3.6 +## v3.6.9 (2023-12-28) + +### Enhancements + +* [#14631](https://github.com/netbox-community/netbox/issues/14631) - All models can be filtered and searched by their description field (where applicable) + +### Bug Fixes + +* [#14482](https://github.com/netbox-community/netbox/issues/14482) - Fix validation error when attempting to move a primary IP address to a new parent object +* [#14620](https://github.com/netbox-community/netbox/issues/14620) - Permit setting device type U height to 0 during bulk edit +* [#14621](https://github.com/netbox-community/netbox/issues/14621) - Fix error when using the device search filter + +--- + ## v3.6.8 (2023-12-27) ### Enhancements diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 5941ffec5..805a76242 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -25,7 +25,7 @@ from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW # Environment setup # -VERSION = '3.6.8' +VERSION = '3.6.9' # Hostname HOSTNAME = platform.node() From d930c4e36e9ad1232c709ceb7a5a42df28a459f2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 28 Dec 2023 14:43:08 -0500 Subject: [PATCH 222/271] Apply filterset & test changes for #14631 & #14629 --- netbox/extras/filtersets.py | 2 +- netbox/extras/tests/test_filtersets.py | 20 +++- .../virtualization/tests/test_filtersets.py | 12 ++- netbox/vpn/filtersets.py | 12 +-- netbox/vpn/tests/test_filtersets.py | 100 +++++++++++++++--- 5 files changed, 119 insertions(+), 27 deletions(-) diff --git a/netbox/extras/filtersets.py b/netbox/extras/filtersets.py index b995fbbc4..730499956 100644 --- a/netbox/extras/filtersets.py +++ b/netbox/extras/filtersets.py @@ -50,7 +50,7 @@ class WebhookFilterSet(NetBoxModelFilterSet): model = Webhook fields = [ 'id', 'name', 'payload_url', 'http_method', 'http_content_type', 'secret', 'ssl_verification', - 'ca_file_path', + 'ca_file_path', 'description', ] def search(self, queryset, name, value): diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index 9b111793f..ef8aedcbd 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -182,18 +182,21 @@ class WebhookTestCase(TestCase, BaseFilterSetTests): payload_url='http://example.com/?1', http_method='GET', ssl_verification=True, + description='foobar1' ), Webhook( name='Webhook 2', payload_url='http://example.com/?2', http_method='POST', ssl_verification=True, + description='foobar2' ), Webhook( name='Webhook 3', payload_url='http://example.com/?3', http_method='PATCH', ssl_verification=False, + description='foobar3' ), Webhook( name='Webhook 4', @@ -211,13 +214,17 @@ class WebhookTestCase(TestCase, BaseFilterSetTests): Webhook.objects.bulk_create(webhooks) def test_q(self): - params = {'q': 'Webhook 1'} + params = {'q': 'foobar1'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) def test_name(self): params = {'name': ['Webhook 1', 'Webhook 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_http_method(self): params = {'http_method': ['GET', 'POST']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -276,6 +283,7 @@ class EventRuleTestCase(TestCase, BaseFilterSetTests): type_job_start=False, type_job_end=False, action_type=EventRuleActionChoices.WEBHOOK, + description='foobar1' ), EventRule( name='Event Rule 2', @@ -287,6 +295,7 @@ class EventRuleTestCase(TestCase, BaseFilterSetTests): type_job_start=False, type_job_end=False, action_type=EventRuleActionChoices.WEBHOOK, + description='foobar2' ), EventRule( name='Event Rule 3', @@ -298,6 +307,7 @@ class EventRuleTestCase(TestCase, BaseFilterSetTests): type_job_start=False, type_job_end=False, action_type=EventRuleActionChoices.WEBHOOK, + description='foobar3' ), EventRule( name='Event Rule 4', @@ -329,10 +339,18 @@ class EventRuleTestCase(TestCase, BaseFilterSetTests): event_rules[3].content_types.add(content_types[3]) event_rules[4].content_types.add(content_types[4]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Event Rule 1', 'Event Rule 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_content_types(self): params = {'content_types': 'dcim.region'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) diff --git a/netbox/virtualization/tests/test_filtersets.py b/netbox/virtualization/tests/test_filtersets.py index e5c85df40..5c020e1b2 100644 --- a/netbox/virtualization/tests/test_filtersets.py +++ b/netbox/virtualization/tests/test_filtersets.py @@ -669,12 +669,16 @@ class VirtualDiskTestCase(TestCase, ChangeLoggedFilterSetTests): VirtualMachine.objects.bulk_create(vms) disks = ( - VirtualDisk(virtual_machine=vms[0], name='Disk 1', size=1, description='A'), - VirtualDisk(virtual_machine=vms[1], name='Disk 2', size=2, description='B'), - VirtualDisk(virtual_machine=vms[2], name='Disk 3', size=3, description='C'), + VirtualDisk(virtual_machine=vms[0], name='Disk 1', size=1, description='foobar1'), + VirtualDisk(virtual_machine=vms[1], name='Disk 2', size=2, description='foobar2'), + VirtualDisk(virtual_machine=vms[2], name='Disk 3', size=3, description='foobar3'), ) VirtualDisk.objects.bulk_create(disks) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_virtual_machine(self): vms = VirtualMachine.objects.all()[:2] params = {'virtual_machine_id': [vms[0].pk, vms[1].pk]} @@ -691,5 +695,5 @@ class VirtualDiskTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_description(self): - params = {'description': ['A', 'B']} + params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/vpn/filtersets.py b/netbox/vpn/filtersets.py index fbdbb2418..0647838a8 100644 --- a/netbox/vpn/filtersets.py +++ b/netbox/vpn/filtersets.py @@ -62,7 +62,7 @@ class TunnelFilterSet(NetBoxModelFilterSet, TenancyFilterSet): class Meta: model = Tunnel - fields = ['id', 'name', 'tunnel_id'] + fields = ['id', 'name', 'tunnel_id', 'description'] def search(self, queryset, name, value): if not value.strip(): @@ -139,7 +139,7 @@ class IKEProposalFilterSet(NetBoxModelFilterSet): class Meta: model = IKEProposal - fields = ['id', 'name', 'sa_lifetime'] + fields = ['id', 'name', 'sa_lifetime', 'description'] def search(self, queryset, name, value): if not value.strip(): @@ -167,7 +167,7 @@ class IKEPolicyFilterSet(NetBoxModelFilterSet): class Meta: model = IKEPolicy - fields = ['id', 'name', 'preshared_key'] + fields = ['id', 'name', 'preshared_key', 'description'] def search(self, queryset, name, value): if not value.strip(): @@ -189,7 +189,7 @@ class IPSecProposalFilterSet(NetBoxModelFilterSet): class Meta: model = IPSecProposal - fields = ['id', 'name', 'sa_lifetime_seconds', 'sa_lifetime_data'] + fields = ['id', 'name', 'sa_lifetime_seconds', 'sa_lifetime_data', 'description'] def search(self, queryset, name, value): if not value.strip(): @@ -214,7 +214,7 @@ class IPSecPolicyFilterSet(NetBoxModelFilterSet): class Meta: model = IPSecPolicy - fields = ['id', 'name'] + fields = ['id', 'name', 'description'] def search(self, queryset, name, value): if not value.strip(): @@ -253,7 +253,7 @@ class IPSecProfileFilterSet(NetBoxModelFilterSet): class Meta: model = IPSecProfile - fields = ['id', 'name'] + fields = ['id', 'name', 'description'] def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/vpn/tests/test_filtersets.py b/netbox/vpn/tests/test_filtersets.py index 1c4996e0a..d4e80750d 100644 --- a/netbox/vpn/tests/test_filtersets.py +++ b/netbox/vpn/tests/test_filtersets.py @@ -24,6 +24,10 @@ class TunnelGroupTestCase(TestCase, ChangeLoggedFilterSetTests): TunnelGroup(name='Tunnel Group 3', slug='tunnel-group-3'), )) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Tunnel Group 1']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) @@ -96,7 +100,8 @@ class TunnelTestCase(TestCase, ChangeLoggedFilterSetTests): group=tunnel_groups[0], encapsulation=TunnelEncapsulationChoices.ENCAP_GRE, ipsec_profile=ipsec_profiles[0], - tunnel_id=100 + tunnel_id=100, + description='foobar1' ), Tunnel( name='Tunnel 2', @@ -104,7 +109,8 @@ class TunnelTestCase(TestCase, ChangeLoggedFilterSetTests): group=tunnel_groups[1], encapsulation=TunnelEncapsulationChoices.ENCAP_IP_IP, ipsec_profile=ipsec_profiles[0], - tunnel_id=200 + tunnel_id=200, + description='foobar2' ), Tunnel( name='Tunnel 3', @@ -112,11 +118,16 @@ class TunnelTestCase(TestCase, ChangeLoggedFilterSetTests): group=tunnel_groups[2], encapsulation=TunnelEncapsulationChoices.ENCAP_IPSEC_TUNNEL, ipsec_profile=None, - tunnel_id=300 + tunnel_id=300, + description='foobar3' ), ) Tunnel.objects.bulk_create(tunnels) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['Tunnel 1', 'Tunnel 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -147,6 +158,10 @@ class TunnelTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'tunnel_id': [100, 200]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + class TunnelTerminationTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = TunnelTermination.objects.all() @@ -292,7 +307,8 @@ class IKEProposalTestCase(TestCase, ChangeLoggedFilterSetTests): encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, group=DHGroupChoices.GROUP_1, - sa_lifetime=1000 + sa_lifetime=1000, + description='foobar1' ), IKEProposal( name='IKE Proposal 2', @@ -300,7 +316,8 @@ class IKEProposalTestCase(TestCase, ChangeLoggedFilterSetTests): encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC, authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, group=DHGroupChoices.GROUP_2, - sa_lifetime=2000 + sa_lifetime=2000, + description='foobar2' ), IKEProposal( name='IKE Proposal 3', @@ -308,15 +325,24 @@ class IKEProposalTestCase(TestCase, ChangeLoggedFilterSetTests): encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES256_CBC, authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA512, group=DHGroupChoices.GROUP_5, - sa_lifetime=3000 + sa_lifetime=3000, + description='foobar3' ), ) IKEProposal.objects.bulk_create(ike_proposals) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['IKE Proposal 1', 'IKE Proposal 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_authentication_method(self): params = {'authentication_method': [ AuthenticationMethodChoices.PRESHARED_KEYS, AuthenticationMethodChoices.CERTIFICATES @@ -380,16 +406,19 @@ class IKEPolicyTestCase(TestCase, ChangeLoggedFilterSetTests): name='IKE Policy 1', version=IKEVersionChoices.VERSION_1, mode=IKEModeChoices.MAIN, + description='foobar1' ), IKEPolicy( name='IKE Policy 2', version=IKEVersionChoices.VERSION_1, mode=IKEModeChoices.MAIN, + description='foobar2' ), IKEPolicy( name='IKE Policy 3', version=IKEVersionChoices.VERSION_2, mode=IKEModeChoices.AGGRESSIVE, + description='foobar3' ), ) IKEPolicy.objects.bulk_create(ike_policies) @@ -397,10 +426,18 @@ class IKEPolicyTestCase(TestCase, ChangeLoggedFilterSetTests): ike_policies[1].proposals.add(ike_proposals[1]) ike_policies[2].proposals.add(ike_proposals[2]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['IKE Policy 1', 'IKE Policy 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_version(self): params = {'version': [IKEVersionChoices.VERSION_1]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -429,29 +466,40 @@ class IPSecProposalTestCase(TestCase, ChangeLoggedFilterSetTests): encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA1, sa_lifetime_seconds=1000, - sa_lifetime_data=1000 + sa_lifetime_data=1000, + description='foobar1' ), IPSecProposal( name='IPSec Proposal 2', encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC, authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA256, sa_lifetime_seconds=2000, - sa_lifetime_data=2000 + sa_lifetime_data=2000, + description='foobar2' ), IPSecProposal( name='IPSec Proposal 3', encryption_algorithm=EncryptionAlgorithmChoices.ENCRYPTION_AES256_CBC, authentication_algorithm=AuthenticationAlgorithmChoices.AUTH_HMAC_SHA512, sa_lifetime_seconds=3000, - sa_lifetime_data=3000 + sa_lifetime_data=3000, + description='foobar3' ), ) IPSecProposal.objects.bulk_create(ipsec_proposals) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['IPSec Proposal 1', 'IPSec Proposal 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_encryption_algorithm(self): params = {'encryption_algorithm': [ EncryptionAlgorithmChoices.ENCRYPTION_AES128_CBC, EncryptionAlgorithmChoices.ENCRYPTION_AES192_CBC @@ -501,15 +549,18 @@ class IPSecPolicyTestCase(TestCase, ChangeLoggedFilterSetTests): ipsec_policies = ( IPSecPolicy( name='IPSec Policy 1', - pfs_group=DHGroupChoices.GROUP_1 + pfs_group=DHGroupChoices.GROUP_1, + description='foobar1' ), IPSecPolicy( name='IPSec Policy 2', - pfs_group=DHGroupChoices.GROUP_2 + pfs_group=DHGroupChoices.GROUP_2, + description='foobar2' ), IPSecPolicy( name='IPSec Policy 3', - pfs_group=DHGroupChoices.GROUP_5 + pfs_group=DHGroupChoices.GROUP_5, + description='foobar3' ), ) IPSecPolicy.objects.bulk_create(ipsec_policies) @@ -517,10 +568,18 @@ class IPSecPolicyTestCase(TestCase, ChangeLoggedFilterSetTests): ipsec_policies[1].proposals.add(ipsec_proposals[1]) ipsec_policies[2].proposals.add(ipsec_proposals[2]) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['IPSec Policy 1', 'IPSec Policy 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_pfs_group(self): params = {'pfs_group': [DHGroupChoices.GROUP_1, DHGroupChoices.GROUP_2]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -596,27 +655,38 @@ class IPSecProfileTestCase(TestCase, ChangeLoggedFilterSetTests): name='IPSec Profile 1', mode=IPSecModeChoices.ESP, ike_policy=ike_policies[0], - ipsec_policy=ipsec_policies[0] + ipsec_policy=ipsec_policies[0], + description='foobar1' ), IPSecProfile( name='IPSec Profile 2', mode=IPSecModeChoices.ESP, ike_policy=ike_policies[1], - ipsec_policy=ipsec_policies[1] + ipsec_policy=ipsec_policies[1], + description='foobar2' ), IPSecProfile( name='IPSec Profile 3', mode=IPSecModeChoices.AH, ike_policy=ike_policies[2], - ipsec_policy=ipsec_policies[2] + ipsec_policy=ipsec_policies[2], + description='foobar3' ), ) IPSecProfile.objects.bulk_create(ipsec_profiles) + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_name(self): params = {'name': ['IPSec Profile 1', 'IPSec Profile 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_mode(self): params = {'mode': [IPSecModeChoices.ESP]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) From d9c1ba8972157ff3085609a0b804f1090780a700 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 28 Dec 2023 14:58:19 -0500 Subject: [PATCH 223/271] Add translations to changelog --- docs/release-notes/version-3.7.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index fc06ba16d..f1fba9372 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -75,6 +75,13 @@ Plugins can now [register their own data backends](../plugins/development/data-b * [#14436](https://github.com/netbox-community/netbox/issues/14436) - Add PostgreSQL indexes for all GenericForeignKey fields * [#14579](https://github.com/netbox-community/netbox/issues/14579) - Allow users to specify a preferred language for UI translations +### Translations + +* [#14075](https://github.com/netbox-community/netbox/issues/14075) - Add Spanish translation +* [#14096](https://github.com/netbox-community/netbox/issues/14096) - Add French translation +* [#14145](https://github.com/netbox-community/netbox/issues/14145) - Add Portuguese translation +* [#14266](https://github.com/netbox-community/netbox/issues/14266) - Add Russian translation + ### Other Changes * [#13550](https://github.com/netbox-community/netbox/issues/13550) - Optimized the format for declaring view actions under `ActionsMixin` (backward compatibility has been retained) From 224484ebb61e6bf4311a662a9e62024bc4f705a0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 28 Dec 2023 15:39:14 -0500 Subject: [PATCH 224/271] Closes #14434: Add termination object filters for cables (#14617) * Add termination object filters for cables * Add tests for new filters --- netbox/dcim/filtersets.py | 67 ++++++++++++++++ netbox/dcim/tests/test_filtersets.py | 111 ++++++++++++++++++++++----- 2 files changed, 158 insertions(+), 20 deletions(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 776021af1..68edc93f6 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1,7 +1,9 @@ import django_filters from django.contrib.auth import get_user_model +from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext as _ +from circuits.models import CircuitTermination from extras.filtersets import LocalConfigContextFilterSet from extras.models import ConfigTemplate from ipam.filtersets import PrimaryIPFilterSet @@ -1804,6 +1806,35 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet): field_name='site__slug' ) + # Termination object filters + consoleport_id = MultiValueNumberFilter( + method='filter_by_consoleport' + ) + consoleserverport_id = MultiValueNumberFilter( + method='filter_by_consoleserverport' + ) + powerport_id = MultiValueNumberFilter( + method='filter_by_powerport' + ) + poweroutlet_id = MultiValueNumberFilter( + method='filter_by_poweroutlet' + ) + interface_id = MultiValueNumberFilter( + method='filter_by_interface' + ) + frontport_id = MultiValueNumberFilter( + method='filter_by_frontport' + ) + rearport_id = MultiValueNumberFilter( + method='filter_by_rearport' + ) + powerfeed_id = MultiValueNumberFilter( + method='filter_by_powerfeed' + ) + circuittermination_id = MultiValueNumberFilter( + method='filter_by_circuittermination' + ) + class Meta: model = Cable fields = ['id', 'label', 'length', 'length_unit', 'description'] @@ -1847,6 +1878,42 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet): terminations__cable_end=CableEndChoices.SIDE_B ) + def filter_by_termination_object(self, queryset, model, value): + # Filter by specific termination object(s) + content_type = ContentType.objects.get_for_model(model) + cable_ids = CableTermination.objects.filter( + termination_type=content_type, + termination_id__in=value + ).values_list('cable', flat=True) + return queryset.filter(pk__in=cable_ids) + + def filter_by_consoleport(self, queryset, name, value): + return self.filter_by_termination_object(queryset, ConsolePort, value) + + def filter_by_consoleserverport(self, queryset, name, value): + return self.filter_by_termination_object(queryset, ConsoleServerPort, value) + + def filter_by_powerport(self, queryset, name, value): + return self.filter_by_termination_object(queryset, PowerPort, value) + + def filter_by_poweroutlet(self, queryset, name, value): + return self.filter_by_termination_object(queryset, PowerOutlet, value) + + def filter_by_interface(self, queryset, name, value): + return self.filter_by_termination_object(queryset, Interface, value) + + def filter_by_frontport(self, queryset, name, value): + return self.filter_by_termination_object(queryset, FrontPort, value) + + def filter_by_rearport(self, queryset, name, value): + return self.filter_by_termination_object(queryset, RearPort, value) + + def filter_by_powerfeed(self, queryset, name, value): + return self.filter_by_termination_object(queryset, PowerFeed, value) + + def filter_by_circuittermination(self, queryset, name, value): + return self.filter_by_termination_object(queryset, CircuitTermination, value) + class CableTerminationFilterSet(BaseFilterSet): termination_type = ContentTypeFilter() diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index d941b1658..89d15a0ef 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -1,6 +1,7 @@ from django.contrib.auth import get_user_model from django.test import TestCase +from circuits.models import Circuit, CircuitTermination, CircuitType, Provider from dcim.choices import * from dcim.filtersets import * from dcim.models import * @@ -4714,6 +4715,23 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): console_port = ConsolePort.objects.create(device=devices[0], name='Console Port 1') console_server_port = ConsoleServerPort.objects.create(device=devices[0], name='Console Server Port 1') + power_port = PowerPort.objects.create(device=devices[0], name='Power Port 1') + power_outlet = PowerOutlet.objects.create(device=devices[0], name='Power Outlet 1') + rear_port = RearPort.objects.create(device=devices[0], name='Rear Port 1', positions=1) + front_port = FrontPort.objects.create( + device=devices[0], + name='Front Port 1', + rear_port=rear_port, + rear_port_position=1 + ) + + power_panel = PowerPanel.objects.create(name='Power Panel 1', site=sites[0]) + power_feed = PowerFeed.objects.create(name='Power Feed 1', power_panel=power_panel) + + provider = Provider.objects.create(name='Provider 1', slug='provider-1') + circuit_type = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1') + circuit = Circuit.objects.create(cid='Circuit 1', provider=provider, type=circuit_type) + circuit_termination = CircuitTermination.objects.create(circuit=circuit, term_side='A', site=sites[0]) # Cables cables = ( @@ -4786,18 +4804,39 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): length=20, length_unit=CableLengthUnitChoices.UNIT_METER ), + + # Cables for filtering by termination object Cable( a_terminations=[console_port], - b_terminations=[console_server_port], label='Cable 7' ), - - # Cable for unterminated test Cable( - a_terminations=[interfaces[12]], - label='Cable 8', - type=CableTypeChoices.TYPE_CAT6, - status=LinkStatusChoices.STATUS_DECOMMISSIONING + a_terminations=[console_server_port], + label='Cable 8' + ), + Cable( + a_terminations=[power_port], + label='Cable 9' + ), + Cable( + a_terminations=[power_outlet], + label='Cable 10' + ), + Cable( + a_terminations=[front_port], + label='Cable 11' + ), + Cable( + a_terminations=[rear_port], + label='Cable 12' + ), + Cable( + a_terminations=[power_feed], + label='Cable 13' + ), + Cable( + a_terminations=[circuit_termination], + label='Cable 14' ), ) for cable in cables: @@ -4825,7 +4864,7 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): def test_status(self): params = {'status': [LinkStatusChoices.STATUS_CONNECTED]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 11) params = {'status': [LinkStatusChoices.STATUS_PLANNED]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) @@ -4840,30 +4879,30 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): def test_device(self): devices = Device.objects.all()[:2] params = {'device_id': [devices[0].pk, devices[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 9) params = {'device': [devices[0].name, devices[1].name]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 9) def test_rack(self): racks = Rack.objects.all()[:2] params = {'rack_id': [racks[0].pk, racks[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 11) params = {'rack': [racks[0].name, racks[1].name]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 11) def test_location(self): locations = Location.objects.all()[:2] params = {'location_id': [locations[0].pk, locations[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 11) params = {'location': [locations[0].name, locations[1].name]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 11) def test_site(self): site = Site.objects.all()[:2] params = {'site_id': [site[0].pk, site[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 12) params = {'site': [site[0].slug, site[1].slug]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 12) def test_tenant(self): tenant = Tenant.objects.all()[:2] @@ -4875,8 +4914,8 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): def test_termination_types(self): params = {'termination_a_type': 'dcim.consoleport'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) - params = {'termination_b_type': 'dcim.consoleserverport'} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + # params = {'termination_b_type': 'dcim.consoleserverport'} + # self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) def test_termination_ids(self): interface_ids = CableTermination.objects.filter( @@ -4891,9 +4930,41 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): def test_unterminated(self): params = {'unterminated': True} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 8) params = {'unterminated': False} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 7) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + + def test_consoleport(self): + params = {'consoleport_id': [ConsolePort.objects.first().pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_consoleserverport(self): + params = {'consoleserverport_id': [ConsoleServerPort.objects.first().pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_powerport(self): + params = {'powerport_id': [PowerPort.objects.first().pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_poweroutlet(self): + params = {'poweroutlet_id': [PowerOutlet.objects.first().pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_frontport(self): + params = {'frontport_id': [FrontPort.objects.first().pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_rearport(self): + params = {'rearport_id': [RearPort.objects.first().pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_powerfeed(self): + params = {'powerfeed_id': [PowerFeed.objects.first().pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_circuittermination(self): + params = {'circuittermination_id': [CircuitTermination.objects.first().pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) class PowerPanelTestCase(TestCase, ChangeLoggedFilterSetTests): From 33af94257175994ec7952d6f0aa4170cecc20dbb Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 28 Dec 2023 15:56:22 -0500 Subject: [PATCH 225/271] Closes #14624: Add action object column to EventRuleTable --- netbox/extras/tables/tables.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/netbox/extras/tables/tables.py b/netbox/extras/tables/tables.py index e02365531..8482c5e24 100644 --- a/netbox/extras/tables/tables.py +++ b/netbox/extras/tables/tables.py @@ -275,7 +275,11 @@ class EventRuleTable(NetBoxTable): linkify=True ) action_type = tables.Column( - verbose_name=_('Action Type'), + verbose_name=_('Type'), + ) + action_object = tables.Column( + linkify=True, + verbose_name=_('Object'), ) content_types = columns.ContentTypesColumn( verbose_name=_('Content Types'), @@ -305,12 +309,13 @@ class EventRuleTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = EventRule fields = ( - 'pk', 'id', 'name', 'enabled', 'description', 'action_type', 'content_types', 'type_create', 'type_update', - 'type_delete', 'type_job_start', 'type_job_end', 'tags', 'created', 'last_updated', + 'pk', 'id', 'name', 'enabled', 'description', 'action_type', 'action_object', 'content_types', + 'type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end', 'tags', 'created', + 'last_updated', ) default_columns = ( - 'pk', 'name', 'enabled', 'action_type', 'content_types', 'type_create', 'type_update', 'type_delete', - 'type_job_start', 'type_job_end', + 'pk', 'name', 'enabled', 'action_type', 'action_object', 'content_types', 'type_create', 'type_update', + 'type_delete', 'type_job_start', 'type_job_end', ) From c1ff74894cb3eef299c883871f6434ffd5245af3 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 29 Dec 2023 09:21:06 -0500 Subject: [PATCH 226/271] #14036: Update import paths in example plugin code --- docs/plugins/development/index.md | 4 ++-- docs/plugins/development/navigation.md | 4 ++-- docs/plugins/development/views.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/plugins/development/index.md b/docs/plugins/development/index.md index d3f50a0fb..4db1d5ef6 100644 --- a/docs/plugins/development/index.md +++ b/docs/plugins/development/index.md @@ -69,7 +69,7 @@ The plugin source directory contains all the actual Python code and other resour The `PluginConfig` class is a NetBox-specific wrapper around Django's built-in [`AppConfig`](https://docs.djangoproject.com/en/stable/ref/applications/) class. It is used to declare NetBox plugin functionality within a Python package. Each plugin should provide its own subclass, defining its name, metadata, and default and required configuration parameters. An example is below: ```python -from extras.plugins import PluginConfig +from netbox.plugins import PluginConfig class FooBarConfig(PluginConfig): name = 'foo_bar' @@ -121,7 +121,7 @@ All required settings must be configured by the user. If a configuration paramet Plugin configuration parameters can be accessed using the `get_plugin_config()` function. For example: ```python - from extras.plugins import get_plugin_config + from netbox.plugins import get_plugin_config get_plugin_config('my_plugin', 'verbose_name') ``` diff --git a/docs/plugins/development/navigation.md b/docs/plugins/development/navigation.md index 8d7580147..dc895b2ab 100644 --- a/docs/plugins/development/navigation.md +++ b/docs/plugins/development/navigation.md @@ -5,7 +5,7 @@ A plugin can register its own submenu as part of NetBox's navigation menu. This is done by defining a variable named `menu` in `navigation.py`, pointing to an instance of the `PluginMenu` class. Each menu must define a label and grouped menu items (discussed below), and may optionally specify an icon. An example is shown below. ```python title="navigation.py" -from extras.plugins import PluginMenu +from netbox.plugins import PluginMenu menu = PluginMenu( label='My Plugin', @@ -49,7 +49,7 @@ menu_items = (item1, item2, item3) Each menu item represents a link and (optionally) a set of buttons comprising one entry in NetBox's navigation menu. Menu items are defined as PluginMenuItem instances. An example is shown below. ```python title="navigation.py" -from extras.plugins import PluginMenuButton, PluginMenuItem +from netbox.plugins import PluginMenuButton, PluginMenuItem from utilities.choices import ButtonColorChoices item1 = PluginMenuItem( diff --git a/docs/plugins/development/views.md b/docs/plugins/development/views.md index 3d0e87a68..1730b0ebd 100644 --- a/docs/plugins/development/views.md +++ b/docs/plugins/development/views.md @@ -206,7 +206,7 @@ For example, accessing `{{ request.user }}` within a template will return the cu Declared subclasses should be gathered into a list or tuple for integration with NetBox. By default, NetBox looks for an iterable named `template_extensions` within a `template_content.py` file. (This can be overridden by setting `template_extensions` to a custom value on the plugin's PluginConfig.) An example is below. ```python -from extras.plugins import PluginTemplateExtension +from netbox.plugins import PluginTemplateExtension from .models import Animal class SiteAnimalCount(PluginTemplateExtension): From 7c4b939b599547c0189c876a61aac9d922926142 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 29 Dec 2023 09:36:29 -0500 Subject: [PATCH 227/271] Revise v3.7 release notes --- docs/release-notes/version-3.7.md | 69 +++++++++++++++++-------------- 1 file changed, 38 insertions(+), 31 deletions(-) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index f1fba9372..127e241d7 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -1,48 +1,39 @@ # NetBox v3.7 -## v3.7-beta2 (FUTURE) - -### Bug Fixes - -* [#14432](https://github.com/netbox-community/netbox/issues/14432) - Fix hyperlinks for global search result attributes -* [#14472](https://github.com/netbox-community/netbox/issues/14472) - Fix display of hidden custom fields in object edit forms -* [#14499](https://github.com/netbox-community/netbox/issues/14499) - Relax requirements for encryption/auth algorithms on IKE & IPSec proposals -* [#14550](https://github.com/netbox-community/netbox/issues/14550) - Fix changing action type of existing event rule - -## v3.7-beta1 (2023-12-05) +## v3.7.0 (2023-12-29) ### Breaking Changes -* The following fields have been removed from the Webhook model: `content_types`, `type_create`, `type_update`, `type_delete`, `type_job_start`, `type_job_end`, `enabled`, and `conditions`. Webhooks are now tied to events via [event rules](../features/event-rules.md). Existing webhooks will have event rules created automatically upon upgrade. -* The `ui_visibility` field on the [custom field model](../models/extras/customfield.md) has been replaced with two new fields: `ui_visible` and `ui_editable`. Existing values will be migrated automatically upon upgrade. -* The `FeatureQuery` class for querying content types by model feature has been removed. Plugins should now use the new `with_feature()` manager method on NetBox's proxy model for ContentType. -* The ConfigRevision model has been moved from `extras` to `core`. Configuration history will be retained throughout the upgrade process. -* The L2VPN and L2VPNTermination models have been moved from the `ipam` app to the new `vpn` app. All object data will be retained, however please note that the relevant API endpoints have moved to `/api/vpn/`. +* The following fields have been removed from the Webhook model: `content_types`, `type_create`, `type_update`, `type_delete`, `type_job_start`, `type_job_end`, `enabled`, and `conditions`. Webhooks are now tied to events via [event rules](../features/event-rules.md). New event rules will be created for any existing webhooks automatically upon upgrade. +* The `ui_visibility` field on the [custom field model](../models/extras/customfield.md) has been replaced with two new fields: `ui_visible` and `ui_editable`. These new fields will have their values mapped from the original field automatically upon upgrade. +* The `FeatureQuery` class used internally for querying content types by model feature has been removed. It has been replaced by the new `with_feature()` manager method on NetBox's proxy model for ContentType (`core.models.ContentType`). +* The internal ConfigRevision model has moved from `extras` to `core`. Configuration history will be retained throughout the upgrade process. +* The [L2VPN](../models/vpn/l2vpn.md) and [L2VPNTermination](../models/vpn/l2vpntermination.md) models have moved from the `ipam` app to the new `vpn` app. All object data will be retained, however please note that the relevant API endpoints have likewise moved to `/api/vpn/`. * The `CustomFieldsMixin`, `SavedFiltersMixin`, and `TagsMixin` classes have moved from the `extras.forms.mixins` module to `netbox.forms.mixins`. ### New Features #### VPN Tunnels ([#9816](https://github.com/netbox-community/netbox/issues/9816)) -Several new models have been introduced to enable [VPN tunnel management](../features/vpn-tunnels.md). Users can now define tunnels with two or more terminations to replicate peer-to-peer or hub-and-spoke topologies. Each termination is made to a virtual interface on a device or VM. Additionally, users can define IKE and IPSec policies which can be applied to tunnels to document encryption and authentication strategies. +Several new models have been introduced to enable [VPN tunnel management](../features/vpn-tunnels.md). Users can now define tunnels with two or more terminations to represent peer-to-peer or hub-and-spoke topologies. Each termination is made to a virtual interface on a device or virtual machine. Additionally, users can define IKE and IPSec proposals and policies, which can be applied to tunnels to document encryption and authentication strategies. #### Event Rules ([#14132](https://github.com/netbox-community/netbox/issues/14132)) -This release introduces [event rules](../features/event-rules.md), which can be used to send webhooks or execute custom scripts automatically in response to NetBox events. For example, it's now possible to run a custom script whenever a new site is created with a particular status or tag. +This release introduces [event rules](../features/event-rules.md), which can be used to send webhooks or execute custom scripts automatically in response to events that occur in NetBox. For example, it's now possible to run a custom script whenever a new site is created with a particular status or tag. -Event rules replace and extend functionality that was previously built into the webhook model. Event rules will be created for any existing webhooks upon upgrade. +Event rules replace and extend functionality that was previously built into the webhook model. New event rules will be created for any existing webhooks automatically upon upgrade. #### Virtual Machine Disks ([#8356](https://github.com/netbox-community/netbox/issues/8356)) -A new [VirtualDisk](../models/virtualization/virtualdisk.md) model has been introduced to enable tracking the assignment of discrete virtual disks to virtual machines. The original `size` field has been retained on the VirtualMachine model, and will be automatically updated with the aggregate size of all assigned virtual disks. (Users who opt to eschew the new model may continue using the VirtualMachine `size` attribute as before.) +A new [VirtualDisk](../models/virtualization/virtualdisk.md) model has been introduced to enable tracking the assignment of discrete virtual disks to virtual machines. The `size` field has been retained on the VirtualMachine model, and will be populated automatically with the aggregate size of all assigned virtual disks. (Users who opt to eschew the new model may continue using the VirtualMachine `size` attribute independently as in previous releases.) #### Object Protection Rules ([#10244](https://github.com/netbox-community/netbox/issues/10244)) -A new [`PROTECTION_RULES`](../configuration/data-validation.md#protection_rules) configuration parameter is now available. Similar to how [custom validation rules](../customization/custom-validation.md) can be used to enforce certain values for object attributes, protection rules guard against the deletion of objects which do not meet specified criteria. This enables an administrator to prevent, for example, the deletion of a site which has a status of "active." +A new [`PROTECTION_RULES`](../configuration/data-validation.md#protection_rules) configuration parameter has been introduced. Similar to how [custom validation rules](../customization/custom-validation.md) can be used to enforce certain values for object attributes, protection rules guard against the deletion of objects which do not meet specified criteria. This enables an administrator to prevent, for example, the deletion of a site which has a status of "active." #### Improved Custom Field Visibility Controls ([#13299](https://github.com/netbox-community/netbox/issues/13299)) -The old `ui_visible` field on [the custom field model](../models/extras/customfield.md) has been replaced by two new fields, `ui_visible` and `ui_editable`, which control how and whether a custom field is displayed when view and editing an object, respectively. Separating these two functions into discrete fields enables more control over how each custom field is presented to users. The values of these fields will be appropriately set automatically during the upgrade process depending on the value of the original field. +The `ui_visible` field on [the custom field model](../models/extras/customfield.md) has been superseded by two new fields, `ui_visible` and `ui_editable`, which control how and whether a custom field is displayed when view and editing an object, respectively. Separating these two functions into discrete fields allows more control over how each custom field is presented to users. The values of these fields will be appropriately set automatically during the upgrade process from the value of the original field. #### Improved Global Search Results ([#14134](https://github.com/netbox-community/netbox/issues/14134)) @@ -61,17 +52,18 @@ Plugins can now [register their own data backends](../plugins/development/data-b * [#12135](https://github.com/netbox-community/netbox/issues/12135) - Avoid orphaned interfaces by preventing the deletion of interfaces which have children assigned * [#12216](https://github.com/netbox-community/netbox/issues/12216) - Add a `color` field for circuit types * [#13230](https://github.com/netbox-community/netbox/issues/13230) - Allow device types to be excluded from consideration when calculating a rack's utilization -* [#13334](https://github.com/netbox-community/netbox/issues/13334) - Added an `error` field to the Job model to record any errors associated with its execution -* [#13427](https://github.com/netbox-community/netbox/issues/13427) - Introduced a mechanism for omitting models from general-purpose lists of object types +* [#13334](https://github.com/netbox-community/netbox/issues/13334) - Add an `error` field to the Job model to record any errors associated with its execution +* [#13427](https://github.com/netbox-community/netbox/issues/13427) - Introduce a mechanism for excluding models from general-purpose lists of object types * [#13690](https://github.com/netbox-community/netbox/issues/13690) - Display any dependent objects to be deleted prior to deleting an object via the web UI * [#13794](https://github.com/netbox-community/netbox/issues/13794) - Any models with a relationship to Tenant are now included automatically in the list of related objects under the tenant view -* [#13808](https://github.com/netbox-community/netbox/issues/13808) - Added a `/render-config` REST API endpoint for virtual machines +* [#13808](https://github.com/netbox-community/netbox/issues/13808) - Add a `/render-config` REST API endpoint for virtual machines * [#14035](https://github.com/netbox-community/netbox/issues/14035) - Order objects of equivalent weight by value in global search results to improve readability -* [#14147](https://github.com/netbox-community/netbox/issues/14147) - Avoid recording empty changelog entries (and introduce `CHANGELOG_SKIP_EMPTY_CHANGES` config parameter) +* [#14147](https://github.com/netbox-community/netbox/issues/14147) - Avoid recording empty changelog entries via the new `CHANGELOG_SKIP_EMPTY_CHANGES` config parameter * [#14156](https://github.com/netbox-community/netbox/issues/14156) - Enable custom fields for contact assignments -* [#14240](https://github.com/netbox-community/netbox/issues/14240) - Increase maximum values for custom fields minimum & maximum validators +* [#14240](https://github.com/netbox-community/netbox/issues/14240) - Increase maximum values for custom field minimum & maximum numeric validators * [#14361](https://github.com/netbox-community/netbox/issues/14361) - Add a `description` field for webhooks -* [#14365](https://github.com/netbox-community/netbox/issues/14365) - Introduced `job_start` and `job_end` signals +* [#14365](https://github.com/netbox-community/netbox/issues/14365) - Introduce `job_start` and `job_end` signals to allow automated plugin actions +* [#14434](https://github.com/netbox-community/netbox/issues/14434) - Add model-specific termination object filters for cables (e.g. `interface_id` and `consoleport_id`) * [#14436](https://github.com/netbox-community/netbox/issues/14436) - Add PostgreSQL indexes for all GenericForeignKey fields * [#14579](https://github.com/netbox-community/netbox/issues/14579) - Allow users to specify a preferred language for UI translations @@ -82,16 +74,23 @@ Plugins can now [register their own data backends](../plugins/development/data-b * [#14145](https://github.com/netbox-community/netbox/issues/14145) - Add Portuguese translation * [#14266](https://github.com/netbox-community/netbox/issues/14266) - Add Russian translation +### Bug Fixes + +* [#14432](https://github.com/netbox-community/netbox/issues/14432) - Fix hyperlinks for global search result attributes +* [#14472](https://github.com/netbox-community/netbox/issues/14472) - Fix display of hidden custom fields in object edit forms +* [#14499](https://github.com/netbox-community/netbox/issues/14499) - Relax requirements for encryption/auth algorithms on IKE & IPSec proposals +* [#14550](https://github.com/netbox-community/netbox/issues/14550) - Fix changing action type of existing event rule + ### Other Changes -* [#13550](https://github.com/netbox-community/netbox/issues/13550) - Optimized the format for declaring view actions under `ActionsMixin` (backward compatibility has been retained) +* [#13550](https://github.com/netbox-community/netbox/issues/13550) - Optimize the format for declaring view actions under `ActionsMixin` (backward compatibility has been retained) * [#13645](https://github.com/netbox-community/netbox/issues/13645) - Installation of the `sentry-sdk` Python library is now required only if Sentry reporting is enabled * [#14036](https://github.com/netbox-community/netbox/issues/14036) - Move plugin resources from the `extras` app into `netbox` (backward compatibility has been retained) -* [#14153](https://github.com/netbox-community/netbox/issues/14153) - Replace `FeatureQuery` with new `with_feature()` method on ContentType manager +* [#14153](https://github.com/netbox-community/netbox/issues/14153) - Replace `FeatureQuery` with new `with_feature()` method on proxy ContentType manager * [#14311](https://github.com/netbox-community/netbox/issues/14311) - Move the L2VPN models from the `ipam` app to the new `vpn` app * [#14312](https://github.com/netbox-community/netbox/issues/14312) - Move the ConfigRevision model from the `extras` app to `core` * [#14326](https://github.com/netbox-community/netbox/issues/14326) - Form feature mixin classes have been moved from the `extras` app to `netbox` -* [#14395](https://github.com/netbox-community/netbox/issues/14395) - Moved `extras.webhooks_worker.process_webhook()` to `extras.webhooks.send_webhook()` (backward compatibility has been retained) +* [#14395](https://github.com/netbox-community/netbox/issues/14395) - Move `extras.webhooks_worker.process_webhook()` to `extras.webhooks.send_webhook()` (backward compatibility has been retained) * [#14424](https://github.com/netbox-community/netbox/issues/14424) - Remove change logging functionality from StagedChange * [#14458](https://github.com/netbox-community/netbox/issues/14458) - Remove the obsolete `clearcache` management command * [#14536](https://github.com/netbox-community/netbox/issues/14536) - Enforce uniqueness by default for non-VRF prefixes & IP addresses (`ENFORCE_GLOBAL_UNIQUE` now defaults to true) @@ -116,7 +115,15 @@ Plugins can now [register their own data backends](../plugins/development/data-b * core.Job * Added the read-only `error` character field * extras.Webhook - * Removed the following fields: `content_types`, `type_create`, `type_update`, `type_delete`, `type_job_start`, `type_job_end`, `enabled`, and `conditions` (these have been moved to the new `EventRule` model) + * Removed the following fields (these have been moved to the new `EventRule` model): + * `content_types` + * `type_create` + * `type_update` + * `type_delete` + * `type_job_start` + * `type_job_end` + * `enabled` + * `conditions` * Add the optional `description` field * dcim.DeviceType * Added the `exclude_from_utilization` boolean field From d99e6510e112654449d00d7498317b1423503694 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 29 Dec 2023 09:43:09 -0500 Subject: [PATCH 228/271] Release v3.7.0 --- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- netbox/netbox/settings.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 37848a318..ba3fdd75d 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -23,7 +23,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v3.6.9 + placeholder: v3.7.0 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 006fb64fc..73fdaed8f 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.6.9 + placeholder: v3.7.0 validations: required: true - type: dropdown diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 00f7c33b4..faf372c2c 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -28,7 +28,7 @@ from netbox.plugins import PluginConfig # Environment setup # -VERSION = '3.7-beta1' +VERSION = '3.7.0' # Hostname HOSTNAME = platform.node() From 982ef3045d50b576ae1f73bbc0713fd9da6c7924 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 29 Dec 2023 10:06:51 -0500 Subject: [PATCH 229/271] PRVB --- docs/release-notes/version-3.7.md | 4 ++++ netbox/netbox/settings.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 127e241d7..7339234e3 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -1,5 +1,9 @@ # NetBox v3.7 +## v3.7.1 (FUTURE) + +--- + ## v3.7.0 (2023-12-29) ### Breaking Changes diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index faf372c2c..9aae6c219 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -28,7 +28,7 @@ from netbox.plugins import PluginConfig # Environment setup # -VERSION = '3.7.0' +VERSION = '3.7.1-dev' # Hostname HOSTNAME = platform.node() From 109daca203381ab2af99dbf4bb423057851df6ee Mon Sep 17 00:00:00 2001 From: Abraham Vegh Date: Sun, 31 Dec 2023 19:54:30 -0500 Subject: [PATCH 230/271] Add missing word --- docs/features/synchronized-data.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/synchronized-data.md b/docs/features/synchronized-data.md index a070d0ce1..8c95c8779 100644 --- a/docs/features/synchronized-data.md +++ b/docs/features/synchronized-data.md @@ -1,6 +1,6 @@ # Synchronized Data -Several models in NetBox support the automatic synchronization of local data from a designated remote source. For example, [configuration templates](./configuration-rendering.md) defined in NetBox can source their content from text files stored in a remote git repository. This accomplished using the core [data source](../models/core/datasource.md) and [data file](../models/core/datafile.md) models. +Several models in NetBox support the automatic synchronization of local data from a designated remote source. For example, [configuration templates](./configuration-rendering.md) defined in NetBox can source their content from text files stored in a remote git repository. This is accomplished using the core [data source](../models/core/datasource.md) and [data file](../models/core/datafile.md) models. To enable remote data synchronization, the NetBox administrator first designates one or more remote data sources. NetBox currently supports the following source types: From c78a792cccfdbe6f373c0d474b1620e56e5f9cf8 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 3 Jan 2024 10:57:29 -0500 Subject: [PATCH 231/271] #14132: Annotate WebhooksMixin renaming under breaking changes --- docs/release-notes/version-3.7.md | 1 + netbox/netbox/models/features.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 7339234e3..711e5085f 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -14,6 +14,7 @@ * The internal ConfigRevision model has moved from `extras` to `core`. Configuration history will be retained throughout the upgrade process. * The [L2VPN](../models/vpn/l2vpn.md) and [L2VPNTermination](../models/vpn/l2vpntermination.md) models have moved from the `ipam` app to the new `vpn` app. All object data will be retained, however please note that the relevant API endpoints have likewise moved to `/api/vpn/`. * The `CustomFieldsMixin`, `SavedFiltersMixin`, and `TagsMixin` classes have moved from the `extras.forms.mixins` module to `netbox.forms.mixins`. +* The `netbox.models.features.WebhooksMixin` class has been renamed to `EventRulesMixin`. ### New Features diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index 0cba27318..a13b84bed 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -30,13 +30,13 @@ __all__ = ( 'CustomFieldsMixin', 'CustomLinksMixin', 'CustomValidationMixin', + 'EventRulesMixin', 'ExportTemplatesMixin', 'ImageAttachmentsMixin', 'JobsMixin', 'JournalingMixin', 'SyncedDataMixin', 'TagsMixin', - 'EventRulesMixin', ) From ea5d33f35821ef1273b278737ab1d71c5ce661a1 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 5 Jan 2024 11:52:14 -0500 Subject: [PATCH 232/271] Fixes #14663: Fix terminating to a VM interface when creating a new tunnel --- netbox/vpn/forms/model_forms.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netbox/vpn/forms/model_forms.py b/netbox/vpn/forms/model_forms.py index 3068bfac2..06e20b282 100644 --- a/netbox/vpn/forms/model_forms.py +++ b/netbox/vpn/forms/model_forms.py @@ -7,7 +7,7 @@ from ipam.models import IPAddress, RouteTarget, VLAN from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField -from utilities.forms.utils import add_blank_choice +from utilities.forms.utils import add_blank_choice, get_field_value from utilities.forms.widgets import HTMXSelect from virtualization.models import VirtualMachine, VMInterface from vpn.choices import * @@ -157,7 +157,7 @@ class TunnelCreateForm(TunnelForm): def __init__(self, *args, initial=None, **kwargs): super().__init__(*args, initial=initial, **kwargs) - if initial and initial.get('termination1_type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE: + if get_field_value(self, 'termination1_type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE: self.fields['termination1_parent'].label = _('Virtual Machine') self.fields['termination1_parent'].queryset = VirtualMachine.objects.all() self.fields['termination1_termination'].queryset = VMInterface.objects.all() @@ -168,7 +168,7 @@ class TunnelCreateForm(TunnelForm): 'virtual_machine_id': '$termination1_parent', }) - if initial and initial.get('termination2_type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE: + if get_field_value(self, 'termination2_type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE: self.fields['termination2_parent'].label = _('Virtual Machine') self.fields['termination2_parent'].queryset = VirtualMachine.objects.all() self.fields['termination2_termination'].queryset = VMInterface.objects.all() From 5223486fd820188cf35ab96b9817588504d1981f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 5 Jan 2024 13:56:17 -0500 Subject: [PATCH 233/271] Fixes #14709: Correct typo in TYPE_VIRTUALMACHINE --- netbox/vpn/choices.py | 4 ++-- netbox/vpn/forms/model_forms.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/netbox/vpn/choices.py b/netbox/vpn/choices.py index a272060e9..edbc1fdaf 100644 --- a/netbox/vpn/choices.py +++ b/netbox/vpn/choices.py @@ -38,11 +38,11 @@ class TunnelEncapsulationChoices(ChoiceSet): class TunnelTerminationTypeChoices(ChoiceSet): # For TunnelCreateForm TYPE_DEVICE = 'dcim.device' - TYPE_VIRUTALMACHINE = 'virtualization.virtualmachine' + TYPE_VIRTUALMACHINE = 'virtualization.virtualmachine' CHOICES = ( (TYPE_DEVICE, _('Device')), - (TYPE_VIRUTALMACHINE, _('Virtual Machine')), + (TYPE_VIRTUALMACHINE, _('Virtual Machine')), ) diff --git a/netbox/vpn/forms/model_forms.py b/netbox/vpn/forms/model_forms.py index 06e20b282..6d7961e5a 100644 --- a/netbox/vpn/forms/model_forms.py +++ b/netbox/vpn/forms/model_forms.py @@ -157,7 +157,7 @@ class TunnelCreateForm(TunnelForm): def __init__(self, *args, initial=None, **kwargs): super().__init__(*args, initial=initial, **kwargs) - if get_field_value(self, 'termination1_type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE: + if get_field_value(self, 'termination1_type') == TunnelTerminationTypeChoices.TYPE_VIRTUALMACHINE: self.fields['termination1_parent'].label = _('Virtual Machine') self.fields['termination1_parent'].queryset = VirtualMachine.objects.all() self.fields['termination1_termination'].queryset = VMInterface.objects.all() @@ -168,7 +168,7 @@ class TunnelCreateForm(TunnelForm): 'virtual_machine_id': '$termination1_parent', }) - if get_field_value(self, 'termination2_type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE: + if get_field_value(self, 'termination2_type') == TunnelTerminationTypeChoices.TYPE_VIRTUALMACHINE: self.fields['termination2_parent'].label = _('Virtual Machine') self.fields['termination2_parent'].queryset = VirtualMachine.objects.all() self.fields['termination2_termination'].queryset = VMInterface.objects.all() @@ -265,7 +265,7 @@ class TunnelTerminationForm(NetBoxModelForm): def __init__(self, *args, initial=None, **kwargs): super().__init__(*args, initial=initial, **kwargs) - if initial and initial.get('type') == TunnelTerminationTypeChoices.TYPE_VIRUTALMACHINE: + if initial and initial.get('type') == TunnelTerminationTypeChoices.TYPE_VIRTUALMACHINE: self.fields['parent'].label = _('Virtual Machine') self.fields['parent'].queryset = VirtualMachine.objects.all() self.fields['termination'].queryset = VMInterface.objects.all() From e1e198ec4f9b4d6bb70b8cebd91dceaff0394e78 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 5 Jan 2024 14:31:38 -0500 Subject: [PATCH 234/271] Fixes #14706: Relax one-to-one mapping of tunnel termination to IP address --- ..._ipaddress_multiple_tunnel_terminations.py | 20 +++++++++++++++++++ netbox/vpn/models/tunnels.py | 4 ++-- 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 netbox/vpn/migrations/0003_ipaddress_multiple_tunnel_terminations.py diff --git a/netbox/vpn/migrations/0003_ipaddress_multiple_tunnel_terminations.py b/netbox/vpn/migrations/0003_ipaddress_multiple_tunnel_terminations.py new file mode 100644 index 000000000..2747669ae --- /dev/null +++ b/netbox/vpn/migrations/0003_ipaddress_multiple_tunnel_terminations.py @@ -0,0 +1,20 @@ +# Generated by Django 4.2.8 on 2024-01-05 19:31 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0069_gfk_indexes'), + ('vpn', '0002_move_l2vpn'), + ] + + operations = [ + migrations.AlterField( + model_name='tunneltermination', + name='outside_ip', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='tunnel_terminations', to='ipam.ipaddress'), + ), + ] diff --git a/netbox/vpn/models/tunnels.py b/netbox/vpn/models/tunnels.py index be1e40142..6f4fa4182 100644 --- a/netbox/vpn/models/tunnels.py +++ b/netbox/vpn/models/tunnels.py @@ -129,10 +129,10 @@ class TunnelTermination(CustomFieldsMixin, CustomLinksMixin, TagsMixin, ChangeLo ct_field='termination_type', fk_field='termination_id' ) - outside_ip = models.OneToOneField( + outside_ip = models.ForeignKey( to='ipam.IPAddress', on_delete=models.PROTECT, - related_name='tunnel_termination', + related_name='tunnel_terminations', blank=True, null=True ) From 9603644ca2acf7caabb7a238222991a4773c1df1 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 10 Jan 2024 13:05:01 -0500 Subject: [PATCH 235/271] Update README & UI screenshots (#14763) * Refresh README content * Formatting cleanup * Add badge links * More cleanup * Update getting started section * Add reference architecture diagram * Add intro docs link * Rearrange & expand text * More restructuring * Update screenshots * Tweak image widths * Tweak screenshots * Add NetBox Cloud logo * Fix wrapping * Add titles for screenshots * Jumping through more formatting hoops * Final cleanup * Add links for plugin resources --- README.md | 153 +++++++++++++-------- docs/index.md | 2 +- docs/media/misc/netbox_cloud.png | Bin 0 -> 6946 bytes docs/media/misc/reference_architecture.png | Bin 0 -> 46651 bytes docs/media/screenshots/cable-trace.png | Bin 102173 -> 212385 bytes docs/media/screenshots/home-dark.png | Bin 177231 -> 323151 bytes docs/media/screenshots/home-light.png | Bin 0 -> 316808 bytes docs/media/screenshots/netbox-ui.png | Bin 174655 -> 0 bytes docs/media/screenshots/prefixes-list.png | Bin 118254 -> 364450 bytes docs/media/screenshots/rack.png | Bin 83146 -> 240919 bytes 10 files changed, 99 insertions(+), 56 deletions(-) create mode 100644 docs/media/misc/netbox_cloud.png create mode 100644 docs/media/misc/reference_architecture.png create mode 100644 docs/media/screenshots/home-light.png delete mode 100644 docs/media/screenshots/netbox-ui.png diff --git a/README.md b/README.md index 6e50e5687..14881dd13 100644 --- a/README.md +++ b/README.md @@ -1,86 +1,129 @@
    NetBox logo -

    The premier source of truth powering network automation

    - CI status +

    The cornerstone of every automated network

    + Latest release + License + Contributors + GitHub stars + Languages supported + CI status

    -NetBox is the leading solution for modeling and documenting modern networks. By -combining the traditional disciplines of IP address management (IPAM) and -datacenter infrastructure management (DCIM) with powerful APIs and extensions, -NetBox provides the ideal "source of truth" to power network automation. -Available as open source software under the Apache 2.0 license, NetBox serves -as the cornerstone for network automation in thousands of organizations. +NetBox exists to empower network engineers. Since its release in 2016, it has become the go-to solution for modeling and documenting network infrastructure for thousands of organizations worldwide. As a successor to legacy IPAM and DCIM applications, NetBox provides a cohesive, extensive, and accessible data model for all things networked. By providing a single robust user interface and programmable APIs for everything from cable maps to device configurations, NetBox serves as the central source of truth for the modern network. -* **Physical infrastructure:** Accurately model the physical world, from global regions down to individual racks of gear. Then connect everything - network, console, and power! -* **Modern IPAM:** All the standard IPAM functionality you expect, plus VRF import/export tracking, VLAN management, and overlay support. -* **Data circuits:** Confidently manage the delivery of critical circuits from various service providers, modeled seamlessly alongside your own infrastructure. -* **Power tracking:** Map the distribution of power from upstream sources to individual feeds and outlets. -* **Organization:** Manage tenant and contact assignments natively. -* **Powerful search:** Easily find anything you need using a single global search function. -* **Comprehensive logging:** Leverage both automatic change logging and user-submitted journal entries to track your network's growth over time. -* **Endless customization:** Custom fields, custom links, tags, export templates, custom validation, reports, scripts, and more! -* **Flexible permissions:** An advanced permissions systems enables very flexible delegation of permissions. -* **Integrations:** Easily connect NetBox to your other tooling via its REST & GraphQL APIs. -* **Plugins:** Not finding what you need in the core application? Try one of many community plugins - or build your own! +

    + NetBox's Role | + Why NetBox? | + Getting Started | + Get Involved | + Project Stats | + Screenshots +

    -![Screenshot of NetBox UI](docs/media/screenshots/netbox-ui.png "NetBox UI") +

    + NetBox user interface screenshot +

    + +## NetBox's Role + +NetBox functions as the **source of truth** for your network infrastructure. Its job is to define and validate the _intended state_ of all network components and resources. NetBox does not interact with network nodes directly; rather, it makes this data available programmatically to purpose-built automation, monitoring, and assurance tools. This separation of duties enables the construction of a robust yet flexible automation system. + +

    + Reference network automation architecture +

    + +The diagram above illustrates the recommended deployment architecture for an automated network, leveraging NetBox as the central authority for network state. This approach allows your team to swap out individual tools to meet changing needs while retaining a predictable, modular workflow. + +## Why NetBox? + +### Comprehensive Data Model + +Racks, devices, cables, IP addresses, VLANs, circuits, power, VPNs, and lots more: NetBox is built for networks. Its comprehensive and thoroughly inter-linked data model provides for natural and highly structured modeling of myriad network primitives that just isn't possible using general-purpose tools. And there's no need to waste time contemplating how to build out a database: Everything is ready to go upon installation. + +### Focused Development + +NetBox strives to meet a singular goal: Provide the best available solution for making network infrastructure programmatically accessible. Unlike "all-in-one" tools which awkwardly bolt on half-baked features in an attempt to check every box, NetBox is committed to its core function. NetBox provides the best possible solution for modeling network infrastructure, and provides rich APIs for integrating with tools that excel in other areas of network automation. + +### Extensible and Customizable + +No two networks are exactly the same. Users are empowered to extend NetBox's native data model with custom fields and tags to best suit their unique needs. You can even write your own plugins to introduce entirely new objects and functionality! + +### Flexible Permissions + +NetBox includes a fully customizable permission system, which affords administrators incredible granularity when assigning roles to users and groups. Want to restrict certain users to working only with cabling and not be able to change IP addresses? Or maybe each team should have access only to a particular tenant? NetBox enables you to craft roles as you see fit. + +### Custom Validation & Protection Rules + +The data you put into NetBox is crucial to network operations. In addition to its robust native validation rules, NetBox provides mechanisms for administrators to define their own custom validation rules for objects. Custom validation can be used both to ensure new or modified objects adhere to a set of rules, and to prevent the deletion of objects which don't meet certain criteria. (For example, you might want to prevent the deletion of a device with an "active" status.) + +### Device Configuration Rendering + +NetBox can render user-created Jinja2 templates to generate device configurations from its own data. Configuration templates can be uploaded individually or pulled automatically from an external source, such as a git repository. Rendered configurations can be retrieved via the REST API for application directly to network devices via a provisioning tool such as Ansible or Salt. + +### Custom Scripts + +Complex workflows, such as provisioning a new branch office, can be tedious to carry out via the user interface. NetBox allows you to write and upload custom scripts that can be run directly from the UI. Scripts prompt users for input and then automate the necessary tasks to greatly simplify otherwise burdensome processes. + +### Automated Events + +Users can define event rules to automatically trigger a custom script or outbound webhook in response to a NetBox event. For example, you might want to automatically update a network monitoring service whenever a new device is added to NetBox, or update a DHCP server when an IP range is allocated. + +### Comprehensive Change Logging + +NetBox automatically logs the creation, modification, and deletion of all managed objects, providing a thorough change history. Changes can be attributed to the executing user, and related changes are grouped automatically by request ID. + +> [!NOTE] +> A complete list of NetBox's myriad features can be found in [the introductory documentation](https://docs.netbox.dev/en/stable/introduction/). ## Getting Started -
    - - [![NetBox logo](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/deploy/deploy1.png)](https://github.com/netbox-community/netbox) -            - [![Docker logo](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/deploy/deploy2.png)](https://github.com/netbox-community/netbox-docker) -            - [![NetBox Labs logo](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/deploy/deploy3.png)](https://netboxlabs.com/netbox-cloud/) - -
    - * Just want to explore? Check out [our public demo](https://demo.netbox.dev/) right now! * The [official documentation](https://docs.netbox.dev) offers a comprehensive introduction. * Check out [our wiki](https://github.com/netbox-community/netbox/wiki/Community-Contributions) for even more projects to get the most out of NetBox! +

    + NetBox Cloud
    + Looking for an enterprise solution? Check out NetBox Cloud! +

    + ## Get Involved * Follow [@NetBoxOfficial](https://twitter.com/NetBoxOfficial) on Twitter! * Join the conversation on [the discussion forum](https://github.com/netbox-community/netbox/discussions) and [Slack](https://netdev.chat/)! * Already a power user? You can [suggest a feature](https://github.com/netbox-community/netbox/issues/new?assignees=&labels=type%3A+feature&template=feature_request.yaml) or [report a bug](https://github.com/netbox-community/netbox/issues/new?assignees=&labels=type%3A+bug&template=bug_report.yaml) on GitHub. * Contributions from the community are encouraged and appreciated! Check out our [contributing guide](CONTRIBUTING.md) to get started. +* [Share your idea](https://plugin-ideas.netbox.dev/) for a new plugin, or [learn how to build one](https://github.com/netbox-community/netbox-plugin-tutorial) yourself! ## Project Stats -
    +

    Timeline graph Issues graph Pull requests graph Top contributors
    Stats via Repography -

    - -## Sponsors - -
    - - [![NetBox Labs](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/sponsors/netbox_labs.png)](https://netboxlabs.com) -            - [![DigitalOcean](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/sponsors/digitalocean.png)](https://try.digitalocean.com/developer-cloud) -            - [![Sentry](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/sponsors/sentry.png)](https://sentry.io) -
    - [![Equinix Metal](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/sponsors/equinix.png)](https://metal.equinix.com) -            - [![OneMind Services](https://raw.githubusercontent.com/wiki/netbox-community/netbox/images/sponsors/onemind_services.png)](https://onemindservices.com) - -
    +

    ## Screenshots -![Screenshot of main page (dark mode)](docs/media/screenshots/home-dark.png "Main page (dark mode)") - -![Screenshot of rack elevation](docs/media/screenshots/rack.png "Rack elevation") - -![Screenshot of prefixes hierarchy](docs/media/screenshots/prefixes-list.png "Prefixes hierarchy") - -![Screenshot of cable trace](docs/media/screenshots/cable-trace.png "Cable tracing") +

    + NetBox Dashboard (Light Mode)
    + NetBox dashboard (light mode) +

    +

    + NetBox Dashboard (Dark Mode)
    + NetBox dashboard (dark mode) +

    +

    + Prefixes List
    + Prefixes list +

    +

    + Rack View
    + Rack view +

    +

    + Cable Trace
    + Cable trace +

    diff --git a/docs/index.md b/docs/index.md index 84334337b..5ef650ca6 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,7 +4,7 @@ NetBox is the leading solution for modeling and documenting modern networks. By combining the traditional disciplines of IP address management (IPAM) and datacenter infrastructure management (DCIM) with powerful APIs and extensions, NetBox provides the ideal "source of truth" to power network automation. Read on to discover why thousands of organizations worldwide put NetBox at the heart of their infrastructure. -[![NetBox UI](./media/screenshots/netbox-ui.png)](./media/screenshots/netbox-ui.png) +[![NetBox UI](./media/screenshots/home-light.png)](./media/screenshots/home-light.png) ## :material-server-network: Built for Networks diff --git a/docs/media/misc/netbox_cloud.png b/docs/media/misc/netbox_cloud.png new file mode 100644 index 0000000000000000000000000000000000000000..f9deca67446d6b6a569b1006f505cfb592191e0b GIT binary patch literal 6946 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 HwvYKA-$)3* literal 0 HcmV?d00001 diff --git a/docs/media/misc/reference_architecture.png b/docs/media/misc/reference_architecture.png new file mode 100644 index 0000000000000000000000000000000000000000..89ed4478d3b301e5c6aff84d162bf9c2d6db5773 GIT binary patch literal 46651 zcmdqJWk8c{_&7R6L4MZ3yQUVeZPMR@tqhSg!Avs{9 zVIoqaL>Rs8Jox_f{r%7Raz30-=lKMCc3*X0_tp1a>uRer&~ng%Kp=)k4^^LnKvYN& z=%nUz+=-ZYgZ^%B`-}d! z_6QENZIC<{Gezy~)@MW)o4mSDodEFu|Kd@E{7fvKlNVlyBXz`O)C?%)ZcHrN98%cN zTzaFX!|B&u)Y!pQD)RHSqe5torTlN6d3x9ab_ZtU>?Z1R)$vm6vxCDs;|{h=%7;j> zTwc|^0;eMx(hI8J-&OgF^_+}t@xots$qflmw!U%|TWrfOpoAM+BRxO$`zx<{uk6Nh zN;pl($McF!omWox9<3`$^xHtkSY{u8;n~XG8{BEQ^U;}y*6(qghHa#1Wh<=t;f5pU zV$3kd${AR;Lt=M=Wf>3e{VBpJ1twrg#XbV}{nWG@aoo7UW!~8^XN!v2fqtmmGtM9q zS79u@$p9Y#sZ26wygDg?%yp*_qX#+U(`O#4pCOtF72nyPr-Mc?f(^jU4z^EADkl`O z`5vHf*A#>q$NLB@aFo(^NNG*R#k^WBd0X)jx)p{-nnCggvGoM#8QojPPn_F&h6cC4 z=JB~?;T9zed$kRXcBe;YB0EAO#Bf5h3)8>b>b|tCv(4i#GVQ3syWFa60n{54o%HxoR_MJSE1F zaho^cevPNj7Wsv^FlAM0~6!H7_4M z&pWcrG}MDW+#8W_)Xyu-cX2@JZ`O6gtI{dNxI_)HxrQlC@zK&6@rgUt6;0bj2Hss*8S+BIn z>|pSXHYV3OSZZlXJ#@4>yy!b?Ng8kG_nQok!ybstZ*9XnLNyFOQIJ=cuObb=xzr;^ zzfQku-3?!|D3z8!OET9lL|^ot>B)kT)R}Np>kzUB26qS2Ngx_G6%-%cW)TuS!W%as zd7=rTomifdT&$aiYfKJJqLhUr4wLRJx=SLQAt!j+AX04 zW?-AgS;0c`?E3iCg(MoCec{S;lx%cwOtu8Ay+cYF@MqyrkFn#KBvH7CV~M6s^e){e z+KnoniQRsEj;q(}?nN(@nmPMuGjXjLDT!^XFL-zoyoN4wtNTF>o71JsG~fSZKm^`3 zNGz!hjOUTw?L?3>-i#($v4F}j3m5n}g>tY7hj z8pk_bByXi?q%xCz#kJU@6y^T50egScPeAjzd^F)OE#iJB_FNFrCLqcm7n( zY>1n(HLzc(1~2YuPOG1TD(cgz2CVk2xDAf{8#WHMW!so7KPCOeWa=ke!q=C?f;GY& z_^Nl3%Fcd*_4YrM=TIf)6R?#^$T6(55;6xKuWz($Tw+gDG*!bAyBoZW7%S%Hl#(qL zuOnxm{ThptYhdyRf$i;GRFcsh&!nIWdUKKpP)U%!)1-mFh_9zj|3!$Zlj)@~Qzh@~@pEoi>Fk8_Sl?UK{LDLP z+-Zuyo~h|}ddM}kz;JrcT`f7i4Q)1Q*W8sZmS3&+6qD^@-_sn0&FIU$j#F^N*)zQK z)yd3)As8C27%d`J{2007&VKTS2*G>HTSHU?aybTc7_VGh=b#oDa4K?$_Rg%V8~`*f zvefI%ZWUctZf_07{j-7&`eg!c47xjngx*&!Qb1yb+=cn-XyS88(QIX9hn`NR3%Zjc z0iM|F#U40wWxEQgC26gW=`D&SQ$8_Bak|X{XQ>P|oSZWcXR{7pnuQ1P3Erjs6xHbV zrIiNwztK{%*utRP%Wvs2)?#q;CN4&#w%7>YZ$!>CJFpL+sx&9JKk5IW@ zeN^$`)zX;Tn}oR;9ztazV>pR0|ZnE1mkbLfM!3QlirB!a} z&Xz?PKn)qkNi~rwKBa^^ICu$_?aA`kc6jz$ncJ@wE$(>%>mXZ zxhsl27|V&M6J!UYDzO&71|}IA`_mhkLC<*Dxm6|GnZuWE7v^12ky|?|)wrlCSN*s! zpD^$+A?Ue4QeH?BeGz}M^Q$F0A?5{o!_4y2gPv2DpBg=~{iHy@c2&t+Q!-*q5~+Oa z=MoR$>w7Dsqs`*`46Gvw(HEE1_hv%D{} zPqe#i9(0*l<1|gfrJ|C~)dKTj>=CydQP=ahSbI|iZZUsT>0niVsa#d_^^c`sr^W6 zxDSVYLPx>>2~lZuXIj(aRFx~U4lf!t52)i^Yq%>e(ULiFg-aEmlZ~;LtN9Y57f5ya zDmK31tB@blJs$#gtu#??v|CI<;($@AmPJeSosxk$Li|$4=_g#D0x}!Qh0Zp#khP$O zvm!1OPSxEY9HQj<_GhE(Q8%>ApO_al==mIqD`BlmZu6DI+o&4E7mfbPy{~E#S-RfBHJ62)2I>Ahj{b|>9Z*%-{PFEdi@KTS zulhd(nSl`)B2rofUSCB(c{^?=KaElNC-J30KFffH+QW{ogE`O<1@}j70Y|W=N6--l zp{F`!n#~K-MK3&yhD=f(&xr{w1rKF?#k@JIlx!c2f1tF;WM=PRP`?rcKqC<@&*{X4 zvU!^~Dev=#8bmjXBfoDbEjqo`J_u@z6c1Jrz!rJ5b!TqNQSMwS@Ah}(H#=-t;YxWk z;N)U`NRBuSxG72=P4KrTMn=2jf`WoW8#|gV46R()NE?2SWIA;1r4!XZiLjJnz3GcO z@WcAv4`cGt^rbPwa+a=i?1oWSXjhbcWf^fMffch8+;aDj9JGiAlicj@#7`=W-;xLg zdzlv8S`0%QgA{rFsO78PnKxA62P4FXGIFfmH7S5J+pj7unpyIqsHehBKp^UPXnY*Q zyQu0e|F;Z7M)d}JFeRJtPVd->;G_{@1LAl7>GD_GDb!pdF$A1m!=Bm2sJA|TUIM82 zm9MMkh~6Hs$Wg~_ ztk5I)twZ9aq5O4w`|X2x4V?*}?EV`NnI)HJd>fTY2Nfa=`G$4S?DlcNXp6h$UWdu7 zg)2k*2YigX=3RR$GO@X8Z=jWp_$Y-^Dd#8FGO!bXlTxs9kSk4`Zp#=e%uMG}R1vUg z75k*NYrmXio-28MZeBA>UI1~$tRqN}tGjJ}k@1OdQK$YU$3kNxYvF+gaqK;2DPMCx z#(z35+XU^_9T8U^Xmq&z#dAo!1af(WreF`q_25x>k^P32N~KXpqeoWfaHJA}lqf)qAc2Mh)aJ4#G$hBUBCd^ zl9g=W+p1VSDQvd;Rvw(n;TFCWV`XR^`JaNasf&+YLKi0u9 zD1uMhG59}`s^v5+KHKWeU{ztRuA1+|=&zaTT_7CU7i8cN&TVy4BcDT7*Qq2oqF`(3 zFs-NWV10Sz3jUgDzGMRH(Dwrsy#G=frm4)?eSAvbFowM_T@s9^4Q1qRmf^USHQz0x z()jF4_%4_^Fv|ULt=cheKI4oJAJqHPMeQ|JRN59@BJYnFzQtEcUxb+rHU(_W%u&i{ z=)`N7Ilh@(XAoea8@)3rdqbkETyC$kB1+fnXD{MITL_T3e6*MIN!sr`f-5KeSiBxW zCSUKxFPO8RE60&7Lw+tH#qLfQdzGIVHjoWaxzC8x$(1V2h$_jR8<_G-+h06_x6N(% z;P*U2+qrNaZWEB9-76%$??;yG(p)+PGwCwssY8$*a$B1#9z!l7Toj#s?c8QDX4$_N zG*P+Dqed#<`7L4Smo@nt@_|olM|Zylotw!t+~3>u6B<@5-Im-^)4NYnV)0&nMIl?-btY-xck0=D0B@^Se;1Qyd1 z5~c{Ez=Mbvy17UA!)LJHCqv-ITy;zHO))Wr98WN~DGB=Jjih8tbAZ)#dk6QR&3mHm zM7mjf^~nNXul3L*p}(eM5M~%r6%tohAP?KP+hPB=$wcF$6gfW%h=s&^j>#=jUT#D4(CTt0V$0 zBFH$@p?@`k2Es?Nne@OL(L}H?>qSM_xSyTeLra3fGVNzuBV{Hy@sx4e?W1w3pJHsV zI~Sl5O8rIhwF~*k`<6W;>di=wxDr=;2ip?EQcL!oCa1Kjz>8U)B(JUc54)j|wJPDY z%@LPknq5DleI%SR+Yv0SyB`);@OHwu(-s4l`XSfI>nU78PIJY5%%7So5KI?fEeoxg*3!d14_n?LW zd=|^z*}M|w7qX)g&ie-J;xHwtCUV$@yRZ$_$)Qe!V@?B-pC0WtNM&B86S#_#vYJZQ znNDU|bY8vA>q3TXn8*tV%Bv@{LPt0f@Z&)S&aEUm7#X7mr#AE(^TnI&?E2Q>78%r7 zK`+h+Q5`~?)6K2io!}ST{Ljqi3M0=-2lUUw66@U`n1eHg*abJ$ouyH0^a#UwVia4? zc8xpXOwgH5&6wVjK#-&_(#OQ?G2N}NnakBfUv;~05KGXd~ul)KBYxH{rjGLOI(q{q>F<)!f)&5=gy5 z?dkrR+`F1}?pMXw0=<02ED!Hb%1`xBLQaBg7!fn#<{Q5fc>*F|+jl_ON;+!-^fuZraB? zqU+9}ATMFNBW`BeRuW&T!0Sr6qu0+dA?39YjG4(P;GL>w;@}rVb=0(yDUT?-v>@Rd zW1K@YrDQuIxK)b|rhFdI^}vl%-GL%**3>{9OJ@_V0@9=IF)0-RFG69e8~B$88)Y&* zaW?s7;6EPj-d39)1$G=rEk5a&+h%)uNxt?5Q`t~^Yel3Ogz{v%uk(?)kbu2 zG8&cV(C5=<=*F+AuTKmdt!|>BlN`#ciz#{8Y~Zi#vIwBh106)nsH~o+i3{1) zY&}J-1=c6F;r~6Hvu$s9QR{3i%@C&hA1Ak}`~PG-sZGERy9;V*tgN(RFVBSvW{%u6 zYu@4LZnB$`uKuxR)M_zx9E(hlO$stakvrMjug0+he11r^Ew{zK4@N&I?@xeEM_~D1 z>i}6a6TiNdgXqJJj7uW#A1&yrX>aL92HrQX6GdhOl^FH^vpeYVye~E7#CsEiw6_%s zqbRreaAC%DGlX_&li2PE@nmOyO7z^MoH%k_7RV}DOx|=lx0GXqZ76IU{i{G3bgbM? zIdwY&4xf1nYcISgkpMLu!q~xP+y&p<#2yj~x8@C%-&>8oiuKR52>sEOxJ$p73`6ba zGM7$VSl2sa+bCgdK83+lG*TK*gO*tB)Z1dpwdzh>)n97G*d=Hd1c}Ek=vkos8>EVt zpKcW{Xtd21i4-V9Z@P<4euAQ%Jo$(V-IwX?!-#=Ag0lGmC~)sXE6a3<{(Y=T z%!B$XiU^lGhP7o3QJ@|+=a)t3fe+6OYns?wm`AwKg-}B}o%;P+ksgse2!|xA!Nz+7 z9Ta^{*}xhv5b6Zh5?jn79rt|OICY|C8C$06q&8kkARFZ6JTRzcH*{{1ItqSI=iL>a zqE2v;k=ZB$ol`cqj-9fGS%5<;OYi6dQE3qO#22T>t)#OsGrbrCM_1Ri#v{BGNHJ%y zvBR$V8?$nH1Z+)B-27l}7Q%RcZN|QhYN*t|nf}1~e5`{YxZ^xD2 zl?BQs4L`;wb6=TmE4IcD++g>U%$rajg>-6&whaU}zccjM*&VoM+YC6pZQ&s9j6@H2 zWxiBYQE~BdA$fxf^l@~IvwO2Tz>iCL`mD+%Rk5UgxoaXjY4=@J>lH&vitHvb!@U^i ziKBvBl?C4HzceCi2M*XX64hqJPnM*3*@`4VSu~{W<^i3L%rB4))fuzCGt8xvoBbr+ zvXp8fLXl7fTq~h5ZnN_VH1reNd%0+NtB%gbJwjt3M?l%@Mz+{U66gt}yjL@p%y_)PEhyY|3 z1z`t)x}wFaH&BxCG|X;%XJFn|4o_wt)0w|s5A@tJGjVj_B1Gs^Vtzf%m@H|}7u&_f3-H*+!m?!i*2`o) z)cCNUj%|Cd&~=dRx84tu8*)3RpQL&WE1vNYq8C)&hnE70Q75E*#`!((R48CWnoDXu z_H3y^v=@W)#=aQ7-{qaU!=!A=0%d_6;Sx9}fS{3TEyPZxwV4K{JPMwKkXkJ5Kp#Ps zk`c}q+%5q9*|RD!x@4z^3qUR!>oDk>1Qs{&^g2;G55 z*aN;$@jR&ESWvGzg5}0k5R-D^h?ux|$e@r6NEc)*+L+pWwp63;9#2HzU3yoRrJmt< zk=hpHON1E4%jqofy4>PFpoUl+t{Fe$y#A<;!V__=*-2~d3S|65nCvaonTrA(*O5fP zzP#)YCKUV(DgN~0ORVGO8R8QYD~Cvuqxf(LpPq?r9&pq=i5 z+o?0K89Ei2e>g;4Evo^~JA3$4ay)dP-2DCf(=d5{XL>~22tKOUE|D+d0uGDa9>W&v z)o%4LfPSz8`jmr;Z0SRv<%u}BLBGc241~s31FO?LPMX6d_H6^`?0`V9^m3cun)A7G znPIbEt7{9b_HN?p*c{iLy2G%$j`D${6^4Xd@GTE+FBp({<>WTQ1d zUDtrRjl~U$dD=qK?&ZsFE14+LRwu=7H{I!O%^{G{URyKE>@c7VXC7_~E(|S_owc)q zBKKEGQHA-5+gVxG!{)@+=7sG5JqhmG&nZ5@#;F||tu-&sM;xA4cGy`JLHB|buUJh6 zOpd*&xCQ$Olmu=8+^^KIax-eJ4#qAxc(C1n~yvw;H`Ld z)Xj^*5xPK}$EExg=~z_RI|^jWe5>rPc&ycoo2h&3#8va55=+qRCzC%z97&*$D!f=TeRPP zsj!7g0WPM|UF(rUw-1@?gG8h!&@3Se0(FMV*29$TO>{rx56kVnuujv)_v|&iUSQqv&qylW3TbqGwSVxcGtb=q z#BFB=M8$57pDBrVwk1LrwqgL7m-G{1mpfTjxk}&PxET0943k`EQefk|PtQ zgjbURbNp_nmzr{}je_z3r+NU5!htu;BHrmk+wB-y2FtiY(wE%Ob8UEs5O~b_6tPp| zvz!x#&SL0&Or`mdj9$qscH;fuB|@K12W~mafH!J?WlPBZNKVtJ_Jz{@Ua9Q<^dQP1 zzpyO|<}-GPQ9wxCoXTP1x0xoSUIKM_`Y+y5rn&~`meV?6QDyk1^+GGw>oy18zd!>_ z)O8xgZe(KL0^M1YG8xrO7$m=+DE{C4hF*W4c$vBW}4!MUEfwfe6L!Y!ok%IH6 z-S3{83sE@)>J!65+5zNj;q|-%jW$=JY)sOkS@wI0vY6~VPWD z!^!fnWM<$TNRuUZAlrZ?p@oGT0A(yjQq@V2)EmR#YU)EN^vCNFHDI=htM39iBI!#s zQ4{*WF))kd5iY~O9iIGsb} z7}6=84SmU1xGW?Yu?e&x%i%e`LtB24o*agVHD}goZa3#M)j1MnAKuGeE?7AyC-!q! zfM@{9Uq?$ldTg@9=nM6NC!3r~rIlXF*t?}rNF9GqQCOKX1TD6Z-t5@)o~n=X19 zsEz2hTv3c&i#YB7h0oFIMo!*r6}ZwLopE-S3^yHxE|cZmAE%0e_l@E7_zM5P`#Ag#}Zy>O}QNMxH3F*=g4Zb1^KJ;zBL)==*g$A%?<|Y&PFaPBZLTP zR+utQf%F0pRJ35P!CC6yq8rRX#(<{~rpTW7xL8z~g#ihjaoj7@`~*Gi9QoZ{)?1U+ z(Z>STp836eYBP#)L(lv|LCkK=fg=R(;g;6HuG4&1y{T>;hpA}r&UjUVOL(9|kFc1% zj^$iMU+c_DU5bJEEbeWaYP7XieRu4Xf6=;dbwXrEd1F0xfZ6xpa{2mKAdz9YWBl`+ z>8M4LF6EkjG#HP;2u}&|f)Z4W=k5pkVmS${KfjDH$HvAgYz{Dj4xq;+%%9;2A9&&I z2}k#N)1_u-CQB&ziM^WJp}!6=irp6*t&A$0d1K{hWqvsqWt(vI}7e8Jd{v-r7d_ni1&m1M( zw5ugT+c8#Btlb|D3E7J-lC|+#m znM)b{n>{q3A50^vWI5O~#sY~6ulpl4sWrp_2GBv=|1c8dw~|O)%xjmb_ZyNPhChHE zmocF2gO{JA8v)Ac5KJyr@$yo*Vv2pV;pwxH?6WjowVP+rHms*|sIbe$QYO5bJKKvY zS73*%!(j$9qLv@fQaVw+Rh;sI%M)4q#KA@n^!DeC;W#73ZbuaXAV-7PtjtO>6YL^r zA33kAtoZF5Q+cL_Ng+wMf<~iUQcNs(Qh^sV7WliGyx5F|7iH_GOA_B7Y-)qQ7&}hM zSmx_YdwJ9${CX_*kEUn&J2tO=eMg_Y(-=IPweTi#xc3ReqOXZq_oJAnj^f|GN^qwx zNQzRVQIUFnH>O zc>b(YN5c%dxBi-|tvzouL4BhbhatSCbDKJHn>lIJ&k43#`L5G%XZ0}RF{$bVNJ-tUNNM*09uFWJ>W%C&UD~GGhJGGuetB}hK z7@dQt&}>jbJ`gXiCFw@f=yP=Z$e{tz)Bm?v0;wGHW2_-4!!lyzw5=HF(&hV@k@*#7!me8+EHe99sHH*`I#q(Q zD|)eN@kLrF1e6dtMq4l_^qJ~*kk{V({~LsE4DF=%UiYd+i_t|DI=ObT1(`sBK$UkS zgIfvyB>@#Ov@FdQ58N7%*R=n-khaes3FUmSq?`P=ahvfY)$D8c@?`lSy0x?Pg4-;I zjrCm=E{2-p)4i6%3bHv5hT?_ls7haxr9huQiv&)zEZ+RxsVWE=*y=IA`g~>2vVVO6 zB>?P{ppTDFW8akniwX4pA~nb)LNM?81=@8*f-8!3jo*al>ha{@$r>F_XpsrELF9twq$*c$ z@o0R;oV<7?cb#pweXum}t*#}?%(hF&2skRnD*GmAEvd9B=mF&~WZ~B=uQ^83FvjX< zY_WA}EH6*81q0o~g!6zfW~&ylo*NYm+X~~*gYIppj51$A3cmoqC`1ZCO`}2wV*i3U z`8iDnvj63Y-B4ilt3xaG;0T6*_oF4d4B>dl|pv&n$Xlz)oYuKTK zR0D{qM;@RsW$OQ4wDpv@vp)foCc54coEq0sZT;tFhuEobz1`Qa^t12iBW{9l>A8en00NwBcR@$T=R z0R8wY#b+La*L1IIz!wYIaoKQ0T`9EV66hlRA0a>UU^g)o75|dAV|eERHHez(FCDUK z?+q#9Uov;JY;j)3H)uh$C;oD9|81J?VcYp;^HWYe2eqM>L1DpEf5c8N`@mM58@1qN z5Po&qi9zVYzCFbs1lm9K7qT%lMZeik)r830a(+!6wIOZQ;YXS~3Hm|zm#Sy%Po%d- zPBBm5!BR~&BW#p00K$JVy04aOKoR^BeC};`$>Q5P=_EJ6u7O@~{UuPCK1Y`{cbAB`&Yec;>`O?Aoyq)AbJfaZYkKoAvu5w^n>=V=mer!UN*>mQMLOp!*@4*|2$>; z1n9-zt;6`KCHKq9eUY`xho%|~2*}$X1RXg8XVCW#35s|&dDsF)&1U?XuIW(M5P`Bc zdIFTN_LupVdsQ|atkBfH%af)i)+V!@eHQT2g0BO$h2IV2K?%-(zxc&g)v-^>@iZzG zknvWBV1LZ|?*q5YqjQtyZ%L$xD? z&R(1I*J4Unh$P)hSqSG5Nn11Ie4103_Z{+q)+lYKSrj#GgRG+MHoc=;pY+v0dEDLp{t~= z1-x4<9cYaGcr#VvZFd#M+2$B^s6bupRb!Zg^7eoUr#RLH&I#_*gDrkE=0>`AQ4=;k z*8Ewb$Q*4~nfEkL;t_km?SVliYii+2Y{Sv-&ZEHT8in@Tp(g#|;+7xQw^V+w$p z|G3Bo4wEf7E{~aFfC*wD9h{XrANm)X3NTIA0A?4PJQxnMHX`?-I|;yueF_i9i&f{R z$Edg;xyp#$Fm7&C-ttcBS8=$z_71y93g?@KD;;d+!S$BGr3Lx&or6=RYw>^BixYGR zGIjk)XW3F*S-H7EMgc~GBf!o9&8d2r%|@s3i5EJOZq0Bnu3C$USabK0tMdu|e3|x} zU12QQfg_B_qq~1-KKYpiNkwW+wQu-}wgYIr0gSqwGwca>xU#lrJ)7~0(^3@13-#p% z?)o5kaQz?jPJOWqcfj8)c11LmW{(*dT53n01(Z5!tcE3J2;!!V;5&CMHwGZ|DzFdK z;esB_q?2ikRg#I&l9H0W=hs0XDd0#<%qrP@3l5RFgcgSyI-DuDn9r5vD7{h*W>$q? z4HZi%-~~RucN<~YBoe*Q+JEj^65MF(&ax)Usw+{AX}}$vZnE{y)?#8dcP88J1_f%z9R}T=GH@fEVZnP9xFGB8kWT2$DQ;C1t|5D5|=b zt`S4f7t#c-203z{`LsLu9vmCj?o6WMvNpb>xzt>nA;YO|XW(f26!mm7TWMQ5$7}9& zxI>B!yDgXA&_1M2<4qSf`?4zCLq~Z;V4>|)3L1KsO7UD65aRM27fdWne=ZzS-&04; z%zSS7VR;>}`J%@jlcx}{6BpUM7JAvO>F~}FtKNIARg#RMR!qP&#j!*CZ6c|o1^w|= z)D<|P1gRSgMu7ev8_wV6Pxm7*6nbTywaY9)Zeud`UZ55*?{;hle;d=VlN~Idw@AwA z^BJP3zTYh52-~ph;LHR-M2uB7XPj8Wci2DSZ&(BaRfF+2`0GjQHz;kfmT6uXg}b_yO=m8xJn_8K5CB@bbz^C8*#u| zo~e|4wK1VQzQ8&JdoNyXf4E2sN+_pKgbCJU*xSkqR&Wfb-`V?Ukb?6BE^obP#8E?d zK#G=ta6a3)z>ab)A4VDPvRMO_7-kTUCHpm%pjWtCa0TOL(df6%0Zi!=Z;Ts0>5n}C z7XNy|l>QtP200E?%`2$4UZ6joOUy2X!-LR3dI{R^Wn!OTEq#CR@;x5xntD*W8;ZZI z3f;L4cP@n_y{0Fs)U~M{6SFbJE^0TbK4Tej)+)y>f9o zmHwbGRX`S)NI6TbUkCRSEDiC?@2*{Q?Aq)soj@!Yuf3xke*RRF`U%+Hfs34A zO>8ZR+Dqpl;CwQ#s2*-G(@}vQ9(&E#W3BtQO&{X7>DCl`uI%oT>p`H4v?{>(snM$< zb#GV9_^X2=T-0+%p!o~ED6raCDGUp!6a4a?VU2QnkW8tO7Q4mpWTa`vSvu(?DDQV7 z0B9n4j0Nk9{&w!;-JO9GppOY`$|@_m@yoTPSI%C`4KTQK_bbNY9c|2RnKX8*;igKE z2gZl3s$53q4-B_TYN8J03m1>veIJ5;?cN#SHj{`d)G)Tv&)*8X<{yhYGB$n(le>PY z#_x`%L#Sk-M4Y=r=mph7?(+a^OZNa>8@mQ89z!4Pz6Tx^*Peg__H!$}K_ExqFn&}AdXME@EE6{&S7#nO zLdpzBPl3XoJ)}qI4y@ibj5UnW8@i@NVb-~*N+nP(t-F zYNN66Lk;*jwD7Ky(E$)?UX%vb{2NGFSktXLLaf$fSIP0?6u+Na)F3|Zzh^(BmE~LL zA$3C(Sl`kTU7f=X+%-K8(T)}OKouyj$+%uE+odD2Y#RcWBO77?0x|tDETARP8m9OP z@B-^9J)we{TnM=Ww0qA2D}P6b&)^l2doeY_<-2sXh|C&;a5MV_rsShN| z6VS#$t$no+nE12#3z`HK#BS7NB=LW9Kd!3w1F-@q9ngXQfh{od&$=7k?i+w8{GKO3 zv)o^4K{{F1&5wkEfnSk7p8-j2*M+~JL7;@2e=INX=64wY0PD=BU>iIC9rpBJ`+7Xr z%lGhj(eaazbiCsD;o&`|;`mY2{x?SkhIBJ+enb#9O!dGhpNxQPAOQdW=mF|axU@C0 zxN}?D*Xj{UV0Y>J>H;ikN;1F9r;J2NhZDdbRu^T;OWXz1%|?GEJ*pm!O_RpCEG{Pc zu~qkJ-&`O)u+J!GHS*28U;2r(@Tq&J;nSNq`%;#%wa!&a(kf*xDz#?4-u`t!RL=3Z zG4RmyB-wr7Dsvp$n}-u5v+WsH>5}YG$Z?8RI2Zv7dGTTz8mj5$L`oJ%?K^*a+*|YD zQh~pJzEo+^Cs(y64-Nz2T815ZQQ|1~i$*m%sE(aZ>&Lw^q|$$(KLhdIvzz?tvw{vZ zFkf-ivqP0W60SV!6f#%R@Lq!#S3}l$lrlauAi8+Z?!$L4%_p7#ov$CHa0%T^8}l}( zsWr8haZmlVlM~|kZv4x@g@1t_q=)v2SQqpSp_s$ttGN(XQLqa z7}g9fQj^#F3)QZkk5(*3GM&;Y-HmHYyLV!DC@X63)BFxi{=HPLsBo_y(iX)#;1n>% zF&ul=&L^g!q|7!6dc{)Ixs6R>!^}3dy7%ynz(jmS0aCmVnEp;#`%r2jSSA*92psq0 zM^WK?nFFwmneO^Qxp0E1^R0miVTm)n5)g8ISO2`7k+Y`zL(!6EJq=IWPDjYh|B$Yu zS>`U)o-uT(<smO zl;?lIS~%{fRD&6@C-op?sVH$|n?PS-48P1mVLEoExY^Fc z%y#PvpGpt%W^KjodGz^)+~tqfQb&*6H>HO0bE%9#zokH|jM9;8BG{)#FqIyPbz&5U z+fL+}aH790X2CD!Siga$)S4#%%$EJyK{aZM(Euj);z_%yy4?&CBe_QE+c#1#Br4lx zN9G581g+X3_b=XR{1=)C+t2T*(ZLr_HD*~JmYvVXg;oS&N^spg5hbQTejohI#*uhF z$Sl~B+_Z7wS#_B zLklh4e#HaR8+z6u{*J_75goG1MS2?0)RDJF>6Gp|{-u0)IZvRyLikm~+GfxEg{?yf5cK5D3 z`aq>HgK;kk2xfch@M|`lOYt|3e{g}_$0KDtlwyALD|z^0Dt6VDb0LQL_;(cq9RSu_ z6K|q&wtFstw&R=^O3B}TG>o9T^R&yHO+pRKdkRi53%Jrov5%tqGt3%i6MF1h(hnI^ zGSd-D_rGuq8x6g68o=5S-}SEEy<`^=dL}HmZB>DsRO3kw4z%XFilq{iIK0x7YFYN; z-Sj}wm9I?JKwDfRW}xWyuO3za<;r67uWZ1Ah05f+k;I&hjm!;z`gp2N*`&uXj>t*I z=Zy=@tSu&bMc9qJWiuT243=zrE1v4B_2j{1^$um85Q(CoT`88PW`krXsVT3hX>HTI zTSoinvue`eY3^rqX{22t37X4QVz5Nu(oX&RbkaHQ<<#=b=bDcIXRgw873K+ij<}^i zFjZ~yMds+mX;AZG#>9w@cJbuTBJuLIv(TOH+bF@Hy~7_jZi_Z**ml02{xBYwvP0o~ z(>(zZE^V4Kc785YVc{oL?>bTX|Ni)ck-4@Ii+B|> zP#K&H+}#$J?h~>HVS;Y;8B4Zuj0P3n7$}rmY^b+03eCxEBlh|#^cu@myF0LLYTLIP z-l;i+09M+{<@I=WWX?y7FwNx`U}XRf)}BlHi;%t4mx^~Kvo)K|5-=rzpIo30imrFI zCG|rBsKRCvfjcVj^gbjgxwkaXuAJSZ1>&bb7pAOAH$HZH@53^~iwKON0|L5vI4`(T z8M{Gu)B&_SxW!-%LqhIAw)SfR(_qzciHp}qp|>u?*7L!kL7GXJHgL)_(=lx7XIv5I z?(YSon`|XJfR4#b&k)D=Gr++3HFVbr#f>ggm6cwXW6v|cR(^|Z{H|S1kFYf;0cM^& z!UVL?qTZ+TbYh^g~Tf4@!biwCo_Y^s5 zzL3%*jyp1F@6RyH?H=wdd`20Y5o-*FJrB&CJbL z&U+Ry!l5j%6S$v4>Gu2c=XivK?LL?b^!2y(^cg988O}gl zp9D;*wDC`H3zoU$fb|ETJk_^qK@Xd(_|e@;=Q^4WdhEsyu8w`Xde>Gkhs|QJC7vYT zU)`~-9l~q4OAmKJ=M`1WEdi!1)Xg)^bHAeu&QA5&E=?f@6Sks^p0X7LD&v&7e_LTy z87rh0GznXp;*$&?9Cp|Y2cMXj4Ypu8Dt2yI+szqXTFxp?amDk=cQzFYHKU}g9W;7t z2#H*VGcD!K3sHy}?Q}g#kYnvajo{U$;a z5JS{&F+hfa0&CC_fOgn;&hXg7mAHidlTjXfw&4F_@2%gW+S&$S&-;Gw_aA(}a9!-Z*IM_w zYu&kq<2enU-HFjXcAl+`;{3ilVB2P50>-MF7aHEhJ%gpqvN6fNlPQzm_j<3nMA^Td zj-9#!&^wcM=aP)qz`zdgg7J=Fi|-+G`^Kt^h8_5;Ij%fKr+)%)wGJMWH}GHSoq{yoV{-R zMm6E5ALX(&I&q652hW}m+Ecj7*!SRKEh~|_$u%W;*20daBQTzGi4UxldnTkCl2y|^ z>&Uf@+9?iG0kgNXX57fz1W4cyT#f?L#q3thPglLD1h$D?ggF4SuK~xdGAF0)=@ch` z@6C`VAKkT5mAb;pP2{Oi)dlWci+Gf7>xW0rRAS`?X4>kNCT2&SfVgUO^rKs&_)v}s zseObDX>s~?v*Q)H4rAzjDyRwczSKuUV|_AJ?mO+_qbjd;zq1j)@{K{vy{&j-6q!D+ddk?diJ<-|NqKZvv=&2Gooag$BR_ zeN2C}9jt{`VH@CofvC06PVfKU-)#OU&T`8|gw~l#is`Y28p_7*h0-Ejy?k{%^#cEo z&nZ*|*VGwbS~c-EG#s$|=?kg_z-b=2Hb@ke1CBWg45TUG?|_O@dXhU}yvh5N*k9Fy zyyY&7Gk!i*JViygIz)FQZId_IzEn>r37J<~x>087mKa*)Pm)-D zVW*=z9_5AL(nopybQ*$CE7w+6;p*jT4lqbI*i! zpL+>ZIm}rEO(mXvys@v6)xHo`kY;4xM#wy%6b7CI0^O772zWeXeQW8qe>(hyct|^` zeH5v7z*g)&0ffm_r}c3C%bVS1Z@`d00wfhf4e7b1pymHs=eWac!?h`fH~)M;mz~O{ zp}eMiF6QHt#Yw<4ke!OVlXQ;5TQNE3-`1Y|A{r(A`6fD|~QDJ6|}*RSo-wafx48(gBkq1;My;y!w}SE&+8 zvWXj}oWF`&tfL;9^J1f1yrDwvJnlaoENGmO;@&r0$|lsKxf`(qwchqdh`MlP$->PEpFDg{+%ufDlxxw z^@<*#QR)-f~s~pZ6ZMn${~UqdCWkGja2F=GMpw$2qNC{;shzV z!`w7HBZQZ8ZY)l8CZtppB%~M_iZ&~p87^TyP3s>9uzEwCk~-%OJh10uBfGtw{huu& zn|FozHet*|J4!KL(Un_=C7*|$_z->?P_33EroAXVc-ZWztB!3-f69&>B`DU4DjTHp z>QSF@V*;O6Dp&=b;<^n-ODtBF0)UDPadAPUR;xl`;uZw5D?5h;!n5g z=Xf^FLxJ5~z~4v_KwoGZd`im^1$(1RIzD?w@>HLXCgoSlb_me=&(mdoS-YTF0J=Qv zd!EuBc$;yioA!afZd7*a3916LT>M-=s!_WAL2{+K&j`oLfUg^PNb zLDg+&c;Jh2lIcYm-FD4Ax{JP|26j_)53SsWuc`UPG(|hZFy+p*Vo>Y@# z;@w!y#*HhrFo5g1fG)?|q9WmAH9Wq*H{g8qX1Hpj<%~J}*uds!XKd-X?7m~OeJ_0w zb%lfPo^HnvNg<;|ecFw}T_+QfE!VZWMNok)Bk|f`s^1F|iLH<>4@WGCz2q-rl5}(E zz9;Tv**ls43C<^)__yS2By!pCllS?so}I1RuGRJCHa4v+aEm!Wn_ruJ(5-9&@q26c zLTK-?YB^eM#0a$_-No(`fX=G~I#(M`?LE+2J0AOPP! z8~5dM5grXn(<9BnH5V=hj*Cn&)lUv$?x$$%?-g`vFL7=9*(@yjro!VrF~aN@h16OB zjisT71jYTbmRg?mhWeKs94@jzCv{eNvi7EKd4>wu!}+ox}^jiTf=~! z72pW50_#!TdtNe$3tw$8dUYEJ*-G35k2ijX$A1+4`O0iD8|ztFAu=@K?N8!n&}%$( z`ivw8-nM-|B-+Z?2Nz$PU};z_>*uDFgQw|P6?M{CD=HN76l%Gr3|sUd zTpWIUiG@Alio%ZO%oefqQbL@z7Yv3JoWSg@9DL)0gS#`RKoGutQx_#fC~BW?Y2=eO zrV3`_#Z}nC-=^Kxx3*IaY5AgHYk1dNf6fL%)@Kz=IMinjmDL_jsfJ)%&FX{;cD0KH zs0Gf)b`rf2X0+~BKnqg&Fp&vC7#W_Sr|3pX7GDn6-MPtM=2p;8iKR*k?80EZ?XCwE z@M6Yw-}7w}vf$MaK+VzU0TKz}DQ`Gf^K1HDaN>gxtMV2Gdt*G&2U}4*mJ8IXKjsTF zzld&yRsjqI5gI;9J4Mir)}%#XQw(4$mb^&buePHvoINJL%q@|<+tosjFn8=I?- z33^7N^@PlI+6e6HsavNB`omu);}>U*#J6*mBs+E(Tu2|)uFteD_7T`G2F9;}GevP@ z%S`*3!_hx|9fEi24_Eq4+MTSEzPtvf16TjxkTHD7d;9mce4VTa`MQ70j3fmle`J-= zZ|WE*WV`a8Eld*K40Nz395b$GA{W6l|hNwj|I^BT-brDZ3dms(~~0i-GWZ6 zN|=ucbXNu-(qdknAzB+Ftx_=yJ1Dtp))MSaYY}$pBK83Up~ z#o0bL0DPmH5Ahl#R#^s08DQgg9NlpK3jg>`(`%olb60($B@f)8?;%fu zQ3v{qi#I4o&{Z%Mx}EyHJrjxTeM5aD-VL zy}Cb)5^)yGDaY_Pk@VeYay4AKrpsbL0pb74%hTL*UkEp?UUHeBpu4nICn>S5QK4F5 zZkOEYHCpJUWWgd(stJybx=`mI)^;|YE5&>S7%RqGAo^)z7N5_HZkuml<@HfvYIl;mJdRXKL+>6UgfO`qjH!o5VJ2L~QN2ZEHE%AjXv!8J zD4sq`Gw5SHID8IxkRF0L-)%`*T4jv& zHYyU*#Kr(;N7O7iXp`!^+FyEx>Mp>BE2p@ns^yXA6030B+;-~kWf-F(Vfta#?zvkZ zJ_F|q!feY!kl)s*8OaLjmv428?*Mg?BpT*A?}+2IYM)M^_R3j3Uw=G4yFp;R(&VfCXu zyT_?^YsPuWUHs7TN5kZ5U%EulF;cz-g@DKTfomm7$^LVyaMp@Jl8***b2^1rd`n-> z9Y(+ODvtD$9cew0i|4s$8cQ-$QB=vDQeS|NgyNpAyah8lLmWIKX zehuB$n1M!as*Z;$jLwB~YvPsX=P`ghd0b3Xrj+Y79_N`29fE<1@k`$}45m+PiP?gv zRe!oT?Is0MUO)dw;2`daSNp2oxg!TTklVW?0s}v)1;r2m*k-C^)|ohQ+O>=R^2?e) zz=HVOOO#>(=C(*>8h*HPf%#or`oCU%6daqL3&?1*Tl>G?hfGlk!xzc_KNek1zHd<> zv2fA!=CauH&(z%#z6-N2c6)8t6ekC(dxO|*hi1`VZvz`t18njwY<|`z?%a_*5!l9= z|3UwCvB+7!i|co;UdySM`WhGT?9tV0^mpi=($h!pFy49hmiP+IYi!A#PsE=F;YR;l(2)PU+j_wy+jY4UI)$Ns~%o!TE$y+LJ}~92s0H{5#twV;pMZeKKY(n;%&Aq;|X%seeR%#40k>w zj6QsOxU6!4?c(*FEDYN_R-cL*4|VO6)!$MKoT3VhRw^%ETaB%o&5P5_x`2zQ-<7UzoDhI53|RXNrOO9-k) zG)~6}xI%mkRcx077xlG@BL@_MI2#8)56nK<_SBFC(5``73GqY^xcUx};nwa{%73M~ne_WI8@qh0%{5Lm`NFeHcI?M_VfDu91ydg;b6$LgLi^=} zkVA2B7|>lWjOLAOs8FNx(qqBSh8?Xfa8*qnIVwyLl=@Rd)NV%*?nlwx?rfj01BgdE zjCVQ#!S>)DT8Q!^1Bl2|i(#16e(wl$L4L%*>8KJ!@~PokVd>Dx#BOEN1^rO=(ROY) z{XyqF_TiIbawT0&fsTjMVlDFowWzocW+v1*$CRwOP*b~$Z(t;?^CwpSZf6J~oy8yz z8Tsk?LTRy?V|`DX1PFFkC0cpDYotgEvAiEu{;eazl3L_qHgaGgXNKuwr%3T%1xSIsIzTJW6o|Cggp;mkUlGxbRdxc)x^|=IZTm%y#Xj*V1?NpJf zyLp|hINbxQf8ASbdB?VQ+t90h-Uv5vR9>OLk4!GGrYni?D{)M&d(1g-_l48`Vh(hI zGEG-}wWMJA05P(E5&{`&S-Z7R2iwdg99eC*rJ8spt{uLk>aJ}ccDlqKhFF1u((0gn zRW&_^Iz)XzCg&}pba;?N*@niaCtg#bO6VHAbkAnZaEtbi4yZ)O%?|^DN%rhXL& zYqM6qSx@@Unzp}@qs5X|H9tYphaPyAPVX6f7;1l%i7%-q6I+njnS7$J<&MAc_I-@+ z38@Bt)*J29d+AQ)r^zettM;f>y_`A26A9kK5{PCI&SNOVIJd`)MX}_uiyjSI_hKL9 zVi%^f4kIYu{YGw-B<50mBb{^fWJXr0+WeKK{SF#L32NgUvXsl-G~1$+a@S#_!Z(j}u_FUk3S~Rhq8w znmu+>ws%5b44q*8lSg-_q9oI3qQtgmbf`*LYvyQ+8Sn36r|$xSk94p$Sc-6v6nN5f zwtk<$p6RZc9AlpzBE4*DYUn&mj=0_BUA+}Ygo7R!FQwXUgfPzk!3H)A(|ss8{ZPpt z_hDrGK=SM$+K|5E{+tWi^dv}jahZ=Uwa_T3o{cIDqfTv0uu%tF%%d$i=CE;yYOEGv zv%PyEYGr}+-W!YRi%>SU=)9r__8$CDiB5RsB5-p{zRn&k;};EY7s%JOY{F+xEQzW* zICt2w^VR#_iM9Z7N$Am8>0Na1T-$rSTw)s>3af&-l69dp~K%G%dhBX8SxqhL83@T`gm7JTT1Lg z5a$iyDFMNAiZOcNOc-_-QxDzja7ZhpHaz8~IvuW0m#xOZ$oS|_%?N9=rTq6~eEGNH z82FM&>L{+e%((WX%~Zl#ewvI^VU;34=*`Y^9mVy((hB&NW=6wy!-cD0n1W&+{pgt;yOFE!h{3d)@&mCt{?5&~SNVn)3Hw6hgDUz%dZlX~! z2g^C|)atD-$b4D^dyrm&v^;u3MQ)U#u<^j3$p?{|x`jj9fm z+X!m*)^&f5I!Noh6uA*rgwUY#8-j2y>LU$sJV^VlMRqSQ735p2Rh5<5ujB|xgmy?6 z)-%-E6M*WrOgU`ywlQD(Ar4H5DX%KUurF5=1(3_U;X1a^jk2?ry0R+@__dzR9DYJ6 zqcq@CB!$~sEsbiQBE1C*|6uE|+ zNYI9gAH4J6!*exZp5J1$XT{B8%i%=}GK_yv2p`r`R6k z!nZrW`=C*l2xI9{A%0m&_Ybt;LcxCGd_5H6ie~}#wosfwAWmdUzM^C8sbl^_7opAD zNqTJ%a2RKUL#^9qHm1NgyOF=}z1;EbzcZMX`1A4nu!Bhm8ZlHYj8Q=pA1y?kp8MMX zs&%E(I!R+ySoqe(j@)j0#?q& zNlBG0$SXwiI*ceLY#HdXYLA`WHMXRt*2@KUh$h8=mQo+Y2HnY>5bKI8u7r_Etu58L zGSPf3`i3N+eGsOYT&Onn8qqUZP#>EO1+ne+|@Y&Lr6RP>DGoxXvqKB{htV>L#hS;1uMc zjnDHE8F^KfoyZ118>zhQliBhP#=FR=smZ8l{pUldj$u-87*EE}e5={rn}pkyawqtp zfaE|P_MP#qr0p+XC9gZV6Mz&eJ_S+6e)~yp=?%{ps$PXmBw%@w7d2B^nH=tP;TtzX zC?NWH#>~~-Ab=eT{3Mz7hcoVTg$$*^K_&XMeXY`}4rv0JlRQWrZ}N;Mn2nd>d)7m%;dj#QAXY&3 z$T?!|({A56v(*Y!vjGtCw2o4yz}B9UDqqyq`*ZT;D{ral(;j;}<-sAnkVacedLGBM zg{{3iq!Cu|_(2e(K~^^^vJfpA&Nc4yxnYU5os=NGdzzq~^keXueP{v0;3NOh?r9lB zJuOG+Kn=!LD&}1dJR+YRhH;BG*scYdgvAt1&9|u`)$!XHQN`YioD);PW=h}hSZ-lC z9V)G15@g)@NndRCp#x>AOV2T8Rz1#(bkkad!8~G5Htk{)g8?oui+fk{ll%L**ll8+ zTI(@JfSD2uHgCp(bjj@v+U?p8<3V9nwC^p}7>b$rcBmm7$sfji%CZPC*_AgvPJ(Q! z+v$AWN2;>@zm$NOl%#Ay7&w7{IlYKNS%m!n$}~M9!ZKk_wk3VVNaZuBK{}b4QFY4D zN&;Ml3NwC#V*IqTbMZwYHJis;CX`(u^4;dJpoA(o?9DbUPXYxWJtG010@pc$-V1lH zUfiz_t514~=f4OxDjM-#y15?qS#*qKd~(8xn_4E4-EbE;z_WCi3Fz(`k)fX)1+mj) zwV-@-N9+cdcmCGhrn1>44wfvvbM0UAq8rSF0OpCM@l&G;LD3PcGtJ@51VOy@=NsI!?zDxzUiK> zZ}qZvsG7 zw{N7tX?Kj+{pbY6M%%rxDuf5l+?ma6FH1_}MxxJp%+~r&JaZrW(O^vii#rD(#xNXH zX(5cP1;2%JnQ8;*qBb@jP4YB`Y=39&_>8SNz~2Z)TRsHtFcW>U=!yWSLd5qy!LdKd z-ndv_U(`K)oru6*@OICJvD>t_C1;o$0ql9e9oM->wovk-f+&YfSF+P@0f>0aMu~0Z zMP50ykONZzDmc@aeq?#i;@Iqq1|cNae@3Z++Fm1ID#Vg>ev0xrPK1+Lvoqo(s8j;^V&4ie~LRR|ee1q0XQYz&r z=~9H2J@UNHViAx@d2gf{baapFvu6Qy`dZiMx|JQKkT@bft_+5jkq+04h{7ckyUIv^k<;1ZC))O6k0M7nCJ<6XYXT ze^PgZGclYD`HTXQZwnDPrbg~-eT>}f1AIKFwT$O-(`idj2MYtu(g$DM&3m8MR%*&pHApG3}D70ilI_J!(8z>|yn;N(`TvHC}K! zl?u_1h2{V&X@tQ9N2S3EuA2PFEO8%Lm5c=YX#MdqjH0?Z>=;63+*SV4T`6jrkJk20 zJ+&;sMhKz6T79li$42bS5FQ6wI-8`QhK^F@q)K1~)qFAl>^o-CTS*5_E-%c5q7YbO zKpY7NP=08Ck7KTh2A`~_!#X+-ZFCl>%I(y1D6ys$u&qy<`%I7Z(ELb}cpEfIjl=?g z2b(#)Oxbu!)+^SfG@u>IM)e|O8v$2pf`qa$TsZ$X_z4IWASNUAAQupGO(&Vw+^aB- z!nk*^Do-hkImZ8EYPng(JO^Q=-cj$Xup&O2j+4S2cjr2nr9C;^7M;D#U0x)!*pG=f zqkA3wX+~yFXQzrfGD$dLlG>KWsQ`2K6j%a64MYVAMT7&!vHa&CaKv=ltFc#_`eQ2s z(BdkxASzlAXDOY&M%D42%L-PTs$bI5Zg&?@r{&^76H^bH&i7$(fGXBLdFSDGNC{f! z8wLJqn3fJ0`zV>JU$?FIf5B`j2FW}n*OoqKgt@rBWmR|;u|*b0rQ&a%FlC|keKvJ4 zdu}uG;jq8ru7MMfcUN$3Rs}gebaiii=AK^Vq77)lJkvRoopZww|K>Y+^0?hv#_i~*RMwR(=iis3o77!&>{Uu4SC~MtJi#InCria$W)wag1GDNtydr~bYRZjVv@w5afvB?89q_0B}F?lV6ofD^=ff+GkDAgsl{%`9{ zRP1c`CqY}K6=B&lp(vM%qrIO78}&Q9OwZ*nwibp*_b?>!!6 zb?%p~r8F?FSe6mu`Bc;V@{pY~YC>IqEHYVO&f1Zy1lpi%s1iNu7-AXv-M2B1VaM1> zW+;&Or4U^hMu9@&kYa^_6o%n-gHJj6Sjc-&xAS9HMH`I@G=p zA*6EKUSwfr=fsx}UYQcD@hE;{{2JR&5}79o9|jsn8@G59t_JdzIzd=R0}oQs#bm@IXV}HGKzH1sKZ2`}Ll8M$M_E0}tB3wlUW3@~kS8U$ z&X-N?WF=P#fAV-5ZI$kAr+?!!B5!_01?*LD%kTjUYFr`PTSos0@X#E}%H-_iSWhyT z0KdU4#jR0&I@nJp;IX2`E;GHqW72)*iSlo3kn|YG@SBop+DURj78hH;HfooqHD6W`A z;i4li+HEZSi1L077Qx$>OdApx$^D-G7zw*-#kwnrEl_lKZ18t!evzze1!abRa$vlGlpZ4R!|;lo?fC}vZEXph87Mt=+(cVO6MBLXOx+vhIsaRFtWv-s&2&K z`A2ARXr)-BM#pD3De0V!$?J>!-X7I=^BJ1R@;M7qd6GASJy56~+jrHiJS%VeS%gcJ+j5)GW@- zyM{N1vW%QtB8CoGrDIlpY``y~-Zw*S)NppOkqZD2)aS(TcgJKpyc%lj$Yk_-qp z#CT;5`nvnb0CaO$TX&{=y;U7<_3Zh|x!ShF?YwYxk`Y(?6YQ74tDCq4Q!F3yie*v1 zw{IdZ)7ojle(yJK9d3o?ySDFC1Mcq)CBS`O>jhk0#9zt#+M4n6EGPenGHjZ>Pn8Dn z6KR&RrsuL-|AM^lKyj)r*5SMSHFp$pXUq~hDc{8Xf^r3_8ORfOwcT8ovq}?7g$+d1 zvYjVoBL*6iOuED=%6R`&K7DSJ-Pb}50vwj3gRA9T4pE$ zso;^IEZxq0i+2E~#RoxhCg*CT3U`RR&j#Kz9eu0pW&tp+W%+sPD)ED3t5F%Dx#b7E z+!gWmNn;O}E!Tr!3DIfK2_>qzGo%0wtu1gQc7Z~!o2Kh2c*{TWaq!6oNTOW$1zEDS z;kY?FWhMU18|IeB`@%Y@8uy;pAW}su=LU)tKjn!ojEq=tMxdLDBtx3%kz5r#P**zn z3ER0(Ml3=#gc5tbVf48{pQ9ENA&ktDaI(g#;Al?Qo|#R{GQCm5_I3YJde$VWrOgyK z3IIqNAw;G*92LI-^ej=!hRTaK*AyIg%D}sPHzJdZgNr!s3M_^v-|)S=|IPP>y(i08 zRMj5sh?r}7OBY~j1Vr~|4v4#x=Ld|oYj(4Su7)nI?hbTHe;QMmexH0x-onRKe*xH6 zKlDc3cKx9?Avyt$OXH0dH?hhtxT68q`(QlclaJ7RUOp~86hj#22nKbnAxNoPUr3T-%~n_?*|%gT`<E}b@s4};nQzh7a)J>d3(9SfM@o+T`C-@cW5Mls z=TO9hQ5*3ipK98;)IA!WT@Q_}>uf6|GOihZj4vfOBu#Tt>7UYkMIlC9V{(IJG`n3s z*^{Lb<3+etrYNYoegm`1 zw{~eoj|knA=Rkl50z;eL&5TIU_&jvm!tdcx7VJT1G+$G2Kr4=s*DS zGyi&Vx8l)UgH!J{i@FCFBVq6E`)Ma%OhVCIakcljTWaoE^C4y6O1@!V_LN!5Uk#I3 zX^1P`mZ_?<<`F1*QRq;TG$!tdu0Nz5@kpS+T@vVlx@KuBp94^T@!`QBeUff(UJ&PZ`*+zk6NhfOiK7N! zJZ|9x1IR5Y+k?MIZRM4RQP+?~eyiEwqjy(gJ zZnMhg)iW_=YSXNlL9AOIN;G&6EswaFu19L5o6Ax_GqO@~@m^T@P1L&^Pech=K6|EW z437S#F~J%dYVCS)-$I*?_do!dW5K>`DfX(;@B+#FLp^!U@&R|<^?1r9tii9ha`P!z zvns1~RN$B!xe7G}pPoKtZOzl+F9=af!NfYs9?da_EuNE_sZ5CBgIFwuvHrNaI$hFF z)jmmgg(m?nw7ysi(U&)HHW8b#+obNH2vbPrt#tQPS`m^Skww8%(zvaW<}d5hxS&L> zTN?AMZ0V#_fJQt40N(UamwJYmKt$ zAN#b!cnrvmbwn{;3Hubz^#jEs^~|%69)E~_c|xmZ(rid_H?K=wL!uCp?!4K&pG>~K zFeT*qt?33Fcax<5s90m3i;~;N@}0&av#Lf@o{`Dem-E1EazYA2H?Ny6Ag0G4#Uh)t zOp3w%t1krTO%#ilBX9KxGKt*L=@?o{$k__!@fGaPV=4jp%2sL|(oDwb%_ZLcPNb+k zzpI=Wde(ljz6)Ea2vS7kHK2d)-rXBpGDHjg?MpT`}f83qtZ$w62P!oz_E7dw{- z8|Hl*Rf`Y)imnH08P!|jFViuAhw=GJCYBPkB3id_t=dECHa#%tHoZKehGC~5uW&LV zf{k%Y8DD@la=XUiShv$?{~iDfJ{kDL`mMZ@ex{xTx%#@Y&5M7=J=Rssv-8TWS(~#e zo}$*C@-PQNo!4-rJXuR2T5ZY0%GNyvQ<*7c{KS8+6A-Pz4d>knrx;wk5{tbfprM=> z`LN*4H+GLJ-mYA46F8+;A^e()U6*8;OlIh(}wdGWEVx@%_E(W4s@Fds%rhS>k>7 zalLepAF@#~tgdA-zjU-XknHVylxn4B(HhboPr%NjS7xh0tTESCkkc#<#OP}+tk``! zmp`;cOAK4N^k4womA$Cu-=`Vjtvsag4b~IQyR z_}BOtbb{;>k%U)C&CwZP49jIAfm~ zR(_+n$||&9E2oDSf+MOZP4q`Bt63b-tu5^D?p%p<4&{ZN@T2cFi4ERt*Cdc61B+_o zuO@i3V$-O!6!V}pEQt^+kZ-5-y$4|LM2cYoCs?Jg{R45)4DR=7w|{dHb4XY4Luw}@bf!9xxodkNCA^Kw; zmQFJBPk0J#Wu6yT>OE4Ut=YMV<6!`;m>Z{4|s9dkH+IT9QOV zSQ1CmOq)$JOBuf}hjO?%M^fk>$)mp!Wq$uwXt(AX*`T}h^uewCpFBt|Ha?771{cBC zy%Pe^Z7Q&LaiXQ3H^~2RQ04WY{1s?EjZxKc&1^vzsZ4xC6lo9@TU#3^QD(gyzJooG z9FbC$Y5j5s-o;ATt6y!UTqHVv|HetrbqDn6A??tPEKjBTKIPa>&RHts;(jY2anoz! z1r`Mjei?_$3G}BKpUT?mWqzZONUA)jHJ;}acLjIsT0BpE!Xt3Kj>g7#l`(#at>Fj! zjUhvbo>UL#Kk`cS;5L)*n_68;u;&LZP#4M%DD1JV?pEvKkVAbdY|I&dIIG>T_|PMj%d?2tdfTX9=lZL(2JSu)H#KUFL*5f z(F=m#{!-?S>yb`mulU?w+l_1x%!{ml=x;QP=;dhFDYuGVcH`<3D18odQ$crj_rCYZ zr;A2fg;S)*7A-L7(*mSMx}U_Sy!td`hNPen^_ zr^CZPySvqaHf6|tj+oQ<^+s5y$tnZN%uMshF`Bo6G_&wmWOp0GBFYy_{Ak9 zC4S1bjj5kheoyh>?d2dZGM@5gQu}xCeg2jR`T+Ag@K@04)z#JKD{9u()?A05Z___c z&j3n}qSF{3-t*VPUw@IF99Z@8gliKKWRUT#I6>+W zNQwLEqF*NyiDJH8W`O0qF6*75hZ$Y_Lmb4B1eytPaqIJ&D!0GCy3CS4ZbYHnLNaBh z-HGeF(h$!Pe##>Bk7c7pmPQ^lQV@R1B`o4say*U`Se4^k7*FG zJBcqPcfjb{Hew0-%>8o?Ar4N420ba_7@{lvkP@EJe~>%^U%oyM$^ zT2!&On;LalZxnDsJpS+-y?Zh5U<%RPqpb+hz2sz{8tcz4fr zNz%r-1z$F=SI9)J3$E_>ZKV zq{y%2QVmT=bW0}xfNV#QseU-D`_Ushu3+@2PK94)xJZ%GZ4ouY=7yj2D(J39|{gmy)OnHq`2sI>0{~yRDDZ7r1^++m>Q1n3sua>8(%PB^dYUU3+g$ zidYE=5cizdbOPLWiIoEIm+Eo-$ajb?(gYg-3_A&)A<-Cp9W~*^057VCW$P7TfS4a z%>2rB@a3ayDVN+VyG>7dYb#RuM^S0Hy-mx8;V#-$GQeTDg`h-y$4i_@)2?30(0@w1jR^)rn7I0VIw6>)wOWZr2Y8@M^SZKwvF&7iy z+Meh2;(zBZq(}^#E7dO6gMKSR#COMqBvB%OkdV1+9{Gnm8Eg#{9M=POicBuCukf*M ze$oL~9>h=DbG>#6e0#;@Z%qNnziG#;{MGUfLSj)9Z-0QO+ogfZSaG(RLN3K!ZVN?5 zmkOwnk%Z-=4xTem=@r{a)AgcsvpC&OvN_An&?eS8)%hl?B4W>2-Z}G22NILIe_h=> zaQOz>8KEFOt-7eMyw`qTs{Bg6tl>`#$Xn;gfgvD^_-{>T&3&or_5)gHh_gAzmVwt0 z9i}dEAt^b+-)ed#@KPU($Ql?-KFgOaaaoJER^v;+do%EnXb}8gs<16t$Z@JfE$H(G zhIOcj>x*5qcS%4r?Qd;9h_LACoGb|eXuEpNb^r;GuQ@BBk)UgVIp zp0t(dil1fv5$AUbTfFlP`%+CH*r(a?sC2jL8>3;k5tp~8t{SFQc#i95EshGe1z#J>1)ScATjxa^%7c<~LH;5!8tqiu2_V%(iA`>rC zED}JHRrl~fOq>+MXErtzWP3Od90$yarQSTur=|tDw)Hur@{9*s1Wg>iye)t2pJU4W zQk+=3kp)t}5+n2UStCyy%n$`_#Qkc4~~RmU$qx6AIig z=cgvAzltGumez4w_Ba$Lma6-0jbtVAQ$c#%5L;nWuR5U02MafV7-gaiMA9hbhMBV{ zFLJ2>GZ}5rNQCz!U>@(ulP99`lV4hj*%y-%%qSTS8-aPQ{@Jim-jRS+S>yBM?IOSm z^{z;~NxW`lg|-|igNrLA<1SVe7z5^o)tG&TiMfuo28Len%m z0wCOiWGe$lgYWS-+#8WX@wz*myjX=TpgxMB`o-QyUOq-W?t6zM)4)-z5-l?0>OjNO zDR86bLG9=}qQM(~bO#U>EaK>0dWm*UL)G1-p}`~INB*Se@_onKvmFUo`y)|+X!irURgMgU*R7V$6QWF$FoZ?%5Pa>+4K#gD<#MI zFV()AUGVT7KIBHYs5W@^a?Ct*D%m_HmXZ?$4vBwg@;!Sic!#l_-@!%6{H8TyKU&;T z>h^c7e|h0}k6L0^ktb5`darq1CF#;)8W&((@%>A8sy4C6JKS+AfR+&hjOg*pv_aHw z^MT}k>f?gF{VVFpoQ?hR8Mojx}SawY$Qm7neS zeC$4MNK}6K#pe&+K)fl2{oie`u1Gelho7$`Kel0y+(;t?e1!*p02<^Au6;;q{8YVI zb<-0FQv%5@mL(B(&)*&^mUol=)Y;qy zwnP5!cG9w^g9jZ$RwjrXrDAgkp2EEK0aR)JK~>h$ijfX*uXX+vcQHfW#yj@ z2c5TCMdEX3O~%Hp&;m4mL-Q|!(}|>Z?*G}tca9Tst%po7SKqfGm5?Y3cS!&_+JBJqc$ebU)46I>{p!Dx#z0-p zbHI%0|KhgS{A=*wObJ{jg&IKH@x4E2GiSNsbqYlKjmj;_N`>!`&1pl2E__v($&&~kP zIOfvk{#)h%e>d6=upXktewz@$zyBo+z#5M)n`-{11Tu(orLpkbsFZkr*kIs+L5YGJ z%?nje#@*x#vprgmiY?Af9N<#o{{e&ZM4&R0bHx>&hFx>bN6AX3Ao2{T=bJo~T;8Q2 znr5ej0;2c+uyfh+waP}$F^gc03CVkTz3L>DN{tE9TcovC6Q{vMgS&q~e(Pse-I#?q zSN3VYOcLw~Zqgk3F$C-ZcVz#=P~yI$ty!i`EE(lM$_)6SO9e0Ap~h0c-T$NTkN=jXJuBU`GY!L0ny`@f@qJz!vU+1p%^9D6HS;w8yn3(4X9`(iCm(<&hc z!hdBF!l(3baX`|2ML217>jcva5N<5l!sd*~6Ax8rRE7Wc^@T3y0(iOrfC}lgbN6Xf zA>NB3)u;8^KuE00y%tmiq~R&ZEi7CNci@mrO4wUsBi;dE#(lCKOyXTpU8f6jP13rF zNq?(yfe#yJ^^_c+B^HfbAo+tHF&AhaHIto-k2QaNm!za5AL@x52=DI6y^lT`A=h8} z`hPeZ-ZFw+$T9!(r<9Y!l=kCI0k832cZq%vXjD0L_-eYr`#Qk=QE=)DI+wuv7mOgc z9GUrk9)KE=-0A7o^?d^^bSxqh13i59*^^_xI(PnYOGFH6NgO=a-5whM)ToX_JyJc~ zq9I+O;jy{z&>i8Ey`Ay9ZVvkJ>W{DV!kj|CK;`?x3DyfS{vSs;*8lQmcxwS|ChlB< zY>tSSOhz0^!g=%}4_nwo>L&hjCEpE|StRk!`N8v2^3Ww46e}(pfBQnbUJY0LUt$Fe zGDYwJ;E0xi0m-e}0rh+ciLUnO1HQb<*HiVEoGP|+N}T&5U&ZA|%3%6`JKgq8zN`k% z{0hpkpzl)lE$M-O-qdZc<9oA|UU2J|5e zau+#VY&>xYt`g;36R;}&oZ2XE`r&s(3Os}V`{J&|ZE?_`_A?!>s{GfzTHgU6rN=iu ziIsVrpin zzMg?W`cGndUw^-jULhH3D11G)zY}QfUpOS;v%L(#yO6;K1P?=vjSpN9i9}M@%&9y) zClz@ae)9sb>#=~Q{vT%Cg@i{rggsKAwV!5w8@a(SZd3Z~lMdsq`4*jT_)TB*#h*(_ z>t%x%-QC^I0)71f1beUac-)55hjL1-r&fr&0PPAHA0JPo1TPhQgD5CHwZ&Q?#7*|y zcI)blOyt4o@NYy5xUZZ&*8VW{7H{pNsk(Sh!J{t{;4*JgQdWgzY=eDf^0Ym$a}OiZ z(?r-lHV`=&%k=Tmi@`I@y@@Vw*g&_(=#&K=OA67gF( zO5%hXnZsW0H>haqkuVVrr)WDQ#2lo4TJ`D;MJq}DHfVg7h5WU3PJop3rEh_Xe_w{^ z_gZcCeWtN@x_E`rRk)+QH2ReT%mA}|LYFv^x$cE3VcSQ!l$u^je{ka-c`5}HWSf5;>El(;&jX zs?>p-Wbp_bUNtV>Iw-0v+4J|kqwm%<;62c!PKTVonaF%pa7U%X;RR${y43ox`JK-! zApG$#t`8|VG_0`r(|`8L*x#BYgKbo&3?w-kKfc-7-wPRGt?uKzn7w^%Q#Swcg|-WJ zCameyl4p`9tg2EJo>v(sD_p_NHAH{C@91>0%Jy*K>#(tx^&!E+@2GfI-IfV`*&vGc zC{8?1_^ltCPVa%BQTjC)X-~kE{!3K^iW881t*Sn5N%K|+cQVRY+P|}`$`1P>*ks}1 zb?os7rH&?z4RZh9-5Z{J$wmJ;0as~aFd*BwK==Lh1Xp?@`CPa%fFk;Vsks2ArtfS` z0lxs(WB$ce!nHA&3EQ|RL0V-I|Gh_=UN9e$>-N-|eq}#ElFDn7n%8dyR&jWAgEye} zj;yV0^$%pjj{bMsy`$sAozuMjt-599=uG?|B1XFHmx_5qxj0TNM!fqvtX!%=_$}rG zq5VzJ@UN{QUcVW;?=NNdVWRFu3swvO)E;7;!%o{IhLx8wj13QSL-*H>d4>RN{n#Wa&(xf6ZG2t*d+lGbzZAtXe^#^`wP(|Px*WY; zn2H)xKh7DwOFUQ6uqag#Thikoq}Mb$>oL?X!f9WHFDuvQnl#^-GqtQjXEH=RP`mZ{ zxV@)~A8@|)s?ID8W`E2g+l1wB$gs`}mr@r;_oz-6hyp0lV2t0tVf2j-x=%c2oB6?+ zdcUL1D46=Gceu z5YWcTC&Xf&lDpoeVWsC)9NGRv6ZRoQq>*)LL9~ng8_>NZW1A)J-E22Dq5gd#QThZd zAp~Q=3WuFMJ)FF7J3At>P{>#cQ=>wmcCgdFt7JJTc2Vuw6?B8cEex3%U9R(_eDxBk z5jbuXI$NV6SI#yuJI(0oH6n8-F7shYu)M@gpydoNdq*FWd{;GrsV(?qu{!d5KL?xd zda|J;bH&l~gM8ycGDQ81*{r`tX~`=<{38F*!FA~_(U_0#h4|URm{-e=pow9X&Si0S zt<^nVqr{;MpjlC3u?;j#S@O3hd@q)KUZH|xwvGtX{|+WZf03Q^0d(oyi^SDyd)I&d z{+RD;U=D8Z(?m#O$83G3u@hQcy^F7X&JZNreQx$?IY(_?B<7dX0rzp@)lFG#(3wHL zZrA1VlBY|9l;+MIVi>Jo>sG29Ebs2dNX^G(w$is1naV7PJV_Z*aAsmaljR7@33Ba@ zE~~(nKl?KIX6?dTyy%IjtSl^_5%247UeLR%N`G(E`MPy4f8o9A$j!^u{o3#V-)gp$ zy(zKpkLWg|Yp|x31TK8oYm?oEo$}1i8JK)0+&kSceyAyiL2sSoVsNg<#NmK3dl#{0 z0l~%~D}tqL>7MZv!->s5H1!OQZ1=8|b|07L?P>BaW`gIwmdOtAHNlJaJb_;^@8Bpi z-(fnc9aA{?z9Z+;ga7kyL%-%-5=vhN@Hp*k-m$@FmJ`a_DvrZLLn~7R8I%gB?-})| zj(m5h{c%-Q?MT7<0Ap$fn1-74J4zWhJLf5DADneteG3DM^MB%kPS=i#J$dxjHqq}s zO$TK^TBq@p$%`h|n^EI=l~QbSx>v~tES!AyO<@Nb0%&-=RJ^=)dp9h_B!AMq1e%B# znWird9ug;jQsGf0xov1=0T#O_MgN@p+?>j!(4=7x2?$a|8xo>bSrPd)X2yu(8m-20Vy|yg;#Ev3TdA5odVq|$O5NX zx(}m;#4U_*f3YMi#S}5c(Dqas9hs|KN14vvWLkd70#QH@{21k}SHGi5x~k^Hc&=a zm@zN5I{RbqP)&XL%Ti^DoQOQ{xBg_m7S@HeK69H)a~OPxu~KAAed*3z>I-KPrUzeB z=#rKTww4vzray@ez78wTTe;Z8I21%)Frjdvt*$y`dA{`}p6gxBcBR0V8fKR)X+G2e zcB@{r9PD_(f4Jf_xl0hJ(Y70UB3%9-4^bx&#Ais4R+L{EO}-K zZy%mcKv0m;Re=No`sNV@5Ln|Y0{u=F=*6J-KgaEVJWJ*>m%i`b-{lgCT!}bCXkDf9(&JK8D%P~q zzYq1NQqsH(!RBz#opX&j?5=ksDRr|FME36iGG=u&v#uU9zmUNB23>RiS3zOXUJ#=r z&R`xp;@mp`6lj3@9?ly#wv=KGr|*L&ZM4DlGDWnO#bso!ri^?Xr<+PS%3Ix-hg#stGWt6KpqnQ?k@a+&}ZkEFNGUYh>CCB zF=BO4gyK$v;3;UwtEJemVlTq5Cadjd8ckH^DTo$1a8Iguiw1+EYtJ^m^_aI|V|2$a zBi04x-})NfCy%RddtxYaHqE24`eX%-p&ks-OHt^B8j$E9h1JT&7csf9nN7s*kMO}a`_ zu_Bk+l%gGO?W#G*;0nYrmnWrgN$u_JSw`hj^!AgktcTrOLtv?1tZhHqL~Dk>X8mGL6bp@$ zo^c#8chW#Fl;N4I~C$>vHmJRTj^V};Ws>W=059Apf+ zf8PiDE@<6Sn6}JCcYr{smr+Mv}en&V!{J z9<~k3_s}d)v$wh_r)P=<;>6H3=^A2GG6$PGse{2i;)lZZh-b=a3i7TosxEcnP#3DV z^}t&FICGd0>bc;T<)f}9Jh(D=@0&+gmh8XzQlha5Pn%^QrxLH2t8M=VK=OjKOtOz2 zq_BQ@Vj>g&Nb%pG^W<>YCRigB=)zkjJ-YfV!DIG?@&hp>^nUEH-$=?|KDf5ptrw$>CDR9KlA{HS)($48vI0lOh{&y2)zN$9Wb2Wq&X{vm%(U8H!dc> z1v9OK4nf7TOlED(_1QLToR*BMveNRsGDHhfW@v2Q7*LcER~vo&V?_Nr84bSs!xi7} zz=U5;PSN~(`z1XNa}Ur~kQp#{w1nxG^LDk+Z`{ZdoQR<}Gu4DN$7KaX@kSn{ON@{- zUNajnMt3n=MZ@oh*Rql4)+Sg4Q22dv6=OUop>G#76s~GG>Ej#ZmO`bOy=N_0MEIIn%MoAp2Qk@lcA7Nc9 ztyvYy`#T%s)6SNi`|%PgJ>}sNZOn5sbAnl>{4Q}j(e?`SC2|i@q`?Qbp179eH;GaS zf1&1gnMg@m=(X<~GQl;}+tXqBj?*RDA!=H!$k^74+RgYn zaqcwz^m}qHAX%cl*{xlQq`hvg zAYR|XMG5(RxOExsT4p@+HFo`Ie0a3_op1iPuHbugcf0`IG05Ke6CyfakFDazd9fHo z>lPO!?qT)Q-?{P3_J3NZo)(YEwWm0QB2R{S;+oc~ni-YTy%+Sw5?7;=_ojyh%wHWI zD57?{8dlQ1ao6s1d6lMbZD>5sqd#_DKK^-LH1BIi_}VVT_Hk4sS_rDQv_vtKKYYN;i2i<-c5Z6TaPjS66S6(K5Z4+(1@>}3{8*x?7JA9Q~QL~bLJU!d zg-N?jJVX)Eo)0qcgtFKrx_hoSmbYN<3w?)>Y}jiR{Qf*-FxwWCT}kwrc|&}m<*5rs3g6nf+&8$G$ z8*653AN|x&)SXU%@UDnV-xsv;s8vJ}pKLeGjKK6bmt(@Wo5crkyz(!>C2_?cK=flB zX|a;l1G+wVCan`7U}Liw>X110<-))Vrutza7%es*)IsQ!OL+;G7VkZ;AVCS6_!BDH z_ma!0tVs$ZrZQi+tZ_1Ajti#$AZ%E{fvL~W;3zWj;Ir#<1zgqyr`V#H&OBk6nwK7p z`$pX%joBVIJITj#KrzKWKH>|`sYvY)NQ5?NEqIA`W_jDJMS8IAIbxvFcf4wXH9wul zA*32IhI8oaKbeYjg@o<4F^biQjPi!O!n_P05o3C5c@AIk$uCeLKl*7A4Aox4hBr%- zU_7umkr?Ij6?(z6-;-5neQ=E>FD9&t<0(|oYFh!&VLazwpY2~=-iZGjTvAP(Fb6W_ z=Fz!<#~QN!-$FCjFXv`w zOb9`(CB9kYp72}$2q3`@*O@i1&#BK8s`jO^Z-P4r?pMQxUy5`f zPPmtH0Rklh?9|IYCFbG0S`Rx|UQ4$ggL0%0zTL6`%W9TQ-KQ z@147dW$=xh&Wsg(A?LX+_W8%3`9jLGT2>0(HzP!~>fO2YJ!^h8J7-3TD$wjJrWe3V z6~aaBVwTFx6A!|eP1iiXP06jCx*%d|z{}MH&vL`YOUy-!1_UC*?Oi#b>{do{nw1b6 zDuFXMS3Nopbdbk|Hw? zCjW)i%1yH%Hg=m!u50yD!^deO z|HGe#j`6y@0+*QbN9`J`>Lfm-bk&avzPaTAO~k{SI!{(p)z%a#kh2!&hC|j z8^e{0#z86G&J?R0`_Gppj!dn6oF6WI>z_VQ(9Nr48}WZ7aZFdQ@KvE)Si%_^-FJe1 z<+y8PQ39A~aS1dJrB(apTq7y2*O{>Al zDRHg-fZL3?cJ51Y9MOVSWV<O6y@Ou1z$@ zeae$&gmhb!>N7o#e*?W{_SKWKUS67+{jg~&^H;p`uai`)pX)WY2JNqKzRP!VrR(c2 z0e-z~N6)pD?8gYe~jo!CY1!3x+3uu~yF?H&R2BI_e&`dNbV< zD`~#onI9#yvP+Td8 ztC!uPjthq&ZH+vIPSc-aUDd#B+Z8h9fyE{^q*Or4RUk0^`JIU`1u{DLP5?jZXUY2Qy zZBYwuLIb60N;0=Jd*YKH%UP@y)t|no#(lOaZ@N7YsytJF>zlrlmPpmQR$EOfWzvFo z=*)A|z>V`R1=X=!*RihqOgU5>-$41XfNxSZ-*I3=!! zTK%K@Mw~~?(UW(1K6;(f*N&(PJuk*0X?1^FXG8^XA=Fj8`)gZnGwPHb({=ML ziuw0<(KU2Ap|t}(A6sNdxN!$^rIq3Jiz*MfejeKdyy48B4)A4s1P*WGD&4$R&sS$m zUT2{XsS0<@GaMuz-pD*sq~Ynvy9V8-<~zJ-3H#XUh!DPKjxdJ$ysY-?tD>Rg6ho9@ zK+c99)fP(XCh5ASPt*6pOjA~_pBGWk|6L>Yj^i1_3OyhG=u50fvssBmyKCJ^g+kan zBtmqY`I(|%rM+92mvYQL-R)1pXmBzZth5$xjWP$48dXr#C@DS0mI4- z!gdGl>hp{``v>6uCiduyq3-=`4mr3gbBzKCLRkb?pgApe97z-=@PynH?a3QcB^awmj|K#6Q^|i7$|fp}_DEL9)2E z_E?4qZ2D+zHMq0R$w037biA*xdxKs0SVqd6TF@>PoNiWG$K)n?b zo#fS)a#M2V*5U(J85kh-Kp&=LRto3NCoj!$Thc#&5XLMV&#D`3s){ec*vH-|&v+{t zcNh`1TCy)}iG>D(kb)wMU8s^!S9Ba*=NaZ zUM5eo0G+>ZdOYLTMdM~IW&-sf$h8+_yglz_nSATZkyvS!91;N(&LxKzEaCOQ3u9O( zI0*$VVV|IW1yKpO^fCxY+g$3P`11oFmvUw|D)5o4vNi|uG?9lK`~bd_L$H+gv$&`4 zXMd4GGVy9CasKVmC;C(~=@%AW*ww;Ow6E;gZnM18HIlp!-`3A_V_iQYndUxU>gKgY zoXDGd;9+8<5h{VCop!SZI_y*~y}aD;+r6*5vUao+h#O!EzY-lr= zKsvbVRkIdP3M^exu0&(6q?0LYG(7f!3sclo-{J(71$nFR#3HdM|B491NX9k$;0!YSxri)S=IduOC+2)&_h{z2vG}E^m`js$Ru7-YAVB-?7cU3{GsbJ zbc(Dej=w=VMP#UbFtHy-{-6*GDnwZu?5o(P`GnXlD{-P*wuJE5_4t0r)%qsA*}nc8 zbtVD=KUS9|BC|GBcDiRO;(Zi}r%6ZuM1rV}z9hCfqv-{W0Uk2fm%OC@4}La|alz2P q#eDA_gCZUO%KHARS^B^8+eGocPEJxrhO3eMf2ztF_e+$_Uj9GKdcS4> literal 0 HcmV?d00001 diff --git a/docs/media/screenshots/cable-trace.png b/docs/media/screenshots/cable-trace.png index b35272016f8b442050e3f49605576f6f4aa3bb1f..e228d178656b2b5bdb8572da3c7d24ac828937c2 100644 GIT binary patch literal 212385 zcmb5W1yCJpwl=)k!QEXp8r%{rxVyUqfB@+=?F%fwgf_*o(3dCd<#S46VM)Nk;5lUO<+pZYOQ-}w z#3e*A&H7?lJP#*jr(Kuyqv@>Y=(ZK>(=TuDtYe&puQF0_hn$u#9U9!Xd|ndLh=8{v zS|>?rRIAORKGfK|Lw>z2ksax2DZ$2fsItleGfxUs*2etQ156#&;EX}}%PN<8WPbTAfvN8}I~Y>59l zH6|HZ_$|gWhs%d&0n!q5%M!etf3GYD3w$4+uIRvYd|@vg6Y9>hV`E$Ii^5B~zgK(Ass&>|E$NR##sWMkeV;t=BADN+(xX>V@M?8G z2}T}aN-CXsiNQ7^6%z^S=M76P;1$4!k^q4~2zI92@M%Nw%1WPAPsOz+IT8GDnkHXp zx&+;OxJYj*JUHCsfwGt!U8KPIK_EEjM1^)L0}@nZj>`UGjLU2|8OhzzLRlYW?d{*X zh7cj;NWgUXi3ea(#G#d&PoVV51dGRjkbaB487r#$ZkSJ%UaBr0c`y^C1j}tVi;g7@ zf94$r4pvf_MMKK*coO*@-x20XWN7PsP$U*EY3S?ji5gBIE}Pz6{z zrHt?rGDE56#=015cv5akaNZ+-B+I<(ukfW(70^nt7?=hG{C)k$QcIrO-wnWNFldjR zKXa1!m#tcZRjUV?w6>hC1zLMOuNAX|Lv z889sL;g_7@DkFI6BAE7vfn>%SR0J7#49(~Fh~GWO1c__Yj{ z-Y@5_!5=Ksw@f_*g*A`@G~Tb`1bI@!zqwti0`OZ5Oob=#8?cyb9+?02eZbo;|6C&w z2zZl#w>^JmaS6N)Fq<|(V5xZTu=8ZVB~*ZBG;{dSpO)5v{RWA73GJVj11$R&DR6sg zdt4JBa0j-`J`n_P%A>O*nQ{H(ELdm{J!EbW?Z9@_-j(y>hYU}EG&ubgh6d1Tjt zEW{ZThzPGPLMmurux0e0ge<;a|Jwu9&;i{sShDfrV9ON3s#So>ea0zx-PVo5$S;(l zt1XAJ4zY-^LU?W)lXHAhogG3kMI?N9y@yd;KQ3aCRbXEXXSbxzy1elb8w1_ec z4JRiy0jptPN&|l=E+feG+|IHqlxx>vb%Mz2>fsj++6(UsaL)n)#_yCrL?}mrjLNO? ze(1;1CQr$myYiG;x&CO}^Yv7Sq9F~&d+M6uLL!*aigz=O%!#SrG0R7c|WCVhMX${a`;gnD$HB6~61+bo;nEtC7Z-wi>eY_KHI2>fURC zBrlQJ(s~}#?CgWmREU!N8y=cp8c+5Unve#BHK?B^I06~sdMMmcrfzxsYt(cfBl&^o zUgeva>UwWndu|ScUo9>V0`;H5{P-lI1`8Ec%n)s`M9JDcORIf=bnw1iCJ4=wlDM?T+usBYiHh?5gx=(F%Qrddrwb^!f1(yb)r^0#i4;8l6%0C|5g=``y(gJ1Hn_X}os3Igd@*@=bt7K!z25Xk+J1-Q6Fk_U0II?pPm}f=XVq*EytOJ-Rn@Eg$oDg@ zN91ze?8ESU9+#oH^JVbPZ*M(X`{KkzRpgu0^E@-zcw zAe=YXSz_C(J@+s9B}$fkuWB!XR4MH2aG4B1xuJMt^>vR&SPz2k_>trYlmb+wpHbE& z<4$s`E|nf!VJz7UMcv$BId3f`KFv+qU(YF$@_Jwc8ElTCdSe-{KVD+VFO?xxAW!xy55o_RanL-`jnPuYdp32q8^e1%0iKH5d-&%iLk+#J+@Kn zR6B;x5__Eg4s*ooT8U~C$DtTvVvFL@Kq|)W{PK4CvGG8AZ>9+&t}j7y zMeN#PZSy^;%13#r^Gn%J2tD!p{ADXOELNjAnHQHG60;)XZxOv`W4rQCbea zZY_(+8?Ae7BcNXuJynwnq7q(ibS4>|&d-eawK&N|aC{gNW3|{=)@PL;_1oiuj5lnf za7ypJc9Wds2kT|JQ6U8qng)=`8OS|HKtur+a~W0jyZRB*oxm9m&4s~nYpanr)=g!B zmPTxfT3Qwt(R#KA*KbU*WhkHGI5hm%OCSc0;lW75Vqy^kd#!Q&lU}<( zCsnVIGSm3#{X8qKy0hu&=1_k6L|wR3LP?hFC%vQdvq|SZBNfy(~3S&QuQ&7)?QOl z{}{dB?~hSwP?2)X5qVHluia8T8NchH_SU4Wl}c%R`$nl)`_H4^+TQP~#i4x=>yJS@ zhdxFMsU=AGWOJ45j^)h$=9nS?0O?E2=dkV~b<1zrLi1`$a7nxJ_7XBCKH2E~v{d?G z%CLgYFVP}ECdGPrXq-HUCXB}qMkH?Q$jDKvX0H;&N@gO; zUXHL2azKiBwdls00;C9CBwi}No&Yw3=D_yuVJn6n$w?dmNt8`>c=sKDY&_{$hU4M=m?Df8X!3rq(~q^w{e3b6Tl4f%KGT z0zLhA-be<01!X;xa1jOfN&vZ2B9b;(gpxce#$rgcgmm^;E&*MyD=@Z)c;u1`mkB%O zn$7qNsNCzEjn{j#h(lhYB&JzHgGk_O=~N^OxMvQn#dug4;rKeJ{k`G0e8ko7fKGD} zVI=5I=m*f|Sqs&480EGQrF-AqxclmaQXEd9iYGWKAJL4Fr87S3U`r#;SjKP`Z~FWo z)s~%Na^kbko((ZMUF-?84g_NS%ZfMyL?Fg9QvLc4qLN3A3~t>h#(CF$i0G9s*L1uS-zXc=-`OtFi%aT z-BzJuGvt{QPtDmaHA~}Y$R*H6hq`=Jr~NbG$=E!ZuG@EEX~kV#vN&YR_R^rzm5Xe4 z0c`<ur_o6nH z$D0R|RHJRo2_4@@Woe8TL&n>Yg_8z$R`;?qRDLop{dAh&Y<^l&%vC8H0}D3uNDwE#nKuvzq8eKJgv23PTj3{TkHYH?gs z))iI)9~`EjkeGEL29Ql{gzJcbY&sz-f&n9;<*~CTnab-#&c^fp>%j2vubpsxM$_zS zUHsrm6f{o&!ILHX*O`5hdAIBh;w!fd*9JxD6{}4Zy!||u%usI)0B5pGB1_qSX2tC& z5j8mIRpPaWdFzKbGBrj!i`NpE$dK*hgZ1QbWd9sQ$aAH%w#Lr>cVfp{E$Q@nwO=Qz zUu-guG?FauofaJ51A$OFo;isNX5HZpX0rx4g!T)8`0xQ)IC(U#$UCtN`|R&lJYh>a z;aquwRVT;*Kr5CLY|BH_NTTI&a&i)cg$im5#{OFQl+tD^x2?9;o4Av4M&lE}NO3tx z&=^LgPTnG;F@$41IsFM7jLzduy!#O>Lp-m-8U(~eO-y?U5Z2m>d|x3o#L{K(lA4|u zwma@Bipz;^!o51$!tr6gda+>BhI<1eT3N8^cge#DNl{!~v`)=6+rHp6pE$hhozoTU z$@j4EE4eqlTqYlUWOMlvG|kI73qR~(a!EZj!qj@)Ymp9PTKMIJ>PN-^h0l`>`oC0e z)ddIpy}%QNADI8*tEtN@4JHy6q0Eyi2v-c~9# z_$M3T3<*`nr&{NiRf(vWA;rG;;pZt2BF9;uRjWTR>>mbuVvvfdsQegRZcj#f^+E)@ zuKU~JXAB3qLLc6E1ul%oPmTW4vj9*uq=1{u*3D z)SM+(Thj}`VDMyFm0s>!AvBBkViQx3V9o$Pm^Us0KGIfPt%x zQ(1xdm<$0hu;b&3X)3Qbx>~ZFmq-Vqpt2t}dpZMpX`a+?3<|i_kur5?^-0h?bJD$P zsTAJ6bq4<>xs@(eB={MgIM2Sv@h;{kCmSL%u-;gOq*AqfR6q`xq-@mwxFS#KD6ww{ z0~x*A8t>tOXma`7WN4N}{K4m=XYE_v4lADs#&ZrckN&-!>Kvhs#1ye(EVM~gQ zF{beP7RR~xXj#}=OYmN@2q#Z9-CNW=Q1n1Uv_~ND*W)7e1rXahPz zo&fzo4r7S|@fb`62OHANVj$I~19cDP^f0$~#P63FP)JDKlR1R4eNu)E62$eyT0Q)^xqXdNQT5r3lp>9BS~j6R~IwL#69D8 zoPTy(T1TytRF6{M7}{HLoqeR>VopVo%|Il+d3+0}yio`a_%4xvQGG*b-SV~Ty(Z_> zvkrFYI^Je%9m;~6nPu%p`(O20c{jMo2kD}xq_OW&l zjwTG?XBJcY(p8}|{R~~;@hoxw?%c7!=BNnMSrxYWmgxDR2mMr8?&OJigqU?__pDe- zc#U+yJ1H0%OM*7`Atd8Q3j4Om^sZMvo z7gWB%5!7PR(+^6^Tyq5Sh!`_3= z#(-s#!)T2M<7N{AfSH|;_&Jj~v2iAM4=2n=NWpVC8FV5xDl;ha5YHK1 z6SnZ6>XyBO^FbyjbtYWIm04i#bA~d5`c$4+ptVtXyi_L@yN3BDu1eNt^8rmyUdjDj zWB3O-as5$_o}&GYpo8DFKQa83Z-;*qh4U4QsWP+*9VW&;Vma@l0_A)>kMtkqJmnJ~ z1@mVW4CMU(WWU+~=7m{UhfIZye=|g1)VAmMcHo8iPbi!E0y9_;uq?a4SG*bC^j!)~ zzLWN-UQ>LlL1%1W88R%93EwY0Dm8Cl(HVwuY=R!f47CJ{WrO?RLp){JrhRKC32cTs z%-RU&^p9DkRpUe}vcxfCr{nRd{3c#sX@F$c({a?#qMVCSAj2D9I?@Y?1_ri^oiA5lU6al+UyQsCOv zok{Sw1D9;>?bo%6esEW65qfATP?!&4&#uxmDZQ%O8BVm_{wivF%VP_vhl=!OG5EY#&?ua13X1JCMXH zS+8L;xDm(u>;$#89sug8Gd5Q3ePmCfG6I?k5l@{WY##h)>SGVQU2yQW7noD3kQql) zNp8^arXox>9CzMi^BwJO?)+Qd)CP(M6D;q5&l#4n*zF4rN;py`aO}cyM1Y>zk@aE` z8cND#mUIpa=emPQ9Xk_mjDM@#Abs0EZCiN8kvmBvp^`j9-|<$Kg}^ItYyuPLO-#5r zasUNge!vsiQm&dx_ot3T3Z6LD$@fIh6~Orsz^}0_=Bzj(*y2%haG32kIhEs{1(oXP zv=AA+o@H$T4lDIA2sI_bHNPi3)t8WjK&>I`+zbw<9OryQFAX--CGxV3%%2+39XcEN znG~B5L_=kF*z@B8XA(E-mx$#7zsH;G>?OjGUi0>Kr5CnVn54a<1?2z zhJ&&q`YevM-cx5S*ozJxo{}x`W|ixss&YV(Pxav1rI82&F|jP8Ww#3iLfhEml2rB2 zY1aY^2f|S>7Avv!EfqN>=3-I1X9&dB++6pXcl_Hz(G`8MA0y_`~yS$nl>oFHh*Bdbp+DIu$TbC<)wJy7Qb zd<~tSf(>yX0dhABt@Cqigi#VxeByC6Z&m1R z>q;vw7e;+QvDq?45{m09;+}-)6Du}K&>ch!hH-3AHdCl42V{Li>Zf^US#Gd{??}P7 zDHL>cH@u>HN)$YV=|mw@8-zf;7U6*CWz3w_#943VgDYb2G3nD&JoY03#BZehyWP^t z2e=e(5R)g6hJ$IJsQP6zT#@J>((z!K&wet@R%BV`N{L+wjGiXjWqIHr4;!^L%$Hh8 zRM?qv!kEG+3~{uSo118HSan=&RBGFd!t}y;pFm@;uiYE%C~X0>6&pv={ncqnJP9B zOlmEx2H7_xqwBqeQNc1|H7kogo>==SEJ&^e`w42GvNSyXr@n)qAuPaYVd2RUXq&SX z^Z9ObA>aN*07LxGq=6`MGw)QA2y3ADX8rlv(Q&Zr%0AhxN=4yT>+$MyOk(1|G9%?S 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�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 Qfq*|bX{ATG51zgJe?=}!R{#J2 literal 102173 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 diff --git a/docs/media/screenshots/home-dark.png b/docs/media/screenshots/home-dark.png index 718413445cca2c734cb129e2439cec71af9c33b6..7b060785fefb3a2ef3e78e9f0bb3d79a53163068 100644 GIT binary patch literal 323151 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 z∾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

    lnE@7N>4CpY$5Hlb=(NX84`ns z!Mf>fSqxxb8)86$Aw!P^&agiSJMtv%mw_z72O9ly55(dQjM=WSTHw=!sDvIH;(%=r zbfvV)E%_g`qnsFLd{2m9W=$NPgRy@e3p=$Pl%G-r_TC08%b3o{uZWIjVk&8?7*Yz; zB!?F#t8MrvMa}{xSe)jf2Ky51uC?OQsH*UiCP(WZhSQ2(Pub#QkP7y?5vqUD82J!b zj*E8-V|(TmSU1zXTA1=dy$*s(A|2Y&j|5vm`M}pCHhTuyRleilGa&@xVqJ+sw>Zsu z8s1oNs(zctAQUVlA9r1|j5mSYJ@H6zF0DO(!;OEZ*ED} z*uGgv&|of<jp z)+mh`^#khn__7Ya6}dS6kCMkyE``yiW+RTAdGQj}{`{!((~rVA@&X0kxj^dMitrgnO>g$8rE2 zu;rTrovjKLc`RkZvf4t@gY3Z`Up=}|#3N=(jS#}T)B1rG5e+`fe)g;L;bgXIR_!U9 z`|;Ju(I#=%dw#uI3Fch|5j@N<#)CVlwRb2=mVdMb)F~5DrfYYmba~Vr9;0bhJKYOJ zCl7F>f=*Vs&X64Rxni(hq51tBz9qTd=j!53pU>$180+mX=PTKI9@u^?klBjX4^yh1 z3;|P!)u zYAf_Wmcmof!1~**;Y1NYnT)sxP2oX1(9@%I&EHn7&|+MW7I8U1re;_P?1(XCRt!$> zz-c8S@QKV&8zQ2bHU*^iRTko1(us0zN^7T*=Uwea3{;e5jS7N}tW2fmpq@1`k;A09 zd7F4R7_GCf{F-8f+R{-NVuMF+ELnKY|c9#Zff z3LWzwF$OS$}^<%9_CXPZ-mqYVr&eQRE^=DXjTUw_?HHj^~QeiNPFD$ zT7yAz*v((7S-5P52wpO!du>QP+gxtI^l}HH{3pLC#>f0?O}N zlQ@7ev62-=&?Uv@&W1)RjD73uYM#lq(p%cRf~AvF2?Nn-YxKv&@*5A1qA1Zv*oB}Z zKtDAi>H2O_R?iww?Y}J<~OW z0=85^Uw%`MzwZMI3;9KEL%#-j)gDCm4@mr$3WCs-B*tdUlsVdR9 zDi$&=a?G7f1(+EM%gQjv^K6P4sdCCfkj%6YbJFhR{xwY{T6t@rV8EL_@dKX2#l2-6aes}JwzDK(JC zYI~SdXZMIya)ABBcNBqmw`Co!CnbSh#pQsZQtaEq7Sco3>Za<3D|)nfCEwQ2s*rCz^T|+9XC&;X{;}V`fGCsRt|2Wj z2~3jn?y=OaK2C9F;jSPE{*dwkDK!k5Z*lIj&DCRyW|m={lOv#^Q&>+wnqbV%C@ z%2DNxA zG%G?HA*?)p9(9Di(?OX%v21#^61vynGB4?9hu67L&Sdz@@safs@!9gp~wyO(~423(NlO)D)2B{HRrC{QfcOaWO4N#7+ezDeFD2+o8v(7jT?9}bp#Y`JPZ+ZskiJ(9=wy2YB4qqad1$LJ~1@bE&;^$0& zg!7Q@jHI_(EABNbo@R}w^4P@1C!y3>(Xi*;ipCD!5i=Dpnyf=V-%s1lO)!&d(FQs{ zqUgvpm>AE6q71QWh3LdaK2WV`rzPfshLvvg4+(E;1ICyf-fPcr@l+HP(4(@j$%?k2 ze)CHF#O}|$f!kQN^`JPyY(#6~>i`7tJMiU=4g1UNU7mJpgEI*ip+U6d@vhsEXL^H$ z@3E--+sNl@qAB$r@;{2{=SGNYA=YWqT0I{>=69^16HDRt4ka;WjHsiHZ?nOo;Tn-C zC##{A88uUgVWZ_2f?$NRjB7y>kXgmCQv z*}=SBM~E;zXkJGSS+F~-<#%8S+htj|#c{`q22)~=LV^SDy=S9OHE9X8;E_@16HqHhA@w6B^rk0v}Uc`t-r_GIG4Vi{Bmu%4G?O(c71buO2yhR!-1kM8US=FP?w=u=bc8Z%VNrVfA$a zS9vF<1fVgYU^mC_$i0eINY<-F$#{{LrI_?w8EGl54vna{ho)_VhM$EY4toIce>U5`c<2;%$S7xZWcLIS-lSQ^+@pe7@?z?+0m#LQAFO(m_ z?Yg_b;5bs8W(Bz#UT%>nTPBMlL29nk>d<5&M?E0{=UZc0%WrDBRmO2VP=FzsDmoFD z7?XC>V2S38YTN4+!)eX3Y}qu(mwdE{2<6c#*A(k_5dncBHq)gjPC~1FCA>Za7_vgR z>FdSGmYOO*h#hva;ujYxolc9fp7?A{-KAB)mmzeIpDe$I1L-S^;g>VFF=7Ot=15h0 zGp#@8#JP(3J)r%3g1G#@gc2mYQg-Y+J-Es~v9*^=?C2p>3F2 zSJp4fqeTm;KcWoY#cgNr_<@tE(>+dCjR$i1&`o5wE_marI4#a!00y)MnE4uSQ%jzM zp8(=-MX$s@!i*_@&H9SSxmuOTW5qsZ%FSQ52Z#I#f%cu^?a1fj{?KHGnL1YjVebon zQ|2dzF>c&2rub+a(7u}3Gu`}k`UjYpoN~I~|)MmgMb3#mNN8{Hk z0R$&k?pYn($kO}?#r$;)<{`kHGNl>Az%HZ&hdlnBpZ^Eb#9ADHB}#?GK$lb-{EUC@ z?lZgp6WXKT0+0|kk@S0S8ovS>QBWNPzvuFItN(uofB*-|xq72Z#ITWlVC!TZNBVD_ zuip*%C*<=d!1Y^loc&MU;GggqI4)#{WsWTQ%u!KB>A`&-@w1iQ=!O2(6907@^`79* z`2@gcUbL9KkoJsy-_vnA_J4fof4@yZe%2M!Eh7p}^!@9^-~zNg$p3ezf3ecQ`6n=y z_*!fVJ9@ufAd@d^PH1}c2h;w)E((eu{vW1WAq+s{Y4|Sxzj{j+^cLD&u_ZP#BdoXH zL_ZVx$2b1xEyV$>w>(-CglOS?!C;=ZbE^KouS6CMMTAN?Y#|S)a1ss(sQv=}+4TB# z?xd1>W+kA%h5^KNLm>W_&b#SILv{oRNVvUyfCodi`?*#tnn6pR9i`5}@h`(7dfnjj;cQnK~gbe0M^nAuUv zEJqqZre@PmCTbLu$65;}j|AkbTfS%(=-OoeH(gT9n3$Lr9@t6y@867Z3I=4!2t3k& z2@R=m{}(UQPDQQuPcO~*_-urxAJ(9j@{D2rvsL_W!x}>p6C(=1Mbz$lb~`J(|BtY@ zj;iu&*GB1(TD0_{83g~+5<Tb(3OcPZF^lmmM$0}&h0 z>KvRO6nzD*qZ;!3uLb^v>O+d~= zE6&gHc?*Ra^5yOv5lF$ld#ZkXI7#E#tX~akxaQNTD?wqVtV-X00f4+wN|}!U=d8nq zcru?c(nep@N$4K%F8f`lr=#2I$y(v=H9s1*JrqqP@k$9!dN7_*x%M-@^+F9}zYV$y z#Ck~wPB~jrZ1wr6(q~zlRM4^8Ea$%qCDU;GqbUVt3En^%C-W9tSh*o^urgq^XO`PG z{QKrr-X`cZcsNyt8|T z<9+`gQ9iqbb_$z8ubi;VfHwf3y78L72^`=6dqZ*N+CP0RFz&(xU~zL9keq^d%0EP% zNawk+>0||>R{A`>*LZcbP}?`~ zG5=A)^uG!_DF9Y-04FQCKG73SN2*btAsEAHsiNEDOf-_p!-G061$_;*Ygb@3k`ee4 zOHsHV`R>z(xZ8STmB~N=5Pzc-3qm(~pthc?K$S~mdq;nYOD`KZW1~&&lqWA~?{RU> z+8ad@Wfgmqv-+kz^}166C5l<2%rI-pYiHOX&j6qsn*c_m82)w=Q@Hl?H?xscqq{Kt z*MQS-cdK)Tx3^MC0{l`0A=O&RVuikd7Ql?PJ7#--TIxOnR2SNRa=1G;bvmKF%TEL< zW`0`Dj`qj%;kJEw4gfeietHKhx<6b;wi8|S{-6d4>GEFwnMR(kGVg1s%(kHm0Iuhz zcV%-$l`GW^8>TMF_jI9=%N6qME#a82n z^@NWAdPDJZBx_x0;p+0<`;e%9qRbkL$#^19CbC~SYYoWuh?oX6yG{a<5?UPjfOaJ2 zxzAI5IXBr{Ga8_T*}Kp6@>J&F6?bj7d0)%GIJN`8!SA#w-k_u)gsGkQm3%9rGD{bq zYj(wX=BvhXX_oKUz#cih>`*Y^UpDO&0vJTG^KZ(}&KH(w52y|9%#x>CYsy{D;Qn47 z&L7)EH`}BW8vVq{QG<`dgKwMmtc%-p+BTK5dwS=)NGd&^VRX3gX|8&eQjto7t$&Go z^a}XmoLXsZ6NrI?9Pvt0mU{a(+YU{Z9eXXn#^{O8mv^}jdR0RJ<0HNjoWy&{?BHs~~f)amoJ6WMrTxtMF ztf{A{vp;kMyk7~;`!{7<+wB%C0{zRDn}!%my2@^L z`eVo@^P18F3pL7NZI|1=i6QGLS_tBc&}mN<0Qpxc;3kU%^bFSlQVhwp-}Y+CTYYm+ z$TvM14Iv=P0Bo5=RvjoHYhgSgPWW>pW$Pk@n3eec@i82*LrWvoB`;Oc6bZAsJoT+= zv3l2(9X5nq;EUhQ$;#$NkKAisi)eaS@m8%wHZ7yT96%5x+4uA6OsHYb26P9f@^U>T zo0r|;Eiqwr{(0@*=CD@f+G&_8IF-5Sa#ap9ABXlZ;p2Cw&ox)xyai4#eSV zrqW8ac7M6%V#~aT=TC}^H=jbDjIeVx8P(`W4+u?Tz}M#$>OLb2Kiw@e)lbzdQgqu& zqR9RDpxQn8Fx%SFTYt^MV>+lquI57;H2-9^akk97LUmT!MpIawWfTV+lD4J8E7bI@ z6wSA5WT>yTWNe{L+c?c`>7{Q)%}*-Edbv8hS;rpbm@T}y8A%BY2|#vpt6w`lCIJ81 zzzk-9*>~u z3RK~H&B*`qjaOsnc@HNn=f_*`Eb30BlRuWs_yG;B9nXJ1d*OE$PwcT^`Jr$qu9e{F zB{b<3r%dcSF4?-GukMU+Q3CTkUKni0d`S6xUqO7Hs>|FdnQyDLC|;G_q0gFTm+C*< zJxN&~VxL#l$|f;=BN$1ea>|Q{Uw@(iYAIyS>*Xpv4(ecxbM@YO^*Rfjo_7MepuP=I zKmEBM(=)``{UxVkwHBn%3K3t0R-ZjcjNqp<|UQ=}9$)vyW z=6bJti(*gIh{5xQw8}D$!+52tV26`*kpMG`Z&omsM<@rTE~H?pM3{SIFOo+{$wdT} z0am4?39afy4ddMgP1d#Wua45{)3KilO*b*P2>z@7Fy&IOCbb#W@&anqn?g-DwMk}; za}OFR&Bs%JQTT35RNBlnIwL%d`l$9XbM8mRr@S(}8LR|0S*xdpf#A!#y^AH<{cOjJ zXP+kDn|(_b(v@x|mb{aOvB`(q%QL~26D_*m9+8t3L%{#MC!xP)x%gP_+jli1?P+Cg zMOI;2`dQKMRC{t^?hhG{T@*PHNYE9ohN2oRxNf+2Bs_Rp`{}ry9{$RqmJ`~7rBUT7 zl`|Zjl+moz@O0vEs40MMXK??rT$h0G`=B~^G-YPwHD2LH1nH%ZcqF-J(%Y;5t_2`b zYOysMD{>&1y?jiYELbF6XqFB|B?~7hE<1Wpo^p|J<5IlN>QpEgWASeDr}HwKbW$jop;_TYgzgVuGlvJJu)LPi8@XG=aE+5O&*8%`;R>b`|8PfniM!5ELm`Vg; zTP2Rw!k5Ns^%Pbnp0;<`YI#aDKwm7n^pNVm7+r(Jm(=UbzZKnZuzVZ;Wl z?8YR07gC=3wZ}0cF1w)Tb!W#{`3BsPmTlAeUzI%iV(;pHe`Nc70oFCDD7adakC$33E?J$ zC!I)KzDMrXocUf23w6uH!J&=R zdQ!H104t=$yB6$}^8_(}$C0=L!x#h5yY2?TAuhb-_UOSv76JVS%PK5OJ z7!yUl=nrj8L_vKmT8_<8qko5lUNV}1KbSj8EeB;RG!S~3f9ORR@i3wfjj}Un+eo-^ zs!10Ua+1N_*S9-BEq+k!J^GmR+vn;QObclcw0i$Kz*1D!a(gQTkhAPGz99#)cVra8 z-ja3JTELUqxJ3JEGZw!+9ER~@5zT$9!B5Ne!y~^zRa96Um5epN+GI*^5cm zxwqB9<>6@Yc0rC9&6|UT%bJ1`FAr*?Kan?Rq@f9M3y3AybmqwMFpT<>2~;^01(8fE zQ$uo22f+E<@$g(rVf$5=0R;gO?(Y-uDlxv%!JRrLOzJcMCD6PkX6PHwPBmVEy!a*z z{%eiKd6=c9FX%eEBq3qyUuTM}!;Sd~pPeV&1##0>K9>F^GIi1I-F%JM_|!VE{Q0S_ zWm7)={5^DaB%~&BNkSaT2%F`mYZsYQ-+NsSUst9!f(mM_9Ot)PAs1x#%T3@#v6o+b z6c(I$Rx`9D)zW|K^!!S^E?qRIUs*XdL#8}!x6-vKt^Md$4M95W(j%mXBruyst`|1t z8#5oJ!=QZfp?VOU!0PR11G3pr>Cc(pubI2{>e^hOWxpcv3->gw$nQqkgH%7tyZQB zTh|BNCx8||_bjDiuG+14=T|y9yJFWI&Pqc9TUE+SwL3p!r zuYO~+ai1`AABEE}0@n!$8Gm4%`wE01N}G+z%BY?cOvl5;pt3VY>8RAV!VwDq(Q^z&|gs=VQFeS^|kR(uK5>7%zP073Iv zbU&3pSJnKuOe+Phv=vzAG*9-b5NQT(%1>5_&q{QJw=saW+T?Mx2jU z#AH+*i4@yOl(Qv7@<;X5kT!G9HlwLbUv)>~BA4&Ene9z%+h^WA-C^#W%3O$o;5-rf z`|3~DS90jvzC1>}7h9lKJC-kUdqW{CRw90Ox;BA9s#yU$b}ZDL??w?_uC9e=qff@8 zr2EU?Zy>}5^&kB+j3l6$sJjmk1p^^9N ziz4qx$k8eXMAqmaVR&~#n)y2Q$3;*8o|t8@y27BA#k=y6?hdFCTNg4;Og(Wz{lha_ zGoB8slAPmYHB-2o|Hf73sKR{LRW*Cq(v~6#$j*Q4b(Q<?uj z7OyK(v>>j$KbL@@N6s6`X1oudk#*hUIK+DNL6X7Y1V=+BW2xps3bz8|b##FMP?;*vlPA(txC8jLLymZx ziN4qNcvX^O+9cZ8Yd=cry0{Ck2+MJY!x!Vl@Y1SZNQUALy&BM`&;F37OkEEC9fi(RknKU0F#i z9XJwsPA5&CEigB|%SAt?=Xk8p=|qFD}8RO-w54DafY9 zs#$epE9`xQ!1=jEN;1h6yF$F!zT3B;oxlM&P|i~7_iPTmBb)q5G2A-X*$9a%|GcMg zjgyCk=)HATsbLXigz~K$kHV2iI1n{OqeIzCmu`1|4B}0Yd|bIz0)z?%!RJj5Q1&w< z<~tU-oHTi>QJx5+d(_mHW2`mR3I%@WHg2Fy=Kt;zq5=V0;gT%^vhkJk8 zrl}5UmqcJ=sUYlYLG9vOy7fjbr5SN>vu2lRaA9vF97tfg5sk*yWYKy^JRkke@GfJv zD-2?g^Wvb^-r<}noo!=}@962?(7s{I`UBDy-s-3@X#WngH#34!YcZVi&w*P=PTmCXwu zIPjI-bkOimbjQ}TLt=}dZiU4<+}o56@xK&D-dvw%4(I#jNMsXHK&)NHUH2HgE<2pW ze4Hvo;8q!OtMYvM0drQh71A9a`W=K2*NiuCf!xh0nrBfkDMB{H*c^?&%YA*_-47)Z zCLG-CEkc@V55Phm-z(zPt9Mwx+@;S2l&0f;0ohwjX_|r&@$WhWF+Ri5cr@u+teB(H zxiH$uD~)QkU=B`TZN8orl?Fs=w6U~;wVtfR!UX^-U|wS9ROs1J_{Pz}t_U}H#PdyF zK|?X;I5Ezet9XtDsD1#sGKL^A32LWdvn4|vC)mu0aRsYT*A(qq?MnpazDmo=V8n=^ zQ)m2bd+Az?5TftRa`3BgD=$YSawZ!@X=Ji2Eh*={9b)~m(3^&Q^`8V}XkT&5*Lxwo3u4F+}70XAT4N{aDp z9YS5I)q+tybjO4|gpfK|UgukBT8Fr}Dw@T5Cx4yUIPA|qgOvs{$PV=qcZyL zMJ8kDe7UE{xAyas%V_8EoCon4u+H~mOfE|bb{Di_d(4I7_vyz1lGyL3% zPYmON6Tj$q&25C|;hipZzBORK_De*fj2*V~W%cRh9002es=w&Vz>35$eDzvzcI&26 zsk7Qu)NHmD?2X_6UBN!}rqpRsL-wN|OVxQNQwQ*!-~vtCC8J1#07;%rI&ZASI#(nw z@|glX4L!hvLZ^8D8hBxJ0X4yAhkH({c_;4MviN~8sGnBpS2(>MQl)3yT{+FY3%Exb zPFrf-T{K9kWC|Zm(+oYwWM%0BQC~sBrfIZDn?_Ysg!q%7s%hEpLZ;>f*T0F!4 zyxV-Bg1C#-=3Pj;m%NrEvEWhNVwK7n%PPTO%R@l1ldUCc(~`J7r#r~JEZvY_0i39N zN{G8qYQBj#Uh#_h^i}pbgwpypr;!o?c13ny2#E*#2Z^-*qg#GHtMk10-Ob#byMOuK)1@Xr-c9Jyv;_P)O9{|Bj z6@Qm&zA$5+R`Zvqn*@{N`we15za!1}ON2&`if*s#Ne;|@FQu@z)^utSv=F?n7$>7x zZTUc=q*GC$m~UE+B#SE!S9E`->QhcdEM7KlX3Ku%&a0xeqB45Az96yM(UJ`BG2W9MB z$BP;KBj{9w_|74P$w9YOU2K<(&gMg%EnKY$7KPn8Un*8d>H`3rIx<_mDK@g=oPhsS2E3Ue) zi&~mpxJDn53%1iymaO+gdB@pHJyN57TU8;02Hk0}4E>PUEiDo?KIO-g1-(oHA}exP z=WrWW0EWk*RH*R(j(kD~(l3_2NxW#{9y``-Q_oLYV`n?lG;qZ^_WPYMn= z0)9KQ=-HQ+b$ko2)!eF`6&nm&8ifI$cBNfFcLm(wKfZ~|=PHm<8qu&29hqEF)=z01 z!Rho9O%9GY%t9S#Wa5r5EV789IpyjMDzdMBf29hW%#r;z!*=wG#4(N@DmH(ffG5(~ zqYD?#gS-pG`f`WV3pSk?Kb}_J7+)S+MPsa49A1}|F{tJw-`CT^b#uab9+wcgi?%Zx z#j+_G8&dy}@=IU!K;frnlPoKu{m`51pSfs-Al<_@5?yOe>GI{J#f7)clkhX9MYxI9 zR6yQU+F;@A`VZQiF~=>{Vl6qgGxz1JcekBi``+-lvkG{ z>>P0QH2!K0_98%qDLha`$YZ8GRiaD=k9;YHP4y`m{LiCuIZ*(@rrQ$OBp#BC3%1fI zSDl~zm`6;*9*6C*S?SGOq*`2vV)PL%uzDBs_$DXfuuakc@0|$N;hWy_!g9uuIL++G zoo`(=KRI#ZmSk}~_OrR0MxR?@h2pV0iC&Zb>iWjhU^^L9oG7zsbFXX+6HIGK=){+j z_;seB1T=EP<{DrUZ&?+`om#YBIE!I`fD%XRvZ&BKRknQ^+fT%nDF55TN3X?<|7+4# z#BqbY^FcYR(lHgvTnHqN{32oahVs12P_*1$g8tO(Io_5=O;HQ^OFB>4to%_<3oKuC z%e%YRKqySLHB;V?ly(~CBV%D~&A|6s2(A2q^0>z3`*PnV`S%bl_|bj6?ap}}77~Fr zF=YeR9T(jo-CWD3yJeHKYLQ!=x2@);#%77GF?alfxUT;paQS}6BWGt_LS~L?d2y|IuUIvUgWOTshlUF_ zJ#g!4xL)OuglErNLQd2vK4K@J{(ez#R+)>j@ax@A+>Ezh>@VO-lXPBJ2jLYawl+|8 z)fzFu<45lXmGc}`>o4bF;o~}uc(V4Aoiof!oR4d-8+M^>6?zOhA)5NDUW)ng#+A6S z3}%JN&nsXt4w)|o_!E33NRhT2w`)8vosbr3y*|4b^up8`co{s{5te;!p&FPwGT=!N zFeIG6O^BXE@b{xWT|@=hI>t~*ymgJ}z;gty*15{bXsR&)C0&v%hepkoO6dt{N&zx- z!>N292V9er-0W66YW4Va^Q1L^m6Hn*@_EcDTc^+;jRvqPOe!j=FGjKHM(2Ls9PTmr z;S;C%ir<4whms!T{45ZVaj|CYmcY2@&P>D_Lok-pRkZ2S!YSE983Nu}Gzz@TJ?Stq zsho_7Z*+?K@oc^D!nn6W4|*fh-WqL58+iY&(v(L9C5|jqoAUrU;;C~r|W#PV)Lv;tCL*6W-kk<)%SnP3odi<;vY8tvjRjWl3O38w=hzDY$Qs8Iq-Tb*e;PL9yq9zrD8zVE)_vPBEV$NCCjw^pb zBrxno;VVL?ugT8$(no`W--V&?;Jc^bO^7|PTfO$YE~t#A`u{W}a)U{nbJ0ssEUMiD ziSqg85(_*Ox50+;(dN)ZL*g zMUiM8XyoS-ep^5Mvhjxq9tN*La9dLC=gQFnEu4%W*Q0;ibKtfxS1pF$zH*#`V&zmy5TO&?4=cDXc-aq zx2Giejm-{{G^}Q_D4Je&u$rvm5&GXE}3sNGHcoLTd2-bKpRZ ziJ|`R>X~lO=j^a-N~?$=&4n7C5t>_Nxb6kwfd%5`_ohjv^z(FVD>vnFTbgpkR?|6_ zjtqBZtczdEIp`smy}b)(RF|!sHdwwqtlsp+wWMV&lp69sE?7a}x(LgdqEa<(nVPw? z&>HvRnYAv`>TIR~%lQc;8+0u*7X6JWCi@Gt((k)iHU)4LDR^F+7gNbc9lL2j*^P(o zt@fnQ!E|YDWF}fL8%I3CremjU+})@&5odbsyRUFEclA9uuvya`JAZNyTyn46xT#i( zZ_h#N#*xi$z$qoulI^N(isjy4+O=(Z4K2b;dfk4qn4aYf#zzSh?%#SuZD9pK3@L#F zDjHDGFrF%i>5t{B-p3u{tkjKD=fv@Q88O=w?0?y~uRVa>_XX%*erHLb;bj$6HaKid z?7Ya43VXm^?2hy;dj(09F~W9A1~Y~nx^EnnN)vKR&xU!w_j2B!Q?5(h=ZEcRsA)PN`J%I+9lS2g@^uPUFxX&C!A{Tvw4AxKUM_VBW5kwO)Cw;FI#%Hr6oJ{}pAcRmqx#2F50szQ# z>{o(tfv6GjjIqTE{A?vMVL88f$0FS`jc zLQc!6hyQH(7rSWWt@{d}GIAiudnY$+F(FrYG)=Ss%jjgL8r|x96;#ERwebl3DhoHn z2_NXqr)YOh^Cp^D7EX>iRHpYcd<>)8sIEu?IW#`vhCZ2P9MFbwjYLUOzX<+o0kj3o zj_QY~53NxgR4N}{5hk`uC-!8R)CCnDg3RA%K1ql&!%qBcWd@hYBU549l+lrIB zEE4RLrv0m<;7T(z*a@o{OVTBFk|f2$Q^Ywd_PT8g8{lH*nR*p(B`+?|xY-CqVv9Lu4SV@XLgkFq5hkh-2;M}Ny5%bgHmJPnt4P_!n#Y4x~HQ|E6 z_^WzqYEyQi%+?oNA9*;(nYc#fCW4wq=MoN6VRDt}idEHcpP~3+(wFNLg4XNYF)g?& zeg%$a#q(MgvVmm#(_%akZ~^G{2%#SmCQ$m}*$a=*&3U)%JFnv{13T`(hv1w__fI+a zbm-~nELIm!=+cS(Uo#7p%J30HapBryVLmPKGX2ENJ$*yH*_=ig^?IZa%R1RMqG6rE zA04leV2&?DPIS%al8O(>no)3#IE$l?b7}}GaX8YqtM06>-S&~s= zEA-)(DicTmJpJ6b#(e0hrpcO;2u_7!c4)7dFKniF%GUJkc|=Y)s;2hu-j-V|S-0KO z8&uArW8$F*QMNh1r-~Py^x8ErsIyt|!ysXdvl!KN2`iQ(!K0egr-LN7tSNMT=K5S5 zA;u=^7x*oo%K2J33T9pZBt;~!S5gTPh9omM8wQKwjh#eDi~HJ9FpP)u5hj5fX<@`* zoN29w7Wo&wM$E{581GjeF1o5YQr!$O4xhWo0Z;t$Qra|lP6j9Xrzep>izo7fS-Hri zdu2?&5TcNZtL=^oVobIXwnP<>wCS5;`7Q`ara`r#`;)=|HeXInkVX1@|I+$?IJ5Ui zhuerAkyjy|Q-X}09!LQ3!JD6T-Zdz}DzOyu9KX!3Tli=nP8TR+ zd_}(OGw6{mS_3AmEBV0}8Isgf3bCL=*WYW0wF-*Gt zwZQO+I?s*qT%$=ttj)FuK1t>UsoCe7^DX+dD?#EWIihTIe7UxYGnTZ4l_qCAWS%kA z@AcncEVl9?zUHf-Q|-N1&U?&?VYP6&YbY1G=;iQ|$yjM8e(0Y{52uC8 zK{vHAqe*G7jHm6yzSkZ%`Cj*iJnsw2BeONmcXnggVQNd`$-}f9BJLyF0LccC36PwJ5~b zpL|iv#h2;l`iWk&*v5`|M;Zw;&W?3w2Nm}b@cJ@K*pWS*KPxl}=SbFw&rIJGJJBuV zqLo1KRn;u%kwEJ~w7)V_Vyzw*(6Gtr*pNU|yAEK@Wo8YK=U}&P>`inEgsDWN<)bg5 zIt4QA(Ay9(+&T0{*}~A_%I|2Ao&yp5FVQ=U%2+x(SU)0*84BcuW1D5FmsJa_zQY4wS3Z|BL67+UQ>vQ#q=0l`eB{jI8`*1fRGeE^scyH78CMxd7m6iwqK4%LMfoIX1zieD zWBA5SyxsrS)8FR<2}rQvdx0Js+3DVALQy89k{Hu#Woz8I1ufEvbK97JE= z`UnCq)syrAnrx34?uzpy^0FpOF-jgG?yF5$QH(?J2s8ENtDvv_;Y-tUly)N%w-BVg zMS2z$$=&tNV6i(zg--@x5@`9^uf35B_lHOP7_!QE*!K^S_RY7i&41cA&%p?K)HxT- z6eqB?P!7Nc@=rEvxZPuNsdOI#mB?!9#@eZ?zW0w>GTJVCOW0QjGaYlNxDLCcdhyi0 zt+M#cA7-Q-aumO7n@X=X_`tt2>izZ0$Gfu6i2~qwM57;Eu{}Bre1=C_M~m!>qgRUW zp59LwvRpo;k6}CB*O_fCCgHYT036lxVwC7G{6Sn9j#mJAPRGwKDNyKRRaP|NaH7qk z8hq&zQipv0khXWBzTetkO zH%BaE7in`uR9&OK&83qOiy@O?oqC^m%ByNIHN+5}%fsyn-0xklfeJ=~3@iGWH>P-7 z%$pELc`f|)%j+wra0HauPd4%wiI#z}wfsg00kC0)iWzMADg-Dfu$@GH*oA^ZG*)D^ z+SYg_zvTsaj=hTttl5#3&G~WHj5tMdvVPfQOCRD zSIk8xmCAkn6CV@Ku*(?;q})X|kL9w&(##3ezd3@>$s zjs6BUPyh7xnp@28IbQbqkQULYwIjof)emwQ-{|Sj6sBNhqRI|W+y0Z3`ArHXI#c39 z8P*8O<14s8+I(JiXk>-rv7Suaa=W+4pt9>Wspo`fSrL1IpoB90!wgZD41D!zl*9fo z;*%<0%oc*C?XS=L44$<>zEzfErbd8XY}hiM$y(o<5@LN+U-~yWW&07ckRfJK1G+v3 zmFPtg6^_J$7(CHK@<6Z?qQK*-LBoX@?!meTlrnsykBxnPQYd)qmEBw}qhTn7+|gJD za2XjxUfTNO=y_}!Bmgv~(CJeB7y~XYwIurGpPis8Q(0<25XD`V#7+uIE+%|Fw}JC} zM1&F&a4`vLT2yyRXSTWihPC{i^I&=RhN7~vF9I~X``+dA&reVH74*J*Gsf)-;(e*L z2Y9eJDLW_Lo>$`EUTuRi;4*;l4io^&XItHn(@>-liXmh8egFPF77!2HV(=acDv-w< zO?~~|8T5*fDG+O`>)rG+S+RPlNIGxjc)Oh)KwE)+BK+mopjt8h`cSO5@OdN$B0m^M z^NU_?*!K9!^tVTm*jS1*th%GQPc%kzN`*?98OiT$ny7+#v%d?Odcm9M%}b|;`_C1~g8l5);NfNmu^-p}wA}KuivQrlM{rJ~t4enn^Jbn;8a`1&UeAyHlr1@U0;=WnTBGF_%_%YE$ zotn{OS|5RroI->NMDw4U^{)4;;C?LoNq*8Rkh+%?n9U5rafa< z$Bnpj8DL7ddAR+wKQQ12WPX;;;C@K4lOC(q-)kj|Gp z=ghkKl&4%uE100gF#u1sa}7s+c^{bENs$0Z1sEdlm6+n(y*u(w{I~tysxOSIhdYAI zZmx<51XO|HZy@3~H-p0`2PnB9z>0uNz#j%ng*Ni!N!6Q*@9z$0#M~7%@$>FkzT+cw z!ojhOUyQA@@@_X$u{dkoGoYZr1^9u%fB!%#M8R{|;PGs!zkJXbv6?Tiqc)2ObC&{| zlq`|h2%@lXz_T+zB%bY`HlR+BwANdWbG~?tPo>X|I~kfA{``G!o^)v)Yk>|C&=7dx zxxWO446+F7bTAE~JTVVs$zuN3)2{g8A8srh5zg*q&J!jOxo_Omc zXRFJ6{P#irV^s(UVyEKc6Z=uMsWY_Oa70s{xy!j ze}sWXR9N2tEB~PaOvWbe81P?H_^+A#pMMZI{`PGKPc?##5J3HR^nJ=P+^GL&?*C_t zzjMq5G>X|31E$Lv8w4j#NW~}e-&6N*qxpa56NC^z^tbP7*q9v@xDITZx@C~(4G zegg_H#%2?e0(DlDJ1SeAh`{OMM$Px+$kph!T!wU_ok@;U{ zw*+VuB0vF{`A0ZlmnP5v>i=SL&@c$-I~gN{QwoFv{b#L9Ni5L(+o|)P=4u9LB%Xl< znCiC#@MU@-TL}M)*-*^>_C1Uwo=S~^AoX{xL$j%DaQ>HlWCb*$8Vd&I^Z&DtARtN* zo2YvZQ#|5c_^xOTLS?`ow)XsmdL{i0gRzedPKWGmKF{Y~#FTFM|MNG%cz+Kc26ElK zR4_>M@4z&rWd;9bDd7B)J$%iuuMPhWw+Ex&l=65f2`h8+#{*K!jR)Dr0viUwf9R3- zZ;$rmWR_`Qko-R;MGxfsyD<^`-v&V#>+eI-*d3DpTur9w&+$08B>yRPR{5Wk>2L52 zn6~y;mW@$hP{7|=N5IP9)cdC!P#9!iR4XR`(;jHyp2F%nl$N}~>2V@Tk457@9uv1B zf7cwt|F!1)4Z|V55kw!FOl0JpGO?`}88C1WSSUYKISF>leW#i7>msK(G&d?0Xubkv z;HrO16?%a}0j)hWMd-*o-wx3h_w@_@RPYTRf)69yo>P+K7Q?v1^Y2~*PlLu3Fi01> zUndVcL#P3|m=uLLODEe5=LhNTS3c9&R_6uM`1B2pQ)WjXt!jBK+jx?doAf>5^f#)$ zIl$Tes~k8pq78y;mt;UFm46@pG_seP3_9)nhfV~2z6R|Z3yt1$wO{aryxsHd!wHy$ zifUd*aHgPbJS}SQw%D*iy;v}v<>PV&BUD_Pz$xCCU%tE$Xegcp^_`F3-fzb>5h^(j zaUc30ek=55yS8>tHf1DE!QE-pgVwlhLhjR9QJ`v5p5>UD^bVVJmp?bxxffb z{zMINjC`dE$hke$gtHSCgzT3}8jkwCSEmp1yqeD)fijICQDx{6x16?xAB6{Pj3#WV zJ6xZv^b|FN9}K2J)QVKM0v>)}bapV~RCd#i0baShne1P};7u$FuJcUnEhTZ~wv--JY($^X?t~jTCuFpG^H1 z8<3{$Zu%mVu6f{}@74kmGD4skNG7J$nHFim^G_12vb!eMU2;NKbV8zZye#0Z9lFd( z8M$9WvzcjTBPsPdO2v$G9z$iL-x^9o2Er&(fTM5*(5ku%U-yQ7%zx{3{AH=h^v>z zuXr~q!X`Wp%$ItjCu&uItGT-}eS5RD=a_92*A|jQ!$rQ_7{Pk+prcnm?MfCkd^h+& z3_LuYh-PyaU|){=`aBdgl4sHi+3|C(b`)4hW*5dTVuUmpr)+qz7YVVt_Pm*0GAZPC z&4+aerqhFr7du5xJv=Egh1!B|T76@xEo|_L_p+p8yk^G?FP41V?^p~wQ0qWoPcKx@ z0~K?s)J)-)$j#=Y-#3C($Io69Sfic?7FNF`qQ1i%^&NKpWUY3%*!WbN|Ldlr&h6J& z=uikNK{44*GTCaIcdm=8XsuK%P$1cI?hzqa+`Bm_gC#s`pGoYJCgz35`0l5%!{!-K z8TNy>bbgaY9%^1wcCE{S&GXD>Az*uOtL24M`jn{Y73D%94m_Dqz<(b_ptpQ_Ae8XG zTP?@7Stf+&4JuGJEJC8G`~d)9q>_?m$xIm{HX6U+--?dE_EJ}ZJknTxDAe+`PMM_u zyadt$v5A5MYk~a8mtym4O2sTZhQ%Kw3aV!7zk>Gmg>v^@B{NhoDiV&#C{3hzBj@MwdH_u@KMeD)=d&<(s{z&7-~xC9RP3(`=@gB?Q1V zsgL!NK+t5$NcRnUueP^5dn0rS>J-ckQm*{JfHgF5T`hpffV+Z5n5~Cjl2YrhxQ&*; z#lz>?HSd?y%%&>*qOgLReh+!v?OT~6{A2PVl-X9Ka|VO?UIz72);gBgKU6aLJn7Vz zXzWk)xIXj=bE;ogBS>3xi{In1gDSqk@YOoJxgG@%Fi^=D|2zJMf5CaaJGxWb>hlH=ipwXPbIs)r z1R;H2#y%di58M^kgX?a;7~;Exu?r|qpBkNObHR-ENGN75oF`j?GwyvEZp@Sr|8tJR z3`(@PYCY~z<>5~&yGeZs?pIq|TsN2c3Dft>GiMhkL{kr}<6coV?wngdN(=J$!31vD zG7$k=|BZ%6lXEB9f@2YJ|t;A9|#PST`CBERc2Jj^j2bDS!W1f&=!vddK)NzCS+nyX;} zD)xR{FH8SV`f$#6sn%zrW|QecVKuT6${$_$<$Gh5q3+TqF&>r+POuU`mwMDa=^Ca^ zIKPKPNlA*b$P}?y@Y&<{enc2rOj3e3{v#$&_RgsL*Lg15r=)I7Kyap~?a9~pwqF?# zk!al)i|r2Ws8aJd-|EFZp+EJx#|y=wWq`wG~?iV{h1jB+&c-%3Se=v}v0v z*Lb)r2{^za@09k*otOjV*sO!Kc7e&Lo1MGsxFvf$31z-T>@w^L!%-79`?!syn8dJI z{xcR|+!8E1Q|QgPPd?g68_*ESe%O%-l*SINc!>}^W_GyxO%xb~2TP&fDk1I}C8~oI zBI&pFMil|5Xiz^r<=OA=czP{pCP2Wd6=18^{DTIYHgs>Xdo`VIgjCHH1s5NvJ(QYZ zNjW=R7XujFiJApmskP2cPUqV271H=Ox(7ZMDMn5ed?+M#+#dBmwzXx@odR_L#Qx%! ze?cros=a+t6b{?x`1Xk*g$U|g?`IYoX>oqnpJrYVzIFd&ztm{e4=&L!eU%Ebj1$mO z3Cv!-qwEU$v`IIFoz(H18-s+z2PY5kXS#;LxwgfTnKD>VYg8`0-c$hz^f9Z|qv6mf z6z@dsVwPz*5hhk`j0j_9g-ZJiX^eRmu`FVp=oc!y8%><%u4%xP|NQ0Y5tYR3`m{PF zjY>?vcAbR&6Z-;bYwmut?^B5~9JBVYd%^Dpp1*N=stu(Nb?4(p7kJz;S-p^H0wy90t`*9D%C!`Ev8TqSmfDc07D*oEpl?jX>{VgC~Huf z=M6^l@Q*(?cA9+S5@Z`A+xInP$y2#CgWZO3f$(`*eX@S9FVk0BJ!M-d$_?Cg5Ei~H zf3gwm$G3l~lu49fzChw%>lks`&rGMi4qz9hk_^jggVjcoUYAv@X>;lB9;HorYHmho#tx~*vI+_~YKUvCC#1*JC64fzI6oKRSQq4J$ zpWvK7TYs{0FZ&)*ovv)I!U-41fs2znoWuS2=C@~TdzV4`>zucxN3_YteKdZ1O{&EP z{3mGMUQ#uK+Xw8eE;aj^33hMfzP=;M#Xm+f-<+!glm@a|i+Cw$@qLzKY5tl9J3Yw(|2m&T;~e^`6#pt_nqZ5IncLa^ZO5L|-0JAvTt z?gV#tcXxMpcemi~?(S#hdFP!uXTERduTzyOHdSQrwO9A*?w{QEWydP+`>VNCa`}Q5 zRCo4`{5Y8eZTlya6i3MSngl@Gr&WPuAN;$-gxIdB9S}#ZK0(SkcC zz>a)>ELjBB&)Rstu9%RL2|j9#qj6^{yLYk10t*mZieLq7%!K1w}<3PM5>d zXf*pwXtWe7rXb<})v^Uv;IX?A0}}q=w58fycMh~B`?Cm~*4F~H4?&haIX)0T1$dWx zQ0+1GJ8w7>uKsiLGvDdyJosf&%NOWbQjs#hD{U?E&q#$b{{CkHgsP`WRikmjh~LB* z3;BBKHLl+8)XK0}ajKCA0~g{`FRxsDVA4|w)tY;R!HDgSz`n0kXurWU+1+cMrnEr> z&*W!G^^-Tbo@;%xE%GCjD%qNvp=NE-4>!e(?y!sktjVzoJ?E0D4q zEMv3l-bmXalh%D32oJ&_A_bUle(2M=dM^#*$DJ(Zi+%v(EZ4p?!P;a2^acJ^YNOhI zvBf?xTHRtXi`yW9HA^@CxJWiPg%(WzajKhK8e;Un^d)+Lz9bAn^hhqB&SjS_43`6! z<*0S8p`LMjAUqVa{sgnr=4fUK8I&=Ykm!S0cbDdTqm|Yw3tt-%R02ZuD&8`wyS$U zKr@^!pLJiBIW0AuqwZ-j^6y>%V=VVp(e-#1AtD54+nvnLH=MHw+Sy?e+Ue>iUL=j@iJv_zA$wJwzu zj0Cf!ZZHJzG4|}A_&w)w_Hmds;IHW`GQnFO-*&Hk@-CagvD*?`^|`3f=S8EV00B*< zh11tbP;1q#i{ORwn~*Q{^6J7Cy}=q1e_AK>i=C?-I)Mtvx2@-Ul286oBRxB=|Hx*v zF!1NnMK-zIBa=jpIov{N0I7%@DX-J2a!<-=s*;Rs>78<$+xeauW55U*D2Mf9`G~BfRA@!6NV}$c4pUx{perAp0Tww= zlJIfZ81LuE`FWXk%STh+b@pd!F;=yg`)ex!=a^|ty0+kw#D&^@Iqih|uaa2Pwo{lR z-`RuHCEz@4)6Qhm29|#F_>nZ6*?sE`Tc7*Gc6B!61I_J`7!%Xy=p2|K4D{4)n$}@R z!NAokcp^uCKtFh+pt7!%$S$xc4o03d-hWAHSevm5UUxOW%8%lK0psxo@>4vZ8S3Am z{7@h~K7sZieu3j?rWByd2LRFQW>mY4MvsZAfVBJE{*jtzzvolfkrJm zVlw>)a%4MRuA`PfUX(!Zv+>1o2)|HBu_sVNFPSUyH(P*%^=+;-+#Ieo(v88L$LqsC z?8F7N^*A6nO>07LE=l0UNQCrI%|gUSX=M_auYs)jpHw1s7(;(mBD(^2yYt{wraY_4 zjU>=zBH>wjjVNlUTI@u>bpFa?{Sncrl8*$2@zM);e1_>tPWzT^Nj)H7m^bba6 zMumyWk&!Ww7lwtl++l5R=Z}Vf(7)}|4d8Ip3CxMd|E!QhLFpeg=&Q;Wjb%qU=3o+5 zYLp&|XGFvNVNwuLJvLvy(nwLNp9bhLYi9r{h+yTqd$n_^4$+7@nAzEJd>ln19v~da zqpJTB`+d&zJK@4D78*okwLHcM!Y14(kYnoA>sJCz?RcojpVgV@9GAg*+8kys zsXaH=n?-I{o0#!p{jv>tuuu{!(|Q~MEcN~{ZkIG2ByN7evh;I9V%}TgU-cvYAkYTz z)=)=Zt(KXIRSFL46t|(A?*mrZJ+ok#XKMt;7EmO;P6tSWO!2_fbx^;!zhnYIf#P6CF(Kj>+UtIp$%9)>I< zoZ;qeXM>IbVd6$Hiu>bFLvhYmQF+M?(UZZbtObspq+I)@;jaR_TfNEJ{*>&+S^Qsd z^=e4rKIJM9ZitZjCx!h0oGYlq7!yB+jC@#5%F`zg=s}SP#O3uGK7WL}vs@?G{5%o8 z2M(RNk#%s9~k?A`4)97z<%V0!-!~hOX8(cTiCT;Ggk5z(TrgEh=5q05ykX zDm!#??VkL{JQ45n{ki`i!7f&|mmdmW0xsWv#$vLVgrwA)etujg2}RR+WB)LK1yk2S zZv`U7t<&&u0V6^S@6)0mQ~16*sz8%$YQW?`rze(vyrje|MLUXYt1lGFMe4&J;7t4$ zXukKs?=LMChJjyzi$5!RzrQBYOX{ykC>$OZVMeBF>RVB_g$`Gjp954kr27tQ zfqu;$wc%p1_}x4hM2CN8uT-fc=-0$4`cxyl?H)Arf04$OgrAraL~qpWy+^m4OaQo)ryJ-cwO-aZ11{ zq)!M2^Gcab_0yU1^6rd}L4iYQ7MOcoPij#cqLb4JHd6se6d8O)$&hBms$ubz5YZQi ztRq88SFpA#XVbXW?VSP$QQ2z=y>eITSii{H)zRJ+v^euJYSrfgbZF4)TA48Q4@Rh} z-|Dt6>P4$=Q7(?k?86)3v&m%fWI-fgg07L$=PGFi)61wREPPh&6v?mOLM61FI8`fe6It)P>mE>n`~*d_+#>h#fEhD+opX`M z28u+BME}+2&EH_i`Z_V!&0*p_}%lh}15AvF^nQ_=ad5KVY3n{Gq zafRDddP2YV3F0235V_(dmpVdTMVWg1@mpl~J&EMQO{P7#T9@bLvIRLUBP8!`St@nb z{y3sINs=n3>)2K&E-LKlKgRQe2m6#~ymHd*?$qLJgcq=gaAt)LJy_Q@n|12{s3ES1 zB`lBDCV$r$V@?n5jz#_%3=L1JM&2S4W2yT`4YBP8s3AIwmI*ui(Q4CBkvYv_DwUMC z%YY0!`W$=ZwfFk&xon!?Yp5H&x4s=yt{qR)|LjwsTJ9!M%Nh^teHY2)NO-u7h}4BR`W zRLK}5+3kBf(`z|i+I-CWx{b*}LK!&=h4C-FevqvsJMBV`2*f-a6mw{*+0w_OIGlFI z3=Ml)d+oMulZu;|qmB}%R(L*np#nyEWwolbCu@~^U30tcwlhjq=sN=pZV#2|e5pEE z6v(?TjiJL>6JA^$W{A!aWdu1r2)`eL8R$CP-^}ma5*!)?y^L{mC%;ah{_RstcA(AI z?n?PC5x|A7Tw*?(wm#5tvmD=W6LfoH-FsefAdm7X%2IC(?9;;7C^v;O&1lh9GgFhTo84uT^&)I*xcgSiRn6@XbDq zc|uctZ0PaOmb~&IJc>bhz=CccE`m*zt3H`N-~t2 zJxO7}k!VPb;z0EpgkGqBh7?U?$sv2Z)S}M0zu-_^8D_x#k3-15egB=^XL)@FtEqGR zr%9l?5PP9PvA5IR|GTzcer;k%wW=m2Y`TV15<2R(Sv=cgkmCJ$6dLFvu@)7?w|fsM z64U$yq`1doDR{+00~Rt~hBZc_jJgGQAcO$-%1uuF_L#I*k9RLTsIdi{`FY>{i#$aP zWb`)fX>ptDr>*c8z;%`UI+`UF7HODGEIG?lF?Bqh47bYE$8z~+IEc=UIrG$ftJXNP z9s;e+cZMP6M~(h0{5t7x)=kFxuq3U68~C#`RX1NqSlmNI3GK8bNJVZZ8Ua#ysk7>{81v*quf;L_`icHA2OW?;*iN^+aM)%M!j61Qb@?IWhI-;dIBzvq}4*l&too7U$p>M@PLufQ%Z>U@-deTLfH{4=`T=>=T(+ zJ3a9ZCV~gtc&}n_1knE3(B*w8F`Qg~5f62bGse$T(q6KT|4Oa1i4(z2Q8vu-$C1HL z@>-NInef(F%!}D;oS!`1Dm?}ccBR40jg&IME{hDFAQo9de0!+ARjGA5^-x6f<{rUh?1j% ztc05VSfW68&2}=u;ztrg;{V9@ad`F1kd<&4;hP;EWY~-mvFuDyjKrK zOg`%WFX_doBS@69rw zf^Ja#U6DM}Mo(CW;FCNKyBkFG(86~Z=LYko1^^-p^i;XG_!zZ%_LW)nr+l#_^AuZAO%QYX|Vw+x2fVHy!uq^NAi0E>ZgkwT5*Ch1;B;`kJmP8qcTH z;8jOJ=}dRAu3B#myEg#W$eZlJ^b1?2P2FTmmRDH?_~tPrGbren26p-G6;A*)9vRN+4vU zr7A~__(pOshbnFAVhHF&3p|u?H`=!k)B!OZAR39OOTluW!KmOgl#>H7RUwR5jLn== zh}oXU;%PTpzik5IrVFkF_*{I1MW|O>Fk;~_^vgwqDF|j-00G}MO(arn8c*OOL76X+ z*uUbqkv!1_*)8YZ?sCTuut%?QG05jil|%;b&$hVjAQdY$Zzxl!9)LF1FMqfGrY&e= zUHJ|h+Wec5;)XQD>R9GhHr)W&LO8Nqso(RDoXw8;GvaU|J<$}!jA*yN?)oP3|MWx; zC)^s&0_yTjiuk3JD=?##XTSh%hx1LF=Lk4O7$Vc15&&vz*NT3j^R=`9k6yjGXld%oprVm-Hqu4DwFeo5Im0f-Kr9CB@ z=R{WHf(4{~!L#!xExG&-{1m)@&Q=z00}dsY8bI?OT~vobGJ}E7L+&6tk4eomi=f%t zb$%#fbcbF2$qeb$M<`(ZW2+J|p4#1=4Z1xTTG$cHGQ8Smw_qu57%K5EO~fY$Vzfhn z!N#*iZ`s_z57`0fp`p&G@?o3Emo)S~^E=myq(X}iJ`AV-w& znLh5p*PX!bXBSpw{Cdd0!rWV5d!vE8^9c;=JZ`lazfsO@8IGYK3%j{ZIEIW*i{?6N@kKsOlCQ(^6*fYUD%L+jEOyX zfd4f}-r}xM?)XwXL^sz~XTBGvT&=6Ux@a>X;CQi`FaHS111FV0r9$sGL8Tz0B<{`Q zbeT2B?wJ6BLGQ*YoLVl9#^Z|hmaga#=kIq>F zH1D`ij6|8f-K>mdamW&!)(4OIRWlk#g+MU>k0jy$^@A^>%Zh;auN^bsrd~WGUtXrs zh^jXbmirMdJWVL{Cv&6IGqU1ayZ!O)Q6{7=;37!=t01i8pl>+Vc%#GjpX<}{DHIMr zUTkw_v|PQUbibL!iGhIt<;TYq8@|J$1HqcF%snmcy6d6)qztseuKq{MwZ~^L9SYdp zr*x4;jtNK9+lwysbBh1t`h0ke`8OL8@V{sS#NMC&zlU=LBXXdE!9Ra7lotwmC6_M( z(R^;pVS2=A0vzyVc5otRwpc8cBLOr+aZ3z|L;xflj`hpEh2EOYb{|1azZAx>$LnqI zZ2%7dN&0J#ibN8UD;7&Cn!to%!7k#TxFArb(wZxI2!x7i!`0B}A5ZyT1p(0T_4 z;ZW4^YTZ3?$uw3m1K-QLU?dWL$rv(cF^Z=Z2lK%&494*NNS-y>V*D`z1Ohjw-zU?s zY_|J-ephz>t1jDcGz6gu9`@K;m;x&|CZ>{cu5v(@bet2Mlt?$Uu zlvYLWO@brV7~F0U%(4kV-}p8~5Fb&9gMexiJG*WAza~)EBw?5EAqA{He?W{g0ySS* zW;uf4z#OsMOjAMibDdP@pcZtOe`v0XHo&TRF0a^y}1cTAguf3g1w?EAL5|MBd zaHDj(?1KGxwOcn%p2?SZyxto`^FJZ~)jL50eLT;IPF_J8d$%CS zFAtPSBt`Q?Gt@CE8K0($Y>-#;UB62L31=VW`@NO=?5cl1O}zk1$t|V-2q(z9W;Z^h&=IMWA9dn?sN`Eu=*cB zy!Sm#F8TlR0R6{9_s@@4FbEF}z_nyN92+w`TL4_o!Qc4<@EZ?se|gY5ZMt%LKgIa2 zRN?30{_`^VUJ@CbHdlp=$u)|PW2ZD`EeyNA=pi&dcP4u@Vi9F9oN45Eo3!nglrHs(5yp4|pE3!8orfdEkeVO0Z(v#GVU6~Zxb^IUogqXk3n-)rcxf~`{Jz^pmGz5*08NURDNH6ldz6YfTAdz6KRd8h z8!as$P*4=xU`f|Mq!XFTof5<76Q1KeicT|Wu2hjO`Lo35Ov#nrXM^#c>0t2Fe*cdM zCICni-erWyi$p3K)NE(;5;}g$R!i@4tGvibZO(F{a{-)=UgZ-5rd4ZQQ1}DCTErBW z1_md5yj@U=_28m;zCV$LB$5aJ%oflY&Jo(LEf`M$x-JC1@xBTsp}j3Y5DJC`0qSM# zn}P7mzMI~89vJ+OJJFk`|K)<-NiJ0&qI^EVWEoB3zMG~}vj|`5_D?n2k-fBQv^w-c zvYp;ZQ2fN_ak)E%z9Xklsi{j;14tS^fOoO>&{Vc^lQkkXm(clId!Tj9A5N#s&5nJL z?9V}3!d?q*U%SY_{Qunx0QTL7)8+9pmOBJ&h^&8f2B*Tcv(Hap#SpHJw_=1qyNs!UciTNU4Tc86n& zlsZ9u#2D^Xf0*S64sXZg5;JIaxOtZ@ywg4LJDe@=5apqKLg0Y|rG4fHFmF%%kTGlj zU&0vRX!P%Y-n@dFwNUt&A>Y$PSUq*zZ|>`dfr#0~$!YPz{rQ$cv)yH{vc-uWI;txW zfZtu~ygIS`8Z(RD!f_oh#7P;&#wuT4FG-E~cGQbY6aPy5f0{m&QPlYCxa zLkC%7Mp3*VWS7;S5XvL}1%CGW?@X(IA;!4|eibh5$^y33%YcB>-d_6(Rt}`LE&l&-?NpFIb3p zLHoub{l*DE9Rc!PAC8E>1>t}HqyPH<)z2l@=689bK4NS zXFtk|0~o07h}<6L=>Htb|Kmjy;a>unFNA1U4Dbac1l#^KK%2;jP)Jnd9TV5oG5g}7 zbh5pkIfbt*bKIRT=$#g9ev~g0o0E+f@2SF<#sB>#UVZ}jaMz#UXvn~xAA~?v6chA zhw@)`U2qUul-CN9Xa*<7_1>^A{mwwE1=bQBlC?0t%xFkZ8vZ^SxQLybF*mZ(-uqta zB7=E1+U!BsYINpG<6mWcwfo@LLiCte1Z zYq!=})to_z2z`?q-IwcXyvuLv;=pAqLtUmLDhsE)5qo!uc!7y-V%gm%LA*)W1Gnbd^9|?_x%EeJJ#L|Ai+P(95g=|Tm05Ifx@`87!noR7{xL#5X zQXS0K!Vq(X^`^J;r7P#&%at1-o_5#VcAnuzpPjlB#qb@M_C@2{nR-M*yvrqow^pYu z9<%q*$8djQJy>Z}pZ*?2T&c3Z62)HXSUjr7xKZHSC#GwIv}d<@73gkuk4?$6RiAMgMaPZjUKSNIw3Q^Gaz_&xa#3%!~Upm zkch8`cz?aY`TE8VzmgEq!1KN`CKO$7j3XEk4I+cPKJX4#Yi)f)E1jCyDTk#WEp@c` zwcqAr-=J_onQPMFSBRw0&k_$F$#X?q$4aeBlt2adYNUMrtCTfFHbs8UHaiqEqx*sQ z+82%OyR#)Wi649=<|JE)^z686?GfpvWZQieDAFg-qyl{U)Qa%a+r-_WM({SKlcwgH zOkX?!EbhVG#|vH!npIF8+bE%al68~E75e=6dFbcHa`?~O^Q%xrcWy->Gg+D%5OA2^ z^af?1il7$HLBz9Ohw$G1T-UCA-R{~BZ*ts&^nrvANE$}QmwCGm!oJvXjxB;g-Tv`mpus{lTe>`j+tO@4heSG)J6w~iCEILL z(*syvydD!hx|+Bx&SA*a%aI3$m(Qlxc-olQMW?ilXFTC((pUZGW?R)9$ejbg$WztjkDvUlHU8C%XJtMio|F1DOYWrm#cs>JT)5 zo!dqBS|bDPM0mso6ZJPFLZGpgG*4QQ`C7%Ftvqho^xHJi9L6<;RMq`F(c^J1rNn}C z%NzSOlcNR&F?UeF8*f>6p(J>*V~p`P?>Y>1H1`F(GFLsNk3Up+PJK%-FGE)lHUWPC z-&=-+wf+j>>f_tDnEcVuu&3{Oh99biTW87)yOkm4{l|o9LEse-2uhQ)&pl3pG5s0> zd6PH3<|)3qZiR9*pAeMp{GstaNxf9|S8I$47AZ$qF`x<-`23(R5Rm0W1?_dMc5whW z7*{{fUEMAqf5&F>HAx+-qB_2_UgTE9sfgp(nKM~xy}-%pk}ez{(3u z#DrIyy0CDf=!j91_KJiA+u%q%8YqL`{lNR~1!3xR`syj(MGH2Rz1O+DaD~Jm&RmPA zE8MMh@!l890sqs=Rz@%k=PbA0Q|BQ1@omb4NsBcOEQqB9aQWdYP2kbpDHvC-HKYc} zaG`M&o&7*JTD5jJP^9qv5C@_U7I=2Yldb$UG#d3w$E5Et_!nHamhO5JGg48dzkj7I z*20XE);-M3OZuDUXzw|&x*8*+M%18M!z!AmOPdt+;nM(Fb<@V7q*v@#+&#l4~m;AQ)2Ot8(75rUerX6cecuzjtx0a6MN6EN@I$ zT56V4kM5dB>k;&tW8@C_Uv0LEoa{6b-bQgaFiIzJ5LN$~=k}GTeCzZLNL2ddaaIi9 zUix^g219J5MMf&Yg61^m8z)a5l*4vfm9#gWG42maoyuHQ&djWrWUP{AC-XsK1iz4u zjxKdSFTLqsIH9tMGxO&eU(r6E401`=nEj$!yU(nkJhk2-HZEy-N3d z1w0(kXJ#Y$KM{x*ShQuZ3Ko$pm0CLYUF`4dJl4$Gitgd*bU#dgC((du8oZoMX0G1E zcAX!Wn%6rvy1*%?6Fu&^>fe3wkOo@^=KNL~u>V&PU$Q|&-S5C_@6}bXwp*2(M7jtU z84NZ>^p9^SW~w>#M4}ZbOloZ}=}_*aeDS8qI`~pyMdhIyx$d7%IiNSWY_gBE)Fr>Us{1WH;8!IHNa0738g`GPJ@9T9N=bncj%_h8g3Z;F7 zErplzTw!P%Hetb+4~oXMn;h8<6hcS~8&i_)N~6(zezX8eQpXqp-}pyWD$nnA=oAFF z$D0K~LhBOYnT0#=XMn`ij$a}_b6{j(D?tMx^y#j#Xu%yc;5`X;5>HJ{^x5VSyw3m^ z7x&R%;!9r$2JB=e&)~cT#}vTgZgYE@spByWL!YWrIGQc&UE^@HIauccs-5GwV5KsZ zxR2Zdkb)uD(6qZ5fcti`s{{&dgzW zc8II(L4mv=#H-sS#jV@q+4K!BRnV!IkWdId)8PGRQ;}Eq_>urf^Z)h8~Dj zA#`6!3wn+3?C-2r5J6!QqHA(FM{HhmJx5sq7+rKU+0M-}PPc*}aXMMQu2#T>jB@>TU|nJ~ zlKMagqvUOiI1QJ-2!q%#f`Z)x6=uy4oLyZF9N?nSGIuwKrE`b2KjYGVM-JZ-^GoF*-9MZ_-?h~?K9R>+;Fl;zKdL;Z7UR}+&#EK&i<8}O-vA#<*5 zcG2v%%yO^*khY&I7_-`>8)5jZZbjZ=P6_7%$=+2*aI|frFaaH5k9_*)7Zl3Thdyve zEA_s*bp@$g*iN@e^LUqyR<$<=m2@Jvp@&@wH?kTTyuiN!Q*U&AR2Q1mrX3VMoGa~M zIb~tBo80GKxpI~DHV>VTmE#+kA0R(CCKwWkfb%4OUDNPX)dG^_sp{9p%8Vb8e}u;1 zZCQEhoWF8t!AT-UeiO^yX52h^8H!^0@{Gw;m{DD@1YFH&sVDYO9fUvx zW0}_OC&F@`V?BxqSR0jUfQUuY#$Gjysu$B$V86j(2~P;$5?>(@{w7!Fy2q-KrwBQn zlh9pAQ&{A3Mak)l^uLtb*z+YrWKdtEl?E|cZbCd>C?(PrwgikVFluI8ZAiQpueEQF zSa@ySu|-y!Y^vN}q=_m@Kyp5K&NDAv0pCw%&&f;p0)zR)ss8o>#P-}?KH(b4RuW@M=>*zj3O4#%W%rml_1z?!i z#*0+QNmWbqxO-@2u@Ahff79s^3V```4DEK;=v#oHuq+u@RhU@iA?-=zqsa_&fSU5 za~y7b*urybW98Xe)w0Bq=1+K^yVlAKG6H`8{->RlYD+~c*GH1lNq4<{bDsQ#XZy%9 z3sZW1xKZN5&OYF(V#B9i{5IU}n3RlUrG$oS5(KegVl_%qSSep-Q&xL(ob z8!r=+cbTA6yJv^HZGViNeCTV`@l1_jMdgglP#P0Ic;-7AxKm@e4mJUJ( zl8!@RE~R9{nt><0gb1s^SXZSNRhc$@jGygm@<8NDm|eM#F+HrvFX6UOaz;7~N!rFH zC>q0#w*S?PI3a3~r+?~m5&KH0kWEizr*JRnc-CiIqCj{)Z+@Y0-kg3{C@L=OG-f@> z{jqc-?o0+7Fw2eR@Q8FS7DUtVwKkJq`okHsuV<1VHg#SZ3^ttS>z$LtN1&$j5McwV z(D;K37d_8gwNVX%mb+HhzLC;P5K)BXrrWJxDq{yL1vK67{#ZW?)b#qEXrP(H(*qgR z?sJ28UF2j1N3~)CkI(l`l9t*k+bxXABvHcy$NwNNN|CV#434NV^nQTP+mN5>8});ZPZA%Ko9%LjpY0XDSlf71_cg(Vz* z|0Nnjq%SqxOexoCm_Zod;T!KCSIdJ2>cgq(S}t0c*sRZC4^a<_^HKIQKx9ljIcSNj zD+HhYySxOq7MNwdL|0I<@L_yXTpMimEfc*LM)ylxCMywZW-OOKL5Y=%rW_~@+qp~p zK<#fqrh6IgV5;|0LlJ&NIHi=K!5_smktMYJT?|-FxP7NBU`DpG4luhESh0Xbz>Dp> z`CXzkZ|CR2`-*t*bBdTySx&lsaDBs0&zm1d+0Pk2en}mwqd;NZssuFq9*a5U*^w4T z12Vu}0f^wJCgMq;En^}2Q6~9265hAOBtRMCIy@jWpXe;)v zUAeZGiYVj=TNWPo;zb&Tmzfqb!Z&rl%T(*A1b!l^DTOg&Ln_@hUf(ht6`Xr8$~a;{ zxjj)q-i*aEGmZ9D`wK()a|*jF#_so(FSuK|;uG-;fb)*`aA(f8?*z-ZMh+WKQFd z(t^~kt6f*z$W@f8bdrbJJaw)IEO^V@j$Q$6rbM^-fZVId)qKtJ#(@4v0YujE_*)Eu zdrMQ)GE%F5ID!J|5+%tgp9)ct6B_UD?m{-cy3@oc#g?tRlbbYZ-1WkaQxeQzEOYQ` z%rB(Xw;Pxbhjt>3NkVy6{qZ13BSbz>+*i@^R0=iUD#H7BR9DI)+7=37N62HyX%v0r zV}jmAhJ|WYca^4dP?Z!^rRY#qaS?Na^2I+bsZ%i}sCkzgKPEb07Lb^s`a$DhT5YuV zUUX{l)nnFYRXs?nl%-~*lHmS25B5DGM z1K%5p&K`^DRW~q4^$wH#*Zc#x<_0@Az!s;{*tQqA>gRukz^O$7o)JCg3uw_e3X~Ct zhc9-U%4yK}l+V&VRvcfSni>X*B7}=H$b3f9B^JgGJS7+|;{0o}FJ+j&vE-BlzeMWBd>4b|Mwcy+To%Mkz9!j+SlxOTbZ{=XO8t5? zxA)s@ddpOT?Xd9^3FLCKq;2nT#$;bNrOeW(<0dq9p4Lc{h|;&X%=@954ih%FQo595 zl81mfj@&q>%>0q#WUH$QJhU)0@6z_NIZdULt4fd(*c;7b&E)t!aRC_epnY>4GbQlr$*eHq6Z>I1ezXg}$$iB2 zAvUhLpYAoKX*8wT6{B+p2Pv;EXAyL3g*Io|_T@or4olCTj-&JLiXIz#{cbV{T`ec= z!lo@?Q`ydy%Q}o)%1hf@=d2RXR3;`6&5ejV+#^qiPv35tw}gl)*z`8^do#m+Uh3;W&epj)%p{h+ z;o4Cw+dInTDA>TX9X)n-X|L_~r7>MEfo zXE9@?*7##a4po|yP0VC@?-fwf9i2u6qHDA`+U!W^xn@my%Z7b7rv#74JUp zPR?z!JJ%4$Jm?|d1|0~UE!Su9?0@(A6a7&^6X@%FEoNNh84?eY119|HWHX+f{&X%T z>B8moN@LIdN|A7>2y8m&9uH@YMJg+fwAo%`YAd(|ZV-O37e_donb()o0-WyKcV4SJ z51;SNfW^TG9#_xp?(0BkhuZ~eP$p?J-~IJ4<5de(_|Az#3W9P3E`Cbl&SeO73~XK< zw6_5zJ#p9^1LCg=Y_`8h&mhKirJvP(q+W+c2SV1xJmrnh(fI~0JDN=&gVb@ye?YoP zAQBQPecb$6H%Jrc)ZD`yMZudjZ$jOQ!9+v%rDSVeejtNM+^DirettOPyYP6cGGBtZ zseZu5A8Fz3a4XX4q+u!)^%V}c0c>Isi}eQJjXFn zJ^nrnYI{57A(_VX$!x*ua^`F$=2fHDo6W^5@AX`bDv1TnKP0Ye&MbqCh};Wej72>( zJ5|aFwVvri@rwqGylG(T0&S9Do2f$S{Gxs9E1@$F16DMVZJD1j;Q%e>Ig?3B+asxf zhbx0>Clo#oDel08LaeoFPXlX0A-olqnYjq4;7*^>cja-3GDjn@AgjN7Jt45yi}F6W zFVJESp4y&6^t*MErTG;@%Lj(qYI3eIBU# zcP~J~erRK0gHou)N0H7I6K!Paq=0A=(O~-u(Xh^TJL`F2+5J=lSIs_z+(mtK`OOO4 zO`T?`qwp^Jm5_3fdCH|QQuko&TOzPD1VH}2dt#$Mzo`Vt$!?8nEjNZTQR}?@sm0~N zNhl;@u|#QVNpkmm^#%6FykGCkHWx%fsk;F-VztH{AM!E>Lo?uDFv^yzDXjWieMOXJ zdT!QLRM1a>`~2#xy{wZU+=ZGkr(Y%c*KxgU=`0nImpXU-U`^#Zo_v`h3nN+KU4`yP zJ0=A#1%QWpuq~c@7;|l3e>hj{)M$7~PbXR&7;U_mepAb6o>vy_>I5pDkBR7&WZt}@ zo4;W3r*}w1d^1AZmGO!s@&oiR|1g#IsYD!I-zZJGlP0-t=)hp{QEic+o)$R!TI;te zjasN}x1QBxEjM}uI174@oJnCzt0CR?72EQcb1*q4NfB4q3!xS3^tjRx))&2$(`W;0 zKQX-pd~$f1-qq-hIyG(^xg^L)s8Ta2VBBiF^(Z>L@1clAMIueX2XBJT~SVj$`1^snXwPx^{p zUjsotI^XWr9S1i=l-fb1_I%``9Ni-7KvYw-n3HKz^LrdL zhj2JC0pcxnceq-A+6@`f^pvNWy=`){zBEDaZ9od0TQ}}$s1-!FRg=rwa6Bo1r$UQ` z;4a_`rZM--?m|;$G2cR&%;!sxC;9(}ySEIh zE7{g?fskOqgS#g>~yni7cwsCJ3E@2!23llnk)9Ahl@| zHb7LIYt1MNMHZ(o;q>)LE6pe+Uu(`p0G9Cgl7ok2#p;`Npp3$0?XAmzte{v#q2mEE`3kBTA{HCCcv9(SmBq$`)P5b4Kra z^}JU@=z2wMY%m=A#|15giSEJbY$V=+X$sIH5N)%8QeWRJ`J`|^;`n{O4rROVR%T(p zrho4l3E`U8Q}%sn*mOSk;G+O|^H~+b#x9=^h8H|KWM-p1;gcEf*-Zi)Il|V~sl%5e5%b@6UeQG%uSm-A$^{p^Kpb~94l!sm>PCH3X=w9^lk9yQt|?Zk&HL^kBwCBet}00>JI#rQV6%h zWT3{JtO2XNZh6SMzTu9lW=n#CA+7J1O3;xCKM>)MaYA5c=03K<33*ndF6Mf%GnmL^_WN+H&ma^VpHXj zDs>*`vWY^zZ|sq1R1uV_bPPzF#}&>N=5FM6;88A(`nM?-J^P_fy`~fg-QQ)}TrUCV zB3M<%^FfAM(S!w~3T~2xm{2WrnjP-tNIDN1UAi-M^p27wTHeS^X6BcR`hnpGz?+lM z9r*pE#6qIi@vYfN-x1mT?_1SC9wACU4_?}7@>B<%MlVD^a_e*N$=7dv1+Z`B-ad+ zCN^l-#W+d1N@0&dL5)d$|4sHI2f;p+!wp`=Dfp@sjwiEbd`zlOK_9Ha$x+HB>W@KE zSicNT%2(^{Hfa&J63||YB8JXLFj7iHK@}+Eb@w3QtfK#ZvDDq$d1S=Hl*WupMB{wvoGoyeQP3EHMVs@oM0lRY&)c7W+;|!Vo^b_G8DQcIy0#@Ts zM{%Et=2;OMxn;icSLaMjVycpx$Fjol@_Jp^&}J5=IF_UtKB6!M5;MHAJi)+c7wr|I z&ig^kVR~k_kUYu+?4`25Tk`Z5)3F~*pj9}dFv5A({xEaxzqn4LG)SKlo)(7u+?PX6 zsPfoV!oO8M*Nw}cSlCztEC|j1 zPp0I(W(k|;UF7$soRr8J`}Ghzi#Q0H>N3FrFRb$XBGwSA5`8c(L#cm-xnZ+78wiA5 z)Dp+=qg)Kb`SR>th%|f&5>0Ii50ZK@pOZ!Ul;^K9H$&t>C)u;8Ss^nnzAnJcVCG$N zRr#9_aLWXR5LZy5eu`5Kj+VFc@rNhE27+eA`|qU@#|MAeLX*uno#pg`KawJM3kMPq z?wPu^QawF867ol?l3874YS)lOUej$+!G(sG6hSHj{ffZ$!2>V8tzM&098G;c3FSZq z)(5j7TV8{)QMJ9Lm=;4}i!}bpG}2ay@ZVzD3$+ffk2LusPhwynhB_|cu{eAOkCUdJ z&3J>;PGDHHCwE!C0qLOcp3%?nQ*_s_&(ZCDR3`;5(JU<$)!N?_PIq*xE8%Ed2B|WE zmds?f6Gr%zBd2^R1w)4T3JI3qmr>F+S#~G+DtX2u8zHPSdPtz0e`B!rq9c$%EP5fBT8`mz8|O0{<-v=+yO{@w!Ehqu1V=;JWxJF|5} z!jl=*7SP|Lkxc-Hb!e&mG$m9)4#k?48p356EipIFmQDYRvgo_M+9f_)`K^feQy2&Y zH(zHN4s&x(CK7~JPXlM|c6B72aK!tX_K6tf3lxF{>yXE-##adit^=e!KIGfi3@(2l zPb5!xX&1I6@~!S_ilvGO0Pn=c#o~#R0RT=^Vo(Tp@3RRnp27f>oZKXewBG9pI)a!x zg5z+W!l3u{&QcbEeosh%@kp8hB(3F)ao>oCYtlT^>6o}bnJUy`QAh8h-d43-7oA)z z%)2y|n_T7h59gabtSu&06IdPO;4{8sPH~J!z!Kh?DT|IA9fv#53U6QiSs$dpi644C5AXv*Rq`8Mg7M9$3P zag@=A*zI49 zf=c-Z{Aptj;Fq6lb!(7C&qQ}4_<0$FMz&Wvo>t@`Gcffd4bS9@&g91=*@MzI?VJT+*j-F?+1%~cA4B{O)G9S#cVZ**z#@j)V=6d8CG7m}VSKW^ z;Plv%IurYEFsv%tPpHm!z?0}o0xTsJx%OX`{d@J4D_@_RKj&S}MY$63e7T-qF7qGC z{dJ2{0NP%?|AR;Yh+hnJrvHuyW7x0)gJjV{V3rWWM*R8GR&kd4pIGbPKCc4QZ{zuQ zH1*#e4fyAuKlONk!N-b&)B**eo&vZ$;-s~}{M$GFSGj+Ez?%-JpOYV;E$IQIrb46} z3Ap@kKZ{|{fGzvguvj_+Nw>{$&O`|HBtC#JgG?ul2ba~V`Hnq;fgBnKb}gsOdoriV zOIgh8;WE!v;pnU}6uD`i>yvMj>xgD@TdP|ck&YrwgYU7_C*#&`|N?$ET zly6d=pu-!!`$FKQ$r)n49oej6N#gqC#><8Ve)Im5vmt{zoZGZa*I-^G3`=n2%r~dx zu3&{tk=dXz8;6C=$Qi+D5f~Ccj?fPWvvEj?h6_A9!t1OdKFr2(Pg zs%p!Ia!77mXJj<=;r0i>3h8U54?UJX*)OAg>K?-$PRW$W5DLPedVjRo;MXM{k)e=K zdPZs2$-N z^=H4;k~6>to^aI&%;L!mBO@!3b~~Mw?2_LoUf;Zu3gl!crBhH>$@{v0_JZ%`2T@zV z(mmLB@f&!EKMj{!Ravv(h?nkOSZ}y_Y|mTs%}<+6e)c~NGI?@Zdir#@Il)YBI^Uc> zYQYJZj{Lebw%rP7R-NXeSiG>hKPMvIefZt``+M5{O@4)l_fFH|U`>;^UwFmI(^GwX zyZ{-ecx%g+#_zErOfM0eMQ9gqsxMM$juWA~8OP}C4tA>O{{T&?KUtqYcki*!zKDZeO%Jyj<1wQF)e1lG zsyd}%*8U9R6a5T!(6SNeVdoNTT?vn_WXJ(_V$F{=(%6B#MzMH=ENdR?FFi5}4~;6W z5rIJ4H~GR}YKAF!qL^W}BP>L_cTPoKn}li=QS0ATR%~$r<|mQcW`5nv$x?W1a<-7^ zJ!+T%C<;4&c)VAaZj2r1wwKMPckd{r6L0{%NAJ*M&5&M2a~Ls7abM`Vt!sr~31ki?2`rVKhs~Ze9h51AoMxO6FJ#QZxy0=7akd@YdGS|` z;0k`FQJEBB7OVZu1mS0OyP&Qt zYqhaR`GHK&aan-&{%Tv_v4ST!h~Z^7>6d^XRpJ~#V`GBkO;1_>`6o%f{h!vY6u3mk#sd1H1^O_`uCY@NO2_ZHZgJSOkp z)InU9J^+dTK8@KOw1N?Fc&`%F14({UDehu(O?TW(r9 z$@MD-N?%E5sH{!2hp&Qm)m=|Lt)P|Hu{JR~@fd1T6Ki?gQv= zHVWP3DvPN#U1}O&aQ$n<4YqgVf^#O1!L#5E zq1M3IRdg;C3z(pA_32+8(HWB?*AF}D2g!G=Y0E9XiIP?1)(@vAK^P-vT%|irO;GRc zZxt7@%OYzJJss!6W%g(E=fm(4S)I~Op-iXFz+KBXNZ6TfBg=A3F<)f}vJ8XQw%P!G zGSKtIt6z7A0dAi^)zZpg0t?0bjj(<>Yx{4(fS^|`@dIT0AB*E_isLico5(xr)X>Q6 zEUJE2ZSKe&M{fCXtPQ8&IG=7n=Ryj$VvJV{iB{3yHC7NmGTO5+1(GbkM7!)~P^&hk&`%cANoCp9Tt=#|>$2_R9z5f!ZRxWi3UnY*+|5H_4F$ztbP zMaeMVSOq6Hg~^8_Z`^?gw}_}OY0&_P9_zQ(+k^R@$@PJbFxXf)0s}dk%-U#f-7RRl zSM<}q))Z()@O}eNetmlvm(hLl`nQ_xk34x1decRxfCA|rYAlh;Hw6@sZI*AKvmo#I zuG-+AQ$7AXNa(c1&MU=HCg}DeoRSe`-BDvKnsKe5r$;dO$_t5N8T(%h_`-J56yY>S z(af6gsnBa;@;I)Eau;vanh`S;?lX7-GDLg`!0R=#!c8YdIz;rLkMw-7)+RR_^4HgO zMFueJZh(9{sGC0G!4a=x>P5dvhhXsEK;EjAMV`KwA3Iu!zloQBch3{;qW2RxVo;8v z@NxsE4Vq_tN}&FdNzWLgcCbbCzJp{aVhrqQpRK*0K37^uVDzq-G}1u1#NT;lMf%vp3tWN~8)FM#t$ z5Z52<9QrWQVINK{jtz1_FjyL4o%E*>4YoJgk&Q$R`=9{IFpO4U&=haP`F9AVbZRKe@>aOL$2y@G>cyKb%cdnB#Kn9+^pvdkJ}X?kmMZ8Je@RO zEh`Y64w&M^5=Zkj1b`1ha6DV`#J;Ka`f$1dK%S zY(=@+(eY9pKcjY|KU=|<43{culcijuY0DEH9z8OjNYNDocv5q5#oim<^V4thna)=$ zACI)S0x8vKGx{UjRw5@B%Cn7${Sir!D`L01YhqJG;ayB{1e8%3n7|oP&UVL$R*$tv z1NPGb{AVS|f3W}^)Dwp=5{q#+qANj>-ATWapPq6&)cqsSh*)9_J9-|Z!{EQP-f;|W z*RO3J0e*s#xk@9^lKD&9&BBo=e*mlw*&NJ}Jjc!*j7;ZY5i$p*FOaK55aMz=CnA{6 zH5kBA_+A`AcD>g5r!|dueL&u<&?0W>dH1r{+Rbio9|mbbTGrt~Cz?XRfsuqrvLc4% zcrn=nO4>qoY(1q@m_`f=TE#x0w}`R~jv6T7ke6#zcCvQv)wox5TN2LEMQucE5CE>~ zFdS9}IN9RF#W_!?Da|uKO|B{uAlo2o<}noldKSn^=2h|c6AkX3Jx9DXN~v%Qj9#P1 zpj`ce<|XZIbp%#dS(I0o=bA>zdIkP6Tpqd}D|jYXlO^!ZV4Un<%7|2Z7oESAFgMC? z>Vrs3H`*K0PT$NBlDax;$+V(2&V-PI$^d^~-&cfK2LRrfCNvRsK;IYp%(N{mu_B<*N(-QJ`$ob3}7QhE1s#X*QGSa`5LXRShHzH zHK3ZpGLe>Lv8V^7-qoA+yR-YuEw5Ta(#E{fS$(#vl9Y&03?a!Z${*adJ#Yzt7EWYW z>;;SD)%tBj2r(1aUNCcsJoF^Dm}uO4C+4A;;3bzR-1MlvdjxS#2cR~Z2D zvyU^0e{2xUGNd8-XN%kvN)RD0U+z_Wl!520`QCD^)P687Sq5S{Z=<LXKMr)ZS;_#p9GE%Nx8$DFArx2dGkY|C@mBeAR&Vz1 znc|y_mO_8SgB?+*3bXVnLPvMOd_j|YL$JY@I=d^cX|A-lN{$q1{Ebda&g8q0Zs)zl z7OPV8_qxa^7KxTTR8xav6(-rB9gO7roF8S~pMNOx7^zG17luN2>eab^s9=G9R`h$b zYg;fN+|xX7l`^?#XrI_V)4wTA3iu(OjhmJMo5puGzU^OGpHFGknzgyIu+@22@N)Al5_>MfxI9TxPoug&c$$r^bxg;x)Q4#0=qThWl zBp=*=btC9^cn}bAyD^p*DVF+g$)u1=U;Ws!HinTH7&o$g>=Zq}i3?u0g* zJBJvKB++<}=yE(sQ?8^y#jM?tznw8;7W;Lpi0TB0D)s2K0PK$eq>ss*`HinCS1A;n z#T~yI?XNNQVo^}0D#-Q|GuJ($Y2W2-kHR_lUDbCHKm^1hM&Di&XU;KHjA}_%V*%5D zk3KBl?1*}ReQem*Y)R{V@ZF0WkUqCqX@PR%{A79aYf5CKr}ybV-3XuF5*q8(un|TR zk20q3m}Ykadz)DADi6U2;?N$}mFx}0ov+p*2G{97Vo1otH;@&5R##K`yEXXh;9X=` z8r)v4%UotaaH7y08{vM;mE}I%+mSX%AhHM^ZZ%RXl6(rrfljrc0ebNnq)f;%hoJZ$!z z?tI+$4veCTELffWBSY$}wbxH-U(T|5mCv1XnMW4!7S}E)dF-i8n{}hGSR4e!y78X7 zx}y5zEJL9lX`Y^?+1^^c8T%R6Tm>iqBUwSy6l%%MD8J~8KUFAPkM2LrLX~-)Hp(riN{iGep{@c>-iQg>xt8GWi^(%B==%Bm#4YtCX_*7d|3agWK=~H;f z#n1;+5i9d`cBo)`KoKqi4g8w*HYPKKLDjQ_f?3Cy%A2Rr1D)0Dlke<1yDZHa9c0?eHP!hhsMY}` zq?h=z0mCmuUPjr-xAoq#u%9eM%;kT)ro3V}h(Nl-&gcy~4?^RO#(}2%w ztU)u-3{GzB5|<82wkxS3BsC9I=?rK=@_0Ri`hc>wQu)}*NAu-igAp{l^b$>DT_Hy* z7;*DghT_1QYRgxmj}Chle3cji@4rf*B4=H04HIy~)g(^JsTNEaU7Q{J+%&bfHlaf6 zyhKCbS1PT5C$&UOtm^gQ1VeoD6<=T1d-QdUyFun zeCuuK+P6n!_K)>092D{SFCm)~ZilORzyX0wxu=WelhF4KuCqP1sG z-W3Y6*JHp03M;5g5F5kS8f_DF&4US2hY=5sZdVPdifZ4cTv=#c*$xJki#4B5Ep#aZ z?+M<6aC&>kY47RzdVRew7@4@XV&T_1lV7+;!tq9NZ|xbg2@0tY~3 zP{|k(VL&htx8uh7!{g;u$%bQ6paus1esr_>#P*$_P?Q!9V|bX&r0Fl)`^&nG0~_Y$ zzj*jC`fp&qMoYb}akVjs8RhAHKj{toRIJGt$eDgR?xcu%`FGJQjkTc;Qp8O3n4uKG zh5nXIfn+#AcNcmn+t2n2b=hpvPH1{2*twzy0AC1gEnv?!N$;xtNG{#q@W?bXaV?9(_yo1*VGB&!383z? zqi^KIHocxZz(`@0URB2(=V|h=Ehw$Cq=f6++vPo&rbySvRos!Qle=`kmcdY*4`J}1 zghgkb#1IbcRZ-d}>_byE(~DzN5ydp0W0BYDbyw=9YRpn2oeN>?UmgI5ia+@q$2bY! z-nGkwD4yzO|;w-HjE9tTc3XNe~Oz zx^(|@BA=NCxqqa$%_^_G*mWL|aTZNB-C6yt@;coc0Ml8r`=;RiR@U%xJ4O1-qsxsw zaR^oC;gV<_#B=Sm01*dLDGv3po9ltE|zzn&nIf?j|5MUoHta_LP#>10x zLOYJ~Rpl=Xv9Rmulufg@SbA%b@rDckn-jM z0ydf;s23u?XqTtp)wqcR^+3y1n=~ z`d?&ti~w(h|2u8QhnpE^0o10a7>+|QGv%OY ztewMb2saxoyr+iXO*2%t&tX^1IDNMkulyozJ~bney8bLn!|QWotWn7!Yi@2Mn9}`X zFKNbIlkXH9Xt7L}QN<>13d__lQG{&pk3&j_6-LY$_uVw@74v;^ zuR4_3s;8y#%rC18=+{7%Dn6pTwicq>DcHQ=^6wwDwg+34>|$nxbRW)rSW(dycxm4j zd;o3v7Bbwe25bGojYKKpDh9(1M;c)Iw%*bPof18Jj_{NNkO3#?zLGVV}7Iz0cPH>cajZ#y5$zwI&H32b4QSdcFNNj z+`^PC3o?l!$cL8h!`Lf=`&{`6!r?5^pP}IrmAww2UOeRl7|WYX%w(_QaZ0<{{ZUbK_L@ z&w>MI7TZPKxIe-1!2Hbr1CC#26(-3kWbkB41Ql`C-`&Ym+$$5<;jd=VR3njA#B4`7 z=`!Ej?x{5O^=l2ly)P4f1sgqVw0L|r*dl&%@W^g|oZ~lGahHHH%0t3JmDk6DpqB#^ zibz_!NS4tfO{rXYfN@3(8i25rO+etO$tCF#d~(R>C)Y(VGn!m~CjbhPL_)55)U3X+ zzBto~W_Z%Q)ag&lDqMC?cLbPZzJcxYzSlvrGXhUd4RL=nCfEd(90nnkq(-7V4`!seWZZ*9tH*cg6Q- z^Tsty`4dK^&J$oZ$x6!}d8n~wxPT(Z&QWZxgNB!E_rD7~im2Geaou+w8lM!(5U?-_ zkrym1E9UDsxe06WMUkuW;QDF3ckqS5+z~l;gQr^__B%5!V*Y?ii{P_F{kx?J0Q@FO z1{vsP9eYsTPmhEK;UorHrOgj2sM^p!E_Jz<$#%W3!=UI5k0}xn)nfpRG_FfH$u{Fa zbQXu;O#RU4Ey8vdN}X?jiq$&w(*9PE*W(C$zm#^c;Kr{WzNpu&FP_m;2ggBD-9bqY zu63xMkOmxr0hAcpmdVUjo5~eh`I5b?I0cqGj}8&}auasfj&2wZeTZ7XHYe3JDSz~* ze(wd})KH1Cy=nl(64QcI>9|a|Z4R~n44Aa&N)51qsPxrb?kvUR6*dfzZK^hp*lMMG zz+y^Pa8ofj_s!sQo`*%lim}q-HShG_*HrX_V%S43(4%_iU4QR-B8>D5@rVKl3O$0m z8FcrRpR;%|o@40`U5=1OL4{Dx@F_F8n zr_V>K#zI*wnf+ky8fq18ieSbr@!)XssgG`IJly74MaFj=U(Fg61hLEiM8uUBl@vpW zKQvTajf({CQjV?ERifiA2x1UC#YXm|3lr%wk+4|6uk}STA^d{}Ki~cxNK6~?Z$Nn7 zaH0>F{dUs+E;NR2UMCLN24KRiwRyWrxeje_PH3B5PT`~1b49REJA-1$6IKn7e6SeR zVVa%Y30N?UInoGLGhNj+_C4Hi9N1k1eI+{2B`VqkE0jag*+g(H@OAq9Ctc}AOtQ@_U^HwQlkuF1OZdyAA*N>V2Nl7xYN^-Gaih&WDq>(Q1@NjIq`Yn3U56@Ci z4Gk5`!PTZgOS$~WItd_CdyD?%g1INrCS2_t!*7+jku&i^2+(H*8d#27 zBQp|$sRQ|>DXTx@Z$$A>nB^2#%)Rr5O)R(;{V-{!qkBh87#G#i77P)TLr780UDYj4 zndtNH8TV65eNq`AiYxz&X*eQ>3;1!nX0JrUSFST4`;hEl+#xN#Dp@;Y`u8qGY>^R` zPsTOY&!fu)Z^}Rv!iApI!#>bF2JJv43_BXbBp#^m^RtU0; zFT@n#zcHv?NyafkV%GUu4GVDa7u`C1n%FL&Kdxq}gm5z~Q%j0w@9Cn3UWUV084;kq z7Yj_FL}(23ZuDBOjAS0dw|kfFpRDYob}nY}_WkfcrH!F|K1~RsXfE+ws5uHXyBz`} zOs6E5^URlQF=L8X1!#_dKh~u3kQHub@S4gWUw661Q~o!3YiC_j$XZHR08i}b6Xs1v zv^4yH#+X^Rqs5!ZR&zUMYq~wXyw$R)3Bg!*AR3!!vqXH*idp{W zRE;sFmMZQ(BT#rrCIsp!eypL&8&*1hTf}wX@wx@nUioYZoW5P}KL)wx%yx2oVIuPat&_N{Q$>xY$*ObE)ym1+gE`zNzdu&XT>a?h?hS2mIY@%JX{T=;&5Fv9oi( zUZ~~IVyJ$6Y|?>6OBk`wA1Z?Z92Jt|8-lHf{A8J`;muJ!18Tw6jV>L`BuMOip7pM^ z)&^Veyu;qdhtPVf+M?o7^B~@jz8aufO}$zzrC0qR9j5gUfE(*ZF+VyTMvw~n;>y9n*S2j)I1mRU4SY22R^;JRtALqe9^oy4!M8U&xJ{ks=gOV`y&fAmK_lNx zTqHaeHj+xbdk=4^<$wUdz8;9N;_o?KB_5Q8NOtuaw+L_U%Gz}QoVmV2W&=>i^Z_cfrH$XF?Oc2|2kv zy#x*w7k@;|jth^7jV8rN{7c7B>T}T%@}m&(0mp&hv!)F_J7qkh(zNNR z#mt#ErOSBHqJ&Kzn{3LT56!yGj(d`zFwXbitX(n-Z(Wj*A6T&XMqKq&s1ED(nYSPT z*0-wUE?2K)!cDoKQf{x!?pq@H3gmM1$ht!M^yQMQRW_ZhmJayVQtjt7?_>gf-=oM3 zLsW$OwAvho4h}8Ti*S|XcuEx6zEtQ42NWglYMi-(w`iYIVF{lD;kg6+9D{*e+l=7Cq1JFO8k@-fJM_1vGe_p#s0bhSr|~B%t9cWONf*b z1E_&ABBWaKpEv!h^dHqp!-_yfZwmuuv|z}+cgSNf|4UQ;{1m(%P#!_=1^F;K3|aJZ zZMKTpGXLK2zty2iP6`vmLjsi90h%O&6a9nqzdi2rrv%_BNMR)43D8U<(BOlgYYWaI zx5W4lo%26+v|~V{3vApxcVGh0q{g5P*gyYwEecC67U8cLP)RCWp&1n2ev7lTIih$s zeMeP##1+ug$GE<~&E%DfZm04;H~Z^55WuAd+JQ@~xtojz&j|DlERJM>_#b`w4ITFN zUn~HuuMlan4E-#(im1gxyS3=2T&%FX~3@hbW;#dC;Gayu(zhyJH1yjX8v{i~G;NJ#FTPX0XZK2hR z;_&|ZK>PgHI%0E?pn(Swdgn74P)RP!3zD0^B{9DW7Ui~qT<4H9sh0kye)M`C0wAHk z4*`K7swkFqu+3X}n2E(jVGDvBJ)w3&9}F!s3hljay;msP*DLPS@xQ7TBFl|C&zL8S zcZ0lOdP1=RN=g{w8E~vgT=;y&1kzG}p2k!K2-u(p>0=Rz($;nlEIqAUhSGE>l}u8= zc2fCVOOBJ9XN1f)nc3AJv^m_4prb)=j8r55t|vKRpp)cS702bsRw4!bZoiF94j|~&Q#MesumLtf)5FmoRK1dNCft!I1{S;%)^8Mk2cSl&_VzOL+$?g zU8L%aLiaCzcITV(ZNKd-ac7$+p9}KBtM~Spw zc+9a`NA+x-HYqiJb_&~` zJ>Ms|D-3o`06tqX6^BfpGOlz6a}G(Rccx6oCWPMSswBxQpF+9=2*jO%w?-uuu3|{$ z;C?6cW3gt^f1s}vnW9LV?VSB9 zk(lba)1yn)AM;f(;&nq6{hUADXe44#ECb8V?GH0#s>p8X9?or2GX@KbTc-{(?oV{J1 zfReKjSn`Kz%?sIMSMo1$K(s~{cB$&(VCQ$fBW{MrL*MJ`_i>X)@Lv}tj=h*-T#x1X zal3|O`TiplUWwb`uZUQO5rlU%<)V!X)$jUs`ccYsKoPJx9NjhA8@(8zFuy<91{s%WpiTKNivRTVGvLO0N^eH6~UFAC~qAb4)%K0mZGF6g;gNHHiQ6=p&}7k#IQY%w>zP)M%Qx2UFv|i`G1LTmj<&+x z@aPrhJtF)t630o#<qM6!}wT?3-}7rr$(v0MZ$2=7wW8p0OZ7W zZ^+cacK2u-4;`9vRy&DVV{9XMJ(|;2KMa=(QF$y=&*sUKQ)F4tFR*^^YOdmoXg8Vd z+OHaOi3AP?SBK*efTY*mTRGxQqT5A@_DNa73+sdIaXiTmyU92^MOZ~-)GWkW^e)iY5xH&X}oScX+J|#2BJ9j!d+gN zrmyTRzd2l9v2zr#Vs(R@${r9%W$qZrP|x#cCCO#yivyzD94Ll}zre{JX(3D-%Ud`5 z*|Az#zndqhx4%hzA4mVC;w6S0XI?NP)nt`X0WjK6YT~ax!c?hX#I@q44<2_-h}YR1 ztvGe{v`6?gKtzw9hq<`8ROy}C^Dw6uY|w`H2hxTKL+$Q*!VqksFk4ht8N+HE*IyQ7 z!{-gkzuCmUkjKn|SZhDN-?Q*I59i^o{*txCsVW*7-eaIaJNTni0d;l7)roNK{S33@ zSGuSI-d_c6GG$Il?ofUGNdBU4N+=~$vA%tj={g%A8nbv7Lq@ePMl$?VW#g={N0{R3 z$%M*O(OFYe8`U4R3p-XE(iK(8J9ofHBECbwwP^OrK_*1!W zK$Wc!k2qSjo677$)r8B0s+IvS_=}-d*CHEgR8Y0rl<~CMnkF%m#81Q#D&=BT)kbGN zAP0#McAj;G6Bzn+UU(wp7)(bGDDz=JCBI^6J~X#9uZm(1)*@iy3+W;ge8jyu-x6JP zwmpp~Rcq7BYOIyYk&-Y;LEHZQ6l%rm+8J89so%WX8DAFL8z~$T_bx7AcmIQRx%26l zdKY&<`gJ}l0rpGqPJ=o-J#?#Q-wR+O;m_I{MUnW<9c$J;NHd~qNq~yVwAB6RVt#tC zOyQm>)9yYc-PJ0IwfNB%`fj_pL%PgZBAJWfmxGD-EW&!{cJv43t8}Ruex)=@ASEtH zIOQWHqqzUGwZ($D6?Dd?HxkQAa8<}*SUwoAw&8-oW%kDX<^r#2F@AMEgEi<4`+L4- z*U-0buHF{Ad6%!Kmswc?so1GhBiXRz7!ONqfiFr)y)U zX|y6!DKpmPhI4lOGbw!0Mp6kvPpvIuEh;2KXEuJqNp_0cPQr-GJP|;Wz}5Fxw?MSf z;4`SPUqGrl`3yUyhuVp{M(bnk!o#Nr2uZEwg3sd%xB~0K7Ty4lpI)Jsmf@i|Oc}Cm z(DnA)5sjj9cxUX*70ZoSmffRukKl70=I(FxdJ_xRDI?oQ^Hn&)CRLBf51uwGz((xE z0b#jJu)pAN@|41ikew;xtIQ7|Dm44$CmTJ~tXvs5}x_Ieo`YZb#%P^uD`OzY{||d_6;(&Ht?OdJ-Gc=J!QI{6 z-62SV1a~G*aCZqB+}+*XLvVL@_gk#B&sl4?eb#xpt=*UV#zReNRMn_nWAy%ieCIaTis2PZZ?Ml+oX|OC?fg8g*8*58J;H$@xd{ z>Q#oxLeZ*+yK*Nw;d(78zACk;dkar-4I$A+TnQ_sbC{akYI{vRdl+a-uEypDeCwk$%T^gn5ZbGLY7 zjZeOfCRheg_mtby^paH&PNcpm#|LIXlZpaM0K?FG16|oQC2YZAj>Dj*IR#Sl#k6}- zBlNR`v}G&)AAt+vLjv%=pNNSe22lj#Wc&qPNzZwpq5;*#;OE`gOZN3{b>vL`c9!R{ zxG>zRts*!Iohe;`j?CqBJ;?89S1emQe@(Nhkr%5CDACE^@XLbA`@_N65ND|@zpEyR z{=6VOzPP<{5NO!+2kB9K>TTBYG{4+B66&I#C>#2aLSaJCJ@oxg`+MeWB??d(VSGW> zVy~k(Lz1a7zd01~huvqjPD+u@N4@@#+@8&467iUYf_)eR8|Ik6O?k1ExUBxRd0Ue zrwLvh?@MiGnsU{w)=(82nV(`E{GOGzQ-H;7rPEdajm7!yn9gVlThMA!u-kRi;u-Osn>!G;+4Qp|Zu5MqBu%@u8AIaR}g}*W?klS!3sFk@X;fc zAkc0_3&ODyeU6thkh@vo2Z5_s83%&E{X1{~E2VCKsW?MI9`?uU(~v@?Y@^G+=C1dX zDpseaLuqh*(uwN$ic*8I{3`jft{0m?)6&r*VHGyZWvBxAOr@{WZL5A1! z7mZ?T-^&@Smm3SUa}tZAIvyk<3Hti!bOs$r(3qUNX3LhC9OrGFmUS~blqr>|cHv6D zw%{ev>xozJw}YzYNw-&8?gBe%;y614;WH_}%HI5#QLGkail3PQl%T+b4bl>9jh>!#1?j}-*?*gLz*SGvq0|1H<~G*`Y> znOxJa3bxTaoiCTO8euk7y02Fj6z***_z)UNt&0;Dk;+jvK!whb6r(tly}IrTS?M~Y zJep?3rCQ7@BTQTfRk}qUNEh(MOTnTf_rP8$dAmHBqcmobk&V9fwP?l=-8zP`%Yud; zSl4%t>}7bd|KW*P6X~~bh!1kVGnc5eDZ_ucgK*-naB+120o`F5J&a1w1zlIVvLYH= zNzQI4w{IpO1_N?ZXWon!dnJbO((QKsB4hD~A?S1ii!4N*w~sPs0~+xb^C)u@$6d31 zJxCCP%*))%SR-ruX)hVwYOm?=xlNJ(}SBQVwnz+5jgG^KxR3rQO@|6KBef zQPCM~p{7_^-fR%pNy*lk?ia?Q5wccfi4^mkQc4f)1?V=k3HC3$jmnZHcq;T` z(9by;MK4Fo=NBvZcqOoyCSx6vmaPMwa|b6*`w&4kie4gO=jwJ88oe+Xj$4gf<( z2X@K;TtnyJFbjKTd^;c)AjEvj84M!1EtcrX2C-kxQ>gnG;eN$zo+}ezIgT?c#c## zENIp^JRc zN`Nn0s)Modm&@Qp&Kprzgn+}DM%8Tn$nNs$u~>UAL72(c1F6uOL5c8<{^n>#2*%VD zvzn&(m7T)pTzusQza61rfn|9^4j<^j#|LayvTCf{AO;_-f-0>xg|~}!3Gxt@H3jS6dQ+XkD}VCEg_;xkfj`~~d})nAuC zSVBi8{5zSg-D5rnFim@MTM=no;CKzj#{eyBWFMpf&#m@M8~O&RD3Uc72Ca1k5}^Q@ z>g}OQ;}LRI`_g>>AJaBoM~QTb1@d(9xpEIaj|AKuxE%#Ew6={3si99OMC)JRjOw?Y z7IL*5&@b9;?#<{78KSo&P_pFPpgG?vDyk&fTS1I2x3b?W&rv|MNJQMDljmXxyIo65 zBj?ZkA;x|^Ft-nAg4xq|xeiIzhj`PbL2aeH`3hpsP#0>a^j`GP$atZq6EArC=XJYK zs9ViB;t`=`sT>A9fNiG&NSfQ(7MenS?@mG{W!z{I`tmcdv%BMU-*}*>gH|Cb&mr5j z{$Y1_^20J2)#vc`^pLi$zM&C+!4=eNPY7cJmEmR$>s%lMk z#=K=-*xEC>!2NSzzh$RkOuIjfBQ@Gy2X$lVP-po^5Y}~*L`CGVoOh(&uH1WRH&!i( z98&v9peD>2Ij8>lMonu~nKVO3@_~^cz-4G5(~hZ8I)~2hT%B6MV4)Th-4Qz!upU zZ<6N+J(PN0zMo<0&s#a@Ipm2==AdNrB08KlC;9DuU?gC4^5T+_r_2Xpd#SR+| z=|gk|t=a6vX@Rhjxp3Drnmn~30gin97)hph1Kqhyt01dI(2ffCM_n_J^7QW|L;(oc z7HE!7jfnXWutB!NvT##-F-y$u0=6OMaX##~90uZVhti5nSc2Sg^JVrwZMo!0%3Q0_ z=AV9Hka*>`hsr_w_5}h9c9I}HtZE-=|1X%YBTLh7;t98wN1)8gIr)Cxy!cK#!2pz} zcGsyxGcH#wB1_Da31=U9=|@-Oa8@f@uE8#bM;4_nDtOB_s7wXLgf23Yqh{*f+UbiJUn>Zfh| z;qJy{48d8H%#aco`3Ihci+KLw90M9SYW)U}9;xTM6M=6uI#4^@9L%mhxO-r~#O;2s zwOyy)^GG|=IBK(@0Vya_l+r=78e9KjnpSw?1RC|u-@Y#~6de^{Sft{PX}r!*5vlA0 zAs7@F9H6Ww$5a2(g=*@kXfySxN`tA-vKh=sa_M++Fgm1|E|gZd494KOda1K!XUnsd zA4e!I@-G9zaK^|zovr7fLH0YsHHqzO)US!BYc&`r+>Xrtl<=WoMnxyIrL2~U6U5B8 z0=D@O!SzFBU%qqjl@FYEH%*78lW(54afaiBiNa7lCl`Trhcphv+Q!oroaO%_6GB-W zsQZyHY_?XOzIe@`$tVztLl@fq0)s1Tlt91ZgMF=&7Rno|ucBF>OV)b9GN8|?TUuHg zP3}bfZ6py%kK3tp@djU&2$h~9lCZy!$+*fsuVSt&1I+00*o-ek&>?TR$=+!2H#k`_ zpCUARzL)~o#+5`Ao-fq)!&I#pjcg{n7AWa<|KO--ObjaeHy@9^^E#aEYcM)nOCe*& zF%=G%J?lt%L3+L@K*)s8c*J~xysYwz@g10RIPbM-R(AhwZmUQ)WUyojMx zot%{VfF3k0?V9}GP}hl%Pd6hj$R;09FZGAw8^S+<`}b(t$wzSY#^vCdeg6``+~Q%+ z6JP+}c-A^jD?3-s(GMeSVk46J5H`pXc!x9!Pb|JgI9b#Gz&Kjxx724Oq}!~aKioBB zSZRV>9FnBK*X23*wHcgTg|p5lw23dU^Z1`D9bZspW7`FKUM|_$N;H`hJ67N`Y1J{$ z6L0$zPa&wW(3I646a7iMB-%C+D%xjN$pHcuU%uM+sBjhp`IZ&U5+H~Q2UKW84eXmy zVWXhD>cG0W*j+d4e)b0H;2=}=K9lMf>S9zwRON&isP3eUTKCM!pD7R2*~(jTT^`$= zle>J&@>?ldxY{@@Ix}Rgb$5&Q>B1J%onMLP!w45Kz$)1dU+(*1{2JWvRVr}F^;cpc z&=axBs16QFVNpZwB%FgGvlvxNSO3X%3NTrKZ_0BK;9pCF?b?)8Jd}}?`k;mrpw+7gJd#M0ArOm3-)P9`UjRX_Wn#cHdoRo~6u?&;f=w{o9C zOGd9|#Ri|VxUE7&x=|GVkuSDeIk%wold)*F_9%*=S4Eou7 zx(aA0fPt=_zbxb5s4HRrXm%DIPWy;eeOIv>JtyXvw&tc7(8+uYw$VyZFn5-vORS~_ zOIt>k&8Ti6CEMh_3r~GxDL(Fs)@c+%?sHysMAlfFc2q3<&F>dqT+95n!rC@3_Q=!Te8czL>|jW zRsYKG-4A=YK40hFfG!BQc7{3JPELki+=YJlN>Lzgw*7Z>qU17$7nzT0IT2vComgVY zWe(5QIILH*yG`u4+z&ZH04`@~a@A4Q_g4KStn)!I+`(A$hkKZboKli~7H)%HOI1-P zTDrgGI89cFaQ?szu6?TMXj%l_QvK7x5&*`>n}!#GWq&E3h-Z`V@kBmb%kX)e$X?KQ zGvRS`R>~r4stiKjd#1Gfn$}&J*Zasuv$4w$$#cLJ2^f6Lm-J|YF_pKNj2+@mHlWz= z(G+^wFk}db7!3=SY8|Bpt1Eypc{^T? z;3~n@jbHez{ROcB4P10J{;QbJTmXtq+JIqo_nY_;>OdmtU%W|8u&L8A{HbxwZd34p znKt(w|12q5Y1_gKO*^Zp+BG9)!4h$)sfrf?vOkVk$TBbVzu2Kpr4OfB6(4NhI7iRaT{K;J8#O(F~?M2T5KJ?>I_ zr7so&%K>HW^(Z)-IV69{#v0eLvN*a7#GyL@UJ$#;95rbR&2@MshfG{MLIRlm(=r6RSuAwvaEbWR4yKPMbFclii<%-aAh|b7)RLHxv+nY=m}JU<+EBZ?(-t zt0gbCrIEy>nrJci|5}mxnmy9%d4IPr9$Io}@nyhzAVH_m$T9Vq^?-%LZ%(3xgTOkI5FA1&$Lwt zw-{?@Mftiz<#$x?ENpOEkdBXwCS1|}oQEH`6B_ra1k0IpBDtYfn-xkG!ojA!-ec>P znruET%j*Mb#&!))nO)IbAK@NKSx?c*TQZVE0+%;P)q;gv7oIqkqqJ|)X zGI>F`8JUf#x|Vq!hc8C`HNIBOnD>%WzAQLu6#R?(PG(H#o2ojs>3~o=L)z{)~naF{?t8D6nZukdOd2BwbVbKJS6pT0> z>W9mnzGW>INm}#JJ8}H3fP^w` z@eD_mBC8!rZ-}5eX8JBVpHls%@JDYPy_P4Gr@p%x48hTxhp4t|lIQ-9R4xd6kyG6X zb`D&*Ge1GwNXogCp_ufr*hs8hQBhypZRrKU{Xg*E{uva37^FZ4Yp~P}+8R(WT93{O z?VW%p-Wf^g(_~J$R|5B6s&PN#56^mL_Jg^WX!igi4y`tM0R?m6Ou+8l1Xdu=DZPyf@Amfta{yNwM`_lhX#(cc5e{wY_R+^YF|6cc z7YSI+BREkRw z#PWxO7Gn>REeUExd5vY4#*dmV@JWh#&3jeM56sBCwZr43v|9=0R*Qwhgm4gH|9Rtv zT2vJpuSGk4%ie7QK9CRT1W(2t(IYaiEfP?sXcDZ&vhjSlw-gP-qLB3byDBi&;}fM)6DCGPyPtu8b*JKtD=ERz z+96n8-$>h+6 z##knFUKh>rAVzd0-X$6snrPk1p2tK>KZTX-Vu1oyeT=(}a(n@lSATb06Fan{4YGN^ z@o@Rz&>v-cmVw#%I?GmjLxqGQFga8TV>CK-qLrro3T+^FVTsjUWyb|)kmf&>(DFno zo$*TJ&!<9%&gJ+*c!@w$H%vj&5>&z(AT#uRYm)N zfO#GVwZaJ#?CJxxwJxdFB~8o-?4w#ZtA4I=ufD&N4O4Q^sEk{t-A06b=Bq0 z)PZs1x8*ul`Bi*c>2K5-3OlG5%`ad)`Ls$TmF=D{ftqCc+vUpWpc1Zi$S+l^%!a?z|yZGY+LSe-Lq_4IKka6Ee|&4Tk`00 z5(p^{GBA|oCtKkzajJ7{1u9;4DkiV=IUNlctnP^heg=f8b?+LA1R0?0&>4V}!3Ur& zwHgv;xVjssq~aS5ga^nIF1pl-!*KPc5}Lys9e>R&O=9|oL3#NdzfkaXl2r#S5j zJ22yUdW(M9RBM*mRv(Hy-5GSQlW4X$zr0;hkagaN#6=T(@e<@$it)!U84AFWJ|PqI zHs2h@&}uQ$er-nw0)&-L&5wXAD+MYT5f5qEc0<7ADcoxo(x0PgAmU@d1JEI0a)Xrm zz=L&Iswaa^_ZkXyEe*}<>3C-+73ih)72>$77sOPq*Mc1Nkwq;df*!Lw;;qf(q?tMw zKZ7pJ&;h+LDNm+X`?aT57P8`ME|VG9IN}_v5!fKtdX)Is9v$ zqIF-`BF%*S7TJD3h+8(3ustKL!W|?aW~Kfpzzl2th~U$CT&PM#RUY-OJ_WTYluGj)KGH zi_IMtCh?pm`LqKOg2zXW9cdYgqkpH$GHp^*z>9P`Uu8+qO66_*ApUZ`zxqXF97Tpp zu%4bMt6WO-28R?SaEk}qaDsYm&653kSi3U&66zdqu&F!1(i(EW&F=&{22#C2?9I#z zJ)ob(&F5f^M+|MmUnTwk8&9t?Ulpt)N$2&HpK-<(d<{iaa`~r#z%@muM*Fbh;s!_$ z@vqjdp^N4!O1Dsf_$WLW6#J!i#661S*eh9|jLqQFLHIok+WJ5u1 zyQse|{Z;SBr!p@&{j?#sbCH@S_#t8B8(?lUd>(T)W)&j2)kQ>R^Hm^ckCzB@rJIA5hD$*V#9b3@ZA%S7Sr$D}>h zjf~kXcUY7YO#>*@usfD!DT5EFZI7JhDI#U#!6K*IXZivISfNeL77tK$_ppV@EgWkF zW>U}Q zTI!$=-WAJcB2F`hY@tHb!wjsyZEWC05(rln+SDY)CxW67xsc|C+rMV=S2i#R<0GS~ zw)+9~mW@ZGwcG<;O-Zgw8xEkZG|=4__EMF;vypEfWSarGx=nb>4fWBCbSVsK+Zq$^ zXbk~p=B_qX#*~aWYkjwDX*iBdXOgDgDcUj-@p2aY z&PcYO0}mO=oENqwyUj|dQqDli%Wi65Cw$>V)-K8O7?K>I?g2W*hv>!|ZvoXJPS0J| zKow*Zx?}AX?z*Yg5DfG$^8P4f;=G{CWZ}}At{oZ;$#r~0cOD+ixR~xOi6~0hS)#@! z(E8X?Lop74R~8onk*dV;e3fKtqbNum9yhk|h>z!ZOtmhQG{og%1#d@GE@*N8<@JFsmKj3S834TSRR#B7x1D+eOpR-C`#v8-MaJ zVpS-c@HuQ^aFa0|c1H_PogKWdCkFK}c+>{u(m=#;>(5&{sVUTt8+6+1uHo-^|-#DCt*5 zsjeAIJFdm`VtzeCm)Wv9&|t3(f)q}-38k`cx;Vf*GXLy2JV#*+j9Qo}gtv5-JrhlWq>BaD6n*8Od z2aqH`^gt3f;6P;gzRO>QAz{pO{;7R`=7;#wGApzkAL6x!B+{9lvEt>=hmjcMljuK6 zE}OxbfzH&C#Y+e&Yyz35CQOVAS1AGK&SgjcD=6djYVmor3@`SMGH8%i!EmuLIh4lD zsm28XAfnageLq&1uPxS)j)BR7)AK-E6lN2!GP| zATyjmmvfoL>-orAfw2TboDQdz!)!sfkFTO z#Kr&NroVsR->21oBrg6>5DN)FB;W#shVZ!C|LBKK1P(O9RHXd{T!-4i_A7tnZ7Rn)f5Ws9`cNZbMhwJPTps#&=3Wmn@IypVtWs|Bo|((A~9h%X+^jC)Qaq6l?45dX!GBmt1$EX%)H!}Tmr}=5@LWn`Uqa(; zhDNzihrF3Di%IYHa-B$VE3b=2|45zwKWEePJ0J8+|Hu9l32NwjT_6-jA%*A^?%U`+ z2Z3~aCo9LD?SwFxKRrYd!gsL@H{`66DQxW#l5)h(IS?d>M-1ha{O=4+7PoE?qHykD%v6cX+NWlHdUOZ@ z>EEJBi@{0U7g72|+2v0K1Fo&E+X3|m655t?{{{M>&H!0(TpAi0OlnQkpeTZ_fv8V! znsL(wGGS&@Ia|*U-fx=t+x;DponO&D|E@dICRl1mHN7ntluf;_l*@qQc;h=ivZiJO zo&zc+gkAwbcjR|t+t>9)!Sqk_aqndgA#{y=M;gL;nb$!OTx`Bbs^Jmiuf>PUqPUR#G{62c8nZ$n+$%|`S3yyYQyyONwPXG7sduH#n5qbVHD>AW zQk#E}F$@{&oOH1Yr`kX2Bk~R%A$4fv&h+3Wh*sF$BUfK)!`>G?)N~RCvz;mDUaq8q z2YuHzugA`7bu6+JNw_QgZ=F*8u>ML@r?b zxUxb@yBWhDU;v>eUMI9|rsSmapHUbE-UT4XNq@>6xLX6=Lv7-?!u~5`ed8|PIbp&^!P1xZp{tTlK*nvk1O{Kfz0;1d?a&i7p~071sBw)H=X^YZS5BW0fJ7;8tCn z?{Zn{u@V3_ut?|S`4E!wPk5BtWrXi270`>ppy&A2^?`Q3+ouW)oxu(`LDiHcejwWj za-nmBF!IxnV4`X0)r^KpiwDl-Hv4CdKgv$2OFk3-g}UH@g5FUVz(Oed<|Or#wM-h+ z&{Xc)=ferOQs<-m!=hDZ+UiN}zqJIKXOV3s1yHUG`f;!D>KC!OLWbI3f$Bo^>|8_T zH(iSv=r*?IRXi;eZAB>5wj1_}9vUtrh`XJDIX+9R^~1f7e|XC0W?|7jf7Ynd9#n5c zN1t4DU+{NsbUBG{maRC|v_sEUo+gn@U=q-O;LX}|e}`bQTx9fKwLe_)6oe_u-^0Df z4=COyRak$V{|v7fUOkh*JN#kgnryt|9sQ_1;q!7*QsBCU(TY#_4|FBPOqZty$IenE z8h4T~h<&{CwXWTI;){io5KykDG9L#Mjl?6wNky4n=n z;gBTCALORVSRIl=iI)U`E59ZCc7q8AX0ySJ4!m@~hHKiH8!h31r2mSEF6KI)=>P

    tHGvW=1+S;zCYnLk2mMO)*V(E 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

    Nmp2~~ziB)Nisdl1N)6Bo8XW7` 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/media/screenshots/netbox-ui.png b/docs/media/screenshots/netbox-ui.png deleted file mode 100644 index 70cd770893ce2bd9ddb7b07bd2cb128d3369ec79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174655 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


    1^0`N^_~TA;wIqC1;+l%92@wX)Q5Y^y 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 oz(6n#fOy=Zm(gzIMie~vF;nj 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 NO7iM*?_|tF{~ys-KQRCR diff --git a/docs/media/screenshots/prefixes-list.png b/docs/media/screenshots/prefixes-list.png index 927a7a04ee00e9c45253725b528e00b4e06b22f9..7220a88173a2fd224d0d427d25f0b8eec831086c 100644 GIT binary patch literal 364450 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 `Q9 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%0A* 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

    dyx9B5irj}AM&TUI%h>rEmceDyyRxn zUF3Ei9#5B8|3X!=PH%kq4F3hIyvck(wVnW&E{LU40j~^LVy_RxXo9czqz^jy=Pkg4 zdziI3sa=+ZeTIg3kme9o8mOP=v?11y69Vit2@ME2m_i~FAX{6iz+y8H4}bhwv|q|b zbG3hiKPFrvw(iEXJ<|F3=J|x3ON5I+j7BOZl#Ti8S@&zbkb=kKJ$RTnhe#+QNU>_j zfFO@i)e=^tQP=_Ka|;*OlK4oqLBfc{zT%^hI);4H;x_4K4$(@aD+1)4Hb75bOH+2y zlMkQMjj{OHQ&6Xy9TCG>%+%4Vz!t%C9vlr88@wifeJj zKi_aKH`_unWbk*gpl3nUh|lRb90?(mf@L?XMj8@+8YgX7U(Tw#znkR#Hmm{tVVKiU z`wZUo;04uf;AU~i;?#|v2oMb5jT7nm0qwRoFWN?i_gNX8I8GWw`5<|u=4Ddr7%!8o z{Q(8f`cNAU_$oK!^Nx$W&Gxpd?K{5ANhwVzOdO7JPY5BYaECF^=;C9Tlg>vvZ!b|( zECVo!|3!biDlb~TT)Yz~-HBej8#=u8d6%#I+&8Gmv0@`JbPh9AK%z$!I>l1%L`nX| z%B^i=8X7MzLn~s+V-=EU>-tDfQ)uf0SORy|5uF6c6h4*t6rBh-z4{v;_Ne#6ab^uPLt6%k z`ED)cbQZV~ML0sH#H!|kH?`iIDk%0Fb<8JZtHbC<0<;vcY$QRy3%>XQIQNXSg-VS& z5Zf?&o#KJyD$Oli|~ z?kE7iiFC2mC$h%RrniX5Y8g!|nN)Z(lhHaL&e5!Pq@va+ z4Nl{7SbqsZv31Dw?UNaGj|(h`5{BKk465Q8WN|J}$*Ba}6bxk2=BhLOmBMfVtuj?S zKB(V|hDIvh4LJ56)DN`CFt0H|gZz!&_vddpyMn%!b~@vaw+G&oueY8WpW>*L^W z@91&6Dns=VOCg5(nc#Eq*t3lHh2i5btfF~%rR+Xpl$aXH41Nw!P)jkYCR;kiW=F?s zPjONE8HLTUb4Df1o2;1($q{m~_Xq%uAhWe}k{dF&dcES7NLHY07w zZfR5J$0yggYj0DwH+?kzew9HSMKUQvjyvyu@?GTItE<`tH*&MC0e?dsKp3_Vq5-d( zHU6&c(semT=_ZV!snyr35}MJOdfvc5#2#+9WOy`_l0Gn1tEruHR2DOKF}d{#_3NvP z%#js)Y%RrBe@J>5es44THKHC*jf7bHB+vMS%(PdSAt3|Y%WiAlTBhf4=k=Aun$zcs zEUUpd(}dJ80Vc%?>sw^=Rc|U2q+%s@MZ<=iS&PiG$gPCxR;NzBfl+YYXcd;4)YIaI`VRqWimVbQV?iXp1V{ysqgYAC zc0az=cCXWdL`wCkDW^-J($twG@{)EUOkSmWa5lea4XQn8npB2LQF=d?FF1@(i4eGpwx&ILnYcPdRB2_A*Ta9^b zzMiYN6u`BN!4s=#M|3`M@Uw>Ci-mJ6T6^g>!~1%+wV>_!L3i*mAAm-fQb!3+Y$Dck)?L(ApXk3hd%i3*|>yPHL)(R7X| z|LCawg_RFU<+?&RNvA)6Qh7A63^2gaJLC2svtDfuNW*l_7kP5tUo3;Ex1MwHex15g zEJw(Mx`v9zmzXdfTR)JD6Ttt0=zI%vaGd`#&*TJ$o-c=dUK|cnilsoPjcJ9_d|#)Oh?S5%WV7dLnC{-yEk`%0e^5QYQV4A5SWytPgjK47 z>@uO>cRLhjkjnodTRbYzeXl%Q@ddupVmnwQjAQdWJ0duf8LqUbeTjmhliGQdk-_Ku z?z3EqYBH}AUiOrYxs-4?Mge@W`e%TtIR4^u_x)&^cUN7_6negRzAMPZ9PSP+#$iy#jXX7rJb;slGb|9 zq7|D|K9|1Ro7AE61IDoYZf|ffJwWgrjZ#Kj$($KSHF3xCS4M}UF(%~_tV(l|(ox2- zSTSYH=DIivI`(+neN0>{oi=3@8nz&wV`@Os1Rqjr^>VfR)?GCC62Z>S_))_mVZrA7 zET|E55qvq=;cSfpsN3X7k~k<0HyH!8BLzF|EIlWT@|p;U>7XmfY=YzF>*qbZ81&En zo^kt$2F14jBySs`gQgzwcD2`8|6Tj=!=MqFol}>qjD|jQ9*-E( z0q*YtC6i0YBEYNoqT4_K8ngXEA(E3)JD$n(|GR8b9~xT`Rneij;r?5#~MpSqbH%(w6;SBUZ!e2GLQiS4_o z*V~!>+wcQ=OS)ZSW;O?vD-=sz_5iAF>pA>8ouU$)ebwe-tgoTK&8UN9wWO-V92E?e zcCVb~fI?|&{z7tel-*QGY8ziD+8)z*0HP#Uu1hn4*v9IB(oWwG9wU}heg43jCyl8m zj9-^iys8i(c1#Tt-6zP$8RF-j=DGRj;y^CqoPG1pSCVr`D6b%}Zj2PS^p(Nt?e@j( zNU>QC1PQh*B&ts{n*`1?iluJuz18x9>h_=P+}7-m$!x%1v!2zyxEo5uTm8jhc~n!0 zgS}NYoA)Fqj}{9wNhr`F16`L$hs_;%r6|X28k3VZm}azE{FDRu{saVeov})`*ebB@ z(=1wH+lR*ojM%sxrT@-=d>;FE1_YZ6hOGU0KlvAi;Gao|Y=}N#r+3_=M8Mwyy!RS( zwvdDWCs#UP_GGaq>zfo%YWO#@gVtv>T_CeG{sI#uSy&1tf0;bXvY zXmQ6F9C7QfA}z&K5Oi3QqGi@3n-?5DX;dy zX~{g%&)$w{MQqX3=PY*COD3}MIm^GnB;656@C@JdX2T}g#0L#O-HOoeGcGGO09yYr z?kLs0x@116n6hl6_8OWOZ%o!JT>mDkAWHB&!ky<}>5NalW8mF)C}Tv#{c8xPGW3@Q zn$>3D!|@eRnK%r#`I|BoC2q_ubh%bl3}w}cE`y!rPqfu z#oc)bbhlxNjIhMup6(FC;MJ}h9?Rb6o#&pRf*n;l0Jz1DPShWfS=bvyq}QU1ANm0D zN~F^ZHy(&Geui4J{WcIqAX>ryQsq8DB(V2^97Zx^vyaJoRB|4RCdB2;<0_?!LssIGu{i>a^j&Rpd_#^JkMEh$JI)h`Pq*(`9Kd%*$eVov&G06_L6u>ZI@;p4@d;aQ{ zeYZp>^HVtsh+ne(h-__3f$;DJ^YWg4cI=$3bsFAg-65l^Xk|FsXOkxinG%k>Lheve zbG3+UxYcW8r(&XYXymTd{icz5b+el!rMQ964=z0vkGGpM$T)XUY4CFgeztg+d0`OU z?SgSekEYz2+LXd8#(4Sx^8wgL_}i|4oOUj$a1q7}?z)N68nV*s-&?7OPSs%5VNh{# zJUFS}J6A1QrOFec&h$%cN6G@r`eK>r;tLhK%msZQB;(q{DAWF6S$ z&p*<{<_kxtIoxm#pIva;03Cg0J>*KN|M1#FGE6!Ip}uiBCWSkaC(1HyAvd@0X7RkI zf0tnTDd}xc(C=*t-CJJRrf4m3c8ThBTxMd-qm*3f_|HWdHB6-O)drc5sMy(#OdxcyasVpq(LW+gB5z-DU4f!fjiedn zZ}R3N)4QuA_n*e{CZj6SR)IBj-7$1E-f&(SU>X)|=p#dagdNIuqUC}7$vLTyEoaFt zWKx$ZnBm=@(Qg4PQMwsy99zlkaAsRxkS5m^tWdek1=fZoFyIO&JB)slEw#kV^ zE4qq}wj{m5M1=3$#yPXg6yO9|Yq^T(^ka_M)&0CCm%;~;kQMa;Bf2lr0p{j7fl?iD zI$vIR*OF^y%?$!phq-_pJRd}}M&@T&^}pebxqreN8Xq3Gn>yc}4E{U2vDx)6cEh9W zF+ygG%JVPzvpTwJtM!UT(CgFfr|JZ{pZ4kaA9(@EvX5*Ifzp}&quev$mu4*Pvh1_90qxk zU0c=TQ7nUiV=ET&7nxQjW~9vxJ-$AyVq;VQ+vJcm^}H>{2OLMqVN zGZz}ViOH^0?BG*}crx4gYK;I@e4yLTZh5Tl6Hx@j`UaAaUA4i!eyIat_+P z6(0xLBB?->P+*k^9FCYRZD87+Fo3sn@#%;+4EBZ!YG#fhvnrlFqwak8Hh#|kitw_- zA^=0V2H<3Kk}h}WhNa=xzRPvXz5YRB{MD`g5of$+&@i6O28AD+61;aScNnf4BA5%h zDRfpa&!qi1Ie3?!Bh~C+VTHj@gOuoE-m7nuSG|-IB^v$m7S|v!bVbY z2jdmLuvAfY&Eu#H$%G1%Om33X=WS(gb+u#x4d3scY%3}rf9N48s7PP1GK*?@PlNz||M2(!KWoqcX!kPftQz#b2B6(PUF^CRru#HbYGPWyq z_R0`~Uf;Hs@B)U}x*Cz4P3T}boA4AO_nK!>oVR%m*EtK0A8c>_%8R_DxR=7f;abY| z2I%o0O+~fY!O~{T@6xN|UrDgu8khB8>{oBITk;-!56fg=t3 zz7B(QZBG{uyW|M8<4}3+{#4Axyq}LZy0HaxIjMLX6v94PAUhjSQ2P?HsDO*6PU72; zpNpoI)kfKT{oNfBP{3?*E&1)4hi~TvH%GXb)oKyy*?1g6lI8JC9O)>>A2I;;-g^o| z&=rH}d+7EL7DYJ^Dla~Y%dr$v4!M+$LwMp9sqmqcFJbUF80ujWbx1}!Pi`u8vr$8)c8z|&;+L8g)8u&j00;{Qe1!kIFI&o!LdlM0$EpmVc3iz@cJl!Re@ zAk|s4x+DJ{4jd399MR1c2nBxj6UZO-N}+!{nsOP216EIlC&gIrt!J=lwV~uX*Uu(J z;Dx^Ha(YV|4M!PL``~)JR|B0hzHiGJeO(p`sQ&}M<~|>+ zOn3TJHy_)^OxJpx6*cE98`r`W=B_vx`kR zJ*hA*1rSFS70pWegK}5U_`Hm@Zk%)Adu!`;@Ey~~P32gttqhv8Qe|in2=0`v7a(~3 z7IUE0N$Q|lZ9e?bH#{#Hmd@109A16b6_uo9@{L<0UpBn}flVVo7)$^;u7IA@`=QLX zahHC3svo3YTZlkAf8Kk97QmRnQk$`%yUICXy%&7I*WnIx-sPit#U%3{CeX~smQD7x zzk`8xuIUrzTcy?lpuuzdeq%LCYz(s6;Fo89Jl18>57F0!c+b*Ylo|DY2B*s?-ogOw zR-!@T3uitkWSgddF4R?Bhp<~O>z&ie*I%?UD?-(tZb7iR$blQ1z{dgdX>fbSu z!o$F;>vg);?iP7d^LP(xuM>dSwDG8Z9{(jq@rEn=zE~iSR*pc09eIbgjAZc7$^uJ2 z<80bfLt*2L{j?5uFsxn#9iZ4e^uMUN7IBIAX@DtJ(G30kwkKfxEL&VBg-0Q@mxen~ zKc-=2R00<%Q2a$mA*qdW{&R5Liuvb|SyyZ~Bh4rIjK)fL4uxf)J+~j=OY%`St8PnM zm|f;>dK_u=n@|ORWQ9&;YuqOqQfHEXfD?@W1Si-ljZLV1&LMv4%|*zx(Vud9n-R(@ zZ3;TrY4uz_HG+DyOZ6l&L~A_SGUr26FpjFhx;H=AbaJVe83tnk&5bp^@VcGX0LAa= z3%v_E>+D0|m(AWiG%8S2R6!EDs6OvC@Ui1<_rgKoiBJt0j{7cG(8_z?%uI-{2ysmn zU$T{r&X+A((_K{8f(Q{zQXo-GRw*vosy^;(!r zmi@u_1n-w0985Mwn;ZrcNMRxg_@M7Tvb@xdsDgdu=;x4tr4X2t9zy@Z2oMhYYN1_wG$%}+%Tn8GOI|OkQypdX6hQSFoSsWuXst>WqF8Qj z0IUWPeSp=VljlH7y%|fUDct}ak)Fy@#pBmgIaKpx`u+otvM)w zSs{lq#kkUs$uQ+o4G~Ge`N^7V%KS6u@sb%IKH73?0i8ve9&^yLWHY_FlkKe*Gu}dc zPyJ?fJrFpeNNc2ecMo^qsx-Hhu1b%v{V_$xU46Cdyo<)jBOSu(7V#_Rd$XNQ{B#O3 z9V{jDxjk`9$ZLX(!90^H-cjP<`%`2IZm1`r{NZeDHi0M9j+k(CbI5?TV1SL6LVO}w zf~;2VvOx#<5;wn}Fzj{kIp`rK19@J9`Edc{%pT@5Q9^fuJ8rlNS9=Q}O5~J(;MREG zh7FFxLyhX~Us&PLUL>q`w2IIl?jyi#+jk+4rYR1=3tZFLoR}KJUPZGlmZofCP&{9x z-?7>%o=}RRM&YA#xew8oorVG{*sGd4PE0WdU*VNwhp>ZLo$~Gb`#G_WJBvAZm)egd zf9tS4+)U54D21HmgBeqWcGQ7L4ULLxM{HiLjd z-_MG>(*Z%jcK&PAm|@KPrwYt$$4(3zToPjzEE`-JVZ}@)0YcBF>21732VX$jmZ5`h z`c=s?GTiJ2A8pe4eOvKO|@Uu@ioT&;2|c0zJ%x(af0fkWGvai;`k6sb+M1NW^AlFdv`oh)aeUf%v)w$^C~W=L3$@j*8-Zo&-KMSR z0Y=Jt{Mv6le}XMX?sjHWhfq>f0=YcoA@7;Iyn(W5XN;TkbTW4fbm)M zV~nJfZImj#NB4Hz(t{rH_!j_%P%|)8kJ7GSigPzB*Bfz(fF=9*Xh~MBqI4oxB#6BC zhkf}T5{+5J6JIC!R4Q{nshfx3GE&hX`|Mi$toR9lK|D29&q*lUl}e?sc46Lz|8&#l zHJEZIN5ZGGI2KIJOv0rP(9v5`1M-x08+|-#4yo}IiRdRA6OA0NPIOq;6Rc4unrq|Q z<@{uuzJlfF_ht^4b~FDXLojEVW%fK)3G)hto^m1Op=@S#u&F9*hOe;Sa1(!CAR-zv z6N?l064>(xd{d6)eB~!3_gfR0bXg#hK&SDOEu~_TY)fLTBz&7qttk>RIfn&#I=`qv z0?e=eJJ?=7eE{@7N$^X0++8J_*YSf-4~+|533cIe;`?jQ36tj9S3jIW%WZBdGdDa1 z6(2umD%)p93_Ci=XG$;+6;ize1^3>)RmYnj1ZpRxr;p`mn5Ci@^t8>5*#}bBv?VH@ zCGn3ov+SHyaDDzetspfN2D1mk2ZW39xU)$vwgw}BR8zlukx8%#43Jwe88jHLj#jY? zWO!p*3UJI;>#;qXY9 z&!B%Shf+F0uRp%e(0<2$)anA;-Rv9s*1e!?7TXhLb$mRH>Y3#oviuz{*93kkp?VI04@un z^*d~qP|Z_eD3aymODna8^L~x$_Lf17CZ0jdBmoh(#{oxirnf*T$qz8hMc-sW8m#5Y zsTX)Azw~7)I@+bBwwAF8aby{eh?H|b<2EeZ?LX*lll^$93z2e@N~dSThomY#-3W&u zTP5E-Hbjvm9w{re>mV$eE69K|ap&cTQRcYoF+=bQ24e-@Y@@A1Qbn=WI-PnHyRU)t zY2WE}7=55Z_4000ANYV@u4jn7&u9BUlwXsdnTU(YZsT7U zT!zI)6C*)v)0GFSwP9%0DobQ;9))g3dEbTRp={bB*&x}7hqdVG^YKY*`;#v8|CTF13@}`CJKH+ zwaHI>pq9AR0*>wmZ#OS zKls%_x>;!M^ak!CwVr+%LXqqA5jsg#?>?+?`-Q5HGB=#=7WQwq0Czp#2t^cz3Gp(H zB>pNKjU)_%^!~lx-~VzJ0Y8Z|q7Zn{=55Thes~c#>@v0TCaGI9k3tJPm9Ow~)p24V z;-|g3vm*r;((ipSy2~~7NPN4ZiA_)1z-~Qg|Cv0*7 za(94`9jAR1u(;qN?J4*`N%{%)aJq7^g^zjiBWjZK=FSM|tnbv{@A%)(Jqm$=NB6`> zseb`~6c04{i165vpWjK&?Wd)1UM$vju$4^yDd1#3Oj2=gJRIffW?>j{MbQcM9|QaQ z!@5&p;G?UlBk%l#xhY{_DG5>WQ(r&J1tY+hQbbXglEBoSPS`${TO!)vZR`0Wgh&6H zSKc+suyBk-NW8c+hwWL0|9pK!1J-E%Cv7$g>BrsYCKM*e{ab|n zkLXY2^G7K8rhqQm_%0HQdzyD|b zv(DcG@A+4qN2CIwPUNbz8u8FNmUv;&gc#GVY~QKf{p(lvB}?LWd zm43of7``x=DwN7-e_MHBCBzm{Lk2k#hV7QJiH}97lh)`bs zb+J9E0VU0pM6iZ~xTAKx{`v>_X3(^4|0G2AM;o4|-+xn8 zcv3+5<3Rtc{6~qxv*iE;CJcEbnPbUjDfpY8F9(QO-zP_GUlrIb#cqmTq?luOEujs7 zCrc5hc28Gg1Uoz@C-Qv8e~1Qkx~kgwpd)gCO4zpZ+Nr>kJ1^iwkBN)%{xN}WHo#1; zyI+mFpd(T|>o+314IC&(IQzpx>vXyF8+y$gm1;{8L8o`(5jYXISH~pfhxQnV@JYfA ztk!fo<#<0jmMbgoI_AVYZodaDG7(iQR7TmZP4%s!Gl*KAp&qZvsus!@ae(K7)Dp-v z6s0O#{is6aDO?k|=6VFgo5*E|xoog9d*;Zy>fr#a-Q?}Gg3YpWtwQ1O;d6&JvMOc3;W z6f1%}C?L!#ay5`iDs$1F%%)>fDJlXm)!aAj-+3D#J{n8rvO-rUX64+TF*0fuGqkBf z#hlR9E)3c?9k;I%Dd-UGLe?@e$|7k@~CORDh&_%zw0&)5YwLH|dBHFIQ?@K@CMNjU^$PsOhdb2K^^}fSoC6r ze$#GkDeWa1k&UHm=+>aceDsH_!|_jBU)K1h@7`$JjJvLCFLHO0=<{~2*tA;F`Syfl z1rN>cOQc-1jH4|Nb=jsD5DiO=U-mCvW<$SY#~&2&Yuq_s|1!|wXizPNK#TOKXblG! z>px2**>-9^oH*_+Y~Iyd4=VXM&sYlijgqX0%{}p-jX>5(@r=sEjwe1j3~!@)*7?o%;0N+K|_O^vKZS z(r#X*siwAlw4vA};s%Sx26RmrmXw58trA->D8t;qtGdYe0(!Rrx6siK7l!<>2Cve>&x#UBj;98Ylost9%`LMu(c!1*1Yj!nT=-~|m((l=s^I8G(8WI4yY zG_^U@`1VGa6bmrlNH2d<=;Pnz{)f79#eYmf2q5Pg(@Ui8k z)!SMB4H_vNdXUst;>$fGpLBh`wk%9a*`Fjh0??oK%tXr{=eOuoix{wJRg)T-?-O!+ zgXL}H5o(0rON0=z8ujI9h|Wzcz<~$uM#YC>yIx}(eOParkcWz%=66|q0t?lj&|vq4 zBt^?KH|2nsod^B6N_uN0Wnm`DsFrqP6= zRYQBOwx`TI)-MBeMoDClRH#sfj@ifb1wPWR@O%m3t;|G(-7-{BP>76Y(&fBX{dTo) zA>1W6U1aEUan51Yna<~$x!R6o-h*!R)ksv_4~ewJVJEx!e4_-v)#XI2%Ahmf9T~SI zE9(z*Vg@{CUA*G0P($rIuXsqVA=~{GX5(lzQN?U@EUmVTZU{}en2`Wgz>G||Q?fy3 z=!%CNu6r z`Lpxs)k5fG8y5?Z)1-Frl*fZFgRj=_k+(Lc7MosCe26RO?U$9kmeU7PMc{ag?61da zh(67e*TC6eswjNwt#gX`R&uOnY5%5I2uRCYJFPvF+0*C#MSi1wHg$Dz*)AAABesau zYwE3R;LDEvpLeeHR#uMs`5#i2S`&aBEwCX0NYqG-r7!$~#Yh?9qgU$`CwIiVQXkF3 zf`YU=(Do$X7E?RJ(;Ud$WVcPIl`a9w(cU zCACjt+kBkaf27|`)**D(fBx;%`B-y7Ik=;eJk)so(SE@%9H_b?`8A{?z9_^kGkvAq zuz}1m#7iwzKoKw~qZ_A^i+o@zeLjc8+`eFmQ-k)xy?a7&N;LG#60%jS4Rz%l74=pK zL|`h%(M&;Q?Ges==_cdAwE;YnZKL0+WWTF&V0H;#RktP-fxgLXgKQq8u@b_mldb(p3#B;Yn&s}KOQsNZZV`hA=tKKL^Rb(j2o$~Eb@9VibgxZP4 zxk)(6SGGf`x`#N7s!@7SPiM8^_5*JekI^DmMjNRm5Cb`JyEl~mJLF@fk$Q>P%q$ky z2bD(rr?85(pout1S9J~}qD(qP3r=$x1)%O$0aYG;9j+ZKy;37{ucI6}$)FSDg2d@- zM<{aheRm(L(8MJTnmMv=!&;k*&P+_3nDY(dsl}pL#i9|OZZq!ABaK>rRpyH1(n8+m z1K&@+T=RmRBka|9qrPz2s09YEu~MXVIyW_PCXPOKt zLA_=Fqf88QkY$t`SdXV+X{UzOESYR~jM6$1aeV-kLHNmuw7R9RDRV;iYw=FqM1bQA zC*_!g9L|GRhwWtUI!b(hmzA6$cVh%sqEFqTDh84+ih(GfW_Y2)kv!QUe;z_`z<{GI zkN?I+-_vlBpwkezK&Z^CqjkiV_B6ao$csauh@9FfWlOwE(b8;&t;^*4CO(V;>(`zs zqC3Nw3WrTtO)yuN+jUw}y*9G)reK)G`=Bw;!5Cx^gAQ1;#b6cI8|}1&7IBA|lsuKY zE@yR%xj-HyyA+c)KRzxiVAfr`;Jdw*OiM+u)KLgNN}%eCzId$GxVk|m%$3NCoe`je zjGb)#MvpkW+_;rUdkqb+xFr;Kzt20nJ4}CHA3y$)bL4H<%NNeamYp;ohac)!sV*ul zdE64Zx_F57KVRSpvcHXLH80<{P9c!-1q(?ZH{o?e`rj?@3E)mNnuz zoD3DjkfkjmY<-YlG&MR7NGffeV1Io@cF5sFsFoX$@T>2tPK#>bTPvd# zP*_y9i4H+T9Hz!(E`Lqs;uGZeaTiKneo37YKz}tqscP7p=wLWdgK`%SlMue)K)lPPX78WPI=qKT3w$P1u-NGm zE@-(sy{+NykO*zx?0e?HonMQleVG^l{7(pf5eEBkJ27cGoPfCgJ?Ta@&tXJ=F5sd<+WoRg;u!h`2vTk3qf9&BeccZFMI`3 zG3g#IrxJWFN4cLUBudYx`Bs}073sH+vO81dz;GV%8Utn|ML!_Rwsc%zo`9p)z)9{KOe%1=rWA-qBDjIF`{xlp zx+es4;>J2nU6;#hUJM|y6>?VSsNA7u?0x?s8USgtwq?c;zNt!+;Tk1T!Ih$&#oBkU zd_@`=qN+l(>a^BrMJccoF-yYpORWT-$h^a9AZuCLqu+F@WIJ1(l1wJjMz=U195XFchu?@m4pu zv4@7jQq6$Cwj@Pb@F|`Zzf%~O-U|McObC#L_6wL=wVeCB1Qf=t3{(>PHl^lPDzbgR z)^*el3$7M!!V=C`z+h*-uaS2T4I6OS??FYqHb#U{uNxZmh4z#AuGX!q$)jp-i2%F; zb%M-Egc>QXSMnDE^cyiPFy!4TcdSeMvw=UIPR@YpUP77{@(e|8lMw*;vcJ!0af?wW zkn7_T@Ce!KhcYvD+okd_FEfh~j*jbaei9updJf$sElHJZyBo2fyIojBm&$ln&}!laUwMGl(NJd_5DyB^=3db~3n)FGtHNfUz2hYyo; z&j2UCeo^pvVBJ@IrhD-4b8d%GMZ1B)pxZ>PWF2OPYm*JUK-}>FVwL+f5cB%xjPKxZ zZtOmjPMcssd4sqd&Xbqtr{X}k_y!bJ~VGidV5a-%hDhy`& zEu~z7ms`*Fi=3@@=Q?bGqjkfz8c0X08Pq50b0_*7%K8S&6@fa8QRbfnPFl~26PKAz zD_r^g1;6>Zl(|+B$CK&vT26JsB`~ReD^$o7uEbuB7bfq051(kY%%oErkXZFcpUCi? zE2_YSyV%1^JRGg-Lw6-fz=&w%=HD))!Wh{ow|_jby4a3pm5L=^_-wET0WvD{bX_7I zr?=_H1uIejMadr+jP$R_8J!P!{)p^3L?SkD4j-&{#BfBZW|n6wIUmR zKGl#|=7Zheh`_N6yudu{T5!J%WC<+QuX~wLwpX}FE^D{+R z58tR^;ZI$UUDJSxV3vvv!}ZYGB@>iL{fXBk#JAX7?ktqQ`5tLzq_~-S+&7UwN+qB8 z3v*F|Uzu__A`vDw`R5Wl!5^W;9(UQwOis7Ed6jbD=tk!9F!oTm?5ZH`y+sJer>$kL z*&SJ67P#Es(Tf<0!_YVws?RBAn&+f5c2WAaj~mi=Y7Pbkw={hVe)D3;ZCs7Bx`vU} zsJFnNF7ndVRUh@mRT8Ff`8EuzZIM^fuF-@D=Tf*)pyzN*J2b-}ux65gZn1pK>l@7GG>ua;1<+qlMPwa=tyj zd^YnUvApEMi2oWI)NwCcr?oE)lrjG#+A$pOhtj;voz;5;JEN9tC=1);P@YeM`}8r# z=MFSko`!O0@`xYiCLI5}#UT1cx2dsi^w^rFbY>Ivm!#5&jh|^KtHvs~qfc?-z2=04 zhoG#bUssXUUWvb!s86$A^Mp5Cj{ zm1D2Jrw+?LVUnnY!4$n7u5F$@EVwWaO_Ei^k?zS89n$2qLx+_FcL~F1*r=k`Cdq=a zH)KPDb1|8%jc9gZAh8h3iknRfr$bQbnvP?ij_xnOsg(LHBr$UeKf zB#Cj&)3o5ByBgeUYHwH&C$O6{qM%KG35rR1cAmEQR2G)6M_Q$fiHKq(1Q|{F!w#wI zV>&kww503+=<0xAz$AqyN|w#@_U_5BR2HLn{JN&`4VJYF`@k@$0)vsXca)C)g|$tU zK!Eh>cEWv9FkwjyfW%r*g~{ojn#l+JNxU`cb<8ENjEKix-oQXfpi=ut_3re|d1MUb zo{>I{IA%^*HCqdKU-+=LZ{^;kV>4!*Ct@tIw}bm$=6s`U@f()p3^@C|VV- z(_pSZOlZ@)cTC0)@F_oiMNr~=Te=$;dp54ymy#X6<^jprdA_M5r+`$jvD=zQ1Wi%GU@Rk zgqV-o*?=#laPIg=THHkO@uczrH$3_wSv6x|z^lqicJF2Lp@b&ijY8*kr5~WHrHw!! zMvE|oH-IPer<5OxT(X8B2~$&GpbH;eny|vXJS|MGG*8;u8}cSifk;RqBCR1i?nuDs z(PrkbjL?-yGg0S)Pmm~x)C+onU0@W|zEiPCi-r%}t<6?A0o3Ka51E-MYn#f3eV{Y^ zL9X#4df?0(?SO$ZA3plk(T|v9uG=2f?~BxJPRiAT z7BY|7`KhYc>E^ekDl?z%9atV_zw0;u7wFJNN=iX<@H=ZlnRWTym=4N34}9vYO-uhqB)z42UPG!8ofl4vYY`by0w zyV_B>Em%oQNa;xf6Uoo zCT{9xW?(X<#rZoa(&F>2b6F19P4ppu2s&>$pu<~h-AQLsR{%o}eWz#Xs=gl5by0`O zq{E0UBg>yze~_pbyD@0X2tmb zi&>!YmSn^?7%SyUa2GN)pxH7jB;Ae1s!DSI3UA#4JgNl_J16!4 ztAag24iy!LTi;iyFdG%&Pmuc?YqeA&HmIZ&7`RQEsvsynj*E+_28u8x+dMHX;%17? zsD-Va+bt6w%srd*Ovt7?p9sYN#NMl7Qlq?p7l{R;WYPH{t-_@Kn26S}VuIdVUuE?^ z+3IuW(hecW)P%|}L^Q(pBi$%5U+y3aY1<7-t}gED|Dmw-364#QdS_38!|=)x%#$~K zO^9REGb9q)JUMHOjC6^vRVy`Ocz}z2H;;#_J<6ok*!fw=K)|P5#6;R1`YQ-G&|dAC zelQ4~6+?t7A=!M9$li$cfL__$z^4$>8h4!OlHYroFqGh1_tC?eTss|-;es}8fU=wC z=o#=XdJD}pd34}Jxpatey3FiS_-6Moi6e$ErGyty;9;-Yu)E7f3dUJ z&gC_Hw5DR_)RDv&Du2)n@oLEA&Pb_U$CvZa4rZe%C{Ykl*})MFeQ?&f!^NKw@fOkt~%IUHEAp7a`H33^runXA1CX@^`qabyA5o^nFFY@ME-@>4WSNFtB9wx@iX5?k%$HPnOmuLZ`IKT$u>ftQWov;xc)U`Z@h81eg|IGBP`fhM}T^=+kNM%du3k=keotxM)og#?zXBBBv@*xFRluqG{W6&Le!;z-Y(97n4)HrnI zSQg`x@A&Ch4>~Z3rln&R1&dmGh1BZ^S^@?JGq1NQSEh= zDRh81;kA85wMv%;@YKevj*Pos268V-+Sl!j#d#2lRX0cyV8}r>M{X}ETG5U$F4IMK zERJ#UL@`2188Qub#Ko|Y+%+OEk*y8iiv>0*Bvs%A!5ms+3Wx9Nrm-bjyE~oM^6J}K z4-^)gTsd(w7=x&NQ5Cj-6BrEbUNH1 zBlNHfD=GQ$#YSvz(t~-+HlmyhQck#Q`)l?5zUeiK%_TBCjlVD{0MGbn34lKKo=pm+ zc53;w$DWQ$-TfG5zj-g~XkBwHd)TJ=ADCEjBuZ1iIwKL?$P$mmt%I^93<8DVVH`4} zk-A-oy%p>3n!{4ElcFGc)Tv&srQ`N|DW>gwGQ0qV4{hj70OcfGC}rPL==hs>?|BCy z;}s9`fOOpW+wkkqnJCKi>Duqr+p9(|G~0ffn5H;{Ra`KJ;kfc>o;IV15`0ovXmp3O zo*y7qzC@V~$UI(BsmT=w1iKMv70{wtCC+7oAG<076Y@@!WS=*e#uqWVqfUE#ey?C& zYQqsh!Qk=Nk|Ywj;^`ecx-hXpm#i#blt##q!sypDk&Bp-{0;ae%`^Bj|#GEk zSVnyZ-(V@sh1hJ{wb~dLhuGsm)xr|iSJJRzu`VQnzk8t~5)(t}Puf3Ig=i5vZYHPS zvYC(Ii^^Gnd*36qGF^XbfZ5O}@qeXhilv%QlEjkEhD7?NFG5{EZfm#Ch|X8ayjo^^ zST%4+U7oC3EMRaTWWuLJcdZlw5vU%-R>-iM%~$PRNVi{;PPRr16pH;F0nwnYT93vO ze!t6*$Js{twqlF0h7rn>)9g6olI}W!ek(8Ih$D1Qyn-Cv!#|GjW5bsNR*Vra9Lvh< z<`oImIKs8KB|XxalBqpd7E|AQapgf$BQ7u3`)fOPj^od`7m(HS-+rNgzy*chgli@q7hkW4C=YT?f$SN(>ksv@fN@Q?arF_AtZZ&Qg zC>MK=uCf@lDuEkis}2ed$a&9l-8!nV?yY#bSzX&c$U>HCS{{*k8Ed<{+At*pGf{f? z{q}9D9VNW#PlNlFF|g73uOJLLfw!Uo zFf%S1K#QEoZyZOsXYza8iuafK)NLSl-M1c-c2bNv*^m}XZ4owjjRnKjk~7`I-K!f{ z-L*Te`R?5~OHIGYuJJ_iuWoQmIO;q3>z>>$_s?E==*U9u9xIDNR2@}xjh9i9uCbN+ zrHu7{(CS0@^#ZxbK#R_`w14gLk;vVdVOgTp3kD@1*r4`$3)o@4A{SSFCX1P3NtSu|ExuSXk+TdB}pd z!?6u-*ClPo*|{o|6SF|!!>Ii7ASBWi0Q%9lx!>~>>DBvXRzto8V=l&L zHX||~XH{kaRj0;f+)OXfbq`R$u#~bpa`oQFmZ_XysEK&JwA^Vc?$;dRU?y|5*(|48 zUp(-dBYxRvIXpZZZUM^N%lc=sTVO6Wrf{`zuR|BF59tgu`KLSe2@d942#zl={9%kX ze^L{}8PzbXvDx#`tS~8zGr6ye*#!@g>7m*r=ZMS6fhc;C$Mt9>Z8_IiNj^wNsBpsPj;;6aa$%$=L-a(Or3?WD-l2`yo zz?h{-%Rar>yq9`N)kMR`H6g2Kk-EvvEjT9U^dW7?m_rhSYe=IQ#Duqj@!f80(cGd! zAMTAXC1J9g^OkevXs+m|geIv>CORNo7)M#Lc6q1eZ75jKU5UcYuE|>l3TC={L5>M{ zfwkT12AW@?4O+OL9?*>zP5SCtI)7dVM`JpunhnVU@TGU|zI!8YWuFfk9Rjcb&!|Io zYh^C>XARL(XEbxx^5AKS8ol4W;ZY5lM7jsqg9%ow+Ynh4iRZKS-<_Wqk=A1(^VZ%r zql8*{x#Ci&)R!GtOKXIHC8`HJpFdv1K0^-C7eT@7!m*?p=JQFo#L)P(GB=lCzH-)h zUv~;?3{)pR>;WVr{Ww9-2^dKlSEf9i6!Ovdsx=@Fyqt=?yWq%R%T}HSHm5+${5U3f zx}AR=ZRTwU{fpwML~rxev2qFB7w8qYl##^*Z3nWn2pFDTJUQDr5p`;MW)+z89lfUa zk_J*T>Q&{8 zH^`QaDZTkJz^?MeAovWO#NNbHXJzH%=414NoBj9Y{*n61kbd5?myJKr8 zm={LVXm11m6+s1==M}lx^6a?bTIycUFD<$H_a83Le^^6 zW;Gw%Uie%o%rVyR#gG+ICZn~B2XqVLc(b}HNda$_tT8+yCdbQo?la37KnN_Q92@g` z%Be$`ojhNWje!>!Pr>;ETLA==1t)dB4iJgUVa2F)lZUvG8aJeOOjDWY9LPbr*;RyO zx?4CX#b#%zzV4qS#Ay&%()k8AD`he*##JN4xPhhIj4@Qg2WP*kG?n+`L$tfyWgeA{ zimVWa*~}Pgb6EWSRCCoBiT_Nj&5cISEtXLGJ%8?q=$PH|7vBavmXbt25N)A5xH3O{ znnHXb39~PFjM!oJ;cOHe=bOv@4vSO2hkhg zYbM|A#ry$~KEm9n+}(PT5&!Bb^hMO{ujuRV#Lw9HAZ1|!;qRk>Ev&hO6}kLtr+)%!gV23p{G|b+ zNVY5tD43Z%{a;xN|01@JX3so_1>bBQ(vMNk&CTL$`G4v0uQ%&FpU}Mjc0%(7va}=8 z0L}k&&A$Z}!G)9592Ie%0%+cF)0@BfkG*|;aezL_B*4pCftT!&cO(4|<8YAxrj~(% zm=%6zF@;=e7sUp9L1Hda)+K$+^j3DQ>w?Pfj*^ec^%+w4n^yCc(PFdzQkxJUo2 zvNv+iiW!Bv_!8tI@~p0};Zy%c---zrPB|fte`kFmHF4PA)Nb*#H4~FtwMY3^r3}CZ zwDprXJ_Od!4tSUpH!(ju(KFn?o6hg5*FnY4!}O=c;n%sN|Hbd}cV(^o@8lf7dVmnA zU;MN3&olXzYu71hpvzCVD@YVFZXhe zNzo;q^&7){`6axF-*Zm>674u@wMvnKk28W^dmlsbneeaomxQ$DHp$Tunf)w{7gg%D zSp7X)^z|X0RUubberOH4ygGIIBx{{T5glY2-==>PEp{ap%B3lQXDiW4=#>>IX`(s7 zpFB=><$+)38UjqHtY@@i11Ea{_-&iT8+;Im^y~r2gh4A)X6{HzAw+dTb*;<7<;ilb zOWE8{AN~7sb=W6iitc2UZuIHs! z&`TQLj#F3OYVXz(BA(DzW&5U`cv^Q4kMk>xjQNImh2w{;8JEP%y$`+g9C;~U%A(i4 zE@_NSv}K*=9*NT{H)!OUKV~m(c|J*G>s=i%Xf+b6Te5#&yJn!S&q?zkLaiVDenQmG z$_fCY;@_LF$k-ZoW#=v7jEAhqR?Ox-?^%Nt0}$2Ln}9_7x{cYz%6XH&797dZv7M;+ z(TfEd>f}e-9e!hF=(VL0uU!`wPvj|wmhTT1s9Vd#Q*X6P-i+yr;zEdva4v(Cel^!v zTP8uJ9aFE06iI|)cSCDh=PLKv#UX^A+&N+)Sr)5DDSn&<632#nLkVST4J80|i{TN` z{j&3Nbg~cnus3;r>@p=J3rneRFQ(S0z%>*<7U=z3en(fUk|ix|gIyi9S_#k4H(Y)mk-fvR@LF_(lO|M2IvI4giHwP=LB9=y}C zKb$ny>h|@0lQY9lBvSNO&tDoyO$`Zz5%C@{*CP{A72;V>{*HUX4Bz@H46In`p zt+kR;M^ z|M$zE)QTy*`Xw-Ho`>CrbUNYlTeD8+$dtzM0~i#a2`xFCh%yAKzqOz0*+~=4oNDxl7?*+^}XVeW^H|9vB9@p4a z%dzjb=?ZX$`p8MjB*=!^-~2Q5pTsgm)r7Q(x@!_==Vq>E1h!8us_k!a9gOl?TWn!+ zJX9wdLX2v07@iJ$lH;@yvOMoUe(5Tdg)CWuQ^;8~(+-bHGST!F!PhR=z9mk(S5ybh z9^~-RJ|(<7JSvS=3)6~kCyR;zoS#yb_rqZSTs73;WZB*0vhQQhS;s5*=u>gQja4pw zMAFd{YdYth`*ymv)aRqiQ0Ousw;b5nMw(5`GQtU)miPXg#hV*s;63 zpC;Ma%Y4*tZ@0q$upVxu6r?h9hr`_JI^A=PR}pOHqN#2&YN+wHKP8MyIj=X{p}n!g z5!(Fz>MmvOi?qt4SX^66F>iy+NAR3U30s+G(U?a3YKQy2B20|D_t?bJ{&Eb8Rde&d zfbw~&4!`OESWuIA}^z3``Kyv9kQ{%M5T$G{Z z*^1XRzQVN6ls}n|%1nr2l%P*!zE_!FVmVoEXRai5`6+r1Of|abVU;A-qvW-HZBp0P z4nE&DRpTBevm7maVgxFNWGB~bPF-+xiK*yI1IA%843;-imI3}ZC>&~qUv*sXY?{li&d3QO3kw8{lH zH0vFYb^4MdZr*H1FMYwt8Or0LYRNf_ObjQV&%jKP(?Y0HhJvcaLh{a)Z!bC1$!v3K zRG5t@#XJ&#MaX+%G8Cax&Cj2!GMsvZ3o_r@W4*dL)}5Kc8jOnzsCae`{GWsOT_0Hv zCd#;=XALS6s3a0Kn?1SA`kv8NZVD;fev|p~qDXHjvy-X}CN8$0^0XZv)7CIvbG2R) zApw!MQ^T$T?TFj)A_z&zO?6~EbJwT!oBJ3N9%@-J2+Ktr68kX@NfrtAoQ6vRJk8cuA=Y2P5XOhEYwh zgu}V<<&FyY<$Er-j&>eOQBq{L@+ObmF_|QsaD0R&SG5`T7h~$MI3(CTAR8RwySudH z?!L*25&SKVQ>P4xDuFWU`>SgZxuDSu9_cT4XxY|FuBB@;mFizxo%cn0Gh|D$M%E-R zE)A+4*q!$5JbF(#bt5G=&%B8Emts6;=qaC8yPjYo@YxdoKknWts*Y}3*T#|{3GS}J zAwX~q?(QDk-QC^YgS!V07CgASyHDKZRK9O7*=w)0O(e&MRrv1V8Xa)JDs{e^YjwPXEk-aR+6|Ex4fTn|lS z$)1r+GAl{%JK61HW7XXcOLn|XkQk*~{|@f?Vex!5LBSYc&CTsjh*RN7%gwjVxv;F> zsGI7xJ-Akur@kARo#$sIBnZ(Qrc{8eq@l13CAJ{2L4O0-RmkA4%xFa)RD40DW=XRF zWC%VS9-ed1u;8@eV8ljoL=joVPXRfpFHKFQXMXeoWa`O=l z;kr#Cp`f#V>hL%eC~8%H_&zvSw)7NqF?#pVt#S=72Lh}7K153Y;3>~pmUT~7)>x#8 zo1-gCFEFsQOjfG!Ut;Ecy`T+lv^PJOAq53dj9I4Bmka8|bWJ(!P;ju_C}rM$U9jl1 zvy)7Si#*Yus^>+Z&>x5feK5x!%5BtHM`XrMEI%#D6=q`-+|EupJ4C}Wy};S$`ynl z)t5(yZSJPA8-%>RC?o%fDqNKZG|ak|QJQa%BX2Zt)&aS$_Z4 zeK1~r1J%X+8;D$dzb1+R(w0wxlke%;>V9M`{1yq;%aP*~{w}!3OvHWxa=SM^IA^dy ztfS!A&@OVtF<5SLTCI4b+RfsvdmLG8HdJ}!#B4S0kSJ&IAVcf zDANvTNOxta?8m2#8OuRmKA_O&w4dPY>YAENH#{5O0w#9{Tu;IisNCEjZDTN@Zv_1l z0DTH`hgK3SQ=yyzS5A-}84yn8Xi^zS?M}8lT6#GUeAOoJmLD_DRp+!kOr*nfmv~foC|$yp0!la!?oq6FxUFe2$=zy@R=dE60uAw0i?&c(dWnO}0p+rf&TrtCT3rlC zuD`onrnA)E@1@w{mhk(xCs3%VtFyJXtIMcUx0ug)&-ver&u)sstUSRGlBpUD9%*(P zP*7Z}SThL&0%hEh-5D44?BR;aCt=B-u$0W$_^wAN;58aVtULJLqcGW#`g3zxw|hMg zgMNWKWcDWE4SiTc#kx!|u-(Z-o*1m=J3AeLQ|GB91M-`eDYf}PN#HUHP+`X&uKbmu zh#Ti?gQB^qJpvw5H;2r8Sx*!%LIqh#$4Q73m0sYmKBc<3TU#^HTqAC6&`Y~hm=oPA zy|b3hH=K$+Vtlxa6A{ZDpvdcUkA7kSA3N26JNJ~kiXt&FEOY=V5Ns2Pp*Z^TL6HH$ zUr0|?`J7==ZC6b6pv!S!wS%O>i;ssvhT`A$ud-?3l z_u=|$5|4j+7r1@oQG?(w%|X;ae`7%RgeZdU1cYxVXL)h;!h~z}aXM11bXVGeu1H zwhI!f%uK1~+O2#}vERgqucXOJ&*>fB`34^C_Z(^|>dSIIFc^PaWV&>2Id=40w67#b z63X}3;8JXFWY?7Jk1cGe2<%j!HLT;P+VRUlr8Ro5zR8~PN|2d0h9w!k_(2Im+>{%aokChb&2 zMFv#En{9#wtx80gUN!f+Y(4mWKVe&B)VL;Ih)aM+wBkA?Kw=hH{C_B3s_Ul02(-XY z$N0sb+Grq^h_O{N#(TV@qaOG*i?<0L=TNKgy+!9v-#v{HLUCc&lR7M6l2)vj=97Qm z%L$w!&k)~{QFjYw&1M=M20{q3lDfiAyKD9*S-6Y)M=BWqf8>$vuZ6ZgX<^(g8x=YS zSlIn=yLulJFHjkKD-)E_dw{oRqREyEe($;_@2FOZ$Lr}K15}t@zNiC||2AH6z{$or z(9P*H=YQr(c-UDp#J!2ZEY(Tst=Fbc6j5l^%&iqA#>bOyul4nZW>W{!f%^{Wb}?<5 z>Sc&J@)sO)iW_C*PImA%^sZI2X1rO#jda-$70kxv^}Vh90Ga?)L##gMpK_6z$(E$y zQDo^OKiq9_XR=p^-IU{6BbQzzRti`}zAbGnk#21yv^Ve=$!dFU7rrp_?k`j z8kd+PMtk{wJ+$VpUkeO!5;2_AmJv>oLj~8`ek9<)Mgc^53fIHWx#@ zcB4VPB-m6E#hv21tK^$_Bx2)a7XGMW0d!rX+m!{76+_t0m+{w8B0+nfy`Ju-%S2eI zv|BNIL-EpiydDGrJg*=qGF`q5edO0xGRH@2gbjdJeviWyf=n(ZdBVj>Z*m?#hwwnUW-E~dWc29>Ihmqu$0pu(n$4T&WH6PQTuO?2%JNKDSX)p|aw_0zmi30=~~K&SU_hW`a@4#fwSZk@bZXG)5j9H=&J%0for=!Z1u) zQ60$!k$C?0=3cv>rh#hEapW8I*iU}V?D@&4-@L8P)PGyT?2R*{dH=Bp4Yzh_?lGu?-O^I3iri=VB4c1VcWRIlPtwtI$Ug5{Go)Wh z9er@Pn$5&d2w1z=yIR`JJlwcp7+@+|;$&Vk5{b&LbP9 zWHG2rP4@Ks<#U7TvhhwH*=J;qL6MXuB*28TxjtiJ#|<71Q_qk{NYnJFCNRJinno>u zm;M@#7HdYeSCBc0-|$G`P1Kr2yH8@Y>%FQLXB%9b+ly-8K-|SeD#DNNeR4#NSEuBA z8Yo2D0%T3sSW7f?CCM@%Bbk_AzS8LbfedzXZIB1hU@j$4ljV2zr*F(w$0mbmWGH*j zm?ARsm$_=+3rW3)g}_WlU#+IAd72Ywtq+TVu>&Ez__?G+Nu&F%T_`f|RO3CH}eLBi~g zPnf}Z*g`lg7V;i{aKg9+5{dahMSxsGhU@gbdVi!g`Ne6A_uA6hmfhYcUcJ~`aMIci zA^!GP&%LaiNI15-gY#DwY6Y8t^dx_kscHO5GZeWnS9nBoh~NO^SkUMDs2NVWUl!rY zCb{j@BjKvXL(f1>QQTO?LMNJqXZwgQa|8s$Mu-oWad6}C7NRZZQ@#3yBAacToyMHV z>@4A?(70b)ZegwC4?|)rF+{pwt$QCH#`c9~11`$(R=JY9-&<~bzc&7)!>Qk7cGH`) zrn*WfHwLY-$%r`9D5gK39+!}9d=~^jJ@=_6@Iy~s8swX!ld`=-kp-~iGaY1N@e9LY zJXQbrTphSiX@7vWg{zc+@X9nQ-!MJ;STHX_r4n(;&LV@tXLxR=cu;*n7P~*VOEDX_KJCwyY{Q3VxVyCqf2*$vB)@KSNF- z-FvvaJ#_3lIx)j!1#68xDqWG}g!r=(^`lcxB!Y_1W)Eu7wh(pOq##1hJu@&BRKbFn{bBq zhsfRS42vcex$_KL4}vl6$SA{RKbUXwO@yCIcu=TlyxmRvLj<+^7;{GD&EO}~{2!i_F zWPwCH%jNDx(2s8aLfaTA*0Te7em6>X=v0ZT!3^h~j~SnByp14KlNKZBCLG%{Plx2T z$%f6doi9o}T=<+^%dDUg^}&5{yViosYUnv)?=Te6PFwbnX_i`Kk1PZl>z@bUvX-`}ygy~}D$18r`!Ew)pLxv&tTE?8=H zQ*nSd2=N{$bHuMtnBK93l*f5}duOcGGlB5ps$B*Qe0$^iM_t{eNn-I+e+E`!aw%AVwJ4!rJe`@nh#jDAPCqWjjoMv4gR^y2=lZ`(z~)5uQV;F3)5COuv^XoE5Gz^`%D?5X z^CSC}e5HRmHU6r@by!$qD$H8&Iyccc77>L7E#YthVLJQub zTC}}Cu%#J3_f#pq9?RT###!r_#UW&;oj;~62}7791cZwbUt6Tu1(%Ye&ThR}W=Zhb z7`>?b8kIX3Kl-q``J}ALSg%m+9ac!y-$2nk8Vx;DG2<8Wn-4uv0rl;@xgS3#+FN3W z2dECIk1N3#%!b{kX`5S#{@`vI&OSd0r}{al3czO>i;eP^%`t7L2d~3CRxc5P%mmQ5 zP`@x7Pm@4lb&qXtPZn=4OM~K>AE9d&~F;+k_sVK%YqhpvW95r zWl{==hk1({JBV)Dy!~lCcuJhmD4yXg)jo^XmobumSnICYk~!7N8MPio7m9YZb<3dj zjo3l?v5c)>mZoBc1u?XkF$rY*ur&ms*;UGT#AK7wwM+ zKxSU}u4t4SB3CoZqiZ(}1t*0FKPt<}U*``g2LOJu;zM^NT8Fb+mCjs@+|ddjrLyZx zr|c%z&abwADVR-Xw?C*sAyQJS(2y)(W-!>Za9^Dh-BKl%n8Xsl#AT=Nf%(1@HAv&$ zD60Y_m5_Hgwij0%y!PbWHnxf`EJ?*P{W8*<;z4*IAjyr`^uGkho)VV-nOx)~s>UUZ zi|+pSVC*OOe*N!Nx#+kTPeC{2pw9_Hi7v!!lmV~DK+D{ihxJPDF7AhcA{%37P%; zfDRsUPjLMQQ~FaC$T`H3P7!n6Eq6%QzHRX^BY*CE6?^e@&v?2YFJw>1vk{`&UW_ri zaoP&l4qA5G{asGIjov)8*?q1hkvJzhv)io{^%kga3g(wRM4uob+Y=VeU?f4?)Ffok z>n|wCOSiR(b1#KqXPdUW+OOHi3Ra3j>kkc6w#elYGP-tFxfd(9v;#DgFtHw1J4(2e z?NM#>ECQ*<{fO|v-`|!?u~yWZ>jJPmBuZ6O>*$P{14a1-x|aSH$G@jacOswP;-*n& zDuD}HcXWQLgml%UrnW}MQrRG4rv+(o_ueaF$4FF+(s+E3-vod;*An?W@Q;AGC%gVH z0c*?BM)GWDUYHMb?j)eq_FMw*K>@PmrSa876eUq+7|NNyLruN)oDh zxK5zleA1X6TX+8B|AajS3a>7`jF=axd`xD@Z3S26+m!j)L*}=RJmcXlGlW=QIm+21 z0RX-!;&nhT@wTGFrCiyLJ6Q4>6Dr1(#^ff5h&xxi@tQgXG6TXP>9%{ zI5?Ox-mdrVSX_@srq|{IN?1K;;h+Shzx(LZ6M+@~aC;(vMx9ht3=hA(cN_4+<(%bq z#fXUoh_7vSI)-6rR$wzHoIUPOkfd=~zO`I1f|em=k9@cV2}~IeD`weK5S~>)ZEO6> z+`1s&`9J}q(&D8obJ6bkB@`E^jxGk_GkCaOPX~|UtIK$wy-m#O%yHISq_JH#^gk+E z9xb%qxVCpY7vBAlNYSMH2-6yy5@lo`XA;^Bk{^nh8)~&knF@a42-;iM*aNFXz=2o@ zSInK9;f!%%Y4yC1pv#)?b7ku*O+TuLuA3!1bVElG%1@{UmN~dCpMx*Y>*U$70jjw_ zC-y-Od9;FvsJ4L)tDIk4jXDV;Bm{0}A(vaMG-6OgpbIBFMo+Qguh19x&|$Ndo)>!%TZp+tJl%x zsdQZ!B30HDsdq|tY=JgrGzPM(0($Eh;V6Y2TjO%bROY}!BeSv_Fo*n-X0GtElno3Z zM_yBN%P5LiKnFhYllJZ&pv`x1cUn-`$`;qtW|2uZIDhsb{6t0iB)6^XBjtvawNw?E zkD@tu7@#GxNBH-R&viHYn|AeP>ktzNSYaTA^-ZT6+tZ3u=xe4>%h@n5Zu6ZJ071oK3!UP$59tYUG zVIem8Lk(8Y1Hv@isEGesi^NN0#LdNS!K%f5Q$GKYi39E*F}oZwAP_Z~6j~uf`~uKV zp@fj3R=-cr$3}vf+RB%;>?!*AvHZO;Nx-h(Kk$n_o&W--x3=X!>+7QhfRuU|-9Ey9 z9Gg#qI7Eq`Xrhvdt3Vnt?&*EL4}+Ih3k?-!$AHkB08eZ$1rrl3IXO`;n)pOuOjd^nB>*eya$2hSlNi-;`bd zL;;U|0ZmhP%r|x5P{$d-CMN;mXM}&;>Cat%{{j@FXpaCUoWU=a;^uOl<|6zL#knD~D zK@&8-^*sYHK_FD2tV8+N5497(U7>dYe)WHhvi^Ux;eWpb{_n`)96`b$0mafZcDR|b ztZ@0>XaaHPd!Ct9?{mK-EiM_2DxJLBZ@m9=QEJjil;lFCV!;Dk6sVnA8|TvsW0{i6 z%9HKO2c>^Xg1#DqXgW*97ujB3X^yStPEYHF6yI0F{Xj!=M1!mO0g3j5v$_}ln0ZcB z|3nq8`iE1;E#8ebeew`@@??1HCD&uQ&1fpqWjcE>)1`NJ8cYb7-bfyaB?^QxKOYn# zH5RmK5F#Q3KVcY>s%jqmMWHAbnVaX!FMWsQb~5oRB@Rlc0H5DG@Iga^6A}LY=S~|i z2D{hJ-{IjWL`FdbCq+ic`pi9uGLT43PPMS`(|-1tVvHY5kPgDpZkzv=afhUC;`Qkg zLEFnEn$&hnXy3ExqRN4uZX!DU>U!-K8VLG1zS z4Gb!!CiL~uOs~%ufm~fs!4N-RI^VHNsO(}6Z4^i|;I>M~LhTvbB2q`i|9RZ!lDJE}39r9ao5o$SLEl$;RO_ zx~XmXlAMGPVnBu^dlHWb5ec}(Q0P+mBE&l$s5EBF2te~IhcOTdRtk&VgF>$-0;cf= zlHa~rlLU%iO1E9#a$6>qYI@FG%VlptVcso5pyDa;Q`;AXim7e~k1H$dVIDig$ChjU z8`Ph-2e}}Wy4xfn?G#-cO^@L{rmK?qXjt~r9 z7&_b~2vDy;_q7uZJbN8(z_6#8D8LH1+6iJ! z04x-R7s+$}N~nRq;qLZGMUxlgzf#t>F%|6Wd$vs}hgZ)T@$-r3!@9^U%7)gY!JvQG z2hDSd2EV(z7uw3Km2mE|zAb>5I8=VxFj~tefK8|jtxBlA8Ge~zYqAY$$8we6pn%IW zkg4<>`wI(D!n8GWNzT^njwKD!Fsw~Y%yi2`^+X&w)`65ESYdIEntgV_P#Y8~Yu8Im z%XSO*^Yd$!^bfNPh^~FO{2XG zAlENE@3o2uzO+KEU4U^lx#Gi#2p$(2x{Os3$myuQiHSN{A`*@OjDX!oqfOeEnP5@o z=gQGG`)gs6Iv>Zr$?8p-aJfFiPQ2do=1U}CvMUt$+GA-X45ewsFFSUSQ!p9QWQ3v4 zq4Ke0@WP=p2+tOWn>AmW&RTl#vsNXl+TWl?-8e8&`?TI)Atfr)z}POP zW4sK>cr3GfU_$@=?8}|?llliJ(*YSFpE>G8>}&oUJ4fGFq3#`&r5f{IOpp5~xoZXU zHlz3534C(-ekg;phaqfrU%a1jU3Dh=Ui)vsU7NbpJCq*<7*(&eK9b0sm-^CSt+ZEr zSq{E)!PCk$qrUiD91!qpQkQ>EhxSmUQtzgC#_DqeJysCLi}%)4|Ls{D!PD9a?)ILbNtRTfxd&)H&klk0kQCTGCU1_D48diG>M=UpJ{R<|3>gYOt}=A#Ctj9cd`)bkA{ zHr3{jA?SQ|=oRmm7PVqX4c)jr?J(Z87N%)E1{pl@1JTe3cg2?aR!%*J?mX*O8?2WR zt_A}9CnZGlyc^UuTZmN6Y#{E zZ**d;%vwdEkq4Zy7?-v+X#pc86QsB;;BB}LWS>6#a4SY=SfTDG6fS48v0#R3q{Ayf zsNFDw0;EyI2}(vO%;qpBOqrZ+d=`<2eLf#?BaC@~HWmqZMB}I+k8y5)PFUL8nkaOB zl<5uPmaEg#ccI6PNMW(v7B$C_=>`b&+&fEhZo*$V59{tnaBMV z_~We9my6G8>*Hph8ju>p`y1c7mge?{l=RIuRKn>Y^{>FQ@PZH=+d%$DhYw>{ zu`dxk@&zg6h|1uCcd)($LhFL*QAXC!H(MeG_`5+aq;Uzq;ywUBhTVze(I(v>@06oy zh5pJ{5BFtjnY`ZMpw%}ldUvZQsNmb~D6jV*3@oUa(NR3PI?=D?*Xq$GS3Jin zOK1q9PbM>kD`UKTlilC^z^q$$X*Wc3dk_t6`i{DmP#Fi(S$;K}RLn&X0ltZ9m&rm? z+V<1fy|*CqIwW3b1Z$lhH<>w`5}mSVA}ms?qSrhPHt+3p=lythm1`wZu~__(M_R>` z4i7t4ZEnwica5VO)6rB?kG@qpTN6s(#Z13%i)>|mr-(3i*knpr~JN)V&hJF5&{(WBk#x{p>>0WqmoQEstA)nAY(eE?Z*oD-9g7V8tz<(z9bFGeF8 ztF?^Ty{L^%T2y&(L31l}yg6)yiZ(DjX9agOE~`+}_I>f;dE4>qA%hG;|FLcjqY|CV zwD!;=+@9J{e|r%Y`KGFL7Y|UF7k$o1XCkUv=Uews=UI<}^D<938q8CuZgxwy8=w#K zq}lO9Lx+GNL#W!7B8HSgwFiSuTHjDw6hto$kvmZgA7jZCYkCgbRpod!l)d8IbstTy zCfYn$x&^=xTA-aHc$yrEKhwn{a$511r_6s*YXZ!jQAHYt`)uvBcDe|n*kKpG3a^)}TxK^g`Iel&TQ=CZNL8yVPjCVSn~XI2teb7PLkU=v^1R4X&V4uY-Q_ zcwRpOMJrM&917@0Vl%w&K&KAM{}s21r}f?Nh{e(J1e-aAQAs?b!v?AC@y4HCYsm0w z04W5A9^UQh_`~YiRSFjj7NZg0B&pch!w62fY7Ol7UBRdiOT}E)#QJNrXnb}B;*kO! z*9uyi_BW(0t`+?17jN(LK)Pf>%U8F7OG(#k_OEn|WKz=FxQ?DqW1i*h2@OF8 zRE5((gluF`sb+&IS7`>7&X{kmK3juKwnjGJULSSUiy$P>8JE$qdJvqCJ;LAV-krs| z2!L25qWbgCJhZep@{~ug*S#O_aC=g0w+>b?30r{r$lICdw_!uY;IU!{2^M2vA=oBJ;JmgPiUs!ATJt6S!$X;j&w zP3ZUJGOOzh;>amj7V{DzK%#Ry5LE-e&~Nv^G??ncTS)e>Y;qk#gU!iyG7)DV>KChi z7#F7rH#d%Ieh*Q_2V&~N8( zze@khe#-3=;q`ovln=Z>TebO)s^Z5nTRzmUnl=v`&l#k^m6OIg#?R1LVt6W>;S6KW|BJPXbJe75*-^hT(NnY!RrT$0^U9YQHOMT7!>Dzyv*U>K2(^LsrGftI zJigI{(K;-tcv8~triLb`vn-ZP?N@vZZIL+(P6#YJ)ZQZuFPF>7=vI9BH?Y3fX}N+u zG6@hc$VIYQNVuz^OT9wo!*x;VIMMXm>=pINKP{^rs{DGBXzmA#2XJ4XP|jF`_uhq* z9vL@puD#l=9o!X+sDqunt>}8niM+CJ>$ahPxHUA~9v~AK)f11AYp#f`I&kcG#F04xaps`BYjg5h{n0Z9x%*0V*=`!xF>9aW&#DhyQiaU1E`HQKp6KB#36 z>Gwv3YfnY#UOs^v#G()$pS@#;gS5ErB+Ag_hJQ=#qw3IsXj7Blj%^u4#Gz(bjW&$) zV8Wy^yv*r&(`CY~+w4X3^BT3*63qR9B5hqhj7L@?NAC7ORd|&F!TJ?zpQS@;fj|)K ztMdZB0=(|ePvqFqM;|Nva|iQ&;j}R0mX={|mxxwl?w>{(4yjNe`LS|0ST2OHTCeH> z0Ik7S6ub)c21UIgUqNRSEcf_912hg*!AuQZK98dhT+aC4yPS;nG^9JWddApPOOrQ|0zNo>P zJ4SYC)Xc~5*vco|Vn+8@X?GD>d);Zi!s(dAI+fn?-F0}PP(aP&XOYaagj{-?G}OH_g`)Ce0P7b%S`QK@_aJQG3tFgSD_YYEb~o| zClnv+7qsu5+qZVB`8H!~MDQM$j2376FG`PtHswMa0r}9rqI}uBSll&@ZB|TNrlk=! zSdDo0Z)cdWa(~&h^{tdGc#*o+sdRe58eZM(C~T9IdA-Px`&^xKMfs;29SA{cf3IQ4 zN;akkRNR@Mb7E$zX1ug{Sq^z1$(`u>MkM-`1bxi+5K<(^R|6kB&2H^3ve$wD2>gwi zMxSQyL@S8DzRj|;!D zIpDX^#(?F{sG#%BKfX?amS(uK9#=(Hq_+}%VR0Z2#eWc)n@YL(&MuSq*JZwm!LA6F zW81kW^~+GmDIJ>KFTR0!d0NrP{8pjsicG{q0iHvQb;VGIhO$_u9~xKqg$maGIcxS1 zNb(m}FSS*>D8i8yZ__EiaV+M(H1Pzzo_%C9b#*rzqPa~gB>5ow<1*HHa;OL)me7=n zaUG|apNrrlq!|43wCR;Hns{Vjz6ol5u3(~aNb)CBLh$XAGUFZ_n3wyDH-=_Tq>%79 z!}zM4A-bKGtoTg&Y<>MBk?(ZM>XW}7XbZIl{2KS1)V4^GIvQYdSNg8k6BenBTDutC z$^&>82|PcR1~3|R2exrr9689jgST`M!$z-I+^U;>E1KG;MMXAmOaq0+7YQ`0XWCqL zAtCWe@=W~4cSry&MA}tK0S)sVBsI923=Pg4$AHNEEh--n9|o4vzSTYLY&j$eZbMDG zO%0~xrrPiI{hWG{`#fHs!c-l#n8HdEg}TNl)weuYph=!K9Nzgg+n)s>)BiwtU)^fD*aNeosVQ4(;d=cY zfZ3EY-I~0%cD?7uf(R@JMdPlD*&c}-#&Xd3uxZmO0-`KOSI!^0-+fkN#GuZ>~%u*pA>SsCMUMdJJ%tIA+2|GiODEkk|u9%Xk+ey$*e9T{LU^0~YO* zX_sn3eMK<>HLKGV#l@%4(5$wHG&H_iqhEeAWl4D*kA%l7#%>CqsiN|(7FuBH_8Ub# zLGB~_zQ6T4$If>>cNMaHlO8l7TJSNe=GX{=%KE=9;yM?NoLe4#?nYF#Snt)|!7;v_ zu?D1lXnd+&Y}`O$d^Y^*yyR+gX1wl>T$gPU__yFe-kS4EnXEC6J6k{I4!_}1w%QS2 zWQRy)y^9`*H{{%*n!t)qENVpy9Gp{t=(Atzprrcp22I-KWju(gD(EZ2={o{_a8jd; zCRN@%<7&$ReqnR?ilEXDZt#{CG{D4vMsX4}yZvQD1VC^Dj-(A_2aa^AQn|mPkhixV z9IM4vDMk{CjW3u)cdO81&Qc5*j7m>n9Xh9m)Zm4uW$d2>yT%d5)Kz(QK+2O+>B2*H?D z;w0Md!jt;c>C{7M&}G5dooXj*pEcVu0}HdK9teY2wbx^pYzyXKjARmY5Ch&Yd65FT zSa7&XCnpTCEN+(=u=91FoLgOLa#dSgh1bbT<(oMtk(4JeM_dxv7JKy2}_vDXwXFuH@}1_M|&@HFy>e%4D2i_VhdQy$Yl}!#`BW&IyUV_tCi$O)l)sXx96t!NIXigXEXVvAlWfyb~a7{g4^ZX3org{$^{mm&@vp}HqC znNKxX4-)$OH;AM37dulT*#5t$7X2$-V%bpQxg3r&A9Rr!CKCM&k8-iGsG{uQp-)sA z3Yk;^J9V~ZSgBs~Lpe)03edRXfqiFGSEMc5iTCSsa68Io@dwv$AEuPx$974ZxC_tp z=}nHql+7eV7YW9(zoT5dsB;gbJUw0$C|cnnKKu&0@U@FdD~bjcldfk-d@s(7UtRKF zDj@SYV;|nXYM%l38}{Vjis4+IR0RZh#3kV`~kG z42}?3D3?ANEgA%G1fL)rVTQgxYujAxyv@;A-a~YX{EYfku(X<|q!`Z`H!%9LP3K1- z(vm``(7h->Bp(Mm=NK#)?xE3U2zPwkj! z8B15DrCf-SN+x{jnL54?-*b7U>hzNlAAkuE21|85Mtp0r6cQm8U-C%>x36?0OsH7O zPx}aY4Sh6KEWt$vlqVnGpAAnY@l67s=v0GM_vO4BQ?^$wuyZnz|6nry-GEq=^%7Y0 zL*zuh35?^w^8MD0e6jH0D?^!_{dCdDQ}H3V-9wKptO)blbe1!PFCBn7f3q4Voqqrwpz4r`s+3O`RGmD5?T zs|QR*laimX7AXXeKDM@tUNp!qgQ?2~lB?-DZIo@~lXbQ&@|6#wDwEPaF#F8tT=hxP5#0;>G)$~saogv-Kotv7Rt z4gPbobRprWM&_-9Uvj8lqOJV6IU?S~bfIB)`PvED7=XVx8zPH3#q5E@QK#A^^UoMP zUqL`u(Gn~-`RH?E$g38P70-N)fJNzpfOaRV4xY%3m71Yl@GqV!roGGTiq~RmAsa}s zVXIa|MNhxXY0Zn#C;R13!~g>a%+HOyLa9bJCcfvkKPN#Gau?po^2E=u)iU!Hv#=T^ z;qKW>0*k|K5nLV0Og~g?BO{oaZM@=>whtI8R1Dj4$X~O#V=~-a^gNQ|#$7+z&QnK0 z{Cpep1iGl_)F%$bYv~fsTNp5j6VR=JzIizr;%gQa0-MN-^A3OnN8;-O&s8LX@^XSe zqV=&UABpOo(-;0`_F!PhfiVa}S8(q8f_NA<1JfzjrAijT#4iO4(@Ur7vBY=QrvBC2`4b5~PxTz+zET#~pcT4Gm+K8~ zyGY#P(QmRpi0q1_{i&FW2;p53ZJ^7m49HS^?Ls8Wm!MlR@F`J9`9dSqrfsF;@R#qC z@wxd7$9`4kAmZ;(S`YLFdvE<5!jJ<(>nO|gns7T*$?KHLLOB;$!VI>DfuE2G^ak%| z%e9Q{((pN|5vI7fH+JebM5OeaK{CQVLiJeNQeWBj^+|oTh73)d+PQMdZy3+*3J-)keNSOoYm$xt()yP`U;5^Ezb0X0{r74P?n^UHK%&XV_kDBB9op2bhh#)wR2|dw3$$>a*%EKv`vLnwYZS zZHfd2+WE3x4T)`-4#abd*w_M9&pFm&HS4IiX=zm<6yhqP@kXZr*_YRH!Qd81u?0s1#g;V}0UJ)0q+dhe_JmCj8dPBjZ3pZ_1f=P4Clm=Le4=eHY|;6!9lyOr zcYEI*Yl}&VF7H%;*&|u1)6Nx7-YOliqBTDn2)!+X6yQ{Wv$@spi|`-N*GZ z-^%dvEj@R)5%8q2{}HBa5?~n~L|7<=%Qi`H-3H_tr`r<`pBns?f4)vwid!@&dOrge zr)O6i6@(*<@V{p_2p!Xb`E6}*MJk(>bzH)M5?!oF0@unX zS8dfkZbq#m218^rz7bI|Z}Lq*@!VvhyyPME4I-VnGTl4t_jXO;{q60=O5I3g5(&@= zP%EF_h5Xi-orqSqoB>Yj@828QU!}9*9q`d~*=5i^?}udpA3p9JC6SvqtiR*MDV`un z4c^oC#FX;7WKSS!0foE8ihKyxUcxP)n+d)im;RKRN9VjwL__T-vfRTlfI_ zjhm+{?#1%WjJTyL0ta>tu)gdF2og~USf9b7;AdtYPZuL`M1?~SzKy$srVp4(Up{CX z$cf*_1i=%)@bbPEUxSHRlLT~Tq%u)h7{E$q9r^+a7aQ~EYa2&LMRD2vIjRp?OvW34 zwWQ6#GR#;OuRwGbYVF70t7cCcLF|0|o8ZWif{Ri(t%xLUpNF%UWOh~tQ-~lvJm5Fa zb>d-Mkd9Y7Os?>szYD=pN9^JSAP7acp(8?CQ#@p(J~RHj)d`8yY3s>%7qVKsWb zT8Ar{<;E#g5t2}4VzkY=MMh)PoBIi*bDL(`s?8`>sCj#;mX`x`T~p@5{CA_cK_R)e zUOuiCXSHu|B<0uU^}NpKW~iIye(E?iUoqXYxjbDoI!r5Z2u3@8ruXCCgtHb&C|i~w zTaOh&tyr-2>mk6szpczH6r8fBFi>DdZM2R`ea20Q$(um{824!|26*3s85IQxXr1m~ zD^<_7V0-YEgb2P3RFVsltRnTROmwYL206yv$J(FYwad0gg;6NiFkm5ZP|Kv~C8kr# zzykol+0_Id0L6<&me4^ZQIqYqyYB>uuZ~^=%g6FN@dn@ldn#lX{PXo5b%Ql=u@|Z~ z+R=_vEeEXUAC{&%4XGl-)MV+um47*tnyOxQ+Sq20jC- zM~X2uW~;pJJ`jz_9Q&* zKxRI70u$u;E(_Ane_;VuTeG`-y`P`J(M&X-DN7!b-awW=*OQ%uL;XfLp!`XtP$78J ze$SPcI{=re*dasjYXG^6%d8QB`jKRZtJJM`Ana|DdQNaM>?;1Y*@LRNw!JVK6WzG< zvtwR#YTDrQ?eL4z;g%TMqUsTl7)7?yd)xAo3gULTsld;dmViS1e#=xmAy2n^xFxs+ ze-#_|Q30Rq=59i7>ugtTuxmgQ=5+OV^+}?Ep9*I2;Mu%5tNXzW0xISJ2m)(F!8V>g zy*b!QPHl5NExX9WooCYmY2z%OM@7ups)iH!zsoh5Ag&HYgB$zSA&Z0G`m>)5T&?)_ zXbSEoky_3|9p`SUaP53eMt6Mt>tWM*P##beX^Sox$wFYY0AE8f>ZwR&J)mDO83u;X zJ)r2YQCzBA73zKqI!MRobh3EA4+=7yDIMRnbl~!Qc)vHQ!v|^y7k>K{jgJih!u{t= zm4*sThl~l6%c6sf#S%UuZ-zbg2h8;#tSqL)y$n<$L}iE!MUSh2je%GaP8fpr&&ew` z=VKD$+n7vxY_MolA<+rmebG@BYfV^i7_{);!MZG^<476aw*1J`Y-SuZKY4lXm?-*& zQ@PeuaMP%z| zFH?Q{u1d;5$h@tO9a2KcTmWZFN{OxuV1i zMMA`h0~wG?Kt271M>!C`PPS8drp<`zT$LpsT>pTC4|p;BG5KYI&r^&P4ExO~z_@~0 zkRgDvuzgm#(~N5A)W)Yl=O+1LveqKjWcw1skvZ3>l-^9a#f?9Pkihp6_zGEHBYpnq zXDnIi_%%)K*%+=<+8dJ5pI!C^4%befRnm(0-?!d&^8W%1t)v>rh(gg@wWVb&H)UtJ z8Y?rGqE93sE*j@$Yu(&orILOWbK^D2-Rk}Hk0ful$-+Pv+?;APVA#Dl;1-wM$e>G# zNS#eFiwrJshg(iszoBZ8Sryq_ndH0Yb*N^$Vh+crv8py6iLJ1=H5;?z9)c2+j{{@& z;}Z2!a;JWrmF`QN`f=SKUogV2m&^%B!}-x)4R?6Gq+DE-PrBQu;-cOcAXdltKog?- z#Z3k9DSiY((U{_4l?S>%QL-;EH05&dTov*o9fA=tWfBN&_VXg?QrMVQzmO?prLu2V6bp z&7?h%E(35L8euYW*gr@(J~m`gEP5WUQbm!Z9#en#Cr~KoeDd24vn@R+H<452kKO_Bu`H%bjT?4CP0eh8O z@a41fcVho$0weQ?Es_7pdH;G$C+_b?^!ksD_!lhjZ_WMZ?Fj$o#BdNzqY$fw0c=Kf zt5`Jsk5B&9g?$nMjz}c{J~jcKyC6zz2Joc+fj#{DFG)lKl177X1=C2N%4311oMoe$ z{P@@F{Tr|Nw_}EZBLsJYfrp<4G}nY6Dfz#+_&+aE*AUpNrWQPQ7aH80ln^3>IV!A9 z?4R_nzg?yM@5gZe$7Aq4L+5Maq5M~O`)}Q=8nMakz;9tl2n+^Jt63RZ5D8*~)<+P@ zVp8fqy%jG);Bj~ndNkJ~hR^_C8cIV#c7pn!JwU!cniuZ>FU|YE+{*XuQgZIoWJLpyZwxOXHD7Tk{^1}d5yel+!hUD*?5fMc(Xt_&NsNwxWCW9U{j6PdYr%T^%SmoGw zzLU%~Z)Q~a%Yf4v{WC82CZp@2L8*bb7!?1>kCFe+W{AB||A?)~t=#WB^z1*@k;$H@ z(*8O!-06Tx=}tFgOF)G9=lqa^A*GZ57NLW3!H;$Z{ND_Rgs0{L%NPHP(4EkvQHBQn z%b?^%1dcP1`)4@E0+TQ~Xa}4~rw-h9cPLoQ(eWacY1wR<0uBW%A8N#@H2j59UXUWy z>+KPej;BR9rty;ahFjxNxd|ijU@{xRts=BddScDZ&aZ*2c%`FEn*f*NjsqT#8&|Q3 z<~7U*JOq{2@9FkPuOpL4w(@?;kO(lGc5D%#IGsT6ccSfjo~Ns&gWALbcvz^E>*=&~ zPD`a7>RqUe+i7CWbveTU|5ShKt%(!l(xM~Z)g`Uyoy2qpr~8&Bom;Y2)9YN}srItvp|8OdidG_c7J_*Y6a z-Vz`t5AR|VA)0|bC)e@4s4!=>X&rZQjHh?a>EoL1()k_2C7Y$;=WpjYx#{0U`!39v zVN@4DY0bD?ACgd&sUYXO4fd`>;odDmMjn3KsPoL3)rB5+GQYD>MI!&9q0wk9yFPBA zTBEnNqIz&L1*cr`X6W!5Sqk@bJHO@paDepI_TDgS-&rKfZ*O}B(k!M}nlG7UDYD95 zH(BMOK2y95lELEzZ^?ATE!Eld}zOnUkdKBE=hm-7cOZ1X=5>cJCWKa@&Pp%jGW~ zUpXvP36Cd4c#@PRfO%1>gP05b=Zy@2Nd7pv-snzaEW#{qtygHPUB2iXB;@&8<2U(L#n7=Pz45 z^Xu~H5hZn{^;5xp8N=e(kW{N|2zQXtUB%CW$R8=3{ZpR%{|YTDk#(Y#J%uQm`5b-u z2xusGNsU)poJkkheVd(H1O{buMy(A7<&n?V+q$YwVXbY)8EW(st`bj7w%9THTlOIy zzuKpHf?p!Li~GH7?77h3B2}d%Y;t#c^7;eM*zEOIftd7qI(sK%8yk{Ge2wc7b^-d_<8k;#O{6ihcX`p|c)jphZMR?ne_B(Pu$hNN`P^+tgif@j2atvbu$jmeW2vn1x|7gZluUiW5yCdtq=z6zue|o@gyZ6Nyv5O+-?=F|G(qE)Vy@gJiSMw;F8^Ob} zOYB%5_&ojoJszsnmpp{eh*Xs1snGSn>iaIDpioWyWSClRP-0V zbjC_AXho6Hd>au~dlU?znw|P_>M85cey8LCn4G9z96ZT znHtC$W&j47RbHy%s>Z18m8u?_jNk9!Cl|nS2l- zzTUg7?)ypl29sWqz~Z=x5Zz`)G89*TIO*;BO=kX?yRp3dU4r0n{D4F;#03nPRelwS z53=C3;86_(JjB;uS$at5q8U`HH{Y&}8?SbdEFWGG?9$XS9e;KirQjoj8Z33TV*Vb+ z2~BD6=TCnj61w^ZLl}%g&Ud!*8!eRP*EjvlW}KB3$d37O?boxHM_A{3+K!-2;rI>k zsF%kpVox9NVpT4$;|P`tZT+<_!J~ZuaN4Rc2lX;07Ki?k!%|(#!%+8)0g5m!jU(G6 zx=ZD_4uA5%W1+c$8b1nZu2_)Sl<)p9$1!m!Hv zw+V32n6gx|VIwYaEvT&57vcL+^Yb=1mOK6$gZOLm{Eei>K4F3+ZYoE0beG3!&$gTL zjT^M($MW0(Fy;mEmYO~4aP3odola|V%rVpMDhxmpJsF3>$IA;Ih1d}z@6W41_U8@M zvqoB%+G9qGyNX}eXgr8-_eej%4bD(?%Dhh&caZ_7f6y=v)~j-t!XOaKqs0HX@}l)E z3&B#eXx$K5uU|3<4TVEx2L8X{%o{f;xe?Y`3tLCTnpFAScr<$S;QY^rK z6tsQuMUohqn8zKacg%o9(BLMgt$gO4!vAHqnQ?8l(?>#q7TRR`2b%wYXv*g=Yi%Cl z=wX5Mt|zQ5Uhi7Ex+U81WpcG9NDq%so%8DiMRNHwfgRXPdYGPHls<{ZlJ#;l84b@_ z9xW{~nGqTm$FWKiDY)LBLTWc93?D?3AhKxT-W)9Av}_*IyC5?djCkjY#%$cCumJEc zn$c)5F8Z;o%bGx6n>v;Ej#xZ)pyzQxQ{&!=sQtB?f9($3mGF9}*r(rz=dcZ5j&1hd zG!4X(Q(IV%GVS*)zLI&LJRiddoh*sz4cVcNCqbheGj`Dh$MTYUAF#rg9tEA%$0Myg zy05L|K+>nYxrvS|pCr+52#*hs?||yD7A&Orl=YYVEqT@6niI|viZfFIJCDyL)0A4) zv~uCm!*kBD;k&uhdl9f^nSdK9y7}1DWG_^f%+&FIcgYq+zuh<8Owa3FMGB4{3OTOT z!ppgVTh93sIh)SFgBJb-uV$RZJ*OzJ{0 z9F2j9q_CLk=;XI~8d)SfR}z0(s+TmcHC;u9-s!CC3qIo!5 zKsPqo?7m)(SEyKk|0m4_ZzGbK#s85+dyTW0E4DzY`;5zNmfodZ{VrjL4Ubxh=5=tF zN`bElc*=a)_j;aQ*Pz|*iwFppqzQdonpAO62padt(>SPg#dZTG`*_DCG zZOeGJ2K!YAI&wc-DoyQRxg@doJSd7A_17QTc1M`hR5q* zfN5YdUUMJ*oRpgPKk(a^w}1HUI=%ma-zNBfkl%Ki_-%&50?PjBwyQi|U-lQLowH@h zHOS-lC$K^z=j_M%8XPc-1e5joLm=Lv|Mq&N znKJz1Cyko-bAGPi-Yc|v0?31xk&9DBW(A^>d52SEJg+J%8j@Q1s+|fGaSM_=zph{u zAe3f(Re+tP@8*JB^>`j*_qPmfKNZKU4^*wiY6J_8$;b=BB|ehev)Z9 zf;RwH@bbx@V6Ekbq#{t^C!bDhJ_XVxN*=FI4`rM&c%ajkqs=7tx3cZMzHL|+DfQ|C zy+bXC&@ZZ2@v=x1Z;#{~R`BBp=%RDuw!Q7|yKU2#;wg0?OK@ubkNh}?`>uhTS~usz zLj%#`fSqF;;V-{*Sg(*Mq|i_L?`<|xd^*3}pLP?8$bh#Sk>J5cK0+8|;F%%ldSGN^Em{_wxKWv4w)#Z#wye z?;HscP&OQT|3|d;j8%l?#d-TpbQGxOU`!uC3zFT=ntb~-IY{MOrn5F7oU*95w+3jw zgpNUnZ(*U!3!*GPEKCbef+xz|{8WPpZ<6k3xQcLbejev-c(fdPBLstL9==Pm1%VA< zn{?J-F~vjGjqMns+JjrghM!gZbfrM50*H(H8DOe9h{3H~Etad1tkzn3fu($~>odDr zokdX(j3zvy)&l{T>!;;qppSY2HXV4 zX1DY^b9&w)!@FE}?>}ij@P*dOw?cNkpQi8gN3OR0WWVMtDu1B(MM(|6-V%X<+N}ckk%B?BM@A65 z<1IU$@Fp`BO%^0lJD#nCBjpH{s1`f4w5t;=Bv1!lq7)SN-t*qSiGgFW8I?A1*8&Ob z)|K*DgUME#Ya>#LC`921{NAYVAEMdpK1*CC1qeW+bhUc%EJQg?)ncU&J*Br^UhNIS zEr;BhZI528nu%(|q7ERScko2-%eOW;$WD%-JI0q#(c!F>8hv-2^U8uD-~pbJf{_98 z&-sH#|6N&eSqih|_f8*(jg>5}Ci~L}pfe2r+Id1NrYgu~67z?^NN~T8t%7<5ay0U@Q?%G zl>j#e;KAQJ$Qkx!SnlO4p;HKoo;Hp>QwQA%%rGT}`@PlLTQ?W6FKq~|d$lT}`v{MgwyHt)Vy9ZhC@;aOiko-A*6zKb56LFh??Odz0M0@7*aIxx1%DUuss&lOq^;PsfDUM1dw60zSD#1Kw7d zFqiI0pP1Ng0iX20n*g1<+psO1|8Gi+3Lp8Txy zh5ESSxJ~~JUu7EzhQ1ZEOY&9r6~tOy1_#`xbj&094m-a<_(L$O^kSV|{IX?N1hRKb z3%#`CW%?`{D;okW(`e1;c$HNIHmg!jwZu=2?Xg?^`SebeuDNWk>?xE>P=08!5`zT| zlB;=Q$pINHzqq7SI`C}5pXWs0m4dvn_%(5PAH8(Q2#GX*D|T ztYR9xD8~V3q z%`Uvxf^7umxgbA@!b?aH8yb?s-Ld!_3#$3jZ*k>|y`I{lSRL)z@6e_lp7Z%|IXvkcJ zI=@x{B)x|augZe<)VmKCM~kel9~yHAROEhF90+pyxc{Xa8F5A^Qg?t{Qiq1gOk>g8 zuh1p0*)QiFp`M{L_igiG_|Erxzprqu){MD#u}q4_$udhuom=}JzXFn|>Agk{%Lps^ z0<3@zy$^JERO_tG6`t3rRX@4Q_LHTtvdUHD7u^4MW)T!F%l% zo&8GF2hf2ufWZ?A#<4N@PAkJ~0F6QI-h^4L+vG(QW}B_!l(BTQN3mI`81S_4J688uAKh>tiP95PvTV=9V9e#J!a>n_&m;_J z1_SRZeNdOM7lgXy$oz@fc$-}-BcfmbU;##GcW4x%{k|d8*$}KGVJexe=T;28{&p2J z-WBa(lQX(0_emTFo6}Vzs#HlmWVc}n{;o-hG5UR!ei~ceZo5+`Ld^{ppmjf;kM7%y z{bFOJv-fXhQM=U!vl^njzL*mv8&WK|aQNfnrbi+iIUxCHVblcSj$xyVkUABC7w3c_ z{4k)@!8~CD{nOAEW|)p2s5eH*_{0taWl-WjFQH(DX48=B%C^R7(tP~T@qv27K0m2Q z(VLZ+kGWW)K)T9*od%Q!e+Bj9(K&L&4XvB@>OK|kpRo?i#XEWX6-X0~9%+%UQS`fq zoMnE@0F5EBG*Lx{9-Y^DJL8LYV`^@cQfk!rlxGSuQI{M+GjSpzbvT28W{tCgouMkK z2K3moUs($4AeMTN^`^kVi!Mi;g=DtVjLv!OJwf;59k`H)_2i-djCZ=PfjL+7I|3Dx*WtL6w2X=}l3r zcpgQrYp&W{^l2XmZ&rj2e+^tJO#S9W2%7s^OtxTqsS#y&-*n?M9$o^-2JH6TWX7V( zywdvzwLU~qs@fv)zKLU6;(`r3ch?rTa($i>vU=kKO+nv_z@Sq?7000KDUi;%(eFdg z!)+@jB&*+F4-^6c5GZkGS95lDnZ}~;6i?>fc_iw-8QeA+83-M5kU^V574)#rL-7;o zYnQ(Up5B@KdBueBT`W0RsS&Wn!J|~ur!TK&OL+B|te6q7SV8JG6qsQuQc^1YV_#)@Ltc{lp1Z^X0>nw9)pH@4Gce9=wtH6M1nWnNG$hW zs00|@uqrpPt=i~t=7qfQ0#TdncH@TPi>ULTI{U*Q5algR*4#iNV)p%MCF-jFXyE{M z36>XEw-Z?9UWm21J#y)jO0%&KLNJ2A(GT+XuN5JDMnch~RH>&ej?UU*-S?jGG&E=T z6-;*yjxCu`XvxQ)t@plymyG9zJfT>@3=Ds}U-vrTAc|Oux?lW?XYq9*6}+Jz)$;@* zTys(^oKp7rgPOi0-zOT2jSR6A4jI=d-1H|yqF za76AvthBWTcHXGR3UC$xR2mHz&faNHT2g>>@v|jL;W+x4d@l-U0Q%;Y4l(|vN*c!s7 zq>6{$?k5IxNOAZ2J}`lk0b5 z4l<ytl8g8-itcNI5mj`Hv{^hm>((vLu+WYUImv?O(3ml|Wwe{R z`iz@eV4m#WLh&p0^n~k-%2yf@81`v{UHIFu4ll41uG1?6VG}q09t^gb-ARdl&S$4` z@F_cUzGdBZ4z7wTiWrx*B_s1ThHE&VR!{@!{wxhd49bx?XJnT)%gkq?K}! zZlL?HON<685GnSC1P_$&p&^6h{1G1(p#^F|x~iBt;I$*MJcc(jh-F>N_lMPbsas1h0NdoZ6{!r?t(PS?tDys^j zd+Ec{Wj0$BiNo?CW-SEds-`{5Ywb;y%DX3r6Sm!GB#dMHC4OJn{t8unsRi%EZnsl? ziI9fPl#z_kt87eE2SxqWts#_J%fmTRg9NhpntbL*&`QyC=FkXb5I;URF4!@(Dzs51 zE-}h6vkz^7u-H(i46#1CLuza;q|;lTFoMjY9fJjhpRmgij_u{oEX6JNcSNpsQG&8kTp zWYC^0S4FgPG4gzC{Ihf``5LsM`lEkfw;wj2-&o@5h< zocsJT{+ti3IXHeMfOU=e7-7{o8AKuDWIL6Y_NGy;hN2Lo-Q}|GB(QQ zd_34X34@70x$S4Ad|q|CpBx|MGQfK|w~z-L_*lVY|K9v_@0ac_u;Tjxqh!>s^OVWL z*qH}omy&!E=*2UU>mvSgJ6|VLl^6T zaJrPBq~>qc8^4*1dGQ{&TCySlT_&a1U_=B7b4957da6*D0(d|&1f1cOztnAl{d&O!aMMX*MIz5)_wGQ?R~b zN3XEwgHc~%%taX6-Cp`wv<#5j30xMVJvMH!xe^t&!JOGUhXI4vT@J)5Hir1}pJl;j z!s7hwiPO2F+C@))gk1Ge0-NK-CCMAO=#CJPdbYfR;cnRO1$`o^c zRB&K)f)?o>pqYPYHeRwzUDOlV}+MNOyb>d&89Gi>R#s`zJd~-65)gH}`Q8s*B8tq6rsffr3i1_FKQSLzR zqFu?mMQ=z9bl>y;z|BpeTu);pM={KN%DyqW-0+mn<^B*9lhNMQUOeGTKhTXwmw(GHb%A-Io{LaJ(wP&32rxan)&Sg(h-5grpMP&yRjM~o z;*M2=jDyi;aC-p1b)JfpHy4te+yXJYn|i4nN_?s-1eWY!%R$|oxqC~YCJOG-iRf|I zaB;cW=+kkxp5Z7EhE7NN(wSlvXhQ&?W^1x__(=m(w+yh~`W>pAgQ$%%vlIl^z3^f8 zuzUGQ(hiUE|DJXt2rIB->ZpVg)URT5=WPCs)!QzRIVzA>9WCD?KP5-)91F0}sh+6O zb)-xFpiQAIEQngNkQ4@$7EdlwH8dJW9(cb+!-3zdqVKHW?fhBLr--fKSTq zZ>1l#ZQa8)um-Zm)(}8C-WBN*PG}yb&iz|46P_2nClcc5D~5Jq|px4UA8aI?MBLh2vpEi4~KZCWXOO zX=9d8f4!E>2#Y&oyyc{^Ne>dvN|7ng&EFvD*W=Yz&3Ua6kgoK6vVZ-y?sjpa&Lxrt zC^8f7mgPWuG(1vGR(^8J0gjM4J@`Co7PxDi;;NXxs5@6vR#UtNl|;zCbF_NF&DyDG zOL~Jaq=82<1Fx>B1o?y>FAOy-;~t8haUXCBj#tgQ-SAcHJaFgq1~z_D0LEUH+&x{_ z`*bq_fwVWGVAV3`^92~JS}oz>a4)9Q=MU%PUri3a&VJd3g8`5;m)ac1W%ve*Ko!(| zZmM{eohms~LGJ>61FBAF!Ycj#KJT|5g-T^GmTN-&(*@(!XD<*pXE-_rfE}LSHDM)& z#%q&9{KasVbH3#LjMadxR1WBem9O1)`B$mm6eTQg%w}=$aaw`7)VLa+hMlE(tR#~5 znTgx|Ma07+jN4P(9|tT|1E$s^SAN@d z-(R9g+$9CzaeUxoGqs!&&VR&=w%pC#$`OVahDXkG7qvKEorlACZ^?ZK$D+sehe7KR z9^%;+?w_+-3G)v{H?OYq^N1l0rk_~F+Z~FR)iS?7e-Gz=U5U%=abvo#URIb z<$7?kg0$NF8@#h)jZnSbMSt?;x3g%MjR*u{c~mQH({KAM?!0c;r?-VRJMzBp43jID zJ#Fl9yRr%EzekKx&11BkRurvqh<(DXuTGr!0lRChZiPoO--ru#rInq6slF%{rjnCN zS)W1Qy=~M5mjm{Etj0P;W|k)UEk#3u4{x`y3^L8Zx8F1`-$un1C8J@aD3q76Y$!(1 zt$OUXj5HV0EC1N}wDIhV7s@o?_)CigI@LzEc`QPqB@9+tw}Gz_?!(<9%$xy!eI=Y^ z(t`_9%D_yP*i2uE_Thxqk~@PrC*!xdKcaL{DIwS-`s3aKtdEx4U&Urcazzq8e@l;o z>`=M_(edS%_aEOqKsed$)SLW<><6f3{c!dXil$vW)a!nwFsyA~zVJftXg~1C;2fhO zpx~-z!)T5Z!@iH`7N~yR!lmI<7E`tow#y3+8S8LEpovRmt6VZrM~*S+Jl?&T`3!G3 zYInT!`*op>l+Y^_?oS`y34`CEOVc(u4s__83qi54`!2fQNx4VG(e-IF)^d7K#}4%d zlT5>l=A2cU8agbYe^g{Y?|6`|eSwR6=Z6gC*RDC}-1_J?hr7s*QE*2yUn3DkN(L=M zGT^(TT-Q)-b!wo&_WGq%uew%M$w zdLC`YkNu5{E=~4^BWtkFwN@FuM(1tvgDz_-BeGoaRj#OfnSyZEZV!n32(87h76}xV zfEfEvS;F5w>9Lda#8Bmq`D^ zasRmw+n<~G^4FXA-%jKoJCue27plZeIE7236aEJ{?~{#Y{tp27Kd(e5;?MfQ^SAW_ zpwd4Rv;8MA&Oa}U8ZcZAiiZng6oyhE0d8ffjY6*EKfeB-oBa!Np7dvr5d`2rjDK=! z!6H)so0I?h-W@}L#igF%2jWpAusIPxU1E-lW*Yn7@BF`g;~uaF@%7(-hD|`j?;-ae zPvoDv5nUqd+bM{eM8N+Hy~(x=F^CwvOC2Pbcp*3C-wyoWKfLe)KgSF2gRMCcqAKvE z$f`nOOMf-n{@3gK+wH{w&S&C}80G)>xA*_uQ65AHHmTpon=j`Q-Ch56D^CRVyVE26 zY}>6{a65cz=PHWw#qD(>!8FwGlD`a)4f4-_)MuQHQ%ppNf85WZ>0;y}|Gt@@A8%?8 zw9Hr@JkW9%J7$=8^*0>>S9i2(%EepnvBzioE~$T&Eh$CB}ORiV5G1PSem z+$olF<#xvz!6TD4IMnA*;gd&OJ zcGE?r(ne6n_!Lsw5cV5(3Lwu{6gDwfJ|aLa#22l#(w z0eTb>lfpr!KaTQ%dM^a7(f+>RpQ?!xB?QHGA$WoiAYt8A_UnEjoS@CJ~Z~8!wyH5S5PtIlQCJw7m|Dun0 z;BhksC7i7)-R#n}aRUAlH=;m@c&(kBpzujq!SBHnH|iVRtQ&e))6{2EesKVQ-@+Qvr+E{9iyP!{hqX!>wL%S{6^IQ<sEF|8tSR4@GBo@%@to}PB?L`r1udnHo?x&&{s0MF@z zV`wyX#yZ@l0C+1+5pt)_Z7CETj&+S}Bex-?Tz0_-6=9q`xN5u5!nJg8hCNDQ zh64I6()|6%^9jIM=wvaqfBwsQc(p^*^unEg8Uuh02g){zaM#+}8W+??3VkOe{nIGK z5Bm%hl#WEl3Y65bD{jW9$2C?VkZDk8z0D(UU~*e#x368cSOVhUby?Y7XWN3k+A?d@ zm{>PNLZR3ZLoDVqhll%n0?_70YWeLcO}mS`sGctnTHNsXHrK+xcw)Xn``}@$-Sqxw z@X6DFRwfum(TuMOB{x@joL~ycvy;7kn=ba1M!ox4sP9B|@ z;8|rU zb(>FYPU)2?*%!}+HmZzGSgWi~QCpwI_{#z+;4UuT;A%|vuXtwGX*_;7=P;f3C9EC# zOlw)s$tP8A7J1&QzLck=z8$D&tWu3<5_sYv7A7wzN>99O!cmBYHO_e6C@r;ne%9o1 z;%${)Z?g~cdG>%FYtAdWx3D`E3_(s4d!LD)+NBWP>=MombgJH#G5H4zKsPE3sozRdf@nNntq_gBk)fCp{8f zYB9lVb>C{wP$%(DDp_A*OSIXcTMwGrr;(i0BhQ^IyDm~ML*lhXEfefDtCc0rztL_% z-39qsmp7d2fy!nk@w)3dFEyP?#G~%UQU2j4FEBBIOf3kM3Mnuz1w2K_L=xzEd4}fC z2YDQMCbHL43foz*E?7JsZ+<#nL=Lb*%gg2oeK2`V1-&`%^rE@rVa1p^XO2z3M2H$D zcaj}>7%a3{J$uo&{CKLmZM8#rt8YA{SxjrWQQs|iktNm+Z}8I~4w;QuAWUM^OI?tB z5$$Ge)Gm%&nQ~~@r^_e0{VMWT4ro(!frJP5=3HF%C2R~E@J8--)Gs@uqL6DQKBQSq z>#s{vmzqyc?yXW>ftb-Gp3>U*^fQn8%J<|?Ylp9DW*n?`=$|cEnF6+$mgJoG8XYd7 zV!=eR6;z9U?3gGOo_C%>&?RYg8kDCmg_z3#oFe86yzV{nwVeN0^!9?Q@`~gU9X>* zMpM5jzdkQc7uX+Op$R+6+o=OSI-~K~V6osUf*_*9LM_$q6GER_F{IBb#Xv;k7+`}< zi1Q4}q}&k?>e#JGcUMaaZZ5_Q8`RLgLlfTN`n^PWjCBQKQuYRA1g>Kl!54}~o;A&X z>rD?UEoxpF=b|)P$*r~LYX(VVIcxB1jUk!1Gt{SaNZ^aBu=tSts*dOC{G5%<%dlJ0 z5pcWxBDKe#=kmJV>=~dWby|EBG=82e`RHK_x$YLbK3sj3Ro7zZwRvAja3f@B=OG@& zN#YNUqU9x8PpnA6e^$+yqYX#K@L4K84f`&=|KpPDllfYkD<9wDc^kRESCBi$A8a>J`IHU+>hS5&7Mr7M?|4{ly%p%&S{lVEU~1Py|Cb0 z`f)kz*?sSl({Scm&1fC@aq*}2`}G!U6+9nQ>DoqIBQwA#>*jTtB{pcJl|{W+x+k@s zgk=)&xlke16vw(w$a&eto{U?IKOp1b4^grd6rJAPa$4O*Wmhn%OV_T>q;`a$OaMm| zzg7RXe}(sww~yQ8w5`qVWkB8P>YDLVo}tvBhRi#)MDw_1kVgyFU_tI)_}E!n4Ks2~njx;8VW4%au&&Le&A@dd*qJ?a`W9Jhgnw z!{q^Epv>W14msDBTiz!Ec0YGwVL$-T9F56I9)=@67(H4y;JazWwYEoV-m69pmTstGXH&l@Bj3*!MmHhfuI*welFXpk( zzJ#5IHjpR{B>UL))rKpsAlNxQ^~E^xh`))Ltq9yL-7gd|9pZVsR)0yZspXy2KO8ZF zyTw&}^U=*<@PojS69#CHHFj?bUklZcaw%WK`O2J^{Zo(Z(P{&MB>>*MmN}MT&*aII zQz^{6&lGN6i@ddVJ7K)`X??PKSTq{l-(=;~ZmusYGK(J~efO9zUuD#rIe)RZ!O$v& z{z0r@pR3(M+Egt)QDJokin2+VhO77(L+s4ah zNJUMCkCy|J@#U*-6O^6_=L^-rfNzVaa=Df~foNgr_YaUV2_wH0yny_hhnN4 zkH&1@w{yKHXq>Zmp$QvzFm|Dno}>HJ7pGOzYqKvxS9YX6$oMU{u-O%6SZ%TnDz8?yIg8=B{Fy&=kQ%|+l+~|?{ z^#}F2GNt=gv9OZGP^EbUUigmHo!Cps=Xb%HkFU9Fc)5)4mJsjv*Fz#^8X<~S{Hlxk zUSbIEh?QFobmUV7w?(Dxwf(g@wVrDrt-^`FZ!J~4;xKIrZ-c^%S7C)&N+RV9DJ814 zd|?EQ5AEz~3}1d&jB=#q-HmX``y7e4Rl`xrzg^jPIbpep+fTw0_RSC1@Gd0|fFlon zZ=0V@etox26F`rG`Vi1Nb>BPHoL5d;vR?DWohR0KKpf6(H0Kgm?Se_z;j5z9$L-d| zMs6h2kSn6T%QUeA2v8TGu5ehA{=JKT;ZQ7H?zWI-8Bd6DIO~m6g3PQtjhcMHjtJ>t3~U4Z7tXY`BZYbCmT}3JPoV z6ofjkKv=f;j^yC&9f)FG3o>PK0n=pnh-s;MLO`tPso&-=w;N+jfkux#0sD%@OKA?=NxX7lkz zc0Tx-Re?{Nn`x7P>bulUP!b89$yVQ@|7wx%6%drUxNjxa+pnS94Q9^nC5?c%eN?jI z{FVGLJX1=z)n(HP1fec$}qVqs864&C!V!a&B;dIWI+3FVIyEhnEJ+Y1`$Zyw!Pi6R=@p8MvVs#%I;AT#W z;M`1>cgRrb9OOdq>6r5aE3M8S;#B`-o7z5aYjoOf9d z%^D*-!}0WRHD)Uzz%?#&)$I;B{d|t=cTZ-k`K&;bt5HSMcfO?064AY-Ajn)M-M z_mZIj)3I*z6wracsI+qM%FumZCchXQ+Fe?kGh1V|8q$S*z}crD$^#?7R^@7KW|&F& z^z(Mzijkj4h=q^-sMYH^CP5lzX?QFSgt(y5yt1<9^qiiCSwo)Ob$93f)17q`aaUIv ztnf_m9+bQD0Xq&GH4`o`@|ZDsAa)2U8+N=g61l|!)QEKqjC6d%$oL2y3J%t*v?^es zELQ-9ZH!>4u&LZr>H0Qc1aG-Ra3;yuA`pfe&yVk6u^{1~p$zuRCx0gXu;s@c@o2i0?KbuVBKTa_w#c(gxk zZ1135Kfc1{bHxwrjv-!`?v@dmbJwP6RTpcWYcp0iqtn|tP-yeC3c=%H8^szTN_@~< zR;apbT~zQ8EUw)#R)Tva5-VzV9hRkfNhmU|*^!QBqB&OVuf3}9b&*c$B_5zeYiow$ zX`UN9866*nqftny&~DSV6tc+NZgW=&6vTi=NDRzSjdfGf>D)&O*0~msWE;{Vnq)C} zU+f&e9L9y04RIHiH>S=`uehQaS1K$n=66x3f)s!KQKKT$hQXV9!aA0S5IrWVJMyKD zE+bTj_*jzjU#2@IT2vWjYUpyFQfTBRAnBUKWypX29V5A zGvrylJN@FQZ3 zP-m(oIjA&?Q6+JC5{42ga>0=)`-m!gtXZ7i+|^oktZpAqu)LcCC#p;auFl`aGlDJF;%cGAz z1t`2!j-~>tLrVywvkQz6Tb3_JYs;UFIbZCWbTii1d?-r*ssQ_|z>H zGU)PJ(euP4)bONV>1DVOUG=LaggSLjZTk}ME8we)F=p) zpOM|^)YitbvgpUP?GR87r&w?zE0KviaBCtlN{3CX+kigfS=GUz*J_o%WrcaOcGrY1 zDMj0c9J;v~;rr~oAr@C&fbgys{Nd{F4z}YxTJbH>d2%Ne&zDV`^}3R?b$DJwMraE& z_Jaqi>sc>evVOd7%H9y=o^IW1keXA!#e9CXR%p8y@X5^4ualW=QIiL8wx*QsIb--*D|IX^3CM>_)l3U|> z_{igehBQ&XBYBo*+&RBj$IAKAUmpu|Qa3KN*2k}NE>Z{6-PuJ)aYeOzy`q{2wAxKd zb&QjS#IzFlm(xX9v9_DXuH>4>z(TzXm`qwT{`BQ@EPlFudDn;cA#pgLnXYFw|9*Pe zuZX<$0^!%1j_y?ism?BaZ;y6%CS6@iHodAS=F2?n@r#=*Q%myI*AEq0iPi5iUTKZp zzd=Kvs=MPg1Tmo?%Ak6`KP1#AX2r@*$s$26AuHMVh3?Naz2fG_B72q(@3jXIMeaQ5 zdcTQ`Se=z&Jk)R^DJhcfT#8Z{ z8hkFB{y~~vhRWe0tA0ey(U;9!YV#&ly`tdBQlOYC&*(yg)9%J))`kf13tJ-@xFt$k z;G9RUGkG-e5KbuG`sKq)OCC72h%*=;X3^6}t#9J@Q;E2xitd!)%d&|k4m&tPL~+W@ z5*mM<=BuLdt+FTm@rbOvCV6!WHQ%Tb4(^og;FD|>Ke%?lmMG4-i%B6cRyaNkjNn=+ zyn6*Xcwp&BfZwc9s3sAFxF|(~! zI;S6geI6jLzJj!u6vWe_UYX_D#1Aq zuE-VkGoX?|aUdsCJhwq&`wKb+J?HrclG0TzVyiW0D}EW4ybM zaV(J#jfD_Jny1BL3w=x6O)^odQXTm8xxtaIzpC%i@p^yIrz-I_{-A98sJ;JygeG8P z_t)L{WRa~De)}R}n^Ge2{QIw@xlI}Ypr`Z3H~|ZsEfn0IzsrVl|GX_yLtt!xgIpMU zeqALX{%2(k+x7aHC7F^B4}uH86->YCIcC(?ri4o*KME;AR_+~N1;^xPUwyQ-Au?l% zj|{A=kcGU|ToH3PZBQ@UDy|5vcIjV{+dbUk#6dd2>SRj>`5RvOz1zF$Z6i0k(WCI2 zV0D7%dE*log(85({(MWmAL7QHK$yqzHAE5bc&L-C_GVvX(eCx;EQ>ZJm6cKIJky}| zN+*4t#=%=PzrGl}0aQEGFud}Uf=WwfDwJcP|7C7lTu-E^Yu<2sxHjOaI8Jm~e*-2mrGd7C>5T4($8W%1Ldwm!cWC5cVQ-wYb##0Hzixn?M>Ve2J1IVh=g(2vh& z$aRb_F={=Wb1>4Nn`opG7v|Z0N|WlQp?Si)udH`s%}uH;uJgcwqIvyKBRN6fiubf? z)0qS=vH{zTu35>Wn0E4(Sc_ZtsP3C%p2GDAwi}C+H*YqA07Z4bRyf*XbDN1^DW8Np z^wsl6B{aP4>)#BnZds*x0jD8q`$j(DfmXZ}Zt%m+U(|23H!T~zyLE61>KMBg{Z@FR zRo3*%`xV$TUJ)lq?-aL$fUAUibDrMSX?AyGvLla+i%;9w?OG|&!-H*GpCGHijb5#)=_adiNJ}iS zkg|WwUtVyfEWkTKq0$N_lAj4Sm)Jv_p@~j^{Znvss@J2K{4vjC> zHC*3XjYS`kS^V<)an2zfBeXTe6BwU#@1f7I19Q7P4!x+bf(l8RjhO<3*Yah!b7-kS zV}O+5m(1Vy+%)1lU)l}^cpTL|RDPY^aEj%4N@B#j2YDsxdaKcWQ-is9gj5L@dRKVr z`SFY2B6IMvv@cor1(O2Hq+ru9NdEP>?iG%82l97C)5z z>6T~q@>-{PvNOn>ET*b`Z)AAx_j_b=5YwAn?fi~FvR@?%@t_ph>ySSwugqB#Wy*p})nykWXcA?vjyLZa6}~AkPFnfdGAP?eX|8+qSTD)%vy!_u z4s{L(0INUOzOVGPEOn|;NU9nAx_dC5fnu90W)e<{F}JwdATr;gMiNA(M%)8m%eoRaILs)g;S!HFDt20Oe#yC^Q^LCxFQ_{-msqnPc zqw4lvaNqf3_+ngC{eYBq?&uVnLd9qvdo9&_T!%JRgD<0PBgobz;3*-s_b7R^N*VRmK9Ts@uOGMmG{M`X%Wv;K zwOtW8zD3W;&z0DeG3)5`s9%v;n4(#yhl+0Zub~MJtWz7_*^&m?-@a4I^&={I zIscFqMKg0-&z&kQ(}X~@CZ)03NQP3GeRCD@j<7>xh_p@^346RI_wsTs4Ij^ZQChHK zz?so}$VrIoeLX5?IYs2(KI~SB6_OnHxj2}Pld(miu(hyaR&&lb;t*+rrxNa~=dt|C zZYuf7Ls4D*#x_>wbR~WS2_XUpia;`C1$&9N^dJPl22ETU#kUoH;M3VMRiE16R;3mf zO*|F8Inz2n(tpSTsnS+g_$|=fy4NhXtq_4?sdmL#nwN`N(^ArlvS!~5c2yX#y6U81 z&E@60EKO`Q)oLZ=r!q4aVtB}Qq7UqjzG=s02> zG*klM+NHK&|LY+qDs+_L>HFY31Wyjz>Pcd(WTF8v<}CoKsu zeA=!sP*yZD2$RnXU(l{$PfKQeUhA+|X$+yfcjR_kRKd5L14L|rSS7mUGzn)};iB-w zP##+W-Xm34zdI{X7?f$_-AZrmKhNHz7Zbd`uG4AX(KqMzex|W@(rz>nCSRADSE$mV zAhGzOrwykq;(_g#+O0oQ&6H#Y!7Z^v&7iD6%gpdTsoWK$6RwdY)k-VLisqTe(hf}i z%lA_(sX5TU?EP?b8k^=ME`Od*+ZpJ+H@fF|u%C7HGERyXB|5RKKTh>G{zsL~NM?@b6_m0`+?X;bRas@SO=zcyU&=rBp- z`h@y}^~x*rag(kNB=)w8%#n7DlXFVHph&uCP0>DXTI}|(rTnY)gU2gK2;**+i@l^urpH#6vd6Fkhiql6MYY9j118aob+%JK; zh5NoL!4dO0s!m+y&kXixggO|`To`&>T@?iQi16FIsuRi$ma?#16po&LqAgIbcBj^QPR{376?c#=Js5xBt7D2#8r9tG%O|gdtLF z{Odz*m6Een%IR=W1(NXkeFN(P*Jhm1?lmq+rXzogCr_6~H|5+o57$GwO;RbguvnIj zGn>zPl2nflvVy^#V=cG7F)RIES*wr@jIjf35KDeXS|m$wde1eUSJk6i|LwbQfA5S5 z*nI<ZFhkuX$!}u=LMDfKhe0H2Vv*Sq`nB6CO3pS6f`P3b^t0G=| zsZ_&fdM5^OLN=u&PDbA8`>%x3=!89`wK>kjFK;ao#DJb0eZs=xl1G&-K6^JzBO#1t zH>1kOWvxHZWa>nx7kg7z#NEivjx7E<_j(_OgZ#Q=7t%kFUTe2Z>17|v`m#dWI6-QD zFtWb#$yZ`h*sp&^>`4;ZA`HJNs;5)stz2S}pW5kwB`gaokMd|WX-X-^iE+^CRYa=% znNzaQXar4R>J(92hqAdQTd&-+vXmX+N`ihYv~>2%g|>a!A}NcwGi4V+ykx%W`H&vqv?if)_0`NN|&jk>c8 z>(;prRpobg$;3;~E&RyE)^@jhf!}sZ>qotP#+I7?(TI5?W@+^H1BpJX>?;y!6=6%r@}b7J#9a5|t+l66ta=)svJYc5;#AoyG{ zbf#4+#nc)bs7SPah4 zs}BCn?ZrcjzAKJGsDkibtJg%-ho=+X8@8k&`dtz-V?E-rgi4%VO3oIYDw9`QS-sB| zJzNVFe#WM<7$m*W;@wp*WikEfQae6TGevCdHe<`ea!0l65W1aYm+N#>w87`)e4sn% zzrB3f>qI)7<~gpGO|DA1>MsNBG>W7F?YuDy%bx5RmyF9KIA_;A5Q(af`=|1ZENy+1 zjuqTh7D$eh_kvbVevw15m^@7AHoKnTv?Vg#X2~u85&MjjwgV^QWD4h|&(rXzTJ*Mm z=;Dv}JIWROni4@RvEJmWx`ez}37B19-TEFfe@sl{h1&G`khjg9qQz zn_Q>9LZ{<_ftDmm>2Q!u0WbQuVRuFFzW%D4JXg#R4jUgS z!sXXNU*51%ergTdzB6}sx1&BYe8|x^YpkmK%(A4_?B(ddEb(LA^i5f@Jh?V;SA9@2 z^rSyi*6uQ)^RB|X3dPm(n^`o{s~){LH_^RbW`$mJocp3bmtzz-QT)LW;@+SX9tjwg zKqfsndmh2)AfK?*ZxXX!Zge!jqMjq0mp)Nn?7m6FD4ogjc;}w`GS4nOziyS~T{e_}A4e9vj?o33S!$H&kC03oj{?0w^!fllCS`zWLYp!?2XoAECrd%Hs5*zVj8LnQJ0P13?kw+VZ7Y zQrMbV0hh-P_WW?qG0liD9rYBm;mS|ji4{6(tJdV}SPX|{?AYMWL_cYk{qlUUH?7N`ZD3)U zM6pfkw<1^co-}VDOY%L@3O@b!m5=RpCF~wfpgxZ6K>&%rBorXd^VMr!cQV5Su4(Zy zqdKe14>;8uX}eZDc_A6#X3@Ei$6iQ5eaOo@&d#a63V}DX%thZDW;4&~_ zHFSRo)+p``TJGr}pwWMbo3>#@R+zCFXO&4WFzNGW{?+pC`;b%$FJTtuJ-=XGzPm!f zvp8C1V+dl^%M&zd)4KbFVgZH^C433NLYa=xPPwYyZtlSy7q>_r^+bDjo=r1jE1^u4 z*PP|yrBzL^D+;H!X8DO%Zob3anys6DYd4;}i6WN3J|VZ)@7J-}Q=c9g!Gl0wJ<%eu zI@czMPttzL4;m=awoaHmtSV4WsMd>_cJhN-nrHQnhZ?fCk@~e)!TWr4)}X{k21sB? z$G6ubM4p8VTPZ?ty7rj`_8@cnkClFRrNnMLiV~7Pr~QZg zrt-MGk`1%F+;sV$Uz2at?`!)Q#5U(x-aPyBBG?LV$>wl>T8w=>*e9^O^Gx%%QRyiY_)l3q2;dka!85@Z{Y zM<4l3>8i!QwNMvmHPJObtA3N3`6U&cfu@HiFzy8gH!eC)M%62plAE>Z^7D^0A>7CG z=3jcmpJ+Md9F?a_(@!x}zRg=_5hX~0zzIw72_eu3I1MvOcNGCjSit`XH>hBFb>Fje zyRNx^akt7;wI64h5=->>mdvY*{`!A@-m-wqV=p(NPNGE$Ar9G$32Ws65s!FFB!Y=M zCT#1}@Oz|ZX=8~T`I8(2xjwr$h})pn?|*$*(SZ`-d7y-Xm=h6Qkn#2s)P4)*@$47$ zH%|NfynHyC~L-adsOLiaud7W%Ewf#Lia6dsOrI8j1)Wx2}Wwf1*rW#u~G zN<#W=*5hyQoL)AkuAf}ZltV&b|MRn^4Bl|BpY8}BhR+Crwn}6UUOj)AI1(0%5b-#D z5#MC_G@Rycog9(p@d2~ZmWWC1gY(fV|^q<}V z10w(Xp?~r6e^x?*(HR*H|DC-5Nh)&M9F$Ggj0R@jLr#aI|C}w&RQ`KsFzb zz+i9X!6ap*Yk-LU)2F2kJnUG3BjG0ALW-lyjUvobP4ZtmI;@@L8DRO(6M%9vPIIFS z`2}ayvLr7bcooLm^7-yF-l1Sepj!Ok0oPHv_tO&BMBE|I{tKnZX)PGKJQ!?g11f%U zW;&v|_mK#FgSyHa z+S4VRP6SKD=ct$Lehyms|KkU7$6vtFd}!Oc|M2ae5(4=#KZIJmB?1ALgD@Pabj9Um z63~kc0-#)3Blbw`Kk^gsS^SEB#8O{!gNWyj4SIE{^I0PEqvII~S;Lx#3`)}N2cWQt z5a|#}5-vks#aLEKpTj-vFeD;mK_UVw1^tgCk~0&sX-IEvZZZ(v{j)Zi#ck4zHKvI` zatVbklOY6B#2qdZZo+Wd&aPdTRSu`*BfG*lLo;DjiT!Vi|8LTmwt~+i_dq}7<+g~W zGeO_vy;DL?u!Zs1(X<9hNCE{boZ<1wu^ZpO0pHn~%zvg0ur-8GEwK09HBJw%J<<(SKHb2;49P#kMKs z8A7OA&L_8wgAj;E2}0qFp;85~NdNz9kpDA&V2rrhEH=1P8`ky&IgJAcxICeRuvsE6 z)_>Hl4MW&sD**zTes7(E5?%cq34sx{GRpo}vxmbH(Z5kiCgI0{l}onhLtEcAcjC>m zzYp>KKg9g+KT!KbZ)JCQasz0Plhv|3=7ef+Nk$Ze_J4cR|M|O`E5Ng^-O^lUL5wDY zWrF&WjO)MY$-ny-E*aoflOO9K5v%P)zG5Q~wGR=&Bq)XZ&8ELAFWP)|>uTMdV zFLci^O1w}lYxM`qs^7D=h;E5O0mIFEM1P41*rhgo3 zZKXmmuP;SrenSMF^y7Bcz|YBQSwPrKoEbh9UnacZz$gkWdU0t|@AzG2DikoqeW)o%<&TYZ$}C*|_+qxv?_D;(7XqveEsJv2zVRf~Je~A(;=xJM+l3&>hoGvrZPf3B8g*l^BomH+}SgX<LdJd#hGADj}88XM$xDMUH|+tM}p7+4+geUGe7w;sip^nC$ioTiXd^0 z?8_m)pukjoy5+QSzTSspqLKO*H{q(Et_tR>HF@!0r%O?wEAs^lkTrl16Qh9IDz_OEPTT!X(rhd8nSha&x};u0Px5RvAR22`Lu8_Jq^ z;N6+W4Wbvg7c7GjqaXpKP?)hIU|o`ma4;U)P0%TdM?ev<&=4-%t5?uZHlR?6C;eA8 zOhYdiC=S*Xgm{Y*4nW#*uHC3)`~!A^xtSx)Fp4A)fFipT13JvF`b8zXR$?4mrq$V{ zzro)I7Vu{cU~!No+$8~IfH%F zDg(FQx41N)NQYBMRPCOAmaDG}QoM53fe*Zcc%ei?lyW@gf zLT@l!K>t-Y6iSZptuf?KWo5{!QV6Gx!n)b}P!YY^A5i;V{nLRX$(v(>jDe4H)~t_5 zc}Tb(>r&W@n3H;(B8izpm25Sb@+bzgHI@gmmVeh1xSS1IknKEGYod9jAnLbqz(y8P)IY^ok<)8%Mp=X^NP}+)UUklRRrhfU;^HrcOS(L# zmIXWevcWinRu?xDljY_oIGt|qEN2>+&Pbdxq}wu{ z-_bjqY788WIaYZy)sRQ+wl;YGRCVn!C7VZVpvyx0lcW7l+TX^C7a}xAdCZo3gE(Av z+tVPISoH)5+FsD%d1XE+AgvM%LzS%hsZfcg{Ph$eKp|$;#%->m!+=J3%vYIhbrRn$ zpZzrvnMh*67SuxCNCyjXqsMX7vsIBtP<_nKb=I;$phC+>$JMq^oKi17#dO^oyi|ZrCNSm zZ#?3(Yv(74Tu<`ka`bU}S7o>f`&nPHG=Sr|wR+iVE=GUWk#T00>2azfwGgy5W~Vsv z-ZwFsQX)rbx9p9rDgzhVDc*j)cse0sqQmfoei^rQv9A$GMqefc3RNF& ze6kbcr$)6>xcpw6AiRRi5cSJf9S@E#t0z#;K5#4&Un}h%*a^o|V{GZ%Ct%FsDCgSg zN=9W7$!F^XN&f+@RM~)1eXiTXf`JXEKk0Fd*|Kc-k<3;dP1kp}zEQIql%j}bu6{P4 z97QI`! z`Pk9v1O67)T5fr1nZ)<%+1++}yl_H^3SC}$03~DB6ao_;S z(k*se!xw}&AGGRid2NI~dcd9+%qsYfNhh($oD;>QLKwZZ)SWFXY?(nK(du@_tC%PN z%~N?P{kubtFIT-*mPwcl7vTgBbdec$)t8HdwXk5@t~RsXO07xn7u=QCG@uY zxubg2~B0eew0wW9 zRGPT;!Oi^)$h#*5KC^%5gJpBN5B?gk6!4`@af0| zk1VQrp$xL0^nIpdsLgv{GL<^S`uRZ^&(=bZ4twfd?6zoXrHq~NSV*?r zHeE)jNNd4kSF>^^-uij+moYkwD3b2Dw6?_lO5cBs3pS*3kft~NS6`hfx%bV6aLv>f zwZ8p6yrc{TG3sr;K)dlYR0V|5D=L(p_()6C>ok@C&!Lmu@AFe3(hrJ~5~n?|&XbU6 zkE!EN9ukZtZwsRjV_twCC=AKK2R(4Dm0!osi)nPX;e;=vAyKAy3WJF!ug@nnY;y;(hFnpll^8yTne# z&{Cr>KBT1zhom^I=M!$&Qs;#Yn#9nt6+H+FQp1QQKpX+Yf?VImKCNC;D#!`Ji zms!0oR>P;VGtq;CX3D}4Y6i1Zx}&QrjBgE6+(1xVdz%C?AB_rZB>r4V(j}L9B_wDJ z0(CSCO>pxkw&%eCWm>b7k-OS z_~u+J!8$k~?o%*gKUI8kKhW0#DoyVD)i8Ou+bW{yGwj|TZB~-^DAr}TI7+_f6x;VA zaGb^iZqEHPr^O4TX#navJf@XKR-OelZVGH$FZ%*5K#3qg3>s#wGrg7ewV+2nt!^Lx znOnu#WopW&7;&tnjzwdnj-dpp{CF?!X^d2k<9C{it7=~XgDT{wYTEmMJ zAC-f!89Sr-CRcgs;*mbES=IV#XYdX}0G+(Ee3Bc&y!j4GW*Yi|C(6&4h17pf|CQ2;_$hf?>q@K+_a3{XMac z9m2A|Q*}lsgj{}=_%IbT$YHxY$aC&4QM70tNI)t+2WBc_1_~hr$%bI=a~n)*4S}bk zv4}Vp$d~7+_voyi%%k$k`7ovgFp#T&=#ck%;kEP3q=g7x337*J`oGyA)Eb@fu2PC0 zBd3`_FrNyi`x0=T437qZT!Ro!Sg(x3j)`I&Am|L~QeDW6zn*OcJx?Fp0f0#3gUR>J zL_NSTXH^QF>HG?jru$n901Ne5gjZd>Is={doHj~b`71Vb9+4`By$nSNpwq4bQ@I?> zSI-zRd{>DJcy#e<6~K4v{l2Wf(4_+u{MgWxc;GUj0~R`&c02i#I(WYl=R&3rh~#4h zc#Z13{omk`E+1W_1N}pffiq#~fZl2U_&|t+_x% zey(-D;gu99B+6zf`XWzHl|pMmDqW5?<^e(nPQZ+)g~;#XEmmlOyea}spwDrb$Ksd_ z5bp*=8zXvwAT%%7Xk{-ZjGQ(F!_i!&`Qnc%0Wr`lJD>jr{x*uv{(wXbdLchC`tN{+ zmI&Wb#2pN8#9Ic@5=jyGaS2L}4jpA~z$P${zQw^P;hk47Ef_`#;b%HWONij{SF^cq<54#YUGMGxs=D8xR-_(a+$e{zRNbZX^L~z3Z zAi|_%EEgE&QCSSbMs0}I@GwgK83%25lX_qzjF5t;h(`XUZ`1!$LbPa5zb{6f5YD`T8My+hV=J3$K5gPaI~*MMQx{g5Bn=e&H&eBm!rafUBr zL?w?FmE7L7Cx1QHzYJaF26#=^HPj+T1s-2u4EGCQ37CfkV$d4qKOwF8*V_2e))q{M z_Z;;vw}bx9)ZjwQ_s9z|Qv}!`+F$%)*2f@m5a<#S5VP=}4JAAkZ6TVQIgS|SP+!CF zdag_S0?x%hhYNIB2LEDy|MIER%4iZ4=$~Mg!O@fp&F;tgdFh-74kT#J&N&Kw_Se_E zLTh%M=npI?3p$sUKCq#}sMq2JtG$KPE_UdipS$&88UDX+T?HL`6deo-AOxZTtCuR| zdN92BaN*YXw*9Fv{G&NH=485T(!a*ch4yR<(cdLnY|$j(iBMg*^-CBrJxeCk!uXnL zLbRAdTnHooy7f4;MQy<|JqR7h(63>Peuf^V#RsP~lql_Cf3k|8vt_|*?e@^GkvEsF z=IahJ4(AwHE5-@ko~U(Bx^e%N?62?k4xOkfw965&3?D$C^|prApE2l)M#RG}ta4G0 zcMgZFh1^bs@#t@-a2Yp{m~!fHr-NO2DeQxPRHi0|ORencqxJra(?nC28FlVM0A=%? z>1pjRs8otH^0c0VOX26Y^OVTck^$N=o2L|i=ROrKITy`s`)`TQR(Gn7Th1vP_3<1y zUo`+_8q5(xrD6qx0JdB{iliptd#D^v%RwgMaTKqZR3;B#6?F^r2HL5J$BT4f56LBN z!{O-d;T1l9-&xE0XoLSw=y!E)gM5CONUER*WyW?Bcs1vcn{bTy8#<#y_+w4ttm&R4 zZpBeRI9YGneJ70%s%QQ?`(GEdD!c_#ZrKVO)p{m$>l8n7W5=wGq9QiuHai|A?mqde z{f}tu4V837oi|3;5BIn7lvwQ&dx!IVN7rf6ajDI zZas+n>rMQDda;Ph#UZD0fwIInX-+km-Td;ZTAcEiGAS>(kMlUHZvW>T?ohDkxs%aE z@IM`nVSm6Xmm?c(WifzIOy|^tK$#ThJ6*O$89dKsE-g$C=sM{?2&V{a<-?l*UIVHv18<@Z|irn+MuZ*i}+%=W*yV;vIleAQR-d5VddZ_Pe`eZSPd()asb zrAwRQu9MjhfxNW&d7L?$Zz)wwyq@<-5y&5uIq0paeHKD?E!Gp~QMcnoahUwx>X^;$ zR`bf}=CvKoMw6XOi31G8lDRU!o>lsEsMH4l=i&4L63bzY|8ug6&#F8AWs~or;$8cR z`D-0RHlRH=lZW=t)14flC!7njW17Qd*7o|%W^qOy*-qz%>W_lA9)m`=c=7zU#Kjv@ z+Ms86ab2cERzRi0y=)GTxjgBT*=y@HYUu7eEh5SrLDkRzkmkT`oF-jI#vSBic4Vo*xY0huG z=wkKO{%b=*(>}Nvwm|=OiDtC1k8NA=w`a5o0JH^ZrUGZPSI2{+{Z+w~W(Qs`mf+c; z)|F+@(^OII78i)p>RzY`qV))_VA}eYL2Ic)ztU{(#-pjClGD0J+U!I07JdW{plIv$ z2b;33fYExehOSQB9sY}$l#2s@%+U)wg1}Ue)5WmPin$Kk&bMa~v_77@YTQ)BcA^H~ zIfvhS>8O;xPRW*u$bVsbf_3#lR_TxGC--;#%9TW4G7dgd`Ebv4fY5XICu!tDO(PC* zYrzp7^)I%F!cDM|@^icj`}gjI3ZHd<*5!!A!hRW-!zTj}#denZa--&~pZ6TM;zi*P zQb#Ln2T)Bvb4PxS*xSs+Hrp(g3jUldRL}WZI3vYo_q~_o?o-1$kL^Su+V7dZBBb}k zxI+9rHm0Ff(}68@*DO?$J;5#{@X;v>l;1`m zABK{1#$=FjCoARkXy;Nl*i(=b#T@OdO4M$XYtV;5h(*2KPpl4cNj0(Vgegol+uL_1 zGh7PksFS)bXgHSMcs%TSxV^B@@2Q?LT=Z>{HG`o#A^#2ZDe&+cw_qZmry}haLzS}qbbO3O=i5t=!J6>i)c zHt0i$V1v35i3_otb~iGLR2Mnw9=wSR{zh42I-?x z@7i}-&BnCs>iNRxJJF-)eiVFq$7#?M&^k9i*?5e;8>*oEI{*1@>Y8Nc{Sva_G9{J- zzao`JESG4%sn;Bva~(OCyu4SyLK!dU^)#WmEB!JoRAeRlDaMLHjS95&+Cw4>h(95r zgEn;jAnY2y_qUX74D1=`(0E8WKe>nkg)r=-5Qa#%Q@ZTBlx{ zmLcF68$~<$MulnpA3wFU7^61FpUz9%r79n(JW-u1qr`0yC7LyL<`l3Jm!eqy&1l~E zYEyO3{k60@X<=nXX@u%;p=aPKkzii`1qIdI4ZrpIbAcOOuxeBe#t(Vs3 z2cPdGW<&~ZlMGOA60A+gm?I>KUACPMG=J-Nd(CwXu~g2lTe0satg35(L%*O+-qGG# z(OxxZQ2vwpN4?#>6G4kRH?0Qe##iQsOYHsJeQLhz;534Y35QFt*%{WuQYJC8-xK6-N2zFx z4i7f3cZ^Obf0m8P233*CB;xa)o87GHb;1*iG4yqepW0`ePxDv!9u^HSCUKeMPX$Mr zuE%^}$`0(4w`4{2z7}~-C+3??;KuAqiHn@Y`&uMb4=Jem6o~VAlFqtlF?v@S7a7Z` z9?SSpJ|pT>zb{g1b;2HXYg&iZBr#tlMI5ZlIZmV{ zqdqlY_3rD1W?#B?Tal!=+i{-yc4@yc6>lN)l{1zx=K%nl?FpK37euG$mS55+H`13^$$@!_#y$Bf&M+UNHB-^|!Gnf1QrLMNrV zlQ^V?Zm8yB6VPj9Wi$VdlK5}Yi4Ljw)A5EPr$-H*C;B*-V@srTls!=L#xb`!lGH&< zAc4h0qmwGo0PHi?t{}GDHFk{#{wIdjDT!|k?*m0s8==BQ5;vbNlq3!38L0Y*1OppC zdGcdkr+C}>IYje@WTd;>vZN^`(8i$HoLuj*Tf-?6OPcxe63us>^cmk|N#p%(bDrq) zUqdKDx?Z!~y{RXl8g!+>VUsvd>2+``Vm)+2=N2n~BXkJGU9MgKbTqEVCy?mPS*%qh zi-gX9YGz4LYxezojd#-zH) zaya|BzawBqerhkLH5i^L04-&)DHbBB?`nq{u!ZdXe&CfcB_g(W6k60Un78w=zdo<$ zL}d849!M^;2f@ug;2c55KKZKn?pxD=d{k96=)G?50!sNmEwUvXHmxim)kO?G4 ziW(}WYxPg~KmaPsJWsms?7>UPvwWB8mV2g9*lysqyF4$6I8&|JH+C_#qFbaphmuz> z$K1+O8hl|JSEL+7uLYByBaVk;*Q*%6NaWI!cUzmx1Gha1y0>Fe!qH%HHCX7daj~Ui zRNUk%jXXsKH@*0D0T1>vgXWKS@C*uNBA}fKa6-y_#2W37sx0L(CvbCE6wRpA9E-|~ znx4|G^wI80USOn#6^H(d+uV+;c3N)~L6178&W21Pw6Ai|fdyS5)k+`F51&6Sd9W>) z05O{6-r8h9wJHz~k&`L)r8SGcAN%JixCj-WvJNC~47AeMF$oKD+7g{P2}5n@;Hfe# znsCCIkpdlpVx#w1OZbOr>CVJEphJcuMU1^x<9F3uzDHryo)y_aE0B!IN0aX&>FTo} z#CM<4{OD7#WUc_XU&P8>2f=WaGfSQ4Zi>(oj&vI8Gd(G@LzlJrqM?<|IF@)u52qg$ zLprrJ;0}UT1Z$W78^c<~!E70A!TTScOcfF5<)CdAf*6fL?@jYvjuEbPR*!t7ZF}bb zd^PAG9KEWf{ixP7D`xUbs5lSad($mAlcYqnZSrmKbPlA247sGcQ(LT zW1&roJLqBDSutrZT^%bACwiO>Z~@Am7=;7aT@}gM57ATeZuYM6%*+S7`)8790yZd(cq6JlKQ~( z#RZWN0>V;21Nz><2A5gh^Rk}}H4Kg+?4oX}i+*nUG8)D(Mqx|+MXTIVrg$h+H5y4M z^0?F7uTrA{2;q1P zc0pi7LP2)UASfETAfNt7h(Q#@A#_OHOUUUmkPy26>a`d@r|1<1wQyfdX(>F94XDwe zMT0*<`(I3K1M(5XlK;%|~|8GQwDg$Od z6NxcQ2yBnhVWhwR@i$2MR_P6)(L$N!1~;}{^eXgPj_{lEVZ6!D+KaS-Sm^v(!J0qt|ldX2yWBYZ>!DM_@% z0f>7ucdS(xGfM!D1GU)2KyTCKXtt~gJ>2=rr2qh#$~)N1=o4-r0dItDZt;>}9Kg9r zo-ZZt%xH%r_?v?N-0sAAzz8^4oQAltbZNj>mM=HjF>*w^6kz}Km>0M)qp{r)-kd44 zg@F$t4HzLn>dFYZ1{zqpL|j z(&m%~joMjt#y%JIIm&I1yCviFXe9qODaV6AMwu7#cb`sXvkm1BE#CZx=9V#-nUqlI z#j+sY(ghrsfCp?q7$Fb=W@i0Tt{%ujDDYudQ90D?h93n9huwTyU(weZ@a2*9%o@WFyET z@qho*7Mx+P_2Co2&h(5FyKyP&m$Y4$i3ZmQ#R@g^^=yE;6~W}w$7@HO3vjAzCi*51 z)WyzyEWbbVl_hm9vc0w|x1209fYckkTyj7^p+Wp9qwtTJr#?ky&yOliXUwViEt4l| z(df;jAU{S^Auuj+pc+?{VRaB#A1H~1$^YQDwK*MsHC!oUSLZO3{iPz3MpU}C((U)8 zQkp)OVIlJOKYl1t-#<3nA27Ig4WGYRGhVi*t6%oy3Dy7*04q4QwX;8a86a$ZkoLV3 zuV=BTDK|mVF;VX~RW9}29I~Ya&3*9Y=Wu~FL3dhnjL}%mIhwX%2_v4Y0Jl8zyDvK& zRn2h63+ufD^lgroXq8J}YmZcCK;CovZRW-gTu{9mJ|4y>P^c@w2xeh%C@vI=4*_yX z;s~h{c|^iHD<#dx&)7h`Pf086l8nAkk?6WK6A|0d4!yju@BZVcG5}(d+j z008I*H_sxrNZDmo(}gQM3`ERSt3x%~S6M1N~vL%;S>cf?J@KS>j8kN%s` z!a=$=VAN>NCbJbLJ(S;{X*Xi8HZI^;s5|&+xKYRCXk+I2XEh0kBgG?ruqQqJ5H5R_ zTGG|GREGM_)9k&py5dQ>NU8+<)y+Hv(I?GcA82j3uP`{ywP#UkvVhCCDVGa8n+Gc9 zSXPBJFmtohxmi%}>&tJqXNX@$tmlEeWB()hhH9D$NJa2@?}CdPWJ9RYeodSxS;!Wa zz@;6){-8)@*f|&KsNg<%&vhb3-XF+7EBwqG7qL2RBpLuB%~SIjap~;$PMN zCx;$1HwYu%k#Y=G*^T_}mIrwnDLlraBYG&t?E3Bt*+>dS8C>%0Pi=}Tkq#gO%T&vf z8Y$z-gk>p8q!tUZX^{ce$L|D5?M~8^tVHxp9D4G?t$GroujTqx*_i-m4U}PJs03U4&4ZvVQqJO< z1WxrAlg($DpDbP1f9Qp6;Q2l&7X5Y7ytgJS-#zA?tFIH(bN%(+|{@>5wD(^>v9Vp>Rc^*@*^LrdeIgR7pfagdayK0 z7bXng&&_}{v*MkX7khox>z*AJ2~Pis|BJ^FmKj(s-H2R>|QNu5_j3$-ERd(g^P_2FZ%rw<7V(iJ4NmSNk z-;I5V+)E@|iYVLFO+n8m;`lf(xn689bf*93Hl(iOWtaQ>w?zMfdYGm8!flQ7Uiu(y#jXyJLUe~GkM*Cfe zqUv4SVUWYA|9XD=vtpu?I{#$8SiWLycH~&Ha)syWz%8i&c~0U=&1!i@+dujXH$o%3 z+-}+|uXvS{rmtLQQalVhd&;LQBLq+wJoY}kGo15?Q-=~X9cj1xX}e-5>`(df%}0H7 z&bk~Qsm)&hPz!$=eIxB-^wMQE6WDxn7?LzuAjzSNgs`rVE%~Ki*Rb5(n8%6!p@SYv zE&Q-2*Ac>YPqj;Y6_@l5VGuIb_Z|Ap+w-%>_PF&Q>)WGJXD6EX9kd%xCFucn69c1$ z=%NJySz0sja@34-DV4$s1s~Y6BlCu}-|TvviW62a2k(uN%S)5!m>&U*S1ehlM!H5rZW*G59O@MM>iB$wSi4RVAcX^SaCN&7e4V z_y8)nIuD-;|M>iC>0ofptO)Ic8=+8NyOjHUw)@UEA8%OYT41%G{Rp9G)nan#ld8##(vslqt08ebdf?%EzoEq?7FS}- zowY>qUW$L!F`dYrIvv%pAwi=#2BpypeToZZ{`O1r(oF6<+j=L}^!4`BR|h&Smdj0s zL>H|$>ze!=r+UNoITFnH@gM?N4z})w;^+|cJ7K}L@#9*roMYnLH(3qjY zm#Hh?nDe8-@+{N(aL>udVxF-BBP9;>44?bv(X+$Vv`T99N*eQqX`!g6;Eca?{VT&YjT{rf$+ z_4;DATi>j>ZLkPyj%4ek;cU`T#9*hQp2}xrrlMa{Xpy%YOBVj>W7<3xsGsWr?+`uT zce*B3knV3SkAE;${il3#zzVv543dt(zHys7Lz?1Wa!(8RTE`uJyO!IOb*N48mbx#? z<6e7FMh{XzYjDfavu*S6G0 zFkMqu_Um#(Y1M)LdgV(aJ9Z6P^JBM)C=IB3aLX3?i&i!}xO;(V)EupIELFx{CE3Dd zuP_R}N{2X|q1^XM^`$-O%HACYli`tzziYw~ziRR1zxW)h(omRV6&jJmL0tK=WT$*G z{chM~os!L?gqVEGiT3i)vlN}c$dl=c0VOH{y-hz1P;YD>(OmgZsN}g}-fa+>7ky|v z@rcc8!z%M*8m4NZUW(b%&aVL20dp!bey#c;#rXw$mC1z$q1sjl7n89X^7vNB_^t!l z!T$LXO+%;Z0BJ!6W4tnBtG^5#Q^fRoKr*6;z*F9&-BwZhTdIFgPW>m_PwkAs(3NTR z#+5W~#RJ}4NtK*4{XVI2dY}t4^XLteX$NG&;>n91W@if?2u>v1;5s%XS)!F;w3V`k zH-v-SM^idVrkA?Sb^}?iFBSnPmlNk#84Vz$OmROVvW=BPB=dQg-GC~l*~Q6UTo-1`<^ zUnt@Ltzs!K9fL=i2YnKiF#`=?}w4+gwKuf z0!aqKq31P_mW>uu;XA`P7@(MnqY{;=Trz4dtun(4A@T` z-|u$<#u6oVSr7n&)sRI3IjbD{9tZ|}LvjHojVD1y*** z{;rTQ;2>6LUE=c-5XCIZLYf`@3WBT&hmZ)S9KiIANgsNpD3S{lMF3PARMrTi5?MQo4Ne1Jicnw85Y8I8rmn8r~D3<;>ZSfpOGAGru3iy)y+pB;kj&;JDM=Kw42NEN>iRX~owLgwQeF^b40_}VGJ9cOsj?l}4k z#!?$XiR`6#o-x5pYAfasj{R*yhl-vQl5bo8u1x7>7SXV+r$->XzMog-xXFp3@e*kWPWEkpWWHIw{YYB6Jc7 zv4BRr{5O-v<3P#;tz=uad>WXnkiFwcK!zu?!4KHYu>?RG6z|NtU;#)g9LX1AlLkx) zc-vv~_P<@<5!IxPpdsKbfM?BvwN2PQLG25??1nF)N7(hWl8l*d=L8N1p2I&?F>F%!i z_IO=yJokJ53Ey$dp$vQNwa)mhbDgyaQB{_~z5DPk006jhvXbfm00VzSqsF`g{?|-` zCj~ZS9n^#_UWDULeaCdh| zT{p9CbaA)rJG6Zz?dis>U5t`;Rm%2T0)weP!jYnoZNT zv06F5zTcZgL_zk}eMchjQHt0Hd96b2G_N>OKk=?z*@xCQ{V9`{GZXzT4#+u4?>i9c za9qI#H0XdlqQ5`<8ckk9(gP;q`A9bF@#BF|=*>UO%D#pwb*3r*VN5>cCk+h=QR_sm zCWSMv&!KDB{dh(lMF*jxqS}0Fj49%KEK8P5%9)DBB}B7eBn*GZXRB;DH^*cB%k=KO zd&)zCn1CCPvBh0XID7@RtQpl63EhxVjarFcQ2tk{6>zxET>$C!UJBm5kEbirl#4FX z#!iiwfT&Q*7(H#R8S?k>hId9_HI3#9#Cxx3CG*?izyKjiMjl+47~%zV@i1d}GIDpW z#qu?79r&xiB4=YXo`eGKVb6dDCkug_W|NAQwDvS*l}zm&uVo_|`08NF&N15~h*+z? zgrz9mfhMsZ) z?Iy3D16VWaW&yd;!2^2xv?tef&JQ=jon6|762$?Bh)NkwacU((5DfXjq-kg<^ffX9 z5X5dUCT=wpf(dBD6Mtxl0kW?bJRV`f#d`6;q1>qlME@+)2I9~7Ek7DKFoLfa4|rt% zbI1gIM2IN{Jb@5!K>otHf((4lD-jmD^AX%(LJx5WQ=kxpq-q@wDAr1Fs6)xY3u|#u zoYbW#Tuw+6-Ec{Q>@D?Uqb7c9!3Am+3tTG^z)JWB%Tu4gsZz3}I^0kLDR6^Al>7l> z8YcZaQ0fI8a47$TN7gsghKZU0SCF-)4ZTI6QQQ6mNwIwMXc!w0@b^GbFaOVcxeVZg zFLG3a%FNJxK$dxA!uuW!*s7FN0_Sj(q-MtiILgX2vrWkwoHm3%1b>*uH{e14t1`p` z@YPPtKUdXaD4N4*U_cl7)9MExb1>-Vy8tC+dfZcY%EQA`HI)#|`vr`VRKs5jB9%Of zTsc9S4blt$Vo5zl%n2P{v0(1vu%gr8;z0bN<=uy$_&(ofvKYTq zO>)Ms$OjfySEZ#wNpjZLA2c{!&~&u7=VJckEEvqP)#DqbYDFe*ui-uvOul{Ilu?8H zMnCO3T?EAhYG}f|KuN2|!_A;@Y+`o9fENK0>jya)l3X0i8!K{ZYHG)eo~of|7*MfL z+AcJdRuERO7+TRIET}0ASRx2-`w+XImd-^WBo_{)8!v`-D^^v zjNUpqyPLTq9U45BSXdW^SzrqTrQ~t+)^3OU$IF6k8{cmlj}I@L8&@McQI-?_l~6VU zs4zdk6FixOTJc>lUA*PYmGHDU;TLRj6Lw8^)(U}6FyR3u;=`U>6`z5jI!kP;G5#|5 zz9M1;PxD)ql(ujAfbmhM?jLYBlmPfzAmXN|P<(DkRW8zRFgIR>{jn<~GMVH#z{ATC zrNF-9sq@9R_c1h*N<=f^>he-eN2iec*5~PkT7-W6`r^e?qPATd8erMX>{V6m-qXWSV((W>}HR%`Yd&LjC4+?G1hyP;Bh-OTL62aM?V> z*DBPczbE6EV^sgHQqJb7X}2uyL*D!tv))1_!h_$!E)JqM4R)@nSH;@pawnU-nTknY z_q``YbX$%|H%|{3tDU=e4KNYsa!)OGip(@CWM3DlR^H81NQfB75K;*9GnADIyUGbUI^dMiT*8ae}Pb)Ey zc_odZU+(s)Chu)S#ImUKT^QhO@kbXlNWqVdzW@t6OA_@*Bnz`=vR;SlT1fGleeEtybXw=H)vU7+YXd@rTqVTd@Ki7eGQ3~jOnTcoQ9fFHA zc5MzT#=gLa%b(%1-!Jq1{RB-3sB_+8Ko{{Q&}$6~JG@)x8^48#<(PONCh>O*O=Hr@ z0EsihDON5wq4Ja0ParjU5=J=ztAuZsqc z=ga4GDlzAjbKca0whn?w6X70A7f=emzf+*tlr?&I<97UHAL8llIodft;cQn}pjoW! zbI6G=_C^|K^{l#JlPm}Z@bSHDa694NS#oQal+utmbpgEu@^G@}I<^m!)Nw+9&kvA? zY?wekUe`0wMBbA@s6!TvSoLnW@Z5bI8%dXh>CWkqsY*NRG6##L#H7640t(^3R@VFu z0@4Hb`X$SnrW*H=Bc2}XIKKFR(^~%^^oQl_4Q11eQLcrftDmN+>7#*Uz#$wR=JQ5W z`$?VhcTOYz-*uVaQAT}%4P}z9e{;g`HvjrKcWdnRNI&||<84S(Y*BTF;>xD4331&2 z5h*o5-ZC0zHC9skg1Xk`mUemezkwZ6Y_un$j+v* z_}TrqAvfsakTmm8PD|#72E$NZSP)+njuMj(K0wV4vtRf+ki5R(=(a01AG%%eG?t}>#V`Wb7>~UNe#_%TH32l3AN7*9 zTee6K(D9ZG%KD?YXlG59gaaaXVzyFXUu)Cy$kOiJeeBy$+ z_88y=AWIudGz5uzRxYiRvTlxtipal0|bnb>ZW_}QKYLpC{oJD<3C#&DCaQ|vpxj&m@N^3qaIX`Mo zKGBH}C}#*uE07>_8wryw0va@&(+^R788ze=;5{quA7yfFhDc87&Stv0Ys) zZ7=L@g#`}>AAfBq{QyneIxR=y6=MU3KYo>Td9WCKfl$3VOuaq#BuJY(YkWl!8%FDc zt)>%h*_5W8s-Hej8_7-;?LG7?=LB>-LNQ6Yo*SKCN?nj6k9%Kjvlq=-GOVy&=4*9}0~L3r3rgD` zLdE<8K5T^Zv8saqkL8EGe|1L$+obk_)g>`w})gl$7F> z&{|RF%Qym{diFAd#8(01Y%g5H=$a00(oXfeHHEjtD5tUP?T*)2^+n^@-d9S;T`ef0 zN~+p??NkyS9+*lfCX7=}Gne;t?PmcM$vY)KWZGc?x{d+Bq>;yk4G_c~r)} z{SJsVOsWawJZq0){h*y9IV?rKDOPVdCz;+De8?xq*c<>DAD^N9BS%R9&;9y1byk#z zPKWG#u_Ytz>t*oKrE72-5EpIKZd9KyQs*c0r5AK`mV2d}=u)Du0j}%T89uvxD$19= z{a8lr>#YO3<^)IfvOtue^Gd(W+}y^-?d%MTc%}z>)A?kx(c(?H{-OrfRE`+yKHw0_ z{7E?gz~txmU&aJRT;_&JL zqCnZdf4Do0GPO~&XKoaYs_{kkj94yUR8no#5hGb1P3M#IJOi(=1kgIu?VNE(7} zIVb_I19Eqk4jmvhJff==lYTBP)(*SKaXq>;lVi^$xCOoV)uc}?fuOWl{Fm}vq5AkC_dA=^^LJm4 z!;nh(Gwyb*5V77w$Jq7Zw&3G&n^SINEfI%$+#OtscxnvL<&F)aKc(6Gl=P)--=0~f zCEKdpce2;B+P$sz?HFPg`AR{}!bf=`iX*ULkbaTg({4k2_kOs!|9cGht3pRE%-mPd z&!7WNaz_yK(^1a(BFu&!kd-->f|JnJsB$3hlAM7Sr(@lL7Ug!SR;p`VW-9Q-@^3Q! z3iAu3Golo=eArXz-->Mb+;kxc_riUsA@y8)UpV7;E*9VfGj2RhvzReT5wM)c?_FM# zIoaY{y;go@d6d!GhK9(EmR+W~zxRp9;Z|AD&xN!!eR#5@DDJ?>n=)GFj+5wu*iFzmCt%QrK`qn4NSa5qeVrN=NP{k_-d!LWv*K#)R`W~0$KgT09Tym< zkmR(5_YeW?#LsEFwo=sTy!|`~C|Al`4@jQbO$1c!hbW1Q4_d69wvI6?N!^5P!2nO? zeqGl>2FByqoSWr3L|&L*K7&%qDEh#5x!+wt7$6{vf8dn!fUjqSO0MkP+ZyfPB25FJW6H$+dn`AhBCowE zA&tSu0RNnY9vkrf^NzAw`B`XxPgh8Ve!4#WnV!%EhVoRGTouchy~>%rVJ0i%8Kd$C zsrTL2-RWjt~gb=k+S(c+kAuKR^_U&KV}W8lF=mZQa@|gSNb!f{uAHe8GtKpzIt z;b{VqMlPh@c0vAu9; ziUovxn+FpQo0zQgVKhcN%7)guQF=pprmy{hD7JTXWUvt&6lHIjhVlPWCX1rXX==#g zDHeE&5++jU--96T-GL~9*r|994xKO$eTedA0hl5xN#LSgH{u8mb!eQtBr1d)JN zC{c_$)5X)vVej6Dp!bOm&;HE;0FW($3U3HJ)T7t4%G>Isea3Q z4nzJm%^SC|fzN&?&%6p8os*x~xukN`5uI}O)ZegkVnQlXDRyBXA@}?r2{>y=&nvo| zow9Ffe$@Rp^@YHJx^V&yMjTZ7%6{b!Y^2K_m@(VwRg2w3ShSm9?B`zhhWG*h7PO!t z{~PZOM2iT>t#Q+kB*^Vd+jSIETgQGFw~75D4aza&)wXYHDq+; z!+Zicfb#opW7=N3Qg}>p`MW3c6daZ}eKtNbO2)YlCX4w0CW~C4c6N5lRH{MQ+1a2e z^?q~@&+4+jj^J;?0D#4aBRJ53=M5=SgM2L9pLho?6vfXt=yHPVh+!sJ=jZ3D^AHJU z{&V^;UFOReWh48QE@GOpThFLsKZh86LQCW06BPuu6#R?{Q&^$jj|A1pqhZ}70;D@`4aG|A41 zd4!1xC_hyhRzsoue|-E+31m?LSB|n~fvu5K2>xgW|94r;G^F=TYXJPuXNpKBIdc8ex31M-S+Gm?@tSW?u{mw2M?u%b;Z6nXTpHH-x0N%wr3z_GEBEKBu0lo z>}9RXawk$sM#_O?4>LAM1_tW$fAIgWIF?|FB*1SGVP^9zbs~b}_qqpmJ|zdD?>SPU zN>p0O9^2#OuX9uMIL}@!-yWA7kT5u+3j;A9?(>2B{eQ3uIwAOwSQtPx&o;Ia*0G#G zU;Aq#aydtG;wPnP%>kA6GDT?NF?xOOQD&m~WcStC{ciT{kdC^?|Cr_fcQ!I`Hh8k_ zrTU7yATtkFYCdvzW%PJyEsbBsD7UB1L|=rd?m#`XM_;&x@^)~k`_Z9rJz`mK(FpTj z@-TtNG=OOcF_2q_JR-&h zj@YF^8~E3Z|F@aw0Mi~V_%GZvm87cG?4bqHY8QFV2506C8)Oi_Jf@gwM|9IkhQB_g z5#6Aus3aylR*B!`|4r6YyJ9BN0kWgu`Ce$;!?$r8essLpgBGSozL6G~{S~I#(0J8D z|Et;t86tv136R`JvjZ*Re`wNy8_IwUoOYu_;UW=tf5HAu;{R*PKk1u1+242F@axUWr%~mWf@=Jq@K1m+Gm{@ zgD713(_y_24jzqVjNI7xTF|id^VO8n_poQfMDlfaP*Y)oQzb-;34v2>`-?eENEYA$ z)uaaQ?(V$_e4-b*Dk|kI2Mk)J+HI7b_ia%y_veS5ZqJD$9|@w$M=o2ZN}-=VY0m2@ zz!1qFu|VW4Sisc13|v(9r0VC`q^0IL_ACmA3_(U1sU18g9UI*Dp;AHbQ*O!+4^kI~b5PhA4uq z>A)aixMhN?<@ZGq3mgJ z3k}Fp)6pfa4x~yale-4#N zuNZI8ag1C7!Q=dlAr?zw8m@r1JkDd5oR;Gf3+k+dy57J zujWx0BE@r{1Z|W@N#)FnFd?M~_*5C8&Dnqlj9mT{M~YGJ5P;KTLa28J$c}MfBix_` z(Ix@(4GhNKg+xTi^&Q>u`5GlA=q~DSxKm$mO4%Zi`ihf|IzB}h9dqxRMeo9iuO9tc4 zJDz zBb_NZ{KIN?yf-Z2yURhZ>j=`DX%`eqlPFEt`MZwuL31oh?iL}yP_8k3 zZ^GkK1IL|l5f{$$%GiidA2%UHIWYe7>aKyGZ-#HHqv~Y$>8)$`WLvP?ZvkoZjP_gh zzU}DfU+0s#3HVvZM<4p7g_fD12#k&`wM!Sn>a77R!JFmeVc$Q{E?NKr?_v{p3~Y?l z7th`@`Cc%oKM^%M?9Y7b{~+UK**x7#zL#cEq2Gf|$e~G3FVwT3o?0v1B>4FF%NrY6 zzW3JrGFn~6%OnB0?zg3Bs_v&uOoXbR((j-Tew3yImBMQ$KFYRU-$R*z1iOQlht{ADk7kFo~I1pL3o8}QYEil+?~xOL}CUE>$3G? zZ^DS^@ExSuiD+++>ygS8QHERCKqRGT9{KioE-}7<)OH*gQ~Iub%wt!u*-@}+R@{D7 zqe}`>(yscBbM65D21NgqQNXYr!+0$~FWx0Kt4lgMEP{!n13Mu+|I=%<*T zJylkiiaps5DTgc>bYr%8-ORM`docY;S{6Aq@FX70(?M=O#8;A0l874`Iz|Ry;o{QX z_Z`N?#x8IsEzkeC?NC)v=g=*c1o-(@y3l$GG3Nh$A?lOfPR{8!C%n9tqSl-_=e@7Glj-g4Ib5l+rkPfS9WUao zeRz7Tc}Lko=fU1v^us>867rWdY)SPI`Yt!C6upUDXl9GZ>}kO7dYNptp0u%;-Z@Y6 zAbXRHaZrD3me6mC!>BRKF#GFQazBz*#may?ddi#{DMf|!`}s=m|GN49JV$JP<2%?X`STA<9t2jQjoURNLVv>kS0!e$*s>W<>O2BYHtoFix<240!+=dq#tCY zizpfyRRU9O-sai3cYKVlcl+SZemN{3(B%=j-%nHCHQg0e`lhs&T@S5?J)7OP8gQ{d|44w-QfYyG|C& z;F+r+llKaN^XD7Sr%3w4qoX{9ZTiF1W~u6IEa3H@Kg*r2slx7RXKA9|2_8-q+!>}y zff(@qApQzRkS!gz27Gx_Rt7v^?F-TAtB2Ix z+_U6CJ|=ym&Pwy~PLOb(&77~x<$=~OpR-)%+3(MI8HOUHk`*a8T+1#Yz8BN13tIF; zvQwQZYe-G@!j6pig*~2fxZ=i$M*QzQ<^&b(XA_IFmB=|uFA~bed@=%{*Npi^UKLUH zCt=PX*);2`eHhg@r(CW+EyvRvrH|;DieEB>ehkUB9^7;EF+Xq6fi&B-On$M*7p~sj zG%QN}8ka1?N%O*j3R|I!!%maST#le^A2L`;pc;z_L@dVLgWulI&!h6Oms*hn+*z`ZbA52zha3U?C@NJh6f8-*4V|f*I zR1&VU=Z0`s*)&7I76v+=I66PLJ}2i76Jg6c&2_KBy6MVlO^oH%<=#OMVQV=bwMMA$@ki<# zza-dmjSLtyh8+RcxxK?+v~7{W63@A zDIIJSXhVU8ju%=$aNRnU5L2t)VFq7Dd@1rG)_jn_qx8WRc}uMdG#?XKB%^Vbn4nMs zy1xfl8Iq9iiQ;I^p`jnGsl6z>+T?kni!mHH=RW|AS*=U0jyJJjC{qK=$UKs7j=2dP+T7^=Q(Z*9E(v=g5E^KQt! zf(e_no&;UeB_4KY`-3xzu_d>RnvR6KPbWgrLIHXsp zb+PH5HxGQyo1698zqU}dQ@?k?uf5aHaaT{U#eF>9;5gCGPPdSI#VpXN?VFFF8sc>9 z0QLsf9$RSnr`P3Tnj#I8y3O@Rj4IwPEW3YHBpWmq`TJuf2c z6+1`)NlbikNyE=(lad5@=oO3sjA7Ke`lW7z*l%eK0d;v|&g}M*;z|4BCul@7_(P-+ zN>QKQMHP;3&Q=izoTXnue}@?g|GAfa?Va^u;Uj5Z{8sJQUOK~sC2a3Vxb=;3`b@+V zs~TeeTo`-`54hK7V$X&Tk;D=7KByuvLi6xBU3JwZ$PV=|44UM-@b-+E{n>Q7lC6+xpZTDC985uuujkt}`w}d68LIM4AF;Epg+-Z^9oYA| z4iiB#Uqr+l>$>@kyK&w6HMSU$X)O+qR2ZZ84mLKax5H;VZm5x>bHp0%6VU`Vl63-u zLDw}iGIA!1v>suOn=P`%0ijFVsaQ#2^y*6;(;X^unF-=#8KIMNXV!{{G4`k=M&EvxZU`E1AWs(N~ zh}oBb)t$m?y{FtO^NYLZ@<{|%o!xdp+g6!683;e9Se@6GF%Ws)1_AEPCtcEn!14zT z1<94pFx&c(j&awnX>#gIBhG-sJO!pVdW2vpMO5aLt+y_^LyI-pJ(vMlXA~MW$uv7N zY61wrmpi2On>$L?e&zS~2sa5aG*ZV{zwkTLbXzu?oY#biy~o3sq~rX+AW6J9%X?rF zwg3L=KGlXWaQvZ!=EI>QlZ5oo*IOzEfzNv1#pZevrKy~B}h$o;lm@0o*8w= zVUuyUf_Yd#)vD#3p*epr{3ktUx^;m-x#R^m7|M=xYI09u@9gDxgy=8e@k!LHe{!AI z-pU5STwTgb9@{Zp*wn}IXN&(JL%Y4BQ7%hZxr)!b6tO!BWLy}I%r(t z`P0bq(X8OLDMXpd%V~B)lclZ72M!TZ0Xu92-O4u8B~mywstWl9dl2e79trR}o0ofo zw%HDD$VpE2FwKJPxunIqKi27(7}K(%KRO#2fJg5TqN1O0BS#3%EwLD$1&Rhpeb^hY zGp$AbW;1EBtVl};up9lHf@C_7kc=`*s2PrZf~n5Tv!m$y=_63;;oCj2Y<2LfVnGrM z6TsmVfWlV=IdbxMdV5=+ok?EQX8r7Bh~(x_j1iNb`;stAg$3dNZg-n}z`PvPZC$_ZI zEB=^l&n}Cd31RtmJR(PgZqE~?KLOS@GKe@l__@mDSxgu*t^HkJL@SXGL<}~*y}ip> zfb$WczECo~A*iIF1Zv3V$4XvF4rf22r1vXmKDS@_<{A%I_1R-P;EXXAerZKl??; z-h5jf^qHbS{*FyKzT3DT77X{etJ!Dpx!08WXW6Oyxcepj6Sj}(!5Cc!0H#@BD`6Op zIt~_a_y`MaD6(x52KV`$zvQ3b0!8dLGEQkMBo`IG329)7GhSIqV;PflB9m1PM8e?0 zyKwWgu{qHU*RH$HC|y%BMxz2qKuYnl8D;k z8tlmmSounf$pcI2Zz4?BUdEKk^$eDUm^`vV?}8?CQ}nko@M0Nr#Ty7#(!rBw8pp~! zfpxI=qaG7D49Ftu{-xafjuG^Yeki;vYEPHPDI)6kc~%dF*RZmbU5sd#TKqw)65?z; zzI@RE8krJun`_#M7(!@f20tDYe&IYaBE<7@(wcAY(4$3_vswKo@n4ra6ri?Fuhu)# zj&8z_anN{S+wRSPLGGX%Eon~!&E$WMYS5DlV%f5JFo-YrnWcliQ_Azs`kKoyDM0s0 zY&GFMwyZ_WPpY0CFeW=#i^`&050;WEOt!y+)%epk8q>HKbts616--<*13otNYlv{tFo%5Q6rtR3r^CSLVo1P zyPcVLkq>68SXq~tJ5pv3C2o~|p?0*;mVpAVrsLI&UFFApHf^5$BgMfN!wO$t06*~o zy2e%y9?4G05%p6+&+l0f_22yMi10QE`r)khWb@PBOaj2_#-U_bp|Lc+f&l*>pF?*r z5&I*AK0W{i+P-Q6L!wK+rZh(hNXZ)S&8Mh{kty4xh7CXFjETmt#JbJ>2+59sT=R|k zm_Wr0BXS169~=|-UBNVKQh6zcX$N zATVG>f>Z}R5P~03!LfwB*j1(@r%S1Xy4tQvKvXQ&GWx5~_T9d)uT4Z7IJD6_BDcq zA%BfWf|(y?zM~;p)M%|zg1BO_a&uJb^Nu|h~ifQ!+K@v()jQ9E1eZMZsHNd zzt_X-5Dc(TC;g_na|O>I>EwO4C%>Z-Z|^*!<&<(8PSC$rxS0tg+-V-Pn~r&}qF?nU z_R_P65Yl2c>CJo)3s}8IJG8rq`haH7r$U1LLo=q;CiMb2OEa!n_7P-0o#j@P7i)pz zq^9r#kVp&23O!u*3%h%@svgj(G@!K5lVUNVe83wOi!Df0p7Z`o>v>%p_Pg!Jp+0zc z2Xe|jcuPju{X>IT#t~qo4(}RMhlu3|w%hjg*xaH91j-Ynx099ti+QN3Ou~m z;Rd6#%rHGT`*W_w$LmBtrx{Tn``+u&zLbsu=*G@_k8Qe`>x(aJ=!BDb&9<`M^K}#1 zVWw53+BeKnC2^HFdl}}i*aE7Z+poG^`qCv=Sq{e7bJd=w`#z-WnwzaMa^xPUZtuf` z9$3<}tNtf%xdw(m7(u@;=xeki&Is|vW2!`!tnKF;2Lt4`>)Sx@YxbH)`|C%!!!CVf z9c#VJMC|YSs!;=FueVmei%}UFe6VCs;1w%^-PmwP68{(=9oqeh9ToiQaO-FPq1N?*w>6=&#a6UrHUOFE5Wmc<$qaX50xw zmPU*VincQKa-bXyf~Z_mF)2-G?K!L+82VKZvbRbn`|WQaLM;$D_eMfF;wmf}*5r$> zvmMDk*e1arlqz-gNnqnR)|#bH7}UhR2_JHR{$XL|2*H6|U;EJBj|>HFGcxe3RApWC z;*{B2>5Gyuo4db~<|lWz(16egz+1Z2QpRIGI5lzTt`2&btur+W!@H6cq9e!$D@Vn)CcHTwR zN3n3X0JsO9Yz#9Io&ymoOZ!X<7+Ry_-25a82Og~Gr`>N_GEtwU!lspFYlJO*oKqK^8WL{6FmhW ziuQNajklr_^`46yH$PDqHMP(VB|&6wWga)xyXjJ`fnw?1J6#V%s}Ds{gnW|(qEwTv z>z#`_<<>*8me{%6P?aHLYbclhK zD`+5k&Fi`}fKH`e;ayZwpN#=!@ChJ@Mdbx)RB5h)z@La1Ah|s!^tsxpJyy<<<}qn^ zh{;G`*OT|VJ-`5a)kZ#MKLm#sfUlAofF){?(jiYg2MZL{VE4>%wb+t4!V)XD5Ud?% zOC8_b$NnOIbIIe${X^6W(+23R+vN9n^@zAIhWM;@1) zH`{5YcR1i;erUB{&*C_d3lC8A54Hx0Nlix;5I{BFj6nfB2c3VFx*aFhCXV=mn#AE~ zRjI-4=FUoQbl`Q^RqXY`iu<{^xE#wk)r8>{49OqxNI}g{ z;X_Ko+;|?KZbyj~5k4_ja$(*!;@;KE3h9sBYuUpT0QRe_7Z(<}L4h{X7!PEp>$E)v zrpBYPxxgiQ=-{qgNdT&~0c@Ny9!O5Kfgs{E0K+B^@!98>iSltw${CRq3RkB)1=G%} z;58d1B_S77sZSgB^VJwQkrk0DCukQ$@DU9bDmnf&AOLcCAm5fIvgU z4TCqnz?!i%B2|h43U3al`~`Mr8Dm3rNNvT5T~Ym@EdRdK%BCwhkF1D#I99GA5sbrd z;n@)yf4miR;&Sp!YjfmV%Ho6GBqaUY@zK7pY+71oVHzkU5FyxxLX1BVJ;>la2(?u3 zo%^UBYkF`24J=_wY;dszkYK`Cc7RR)oVMSn0v?5i;8=q`Lj<<)RlTdGCJ+Lm0~7??6H5F@Rc|$PH;gVLJ^hxtdg= z1J(#|qvD1ZqJdZ}C3s@477Rpbn?o)^3NuxJEt*v{RKfgO29f$~*aU*0goAC5l+qAX z6}93S#F@kuyaGgtJ9Z!B^**eE1W~o5sciY( z#823t_m^Z<9Y6m{84%V_6UFsLTCm#h{xjQK4ud9_>0Iy0GF|cFiIS`ih0jSYJ|?7O z#a%Hq^u^-Rc9gs>cq>1XVlPk0E&941l+Ne~^~SSHWJHoFeZVHoZoWDlF331}rduGQ z{|{-D(m4MVt?B+j3_=rBro$cRmr9ORlO?k&qZGmpA)93;@UGI2LSU%Hfc$c;TTRe? zx9OFH*@n+s5g2KT6oP$cdR z?kQc%fBN?3Vx+?*-H*?FFimFT_w2@Qv-f8gzK%UEl%}E<+X68_DZ}BO|Ln%ZE|Qn1 zPUk!2u80iP4D{#kWbKB*L6|xwrsPk5 zE79AQP?p*%B{wT1aHOoJ8E<}NuOCSKLtzB0kAG!!-8gkjm6>gE4f{b$!{*tvOZjGp z|D6NX3Hg(cr`yvhC2P6I{i`J*VDG4x%f2wEO}r5liGPnqUwC^oiH9L-NhI{$=h}R~)^h+bB(j@yq(y8GqH6K|x{I~QJC+ZPSCXL_CT ze54e9Cw6mrnuWc_N%!P;`vZ{*chYY=`w$;4HymQNsEh%lIx!@eAsG#;gt+k zQBCS|=g*xgiL&Mc=?aGerMk@pzcPf}?Yxf9xoUj~mC|@MW@A&f$e!Cg(JImj$*wfV&oXl&dSXRbS?Y;N>;nf8xU50|?p)&2}R3#cQvwmVg zV4&sB>+<974g|wLDZ0{pywgc$&P5$i;H<~sv4V{u--U!rFa(2 z%!0x6;lmZyjTH3xPRkj%c;FYAvt6)wY#8`6_MxA~Wvkzya*o zvvJ zZb|MsV$=OLJ#}_R=<}!h{jUfg19WIScIc=sk~r$WN1L~aiOJ$St!xiqc9B%+Z%dqm zB=od`gMk51%s8c|5O#>lS4>gJo;XbjIkA&f;^813-IffZ0Ii#G1 zs$xBW*ZBg3+=`SCCyf5g^){3Co6U5an6#iMMqgFRm!i^R)X#T-)l^ zdZD{s)dl}r8ORV7#b$14n4QsL{amT$6Zv)^xvjIA6?c0+lDleXq~->L?o2*yuhvE` zEP*30o^>)N!-yf~K(EnG#OK+W^*9E;Fsg?YicLZTeOJ3cep&5qM1TE&5MWSxppvJ6 zF%*?Wt0Rn=rSg138FzCshqFL&91Ea%qQ7`M*Ww)9;UC1~VeD6=+ni58?PfP4kL`CI zGGRM~Fj3cL(I}z|!ytD(Vp2)}&GUNERM2DnN&L#x3E61A>Pue4{ewZlRpA8FcOM)v z(yiH(pXD{2kPkbj+jn-(kKKlm{w!y+`Y7hOvZ+;MR8IMoLNPEHr{HL9P@}oQwa}>b zd9_d1y;vuJjviRQuMq?vs} z-+4k3JXs$=#=z^?U~3!QUl#)rx}Zi38s1rgieOhRF33Xh^wUD+KxvmN?UHWYN)z;C zK68@h)3+Tks91tB6%%da4My6=#;Cd6;RGq5*vv^z&LG5Z|J}P(msRb1><7&0%AHwz zICqTSh2`Tke$SYE#k4Z-)9%+2Uvw(7$1d6;!9LF9rcs@piQaqlS=nSc5<&MS$trdq z88yF|AvxtwEdTV{vX5g9yo(|q`aliibSGaer*kAjuZHQ3$gQ*dSMesB9vZ9he1m`~ zhdLjnv>JOKziGCjQIbq#zR^h`3d@zJ6vS2VV zkDRaGTp+S%9(mn%lbTg*(vzJLpYV}c4*2#6plPyL>4|03ES0uhd8Jz8V!7gz6JI_} zyK=fCB(KkHMwtY5$7Q&4*RK9d7LPA#Qi_g_E+R9S#?BM)u8@5p`(}Q|?)i!>JdTG%y44;b+!MGWYoqBRg?f`5+m#i;zLyuIf=k@ zoLtks&sz1VVXDz_7;w=rCi02WtlC#_kMk$0lR-+Yr3F$7pIIOXS_8q&&c`I*tS4zU zSS!C8&NX=!Dm6y9q>6A`X_qS#c1GrG@s*8ohLL<_y?L7!R{t}2p4U#jvqifd@45Hx zqyE(=&{EsdnHuxxwYc4f0!oWxNl)pd8!Hd^z9CC>Yr_e9EA7veABsAfq^?9dOK|?reDFo^2&O`LDCuftiW=ixI((sds&EF55fjd#L8g`Rs?! zM6YF81wOM@j%0gkB%iL(J-q5bdSDob^j}$_0;V@$bM3pteK6P)gf528goT$|jTbSI zPDMrGdF_<;3Ziv<7W)S?AN_EQ)uHfCS+^>ouYZ{R!tUTal-EOEvO=Cq$jvL(tKeL! zh;E3VOvU>i=3){30PmxpDTF?l&4|1*dL&Wm`ITX;*4@5Ht+7lT%(PCM_a~AtV!$hx zW?ech8t=I*w#ymJo7SFo59hGt-wydV_d3k>I__N3uU|N?yo%C1h$yF%a4>43`C_gH8;!6 z2{pKFD7x?dHp@9Dyo-$;MoVWIpF#tCTz6U=`=YZd-8nyUyEp$etmS;(!+-=9+a^f$dJZzetUUcS^aw0)5fW^T*`&|2_PtOkk?0oRkC}*aVv;%3Jo57EB2(^f8aRL=sArKIv-kJ9l)qn#z2ROCkKRXtF5h%JA^6?4sZe9X$Uo zKr0=d^~`$mO9LIu_$tkIkV>TXO7zsvvY%$)Le55QDl8{9DE^L-?kmXFgjVw z;|kE{e?ENxrM`I3u7OAds6$pmxv_oRk4jVczL%Pu|1*h0l&Pv!vP zG&)yR?hQ4%0r7_q)tr*~AS2;beC4aPUsj%<1`b4M*MrX=w?e_}p5?}T>X#gtF__q7 zkU0}3lK?73N*d%HaTSRVH$-Hnfv-DH;{SFYnUYBlBChF0!OBmaUO6zCzru89A$+yB z?|dNBm?UD>%rvy7-i~#gs8XyVr#Dj6%RYNAZLoehm@X|vhY|wX7hiKNF-Y1(`hthF zUuB<9Jd4IX{>dnd4-PP(>RTb=a@N)k5=SKJm>U;1-K{`_PbsxNO}5Wex!l?e-t50> zQ)+FVpPRX7;AvLAZBjJs8CU!mwBmY!bnkv>x_oxrDRuxsqf$Zq+5&WSIHlE~jzgmo zgzf$mKd@~DHh42E+BxJrEF12JKc#x~7;}NvSMA>1QqN~S#y!%= z2!DWxdoZ4%L@xce(vVUm;mOHTv%2Zo?X?{rJzDSl4HOK2UeSa}H0=wo(O=+vjnjR& zWd#(cE>ujO;z(wqh~JXHz8Jb4aRve?)9@y*u^hHA42FRx9j=|uCi;{EJ0OV1jV#dM z@<1SHyjp?Pwu3W<*=(h<8hr-z0rE}PhuPw3?d800@$5}T^S;t+j@KT{$X)~W4tMC3 z5cq|NQxOCU$`=K)4w684cw7FH_1w7*UKczLtS!2rWQKZti(dc=?yq|iE@0CkK+jWG zBDO89SdJw~FGdEkuMqc_UQ3AQPArS3MspGgN$yXFBB0UpDF8vZ!iaEBUCK|ZkM>r(1UBMW*-?^zxH#twWZ)ztzESOSWNK7g`%)))^QmrSomoc%IRF| zUI%@3GLsr9Y%bMQXPv!w$PWuaY+GS?msFG^8miDcQkh(SHF#a>Rq=My{NDAsuEzSt z3H?Tv+Kz3aTRPDcIh5AzWr;ajpxDmik;UqfO!IbP^lKO$1DIe`z(CkqJ{xYp)M5{u zSeRq}Q@c!1?P|@ZH-|1gs89lxgE;2-N9Y)t?;^R@G#+ypfh7CPN##;=)n%m267(6# z<`&QBcQ=Gf0y*w=xrm{F^3Nbn4z2)dw$?hP|d016kIbP+7#iC-Up~ z2uS1sy8dI@)(ZZG7%Et48r?dLhgZf-w{WJVO2m)hHEllQT;+bL+|Ox{M)X0u^})RPdhlbA4!7(psADfv;jn+w=tG)D$(XE zf|!FZ2tgS9__)0FoQ6nwci0868iyo&e-tF4%nST}tc-5-8V~L9VE#B}2!QFM^aJC1 zXb?F`&#m!5UVXZ8^g%d>t}>+ergBuCH^!|*&#=~Sill>{2nf2~6Vo^9`czs4HRuWq zy3Ki?kT>JtskcW+pJ0+mfWE7_s;~JU4nHV`i}J34O#}4z0V`%T?sz?|b=Qq%|H?=q zm)-GZJHLnV7aT&c-EUgZ0Vzzzp3qxm-+eU;{`)OHHHa1Kg+C#sf~sI3*iTLj@4AU{ z67}W9cpB@CY6tXvg%l$XM(+z(pH*lz*Z>C6#G5(MsJl;-_+}mGZpAR02mvWN+4x*2#mu${wgAn9pIX=Vf*MvuO?}GpSBZgO(ir?ad`2OhjYPO$__Zm27lM(CJ3q`??HbF#v180pi4aQ*Buy&tG)P4B@buwc zAvGivieP|oFlcj2A`V`A{3;m0vMHFJs2MSuPiLfi*~Y|Ez~FFbJa(Cyw(q33j_mx3 zFvOufLx>`wF}a&DWbGLUwH}q{S373T(U;1>rZ?PAwQiQ{3_vvclFjK~f$s8nD;b|8 zq9O_A&OVzMQ6fCCl#h{k7t#aJYH_tyr%iVQOOCsziuC6hNW$D}m!sq$e6j6Iv(C1P{{t;@b@^ z_rrwmD5g7Psnb&0pfAuz_VM)KSDu?9w;tG}p3qozlL*I~E{tsQ==&0pzSsUocw5C} ztaiKkkm4FJK?k~yn!y@O)r=TM=y%GSg1o9N$~vn>umUP*^q&r}is_2nT!bDX$Q3g? z-VZ^sgS2Y{^~>A(_mq`C(R$xxeR*=lcViE^uW%azZGh^c;=;!h<>C1&)x*CKa`+?+ z;w4-@Qff|o(e_L;mbas_gCR>os>G`fP(~)M@V$A%X-`-$8Bfl?N(if&fPS{vh?v-`h>?73Gb0Ps=vQ*VmiUX27uhA@gvaw-JHwM6 zjR8xYA(uJFuOK1p*?woFyKJ*M&Uqg}ZZ-)lYzvwz^s=T0gXLv#ZWZll7{_-LukA}} zcf@XGemw_&mJxC*$q;JD_H**Kzt;pjuQi_{w=Ut;-4$3)+#!kit}|B32*Pb6j0vv2 zZYA0}{3#!AdyJ^CY1%}F?Ugws{8&y&SYckbkCg{6tJ$4qHyIv{qoRkYPgA`7R;KyK z&WmbL!y1!EN1}C1y)Mt)xUm)$LDT_1jOw0!TBw(cRb+Qs%R$0}WCi!BqMV01r|D!~ z!~EF{6u?!j*~Vr*{$qotM9G3bvjHp9p04*L3oL)nW_WMjL?!Ls?vzMpms0 zr*d>e&xodWj=8n(#}BF=-e}6@;Rsv{kS{<$5R;p2XpBhwSB6IV8ng-db2M3o$F^X& z!ylw)H24N0r;-7EWjSx(KcTImH74}WZEjG=DD}ooeT{_ZpLRXEXRqa<2&TBKPF%?1 z`H2oS&g=8&ei#vC?RI^v+#hfmddL*Hv&khHKSQgc)_?F#6$D0(K>YjqmsZP<(VFFg zbze%`07FT*$&HES#sZL>5}ZOpN;>7z3pV8_Ci_OdxT)1p0PcVDQ|Fgv2G~bXR!78X zWHVWUX(}r!0)*jOU(P78V7x(;Ri6iv$nijmkMmFBFOPfUp}w`W%>zgC@x{|K?dfmP zx#gkLMn12g0$7iKt@(%V44!8D-XTu8f;lt61e7;vpvu=XftN+}LSvycQo#$dD4flN zlaGawTnW-nz1)sZK^+|(-xe`cP$11>y*KC8D;?0DJT~F3h`>G)wwP%xuF_mo6VeDh zY|lFH1X~ItNp0uLS=*2{9!ptGFp<8d0{W82EEj5WoKsq*y@+OoJH^7(2xT?L?w;EDk=xUNyv*(fzk+;d}+lxl%}5>Uat0VU;}Q)G(N^8G&ovAkOw-;ZFF>< z>?szim{LAnia2lnM?Cn2zx97`gWXSQiT~;K`%#R!%0yOv=>!jUAAq>uZvSHN*zKfl zs@8zrq$hz?MlAfU!*sAK-Tb7?a-dUx=9o{cycZfY`L^)4cg8tWv4rqXAv&$8CkWngl_6yL6LE%r+%v<1CzIIrpEc-$?myD$Mn)SkL$n3V6!goCsuzA?;6undyx~@xRzVT&M3Zj)q{-*f<^5 z(%dB-<{iz}hC&j-jF*(RetO&bEaj|{fYtP)Sg@TMPGSUk?n(Yv*UA!zK;6~c?gd&G z8TAA6zdZtv$)HPr-xdN;AP{&k^D7TU;P}rM+=tjpAd3BSN7hINpLmRb{^2g#Wz0nx z;ybp<^PctB96J|^Y_W3GBy$`LRTZb{G$wIZ^z0&Xo?wyjT4wNYk}j%17#goj5f%*O z_+DX45O?a1rqiyE3c*Ssy&pG`kVhfn%@e5mmY-a`O|`-2iQew;(o?2Z{`?WT4Y43Z zwWMUa#&kNa@d6&gpVK9wzMYWEF7Ce4!cIaWh~-w#>xi8kQM<|0ciV%Hs8>hB77?u1 zfxV|7sO07`7Qca2=)u*$iuNTS0s?<%-7MA_Ptjvpc4*|wyM?-EA@J8Yg5GRj7^*+2 zRguz!fup_Qg}w3_vl|LIvY?>UNTRT(MQO7IUtvvRZ$rQsxxMsl8$5Vr<`3vPObkfm z5P=udBp{TiNv4SMUtb{Tlu*2DnAUeeC{Hkj0<0ujl@kJHuHJvSUeQZR5RC1P?sd`c z4#6^=Jk3s9to2uYKVB{FJTTmQ5`o7$o#$#XQ!Ki{Pb3^)((O8y^Nv!V!El4U;1CO! z)hJ7EraXT{r>T;|Vf{`_riH;+%etvB`CsW{i8Jf#D=Jfg@E-uDCKMqB+KIz7LG!Xu zL-9zJ4;f(6R>33n>TeCYL&grd>@DYi^Wr;AU8Xzlg04aHiYuP>bDm6VvgrhoSFvk& zWdNYh|9l%ZT>ioF#Aa(_{K2+k1^R7k?hd0a+59`@a_OaI^^?7SsL-!o0&sVNvX=c1 zIIHMK%~As2hleyu^B`x_`rf0H8}F%`vk4Pu-JHO+T52@52TgZ@FZC}`;CB6DOeJ44 zJkAt70|L_Ne|uyJnG_G?EdY>}|6yPH)1Z6ceDjKYZEgAre0(mBi7+=_&!fJ)$Pta> z`OJX#KL|#iB6uAm)oG$jGIp;&wh$%|9Bzfr=5Q)ltkl4QM&#vsd-}!EKxObo^RGCO zQ~rH;%I}-egP3rvxFXHzdhAQVOrH{4r z*FQ~Bu<2nCccsBSn)g~Jg>UsdPgK60-Lv0UV$R|5`0L~O@Z`Kd*TVCPYo#|iPrN*H zMBiWU$zC1IN0!*7ey~DnNyO|PWd8X?H?x>*&JMjBCk^pq zNbi@K>$cs_$i|7awwJM`>+YnnINHy0_qVa~8@#&v`?Ia|vYG6u6yZdLpU^-zt-6JE zFtfvI-Xq!A!rOAYd$h!6^$4{zn?SFea)13C26>zJ-kF0VhSX0yg0KYLMH=$-$<0YA zT+`8PKCb@~A#-&qe8K+s5!yEs9PQ^HfQXyd!&#k4l-_0&-BUH|kWrpkzv0O2Q8$!Ol_58s+=HmtH ztbWJoQsq>b>yyDnyRpg*%H0Pd&pb)@m}Kf~oCG_|seQgzx5JJcd0SJn!eN* ziSIv*xNLv)j5KhHTJS#q&aHHJB)!SDY-0Ov-tk~h8JWF5hW%|iw@1L;b7YxzLylEq zg-<1~fcf%QWLR_5})IQ6P(q2eBs`Ri({4U?$)2S4tt~?kQ7F$YIle z9eECMXZ@PRRsHqnndWZ;a)F)CG+K>pdKcuiW-E#W&gpRnPx1op;)%0SSfm>2zcef3 zk2c z*9*cXZZiV|#TDN2YhJWJ3m+~MiU`9X<+$ISD+Qu(mzV?tQ9RBJDQw0x1pJpA@$^~& z1?TWQIvOgR4!afWEoU>14nF>G*47gH6Oo=jkdcU1W1o=I0A#8rt&ex66Xgen@`MZZ z(NfS*e}AHNN^VycL3%f6zr|sYIZ!LlvU0~i%^ysp_IiG#lertu;Bx~V_Py`y!G!!z zr{R>zVp*Q^>uWh;ppO?vZsO}mPSmOb;mMb{h;CmLZfDi0$4Gg5w{X#v>`w7>c&k5` zl97=`x=Y-b^`irJm7h2~JHF>rXew`rvRy-0;idBk+0`|TY_cwK%Mbfc%zgY$6v9kFhC6P-fQm*3Y0jEa3 zmtZw|ve4RVzS2JN`2Nb`^F*eXl^Rd4!L28|8_ZPMg7@)aOGz0TX+Db^A=_%MdTo`} zFpXx_H{75t*FX`{<% zTfGiP805=8>({T&7IJ+qSY9yl%_?`Xk!{N^o=($+xyuEjO>SY{{| zO|z(g=S!(o?_w0JppxUY@kwB@YO%uL&BAWRokn@al18O9;#-l7~D@jCZ#wJb;PrVS_!qAEc%G0h?)823p;e<+={5^RgX}hSoezhwrX#$<%~c zK_(qj;=3}CAqisQuc+4*IFF4qg7+Ue?w!x1HqORd;AsB$*O@b?$qL(Q&f%phGgA7; zyB(;2dsqT)g@xZI%EEjbnoX}gQD3k2*?e>+%U9~{KdzE#Xax_>&VXs_w1J+ zLorZ@VD{%ZJQsI1W0wQ(uZZ%(?x6W_ zj0Z%9S1gOPFUg_SbFFkF)SK+<{p+Jc6aBu!nf92MOk2it_^6>jXn*`Hu=mW|a(z!r z$A4>c8vrXX_!;NGpY`fY6FH3UK$s zlKvx2%z%U4X0vh|K#wGeE-~!L+zMnN-v574BM_vOO>1@7pY@rqk^A1FZ6pEwRD7~b z>27KVv!Mn#rvfcDYbl*32erx(BF7g$FpH!D?}A%#2JH?1^6&|_1O)I|O@~4OVwmXG z>~AuFdb=*_&GAyXuCBbx*uU2iEI^ z^#H1Y%I9@l{JJ*XSPuJs~dP6Cs zUY${&bXWmSu#kah--)3XO#$XDif(uBE?RT!aTsiZ+P^sl!$CiMzo~oi{!`tS$Owa4p(f0V%jifzjRxvC3FP+=|c*+^%UAoKys7q_R{nV&j=C=NP_ zOc7RTzs8jy+TYFG`jTd&3b^y=xwr*1k{Yb<}h&0h^H$6DbK6 z>%_?eF|E<4V|D~T0o$iyb(N@qwAW17lU&k0C?SI?D1aVHP?wIpObp#1=xxAt4z<90 zS~v(MF}RgiN*)iGcU^UgD&#XV zqPv80;V8*x&lds~Q=nl1}Yc5(^V~b{d)O!CXn5 z)WGMT3Li92uRhbTw!ZT@w_2+7aGUQg8;Sg$SoKJ|rHW`@jZMEde|13P)JAv0f3v?7 zm_w2~$#A7_B`u3hAZCN!+3f>70kIE0u|6AGd`5ijOMTROZ5?tE*IH$Th{)QB_6PAz60Ya@*gVgV2+kZ%O%sPZ370_>XR?H8HRk`xMQInhZMaE1Y z-e8FXR{8o<5RNmJXF(e-H70qNmYnt}Mp+nOLhDGPTDv)$p?dD;@yf(3Yd&cse+szR zVO)nclRWj@Dh5E1BRCea-5}ONt+aiQ)uf&K?Yt~K#3|zuE{ZcpT>eTwpW84`pI1okxGs$e^zr{q%*gn)`n)O)^t0!oL%gUfZDEJLzeIK#KDSQfGdyW>1 zsiG=Gd^c`{;QirezZ)4Ox=&buH(qYW>>?RN)R>x1#Agy>GzkQsnwrq?_Z&Z}b6ac% zTBy^~2!uweGsGftk~K(4fU4EM(Vb**N4S)6>TdkMejRV>%Wo~4uMs>2Lf?NYoDY?z zbG<>&2da%n1Dc#qqIZ|Y6sKiB0H1z9Du6|5#q;CimIrl-!rKKWkx;k0rNx;+46J_U zCD2^hIL%RSy6+P%HLeXZ+J|a8IGJ+Fr)x>U0}%=pxiJA}?;{h1*Dtn)X{8pD71@Bd z`F!7Ry+3W^d;#Mk_~T%CV7Ei_fr8Mjt}GqZewDZ<9GBh!DMA^y9T&4~B!45Wr*Jk+ zeuNrHn^5tybQrLztlv{Ey(8BrZNGMUYPsNSnnTBFlIcji-0C4t`8Tn`?MBxj$Ht)+ z4dA7SK(;0R#TkFk9L@fVUm!Dw8&e0;gBnJPX0rbI143M?%Q|3HvsvBNuE*r9N!r4c#S9d7 zvvV!M!!MBn+aS-!o>{%Dfw%L~kc~ar>5%PEfCbNxjiZ<{E31%ZY5vN`mxA2imN;$p zqWV>iO%e58FP=Yk@Xoa+8gP+r75+(IzkN2$HIxhpLnu6yd6jG-+)w6xa2_o>u;*aA zRRJmhgfD88(-`qA%aQEiW5Z~&e^1`xOCp+inF$$j@+FtkZ5C?!CKZ|?8$&opI2;|h zD!Hp0S#z`dMqcu}4X(Xx6gf(b7AN|TR*PW~M+;w=@&!yki%6gtZZiL@45p?4lCTD) z5aI)BoXLQ5Fzy$&!n%=wY}eo23`d6u7KHgE7_OKIB?zOb&ZQFUEz+(Jm8Zk@u2IH? zbZ5(c3j!N*=$mYRrb#+vL?4sbhEgC%G!)kxgy@T>#rZAj*V$}raY}t3IBBOO(x3h2 zfjL6zP1SZ_Zl?-be6BnSF+G!lA%?ODQ1Qc1LZaels;TJ$UMm)%t}e`y)i+3QpIBLN zQKG<(1V|LZ)^hPwb!EfJa7jQSHEEtlh+iK3qXMc#xszg zmHT6-o@8$y(k-@-C+5ofhfbZ%!9*OZYLm476OVoG^xO7{bg!8s%W!?qiu@}c?8Br=4lk#z}pM-!YSsaTu zooC0^2maAJuJduR4b5b2(pcON9e*>c)b-~x`JA4&r4;jG1b8Pqgx}x`@g7e*% zO&|A+jeZTHR$JGha$gpj8>1;Mj1T^m;f^r7c4D$#M!dV&!r-49Gwfa4+90)I%CpsN z?oFE`JO3jWM?@#%J2f=;`6)0gLLr}(Wf42ocMhbWc7CQ-I?yDKh-)iMiIqe_c- zxGWn21o0qHuzx=gC<#RdnT!a*E~bMHB!9E-+mnJ~p@tl1_&V;NIFSG+0p&oF)kA^j z4}8D8MLUi~pw4_wq|rbS02`&M+#k^pu;}ufgN>lPb%QpcU%!Mx{6F2GSfR7KNB5EW z;awA&Y?QslMh==SqYvP{3W9*uw4lFHsEV7B-a-}qsjsFI@zqo^z*-$|9IuR0Te4^3)tQ&{Z<&cTn`6xnb zWoeqLGiUfHzOKtI16+0^NZx>T?x|Cy9W6#DXTOy>m3 z2n%RI?SK2at}+q-t*cC{#^xnCWHJK&V> z`*0QeMbNibSd8l8^EfT)BdYIw`+Vv2{qEl2U|K>}Ak*U-_xfEkdOm@^4R;Lm*-YpPqOr-A?feKUby z{vUtmCbL_p9R@8TB!Wk)hyY9jzA%@t81Ig_o&L1FJkxp;@!9~cSBDXDI&SaizGk4Q z{hd9CiQxjJmyQasKogTMs4vrk3LpU$6X@+eCQB%HP6LXA_<}e}%_%xP$}rGy?3WAe zt*cuOcYGJ&$3?tCxlEzDG97)sMFf8Ytd97SnbnWI1Yj2+PAGb-*_#9gtq6v6o@}}F z`S0hq@Vp+6r{`1Bv+}iIoYLBJ^`3)y*oFIeu_0HZZ@I;-!~B$ZY^UYnhROQ*(_zpu zG$pKC9GwQF8mX9h*_QH)M^nyNz7`55y(XQU1fPJ{*?7K#`V2PGd$#tIHi6!N@KjW8 zFQ4sa5S}xn@L&5}d`VBp{~ch&%M86>Q;)*pY;U$@}ie5$wc=6YBa^(m;!F<2Ej}MYSMnD!#pwpHf$J7PjCiaXvqu^%AY$pKlEqG={R$cxa)4rk9kr*_}y%jZ+Rm(C#|= z+-9qe2c+W9!~TBd*37HnPEHOviDing&U!_ttrdHBsf2R=_d$?=UNb7P&7U98%=XjY zv>V-_-@t0-h}Ru=6lET5N0^Ly{t4TYyL~umV>Xz47k;s|wHB~f#%g=KE;{*P$D*+s zgKJK?&*z1}LXBQL_ACAAV0l}}L1_S@P@x>b-&!~MH8^t~tH(zW@Bh=e09z=RAr?;) zzqYaElP#i~#_J-*IlPejdmU`^Jk5OX$7sLv!?%TCR?_g(2hS09ffC0O?26qPJzh5$ zF7xnVytUo24V#Q(8h))NSMqCA+=_4A1DsHTX9nGS8f%+IFlfnW;RskX`UNGdAUKAB z1o1atS)7wc);BknwM@574%u2-<{bwNbLDH2er7daft<*oE4KRsx-XNF2-4jHRV=S3 zhg`b*f-#NHKiaUzj08xM!3EKPo`~u{nO@J-_@jmL8LKeE8hRUNVFY{#N8FCt{B&c@ z4P5sq_;gnG6?LMqJ>h1{tf!m(te1y#NZ2*k=~SPeK&UGYy)**2-Heq-ZRHA+$SH&) z`?LYxQY?el#di1f%NeiJY+EkhbyV6qG8pOY$4QzlPU17_He((f?`%*{Pjcup=(f1a zk_Er1^1P=8yHtwpQ)I+!j5@(yZ)o_6?`!U1xB`l+*j_~4$AwpU5+|k6(FQW{{alfY zzjZE~%sO33$Ou1pU!#{SlPVn(zkgg}|?zQL&km>u$^DxWmO=iW=(=#Ph7z zD%h&{_cjU6XV((#QmY{Z2w~ZI+7(gURyA9p!2|l|#OE>8Je%rH7JCl4GU~lf`040e z;bZ#K;P{@?f16FwjIA(>|1O!kxWA68Z2SB#PJHLKYW@Juo!0Eyyn1z)25_g+BR^dJ ztQ(KGUUH@gO})G7f+2_ZR?%X(BMufU5Y94!x7#J@?C0Y7 z$(7H>4hJea7G=k%S6R>4WXpEZWD#vZNu40 zY$vRtzRAf?+bqqoqB2%4F4-ZiAdC7@utDcfs@!^f59N#T?xtPEl+EEhnm_qwnB{DR zqoV1ELOD$n%zaYz%K2k=6d^Es9FWOi zL%Z6a7CqsAVlzzU{DSX#a|l+ll6X1AKdsH%g9n09M-#NcL3)cK`)=Ro3guF462Fk% z<4Q%N>rf;35{Oux!GjcW7zC5W7<^~ri2kKQqA_aT(JvPXrSF(K5H=`h|K2iq*8*~c z0zcp}DA#}^uY6HI>z*>5CecZ6O~@?8+Gy%5@ZZ*C8^OgJ3RChk$YM3dMdr6<4D(RbaOSlN~!H|37c;f&VzvK^_4T4 z6EdbuB89B4%*B?Gvn*{y>S~L`=l140CY)_GEG!rW0|bL&djEh__D=AB6idXAgkV4) zAJ?%=I#%V#^LV)%EeEN;aBaGFNE=Sz=`?cJ6>q=zaC1O=z8IgdQ&Qgb&Y`I6qS2nF z%P8dg?cGjhrNN#-k|G9 zzJQC<6wW(0&|q!*n9$@{CSr3qQ5+R`^Ke6nPZ4c@%df5dCr*Cw0E4=no*yELR2=zx z<0yqeE+L7;Uu!O|`jFVPv`iSD{0m{<3TrRKp4iUO@Ck|>lHYLS+hFTdiq+!RVZn$r zE`8R1HFk)0`-6o#j(Nx3G=25M3gldeAK3IMzBf3kDmX>R9`{IDDj}f;OCHUOin-Tb zftWJWOk64rnzG>mK2E*(ihn~%utP8z==i}7OvX>2cHXkk@we(QQoonSvPcw#i(z#Nf8#17xSXsV-gp_vmq<0Of(; zvZp?3B3Q#~vui`p+g|fxLAK|V=i6MzJ8f?=hmn5@BqfZwCn(owlAFqqAIV_ZW{&}g z*|y9Qnd{;XrAbcLNd86?C*D4|Oi&N8)mSW~C>`;GJdIPL?v|$Cq+xOz$I7~7fghwG zS38$5?7qI5uyeF`{NJct!AV)4Vj8Gj2KrC_fE}){3`r>AWh@K~k_}~jr#!IKjHEyx3#SspA64q7AUvOVH)oC?dln7ixZsI0PZA9uf)cK&{Gk2Ii2 zbz`(psSV?s2Ns~2Y-9Ai^H(DL+F+J31tQV)N_aj>FsHL?zDZl# z6qm?xU&Xo3(t5yB$lD8~ECqLRM7@UXqoz8N!wfBVNWq2x_@_UZ^zAN}v6e@Ydc?;m zQ>3vT`rAgE;G`z}X-*g(y(r^rjHertig;5cz-%_>MnUZ9>@+I`WR& zh-qv4#cypomukyLcn>4Og;7;1sqMS%4=H$Pgw5WFpAtiQ6;UKe)2roe&yW`UDkVx= zFHnMdmj@F(a=3$xZ9}riw?f07G9&!sx`SPwO}20VUz;Jj+cMMO*IOO)Z#iKA6aEgA zbI;*Y@OpR1-eI(Gz&Gk4+R}x?6sz+{OQEG1Q;Rs9s|z#DvOcp$zc5$r=w<3tbD=T=>P@szM+3>K=*j>QutxED@I zO$!wvriPLlEArY*2;UXxLm;K5yVtWLWTAyQzOaBV-{vC@%qtHQltzZ1F&>F?D22|Zv^?t`Kd0E1N7F=xNCAvl!3nf(2yZb{j;JqitdCdcS!13KB% zB={d9ZUWOkb!B&@s2-SKolJKB2jKE4V(Rd2^O)LDhY}w6G>)pqk^fd9&eKoZ$uBjr zDHW~+CUk_6nTLTPrQ>7Y1!J?v*S@hJ@^WAP`UG4Y;I;De3T zz@uIJT6mZI?L6tsAU69lkQ@&tyVaCbUVNc;5I+F74%4akMv5)=n}SpM`w*=11=Q??5UNLsHzCVPcV&z^44hxi)9iK!<0d-N2 zt#f0t*#zj)c_-8kzhAmUSZEA6d#)OnohSm2#63lPUKC6@zpW??IwNUd4uy)w$(bj* z{c~XK%;5kEw%I=$n7;4xbp9sEwdhC!XYGG{|3%Ow=NnrkpYt$QLrpLh+XHR5`aY~& zyikQ%Mr+w@Uvk~T!o=ta`oWkzox~#ucaD{%J!n3`MaMlu2=Cjq0CX>@JsUyGpB?+M*4A?Y6yd||G zL%@__6NEk5nwcfj}koC>eHfRJdRu@k9Z)=MVIyw^_71u z%zxpG8$qlvu=_v&2EzR;d1B2H=m6AL@Zi*Wi+T{~`hdKC^TLAnNU&2jMAA7-&R4Gu zABa&sPV=60InG3$P*mU^f`@DVEm{~X+43K9gZfK&j*)J=l&_4>fcw=};>lpQLIWc9 z)9SX&N+l%K4yWV6crqrZz$ZHY(+VNii*3fP!#UhSvH>~{l!%k%1xbNwTU((j1yk6n}>C?kkMpA$Sp8z>n* zbaPcY?oW<$Vx+zAI(;JCO^8XVPbFN63YeL_xu~+REyTw zke;>lrGF?dQHyXbn9ND!QDZZ(el;6F-#bV|TT4{%q+b0yA+BNSfz+B)|esp zWT%u-IL_^`7h$1t9V$;VOYxb^(E>SolSMW}$u51qcDLI#L_uJiMGA*O8+|QNTTJp} zu%MWb{$|h@62yAtM8exp{J0@G;Iy$)sTpg_1RN9(MAl6BbjcRRSYprQVj5bApGRXMVZW z^LDSWH%~^u=b0Zfo884fH|}B>?=4-;OqJ-{vu8^#{U~!t?|wL^6gP(hv5OJ5$w8J^hjEV?M@6m*vPnJp7dct!y4GfHdJEP28K68-1YW95M*PcZm{XvGp2HCUH zK=kZKQ2t++w|@isU{JyeSJf z`n;yRoVKXzTqUvSr#Q0+WTsqmR1N-tAHra-KedcJ3H0-X*x%pQxxd8Wj=bv}m~8gW z$q$!XaMHP*{)&)R_@3;qlaVN9pjNI+QIjqc9#`P;e^QSBw8B5`scQ!Zc)Yr1{#wfh zG5~H|=&RWOaRJUQ#Q-K{Lflrx=3VFjzZ}8m#~Jt3}A4YDmUutn7I4;sp5QBD=QxTO|p_@*XkXkj zT%v~c#o}|e)f-kj_mxb|uo+iH;|@ED=-l7e$T?0Ka2FRvx01EfkPo3%l zP9y_2&Imi`yGE|#3_M70`032ue0INmZhK233bflTA6nj7E>8G$$B!*GXQ5mAC1?g! z_xGy0F!fN_iL!?>jFb@$QYwW)hC=mfVe{w1nck~36Z?W6Lnm9DE#sZtSoyvqHF|1w(%v0FUcI~1QP2Rz(Xvlh-8g{~Tw zw-EZgm=j*|QX}l4V^20WRw*b+D{l5)SNS%6#;>{7Iteknw}S+D!aW*o;PkHvLFF<( z;b5+=B6?gke?Y(B`$WRcofbZ%!__#~v8+r1wEyO7csh zAzQF+PBPbfZudMnNbk0VDqFtB%Uyc8QlnTnqpwh85c(-o&Xmk~<-7Ton@MLX_eID> zqKuzf#ALh8kn3bI#oPlrp4I8K%s^T^CYmI^+>oN|jvPTJ6+-5wGO^X;T#;d*$ZjP# zHx60iM%P1>9M&o=wg2X-5L=P@LlOz%6NU17vnUnp7Z|0$HB;_79#u2E+s8b`jX;v+vrOClC=9KWMamUCf**+XC+?=2!CLAdV(aP+UxGo?1MzlT9rSQ zU$A_O`AiwLuBX88eGwIeQnsBV^IHl)N=Y|*{qVv>hQ-G87dknr0Hk;M7g76zH8o6K zhoFH@IvmFJSH&fLRov&|Y7EcyT_FTt$GpECeCrT_hBsf%Vz$&<&s)R>aFvps$ny_= zTJo^HNn&2oh$At8^j6Nf6=@-icN(8o0^>7ukOMe_3OtihsWiA+$`a8X*QcLTH7r-3 z=ZqF9(n<75%^YU!9wY{hOT67KBxF#- z4vRHe>xl0l&2 z;Ewp1#9T4>UsgXkrt(Q|o>~-QC)vr?K72*1w{E?Ip_I?a`#B@i}2(rig#LVD*y)aQka*T4hVG7Zun z)EUaEMOu|S24*x`jlSSRW+`NUvW5B{BMh8YCuzUqY*&Kw`BlK3sPv{?ELDTle={wrrN;N%%ML z^-nJ>CeBv6QzCe~;K;fzMvAd^t5_73=#`<38o$iSRqL;yh)7k)0Tx|-uhnNVk^e2MlY%>Bdzha@ z0$mzq$Ax1&?U*=F5!L5kO}XJ$cfCJGQ2n+3Ckard%S%gwfK0%jW51oI)^7On+g$dJ z#XP6wLz8S990;u4T6AW2fHlT!j2GjVmU^#?TDaiPBpDslNPBQCruVndre$j<4T~5U zfV-<_#sC)*?$_|n7sj0~gg*e{0m3n_mepCaj!bMSlm3V>sky> zo*`5oj3BozJ{Q|7DCsK>Mol$cX2bhElmMqmgvFL!Lkt(8?&<`k+PM+duuh(9Q6#X6 z35*!0zsIEM_!=6Gcew7Kz3x@33|xu=hY=ASMam|tM>~vCIh)z8slSXot`A*k{LfHgH(ei%7HirB;*O}rPkQ(OKlg(P{{LO?nLq}DhRc1 zBKiFEGDTGkep{2u)+bm4b~M@6Wx_ZFg@iO09z|&H+*EbGSy^c)CNSC_H9%|sh}k+i z@B*S-xv`~>ahZCOQ80^_S0$Y6hgsF%vm+CER7sc$P0OA?efB=U&*Vgxh75?nTqlxl z7`2v|WkkuzB@q$D`aR>Ntjl&#dJ2zSB5W@y!eD%LxW`)TucH&^Yd%vMsxY1)OA@6B zZVN#%9WE}b*M$=n1Q%{E3Rn&A-jb>h(^DQm+Cpu7Kp|AH9K0hrVdsJpw7)2b+c^|1Y^y>#k+Ft7MgqGt8a6!i07rx zKhjOm#1G7^)4LEAwc?koZ1{kwRvoQqJcY=Pdkv;5rTq;yu@HGct%>WH>ClW`f7?HfO((zm8Pb3WqS`;JCe(X-Vywa)? zv5hVtHEwy%i;?yb>9BLeX2>lLLW&^dg7k$&LUl^FV6KiGjfS|!Y#lK0)~>#z$miv3 z8o|8!HMdqSiiMN}Jp0hJ+Tc>=i|F6a+S*})ZyzZrRvWrUq`~#+6|*FLh4lw8y~FA| z?1o-TP6e-|4taSfK`HG1DHpufya5Od$~lU8q@9y;_1cty3@e%bT=YeYV$X1HiMeDE z;#krs+#>@DJv%Os*Biovpty)6&{s1$rlo%lDLE=B2hdtEfyQ?q>Ac@1` z)4Hpu?c*){)c|B3-_4cuBY|zx)2K1cm*hB0A9XN#~mMp8#b1UbPhs9>DlR(G(BHSp51>EI)LH zV#wcqqloDJL_>NH8yvK6USJd8B=Z0Gdh4*Lx-WioW*Cr?77&mQkrbq*8|e}Rq`Ol= zy1S9?QjtahLFsM~>27K1zI*ijKEHeKbD#U?z?nJc?6c0^Yp+i%Tgl=w!2>q5*djCQ z$qFH-jozru%m(>Wt+Jge1Y(~*S~(l30IA^g`g4x!vTy0PzCNG~APG#e4CQWaK74r= zM3udt04{Rv^=o#PjC`+JrPiC~v(`7_;=v42hwetW@eF^d;#*6Au9uWmd}*u9r&1B%|if{QqznA^ZaCWK04O>G4?>T)$2 zunx|SI#W3}Dm(_R;v1%;&OH5K$OZ|4-Q_>{wmfb_8qZFaS{6zW@h5|o_lE@WFsWmM z5qur+m$snzn7{mx`+hYQ5fnbxPZh}oBW2Z!R3EO18P_q-dfDIlQmsmmYmxN zhNbLHRa201+sff&31#)hpYDz0PgR@ZGpw<_{t*fYgABuEV|vZgk9}@0{9C&wa!o$Q z*ST!P(=No-QgLz6#&^m`h>ZmUwd0v(Y z4?Q`2b{sy-_*A4@MO2x}tt_>L9Gqac-=+``80&no@ncM&59j!`!KT|DU)c9iVrK_# zc&Iz-x^ep0^Tri-;QJo=JZelR4)KhDVp}s5Nja^;51e(dAjJs>#_?2Y2q^9 zXSx*x=i#pWDZbAbIe!Iq>5MCZ^>EH>uP00VNE%OGwzeOxDEqPB2D0;kCzqkC3lMLg z&>82oUgT&+3#mdY{YK9)$%yxP;#XhQmtE7%=BB^e(NT-N#YAupexB}DJQNmc(T%Dc zIu`6BxY`*=Z(7{i3!eA7L}MO|jkW)I`UuSiwx96a{mQ3LRHGTxjKNQ&Ut1J8J?{mnoCytjXd zqiJ`2JulQ6XYwd9^kCrN_)xU}7U_fN#O2#}Mh7@d83I1g@lTo$;DK&%-u(!~FjS=x0!R-LpdYHM7 z+A*nwv?Qg=JWL{<^O}XvVsMPCWzgHm{g7xdEAKbk3Z4XHw%++(8K*h^`q@ZV9?zxD z>DcpPg%V8%C#UAbkEasevk2mVf1u?HMQ=|`xFWeTKvP3MX_TOLWji83i%{aSbN?k*484c@R=$)xWdPG$ z0Ud%?5rRb?_^VVW9N*CmtXSx698Rp^$&VGIza#Nt&kxOD+$Z7b*vL>Sqf;jO>c*AC zBZyzzxHUb_bhx^OFA7=hjzj8-AtRvL=-uM-apQFp&dj)nDxFA!`bqs$;1Z3r^izz0rM4V843ob_`A-w$cl%Cds#M{LLtv-AGvZB$t zjV=%I86w43q@sqa-%t$bc1As7$q@en_dRvy)mUu&<*Zq%6&!F6+i)blaG5WI(I8V)@AiM6)7qF|-0nr^v-}slAKngMi25 z_n(sMi~(IajV^6zIdWEijSvnA>5;aZ^QT{DIXK?p9N<#HO|KNP$#gGZms6J#YRu@><7V2nK(Q4rV+LuEe)#NAvb= z!uGy9c_Uw(0p|D3ZxPiARxrws8x_ujAF+MzPHNZr>H(ppp}2OC%vBGNNL&GCX=E!* z^2c zfXtPq11!IwZr@5KK1BfH|8E6JSv$a5#(jRb>z*N~8TdqFXQmoI^P5Z8n?$TOc=OlY z5yuR#TS5H>Z$12_xY_!`HCKRi(LzR@3RkNE%@d?>95~9xKf%yrimcHgJ_k#Kp%@XY|7$ zD~(U6Fp+9Ih4huFAz|xpD_>?S4h0?CoNv~W_1TTzr?0;g3Ui}_$q+&R8~a)F%Zk-~ za3z2r2A8%{FVVgigiZ+H;P!=(9y&-0`_;u18-NiN^QRgF(gMi^A{KmEE2U&1wB~eU zn`!7tpO$w%=JRK>w&{&osH_?z#yg)T7BtqC$`0L8{+mk?qamaKeo$|9=UV|STxhe^ zA#=*c+E(;cqK}ZxCXP!!o>N8wc{XIS!kZ0;V@jMMUW3smm4@Kc_=l*b+uQwio%)nVeQWA@ zQAZzct~WZjXn@H*uf&kmL@uXy-BlLZVuA%dB^d1XOVt+;hYud5X53D}4Ug%*ZF8T;OCq)MLxlS(>iy!G926;A&C&s;(J zIPvtgd}fR3#zMu78uOvOicAwE9Xu%T{GcaE=km{gq(Q*zsYL_Z6pfah;xIK(y0~PM zfje~P_=!CqQp1H_uUkvl%m+RyxNNc-Ai2I7YWi?&i#+@N9X4>7k^JF#;lOUjMwXc& z`KlR_t`sRS&3Qz z#vi4J@Rs_bk+4w+`^ka?MY&c{&!!L^=5u{fJU{m`SIpgp3a>z*l&hq-dQcoE3<9t& z#r%%uo8-b{$i3FgAmotIZR5N|1H$7 zzhAPkNKydOybJkzX1(Bn^fr|O8N+FF^2D?%l~9P&SS_~e?omdK{qp|Jta>IDhYP2yvnFN7^N)S{?cD<7!Ga*dIAn4NP_J*j|&Wk}6 zBeBZ+I`a1BYKc>|ghI^p{2ZRBvEP)3zn#q}0c=-E*HKUskRH|YW1bD@M}($#P+2-+c;GK{0jgw^yf+SoMAc z&NZCnsdZri0D%iy#K(_XwVLg7hieL{4{xqN+IY6zxpkkcMJ4hRMFlHNpy7vlF4fbj zwqdW%mGLuXwH;2@@|29utJM*un3no;y-?+FeH3=StJw0erlE_AZ$c%yTRQSzGO4|J z8c%UmRMO%DW@Bg}@zqvanP4MK1Er!&D73)d)7FTC90e40#fHKBa*d`dn<#BAEU zNc^eS$!8#!K!+OG%||AxhN!ZRsJ(srcIhyo3s(8ncDgy$$}2d?mXa#?jzA>=qZkZi zL}H^NSOU7c|6NjdHxo-2VmD1oYcQSSv}RVMV{jD3Y%z$~TAB)MDbu%by5+C>T^<*eBhuLfd>|(O5>%alUuDum zt?Y5I2$fRF{0X`^plxLPEGiDNhDJqcM1gETU7X$?F-3Avf~5Bw(7G(b`lt{apHH~4 zZYo?Re^9{KEh2%8OyLTA!W(V96^dkExR=-U)g(3`83!Lv6X zer!M*-<`3l;4OlpSCRGQ3V9*Y2V1ZbMx-?U)h>np7h0iA%w5c2BtA$YQad7jPrrmN ztbFH*y}FY*+b?Z|69SVnc?K>1fb-vxb0r*@{(lNum)M5<9viVCqj~kKh9H~}Fd{3@#+P?FX(BkLmdI|tG3-S$ zYl8TKlFc6Q%M3$>6s`?sz5oNm@>0{YeXyzTcq=rF&tN$1|6fWo+RF+g#&XuMX1A*Q z9%p+&^aHOJlc0=sC@fly=^Ug`cGEu+Kg(ZI0J`g9f>PCJ%Z6Ye*fNk#*i*985@-uw zz=Z`pOxSCHauBz5+fS4VK#Ej%_50UH1NhUG8_*UMFY%%swE&dfkzI+)I-#N1+s@0 zhHJ`*tS*oZ!Mr=EV!xBEHiz0*ov;^D(oJCsU%S{?wudJywaLLrLMIcM) z{FKB5IGxeF#QOD4$Sa*n%|PZ5bVPxN7nmUd!6X$T6BfEwiG={ijJB<@VznA>P$t9m z{9^`QZpr}4|FlocpU8?3kx2~)gZ%{FY%*F-Vrd(d2S~T11W8aN*8!|p80(r>JR0DQWiMm*T$H~FWeiIF|4b3{6 zZoyWY+49>OyD2e)^YcUF{=%_cP-SgD1C*Dp9KRc6zo%veTz^&vXb#?F^6B7vT_azR zmk}7*&woa{y*@%NB>gNd%kSHWs1Ke{`rLXtfWrP{lgABuI=4O5;UDE!A+?D`Dk7dQ zL#Q)_d*hL7!wyn~j0x>#>rxG}{#R(rHA40jD;$pbr!Hxv%Fry+3I~=Zs9lLVo7Wec zlRpH*A21bd6)Q9-Qa{Q0f0iN9;>~8FEe2e_9qf$O(l-HX93u$73dHNROglY5M zAD)NHg$LXGZ+1eNwS`)#UNM0_I4#+LjP7})Fk-SF^jW)l`8qXW^M&OS5u<8`4sgM! zbe1MyzK4mo&F$3ga9p_=1qxqFi@7u@d^7ilvW0zOh~gN8uN{b9&;Lk!ceXnf_TP@% zWos6XlG}7X8()e0%NtS+I+|XSfYAR9o>_Dp8D-05a349 z36Z}3p^N-Hhe!Yc2!VaACw#irHb8|&I+Sb;Xj(ci@00deY7=j$M%$Z&tp!lgha z7|isqXN&uHPcvsy1iSFh_UA%^B-xI4jiE>Dr3YzwC|I34ZOpZNB+?nO{@tZI!+8n< zj@`v`z>+#dn^W&;*BHjeU>4DB^BPlf&{!v2B#t_$=jB0rSVFOKp`7XYm51@BgLOuM zkF#;{sX*)gQjBmO(g~MqFYPlsE7lAZddRis^Nue+pw5TC*Q}j>J&HXUQ+n!fpzL^O z&?%bRg_GK40>tueyN5 zUF(z@vFzG#Ok7*^O|^N=;U!}G%?^doe6(rDq0su>qhXTJa1p@v~2Qd-J3 zUybk0K;uN|Ybr$o{l2Iq0(X1+#PR?z@99FM=4 zc%|hSA@CfFRMo{sV^F=gJs%NwaC7S@6MP2<+`uxg4d&FF9?y9+W8W09eH2GSQvHS~ z7>kt3>3E`4JILeyK%iQ6wvhf8tNSRUTea>Hzo?OuCDB+ePrJTs@6%x7S$o3zqqWXn z6D||H>!_lu^St0_4C`Mn>K_0)kOYzg#?1MwG5+ss_>SZY=V1x$g2qx&fe&%7Ds!Jr#nAbu8WY zb@%X~|HUW0Z!^S@_b=RSkUG(bt;t;L@Ad&Ra)gI zc9>SG0xqrW5}*ML*A6LW3elXJVjQho$eKitzLigUqDe49cgO|#xf8VZf{^OHH@>_o zLIt(cMy1)-A_3b!0i1V-^&P&$NgxU{>RpvJ@*$$GlvmVNp{6~*3d8SIp>@}eBOL7UwRBW??)x&%Hfb=-blmum98%; zD!mkmb%8A)vD%x;k*E=VHw)?DLgs52ENbM@>E3KK_apuiZU-s%x*ZAX*g@PyqMW8> z+?4O{PAMf9v_ELq`mGlZsE>g(7N1o76)uGEyGQe!?R#RvCIdnD%S6Rbr!5h$dDWbJc;rS4x}e_O9fuc|%GmGR&Jm;uAq(766xqsUAaWJOSV{dC3cQ>{ z&RcoNb)F}mx)04lGQ>OYZnv8P*o2s!8KmC=K@TX{MPm_z<{m&x9ELQJwYjVH)rsy` z=>lcz9|pB&EknY0kq=%Fjqwj#Zsa0W?0_a+3rFGjV^RufTLbUR%)h&CYXXLF$Xm@J z^101p*9?c6Ng)RAT26)-L*}rFLs{3T-{TdLr((u(NQ(&vr8?Y(7(sV{oxtDX#EHde zUf+Rc_>$EKAp_dv9TXC1kT*JDWKmrbND1h`b#94 zv*&!y>p0Pz_z(XVw7<$Q@UN;QDwiEqWm9leR3(@3Ay%iYpC6Vb8Xd+{3pGmg$`yt$ z#79+1O|WLNr>XM3QgewM<@N6zX~9xRuO-;t;qKG;95VWz<#p(o`B3;Vs$vPR!YlOZ zP|B&ao*o~ddF_Bh*n$fS>B4TKWPc7i!&!0(JEXUzEJ@rrHD)Aqdcq)yU(RBg97 z)pH$8qWI47Q;hX8#ap*7?9Kp(UuxegBzv>lc~8tUyu1|JtY`t4J$N{fcW?HZuR9_n zC7=SqJoaAF7pwMx!Gzn`@PU)Ii=*UN8gsYABK7-TbjVXG)8bxEli%F}QL;0hc)-Fw zHd^CDo@dXE%mf~}?p;et*vI&~_x<8m6DAIMm`GUV)inse5=}5K2C*DwG+`Jdl_!ooCM#IpBf!@-081+Rj*Wjar=;fuF*lt59jsbt#6va(5e;A+3{ zeY`)!(ReptsVz93P*fDXiz2$=Y?*xhLC(+SM=EhCO$JoBRMzba1(n89xg={hC4bFm zLWzCEw}QMK4?J$xzwlbfpeuO+p#Ln#6#|yrvByj!3$_fG4NcjK$I@!Qk)$6v z1h&*3zh+l`(bVd3&i>5mr*eVQ!C7R!m<&gy)44(92SJdY5n~1eX?G>Epq41{lZ;2ZJvrP)Ve%Q2et3lH+DcTf z`q`h9BCQ3?70iCMOjH~5b8>Q00sU9e%hB_$Dd=Wd3auITlTl41;OCNIZ3CoZ6h#lm zGAkSoN8xNeMJdUMCI4tF9zrbOLD1i?V-@@>=8vo`eYAMyWmHGl*i?e_NRA^X9OXRE zY=GogdI24nb)$rw$B=W0NvJX|D>4^#WDCT~;Nh3elE?9?i*q{L#7t5<@w_Z6!sovH z5vFYn{C7-*ri@6t*h(ACm^8~!FoXx3Tyfn}g0d$+9u{Bg+@^PIGw)_Ix>fCP(olka zR}9Qz8&dUCaw}>o(RJECfJP?s+{3+5I4UX`wzj?N7f%{`KL# z?vG2?#%_~*>R0@kCPO)6_Ie64BcG)2NnkJv>%K$>0=FB`r|S77{*)0A0Vc&__(1(z7Tj~^z66Hm*meds|`Yx_ulDWy%*Dog|Q*>;2i2*EKDZEZ=bpCpR=iZx>%2M%_ziL6FV;rI0@y2Z@jNSqVmL%d|s613Y-4AW%-S6&$T+;ne- z&``2#9XEKQJsl`0_z3)vd|deGR{HCm&m-Y7gt00!4Z>2oZBq8{RtXIkuVMZYZ}Fw+ z9kf(Vti~%$SHAJ$LcFeyJArAIfuI#LE~*c@>Jn%cN3H(?NHfeNd^2Tl=NygQve7Ef z^R$XuB>{uY26HP6v^UKckc3X=NoAt=L+TvX195n#NpKlk!|c^o)q#@!Y1_DVApSz$ zs4SAKNyKivdjvN%TrGJH;2V>MQ=-K%9h!U`c?J#6B7p=iW(G3Cuj6q`q>f9ibSgge zKpsGC@3MQz9{%$ca~92R_D8qs9iHzr&0^MGvgc9QgonlHJ1=M<{IwNO(Pfet;G+uaBF&-=IKB<#(2da_}9 zxKNuHhNrsk2O`Myy@z^5d)I-4i;k3tN&@!f5zANU?TNA?wco{JN>ms(>G^$5tNkDO zQq6L|gRXYCe5pZLDg29XRQor?Ge3kn7!CnR7ERJIg+$%6Gr>?9b;7|hyIb%1w^#cD zxPm!zygZ>rr%u)}3FI+WPtKGIz^H!GheuDDSxv{6*}!J3dhi3sofZj}gOC{WD7SG}|>X#x=ID07DxaQlEM&Ju(@+<*8?Ih4fXRv#W4maZV7+DMy;Y)_&8oJM6~xu8Fr=AD~LZjSZDV4dVW zqqE1$UvZWm$@?&*NX$3VJs)&oQh%(pKVnGY1n+BnlQdMk7L-j5Hm?zP`t}rS3 z=?-)TZdpj2*4&ywuX}fvMcIFOTM1MZaIYCsvw744RW;?Ci zD`GyH)6GOJP*-RwtDrW;Eq^ zD;X&Y)S9tA&&5NUhI+;%A?-et3vHMzceopBK7<_BGQ~EB;wCQNWw1&4i3tm|W+I$s z6CFvMcTMyWPI1i}#~hkfCTMXHT5+x8pC7aB(SQ7j^_9fXsfCG4O7N-f7!tIZFEi<* zI^Kq@Qz|(_@Kk3XB0${riT_FiD0Q#?p@lL8#|myvf{l;vc% z#2LCh@jhE1Sj2!}#1gt%WJa4KqbQUtWD=P#(-=nssawl$V;2Y~=FGQ%2t9uXh;l)H z*zhbdGSUafNq^)ec>dBipz5!8!6`23e4Z`moOLr(yZ?XFHz|Wld&`^lhC|ZSL0gnw z#12=xmF_TcG$3qAJCNGR^P`ohBsI;c3bNn1gc3-Hs6bM51}jJ2Hxz38$tu`$c1B%F zY0bo>(tAj7Axie3bVt84U?V9i6sb(A`Qx~47^<==iWcu597$O=-NyEx^bB)n<-qt$ z9=J$6Pi+_fmXH(1K(HbFB~I2JFkce0C_6>~7d$MU{@XO9?*}okPD*+aM*0cwMXs@~ zaFWKGRLEoPyui*WA|I2jwZy*H$Mi`r?Y^Nx+*YNvvBkAjAFU-~4kqvcpC||Al#?B$ zpVrc(5G-QRYvR z5)=D8(Y)0E;(aL&MYZ56DqOEsi7bf{F^yO4@X$~-H@);OUt*uJStZuveTTO~uSnnZ zn7@a>SM~UIwDctfNI+<2BohJ>(6J57E7il|9SOG8mMR&&;oGp!uN&U?&e|$E>Q@Dv zq0*YOnG}COk7iw}3X%R`^1-GPkc$-eE0fYtaap_l3LOEVb1 zre^+?sDM~6$t-0d^0Y~oeWKz(DicCyl^m!6I3VsD70QK`)h$~u8r;5@Km7bmQi7=- zxC}q}Qb0Bi{F$ufQYr;aboyHZrxkS0!-SJhhY}lJoo2@27|h*g!{+(aGB38e5?w{k zipA*?2638m(|HnS{`-C0Zr;brr>=Km%CUbA`I3eF6+1ZPj9F5|@15euamn)MO1-LC z-9wJ6UHB<)UN1v)pKk0;{$JNP8S8>EQfTvAhe1_3^sr@*q{F`8!?XL3C#)W>;cm-8 z7rUWleyLPY}c>JF45I0 zwR)gZpCeXi#oyIG;m8k7hRWSH%&wV#i4ah&Qs!8|98h|sWdPnJCuZc z=}I96B&0Te-S2Mq2gl5RXQ%=$7s6hLK8V&Ci@q3!`Ou7I^fND=RZpus^?+RVK|+mB z(d<;!exxrXd-hPERcZD7$Uc;`#LYgx!qJ<7*JsK9T%Hlh!g}Lz4UhaBN0r_)F7Be= z*k@Q1w!ZjN`n!+ z*?iBjAx47ijteb=@EJmMQg6906@rakl4V32<7)-iMs$tBeDG%ZUd!dQ{Lgm1Midu} zpx*FnU{fZ1LKi7L(^ZpuO&2gmdC%Nlx)9hc+-6CjBXywZPF0yoKBllH0;UB_#P0^{ zy%bE%fMS&KPg*@27SihV6cNEUfvI2f-Jv~uw6HBw==>e74tMyhu+Y?UGRk1(N<4Q) z{;y0iJ#EwZ|04Eb6vRR)yoLFeGvtq;v5^rYv#>ytS}8+&vX;aP@RIO-X?Uah$uB*` zLF#jePA+zs@R#jLjmajNS89W3Yp7V!a*Lj7-kq$yGba8b)52-kYa zfWM)J*yOk8iAZy$#mMAB*GgJ;hyL!5)rtr_Kkj{h{7!0Ih*u*=e8cYJGJ%;%LrT_! z@W;x^PDshz!o}@9d1oh-m!`5qrNGUUnBy%ZPEE3XVT*~jpbO^9BQvS=HIXVd<9qYh zRRaKwrn62{Qfy_r2;h+sALRWWf#&l#EElN6%4Lhpk zHaMgXqUUpl(kK=sC4D&~PEA972Uy2S+_8>7t```Wex zUwZ#*W3?N**f%CF@RXLXnKl8M1g33G7_4o__!@_c3y(_rm`u49_>{P$Zp5h|Z^?C0 z#z9kv#2j>nNKU3FGxC-A{IE+<7wa^lGneE|8qZ425L8%Js(qIzNHM|QG0(83Bq`0xQ?2#-+(*rQnmntA96;;>KdK|Ce4u+41jqnWwW=NC;FFi4u5GqG-|b zNgzIr15N{i^k)c~~0>)g?_*Vk3)Gaj@7ETE%_Ozl^#BFADafV2Zu@ zf#bKt7?A%jbqXsGr?B|%Xo7K+d5K!U(2zpbCCIl(S4<%bX_R*AT@Cx7UoO>sX((slBC7JtD$H?llGVob1AF0;{Y z^td5OX4UI#msN`ehL~}32K&7Ck?vuNY^l;6E-oRRpQ9{_?1(zD;X}sAc5%o!uvfaG zMS;_%B0Yvg79Est?1237Xf=zO|9@Nn8~RA`WY)~M-D(@&x0^U-^#i!h%kTe> zePzvQxy7sw4gp!3LDu(oXYDSv!l-+Q@W(t61IR$KQDO;VheOP@Y;{jEo?*9`Y2 z0NM#zUWWt9TZe4w(gr5UWcDwsdr~?&G%w58a9-36WbH-+#3o-MUGuGYQ$j^ldi#$F z9=6-pTb!QO@Xp8@sjNnKhl^f~%SVHqnF4Q`2YrgMcDcNEXPPJgIp3gTw1Zax4k?$F z0=OcWsyL>9_Z}h`C#hIqW)pnsa9$|Uki_=V?=>@p89(z{AY$IcM)CujG=u^wuU2w# zbgcvx6|*(D-nqpxjfSrvi3<)9_%rv-wdK&5fwBF9Z^y>=aDYeOTG7e)Y`>#wjj4i* z1JC`>s-!739(Ap42trVgF7V{6n{nHCg!G2xs-@AL>H1h=-!_;GjXR#5dHky8F`q|$dzgnG?4lAlmA=QL2Y6;Ex~=Iy`TJ*Ky2F8cw6{gsz&=hWXW|2UBl zvWbcmOOi{nV1B)6%m)FR@X>}Wxon_>_qT7>ZS=TEJFWSjcjS}H=%$c!&S+*n=S#Bp z%sTIvFbn_AW|*~&PR$6$gc)LWQolSBbU$X{y6*zwEJTSBT=D zsY*1g;}C!Zzm;G(o0Us`5@eg$F#FZZ{Bj5PKZ`=kJd|@1x9B&!(^1107-5wMy)mpDIYA%1&xxkU%zePwhrJ-#_! zoc%V~ja1kUGc6@G*L+_nEk>u-3hhm}kcG@gEc^LJS@!kwLDI7pMQVX*xpX4Dzz}So z_8q>x;j`~l;B5=wmLj8ayzUltVlRDGr$NtQU_8kmSEW+s$+tAgZSfO+cYPE?ysjJ` zx;gzNVp8BRofRg+qItPKKr8?A7mHSv3tzDIeZSfmw!E+VIN~E;CZ4E2X3Ov(-$!cY z{&-QvOQU}UrdQr=JmGOkcf|-z+d~>jI|pOfC&PeCi<#VNl=lb}arg3sAg)4o-{Xnb zSDP7fY>GzV9Sf10AUH~nS?1;P0@$$Y+q20*c@q|EQw)e(TCc}0k_Zs&1I{EoW8MNPf4@54Cy@#b%uc;3aFsh@rSvtSlzZGQGtx1vJfAhH7 zdag56>7{#h`HNyjGD#hDx31!$#>$7BR`9Cz?zMb@q3jEyQcLIC;~ur}iXSM*5d><* zrQe>}bW=)165wX?zfog_DQvmaYgOibdQFK`2}fJr=Bd7pR-p-@y3%()9x9fPBO|rQ zx6ozP5wDP~rK^S1SkB=okn&JhpNk_fEX8cTl3ofW!u$IRKhAL9vIy0q?abFlDdv|v zj)1P1G`g=0yaiqeiKhOnl6j|9S|eHQI88!lF%W}(nOZ(?(Dbvady#;{1l4HAUryr_ z)r5Zi@OK?^ylA1#ZQ}Qe1>YNg(C~!8I(rf!IY~+SyP7MN4uV6ZZXl`oQxf zF+#rYm+i?A%PV&5cc(iVrWfO^Y76+8#0gZ++}G!aZ3PhaKxQQ^h*qt4ew#w_t91!n z2wB;?!d5X6R5%ap6}_vojRXYLz@?^{;2G&6$^#L5H5cV-B`CcbpFiK*`Tg5JKLl$N z*%x@8t_a!gg~VcWX8Yfsyj1)$HH-$irpzXMS*DH)0OSH*n9}fPNu~p{;h(Plov`M~ z5t=xGo@gCi>q`m~wqFOHxVz#I zgRv7mfv-?# z)xqm`WGoiOx0mDA`ZIl+SVjI4X?T!G?J7ttvnAeIa`}s3P?Fu{aMcN>gF#{f)QSfU zx(4;Ic>JtV@c{*>ZZ8QP14@N6i)xYjbD$CzN?8|0Vp)#kUe76`q$Jja2!d~Zw76>Rugf_k(um{}_WSyaf$ zwXC*t9!y``V9Q$RZt>cjEfhH2TPUZ1H>xarb0szFPb=jHF5q?(SD6g*i8unacBdMU z#j#@mfibD=0q*E0r>XeGgWQ`Gkro(BB``#c+aWw0+DYw=&vmb+f2>}yNWlv6yv*Qy zBlNw#ap|ZN2D!(@{Hg#)8&jQ&@8ITgmIMZAkYJC=`hK~I^n^r{UjIj9il`l0$BU%g z=7^!2YkzLbpQs%XL>hY(-+q?aS}T0Mw&FRv`KG}%e!e|liVsM)(V!{I7BYm~nyxpo zt?eH6_`+zR0uo^zFV6DzM7gIe+eR%A7rty@#)X)vE)JGVlqU!b(h4p#x;w8N<}=j2 z+gBRt8N$L?#{3)T{&m%>Cm_&Kp-q2>Jc$lbGGBA1qJ#q{7!c}YC!RA!_s`GzAIhh4 zKZ@(-`C(pLws@Zf1H!Xu#eW)+#cxYb$ol%T|C~ZLKW-Qvy($cnt~}xVrpr$}Wb@}0 z9Y@03X73&!fT&Wh=omo(UHI`AG{ACfe(C7j zfuKj(1qA=Jw@6^T}Gu}`X)U8B^C9sm>DS;lRVU( zAR!kG+4;ES`&RkonOM zq%lE#%X_vZCq^po?l>h?z{C3oaz!PONABfk`TY9s9i`1W|=03kek}kDfN7?{U zFH`rs{(_yOm;S4_{Ek=;i8s{l{;(cWH>tvDZTYKuj!8j3o@R3Od(l~gjA7~N;i9p; zj?|vV$L%#+oGKCAt2BaAS5F`kVPvUglsl3P!^kos2dWbgv);tGyq#Kx{HpZ4w1797~3d#=r0Mv?YZ8HD$Y`3%}W@g)_W zDRgEq>5qMlM#f`-k1&?MIf?k;Wyb>bMW!|zdO6<_iYt!XJR>1`;!@oIbj#jT(ga$C zf=a}i@on9)vwv!`(R7BQe{wdfloFkwJ4VSxKs-0Edc#SPWZE4aNFmB2(oWnhX}G;txH zG4;doVPeg!Xx)t#$#c|6PSh{}jA)wwo9jRSNSa0mb3G;+nCm4WsKH1QY0PkcDrhQE zfMM~AgdkrW_7@_38INJUn6!v+_RYix@f-m$*vMoYNBr;;xXJ4pbSXv&a8?GY98*OC zXtON8UK$lR_6YCqv5So>BCqJ-fz9?X4z^wkFmxiQ=l0-05vgb#@Tqwa4ft0M3dnq7 zfCq}?;K#Z@9gge60OzhShW&jCJ9RXLR^VHxQ2HEGRUYXbV6t#@sPbFg@&NSlgEE72 z;W)^EU*|Wel`TYk5eygNHRS#cXVm;V9xVTjhooLFE;wZtVmyYv)3}0rpsWCQ4+al) zXFl!>4GM1a*}n_V!7Vc(0tZupgEwR6=#xMsG)uv2`opLplOOO4wEm9B7sR9uhMv%s zQ5u};9X)uaf@je`6;M(An!)vg8>OsxCp`~t&KGA`Mx?I*Sd2;4#p{9pL-1wN+V7|H zeC`0Q48uiwU65pRSttkFD>2zW;3?whg5Sn3rH2G!KE$(BEk-Cl;<#>F`Y2$)yL|jntsB^!AQG_{X2Q4 zOPabkDjXk1WszI!G-X7q^qxRE`VkS7GUd48nHso>E9xB6Qep!rrAH+32VlteNxcky zYyM&scwJO@?2>%esU3C_z4}lK{Nc>(ik`OJn;g>nm4+{zEjA}V=%J+Dkj)}jW?c^f|tUdri6Aq6b z`FI!1#iUXzieFM` z?)_@YeUd=(MadO3Ovvl-Zzvv(IPK$DRw187jLly*L5&S>*kKC`tqQwj_i^i9?+hpC zezkBq{4;y^lEDj*gZq-jNX-?(WseO!wNi(^$YfG9WMZYf{(whHeQ~^_a3dwt)xKSH zUjMv*^QB7em%XL-R*rA>zZK0oy4207Ec2Aa-Xode^&|!j-k1>|OV{|kIIUEYa7t(- zDD|MI%8VR3+E1u;PXyN+54k3UYKnkHMIP7;%@jA`Ndl&Oi%d1{JE?MH)6>)Qe~oV6 z?Mcv+XTE>2g=hpbHG{uO#u=VX`BgT-0S=z?6w;AjXP1; zjsNxbWGHacvBBo2^Or2-oUm`*#><@hdf`~|4BKtShQZZxP?IaUtQ3fe>hy1D#l4`^6nUty7kLJrw1P^v4QWHL@@|A}H2Md`Ib_ zU2L7ntNo*-S^gGdp144;t>MG{Wt-cXzKZlWI=G$>mbjC^kb+n3AtWC5_aX7uw|}^Be;59h+EtsGK;Y zNG8Eo?|ZFAkF2?MDyJh3P6}F94A~%jqm&N^%s0cCw;9u~ch&C{CHXx&F#X?Il_WT5 zfP)0$QZ^UU*`OwmJ;L(UzV_*xenDNDDu_(nl~>&FI&3I5E$x%Ii$I4eW6YBAqH}!T zr{S-1&$1W~d?SeP-x~}Lq&_N9S#u)+G2BNrlY9(oJ&ui;@F~Tei9z(3bPAi<4AmR| z^TFPD?)P-AJ-~RZtG6?1LU)*J9J#3~?S-e2#TThz0uQ@F;A^{~3|%7UJ3@+fp8`Qz z(TU`edaxY{z^+wFjLL{_qU%`nC)R(q?V0bsYm7``i|^H0Xdm`!?;(&ut{DU3r!=ery#?AO*Z8(~ zDD21(yqfE3iGnXkNO%l$ybp!&{am#t@B^|`?N>1R~v>Ef9nPV+I(-o zcAW+_82-=L{DAcBbzuJ4bRPri;DfvwtSN7$tF^!r`P`yKJeyojs6$9OLb{1M=jV{n($x2BUS(Qanw7W9~miORB!y$T2av zsrPg?U#S1Cn7~HS=zH}l$)7$O%b%9EnNMKis$Hmz;!erU1UqucuCy|YD~1boPECDV z`>%~s|7+uPkUBNPN4{swwLcwT0uHlpPj==mUQ!qzX%-vk){2yhb04y5z3dFS4Y#h2^J%cRfP@21dbY2i?Hpx`C29OQxK zCD!vg$E`rUQA2CRFHORjnh=ATgUC{b6q@6Ngo5THijsIOP8Dq@YpK|xS)S$Ie0;g& zK!zyQ3|?g4mzXmm;;`bZ^`R9b;naJZr4*Cb><_rN?VYM=YLRf9v0|-TXILbai}O(# z0mv&t$2KxZ+S;TZJ|`OL3Aa9j z%e^-#46b*}(+Fi?;(H)2>(21lVa?(63p~0HR1FI{GaO6Aui|uff#tKz@#lbCa*p+L zEgG#=U*bfiU5tp`@*R)gV_b2QSA%IcAJc9;ZD*=(#a$Ph0O!ySk8v@M;lVhj(_%*p zKpPY>CO!xh>7Cc0M_pZ>p}!^LGn-%OP0(pFC6bS%iex0d_2SR^N7r_f$D^@N5_rrf zFz^i0of$Fx=Ovr}*%|181nhRi@RoN-Ca^{^p%02@=tzU_&Ob39V;!v}RogF~?!_=W zz%dlHb=aY^koCkwDn zU%J7N#^S!yI?DqozZJqGsUCfZND5d7w0osMCar0?E`a!GM|f+}Ok!m9|u;XoFY!de0hCt67`s?RHG zq2?kJi5oQRRfgAv6JOQ6DI~AX?-WuK2++bMkuQ5&|5=i^8EE0i9jevEMR=ny?Xw)5 z`SeOvC4^3;7gx?;ayT$&g>)RAxV=Xn5MkiJn$OrCqwY8u5eQp)h_|cH^=AJU+cV;k zF}tZnQ8deMuK|!XC7Ue@8k`)5#DE5-%71dx;frDhLHMEgXEZWr@Xk_hDd@ZitKsG9_M&A>} zZe9XhD^DYnM43<{@5qX}WNNxAS%L=Q!z4TYnNrQn2#|;s^EvRWqi(3isHc+as43Ly z;f0&Q@OgdrE5MX%NdRAOsou$60iQ%LfT9qY1MxXn{w9*3JtjllKV?A`ZKWj$42v5A)-4jy2j%972e-6N>?jZyE|IChf3j;Ujw^A%m zh){MTCh8jfRtpOl>)@_W3ZDKHNMs413J3$Wfi1D9qTcsLb-wq7ksdc9K#~{qg(UB$ zt@T%Y40O;K40ND*B!)|acD^kFd7;UwFb)4}>%1zQPC8(BEhdNNAQEcEwp9WJWB8}j zqOPyT#uQ|5WZ~U+8EY#k;Qw_VH#ga|n=nCLvi2K}(cY*E5y5U$c0btd0!O|oP8K)n zZJ5k|Q026W#Jf1rwixDT&FnM7oL=pP?wV+is3qpI^BN>3UBX>P&;FbV0*vJ|^M zGqCKFvi@nF;nqUkight5MQZQ>64IG4n6|e&dzSMD+Qnbbo58P4kN|{iT z;N`sHGvFqnHF=6!|1BoXieR*22zLiTb~H4o6*Hy(8pIJm;-=I+vOalIj+%P%aH0;c zc}%ocubTx!q%1@LB|Et)CIv|DGMRAwE5#j0srNmy9Dk_xIgS7vnWRrh%xZvhwomE` z(#^d_%|;vyN?~vOH}2cbt%0y|I6jP)42Q%z10O>kVM_;f>G6@>p#`JvNRPU0w8%q> zpZM?URc-}f5YUULyFYn`s>f?MuqS@}!Zdfo}P@WJ#k zAaLf8HCdqMO$5eELkeXo;3OS- z&Y*yKGDIP&KEr(HdaqCmdk#@ico(pHlX92;xmgfwD7Vq~kPrwz%aD}^HEcboWyi0^ zrUGV7AaG9<0pE^{d!;5g#lT_l&p{yRNJj8e9(-9AisD0kAOG|zxMr(^q)YNDT~TzJ z#c2{Z<+RlnPO@;eXb{5N(bQ?_Sj_w4c*g1}29d}EjcmoYJ97<=S7U}r4GLJVx&L#% zBp2*tKLm3(k=aBQn4}iNH{E*b=mlWKO3D9MzCl zLpCCdeQ@y_SP5JXLCe3CX*Jp~6yrpLz5X_=DNNTMT*N2msngSWMz?t!t#bX9@HTUr z9M1ecBsHg6?{gw`6ShE&yjhpC=>)d+!co$R$KGaTyQNKkB9jbxrNHIiqjzH=f_n#@ zgT`C!QC-n=l_GhyuG{V=CPgbxeAiH`7>q|SA3n44OSh@Pq&5rt;CaG_-+GSzHn7;w zy+KBOk*3$|ih4!F(#?mFr5KH&p5bxApqe}#_(kUZkD1$%yQ|w5#zZz4WEV=mGu%Y; zDH=Q5nXsanRDy0trY^2*308Sz$KFFAJR;@~-;oe^uqm(e9=6(l&kjcUH=i+~OXB0e zJ+tvkpTYSu6gn%|h(0pAv0DtJZbjA_zSJ?JHNCl@S5!6i~3#DtLahwf=haQBfosSg(-fjnjnJavE8+?5c9%A zDiE9V^gv|4v!q`?T@sU-hmRPl>8{=pR|{lKzGQ#`n78_HtTpDhFHUOS+?67NCcYYV=R3JL-!N;ZEgc8@cl=3Nr2i9eb7cBS;wb+C#K_$LH4$+Sf7|qIt^Ufuhf5Kko_bsS<`~Y zpvL=FamCr%KG*XJPUHNq;*k$GZHmLviJ>1qz3A*Vmroat zh;D}cetg)QCEom*JD4^~?ynk5BYq564Bx0>GgBes`hBV6I@&Loc}aM+hJDS?U!y?DY9Amt&?e#H;mJMzqJ^#zyy2`7wnznd=7 z2&gRlI3vEb+%}d`Mz#FOm58g(p_C#p-{LV8w7Qr<^03yoN&YRK>Swm-@A*oxe)DI3 zGC%1z`9GP-0S^LjINtYq@KCBeqpui46l9d%{TTZP@0B#JoP?%`O9kskhQ+a&Kt?@p zEaw~zSQBO`nk4@>(S{yLLga%NkFfx54qX*rTB@&$MkPt7cYTzSDplGw+zYj^~{V>|dUr9cWvk zrI#b-@y>SYU(dfoQyOCc0}oPhy;J;1A2mTp9hoNHT25N>6btH(W(>f_Y@}I--U}`c zzq~crGz^BGX_!6M`DlgT^G=5i9|?&^|4UA&bme7q8)j@>r}@;pMCL7u+1T8ta`ssj z5$1Gn(fCPjJY{_11peBJH3!OYJ}4z?%WY7~$Eku_4F8CIkAV#tsFJWw_#BDp3QlLV zBA&q|InPDug7NB&R*o3P!{^%H#70)AthoD~NyEFt^*8Su5gjbt4W*50Q-su8ar zvnbHfeWT})tfxV!PnfN|DR1)w&x-&lcr(o-nD5v4((%dIx90#f$#b8WPK%R#jxBue z{OSPF5(8toetSUreg@7sDd>M_G1iX7SLcwp#p41;l79Ex-4MT_-Nh4Dy{r#@bM)D} zm)i3peosf8s8Is!g+^;uW~{7xc+YYU^R>=IMyl``#V=X>S-0Pm-WwfILwH;rb6qKR zYKaHy3EUWDft{Z+Jslsa;r{Zn#dWC%?N{+{s8cmrbJQG$d|wHuV|45(UBq1pcr&%G zvI+KL8*NVIlj8O|P1K(s*rzw%1|+y$7tSDPo`t>}fJw{e9J%M*0yaMtKb=wN0}{(9 z{AjC|!T3u?h3B5YQ?BO~7*>OcA(!t%hC9}Ry^2%cP%Zap58ZC5M%Uj8ejI_7IzBQ7)%lmt`3$xN<5_C z&jjljijThf(Id>-?$RaY^~>QW;rb`B?dT50ghSn@<)p4y*N14Qh!jCXhuMbv8*r1b zd9Lpfvze82`Y$#Ml_$v$$=m(r_nIkQ`34qWb}@2iX}U2c;Op`1e?A;&2wZmFeKd<) zc%%cF5G;~o65BrP$vxzRyiZRFbbpS#K<9(_vzShZoH;D8wMl4e{=~YfwLix&NDJHO z`teZnr9q7|mG^qvMIxB4AMeU&CO5enRwmtCBgZQK5OUZIHq-1bw8mgWwdo@yF?ROy z-406J{+R^65d<@F${h_w(11~Wj&hsuMy%lVi`mP)HU@AgSkNB$K3_gNycA0*OnSVE zfR>sgtrb_oB_+6X+7LEakb!~#QKS?JTe5h}y?f(w2$l;PhmMC9{=n9PNtx&#Ta!3^kKHLg8&7l+$qC4%EgXSgAzRVbyhP(Uz2RHpX~}`cP+vd-c0ei zWJlbia9UvURgB=3!%LUm_|GCRNzxbHns;=6y2Ag!Vep&>)v!G^mQwL{M`!ndLFQ zcFL|Xoed!q?j<249TWFbo_|9yPG`5qW97s3{O0jhV33?;ndOGdx7hhxTqGFLLwYf2 zp1AB?D?L*qwdSKgf9fChGTsao$o2NI~OE^S#8&hSUZR%Ww3k`9;gKG11qH2SfJPavSX(v#d_Qyva?t z(V;ayOIUgVqdr9&GbwNkE?JOO@U92-Bvskujtwzra=n_3>t2{9v?EUf{6-gM+p9D&dMKIzaYbY#`3f|+On6=e2kJw=)o&BJTAS;Y!mBLMTP58PFf(!q9W=H zS3ffULdSU)wAzr&t&m8GrXG{-lslkl#u9@k}AcJ$h zdT28|)mevry!8%_wx6lfJ@@w(iB<>Ar?(o=e2nj`#eO%pLmzhxTlKYjlEJNs=vbn( zsc&ahj9Y|5*ie(opR*_ys&)$urPWhgtHInU5g5{(iz!>O*Y^Eh&@=*v$l;GLcdRi9 z^x^ut%uF_Oe`&LS^UUxP#V8{cO`hu(By#kItJIEox@fxcLEKSLbMRH0?!@Y;8f7nX ztDoZaYo)G4?zo=TEg3^^+-rA!Sv7N27WvXaKjp71`V9MeiFlnJhJAeSiN4F8lBE1o zU2yif*XwEM!O0aUGv5-`nUi%QO0#hOGnj(Njn7)fL)YQ1j2S%j1BIb9F*Y!+dl6D; z3gfw=rnB`2ztcWsHtyqe`|8DGLG_>3o;En`lFrU=_4Rqc#Z~<^JzDRkk?aG&VHfbk zXqd14`H5LQoEF6V%SkX+=GuLYN|Yw8%I_;hNFn=cbPSs=<}nSmmh;e=1`H&sA%bavCne6S?#3SY8QZ^`Lo zQMnE!$gCHfNuE$RyJy#-3jyL863e>-{^L!^VIP}cW4+F9ldw1f`S>nJhUCY^3dw_r z%8!Do_I-&0_a>cJhm&LuI`Y|5W?gohbHXVytd3sg8T~fY#Usm^yq~*3l!E*E@0d)m z#E0Pau!f6c4g!B7{gC9dlf;mi=Eg~zJTX7*qAzVYO47|Fh&})rON(0m^vGg)^2zgn zl>NZ3>hs2LKm0MfiM+2r%#%=D!wfy~^8sQW!vPYlV|6PvEa=1dwNv(~+WJ|j;HHRa zwd~%J6fEuylw|*8*Qg-kHaPaN$4idZmy@r~!@;(`bA_dEaar3ETIAKeuKa0vOW>$O z8|yO`JP*4t_n@G<4UKk+M?FY&;;b6UCGS%w2O!ZQ-MC$^I62(c{lkX0^2(i8hN>wAaomQFq7}qe=4u7zx4+*bPm@caaBtuWcKr*X z2I@cay7TlE!JOBQ$QhxMq(Eq=dz9t!d$(7(&C>n?LivhcA8Z}aE94I7vqNN`qsw%~ z1K+GT4}PS%Yd1a`&=XHTD`io?j!h+ZhB&u^;Ya=&uK~!IgmfX6i(^Yd$!zpulJX~B zzij6W4M?&|)Wq_4y!#-!E{pI&=uwj2{+Zte$9!6TGcx{xVQ-dwvFIBjh&`SsmxSd~ z%v;Jg@&AVLt}uw7UYvfswX8i&@w;kA(-U`lE?n4UEnjgZ8N`czMI455br;s zf09)9F#L}Or156mKP@*8(}?E8n_2Sa ztflgva92QN{N7nuAG%s5^&Z%~1uz(4f~Sz%c^H$79N?OSVkQznA83zOBvQ*f~>jx&Pe~0l+jm z>!NnS`|I`=yrOwZoAS50mNVKZjAob1?|Cy$;gplzd>k|Mt|RKaGrz2KGr)XpTU*kE z9%XNTemwfbkgiDo$tEt$GrZgX_!M6e4VI;YsBc+IM0kH4aDxAgrjZCGv^^e7a=(j* zoOOy5AIBv8z$Him{o3g+X{En@(Fy>ZEi`d&uNw|-U4-+q`CAOQ7G1$b+Gp;enslzB9LBx^R#mX9>=nk+$7IHr@}K2kvVVC1?+XwlrOh3y|~eMr@+-XPtuEQT z&2f!w)%g(9tWY^^n>0K!Jd#GDVE(Oldgej?+FWfCqmbiIL#8f4@tK@cO%x%%xmqqe z`yJi&_I+aLRJSpnSK!l0IY!HICS?h7uB2Ra_&ZxEl;OfLq|3iMg)DlmD{0~{GnV?C zrnr%$YblzGKP>aAe26%FjCIwX=e}0nKd+SU;r-jQ^AKgS>&Z*>ze7>gz^jWtjbh{V zmwgk2H4C959enD&+BK$YeUelzZ*m9Yc}?McpM(wl?o8H>a)7v^1S@kTPi$ug$ML>F zYFUm_%1NRGV80np`>|EbfAADyjgp{2!%8lmhNp@h=p&aT1I`Xs&KNMrc_b4!lLLWR zFkkZ3bPiyUrOzQ-d~qFK%jgI>aR0RI$+-+?!i3r2^RhsHX3OrrIsV&PN13v^_Fz1QHP@)ro=RT2kr4FzAj6Y5oM=$2q#fW*}Fj;4#;2e}A`Y*`06|&r2=F^KF z%c&2mUbh(LEu#^;DROUu<>_XUd%5j|L=c0R4Sz`4HKD7E!yk>eZpT5*d=ke)9jnXv z&k}j9u|E09OV1gJ#YQ$c04g}%bg5OgNcVybwsCYN{I;TbXv+4Z*Zyd5abZ(qAAvH; ziKa;BJ4+mQ3ZCZ&*bw9F0$QHM5rINGZKAlj!1F@A@Nd~qOfM(Y$^P<@zd8AUOA}uM+2fJnf)44W zA={1n-RZNH+#a|=2yr*>>r2_Y8;yW~WkF4ayTbl_EbZ$QVVoEyv`Kwt+~TzpQ;;fq zU2Qq|WD?~;NAdH3qd1K2A3pGpl=(XbnwKBm5{?!!cIos#@jBXwEc)$kGEIi3^9p1> z5ZJID$$CD%cP|&@=i(Sg8hBzy?@W_|2*L(-v4$HWdHwp;!dyCZhX*?7ms8+9| ze)wlh&M>%xPjmvybSTPn+3yT}d#XY@MeiX&cwyH>zv*`Eomb^qy+AKHNiW(Zm;q+yyiq)Huf#u$lok1GCiWn*AP>nH&KC1Z0?ezfFv{i zZNY@>dt02k#k<`SbM{}JsM9Mv7j%f_G*Z3_Zim0d^SE4AN;d&seOfhgP9A^+1I82J zKkD&G!X?*KQq;a`vaP5trM3C<9@7XR0dwti^TxXP&x4Ko3y0kd%n|~Yf2Ydyd2TeH zrT%;Q|3E3|aoCbkZ(|Zrs9FU;NF1k%<36CU7(BS%SjaUv&Q(@F-M3=BpX)HEe8DIm zK`Hl1-uL|QqjDF0fr+B`6>Y9 z>wtUoiPxyDw$i4|WI?)CV~Jv_(k66)LEfabq|UO^H4FpNd#Pju<_=}te>jN3wq<@b zSa^B>AWeTC|BtjdiTP5O13d&9%2ImP7D+>Mvc8##vCukFsqlM#f$y@Bj}*g1v4O0ST-Peq^})_?a@&dL(!04w~do zU8tsRT+41vl$x5Fn3Ii~T;OHE=4e4Egs+n+J<9+(p!I(o;?fz;y8ynDyak}y2hGui zU^s=uP?Sl)Whi)FENK7?Z*4BEVhyyxw5C&#(EfKd-Z#ts4GC28GzfGP+M3Z?v#kQD(Q5G4OA739{F2?!$KvpQsrflJm^+3gA%dj9(U zL{QZGFsK-L9l^?qQodywmr-9$J+^WCq#R)gfe96#NU)}3%EKT5QyZsLs zhAA+Z6ud9)3yu&V%xVO6S_e#XR&xO9!{~OCknzHNY6vI-)~pRV;~>=z=kO1WRZtn& z0HL}VjD>VFn2JC#C3kf)=O-@yIE6j@TSqh?Sb#Ysiy}#zl_;g4K<~SNByE-sI8Y-m zBzxog2|#pDN{QE$&vKv2Z0l75m~fOe${98D$p44m<^0a31JwcRXjSeWHTVm|A0Uo> z!T$6R2!u#RA!ysI!hhEE`iR}@a6N+0ypxWw9S5V&23o0j(#Q;cFGT+zjXh$bRpSL1 zhzb;qorABN2UPApV3xD!X#w~6X2{{j$O14r=T}y;o6ypomY5aOxKSxZ!gl7G%sY>Z zbm}eG8hx(71iT+9Yn=od{Ty)5Q45E?D;pma{3jXN7y5cuN<$1a++dOm4}XOtO*v%V zV;yxqM2;3{%WP<5&p(!yIw0X1l?X+XOpmzZ`3V$+`#*;Et=FZRx}eAV0m1!Om@+l0 zUxQIZ@hdLKVlb8JS*~&i2&=UFcSb)(Xl8nPH(cd1P1LtgJn|j~^QS8XjWJjx>#1gJ zo;pE_861$Hu`iCd$ETUBf4=y!5u>0i&H^iWuoQb6j0%9-{*m?nR1jtBfnL&y1C@W? z&h{R)t<0l37;Gy-UvGx!-l)PAaLB>l5TzuY(Re9-7csRB1DbQLo~>@7$q2x|3@+c zVT|4Mhycmb|I`Vz6FAt`d7yF;|7`-u%;Rsr^ucerPy;RfWFP1u=KuUh@)x>z8HEDs z=XVjn;0BZyZ}%s+Py>bp14JSj%?UaTLGhnP;cb6u)CbhNdH?(EE1o9}VDSv077JGe zV+r`=fXY8D#WUE$<^RJ4K$b_M|Jy-v0h1l24ETR{)&KA6KBrTwa%HP{HAxA$cdYN9&F;dF!{f|en#-IiWrG2S<#Z+EqBw%uestIwNZUMOZ$ZDw0FH7#)k|&1X`#q^qU%kFZ)BouYpVR9JfjNXjejDv}!x>%YmW!u=LF8K=SyMiatU=ZjH z0=k6C9q!IH_`ZEvM)*Z>6xZYGlA0v!<-GgM%V%??gY<1-NyP5O)F)aHt6JIJ{RD>( zR8JHZ_ENBeKG6z49{U??ll$6i z(Y()uy|8gc@bq)_uWBy8M$tq;cL6M7?g$puw5f{zf19Q4)Lo4le9)Kdu{@!})C{H0 zqp$u#zEj)S+oNGTCRJi(#OUXc15Pxh;M3LTu_xfgnv8;x;0RJr$ zW&vI5`7Gkb_osY4WcOpubg*Ynd}@aVhE#pk2`D^%sLGO=j;?IVP z{>h8uw`yNnfr`SNM)wn}weHdVvWyw4>vX}i& zcNG^n_&?q=@@!ZBz649ZBmpOCod-84V?RS%^Z699X0t(v)V=P>B#I=|& z*-cV41nAs{!&A>XBZq>=g*c7NdUA+SjsteHKVPFnw8()W)0J}+{{wZzi^74lrG4S* z4ezTy9m^vN_V?+}rlRO%7CR&7tOkRLn0_?Q{2s0~ybU6QjjZ0O&h`9=hIHqlUc5Nr z>C*ZJTg55-u!iTbelL*_x@K3$6Al^w@T8*VRe7Dm5#uytjJrzs1&_j8i+kR@$wT?9 z;`N^Bz6orw^jAqvLDVdKRwpGnei3NF(s6opDj5$>&yR@gQzU|BI68kEY(I(1RT+>yVowTdO5`Jm@&{=+=UFNf=cy8=4 z%UN}|a2owyH(^M2J19frRYY;VUe~?>)ux@ zR}o9TJc*6;7Ts|U`|xw+ntAvrHFB`#Pin)($Fu!3-|qt357-PagjoI0-L}%*dP%yB zYsl(fj+k3NPUGehDAq4(+zE`NtUToNTPp|iOmHRDAuWcj_O>4GZ^@fW_zi`g!kmCP zO!8B)wyl4|GU?6ffLzu^!GmuxnCEXl-dWc?$C-$1l)q525V(Qrx-?TpF2+^6yXJGj zKn>+MZ3sDpR_qdFHgjzo=S^6!3S8ZXNF(hu{8W|rFke-qy$w|m9G`(dnHelK^NmH+5J|^735U}EU&q8{L=On=9bw;5bxQmpXYAX zKIMJ!O2S^SIA!+TcIbzVw1ua(0bRw*9Z{s&TSw|iBQg{|A?qJ_Fr?mUWQvD6?Mx{- zJCNm0-MqWp1p4Rb7k!a>ZAfcR&$Tu(l%@!)X6-@K=W3DTMEt7jdbqRF~ zlb1K6O5EMw31OOPEJ{h(wtG&;&94lEs_r=v=BiWp{4HllTFY~93rnNyM=$!3slVoE z(JS%zff-0AH}IT@@K*EOv&b3oynpJ@o|!J}VHzWeA%HUbbjNf=GCkx$Oub$Y1DRF6 zm|oTPsM>RW8gGxJ!9$6ud=12E-K9Y0a(rP8MpUY4nZU@l>|X8W&~=OM=nUV?IoKmY z#-PY|Z`{8qpEapxdTF(VQ;^zCxoPfLESOHr!&vpQc*T9s13)(OO!`j;MTSjMJMgH7 zPpl5NMu>n(tEA6l8%=gQ17L?ao$ zlm|Xj_ga4Y^XPDf+oQ`jn-3P-BEn5&(CLk5MH3GOMZ8wqGXY-^!u!xDa;49YH6G}nTtQOdn=gtn!}R>eI5t{y@RYBz$j^VJmP*caoH(Bi`@&P7S}MH~+M&XU@nnrHj6Cyu!nVA|~f&?QluL?LRz9h{$uMmka-b zh&Jr)oL^QM8Edvys>vI(;$(K?E?#8Te6;`@PsHSP&@qhJo+rbkJaNY?% zwBX}yl#ya0j^KCw{)a7LPiyBFP7mxc!H6~Jrj1t#tgU0Dr;ji*QaFfUJMaa{= zMe~(!a$RxN>9Zxpo+He8hwf;xMQTc7HmuO@1sLPvT3Xd?l zBs_$))b0QshhoFuuS+h|a_f4oH&PbNbf&1B{u8^U#H3gcDB!w z(|^r%?i=OsDEm3rXMa50kXY96YKI1&8o*H8Y%f38-t{tRPX7YpD_z8njCH53%8@|g zejb@~g)X$Bvt+7UT1Ij$J7Q~;0t4Fx0{ynNhSk4qFYnjjQqLSm?~l6{mF)x&nVkXMXKddWB@h|=I|1;6auT1 z^pTU^GPiCT9LQ9oofvV4SAPk$horrorj9rJqQGED(9#VwAP=8Q|Jr=;6q739X6F4L zxvwMs`Y#I;e+}4DggLu0#Xz_(B>_Z0XEhHZ|mwTx%1B@$u;6qGbGYY3jz#&sl-;;rYri#wH!XRY=9*-+qH za`qT79Gd^&yHDW#)5z<5Pr8E!%^s3+=#f#k24=h|5r3uL18?rLj#1C{vh(4kdVNpG z{T!heBU$=l$JZyk%3d#$OTRiFjXkM%;PU}qJoiCkt;N;nxaEUEzoaeD5ckwaZj}A{ zl`XSAv#YAM>diSl45IQJuymKs(iN92yV{yGM#&$mCEj-j>4f!*9oPqf{%}rx3`LMqm+BIa zQf%#3gYuqcuq$vo41eXa(-8d_p&WnKw!c}qHMY*oCW9e_27B#!E|pXf5?7F~BVX&* zX6l^#NqXz!q>JChy%$+AHy9Qm7rm6>$y5+E7x}AS#Wn}cc?PKKN;n!Mu<$|~N%7*u zwEwVp{oxv?K>v0w0*Ujz_lt9{y6ca>2U9`<{%agp@|8XLi5JXJVhF66WgVEpKeD)) zSOr?$T|bxNZCRcCc;8Cl9rh&R?mQtw#+WPQxNWD$Xx-t> zL{uAMEbiQNMBY0wF3*&zTMYTW-;!IOTVcSi!+P+iP8MzXchhn8Bg2*W%(%Nhyk6bH zCh^0#eW?G_d0oVksm#iY)Us+2hQT2~6~VaSZ0a?*f4aYMMKd~#2_>!GX*;+WC*ZLb ziKQbj7oSmcyqRh`zbsO)SLeGMHb)U1U?H&c!nAz?4f)-I!{92iapgtvh>ni`)@Rrp})V= zIJ3y~G%rJX`2snGQ>Pok1Tw3>9@}O)y+~Xpm&{Gfc`6|NFXTmBCyYmyBl=zw>C->J zWu|UbQm>SDA>p6}u0DIQEHd$w=Yk+)7yNg%tz@w`nonXk2$v9|SmEgaq9=odhJlom z+vV)l)n@Sm2WOc`iyH70T?PtoP~A<Vj?c~cy}cN#=AQ2DQL9k{v#qxSF}NC%wF^BG4b-{_<;~~OZ)rc{u~UdB3%R{2 z`Yl8e-yaXRlRu|suo;b2soCGbrO^tBqeTnm++x$A)76MdtK%+9lJ4AlWBS;3UNpxH z`n7!>$v>Jl(-cBT=z7@{h1RT6Yc?e0+4$zmG&~FqnZej>!J(PbhH%&tXg%CMP_Ud$ zD^k2eNO_*09w|7m%`pD4I%q5Y`BBOMym?nRVnnS5i)wnMK+&$~DG7YMD`Pp#S*ynN za&UgGByC39pJWnk`Ko}Whx`X`Sty*PDS*2CmZW&8J__XlPLuBxo^(Cej?}Ii11!oV zMh*K5*q!j^E>oE(F>Rx(q>-Gbw{U;HsJCA0mm?!25OLdx02)`5&iL@Im?qw@+68an zX9r(Y8a{l*0k)po*VuU)2atg+%YBRR#*Qr|5yZ~2IVT2k7&%=8Sq_hJQ=VK|zR2eO z9-cSgRsNc3j-(cof7j8^`t6T4$FtbQ0HhDm{7%c1R&N{!-bLM%$Uh5!3Cz3VL4ZS- zf}HOlIMpqNKs>6cJ^(hP z!sIt6s%dNAdPUz}@T{*GP9a9vfoVllDo>4Gg8#y^j zw3_5~Opg^BfJhB<>AKhs2afv8U|W2O33-40?cGJL*ZE#SXTM=q>f^jFgrOjHA)+dZ z^s!;SBB-2+B6avR>0@$K!7a}FxehIzS1w?UV>joRHFSLNuYVdI0X^d?UP-Q>5$Ub@ z=349J9ToAj*bvPv#oV!nyqWH3%WS`O*wD@H|SEtH$Ic zdwZYww1n?Fwl`w}k@QNBjLHM*B;5a4i$qa4V{m=|>Ywgb5BByE!afKS71ns1W0ET+z#KM~#?J?d=TN z;0$l)NfD_G8+}iFC8yU4$R_Qx{Z*};8xRf});S+UEk+Jh1o;8H`Ygbc`n?vB4Goq0 ziv23qq5@cXOVe`1uL4y++nMW&2c3c-LWkW1$Bp4|rSAtp~L{lE%5C}ZrN`Jd_HGQ)k*+OtjQqalmtmVQ_Je- zmwF)79!_-o;`oo`PUBUX)wWm6=!*ltfpXik$8JQ?MKNOip*aZ1zKOz+rc?YRd943W zK3;OJJuGjClI1mb+trqLfs$eyt&3v>;UI;m${+nSJ_kA5#1V?L_0QF7cqL05DT)Vm z8AI}kC7Daa0^Sykk3YRHrYVg4P3)oa!YY;3^7*grJqd%HXNw040`#JG6WE%sitO(s zj+TT>&6ivIX3mDLQ~7AloIb7v7T)6CcBsyy%%n+f3!8Uei#itXf0{T@I{f6rp=ETe z>cH=a#!WR-SS)ZUMWNdGHe!jW{>_n2ib=Vy#BB=BQ+E!|Od+`7!1ZgNhu&YDaG+xS zYBq)4%i*Ve*|hJIPswE>N}JxS2sxwGJgsJ7lvKx>?NlOF9;zW&wTH3FNI{;h5)Fdi zqZ&MmIpLr2jAVQd2SCZ$KOvhs>M0?U%nOOp`qtHdd7A#OPnI{$q1U)hwH3+9M6As_ESvC45&47 z7HG%t*gMU+CP4x}p!$t{tKhfUAVM)*G)Lt;`}ld{z~bAs%JEbuC8=$EA$Is7i2UUC zt*^CvcjL@pCR@OD);rG60w~Zc*Ly&ntF=B;UdLayrUO%D<2Bj-{7^0Oas!K$=e?lA z>{mU&j-t8C5v%a|SAJBC%Bh?G>#%oF1kEF?{H~&Ojv3kJmY&bU($!w0?Ee>YZy8qA z`i1>YkW#u)P+B^r8>G7%DT9!10RahVkS+lM>F(~7MjC05lecn15wo~?{nEG|}?7rh5CQIPV`?v=<0LVCP6Hj<}jX}~X zXK&e?#2HdfwWNo#H{uWltAxUwI@QsZ3J83n9}ia$&wj>wM`z3bWC^#LcmCh}Zxy`> ze>VG>93bQfgGJkqa?C?Kfx z2^B#`#vh;X_F(7%d}_PpG3qMG<)wCj)D&r~wNnO=1_9TDk>5Oj%wKWP0Gwyb*6aAe z8W8{AxyOl3j2j%VZT;X8`nHb#BJIZxS7+l);fN!V6;DM+2$$Cr}=!2nql6y#$gy?pm1U9v<{;Xp_djq$U-B)0#lAb!* zDsEd%MwT7l3y{cs!r^>FIO>dK<&o^RqadHW46<-r?oUK9z z<`;d(VSV;M#D-1L5XsQ4iSMfP&S@D(@LBNWreD_95p4*vQh9H!`+7qCvd`eI0-*2_ zpo65KiWZLKa~FiS#~`4_k37V`JbF=KABL3Q8Z>YSS7-U2W+$@yHvS8>!~=YU$W_KQ zrk~PX78f!f?^tA{c`D7bG0Ujzwn=2ggW@?TJ*8gKo_{+2Jh@}zveZo@6HnY_=_txr zZo5=KcljLYnbxl!kT~)Pesn_k7i?B)e}16_Ey+ZA>H&4&BLK0e!X}kfxgP#{+^p)4 zi%iOIZ^YuPy7uwqPXVC(B^-QkeXjAb{8d)v5vR9@|6<nrlO$xHJU5{>8()rn_15ll?WLc>&E;p)nrO8aHSDOgMWKS((_4dzxly9$!kW) zmV6hZDo`J}5d>mV`^~bD(G*>{o;@%CRP{XudaZi;D!H0e_5)CtWhKLU@mBui&%CcS z4ZSzOOs)2gni6q1)-J5%(bvJ(PZbAc$wcMqg=-`5IIsBCxaj1f-uoSRJtJY}2rQ3fGUSg2tb?#$(#QHV?Och+yj?U)p;^N}z zX49PDr$#AAn7g0X`l9k$bHPb4G~A{(S7rWPKSLV=rycEwDDxLR50}Vtcb{_xenM>i zXnK{^`=uvz+yI4#AMRZO;n${!EKgWH`PqM!vMH9M=YMPEf2p8_T) z&L^|z-oUEroBvhWKiJ6K!fH?-{*#$}={)}a;{vS93879fWhF%{40nA@*$6xO@ z|Gs=)DyS`M!YGOwtg__b_wzi2y}dyM7~15Uu`d!p&fkzSDwMrS|5T$pWwYX-uAB}@MjVOkOj;d~-oCr4G~b*p;s+A8*Ao~Z?Um2-ofS6N zF|aK}6|S|b3z3<**!6U~>T9)b{$I=ps{&x@5V;;-p$8@G16F}3ka>VFiww7v=Jk7J zC%(jNqP}W7(p(J`yf19c#_KDo6+D#F9_I}@->lIy{FTwbB4 zrl$JLzjlLZ+QeE75%l#lC>(Q@YhhF~{~%QFmdGD3VbcumuSiS>@{7QNvoh;Q6Li<4 zl1mzp8WA>7Zk=e`Qj^^-Tf!PCh9LYK2sxkYt%oNeiQ`G zc<1-?en6bRG&Juns*3FHzSZvLQ1*8I10dRob{X=!Z1c#*7X*TP`IXMZN6!xw%v}>^ zKZ`T_8g=`RkNu>Q25ern^4a%UkU!iW(6SW*gwJ^)6YNmYkywIoo z&Kcr|E7PTRl+Wc;h?W9?=*`IQFHjN#CetmJfR-9b*!w3qpJYgcgtHpA^FZi%8Q^=g zeSuJ80KOjRq--v7?=ca8ae#!kmXK6XIOBcSkBht8hGuJ+HyM-^rK8D1B;YLv64=kNK^Ek57ZmWExB3H;`tli~Io+2$R`R9iERXuhTIQ!y87*-Co=nd=oI~2`VZ+ zU#K-l1@`px?caJPhi~V%*T=o~l{1|UqIEhxV@7;za?eoD!wD3*2ZRXp(CqRE62UX6 zJ5b=x0N0TOF3;yef%wTQYAx1JQv{rJ!!V18oh?zJmq@2l3%}}A3e{&so@TaPz5#c0 zOvx7|-lit&I1z zG=euo83PYyr!Dk%_>)XMX1@>1wdwM@-Fy8L{asV0FCHZaosa@pLQJm;tLfx>`S0j? z%;xxz#bj;(*ncjk$ts|cZ=QPUCF>XqCz27*o;q1hiTNMB`NHo-UiA&5FowyJ0HmK0 zVJck^rF{`_W0xo5e)3Z$G~v4CvRTt~?4nFMh83>a-7OIxf(fWUA)=;x_AtBNtsriX z=leKY>5^+T1M0x?OC!#obPKDbaAb-pJZ5vv(S2u@OcB@YHVXo|%6a)}2abM{U?J-& zKtOJq%r_7C-N3fV6ymfqWjeOj7p!&d{6~3fzopErpCE=#?Gf<8bSAKw!VdsI(f{jR zv?Q5oB8P*7fLN5QUcU#m;KgXZpT1iyCQs{L>}UQzQ2$Ol<9A!Br=gs zRkA?XGTTH92=JT?&_I%qf3b68n2Kq4Uin4!X9mKd^qWNuyUQQ@ACBI26OZw{{?dA5 ze;bQSo;wJx8CiVjogho%F&>h}4*;8W7#!k;)KZ=iN`-?tdgc0O6Qu zeWiKd(Hav>n;sOML!s6k+G&jq`VpWHN04gVh3#lkI&O~8s@>U~?ql~dB@OQDRPwsq zeTq1jiXcGu?E974zhU{aENJn$DuY7( zm)!qXsN;2T_^0WHQ4i`2#C`xsu#y^2GSh@TyX(=3d+SXp>gHS%D`{D|(I)(B>20ar@PC|k z762vl8JcYY;PSGH{oOi|$zY*a7VmEfNG>%_0BpkmR13t5gTghfN$^mbu2zXABAaQa zc=T^3d@_(|kk5-E;wUBMbKI8Itf-0UlMR^bnW{ zPcv*AWC9a(se=hSF4&%J&bvU0X@Uh@@h|(H)No!p?9X|Ld>yyZZ+L|Mgu4S2(aMYm zWp`(4K;xTh#~yS!Ya^P7r(!j!o~5Q6%o70viLMkqQ$yR~2Yhv4@lJO6o8!e2b7$s;z&n>@ak^ui2bpPdyr2SCL&H zgh9eCU$>Rm5MOdG2OaFcB7n9h@{0T@pE0HbE>G=@46YReUEeA66 z%aX-UF|9P|>jq#3K@HH&%|1;Mr)4Q>@3FsVaGVr)9^qjE-GpV7AI)HdzD{qu<58lo3ryTzi#f&RzJK&!qA*7?uKs- z{vJ{q&$R$rdTB~uI;L_*3kqJ1{I>tB17|cHDZ1U1gnB(z5#h4q{FD~A-ShPElzTWM zTtEa#QCdEnr#mI$SL-RO5pB=zWI3U-(+u3-Fw@1)_Z_Z?^~6$W#PWCN7@H$?1y{Yk zj2>!KO4*COT~vgAx9-llYSzxeo5E(LV2cz@4Z2 z@>az=i`BU}`LV_3(?7q#Tp37W!%q_e?SHKWZ$hQg8%p?tND8Kk)#l$Wud?erDV0D- zn|9foe&&yg@29tJab;ZQ)R_P_v#>(SYxFuB&}CgRUh!!p z{hLRC%{sK0hG7$xqmY_jD5$^E)zRkJpxo%l`>WX#S!Jv9er?oOmV~vMYAG0ff4$|J z8X|J(yZ|Gr{hm&>vGPup0AaS;I!FNV(KQZq;~uv&o-e};)eY9;U7$)bkI0MkH)Loa zcvGCTqLFf;?fv0jTI-9Jy)?nSA2O(qYIo}Ff$Z0MePnQHMocz*JS$P|WU%3uls5aC zz!or#3da;uAIBDi0&ENVFzz4|_QlUZ;fSszc#)cCO)yqL43oj5Cihd3pt1F3dC^-m zU#MJ%CppLK{)}IlEQgas;5`BXqyBqMXo(1_+Tl{a_?p50ty~Wguyf?C&`5CtG6~_Ekx>u3MzhKNCTf4D9w2R*o$nZ}Yjb zOa*!vTD%Mdiyz{U*{?~zej15wzz^O|P;|^po$>M+5B+WTpkAp*7yW6h7x2I* z7wvFa?&^;>8_WF`Y#}`BkW$hN>MAlgG^*!(Q4@z5)cvK7Gxml#_xeG5LT`;~^O_y^ z@N}!~v>bY^(QRaYjnv5>csBA1S9)>F#yY(O_}uaAG(_LWzRd_a?kXs;oVV%$+gU=7Ygfkcl* zWEj90-x$E_5}bOUsdsvNM@3(QwTnUzKRJCue8$NN>JMq${^xtbt)C=9?2LvLJqf&z z-zgdaS=zMXBwWDy)5~kGtCKzoLTKI-m^d^wAH44#PA(I|Gn)e?TGcv=dZ)cCMVq>V zx6uj{Gq2~rDy}&_zw37B3B@Fx_HBC^pa$*dSm35nD#0}&emXowCmw(KViuLCn|8@k z+w6d%=E2LKp2f-jaCf1e9ZG4JP25ZF+Kh=WT;O1I+9czaQ-xQSY!)ZlKp?i6X|5)^ zReNV55dw5?zXJ(bm;pT7kKe^J8-;^#U5{9e04 zHHb=z?#@>)cH6>tfcU<#^ZFzx)0PqyRc-5>=T)o0wpt6E@8R~T<=Rjz?(xRJI4ZP@ zGX^r`vCTGZzjT5}JNsJ7^DkXW41v=B9HbxZUk_(@cdj7xm>!Tr7srehda^?0)xo4pKw~_O~dJi0H0A%-zjXFQo@$0V7SuNUs(SIF#^0CXb5vwt?+77 zjIHGNKuR$o1Zq0jpJq<~2=}hp>Ty^Gt5Sy)M87d$0~xWFxh7MF#047|Enz&5EqNM~ zm`&D;v;m@0NWw#Za{r^g%X}t^MlM@^-2HSndj&b6pRD!m{oxkY{^%;ri6SZP*M>7z zenEvNoar5{0lkK~2@#gAFH?9_#7NUL$nKrFiuT3cUNJ`6-oP6elb#mD4}Gx|<0OT< zpRT-TN2Fh~dqU8XF;;<9>Nx6=BIxppR9V@jgc@EX2V;-k>{}V?-#$WYmWudz5k<_u zRewJ?>wBl-jf(86FF%PKCXLsZSd-537MRqKLPRw3r=G`$9dEmbySF-IRzQISOiw_@ z*89U+ec9_}ftajXc#`qaD0h%$j4*$8YZ;H|9fdbAuiR^{+`_D@HY=sZ3_BEe@1j`0 zFyyd06B`@|A;F|fA#~vKmMCjG8d0rn}ogELeJr9cZPi|y#@Sa zkwF3GqXbSl0{O3eAX_k@>Be94ewJt{-J1gP>)p^pVnPrj0mJnn(3kST-{uzxks?M9 zp{Zz+2CP835v>kBRS>F3AX-92CSfoU~_d(C~(3-r6^ag{b`H-99o z8YwVDa&X$O^}07wQDVWc%p$B@dYtxqX2-YQG_nE!m2w|V<< zKIeL91m1gay~bufm+JypKh*%rLkh!ps(bLqC*S@UnN>PUkq`Jg#+wIUwkwwL3ce|S zgI~k&oMoJ=poviB^2tkRvBk!zuQxdx$lGoKh>o4*_b5X{Lu(mFYC(wgD`1b+fi7HF zP$8$j4X@vYys}imq>G3o+IA1?RDnNwbFt!AljXY)d-fNbUXWL|eX>77Wg`QUHe~w^ z*|e+t4Uh9~0=s*kh&kId{1WG_(d9RTiVyg=kYXP5I~v?5iwVmm-u07E#oq#!Q-$3C zgfni^Ya$w^TXk?TYKr>#{F)tD>?os&VKLH6u=6_clcYMrtWe|!S||wFQ0s%0Xt(g* z5?tt_;s^eGjG>FkkON+wydIO_?U#ug|cZi*1qwNEPAJGn>^SBYu2NHPurDj_i-HxNY6y^Ldh>;x3*k&tSY`lNVfXlUUbTVw{Ui=+8 z;v`3{ze6{LqAdqqSU!jhfTdR9?_psyIGnv(6!gJA1RsnwW0iWrzgL{ed+C1U$&gKP zSZ=tIQg>WtF{n%GYwA!lS)?0@`9>9=#0>QROyKj(F8S%-N|y0P1vB*QyCO)Z`H9$4 zk->}Drf58l#zIMiO-hhRXHUa^Tm?Q*-1`Bd)m)>GJd1FFqae$x=JXRG#F0W7%15f> zYKdI-#`m&{A)R^t&U>>G&31>QMRGJp$iMtV@#uIzP!@Rcj%)UOY@p>eMwb7N#XUT0TrSVpRqI<3Tcnyy$jt zKn~iYtx#D5YLolLC_$A4Bm9}x3t?>fBbix%lB1mABw zTzVaL+w?IK7Xbibjzo4ma;)};W^P(|aAa7|;&N3oGnf(|#b>EAlVHalH@wQAE%N=0 zp*1RVxn{dv`Ivsi(g<%MK|JJl7G{!av;N~O`7dImbsVg-F?{|awiK;!@$4#&i{;j_ z6Qw-!!;P1ybh%?_q#XjDHz<;B;he;~J-YIhjN6kIYTN(3$SyFb@%iJp!-qbRFJbXB z$QgfR&X96x2U-mElgYkHom!_I0?@f4PqkD&$0(4bi8B{9C#6p5<6!+bwdj0vB@M!E zSnH$$F>TI~#L2;CW_@#Xq4SwaJC&%)yyWJcnEh* zsazM8{G&s^*#uv<%JC(-_wmeR_9EK7v!Y7)I!~FY>E;q#Z#*~VTea5K(UWWR0oW8C z_$WR9cZio@L%hV1%uYa#RsL^?TZ4xmA>)CBD$!RY#qJyb5c$dXK*KALPP)F}5lV-r zazkge%@WnnTH5wt;ivaW^ChBkS)#c;Y697#P|~eNGAGu8$pSa z*+}i<;>B7YKlOJU_IjXaMw}7RudM&3tW9 zM2s7eJ^l{K&}@>nc{bxQyaDQS?^Z?-9JlU%9*21_u}~Bd0Et?$g3c5ho*a0ET|nKW z@S?CY7$21;oJ3?EDa`I<+757WAFI)9DeYfoOMfA;yXsV_v|M}$&{l^k5u6C#;7Vii zCx1Oxy9%jTzs^DeUNsi0)DWIAv`DuaVW+8)_Eir`^aJAxuXh{Tu4lWv6q13kpu4rn zl+d#=to2C~Y`tEQodP=~Sg*ve^*R^&!_`lumm2IkfFsNxMAOK|^YH?*n6eB6Ep~Jn zp-|!%I3TGqWtjF{!Q%ZwDFNvHp-PP2VS)}$$epDH0+6)nYQ9Bgd$-_`BIGa`OqE3s zgNW-J;O0u-f5spcJx^_7+J>o@*ep7g*I3liB6>g3u)_9^^jp@C*cfJl_J7m*WThyj zh;f`CI0c0$Cr}AE;Qrr0zrg2nG}9MwkMh{+$@N&y4yGgY#>TS~&?|1d>i?N7zFz)Go(%wzXAm6Pj_#v8#yl5z>ZTVTZKYHJMKPs{T&HbP6MMHZT*@ zlbFmwS1DK{sednSxO**VHImut2`u}v*z9$#(E$3<89F45g;!bZgbTW#U*}R1yustK zJ0S~>W%QlHBZ@?=sj<6#QUTxkOXsKE`gY6P2eIpe(ZnIYhebg?{qS^0ivjn`wx9PO z99#Qf(4;87;|teGW=}ZqUJ83Uo=qR((oa8cSYPW;*3wx60e1qt8J7g;IH6LftAL+L z3EQ6M$C@`^d0bM@28{*q@k(eVqG$cB)xH1H3Y4)2SEme(Zr75FO~Uwaz*pXt7$*eY zJ2(||7XYpr1;to+PiAvF_|#H!W%AEl0-Ghq-h9JnSfeASe02aO^}jm4{Mn;YpOPHR zI-~=IGC{Q;hDRwQdDWhu{1I0E%6@eFIh>^H`h4H+qV<`p)vwSmnSyO5ZLY(kw5qk~ zAZat=-3;`>l)9DHA*2h!SkxAH)K5U?Bn(nIHBo>}0A0?}*BG?Ne{f{+ksHk+l)vlG zSG*s@55F2td|}e#+gp2PLycLJ`iqzelR`Iuf5@L(TZ`$>xq zmI;>hf5#BAmxcqYx5eLGBBLjB)ch?tM?5o7sg^ev&rs+&CFZ8H@KOUY z00D3LyO;OPO|<@LsHvlGUoYGsnkoIMa@t>GKqtdw`RG9i@`yo|czQ+~#e($25Gop- zT9$I={l?Lo*u|6zOlfeWw4TATW4Aj^%cwR$j1|e~Mz3C?G1W4+<_` z78^pqE8e=sRmO(3>L}@foveV~t*``muphbdU{lmPJyp>B??I9N#T&exl6-VS=b2sM zVmS}T&0hwlHf#2NF&F(kFtX(9P5qts&6aF4e z2=O}cc3>`Iy$3i8Sfx@mOFC$BjcaXbiRgV@Un^{YQV~Gc9Y4BNLA&Eg^jqk`3KAK- z$bpB@YjrU)Dx7~YhO~#+>jChA(}0=~QeWqj_+j+V^k7FZkMz600TmzosuX5V%T)0d z1hQGMr=a=&dD2YR$pM>jP|VoBQx~CI@^06e_tWEEP(rtCrql z(q?z})sCKFP$;4n^1NHIj2z9BkSI(T#bz@>@S_miJg%{EJ-tE)JCbC1XR%Om%f}t& ziPMLPKXZ_-Ei1eo4}Um;PQNd`3>E>OSLgsJRBkRVak1M!=UieIaqYP53AQJ@?4RJRbcg%9+NF32Vp8E9bbt!A zcB98BQUqxIu75R@*a^oxY}nYo`i^D%ts%hnY`E+RckXbv?8pNmbxMXLHs}Q)WVzfP zkh!teQ1Zq9;Zt2tkWcz9fdI+L^f`gC@k97;Y#u84g{pv;-T)*dD%{*7!hP_Ot<)G+ zD<&gb`|o)8crMIV=Fay~B<@jhxj2I0xa<5!jQ*zuh@~a#YJRwh;O&n2Y?b=!+Odr1 zO>J51#WApo-5j%|O-Hk0kqZE@cz$!sd1Uc-1!2Owlr(OF(Do?X7#O_svQF-PY@>zC z6?7}BXg6sCtO~niafo^MRr}Pj3!^|FqPM58TtL&tpx3Orj9q+c0k@48s!-#lQe3Bo zPP~BY$@mH!X!OWNUkB4kV1ZIEY;uw>`9zX~4a*3CKR`rE08xy+Wj?*HLOaYJpmqrf+auj0G02jVv{yO4ddr)sv@qQ*NP2pMrzXib? z6p%WuH!yj`1HD7EN|syF?tSJT;?RUfykjvW=L%8;Vy5$o*T39T7yTZtY)L@#ztc(@ z+^(CoA%v2xxKY^R_WN)9^uwi8_*dHpte*^PD`4Yxh^DsJ$f?&~Xu6jcn!y~GvBo>X zRZ_fLsXvMtXdo5zd=^RmLy$|n6(GLmO}*{_-hY*C@DMj?NBp5a7Uc&H0m`3upCc5~ zeqB+6R!rDiUHwx4h0SHXP^UCJiA*JvAW~(warc1g`-UP|tshtm$MIsBUiGgdA>O(x zwcR^XON;@7Ti+K&zs1qM1C|%ous50lMW!Hl(^m3s3<`%pLA1(-Xpg4PLq9zb^0*mT zOTWc|8k@Y9p6Fm4RGhA?6X&l!OuWybAYW>-7nF|U`3Abv-qI%i5wy9P!SP-V&~I?l z``Oo0tg43vQAmXN58<9&^U5`7g>}S6^N(1MYcf8YN2|H#wK&x&ngK%Qx6Eq=3tq#! z-9LiGw@ye-DD`tM{_^u-AVGo4LP@Ze`HCb5$}%-ZJ{+&+-`Q&Bn;| z@sWKB-W^);&O)rb@0mzJ6{#QZ!)AW3ZGW7e?zz_SG-3t5(7Vb~Ijb@?m5g*Ei7#ojwwj0hpipCE4H@pH?xU zK*qGiqGKm+rv^ijIq*?$7`;zl)b9wpA07}~k05Nn{lZ4>-NTmctvQs`88FlaD8~`aywd~v1G zKDQC~aOUheREiSwU752mZ6bv0ht0v>;ERx+e8hTdwY%ZNB5nSn0u2Pn;dt1}K&a|z ze7JS?1)Fi}C;i{>v0rF4oC_0{!Y$vOn{Cz48y5VHTYb0Q+Wy~Q;bn^<&%fPcdLYek z(y955WctsZuawdKpXnhstYr9(tzbjqw)D63e-Kl=fzI9M5~sFPD0$z*NkleiO*_nJNs9PHLbWY7KOdalOUsk;I1!c zsSTxG^RJ!Qtz{nW@>XSG>K5nCIT18_UixW7^PANv99K2cwYVL!j;+!9d{1TC8vcCZ zgfI@G^BV^}sp^44ws(v_oDv-ofTFc4yY80bd@FK&n)?D z#gDfPDQADSj^pnPo-fYvzpPp#--hu= z5vK4|6fV#ZUt1h?9DzF?G%3FoIzA&887m@sLsfCnprvGTJ+>?~@U26_R%CSh>la`b z#OWl7ow=!|?l|1;ds<<31F)&pL~t~GTd!CPoAZ6|@3w9k_;~02jueo{pDOzr9SNiJ-xJ^9C-zOT8OpXw1}s90TcWBx{fTDsd$yPXyMJ=T-RMa$(KO`hVG zqzNh$PXja4c8{4gaE>+_sVt%ycLgRB#hNv*(hR2GU-ZovBuupAU%8i~Au8vpT6Wqg zC{XOu{A#qtYS41~R3zp2y`xrey4;ABf=^uX%l1=jI$5+(r{Rba!;cLQwu{#l>ZW!V zdeySANisV-PlWK7Z~uf`&89$DBbVINkS)JJJmJ<1SEcKrWePT>#LJy;uWFsGS-6Ht z(@DAS6>+i$0v>Z9-7!sn7=@+Byo-jjPe4TOg9QtutT86jYN5_hZ1f>E6Xm<}^KHBY zZom5W=Gm0%`B8F;yCx?o3Hx}HML;!&B35Vyb82d8*pI!=j=mqwa53BU;!p+P3KC+s zkKQ~mZ1Ma~1llj(<`hbyp}s>ka=})7kPGs{*C*zxH})*)JUAtEsh|jdc8iv{Ef^AX zxWcn~7`@T#amULK#V;`f^z!zvZ%*_WBCpxCm{kh+FBuIrXuj90mRys}deF2Dt!Exy zb`S#}AAH#gHFetd(Z$tPd~BE+|f*;<^luQR04%c-cp7eZ?+^E$tJXca7^O1gNp9ia$mbCf^Sfl|J6lo`i* zD_2Usvu$udnoM83cX2X=tC{TGpTu$3is;Fli;v`bXAbO#4^X8z)XybD);~S@L$fkb zaXl>|Uklt5;t!)P87e76+u>Z8NmsoBl=Bspa1=;b^W5olKg!?hy$;q8@5u#@d)Bk! zL~lyGOz#k{W8m>Quwm3^u@V2dLH8NB7e=37^B%=mhsNjx8-1|h=EOXdA!6l5wn-H( z&9w=@#d-eTRopq)KfkDFY4v()y4p3@WY{Vvy%w8uR!LKA+GL~&*9X15)moW8yF3vH(})LU!5h=x zQ?PBQX0T&fp&~Yx0u@&$WL)ITq>9Z&`e~zw_#U@9uW{ydLyN?(L?54!4>_q_)P3Fn{>`ps;d+_5lnf!zG>jMxd-#mps zGlR3;Thax90xe9&cR@(BniVf3D|_>~Dt9+t0dw}OBL~fwrNDY-)$s%~VP|gVA|l^t ze!^tG!DQWq%A$mk$)58Cs%|?0bTtC#@v-K?n~blC9-aN;J4O0L@?Tw__eYXC)en?T zBevF7yvJw`U!mL-e}J(x`DV{>VDXTClg#3G*Tc=~7G}uYK1Q;t zIyGUsj%T6y!}~Z5o^k?huIgBv=dP57g&$~mdX$1@9^@~tHpCMQ`j$aPTiT)gUCEQc zlNe>wjLiJ(?30%R*2udo(c#Mr5z$Mu+oNQ3{V-wiQmt9_w;TkD+w8J&jH0ND2v$um>XQhw z9X5uHXDc7Csa?EOGsye-rZX|Rg+O}MWc$sOu&|y&SbrB7mVcUP749i&%ZE@3#t7#t zl8FJ(uS%W6mG1A4)1Mnfz_-?K&2MEnRXo!GKrWSvRXp|_W|5qV66GulkFWzD*H<5vB(h4TtO$N%lOV8j^Q;oZuEPu-CKNIpj}I^v%%0NM=#K${5_3em7iK;>v29z;%}%R4w+sPm{o5 zW`urGh+3@f3fJd3Jr4=%N#L$z);D*U&pkKsB!J`+fmK{zpk76% zjBK2xj8UUHLprU3aWZP;ghfZk>@khrr%DPfi23H%@UGSjv;4hNbjG>?j7$pB#$`s$ z!=JkrY1-3J0X#Ge=qb(fB@rNn+BFlfs9<_%iTPhxMbywVo!C}2xWu=GdJ6)gJI%Gg z)AvdGA&UDw&a_#o*|C-!kPfO=4u^#hW~b`|&p*F}3W@fQ{S3LkH|DJmM%cx8g%h{7 zf1*Q$Iuf9O2&6P<<9UT+IMMy;HMcB2ciKSV27UC0B6x3L06QzNQOfC`8v3IWhqdJp z|8iY3(<6);B2=90d*$YJFQy5hpPt(N;HpMpWfZ1M4;=bDH;xqP+0;M2UjUC(o_9u5 zt{a$4i*DhP^t%Ky>ZK?D9%{K+23h8~bO^5@m&_qtabtGFdn=M0S~8MAkqZ4RX}&u%}s+LpSvH1eh7dioq@O%8Mg z>f9x|_!AZyG9sX_1WfW?hZNw>#5=etZf(T&82@vOq&D0sKX9>iPWZj2H6jT zqmp|9<7Rrd+w{Vybwge8R*ebYun=v@K_lpswit|C$#mhsH_kex{7r19;^l#7JrRUF zsq}s6!wU@!FM5czK=UQ{5(r-c<9Ui+L8X3=Yium;E*%`;MIJ=>2kz|#Kl~b!d#A^t z_=sXUa_>6AkER;QSj(R!ZNYdefq>v1SG!Hx-i!;Y4};$3Z^@+oaFp z@!>oe{)Yi&KY~jvo6%u!w(IQ*98PxcC&05(k?qJz0vrn$n-?Cqihm3a`@`Blxv?fA zwnmg?4QY~0%+naHXJORZ-FZKGC-XypDM=ti2+7+EwnH=GL;68FP0xV>g+#pB z+r}{yLTOOUP9GA$TI-r)#c3SfF3HLiw+we3J5&_%mDC6y!n$KWo1{Ev!1eL8! z*qlxJZ_eK4_AY@rOOC~e2qiU@E>q-&spJe&`av4POt;$r#L9L=E zvg5l*@8Vy_D6&v2G`jj##MHHphzrQI<@ahe^JegL-8C6=ZAU6XtTzdiBf`xNkCD0L zHCEXeNiKzu>xeruPCk=({JC7!+djFxs=M80505eYHltjts_495lE&s@20C9}JX?Q) znI3rShMj~EaLqk5_STB0j)+lf4>3Sx34M;eCz#tS#r_NBq;Qkh;G!EV>?Uy+=I?v) zhFKXAn-ZvsFhJHv&3woD-a%dm(q>17bCU%BV(Y~_?75u(XX~}l(~qhjT9e~33MxHq z428x_uhmeY;y?ooo&@TUX8~a049E}O&uw4=3VShq{gJ;o+}j^3F+*Qpo_{r54VB4I z34tppvzezNjiY7MwG{|`d`s^$S8@9973-xbY{3e2@Ff_11Shm{!&KqJ8mzup9YkzQEy-`-@0$7SGWzyB5XL{k5` z;lcneHW%bHSEK3XVIC@ag!dBACja7*k*DV4T6K^w7m36r`bBFHS(8^K`ZsH2_MKts zpX?w3_Aw#Q!P2)s*OiED7Jn1!{N!Xi8DHgN9MxcP6Ih%IKoTIGE&c@NCFH>hd`yXy zt(fXPo~KHoR;@3}MFq|dAZ+Af8jA#v=k>+AFvJVHnFCh39mF0fe-2#84nK36UhY}x zbpXfHv!?4LAWsUY(k`>$Bw&7(-{fQTK?>H>@$SS9^mDN&-Ksp_@aQt8W34&u{X`l#2f=YkEN&*J|eb9Q|Q~tM9^mQ7_RUfa<&|UTx zI?C}GfT6*Jq2{Ea{^s(COqYY^{X#jXG$IW6zq0x{f_6vq@gf~zVKJ3#0%(wH^>X_p z5&yxxY@v1;>zfsx@j|u57P+FUCYXoqaUp|45FutmwM{pG+}Pc>J#e(OVSpDYO|^Rr zD?U^M8g73v3REqWJSGf6n>!HNaKeJ1v)vgsw=wZX_j3#YzPQS~lMKdt2ozGlro%_T zsGXZv45$Yy1Ax-L&lY<`PkUpa0|jD{!v};B`NOmrBF!F~liy*?!-pjb$(&)sNrcD& zh!83S8#QcyVqe5+v!t-0?1#v3gXR&+5#d(2J*wAJwUmrDJBW;*iSfw1x8 zv80+tH9d55aOYz!=)Tp%ZkIx1_sHM*DPN}ep^4de`ZFN!@ZIQLeqB$hWJM)5I`Kc) zU84AxV?t(=-csy~jU#-t%{gMA8xRFNjuWTui2YChXm`Q6Doyk&-C-d>A2D&xD1i2K zoKzwNuNyS4mDW#0tT}p92DDKNh-7lV!vHnfv^|UNgHO9YDZ0{S-BSVx zG<^&W|1*~X8hyGRENO|bfxFc2*#d(CBqYqu9Ix<&7O#i^1zn?wqpsd4L2i&_&fWf1 z`w<-&CkndzyV}}B6Zf@BG_=ZoBvSH!z-g&8A6o*|7wx(aVNZSzrwO+a-@c#;CsVp> zPvBX=)v0(Z>MN-Lt3wOvLjZ{v1`5u`3pf4=FKpm|DisM7Ils`qk^PI`8#WZ5J9~QQ zf5%9@h6CC#uMIVY>VrLC4oHjNOzD^SZkN)&1Oy<}+9xYi@|pEVAjd>9BR~u?zpSVn zCRt{iTwUknQ!VeDP1ifmp6`bMDnQbSLAZt*-_qzHsuzb2fXavg{#BXj3@yoG^HRh% zyNg3~bHDA@G(pOAowR{!Sr-a`az!9^FxH?{ojj8(L5=Z|{Vqm^0xG7s52&EcZkWl@ z@0&tmUb#h=y;J${`sMLP?yHKpzMYSE7sg)_Yx9!-fS$}GoS!@bo&tm_@M#_doP!?5 z3GANFQ-wT(L*nmLk`LPvQ8Q>R4~5;&NId9Yedg+EEOQRp$l&U%J0j>Tm@2^!CKyc0 zQ0;m|tM@IcehO%X&j30wAMl)q_1 zz@Yio|U*Pccd!`U-MY9MEFa3#F8bpj-CuFMD~NH&mxxVJ!%xN*-fL@#m z3%k{3^91haPnD<2CEEH-KLezz88zexTpW*IWJzUaGo4rsrm~^$Qm`3~U`2a!aJn%< zj(_%i;Dj27MTu*V@uua{flC3BU(l_t8Dk~#yY z$L4Dx#ITC5Pn4F$5SKOUlA4o2cj8u}^3vWo2GaJ=m?a6e2EYt6X_$$NBpdJW(yP4O zRbeHVKM13q@Du7gB@>SM3bQ`;0^tVLZ?|Bnwtn1D`~Wla9sFIYzjA%Wprz^#KlIO} z3oWM9hwuIfx-8Eo3QkwQPUzdKqv{XLb`%q;w*n%P3odDz@asAAn~x+50?1vK&d=e} z=~EXPo@{!e^gjQ(A4KpI5%n|oL4_Aw9{&h3BRUEk11Nt#*EN8MIBdz--wfp{`gQm{ z%nUg7RlGE8^zb>}U`{u@ztbenFM0%7zwX{wFvUaIo|i4?ZmXkGBWgPpbGLsO4ls6bO zlKJLR@{CrcULb`oH_aGJoCi<4 z|4_fU#OA4*+b|ZbfGaovxjyzOm-7jaO;+Oxr0bJ~_30YtsJ=bwVQs7`K83Ex=Z|~M zmV`sncM6fF%a_iCr6vU5TSYcFQg(*M6D>A-WQ5(cOgC6(q%p(85^UcII@l%!g`c=G zQuX_hbc3NiZ~W_7ig2ysaI0(d z9uY6!k%pPi>&HiQQ{EB#ua;M^Sx5&iQhP^DmXG@W^lDYpWpoCH#IKo@*_^tTGf(Gi zyp@HdqnKHO)$OF-PsQZ#sWrr}Y)-lnl*NVkc^AQgBG?QP{J>HErq3j*4_K^5i}bh) z4$C#*TEE=F zd5Q-SQ6o!|$u2^D8)04x@cuAOU#&*ItR_6SdIQU=#uIX=bgm6%+^Q6R+?XX23o;cl z!iFUbd~izulo%*_IbWjR6#VR&rw3ZBDY|-r>O-a^?ye3H@(GDL0Mqn@#c-+mYcB*K z-)iBFegt@Q9#^hwUM^+a6P_W>M2cYv|}+SA=H7^%3O~CUhSgt()!oCht4G@o%5DC%S1B| zgMO~5nsg;^U=B?7n_k`BqE0H`AIF#n|9bPpM68Fx5#{LRylG!T^cz|cW`uRy(-Y<= zs}5^)^F(wNcx@*O)~=@~#rZwLaNetA>Q<{ksFhnA3Z6$NmnymTdai?ez5t+-$LDIA z#;!)*n8n9i+^&VgTTYM{KCTnOP~d$%HN0K&B9x_-WZU_xzXS5*(n{GNUK%;44!>j9 zol~@iAgE_H{Woh+WVJz@M}!Q=@!G_~VK8~%XAfq_*G~w03k^zMyf(AkRtp&srNeLU z3p7hKMDODm4Fd4N8n;9T9nSiMy{`P&_k|rVv<`@>#d#z|54x3?Li?JnwEaG_dsnXvxobQbqHkx+ct9jCm#Ge@Cs0SLMe}NT#BOV1)Eh zr9Ghgot1#1Kh2kc@^y*00SbL8i1WDO_c$^d;PZgHgJK=w`wS7^ul3Ga)@a@SU7rA| zmDUoC04>W;AEB2IF_BR6=J7xtI4$7nw;pek57_F7 zs2VR5KQt|Gr7C^B(^I7wHUH34=1v=FL}RZq9hU2uF|_xH;dy1(sYA>Eq3bQ9s`|dL z(M@-kl$3NxNJ|Tdbc3{jfHX)+9YE=n5Tr{Q3F(vu38kfxM!K83j=%r=-Vb-&kB)KV z?6daXYt8x0C+4&`sjJPr?Sy}NjY^eft_4Jdw2bTCVL)H5X5S=}JzRJi6XkkU{8b-% zo>{`d^p^F?Kq=d!(Ve00517R1iLL3v?98!XaxJW4f<}V=&y9Tf^0&|ODieE!KG)rM z{Tch%D_dSk2YmOQ0j}&*=QLEc5~$s1bD~;wdNs`)rK0~G+y$!5!Je4Q_=RKALY_KO zy*5h>ys1M=KXC2x;Q~NouUEA63m5jy7b)oCJ{MV|N!nju%F-awN(Ej_H##E;XuRyW z#3Ea6suKhPsR&VzJvO3C7$!7F7QH=^>gsO$JYBpR^I+4&+irWrnefecQNid7aUhfpF5rWPM?xa1*Ot3Z6c}$u(V}aRH^!X!)(v%t5+xbx*O4svbFI0e16cpaKjryTIgO*xB zclBlDeLLm#g#xc>vAi(NP@?TLjRN0lZ(cd$_(m`=7JTJ7C=w*L%4F&}lgZ?*pk*tF z8{d@J^LOLie#7ij20SMQ6!Ws+*e*;`L}Y_1{Jqi6YYWxO*wWH+ilQ#?XHGIC?nR>_ zs$Ds#gn@4_tBb_-_rKwl5I&=e1@`8Ye0sR|{eg}R#Ah`S3d*F-G3fO`a=_@in>M9g zw64?cjN1t{H@Yq>|3W4@G*_^uNLu{O2WWpJj!VScT_1?PL$=?+`ZLz6+Na!lVYoe6 z{^2{)bx}QjnaOFZGqAKI=?v|e0V%?jR@lo7j0OQu0?1dHF)ICXTCV_id zT=$?^CEYJmw0=@|0)U`kC@ISWQ7~ZXBi&rwMLi3@6l%0D|6PyBS-9_Pjos6ox<@^g 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 S<9!JL{E?AR6fYAs4*Y-g<<;;2 diff --git a/docs/media/screenshots/home-light.png b/docs/media/screenshots/home-light.png new file mode 100644 index 0000000000000000000000000000000000000000..1eaca3ef01f4e297b442c690bb87f9032649363b GIT binary patch literal 316808 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

    ax7*)l*P}z%knWQ68E_) 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

    Bf>`YEfWdcc-H6RzU=6V;GWB4N)CLOH7 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 literal 118254 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

    Ui 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

    A1^tRQ)o*@>m`iV0!~S*%A1uLG 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

    7^>MzUx4{^g6!J)W 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 P0e^bB=aG3QuLl1E3D=@d literal 83146 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ʀIM^21AcD)8?(cxtdo@UdbYWQlG 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 UYs43#fvF(Eg14^0dBjiu7sQ!V`Tzg` From edc2e3809db071c86d45ce1c72a8f96cb9e3e4d2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 10 Jan 2024 14:03:25 -0500 Subject: [PATCH 236/271] Closes #14765: Add developer documentation for updating translations --- docs/development/release-checklist.md | 14 +++++++- docs/development/translations.md | 30 ++++++++++++++++++ docs/media/development/transifex_download.png | Bin 0 -> 55556 bytes mkdocs.yml | 1 + 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 docs/development/translations.md create mode 100644 docs/media/development/transifex_download.png diff --git a/docs/development/release-checklist.md b/docs/development/release-checklist.md index 68b777111..2af640546 100644 --- a/docs/development/release-checklist.md +++ b/docs/development/release-checklist.md @@ -80,6 +80,18 @@ Run the following command to update the device type definition validation schema This will automatically update the schema file at `contrib/generated_schema.json`. +### Update & Compile Translations + +Log into [Transifex](https://app.transifex.com/netbox-community/netbox/dashboard/) to download the updated string maps. Download the resource (portable object, or `.po`) file for each language and save them to `netbox/translations/$lang/LC_MESSAGES/django.po`, overwriting the current files. (Be sure to click the **Download for use** link.) + +![Transifex download](../media/development/transifex_download.png) + +Once the resource files for all languages have been updated, compile the machine object (`.mo`) files using the `compilemessages` management command: + +```nohighlight +./manage.py compilemessages +``` + ### Update Version and Changelog * Update the `VERSION` constant in `settings.py` to the new release version. @@ -90,7 +102,7 @@ Commit these changes to the `develop` branch and push upstream. ### Verify CI Build Status -Ensure that continuous integration testing on the `develop` branch is completing successfully. If it fails, take action to correct the failure before proceding with the release. +Ensure that continuous integration testing on the `develop` branch is completing successfully. If it fails, take action to correct the failure before proceeding with the release. ### Submit a Pull Request diff --git a/docs/development/translations.md b/docs/development/translations.md new file mode 100644 index 000000000..e40f996c5 --- /dev/null +++ b/docs/development/translations.md @@ -0,0 +1,30 @@ +# Translations + +NetBox coordinates all translation work using the [Transifex](https://explore.transifex.com/netbox-community/netbox/) platform. Signing up for a Transifex account is free. + +All language translations in NetBox are generated from the source file found at `netbox/translations/en/LC_MESSAGES/django.po`. This file contains the original English strings with empty mappings, and is generated as part of NetBox's release process. Transifex updates source strings from this file on a recurring basis, so new translation strings will appear in the platform automatically as it is updated in the code base. + +Reviewers log into Transifex and navigate to their designated language(s) to translate strings. The initial translation for most strings will be machine-generated via the AWS Translate service. Human reviewers are responsible for reviewing these translations and making corrections where necessary. + +Immediately prior to each NetBox release, the translation maps for all completed languages will be downloaded from Transifex, compiled, and checked into the NetBox code base by a maintainer. + +## Updating Translation Sources + +To update the English `.po` file from which all translations are derived, use the `makemessages` management command: + +```nohighlight +./manage.py makemessages -l en +``` + +Then, commit the change and push to the `develop` branch on GitHub. After some time, any new strings will appear for translation on Transifex automatically. + +## Proposing New Languages + +If you'd like to add support for a new language to NetBox, the first step is to [submit a GitHub issue](https://github.com/netbox-community/netbox/issues/new?assignees=&labels=type%3A+translation&projects=&template=translation.yaml) to capture the proposal. While we'd like to add as many languages as possible, we do need to limit the rate at which new languages are added. New languages will be selected according to community interest and the number of volunteers who sign up as translators. + +Once a proposed language has been approved, a NetBox maintainer will: + +* Add it to the Transifex platform +* Designate one or more reviewers +* Create the initial machine-generated translations for review +* Add it to the list of supported languages diff --git a/docs/media/development/transifex_download.png b/docs/media/development/transifex_download.png new file mode 100644 index 0000000000000000000000000000000000000000..99429ce1101e0baf9668c7ba12809f74b46e5e38 GIT binary patch literal 55556 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 literal 0 HcmV?d00001 diff --git a/mkdocs.yml b/mkdocs.yml index 5a7e00c2c..e1128578a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -286,6 +286,7 @@ nav: - User Preferences: 'development/user-preferences.md' - Web UI: 'development/web-ui.md' - Internationalization: 'development/internationalization.md' + - Translations: 'development/translations.md' - Release Checklist: 'development/release-checklist.md' - git Cheat Sheet: 'development/git-cheat-sheet.md' - Release Notes: From 2221a9d71ff6631bdf88886f354a8f31c4dfc1bd Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 9 Jan 2024 08:36:45 -0500 Subject: [PATCH 237/271] Fixes #14749: Remove errant translation wrapper from DeviceBay installed_device --- netbox/dcim/models/device_components.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index ef235078f..88dddb312 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -1115,7 +1115,7 @@ class DeviceBay(ComponentModel, TrackingModelMixin): installed_device = models.OneToOneField( to='dcim.Device', on_delete=models.SET_NULL, - related_name=_('parent_bay'), + related_name='parent_bay', blank=True, null=True ) From 0f4c25fe49c212228b7529afb06896e4afac228d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 10 Jan 2024 14:21:49 -0500 Subject: [PATCH 238/271] Changelog for #14663, #14706, #14709, #14749 --- docs/release-notes/version-3.7.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 711e5085f..9f8f43f8d 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -2,6 +2,13 @@ ## v3.7.1 (FUTURE) +### Bug Fixes + +* [#14663](https://github.com/netbox-community/netbox/issues/14663) - Fix tunnel creation when setting initial termination to a VM interface +* [#14706](https://github.com/netbox-community/netbox/issues/14706) - Relax one-to-one mapping of tunnel termination to IP address +* [#14709](https://github.com/netbox-community/netbox/issues/14709) - Fix typo in tunnel termination type choice name +* [#14749](https://github.com/netbox-community/netbox/issues/14749) - Remove errant translation wrapper from `installed_device` on DeviceBay + --- ## v3.7.0 (2023-12-29) From 3645bd770f926d9c872bfc1322b3b9d53304283d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 10 Jan 2024 14:28:38 -0500 Subject: [PATCH 239/271] Add link to Transifex platform --- .github/ISSUE_TEMPLATE/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index e6a5e76c2..2ad52023e 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -7,6 +7,9 @@ contact_links: - name: ❓ Discussion url: https://github.com/netbox-community/netbox/discussions about: "If you're just looking for help, try starting a discussion instead." + - name: 🌎 Correct a Translation + url: https://explore.transifex.com/netbox-community/netbox/ + about: "Spot an incorrect translation? You can propose a fix on Transifex." - name: 💡 Plugin Idea url: https://plugin-ideas.netbox.dev about: "Have an idea for a plugin? Head over to the ideas board!" From c4c1ddf68dae90cd0e972ce0f41d20bdb6fed72c Mon Sep 17 00:00:00 2001 From: mmahacek Date: Wed, 10 Jan 2024 12:20:36 -0800 Subject: [PATCH 240/271] 14660: Update webhook docs (#14661) * 14660: Update webhook docks * Update docs/integrations/webhooks.md Co-authored-by: Jeff Gehlbach * #14660: Doc note about webhook receiver on Docker * Cleanup & remove Docker reference (out of scope for docs) --------- Co-authored-by: Jeff Gehlbach Co-authored-by: Jeremy Stretch --- docs/integrations/webhooks.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/integrations/webhooks.md b/docs/integrations/webhooks.md index 8913fd99c..20e9bc8c0 100644 --- a/docs/integrations/webhooks.md +++ b/docs/integrations/webhooks.md @@ -106,6 +106,6 @@ Content-Type: application/x-www-form-urlencoded ------------ ``` -Note that `webhook_receiver` does not actually _do_ anything with the information received: It merely prints the request headers and body for inspection. +Note that `webhook_receiver` does not actually _do_ anything with the information received: It merely prints the request headers and body for inspection. If you don't see any output, check that the `rqworker` process is running and that webhook events are being placed into the queue. -Now, when the NetBox webhook is triggered and processed, you should see its headers and content appear in the terminal where the webhook receiver is listening. If you don't, check that the `rqworker` process is running and that webhook events are being placed into the queue (visible under the NetBox admin UI). +Webhook results can be found in the NetBox admin UI under the Background Tasks section. You can see any finished or failed runs, as well as the error log for failed webhooks. From 3d941411d438f77b66d2036edf690c14b459af58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markku=20Leini=C3=B6?= Date: Wed, 10 Jan 2024 23:04:46 +0200 Subject: [PATCH 241/271] Fixes #14722: Change references to admin UI to Admin menu (#14743) * Change references to admin UI to Admin menu * Change also for reports and custom scripts * Minor tweaks to help text flow better --------- Co-authored-by: Jeremy Stretch --- .../authentication/microsoft-azure-ad.md | 2 +- docs/administration/authentication/okta.md | 2 +- docs/administration/authentication/overview.md | 4 ++-- docs/configuration/index.md | 2 +- docs/customization/custom-scripts.md | 4 ++-- docs/customization/reports.md | 4 ++-- ...min_ui_run_permission.png => run_permission.png} | Bin 7 files changed, 9 insertions(+), 9 deletions(-) rename docs/media/{admin_ui_run_permission.png => run_permission.png} (100%) diff --git a/docs/administration/authentication/microsoft-azure-ad.md b/docs/administration/authentication/microsoft-azure-ad.md index ee24e8232..a5e24b0c9 100644 --- a/docs/administration/authentication/microsoft-azure-ad.md +++ b/docs/administration/authentication/microsoft-azure-ad.md @@ -73,7 +73,7 @@ You should be redirected to Microsoft's authentication portal. Enter the usernam If successful, you will be redirected back to the NetBox UI, and will be logged in as the AD user. You can verify this by navigating to your profile (using the button at top right). -This user account has been replicated locally to NetBox, and can now be assigned groups and permissions within the NetBox admin UI. +This user account has been replicated locally to NetBox, and can now be assigned groups and permissions by navigating to Admin > Permissions. ## Troubleshooting diff --git a/docs/administration/authentication/okta.md b/docs/administration/authentication/okta.md index ff552d730..67c0ea41b 100644 --- a/docs/administration/authentication/okta.md +++ b/docs/administration/authentication/okta.md @@ -67,4 +67,4 @@ You should be redirected to Okta's authentication portal. Enter the username/ema If successful, you will be redirected back to the NetBox UI, and will be logged in as the Okta user. You can verify this by navigating to your profile (using the button at top right). -This user account has been replicated locally to NetBox, and can now be assigned groups and permissions within the NetBox admin UI. +This user account has been replicated locally to NetBox, and can now be assigned groups and permissions by navigating to Admin > Permissions. diff --git a/docs/administration/authentication/overview.md b/docs/administration/authentication/overview.md index 8a8b8f60b..f81a50c0b 100644 --- a/docs/administration/authentication/overview.md +++ b/docs/administration/authentication/overview.md @@ -2,9 +2,9 @@ ## Local Authentication -Local user accounts and groups can be created in NetBox under the "Authentication and Authorization" section of the administrative user interface. This interface is available only to users with the "staff" permission enabled. +Local user accounts and groups can be created in NetBox under the "Authentication" section in the "Admin" menu. This section is available only to users with the "staff" permission enabled. -At a minimum, each user account must have a username and password set. User accounts may also denote a first name, last name, and email address. [Permissions](../permissions.md) may also be assigned to users and/or groups within the admin UI. +At a minimum, each user account must have a username and password set. User accounts may also denote a first name, last name, and email address. [Permissions](../permissions.md) may also be assigned to users and/or groups under Admin > Permissions. ## Remote Authentication diff --git a/docs/configuration/index.md b/docs/configuration/index.md index 70466d029..6a2ecdc7f 100644 --- a/docs/configuration/index.md +++ b/docs/configuration/index.md @@ -46,4 +46,4 @@ The configuration file may be modified at any time. However, the WSGI service (e $ sudo systemctl restart netbox ``` -Configuration parameters which are set via the admin UI (those listed under "dynamic settings") take effect immediately. +Dynamic configuration parameters (those which can be modified via the UI) take effect immediately. diff --git a/docs/customization/custom-scripts.md b/docs/customization/custom-scripts.md index 0b1ed11df..e2bc53cfc 100644 --- a/docs/customization/custom-scripts.md +++ b/docs/customization/custom-scripts.md @@ -288,9 +288,9 @@ An IPv4 or IPv6 network with a mask. Returns a `netaddr.IPNetwork` object. Two a ## Running Custom Scripts !!! note - To run a custom script, a user must be assigned via permissions for `Extras > Script`, `Extras > ScriptModule`, and `Core > ManagedFile` objects. They must also be assigned the `extras.run_script` permission. This is achieved by assigning the user (or group) a permission on the Script object and specifying the `run` action in the admin UI as shown below. + To run a custom script, a user must be assigned permissions for `Extras > Script`, `Extras > Script Module`, and `Core > Managed File` objects. They must also be assigned the `extras.run_script` permission. This is achieved by assigning the user (or group) a permission on the Script object and specifying the `run` action in "Permissions" as shown below. - ![Adding the run action to a permission](../media/admin_ui_run_permission.png) + ![Adding the run action to a permission](../media/run_permission.png) ### Via the Web UI diff --git a/docs/customization/reports.md b/docs/customization/reports.md index a821c5da7..8b0fc44f3 100644 --- a/docs/customization/reports.md +++ b/docs/customization/reports.md @@ -132,9 +132,9 @@ Once you have created a report, it will appear in the reports list. Initially, r ## Running Reports !!! note - To run a report, a user must be assigned via permissions for `Extras > Report`, `Extras > ReportModule`, and `Core > ManagedFile` objects. They must also be assigned the `extras.run_report` permission. This is achieved by assigning the user (or group) a permission on the Report object and specifying the `run` action in the admin UI as shown below. + To run a report, a user must be assigned permissions for `Extras > Report`, `Extras > Report Module`, and `Core > Managed File` objects. They must also be assigned the `extras.run_report` permission. This is achieved by assigning the user (or group) a permission on the Report object and specifying the `run` action in "Permissions" as shown below. - ![Adding the run action to a permission](../media/admin_ui_run_permission.png) + ![Adding the run action to a permission](../media/run_permission.png) ### Via the Web UI diff --git a/docs/media/admin_ui_run_permission.png b/docs/media/run_permission.png similarity index 100% rename from docs/media/admin_ui_run_permission.png rename to docs/media/run_permission.png From c5cbb99bf0ccc1e30625c2c75fd58309d6660910 Mon Sep 17 00:00:00 2001 From: Jorik Jonker Date: Mon, 15 Jan 2024 13:03:26 +0100 Subject: [PATCH 242/271] fix: add missing DH group 15 (3072) DH group 15 was not selectable in the UI, and I strongly suspect this patch will fix that, as that particular choices was missing in `choices.py`. Signed-off-by: Jorik Jonker Fixes #14793 --- netbox/vpn/choices.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/vpn/choices.py b/netbox/vpn/choices.py index edbc1fdaf..c4ae67619 100644 --- a/netbox/vpn/choices.py +++ b/netbox/vpn/choices.py @@ -179,6 +179,7 @@ class DHGroupChoices(ChoiceSet): (GROUP_2, _('Group {n}').format(n=2)), (GROUP_5, _('Group {n}').format(n=5)), (GROUP_14, _('Group {n}').format(n=14)), + (GROUP_15, _('Group {n}').format(n=15)), (GROUP_16, _('Group {n}').format(n=16)), (GROUP_17, _('Group {n}').format(n=17)), (GROUP_18, _('Group {n}').format(n=18)), From bb806e21f79dc69deefc4c82b89439ebe98e226d Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Thu, 21 Dec 2023 15:07:45 -0600 Subject: [PATCH 243/271] Fixes: #13844 - Change site filter to use available_at_site instead of site_id --- netbox/ipam/forms/model_forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index 6c445ef27..34b7c5958 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -214,7 +214,7 @@ class PrefixForm(TenancyForm, NetBoxModelForm): required=False, selector=True, query_params={ - 'site_id': '$site', + 'available_at_site': '$site', }, label=_('VLAN'), ) From c173c26e352af7a3b60b055ffe8e9cdbfe97cf7f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 16 Jan 2024 10:35:40 -0500 Subject: [PATCH 244/271] Fixes #14791: Do not annotate available IPs when searching --- netbox/ipam/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 1598f0321..5ff6d2323 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -604,7 +604,7 @@ class PrefixIPAddressesView(generic.ObjectChildrenView): return parent.get_child_ips().restrict(request.user, 'view').prefetch_related('vrf', 'tenant', 'tenant__group') def prep_table_data(self, request, queryset, parent): - if not get_table_ordering(request, self.table): + if not request.GET.get('q') and not get_table_ordering(request, self.table): return add_available_ipaddresses(parent.prefix, queryset, parent.is_pool) return queryset From 70dd8f17b63c2f9e8021861eec789e954370b29b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 16 Jan 2024 11:00:10 -0500 Subject: [PATCH 245/271] Fixes #14778: Allow null values in CustomFieldSerializer object_type & choice_set fields --- netbox/extras/api/serializers.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index 60a30aed2..f5e99b443 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -126,11 +126,15 @@ class CustomFieldSerializer(ValidatedModelSerializer): type = ChoiceField(choices=CustomFieldTypeChoices) object_type = ContentTypeField( queryset=ContentType.objects.all(), - required=False + required=False, + allow_null=True ) filter_logic = ChoiceField(choices=CustomFieldFilterLogicChoices, required=False) data_type = serializers.SerializerMethodField() - choice_set = NestedCustomFieldChoiceSetSerializer(required=False) + choice_set = NestedCustomFieldChoiceSetSerializer( + required=False, + allow_null=True + ) ui_visible = ChoiceField(choices=CustomFieldUIVisibleChoices, required=False) ui_editable = ChoiceField(choices=CustomFieldUIEditableChoices, required=False) From 1235b496b4cef59555147fbc2986c81d09d297b5 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 16 Jan 2024 13:24:55 -0500 Subject: [PATCH 246/271] Changelog for #13844, #14778, #14791, #14793 --- docs/release-notes/version-3.7.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 9f8f43f8d..def78ea2d 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -4,10 +4,14 @@ ### Bug Fixes +* [#13844](https://github.com/netbox-community/netbox/issues/13844) - Use `available_at_site` filter when filtering VLANs under prefix form * [#14663](https://github.com/netbox-community/netbox/issues/14663) - Fix tunnel creation when setting initial termination to a VM interface * [#14706](https://github.com/netbox-community/netbox/issues/14706) - Relax one-to-one mapping of tunnel termination to IP address * [#14709](https://github.com/netbox-community/netbox/issues/14709) - Fix typo in tunnel termination type choice name * [#14749](https://github.com/netbox-community/netbox/issues/14749) - Remove errant translation wrapper from `installed_device` on DeviceBay +* [#14778](https://github.com/netbox-community/netbox/issues/14778) - Custom field API serializer should accept null values for all optional fields +* [#14791](https://github.com/netbox-community/netbox/issues/14791) - Hide available prefixes when searching within a parent prefix +* [#14793](https://github.com/netbox-community/netbox/issues/14793) - Add missing Diffie-Hellman group 15 --- From 530a15e90689f8dedb5b4006f79c35d4ba4a5ca4 Mon Sep 17 00:00:00 2001 From: bluikko <14869000+bluikko@users.noreply.github.com> Date: Wed, 17 Jan 2024 12:57:16 +0700 Subject: [PATCH 247/271] Closes 14655: Document raw text configuration render Also fix a missing character typo. --- docs/features/configuration-rendering.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/features/configuration-rendering.md b/docs/features/configuration-rendering.md index a87a6eae4..44cacc684 100644 --- a/docs/features/configuration-rendering.md +++ b/docs/features/configuration-rendering.md @@ -39,7 +39,7 @@ When rendered for a specific NetBox device, the template's `device` variable wil ### Context Data -The objet for which the configuration is being rendered is made available as template context as `device` or `virtualmachine` for devices and virtual machines, respectively. Additionally, NetBox model classes can be accessed by the app or plugin in which they reside. For example: +The object for which the configuration is being rendered is made available as template context as `device` or `virtualmachine` for devices and virtual machines, respectively. Additionally, NetBox model classes can be accessed by the app or plugin in which they reside. For example: ``` There are {{ dcim.Site.objects.count() }} sites. @@ -70,6 +70,11 @@ This request will trigger resolution of the device's preferred config template i If no config template has been assigned to any of these three objects, the request will fail. +The configuration can be rendered as JSON or as plaintext by setting the `Accept:` HTTP header. For example: + +* `Accept: application/json` +* `Accept: text/plain` + ### General Purpose Use NetBox config templates can also be rendered without being tied to any specific device, using a separate general purpose REST API endpoint. Any data included with a POST request to this endpoint will be passed as context data for the template. From 621c3ccfa4af3d26601d7d7650e40291338047d2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 17 Jan 2024 10:05:31 -0500 Subject: [PATCH 248/271] Fixes #14817: Relax required fields for IKE & IPSec models on bulk import --- netbox/vpn/forms/bulk_import.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/netbox/vpn/forms/bulk_import.py b/netbox/vpn/forms/bulk_import.py index c5d53eb1d..0f8f43944 100644 --- a/netbox/vpn/forms/bulk_import.py +++ b/netbox/vpn/forms/bulk_import.py @@ -151,7 +151,8 @@ class IKEProposalImportForm(NetBoxModelImportForm): ) authentication_algorithm = CSVChoiceField( label=_('Authentication algorithm'), - choices=AuthenticationAlgorithmChoices + choices=AuthenticationAlgorithmChoices, + required=False ) group = CSVChoiceField( label=_('Group'), @@ -191,11 +192,13 @@ class IKEPolicyImportForm(NetBoxModelImportForm): class IPSecProposalImportForm(NetBoxModelImportForm): encryption_algorithm = CSVChoiceField( label=_('Encryption algorithm'), - choices=EncryptionAlgorithmChoices + choices=EncryptionAlgorithmChoices, + required=False ) authentication_algorithm = CSVChoiceField( label=_('Authentication algorithm'), - choices=AuthenticationAlgorithmChoices + choices=AuthenticationAlgorithmChoices, + required=False ) class Meta: @@ -209,7 +212,8 @@ class IPSecProposalImportForm(NetBoxModelImportForm): class IPSecPolicyImportForm(NetBoxModelImportForm): pfs_group = CSVChoiceField( label=_('Diffie-Hellman group for Perfect Forward Secrecy'), - choices=DHGroupChoices + choices=DHGroupChoices, + required=False ) proposals = CSVModelMultipleChoiceField( queryset=IPSecProposal.objects.all(), From 5de2dea8a6c6b3a1fafcf00407905a9ada3af841 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 17 Jan 2024 10:33:59 -0500 Subject: [PATCH 249/271] Fixes #14816: Ensure default contact assignment ordering is consistent --- netbox/tenancy/api/views.py | 2 +- .../0014_contactassignment_ordering.py | 17 +++++++++++++++++ netbox/tenancy/models/contacts.py | 2 +- netbox/tenancy/views.py | 2 +- 4 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 netbox/tenancy/migrations/0014_contactassignment_ordering.py diff --git a/netbox/tenancy/api/views.py b/netbox/tenancy/api/views.py index 71a4961c3..25c0ab403 100644 --- a/netbox/tenancy/api/views.py +++ b/netbox/tenancy/api/views.py @@ -83,6 +83,6 @@ class ContactViewSet(NetBoxModelViewSet): class ContactAssignmentViewSet(NetBoxModelViewSet): - queryset = ContactAssignment.objects.prefetch_related('object', 'contact', 'role') + queryset = ContactAssignment.objects.prefetch_related('content_type', 'object', 'contact', 'role', 'tags') serializer_class = serializers.ContactAssignmentSerializer filterset_class = filtersets.ContactAssignmentFilterSet diff --git a/netbox/tenancy/migrations/0014_contactassignment_ordering.py b/netbox/tenancy/migrations/0014_contactassignment_ordering.py new file mode 100644 index 000000000..66f08aa2a --- /dev/null +++ b/netbox/tenancy/migrations/0014_contactassignment_ordering.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.8 on 2024-01-17 15:27 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('tenancy', '0013_gfk_indexes'), + ] + + operations = [ + migrations.AlterModelOptions( + name='contactassignment', + options={'ordering': ('contact', 'priority', 'role', 'pk')}, + ), + ] diff --git a/netbox/tenancy/models/contacts.py b/netbox/tenancy/models/contacts.py index 81e11a7dd..664fff098 100644 --- a/netbox/tenancy/models/contacts.py +++ b/netbox/tenancy/models/contacts.py @@ -140,7 +140,7 @@ class ContactAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, Chan clone_fields = ('content_type', 'object_id', 'role', 'priority') class Meta: - ordering = ('priority', 'contact') + ordering = ('contact', 'priority', 'role', 'pk') indexes = ( models.Index(fields=('content_type', 'object_id')), ) diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 27d5750ac..1d2fceb04 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -25,7 +25,7 @@ class ObjectContactsView(generic.ObjectChildrenView): return ContactAssignment.objects.restrict(request.user, 'view').filter( content_type=ContentType.objects.get_for_model(parent), object_id=parent.pk - ) + ).order_by('priority', 'contact', 'role') def get_table(self, *args, **kwargs): table = super().get_table(*args, **kwargs) From 66db4f38741e8ac48a2798f51a7964a3ab5ac054 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 17 Jan 2024 13:47:53 -0500 Subject: [PATCH 250/271] Fixes #14827: Ensure all matching event rules are processed in response to an event --- netbox/extras/events.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/extras/events.py b/netbox/extras/events.py index 6d0654929..90cca83cd 100644 --- a/netbox/extras/events.py +++ b/netbox/extras/events.py @@ -81,7 +81,7 @@ def process_event_rules(event_rules, model_name, event, data, username, snapshot # Evaluate event rule conditions (if any) if not event_rule.eval_conditions(data): - return + continue # Webhooks if event_rule.action_type == EventRuleActionChoices.WEBHOOK: From 61739a0bc5f90ff27cc3c39a10d63f8b109c6df2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 17 Jan 2024 14:37:27 -0500 Subject: [PATCH 251/271] Release v3.7.1 --- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- docs/release-notes/version-3.7.md | 5 +- netbox/netbox/settings.py | 2 +- netbox/translations/fr/LC_MESSAGES/django.mo | Bin 201516 -> 201503 bytes netbox/translations/fr/LC_MESSAGES/django.po | 83 +++--- netbox/translations/pt/LC_MESSAGES/django.mo | Bin 197485 -> 197481 bytes netbox/translations/pt/LC_MESSAGES/django.po | 36 +-- netbox/translations/ru/LC_MESSAGES/django.mo | Bin 253842 -> 254796 bytes netbox/translations/ru/LC_MESSAGES/django.po | 298 ++++++++++--------- requirements.txt | 18 +- 11 files changed, 228 insertions(+), 218 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index ba3fdd75d..d0ded0e4c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -23,7 +23,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v3.7.0 + placeholder: v3.7.1 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 73fdaed8f..5c4fc375e 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.7.0 + placeholder: v3.7.1 validations: required: true - type: dropdown diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index def78ea2d..6dfa699df 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -1,6 +1,6 @@ # NetBox v3.7 -## v3.7.1 (FUTURE) +## v3.7.1 (2024-01-17) ### Bug Fixes @@ -12,6 +12,9 @@ * [#14778](https://github.com/netbox-community/netbox/issues/14778) - Custom field API serializer should accept null values for all optional fields * [#14791](https://github.com/netbox-community/netbox/issues/14791) - Hide available prefixes when searching within a parent prefix * [#14793](https://github.com/netbox-community/netbox/issues/14793) - Add missing Diffie-Hellman group 15 +* [#14816](https://github.com/netbox-community/netbox/issues/14816) - Ensure default contact assignment ordering is consistent +* [#14817](https://github.com/netbox-community/netbox/issues/14817) - Relax required fields for IKE & IPSec models on bulk import +* [#14827](https://github.com/netbox-community/netbox/issues/14827) - Ensure all matching event rules are processed in response to an event --- diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 9aae6c219..61d330146 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -28,7 +28,7 @@ from netbox.plugins import PluginConfig # Environment setup # -VERSION = '3.7.1-dev' +VERSION = '3.7.1' # Hostname HOSTNAME = platform.node() diff --git a/netbox/translations/fr/LC_MESSAGES/django.mo b/netbox/translations/fr/LC_MESSAGES/django.mo index daded1363f105d2626d678a3f72fc70e00cff1ea..ff968750c1033dc365638eb09b194c3681270243 100644 GIT binary patch delta 34713 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 tKN$, YEAR. # # Translators: -# Renato Almeida de Oliveira, 2023 # Jeremy Stretch, 2023 +# Renato Almeida de Oliveira, 2024 # #, fuzzy msgid "" @@ -14,7 +14,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-12-21 17:54+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" -"Last-Translator: Jeremy Stretch, 2023\n" +"Last-Translator: Renato Almeida de Oliveira, 2024\n" "Language-Team: Portuguese (https://app.transifex.com/netbox-community/teams/178115/pt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -30,7 +30,7 @@ msgstr "Chave" #: account/tables.py:31 users/forms/filtersets.py:133 msgid "Write Enabled" -msgstr "Gravação ativada" +msgstr "Escrita permitida" #: account/tables.py:34 core/tables/jobs.py:29 extras/choices.py:135 #: extras/tables/tables.py:469 templates/account/token.html:44 @@ -2041,7 +2041,7 @@ msgstr "Grupo (ID)" #: dcim/filtersets.py:138 msgid "Group (slug)" -msgstr "Grupo (lesma)" +msgstr "Grupo (slug)" #: dcim/filtersets.py:144 dcim/filtersets.py:149 msgid "AS (ID)" @@ -2055,7 +2055,7 @@ msgstr "Localização (ID)" #: dcim/filtersets.py:224 dcim/filtersets.py:299 dcim/filtersets.py:397 #: dcim/filtersets.py:1219 extras/filtersets.py:447 msgid "Location (slug)" -msgstr "Localização (lesma)" +msgstr "Localização (slug)" #: dcim/filtersets.py:313 dcim/filtersets.py:764 dcim/filtersets.py:854 #: dcim/filtersets.py:1619 ipam/filtersets.py:347 ipam/filtersets.py:459 @@ -2068,7 +2068,7 @@ msgstr "Função (ID)" #: ipam/filtersets.py:465 ipam/filtersets.py:946 #: virtualization/filtersets.py:215 msgid "Role (slug)" -msgstr "Papel (lesma)" +msgstr "Papel (slug)" #: dcim/filtersets.py:347 dcim/filtersets.py:922 dcim/filtersets.py:1224 #: dcim/filtersets.py:1942 @@ -2095,7 +2095,7 @@ msgstr "Fabricante (ID)" #: dcim/filtersets.py:811 dcim/filtersets.py:839 dcim/filtersets.py:1122 #: dcim/filtersets.py:1615 msgid "Manufacturer (slug)" -msgstr "Fabricante (lesma)" +msgstr "Fabricante (slug)" #: dcim/filtersets.py:445 msgid "Default platform (ID)" @@ -2180,7 +2180,7 @@ msgstr "Modelo de configuração (ID)" #: dcim/filtersets.py:845 msgid "Device type (slug)" -msgstr "Tipo de dispositivo (lesma)" +msgstr "Tipo de dispositivo (slug)" #: dcim/filtersets.py:865 msgid "Parent Device (ID)" @@ -2193,7 +2193,7 @@ msgstr "Plataforma (ID)" #: dcim/filtersets.py:875 extras/filtersets.py:474 #: virtualization/filtersets.py:225 msgid "Platform (slug)" -msgstr "Plataforma (lesma)" +msgstr "Plataforma (slug)" #: dcim/filtersets.py:911 dcim/filtersets.py:1208 dcim/filtersets.py:1703 #: dcim/filtersets.py:1875 dcim/filtersets.py:1933 @@ -3634,7 +3634,7 @@ msgstr "Reserva" #: dcim/forms/model_forms.py:297 dcim/forms/model_forms.py:380 #: utilities/forms/fields/fields.py:47 msgid "Slug" -msgstr "Lesma" +msgstr "Slug" #: dcim/forms/model_forms.py:304 templates/dcim/devicetype.html:12 msgid "Chassis" @@ -5198,7 +5198,7 @@ msgstr "Já existe uma região de nível superior com esse nome." #: dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." -msgstr "Já existe uma região de alto nível com essa lesma." +msgstr "Já existe uma região de alto nível com essa slug." #: dcim/models/sites.py:62 msgid "region" @@ -6029,7 +6029,7 @@ msgstr "Tipo de cluster" #: extras/filtersets.py:485 virtualization/filtersets.py:95 #: virtualization/filtersets.py:146 msgid "Cluster type (slug)" -msgstr "Tipo de cluster (lesma)" +msgstr "Tipo de cluster (slug)" #: extras/filtersets.py:490 ipam/forms/bulk_edit.py:475 #: ipam/forms/model_forms.py:585 virtualization/forms/filtersets.py:108 @@ -6038,7 +6038,7 @@ msgstr "Grupo de clusters" #: extras/filtersets.py:496 virtualization/filtersets.py:135 msgid "Cluster group (slug)" -msgstr "Grupo de clusters (lesma)" +msgstr "Grupo de clusters (slug)" #: extras/filtersets.py:506 tenancy/forms/forms.py:16 #: tenancy/forms/forms.py:39 @@ -6056,7 +6056,7 @@ msgstr "Tag" #: extras/filtersets.py:534 msgid "Tag (slug)" -msgstr "Tag (lesma)" +msgstr "Tag (slug)" #: extras/filtersets.py:594 extras/forms/filtersets.py:438 msgid "Has local config context data" @@ -7630,7 +7630,7 @@ msgstr "RIR (ID)" #: ipam/filtersets.py:142 ipam/filtersets.py:181 ipam/filtersets.py:204 msgid "RIR (slug)" -msgstr "RIR (lesma)" +msgstr "RIR (slug)" #: ipam/filtersets.py:251 msgid "Within prefix" @@ -12175,7 +12175,7 @@ msgstr "Função de contato (ID)" #: tenancy/filtersets.py:114 msgid "Contact role (slug)" -msgstr "Função de contato (lesma)" +msgstr "Função de contato (slug)" #: tenancy/filtersets.py:146 msgid "Contact group" @@ -12191,7 +12191,7 @@ msgstr "Grupo de inquilinos (ID)" #: tenancy/filtersets.py:216 msgid "Tenant Group (slug)" -msgstr "Grupo de inquilinos (lesma)" +msgstr "Grupo de inquilinos (slug)" #: tenancy/forms/bulk_edit.py:65 msgid "Desciption" @@ -13147,7 +13147,7 @@ msgstr "Grupo de túneis (ID)" #: vpn/filtersets.py:47 msgid "Tunnel group (slug)" -msgstr "Grupo de túneis (lesma)" +msgstr "Grupo de túneis (slug)" #: vpn/filtersets.py:54 msgid "IPSec profile (ID)" diff --git a/netbox/translations/ru/LC_MESSAGES/django.mo b/netbox/translations/ru/LC_MESSAGES/django.mo index 4b4aced04cbc4175433e57e54f7f53a11283d19a..6ca56e299c53588a74baabaeae7048c9fe51a53c 100644 GIT binary patch delta 62324 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

    Dsb*F35OlfK)l)u09 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 KHW$t8!T$pyXBdV6 delta 61171 zcmXWk3Am3%|M>CmIVWU^>`UR;*X&#NJ!H$Sl6@`78p5|MrIMsaNtPB-C{ZcWLZKu| zDQ!v;B~e<0^t|8Sng4bDuGh@mbItp^O z6A9*!xE8zP6F3_Gz_vK(SRye3pTky(WFnF8xQRrf7uLch(GRf?`NU6&L|y2M?eIag z!-FxO`EwY^NbErQZCC?e$C~&{w8V+fPS@z&Sc(1hWu$P zhu>ii%z83}G%sc+Ulg-o8O*>+cqv|mxv(BuuT``YCT*y9EEt65Z^29OcFc>@uprLI zVz?6BD{o;5{2GhkdCZCheoZ7U!z<8^E1?6ahuN@MynfBE#6J%OJt@$kvEoFup&6JH z=b#Nf6kQR^pGOr9LBA5@Wo+AEUXhwlvi@C8kI`d)Z z%qGYDLuiDa#yt2!^i3>9elOb2=~#XNZ7TSFcuBj z%y|8gSpFn>Y&W87{65;jXEA>i^OFA^jmRaxhkBQzOHv$*(tn~#ENFvP?2dNWA060u zbU?Gv-8~QU;lk)Mcs2Rgupa)7)v?lwQ)l%4K6n!jj`{6qhaaMmIDk&%7&_q7nBDVV`Oh$-I+&k) ztC;VN4rmxQ$0_Ks+k!^wb6ki=@Clss7e@~Z{~g+?8f}itDDQ#Y@OSKiZO#&ZkINDg z≥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 wgU#eII6qjTl`_Ok?K*MZT{{ " "object }}. Links which render as empty text will not be displayed." msgstr "" +"Код шаблона Jinja2 для текста ссылки. Ссылайтесь на объект как {{ " +"object }}. Ссылки с пустым текстом отображаться не будут." #: extras/forms/model_forms.py:148 msgid "" "Jinja2 template code for the link URL. Reference the object as {{ " "object }}." msgstr "" +"Код шаблона Jinja2 для URL-адреса. Ссылайтесь на объект как {{ object " +"}}" #: extras/forms/model_forms.py:158 extras/forms/model_forms.py:500 msgid "Template code" @@ -6736,7 +6742,7 @@ msgstr "" #: extras/models/customfields.py:147 msgid "default" -msgstr "дефолт" +msgstr "по умолчанию" #: extras/models/customfields.py:151 msgid "" @@ -6856,11 +6862,11 @@ msgstr "{type} поля не могут определять тип объект #: extras/models/customfields.py:434 msgid "True" -msgstr "Верно" +msgstr "Истинно" #: extras/models/customfields.py:435 msgid "False" -msgstr "Ложь" +msgstr "Ложно" #: extras/models/customfields.py:517 #, python-brace-format @@ -6965,7 +6971,7 @@ msgstr "макет" #: extras/models/dashboard.py:23 msgid "config" -msgstr "конфигурации" +msgstr "конфигурация" #: extras/models/dashboard.py:28 msgid "dashboard" @@ -6973,7 +6979,7 @@ msgstr "панель управления" #: extras/models/dashboard.py:29 msgid "dashboards" -msgstr "щитки" +msgstr "панели управления" #: extras/models/models.py:49 msgid "object types" @@ -7621,7 +7627,7 @@ msgstr "RIR (ID)" #: ipam/filtersets.py:142 ipam/filtersets.py:181 ipam/filtersets.py:204 msgid "RIR (slug)" -msgstr "RIR (пуля)" +msgstr "RIR (подстрока)" #: ipam/filtersets.py:251 msgid "Within prefix" @@ -7755,8 +7761,8 @@ msgstr "Это бассейн" #: ipam/forms/bulk_edit.py:257 ipam/forms/bulk_edit.py:301 #: ipam/models/ip.py:271 ipam/models/ip.py:538 #, python-format -msgid "Treat as 100% utilized" -msgstr "Отнестись к использованию на 100%" +msgid "Treat as 100%% utilized" +msgstr "Отнестись к использованию на 100%%" #: ipam/forms/bulk_edit.py:349 ipam/models/ip.py:771 msgid "DNS name" @@ -7996,8 +8002,8 @@ msgstr "Присутствует в VRF" #: ipam/forms/filtersets.py:243 ipam/forms/filtersets.py:282 #, python-format -msgid "Marked as 100% utilized" -msgstr "Отмечено как использовано на 100%" +msgid "Marked as 100%% utilized" +msgstr "Отмечено как использовано на 100%%" #: ipam/forms/filtersets.py:297 msgid "Device/VM" @@ -10134,7 +10140,7 @@ msgstr "Родительский залив" #: templates/dcim/device_edit.html:48 #: utilities/templates/form_helpers/render_field.html:20 msgid "Regenerate Slug" -msgstr "Регенерирующий слизень" +msgstr "Сгенерировать подстроку" #: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:7 #: utilities/templates/helpers/table_config_form.html:23 @@ -11508,7 +11514,7 @@ msgstr "Настроить таблицу" #: templates/ipam/aggregate.html:15 templates/ipam/ipaddress.html:17 #: templates/ipam/iprange.html:16 templates/ipam/prefix.html:16 msgid "Family" -msgstr "Семья" +msgstr "Семейство" #: templates/ipam/aggregate.html:40 msgid "Date Added" @@ -11618,7 +11624,7 @@ msgstr "Отмечено как полностью использованное" #: templates/ipam/prefix.html:112 msgid "Child IPs" -msgstr "Детские IP-адреса" +msgstr "Зависимые IP-адреса" #: templates/ipam/prefix.html:120 msgid "Available IPs" @@ -11707,7 +11713,7 @@ msgstr "Обычай" #: templates/ipam/service_edit.html:37 msgid "Port(s)" -msgstr "Порт (ы)" +msgstr "Порт(ы)" #: templates/ipam/vlan.html:95 msgid "Add a Prefix" @@ -12158,7 +12164,7 @@ msgstr "Контактная группа (ID)" #: tenancy/filtersets.py:35 tenancy/filtersets.py:62 tenancy/filtersets.py:104 msgid "Contact group (slug)" -msgstr "Контактная группа (slug)" +msgstr "Группа контактов (подстрока)" #: tenancy/filtersets.py:91 msgid "Contact (ID)" @@ -12170,7 +12176,7 @@ msgstr "Роль контакта (ID)" #: tenancy/filtersets.py:114 msgid "Contact role (slug)" -msgstr "Контактная роль (пуля)" +msgstr "Роль контакта (подстрока)" #: tenancy/filtersets.py:146 msgid "Contact group" @@ -12186,7 +12192,7 @@ msgstr "Группа арендаторов (ID)" #: tenancy/filtersets.py:216 msgid "Tenant Group (slug)" -msgstr "Группа арендаторов (slug)" +msgstr "Группа тенантов (подстрока)" #: tenancy/forms/bulk_edit.py:65 msgid "Desciption" @@ -12263,7 +12269,7 @@ msgstr "Имя арендатора должно быть уникальным #: tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." -msgstr "Заголовок арендатора должен быть уникальным для каждой группы." +msgstr "Подстрока тенанта должна быть уникальной для каждой группы." #: tenancy/models/tenants.py:88 msgid "tenant" @@ -12852,7 +12858,7 @@ msgstr "Родительская группа (ID)" #: virtualization/filtersets.py:85 msgid "Parent group (slug)" -msgstr "Родительская группа (слизень)" +msgstr "Родительская группа (подстрока)" #: virtualization/filtersets.py:89 virtualization/filtersets.py:140 msgid "Cluster type (ID)" @@ -13140,7 +13146,7 @@ msgstr "Группа туннелей (ID)" #: vpn/filtersets.py:47 msgid "Tunnel group (slug)" -msgstr "Туннельная группа (пуля)" +msgstr "Группа туннелей (подстрока)" #: vpn/filtersets.py:54 msgid "IPSec profile (ID)" @@ -13180,7 +13186,7 @@ msgstr "Политика IPsec (имя)" #: vpn/filtersets.py:320 msgid "L2VPN (slug)" -msgstr "L2VPN (слаггер)" +msgstr "L2VPN (подстрока)" #: vpn/filtersets.py:384 msgid "VM Interface (ID)" diff --git a/requirements.txt b/requirements.txt index 7cbc5534c..48cfc4950 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ bleach==6.1.0 -Django==4.2.8 +Django==4.2.9 django-cors-headers==4.3.1 django-debug-toolbar==4.2.0 django-filter==23.5 @@ -15,21 +15,21 @@ django-tables2==2.7.0 django-timezone-field==6.1.0 djangorestframework==3.14.0 drf-spectacular==0.27.0 -drf-spectacular-sidecar==2023.12.1 +drf-spectacular-sidecar==2024.1.1 feedparser==6.0.11 graphene-django==3.0.0 gunicorn==21.2.0 -Jinja2==3.1.2 -Markdown==3.5.1 -mkdocs-material==9.5.3 +Jinja2==3.1.3 +Markdown==3.5.2 +mkdocs-material==9.5.4 mkdocstrings[python-legacy]==0.24.0 -netaddr==0.9.0 -Pillow==10.1.0 -psycopg[binary,pool]==3.1.16 +netaddr==0.10.1 +Pillow==10.2.0 +psycopg[binary,pool]==3.1.17 PyYAML==6.0.1 requests==2.31.0 social-auth-app-django==5.4.0 social-auth-core[openidconnect]==4.5.1 svgwrite==1.4.3 tablib==3.5.0 -tzdata==2023.3 +tzdata==2023.4 From ebf6ce1b01b48253c4396fd2c102ca04dc399979 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 17 Jan 2024 15:02:23 -0500 Subject: [PATCH 252/271] PRVB --- docs/release-notes/version-3.7.md | 4 ++++ netbox/netbox/settings.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 6dfa699df..7cfd8e303 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -1,5 +1,9 @@ # NetBox v3.7 +## v3.7.2 (FUTURE) + +--- + ## v3.7.1 (2024-01-17) ### Bug Fixes diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 61d330146..17c693553 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -28,7 +28,7 @@ from netbox.plugins import PluginConfig # Environment setup # -VERSION = '3.7.1' +VERSION = '3.7.2-dev' # Hostname HOSTNAME = platform.node() From 749fc31bc40f3f190f1e8351fc9637ea8e644797 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Fri, 19 Jan 2024 22:34:30 +0530 Subject: [PATCH 253/271] limits ip addresses on interface tables #14645 --- netbox/dcim/tables/template_code.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index 1862893ff..3f8b63688 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -36,13 +36,17 @@ DEVICEBAY_STATUS = """ INTERFACE_IPADDRESSES = """

    - {% for ip in value.all %} - {% if ip.status != 'active' %} - {{ ip }} - {% else %} - {{ ip }} - {% endif %} - {% endfor %} + {% if value.count >= 3 %} + {{ value.count }} + {% else %} + {% for ip in value.all %} + {% if ip.status != 'active' %} + {{ ip }} + {% else %} + {{ ip }} + {% endif %} + {% endfor %} + {% endif %}
    """ From a87d76ad1738a67dc673a4a0e14f7a1472116e51 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Sat, 20 Jan 2024 01:53:20 +0530 Subject: [PATCH 254/271] Fixes user delete when they have a bookmark (#14867) * fixes user delete when they have a bookmark #14851 * Include migration for user field --------- Co-authored-by: Jeremy Stretch --- .../0106_bookmark_user_cascade_deletion.py | 21 +++++++++++++++++++ netbox/extras/models/models.py | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 netbox/extras/migrations/0106_bookmark_user_cascade_deletion.py diff --git a/netbox/extras/migrations/0106_bookmark_user_cascade_deletion.py b/netbox/extras/migrations/0106_bookmark_user_cascade_deletion.py new file mode 100644 index 000000000..d7bef2f0b --- /dev/null +++ b/netbox/extras/migrations/0106_bookmark_user_cascade_deletion.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.9 on 2024-01-19 19:46 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('extras', '0105_customfield_min_max_values'), + ] + + operations = [ + migrations.AlterField( + model_name='bookmark', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 778d7b68d..4ac36a3ac 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -771,7 +771,7 @@ class Bookmark(models.Model): ) user = models.ForeignKey( to=settings.AUTH_USER_MODEL, - on_delete=models.PROTECT + on_delete=models.CASCADE ) objects = RestrictedQuerySet.as_manager() From 48168de4ff9e2153c1d8818947300538717083a9 Mon Sep 17 00:00:00 2001 From: Julio Oliveira at Encora <149191228+Julio-Oliveira-Encora@users.noreply.github.com> Date: Fri, 19 Jan 2024 17:24:08 -0300 Subject: [PATCH 255/271] =?UTF-8?q?Fixes=20#14755:=20ValueError=20in=20web?= =?UTF-8?q?=20UI=20after=20REST=20API=20accepts=20invalid=20cus=E2=80=A6?= =?UTF-8?q?=20(#14804)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fixes #14755: ValueError in web UI after REST API accepts invalid custom-field choice-set data * PR Comments Addressed * Set max_length=2 on extra_choices items; remove custom validation logic * Move test for invalid choices to CustomFieldChoiceSetTest * Omit unused imports --------- Co-authored-by: julio.oliveira Co-authored-by: Jeremy Stretch --- netbox/extras/api/serializers.py | 7 +++++++ netbox/extras/tests/test_api.py | 18 +++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index f5e99b443..714c92548 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -3,6 +3,7 @@ from django.core.exceptions import ObjectDoesNotExist from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import extend_schema_field from rest_framework import serializers +from rest_framework.fields import ListField from core.api.nested_serializers import NestedDataSourceSerializer, NestedDataFileSerializer, NestedJobSerializer from core.api.serializers import JobSerializer @@ -175,6 +176,12 @@ class CustomFieldChoiceSetSerializer(ValidatedModelSerializer): choices=CustomFieldChoiceSetBaseChoices, required=False ) + extra_choices = serializers.ListField( + child=serializers.ListField( + min_length=2, + max_length=2 + ) + ) class Meta: model = CustomFieldChoiceSet diff --git a/netbox/extras/tests/test_api.py b/netbox/extras/tests/test_api.py index 93be2d2c4..f40372a8f 100644 --- a/netbox/extras/tests/test_api.py +++ b/netbox/extras/tests/test_api.py @@ -14,7 +14,6 @@ from extras.reports import Report from extras.scripts import BooleanVar, IntegerVar, Script, StringVar from utilities.testing import APITestCase, APIViewTestCases - User = get_user_model() @@ -251,6 +250,23 @@ class CustomFieldChoiceSetTest(APIViewTestCases.APIViewTestCase): ) CustomFieldChoiceSet.objects.bulk_create(choice_sets) + def test_invalid_choice_items(self): + """ + Attempting to define each choice as a single-item list should return a 400 error. + """ + self.add_permissions('extras.add_customfieldchoiceset') + data = { + "name": "test", + "extra_choices": [ + ["choice1"], + ["choice2"], + ["choice3"], + ] + } + + response = self.client.post(self._get_list_url(), data, format='json', **self.header) + self.assertEqual(response.status_code, 400) + class CustomLinkTest(APIViewTestCases.APIViewTestCase): model = CustomLink From d5733a1e890018be61e42a17af87606ba92d9464 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 19 Jan 2024 15:46:38 -0500 Subject: [PATCH 256/271] Changelog for #14645, #14755, #14851 --- docs/release-notes/version-3.7.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 7cfd8e303..7c2ed78fd 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -2,6 +2,15 @@ ## v3.7.2 (FUTURE) +### Enhancements + +* [#14645](https://github.com/netbox-community/netbox/issues/14645) - Limit the number of assigned IP addresses displayed under interfaces list + +### Bug Fixes + +* [#14755](https://github.com/netbox-community/netbox/issues/14755) - Fix validation of choice values & labels when creating a custom field choice set via the REST API +* [#14851](https://github.com/netbox-community/netbox/issues/14851) - Automatically remove any associated bookmarks when deleting a user + --- ## v3.7.1 (2024-01-17) From 04575aa0f8771d2f5ebe13a03496583e3ebac759 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 19 Jan 2024 15:51:22 -0500 Subject: [PATCH 257/271] Automatically lock inactive GitHub discussions after 180 days --- .github/workflows/lock.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index a3e66a429..7dbce9315 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -14,8 +14,9 @@ jobs: lock: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v4 + - uses: dessant/lock-threads@v5 with: issue-inactive-days: 90 pr-inactive-days: 30 + discussion-inactive-days: 180 issue-lock-reason: 'resolved' From 93a05289adebfd5271053db4fbfb6fc3fb502e75 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 19 Jan 2024 15:59:06 -0500 Subject: [PATCH 258/271] Closes #14872: Extend CI workflow to check for missing Django migrations --- .github/workflows/ci.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9d580baa4..ed8c65b7d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,6 +68,9 @@ jobs: - name: Collect static files run: python netbox/manage.py collectstatic --no-input + - name: Check for missing migrations + run: python netbox/manage.py makemigrations --check + - name: Check PEP8 compliance run: pycodestyle --ignore=W504,E501 --exclude=node_modules netbox/ From 1651a307c80a9494a4f99257dbb2b5fb121953cf Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 19 Jan 2024 16:08:58 -0500 Subject: [PATCH 259/271] #14872: Permit makemigrations --check without setting DEVELOPER=True --- netbox/core/management/commands/makemigrations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/core/management/commands/makemigrations.py b/netbox/core/management/commands/makemigrations.py index ce40bd3cc..afab5077d 100644 --- a/netbox/core/management/commands/makemigrations.py +++ b/netbox/core/management/commands/makemigrations.py @@ -9,9 +9,9 @@ class Command(_Command): """ This built-in management command enables the creation of new database schema migration files, which should never be required by and ordinary user. We prevent this command from executing unless the configuration - indicates that the user is a developer (i.e. configuration.DEVELOPER == True). + indicates that the user is a developer (i.e. configuration.DEVELOPER == True), or it was run with --check. """ - if not settings.DEVELOPER: + if not kwargs['check_changes'] and not settings.DEVELOPER: raise CommandError( "This command is available for development purposes only. It will\n" "NOT resolve any issues with missing or unapplied migrations. For assistance,\n" From 2b4ec9dc20dfba40846fdea00943dbb72d4e7883 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 19 Jan 2024 16:12:50 -0500 Subject: [PATCH 260/271] Update migration file for dummy plugin --- netbox/netbox/tests/dummy_plugin/migrations/0001_initial.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/netbox/tests/dummy_plugin/migrations/0001_initial.py b/netbox/netbox/tests/dummy_plugin/migrations/0001_initial.py index 4342d9576..b7241b51d 100644 --- a/netbox/netbox/tests/dummy_plugin/migrations/0001_initial.py +++ b/netbox/netbox/tests/dummy_plugin/migrations/0001_initial.py @@ -12,7 +12,7 @@ class Migration(migrations.Migration): migrations.CreateModel( name='DummyModel', fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)), + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), ('name', models.CharField(max_length=20)), ('number', models.IntegerField(default=100)), ], From 1d15ba56b90e253eca395e1f45c9d04128a46e69 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Sat, 20 Jan 2024 23:02:55 -0500 Subject: [PATCH 261/271] Grant permission to modify discussions --- .github/workflows/lock.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index 7dbce9315..ad3bf5d75 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -9,6 +9,7 @@ on: permissions: issues: write pull-requests: write + discussions: write jobs: lock: From 79e0d3ae6779133925e4d8bfc50ca045c2ad6564 Mon Sep 17 00:00:00 2001 From: Martin <58110823+m2martin@users.noreply.github.com> Date: Mon, 22 Jan 2024 19:27:55 +0100 Subject: [PATCH 262/271] Fixes #14847: Relax requirement for IKE policy (#14878) * Fixes #14847: Relax requirement for IKE policy * Docs tweak --------- Co-authored-by: Jeremy Stretch --- docs/models/vpn/ikepolicy.md | 2 +- netbox/vpn/forms/bulk_edit.py | 2 +- netbox/vpn/forms/bulk_import.py | 3 ++- .../migrations/0004_alter_ikepolicy_mode.py | 18 ++++++++++++++++++ netbox/vpn/models/crypto.py | 14 +++++++++++++- netbox/vpn/tests/test_views.py | 9 ++++----- 6 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 netbox/vpn/migrations/0004_alter_ikepolicy_mode.py diff --git a/docs/models/vpn/ikepolicy.md b/docs/models/vpn/ikepolicy.md index 7b739072b..d2da28d16 100644 --- a/docs/models/vpn/ikepolicy.md +++ b/docs/models/vpn/ikepolicy.md @@ -14,7 +14,7 @@ The IKE version employed (v1 or v2). ### Mode -The IKE mode employed (main or aggressive). +The mode employed (main or aggressive) when IKEv1 is in use. This setting is not supported for IKEv2. ### Proposals diff --git a/netbox/vpn/forms/bulk_edit.py b/netbox/vpn/forms/bulk_edit.py index a976c5659..c3e8eb3ca 100644 --- a/netbox/vpn/forms/bulk_edit.py +++ b/netbox/vpn/forms/bulk_edit.py @@ -164,7 +164,7 @@ class IKEPolicyBulkEditForm(NetBoxModelBulkEditForm): )), ) nullable_fields = ( - 'preshared_key', 'description', 'comments', + 'mode', 'preshared_key', 'description', 'comments', ) diff --git a/netbox/vpn/forms/bulk_import.py b/netbox/vpn/forms/bulk_import.py index 0f8f43944..b8d19bb38 100644 --- a/netbox/vpn/forms/bulk_import.py +++ b/netbox/vpn/forms/bulk_import.py @@ -174,7 +174,8 @@ class IKEPolicyImportForm(NetBoxModelImportForm): ) mode = CSVChoiceField( label=_('Mode'), - choices=IKEModeChoices + choices=IKEModeChoices, + required=False ) proposals = CSVModelMultipleChoiceField( queryset=IKEProposal.objects.all(), diff --git a/netbox/vpn/migrations/0004_alter_ikepolicy_mode.py b/netbox/vpn/migrations/0004_alter_ikepolicy_mode.py new file mode 100644 index 000000000..40dd4f99e --- /dev/null +++ b/netbox/vpn/migrations/0004_alter_ikepolicy_mode.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.9 on 2024-01-20 09:37 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('vpn', '0003_ipaddress_multiple_tunnel_terminations'), + ] + + operations = [ + migrations.AlterField( + model_name='ikepolicy', + name='mode', + field=models.CharField(blank=True), + ), + ] diff --git a/netbox/vpn/models/crypto.py b/netbox/vpn/models/crypto.py index f89c555e4..2769430fd 100644 --- a/netbox/vpn/models/crypto.py +++ b/netbox/vpn/models/crypto.py @@ -79,7 +79,8 @@ class IKEPolicy(PrimaryModel): ) mode = models.CharField( verbose_name=_('mode'), - choices=IKEModeChoices + choices=IKEModeChoices, + blank=True ) proposals = models.ManyToManyField( to='vpn.IKEProposal', @@ -109,6 +110,17 @@ class IKEPolicy(PrimaryModel): def get_absolute_url(self): return reverse('vpn:ikepolicy', args=[self.pk]) + def clean(self): + super().clean() + + # Mode is required + if self.version == IKEVersionChoices.VERSION_1 and not self.mode: + raise ValidationError(_("Mode is required for selected IKE version")) + + # Mode cannot be used + if self.version == IKEVersionChoices.VERSION_2 and self.mode: + raise ValidationError(_("Mode cannot be used for selected IKE version")) + # # IPSec diff --git a/netbox/vpn/tests/test_views.py b/netbox/vpn/tests/test_views.py index ab797d9fd..105ca0b6f 100644 --- a/netbox/vpn/tests/test_views.py +++ b/netbox/vpn/tests/test_views.py @@ -305,7 +305,6 @@ class IKEPolicyTestCase(ViewTestCases.PrimaryObjectViewTestCase): cls.form_data = { 'name': 'IKE Policy X', 'version': IKEVersionChoices.VERSION_2, - 'mode': IKEModeChoices.AGGRESSIVE, 'proposals': [p.pk for p in ike_proposals], 'tags': [t.pk for t in tags], } @@ -313,9 +312,9 @@ class IKEPolicyTestCase(ViewTestCases.PrimaryObjectViewTestCase): ike_proposal_names = ','.join([p.name for p in ike_proposals]) cls.csv_data = ( "name,version,mode,proposals", - f"IKE Proposal 4,2,aggressive,\"{ike_proposal_names}\"", - f"IKE Proposal 5,2,aggressive,\"{ike_proposal_names}\"", - f"IKE Proposal 6,2,aggressive,\"{ike_proposal_names}\"", + f"IKE Proposal 4,1,main,\"{ike_proposal_names}\"", + f"IKE Proposal 5,1,aggressive,\"{ike_proposal_names}\"", + f"IKE Proposal 6,2,,\"{ike_proposal_names}\"", ) cls.csv_update_data = ( @@ -327,7 +326,7 @@ class IKEPolicyTestCase(ViewTestCases.PrimaryObjectViewTestCase): cls.bulk_edit_data = { 'description': 'New description', - 'version': IKEVersionChoices.VERSION_2, + 'version': IKEVersionChoices.VERSION_1, 'mode': IKEModeChoices.AGGRESSIVE, } From fd5392563f7122c4ef6c118210476adb161896ba Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Mon, 22 Jan 2024 13:01:53 -0600 Subject: [PATCH 263/271] Fixes #14572 - Constrains JobView (and related views) badge to specific named job (#14754) * Fixes #14572 - Constrains JobView (and related views) badge to specific named job * Adjust report views to resolve same problem * Fixed PEP8 error * Update netbox/templates/extras/script/base.html Co-authored-by: Jeremy Stretch * Move function to method on PythonModuleMixin * Update netbox/extras/views.py Co-authored-by: Jeremy Stretch * Update netbox/extras/views.py Co-authored-by: Jeremy Stretch * Update netbox/extras/views.py Co-authored-by: Jeremy Stretch * Update netbox/extras/views.py Co-authored-by: Jeremy Stretch * Update to mixin and view --------- Co-authored-by: Jeremy Stretch --- netbox/extras/models/mixins.py | 10 ++++++ netbox/extras/views.py | 44 ++++++++++-------------- netbox/templates/extras/report/base.html | 2 +- netbox/templates/extras/script/base.html | 2 +- 4 files changed, 31 insertions(+), 27 deletions(-) diff --git a/netbox/extras/models/mixins.py b/netbox/extras/models/mixins.py index cb1d31837..0950324c8 100644 --- a/netbox/extras/models/mixins.py +++ b/netbox/extras/models/mixins.py @@ -8,6 +8,16 @@ __all__ = ( class PythonModuleMixin: + def get_jobs(self, name): + """ + Returns a list of Jobs associated with this specific script or report module + :param name: The class name of the script or report + :return: List of Jobs associated with this + """ + return self.jobs.filter( + name=name + ) + @property def path(self): return os.path.splitext(self.file_path)[0] diff --git a/netbox/extras/views.py b/netbox/extras/views.py index a3dd7f193..56a497f8d 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1057,16 +1057,14 @@ class ReportView(ContentTypePermissionRequiredMixin, View): def get(self, request, module, name): module = get_report_module(module, request) report = module.reports[name]() + jobs = module.get_jobs(report.class_name) - object_type = ContentType.objects.get(app_label='extras', model='reportmodule') - report.result = Job.objects.filter( - object_type=object_type, - object_id=module.pk, - name=report.name, + report.result = jobs.filter( status__in=JobStatusChoices.TERMINAL_STATE_CHOICES ).first() return render(request, 'extras/report.html', { + 'job_count': jobs.count(), 'module': module, 'report': report, 'form': ReportForm(scheduling_enabled=report.scheduling_enabled), @@ -1078,6 +1076,7 @@ class ReportView(ContentTypePermissionRequiredMixin, View): module = get_report_module(module, request) report = module.reports[name]() + jobs = module.get_jobs(report.class_name) form = ReportForm(request.POST, scheduling_enabled=report.scheduling_enabled) if form.is_valid(): @@ -1086,6 +1085,7 @@ class ReportView(ContentTypePermissionRequiredMixin, View): if not get_workers_for_queue('default'): messages.error(request, "Unable to run report: RQ worker process not running.") return render(request, 'extras/report.html', { + 'job_count': jobs.count(), 'report': report, }) @@ -1103,6 +1103,7 @@ class ReportView(ContentTypePermissionRequiredMixin, View): return redirect('extras:report_result', job_pk=job.pk) return render(request, 'extras/report.html', { + 'job_count': jobs.count(), 'module': module, 'report': report, 'form': form, @@ -1117,8 +1118,10 @@ class ReportSourceView(ContentTypePermissionRequiredMixin, View): def get(self, request, module, name): module = get_report_module(module, request) report = module.reports[name]() + jobs = module.get_jobs(report.class_name) return render(request, 'extras/report/source.html', { + 'job_count': jobs.count(), 'module': module, 'report': report, 'tab': 'source', @@ -1133,13 +1136,7 @@ class ReportJobsView(ContentTypePermissionRequiredMixin, View): def get(self, request, module, name): module = get_report_module(module, request) report = module.reports[name]() - - object_type = ContentType.objects.get(app_label='extras', model='reportmodule') - jobs = Job.objects.filter( - object_type=object_type, - object_id=module.pk, - name=report.class_name - ) + jobs = module.get_jobs(report.class_name) jobs_table = JobTable( data=jobs, @@ -1149,6 +1146,7 @@ class ReportJobsView(ContentTypePermissionRequiredMixin, View): jobs_table.configure(request) return render(request, 'extras/report/jobs.html', { + 'job_count': jobs.count(), 'module': module, 'report': report, 'table': jobs_table, @@ -1232,19 +1230,16 @@ class ScriptView(ContentTypePermissionRequiredMixin, View): def get(self, request, module, name): module = get_script_module(module, request) script = module.scripts[name]() + jobs = module.get_jobs(script.class_name) form = script.as_form(initial=normalize_querydict(request.GET)) # Look for a pending Job (use the latest one by creation timestamp) - object_type = ContentType.objects.get(app_label='extras', model='scriptmodule') - script.result = Job.objects.filter( - object_type=object_type, - object_id=module.pk, - name=script.name, - ).exclude( + script.result = module.get_jobs(script.class_name).exclude( status__in=JobStatusChoices.TERMINAL_STATE_CHOICES ).first() return render(request, 'extras/script.html', { + 'job_count': jobs.count(), 'module': module, 'script': script, 'form': form, @@ -1256,6 +1251,7 @@ class ScriptView(ContentTypePermissionRequiredMixin, View): module = get_script_module(module, request) script = module.scripts[name]() + jobs = module.get_jobs(script.class_name) form = script.as_form(request.POST, request.FILES) # Allow execution only if RQ worker process is running @@ -1279,6 +1275,7 @@ class ScriptView(ContentTypePermissionRequiredMixin, View): return redirect('extras:script_result', job_pk=job.pk) return render(request, 'extras/script.html', { + 'job_count': jobs.count(), 'module': module, 'script': script, 'form': form, @@ -1293,8 +1290,10 @@ class ScriptSourceView(ContentTypePermissionRequiredMixin, View): def get(self, request, module, name): module = get_script_module(module, request) script = module.scripts[name]() + jobs = module.get_jobs(script.class_name) return render(request, 'extras/script/source.html', { + 'job_count': jobs.count(), 'module': module, 'script': script, 'tab': 'source', @@ -1309,13 +1308,7 @@ class ScriptJobsView(ContentTypePermissionRequiredMixin, View): def get(self, request, module, name): module = get_script_module(module, request) script = module.scripts[name]() - - object_type = ContentType.objects.get(app_label='extras', model='scriptmodule') - jobs = Job.objects.filter( - object_type=object_type, - object_id=module.pk, - name=script.class_name - ) + jobs = module.get_jobs(script.class_name) jobs_table = JobTable( data=jobs, @@ -1325,6 +1318,7 @@ class ScriptJobsView(ContentTypePermissionRequiredMixin, View): jobs_table.configure(request) return render(request, 'extras/script/jobs.html', { + 'job_count': jobs.count(), 'module': module, 'script': script, 'table': jobs_table, diff --git a/netbox/templates/extras/report/base.html b/netbox/templates/extras/report/base.html index ff1c6a10f..0bf953ce1 100644 --- a/netbox/templates/extras/report/base.html +++ b/netbox/templates/extras/report/base.html @@ -34,7 +34,7 @@ diff --git a/netbox/templates/extras/script/base.html b/netbox/templates/extras/script/base.html index 5aaa5016a..624a3d1d4 100644 --- a/netbox/templates/extras/script/base.html +++ b/netbox/templates/extras/script/base.html @@ -33,7 +33,7 @@ From 3aaf370d4abc65206fd021d63533e2f5686414d7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 22 Jan 2024 14:54:02 -0500 Subject: [PATCH 264/271] Closes #14889: Update source path for DataBackend class --- docs/plugins/development/data-backends.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/plugins/development/data-backends.md b/docs/plugins/development/data-backends.md index feffa5bed..8b7226a41 100644 --- a/docs/plugins/development/data-backends.md +++ b/docs/plugins/development/data-backends.md @@ -20,4 +20,4 @@ backends = [MyDataBackend] !!! tip The path to the list of search indexes can be modified by setting `data_backends` in the PluginConfig instance. -::: core.data_backends.DataBackend +::: netbox.data_backends.DataBackend From ff752dac07f0c234bb355110900dc3fb0aadb022 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 22 Jan 2024 15:12:01 -0500 Subject: [PATCH 265/271] Closes #14862: Add note to date & time configs regarding localization --- docs/configuration/date-time.md | 3 +++ docs/configuration/system.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/configuration/date-time.md b/docs/configuration/date-time.md index ab8b5ad13..a23053e08 100644 --- a/docs/configuration/date-time.md +++ b/docs/configuration/date-time.md @@ -10,6 +10,9 @@ The time zone NetBox will use when dealing with dates and times. It is recommend You may define custom formatting for date and times. For detailed instructions on writing format strings, please see [the Django documentation](https://docs.djangoproject.com/en/stable/ref/templates/builtins/#date). Default formats are listed below. +!!! note + These system defaults will be overridden by a user's selected language/locale when [localization](./system.md#enable_localization) is enabled. + ```python DATE_FORMAT = 'N j, Y' # June 26, 2016 SHORT_DATE_FORMAT = 'Y-m-d' # 2016-06-26 diff --git a/docs/configuration/system.md b/docs/configuration/system.md index 7fbf9ec54..db77f8aff 100644 --- a/docs/configuration/system.md +++ b/docs/configuration/system.md @@ -69,7 +69,7 @@ Email is sent from NetBox only for critical events or if configured for [logging Default: False -Determines if localization features are enabled or not. This should only be enabled for development or testing purposes as netbox is not yet fully localized. Turning this on will localize numeric and date formats (overriding what is set for DATE_FORMAT) based on the browser locale as well as translate certain strings from third party modules. +Determines if localization features are enabled or not. This should only be enabled for development or testing purposes as netbox is not yet fully localized. Turning this on will localize numeric and date formats (overriding any configured [system defaults](./date-time.md#date-and-time-formatting)) based on the browser locale as well as translate certain strings from third party modules. --- From d606749335c9854ddcc53601a490f8981959dd32 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 22 Jan 2024 14:13:35 -0500 Subject: [PATCH 266/271] Fixes #14892: Omit username when running report/script via command line --- netbox/extras/events.py | 6 +++--- netbox/extras/signals.py | 6 ++++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/netbox/extras/events.py b/netbox/extras/events.py index 90cca83cd..c50f4488d 100644 --- a/netbox/extras/events.py +++ b/netbox/extras/events.py @@ -71,10 +71,10 @@ def enqueue_object(queue, instance, user, request_id, action): }) -def process_event_rules(event_rules, model_name, event, data, username, snapshots=None, request_id=None): - try: +def process_event_rules(event_rules, model_name, event, data, username=None, snapshots=None, request_id=None): + if username: user = get_user_model().objects.get(username=username) - except ObjectDoesNotExist: + else: user = None for event_rule in event_rules: diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index 798a9f442..d1b20961a 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -251,7 +251,8 @@ def process_job_start_event_rules(sender, **kwargs): Process event rules for jobs starting. """ event_rules = EventRule.objects.filter(type_job_start=True, enabled=True, content_types=sender.object_type) - process_event_rules(event_rules, sender.object_type.model, EVENT_JOB_START, sender.data, sender.user.username) + username = sender.user.username if sender.user else None + process_event_rules(event_rules, sender.object_type.model, EVENT_JOB_START, sender.data, username) @receiver(job_end) @@ -260,4 +261,5 @@ def process_job_end_event_rules(sender, **kwargs): Process event rules for jobs terminating. """ event_rules = EventRule.objects.filter(type_job_end=True, enabled=True, content_types=sender.object_type) - process_event_rules(event_rules, sender.object_type.model, EVENT_JOB_END, sender.data, sender.user.username) + username = sender.user.username if sender.user else None + process_event_rules(event_rules, sender.object_type.model, EVENT_JOB_END, sender.data, username) From 88e4559b5ab0c0cf5409da7c74ef342898d2d4bc Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 22 Jan 2024 14:19:57 -0500 Subject: [PATCH 267/271] Fixes #14885: Add missing 'group' field to tunnel creation form --- netbox/vpn/forms/model_forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/vpn/forms/model_forms.py b/netbox/vpn/forms/model_forms.py index 6d7961e5a..1a11e62b7 100644 --- a/netbox/vpn/forms/model_forms.py +++ b/netbox/vpn/forms/model_forms.py @@ -141,7 +141,7 @@ class TunnelCreateForm(TunnelForm): ) fieldsets = ( - (_('Tunnel'), ('name', 'status', 'encapsulation', 'description', 'tunnel_id', 'tags')), + (_('Tunnel'), ('name', 'status', 'group', 'encapsulation', 'description', 'tunnel_id', 'tags')), (_('Security'), ('ipsec_profile',)), (_('Tenancy'), ('tenant_group', 'tenant')), (_('First Termination'), ( From cd8e977418c773d55dc9ee65ddecfcc954cd36b0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 22 Jan 2024 14:26:47 -0500 Subject: [PATCH 268/271] Fixes #14879: Include custom fields in REST API representation of data sources --- netbox/core/api/serializers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/core/api/serializers.py b/netbox/core/api/serializers.py index 4ae426df5..a16a06d62 100644 --- a/netbox/core/api/serializers.py +++ b/netbox/core/api/serializers.py @@ -36,7 +36,7 @@ class DataSourceSerializer(NetBoxModelSerializer): model = DataSource fields = [ 'id', 'url', 'display', 'name', 'type', 'source_url', 'enabled', 'status', 'description', 'comments', - 'parameters', 'ignore_rules', 'created', 'last_updated', 'file_count', + 'parameters', 'ignore_rules', 'custom_fields', 'created', 'last_updated', 'file_count', ] From e4188b5bdee390554d08124da22316935cb892a6 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 22 Jan 2024 16:00:56 -0500 Subject: [PATCH 269/271] Changelog for #14572, #14847, #14879, #14885, #14892 --- docs/release-notes/version-3.7.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/release-notes/version-3.7.md b/docs/release-notes/version-3.7.md index 7c2ed78fd..19d37a1bd 100644 --- a/docs/release-notes/version-3.7.md +++ b/docs/release-notes/version-3.7.md @@ -8,8 +8,13 @@ ### Bug Fixes +* [#14572](https://github.com/netbox-community/netbox/issues/14572) - Correct the number of jobs listed for individual report & script modules * [#14755](https://github.com/netbox-community/netbox/issues/14755) - Fix validation of choice values & labels when creating a custom field choice set via the REST API +* [#14847](https://github.com/netbox-community/netbox/issues/14847) - IKE policy mode may be set inly when IKEv1 is selected * [#14851](https://github.com/netbox-community/netbox/issues/14851) - Automatically remove any associated bookmarks when deleting a user +* [#14879](https://github.com/netbox-community/netbox/issues/14879) - Include custom fields in REST API representation of data sources +* [#14885](https://github.com/netbox-community/netbox/issues/14885) - Add missing "group" field to VPN tunnel creation form +* [#14892](https://github.com/netbox-community/netbox/issues/14892) - Fix exception when running report/script via command line due to missing username --- From 0df7ca43099b62a6af91b50240087ccd3bfcb434 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 22 Jan 2024 16:18:20 -0500 Subject: [PATCH 270/271] Update translation sources --- netbox/translations/en/LC_MESSAGES/django.po | 830 ++++++++++--------- 1 file changed, 442 insertions(+), 388 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index adc38c45e..7e40488d3 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2023-12-21 17:54+0000\n" +"POT-Creation-Date: 2024-01-22 21:17+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -20,7 +20,7 @@ msgstr "" #: account/tables.py:27 templates/account/token.html:23 #: templates/users/token.html:18 users/forms/bulk_import.py:41 -#: users/forms/model_forms.py:113 +#: users/forms/model_forms.py:114 msgid "Key" msgstr "" @@ -29,7 +29,7 @@ msgid "Write Enabled" msgstr "" #: account/tables.py:34 core/tables/jobs.py:29 extras/choices.py:135 -#: extras/tables/tables.py:469 templates/account/token.html:44 +#: extras/tables/tables.py:474 templates/account/token.html:44 #: templates/core/configrevision.html:34 #: templates/core/configrevision_restore.html:12 templates/core/job.html:58 #: templates/extras/htmx/report_result.html:11 @@ -51,10 +51,14 @@ msgstr "" #: account/tables.py:43 templates/account/token.html:56 #: templates/users/token.html:48 users/forms/bulk_edit.py:102 -#: users/forms/model_forms.py:125 +#: users/forms/model_forms.py:126 msgid "Allowed IPs" msgstr "" +#: account/views.py:197 +msgid "Your preferences have been updated." +msgstr "" + #: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 #: dcim/choices.py:174 dcim/choices.py:220 dcim/choices.py:1419 #: dcim/choices.py:1495 dcim/choices.py:1545 virtualization/choices.py:20 @@ -68,7 +72,7 @@ msgstr "" #: circuits/choices.py:23 dcim/choices.py:22 dcim/choices.py:103 #: dcim/choices.py:173 dcim/choices.py:219 dcim/choices.py:1494 -#: dcim/choices.py:1544 extras/tables/tables.py:375 ipam/choices.py:31 +#: dcim/choices.py:1544 extras/tables/tables.py:380 ipam/choices.py:31 #: ipam/choices.py:49 ipam/choices.py:69 ipam/choices.py:154 #: templates/extras/configcontext.html:26 templates/users/user.html:34 #: users/forms/bulk_edit.py:36 virtualization/choices.py:22 @@ -90,39 +94,39 @@ msgstr "" msgid "Decommissioned" msgstr "" -#: circuits/filtersets.py:29 circuits/filtersets.py:182 dcim/filtersets.py:120 -#: dcim/filtersets.py:181 dcim/filtersets.py:256 dcim/filtersets.py:364 -#: dcim/filtersets.py:881 dcim/filtersets.py:1177 dcim/filtersets.py:1672 -#: dcim/filtersets.py:1845 dcim/filtersets.py:1902 ipam/filtersets.py:305 +#: circuits/filtersets.py:29 circuits/filtersets.py:184 dcim/filtersets.py:122 +#: dcim/filtersets.py:183 dcim/filtersets.py:258 dcim/filtersets.py:367 +#: dcim/filtersets.py:889 dcim/filtersets.py:1193 dcim/filtersets.py:1688 +#: dcim/filtersets.py:1931 dcim/filtersets.py:1989 ipam/filtersets.py:305 #: ipam/filtersets.py:896 virtualization/filtersets.py:45 -#: virtualization/filtersets.py:172 vpn/filtersets.py:330 +#: virtualization/filtersets.py:173 vpn/filtersets.py:330 msgid "Region (ID)" msgstr "" -#: circuits/filtersets.py:36 circuits/filtersets.py:189 dcim/filtersets.py:126 -#: dcim/filtersets.py:188 dcim/filtersets.py:263 dcim/filtersets.py:371 -#: dcim/filtersets.py:888 dcim/filtersets.py:1184 dcim/filtersets.py:1679 -#: dcim/filtersets.py:1852 dcim/filtersets.py:1909 extras/filtersets.py:414 +#: circuits/filtersets.py:36 circuits/filtersets.py:191 dcim/filtersets.py:128 +#: dcim/filtersets.py:190 dcim/filtersets.py:265 dcim/filtersets.py:374 +#: dcim/filtersets.py:896 dcim/filtersets.py:1200 dcim/filtersets.py:1695 +#: dcim/filtersets.py:1938 dcim/filtersets.py:1996 extras/filtersets.py:414 #: ipam/filtersets.py:312 ipam/filtersets.py:903 -#: virtualization/filtersets.py:52 virtualization/filtersets.py:179 +#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 #: vpn/filtersets.py:325 msgid "Region (slug)" msgstr "" -#: circuits/filtersets.py:42 circuits/filtersets.py:195 dcim/filtersets.py:194 -#: dcim/filtersets.py:269 dcim/filtersets.py:377 dcim/filtersets.py:894 -#: dcim/filtersets.py:1190 dcim/filtersets.py:1685 dcim/filtersets.py:1858 -#: dcim/filtersets.py:1915 ipam/filtersets.py:318 ipam/filtersets.py:909 -#: virtualization/filtersets.py:58 virtualization/filtersets.py:185 +#: circuits/filtersets.py:42 circuits/filtersets.py:197 dcim/filtersets.py:196 +#: dcim/filtersets.py:271 dcim/filtersets.py:380 dcim/filtersets.py:902 +#: dcim/filtersets.py:1206 dcim/filtersets.py:1701 dcim/filtersets.py:1944 +#: dcim/filtersets.py:2002 ipam/filtersets.py:318 ipam/filtersets.py:909 +#: virtualization/filtersets.py:58 virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "" -#: circuits/filtersets.py:49 circuits/filtersets.py:202 dcim/filtersets.py:201 -#: dcim/filtersets.py:276 dcim/filtersets.py:384 dcim/filtersets.py:901 -#: dcim/filtersets.py:1197 dcim/filtersets.py:1692 dcim/filtersets.py:1865 -#: dcim/filtersets.py:1922 extras/filtersets.py:420 ipam/filtersets.py:325 +#: circuits/filtersets.py:49 circuits/filtersets.py:204 dcim/filtersets.py:203 +#: dcim/filtersets.py:278 dcim/filtersets.py:387 dcim/filtersets.py:909 +#: dcim/filtersets.py:1213 dcim/filtersets.py:1708 dcim/filtersets.py:1951 +#: dcim/filtersets.py:2009 extras/filtersets.py:420 ipam/filtersets.py:325 #: ipam/filtersets.py:916 virtualization/filtersets.py:65 -#: virtualization/filtersets.py:192 +#: virtualization/filtersets.py:193 msgid "Site group (slug)" msgstr "" @@ -174,11 +178,11 @@ msgstr "" msgid "Site" msgstr "" -#: circuits/filtersets.py:60 circuits/filtersets.py:213 -#: circuits/filtersets.py:250 dcim/filtersets.py:211 dcim/filtersets.py:286 -#: dcim/filtersets.py:358 extras/filtersets.py:436 ipam/filtersets.py:215 +#: circuits/filtersets.py:60 circuits/filtersets.py:215 +#: circuits/filtersets.py:252 dcim/filtersets.py:213 dcim/filtersets.py:288 +#: dcim/filtersets.py:361 extras/filtersets.py:436 ipam/filtersets.py:215 #: ipam/filtersets.py:335 ipam/filtersets.py:926 -#: virtualization/filtersets.py:75 virtualization/filtersets.py:202 +#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 #: vpn/filtersets.py:335 msgid "Site (slug)" msgstr "" @@ -187,58 +191,58 @@ msgstr "" msgid "ASN (ID)" msgstr "" -#: circuits/filtersets.py:86 circuits/filtersets.py:112 -#: circuits/filtersets.py:146 +#: circuits/filtersets.py:87 circuits/filtersets.py:114 +#: circuits/filtersets.py:148 msgid "Provider (ID)" msgstr "" -#: circuits/filtersets.py:92 circuits/filtersets.py:118 -#: circuits/filtersets.py:152 +#: circuits/filtersets.py:93 circuits/filtersets.py:120 +#: circuits/filtersets.py:154 msgid "Provider (slug)" msgstr "" -#: circuits/filtersets.py:157 +#: circuits/filtersets.py:159 msgid "Provider account (ID)" msgstr "" -#: circuits/filtersets.py:162 +#: circuits/filtersets.py:164 msgid "Provider network (ID)" msgstr "" -#: circuits/filtersets.py:166 +#: circuits/filtersets.py:168 msgid "Circuit type (ID)" msgstr "" -#: circuits/filtersets.py:172 +#: circuits/filtersets.py:174 msgid "Circuit type (slug)" msgstr "" -#: circuits/filtersets.py:207 circuits/filtersets.py:244 dcim/filtersets.py:205 -#: dcim/filtersets.py:280 dcim/filtersets.py:352 dcim/filtersets.py:905 -#: dcim/filtersets.py:1202 dcim/filtersets.py:1697 dcim/filtersets.py:1869 -#: dcim/filtersets.py:1927 ipam/filtersets.py:209 ipam/filtersets.py:329 +#: circuits/filtersets.py:209 circuits/filtersets.py:246 dcim/filtersets.py:207 +#: dcim/filtersets.py:282 dcim/filtersets.py:355 dcim/filtersets.py:913 +#: dcim/filtersets.py:1218 dcim/filtersets.py:1713 dcim/filtersets.py:1955 +#: dcim/filtersets.py:2014 ipam/filtersets.py:209 ipam/filtersets.py:329 #: ipam/filtersets.py:920 virtualization/filtersets.py:69 -#: virtualization/filtersets.py:196 vpn/filtersets.py:340 +#: virtualization/filtersets.py:197 vpn/filtersets.py:340 msgid "Site (ID)" msgstr "" -#: circuits/filtersets.py:236 core/filtersets.py:73 core/filtersets.py:132 -#: dcim/filtersets.py:633 dcim/filtersets.py:1171 dcim/filtersets.py:1973 +#: circuits/filtersets.py:238 core/filtersets.py:73 core/filtersets.py:132 +#: dcim/filtersets.py:638 dcim/filtersets.py:1187 dcim/filtersets.py:2062 #: extras/filtersets.py:40 extras/filtersets.py:69 extras/filtersets.py:101 #: extras/filtersets.py:140 extras/filtersets.py:168 extras/filtersets.py:195 #: extras/filtersets.py:226 extras/filtersets.py:295 extras/filtersets.py:343 #: extras/filtersets.py:403 extras/filtersets.py:562 extras/filtersets.py:604 #: extras/filtersets.py:645 ipam/forms/model_forms.py:430 #: netbox/filtersets.py:275 netbox/forms/__init__.py:23 -#: netbox/forms/base.py:152 templates/htmx/object_selector.html:28 +#: netbox/forms/base.py:163 templates/htmx/object_selector.html:28 #: templates/inc/filter_list.html:53 templates/ipam/ipaddress_assign.html:32 -#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:86 +#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:87 #: users/filtersets.py:21 users/filtersets.py:37 users/filtersets.py:69 #: users/filtersets.py:117 utilities/forms/forms.py:99 msgid "Search" msgstr "" -#: circuits/filtersets.py:240 circuits/forms/bulk_edit.py:167 +#: circuits/filtersets.py:242 circuits/forms/bulk_edit.py:167 #: circuits/forms/model_forms.py:110 circuits/forms/model_forms.py:132 #: dcim/forms/connections.py:66 templates/circuits/circuit.html:15 #: templates/dcim/inc/cable_termination.html:55 @@ -246,7 +250,7 @@ msgstr "" msgid "Circuit" msgstr "" -#: circuits/filtersets.py:254 +#: circuits/filtersets.py:256 msgid "ProviderNetwork (ID)" msgstr "" @@ -383,7 +387,7 @@ msgstr "" #: dcim/tables/devices.py:777 dcim/tables/devices.py:1004 #: dcim/tables/devicetypes.py:245 dcim/tables/devicetypes.py:260 #: dcim/tables/racks.py:32 extras/forms/bulk_edit.py:259 -#: extras/tables/tables.py:323 templates/circuits/circuittype.html:33 +#: extras/tables/tables.py:328 templates/circuits/circuittype.html:33 #: templates/dcim/cable.html:41 templates/dcim/devicerole.html:37 #: templates/dcim/frontport.html:43 templates/dcim/inventoryitemrole.html:27 #: templates/dcim/rackrole.html:33 templates/dcim/rearport.html:43 @@ -413,22 +417,23 @@ msgstr "" #: dcim/forms/object_import.py:118 dcim/forms/object_import.py:150 #: dcim/tables/devices.py:211 dcim/tables/devices.py:833 #: dcim/tables/power.py:77 extras/forms/bulk_import.py:39 -#: extras/tables/tables.py:345 extras/tables/tables.py:443 -#: netbox/tables/tables.py:234 templates/circuits/circuit.html:31 -#: templates/core/datasource.html:39 templates/dcim/cable.html:16 -#: templates/dcim/consoleport.html:39 templates/dcim/consoleserverport.html:39 -#: templates/dcim/frontport.html:39 templates/dcim/interface.html:47 -#: templates/dcim/interface.html:175 templates/dcim/interface.html:323 -#: templates/dcim/powerfeed.html:35 templates/dcim/poweroutlet.html:39 -#: templates/dcim/powerport.html:39 templates/dcim/rack.html:81 -#: templates/dcim/rearport.html:39 templates/extras/eventrule.html:95 -#: templates/virtualization/cluster.html:20 templates/vpn/l2vpn.html:23 +#: extras/tables/tables.py:278 extras/tables/tables.py:350 +#: extras/tables/tables.py:448 netbox/tables/tables.py:234 +#: templates/circuits/circuit.html:31 templates/core/datasource.html:39 +#: templates/dcim/cable.html:16 templates/dcim/consoleport.html:39 +#: templates/dcim/consoleserverport.html:39 templates/dcim/frontport.html:39 +#: templates/dcim/interface.html:47 templates/dcim/interface.html:175 +#: templates/dcim/interface.html:323 templates/dcim/powerfeed.html:35 +#: templates/dcim/poweroutlet.html:39 templates/dcim/powerport.html:39 +#: templates/dcim/rack.html:81 templates/dcim/rearport.html:39 +#: templates/extras/eventrule.html:95 templates/virtualization/cluster.html:20 +#: templates/vpn/l2vpn.html:23 #: templates/wireless/inc/authentication_attrs.html:9 #: templates/wireless/inc/wirelesslink_interface.html:14 #: virtualization/forms/bulk_edit.py:59 virtualization/forms/bulk_import.py:41 #: virtualization/forms/filtersets.py:53 virtualization/forms/model_forms.py:65 #: virtualization/tables/clusters.py:66 vpn/forms/bulk_edit.py:267 -#: vpn/forms/bulk_import.py:259 vpn/forms/filtersets.py:214 +#: vpn/forms/bulk_import.py:264 vpn/forms/filtersets.py:214 #: vpn/forms/model_forms.py:83 vpn/forms/model_forms.py:118 #: vpn/forms/model_forms.py:232 msgid "Type" @@ -477,7 +482,7 @@ msgstr "" #: templates/virtualization/virtualmachine.html:22 templates/vpn/tunnel.html:26 #: templates/wireless/wirelesslan.html:23 #: templates/wireless/wirelesslink.html:20 users/forms/filtersets.py:33 -#: users/forms/model_forms.py:196 virtualization/forms/bulk_edit.py:69 +#: users/forms/model_forms.py:197 virtualization/forms/bulk_edit.py:69 #: virtualization/forms/bulk_edit.py:117 virtualization/forms/bulk_import.py:54 #: virtualization/forms/bulk_import.py:80 virtualization/forms/filtersets.py:61 #: virtualization/forms/filtersets.py:156 virtualization/tables/clusters.py:74 @@ -540,7 +545,7 @@ msgstr "" #: virtualization/forms/bulk_import.py:115 #: virtualization/forms/filtersets.py:46 virtualization/forms/filtersets.py:101 #: vpn/forms/bulk_edit.py:58 vpn/forms/bulk_edit.py:272 -#: vpn/forms/bulk_import.py:59 vpn/forms/bulk_import.py:253 +#: vpn/forms/bulk_import.py:59 vpn/forms/bulk_import.py:258 #: vpn/forms/filtersets.py:211 wireless/forms/bulk_edit.py:62 #: wireless/forms/bulk_edit.py:109 wireless/forms/bulk_import.py:55 #: wireless/forms/bulk_import.py:97 wireless/forms/filtersets.py:34 @@ -910,8 +915,8 @@ msgstr "" #: users/models.py:344 virtualization/models/clusters.py:57 #: virtualization/models/virtualmachines.py:70 #: virtualization/models/virtualmachines.py:272 vpn/models/crypto.py:24 -#: vpn/models/crypto.py:71 vpn/models/crypto.py:119 vpn/models/crypto.py:171 -#: vpn/models/crypto.py:209 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 +#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 +#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 #: wireless/models.py:50 msgid "name" msgstr "" @@ -979,8 +984,8 @@ msgstr "" #: extras/tables/tables.py:83 extras/tables/tables.py:115 #: extras/tables/tables.py:139 extras/tables/tables.py:204 #: extras/tables/tables.py:251 extras/tables/tables.py:274 -#: extras/tables/tables.py:319 extras/tables/tables.py:371 -#: extras/tables/tables.py:394 ipam/forms/bulk_edit.py:390 +#: extras/tables/tables.py:324 extras/tables/tables.py:376 +#: extras/tables/tables.py:399 ipam/forms/bulk_edit.py:390 #: ipam/forms/filtersets.py:372 ipam/tables/asn.py:16 ipam/tables/ip.py:85 #: ipam/tables/ip.py:159 ipam/tables/services.py:15 ipam/tables/services.py:40 #: ipam/tables/vlans.py:64 ipam/tables/vlans.py:110 ipam/tables/vrfs.py:26 @@ -1075,7 +1080,7 @@ msgstr "" #: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 #: dcim/tables/power.py:96 dcim/tables/racks.py:76 dcim/tables/racks.py:156 #: dcim/tables/sites.py:103 extras/forms/bulk_edit.py:320 -#: extras/tables/tables.py:485 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 +#: extras/tables/tables.py:490 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 #: ipam/tables/ip.py:135 ipam/tables/ip.py:272 ipam/tables/ip.py:325 #: ipam/tables/ip.py:392 ipam/tables/services.py:24 ipam/tables/services.py:54 #: ipam/tables/vlans.py:141 ipam/tables/vrfs.py:46 ipam/tables/vrfs.py:71 @@ -1158,7 +1163,7 @@ msgstr "" msgid "Local" msgstr "" -#: core/data_backends.py:47 extras/tables/tables.py:431 +#: core/data_backends.py:47 extras/tables/tables.py:436 #: templates/account/profile.html:16 templates/users/user.html:18 #: users/tables.py:31 msgid "Username" @@ -1169,7 +1174,7 @@ msgid "Only used for cloning with HTTP(S)" msgstr "" #: core/data_backends.py:53 templates/account/base.html:17 -#: templates/account/password.html:11 users/forms/model_forms.py:171 +#: templates/account/password.html:11 users/forms/model_forms.py:172 msgid "Password" msgstr "" @@ -1212,9 +1217,9 @@ msgid "Ignore rules" msgstr "" #: core/forms/filtersets.py:26 core/forms/model_forms.py:95 -#: extras/forms/model_forms.py:165 extras/forms/model_forms.py:455 -#: extras/forms/model_forms.py:508 extras/tables/tables.py:149 -#: extras/tables/tables.py:363 extras/tables/tables.py:398 +#: extras/forms/model_forms.py:165 extras/forms/model_forms.py:462 +#: extras/forms/model_forms.py:515 extras/tables/tables.py:149 +#: extras/tables/tables.py:368 extras/tables/tables.py:403 #: templates/core/datasource.html:31 #: templates/dcim/device/render_config.html:19 #: templates/extras/configcontext.html:30 @@ -1231,7 +1236,7 @@ msgstr "" #: extras/forms/bulk_edit.py:161 extras/forms/bulk_edit.py:220 #: extras/forms/filtersets.py:119 extras/forms/filtersets.py:206 #: extras/forms/filtersets.py:267 extras/tables/tables.py:122 -#: extras/tables/tables.py:211 extras/tables/tables.py:284 +#: extras/tables/tables.py:211 extras/tables/tables.py:288 #: templates/core/datasource.html:43 templates/dcim/interface.html:62 #: templates/extras/customlink.html:18 templates/extras/eventrule.html:20 #: templates/extras/savedfilter.html:26 @@ -1257,7 +1262,7 @@ msgid "Creation" msgstr "" #: core/forms/filtersets.py:70 extras/forms/filtersets.py:473 -#: extras/forms/filtersets.py:519 extras/tables/tables.py:474 +#: extras/forms/filtersets.py:519 extras/tables/tables.py:479 #: templates/core/job.html:25 templates/extras/objectchange.html:56 #: tenancy/tables/contacts.py:90 vpn/tables/l2vpn.py:59 msgid "Object Type" @@ -1303,7 +1308,7 @@ msgstr "" #: templates/users/token.html:22 templates/users/user.html:6 #: templates/users/user.html:14 users/filtersets.py:74 users/filtersets.py:134 #: users/forms/filtersets.py:85 users/forms/filtersets.py:126 -#: users/forms/model_forms.py:156 users/forms/model_forms.py:194 +#: users/forms/model_forms.py:157 users/forms/model_forms.py:195 #: users/tables.py:19 msgid "User" msgstr "" @@ -1365,7 +1370,7 @@ msgid "User Preferences" msgstr "" #: core/forms/model_forms.py:155 dcim/forms/filtersets.py:658 -#: templates/core/configrevision.html:193 users/forms/model_forms.py:63 +#: templates/core/configrevision.html:193 users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "" @@ -1602,16 +1607,16 @@ msgid "Last updated" msgstr "" #: core/tables/jobs.py:10 dcim/tables/devicetypes.py:161 -#: extras/tables/tables.py:174 extras/tables/tables.py:340 +#: extras/tables/tables.py:174 extras/tables/tables.py:345 #: netbox/tables/tables.py:184 templates/dcim/virtualchassis_edit.html:53 #: wireless/tables/wirelesslink.py:16 msgid "ID" msgstr "" #: core/tables/jobs.py:21 extras/choices.py:38 extras/tables/tables.py:236 -#: extras/tables/tables.py:350 extras/tables/tables.py:448 -#: extras/tables/tables.py:479 netbox/tables/tables.py:238 -#: templates/extras/eventrule.html:99 +#: extras/tables/tables.py:282 extras/tables/tables.py:355 +#: extras/tables/tables.py:453 extras/tables/tables.py:484 +#: netbox/tables/tables.py:238 templates/extras/eventrule.html:99 #: templates/extras/htmx/report_result.html:45 #: templates/extras/journalentry.html:21 templates/extras/objectchange.html:62 #: tenancy/tables/contacts.py:93 vpn/tables/l2vpn.py:64 @@ -1885,7 +1890,7 @@ msgstr "" msgid "Full" msgstr "" -#: dcim/choices.py:1164 wireless/choices.py:480 +#: dcim/choices.py:1164 netbox/preferences.py:29 wireless/choices.py:480 msgid "Auto" msgstr "" @@ -1991,269 +1996,269 @@ msgstr "" msgid "Three-phase" msgstr "" -#: dcim/filtersets.py:80 +#: dcim/filtersets.py:82 msgid "Parent region (ID)" msgstr "" -#: dcim/filtersets.py:86 +#: dcim/filtersets.py:88 msgid "Parent region (slug)" msgstr "" -#: dcim/filtersets.py:97 +#: dcim/filtersets.py:99 msgid "Parent site group (ID)" msgstr "" -#: dcim/filtersets.py:103 +#: dcim/filtersets.py:105 msgid "Parent site group (slug)" msgstr "" -#: dcim/filtersets.py:132 ipam/filtersets.py:797 ipam/filtersets.py:930 +#: dcim/filtersets.py:134 ipam/filtersets.py:797 ipam/filtersets.py:930 msgid "Group (ID)" msgstr "" -#: dcim/filtersets.py:138 +#: dcim/filtersets.py:140 msgid "Group (slug)" msgstr "" -#: dcim/filtersets.py:144 dcim/filtersets.py:149 +#: dcim/filtersets.py:146 dcim/filtersets.py:151 msgid "AS (ID)" msgstr "" -#: dcim/filtersets.py:217 dcim/filtersets.py:292 dcim/filtersets.py:390 -#: dcim/filtersets.py:917 dcim/filtersets.py:1213 dcim/filtersets.py:1881 +#: dcim/filtersets.py:219 dcim/filtersets.py:294 dcim/filtersets.py:393 +#: dcim/filtersets.py:925 dcim/filtersets.py:1229 dcim/filtersets.py:1967 msgid "Location (ID)" msgstr "" -#: dcim/filtersets.py:224 dcim/filtersets.py:299 dcim/filtersets.py:397 -#: dcim/filtersets.py:1219 extras/filtersets.py:447 +#: dcim/filtersets.py:226 dcim/filtersets.py:301 dcim/filtersets.py:400 +#: dcim/filtersets.py:1235 extras/filtersets.py:447 msgid "Location (slug)" msgstr "" -#: dcim/filtersets.py:313 dcim/filtersets.py:764 dcim/filtersets.py:854 -#: dcim/filtersets.py:1619 ipam/filtersets.py:347 ipam/filtersets.py:459 -#: ipam/filtersets.py:940 virtualization/filtersets.py:209 +#: dcim/filtersets.py:315 dcim/filtersets.py:772 dcim/filtersets.py:862 +#: dcim/filtersets.py:1635 ipam/filtersets.py:347 ipam/filtersets.py:459 +#: ipam/filtersets.py:940 virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "" -#: dcim/filtersets.py:319 dcim/filtersets.py:770 dcim/filtersets.py:860 -#: dcim/filtersets.py:1625 extras/filtersets.py:463 ipam/filtersets.py:353 +#: dcim/filtersets.py:321 dcim/filtersets.py:778 dcim/filtersets.py:868 +#: dcim/filtersets.py:1641 extras/filtersets.py:463 ipam/filtersets.py:353 #: ipam/filtersets.py:465 ipam/filtersets.py:946 -#: virtualization/filtersets.py:215 +#: virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "" -#: dcim/filtersets.py:347 dcim/filtersets.py:922 dcim/filtersets.py:1224 -#: dcim/filtersets.py:1942 +#: dcim/filtersets.py:350 dcim/filtersets.py:930 dcim/filtersets.py:1240 +#: dcim/filtersets.py:2029 msgid "Rack (ID)" msgstr "" -#: dcim/filtersets.py:401 extras/filtersets.py:234 extras/filtersets.py:278 +#: dcim/filtersets.py:404 extras/filtersets.py:234 extras/filtersets.py:278 #: extras/filtersets.py:318 extras/filtersets.py:613 msgid "User (ID)" msgstr "" -#: dcim/filtersets.py:407 extras/filtersets.py:240 extras/filtersets.py:284 +#: dcim/filtersets.py:410 extras/filtersets.py:240 extras/filtersets.py:284 #: extras/filtersets.py:324 users/filtersets.py:80 users/filtersets.py:140 msgid "User (name)" msgstr "" -#: dcim/filtersets.py:435 dcim/filtersets.py:561 dcim/filtersets.py:754 -#: dcim/filtersets.py:805 dcim/filtersets.py:833 dcim/filtersets.py:1116 -#: dcim/filtersets.py:1609 +#: dcim/filtersets.py:438 dcim/filtersets.py:565 dcim/filtersets.py:762 +#: dcim/filtersets.py:813 dcim/filtersets.py:841 dcim/filtersets.py:1131 +#: dcim/filtersets.py:1625 msgid "Manufacturer (ID)" msgstr "" -#: dcim/filtersets.py:441 dcim/filtersets.py:567 dcim/filtersets.py:760 -#: dcim/filtersets.py:811 dcim/filtersets.py:839 dcim/filtersets.py:1122 -#: dcim/filtersets.py:1615 +#: dcim/filtersets.py:444 dcim/filtersets.py:571 dcim/filtersets.py:768 +#: dcim/filtersets.py:819 dcim/filtersets.py:847 dcim/filtersets.py:1137 +#: dcim/filtersets.py:1631 msgid "Manufacturer (slug)" msgstr "" -#: dcim/filtersets.py:445 +#: dcim/filtersets.py:448 msgid "Default platform (ID)" msgstr "" -#: dcim/filtersets.py:451 +#: dcim/filtersets.py:454 msgid "Default platform (slug)" msgstr "" -#: dcim/filtersets.py:454 dcim/forms/filtersets.py:452 +#: dcim/filtersets.py:457 dcim/forms/filtersets.py:452 msgid "Has a front image" msgstr "" -#: dcim/filtersets.py:458 dcim/forms/filtersets.py:459 +#: dcim/filtersets.py:461 dcim/forms/filtersets.py:459 msgid "Has a rear image" msgstr "" -#: dcim/filtersets.py:463 dcim/filtersets.py:571 dcim/filtersets.py:975 +#: dcim/filtersets.py:466 dcim/filtersets.py:575 dcim/filtersets.py:983 #: dcim/forms/filtersets.py:466 dcim/forms/filtersets.py:563 #: dcim/forms/filtersets.py:775 msgid "Has console ports" msgstr "" -#: dcim/filtersets.py:467 dcim/filtersets.py:575 dcim/filtersets.py:979 +#: dcim/filtersets.py:470 dcim/filtersets.py:579 dcim/filtersets.py:987 #: dcim/forms/filtersets.py:473 dcim/forms/filtersets.py:570 #: dcim/forms/filtersets.py:782 msgid "Has console server ports" msgstr "" -#: dcim/filtersets.py:471 dcim/filtersets.py:579 dcim/filtersets.py:983 +#: dcim/filtersets.py:474 dcim/filtersets.py:583 dcim/filtersets.py:991 #: dcim/forms/filtersets.py:480 dcim/forms/filtersets.py:577 #: dcim/forms/filtersets.py:789 msgid "Has power ports" msgstr "" -#: dcim/filtersets.py:475 dcim/filtersets.py:583 dcim/filtersets.py:987 +#: dcim/filtersets.py:478 dcim/filtersets.py:587 dcim/filtersets.py:995 #: dcim/forms/filtersets.py:487 dcim/forms/filtersets.py:584 #: dcim/forms/filtersets.py:796 msgid "Has power outlets" msgstr "" -#: dcim/filtersets.py:479 dcim/filtersets.py:587 dcim/filtersets.py:991 +#: dcim/filtersets.py:482 dcim/filtersets.py:591 dcim/filtersets.py:999 #: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:591 #: dcim/forms/filtersets.py:803 msgid "Has interfaces" msgstr "" -#: dcim/filtersets.py:483 dcim/filtersets.py:591 dcim/filtersets.py:995 +#: dcim/filtersets.py:486 dcim/filtersets.py:595 dcim/filtersets.py:1003 #: dcim/forms/filtersets.py:501 dcim/forms/filtersets.py:598 #: dcim/forms/filtersets.py:810 msgid "Has pass-through ports" msgstr "" -#: dcim/filtersets.py:487 dcim/filtersets.py:999 dcim/forms/filtersets.py:515 +#: dcim/filtersets.py:490 dcim/filtersets.py:1007 dcim/forms/filtersets.py:515 msgid "Has module bays" msgstr "" -#: dcim/filtersets.py:491 dcim/filtersets.py:1003 dcim/forms/filtersets.py:508 +#: dcim/filtersets.py:494 dcim/filtersets.py:1011 dcim/forms/filtersets.py:508 msgid "Has device bays" msgstr "" -#: dcim/filtersets.py:495 dcim/forms/filtersets.py:522 +#: dcim/filtersets.py:498 dcim/forms/filtersets.py:522 msgid "Has inventory items" msgstr "" -#: dcim/filtersets.py:638 dcim/filtersets.py:849 dcim/filtersets.py:1245 +#: dcim/filtersets.py:643 dcim/filtersets.py:857 dcim/filtersets.py:1261 msgid "Device type (ID)" msgstr "" -#: dcim/filtersets.py:651 dcim/filtersets.py:1127 +#: dcim/filtersets.py:659 dcim/filtersets.py:1142 msgid "Module type (ID)" msgstr "" -#: dcim/filtersets.py:750 dcim/filtersets.py:1605 +#: dcim/filtersets.py:758 dcim/filtersets.py:1621 msgid "Parent inventory item (ID)" msgstr "" -#: dcim/filtersets.py:793 dcim/filtersets.py:815 dcim/filtersets.py:971 -#: virtualization/filtersets.py:237 +#: dcim/filtersets.py:801 dcim/filtersets.py:823 dcim/filtersets.py:979 +#: virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "" -#: dcim/filtersets.py:845 +#: dcim/filtersets.py:853 msgid "Device type (slug)" msgstr "" -#: dcim/filtersets.py:865 +#: dcim/filtersets.py:873 msgid "Parent Device (ID)" msgstr "" -#: dcim/filtersets.py:869 virtualization/filtersets.py:219 +#: dcim/filtersets.py:877 virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "" -#: dcim/filtersets.py:875 extras/filtersets.py:474 -#: virtualization/filtersets.py:225 +#: dcim/filtersets.py:883 extras/filtersets.py:474 +#: virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "" -#: dcim/filtersets.py:911 dcim/filtersets.py:1208 dcim/filtersets.py:1703 -#: dcim/filtersets.py:1875 dcim/filtersets.py:1933 +#: dcim/filtersets.py:919 dcim/filtersets.py:1224 dcim/filtersets.py:1719 +#: dcim/filtersets.py:1961 dcim/filtersets.py:2020 msgid "Site name (slug)" msgstr "" -#: dcim/filtersets.py:926 +#: dcim/filtersets.py:934 msgid "VM cluster (ID)" msgstr "" -#: dcim/filtersets.py:932 +#: dcim/filtersets.py:940 msgid "Device model (slug)" msgstr "" -#: dcim/filtersets.py:943 dcim/forms/bulk_edit.py:421 +#: dcim/filtersets.py:951 dcim/forms/bulk_edit.py:421 msgid "Is full depth" msgstr "" -#: dcim/filtersets.py:947 dcim/forms/common.py:18 dcim/forms/filtersets.py:745 +#: dcim/filtersets.py:955 dcim/forms/common.py:18 dcim/forms/filtersets.py:745 #: dcim/forms/filtersets.py:1285 dcim/models/device_components.py:519 -#: virtualization/filtersets.py:229 virtualization/filtersets.py:295 +#: virtualization/filtersets.py:230 virtualization/filtersets.py:297 #: virtualization/forms/filtersets.py:168 #: virtualization/forms/filtersets.py:215 msgid "MAC address" msgstr "" -#: dcim/filtersets.py:954 dcim/forms/filtersets.py:754 -#: dcim/forms/filtersets.py:841 virtualization/filtersets.py:233 +#: dcim/filtersets.py:962 dcim/forms/filtersets.py:754 +#: dcim/forms/filtersets.py:841 virtualization/filtersets.py:234 #: virtualization/forms/filtersets.py:172 msgid "Has a primary IP" msgstr "" -#: dcim/filtersets.py:958 +#: dcim/filtersets.py:966 msgid "Has an out-of-band IP" msgstr "" -#: dcim/filtersets.py:963 +#: dcim/filtersets.py:971 msgid "Virtual chassis (ID)" msgstr "" -#: dcim/filtersets.py:967 +#: dcim/filtersets.py:975 msgid "Is a virtual chassis member" msgstr "" -#: dcim/filtersets.py:1008 +#: dcim/filtersets.py:1016 msgid "OOB IP (ID)" msgstr "" -#: dcim/filtersets.py:1133 +#: dcim/filtersets.py:1148 msgid "Module type (model)" msgstr "" -#: dcim/filtersets.py:1139 +#: dcim/filtersets.py:1154 msgid "Module Bay (ID)" msgstr "" -#: dcim/filtersets.py:1143 dcim/filtersets.py:1234 ipam/filtersets.py:577 -#: ipam/filtersets.py:807 ipam/filtersets.py:1015 -#: virtualization/filtersets.py:160 vpn/filtersets.py:351 +#: dcim/filtersets.py:1158 dcim/filtersets.py:1250 ipam/filtersets.py:577 +#: ipam/filtersets.py:807 ipam/filtersets.py:1026 +#: virtualization/filtersets.py:161 vpn/filtersets.py:351 msgid "Device (ID)" msgstr "" -#: dcim/filtersets.py:1230 +#: dcim/filtersets.py:1246 msgid "Rack (name)" msgstr "" -#: dcim/filtersets.py:1240 ipam/filtersets.py:572 ipam/filtersets.py:802 -#: ipam/filtersets.py:1021 vpn/filtersets.py:346 +#: dcim/filtersets.py:1256 ipam/filtersets.py:572 ipam/filtersets.py:802 +#: ipam/filtersets.py:1032 vpn/filtersets.py:346 msgid "Device (name)" msgstr "" -#: dcim/filtersets.py:1251 +#: dcim/filtersets.py:1267 msgid "Device type (model)" msgstr "" -#: dcim/filtersets.py:1256 dcim/filtersets.py:1279 +#: dcim/filtersets.py:1272 dcim/filtersets.py:1295 msgid "Device role (ID)" msgstr "" -#: dcim/filtersets.py:1262 dcim/filtersets.py:1285 +#: dcim/filtersets.py:1278 dcim/filtersets.py:1301 msgid "Device role (slug)" msgstr "" -#: dcim/filtersets.py:1267 +#: dcim/filtersets.py:1283 msgid "Virtual Chassis (ID)" msgstr "" -#: dcim/filtersets.py:1273 dcim/forms/filtersets.py:106 +#: dcim/filtersets.py:1289 dcim/forms/filtersets.py:106 #: dcim/tables/devices.py:235 netbox/navigation/menu.py:67 #: templates/dcim/device.html:123 templates/dcim/device_edit.html:93 #: templates/dcim/virtualchassis.html:20 @@ -2262,20 +2267,20 @@ msgstr "" msgid "Virtual Chassis" msgstr "" -#: dcim/filtersets.py:1305 +#: dcim/filtersets.py:1321 msgid "Module (ID)" msgstr "" -#: dcim/filtersets.py:1409 ipam/forms/bulk_import.py:188 -#: vpn/forms/bulk_import.py:303 +#: dcim/filtersets.py:1425 ipam/forms/bulk_import.py:188 +#: vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "" -#: dcim/filtersets.py:1413 +#: dcim/filtersets.py:1429 msgid "Assigned VID" msgstr "" -#: dcim/filtersets.py:1418 dcim/forms/bulk_edit.py:1374 +#: dcim/filtersets.py:1434 dcim/forms/bulk_edit.py:1374 #: dcim/forms/bulk_import.py:828 dcim/forms/filtersets.py:1328 #: dcim/forms/model_forms.py:1175 dcim/models/device_components.py:712 #: dcim/tables/devices.py:637 ipam/filtersets.py:282 ipam/filtersets.py:293 @@ -2304,77 +2309,77 @@ msgstr "" msgid "VRF" msgstr "" -#: dcim/filtersets.py:1424 ipam/filtersets.py:288 ipam/filtersets.py:299 +#: dcim/filtersets.py:1440 ipam/filtersets.py:288 ipam/filtersets.py:299 #: ipam/filtersets.py:455 ipam/filtersets.py:556 ipam/filtersets.py:567 msgid "VRF (RD)" msgstr "" -#: dcim/filtersets.py:1429 ipam/filtersets.py:963 vpn/filtersets.py:314 +#: dcim/filtersets.py:1445 ipam/filtersets.py:967 vpn/filtersets.py:314 msgid "L2VPN (ID)" msgstr "" -#: dcim/filtersets.py:1435 dcim/forms/filtersets.py:1333 -#: dcim/tables/devices.py:585 ipam/filtersets.py:969 +#: dcim/filtersets.py:1451 dcim/forms/filtersets.py:1333 +#: dcim/tables/devices.py:585 ipam/filtersets.py:973 #: ipam/forms/filtersets.py:499 ipam/tables/vlans.py:133 #: templates/dcim/interface.html:94 templates/ipam/vlan.html:69 #: templates/vpn/l2vpntermination.html:15 -#: virtualization/forms/filtersets.py:225 vpn/forms/bulk_import.py:275 +#: virtualization/forms/filtersets.py:225 vpn/forms/bulk_import.py:280 #: vpn/forms/filtersets.py:242 vpn/forms/model_forms.py:402 #: vpn/forms/model_forms.py:420 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "" -#: dcim/filtersets.py:1467 +#: dcim/filtersets.py:1483 msgid "Virtual Chassis Interfaces for Device" msgstr "" -#: dcim/filtersets.py:1472 +#: dcim/filtersets.py:1488 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "" -#: dcim/filtersets.py:1476 +#: dcim/filtersets.py:1492 msgid "Kind of interface" msgstr "" -#: dcim/filtersets.py:1481 virtualization/filtersets.py:287 +#: dcim/filtersets.py:1497 virtualization/filtersets.py:289 msgid "Parent interface (ID)" msgstr "" -#: dcim/filtersets.py:1486 virtualization/filtersets.py:292 +#: dcim/filtersets.py:1502 virtualization/filtersets.py:294 msgid "Bridged interface (ID)" msgstr "" -#: dcim/filtersets.py:1491 +#: dcim/filtersets.py:1507 msgid "LAG interface (ID)" msgstr "" -#: dcim/filtersets.py:1660 +#: dcim/filtersets.py:1676 msgid "Master (ID)" msgstr "" -#: dcim/filtersets.py:1666 +#: dcim/filtersets.py:1682 msgid "Master (name)" msgstr "" -#: dcim/filtersets.py:1708 tenancy/filtersets.py:220 +#: dcim/filtersets.py:1724 tenancy/filtersets.py:221 msgid "Tenant (ID)" msgstr "" -#: dcim/filtersets.py:1714 extras/filtersets.py:523 tenancy/filtersets.py:226 +#: dcim/filtersets.py:1730 extras/filtersets.py:523 tenancy/filtersets.py:227 msgid "Tenant (slug)" msgstr "" -#: dcim/filtersets.py:1749 dcim/forms/filtersets.py:990 +#: dcim/filtersets.py:1766 dcim/forms/filtersets.py:990 msgid "Unterminated" msgstr "" -#: dcim/filtersets.py:1937 +#: dcim/filtersets.py:2024 msgid "Power panel (ID)" msgstr "" #: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:410 -#: extras/forms/model_forms.py:444 extras/forms/model_forms.py:495 -#: netbox/forms/base.py:71 netbox/forms/mixins.py:79 +#: extras/forms/model_forms.py:451 extras/forms/model_forms.py:502 +#: netbox/forms/base.py:82 netbox/forms/mixins.py:79 #: netbox/tables/columns.py:448 #: templates/circuits/inc/circuit_termination.html:119 #: templates/generic/bulk_edit.html:81 templates/inc/panels/tags.html:5 @@ -2421,7 +2426,7 @@ msgstr "" #: virtualization/forms/bulk_edit.py:64 virtualization/forms/bulk_import.py:47 #: virtualization/forms/filtersets.py:84 virtualization/forms/model_forms.py:69 #: virtualization/tables/clusters.py:70 vpn/forms/bulk_edit.py:111 -#: vpn/forms/bulk_import.py:157 vpn/forms/filtersets.py:113 +#: vpn/forms/bulk_import.py:158 vpn/forms/filtersets.py:113 #: vpn/tables/crypto.py:31 wireless/forms/bulk_edit.py:47 #: wireless/forms/bulk_import.py:36 wireless/forms/filtersets.py:45 #: wireless/forms/model_forms.py:41 wireless/tables/wirelesslan.py:48 @@ -2740,12 +2745,12 @@ msgstr "" #: templates/vpn/l2vpntermination_edit.html:22 #: templates/vpn/tunneltermination.html:24 #: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:166 virtualization/forms/bulk_edit.py:136 +#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:136 #: virtualization/forms/bulk_import.py:99 #: virtualization/forms/filtersets.py:124 #: virtualization/forms/model_forms.py:188 #: virtualization/tables/virtualmachines.py:61 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:278 +#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 #: vpn/forms/filtersets.py:271 vpn/forms/model_forms.py:89 #: vpn/forms/model_forms.py:124 vpn/forms/model_forms.py:237 #: wireless/forms/model_forms.py:100 wireless/forms/model_forms.py:140 @@ -2914,8 +2919,8 @@ msgstr "" #: templates/vpn/ikepolicy.html:26 templates/vpn/ipsecprofile.html:22 #: templates/vpn/ipsecprofile.html:51 virtualization/forms/bulk_edit.py:232 #: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:145 -#: vpn/forms/bulk_edit.py:233 vpn/forms/bulk_import.py:175 -#: vpn/forms/bulk_import.py:229 vpn/forms/filtersets.py:132 +#: vpn/forms/bulk_edit.py:233 vpn/forms/bulk_import.py:176 +#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:132 #: vpn/forms/filtersets.py:175 vpn/forms/filtersets.py:189 #: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 msgid "Mode" @@ -3122,7 +3127,7 @@ msgstr "" #: templates/virtualization/cluster.html:11 #: templates/virtualization/virtualmachine.html:92 #: templates/virtualization/virtualmachine.html:102 -#: virtualization/filtersets.py:156 virtualization/filtersets.py:271 +#: virtualization/filtersets.py:157 virtualization/filtersets.py:273 #: virtualization/forms/bulk_edit.py:128 virtualization/forms/bulk_import.py:92 #: virtualization/forms/filtersets.py:98 virtualization/forms/filtersets.py:119 #: virtualization/forms/filtersets.py:196 @@ -3514,7 +3519,7 @@ msgstr "" #: dcim/forms/filtersets.py:1248 extras/forms/bulk_edit.py:315 #: extras/forms/bulk_import.py:239 extras/forms/filtersets.py:479 -#: extras/forms/model_forms.py:548 extras/tables/tables.py:482 +#: extras/forms/model_forms.py:555 extras/tables/tables.py:487 #: templates/extras/journalentry.html:33 msgid "Kind" msgstr "" @@ -3648,7 +3653,7 @@ msgstr "" #: templates/wireless/inc/wirelesslink_interface.html:10 #: templates/wireless/wirelesslink.html:10 #: templates/wireless/wirelesslink.html:49 -#: virtualization/forms/model_forms.py:351 vpn/forms/bulk_import.py:292 +#: virtualization/forms/model_forms.py:351 vpn/forms/bulk_import.py:297 #: vpn/forms/model_forms.py:94 vpn/forms/model_forms.py:129 #: vpn/forms/model_forms.py:241 vpn/forms/model_forms.py:430 #: vpn/forms/model_forms.py:439 vpn/tables/tunnels.py:87 @@ -4136,7 +4141,7 @@ msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" #: dcim/models/device_components.py:531 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:214 +#: vpn/models/crypto.py:226 msgid "mode" msgstr "" @@ -4370,10 +4375,6 @@ msgstr "" msgid "module bays" msgstr "" -#: dcim/models/device_components.py:1118 -msgid "parent_bay" -msgstr "" - #: dcim/models/device_components.py:1126 msgid "device bay" msgstr "" @@ -5193,7 +5194,7 @@ msgid "VMs" msgstr "" #: dcim/tables/devices.py:133 dcim/tables/devices.py:245 -#: extras/forms/model_forms.py:506 templates/dcim/device.html:114 +#: extras/forms/model_forms.py:513 templates/dcim/device.html:114 #: templates/dcim/device/render_config.html:11 #: templates/dcim/device/render_config.html:15 #: templates/dcim/devicerole.html:47 templates/dcim/platform.html:44 @@ -5257,8 +5258,8 @@ msgid "Power outlets" msgstr "" #: dcim/tables/devices.py:275 dcim/tables/devices.py:1082 -#: dcim/tables/devicetypes.py:125 dcim/views.py:1002 dcim/views.py:1241 -#: dcim/views.py:1927 netbox/navigation/menu.py:82 +#: dcim/tables/devicetypes.py:125 dcim/views.py:1001 dcim/views.py:1240 +#: dcim/views.py:1926 netbox/navigation/menu.py:82 #: netbox/navigation/menu.py:238 templates/dcim/device/base.html:37 #: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 #: templates/dcim/module.html:34 templates/dcim/moduletype/base.html:34 @@ -5313,7 +5314,7 @@ msgid "Allocated draw (W)" msgstr "" #: dcim/tables/devices.py:573 ipam/forms/model_forms.py:707 -#: ipam/tables/fhrp.py:28 ipam/views.py:597 ipam/views.py:671 +#: ipam/tables/fhrp.py:28 ipam/views.py:597 ipam/views.py:691 #: netbox/navigation/menu.py:146 netbox/navigation/menu.py:148 #: templates/dcim/interface.html:351 templates/ipam/ipaddress_bulk_add.html:15 #: templates/ipam/service.html:43 templates/virtualization/vminterface.html:88 @@ -5349,7 +5350,7 @@ msgid "VDCs" msgstr "" #: dcim/tables/devices.py:642 dcim/tables/devicetypes.py:48 -#: dcim/tables/devicetypes.py:140 dcim/views.py:1077 dcim/views.py:2020 +#: dcim/tables/devicetypes.py:140 dcim/views.py:1076 dcim/views.py:2019 #: netbox/navigation/menu.py:91 templates/dcim/device/base.html:52 #: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 #: templates/dcim/inc/panels/inventory_items.html:5 @@ -5401,7 +5402,7 @@ msgid "Module Types" msgstr "" #: dcim/tables/devicetypes.py:53 extras/forms/filtersets.py:379 -#: extras/forms/model_forms.py:414 netbox/navigation/menu.py:66 +#: extras/forms/model_forms.py:421 netbox/navigation/menu.py:66 msgid "Platforms" msgstr "" @@ -5421,60 +5422,60 @@ msgstr "" msgid "Instances" msgstr "" -#: dcim/tables/devicetypes.py:113 dcim/views.py:942 dcim/views.py:1181 -#: dcim/views.py:1867 netbox/navigation/menu.py:85 +#: dcim/tables/devicetypes.py:113 dcim/views.py:941 dcim/views.py:1180 +#: dcim/views.py:1866 netbox/navigation/menu.py:85 #: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 #: templates/dcim/devicetype/base.html:22 templates/dcim/module.html:22 #: templates/dcim/moduletype/base.html:22 msgid "Console Ports" msgstr "" -#: dcim/tables/devicetypes.py:116 dcim/views.py:957 dcim/views.py:1196 -#: dcim/views.py:1882 netbox/navigation/menu.py:86 +#: dcim/tables/devicetypes.py:116 dcim/views.py:956 dcim/views.py:1195 +#: dcim/views.py:1881 netbox/navigation/menu.py:86 #: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 #: templates/dcim/devicetype/base.html:25 templates/dcim/module.html:25 #: templates/dcim/moduletype/base.html:25 msgid "Console Server Ports" msgstr "" -#: dcim/tables/devicetypes.py:119 dcim/views.py:972 dcim/views.py:1211 -#: dcim/views.py:1897 netbox/navigation/menu.py:87 +#: dcim/tables/devicetypes.py:119 dcim/views.py:971 dcim/views.py:1210 +#: dcim/views.py:1896 netbox/navigation/menu.py:87 #: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 #: templates/dcim/devicetype/base.html:28 templates/dcim/module.html:28 #: templates/dcim/moduletype/base.html:28 msgid "Power Ports" msgstr "" -#: dcim/tables/devicetypes.py:122 dcim/views.py:987 dcim/views.py:1226 -#: dcim/views.py:1912 netbox/navigation/menu.py:88 +#: dcim/tables/devicetypes.py:122 dcim/views.py:986 dcim/views.py:1225 +#: dcim/views.py:1911 netbox/navigation/menu.py:88 #: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 #: templates/dcim/devicetype/base.html:31 templates/dcim/module.html:31 #: templates/dcim/moduletype/base.html:31 msgid "Power Outlets" msgstr "" -#: dcim/tables/devicetypes.py:128 dcim/views.py:1017 dcim/views.py:1256 -#: dcim/views.py:1948 netbox/navigation/menu.py:83 +#: dcim/tables/devicetypes.py:128 dcim/views.py:1016 dcim/views.py:1255 +#: dcim/views.py:1947 netbox/navigation/menu.py:83 #: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 #: templates/dcim/module.html:37 templates/dcim/moduletype/base.html:37 msgid "Front Ports" msgstr "" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1032 dcim/views.py:1271 -#: dcim/views.py:1963 netbox/navigation/menu.py:84 +#: dcim/tables/devicetypes.py:131 dcim/views.py:1031 dcim/views.py:1270 +#: dcim/views.py:1962 netbox/navigation/menu.py:84 #: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 #: templates/dcim/devicetype/base.html:40 templates/dcim/module.html:40 #: templates/dcim/moduletype/base.html:40 msgid "Rear Ports" msgstr "" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1062 dcim/views.py:2001 +#: dcim/tables/devicetypes.py:134 dcim/views.py:1061 dcim/views.py:2000 #: netbox/navigation/menu.py:90 templates/dcim/device/base.html:49 #: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1047 dcim/views.py:1982 +#: dcim/tables/devicetypes.py:137 dcim/views.py:1046 dcim/views.py:1981 #: netbox/navigation/menu.py:89 templates/dcim/device/base.html:46 #: templates/dcim/device_list.html:64 templates/dcim/devicetype/base.html:43 msgid "Module Bays" @@ -5520,7 +5521,7 @@ msgid "Max Weight" msgstr "" #: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:394 +#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:401 #: ipam/forms/bulk_edit.py:128 ipam/forms/model_forms.py:152 #: ipam/tables/asn.py:66 netbox/navigation/menu.py:16 #: netbox/navigation/menu.py:18 @@ -5536,21 +5537,21 @@ msgstr "" msgid "Reservations" msgstr "" -#: dcim/views.py:711 +#: dcim/views.py:710 msgid "Non-Racked Devices" msgstr "" -#: dcim/views.py:2033 extras/forms/model_forms.py:454 +#: dcim/views.py:2032 extras/forms/model_forms.py:461 #: templates/extras/configcontext.html:10 #: virtualization/forms/model_forms.py:228 virtualization/views.py:408 msgid "Config Context" msgstr "" -#: dcim/views.py:2043 virtualization/views.py:418 +#: dcim/views.py:2042 virtualization/views.py:418 msgid "Render Config" msgstr "" -#: dcim/views.py:2971 ipam/tables/ip.py:233 +#: dcim/views.py:2970 ipam/tables/ip.py:233 msgid "Children" msgstr "" @@ -5696,7 +5697,7 @@ msgstr "" msgid "30 days" msgstr "" -#: extras/choices.py:254 extras/tables/tables.py:287 +#: extras/choices.py:254 extras/tables/tables.py:291 #: templates/dcim/virtualchassis_edit.html:108 #: templates/extras/eventrule.html:51 #: templates/generic/bulk_add_component.html:56 @@ -5705,12 +5706,12 @@ msgstr "" msgid "Create" msgstr "" -#: extras/choices.py:255 extras/tables/tables.py:290 +#: extras/choices.py:255 extras/tables/tables.py:294 #: templates/extras/eventrule.html:55 msgid "Update" msgstr "" -#: extras/choices.py:256 extras/tables/tables.py:293 +#: extras/choices.py:256 extras/tables/tables.py:297 #: templates/circuits/inc/circuit_termination.html:22 #: templates/dcim/devicetype/component_templates.html:24 #: templates/dcim/inc/panels/inventory_items.html:29 @@ -5778,7 +5779,7 @@ msgid "White" msgstr "" #: extras/choices.py:306 extras/forms/model_forms.py:233 -#: extras/forms/model_forms.py:321 templates/extras/webhook.html:11 +#: extras/forms/model_forms.py:319 templates/extras/webhook.html:11 msgid "Webhook" msgstr "" @@ -5862,7 +5863,7 @@ msgid "Cluster type" msgstr "" #: extras/filtersets.py:485 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:146 +#: virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "" @@ -5871,7 +5872,7 @@ msgstr "" msgid "Cluster group" msgstr "" -#: extras/filtersets.py:496 virtualization/filtersets.py:135 +#: extras/filtersets.py:496 virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "" @@ -5879,7 +5880,7 @@ msgstr "" msgid "Tenant group" msgstr "" -#: extras/filtersets.py:512 tenancy/filtersets.py:163 tenancy/filtersets.py:183 +#: extras/filtersets.py:512 tenancy/filtersets.py:164 tenancy/filtersets.py:184 msgid "Tenant group (slug)" msgstr "" @@ -6077,7 +6078,7 @@ msgid "Choices" msgstr "" #: extras/forms/filtersets.py:141 extras/forms/filtersets.py:327 -#: extras/forms/filtersets.py:417 extras/forms/model_forms.py:449 +#: extras/forms/filtersets.py:417 extras/forms/model_forms.py:456 #: templates/core/job.html:86 templates/extras/configcontext.html:86 #: templates/extras/eventrule.html:111 msgid "Data" @@ -6122,7 +6123,7 @@ msgstr "" msgid "Job starts" msgstr "" -#: extras/forms/filtersets.py:306 extras/forms/model_forms.py:289 +#: extras/forms/filtersets.py:306 extras/forms/model_forms.py:288 msgid "Job terminations" msgstr "" @@ -6134,44 +6135,44 @@ msgstr "" msgid "Allowed object type" msgstr "" -#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:384 +#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:391 #: netbox/navigation/menu.py:19 msgid "Regions" msgstr "" -#: extras/forms/filtersets.py:354 extras/forms/model_forms.py:389 +#: extras/forms/filtersets.py:354 extras/forms/model_forms.py:396 msgid "Site groups" msgstr "" -#: extras/forms/filtersets.py:364 extras/forms/model_forms.py:399 +#: extras/forms/filtersets.py:364 extras/forms/model_forms.py:406 #: netbox/navigation/menu.py:21 msgid "Locations" msgstr "" -#: extras/forms/filtersets.py:369 extras/forms/model_forms.py:404 +#: extras/forms/filtersets.py:369 extras/forms/model_forms.py:411 msgid "Device types" msgstr "" -#: extras/forms/filtersets.py:374 extras/forms/model_forms.py:409 +#: extras/forms/filtersets.py:374 extras/forms/model_forms.py:416 msgid "Roles" msgstr "" -#: extras/forms/filtersets.py:384 extras/forms/model_forms.py:419 +#: extras/forms/filtersets.py:384 extras/forms/model_forms.py:426 msgid "Cluster types" msgstr "" -#: extras/forms/filtersets.py:390 extras/forms/model_forms.py:424 +#: extras/forms/filtersets.py:390 extras/forms/model_forms.py:431 msgid "Cluster groups" msgstr "" -#: extras/forms/filtersets.py:395 extras/forms/model_forms.py:429 +#: extras/forms/filtersets.py:395 extras/forms/model_forms.py:436 #: netbox/navigation/menu.py:243 netbox/navigation/menu.py:245 #: templates/virtualization/clustertype.html:33 #: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "" -#: extras/forms/filtersets.py:400 extras/forms/model_forms.py:434 +#: extras/forms/filtersets.py:400 extras/forms/model_forms.py:441 msgid "Tenant groups" msgstr "" @@ -6183,14 +6184,14 @@ msgstr "" msgid "Before" msgstr "" -#: extras/forms/filtersets.py:490 extras/tables/tables.py:426 +#: extras/forms/filtersets.py:490 extras/tables/tables.py:431 #: templates/extras/htmx/report_result.html:43 #: templates/extras/objectchange.html:34 msgid "Time" msgstr "" #: extras/forms/filtersets.py:504 extras/forms/model_forms.py:271 -#: extras/tables/tables.py:440 templates/extras/eventrule.html:90 +#: extras/tables/tables.py:445 templates/extras/eventrule.html:90 #: templates/extras/objectchange.html:50 msgid "Action" msgstr "" @@ -6250,7 +6251,7 @@ msgid "" "{{ object }}." msgstr "" -#: extras/forms/model_forms.py:158 extras/forms/model_forms.py:500 +#: extras/forms/model_forms.py:158 extras/forms/model_forms.py:507 msgid "Template code" msgstr "" @@ -6262,11 +6263,11 @@ msgstr "" msgid "Rendering" msgstr "" -#: extras/forms/model_forms.py:180 extras/forms/model_forms.py:525 +#: extras/forms/model_forms.py:180 extras/forms/model_forms.py:532 msgid "Template content is populated from the remote source selected below." msgstr "" -#: extras/forms/model_forms.py:187 extras/forms/model_forms.py:532 +#: extras/forms/model_forms.py:187 extras/forms/model_forms.py:539 msgid "Must specify either local content or a data file" msgstr "" @@ -6305,47 +6306,47 @@ msgstr "" msgid "Conditions" msgstr "" -#: extras/forms/model_forms.py:285 +#: extras/forms/model_forms.py:284 msgid "Creations" msgstr "" -#: extras/forms/model_forms.py:286 +#: extras/forms/model_forms.py:285 msgid "Updates" msgstr "" -#: extras/forms/model_forms.py:287 +#: extras/forms/model_forms.py:286 msgid "Deletions" msgstr "" -#: extras/forms/model_forms.py:288 +#: extras/forms/model_forms.py:287 msgid "Job executions" msgstr "" -#: extras/forms/model_forms.py:366 users/forms/model_forms.py:285 +#: extras/forms/model_forms.py:373 users/forms/model_forms.py:286 msgid "Object types" msgstr "" -#: extras/forms/model_forms.py:439 netbox/navigation/menu.py:40 +#: extras/forms/model_forms.py:446 netbox/navigation/menu.py:40 #: tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "" -#: extras/forms/model_forms.py:456 ipam/forms/filtersets.py:141 +#: extras/forms/model_forms.py:463 ipam/forms/filtersets.py:141 #: ipam/forms/filtersets.py:527 templates/extras/configcontext.html:62 #: templates/ipam/ipaddress.html:62 templates/ipam/vlan_edit.html:30 -#: tenancy/forms/filtersets.py:86 users/forms/model_forms.py:323 +#: tenancy/forms/filtersets.py:86 users/forms/model_forms.py:324 msgid "Assignment" msgstr "" -#: extras/forms/model_forms.py:482 +#: extras/forms/model_forms.py:489 msgid "Data is populated from the remote source selected below." msgstr "" -#: extras/forms/model_forms.py:488 +#: extras/forms/model_forms.py:495 msgid "Must specify either local data or a data file" msgstr "" -#: extras/forms/model_forms.py:507 templates/core/datafile.html:65 +#: extras/forms/model_forms.py:514 templates/core/datafile.html:65 msgid "Content" msgstr "" @@ -6660,91 +6661,91 @@ msgstr "" msgid "Values must match this regex: {regex}" msgstr "" -#: extras/models/customfields.py:612 +#: extras/models/customfields.py:611 msgid "Value must be a string." msgstr "" -#: extras/models/customfields.py:614 +#: extras/models/customfields.py:613 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "" -#: extras/models/customfields.py:619 +#: extras/models/customfields.py:618 msgid "Value must be an integer." msgstr "" -#: extras/models/customfields.py:622 extras/models/customfields.py:637 +#: extras/models/customfields.py:621 extras/models/customfields.py:636 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "" -#: extras/models/customfields.py:626 extras/models/customfields.py:641 +#: extras/models/customfields.py:625 extras/models/customfields.py:640 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "" -#: extras/models/customfields.py:634 +#: extras/models/customfields.py:633 msgid "Value must be a decimal." msgstr "" -#: extras/models/customfields.py:646 +#: extras/models/customfields.py:645 msgid "Value must be true or false." msgstr "" -#: extras/models/customfields.py:654 +#: extras/models/customfields.py:653 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "" -#: extras/models/customfields.py:663 +#: extras/models/customfields.py:662 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" -#: extras/models/customfields.py:670 +#: extras/models/customfields.py:669 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "" -#: extras/models/customfields.py:680 +#: extras/models/customfields.py:679 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "" -#: extras/models/customfields.py:689 +#: extras/models/customfields.py:688 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "" -#: extras/models/customfields.py:695 +#: extras/models/customfields.py:694 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "" -#: extras/models/customfields.py:699 +#: extras/models/customfields.py:698 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "" -#: extras/models/customfields.py:702 +#: extras/models/customfields.py:701 msgid "Required field cannot be empty." msgstr "" -#: extras/models/customfields.py:721 +#: extras/models/customfields.py:720 msgid "Base set of predefined choices (optional)" msgstr "" -#: extras/models/customfields.py:733 +#: extras/models/customfields.py:732 msgid "Choices are automatically ordered alphabetically" msgstr "" -#: extras/models/customfields.py:740 +#: extras/models/customfields.py:739 msgid "custom field choice set" msgstr "" -#: extras/models/customfields.py:741 +#: extras/models/customfields.py:740 msgid "custom field choice sets" msgstr "" -#: extras/models/customfields.py:777 +#: extras/models/customfields.py:776 msgid "Must define base or extra choices." msgstr "" @@ -7152,14 +7153,14 @@ msgstr "" msgid "tagged items" msgstr "" -#: extras/signals.py:221 +#: extras/signals.py:220 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "" #: extras/tables/tables.py:44 extras/tables/tables.py:119 #: extras/tables/tables.py:143 extras/tables/tables.py:208 -#: extras/tables/tables.py:281 +#: extras/tables/tables.py:285 msgid "Content Types" msgstr "" @@ -7195,8 +7196,8 @@ msgstr "" msgid "As Attachment" msgstr "" -#: extras/tables/tables.py:153 extras/tables/tables.py:367 -#: extras/tables/tables.py:402 templates/core/datafile.html:32 +#: extras/tables/tables.py:153 extras/tables/tables.py:372 +#: extras/tables/tables.py:407 templates/core/datafile.html:32 #: templates/dcim/device/render_config.html:23 #: templates/extras/configcontext.html:40 #: templates/extras/configtemplate.html:32 @@ -7206,8 +7207,8 @@ msgstr "" msgid "Data File" msgstr "" -#: extras/tables/tables.py:158 extras/tables/tables.py:379 -#: extras/tables/tables.py:407 +#: extras/tables/tables.py:158 extras/tables/tables.py:384 +#: extras/tables/tables.py:412 msgid "Synced" msgstr "" @@ -7223,7 +7224,7 @@ msgstr "" msgid "Size (Bytes)" msgstr "" -#: extras/tables/tables.py:233 extras/tables/tables.py:326 +#: extras/tables/tables.py:233 extras/tables/tables.py:331 #: templates/extras/customfield.html:96 templates/extras/eventrule.html:32 #: templates/users/objectpermission.html:68 users/tables.py:83 msgid "Object Types" @@ -7233,28 +7234,24 @@ msgstr "" msgid "SSL Validation" msgstr "" -#: extras/tables/tables.py:278 -msgid "Action Type" -msgstr "" - -#: extras/tables/tables.py:296 +#: extras/tables/tables.py:300 msgid "Job Start" msgstr "" -#: extras/tables/tables.py:299 +#: extras/tables/tables.py:303 msgid "Job End" msgstr "" -#: extras/tables/tables.py:436 templates/account/profile.html:20 +#: extras/tables/tables.py:441 templates/account/profile.html:20 #: templates/users/user.html:22 msgid "Full Name" msgstr "" -#: extras/tables/tables.py:453 templates/extras/objectchange.html:72 +#: extras/tables/tables.py:458 templates/extras/objectchange.html:72 msgid "Request ID" msgstr "" -#: extras/tables/tables.py:490 +#: extras/tables/tables.py:495 msgid "Comments (Short)" msgstr "" @@ -7276,6 +7273,11 @@ msgstr "" msgid "This field must not be empty." msgstr "" +#: extras/validators.py:119 +#, python-brace-format +msgid "Invalid attribute \"{name}\" for {model}" +msgstr "" + #: extras/views.py:880 msgid "Your dashboard has been reset." msgstr "" @@ -7422,13 +7424,13 @@ msgstr "" msgid "Parent prefix" msgstr "" -#: ipam/filtersets.py:582 ipam/filtersets.py:812 ipam/filtersets.py:1031 +#: ipam/filtersets.py:582 ipam/filtersets.py:812 ipam/filtersets.py:1042 #: vpn/filtersets.py:357 msgid "Virtual machine (name)" msgstr "" -#: ipam/filtersets.py:587 ipam/filtersets.py:817 ipam/filtersets.py:1025 -#: virtualization/filtersets.py:276 virtualization/filtersets.py:315 +#: ipam/filtersets.py:587 ipam/filtersets.py:817 ipam/filtersets.py:1036 +#: virtualization/filtersets.py:278 virtualization/filtersets.py:317 #: vpn/filtersets.py:362 msgid "Virtual machine (ID)" msgstr "" @@ -7461,19 +7463,19 @@ msgstr "" msgid "Is assigned" msgstr "" -#: ipam/filtersets.py:1036 +#: ipam/filtersets.py:1047 msgid "IP address (ID)" msgstr "" -#: ipam/filtersets.py:1042 ipam/models/ip.py:787 +#: ipam/filtersets.py:1053 ipam/models/ip.py:787 msgid "IP address" msgstr "" -#: ipam/filtersets.py:1068 +#: ipam/filtersets.py:1079 msgid "Primary IPv4 (ID)" msgstr "" -#: ipam/filtersets.py:1073 +#: ipam/filtersets.py:1084 msgid "Primary IPv6 (ID)" msgstr "" @@ -7607,7 +7609,7 @@ msgstr "" #: ipam/models/vlans.py:214 ipam/tables/ip.py:254 templates/ipam/prefix.html:61 #: templates/ipam/vlan.html:13 templates/ipam/vlan/base.html:6 #: templates/ipam/vlan_edit.html:10 templates/vpn/l2vpntermination_edit.html:17 -#: templates/wireless/wirelesslan.html:31 vpn/forms/bulk_import.py:299 +#: templates/wireless/wirelesslan.html:31 vpn/forms/bulk_import.py:304 #: vpn/forms/filtersets.py:280 vpn/forms/model_forms.py:427 #: wireless/forms/bulk_edit.py:54 wireless/forms/bulk_import.py:48 #: wireless/forms/model_forms.py:49 wireless/models.py:101 @@ -7619,15 +7621,15 @@ msgid "Parent device of assigned interface (if any)" msgstr "" #: ipam/forms/bulk_import.py:310 ipam/forms/bulk_import.py:496 -#: ipam/forms/model_forms.py:691 virtualization/filtersets.py:282 -#: virtualization/filtersets.py:321 virtualization/forms/bulk_edit.py:199 +#: ipam/forms/model_forms.py:691 virtualization/filtersets.py:284 +#: virtualization/filtersets.py:323 virtualization/forms/bulk_edit.py:199 #: virtualization/forms/bulk_edit.py:325 #: virtualization/forms/bulk_import.py:146 #: virtualization/forms/bulk_import.py:207 #: virtualization/forms/filtersets.py:204 #: virtualization/forms/filtersets.py:240 #: virtualization/forms/model_forms.py:291 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:285 +#: vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "" @@ -7836,7 +7838,7 @@ msgstr "" msgid "An IP address can only be assigned to a single object." msgstr "" -#: ipam/forms/model_forms.py:357 ipam/models/ip.py:878 +#: ipam/forms/model_forms.py:357 ipam/models/ip.py:877 msgid "" "Cannot reassign IP address while it is designated as the primary IP for the " "parent object" @@ -8143,7 +8145,7 @@ msgstr "" msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "" -#: ipam/models/ip.py:885 +#: ipam/models/ip.py:883 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "" @@ -8233,7 +8235,7 @@ msgid "The primary function of this VLAN" msgstr "" #: ipam/models/vlans.py:215 ipam/tables/ip.py:175 ipam/tables/vlans.py:78 -#: ipam/views.py:940 netbox/navigation/menu.py:181 +#: ipam/views.py:960 netbox/navigation/menu.py:181 #: netbox/navigation/menu.py:183 msgid "VLANs" msgstr "" @@ -8391,15 +8393,15 @@ msgstr "" msgid "Child Ranges" msgstr "" -#: ipam/views.py:868 +#: ipam/views.py:888 msgid "Related IPs" msgstr "" -#: ipam/views.py:1091 +#: ipam/views.py:1111 msgid "Device Interfaces" msgstr "" -#: ipam/views.py:1109 +#: ipam/views.py:1129 msgid "VM Interfaces" msgstr "" @@ -8595,15 +8597,15 @@ msgstr "" msgid "Object type(s)" msgstr "" -#: netbox/forms/base.py:66 +#: netbox/forms/base.py:77 msgid "Id" msgstr "" -#: netbox/forms/base.py:105 +#: netbox/forms/base.py:116 msgid "Add tags" msgstr "" -#: netbox/forms/base.py:110 +#: netbox/forms/base.py:121 msgid "Remove tags" msgstr "" @@ -8931,13 +8933,13 @@ msgid "Admin" msgstr "" #: netbox/navigation/menu.py:381 templates/users/group.html:27 -#: users/forms/model_forms.py:242 users/forms/model_forms.py:255 -#: users/forms/model_forms.py:309 users/tables.py:105 +#: users/forms/model_forms.py:243 users/forms/model_forms.py:256 +#: users/forms/model_forms.py:310 users/tables.py:105 msgid "Users" msgstr "" -#: netbox/navigation/menu.py:404 users/forms/model_forms.py:182 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:314 +#: netbox/navigation/menu.py:404 users/forms/model_forms.py:183 +#: users/forms/model_forms.py:196 users/forms/model_forms.py:315 #: users/tables.py:35 users/tables.py:109 msgid "Groups" msgstr "" @@ -8947,9 +8949,9 @@ msgstr "" msgid "API Tokens" msgstr "" -#: netbox/navigation/menu.py:433 users/forms/model_forms.py:188 -#: users/forms/model_forms.py:197 users/forms/model_forms.py:248 -#: users/forms/model_forms.py:256 +#: netbox/navigation/menu.py:433 users/forms/model_forms.py:189 +#: users/forms/model_forms.py:198 users/forms/model_forms.py:249 +#: users/forms/model_forms.py:257 msgid "Permissions" msgstr "" @@ -8966,30 +8968,74 @@ msgstr "" msgid "Plugins" msgstr "" -#: netbox/preferences.py:17 +#: netbox/preferences.py:19 msgid "Color mode" msgstr "" -#: netbox/preferences.py:25 -msgid "Page length" +#: netbox/preferences.py:21 +msgid "Light" +msgstr "" + +#: netbox/preferences.py:22 +msgid "Dark" msgstr "" #: netbox/preferences.py:27 +msgid "Language" +msgstr "" + +#: netbox/preferences.py:34 +msgid "Page length" +msgstr "" + +#: netbox/preferences.py:36 msgid "The default number of objects to display per page" msgstr "" -#: netbox/preferences.py:31 +#: netbox/preferences.py:40 msgid "Paginator placement" msgstr "" -#: netbox/preferences.py:37 -msgid "Where the paginator controls will be displayed relative to a table" +#: netbox/preferences.py:42 +msgid "Bottom" msgstr "" #: netbox/preferences.py:43 +msgid "Top" +msgstr "" + +#: netbox/preferences.py:44 +msgid "Both" +msgstr "" + +#: netbox/preferences.py:46 +msgid "Where the paginator controls will be displayed relative to a table" +msgstr "" + +#: netbox/preferences.py:52 msgid "Data format" msgstr "" +#: netbox/settings.py:726 +msgid "English" +msgstr "" + +#: netbox/settings.py:727 +msgid "Spanish" +msgstr "" + +#: netbox/settings.py:728 +msgid "French" +msgstr "" + +#: netbox/settings.py:729 +msgid "Portuguese" +msgstr "" + +#: netbox/settings.py:730 +msgid "Russian" +msgstr "" + #: netbox/tables/columns.py:175 msgid "Toggle all" msgstr "" @@ -10451,7 +10497,7 @@ msgstr "" #: templates/extras/admin/plugins_list.html:27 #: templates/vpn/ipsecprofile.html:47 vpn/forms/bulk_edit.py:140 -#: vpn/forms/bulk_import.py:171 vpn/tables/crypto.py:61 +#: vpn/forms/bulk_import.py:172 vpn/tables/crypto.py:61 msgid "Version" msgstr "" @@ -11443,7 +11489,7 @@ msgid "" "Click here to attempt loading NetBox again." msgstr "" -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:135 +#: templates/tenancy/contact.html:18 tenancy/filtersets.py:136 #: tenancy/forms/bulk_edit.py:136 tenancy/forms/filtersets.py:101 #: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:109 #: tenancy/forms/model_forms.py:132 tenancy/tables/contacts.py:98 @@ -11476,7 +11522,7 @@ msgstr "" msgid "Add Contact Group" msgstr "" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:140 +#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:141 #: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:90 msgid "Contact Role" msgstr "" @@ -11508,7 +11554,7 @@ msgid "Permission" msgstr "" #: templates/users/objectpermission.html:33 users/forms/filtersets.py:68 -#: users/forms/model_forms.py:321 +#: users/forms/model_forms.py:322 msgid "Actions" msgstr "" @@ -11516,7 +11562,7 @@ msgstr "" msgid "View" msgstr "" -#: templates/users/objectpermission.html:56 users/forms/model_forms.py:324 +#: templates/users/objectpermission.html:56 users/forms/model_forms.py:325 msgid "Constraints" msgstr "" @@ -11645,14 +11691,14 @@ msgstr "" #: templates/vpn/ikeproposal.html:26 templates/vpn/ipsecproposal.html:22 #: vpn/forms/bulk_edit.py:101 vpn/forms/bulk_edit.py:173 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:193 +#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 #: vpn/forms/filtersets.py:103 vpn/forms/filtersets.py:151 msgid "Encryption algorithm" msgstr "" #: templates/vpn/ikeproposal.html:30 templates/vpn/ipsecproposal.html:26 #: vpn/forms/bulk_edit.py:106 vpn/forms/bulk_edit.py:178 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:197 +#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 #: vpn/forms/filtersets.py:108 vpn/forms/filtersets.py:156 msgid "Authentication algorithm" msgstr "" @@ -11662,7 +11708,7 @@ msgid "DH group" msgstr "" #: templates/vpn/ikeproposal.html:38 templates/vpn/ipsecproposal.html:30 -#: vpn/forms/bulk_edit.py:183 vpn/models/crypto.py:134 +#: vpn/forms/bulk_edit.py:183 vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "" @@ -11672,7 +11718,7 @@ msgid "IPSec Policy" msgstr "" #: templates/vpn/ipsecpolicy.html:22 vpn/forms/bulk_edit.py:211 -#: vpn/models/crypto.py:181 +#: vpn/models/crypto.py:193 msgid "PFS group" msgstr "" @@ -11689,7 +11735,7 @@ msgid "IPSec Proposal" msgstr "" #: templates/vpn/ipsecproposal.html:34 vpn/forms/bulk_edit.py:187 -#: vpn/models/crypto.py:140 +#: vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "" @@ -11716,7 +11762,7 @@ msgstr "" #: templates/vpn/tunnel.html:42 vpn/forms/bulk_edit.py:54 #: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:63 -#: vpn/models/crypto.py:238 vpn/tables/tunnels.py:47 +#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:47 msgid "IPSec profile" msgstr "" @@ -11794,39 +11840,39 @@ msgstr "" msgid "Inactive" msgstr "" -#: tenancy/filtersets.py:29 tenancy/filtersets.py:55 tenancy/filtersets.py:97 +#: tenancy/filtersets.py:29 tenancy/filtersets.py:55 tenancy/filtersets.py:98 msgid "Contact group (ID)" msgstr "" -#: tenancy/filtersets.py:35 tenancy/filtersets.py:62 tenancy/filtersets.py:104 +#: tenancy/filtersets.py:35 tenancy/filtersets.py:62 tenancy/filtersets.py:105 msgid "Contact group (slug)" msgstr "" -#: tenancy/filtersets.py:91 +#: tenancy/filtersets.py:92 msgid "Contact (ID)" msgstr "" -#: tenancy/filtersets.py:108 +#: tenancy/filtersets.py:109 msgid "Contact role (ID)" msgstr "" -#: tenancy/filtersets.py:114 +#: tenancy/filtersets.py:115 msgid "Contact role (slug)" msgstr "" -#: tenancy/filtersets.py:146 +#: tenancy/filtersets.py:147 msgid "Contact group" msgstr "" -#: tenancy/filtersets.py:157 tenancy/filtersets.py:176 +#: tenancy/filtersets.py:158 tenancy/filtersets.py:177 msgid "Tenant group (ID)" msgstr "" -#: tenancy/filtersets.py:209 +#: tenancy/filtersets.py:210 msgid "Tenant Group (ID)" msgstr "" -#: tenancy/filtersets.py:216 +#: tenancy/filtersets.py:217 msgid "Tenant Group (slug)" msgstr "" @@ -11991,56 +12037,56 @@ msgstr "" msgid "User Interface" msgstr "" -#: users/forms/model_forms.py:115 +#: users/forms/model_forms.py:116 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " "accessible once the token has been created." msgstr "" -#: users/forms/model_forms.py:127 +#: users/forms/model_forms.py:128 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for " "no restrictions. Example: 10.1.1.0/24,192.168.10.16/32,2001:" "db8:1::/64" msgstr "" -#: users/forms/model_forms.py:176 +#: users/forms/model_forms.py:177 msgid "Confirm password" msgstr "" -#: users/forms/model_forms.py:179 +#: users/forms/model_forms.py:180 msgid "Enter the same password as before, for verification." msgstr "" -#: users/forms/model_forms.py:237 +#: users/forms/model_forms.py:238 msgid "Passwords do not match! Please check your input and try again." msgstr "" -#: users/forms/model_forms.py:303 +#: users/forms/model_forms.py:304 msgid "Additional actions" msgstr "" -#: users/forms/model_forms.py:306 +#: users/forms/model_forms.py:307 msgid "Actions granted in addition to those listed above" msgstr "" -#: users/forms/model_forms.py:322 +#: users/forms/model_forms.py:323 msgid "Objects" msgstr "" -#: users/forms/model_forms.py:334 +#: users/forms/model_forms.py:335 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " "objects will result in a logical OR operation." msgstr "" -#: users/forms/model_forms.py:372 +#: users/forms/model_forms.py:373 msgid "At least one action must be selected." msgstr "" -#: users/forms/model_forms.py:389 +#: users/forms/model_forms.py:390 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "" @@ -12455,15 +12501,15 @@ msgstr "" msgid "Parent group (slug)" msgstr "" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:140 +#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "" -#: virtualization/filtersets.py:129 +#: virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "" -#: virtualization/filtersets.py:150 virtualization/filtersets.py:265 +#: virtualization/filtersets.py:151 virtualization/filtersets.py:267 msgid "Cluster (ID)" msgstr "" @@ -12696,24 +12742,24 @@ msgstr "" #: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 #: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 #: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 +#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 #, python-brace-format msgid "Group {n}" msgstr "" -#: vpn/choices.py:240 +#: vpn/choices.py:241 msgid "Ethernet Private LAN" msgstr "" -#: vpn/choices.py:241 +#: vpn/choices.py:242 msgid "Ethernet Virtual Private LAN" msgstr "" -#: vpn/choices.py:244 +#: vpn/choices.py:245 msgid "Ethernet Private Tree" msgstr "" -#: vpn/choices.py:245 +#: vpn/choices.py:246 msgid "Ethernet Virtual Private Tree" msgstr "" @@ -12788,15 +12834,15 @@ msgstr "" msgid "Pre-shared key" msgstr "" -#: vpn/forms/bulk_edit.py:238 vpn/forms/bulk_import.py:234 +#: vpn/forms/bulk_edit.py:238 vpn/forms/bulk_import.py:239 #: vpn/forms/filtersets.py:196 vpn/forms/model_forms.py:363 -#: vpn/models/crypto.py:103 +#: vpn/models/crypto.py:104 msgid "IKE policy" msgstr "" -#: vpn/forms/bulk_edit.py:243 vpn/forms/bulk_import.py:239 +#: vpn/forms/bulk_edit.py:243 vpn/forms/bulk_import.py:244 #: vpn/forms/filtersets.py:201 vpn/forms/model_forms.py:367 -#: vpn/models/crypto.py:197 +#: vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "" @@ -12820,47 +12866,47 @@ msgstr "" msgid "Device or virtual machine interface" msgstr "" -#: vpn/forms/bulk_import.py:181 +#: vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "" -#: vpn/forms/bulk_import.py:211 vpn/models/crypto.py:185 +#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "" -#: vpn/forms/bulk_import.py:217 +#: vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "" -#: vpn/forms/bulk_import.py:231 +#: vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "" -#: vpn/forms/bulk_import.py:261 +#: vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "" -#: vpn/forms/bulk_import.py:282 +#: vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "" -#: vpn/forms/bulk_import.py:289 +#: vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "" -#: vpn/forms/bulk_import.py:296 +#: vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "" -#: vpn/forms/bulk_import.py:329 +#: vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "" -#: vpn/forms/bulk_import.py:331 +#: vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "" -#: vpn/forms/bulk_import.py:333 +#: vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "" @@ -12930,51 +12976,59 @@ msgstr "" msgid "version" msgstr "" -#: vpn/models/crypto.py:87 vpn/models/crypto.py:178 +#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 msgid "proposals" msgstr "" -#: vpn/models/crypto.py:90 wireless/models.py:38 +#: vpn/models/crypto.py:91 wireless/models.py:38 msgid "pre-shared key" msgstr "" -#: vpn/models/crypto.py:104 +#: vpn/models/crypto.py:105 msgid "IKE policies" msgstr "" -#: vpn/models/crypto.py:124 +#: vpn/models/crypto.py:118 +msgid "Mode is required for selected IKE version" +msgstr "" + +#: vpn/models/crypto.py:122 +msgid "Mode cannot be used for selected IKE version" +msgstr "" + +#: vpn/models/crypto.py:136 msgid "encryption" msgstr "" -#: vpn/models/crypto.py:129 +#: vpn/models/crypto.py:141 msgid "authentication" msgstr "" -#: vpn/models/crypto.py:137 +#: vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "" -#: vpn/models/crypto.py:143 +#: vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "" -#: vpn/models/crypto.py:152 +#: vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "" -#: vpn/models/crypto.py:153 +#: vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "" -#: vpn/models/crypto.py:166 +#: vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "" -#: vpn/models/crypto.py:198 +#: vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "" -#: vpn/models/crypto.py:239 +#: vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "" From fea8efa1493fe841becad1d4460f9e54248279c6 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 23 Jan 2024 12:48:15 -0500 Subject: [PATCH 271/271] Closes #14611, #14808: Add Japanese & Turkish translations --- README.md | 2 +- netbox/netbox/settings.py | 2 + netbox/translations/ja/LC_MESSAGES/django.mo | Bin 0 -> 218814 bytes netbox/translations/ja/LC_MESSAGES/django.po | 13344 ++++++++++++++++ netbox/translations/tr/LC_MESSAGES/django.mo | Bin 0 -> 192217 bytes netbox/translations/tr/LC_MESSAGES/django.po | 13543 +++++++++++++++++ 6 files changed, 26890 insertions(+), 1 deletion(-) create mode 100644 netbox/translations/ja/LC_MESSAGES/django.mo create mode 100644 netbox/translations/ja/LC_MESSAGES/django.po create mode 100644 netbox/translations/tr/LC_MESSAGES/django.mo create mode 100644 netbox/translations/tr/LC_MESSAGES/django.po diff --git a/README.md b/README.md index 14881dd13..f166919c4 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ License Contributors GitHub stars - Languages supported + Languages supported CI status

    diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 17c693553..fa8606707 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -726,8 +726,10 @@ LANGUAGES = ( ('en', _('English')), ('es', _('Spanish')), ('fr', _('French')), + ('ja', _('Japanese')), ('pt', _('Portuguese')), ('ru', _('Russian')), + ('tr', _('Turkish')), ) LOCALE_PATHS = ( diff --git a/netbox/translations/ja/LC_MESSAGES/django.mo b/netbox/translations/ja/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..c35a1dc5e3612f3886cc2194bbb892c03a89abba GIT binary patch literal 218814 zcmYh^2iVtR`}pzieczReXp^F}m!>q7N_!8L22DjJS|}w%MTv%JC@C_sGeRgNn`DMc z;t`RCB;o&l-`Dv&j(^ADcs=Je&ue@>-|v0rd7d3b^DN5n=l+73Oc|`$JCmt>awb#r zQA;zKpLS<5Rd6rTBva)3Or|N8!A{r@hv0)a98cJj$>hf|SQ)RulW;knfR7@>XP$}j zO<0onLp%|Gz`}R{S7Y`Mnap*#2FK!AKV~x3Z~^AS4cHFfz=n9@|1z0g*a|Pi#W)7{ zVO#9~Qzmmc-jA)Y;NE0ctVg^c+>CvRk75Jt@pC5A9%o@Y{5ay%eo1)@!H$$)j&*Py z*2O(x$$e>@_Te>+Mmf3 z!eZ#WXQ6r2Li24H_091V;x6GOXuC1!IM<-#Tp!NC6N#6g<2;D&@8f9uo#?uMMEm`W zwm*u+FwgIqOi?@yEw2$a#FL3zq3i95uIJK-uSfUkPCNydhL7S|#4n-aeG}zBq2nDz z*MGu+6cMud}>&mE~9_4e<=X3?SuIJEvUXOSy79rk&?#J&@ejGiI z0*5l0Qg|vF*G1bk$70wC&1(>v&sFGso`gklS~wpY6F-3G;ts5hB@U;!4b~){ir$k) z&^(_;$KQzV$H(ZnU!(K%#1=Rlea_aP`}77bz>jbx4*fHeDULZu(>SMvHE}uR zEwCre$K>kxDb0_-s9;#dJ+1$u@d`Z_CM)fToR5(_iJ)^bCl0T$6XfX52O3= z47#2z=sABJ?h1boGykUcg~LkdcumlI(k|jY=sg{Vp3^w=9A-rQeDrx*fhFluP2a3b1&cGRzk z@)yu{A4I$hZFdBHUl+{I%H8)O=zTd8&9?&jxmO!6!trPx@1pzjDZ2h2(S19Nj#nTj zEB782M&~^ZJ)as;-W015w+^pF@9|=^|GhW}SEKhRCr?)Hb8-@zUr}`4Q_=cLXkN9j z2{uCWnSi#x6&-gj+V8H2SA~yYbIP9ze@E|OoxEwC&Cql27V!x5xt)aW`!saF?n1|3 ziRSY}l&?p}do$b`?g)QD`yEBc&6h8YcM?`7J}qp8uH(w^YII+xqR;(Y^u8?$SEBo~ z7VY;eHp7>(2L6TTVWktYGH2irtc*9H_j3)F$M?~DupcX8z5MAuT!bBopTydD3>#qe z0$G`UI2h~WOX&B(->?c+E|~0!K6lq(J$xL^cNe;!d(nOS1I<7C#I(Kw=yO&aJ?Dye zJ~l@8VG_FkH)8Jd5alb-d%FhR@AY^pzJ;=;)+t#TKR-`G^R9(;@La5km!bQ5SJW><`>#gV^#r<(*U|hwLig|6 zsNavyn^QQR&#)-E-qXVJ=sId*TWpQ))10WEkLI@woo_Wd-&5#5y&B~oMEUmcC-nVt z1ic3Zilp{uqT`&6=Gz2aPiJ)8!D!xBqVryh=5qtO{uxm|FUl9A_hJS1#1GNW$+L>4 z{!`KMZb6^Nx#&5rK=XeTz2`5Y`Tic|ImOaG6%EUv_oFg8&bes5?V`Rny3Rr9xD&&h z(f8Mah(AHs@g3I1eG#8oJe_wnw0|9RzUE;!blyP`kB#_7^gTB};)kMsJ(|zkXrAAq zp!t>F7Dm4evwu_i6N8UqR1%E1JiS zDBp+9mnoU*OQ7}T(SCK%`qt=p{m?vyqvMT1_vbqF+-9TwmWNNH>)niw`)Rm4%6~`4 z`7b=_)YPsNT3#jMbHWS4?&y32(fr1t?Po^)LUcdwNAp>S-oGvAd+cL$9}AwA)>9nq zUk1&yTEq<_ZXIz?^nEZ09e)J++)hHDk9kplH=5USblhjqb9xQkzjq`41fB0&%)J+A zp2yJqa!RH8LTG(ybiC?O-Z0`e=>6-7Rq%2&&v|ISd(eJs(7e{6^S+Iq>*rCw8~vQv zk7r`7)6+V;pzQ~t-xtQ9d5({GO2jvYx1sYcK=qdDCtW4Y)8{vc~e++%j)}#079W0ICpz|F? z$NdM*w?LU>acoOm7SF*E*c6wc-ygn2&!glS>AY*A`J973FRh~dLUjHC=>A?2@pV|1 zcn&(wTJ)Z6Lf7#XdjB$Krv63Ib`{WejnRAG1O0p(9`P)!L%a-K@B3IAccR~yPbr&~ z`}?M{15^uB+N4RA-)7e6bVQv-Bg zo1^>F5xp<{(0v&c^<&XydgSHYixntqJAE_fA^yM{eG11!ivQEumTpTkj86(j^7g9|DI7kJj%zR z<4lkGyU}xb1kL+(^f~?%UGH}|6!)X|zGua>-xp(R;!DxIA3^WMv*`K1ALaj``kZgDr>`qCdBMincrT?5xa0Y>R#HWptjRwbDA;q3a%q&UY!g?^mFCOhE7V zt?2z;66KGfd2hlp_yzj&)M0c#i`Guh#~J8&)zEqBMESYsb8ta80Nsy?XdcthelyW~ zHy3>$-HYb)Sj4ZOd47PN!|sTGNBiZillm1$`&C5SH9+fIVNL9b=6wUYuG#4OVr7&+ zhR**&)NeuW!MA9;!{|NC)J^v;FIs*wx{lM)b)ALoL$xTcjo#C9!{%Z8um?JBf3)8q zbll+)k3-jUEmp@F=sKQ4pPQG_{=cE?J%skpu9xDI(eP&t&xZyaC(d?P&hn z(EIZ>`u-|hKi!M+=)4WEJhq7PVd%ZM2Hl6d(0rGn^E`s)^Ca5;<%r*k_>+jgMf>eV z^Y{~8*MDfgJm;kQa|)IsE`^?BeRO|2py$^!9Ez@cJo}J!6YfRxIuiB&g$2(|>nMTlS6OuY%IJRAK<96U zj@Kc|`$YNWX#0ui_>-f4I(q-_3LixG=lQ6AA6@4TbX|X<_vM6!>GP{3dXCl6`u6Dk z?~CSjRg~X^<~<*Mo)@F*UxhxWkE8j$j<(x^=J6qVzI)K|4x;PJ(b) zP9Joh0TB!9D0Xzl+)UA-bNeSO@o`@3C@?Qy$IG`8%Qc_lfHA&}I3|&_lw7xPrZe6rpOSFGi z^ql*n?T4Z39TVj%(S3RZJ`o3Bht?!PGcL{oqSE2he z9{s$%9=#{)u>tNxzju^qmhM9je1Nzw_QikDar>N~p6_Ak_#@HJ(JAOXdNs;7qx=3v zlz)$|_h)o{f1%?QXrA&fiSAR4h#RBryQ1wcLGSYzwB59*za2f-W$645pzB;4J|E?q z(DQv89p?k|J+%YPV^4S>>i-Q-X_3}h4((Sj;#TNA>W#H=5cu!Zik-x>uCSI*bvWbm6fTAebDctH(*y>jn01%dttuTS(#xt0A2TM=yS9m-H-BZ zQl2%@b)S#9`J?L{f}ZC!;Y_sO-RQopMA!Ft#Lq|l8|e4n4qx;pOUHV)eitghKyc(Bb@hr}zeR@Au?vVDoI+}mI zh?}D8ZjG+@LiD~~j<&l7&Fe<=KFmS$xfdJY{pdMQ|xr_Bfi)OK7|I(C^LPMqIpedVf_$^KXnk zZ>`aMI-%#$4b67|`o0^9&Nnscr=#ufK+kzWxD3tX0W|-o!nA+l2Ptfu7S| zH1EIAb>(zTzi&ASJ_TA9=E1X&ZKr^8V;P4@B?XF!a7mjCdCM9$bvo@f~!%htc)_7oO5H z8oApO5C(6WzB-Xg)L1_0C4eosX_>1G+Dp!%xxme;@Jhm^&{z{wWtGE1>U* zhUh+YLC5bG@nCfRE5hs0{kRof&jNJZL-IG%=_c=rJ zIWx+uM|nMTosH3Z(+X|ZA?%IjKLkC8tI&LxqWL}@_1~h;%P;6Sc`r)$=0vPXTo|ii zGqnCPbYI7y`AtISy#aIIw^4sDy6+D~{R?P5Z-iT;d?&hJzo6qDjq;qn>F+U5LB}77 zj(;_JKW3uiEk&QJhtYAKLihI-bU!}|ccA`G%zR6$>k(^EN=g=M6%~nS!-(7P^lwp!5BN zj`L^4d4{HYSPVV)(h*lg^R0=VfBmo-y8d?PI6b3$5c)lEBzDF*=)7NIV=OQ%olh(D z?~6vD=kOr9ACIE*tVhr9b@aTpq4(oQbo_jmX61g~S4H#afUU4sxEL!Fe}m?qGd$g! zg6R6nqIp+E>l>iYLDPsYK=-c$nn&-5M}*_ie5Qpf&^%s^`gg+5(D%`I=sbJTcE6*~ z;os*hE<)S?h~D?#(0&KQzr#FNrSd{y$*?SXzpJ8o)Q<9V(DQB<<(H!C9*OSfEHsZL z==`hE{aK6d=hJ8&8_;{Z8ND}OV_p0Sd*JC~(>Pb4`*#hR&n$GjJJ9*=LdRW$p3~Fl zc(0)Q^KO)X8RdJ>_6MT;I66-LajDI3t8h+d=|RSv(e}L95kQy=y-i19**wg1oZb`Q?V+3hPL|` z{XSJ_LOO>wX!|Y^_rbQr1JV6@5Y7LYh~JEOEBc&%kM=)`o@>^`WC66i2zu_PqwA`O z?pvLxZy9z(*K;AdPeaglK_p0jGr1hMQKCkDZ-*>v8&(YYZpNQUv>(S@qR&@NiQGaig zKZx$jqv*aoi{`U2+=A}IhiJPU=(s!9PGgSI;#&9^JMZ@tic8Gw#=88*kOu@OFp z-p}9A{EpzOSYS#z_qWmhg{P+aGUzWN>AhD6y=Pr9 zH!rmPWoWxA(dT0tI{vIEUxeQK2hsIDkKW&nSPefz$N3MvSNWzTOQ4_c714DzN1vN^ z==t0ahV&!GT1?rC8)v|ST)-sWij zozVRIM)?S=PCPzbj_$|X=>C3!j=LM}cL*zC*7UUADrjEyB5oA6LZ9!hn0xP{{7URZ z`DAo|Hb?yj=sG?{=lMQ7fIct(p?MX(IgM8ay$=kNpXF~!_wgLOfVdaB-h0A_(Rp9Q+W1DqhtToH!*LTqS@flXegXp=JnwiEq6YW7`ljgqwMWPAhvqd5eLsyw@8JwIpE*%K4{g6Z${#}4@fe!dv*`FQ zqw{V-$N2)C|68>Ee)Q*-Kd}YYy*2%P&Ukb`K1ciQL-RTq@qg&~=DjV|pN!TQN9R8a z9lt8tt`0g*WAxmbM}3!wd!y$+4E_0GJi0GWMg1o9o_>V&@IUnXLcQ5(ogL8q>WzLs z9)-?-E1J(dbo_g80IrGh>^Z4j0dzl$p!1eS`_)9>ll9U4Z-+jAov{v%i1K^T{`aE& z)}Zr09`SSN=j{e`A2y=nzJ=z!J?i(P_vjEh&cEos=Dj_gTTwKwh_0t@#4XV0u?w2# z;BYv)|D(`-pMb6LCN$r-&^$jz=lc@9H#^bxzo7H|h2EQdb5q`@q4hP<`X*?7yQuFM z^<%ISQ6aD>D;rZ$NeodT1+#8qTcj)Kk)CH;j z1$6vf==YIy|o$*t=3eQ@W{(BMg@lxVFI0-x4o4zl; zj_!NG3y^TeLrkN-$TD5 zA6=OfA57oV=dVehXK&+`)bGa&aNtAfeD6o+`3hZE&ckUPZLllx3>=A{qWAjzN76m- zh(6EV!hYy`W*GWD8Hqlh6VcCunNfZ>+U|bz{q#_juSK7$=fgMfWa5v}_B+vWen6k! zKd>AYd^G*urbajfYfyeq_(r%NeLhRCP4As@=z6N4?}7U0{4FEyimvZs^gTBMeSc0y z=bwwVUxlvo$*A9iz7IY_=ld4Tdv|ycTM%bImfjz&!p`V(+#Ahn7P^lMBVG~lqv*ap zho1L~5r2Uf5`T@}``VAEzhAizJ>L&-JpPG}JL-wF4_Bl4O-0vnJJ!b)X#Ss|pL<_~ zzoGXn@002Cx-7aM4bXGyh~=<5`h98~`X0RleXrez{yh3J`u^OG?*I4bejdQw&mnXl z^FEa?u4}=egkD>eY6q@&o=sMm&^L`uM=WXcxd+;>;8EawAbLqV5q4%mIR>n)Q z9L_=S(PI(6gMME9jNXTW&!^9mBIvxW(e-qQxCgqfK4^X;(0v(;<}m|pzXH7nYtZ)V z&~|TNCHxYrAl-2&~`7v0a{==)*<+J7c`j?2(-A42!zg^1rq+kJ^u@mF;G zlIv4`XQTJIEjsQ%G>>uNy?8G17Igf7(eX}xF^y9J>kv1=vvD+f|CdDl!|3{73%8(o ze1x_;iq3n&OR4;H^d7WA=V^zY$Hi#7spxy@PITPI(eDS(MSK|R5g$kIP3@P{IW`KL zqx;nsufd-9F1~|b;9VQi=hqdlr0*q9qW5SgdcRJ7HT5r!#^um+sf^Bd4tieA(0n_h z_xzHG$D!?S2^XOIuo6ADC!>60_#yiHns2ZH{)xWl&VDV8(*e!nqKGdEN2B+5GP<8P zqU*Q?tKmBIJ^3wGz~gB9avRfgRRxXfq5IVsT~8Zy-}|EXeK7hQjzZ_TI_f8*>$(Z; zKM&oXd(rhji1uF>zJj*jf<8B&qwk&l=)8G1rF}dNeZSO1_v`$KyM;s0dpZG~=Vo-? z`RII0(RDo#`w#{EEDu#;u5sQv;p95#~N$ zX#aue{*8=y9C|;dqW66s+W$ec|1)U*8_|C6MEO>9zjmVSe~a?J(e?%2Nb4wy_B#zN zFNfw^4P94LG_SVkzVtxH?ThZ?W#P5xKFx}Fal{X!lY`#K5D_ZD>A+tK~G4;^P6n%^dLzK^5)TXcQDp#2Y{`5s5x722H6 z;dJzV)kDYYgwER!Z8sd=5zj^ETZ)de3SHOZ=>ENc z&hu9I0ebI0Mf+_>_h&cS|95o$ztQKs@RpQEakRV~dfpAtaXO>@dZPJWg1*N_qWgaf zI?rCzJ>PtDB`ctardD4|BSBZuQ2EBIA?U;)6spagyz>69j`08U;WYX zE<@)VgZ8@y-ItrtbGtRl=Z1^X{;Sb^pF-aQo1%OhI?paNzkT76D9^l;>Q6%N_i1RJ zHPHE+qxp11*Lh*o4@K8;4f;NrgYM&MbpJM>^SvK_j^?>5{1wgX80J2Y@1}W*qvv@B z=H5GW-BrYI@)e-lrKfce*n#69op`-h~JI)^YAlpJUU|{O(5QTaC7R8XbQV+W(VqJ9Hr>um#rqJbk|%6VAp8 zls|-3@IAZ?58+T8@J0H0_0{kIdLJr&nSS3?8|{BFj>^hpZp7-uzkHR}S8{v${c<&& zL;2M>6SKa~%FM=F(R)zroAmckXQ2B&04<+@eh&y(=PP)CI|2cp7?G0 zJ#qGq^!wh2up8wicc#2Y;5g!O*bl$QdDv`MR_^~!--mb~@#yceGE?xx-C3E1I1An9 z(%)xg2IClPiXVn2?n&dc#}1T#g~PDI59#-jv#>q!pXmOz_%SOp89QNr+>D*D-2c-5 ze%BS@n>d2%07%_GuP+j~1i*`Vi*cW6UAm zgx=H5=<~M~-QPXvz5FB0`6b0g!m?=pv#}J`#j4l|xel3$=zHNBbiT<^ejEB6%t7Z{ zjDBBS8|81J?YBn#cj)~*j6UyW_NDrI;RR@UPdp1RN5`9uzPDGS_vSft-0#un^AP&` zieqRVC4Wu-{zx_S_YYms_G8d{c|DfHMd&=wqxbzww0+KRsa<(=+$LywAFP8{qj|20 z@(pO7Uq^fx9kDlJakc zJ_lXU`_&&W#qnsrFVK8`M)x`2pDC`2{@$@QUWJ!pMf?=)_ZM!#la6L(KCm3Ur>p+T z%9O(o(D*mpgQbpTWv<14@n*c{@09;BG{3ClDc_Uv65=!QVw{R2@hiLtTm6&XW6Q7? z@&C|$X!>tf=3(p6ecOkQoBdzfk5ka{Qg|KK#zFWfcEf_aMSO4f$E)#ubYCvWN)ANV zeO)*=%2$RP(Ea-|JchO}lbxM=Zne?+t`Uz#&-G69xqShh?J&&bP{~CHfzCy=48gaEeDQ=I>KN-E>%h1n@ccQ*%-t63cZ-w^1A8q#uI$tJV zcJA-NtD@zD(0u2HkD&8!M(5dsj+5_%v=0r#j_7lC33kOXxD+=;`9=BDxR;^lbu)Ut zOVEBRF+VW@cxi2|uz`LH(Ht|>ZxXLP&^(dXw1^gVP9dhcf7 zc>ETfuY19?u1mtP==t1?e$K6k@<-8gdIjB=-RSsvPR!2z_hL>)Kj%B6dEAE9&qL>1 z8s&vfO7j*+pZ~Ma{jY@HvzB2m97cQ@dT-uC$Nd2vcOTmR2)d2}g_0%FdtU)3;S%)w zbkUPj{#CFVap#DyLHjR5&;8+uw}hXD-=XLD8#-^EQhun=;!op*b|qb=lUDE?zTm;bN~H<4cLMBI9lJf zXm-Z$Lo0ABeusWf>sc&2vjiW&Tk!ni*}30~-azZmERmhL5yztO0W|+sC9`wCM=wCj z_lD=4nw|UoY%aR~uh9MZ5k0r#=sD&)E!7u7@9XJkyZY$4cZm3LbeuOL{y5?v(SC=} zeLSgDx<_SkF!6cld-Yy)+ym%7oN#)Ye-JwE2=x2p1a$vjL&yCN&G#7EKTqj&KTb!> z8>8)8q3wr<)1v+!^xoZ%p8NCYd*oO2d-9oOvNLz%Gw3;WI3wNHh3NPvotfq>8P-JK zR~Ml5W3dfhhs|*#y04kC>3whlx-X}q@4f0#-ZLDE<~JU__p{LcYtZo@4_`prZ9>QU z9BscBJ*WKT(mq~+)=!T3b}T}?1bx2OhFj46`aV1!R&@KOe2{h3@Ydbi6s?<7m5&F!%i% z@xCy-YRcm@beyVayO!ws+oSu^JIXId$Ga+=5#`GwUWJacKHQ4t^K*DowNzg#Y=_nl z4yU8@KM<}(KmVRV_iGb6|5kLK|DpM1s;9VESQ9<}HfZ}HX#Z=`_OqgVX~a*3Z=mCT z9`*at&(pj$(!DN+?n@_h+`j1fUWwl8ndp6e0{i27w0*If>3J%Lj$beA6kZx$kLGsZ|FY#9rf8~r#vcRA@0rQy=i6d*KR!aw?T08o zp+TH0+P^>6#OY|iC((XCqVN6V5mz}keXnnZu74)_dA9`Zw-e`L$%d)_1L)`DOV}NM z!hzVhQFiXniHp(i+y9{RJb)g<++ zfR0}$Y>c+Q0Db>-Mn4Y+p!1K3@|(j2=sNEYpGEg^3;Ml#FWT?q^O6`_Q?GgWue$UBin#Svfp6f)k{1)_c@ndwJ!p+jXtc=dz5-lGQ{x-TE0@3|f5J~wWj&anlKAiffv_cJu#Un2e+ZC|8C+W*tg zJS(B?I%4j9i~8y4{@;nY`;3nNEc!kz-7-7(|JUgpY)rfgt^X#3pb(f$KTO&tJp2s1iioA(e(^M*F6H=j|t(-C|?q;LGQ^r^!a%ky{A8i zMZ2ecYJ$$&54}Hg(e`V?x3R4K&~+5-k?vjPum$>_?~mU5iY>$(cvhw13L7l-#@4)GdvzaK^0y@ZAFW3>NwQGOU5x8Q}T{i$eu zm57_5_oXBHUK)w+!z1YD;_K-CpV}*ZE>=d{pO4Oa3A+9XX#eNY_D9hD%G*2rUg9h? z-@C8}K7g+K2-+@xpEPep^u5pw-KT4@87@NmZ$tC@9^IGY5$9Z#@+lM63)_bS!-?pA z%trg)gO0l*d;)#Hy^7}bJ-W{SqP|4m?A*UEsf6C+I_Nn4a4`E;`P6VOR9?WJtu*(EB_ey$=tgpYL1H^En#jMJ`VJ zSqJ?-(HqVGcFgS;@fLJ_-=q8a7Z$|KCCL-faZ954)eak@&vh$wKSrbNrbK)fI^P56 z_rHx1e~pgwC%O+=15;cQI}(>e_kT3D$Lr9%-oR{p7k$5dfZpe$5qBJvo|CK5=W%Yh z0^QFi(Q|nn{XYCr)PElyM)x7_;Pjp;jrMDR?st2%{~)yg73jKe4CkT!SBB3=`TOWP zzlrz&I&RjG)V_FF9ewUwpr4D2(EGCjZNEBv9^L16!rkHDVez4<{n=p)^n3M%=y{Ar z`_Dq}l*Z4--h*Y88*TX(f7#-m!|rb===Oa z^c*Lk_uv}zbMQtqk3H!3jeNt?_xT~{d@pJi&oMqkd|*VHf5~O(zC4Dm>t&pRpQ87s z`{k+KMd~V(#;X=9L+h;zH=W#l!08d$9%jybTZMM)`9QZ%60N9-Tf9N}%KSM%Q;S zI_@O&-0wj5`!V$S{1BaIZ^S2Gk=9)e{rlwhX#XeBb-#(ehrdPV$u}mQcOmq9VLP<^ z7A%i*uqHl%4e)FH5Q|)y%6DNq;zCy?dt*c5F>SHM&mi*T6FyP&~d*GccY&Jd(r3h7&_mn)6(~V#%RAbXusa!#Zf*ioDkj| z^$R0jik{!25x)>_iSjSdecXeN{~NZ(Kcc?L4XM6e*aO}F0qD708SyPqe-HY3cz?t{ zhlkPo{x7zK#x;;8ye{{UDQGXly{rGNlpH@ZrGibZl zqWsG!|0&`>(B~}g?9{&`y1w#g-nFqW_DA1e>(KrC3YTJ;IcdHZ(9h8=SOIsS`<8us zn*U66yoTs|d}x&4gwD4#d1=+d(KFD`ClKA|Ess3T~{q-k$A6nd%{ymN*cm?r^ zi_+)DB=q~>PW1iK>h83U1JL}3qx&!=;=3Y#G<*X+&u=3BA9}Ac_oVODr=p+#<Ywu{s6ONOHHd~{zQN6+VzC_jMSheAuzeK{3vcP6^;ts=fK z;z{T_Z$;O&61`_HVt(9+j`t3FUfa<8cA?{DFHP&Ig4Kw-q4#w%=HAn&--Fjse$uk+ z-2Xjx_qmx-{s!89chnbJp7J;y&9^x^Zu=-7fUfIC zbRA2gel@y}&qw(u=>B|zjFV}u4ff`&d)@=1% z#f$K~N7B7rh~DQ{(evAfy|Ct^*}4D!2REVPHeZ{@?S|%aDSAFPV>!GJUB^bOjJwg_ zhZJ}$?biVGo?MOt@h!XzD?Of`|GDUTkD}*PMfvOKd-#2H z|M#Km&3-tQZrw5W_h;xi-H0P_E84En3u)Z;=r{wz%hCMCNBs@q zqHt}v37z+g@aOO!bo|2WljYF->x6C5eix(n;wrTLE#X~g`v=hde+kWJH`;H1nEhgk zON3R!^U!g-Voe-|_MeB2yBr;N9r|AV8ohU!m(n?xMcXyPx!4uk;y38`)Cw=B?^hkr zyceM7w<_XCa1QZ{XdZ1gq~CM)N8^bR--gb+8r}cb(e=F_?nK8u82*Lc!^|sbJ*Ck3 zE2I6+ML(xIpzoC-;mzTL=(@I`>;5*(el@kPf|c!$){n(%xF~!Loo6qa$8j{j60fEE zRt859H$wOOK70osL!XmtHl}-f9lHOwqIo`rj`ImR?pNqM2ho0cH>G=A0R6l<1KqD$ z==c3bX!~~P&sF`y5m7!qoDnWY_iZgM$CsnL-|Oi-uD~ZKpM&PpWL-S;i%ynE4kkD&K6-1?ak8K|lAlq3^Lg z@1^o`==|rR>uigTI~-l-cyzuQ=;!{5D1RSqzZ2Wwzvwx&en0i=8V*6f&rd|heFE+G za@21}_wQHq`@~_q0nhm$eXn~Ky%#^B?J9kk#;J+U*Er%xjgDOqWixM{ob$_%{$M> zY2K63`qF59UG#i9NBQMZJ}t_Zpr1d_VNHAo&Ho5GZqC+pFAHHQ;v!fOYlP>b-#1&L z^L0e$8y?<-=Cd5zAfqj?=i$1AWcSr)xV4bXcx zEXpU~aN^sdd_Q^)|DorQ@6$A1iLgBSeXBM)PD}JWdZ5qSrRcq!9KMF;m-n;udD8~% zHyYiKDd_jjThRP>qwW7j-wWq`p4#7y?%Nu4zD?+Pe;V~QzessDMf2!@u76;ZPekXv z3EjW>;Zxy9;cw{v75Xx*|8#Ues-gYspzCjeo?lONo+~511^ql&iPi9J^qdZ&@AKp6 zI`e;(#ybn`Ul*-!ht^*h^;bmw)Tmz&@rtN_HsUwYe%sM;4n_PQdXA@UPxV#M`W9hl zbiIAiJcfr;!ujaFKZHKtuSfa+(Dna=o=2&#)8|G_w7eC%?m^*5bo>cuKDVLsE)E|= z^Lhq7zgN+5wnhDZbe`krIh^uMdY_lY-o#hoWZaB(vH7=Y{Bc;Gcv{5wqvJdg@g{Vh z57Be}IqDCDd3L0GdMetl9NMlvntzk99gZgMg|^!mZbP51AEUnW&UF9Qqy4`?_jM1} zzyiBc{|4wf+oSpQ#rtt0I)BOUl4qd%S`oc>P0(?NqTipcig*@!Kkh<5_a8^cIe_MS z6zzB7?sRUap>cV%UG0d^MccOu`=HP9NHmY}Xun${UW9%=uSMto0Db;`M4zL)->1A! zMaOB5_HU2ggWl-+N8uGXGs+L4`;&i9YJVC!UL~}BL(F}S(4RxEK=)^Mls^-`7xjCh zKKqB%uR3<6eJk|+v;fWPcXU7gLFdo&V|qS{hqcjr-w|!!E8-#HXtdweXnr%$@m56r zgXr_|B)XrkV*M=Mb6ATw|4-@X^@jL9@om@%`|M3W7p=k(#D~!F`~RHY`x9^#@%^|L zTmO=Ne^6^*`nHenr10RX>nE?|Ne|;uZKD9>Uf5$iejAv*~gu_5Tq4d?w>;dA=Mta#M|$qNqMxVZ(0lO`I`8M`z05k2)?Wc{B)$m!oct0;VZJ}pb2knr z5*Is~+TDsz6Bqa^{eI+Syo$KOv9$jS(f7eId>BXkot^vNk38jgc4iUrEF6eu{FC-| zDh?q25Qky)f79P{+<~)*tNoXqS%**KwK$w_!MpKWbYC}S<>am}Uv^IB4dU|n7XFA$ z@bR3S+;ja2j}o`alau@RUrqDo%{6$rQH?PA$;;H57d=W}(m5a`bt76dmW;DBpsP|0&x3>nJ~fw);2Ai=3SDu7ckCA?Wvt z4d{I=eoAsAx(~0S;}$BM<}Z%Ecg{lRsgFK)9m1jL^F9TgcMiIa73h6@18u((eNP=l z-%}-vr18&3*VhT{-y7|BIeI^D!4q+R_&0VSKA~uuw+EWn5VZfb5zodP;+5!o<$;K| z;g!T+;Ir7aSh`<-qt8*x;yIbeaW?wBpizmG=Y?37crd!28`1Vl(EZwt=Dinv|K}~4 z@~VjLM-w!kL1_D7==)<7*2Krrec6tcG5geXZq?9xFbqA1vFLtH$NYGE)GtEUzbbqV zD-gep=DQEwr@W`7c}t`5KyO4P4J_v1x0|98R<(0$$-ejVjMp!Z=f+VA&>Gi7sf|NWj5a5&`+(Vw%Iqwntz z(dYO$w#8oMa&rH@)MeO$_$#b|r=OL^Z;L+fUC_K%q5HK4&1*e6|Lf>I`UG9q59quF z%cuJD(4P}Kq5Coj%i$FCKHrNz7dz4ZRVyUBpyQ4YXQ01_SsXrz=J6Jq*T>;*be_Xl z4hvUI@A10m^KvCR&)wn6=)K#8UGP8bhg~YAeS8QVzfk3Lj%Cq%cn;?751RifG@oD4 z=j0FcoKCEgEQ)>}ltRA`T!^J`Ec$sh8{OxR(fmI}^ZXqhuSC_9XAN}Rj@SWvp!>88 zd*TxjXH`q>ilgs?(qUCxLfioBW%2hoI2*HT5)#_ZZTx!-e!q5W5* z>)L>>|DEs~bbt1TN6^plf6(tiP3k1a;aS8Fqn{V=qT_syu4gYg&tFkqv~HTO5;}f8 z^t>BK+$!vd?n@7Jys_wbH>2xZi1vRn>YtDJ9dy2r(RJ+&kD&c?>ZN;73~g5}ya1hV zK-6D{&NC04|FQ5jblgwS^V^BuukWKifBm$c(rCL%=)J3lj?+FIfcCpGT!^+`AN8Bj z`M(SgqvI4lC#}0OI^Nl6zZPK^be;XfQRqHhhwk%D=(uyjhtP4~2){!6??>17A3ABJPUbhXLsRUXPA{clcP8zaD;#&UZNCJm==*evdvQY>$pJA>!N7 z@98gue@1!3hAEGs;Yf7ev1tF95#JX+hwk5d;SO|v4xsD(8||0BQQEJw(C_!n!poz4 zAv({K;pXt`@BljQ35`>`B4HJD-ObQEx`cz#_7l+ics;tm_oD4rqwn8!QT{cW@9v2A zheyzH|3U9r;U>ujXnB7$?=j)c;gax4bllD8yq}=&@7?IW9FF=z=cRE@$AXmCLGwKi z?RNpXo}TEvyEx)WXdctibuL23eKzVpK=b<|{1yG)p3^k-D~;w?3*C?N(9h>#==}51 z{)@vW(0tyE_)~QLpCkSU&97Lq)UP%=ZkupSlrKWttwrbGf{y!XxF^aFhgs*ReK{G; zs}wqKIkbO$blok`ar&YAH8RR4pzF9D{a(BZ-G^7u`}kRyX`aTZfzHz!-Pca&I!1*H zqWq=stMDi~|EVp~d{xjqn}yxce21a!#-e%Oh~~Q_>Q_hn6uM6@g`cB&9Sr|M^UJhM z%*<+zW*HNYn|?2c{Iei_<-96H}zG>_%z z`kzPpy@8JRIof^~`aSG8+OA}q)V~7yc~Ku-e|I$RUg3anXgCrbe=Iuh&EdUhKF^`! zZH{<1`hDpjI&QwUY5xj^6~e}0H*~*;hjXL+IdtCl!X4;*2hh*6taix?Xn7m7eedvc z^gO48^U-_qP`ClzudQhRuhD#eiTEHoUUvI5Pl>Q0`u^@0PD9(RM#p;|op&QT?&sl; zXuBg}fexvC8MIwxwBNbt`Z|YKM*TcAzm*X`gr4&Y;Wl*q{b;-Fj>!UHVYL2K^c<^) zt(TMHqWknEI^N-^&+3xepN^K-4_l!9x`e&Zbqe(;?3wf zKSA@`9sZ5>FWxm-1x-3e6xwbcI_`4x-aQ`WA7LKiZ_x3-L-Rcx z9!2-#IQl%C)-Bl#Z9g=;8Xf=Ea50+C!%_ca_sPf@@RQ0 zG>?nWeVGv69zKZX^D177TX71W+ao741fM~FA6UF+`nmTiyq5S)9EnXYaV?Fz6)5!_=b6X-)mbsU6VMh}eXWT6QX~aK;_=mr$ z^}l|Sxt4L)L~eGQL!b94AH_WV7~el7V$O#2^UuLV=1%%Gjl)&ZWF z#~3Z~3vwAx`w#hNZ_LU6Wk9ANb5^6zVETW~KTBy>hrWksGnKZ3iT%@xb{oj8K5bjl zuP9?KC$}xMnM-^UeQu&pA^zz=pEk7nhJH&a_fPW}r!)OVQFa;Qt&KA4D>KG4;)#^^ zBz~W9ck<6AvHl&@b)xQU`rpWZ{+fCI?@wvsp41hlZs7k{K7s}>ME@$}vyS>=IEA_R zpKZ)^dl!$Ebfb{m0Az#`WD+miGVm z=P>QBk9bk!u$Qt`{O2>smH&Cj%%%Kuhz?bm<0{JetCmb*^1p%dVzG_}l;1|b|3}a0hR`SNuuClwbt+*~TGcz+Y zGcz+Y!&|2R=X=hXd+*9}pzr&8{#Vb{%$zxM2JXN)XU@!in*6Ryx~l{KIR5l-t)@K} zh5K}HKLyUspqY_&6q;-qRn8#o@2TV2z<&q)&iJ27%JZXsuLkEE!1de|+>?O68CqQ1 zTe&CseGvHTao+*n7;rro@gCy6eS{C;ei8i5;5-1_+tMz2E(LZk^7~BCe-iF*DdUB} zpF>`H9uVcY8t^lTzeC`@6q*|y#pazC0e@l8eGmTE@!p;Hae*UeJ!!@%!!LmAS-{;L z`Am|}+j%b{{y@Nlv!AkTf$lxX|H%P=E@eIoJWQY}E2EC*;J;P)*$S%+LF;1NpWyD| z#Z02YPhZ&c0{nVTfX+XmEB)2GqwK#XJPiK+2wxMo173ReQsxImxJ_HW2KCEc9>^x^+1Za?l#C_7um`7;9SLxd2wE03Yx|DsH*h(8X$ z^dNek1I`bi^$`4@C9VVROMzVquAWQ5{R!bGK%47gD;EX)Hk9|1q&ou`<{Xt<@Lrwp zL0&xB?;@?9GjOjS?TyOB?nZqnxZm+;`>*q(dUlZR2H{_b zc6klqM*#mSX`c}^-vGV$^G*}@pUCrB(0m->oxCk*{eaijP116;x2^|}$!F!0(7hM# zkAnUuh)>TR@OB4Wu)h$ui#*T7eGvJaOFBItA+MFZHvs-T@P9$s+NAvuub!(=wx_w* z{=buS(mkYSd*t~l(w;!ur{`_q`7H4lN1L4o?X$r9EcuV}PUC+dub%a|W90c}4_4k1 z@Nbac9e}?KINQLL?~v|ExbFw{SLi*FJbw>N&)?js+?n|P$Wx#dl;Kg-@!P!5<<;{k z-a&BYqWsJ8e}Hu9xhwQfh4yKI|3}*HRB-PM!aZ>R419ohFL=Kv?KtKAdPi+2xY?WbKj!1UY|n6i2X=`V=(68zPX|8)aTu+xZt zW|TwWzQ8$!c6%mo9olzq`fM1 zA5Z)Zsn^{~Zx8M}BJKB~`zO*}2z&^< ze^AbKxDDcO4$U9%J{6qr;r=-2TmxJ^XGL3k$p6nl>&%Ex@H*kUm&*Dk^5}`k*HFgm zMccfWJj%~IfL|4QmyrGx>Z9jB;9n!^bsYF#k23r#U{8qe^EdMQ0{&}(^9^Y96W_~Q zhsFyczZJlzpuG&(vrBFJ1;SqsdUz{;fEKF9$_Jr!d)ywUw*C$OwYff?jBExK>Syr`EqFQ#C;8Q8Ks4zz4wuR z7W(&$_Pqyb?E$Vm=SK&f9RZfJG0Oa4(tI}P$_{9j_XdPNOgcTU$GsitA3#1g1AZO+ zw;|1+C=);VP`NL#H<6E?Bfwrq-YfCH71$cWkHvoo_iWPr2>id0@85Xe3f>KXJs7;} zM7cK;zl-oyh`UdGvv-jGxS+o$@XinSfzTNyZZEhWAdkO*`##F^5aNe%$8lc~^*kS( zo08vqqHSi#>u$X1xrF$~MBFN9-kbE#qt3sB?qhiMTm$^I(D*s8Y$To@W&9|(R{{4- z;Ol@rf_%TMe0l#J`9GPo8FbHr*3-b<9CcbC{-)&nIMQ4L*u8L1i?~NA(|Fzv>}>Lp zj&VH7y^eHmf>xdIm!bOR`WE3Y;6Dxb zm%y)2S+4^PJ#TWy{@;x7P#gZODHu?n}sLCH~uke?0H)$?Imo?nIi0M!P6)J;w!|TSR#>=+irzfY8}Kk)96ka52Utq$)uq5GjI+X3+JPTVHS@Uv)x9}{ zeY|f3_angX1*{4ke!8dfGTvuUj>Dw8CGcy5cLC{s2>j9D&*Od&*lmcr4doglJu33b zI{f{_e}i-nBYYpyEPmcix;f%DQ|^mMe{X2%c`djXQudES>&wu&F7MmH`5L$j;M9r# z5@|2N{TA+V;LQ@Bp4S39jrWh>P5?hd{0*RgW77BFe;#GJ1@s>aPI}tF&mo`3^KJ!x z4mf)5M!FIF4~9;Y_Xps82pr7JD}RYPT@(D*lxXcE{#ef+NvG$868;A$=T_hcN!N@2 z^-&ku=j-`3aTAo`-^AYm_m$x2nGYIYr(Sv-SAG4M9VH~kdh znV{82{2FL~8Jc=N2+p^8p9m~H4~w`5MLq9D`d5bkXXJ5r!q*}V+n8O?%_z_PBF~=4 z?~%}YICwuJ%{@qa6Y_r}IIrYwM_VK!d%)52yhwW{@z(?PXmD>9Wx6voHW5ETc^(Ar zZ*U*Xdp>zQg!aA(cn=}X4+&3@*E4}V06J6P+<`Ye$Kn4Fxc7*>eo90Y{~ZG1!}!l9 z-wO$U1Uh$s#;+p%t)TgAUOf*2Z%eepZK3x^!lzQkyOQ=Uq`5C;c?s|j5WWR;{wHv6 z4(#8g-vRt9;5;7MuOs{l;KR^(3Gk}|-vW)d0Q)iNUItw~e}~Tfz_}}NpC{eBc*nrk zb4|+iG4S<#3)l?)lkq<};_n6S3wVD5t*1v>=J9_MoHv7WSMt>JRdD{ptLHkvZw$`n z$p0_oeVf2LC1?omN5sE}{0}I=GeF*tp{x%Dw}-Oc8aiKr=KF%~pNYFQFUMdiYoYT3 z(w|HCLA-iC7Ww@g_ivY9wwqIg+D!y0_O|h%#-K)alcL6Qz`#<@auUuY1R{W0NAGqzl!|d7-jec zX&(*#|A6}z!-l7gJf20Io{vNuybkzq(EJr``vcNFl=qI{Js!N5g7<0ic|)ZCCh!OG zEuJab;On^x_=}&-!0r}#{2=nIKPOPPrx4n{)x~%8~7h6>m=`esl&M>xKWhrUHDgn_XNTX+VQ!( zyTN~Bl;yGb_56-JFNM|t-X{?rht6FC=Xdz;K^^`>+G|7S0pMPh@YTW9(+g|>+z)}5 zQHBk?A102YU-ooVKH@(a_4*Lu_fm(i;4X{0T#S2T=%_fqCha@G{}%bB=gGi65x7-= zcP9SR(9bBxgK)o2+K-X=R`}lr?!R#Rz-a)xfbheibvMfQDDcOj^A6reLT3fxyG15H zqI?sCKMn4Wp{M62yf-KP525oQ(tjVC55`T;Q=?8PEcYC6e-GaCp>;pf>Uj<2ksZob zV0t$2HYmfN!8E`@2yF{HQM83{F9`)KH;1jn7u0wbm_u!+dOIIn!vvn z{!5~6zXWzO{9DNP*_3M!^rm_Byd9dKA+8zWXMw{J#mZLT+sNx(gda{GKjeKr{;L7| zE^YdG!k;0m=S}zrfnO_Vd&*UyBXnG{14_m5%~Tn&t%leOXvTuN!+)|Z z@8Rls47AS+|J9V1xXn=x#lHyH8>0@d0{%$wM{#c-IJYAHw-NuJaOcVITEssn$|^dW z2;UTU1N7gE{}6Oe=Q~~u?#)TJu2k-E;Cj9Z{Bz*{F6he6rzRNgM%@3wy@>R`ksq43 z1^12AWjnMVhX1z2-;gq#M;rbW`qQO6P9W|lqOkh_j)uTb2 zp7+ppo7`*vk3{)j6f^`p5gN0Ee*x}u2`>ldK9ujTyf>hY)3X|!S#Z*GV#Lh^>;n-# zL*<3$7>M_!96u?gIXmkA>L7AU+_!+M=i0be;XMqU?Sbbplqu@-C}{nK@|_Oeg_P&4 zXt(9S9|-dCxSs>}wcxBJ{x5`ohx_wL{}kY7fcLs6>+^x%Dg4Uoz2JV9@XK)TNf{Ki zJIZn=XdMrHFL^(cI(`iJ!*TBp%^KynMzsGr;3tCnC(^!@_fy0@obV&TdlhjPMVZ$C zI}rX=xK~x(dG!nv-VgrG36JnzAOGutUzhy#Y$C540Dlq%{5x@a*3d_GhyOz2UV?uU z?|yJvQU7~H89fDKAUxNLawzy!{Ld%-)hOSI&|Jye8+304>~+*Z&w0@&<^L#o{EWC$ zqkKEb=jOm(j=K%_DUs$IxSt2-YQXe-0{5rn^%MLXpmzc9$x&8|hvs8}y)E!7YX8XN zi9+D1lE)39(ZGLa+}*qv0h_?RCvJ;(02-GN|6}U53i#8g&*!0iqo5@^-vIt4+#%ox zf$sqKz4+JQ-kAI!O4)w}t-IjffcWP@^QOcvkGee>oVP;vQebbQ4!4Hhe(+9+Jibl% zpU}DsG@hb(@_I384v}UMSQ9$$Ani54TSxqLz}*LY3wSSt#su%*fR&$R;GGEI4x~#@ zKlHxBdn5q=Ce1i>J_-GALHiA)`F@Gc!%{-r(}CBbt^Y-upWr_U*k_4*CGXXuu6F_U zVrab+oO=iUcW|#m8BYe5p6lWHDrr6e{u#voo%eL&w@^MkZ&I9lD-WkVe+^zg<+~8~ zKGAMZq;3x*ZUeBBai0i$A2^RE?Vq6abmFfC-S1JJI}@Lt^TGQf@W(}7n~6IaoNd5s zxVxe*A0&J$XzTeO=$%8F*F~By0+)@dp0@+Lgt%4U{FD5@$*boS+}jhk3;zM=PEnq# zL^;;t*K_~KYnt?T=ACzNWd-S8f&XsMtdmwxgYvu>_vfVj9Qi+o_l1Pt&3j4Yc^bH1 zf@YPt`$JF93xOR7|I49!D`1yE;|Uha{DS)t(w~B7kar9Io!~uB5j?*j{2TBOQI`AS zK9hGP{vl|-585vxet`Tg1@{Yt^?V}g^(f*hyr5T}7BI!nDjjqN19k>DH^Tp0+=oKz zmP)|09RED!Xwq(<#Jx4;O3z8)d=%K(&{`g4{cE_wc@?w{g7dDZ`y^>k3jeEtug3qm zpqB;FFHxqqkmo~zf4NlNTZ8)t^0^i8G3d^b&)dNLFu1<}@Abqz1{z<%eHQMuiGNX~ zzX|y7B;7x7({n1Gw}U$nHOdby*{8Qea z0~;m$Ba8Kas%D#f9}E0r(D*j)HKF+h-1J-+`73;0lzlyIwhsSWBHzbEy{{K#{F(^! zye!Hh|NY{7--~qf;9sA#Z^Qpo-kS&BJ|Xhlk+;cv-JoBC-jBooSp2^X|I175r*sRE zhx~t~EMJInDf|@PUjTa^>EDWf8MxJ`+iL3jCE})Vw@{u_i2pP1qsXTR*mI(Mw}9Rc z@NXgQAbCFkoLi~=BHw0|=WEc=^I~wHN`8Nday*&%&k}b#Xxk#+MNcTd@ z@+sa|MA$Lm1tZO1lt=JKfOj6Ro<7QZRo+)YYcKBk4z~X-aJ~`ge+^`wx^DpQV}bK{ z%JC8WzoKk z*$&PJp|cZrhP>{L|7qY4MSY$Iyh-@k(FP|++ddXrj{@h)f zFYf!IzGs&Tu?M`55dT$Zew_C_3-@>9Bh@IH@xz6|{;xZ8>QE3k)08%#h$ z&qcuR4UIcOD;U(Z~A%8vJ zhW3MjuLt&i-dfb}B;X&#e~(D>1KbyZe@3*CCFb8tNwbQ)=XlrC27e8@#}oG?%2S0- zf0X(2#NCMZAZa#2`y6P!7`nHMIyVTvfcQ@l|4(3FCay#I9}11N(EcvrpAn~L3fwyp zek$=l<$W0bH$n4RQ3S~GI_=k9(OP&uSy`FD|dyQy^Kau9{ zz+O+@dOD>46|bHN+^18%s}p}8==>GB&-W<%zl`|blm4^BKRD9A1iar6dp%&k=KT;j zuZ%Lk6Zj({UlI5b@N0oTO2sKIokZ{NAM3a}DB`1G@?F*W`UA`TP(%?v-P+ z{a+FHTk!r)LvW6Zy3R!UmxKFg z{Eq?m(}DMVVE2aBqrkll?lRofflsh9N_j_kPp2;DlkRxpj*oh8BJHcd`5Uk!(w>b9MaR#61PPpOOEV=s@$Ygr5ez7vX<8?(ax+TmBwdIo8q35`|2)`Isb{M!O|ocKZDPsG)8ck+Kd z@ptiH<j2FDK2Hp|e1`rvbk+;bGD|2LGigudHWczSXKVI$5Va zTU(c{Z+BYF#`K26jpo54>-!_LqLTGY)~2fSGo2NcWrrKp+1in1S-qWAvsSHLYaOUf zW&-wQ!!xyNyOvGtYc_GJ*<^ics%G>pp2P>LGxL$U(d>XS->6?QU&{=hO*LCtXCIWO z>b054GqYK;tk2EVvgY{3wTVtUI|wzf<{Oih5 z&Gi|flPjy&Wc!-)t#)PgX}uZsKV?ntc%7D+?=&0D+2(vZYcI4rwb`sOKRaG)Ro3** zH7Wj-YFIgCRW?~&Xjj%caH2Y1Z`3*|=s2gXHG=0gTU7nL`eZHJsidc`TGO}s+-wKc zN&eA;_0GgT8lziB1CYm!d`T(73r#`X1-(s_a)ppjJZ)B76)`)7s zSrx5Sn^2dUpPOz~C+QVq`l9s)iDzco*3f0NI^PDW%|_Oo%4&QhK8kXo5AfmZ4Zff# z2e8$o*UVKr`}!*D>)FIiwcS2z+3aLJjULp)HneSl?gYkgcy~`&zZB zvz8s6Z_UtoJJr^7t#j70z2h_0#(srqxXId~vzGO)UbbOJwY7h;d9bm*zq*0eZ*;1M z)X&=Ub92pBr#4whlGLUT_*s8{;wWg{QjIe4$!-qax zXH-yBbx81qIm#!-*-h7|9jJpW`dQCm4_R(UR+K2vg!SnLW0;m^L{}&FXY{bTK8eUx z8?)G&E} zSVyx&6}ub#K)uzOug)-W3f}e!YG0MUqR*SY25G10(vxZk8yxhm**Xcx_WxOVXPOf} zI_*1Il{J@V)tOeUI=PV54%OS5m}%{pMcZ?=i8@p0WJV{lueJn@_RReBm7+0QJyf5a zpN)lLwz{Cs->!ACW@BbSGq>i)TFd4Q=J+;k#D~1nNxZw&>AI~>G-`9g7RkwCp5qH$ z+0UMT!_-}iR`NxUZc=YCdG6Vi&DJ#0>nm$<)d((z`(+OtA2X>p%`%zNU&@41?u*GR z9xOIamZU?2PcgO|lQu!{;rG>Y}~2i*A8g-+tkO$nyxi88+!k3`y^GG zR#Zvk$PSr16XG)OV`Y#-RULRBo2vTAw@FED`}ox&0{=Xz%-qUPmk zjiJlz;g^$QiT>Q3LSrGDZZ+rUu1r2lraDGm!AW(h(-~8cP3JUnqf?(+@TtnD9-8WM zF)8cp6~WVDAw2qNsa6UuF-NF9QkTjnI_v6-Cjuste7qb!FtIlUj+9A6?=G0Ru4T*` zj^WTx7hxubfwBR0*qE*(#;#6g&dM&zy)rO7l#Mm_*BZ#>ZQ%l0GME>Zs1L4Ak1k4ICXcU7xOwFLY|hZQXcuULR z9vyw4In!w$x2G~-WeO)7tTmX}Q)sTqP>evcC6D-;FCMnG1 zWHvB8%>+Q%JOp1wvzUJqEB<6Ql(?=EYf8NCSV ztL+JfXj3pm%X?zx*c&rP)MU7cM3`-<)wJM~zlV3h``4n49ildO1f+oaA@h#d#?82Z4rIWPRBysKL6)f*$K z!FMyc1+LhHiTD%<)6T6J-b86k)D9UpMISLSz~WtTV6&KoS+(p7YJ!N-3qQOK7PE$E zTmn%LW{ED4$|pvHeluBblLu=)As7(EiVo701WN|k0z#6e&sfYop3x5ih|eyHOO(dd`DW$Ws|8Sp3?d2_`e^OG)DK6o(_YSHUCasopt(IhzF? z?;zj2?bHuKXlU5W;{F3``-g@PoR*;@I@oOO4`l;=kqWE(cEt7=BM!eVCbBQvUXvJV zY7&>Sny|}KoB25G%Qhccmn~bps&6%atNPchU74*u1I^NDr}qhXTK_3)R%UBfty;Zq zaO3IgR}skv`KDRpr7RRW>Wyvu24^hf{ zCzC5H4ys9nz4Z z3q`b3zi`!~CPeY|ZA5RI4xFRwQ*ZlUko1;Yis(UOaZKwuATHOY)kbOf7BVCKRjQLh zj}`6Z#2G9kOYDlcmCH|=&ux~t>a4jY>n;tP$*L?~(|kKE?|i!`h9x@+pK^}3w6ME; z)@j#frjChulx`0J+52PYKPU{dw&ounmzb*cNo}s}a&Sio`OCi@1l`wXc{3Bb6KnQh50TvSwmuvic$|ZVja6U(oF)dX=HJ`(l z0BK{;G?dcB?O-8DS>!6;p86EanKUCuMTIhQh8;(ZWZ%Isr71tUbYy*NxvW(@*RW(Ph0!x_doUN#>WDgD@ z0@vrPmD$D3aqXnFIxEFvNI51*t)V>y8-}JWowbG5!VH?BwB}Ll(opSC`tkXWSfF_} zZ~VL9qkeVYGO&mum<`NKH(Trz@U^<|vU6%o`Q4x$Xpx(6+TGAG({Xges>h-_QJ*tK zPB%KrwZ&BV5KH8hS4f&IXwX)hk=Bsp*_pL}y}mVMet0EnJ;PSSTyt*Tce`@+k9dNv z?Jiq85cks7*8c&CtOqF)F~#Jje7An!03~+mCHc@p&CJhAg3ci(B;+C2nDp!!SW(&N zn~59Il+Z^i;nHPed%bNS%@;7NW7YP40a(bG?KWyhO^mX1l(X!2YxSS5X@_l&EdwNF z?<9d~J2_Jlz+#gt6oBol2SF2wpS@9NE>t$wAXp2>I05Y&z>2`@EboyBtxZ(%4K{v! zQ^mM!23BdsCnxRU)HR&_4^svDy9}RK6 z`NmeWIw__v3;hI$>||FqN-hFaTFRMZ4C*@Ml3xmAi`fh->b@b{yTebjHBf=_0aC!s z1uB~cvMt)lwTYL2Z>4G$-ZZ*LGi802KGCXdvT4w?jK{>Fk6wuYOp+vM$Aze zH2wjiGpLtq)x|i0&N!hA`W$uA9VMKp)59C}YBt(gVBy(Bub?%|MIEZW1AzvOw>9sc zdhMV*6Q~(+lvmZ%GikRY?Q^g#U1)X2Yg%|sv6QyN^VHU7V^hAgnweZ$H91Gc_M99S z8yseO>4IsySuN+e{KT3@Ler{8uUnK>G7wW_FaSB_7_^15#03-FHhqJkkqEwLN70MR`-_-@u(3STsWxiZ=gchRWeFn}zHLxp5Hz)iZ&F^g zSVD>sWMzSmnW*h+&cL|%4!0}_AQL!}FAT2%n-sPgWD(W?i|E=A&-dWHAZO+Ug5M53 zTa<$pgRBmd1>0*uO7oh&NJu51SnknfgJai5Zo-#Y3!QRNFR(NM$=vZz{ftvW?xzhT&x6$7EHgSOAAiLx_7w4ZT!QyQ-- ziw!%=Qj3wt=5^>!leh8}NQWL~0!yF0b#Er+;s8yqCHiG>UY?Y+z_U+>$rUOXbk|d6 zY0#L64#4(@wiD2`C#EnyLE7z(WC!b$FlF`umPk^YnSn=PLKAmphH^|i>;+=BAq^*i zm}tylA7MHmOq%UBszatDk3!*%K2Yj+O~nNeH8^H3HV}b60-$}4VHWv!wM@=yt4TIF}ibi*p;9} zS7udWAG1DT--mvjyV`oGqlR%k9lX7Da_0p#NHFA^XB2eMr0~)A)iCiAI5$jk*syKq z+NLJ}ZG8^J`=2n)rDT-d%eQA>^g@;X}Z+%FJwtJZ3d}}R*OkWmM^7+!N1Y^Qs zUb5c8+|-SxUS(FG`X#d+8L2l*Gm4YE@)@L=-ezW)UbY|$vCYWlVx*g?Gs<$i)8#$;nzOaNSf8$FFWaCEm!v4A{~=N!*~1NM(%f0=Y-}E4yNjJc zstuDy4fNmH(XcN_Tl;37k^-(3>k6qLX8qzyt8$=-a)nQdvyijsi$KvdLD29DA|^?s z1PXMMa7Z@=8?LE5XzXIZTSxUH zJ4y_kIx!iF?9%vYgT|1D2HSnvKy0t14w*Ai^Jedf4evEvdIL2==l1#$z|o_T~uP5v6l@TjeY zUhKDXifYcR=bZ654Qk6o%`2z{)lSUAXf>o&XO&LAtZI9|MR?q0bOFo&SgKz`r+vI? zVHrGN>y&B7gly4non8dTYzXJE8Z1(;l&5)FRoe~-b;?g1l$HehV96M{i<~u?$6P^z zqLqvv<(;a-rI?f9X!~JNP+15o8(}e(t?uG*j*zPsB0&o02r~RKYu^(N*C&r8ItiMi zr6x)UDI5dRN`tYvb8O{Mq5zwKHb;BjRua^!;btalo9LNWq&4f%5gE7J=%uy*kHV4} zgR_pl*CC?X^RTWIzMSLmsK`WET5(1>7%*>zOc0$4=z>_RnOOyO(iJc>10teihm}Gl z8!Q#fFiNn3hQ@V{p+FG@7bZKdE{qb)5j!oJe3;*~@?<7A|2P&%8j%#)HBcPC0Oho3 zz4k<_Zu&A6(MWCXHLYbH>*?rIxC))T8llqzNqugzRn&eF_xQ*cNZfxI;35l&ycB5FCS6=uz>{glQh zFLPr#b)W@28&F&o9{9eE@2L-U+yrG)bB@hyU>vNGqGYB%H{PsDrfPB+tIc#|i~!;u6L@%I(vDD?vK6#Z7anTWYPQ?G zR7Yd3vMJ7s5w@8xf;(-7kH8+C@yan>I~7qA<>@9zvBO`b(`Obg&YyuNQ8*lIlvF|r z<^r-E>FNq(IY(N;$nm`+dyM>fg!8i|Gn?QMic;^B$%s7+%xt;AI!_x6Q4R`SXQkCV z)k3e&dVTijuAQu;o>fFQQH?vKerdGyLbXvD+!mX5gWEO@R|a=tZ>$!T$GZRED2D+| z8N%G$t_-5pU*NyCxp7cJ>mQ%LhIS=+g#d7etjf%{%Zx|dKRn-J8F&8(GqBl4>7VIF zEtrj(EmPUAoIx2~fW`GRrag72=~0azH6(ZpBmj>>5g@GyOd6-DCR{BsKgU*kt%`;N zWo(X?c26dKqgw2Xwwz&1+_EZHd|-ourB|OP^tiI$X9X)rB=ikv!?Dvovvsy2tS50$ zgxLV&IMA&mHAa{8A_mYn^U5MhmAr^s!b$47B(BkQhDLW~r=PZJwb(40AnQ4wr+3GW z-oe3a+qQK(cB~s6Mdh#Du3TzMv|uV*bS^9-!Rbjqf;EDvUwfouW>&eh)@mA`H{WoD z_T&n3>`JVyKYA02%qy0t)CwS z&CZc>QZzPh6JU=`8YyH(?b?N046rJhz1x%-{igWti6ud?nak!o^_eu*jsZUwQQ2`a z>@F>ek?%JrN(m7CEoxUleI?4VO9J8&Fe``bYjuKxu@=-!K-pKTPw!(m9SyToNS!WY zo1~9&@PPO2?gXZES^{(hNl>aT88;Qi=4+#&@oMvE){_QAHPbxk9eoAnf{lsl9DPom zUuJ~bf^a=?b6zs^CG!k+CeK>mbYHe?OS8F5y*_HKLkZv=uTk+#Z3Ukm-q8k z>WwosW?BrAv*tTfy{9L8KXTB~x{_UJ*rEo}oN%Od=;rilc!`{kJp z1*(Q7@|%_^Mll)-?b}dsS=$n%@txP!8n!MwjJ02z7FX3G)gqjHol6Mnw~%#9S$VO? z(4^qAz#NKMajA4y04As_L7UBbmC3w`g9VJun6Hw9u8DLf4K}kpN%OiPWCKtz@W$MO z@-V?AE$@>*^tq(-FtISHvQ1Fo+}Z}9_jrq`VG zqVgSzy%np)Amf_tOMqp zg_lA8v{#(Yhry(p1~Dgs)*#t+%~mNR+Kya3o-z^xUiNo=t1@>Ug^&&?;mhBJ?*J=% z-U<#&^QyJJfx2|uCE~VXX?@C3^F}k+rdF8dF!>_ZEWq(63$IZJGvxX`X9{JrWotlmS*c9 z!UuEC1f!PT3R8pWyEyDYGoKG9i;Z>8ti;NnTP=ctk~E3%ht10BNanT;9%mN)=GA7A zc6yV3u58}{88}(~Wj$Lr^1W7-dZtAk`=@a!9lh>jA7_$q2TyQM%MtRSzAgckQUw6r~$ zG?J0Fz-prdF5ykMXh73Rw8R7)eqHwtXlBkA3sN_I8!a{ls~JWM6UAzz&OO=ao~=c|Bn7r~iw|dUE)P@&=VxaZU=Zio zLnMHha>yLpnk*ZC+YXS5aM;xEM_8`vbFkN>3uSeEkq#PF6}?=pG~7P={@% zBb9gheM(GwtLc=qHo9Z2kh(WnM3@bV{uS%Dh0M;QBCqMxOa7u=Lxq(czAZTCW2pe4B&S1Kh+6x&hl}Eb6sil#Psz zW@4jV)&c;Rq@%kt+_N&Sy`#R$W@GcMYn8iPxtsN6j4{>BStTw&&`N%MN}6v4ne4ZZ zl`6P#4OXVis!wzpbr!PDK{L4N;$$MDK5535>7Z1UOzF1DrtIA987FrGUC9!ksb!i_ zYr!~-k`-bJSQrtOfo>s51xiMZm`{WiW4>HYI@d=g%GUUrq`!+`bjmyhk}GR#2d%x$ zHfE8j89w1*{wgEQy{R+v5gU`vC*xxZq7kNNn&ZCJ!37jK6j?#n=@b?fA}juyey^sA zRM8WIR3x(X3`*0?U;A)nc&|e0cxb!BA*)f^m@jWCXs)fH>x+$VX`X>RLQ7wEK8AM_ zRLl1neD_w@$JpYavMk<{@U0b}g-^C=*3PVB0B4gi0_D8541$49@M-#WmVR{e_RX8d zvOSweMu&Fo>{$_(Y7bzF+O1iC6+6>&^H zI8e1#O<@PC(g!q&CK)b=$jUs+^;HR=R{o8=OC|!wf!4 zIid}qGiYa6%LYp$7gA&c9ApWrPP!199IEXXdgNPf`8pekC7+-+_2I=7Yb~s^scenv z5SpKUigwc0pqsU*zb$co^1rLP29Oy~rmYOwNV(>8rS;6NX_2zzhh@qpvzv9bOvV1A zC^4709@;IANRSiaYE_>Bgo6&C=djVCCT)K|*=Y2)p}{9vfvE$M1d0kvy1C zJd}k%8R@!HuvXF$p&e;7HEmzBXLx5KDL{8LAw{xw*}N%n!TNEU33JVj7CsZnwrm?2 z4pn~P&5He=N&#)V-#1na99t-|Ybb?%yTdkGmxPw-;1|oyKNM%|_$H5}i7hCe>9lfK z9B{Ey=D(df)+v0Bi%wU}gXy<>W;nxR5U$9Or&HNd*F9$TKikDLFo7Ra68~=yv7rX@ ziONMj(+FwyT50STs_&Iqtuw*#Lq`>sdqbnN4~-d9j!StgCp0_4v9G;M096gy**=oc ztMxC-zmf-c&lwMEQDo~M(4%w%8M3wnGb|rVYg(wOS;=%$*<~Tua^uGQPBTMS&1W>( zZ|5wzn#Ka987(Q+r0=E0#Ye;Do7P6c2V50r9JJ92zdmi;K1-aFNwiHfMtg8vA&%&= z!DOp5Gu%-qBgUs6vM4ZYN zTb9;kg=!p-^XI;-#xgTBD6XE(Zmj%d@op1JKKKc-F=qb}Po)`j|FHIG3oq3+1&Pfk zg*SmIqtqsqE%Oum+Vv_fc0Kx+p}s<2W!{}EDDG1gU2K=dPngAw_cvC|oQ?qAKkD%PpPLM9^ z1Vv1`nhaf~Bj$o`3TnkqX8sP-Ngl4Qvz=WzIfH3A8Kc6X=R{DfQ!j#QbAEcCSxPt& zzrujBqh&5bqR6hi+2)$Hp52w)w<38NGOi!PN(lnBnYqfgI@@&(IW-^2=sB1utCSxM zgC<>83Q_zpNim4an3Ikij1d8r73M?Jf*`R=@*Nt~i~u`oid#F=DYO~w*+iRGwxRs7 ze=vjkpvYAA&u5KRw&mPGE|QXdg+nnl4BTKCw7gJ7He%WD-PSzF>g6(2O#b3XC(v0i zcCF>7k7axMQQ6AS=FOY4xDGVGv64?JotP^Ywy&`z z*R|s-x)SK@yCxQtH*lZR3m!Sj*@#J*Gz^`y8R-#4OdXCc4}c|jtBJ8JdxzzKW9@M% z(_-ez$t~c?-Rq-T6jIoSwn54nFjZS_Jv2)>(lZRPwu0b15SOYHUKKsvgOof53UN=d zN%FG|@FMI<$-C1;R1u{)`1N}pi=6z>N-JfA%N)L3Xt&&&FQ@&yBj2cW3%r?WV z*f3)2Aq*HRLnzd8`$rZJ&S5d+=k_hMO^KNI)~Rf2z9oUv48~z2bo&rp%??DuQ?ATV zx=O1^i<&V3xFXK!Bi&60Chf0N)?iA$PsTC%4UcwvF_NIN)$u6O%9b3*dUh1vR2%H7 zC}Z6i%z{78!ksP-hIrBd={v;Jum~upS@v4lyy90FL8F5ZiS&k= zx{qslrO`3P5WKHcTB0X@R5!#}-RTT8td&(~Fjsm}`6M$ajf=JkhFMIOzJo}lEdq*A zbKS0(s{G<2kB0Dc1BTs=gDTFg+W%}I-@l;qYOyaV#u@*9&Ti3Z25ZOQkzG8>kCGaR zpyW!l?NYJi5M2{OK0Xx8$%Si&+J?5t&M9oR84>6fqyrd&bXO<|(p^B6LODCzDoNSH zYReF$3qW_Y3DQFiR1Lc7X-KBbP;03F%ODxADPmDu%Uhpr;$Xly1Vf;+G4y3qodKAe zr!V?_)Y+g-s1bngRbsjg_n}O}G-zY61lVCmwo3rtrBE?a8fTzN04{cBfeaKo8US*! ziFl9`@eH*54v8d8&eD}Qp(Y_xvxN-3%nh3*3)p&G_+lc~+%lz|$xvk2WMhDV5^hPI zP#|n9A#4hrtz_{6!+3&R0?oB`%v7#o@Jn!t1d&#I3OS~~rkpv6)iq8Re1 z#G@m5IxzAbCh1y_LNKkU(y&v)|9lq!MoqJjv=HJR^ULlhW0S7U>?(zETxFENOj)yV z0&yfE?KS2a02nRiny3>yY;m|LzqenC)i@ZOqlJ#OC$8sTp)w_{t@cR|I|5$Lh$h+& zgPp>Xg%;#m|0|Y`QL3L32;F@ClK?cEU1D7{EPMi=)yfhDJ{rfWpXbjOD!Y-aB2r@5 zWzdp>jN^)9Q$*41)!YEZjwTg#D$S^QJx#>YoRv=@R5;BhM^>C^$^+s+h=bNz((E#( zv=yGPH5$CLElE^BF1tl+PYI5!SjV}6ume7td_rp<$;(#y_$-YbeIEPb$rQn)B-&At zd)0bHd)r4eZ1vIj<%Q@PHh4+qA6nILIk51V6pV7C1R3Jw!J=R`BKwd$c_tKtS<{4U zDPTFw45=^|2gTgq&WaOJfJZyksVT*e&NGq9cuoP#nYdKJeJJ9)FIe|`N`;k^^a%{@ zrl81m`CVeA?Ow%AD$ErR{)eIL5#*J|=!xfTNx8K)MRumJ-{XchVd_+HQCFHB?k4YSYlOjX6^= zE+rcjoq|epO5O>Ak~4agNyAse2yqe}C6o28k>a-w`YLh37d4k5r0!CL$5Jmem7p}k zmyIC}!jdRUlNNjDSNy7-Qd#|uI@-{=jk@j^;8Lkjm?Bk~p5j22gR_$0wJuG@)?#Yt zd`oe0aa9+DeYbqDM+Xv~ZgNFG$9gBe7a;JSy5%Pam zo-sZfH42OfB+RAYEROJyjl=ajXwt2IsANjCiw?4{Lwm$jKs5*3Dyk z+I49L8gYK9Bwx7~d`Vn_1k#wKugThC3KBmM$=XU&tZ=YSlHWSn+EwaiZaHFG#_TXn z^V=!;JvbZL(6n8CNt(z}le#&lC6f7FIGWVx?o1r*`Ei;3cn79xnzMA)T(^p7{}%C3 z>M53N2`hGCqAACk5--)|{d!TYjwYXlNmXCvoI3M}sdnXy`v}fqqktIt9)r4`nA(a7 z3I5;tT>~T?t_KjP(%n=J7%O^EBrQSm3o-IZp9^MV{@3rXV1$E#t`jPC#iJqZ1dQ(ND2I-XXUo^{!O%pY1>ye z4!ev#InAR)oKw@k{9bpa4KgrAKVO0`smS4)eGT)XT9P##Gl4~oY4tImRw{X7KT%!S zw*RM%nytLCsYsXBdD`ZjneS1?`O0>-R2V9_ERgrrc*J2X=7Z)#0;HPIp13DrWaWv650l@DX-b{DV-hkQuyaL z#?~b<^#rL;82hfNcSY|hCL1SmgW z;QyU*qYrSMBBf@5v|gZrI*mpItv|C~WBN=qPcXGPwz`A9392V!;?-OSufYDrj)6_N z&QkuQJuLb2Ie>z1-aXX2_H?5JYbsej3w53NeA z3lNP^#t~-&&VGFxKAI{O%yx$SEq+X(yc>oV=5iA_p6s%B*l(Sgg+$@ac1c%O3Y+eX zaB-VTIp7_<8{&rQWmqv-%nZ6TV#-);vYpe5h$LqY?lg&etP9KyOP>`5wXJ*iNWl(#|~p=q{CVk#~cw`UkZ|&o9#rj^UdAl9ClPXi9~GOn$eG?#-Ppl4l>dY zv4oRaOQ58ya)h*Fwu9qaz6CE|EI;yk(R_AMIE=gHEzWEyy>-OZi? zx|TKfo5nMR3i6f;(TNd+{kf2QgDj~VY=ohZN-1MMko~tbk6}iMNEF7Oblcp_5Ej>{ z=Sdb5(bcf!G8TJ{0_Q)`h>$+()q`tE$iyc;e%-wJ92yk`eT6n6OWC|osOWyka^hYD=YV84xU(Xjaa z``RZ=e(z=xx+49myOZQyVo7jUmv9Vq3C?P8NW|~1Q^*vFY3qmaGqIocQQ0v$toYo_ zLT})Z~0j%o)pJ#*aIbR2GKr#Pr~oqz>41&|`4I z5xKF-hwwPOUATlPy~mB(y;yn3Z;OaHv(_m2^F-Jxq!f5_a2mn3^xFPF*j0C3)8`z4 z$w+?t%Az$1Cd3yV-TE21`_kwo_RSob@0B7sO-ZYA18Tt1G-gRuKsVHGWT&no;N#n@ zA*A+qh)NW5sSp%&wbc&z$V>+|z{9tjMJMV0LX}bg{4>I#0g}dp6}Q3qd*JX?RVIK( z5|h9$2yhg`f7QbgqIVP+)I}uRb{@8e-A2uZhcF`u&9mkYN743P0##k)$KvR7ACB--Z4Z>r?v9YKBxY`^ns+Qe0t7GZ13^ zv7^BK(FMx%?X-$iI9bntKFP)vUOGRld~oaoA=JWEN4RM=p}e(+m)f zoxpG|3p?-5UK-!(<8v51F-A1*f=+>?-*4MFFjnDZdN3P`6&`@=mPJK`7|uliv8D*Y zSVlri$2?Zqxp~Jx)+45#hJb(tccR3h+5xH}x$fkjt+q*xY({@aL5%_Ks_V)EO$2Q*C)i#MQv*U~pS}Y9EDMIRZ2e_Ts`NycRP+S#Uq5w};?79ep9Fx+QV53)`jK&?b zEqRp;U620dGM|T1k%-9GX<|AhNk}2~)KHAV7+PE*!YIy{BvsSdU;Ew~eAM>1_{HbS zPWw4Xjd3^9l$HcFk!@JVS(aH7+JtF4k@nLL;?r06u3dG;S_W1`6arwfccs-dD7)6D z%C21-CF+`zaF_osg*#M@1-)HKArmkrQ*e-x1G}Gs+hN|5f7sT)6dKh86Euu9D*1Eb zZbvLVe8j?)*kuAaz$G9TcVcmeM`-#ch_9NFv_bpY=UT@RE0d)-^B8eLEc;!`3Mvc` z+nMT(a1y#oX>)NaA2}K=%hvNrHuSAGW@^K-at5*rETzv2;=0ll#O23;=kybpyQZdQ zq;K5Coy}@eBywwb`K(chYNTIRNM7IG0PbV~8`pz8QS{?-Tall(^!V(deUbJjtts>p zTDBPTI(7#~mUtBgOVK}L~{(c^2|xllyTmTI-7}!XOt_q zsiaT;b|V0+BpPW{WHd%e*Hogx6(mvA9hzh@5^-CciLAtHT6-HJ;#*uCx(howcAr1$1*OM`pY3ZQUgxpA)3%YC6qJppF8wvWuCESre#;&h?BH}bQ_RZ3%f&6YL{$=5Ry`~Hlgy- zlYm@sPwVC*?Fz>m8)?7l$9}$rJ^^lNLdAQW9QWKd=|%EW?_QDk~qgGP@B=9 z-riLtnjw`};(aoY@Siw@J+>JjGSfOFWkw?%{ZA7Srkso+quZCN7`?;W-uH-XwT?Cl zh%1BxmbXNrkpsFuWIdVN*sm)TxaGqbmyw{j!lc-*5QAY`DPGgO5|ZC+*CtAs!m@d? znq9_kikLi7{B%=LC~YIjZigAz%_vMs*XhizHIHLQabe zJk<3O5~%Bon;aKu3i+)oT^Zb!HZ7J(ELeIl^>5N46qT~W)}Fi0uDYM4T<0$pFS}Sj zusf_t0JGX~vo&k?WIbzo=c;wi7~f7d>l=shdnAa!PT28wesf3V z62BuNwpq<0D<01jL)wbh>N#9p(6Kw)tkHIKMgOv~Lhhlcs9_A12(2mrT1eb51?>L@ zpJd#GY}^NRKOf5rXK|SIW+s`mkgmlN#^E?^8`&LSlln160__F%URWWNrHS(;uQCVB zVI*T~`<-J&VPwjI;ZyfQbl&k(8z z-|p5bh=mAM)qh`6%J-Vs9yCpF_rMOv(FTHX#$g~1@8p2E2Sxl5Tzd|lkx6_hn0Am^ zT{JU}&ohLq_AK|sw zkK91Dxq*xY7TpCO&;~I7{L5%j=K3Tw8gyBX=Wu+@P)f0Lw1M!WFfG}(8pPrA)AQKZ z0bu&HPmz8nr)SV~2I8EA@6lP$?owb@3Q$^$LSSY`o55)rBfhHdRA)ZLP9j0&$)lfe z(={nWaS|(O#+d}hjDE+Lqg`t;WX`J*yBN(TuKBxIY6 zBgQ9YXMwDMbNl_@`!Ui|zy3~TGo6UG6*S78x_BUwdiNkJwFJ$l1j=r z379r<&w0`4riefw%1%{-K?iUMip|U>7u}~-Yx7&;rPhhfFqfYroqm{1>FaRec|e`RwHR^(&5%FwFc{yX5?H*$@$g%x1j8U8EyM|F_9M0`d)eTY2DFOneM_k32`_GyzytmPQEQ)_ za;uSV44x-T8#lD+&#M3|}VDj|N$-cLNNUgsBDY_hwHRyuIaI?k)I zG_jYU8;zD#Mg}V*n@7j&=CR~~x%Er-T#g#qy3t5;O;)39DOs}i*N+A3w6C?Pd7SOX z+pdgsU;V8++icF4LcF4Xk<5JBzggkX0e3dKv$?ng&eGU1jNC^qN*;DD=1)svZcBU^ zb^PA^6p2pAN%0i&wO{X!ZYx*1Cv{ezleR_M2-|+A)A1++ILj{PH8O^g)e*4bppEt- z;iiqTxuUrmX;=SP-f^R6kGaVP(8UH@luVLv8PygqnGDWp>9SCs08XCLb=wTW9F()j zuN*5R?p%^C3<)ncjfsNEs!;UVqs!^!zg(<{{@t>&l}{hDKGWN2_R0!}j;|j>I~oKl zX50>^DAi;1yOQ?*@)wAaeDefftD=9I9XfTdu@MH84^|==vK&MK(~+jaM@y^oUanTa z*}t3s$yyM*f*OT9SrmZ|Y}+>!Lv}%azDNrIVe8U}S*DR;d&1g_G2kZ-4S^%Ytj@xo z)EleF2!}QK#RwgI8RhIJG1J^&$$xRB?!=HaP+9{#hJ1z)6znQ6L73hav|GjzZ@+0m zyriwM1EcAt9={vq%BE-WE+{sdmcXJ$cb^-gig$K z<9c)3DY99>>|B|1Ogv;u1<^q_XD~}}{0URGyhf$slREuM18TkEWJgn*5!SY zRIiy@1_q9`M!%Ds`}LJ%UQ>X4|ELH{xln}CvKC@H9GCx8m|wl^7H=Fp(%El6ys%`` zEboc7TG7ti#)SRYMbs_caBY%2Bu)8YZCUIwwen-f=;qZd_Jax~eTIS1{wM|;pmfJL zQlyz(r|@3%rMh%H&_-irPT@Uq$PO8X?$gdNl#`+BU)2xz;P2#xq~vJy4GVk3yx z?!zYAM~@I+VTrIw){gE8)77t~%MnIu324K|x{)hn((Y7zA#yT7#T{w^7lT|C!4W(C zmIrm1rJ>zw69dbb38jrp5cUMn;0uF^T25YufhG?3#4rlBUs@Y}6^^?Ty5rmV(H*Um z#UUN=i>*%eW3A6op%RU-{>YhW1}ObyN0G^r2%(Rq>N;g@(sjv?;>jhN5=@mBvegfs z&w~2-n`8)2G&ZI_dh9M6VPJP=3FV>)aNXAk`^(l&Yy)X0Z^RCdQ1BTJtyG+k0UlGT z`GR}G4>{S-k07LCMteoVgpTXhA1!BavPoy3yr%S$4en%57h z_9ZOMIHURjVE^yxGXprUQh2d!o||JjkQNPN&gc^EWEfZl#J>m3uN}H{72{dUW)JnQ zUbbO*k3QDkIhK}U1wdw$x|a<|rUAdoO{LTCDA3HXM_ioePL@Vl1cT#`kc;r3nv7G@ zLOe89zER=xuu56z2n%~6sL;34&GUTGBnhYA!^{DR^KgLp%-k0| zjQ3$*BE%zTj7Vno-)t4_S?$U*3Zy2tTsf?uF56OwyZZq~$#w?qNo!UKxeUvVZ)} zi2R(DkF_yE#?XY{L|*f6bmWa)$Q%8ay&NHC3X#0Pk?A|?Cj_RkpysnsJSj)S{pYv5 zC#YTdPC!k_Kc<+iI-=+S(<&G^ept`^ssNZO8qOxOPB3pNrFm6rFl_g_w$e3G&PgbToPY)-?+t9sX*y7r#^Yu1LG5QRis;&vZ*}jKH)~;RJ@?_6LA%S^J+f!ya;EyY?v-U}4e(Y57%918`uJI}rW$ z`$84KnkMy(oyv5sFz^WI7=>kMsblvq2bfYM4@sP_ptH&>pKP**B|4=f{1v zaYnd1sEI0KHSy4h9w!)EgPRzi2RXs0e_8s4?Gj7Da8wNaABi1NIvM-gwE|h%wPk_! z-?5O`sh=IRf4)7Yp!!v8r;qw(Hose2;YCoe{~;}=-}hJo)&_A}Zw+1C_G?vs{b7Uo_mC#@ z0amqrH9OD_%W3Bh=$$YT!gmQTlsQ^);ukc=2F8Xq?H$>*Yb@!K=8!A;5E9T$DRJpq zX*M<5>56BO2t~hX1G;xS($7xhmrSB~GFh4LMnYy@&5xzK-NG1Iom`ZcAvfy7ECbb2 zIG0Ry()lXashbW^*Q-pKCJjRZ7F8`CIGl4-UU^Efm*hIDJi=f`^*fy4d&_pVobPvw z0evVAzm8*yWI7`Uqk^|-u2hPcYX$D6VvLCrg?KRK;j@)uF&CG}VpHm+b~7kUC4T}gnNuzYh+Ydq^qH)6VB zs%bx_1}iQ(NfVtlxl$K*%jcai{mjY1g9rQ2omB0oPW%&_pw};(oNBL;DEs>k?d#0W zEZYD_$8AT|4beEoFtKzjstC~J?1N)@k3sjErB~9mvS*imTn6!6O{GOKmTPYI#1ssD zpmc(0h+?nGFL=x?!6bI39USKjjEz)#RT+EMOiUquU@jMa>HMZ>vThhliL$X{M{bkF zilt8%m+Sd{nm&_b+h7US^$H`}lshN8voh&4W^5Sykcdu3C2VB$q9%1{iwMnv=HkRQBa2(GpJB)#PH^pbOtTX&cIRp>k>Z zlnz`Knre#i5#N~FD4l$Z7S+e(4o<)C%!UzUbzvMoIkT7otCP=#M#Bl@x`tfOP$(1- zDm7aqbFIGYvh2H3`55Dj)x31n((OmezsbCtwseVCU^GaXq){#g-98L^4VuEKEFV95CZw>K zskRqpIjG0)#o0_^H7^QO(kj8jnzqHJ1iF)q)zs=ehYd-4AA3!gmZXMRGqdeb(RR{6 z6@*C~$}B8o%(xA6Slg2=6Y}9wq$-N@|7R(R5*NEJZeoD7qD}8biD&IJU)O2BB^u0H zJ?3YPZ|qgHyqCT-!%(X_)U?MY_ z%vQ(pofHaExTyKAII(o$#mX25d@t=)pn)(Q^x{u@H~@R&TXW@bSAOHI`Xu!$os>E3 zp#Q!K{{_iZ>ijH5UhIGz)lN%flGmZT=>NwJmc*u>!{H;h_y)Ov#3W@ys!N7i)bK}j zgkw@!BF9CvP`YUv)Ni26a~UN{4IRB<5gk`!b#;bgH0ot`>FyqO#fknOf2k!hc2IZ! zC|4yl&*k^SbU<{eUk~QzUS)XuD`F zOu7s@sqR1ufv7HzXR7gd;O8ybQ|UZ3^ggp780fSHCoRTZb?h1tG+`b^Et^4d11heSF}TK z!7;fa#HCD=JRxAhbNoC~60Hr-?WsIv{}LAntc)ei>R|`JXoC`K=4^PhP?Xj(vx&27 zn`mEi28$tU%0TpHHW254i}s~?Q+Ti1`G4EY*2ai8Nq6eM_v?jD8Tk=~|Feu!pN$#l zGD@Hma3)eCPNAWn<;SPPEKpr1{Tj6z=_pLoe%S79usMamtb+{f#Y+U5WEVjullqA- z$S_mLiZ6`{q(=$A>A+fO1dy4q@6t5Jbq?3S!q;q@1%j1wcvdUb()E&&yJi!uF%`QUuWU3|F7mBC%=p`Z|ZObJMoS z2CKbem@a@HIkf66#`9(phs>$VS-yJNE}hT7#AKYOK1X-mXvR6T5NyN8x23pTVI!NT zGL2ODmD2e|ndjx1CfT^Z@()J$*dsN>wt!QFQB=D{GuWNgI;4T*@Ur zYCg59vzfj&H(G^I{+oYjFJS*|3*9~~+VEK)cJrO)to9(SL0Dnz^pJMC>_T6^p(R%; zGGVzqMfYaETm>`*x&|;ihZtt+%xO|uQ9=DCfK|!}G5trc)*VCQD<<7aFe*bEFgC;j z<~gPj=vpf)q&1jdnXYaYMLLQ^siXV&HBuUu)$-P2q+@ZE%>aowRxjf=>sEyZfKM8j z`I6$>0Z9T%TdKK@e~kRlA=z&o1_c|c?6d!W%)M!oUB#96yIy#9++RfN8{Vy9pjbAOUh~x+=-WRw$zClmt~8kjx+<5J-T~fY4+Cn&HD7ovPBS z{tEZ^Uu$LV+~@35Rl@GLk1gu#ojd1TbFN&e=pJ@(mSHh594=Mk=&boFMOPnjRx~(B ztCC1pSZ=`)rvG&=Hw@2f<~6TOFu5m)-fB^(8DJ(!Wp}o^lkYE~lWZ;hnjY0wNi!!B zvr2?eS{BqO3{CXZp&(h9Gf{FIWD0bpmTLc$XXLS`Kb`-8IQY|_{fTHC)icCC#x}4D zKc0BRwTUr3VVj`-@!^Q7opR7$9{-czFVAe=qW@CN#~}>O&&4Kf<{1E~wwbBT1Q(L1#b|EacBNDbhCMmR8Sp{EAW@;;d78$f6nC zZvMl@&py_91Vkllh zo_*$_>e)>O!?2uzEs7m3>5idG1YzKushfexDranM&qXHg)P@>F@UG!HlSCLQJ7Lk+ zZFqI3aej)4`wfMf3)7IX7!b|xCkPrVtwgWFhl{`l8+h-}^3mrR0yM<&Z$dS}yc z4I)eIq@=LRk_}mTxd+)$k`E&Nl$S&NNP~5EHBU}}DqqV;0k_!hhB4GfJMb^gQTl+b zPPnBLYmPG8>`$;_b0LVBq55XYuA{_#>2+?k1N(-EN8qMhK!Zrvt9yP>O74CCSGea| z;+X%nb$5F@+-2M5Ejpq0@@6)eHQPJz{Q?1)dW-XyIXP&2%XWIz3z53rC&u37d4c&`;g%YN>L}x)0yHq27(kp}T z+u;329__5v7Eoo~8u}j(sM+}(VVwvl>ZVLsNbRe@2FOPD0k*HzvoQXxaR946u0*TY zNbHZ3S-mDAYtN6V=N9GHUO8+X$BMjY=czcsY+oJ9sbZNXiT#JQ?o;A(n08|9@OM^W zB#r9G3gDEY7bJnz{80j*Y{~9{=xH_JbRL1kHY;7PqI{B6l4tv`pJd4%&;f((NoM|U z(6Ks8Z2JuJiRK_r0rO)K>Ybky&*t%^a3IJ8&lbl|;ok|D^WLGv+RfOvq%+y}Tye4E z7~(q;69;TKEV2>YqDH2GYQl~hK<;lYQ_32U&)6=lo?BHt_fUO+QqSpxI?u_Zqde?o z_{sI>9)8IDidll@*=Ej0gjVagR&K52_7 z*t?DaE4n(7oI%taYTgKl8;n?KXT>}0XJ=(QE@rwj=Il>e2u7#~=8u|~P(RYRlGOqI zS}nyR(RL!1UX-^CQAn#4&fuDR`_ze!APMN02DHL{b#-4z{U)J%Ih8VlRyuWSeTaR) z9J^DAs5oAIHbN?uemvnvIE9stwPlKZw^K``W;?m!ee+(ccs^5&l$fz6-23ynC#dPE zCo6?$(1Aa@uT>8_{;>5`=KSg3@V!2|Q$KQhkj_OJ*7@JO#@Lnp7N2{DJ|yKd>|uoV z`KdvD&}gfzs0X@;`ZZLIBp$oVwB<{#dA^F%#a0;#2RhpDZEiGT01gdLHsmUJIm)S0}kpIiG1<=j=cdQO2b^r!PkeGcE=ABTVY zm*<+NCp{6eLC~CLK!M0e2EWtrp{JgurS#%5)8Ko+VKY+=rtWn6u)9DERMnoVS)rFq zp7y!%W^&!hhp}$gnPlqDZ^%9AL`~{Pog}c0A?PS>dVT`eM}=Y?c&{^r9GWvExzv#? zYD|f-Gi9C*@?@(?>tIGd-kMrXUDTK5_?$S)QSu5h>R#QywKt8^(K;U2hN zcU`5|r@&x4E3|~DpG&L84dkL2xZuP|20Pb~%!k$U&p%l`kEvo=lKZh80HfPl6FW<= zFq&bG7Ro}e%1G9d)GV;oPLxJu>IclE!L629zcvv!dkyk6E)H%yqmkzuSbGscH&^A6boc^h~t(ugv@hQ;hu-&V48~PVcman79b84`j2^AMUwiY z86UGFiEJ#IwEPFjf3R)TLU2T$zcN3W5g7wF$}3J`?A<7+y*o@|T=5!0_mHCg=XG0g zvr&`)me-^0;TG|{jQLn{wqxvF6E@ucXW4Ht`7hI%t2H{~ne5Ik zAR7v=LHsep;%{{k7B}A^)Du-c+mp9MR6pGYT5L6-5OD}C?Ew&Q%Cup|VaZ4>0wy*t z%mfv-@S?jh6gN(*eaV$}`F!k`VWd#VG2PUIQ)<|-W9^a%CtJ13*+~uEv9k$=B;DEk zld&3$Jv%Run21_zdY;FM`^p-w%zQ#u89dK6i+soOLkD57@e*=w%Bb(2 z)GQP7ZkesjplE{iH@O1VuR?Ny?9~bK9jo7rgyyn(L)Uo;OIkUq;?G|0mvj z|Ct}gs+Xaa9BcO<;APOes`9f7etN#L^XHX^AaN@`W+s0(hE_a|#dER<(Y@i6$fO^I zBXCc>#tWYu8?`Bj35D}lTp9M;KQAR+vBMz!+p1)KPRHGVr1aQm-p|05ds$SU6158D zOa8<|n6s0f>8f<&EoXA5P2aS(`4bP?mfB~sUnOtUj)}!OTJoR#Ti^!1PQ-*ZqiddT}vAtIb5{(yT zGfthCS#qjXmP^)e*pLv`%ygHlE7EfLc|W#R=ZVMwP*;1FTZ5``_Xe|S#Pkm)3N0VSx$T^50(^b0o(SC37SVKT4e)9HDu%>Fv_O4^L>DiVg()FA_7=eusj*$LB zhI;p&M?wHT%6a&Zl9B;`ExY~1p;6pU;*YK4WkZ!{baOY2x2=CNLQIDASTG3DN}1&o z|4ISCLZLHDCmH^*o(*L|C`*&WK&;!k70TfuMCAxxJdWuZ7ww-Ai4Jmy9%95F;0Y#Tq#?BM%Yh5gO$H_i`&W{WJlfy=B7RQZb#1TFHd4S$t_ z<4-zQq$fJZ;gi?azf#rb7K+Ebx@~Fn!>-0uXU8gc$AUX+BhRU^+YsrRKS*Qt$FT}q z&g+$LA6mTP?B%|-auo*wUEqSJyWEFrX<#rRWr?jw|LlPQ!~X>|$wFQI#A(=^N~nnX zInVlV5^ZTUW&Mmt7M8Tq+hO35zW=F`*hCbC zwUq}PM_=Zgs*@sn4w;hAeAtd@o~Lc=x1p5s@F%w3s_y) zDEgEh#(3h0uvO=Z85ehomX&6??<^e%07)=;UI)`4IA!tfQ5gNcC65#ea+<*N-*Sw4^a4 zKZ$4*Ii8L17SAb@e(|D|hT~9S*eW$TZk-Dwwp&}O#@kqWbxMvp_2~L-zuo?F#gj8% zJ^8M@o&;keyzyveCcQYsRHe%oXJ%rPRyX9tGsJmYJUXTqM7cKnRq>c{HWHS*lah2p zLN}AiWC8p2y%5syZ|PWI)a4>>3e9Vzv)0tA`jI-IX6yJX@1HFxOn%}h=}c*r9>`Cf z5#cgkY^RhkXC`N6Gi!P<3YlJ1f+K%n^^%Z4g0^Nw|BFZEQ!>+s7f|D+hMF=Zq60DGC!K|q(9_uWTP-hvd#MN(!`Ie)QwIZf4BXjcExtF4fufAdWreLEZy zrbi@^wUx$?BV;-{rC@AfNNY^07ik*YA|%l^TC`4~fbp<^4% z=P|wTCv-tr8!QEJP~qVHCseBPMfsIOzsWr>KZ^fah%5b}QyaJNDrd)SoB5~REq>&_ zXn(1q&F^rVIjdFvqZNxMpX&033fyTfb;a5rN=n)ImAybSHpbs#imL6&iKVeR$Rt}U z{qb;R_Eeb1?9*8F2it^%f2ZKOwl!KgLr2IreIET_+jiiRmDU-~D!qq>BgIr^f%fDg zyLJzACfhwsZ)wYF;GMFu6%&A$GwR#D)|k)J{fIAx#39Pgj?$m1 z+JjFd0I^q@lYayjL|qo>o4>ZnmaIRDc%rP@l)w;fsO|m`RXXuD>a?ik&7RVF<4B7| z?vgn@HIR=YMoe|8^}CA04e_JcAGU0Y*?;_AJWKM-+XUKnoG;@aDP8;Qj{P%RdYs+E zTdzn=zL3ddDt!BC$Jv-)4UZ9ji}t!?%4QGtWn3Azp-dp;YL`&(;<+WyX9n*c{%IjQ zT9A}Yq>UyVParaULH|Ogb{8~3^+Uh?-D3|uvbuvhXH#O{_NfSosl(0sgT!(k&j_o| z;_cYP7_dOY=iCPd#maUl6V!OCTGBwu=$(FS_}+dd0~zGG6KLz^-(!7S_So8G&pGXU zp!3wKhyHcdqmOi+d*tcWkNxh+A9-luWlxN~wtnrh2e-dAw(ObB4|IO?)bEx(9rn{@ z4`cUwpmXnvdw;fU<%(rLThUqhj}P4Ui~oBC|NGJ7!22?Dc}L&ejQ`~SV%K%!pE|2? zXhg36sfyi4E~19RotF`;Y$JKrNT$V8aY+ir!(QS&#=r~O`h#dPA#o^ zpWff=zH?{d>dc-`dJ~6x6DNBU2YM67dlT>XCU%k2>N0-0QxP5heW*60*?~k9bHYw8Wb@%ipzUxhV)a$-W#d9a#ntA`C>gj&j zn>^I(UhQ>H^|}`rKyPB-+{wMY3CiwGrRdtR>L+7MezJ9Ghc3+S`n132S{{$Z30=4K zA?&|Cd;hx=2s z#XNo4oA^tw%ly&FFH<+v`5({?V~(8>-4L)^h9A(CmG^dlk2{CntybPo{qOcBCv5_m z=VKb<&+aW#&(FQ}W&bw3HbJ7*4m zq5AJDa&*u2CRuq}+wTol_q7+lU!`)V02!7y!3)pb6TQi4tAxbk)h|}ud(X;$qr_*H zYdR;;S!HEt6TQjHz3#=zH}~CKq)q)^_p&(q zcbK};V5gZ#fVhAD*xaYAI{3t2=24Ibyb9=*a<_; z2hJC*&}k;wCX+dzJf+@G>`SFUR>sYQ182Z8HItv=u{0#wJk{M0+E%|@?;D4N-Cn!C z!+*=x>(UFH2;ol4WG%pX;m5zW)0sIwnV$>jps{dp>Q_I0$!?S-!lpcb)~ATLv4{lW}3kO2k!v#bJw*jb0@)Q9**?7&=x2d#0t6urbE+ex>T*w@C-7m zXIFHLwjR{GLzO-p#vj_10~bu7NZoggz}OrKksxMyz0dZi{|dzPZ_(z-g&Ob7p1sgN zcaYw79!$^Oclrl`ybsza<=L6HznJ~@!-a=s7y^>`x`DSm17(0G4~G*H0NRWMb}~3* zO&55{z$U*4*aRqSHkjMnS3jLOBoMxH=(9WHpWnXmff3Jn=XtRmVv)u{`_?`MnVY9) z29_Th=F*$N{`J4#J$G^flq~p@A)2!|zRg?$^UwF+Iyrmr&D&Sc34)?G&Pk30plJ%v z88v~=95bA`*y}Q9yuxkv&73&ef9v`%S%Fo~O?@RIGVx{q?PL9qjvJ6(a9rti)p|?+ zZr?aRBfJF2pmB8N3dNdmHf@8ZE5*zS{%txZKGv$;+CO_swfE0|IQ!k1)Hy@t?%oCF zrZ)*wgcO_(det&X;9*e3nbT+P908>M+vda9D+C(4a{TL=>2V+H%)Yl6UmD!8gxyp9 zH+M5@kL9>j6uNSW9d3pjh^`s{ni7(QkE z6_fmd(5%r+2_ie388I;pnsm?*Cjn{qowSak-=kqutO?EuuNLud0{`j28d#kW2Uh$8 z30Kj^Fm)0yk?b|x*bk*eqO#B#BiP+{nDv<{7=-gNh#H9drg6u2W-eVfK+z|b0!qvf zXFmS)_Kj}^(gkOm{iX|}0Wcj$R(4FND^Rvjm46}ET{3>X4rq- z1Z)9@y+be?Vt>_Wc~NzWyDn<+ol9mSVEoO5JV{_oAV`I(0kMRMAs|Q;yBqWu8%9PO zUqrnZM%KGt6cQ*lU{P>l>6w{;)wRHp3_BA^8{!I_k$Qz212Ik_ z&7*F2t3et9Ma%1!@XloRGe+;e7pG|onAVUAgvAC>PgdLj7+Phoi^O={bUg5IiZ4%A8o=abKc{22D)hk4 zF8`Ron@g1id}ltTfFw7d2^Ppn7$1 zIB&J8di23cEQu~oeqac>t9q^~b2eUP_Ch62Hj+#=c0M{)e)z^;im~?8*ZLi)U@!}W z0OiT(zaf@@K)iP_-`ttYvtJLD_FPN`0~Y}te0Mw0VCt~iF`NUmVuXjQ7kV+>(ZY+> z?W=p{PJeLw#uxn)heQ@`d~o~f+l4gdt259c)Dj6ohpM^nZ}s;a_x2!%h@5}bnrW%t z$={HXk+~)$f&kvk?ws=K@Na%(|r4pQHjf@C;dk1Kba z!*qfiS%V-2*Xrg6KFnU&)&B@>I<3mcWgg5S{x5oBFa*poNL1hBvF z5QX4kq9azbb)JIR7nRI2w1P~fX>~w$FmwYSTS;a=6VwLD3$-ng@c|Ot>z=mhzg9z) zkeC(p;WYVz?|PK|mF!o)dn2U+i%@E2ksB~7WI?z+3pUOaHa|2uT!k69H~FDWv=H|8 z)xCEn5rxjqeR_KK1Qs7j#nD!93h(o-;gWk6TQY1-f)7TY8(&15iIUI%A$$%B2E#@Ar@Ce2|^Y*7`E>vwqG6+~Q zn4*gM=l*y5syiROId^)>Iw8!grIVH<^ocuf?Pu3(*yPN8FXk<`Q(|}O8$E7RX~n{t zBq4F~peD7nzIXRxm(FLnb}p3yF?(kJ%opEaUZh7L5A*J9_+~Y8@$k$y6IgBg2mgZH zAXNw92r(bXkM%-sh@C#iuLij=^BLBux}1UoSrdtgOIDQ<*gtS#Zt@lig6-;Ig{LCl zTQOT}sjI$W4NbA9#*3&%2}XYdbmkyN~aJ>uKn?R|jF;gu`yS;_xbaJL^ea$Wnk z^8R1kqtyGC|Lk6p?p?8Bv5#$8jX1e6ow3GW`KZdA0Ap$MT9l^LZGPK(7UN??$R_;WuadUN z);d~662?lhp>-7=uIz*j&_rxQ?^774eN!Cd#onBs)5E@*D_6{LE+$t4{(Mb+)a$<6 zSt5{$seYktW#|%skQ@>xo>Gx~y z*}?&DVyoh&DL=0TfJxvt|AA|6%#=z2}koP~DGzous@$9~*NZh}hJ# z?_BJE##FvDb87GG1r$=BP~>Db-(6a43I!5ZCifbPgCL?oA*W7Nv+rTFKRovxOXgyv zpyo4H6~;?Nre|w$5K8v4NA{KNxjWNhONKqx_?Dchk~f81yOwboAR$wK{OjbGpf1+V z3yqt&@li-#4k=xCfrW?Gzht=yLCP#q>OIu~$AB4ZVLG*8+_bItMg8t-FjPMxlq92f z`crSs9AabItLnDSg$y)0A=K_$@h|mMHTyN9vU=!4U4w^cctgE^30KL+2=e0m?Jc?_ z+-iwWJ|l9y)K#rBS8j-QxXvN%3D^JzHFfiTGXjOR#1(kyk-!`@Yapp<8!O2Y*^%ZU zDzJ7L*BajjDR=WTP&h=}hjWw_wg}Nl)U5%sUD7SPIUoM3BnwwpQ6r_RDNl`KcG+dQf=0_BxGh?SCHAI9d! z=R6-K`X_U=cvuZz?FF(;23V{scQvl10|hL%*SBzsqnPce`plXU3P0QckyVU8{96+p zmAI^>1CHW9{GatdICCGoP8OkO4+Pl@_ca2%6ad;%VdbRdo}; z>VSARlkR-{N&mukv!_5KxnoxSi+?d~_<%S>w_A%{A*)^qAA;I@+Td)IL)qx+0E8pH z0+|A$ANeNV_{7XdUuz2iZ&UY{#Q97c4yOcC6X)+7+S@<1R~~6aqML7*c3?Bfv3uUG z&AxY|KY4)M&K;}pC=`TZTEPAW2-2R!WS=;aV1yINlnCTp`UK^zn)`D9+-b5U=zhTy zUd$ih9KhSxW~{kxI&PGZ&KtR~NX=Y+KNm@LrMgE{G4tVJxiP0)i>U7}hh-w1vmebQ zRu^^+-9;ScWUn%?`qJMh&eF#w2l_`*<=K}A0SLU(}-33r4I(W^ACzq9?_ zUtsUaBIDn=-k_dNMUX$BYp3vqz@<)o*{YsfwX}K= zfOC|Zu0)PxrbRkOj7LdnOB!~EFUx_4a5tw-U^4T2jru$XqyQ>+^dfd%<}lnC1*8l4+3I z0_B&|32Hu3^-oNLo*bcwZE9~&M=DU$xTsm~6-eC4yA7`t-?<-&jfL2ZMc5AVin+WL zHDv|Ec+KATsgJIprUr?w?tJ_X2}dQLbw9UVGNvA8!d8!gvSqeqN#5RGejv$>zC(gs z3FI)#;mQW&+Qb22*lzUk14(97vBLBTehWt94l;Z6*z*3wt)=)2$d%ZK0sA{%KN(Qj z(x*W)x(Ocv3&bFlmlIi4Dh$KIuhOQzTwGf7g}w0VnRmE z!9raQ$x9(stvV4@8Or_S2dD@k(aKE=xWpG63=Lmfv=z5Sx}ks-t__oIFSA!pv#}Ci zVgSi={cRk;={WrqM8EkP7O)3H7&~Qw>V2 zpnkEP7s+FoA`lCT50cdk&mb_#CJ@`3`Q3Ipi!xYi<%9{9EE6%oqmUx~ChbzMvdf$K z0(s=Pb^>@cdsbc2`F5kbyfAnMmg)cAp5zxusWYszLArd4CQ&rouR#>k`Hc8-=g?p0 zPM(UF7Xl8n3Uu=9i^vSxGqVmt{nXj)UKZyb%_xKUh5j^Qen`$1t)4hV*Rucu=$Q;+ zP>DR|aaYI}=MIL{;YFAL#SNezteVjvHHMIRTr|uM#~DaurDMcq;h@L~w`t$}sl@T8 z%=bXYP?#y%9Gdd#$iiCa?r0?w0@Cf0yNv3_P)+sDk@}+=rAO8q znLo5%8QQ>4=RK?)+{ncN`k#AB9)Km-gF$migtg31Fvw9*ke!uvI>z^|2Z%)y0NR&i zsKH?qaI|gIPV^6Jk$Crfvpe6J3P<7r@COcQ#*N!LS(4Z_D?RytGcFMchZUt)MqiyNq^rVE!|Q)+VLfmkuu# z1-g4@_k26En@JW3d4?pWovu%*>1z{s?9|l0ndxuuoY<4LO05gbm=A6g%CpgV>INcy zB3}WKm6-z|o=xRlk|c`+>tV(aIKMPpOeo!)SWXZvq*0=GCE)*MxpB|A~2 zMm}c;%twfRK_E@OrKzO%4NX#AV8I&m`Jh^j9Ij6E2r3G0ARjwRac0F|I9UDlv4V_6yW10}^0`fsK2on9?Z#XSL6QfjjVgJYbe>pvKS$k@9 zIj!f=(C@CsYrE&G%eknnjbsm4swCT_jKZQ|)2DCFeDLwtBiob(uQEWUP8@@*Ac!(nxc7jkcTAvC|vt`XzH82_ALENU(B3i z7dCe;mPc#Dz#40nS7zwLwcR;M1#`v-Zky_9eABXvCv zXNd3vgGH}Z@87-B{U=VesE3x^%;m)@uOjgchLoGB4gO$#VhaPgsK7OZB^s_Y5Q%TW4gj zei(oVTbzGMhde@ZsTO$mQ%eJxWFJIoc0ueSR#o#_HZm&AljkbzK%}sAvrK6+C?^-n zl*Zzriqc=1AA;RT$WPV8laa~VmE$K%Uf;ZN-Ah~oxpa(p4x&2zJ8NDTPp;ec;N~|v zLjP`@mXSA!4rI^_?ies>>zh#G3Tt$Mu4_s!k7s`E%pv`kch zR(h1mXe&(;q9tFktH$2MCslu(EhOX!6dPb-ucMVSZG#xKuXg#}K0JV0&FJ=m}k=sVEJwWtYX?0MDkhK0>q>6(; zypT+xv^2y}$Ku+o>smy<_t4>7fyBrItO>>?f+(VrC3w(L#a*_6r- z7!ZSH>+`CAexJ_Qh?qb|T;Bf<#z{;aeZZiI&=)U_TviuD_T_^_YeI3>6fpBR_(g!- zl3YqKBXUq>Yf(+A2}mP8iyqUWi-lS%@S?>`m}+5^$)bSNH=isuqPXtx&OVnpiT$ z*Y3=P8sBp2$f^cEB+^~Z36uvkaO-~(Ez&gkoV4aBxI9beb5OZ*6uTd>>7P`l5vhZ@ zhOGfnY3vY`MzyrtUr48sl)h+*nFJ#|?6!o-t~E7*PS;LiOh#;?!PJE3nQ^4-qd&NW zr%mOc@I!SjoMU9skslVWb2tY_DTuXKxwBRLa9r1+Cc9w8L8$!RAYD0CguAf%)wS_q z?#r*R2h~Y~{tLO1!4CnKqA*B!5VAs!$%WceXC`;|k6)_W6c2|ivMZkp(%RgaOQG=R zR1L(ve-=nebQq?1wyw0jH)U!ADcgoND9z=5h|A=c5xoyN_-uPC^;e^Ya9qq6=mEJ_ zBzy$%`OR%-QLJ(S(eYy4dm&80Q>E*(eQmKieIGp-AqcvsW)@DfcGY|`64LY@PUsVS z4ez!={`W&lBz|D3uINQ|XAfpM*IOj(z(0?=914dtK*Uu8PmT-U^}pwXbfgl)$#T;8 z?i79}a-E1DS671nN}pkF(=k&dh8mzr_JS|!@@R>j1NA_hkx!Da;veM}#Nj@Am@*T) zz$BOS?tO`Iby43LYfbh|Z-P8(W%fIgRdq1WQ+qXz{O%`Giudso^-B*HX&y#(67KWO z^5Z9p$e5jtVGQ&Dw85QV_6lzG`S5FA)FX}7ap017TBxBQ^Z#1?yC)_3 zmP3cb(8nxi%Nn0Qv-^rM?K(+UdID7RVsdtEI)DPnj|kT_^i>c4_MxY$ho4;C39|!A z*TCEARUNC1LP))`-+7%>MK{2V{g>_>p~cB@1F{SClQpC~-jDchsggsAjJ4`FnR8Jv zSubHsdJ?6W6b!wx| z)|P@0r%reP*P;ULRj@!taU`g~PJF74mvv)#^A0#YF$asFvCX>1C&F|+aVpGKrrcPi zG{c<1Mor|QF+bj6K7DByl1jrGngA>1F4{>+17ph-=T>ZPwFYaHlvSV`!+hZQs z4rS7jcK)6JEqmgLWe-2x`R#8X=sfYn1D(~YmqLNrHPIgSNV}#tcXv%Jrry@QCK|&) zf%6&BgyRTop(=M7&^gf+Q%*!FYRB8zZw}6Uax}KC;4-$a=KA+tR;tB>>PTkDRvOmL zeKf@;?$vi%#AGw1MG%p}j1ZcCkc`%88i99sC!0ztB;2Hy?e zO=c06cs|B`ym~=r(a(R#N(2tqbvX4?+yOs%Xp{rCM>#SXJ(Numorkf_SFG_lSleJB z4oVUo@Wd(iJe_^}Ek*#LTDZBvVm==0)`x~9#N_xUk@SI{iU_t%%3$Y4*QSO{2*uneEno<18aU)wu?QCbzIpiGd zP&U@?1OYg@| zIJ55f9_Yt(AfAf9zLuS7M1y3pZP_mQzF=kG_|7P=MBBO_6Yhw`7 zzK)(^f))j`Id`KD5nGRUZFaUWx-7TZFmgY6`JX#+B0FvC{A&BQSC{=F9ZPp-=X$-x z9H%vd;#d2U`So;)Pa%72rZ$}&o4F`u!hZ=T^-d6Zsm9}c9HHJ-#z=0 z!UqBJ??IUX5~kRhgou?4yF`;X_& zUCHvKNOjsEpCxW^O_uAq1iEmGd!J_DHF# z8neztjKhntU{dI>4kcmvZ5EPT%_z}foWGnh3V5xVDJkKLNKHyh2{5(#yKt%jmjO`_ z;Fu0D$#ekv>LMrIg?l@V4X_`cARSX{@o2F9*WujF;o+e(ygwA7j)NxLvHr6IAWnJ#h&P<)lJ z7nL)c+YKKulu*;@3L2NH$<4G^&`5>A-+Al60Pc5oICb3FNu9ZX+TGcqJMDIMl1Oki zj5Ou|ivTKTX1PN!0+*)5NlaG7^V{!p-T7>z@#O<6JJ5}UQF&a0*yX-j0n}L<1U?AC zG<*KAdjQK}U3*%NbxHBM!~4W8>y0FZEH5BYd|(6|y+wpH5%a@rQj**CVRGYLfxL-) zOaWf$gNvWj=4b>DKqMmtetIRuk9nFI@J-UPE4S?%Qa%E6PL3PcQ>9w2W;q7<_7{N( ziKkY63rd*e=T3dj=sDEo;Q;asNG0f`3%A^KSP{J2{D?dgZh7N--JC`MG6M3t{Z^y^ zX{&kg$vVrb+fl6g#cz6!vDoMS`D=o;GO1?wPz@>77Q^1hZ)FVGp;plP$)3z1HYuVk z1#h+RUV|%KHzOI5SvwK1o;)8CGFlTXBlVl>ja}nWquT^}Mj2l9Sc{XShi*Y)i2!c} zN%im=)&?`z^czNU6}Dh1SfFG!I2|_|B4)&FjBP3T1htIMNI?q>pO# z>c=}_2t)9TOLUq#W;!gb`odVc8Mi zc|m!@v`p{d)6*|jtDk$cL!seMbPF^ohCMolL~G&HlrMfVL{aN_ZxYpu)`3`d>n}QX z^8qT)j2RpQr?S&ts|wj%@xSP5Lxvyn3UsWu3%z$f(BW3OxI}IzboOjnS!#$eLWQC^ zX!$}lM##E~fPT6r!!IEs7GjD(qxF$@?FiZqX$QGT?w=mkG3Hl!59 z5wc$Ql1;Gus3OUK!igzmLvheLO!VaU3fMt~c`!Q~N3`rX8Y+SZ5h3W`4PxgZM&mE5 zQ_u1K(N)yJtJAX|U3CXAli+4fAAx}?i}?qF1QH5y={N+T?L5EkW!CW{bPH3-3dj!Nm{2MSZJKlGVqxxvva*7mf?aSF>mJbX%of(h?51v>vbTE zn?oL>hWr)~54p25=yAkG&}n&KyygiQHq=J*S~RL-yiUFL7=MNO0kko&qO+F!(XDH? zy#8;GcPzU2aAlso5>)^*q~@OO?>khvOCV2%4=ml+vJiBy%YwDIZxee=ZM(cYLu5Kc zPG1`pYBfUB9SM}W-axJ{{!=1pOA;6o2lz{5Ry3eJ1X~jU*IjJT)^`6>g`Utgv@a#p zMuwa?Ma#YJ0h@nOSf_8mH}i(=Xs<0E6y=@%%`4bEnb3hu@ETS~7-O3+r;;##eu(O% zI^68Zau@Yad`av;9eYWcD#EwTefdfC6gPXmwsqZVR=VeCmz+R4++~KH9Ss)hlhhU9 z5UDb0PufR4O_ie@$N~4H+~+)6DnkiTqa+Pz|6H*Od`FuaQ+tLM8N?@#*mTLyD%>7G zEMhX)Jyu4TPaC)a7k+6N#Y5)I78@fiX^gbw>St%k(lE{loqdDYtW*1D&$&CMuRL6J zfiXjvHmu*ce%nj7`R7++mGyaNt?tvQ?jKldQyP?%qkV^KHW7^(Ot`J1QCu6EF-x!a zcS@`fe8gT!J$HnoQh)+LzrB30MyHdRW3d!_VCjkBs5~r%W5~=hStb?%BNcwdFtlwKfa=Ml{hzGysq!b~}6pAr;U%BX>jl;LTAs=zw9+WyWVPaI_DOsE>3NnL|iM^Er+ zfa)NGy<>6uAYLG#L9vd6H8cu?Atn<%qu}siD={#IiiAud(LuK0%%@a$iZE4Z?3Pk?q1bu$~fqU5`z7B;$(w9trwC$+NZF?u~d3jnWR z3PW6aH1o-k`kf~XVQ^k-s{4DUzsSY_c`*zKoB%2>!vI+*XmCtnmh9Ip`pwTS0=zOx*FL_$Gw2Y|6CyG|g%$oYqnme)kq26F2n!EHV zb3NEi|4?jT59JtWxAOf3NCG|DJ6vI9H$lT!uni727G>}5i%bRrnQ;SDGX;eS2@S25 zgLc_tkHH`?Rz&q$!`v!^0^(5wUL!=v*?M8qTwr6gN8#HCR-C zdAOS5>*&U9un_4mulmTLxe#sh@J^FaC&^OQKSB6mPT9rJ#4X^`ib}twD2T6jQ>mol zGuP0pi;YwZ%G1myow$*wwd9m%as6DvR@L848{T!$+meckS)J*!R=p2!rJ>I?R}D8g zQQq4BSt8;4U+cWEg!MC!&w99CeH4=xZ+hH5Hnhzu0cFfHV_98kR-z~|Y79WmsY&*6 z;d#m8#8zoa2ai&&1-E8<*VgX*+;^XFz}ogOqz9Bv9V7i!()vNG)SYS`d!bph(2tKy5I~WwS*NM_{>T@|4*M|;^0A4OF`xLk|gggQZL{<X4o4B_R^=k7&vVr~`Qqv9_TxdFNvUzKo zNjU;~BghyU3a|~rV4%2`-|Gc%Y_ol!$#IQN8k85xnY!QDuw)Jz`bJ*tkgvI>Q4XqDJ)Ob$`u{?32_7~-EiKizjl_q@y0!W(*KrLvlAER6q=Dx zf=IVgw;@<`;muk*VTXL{x;4Zi+q!PcW^4}Wn4y*_Z}EqFZQL9^NMe#j`j`gBK(u_2 zjnGTlD2*mv+SQ^uHulQa^;_zWxn3%uXWBKLZrK03_sv*75DBcpY5)U?0QEb_-G9$~ zRCj%fxte}F_LQj#AF7DJMESvh<5gh+%g?^+=9z>L)$EnO6mJc0XK179a`MU@)fT*~ zk%IgJJj0(Fsn#8OAf7z%4d&ixf(n|gkkHKWA~y(v)B%Tt7YXOHpePaiQcj6`$OWt*b^w@A zx(MvTn(=XO<=EfI-@kf+tE{l*nr%$`pO!O*=^Rt*krBjOaYI4<`9=?{4*&v;ZVVL= zO-b9ws9*Fi`m3HoI>mVmsZQyExoUi-gr*x_z-)eIql3sISa@$7SY=nuXN}3tze2#t zQb0Y%T4khZ3YXn-&Q3o97@Oml!Mx=TGV4uzOEczy{;P0d^PkR=XE|J9PHpyR*dzAu zUN2x+WKWyBhlz{$iHlAI`M#us&oOU!0NMtDPaw9roG(AMY_Xyh<(Y@Ml^0;6pdbzvRr8CM<#k)(Zl^xe+-KPV5hN2-GFwO9toc-7kLN`5O zZBq#M+EefN+CW`|k%uZ9u@OmwJKIJ_8Z*~6VMm;sU@fIzJod;Vk92;qg8O9t4H5!H z|1hKjbq0{%V{it$Vcw^?s`&AH$u@);q;#(#WpPFEK#fo#n5}7jHjxHVKtE#TP0y+c z7Ld@jac`!2>|Y=07@~qybc2k83F-sz1Ki`Z|emOA2v2+s40Kavy14Q6kMixTGJ2f8rX&$e4n+8WEPh?m@7ur(qQx(>5s*r z)6FdNw&`YZ1&i+>mip~rE^~LR8juLcasmo8GC_`x&`%%>8KUI^D>|@j{ibDvmU--{ zRZs9|Y~3pZa4|Z`m!KAga`6Q|l#3R%53lCvW+|S5b|_bx`N472=9@Ie1v*&|t6Ak> zvAeGLZbm%Rh}{Y2X-lbBMUpKy zY{y7DNg(cwxUZ`ksL6i|e$9ifR5i-Ku_iQXA zMM^@olmJoSWS%U0^!(~aA7go4mV6fq-C6S5_D$HH04UmcsbZCkgm zqo3(aPNNCLfTn+yHgVl`i*-dZu`bp3DYoQy&klnF%ipxg*ru7Sjnq|yA4Y_n%hX>0 z)b1Py<_vnZe;abH#61MYxs!*a6d{3xb>c;$1uMq>@bxo5voHT}_dqLZU@Yj!=sad_A}6@3$4N)LtEoy|###ROKEER|4g@IBOzv}a)U_j<2k z-lFVE=eYxjOpQtPFs20>&if6GHikDF8lMMR8Qf`TcwN0`OR?binQ;)L8P5as+? zs$k(%r{4{2W4OY|#0Y$kP_48z5&2-P$W7UuZDf6=iZe3PsLEU#H!~YZ<`V^-1VQN? zsEHXDza{?eci*WQyFLh-r}+-|Wub57misguEl{Ge-7Co%H+lzrLJ44vVYo4vaH#bU z&rv<9E) z?)BWrm{V~o1|2j=E-D=u3E>6COn_KS;jjnbThWPNSlvDOHcbB*JNE;cNwUFauUkPM zR`9iJwyoKTWY)2Mz}}tN$e;l*&0oq~Icmdc?a>>IsrYn(n}>auLo7^k&KJg>OjIk} zLlQ30xP$*5O_7YzOuk7cW{>y7njwX7@$gF6G*&6H4OI^N4)Zg;!pPGOE@tMnYh=LD zavnKY=Mm&NXNUHl!pg@nuz}35H;;j^ly=$_1IjqcCb*0&{Q~cg@?7T$NuOXBVpm!ZQZ(gE2dI6^ouPZJ|LAgMxTaT;(l8x)h2o^IRyk+qkhjTg}OK8yA4Dar!vm%U0 zD2&SWz|%%P)@sXUt~Xh~dDG6N|IB&`yK^bb$lTet6R@Iw#2JRc!4f;A zx3d#0F!o~-`(-9aHN@7%)|YJGqHgkm#Wk4UP@jw9G?8LCCP0ZEgv-1T09wo z7xU1nDfk$t|w^Mswen`Oq)Np!0!G0M3+C0t8&*!AEt*7C<`~F*XFy z{_d}AJJ-iruD%=uEB)z|>|z+-7fHpwUn_T^#;6=;efC`92!K3fZre$KmvkN zCq8I2QR{ZTV}0!3JOJKp+P+}}q=7oHSo4oXgiJ8c5G@>MPuIFzO{B;SXs|azHYE4q z9_ieo-3Luo)F}>=)?>iq8M&dkmCIF!cn$d^+7*sN1j$|BJ? zAbdeiFB(QCZpm%g{g!D3V41E9H8y4zS9am*MaveIOUq=ENv70U2xyzra*pgch^#*t zQ{D{QkXC{b@(;l~PPWThWOrlxqRw3XG+8@h0+Vlb1{z^$z)k5@&E5iJK*){?D`Ue5d@5=QruU#|0iNOgd z@Q|{ch_$%sm}`crikaxYb$#aJFK%Dwy5d*3bnMqaV*2vQa9U#A$J6Z4{^6mLCDmlH zTE2s<^^CGlQ)dw#%75T;S}7@*tkL&5iv$XkNpvac!toSmC-S==ju`!2YhqTVGK=D} z@WGvTs@pf-XIgll{r23GPFqUZBt`{{G~eo%EXJ}QB8GD` z;m$syi8$wiZ5_7;bgx$q;RbieCP)NGMt2-|x`PAy_fSRn=3a9{KWh^TT!3WE`(^k} zGKSjnbwL5>wh2~HN@!pVlYY}Mn7r2|3l6lINFhBfoZZtL`iw)Pv5(LdiH*!9|B#G? zMFLpj+~fGnmm%YadPb|~XHTEM^XVsUSquA`*-PA`cZo8Eq>L|0xcSm=gZbX%yQa1p z&a%n-+*40>jJ%U@tT(yehVP(uIhS=|Yw)wcQ{n)l9W8rl4Ue#&ykpJS*!tHtty}xj z=9hoJ?v-ssBU!lh#rDorsHhJnkL-4_dVJNRour*h;`D^!NhJjfnB^Yv(T!0r*qkDc z;~ttHSq!u8dXsaf$KC&q4mgKojW5g95CRwn05L53yPuYlp>b~S;r_Y9-tVDeell>u zI{H_T$oBTS)BOV+`<=uDf}V7-a)gT?;obfBb!I-rJ?(sF<^AE`dVNt9J zO@?wB;n6&aJ3Dr^^@WC-as7m91AYmxEdX_4bK$t8)?`FkoY8S@OM}IV?t< z)?Y9fElGyyGGi@{)v11Qsvme!>(Pn;DfQCG{soTtD3@-Dv{seBqv4e zS8`&U?eGSnZ^^yN`p~SE5JO&`fyTirL>0$dO)i^~(6j}JLB}s_hhyf-hFz4i*=uNI zogEuCzp}=xR#>poGf}Fx5v7WCfUf}F7gBWE+&v_Dn5qi~N1_jHL(Em~gtyhD8`r@m z;i4GI@C^DInjLv^yeFE<+F zit&kcZ>)J`n@z5$s!PN)JFSCSw;-lPW@Fm6xaSUPqXUotZ#hq$eeIrD^$=5wOaYxT zKc)o}7(?fgXCGU3-!JNelk?cJnG+Bc-td7<&Mw~B0Az^AH9kEYZcBRNnP$iG6ptMF=TFSwA5atJ^-)SX6J*1^2H&fB{!-?5tXV_xa%;@6GD%Dz6 zFc|H}m_(yO{GesG34TWt`%R_s-V^aA;=GuU(s&7p(-@~ug)@kovGW$Y?gGnUIz#o5 zJ3-}nk9kv4vpN&?(=)NM`pK9qYeXt{c6jV+8^*9bI+qTMb$&Ni>f3Sk<(94qs6o1D z@~K3Dj2n_Ez})0?1DP4jn%^TedJvI!8c)C1W$efx{qZ$BK} z{lC2c8zpfX)1sFxwqu$X(GsRG)HYkZATJ_W{#~j;f|)WU@6ZzvDp7Z;2yo?+uqJ17y`w{xcvpCt~YiCL9 z3N=Y67BKFtvKVxoM%`wElh`x-@!|pMTa5P0R8Po)As80DcK7GOW)_!AE_4tmpbD_2 zvMKgLHm-SN{l@JZQOImfUDC|5(;!8QIZMG3J4-fhRLoA)iuW$e9J>^vyMax(RcT|? zNM;VT2gfiZ1UC}8=alny&+GZQD<9wa2&Z4<5c6X4W{urQehnbu)LC{;=q!1DX(XH0 zbKz(A{^R}sNIaRuAZzz&#%?U#x!Q?SvuF0t-JDjWt<;RWunvKj!@6!3WGqrdb|d{`yd2)fUNGjO0xQ>~4GlUP{Tqeb(r%|#qgxY9o; z!HYQyF)f}DLegHfQ&!?YnajDYhD>>X(GnIztwq2R~Z; zAot`@8wujz)!hVHN6=Iv$YTU4UgV(CXxnGK{+i)I7~ZHmc+o&=_45@3W8Uj5gd%X? zM7!O7A}c0P9{w9uImW#A*+_*MqcY=72U5l5TfBf+SN$fg*lCv-+65UKuA_}zcsWTM z5;1%2t|~iTU9)lhhCj&-;Q+cU9ApXc)pklfkDZW@1pcBP z3{r)IV-#^%Z4ospXaM~E?@$q2EBy)Gv`w`2Ga zNTwM0S~sWDxSwZZE8y&f&XQH2OPH=Y4=!c(7dOQ+OlU!n1KH#S*j(e~FFUnSpTV;c zc#)EP-WY|FJa-Xj5c*U!CUCb({~MaAg}ZQMYSMwmTxL3nj$;v?OJo@dnl4p&kUiHY zMQLSi*wb@`_Q_SxAlZb{`HekHFRdaK(hi*lp9eq4WHFrDo*iGu;Ra$Oo_6TVe!3~~ zifKn=;xBcx9rWZQPpne%+qT^P@q!}5+p*>s38?;8I9^`{p_9FC=BQ+pSR%N$jHB`) z4loIT5DG-fstv897dhnHNJ=AZW~@`Or%6MhRS0jYs@zbAM>UM!V(`G|=h0J$S}KOt z7M`|L^(CO2@e?|Temtt2?ErenZz@I@kRci7zu%`<^1PV>nP2v2A&VILzOGVyJb;|e zi0&~AvRnz_Qk?`y85n<$&s&wP;&3w!VYRFPFa)jW3uJv-oWrED{c2uaO`nr$U(H;) z?tHCcb9e3}`cHlQWc1E>&J>`K-+R(9_(vZwJ`w@y3xd*yw^hz``@2t3D^NMCMd5;$ z42S{NPNII)J!pK9YQ{IpDR7{U?1}>MFJJkpl|9UCWCAckJ1~w~A9-q5A#B~4FGd3k z21Z9z=5FAOwFPaA(FX8@x}VHq%r{1fx1N zM9fEYzA3B(#ZTeE5GR3HbfMORTrn!TXFYONb#_6RbibTDF@ZTV2hU*+F$rA6 zvV;<}RztG^KH;c$`xa~2Z5_Q;21FcdF~vsnGe^I4nTIU!Jc!s0rc)s{*fN~F$nndQ{lDztI}i#fq$38A&N0LxjbRl&(Ae!b)Z+f%$VM>h zy@u)74VSE3cHfGBx^JocG|H)g9T6Uo2nMhnFIrl|!F>omeLt_;2~tVcoEhIA|S zW;m4;B4(U!$(2^d)WLm7H6|L1Y$s`H=ky|(+@fFki> z_2a8-v$kQZ6Z|*W13J6*fFUY1akL)E9CLrCSBR7lxZHq3Qj6N118z=RCP?Xch=8y+ z*=H#A2_BxUVBrI^HFAI< z@QkeIxZD!+M#Kwt0^oqi8TNN1Y^aQh4`SZ5aexot@P{U4A_yZx0e6=C_D3%NoSSLHyds3 zstthfYteO$-S==f+N+5INT zrYzy*&XU!uf48(_V+JH`SATNcRwGC17K!u$upm@(l^5B{ZE_Gkj%a}EK{ev#j3O7uqN=(M4#qAyf zUCl}5V!6uWJwWi6^x(45Q@>f=5&CN`0kOl?aKh?;rQe9?pnw_0x>wOiNdo!6n9=(~ zMUHxJI|}KH>$Kwi74-~w#n#2+gG~u0q}@89=UoCXSbf7=+rVoo5+s={MNb7S20B70 zpy|Y*Tsipevm@bC3xd`KeK@X6o%wuNN7!pd620?OIG_ps9jf36@wpHBN8vKU8@Iv? z3DU|m>NYnGyRenlHZX@u2ol7WSyzlIb_yCCZo1cnx52L6&Nf&Aq#LOHZ!N#5(Te96 zBXSrJt8beFaqRwky zJ#tIrTGjForYljf4DBM)sp?9k9C$B)v&LMl5)|5XGfa?HrhO6S`&QI#g+*IkZyQ2| zSmO~n7Fm&$rU*=5Of4&O>60`!n4g#`7?2(BwW-z#CpNTfAh6`{)Z{?N)^(e3dhgV= z2D8Do)U0xZHp2F!`$xty40xN`N#H-O^Aoy_c1q}4TvO`&52`*<`$Z1v?%ILc)%)Wn z5CI0j=%QxN)4RIRJqz^3c!x=CHKc@DlMYClYlUc+9j2_BytW0d)Rnb= z9YT@;`nv$JV;sxDac4g;%w4!N*Drn>-O#(-_NLzSGn@X=4b=!A!B~-w4t4Im@43#B zdplx$-OrY`e7mpp(|x}fUCh4aVpwX-c$O}IK)h}y$k@?1St_LaubUGd!3CL+5Rei= zKfBJQG=ZKH?(k;T@Q7DAcLrkCM$%%WvdqAx_aksD&*w7JP>YZ5DSkRH;7n=wcfC);u z&Ndw(=;Mflep1*8zoclVoy$JVwg^<{__8ivm9 z-rnT9TIueWw0zQP|CYZq2P7p8+4|4NfoKBJdc8JL;^e!SF3pDb(6*lVM&Ie~b*ipk z(k*O>Rx;LUlc?Ydb7wA9v(sldqRkZM!~0bttP-FD+T zxdfc4qVVmFvR^WL??$Pzke*dRj~m9MfRy$2d(s(>*}h@6glY1^N+tb1w8hV5I| zY*;$hNtRoQ%(t&kNy+9ypE%EaDpjSgrrT=xsLJUy0&X7e5|Ug!nhqlKeoHjY>5!B} zoA+YUc{dz09fyXQ^s^Y?4)nU?Ik*f60HQ!lKDQOwPZsdaCW43yd5_4!6ja2~D(xFJ zKsTuisaGPX0S69dqK6=gmUKDcaz&d4zQ4R>tVqo=M4hp-q|D&y&_nG1K-5`3+}DU- z!eFKJ1u0IB|3G>7gtvsuk|>@YwHbX3DT`+TD)V52n4Hlw6XQI&&j6M9`*1A*u_qm+TB> z4Z*}0ND9bE)g?%=YbN)6Giw_Ar>)FZ6PRXUUv)gZB^%cq_)$Ywf9+n`>ifgv@CxEzGo?0z)m~WJ?pw;@p|b zvtM6q|BOF*`-k>asq~V2(10P1cD57>GI1IoGU_O7ks%pxIL?P$VqNthmxv;1Loyp#inmw{{^Z z0s!h5$6zV#ca=L$P&mL+I*Itw&G%7qX1_vJI@SLOH%K-_kLRMJY@F)!m2`P;qm?RsR_?)cm{CzxHSM}VR{N2{kFS^Z47kUAIU;D^g*Z`$NsiFwaq z8kpZb%<@c|=ux)3Mj?W`(tKUhDD_S=;sMN-%e)cvS1nG%X5 zcit|tKnpLjCySPje$Ik-lXMKz;#~N~^_yOLeck%kUf;HJ_P}@AZ_tF8{Xm4kU?u_$ zB(=C?5w(%sU{TW0~n7s9`rlW5WJ9L~WxbbS-T z_y|P+5h8_w?EJlktc}R-zECu^Yg(^R-Cf)BOCLHrwyt^QKX)RS=(j%355{NFH3`CW z7;E*GHJjFLP=WfbF1En=e`mxA45Mj5Pxn%ZLDDr@KN;;gEGWZH5q+S&j_x-GFhiF4 zWbAK*3`k&G8~fu_`|+%sRh<}8qFuoO^W z;Yycwv|htIFA1$!(8d93FqhML@`a?B)?P9OH$6_}gZi%owbKz~>Sy*Sn-32ZZLZHnprUiI2#M^-Z(5Z>M zuI56RlZX6)?`$r_auYXK@!~zv^nt{(KH$orsk3Tz$7xi)oPK8S?koa?qkqs_7qPPh z2LGeWVu7@u>N5p_G~a)}1|Lp=3PgSHroQHw1}C7l1Qr}lvIE}efK+*VWI1(Ei2n^h zp6>ilxMjnrna6 z0UYU>RD{RKi#vX{^M6LPKTi4~m=X1eeE?KQIMJET&pL@a;M#F2J)cbma-_3pwlNjJ zkZNL^?1r8np%2tR(`?mnpFB)Adb8fn>2xE&9PXUDF4eObbF$#GvV>qM z8@Fs&w{$Gczh6rL5;FzTw6b$A)8Ws9Q(!p8=#@KLUre~R(Z1kzUGAEV2aLadz7(6U z@80B;mtJ1;r=?^65<>W$l_tI7t+64k>qJ zlY8y(E8aH%X=SoKgefW)++xyk8BeKZ_G@;8dQAkZKl^*+4SqB^&QxSOkFh8vvDomc ziz7dzSw-nUtmj{i$5l~tR73YYmz&n0JiI~|-@))Q_xUY84+58wXO{JxE!1A`jqi^+ z!E?m(@@Y1XU&5W7n-RPRVaA&|bWQG9)~QHxPyI%ciz7A+Cxjq0`qrc&7Me}B*Y!;- z8HXAr8!smILM-VyBSPz);xkOy^eZE=+Wti>=8l#48N_Y~?HP{$ARTFmZLlB$8&MfS z!amhrzK+PKT~*{Nu#^6?sYW*-5|Xsa5R6Ca)2=Oxa5j0vQWr9LbK6Z$fH3_Q+m4Cv z)|BrKNOJHo8^)O(fZ4d)!fdnXj$r>umcfbl8p(MhiQ$GO%My(DSW4j?LflaUDYUzH zY-#FDlwiq?3iQ7_)89RbBcMXA#t(zYd!x1*N2)vH<8u>NO#6m#F-OO$r(f+PsAWU# z0NUbi3KbB z?W%i!em}iCpouZ?s;raAD?sWitAf|}`OfOL%pwUkw}ciWOr_2Ev1;||$Mqi-!yup| zUJKBRSb5pLxTsJ*zTi=T?T&P~I#LP3EsG~An?Ct(gc=Iz0Zt>(k)07I!1ixOj9Ily zCaHo#z`|KZTC6Y3##WEkn!AK@YOvTbG&ER6(Ct(}_|wc?lTo^m8yH#9@Q0uVwjXvj zc4?a?2Er(R;lTn%e73D!#RK*4bg(}~ltD}#ZxWcAex(%X^8mT6Iff~;gX3pq#bd!8 zCI*JctR8N>Bxqk$YKlMWrY7+odV`9Or~~|*6^b?xZ}8nz^yo}6?=Jod`ObR8>&`11 zh#C8M>Uc0tGj{Aqt5ixCBzK zfICDV7G!Y8iH#<+T~`EJ(?tRy?#L>XyeQ7wd3ex5%-VAs2sI>;I9TN6!Q|2ckoV71 zJgZqu{e`NWZj0xoz1%$FV15njM_#V=C(@#Yo*bq!!7)J)S3Z+vaWZAF?SDS)Hz*WT9u;Ew!_%Q_9MX59o1?_mWSf;tv)% z9voE_1gudN8AHGl%Sl!JN5v@@GoDG5O-41etjGbLGmgug0{j54MkDyz7rlLTnpbi$ z*G38?lOn-EOPRClf>du|$^lfBAX}a`;^g9M-HWM^mQ#_zt&?0=F^5yc)XnL(51C50 zH}OML2f9{PGqRgyrn-}?#ylmG=$ps1+}InUF^nB2pESDVb|$){arL+KBz?m3cdyeV zl)=oFOq^2|rbv#^bxH9)HcGql_I@C4^5Phz)0w}SD&a;n6WpUg~j0DvgSH?F@ z|H^a~`9rjw`bXC1h6S(kRJumhbnh-z&Rc6fkc#I)hkm(#Y3h*ZJ_berktW=vPo6~a zqi4|fU%tGxv;5cELyRj%R{qny_pG?*UOv6B@~1!l>Bg6SsJ8RNv&9wy-#7io5!B$IEgfJBUb5&W+9)e_+LoeWI$Qwcw*T zkYJ-un#9-=YlYawT2T-NVVr}CIBUrTLf)h&WBqPa0jP{e$8@ZdEw&f2HR`t~9ycvE zLq(ocxon?avurd-N&b;f6;ES#~599=%_~`#aa`FjpuaqWKdYDb3j)8CZ~}i!l+h8 zRxXa_l0oc4G`;$5(ng3QRU!@-z*^>9_brzL#!jMT11_;vCa93$-3tbaNMSqT-OuiP zc(i|B!i`f8(9XhabvKF zzdIW>OtK={3`h>%S|ETCbQDOvgP($*HnJoAxPhOubGajzQIeithEj3uc7M+?A1?UH zUM+u58cKcJo@(EkcxN*KPRo*#-6x%;aGAoYhn7G5P>}lzTAWZtBS7k5_ZtT~iELKM zDB0bIEWl)W665n64EXl-6Eg?cTycD>O@>k;)^B}f`+8)ee~A+hz6MSj-tj{a=`4iZ zxEn8K6GDy%QgWO@10shgZ4|^T=8YG>r=TqfR>hz%iaqIfnB6MX@3D_8{(?irZiK&+ znxi^PPr4#<3*9(w={!qlY0ok60Ufltp;DGJFUkc9)GgMdqAQ6x!j{#shGfpThte|7 z9`((5x9Wj-iiIWp>{OvL9W$L8q6TO}J`?MA>!;o4oXmzvxf6_jodpD~l z!-SWWsA>%U*H62 z?KgrJMBYSv@W1WTgHekNc3y4l6ZlJ=EXBvuYAn)ITdl|})A;?^0*VAl_@)2IKKAA~ zmEJl_@CHTBSXx;O4I{hs6pG39*_&Qlzv+!mue+g)kJG2-Q;i+1egZN%&Bc}{TDKnCO$Rl<( zsZqaXGsR{xA;V&%g(U=+KQq3~G0|AoEp%_TL$x1}*R|j_cEmEq9;#RJkeoQ`NwK9asFS;@7iVU^H1I$oX0*s7rsDz#68?cNi6;V~?n#5PqXz33 zXwRkr*DXOsPCF=ajXU)6a&JOF9 zV0(hdiWH;gSl(;JcvrH@7c)sV2*SBrl0Qw14_;*$~rY}%(QP8N^Fuk1p;7h4WJ?Z@sv~5_2GmBG83HT;lmd!&E%-^DrM-WwyRSolj zO44QUoW4VI0YetHA+E`yv=WqX%LM~!8Xy)~LmEm(X_T=-EurCoibjwki6`{%aIYI& z5&_6*DLX)NFhip^v;~VqX_|DqxhGckAlFhaUSE)07i2i1QU>VY}?k&n_gqvEB00DjSnol<@r!>D3v!wa0q+=afKV& zb-;oL6=zSgd_6x7cxTgu*Lw5-s?EO_SH&C^I=dthp)ixJ9a9`G5~9>n27_x{^`0QD z1l)agSuL#W$jq5zkiS?jGk&m>W@*4ma&s_PO|;-_K8A|&b^GeusRyw3!PU;xwhFfk zEPEUYb?rJ+>m;0|!6A1r8jw2aDZ@E2-(jgTLS?$FcsXq}hM3q*GA$7u^e9}Zo4m!( zCnFLl0jt{E6X%*rkXzQ38431-&u`rsKc4jGT|J2(EH89SSk)v`!%(G7%5nJ}Dpb-4 z0#IH#Ai*q)kZP()EhYip6WSxU+Xo;bcl0>prxAol^W1eYo&@WuUv zvvIShJXRcE&7CA!;2QgO0$MS4iHu=p)B_3}DX@CBaE+cYy7$r9cf1M~ZrieX>$aB+ z58aAaYNG=ieynvm;j0?pFbkT|Xhn|6Wg}v;4V!Ljum4ZzqYghaW*e%zld@A~Qd3a+ zW9>8UMZ*4>k8&6RbG|I%kjd~zy)N6}!;6st51xUv2sWEu1w>3p913g(*oMJ3;{j8h zz_*66A69-Cihfu})HgP?*@^a1*gPzH6h0S8a$d|_6jLC~*F@e`u^_ec#UE_av-9CS zi#l)}uTv9d32t!X{EUzsxq`)n3|(H1EyCkl%S;W|&E#~7bNf#=Q zG;$b)Zq2rB>$Yx6-|+{rlW~l%p^J-La2d$VB~&{92G(V1@j@*JNd*-yC657flbJVe z99Xwu&1-R9VoF{}%~@z3#Yie{c~4GBEEn69*D7j|)Xtru0%+iH1C!t;;Q)^HHN-f( z=ySSRTLI-P84cO-hxJ>xZC|tDrB_~;0yIXo7{AM-jWY297XS}O6JKJfppMKYN$b$R4EWo5nlJtKT&!}c-y=5QM1y!(wUAUf4NuET*4R8a?4YtBq9 zhmk1(cE{v96v)DA5WHtmjphCh!=G=_3Fc^T{KF@scwsZs8 z2$EStX4HC%%IGm)lLetZq~y|+#OKk`9Wgw$Xu51mA_crF>ym6??z4e_j5JP5iK>>J z9oR>1x9mA$CJsLOeuARnUc%z`8k19l_i884!xpoHi0|7stlOC^`|Wn|0o^X?M6GKGDLrdS#D3e%rN{qYZD;?aRgvBC z`=>mWUsirtF=}m9OlqqP?ye@fAsRK6RB8(qU9vbBUW|sKYTiT`W<)_45M>6*%E%B0 z-uv`vw-cow`8cEv``#%0*0Bef zws+Uafmqr$CzDJwl7p(h=ZmH&6*+_*4}-2<9JCx;BXceP4` z0<<(umKQ`jkW$?`Lcb~fpUD53*Uw~2IP1daR<9RJsCviTsT^^&8m8ni_YLATd<9Mf zSs}&ZOF+DBEN!=OGY7!X8fJYM^i`h30ca@P#7md=-4)&ooZ$xFl--)#HFUs?2w^?Yokwd&>;;7?ECCW z+J$m-bRHKN7P5Z-?*BTpXa8>7BYg1STL+WOw;KwCq0w&dzL&A6hqRUu82xDZYo-K7 zwgJK?ox>5)0}-&TgrIdVEL*U%61qA@B4N(B$yaRjq_21N=97tO3~zvYqz;;D2c%M( z8F>h$YHyP7)?s9MM{V55!Q@aX0p-qq_x($0kZ{xL`+a0|8<)5uRO{o>;+31b3xlN( zSHGP|?9H{J5Q8lbg;Yj>wY2>85;rcg-JG&1@Of>Kr=5fvq!QI=(}N!IV}fr>tM6XL zrRV7kuvIdq1`L42T=`l{DKI2A!Hih~vC|#O56cSE88tXbr_8vFAd?tNIW&C(oc6#P zIA|5X;r+K23Yd}|KQgqD3w51nlQepPo>5*(YQj=%bu~FQBr+vZWBvRab^mn5AZ;;g zJ@O7AKtwcZMERw}mLo>8ArJuul`pR#_K5)yj=V&^W)6jk&oKl)1UYmFrDi2e>TqFr zSn0N&s4}bXPk{em5I3&m!obKa_EU0R38!II%!|*MGL+4j3he64(dE;qV_%S-oMcSP zcX=g4v~if$c|T2-HZn^LD1o6bF;XfLLg{y|^)b(L(#*v(a=8Y>(D3W*E{OPeq}de+GmL*~1MpK^7T7Q&wIkKZ?RQv9-O{2fK?hv|4% zxhTib9oV2mn%e;yM(1nbF_=M0-1SrrD^gcV6Y&DC?{=Bh-UfYxT>FuPK@k zt}E*{o!ES5!4e~e#f!K=hCt6Sn`8d62^1YJP@nNY9F2kjJ@naVme1mJd*$z6-v)SY z7@+V5!*-_AZOj>3NZa8bQl7Os3LOlN-{1!!d{x+dhqy5GhwEN#e;|=gm_L4e}W-Gr6@IogD#MCfvp==*vZGN2Nw^GPJQD6Wrcx36==_(O%O); z0poZ&*}1qpeYVj7WU$ew+EdIY(~d>1CS9_S*&>DHSAGO4p{CEJi^xboN=X1~vmn!u;@7 z@Kn9J{*m@z~0lKd&yFQ^uL+ z|78c!q)G*3Hjw*sC8kSxbeOF29Hl;h+b-gY&{lefJ*1)c!+m9B=vt2URko5dkM%&a z_YK>TTF7AJIk;)Um>+QZ&cPf$uzT;T+Hf<}u#o2LwRN`!)#rDgaymsq391g}Zes|W z!f6Hmj2-JLaMLtm(C-=@eXqOI6k>TQX|=Y&o*9D4_3L_1!vR%B@QC^+>7_gJiFx8d zw`e#ElAo^BHzt9D^`Yl`kxWuYdHj%0Z6J@euF@6stGLd?ghwCwt6y8@Lwr$tMmT6T z^78JqTWna5n(Y**9}y#svc-2`42W^m3vAiNp@BN3@y>c0xQ&75x z9I34K0OeR{07IzGU}lY}cg`Vhh}`sqU5RH^DYnXlF^{6CT}cXbLl&dwNj)c@&CEIN z$meRU>j~08QyuyzQaC~to7GrN<@I{`O9@_5F`Rp0uOLMR2K6Z^W9?X48TEwfan~;U$!Y%G}C;x{1jT|a{j024ZJ>KY5I$Tx6 zT;x2`!3f5bw!~zxly5~75VI^31|qqDql{7DIyJaGmeTNJ{~=(J{6m^ow@ZXA<^?Eg zD~j+!Su3xyt7Q%}cb-(j(!o{zN@5ojfo$&Ze>O)-&7vwzM4YiVy&z3CYb01PHv@>& zTM>J^1#qFoWrKkf{HzB){U7NV3E0KIqxOH;TcDYk#MHbc%H#Y5e4lA!GnMXD$dBKc za*Lr*mpX0snZ#GWNY2j+?<5y8G=y3_Vl;SlMfMT^$y{!-_;5%$ARpuOa}{U)mwQch z8O{kr?KYTC>GDoMs^UF2<3G(n!5FI*it`h?Z^HdE`~n}cy*{T6v`*Z8BEY#U;jiqI z*-y1VGxNIBA@|)%1-AXGaEn4w>3C|nvIy6c@9F-muoZ9<(N*L-mi$P}TTUFKewajl zI+fkSLn+~MIlyhj3y&8s?C8mZ0c((`zXDEq5%`L3h@1v%`G>uJnTpLfePTxs03v(S zIf;uB4AXbr5CuPfAp7>aGtG?Nx)wQ%DNCLG!V^1Kgj;-FEae4mcb6l;E?|vRQo}d- zEY0+u*AKmZgqOH~MY;lIyWWa2m|jx8J&esaj}REW!>{e%cj%2Hh0-V3|C}3GHieQ4 z*ppai>cv~OOOTzLXxkCC-~E;#kbPCSkl|rlNTu1hsUYP@RuC9+;N^XYrEP!PlO&Or zh7`mLOcF{`t4~?RSmY?^TvK|o+{!jS7n0mN_RB{f`kO~VDqse{F%&AubnYu#%fjvt z=G$<@jD?zp7(jo9@pU&K8rcF8btWF{WydSs+-$v8_RWSpZK8qmtZl=;*%(am!cK7K z+27i29S@Kh7|=ZX+uq?f_rD5aQSQ+t@h2e>moweJ1Yazad}3_ruOC_))m^u?25^<( zJ0sq{Z6lz$*=k4}_&yt}+2{$5#FbSz0HG2bB{YD>umYyay_clI_*crrx|m+8<@hU@QEz-Ufs3#fS%XuMCL@m zF3bAd`vn3kcSm)KO@hx~+x^y&UswlNB6rvXg;LQ%S*1zac48=IPL|xQjzvDxn(DKO z?=t2TQ{p2CSzU-Jqnx~NnvuK8Zpz3w?fQB#SU4}ciJ^MNBvVBU_p%~;n|OsT^HgRP zCb?n&q+wzRp-rP4p*3GJtq0u)9V-NuK9pXl^-2e|=iZK;&o|4g7leztTd&R;L~gQ} zVNvTp?`tT_%Db>mojSMPQDQf_!q8NDN@lgmMu=IM1V&=jd85e9Mb-ruGH1C+;$kd# zcyaOXsjpzti0wo(fVU+2pS+0^@bqd@9J0DPL)W}w{` zX>K+|AMI)ri3oeK9PSM48Fk3g68?92C&Y6$?9IE%G|kkNxpAbEVmH8NU~ZM$YTce~ z8oWcW<}jC$H&L)XG6(iM{3~r#NiYs=kU9FcK9LyErH`Inn zKrOWnl-y9>-LPee8Y&q&zRwZ$yoBWW=ty2+p8&t|v5_)?2RP#hs6%Lz!P9l&n&{zw4FSVub|~=Q0Jq?LDybxqrlzsm$%`<(9uE zS?ay`-0z;EPdpHy;AwFULTirBqzp@#v0;f6FTVKuV)^pe;5{OBP+tHM>=scm)1R0? zYx(6vhZO5A9EJ@HvjVqy09U8t#S8 z;9S-$D^}uI&tomtdN zQcdlcu8tp$-6PEeZ8(o&$S72Y%FUIDUg#?qHkfxCbFt5|%)N(PWL2&T0l{{^?Y81t z56yEo5qsF-pAch9F^1FG`49~y^pJn;m4N@HWP~gX(8!gDZ>yjV6a$bMBFEEWYa=t% zXj9xwc3=v!kiS;ev*uQvG?RNkepxdB-fi5ux$>z9*t2RSM=3=BvMQ2 zUx(u~oiQ+hrJ5Ti^KBO?;uO3)i{{T5Ck<7w!|51Gv+a4!tR9SG-hmRp*}KRiUc|gQ zA3cb5F`GoynI@G^v^hV~n#eHdVgwBwh8Lxf2ff>=$%2h0j=MfxE`GhA#5k`Ej$2AG zxtZoHNh~0Ai6mcrAjlgQtMy2a^cTBc+x_4hZ-X%1Q>~B%D#u;U|Iuj71<@Rc{GZnRgXSG)0MoR5Bs36jV0lg{k%msrQ6+q9>^6Be1n8Nj-`L8`3$w>B zTNkG9LTB|{hDKH*RsMZ$b{ZP;COU}Bg(>qy{`SNLUAkvr^<00Rt8{ z-&^U6Xn>+b8d9z8+%E7r<|HCS?$%*hz93?3RB7!xJSWE36-<`2xf-$X0i+JR(J{_M zVdU&!g9g(Q-0o-~tTv7}^nJDo@E=(=kFoD-51uZ&t7z@sxch{|0v7Hu5^o*x1m5+SwBj=dkDk6)`iudxcVOQay_;XnALg)$hNP zXFqekTienETf1z|Jn~!UbwbB`XPD_? zWwonLPS2O2u^;v6xaZw8Eu+;)JX&5)~1e7NAir9ee6RVd2mO zSizfp%VjnxpvS0#-5dQ#hA>GnmF}X?ZQ;j?!NpI!4d3QX*lml1)sc3GJ~qi9R%Mb& zMSjqW4`(4428<>>C#d+A6OqvwnRhjA9(4F z0~kqPOj`to_)jtTH{<(ECiIx2S}n<;W2yPj3RvO<)?PUMQu86D zEpiE#*`}jZ5sGRWXc?ECVr++2bkU|yqSeP1nzlcO6f%T^5Jf34yx4KxLQ{LK1)Erm zYPdr`^<&@X_Q*TBJc*FW)hnM7UU_-t_9gP?=i5G2DdKoYMNSQ6Cp8+WN=s#Ey`nOs ziXpI(iw7ZrvTP;71w(EQ)tXs_p>=U)t>hp-P1D8~ArDtAYvU+OCq_lO;;WUWQFMld zP+Ag0`jrdds(x6h+!0wTN38B5S1^j?|84&Ak$!n zuqchNdX`YdlnN&0(hys2z012|Lfiznxdw; z&V_=gPk}hrM0kX<_)YN}6BRb@P>h7xG!mv;$f>JXax<2{`fYU#iP;}N*&m-Olc8o_ zehWo8VM>AAW*oQD_B#r;U8q^CoVvdJDKZH!BI}OiLRLzbfI3h|DAF&4ApQqv8Oh~R z6i9cMnn#xOua@V43@lukVR2iQL(#2s0^5iJBUWi{?fm-|RWJ>JnrxLJY6u3Yj8|{2 zorhZ#gR|cupXi+RV<{kB=oy)L*_3z}rotOm>RMmRa^2fr78o>Bbg_6B5G)Q(Tw4D2 zHYY7=rGlLir+-8Z6O=?>l+qo%%{4UGA|hBAV0BXD9j>J`;*C~m8$8`_Z?+w)heG7! zfjnfufS)PL1>$uS@jP35aMOnuqY}Spt)4NRw7CK3KNlW=*?Zu5xpU8v$%Sfv5n!Am zVp9(Cl@ISNPmn!NR!Z$5hkI1WLF#v$`&;JQ2pwE1kS|&p>Bd69(1AKDa7A@mq-gGI zVHK2+nB(!hs(QgLA1ONmAXQZtsN22UXSdLl`0dkcAAOicQ;{7e4>l)5VWH+Xs7@;z zL<)YD)LZLD3c`2apd%E1bcmBgy8N_7VjEQlREKG2g~{25;805u#8|`zq&A zZJJqDX^7(BNP06O!2MuJdgYx3@-8mlWj{T-I4XrFkI|C+(-&RsJzM>9T&@*6)lUga z#rvErulg%P>omM#W#NmpOBb0a{1Q;(Ib2-*5`>!ySH6#eoPKa>7tgxDnuiF^l=!x1 zw_`2A^;b(wj4mZo`hwVJpmllgex^+~Dm-zj~?U%%b#kyvT-|ad09HNW! z75Y`uDWt*qv09NI=TcD+jkOQDh;Pca)7a$+Q=s|SEru0y4H}X_U@;-46Me)mBvm$a zUwKOrQtBcITW+z=%udGQRkt0@fbaFk5k_!nQ>08Wpi4eE=}JdDcsBfJ!Wmtho>FVpQ+|r;E}KGWt>N@)0pKtxH!?e53RvG@gf#D!s9B3()g82rs{I z3B(`np5WOp(Gz1grpxkPOF&HqhDqM;Qr|DTD3+p*3+NH@q=* zy7_HexQ!YyW+MyhA%2CPC&BwoRqu(Ehd(D>MPMj9V&mrV}pwG}cCW0Z0kp{d+D0 zMp2kW8{c`o-qptI*4fp+g@!0?5>^hDz#3~pbEE2ZFa?K^&Mhw;<;AbkI>ebHirmk5 z+K?xEaFw&F>{`>T`3BW-iKg#awXV|CAVkZMX!>O)pMzayUDS7%ruzB~gLapo!i>-h zS@*ATHO?7xus;e?2iy5~x^JYp9m5}8%S4uvgu8lBK9?~(ao1V=>F44s?j2KRn7N|k zYOLFSUtw`P*SBhN)>c}zxBBR4-I6iQ#vT>NP#kAiThfT0U zmKZ#>rfh4YGJhCyI$urb9sVk=RXw=+Qav~3v55+%WH*mxopuzJv*PS?94WN*vDo+7 zw3O&PaCTf}Vm(IJEXRC0PUgERrsgsAI{<*Gd}eUagE=m;XIolWgPA;9V>Amf{_2h5 zO+_Gk+!duYVOGf+oL{H`LV^umX~?DQvY7x|6ZA z?7dbI5gv@09u$0 zpNTIe7zctj>R3e?!0nfYR=}`Wx5cgq2XfyM*7pZHwAqu)kP0TMGE0CS8(9Nk5cGz^ z$hxvV1TkD*T^KbM-8i>V9a1RLQSlmnD5k>VDI~Pe)r{yBUO~8oVSL)f&v$tG<5+F@ z{PBlO_Qz4xxO8c(;`A1PY*aKECxMETbho#`{YoTLObL2PV|maLW_oIx@o|%@F+^HL z`rT;87xokQPud6MnU|=AHc=es$ODd-lG4 zr017@m))oMAt)@E^c-xX*h`#4cqKO^5 z*2^mN9-#p-?DWBM@K520w%tSFi39`fXmW;X_kPY2?K-$;-^hWK1i%l=C*M}QU!*Lq z#xFAOktrEq3jH-w0>lYtp;BEf?N7+TxbCL*Co{7rnb, YEAR. +# +# Translators: +# Jeremy Stretch, 2024 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-01-22 21:17+0000\n" +"PO-Revision-Date: 2023-10-30 17:48+0000\n" +"Last-Translator: Jeremy Stretch, 2024\n" +"Language-Team: Japanese (https://app.transifex.com/netbox-community/teams/178115/ja/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: ja\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: account/tables.py:27 templates/account/token.html:23 +#: templates/users/token.html:18 users/forms/bulk_import.py:41 +#: users/forms/model_forms.py:114 +msgid "Key" +msgstr "キー" + +#: account/tables.py:31 users/forms/filtersets.py:133 +msgid "Write Enabled" +msgstr "書き込み有効" + +#: account/tables.py:34 core/tables/jobs.py:29 extras/choices.py:135 +#: extras/tables/tables.py:474 templates/account/token.html:44 +#: templates/core/configrevision.html:34 +#: templates/core/configrevision_restore.html:12 templates/core/job.html:58 +#: templates/extras/htmx/report_result.html:11 +#: templates/extras/htmx/script_result.html:12 +#: templates/extras/journalentry.html:25 templates/generic/object.html:48 +#: templates/users/token.html:36 +msgid "Created" +msgstr "作成されました" + +#: account/tables.py:37 templates/account/token.html:48 +#: templates/users/token.html:40 users/forms/bulk_edit.py:97 +#: users/forms/filtersets.py:137 +msgid "Expires" +msgstr "期限切れ" + +#: account/tables.py:40 users/forms/filtersets.py:142 +msgid "Last Used" +msgstr "最終使用日" + +#: account/tables.py:43 templates/account/token.html:56 +#: templates/users/token.html:48 users/forms/bulk_edit.py:102 +#: users/forms/model_forms.py:126 +msgid "Allowed IPs" +msgstr "許可された IP" + +#: account/views.py:197 +msgid "Your preferences have been updated." +msgstr "設定が更新されました。" + +#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 +#: dcim/choices.py:174 dcim/choices.py:220 dcim/choices.py:1419 +#: dcim/choices.py:1495 dcim/choices.py:1545 virtualization/choices.py:20 +#: virtualization/choices.py:45 vpn/choices.py:18 +msgid "Planned" +msgstr "計画済み" + +#: circuits/choices.py:22 netbox/navigation/menu.py:290 +msgid "Provisioning" +msgstr "プロビジョニング" + +#: circuits/choices.py:23 dcim/choices.py:22 dcim/choices.py:103 +#: dcim/choices.py:173 dcim/choices.py:219 dcim/choices.py:1494 +#: dcim/choices.py:1544 extras/tables/tables.py:380 ipam/choices.py:31 +#: ipam/choices.py:49 ipam/choices.py:69 ipam/choices.py:154 +#: templates/extras/configcontext.html:26 templates/users/user.html:34 +#: users/forms/bulk_edit.py:36 virtualization/choices.py:22 +#: virtualization/choices.py:44 vpn/choices.py:19 wireless/choices.py:25 +msgid "Active" +msgstr "アクティブ" + +#: circuits/choices.py:24 dcim/choices.py:172 dcim/choices.py:218 +#: dcim/choices.py:1493 dcim/choices.py:1546 virtualization/choices.py:24 +#: virtualization/choices.py:43 +msgid "Offline" +msgstr "オフライン" + +#: circuits/choices.py:25 +msgid "Deprovisioning" +msgstr "デプロビジョニング" + +#: circuits/choices.py:26 +msgid "Decommissioned" +msgstr "廃止されました" + +#: circuits/filtersets.py:29 circuits/filtersets.py:184 dcim/filtersets.py:122 +#: dcim/filtersets.py:183 dcim/filtersets.py:258 dcim/filtersets.py:367 +#: dcim/filtersets.py:889 dcim/filtersets.py:1193 dcim/filtersets.py:1688 +#: dcim/filtersets.py:1931 dcim/filtersets.py:1989 ipam/filtersets.py:305 +#: ipam/filtersets.py:896 virtualization/filtersets.py:45 +#: virtualization/filtersets.py:173 vpn/filtersets.py:330 +msgid "Region (ID)" +msgstr "リージョン (ID)" + +#: circuits/filtersets.py:36 circuits/filtersets.py:191 dcim/filtersets.py:128 +#: dcim/filtersets.py:190 dcim/filtersets.py:265 dcim/filtersets.py:374 +#: dcim/filtersets.py:896 dcim/filtersets.py:1200 dcim/filtersets.py:1695 +#: dcim/filtersets.py:1938 dcim/filtersets.py:1996 extras/filtersets.py:414 +#: ipam/filtersets.py:312 ipam/filtersets.py:903 +#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 +#: vpn/filtersets.py:325 +msgid "Region (slug)" +msgstr "リージョン (スラッグ)" + +#: circuits/filtersets.py:42 circuits/filtersets.py:197 dcim/filtersets.py:196 +#: dcim/filtersets.py:271 dcim/filtersets.py:380 dcim/filtersets.py:902 +#: dcim/filtersets.py:1206 dcim/filtersets.py:1701 dcim/filtersets.py:1944 +#: dcim/filtersets.py:2002 ipam/filtersets.py:318 ipam/filtersets.py:909 +#: virtualization/filtersets.py:58 virtualization/filtersets.py:186 +msgid "Site group (ID)" +msgstr "サイトグループ (ID)" + +#: circuits/filtersets.py:49 circuits/filtersets.py:204 dcim/filtersets.py:203 +#: dcim/filtersets.py:278 dcim/filtersets.py:387 dcim/filtersets.py:909 +#: dcim/filtersets.py:1213 dcim/filtersets.py:1708 dcim/filtersets.py:1951 +#: dcim/filtersets.py:2009 extras/filtersets.py:420 ipam/filtersets.py:325 +#: ipam/filtersets.py:916 virtualization/filtersets.py:65 +#: virtualization/filtersets.py:193 +msgid "Site group (slug)" +msgstr "サイトグループ (スラッグ)" + +#: circuits/filtersets.py:54 circuits/forms/bulk_import.py:117 +#: circuits/forms/filtersets.py:47 circuits/forms/filtersets.py:171 +#: circuits/forms/model_forms.py:137 dcim/forms/bulk_edit.py:166 +#: dcim/forms/bulk_edit.py:238 dcim/forms/bulk_edit.py:570 +#: dcim/forms/bulk_edit.py:763 dcim/forms/bulk_import.py:130 +#: dcim/forms/bulk_import.py:176 dcim/forms/bulk_import.py:249 +#: dcim/forms/bulk_import.py:477 dcim/forms/bulk_import.py:1239 +#: dcim/forms/bulk_import.py:1267 dcim/forms/filtersets.py:84 +#: dcim/forms/filtersets.py:217 dcim/forms/filtersets.py:264 +#: dcim/forms/filtersets.py:373 dcim/forms/filtersets.py:680 +#: dcim/forms/filtersets.py:910 dcim/forms/filtersets.py:934 +#: dcim/forms/filtersets.py:1024 dcim/forms/filtersets.py:1062 +#: dcim/forms/filtersets.py:1468 dcim/forms/filtersets.py:1492 +#: dcim/forms/filtersets.py:1516 dcim/forms/model_forms.py:138 +#: dcim/forms/model_forms.py:167 dcim/forms/model_forms.py:211 +#: dcim/forms/model_forms.py:397 dcim/forms/model_forms.py:630 +#: dcim/forms/object_create.py:390 dcim/tables/devices.py:186 +#: dcim/tables/power.py:26 dcim/tables/power.py:93 dcim/tables/racks.py:62 +#: dcim/tables/racks.py:138 dcim/tables/sites.py:129 extras/filtersets.py:430 +#: ipam/forms/bulk_edit.py:215 ipam/forms/bulk_edit.py:269 +#: ipam/forms/bulk_edit.py:447 ipam/forms/bulk_edit.py:519 +#: ipam/forms/bulk_import.py:170 ipam/forms/bulk_import.py:437 +#: ipam/forms/filtersets.py:152 ipam/forms/filtersets.py:226 +#: ipam/forms/filtersets.py:417 ipam/forms/filtersets.py:470 +#: ipam/forms/model_forms.py:206 ipam/forms/model_forms.py:548 +#: ipam/forms/model_forms.py:640 ipam/tables/ip.py:244 +#: ipam/tables/vlans.py:114 ipam/tables/vlans.py:216 +#: templates/circuits/circuittermination_edit.html:20 +#: templates/circuits/inc/circuit_termination.html:33 +#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 +#: templates/dcim/inc/cable_termination.html:33 +#: templates/dcim/location.html:40 templates/dcim/powerpanel.html:23 +#: templates/dcim/rack.html:25 templates/dcim/rackreservation.html:31 +#: templates/dcim/site.html:27 templates/ipam/prefix.html:57 +#: templates/ipam/vlan.html:26 templates/ipam/vlan_edit.html:40 +#: templates/virtualization/cluster.html:45 +#: templates/virtualization/virtualmachine.html:96 +#: virtualization/forms/bulk_edit.py:90 virtualization/forms/bulk_edit.py:99 +#: virtualization/forms/bulk_edit.py:108 virtualization/forms/bulk_edit.py:123 +#: virtualization/forms/bulk_import.py:59 +#: virtualization/forms/bulk_import.py:85 +#: virtualization/forms/filtersets.py:78 +#: virtualization/forms/filtersets.py:144 +#: virtualization/forms/model_forms.py:74 +#: virtualization/forms/model_forms.py:107 +#: virtualization/forms/model_forms.py:174 +#: virtualization/tables/clusters.py:77 +#: virtualization/tables/virtualmachines.py:53 vpn/forms/filtersets.py:262 +#: wireless/forms/model_forms.py:77 wireless/forms/model_forms.py:117 +msgid "Site" +msgstr "[サイト]" + +#: circuits/filtersets.py:60 circuits/filtersets.py:215 +#: circuits/filtersets.py:252 dcim/filtersets.py:213 dcim/filtersets.py:288 +#: dcim/filtersets.py:361 extras/filtersets.py:436 ipam/filtersets.py:215 +#: ipam/filtersets.py:335 ipam/filtersets.py:926 +#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 +#: vpn/filtersets.py:335 +msgid "Site (slug)" +msgstr "サイト (スラッグ)" + +#: circuits/filtersets.py:65 +msgid "ASN (ID)" +msgstr "サン (ID)" + +#: circuits/filtersets.py:87 circuits/filtersets.py:114 +#: circuits/filtersets.py:148 +msgid "Provider (ID)" +msgstr "プロバイダー (ID)" + +#: circuits/filtersets.py:93 circuits/filtersets.py:120 +#: circuits/filtersets.py:154 +msgid "Provider (slug)" +msgstr "プロバイダー (スラッグ)" + +#: circuits/filtersets.py:159 +msgid "Provider account (ID)" +msgstr "プロバイダーアカウント (ID)" + +#: circuits/filtersets.py:164 +msgid "Provider network (ID)" +msgstr "プロバイダーネットワーク (ID)" + +#: circuits/filtersets.py:168 +msgid "Circuit type (ID)" +msgstr "回路タイプ (ID)" + +#: circuits/filtersets.py:174 +msgid "Circuit type (slug)" +msgstr "回路タイプ (スラッグ)" + +#: circuits/filtersets.py:209 circuits/filtersets.py:246 +#: dcim/filtersets.py:207 dcim/filtersets.py:282 dcim/filtersets.py:355 +#: dcim/filtersets.py:913 dcim/filtersets.py:1218 dcim/filtersets.py:1713 +#: dcim/filtersets.py:1955 dcim/filtersets.py:2014 ipam/filtersets.py:209 +#: ipam/filtersets.py:329 ipam/filtersets.py:920 +#: virtualization/filtersets.py:69 virtualization/filtersets.py:197 +#: vpn/filtersets.py:340 +msgid "Site (ID)" +msgstr "サイト (ID)" + +#: circuits/filtersets.py:238 core/filtersets.py:73 core/filtersets.py:132 +#: dcim/filtersets.py:638 dcim/filtersets.py:1187 dcim/filtersets.py:2062 +#: extras/filtersets.py:40 extras/filtersets.py:69 extras/filtersets.py:101 +#: extras/filtersets.py:140 extras/filtersets.py:168 extras/filtersets.py:195 +#: extras/filtersets.py:226 extras/filtersets.py:295 extras/filtersets.py:343 +#: extras/filtersets.py:403 extras/filtersets.py:562 extras/filtersets.py:604 +#: extras/filtersets.py:645 ipam/forms/model_forms.py:430 +#: netbox/filtersets.py:275 netbox/forms/__init__.py:23 +#: netbox/forms/base.py:163 templates/htmx/object_selector.html:28 +#: templates/inc/filter_list.html:53 templates/ipam/ipaddress_assign.html:32 +#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:87 +#: users/filtersets.py:21 users/filtersets.py:37 users/filtersets.py:69 +#: users/filtersets.py:117 utilities/forms/forms.py:99 +msgid "Search" +msgstr "検索" + +#: circuits/filtersets.py:242 circuits/forms/bulk_edit.py:167 +#: circuits/forms/model_forms.py:110 circuits/forms/model_forms.py:132 +#: dcim/forms/connections.py:66 templates/circuits/circuit.html:15 +#: templates/dcim/inc/cable_termination.html:55 +#: templates/dcim/trace/circuit.html:4 +msgid "Circuit" +msgstr "サーキット" + +#: circuits/filtersets.py:256 +msgid "ProviderNetwork (ID)" +msgstr "プロバイダーネットワーク (ID)" + +#: circuits/forms/bulk_edit.py:25 circuits/forms/filtersets.py:56 +#: circuits/forms/model_forms.py:26 circuits/tables/providers.py:33 +#: dcim/forms/bulk_edit.py:126 dcim/forms/filtersets.py:187 +#: dcim/forms/model_forms.py:126 dcim/tables/sites.py:94 +#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:219 +#: netbox/navigation/menu.py:160 netbox/navigation/menu.py:163 +#: templates/circuits/provider.html:24 +msgid "ASNs" +msgstr "ASN" + +#: circuits/forms/bulk_edit.py:29 circuits/forms/bulk_edit.py:51 +#: circuits/forms/bulk_edit.py:78 circuits/forms/bulk_edit.py:99 +#: circuits/forms/bulk_edit.py:159 core/forms/bulk_edit.py:27 +#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:71 +#: dcim/forms/bulk_edit.py:90 dcim/forms/bulk_edit.py:149 +#: dcim/forms/bulk_edit.py:190 dcim/forms/bulk_edit.py:208 +#: dcim/forms/bulk_edit.py:336 dcim/forms/bulk_edit.py:371 +#: dcim/forms/bulk_edit.py:386 dcim/forms/bulk_edit.py:445 +#: dcim/forms/bulk_edit.py:484 dcim/forms/bulk_edit.py:514 +#: dcim/forms/bulk_edit.py:538 dcim/forms/bulk_edit.py:608 +#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:709 +#: dcim/forms/bulk_edit.py:732 dcim/forms/bulk_edit.py:780 +#: dcim/forms/bulk_edit.py:850 dcim/forms/bulk_edit.py:903 +#: dcim/forms/bulk_edit.py:938 dcim/forms/bulk_edit.py:978 +#: dcim/forms/bulk_edit.py:1022 dcim/forms/bulk_edit.py:1067 +#: dcim/forms/bulk_edit.py:1094 dcim/forms/bulk_edit.py:1112 +#: dcim/forms/bulk_edit.py:1130 dcim/forms/bulk_edit.py:1148 +#: dcim/forms/bulk_edit.py:1566 extras/forms/bulk_edit.py:36 +#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:152 +#: extras/forms/bulk_edit.py:182 extras/forms/bulk_edit.py:263 +#: extras/forms/bulk_edit.py:287 extras/forms/bulk_edit.py:301 +#: extras/tables/tables.py:56 ipam/forms/bulk_edit.py:50 +#: ipam/forms/bulk_edit.py:70 ipam/forms/bulk_edit.py:90 +#: ipam/forms/bulk_edit.py:114 ipam/forms/bulk_edit.py:143 +#: ipam/forms/bulk_edit.py:172 ipam/forms/bulk_edit.py:191 +#: ipam/forms/bulk_edit.py:260 ipam/forms/bulk_edit.py:304 +#: ipam/forms/bulk_edit.py:352 ipam/forms/bulk_edit.py:395 +#: ipam/forms/bulk_edit.py:423 ipam/forms/bulk_edit.py:551 +#: ipam/forms/bulk_edit.py:582 templates/account/token.html:36 +#: templates/circuits/circuit.html:60 templates/circuits/circuittype.html:29 +#: templates/circuits/inc/circuit_termination.html:115 +#: templates/circuits/provider.html:34 +#: templates/circuits/providernetwork.html:35 +#: templates/core/datasource.html:55 templates/dcim/cable.html:37 +#: templates/dcim/consoleport.html:47 templates/dcim/consoleserverport.html:47 +#: templates/dcim/device.html:96 templates/dcim/devicebay.html:35 +#: templates/dcim/devicerole.html:33 templates/dcim/devicetype.html:36 +#: templates/dcim/frontport.html:61 templates/dcim/interface.html:70 +#: templates/dcim/inventoryitem.html:61 +#: templates/dcim/inventoryitemrole.html:23 templates/dcim/location.html:36 +#: templates/dcim/manufacturer.html:43 templates/dcim/module.html:71 +#: templates/dcim/modulebay.html:39 templates/dcim/moduletype.html:27 +#: templates/dcim/platform.html:36 templates/dcim/powerfeed.html:43 +#: templates/dcim/poweroutlet.html:43 templates/dcim/powerpanel.html:31 +#: templates/dcim/powerport.html:43 templates/dcim/rack.html:54 +#: templates/dcim/rackreservation.html:69 templates/dcim/rackrole.html:29 +#: templates/dcim/rearport.html:57 templates/dcim/region.html:34 +#: templates/dcim/site.html:60 templates/dcim/sitegroup.html:34 +#: templates/dcim/virtualchassis.html:32 +#: templates/extras/admin/plugins_list.html:26 +#: templates/extras/configcontext.html:22 +#: templates/extras/configtemplate.html:18 +#: templates/extras/customfield.html:35 +#: templates/extras/dashboard/widget_add.html:14 +#: templates/extras/eventrule.html:24 templates/extras/exporttemplate.html:25 +#: templates/extras/report_list.html:47 templates/extras/savedfilter.html:18 +#: templates/extras/script_list.html:53 templates/extras/tag.html:23 +#: templates/extras/webhook.html:20 templates/generic/bulk_import.html:118 +#: templates/ipam/aggregate.html:44 templates/ipam/asn.html:43 +#: templates/ipam/asnrange.html:39 templates/ipam/fhrpgroup.html:35 +#: templates/ipam/ipaddress.html:58 templates/ipam/iprange.html:70 +#: templates/ipam/prefix.html:82 templates/ipam/rir.html:29 +#: templates/ipam/role.html:29 templates/ipam/routetarget.html:22 +#: templates/ipam/service.html:53 templates/ipam/servicetemplate.html:28 +#: templates/ipam/vlan.html:65 templates/ipam/vlangroup.html:35 +#: templates/ipam/vrf.html:36 templates/tenancy/contact.html:68 +#: templates/tenancy/contactgroup.html:28 +#: templates/tenancy/contactrole.html:23 templates/tenancy/tenant.html:25 +#: templates/tenancy/tenantgroup.html:36 +#: templates/users/objectpermission.html:22 templates/users/token.html:28 +#: templates/virtualization/cluster.html:28 +#: templates/virtualization/clustergroup.html:29 +#: templates/virtualization/clustertype.html:29 +#: templates/virtualization/virtualdisk.html:40 +#: templates/virtualization/virtualmachine.html:34 +#: templates/virtualization/vminterface.html:54 +#: templates/vpn/ikepolicy.html:18 templates/vpn/ikeproposal.html:18 +#: templates/vpn/ipsecpolicy.html:18 templates/vpn/ipsecprofile.html:18 +#: templates/vpn/ipsecprofile.html:43 templates/vpn/ipsecprofile.html:78 +#: templates/vpn/ipsecproposal.html:18 templates/vpn/l2vpn.html:27 +#: templates/vpn/tunnel.html:34 templates/vpn/tunnelgroup.html:33 +#: templates/wireless/wirelesslan.html:27 +#: templates/wireless/wirelesslangroup.html:34 +#: templates/wireless/wirelesslink.html:37 tenancy/forms/bulk_edit.py:31 +#: tenancy/forms/bulk_edit.py:79 tenancy/forms/bulk_edit.py:121 +#: users/forms/bulk_edit.py:62 users/forms/bulk_edit.py:92 +#: virtualization/forms/bulk_edit.py:31 virtualization/forms/bulk_edit.py:45 +#: virtualization/forms/bulk_edit.py:176 virtualization/forms/bulk_edit.py:227 +#: virtualization/forms/bulk_edit.py:336 vpn/forms/bulk_edit.py:27 +#: vpn/forms/bulk_edit.py:63 vpn/forms/bulk_edit.py:120 +#: vpn/forms/bulk_edit.py:154 vpn/forms/bulk_edit.py:191 +#: vpn/forms/bulk_edit.py:216 vpn/forms/bulk_edit.py:248 +#: vpn/forms/bulk_edit.py:277 wireless/forms/bulk_edit.py:28 +#: wireless/forms/bulk_edit.py:81 wireless/forms/bulk_edit.py:128 +msgid "Description" +msgstr "[説明]" + +#: circuits/forms/bulk_edit.py:46 circuits/forms/bulk_edit.py:68 +#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:35 +#: circuits/forms/bulk_import.py:50 circuits/forms/bulk_import.py:76 +#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 +#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 +#: circuits/forms/model_forms.py:32 circuits/forms/model_forms.py:44 +#: circuits/forms/model_forms.py:58 circuits/forms/model_forms.py:92 +#: circuits/tables/circuits.py:55 circuits/tables/providers.py:72 +#: circuits/tables/providers.py:103 templates/circuits/circuit.html:19 +#: templates/circuits/provider.html:20 +#: templates/circuits/provideraccount.html:21 +#: templates/circuits/providernetwork.html:23 +#: templates/dcim/inc/cable_termination.html:51 +msgid "Provider" +msgstr "プロバイダー" + +#: circuits/forms/bulk_edit.py:75 circuits/forms/filtersets.py:91 +#: templates/circuits/providernetwork.html:31 +msgid "Service ID" +msgstr "サービス ID" + +#: circuits/forms/bulk_edit.py:95 circuits/forms/filtersets.py:107 +#: dcim/forms/bulk_edit.py:204 dcim/forms/bulk_edit.py:500 +#: dcim/forms/bulk_edit.py:694 dcim/forms/bulk_edit.py:1063 +#: dcim/forms/bulk_edit.py:1090 dcim/forms/bulk_edit.py:1562 +#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1353 +#: dcim/forms/filtersets.py:1374 dcim/tables/devices.py:717 +#: dcim/tables/devices.py:777 dcim/tables/devices.py:1004 +#: dcim/tables/devicetypes.py:245 dcim/tables/devicetypes.py:260 +#: dcim/tables/racks.py:32 extras/forms/bulk_edit.py:259 +#: extras/tables/tables.py:328 templates/circuits/circuittype.html:33 +#: templates/dcim/cable.html:41 templates/dcim/devicerole.html:37 +#: templates/dcim/frontport.html:43 templates/dcim/inventoryitemrole.html:27 +#: templates/dcim/rackrole.html:33 templates/dcim/rearport.html:43 +#: templates/extras/tag.html:29 +msgid "Color" +msgstr "[カラー]" + +#: circuits/forms/bulk_edit.py:113 circuits/forms/bulk_import.py:89 +#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:17 +#: core/forms/filtersets.py:29 core/tables/data.py:20 core/tables/jobs.py:18 +#: dcim/forms/bulk_edit.py:281 dcim/forms/bulk_edit.py:672 +#: dcim/forms/bulk_edit.py:811 dcim/forms/bulk_edit.py:879 +#: dcim/forms/bulk_edit.py:898 dcim/forms/bulk_edit.py:921 +#: dcim/forms/bulk_edit.py:963 dcim/forms/bulk_edit.py:1007 +#: dcim/forms/bulk_edit.py:1058 dcim/forms/bulk_edit.py:1085 +#: dcim/forms/bulk_import.py:206 dcim/forms/bulk_import.py:645 +#: dcim/forms/bulk_import.py:671 dcim/forms/bulk_import.py:697 +#: dcim/forms/bulk_import.py:717 dcim/forms/bulk_import.py:800 +#: dcim/forms/bulk_import.py:890 dcim/forms/bulk_import.py:932 +#: dcim/forms/bulk_import.py:1145 dcim/forms/bulk_import.py:1304 +#: dcim/forms/filtersets.py:286 dcim/forms/filtersets.py:867 +#: dcim/forms/filtersets.py:967 dcim/forms/filtersets.py:1088 +#: dcim/forms/filtersets.py:1158 dcim/forms/filtersets.py:1180 +#: dcim/forms/filtersets.py:1202 dcim/forms/filtersets.py:1219 +#: dcim/forms/filtersets.py:1253 dcim/forms/filtersets.py:1348 +#: dcim/forms/filtersets.py:1369 dcim/forms/object_import.py:89 +#: dcim/forms/object_import.py:118 dcim/forms/object_import.py:150 +#: dcim/tables/devices.py:211 dcim/tables/devices.py:833 +#: dcim/tables/power.py:77 extras/forms/bulk_import.py:39 +#: extras/tables/tables.py:278 extras/tables/tables.py:350 +#: extras/tables/tables.py:448 netbox/tables/tables.py:234 +#: templates/circuits/circuit.html:31 templates/core/datasource.html:39 +#: templates/dcim/cable.html:16 templates/dcim/consoleport.html:39 +#: templates/dcim/consoleserverport.html:39 templates/dcim/frontport.html:39 +#: templates/dcim/interface.html:47 templates/dcim/interface.html:175 +#: templates/dcim/interface.html:323 templates/dcim/powerfeed.html:35 +#: templates/dcim/poweroutlet.html:39 templates/dcim/powerport.html:39 +#: templates/dcim/rack.html:81 templates/dcim/rearport.html:39 +#: templates/extras/eventrule.html:95 templates/virtualization/cluster.html:20 +#: templates/vpn/l2vpn.html:23 +#: templates/wireless/inc/authentication_attrs.html:9 +#: templates/wireless/inc/wirelesslink_interface.html:14 +#: virtualization/forms/bulk_edit.py:59 virtualization/forms/bulk_import.py:41 +#: virtualization/forms/filtersets.py:53 +#: virtualization/forms/model_forms.py:65 virtualization/tables/clusters.py:66 +#: vpn/forms/bulk_edit.py:267 vpn/forms/bulk_import.py:264 +#: vpn/forms/filtersets.py:214 vpn/forms/model_forms.py:83 +#: vpn/forms/model_forms.py:118 vpn/forms/model_forms.py:232 +msgid "Type" +msgstr "タイプ" + +#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:82 +#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:97 +msgid "Provider account" +msgstr "プロバイダーアカウント" + +#: circuits/forms/bulk_edit.py:131 circuits/forms/bulk_import.py:95 +#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:34 +#: core/forms/filtersets.py:75 core/tables/data.py:23 core/tables/jobs.py:26 +#: dcim/forms/bulk_edit.py:104 dcim/forms/bulk_edit.py:179 +#: dcim/forms/bulk_edit.py:260 dcim/forms/bulk_edit.py:593 +#: dcim/forms/bulk_edit.py:646 dcim/forms/bulk_edit.py:678 +#: dcim/forms/bulk_edit.py:805 dcim/forms/bulk_edit.py:1585 +#: dcim/forms/bulk_import.py:87 dcim/forms/bulk_import.py:146 +#: dcim/forms/bulk_import.py:194 dcim/forms/bulk_import.py:442 +#: dcim/forms/bulk_import.py:596 dcim/forms/bulk_import.py:1139 +#: dcim/forms/bulk_import.py:1299 dcim/forms/filtersets.py:170 +#: dcim/forms/filtersets.py:229 dcim/forms/filtersets.py:281 +#: dcim/forms/filtersets.py:726 dcim/forms/filtersets.py:835 +#: dcim/forms/filtersets.py:871 dcim/forms/filtersets.py:972 +#: dcim/forms/filtersets.py:1083 dcim/tables/devices.py:173 +#: dcim/tables/devices.py:836 dcim/tables/devices.py:1064 +#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:66 +#: dcim/tables/sites.py:82 dcim/tables/sites.py:133 +#: ipam/forms/bulk_edit.py:240 ipam/forms/bulk_edit.py:289 +#: ipam/forms/bulk_edit.py:337 ipam/forms/bulk_edit.py:541 +#: ipam/forms/bulk_import.py:191 ipam/forms/bulk_import.py:256 +#: ipam/forms/bulk_import.py:292 ipam/forms/bulk_import.py:458 +#: ipam/forms/filtersets.py:205 ipam/forms/filtersets.py:270 +#: ipam/forms/filtersets.py:341 ipam/forms/filtersets.py:482 +#: ipam/forms/model_forms.py:449 ipam/tables/ip.py:236 ipam/tables/ip.py:309 +#: ipam/tables/ip.py:359 ipam/tables/ip.py:421 ipam/tables/ip.py:448 +#: ipam/tables/vlans.py:122 ipam/tables/vlans.py:227 +#: templates/circuits/circuit.html:35 templates/core/datasource.html:47 +#: templates/core/job.html:35 templates/dcim/cable.html:20 +#: templates/dcim/device.html:183 templates/dcim/location.html:48 +#: templates/dcim/module.html:67 templates/dcim/powerfeed.html:39 +#: templates/dcim/rack.html:46 templates/dcim/site.html:43 +#: templates/extras/report_list.html:49 templates/extras/script_list.html:55 +#: templates/ipam/ipaddress.html:40 templates/ipam/iprange.html:57 +#: templates/ipam/prefix.html:74 templates/ipam/vlan.html:51 +#: templates/virtualization/cluster.html:24 +#: templates/virtualization/virtualmachine.html:22 +#: templates/vpn/tunnel.html:26 templates/wireless/wirelesslan.html:23 +#: templates/wireless/wirelesslink.html:20 users/forms/filtersets.py:33 +#: users/forms/model_forms.py:197 virtualization/forms/bulk_edit.py:69 +#: virtualization/forms/bulk_edit.py:117 +#: virtualization/forms/bulk_import.py:54 +#: virtualization/forms/bulk_import.py:80 +#: virtualization/forms/filtersets.py:61 +#: virtualization/forms/filtersets.py:156 virtualization/tables/clusters.py:74 +#: virtualization/tables/virtualmachines.py:50 vpn/forms/bulk_edit.py:38 +#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:46 +#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:42 +#: wireless/forms/bulk_edit.py:104 wireless/forms/bulk_import.py:43 +#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:48 +#: wireless/forms/filtersets.py:82 wireless/tables/wirelesslan.py:52 +#: wireless/tables/wirelesslink.py:19 +msgid "Status" +msgstr "ステータス" + +#: circuits/forms/bulk_edit.py:137 circuits/forms/bulk_import.py:100 +#: circuits/forms/filtersets.py:119 dcim/forms/bulk_edit.py:120 +#: dcim/forms/bulk_edit.py:185 dcim/forms/bulk_edit.py:255 +#: dcim/forms/bulk_edit.py:366 dcim/forms/bulk_edit.py:583 +#: dcim/forms/bulk_edit.py:684 dcim/forms/bulk_edit.py:1590 +#: dcim/forms/bulk_import.py:106 dcim/forms/bulk_import.py:151 +#: dcim/forms/bulk_import.py:187 dcim/forms/bulk_import.py:274 +#: dcim/forms/bulk_import.py:416 dcim/forms/bulk_import.py:1151 +#: dcim/forms/bulk_import.py:1356 dcim/forms/filtersets.py:165 +#: dcim/forms/filtersets.py:197 dcim/forms/filtersets.py:248 +#: dcim/forms/filtersets.py:333 dcim/forms/filtersets.py:354 +#: dcim/forms/filtersets.py:653 dcim/forms/filtersets.py:826 +#: dcim/forms/filtersets.py:891 dcim/forms/filtersets.py:921 +#: dcim/forms/filtersets.py:1043 dcim/tables/power.py:88 +#: extras/filtersets.py:517 extras/forms/filtersets.py:331 +#: extras/forms/filtersets.py:405 ipam/forms/bulk_edit.py:40 +#: ipam/forms/bulk_edit.py:65 ipam/forms/bulk_edit.py:109 +#: ipam/forms/bulk_edit.py:138 ipam/forms/bulk_edit.py:163 +#: ipam/forms/bulk_edit.py:235 ipam/forms/bulk_edit.py:284 +#: ipam/forms/bulk_edit.py:332 ipam/forms/bulk_edit.py:536 +#: ipam/forms/bulk_import.py:37 ipam/forms/bulk_import.py:66 +#: ipam/forms/bulk_import.py:94 ipam/forms/bulk_import.py:114 +#: ipam/forms/bulk_import.py:134 ipam/forms/bulk_import.py:163 +#: ipam/forms/bulk_import.py:249 ipam/forms/bulk_import.py:285 +#: ipam/forms/bulk_import.py:451 ipam/forms/filtersets.py:47 +#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:99 +#: ipam/forms/filtersets.py:119 ipam/forms/filtersets.py:142 +#: ipam/forms/filtersets.py:169 ipam/forms/filtersets.py:256 +#: ipam/forms/filtersets.py:296 ipam/forms/filtersets.py:450 +#: ipam/tables/ip.py:451 ipam/tables/vlans.py:224 +#: templates/circuits/circuit.html:39 templates/dcim/cable.html:24 +#: templates/dcim/device.html:81 templates/dcim/location.html:52 +#: templates/dcim/powerfeed.html:47 templates/dcim/rack.html:37 +#: templates/dcim/rackreservation.html:56 templates/dcim/site.html:47 +#: templates/dcim/virtualdevicecontext.html:55 +#: templates/ipam/aggregate.html:31 templates/ipam/asn.html:34 +#: templates/ipam/asnrange.html:30 templates/ipam/ipaddress.html:31 +#: templates/ipam/iprange.html:61 templates/ipam/prefix.html:30 +#: templates/ipam/routetarget.html:18 templates/ipam/vlan.html:42 +#: templates/ipam/vrf.html:23 templates/tenancy/tenant.html:17 +#: templates/virtualization/cluster.html:36 +#: templates/virtualization/virtualmachine.html:38 templates/vpn/l2vpn.html:31 +#: templates/vpn/tunnel.html:50 templates/wireless/wirelesslan.html:35 +#: templates/wireless/wirelesslink.html:28 tenancy/forms/forms.py:25 +#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:53 +#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:75 +#: virtualization/forms/bulk_edit.py:154 +#: virtualization/forms/bulk_import.py:66 +#: virtualization/forms/bulk_import.py:115 +#: virtualization/forms/filtersets.py:46 +#: virtualization/forms/filtersets.py:101 vpn/forms/bulk_edit.py:58 +#: vpn/forms/bulk_edit.py:272 vpn/forms/bulk_import.py:59 +#: vpn/forms/bulk_import.py:258 vpn/forms/filtersets.py:211 +#: wireless/forms/bulk_edit.py:62 wireless/forms/bulk_edit.py:109 +#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 +#: wireless/forms/filtersets.py:34 wireless/forms/filtersets.py:74 +msgid "Tenant" +msgstr "テナント" + +#: circuits/forms/bulk_edit.py:142 circuits/forms/filtersets.py:174 +msgid "Install date" +msgstr "インストール日" + +#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:179 +msgid "Termination date" +msgstr "終了日" + +#: circuits/forms/bulk_edit.py:153 circuits/forms/filtersets.py:186 +msgid "Commit rate (Kbps)" +msgstr "コミットレート (Kbps)" + +#: circuits/forms/bulk_edit.py:168 circuits/forms/model_forms.py:111 +msgid "Service Parameters" +msgstr "サービスパラメーター" + +#: circuits/forms/bulk_edit.py:169 circuits/forms/model_forms.py:112 +#: dcim/forms/model_forms.py:141 dcim/forms/model_forms.py:183 +#: dcim/forms/model_forms.py:260 dcim/forms/model_forms.py:672 +#: dcim/forms/model_forms.py:1478 ipam/forms/model_forms.py:61 +#: ipam/forms/model_forms.py:114 ipam/forms/model_forms.py:135 +#: ipam/forms/model_forms.py:159 ipam/forms/model_forms.py:231 +#: ipam/forms/model_forms.py:257 netbox/navigation/menu.py:38 +#: templates/dcim/cable_edit.html:68 templates/dcim/device_edit.html:85 +#: templates/dcim/rack_edit.html:30 templates/ipam/ipaddress_bulk_add.html:27 +#: templates/ipam/ipaddress_edit.html:27 templates/ipam/vlan_edit.html:22 +#: virtualization/forms/model_forms.py:83 +#: virtualization/forms/model_forms.py:225 vpn/forms/bulk_edit.py:77 +#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 +#: vpn/forms/model_forms.py:146 vpn/forms/model_forms.py:404 +#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:160 +msgid "Tenancy" +msgstr "テナンシー" + +#: circuits/forms/bulk_import.py:38 circuits/forms/bulk_import.py:53 +#: circuits/forms/bulk_import.py:79 +msgid "Assigned provider" +msgstr "割り当てられたプロバイダー" + +#: circuits/forms/bulk_import.py:70 dcim/forms/bulk_import.py:170 +#: dcim/forms/bulk_import.py:380 dcim/forms/bulk_import.py:1092 +#: dcim/forms/bulk_import.py:1171 extras/forms/bulk_import.py:229 +msgid "RGB color in hexadecimal. Example:" +msgstr "16 進数の RGB カラー。例:" + +#: circuits/forms/bulk_import.py:85 +msgid "Assigned provider account" +msgstr "割り当てられたプロバイダーアカウント" + +#: circuits/forms/bulk_import.py:92 +msgid "Type of circuit" +msgstr "回路のタイプ" + +#: circuits/forms/bulk_import.py:97 dcim/forms/bulk_import.py:89 +#: dcim/forms/bulk_import.py:148 dcim/forms/bulk_import.py:196 +#: dcim/forms/bulk_import.py:444 dcim/forms/bulk_import.py:598 +#: dcim/forms/bulk_import.py:1301 ipam/forms/bulk_import.py:193 +#: ipam/forms/bulk_import.py:258 ipam/forms/bulk_import.py:294 +#: ipam/forms/bulk_import.py:460 virtualization/forms/bulk_import.py:56 +#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 +msgid "Operational status" +msgstr "運用状況" + +#: circuits/forms/bulk_import.py:104 dcim/forms/bulk_import.py:110 +#: dcim/forms/bulk_import.py:155 dcim/forms/bulk_import.py:278 +#: dcim/forms/bulk_import.py:420 dcim/forms/bulk_import.py:1155 +#: dcim/forms/bulk_import.py:1296 ipam/forms/bulk_import.py:41 +#: ipam/forms/bulk_import.py:70 ipam/forms/bulk_import.py:98 +#: ipam/forms/bulk_import.py:118 ipam/forms/bulk_import.py:138 +#: ipam/forms/bulk_import.py:167 ipam/forms/bulk_import.py:253 +#: ipam/forms/bulk_import.py:289 ipam/forms/bulk_import.py:455 +#: virtualization/forms/bulk_import.py:70 +#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 +#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +msgid "Assigned tenant" +msgstr "割り当てられたテナント" + +#: circuits/forms/bulk_import.py:123 circuits/forms/filtersets.py:147 +#: circuits/forms/model_forms.py:143 +msgid "Provider network" +msgstr "プロバイダーネットワーク" + +#: circuits/forms/filtersets.py:26 circuits/forms/filtersets.py:118 +#: dcim/forms/bulk_edit.py:247 dcim/forms/bulk_edit.py:345 +#: dcim/forms/bulk_edit.py:575 dcim/forms/bulk_edit.py:622 +#: dcim/forms/bulk_edit.py:772 dcim/forms/bulk_import.py:181 +#: dcim/forms/bulk_import.py:255 dcim/forms/bulk_import.py:483 +#: dcim/forms/bulk_import.py:1245 dcim/forms/bulk_import.py:1279 +#: dcim/forms/filtersets.py:92 dcim/forms/filtersets.py:245 +#: dcim/forms/filtersets.py:278 dcim/forms/filtersets.py:330 +#: dcim/forms/filtersets.py:381 dcim/forms/filtersets.py:650 +#: dcim/forms/filtersets.py:689 dcim/forms/filtersets.py:890 +#: dcim/forms/filtersets.py:919 dcim/forms/filtersets.py:939 +#: dcim/forms/filtersets.py:1003 dcim/forms/filtersets.py:1033 +#: dcim/forms/filtersets.py:1042 dcim/forms/filtersets.py:1153 +#: dcim/forms/filtersets.py:1175 dcim/forms/filtersets.py:1197 +#: dcim/forms/filtersets.py:1214 dcim/forms/filtersets.py:1234 +#: dcim/forms/filtersets.py:1342 dcim/forms/filtersets.py:1364 +#: dcim/forms/filtersets.py:1385 dcim/forms/filtersets.py:1400 +#: dcim/forms/filtersets.py:1411 dcim/forms/model_forms.py:182 +#: dcim/forms/model_forms.py:216 dcim/forms/model_forms.py:402 +#: dcim/forms/model_forms.py:635 dcim/tables/devices.py:190 +#: dcim/tables/power.py:30 dcim/tables/racks.py:58 dcim/tables/racks.py:143 +#: extras/filtersets.py:441 extras/forms/filtersets.py:328 +#: ipam/forms/bulk_edit.py:456 ipam/forms/filtersets.py:168 +#: ipam/forms/filtersets.py:400 ipam/forms/filtersets.py:422 +#: ipam/forms/filtersets.py:448 ipam/forms/model_forms.py:560 +#: templates/dcim/device.html:26 templates/dcim/device_edit.html:30 +#: templates/dcim/inc/cable_termination.html:12 +#: templates/dcim/location.html:27 templates/dcim/powerpanel.html:27 +#: templates/dcim/rack.html:29 templates/dcim/rackreservation.html:35 +#: virtualization/forms/filtersets.py:45 virtualization/forms/filtersets.py:99 +#: wireless/forms/model_forms.py:88 wireless/forms/model_forms.py:128 +msgid "Location" +msgstr "ロケーション" + +#: circuits/forms/filtersets.py:27 ipam/forms/model_forms.py:158 +#: ipam/models/asns.py:108 ipam/models/asns.py:125 ipam/tables/asn.py:41 +#: templates/ipam/asn.html:20 +msgid "ASN" +msgstr "ASN" + +#: circuits/forms/filtersets.py:28 circuits/forms/filtersets.py:120 +#: dcim/forms/filtersets.py:136 dcim/forms/filtersets.py:150 +#: dcim/forms/filtersets.py:166 dcim/forms/filtersets.py:198 +#: dcim/forms/filtersets.py:249 dcim/forms/filtersets.py:334 +#: dcim/forms/filtersets.py:408 dcim/forms/filtersets.py:654 +#: dcim/forms/filtersets.py:1004 netbox/navigation/menu.py:45 +#: netbox/navigation/menu.py:47 tenancy/tables/columns.py:70 +#: tenancy/tables/contacts.py:25 tenancy/views.py:18 +#: virtualization/forms/filtersets.py:36 virtualization/forms/filtersets.py:47 +#: virtualization/forms/filtersets.py:102 +msgid "Contacts" +msgstr "連絡先" + +#: circuits/forms/filtersets.py:33 circuits/forms/filtersets.py:157 +#: dcim/forms/bulk_edit.py:110 dcim/forms/bulk_edit.py:222 +#: dcim/forms/bulk_edit.py:747 dcim/forms/bulk_import.py:92 +#: dcim/forms/filtersets.py:70 dcim/forms/filtersets.py:177 +#: dcim/forms/filtersets.py:203 dcim/forms/filtersets.py:256 +#: dcim/forms/filtersets.py:359 dcim/forms/filtersets.py:666 +#: dcim/forms/filtersets.py:896 dcim/forms/filtersets.py:926 +#: dcim/forms/filtersets.py:1010 dcim/forms/filtersets.py:1049 +#: dcim/forms/filtersets.py:1460 dcim/forms/filtersets.py:1484 +#: dcim/forms/filtersets.py:1508 dcim/forms/model_forms.py:80 +#: dcim/forms/model_forms.py:115 dcim/forms/object_create.py:374 +#: dcim/tables/devices.py:176 dcim/tables/sites.py:85 extras/filtersets.py:408 +#: ipam/forms/bulk_edit.py:205 ipam/forms/bulk_edit.py:437 +#: ipam/forms/bulk_edit.py:509 ipam/forms/filtersets.py:212 +#: ipam/forms/filtersets.py:407 ipam/forms/filtersets.py:456 +#: ipam/forms/model_forms.py:532 templates/dcim/device.html:18 +#: templates/dcim/rack.html:19 templates/dcim/rackreservation.html:25 +#: templates/dcim/region.html:26 templates/dcim/site.html:31 +#: templates/ipam/prefix.html:50 templates/ipam/vlan.html:19 +#: virtualization/forms/bulk_edit.py:80 virtualization/forms/filtersets.py:58 +#: virtualization/forms/filtersets.py:129 +#: virtualization/forms/model_forms.py:95 vpn/forms/filtersets.py:253 +msgid "Region" +msgstr "リージョン" + +#: circuits/forms/filtersets.py:38 circuits/forms/filtersets.py:162 +#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:755 +#: dcim/forms/filtersets.py:75 dcim/forms/filtersets.py:182 +#: dcim/forms/filtersets.py:208 dcim/forms/filtersets.py:269 +#: dcim/forms/filtersets.py:364 dcim/forms/filtersets.py:671 +#: dcim/forms/filtersets.py:901 dcim/forms/filtersets.py:1015 +#: dcim/forms/filtersets.py:1054 dcim/forms/object_create.py:382 +#: extras/filtersets.py:425 ipam/forms/bulk_edit.py:210 +#: ipam/forms/bulk_edit.py:444 ipam/forms/bulk_edit.py:514 +#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:412 +#: ipam/forms/filtersets.py:461 ipam/forms/model_forms.py:545 +#: virtualization/forms/bulk_edit.py:85 virtualization/forms/filtersets.py:68 +#: virtualization/forms/filtersets.py:134 +#: virtualization/forms/model_forms.py:101 +msgid "Site group" +msgstr "サイトグループ" + +#: circuits/forms/filtersets.py:51 +msgid "ASN (legacy)" +msgstr "ASN (レガシー)" + +#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 +#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 +#: core/forms/filtersets.py:63 dcim/forms/bulk_edit.py:718 +#: dcim/forms/filtersets.py:164 dcim/forms/filtersets.py:196 +#: dcim/forms/filtersets.py:825 dcim/forms/filtersets.py:920 +#: dcim/forms/filtersets.py:1044 dcim/forms/filtersets.py:1152 +#: dcim/forms/filtersets.py:1174 dcim/forms/filtersets.py:1196 +#: dcim/forms/filtersets.py:1213 dcim/forms/filtersets.py:1230 +#: dcim/forms/filtersets.py:1341 dcim/forms/filtersets.py:1363 +#: dcim/forms/filtersets.py:1384 dcim/forms/filtersets.py:1399 +#: dcim/forms/filtersets.py:1410 extras/forms/filtersets.py:40 +#: extras/forms/filtersets.py:111 extras/forms/filtersets.py:142 +#: extras/forms/filtersets.py:182 extras/forms/filtersets.py:198 +#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:253 +#: extras/forms/filtersets.py:450 extras/forms/filtersets.py:491 +#: ipam/forms/filtersets.py:98 ipam/forms/filtersets.py:255 +#: ipam/forms/filtersets.py:294 ipam/forms/filtersets.py:368 +#: ipam/forms/filtersets.py:449 ipam/forms/filtersets.py:508 +#: ipam/forms/filtersets.py:526 netbox/tables/tables.py:250 +#: virtualization/forms/filtersets.py:44 +#: virtualization/forms/filtersets.py:100 +#: virtualization/forms/filtersets.py:190 +#: virtualization/forms/filtersets.py:235 vpn/forms/filtersets.py:210 +#: wireless/forms/filtersets.py:33 wireless/forms/filtersets.py:73 +msgid "Attributes" +msgstr "属性" + +#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:60 +#: circuits/tables/providers.py:66 templates/circuits/circuit.html:23 +#: templates/circuits/provideraccount.html:25 +msgid "Account" +msgstr "アカウント" + +#: circuits/forms/model_forms.py:64 +#: templates/circuits/circuittermination_edit.html:23 +#: templates/circuits/inc/circuit_termination.html:89 +#: templates/circuits/providernetwork.html:18 +msgid "Provider Network" +msgstr "プロバイダーネットワーク" + +#: circuits/forms/model_forms.py:78 templates/circuits/circuittype.html:20 +msgid "Circuit Type" +msgstr "回路タイプ" + +#: circuits/models/circuits.py:25 dcim/models/cables.py:67 +#: dcim/models/device_component_templates.py:491 +#: dcim/models/device_component_templates.py:591 +#: dcim/models/device_components.py:976 dcim/models/device_components.py:1050 +#: dcim/models/device_components.py:1166 dcim/models/devices.py:467 +#: dcim/models/racks.py:43 extras/models/tags.py:28 +msgid "color" +msgstr "色" + +#: circuits/models/circuits.py:34 +msgid "circuit type" +msgstr "回路タイプ" + +#: circuits/models/circuits.py:35 +msgid "circuit types" +msgstr "回路タイプ" + +#: circuits/models/circuits.py:46 +msgid "circuit ID" +msgstr "サーキット ID" + +#: circuits/models/circuits.py:47 +msgid "Unique circuit ID" +msgstr "ユニークな回路 ID" + +#: circuits/models/circuits.py:67 core/models/data.py:54 +#: core/models/jobs.py:85 dcim/models/cables.py:49 dcim/models/devices.py:641 +#: dcim/models/devices.py:1165 dcim/models/devices.py:1374 +#: dcim/models/power.py:95 dcim/models/racks.py:97 dcim/models/sites.py:154 +#: dcim/models/sites.py:266 ipam/models/ip.py:252 ipam/models/ip.py:521 +#: ipam/models/ip.py:729 ipam/models/vlans.py:175 +#: virtualization/models/clusters.py:74 +#: virtualization/models/virtualmachines.py:82 vpn/models/tunnels.py:40 +#: wireless/models.py:94 wireless/models.py:158 +msgid "status" +msgstr "状態" + +#: circuits/models/circuits.py:82 +msgid "installed" +msgstr "インストール済み" + +#: circuits/models/circuits.py:87 +msgid "terminates" +msgstr "終了する" + +#: circuits/models/circuits.py:92 +msgid "commit rate (Kbps)" +msgstr "コミットレート (Kbps)" + +#: circuits/models/circuits.py:93 +msgid "Committed rate" +msgstr "コミットレート" + +#: circuits/models/circuits.py:135 +msgid "circuit" +msgstr "回路" + +#: circuits/models/circuits.py:136 +msgid "circuits" +msgstr "回路" + +#: circuits/models/circuits.py:169 +msgid "termination" +msgstr "終了" + +#: circuits/models/circuits.py:186 +msgid "port speed (Kbps)" +msgstr "ポートスピード (Kbps)" + +#: circuits/models/circuits.py:189 +msgid "Physical circuit speed" +msgstr "物理回路速度" + +#: circuits/models/circuits.py:194 +msgid "upstream speed (Kbps)" +msgstr "アップストリーム速度 (Kbps)" + +#: circuits/models/circuits.py:195 +msgid "Upstream speed, if different from port speed" +msgstr "アップストリーム速度 (ポート速度と異なる場合)" + +#: circuits/models/circuits.py:200 +msgid "cross-connect ID" +msgstr "クロスコネクト ID" + +#: circuits/models/circuits.py:201 +msgid "ID of the local cross-connect" +msgstr "ローカル・クロスコネクトの ID" + +#: circuits/models/circuits.py:206 +msgid "patch panel/port(s)" +msgstr "パッチパネル/ポート" + +#: circuits/models/circuits.py:207 +msgid "Patch panel ID and port number(s)" +msgstr "パッチパネル ID とポート番号" + +#: circuits/models/circuits.py:210 +#: dcim/models/device_component_templates.py:61 +#: dcim/models/device_components.py:69 dcim/models/racks.py:537 +#: extras/models/configs.py:45 extras/models/configs.py:219 +#: extras/models/customfields.py:122 extras/models/models.py:58 +#: extras/models/models.py:188 extras/models/models.py:426 +#: extras/models/models.py:541 extras/models/staging.py:31 +#: extras/models/tags.py:32 netbox/models/__init__.py:109 +#: netbox/models/__init__.py:144 netbox/models/__init__.py:190 +#: users/models.py:273 users/models.py:348 +#: virtualization/models/virtualmachines.py:282 +msgid "description" +msgstr "説明" + +#: circuits/models/circuits.py:223 +msgid "circuit termination" +msgstr "回路終端" + +#: circuits/models/circuits.py:224 +msgid "circuit terminations" +msgstr "回路終端" + +#: circuits/models/providers.py:22 circuits/models/providers.py:66 +#: circuits/models/providers.py:104 core/models/data.py:41 +#: core/models/jobs.py:46 dcim/models/device_component_templates.py:43 +#: dcim/models/device_components.py:54 dcim/models/devices.py:581 +#: dcim/models/devices.py:1305 dcim/models/devices.py:1370 +#: dcim/models/power.py:39 dcim/models/power.py:91 dcim/models/racks.py:62 +#: dcim/models/sites.py:138 extras/models/configs.py:36 +#: extras/models/configs.py:215 extras/models/customfields.py:89 +#: extras/models/models.py:53 extras/models/models.py:183 +#: extras/models/models.py:326 extras/models/models.py:422 +#: extras/models/models.py:531 extras/models/models.py:626 +#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 +#: ipam/models/services.py:52 ipam/models/services.py:88 +#: ipam/models/vlans.py:26 ipam/models/vlans.py:164 ipam/models/vrfs.py:22 +#: ipam/models/vrfs.py:79 netbox/models/__init__.py:136 +#: netbox/models/__init__.py:180 tenancy/models/contacts.py:64 +#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 +#: users/models.py:344 virtualization/models/clusters.py:57 +#: virtualization/models/virtualmachines.py:70 +#: virtualization/models/virtualmachines.py:272 vpn/models/crypto.py:24 +#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 +#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 +#: wireless/models.py:50 +msgid "name" +msgstr "名前" + +#: circuits/models/providers.py:25 +msgid "Full name of the provider" +msgstr "プロバイダーのフルネーム" + +#: circuits/models/providers.py:28 dcim/models/devices.py:86 +#: dcim/models/sites.py:149 extras/models/models.py:536 ipam/models/asns.py:23 +#: ipam/models/vlans.py:30 netbox/models/__init__.py:140 +#: netbox/models/__init__.py:185 tenancy/models/tenants.py:25 +#: tenancy/models/tenants.py:49 vpn/models/l2vpn.py:27 wireless/models.py:55 +msgid "slug" +msgstr "ナメクジ" + +#: circuits/models/providers.py:42 +msgid "provider" +msgstr "プロバイダー" + +#: circuits/models/providers.py:43 +msgid "providers" +msgstr "プロバイダー" + +#: circuits/models/providers.py:63 +msgid "account ID" +msgstr "アカウント ID" + +#: circuits/models/providers.py:86 +msgid "provider account" +msgstr "プロバイダーアカウント" + +#: circuits/models/providers.py:87 +msgid "provider accounts" +msgstr "プロバイダーアカウント" + +#: circuits/models/providers.py:115 +msgid "service ID" +msgstr "サービス ID" + +#: circuits/models/providers.py:126 +msgid "provider network" +msgstr "プロバイダーネットワーク" + +#: circuits/models/providers.py:127 +msgid "provider networks" +msgstr "プロバイダーネットワーク" + +#: circuits/tables/circuits.py:29 circuits/tables/providers.py:18 +#: circuits/tables/providers.py:69 circuits/tables/providers.py:99 +#: core/tables/data.py:16 core/tables/jobs.py:14 dcim/forms/filtersets.py:60 +#: dcim/forms/object_create.py:42 dcim/tables/devices.py:88 +#: dcim/tables/devices.py:125 dcim/tables/devices.py:167 +#: dcim/tables/devices.py:318 dcim/tables/devices.py:395 +#: dcim/tables/devices.py:439 dcim/tables/devices.py:491 +#: dcim/tables/devices.py:543 dcim/tables/devices.py:663 +#: dcim/tables/devices.py:744 dcim/tables/devices.py:794 +#: dcim/tables/devices.py:860 dcim/tables/devices.py:975 +#: dcim/tables/devices.py:995 dcim/tables/devices.py:1024 +#: dcim/tables/devices.py:1054 dcim/tables/devicetypes.py:32 +#: dcim/tables/power.py:22 dcim/tables/power.py:62 dcim/tables/racks.py:23 +#: dcim/tables/racks.py:53 dcim/tables/sites.py:24 dcim/tables/sites.py:51 +#: dcim/tables/sites.py:78 dcim/tables/sites.py:125 +#: extras/forms/filtersets.py:190 extras/tables/tables.py:40 +#: extras/tables/tables.py:83 extras/tables/tables.py:115 +#: extras/tables/tables.py:139 extras/tables/tables.py:204 +#: extras/tables/tables.py:251 extras/tables/tables.py:274 +#: extras/tables/tables.py:324 extras/tables/tables.py:376 +#: extras/tables/tables.py:399 ipam/forms/bulk_edit.py:390 +#: ipam/forms/filtersets.py:372 ipam/tables/asn.py:16 ipam/tables/ip.py:85 +#: ipam/tables/ip.py:159 ipam/tables/services.py:15 ipam/tables/services.py:40 +#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:110 ipam/tables/vrfs.py:26 +#: ipam/tables/vrfs.py:67 templates/circuits/circuittype.html:25 +#: templates/circuits/provideraccount.html:29 +#: templates/circuits/providernetwork.html:27 +#: templates/core/datasource.html:35 templates/core/job.html:31 +#: templates/dcim/consoleport.html:31 templates/dcim/consoleserverport.html:31 +#: templates/dcim/devicebay.html:27 templates/dcim/devicerole.html:29 +#: templates/dcim/frontport.html:31 +#: templates/dcim/inc/interface_vlans_table.html:5 +#: templates/dcim/inc/panels/inventory_items.html:10 +#: templates/dcim/interface.html:39 templates/dcim/interface.html:171 +#: templates/dcim/inventoryitem.html:29 +#: templates/dcim/inventoryitemrole.html:19 templates/dcim/location.html:32 +#: templates/dcim/manufacturer.html:39 templates/dcim/modulebay.html:27 +#: templates/dcim/platform.html:32 templates/dcim/poweroutlet.html:31 +#: templates/dcim/powerport.html:31 templates/dcim/rackrole.html:25 +#: templates/dcim/rearport.html:31 templates/dcim/region.html:30 +#: templates/dcim/sitegroup.html:30 +#: templates/dcim/virtualdevicecontext.html:21 +#: templates/extras/admin/plugins_list.html:22 +#: templates/extras/configcontext.html:14 +#: templates/extras/configtemplate.html:14 +#: templates/extras/customfield.html:16 templates/extras/customlink.html:14 +#: templates/extras/eventrule.html:16 templates/extras/exporttemplate.html:21 +#: templates/extras/report_list.html:46 templates/extras/savedfilter.html:14 +#: templates/extras/script_list.html:52 templates/extras/tag.html:17 +#: templates/extras/webhook.html:16 templates/ipam/asnrange.html:16 +#: templates/ipam/fhrpgroup.html:31 templates/ipam/rir.html:25 +#: templates/ipam/role.html:25 templates/ipam/routetarget.html:14 +#: templates/ipam/service.html:27 templates/ipam/servicetemplate.html:16 +#: templates/ipam/vlan.html:38 templates/ipam/vlangroup.html:31 +#: templates/tenancy/contact.html:26 templates/tenancy/contactgroup.html:24 +#: templates/tenancy/contactrole.html:19 templates/tenancy/tenantgroup.html:32 +#: templates/users/group.html:18 templates/users/objectpermission.html:18 +#: templates/virtualization/cluster.html:16 +#: templates/virtualization/clustergroup.html:25 +#: templates/virtualization/clustertype.html:25 +#: templates/virtualization/virtualdisk.html:26 +#: templates/virtualization/virtualmachine.html:18 +#: templates/virtualization/vminterface.html:28 +#: templates/vpn/ikepolicy.html:14 templates/vpn/ikeproposal.html:14 +#: templates/vpn/ipsecpolicy.html:14 templates/vpn/ipsecprofile.html:14 +#: templates/vpn/ipsecprofile.html:39 templates/vpn/ipsecprofile.html:74 +#: templates/vpn/ipsecproposal.html:14 templates/vpn/l2vpn.html:15 +#: templates/vpn/tunnel.html:22 templates/vpn/tunnelgroup.html:29 +#: templates/wireless/wirelesslangroup.html:30 tenancy/tables/contacts.py:19 +#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 +#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 +#: users/tables.py:62 users/tables.py:79 +#: virtualization/forms/bulk_create.py:20 +#: virtualization/forms/object_create.py:13 +#: virtualization/forms/object_create.py:23 +#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 +#: virtualization/tables/clusters.py:62 +#: virtualization/tables/virtualmachines.py:45 +#: virtualization/tables/virtualmachines.py:119 +#: virtualization/tables/virtualmachines.py:172 vpn/tables/crypto.py:18 +#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 +#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 +#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 +#: wireless/tables/wirelesslan.py:79 +msgid "Name" +msgstr "[名前]" + +#: circuits/tables/circuits.py:38 circuits/tables/providers.py:45 +#: circuits/tables/providers.py:79 netbox/navigation/menu.py:254 +#: netbox/navigation/menu.py:258 netbox/navigation/menu.py:260 +#: templates/circuits/provider.html:61 +#: templates/circuits/provideraccount.html:46 +#: templates/circuits/providernetwork.html:54 +msgid "Circuits" +msgstr "回路" + +#: circuits/tables/circuits.py:52 templates/circuits/circuit.html:27 +msgid "Circuit ID" +msgstr "サーキット ID" + +#: circuits/tables/circuits.py:65 wireless/forms/model_forms.py:157 +msgid "Side A" +msgstr "サイド A" + +#: circuits/tables/circuits.py:69 +msgid "Side Z" +msgstr "サイド Z" + +#: circuits/tables/circuits.py:72 templates/circuits/circuit.html:56 +msgid "Commit Rate" +msgstr "コミットレート" + +#: circuits/tables/circuits.py:75 circuits/tables/providers.py:48 +#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 +#: dcim/tables/devices.py:1037 dcim/tables/devicetypes.py:92 +#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 +#: dcim/tables/power.py:96 dcim/tables/racks.py:76 dcim/tables/racks.py:156 +#: dcim/tables/sites.py:103 extras/forms/bulk_edit.py:320 +#: extras/tables/tables.py:490 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 +#: ipam/tables/ip.py:135 ipam/tables/ip.py:272 ipam/tables/ip.py:325 +#: ipam/tables/ip.py:392 ipam/tables/services.py:24 ipam/tables/services.py:54 +#: ipam/tables/vlans.py:141 ipam/tables/vrfs.py:46 ipam/tables/vrfs.py:71 +#: templates/dcim/cable_edit.html:85 templates/generic/bulk_edit.html:102 +#: templates/inc/panels/comments.html:6 tenancy/tables/contacts.py:68 +#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 +#: virtualization/tables/clusters.py:91 +#: virtualization/tables/virtualmachines.py:68 vpn/tables/crypto.py:37 +#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 +#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:57 +#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +msgid "Comments" +msgstr "[コメント]" + +#: circuits/tables/providers.py:23 +msgid "Accounts" +msgstr "アカウント" + +#: circuits/tables/providers.py:29 +msgid "Account Count" +msgstr "アカウント数" + +#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +msgid "ASN Count" +msgstr "ASN カウント" + +#: core/choices.py:18 +msgid "New" +msgstr "新規" + +#: core/choices.py:19 +msgid "Queued" +msgstr "処理待ち" + +#: core/choices.py:20 +msgid "Syncing" +msgstr "同期中" + +#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 +#: extras/choices.py:210 templates/core/job.html:75 +msgid "Completed" +msgstr "完了しました" + +#: core/choices.py:22 core/choices.py:59 dcim/choices.py:176 +#: dcim/choices.py:222 dcim/choices.py:1496 extras/choices.py:212 +#: virtualization/choices.py:47 +msgid "Failed" +msgstr "失敗" + +#: core/choices.py:35 netbox/navigation/menu.py:330 +#: templates/extras/script/base.html:14 templates/extras/script_list.html:6 +#: templates/extras/script_list.html:20 templates/extras/script_result.html:18 +msgid "Scripts" +msgstr "スクリプト" + +#: core/choices.py:36 netbox/navigation/menu.py:324 +#: templates/extras/report/base.html:13 templates/extras/report_list.html:7 +#: templates/extras/report_list.html:12 +msgid "Reports" +msgstr "レポート" + +#: core/choices.py:54 extras/choices.py:207 +msgid "Pending" +msgstr "保留中" + +#: core/choices.py:55 core/tables/jobs.py:32 extras/choices.py:208 +#: templates/core/job.html:62 +msgid "Scheduled" +msgstr "スケジュール済み" + +#: core/choices.py:56 extras/choices.py:209 +msgid "Running" +msgstr "実行中" + +#: core/choices.py:58 extras/choices.py:211 +msgid "Errored" +msgstr "エラーです" + +#: core/data_backends.py:29 templates/dcim/interface.html:224 +msgid "Local" +msgstr "ローカル" + +#: core/data_backends.py:47 extras/tables/tables.py:436 +#: templates/account/profile.html:16 templates/users/user.html:18 +#: users/tables.py:31 +msgid "Username" +msgstr "ユーザー名" + +#: core/data_backends.py:49 core/data_backends.py:55 +msgid "Only used for cloning with HTTP(S)" +msgstr "HTTP (S) でのクローニングにのみ使用されます" + +#: core/data_backends.py:53 templates/account/base.html:17 +#: templates/account/password.html:11 users/forms/model_forms.py:172 +msgid "Password" +msgstr "[パスワード]" + +#: core/data_backends.py:59 +msgid "Branch" +msgstr "ブランチ" + +#: core/data_backends.py:118 +msgid "AWS access key ID" +msgstr "AWS アクセスキー ID" + +#: core/data_backends.py:122 +msgid "AWS secret access key" +msgstr "AWS シークレットアクセスキー" + +#: core/filtersets.py:49 extras/filtersets.py:203 extras/filtersets.py:538 +#: extras/filtersets.py:566 +msgid "Data source (ID)" +msgstr "データソース (ID)" + +#: core/filtersets.py:55 +msgid "Data source (name)" +msgstr "データソース (名前)" + +#: core/forms/bulk_edit.py:24 ipam/forms/bulk_edit.py:47 +msgid "Enforce unique space" +msgstr "ユニークな空間を強制" + +#: core/forms/bulk_edit.py:33 extras/forms/model_forms.py:202 +#: templates/extras/savedfilter.html:57 vpn/forms/filtersets.py:95 +#: vpn/forms/filtersets.py:124 vpn/forms/filtersets.py:148 +#: vpn/forms/filtersets.py:167 vpn/forms/model_forms.py:294 +#: vpn/forms/model_forms.py:315 vpn/forms/model_forms.py:329 +#: vpn/forms/model_forms.py:350 vpn/forms/model_forms.py:373 +msgid "Parameters" +msgstr "パラメーター" + +#: core/forms/bulk_edit.py:37 templates/core/datasource.html:69 +msgid "Ignore rules" +msgstr "ルールを無視" + +#: core/forms/filtersets.py:26 core/forms/model_forms.py:95 +#: extras/forms/model_forms.py:165 extras/forms/model_forms.py:462 +#: extras/forms/model_forms.py:515 extras/tables/tables.py:149 +#: extras/tables/tables.py:368 extras/tables/tables.py:403 +#: templates/core/datasource.html:31 +#: templates/dcim/device/render_config.html:19 +#: templates/extras/configcontext.html:30 +#: templates/extras/configtemplate.html:22 +#: templates/extras/exporttemplate.html:41 +#: templates/virtualization/virtualmachine/render_config.html:19 +msgid "Data Source" +msgstr "[データソース]" + +#: core/forms/filtersets.py:39 core/tables/data.py:26 +#: dcim/forms/bulk_edit.py:1012 dcim/forms/bulk_edit.py:1285 +#: dcim/forms/filtersets.py:1270 dcim/tables/devices.py:568 +#: dcim/tables/devicetypes.py:221 extras/forms/bulk_edit.py:97 +#: extras/forms/bulk_edit.py:161 extras/forms/bulk_edit.py:220 +#: extras/forms/filtersets.py:119 extras/forms/filtersets.py:206 +#: extras/forms/filtersets.py:267 extras/tables/tables.py:122 +#: extras/tables/tables.py:211 extras/tables/tables.py:288 +#: templates/core/datasource.html:43 templates/dcim/interface.html:62 +#: templates/extras/customlink.html:18 templates/extras/eventrule.html:20 +#: templates/extras/savedfilter.html:26 +#: templates/users/objectpermission.html:26 +#: templates/virtualization/vminterface.html:32 users/forms/bulk_edit.py:69 +#: users/forms/filtersets.py:71 users/tables.py:86 +#: virtualization/forms/bulk_edit.py:216 +#: virtualization/forms/filtersets.py:207 +msgid "Enabled" +msgstr "有効" + +#: core/forms/filtersets.py:51 core/forms/mixins.py:21 +msgid "File" +msgstr "[ファイル]" + +#: core/forms/filtersets.py:56 core/forms/mixins.py:16 +#: extras/forms/filtersets.py:147 extras/forms/filtersets.py:336 +#: extras/forms/filtersets.py:422 +msgid "Data source" +msgstr "データソース" + +#: core/forms/filtersets.py:64 extras/forms/filtersets.py:449 +msgid "Creation" +msgstr "作成" + +#: core/forms/filtersets.py:70 extras/forms/filtersets.py:473 +#: extras/forms/filtersets.py:519 extras/tables/tables.py:479 +#: templates/core/job.html:25 templates/extras/objectchange.html:56 +#: tenancy/tables/contacts.py:90 vpn/tables/l2vpn.py:59 +msgid "Object Type" +msgstr "[オブジェクトタイプ]" + +#: core/forms/filtersets.py:80 +msgid "Created after" +msgstr "後に作成" + +#: core/forms/filtersets.py:85 +msgid "Created before" +msgstr "以前に作成" + +#: core/forms/filtersets.py:90 +msgid "Scheduled after" +msgstr "後に予定されている" + +#: core/forms/filtersets.py:95 +msgid "Scheduled before" +msgstr "以前に予定されている" + +#: core/forms/filtersets.py:100 +msgid "Started after" +msgstr "後に開始" + +#: core/forms/filtersets.py:105 +msgid "Started before" +msgstr "前に開始" + +#: core/forms/filtersets.py:110 +msgid "Completed after" +msgstr "後に完了" + +#: core/forms/filtersets.py:115 +msgid "Completed before" +msgstr "前に完了しました" + +#: core/forms/filtersets.py:122 dcim/forms/bulk_edit.py:359 +#: dcim/forms/filtersets.py:352 dcim/forms/filtersets.py:396 +#: dcim/forms/model_forms.py:251 extras/forms/filtersets.py:465 +#: extras/forms/filtersets.py:511 templates/dcim/rackreservation.html:65 +#: templates/extras/objectchange.html:40 templates/extras/savedfilter.html:22 +#: templates/users/token.html:22 templates/users/user.html:6 +#: templates/users/user.html:14 users/filtersets.py:74 users/filtersets.py:134 +#: users/forms/filtersets.py:85 users/forms/filtersets.py:126 +#: users/forms/model_forms.py:157 users/forms/model_forms.py:195 +#: users/tables.py:19 +msgid "User" +msgstr "ユーザ" + +#: core/forms/model_forms.py:52 core/tables/data.py:46 +#: templates/core/datafile.html:36 templates/extras/report/base.html:33 +#: templates/extras/script/base.html:32 templates/extras/script_result.html:45 +msgid "Source" +msgstr "[ソース]" + +#: core/forms/model_forms.py:56 +msgid "Backend Parameters" +msgstr "バックエンドパラメーター" + +#: core/forms/model_forms.py:94 +msgid "File Upload" +msgstr "ファイルアップロード" + +#: core/forms/model_forms.py:147 templates/core/configrevision.html:43 +#: templates/dcim/rack_elevation_list.html:6 +msgid "Rack Elevations" +msgstr "ラックの高さ" + +#: core/forms/model_forms.py:148 dcim/choices.py:1407 +#: dcim/forms/bulk_edit.py:859 dcim/forms/bulk_edit.py:1242 +#: dcim/forms/bulk_edit.py:1260 dcim/tables/racks.py:89 +#: netbox/navigation/menu.py:276 netbox/navigation/menu.py:280 +msgid "Power" +msgstr "パワー" + +#: core/forms/model_forms.py:149 netbox/navigation/menu.py:142 +#: templates/core/configrevision.html:79 +msgid "IPAM" +msgstr "IPAM" + +#: core/forms/model_forms.py:150 netbox/navigation/menu.py:218 +#: templates/core/configrevision.html:95 vpn/forms/bulk_edit.py:76 +#: vpn/forms/filtersets.py:42 vpn/forms/model_forms.py:60 +#: vpn/forms/model_forms.py:145 +msgid "Security" +msgstr "[セキュリティ]" + +#: core/forms/model_forms.py:151 templates/core/configrevision.html:107 +msgid "Banners" +msgstr "バナー" + +#: core/forms/model_forms.py:152 templates/core/configrevision.html:131 +msgid "Pagination" +msgstr "ページネーション" + +#: core/forms/model_forms.py:153 extras/forms/model_forms.py:63 +#: templates/core/configrevision.html:147 +msgid "Validation" +msgstr "検証" + +#: core/forms/model_forms.py:154 templates/account/preferences.html:6 +#: templates/core/configrevision.html:175 +msgid "User Preferences" +msgstr "ユーザープリファレンス" + +#: core/forms/model_forms.py:155 dcim/forms/filtersets.py:658 +#: templates/core/configrevision.html:193 users/forms/model_forms.py:64 +msgid "Miscellaneous" +msgstr "雑多" + +#: core/forms/model_forms.py:158 +msgid "Config Revision" +msgstr "コンフィグリビジョン" + +#: core/forms/model_forms.py:197 +msgid "This parameter has been defined statically and cannot be modified." +msgstr "このパラメータは静的に定義されており、変更できません。" + +#: core/forms/model_forms.py:205 +#, python-brace-format +msgid "Current value: {value}" +msgstr "現在の値: {value}" + +#: core/forms/model_forms.py:207 +msgid " (default)" +msgstr " (デフォルト)" + +#: core/models/config.py:18 core/models/data.py:259 core/models/files.py:27 +#: core/models/jobs.py:50 extras/models/models.py:760 +#: netbox/models/features.py:52 users/models.py:248 +msgid "created" +msgstr "作成した" + +#: core/models/config.py:22 +msgid "comment" +msgstr "コメント" + +#: core/models/config.py:29 +msgid "configuration data" +msgstr "設定データ" + +#: core/models/config.py:36 +msgid "config revision" +msgstr "設定リビジョン" + +#: core/models/config.py:37 +msgid "config revisions" +msgstr "設定リビジョン" + +#: core/models/config.py:41 +msgid "Default configuration" +msgstr "デフォルト構成" + +#: core/models/config.py:43 +msgid "Current configuration" +msgstr "現在の構成" + +#: core/models/config.py:44 +#, python-brace-format +msgid "Config revision #{id}" +msgstr "設定リビジョン #{id}" + +#: core/models/data.py:46 dcim/models/cables.py:43 +#: dcim/models/device_component_templates.py:177 +#: dcim/models/device_component_templates.py:211 +#: dcim/models/device_component_templates.py:246 +#: dcim/models/device_component_templates.py:308 +#: dcim/models/device_component_templates.py:387 +#: dcim/models/device_component_templates.py:486 +#: dcim/models/device_component_templates.py:586 +#: dcim/models/device_components.py:284 dcim/models/device_components.py:313 +#: dcim/models/device_components.py:346 dcim/models/device_components.py:464 +#: dcim/models/device_components.py:606 dcim/models/device_components.py:971 +#: dcim/models/device_components.py:1045 dcim/models/power.py:101 +#: dcim/models/racks.py:127 extras/models/customfields.py:75 +#: extras/models/search.py:43 virtualization/models/clusters.py:61 +#: vpn/models/l2vpn.py:32 +msgid "type" +msgstr "タイプ" + +#: core/models/data.py:51 extras/choices.py:34 extras/models/models.py:194 +#: templates/core/datasource.html:59 +msgid "URL" +msgstr "URL" + +#: core/models/data.py:61 dcim/models/device_component_templates.py:392 +#: dcim/models/device_components.py:513 extras/models/models.py:88 +#: extras/models/models.py:331 extras/models/models.py:556 users/models.py:353 +msgid "enabled" +msgstr "有効" + +#: core/models/data.py:65 +msgid "ignore rules" +msgstr "ルールを無視" + +#: core/models/data.py:67 +msgid "Patterns (one per line) matching files to ignore when syncing" +msgstr "同期時に無視するファイルマッチングパターン (1 行に 1 つ)" + +#: core/models/data.py:70 extras/models/models.py:564 +msgid "parameters" +msgstr "パラメーター" + +#: core/models/data.py:75 +msgid "last synced" +msgstr "最終同期" + +#: core/models/data.py:83 +msgid "data source" +msgstr "データソース" + +#: core/models/data.py:84 +msgid "data sources" +msgstr "データソース" + +#: core/models/data.py:124 +#, python-brace-format +msgid "Unknown backend type: {type}" +msgstr "不明なバックエンドタイプ: {type}" + +#: core/models/data.py:263 core/models/files.py:31 +#: netbox/models/features.py:58 +msgid "last updated" +msgstr "最終更新日" + +#: core/models/data.py:273 dcim/models/cables.py:430 +msgid "path" +msgstr "道" + +#: core/models/data.py:276 +msgid "File path relative to the data source's root" +msgstr "データソースのルートを基準にしたファイルパス" + +#: core/models/data.py:280 ipam/models/ip.py:502 +msgid "size" +msgstr "サイズ" + +#: core/models/data.py:283 +msgid "hash" +msgstr "ハッシュ" + +#: core/models/data.py:287 +msgid "Length must be 64 hexadecimal characters." +msgstr "長さは 64 桁の 16 進数文字でなければなりません。" + +#: core/models/data.py:289 +msgid "SHA256 hash of the file data" +msgstr "ファイルデータの SHA256 ハッシュ" + +#: core/models/data.py:306 +msgid "data file" +msgstr "データファイル" + +#: core/models/data.py:307 +msgid "data files" +msgstr "データファイル" + +#: core/models/data.py:393 +msgid "auto sync record" +msgstr "自動同期レコード" + +#: core/models/data.py:394 +msgid "auto sync records" +msgstr "自動同期レコード" + +#: core/models/files.py:37 +msgid "file root" +msgstr "ファイルルート" + +#: core/models/files.py:42 +msgid "file path" +msgstr "ファイルパス" + +#: core/models/files.py:44 +msgid "File path relative to the designated root path" +msgstr "指定されたルートパスからの相対ファイルパス" + +#: core/models/files.py:61 +msgid "managed file" +msgstr "管理ファイル" + +#: core/models/files.py:62 +msgid "managed files" +msgstr "管理ファイル" + +#: core/models/jobs.py:54 +msgid "scheduled" +msgstr "予定" + +#: core/models/jobs.py:59 +msgid "interval" +msgstr "間隔" + +#: core/models/jobs.py:65 +msgid "Recurrence interval (in minutes)" +msgstr "繰り返し間隔 (分単位)" + +#: core/models/jobs.py:68 +msgid "started" +msgstr "始まった" + +#: core/models/jobs.py:73 +msgid "completed" +msgstr "完成した" + +#: core/models/jobs.py:91 extras/models/models.py:123 +#: extras/models/staging.py:87 +msgid "data" +msgstr "データ" + +#: core/models/jobs.py:96 +msgid "error" +msgstr "エラー" + +#: core/models/jobs.py:101 +msgid "job ID" +msgstr "ジョブ ID" + +#: core/models/jobs.py:112 +msgid "job" +msgstr "ジョブ" + +#: core/models/jobs.py:113 +msgid "jobs" +msgstr "ジョブ" + +#: core/models/jobs.py:135 +#, python-brace-format +msgid "Jobs cannot be assigned to this object type ({type})." +msgstr "このオブジェクトタイプにはジョブを割り当てられません ({type})。" + +#: core/tables/config.py:21 users/forms/filtersets.py:45 users/tables.py:39 +msgid "Is Active" +msgstr "アクティブです" + +#: core/tables/data.py:50 templates/core/datafile.html:40 +msgid "Path" +msgstr "パス" + +#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +msgid "Last updated" +msgstr "最終更新日" + +#: core/tables/jobs.py:10 dcim/tables/devicetypes.py:161 +#: extras/tables/tables.py:174 extras/tables/tables.py:345 +#: netbox/tables/tables.py:184 templates/dcim/virtualchassis_edit.html:53 +#: wireless/tables/wirelesslink.py:16 +msgid "ID" +msgstr "ID" + +#: core/tables/jobs.py:21 extras/choices.py:38 extras/tables/tables.py:236 +#: extras/tables/tables.py:282 extras/tables/tables.py:355 +#: extras/tables/tables.py:453 extras/tables/tables.py:484 +#: netbox/tables/tables.py:238 templates/extras/eventrule.html:99 +#: templates/extras/htmx/report_result.html:45 +#: templates/extras/journalentry.html:21 templates/extras/objectchange.html:62 +#: tenancy/tables/contacts.py:93 vpn/tables/l2vpn.py:64 +msgid "Object" +msgstr "[オブジェクト]" + +#: core/tables/jobs.py:35 +msgid "Interval" +msgstr "間隔" + +#: core/tables/jobs.py:38 templates/core/job.html:71 +#: templates/extras/htmx/report_result.html:7 +#: templates/extras/htmx/script_result.html:8 +msgid "Started" +msgstr "開始" + +#: dcim/api/serializers.py:205 templates/dcim/rack.html:33 +msgid "Facility ID" +msgstr "ファシリティ ID" + +#: dcim/api/serializers.py:321 dcim/api/serializers.py:680 +msgid "Position (U)" +msgstr "ポジション (U)" + +#: dcim/choices.py:21 virtualization/choices.py:21 +msgid "Staging" +msgstr "ステージング" + +#: dcim/choices.py:23 dcim/choices.py:178 dcim/choices.py:223 +#: dcim/choices.py:1420 virtualization/choices.py:23 +#: virtualization/choices.py:48 +msgid "Decommissioning" +msgstr "廃止措置" + +#: dcim/choices.py:24 +msgid "Retired" +msgstr "退職しました" + +#: dcim/choices.py:65 +msgid "2-post frame" +msgstr "2 ポストフレーム" + +#: dcim/choices.py:66 +msgid "4-post frame" +msgstr "4ポストフレーム" + +#: dcim/choices.py:67 +msgid "4-post cabinet" +msgstr "4 ポストキャビネット" + +#: dcim/choices.py:68 +msgid "Wall-mounted frame" +msgstr "壁掛けフレーム" + +#: dcim/choices.py:69 +msgid "Wall-mounted frame (vertical)" +msgstr "壁掛けフレーム (垂直)" + +#: dcim/choices.py:70 +msgid "Wall-mounted cabinet" +msgstr "壁掛けキャビネット" + +#: dcim/choices.py:71 +msgid "Wall-mounted cabinet (vertical)" +msgstr "壁掛けキャビネット (縦型)" + +#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#, python-brace-format +msgid "{n} inches" +msgstr "{n} インチ" + +#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 +#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +msgid "Reserved" +msgstr "予約済み" + +#: dcim/choices.py:101 templates/dcim/device.html:262 +msgid "Available" +msgstr "利用可能" + +#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 +#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +msgid "Deprecated" +msgstr "非推奨" + +#: dcim/choices.py:114 templates/dcim/rack.html:128 +msgid "Millimeters" +msgstr "ミリメートル" + +#: dcim/choices.py:115 dcim/choices.py:1442 +msgid "Inches" +msgstr "インチ" + +#: dcim/choices.py:140 dcim/forms/bulk_edit.py:66 dcim/forms/bulk_edit.py:85 +#: dcim/forms/bulk_edit.py:171 dcim/forms/bulk_edit.py:1290 +#: dcim/forms/bulk_import.py:59 dcim/forms/bulk_import.py:73 +#: dcim/forms/bulk_import.py:136 dcim/forms/bulk_import.py:503 +#: dcim/forms/bulk_import.py:770 dcim/forms/bulk_import.py:1021 +#: dcim/forms/filtersets.py:226 dcim/forms/model_forms.py:73 +#: dcim/forms/model_forms.py:94 dcim/forms/model_forms.py:172 +#: dcim/forms/model_forms.py:955 dcim/forms/model_forms.py:1296 +#: dcim/forms/object_import.py:181 dcim/tables/devices.py:671 +#: dcim/tables/devices.py:955 extras/tables/tables.py:181 +#: ipam/tables/fhrp.py:59 ipam/tables/ip.py:374 ipam/tables/services.py:44 +#: templates/dcim/interface.html:105 templates/dcim/interface.html:321 +#: templates/dcim/location.html:44 templates/dcim/region.html:38 +#: templates/dcim/sitegroup.html:38 templates/ipam/service.html:31 +#: templates/tenancy/contactgroup.html:32 +#: templates/tenancy/tenantgroup.html:40 +#: templates/virtualization/vminterface.html:42 +#: templates/wireless/wirelesslangroup.html:38 tenancy/forms/bulk_edit.py:26 +#: tenancy/forms/bulk_edit.py:60 tenancy/forms/bulk_import.py:24 +#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:24 +#: tenancy/forms/model_forms.py:69 virtualization/forms/bulk_edit.py:206 +#: virtualization/forms/bulk_import.py:151 +#: virtualization/tables/virtualmachines.py:142 wireless/forms/bulk_edit.py:23 +#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:20 +msgid "Parent" +msgstr "親" + +#: dcim/choices.py:141 +msgid "Child" +msgstr "子ども" + +#: dcim/choices.py:155 templates/dcim/device.html:345 +#: templates/dcim/rack.html:181 templates/dcim/rack_elevation_list.html:22 +#: templates/dcim/rackreservation.html:84 +msgid "Front" +msgstr "正面" + +#: dcim/choices.py:156 templates/dcim/device.html:351 +#: templates/dcim/rack.html:187 templates/dcim/rack_elevation_list.html:23 +#: templates/dcim/rackreservation.html:90 +msgid "Rear" +msgstr "リア" + +#: dcim/choices.py:175 dcim/choices.py:221 virtualization/choices.py:46 +msgid "Staged" +msgstr "上演" + +#: dcim/choices.py:177 +msgid "Inventory" +msgstr "インベントリ" + +#: dcim/choices.py:193 +msgid "Front to rear" +msgstr "前面から背面へ" + +#: dcim/choices.py:194 +msgid "Rear to front" +msgstr "背面から前面へ" + +#: dcim/choices.py:195 +msgid "Left to right" +msgstr "左から右" + +#: dcim/choices.py:196 +msgid "Right to left" +msgstr "右から左" + +#: dcim/choices.py:197 +msgid "Side to rear" +msgstr "側面から背面へ" + +#: dcim/choices.py:198 dcim/choices.py:1215 +msgid "Passive" +msgstr "パッシブ" + +#: dcim/choices.py:199 +msgid "Mixed" +msgstr "混合" + +#: dcim/choices.py:443 dcim/choices.py:680 +msgid "NEMA (Non-locking)" +msgstr "NEMA (ノンロック)" + +#: dcim/choices.py:465 dcim/choices.py:702 +msgid "NEMA (Locking)" +msgstr "ネマ (ロッキング)" + +#: dcim/choices.py:488 dcim/choices.py:725 +msgid "California Style" +msgstr "カリフォルニアスタイル" + +#: dcim/choices.py:496 +msgid "International/ITA" +msgstr "インターナショナル/イタリア" + +#: dcim/choices.py:526 dcim/choices.py:755 +msgid "Proprietary" +msgstr "プロプライエタリ" + +#: dcim/choices.py:534 dcim/choices.py:764 dcim/choices.py:1131 +#: dcim/choices.py:1133 dcim/choices.py:1338 dcim/choices.py:1340 +#: netbox/navigation/menu.py:188 +msgid "Other" +msgstr "その他" + +#: dcim/choices.py:733 +msgid "ITA/International" +msgstr "ITA/インターナショナル" + +#: dcim/choices.py:794 +msgid "Physical" +msgstr "物理的" + +#: dcim/choices.py:795 dcim/choices.py:949 +msgid "Virtual" +msgstr "バーチャル" + +#: dcim/choices.py:796 dcim/choices.py:1019 dcim/forms/bulk_edit.py:1398 +#: dcim/forms/filtersets.py:1233 dcim/forms/model_forms.py:881 +#: dcim/forms/model_forms.py:1190 netbox/navigation/menu.py:128 +#: netbox/navigation/menu.py:132 templates/dcim/interface.html:217 +msgid "Wireless" +msgstr "ワイヤレス" + +#: dcim/choices.py:947 +msgid "Virtual interfaces" +msgstr "仮想インターフェース" + +#: dcim/choices.py:950 dcim/forms/bulk_edit.py:1295 +#: dcim/forms/bulk_import.py:777 dcim/forms/model_forms.py:869 +#: dcim/tables/devices.py:675 templates/dcim/interface.html:109 +#: templates/virtualization/vminterface.html:46 +#: virtualization/forms/bulk_edit.py:211 +#: virtualization/forms/bulk_import.py:158 +#: virtualization/tables/virtualmachines.py:146 +msgid "Bridge" +msgstr "ブリッジ" + +#: dcim/choices.py:951 +msgid "Link Aggregation Group (LAG)" +msgstr "リンク・アグリゲーション・グループ (LAG)" + +#: dcim/choices.py:955 +msgid "Ethernet (fixed)" +msgstr "イーサネット (固定)" + +#: dcim/choices.py:969 +msgid "Ethernet (modular)" +msgstr "イーサネット (モジュラー)" + +#: dcim/choices.py:1005 +msgid "Ethernet (backplane)" +msgstr "イーサネット (バックプレーン)" + +#: dcim/choices.py:1033 +msgid "Cellular" +msgstr "セルラー" + +#: dcim/choices.py:1080 dcim/forms/filtersets.py:302 +#: dcim/forms/filtersets.py:736 dcim/forms/filtersets.py:876 +#: dcim/forms/filtersets.py:1426 templates/dcim/inventoryitem.html:53 +#: templates/dcim/virtualchassis_edit.html:55 +msgid "Serial" +msgstr "シリアル" + +#: dcim/choices.py:1095 +msgid "Coaxial" +msgstr "同軸" + +#: dcim/choices.py:1112 +msgid "Stacking" +msgstr "スタッキング" + +#: dcim/choices.py:1162 +msgid "Half" +msgstr "ハーフ" + +#: dcim/choices.py:1163 +msgid "Full" +msgstr "フル" + +#: dcim/choices.py:1164 netbox/preferences.py:29 wireless/choices.py:480 +msgid "Auto" +msgstr "オート" + +#: dcim/choices.py:1175 +msgid "Access" +msgstr "アクセス" + +#: dcim/choices.py:1176 ipam/tables/vlans.py:168 ipam/tables/vlans.py:213 +#: templates/dcim/inc/interface_vlans_table.html:7 +msgid "Tagged" +msgstr "タグ付き" + +#: dcim/choices.py:1177 +msgid "Tagged (All)" +msgstr "タグ付き (全て)" + +#: dcim/choices.py:1206 +msgid "IEEE Standard" +msgstr "IEEE スタンダード" + +#: dcim/choices.py:1217 +msgid "Passive 24V (2-pair)" +msgstr "パッシブ 24V (2 ペア)" + +#: dcim/choices.py:1218 +msgid "Passive 24V (4-pair)" +msgstr "パッシブ 24V (4ペア)" + +#: dcim/choices.py:1219 +msgid "Passive 48V (2-pair)" +msgstr "パッシブ 48V (2 ペア)" + +#: dcim/choices.py:1220 +msgid "Passive 48V (4-pair)" +msgstr "パッシブ 48V (4ペア)" + +#: dcim/choices.py:1282 dcim/choices.py:1378 +msgid "Copper" +msgstr "銅" + +#: dcim/choices.py:1305 +msgid "Fiber Optic" +msgstr "光ファイバー" + +#: dcim/choices.py:1394 +msgid "Fiber" +msgstr "ファイバー" + +#: dcim/choices.py:1418 dcim/forms/filtersets.py:1140 +msgid "Connected" +msgstr "接続済み" + +#: dcim/choices.py:1437 +msgid "Kilometers" +msgstr "キロメートル" + +#: dcim/choices.py:1438 templates/dcim/cable_trace.html:62 +msgid "Meters" +msgstr "メートル" + +#: dcim/choices.py:1439 +msgid "Centimeters" +msgstr "センチメートル" + +#: dcim/choices.py:1440 +msgid "Miles" +msgstr "マイル" + +#: dcim/choices.py:1441 templates/dcim/cable_trace.html:63 +msgid "Feet" +msgstr "フィート" + +#: dcim/choices.py:1457 templates/dcim/device.html:332 +#: templates/dcim/rack.html:157 +msgid "Kilograms" +msgstr "キログラム" + +#: dcim/choices.py:1458 +msgid "Grams" +msgstr "グラム" + +#: dcim/choices.py:1459 templates/dcim/rack.html:158 +msgid "Pounds" +msgstr "ポンド" + +#: dcim/choices.py:1460 +msgid "Ounces" +msgstr "オンス" + +#: dcim/choices.py:1506 tenancy/choices.py:17 +msgid "Primary" +msgstr "プライマリ" + +#: dcim/choices.py:1507 +msgid "Redundant" +msgstr "冗長" + +#: dcim/choices.py:1528 +msgid "Single phase" +msgstr "シングルフェーズ" + +#: dcim/choices.py:1529 +msgid "Three-phase" +msgstr "3 フェーズ" + +#: dcim/filtersets.py:82 +msgid "Parent region (ID)" +msgstr "親リージョン (ID)" + +#: dcim/filtersets.py:88 +msgid "Parent region (slug)" +msgstr "親リージョン (スラッグ)" + +#: dcim/filtersets.py:99 +msgid "Parent site group (ID)" +msgstr "親サイトグループ (ID)" + +#: dcim/filtersets.py:105 +msgid "Parent site group (slug)" +msgstr "親サイトグループ (スラッグ)" + +#: dcim/filtersets.py:134 ipam/filtersets.py:797 ipam/filtersets.py:930 +msgid "Group (ID)" +msgstr "グループ (ID)" + +#: dcim/filtersets.py:140 +msgid "Group (slug)" +msgstr "グループ (スラッグ)" + +#: dcim/filtersets.py:146 dcim/filtersets.py:151 +msgid "AS (ID)" +msgstr "(ID) として" + +#: dcim/filtersets.py:219 dcim/filtersets.py:294 dcim/filtersets.py:393 +#: dcim/filtersets.py:925 dcim/filtersets.py:1229 dcim/filtersets.py:1967 +msgid "Location (ID)" +msgstr "ロケーション (ID)" + +#: dcim/filtersets.py:226 dcim/filtersets.py:301 dcim/filtersets.py:400 +#: dcim/filtersets.py:1235 extras/filtersets.py:447 +msgid "Location (slug)" +msgstr "場所 (スラッグ)" + +#: dcim/filtersets.py:315 dcim/filtersets.py:772 dcim/filtersets.py:862 +#: dcim/filtersets.py:1635 ipam/filtersets.py:347 ipam/filtersets.py:459 +#: ipam/filtersets.py:940 virtualization/filtersets.py:210 +msgid "Role (ID)" +msgstr "ロール (ID)" + +#: dcim/filtersets.py:321 dcim/filtersets.py:778 dcim/filtersets.py:868 +#: dcim/filtersets.py:1641 extras/filtersets.py:463 ipam/filtersets.py:353 +#: ipam/filtersets.py:465 ipam/filtersets.py:946 +#: virtualization/filtersets.py:216 +msgid "Role (slug)" +msgstr "ロール (スラッグ)" + +#: dcim/filtersets.py:350 dcim/filtersets.py:930 dcim/filtersets.py:1240 +#: dcim/filtersets.py:2029 +msgid "Rack (ID)" +msgstr "ラック (ID)" + +#: dcim/filtersets.py:404 extras/filtersets.py:234 extras/filtersets.py:278 +#: extras/filtersets.py:318 extras/filtersets.py:613 +msgid "User (ID)" +msgstr "ユーザ (ID)" + +#: dcim/filtersets.py:410 extras/filtersets.py:240 extras/filtersets.py:284 +#: extras/filtersets.py:324 users/filtersets.py:80 users/filtersets.py:140 +msgid "User (name)" +msgstr "ユーザー (名前)" + +#: dcim/filtersets.py:438 dcim/filtersets.py:565 dcim/filtersets.py:762 +#: dcim/filtersets.py:813 dcim/filtersets.py:841 dcim/filtersets.py:1131 +#: dcim/filtersets.py:1625 +msgid "Manufacturer (ID)" +msgstr "メーカー (ID)" + +#: dcim/filtersets.py:444 dcim/filtersets.py:571 dcim/filtersets.py:768 +#: dcim/filtersets.py:819 dcim/filtersets.py:847 dcim/filtersets.py:1137 +#: dcim/filtersets.py:1631 +msgid "Manufacturer (slug)" +msgstr "メーカー (スラッグ)" + +#: dcim/filtersets.py:448 +msgid "Default platform (ID)" +msgstr "デフォルトプラットフォーム (ID)" + +#: dcim/filtersets.py:454 +msgid "Default platform (slug)" +msgstr "デフォルトプラットフォーム (スラッグ)" + +#: dcim/filtersets.py:457 dcim/forms/filtersets.py:452 +msgid "Has a front image" +msgstr "正面画像あり" + +#: dcim/filtersets.py:461 dcim/forms/filtersets.py:459 +msgid "Has a rear image" +msgstr "背面画像あり" + +#: dcim/filtersets.py:466 dcim/filtersets.py:575 dcim/filtersets.py:983 +#: dcim/forms/filtersets.py:466 dcim/forms/filtersets.py:563 +#: dcim/forms/filtersets.py:775 +msgid "Has console ports" +msgstr "コンソールポートあり" + +#: dcim/filtersets.py:470 dcim/filtersets.py:579 dcim/filtersets.py:987 +#: dcim/forms/filtersets.py:473 dcim/forms/filtersets.py:570 +#: dcim/forms/filtersets.py:782 +msgid "Has console server ports" +msgstr "コンソール・サーバー・ポートあり" + +#: dcim/filtersets.py:474 dcim/filtersets.py:583 dcim/filtersets.py:991 +#: dcim/forms/filtersets.py:480 dcim/forms/filtersets.py:577 +#: dcim/forms/filtersets.py:789 +msgid "Has power ports" +msgstr "電源ポート付き" + +#: dcim/filtersets.py:478 dcim/filtersets.py:587 dcim/filtersets.py:995 +#: dcim/forms/filtersets.py:487 dcim/forms/filtersets.py:584 +#: dcim/forms/filtersets.py:796 +msgid "Has power outlets" +msgstr "電源コンセントあり" + +#: dcim/filtersets.py:482 dcim/filtersets.py:591 dcim/filtersets.py:999 +#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:591 +#: dcim/forms/filtersets.py:803 +msgid "Has interfaces" +msgstr "インターフェースあり" + +#: dcim/filtersets.py:486 dcim/filtersets.py:595 dcim/filtersets.py:1003 +#: dcim/forms/filtersets.py:501 dcim/forms/filtersets.py:598 +#: dcim/forms/filtersets.py:810 +msgid "Has pass-through ports" +msgstr "パススルーポートあり" + +#: dcim/filtersets.py:490 dcim/filtersets.py:1007 dcim/forms/filtersets.py:515 +msgid "Has module bays" +msgstr "モジュールベイあり" + +#: dcim/filtersets.py:494 dcim/filtersets.py:1011 dcim/forms/filtersets.py:508 +msgid "Has device bays" +msgstr "デバイスベイあり" + +#: dcim/filtersets.py:498 dcim/forms/filtersets.py:522 +msgid "Has inventory items" +msgstr "インベントリアイテムあり" + +#: dcim/filtersets.py:643 dcim/filtersets.py:857 dcim/filtersets.py:1261 +msgid "Device type (ID)" +msgstr "デバイスタイプ (ID)" + +#: dcim/filtersets.py:659 dcim/filtersets.py:1142 +msgid "Module type (ID)" +msgstr "モジュールタイプ (ID)" + +#: dcim/filtersets.py:758 dcim/filtersets.py:1621 +msgid "Parent inventory item (ID)" +msgstr "親インベントリアイテム (ID)" + +#: dcim/filtersets.py:801 dcim/filtersets.py:823 dcim/filtersets.py:979 +#: virtualization/filtersets.py:238 +msgid "Config template (ID)" +msgstr "設定テンプレート (ID)" + +#: dcim/filtersets.py:853 +msgid "Device type (slug)" +msgstr "デバイスタイプ (スラッグ)" + +#: dcim/filtersets.py:873 +msgid "Parent Device (ID)" +msgstr "親デバイス (ID)" + +#: dcim/filtersets.py:877 virtualization/filtersets.py:220 +msgid "Platform (ID)" +msgstr "プラットフォーム (ID)" + +#: dcim/filtersets.py:883 extras/filtersets.py:474 +#: virtualization/filtersets.py:226 +msgid "Platform (slug)" +msgstr "プラットフォーム (スラッグ)" + +#: dcim/filtersets.py:919 dcim/filtersets.py:1224 dcim/filtersets.py:1719 +#: dcim/filtersets.py:1961 dcim/filtersets.py:2020 +msgid "Site name (slug)" +msgstr "サイト名 (スラッグ)" + +#: dcim/filtersets.py:934 +msgid "VM cluster (ID)" +msgstr "VM クラスタ (ID)" + +#: dcim/filtersets.py:940 +msgid "Device model (slug)" +msgstr "デバイスモデル (スラッグ)" + +#: dcim/filtersets.py:951 dcim/forms/bulk_edit.py:421 +msgid "Is full depth" +msgstr "奥行きがいっぱい" + +#: dcim/filtersets.py:955 dcim/forms/common.py:18 dcim/forms/filtersets.py:745 +#: dcim/forms/filtersets.py:1285 dcim/models/device_components.py:519 +#: virtualization/filtersets.py:230 virtualization/filtersets.py:297 +#: virtualization/forms/filtersets.py:168 +#: virtualization/forms/filtersets.py:215 +msgid "MAC address" +msgstr "MAC アドレス" + +#: dcim/filtersets.py:962 dcim/forms/filtersets.py:754 +#: dcim/forms/filtersets.py:841 virtualization/filtersets.py:234 +#: virtualization/forms/filtersets.py:172 +msgid "Has a primary IP" +msgstr "プライマリ IP がある" + +#: dcim/filtersets.py:966 +msgid "Has an out-of-band IP" +msgstr "帯域外 IP がある" + +#: dcim/filtersets.py:971 +msgid "Virtual chassis (ID)" +msgstr "バーチャルシャーシ (ID)" + +#: dcim/filtersets.py:975 +msgid "Is a virtual chassis member" +msgstr "バーチャルシャーシのメンバーです" + +#: dcim/filtersets.py:1016 +msgid "OOB IP (ID)" +msgstr "ブーブチップ (ID)" + +#: dcim/filtersets.py:1148 +msgid "Module type (model)" +msgstr "モジュールタイプ (モデル)" + +#: dcim/filtersets.py:1154 +msgid "Module Bay (ID)" +msgstr "モジュールベイ (ID)" + +#: dcim/filtersets.py:1158 dcim/filtersets.py:1250 ipam/filtersets.py:577 +#: ipam/filtersets.py:807 ipam/filtersets.py:1026 +#: virtualization/filtersets.py:161 vpn/filtersets.py:351 +msgid "Device (ID)" +msgstr "デバイス (ID)" + +#: dcim/filtersets.py:1246 +msgid "Rack (name)" +msgstr "ラック (名前)" + +#: dcim/filtersets.py:1256 ipam/filtersets.py:572 ipam/filtersets.py:802 +#: ipam/filtersets.py:1032 vpn/filtersets.py:346 +msgid "Device (name)" +msgstr "デバイス (名前)" + +#: dcim/filtersets.py:1267 +msgid "Device type (model)" +msgstr "デバイスタイプ (モデル)" + +#: dcim/filtersets.py:1272 dcim/filtersets.py:1295 +msgid "Device role (ID)" +msgstr "デバイスロール (ID)" + +#: dcim/filtersets.py:1278 dcim/filtersets.py:1301 +msgid "Device role (slug)" +msgstr "デバイスロール (スラッグ)" + +#: dcim/filtersets.py:1283 +msgid "Virtual Chassis (ID)" +msgstr "バーチャルシャーシ (ID)" + +#: dcim/filtersets.py:1289 dcim/forms/filtersets.py:106 +#: dcim/tables/devices.py:235 netbox/navigation/menu.py:67 +#: templates/dcim/device.html:123 templates/dcim/device_edit.html:93 +#: templates/dcim/virtualchassis.html:20 +#: templates/dcim/virtualchassis_add.html:8 +#: templates/dcim/virtualchassis_edit.html:25 +msgid "Virtual Chassis" +msgstr "バーチャルシャーシ" + +#: dcim/filtersets.py:1321 +msgid "Module (ID)" +msgstr "モジュール (ID)" + +#: dcim/filtersets.py:1425 ipam/forms/bulk_import.py:188 +#: vpn/forms/bulk_import.py:308 +msgid "Assigned VLAN" +msgstr "割り当てられた VLAN" + +#: dcim/filtersets.py:1429 +msgid "Assigned VID" +msgstr "割り当てられた VID" + +#: dcim/filtersets.py:1434 dcim/forms/bulk_edit.py:1374 +#: dcim/forms/bulk_import.py:828 dcim/forms/filtersets.py:1328 +#: dcim/forms/model_forms.py:1175 dcim/models/device_components.py:712 +#: dcim/tables/devices.py:637 ipam/filtersets.py:282 ipam/filtersets.py:293 +#: ipam/filtersets.py:449 ipam/filtersets.py:550 ipam/filtersets.py:561 +#: ipam/forms/bulk_edit.py:226 ipam/forms/bulk_edit.py:281 +#: ipam/forms/bulk_edit.py:323 ipam/forms/bulk_import.py:156 +#: ipam/forms/bulk_import.py:242 ipam/forms/bulk_import.py:278 +#: ipam/forms/filtersets.py:66 ipam/forms/filtersets.py:167 +#: ipam/forms/filtersets.py:295 ipam/forms/model_forms.py:59 +#: ipam/forms/model_forms.py:203 ipam/forms/model_forms.py:246 +#: ipam/forms/model_forms.py:290 ipam/forms/model_forms.py:412 +#: ipam/forms/model_forms.py:426 ipam/forms/model_forms.py:440 +#: ipam/models/ip.py:232 ipam/models/ip.py:511 ipam/models/ip.py:719 +#: ipam/models/vrfs.py:62 ipam/tables/ip.py:241 ipam/tables/ip.py:306 +#: ipam/tables/ip.py:356 ipam/tables/ip.py:445 +#: templates/dcim/interface.html:138 templates/ipam/ipaddress.html:21 +#: templates/ipam/iprange.html:43 templates/ipam/prefix.html:20 +#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:14 +#: templates/virtualization/vminterface.html:50 +#: virtualization/forms/bulk_edit.py:260 +#: virtualization/forms/bulk_import.py:171 +#: virtualization/forms/filtersets.py:220 +#: virtualization/forms/model_forms.py:347 +#: virtualization/models/virtualmachines.py:348 +#: virtualization/tables/virtualmachines.py:123 +msgid "VRF" +msgstr "VRF" + +#: dcim/filtersets.py:1440 ipam/filtersets.py:288 ipam/filtersets.py:299 +#: ipam/filtersets.py:455 ipam/filtersets.py:556 ipam/filtersets.py:567 +msgid "VRF (RD)" +msgstr "VRF (赤)" + +#: dcim/filtersets.py:1445 ipam/filtersets.py:967 vpn/filtersets.py:314 +msgid "L2VPN (ID)" +msgstr "L2VPN (ID)" + +#: dcim/filtersets.py:1451 dcim/forms/filtersets.py:1333 +#: dcim/tables/devices.py:585 ipam/filtersets.py:973 +#: ipam/forms/filtersets.py:499 ipam/tables/vlans.py:133 +#: templates/dcim/interface.html:94 templates/ipam/vlan.html:69 +#: templates/vpn/l2vpntermination.html:15 +#: virtualization/forms/filtersets.py:225 vpn/forms/bulk_import.py:280 +#: vpn/forms/filtersets.py:242 vpn/forms/model_forms.py:402 +#: vpn/forms/model_forms.py:420 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +msgid "L2VPN" +msgstr "L2VPN" + +#: dcim/filtersets.py:1483 +msgid "Virtual Chassis Interfaces for Device" +msgstr "デバイス用バーチャルシャーシインターフェイス" + +#: dcim/filtersets.py:1488 +msgid "Virtual Chassis Interfaces for Device (ID)" +msgstr "デバイス (ID) のバーチャルシャーシインターフェイス" + +#: dcim/filtersets.py:1492 +msgid "Kind of interface" +msgstr "インターフェースの種類" + +#: dcim/filtersets.py:1497 virtualization/filtersets.py:289 +msgid "Parent interface (ID)" +msgstr "親インターフェース (ID)" + +#: dcim/filtersets.py:1502 virtualization/filtersets.py:294 +msgid "Bridged interface (ID)" +msgstr "ブリッジインターフェイス (ID)" + +#: dcim/filtersets.py:1507 +msgid "LAG interface (ID)" +msgstr "LAG インターフェイス (ID)" + +#: dcim/filtersets.py:1676 +msgid "Master (ID)" +msgstr "マスター (ID)" + +#: dcim/filtersets.py:1682 +msgid "Master (name)" +msgstr "マスター (名前)" + +#: dcim/filtersets.py:1724 tenancy/filtersets.py:221 +msgid "Tenant (ID)" +msgstr "テナント (ID)" + +#: dcim/filtersets.py:1730 extras/filtersets.py:523 tenancy/filtersets.py:227 +msgid "Tenant (slug)" +msgstr "テナント (スラッグ)" + +#: dcim/filtersets.py:1766 dcim/forms/filtersets.py:990 +msgid "Unterminated" +msgstr "未終了" + +#: dcim/filtersets.py:2024 +msgid "Power panel (ID)" +msgstr "電源パネル (ID)" + +#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:410 +#: extras/forms/model_forms.py:451 extras/forms/model_forms.py:502 +#: netbox/forms/base.py:82 netbox/forms/mixins.py:79 +#: netbox/tables/columns.py:448 +#: templates/circuits/inc/circuit_termination.html:119 +#: templates/generic/bulk_edit.html:81 templates/inc/panels/tags.html:5 +#: utilities/forms/fields/fields.py:81 +msgid "Tags" +msgstr "[タグ]" + +#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1390 +#: dcim/forms/model_forms.py:422 dcim/forms/model_forms.py:468 +#: dcim/forms/object_create.py:196 dcim/forms/object_create.py:352 +#: dcim/tables/devices.py:198 dcim/tables/devices.py:720 +#: dcim/tables/devicetypes.py:242 templates/dcim/device.html:45 +#: templates/dcim/device.html:129 templates/dcim/modulebay.html:35 +#: templates/dcim/virtualchassis.html:59 +#: templates/dcim/virtualchassis_edit.html:56 +msgid "Position" +msgstr "ポジション" + +#: dcim/forms/bulk_create.py:114 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of names being " +"created.)" +msgstr "英数字の範囲がサポートされています。(作成する名前の数と一致する必要があります)。" + +#: dcim/forms/bulk_edit.py:115 dcim/forms/bulk_import.py:99 +#: dcim/forms/model_forms.py:120 dcim/tables/sites.py:89 +#: ipam/filtersets.py:936 ipam/forms/bulk_edit.py:528 +#: ipam/forms/bulk_import.py:444 ipam/forms/model_forms.py:509 +#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 +#: templates/dcim/interface.html:294 templates/dcim/site.html:37 +#: templates/ipam/inc/panels/fhrp_groups.html:10 templates/ipam/vlan.html:30 +#: templates/tenancy/contact.html:22 templates/tenancy/tenant.html:21 +#: templates/users/group.html:6 templates/users/group.html:14 +#: templates/virtualization/cluster.html:32 templates/vpn/tunnel.html:30 +#: templates/wireless/wirelesslan.html:19 tenancy/forms/bulk_edit.py:42 +#: tenancy/forms/bulk_edit.py:93 tenancy/forms/bulk_import.py:40 +#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:47 +#: tenancy/forms/filtersets.py:77 tenancy/forms/filtersets.py:96 +#: tenancy/forms/model_forms.py:46 tenancy/forms/model_forms.py:102 +#: tenancy/forms/model_forms.py:124 tenancy/tables/contacts.py:60 +#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 +#: users/filtersets.py:42 users/filtersets.py:145 users/forms/filtersets.py:32 +#: users/forms/filtersets.py:38 users/forms/filtersets.py:80 +#: virtualization/forms/bulk_edit.py:64 virtualization/forms/bulk_import.py:47 +#: virtualization/forms/filtersets.py:84 +#: virtualization/forms/model_forms.py:69 virtualization/tables/clusters.py:70 +#: vpn/forms/bulk_edit.py:111 vpn/forms/bulk_import.py:158 +#: vpn/forms/filtersets.py:113 vpn/tables/crypto.py:31 +#: wireless/forms/bulk_edit.py:47 wireless/forms/bulk_import.py:36 +#: wireless/forms/filtersets.py:45 wireless/forms/model_forms.py:41 +#: wireless/tables/wirelesslan.py:48 +msgid "Group" +msgstr "[グループ]" + +#: dcim/forms/bulk_edit.py:130 +msgid "Contact name" +msgstr "連絡先名" + +#: dcim/forms/bulk_edit.py:135 +msgid "Contact phone" +msgstr "連絡先電話番号" + +#: dcim/forms/bulk_edit.py:141 +msgid "Contact E-mail" +msgstr "連絡先電子メール" + +#: dcim/forms/bulk_edit.py:144 dcim/forms/bulk_import.py:122 +#: dcim/forms/model_forms.py:131 +msgid "Time zone" +msgstr "タイムゾーン" + +#: dcim/forms/bulk_edit.py:266 dcim/forms/bulk_edit.py:1152 +#: dcim/forms/bulk_edit.py:1539 dcim/forms/bulk_import.py:199 +#: dcim/forms/bulk_import.py:1009 dcim/forms/filtersets.py:299 +#: dcim/forms/filtersets.py:704 dcim/forms/filtersets.py:1417 +#: dcim/forms/model_forms.py:224 dcim/forms/model_forms.py:963 +#: dcim/forms/model_forms.py:1304 dcim/forms/object_import.py:186 +#: dcim/tables/devices.py:202 dcim/tables/devices.py:828 +#: dcim/tables/devices.py:939 dcim/tables/devicetypes.py:300 +#: dcim/tables/racks.py:69 extras/filtersets.py:457 +#: ipam/forms/bulk_edit.py:245 ipam/forms/bulk_edit.py:294 +#: ipam/forms/bulk_edit.py:342 ipam/forms/bulk_edit.py:546 +#: ipam/forms/bulk_import.py:196 ipam/forms/bulk_import.py:261 +#: ipam/forms/bulk_import.py:297 ipam/forms/bulk_import.py:463 +#: ipam/forms/filtersets.py:232 ipam/forms/filtersets.py:278 +#: ipam/forms/filtersets.py:346 ipam/forms/filtersets.py:490 +#: ipam/forms/model_forms.py:187 ipam/forms/model_forms.py:222 +#: ipam/forms/model_forms.py:249 ipam/forms/model_forms.py:647 +#: ipam/tables/ip.py:257 ipam/tables/ip.py:313 ipam/tables/ip.py:363 +#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:230 +#: templates/dcim/device.html:187 +#: templates/dcim/inc/panels/inventory_items.html:12 +#: templates/dcim/interface.html:231 templates/dcim/inventoryitem.html:37 +#: templates/dcim/rack.html:50 templates/ipam/ipaddress.html:44 +#: templates/ipam/iprange.html:53 templates/ipam/prefix.html:78 +#: templates/ipam/role.html:20 templates/ipam/vlan.html:55 +#: templates/virtualization/virtualmachine.html:26 +#: templates/vpn/tunneltermination.html:18 +#: templates/wireless/inc/wirelesslink_interface.html:20 +#: tenancy/forms/bulk_edit.py:141 tenancy/forms/filtersets.py:106 +#: tenancy/forms/model_forms.py:139 tenancy/tables/contacts.py:102 +#: virtualization/forms/bulk_edit.py:144 +#: virtualization/forms/bulk_import.py:106 +#: virtualization/forms/filtersets.py:153 +#: virtualization/forms/model_forms.py:198 +#: virtualization/tables/virtualmachines.py:65 vpn/forms/bulk_edit.py:86 +#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:84 +#: vpn/forms/model_forms.py:77 vpn/forms/model_forms.py:112 +#: vpn/tables/tunnels.py:78 +msgid "Role" +msgstr "役割" + +#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:605 +#: dcim/forms/bulk_edit.py:654 templates/dcim/device.html:106 +#: templates/dcim/module.html:75 templates/dcim/modulebay.html:69 +#: templates/dcim/rack.html:58 +msgid "Serial Number" +msgstr "[シリアル番号]" + +#: dcim/forms/bulk_edit.py:276 dcim/forms/filtersets.py:306 +#: dcim/forms/filtersets.py:740 dcim/forms/filtersets.py:880 +#: dcim/forms/filtersets.py:1430 +msgid "Asset tag" +msgstr "アセットタグ" + +#: dcim/forms/bulk_edit.py:286 dcim/forms/bulk_import.py:212 +#: dcim/forms/filtersets.py:291 templates/dcim/rack.html:91 +#: templates/dcim/rack_edit.html:48 +msgid "Width" +msgstr "幅" + +#: dcim/forms/bulk_edit.py:292 +msgid "Height (U)" +msgstr "高さ (U)" + +#: dcim/forms/bulk_edit.py:297 +msgid "Descending units" +msgstr "降順単位" + +#: dcim/forms/bulk_edit.py:300 +msgid "Outer width" +msgstr "外側の幅" + +#: dcim/forms/bulk_edit.py:305 +msgid "Outer depth" +msgstr "外側の深さ" + +#: dcim/forms/bulk_edit.py:310 dcim/forms/bulk_import.py:217 +msgid "Outer unit" +msgstr "アウターユニット" + +#: dcim/forms/bulk_edit.py:315 +msgid "Mounting depth" +msgstr "取り付け深さ" + +#: dcim/forms/bulk_edit.py:320 dcim/forms/bulk_edit.py:349 +#: dcim/forms/bulk_edit.py:434 dcim/forms/bulk_edit.py:457 +#: dcim/forms/bulk_edit.py:473 dcim/forms/bulk_edit.py:493 +#: dcim/forms/bulk_import.py:324 dcim/forms/bulk_import.py:350 +#: dcim/forms/filtersets.py:250 dcim/forms/filtersets.py:311 +#: dcim/forms/filtersets.py:335 dcim/forms/filtersets.py:423 +#: dcim/forms/filtersets.py:529 dcim/forms/filtersets.py:548 +#: dcim/forms/filtersets.py:605 dcim/forms/model_forms.py:337 +#: dcim/tables/devicetypes.py:103 dcim/tables/modules.py:35 +#: dcim/tables/racks.py:103 extras/forms/bulk_edit.py:45 +#: extras/forms/bulk_edit.py:107 extras/forms/bulk_edit.py:157 +#: extras/forms/bulk_edit.py:277 extras/forms/filtersets.py:60 +#: extras/forms/filtersets.py:133 extras/forms/filtersets.py:220 +#: ipam/forms/bulk_edit.py:187 templates/dcim/device.html:329 +#: templates/dcim/devicetype.html:52 templates/dcim/moduletype.html:31 +#: templates/dcim/rack_edit.html:60 templates/dcim/rack_edit.html:63 +#: templates/extras/configcontext.html:18 templates/extras/customlink.html:26 +#: templates/extras/savedfilter.html:34 templates/ipam/role.html:33 +msgid "Weight" +msgstr "ウェイト" + +#: dcim/forms/bulk_edit.py:325 dcim/forms/filtersets.py:316 +msgid "Max weight" +msgstr "最大重量" + +#: dcim/forms/bulk_edit.py:330 dcim/forms/bulk_edit.py:439 +#: dcim/forms/bulk_edit.py:478 dcim/forms/bulk_import.py:223 +#: dcim/forms/bulk_import.py:329 dcim/forms/bulk_import.py:355 +#: dcim/forms/filtersets.py:321 dcim/forms/filtersets.py:533 +#: dcim/forms/filtersets.py:609 +msgid "Weight unit" +msgstr "重量単位" + +#: dcim/forms/bulk_edit.py:344 dcim/forms/bulk_edit.py:800 +#: dcim/forms/bulk_import.py:262 dcim/forms/bulk_import.py:265 +#: dcim/forms/bulk_import.py:490 dcim/forms/bulk_import.py:1286 +#: dcim/forms/bulk_import.py:1290 dcim/forms/filtersets.py:101 +#: dcim/forms/filtersets.py:339 dcim/forms/filtersets.py:353 +#: dcim/forms/filtersets.py:391 dcim/forms/filtersets.py:699 +#: dcim/forms/filtersets.py:948 dcim/forms/filtersets.py:1080 +#: dcim/forms/model_forms.py:241 dcim/forms/model_forms.py:413 +#: dcim/forms/model_forms.py:662 dcim/forms/object_create.py:399 +#: dcim/tables/devices.py:194 dcim/tables/power.py:70 dcim/tables/racks.py:148 +#: ipam/forms/bulk_edit.py:464 ipam/forms/filtersets.py:427 +#: ipam/forms/model_forms.py:571 templates/dcim/device.html:30 +#: templates/dcim/inc/cable_termination.html:16 +#: templates/dcim/powerfeed.html:31 templates/dcim/rack.html:14 +#: templates/dcim/rack/base.html:4 templates/dcim/rack_edit.html:8 +#: templates/dcim/rackreservation.html:20 +#: templates/dcim/rackreservation.html:39 +#: virtualization/forms/model_forms.py:116 +msgid "Rack" +msgstr "ラック" + +#: dcim/forms/bulk_edit.py:346 dcim/forms/bulk_edit.py:623 +#: dcim/forms/filtersets.py:247 dcim/forms/filtersets.py:332 +#: dcim/forms/filtersets.py:417 dcim/forms/filtersets.py:543 +#: dcim/forms/filtersets.py:652 dcim/forms/filtersets.py:853 +#: dcim/forms/model_forms.py:589 dcim/forms/model_forms.py:1374 +#: templates/dcim/device_edit.html:20 +#: templates/dcim/inventoryitem_edit.html:23 +msgid "Hardware" +msgstr "ハードウェア" + +#: dcim/forms/bulk_edit.py:400 dcim/forms/bulk_edit.py:464 +#: dcim/forms/bulk_edit.py:528 dcim/forms/bulk_edit.py:552 +#: dcim/forms/bulk_edit.py:633 dcim/forms/bulk_edit.py:1157 +#: dcim/forms/bulk_edit.py:1544 dcim/forms/bulk_import.py:311 +#: dcim/forms/bulk_import.py:345 dcim/forms/bulk_import.py:387 +#: dcim/forms/bulk_import.py:423 dcim/forms/bulk_import.py:1015 +#: dcim/forms/filtersets.py:429 dcim/forms/filtersets.py:554 +#: dcim/forms/filtersets.py:631 dcim/forms/filtersets.py:709 +#: dcim/forms/filtersets.py:858 dcim/forms/filtersets.py:1423 +#: dcim/forms/model_forms.py:274 dcim/forms/model_forms.py:288 +#: dcim/forms/model_forms.py:330 dcim/forms/model_forms.py:370 +#: dcim/forms/model_forms.py:968 dcim/forms/model_forms.py:1309 +#: dcim/forms/object_import.py:192 dcim/tables/devices.py:129 +#: dcim/tables/devices.py:205 dcim/tables/devices.py:942 +#: dcim/tables/devicetypes.py:81 dcim/tables/devicetypes.py:304 +#: dcim/tables/modules.py:20 dcim/tables/modules.py:60 +#: templates/dcim/devicetype.html:17 templates/dcim/inventoryitem.html:45 +#: templates/dcim/manufacturer.html:34 templates/dcim/modulebay.html:61 +#: templates/dcim/moduletype.html:15 templates/dcim/platform.html:40 +msgid "Manufacturer" +msgstr "メーカー" + +#: dcim/forms/bulk_edit.py:405 dcim/forms/bulk_import.py:317 +#: dcim/forms/filtersets.py:434 dcim/forms/model_forms.py:292 +msgid "Default platform" +msgstr "デフォルトプラットフォーム" + +#: dcim/forms/bulk_edit.py:410 dcim/forms/bulk_edit.py:469 +#: dcim/forms/filtersets.py:437 dcim/forms/filtersets.py:558 +msgid "Part number" +msgstr "パーツ番号" + +#: dcim/forms/bulk_edit.py:414 +msgid "U height" +msgstr "U ハイト" + +#: dcim/forms/bulk_edit.py:426 +msgid "Exclude from utilization" +msgstr "利用から除外" + +#: dcim/forms/bulk_edit.py:429 dcim/forms/bulk_edit.py:598 +#: dcim/forms/bulk_import.py:517 dcim/forms/filtersets.py:446 +#: dcim/forms/filtersets.py:731 templates/dcim/device.html:100 +#: templates/dcim/devicetype.html:68 +msgid "Airflow" +msgstr "エアフロー" + +#: dcim/forms/bulk_edit.py:453 dcim/forms/model_forms.py:303 +#: dcim/tables/devicetypes.py:78 templates/dcim/device.html:90 +#: templates/dcim/devicebay.html:59 templates/dcim/module.html:59 +msgid "Device Type" +msgstr "デバイスタイプ" + +#: dcim/forms/bulk_edit.py:492 dcim/forms/model_forms.py:336 +#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 +#: templates/dcim/module.html:63 templates/dcim/modulebay.html:65 +#: templates/dcim/moduletype.html:11 +msgid "Module Type" +msgstr "モジュールタイプ" + +#: dcim/forms/bulk_edit.py:506 dcim/models/devices.py:472 +msgid "VM role" +msgstr "仮想マシンの役割" + +#: dcim/forms/bulk_edit.py:509 dcim/forms/bulk_edit.py:533 +#: dcim/forms/bulk_edit.py:613 dcim/forms/bulk_import.py:368 +#: dcim/forms/bulk_import.py:372 dcim/forms/bulk_import.py:394 +#: dcim/forms/bulk_import.py:398 dcim/forms/bulk_import.py:523 +#: dcim/forms/bulk_import.py:527 dcim/forms/filtersets.py:620 +#: dcim/forms/filtersets.py:636 dcim/forms/filtersets.py:750 +#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:375 +#: dcim/forms/model_forms.py:477 virtualization/forms/bulk_import.py:132 +#: virtualization/forms/bulk_import.py:133 +#: virtualization/forms/filtersets.py:180 +#: virtualization/forms/model_forms.py:218 +msgid "Config template" +msgstr "設定テンプレート" + +#: dcim/forms/bulk_edit.py:557 dcim/forms/bulk_edit.py:951 +#: dcim/forms/bulk_import.py:429 dcim/forms/filtersets.py:111 +#: dcim/forms/model_forms.py:435 dcim/forms/model_forms.py:776 +#: dcim/forms/model_forms.py:790 extras/filtersets.py:452 +msgid "Device type" +msgstr "デバイスタイプ" + +#: dcim/forms/bulk_edit.py:565 dcim/forms/bulk_import.py:410 +#: dcim/forms/filtersets.py:116 dcim/forms/model_forms.py:440 +msgid "Device role" +msgstr "デバイスロール" + +#: dcim/forms/bulk_edit.py:588 dcim/forms/bulk_import.py:435 +#: dcim/forms/filtersets.py:723 dcim/forms/model_forms.py:385 +#: dcim/forms/model_forms.py:444 extras/filtersets.py:468 +#: templates/dcim/device.html:191 templates/dcim/platform.html:27 +#: templates/virtualization/virtualmachine.html:30 +#: virtualization/forms/bulk_edit.py:159 +#: virtualization/forms/bulk_import.py:122 +#: virtualization/forms/filtersets.py:164 +#: virtualization/forms/model_forms.py:206 +msgid "Platform" +msgstr "プラットフォーム" + +#: dcim/forms/bulk_edit.py:621 dcim/forms/bulk_edit.py:1171 +#: dcim/forms/bulk_edit.py:1534 dcim/forms/bulk_edit.py:1580 +#: dcim/forms/bulk_import.py:578 dcim/forms/bulk_import.py:640 +#: dcim/forms/bulk_import.py:666 dcim/forms/bulk_import.py:692 +#: dcim/forms/bulk_import.py:712 dcim/forms/bulk_import.py:765 +#: dcim/forms/bulk_import.py:879 dcim/forms/bulk_import.py:927 +#: dcim/forms/bulk_import.py:944 dcim/forms/bulk_import.py:956 +#: dcim/forms/bulk_import.py:1004 dcim/forms/bulk_import.py:1350 +#: dcim/forms/connections.py:23 dcim/forms/filtersets.py:128 +#: dcim/forms/filtersets.py:831 dcim/forms/filtersets.py:964 +#: dcim/forms/filtersets.py:1154 dcim/forms/filtersets.py:1176 +#: dcim/forms/filtersets.py:1198 dcim/forms/filtersets.py:1215 +#: dcim/forms/filtersets.py:1235 dcim/forms/filtersets.py:1343 +#: dcim/forms/filtersets.py:1365 dcim/forms/filtersets.py:1386 +#: dcim/forms/filtersets.py:1401 dcim/forms/filtersets.py:1412 +#: dcim/forms/filtersets.py:1476 dcim/forms/filtersets.py:1500 +#: dcim/forms/filtersets.py:1524 dcim/forms/model_forms.py:555 +#: dcim/forms/model_forms.py:753 dcim/forms/model_forms.py:1004 +#: dcim/forms/model_forms.py:1453 dcim/forms/object_create.py:256 +#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 +#: dcim/tables/connections.py:60 dcim/tables/devices.py:314 +#: dcim/tables/devices.py:374 dcim/tables/devices.py:418 +#: dcim/tables/devices.py:463 dcim/tables/devices.py:517 +#: dcim/tables/devices.py:609 dcim/tables/devices.py:710 +#: dcim/tables/devices.py:770 dcim/tables/devices.py:820 +#: dcim/tables/devices.py:880 dcim/tables/devices.py:932 +#: dcim/tables/devices.py:1058 dcim/tables/modules.py:52 +#: extras/forms/filtersets.py:329 ipam/forms/bulk_import.py:303 +#: ipam/forms/bulk_import.py:489 ipam/forms/filtersets.py:532 +#: ipam/forms/model_forms.py:685 ipam/tables/vlans.py:176 +#: templates/dcim/consoleport.html:23 templates/dcim/consoleserverport.html:23 +#: templates/dcim/device.html:14 templates/dcim/device.html:128 +#: templates/dcim/device_edit.html:10 templates/dcim/devicebay.html:23 +#: templates/dcim/devicebay.html:55 templates/dcim/frontport.html:23 +#: templates/dcim/interface.html:31 templates/dcim/interface.html:167 +#: templates/dcim/inventoryitem.html:21 templates/dcim/module.html:55 +#: templates/dcim/modulebay.html:21 templates/dcim/poweroutlet.html:23 +#: templates/dcim/powerport.html:23 templates/dcim/rearport.html:23 +#: templates/dcim/virtualchassis.html:58 +#: templates/dcim/virtualchassis_edit.html:52 +#: templates/dcim/virtualdevicecontext.html:25 +#: templates/ipam/ipaddress_edit.html:42 templates/ipam/service_create.html:17 +#: templates/ipam/service_edit.html:16 +#: templates/virtualization/virtualmachine.html:115 +#: templates/vpn/l2vpntermination_edit.html:22 +#: templates/vpn/tunneltermination.html:24 +#: templates/wireless/inc/wirelesslink_interface.html:6 +#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:136 +#: virtualization/forms/bulk_import.py:99 +#: virtualization/forms/filtersets.py:124 +#: virtualization/forms/model_forms.py:188 +#: virtualization/tables/virtualmachines.py:61 vpn/choices.py:44 +#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 +#: vpn/forms/filtersets.py:271 vpn/forms/model_forms.py:89 +#: vpn/forms/model_forms.py:124 vpn/forms/model_forms.py:237 +#: wireless/forms/model_forms.py:100 wireless/forms/model_forms.py:140 +#: wireless/tables/wirelesslan.py:75 +msgid "Device" +msgstr "[デバイス]" + +#: dcim/forms/bulk_edit.py:624 netbox/navigation/menu.py:441 +#: templates/extras/dashboard/widget_config.html:7 +msgid "Configuration" +msgstr "コンフィギュレーション" + +#: dcim/forms/bulk_edit.py:638 dcim/forms/bulk_import.py:590 +#: dcim/forms/model_forms.py:569 dcim/forms/model_forms.py:795 +msgid "Module type" +msgstr "モジュールタイプ" + +#: dcim/forms/bulk_edit.py:689 dcim/forms/bulk_edit.py:874 +#: dcim/forms/bulk_edit.py:893 dcim/forms/bulk_edit.py:916 +#: dcim/forms/bulk_edit.py:958 dcim/forms/bulk_edit.py:1002 +#: dcim/forms/bulk_edit.py:1053 dcim/forms/bulk_edit.py:1080 +#: dcim/forms/bulk_edit.py:1107 dcim/forms/bulk_edit.py:1125 +#: dcim/forms/bulk_edit.py:1143 dcim/forms/filtersets.py:64 +#: dcim/forms/object_create.py:45 templates/dcim/cable.html:33 +#: templates/dcim/consoleport.html:35 templates/dcim/consoleserverport.html:35 +#: templates/dcim/devicebay.html:31 templates/dcim/frontport.html:35 +#: templates/dcim/inc/panels/inventory_items.html:11 +#: templates/dcim/interface.html:43 templates/dcim/inventoryitem.html:33 +#: templates/dcim/modulebay.html:31 templates/dcim/poweroutlet.html:35 +#: templates/dcim/powerport.html:35 templates/dcim/rearport.html:35 +#: templates/extras/customfield.html:27 templates/generic/bulk_import.html:155 +msgid "Label" +msgstr "[ラベル]" + +#: dcim/forms/bulk_edit.py:698 dcim/forms/filtersets.py:981 +#: templates/dcim/cable.html:51 +msgid "Length" +msgstr "長さ" + +#: dcim/forms/bulk_edit.py:703 dcim/forms/bulk_import.py:1158 +#: dcim/forms/bulk_import.py:1161 dcim/forms/filtersets.py:985 +msgid "Length unit" +msgstr "長さ単位" + +#: dcim/forms/bulk_edit.py:727 templates/dcim/virtualchassis.html:24 +msgid "Domain" +msgstr "ドメイン" + +#: dcim/forms/bulk_edit.py:795 dcim/forms/bulk_import.py:1273 +#: dcim/forms/filtersets.py:1071 dcim/forms/model_forms.py:657 +msgid "Power panel" +msgstr "パワーパネル" + +#: dcim/forms/bulk_edit.py:817 dcim/forms/bulk_import.py:1309 +#: dcim/forms/filtersets.py:1093 templates/dcim/powerfeed.html:90 +msgid "Supply" +msgstr "サプライ" + +#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1314 +#: dcim/forms/filtersets.py:1098 templates/dcim/powerfeed.html:102 +msgid "Phase" +msgstr "フェーズ" + +#: dcim/forms/bulk_edit.py:829 dcim/forms/filtersets.py:1103 +#: templates/dcim/powerfeed.html:94 +msgid "Voltage" +msgstr "電圧" + +#: dcim/forms/bulk_edit.py:833 dcim/forms/filtersets.py:1107 +#: templates/dcim/powerfeed.html:98 +msgid "Amperage" +msgstr "アンペア数" + +#: dcim/forms/bulk_edit.py:837 dcim/forms/filtersets.py:1111 +msgid "Max utilization" +msgstr "最大使用率" + +#: dcim/forms/bulk_edit.py:841 dcim/forms/bulk_edit.py:1200 +#: dcim/forms/bulk_edit.py:1217 dcim/forms/bulk_edit.py:1234 +#: dcim/forms/bulk_edit.py:1252 dcim/forms/bulk_edit.py:1340 +#: dcim/forms/bulk_edit.py:1478 dcim/forms/bulk_edit.py:1495 +msgid "Mark connected" +msgstr "接続済みとしてマークする" + +#: dcim/forms/bulk_edit.py:926 +msgid "Maximum draw" +msgstr "最大ドロー" + +#: dcim/forms/bulk_edit.py:929 dcim/models/device_component_templates.py:256 +#: dcim/models/device_components.py:357 +msgid "Maximum power draw (watts)" +msgstr "最大消費電力 (ワット)" + +#: dcim/forms/bulk_edit.py:932 +msgid "Allocated draw" +msgstr "割り当てられた抽選" + +#: dcim/forms/bulk_edit.py:935 dcim/models/device_component_templates.py:263 +#: dcim/models/device_components.py:364 +msgid "Allocated power draw (watts)" +msgstr "割り当て消費電力 (ワット)" + +#: dcim/forms/bulk_edit.py:968 dcim/forms/bulk_import.py:723 +#: dcim/forms/model_forms.py:848 dcim/forms/model_forms.py:1076 +#: dcim/forms/model_forms.py:1361 dcim/forms/object_import.py:60 +msgid "Power port" +msgstr "電源ポート" + +#: dcim/forms/bulk_edit.py:973 +msgid "Feed leg" +msgstr "フィードレッグ" + +#: dcim/forms/bulk_edit.py:1019 dcim/forms/bulk_edit.py:1325 +msgid "Management only" +msgstr "管理のみ" + +#: dcim/forms/bulk_edit.py:1029 dcim/forms/bulk_edit.py:1331 +#: dcim/forms/bulk_import.py:813 dcim/forms/filtersets.py:1294 +#: dcim/forms/object_import.py:95 +#: dcim/models/device_component_templates.py:411 +#: dcim/models/device_components.py:671 +msgid "PoE mode" +msgstr "PoE モード" + +#: dcim/forms/bulk_edit.py:1035 dcim/forms/bulk_edit.py:1337 +#: dcim/forms/bulk_import.py:819 dcim/forms/filtersets.py:1299 +#: dcim/forms/object_import.py:100 +#: dcim/models/device_component_templates.py:417 +#: dcim/models/device_components.py:677 +msgid "PoE type" +msgstr "PoE タイプ" + +#: dcim/forms/bulk_edit.py:1041 dcim/forms/filtersets.py:1304 +#: dcim/forms/object_import.py:105 +msgid "Wireless role" +msgstr "ワイヤレスの役割" + +#: dcim/forms/bulk_edit.py:1178 dcim/forms/model_forms.py:588 +#: dcim/forms/model_forms.py:1019 dcim/tables/devices.py:337 +#: templates/dcim/consoleport.html:27 templates/dcim/consoleserverport.html:27 +#: templates/dcim/frontport.html:27 templates/dcim/interface.html:35 +#: templates/dcim/module.html:51 templates/dcim/modulebay.html:57 +#: templates/dcim/poweroutlet.html:27 templates/dcim/powerport.html:27 +#: templates/dcim/rearport.html:27 +msgid "Module" +msgstr "モジュール" + +#: dcim/forms/bulk_edit.py:1305 dcim/tables/devices.py:680 +#: templates/dcim/interface.html:113 +msgid "LAG" +msgstr "ラグ" + +#: dcim/forms/bulk_edit.py:1310 dcim/forms/model_forms.py:1103 +msgid "Virtual device contexts" +msgstr "仮想デバイスコンテキスト" + +#: dcim/forms/bulk_edit.py:1316 dcim/forms/bulk_import.py:651 +#: dcim/forms/bulk_import.py:677 dcim/forms/filtersets.py:1163 +#: dcim/forms/filtersets.py:1185 dcim/forms/filtersets.py:1258 +#: dcim/tables/devices.py:621 +#: templates/circuits/inc/circuit_termination.html:94 +#: templates/dcim/consoleport.html:43 templates/dcim/consoleserverport.html:43 +msgid "Speed" +msgstr "スピード" + +#: dcim/forms/bulk_edit.py:1345 dcim/forms/bulk_import.py:822 +#: templates/vpn/ikepolicy.html:26 templates/vpn/ipsecprofile.html:22 +#: templates/vpn/ipsecprofile.html:51 virtualization/forms/bulk_edit.py:232 +#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:145 +#: vpn/forms/bulk_edit.py:233 vpn/forms/bulk_import.py:176 +#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:132 +#: vpn/forms/filtersets.py:175 vpn/forms/filtersets.py:189 +#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +msgid "Mode" +msgstr "モード" + +#: dcim/forms/bulk_edit.py:1353 dcim/forms/model_forms.py:1152 +#: ipam/forms/bulk_import.py:177 ipam/forms/filtersets.py:479 +#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:239 +#: virtualization/forms/model_forms.py:324 +msgid "VLAN group" +msgstr "VLAN グループ" + +#: dcim/forms/bulk_edit.py:1361 dcim/forms/model_forms.py:1157 +#: dcim/tables/devices.py:594 virtualization/forms/bulk_edit.py:247 +#: virtualization/forms/model_forms.py:329 +msgid "Untagged VLAN" +msgstr "タグなし VLAN" + +#: dcim/forms/bulk_edit.py:1369 dcim/forms/model_forms.py:1166 +#: dcim/tables/devices.py:600 virtualization/forms/bulk_edit.py:255 +#: virtualization/forms/model_forms.py:338 +msgid "Tagged VLANs" +msgstr "タグ付き VLAN" + +#: dcim/forms/bulk_edit.py:1379 dcim/forms/model_forms.py:1139 +msgid "Wireless LAN group" +msgstr "ワイヤレス LAN グループ" + +#: dcim/forms/bulk_edit.py:1384 dcim/forms/model_forms.py:1144 +#: dcim/tables/devices.py:630 netbox/navigation/menu.py:134 +#: templates/dcim/interface.html:289 wireless/tables/wirelesslan.py:24 +msgid "Wireless LANs" +msgstr "ワイヤレス LAN" + +#: dcim/forms/bulk_edit.py:1393 dcim/forms/filtersets.py:1231 +#: dcim/forms/model_forms.py:1185 ipam/forms/bulk_edit.py:270 +#: ipam/forms/bulk_edit.py:361 ipam/forms/filtersets.py:166 +#: templates/dcim/interface.html:126 templates/ipam/prefix.html:96 +#: virtualization/forms/model_forms.py:352 +msgid "Addressing" +msgstr "アドレッシング" + +#: dcim/forms/bulk_edit.py:1394 dcim/forms/filtersets.py:651 +#: dcim/forms/model_forms.py:1186 virtualization/forms/model_forms.py:353 +msgid "Operation" +msgstr "オペレーション" + +#: dcim/forms/bulk_edit.py:1395 dcim/forms/filtersets.py:1232 +#: dcim/forms/model_forms.py:880 dcim/forms/model_forms.py:1188 +msgid "PoE" +msgstr "PoE" + +#: dcim/forms/bulk_edit.py:1396 dcim/forms/model_forms.py:1187 +#: templates/dcim/interface.html:101 virtualization/forms/bulk_edit.py:266 +#: virtualization/forms/model_forms.py:354 +msgid "Related Interfaces" +msgstr "関連インターフェース" + +#: dcim/forms/bulk_edit.py:1397 dcim/forms/model_forms.py:1189 +#: virtualization/forms/bulk_edit.py:267 +#: virtualization/forms/model_forms.py:355 +msgid "802.1Q Switching" +msgstr "802.1Q スイッチング" + +#: dcim/forms/bulk_edit.py:1458 dcim/forms/bulk_edit.py:1460 +msgid "Interface mode must be specified to assign VLANs" +msgstr "VLAN を割り当てるには、インターフェイスモードを指定する必要があります" + +#: dcim/forms/bulk_edit.py:1465 dcim/forms/common.py:50 +msgid "An access interface cannot have tagged VLANs assigned." +msgstr "アクセスインターフェイスにはタグ付き VLAN を割り当てることはできません。" + +#: dcim/forms/bulk_import.py:63 +msgid "Name of parent region" +msgstr "親地域の名前" + +#: dcim/forms/bulk_import.py:77 +msgid "Name of parent site group" +msgstr "親サイトグループの名前" + +#: dcim/forms/bulk_import.py:96 +msgid "Assigned region" +msgstr "割り当てられた地域" + +#: dcim/forms/bulk_import.py:103 tenancy/forms/bulk_import.py:44 +#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +msgid "Assigned group" +msgstr "割り当てられたグループ" + +#: dcim/forms/bulk_import.py:122 +msgid "available options" +msgstr "使用可能なオプション" + +#: dcim/forms/bulk_import.py:133 dcim/forms/bulk_import.py:480 +#: dcim/forms/bulk_import.py:1270 ipam/forms/bulk_import.py:174 +#: ipam/forms/bulk_import.py:441 virtualization/forms/bulk_import.py:63 +#: virtualization/forms/bulk_import.py:89 +msgid "Assigned site" +msgstr "割り当てられたサイト" + +#: dcim/forms/bulk_import.py:140 +msgid "Parent location" +msgstr "親の場所" + +#: dcim/forms/bulk_import.py:142 +msgid "Location not found." +msgstr "場所が見つかりません。" + +#: dcim/forms/bulk_import.py:191 +msgid "Name of assigned tenant" +msgstr "割り当てられたテナントの名前" + +#: dcim/forms/bulk_import.py:203 +msgid "Name of assigned role" +msgstr "割り当てられたロールの名前" + +#: dcim/forms/bulk_import.py:209 +msgid "Rack type" +msgstr "ラックタイプ" + +#: dcim/forms/bulk_import.py:214 +msgid "Rail-to-rail width (in inches)" +msgstr "レールツーレールの幅 (インチ)" + +#: dcim/forms/bulk_import.py:220 +msgid "Unit for outer dimensions" +msgstr "外形寸法の単位" + +#: dcim/forms/bulk_import.py:226 +msgid "Unit for rack weights" +msgstr "ラックウェイト用ユニット" + +#: dcim/forms/bulk_import.py:252 +msgid "Parent site" +msgstr "親サイト" + +#: dcim/forms/bulk_import.py:259 dcim/forms/bulk_import.py:1283 +msgid "Rack's location (if any)" +msgstr "ラックの場所 (ある場合)" + +#: dcim/forms/bulk_import.py:268 dcim/forms/model_forms.py:246 +#: dcim/tables/racks.py:153 templates/dcim/rackreservation.html:12 +#: templates/dcim/rackreservation.html:52 +msgid "Units" +msgstr "単位" + +#: dcim/forms/bulk_import.py:271 +msgid "Comma-separated list of individual unit numbers" +msgstr "個々のユニット番号をカンマで区切ったリスト" + +#: dcim/forms/bulk_import.py:314 +msgid "The manufacturer which produces this device type" +msgstr "このデバイスタイプを製造しているメーカー" + +#: dcim/forms/bulk_import.py:321 +msgid "The default platform for devices of this type (optional)" +msgstr "このタイプのデバイスのデフォルトプラットフォーム (オプション)" + +#: dcim/forms/bulk_import.py:326 +msgid "Device weight" +msgstr "デバイス重量" + +#: dcim/forms/bulk_import.py:332 +msgid "Unit for device weight" +msgstr "デバイス重量の単位" + +#: dcim/forms/bulk_import.py:352 +msgid "Module weight" +msgstr "モジュール重量" + +#: dcim/forms/bulk_import.py:358 +msgid "Unit for module weight" +msgstr "モジュール重量の単位" + +#: dcim/forms/bulk_import.py:391 +msgid "Limit platform assignments to this manufacturer" +msgstr "プラットフォーム割り当てをこのメーカーに限定する" + +#: dcim/forms/bulk_import.py:413 tenancy/forms/bulk_import.py:106 +msgid "Assigned role" +msgstr "割り当てられた役割" + +#: dcim/forms/bulk_import.py:426 +msgid "Device type manufacturer" +msgstr "デバイスタイプメーカー" + +#: dcim/forms/bulk_import.py:432 +msgid "Device type model" +msgstr "デバイスタイプモデル" + +#: dcim/forms/bulk_import.py:439 virtualization/forms/bulk_import.py:126 +msgid "Assigned platform" +msgstr "割り当てられたプラットフォーム" + +#: dcim/forms/bulk_import.py:447 dcim/forms/bulk_import.py:451 +#: dcim/forms/model_forms.py:461 +msgid "Virtual chassis" +msgstr "バーチャルシャーシ" + +#: dcim/forms/bulk_import.py:454 dcim/forms/model_forms.py:450 +#: dcim/tables/devices.py:231 extras/filtersets.py:501 +#: extras/forms/filtersets.py:330 ipam/forms/bulk_edit.py:478 +#: ipam/forms/model_forms.py:588 templates/dcim/device.html:239 +#: templates/virtualization/cluster.html:11 +#: templates/virtualization/virtualmachine.html:92 +#: templates/virtualization/virtualmachine.html:102 +#: virtualization/filtersets.py:157 virtualization/filtersets.py:273 +#: virtualization/forms/bulk_edit.py:128 +#: virtualization/forms/bulk_import.py:92 +#: virtualization/forms/filtersets.py:98 +#: virtualization/forms/filtersets.py:119 +#: virtualization/forms/filtersets.py:196 +#: virtualization/forms/model_forms.py:82 +#: virtualization/forms/model_forms.py:179 +#: virtualization/tables/virtualmachines.py:57 +msgid "Cluster" +msgstr "クラスタ" + +#: dcim/forms/bulk_import.py:458 +msgid "Virtualization cluster" +msgstr "仮想化クラスタ" + +#: dcim/forms/bulk_import.py:487 +msgid "Assigned location (if any)" +msgstr "割り当てられた場所 (存在する場合)" + +#: dcim/forms/bulk_import.py:494 +msgid "Assigned rack (if any)" +msgstr "割り当てられたラック (ある場合)" + +#: dcim/forms/bulk_import.py:497 +msgid "Face" +msgstr "フェイス" + +#: dcim/forms/bulk_import.py:500 +msgid "Mounted rack face" +msgstr "マウントラックフェイス" + +#: dcim/forms/bulk_import.py:507 +msgid "Parent device (for child devices)" +msgstr "親デバイス (子供用デバイス用)" + +#: dcim/forms/bulk_import.py:510 +msgid "Device bay" +msgstr "デバイスベイ" + +#: dcim/forms/bulk_import.py:514 +msgid "Device bay in which this device is installed (for child devices)" +msgstr "このデバイスがインストールされているデバイスベイ (子供用デバイス用)" + +#: dcim/forms/bulk_import.py:520 +msgid "Airflow direction" +msgstr "気流方向" + +#: dcim/forms/bulk_import.py:581 +msgid "The device in which this module is installed" +msgstr "このモジュールがインストールされているデバイス" + +#: dcim/forms/bulk_import.py:584 dcim/forms/model_forms.py:562 +msgid "Module bay" +msgstr "モジュールベイ" + +#: dcim/forms/bulk_import.py:587 +msgid "The module bay in which this module is installed" +msgstr "このモジュールが取り付けられているモジュールベイ" + +#: dcim/forms/bulk_import.py:593 +msgid "The type of module" +msgstr "モジュールのタイプ" + +#: dcim/forms/bulk_import.py:601 dcim/forms/model_forms.py:575 +msgid "Replicate components" +msgstr "コンポーネントを複製" + +#: dcim/forms/bulk_import.py:603 +msgid "" +"Automatically populate components associated with this module type (enabled " +"by default)" +msgstr "このモジュールタイプに関連するコンポーネントを自動的に入力 (デフォルトで有効)" + +#: dcim/forms/bulk_import.py:606 dcim/forms/model_forms.py:581 +msgid "Adopt components" +msgstr "コンポーネントを採用" + +#: dcim/forms/bulk_import.py:608 dcim/forms/model_forms.py:584 +msgid "Adopt already existing components" +msgstr "既存のコンポーネントを採用" + +#: dcim/forms/bulk_import.py:648 dcim/forms/bulk_import.py:674 +#: dcim/forms/bulk_import.py:700 +msgid "Port type" +msgstr "ポートタイプ" + +#: dcim/forms/bulk_import.py:656 dcim/forms/bulk_import.py:682 +msgid "Port speed in bps" +msgstr "ポート速度 (bps)" + +#: dcim/forms/bulk_import.py:720 +msgid "Outlet type" +msgstr "コンセントタイプ" + +#: dcim/forms/bulk_import.py:727 +msgid "Local power port which feeds this outlet" +msgstr "このコンセントに給電するローカル電源ポート" + +#: dcim/forms/bulk_import.py:730 +msgid "Feed lag" +msgstr "フィードラグ" + +#: dcim/forms/bulk_import.py:733 +msgid "Electrical phase (for three-phase circuits)" +msgstr "電気相 (三相回路用)" + +#: dcim/forms/bulk_import.py:774 dcim/forms/model_forms.py:1114 +#: virtualization/forms/bulk_import.py:155 +#: virtualization/forms/model_forms.py:308 +msgid "Parent interface" +msgstr "親インターフェース" + +#: dcim/forms/bulk_import.py:781 dcim/forms/model_forms.py:1122 +#: virtualization/forms/bulk_import.py:162 +#: virtualization/forms/model_forms.py:316 +msgid "Bridged interface" +msgstr "ブリッジインターフェース" + +#: dcim/forms/bulk_import.py:784 +msgid "Lag" +msgstr "ラグ" + +#: dcim/forms/bulk_import.py:788 +msgid "Parent LAG interface" +msgstr "親 LAG インターフェイス" + +#: dcim/forms/bulk_import.py:791 +msgid "Vdcs" +msgstr "VDC" + +#: dcim/forms/bulk_import.py:796 +msgid "VDC names separated by commas, encased with double quotes. Example:" +msgstr "VDC 名をコンマで区切り、二重引用符で囲みます。例:" + +#: dcim/forms/bulk_import.py:802 +msgid "Physical medium" +msgstr "物理媒体" + +#: dcim/forms/bulk_import.py:805 dcim/forms/filtersets.py:1265 +msgid "Duplex" +msgstr "デュプレックス" + +#: dcim/forms/bulk_import.py:810 +msgid "Poe mode" +msgstr "ポーモード" + +#: dcim/forms/bulk_import.py:816 +msgid "Poe type" +msgstr "ポータイプ" + +#: dcim/forms/bulk_import.py:825 virtualization/forms/bulk_import.py:168 +msgid "IEEE 802.1Q operational mode (for L2 interfaces)" +msgstr "IEEE 802.1Q オペレーショナルモード(L2 インターフェイス用)" + +#: dcim/forms/bulk_import.py:832 ipam/forms/bulk_import.py:160 +#: ipam/forms/bulk_import.py:246 ipam/forms/bulk_import.py:282 +#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:266 +#: ipam/forms/filtersets.py:322 virtualization/forms/bulk_import.py:175 +msgid "Assigned VRF" +msgstr "割り当てられた VRF" + +#: dcim/forms/bulk_import.py:835 +msgid "Rf role" +msgstr "Rf ロール" + +#: dcim/forms/bulk_import.py:838 +msgid "Wireless role (AP/station)" +msgstr "ワイヤレスロール (AP/ステーション)" + +#: dcim/forms/bulk_import.py:884 dcim/forms/model_forms.py:893 +#: dcim/forms/model_forms.py:1369 dcim/forms/object_import.py:122 +msgid "Rear port" +msgstr "リアポート" + +#: dcim/forms/bulk_import.py:887 +msgid "Corresponding rear port" +msgstr "対応リアポート" + +#: dcim/forms/bulk_import.py:892 dcim/forms/bulk_import.py:933 +#: dcim/forms/bulk_import.py:1148 +msgid "Physical medium classification" +msgstr "物理媒体分類" + +#: dcim/forms/bulk_import.py:961 dcim/tables/devices.py:841 +msgid "Installed device" +msgstr "インストール済みデバイス" + +#: dcim/forms/bulk_import.py:965 +msgid "Child device installed within this bay" +msgstr "このベイ内に設置された子供用デバイス" + +#: dcim/forms/bulk_import.py:967 +msgid "Child device not found." +msgstr "子供用デバイスが見つかりません。" + +#: dcim/forms/bulk_import.py:1025 +msgid "Parent inventory item" +msgstr "親インベントリアイテム" + +#: dcim/forms/bulk_import.py:1028 +msgid "Component type" +msgstr "コンポーネントタイプ" + +#: dcim/forms/bulk_import.py:1032 +msgid "Component Type" +msgstr "コンポーネントタイプ" + +#: dcim/forms/bulk_import.py:1035 +msgid "Compnent name" +msgstr "コンポーネント名" + +#: dcim/forms/bulk_import.py:1037 +msgid "Component Name" +msgstr "コンポーネント名" + +#: dcim/forms/bulk_import.py:1103 +msgid "Side A device" +msgstr "サイド A デバイス" + +#: dcim/forms/bulk_import.py:1106 dcim/forms/bulk_import.py:1124 +msgid "Device name" +msgstr "デバイス名" + +#: dcim/forms/bulk_import.py:1109 +msgid "Side A type" +msgstr "サイド A タイプ" + +#: dcim/forms/bulk_import.py:1112 dcim/forms/bulk_import.py:1130 +msgid "Termination type" +msgstr "終了タイプ" + +#: dcim/forms/bulk_import.py:1115 +msgid "Side A name" +msgstr "サイド A 名" + +#: dcim/forms/bulk_import.py:1116 dcim/forms/bulk_import.py:1134 +msgid "Termination name" +msgstr "終了名" + +#: dcim/forms/bulk_import.py:1121 +msgid "Side B device" +msgstr "サイド B デバイス" + +#: dcim/forms/bulk_import.py:1127 +msgid "Side B type" +msgstr "サイド B タイプ" + +#: dcim/forms/bulk_import.py:1133 +msgid "Side B name" +msgstr "サイド B 名" + +#: dcim/forms/bulk_import.py:1142 wireless/forms/bulk_import.py:86 +msgid "Connection status" +msgstr "接続ステータス" + +#: dcim/forms/bulk_import.py:1221 dcim/forms/model_forms.py:689 +#: dcim/tables/devices.py:1028 templates/dcim/device.html:130 +#: templates/dcim/virtualchassis.html:28 templates/dcim/virtualchassis.html:60 +msgid "Master" +msgstr "マスター" + +#: dcim/forms/bulk_import.py:1225 +msgid "Master device" +msgstr "マスターデバイス" + +#: dcim/forms/bulk_import.py:1242 +msgid "Name of parent site" +msgstr "親サイトの名前" + +#: dcim/forms/bulk_import.py:1276 +msgid "Upstream power panel" +msgstr "上流電源パネル" + +#: dcim/forms/bulk_import.py:1306 +msgid "Primary or redundant" +msgstr "プライマリまたは冗長" + +#: dcim/forms/bulk_import.py:1311 +msgid "Supply type (AC/DC)" +msgstr "電源タイプ (AC/DC)" + +#: dcim/forms/bulk_import.py:1316 +msgid "Single or three-phase" +msgstr "単相または三相" + +#: dcim/forms/common.py:24 dcim/models/device_components.py:528 +#: templates/dcim/interface.html:58 +#: templates/virtualization/vminterface.html:58 +#: virtualization/forms/bulk_edit.py:224 +msgid "MTU" +msgstr "MTU" + +#: dcim/forms/common.py:65 +#, python-brace-format +msgid "" +"The tagged VLANs ({vlans}) must belong to the same site as the interface's " +"parent device/VM, or they must be global" +msgstr "" +"タグ付きの VLAN ({vlans}) はインターフェースの親デバイス/仮想マシンと同じサイトに属しているか、グローバルである必要があります" + +#: dcim/forms/common.py:110 +msgid "" +"Cannot install module with placeholder values in a module bay with no " +"position defined." +msgstr "位置が定義されていないモジュールベイには、プレースホルダー値のあるモジュールをインストールできません。" + +#: dcim/forms/common.py:119 +#, python-brace-format +msgid "Cannot adopt {model} {name} as it already belongs to a module" +msgstr "採用できない {model} {name} すでにモジュールに属しているので" + +#: dcim/forms/common.py:128 +#, python-brace-format +msgid "A {model} named {name} already exists" +msgstr "A {model} 名前付き {name} 既に存在しています" + +#: dcim/forms/connections.py:45 dcim/tables/power.py:66 +#: templates/dcim/inc/cable_termination.html:37 +#: templates/dcim/powerfeed.html:27 templates/dcim/powerpanel.html:19 +#: templates/dcim/trace/powerpanel.html:4 +msgid "Power Panel" +msgstr "パワーパネル" + +#: dcim/forms/connections.py:54 dcim/forms/model_forms.py:670 +#: templates/dcim/powerfeed.html:22 templates/dcim/powerport.html:84 +msgid "Power Feed" +msgstr "パワーフィード" + +#: dcim/forms/connections.py:74 +msgid "Side" +msgstr "サイド" + +#: dcim/forms/filtersets.py:141 +msgid "Parent region" +msgstr "親地域" + +#: dcim/forms/filtersets.py:155 tenancy/forms/bulk_import.py:28 +#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:32 +#: tenancy/forms/filtersets.py:61 wireless/forms/bulk_import.py:25 +#: wireless/forms/filtersets.py:24 +msgid "Parent group" +msgstr "親グループ" + +#: dcim/forms/filtersets.py:246 dcim/forms/filtersets.py:331 +msgid "Function" +msgstr "ファンクション" + +#: dcim/forms/filtersets.py:418 dcim/forms/model_forms.py:308 +#: templates/inc/panels/image_attachments.html:5 +msgid "Images" +msgstr "画像" + +#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:544 +#: dcim/forms/filtersets.py:655 +msgid "Components" +msgstr "[コンポーネント]" + +#: dcim/forms/filtersets.py:441 +msgid "Subdevice role" +msgstr "サブデバイスロール" + +#: dcim/forms/filtersets.py:717 +msgid "Model" +msgstr "モデル" + +#: dcim/forms/filtersets.py:768 +msgid "Virtual chassis member" +msgstr "バーチャルシャーシメンバー" + +#: dcim/forms/filtersets.py:1123 +msgid "Cabled" +msgstr "ケーブル接続" + +#: dcim/forms/filtersets.py:1130 +msgid "Occupied" +msgstr "占領" + +#: dcim/forms/filtersets.py:1155 dcim/forms/filtersets.py:1177 +#: dcim/forms/filtersets.py:1199 dcim/forms/filtersets.py:1216 +#: dcim/forms/filtersets.py:1236 dcim/tables/devices.py:367 +#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:59 +#: templates/dcim/frontport.html:74 templates/dcim/interface.html:146 +#: templates/dcim/powerfeed.html:118 templates/dcim/poweroutlet.html:63 +#: templates/dcim/powerport.html:63 templates/dcim/rearport.html:70 +msgid "Connection" +msgstr "接続" + +#: dcim/forms/filtersets.py:1245 dcim/forms/model_forms.py:1477 +#: templates/dcim/virtualdevicecontext.html:16 +msgid "Virtual Device Context" +msgstr "仮想デバイスコンテキスト" + +#: dcim/forms/filtersets.py:1248 extras/forms/bulk_edit.py:315 +#: extras/forms/bulk_import.py:239 extras/forms/filtersets.py:479 +#: extras/forms/model_forms.py:555 extras/tables/tables.py:487 +#: templates/extras/journalentry.html:33 +msgid "Kind" +msgstr "親切" + +#: dcim/forms/filtersets.py:1277 +msgid "Mgmt only" +msgstr "管理のみ" + +#: dcim/forms/filtersets.py:1289 dcim/forms/model_forms.py:1180 +#: dcim/models/device_components.py:630 templates/dcim/interface.html:134 +msgid "WWN" +msgstr "WWN" + +#: dcim/forms/filtersets.py:1309 +msgid "Wireless channel" +msgstr "ワイヤレスチャネル" + +#: dcim/forms/filtersets.py:1313 +msgid "Channel frequency (MHz)" +msgstr "チャネル周波数 (MHz)" + +#: dcim/forms/filtersets.py:1317 +msgid "Channel width (MHz)" +msgstr "チャネル幅 (MHz)" + +#: dcim/forms/filtersets.py:1321 templates/dcim/interface.html:86 +msgid "Transmit power (dBm)" +msgstr "送信パワー (dBm)" + +#: dcim/forms/filtersets.py:1344 dcim/forms/filtersets.py:1366 +#: dcim/tables/devices.py:344 templates/dcim/cable.html:12 +#: templates/dcim/cable_edit.html:46 templates/dcim/cable_trace.html:43 +#: templates/dcim/frontport.html:84 +#: templates/dcim/inc/connection_endpoints.html:4 +#: templates/dcim/rearport.html:80 templates/dcim/trace/cable.html:7 +msgid "Cable" +msgstr "ケーブル" + +#: dcim/forms/filtersets.py:1434 dcim/tables/devices.py:951 +msgid "Discovered" +msgstr "発見された" + +#: dcim/forms/formsets.py:20 +#, python-brace-format +msgid "A virtual chassis member already exists in position {vc_position}." +msgstr "バーチャルシャーシメンバーはすでに所定の位置に存在します {vc_position}。" + +#: dcim/forms/model_forms.py:101 dcim/tables/devices.py:183 +#: templates/dcim/sitegroup.html:26 +msgid "Site Group" +msgstr "サイトグループ" + +#: dcim/forms/model_forms.py:142 +msgid "Contact Info" +msgstr "連絡先情報" + +#: dcim/forms/model_forms.py:197 templates/dcim/rackrole.html:20 +msgid "Rack Role" +msgstr "ラックロール" + +#: dcim/forms/model_forms.py:248 +msgid "" +"Comma-separated list of numeric unit IDs. A range may be specified using a " +"hyphen." +msgstr "コンマで区切られた数値ユニット ID のリスト。範囲はハイフンを使用して指定できます。" + +#: dcim/forms/model_forms.py:259 dcim/tables/racks.py:133 +msgid "Reservation" +msgstr "予約" + +#: dcim/forms/model_forms.py:297 dcim/forms/model_forms.py:380 +#: utilities/forms/fields/fields.py:47 +msgid "Slug" +msgstr "スラッグ" + +#: dcim/forms/model_forms.py:304 templates/dcim/devicetype.html:12 +msgid "Chassis" +msgstr "シャーシ" + +#: dcim/forms/model_forms.py:356 templates/dcim/devicerole.html:24 +msgid "Device Role" +msgstr "デバイスロール" + +#: dcim/forms/model_forms.py:424 dcim/models/devices.py:632 +msgid "The lowest-numbered unit occupied by the device" +msgstr "デバイスが使用している最も番号の小さいユニット" + +#: dcim/forms/model_forms.py:469 +msgid "The position in the virtual chassis this device is identified by" +msgstr "このデバイスの識別基準となる仮想シャーシ内の位置" + +#: dcim/forms/model_forms.py:473 templates/dcim/device.html:131 +#: templates/dcim/virtualchassis.html:61 +#: templates/dcim/virtualchassis_edit.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:13 +#: tenancy/forms/bulk_edit.py:146 tenancy/forms/filtersets.py:109 +msgid "Priority" +msgstr "優先度" + +#: dcim/forms/model_forms.py:474 +msgid "The priority of the device in the virtual chassis" +msgstr "仮想シャーシ内のデバイスの優先順位" + +#: dcim/forms/model_forms.py:578 +msgid "Automatically populate components associated with this module type" +msgstr "このモジュールタイプに関連するコンポーネントを自動的に入力" + +#: dcim/forms/model_forms.py:623 +msgid "Maximum length is 32767 (any unit)" +msgstr "最大長は32767 (任意の単位)" + +#: dcim/forms/model_forms.py:671 +msgid "Characteristics" +msgstr "特徴" + +#: dcim/forms/model_forms.py:1130 +msgid "LAG interface" +msgstr "LAG インターフェイス" + +#: dcim/forms/model_forms.py:1184 dcim/forms/model_forms.py:1345 +#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:317 +#: ipam/forms/model_forms.py:270 ipam/forms/model_forms.py:279 +#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:368 ipam/tables/vlans.py:165 +#: templates/circuits/inc/circuit_termination.html:78 +#: templates/dcim/frontport.html:113 templates/dcim/interface.html:27 +#: templates/dcim/interface.html:190 templates/dcim/interface.html:322 +#: templates/dcim/inventoryitem_edit.html:54 templates/dcim/rearport.html:109 +#: templates/ipam/fhrpgroupassignment_edit.html:11 +#: templates/virtualization/vminterface.html:19 +#: templates/vpn/tunneltermination.html:32 +#: templates/wireless/inc/wirelesslink_interface.html:10 +#: templates/wireless/wirelesslink.html:10 +#: templates/wireless/wirelesslink.html:49 +#: virtualization/forms/model_forms.py:351 vpn/forms/bulk_import.py:297 +#: vpn/forms/model_forms.py:94 vpn/forms/model_forms.py:129 +#: vpn/forms/model_forms.py:241 vpn/forms/model_forms.py:430 +#: vpn/forms/model_forms.py:439 vpn/tables/tunnels.py:87 +#: wireless/forms/model_forms.py:112 wireless/forms/model_forms.py:152 +msgid "Interface" +msgstr "インタフェース" + +#: dcim/forms/model_forms.py:1278 +msgid "Child Device" +msgstr "子供用デバイス" + +#: dcim/forms/model_forms.py:1279 +msgid "" +"Child devices must first be created and assigned to the site and rack of the" +" parent device." +msgstr "最初に子デバイスを作成し、親デバイスのサイトとラックに割り当てる必要があります。" + +#: dcim/forms/model_forms.py:1321 +msgid "Console port" +msgstr "コンソールポート" + +#: dcim/forms/model_forms.py:1329 +msgid "Console server port" +msgstr "コンソールサーバポート" + +#: dcim/forms/model_forms.py:1337 +msgid "Front port" +msgstr "フロントポート" + +#: dcim/forms/model_forms.py:1353 +msgid "Power outlet" +msgstr "電源コンセント" + +#: dcim/forms/model_forms.py:1373 templates/dcim/inventoryitem.html:17 +#: templates/dcim/inventoryitem_edit.html:10 +msgid "Inventory Item" +msgstr "インベントリアイテム" + +#: dcim/forms/model_forms.py:1425 +msgid "An InventoryItem can only be assigned to a single component." +msgstr "InventoryItemは1つのコンポーネントにのみ割り当てることができます。" + +#: dcim/forms/model_forms.py:1439 templates/dcim/inventoryitemrole.html:15 +msgid "Inventory Item Role" +msgstr "インベントリアイテムロール" + +#: dcim/forms/model_forms.py:1459 templates/dcim/device.html:195 +#: templates/dcim/virtualdevicecontext.html:33 +#: templates/virtualization/virtualmachine.html:51 +msgid "Primary IPv4" +msgstr "プライマリ IPv4" + +#: dcim/forms/model_forms.py:1468 templates/dcim/device.html:211 +#: templates/dcim/virtualdevicecontext.html:44 +#: templates/virtualization/virtualmachine.html:67 +msgid "Primary IPv6" +msgstr "プライマリ IPv6" + +#: dcim/forms/object_create.py:47 dcim/forms/object_create.py:198 +#: dcim/forms/object_create.py:354 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of objects being " +"created.)" +msgstr "英数字の範囲がサポートされています。(作成するオブジェクトの数と一致する必要があります)。" + +#: dcim/forms/object_create.py:67 +#, python-brace-format +msgid "" +"The provided pattern specifies {value_count} values, but {pattern_count} are" +" expected." +msgstr "提供されたパターンは以下を指定します {value_count} 値、しかし {pattern_count} 期待されています。" + +#: dcim/forms/object_create.py:109 dcim/forms/object_create.py:270 +#: dcim/tables/devices.py:281 +msgid "Rear ports" +msgstr "背面ポート" + +#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 +msgid "Select one rear port assignment for each front port being created." +msgstr "作成する前面ポートごとに背面ポート割り当てを 1 つ選択します。" + +#: dcim/forms/object_create.py:163 +#, python-brace-format +msgid "" +"The number of front port templates to be created ({frontport_count}) must " +"match the selected number of rear port positions ({rearport_count})." +msgstr "" +"作成するフロントポートテンプレートの数 ({frontport_count}) は選択した背面ポートの位置の数と一致する必要があります " +"({rearport_count})。" + +#: dcim/forms/object_create.py:250 +#, python-brace-format +msgid "" +"The string {module} will be replaced with the position of the " +"assigned module, if any." +msgstr "ストリング {module} 割り当てられたモジュールの位置 (存在する場合) に置き換えられます。" + +#: dcim/forms/object_create.py:319 +#, python-brace-format +msgid "" +"The number of front ports to be created ({frontport_count}) must match the " +"selected number of rear port positions ({rearport_count})." +msgstr "" +"作成するフロントポートの数 ({frontport_count}) は選択した背面ポートの位置の数と一致する必要があります " +"({rearport_count})。" + +#: dcim/forms/object_create.py:408 dcim/tables/devices.py:1034 +#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:54 +#: templates/dcim/virtualchassis_edit.html:48 templates/ipam/fhrpgroup.html:39 +msgid "Members" +msgstr "メンバー" + +#: dcim/forms/object_create.py:417 +msgid "Initial position" +msgstr "初期位置" + +#: dcim/forms/object_create.py:420 +msgid "" +"Position of the first member device. Increases by one for each additional " +"member." +msgstr "最初のメンバーデバイスの位置。メンバーが増えるごとに 1 ずつ増えます。" + +#: dcim/forms/object_create.py:434 +msgid "A position must be specified for the first VC member." +msgstr "最初の VC メンバーの位置を指定する必要があります。" + +#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 +#: dcim/models/device_components.py:63 extras/models/customfields.py:108 +msgid "label" +msgstr "ラベルに貼り付けます" + +#: dcim/models/cables.py:71 +msgid "length" +msgstr "長さ" + +#: dcim/models/cables.py:78 +msgid "length unit" +msgstr "長さ単位" + +#: dcim/models/cables.py:93 +msgid "cable" +msgstr "ケーブル" + +#: dcim/models/cables.py:94 +msgid "cables" +msgstr "ケーブル" + +#: dcim/models/cables.py:190 +msgid "A and B terminations cannot connect to the same object." +msgstr "A 端子と B 端子を同じオブジェクトに接続することはできません。" + +#: dcim/models/cables.py:257 ipam/models/asns.py:37 +msgid "end" +msgstr "終わり" + +#: dcim/models/cables.py:310 +msgid "cable termination" +msgstr "ケーブルターミネーション" + +#: dcim/models/cables.py:311 +msgid "cable terminations" +msgstr "ケーブルターミネーション" + +#: dcim/models/cables.py:434 extras/models/configs.py:50 +msgid "is active" +msgstr "アクティブです" + +#: dcim/models/cables.py:438 +msgid "is complete" +msgstr "完了です" + +#: dcim/models/cables.py:442 +msgid "is split" +msgstr "分割されています" + +#: dcim/models/cables.py:450 +msgid "cable path" +msgstr "ケーブルパス" + +#: dcim/models/cables.py:451 +msgid "cable paths" +msgstr "ケーブルパス" + +#: dcim/models/device_component_templates.py:46 +#, python-brace-format +msgid "" +"{module} is accepted as a substitution for the module bay position when " +"attached to a module type." +msgstr "{module} モジュールタイプに取り付ける場合、モジュールベイ位置の代わりとして使用できます。" + +#: dcim/models/device_component_templates.py:58 +#: dcim/models/device_components.py:66 +msgid "Physical label" +msgstr "物理ラベル" + +#: dcim/models/device_component_templates.py:103 +msgid "Component templates cannot be moved to a different device type." +msgstr "コンポーネントテンプレートを別のデバイスタイプに移動することはできません。" + +#: dcim/models/device_component_templates.py:154 +msgid "" +"A component template cannot be associated with both a device type and a " +"module type." +msgstr "コンポーネントテンプレートをデバイスタイプとモジュールタイプの両方に関連付けることはできません。" + +#: dcim/models/device_component_templates.py:158 +msgid "" +"A component template must be associated with either a device type or a " +"module type." +msgstr "コンポーネントテンプレートは、デバイスタイプまたはモジュールタイプのいずれかに関連付ける必要があります。" + +#: dcim/models/device_component_templates.py:186 +msgid "console port template" +msgstr "コンソールポートテンプレート" + +#: dcim/models/device_component_templates.py:187 +msgid "console port templates" +msgstr "コンソールポートテンプレート" + +#: dcim/models/device_component_templates.py:220 +msgid "console server port template" +msgstr "コンソール・サーバー・ポート・テンプレート" + +#: dcim/models/device_component_templates.py:221 +msgid "console server port templates" +msgstr "コンソール・サーバー・ポート・テンプレート" + +#: dcim/models/device_component_templates.py:252 +#: dcim/models/device_components.py:353 +msgid "maximum draw" +msgstr "最大ドロー" + +#: dcim/models/device_component_templates.py:259 +#: dcim/models/device_components.py:360 +msgid "allocated draw" +msgstr "割り当てられたドロー" + +#: dcim/models/device_component_templates.py:269 +msgid "power port template" +msgstr "電源ポートテンプレート" + +#: dcim/models/device_component_templates.py:270 +msgid "power port templates" +msgstr "電源ポートテンプレート" + +#: dcim/models/device_component_templates.py:289 +#: dcim/models/device_components.py:383 +#, python-brace-format +msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." +msgstr "割り当てられた抽選回数は最大抽選回数を超えることはできません ({maximum_draw}W)。" + +#: dcim/models/device_component_templates.py:321 +#: dcim/models/device_components.py:478 +msgid "feed leg" +msgstr "フィードレッグ" + +#: dcim/models/device_component_templates.py:325 +#: dcim/models/device_components.py:482 +msgid "Phase (for three-phase feeds)" +msgstr "フェーズ (三相フィード用)" + +#: dcim/models/device_component_templates.py:331 +msgid "power outlet template" +msgstr "電源コンセントテンプレート" + +#: dcim/models/device_component_templates.py:332 +msgid "power outlet templates" +msgstr "電源コンセントテンプレート" + +#: dcim/models/device_component_templates.py:341 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device type" +msgstr "親電源ポート ({power_port}) は同じデバイスタイプに属している必要があります" + +#: dcim/models/device_component_templates.py:345 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same module type" +msgstr "親電源ポート ({power_port}) は同じモジュールタイプに属している必要があります" + +#: dcim/models/device_component_templates.py:397 +#: dcim/models/device_components.py:612 +msgid "management only" +msgstr "管理のみ" + +#: dcim/models/device_component_templates.py:405 +#: dcim/models/device_components.py:551 +msgid "bridge interface" +msgstr "ブリッジインターフェース" + +#: dcim/models/device_component_templates.py:423 +#: dcim/models/device_components.py:637 +msgid "wireless role" +msgstr "ワイヤレスロール" + +#: dcim/models/device_component_templates.py:429 +msgid "interface template" +msgstr "インターフェーステンプレート" + +#: dcim/models/device_component_templates.py:430 +msgid "interface templates" +msgstr "インターフェーステンプレート" + +#: dcim/models/device_component_templates.py:437 +#: dcim/models/device_components.py:805 +#: virtualization/models/virtualmachines.py:398 +msgid "An interface cannot be bridged to itself." +msgstr "インターフェースをそれ自体にブリッジすることはできません。" + +#: dcim/models/device_component_templates.py:440 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same device type" +msgstr "ブリッジインターフェース ({bridge}) は同じデバイスタイプに属している必要があります" + +#: dcim/models/device_component_templates.py:444 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same module type" +msgstr "ブリッジインターフェース ({bridge}) は同じモジュールタイプに属している必要があります" + +#: dcim/models/device_component_templates.py:500 +#: dcim/models/device_components.py:985 +msgid "rear port position" +msgstr "リアポート位置" + +#: dcim/models/device_component_templates.py:525 +msgid "front port template" +msgstr "フロントポートテンプレート" + +#: dcim/models/device_component_templates.py:526 +msgid "front port templates" +msgstr "フロントポートテンプレート" + +#: dcim/models/device_component_templates.py:536 +#, python-brace-format +msgid "Rear port ({name}) must belong to the same device type" +msgstr "リアポート ({name}) は同じデバイスタイプに属している必要があります" + +#: dcim/models/device_component_templates.py:542 +#, python-brace-format +msgid "" +"Invalid rear port position ({position}); rear port {name} has only {count} " +"positions" +msgstr "背面ポートの位置が無効です ({position}); リアポート {name} しかない {count} 位置" + +#: dcim/models/device_component_templates.py:595 +#: dcim/models/device_components.py:1054 +msgid "positions" +msgstr "位置" + +#: dcim/models/device_component_templates.py:606 +msgid "rear port template" +msgstr "リアポートテンプレート" + +#: dcim/models/device_component_templates.py:607 +msgid "rear port templates" +msgstr "リアポートテンプレート" + +#: dcim/models/device_component_templates.py:636 +#: dcim/models/device_components.py:1095 +msgid "position" +msgstr "ポジション" + +#: dcim/models/device_component_templates.py:639 +#: dcim/models/device_components.py:1098 +msgid "Identifier to reference when renaming installed components" +msgstr "インストール済みコンポーネントの名前を変更するときに参照する識別子" + +#: dcim/models/device_component_templates.py:645 +msgid "module bay template" +msgstr "モジュールベイテンプレート" + +#: dcim/models/device_component_templates.py:646 +msgid "module bay templates" +msgstr "モジュールベイテンプレート" + +#: dcim/models/device_component_templates.py:673 +msgid "device bay template" +msgstr "デバイスベイテンプレート" + +#: dcim/models/device_component_templates.py:674 +msgid "device bay templates" +msgstr "デバイスベイテンプレート" + +#: dcim/models/device_component_templates.py:687 +#, python-brace-format +msgid "" +"Subdevice role of device type ({device_type}) must be set to \"parent\" to " +"allow device bays." +msgstr "デバイスタイプのサブデバイスロール ({device_type}デバイスベイを許可するには) を「parent」に設定する必要があります。" + +#: dcim/models/device_component_templates.py:742 +#: dcim/models/device_components.py:1224 +msgid "part ID" +msgstr "パーツ ID" + +#: dcim/models/device_component_templates.py:744 +#: dcim/models/device_components.py:1226 +msgid "Manufacturer-assigned part identifier" +msgstr "メーカー指定の部品識別子" + +#: dcim/models/device_component_templates.py:761 +msgid "inventory item template" +msgstr "在庫品目テンプレート" + +#: dcim/models/device_component_templates.py:762 +msgid "inventory item templates" +msgstr "在庫品目テンプレート" + +#: dcim/models/device_components.py:106 +msgid "Components cannot be moved to a different device." +msgstr "コンポーネントを別のデバイスに移動することはできません。" + +#: dcim/models/device_components.py:145 +msgid "cable end" +msgstr "ケーブルエンド" + +#: dcim/models/device_components.py:151 +msgid "mark connected" +msgstr "接続済みとしてマークする" + +#: dcim/models/device_components.py:153 +msgid "Treat as if a cable is connected" +msgstr "ケーブルが接続されているかのように扱う" + +#: dcim/models/device_components.py:171 +msgid "Must specify cable end (A or B) when attaching a cable." +msgstr "ケーブルを接続するときは、ケーブルの端 (A または B) を指定する必要があります。" + +#: dcim/models/device_components.py:175 +msgid "Cable end must not be set without a cable." +msgstr "ケーブルの端はケーブルなしでセットしないでください。" + +#: dcim/models/device_components.py:179 +msgid "Cannot mark as connected with a cable attached." +msgstr "ケーブルが接続されている状態では接続済みとマークできません。" + +#: dcim/models/device_components.py:203 +#, python-brace-format +msgid "{class_name} models must declare a parent_object property" +msgstr "{class_name} モデルは親オブジェクトプロパティを宣言しなければなりません" + +#: dcim/models/device_components.py:288 dcim/models/device_components.py:317 +#: dcim/models/device_components.py:350 dcim/models/device_components.py:468 +msgid "Physical port type" +msgstr "物理ポートタイプ" + +#: dcim/models/device_components.py:291 dcim/models/device_components.py:320 +msgid "speed" +msgstr "速度" + +#: dcim/models/device_components.py:295 dcim/models/device_components.py:324 +msgid "Port speed in bits per second" +msgstr "ポート速度 (ビット/秒)" + +#: dcim/models/device_components.py:301 +msgid "console port" +msgstr "コンソールポート" + +#: dcim/models/device_components.py:302 +msgid "console ports" +msgstr "コンソールポート" + +#: dcim/models/device_components.py:330 +msgid "console server port" +msgstr "コンソール・サーバー・ポート" + +#: dcim/models/device_components.py:331 +msgid "console server ports" +msgstr "コンソール・サーバー・ポート" + +#: dcim/models/device_components.py:370 +msgid "power port" +msgstr "電源ポート" + +#: dcim/models/device_components.py:371 +msgid "power ports" +msgstr "電源ポート" + +#: dcim/models/device_components.py:488 +msgid "power outlet" +msgstr "電源コンセント" + +#: dcim/models/device_components.py:489 +msgid "power outlets" +msgstr "電源コンセント" + +#: dcim/models/device_components.py:500 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device" +msgstr "親電源ポート ({power_port}) は同じデバイスに属している必要があります" + +#: dcim/models/device_components.py:531 vpn/models/crypto.py:81 +#: vpn/models/crypto.py:226 +msgid "mode" +msgstr "モード" + +#: dcim/models/device_components.py:535 +msgid "IEEE 802.1Q tagging strategy" +msgstr "IEEE 802.1Q タギングストラテジー" + +#: dcim/models/device_components.py:543 +msgid "parent interface" +msgstr "親インターフェース" + +#: dcim/models/device_components.py:603 +msgid "parent LAG" +msgstr "親ラグ" + +#: dcim/models/device_components.py:613 +msgid "This interface is used only for out-of-band management" +msgstr "このインターフェイスは帯域外管理にのみ使用されます。" + +#: dcim/models/device_components.py:618 +msgid "speed (Kbps)" +msgstr "速度 (キロビット/秒)" + +#: dcim/models/device_components.py:621 +msgid "duplex" +msgstr "デュプレックス" + +#: dcim/models/device_components.py:631 +msgid "64-bit World Wide Name" +msgstr "64 ビットのワールドワイドネーム" + +#: dcim/models/device_components.py:643 +msgid "wireless channel" +msgstr "ワイヤレスチャネル" + +#: dcim/models/device_components.py:650 +msgid "channel frequency (MHz)" +msgstr "チャネル周波数 (MHz)" + +#: dcim/models/device_components.py:651 dcim/models/device_components.py:659 +msgid "Populated by selected channel (if set)" +msgstr "選択したチャンネルによって設定されます (設定されている場合)" + +#: dcim/models/device_components.py:665 +msgid "transmit power (dBm)" +msgstr "送信パワー (dBm)" + +#: dcim/models/device_components.py:690 wireless/models.py:116 +msgid "wireless LANs" +msgstr "ワイヤレス LAN" + +#: dcim/models/device_components.py:698 +#: virtualization/models/virtualmachines.py:328 +msgid "untagged VLAN" +msgstr "タグなし VLAN" + +#: dcim/models/device_components.py:704 +#: virtualization/models/virtualmachines.py:334 +msgid "tagged VLANs" +msgstr "タグ付き VLAN" + +#: dcim/models/device_components.py:746 +#: virtualization/models/virtualmachines.py:370 +msgid "interface" +msgstr "インタフェース" + +#: dcim/models/device_components.py:747 +#: virtualization/models/virtualmachines.py:371 +msgid "interfaces" +msgstr "インターフェース" + +#: dcim/models/device_components.py:758 +#, python-brace-format +msgid "{display_type} interfaces cannot have a cable attached." +msgstr "{display_type} インターフェイスにはケーブルを接続できません。" + +#: dcim/models/device_components.py:766 +#, python-brace-format +msgid "{display_type} interfaces cannot be marked as connected." +msgstr "{display_type} インターフェースは接続済みとしてマークできません。" + +#: dcim/models/device_components.py:775 +#: virtualization/models/virtualmachines.py:383 +msgid "An interface cannot be its own parent." +msgstr "インターフェースを自身の親にすることはできません。" + +#: dcim/models/device_components.py:779 +msgid "Only virtual interfaces may be assigned to a parent interface." +msgstr "親インターフェースに割り当てることができるのは仮想インターフェースだけです。" + +#: dcim/models/device_components.py:786 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to a different device " +"({device})" +msgstr "選択した親インターフェイス ({interface}) は別のデバイスに属しています ({device})" + +#: dcim/models/device_components.py:792 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" +"選択した親インターフェイス ({interface}) に属する {device}、これはバーチャルシャーシには含まれていません。 " +"{virtual_chassis}。" + +#: dcim/models/device_components.py:812 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different device " +"({device})." +msgstr "選択したブリッジインターフェース ({bridge}) は別のデバイスに属しています ({device})。" + +#: dcim/models/device_components.py:818 +#, python-brace-format +msgid "" +"The selected bridge interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" +"選択したブリッジインターフェース ({interface}) に属する {device}、これはバーチャルシャーシには含まれていません。 " +"{virtual_chassis}。" + +#: dcim/models/device_components.py:829 +msgid "Virtual interfaces cannot have a parent LAG interface." +msgstr "仮想インターフェースは親 LAG インターフェースを持つことはできません。" + +#: dcim/models/device_components.py:833 +msgid "A LAG interface cannot be its own parent." +msgstr "LAG インターフェースを自身の親にすることはできません。" + +#: dcim/models/device_components.py:840 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to a different device ({device})." +msgstr "選択した LAG インターフェイス ({lag}) は別のデバイスに属しています ({device})。" + +#: dcim/models/device_components.py:846 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to {device}, which is not part of" +" virtual chassis {virtual_chassis}." +msgstr "" +"選択した LAG インターフェイス ({lag}) に属する {device}、これはバーチャルシャーシには含まれていません " +"{virtual_chassis}。" + +#: dcim/models/device_components.py:857 +msgid "Virtual interfaces cannot have a PoE mode." +msgstr "仮想インターフェイスには PoE モードを設定できません。" + +#: dcim/models/device_components.py:861 +msgid "Virtual interfaces cannot have a PoE type." +msgstr "仮想インターフェイスに PoE タイプを設定することはできません。" + +#: dcim/models/device_components.py:867 +msgid "Must specify PoE mode when designating a PoE type." +msgstr "PoE タイプを指定するときは、PoE モードを指定する必要があります。" + +#: dcim/models/device_components.py:874 +msgid "Wireless role may be set only on wireless interfaces." +msgstr "ワイヤレスロールはワイヤレスインターフェイスでのみ設定できます。" + +#: dcim/models/device_components.py:876 +msgid "Channel may be set only on wireless interfaces." +msgstr "チャネルはワイヤレスインターフェイスでのみ設定できます。" + +#: dcim/models/device_components.py:882 +msgid "Channel frequency may be set only on wireless interfaces." +msgstr "チャネル周波数は、ワイヤレスインターフェイスでのみ設定できます。" + +#: dcim/models/device_components.py:886 +msgid "Cannot specify custom frequency with channel selected." +msgstr "選択したチャンネルではカスタム周波数を指定できません。" + +#: dcim/models/device_components.py:892 +msgid "Channel width may be set only on wireless interfaces." +msgstr "チャネル幅はワイヤレスインターフェイスでのみ設定できます。" + +#: dcim/models/device_components.py:894 +msgid "Cannot specify custom width with channel selected." +msgstr "選択したチャンネルではカスタム幅を指定できません。" + +#: dcim/models/device_components.py:902 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent device, or it must be global." +msgstr "" +"タグが付いていない VLAN ({untagged_vlan}) " +"はインターフェースの親デバイスと同じサイトに属しているか、またはグローバルである必要があります。" + +#: dcim/models/device_components.py:991 +msgid "Mapped position on corresponding rear port" +msgstr "対応する背面ポートのマップ位置" + +#: dcim/models/device_components.py:1007 +msgid "front port" +msgstr "フロントポート" + +#: dcim/models/device_components.py:1008 +msgid "front ports" +msgstr "フロントポート" + +#: dcim/models/device_components.py:1022 +#, python-brace-format +msgid "Rear port ({rear_port}) must belong to the same device" +msgstr "リアポート ({rear_port}) は同じデバイスに属している必要があります" + +#: dcim/models/device_components.py:1030 +#, python-brace-format +msgid "" +"Invalid rear port position ({rear_port_position}): Rear port {name} has only" +" {positions} positions." +msgstr "" +"背面ポートの位置が無効です ({rear_port_position}): リアポート {name} しかない {positions} ポジション。" + +#: dcim/models/device_components.py:1060 +msgid "Number of front ports which may be mapped" +msgstr "マップできるフロントポートの数" + +#: dcim/models/device_components.py:1065 +msgid "rear port" +msgstr "リアポート" + +#: dcim/models/device_components.py:1066 +msgid "rear ports" +msgstr "リアポート" + +#: dcim/models/device_components.py:1080 +#, python-brace-format +msgid "" +"The number of positions cannot be less than the number of mapped front ports" +" ({frontport_count})" +msgstr "位置の数は、マップされたフロントポートの数より少なくすることはできません ({frontport_count})" + +#: dcim/models/device_components.py:1104 +msgid "module bay" +msgstr "モジュールベイ" + +#: dcim/models/device_components.py:1105 +msgid "module bays" +msgstr "モジュールベイ" + +#: dcim/models/device_components.py:1126 +msgid "device bay" +msgstr "デバイスベイ" + +#: dcim/models/device_components.py:1127 +msgid "device bays" +msgstr "デバイスベイ" + +#: dcim/models/device_components.py:1137 +#, python-brace-format +msgid "This type of device ({device_type}) does not support device bays." +msgstr "このタイプのデバイス ({device_type}) はデバイスベイをサポートしていません。" + +#: dcim/models/device_components.py:1143 +msgid "Cannot install a device into itself." +msgstr "デバイスをそれ自体にインストールすることはできません。" + +#: dcim/models/device_components.py:1151 +#, python-brace-format +msgid "" +"Cannot install the specified device; device is already installed in {bay}." +msgstr "指定されたデバイスはインストールできません。デバイスは既にインストールされています {bay}。" + +#: dcim/models/device_components.py:1172 +msgid "inventory item role" +msgstr "インベントリアイテムロール" + +#: dcim/models/device_components.py:1173 +msgid "inventory item roles" +msgstr "インベントリアイテムの役割" + +#: dcim/models/device_components.py:1230 dcim/models/devices.py:595 +#: dcim/models/devices.py:1173 dcim/models/racks.py:113 +msgid "serial number" +msgstr "シリアル番号" + +#: dcim/models/device_components.py:1238 dcim/models/devices.py:603 +#: dcim/models/devices.py:1180 dcim/models/racks.py:120 +msgid "asset tag" +msgstr "アセットタグ" + +#: dcim/models/device_components.py:1239 +msgid "A unique tag used to identify this item" +msgstr "この商品を識別するために使用される一意のタグ" + +#: dcim/models/device_components.py:1242 +msgid "discovered" +msgstr "発見された" + +#: dcim/models/device_components.py:1244 +msgid "This item was automatically discovered" +msgstr "このアイテムは自動的に検出されました" + +#: dcim/models/device_components.py:1262 +msgid "inventory item" +msgstr "インベントリアイテム" + +#: dcim/models/device_components.py:1263 +msgid "inventory items" +msgstr "インベントリアイテム" + +#: dcim/models/device_components.py:1274 +msgid "Cannot assign self as parent." +msgstr "自分を親として割り当てることはできません。" + +#: dcim/models/device_components.py:1282 +msgid "Parent inventory item does not belong to the same device." +msgstr "親インベントリアイテムは同じデバイスに属していません。" + +#: dcim/models/device_components.py:1288 +msgid "Cannot move an inventory item with dependent children" +msgstr "子が扶養されているインベントリアイテムは移動できません" + +#: dcim/models/device_components.py:1296 +msgid "Cannot assign inventory item to component on another device" +msgstr "インベントリアイテムを別のデバイスのコンポーネントに割り当てることはできません" + +#: dcim/models/devices.py:54 +msgid "manufacturer" +msgstr "メーカー" + +#: dcim/models/devices.py:55 +msgid "manufacturers" +msgstr "メーカー" + +#: dcim/models/devices.py:82 dcim/models/devices.py:381 +msgid "model" +msgstr "型" + +#: dcim/models/devices.py:95 +msgid "default platform" +msgstr "デフォルトプラットフォーム" + +#: dcim/models/devices.py:98 dcim/models/devices.py:385 +msgid "part number" +msgstr "パーツ番号" + +#: dcim/models/devices.py:101 dcim/models/devices.py:388 +msgid "Discrete part number (optional)" +msgstr "個別の部品番号 (オプション)" + +#: dcim/models/devices.py:107 dcim/models/racks.py:137 +msgid "height (U)" +msgstr "高さ (U)" + +#: dcim/models/devices.py:111 +msgid "exclude from utilization" +msgstr "利用から除外" + +#: dcim/models/devices.py:112 +msgid "Devices of this type are excluded when calculating rack utilization." +msgstr "このタイプのデバイスは、ラック使用率の計算時に除外されます。" + +#: dcim/models/devices.py:116 +msgid "is full depth" +msgstr "全深度です" + +#: dcim/models/devices.py:117 +msgid "Device consumes both front and rear rack faces." +msgstr "デバイスは前面と背面の両方のラック面を使用します。" + +#: dcim/models/devices.py:123 +msgid "parent/child status" +msgstr "親/子のステータス" + +#: dcim/models/devices.py:124 +msgid "" +"Parent devices house child devices in device bays. Leave blank if this " +"device type is neither a parent nor a child." +msgstr "親デバイスはデバイスベイに子供用デバイスを収納します。このデバイスタイプが親でも子供でもない場合は、空白のままにしてください。" + +#: dcim/models/devices.py:128 dcim/models/devices.py:647 +msgid "airflow" +msgstr "気流" + +#: dcim/models/devices.py:204 +msgid "device type" +msgstr "デバイスタイプ" + +#: dcim/models/devices.py:205 +msgid "device types" +msgstr "デバイスタイプ" + +#: dcim/models/devices.py:289 +msgid "U height must be in increments of 0.5 rack units." +msgstr "U の高さは 0.5 ラック単位単位でなければなりません。" + +#: dcim/models/devices.py:306 +#, python-brace-format +msgid "" +"Device {device} in rack {rack} does not have sufficient space to accommodate" +" a height of {height}U" +msgstr "[デバイス] {device} ラック内 {rack} 高さに対応する十分なスペースがない {height}U" + +#: dcim/models/devices.py:321 +#, python-brace-format +msgid "" +"Unable to set 0U height: Found {racked_instance_count} " +"instances already mounted within racks." +msgstr "" +"0U 高さを設定できません:見つかりました {racked_instance_count} インスタンス " +"すでにラックに取り付けられています。" + +#: dcim/models/devices.py:330 +msgid "" +"Must delete all device bay templates associated with this device before " +"declassifying it as a parent device." +msgstr "このデバイスを親デバイスとして分類解除する前に、このデバイスに関連付けられているすべてのデバイスベイテンプレートを削除する必要があります。" + +#: dcim/models/devices.py:336 +msgid "Child device types must be 0U." +msgstr "お子様のデバイスタイプは 0U でなければなりません。" + +#: dcim/models/devices.py:404 +msgid "module type" +msgstr "モジュールタイプ" + +#: dcim/models/devices.py:405 +msgid "module types" +msgstr "モジュールタイプ" + +#: dcim/models/devices.py:473 +msgid "Virtual machines may be assigned to this role" +msgstr "仮想マシンをこのロールに割り当てることができます" + +#: dcim/models/devices.py:485 +msgid "device role" +msgstr "デバイスロール" + +#: dcim/models/devices.py:486 +msgid "device roles" +msgstr "デバイスロール" + +#: dcim/models/devices.py:503 +msgid "Optionally limit this platform to devices of a certain manufacturer" +msgstr "オプションで、このプラットフォームを特定のメーカーのデバイスに限定できます" + +#: dcim/models/devices.py:515 +msgid "platform" +msgstr "プラットフォーム" + +#: dcim/models/devices.py:516 +msgid "platforms" +msgstr "プラットフォーム" + +#: dcim/models/devices.py:564 +msgid "The function this device serves" +msgstr "このデバイスが果たす機能" + +#: dcim/models/devices.py:596 +msgid "Chassis serial number, assigned by the manufacturer" +msgstr "製造元によって割り当てられたシャーシのシリアル番号" + +#: dcim/models/devices.py:604 dcim/models/devices.py:1181 +msgid "A unique tag used to identify this device" +msgstr "このデバイスを識別するために使用される一意のタグ" + +#: dcim/models/devices.py:631 +msgid "position (U)" +msgstr "ポジション (U)" + +#: dcim/models/devices.py:638 +msgid "rack face" +msgstr "ラックフェイス" + +#: dcim/models/devices.py:658 dcim/models/devices.py:1390 +#: virtualization/models/virtualmachines.py:98 +msgid "primary IPv4" +msgstr "プライマリ IPv4" + +#: dcim/models/devices.py:666 dcim/models/devices.py:1398 +#: virtualization/models/virtualmachines.py:106 +msgid "primary IPv6" +msgstr "プライマリ IPv6" + +#: dcim/models/devices.py:674 +msgid "out-of-band IP" +msgstr "アウトオブバンド IP" + +#: dcim/models/devices.py:691 +msgid "VC position" +msgstr "VCポジション" + +#: dcim/models/devices.py:695 +msgid "Virtual chassis position" +msgstr "バーチャルシャーシの位置" + +#: dcim/models/devices.py:698 +msgid "VC priority" +msgstr "VC プライオリティ" + +#: dcim/models/devices.py:702 +msgid "Virtual chassis master election priority" +msgstr "バーチャルシャーシのマスター選択優先順位" + +#: dcim/models/devices.py:705 dcim/models/sites.py:207 +msgid "latitude" +msgstr "緯度" + +#: dcim/models/devices.py:710 dcim/models/devices.py:718 +#: dcim/models/sites.py:212 dcim/models/sites.py:220 +msgid "GPS coordinate in decimal format (xx.yyyyyy)" +msgstr "10 進数形式の GPS 座標 (xx.yyyyy)" + +#: dcim/models/devices.py:713 dcim/models/sites.py:215 +msgid "longitude" +msgstr "経度" + +#: dcim/models/devices.py:786 +msgid "Device name must be unique per site." +msgstr "デバイス名はサイトごとに一意である必要があります。" + +#: dcim/models/devices.py:797 ipam/models/services.py:75 +msgid "device" +msgstr "端末" + +#: dcim/models/devices.py:798 +msgid "devices" +msgstr "デバイス" + +#: dcim/models/devices.py:838 +#, python-brace-format +msgid "Rack {rack} does not belong to site {site}." +msgstr "ラック {rack} サイトに属していません {site}。" + +#: dcim/models/devices.py:843 +#, python-brace-format +msgid "Location {location} does not belong to site {site}." +msgstr "ロケーション {location} サイトに属していません {site}。" + +#: dcim/models/devices.py:849 +#, python-brace-format +msgid "Rack {rack} does not belong to location {location}." +msgstr "ラック {rack} ロケーションには属さない {location}。" + +#: dcim/models/devices.py:856 +msgid "Cannot select a rack face without assigning a rack." +msgstr "ラックを割り当てないとラックフェースは選択できません。" + +#: dcim/models/devices.py:860 +msgid "Cannot select a rack position without assigning a rack." +msgstr "ラックを割り当てないとラックの位置を選択できません。" + +#: dcim/models/devices.py:866 +msgid "Position must be in increments of 0.5 rack units." +msgstr "位置は 0.5 ラックユニット単位で入力する必要があります。" + +#: dcim/models/devices.py:870 +msgid "Must specify rack face when defining rack position." +msgstr "ラックの位置を定義するときは、ラックの面を指定する必要があります。" + +#: dcim/models/devices.py:878 +#, python-brace-format +msgid "" +"A U0 device type ({device_type}) cannot be assigned to a rack position." +msgstr "U0 デバイスタイプ ({device_type}) をラックポジションに割り当てることはできません。" + +#: dcim/models/devices.py:889 +msgid "" +"Child device types cannot be assigned to a rack face. This is an attribute " +"of the parent device." +msgstr "チャイルドデバイスタイプをラックフェースに割り当てることはできません。これは親デバイスの属性です。" + +#: dcim/models/devices.py:896 +msgid "" +"Child device types cannot be assigned to a rack position. This is an " +"attribute of the parent device." +msgstr "チャイルドデバイスタイプをラックポジションに割り当てることはできません。これは親デバイスの属性です。" + +#: dcim/models/devices.py:910 +#, python-brace-format +msgid "" +"U{position} is already occupied or does not have sufficient space to " +"accommodate this device type: {device_type} ({u_height}U)" +msgstr "" +"あなた{position} が既に占有されているか、このデバイスタイプを収容するのに十分なスペースがない: {device_type} " +"({u_height}あなた)" + +#: dcim/models/devices.py:925 +#, python-brace-format +msgid "{ip} is not an IPv4 address." +msgstr "{ip} は IPv4 アドレスではありません。" + +#: dcim/models/devices.py:934 dcim/models/devices.py:949 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this device." +msgstr "指定された IP アドレス ({ip}) はこのデバイスに割り当てられていません。" + +#: dcim/models/devices.py:940 +#, python-brace-format +msgid "{ip} is not an IPv6 address." +msgstr "{ip} IPv6 アドレスではありません。" + +#: dcim/models/devices.py:967 +#, python-brace-format +msgid "" +"The assigned platform is limited to {platform_manufacturer} device types, " +"but this device's type belongs to {devicetype_manufacturer}." +msgstr "" +"割り当てられるプラットフォームは次のものに限定されます {platform_manufacturer} デバイスタイプ。ただし、このデバイスのタイプは " +"{devicetype_manufacturer}。" + +#: dcim/models/devices.py:978 +#, python-brace-format +msgid "The assigned cluster belongs to a different site ({site})" +msgstr "割り当てられたクラスタは別のサイトに属しています ({site})" + +#: dcim/models/devices.py:986 +msgid "A device assigned to a virtual chassis must have its position defined." +msgstr "仮想シャーシに割り当てられたデバイスには、その位置が定義されている必要があります。" + +#: dcim/models/devices.py:1188 +msgid "module" +msgstr "モジュール" + +#: dcim/models/devices.py:1189 +msgid "modules" +msgstr "モジュール" + +#: dcim/models/devices.py:1205 +#, python-brace-format +msgid "" +"Module must be installed within a module bay belonging to the assigned " +"device ({device})." +msgstr "モジュールは、割り当てられたデバイスに属するモジュールベイ内に取り付ける必要があります ({device})。" + +#: dcim/models/devices.py:1309 +msgid "domain" +msgstr "ドメイン" + +#: dcim/models/devices.py:1322 dcim/models/devices.py:1323 +msgid "virtual chassis" +msgstr "バーチャルシャーシ" + +#: dcim/models/devices.py:1338 +#, python-brace-format +msgid "" +"The selected master ({master}) is not assigned to this virtual chassis." +msgstr "選択したマスター ({master}) はこの仮想シャーシに割り当てられていません。" + +#: dcim/models/devices.py:1354 +#, python-brace-format +msgid "" +"Unable to delete virtual chassis {self}. There are member interfaces which " +"form a cross-chassis LAG interfaces." +msgstr "バーチャルシャーシを削除できません {self}。クロスシャーシ LAG インターフェイスを形成するメンバーインターフェイスがあります。" + +#: dcim/models/devices.py:1379 vpn/models/l2vpn.py:37 +msgid "identifier" +msgstr "識別" + +#: dcim/models/devices.py:1380 +msgid "Numeric identifier unique to the parent device" +msgstr "親デバイスに固有の数値識別子" + +#: dcim/models/devices.py:1408 extras/models/models.py:129 +#: extras/models/models.py:724 netbox/models/__init__.py:114 +msgid "comments" +msgstr "コメント" + +#: dcim/models/devices.py:1424 +msgid "virtual device context" +msgstr "仮想デバイスコンテキスト" + +#: dcim/models/devices.py:1425 +msgid "virtual device contexts" +msgstr "仮想デバイスコンテキスト" + +#: dcim/models/devices.py:1457 +#, python-brace-format +msgid "{ip} is not an IPv{family} address." +msgstr "{ip} IPvではありません{family} 住所。" + +#: dcim/models/devices.py:1463 +msgid "Primary IP address must belong to an interface on the assigned device." +msgstr "プライマリ IP アドレスは、割り当てられたデバイスのインターフェイスに属している必要があります。" + +#: dcim/models/mixins.py:15 extras/models/configs.py:41 +#: extras/models/models.py:343 extras/models/models.py:552 +#: extras/models/search.py:50 ipam/models/ip.py:193 +msgid "weight" +msgstr "重量" + +#: dcim/models/mixins.py:22 +msgid "weight unit" +msgstr "重量単位" + +#: dcim/models/mixins.py:51 +msgid "Must specify a unit when setting a weight" +msgstr "重量を設定するときは単位を指定する必要があります" + +#: dcim/models/power.py:55 +msgid "power panel" +msgstr "パワーパネル" + +#: dcim/models/power.py:56 +msgid "power panels" +msgstr "パワーパネル" + +#: dcim/models/power.py:70 +#, python-brace-format +msgid "" +"Location {location} ({location_site}) is in a different site than {site}" +msgstr "ロケーション {location} ({location_site}) はとは別のサイトにあります {site}" + +#: dcim/models/power.py:107 +msgid "supply" +msgstr "供給" + +#: dcim/models/power.py:113 +msgid "phase" +msgstr "段階" + +#: dcim/models/power.py:119 +msgid "voltage" +msgstr "電圧" + +#: dcim/models/power.py:124 +msgid "amperage" +msgstr "アンペア数" + +#: dcim/models/power.py:129 +msgid "max utilization" +msgstr "最大使用率" + +#: dcim/models/power.py:132 +msgid "Maximum permissible draw (percentage)" +msgstr "最大許容抽選 (パーセンテージ)" + +#: dcim/models/power.py:135 +msgid "available power" +msgstr "使用可能な電力" + +#: dcim/models/power.py:163 +msgid "power feed" +msgstr "パワーフィード" + +#: dcim/models/power.py:164 +msgid "power feeds" +msgstr "パワーフィード" + +#: dcim/models/power.py:178 +#, python-brace-format +msgid "" +"Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " +"are in different sites." +msgstr "" +"ラック {rack} ({rack_site}) とパワーパネル {powerpanel} ({powerpanel_site}) " +"は別のサイトにあります。" + +#: dcim/models/power.py:189 +msgid "Voltage cannot be negative for AC supply" +msgstr "AC 電源の電圧を負にすることはできません" + +#: dcim/models/racks.py:49 +msgid "rack role" +msgstr "ラックロール" + +#: dcim/models/racks.py:50 +msgid "rack roles" +msgstr "ラックロール" + +#: dcim/models/racks.py:74 +msgid "facility ID" +msgstr "ファシリティ ID" + +#: dcim/models/racks.py:75 +msgid "Locally-assigned identifier" +msgstr "ローカルに割り当てられた識別子" + +#: dcim/models/racks.py:108 ipam/forms/bulk_import.py:200 +#: ipam/forms/bulk_import.py:265 ipam/forms/bulk_import.py:300 +#: ipam/forms/bulk_import.py:467 virtualization/forms/bulk_import.py:112 +msgid "Functional role" +msgstr "機能的役割" + +#: dcim/models/racks.py:121 +msgid "A unique tag used to identify this rack" +msgstr "このラックの識別に使用される固有のタグ" + +#: dcim/models/racks.py:132 +msgid "width" +msgstr "幅" + +#: dcim/models/racks.py:133 +msgid "Rail-to-rail width" +msgstr "レール・トゥ・レールの幅" + +#: dcim/models/racks.py:139 +msgid "Height in rack units" +msgstr "ラック単位の高さ" + +#: dcim/models/racks.py:143 +msgid "starting unit" +msgstr "始動ユニット" + +#: dcim/models/racks.py:145 +msgid "Starting unit for rack" +msgstr "ラック用始動ユニット" + +#: dcim/models/racks.py:149 +msgid "descending units" +msgstr "降順単位" + +#: dcim/models/racks.py:150 +msgid "Units are numbered top-to-bottom" +msgstr "ユニットには上から下に番号が付けられています" + +#: dcim/models/racks.py:153 +msgid "outer width" +msgstr "外側の幅" + +#: dcim/models/racks.py:156 +msgid "Outer dimension of rack (width)" +msgstr "ラックの外形寸法(幅)" + +#: dcim/models/racks.py:159 +msgid "outer depth" +msgstr "外側の深さ" + +#: dcim/models/racks.py:162 +msgid "Outer dimension of rack (depth)" +msgstr "ラックの外形寸法(奥行き)" + +#: dcim/models/racks.py:165 +msgid "outer unit" +msgstr "アウターユニット" + +#: dcim/models/racks.py:171 +msgid "max weight" +msgstr "最大重量" + +#: dcim/models/racks.py:174 +msgid "Maximum load capacity for the rack" +msgstr "ラックの最大積載量" + +#: dcim/models/racks.py:182 +msgid "mounting depth" +msgstr "取り付け深さ" + +#: dcim/models/racks.py:186 +msgid "" +"Maximum depth of a mounted device, in millimeters. For four-post racks, this" +" is the distance between the front and rear rails." +msgstr "マウントされたデバイスの最大奥行き (mm)。4 支柱ラックの場合、これは前面レールと背面レールの間の距離です。" + +#: dcim/models/racks.py:220 +msgid "rack" +msgstr "ラック" + +#: dcim/models/racks.py:221 +msgid "racks" +msgstr "ラック" + +#: dcim/models/racks.py:236 +#, python-brace-format +msgid "Assigned location must belong to parent site ({site})." +msgstr "割り当てられた場所は親サイトに属している必要があります ({site})。" + +#: dcim/models/racks.py:240 +msgid "Must specify a unit when setting an outer width/depth" +msgstr "外側の幅/奥行きを設定する場合は単位を指定する必要があります" + +#: dcim/models/racks.py:244 +msgid "Must specify a unit when setting a maximum weight" +msgstr "最大重量を設定するときは単位を指定する必要があります" + +#: dcim/models/racks.py:254 +#, python-brace-format +msgid "" +"Rack must be at least {min_height}U tall to house currently installed " +"devices." +msgstr "ラックは少なくとも必要です {min_height}現在インストールされているデバイスを収納するには十分な高さがあります。" + +#: dcim/models/racks.py:261 +#, python-brace-format +msgid "" +"Rack unit numbering must begin at {position} or less to house currently " +"installed devices." +msgstr "ラックユニット番号は次の文字で始まる必要があります {position} 現在インストールされているデバイスを収納するにはそれ以下。" + +#: dcim/models/racks.py:269 +#, python-brace-format +msgid "Location must be from the same site, {site}." +msgstr "場所は同じサイトのものでなければなりません。 {site}。" + +#: dcim/models/racks.py:522 +msgid "units" +msgstr "単位" + +#: dcim/models/racks.py:548 +msgid "rack reservation" +msgstr "ラック予約" + +#: dcim/models/racks.py:549 +msgid "rack reservations" +msgstr "ラック予約" + +#: dcim/models/racks.py:566 +#, python-brace-format +msgid "Invalid unit(s) for {height}U rack: {unit_list}" +msgstr "のユニットが無効です {height}U ラック: {unit_list}" + +#: dcim/models/racks.py:579 +#, python-brace-format +msgid "The following units have already been reserved: {unit_list}" +msgstr "次のユニットはすでに予約されています。 {unit_list}" + +#: dcim/models/sites.py:49 +msgid "A top-level region with this name already exists." +msgstr "同じ名前のトップレベルリージョンが既に存在します。" + +#: dcim/models/sites.py:59 +msgid "A top-level region with this slug already exists." +msgstr "このスラッグを含むトップレベルリージョンは既に存在します。" + +#: dcim/models/sites.py:62 +msgid "region" +msgstr "領域" + +#: dcim/models/sites.py:63 +msgid "regions" +msgstr "リージョン" + +#: dcim/models/sites.py:102 +msgid "A top-level site group with this name already exists." +msgstr "同じ名前のトップレベルサイトグループが既に存在しています。" + +#: dcim/models/sites.py:112 +msgid "A top-level site group with this slug already exists." +msgstr "このスラッグを含むトップレベルのサイトグループが既に存在しています。" + +#: dcim/models/sites.py:115 +msgid "site group" +msgstr "サイトグループ" + +#: dcim/models/sites.py:116 +msgid "site groups" +msgstr "サイトグループ" + +#: dcim/models/sites.py:141 +msgid "Full name of the site" +msgstr "サイトのフルネーム" + +#: dcim/models/sites.py:181 +msgid "facility" +msgstr "施設" + +#: dcim/models/sites.py:184 +msgid "Local facility ID or description" +msgstr "ローカルファシリティ ID または説明" + +#: dcim/models/sites.py:195 +msgid "physical address" +msgstr "物理アドレス" + +#: dcim/models/sites.py:198 +msgid "Physical location of the building" +msgstr "建物の物理的位置" + +#: dcim/models/sites.py:201 +msgid "shipping address" +msgstr "配送先住所" + +#: dcim/models/sites.py:204 +msgid "If different from the physical address" +msgstr "実際の住所と異なる場合" + +#: dcim/models/sites.py:238 +msgid "site" +msgstr "サイト" + +#: dcim/models/sites.py:239 +msgid "sites" +msgstr "サイト" + +#: dcim/models/sites.py:303 +msgid "A location with this name already exists within the specified site." +msgstr "この名前の場所は、指定されたサイト内に既に存在します。" + +#: dcim/models/sites.py:313 +msgid "A location with this slug already exists within the specified site." +msgstr "このスラッグのある場所は、指定されたサイト内にすでに存在します。" + +#: dcim/models/sites.py:316 +msgid "location" +msgstr "ロケーション" + +#: dcim/models/sites.py:317 +msgid "locations" +msgstr "場所" + +#: dcim/models/sites.py:331 +#, python-brace-format +msgid "Parent location ({parent}) must belong to the same site ({site})." +msgstr "親の場所 ({parent}) は同じサイトに属している必要があります ({site})。" + +#: dcim/tables/cables.py:54 +msgid "Termination A" +msgstr "ターミネーション A" + +#: dcim/tables/cables.py:59 +msgid "Termination B" +msgstr "ターミネーション B" + +#: dcim/tables/cables.py:65 wireless/tables/wirelesslink.py:22 +msgid "Device A" +msgstr "デバイス A" + +#: dcim/tables/cables.py:71 wireless/tables/wirelesslink.py:31 +msgid "Device B" +msgstr "デバイス B" + +#: dcim/tables/cables.py:77 +msgid "Location A" +msgstr "ロケーション A" + +#: dcim/tables/cables.py:83 +msgid "Location B" +msgstr "ロケーション B" + +#: dcim/tables/cables.py:89 +msgid "Rack A" +msgstr "ラック A" + +#: dcim/tables/cables.py:95 +msgid "Rack B" +msgstr "ラック B" + +#: dcim/tables/cables.py:101 +msgid "Site A" +msgstr "サイト A" + +#: dcim/tables/cables.py:107 +msgid "Site B" +msgstr "サイト B" + +#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:18 +#: templates/dcim/consoleserverport.html:75 templates/dcim/frontport.html:119 +#: templates/dcim/inventoryitem_edit.html:39 +msgid "Console Port" +msgstr "コンソールポート" + +#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 +#: dcim/tables/connections.py:71 +#: templates/dcim/inc/connection_endpoints.html:16 +msgid "Reachable" +msgstr "到達可能" + +#: dcim/tables/connections.py:46 dcim/tables/devices.py:524 +#: templates/dcim/inventoryitem_edit.html:64 +#: templates/dcim/poweroutlet.html:47 templates/dcim/powerport.html:18 +msgid "Power Port" +msgstr "パワーポート" + +#: dcim/tables/devices.py:94 dcim/tables/devices.py:139 +#: dcim/tables/racks.py:81 dcim/tables/sites.py:143 +#: netbox/navigation/menu.py:57 netbox/navigation/menu.py:61 +#: netbox/navigation/menu.py:63 virtualization/forms/model_forms.py:125 +#: virtualization/tables/clusters.py:83 virtualization/views.py:211 +msgid "Devices" +msgstr "[デバイス]" + +#: dcim/tables/devices.py:99 dcim/tables/devices.py:144 +#: virtualization/tables/clusters.py:88 +msgid "VMs" +msgstr "仮想マシン" + +#: dcim/tables/devices.py:133 dcim/tables/devices.py:245 +#: extras/forms/model_forms.py:513 templates/dcim/device.html:114 +#: templates/dcim/device/render_config.html:11 +#: templates/dcim/device/render_config.html:15 +#: templates/dcim/devicerole.html:47 templates/dcim/platform.html:44 +#: templates/extras/configtemplate.html:10 +#: templates/virtualization/virtualmachine.html:47 +#: templates/virtualization/virtualmachine/render_config.html:11 +#: templates/virtualization/virtualmachine/render_config.html:15 +#: virtualization/tables/virtualmachines.py:93 +msgid "Config Template" +msgstr "設定テンプレート" + +#: dcim/tables/devices.py:216 dcim/tables/devices.py:1069 +#: ipam/forms/bulk_import.py:511 ipam/forms/model_forms.py:296 +#: ipam/tables/ip.py:352 ipam/tables/ip.py:418 ipam/tables/ip.py:441 +#: templates/ipam/ipaddress.html:12 templates/ipam/ipaddress_edit.html:14 +#: virtualization/tables/virtualmachines.py:81 +msgid "IP Address" +msgstr "IP アドレス" + +#: dcim/tables/devices.py:220 dcim/tables/devices.py:1073 +#: virtualization/tables/virtualmachines.py:72 +msgid "IPv4 Address" +msgstr "IPv4 アドレス" + +#: dcim/tables/devices.py:224 dcim/tables/devices.py:1077 +#: virtualization/tables/virtualmachines.py:76 +msgid "IPv6 Address" +msgstr "IPv6 アドレス" + +#: dcim/tables/devices.py:239 +msgid "VC Position" +msgstr "VC ポジション" + +#: dcim/tables/devices.py:242 +msgid "VC Priority" +msgstr "VC プライオリティ" + +#: dcim/tables/devices.py:249 templates/dcim/device_edit.html:38 +#: templates/dcim/devicebay_populate.html:16 +msgid "Parent Device" +msgstr "親デバイス" + +#: dcim/tables/devices.py:254 +msgid "Position (Device Bay)" +msgstr "位置 (デバイスベイ)" + +#: dcim/tables/devices.py:263 +msgid "Console ports" +msgstr "コンソールポート" + +#: dcim/tables/devices.py:266 +msgid "Console server ports" +msgstr "コンソールサーバポート" + +#: dcim/tables/devices.py:269 +msgid "Power ports" +msgstr "電源ポート" + +#: dcim/tables/devices.py:272 +msgid "Power outlets" +msgstr "電源コンセント" + +#: dcim/tables/devices.py:275 dcim/tables/devices.py:1082 +#: dcim/tables/devicetypes.py:125 dcim/views.py:1001 dcim/views.py:1240 +#: dcim/views.py:1926 netbox/navigation/menu.py:82 +#: netbox/navigation/menu.py:238 templates/dcim/device/base.html:37 +#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 +#: templates/dcim/module.html:34 templates/dcim/moduletype/base.html:34 +#: templates/dcim/virtualdevicecontext.html:64 +#: templates/dcim/virtualdevicecontext.html:85 +#: templates/virtualization/virtualmachine/base.html:27 +#: templates/virtualization/virtualmachine_list.html:14 +#: virtualization/tables/virtualmachines.py:87 virtualization/views.py:368 +#: wireless/tables/wirelesslan.py:55 +msgid "Interfaces" +msgstr "インタフェース" + +#: dcim/tables/devices.py:278 +msgid "Front ports" +msgstr "フロントポート" + +#: dcim/tables/devices.py:284 +msgid "Device bays" +msgstr "デバイスベイ" + +#: dcim/tables/devices.py:287 +msgid "Module bays" +msgstr "モジュールベイ" + +#: dcim/tables/devices.py:290 +msgid "Inventory items" +msgstr "インベントリアイテム" + +#: dcim/tables/devices.py:329 dcim/tables/modules.py:56 +#: templates/dcim/modulebay.html:17 +msgid "Module Bay" +msgstr "モジュールベイ" + +#: dcim/tables/devices.py:350 +msgid "Cable Color" +msgstr "ケーブルカラー" + +#: dcim/tables/devices.py:356 +msgid "Link Peers" +msgstr "リンクピア" + +#: dcim/tables/devices.py:359 +msgid "Mark Connected" +msgstr "接続済みとしてマークする" + +#: dcim/tables/devices.py:470 +msgid "Maximum draw (W)" +msgstr "最大引き込み (W)" + +#: dcim/tables/devices.py:473 +msgid "Allocated draw (W)" +msgstr "割り当て済みドロー (W)" + +#: dcim/tables/devices.py:573 ipam/forms/model_forms.py:707 +#: ipam/tables/fhrp.py:28 ipam/views.py:597 ipam/views.py:691 +#: netbox/navigation/menu.py:146 netbox/navigation/menu.py:148 +#: templates/dcim/interface.html:351 templates/ipam/ipaddress_bulk_add.html:15 +#: templates/ipam/service.html:43 templates/virtualization/vminterface.html:88 +#: vpn/tables/tunnels.py:94 +msgid "IP Addresses" +msgstr "IP アドレス" + +#: dcim/tables/devices.py:579 netbox/navigation/menu.py:190 +#: templates/ipam/inc/panels/fhrp_groups.html:5 +msgid "FHRP Groups" +msgstr "FHRP グループ" + +#: dcim/tables/devices.py:591 templates/dcim/interface.html:90 +#: templates/virtualization/vminterface.html:70 templates/vpn/tunnel.html:18 +#: templates/vpn/tunneltermination.html:14 vpn/forms/bulk_edit.py:75 +#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:41 +#: vpn/forms/filtersets.py:81 vpn/forms/model_forms.py:59 +#: vpn/forms/model_forms.py:144 vpn/tables/tunnels.py:74 +msgid "Tunnel" +msgstr "トンネル" + +#: dcim/tables/devices.py:616 dcim/tables/devicetypes.py:224 +#: templates/dcim/interface.html:66 +msgid "Management Only" +msgstr "管理のみ" + +#: dcim/tables/devices.py:624 +msgid "Wireless link" +msgstr "ワイヤレスリンク" + +#: dcim/tables/devices.py:634 +msgid "VDCs" +msgstr "VDC" + +#: dcim/tables/devices.py:642 dcim/tables/devicetypes.py:48 +#: dcim/tables/devicetypes.py:140 dcim/views.py:1076 dcim/views.py:2019 +#: netbox/navigation/menu.py:91 templates/dcim/device/base.html:52 +#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 +#: templates/dcim/inc/panels/inventory_items.html:5 +#: templates/dcim/inventoryitemrole.html:33 +msgid "Inventory Items" +msgstr "インベントリアイテム" + +#: dcim/tables/devices.py:723 +#: templates/circuits/inc/circuit_termination.html:80 +#: templates/dcim/consoleport.html:81 templates/dcim/consoleserverport.html:81 +#: templates/dcim/frontport.html:53 templates/dcim/frontport.html:125 +#: templates/dcim/interface.html:196 templates/dcim/inventoryitem_edit.html:69 +#: templates/dcim/rearport.html:18 templates/dcim/rearport.html:115 +msgid "Rear Port" +msgstr "リアポート" + +#: dcim/tables/devices.py:888 templates/dcim/modulebay.html:51 +msgid "Installed Module" +msgstr "インストール済みモジュール" + +#: dcim/tables/devices.py:891 +msgid "Module Serial" +msgstr "モジュールシリアル" + +#: dcim/tables/devices.py:895 +msgid "Module Asset Tag" +msgstr "モジュール資産タグ" + +#: dcim/tables/devices.py:904 +msgid "Module Status" +msgstr "モジュールステータス" + +#: dcim/tables/devices.py:946 dcim/tables/devicetypes.py:308 +#: templates/dcim/inventoryitem.html:41 +msgid "Component" +msgstr "[コンポーネント]" + +#: dcim/tables/devices.py:1001 +msgid "Items" +msgstr "アイテム" + +#: dcim/tables/devicetypes.py:38 netbox/navigation/menu.py:72 +#: netbox/navigation/menu.py:74 +msgid "Device Types" +msgstr "デバイスタイプ" + +#: dcim/tables/devicetypes.py:43 netbox/navigation/menu.py:75 +msgid "Module Types" +msgstr "モジュールタイプ" + +#: dcim/tables/devicetypes.py:53 extras/forms/filtersets.py:379 +#: extras/forms/model_forms.py:421 netbox/navigation/menu.py:66 +msgid "Platforms" +msgstr "プラットフォーム" + +#: dcim/tables/devicetypes.py:85 templates/dcim/devicetype.html:32 +msgid "Default Platform" +msgstr "デフォルトプラットフォーム" + +#: dcim/tables/devicetypes.py:89 templates/dcim/devicetype.html:48 +msgid "Full Depth" +msgstr "フルデプス" + +#: dcim/tables/devicetypes.py:98 +msgid "U Height" +msgstr "U ハイト" + +#: dcim/tables/devicetypes.py:110 dcim/tables/modules.py:26 +msgid "Instances" +msgstr "インスタンス" + +#: dcim/tables/devicetypes.py:113 dcim/views.py:941 dcim/views.py:1180 +#: dcim/views.py:1866 netbox/navigation/menu.py:85 +#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 +#: templates/dcim/devicetype/base.html:22 templates/dcim/module.html:22 +#: templates/dcim/moduletype/base.html:22 +msgid "Console Ports" +msgstr "コンソールポート" + +#: dcim/tables/devicetypes.py:116 dcim/views.py:956 dcim/views.py:1195 +#: dcim/views.py:1881 netbox/navigation/menu.py:86 +#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 +#: templates/dcim/devicetype/base.html:25 templates/dcim/module.html:25 +#: templates/dcim/moduletype/base.html:25 +msgid "Console Server Ports" +msgstr "コンソールサーバポート" + +#: dcim/tables/devicetypes.py:119 dcim/views.py:971 dcim/views.py:1210 +#: dcim/views.py:1896 netbox/navigation/menu.py:87 +#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 +#: templates/dcim/devicetype/base.html:28 templates/dcim/module.html:28 +#: templates/dcim/moduletype/base.html:28 +msgid "Power Ports" +msgstr "電源ポート" + +#: dcim/tables/devicetypes.py:122 dcim/views.py:986 dcim/views.py:1225 +#: dcim/views.py:1911 netbox/navigation/menu.py:88 +#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 +#: templates/dcim/devicetype/base.html:31 templates/dcim/module.html:31 +#: templates/dcim/moduletype/base.html:31 +msgid "Power Outlets" +msgstr "電源コンセント" + +#: dcim/tables/devicetypes.py:128 dcim/views.py:1016 dcim/views.py:1255 +#: dcim/views.py:1947 netbox/navigation/menu.py:83 +#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 +#: templates/dcim/module.html:37 templates/dcim/moduletype/base.html:37 +msgid "Front Ports" +msgstr "フロントポート" + +#: dcim/tables/devicetypes.py:131 dcim/views.py:1031 dcim/views.py:1270 +#: dcim/views.py:1962 netbox/navigation/menu.py:84 +#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 +#: templates/dcim/devicetype/base.html:40 templates/dcim/module.html:40 +#: templates/dcim/moduletype/base.html:40 +msgid "Rear Ports" +msgstr "リアポート" + +#: dcim/tables/devicetypes.py:134 dcim/views.py:1061 dcim/views.py:2000 +#: netbox/navigation/menu.py:90 templates/dcim/device/base.html:49 +#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +msgid "Device Bays" +msgstr "デバイスベイ" + +#: dcim/tables/devicetypes.py:137 dcim/views.py:1046 dcim/views.py:1981 +#: netbox/navigation/menu.py:89 templates/dcim/device/base.html:46 +#: templates/dcim/device_list.html:64 templates/dcim/devicetype/base.html:43 +msgid "Module Bays" +msgstr "モジュールベイ" + +#: dcim/tables/power.py:36 netbox/navigation/menu.py:282 +#: templates/core/configrevision.html:59 templates/dcim/powerpanel.html:53 +msgid "Power Feeds" +msgstr "パワーフィード" + +#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:106 +msgid "Max Utilization" +msgstr "最大使用率" + +#: dcim/tables/power.py:84 +msgid "Available Power (VA)" +msgstr "使用可能な電力 (VA)" + +#: dcim/tables/racks.py:29 dcim/tables/sites.py:138 +#: netbox/navigation/menu.py:25 netbox/navigation/menu.py:27 +msgid "Racks" +msgstr "ラック" + +#: dcim/tables/racks.py:73 templates/dcim/device.html:323 +#: templates/dcim/rack.html:95 +msgid "Height" +msgstr "高さ" + +#: dcim/tables/racks.py:85 +msgid "Space" +msgstr "スペース" + +#: dcim/tables/racks.py:96 templates/dcim/rack.html:105 +msgid "Outer Width" +msgstr "外側の幅" + +#: dcim/tables/racks.py:100 templates/dcim/rack.html:115 +msgid "Outer Depth" +msgstr "外側の深さ" + +#: dcim/tables/racks.py:108 +msgid "Max Weight" +msgstr "最大重量" + +#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 +#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:401 +#: ipam/forms/bulk_edit.py:128 ipam/forms/model_forms.py:152 +#: ipam/tables/asn.py:66 netbox/navigation/menu.py:16 +#: netbox/navigation/menu.py:18 +msgid "Sites" +msgstr "サイト" + +#: dcim/views.py:131 +#, python-brace-format +msgid "Disconnected {count} {type}" +msgstr "切断されました {count} {type}" + +#: dcim/views.py:692 netbox/navigation/menu.py:29 +msgid "Reservations" +msgstr "ご予約" + +#: dcim/views.py:710 +msgid "Non-Racked Devices" +msgstr "ラック搭載でないデバイス" + +#: dcim/views.py:2032 extras/forms/model_forms.py:461 +#: templates/extras/configcontext.html:10 +#: virtualization/forms/model_forms.py:228 virtualization/views.py:408 +msgid "Config Context" +msgstr "コンフィグコンテキスト" + +#: dcim/views.py:2042 virtualization/views.py:418 +msgid "Render Config" +msgstr "レンダー設定" + +#: dcim/views.py:2970 ipam/tables/ip.py:233 +msgid "Children" +msgstr "子ども" + +#: extras/choices.py:27 extras/forms/misc.py:14 +msgid "Text" +msgstr "[テキスト]" + +#: extras/choices.py:28 +msgid "Text (long)" +msgstr "テキスト (長い)" + +#: extras/choices.py:29 +msgid "Integer" +msgstr "整数" + +#: extras/choices.py:30 +msgid "Decimal" +msgstr "十進法" + +#: extras/choices.py:31 +msgid "Boolean (true/false)" +msgstr "ブーリアン (真/偽)" + +#: extras/choices.py:32 +msgid "Date" +msgstr "日付" + +#: extras/choices.py:33 +msgid "Date & time" +msgstr "日付と時刻" + +#: extras/choices.py:35 +msgid "JSON" +msgstr "JSON" + +#: extras/choices.py:36 +msgid "Selection" +msgstr "セレクション" + +#: extras/choices.py:37 +msgid "Multiple selection" +msgstr "複数選択" + +#: extras/choices.py:39 +msgid "Multiple objects" +msgstr "複数のオブジェクト" + +#: extras/choices.py:50 templates/extras/customfield.html:69 vpn/choices.py:20 +#: wireless/choices.py:27 +msgid "Disabled" +msgstr "無効" + +#: extras/choices.py:51 +msgid "Loose" +msgstr "緩い" + +#: extras/choices.py:52 +msgid "Exact" +msgstr "正確" + +#: extras/choices.py:63 +msgid "Always" +msgstr "常に" + +#: extras/choices.py:64 +msgid "If set" +msgstr "設定されている場合" + +#: extras/choices.py:65 extras/choices.py:78 +msgid "Hidden" +msgstr "非表示" + +#: extras/choices.py:76 +msgid "Yes" +msgstr "はい" + +#: extras/choices.py:77 +msgid "No" +msgstr "いいえ" + +#: extras/choices.py:105 templates/tenancy/contact.html:58 +#: tenancy/forms/bulk_edit.py:117 wireless/forms/model_forms.py:159 +msgid "Link" +msgstr "リンク" + +#: extras/choices.py:119 +msgid "Newest" +msgstr "最新" + +#: extras/choices.py:120 +msgid "Oldest" +msgstr "最も古い" + +#: extras/choices.py:136 templates/generic/object.html:51 +msgid "Updated" +msgstr "更新済み" + +#: extras/choices.py:137 +msgid "Deleted" +msgstr "削除済み" + +#: extras/choices.py:154 extras/choices.py:176 +msgid "Info" +msgstr "情報" + +#: extras/choices.py:155 extras/choices.py:175 +msgid "Success" +msgstr "成功" + +#: extras/choices.py:156 extras/choices.py:177 +msgid "Warning" +msgstr "警告" + +#: extras/choices.py:157 +msgid "Danger" +msgstr "危険" + +#: extras/choices.py:174 utilities/choices.py:190 +msgid "Default" +msgstr "デフォルト" + +#: extras/choices.py:178 +msgid "Failure" +msgstr "失敗" + +#: extras/choices.py:185 +msgid "Hourly" +msgstr "1 時間ごと" + +#: extras/choices.py:186 +msgid "12 hours" +msgstr "12 時間" + +#: extras/choices.py:187 +msgid "Daily" +msgstr "デイリー" + +#: extras/choices.py:188 +msgid "Weekly" +msgstr "毎週" + +#: extras/choices.py:189 +msgid "30 days" +msgstr "30 日間" + +#: extras/choices.py:254 extras/tables/tables.py:291 +#: templates/dcim/virtualchassis_edit.html:108 +#: templates/extras/eventrule.html:51 +#: templates/generic/bulk_add_component.html:56 +#: templates/generic/object_edit.html:29 templates/generic/object_edit.html:70 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +msgid "Create" +msgstr "作成" + +#: extras/choices.py:255 extras/tables/tables.py:294 +#: templates/extras/eventrule.html:55 +msgid "Update" +msgstr "[更新]" + +#: extras/choices.py:256 extras/tables/tables.py:297 +#: templates/circuits/inc/circuit_termination.html:22 +#: templates/dcim/devicetype/component_templates.html:24 +#: templates/dcim/inc/panels/inventory_items.html:29 +#: templates/dcim/moduletype/component_templates.html:24 +#: templates/dcim/powerpanel.html:71 templates/extras/eventrule.html:59 +#: templates/extras/report_list.html:34 templates/extras/script_list.html:33 +#: templates/generic/bulk_delete.html:18 templates/generic/bulk_delete.html:45 +#: templates/generic/object_delete.html:15 templates/htmx/delete_form.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:35 +#: templates/users/objectpermission.html:49 +#: utilities/templates/buttons/delete.html:9 +msgid "Delete" +msgstr "[削除]" + +#: extras/choices.py:280 utilities/choices.py:143 utilities/choices.py:191 +msgid "Blue" +msgstr "青" + +#: extras/choices.py:281 utilities/choices.py:142 utilities/choices.py:192 +msgid "Indigo" +msgstr "インディゴ" + +#: extras/choices.py:282 utilities/choices.py:140 utilities/choices.py:193 +msgid "Purple" +msgstr "紫の" + +#: extras/choices.py:283 utilities/choices.py:137 utilities/choices.py:194 +msgid "Pink" +msgstr "ピンク" + +#: extras/choices.py:284 utilities/choices.py:136 utilities/choices.py:195 +msgid "Red" +msgstr "赤" + +#: extras/choices.py:285 utilities/choices.py:154 utilities/choices.py:196 +msgid "Orange" +msgstr "オレンジ" + +#: extras/choices.py:286 utilities/choices.py:152 utilities/choices.py:197 +msgid "Yellow" +msgstr "黄色" + +#: extras/choices.py:287 utilities/choices.py:149 utilities/choices.py:198 +msgid "Green" +msgstr "緑" + +#: extras/choices.py:288 utilities/choices.py:146 utilities/choices.py:199 +msgid "Teal" +msgstr "ティール" + +#: extras/choices.py:289 utilities/choices.py:145 utilities/choices.py:200 +msgid "Cyan" +msgstr "シアン" + +#: extras/choices.py:290 utilities/choices.py:201 +msgid "Gray" +msgstr "グレー" + +#: extras/choices.py:291 utilities/choices.py:160 utilities/choices.py:202 +msgid "Black" +msgstr "ブラック" + +#: extras/choices.py:292 utilities/choices.py:161 utilities/choices.py:203 +msgid "White" +msgstr "ホワイト" + +#: extras/choices.py:306 extras/forms/model_forms.py:233 +#: extras/forms/model_forms.py:319 templates/extras/webhook.html:11 +msgid "Webhook" +msgstr "ウェブフック" + +#: extras/choices.py:307 templates/extras/script/base.html:29 +msgid "Script" +msgstr "スクリプト" + +#: extras/dashboard/forms.py:38 +msgid "Widget type" +msgstr "ウィジェットタイプ" + +#: extras/dashboard/widgets.py:148 +msgid "Note" +msgstr "[メモ]" + +#: extras/dashboard/widgets.py:149 +msgid "Display some arbitrary custom content. Markdown is supported." +msgstr "任意のカスタムコンテンツを表示します。Markdown はサポートされています。" + +#: extras/dashboard/widgets.py:162 +msgid "Object Counts" +msgstr "オブジェクト数" + +#: extras/dashboard/widgets.py:163 +msgid "" +"Display a set of NetBox models and the number of objects created for each " +"type." +msgstr "NetBox モデルのセットと、各タイプで作成されたオブジェクトの数を表示します。" + +#: extras/dashboard/widgets.py:173 +msgid "Filters to apply when counting the number of objects" +msgstr "オブジェクトの数をカウントするときに適用するフィルター" + +#: extras/dashboard/widgets.py:209 +msgid "Object List" +msgstr "オブジェクトリスト" + +#: extras/dashboard/widgets.py:210 +msgid "Display an arbitrary list of objects." +msgstr "任意のオブジェクトリストを表示します。" + +#: extras/dashboard/widgets.py:223 +msgid "The default number of objects to display" +msgstr "表示するデフォルトのオブジェクト数" + +#: extras/dashboard/widgets.py:270 +msgid "RSS Feed" +msgstr "RSS フィード" + +#: extras/dashboard/widgets.py:275 +msgid "Embed an RSS feed from an external website." +msgstr "外部 Web サイトの RSS フィードを埋め込みます。" + +#: extras/dashboard/widgets.py:282 +msgid "Feed URL" +msgstr "フィード URL" + +#: extras/dashboard/widgets.py:287 +msgid "The maximum number of objects to display" +msgstr "表示するオブジェクトの最大数" + +#: extras/dashboard/widgets.py:292 +msgid "How long to stored the cached content (in seconds)" +msgstr "キャッシュされたコンテンツを保存する時間 (秒単位)" + +#: extras/dashboard/widgets.py:344 templates/account/base.html:10 +#: templates/account/bookmarks.html:7 templates/inc/profile_button.html:29 +msgid "Bookmarks" +msgstr "ブックマーク" + +#: extras/dashboard/widgets.py:348 +msgid "Show your personal bookmarks" +msgstr "個人用のブックマークを表示" + +#: extras/filtersets.py:207 extras/filtersets.py:542 extras/filtersets.py:570 +msgid "Data file (ID)" +msgstr "データファイル (ID)" + +#: extras/filtersets.py:479 virtualization/forms/filtersets.py:114 +msgid "Cluster type" +msgstr "クラスタータイプ" + +#: extras/filtersets.py:485 virtualization/filtersets.py:95 +#: virtualization/filtersets.py:147 +msgid "Cluster type (slug)" +msgstr "クラスタータイプ (スラッグ)" + +#: extras/filtersets.py:490 ipam/forms/bulk_edit.py:475 +#: ipam/forms/model_forms.py:585 virtualization/forms/filtersets.py:108 +msgid "Cluster group" +msgstr "クラスターグループ" + +#: extras/filtersets.py:496 virtualization/filtersets.py:136 +msgid "Cluster group (slug)" +msgstr "クラスターグループ (スラッグ)" + +#: extras/filtersets.py:506 tenancy/forms/forms.py:16 +#: tenancy/forms/forms.py:39 +msgid "Tenant group" +msgstr "テナントグループ" + +#: extras/filtersets.py:512 tenancy/filtersets.py:164 +#: tenancy/filtersets.py:184 +msgid "Tenant group (slug)" +msgstr "テナントグループ (スラッグ)" + +#: extras/filtersets.py:528 templates/extras/tag.html:12 +msgid "Tag" +msgstr "[タグ]" + +#: extras/filtersets.py:534 +msgid "Tag (slug)" +msgstr "タグ (スラッグ)" + +#: extras/filtersets.py:594 extras/forms/filtersets.py:438 +msgid "Has local config context data" +msgstr "ローカル設定コンテキストデータがある" + +#: extras/filtersets.py:619 +msgid "User name" +msgstr "[ユーザー名]" + +#: extras/forms/bulk_edit.py:32 extras/forms/filtersets.py:56 +msgid "Group name" +msgstr "グループ名" + +#: extras/forms/bulk_edit.py:40 extras/forms/filtersets.py:64 +#: extras/tables/tables.py:47 templates/extras/customfield.html:39 +#: templates/generic/bulk_import.html:116 +msgid "Required" +msgstr "必須" + +#: extras/forms/bulk_edit.py:53 extras/forms/bulk_import.py:57 +#: extras/forms/filtersets.py:78 extras/models/customfields.py:193 +msgid "UI visible" +msgstr "UI が表示される" + +#: extras/forms/bulk_edit.py:58 extras/forms/bulk_import.py:63 +#: extras/forms/filtersets.py:83 extras/models/customfields.py:200 +msgid "UI editable" +msgstr "UI は編集可能" + +#: extras/forms/bulk_edit.py:63 extras/forms/filtersets.py:86 +msgid "Is cloneable" +msgstr "クローン可能" + +#: extras/forms/bulk_edit.py:102 extras/forms/filtersets.py:126 +msgid "New window" +msgstr "新しいウィンドウ" + +#: extras/forms/bulk_edit.py:111 +msgid "Button class" +msgstr "ボタンクラス" + +#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:164 +#: extras/models/models.py:439 +msgid "MIME type" +msgstr "マイムタイプ" + +#: extras/forms/bulk_edit.py:133 extras/forms/filtersets.py:167 +msgid "File extension" +msgstr "ファイル拡張子" + +#: extras/forms/bulk_edit.py:138 extras/forms/filtersets.py:171 +msgid "As attachment" +msgstr "添付ファイルとして" + +#: extras/forms/bulk_edit.py:166 extras/forms/filtersets.py:213 +#: extras/tables/tables.py:214 templates/extras/savedfilter.html:30 +msgid "Shared" +msgstr "共有" + +#: extras/forms/bulk_edit.py:189 extras/forms/filtersets.py:242 +#: extras/models/models.py:204 +msgid "HTTP method" +msgstr "HTTP メソッド" + +#: extras/forms/bulk_edit.py:193 extras/forms/filtersets.py:236 +#: templates/extras/webhook.html:37 +msgid "Payload URL" +msgstr "ペイロード URL" + +#: extras/forms/bulk_edit.py:198 extras/models/models.py:244 +msgid "SSL verification" +msgstr "SSL 検証" + +#: extras/forms/bulk_edit.py:201 templates/extras/webhook.html:45 +msgid "Secret" +msgstr "シークレット" + +#: extras/forms/bulk_edit.py:206 +msgid "CA file path" +msgstr "CA ファイルパス" + +#: extras/forms/bulk_edit.py:225 +msgid "On create" +msgstr "作成時" + +#: extras/forms/bulk_edit.py:230 +msgid "On update" +msgstr "更新時" + +#: extras/forms/bulk_edit.py:235 +msgid "On delete" +msgstr "削除時" + +#: extras/forms/bulk_edit.py:240 +msgid "On job start" +msgstr "ジョブ開始時" + +#: extras/forms/bulk_edit.py:245 +msgid "On job end" +msgstr "ジョブ終了時" + +#: extras/forms/bulk_edit.py:282 +msgid "Is active" +msgstr "アクティブです" + +#: extras/forms/bulk_import.py:34 extras/forms/bulk_import.py:115 +#: extras/forms/bulk_import.py:130 extras/forms/bulk_import.py:153 +#: extras/forms/bulk_import.py:177 extras/forms/filtersets.py:114 +#: extras/forms/filtersets.py:160 extras/forms/filtersets.py:201 +#: extras/forms/model_forms.py:43 extras/forms/model_forms.py:127 +#: extras/forms/model_forms.py:154 extras/forms/model_forms.py:195 +#: extras/forms/model_forms.py:251 +msgid "Content types" +msgstr "コンテンツタイプ" + +#: extras/forms/bulk_import.py:36 extras/forms/bulk_import.py:117 +#: extras/forms/bulk_import.py:132 extras/forms/bulk_import.py:155 +#: extras/forms/bulk_import.py:179 tenancy/forms/bulk_import.py:96 +msgid "One or more assigned object types" +msgstr "1 つまたは複数の割り当てられたオブジェクトタイプ" + +#: extras/forms/bulk_import.py:41 +msgid "Field data type (e.g. text, integer, etc.)" +msgstr "フィールドデータタイプ (テキスト、整数など)" + +#: extras/forms/bulk_import.py:44 extras/forms/filtersets.py:48 +#: extras/forms/filtersets.py:259 extras/forms/model_forms.py:47 +#: extras/forms/model_forms.py:221 tenancy/forms/filtersets.py:91 +msgid "Object type" +msgstr "オブジェクトタイプ" + +#: extras/forms/bulk_import.py:47 +msgid "Object type (for object or multi-object fields)" +msgstr "オブジェクトタイプ (オブジェクトフィールドまたはマルチオブジェクトフィールド用)" + +#: extras/forms/bulk_import.py:50 extras/forms/filtersets.py:73 +msgid "Choice set" +msgstr "チョイスセット" + +#: extras/forms/bulk_import.py:54 +msgid "Choice set (for selection fields)" +msgstr "選択肢セット (選択フィールド用)" + +#: extras/forms/bulk_import.py:60 +msgid "Whether the custom field is displayed in the UI" +msgstr "カスタムフィールドが UI に表示されるかどうか" + +#: extras/forms/bulk_import.py:66 +msgid "Whether the custom field is editable in the UI" +msgstr "カスタムフィールドが UI で編集可能かどうか" + +#: extras/forms/bulk_import.py:82 +msgid "The base set of predefined choices to use (if any)" +msgstr "使用する定義済みの選択肢の基本セット (存在する場合)" + +#: extras/forms/bulk_import.py:88 +msgid "" +"Quoted string of comma-separated field choices with optional labels " +"separated by colon: \"choice1:First Choice,choice2:Second Choice\"" +msgstr "カンマで区切られたフィールド選択肢とコロンで区切られたオプションのラベルを引用符で囲んだ文字列:「選択肢1:第一選択、選択肢2:第二選択」" + +#: extras/forms/bulk_import.py:182 +msgid "Action object" +msgstr "アクションオブジェクト" + +#: extras/forms/bulk_import.py:184 +msgid "Webhook name or script as dotted path module.Class" +msgstr "ドットパス形式のウェブフック名またはスクリプト module.Class" + +#: extras/forms/bulk_import.py:236 +msgid "Assigned object type" +msgstr "割り当てられたオブジェクトタイプ" + +#: extras/forms/bulk_import.py:241 +msgid "The classification of entry" +msgstr "エントリーの分類" + +#: extras/forms/filtersets.py:53 +msgid "Field type" +msgstr "フィールドタイプ" + +#: extras/forms/filtersets.py:97 extras/tables/tables.py:65 +#: templates/generic/bulk_import.html:148 +msgid "Choices" +msgstr "選択肢" + +#: extras/forms/filtersets.py:141 extras/forms/filtersets.py:327 +#: extras/forms/filtersets.py:417 extras/forms/model_forms.py:456 +#: templates/core/job.html:86 templates/extras/configcontext.html:86 +#: templates/extras/eventrule.html:111 +msgid "Data" +msgstr "[データ]" + +#: extras/forms/filtersets.py:152 extras/forms/filtersets.py:341 +#: extras/forms/filtersets.py:427 utilities/choices.py:219 +#: utilities/forms/bulk_import.py:27 +msgid "Data file" +msgstr "データファイル" + +#: extras/forms/filtersets.py:185 +msgid "Content type" +msgstr "コンテンツタイプ" + +#: extras/forms/filtersets.py:232 extras/models/models.py:209 +msgid "HTTP content type" +msgstr "HTTP コンテンツタイプ" + +#: extras/forms/filtersets.py:254 extras/forms/model_forms.py:269 +#: templates/extras/eventrule.html:46 +msgid "Events" +msgstr "[イベント]" + +#: extras/forms/filtersets.py:264 +msgid "Action type" +msgstr "アクションタイプ" + +#: extras/forms/filtersets.py:278 +msgid "Object creations" +msgstr "オブジェクト作成" + +#: extras/forms/filtersets.py:285 +msgid "Object updates" +msgstr "オブジェクト更新" + +#: extras/forms/filtersets.py:292 +msgid "Object deletions" +msgstr "オブジェクト削除" + +#: extras/forms/filtersets.py:299 +msgid "Job starts" +msgstr "ジョブ開始" + +#: extras/forms/filtersets.py:306 extras/forms/model_forms.py:288 +msgid "Job terminations" +msgstr "ジョブの終了" + +#: extras/forms/filtersets.py:315 +msgid "Tagged object type" +msgstr "タグ付きオブジェクトタイプ" + +#: extras/forms/filtersets.py:320 +msgid "Allowed object type" +msgstr "許可されるオブジェクトタイプ" + +#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:391 +#: netbox/navigation/menu.py:19 +msgid "Regions" +msgstr "リージョン" + +#: extras/forms/filtersets.py:354 extras/forms/model_forms.py:396 +msgid "Site groups" +msgstr "サイトグループ" + +#: extras/forms/filtersets.py:364 extras/forms/model_forms.py:406 +#: netbox/navigation/menu.py:21 +msgid "Locations" +msgstr "ロケーション" + +#: extras/forms/filtersets.py:369 extras/forms/model_forms.py:411 +msgid "Device types" +msgstr "デバイスタイプ" + +#: extras/forms/filtersets.py:374 extras/forms/model_forms.py:416 +msgid "Roles" +msgstr "役割" + +#: extras/forms/filtersets.py:384 extras/forms/model_forms.py:426 +msgid "Cluster types" +msgstr "クラスタータイプ" + +#: extras/forms/filtersets.py:390 extras/forms/model_forms.py:431 +msgid "Cluster groups" +msgstr "クラスターグループ" + +#: extras/forms/filtersets.py:395 extras/forms/model_forms.py:436 +#: netbox/navigation/menu.py:243 netbox/navigation/menu.py:245 +#: templates/virtualization/clustertype.html:33 +#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +msgid "Clusters" +msgstr "クラスタ" + +#: extras/forms/filtersets.py:400 extras/forms/model_forms.py:441 +msgid "Tenant groups" +msgstr "テナントグループ" + +#: extras/forms/filtersets.py:454 extras/forms/filtersets.py:495 +msgid "After" +msgstr "後" + +#: extras/forms/filtersets.py:459 extras/forms/filtersets.py:500 +msgid "Before" +msgstr "変更前" + +#: extras/forms/filtersets.py:490 extras/tables/tables.py:431 +#: templates/extras/htmx/report_result.html:43 +#: templates/extras/objectchange.html:34 +msgid "Time" +msgstr "時間" + +#: extras/forms/filtersets.py:504 extras/forms/model_forms.py:271 +#: extras/tables/tables.py:445 templates/extras/eventrule.html:90 +#: templates/extras/objectchange.html:50 +msgid "Action" +msgstr "アクション" + +#: extras/forms/model_forms.py:50 +msgid "Type of the related object (for object/multi-object fields only)" +msgstr "関連オブジェクトのタイプ (オブジェクト/マルチオブジェクトフィールドのみ)" + +#: extras/forms/model_forms.py:58 templates/extras/customfield.html:11 +msgid "Custom Field" +msgstr "カスタムフィールド" + +#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +msgid "Behavior" +msgstr "動作" + +#: extras/forms/model_forms.py:62 +msgid "Values" +msgstr "価値" + +#: extras/forms/model_forms.py:71 +msgid "" +"The type of data stored in this field. For object/multi-object fields, " +"select the related object type below." +msgstr "" +"このフィールドに保存されているデータのタイプ。オブジェクト/マルチオブジェクトフィールドの場合は、関連するオブジェクトタイプを以下から選択してください。" + +#: extras/forms/model_forms.py:74 +msgid "" +"This will be displayed as help text for the form field. Markdown is " +"supported." +msgstr "これはフォームフィールドのヘルプテキストとして表示されます。Markdown はサポートされています。" + +#: extras/forms/model_forms.py:91 +msgid "" +"Enter one choice per line. An optional label may be specified for each " +"choice by appending it with a colon. Example:" +msgstr "1 行に 1 つの選択肢を入力します。各選択肢にコロンを付けることでオプションのラベルを指定できます。例:" + +#: extras/forms/model_forms.py:132 templates/extras/customlink.html:10 +msgid "Custom Link" +msgstr "カスタムリンク" + +#: extras/forms/model_forms.py:133 +msgid "Templates" +msgstr "[テンプレート]" + +#: extras/forms/model_forms.py:145 +msgid "" +"Jinja2 template code for the link text. Reference the object as {{ " +"object }}. Links which render as empty text will not be displayed." +msgstr "" + +#: extras/forms/model_forms.py:148 +msgid "" +"Jinja2 template code for the link URL. Reference the object as {{ " +"object }}." +msgstr "" + +#: extras/forms/model_forms.py:158 extras/forms/model_forms.py:507 +msgid "Template code" +msgstr "テンプレートコード" + +#: extras/forms/model_forms.py:164 templates/extras/exporttemplate.html:17 +msgid "Export Template" +msgstr "テンプレートをエクスポート" + +#: extras/forms/model_forms.py:166 +msgid "Rendering" +msgstr "レンダリング" + +#: extras/forms/model_forms.py:180 extras/forms/model_forms.py:532 +msgid "Template content is populated from the remote source selected below." +msgstr "テンプレートコンテンツは、以下で選択したリモートソースから入力されます。" + +#: extras/forms/model_forms.py:187 extras/forms/model_forms.py:539 +msgid "Must specify either local content or a data file" +msgstr "ローカルコンテンツまたはデータファイルのいずれかを指定する必要があります" + +#: extras/forms/model_forms.py:201 netbox/forms/mixins.py:68 +#: templates/extras/savedfilter.html:10 +msgid "Saved Filter" +msgstr "保存済みフィルター" + +#: extras/forms/model_forms.py:234 templates/extras/webhook.html:28 +msgid "HTTP Request" +msgstr "HTTP リクエスト" + +#: extras/forms/model_forms.py:237 templates/extras/webhook.html:53 +msgid "SSL" +msgstr "SSL" + +#: extras/forms/model_forms.py:255 +msgid "Action choice" +msgstr "アクション選択" + +#: extras/forms/model_forms.py:260 +msgid "Enter conditions in JSON format." +msgstr "に条件を入力 JSON フォーマット。" + +#: extras/forms/model_forms.py:264 +msgid "" +"Enter parameters to pass to the action in JSON format." +msgstr "アクションに渡すパラメータを入力してください JSON フォーマット。" + +#: extras/forms/model_forms.py:268 templates/extras/eventrule.html:11 +msgid "Event Rule" +msgstr "イベントルール" + +#: extras/forms/model_forms.py:270 templates/extras/eventrule.html:78 +msgid "Conditions" +msgstr "条件" + +#: extras/forms/model_forms.py:284 +msgid "Creations" +msgstr "クリエーション" + +#: extras/forms/model_forms.py:285 +msgid "Updates" +msgstr "アップデート" + +#: extras/forms/model_forms.py:286 +msgid "Deletions" +msgstr "削除" + +#: extras/forms/model_forms.py:287 +msgid "Job executions" +msgstr "ジョブの実行" + +#: extras/forms/model_forms.py:373 users/forms/model_forms.py:286 +msgid "Object types" +msgstr "オブジェクトタイプ" + +#: extras/forms/model_forms.py:446 netbox/navigation/menu.py:40 +#: tenancy/tables/tenants.py:22 +msgid "Tenants" +msgstr "テナント" + +#: extras/forms/model_forms.py:463 ipam/forms/filtersets.py:141 +#: ipam/forms/filtersets.py:527 templates/extras/configcontext.html:62 +#: templates/ipam/ipaddress.html:62 templates/ipam/vlan_edit.html:30 +#: tenancy/forms/filtersets.py:86 users/forms/model_forms.py:324 +msgid "Assignment" +msgstr "アサイメント" + +#: extras/forms/model_forms.py:489 +msgid "Data is populated from the remote source selected below." +msgstr "データは、以下で選択したリモートソースから入力されます。" + +#: extras/forms/model_forms.py:495 +msgid "Must specify either local data or a data file" +msgstr "ローカルデータまたはデータファイルのいずれかを指定する必要があります" + +#: extras/forms/model_forms.py:514 templates/core/datafile.html:65 +msgid "Content" +msgstr "[コンテンツ]" + +#: extras/forms/reports.py:18 extras/forms/scripts.py:24 +msgid "Schedule at" +msgstr "のスケジュール" + +#: extras/forms/reports.py:19 +msgid "Schedule execution of report to a set time" +msgstr "レポートの実行を設定された時間にスケジュールする" + +#: extras/forms/reports.py:24 extras/forms/scripts.py:30 +msgid "Recurs every" +msgstr "毎回繰り返す" + +#: extras/forms/reports.py:28 +msgid "Interval at which this report is re-run (in minutes)" +msgstr "このレポートが再実行される間隔 (分単位)" + +#: extras/forms/reports.py:36 extras/forms/scripts.py:42 +#, python-brace-format +msgid " (current time: {now})" +msgstr " (現在の時刻: {now})" + +#: extras/forms/reports.py:46 extras/forms/scripts.py:52 +msgid "Scheduled time must be in the future." +msgstr "予定時刻は将来の時刻でなければなりません。" + +#: extras/forms/scripts.py:18 +msgid "Commit changes" +msgstr "変更をコミット" + +#: extras/forms/scripts.py:19 +msgid "Commit changes to the database (uncheck for a dry-run)" +msgstr "変更をデータベースにコミットする (ドライランの場合はチェックを外す)" + +#: extras/forms/scripts.py:25 +msgid "Schedule execution of script to a set time" +msgstr "設定した時間にスクリプトの実行をスケジュールする" + +#: extras/forms/scripts.py:34 +msgid "Interval at which this script is re-run (in minutes)" +msgstr "このスクリプトが再実行される間隔 (分単位)" + +#: extras/models/change_logging.py:24 +msgid "time" +msgstr "時間" + +#: extras/models/change_logging.py:37 +msgid "user name" +msgstr "ユーザー名" + +#: extras/models/change_logging.py:42 +msgid "request ID" +msgstr "リクエスト ID" + +#: extras/models/change_logging.py:47 extras/models/staging.py:69 +msgid "action" +msgstr "アクション" + +#: extras/models/change_logging.py:81 +msgid "pre-change data" +msgstr "変更前データ" + +#: extras/models/change_logging.py:87 +msgid "post-change data" +msgstr "変更後のデータ" + +#: extras/models/change_logging.py:101 +msgid "object change" +msgstr "オブジェクト変更" + +#: extras/models/change_logging.py:102 +msgid "object changes" +msgstr "オブジェクトの変更" + +#: extras/models/change_logging.py:118 +#, python-brace-format +msgid "Change logging is not supported for this object type ({type})." +msgstr "このオブジェクトタイプでは変更ログはサポートされていません ({type})。" + +#: extras/models/configs.py:130 +msgid "config context" +msgstr "コンフィグコンテキスト" + +#: extras/models/configs.py:131 +msgid "config contexts" +msgstr "設定コンテキスト" + +#: extras/models/configs.py:149 extras/models/configs.py:205 +msgid "JSON data must be in object form. Example:" +msgstr "JSON データはオブジェクト形式である必要があります。例:" + +#: extras/models/configs.py:169 +msgid "" +"Local config context data takes precedence over source contexts in the final" +" rendered config context" +msgstr "ローカル構成コンテキストデータは、最終的にレンダリングされた構成コンテキストのソースコンテキストよりも優先されます" + +#: extras/models/configs.py:224 +msgid "template code" +msgstr "テンプレートコード" + +#: extras/models/configs.py:225 +msgid "Jinja2 template code." +msgstr "Jinja2 テンプレートコード。" + +#: extras/models/configs.py:228 +msgid "environment parameters" +msgstr "環境パラメーター" + +#: extras/models/configs.py:233 +msgid "" +"Any additional" +" parameters to pass when constructing the Jinja2 environment." +msgstr "" +"任意 追加パラメーター" +" Jinja2 環境を構築するときに渡されます。" + +#: extras/models/configs.py:240 +msgid "config template" +msgstr "設定テンプレート" + +#: extras/models/configs.py:241 +msgid "config templates" +msgstr "設定テンプレート" + +#: extras/models/customfields.py:72 +msgid "The object(s) to which this field applies." +msgstr "このフィールドが適用されるオブジェクト。" + +#: extras/models/customfields.py:79 +msgid "The type of data this custom field holds" +msgstr "このカスタムフィールドが保持するデータのタイプ" + +#: extras/models/customfields.py:86 +msgid "The type of NetBox object this field maps to (for object fields)" +msgstr "このフィールドがマップされる NetBox オブジェクトのタイプ (オブジェクトフィールド用)" + +#: extras/models/customfields.py:92 +msgid "Internal field name" +msgstr "内部フィールド名" + +#: extras/models/customfields.py:96 +msgid "Only alphanumeric characters and underscores are allowed." +msgstr "英数字とアンダースコアのみを使用できます。" + +#: extras/models/customfields.py:101 +msgid "Double underscores are not permitted in custom field names." +msgstr "カスタムフィールド名には二重アンダースコアを使用できません。" + +#: extras/models/customfields.py:112 +msgid "" +"Name of the field as displayed to users (if not provided, 'the field's name " +"will be used)" +msgstr "ユーザーに表示されるフィールドの名前 (指定しない場合は、「フィールドの名前が使用されます)」" + +#: extras/models/customfields.py:116 extras/models/models.py:347 +msgid "group name" +msgstr "グループ名" + +#: extras/models/customfields.py:119 +msgid "Custom fields within the same group will be displayed together" +msgstr "同じグループ内のカスタムフィールドは一緒に表示されます" + +#: extras/models/customfields.py:127 +msgid "required" +msgstr "必須" + +#: extras/models/customfields.py:129 +msgid "" +"If true, this field is required when creating new objects or editing an " +"existing object." +msgstr "true の場合、新しいオブジェクトを作成したり、既存のオブジェクトを編集したりするときに、このフィールドは必須です。" + +#: extras/models/customfields.py:132 +msgid "search weight" +msgstr "検索ウェイト" + +#: extras/models/customfields.py:135 +msgid "" +"Weighting for search. Lower values are considered more important. Fields " +"with a search weight of zero will be ignored." +msgstr "検索用の重み付け。値が小さいほど重要であると見なされます。検索ウェイトが 0 のフィールドは無視されます。" + +#: extras/models/customfields.py:140 +msgid "filter logic" +msgstr "フィルターロジック" + +#: extras/models/customfields.py:144 +msgid "" +"Loose matches any instance of a given string; exact matches the entire " +"field." +msgstr "Loose は指定した文字列の任意のインスタンスと一致し、exact はフィールド全体と一致します。" + +#: extras/models/customfields.py:147 +msgid "default" +msgstr "デフォルト" + +#: extras/models/customfields.py:151 +msgid "" +"Default value for the field (must be a JSON value). Encapsulate strings with" +" double quotes (e.g. \"Foo\")." +msgstr "フィールドのデフォルト値 (JSON 値である必要があります)。文字列を二重引用符で囲みます (例:「Foo」)。" + +#: extras/models/customfields.py:156 +msgid "display weight" +msgstr "ディスプレイ重量" + +#: extras/models/customfields.py:157 +msgid "Fields with higher weights appear lower in a form." +msgstr "重みが大きいフィールドは、フォームの下位に表示されます。" + +#: extras/models/customfields.py:162 +msgid "minimum value" +msgstr "最小値" + +#: extras/models/customfields.py:163 +msgid "Minimum allowed value (for numeric fields)" +msgstr "最小許容値 (数値フィールド用)" + +#: extras/models/customfields.py:168 +msgid "maximum value" +msgstr "最大値" + +#: extras/models/customfields.py:169 +msgid "Maximum allowed value (for numeric fields)" +msgstr "最大許容値 (数値フィールド用)" + +#: extras/models/customfields.py:175 +msgid "validation regex" +msgstr "検証正規表現" + +#: extras/models/customfields.py:177 +#, python-brace-format +msgid "" +"Regular expression to enforce on text field values. Use ^ and $ to force " +"matching of entire string. For example, ^[A-Z]{3}$ will limit " +"values to exactly three uppercase letters." +msgstr "" +"テキストフィールド値に適用する正規表現。^ と $ を使用して文字列全体を強制的に一致させます。例えば、 ^ " +"[アルファベット順]{3}$ 値をちょうど 3 文字の大文字に制限します。" + +#: extras/models/customfields.py:185 +msgid "choice set" +msgstr "チョイスセット" + +#: extras/models/customfields.py:194 +msgid "Specifies whether the custom field is displayed in the UI" +msgstr "カスタムフィールドを UI に表示するかどうかを指定します" + +#: extras/models/customfields.py:201 +msgid "Specifies whether the custom field value can be edited in the UI" +msgstr "カスタムフィールド値を UI で編集できるかどうかを指定します" + +#: extras/models/customfields.py:205 +msgid "is cloneable" +msgstr "クローン可能" + +#: extras/models/customfields.py:206 +msgid "Replicate this value when cloning objects" +msgstr "オブジェクトのクローニング時にこの値を複製する" + +#: extras/models/customfields.py:219 +msgid "custom field" +msgstr "カスタムフィールド" + +#: extras/models/customfields.py:220 +msgid "custom fields" +msgstr "カスタムフィールド" + +#: extras/models/customfields.py:309 +#, python-brace-format +msgid "Invalid default value \"{value}\": {error}" +msgstr "デフォルト値が無効です」{value}「: {error}" + +#: extras/models/customfields.py:316 +msgid "A minimum value may be set only for numeric fields" +msgstr "最小値は数値フィールドにのみ設定できます" + +#: extras/models/customfields.py:318 +msgid "A maximum value may be set only for numeric fields" +msgstr "最大値は数値フィールドにのみ設定できます" + +#: extras/models/customfields.py:328 +msgid "" +"Regular expression validation is supported only for text and URL fields" +msgstr "正規表現の検証は、テキストフィールドと URL フィールドでのみサポートされます。" + +#: extras/models/customfields.py:338 +msgid "Selection fields must specify a set of choices." +msgstr "選択フィールドには選択肢のセットを指定する必要があります。" + +#: extras/models/customfields.py:342 +msgid "Choices may be set only on selection fields." +msgstr "選択肢は選択フィールドにのみ設定できます。" + +#: extras/models/customfields.py:349 +msgid "Object fields must define an object type." +msgstr "オブジェクトフィールドはオブジェクトタイプを定義する必要があります。" + +#: extras/models/customfields.py:354 +#, python-brace-format +msgid "{type} fields may not define an object type." +msgstr "{type} フィールドはオブジェクトタイプを定義できません。" + +#: extras/models/customfields.py:434 +msgid "True" +msgstr "本当" + +#: extras/models/customfields.py:435 +msgid "False" +msgstr "偽" + +#: extras/models/customfields.py:517 +#, python-brace-format +msgid "Values must match this regex: {regex}" +msgstr "値は次の正規表現と一致する必要があります。 {regex}" + +#: extras/models/customfields.py:611 +msgid "Value must be a string." +msgstr "値は文字列でなければなりません。" + +#: extras/models/customfields.py:613 +#, python-brace-format +msgid "Value must match regex '{regex}'" +msgstr "値は正規表現 'と一致する必要があります{regex}'" + +#: extras/models/customfields.py:618 +msgid "Value must be an integer." +msgstr "値は整数でなければなりません。" + +#: extras/models/customfields.py:621 extras/models/customfields.py:636 +#, python-brace-format +msgid "Value must be at least {minimum}" +msgstr "値は少なくとも次の値でなければなりません {minimum}" + +#: extras/models/customfields.py:625 extras/models/customfields.py:640 +#, python-brace-format +msgid "Value must not exceed {maximum}" +msgstr "値を超えてはいけません {maximum}" + +#: extras/models/customfields.py:633 +msgid "Value must be a decimal." +msgstr "値は10進数でなければなりません。" + +#: extras/models/customfields.py:645 +msgid "Value must be true or false." +msgstr "値は true または false でなければなりません。" + +#: extras/models/customfields.py:653 +msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." +msgstr "日付値は ISO 8601 フォーマット (YYYY-MM-DD) である必要があります。" + +#: extras/models/customfields.py:662 +msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." +msgstr "日付と時刻の値は ISO 8601 フォーマット (YYYY-MM-DD HH: MM: SS) である必要があります。" + +#: extras/models/customfields.py:669 +#, python-brace-format +msgid "Invalid choice ({value}) for choice set {choiceset}." +msgstr "選択が無効です ({value}) チョイスセット用 {choiceset}。" + +#: extras/models/customfields.py:679 +#, python-brace-format +msgid "Invalid choice(s) ({value}) for choice set {choiceset}." +msgstr "選択が無効です ({value}) チョイスセット用 {choiceset}。" + +#: extras/models/customfields.py:688 +#, python-brace-format +msgid "Value must be an object ID, not {type}" +msgstr "値はオブジェクトIDでなければならず、そうではありません {type}" + +#: extras/models/customfields.py:694 +#, python-brace-format +msgid "Value must be a list of object IDs, not {type}" +msgstr "値はオブジェクト ID のリストでなければならず、そうではありません {type}" + +#: extras/models/customfields.py:698 +#, python-brace-format +msgid "Found invalid object ID: {id}" +msgstr "無効なオブジェクト ID が見つかりました: {id}" + +#: extras/models/customfields.py:701 +msgid "Required field cannot be empty." +msgstr "必須フィールドを空にすることはできません。" + +#: extras/models/customfields.py:720 +msgid "Base set of predefined choices (optional)" +msgstr "定義済みの選択肢の基本セット (オプション)" + +#: extras/models/customfields.py:732 +msgid "Choices are automatically ordered alphabetically" +msgstr "選択肢は自動的にアルファベット順に並べられます" + +#: extras/models/customfields.py:739 +msgid "custom field choice set" +msgstr "カスタムフィールド選択セット" + +#: extras/models/customfields.py:740 +msgid "custom field choice sets" +msgstr "カスタムフィールド選択セット" + +#: extras/models/customfields.py:776 +msgid "Must define base or extra choices." +msgstr "基本選択肢または追加選択肢を定義する必要があります。" + +#: extras/models/dashboard.py:19 +msgid "layout" +msgstr "レイアウト" + +#: extras/models/dashboard.py:23 +msgid "config" +msgstr "設定する" + +#: extras/models/dashboard.py:28 +msgid "dashboard" +msgstr "ダッシュボード" + +#: extras/models/dashboard.py:29 +msgid "dashboards" +msgstr "ダッシュボード" + +#: extras/models/models.py:49 +msgid "object types" +msgstr "オブジェクトタイプ" + +#: extras/models/models.py:50 +msgid "The object(s) to which this rule applies." +msgstr "このルールが適用されるオブジェクト。" + +#: extras/models/models.py:63 +msgid "on create" +msgstr "作成時" + +#: extras/models/models.py:65 +msgid "Triggers when a matching object is created." +msgstr "一致するオブジェクトが作成されたときにトリガーされます。" + +#: extras/models/models.py:68 +msgid "on update" +msgstr "更新時" + +#: extras/models/models.py:70 +msgid "Triggers when a matching object is updated." +msgstr "一致するオブジェクトが更新されるとトリガーされます。" + +#: extras/models/models.py:73 +msgid "on delete" +msgstr "削除時" + +#: extras/models/models.py:75 +msgid "Triggers when a matching object is deleted." +msgstr "一致するオブジェクトが削除されたときにトリガーされます。" + +#: extras/models/models.py:78 +msgid "on job start" +msgstr "ジョブ開始時" + +#: extras/models/models.py:80 +msgid "Triggers when a job for a matching object is started." +msgstr "一致するオブジェクトのジョブが開始されるとトリガーされます。" + +#: extras/models/models.py:83 +msgid "on job end" +msgstr "ジョブ終了時" + +#: extras/models/models.py:85 +msgid "Triggers when a job for a matching object terminates." +msgstr "一致するオブジェクトのジョブが終了するとトリガーされます。" + +#: extras/models/models.py:92 +msgid "conditions" +msgstr "条件" + +#: extras/models/models.py:95 +msgid "" +"A set of conditions which determine whether the event will be generated." +msgstr "イベントを生成するかどうかを決定する一連の条件。" + +#: extras/models/models.py:103 +msgid "action type" +msgstr "アクションタイプ" + +#: extras/models/models.py:126 +msgid "Additional data to pass to the action object" +msgstr "アクションオブジェクトに渡す追加データ" + +#: extras/models/models.py:138 +msgid "event rule" +msgstr "イベントルール" + +#: extras/models/models.py:139 +msgid "event rules" +msgstr "イベントルール" + +#: extras/models/models.py:155 +msgid "" +"At least one event type must be selected: create, update, delete, job start," +" and/or job end." +msgstr "少なくとも 1 つのイベントタイプ (作成、更新、削除、ジョブの開始、ジョブの終了) を選択する必要があります。" + +#: extras/models/models.py:196 +msgid "" +"This URL will be called using the HTTP method defined when the webhook is " +"called. Jinja2 template processing is supported with the same context as the" +" request body." +msgstr "" +"この URL は、Webhook が呼び出されたときに定義された HTTP メソッドを使用して呼び出されます。Jinja2 " +"テンプレート処理はリクエストボディと同じコンテキストでサポートされています。" + +#: extras/models/models.py:211 +msgid "" +"The complete list of official content types is available here." +msgstr "" +"公式コンテンツタイプの完全なリストが利用可能です ここに。" + +#: extras/models/models.py:216 +msgid "additional headers" +msgstr "追加ヘッダー" + +#: extras/models/models.py:219 +msgid "" +"User-supplied HTTP headers to be sent with the request in addition to the " +"HTTP content type. Headers should be defined in the format Name: " +"Value. Jinja2 template processing is supported with the same context " +"as the request body (below)." +msgstr "" +"HTTP コンテンツタイプに加えて、リクエストとともに送信されるユーザー指定の HTTP ヘッダー。ヘッダーは次の形式で定義する必要があります。 " +"名前:値。Jinja2 テンプレート処理はリクエストボディ (下記) と同じコンテキストでサポートされています。" + +#: extras/models/models.py:225 +msgid "body template" +msgstr "ボディテンプレート" + +#: extras/models/models.py:228 +msgid "" +"Jinja2 template for a custom request body. If blank, a JSON object " +"representing the change will be included. Available context data includes: " +"event, model, timestamp, " +"username, request_id, and data." +msgstr "" +"カスタムリクエストボディ用の Jinja2 テンプレート。空欄の場合は、変更を表す JSON " +"オブジェクトが含まれます。利用可能なコンテキストデータには以下が含まれます。 出来事、 " +"タイムスタンプユーザー名リクエスト ID、および " +"データ。" + +#: extras/models/models.py:234 +msgid "secret" +msgstr "秘密" + +#: extras/models/models.py:238 +msgid "" +"When provided, the request will include a X-Hook-Signature " +"header containing a HMAC hex digest of the payload body using the secret as " +"the key. The secret is not transmitted in the request." +msgstr "" +"提供された場合、リクエストには以下が含まれます X フック-シグネチャー シークレットをキーとして使用したペイロード本体の " +"HMAC 16 進ダイジェストを含むヘッダー。シークレットはリクエストでは送信されません。" + +#: extras/models/models.py:245 +msgid "Enable SSL certificate verification. Disable with caution!" +msgstr "SSL 証明書検証を有効にします。注意して無効にしてください。" + +#: extras/models/models.py:251 templates/extras/webhook.html:62 +msgid "CA File Path" +msgstr "CA ファイルパス" + +#: extras/models/models.py:253 +msgid "" +"The specific CA certificate file to use for SSL verification. Leave blank to" +" use the system defaults." +msgstr "SSL 検証に使用する特定の CA 証明書ファイル。システムデフォルトを使用するには空白のままにしておきます。" + +#: extras/models/models.py:264 +msgid "webhook" +msgstr "ウェブフック" + +#: extras/models/models.py:265 +msgid "webhooks" +msgstr "ウェブフック" + +#: extras/models/models.py:283 +msgid "Do not specify a CA certificate file if SSL verification is disabled." +msgstr "SSL 検証が無効になっている場合は、CA 証明書ファイルを指定しないでください。" + +#: extras/models/models.py:323 +msgid "The object type(s) to which this link applies." +msgstr "このリンクが適用されるオブジェクトタイプ。" + +#: extras/models/models.py:335 +msgid "link text" +msgstr "リンクテキスト" + +#: extras/models/models.py:336 +msgid "Jinja2 template code for link text" +msgstr "リンクテキストの Jinja2 テンプレートコード" + +#: extras/models/models.py:339 +msgid "link URL" +msgstr "リンク URL" + +#: extras/models/models.py:340 +msgid "Jinja2 template code for link URL" +msgstr "リンク URL の Jinja2 テンプレートコード" + +#: extras/models/models.py:350 +msgid "Links with the same group will appear as a dropdown menu" +msgstr "同じグループのリンクはドロップダウンメニューとして表示されます" + +#: extras/models/models.py:353 +msgid "button class" +msgstr "ボタンクラス" + +#: extras/models/models.py:357 +msgid "" +"The class of the first link in a group will be used for the dropdown button" +msgstr "グループ内の最初のリンクのクラスがドロップダウンボタンに使用されます" + +#: extras/models/models.py:360 +msgid "new window" +msgstr "新しいウィンドウ" + +#: extras/models/models.py:362 +msgid "Force link to open in a new window" +msgstr "リンクを強制的に新しいウィンドウで開く" + +#: extras/models/models.py:371 +msgid "custom link" +msgstr "カスタムリンク" + +#: extras/models/models.py:372 +msgid "custom links" +msgstr "カスタムリンク" + +#: extras/models/models.py:419 +msgid "The object type(s) to which this template applies." +msgstr "このテンプレートが適用されるオブジェクトタイプ。" + +#: extras/models/models.py:432 +msgid "" +"Jinja2 template code. The list of objects being exported is passed as a " +"context variable named queryset." +msgstr "" +"Jinja2 テンプレートコード。エクスポートされるオブジェクトのリストは、という名前のコンテキスト変数として渡されます。 " +"クエリーセット。" + +#: extras/models/models.py:440 +msgid "Defaults to text/plain; charset=utf-8" +msgstr "デフォルトは テキスト/プレーン; 文字セット=utf-8" + +#: extras/models/models.py:443 +msgid "file extension" +msgstr "ファイル拡張子" + +#: extras/models/models.py:446 +msgid "Extension to append to the rendered filename" +msgstr "レンダリングされたファイル名に追加する拡張子" + +#: extras/models/models.py:449 +msgid "as attachment" +msgstr "添付ファイルとして" + +#: extras/models/models.py:451 +msgid "Download file as attachment" +msgstr "ファイルを添付ファイルとしてダウンロード" + +#: extras/models/models.py:460 +msgid "export template" +msgstr "テンプレートをエクスポート" + +#: extras/models/models.py:461 +msgid "export templates" +msgstr "テンプレートをエクスポートする" + +#: extras/models/models.py:478 +#, python-brace-format +msgid "\"{name}\" is a reserved name. Please choose a different name." +msgstr "「{name}「は予約名です。別の名前を選択してください。" + +#: extras/models/models.py:528 +msgid "The object type(s) to which this filter applies." +msgstr "このフィルターが適用されるオブジェクトタイプ。" + +#: extras/models/models.py:560 +msgid "shared" +msgstr "共有した" + +#: extras/models/models.py:573 +msgid "saved filter" +msgstr "保存済みフィルター" + +#: extras/models/models.py:574 +msgid "saved filters" +msgstr "保存済みフィルター" + +#: extras/models/models.py:592 +msgid "Filter parameters must be stored as a dictionary of keyword arguments." +msgstr "フィルターパラメーターは、キーワード引数の辞書として保存する必要があります。" + +#: extras/models/models.py:620 +msgid "image height" +msgstr "画像の高さ" + +#: extras/models/models.py:623 +msgid "image width" +msgstr "画像幅" + +#: extras/models/models.py:640 +msgid "image attachment" +msgstr "画像添付" + +#: extras/models/models.py:641 +msgid "image attachments" +msgstr "画像添付ファイル" + +#: extras/models/models.py:655 +#, python-brace-format +msgid "Image attachments cannot be assigned to this object type ({type})." +msgstr "このオブジェクトタイプにはイメージ添付ファイルを割り当てることができません ({type})。" + +#: extras/models/models.py:718 +msgid "kind" +msgstr "種類" + +#: extras/models/models.py:732 +msgid "journal entry" +msgstr "ジャーナルエントリ" + +#: extras/models/models.py:733 +msgid "journal entries" +msgstr "ジャーナルエントリ" + +#: extras/models/models.py:748 +#, python-brace-format +msgid "Journaling is not supported for this object type ({type})." +msgstr "このオブジェクトタイプではジャーナリングはサポートされていません ({type})。" + +#: extras/models/models.py:790 +msgid "bookmark" +msgstr "ブックマーク" + +#: extras/models/models.py:791 +msgid "bookmarks" +msgstr "ブックマーク" + +#: extras/models/models.py:804 +#, python-brace-format +msgid "Bookmarks cannot be assigned to this object type ({type})." +msgstr "このオブジェクトタイプにはブックマークを割り当てられません ({type})。" + +#: extras/models/reports.py:46 +msgid "report module" +msgstr "レポートモジュール" + +#: extras/models/reports.py:47 +msgid "report modules" +msgstr "レポートモジュール" + +#: extras/models/scripts.py:46 +msgid "script module" +msgstr "スクリプトモジュール" + +#: extras/models/scripts.py:47 +msgid "script modules" +msgstr "スクリプトモジュール" + +#: extras/models/search.py:24 +msgid "timestamp" +msgstr "タイムスタンプ" + +#: extras/models/search.py:39 +msgid "field" +msgstr "フィールド" + +#: extras/models/search.py:47 +msgid "value" +msgstr "値" + +#: extras/models/search.py:58 +msgid "cached value" +msgstr "キャッシュ値" + +#: extras/models/search.py:59 +msgid "cached values" +msgstr "キャッシュされた値" + +#: extras/models/staging.py:44 +msgid "branch" +msgstr "ブランチ" + +#: extras/models/staging.py:45 +msgid "branches" +msgstr "枝" + +#: extras/models/staging.py:97 +msgid "staged change" +msgstr "段階的変更" + +#: extras/models/staging.py:98 +msgid "staged changes" +msgstr "段階的な変更" + +#: extras/models/tags.py:40 +msgid "The object type(s) to which this this tag can be applied." +msgstr "このタグを適用できるオブジェクトタイプ。" + +#: extras/models/tags.py:49 +msgid "tag" +msgstr "鬼ごっこ" + +#: extras/models/tags.py:50 +msgid "tags" +msgstr "タグ" + +#: extras/models/tags.py:78 +msgid "tagged item" +msgstr "タグ付きアイテム" + +#: extras/models/tags.py:79 +msgid "tagged items" +msgstr "タグ付きアイテム" + +#: extras/signals.py:220 +#, python-brace-format +msgid "Deletion is prevented by a protection rule: {message}" +msgstr "削除は保護ルールによって禁止されています。 {message}" + +#: extras/tables/tables.py:44 extras/tables/tables.py:119 +#: extras/tables/tables.py:143 extras/tables/tables.py:208 +#: extras/tables/tables.py:285 +msgid "Content Types" +msgstr "コンテンツタイプ" + +#: extras/tables/tables.py:50 +msgid "Visible" +msgstr "可視" + +#: extras/tables/tables.py:53 +msgid "Editable" +msgstr "編集可能" + +#: extras/tables/tables.py:60 templates/extras/customfield.html:48 +msgid "Choice Set" +msgstr "チョイスセット" + +#: extras/tables/tables.py:68 +msgid "Is Cloneable" +msgstr "クローニング可能" + +#: extras/tables/tables.py:98 +msgid "Count" +msgstr "カウント" + +#: extras/tables/tables.py:101 +msgid "Order Alphabetically" +msgstr "アルファベット順に並べる" + +#: extras/tables/tables.py:125 templates/extras/customlink.html:34 +msgid "New Window" +msgstr "[新規ウィンドウ]" + +#: extras/tables/tables.py:146 +msgid "As Attachment" +msgstr "添付ファイルとして" + +#: extras/tables/tables.py:153 extras/tables/tables.py:372 +#: extras/tables/tables.py:407 templates/core/datafile.html:32 +#: templates/dcim/device/render_config.html:23 +#: templates/extras/configcontext.html:40 +#: templates/extras/configtemplate.html:32 +#: templates/extras/exporttemplate.html:51 +#: templates/generic/bulk_import.html:30 +#: templates/virtualization/virtualmachine/render_config.html:23 +msgid "Data File" +msgstr "データファイル" + +#: extras/tables/tables.py:158 extras/tables/tables.py:384 +#: extras/tables/tables.py:412 +msgid "Synced" +msgstr "同期済み" + +#: extras/tables/tables.py:178 +msgid "Content Type" +msgstr "コンテンツタイプ" + +#: extras/tables/tables.py:185 +msgid "Image" +msgstr "[イメージ]" + +#: extras/tables/tables.py:190 +msgid "Size (Bytes)" +msgstr "サイズ (バイト)" + +#: extras/tables/tables.py:233 extras/tables/tables.py:331 +#: templates/extras/customfield.html:96 templates/extras/eventrule.html:32 +#: templates/users/objectpermission.html:68 users/tables.py:83 +msgid "Object Types" +msgstr "オブジェクトタイプ" + +#: extras/tables/tables.py:255 +msgid "SSL Validation" +msgstr "SSL バリデーション" + +#: extras/tables/tables.py:300 +msgid "Job Start" +msgstr "ジョブ開始" + +#: extras/tables/tables.py:303 +msgid "Job End" +msgstr "ジョブ終了" + +#: extras/tables/tables.py:441 templates/account/profile.html:20 +#: templates/users/user.html:22 +msgid "Full Name" +msgstr "フルネーム" + +#: extras/tables/tables.py:458 templates/extras/objectchange.html:72 +msgid "Request ID" +msgstr "リクエスト ID" + +#: extras/tables/tables.py:495 +msgid "Comments (Short)" +msgstr "コメント (ショート)" + +#: extras/validators.py:13 +#, python-format +msgid "Ensure this value is equal to %(limit_value)s." +msgstr "この値が次の値と等しいことを確認してください %(limit_value)s。" + +#: extras/validators.py:24 +#, python-format +msgid "Ensure this value does not equal %(limit_value)s." +msgstr "この値が等しくないことを確認してください %(limit_value)s。" + +#: extras/validators.py:35 +msgid "This field must be empty." +msgstr "このフィールドは空でなければなりません。" + +#: extras/validators.py:50 +msgid "This field must not be empty." +msgstr "このフィールドは空であってはなりません。" + +#: extras/validators.py:119 +#, python-brace-format +msgid "Invalid attribute \"{name}\" for {model}" +msgstr "属性が無効です」{name}「用 {model}" + +#: extras/views.py:880 +msgid "Your dashboard has been reset." +msgstr "ダッシュボードがリセットされました。" + +#: ipam/api/field_serializers.py:17 +msgid "Enter a valid IPv4 or IPv6 address with optional mask." +msgstr "オプションのマスクを使用して有効な IPv4 または IPv6 アドレスを入力します。" + +#: ipam/api/field_serializers.py:24 +#, python-brace-format +msgid "Invalid IP address format: {data}" +msgstr "IP アドレス形式が無効です: {data}" + +#: ipam/api/field_serializers.py:37 +msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." +msgstr "有効な IPv4 または IPv6 プレフィックスとマスクを CIDR 表記で入力します。" + +#: ipam/api/field_serializers.py:44 +#, python-brace-format +msgid "Invalid IP prefix format: {data}" +msgstr "IP プレフィックス形式が無効です: {data}" + +#: ipam/choices.py:30 +msgid "Container" +msgstr "コンテナ" + +#: ipam/choices.py:72 +msgid "DHCP" +msgstr "DHCP" + +#: ipam/choices.py:73 +msgid "SLAAC" +msgstr "スラーク" + +#: ipam/choices.py:89 +msgid "Loopback" +msgstr "ループバック" + +#: ipam/choices.py:90 tenancy/choices.py:18 +msgid "Secondary" +msgstr "セカンダリ" + +#: ipam/choices.py:91 +msgid "Anycast" +msgstr "エニーキャスト" + +#: ipam/choices.py:115 +msgid "Standard" +msgstr "スタンダード" + +#: ipam/choices.py:120 +msgid "CheckPoint" +msgstr "チェックポイント" + +#: ipam/choices.py:123 +msgid "Cisco" +msgstr "シスコ" + +#: ipam/choices.py:137 +msgid "Plaintext" +msgstr "プレーンテキスト" + +#: ipam/filtersets.py:47 vpn/filtersets.py:276 +msgid "Import target" +msgstr "インポート対象" + +#: ipam/filtersets.py:53 vpn/filtersets.py:282 +msgid "Import target (name)" +msgstr "インポート対象 (名前)" + +#: ipam/filtersets.py:58 vpn/filtersets.py:287 +msgid "Export target" +msgstr "エクスポート対象" + +#: ipam/filtersets.py:64 vpn/filtersets.py:293 +msgid "Export target (name)" +msgstr "エクスポート対象 (名前)" + +#: ipam/filtersets.py:85 +msgid "Importing VRF" +msgstr "VRF のインポート" + +#: ipam/filtersets.py:91 +msgid "Import VRF (RD)" +msgstr "VRF (RD) をインポート" + +#: ipam/filtersets.py:96 +msgid "Exporting VRF" +msgstr "VRF のエクスポート" + +#: ipam/filtersets.py:102 +msgid "Export VRF (RD)" +msgstr "VRF (RD) をエクスポート" + +#: ipam/filtersets.py:132 ipam/filtersets.py:247 ipam/forms/model_forms.py:229 +#: ipam/tables/ip.py:211 templates/ipam/prefix.html:12 +msgid "Prefix" +msgstr "プレフィックス" + +#: ipam/filtersets.py:136 ipam/filtersets.py:175 ipam/filtersets.py:198 +msgid "RIR (ID)" +msgstr "リル (アイディー)" + +#: ipam/filtersets.py:142 ipam/filtersets.py:181 ipam/filtersets.py:204 +msgid "RIR (slug)" +msgstr "RIR (スラッグ)" + +#: ipam/filtersets.py:251 +msgid "Within prefix" +msgstr "プレフィックス内" + +#: ipam/filtersets.py:255 +msgid "Within and including prefix" +msgstr "プレフィックス内およびプレフィックスを含む" + +#: ipam/filtersets.py:259 +msgid "Prefixes which contain this prefix or IP" +msgstr "このプレフィックスまたは IP を含むプレフィックス" + +#: ipam/filtersets.py:270 ipam/filtersets.py:538 ipam/forms/bulk_edit.py:326 +#: ipam/forms/filtersets.py:191 ipam/forms/filtersets.py:317 +msgid "Mask length" +msgstr "マスクの長さ" + +#: ipam/filtersets.py:339 vpn/filtersets.py:399 +msgid "VLAN (ID)" +msgstr "VLAN (ID)" + +#: ipam/filtersets.py:343 vpn/filtersets.py:394 +msgid "VLAN number (1-4094)" +msgstr "VLAN 番号 (1-4094)" + +#: ipam/filtersets.py:437 ipam/filtersets.py:441 ipam/filtersets.py:533 +#: ipam/forms/model_forms.py:444 templates/tenancy/contact.html:54 +#: tenancy/forms/bulk_edit.py:112 +msgid "Address" +msgstr "住所" + +#: ipam/filtersets.py:445 +msgid "Ranges which contain this prefix or IP" +msgstr "このプレフィックスまたは IP を含む範囲" + +#: ipam/filtersets.py:473 ipam/filtersets.py:529 +msgid "Parent prefix" +msgstr "親プレフィックス" + +#: ipam/filtersets.py:582 ipam/filtersets.py:812 ipam/filtersets.py:1042 +#: vpn/filtersets.py:357 +msgid "Virtual machine (name)" +msgstr "仮想マシン (名前)" + +#: ipam/filtersets.py:587 ipam/filtersets.py:817 ipam/filtersets.py:1036 +#: virtualization/filtersets.py:278 virtualization/filtersets.py:317 +#: vpn/filtersets.py:362 +msgid "Virtual machine (ID)" +msgstr "仮想マシン (ID)" + +#: ipam/filtersets.py:593 vpn/filtersets.py:97 vpn/filtersets.py:368 +msgid "Interface (name)" +msgstr "インターフェイス (名前)" + +#: ipam/filtersets.py:598 vpn/filtersets.py:102 vpn/filtersets.py:373 +msgid "Interface (ID)" +msgstr "インターフェイス (ID)" + +#: ipam/filtersets.py:604 vpn/filtersets.py:108 vpn/filtersets.py:379 +msgid "VM interface (name)" +msgstr "VM インターフェイス (名前)" + +#: ipam/filtersets.py:609 vpn/filtersets.py:113 +msgid "VM interface (ID)" +msgstr "VM インターフェイス (ID)" + +#: ipam/filtersets.py:614 +msgid "FHRP group (ID)" +msgstr "FHRP グループ (ID)" + +#: ipam/filtersets.py:618 +msgid "Is assigned to an interface" +msgstr "インターフェースに割り当てられている" + +#: ipam/filtersets.py:622 +msgid "Is assigned" +msgstr "割り当てられている" + +#: ipam/filtersets.py:1047 +msgid "IP address (ID)" +msgstr "IP アドレス (ID)" + +#: ipam/filtersets.py:1053 ipam/models/ip.py:787 +msgid "IP address" +msgstr "IP アドレス" + +#: ipam/filtersets.py:1079 +msgid "Primary IPv4 (ID)" +msgstr "プライマリ IPv4 (ID)" + +#: ipam/filtersets.py:1084 +msgid "Primary IPv6 (ID)" +msgstr "プライマリ IPv6 (ID)" + +#: ipam/forms/bulk_create.py:14 +msgid "Address pattern" +msgstr "アドレスパターン" + +#: ipam/forms/bulk_edit.py:85 +msgid "Is private" +msgstr "非公開です" + +#: ipam/forms/bulk_edit.py:106 ipam/forms/bulk_edit.py:135 +#: ipam/forms/bulk_edit.py:160 ipam/forms/bulk_import.py:88 +#: ipam/forms/bulk_import.py:108 ipam/forms/bulk_import.py:128 +#: ipam/forms/filtersets.py:109 ipam/forms/filtersets.py:124 +#: ipam/forms/filtersets.py:147 ipam/forms/model_forms.py:93 +#: ipam/forms/model_forms.py:108 ipam/forms/model_forms.py:130 +#: ipam/forms/model_forms.py:148 ipam/models/asns.py:31 +#: ipam/models/asns.py:103 ipam/models/ip.py:70 ipam/models/ip.py:89 +#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 +#: templates/ipam/aggregate.html:19 templates/ipam/asn.html:28 +#: templates/ipam/asnrange.html:20 templates/ipam/rir.html:20 +msgid "RIR" +msgstr "リル" + +#: ipam/forms/bulk_edit.py:168 +msgid "Date added" +msgstr "追加日" + +#: ipam/forms/bulk_edit.py:229 +msgid "Prefix length" +msgstr "プレフィックス長" + +#: ipam/forms/bulk_edit.py:252 ipam/forms/filtersets.py:236 +#: templates/ipam/prefix.html:86 +msgid "Is a pool" +msgstr "プールです" + +#: ipam/forms/bulk_edit.py:349 ipam/models/ip.py:771 +msgid "DNS name" +msgstr "DNS ネーム" + +#: ipam/forms/bulk_edit.py:370 ipam/forms/bulk_edit.py:569 +#: ipam/forms/bulk_import.py:393 ipam/forms/bulk_import.py:477 +#: ipam/forms/bulk_import.py:503 ipam/forms/filtersets.py:376 +#: ipam/forms/filtersets.py:511 templates/ipam/fhrpgroup.html:23 +#: templates/ipam/inc/panels/fhrp_groups.html:11 +#: templates/ipam/service.html:35 templates/ipam/servicetemplate.html:20 +msgid "Protocol" +msgstr "プロトコル" + +#: ipam/forms/bulk_edit.py:377 ipam/forms/filtersets.py:383 +#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:27 +msgid "Group ID" +msgstr "グループ ID" + +#: ipam/forms/bulk_edit.py:382 ipam/forms/filtersets.py:388 +#: wireless/forms/bulk_edit.py:67 wireless/forms/bulk_edit.py:114 +#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 +#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 +#: wireless/forms/filtersets.py:53 wireless/forms/filtersets.py:87 +msgid "Authentication type" +msgstr "認証タイプ" + +#: ipam/forms/bulk_edit.py:387 ipam/forms/filtersets.py:392 +msgid "Authentication key" +msgstr "認証キー" + +#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:369 +#: ipam/forms/model_forms.py:455 netbox/navigation/menu.py:376 +#: templates/ipam/fhrpgroup.html:51 +#: templates/wireless/inc/authentication_attrs.html:5 +#: wireless/forms/bulk_edit.py:90 wireless/forms/bulk_edit.py:137 +#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: wireless/forms/model_forms.py:56 wireless/forms/model_forms.py:161 +msgid "Authentication" +msgstr "[認証]" + +#: ipam/forms/bulk_edit.py:414 +msgid "Minimum child VLAN VID" +msgstr "チャイルド VLAN VID の最小値" + +#: ipam/forms/bulk_edit.py:420 +msgid "Maximum child VLAN VID" +msgstr "チャイルド VLAN VID の最大数" + +#: ipam/forms/bulk_edit.py:428 ipam/forms/model_forms.py:527 +msgid "Scope type" +msgstr "スコープタイプ" + +#: ipam/forms/bulk_edit.py:489 ipam/forms/model_forms.py:600 +#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:39 +msgid "Scope" +msgstr "スコープ" + +#: ipam/forms/bulk_edit.py:560 +msgid "Site & Group" +msgstr "サイトとグループ" + +#: ipam/forms/bulk_edit.py:574 ipam/forms/model_forms.py:663 +#: ipam/forms/model_forms.py:697 ipam/tables/services.py:19 +#: ipam/tables/services.py:49 templates/ipam/service.html:39 +#: templates/ipam/servicetemplate.html:24 +msgid "Ports" +msgstr "ポート" + +#: ipam/forms/bulk_import.py:47 +msgid "Import route targets" +msgstr "ルートターゲットをインポート" + +#: ipam/forms/bulk_import.py:53 +msgid "Export route targets" +msgstr "ルートターゲットをエクスポートする" + +#: ipam/forms/bulk_import.py:91 ipam/forms/bulk_import.py:111 +#: ipam/forms/bulk_import.py:131 +msgid "Assigned RIR" +msgstr "割り当てられた RIR" + +#: ipam/forms/bulk_import.py:181 +msgid "VLAN's group (if any)" +msgstr "VLAN のグループ (存在する場合)" + +#: ipam/forms/bulk_import.py:184 ipam/forms/model_forms.py:219 +#: ipam/models/vlans.py:214 ipam/tables/ip.py:254 +#: templates/ipam/prefix.html:61 templates/ipam/vlan.html:13 +#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 +#: templates/vpn/l2vpntermination_edit.html:17 +#: templates/wireless/wirelesslan.html:31 vpn/forms/bulk_import.py:304 +#: vpn/forms/filtersets.py:280 vpn/forms/model_forms.py:427 +#: wireless/forms/bulk_edit.py:54 wireless/forms/bulk_import.py:48 +#: wireless/forms/model_forms.py:49 wireless/models.py:101 +msgid "VLAN" +msgstr "VLAN" + +#: ipam/forms/bulk_import.py:307 +msgid "Parent device of assigned interface (if any)" +msgstr "割り当てられたインターフェースの親デバイス (存在する場合)" + +#: ipam/forms/bulk_import.py:310 ipam/forms/bulk_import.py:496 +#: ipam/forms/model_forms.py:691 virtualization/filtersets.py:284 +#: virtualization/filtersets.py:323 virtualization/forms/bulk_edit.py:199 +#: virtualization/forms/bulk_edit.py:325 +#: virtualization/forms/bulk_import.py:146 +#: virtualization/forms/bulk_import.py:207 +#: virtualization/forms/filtersets.py:204 +#: virtualization/forms/filtersets.py:240 +#: virtualization/forms/model_forms.py:291 vpn/forms/bulk_import.py:93 +#: vpn/forms/bulk_import.py:290 +msgid "Virtual machine" +msgstr "[仮想マシン]" + +#: ipam/forms/bulk_import.py:314 +msgid "Parent VM of assigned interface (if any)" +msgstr "割り当てられたインターフェースの親仮想マシン (存在する場合)" + +#: ipam/forms/bulk_import.py:321 +msgid "Assigned interface" +msgstr "割り当てられたインターフェース" + +#: ipam/forms/bulk_import.py:324 +msgid "Is primary" +msgstr "プライマリです" + +#: ipam/forms/bulk_import.py:325 +msgid "Make this the primary IP for the assigned device" +msgstr "これを割り当てられたデバイスのプライマリ IP アドレスにする" + +#: ipam/forms/bulk_import.py:364 +msgid "No device or virtual machine specified; cannot set as primary IP" +msgstr "デバイスまたは仮想マシンが指定されていません。プライマリ IP として設定できません" + +#: ipam/forms/bulk_import.py:368 +msgid "No interface specified; cannot set as primary IP" +msgstr "インターフェイスが指定されていません。プライマリ IP として設定できません" + +#: ipam/forms/bulk_import.py:397 +msgid "Auth type" +msgstr "認証タイプ" + +#: ipam/forms/bulk_import.py:412 +msgid "Scope type (app & model)" +msgstr "スコープの種類 (アプリとモデル)" + +#: ipam/forms/bulk_import.py:418 +#, python-brace-format +msgid "Minimum child VLAN VID (default: {minimum})" +msgstr "子の VLAN VID の最小値 (デフォルト: {minimum})" + +#: ipam/forms/bulk_import.py:424 +#, python-brace-format +msgid "Maximum child VLAN VID (default: {maximum})" +msgstr "チャイルド VLAN VID の最大数 (デフォルト: {maximum})" + +#: ipam/forms/bulk_import.py:448 +msgid "Assigned VLAN group" +msgstr "割り当てられた VLAN グループ" + +#: ipam/forms/bulk_import.py:479 ipam/forms/bulk_import.py:505 +msgid "IP protocol" +msgstr "IP プロトコル" + +#: ipam/forms/bulk_import.py:493 +msgid "Required if not assigned to a VM" +msgstr "VM に割り当てられていない場合は必須" + +#: ipam/forms/bulk_import.py:500 +msgid "Required if not assigned to a device" +msgstr "デバイスに割り当てられていない場合は必須" + +#: ipam/forms/bulk_import.py:525 +#, python-brace-format +msgid "{ip} is not assigned to this device/VM." +msgstr "{ip} このデバイス/VM には割り当てられていません。" + +#: ipam/forms/filtersets.py:46 ipam/forms/model_forms.py:60 +#: netbox/navigation/menu.py:177 vpn/forms/model_forms.py:403 +msgid "Route Targets" +msgstr "ルートターゲット" + +#: ipam/forms/filtersets.py:52 ipam/forms/model_forms.py:47 +#: vpn/forms/filtersets.py:221 vpn/forms/model_forms.py:390 +msgid "Import targets" +msgstr "インポートターゲット" + +#: ipam/forms/filtersets.py:57 ipam/forms/model_forms.py:52 +#: vpn/forms/filtersets.py:226 vpn/forms/model_forms.py:395 +msgid "Export targets" +msgstr "エクスポートターゲット" + +#: ipam/forms/filtersets.py:72 +msgid "Imported by VRF" +msgstr "VRF によるインポート" + +#: ipam/forms/filtersets.py:77 +msgid "Exported by VRF" +msgstr "VRF によるエクスポート" + +#: ipam/forms/filtersets.py:86 ipam/tables/ip.py:89 templates/ipam/rir.html:33 +msgid "Private" +msgstr "プライベート" + +#: ipam/forms/filtersets.py:104 ipam/forms/filtersets.py:186 +#: ipam/forms/filtersets.py:261 ipam/forms/filtersets.py:312 +msgid "Address family" +msgstr "アドレスファミリー" + +#: ipam/forms/filtersets.py:118 templates/ipam/asnrange.html:26 +msgid "Range" +msgstr "レンジ" + +#: ipam/forms/filtersets.py:127 +msgid "Start" +msgstr "[開始]" + +#: ipam/forms/filtersets.py:131 +msgid "End" +msgstr "終了" + +#: ipam/forms/filtersets.py:181 +msgid "Search within" +msgstr "内で検索" + +#: ipam/forms/filtersets.py:202 ipam/forms/filtersets.py:328 +msgid "Present in VRF" +msgstr "VRF でのプレゼンテーション" + +#: ipam/forms/filtersets.py:297 +msgid "Device/VM" +msgstr "デバイス/仮想マシン" + +#: ipam/forms/filtersets.py:333 +msgid "Assigned Device" +msgstr "割り当て済みデバイス" + +#: ipam/forms/filtersets.py:338 +msgid "Assigned VM" +msgstr "割り当てられた仮想マシン" + +#: ipam/forms/filtersets.py:352 +msgid "Assigned to an interface" +msgstr "インターフェースに割り当てられる" + +#: ipam/forms/filtersets.py:359 templates/ipam/ipaddress.html:54 +msgid "DNS Name" +msgstr "DNS ネーム" + +#: ipam/forms/filtersets.py:401 ipam/forms/filtersets.py:494 +#: ipam/models/vlans.py:156 templates/ipam/vlan.html:34 +msgid "VLAN ID" +msgstr "VLAN ID" + +#: ipam/forms/filtersets.py:433 +msgid "Minimum VID" +msgstr "最小 VID" + +#: ipam/forms/filtersets.py:439 +msgid "Maximum VID" +msgstr "VID の最大値" + +#: ipam/forms/filtersets.py:516 +msgid "Port" +msgstr "ポート" + +#: ipam/forms/filtersets.py:537 ipam/tables/vlans.py:191 +#: templates/ipam/ipaddress_edit.html:47 templates/ipam/service_create.html:22 +#: templates/ipam/service_edit.html:21 +#: templates/virtualization/virtualdisk.html:22 +#: templates/virtualization/virtualmachine.html:13 +#: templates/virtualization/vminterface.html:24 +#: templates/vpn/l2vpntermination_edit.html:27 +#: templates/vpn/tunneltermination.html:26 +#: virtualization/forms/filtersets.py:189 +#: virtualization/forms/filtersets.py:234 +#: virtualization/forms/model_forms.py:223 +#: virtualization/tables/virtualmachines.py:115 +#: virtualization/tables/virtualmachines.py:168 vpn/choices.py:45 +#: vpn/forms/filtersets.py:289 vpn/forms/model_forms.py:161 +#: vpn/forms/model_forms.py:172 vpn/forms/model_forms.py:269 +msgid "Virtual Machine" +msgstr "[仮想マシン]" + +#: ipam/forms/model_forms.py:113 ipam/tables/ip.py:116 +#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:39 +msgid "Aggregate" +msgstr "集計" + +#: ipam/forms/model_forms.py:134 templates/ipam/asnrange.html:12 +msgid "ASN Range" +msgstr "ASN レンジ" + +#: ipam/forms/model_forms.py:230 +msgid "Site/VLAN Assignment" +msgstr "サイト/VLAN 割り当て" + +#: ipam/forms/model_forms.py:256 templates/ipam/iprange.html:11 +msgid "IP Range" +msgstr "IP アドレス範囲" + +#: ipam/forms/model_forms.py:285 ipam/forms/model_forms.py:454 +#: templates/ipam/fhrpgroup.html:19 templates/ipam/ipaddress_edit.html:52 +msgid "FHRP Group" +msgstr "FHRP グループ" + +#: ipam/forms/model_forms.py:300 +msgid "Make this the primary IP for the device/VM" +msgstr "これをデバイス/仮想マシンのプライマリIPにする" + +#: ipam/forms/model_forms.py:351 +msgid "An IP address can only be assigned to a single object." +msgstr "IP アドレスは 1 つのオブジェクトにのみ割り当てることができます。" + +#: ipam/forms/model_forms.py:357 ipam/models/ip.py:877 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "親オブジェクトのプライマリ IP として指定されている間は IP アドレスを再割り当てできません" + +#: ipam/forms/model_forms.py:367 +msgid "" +"Only IP addresses assigned to an interface can be designated as primary IPs." +msgstr "プライマリ IP として指定できるのは、インターフェイスに割り当てられた IP アドレスのみです。" + +#: ipam/forms/model_forms.py:373 +#, python-brace-format +msgid "{ip} is a network ID, which may not be assigned to an interface." +msgstr "{ip} はネットワーク ID で、インターフェースに割り当てることはできません。" + +#: ipam/forms/model_forms.py:379 +#, python-brace-format +msgid "" +"{ip} is a broadcast address, which may not be assigned to an interface." +msgstr "{ip} はブロードキャストアドレスで、インターフェイスに割り当てることはできません。" + +#: ipam/forms/model_forms.py:456 +msgid "Virtual IP Address" +msgstr "仮想 IP アドレス" + +#: ipam/forms/model_forms.py:598 ipam/forms/model_forms.py:637 +#: ipam/tables/ip.py:250 templates/ipam/vlan_edit.html:37 +#: templates/ipam/vlangroup.html:27 +msgid "VLAN Group" +msgstr "VLAN グループ" + +#: ipam/forms/model_forms.py:599 +msgid "Child VLANs" +msgstr "チャイルド VLAN" + +#: ipam/forms/model_forms.py:668 ipam/forms/model_forms.py:702 +msgid "" +"Comma-separated list of one or more port numbers. A range may be specified " +"using a hyphen." +msgstr "1 つ以上のポート番号をカンマで区切ったリスト。範囲はハイフンを使用して指定できます。" + +#: ipam/forms/model_forms.py:673 templates/ipam/servicetemplate.html:12 +msgid "Service Template" +msgstr "サービステンプレート" + +#: ipam/forms/model_forms.py:724 +msgid "Service template" +msgstr "サービステンプレート" + +#: ipam/models/asns.py:34 +msgid "start" +msgstr "開始" + +#: ipam/models/asns.py:51 +msgid "ASN range" +msgstr "ASN レンジ" + +#: ipam/models/asns.py:52 +msgid "ASN ranges" +msgstr "ASN レンジ" + +#: ipam/models/asns.py:72 +#, python-brace-format +msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." +msgstr "ASN を起動しています ({start}) は終了 ASN () より小さくなければなりません{end})。" + +#: ipam/models/asns.py:104 +msgid "Regional Internet Registry responsible for this AS number space" +msgstr "この AS 番号空間を担当する地域インターネットレジストリ" + +#: ipam/models/asns.py:109 +msgid "16- or 32-bit autonomous system number" +msgstr "16 ビットまたは 32 ビットの自律システム番号" + +#: ipam/models/fhrp.py:22 +msgid "group ID" +msgstr "グループ ID" + +#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +msgid "protocol" +msgstr "プロトコル" + +#: ipam/models/fhrp.py:38 wireless/models.py:27 +msgid "authentication type" +msgstr "認証タイプ" + +#: ipam/models/fhrp.py:43 +msgid "authentication key" +msgstr "認証キー" + +#: ipam/models/fhrp.py:56 +msgid "FHRP group" +msgstr "FHRP グループ" + +#: ipam/models/fhrp.py:57 +msgid "FHRP groups" +msgstr "FHRP グループ" + +#: ipam/models/fhrp.py:93 tenancy/models/contacts.py:134 +msgid "priority" +msgstr "優先度" + +#: ipam/models/fhrp.py:113 +msgid "FHRP group assignment" +msgstr "FHRP グループアサイン" + +#: ipam/models/fhrp.py:114 +msgid "FHRP group assignments" +msgstr "FHRP グループアサイメント" + +#: ipam/models/ip.py:64 +msgid "private" +msgstr "非公開です" + +#: ipam/models/ip.py:65 +msgid "IP space managed by this RIR is considered private" +msgstr "この RIR が管理する IP スペースはプライベートと見なされます" + +#: ipam/models/ip.py:71 netbox/navigation/menu.py:170 +msgid "RIRs" +msgstr "RIR" + +#: ipam/models/ip.py:83 +msgid "IPv4 or IPv6 network" +msgstr "IPv4 ネットワークまたは IPv6 ネットワーク" + +#: ipam/models/ip.py:90 +msgid "Regional Internet Registry responsible for this IP space" +msgstr "この IP スペースを管理する地域インターネットレジストリ" + +#: ipam/models/ip.py:100 +msgid "date added" +msgstr "追加日" + +#: ipam/models/ip.py:114 +msgid "aggregate" +msgstr "集計" + +#: ipam/models/ip.py:115 +msgid "aggregates" +msgstr "集合体" + +#: ipam/models/ip.py:131 +msgid "Cannot create aggregate with /0 mask." +msgstr "/0 マスクを使用してアグリゲートを作成することはできません。" + +#: ipam/models/ip.py:143 +#, python-brace-format +msgid "" +"Aggregates cannot overlap. {prefix} is already covered by an existing " +"aggregate ({aggregate})." +msgstr "アグリゲートは重複できません。 {prefix} 既存のアグリゲートですでにカバーされている ({aggregate})。" + +#: ipam/models/ip.py:157 +#, python-brace-format +msgid "" +"Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " +"({aggregate})." +msgstr "プレフィックスはアグリゲートと重複できません。 {prefix} 既存のアグリゲートを対象とする ({aggregate})。" + +#: ipam/models/ip.py:199 ipam/models/ip.py:736 vpn/models/tunnels.py:114 +msgid "role" +msgstr "役割" + +#: ipam/models/ip.py:200 +msgid "roles" +msgstr "役割" + +#: ipam/models/ip.py:216 ipam/models/ip.py:292 +msgid "prefix" +msgstr "プレフィックス" + +#: ipam/models/ip.py:217 +msgid "IPv4 or IPv6 network with mask" +msgstr "マスク付きの IPv4 または IPv6 ネットワーク" + +#: ipam/models/ip.py:253 +msgid "Operational status of this prefix" +msgstr "このプレフィックスの動作ステータス" + +#: ipam/models/ip.py:261 +msgid "The primary function of this prefix" +msgstr "このプレフィックスの主な機能" + +#: ipam/models/ip.py:264 +msgid "is a pool" +msgstr "プールです" + +#: ipam/models/ip.py:266 +msgid "All IP addresses within this prefix are considered usable" +msgstr "このプレフィックス内のすべての IP アドレスが使用可能と見なされます。" + +#: ipam/models/ip.py:269 ipam/models/ip.py:536 +msgid "mark utilized" +msgstr "使用済みマーク" + +#: ipam/models/ip.py:293 +msgid "prefixes" +msgstr "プレフィックス" + +#: ipam/models/ip.py:316 +msgid "Cannot create prefix with /0 mask." +msgstr "/0 マスクではプレフィックスを作成できません。" + +#: ipam/models/ip.py:323 ipam/models/ip.py:854 +#, python-brace-format +msgid "VRF {vrf}" +msgstr "VRF {vrf}" + +#: ipam/models/ip.py:323 ipam/models/ip.py:854 +msgid "global table" +msgstr "グローバルテーブル" + +#: ipam/models/ip.py:325 +#, python-brace-format +msgid "Duplicate prefix found in {table}: {prefix}" +msgstr "に重複したプレフィックスが見つかりました {table}: {prefix}" + +#: ipam/models/ip.py:494 +msgid "start address" +msgstr "開始アドレス" + +#: ipam/models/ip.py:495 ipam/models/ip.py:499 ipam/models/ip.py:711 +msgid "IPv4 or IPv6 address (with mask)" +msgstr "IPv4 または IPv6 アドレス (マスク付き)" + +#: ipam/models/ip.py:498 +msgid "end address" +msgstr "終了アドレス" + +#: ipam/models/ip.py:525 +msgid "Operational status of this range" +msgstr "この範囲の運用状況" + +#: ipam/models/ip.py:533 +msgid "The primary function of this range" +msgstr "このシリーズの主な機能" + +#: ipam/models/ip.py:547 +msgid "IP range" +msgstr "IP アドレス範囲" + +#: ipam/models/ip.py:548 +msgid "IP ranges" +msgstr "IP アドレス範囲" + +#: ipam/models/ip.py:564 +msgid "Starting and ending IP address versions must match" +msgstr "開始 IP アドレスと終了 IP アドレスのバージョンが一致している必要があります" + +#: ipam/models/ip.py:570 +msgid "Starting and ending IP address masks must match" +msgstr "開始 IP アドレスマスクと終了 IP アドレスマスクは一致する必要があります" + +#: ipam/models/ip.py:577 +#, python-brace-format +msgid "" +"Ending address must be lower than the starting address ({start_address})" +msgstr "終了アドレスは開始アドレスより小さくなければなりません ({start_address})" + +#: ipam/models/ip.py:589 +#, python-brace-format +msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" +msgstr "定義されたアドレスが範囲と重複しています {overlapping_range} VRF で {vrf}" + +#: ipam/models/ip.py:598 +#, python-brace-format +msgid "Defined range exceeds maximum supported size ({max_size})" +msgstr "定義された範囲がサポートされている最大サイズを超えています ({max_size})" + +#: ipam/models/ip.py:710 tenancy/models/contacts.py:82 +msgid "address" +msgstr "アドレス" + +#: ipam/models/ip.py:733 +msgid "The operational status of this IP" +msgstr "この IP の動作ステータス" + +#: ipam/models/ip.py:740 +msgid "The functional role of this IP" +msgstr "この IP の機能的役割" + +#: ipam/models/ip.py:764 templates/ipam/ipaddress.html:75 +msgid "NAT (inside)" +msgstr "NAT (インサイド)" + +#: ipam/models/ip.py:765 +msgid "The IP for which this address is the \"outside\" IP" +msgstr "このアドレスが「外部」IPであるIP" + +#: ipam/models/ip.py:772 +msgid "Hostname or FQDN (not case-sensitive)" +msgstr "ホスト名または FQDN (大文字と小文字は区別されません)" + +#: ipam/models/ip.py:788 ipam/models/services.py:94 +msgid "IP addresses" +msgstr "IP アドレス" + +#: ipam/models/ip.py:844 +msgid "Cannot create IP address with /0 mask." +msgstr "/0 マスクで IP アドレスを作成することはできません。" + +#: ipam/models/ip.py:856 +#, python-brace-format +msgid "Duplicate IP address found in {table}: {ipaddress}" +msgstr "重複した IP アドレスが見つかりました {table}: {ipaddress}" + +#: ipam/models/ip.py:883 +msgid "Only IPv6 addresses can be assigned SLAAC status" +msgstr "SLAAC ステータスを割り当てることができるのは IPv6 アドレスのみです" + +#: ipam/models/services.py:33 +msgid "port numbers" +msgstr "ポート番号" + +#: ipam/models/services.py:59 +msgid "service template" +msgstr "サービステンプレート" + +#: ipam/models/services.py:60 +msgid "service templates" +msgstr "サービステンプレート" + +#: ipam/models/services.py:95 +msgid "The specific IP addresses (if any) to which this service is bound" +msgstr "このサービスがバインドされている特定の IP アドレス (存在する場合)" + +#: ipam/models/services.py:102 +msgid "service" +msgstr "サービス" + +#: ipam/models/services.py:103 +msgid "services" +msgstr "サービス" + +#: ipam/models/services.py:117 +msgid "" +"A service cannot be associated with both a device and a virtual machine." +msgstr "サービスをデバイスと仮想マシンの両方に関連付けることはできません。" + +#: ipam/models/services.py:119 +msgid "" +"A service must be associated with either a device or a virtual machine." +msgstr "サービスは、デバイスまたは仮想マシンのいずれかに関連付ける必要があります。" + +#: ipam/models/vlans.py:49 +msgid "minimum VLAN ID" +msgstr "最小 VLAN ID" + +#: ipam/models/vlans.py:55 +msgid "Lowest permissible ID of a child VLAN" +msgstr "子VLANの最小許容ID" + +#: ipam/models/vlans.py:58 +msgid "maximum VLAN ID" +msgstr "VLAN ID の最大数" + +#: ipam/models/vlans.py:64 +msgid "Highest permissible ID of a child VLAN" +msgstr "子 VLAN の最大許容ID" + +#: ipam/models/vlans.py:85 +msgid "VLAN groups" +msgstr "VLAN グループ" + +#: ipam/models/vlans.py:95 +msgid "Cannot set scope_type without scope_id." +msgstr "scope_id なしでスコープタイプを設定することはできません。" + +#: ipam/models/vlans.py:97 +msgid "Cannot set scope_id without scope_type." +msgstr "スコープタイプなしでスコープIDを設定することはできません。" + +#: ipam/models/vlans.py:102 +msgid "Maximum child VID must be greater than or equal to minimum child VID" +msgstr "子供 VID の最大数は、子供 VID の最小値以上でなければなりません" + +#: ipam/models/vlans.py:145 +msgid "The specific site to which this VLAN is assigned (if any)" +msgstr "この VLAN が割り当てられている特定のサイト (存在する場合)" + +#: ipam/models/vlans.py:153 +msgid "VLAN group (optional)" +msgstr "VLAN グループ (オプション)" + +#: ipam/models/vlans.py:161 +msgid "Numeric VLAN ID (1-4094)" +msgstr "数値によるVLAN ID (1-4094)" + +#: ipam/models/vlans.py:179 +msgid "Operational status of this VLAN" +msgstr "この VLAN の動作ステータス" + +#: ipam/models/vlans.py:187 +msgid "The primary function of this VLAN" +msgstr "この VLAN の主な機能" + +#: ipam/models/vlans.py:215 ipam/tables/ip.py:175 ipam/tables/vlans.py:78 +#: ipam/views.py:960 netbox/navigation/menu.py:181 +#: netbox/navigation/menu.py:183 +msgid "VLANs" +msgstr "VLAN" + +#: ipam/models/vlans.py:230 +#, python-brace-format +msgid "" +"VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " +"site {site}." +msgstr "VLANはグループに割り当てられています {group} (スコープ: {scope}); サイトへの割り当てもできません {site}。" + +#: ipam/models/vlans.py:238 +#, python-brace-format +msgid "VID must be between {minimum} and {maximum} for VLANs in group {group}" +msgstr "VID はその間にある必要があります {minimum} そして {maximum} グループ内の VLAN 用 {group}" + +#: ipam/models/vrfs.py:30 +msgid "route distinguisher" +msgstr "ルート識別子" + +#: ipam/models/vrfs.py:31 +msgid "Unique route distinguisher (as defined in RFC 4364)" +msgstr "一意のルート識別子 (RFC 4364 で定義されているとおり)" + +#: ipam/models/vrfs.py:42 +msgid "enforce unique space" +msgstr "ユニークな空間を強制" + +#: ipam/models/vrfs.py:43 +msgid "Prevent duplicate prefixes/IP addresses within this VRF" +msgstr "この VRF 内のプレフィックス/IP アドレスの重複を防ぐ" + +#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:174 +#: netbox/navigation/menu.py:176 +msgid "VRFs" +msgstr "VRF" + +#: ipam/models/vrfs.py:82 +msgid "Route target value (formatted in accordance with RFC 4360)" +msgstr "ルートターゲット値 (RFC 4360 に従ってフォーマットされています)" + +#: ipam/models/vrfs.py:94 +msgid "route target" +msgstr "ルートターゲット" + +#: ipam/models/vrfs.py:95 +msgid "route targets" +msgstr "ルートターゲット" + +#: ipam/tables/asn.py:52 +msgid "ASDOT" +msgstr "アズドット" + +#: ipam/tables/asn.py:57 +msgid "Site Count" +msgstr "サイト数" + +#: ipam/tables/asn.py:62 +msgid "Provider Count" +msgstr "プロバイダー数" + +#: ipam/tables/ip.py:94 netbox/navigation/menu.py:167 +#: netbox/navigation/menu.py:169 +msgid "Aggregates" +msgstr "アグリゲート" + +#: ipam/tables/ip.py:124 +msgid "Added" +msgstr "追加しました" + +#: ipam/tables/ip.py:127 ipam/tables/ip.py:165 ipam/tables/vlans.py:138 +#: ipam/views.py:349 netbox/navigation/menu.py:153 +#: netbox/navigation/menu.py:155 templates/ipam/vlan.html:87 +msgid "Prefixes" +msgstr "プレフィックス" + +#: ipam/tables/ip.py:130 ipam/tables/ip.py:267 ipam/tables/ip.py:320 +#: ipam/tables/vlans.py:82 templates/dcim/device.html:263 +#: templates/ipam/aggregate.html:25 templates/ipam/iprange.html:32 +#: templates/ipam/prefix.html:100 +msgid "Utilization" +msgstr "使用率" + +#: ipam/tables/ip.py:170 netbox/navigation/menu.py:149 +msgid "IP Ranges" +msgstr "IP アドレス範囲" + +#: ipam/tables/ip.py:220 +msgid "Prefix (Flat)" +msgstr "プレフィックス (フラット)" + +#: ipam/tables/ip.py:224 templates/dcim/rack_edit.html:52 +msgid "Depth" +msgstr "奥行き" + +#: ipam/tables/ip.py:261 +msgid "Pool" +msgstr "プール" + +#: ipam/tables/ip.py:264 ipam/tables/ip.py:317 +msgid "Marked Utilized" +msgstr "「使用済み」とマークされています" + +#: ipam/tables/ip.py:301 +msgid "Start address" +msgstr "開始アドレス" + +#: ipam/tables/ip.py:379 +msgid "NAT (Inside)" +msgstr "NAT (インサイド)" + +#: ipam/tables/ip.py:384 +msgid "NAT (Outside)" +msgstr "NAT (アウトサイド)" + +#: ipam/tables/ip.py:389 +msgid "Assigned" +msgstr "割り当て済み" + +#: ipam/tables/ip.py:424 templates/vpn/l2vpntermination.html:19 +#: vpn/forms/filtersets.py:235 +msgid "Assigned Object" +msgstr "割り当てられたオブジェクト" + +#: ipam/tables/vlans.py:68 +msgid "Scope Type" +msgstr "スコープタイプ" + +#: ipam/tables/vlans.py:107 ipam/tables/vlans.py:210 +#: templates/dcim/inc/interface_vlans_table.html:4 +msgid "VID" +msgstr "ヴィド" + +#: ipam/tables/vrfs.py:30 +msgid "RD" +msgstr "赤" + +#: ipam/tables/vrfs.py:33 +msgid "Unique" +msgstr "ユニーク" + +#: ipam/tables/vrfs.py:36 vpn/tables/l2vpn.py:27 +msgid "Import Targets" +msgstr "インポートターゲット" + +#: ipam/tables/vrfs.py:41 vpn/tables/l2vpn.py:32 +msgid "Export Targets" +msgstr "エクスポートターゲット" + +#: ipam/views.py:536 +msgid "Child Prefixes" +msgstr "子プレフィックス" + +#: ipam/views.py:571 +msgid "Child Ranges" +msgstr "チャイルドレンジ" + +#: ipam/views.py:888 +msgid "Related IPs" +msgstr "関連IPアドレス" + +#: ipam/views.py:1111 +msgid "Device Interfaces" +msgstr "デバイスインターフェース" + +#: ipam/views.py:1129 +msgid "VM Interfaces" +msgstr "VM インターフェイス" + +#: netbox/config/parameters.py:22 templates/core/configrevision.html:111 +msgid "Login banner" +msgstr "ログインバナー" + +#: netbox/config/parameters.py:24 +msgid "Additional content to display on the login page" +msgstr "ログインページに表示する追加コンテンツ" + +#: netbox/config/parameters.py:33 templates/core/configrevision.html:115 +msgid "Maintenance banner" +msgstr "メンテナンスバナー" + +#: netbox/config/parameters.py:35 +msgid "Additional content to display when in maintenance mode" +msgstr "メンテナンスモード時に表示する追加コンテンツ" + +#: netbox/config/parameters.py:44 templates/core/configrevision.html:119 +msgid "Top banner" +msgstr "トップバナー" + +#: netbox/config/parameters.py:46 +msgid "Additional content to display at the top of every page" +msgstr "各ページの上部に表示する追加コンテンツ" + +#: netbox/config/parameters.py:55 templates/core/configrevision.html:123 +msgid "Bottom banner" +msgstr "ボトムバナー" + +#: netbox/config/parameters.py:57 +msgid "Additional content to display at the bottom of every page" +msgstr "各ページの下部に表示する追加コンテンツ" + +#: netbox/config/parameters.py:68 +msgid "Globally unique IP space" +msgstr "グローバルに唯一無二のIPスペース" + +#: netbox/config/parameters.py:70 +msgid "Enforce unique IP addressing within the global table" +msgstr "グローバルテーブル内で一意の IP アドレスを強制する" + +#: netbox/config/parameters.py:75 templates/core/configrevision.html:87 +msgid "Prefer IPv4" +msgstr "IPv4 を優先する" + +#: netbox/config/parameters.py:77 +msgid "Prefer IPv4 addresses over IPv6" +msgstr "IPv6よりもIPv4アドレスを優先する" + +#: netbox/config/parameters.py:84 +msgid "Rack unit height" +msgstr "ラックユニットの高さ" + +#: netbox/config/parameters.py:86 +msgid "Default unit height for rendered rack elevations" +msgstr "レンダリングされたラック高さのデフォルト単位高さ" + +#: netbox/config/parameters.py:91 +msgid "Rack unit width" +msgstr "ラックユニット幅" + +#: netbox/config/parameters.py:93 +msgid "Default unit width for rendered rack elevations" +msgstr "レンダリングされたラック高さのデフォルト単位幅" + +#: netbox/config/parameters.py:100 +msgid "Powerfeed voltage" +msgstr "給電電圧" + +#: netbox/config/parameters.py:102 +msgid "Default voltage for powerfeeds" +msgstr "パワーフィードのデフォルト電圧" + +#: netbox/config/parameters.py:107 +msgid "Powerfeed amperage" +msgstr "給電アンペア数" + +#: netbox/config/parameters.py:109 +msgid "Default amperage for powerfeeds" +msgstr "パワーフィードのデフォルトアンペア数" + +#: netbox/config/parameters.py:114 +msgid "Powerfeed max utilization" +msgstr "パワーフィードの最大使用率" + +#: netbox/config/parameters.py:116 +msgid "Default max utilization for powerfeeds" +msgstr "パワーフィードのデフォルト最大使用率" + +#: netbox/config/parameters.py:123 templates/core/configrevision.html:99 +msgid "Allowed URL schemes" +msgstr "許可された URL スキーム" + +#: netbox/config/parameters.py:128 +msgid "Permitted schemes for URLs in user-provided content" +msgstr "ユーザー提供コンテンツの URL に許可されているスキーム" + +#: netbox/config/parameters.py:136 +msgid "Default page size" +msgstr "既定のページサイズ" + +#: netbox/config/parameters.py:142 +msgid "Maximum page size" +msgstr "最大ページサイズ" + +#: netbox/config/parameters.py:150 templates/core/configrevision.html:151 +msgid "Custom validators" +msgstr "カスタムバリデーター" + +#: netbox/config/parameters.py:152 +msgid "Custom validation rules (JSON)" +msgstr "カスタム検証ルール (JSON)" + +#: netbox/config/parameters.py:160 templates/core/configrevision.html:161 +msgid "Protection rules" +msgstr "保護規則" + +#: netbox/config/parameters.py:162 +msgid "Deletion protection rules (JSON)" +msgstr "削除保護ルール (JSON)" + +#: netbox/config/parameters.py:172 +msgid "Default preferences" +msgstr "デフォルト設定" + +#: netbox/config/parameters.py:174 +msgid "Default preferences for new users" +msgstr "新規ユーザーのデフォルト設定" + +#: netbox/config/parameters.py:181 templates/core/configrevision.html:197 +msgid "Maintenance mode" +msgstr "メンテナンスモード" + +#: netbox/config/parameters.py:183 +msgid "Enable maintenance mode" +msgstr "メンテナンスモードを有効にする" + +#: netbox/config/parameters.py:188 templates/core/configrevision.html:201 +msgid "GraphQL enabled" +msgstr "GraphQL 対応" + +#: netbox/config/parameters.py:190 +msgid "Enable the GraphQL API" +msgstr "GraphQL API を有効にする" + +#: netbox/config/parameters.py:195 templates/core/configrevision.html:205 +msgid "Changelog retention" +msgstr "変更履歴の保存" + +#: netbox/config/parameters.py:197 +msgid "Days to retain changelog history (set to zero for unlimited)" +msgstr "変更履歴の保存日数 (無制限の場合はゼロに設定)" + +#: netbox/config/parameters.py:202 +msgid "Job result retention" +msgstr "ジョブ結果の保存" + +#: netbox/config/parameters.py:204 +msgid "Days to retain job result history (set to zero for unlimited)" +msgstr "ジョブの結果履歴を保存する日数 (無制限の場合はゼロに設定)" + +#: netbox/config/parameters.py:209 templates/core/configrevision.html:213 +msgid "Maps URL" +msgstr "マップ URL" + +#: netbox/config/parameters.py:211 +msgid "Base URL for mapping geographic locations" +msgstr "地理的位置をマッピングするためのベース URL" + +#: netbox/forms/__init__.py:13 +msgid "Partial match" +msgstr "部分一致" + +#: netbox/forms/__init__.py:14 +msgid "Exact match" +msgstr "完全一致" + +#: netbox/forms/__init__.py:15 +msgid "Starts with" +msgstr "で始まる" + +#: netbox/forms/__init__.py:16 +msgid "Ends with" +msgstr "で終わる" + +#: netbox/forms/__init__.py:17 +msgid "Regex" +msgstr "正規表現" + +#: netbox/forms/__init__.py:35 +msgid "Object type(s)" +msgstr "オブジェクトタイプ" + +#: netbox/forms/base.py:77 +msgid "Id" +msgstr "Id" + +#: netbox/forms/base.py:116 +msgid "Add tags" +msgstr "タグを追加" + +#: netbox/forms/base.py:121 +msgid "Remove tags" +msgstr "タグを削除する" + +#: netbox/models/features.py:434 +msgid "Remote data source" +msgstr "リモートデータソース" + +#: netbox/models/features.py:444 +msgid "data path" +msgstr "データパス" + +#: netbox/models/features.py:448 +msgid "Path to remote file (relative to data source root)" +msgstr "リモートファイルへのパス (データソースルートからの相対パス)" + +#: netbox/models/features.py:451 +msgid "auto sync enabled" +msgstr "自動同期が有効" + +#: netbox/models/features.py:453 +msgid "Enable automatic synchronization of data when the data file is updated" +msgstr "データファイルの更新時にデータの自動同期を有効にする" + +#: netbox/models/features.py:456 +msgid "date synced" +msgstr "日付が同期されました" + +#: netbox/navigation/menu.py:12 +msgid "Organization" +msgstr "組織" + +#: netbox/navigation/menu.py:20 +msgid "Site Groups" +msgstr "サイトグループ" + +#: netbox/navigation/menu.py:28 +msgid "Rack Roles" +msgstr "ラックロール" + +#: netbox/navigation/menu.py:32 +msgid "Elevations" +msgstr "標高" + +#: netbox/navigation/menu.py:41 +msgid "Tenant Groups" +msgstr "テナントグループ" + +#: netbox/navigation/menu.py:48 +msgid "Contact Groups" +msgstr "連絡先グループ" + +#: netbox/navigation/menu.py:49 templates/tenancy/contactrole.html:8 +msgid "Contact Roles" +msgstr "連絡先の役割" + +#: netbox/navigation/menu.py:50 +msgid "Contact Assignments" +msgstr "連絡先の割り当て" + +#: netbox/navigation/menu.py:64 +msgid "Modules" +msgstr "モジュール" + +#: netbox/navigation/menu.py:65 templates/dcim/devicerole.html:8 +msgid "Device Roles" +msgstr "デバイスロール" + +#: netbox/navigation/menu.py:68 templates/dcim/device.html:162 +#: templates/dcim/virtualdevicecontext.html:8 +msgid "Virtual Device Contexts" +msgstr "仮想デバイスコンテキスト" + +#: netbox/navigation/menu.py:76 +msgid "Manufacturers" +msgstr "メーカー" + +#: netbox/navigation/menu.py:80 +msgid "Device Components" +msgstr "デバイスコンポーネント" + +#: netbox/navigation/menu.py:92 templates/dcim/inventoryitemrole.html:8 +msgid "Inventory Item Roles" +msgstr "インベントリアイテムの役割" + +#: netbox/navigation/menu.py:99 netbox/navigation/menu.py:103 +msgid "Connections" +msgstr "接続" + +#: netbox/navigation/menu.py:105 +msgid "Cables" +msgstr "ケーブル" + +#: netbox/navigation/menu.py:106 +msgid "Wireless Links" +msgstr "ワイヤレスリンク" + +#: netbox/navigation/menu.py:109 +msgid "Interface Connections" +msgstr "インターフェイス接続" + +#: netbox/navigation/menu.py:114 +msgid "Console Connections" +msgstr "コンソール接続" + +#: netbox/navigation/menu.py:119 +msgid "Power Connections" +msgstr "電源接続" + +#: netbox/navigation/menu.py:135 +msgid "Wireless LAN Groups" +msgstr "ワイヤレス LAN グループ" + +#: netbox/navigation/menu.py:156 +msgid "Prefix & VLAN Roles" +msgstr "プレフィックスと VLAN の役割" + +#: netbox/navigation/menu.py:162 +msgid "ASN Ranges" +msgstr "ASN レンジ" + +#: netbox/navigation/menu.py:184 +msgid "VLAN Groups" +msgstr "VLAN グループ" + +#: netbox/navigation/menu.py:191 +msgid "Service Templates" +msgstr "サービステンプレート" + +#: netbox/navigation/menu.py:192 templates/dcim/device.html:304 +#: templates/ipam/ipaddress.html:122 +#: templates/virtualization/virtualmachine.html:157 +msgid "Services" +msgstr "サービス" + +#: netbox/navigation/menu.py:199 +msgid "VPN" +msgstr "VPN" + +#: netbox/navigation/menu.py:203 netbox/navigation/menu.py:205 +#: vpn/tables/tunnels.py:24 +msgid "Tunnels" +msgstr "トンネル" + +#: netbox/navigation/menu.py:206 templates/vpn/tunnelgroup.html:8 +msgid "Tunnel Groups" +msgstr "トンネルグループ" + +#: netbox/navigation/menu.py:207 +msgid "Tunnel Terminations" +msgstr "トンネルターミネーション" + +#: netbox/navigation/menu.py:211 netbox/navigation/menu.py:213 +#: vpn/models/l2vpn.py:64 +msgid "L2VPNs" +msgstr "L2 VPN" + +#: netbox/navigation/menu.py:214 templates/vpn/l2vpn.html:57 +#: templates/vpn/tunnel.html:73 vpn/tables/tunnels.py:54 +msgid "Terminations" +msgstr "ターミネーション" + +#: netbox/navigation/menu.py:220 +msgid "IKE Proposals" +msgstr "IKEの提案" + +#: netbox/navigation/menu.py:221 templates/vpn/ikeproposal.html:42 +msgid "IKE Policies" +msgstr "IKE ポリシー" + +#: netbox/navigation/menu.py:222 +msgid "IPSec Proposals" +msgstr "IPsec プロポーザル" + +#: netbox/navigation/menu.py:223 templates/vpn/ipsecproposal.html:38 +msgid "IPSec Policies" +msgstr "IPsec ポリシー" + +#: netbox/navigation/menu.py:224 templates/vpn/ikepolicy.html:39 +#: templates/vpn/ipsecpolicy.html:26 +msgid "IPSec Profiles" +msgstr "IPsec プロファイル" + +#: netbox/navigation/menu.py:231 templates/dcim/device_edit.html:78 +msgid "Virtualization" +msgstr "仮想化" + +#: netbox/navigation/menu.py:235 netbox/navigation/menu.py:237 +#: virtualization/views.py:186 +msgid "Virtual Machines" +msgstr "[仮想マシン]" + +#: netbox/navigation/menu.py:239 +#: templates/virtualization/virtualmachine.html:177 +#: templates/virtualization/virtualmachine/base.html:32 +#: templates/virtualization/virtualmachine_list.html:21 +#: virtualization/tables/virtualmachines.py:90 virtualization/views.py:389 +msgid "Virtual Disks" +msgstr "仮想ディスク" + +#: netbox/navigation/menu.py:246 +msgid "Cluster Types" +msgstr "クラスタータイプ" + +#: netbox/navigation/menu.py:247 +msgid "Cluster Groups" +msgstr "クラスターグループ" + +#: netbox/navigation/menu.py:261 +msgid "Circuit Types" +msgstr "回路タイプ" + +#: netbox/navigation/menu.py:265 netbox/navigation/menu.py:267 +msgid "Providers" +msgstr "プロバイダー" + +#: netbox/navigation/menu.py:268 templates/circuits/provider.html:53 +msgid "Provider Accounts" +msgstr "プロバイダーアカウント" + +#: netbox/navigation/menu.py:269 +msgid "Provider Networks" +msgstr "プロバイダーネットワーク" + +#: netbox/navigation/menu.py:283 +msgid "Power Panels" +msgstr "パワーパネル" + +#: netbox/navigation/menu.py:294 +msgid "Configurations" +msgstr "コンフィギュレーション" + +#: netbox/navigation/menu.py:296 +msgid "Config Contexts" +msgstr "コンフィグコンテキスト" + +#: netbox/navigation/menu.py:297 +msgid "Config Templates" +msgstr "設定テンプレート" + +#: netbox/navigation/menu.py:304 netbox/navigation/menu.py:308 +msgid "Customization" +msgstr "カスタマイズ" + +#: netbox/navigation/menu.py:310 +#: templates/circuits/circuittermination_edit.html:53 +#: templates/dcim/cable_edit.html:77 templates/dcim/device_edit.html:103 +#: templates/dcim/inventoryitem_edit.html:102 templates/dcim/rack_edit.html:81 +#: templates/dcim/virtualchassis_add.html:31 +#: templates/dcim/virtualchassis_edit.html:41 +#: templates/generic/bulk_edit.html:92 templates/htmx/form.html:32 +#: templates/inc/panels/custom_fields.html:7 +#: templates/ipam/ipaddress_bulk_add.html:35 +#: templates/ipam/ipaddress_edit.html:88 templates/ipam/service_create.html:75 +#: templates/ipam/service_edit.html:62 templates/ipam/vlan_edit.html:63 +#: templates/tenancy/contactassignment_edit.html:31 +#: templates/vpn/l2vpntermination_edit.html:51 +msgid "Custom Fields" +msgstr "カスタムフィールド" + +#: netbox/navigation/menu.py:311 +msgid "Custom Field Choices" +msgstr "カスタムフィールド選択" + +#: netbox/navigation/menu.py:312 +msgid "Custom Links" +msgstr "カスタムリンク" + +#: netbox/navigation/menu.py:313 +msgid "Export Templates" +msgstr "テンプレートをエクスポート" + +#: netbox/navigation/menu.py:314 +msgid "Saved Filters" +msgstr "保存済みフィルター" + +#: netbox/navigation/menu.py:316 +msgid "Image Attachments" +msgstr "画像添付ファイル" + +#: netbox/navigation/menu.py:320 +msgid "Reports & Scripts" +msgstr "レポートとスクリプト" + +#: netbox/navigation/menu.py:340 +msgid "Operations" +msgstr "オペレーション" + +#: netbox/navigation/menu.py:344 +msgid "Integrations" +msgstr "インテグレーション" + +#: netbox/navigation/menu.py:346 +msgid "Data Sources" +msgstr "データソース" + +#: netbox/navigation/menu.py:347 +msgid "Event Rules" +msgstr "イベントルール" + +#: netbox/navigation/menu.py:348 +msgid "Webhooks" +msgstr "ウェブフック" + +#: netbox/navigation/menu.py:352 netbox/navigation/menu.py:356 +#: netbox/views/generic/feature_views.py:151 +#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +msgid "Jobs" +msgstr "ジョブ" + +#: netbox/navigation/menu.py:362 +msgid "Logging" +msgstr "ロギング" + +#: netbox/navigation/menu.py:364 +msgid "Journal Entries" +msgstr "ジャーナルエントリ" + +#: netbox/navigation/menu.py:365 templates/extras/objectchange.html:8 +#: templates/extras/objectchange_list.html:4 +msgid "Change Log" +msgstr "変更ログ" + +#: netbox/navigation/menu.py:372 templates/inc/profile_button.html:18 +msgid "Admin" +msgstr "管理者" + +#: netbox/navigation/menu.py:381 templates/users/group.html:27 +#: users/forms/model_forms.py:243 users/forms/model_forms.py:256 +#: users/forms/model_forms.py:310 users/tables.py:105 +msgid "Users" +msgstr "ユーザ" + +#: netbox/navigation/menu.py:404 users/forms/model_forms.py:183 +#: users/forms/model_forms.py:196 users/forms/model_forms.py:315 +#: users/tables.py:35 users/tables.py:109 +msgid "Groups" +msgstr "グループ" + +#: netbox/navigation/menu.py:426 templates/account/base.html:21 +#: templates/inc/profile_button.html:39 +msgid "API Tokens" +msgstr "API トークン" + +#: netbox/navigation/menu.py:433 users/forms/model_forms.py:189 +#: users/forms/model_forms.py:198 users/forms/model_forms.py:249 +#: users/forms/model_forms.py:257 +msgid "Permissions" +msgstr "パーミッション" + +#: netbox/navigation/menu.py:445 +msgid "Current Config" +msgstr "現在の構成" + +#: netbox/navigation/menu.py:451 +msgid "Config Revisions" +msgstr "設定リビジョン" + +#: netbox/navigation/menu.py:491 templates/500.html:35 +#: templates/account/preferences.html:29 +msgid "Plugins" +msgstr "プラグイン" + +#: netbox/preferences.py:19 +msgid "Color mode" +msgstr "カラーモード" + +#: netbox/preferences.py:21 +msgid "Light" +msgstr "ライト" + +#: netbox/preferences.py:22 +msgid "Dark" +msgstr "ダーク" + +#: netbox/preferences.py:27 +msgid "Language" +msgstr "言語" + +#: netbox/preferences.py:34 +msgid "Page length" +msgstr "ページの長さ" + +#: netbox/preferences.py:36 +msgid "The default number of objects to display per page" +msgstr "1 ページに表示するデフォルトのオブジェクト数" + +#: netbox/preferences.py:40 +msgid "Paginator placement" +msgstr "ページネーターの配置" + +#: netbox/preferences.py:42 +msgid "Bottom" +msgstr "ボトム" + +#: netbox/preferences.py:43 +msgid "Top" +msgstr "トップ" + +#: netbox/preferences.py:44 +msgid "Both" +msgstr "両方" + +#: netbox/preferences.py:46 +msgid "Where the paginator controls will be displayed relative to a table" +msgstr "ページネーターコントロールがテーブルを基準にして表示される場所" + +#: netbox/preferences.py:52 +msgid "Data format" +msgstr "データ形式" + +#: netbox/settings.py:726 +msgid "English" +msgstr "英語" + +#: netbox/settings.py:727 +msgid "Spanish" +msgstr "スペイン語" + +#: netbox/settings.py:728 +msgid "French" +msgstr "フランス語" + +#: netbox/settings.py:729 +msgid "Portuguese" +msgstr "ポルトガル語" + +#: netbox/settings.py:730 +msgid "Russian" +msgstr "ロシア人" + +#: netbox/tables/columns.py:175 +msgid "Toggle all" +msgstr "すべて切り替え" + +#: netbox/tables/columns.py:277 templates/inc/profile_button.html:56 +msgid "Toggle Dropdown" +msgstr "ドロップダウンを切り替え" + +#: netbox/tables/columns.py:542 templates/core/job.html:40 +msgid "Error" +msgstr "[エラー]" + +#: netbox/tables/tables.py:243 templates/generic/bulk_import.html:115 +msgid "Field" +msgstr "フィールド" + +#: netbox/tables/tables.py:246 +msgid "Value" +msgstr "価値" + +#: netbox/tables/tables.py:259 +msgid "No results found" +msgstr "結果が見つかりません" + +#: netbox/tests/dummy_plugin/navigation.py:29 +msgid "Dummy Plugin" +msgstr "ダミープラグイン" + +#: netbox/views/generic/feature_views.py:38 +msgid "Changelog" +msgstr "変更ログ" + +#: netbox/views/generic/feature_views.py:91 +msgid "Journal" +msgstr "ジャーナル" + +#: templates/403.html:4 +msgid "Access Denied" +msgstr "アクセス拒否" + +#: templates/403.html:9 +msgid "You do not have permission to access this page" +msgstr "このページにアクセスする権限がありません" + +#: templates/404.html:4 +msgid "Page Not Found" +msgstr "ページが見つかりません" + +#: templates/404.html:9 +msgid "The requested page does not exist" +msgstr "要求されたページは存在しません" + +#: templates/500.html:7 templates/500.html:18 +msgid "Server Error" +msgstr "サーバーエラー" + +#: templates/500.html:23 +msgid "There was a problem with your request. Please contact an administrator" +msgstr "リクエストに問題がありました。管理者に問い合わせてください。" + +#: templates/500.html:28 +msgid "The complete exception is provided below" +msgstr "完全な例外は以下のとおりです。" + +#: templates/500.html:33 +msgid "Python version" +msgstr "パイソンバージョン" + +#: templates/500.html:34 +msgid "NetBox version" +msgstr "ネットボックスバージョン" + +#: templates/500.html:36 +msgid "None installed" +msgstr "インストールなし" + +#: templates/500.html:39 +msgid "If further assistance is required, please post to the" +msgstr "さらにサポートが必要な場合は、次のアドレスに投稿してください" + +#: templates/500.html:39 +msgid "NetBox discussion forum" +msgstr "NetBox ディスカッションフォーラム" + +#: templates/500.html:39 +msgid "on GitHub" +msgstr "GitHub で" + +#: templates/500.html:42 templates/base/40x.html:17 +msgid "Home Page" +msgstr "[ホームページ]" + +#: templates/account/base.html:7 templates/inc/profile_button.html:24 +#: vpn/forms/bulk_edit.py:256 vpn/forms/filtersets.py:186 +#: vpn/forms/model_forms.py:372 +msgid "Profile" +msgstr "プロフィール" + +#: templates/account/base.html:13 templates/inc/profile_button.html:34 +msgid "Preferences" +msgstr "環境設定" + +#: templates/account/password.html:5 +msgid "Change Password" +msgstr "パスワードを変更" + +#: templates/account/password.html:17 templates/account/preferences.html:82 +#: templates/core/configrevision_restore.html:80 +#: templates/dcim/devicebay_populate.html:34 +#: templates/dcim/virtualchassis_add_member.html:24 +#: templates/dcim/virtualchassis_edit.html:104 +#: templates/extras/object_journal.html:26 templates/extras/script.html:36 +#: templates/generic/bulk_add_component.html:55 +#: templates/generic/bulk_delete.html:46 templates/generic/bulk_edit.html:125 +#: templates/generic/bulk_import.html:53 templates/generic/bulk_import.html:75 +#: templates/generic/bulk_import.html:97 templates/generic/bulk_remove.html:42 +#: templates/generic/bulk_rename.html:44 +#: templates/generic/confirmation_form.html:20 +#: templates/generic/object_edit.html:76 templates/htmx/delete_form.html:53 +#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:31 +#: templates/virtualization/cluster_add_devices.html:30 +msgid "Cancel" +msgstr "[キャンセル]" + +#: templates/account/password.html:18 templates/account/preferences.html:83 +#: templates/dcim/devicebay_populate.html:35 +#: templates/dcim/virtualchassis_add_member.html:26 +#: templates/dcim/virtualchassis_edit.html:106 +#: templates/extras/dashboard/widget_add.html:26 +#: templates/extras/dashboard/widget_config.html:19 +#: templates/extras/object_journal.html:27 +#: templates/generic/object_edit.html:66 +#: utilities/templates/helpers/applied_filters.html:16 +#: utilities/templates/helpers/table_config_form.html:40 +msgid "Save" +msgstr "[保存]" + +#: templates/account/preferences.html:41 +msgid "Table Configurations" +msgstr "テーブル構成" + +#: templates/account/preferences.html:46 +msgid "Clear table preferences" +msgstr "テーブル設定をクリア" + +#: templates/account/preferences.html:53 +msgid "Toggle All" +msgstr "[すべて切り替え]" + +#: templates/account/preferences.html:55 +msgid "Table" +msgstr "テーブル" + +#: templates/account/preferences.html:56 +msgid "Ordering" +msgstr "注文" + +#: templates/account/preferences.html:57 +msgid "Columns" +msgstr "コラム" + +#: templates/account/preferences.html:76 templates/dcim/cable_trace.html:113 +#: templates/extras/object_configcontext.html:55 +msgid "None found" +msgstr "何も見つかりませんでした" + +#: templates/account/profile.html:6 +msgid "User Profile" +msgstr "ユーザープロフィール" + +#: templates/account/profile.html:12 +msgid "Account Details" +msgstr "アカウント詳細" + +#: templates/account/profile.html:30 templates/tenancy/contact.html:44 +#: templates/users/user.html:26 tenancy/forms/bulk_edit.py:108 +msgid "Email" +msgstr "電子メール" + +#: templates/account/profile.html:34 templates/users/user.html:30 +msgid "Account Created" +msgstr "アカウントが作成されました" + +#: templates/account/profile.html:38 templates/users/user.html:42 +msgid "Superuser" +msgstr "スーパーユーザ" + +#: templates/account/profile.html:42 +msgid "Admin Access" +msgstr "管理者アクセス" + +#: templates/account/profile.html:51 templates/users/objectpermission.html:86 +#: templates/users/user.html:51 +msgid "Assigned Groups" +msgstr "割り当てられたグループ" + +#: templates/account/profile.html:56 +#: templates/circuits/circuit_terminations_swap.html:18 +#: templates/circuits/circuit_terminations_swap.html:26 +#: templates/circuits/inc/circuit_termination.html:154 +#: templates/dcim/devicebay.html:66 +#: templates/dcim/inc/panels/inventory_items.html:37 +#: templates/dcim/interface.html:306 templates/dcim/modulebay.html:79 +#: templates/extras/configcontext.html:73 templates/extras/eventrule.html:84 +#: templates/extras/htmx/script_result.html:54 +#: templates/extras/object_configcontext.html:28 +#: templates/extras/objectchange.html:128 +#: templates/extras/objectchange.html:145 templates/extras/webhook.html:79 +#: templates/extras/webhook.html:91 templates/inc/panel_table.html:12 +#: templates/inc/panels/comments.html:12 +#: templates/ipam/inc/panels/fhrp_groups.html:43 templates/users/group.html:32 +#: templates/users/group.html:42 templates/users/objectpermission.html:81 +#: templates/users/objectpermission.html:91 templates/users/user.html:56 +#: templates/users/user.html:66 +msgid "None" +msgstr "[なし]" + +#: templates/account/profile.html:66 templates/users/user.html:76 +msgid "Recent Activity" +msgstr "最近のアクティビティ" + +#: templates/account/token.html:8 templates/account/token_list.html:6 +msgid "My API Tokens" +msgstr "マイ API トークン" + +#: templates/account/token.html:11 templates/account/token.html:19 +#: templates/users/token.html:6 templates/users/token.html:14 +#: users/forms/filtersets.py:121 +msgid "Token" +msgstr "トークン" + +#: templates/account/token.html:40 templates/users/token.html:32 +#: users/forms/bulk_edit.py:87 +msgid "Write enabled" +msgstr "書き込み有効" + +#: templates/account/token.html:52 templates/users/token.html:44 +msgid "Last used" +msgstr "最終使用日" + +#: templates/account/token_list.html:12 +msgid "Add a Token" +msgstr "トークンを追加" + +#: templates/admin/index.html:10 +msgid "System" +msgstr "システム" + +#: templates/admin/index.html:14 +msgid "Background Tasks" +msgstr "バックグラウンドタスク" + +#: templates/admin/index.html:19 +msgid "Installed plugins" +msgstr "インストール済みプラグイン" + +#: templates/base/base.html:28 templates/extras/admin/plugins_list.html:8 +#: templates/home.html:24 +msgid "Home" +msgstr "ホーム" + +#: templates/base/layout.html:27 templates/base/layout.html:37 +#: templates/login.html:34 +msgid "NetBox logo" +msgstr "ネットボックスロゴ" + +#: templates/base/layout.html:76 +msgid "Debug mode is enabled" +msgstr "デバッグモードが有効になっています" + +#: templates/base/layout.html:77 +msgid "" +"Performance may be limited. Debugging should never be enabled on a " +"production system" +msgstr "パフォーマンスが制限される場合があります。本番システムではデバッグは絶対に有効にしないでください。" + +#: templates/base/layout.html:83 +msgid "Maintenance Mode" +msgstr "メンテナンスモード" + +#: templates/base/layout.html:134 +msgid "Docs" +msgstr "ドキュメント" + +#: templates/base/layout.html:139 templates/rest_framework/api.html:10 +msgid "REST API" +msgstr "レスト API" + +#: templates/base/layout.html:144 +msgid "REST API documentation" +msgstr "REST API ドキュメンテーション" + +#: templates/base/layout.html:150 +msgid "GraphQL API" +msgstr "GraphQL API" + +#: templates/base/layout.html:156 +msgid "Source Code" +msgstr "[ソースコード]" + +#: templates/base/layout.html:161 +msgid "Community" +msgstr "コミュニティ" + +#: templates/base/sidenav.html:12 templates/base/sidenav.html:17 +msgid "NetBox Logo" +msgstr "ネットボックスロゴ" + +#: templates/circuits/circuit.html:48 +msgid "Install Date" +msgstr "インストール日" + +#: templates/circuits/circuit.html:52 +msgid "Termination Date" +msgstr "終了日" + +#: templates/circuits/circuit_terminations_swap.html:4 +msgid "Swap Circuit Terminations" +msgstr "スワップ回路終端" + +#: templates/circuits/circuit_terminations_swap.html:8 +#, python-format +msgid "Swap these terminations for circuit %(circuit)s?" +msgstr "これらの終端を回路に交換してください %(circuit)s?" + +#: templates/circuits/circuit_terminations_swap.html:14 +msgid "A side" +msgstr "Aサイド" + +#: templates/circuits/circuit_terminations_swap.html:22 +msgid "Z side" +msgstr "Z サイド" + +#: templates/circuits/circuittermination_edit.html:9 +#: templates/circuits/inc/circuit_termination.html:81 +#: templates/dcim/frontport.html:128 templates/dcim/interface.html:199 +#: templates/dcim/rearport.html:118 +msgid "Circuit Termination" +msgstr "サーキットターミネーション" + +#: templates/circuits/circuittermination_edit.html:41 +msgid "Termination Details" +msgstr "終了詳細" + +#: templates/circuits/circuittype.html:10 +msgid "Add Circuit" +msgstr "回路を追加" + +#: templates/circuits/inc/circuit_termination.html:9 +#: templates/dcim/devicetype/component_templates.html:30 +#: templates/dcim/manufacturer.html:11 +#: templates/dcim/moduletype/component_templates.html:30 +#: templates/generic/bulk_add_component.html:8 +#: templates/users/objectpermission.html:41 +#: utilities/templates/buttons/add.html:4 +#: utilities/templates/helpers/table_config_form.html:20 +msgid "Add" +msgstr "追加" + +#: templates/circuits/inc/circuit_termination.html:14 +#: templates/circuits/inc/circuit_termination.html:63 +#: templates/dcim/devicetype/component_templates.html:21 +#: templates/dcim/inc/panels/inventory_items.html:24 +#: templates/dcim/moduletype/component_templates.html:21 +#: templates/dcim/powerpanel.html:61 templates/generic/object_edit.html:29 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +#: templates/ipam/inc/panels/fhrp_groups.html:30 +#: utilities/templates/buttons/edit.html:3 +msgid "Edit" +msgstr "[編集]" + +#: templates/circuits/inc/circuit_termination.html:17 +msgid "Swap" +msgstr "スワップ" + +#: templates/circuits/inc/circuit_termination.html:26 +#, python-format +msgid "Termination %(side)s" +msgstr "終了 %(side)s" + +#: templates/circuits/inc/circuit_termination.html:42 +#: templates/dcim/cable.html:70 templates/dcim/cable.html:76 +#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:76 +msgid "Termination" +msgstr "終了" + +#: templates/circuits/inc/circuit_termination.html:46 +#: templates/dcim/consoleport.html:62 templates/dcim/consoleserverport.html:62 +#: templates/dcim/powerfeed.html:122 +msgid "Marked as connected" +msgstr "接続済みとしてマークされています" + +#: templates/circuits/inc/circuit_termination.html:48 +msgid "to" +msgstr "に" + +#: templates/circuits/inc/circuit_termination.html:58 +#: templates/circuits/inc/circuit_termination.html:59 +#: templates/dcim/frontport.html:87 +#: templates/dcim/inc/connection_endpoints.html:7 +#: templates/dcim/interface.html:160 templates/dcim/rearport.html:83 +msgid "Trace" +msgstr "トレース" + +#: templates/circuits/inc/circuit_termination.html:62 +msgid "Edit cable" +msgstr "ケーブル編集" + +#: templates/circuits/inc/circuit_termination.html:67 +msgid "Remove cable" +msgstr "ケーブルを取り外す" + +#: templates/circuits/inc/circuit_termination.html:68 +#: templates/dcim/bulk_disconnect.html:5 +#: templates/dcim/device/consoleports.html:12 +#: templates/dcim/device/consoleserverports.html:12 +#: templates/dcim/device/frontports.html:12 +#: templates/dcim/device/interfaces.html:16 +#: templates/dcim/device/poweroutlets.html:12 +#: templates/dcim/device/powerports.html:12 +#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:66 +msgid "Disconnect" +msgstr "接続解除" + +#: templates/circuits/inc/circuit_termination.html:75 +#: templates/dcim/consoleport.html:71 templates/dcim/consoleserverport.html:71 +#: templates/dcim/frontport.html:109 templates/dcim/interface.html:186 +#: templates/dcim/interface.html:206 templates/dcim/powerfeed.html:136 +#: templates/dcim/poweroutlet.html:75 templates/dcim/poweroutlet.html:76 +#: templates/dcim/powerport.html:77 templates/dcim/rearport.html:105 +msgid "Connect" +msgstr "接続" + +#: templates/circuits/inc/circuit_termination.html:79 +#: templates/dcim/consoleport.html:78 templates/dcim/consoleserverport.html:78 +#: templates/dcim/frontport.html:18 templates/dcim/frontport.html:122 +#: templates/dcim/interface.html:193 templates/dcim/inventoryitem_edit.html:49 +#: templates/dcim/rearport.html:112 +msgid "Front Port" +msgstr "フロントポート" + +#: templates/circuits/inc/circuit_termination.html:97 +msgid "Downstream" +msgstr "ダウンストリーム" + +#: templates/circuits/inc/circuit_termination.html:98 +msgid "Upstream" +msgstr "アップストリーム" + +#: templates/circuits/inc/circuit_termination.html:107 +msgid "Cross-Connect" +msgstr "クロスコネクト" + +#: templates/circuits/inc/circuit_termination.html:111 +msgid "Patch Panel/Port" +msgstr "パッチパネル/ポート" + +#: templates/circuits/provider.html:11 +msgid "Add circuit" +msgstr "回路を追加" + +#: templates/circuits/provideraccount.html:17 +msgid "Provider Account" +msgstr "プロバイダーアカウント" + +#: templates/core/configrevision.html:47 +msgid "Default unit height" +msgstr "既定の単位高さ" + +#: templates/core/configrevision.html:51 +msgid "Default unit width" +msgstr "既定の単位幅" + +#: templates/core/configrevision.html:63 +msgid "Default voltage" +msgstr "デフォルト電圧" + +#: templates/core/configrevision.html:67 +msgid "Default amperage" +msgstr "デフォルトアンペア数" + +#: templates/core/configrevision.html:71 +msgid "Default max utilization" +msgstr "デフォルトの最大使用率" + +#: templates/core/configrevision.html:83 +msgid "Enforce global unique" +msgstr "グローバルユニークを強制" + +#: templates/core/configrevision.html:135 +msgid "Paginate count" +msgstr "ページ分割数" + +#: templates/core/configrevision.html:139 +msgid "Max page size" +msgstr "最大ページサイズ" + +#: templates/core/configrevision.html:179 +msgid "Default user preferences" +msgstr "デフォルト・ユーザー・プリファレンス" + +#: templates/core/configrevision.html:209 +msgid "Job retention" +msgstr "仕事の維持" + +#: templates/core/configrevision.html:221 +msgid "Comment" +msgstr "[コメント]" + +#: templates/core/configrevision_restore.html:8 +#: templates/core/configrevision_restore.html:43 +#: templates/core/configrevision_restore.html:79 +msgid "Restore" +msgstr "復元" + +#: templates/core/configrevision_restore.html:21 +msgid "Config revisions" +msgstr "設定リビジョン" + +#: templates/core/configrevision_restore.html:54 +msgid "Parameter" +msgstr "パラメーター" + +#: templates/core/configrevision_restore.html:55 +msgid "Current Value" +msgstr "現在の値" + +#: templates/core/configrevision_restore.html:56 +msgid "New Value" +msgstr "新しい価値" + +#: templates/core/configrevision_restore.html:66 +msgid "Changed" +msgstr "変更されました" + +#: templates/core/datafile.html:47 +msgid "Last Updated" +msgstr "最終更新日" + +#: templates/core/datafile.html:51 templates/ipam/iprange.html:28 +#: templates/virtualization/virtualdisk.html:30 +msgid "Size" +msgstr "サイズ" + +#: templates/core/datafile.html:52 +msgid "bytes" +msgstr "バイト" + +#: templates/core/datafile.html:55 +msgid "SHA256 Hash" +msgstr "SHA256 ハッシュ" + +#: templates/core/datasource.html:14 templates/core/datasource.html:20 +#: utilities/templates/buttons/sync.html:5 +msgid "Sync" +msgstr "同期" + +#: templates/core/datasource.html:51 +msgid "Last synced" +msgstr "最終同期" + +#: templates/core/datasource.html:86 +msgid "Backend" +msgstr "バックエンド" + +#: templates/core/datasource.html:102 +msgid "No parameters defined" +msgstr "パラメータが定義されていません" + +#: templates/core/datasource.html:118 +msgid "Files" +msgstr "[ファイル]" + +#: templates/core/job.html:21 +msgid "Job" +msgstr "ジョブ" + +#: templates/core/job.html:45 templates/extras/journalentry.html:29 +msgid "Created By" +msgstr "作成者" + +#: templates/core/job.html:54 +msgid "Scheduling" +msgstr "スケジューリング" + +#: templates/core/job.html:66 +#, python-format +msgid "every %(interval)s seconds" +msgstr "ごと %(interval)s 秒" + +#: templates/dcim/bulk_disconnect.html:9 +#, python-format +msgid "" +"Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" +msgstr "これらを切断してもよろしいですか %(count)s %(obj_type_plural)s?" + +#: templates/dcim/cable_edit.html:12 +msgid "A Side" +msgstr "Aサイド" + +#: templates/dcim/cable_edit.html:29 +msgid "B Side" +msgstr "B サイド" + +#: templates/dcim/cable_trace.html:6 +#, python-format +msgid "Cable Trace for %(object_type)s %(object)s" +msgstr "用ケーブルトレース %(object_type)s %(object)s" + +#: templates/dcim/cable_trace.html:21 templates/dcim/inc/rack_elevation.html:7 +msgid "Download SVG" +msgstr "SVG をダウンロード" + +#: templates/dcim/cable_trace.html:27 +msgid "Asymmetric Path" +msgstr "非対称パス" + +#: templates/dcim/cable_trace.html:28 +msgid "The nodes below have no links and result in an asymmetric path" +msgstr "以下のノードにはリンクがなく、パスが非対称になっています" + +#: templates/dcim/cable_trace.html:35 +msgid "Path split" +msgstr "パススプリット" + +#: templates/dcim/cable_trace.html:36 +msgid "Select a node below to continue" +msgstr "続行するには以下のノードを選択してください" + +#: templates/dcim/cable_trace.html:52 +msgid "Trace Completed" +msgstr "トレース完了" + +#: templates/dcim/cable_trace.html:55 +msgid "Total segments" +msgstr "合計セグメント" + +#: templates/dcim/cable_trace.html:59 +msgid "Total length" +msgstr "全長" + +#: templates/dcim/cable_trace.html:74 +msgid "No paths found" +msgstr "パスが見つかりません" + +#: templates/dcim/cable_trace.html:83 +msgid "Related Paths" +msgstr "関連パス" + +#: templates/dcim/cable_trace.html:89 +msgid "Origin" +msgstr "オリジン" + +#: templates/dcim/cable_trace.html:90 +msgid "Destination" +msgstr "目的地" + +#: templates/dcim/cable_trace.html:91 +msgid "Segments" +msgstr "セグメント" + +#: templates/dcim/cable_trace.html:104 +msgid "Incomplete" +msgstr "不完全" + +#: templates/dcim/component_list.html:14 +msgid "Rename Selected" +msgstr "選択項目の名前を変更" + +#: templates/dcim/consoleport.html:67 templates/dcim/consoleserverport.html:67 +#: templates/dcim/frontport.html:105 templates/dcim/interface.html:182 +#: templates/dcim/poweroutlet.html:73 templates/dcim/powerport.html:73 +msgid "Not Connected" +msgstr "未接続" + +#: templates/dcim/consoleport.html:75 templates/dcim/consoleserverport.html:18 +#: templates/dcim/frontport.html:116 templates/dcim/inventoryitem_edit.html:44 +msgid "Console Server Port" +msgstr "コンソールサーバポート" + +#: templates/dcim/device.html:35 +msgid "Highlight device" +msgstr "ハイライトデバイス" + +#: templates/dcim/device.html:57 +msgid "Not racked" +msgstr "ラックなし" + +#: templates/dcim/device.html:64 templates/dcim/site.html:96 +msgid "GPS Coordinates" +msgstr "GPS 座標" + +#: templates/dcim/device.html:70 templates/dcim/site.html:102 +msgid "Map It" +msgstr "マップ・イット" + +#: templates/dcim/device.html:110 templates/dcim/inventoryitem.html:57 +#: templates/dcim/module.html:79 templates/dcim/modulebay.html:73 +#: templates/dcim/rack.html:62 +msgid "Asset Tag" +msgstr "アセットタグ" + +#: templates/dcim/device.html:153 +msgid "View Virtual Chassis" +msgstr "バーチャルシャーシを見る" + +#: templates/dcim/device.html:170 +msgid "Create VDC" +msgstr "VDC の作成" + +#: templates/dcim/device.html:179 templates/dcim/device_edit.html:64 +#: virtualization/forms/model_forms.py:226 +msgid "Management" +msgstr "マネジメント" + +#: templates/dcim/device.html:200 templates/dcim/device.html:216 +#: templates/virtualization/virtualmachine.html:56 +#: templates/virtualization/virtualmachine.html:72 +msgid "NAT for" +msgstr "用の NAT" + +#: templates/dcim/device.html:202 templates/dcim/device.html:218 +#: templates/virtualization/virtualmachine.html:58 +#: templates/virtualization/virtualmachine.html:74 +msgid "NAT" +msgstr "ナット" + +#: templates/dcim/device.html:254 templates/dcim/rack.html:70 +msgid "Power Utilization" +msgstr "電力使用率" + +#: templates/dcim/device.html:259 +msgid "Input" +msgstr "入力" + +#: templates/dcim/device.html:260 +msgid "Outlets" +msgstr "アウトレット" + +#: templates/dcim/device.html:261 +msgid "Allocated" +msgstr "割り当て済み" + +#: templates/dcim/device.html:270 templates/dcim/device.html:272 +#: templates/dcim/device.html:288 templates/dcim/powerfeed.html:70 +msgid "VA" +msgstr "VA" + +#: templates/dcim/device.html:282 +msgctxt "Leg of a power feed" +msgid "Leg" +msgstr "レッグ" + +#: templates/dcim/device.html:312 +#: templates/virtualization/virtualmachine.html:165 +msgid "Add a service" +msgstr "サービスを追加" + +#: templates/dcim/device.html:319 templates/dcim/rack.html:77 +#: templates/dcim/rack_edit.html:38 +msgid "Dimensions" +msgstr "ディメンション" + +#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 +#: templates/dcim/devicetype/base.html:18 templates/dcim/module.html:18 +#: templates/dcim/moduletype/base.html:18 +#: templates/virtualization/virtualmachine/base.html:22 +#: templates/virtualization/virtualmachine_list.html:8 +msgid "Add Components" +msgstr "[コンポーネントを追加]" + +#: templates/dcim/device/consoleports.html:24 +msgid "Add Console Ports" +msgstr "コンソールポートの追加" + +#: templates/dcim/device/consoleserverports.html:24 +msgid "Add Console Server Ports" +msgstr "コンソールサーバポートの追加" + +#: templates/dcim/device/devicebays.html:10 +msgid "Add Device Bays" +msgstr "デバイスベイの追加" + +#: templates/dcim/device/frontports.html:24 +msgid "Add Front Ports" +msgstr "フロントポートを追加" + +#: templates/dcim/device/inc/interface_table_controls.html:9 +msgid "Hide Enabled" +msgstr "非表示有効" + +#: templates/dcim/device/inc/interface_table_controls.html:10 +msgid "Hide Disabled" +msgstr "非表示無効" + +#: templates/dcim/device/inc/interface_table_controls.html:11 +msgid "Hide Virtual" +msgstr "バーチャルを非表示" + +#: templates/dcim/device/inc/interface_table_controls.html:12 +msgid "Hide Disconnected" +msgstr "接続解除を非表示" + +#: templates/dcim/device/interfaces.html:28 +msgid "Add Interfaces" +msgstr "インターフェースを追加" + +#: templates/dcim/device/inventory.html:10 +#: templates/dcim/inc/panels/inventory_items.html:46 +msgid "Add Inventory Item" +msgstr "インベントリアイテムの追加" + +#: templates/dcim/device/modulebays.html:10 +msgid "Add Module Bays" +msgstr "モジュールベイの追加" + +#: templates/dcim/device/poweroutlets.html:24 +msgid "Add Power Outlets" +msgstr "電源コンセントの追加" + +#: templates/dcim/device/powerports.html:24 +msgid "Add Power Port" +msgstr "電源ポートを追加" + +#: templates/dcim/device/rearports.html:24 +msgid "Add Rear Ports" +msgstr "背面ポートを追加" + +#: templates/dcim/device/render_config.html:5 +#: templates/virtualization/virtualmachine/render_config.html:5 +msgid "Config" +msgstr "コンフィグ" + +#: templates/dcim/device/render_config.html:37 +#: templates/virtualization/virtualmachine/render_config.html:37 +msgid "Context Data" +msgstr "コンテキストデータ" + +#: templates/dcim/device/render_config.html:57 +#: templates/virtualization/virtualmachine/render_config.html:57 +msgid "Download" +msgstr "[ダウンロード]" + +#: templates/dcim/device/render_config.html:60 +#: templates/virtualization/virtualmachine/render_config.html:60 +msgid "Rendered Config" +msgstr "レンダリング設定" + +#: templates/dcim/device/render_config.html:65 +#: templates/virtualization/virtualmachine/render_config.html:65 +msgid "No configuration template found" +msgstr "設定テンプレートが見つかりません" + +#: templates/dcim/device_edit.html:44 +msgid "Parent Bay" +msgstr "ペアレントベイ" + +#: templates/dcim/device_edit.html:48 +#: utilities/templates/form_helpers/render_field.html:20 +msgid "Regenerate Slug" +msgstr "リジェネレートスラッグ" + +#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:7 +#: utilities/templates/helpers/table_config_form.html:23 +msgid "Remove" +msgstr "[削除]" + +#: templates/dcim/device_edit.html:110 +msgid "Local Config Context Data" +msgstr "ローカル設定コンテキストデータ" + +#: templates/dcim/device_list.html:82 +#: templates/dcim/devicetype/component_templates.html:18 +#: templates/dcim/moduletype/component_templates.html:18 +#: templates/generic/bulk_rename.html:34 +#: templates/virtualization/virtualmachine/interfaces.html:11 +#: templates/virtualization/virtualmachine/virtual_disks.html:11 +msgid "Rename" +msgstr "名前を変更" + +#: templates/dcim/devicebay.html:18 +msgid "Device Bay" +msgstr "デバイスベイ" + +#: templates/dcim/devicebay.html:48 +msgid "Installed Device" +msgstr "インストール済みデバイス" + +#: templates/dcim/devicebay_delete.html:6 +#, python-format +msgid "Delete device bay %(devicebay)s?" +msgstr "デバイスベイの削除 %(devicebay)s?" + +#: templates/dcim/devicebay_delete.html:11 +#, python-format +msgid "" +"Are you sure you want to delete this device bay from " +"%(device)s?" +msgstr "このデバイスベイをから削除してよろしいですか %(device)s?" + +#: templates/dcim/devicebay_depopulate.html:6 +#, python-format +msgid "Remove %(device)s from %(device_bay)s?" +msgstr "[削除] %(device)s から %(device_bay)s?" + +#: templates/dcim/devicebay_depopulate.html:13 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from " +"%(device_bay)s?" +msgstr "" +"本当に削除してもよろしいですか %(device)s から " +"%(device_bay)s?" + +#: templates/dcim/devicebay_populate.html:13 +msgid "Populate" +msgstr "住む" + +#: templates/dcim/devicebay_populate.html:22 +msgid "Bay" +msgstr "ベイ" + +#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +msgid "Add Device" +msgstr "[デバイスを追加]" + +#: templates/dcim/devicerole.html:43 +msgid "VM Role" +msgstr "仮想マシンの役割" + +#: templates/dcim/devicetype.html:21 templates/dcim/moduletype.html:19 +msgid "Model Name" +msgstr "[モデル名]" + +#: templates/dcim/devicetype.html:28 templates/dcim/moduletype.html:23 +msgid "Part Number" +msgstr "パーツ番号" + +#: templates/dcim/devicetype.html:40 +msgid "Height (U" +msgstr "高さ (U)" + +#: templates/dcim/devicetype.html:44 +msgid "Exclude From Utilization" +msgstr "利用から除外" + +#: templates/dcim/devicetype.html:62 +msgid "Parent/Child" +msgstr "親/子" + +#: templates/dcim/devicetype.html:74 +msgid "Front Image" +msgstr "フロントイメージ" + +#: templates/dcim/devicetype.html:86 +msgid "Rear Image" +msgstr "背面画像" + +#: templates/dcim/frontport.html:57 +msgid "Rear Port Position" +msgstr "リアポート位置" + +#: templates/dcim/frontport.html:79 templates/dcim/interface.html:150 +#: templates/dcim/poweroutlet.html:67 templates/dcim/powerport.html:67 +#: templates/dcim/rearport.html:75 +msgid "Marked as Connected" +msgstr "接続済みとしてマークされています" + +#: templates/dcim/frontport.html:93 templates/dcim/rearport.html:89 +msgid "Connection Status" +msgstr "接続ステータス" + +#: templates/dcim/inc/cable_termination.html:65 +msgid "No termination" +msgstr "終了なし" + +#: templates/dcim/inc/cable_toggle_buttons.html:4 +msgid "Mark Planned" +msgstr "マーク・プランド" + +#: templates/dcim/inc/cable_toggle_buttons.html:8 +msgid "Mark Installed" +msgstr "インストール済みとマークする" + +#: templates/dcim/inc/connection_endpoints.html:13 +msgid "Path Status" +msgstr "パスステータス" + +#: templates/dcim/inc/connection_endpoints.html:18 +msgid "Not Reachable" +msgstr "アクセス不可" + +#: templates/dcim/inc/connection_endpoints.html:23 +msgid "Path Endpoints" +msgstr "パスエンドポイント" + +#: templates/dcim/inc/endpoint_connection.html:8 +#: templates/dcim/powerfeed.html:128 templates/dcim/rearport.html:101 +msgid "Not connected" +msgstr "接続されていません" + +#: templates/dcim/inc/interface_vlans_table.html:6 +msgid "Untagged" +msgstr "タグなし" + +#: templates/dcim/inc/interface_vlans_table.html:37 +msgid "No VLANs Assigned" +msgstr "VLAN が割り当てられていません" + +#: templates/dcim/inc/interface_vlans_table.html:44 +#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +msgid "Clear" +msgstr "クリア" + +#: templates/dcim/inc/interface_vlans_table.html:47 +msgid "Clear All" +msgstr "[すべてクリア]" + +#: templates/dcim/interface.html:17 +msgid "Add Child Interface" +msgstr "子インターフェースの追加" + +#: templates/dcim/interface.html:51 +msgid "Speed/Duplex" +msgstr "スピード/デュプレックス" + +#: templates/dcim/interface.html:74 +msgid "PoE Mode" +msgstr "PoE モード" + +#: templates/dcim/interface.html:78 +msgid "PoE Type" +msgstr "PoE タイプ" + +#: templates/dcim/interface.html:82 +#: templates/virtualization/vminterface.html:66 +msgid "802.1Q Mode" +msgstr "802.1Q モード" + +#: templates/dcim/interface.html:130 +#: templates/virtualization/vminterface.html:62 +msgid "MAC Address" +msgstr "MAC アドレス" + +#: templates/dcim/interface.html:157 +msgid "Wireless Link" +msgstr "ワイヤレスリンク" + +#: templates/dcim/interface.html:226 vpn/choices.py:55 +msgid "Peer" +msgstr "ピア" + +#: templates/dcim/interface.html:238 +#: templates/wireless/inc/wirelesslink_interface.html:26 +msgid "Channel" +msgstr "チャネル" + +#: templates/dcim/interface.html:247 +#: templates/wireless/inc/wirelesslink_interface.html:32 +msgid "Channel Frequency" +msgstr "チャンネル周波数" + +#: templates/dcim/interface.html:250 templates/dcim/interface.html:258 +#: templates/dcim/interface.html:269 templates/dcim/interface.html:277 +msgid "MHz" +msgstr "メガヘルツ" + +#: templates/dcim/interface.html:266 +#: templates/wireless/inc/wirelesslink_interface.html:42 +msgid "Channel Width" +msgstr "チャンネル幅" + +#: templates/dcim/interface.html:295 templates/wireless/wirelesslan.html:15 +#: templates/wireless/wirelesslink.html:24 wireless/forms/bulk_edit.py:59 +#: wireless/forms/bulk_edit.py:101 wireless/forms/filtersets.py:39 +#: wireless/forms/filtersets.py:79 wireless/models.py:81 +#: wireless/models.py:155 wireless/tables/wirelesslan.py:44 +msgid "SSID" +msgstr "言った" + +#: templates/dcim/interface.html:316 +msgid "LAG Members" +msgstr "LAG メンバー" + +#: templates/dcim/interface.html:335 +msgid "No member interfaces" +msgstr "メンバーインターフェースなし" + +#: templates/dcim/interface.html:359 templates/ipam/fhrpgroup.html:80 +#: templates/ipam/iprange/ip_addresses.html:7 +#: templates/ipam/prefix/ip_addresses.html:7 +#: templates/virtualization/vminterface.html:96 +msgid "Add IP Address" +msgstr "IP アドレスを追加" + +#: templates/dcim/inventoryitem.html:25 +msgid "Parent Item" +msgstr "親アイテム" + +#: templates/dcim/inventoryitem.html:49 +msgid "Part ID" +msgstr "パーツ ID" + +#: templates/dcim/inventoryitem_bulk_delete.html:5 +msgid "This will also delete all child inventory items of those listed" +msgstr "これにより、リストされている商品の子在庫アイテムもすべて削除されます。" + +#: templates/dcim/inventoryitem_edit.html:33 +msgid "Component Assignment" +msgstr "コンポーネント割り当て" + +#: templates/dcim/inventoryitem_edit.html:59 +#: templates/dcim/poweroutlet.html:18 templates/dcim/powerport.html:81 +msgid "Power Outlet" +msgstr "電源コンセント" + +#: templates/dcim/location.html:17 +msgid "Add Child Location" +msgstr "お子様の所在地を追加" + +#: templates/dcim/location.html:76 +msgid "Child Locations" +msgstr "チャイルドロケーション" + +#: templates/dcim/location.html:84 templates/dcim/site.html:137 +msgid "Add a Location" +msgstr "ロケーションを追加" + +#: templates/dcim/location.html:98 templates/dcim/site.html:151 +msgid "Add a Device" +msgstr "デバイスを追加" + +#: templates/dcim/manufacturer.html:16 +msgid "Add Device Type" +msgstr "デバイスタイプを追加" + +#: templates/dcim/manufacturer.html:21 +msgid "Add Module Type" +msgstr "モジュールタイプを追加" + +#: templates/dcim/powerfeed.html:56 +msgid "Connected Device" +msgstr "接続デバイス" + +#: templates/dcim/powerfeed.html:66 +msgid "Utilization (Allocated" +msgstr "使用率 (割り当て済み)" + +#: templates/dcim/powerfeed.html:85 +msgid "Electrical Characteristics" +msgstr "電気的特性" + +#: templates/dcim/powerfeed.html:95 +msgctxt "Abbreviation for volts" +msgid "V" +msgstr "V" + +#: templates/dcim/powerfeed.html:99 +msgctxt "Abbreviation for amperes" +msgid "A" +msgstr "A" + +#: templates/dcim/poweroutlet.html:51 +msgid "Feed Leg" +msgstr "フィードレッグ" + +#: templates/dcim/powerpanel.html:77 +msgid "Add Power Feeds" +msgstr "パワーフィードの追加" + +#: templates/dcim/powerport.html:47 +msgid "Maximum Draw" +msgstr "最大ドロー" + +#: templates/dcim/powerport.html:51 +msgid "Allocated Draw" +msgstr "割り当てられた抽選" + +#: templates/dcim/rack.html:66 +msgid "Space Utilization" +msgstr "スペース活用" + +#: templates/dcim/rack.html:96 +msgid "descending" +msgstr "降順" + +#: templates/dcim/rack.html:96 +msgid "ascending" +msgstr "上昇" + +#: templates/dcim/rack.html:99 +msgid "Starting Unit" +msgstr "起動ユニット" + +#: templates/dcim/rack.html:125 +msgid "Mounting Depth" +msgstr "取り付け奥行き" + +#: templates/dcim/rack.html:135 +msgid "Rack Weight" +msgstr "ラック重量" + +#: templates/dcim/rack.html:145 templates/dcim/rack_edit.html:67 +msgid "Maximum Weight" +msgstr "最大重量" + +#: templates/dcim/rack.html:155 +msgid "Total Weight" +msgstr "合計重量" + +#: templates/dcim/rack.html:173 templates/dcim/rack_elevation_list.html:16 +msgid "Images and Labels" +msgstr "画像とラベル" + +#: templates/dcim/rack.html:174 templates/dcim/rack_elevation_list.html:17 +msgid "Images only" +msgstr "画像のみ" + +#: templates/dcim/rack.html:175 templates/dcim/rack_elevation_list.html:18 +msgid "Labels only" +msgstr "ラベルのみ" + +#: templates/dcim/rack/reservations.html:9 +msgid "Add reservation" +msgstr "予約を追加" + +#: templates/dcim/rack_edit.html:21 +msgid "Inventory Control" +msgstr "インベントリ管理" + +#: templates/dcim/rack_edit.html:45 +msgid "Outer Dimensions" +msgstr "外形寸法" + +#: templates/dcim/rack_edit.html:56 templates/dcim/rack_edit.html:71 +msgid "Unit" +msgstr "単位" + +#: templates/dcim/rack_elevation_list.html:12 +msgid "View List" +msgstr "リストを表示" + +#: templates/dcim/rack_elevation_list.html:27 +msgid "Sort By" +msgstr "並び替え" + +#: templates/dcim/rack_elevation_list.html:77 +msgid "No Racks Found" +msgstr "ラックが見つかりません" + +#: templates/dcim/rack_list.html:8 +msgid "View Elevations" +msgstr "標高を表示" + +#: templates/dcim/rackreservation.html:47 +msgid "Reservation Details" +msgstr "予約詳細" + +#: templates/dcim/rackrole.html:10 +msgid "Add Rack" +msgstr "ラックを追加" + +#: templates/dcim/rearport.html:53 +msgid "Positions" +msgstr "ポジション" + +#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +msgid "Add Site" +msgstr "サイトを追加" + +#: templates/dcim/region.html:56 +msgid "Child Regions" +msgstr "子地域" + +#: templates/dcim/region.html:64 +msgid "Add Region" +msgstr "地域を追加" + +#: templates/dcim/site.html:56 +msgid "Facility" +msgstr "ファシリティ" + +#: templates/dcim/site.html:64 +msgid "Time Zone" +msgstr "タイムゾーン" + +#: templates/dcim/site.html:67 +msgid "UTC" +msgstr "UTC" + +#: templates/dcim/site.html:68 +msgid "Site time" +msgstr "サイトタイム" + +#: templates/dcim/site.html:75 +msgid "Physical Address" +msgstr "物理アドレス" + +#: templates/dcim/site.html:81 +msgid "Map" +msgstr "マップ" + +#: templates/dcim/site.html:92 +msgid "Shipping Address" +msgstr "配送先住所" + +#: templates/dcim/sitegroup.html:56 templates/tenancy/contactgroup.html:49 +#: templates/tenancy/tenantgroup.html:58 +#: templates/wireless/wirelesslangroup.html:56 +msgid "Child Groups" +msgstr "チャイルド・グループ" + +#: templates/dcim/sitegroup.html:64 +msgid "Add Site Group" +msgstr "サイトグループを追加" + +#: templates/dcim/trace/attachment.html:5 +#: templates/extras/exporttemplate.html:37 +msgid "Attachment" +msgstr "アタッチメント" + +#: templates/dcim/virtualchassis.html:86 +msgid "Add Member" +msgstr "メンバーを追加" + +#: templates/dcim/virtualchassis_add.html:18 +msgid "Member Devices" +msgstr "メンバーデバイス" + +#: templates/dcim/virtualchassis_add_member.html:6 +#, python-format +msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" +msgstr "バーチャルシャーシへの新規メンバーの追加 %(virtual_chassis)s" + +#: templates/dcim/virtualchassis_add_member.html:17 +msgid "Add New Member" +msgstr "新しいメンバーを追加" + +#: templates/dcim/virtualchassis_add_member.html:25 +msgid "Add Another" +msgstr "もう一つ追加" + +#: templates/dcim/virtualchassis_edit.html:7 +#, python-format +msgid "Editing Virtual Chassis %(name)s" +msgstr "バーチャルシャーシの編集 %(name)s" + +#: templates/dcim/virtualchassis_edit.html:54 +msgid "Rack/Unit" +msgstr "ラック/ユニット" + +#: templates/dcim/virtualchassis_remove_member.html:5 +msgid "Remove Virtual Chassis Member" +msgstr "バーチャルシャーシメンバーの削除" + +#: templates/dcim/virtualchassis_remove_member.html:9 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from virtual " +"chassis %(name)s?" +msgstr "本当に削除してもよろしいですか %(device)s バーチャルシャーシから %(name)s?" + +#: templates/dcim/virtualdevicecontext.html:29 templates/vpn/l2vpn.html:19 +msgid "Identifier" +msgstr "識別子" + +#: templates/exceptions/import_error.html:6 +msgid "" +"A module import error occurred during this request. Common causes include " +"the following:" +msgstr "このリクエスト中にモジュールインポートエラーが発生しました。一般的な原因には次のものがあります。" + +#: templates/exceptions/import_error.html:10 +msgid "Missing required packages" +msgstr "必要なパッケージが見つかりません" + +#: templates/exceptions/import_error.html:11 +msgid "" +"This installation of NetBox might be missing one or more required Python " +"packages. These packages are listed in requirements.txt and " +"local_requirements.txt, and are normally installed as part of " +"the installation or upgrade process. To verify installed packages, run " +"pip freeze from the console and compare the output to the list " +"of required packages." +msgstr "" +"この NetBox のインストールには、必要な Python パッケージが 1 " +"つ以上欠けている可能性があります。これらのパッケージは、に一覧表示されています。 requirements.txt そして " +"local_requirements.txt、通常はインストールまたはアップグレードプロセスの一部としてインストールされます。インストールされたパッケージを確認するには、以下を実行します。" +" ピップフリーズ コンソールから、出力を必要なパッケージのリストと比較します。" + +#: templates/exceptions/import_error.html:20 +msgid "WSGI service not restarted after upgrade" +msgstr "アップグレード後に WSGI サービスが再起動されない" + +#: templates/exceptions/import_error.html:21 +msgid "" +"If this installation has recently been upgraded, check that the WSGI service" +" (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" +" is running." +msgstr "" +"このインストールが最近アップグレードされた場合は、WSGI サービス (gunicorn や uWSGI など) " +"が再起動されていることを確認してください。これにより、新しいコードが確実に実行されていることを確認できます。" + +#: templates/exceptions/permission_error.html:6 +msgid "" +"A file permission error was detected while processing this request. Common " +"causes include the following:" +msgstr "このリクエストの処理中に、ファイル権限エラーが検出されました。一般的な原因には次のものがあります。" + +#: templates/exceptions/permission_error.html:10 +msgid "Insufficient write permission to the media root" +msgstr "メディアルートへの書き込み権限が不十分です" + +#: templates/exceptions/permission_error.html:11 +#, python-format +msgid "" +"The configured media root is %(media_root)s. Ensure that the " +"user NetBox runs as has access to write files to all locations within this " +"path." +msgstr "" +"設定されているメディアルートは %(media_root)s。NetBox " +"を実行するユーザーに、このパス内のすべての場所にファイルを書き込む権限があることを確認してください。" + +#: templates/exceptions/programming_error.html:6 +msgid "" +"A database programming error was detected while processing this request. " +"Common causes include the following:" +msgstr "この要求の処理中に、データベースプログラミングエラーが検出されました。一般的な原因には次のものがあります。" + +#: templates/exceptions/programming_error.html:10 +msgid "Database migrations missing" +msgstr "データベースマイグレーションが見つかりません" + +#: templates/exceptions/programming_error.html:11 +msgid "" +"When upgrading to a new NetBox release, the upgrade script must be run to " +"apply any new database migrations. You can run migrations manually by " +"executing python3 manage.py migrate from the command line." +msgstr "" +"NetBox " +"の新しいリリースにアップグレードする場合、新しいデータベースマイグレーションを適用するには、アップグレードスクリプトを実行する必要があります。マイグレーションは以下を実行することで手動で実行できます。" +" python3 manage.py マイグレーション コマンドラインから。" + +#: templates/exceptions/programming_error.html:18 +msgid "Unsupported PostgreSQL version" +msgstr "サポートされていない PostgreSQL バージョン" + +#: templates/exceptions/programming_error.html:19 +msgid "" +"Ensure that PostgreSQL version 12 or later is in use. You can check this by " +"connecting to the database using NetBox's credentials and issuing a query " +"for SELECT VERSION()." +msgstr "" +"PostgreSQL バージョン 12 以降が使用されていることを確認してください。これを確認するには、NetBox " +"の認証情報を使用してデータベースに接続し、次のクエリを実行します。 バージョンを選択 ()。" + +#: templates/extras/admin/plugins_list.html:4 +#: templates/extras/admin/plugins_list.html:9 +#: templates/extras/admin/plugins_list.html:13 +msgid "Installed Plugins" +msgstr "インストール済みプラグイン" + +#: templates/extras/admin/plugins_list.html:23 +msgid "Package Name" +msgstr "パッケージ名" + +#: templates/extras/admin/plugins_list.html:24 +msgid "Author" +msgstr "著者" + +#: templates/extras/admin/plugins_list.html:25 +msgid "Author Email" +msgstr "著者の電子メール" + +#: templates/extras/admin/plugins_list.html:27 +#: templates/vpn/ipsecprofile.html:47 vpn/forms/bulk_edit.py:140 +#: vpn/forms/bulk_import.py:172 vpn/tables/crypto.py:61 +msgid "Version" +msgstr "[バージョン]" + +#: templates/extras/configcontext.html:46 +#: templates/extras/configtemplate.html:38 +#: templates/extras/exporttemplate.html:57 +msgid "The data file associated with this object has been deleted" +msgstr "このオブジェクトに関連するデータファイルは削除されました" + +#: templates/extras/configcontext.html:55 +#: templates/extras/configtemplate.html:47 +#: templates/extras/exporttemplate.html:66 +msgid "Data Synced" +msgstr "データ同期済み" + +#: templates/extras/configcontext_list.html:7 +#: templates/extras/configtemplate_list.html:7 +#: templates/extras/exporttemplate_list.html:7 +msgid "Sync Data" +msgstr "データを同期" + +#: templates/extras/configtemplate.html:58 +msgid "Environment Parameters" +msgstr "環境パラメーター" + +#: templates/extras/configtemplate.html:69 +#: templates/extras/exporttemplate.html:88 +msgid "Template" +msgstr "[テンプレート]" + +#: templates/extras/customfield.html:31 templates/extras/customlink.html:22 +msgid "Group Name" +msgstr "[グループ名]" + +#: templates/extras/customfield.html:43 +msgid "Cloneable" +msgstr "クローン可能" + +#: templates/extras/customfield.html:53 +msgid "Default Value" +msgstr "[既定値]" + +#: templates/extras/customfield.html:64 +msgid "Search Weight" +msgstr "検索重量" + +#: templates/extras/customfield.html:74 +msgid "Filter Logic" +msgstr "フィルターロジック" + +#: templates/extras/customfield.html:78 +msgid "Display Weight" +msgstr "ディスプレイ重量" + +#: templates/extras/customfield.html:82 +msgid "UI Visible" +msgstr "UI が表示される" + +#: templates/extras/customfield.html:86 +msgid "UI Editable" +msgstr "UI 編集可能" + +#: templates/extras/customfield.html:108 +msgid "Validation Rules" +msgstr "検証ルール" + +#: templates/extras/customfield.html:112 +msgid "Minimum Value" +msgstr "[最小値]" + +#: templates/extras/customfield.html:116 +msgid "Maximum Value" +msgstr "[最大値]" + +#: templates/extras/customfield.html:120 +msgid "Regular Expression" +msgstr "正規表現" + +#: templates/extras/customlink.html:30 +msgid "Button Class" +msgstr "ボタンクラス" + +#: templates/extras/customlink.html:41 templates/extras/exporttemplate.html:73 +#: templates/extras/savedfilter.html:41 +msgid "Assigned Models" +msgstr "割り当てられたモデル" + +#: templates/extras/customlink.html:57 +msgid "Link Text" +msgstr "リンクテキスト" + +#: templates/extras/customlink.html:65 +msgid "Link URL" +msgstr "リンク URL" + +#: templates/extras/dashboard/reset.html:4 templates/home.html:63 +msgid "Reset Dashboard" +msgstr "ダッシュボードをリセット" + +#: templates/extras/dashboard/reset.html:8 +msgid "" +"This will remove all configured widgets and restore the " +"default dashboard configuration." +msgstr "これにより削除されます すべて ウィジェットを構成し、デフォルトのダッシュボード設定を復元しました。" + +#: templates/extras/dashboard/reset.html:13 +msgid "" +"This change affects only your dashboard, and will not impact other " +"users." +msgstr "この変更の影響を受けるのは きみの ダッシュボード。他のユーザーには影響しません。" + +#: templates/extras/dashboard/widget_add.html:7 +msgid "Add a Widget" +msgstr "ウィジェットを追加" + +#: templates/extras/dashboard/widgets/bookmarks.html:14 +msgid "No bookmarks have been added yet." +msgstr "ブックマークはまだ追加されていません。" + +#: templates/extras/dashboard/widgets/objectcounts.html:15 +msgid "No permission" +msgstr "許可なし" + +#: templates/extras/dashboard/widgets/objectlist.html:6 +msgid "No permission to view this content" +msgstr "このコンテンツを閲覧する権限がありません" + +#: templates/extras/dashboard/widgets/objectlist.html:10 +msgid "Unable to load content. Invalid view name" +msgstr "コンテンツを読み込めません。ビュー名が無効です。" + +#: templates/extras/dashboard/widgets/rssfeed.html:12 +msgid "No content found" +msgstr "コンテンツが見つかりません" + +#: templates/extras/dashboard/widgets/rssfeed.html:18 +msgid "There was a problem fetching the RSS feed" +msgstr "RSS フィードの取得中に問題が発生しました" + +#: templates/extras/dashboard/widgets/rssfeed.html:21 +msgid "HTTP" +msgstr "HTTP" + +#: templates/extras/eventrule.html:63 +msgid "Job start" +msgstr "ジョブスタート" + +#: templates/extras/eventrule.html:67 +msgid "Job end" +msgstr "ジョブ終了" + +#: templates/extras/exporttemplate.html:29 +msgid "MIME Type" +msgstr "マイムタイプ" + +#: templates/extras/exporttemplate.html:33 +msgid "File Extension" +msgstr "[ファイル拡張子]" + +#: templates/extras/htmx/report_result.html:9 +#: templates/extras/htmx/script_result.html:10 +msgid "Scheduled for" +msgstr "予定日" + +#: templates/extras/htmx/report_result.html:14 +#: templates/extras/htmx/script_result.html:15 +msgid "Duration" +msgstr "所要時間" + +#: templates/extras/htmx/report_result.html:20 +msgid "Report Methods" +msgstr "レポート方法" + +#: templates/extras/htmx/report_result.html:38 +msgid "Report Results" +msgstr "レポート結果" + +#: templates/extras/htmx/report_result.html:44 +#: templates/extras/htmx/script_result.html:26 +msgid "Level" +msgstr "レベル" + +#: templates/extras/htmx/report_result.html:46 +#: templates/extras/htmx/script_result.html:27 +msgid "Message" +msgstr "メッセージ" + +#: templates/extras/htmx/script_result.html:21 +msgid "Script Log" +msgstr "スクリプトログ" + +#: templates/extras/htmx/script_result.html:25 +msgid "Line" +msgstr "ライン" + +#: templates/extras/htmx/script_result.html:38 +msgid "No log output" +msgstr "ログ出力なし" + +#: templates/extras/htmx/script_result.html:46 +msgid "Exec Time" +msgstr "実行時間" + +#: templates/extras/htmx/script_result.html:46 +msgctxt "Unit of time" +msgid "seconds" +msgstr "秒" + +#: templates/extras/htmx/script_result.html:50 +msgid "Output" +msgstr "出力" + +#: templates/extras/inc/result_pending.html:4 +msgid "Loading" +msgstr "読み込み中" + +#: templates/extras/inc/result_pending.html:6 +msgid "Results pending" +msgstr "結果は保留中です" + +#: templates/extras/journalentry.html:16 +msgid "Journal Entry" +msgstr "ジャーナルエントリ" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Change log retention" +msgstr "変更ログの保存" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "days" +msgstr "日々" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Indefinite" +msgstr "無期限" + +#: templates/extras/object_configcontext.html:11 +msgid "Rendered Context" +msgstr "レンダリングされたコンテキスト" + +#: templates/extras/object_configcontext.html:22 +msgid "Local Context" +msgstr "ローカルコンテキスト" + +#: templates/extras/object_configcontext.html:34 +msgid "The local config context overwrites all source contexts" +msgstr "ローカル設定コンテキストはすべてのソースコンテキストを上書きします" + +#: templates/extras/object_configcontext.html:40 +msgid "Source Contexts" +msgstr "ソースコンテキスト" + +#: templates/extras/object_journal.html:18 +msgid "New Journal Entry" +msgstr "新しいジャーナルエントリ" + +#: templates/extras/objectchange.html:29 +#: templates/users/objectpermission.html:45 +msgid "Change" +msgstr "変更" + +#: templates/extras/objectchange.html:84 +msgid "Difference" +msgstr "違い" + +#: templates/extras/objectchange.html:87 +msgid "Previous" +msgstr "前へ" + +#: templates/extras/objectchange.html:90 +msgid "Next" +msgstr "[次へ]" + +#: templates/extras/objectchange.html:98 +msgid "Object Created" +msgstr "オブジェクトが作成されました" + +#: templates/extras/objectchange.html:100 +msgid "Object Deleted" +msgstr "オブジェクトは削除されました" + +#: templates/extras/objectchange.html:102 +msgid "No Changes" +msgstr "変更なし" + +#: templates/extras/objectchange.html:117 +msgid "Pre-Change Data" +msgstr "変更前データ" + +#: templates/extras/objectchange.html:126 +msgid "Warning: Comparing non-atomic change to previous change record" +msgstr "警告:非アトミックな変更と以前の変更レコードの比較" + +#: templates/extras/objectchange.html:136 +msgid "Post-Change Data" +msgstr "変更後のデータ" + +#: templates/extras/objectchange.html:157 +#, python-format +msgid "See All %(count)s Changes" +msgstr "[すべて表示] %(count)s 変更点" + +#: templates/extras/report.html:14 +msgid "This report is invalid and cannot be run." +msgstr "このレポートは無効で、実行できません。" + +#: templates/extras/report.html:23 templates/extras/report_list.html:88 +msgid "Run Again" +msgstr "もう一度実行" + +#: templates/extras/report.html:25 templates/extras/report_list.html:90 +msgid "Run Report" +msgstr "レポートを実行" + +#: templates/extras/report.html:36 +msgid "Last run" +msgstr "ラストラン" + +#: templates/extras/report/base.html:30 +msgid "Report" +msgstr "報告書" + +#: templates/extras/report_list.html:48 templates/extras/script_list.html:54 +msgid "Last Run" +msgstr "ラストラン" + +#: templates/extras/report_list.html:70 templates/extras/script_list.html:77 +msgid "Never" +msgstr "決して" + +#: templates/extras/report_list.html:75 +msgid "Report has no test methods" +msgstr "レポートにはテストメソッドがありません" + +#: templates/extras/report_list.html:76 +msgid "Invalid" +msgstr "無効" + +#: templates/extras/report_list.html:125 +msgid "No Reports Found" +msgstr "レポートが見つかりません" + +#: templates/extras/report_list.html:128 +#, python-format +msgid "" +"Get started by creating a report from " +"an uploaded file or data source." +msgstr "" +"始めてみよう レポートの作成 " +"アップロードされたファイルまたはデータソースから。" + +#: templates/extras/script.html:13 +msgid "You do not have permission to run scripts" +msgstr "スクリプトを実行する権限がありません" + +#: templates/extras/script.html:37 +msgid "Run Script" +msgstr "[スクリプトを実行]" + +#: templates/extras/script_list.html:44 +#, python-format +msgid "" +"Script file at %(file_path)s could not be " +"loaded." +msgstr "スクリプトファイル %(file_path)s 読み込めませんでした。" + +#: templates/extras/script_list.html:91 +msgid "No Scripts Found" +msgstr "スクリプトが見つかりません" + +#: templates/extras/script_list.html:94 +#, python-format +msgid "" +"Get started by creating a script from " +"an uploaded file or data source." +msgstr "" +"始めてみよう スクリプトの作成 " +"アップロードされたファイルまたはデータソースから。" + +#: templates/extras/script_result.html:42 +msgid "Log" +msgstr "ログ" + +#: templates/extras/tag.html:35 +msgid "Tagged Items" +msgstr "タグ付きアイテム" + +#: templates/extras/tag.html:47 +msgid "Allowed Object Types" +msgstr "許可されるオブジェクトタイプ" + +#: templates/extras/tag.html:56 +msgid "Any" +msgstr "任意" + +#: templates/extras/tag.html:63 +msgid "Tagged Item Types" +msgstr "タグ付きアイテムタイプ" + +#: templates/extras/tag.html:89 +msgid "Tagged Objects" +msgstr "タグ付きオブジェクト" + +#: templates/extras/webhook.html:33 +msgid "HTTP Method" +msgstr "HTTP メソッド" + +#: templates/extras/webhook.html:41 +msgid "HTTP Content Type" +msgstr "HTTP コンテンツタイプ" + +#: templates/extras/webhook.html:58 +msgid "SSL Verification" +msgstr "SSL 検証" + +#: templates/extras/webhook.html:73 +msgid "Additional Headers" +msgstr "その他のヘッダー" + +#: templates/extras/webhook.html:85 +msgid "Body Template" +msgstr "ボディテンプレート" + +#: templates/generic/bulk_add_component.html:15 +msgid "Bulk Creation" +msgstr "一括作成" + +#: templates/generic/bulk_add_component.html:20 +#: templates/generic/bulk_edit.html:28 +msgid "Selected Objects" +msgstr "[選択オブジェクト]" + +#: templates/generic/bulk_add_component.html:46 +msgid "to Add" +msgstr "追加するには" + +#: templates/generic/bulk_delete.html:24 +msgid "Confirm Bulk Deletion" +msgstr "一括削除を確認" + +#: templates/generic/bulk_delete.html:26 +msgctxt "Noun" +msgid "Warning" +msgstr "警告" + +#: templates/generic/bulk_delete.html:27 +#, python-format +msgid "" +"The following operation will delete %(count)s " +"%(type_plural)s. Please carefully review the objects to be deleted and " +"confirm below." +msgstr "" +"次の操作で削除されます %(count)s " +"%(type_plural)s。削除するオブジェクトを注意深く確認し、以下を確認してください。" + +#: templates/generic/bulk_edit.html:16 templates/generic/object_edit.html:17 +msgid "Editing" +msgstr "編集" + +#: templates/generic/bulk_edit.html:23 +msgid "Bulk Edit" +msgstr "一括編集" + +#: templates/generic/bulk_edit.html:124 templates/generic/bulk_rename.html:42 +msgid "Apply" +msgstr "申し込む" + +#: templates/generic/bulk_import.html:14 +msgid "Bulk Import" +msgstr "一括インポート" + +#: templates/generic/bulk_import.html:20 +msgid "Direct Import" +msgstr "直接インポート" + +#: templates/generic/bulk_import.html:25 +msgid "Upload File" +msgstr "[ファイルをアップロード]" + +#: templates/generic/bulk_import.html:51 templates/generic/bulk_import.html:73 +#: templates/generic/bulk_import.html:95 +msgid "Submit" +msgstr "送信" + +#: templates/generic/bulk_import.html:110 +msgid "Field Options" +msgstr "フィールドオプション" + +#: templates/generic/bulk_import.html:117 +msgid "Accessor" +msgstr "アクセサ" + +#: templates/generic/bulk_import.html:154 +msgid "Import Value" +msgstr "インポート値" + +#: templates/generic/bulk_import.html:181 +msgid "Format: YYYY-MM-DD" +msgstr "フォーマット:YYYY-MM-DD" + +#: templates/generic/bulk_import.html:183 +msgid "Specify true or false" +msgstr "[真] または [偽] を指定してください" + +#: templates/generic/bulk_import.html:195 +msgid "Required fields must be specified for all objects." +msgstr "必須フィールド しなければならない すべてのオブジェクトに指定してください。" + +#: templates/generic/bulk_import.html:201 +#, python-format +msgid "" +"Related objects may be referenced by any unique attribute. For example, " +"%(example)s would identify a VRF by its route distinguisher." +msgstr "" +"関連オブジェクトは、任意の一意の属性で参照できます。たとえば、 %(example)s VRF はルート識別子で識別されます。" + +#: templates/generic/bulk_remove.html:13 +msgid "Confirm Bulk Removal" +msgstr "一括削除を確認" + +#: templates/generic/bulk_remove.html:15 +#, python-format +msgid "" +"Warning: The following operation will remove %(count)s " +"%(obj_type_plural)s from %(parent_obj)s." +msgstr "" +"警告: 次の操作で削除します %(count)s %(obj_type_plural)s から " +"%(parent_obj)s。" + +#: templates/generic/bulk_remove.html:21 +#, python-format +msgid "" +"Please carefully review the %(obj_type_plural)s to be removed and confirm " +"below." +msgstr "よく確認してください %(obj_type_plural)s 削除する予定。以下で確認する。" + +#: templates/generic/bulk_remove.html:38 +#, python-format +msgid "Delete these %(count)s %(obj_type_plural)s" +msgstr "これらを削除 %(count)s %(obj_type_plural)s" + +#: templates/generic/bulk_rename.html:7 +msgid "Renaming" +msgstr "名前変更" + +#: templates/generic/bulk_rename.html:16 +msgid "Current Name" +msgstr "現在の名前" + +#: templates/generic/bulk_rename.html:17 +msgid "New Name" +msgstr "新しい名前" + +#: templates/generic/bulk_rename.html:40 +#: utilities/templates/widgets/markdown_input.html:11 +msgid "Preview" +msgstr "プレビュー" + +#: templates/generic/confirmation_form.html:16 +msgid "Are you sure" +msgstr "よろしいですか" + +#: templates/generic/confirmation_form.html:19 +msgid "Confirm" +msgstr "確認" + +#: templates/generic/object.html:51 +msgid "ago" +msgstr "前に" + +#: templates/generic/object_children.html:27 +#: utilities/templates/buttons/bulk_edit.html:4 +msgid "Edit Selected" +msgstr "選択項目を編集" + +#: templates/generic/object_children.html:41 +#: utilities/templates/buttons/bulk_delete.html:4 +msgid "Delete Selected" +msgstr "選択項目を削除" + +#: templates/generic/object_edit.html:19 +#, python-format +msgid "Add a new %(object_type)s" +msgstr "新規追加 %(object_type)s" + +#: templates/generic/object_edit.html:47 +msgid "View model documentation" +msgstr "モデルドキュメンテーションを見る" + +#: templates/generic/object_edit.html:48 +msgid "Help" +msgstr "ヘルプ" + +#: templates/generic/object_edit.html:73 +msgid "Create & Add Another" +msgstr "作成して別のものを追加" + +#: templates/generic/object_list.html:48 templates/search.html:13 +msgid "Results" +msgstr "結果" + +#: templates/generic/object_list.html:54 +msgid "Filters" +msgstr "フィルター" + +#: templates/generic/object_list.html:94 +#, python-format +msgid "" +"Select all %(count)s %(object_type_plural)s matching query" +msgstr "[選択] すべて %(count)s %(object_type_plural)s マッチングクエリ" + +#: templates/home.html:12 +msgid "New Release Available" +msgstr "新しいリリースが入手可能" + +#: templates/home.html:14 +msgid "is available" +msgstr "利用可能です" + +#: templates/home.html:17 +msgctxt "Document title" +msgid "Upgrade Instructions" +msgstr "アップグレード手順" + +#: templates/home.html:37 +msgid "Unlock Dashboard" +msgstr "ダッシュボードのロック解除" + +#: templates/home.html:46 +msgid "Lock Dashboard" +msgstr "ロックダッシュボード" + +#: templates/home.html:57 +msgid "Add Widget" +msgstr "ウィジェットを追加" + +#: templates/home.html:60 +msgid "Save Layout" +msgstr "[レイアウトを保存]" + +#: templates/htmx/delete_form.html:7 +msgid "Confirm Deletion" +msgstr "削除を確認" + +#: templates/htmx/delete_form.html:11 +#, python-format +msgid "" +"Are you sure you want to delete " +"%(object_type)s %(object)s?" +msgstr "" +"本当にしたいですか 削除する %(object_type)s " +"%(object)s?" + +#: templates/htmx/delete_form.html:17 +msgid "The following objects will be deleted as a result of this action." +msgstr "このアクションの結果、次のオブジェクトが削除されます。" + +#: templates/htmx/object_selector.html:5 +msgid "Select" +msgstr "[選択]" + +#: templates/inc/filter_list.html:50 +#: utilities/templates/helpers/table_config_form.html:39 +msgid "Reset" +msgstr "リセット" + +#: templates/inc/missing_prerequisites.html:7 +#, python-format +msgid "" +"Before you can add a %(model)s you must first create a " +"%(prerequisite_model)s." +msgstr "" +"追加する前に %(model)s 最初に作成する必要があります %(prerequisite_model)s。" + +#: templates/inc/paginator.html:38 templates/inc/paginator_htmx.html:53 +msgid "Per Page" +msgstr "1 ページあたり" + +#: templates/inc/paginator.html:49 templates/inc/paginator_htmx.html:69 +#, python-format +msgid "Showing %(start)s-%(end)s of %(total)s" +msgstr "表示中 %(start)s-%(end)s の %(total)s" + +#: templates/inc/panels/image_attachments.html:10 +msgid "Attach an image" +msgstr "画像を添付" + +#: templates/inc/panels/related_objects.html:5 +msgid "Related Objects" +msgstr "関連オブジェクト" + +#: templates/inc/panels/tags.html:11 +msgid "No tags assigned" +msgstr "タグが割り当てられていません" + +#: templates/inc/profile_button.html:12 templates/inc/profile_button.html:62 +msgid "Dark Mode" +msgstr "ダークモード" + +#: templates/inc/profile_button.html:45 +msgid "Log Out" +msgstr "ログアウト" + +#: templates/inc/profile_button.html:53 +msgid "Log In" +msgstr "ログイン" + +#: templates/inc/sync_warning.html:7 +msgid "Data is out of sync with upstream file" +msgstr "データはアップストリームファイルと同期していません" + +#: templates/inc/table_controls_htmx.html:16 +#: templates/inc/table_controls_htmx.html:18 +msgid "Configure Table" +msgstr "テーブルを設定" + +#: templates/ipam/aggregate.html:15 templates/ipam/ipaddress.html:17 +#: templates/ipam/iprange.html:16 templates/ipam/prefix.html:16 +msgid "Family" +msgstr "ファミリー" + +#: templates/ipam/aggregate.html:40 +msgid "Date Added" +msgstr "追加日" + +#: templates/ipam/aggregate/prefixes.html:8 +#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +msgid "Add Prefix" +msgstr "プレフィックスを追加" + +#: templates/ipam/asn.html:24 +msgid "AS Number" +msgstr "AS 番号" + +#: templates/ipam/fhrpgroup.html:55 +msgid "Authentication Type" +msgstr "認証タイプ" + +#: templates/ipam/fhrpgroup.html:59 +msgid "Authentication Key" +msgstr "認証キー" + +#: templates/ipam/fhrpgroup.html:72 +msgid "Virtual IP Addresses" +msgstr "仮想 IP アドレス" + +#: templates/ipam/fhrpgroupassignment_edit.html:8 +msgid "FHRP Group Assignment" +msgstr "FHRP グループアサイメント" + +#: templates/ipam/inc/ipaddress_edit_header.html:19 +msgid "Assign IP" +msgstr "IP アドレスを割り当てる" + +#: templates/ipam/inc/ipaddress_edit_header.html:28 +msgid "Bulk Create" +msgstr "一括作成" + +#: templates/ipam/inc/panels/fhrp_groups.html:12 +msgid "Virtual IPs" +msgstr "仮想 IP" + +#: templates/ipam/inc/panels/fhrp_groups.html:52 +msgid "Create Group" +msgstr "[グループを作成]" + +#: templates/ipam/inc/panels/fhrp_groups.html:57 +msgid "Assign Group" +msgstr "グループを割り当て" + +#: templates/ipam/inc/toggle_available.html:7 +msgid "Show Assigned" +msgstr "割り当て済みを表示" + +#: templates/ipam/inc/toggle_available.html:10 +msgid "Show Available" +msgstr "ショー利用可能" + +#: templates/ipam/inc/toggle_available.html:13 +msgid "Show All" +msgstr "[すべて表示]" + +#: templates/ipam/ipaddress.html:26 templates/ipam/iprange.html:48 +#: templates/ipam/prefix.html:25 +msgid "Global" +msgstr "グローバル" + +#: templates/ipam/ipaddress.html:88 +msgid "NAT (outside)" +msgstr "NAT (アウトサイド)" + +#: templates/ipam/ipaddress_assign.html:8 +msgid "Assign an IP Address" +msgstr "IP アドレスを割り当てる" + +#: templates/ipam/ipaddress_assign.html:23 +msgid "Select IP Address" +msgstr "IP アドレスを選択" + +#: templates/ipam/ipaddress_assign.html:39 +msgid "Search Results" +msgstr "[検索結果]" + +#: templates/ipam/ipaddress_bulk_add.html:6 +msgid "Bulk Add IP Addresses" +msgstr "IP アドレスを一括追加" + +#: templates/ipam/ipaddress_edit.html:35 +msgid "Interface Assignment" +msgstr "インターフェース割り当て" + +#: templates/ipam/ipaddress_edit.html:74 +msgid "NAT IP (Inside" +msgstr "NAT IP (インサイド)" + +#: templates/ipam/iprange.html:20 +msgid "Starting Address" +msgstr "開始アドレス" + +#: templates/ipam/iprange.html:24 +msgid "Ending Address" +msgstr "終了アドレス" + +#: templates/ipam/iprange.html:36 templates/ipam/prefix.html:104 +msgid "Marked fully utilized" +msgstr "「完全使用済み」とマークされています" + +#: templates/ipam/prefix.html:112 +msgid "Child IPs" +msgstr "子供 IP" + +#: templates/ipam/prefix.html:120 +msgid "Available IPs" +msgstr "使用可能な IP" + +#: templates/ipam/prefix.html:132 +msgid "First available IP" +msgstr "最初に利用可能な IP" + +#: templates/ipam/prefix.html:151 +msgid "Addressing Details" +msgstr "アドレス詳細" + +#: templates/ipam/prefix.html:181 +msgid "Prefix Details" +msgstr "プレフィックスの詳細" + +#: templates/ipam/prefix.html:187 +msgid "Network Address" +msgstr "ネットワークアドレス" + +#: templates/ipam/prefix.html:191 +msgid "Network Mask" +msgstr "ネットワークマスク" + +#: templates/ipam/prefix.html:195 +msgid "Wildcard Mask" +msgstr "ワイルドカードマスク" + +#: templates/ipam/prefix.html:199 +msgid "Broadcast Address" +msgstr "ブロードキャストアドレス" + +#: templates/ipam/prefix/ip_ranges.html:7 +msgid "Add IP Range" +msgstr "IP アドレス範囲を追加" + +#: templates/ipam/prefix_list.html:7 +msgid "Hide Depth Indicators" +msgstr "深度インジケーターを非表示" + +#: templates/ipam/prefix_list.html:11 +msgid "Max Depth" +msgstr "最大深度" + +#: templates/ipam/prefix_list.html:28 +msgid "Max Length" +msgstr "[最大長]" + +#: templates/ipam/rir.html:10 +msgid "Add Aggregate" +msgstr "アグリゲートを追加" + +#: templates/ipam/routetarget.html:10 +msgid "Route Target" +msgstr "ルートターゲット" + +#: templates/ipam/routetarget.html:40 +msgid "Importing VRFs" +msgstr "VRF のインポート" + +#: templates/ipam/routetarget.html:49 +msgid "Exporting VRFs" +msgstr "VRF のエクスポート" + +#: templates/ipam/routetarget.html:60 +msgid "Importing L2VPNs" +msgstr "L2VPN のインポート" + +#: templates/ipam/routetarget.html:69 +msgid "Exporting L2VPNs" +msgstr "L2VPN のエクスポート" + +#: templates/ipam/service.html:22 templates/ipam/service_create.html:8 +#: templates/ipam/service_edit.html:8 +msgid "Service" +msgstr "サービス" + +#: templates/ipam/service_create.html:43 +msgid "From Template" +msgstr "テンプレートから" + +#: templates/ipam/service_create.html:48 +msgid "Custom" +msgstr "カスタム" + +#: templates/ipam/service_edit.html:37 +msgid "Port(s)" +msgstr "ポート (s)" + +#: templates/ipam/vlan.html:95 +msgid "Add a Prefix" +msgstr "プレフィックスを追加" + +#: templates/ipam/vlangroup.html:18 +msgid "Add VLAN" +msgstr "VLAN の追加" + +#: templates/ipam/vlangroup.html:43 +msgid "Permitted VIDs" +msgstr "許可されているビデオ" + +#: templates/ipam/vrf.html:19 +msgid "Route Distinguisher" +msgstr "ルート識別子" + +#: templates/ipam/vrf.html:32 +msgid "Unique IP Space" +msgstr "ユニークな IP スペース" + +#: templates/login.html:20 +#: utilities/templates/form_helpers/render_errors.html:7 +msgid "Errors" +msgstr "エラー" + +#: templates/login.html:48 +msgid "Sign In" +msgstr "サインイン" + +#: templates/login.html:54 +msgid "Or use a single sign-on (SSO) provider" +msgstr "または、シングルサインオン (SSO) プロバイダーを使用する" + +#: templates/login.html:68 +msgid "Toggle Color Mode" +msgstr "カラーモードを切り替え" + +#: templates/media_failure.html:7 +msgid "Static Media Failure - NetBox" +msgstr "スタティックメディア障害-NetBox" + +#: templates/media_failure.html:21 +msgid "Static Media Failure" +msgstr "スタティックメディア障害" + +#: templates/media_failure.html:23 +msgid "The following static media file failed to load" +msgstr "次の静的メディアファイルを読み込めませんでした" + +#: templates/media_failure.html:26 +msgid "Check the following" +msgstr "以下を確認してください" + +#: templates/media_failure.html:29 +msgid "" +"manage.py collectstatic was run during the most recent upgrade." +" This installs the most recent iteration of each static file into the static" +" root path." +msgstr "" +"manage.py コレクトスタティック " +"最新のアップグレード時に実行されました。これにより、各静的ファイルの最新のイテレーションが静的ルートパスにインストールされます。" + +#: templates/media_failure.html:35 +#, python-format +msgid "" +"The HTTP service (e.g. nginx or Apache) is configured to serve files from " +"the STATIC_ROOT path. Refer to the " +"installation documentation for further guidance." +msgstr "" +"HTTP サービス (nginx や Apache など) は、からファイルを提供するように設定されています " +"スタティック・ルート パス。を参照してください。 インストールドキュメント さらなるガイダンスについて。" + +#: templates/media_failure.html:47 +#, python-format +msgid "" +"The file %(filename)s exists in the static root directory and " +"is readable by the HTTP server." +msgstr "" +"このファイル %(filename)s 静的ルートディレクトリに存在し、HTTP サーバーから読み取ることができます。" + +#: templates/media_failure.html:55 +#, python-format +msgid "Click here to attempt loading NetBox again." +msgstr "クリック ここに NetBox をもう一度ロードしてみます。" + +#: templates/tenancy/contact.html:18 tenancy/filtersets.py:136 +#: tenancy/forms/bulk_edit.py:136 tenancy/forms/filtersets.py:101 +#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:109 +#: tenancy/forms/model_forms.py:132 tenancy/tables/contacts.py:98 +msgid "Contact" +msgstr "連絡" + +#: templates/tenancy/contact.html:30 tenancy/forms/bulk_edit.py:98 +msgid "Title" +msgstr "タイトル" + +#: templates/tenancy/contact.html:34 tenancy/forms/bulk_edit.py:103 +#: tenancy/tables/contacts.py:64 +msgid "Phone" +msgstr "電話" + +#: templates/tenancy/contact.html:86 tenancy/tables/contacts.py:73 +msgid "Assignments" +msgstr "アサイメント" + +#: templates/tenancy/contactassignment_edit.html:12 +msgid "Contact Assignment" +msgstr "連絡先割り当て" + +#: templates/tenancy/contactgroup.html:19 tenancy/forms/forms.py:66 +#: tenancy/forms/model_forms.py:76 +msgid "Contact Group" +msgstr "コンタクトグループ" + +#: templates/tenancy/contactgroup.html:57 +msgid "Add Contact Group" +msgstr "連絡先グループを追加" + +#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:141 +#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:90 +msgid "Contact Role" +msgstr "連絡先の役割" + +#: templates/tenancy/object_contacts.html:9 +msgid "Add a contact" +msgstr "連絡先を追加" + +#: templates/tenancy/tenantgroup.html:17 +msgid "Add Tenant" +msgstr "テナントを追加" + +#: templates/tenancy/tenantgroup.html:27 tenancy/forms/model_forms.py:31 +#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +msgid "Tenant Group" +msgstr "テナントグループ" + +#: templates/tenancy/tenantgroup.html:66 +msgid "Add Tenant Group" +msgstr "テナントグループの追加" + +#: templates/users/group.html:37 templates/users/user.html:61 +msgid "Assigned Permissions" +msgstr "割り当てられた権限" + +#: templates/users/objectpermission.html:6 +#: templates/users/objectpermission.html:14 users/forms/filtersets.py:67 +msgid "Permission" +msgstr "許可" + +#: templates/users/objectpermission.html:33 users/forms/filtersets.py:68 +#: users/forms/model_forms.py:322 +msgid "Actions" +msgstr "[アクション]" + +#: templates/users/objectpermission.html:37 +msgid "View" +msgstr "ビュー" + +#: templates/users/objectpermission.html:56 users/forms/model_forms.py:325 +msgid "Constraints" +msgstr "制約" + +#: templates/users/objectpermission.html:76 +msgid "Assigned Users" +msgstr "割り当てられたユーザ" + +#: templates/users/user.html:38 +msgid "Staff" +msgstr "スタッフ" + +#: templates/virtualization/cluster.html:56 +msgid "Allocated Resources" +msgstr "割り当てられたリソース" + +#: templates/virtualization/cluster.html:60 +#: templates/virtualization/virtualmachine.html:128 +msgid "Virtual CPUs" +msgstr "バーチャル CPU" + +#: templates/virtualization/cluster.html:64 +#: templates/virtualization/virtualmachine.html:132 +msgid "Memory" +msgstr "メモリー" + +#: templates/virtualization/cluster.html:74 +#: templates/virtualization/virtualmachine.html:143 +msgid "Disk Space" +msgstr "ディスク容量" + +#: templates/virtualization/cluster.html:77 +#: templates/virtualization/virtualdisk.html:33 +#: templates/virtualization/virtualmachine.html:147 +msgctxt "Abbreviation for gigabyte" +msgid "GB" +msgstr "GB" + +#: templates/virtualization/cluster/base.html:18 +msgid "Add Virtual Machine" +msgstr "バーチャルマシンを追加" + +#: templates/virtualization/cluster/base.html:24 +msgid "Assign Device" +msgstr "デバイスを割り当て" + +#: templates/virtualization/cluster/devices.html:10 +msgid "Remove Selected" +msgstr "選択項目を削除" + +#: templates/virtualization/cluster_add_devices.html:9 +#, python-format +msgid "Add Device to Cluster %(cluster)s" +msgstr "クラスタにデバイスを追加 %(cluster)s" + +#: templates/virtualization/cluster_add_devices.html:23 +msgid "Device Selection" +msgstr "デバイス選択" + +#: templates/virtualization/cluster_add_devices.html:31 +msgid "Add Devices" +msgstr "デバイスを追加" + +#: templates/virtualization/clustergroup.html:10 +#: templates/virtualization/clustertype.html:10 +msgid "Add Cluster" +msgstr "[クラスタを追加]" + +#: templates/virtualization/clustergroup.html:20 +#: virtualization/forms/model_forms.py:51 +msgid "Cluster Group" +msgstr "クラスターグループ" + +#: templates/virtualization/clustertype.html:20 +#: templates/virtualization/virtualmachine.html:111 +#: virtualization/forms/model_forms.py:35 +msgid "Cluster Type" +msgstr "クラスタータイプ" + +#: templates/virtualization/virtualdisk.html:18 +msgid "Virtual Disk" +msgstr "仮想ディスク" + +#: templates/virtualization/virtualmachine.html:124 +#: virtualization/forms/bulk_edit.py:189 +#: virtualization/forms/model_forms.py:227 +msgid "Resources" +msgstr "リソース" + +#: templates/virtualization/virtualmachine.html:185 +msgid "Add Virtual Disk" +msgstr "仮想ディスクを追加" + +#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:35 +#: vpn/tables/crypto.py:166 +msgid "IKE Policy" +msgstr "IKE ポリシー" + +#: templates/vpn/ikepolicy.html:22 +msgid "IKE Version" +msgstr "IKE バージョン" + +#: templates/vpn/ikepolicy.html:30 +msgid "Pre-Shared Key" +msgstr "事前共有キー" + +#: templates/vpn/ikepolicy.html:34 +#: templates/wireless/inc/authentication_attrs.html:21 +msgid "Show Secret" +msgstr "シークレットを表示" + +#: templates/vpn/ikepolicy.html:59 templates/vpn/ipsecpolicy.html:47 +#: templates/vpn/ipsecprofile.html:55 templates/vpn/ipsecprofile.html:82 +#: vpn/forms/model_forms.py:310 vpn/forms/model_forms.py:345 +#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +msgid "Proposals" +msgstr "提案" + +#: templates/vpn/ikeproposal.html:10 +msgid "IKE Proposal" +msgstr "イケアの提案" + +#: templates/vpn/ikeproposal.html:22 vpn/forms/bulk_edit.py:96 +#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:98 +msgid "Authentication method" +msgstr "認証方法" + +#: templates/vpn/ikeproposal.html:26 templates/vpn/ipsecproposal.html:22 +#: vpn/forms/bulk_edit.py:101 vpn/forms/bulk_edit.py:173 +#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 +#: vpn/forms/filtersets.py:103 vpn/forms/filtersets.py:151 +msgid "Encryption algorithm" +msgstr "暗号化アルゴリズム" + +#: templates/vpn/ikeproposal.html:30 templates/vpn/ipsecproposal.html:26 +#: vpn/forms/bulk_edit.py:106 vpn/forms/bulk_edit.py:178 +#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 +#: vpn/forms/filtersets.py:108 vpn/forms/filtersets.py:156 +msgid "Authentication algorithm" +msgstr "認証アルゴリズム" + +#: templates/vpn/ikeproposal.html:34 +msgid "DH group" +msgstr "ディーエイチグループ" + +#: templates/vpn/ikeproposal.html:38 templates/vpn/ipsecproposal.html:30 +#: vpn/forms/bulk_edit.py:183 vpn/models/crypto.py:146 +msgid "SA lifetime (seconds)" +msgstr "SA ライフタイム (秒)" + +#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:70 +#: vpn/tables/crypto.py:170 +msgid "IPSec Policy" +msgstr "IPsec ポリシー" + +#: templates/vpn/ipsecpolicy.html:22 vpn/forms/bulk_edit.py:211 +#: vpn/models/crypto.py:193 +msgid "PFS group" +msgstr "PFS グループ" + +#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:53 +msgid "IPSec Profile" +msgstr "IPsec プロファイル" + +#: templates/vpn/ipsecprofile.html:94 vpn/tables/crypto.py:137 +msgid "PFS Group" +msgstr "PFS グループ" + +#: templates/vpn/ipsecproposal.html:10 +msgid "IPSec Proposal" +msgstr "IPsec プロポーザル" + +#: templates/vpn/ipsecproposal.html:34 vpn/forms/bulk_edit.py:187 +#: vpn/models/crypto.py:152 +msgid "SA lifetime (KB)" +msgstr "SA ライフタイム (KB)" + +#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:10 +msgid "L2VPN Attributes" +msgstr "L2VPN アトリビュート" + +#: templates/vpn/l2vpn.html:65 templates/vpn/tunnel.html:81 +msgid "Add a Termination" +msgstr "終了を追加" + +#: templates/vpn/l2vpntermination_edit.html:9 +msgid "L2VPN Termination" +msgstr "L2 VPN ターミネーション" + +#: templates/vpn/tunnel.html:9 +msgid "Add Termination" +msgstr "終了を追加" + +#: templates/vpn/tunnel.html:38 vpn/forms/bulk_edit.py:48 +#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:56 +msgid "Encapsulation" +msgstr "カプセル化" + +#: templates/vpn/tunnel.html:42 vpn/forms/bulk_edit.py:54 +#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:63 +#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:47 +msgid "IPSec profile" +msgstr "IPsec プロファイル" + +#: templates/vpn/tunnel.html:46 vpn/forms/bulk_edit.py:68 +#: vpn/forms/filtersets.py:67 +msgid "Tunnel ID" +msgstr "トンネル ID" + +#: templates/vpn/tunnelgroup.html:14 +msgid "Add Tunnel" +msgstr "トンネルを追加" + +#: templates/vpn/tunnelgroup.html:24 vpn/forms/model_forms.py:35 +#: vpn/forms/model_forms.py:48 +msgid "Tunnel Group" +msgstr "トンネルグループ" + +#: templates/vpn/tunneltermination.html:10 +msgid "Tunnel Termination" +msgstr "トンネル終端" + +#: templates/vpn/tunneltermination.html:36 vpn/forms/bulk_import.py:107 +#: vpn/forms/model_forms.py:101 vpn/forms/model_forms.py:137 +#: vpn/forms/model_forms.py:248 vpn/tables/tunnels.py:97 +msgid "Outside IP" +msgstr "外部IP" + +#: templates/vpn/tunneltermination.html:53 +msgid "Peer Terminations" +msgstr "ピアターミネーション" + +#: templates/wireless/inc/authentication_attrs.html:13 +msgid "Cipher" +msgstr "暗号" + +#: templates/wireless/inc/authentication_attrs.html:17 +msgid "PSK" +msgstr "PSK" + +#: templates/wireless/inc/wirelesslink_interface.html:35 +#: templates/wireless/inc/wirelesslink_interface.html:45 +msgctxt "Abbreviation for megahertz" +msgid "MHz" +msgstr "メガヘルツ" + +#: templates/wireless/wirelesslan.html:11 wireless/forms/model_forms.py:54 +msgid "Wireless LAN" +msgstr "ワイヤレス LAN" + +#: templates/wireless/wirelesslan.html:59 +msgid "Attached Interfaces" +msgstr "接続インタフェース" + +#: templates/wireless/wirelesslangroup.html:17 +msgid "Add Wireless LAN" +msgstr "ワイヤレス LAN の追加" + +#: templates/wireless/wirelesslangroup.html:26 +#: wireless/forms/model_forms.py:27 +msgid "Wireless LAN Group" +msgstr "ワイヤレス LAN グループ" + +#: templates/wireless/wirelesslangroup.html:64 +msgid "Add Wireless LAN Group" +msgstr "ワイヤレス LAN グループの追加" + +#: templates/wireless/wirelesslink.html:16 +msgid "Link Properties" +msgstr "リンクプロパティ" + +#: tenancy/choices.py:19 +msgid "Tertiary" +msgstr "三次" + +#: tenancy/choices.py:20 +msgid "Inactive" +msgstr "非アクティブ" + +#: tenancy/filtersets.py:29 tenancy/filtersets.py:55 tenancy/filtersets.py:98 +msgid "Contact group (ID)" +msgstr "連絡先グループ (ID)" + +#: tenancy/filtersets.py:35 tenancy/filtersets.py:62 tenancy/filtersets.py:105 +msgid "Contact group (slug)" +msgstr "コンタクトグループ (スラッグ)" + +#: tenancy/filtersets.py:92 +msgid "Contact (ID)" +msgstr "連絡先 (ID)" + +#: tenancy/filtersets.py:109 +msgid "Contact role (ID)" +msgstr "連絡先ロール (ID)" + +#: tenancy/filtersets.py:115 +msgid "Contact role (slug)" +msgstr "コンタクトロール (スラッグ)" + +#: tenancy/filtersets.py:147 +msgid "Contact group" +msgstr "連絡先グループ" + +#: tenancy/filtersets.py:158 tenancy/filtersets.py:177 +msgid "Tenant group (ID)" +msgstr "テナントグループ (ID)" + +#: tenancy/filtersets.py:210 +msgid "Tenant Group (ID)" +msgstr "テナントグループ (ID)" + +#: tenancy/filtersets.py:217 +msgid "Tenant Group (slug)" +msgstr "テナントグループ (スラッグ)" + +#: tenancy/forms/bulk_edit.py:65 +msgid "Desciption" +msgstr "[説明]" + +#: tenancy/forms/bulk_import.py:101 +msgid "Assigned contact" +msgstr "割り当てられた連絡先" + +#: tenancy/models/contacts.py:32 +msgid "contact group" +msgstr "連絡先グループ" + +#: tenancy/models/contacts.py:33 +msgid "contact groups" +msgstr "連絡先グループ" + +#: tenancy/models/contacts.py:48 +msgid "contact role" +msgstr "連絡先の役割" + +#: tenancy/models/contacts.py:49 +msgid "contact roles" +msgstr "連絡先の役割" + +#: tenancy/models/contacts.py:68 +msgid "title" +msgstr "タイトル" + +#: tenancy/models/contacts.py:73 +msgid "phone" +msgstr "電話" + +#: tenancy/models/contacts.py:78 +msgid "email" +msgstr "Eメール" + +#: tenancy/models/contacts.py:87 +msgid "link" +msgstr "リンク" + +#: tenancy/models/contacts.py:103 +msgid "contact" +msgstr "接触" + +#: tenancy/models/contacts.py:104 +msgid "contacts" +msgstr "連絡先" + +#: tenancy/models/contacts.py:153 +msgid "contact assignment" +msgstr "連絡先割り当て" + +#: tenancy/models/contacts.py:154 +msgid "contact assignments" +msgstr "連絡先の割り当て" + +#: tenancy/models/contacts.py:170 +#, python-brace-format +msgid "Contacts cannot be assigned to this object type ({type})." +msgstr "このオブジェクトタイプには連絡先を割り当てられません ({type})。" + +#: tenancy/models/tenants.py:32 +msgid "tenant group" +msgstr "テナントグループ" + +#: tenancy/models/tenants.py:33 +msgid "tenant groups" +msgstr "テナントグループ" + +#: tenancy/models/tenants.py:70 +msgid "Tenant name must be unique per group." +msgstr "テナント名はグループごとに一意である必要があります。" + +#: tenancy/models/tenants.py:80 +msgid "Tenant slug must be unique per group." +msgstr "テナントスラッグはグループごとにユニークでなければなりません。" + +#: tenancy/models/tenants.py:88 +msgid "tenant" +msgstr "テナント" + +#: tenancy/models/tenants.py:89 +msgid "tenants" +msgstr "テナント" + +#: tenancy/tables/contacts.py:112 +msgid "Contact Title" +msgstr "連絡先のタイトル" + +#: tenancy/tables/contacts.py:116 +msgid "Contact Phone" +msgstr "連絡先電話番号" + +#: tenancy/tables/contacts.py:120 +msgid "Contact Email" +msgstr "連絡先電子メール" + +#: tenancy/tables/contacts.py:124 +msgid "Contact Address" +msgstr "連絡先住所" + +#: tenancy/tables/contacts.py:128 +msgid "Contact Link" +msgstr "連絡先リンク" + +#: tenancy/tables/contacts.py:132 +msgid "Contact Description" +msgstr "連絡先の説明" + +#: users/filtersets.py:48 users/filtersets.py:151 +msgid "Group (name)" +msgstr "グループ (名前)" + +#: users/forms/bulk_edit.py:24 +msgid "First name" +msgstr "ファーストネーム" + +#: users/forms/bulk_edit.py:29 +msgid "Last name" +msgstr "苗字" + +#: users/forms/bulk_edit.py:41 +msgid "Staff status" +msgstr "スタッフステータス" + +#: users/forms/bulk_edit.py:46 +msgid "Superuser status" +msgstr "スーパーユーザーステータス" + +#: users/forms/bulk_import.py:43 +msgid "If no key is provided, one will be generated automatically." +msgstr "キーが指定されていない場合は、キーが自動的に生成されます。" + +#: users/forms/filtersets.py:52 users/tables.py:42 +msgid "Is Staff" +msgstr "スタッフですか" + +#: users/forms/filtersets.py:59 users/tables.py:45 +msgid "Is Superuser" +msgstr "スーパーユーザーですか" + +#: users/forms/filtersets.py:92 users/tables.py:89 +msgid "Can View" +msgstr "閲覧可能" + +#: users/forms/filtersets.py:99 users/tables.py:92 +msgid "Can Add" +msgstr "追加可能" + +#: users/forms/filtersets.py:106 users/tables.py:95 +msgid "Can Change" +msgstr "変更可能" + +#: users/forms/filtersets.py:113 users/tables.py:98 +msgid "Can Delete" +msgstr "削除可能" + +#: users/forms/model_forms.py:58 +msgid "User Interface" +msgstr "ユーザーインターフェース" + +#: users/forms/model_forms.py:116 +msgid "" +"Keys must be at least 40 characters in length. Be sure to record " +"your key prior to submitting this form, as it may no longer be " +"accessible once the token has been created." +msgstr "" +"キーの長さは 40 文字以上でなければなりません。 キーは必ず記録してください。 " +"このフォームを送信する前に。トークンが作成されるとアクセスできなくなる可能性があるためです。" + +#: users/forms/model_forms.py:128 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" +" no restrictions. Example: " +"10.1.1.0/24,192.168.10.16/32,2001:db8:1::/64" +msgstr "" +"トークンを使用できる許可された IPv4/IPv6 ネットワーク。制限がない場合は空白のままにしてください。例: " +"10.1.1.0/24,192.168.10.16/32,2001: db 8:1:: /64" + +#: users/forms/model_forms.py:177 +msgid "Confirm password" +msgstr "パスワードを確認" + +#: users/forms/model_forms.py:180 +msgid "Enter the same password as before, for verification." +msgstr "確認のため、以前と同じパスワードを入力します。" + +#: users/forms/model_forms.py:238 +msgid "Passwords do not match! Please check your input and try again." +msgstr "パスワードが一致しません!入力内容を確認して、もう一度試してください。" + +#: users/forms/model_forms.py:304 +msgid "Additional actions" +msgstr "その他のアクション" + +#: users/forms/model_forms.py:307 +msgid "Actions granted in addition to those listed above" +msgstr "上記以外に付与されたアクション" + +#: users/forms/model_forms.py:323 +msgid "Objects" +msgstr "[オブジェクト]" + +#: users/forms/model_forms.py:335 +msgid "" +"JSON expression of a queryset filter that will return only permitted " +"objects. Leave null to match all objects of this type. A list of multiple " +"objects will result in a logical OR operation." +msgstr "" +"許可されたオブジェクトのみを返すクエリセットフィルターの JSON 式。null " +"のままにしておくと、このタイプのすべてのオブジェクトに一致します。複数のオブジェクトのリストでは、論理 OR 演算が行われます。" + +#: users/forms/model_forms.py:373 +msgid "At least one action must be selected." +msgstr "少なくとも 1 つのアクションを選択する必要があります。" + +#: users/forms/model_forms.py:390 +#, python-brace-format +msgid "Invalid filter for {model}: {error}" +msgstr "のフィルタが無効です {model}: {error}" + +#: users/models.py:54 +msgid "user" +msgstr "ユーザー" + +#: users/models.py:55 +msgid "users" +msgstr "ユーザー" + +#: users/models.py:66 +msgid "A user with this username already exists." +msgstr "このユーザー名のユーザーはすでに存在します。" + +#: users/models.py:78 vpn/models/crypto.py:42 +msgid "group" +msgstr "グループ" + +#: users/models.py:79 +msgid "groups" +msgstr "グループ" + +#: users/models.py:106 users/models.py:107 +msgid "user preferences" +msgstr "ユーザープリファレンス" + +#: users/models.py:174 +#, python-brace-format +msgid "Key '{path}' is a leaf node; cannot assign new keys" +msgstr "キー '{path}'はリーフノードです。新しいキーを割り当てることはできません" + +#: users/models.py:186 +#, python-brace-format +msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" +msgstr "キー '{path}'はディクショナリです。ディクショナリ以外の値は割り当てられません" + +#: users/models.py:252 +msgid "expires" +msgstr "期限切れ" + +#: users/models.py:257 +msgid "last used" +msgstr "最終使用日" + +#: users/models.py:262 +msgid "key" +msgstr "キー" + +#: users/models.py:268 +msgid "write enabled" +msgstr "書き込み有効" + +#: users/models.py:270 +msgid "Permit create/update/delete operations using this key" +msgstr "このキーを使用して作成/更新/削除操作を許可する" + +#: users/models.py:281 +msgid "allowed IPs" +msgstr "許可された IP" + +#: users/models.py:283 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" +" no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" +msgstr "" +"トークンを使用できる許可された IPv4/IPv6 " +"ネットワーク。制限がない場合は空白のままにしてください。例:「10.1.1.0/24、192.168.10.16/32、2001: DB 8:1:: " +"/64\"" + +#: users/models.py:291 +msgid "token" +msgstr "トークン" + +#: users/models.py:292 +msgid "tokens" +msgstr "トークン" + +#: users/models.py:373 +msgid "The list of actions granted by this permission" +msgstr "この権限によって付与されたアクションのリスト" + +#: users/models.py:378 +msgid "constraints" +msgstr "制約" + +#: users/models.py:379 +msgid "" +"Queryset filter matching the applicable objects of the selected type(s)" +msgstr "選択したタイプの該当するオブジェクトに一致するクエリーセットフィルタ" + +#: users/models.py:386 +msgid "permission" +msgstr "許可" + +#: users/models.py:387 +msgid "permissions" +msgstr "許可" + +#: users/tables.py:101 +msgid "Custom Actions" +msgstr "カスタムアクション" + +#: utilities/choices.py:16 +#, python-brace-format +msgid "{name} has a key defined but CHOICES is not a list" +msgstr "{name} キーは定義されているが、CHOICES はリストではない" + +#: utilities/choices.py:135 +msgid "Dark Red" +msgstr "ダークレッド" + +#: utilities/choices.py:138 +msgid "Rose" +msgstr "ローズ" + +#: utilities/choices.py:139 +msgid "Fuchsia" +msgstr "フクシア" + +#: utilities/choices.py:141 +msgid "Dark Purple" +msgstr "ダークパープル" + +#: utilities/choices.py:144 +msgid "Light Blue" +msgstr "ライトブルー" + +#: utilities/choices.py:147 +msgid "Aqua" +msgstr "アクア" + +#: utilities/choices.py:148 +msgid "Dark Green" +msgstr "ダークグリーン" + +#: utilities/choices.py:150 +msgid "Light Green" +msgstr "ライトグリーン" + +#: utilities/choices.py:151 +msgid "Lime" +msgstr "ライム" + +#: utilities/choices.py:153 +msgid "Amber" +msgstr "アンバー" + +#: utilities/choices.py:155 +msgid "Dark Orange" +msgstr "ダークオレンジ" + +#: utilities/choices.py:156 +msgid "Brown" +msgstr "ブラウン" + +#: utilities/choices.py:157 +msgid "Light Grey" +msgstr "ライトグレー" + +#: utilities/choices.py:158 +msgid "Grey" +msgstr "グレー" + +#: utilities/choices.py:159 +msgid "Dark Grey" +msgstr "ダークグレー" + +#: utilities/choices.py:217 +msgid "Direct" +msgstr "ダイレクト" + +#: utilities/choices.py:218 +msgid "Upload" +msgstr "アップロード" + +#: utilities/choices.py:230 utilities/choices.py:244 +msgid "Auto-detect" +msgstr "[自動検出]" + +#: utilities/choices.py:245 +msgid "Comma" +msgstr "コンマ" + +#: utilities/choices.py:246 +msgid "Semicolon" +msgstr "セミコロン" + +#: utilities/choices.py:247 +msgid "Tab" +msgstr "タブ" + +#: utilities/error_handlers.py:20 +#, python-brace-format +msgid "" +"Unable to delete {objects}. {count} dependent objects were " +"found: " +msgstr "削除できません {objects}。 {count} 依存オブジェクトが見つかりました: " + +#: utilities/error_handlers.py:22 +msgid "More than 50" +msgstr "50 個以上" + +#: utilities/fields.py:162 +#, python-format +msgid "" +"%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " +"in the format 'app.model'" +msgstr "" +"%s(%r) は無効です。CounterCacheField の to_model パラメーターは 'app.model' " +"形式の文字列でなければなりません" + +#: utilities/fields.py:172 +#, python-format +msgid "" +"%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " +"in the format 'field'" +msgstr "" +"%s(%r) は無効です。CounterCacheField の to_field パラメーターは 'field' 形式の文字列でなければなりません" + +#: utilities/forms/bulk_import.py:24 +msgid "Enter object data in CSV, JSON or YAML format." +msgstr "オブジェクトデータを CSV、JSON、または YAML 形式で入力します。" + +#: utilities/forms/bulk_import.py:37 +msgid "CSV delimiter" +msgstr "CSV デリミター" + +#: utilities/forms/bulk_import.py:38 +msgid "The character which delimits CSV fields. Applies only to CSV format." +msgstr "CSV フィールドを区切る文字。CSV 形式にのみ適用されます。" + +#: utilities/forms/bulk_import.py:101 +msgid "Unable to detect data format. Please specify." +msgstr "データ形式を検出できません。指定してください。" + +#: utilities/forms/bulk_import.py:124 +msgid "Invalid CSV delimiter" +msgstr "CSV 区切り文字が無効です" + +#: utilities/forms/bulk_import.py:168 +msgid "" +"Invalid YAML data. Data must be in the form of multiple documents, or a " +"single document comprising a list of dictionaries." +msgstr "" +"YAML データが無効です。データは複数のドキュメント、またはディクショナリのリストから構成される 1 つのドキュメントの形式である必要があります。" + +#: utilities/forms/fields/array.py:17 +#, python-brace-format +msgid "" +"Invalid list ({value}). Must be numeric and ranges must be in ascending " +"order." +msgstr "リストが無効です ({value})。数値でなければならず、範囲は昇順でなければなりません。" + +#: utilities/forms/fields/csv.py:44 +#, python-brace-format +msgid "Invalid value for a multiple choice field: {value}" +msgstr "複数選択フィールドの値が無効です: {value}" + +#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:74 +#, python-format +msgid "Object not found: %(value)s" +msgstr "オブジェクトが見つかりません: %(value)s" + +#: utilities/forms/fields/csv.py:65 +#, python-brace-format +msgid "" +"\"{value}\" is not a unique value for this field; multiple objects were " +"found" +msgstr "「{value}「」はこのフィールドにとって一意の値ではありません。複数のオブジェクトが見つかりました" + +#: utilities/forms/fields/csv.py:97 +msgid "Object type must be specified as \".\"" +msgstr "オブジェクトタイプは「」として指定する必要があります」" + +#: utilities/forms/fields/csv.py:101 +msgid "Invalid object type" +msgstr "オブジェクトタイプが無効です" + +#: utilities/forms/fields/expandable.py:25 +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9])." +msgstr "" +"英数字の範囲は一括作成でサポートされています。1 つの範囲内で大文字と小文字と文字が混在することはサポートされていません (例: [年齢, " +"性別] -0/0/ [0-9])。" + +#: utilities/forms/fields/expandable.py:46 +msgid "" +"Specify a numeric range to create multiple IPs.
    Example: " +"192.0.2.[1,5,100-254]/24" +msgstr "" +"複数の IP を作成するには、数値範囲を指定します。
    例: 192.0.2。[1,5,100-254] /24" + +#: utilities/forms/fields/fields.py:31 +#, python-brace-format +msgid "" +" Markdown syntax is supported" +msgstr "" +" マークダウン シンタックスはサポートされています" + +#: utilities/forms/fields/fields.py:48 +msgid "URL-friendly unique shorthand" +msgstr "URL に対応したユニークな省略記法" + +#: utilities/forms/fields/fields.py:99 +msgid "Enter context data in JSON format." +msgstr "にコンテキストデータを入力してください JSON フォーマット。" + +#: utilities/forms/fields/fields.py:117 +msgid "MAC address must be in EUI-48 format" +msgstr "MAC アドレスは EUI-48 形式である必要があります" + +#: utilities/forms/forms.py:53 +msgid "Use regular expressions" +msgstr "正規表現を使う" + +#: utilities/forms/forms.py:87 +#, python-brace-format +msgid "Unrecognized header: {name}" +msgstr "認識できないヘッダー: {name}" + +#: utilities/forms/forms.py:113 +msgid "Available Columns" +msgstr "使用可能な列" + +#: utilities/forms/forms.py:121 +msgid "Selected Columns" +msgstr "選択した列" + +#: utilities/forms/mixins.py:101 +msgid "" +"This object has been modified since the form was rendered. Please consult " +"the object's change log for details." +msgstr "このオブジェクトは、フォームがレンダリングされてから変更されました。詳細については、オブジェクトの変更ログを参照してください。" + +#: utilities/templates/builtins/customfield_value.html:30 +msgid "Not defined" +msgstr "未定義" + +#: utilities/templates/buttons/bookmark.html:9 +msgid "Unbookmark" +msgstr "[ブックマーク解除]" + +#: utilities/templates/buttons/bookmark.html:13 +msgid "Bookmark" +msgstr "ブックマーク" + +#: utilities/templates/buttons/clone.html:4 +msgid "Clone" +msgstr "クローン" + +#: utilities/templates/buttons/export.html:4 +msgid "Export" +msgstr "[エクスポート]" + +#: utilities/templates/buttons/export.html:7 +msgid "Current View" +msgstr "現在のビュー" + +#: utilities/templates/buttons/export.html:8 +msgid "All Data" +msgstr "[すべてのデータ]" + +#: utilities/templates/buttons/export.html:28 +msgid "Add export template" +msgstr "エクスポートテンプレートを追加" + +#: utilities/templates/buttons/import.html:4 +msgid "Import" +msgstr "インポート" + +#: utilities/templates/form_helpers/render_field.html:36 +msgid "Copy to clipboard" +msgstr "クリップボードにコピー" + +#: utilities/templates/form_helpers/render_field.html:52 +msgid "This field is required" +msgstr "このフィールドは必須です" + +#: utilities/templates/form_helpers/render_field.html:65 +msgid "Set Null" +msgstr "NULL を設定" + +#: utilities/templates/helpers/applied_filters.html:11 +msgid "Clear all" +msgstr "すべてクリア" + +#: utilities/templates/helpers/table_config_form.html:8 +msgid "Table Configuration" +msgstr "テーブル構成" + +#: utilities/templates/helpers/table_config_form.html:31 +msgid "Move Up" +msgstr "上へ移動" + +#: utilities/templates/helpers/table_config_form.html:34 +msgid "Move Down" +msgstr "下に移動" + +#: utilities/templates/widgets/apiselect.html:7 +msgid "Open selector" +msgstr "セレクターを開く" + +#: utilities/templates/widgets/clearable_file_input.html:12 +msgid "None assigned" +msgstr "割り当てなし" + +#: utilities/templates/widgets/markdown_input.html:6 +msgid "Write" +msgstr "書き込み" + +#: utilities/templates/widgets/markdown_input.html:20 +msgid "Testing" +msgstr "テスト" + +#: virtualization/filtersets.py:79 +msgid "Parent group (ID)" +msgstr "親グループ (ID)" + +#: virtualization/filtersets.py:85 +msgid "Parent group (slug)" +msgstr "親グループ (スラッグ)" + +#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +msgid "Cluster type (ID)" +msgstr "クラスタータイプ (ID)" + +#: virtualization/filtersets.py:130 +msgid "Cluster group (ID)" +msgstr "クラスターグループ (ID)" + +#: virtualization/filtersets.py:151 virtualization/filtersets.py:267 +msgid "Cluster (ID)" +msgstr "クラスタ (ID)" + +#: virtualization/forms/bulk_edit.py:165 +#: virtualization/models/virtualmachines.py:113 +msgid "vCPUs" +msgstr "vCPU" + +#: virtualization/forms/bulk_edit.py:169 +msgid "Memory (MB)" +msgstr "メモリ (MB)" + +#: virtualization/forms/bulk_edit.py:173 +msgid "Disk (GB)" +msgstr "ディスク (GB)" + +#: virtualization/forms/bulk_edit.py:333 +#: virtualization/forms/filtersets.py:243 +msgid "Size (GB)" +msgstr "サイズ (GB)" + +#: virtualization/forms/bulk_import.py:44 +msgid "Type of cluster" +msgstr "クラスターのタイプ" + +#: virtualization/forms/bulk_import.py:51 +msgid "Assigned cluster group" +msgstr "割り当てられたクラスターグループ" + +#: virtualization/forms/bulk_import.py:96 +msgid "Assigned cluster" +msgstr "割り当て済みクラスタ" + +#: virtualization/forms/bulk_import.py:103 +msgid "Assigned device within cluster" +msgstr "クラスタ内の割り当て済みデバイス" + +#: virtualization/forms/model_forms.py:156 +#, python-brace-format +msgid "" +"{device} belongs to a different site ({device_site}) than the cluster " +"({cluster_site})" +msgstr "{device} 別のサイトに属している ({device_site}) よりもクラスタ ({cluster_site})" + +#: virtualization/forms/model_forms.py:195 +msgid "Optionally pin this VM to a specific host device within the cluster" +msgstr "オプションで、この VM をクラスタ内の特定のホストデバイスにピン留めできます。" + +#: virtualization/forms/model_forms.py:224 +msgid "Site/Cluster" +msgstr "サイト/クラスタ" + +#: virtualization/forms/model_forms.py:247 +msgid "Disk size is managed via the attachment of virtual disks." +msgstr "ディスクサイズは、仮想ディスクのアタッチメントによって管理されます。" + +#: virtualization/forms/model_forms.py:375 +msgid "Disk" +msgstr "ディスク" + +#: virtualization/models/clusters.py:25 +msgid "cluster type" +msgstr "クラスタタイプ" + +#: virtualization/models/clusters.py:26 +msgid "cluster types" +msgstr "クラスタタイプ" + +#: virtualization/models/clusters.py:45 +msgid "cluster group" +msgstr "クラスターグループ" + +#: virtualization/models/clusters.py:46 +msgid "cluster groups" +msgstr "クラスターグループ" + +#: virtualization/models/clusters.py:121 +msgid "cluster" +msgstr "集まる" + +#: virtualization/models/clusters.py:122 +msgid "clusters" +msgstr "クラスター" + +#: virtualization/models/clusters.py:141 +#, python-brace-format +msgid "" +"{count} devices are assigned as hosts for this cluster but are not in site " +"{site}" +msgstr "{count} デバイスはこのクラスタのホストとして割り当てられているが、サイトにはない {site}" + +#: virtualization/models/virtualmachines.py:121 +msgid "memory (MB)" +msgstr "メモリ (MB)" + +#: virtualization/models/virtualmachines.py:126 +msgid "disk (GB)" +msgstr "ディスク (GB)" + +#: virtualization/models/virtualmachines.py:159 +msgid "Virtual machine name must be unique per cluster." +msgstr "仮想マシン名はクラスターごとに一意である必要があります。" + +#: virtualization/models/virtualmachines.py:162 +msgid "virtual machine" +msgstr "仮想マシン" + +#: virtualization/models/virtualmachines.py:163 +msgid "virtual machines" +msgstr "仮想マシン" + +#: virtualization/models/virtualmachines.py:177 +msgid "A virtual machine must be assigned to a site and/or cluster." +msgstr "仮想マシンをサイトまたはクラスタに割り当てる必要があります。" + +#: virtualization/models/virtualmachines.py:184 +#, python-brace-format +msgid "" +"The selected cluster ({cluster}) is not assigned to this site ({site})." +msgstr "選択したクラスタ ({cluster}) はこのサイトに割り当てられていません ({site})。" + +#: virtualization/models/virtualmachines.py:191 +msgid "Must specify a cluster when assigning a host device." +msgstr "ホストデバイスを割り当てるときは、クラスターを指定する必要があります。" + +#: virtualization/models/virtualmachines.py:196 +#, python-brace-format +msgid "" +"The selected device ({device}) is not assigned to this cluster ({cluster})." +msgstr "選択したデバイス ({device}) はこのクラスターに割り当てられていません ({cluster})。" + +#: virtualization/models/virtualmachines.py:208 +#, python-brace-format +msgid "" +"The specified disk size ({size}) must match the aggregate size of assigned " +"virtual disks ({total_size})." +msgstr "指定されたディスクサイズ ({size}) は割り当てられた仮想ディスクの合計サイズと一致する必要がある ({total_size})。" + +#: virtualization/models/virtualmachines.py:222 +#, python-brace-format +msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" +msgstr "IPvである必要があります{family} 住所。({ip} は IPv です{version} 住所。)" + +#: virtualization/models/virtualmachines.py:231 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this VM." +msgstr "指定された IP アドレス ({ip}) はこの VM に割り当てられていません。" + +#: virtualization/models/virtualmachines.py:389 +#, python-brace-format +msgid "" +"The selected parent interface ({parent}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "選択した親インターフェイス ({parent}) は別の仮想マシンに属しています ({virtual_machine})。" + +#: virtualization/models/virtualmachines.py:404 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "選択したブリッジインターフェース ({bridge}) は別の仮想マシンに属しています ({virtual_machine})。" + +#: virtualization/models/virtualmachines.py:415 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent virtual machine, or it must be global." +msgstr "" +"タグが付いていない VLAN ({untagged_vlan}) " +"はインターフェースの親仮想マシンと同じサイトに属しているか、またはグローバルである必要があります。" + +#: virtualization/models/virtualmachines.py:427 +msgid "size (GB)" +msgstr "サイズ (GB)" + +#: virtualization/models/virtualmachines.py:431 +msgid "virtual disk" +msgstr "仮想ディスク" + +#: virtualization/models/virtualmachines.py:432 +msgid "virtual disks" +msgstr "仮想ディスク" + +#: vpn/choices.py:31 +msgid "IPsec - Transport" +msgstr "IPsec-トランスポート" + +#: vpn/choices.py:32 +msgid "IPsec - Tunnel" +msgstr "IPsec-トンネル" + +#: vpn/choices.py:33 +msgid "IP-in-IP" +msgstr "IP-in-IP" + +#: vpn/choices.py:34 +msgid "GRE" +msgstr "灰色" + +#: vpn/choices.py:56 +msgid "Hub" +msgstr "ハブ" + +#: vpn/choices.py:57 +msgid "Spoke" +msgstr "スポーク" + +#: vpn/choices.py:80 +msgid "Aggressive" +msgstr "積極的" + +#: vpn/choices.py:81 +msgid "Main" +msgstr "メイン" + +#: vpn/choices.py:92 +msgid "Pre-shared keys" +msgstr "事前共有キー" + +#: vpn/choices.py:93 +msgid "Certificates" +msgstr "証明書" + +#: vpn/choices.py:94 +msgid "RSA signatures" +msgstr "RSA シグネチャ" + +#: vpn/choices.py:95 +msgid "DSA signatures" +msgstr "DSA シグネチャ" + +#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 +#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 +#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 +#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 +#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 +#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#, python-brace-format +msgid "Group {n}" +msgstr "[グループ] {n}" + +#: vpn/choices.py:241 +msgid "Ethernet Private LAN" +msgstr "イーサネットプライベート LAN" + +#: vpn/choices.py:242 +msgid "Ethernet Virtual Private LAN" +msgstr "イーサネット仮想プライベート LAN" + +#: vpn/choices.py:245 +msgid "Ethernet Private Tree" +msgstr "イーサネットプライベートツリー" + +#: vpn/choices.py:246 +msgid "Ethernet Virtual Private Tree" +msgstr "イーサネット仮想プライベートツリー" + +#: vpn/filtersets.py:41 +msgid "Tunnel group (ID)" +msgstr "トンネルグループ (ID)" + +#: vpn/filtersets.py:47 +msgid "Tunnel group (slug)" +msgstr "トンネルグループ (スラッグ)" + +#: vpn/filtersets.py:54 +msgid "IPSec profile (ID)" +msgstr "IPsec プロファイル (ID)" + +#: vpn/filtersets.py:60 +msgid "IPSec profile (name)" +msgstr "IPsec プロファイル (名前)" + +#: vpn/filtersets.py:81 +msgid "Tunnel (ID)" +msgstr "トンネル (ID)" + +#: vpn/filtersets.py:87 +msgid "Tunnel (name)" +msgstr "トンネル (名前)" + +#: vpn/filtersets.py:118 +msgid "Outside IP (ID)" +msgstr "外部IP (ID)" + +#: vpn/filtersets.py:235 +msgid "IKE policy (ID)" +msgstr "IKE ポリシー (ID)" + +#: vpn/filtersets.py:241 +msgid "IKE policy (name)" +msgstr "IKE ポリシー (名前)" + +#: vpn/filtersets.py:245 +msgid "IPSec policy (ID)" +msgstr "IPsec ポリシー (ID)" + +#: vpn/filtersets.py:251 +msgid "IPSec policy (name)" +msgstr "IPsec ポリシー (名前)" + +#: vpn/filtersets.py:320 +msgid "L2VPN (slug)" +msgstr "L2VPN (スラッグ)" + +#: vpn/filtersets.py:384 +msgid "VM Interface (ID)" +msgstr "VM インターフェイス (ID)" + +#: vpn/filtersets.py:390 +msgid "VLAN (name)" +msgstr "VLAN (名前)" + +#: vpn/forms/bulk_edit.py:44 vpn/forms/bulk_import.py:42 +#: vpn/forms/filtersets.py:53 +msgid "Tunnel group" +msgstr "トンネルグループ" + +#: vpn/forms/bulk_edit.py:116 vpn/models/crypto.py:47 +msgid "SA lifetime" +msgstr "SA ライフタイム" + +#: vpn/forms/bulk_edit.py:150 wireless/forms/bulk_edit.py:78 +#: wireless/forms/bulk_edit.py:125 wireless/forms/filtersets.py:63 +#: wireless/forms/filtersets.py:97 +msgid "Pre-shared key" +msgstr "事前共有キー" + +#: vpn/forms/bulk_edit.py:238 vpn/forms/bulk_import.py:239 +#: vpn/forms/filtersets.py:196 vpn/forms/model_forms.py:363 +#: vpn/models/crypto.py:104 +msgid "IKE policy" +msgstr "IKE ポリシー" + +#: vpn/forms/bulk_edit.py:243 vpn/forms/bulk_import.py:244 +#: vpn/forms/filtersets.py:201 vpn/forms/model_forms.py:367 +#: vpn/models/crypto.py:209 +msgid "IPSec policy" +msgstr "IPsec ポリシー" + +#: vpn/forms/bulk_import.py:50 +msgid "Tunnel encapsulation" +msgstr "トンネルカプセル化" + +#: vpn/forms/bulk_import.py:83 +msgid "Operational role" +msgstr "運用上の役割" + +#: vpn/forms/bulk_import.py:90 +msgid "Parent device of assigned interface" +msgstr "割り当てられたインターフェースの親デバイス" + +#: vpn/forms/bulk_import.py:97 +msgid "Parent VM of assigned interface" +msgstr "割り当てられたインターフェースの親仮想マシン" + +#: vpn/forms/bulk_import.py:104 +msgid "Device or virtual machine interface" +msgstr "デバイスまたは仮想マシンのインターフェイス" + +#: vpn/forms/bulk_import.py:183 +msgid "IKE proposal(s)" +msgstr "IKE プロポーザル" + +#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +msgid "Diffie-Hellman group for Perfect Forward Secrecy" +msgstr "パーフェクト・フォワード・シークレシのディフィー・ヘルマン・グループ" + +#: vpn/forms/bulk_import.py:222 +msgid "IPSec proposal(s)" +msgstr "IPsec プロポーザル" + +#: vpn/forms/bulk_import.py:236 +msgid "IPSec protocol" +msgstr "IPsec プロトコル" + +#: vpn/forms/bulk_import.py:266 +msgid "L2VPN type" +msgstr "L2VPN タイプ" + +#: vpn/forms/bulk_import.py:287 +msgid "Parent device (for interface)" +msgstr "親デバイス (インターフェース用)" + +#: vpn/forms/bulk_import.py:294 +msgid "Parent virtual machine (for interface)" +msgstr "親仮想マシン (インターフェース用)" + +#: vpn/forms/bulk_import.py:301 +msgid "Assigned interface (device or VM)" +msgstr "割り当てられたインターフェイス (デバイスまたは VM)" + +#: vpn/forms/bulk_import.py:334 +msgid "Cannot import device and VM interface terminations simultaneously." +msgstr "デバイスと VM インターフェイスの終端を同時にインポートすることはできません。" + +#: vpn/forms/bulk_import.py:336 +msgid "Each termination must specify either an interface or a VLAN." +msgstr "各終端には、インターフェイスまたは VLAN のいずれかを指定する必要があります。" + +#: vpn/forms/bulk_import.py:338 +msgid "Cannot assign both an interface and a VLAN." +msgstr "インターフェイスと VLAN の両方を割り当てることはできません。" + +#: vpn/forms/filtersets.py:127 +msgid "IKE version" +msgstr "IKE バージョン" + +#: vpn/forms/filtersets.py:139 vpn/forms/filtersets.py:172 +#: vpn/forms/model_forms.py:293 vpn/forms/model_forms.py:328 +msgid "Proposal" +msgstr "提案" + +#: vpn/forms/filtersets.py:247 +msgid "Assigned Object Type" +msgstr "割り当てられたオブジェクトタイプ" + +#: vpn/forms/model_forms.py:147 +msgid "First Termination" +msgstr "1 回目の解約" + +#: vpn/forms/model_forms.py:151 +msgid "Second Termination" +msgstr "2 回目の終了" + +#: vpn/forms/model_forms.py:198 +msgid "This parameter is required when defining a termination." +msgstr "このパラメータは、終端を定義する場合に必要です。" + +#: vpn/forms/model_forms.py:314 vpn/forms/model_forms.py:349 +msgid "Policy" +msgstr "ポリシー" + +#: vpn/forms/model_forms.py:469 +msgid "A termination must specify an interface or VLAN." +msgstr "終端にはインターフェイスまたは VLAN を指定する必要があります。" + +#: vpn/forms/model_forms.py:471 +msgid "" +"A termination can only have one terminating object (an interface or VLAN)." +msgstr "終端には、1 つの終端オブジェクト(インターフェイスまたは VLAN)しか設定できません。" + +#: vpn/models/crypto.py:33 +msgid "encryption algorithm" +msgstr "暗号化アルゴリズム" + +#: vpn/models/crypto.py:37 +msgid "authentication algorithm" +msgstr "認証アルゴリズム" + +#: vpn/models/crypto.py:44 +msgid "Diffie-Hellman group ID" +msgstr "ディフィー・ヘルマングループ ID" + +#: vpn/models/crypto.py:50 +msgid "Security association lifetime (in seconds)" +msgstr "セキュリティアソシエーションの有効期間 (秒単位)" + +#: vpn/models/crypto.py:59 +msgid "IKE proposal" +msgstr "イケアの提案" + +#: vpn/models/crypto.py:60 +msgid "IKE proposals" +msgstr "IKEの提案" + +#: vpn/models/crypto.py:76 +msgid "version" +msgstr "版" + +#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +msgid "proposals" +msgstr "提案" + +#: vpn/models/crypto.py:91 wireless/models.py:38 +msgid "pre-shared key" +msgstr "事前共有キー" + +#: vpn/models/crypto.py:105 +msgid "IKE policies" +msgstr "IKE ポリシー" + +#: vpn/models/crypto.py:118 +msgid "Mode is required for selected IKE version" +msgstr "選択した IKE バージョンにはモードが必要です" + +#: vpn/models/crypto.py:122 +msgid "Mode cannot be used for selected IKE version" +msgstr "モードは選択された IKE バージョンでは使用できません" + +#: vpn/models/crypto.py:136 +msgid "encryption" +msgstr "暗号化" + +#: vpn/models/crypto.py:141 +msgid "authentication" +msgstr "認証" + +#: vpn/models/crypto.py:149 +msgid "Security association lifetime (seconds)" +msgstr "セキュリティアソシエーションの有効期間 (秒)" + +#: vpn/models/crypto.py:155 +msgid "Security association lifetime (in kilobytes)" +msgstr "セキュリティアソシエーションの有効期間 (KB 単位)" + +#: vpn/models/crypto.py:164 +msgid "IPSec proposal" +msgstr "IPsec プロポーザル" + +#: vpn/models/crypto.py:165 +msgid "IPSec proposals" +msgstr "IPsec プロポーザル" + +#: vpn/models/crypto.py:178 +msgid "Encryption and/or authentication algorithm must be defined" +msgstr "暗号化および/または認証アルゴリズムを定義する必要があります" + +#: vpn/models/crypto.py:210 +msgid "IPSec policies" +msgstr "IPsec ポリシー" + +#: vpn/models/crypto.py:251 +msgid "IPSec profiles" +msgstr "IPsec プロファイル" + +#: vpn/models/l2vpn.py:116 +msgid "L2VPN termination" +msgstr "L2 VPN ターミネーション" + +#: vpn/models/l2vpn.py:117 +msgid "L2VPN terminations" +msgstr "L2 VPN ターミネーション" + +#: vpn/models/l2vpn.py:135 +#, python-brace-format +msgid "L2VPN Termination already assigned ({assigned_object})" +msgstr "L2VPN ターミネーションはすでに割り当てられています({assigned_object})" + +#: vpn/models/l2vpn.py:147 +#, python-brace-format +msgid "" +"{l2vpn_type} L2VPNs cannot have more than two terminations; found " +"{terminations_count} already defined." +msgstr "" +"{l2vpn_type} L2VPN のターミネーションは 3 つまでです。見つかりました {terminations_count} 定義済みです。" + +#: vpn/models/tunnels.py:26 +msgid "tunnel group" +msgstr "トンネルグループ" + +#: vpn/models/tunnels.py:27 +msgid "tunnel groups" +msgstr "トンネルグループ" + +#: vpn/models/tunnels.py:53 +msgid "encapsulation" +msgstr "カプセル化" + +#: vpn/models/tunnels.py:72 +msgid "tunnel ID" +msgstr "トンネル ID" + +#: vpn/models/tunnels.py:94 +msgid "tunnel" +msgstr "トンネル" + +#: vpn/models/tunnels.py:95 +msgid "tunnels" +msgstr "トンネル" + +#: vpn/models/tunnels.py:153 +msgid "An object may be terminated to only one tunnel at a time." +msgstr "オブジェクトは一度に 1 つのトンネルにしか終端できません。" + +#: vpn/models/tunnels.py:156 +msgid "tunnel termination" +msgstr "トンネル終端" + +#: vpn/models/tunnels.py:157 +msgid "tunnel terminations" +msgstr "トンネル終端" + +#: vpn/models/tunnels.py:174 +#, python-brace-format +msgid "{name} is already attached to a tunnel ({tunnel})." +msgstr "{name} すでにトンネルに接続されています ({tunnel})。" + +#: vpn/tables/crypto.py:22 +msgid "Authentication Method" +msgstr "認証方法" + +#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +msgid "Encryption Algorithm" +msgstr "暗号化アルゴリズム" + +#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +msgid "Authentication Algorithm" +msgstr "認証アルゴリズム" + +#: vpn/tables/crypto.py:34 +msgid "SA Lifetime" +msgstr "SA ライフタイム" + +#: vpn/tables/crypto.py:71 +msgid "Pre-shared Key" +msgstr "事前共有キー" + +#: vpn/tables/crypto.py:103 +msgid "SA Lifetime (Seconds)" +msgstr "SA ライフタイム (秒)" + +#: vpn/tables/crypto.py:106 +msgid "SA Lifetime (KB)" +msgstr "SA ライフタイム (KB)" + +#: vpn/tables/l2vpn.py:69 +msgid "Object Parent" +msgstr "オブジェクト親" + +#: vpn/tables/l2vpn.py:74 +msgid "Object Site" +msgstr "オブジェクトサイト" + +#: vpn/tables/tunnels.py:84 +msgid "Host" +msgstr "ホスト" + +#: wireless/choices.py:11 +msgid "Access point" +msgstr "アクセスポイント" + +#: wireless/choices.py:12 +msgid "Station" +msgstr "ステーション" + +#: wireless/choices.py:467 +msgid "Open" +msgstr "[開く]" + +#: wireless/choices.py:469 +msgid "WPA Personal (PSK)" +msgstr "WPA パーソナル (PSK)" + +#: wireless/choices.py:470 +msgid "WPA Enterprise" +msgstr "WPA エンタープライズ" + +#: wireless/forms/bulk_edit.py:72 wireless/forms/bulk_edit.py:119 +#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 +#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 +#: wireless/forms/filtersets.py:58 wireless/forms/filtersets.py:92 +msgid "Authentication cipher" +msgstr "認証暗号" + +#: wireless/forms/bulk_import.py:52 +msgid "Bridged VLAN" +msgstr "ブリッジド VLAN" + +#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:27 +msgid "Interface A" +msgstr "インターフェイス A" + +#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:36 +msgid "Interface B" +msgstr "インターフェイス B" + +#: wireless/forms/model_forms.py:158 +msgid "Side B" +msgstr "サイド B" + +#: wireless/models.py:30 +msgid "authentication cipher" +msgstr "認証暗号" + +#: wireless/models.py:68 +msgid "wireless LAN group" +msgstr "ワイヤレス LAN グループ" + +#: wireless/models.py:69 +msgid "wireless LAN groups" +msgstr "ワイヤレス LAN グループ" + +#: wireless/models.py:115 +msgid "wireless LAN" +msgstr "ワイヤレス LAN" + +#: wireless/models.py:143 +msgid "interface A" +msgstr "インターフェイス A" + +#: wireless/models.py:150 +msgid "interface B" +msgstr "インタフェース B" + +#: wireless/models.py:198 +msgid "wireless link" +msgstr "ワイヤレスリンク" + +#: wireless/models.py:199 +msgid "wireless links" +msgstr "ワイヤレスリンク" + +#: wireless/models.py:216 wireless/models.py:222 +#, python-brace-format +msgid "{type} is not a wireless interface." +msgstr "{type} ワイヤレスインターフェースではありません。" diff --git a/netbox/translations/tr/LC_MESSAGES/django.mo b/netbox/translations/tr/LC_MESSAGES/django.mo new file mode 100644 index 0000000000000000000000000000000000000000..0405a80a14f26e5e547d50526833106eb04ad8b5 GIT binary patch literal 192217 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 K&rI=kp#KHmH3l>Q literal 0 HcmV?d00001 diff --git a/netbox/translations/tr/LC_MESSAGES/django.po b/netbox/translations/tr/LC_MESSAGES/django.po new file mode 100644 index 000000000..b789eb530 --- /dev/null +++ b/netbox/translations/tr/LC_MESSAGES/django.po @@ -0,0 +1,13543 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +# Translators: +# Jeremy Stretch, 2024 +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-01-22 21:17+0000\n" +"PO-Revision-Date: 2023-10-30 17:48+0000\n" +"Last-Translator: Jeremy Stretch, 2024\n" +"Language-Team: Turkish (https://app.transifex.com/netbox-community/teams/178115/tr/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Language: tr\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: account/tables.py:27 templates/account/token.html:23 +#: templates/users/token.html:18 users/forms/bulk_import.py:41 +#: users/forms/model_forms.py:114 +msgid "Key" +msgstr "Anahtar" + +#: account/tables.py:31 users/forms/filtersets.py:133 +msgid "Write Enabled" +msgstr "Yazma Etkin" + +#: account/tables.py:34 core/tables/jobs.py:29 extras/choices.py:135 +#: extras/tables/tables.py:474 templates/account/token.html:44 +#: templates/core/configrevision.html:34 +#: templates/core/configrevision_restore.html:12 templates/core/job.html:58 +#: templates/extras/htmx/report_result.html:11 +#: templates/extras/htmx/script_result.html:12 +#: templates/extras/journalentry.html:25 templates/generic/object.html:48 +#: templates/users/token.html:36 +msgid "Created" +msgstr "Oluşturuldu" + +#: account/tables.py:37 templates/account/token.html:48 +#: templates/users/token.html:40 users/forms/bulk_edit.py:97 +#: users/forms/filtersets.py:137 +msgid "Expires" +msgstr "Süresi doluyor" + +#: account/tables.py:40 users/forms/filtersets.py:142 +msgid "Last Used" +msgstr "Son Kullanılan" + +#: account/tables.py:43 templates/account/token.html:56 +#: templates/users/token.html:48 users/forms/bulk_edit.py:102 +#: users/forms/model_forms.py:126 +msgid "Allowed IPs" +msgstr "İzin verilen IP'ler" + +#: account/views.py:197 +msgid "Your preferences have been updated." +msgstr "" + +#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 +#: dcim/choices.py:174 dcim/choices.py:220 dcim/choices.py:1419 +#: dcim/choices.py:1495 dcim/choices.py:1545 virtualization/choices.py:20 +#: virtualization/choices.py:45 vpn/choices.py:18 +msgid "Planned" +msgstr "Planlanan" + +#: circuits/choices.py:22 netbox/navigation/menu.py:290 +msgid "Provisioning" +msgstr "Tedarik" + +#: circuits/choices.py:23 dcim/choices.py:22 dcim/choices.py:103 +#: dcim/choices.py:173 dcim/choices.py:219 dcim/choices.py:1494 +#: dcim/choices.py:1544 extras/tables/tables.py:380 ipam/choices.py:31 +#: ipam/choices.py:49 ipam/choices.py:69 ipam/choices.py:154 +#: templates/extras/configcontext.html:26 templates/users/user.html:34 +#: users/forms/bulk_edit.py:36 virtualization/choices.py:22 +#: virtualization/choices.py:44 vpn/choices.py:19 wireless/choices.py:25 +msgid "Active" +msgstr "Aktif" + +#: circuits/choices.py:24 dcim/choices.py:172 dcim/choices.py:218 +#: dcim/choices.py:1493 dcim/choices.py:1546 virtualization/choices.py:24 +#: virtualization/choices.py:43 +msgid "Offline" +msgstr "Çevrimdışı" + +#: circuits/choices.py:25 +msgid "Deprovisioning" +msgstr "Hazırlıktan Kaldırma" + +#: circuits/choices.py:26 +msgid "Decommissioned" +msgstr "Hizmet dışı bırakıldı" + +#: circuits/filtersets.py:29 circuits/filtersets.py:184 dcim/filtersets.py:122 +#: dcim/filtersets.py:183 dcim/filtersets.py:258 dcim/filtersets.py:367 +#: dcim/filtersets.py:889 dcim/filtersets.py:1193 dcim/filtersets.py:1688 +#: dcim/filtersets.py:1931 dcim/filtersets.py:1989 ipam/filtersets.py:305 +#: ipam/filtersets.py:896 virtualization/filtersets.py:45 +#: virtualization/filtersets.py:173 vpn/filtersets.py:330 +msgid "Region (ID)" +msgstr "Bölge (ID)" + +#: circuits/filtersets.py:36 circuits/filtersets.py:191 dcim/filtersets.py:128 +#: dcim/filtersets.py:190 dcim/filtersets.py:265 dcim/filtersets.py:374 +#: dcim/filtersets.py:896 dcim/filtersets.py:1200 dcim/filtersets.py:1695 +#: dcim/filtersets.py:1938 dcim/filtersets.py:1996 extras/filtersets.py:414 +#: ipam/filtersets.py:312 ipam/filtersets.py:903 +#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 +#: vpn/filtersets.py:325 +msgid "Region (slug)" +msgstr "Bölge (sümüklü böcek)" + +#: circuits/filtersets.py:42 circuits/filtersets.py:197 dcim/filtersets.py:196 +#: dcim/filtersets.py:271 dcim/filtersets.py:380 dcim/filtersets.py:902 +#: dcim/filtersets.py:1206 dcim/filtersets.py:1701 dcim/filtersets.py:1944 +#: dcim/filtersets.py:2002 ipam/filtersets.py:318 ipam/filtersets.py:909 +#: virtualization/filtersets.py:58 virtualization/filtersets.py:186 +msgid "Site group (ID)" +msgstr "Site grubu (ID)" + +#: circuits/filtersets.py:49 circuits/filtersets.py:204 dcim/filtersets.py:203 +#: dcim/filtersets.py:278 dcim/filtersets.py:387 dcim/filtersets.py:909 +#: dcim/filtersets.py:1213 dcim/filtersets.py:1708 dcim/filtersets.py:1951 +#: dcim/filtersets.py:2009 extras/filtersets.py:420 ipam/filtersets.py:325 +#: ipam/filtersets.py:916 virtualization/filtersets.py:65 +#: virtualization/filtersets.py:193 +msgid "Site group (slug)" +msgstr "Site grubu (sümüklü böcek)" + +#: circuits/filtersets.py:54 circuits/forms/bulk_import.py:117 +#: circuits/forms/filtersets.py:47 circuits/forms/filtersets.py:171 +#: circuits/forms/model_forms.py:137 dcim/forms/bulk_edit.py:166 +#: dcim/forms/bulk_edit.py:238 dcim/forms/bulk_edit.py:570 +#: dcim/forms/bulk_edit.py:763 dcim/forms/bulk_import.py:130 +#: dcim/forms/bulk_import.py:176 dcim/forms/bulk_import.py:249 +#: dcim/forms/bulk_import.py:477 dcim/forms/bulk_import.py:1239 +#: dcim/forms/bulk_import.py:1267 dcim/forms/filtersets.py:84 +#: dcim/forms/filtersets.py:217 dcim/forms/filtersets.py:264 +#: dcim/forms/filtersets.py:373 dcim/forms/filtersets.py:680 +#: dcim/forms/filtersets.py:910 dcim/forms/filtersets.py:934 +#: dcim/forms/filtersets.py:1024 dcim/forms/filtersets.py:1062 +#: dcim/forms/filtersets.py:1468 dcim/forms/filtersets.py:1492 +#: dcim/forms/filtersets.py:1516 dcim/forms/model_forms.py:138 +#: dcim/forms/model_forms.py:167 dcim/forms/model_forms.py:211 +#: dcim/forms/model_forms.py:397 dcim/forms/model_forms.py:630 +#: dcim/forms/object_create.py:390 dcim/tables/devices.py:186 +#: dcim/tables/power.py:26 dcim/tables/power.py:93 dcim/tables/racks.py:62 +#: dcim/tables/racks.py:138 dcim/tables/sites.py:129 extras/filtersets.py:430 +#: ipam/forms/bulk_edit.py:215 ipam/forms/bulk_edit.py:269 +#: ipam/forms/bulk_edit.py:447 ipam/forms/bulk_edit.py:519 +#: ipam/forms/bulk_import.py:170 ipam/forms/bulk_import.py:437 +#: ipam/forms/filtersets.py:152 ipam/forms/filtersets.py:226 +#: ipam/forms/filtersets.py:417 ipam/forms/filtersets.py:470 +#: ipam/forms/model_forms.py:206 ipam/forms/model_forms.py:548 +#: ipam/forms/model_forms.py:640 ipam/tables/ip.py:244 +#: ipam/tables/vlans.py:114 ipam/tables/vlans.py:216 +#: templates/circuits/circuittermination_edit.html:20 +#: templates/circuits/inc/circuit_termination.html:33 +#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 +#: templates/dcim/inc/cable_termination.html:33 +#: templates/dcim/location.html:40 templates/dcim/powerpanel.html:23 +#: templates/dcim/rack.html:25 templates/dcim/rackreservation.html:31 +#: templates/dcim/site.html:27 templates/ipam/prefix.html:57 +#: templates/ipam/vlan.html:26 templates/ipam/vlan_edit.html:40 +#: templates/virtualization/cluster.html:45 +#: templates/virtualization/virtualmachine.html:96 +#: virtualization/forms/bulk_edit.py:90 virtualization/forms/bulk_edit.py:99 +#: virtualization/forms/bulk_edit.py:108 virtualization/forms/bulk_edit.py:123 +#: virtualization/forms/bulk_import.py:59 +#: virtualization/forms/bulk_import.py:85 +#: virtualization/forms/filtersets.py:78 +#: virtualization/forms/filtersets.py:144 +#: virtualization/forms/model_forms.py:74 +#: virtualization/forms/model_forms.py:107 +#: virtualization/forms/model_forms.py:174 +#: virtualization/tables/clusters.py:77 +#: virtualization/tables/virtualmachines.py:53 vpn/forms/filtersets.py:262 +#: wireless/forms/model_forms.py:77 wireless/forms/model_forms.py:117 +msgid "Site" +msgstr "SİTE" + +#: circuits/filtersets.py:60 circuits/filtersets.py:215 +#: circuits/filtersets.py:252 dcim/filtersets.py:213 dcim/filtersets.py:288 +#: dcim/filtersets.py:361 extras/filtersets.py:436 ipam/filtersets.py:215 +#: ipam/filtersets.py:335 ipam/filtersets.py:926 +#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 +#: vpn/filtersets.py:335 +msgid "Site (slug)" +msgstr "Site (sümüklü böcek)" + +#: circuits/filtersets.py:65 +msgid "ASN (ID)" +msgstr "ASN (KİMLİK)" + +#: circuits/filtersets.py:87 circuits/filtersets.py:114 +#: circuits/filtersets.py:148 +msgid "Provider (ID)" +msgstr "Sağlayıcı (ID)" + +#: circuits/filtersets.py:93 circuits/filtersets.py:120 +#: circuits/filtersets.py:154 +msgid "Provider (slug)" +msgstr "Sağlayıcı (sümüklü böcek)" + +#: circuits/filtersets.py:159 +msgid "Provider account (ID)" +msgstr "Sağlayıcı hesabı (ID)" + +#: circuits/filtersets.py:164 +msgid "Provider network (ID)" +msgstr "Sağlayıcı ağı (ID)" + +#: circuits/filtersets.py:168 +msgid "Circuit type (ID)" +msgstr "Devre tipi (ID)" + +#: circuits/filtersets.py:174 +msgid "Circuit type (slug)" +msgstr "Devre tipi (sümüklü böcek)" + +#: circuits/filtersets.py:209 circuits/filtersets.py:246 +#: dcim/filtersets.py:207 dcim/filtersets.py:282 dcim/filtersets.py:355 +#: dcim/filtersets.py:913 dcim/filtersets.py:1218 dcim/filtersets.py:1713 +#: dcim/filtersets.py:1955 dcim/filtersets.py:2014 ipam/filtersets.py:209 +#: ipam/filtersets.py:329 ipam/filtersets.py:920 +#: virtualization/filtersets.py:69 virtualization/filtersets.py:197 +#: vpn/filtersets.py:340 +msgid "Site (ID)" +msgstr "Site (ID)" + +#: circuits/filtersets.py:238 core/filtersets.py:73 core/filtersets.py:132 +#: dcim/filtersets.py:638 dcim/filtersets.py:1187 dcim/filtersets.py:2062 +#: extras/filtersets.py:40 extras/filtersets.py:69 extras/filtersets.py:101 +#: extras/filtersets.py:140 extras/filtersets.py:168 extras/filtersets.py:195 +#: extras/filtersets.py:226 extras/filtersets.py:295 extras/filtersets.py:343 +#: extras/filtersets.py:403 extras/filtersets.py:562 extras/filtersets.py:604 +#: extras/filtersets.py:645 ipam/forms/model_forms.py:430 +#: netbox/filtersets.py:275 netbox/forms/__init__.py:23 +#: netbox/forms/base.py:163 templates/htmx/object_selector.html:28 +#: templates/inc/filter_list.html:53 templates/ipam/ipaddress_assign.html:32 +#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:87 +#: users/filtersets.py:21 users/filtersets.py:37 users/filtersets.py:69 +#: users/filtersets.py:117 utilities/forms/forms.py:99 +msgid "Search" +msgstr "Arama" + +#: circuits/filtersets.py:242 circuits/forms/bulk_edit.py:167 +#: circuits/forms/model_forms.py:110 circuits/forms/model_forms.py:132 +#: dcim/forms/connections.py:66 templates/circuits/circuit.html:15 +#: templates/dcim/inc/cable_termination.html:55 +#: templates/dcim/trace/circuit.html:4 +msgid "Circuit" +msgstr "Devre" + +#: circuits/filtersets.py:256 +msgid "ProviderNetwork (ID)" +msgstr "Sağlayıcı Ağı (ID)" + +#: circuits/forms/bulk_edit.py:25 circuits/forms/filtersets.py:56 +#: circuits/forms/model_forms.py:26 circuits/tables/providers.py:33 +#: dcim/forms/bulk_edit.py:126 dcim/forms/filtersets.py:187 +#: dcim/forms/model_forms.py:126 dcim/tables/sites.py:94 +#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:219 +#: netbox/navigation/menu.py:160 netbox/navigation/menu.py:163 +#: templates/circuits/provider.html:24 +msgid "ASNs" +msgstr "ASN'ler" + +#: circuits/forms/bulk_edit.py:29 circuits/forms/bulk_edit.py:51 +#: circuits/forms/bulk_edit.py:78 circuits/forms/bulk_edit.py:99 +#: circuits/forms/bulk_edit.py:159 core/forms/bulk_edit.py:27 +#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:71 +#: dcim/forms/bulk_edit.py:90 dcim/forms/bulk_edit.py:149 +#: dcim/forms/bulk_edit.py:190 dcim/forms/bulk_edit.py:208 +#: dcim/forms/bulk_edit.py:336 dcim/forms/bulk_edit.py:371 +#: dcim/forms/bulk_edit.py:386 dcim/forms/bulk_edit.py:445 +#: dcim/forms/bulk_edit.py:484 dcim/forms/bulk_edit.py:514 +#: dcim/forms/bulk_edit.py:538 dcim/forms/bulk_edit.py:608 +#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:709 +#: dcim/forms/bulk_edit.py:732 dcim/forms/bulk_edit.py:780 +#: dcim/forms/bulk_edit.py:850 dcim/forms/bulk_edit.py:903 +#: dcim/forms/bulk_edit.py:938 dcim/forms/bulk_edit.py:978 +#: dcim/forms/bulk_edit.py:1022 dcim/forms/bulk_edit.py:1067 +#: dcim/forms/bulk_edit.py:1094 dcim/forms/bulk_edit.py:1112 +#: dcim/forms/bulk_edit.py:1130 dcim/forms/bulk_edit.py:1148 +#: dcim/forms/bulk_edit.py:1566 extras/forms/bulk_edit.py:36 +#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:152 +#: extras/forms/bulk_edit.py:182 extras/forms/bulk_edit.py:263 +#: extras/forms/bulk_edit.py:287 extras/forms/bulk_edit.py:301 +#: extras/tables/tables.py:56 ipam/forms/bulk_edit.py:50 +#: ipam/forms/bulk_edit.py:70 ipam/forms/bulk_edit.py:90 +#: ipam/forms/bulk_edit.py:114 ipam/forms/bulk_edit.py:143 +#: ipam/forms/bulk_edit.py:172 ipam/forms/bulk_edit.py:191 +#: ipam/forms/bulk_edit.py:260 ipam/forms/bulk_edit.py:304 +#: ipam/forms/bulk_edit.py:352 ipam/forms/bulk_edit.py:395 +#: ipam/forms/bulk_edit.py:423 ipam/forms/bulk_edit.py:551 +#: ipam/forms/bulk_edit.py:582 templates/account/token.html:36 +#: templates/circuits/circuit.html:60 templates/circuits/circuittype.html:29 +#: templates/circuits/inc/circuit_termination.html:115 +#: templates/circuits/provider.html:34 +#: templates/circuits/providernetwork.html:35 +#: templates/core/datasource.html:55 templates/dcim/cable.html:37 +#: templates/dcim/consoleport.html:47 templates/dcim/consoleserverport.html:47 +#: templates/dcim/device.html:96 templates/dcim/devicebay.html:35 +#: templates/dcim/devicerole.html:33 templates/dcim/devicetype.html:36 +#: templates/dcim/frontport.html:61 templates/dcim/interface.html:70 +#: templates/dcim/inventoryitem.html:61 +#: templates/dcim/inventoryitemrole.html:23 templates/dcim/location.html:36 +#: templates/dcim/manufacturer.html:43 templates/dcim/module.html:71 +#: templates/dcim/modulebay.html:39 templates/dcim/moduletype.html:27 +#: templates/dcim/platform.html:36 templates/dcim/powerfeed.html:43 +#: templates/dcim/poweroutlet.html:43 templates/dcim/powerpanel.html:31 +#: templates/dcim/powerport.html:43 templates/dcim/rack.html:54 +#: templates/dcim/rackreservation.html:69 templates/dcim/rackrole.html:29 +#: templates/dcim/rearport.html:57 templates/dcim/region.html:34 +#: templates/dcim/site.html:60 templates/dcim/sitegroup.html:34 +#: templates/dcim/virtualchassis.html:32 +#: templates/extras/admin/plugins_list.html:26 +#: templates/extras/configcontext.html:22 +#: templates/extras/configtemplate.html:18 +#: templates/extras/customfield.html:35 +#: templates/extras/dashboard/widget_add.html:14 +#: templates/extras/eventrule.html:24 templates/extras/exporttemplate.html:25 +#: templates/extras/report_list.html:47 templates/extras/savedfilter.html:18 +#: templates/extras/script_list.html:53 templates/extras/tag.html:23 +#: templates/extras/webhook.html:20 templates/generic/bulk_import.html:118 +#: templates/ipam/aggregate.html:44 templates/ipam/asn.html:43 +#: templates/ipam/asnrange.html:39 templates/ipam/fhrpgroup.html:35 +#: templates/ipam/ipaddress.html:58 templates/ipam/iprange.html:70 +#: templates/ipam/prefix.html:82 templates/ipam/rir.html:29 +#: templates/ipam/role.html:29 templates/ipam/routetarget.html:22 +#: templates/ipam/service.html:53 templates/ipam/servicetemplate.html:28 +#: templates/ipam/vlan.html:65 templates/ipam/vlangroup.html:35 +#: templates/ipam/vrf.html:36 templates/tenancy/contact.html:68 +#: templates/tenancy/contactgroup.html:28 +#: templates/tenancy/contactrole.html:23 templates/tenancy/tenant.html:25 +#: templates/tenancy/tenantgroup.html:36 +#: templates/users/objectpermission.html:22 templates/users/token.html:28 +#: templates/virtualization/cluster.html:28 +#: templates/virtualization/clustergroup.html:29 +#: templates/virtualization/clustertype.html:29 +#: templates/virtualization/virtualdisk.html:40 +#: templates/virtualization/virtualmachine.html:34 +#: templates/virtualization/vminterface.html:54 +#: templates/vpn/ikepolicy.html:18 templates/vpn/ikeproposal.html:18 +#: templates/vpn/ipsecpolicy.html:18 templates/vpn/ipsecprofile.html:18 +#: templates/vpn/ipsecprofile.html:43 templates/vpn/ipsecprofile.html:78 +#: templates/vpn/ipsecproposal.html:18 templates/vpn/l2vpn.html:27 +#: templates/vpn/tunnel.html:34 templates/vpn/tunnelgroup.html:33 +#: templates/wireless/wirelesslan.html:27 +#: templates/wireless/wirelesslangroup.html:34 +#: templates/wireless/wirelesslink.html:37 tenancy/forms/bulk_edit.py:31 +#: tenancy/forms/bulk_edit.py:79 tenancy/forms/bulk_edit.py:121 +#: users/forms/bulk_edit.py:62 users/forms/bulk_edit.py:92 +#: virtualization/forms/bulk_edit.py:31 virtualization/forms/bulk_edit.py:45 +#: virtualization/forms/bulk_edit.py:176 virtualization/forms/bulk_edit.py:227 +#: virtualization/forms/bulk_edit.py:336 vpn/forms/bulk_edit.py:27 +#: vpn/forms/bulk_edit.py:63 vpn/forms/bulk_edit.py:120 +#: vpn/forms/bulk_edit.py:154 vpn/forms/bulk_edit.py:191 +#: vpn/forms/bulk_edit.py:216 vpn/forms/bulk_edit.py:248 +#: vpn/forms/bulk_edit.py:277 wireless/forms/bulk_edit.py:28 +#: wireless/forms/bulk_edit.py:81 wireless/forms/bulk_edit.py:128 +msgid "Description" +msgstr "Açıklama" + +#: circuits/forms/bulk_edit.py:46 circuits/forms/bulk_edit.py:68 +#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:35 +#: circuits/forms/bulk_import.py:50 circuits/forms/bulk_import.py:76 +#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 +#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 +#: circuits/forms/model_forms.py:32 circuits/forms/model_forms.py:44 +#: circuits/forms/model_forms.py:58 circuits/forms/model_forms.py:92 +#: circuits/tables/circuits.py:55 circuits/tables/providers.py:72 +#: circuits/tables/providers.py:103 templates/circuits/circuit.html:19 +#: templates/circuits/provider.html:20 +#: templates/circuits/provideraccount.html:21 +#: templates/circuits/providernetwork.html:23 +#: templates/dcim/inc/cable_termination.html:51 +msgid "Provider" +msgstr "Sağlayıcı" + +#: circuits/forms/bulk_edit.py:75 circuits/forms/filtersets.py:91 +#: templates/circuits/providernetwork.html:31 +msgid "Service ID" +msgstr "Servis Kimliği" + +#: circuits/forms/bulk_edit.py:95 circuits/forms/filtersets.py:107 +#: dcim/forms/bulk_edit.py:204 dcim/forms/bulk_edit.py:500 +#: dcim/forms/bulk_edit.py:694 dcim/forms/bulk_edit.py:1063 +#: dcim/forms/bulk_edit.py:1090 dcim/forms/bulk_edit.py:1562 +#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1353 +#: dcim/forms/filtersets.py:1374 dcim/tables/devices.py:717 +#: dcim/tables/devices.py:777 dcim/tables/devices.py:1004 +#: dcim/tables/devicetypes.py:245 dcim/tables/devicetypes.py:260 +#: dcim/tables/racks.py:32 extras/forms/bulk_edit.py:259 +#: extras/tables/tables.py:328 templates/circuits/circuittype.html:33 +#: templates/dcim/cable.html:41 templates/dcim/devicerole.html:37 +#: templates/dcim/frontport.html:43 templates/dcim/inventoryitemrole.html:27 +#: templates/dcim/rackrole.html:33 templates/dcim/rearport.html:43 +#: templates/extras/tag.html:29 +msgid "Color" +msgstr "Renk" + +#: circuits/forms/bulk_edit.py:113 circuits/forms/bulk_import.py:89 +#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:17 +#: core/forms/filtersets.py:29 core/tables/data.py:20 core/tables/jobs.py:18 +#: dcim/forms/bulk_edit.py:281 dcim/forms/bulk_edit.py:672 +#: dcim/forms/bulk_edit.py:811 dcim/forms/bulk_edit.py:879 +#: dcim/forms/bulk_edit.py:898 dcim/forms/bulk_edit.py:921 +#: dcim/forms/bulk_edit.py:963 dcim/forms/bulk_edit.py:1007 +#: dcim/forms/bulk_edit.py:1058 dcim/forms/bulk_edit.py:1085 +#: dcim/forms/bulk_import.py:206 dcim/forms/bulk_import.py:645 +#: dcim/forms/bulk_import.py:671 dcim/forms/bulk_import.py:697 +#: dcim/forms/bulk_import.py:717 dcim/forms/bulk_import.py:800 +#: dcim/forms/bulk_import.py:890 dcim/forms/bulk_import.py:932 +#: dcim/forms/bulk_import.py:1145 dcim/forms/bulk_import.py:1304 +#: dcim/forms/filtersets.py:286 dcim/forms/filtersets.py:867 +#: dcim/forms/filtersets.py:967 dcim/forms/filtersets.py:1088 +#: dcim/forms/filtersets.py:1158 dcim/forms/filtersets.py:1180 +#: dcim/forms/filtersets.py:1202 dcim/forms/filtersets.py:1219 +#: dcim/forms/filtersets.py:1253 dcim/forms/filtersets.py:1348 +#: dcim/forms/filtersets.py:1369 dcim/forms/object_import.py:89 +#: dcim/forms/object_import.py:118 dcim/forms/object_import.py:150 +#: dcim/tables/devices.py:211 dcim/tables/devices.py:833 +#: dcim/tables/power.py:77 extras/forms/bulk_import.py:39 +#: extras/tables/tables.py:278 extras/tables/tables.py:350 +#: extras/tables/tables.py:448 netbox/tables/tables.py:234 +#: templates/circuits/circuit.html:31 templates/core/datasource.html:39 +#: templates/dcim/cable.html:16 templates/dcim/consoleport.html:39 +#: templates/dcim/consoleserverport.html:39 templates/dcim/frontport.html:39 +#: templates/dcim/interface.html:47 templates/dcim/interface.html:175 +#: templates/dcim/interface.html:323 templates/dcim/powerfeed.html:35 +#: templates/dcim/poweroutlet.html:39 templates/dcim/powerport.html:39 +#: templates/dcim/rack.html:81 templates/dcim/rearport.html:39 +#: templates/extras/eventrule.html:95 templates/virtualization/cluster.html:20 +#: templates/vpn/l2vpn.html:23 +#: templates/wireless/inc/authentication_attrs.html:9 +#: templates/wireless/inc/wirelesslink_interface.html:14 +#: virtualization/forms/bulk_edit.py:59 virtualization/forms/bulk_import.py:41 +#: virtualization/forms/filtersets.py:53 +#: virtualization/forms/model_forms.py:65 virtualization/tables/clusters.py:66 +#: vpn/forms/bulk_edit.py:267 vpn/forms/bulk_import.py:264 +#: vpn/forms/filtersets.py:214 vpn/forms/model_forms.py:83 +#: vpn/forms/model_forms.py:118 vpn/forms/model_forms.py:232 +msgid "Type" +msgstr "Tür" + +#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:82 +#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:97 +msgid "Provider account" +msgstr "Sağlayıcı hesabı" + +#: circuits/forms/bulk_edit.py:131 circuits/forms/bulk_import.py:95 +#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:34 +#: core/forms/filtersets.py:75 core/tables/data.py:23 core/tables/jobs.py:26 +#: dcim/forms/bulk_edit.py:104 dcim/forms/bulk_edit.py:179 +#: dcim/forms/bulk_edit.py:260 dcim/forms/bulk_edit.py:593 +#: dcim/forms/bulk_edit.py:646 dcim/forms/bulk_edit.py:678 +#: dcim/forms/bulk_edit.py:805 dcim/forms/bulk_edit.py:1585 +#: dcim/forms/bulk_import.py:87 dcim/forms/bulk_import.py:146 +#: dcim/forms/bulk_import.py:194 dcim/forms/bulk_import.py:442 +#: dcim/forms/bulk_import.py:596 dcim/forms/bulk_import.py:1139 +#: dcim/forms/bulk_import.py:1299 dcim/forms/filtersets.py:170 +#: dcim/forms/filtersets.py:229 dcim/forms/filtersets.py:281 +#: dcim/forms/filtersets.py:726 dcim/forms/filtersets.py:835 +#: dcim/forms/filtersets.py:871 dcim/forms/filtersets.py:972 +#: dcim/forms/filtersets.py:1083 dcim/tables/devices.py:173 +#: dcim/tables/devices.py:836 dcim/tables/devices.py:1064 +#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:66 +#: dcim/tables/sites.py:82 dcim/tables/sites.py:133 +#: ipam/forms/bulk_edit.py:240 ipam/forms/bulk_edit.py:289 +#: ipam/forms/bulk_edit.py:337 ipam/forms/bulk_edit.py:541 +#: ipam/forms/bulk_import.py:191 ipam/forms/bulk_import.py:256 +#: ipam/forms/bulk_import.py:292 ipam/forms/bulk_import.py:458 +#: ipam/forms/filtersets.py:205 ipam/forms/filtersets.py:270 +#: ipam/forms/filtersets.py:341 ipam/forms/filtersets.py:482 +#: ipam/forms/model_forms.py:449 ipam/tables/ip.py:236 ipam/tables/ip.py:309 +#: ipam/tables/ip.py:359 ipam/tables/ip.py:421 ipam/tables/ip.py:448 +#: ipam/tables/vlans.py:122 ipam/tables/vlans.py:227 +#: templates/circuits/circuit.html:35 templates/core/datasource.html:47 +#: templates/core/job.html:35 templates/dcim/cable.html:20 +#: templates/dcim/device.html:183 templates/dcim/location.html:48 +#: templates/dcim/module.html:67 templates/dcim/powerfeed.html:39 +#: templates/dcim/rack.html:46 templates/dcim/site.html:43 +#: templates/extras/report_list.html:49 templates/extras/script_list.html:55 +#: templates/ipam/ipaddress.html:40 templates/ipam/iprange.html:57 +#: templates/ipam/prefix.html:74 templates/ipam/vlan.html:51 +#: templates/virtualization/cluster.html:24 +#: templates/virtualization/virtualmachine.html:22 +#: templates/vpn/tunnel.html:26 templates/wireless/wirelesslan.html:23 +#: templates/wireless/wirelesslink.html:20 users/forms/filtersets.py:33 +#: users/forms/model_forms.py:197 virtualization/forms/bulk_edit.py:69 +#: virtualization/forms/bulk_edit.py:117 +#: virtualization/forms/bulk_import.py:54 +#: virtualization/forms/bulk_import.py:80 +#: virtualization/forms/filtersets.py:61 +#: virtualization/forms/filtersets.py:156 virtualization/tables/clusters.py:74 +#: virtualization/tables/virtualmachines.py:50 vpn/forms/bulk_edit.py:38 +#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:46 +#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:42 +#: wireless/forms/bulk_edit.py:104 wireless/forms/bulk_import.py:43 +#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:48 +#: wireless/forms/filtersets.py:82 wireless/tables/wirelesslan.py:52 +#: wireless/tables/wirelesslink.py:19 +msgid "Status" +msgstr "Durum" + +#: circuits/forms/bulk_edit.py:137 circuits/forms/bulk_import.py:100 +#: circuits/forms/filtersets.py:119 dcim/forms/bulk_edit.py:120 +#: dcim/forms/bulk_edit.py:185 dcim/forms/bulk_edit.py:255 +#: dcim/forms/bulk_edit.py:366 dcim/forms/bulk_edit.py:583 +#: dcim/forms/bulk_edit.py:684 dcim/forms/bulk_edit.py:1590 +#: dcim/forms/bulk_import.py:106 dcim/forms/bulk_import.py:151 +#: dcim/forms/bulk_import.py:187 dcim/forms/bulk_import.py:274 +#: dcim/forms/bulk_import.py:416 dcim/forms/bulk_import.py:1151 +#: dcim/forms/bulk_import.py:1356 dcim/forms/filtersets.py:165 +#: dcim/forms/filtersets.py:197 dcim/forms/filtersets.py:248 +#: dcim/forms/filtersets.py:333 dcim/forms/filtersets.py:354 +#: dcim/forms/filtersets.py:653 dcim/forms/filtersets.py:826 +#: dcim/forms/filtersets.py:891 dcim/forms/filtersets.py:921 +#: dcim/forms/filtersets.py:1043 dcim/tables/power.py:88 +#: extras/filtersets.py:517 extras/forms/filtersets.py:331 +#: extras/forms/filtersets.py:405 ipam/forms/bulk_edit.py:40 +#: ipam/forms/bulk_edit.py:65 ipam/forms/bulk_edit.py:109 +#: ipam/forms/bulk_edit.py:138 ipam/forms/bulk_edit.py:163 +#: ipam/forms/bulk_edit.py:235 ipam/forms/bulk_edit.py:284 +#: ipam/forms/bulk_edit.py:332 ipam/forms/bulk_edit.py:536 +#: ipam/forms/bulk_import.py:37 ipam/forms/bulk_import.py:66 +#: ipam/forms/bulk_import.py:94 ipam/forms/bulk_import.py:114 +#: ipam/forms/bulk_import.py:134 ipam/forms/bulk_import.py:163 +#: ipam/forms/bulk_import.py:249 ipam/forms/bulk_import.py:285 +#: ipam/forms/bulk_import.py:451 ipam/forms/filtersets.py:47 +#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:99 +#: ipam/forms/filtersets.py:119 ipam/forms/filtersets.py:142 +#: ipam/forms/filtersets.py:169 ipam/forms/filtersets.py:256 +#: ipam/forms/filtersets.py:296 ipam/forms/filtersets.py:450 +#: ipam/tables/ip.py:451 ipam/tables/vlans.py:224 +#: templates/circuits/circuit.html:39 templates/dcim/cable.html:24 +#: templates/dcim/device.html:81 templates/dcim/location.html:52 +#: templates/dcim/powerfeed.html:47 templates/dcim/rack.html:37 +#: templates/dcim/rackreservation.html:56 templates/dcim/site.html:47 +#: templates/dcim/virtualdevicecontext.html:55 +#: templates/ipam/aggregate.html:31 templates/ipam/asn.html:34 +#: templates/ipam/asnrange.html:30 templates/ipam/ipaddress.html:31 +#: templates/ipam/iprange.html:61 templates/ipam/prefix.html:30 +#: templates/ipam/routetarget.html:18 templates/ipam/vlan.html:42 +#: templates/ipam/vrf.html:23 templates/tenancy/tenant.html:17 +#: templates/virtualization/cluster.html:36 +#: templates/virtualization/virtualmachine.html:38 templates/vpn/l2vpn.html:31 +#: templates/vpn/tunnel.html:50 templates/wireless/wirelesslan.html:35 +#: templates/wireless/wirelesslink.html:28 tenancy/forms/forms.py:25 +#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:53 +#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:75 +#: virtualization/forms/bulk_edit.py:154 +#: virtualization/forms/bulk_import.py:66 +#: virtualization/forms/bulk_import.py:115 +#: virtualization/forms/filtersets.py:46 +#: virtualization/forms/filtersets.py:101 vpn/forms/bulk_edit.py:58 +#: vpn/forms/bulk_edit.py:272 vpn/forms/bulk_import.py:59 +#: vpn/forms/bulk_import.py:258 vpn/forms/filtersets.py:211 +#: wireless/forms/bulk_edit.py:62 wireless/forms/bulk_edit.py:109 +#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 +#: wireless/forms/filtersets.py:34 wireless/forms/filtersets.py:74 +msgid "Tenant" +msgstr "Kiracı" + +#: circuits/forms/bulk_edit.py:142 circuits/forms/filtersets.py:174 +msgid "Install date" +msgstr "Yükleme tarihi" + +#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:179 +msgid "Termination date" +msgstr "Fesih tarihi" + +#: circuits/forms/bulk_edit.py:153 circuits/forms/filtersets.py:186 +msgid "Commit rate (Kbps)" +msgstr "Taahhüt oranı (Kbps)" + +#: circuits/forms/bulk_edit.py:168 circuits/forms/model_forms.py:111 +msgid "Service Parameters" +msgstr "Servis Parametreleri" + +#: circuits/forms/bulk_edit.py:169 circuits/forms/model_forms.py:112 +#: dcim/forms/model_forms.py:141 dcim/forms/model_forms.py:183 +#: dcim/forms/model_forms.py:260 dcim/forms/model_forms.py:672 +#: dcim/forms/model_forms.py:1478 ipam/forms/model_forms.py:61 +#: ipam/forms/model_forms.py:114 ipam/forms/model_forms.py:135 +#: ipam/forms/model_forms.py:159 ipam/forms/model_forms.py:231 +#: ipam/forms/model_forms.py:257 netbox/navigation/menu.py:38 +#: templates/dcim/cable_edit.html:68 templates/dcim/device_edit.html:85 +#: templates/dcim/rack_edit.html:30 templates/ipam/ipaddress_bulk_add.html:27 +#: templates/ipam/ipaddress_edit.html:27 templates/ipam/vlan_edit.html:22 +#: virtualization/forms/model_forms.py:83 +#: virtualization/forms/model_forms.py:225 vpn/forms/bulk_edit.py:77 +#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 +#: vpn/forms/model_forms.py:146 vpn/forms/model_forms.py:404 +#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:160 +msgid "Tenancy" +msgstr "Kiracılık" + +#: circuits/forms/bulk_import.py:38 circuits/forms/bulk_import.py:53 +#: circuits/forms/bulk_import.py:79 +msgid "Assigned provider" +msgstr "Atanan sağlayıcı" + +#: circuits/forms/bulk_import.py:70 dcim/forms/bulk_import.py:170 +#: dcim/forms/bulk_import.py:380 dcim/forms/bulk_import.py:1092 +#: dcim/forms/bulk_import.py:1171 extras/forms/bulk_import.py:229 +msgid "RGB color in hexadecimal. Example:" +msgstr "Onaltılık olarak RGB rengi. Örnek:" + +#: circuits/forms/bulk_import.py:85 +msgid "Assigned provider account" +msgstr "Atanan sağlayıcı hesabı" + +#: circuits/forms/bulk_import.py:92 +msgid "Type of circuit" +msgstr "Devre tipi" + +#: circuits/forms/bulk_import.py:97 dcim/forms/bulk_import.py:89 +#: dcim/forms/bulk_import.py:148 dcim/forms/bulk_import.py:196 +#: dcim/forms/bulk_import.py:444 dcim/forms/bulk_import.py:598 +#: dcim/forms/bulk_import.py:1301 ipam/forms/bulk_import.py:193 +#: ipam/forms/bulk_import.py:258 ipam/forms/bulk_import.py:294 +#: ipam/forms/bulk_import.py:460 virtualization/forms/bulk_import.py:56 +#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 +msgid "Operational status" +msgstr "Operasyonel durum" + +#: circuits/forms/bulk_import.py:104 dcim/forms/bulk_import.py:110 +#: dcim/forms/bulk_import.py:155 dcim/forms/bulk_import.py:278 +#: dcim/forms/bulk_import.py:420 dcim/forms/bulk_import.py:1155 +#: dcim/forms/bulk_import.py:1296 ipam/forms/bulk_import.py:41 +#: ipam/forms/bulk_import.py:70 ipam/forms/bulk_import.py:98 +#: ipam/forms/bulk_import.py:118 ipam/forms/bulk_import.py:138 +#: ipam/forms/bulk_import.py:167 ipam/forms/bulk_import.py:253 +#: ipam/forms/bulk_import.py:289 ipam/forms/bulk_import.py:455 +#: virtualization/forms/bulk_import.py:70 +#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 +#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +msgid "Assigned tenant" +msgstr "Atanan kiracı" + +#: circuits/forms/bulk_import.py:123 circuits/forms/filtersets.py:147 +#: circuits/forms/model_forms.py:143 +msgid "Provider network" +msgstr "Sağlayıcı ağı" + +#: circuits/forms/filtersets.py:26 circuits/forms/filtersets.py:118 +#: dcim/forms/bulk_edit.py:247 dcim/forms/bulk_edit.py:345 +#: dcim/forms/bulk_edit.py:575 dcim/forms/bulk_edit.py:622 +#: dcim/forms/bulk_edit.py:772 dcim/forms/bulk_import.py:181 +#: dcim/forms/bulk_import.py:255 dcim/forms/bulk_import.py:483 +#: dcim/forms/bulk_import.py:1245 dcim/forms/bulk_import.py:1279 +#: dcim/forms/filtersets.py:92 dcim/forms/filtersets.py:245 +#: dcim/forms/filtersets.py:278 dcim/forms/filtersets.py:330 +#: dcim/forms/filtersets.py:381 dcim/forms/filtersets.py:650 +#: dcim/forms/filtersets.py:689 dcim/forms/filtersets.py:890 +#: dcim/forms/filtersets.py:919 dcim/forms/filtersets.py:939 +#: dcim/forms/filtersets.py:1003 dcim/forms/filtersets.py:1033 +#: dcim/forms/filtersets.py:1042 dcim/forms/filtersets.py:1153 +#: dcim/forms/filtersets.py:1175 dcim/forms/filtersets.py:1197 +#: dcim/forms/filtersets.py:1214 dcim/forms/filtersets.py:1234 +#: dcim/forms/filtersets.py:1342 dcim/forms/filtersets.py:1364 +#: dcim/forms/filtersets.py:1385 dcim/forms/filtersets.py:1400 +#: dcim/forms/filtersets.py:1411 dcim/forms/model_forms.py:182 +#: dcim/forms/model_forms.py:216 dcim/forms/model_forms.py:402 +#: dcim/forms/model_forms.py:635 dcim/tables/devices.py:190 +#: dcim/tables/power.py:30 dcim/tables/racks.py:58 dcim/tables/racks.py:143 +#: extras/filtersets.py:441 extras/forms/filtersets.py:328 +#: ipam/forms/bulk_edit.py:456 ipam/forms/filtersets.py:168 +#: ipam/forms/filtersets.py:400 ipam/forms/filtersets.py:422 +#: ipam/forms/filtersets.py:448 ipam/forms/model_forms.py:560 +#: templates/dcim/device.html:26 templates/dcim/device_edit.html:30 +#: templates/dcim/inc/cable_termination.html:12 +#: templates/dcim/location.html:27 templates/dcim/powerpanel.html:27 +#: templates/dcim/rack.html:29 templates/dcim/rackreservation.html:35 +#: virtualization/forms/filtersets.py:45 virtualization/forms/filtersets.py:99 +#: wireless/forms/model_forms.py:88 wireless/forms/model_forms.py:128 +msgid "Location" +msgstr "Yer" + +#: circuits/forms/filtersets.py:27 ipam/forms/model_forms.py:158 +#: ipam/models/asns.py:108 ipam/models/asns.py:125 ipam/tables/asn.py:41 +#: templates/ipam/asn.html:20 +msgid "ASN" +msgstr "ASN" + +#: circuits/forms/filtersets.py:28 circuits/forms/filtersets.py:120 +#: dcim/forms/filtersets.py:136 dcim/forms/filtersets.py:150 +#: dcim/forms/filtersets.py:166 dcim/forms/filtersets.py:198 +#: dcim/forms/filtersets.py:249 dcim/forms/filtersets.py:334 +#: dcim/forms/filtersets.py:408 dcim/forms/filtersets.py:654 +#: dcim/forms/filtersets.py:1004 netbox/navigation/menu.py:45 +#: netbox/navigation/menu.py:47 tenancy/tables/columns.py:70 +#: tenancy/tables/contacts.py:25 tenancy/views.py:18 +#: virtualization/forms/filtersets.py:36 virtualization/forms/filtersets.py:47 +#: virtualization/forms/filtersets.py:102 +msgid "Contacts" +msgstr "İletişim" + +#: circuits/forms/filtersets.py:33 circuits/forms/filtersets.py:157 +#: dcim/forms/bulk_edit.py:110 dcim/forms/bulk_edit.py:222 +#: dcim/forms/bulk_edit.py:747 dcim/forms/bulk_import.py:92 +#: dcim/forms/filtersets.py:70 dcim/forms/filtersets.py:177 +#: dcim/forms/filtersets.py:203 dcim/forms/filtersets.py:256 +#: dcim/forms/filtersets.py:359 dcim/forms/filtersets.py:666 +#: dcim/forms/filtersets.py:896 dcim/forms/filtersets.py:926 +#: dcim/forms/filtersets.py:1010 dcim/forms/filtersets.py:1049 +#: dcim/forms/filtersets.py:1460 dcim/forms/filtersets.py:1484 +#: dcim/forms/filtersets.py:1508 dcim/forms/model_forms.py:80 +#: dcim/forms/model_forms.py:115 dcim/forms/object_create.py:374 +#: dcim/tables/devices.py:176 dcim/tables/sites.py:85 extras/filtersets.py:408 +#: ipam/forms/bulk_edit.py:205 ipam/forms/bulk_edit.py:437 +#: ipam/forms/bulk_edit.py:509 ipam/forms/filtersets.py:212 +#: ipam/forms/filtersets.py:407 ipam/forms/filtersets.py:456 +#: ipam/forms/model_forms.py:532 templates/dcim/device.html:18 +#: templates/dcim/rack.html:19 templates/dcim/rackreservation.html:25 +#: templates/dcim/region.html:26 templates/dcim/site.html:31 +#: templates/ipam/prefix.html:50 templates/ipam/vlan.html:19 +#: virtualization/forms/bulk_edit.py:80 virtualization/forms/filtersets.py:58 +#: virtualization/forms/filtersets.py:129 +#: virtualization/forms/model_forms.py:95 vpn/forms/filtersets.py:253 +msgid "Region" +msgstr "Bölge" + +#: circuits/forms/filtersets.py:38 circuits/forms/filtersets.py:162 +#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:755 +#: dcim/forms/filtersets.py:75 dcim/forms/filtersets.py:182 +#: dcim/forms/filtersets.py:208 dcim/forms/filtersets.py:269 +#: dcim/forms/filtersets.py:364 dcim/forms/filtersets.py:671 +#: dcim/forms/filtersets.py:901 dcim/forms/filtersets.py:1015 +#: dcim/forms/filtersets.py:1054 dcim/forms/object_create.py:382 +#: extras/filtersets.py:425 ipam/forms/bulk_edit.py:210 +#: ipam/forms/bulk_edit.py:444 ipam/forms/bulk_edit.py:514 +#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:412 +#: ipam/forms/filtersets.py:461 ipam/forms/model_forms.py:545 +#: virtualization/forms/bulk_edit.py:85 virtualization/forms/filtersets.py:68 +#: virtualization/forms/filtersets.py:134 +#: virtualization/forms/model_forms.py:101 +msgid "Site group" +msgstr "Site grubu" + +#: circuits/forms/filtersets.py:51 +msgid "ASN (legacy)" +msgstr "ASN (miras)" + +#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 +#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 +#: core/forms/filtersets.py:63 dcim/forms/bulk_edit.py:718 +#: dcim/forms/filtersets.py:164 dcim/forms/filtersets.py:196 +#: dcim/forms/filtersets.py:825 dcim/forms/filtersets.py:920 +#: dcim/forms/filtersets.py:1044 dcim/forms/filtersets.py:1152 +#: dcim/forms/filtersets.py:1174 dcim/forms/filtersets.py:1196 +#: dcim/forms/filtersets.py:1213 dcim/forms/filtersets.py:1230 +#: dcim/forms/filtersets.py:1341 dcim/forms/filtersets.py:1363 +#: dcim/forms/filtersets.py:1384 dcim/forms/filtersets.py:1399 +#: dcim/forms/filtersets.py:1410 extras/forms/filtersets.py:40 +#: extras/forms/filtersets.py:111 extras/forms/filtersets.py:142 +#: extras/forms/filtersets.py:182 extras/forms/filtersets.py:198 +#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:253 +#: extras/forms/filtersets.py:450 extras/forms/filtersets.py:491 +#: ipam/forms/filtersets.py:98 ipam/forms/filtersets.py:255 +#: ipam/forms/filtersets.py:294 ipam/forms/filtersets.py:368 +#: ipam/forms/filtersets.py:449 ipam/forms/filtersets.py:508 +#: ipam/forms/filtersets.py:526 netbox/tables/tables.py:250 +#: virtualization/forms/filtersets.py:44 +#: virtualization/forms/filtersets.py:100 +#: virtualization/forms/filtersets.py:190 +#: virtualization/forms/filtersets.py:235 vpn/forms/filtersets.py:210 +#: wireless/forms/filtersets.py:33 wireless/forms/filtersets.py:73 +msgid "Attributes" +msgstr "Öznitellikler" + +#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:60 +#: circuits/tables/providers.py:66 templates/circuits/circuit.html:23 +#: templates/circuits/provideraccount.html:25 +msgid "Account" +msgstr "Hesap" + +#: circuits/forms/model_forms.py:64 +#: templates/circuits/circuittermination_edit.html:23 +#: templates/circuits/inc/circuit_termination.html:89 +#: templates/circuits/providernetwork.html:18 +msgid "Provider Network" +msgstr "Sağlayıcı Ağı" + +#: circuits/forms/model_forms.py:78 templates/circuits/circuittype.html:20 +msgid "Circuit Type" +msgstr "Devre Tipi" + +#: circuits/models/circuits.py:25 dcim/models/cables.py:67 +#: dcim/models/device_component_templates.py:491 +#: dcim/models/device_component_templates.py:591 +#: dcim/models/device_components.py:976 dcim/models/device_components.py:1050 +#: dcim/models/device_components.py:1166 dcim/models/devices.py:467 +#: dcim/models/racks.py:43 extras/models/tags.py:28 +msgid "color" +msgstr "renk" + +#: circuits/models/circuits.py:34 +msgid "circuit type" +msgstr "devre tipi" + +#: circuits/models/circuits.py:35 +msgid "circuit types" +msgstr "devre türleri" + +#: circuits/models/circuits.py:46 +msgid "circuit ID" +msgstr "devre kimliği" + +#: circuits/models/circuits.py:47 +msgid "Unique circuit ID" +msgstr "Benzersiz devre kimliği" + +#: circuits/models/circuits.py:67 core/models/data.py:54 +#: core/models/jobs.py:85 dcim/models/cables.py:49 dcim/models/devices.py:641 +#: dcim/models/devices.py:1165 dcim/models/devices.py:1374 +#: dcim/models/power.py:95 dcim/models/racks.py:97 dcim/models/sites.py:154 +#: dcim/models/sites.py:266 ipam/models/ip.py:252 ipam/models/ip.py:521 +#: ipam/models/ip.py:729 ipam/models/vlans.py:175 +#: virtualization/models/clusters.py:74 +#: virtualization/models/virtualmachines.py:82 vpn/models/tunnels.py:40 +#: wireless/models.py:94 wireless/models.py:158 +msgid "status" +msgstr "durum" + +#: circuits/models/circuits.py:82 +msgid "installed" +msgstr "kurulmuş" + +#: circuits/models/circuits.py:87 +msgid "terminates" +msgstr "sonlandırır" + +#: circuits/models/circuits.py:92 +msgid "commit rate (Kbps)" +msgstr "taahhüt oranı (Kbps)" + +#: circuits/models/circuits.py:93 +msgid "Committed rate" +msgstr "Taahhüt oranı" + +#: circuits/models/circuits.py:135 +msgid "circuit" +msgstr "çevrim" + +#: circuits/models/circuits.py:136 +msgid "circuits" +msgstr "devreler" + +#: circuits/models/circuits.py:169 +msgid "termination" +msgstr "sonlandırma" + +#: circuits/models/circuits.py:186 +msgid "port speed (Kbps)" +msgstr "bağlantı noktası hızı (Kbps)" + +#: circuits/models/circuits.py:189 +msgid "Physical circuit speed" +msgstr "Fiziksel devre hızı" + +#: circuits/models/circuits.py:194 +msgid "upstream speed (Kbps)" +msgstr "yukarı akış hızı (Kbps)" + +#: circuits/models/circuits.py:195 +msgid "Upstream speed, if different from port speed" +msgstr "Bağlantı noktası hızından farklıysa yukarı akış hızı" + +#: circuits/models/circuits.py:200 +msgid "cross-connect ID" +msgstr "çapraz bağlantı kimliği" + +#: circuits/models/circuits.py:201 +msgid "ID of the local cross-connect" +msgstr "Yerel çapraz bağlantının kimliği" + +#: circuits/models/circuits.py:206 +msgid "patch panel/port(s)" +msgstr "yama paneli/bağlantı noktası (lar)" + +#: circuits/models/circuits.py:207 +msgid "Patch panel ID and port number(s)" +msgstr "Yama paneli kimliği ve bağlantı noktası numaraları" + +#: circuits/models/circuits.py:210 +#: dcim/models/device_component_templates.py:61 +#: dcim/models/device_components.py:69 dcim/models/racks.py:537 +#: extras/models/configs.py:45 extras/models/configs.py:219 +#: extras/models/customfields.py:122 extras/models/models.py:58 +#: extras/models/models.py:188 extras/models/models.py:426 +#: extras/models/models.py:541 extras/models/staging.py:31 +#: extras/models/tags.py:32 netbox/models/__init__.py:109 +#: netbox/models/__init__.py:144 netbox/models/__init__.py:190 +#: users/models.py:273 users/models.py:348 +#: virtualization/models/virtualmachines.py:282 +msgid "description" +msgstr "açıklama" + +#: circuits/models/circuits.py:223 +msgid "circuit termination" +msgstr "devre sonlandırma" + +#: circuits/models/circuits.py:224 +msgid "circuit terminations" +msgstr "devre sonlandırmaları" + +#: circuits/models/providers.py:22 circuits/models/providers.py:66 +#: circuits/models/providers.py:104 core/models/data.py:41 +#: core/models/jobs.py:46 dcim/models/device_component_templates.py:43 +#: dcim/models/device_components.py:54 dcim/models/devices.py:581 +#: dcim/models/devices.py:1305 dcim/models/devices.py:1370 +#: dcim/models/power.py:39 dcim/models/power.py:91 dcim/models/racks.py:62 +#: dcim/models/sites.py:138 extras/models/configs.py:36 +#: extras/models/configs.py:215 extras/models/customfields.py:89 +#: extras/models/models.py:53 extras/models/models.py:183 +#: extras/models/models.py:326 extras/models/models.py:422 +#: extras/models/models.py:531 extras/models/models.py:626 +#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 +#: ipam/models/services.py:52 ipam/models/services.py:88 +#: ipam/models/vlans.py:26 ipam/models/vlans.py:164 ipam/models/vrfs.py:22 +#: ipam/models/vrfs.py:79 netbox/models/__init__.py:136 +#: netbox/models/__init__.py:180 tenancy/models/contacts.py:64 +#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 +#: users/models.py:344 virtualization/models/clusters.py:57 +#: virtualization/models/virtualmachines.py:70 +#: virtualization/models/virtualmachines.py:272 vpn/models/crypto.py:24 +#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 +#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 +#: wireless/models.py:50 +msgid "name" +msgstr "ad" + +#: circuits/models/providers.py:25 +msgid "Full name of the provider" +msgstr "Sağlayıcının tam adı" + +#: circuits/models/providers.py:28 dcim/models/devices.py:86 +#: dcim/models/sites.py:149 extras/models/models.py:536 ipam/models/asns.py:23 +#: ipam/models/vlans.py:30 netbox/models/__init__.py:140 +#: netbox/models/__init__.py:185 tenancy/models/tenants.py:25 +#: tenancy/models/tenants.py:49 vpn/models/l2vpn.py:27 wireless/models.py:55 +msgid "slug" +msgstr "sümüklü böcek" + +#: circuits/models/providers.py:42 +msgid "provider" +msgstr "sağlayıcı" + +#: circuits/models/providers.py:43 +msgid "providers" +msgstr "sağlayıcılar" + +#: circuits/models/providers.py:63 +msgid "account ID" +msgstr "hesap kimliği" + +#: circuits/models/providers.py:86 +msgid "provider account" +msgstr "sağlayıcı hesabı" + +#: circuits/models/providers.py:87 +msgid "provider accounts" +msgstr "sağlayıcı hesapları" + +#: circuits/models/providers.py:115 +msgid "service ID" +msgstr "servis kimliği" + +#: circuits/models/providers.py:126 +msgid "provider network" +msgstr "sağlayıcı ağı" + +#: circuits/models/providers.py:127 +msgid "provider networks" +msgstr "sağlayıcı ağları" + +#: circuits/tables/circuits.py:29 circuits/tables/providers.py:18 +#: circuits/tables/providers.py:69 circuits/tables/providers.py:99 +#: core/tables/data.py:16 core/tables/jobs.py:14 dcim/forms/filtersets.py:60 +#: dcim/forms/object_create.py:42 dcim/tables/devices.py:88 +#: dcim/tables/devices.py:125 dcim/tables/devices.py:167 +#: dcim/tables/devices.py:318 dcim/tables/devices.py:395 +#: dcim/tables/devices.py:439 dcim/tables/devices.py:491 +#: dcim/tables/devices.py:543 dcim/tables/devices.py:663 +#: dcim/tables/devices.py:744 dcim/tables/devices.py:794 +#: dcim/tables/devices.py:860 dcim/tables/devices.py:975 +#: dcim/tables/devices.py:995 dcim/tables/devices.py:1024 +#: dcim/tables/devices.py:1054 dcim/tables/devicetypes.py:32 +#: dcim/tables/power.py:22 dcim/tables/power.py:62 dcim/tables/racks.py:23 +#: dcim/tables/racks.py:53 dcim/tables/sites.py:24 dcim/tables/sites.py:51 +#: dcim/tables/sites.py:78 dcim/tables/sites.py:125 +#: extras/forms/filtersets.py:190 extras/tables/tables.py:40 +#: extras/tables/tables.py:83 extras/tables/tables.py:115 +#: extras/tables/tables.py:139 extras/tables/tables.py:204 +#: extras/tables/tables.py:251 extras/tables/tables.py:274 +#: extras/tables/tables.py:324 extras/tables/tables.py:376 +#: extras/tables/tables.py:399 ipam/forms/bulk_edit.py:390 +#: ipam/forms/filtersets.py:372 ipam/tables/asn.py:16 ipam/tables/ip.py:85 +#: ipam/tables/ip.py:159 ipam/tables/services.py:15 ipam/tables/services.py:40 +#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:110 ipam/tables/vrfs.py:26 +#: ipam/tables/vrfs.py:67 templates/circuits/circuittype.html:25 +#: templates/circuits/provideraccount.html:29 +#: templates/circuits/providernetwork.html:27 +#: templates/core/datasource.html:35 templates/core/job.html:31 +#: templates/dcim/consoleport.html:31 templates/dcim/consoleserverport.html:31 +#: templates/dcim/devicebay.html:27 templates/dcim/devicerole.html:29 +#: templates/dcim/frontport.html:31 +#: templates/dcim/inc/interface_vlans_table.html:5 +#: templates/dcim/inc/panels/inventory_items.html:10 +#: templates/dcim/interface.html:39 templates/dcim/interface.html:171 +#: templates/dcim/inventoryitem.html:29 +#: templates/dcim/inventoryitemrole.html:19 templates/dcim/location.html:32 +#: templates/dcim/manufacturer.html:39 templates/dcim/modulebay.html:27 +#: templates/dcim/platform.html:32 templates/dcim/poweroutlet.html:31 +#: templates/dcim/powerport.html:31 templates/dcim/rackrole.html:25 +#: templates/dcim/rearport.html:31 templates/dcim/region.html:30 +#: templates/dcim/sitegroup.html:30 +#: templates/dcim/virtualdevicecontext.html:21 +#: templates/extras/admin/plugins_list.html:22 +#: templates/extras/configcontext.html:14 +#: templates/extras/configtemplate.html:14 +#: templates/extras/customfield.html:16 templates/extras/customlink.html:14 +#: templates/extras/eventrule.html:16 templates/extras/exporttemplate.html:21 +#: templates/extras/report_list.html:46 templates/extras/savedfilter.html:14 +#: templates/extras/script_list.html:52 templates/extras/tag.html:17 +#: templates/extras/webhook.html:16 templates/ipam/asnrange.html:16 +#: templates/ipam/fhrpgroup.html:31 templates/ipam/rir.html:25 +#: templates/ipam/role.html:25 templates/ipam/routetarget.html:14 +#: templates/ipam/service.html:27 templates/ipam/servicetemplate.html:16 +#: templates/ipam/vlan.html:38 templates/ipam/vlangroup.html:31 +#: templates/tenancy/contact.html:26 templates/tenancy/contactgroup.html:24 +#: templates/tenancy/contactrole.html:19 templates/tenancy/tenantgroup.html:32 +#: templates/users/group.html:18 templates/users/objectpermission.html:18 +#: templates/virtualization/cluster.html:16 +#: templates/virtualization/clustergroup.html:25 +#: templates/virtualization/clustertype.html:25 +#: templates/virtualization/virtualdisk.html:26 +#: templates/virtualization/virtualmachine.html:18 +#: templates/virtualization/vminterface.html:28 +#: templates/vpn/ikepolicy.html:14 templates/vpn/ikeproposal.html:14 +#: templates/vpn/ipsecpolicy.html:14 templates/vpn/ipsecprofile.html:14 +#: templates/vpn/ipsecprofile.html:39 templates/vpn/ipsecprofile.html:74 +#: templates/vpn/ipsecproposal.html:14 templates/vpn/l2vpn.html:15 +#: templates/vpn/tunnel.html:22 templates/vpn/tunnelgroup.html:29 +#: templates/wireless/wirelesslangroup.html:30 tenancy/tables/contacts.py:19 +#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 +#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 +#: users/tables.py:62 users/tables.py:79 +#: virtualization/forms/bulk_create.py:20 +#: virtualization/forms/object_create.py:13 +#: virtualization/forms/object_create.py:23 +#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 +#: virtualization/tables/clusters.py:62 +#: virtualization/tables/virtualmachines.py:45 +#: virtualization/tables/virtualmachines.py:119 +#: virtualization/tables/virtualmachines.py:172 vpn/tables/crypto.py:18 +#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 +#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 +#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 +#: wireless/tables/wirelesslan.py:79 +msgid "Name" +msgstr "İsim" + +#: circuits/tables/circuits.py:38 circuits/tables/providers.py:45 +#: circuits/tables/providers.py:79 netbox/navigation/menu.py:254 +#: netbox/navigation/menu.py:258 netbox/navigation/menu.py:260 +#: templates/circuits/provider.html:61 +#: templates/circuits/provideraccount.html:46 +#: templates/circuits/providernetwork.html:54 +msgid "Circuits" +msgstr "Devreler" + +#: circuits/tables/circuits.py:52 templates/circuits/circuit.html:27 +msgid "Circuit ID" +msgstr "Devre Kimliği" + +#: circuits/tables/circuits.py:65 wireless/forms/model_forms.py:157 +msgid "Side A" +msgstr "A Tarafı" + +#: circuits/tables/circuits.py:69 +msgid "Side Z" +msgstr "Z Tarafı" + +#: circuits/tables/circuits.py:72 templates/circuits/circuit.html:56 +msgid "Commit Rate" +msgstr "Taahhüt Oranı" + +#: circuits/tables/circuits.py:75 circuits/tables/providers.py:48 +#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 +#: dcim/tables/devices.py:1037 dcim/tables/devicetypes.py:92 +#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 +#: dcim/tables/power.py:96 dcim/tables/racks.py:76 dcim/tables/racks.py:156 +#: dcim/tables/sites.py:103 extras/forms/bulk_edit.py:320 +#: extras/tables/tables.py:490 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 +#: ipam/tables/ip.py:135 ipam/tables/ip.py:272 ipam/tables/ip.py:325 +#: ipam/tables/ip.py:392 ipam/tables/services.py:24 ipam/tables/services.py:54 +#: ipam/tables/vlans.py:141 ipam/tables/vrfs.py:46 ipam/tables/vrfs.py:71 +#: templates/dcim/cable_edit.html:85 templates/generic/bulk_edit.html:102 +#: templates/inc/panels/comments.html:6 tenancy/tables/contacts.py:68 +#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 +#: virtualization/tables/clusters.py:91 +#: virtualization/tables/virtualmachines.py:68 vpn/tables/crypto.py:37 +#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 +#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:57 +#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +msgid "Comments" +msgstr "Yorumlar" + +#: circuits/tables/providers.py:23 +msgid "Accounts" +msgstr "Hesaplar" + +#: circuits/tables/providers.py:29 +msgid "Account Count" +msgstr "Hesap Sayısı" + +#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +msgid "ASN Count" +msgstr "ASN Sayısı" + +#: core/choices.py:18 +msgid "New" +msgstr "Yeni" + +#: core/choices.py:19 +msgid "Queued" +msgstr "Kuyruğa alındı" + +#: core/choices.py:20 +msgid "Syncing" +msgstr "Senkronizasyon" + +#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 +#: extras/choices.py:210 templates/core/job.html:75 +msgid "Completed" +msgstr "Tamamlandı" + +#: core/choices.py:22 core/choices.py:59 dcim/choices.py:176 +#: dcim/choices.py:222 dcim/choices.py:1496 extras/choices.py:212 +#: virtualization/choices.py:47 +msgid "Failed" +msgstr "Başarısız" + +#: core/choices.py:35 netbox/navigation/menu.py:330 +#: templates/extras/script/base.html:14 templates/extras/script_list.html:6 +#: templates/extras/script_list.html:20 templates/extras/script_result.html:18 +msgid "Scripts" +msgstr "Komut Dosyaları" + +#: core/choices.py:36 netbox/navigation/menu.py:324 +#: templates/extras/report/base.html:13 templates/extras/report_list.html:7 +#: templates/extras/report_list.html:12 +msgid "Reports" +msgstr "Raporlar" + +#: core/choices.py:54 extras/choices.py:207 +msgid "Pending" +msgstr "Beklemede" + +#: core/choices.py:55 core/tables/jobs.py:32 extras/choices.py:208 +#: templates/core/job.html:62 +msgid "Scheduled" +msgstr "Zamanlanmış" + +#: core/choices.py:56 extras/choices.py:209 +msgid "Running" +msgstr "Koşu" + +#: core/choices.py:58 extras/choices.py:211 +msgid "Errored" +msgstr "Hatalı" + +#: core/data_backends.py:29 templates/dcim/interface.html:224 +msgid "Local" +msgstr "Yerel" + +#: core/data_backends.py:47 extras/tables/tables.py:436 +#: templates/account/profile.html:16 templates/users/user.html:18 +#: users/tables.py:31 +msgid "Username" +msgstr "Kullanıcı Adı" + +#: core/data_backends.py:49 core/data_backends.py:55 +msgid "Only used for cloning with HTTP(S)" +msgstr "Yalnızca HTTP (S) ile klonlama için kullanılır" + +#: core/data_backends.py:53 templates/account/base.html:17 +#: templates/account/password.html:11 users/forms/model_forms.py:172 +msgid "Password" +msgstr "Şifre" + +#: core/data_backends.py:59 +msgid "Branch" +msgstr "Şube" + +#: core/data_backends.py:118 +msgid "AWS access key ID" +msgstr "AWS erişim anahtarı kimliği" + +#: core/data_backends.py:122 +msgid "AWS secret access key" +msgstr "AWS gizli erişim anahtarı" + +#: core/filtersets.py:49 extras/filtersets.py:203 extras/filtersets.py:538 +#: extras/filtersets.py:566 +msgid "Data source (ID)" +msgstr "Veri kaynağı (ID)" + +#: core/filtersets.py:55 +msgid "Data source (name)" +msgstr "Veri kaynağı (isim)" + +#: core/forms/bulk_edit.py:24 ipam/forms/bulk_edit.py:47 +msgid "Enforce unique space" +msgstr "Benzersiz alanı uygulayın" + +#: core/forms/bulk_edit.py:33 extras/forms/model_forms.py:202 +#: templates/extras/savedfilter.html:57 vpn/forms/filtersets.py:95 +#: vpn/forms/filtersets.py:124 vpn/forms/filtersets.py:148 +#: vpn/forms/filtersets.py:167 vpn/forms/model_forms.py:294 +#: vpn/forms/model_forms.py:315 vpn/forms/model_forms.py:329 +#: vpn/forms/model_forms.py:350 vpn/forms/model_forms.py:373 +msgid "Parameters" +msgstr "Parametreler" + +#: core/forms/bulk_edit.py:37 templates/core/datasource.html:69 +msgid "Ignore rules" +msgstr "Kuralları yok sayın" + +#: core/forms/filtersets.py:26 core/forms/model_forms.py:95 +#: extras/forms/model_forms.py:165 extras/forms/model_forms.py:462 +#: extras/forms/model_forms.py:515 extras/tables/tables.py:149 +#: extras/tables/tables.py:368 extras/tables/tables.py:403 +#: templates/core/datasource.html:31 +#: templates/dcim/device/render_config.html:19 +#: templates/extras/configcontext.html:30 +#: templates/extras/configtemplate.html:22 +#: templates/extras/exporttemplate.html:41 +#: templates/virtualization/virtualmachine/render_config.html:19 +msgid "Data Source" +msgstr "Veri Kaynağı" + +#: core/forms/filtersets.py:39 core/tables/data.py:26 +#: dcim/forms/bulk_edit.py:1012 dcim/forms/bulk_edit.py:1285 +#: dcim/forms/filtersets.py:1270 dcim/tables/devices.py:568 +#: dcim/tables/devicetypes.py:221 extras/forms/bulk_edit.py:97 +#: extras/forms/bulk_edit.py:161 extras/forms/bulk_edit.py:220 +#: extras/forms/filtersets.py:119 extras/forms/filtersets.py:206 +#: extras/forms/filtersets.py:267 extras/tables/tables.py:122 +#: extras/tables/tables.py:211 extras/tables/tables.py:288 +#: templates/core/datasource.html:43 templates/dcim/interface.html:62 +#: templates/extras/customlink.html:18 templates/extras/eventrule.html:20 +#: templates/extras/savedfilter.html:26 +#: templates/users/objectpermission.html:26 +#: templates/virtualization/vminterface.html:32 users/forms/bulk_edit.py:69 +#: users/forms/filtersets.py:71 users/tables.py:86 +#: virtualization/forms/bulk_edit.py:216 +#: virtualization/forms/filtersets.py:207 +msgid "Enabled" +msgstr "Etkin" + +#: core/forms/filtersets.py:51 core/forms/mixins.py:21 +msgid "File" +msgstr "Dosya" + +#: core/forms/filtersets.py:56 core/forms/mixins.py:16 +#: extras/forms/filtersets.py:147 extras/forms/filtersets.py:336 +#: extras/forms/filtersets.py:422 +msgid "Data source" +msgstr "Veri kaynağı" + +#: core/forms/filtersets.py:64 extras/forms/filtersets.py:449 +msgid "Creation" +msgstr "Yaratılış" + +#: core/forms/filtersets.py:70 extras/forms/filtersets.py:473 +#: extras/forms/filtersets.py:519 extras/tables/tables.py:479 +#: templates/core/job.html:25 templates/extras/objectchange.html:56 +#: tenancy/tables/contacts.py:90 vpn/tables/l2vpn.py:59 +msgid "Object Type" +msgstr "Nesne Türü" + +#: core/forms/filtersets.py:80 +msgid "Created after" +msgstr "Sonra oluşturuldu" + +#: core/forms/filtersets.py:85 +msgid "Created before" +msgstr "Daha önce oluşturuldu" + +#: core/forms/filtersets.py:90 +msgid "Scheduled after" +msgstr "Sonrasında planlandı" + +#: core/forms/filtersets.py:95 +msgid "Scheduled before" +msgstr "Önceden planlanmış" + +#: core/forms/filtersets.py:100 +msgid "Started after" +msgstr "Sonra başladı" + +#: core/forms/filtersets.py:105 +msgid "Started before" +msgstr "Daha önce başladı" + +#: core/forms/filtersets.py:110 +msgid "Completed after" +msgstr "Sonrasında tamamlandı" + +#: core/forms/filtersets.py:115 +msgid "Completed before" +msgstr "Daha önce tamamlandı" + +#: core/forms/filtersets.py:122 dcim/forms/bulk_edit.py:359 +#: dcim/forms/filtersets.py:352 dcim/forms/filtersets.py:396 +#: dcim/forms/model_forms.py:251 extras/forms/filtersets.py:465 +#: extras/forms/filtersets.py:511 templates/dcim/rackreservation.html:65 +#: templates/extras/objectchange.html:40 templates/extras/savedfilter.html:22 +#: templates/users/token.html:22 templates/users/user.html:6 +#: templates/users/user.html:14 users/filtersets.py:74 users/filtersets.py:134 +#: users/forms/filtersets.py:85 users/forms/filtersets.py:126 +#: users/forms/model_forms.py:157 users/forms/model_forms.py:195 +#: users/tables.py:19 +msgid "User" +msgstr "Kullanıcı" + +#: core/forms/model_forms.py:52 core/tables/data.py:46 +#: templates/core/datafile.html:36 templates/extras/report/base.html:33 +#: templates/extras/script/base.html:32 templates/extras/script_result.html:45 +msgid "Source" +msgstr "Kaynak" + +#: core/forms/model_forms.py:56 +msgid "Backend Parameters" +msgstr "Arka Uç Parametreleri" + +#: core/forms/model_forms.py:94 +msgid "File Upload" +msgstr "Dosya Yükleme" + +#: core/forms/model_forms.py:147 templates/core/configrevision.html:43 +#: templates/dcim/rack_elevation_list.html:6 +msgid "Rack Elevations" +msgstr "Raf Yükseltmeleri" + +#: core/forms/model_forms.py:148 dcim/choices.py:1407 +#: dcim/forms/bulk_edit.py:859 dcim/forms/bulk_edit.py:1242 +#: dcim/forms/bulk_edit.py:1260 dcim/tables/racks.py:89 +#: netbox/navigation/menu.py:276 netbox/navigation/menu.py:280 +msgid "Power" +msgstr "Güç" + +#: core/forms/model_forms.py:149 netbox/navigation/menu.py:142 +#: templates/core/configrevision.html:79 +msgid "IPAM" +msgstr "IPAME" + +#: core/forms/model_forms.py:150 netbox/navigation/menu.py:218 +#: templates/core/configrevision.html:95 vpn/forms/bulk_edit.py:76 +#: vpn/forms/filtersets.py:42 vpn/forms/model_forms.py:60 +#: vpn/forms/model_forms.py:145 +msgid "Security" +msgstr "Güvenlik" + +#: core/forms/model_forms.py:151 templates/core/configrevision.html:107 +msgid "Banners" +msgstr "Afişler" + +#: core/forms/model_forms.py:152 templates/core/configrevision.html:131 +msgid "Pagination" +msgstr "Sayfalandırma" + +#: core/forms/model_forms.py:153 extras/forms/model_forms.py:63 +#: templates/core/configrevision.html:147 +msgid "Validation" +msgstr "Doğrulama" + +#: core/forms/model_forms.py:154 templates/account/preferences.html:6 +#: templates/core/configrevision.html:175 +msgid "User Preferences" +msgstr "Kullanıcı Tercihleri" + +#: core/forms/model_forms.py:155 dcim/forms/filtersets.py:658 +#: templates/core/configrevision.html:193 users/forms/model_forms.py:64 +msgid "Miscellaneous" +msgstr "Çeşitli" + +#: core/forms/model_forms.py:158 +msgid "Config Revision" +msgstr "Yapılandırma Revizyonu" + +#: core/forms/model_forms.py:197 +msgid "This parameter has been defined statically and cannot be modified." +msgstr "Bu parametre statik olarak tanımlanmıştır ve değiştirilemez." + +#: core/forms/model_forms.py:205 +#, python-brace-format +msgid "Current value: {value}" +msgstr "Mevcut değer: {value}" + +#: core/forms/model_forms.py:207 +msgid " (default)" +msgstr " (varsayılan)" + +#: core/models/config.py:18 core/models/data.py:259 core/models/files.py:27 +#: core/models/jobs.py:50 extras/models/models.py:760 +#: netbox/models/features.py:52 users/models.py:248 +msgid "created" +msgstr "oluşturulan" + +#: core/models/config.py:22 +msgid "comment" +msgstr "yorum Yap" + +#: core/models/config.py:29 +msgid "configuration data" +msgstr "yapılandırma verileri" + +#: core/models/config.py:36 +msgid "config revision" +msgstr "yapılandırma revizyonu" + +#: core/models/config.py:37 +msgid "config revisions" +msgstr "yapılandırma revizyonları" + +#: core/models/config.py:41 +msgid "Default configuration" +msgstr "Varsayılan yapılandırma" + +#: core/models/config.py:43 +msgid "Current configuration" +msgstr "Geçerli yapılandırma" + +#: core/models/config.py:44 +#, python-brace-format +msgid "Config revision #{id}" +msgstr "Yapılandırma revizyonu #{id}" + +#: core/models/data.py:46 dcim/models/cables.py:43 +#: dcim/models/device_component_templates.py:177 +#: dcim/models/device_component_templates.py:211 +#: dcim/models/device_component_templates.py:246 +#: dcim/models/device_component_templates.py:308 +#: dcim/models/device_component_templates.py:387 +#: dcim/models/device_component_templates.py:486 +#: dcim/models/device_component_templates.py:586 +#: dcim/models/device_components.py:284 dcim/models/device_components.py:313 +#: dcim/models/device_components.py:346 dcim/models/device_components.py:464 +#: dcim/models/device_components.py:606 dcim/models/device_components.py:971 +#: dcim/models/device_components.py:1045 dcim/models/power.py:101 +#: dcim/models/racks.py:127 extras/models/customfields.py:75 +#: extras/models/search.py:43 virtualization/models/clusters.py:61 +#: vpn/models/l2vpn.py:32 +msgid "type" +msgstr "türü" + +#: core/models/data.py:51 extras/choices.py:34 extras/models/models.py:194 +#: templates/core/datasource.html:59 +msgid "URL" +msgstr "URL" + +#: core/models/data.py:61 dcim/models/device_component_templates.py:392 +#: dcim/models/device_components.py:513 extras/models/models.py:88 +#: extras/models/models.py:331 extras/models/models.py:556 users/models.py:353 +msgid "enabled" +msgstr "etkin" + +#: core/models/data.py:65 +msgid "ignore rules" +msgstr "kuralları yok sayın" + +#: core/models/data.py:67 +msgid "Patterns (one per line) matching files to ignore when syncing" +msgstr "" +"Senkronizasyon sırasında yok sayılacak dosyalarla eşleşen desenler (satır " +"başına bir tane)" + +#: core/models/data.py:70 extras/models/models.py:564 +msgid "parameters" +msgstr "parametreler" + +#: core/models/data.py:75 +msgid "last synced" +msgstr "son senkronize edildi" + +#: core/models/data.py:83 +msgid "data source" +msgstr "veri kaynağı" + +#: core/models/data.py:84 +msgid "data sources" +msgstr "veri kaynakları" + +#: core/models/data.py:124 +#, python-brace-format +msgid "Unknown backend type: {type}" +msgstr "Bilinmeyen arka uç türü: {type}" + +#: core/models/data.py:263 core/models/files.py:31 +#: netbox/models/features.py:58 +msgid "last updated" +msgstr "son güncellendi" + +#: core/models/data.py:273 dcim/models/cables.py:430 +msgid "path" +msgstr "yol" + +#: core/models/data.py:276 +msgid "File path relative to the data source's root" +msgstr "Veri kaynağının köküne göre dosya yolu" + +#: core/models/data.py:280 ipam/models/ip.py:502 +msgid "size" +msgstr "boyut" + +#: core/models/data.py:283 +msgid "hash" +msgstr "kare" + +#: core/models/data.py:287 +msgid "Length must be 64 hexadecimal characters." +msgstr "Uzunluk 64 onaltılık karakter olmalıdır." + +#: core/models/data.py:289 +msgid "SHA256 hash of the file data" +msgstr "Dosya verilerinin SHA256 karması" + +#: core/models/data.py:306 +msgid "data file" +msgstr "veri dosyası" + +#: core/models/data.py:307 +msgid "data files" +msgstr "veri dosyaları" + +#: core/models/data.py:393 +msgid "auto sync record" +msgstr "otomatik senkronizasyon kaydı" + +#: core/models/data.py:394 +msgid "auto sync records" +msgstr "otomatik senkronizasyon kayıtları" + +#: core/models/files.py:37 +msgid "file root" +msgstr "dosya kökü" + +#: core/models/files.py:42 +msgid "file path" +msgstr "dosya yolu" + +#: core/models/files.py:44 +msgid "File path relative to the designated root path" +msgstr "Belirlenen kök yoluna göre dosya yolu" + +#: core/models/files.py:61 +msgid "managed file" +msgstr "yönetilen dosya" + +#: core/models/files.py:62 +msgid "managed files" +msgstr "yönetilen dosyalar" + +#: core/models/jobs.py:54 +msgid "scheduled" +msgstr "planlanmış" + +#: core/models/jobs.py:59 +msgid "interval" +msgstr "aralık" + +#: core/models/jobs.py:65 +msgid "Recurrence interval (in minutes)" +msgstr "Tekrarlama aralığı (dakika cinsinden)" + +#: core/models/jobs.py:68 +msgid "started" +msgstr "başladı" + +#: core/models/jobs.py:73 +msgid "completed" +msgstr "tamamlandı" + +#: core/models/jobs.py:91 extras/models/models.py:123 +#: extras/models/staging.py:87 +msgid "data" +msgstr "veri" + +#: core/models/jobs.py:96 +msgid "error" +msgstr "hata" + +#: core/models/jobs.py:101 +msgid "job ID" +msgstr "iş kimliği" + +#: core/models/jobs.py:112 +msgid "job" +msgstr "iş" + +#: core/models/jobs.py:113 +msgid "jobs" +msgstr "meslekler" + +#: core/models/jobs.py:135 +#, python-brace-format +msgid "Jobs cannot be assigned to this object type ({type})." +msgstr "İşler bu nesne türüne atanamaz ({type})." + +#: core/tables/config.py:21 users/forms/filtersets.py:45 users/tables.py:39 +msgid "Is Active" +msgstr "Aktif mi" + +#: core/tables/data.py:50 templates/core/datafile.html:40 +msgid "Path" +msgstr "Yol" + +#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +msgid "Last updated" +msgstr "Son Güncelleme" + +#: core/tables/jobs.py:10 dcim/tables/devicetypes.py:161 +#: extras/tables/tables.py:174 extras/tables/tables.py:345 +#: netbox/tables/tables.py:184 templates/dcim/virtualchassis_edit.html:53 +#: wireless/tables/wirelesslink.py:16 +msgid "ID" +msgstr "KİMLİK" + +#: core/tables/jobs.py:21 extras/choices.py:38 extras/tables/tables.py:236 +#: extras/tables/tables.py:282 extras/tables/tables.py:355 +#: extras/tables/tables.py:453 extras/tables/tables.py:484 +#: netbox/tables/tables.py:238 templates/extras/eventrule.html:99 +#: templates/extras/htmx/report_result.html:45 +#: templates/extras/journalentry.html:21 templates/extras/objectchange.html:62 +#: tenancy/tables/contacts.py:93 vpn/tables/l2vpn.py:64 +msgid "Object" +msgstr "Nesne" + +#: core/tables/jobs.py:35 +msgid "Interval" +msgstr "Aralık" + +#: core/tables/jobs.py:38 templates/core/job.html:71 +#: templates/extras/htmx/report_result.html:7 +#: templates/extras/htmx/script_result.html:8 +msgid "Started" +msgstr "Başladı" + +#: dcim/api/serializers.py:205 templates/dcim/rack.html:33 +msgid "Facility ID" +msgstr "Tesis Kimliği" + +#: dcim/api/serializers.py:321 dcim/api/serializers.py:680 +msgid "Position (U)" +msgstr "Pozisyon (U)" + +#: dcim/choices.py:21 virtualization/choices.py:21 +msgid "Staging" +msgstr "Sahneleme" + +#: dcim/choices.py:23 dcim/choices.py:178 dcim/choices.py:223 +#: dcim/choices.py:1420 virtualization/choices.py:23 +#: virtualization/choices.py:48 +msgid "Decommissioning" +msgstr "Hizmetten çıkarma" + +#: dcim/choices.py:24 +msgid "Retired" +msgstr "Emekli" + +#: dcim/choices.py:65 +msgid "2-post frame" +msgstr "2 direkli çerçeve" + +#: dcim/choices.py:66 +msgid "4-post frame" +msgstr "4 direkli çerçeve" + +#: dcim/choices.py:67 +msgid "4-post cabinet" +msgstr "4 direkli dolap" + +#: dcim/choices.py:68 +msgid "Wall-mounted frame" +msgstr "Duvara monte çerçeve" + +#: dcim/choices.py:69 +msgid "Wall-mounted frame (vertical)" +msgstr "Duvara monte çerçeve (dikey)" + +#: dcim/choices.py:70 +msgid "Wall-mounted cabinet" +msgstr "Duvara monte dolap" + +#: dcim/choices.py:71 +msgid "Wall-mounted cabinet (vertical)" +msgstr "Duvara monte dolap (dikey)" + +#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#, python-brace-format +msgid "{n} inches" +msgstr "{n} inç" + +#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 +#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +msgid "Reserved" +msgstr "Rezerve edilmiş" + +#: dcim/choices.py:101 templates/dcim/device.html:262 +msgid "Available" +msgstr "Mevcut" + +#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 +#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +msgid "Deprecated" +msgstr "Kullanımdan kaldırıldı" + +#: dcim/choices.py:114 templates/dcim/rack.html:128 +msgid "Millimeters" +msgstr "Milimetre" + +#: dcim/choices.py:115 dcim/choices.py:1442 +msgid "Inches" +msgstr "İnç" + +#: dcim/choices.py:140 dcim/forms/bulk_edit.py:66 dcim/forms/bulk_edit.py:85 +#: dcim/forms/bulk_edit.py:171 dcim/forms/bulk_edit.py:1290 +#: dcim/forms/bulk_import.py:59 dcim/forms/bulk_import.py:73 +#: dcim/forms/bulk_import.py:136 dcim/forms/bulk_import.py:503 +#: dcim/forms/bulk_import.py:770 dcim/forms/bulk_import.py:1021 +#: dcim/forms/filtersets.py:226 dcim/forms/model_forms.py:73 +#: dcim/forms/model_forms.py:94 dcim/forms/model_forms.py:172 +#: dcim/forms/model_forms.py:955 dcim/forms/model_forms.py:1296 +#: dcim/forms/object_import.py:181 dcim/tables/devices.py:671 +#: dcim/tables/devices.py:955 extras/tables/tables.py:181 +#: ipam/tables/fhrp.py:59 ipam/tables/ip.py:374 ipam/tables/services.py:44 +#: templates/dcim/interface.html:105 templates/dcim/interface.html:321 +#: templates/dcim/location.html:44 templates/dcim/region.html:38 +#: templates/dcim/sitegroup.html:38 templates/ipam/service.html:31 +#: templates/tenancy/contactgroup.html:32 +#: templates/tenancy/tenantgroup.html:40 +#: templates/virtualization/vminterface.html:42 +#: templates/wireless/wirelesslangroup.html:38 tenancy/forms/bulk_edit.py:26 +#: tenancy/forms/bulk_edit.py:60 tenancy/forms/bulk_import.py:24 +#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:24 +#: tenancy/forms/model_forms.py:69 virtualization/forms/bulk_edit.py:206 +#: virtualization/forms/bulk_import.py:151 +#: virtualization/tables/virtualmachines.py:142 wireless/forms/bulk_edit.py:23 +#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:20 +msgid "Parent" +msgstr "Ebeveyn" + +#: dcim/choices.py:141 +msgid "Child" +msgstr "Çocuk" + +#: dcim/choices.py:155 templates/dcim/device.html:345 +#: templates/dcim/rack.html:181 templates/dcim/rack_elevation_list.html:22 +#: templates/dcim/rackreservation.html:84 +msgid "Front" +msgstr "Ön" + +#: dcim/choices.py:156 templates/dcim/device.html:351 +#: templates/dcim/rack.html:187 templates/dcim/rack_elevation_list.html:23 +#: templates/dcim/rackreservation.html:90 +msgid "Rear" +msgstr "Arka" + +#: dcim/choices.py:175 dcim/choices.py:221 virtualization/choices.py:46 +msgid "Staged" +msgstr "Sahnelenmiş" + +#: dcim/choices.py:177 +msgid "Inventory" +msgstr "Envanter" + +#: dcim/choices.py:193 +msgid "Front to rear" +msgstr "Önden arkaya" + +#: dcim/choices.py:194 +msgid "Rear to front" +msgstr "Arkadan öne" + +#: dcim/choices.py:195 +msgid "Left to right" +msgstr "Soldan sağa" + +#: dcim/choices.py:196 +msgid "Right to left" +msgstr "Sağdan sola" + +#: dcim/choices.py:197 +msgid "Side to rear" +msgstr "Yandan arkaya" + +#: dcim/choices.py:198 dcim/choices.py:1215 +msgid "Passive" +msgstr "Pasif" + +#: dcim/choices.py:199 +msgid "Mixed" +msgstr "Karışık" + +#: dcim/choices.py:443 dcim/choices.py:680 +msgid "NEMA (Non-locking)" +msgstr "NEMA (Kilitsiz)" + +#: dcim/choices.py:465 dcim/choices.py:702 +msgid "NEMA (Locking)" +msgstr "NEMA (Kilitleme)" + +#: dcim/choices.py:488 dcim/choices.py:725 +msgid "California Style" +msgstr "Kaliforniya Tarzı" + +#: dcim/choices.py:496 +msgid "International/ITA" +msgstr "Uluslararası/ITA" + +#: dcim/choices.py:526 dcim/choices.py:755 +msgid "Proprietary" +msgstr "Tescilli" + +#: dcim/choices.py:534 dcim/choices.py:764 dcim/choices.py:1131 +#: dcim/choices.py:1133 dcim/choices.py:1338 dcim/choices.py:1340 +#: netbox/navigation/menu.py:188 +msgid "Other" +msgstr "Diğer" + +#: dcim/choices.py:733 +msgid "ITA/International" +msgstr "ITA/Uluslararası" + +#: dcim/choices.py:794 +msgid "Physical" +msgstr "Fiziksel" + +#: dcim/choices.py:795 dcim/choices.py:949 +msgid "Virtual" +msgstr "Sanal" + +#: dcim/choices.py:796 dcim/choices.py:1019 dcim/forms/bulk_edit.py:1398 +#: dcim/forms/filtersets.py:1233 dcim/forms/model_forms.py:881 +#: dcim/forms/model_forms.py:1190 netbox/navigation/menu.py:128 +#: netbox/navigation/menu.py:132 templates/dcim/interface.html:217 +msgid "Wireless" +msgstr "Kablosuz" + +#: dcim/choices.py:947 +msgid "Virtual interfaces" +msgstr "Sanal arayüzler" + +#: dcim/choices.py:950 dcim/forms/bulk_edit.py:1295 +#: dcim/forms/bulk_import.py:777 dcim/forms/model_forms.py:869 +#: dcim/tables/devices.py:675 templates/dcim/interface.html:109 +#: templates/virtualization/vminterface.html:46 +#: virtualization/forms/bulk_edit.py:211 +#: virtualization/forms/bulk_import.py:158 +#: virtualization/tables/virtualmachines.py:146 +msgid "Bridge" +msgstr "Köprü" + +#: dcim/choices.py:951 +msgid "Link Aggregation Group (LAG)" +msgstr "Bağlantı Toplama Grubu (LAG)" + +#: dcim/choices.py:955 +msgid "Ethernet (fixed)" +msgstr "Ethernet (sabit)" + +#: dcim/choices.py:969 +msgid "Ethernet (modular)" +msgstr "Ethernet (modüler)" + +#: dcim/choices.py:1005 +msgid "Ethernet (backplane)" +msgstr "Ethernet (arka panel)" + +#: dcim/choices.py:1033 +msgid "Cellular" +msgstr "Hücresel" + +#: dcim/choices.py:1080 dcim/forms/filtersets.py:302 +#: dcim/forms/filtersets.py:736 dcim/forms/filtersets.py:876 +#: dcim/forms/filtersets.py:1426 templates/dcim/inventoryitem.html:53 +#: templates/dcim/virtualchassis_edit.html:55 +msgid "Serial" +msgstr "Seri" + +#: dcim/choices.py:1095 +msgid "Coaxial" +msgstr "Koaksiyel" + +#: dcim/choices.py:1112 +msgid "Stacking" +msgstr "İstifleme" + +#: dcim/choices.py:1162 +msgid "Half" +msgstr "Yarım" + +#: dcim/choices.py:1163 +msgid "Full" +msgstr "Dolu" + +#: dcim/choices.py:1164 netbox/preferences.py:29 wireless/choices.py:480 +msgid "Auto" +msgstr "Oto" + +#: dcim/choices.py:1175 +msgid "Access" +msgstr "Erişim" + +#: dcim/choices.py:1176 ipam/tables/vlans.py:168 ipam/tables/vlans.py:213 +#: templates/dcim/inc/interface_vlans_table.html:7 +msgid "Tagged" +msgstr "Etiketlenmiş" + +#: dcim/choices.py:1177 +msgid "Tagged (All)" +msgstr "Etiketlenmiş (Tümü)" + +#: dcim/choices.py:1206 +msgid "IEEE Standard" +msgstr "IEEE Standardı" + +#: dcim/choices.py:1217 +msgid "Passive 24V (2-pair)" +msgstr "Pasif 24V (2 çift)" + +#: dcim/choices.py:1218 +msgid "Passive 24V (4-pair)" +msgstr "Pasif 24V (4 çift)" + +#: dcim/choices.py:1219 +msgid "Passive 48V (2-pair)" +msgstr "Pasif 48V (2 çift)" + +#: dcim/choices.py:1220 +msgid "Passive 48V (4-pair)" +msgstr "Pasif 48V (4 çift)" + +#: dcim/choices.py:1282 dcim/choices.py:1378 +msgid "Copper" +msgstr "Bakır" + +#: dcim/choices.py:1305 +msgid "Fiber Optic" +msgstr "Fiber Optik" + +#: dcim/choices.py:1394 +msgid "Fiber" +msgstr "Elyaf" + +#: dcim/choices.py:1418 dcim/forms/filtersets.py:1140 +msgid "Connected" +msgstr "Bağlı" + +#: dcim/choices.py:1437 +msgid "Kilometers" +msgstr "Kilometre" + +#: dcim/choices.py:1438 templates/dcim/cable_trace.html:62 +msgid "Meters" +msgstr "Sayaçlar" + +#: dcim/choices.py:1439 +msgid "Centimeters" +msgstr "Santimetre" + +#: dcim/choices.py:1440 +msgid "Miles" +msgstr "Mil" + +#: dcim/choices.py:1441 templates/dcim/cable_trace.html:63 +msgid "Feet" +msgstr "Ayaklar" + +#: dcim/choices.py:1457 templates/dcim/device.html:332 +#: templates/dcim/rack.html:157 +msgid "Kilograms" +msgstr "Kilogram" + +#: dcim/choices.py:1458 +msgid "Grams" +msgstr "Gramlar" + +#: dcim/choices.py:1459 templates/dcim/rack.html:158 +msgid "Pounds" +msgstr "Pound'lar" + +#: dcim/choices.py:1460 +msgid "Ounces" +msgstr "ons" + +#: dcim/choices.py:1506 tenancy/choices.py:17 +msgid "Primary" +msgstr "Birincil" + +#: dcim/choices.py:1507 +msgid "Redundant" +msgstr "Yedekli" + +#: dcim/choices.py:1528 +msgid "Single phase" +msgstr "Tek fazlı" + +#: dcim/choices.py:1529 +msgid "Three-phase" +msgstr "Üç fazlı" + +#: dcim/filtersets.py:82 +msgid "Parent region (ID)" +msgstr "Ana bölge (ID)" + +#: dcim/filtersets.py:88 +msgid "Parent region (slug)" +msgstr "Ana bölge (sümüklü böcek)" + +#: dcim/filtersets.py:99 +msgid "Parent site group (ID)" +msgstr "Ana site grubu (ID)" + +#: dcim/filtersets.py:105 +msgid "Parent site group (slug)" +msgstr "Ana site grubu (sümüklü böcek)" + +#: dcim/filtersets.py:134 ipam/filtersets.py:797 ipam/filtersets.py:930 +msgid "Group (ID)" +msgstr "Grup (ID)" + +#: dcim/filtersets.py:140 +msgid "Group (slug)" +msgstr "Grup (sümüklü böcek)" + +#: dcim/filtersets.py:146 dcim/filtersets.py:151 +msgid "AS (ID)" +msgstr "OLARAK (İD)" + +#: dcim/filtersets.py:219 dcim/filtersets.py:294 dcim/filtersets.py:393 +#: dcim/filtersets.py:925 dcim/filtersets.py:1229 dcim/filtersets.py:1967 +msgid "Location (ID)" +msgstr "Konum (ID)" + +#: dcim/filtersets.py:226 dcim/filtersets.py:301 dcim/filtersets.py:400 +#: dcim/filtersets.py:1235 extras/filtersets.py:447 +msgid "Location (slug)" +msgstr "Yer (sümüklü böcek)" + +#: dcim/filtersets.py:315 dcim/filtersets.py:772 dcim/filtersets.py:862 +#: dcim/filtersets.py:1635 ipam/filtersets.py:347 ipam/filtersets.py:459 +#: ipam/filtersets.py:940 virtualization/filtersets.py:210 +msgid "Role (ID)" +msgstr "Rol (ID)" + +#: dcim/filtersets.py:321 dcim/filtersets.py:778 dcim/filtersets.py:868 +#: dcim/filtersets.py:1641 extras/filtersets.py:463 ipam/filtersets.py:353 +#: ipam/filtersets.py:465 ipam/filtersets.py:946 +#: virtualization/filtersets.py:216 +msgid "Role (slug)" +msgstr "Rol (sümüklü böcek)" + +#: dcim/filtersets.py:350 dcim/filtersets.py:930 dcim/filtersets.py:1240 +#: dcim/filtersets.py:2029 +msgid "Rack (ID)" +msgstr "Raf (ID)" + +#: dcim/filtersets.py:404 extras/filtersets.py:234 extras/filtersets.py:278 +#: extras/filtersets.py:318 extras/filtersets.py:613 +msgid "User (ID)" +msgstr "Kullanıcı (ID)" + +#: dcim/filtersets.py:410 extras/filtersets.py:240 extras/filtersets.py:284 +#: extras/filtersets.py:324 users/filtersets.py:80 users/filtersets.py:140 +msgid "User (name)" +msgstr "Kullanıcı (isim)" + +#: dcim/filtersets.py:438 dcim/filtersets.py:565 dcim/filtersets.py:762 +#: dcim/filtersets.py:813 dcim/filtersets.py:841 dcim/filtersets.py:1131 +#: dcim/filtersets.py:1625 +msgid "Manufacturer (ID)" +msgstr "Üretici (ID)" + +#: dcim/filtersets.py:444 dcim/filtersets.py:571 dcim/filtersets.py:768 +#: dcim/filtersets.py:819 dcim/filtersets.py:847 dcim/filtersets.py:1137 +#: dcim/filtersets.py:1631 +msgid "Manufacturer (slug)" +msgstr "Üretici (sümüklü böcek)" + +#: dcim/filtersets.py:448 +msgid "Default platform (ID)" +msgstr "Varsayılan platform (ID)" + +#: dcim/filtersets.py:454 +msgid "Default platform (slug)" +msgstr "Varsayılan platform (slug)" + +#: dcim/filtersets.py:457 dcim/forms/filtersets.py:452 +msgid "Has a front image" +msgstr "Ön resmi var" + +#: dcim/filtersets.py:461 dcim/forms/filtersets.py:459 +msgid "Has a rear image" +msgstr "Arka görüntüsü var" + +#: dcim/filtersets.py:466 dcim/filtersets.py:575 dcim/filtersets.py:983 +#: dcim/forms/filtersets.py:466 dcim/forms/filtersets.py:563 +#: dcim/forms/filtersets.py:775 +msgid "Has console ports" +msgstr "Konsol bağlantı noktaları vardır" + +#: dcim/filtersets.py:470 dcim/filtersets.py:579 dcim/filtersets.py:987 +#: dcim/forms/filtersets.py:473 dcim/forms/filtersets.py:570 +#: dcim/forms/filtersets.py:782 +msgid "Has console server ports" +msgstr "Konsol sunucusu bağlantı noktaları vardır" + +#: dcim/filtersets.py:474 dcim/filtersets.py:583 dcim/filtersets.py:991 +#: dcim/forms/filtersets.py:480 dcim/forms/filtersets.py:577 +#: dcim/forms/filtersets.py:789 +msgid "Has power ports" +msgstr "Güç bağlantı noktaları vardır" + +#: dcim/filtersets.py:478 dcim/filtersets.py:587 dcim/filtersets.py:995 +#: dcim/forms/filtersets.py:487 dcim/forms/filtersets.py:584 +#: dcim/forms/filtersets.py:796 +msgid "Has power outlets" +msgstr "Elektrik prizleri var" + +#: dcim/filtersets.py:482 dcim/filtersets.py:591 dcim/filtersets.py:999 +#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:591 +#: dcim/forms/filtersets.py:803 +msgid "Has interfaces" +msgstr "Arayüzleri vardır" + +#: dcim/filtersets.py:486 dcim/filtersets.py:595 dcim/filtersets.py:1003 +#: dcim/forms/filtersets.py:501 dcim/forms/filtersets.py:598 +#: dcim/forms/filtersets.py:810 +msgid "Has pass-through ports" +msgstr "Geçiş bağlantı noktaları vardır" + +#: dcim/filtersets.py:490 dcim/filtersets.py:1007 dcim/forms/filtersets.py:515 +msgid "Has module bays" +msgstr "Modül yuvaları vardır" + +#: dcim/filtersets.py:494 dcim/filtersets.py:1011 dcim/forms/filtersets.py:508 +msgid "Has device bays" +msgstr "Cihaz yuvaları vardır" + +#: dcim/filtersets.py:498 dcim/forms/filtersets.py:522 +msgid "Has inventory items" +msgstr "Envanter kalemleri var" + +#: dcim/filtersets.py:643 dcim/filtersets.py:857 dcim/filtersets.py:1261 +msgid "Device type (ID)" +msgstr "Cihaz tipi (ID)" + +#: dcim/filtersets.py:659 dcim/filtersets.py:1142 +msgid "Module type (ID)" +msgstr "Modül tipi (ID)" + +#: dcim/filtersets.py:758 dcim/filtersets.py:1621 +msgid "Parent inventory item (ID)" +msgstr "Ana envanter kalemi (ID)" + +#: dcim/filtersets.py:801 dcim/filtersets.py:823 dcim/filtersets.py:979 +#: virtualization/filtersets.py:238 +msgid "Config template (ID)" +msgstr "Yapılandırma şablonu (ID)" + +#: dcim/filtersets.py:853 +msgid "Device type (slug)" +msgstr "Cihaz tipi (sümüklü böcek)" + +#: dcim/filtersets.py:873 +msgid "Parent Device (ID)" +msgstr "Ana Cihaz (ID)" + +#: dcim/filtersets.py:877 virtualization/filtersets.py:220 +msgid "Platform (ID)" +msgstr "Platform (ID)" + +#: dcim/filtersets.py:883 extras/filtersets.py:474 +#: virtualization/filtersets.py:226 +msgid "Platform (slug)" +msgstr "Platform (sümüklü böcek)" + +#: dcim/filtersets.py:919 dcim/filtersets.py:1224 dcim/filtersets.py:1719 +#: dcim/filtersets.py:1961 dcim/filtersets.py:2020 +msgid "Site name (slug)" +msgstr "Site adı (sümüklü böcek)" + +#: dcim/filtersets.py:934 +msgid "VM cluster (ID)" +msgstr "VM kümesi (ID)" + +#: dcim/filtersets.py:940 +msgid "Device model (slug)" +msgstr "Cihaz modeli (sümüklü böcek)" + +#: dcim/filtersets.py:951 dcim/forms/bulk_edit.py:421 +msgid "Is full depth" +msgstr "Tam derinlik mi" + +#: dcim/filtersets.py:955 dcim/forms/common.py:18 dcim/forms/filtersets.py:745 +#: dcim/forms/filtersets.py:1285 dcim/models/device_components.py:519 +#: virtualization/filtersets.py:230 virtualization/filtersets.py:297 +#: virtualization/forms/filtersets.py:168 +#: virtualization/forms/filtersets.py:215 +msgid "MAC address" +msgstr "MAC adresi" + +#: dcim/filtersets.py:962 dcim/forms/filtersets.py:754 +#: dcim/forms/filtersets.py:841 virtualization/filtersets.py:234 +#: virtualization/forms/filtersets.py:172 +msgid "Has a primary IP" +msgstr "Birincil IP'ye sahiptir" + +#: dcim/filtersets.py:966 +msgid "Has an out-of-band IP" +msgstr "Bant dışı bir IP'ye sahiptir" + +#: dcim/filtersets.py:971 +msgid "Virtual chassis (ID)" +msgstr "Sanal kasa (ID)" + +#: dcim/filtersets.py:975 +msgid "Is a virtual chassis member" +msgstr "Sanal bir şasi üyesidir" + +#: dcim/filtersets.py:1016 +msgid "OOB IP (ID)" +msgstr "OOB İP (KİMLİĞİ)" + +#: dcim/filtersets.py:1148 +msgid "Module type (model)" +msgstr "Modül tipi (model)" + +#: dcim/filtersets.py:1154 +msgid "Module Bay (ID)" +msgstr "Modül Yuvası (ID)" + +#: dcim/filtersets.py:1158 dcim/filtersets.py:1250 ipam/filtersets.py:577 +#: ipam/filtersets.py:807 ipam/filtersets.py:1026 +#: virtualization/filtersets.py:161 vpn/filtersets.py:351 +msgid "Device (ID)" +msgstr "Cihaz (ID)" + +#: dcim/filtersets.py:1246 +msgid "Rack (name)" +msgstr "Raf (isim)" + +#: dcim/filtersets.py:1256 ipam/filtersets.py:572 ipam/filtersets.py:802 +#: ipam/filtersets.py:1032 vpn/filtersets.py:346 +msgid "Device (name)" +msgstr "Cihaz (isim)" + +#: dcim/filtersets.py:1267 +msgid "Device type (model)" +msgstr "Cihaz tipi (model)" + +#: dcim/filtersets.py:1272 dcim/filtersets.py:1295 +msgid "Device role (ID)" +msgstr "Aygıt rolü (ID)" + +#: dcim/filtersets.py:1278 dcim/filtersets.py:1301 +msgid "Device role (slug)" +msgstr "Cihaz rolü (slug)" + +#: dcim/filtersets.py:1283 +msgid "Virtual Chassis (ID)" +msgstr "Sanal Kasa (ID)" + +#: dcim/filtersets.py:1289 dcim/forms/filtersets.py:106 +#: dcim/tables/devices.py:235 netbox/navigation/menu.py:67 +#: templates/dcim/device.html:123 templates/dcim/device_edit.html:93 +#: templates/dcim/virtualchassis.html:20 +#: templates/dcim/virtualchassis_add.html:8 +#: templates/dcim/virtualchassis_edit.html:25 +msgid "Virtual Chassis" +msgstr "Sanal Şasi" + +#: dcim/filtersets.py:1321 +msgid "Module (ID)" +msgstr "Modül (ID)" + +#: dcim/filtersets.py:1425 ipam/forms/bulk_import.py:188 +#: vpn/forms/bulk_import.py:308 +msgid "Assigned VLAN" +msgstr "Atanmış VLAN" + +#: dcim/filtersets.py:1429 +msgid "Assigned VID" +msgstr "Atanmış VID" + +#: dcim/filtersets.py:1434 dcim/forms/bulk_edit.py:1374 +#: dcim/forms/bulk_import.py:828 dcim/forms/filtersets.py:1328 +#: dcim/forms/model_forms.py:1175 dcim/models/device_components.py:712 +#: dcim/tables/devices.py:637 ipam/filtersets.py:282 ipam/filtersets.py:293 +#: ipam/filtersets.py:449 ipam/filtersets.py:550 ipam/filtersets.py:561 +#: ipam/forms/bulk_edit.py:226 ipam/forms/bulk_edit.py:281 +#: ipam/forms/bulk_edit.py:323 ipam/forms/bulk_import.py:156 +#: ipam/forms/bulk_import.py:242 ipam/forms/bulk_import.py:278 +#: ipam/forms/filtersets.py:66 ipam/forms/filtersets.py:167 +#: ipam/forms/filtersets.py:295 ipam/forms/model_forms.py:59 +#: ipam/forms/model_forms.py:203 ipam/forms/model_forms.py:246 +#: ipam/forms/model_forms.py:290 ipam/forms/model_forms.py:412 +#: ipam/forms/model_forms.py:426 ipam/forms/model_forms.py:440 +#: ipam/models/ip.py:232 ipam/models/ip.py:511 ipam/models/ip.py:719 +#: ipam/models/vrfs.py:62 ipam/tables/ip.py:241 ipam/tables/ip.py:306 +#: ipam/tables/ip.py:356 ipam/tables/ip.py:445 +#: templates/dcim/interface.html:138 templates/ipam/ipaddress.html:21 +#: templates/ipam/iprange.html:43 templates/ipam/prefix.html:20 +#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:14 +#: templates/virtualization/vminterface.html:50 +#: virtualization/forms/bulk_edit.py:260 +#: virtualization/forms/bulk_import.py:171 +#: virtualization/forms/filtersets.py:220 +#: virtualization/forms/model_forms.py:347 +#: virtualization/models/virtualmachines.py:348 +#: virtualization/tables/virtualmachines.py:123 +msgid "VRF" +msgstr "VRF" + +#: dcim/filtersets.py:1440 ipam/filtersets.py:288 ipam/filtersets.py:299 +#: ipam/filtersets.py:455 ipam/filtersets.py:556 ipam/filtersets.py:567 +msgid "VRF (RD)" +msgstr "VRF (RD)" + +#: dcim/filtersets.py:1445 ipam/filtersets.py:967 vpn/filtersets.py:314 +msgid "L2VPN (ID)" +msgstr "L2VPN (KİMLİĞİ)" + +#: dcim/filtersets.py:1451 dcim/forms/filtersets.py:1333 +#: dcim/tables/devices.py:585 ipam/filtersets.py:973 +#: ipam/forms/filtersets.py:499 ipam/tables/vlans.py:133 +#: templates/dcim/interface.html:94 templates/ipam/vlan.html:69 +#: templates/vpn/l2vpntermination.html:15 +#: virtualization/forms/filtersets.py:225 vpn/forms/bulk_import.py:280 +#: vpn/forms/filtersets.py:242 vpn/forms/model_forms.py:402 +#: vpn/forms/model_forms.py:420 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +msgid "L2VPN" +msgstr "L2VPN" + +#: dcim/filtersets.py:1483 +msgid "Virtual Chassis Interfaces for Device" +msgstr "Cihaz için Sanal Kasa Arabirimleri" + +#: dcim/filtersets.py:1488 +msgid "Virtual Chassis Interfaces for Device (ID)" +msgstr "Cihaz için Sanal Kasa Arabirimleri (ID)" + +#: dcim/filtersets.py:1492 +msgid "Kind of interface" +msgstr "Arayüz türü" + +#: dcim/filtersets.py:1497 virtualization/filtersets.py:289 +msgid "Parent interface (ID)" +msgstr "Ebeveyn arabirimi (ID)" + +#: dcim/filtersets.py:1502 virtualization/filtersets.py:294 +msgid "Bridged interface (ID)" +msgstr "Köprülü arayüz (ID)" + +#: dcim/filtersets.py:1507 +msgid "LAG interface (ID)" +msgstr "LAG arabirimi (ID)" + +#: dcim/filtersets.py:1676 +msgid "Master (ID)" +msgstr "Master (ID)" + +#: dcim/filtersets.py:1682 +msgid "Master (name)" +msgstr "Master (isim)" + +#: dcim/filtersets.py:1724 tenancy/filtersets.py:221 +msgid "Tenant (ID)" +msgstr "Kiracı (ID)" + +#: dcim/filtersets.py:1730 extras/filtersets.py:523 tenancy/filtersets.py:227 +msgid "Tenant (slug)" +msgstr "Kiracı (sümüklü böcek)" + +#: dcim/filtersets.py:1766 dcim/forms/filtersets.py:990 +msgid "Unterminated" +msgstr "Sonlandırılmamış" + +#: dcim/filtersets.py:2024 +msgid "Power panel (ID)" +msgstr "Güç paneli (ID)" + +#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:410 +#: extras/forms/model_forms.py:451 extras/forms/model_forms.py:502 +#: netbox/forms/base.py:82 netbox/forms/mixins.py:79 +#: netbox/tables/columns.py:448 +#: templates/circuits/inc/circuit_termination.html:119 +#: templates/generic/bulk_edit.html:81 templates/inc/panels/tags.html:5 +#: utilities/forms/fields/fields.py:81 +msgid "Tags" +msgstr "Etiketler" + +#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1390 +#: dcim/forms/model_forms.py:422 dcim/forms/model_forms.py:468 +#: dcim/forms/object_create.py:196 dcim/forms/object_create.py:352 +#: dcim/tables/devices.py:198 dcim/tables/devices.py:720 +#: dcim/tables/devicetypes.py:242 templates/dcim/device.html:45 +#: templates/dcim/device.html:129 templates/dcim/modulebay.html:35 +#: templates/dcim/virtualchassis.html:59 +#: templates/dcim/virtualchassis_edit.html:56 +msgid "Position" +msgstr "Pozisyon" + +#: dcim/forms/bulk_create.py:114 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of names being " +"created.)" +msgstr "" +"Alfasayısal aralıklar desteklenir. (Oluşturulan isim sayısıyla " +"eşleşmelidir.)" + +#: dcim/forms/bulk_edit.py:115 dcim/forms/bulk_import.py:99 +#: dcim/forms/model_forms.py:120 dcim/tables/sites.py:89 +#: ipam/filtersets.py:936 ipam/forms/bulk_edit.py:528 +#: ipam/forms/bulk_import.py:444 ipam/forms/model_forms.py:509 +#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 +#: templates/dcim/interface.html:294 templates/dcim/site.html:37 +#: templates/ipam/inc/panels/fhrp_groups.html:10 templates/ipam/vlan.html:30 +#: templates/tenancy/contact.html:22 templates/tenancy/tenant.html:21 +#: templates/users/group.html:6 templates/users/group.html:14 +#: templates/virtualization/cluster.html:32 templates/vpn/tunnel.html:30 +#: templates/wireless/wirelesslan.html:19 tenancy/forms/bulk_edit.py:42 +#: tenancy/forms/bulk_edit.py:93 tenancy/forms/bulk_import.py:40 +#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:47 +#: tenancy/forms/filtersets.py:77 tenancy/forms/filtersets.py:96 +#: tenancy/forms/model_forms.py:46 tenancy/forms/model_forms.py:102 +#: tenancy/forms/model_forms.py:124 tenancy/tables/contacts.py:60 +#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 +#: users/filtersets.py:42 users/filtersets.py:145 users/forms/filtersets.py:32 +#: users/forms/filtersets.py:38 users/forms/filtersets.py:80 +#: virtualization/forms/bulk_edit.py:64 virtualization/forms/bulk_import.py:47 +#: virtualization/forms/filtersets.py:84 +#: virtualization/forms/model_forms.py:69 virtualization/tables/clusters.py:70 +#: vpn/forms/bulk_edit.py:111 vpn/forms/bulk_import.py:158 +#: vpn/forms/filtersets.py:113 vpn/tables/crypto.py:31 +#: wireless/forms/bulk_edit.py:47 wireless/forms/bulk_import.py:36 +#: wireless/forms/filtersets.py:45 wireless/forms/model_forms.py:41 +#: wireless/tables/wirelesslan.py:48 +msgid "Group" +msgstr "Grup" + +#: dcim/forms/bulk_edit.py:130 +msgid "Contact name" +msgstr "İrtibat Kişisi Adı" + +#: dcim/forms/bulk_edit.py:135 +msgid "Contact phone" +msgstr "İletişim telefonu" + +#: dcim/forms/bulk_edit.py:141 +msgid "Contact E-mail" +msgstr "İletişim E-posta" + +#: dcim/forms/bulk_edit.py:144 dcim/forms/bulk_import.py:122 +#: dcim/forms/model_forms.py:131 +msgid "Time zone" +msgstr "Saat dilimi" + +#: dcim/forms/bulk_edit.py:266 dcim/forms/bulk_edit.py:1152 +#: dcim/forms/bulk_edit.py:1539 dcim/forms/bulk_import.py:199 +#: dcim/forms/bulk_import.py:1009 dcim/forms/filtersets.py:299 +#: dcim/forms/filtersets.py:704 dcim/forms/filtersets.py:1417 +#: dcim/forms/model_forms.py:224 dcim/forms/model_forms.py:963 +#: dcim/forms/model_forms.py:1304 dcim/forms/object_import.py:186 +#: dcim/tables/devices.py:202 dcim/tables/devices.py:828 +#: dcim/tables/devices.py:939 dcim/tables/devicetypes.py:300 +#: dcim/tables/racks.py:69 extras/filtersets.py:457 +#: ipam/forms/bulk_edit.py:245 ipam/forms/bulk_edit.py:294 +#: ipam/forms/bulk_edit.py:342 ipam/forms/bulk_edit.py:546 +#: ipam/forms/bulk_import.py:196 ipam/forms/bulk_import.py:261 +#: ipam/forms/bulk_import.py:297 ipam/forms/bulk_import.py:463 +#: ipam/forms/filtersets.py:232 ipam/forms/filtersets.py:278 +#: ipam/forms/filtersets.py:346 ipam/forms/filtersets.py:490 +#: ipam/forms/model_forms.py:187 ipam/forms/model_forms.py:222 +#: ipam/forms/model_forms.py:249 ipam/forms/model_forms.py:647 +#: ipam/tables/ip.py:257 ipam/tables/ip.py:313 ipam/tables/ip.py:363 +#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:230 +#: templates/dcim/device.html:187 +#: templates/dcim/inc/panels/inventory_items.html:12 +#: templates/dcim/interface.html:231 templates/dcim/inventoryitem.html:37 +#: templates/dcim/rack.html:50 templates/ipam/ipaddress.html:44 +#: templates/ipam/iprange.html:53 templates/ipam/prefix.html:78 +#: templates/ipam/role.html:20 templates/ipam/vlan.html:55 +#: templates/virtualization/virtualmachine.html:26 +#: templates/vpn/tunneltermination.html:18 +#: templates/wireless/inc/wirelesslink_interface.html:20 +#: tenancy/forms/bulk_edit.py:141 tenancy/forms/filtersets.py:106 +#: tenancy/forms/model_forms.py:139 tenancy/tables/contacts.py:102 +#: virtualization/forms/bulk_edit.py:144 +#: virtualization/forms/bulk_import.py:106 +#: virtualization/forms/filtersets.py:153 +#: virtualization/forms/model_forms.py:198 +#: virtualization/tables/virtualmachines.py:65 vpn/forms/bulk_edit.py:86 +#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:84 +#: vpn/forms/model_forms.py:77 vpn/forms/model_forms.py:112 +#: vpn/tables/tunnels.py:78 +msgid "Role" +msgstr "Rol" + +#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:605 +#: dcim/forms/bulk_edit.py:654 templates/dcim/device.html:106 +#: templates/dcim/module.html:75 templates/dcim/modulebay.html:69 +#: templates/dcim/rack.html:58 +msgid "Serial Number" +msgstr "Seri Numarası" + +#: dcim/forms/bulk_edit.py:276 dcim/forms/filtersets.py:306 +#: dcim/forms/filtersets.py:740 dcim/forms/filtersets.py:880 +#: dcim/forms/filtersets.py:1430 +msgid "Asset tag" +msgstr "Varlık etiketi" + +#: dcim/forms/bulk_edit.py:286 dcim/forms/bulk_import.py:212 +#: dcim/forms/filtersets.py:291 templates/dcim/rack.html:91 +#: templates/dcim/rack_edit.html:48 +msgid "Width" +msgstr "Genişlik" + +#: dcim/forms/bulk_edit.py:292 +msgid "Height (U)" +msgstr "Yükseklik (U)" + +#: dcim/forms/bulk_edit.py:297 +msgid "Descending units" +msgstr "Azalan birimler" + +#: dcim/forms/bulk_edit.py:300 +msgid "Outer width" +msgstr "Dış genişlik" + +#: dcim/forms/bulk_edit.py:305 +msgid "Outer depth" +msgstr "Dış derinlik" + +#: dcim/forms/bulk_edit.py:310 dcim/forms/bulk_import.py:217 +msgid "Outer unit" +msgstr "Dış ünite" + +#: dcim/forms/bulk_edit.py:315 +msgid "Mounting depth" +msgstr "Montaj derinliği" + +#: dcim/forms/bulk_edit.py:320 dcim/forms/bulk_edit.py:349 +#: dcim/forms/bulk_edit.py:434 dcim/forms/bulk_edit.py:457 +#: dcim/forms/bulk_edit.py:473 dcim/forms/bulk_edit.py:493 +#: dcim/forms/bulk_import.py:324 dcim/forms/bulk_import.py:350 +#: dcim/forms/filtersets.py:250 dcim/forms/filtersets.py:311 +#: dcim/forms/filtersets.py:335 dcim/forms/filtersets.py:423 +#: dcim/forms/filtersets.py:529 dcim/forms/filtersets.py:548 +#: dcim/forms/filtersets.py:605 dcim/forms/model_forms.py:337 +#: dcim/tables/devicetypes.py:103 dcim/tables/modules.py:35 +#: dcim/tables/racks.py:103 extras/forms/bulk_edit.py:45 +#: extras/forms/bulk_edit.py:107 extras/forms/bulk_edit.py:157 +#: extras/forms/bulk_edit.py:277 extras/forms/filtersets.py:60 +#: extras/forms/filtersets.py:133 extras/forms/filtersets.py:220 +#: ipam/forms/bulk_edit.py:187 templates/dcim/device.html:329 +#: templates/dcim/devicetype.html:52 templates/dcim/moduletype.html:31 +#: templates/dcim/rack_edit.html:60 templates/dcim/rack_edit.html:63 +#: templates/extras/configcontext.html:18 templates/extras/customlink.html:26 +#: templates/extras/savedfilter.html:34 templates/ipam/role.html:33 +msgid "Weight" +msgstr "Ağırlığı" + +#: dcim/forms/bulk_edit.py:325 dcim/forms/filtersets.py:316 +msgid "Max weight" +msgstr "Maksimum ağırlık" + +#: dcim/forms/bulk_edit.py:330 dcim/forms/bulk_edit.py:439 +#: dcim/forms/bulk_edit.py:478 dcim/forms/bulk_import.py:223 +#: dcim/forms/bulk_import.py:329 dcim/forms/bulk_import.py:355 +#: dcim/forms/filtersets.py:321 dcim/forms/filtersets.py:533 +#: dcim/forms/filtersets.py:609 +msgid "Weight unit" +msgstr "Ağırlık birimi" + +#: dcim/forms/bulk_edit.py:344 dcim/forms/bulk_edit.py:800 +#: dcim/forms/bulk_import.py:262 dcim/forms/bulk_import.py:265 +#: dcim/forms/bulk_import.py:490 dcim/forms/bulk_import.py:1286 +#: dcim/forms/bulk_import.py:1290 dcim/forms/filtersets.py:101 +#: dcim/forms/filtersets.py:339 dcim/forms/filtersets.py:353 +#: dcim/forms/filtersets.py:391 dcim/forms/filtersets.py:699 +#: dcim/forms/filtersets.py:948 dcim/forms/filtersets.py:1080 +#: dcim/forms/model_forms.py:241 dcim/forms/model_forms.py:413 +#: dcim/forms/model_forms.py:662 dcim/forms/object_create.py:399 +#: dcim/tables/devices.py:194 dcim/tables/power.py:70 dcim/tables/racks.py:148 +#: ipam/forms/bulk_edit.py:464 ipam/forms/filtersets.py:427 +#: ipam/forms/model_forms.py:571 templates/dcim/device.html:30 +#: templates/dcim/inc/cable_termination.html:16 +#: templates/dcim/powerfeed.html:31 templates/dcim/rack.html:14 +#: templates/dcim/rack/base.html:4 templates/dcim/rack_edit.html:8 +#: templates/dcim/rackreservation.html:20 +#: templates/dcim/rackreservation.html:39 +#: virtualization/forms/model_forms.py:116 +msgid "Rack" +msgstr "Raf" + +#: dcim/forms/bulk_edit.py:346 dcim/forms/bulk_edit.py:623 +#: dcim/forms/filtersets.py:247 dcim/forms/filtersets.py:332 +#: dcim/forms/filtersets.py:417 dcim/forms/filtersets.py:543 +#: dcim/forms/filtersets.py:652 dcim/forms/filtersets.py:853 +#: dcim/forms/model_forms.py:589 dcim/forms/model_forms.py:1374 +#: templates/dcim/device_edit.html:20 +#: templates/dcim/inventoryitem_edit.html:23 +msgid "Hardware" +msgstr "Donanım" + +#: dcim/forms/bulk_edit.py:400 dcim/forms/bulk_edit.py:464 +#: dcim/forms/bulk_edit.py:528 dcim/forms/bulk_edit.py:552 +#: dcim/forms/bulk_edit.py:633 dcim/forms/bulk_edit.py:1157 +#: dcim/forms/bulk_edit.py:1544 dcim/forms/bulk_import.py:311 +#: dcim/forms/bulk_import.py:345 dcim/forms/bulk_import.py:387 +#: dcim/forms/bulk_import.py:423 dcim/forms/bulk_import.py:1015 +#: dcim/forms/filtersets.py:429 dcim/forms/filtersets.py:554 +#: dcim/forms/filtersets.py:631 dcim/forms/filtersets.py:709 +#: dcim/forms/filtersets.py:858 dcim/forms/filtersets.py:1423 +#: dcim/forms/model_forms.py:274 dcim/forms/model_forms.py:288 +#: dcim/forms/model_forms.py:330 dcim/forms/model_forms.py:370 +#: dcim/forms/model_forms.py:968 dcim/forms/model_forms.py:1309 +#: dcim/forms/object_import.py:192 dcim/tables/devices.py:129 +#: dcim/tables/devices.py:205 dcim/tables/devices.py:942 +#: dcim/tables/devicetypes.py:81 dcim/tables/devicetypes.py:304 +#: dcim/tables/modules.py:20 dcim/tables/modules.py:60 +#: templates/dcim/devicetype.html:17 templates/dcim/inventoryitem.html:45 +#: templates/dcim/manufacturer.html:34 templates/dcim/modulebay.html:61 +#: templates/dcim/moduletype.html:15 templates/dcim/platform.html:40 +msgid "Manufacturer" +msgstr "Üretici" + +#: dcim/forms/bulk_edit.py:405 dcim/forms/bulk_import.py:317 +#: dcim/forms/filtersets.py:434 dcim/forms/model_forms.py:292 +msgid "Default platform" +msgstr "Varsayılan platform" + +#: dcim/forms/bulk_edit.py:410 dcim/forms/bulk_edit.py:469 +#: dcim/forms/filtersets.py:437 dcim/forms/filtersets.py:558 +msgid "Part number" +msgstr "Parça numarası" + +#: dcim/forms/bulk_edit.py:414 +msgid "U height" +msgstr "U yüksekliği" + +#: dcim/forms/bulk_edit.py:426 +msgid "Exclude from utilization" +msgstr "Kullanımdan hariç tut" + +#: dcim/forms/bulk_edit.py:429 dcim/forms/bulk_edit.py:598 +#: dcim/forms/bulk_import.py:517 dcim/forms/filtersets.py:446 +#: dcim/forms/filtersets.py:731 templates/dcim/device.html:100 +#: templates/dcim/devicetype.html:68 +msgid "Airflow" +msgstr "Hava akışı" + +#: dcim/forms/bulk_edit.py:453 dcim/forms/model_forms.py:303 +#: dcim/tables/devicetypes.py:78 templates/dcim/device.html:90 +#: templates/dcim/devicebay.html:59 templates/dcim/module.html:59 +msgid "Device Type" +msgstr "Cihaz Türü" + +#: dcim/forms/bulk_edit.py:492 dcim/forms/model_forms.py:336 +#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 +#: templates/dcim/module.html:63 templates/dcim/modulebay.html:65 +#: templates/dcim/moduletype.html:11 +msgid "Module Type" +msgstr "Modül Türü" + +#: dcim/forms/bulk_edit.py:506 dcim/models/devices.py:472 +msgid "VM role" +msgstr "VM rolü" + +#: dcim/forms/bulk_edit.py:509 dcim/forms/bulk_edit.py:533 +#: dcim/forms/bulk_edit.py:613 dcim/forms/bulk_import.py:368 +#: dcim/forms/bulk_import.py:372 dcim/forms/bulk_import.py:394 +#: dcim/forms/bulk_import.py:398 dcim/forms/bulk_import.py:523 +#: dcim/forms/bulk_import.py:527 dcim/forms/filtersets.py:620 +#: dcim/forms/filtersets.py:636 dcim/forms/filtersets.py:750 +#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:375 +#: dcim/forms/model_forms.py:477 virtualization/forms/bulk_import.py:132 +#: virtualization/forms/bulk_import.py:133 +#: virtualization/forms/filtersets.py:180 +#: virtualization/forms/model_forms.py:218 +msgid "Config template" +msgstr "Yapılandırma şablonu" + +#: dcim/forms/bulk_edit.py:557 dcim/forms/bulk_edit.py:951 +#: dcim/forms/bulk_import.py:429 dcim/forms/filtersets.py:111 +#: dcim/forms/model_forms.py:435 dcim/forms/model_forms.py:776 +#: dcim/forms/model_forms.py:790 extras/filtersets.py:452 +msgid "Device type" +msgstr "Cihaz tipi" + +#: dcim/forms/bulk_edit.py:565 dcim/forms/bulk_import.py:410 +#: dcim/forms/filtersets.py:116 dcim/forms/model_forms.py:440 +msgid "Device role" +msgstr "Cihaz rolü" + +#: dcim/forms/bulk_edit.py:588 dcim/forms/bulk_import.py:435 +#: dcim/forms/filtersets.py:723 dcim/forms/model_forms.py:385 +#: dcim/forms/model_forms.py:444 extras/filtersets.py:468 +#: templates/dcim/device.html:191 templates/dcim/platform.html:27 +#: templates/virtualization/virtualmachine.html:30 +#: virtualization/forms/bulk_edit.py:159 +#: virtualization/forms/bulk_import.py:122 +#: virtualization/forms/filtersets.py:164 +#: virtualization/forms/model_forms.py:206 +msgid "Platform" +msgstr "Platform" + +#: dcim/forms/bulk_edit.py:621 dcim/forms/bulk_edit.py:1171 +#: dcim/forms/bulk_edit.py:1534 dcim/forms/bulk_edit.py:1580 +#: dcim/forms/bulk_import.py:578 dcim/forms/bulk_import.py:640 +#: dcim/forms/bulk_import.py:666 dcim/forms/bulk_import.py:692 +#: dcim/forms/bulk_import.py:712 dcim/forms/bulk_import.py:765 +#: dcim/forms/bulk_import.py:879 dcim/forms/bulk_import.py:927 +#: dcim/forms/bulk_import.py:944 dcim/forms/bulk_import.py:956 +#: dcim/forms/bulk_import.py:1004 dcim/forms/bulk_import.py:1350 +#: dcim/forms/connections.py:23 dcim/forms/filtersets.py:128 +#: dcim/forms/filtersets.py:831 dcim/forms/filtersets.py:964 +#: dcim/forms/filtersets.py:1154 dcim/forms/filtersets.py:1176 +#: dcim/forms/filtersets.py:1198 dcim/forms/filtersets.py:1215 +#: dcim/forms/filtersets.py:1235 dcim/forms/filtersets.py:1343 +#: dcim/forms/filtersets.py:1365 dcim/forms/filtersets.py:1386 +#: dcim/forms/filtersets.py:1401 dcim/forms/filtersets.py:1412 +#: dcim/forms/filtersets.py:1476 dcim/forms/filtersets.py:1500 +#: dcim/forms/filtersets.py:1524 dcim/forms/model_forms.py:555 +#: dcim/forms/model_forms.py:753 dcim/forms/model_forms.py:1004 +#: dcim/forms/model_forms.py:1453 dcim/forms/object_create.py:256 +#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 +#: dcim/tables/connections.py:60 dcim/tables/devices.py:314 +#: dcim/tables/devices.py:374 dcim/tables/devices.py:418 +#: dcim/tables/devices.py:463 dcim/tables/devices.py:517 +#: dcim/tables/devices.py:609 dcim/tables/devices.py:710 +#: dcim/tables/devices.py:770 dcim/tables/devices.py:820 +#: dcim/tables/devices.py:880 dcim/tables/devices.py:932 +#: dcim/tables/devices.py:1058 dcim/tables/modules.py:52 +#: extras/forms/filtersets.py:329 ipam/forms/bulk_import.py:303 +#: ipam/forms/bulk_import.py:489 ipam/forms/filtersets.py:532 +#: ipam/forms/model_forms.py:685 ipam/tables/vlans.py:176 +#: templates/dcim/consoleport.html:23 templates/dcim/consoleserverport.html:23 +#: templates/dcim/device.html:14 templates/dcim/device.html:128 +#: templates/dcim/device_edit.html:10 templates/dcim/devicebay.html:23 +#: templates/dcim/devicebay.html:55 templates/dcim/frontport.html:23 +#: templates/dcim/interface.html:31 templates/dcim/interface.html:167 +#: templates/dcim/inventoryitem.html:21 templates/dcim/module.html:55 +#: templates/dcim/modulebay.html:21 templates/dcim/poweroutlet.html:23 +#: templates/dcim/powerport.html:23 templates/dcim/rearport.html:23 +#: templates/dcim/virtualchassis.html:58 +#: templates/dcim/virtualchassis_edit.html:52 +#: templates/dcim/virtualdevicecontext.html:25 +#: templates/ipam/ipaddress_edit.html:42 templates/ipam/service_create.html:17 +#: templates/ipam/service_edit.html:16 +#: templates/virtualization/virtualmachine.html:115 +#: templates/vpn/l2vpntermination_edit.html:22 +#: templates/vpn/tunneltermination.html:24 +#: templates/wireless/inc/wirelesslink_interface.html:6 +#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:136 +#: virtualization/forms/bulk_import.py:99 +#: virtualization/forms/filtersets.py:124 +#: virtualization/forms/model_forms.py:188 +#: virtualization/tables/virtualmachines.py:61 vpn/choices.py:44 +#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 +#: vpn/forms/filtersets.py:271 vpn/forms/model_forms.py:89 +#: vpn/forms/model_forms.py:124 vpn/forms/model_forms.py:237 +#: wireless/forms/model_forms.py:100 wireless/forms/model_forms.py:140 +#: wireless/tables/wirelesslan.py:75 +msgid "Device" +msgstr "Cihaz" + +#: dcim/forms/bulk_edit.py:624 netbox/navigation/menu.py:441 +#: templates/extras/dashboard/widget_config.html:7 +msgid "Configuration" +msgstr "Yapılandırma" + +#: dcim/forms/bulk_edit.py:638 dcim/forms/bulk_import.py:590 +#: dcim/forms/model_forms.py:569 dcim/forms/model_forms.py:795 +msgid "Module type" +msgstr "Modül tipi" + +#: dcim/forms/bulk_edit.py:689 dcim/forms/bulk_edit.py:874 +#: dcim/forms/bulk_edit.py:893 dcim/forms/bulk_edit.py:916 +#: dcim/forms/bulk_edit.py:958 dcim/forms/bulk_edit.py:1002 +#: dcim/forms/bulk_edit.py:1053 dcim/forms/bulk_edit.py:1080 +#: dcim/forms/bulk_edit.py:1107 dcim/forms/bulk_edit.py:1125 +#: dcim/forms/bulk_edit.py:1143 dcim/forms/filtersets.py:64 +#: dcim/forms/object_create.py:45 templates/dcim/cable.html:33 +#: templates/dcim/consoleport.html:35 templates/dcim/consoleserverport.html:35 +#: templates/dcim/devicebay.html:31 templates/dcim/frontport.html:35 +#: templates/dcim/inc/panels/inventory_items.html:11 +#: templates/dcim/interface.html:43 templates/dcim/inventoryitem.html:33 +#: templates/dcim/modulebay.html:31 templates/dcim/poweroutlet.html:35 +#: templates/dcim/powerport.html:35 templates/dcim/rearport.html:35 +#: templates/extras/customfield.html:27 templates/generic/bulk_import.html:155 +msgid "Label" +msgstr "etiket" + +#: dcim/forms/bulk_edit.py:698 dcim/forms/filtersets.py:981 +#: templates/dcim/cable.html:51 +msgid "Length" +msgstr "Uzunluk" + +#: dcim/forms/bulk_edit.py:703 dcim/forms/bulk_import.py:1158 +#: dcim/forms/bulk_import.py:1161 dcim/forms/filtersets.py:985 +msgid "Length unit" +msgstr "Uzunluk birimi" + +#: dcim/forms/bulk_edit.py:727 templates/dcim/virtualchassis.html:24 +msgid "Domain" +msgstr "Alan adı" + +#: dcim/forms/bulk_edit.py:795 dcim/forms/bulk_import.py:1273 +#: dcim/forms/filtersets.py:1071 dcim/forms/model_forms.py:657 +msgid "Power panel" +msgstr "Güç paneli" + +#: dcim/forms/bulk_edit.py:817 dcim/forms/bulk_import.py:1309 +#: dcim/forms/filtersets.py:1093 templates/dcim/powerfeed.html:90 +msgid "Supply" +msgstr "Tedarik" + +#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1314 +#: dcim/forms/filtersets.py:1098 templates/dcim/powerfeed.html:102 +msgid "Phase" +msgstr "Faz" + +#: dcim/forms/bulk_edit.py:829 dcim/forms/filtersets.py:1103 +#: templates/dcim/powerfeed.html:94 +msgid "Voltage" +msgstr "Gerilim" + +#: dcim/forms/bulk_edit.py:833 dcim/forms/filtersets.py:1107 +#: templates/dcim/powerfeed.html:98 +msgid "Amperage" +msgstr "Amper" + +#: dcim/forms/bulk_edit.py:837 dcim/forms/filtersets.py:1111 +msgid "Max utilization" +msgstr "Maksimum kullanım" + +#: dcim/forms/bulk_edit.py:841 dcim/forms/bulk_edit.py:1200 +#: dcim/forms/bulk_edit.py:1217 dcim/forms/bulk_edit.py:1234 +#: dcim/forms/bulk_edit.py:1252 dcim/forms/bulk_edit.py:1340 +#: dcim/forms/bulk_edit.py:1478 dcim/forms/bulk_edit.py:1495 +msgid "Mark connected" +msgstr "Bağlı olarak işaretle" + +#: dcim/forms/bulk_edit.py:926 +msgid "Maximum draw" +msgstr "Maksimum çekiliş" + +#: dcim/forms/bulk_edit.py:929 dcim/models/device_component_templates.py:256 +#: dcim/models/device_components.py:357 +msgid "Maximum power draw (watts)" +msgstr "Maksimum güç çekimi (watt)" + +#: dcim/forms/bulk_edit.py:932 +msgid "Allocated draw" +msgstr "Tahsis edilen çekiliş" + +#: dcim/forms/bulk_edit.py:935 dcim/models/device_component_templates.py:263 +#: dcim/models/device_components.py:364 +msgid "Allocated power draw (watts)" +msgstr "Tahsis edilen güç çekimi (watt)" + +#: dcim/forms/bulk_edit.py:968 dcim/forms/bulk_import.py:723 +#: dcim/forms/model_forms.py:848 dcim/forms/model_forms.py:1076 +#: dcim/forms/model_forms.py:1361 dcim/forms/object_import.py:60 +msgid "Power port" +msgstr "Güç bağlantı noktası" + +#: dcim/forms/bulk_edit.py:973 +msgid "Feed leg" +msgstr "Besleme bacağı" + +#: dcim/forms/bulk_edit.py:1019 dcim/forms/bulk_edit.py:1325 +msgid "Management only" +msgstr "Yalnızca yönetim" + +#: dcim/forms/bulk_edit.py:1029 dcim/forms/bulk_edit.py:1331 +#: dcim/forms/bulk_import.py:813 dcim/forms/filtersets.py:1294 +#: dcim/forms/object_import.py:95 +#: dcim/models/device_component_templates.py:411 +#: dcim/models/device_components.py:671 +msgid "PoE mode" +msgstr "PoE modu" + +#: dcim/forms/bulk_edit.py:1035 dcim/forms/bulk_edit.py:1337 +#: dcim/forms/bulk_import.py:819 dcim/forms/filtersets.py:1299 +#: dcim/forms/object_import.py:100 +#: dcim/models/device_component_templates.py:417 +#: dcim/models/device_components.py:677 +msgid "PoE type" +msgstr "PoE tipi" + +#: dcim/forms/bulk_edit.py:1041 dcim/forms/filtersets.py:1304 +#: dcim/forms/object_import.py:105 +msgid "Wireless role" +msgstr "Kablosuz rolü" + +#: dcim/forms/bulk_edit.py:1178 dcim/forms/model_forms.py:588 +#: dcim/forms/model_forms.py:1019 dcim/tables/devices.py:337 +#: templates/dcim/consoleport.html:27 templates/dcim/consoleserverport.html:27 +#: templates/dcim/frontport.html:27 templates/dcim/interface.html:35 +#: templates/dcim/module.html:51 templates/dcim/modulebay.html:57 +#: templates/dcim/poweroutlet.html:27 templates/dcim/powerport.html:27 +#: templates/dcim/rearport.html:27 +msgid "Module" +msgstr "Modül" + +#: dcim/forms/bulk_edit.py:1305 dcim/tables/devices.py:680 +#: templates/dcim/interface.html:113 +msgid "LAG" +msgstr "GECİKME" + +#: dcim/forms/bulk_edit.py:1310 dcim/forms/model_forms.py:1103 +msgid "Virtual device contexts" +msgstr "Sanal cihaz bağlamları" + +#: dcim/forms/bulk_edit.py:1316 dcim/forms/bulk_import.py:651 +#: dcim/forms/bulk_import.py:677 dcim/forms/filtersets.py:1163 +#: dcim/forms/filtersets.py:1185 dcim/forms/filtersets.py:1258 +#: dcim/tables/devices.py:621 +#: templates/circuits/inc/circuit_termination.html:94 +#: templates/dcim/consoleport.html:43 templates/dcim/consoleserverport.html:43 +msgid "Speed" +msgstr "Hız" + +#: dcim/forms/bulk_edit.py:1345 dcim/forms/bulk_import.py:822 +#: templates/vpn/ikepolicy.html:26 templates/vpn/ipsecprofile.html:22 +#: templates/vpn/ipsecprofile.html:51 virtualization/forms/bulk_edit.py:232 +#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:145 +#: vpn/forms/bulk_edit.py:233 vpn/forms/bulk_import.py:176 +#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:132 +#: vpn/forms/filtersets.py:175 vpn/forms/filtersets.py:189 +#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +msgid "Mode" +msgstr "Modu" + +#: dcim/forms/bulk_edit.py:1353 dcim/forms/model_forms.py:1152 +#: ipam/forms/bulk_import.py:177 ipam/forms/filtersets.py:479 +#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:239 +#: virtualization/forms/model_forms.py:324 +msgid "VLAN group" +msgstr "VLAN grubu" + +#: dcim/forms/bulk_edit.py:1361 dcim/forms/model_forms.py:1157 +#: dcim/tables/devices.py:594 virtualization/forms/bulk_edit.py:247 +#: virtualization/forms/model_forms.py:329 +msgid "Untagged VLAN" +msgstr "Etiketsiz VLAN" + +#: dcim/forms/bulk_edit.py:1369 dcim/forms/model_forms.py:1166 +#: dcim/tables/devices.py:600 virtualization/forms/bulk_edit.py:255 +#: virtualization/forms/model_forms.py:338 +msgid "Tagged VLANs" +msgstr "Etiketli VLAN'lar" + +#: dcim/forms/bulk_edit.py:1379 dcim/forms/model_forms.py:1139 +msgid "Wireless LAN group" +msgstr "Kablosuz LAN grubu" + +#: dcim/forms/bulk_edit.py:1384 dcim/forms/model_forms.py:1144 +#: dcim/tables/devices.py:630 netbox/navigation/menu.py:134 +#: templates/dcim/interface.html:289 wireless/tables/wirelesslan.py:24 +msgid "Wireless LANs" +msgstr "Kablosuz LAN'lar" + +#: dcim/forms/bulk_edit.py:1393 dcim/forms/filtersets.py:1231 +#: dcim/forms/model_forms.py:1185 ipam/forms/bulk_edit.py:270 +#: ipam/forms/bulk_edit.py:361 ipam/forms/filtersets.py:166 +#: templates/dcim/interface.html:126 templates/ipam/prefix.html:96 +#: virtualization/forms/model_forms.py:352 +msgid "Addressing" +msgstr "Adresleme" + +#: dcim/forms/bulk_edit.py:1394 dcim/forms/filtersets.py:651 +#: dcim/forms/model_forms.py:1186 virtualization/forms/model_forms.py:353 +msgid "Operation" +msgstr "Operasyon" + +#: dcim/forms/bulk_edit.py:1395 dcim/forms/filtersets.py:1232 +#: dcim/forms/model_forms.py:880 dcim/forms/model_forms.py:1188 +msgid "PoE" +msgstr "PoE" + +#: dcim/forms/bulk_edit.py:1396 dcim/forms/model_forms.py:1187 +#: templates/dcim/interface.html:101 virtualization/forms/bulk_edit.py:266 +#: virtualization/forms/model_forms.py:354 +msgid "Related Interfaces" +msgstr "İlgili Arayüzler" + +#: dcim/forms/bulk_edit.py:1397 dcim/forms/model_forms.py:1189 +#: virtualization/forms/bulk_edit.py:267 +#: virtualization/forms/model_forms.py:355 +msgid "802.1Q Switching" +msgstr "802.1Q Anahtarlama" + +#: dcim/forms/bulk_edit.py:1458 dcim/forms/bulk_edit.py:1460 +msgid "Interface mode must be specified to assign VLANs" +msgstr "VLAN'ları atamak için arayüz modu belirtilmelidir" + +#: dcim/forms/bulk_edit.py:1465 dcim/forms/common.py:50 +msgid "An access interface cannot have tagged VLANs assigned." +msgstr "Bir erişim arabirimi VLAN'ları etiketlemiş olamaz." + +#: dcim/forms/bulk_import.py:63 +msgid "Name of parent region" +msgstr "Ana bölgenin adı" + +#: dcim/forms/bulk_import.py:77 +msgid "Name of parent site group" +msgstr "Üst site grubunun adı" + +#: dcim/forms/bulk_import.py:96 +msgid "Assigned region" +msgstr "Atanan bölge" + +#: dcim/forms/bulk_import.py:103 tenancy/forms/bulk_import.py:44 +#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +msgid "Assigned group" +msgstr "Atanan grup" + +#: dcim/forms/bulk_import.py:122 +msgid "available options" +msgstr "mevcut seçenekler" + +#: dcim/forms/bulk_import.py:133 dcim/forms/bulk_import.py:480 +#: dcim/forms/bulk_import.py:1270 ipam/forms/bulk_import.py:174 +#: ipam/forms/bulk_import.py:441 virtualization/forms/bulk_import.py:63 +#: virtualization/forms/bulk_import.py:89 +msgid "Assigned site" +msgstr "Atanan site" + +#: dcim/forms/bulk_import.py:140 +msgid "Parent location" +msgstr "Ana konum" + +#: dcim/forms/bulk_import.py:142 +msgid "Location not found." +msgstr "Konum bulunamadı." + +#: dcim/forms/bulk_import.py:191 +msgid "Name of assigned tenant" +msgstr "Atanan kiracının adı" + +#: dcim/forms/bulk_import.py:203 +msgid "Name of assigned role" +msgstr "Atanan rolün adı" + +#: dcim/forms/bulk_import.py:209 +msgid "Rack type" +msgstr "Raf tipi" + +#: dcim/forms/bulk_import.py:214 +msgid "Rail-to-rail width (in inches)" +msgstr "Ray-ray genişliği (inç cinsinden)" + +#: dcim/forms/bulk_import.py:220 +msgid "Unit for outer dimensions" +msgstr "Dış boyutlar için birim" + +#: dcim/forms/bulk_import.py:226 +msgid "Unit for rack weights" +msgstr "Raf ağırlıkları için ünite" + +#: dcim/forms/bulk_import.py:252 +msgid "Parent site" +msgstr "Ana site" + +#: dcim/forms/bulk_import.py:259 dcim/forms/bulk_import.py:1283 +msgid "Rack's location (if any)" +msgstr "Rafın konumu (varsa)" + +#: dcim/forms/bulk_import.py:268 dcim/forms/model_forms.py:246 +#: dcim/tables/racks.py:153 templates/dcim/rackreservation.html:12 +#: templates/dcim/rackreservation.html:52 +msgid "Units" +msgstr "Birimler" + +#: dcim/forms/bulk_import.py:271 +msgid "Comma-separated list of individual unit numbers" +msgstr "Bireysel birim numaralarının virgülle ayrılmış listesi" + +#: dcim/forms/bulk_import.py:314 +msgid "The manufacturer which produces this device type" +msgstr "Bu cihaz tipini üreten üretici" + +#: dcim/forms/bulk_import.py:321 +msgid "The default platform for devices of this type (optional)" +msgstr "Bu tür cihazlar için varsayılan platform (isteğe bağlı)" + +#: dcim/forms/bulk_import.py:326 +msgid "Device weight" +msgstr "Cihaz ağırlığı" + +#: dcim/forms/bulk_import.py:332 +msgid "Unit for device weight" +msgstr "Cihaz ağırlığı için birim" + +#: dcim/forms/bulk_import.py:352 +msgid "Module weight" +msgstr "Modül ağırlığı" + +#: dcim/forms/bulk_import.py:358 +msgid "Unit for module weight" +msgstr "Modül ağırlığı için birim" + +#: dcim/forms/bulk_import.py:391 +msgid "Limit platform assignments to this manufacturer" +msgstr "Platform atamalarını bu üreticiye sınırlayın" + +#: dcim/forms/bulk_import.py:413 tenancy/forms/bulk_import.py:106 +msgid "Assigned role" +msgstr "Atanan rol" + +#: dcim/forms/bulk_import.py:426 +msgid "Device type manufacturer" +msgstr "Cihaz tipi üreticisi" + +#: dcim/forms/bulk_import.py:432 +msgid "Device type model" +msgstr "Cihaz tipi modeli" + +#: dcim/forms/bulk_import.py:439 virtualization/forms/bulk_import.py:126 +msgid "Assigned platform" +msgstr "Atanan platform" + +#: dcim/forms/bulk_import.py:447 dcim/forms/bulk_import.py:451 +#: dcim/forms/model_forms.py:461 +msgid "Virtual chassis" +msgstr "Sanal şasi" + +#: dcim/forms/bulk_import.py:454 dcim/forms/model_forms.py:450 +#: dcim/tables/devices.py:231 extras/filtersets.py:501 +#: extras/forms/filtersets.py:330 ipam/forms/bulk_edit.py:478 +#: ipam/forms/model_forms.py:588 templates/dcim/device.html:239 +#: templates/virtualization/cluster.html:11 +#: templates/virtualization/virtualmachine.html:92 +#: templates/virtualization/virtualmachine.html:102 +#: virtualization/filtersets.py:157 virtualization/filtersets.py:273 +#: virtualization/forms/bulk_edit.py:128 +#: virtualization/forms/bulk_import.py:92 +#: virtualization/forms/filtersets.py:98 +#: virtualization/forms/filtersets.py:119 +#: virtualization/forms/filtersets.py:196 +#: virtualization/forms/model_forms.py:82 +#: virtualization/forms/model_forms.py:179 +#: virtualization/tables/virtualmachines.py:57 +msgid "Cluster" +msgstr "Küme" + +#: dcim/forms/bulk_import.py:458 +msgid "Virtualization cluster" +msgstr "Sanallaştırma kümesi" + +#: dcim/forms/bulk_import.py:487 +msgid "Assigned location (if any)" +msgstr "Atanan konum (varsa)" + +#: dcim/forms/bulk_import.py:494 +msgid "Assigned rack (if any)" +msgstr "Atanmış raf (varsa)" + +#: dcim/forms/bulk_import.py:497 +msgid "Face" +msgstr "Yüz" + +#: dcim/forms/bulk_import.py:500 +msgid "Mounted rack face" +msgstr "Monte edilmiş raf yüzü" + +#: dcim/forms/bulk_import.py:507 +msgid "Parent device (for child devices)" +msgstr "Ana cihaz (çocuk cihazlar için)" + +#: dcim/forms/bulk_import.py:510 +msgid "Device bay" +msgstr "Cihaz yuvası" + +#: dcim/forms/bulk_import.py:514 +msgid "Device bay in which this device is installed (for child devices)" +msgstr "Bu cihazın kurulu olduğu cihaz yuvası (çocuk cihazlar için)" + +#: dcim/forms/bulk_import.py:520 +msgid "Airflow direction" +msgstr "Hava akışı yönü" + +#: dcim/forms/bulk_import.py:581 +msgid "The device in which this module is installed" +msgstr "Bu modülün kurulu olduğu cihaz" + +#: dcim/forms/bulk_import.py:584 dcim/forms/model_forms.py:562 +msgid "Module bay" +msgstr "Modül yuvası" + +#: dcim/forms/bulk_import.py:587 +msgid "The module bay in which this module is installed" +msgstr "Bu modülün kurulu olduğu modül yuvası" + +#: dcim/forms/bulk_import.py:593 +msgid "The type of module" +msgstr "Modül türü" + +#: dcim/forms/bulk_import.py:601 dcim/forms/model_forms.py:575 +msgid "Replicate components" +msgstr "Bileşenleri çoğaltın" + +#: dcim/forms/bulk_import.py:603 +msgid "" +"Automatically populate components associated with this module type (enabled " +"by default)" +msgstr "" +"Bu modül türüyle ilişkili bileşenleri otomatik olarak doldurun (varsayılan " +"olarak etkindir)" + +#: dcim/forms/bulk_import.py:606 dcim/forms/model_forms.py:581 +msgid "Adopt components" +msgstr "Bileşenleri benimseyin" + +#: dcim/forms/bulk_import.py:608 dcim/forms/model_forms.py:584 +msgid "Adopt already existing components" +msgstr "Mevcut bileşenleri benimseyin" + +#: dcim/forms/bulk_import.py:648 dcim/forms/bulk_import.py:674 +#: dcim/forms/bulk_import.py:700 +msgid "Port type" +msgstr "Bağlantı noktası tipi" + +#: dcim/forms/bulk_import.py:656 dcim/forms/bulk_import.py:682 +msgid "Port speed in bps" +msgstr "Bps cinsinden bağlantı noktası hızı" + +#: dcim/forms/bulk_import.py:720 +msgid "Outlet type" +msgstr "Çıkış tipi" + +#: dcim/forms/bulk_import.py:727 +msgid "Local power port which feeds this outlet" +msgstr "Bu prizi besleyen yerel güç portu" + +#: dcim/forms/bulk_import.py:730 +msgid "Feed lag" +msgstr "Besleme gecikmesi" + +#: dcim/forms/bulk_import.py:733 +msgid "Electrical phase (for three-phase circuits)" +msgstr "Elektrik fazı (üç fazlı devreler için)" + +#: dcim/forms/bulk_import.py:774 dcim/forms/model_forms.py:1114 +#: virtualization/forms/bulk_import.py:155 +#: virtualization/forms/model_forms.py:308 +msgid "Parent interface" +msgstr "Ebeveyn arayüzü" + +#: dcim/forms/bulk_import.py:781 dcim/forms/model_forms.py:1122 +#: virtualization/forms/bulk_import.py:162 +#: virtualization/forms/model_forms.py:316 +msgid "Bridged interface" +msgstr "Köprülü arayüz" + +#: dcim/forms/bulk_import.py:784 +msgid "Lag" +msgstr "Gecikme" + +#: dcim/forms/bulk_import.py:788 +msgid "Parent LAG interface" +msgstr "Ebeveyn LAG arayüzü" + +#: dcim/forms/bulk_import.py:791 +msgid "Vdcs" +msgstr "Vdcs" + +#: dcim/forms/bulk_import.py:796 +msgid "VDC names separated by commas, encased with double quotes. Example:" +msgstr "" +"VDC isimleri virgülle ayrılmış, çift tırnak işareti ile çevrelenmiştir. " +"Örnek:" + +#: dcim/forms/bulk_import.py:802 +msgid "Physical medium" +msgstr "Fiziksel ortam" + +#: dcim/forms/bulk_import.py:805 dcim/forms/filtersets.py:1265 +msgid "Duplex" +msgstr "Dubleks" + +#: dcim/forms/bulk_import.py:810 +msgid "Poe mode" +msgstr "Poe modu" + +#: dcim/forms/bulk_import.py:816 +msgid "Poe type" +msgstr "Poe tipi" + +#: dcim/forms/bulk_import.py:825 virtualization/forms/bulk_import.py:168 +msgid "IEEE 802.1Q operational mode (for L2 interfaces)" +msgstr "IEEE 802.1Q çalışma modu (L2 arayüzleri için)" + +#: dcim/forms/bulk_import.py:832 ipam/forms/bulk_import.py:160 +#: ipam/forms/bulk_import.py:246 ipam/forms/bulk_import.py:282 +#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:266 +#: ipam/forms/filtersets.py:322 virtualization/forms/bulk_import.py:175 +msgid "Assigned VRF" +msgstr "Atanmış VRF" + +#: dcim/forms/bulk_import.py:835 +msgid "Rf role" +msgstr "Rf rolü" + +#: dcim/forms/bulk_import.py:838 +msgid "Wireless role (AP/station)" +msgstr "Kablosuz rolü (AP/istasyon)" + +#: dcim/forms/bulk_import.py:884 dcim/forms/model_forms.py:893 +#: dcim/forms/model_forms.py:1369 dcim/forms/object_import.py:122 +msgid "Rear port" +msgstr "Arka bağlantı noktası" + +#: dcim/forms/bulk_import.py:887 +msgid "Corresponding rear port" +msgstr "İlgili arka bağlantı noktası" + +#: dcim/forms/bulk_import.py:892 dcim/forms/bulk_import.py:933 +#: dcim/forms/bulk_import.py:1148 +msgid "Physical medium classification" +msgstr "Fiziksel ortam sınıflandırması" + +#: dcim/forms/bulk_import.py:961 dcim/tables/devices.py:841 +msgid "Installed device" +msgstr "Yüklü cihaz" + +#: dcim/forms/bulk_import.py:965 +msgid "Child device installed within this bay" +msgstr "Bu bölmeye takılan çocuk cihazı" + +#: dcim/forms/bulk_import.py:967 +msgid "Child device not found." +msgstr "Çocuk cihazı bulunamadı." + +#: dcim/forms/bulk_import.py:1025 +msgid "Parent inventory item" +msgstr "Ana envanter kalemi" + +#: dcim/forms/bulk_import.py:1028 +msgid "Component type" +msgstr "Bileşen tipi" + +#: dcim/forms/bulk_import.py:1032 +msgid "Component Type" +msgstr "Bileşen Türü" + +#: dcim/forms/bulk_import.py:1035 +msgid "Compnent name" +msgstr "Bileşen adı" + +#: dcim/forms/bulk_import.py:1037 +msgid "Component Name" +msgstr "Bileşen Adı" + +#: dcim/forms/bulk_import.py:1103 +msgid "Side A device" +msgstr "A Tarafı Cihazı" + +#: dcim/forms/bulk_import.py:1106 dcim/forms/bulk_import.py:1124 +msgid "Device name" +msgstr "Aygıt adı" + +#: dcim/forms/bulk_import.py:1109 +msgid "Side A type" +msgstr "Taraf A tipi" + +#: dcim/forms/bulk_import.py:1112 dcim/forms/bulk_import.py:1130 +msgid "Termination type" +msgstr "Sonlandırma türü" + +#: dcim/forms/bulk_import.py:1115 +msgid "Side A name" +msgstr "A Tarafı adı" + +#: dcim/forms/bulk_import.py:1116 dcim/forms/bulk_import.py:1134 +msgid "Termination name" +msgstr "Fesih adı" + +#: dcim/forms/bulk_import.py:1121 +msgid "Side B device" +msgstr "B tarafı cihazı" + +#: dcim/forms/bulk_import.py:1127 +msgid "Side B type" +msgstr "Taraf B tipi" + +#: dcim/forms/bulk_import.py:1133 +msgid "Side B name" +msgstr "B tarafı adı" + +#: dcim/forms/bulk_import.py:1142 wireless/forms/bulk_import.py:86 +msgid "Connection status" +msgstr "Bağlantı durumu" + +#: dcim/forms/bulk_import.py:1221 dcim/forms/model_forms.py:689 +#: dcim/tables/devices.py:1028 templates/dcim/device.html:130 +#: templates/dcim/virtualchassis.html:28 templates/dcim/virtualchassis.html:60 +msgid "Master" +msgstr "Usta" + +#: dcim/forms/bulk_import.py:1225 +msgid "Master device" +msgstr "Ana cihaz" + +#: dcim/forms/bulk_import.py:1242 +msgid "Name of parent site" +msgstr "Ana sitenin adı" + +#: dcim/forms/bulk_import.py:1276 +msgid "Upstream power panel" +msgstr "Yukarı akış güç paneli" + +#: dcim/forms/bulk_import.py:1306 +msgid "Primary or redundant" +msgstr "Birincil veya gereksiz" + +#: dcim/forms/bulk_import.py:1311 +msgid "Supply type (AC/DC)" +msgstr "Besleme tipi (AC/DC)" + +#: dcim/forms/bulk_import.py:1316 +msgid "Single or three-phase" +msgstr "Tek veya üç fazlı" + +#: dcim/forms/common.py:24 dcim/models/device_components.py:528 +#: templates/dcim/interface.html:58 +#: templates/virtualization/vminterface.html:58 +#: virtualization/forms/bulk_edit.py:224 +msgid "MTU" +msgstr "MTU" + +#: dcim/forms/common.py:65 +#, python-brace-format +msgid "" +"The tagged VLANs ({vlans}) must belong to the same site as the interface's " +"parent device/VM, or they must be global" +msgstr "" +"Etiketli VLAN'lar ({vlans}) arayüzün ana cihazı/sanal makinesiyle aynı " +"siteye ait olmalı veya global olmalıdır" + +#: dcim/forms/common.py:110 +msgid "" +"Cannot install module with placeholder values in a module bay with no " +"position defined." +msgstr "" +"Konum tanımlanmamış bir modül yuvasına yer tutucu değerleri olan modül " +"yüklenemiyor." + +#: dcim/forms/common.py:119 +#, python-brace-format +msgid "Cannot adopt {model} {name} as it already belongs to a module" +msgstr "Evlat edinemiyor {model} {name} zaten bir modüle ait olduğu için" + +#: dcim/forms/common.py:128 +#, python-brace-format +msgid "A {model} named {name} already exists" +msgstr "BİR {model} adlandırmak {name} zaten var" + +#: dcim/forms/connections.py:45 dcim/tables/power.py:66 +#: templates/dcim/inc/cable_termination.html:37 +#: templates/dcim/powerfeed.html:27 templates/dcim/powerpanel.html:19 +#: templates/dcim/trace/powerpanel.html:4 +msgid "Power Panel" +msgstr "Güç Paneli" + +#: dcim/forms/connections.py:54 dcim/forms/model_forms.py:670 +#: templates/dcim/powerfeed.html:22 templates/dcim/powerport.html:84 +msgid "Power Feed" +msgstr "Güç Beslemesi" + +#: dcim/forms/connections.py:74 +msgid "Side" +msgstr "Yan" + +#: dcim/forms/filtersets.py:141 +msgid "Parent region" +msgstr "Ana bölge" + +#: dcim/forms/filtersets.py:155 tenancy/forms/bulk_import.py:28 +#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:32 +#: tenancy/forms/filtersets.py:61 wireless/forms/bulk_import.py:25 +#: wireless/forms/filtersets.py:24 +msgid "Parent group" +msgstr "Ebeveyn grubu" + +#: dcim/forms/filtersets.py:246 dcim/forms/filtersets.py:331 +msgid "Function" +msgstr "Fonksiyon" + +#: dcim/forms/filtersets.py:418 dcim/forms/model_forms.py:308 +#: templates/inc/panels/image_attachments.html:5 +msgid "Images" +msgstr "Görüntüler" + +#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:544 +#: dcim/forms/filtersets.py:655 +msgid "Components" +msgstr "Bileşenleri" + +#: dcim/forms/filtersets.py:441 +msgid "Subdevice role" +msgstr "Alt aygıt rolü" + +#: dcim/forms/filtersets.py:717 +msgid "Model" +msgstr "Modeli" + +#: dcim/forms/filtersets.py:768 +msgid "Virtual chassis member" +msgstr "Sanal şasi elemanı" + +#: dcim/forms/filtersets.py:1123 +msgid "Cabled" +msgstr "Kablolu" + +#: dcim/forms/filtersets.py:1130 +msgid "Occupied" +msgstr "işgal" + +#: dcim/forms/filtersets.py:1155 dcim/forms/filtersets.py:1177 +#: dcim/forms/filtersets.py:1199 dcim/forms/filtersets.py:1216 +#: dcim/forms/filtersets.py:1236 dcim/tables/devices.py:367 +#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:59 +#: templates/dcim/frontport.html:74 templates/dcim/interface.html:146 +#: templates/dcim/powerfeed.html:118 templates/dcim/poweroutlet.html:63 +#: templates/dcim/powerport.html:63 templates/dcim/rearport.html:70 +msgid "Connection" +msgstr "Bağlantı" + +#: dcim/forms/filtersets.py:1245 dcim/forms/model_forms.py:1477 +#: templates/dcim/virtualdevicecontext.html:16 +msgid "Virtual Device Context" +msgstr "Sanal Cihaz Bağlamı" + +#: dcim/forms/filtersets.py:1248 extras/forms/bulk_edit.py:315 +#: extras/forms/bulk_import.py:239 extras/forms/filtersets.py:479 +#: extras/forms/model_forms.py:555 extras/tables/tables.py:487 +#: templates/extras/journalentry.html:33 +msgid "Kind" +msgstr "Tür" + +#: dcim/forms/filtersets.py:1277 +msgid "Mgmt only" +msgstr "Sadece Mgmt" + +#: dcim/forms/filtersets.py:1289 dcim/forms/model_forms.py:1180 +#: dcim/models/device_components.py:630 templates/dcim/interface.html:134 +msgid "WWN" +msgstr "WWN" + +#: dcim/forms/filtersets.py:1309 +msgid "Wireless channel" +msgstr "Kablosuz kanal" + +#: dcim/forms/filtersets.py:1313 +msgid "Channel frequency (MHz)" +msgstr "Kanal frekansı (MHz)" + +#: dcim/forms/filtersets.py:1317 +msgid "Channel width (MHz)" +msgstr "Kanal genişliği (MHz)" + +#: dcim/forms/filtersets.py:1321 templates/dcim/interface.html:86 +msgid "Transmit power (dBm)" +msgstr "İletim gücü (dBm)" + +#: dcim/forms/filtersets.py:1344 dcim/forms/filtersets.py:1366 +#: dcim/tables/devices.py:344 templates/dcim/cable.html:12 +#: templates/dcim/cable_edit.html:46 templates/dcim/cable_trace.html:43 +#: templates/dcim/frontport.html:84 +#: templates/dcim/inc/connection_endpoints.html:4 +#: templates/dcim/rearport.html:80 templates/dcim/trace/cable.html:7 +msgid "Cable" +msgstr "Kablo" + +#: dcim/forms/filtersets.py:1434 dcim/tables/devices.py:951 +msgid "Discovered" +msgstr "Keşfedildi" + +#: dcim/forms/formsets.py:20 +#, python-brace-format +msgid "A virtual chassis member already exists in position {vc_position}." +msgstr "Bir sanal kasa elemanı zaten yerinde var {vc_position}." + +#: dcim/forms/model_forms.py:101 dcim/tables/devices.py:183 +#: templates/dcim/sitegroup.html:26 +msgid "Site Group" +msgstr "Site Grubu" + +#: dcim/forms/model_forms.py:142 +msgid "Contact Info" +msgstr "İletişim Bilgisi" + +#: dcim/forms/model_forms.py:197 templates/dcim/rackrole.html:20 +msgid "Rack Role" +msgstr "Raf Rolü" + +#: dcim/forms/model_forms.py:248 +msgid "" +"Comma-separated list of numeric unit IDs. A range may be specified using a " +"hyphen." +msgstr "" +"Virgülle ayrılmış sayısal birim kimlikleri listesi. Bir aralık bir tire " +"kullanılarak belirtilebilir." + +#: dcim/forms/model_forms.py:259 dcim/tables/racks.py:133 +msgid "Reservation" +msgstr "Rezervasyon" + +#: dcim/forms/model_forms.py:297 dcim/forms/model_forms.py:380 +#: utilities/forms/fields/fields.py:47 +msgid "Slug" +msgstr "Sümüklü böcek" + +#: dcim/forms/model_forms.py:304 templates/dcim/devicetype.html:12 +msgid "Chassis" +msgstr "Şasi" + +#: dcim/forms/model_forms.py:356 templates/dcim/devicerole.html:24 +msgid "Device Role" +msgstr "Aygıt Rolü" + +#: dcim/forms/model_forms.py:424 dcim/models/devices.py:632 +msgid "The lowest-numbered unit occupied by the device" +msgstr "Cihazın kullandığı en düşük numaralı birim" + +#: dcim/forms/model_forms.py:469 +msgid "The position in the virtual chassis this device is identified by" +msgstr "Bu cihazın sanal kasadaki konumu tanımlanır" + +#: dcim/forms/model_forms.py:473 templates/dcim/device.html:131 +#: templates/dcim/virtualchassis.html:61 +#: templates/dcim/virtualchassis_edit.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:13 +#: tenancy/forms/bulk_edit.py:146 tenancy/forms/filtersets.py:109 +msgid "Priority" +msgstr "Öncelik" + +#: dcim/forms/model_forms.py:474 +msgid "The priority of the device in the virtual chassis" +msgstr "Sanal kasadaki cihazın önceliği" + +#: dcim/forms/model_forms.py:578 +msgid "Automatically populate components associated with this module type" +msgstr "Bu modül türüyle ilişkili bileşenleri otomatik olarak doldurun" + +#: dcim/forms/model_forms.py:623 +msgid "Maximum length is 32767 (any unit)" +msgstr "Maksimum uzunluk 32767'dir (herhangi bir birim)" + +#: dcim/forms/model_forms.py:671 +msgid "Characteristics" +msgstr "ÖZELLİKLERİ" + +#: dcim/forms/model_forms.py:1130 +msgid "LAG interface" +msgstr "LAG arayüzü" + +#: dcim/forms/model_forms.py:1184 dcim/forms/model_forms.py:1345 +#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:317 +#: ipam/forms/model_forms.py:270 ipam/forms/model_forms.py:279 +#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:368 ipam/tables/vlans.py:165 +#: templates/circuits/inc/circuit_termination.html:78 +#: templates/dcim/frontport.html:113 templates/dcim/interface.html:27 +#: templates/dcim/interface.html:190 templates/dcim/interface.html:322 +#: templates/dcim/inventoryitem_edit.html:54 templates/dcim/rearport.html:109 +#: templates/ipam/fhrpgroupassignment_edit.html:11 +#: templates/virtualization/vminterface.html:19 +#: templates/vpn/tunneltermination.html:32 +#: templates/wireless/inc/wirelesslink_interface.html:10 +#: templates/wireless/wirelesslink.html:10 +#: templates/wireless/wirelesslink.html:49 +#: virtualization/forms/model_forms.py:351 vpn/forms/bulk_import.py:297 +#: vpn/forms/model_forms.py:94 vpn/forms/model_forms.py:129 +#: vpn/forms/model_forms.py:241 vpn/forms/model_forms.py:430 +#: vpn/forms/model_forms.py:439 vpn/tables/tunnels.py:87 +#: wireless/forms/model_forms.py:112 wireless/forms/model_forms.py:152 +msgid "Interface" +msgstr "Arayüz" + +#: dcim/forms/model_forms.py:1278 +msgid "Child Device" +msgstr "Çocuk Cihazı" + +#: dcim/forms/model_forms.py:1279 +msgid "" +"Child devices must first be created and assigned to the site and rack of the" +" parent device." +msgstr "" +"Alt aygıtlar önce oluşturulmalı ve ana aygıtın sahasına ve rafına " +"atanmalıdır." + +#: dcim/forms/model_forms.py:1321 +msgid "Console port" +msgstr "Konsol bağlantı noktası" + +#: dcim/forms/model_forms.py:1329 +msgid "Console server port" +msgstr "Konsol sunucusu bağlantı noktası" + +#: dcim/forms/model_forms.py:1337 +msgid "Front port" +msgstr "Ön bağlantı noktası" + +#: dcim/forms/model_forms.py:1353 +msgid "Power outlet" +msgstr "Güç çıkışı" + +#: dcim/forms/model_forms.py:1373 templates/dcim/inventoryitem.html:17 +#: templates/dcim/inventoryitem_edit.html:10 +msgid "Inventory Item" +msgstr "Envanter Öğesi" + +#: dcim/forms/model_forms.py:1425 +msgid "An InventoryItem can only be assigned to a single component." +msgstr "Bir InventoryItem yalnızca tek bir bileşene atanabilir." + +#: dcim/forms/model_forms.py:1439 templates/dcim/inventoryitemrole.html:15 +msgid "Inventory Item Role" +msgstr "Envanter Öğesi Rolü" + +#: dcim/forms/model_forms.py:1459 templates/dcim/device.html:195 +#: templates/dcim/virtualdevicecontext.html:33 +#: templates/virtualization/virtualmachine.html:51 +msgid "Primary IPv4" +msgstr "Birincil IPv4" + +#: dcim/forms/model_forms.py:1468 templates/dcim/device.html:211 +#: templates/dcim/virtualdevicecontext.html:44 +#: templates/virtualization/virtualmachine.html:67 +msgid "Primary IPv6" +msgstr "Birincil IPv6" + +#: dcim/forms/object_create.py:47 dcim/forms/object_create.py:198 +#: dcim/forms/object_create.py:354 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of objects being " +"created.)" +msgstr "" +"Alfasayısal aralıklar desteklenir. (Oluşturulan nesnelerin sayısıyla " +"eşleşmelidir.)" + +#: dcim/forms/object_create.py:67 +#, python-brace-format +msgid "" +"The provided pattern specifies {value_count} values, but {pattern_count} are" +" expected." +msgstr "" +"Sağlanan desen belirtir {value_count} Değerler, ama {pattern_count} " +"bekleniyor." + +#: dcim/forms/object_create.py:109 dcim/forms/object_create.py:270 +#: dcim/tables/devices.py:281 +msgid "Rear ports" +msgstr "Arka bağlantı noktaları" + +#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 +msgid "Select one rear port assignment for each front port being created." +msgstr "" +"Oluşturulan her ön bağlantı noktası için bir arka bağlantı noktası ataması " +"seçin." + +#: dcim/forms/object_create.py:163 +#, python-brace-format +msgid "" +"The number of front port templates to be created ({frontport_count}) must " +"match the selected number of rear port positions ({rearport_count})." +msgstr "" +"Oluşturulacak ön bağlantı noktası şablonlarının sayısı ({frontport_count}) " +"seçilen arka port konumu sayısıyla eşleşmelidir ({rearport_count})." + +#: dcim/forms/object_create.py:250 +#, python-brace-format +msgid "" +"The string {module} will be replaced with the position of the " +"assigned module, if any." +msgstr "" +"Dize {module} varsa atanan modülün konumu ile " +"değiştirilecektir." + +#: dcim/forms/object_create.py:319 +#, python-brace-format +msgid "" +"The number of front ports to be created ({frontport_count}) must match the " +"selected number of rear port positions ({rearport_count})." +msgstr "" +"Oluşturulacak ön bağlantı noktalarının sayısı ({frontport_count}) seçilen " +"arka port konumu sayısıyla eşleşmelidir ({rearport_count})." + +#: dcim/forms/object_create.py:408 dcim/tables/devices.py:1034 +#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:54 +#: templates/dcim/virtualchassis_edit.html:48 templates/ipam/fhrpgroup.html:39 +msgid "Members" +msgstr "Üyeler" + +#: dcim/forms/object_create.py:417 +msgid "Initial position" +msgstr "Başlangıç pozisyonu" + +#: dcim/forms/object_create.py:420 +msgid "" +"Position of the first member device. Increases by one for each additional " +"member." +msgstr "İlk üye cihazın konumu. Her ek üye için bir artar." + +#: dcim/forms/object_create.py:434 +msgid "A position must be specified for the first VC member." +msgstr "İlk VC üyesi için bir pozisyon belirtilmelidir." + +#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 +#: dcim/models/device_components.py:63 extras/models/customfields.py:108 +msgid "label" +msgstr "etiketlemek" + +#: dcim/models/cables.py:71 +msgid "length" +msgstr "uzunluk" + +#: dcim/models/cables.py:78 +msgid "length unit" +msgstr "uzunluk birimi" + +#: dcim/models/cables.py:93 +msgid "cable" +msgstr "kablo" + +#: dcim/models/cables.py:94 +msgid "cables" +msgstr "kablolar" + +#: dcim/models/cables.py:190 +msgid "A and B terminations cannot connect to the same object." +msgstr "A ve B sonlandırmaları aynı nesneye bağlanamaz." + +#: dcim/models/cables.py:257 ipam/models/asns.py:37 +msgid "end" +msgstr "son" + +#: dcim/models/cables.py:310 +msgid "cable termination" +msgstr "kablo sonlandırma" + +#: dcim/models/cables.py:311 +msgid "cable terminations" +msgstr "kablo sonlandırmaları" + +#: dcim/models/cables.py:434 extras/models/configs.py:50 +msgid "is active" +msgstr "aktiftir" + +#: dcim/models/cables.py:438 +msgid "is complete" +msgstr "tamamlandı" + +#: dcim/models/cables.py:442 +msgid "is split" +msgstr "bölünmüş" + +#: dcim/models/cables.py:450 +msgid "cable path" +msgstr "kablo yolu" + +#: dcim/models/cables.py:451 +msgid "cable paths" +msgstr "kablo yolları" + +#: dcim/models/device_component_templates.py:46 +#, python-brace-format +msgid "" +"{module} is accepted as a substitution for the module bay position when " +"attached to a module type." +msgstr "" +"{module} bir modül tipine bağlandığında modül yuvası konumunun yerine kabul " +"edilir." + +#: dcim/models/device_component_templates.py:58 +#: dcim/models/device_components.py:66 +msgid "Physical label" +msgstr "Fiziksel etiket" + +#: dcim/models/device_component_templates.py:103 +msgid "Component templates cannot be moved to a different device type." +msgstr "Bileşen şablonları farklı bir aygıt türüne taşınamaz." + +#: dcim/models/device_component_templates.py:154 +msgid "" +"A component template cannot be associated with both a device type and a " +"module type." +msgstr "" +"Bir bileşen şablonu hem aygıt türü hem de modül türüyle ilişkilendirilemez." + +#: dcim/models/device_component_templates.py:158 +msgid "" +"A component template must be associated with either a device type or a " +"module type." +msgstr "" +"Bir bileşen şablonu, bir aygıt türü veya bir modül türüyle " +"ilişkilendirilmelidir." + +#: dcim/models/device_component_templates.py:186 +msgid "console port template" +msgstr "konsol bağlantı noktası şablonu" + +#: dcim/models/device_component_templates.py:187 +msgid "console port templates" +msgstr "konsol bağlantı noktası şablonları" + +#: dcim/models/device_component_templates.py:220 +msgid "console server port template" +msgstr "konsol sunucusu bağlantı noktası şablonu" + +#: dcim/models/device_component_templates.py:221 +msgid "console server port templates" +msgstr "konsol sunucusu bağlantı noktası şablonları" + +#: dcim/models/device_component_templates.py:252 +#: dcim/models/device_components.py:353 +msgid "maximum draw" +msgstr "maksimum çekiliş" + +#: dcim/models/device_component_templates.py:259 +#: dcim/models/device_components.py:360 +msgid "allocated draw" +msgstr "tahsis edilen çekiliş" + +#: dcim/models/device_component_templates.py:269 +msgid "power port template" +msgstr "güç bağlantı noktası şablonu" + +#: dcim/models/device_component_templates.py:270 +msgid "power port templates" +msgstr "güç bağlantı noktası şablonları" + +#: dcim/models/device_component_templates.py:289 +#: dcim/models/device_components.py:383 +#, python-brace-format +msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." +msgstr "Tahsis edilen çekiliş maksimum çekilişi aşamaz ({maximum_draw}W)." + +#: dcim/models/device_component_templates.py:321 +#: dcim/models/device_components.py:478 +msgid "feed leg" +msgstr "besleme bacağı" + +#: dcim/models/device_component_templates.py:325 +#: dcim/models/device_components.py:482 +msgid "Phase (for three-phase feeds)" +msgstr "Faz (üç fazlı beslemeler için)" + +#: dcim/models/device_component_templates.py:331 +msgid "power outlet template" +msgstr "elektrik prizi şablonu" + +#: dcim/models/device_component_templates.py:332 +msgid "power outlet templates" +msgstr "elektrik prizi şablonları" + +#: dcim/models/device_component_templates.py:341 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device type" +msgstr "" +"Ana güç bağlantı noktası ({power_port}) aynı cihaz türüne ait olmalıdır" + +#: dcim/models/device_component_templates.py:345 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same module type" +msgstr "" +"Ana güç bağlantı noktası ({power_port}) aynı modül türüne ait olmalıdır" + +#: dcim/models/device_component_templates.py:397 +#: dcim/models/device_components.py:612 +msgid "management only" +msgstr "sadece yönetim" + +#: dcim/models/device_component_templates.py:405 +#: dcim/models/device_components.py:551 +msgid "bridge interface" +msgstr "köprü arayüzü" + +#: dcim/models/device_component_templates.py:423 +#: dcim/models/device_components.py:637 +msgid "wireless role" +msgstr "kablosuz rolü" + +#: dcim/models/device_component_templates.py:429 +msgid "interface template" +msgstr "arayüz şablonu" + +#: dcim/models/device_component_templates.py:430 +msgid "interface templates" +msgstr "arayüz şablonları" + +#: dcim/models/device_component_templates.py:437 +#: dcim/models/device_components.py:805 +#: virtualization/models/virtualmachines.py:398 +msgid "An interface cannot be bridged to itself." +msgstr "Bir arayüz kendi başına köprülenemez." + +#: dcim/models/device_component_templates.py:440 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same device type" +msgstr "Köprü arayüzü ({bridge}) aynı cihaz türüne ait olmalıdır" + +#: dcim/models/device_component_templates.py:444 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same module type" +msgstr "Köprü arayüzü ({bridge}) aynı modül türüne ait olmalıdır" + +#: dcim/models/device_component_templates.py:500 +#: dcim/models/device_components.py:985 +msgid "rear port position" +msgstr "arka port konumu" + +#: dcim/models/device_component_templates.py:525 +msgid "front port template" +msgstr "ön bağlantı noktası şablonu" + +#: dcim/models/device_component_templates.py:526 +msgid "front port templates" +msgstr "ön bağlantı noktası şablonları" + +#: dcim/models/device_component_templates.py:536 +#, python-brace-format +msgid "Rear port ({name}) must belong to the same device type" +msgstr "Arka bağlantı noktası ({name}) aynı cihaz türüne ait olmalıdır" + +#: dcim/models/device_component_templates.py:542 +#, python-brace-format +msgid "" +"Invalid rear port position ({position}); rear port {name} has only {count} " +"positions" +msgstr "" +"Geçersiz arka bağlantı noktası konumu ({position}); arka bağlantı noktası " +"{name} sadece var {count} pozisyonlar" + +#: dcim/models/device_component_templates.py:595 +#: dcim/models/device_components.py:1054 +msgid "positions" +msgstr "pozisyonlar" + +#: dcim/models/device_component_templates.py:606 +msgid "rear port template" +msgstr "arka bağlantı noktası şablonu" + +#: dcim/models/device_component_templates.py:607 +msgid "rear port templates" +msgstr "arka bağlantı noktası şablonları" + +#: dcim/models/device_component_templates.py:636 +#: dcim/models/device_components.py:1095 +msgid "position" +msgstr "pozisyon" + +#: dcim/models/device_component_templates.py:639 +#: dcim/models/device_components.py:1098 +msgid "Identifier to reference when renaming installed components" +msgstr "Yüklü bileşenleri yeniden adlandırırken başvurulacak tanımlayıcı" + +#: dcim/models/device_component_templates.py:645 +msgid "module bay template" +msgstr "modül bölmesi şablonu" + +#: dcim/models/device_component_templates.py:646 +msgid "module bay templates" +msgstr "modül bölmesi şablonları" + +#: dcim/models/device_component_templates.py:673 +msgid "device bay template" +msgstr "cihaz yuvası şablonu" + +#: dcim/models/device_component_templates.py:674 +msgid "device bay templates" +msgstr "cihaz yuvası şablonları" + +#: dcim/models/device_component_templates.py:687 +#, python-brace-format +msgid "" +"Subdevice role of device type ({device_type}) must be set to \"parent\" to " +"allow device bays." +msgstr "" +"Aygıt türünün alt cihaz rolü ({device_type}) cihaz bölmelerine izin vermek " +"için “ebeveyn” olarak ayarlanmalıdır." + +#: dcim/models/device_component_templates.py:742 +#: dcim/models/device_components.py:1224 +msgid "part ID" +msgstr "parça kimliği" + +#: dcim/models/device_component_templates.py:744 +#: dcim/models/device_components.py:1226 +msgid "Manufacturer-assigned part identifier" +msgstr "Üretici tarafından atanan parça tanımlayıcısı" + +#: dcim/models/device_component_templates.py:761 +msgid "inventory item template" +msgstr "envanter öğesi şablonu" + +#: dcim/models/device_component_templates.py:762 +msgid "inventory item templates" +msgstr "envanter öğe şablonları" + +#: dcim/models/device_components.py:106 +msgid "Components cannot be moved to a different device." +msgstr "Bileşenler farklı bir cihaza taşınamaz." + +#: dcim/models/device_components.py:145 +msgid "cable end" +msgstr "kablo ucu" + +#: dcim/models/device_components.py:151 +msgid "mark connected" +msgstr "bağlı olarak işaretle" + +#: dcim/models/device_components.py:153 +msgid "Treat as if a cable is connected" +msgstr "Bir kablo bağlıymış gibi davranın" + +#: dcim/models/device_components.py:171 +msgid "Must specify cable end (A or B) when attaching a cable." +msgstr "Kablo takarken kablo ucunu (A veya B) belirtmelisiniz." + +#: dcim/models/device_components.py:175 +msgid "Cable end must not be set without a cable." +msgstr "Kablo ucu kablo olmadan ayarlanmamalıdır." + +#: dcim/models/device_components.py:179 +msgid "Cannot mark as connected with a cable attached." +msgstr "Takılı bir kabloyla bağlı olarak işaretlenemiyor." + +#: dcim/models/device_components.py:203 +#, python-brace-format +msgid "{class_name} models must declare a parent_object property" +msgstr "{class_name} modeller bir parent_object özelliği bildirmelidir" + +#: dcim/models/device_components.py:288 dcim/models/device_components.py:317 +#: dcim/models/device_components.py:350 dcim/models/device_components.py:468 +msgid "Physical port type" +msgstr "Fiziksel bağlantı noktası tipi" + +#: dcim/models/device_components.py:291 dcim/models/device_components.py:320 +msgid "speed" +msgstr "sürat" + +#: dcim/models/device_components.py:295 dcim/models/device_components.py:324 +msgid "Port speed in bits per second" +msgstr "Saniyede bit cinsinden port hızı" + +#: dcim/models/device_components.py:301 +msgid "console port" +msgstr "konsol bağlantı noktası" + +#: dcim/models/device_components.py:302 +msgid "console ports" +msgstr "konsol bağlantı noktaları" + +#: dcim/models/device_components.py:330 +msgid "console server port" +msgstr "konsol sunucusu bağlantı noktası" + +#: dcim/models/device_components.py:331 +msgid "console server ports" +msgstr "konsol sunucusu bağlantı noktaları" + +#: dcim/models/device_components.py:370 +msgid "power port" +msgstr "güç bağlantı noktası" + +#: dcim/models/device_components.py:371 +msgid "power ports" +msgstr "güç bağlantı noktaları" + +#: dcim/models/device_components.py:488 +msgid "power outlet" +msgstr "elektrik prizi" + +#: dcim/models/device_components.py:489 +msgid "power outlets" +msgstr "elektrik prizleri" + +#: dcim/models/device_components.py:500 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device" +msgstr "Ana güç bağlantı noktası ({power_port}) aynı cihaza ait olmalıdır" + +#: dcim/models/device_components.py:531 vpn/models/crypto.py:81 +#: vpn/models/crypto.py:226 +msgid "mode" +msgstr "mod" + +#: dcim/models/device_components.py:535 +msgid "IEEE 802.1Q tagging strategy" +msgstr "IEEE 802.1Q etiketleme stratejisi" + +#: dcim/models/device_components.py:543 +msgid "parent interface" +msgstr "ebeveyn arabirimi" + +#: dcim/models/device_components.py:603 +msgid "parent LAG" +msgstr "ebeveyn LAG" + +#: dcim/models/device_components.py:613 +msgid "This interface is used only for out-of-band management" +msgstr "Bu arayüz yalnızca bant dışı yönetim için kullanılır" + +#: dcim/models/device_components.py:618 +msgid "speed (Kbps)" +msgstr "hız (Kbps)" + +#: dcim/models/device_components.py:621 +msgid "duplex" +msgstr "dubleks" + +#: dcim/models/device_components.py:631 +msgid "64-bit World Wide Name" +msgstr "64 bit Dünya Çapında Adı" + +#: dcim/models/device_components.py:643 +msgid "wireless channel" +msgstr "kablosuz kanal" + +#: dcim/models/device_components.py:650 +msgid "channel frequency (MHz)" +msgstr "kanal frekansı (MHz)" + +#: dcim/models/device_components.py:651 dcim/models/device_components.py:659 +msgid "Populated by selected channel (if set)" +msgstr "Seçilen kanala göre doldurulur (ayarlanmışsa)" + +#: dcim/models/device_components.py:665 +msgid "transmit power (dBm)" +msgstr "iletim gücü (dBm)" + +#: dcim/models/device_components.py:690 wireless/models.py:116 +msgid "wireless LANs" +msgstr "kablosuz LAN'lar" + +#: dcim/models/device_components.py:698 +#: virtualization/models/virtualmachines.py:328 +msgid "untagged VLAN" +msgstr "etiketsiz VLAN" + +#: dcim/models/device_components.py:704 +#: virtualization/models/virtualmachines.py:334 +msgid "tagged VLANs" +msgstr "etiketli VLAN'lar" + +#: dcim/models/device_components.py:746 +#: virtualization/models/virtualmachines.py:370 +msgid "interface" +msgstr "arayüz" + +#: dcim/models/device_components.py:747 +#: virtualization/models/virtualmachines.py:371 +msgid "interfaces" +msgstr "arayüzleri" + +#: dcim/models/device_components.py:758 +#, python-brace-format +msgid "{display_type} interfaces cannot have a cable attached." +msgstr "{display_type} arabirimlerde kablo takılı olamaz." + +#: dcim/models/device_components.py:766 +#, python-brace-format +msgid "{display_type} interfaces cannot be marked as connected." +msgstr "{display_type} arayüzler bağlı olarak işaretlenemez." + +#: dcim/models/device_components.py:775 +#: virtualization/models/virtualmachines.py:383 +msgid "An interface cannot be its own parent." +msgstr "Bir arayüz kendi ebeveyni olamaz." + +#: dcim/models/device_components.py:779 +msgid "Only virtual interfaces may be assigned to a parent interface." +msgstr "Bir üst arabirime yalnızca sanal arabirimler atanabilir." + +#: dcim/models/device_components.py:786 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to a different device " +"({device})" +msgstr "" +"Seçilen üst arabirim ({interface}) farklı bir cihaza aittir ({device})" + +#: dcim/models/device_components.py:792 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" +"Seçilen üst arabirim ({interface}) aittir {device}, sanal kasanın bir " +"parçası olmayan {virtual_chassis}." + +#: dcim/models/device_components.py:812 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different device " +"({device})." +msgstr "Seçilen köprü arayüzü ({bridge}) farklı bir cihaza aittir ({device})." + +#: dcim/models/device_components.py:818 +#, python-brace-format +msgid "" +"The selected bridge interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" +"Seçilen köprü arayüzü ({interface}) aittir {device}, sanal kasanın bir " +"parçası olmayan {virtual_chassis}." + +#: dcim/models/device_components.py:829 +msgid "Virtual interfaces cannot have a parent LAG interface." +msgstr "Sanal arabirimlerin üst LAG arabirimi olamaz." + +#: dcim/models/device_components.py:833 +msgid "A LAG interface cannot be its own parent." +msgstr "Bir LAG arabirimi kendi ana arabirimi olamaz." + +#: dcim/models/device_components.py:840 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to a different device ({device})." +msgstr "Seçilen LAG arayüzü ({lag}) farklı bir cihaza aittir ({device})." + +#: dcim/models/device_components.py:846 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to {device}, which is not part of" +" virtual chassis {virtual_chassis}." +msgstr "" +"Seçilen LAG arayüzü ({lag}) aittir {device}, sanal kasanın bir parçası " +"olmayan {virtual_chassis}." + +#: dcim/models/device_components.py:857 +msgid "Virtual interfaces cannot have a PoE mode." +msgstr "Sanal arabirimler PoE moduna sahip olamaz." + +#: dcim/models/device_components.py:861 +msgid "Virtual interfaces cannot have a PoE type." +msgstr "Sanal arabirimler PoE tipine sahip olamaz." + +#: dcim/models/device_components.py:867 +msgid "Must specify PoE mode when designating a PoE type." +msgstr "Bir PoE türü belirlerken PoE modunu belirtmelisiniz." + +#: dcim/models/device_components.py:874 +msgid "Wireless role may be set only on wireless interfaces." +msgstr "Kablosuz rolü yalnızca kablosuz arayüzlerde ayarlanabilir." + +#: dcim/models/device_components.py:876 +msgid "Channel may be set only on wireless interfaces." +msgstr "Kanal sadece kablosuz arayüzlerde ayarlanabilir." + +#: dcim/models/device_components.py:882 +msgid "Channel frequency may be set only on wireless interfaces." +msgstr "Kanal frekansı yalnızca kablosuz arayüzlerde ayarlanabilir." + +#: dcim/models/device_components.py:886 +msgid "Cannot specify custom frequency with channel selected." +msgstr "Seçili kanal ile özel frekans belirlenemiyor." + +#: dcim/models/device_components.py:892 +msgid "Channel width may be set only on wireless interfaces." +msgstr "Kanal genişliği yalnızca kablosuz arayüzlerde ayarlanabilir." + +#: dcim/models/device_components.py:894 +msgid "Cannot specify custom width with channel selected." +msgstr "Seçili kanal ile özel genişlik belirlenemiyor." + +#: dcim/models/device_components.py:902 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent device, or it must be global." +msgstr "" +"Etiketlenmemiş VLAN ({untagged_vlan}) arayüzün ana cihazıyla aynı siteye ait" +" olmalı veya global olmalıdır." + +#: dcim/models/device_components.py:991 +msgid "Mapped position on corresponding rear port" +msgstr "İlgili arka bağlantı noktasında eşlenmiş konum" + +#: dcim/models/device_components.py:1007 +msgid "front port" +msgstr "ön bağlantı noktası" + +#: dcim/models/device_components.py:1008 +msgid "front ports" +msgstr "ön bağlantı noktaları" + +#: dcim/models/device_components.py:1022 +#, python-brace-format +msgid "Rear port ({rear_port}) must belong to the same device" +msgstr "Arka bağlantı noktası ({rear_port}) aynı cihaza ait olmalıdır" + +#: dcim/models/device_components.py:1030 +#, python-brace-format +msgid "" +"Invalid rear port position ({rear_port_position}): Rear port {name} has only" +" {positions} positions." +msgstr "" +"Geçersiz arka bağlantı noktası konumu ({rear_port_position}): Arka bağlantı " +"noktası {name} sadece var {positions} pozisyonları." + +#: dcim/models/device_components.py:1060 +msgid "Number of front ports which may be mapped" +msgstr "Eşlenebilecek ön bağlantı noktalarının sayısı" + +#: dcim/models/device_components.py:1065 +msgid "rear port" +msgstr "arka bağlantı noktası" + +#: dcim/models/device_components.py:1066 +msgid "rear ports" +msgstr "arka bağlantı noktaları" + +#: dcim/models/device_components.py:1080 +#, python-brace-format +msgid "" +"The number of positions cannot be less than the number of mapped front ports" +" ({frontport_count})" +msgstr "" +"Konum sayısı, eşlenen ön bağlantı noktalarının sayısından az olamaz " +"({frontport_count})" + +#: dcim/models/device_components.py:1104 +msgid "module bay" +msgstr "modül yuvası" + +#: dcim/models/device_components.py:1105 +msgid "module bays" +msgstr "modül bölmeleri" + +#: dcim/models/device_components.py:1126 +msgid "device bay" +msgstr "cihaz yuvası" + +#: dcim/models/device_components.py:1127 +msgid "device bays" +msgstr "cihaz yuvaları" + +#: dcim/models/device_components.py:1137 +#, python-brace-format +msgid "This type of device ({device_type}) does not support device bays." +msgstr "Bu tür bir cihaz ({device_type}) cihaz bölmelerini desteklemez." + +#: dcim/models/device_components.py:1143 +msgid "Cannot install a device into itself." +msgstr "Bir aygıt kendi içine yüklenemiyor." + +#: dcim/models/device_components.py:1151 +#, python-brace-format +msgid "" +"Cannot install the specified device; device is already installed in {bay}." +msgstr "Belirtilen aygıt yüklenemiyor; cihaz zaten yüklü {bay}." + +#: dcim/models/device_components.py:1172 +msgid "inventory item role" +msgstr "envanter kalemi rolü" + +#: dcim/models/device_components.py:1173 +msgid "inventory item roles" +msgstr "envanter kalemi rolleri" + +#: dcim/models/device_components.py:1230 dcim/models/devices.py:595 +#: dcim/models/devices.py:1173 dcim/models/racks.py:113 +msgid "serial number" +msgstr "seri numarası" + +#: dcim/models/device_components.py:1238 dcim/models/devices.py:603 +#: dcim/models/devices.py:1180 dcim/models/racks.py:120 +msgid "asset tag" +msgstr "varlık etiketi" + +#: dcim/models/device_components.py:1239 +msgid "A unique tag used to identify this item" +msgstr "Bu öğeyi tanımlamak için kullanılan benzersiz bir etiket" + +#: dcim/models/device_components.py:1242 +msgid "discovered" +msgstr "keşfedilen" + +#: dcim/models/device_components.py:1244 +msgid "This item was automatically discovered" +msgstr "Bu öğe otomatik olarak keşfedildi" + +#: dcim/models/device_components.py:1262 +msgid "inventory item" +msgstr "envanter kalemi" + +#: dcim/models/device_components.py:1263 +msgid "inventory items" +msgstr "envanter kalemleri" + +#: dcim/models/device_components.py:1274 +msgid "Cannot assign self as parent." +msgstr "Kendisi ebeveyn olarak atanamıyor." + +#: dcim/models/device_components.py:1282 +msgid "Parent inventory item does not belong to the same device." +msgstr "Ana envanter kalemi aynı cihaza ait değildir." + +#: dcim/models/device_components.py:1288 +msgid "Cannot move an inventory item with dependent children" +msgstr "Bağımlı çocuklarla bir envanter öğesi taşınamıyor" + +#: dcim/models/device_components.py:1296 +msgid "Cannot assign inventory item to component on another device" +msgstr "Başka bir cihazdaki bileşene envanter öğesi atanamıyor" + +#: dcim/models/devices.py:54 +msgid "manufacturer" +msgstr "üretici firma" + +#: dcim/models/devices.py:55 +msgid "manufacturers" +msgstr "üreticiler" + +#: dcim/models/devices.py:82 dcim/models/devices.py:381 +msgid "model" +msgstr "model" + +#: dcim/models/devices.py:95 +msgid "default platform" +msgstr "varsayılan platform" + +#: dcim/models/devices.py:98 dcim/models/devices.py:385 +msgid "part number" +msgstr "parça numarası" + +#: dcim/models/devices.py:101 dcim/models/devices.py:388 +msgid "Discrete part number (optional)" +msgstr "Ayrık parça numarası (isteğe bağlı)" + +#: dcim/models/devices.py:107 dcim/models/racks.py:137 +msgid "height (U)" +msgstr "yükseklik (U)" + +#: dcim/models/devices.py:111 +msgid "exclude from utilization" +msgstr "kullanımdan hariç tut" + +#: dcim/models/devices.py:112 +msgid "Devices of this type are excluded when calculating rack utilization." +msgstr "Raf kullanımı hesaplanırken bu tip cihazlar hariç tutulur." + +#: dcim/models/devices.py:116 +msgid "is full depth" +msgstr "tam derinliktir" + +#: dcim/models/devices.py:117 +msgid "Device consumes both front and rear rack faces." +msgstr "Cihaz hem ön hem de arka raf yüzlerini tüketir." + +#: dcim/models/devices.py:123 +msgid "parent/child status" +msgstr "ebeveyn/çocuk durumu" + +#: dcim/models/devices.py:124 +msgid "" +"Parent devices house child devices in device bays. Leave blank if this " +"device type is neither a parent nor a child." +msgstr "" +"Ana cihazlar, alt aygıtları cihaz yuvalarında barındırır. Bu cihaz türü " +"ebeveyn veya çocuk değilse boş bırakın." + +#: dcim/models/devices.py:128 dcim/models/devices.py:647 +msgid "airflow" +msgstr "hava akımı" + +#: dcim/models/devices.py:204 +msgid "device type" +msgstr "cihaz tipi" + +#: dcim/models/devices.py:205 +msgid "device types" +msgstr "cihaz türleri" + +#: dcim/models/devices.py:289 +msgid "U height must be in increments of 0.5 rack units." +msgstr "U yüksekliği 0,5 raf ünitesi artışlarla olmalıdır." + +#: dcim/models/devices.py:306 +#, python-brace-format +msgid "" +"Device {device} in rack {rack} does not have sufficient space to accommodate" +" a height of {height}U" +msgstr "" +"Cihaz {device} rafta {rack} bir yüksekliği barındırmak için yeterli alana " +"sahip değildir {height}U" + +#: dcim/models/devices.py:321 +#, python-brace-format +msgid "" +"Unable to set 0U height: Found {racked_instance_count} " +"instances already mounted within racks." +msgstr "" +"0U yüksekliği ayarlanamıyor: Bulundu {racked_instance_count} örnekler zaten raflara monte " +"edilmiştir." + +#: dcim/models/devices.py:330 +msgid "" +"Must delete all device bay templates associated with this device before " +"declassifying it as a parent device." +msgstr "" +"Ana aygıt olarak sınıflandırmadan önce bu aygıtla ilişkili tüm aygıt yuvası " +"şablonlarını silmeniz gerekir." + +#: dcim/models/devices.py:336 +msgid "Child device types must be 0U." +msgstr "Çocuk cihaz türleri 0U olmalıdır." + +#: dcim/models/devices.py:404 +msgid "module type" +msgstr "modül tipi" + +#: dcim/models/devices.py:405 +msgid "module types" +msgstr "modül türleri" + +#: dcim/models/devices.py:473 +msgid "Virtual machines may be assigned to this role" +msgstr "Sanal makineler bu role atanabilir" + +#: dcim/models/devices.py:485 +msgid "device role" +msgstr "cihaz rolü" + +#: dcim/models/devices.py:486 +msgid "device roles" +msgstr "cihaz rolleri" + +#: dcim/models/devices.py:503 +msgid "Optionally limit this platform to devices of a certain manufacturer" +msgstr "" +"İsteğe bağlı olarak bu platformu belirli bir üreticinin cihazlarıyla " +"sınırlayın" + +#: dcim/models/devices.py:515 +msgid "platform" +msgstr "platform" + +#: dcim/models/devices.py:516 +msgid "platforms" +msgstr "platformlar" + +#: dcim/models/devices.py:564 +msgid "The function this device serves" +msgstr "Bu cihazın hizmet ettiği işlev" + +#: dcim/models/devices.py:596 +msgid "Chassis serial number, assigned by the manufacturer" +msgstr "Üretici tarafından atanan şasi seri numarası" + +#: dcim/models/devices.py:604 dcim/models/devices.py:1181 +msgid "A unique tag used to identify this device" +msgstr "Bu cihazı tanımlamak için kullanılan benzersiz bir etiket" + +#: dcim/models/devices.py:631 +msgid "position (U)" +msgstr "pozisyon (U)" + +#: dcim/models/devices.py:638 +msgid "rack face" +msgstr "raf yüzü" + +#: dcim/models/devices.py:658 dcim/models/devices.py:1390 +#: virtualization/models/virtualmachines.py:98 +msgid "primary IPv4" +msgstr "birincil IPv4" + +#: dcim/models/devices.py:666 dcim/models/devices.py:1398 +#: virtualization/models/virtualmachines.py:106 +msgid "primary IPv6" +msgstr "birincil IPv6" + +#: dcim/models/devices.py:674 +msgid "out-of-band IP" +msgstr "bant dışı IP" + +#: dcim/models/devices.py:691 +msgid "VC position" +msgstr "VC pozisyonu" + +#: dcim/models/devices.py:695 +msgid "Virtual chassis position" +msgstr "Sanal şasi konumu" + +#: dcim/models/devices.py:698 +msgid "VC priority" +msgstr "VC önceliği" + +#: dcim/models/devices.py:702 +msgid "Virtual chassis master election priority" +msgstr "Sanal şasi ana seçim önceliği" + +#: dcim/models/devices.py:705 dcim/models/sites.py:207 +msgid "latitude" +msgstr "enlem" + +#: dcim/models/devices.py:710 dcim/models/devices.py:718 +#: dcim/models/sites.py:212 dcim/models/sites.py:220 +msgid "GPS coordinate in decimal format (xx.yyyyyy)" +msgstr "Ondalık formatta GPS koordinatı (xx.yyyyyy)" + +#: dcim/models/devices.py:713 dcim/models/sites.py:215 +msgid "longitude" +msgstr "boylam" + +#: dcim/models/devices.py:786 +msgid "Device name must be unique per site." +msgstr "Cihaz adı site başına benzersiz olmalıdır." + +#: dcim/models/devices.py:797 ipam/models/services.py:75 +msgid "device" +msgstr "cihaz" + +#: dcim/models/devices.py:798 +msgid "devices" +msgstr "cihazlar" + +#: dcim/models/devices.py:838 +#, python-brace-format +msgid "Rack {rack} does not belong to site {site}." +msgstr "Raf {rack} siteye ait değil {site}." + +#: dcim/models/devices.py:843 +#, python-brace-format +msgid "Location {location} does not belong to site {site}." +msgstr "Yer {location} siteye ait değil {site}." + +#: dcim/models/devices.py:849 +#, python-brace-format +msgid "Rack {rack} does not belong to location {location}." +msgstr "Raf {rack} konuma ait değil {location}." + +#: dcim/models/devices.py:856 +msgid "Cannot select a rack face without assigning a rack." +msgstr "Bir raf atamadan raf yüzü seçilemez." + +#: dcim/models/devices.py:860 +msgid "Cannot select a rack position without assigning a rack." +msgstr "Bir raf atamadan raf konumu seçilemez." + +#: dcim/models/devices.py:866 +msgid "Position must be in increments of 0.5 rack units." +msgstr "Konum 0,5 raf ünitesinin artışlarında olmalıdır." + +#: dcim/models/devices.py:870 +msgid "Must specify rack face when defining rack position." +msgstr "Raf konumunu tanımlarken raf yüzü belirtilmelidir." + +#: dcim/models/devices.py:878 +#, python-brace-format +msgid "" +"A U0 device type ({device_type}) cannot be assigned to a rack position." +msgstr "Bir U0 cihaz türü ({device_type}) raf konumuna atanamaz." + +#: dcim/models/devices.py:889 +msgid "" +"Child device types cannot be assigned to a rack face. This is an attribute " +"of the parent device." +msgstr "" +"Alt aygıt türleri bir raf yüzüne atanamaz. Bu, ana cihazın bir özelliğidir." + +#: dcim/models/devices.py:896 +msgid "" +"Child device types cannot be assigned to a rack position. This is an " +"attribute of the parent device." +msgstr "" +"Alt aygıt türleri bir raf konumuna atanamaz. Bu, ana aygıtın bir " +"özelliğidir." + +#: dcim/models/devices.py:910 +#, python-brace-format +msgid "" +"U{position} is already occupied or does not have sufficient space to " +"accommodate this device type: {device_type} ({u_height}U)" +msgstr "" +"U{position} zaten işgal edilmiş veya bu cihaz tipini barındırmak için " +"yeterli alana sahip değil: {device_type} ({u_height}U)" + +#: dcim/models/devices.py:925 +#, python-brace-format +msgid "{ip} is not an IPv4 address." +msgstr "{ip} Bu bir IPv4 adresi değildir." + +#: dcim/models/devices.py:934 dcim/models/devices.py:949 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this device." +msgstr "Belirtilen IP adresi ({ip}) bu cihaza atanmamıştır." + +#: dcim/models/devices.py:940 +#, python-brace-format +msgid "{ip} is not an IPv6 address." +msgstr "{ip} Bu bir IPv6 adresi değildir." + +#: dcim/models/devices.py:967 +#, python-brace-format +msgid "" +"The assigned platform is limited to {platform_manufacturer} device types, " +"but this device's type belongs to {devicetype_manufacturer}." +msgstr "" +"Atanan platform aşağıdakilerle sınırlıdır {platform_manufacturer} cihaz " +"türleri, ancak bu cihazın türü şunlara aittir {devicetype_manufacturer}." + +#: dcim/models/devices.py:978 +#, python-brace-format +msgid "The assigned cluster belongs to a different site ({site})" +msgstr "Atanan küme farklı bir siteye aittir ({site})" + +#: dcim/models/devices.py:986 +msgid "A device assigned to a virtual chassis must have its position defined." +msgstr "Sanal bir kasaya atanan bir aygıtın konumu tanımlanmış olmalıdır." + +#: dcim/models/devices.py:1188 +msgid "module" +msgstr "modül" + +#: dcim/models/devices.py:1189 +msgid "modules" +msgstr "modülleri" + +#: dcim/models/devices.py:1205 +#, python-brace-format +msgid "" +"Module must be installed within a module bay belonging to the assigned " +"device ({device})." +msgstr "Modül, atanan cihaza ait bir modül bölmesine kurulmalıdır ({device})." + +#: dcim/models/devices.py:1309 +msgid "domain" +msgstr "domain" + +#: dcim/models/devices.py:1322 dcim/models/devices.py:1323 +msgid "virtual chassis" +msgstr "sanal kasa" + +#: dcim/models/devices.py:1338 +#, python-brace-format +msgid "" +"The selected master ({master}) is not assigned to this virtual chassis." +msgstr "Seçilen usta ({master}) bu sanal kasaya atanmamıştır." + +#: dcim/models/devices.py:1354 +#, python-brace-format +msgid "" +"Unable to delete virtual chassis {self}. There are member interfaces which " +"form a cross-chassis LAG interfaces." +msgstr "" +"Sanal kasa silinemiyor {self}. Çapraz şasi LAG arabirimleri oluşturan üye " +"arayüzleri vardır." + +#: dcim/models/devices.py:1379 vpn/models/l2vpn.py:37 +msgid "identifier" +msgstr "belirlemek" + +#: dcim/models/devices.py:1380 +msgid "Numeric identifier unique to the parent device" +msgstr "Ana aygıta benzersiz sayısal tanımlayıcı" + +#: dcim/models/devices.py:1408 extras/models/models.py:129 +#: extras/models/models.py:724 netbox/models/__init__.py:114 +msgid "comments" +msgstr "yorumlar" + +#: dcim/models/devices.py:1424 +msgid "virtual device context" +msgstr "sanal cihaz bağlamı" + +#: dcim/models/devices.py:1425 +msgid "virtual device contexts" +msgstr "sanal cihaz bağlamları" + +#: dcim/models/devices.py:1457 +#, python-brace-format +msgid "{ip} is not an IPv{family} address." +msgstr "{ip} IPV değil{family} adres." + +#: dcim/models/devices.py:1463 +msgid "Primary IP address must belong to an interface on the assigned device." +msgstr "Birincil IP adresi, atanan cihazdaki bir arayüze ait olmalıdır." + +#: dcim/models/mixins.py:15 extras/models/configs.py:41 +#: extras/models/models.py:343 extras/models/models.py:552 +#: extras/models/search.py:50 ipam/models/ip.py:193 +msgid "weight" +msgstr "ağırlık" + +#: dcim/models/mixins.py:22 +msgid "weight unit" +msgstr "ağırlık birimi" + +#: dcim/models/mixins.py:51 +msgid "Must specify a unit when setting a weight" +msgstr "Ağırlık ayarlarken bir birim belirtmelisiniz" + +#: dcim/models/power.py:55 +msgid "power panel" +msgstr "güç paneli" + +#: dcim/models/power.py:56 +msgid "power panels" +msgstr "güç panelleri" + +#: dcim/models/power.py:70 +#, python-brace-format +msgid "" +"Location {location} ({location_site}) is in a different site than {site}" +msgstr "Yer {location} ({location_site}) farklı bir sitede {site}" + +#: dcim/models/power.py:107 +msgid "supply" +msgstr "sağlamak" + +#: dcim/models/power.py:113 +msgid "phase" +msgstr "faz" + +#: dcim/models/power.py:119 +msgid "voltage" +msgstr "voltaj" + +#: dcim/models/power.py:124 +msgid "amperage" +msgstr "amper" + +#: dcim/models/power.py:129 +msgid "max utilization" +msgstr "maksimum kullanım" + +#: dcim/models/power.py:132 +msgid "Maximum permissible draw (percentage)" +msgstr "İzin verilen maksimum çekiliş (yüzde)" + +#: dcim/models/power.py:135 +msgid "available power" +msgstr "mevcut güç" + +#: dcim/models/power.py:163 +msgid "power feed" +msgstr "güç beslemesi" + +#: dcim/models/power.py:164 +msgid "power feeds" +msgstr "güç beslemeleri" + +#: dcim/models/power.py:178 +#, python-brace-format +msgid "" +"Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " +"are in different sites." +msgstr "" +"Raf {rack} ({rack_site}) ve güç paneli {powerpanel} ({powerpanel_site}) " +"farklı sitelerdedir." + +#: dcim/models/power.py:189 +msgid "Voltage cannot be negative for AC supply" +msgstr "AC beslemesi için voltaj negatif olamaz" + +#: dcim/models/racks.py:49 +msgid "rack role" +msgstr "raf rolü" + +#: dcim/models/racks.py:50 +msgid "rack roles" +msgstr "raf rolleri" + +#: dcim/models/racks.py:74 +msgid "facility ID" +msgstr "tesis kimliği" + +#: dcim/models/racks.py:75 +msgid "Locally-assigned identifier" +msgstr "Yerel olarak atanmış tanımlayıcı" + +#: dcim/models/racks.py:108 ipam/forms/bulk_import.py:200 +#: ipam/forms/bulk_import.py:265 ipam/forms/bulk_import.py:300 +#: ipam/forms/bulk_import.py:467 virtualization/forms/bulk_import.py:112 +msgid "Functional role" +msgstr "Fonksiyonel rol" + +#: dcim/models/racks.py:121 +msgid "A unique tag used to identify this rack" +msgstr "Bu rafı tanımlamak için kullanılan benzersiz bir etiket" + +#: dcim/models/racks.py:132 +msgid "width" +msgstr "genişlik" + +#: dcim/models/racks.py:133 +msgid "Rail-to-rail width" +msgstr "Ray-ray genişliği" + +#: dcim/models/racks.py:139 +msgid "Height in rack units" +msgstr "Raf ünitelerinde yükseklik" + +#: dcim/models/racks.py:143 +msgid "starting unit" +msgstr "başlangıç ünitesi" + +#: dcim/models/racks.py:145 +msgid "Starting unit for rack" +msgstr "Raf için başlangıç ünitesi" + +#: dcim/models/racks.py:149 +msgid "descending units" +msgstr "azalan birimler" + +#: dcim/models/racks.py:150 +msgid "Units are numbered top-to-bottom" +msgstr "Birimler yukarıdan aşağıya numaralandırılmıştır" + +#: dcim/models/racks.py:153 +msgid "outer width" +msgstr "dış genişlik" + +#: dcim/models/racks.py:156 +msgid "Outer dimension of rack (width)" +msgstr "Rafın dış boyutu (genişlik)" + +#: dcim/models/racks.py:159 +msgid "outer depth" +msgstr "dış derinlik" + +#: dcim/models/racks.py:162 +msgid "Outer dimension of rack (depth)" +msgstr "Rafın dış boyutu (derinlik)" + +#: dcim/models/racks.py:165 +msgid "outer unit" +msgstr "dış ünite" + +#: dcim/models/racks.py:171 +msgid "max weight" +msgstr "maksimum ağırlık" + +#: dcim/models/racks.py:174 +msgid "Maximum load capacity for the rack" +msgstr "Raf için maksimum yük kapasitesi" + +#: dcim/models/racks.py:182 +msgid "mounting depth" +msgstr "montaj derinliği" + +#: dcim/models/racks.py:186 +msgid "" +"Maximum depth of a mounted device, in millimeters. For four-post racks, this" +" is the distance between the front and rear rails." +msgstr "" +"Monte edilmiş bir cihazın milimetre cinsinden maksimum derinliği. Dört " +"direkli raflar için bu, ön ve arka raylar arasındaki mesafedir." + +#: dcim/models/racks.py:220 +msgid "rack" +msgstr "raf" + +#: dcim/models/racks.py:221 +msgid "racks" +msgstr "rafları" + +#: dcim/models/racks.py:236 +#, python-brace-format +msgid "Assigned location must belong to parent site ({site})." +msgstr "Atanan konum üst siteye ait olmalıdır ({site})." + +#: dcim/models/racks.py:240 +msgid "Must specify a unit when setting an outer width/depth" +msgstr "Dış genişlik/derinlik ayarlarken bir birim belirtmelidir" + +#: dcim/models/racks.py:244 +msgid "Must specify a unit when setting a maximum weight" +msgstr "Maksimum ağırlık ayarlarken bir birim belirtmelisiniz" + +#: dcim/models/racks.py:254 +#, python-brace-format +msgid "" +"Rack must be at least {min_height}U tall to house currently installed " +"devices." +msgstr "" +"Raf en az olmalıdır {min_height}Şu anda yüklü cihazları barındırmak için " +"yeterli." + +#: dcim/models/racks.py:261 +#, python-brace-format +msgid "" +"Rack unit numbering must begin at {position} or less to house currently " +"installed devices." +msgstr "" +"Raf ünitesi numaralandırması şu adreste başlamalıdır: {position} veya şu " +"anda yüklü cihazları barındırmak için daha az." + +#: dcim/models/racks.py:269 +#, python-brace-format +msgid "Location must be from the same site, {site}." +msgstr "Konum aynı siteden olmalı, {site}." + +#: dcim/models/racks.py:522 +msgid "units" +msgstr "birimler" + +#: dcim/models/racks.py:548 +msgid "rack reservation" +msgstr "raf rezervasyonu" + +#: dcim/models/racks.py:549 +msgid "rack reservations" +msgstr "raf rezervasyonları" + +#: dcim/models/racks.py:566 +#, python-brace-format +msgid "Invalid unit(s) for {height}U rack: {unit_list}" +msgstr "Geçersiz birim (ler) i {height}U rafı: {unit_list}" + +#: dcim/models/racks.py:579 +#, python-brace-format +msgid "The following units have already been reserved: {unit_list}" +msgstr "Aşağıdaki birimler zaten rezerve edilmiştir: {unit_list}" + +#: dcim/models/sites.py:49 +msgid "A top-level region with this name already exists." +msgstr "Bu ada sahip üst düzey bir bölge zaten var." + +#: dcim/models/sites.py:59 +msgid "A top-level region with this slug already exists." +msgstr "Bu sümüklü böceklerin bulunduğu üst düzey bir bölge zaten var." + +#: dcim/models/sites.py:62 +msgid "region" +msgstr "bölge" + +#: dcim/models/sites.py:63 +msgid "regions" +msgstr "yöreler" + +#: dcim/models/sites.py:102 +msgid "A top-level site group with this name already exists." +msgstr "Bu ada sahip üst düzey bir site grubu zaten var." + +#: dcim/models/sites.py:112 +msgid "A top-level site group with this slug already exists." +msgstr "Bu sümüklü böcek içeren üst düzey bir site grubu zaten var." + +#: dcim/models/sites.py:115 +msgid "site group" +msgstr "site grubu" + +#: dcim/models/sites.py:116 +msgid "site groups" +msgstr "site grupları" + +#: dcim/models/sites.py:141 +msgid "Full name of the site" +msgstr "Sitenin tam adı" + +#: dcim/models/sites.py:181 +msgid "facility" +msgstr "tesise" + +#: dcim/models/sites.py:184 +msgid "Local facility ID or description" +msgstr "Yerel tesis kimliği veya açıklaması" + +#: dcim/models/sites.py:195 +msgid "physical address" +msgstr "fiziksel adres" + +#: dcim/models/sites.py:198 +msgid "Physical location of the building" +msgstr "Binanın fiziksel konumu" + +#: dcim/models/sites.py:201 +msgid "shipping address" +msgstr "teslimat adresi" + +#: dcim/models/sites.py:204 +msgid "If different from the physical address" +msgstr "Fiziksel adresden farklıysa" + +#: dcim/models/sites.py:238 +msgid "site" +msgstr "sitesi" + +#: dcim/models/sites.py:239 +msgid "sites" +msgstr "siteler" + +#: dcim/models/sites.py:303 +msgid "A location with this name already exists within the specified site." +msgstr "Belirtilen sitede bu ada sahip bir konum zaten var." + +#: dcim/models/sites.py:313 +msgid "A location with this slug already exists within the specified site." +msgstr "Belirtilen sitede bu sümüklü böcek bulunan bir konum zaten var." + +#: dcim/models/sites.py:316 +msgid "location" +msgstr "konum" + +#: dcim/models/sites.py:317 +msgid "locations" +msgstr "konumları" + +#: dcim/models/sites.py:331 +#, python-brace-format +msgid "Parent location ({parent}) must belong to the same site ({site})." +msgstr "Ana konum ({parent}) aynı siteye ait olmalıdır ({site})." + +#: dcim/tables/cables.py:54 +msgid "Termination A" +msgstr "Fesih A" + +#: dcim/tables/cables.py:59 +msgid "Termination B" +msgstr "Sonlandırma B" + +#: dcim/tables/cables.py:65 wireless/tables/wirelesslink.py:22 +msgid "Device A" +msgstr "Cihaz A" + +#: dcim/tables/cables.py:71 wireless/tables/wirelesslink.py:31 +msgid "Device B" +msgstr "Cihaz B" + +#: dcim/tables/cables.py:77 +msgid "Location A" +msgstr "Konum A" + +#: dcim/tables/cables.py:83 +msgid "Location B" +msgstr "Konum B" + +#: dcim/tables/cables.py:89 +msgid "Rack A" +msgstr "Raf A" + +#: dcim/tables/cables.py:95 +msgid "Rack B" +msgstr "Raf B" + +#: dcim/tables/cables.py:101 +msgid "Site A" +msgstr "Site A" + +#: dcim/tables/cables.py:107 +msgid "Site B" +msgstr "B Sitesi" + +#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:18 +#: templates/dcim/consoleserverport.html:75 templates/dcim/frontport.html:119 +#: templates/dcim/inventoryitem_edit.html:39 +msgid "Console Port" +msgstr "Konsol Bağlantı Noktası" + +#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 +#: dcim/tables/connections.py:71 +#: templates/dcim/inc/connection_endpoints.html:16 +msgid "Reachable" +msgstr "Ulaşılabilir" + +#: dcim/tables/connections.py:46 dcim/tables/devices.py:524 +#: templates/dcim/inventoryitem_edit.html:64 +#: templates/dcim/poweroutlet.html:47 templates/dcim/powerport.html:18 +msgid "Power Port" +msgstr "Güç Bağlantı Noktası" + +#: dcim/tables/devices.py:94 dcim/tables/devices.py:139 +#: dcim/tables/racks.py:81 dcim/tables/sites.py:143 +#: netbox/navigation/menu.py:57 netbox/navigation/menu.py:61 +#: netbox/navigation/menu.py:63 virtualization/forms/model_forms.py:125 +#: virtualization/tables/clusters.py:83 virtualization/views.py:211 +msgid "Devices" +msgstr "Aygıtlar" + +#: dcim/tables/devices.py:99 dcim/tables/devices.py:144 +#: virtualization/tables/clusters.py:88 +msgid "VMs" +msgstr "Sanal Makineler" + +#: dcim/tables/devices.py:133 dcim/tables/devices.py:245 +#: extras/forms/model_forms.py:513 templates/dcim/device.html:114 +#: templates/dcim/device/render_config.html:11 +#: templates/dcim/device/render_config.html:15 +#: templates/dcim/devicerole.html:47 templates/dcim/platform.html:44 +#: templates/extras/configtemplate.html:10 +#: templates/virtualization/virtualmachine.html:47 +#: templates/virtualization/virtualmachine/render_config.html:11 +#: templates/virtualization/virtualmachine/render_config.html:15 +#: virtualization/tables/virtualmachines.py:93 +msgid "Config Template" +msgstr "Yapılandırma Şablonu" + +#: dcim/tables/devices.py:216 dcim/tables/devices.py:1069 +#: ipam/forms/bulk_import.py:511 ipam/forms/model_forms.py:296 +#: ipam/tables/ip.py:352 ipam/tables/ip.py:418 ipam/tables/ip.py:441 +#: templates/ipam/ipaddress.html:12 templates/ipam/ipaddress_edit.html:14 +#: virtualization/tables/virtualmachines.py:81 +msgid "IP Address" +msgstr "IP Adresi" + +#: dcim/tables/devices.py:220 dcim/tables/devices.py:1073 +#: virtualization/tables/virtualmachines.py:72 +msgid "IPv4 Address" +msgstr "IPv4 Adresi" + +#: dcim/tables/devices.py:224 dcim/tables/devices.py:1077 +#: virtualization/tables/virtualmachines.py:76 +msgid "IPv6 Address" +msgstr "IPv6 Adresi" + +#: dcim/tables/devices.py:239 +msgid "VC Position" +msgstr "VC Pozisyonu" + +#: dcim/tables/devices.py:242 +msgid "VC Priority" +msgstr "VC Önceliği" + +#: dcim/tables/devices.py:249 templates/dcim/device_edit.html:38 +#: templates/dcim/devicebay_populate.html:16 +msgid "Parent Device" +msgstr "Ebeveyn Aygıtı" + +#: dcim/tables/devices.py:254 +msgid "Position (Device Bay)" +msgstr "Konum (Cihaz Yuvası)" + +#: dcim/tables/devices.py:263 +msgid "Console ports" +msgstr "Konsol bağlantı noktaları" + +#: dcim/tables/devices.py:266 +msgid "Console server ports" +msgstr "Konsol sunucusu bağlantı noktaları" + +#: dcim/tables/devices.py:269 +msgid "Power ports" +msgstr "Güç bağlantı noktaları" + +#: dcim/tables/devices.py:272 +msgid "Power outlets" +msgstr "Elektrik prizleri" + +#: dcim/tables/devices.py:275 dcim/tables/devices.py:1082 +#: dcim/tables/devicetypes.py:125 dcim/views.py:1001 dcim/views.py:1240 +#: dcim/views.py:1926 netbox/navigation/menu.py:82 +#: netbox/navigation/menu.py:238 templates/dcim/device/base.html:37 +#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 +#: templates/dcim/module.html:34 templates/dcim/moduletype/base.html:34 +#: templates/dcim/virtualdevicecontext.html:64 +#: templates/dcim/virtualdevicecontext.html:85 +#: templates/virtualization/virtualmachine/base.html:27 +#: templates/virtualization/virtualmachine_list.html:14 +#: virtualization/tables/virtualmachines.py:87 virtualization/views.py:368 +#: wireless/tables/wirelesslan.py:55 +msgid "Interfaces" +msgstr "Arayüzler" + +#: dcim/tables/devices.py:278 +msgid "Front ports" +msgstr "Ön bağlantı noktaları" + +#: dcim/tables/devices.py:284 +msgid "Device bays" +msgstr "Cihaz yuvaları" + +#: dcim/tables/devices.py:287 +msgid "Module bays" +msgstr "Modül bölmeleri" + +#: dcim/tables/devices.py:290 +msgid "Inventory items" +msgstr "Envanter kalemleri" + +#: dcim/tables/devices.py:329 dcim/tables/modules.py:56 +#: templates/dcim/modulebay.html:17 +msgid "Module Bay" +msgstr "Modül Yuvası" + +#: dcim/tables/devices.py:350 +msgid "Cable Color" +msgstr "Kablo Rengi" + +#: dcim/tables/devices.py:356 +msgid "Link Peers" +msgstr "Meslektaşları Bağla" + +#: dcim/tables/devices.py:359 +msgid "Mark Connected" +msgstr "Bağlı İşaretle" + +#: dcim/tables/devices.py:470 +msgid "Maximum draw (W)" +msgstr "Maksimum çekim (W)" + +#: dcim/tables/devices.py:473 +msgid "Allocated draw (W)" +msgstr "Tahsis edilen çekiliş (W)" + +#: dcim/tables/devices.py:573 ipam/forms/model_forms.py:707 +#: ipam/tables/fhrp.py:28 ipam/views.py:597 ipam/views.py:691 +#: netbox/navigation/menu.py:146 netbox/navigation/menu.py:148 +#: templates/dcim/interface.html:351 templates/ipam/ipaddress_bulk_add.html:15 +#: templates/ipam/service.html:43 templates/virtualization/vminterface.html:88 +#: vpn/tables/tunnels.py:94 +msgid "IP Addresses" +msgstr "IP Adresleri" + +#: dcim/tables/devices.py:579 netbox/navigation/menu.py:190 +#: templates/ipam/inc/panels/fhrp_groups.html:5 +msgid "FHRP Groups" +msgstr "FHRP Grupları" + +#: dcim/tables/devices.py:591 templates/dcim/interface.html:90 +#: templates/virtualization/vminterface.html:70 templates/vpn/tunnel.html:18 +#: templates/vpn/tunneltermination.html:14 vpn/forms/bulk_edit.py:75 +#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:41 +#: vpn/forms/filtersets.py:81 vpn/forms/model_forms.py:59 +#: vpn/forms/model_forms.py:144 vpn/tables/tunnels.py:74 +msgid "Tunnel" +msgstr "Tünel" + +#: dcim/tables/devices.py:616 dcim/tables/devicetypes.py:224 +#: templates/dcim/interface.html:66 +msgid "Management Only" +msgstr "Yalnızca Yönetim" + +#: dcim/tables/devices.py:624 +msgid "Wireless link" +msgstr "Kablosuz bağlantı" + +#: dcim/tables/devices.py:634 +msgid "VDCs" +msgstr "VDC'ler" + +#: dcim/tables/devices.py:642 dcim/tables/devicetypes.py:48 +#: dcim/tables/devicetypes.py:140 dcim/views.py:1076 dcim/views.py:2019 +#: netbox/navigation/menu.py:91 templates/dcim/device/base.html:52 +#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 +#: templates/dcim/inc/panels/inventory_items.html:5 +#: templates/dcim/inventoryitemrole.html:33 +msgid "Inventory Items" +msgstr "Envanter Öğeleri" + +#: dcim/tables/devices.py:723 +#: templates/circuits/inc/circuit_termination.html:80 +#: templates/dcim/consoleport.html:81 templates/dcim/consoleserverport.html:81 +#: templates/dcim/frontport.html:53 templates/dcim/frontport.html:125 +#: templates/dcim/interface.html:196 templates/dcim/inventoryitem_edit.html:69 +#: templates/dcim/rearport.html:18 templates/dcim/rearport.html:115 +msgid "Rear Port" +msgstr "Arka Bağlantı Noktası" + +#: dcim/tables/devices.py:888 templates/dcim/modulebay.html:51 +msgid "Installed Module" +msgstr "Yüklü Modül" + +#: dcim/tables/devices.py:891 +msgid "Module Serial" +msgstr "Modül Seri" + +#: dcim/tables/devices.py:895 +msgid "Module Asset Tag" +msgstr "Modül Varlık Etiketi" + +#: dcim/tables/devices.py:904 +msgid "Module Status" +msgstr "Modül Durumu" + +#: dcim/tables/devices.py:946 dcim/tables/devicetypes.py:308 +#: templates/dcim/inventoryitem.html:41 +msgid "Component" +msgstr "Bileşen" + +#: dcim/tables/devices.py:1001 +msgid "Items" +msgstr "Öğeler" + +#: dcim/tables/devicetypes.py:38 netbox/navigation/menu.py:72 +#: netbox/navigation/menu.py:74 +msgid "Device Types" +msgstr "Cihaz Türleri" + +#: dcim/tables/devicetypes.py:43 netbox/navigation/menu.py:75 +msgid "Module Types" +msgstr "Modül Çeşitleri" + +#: dcim/tables/devicetypes.py:53 extras/forms/filtersets.py:379 +#: extras/forms/model_forms.py:421 netbox/navigation/menu.py:66 +msgid "Platforms" +msgstr "Platformlar" + +#: dcim/tables/devicetypes.py:85 templates/dcim/devicetype.html:32 +msgid "Default Platform" +msgstr "Varsayılan Platform" + +#: dcim/tables/devicetypes.py:89 templates/dcim/devicetype.html:48 +msgid "Full Depth" +msgstr "Tam Derinlik" + +#: dcim/tables/devicetypes.py:98 +msgid "U Height" +msgstr "U Yüksekliği" + +#: dcim/tables/devicetypes.py:110 dcim/tables/modules.py:26 +msgid "Instances" +msgstr "Örnekler" + +#: dcim/tables/devicetypes.py:113 dcim/views.py:941 dcim/views.py:1180 +#: dcim/views.py:1866 netbox/navigation/menu.py:85 +#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 +#: templates/dcim/devicetype/base.html:22 templates/dcim/module.html:22 +#: templates/dcim/moduletype/base.html:22 +msgid "Console Ports" +msgstr "Konsol Bağlantı Noktaları" + +#: dcim/tables/devicetypes.py:116 dcim/views.py:956 dcim/views.py:1195 +#: dcim/views.py:1881 netbox/navigation/menu.py:86 +#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 +#: templates/dcim/devicetype/base.html:25 templates/dcim/module.html:25 +#: templates/dcim/moduletype/base.html:25 +msgid "Console Server Ports" +msgstr "Konsol Sunucusu Bağlantı Noktaları" + +#: dcim/tables/devicetypes.py:119 dcim/views.py:971 dcim/views.py:1210 +#: dcim/views.py:1896 netbox/navigation/menu.py:87 +#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 +#: templates/dcim/devicetype/base.html:28 templates/dcim/module.html:28 +#: templates/dcim/moduletype/base.html:28 +msgid "Power Ports" +msgstr "Güç Bağlantı Noktaları" + +#: dcim/tables/devicetypes.py:122 dcim/views.py:986 dcim/views.py:1225 +#: dcim/views.py:1911 netbox/navigation/menu.py:88 +#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 +#: templates/dcim/devicetype/base.html:31 templates/dcim/module.html:31 +#: templates/dcim/moduletype/base.html:31 +msgid "Power Outlets" +msgstr "Elektrik Prizleri" + +#: dcim/tables/devicetypes.py:128 dcim/views.py:1016 dcim/views.py:1255 +#: dcim/views.py:1947 netbox/navigation/menu.py:83 +#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 +#: templates/dcim/module.html:37 templates/dcim/moduletype/base.html:37 +msgid "Front Ports" +msgstr "Ön Bağlantı Noktaları" + +#: dcim/tables/devicetypes.py:131 dcim/views.py:1031 dcim/views.py:1270 +#: dcim/views.py:1962 netbox/navigation/menu.py:84 +#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 +#: templates/dcim/devicetype/base.html:40 templates/dcim/module.html:40 +#: templates/dcim/moduletype/base.html:40 +msgid "Rear Ports" +msgstr "Arka Bağlantı Noktaları" + +#: dcim/tables/devicetypes.py:134 dcim/views.py:1061 dcim/views.py:2000 +#: netbox/navigation/menu.py:90 templates/dcim/device/base.html:49 +#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +msgid "Device Bays" +msgstr "Cihaz Yuvaları" + +#: dcim/tables/devicetypes.py:137 dcim/views.py:1046 dcim/views.py:1981 +#: netbox/navigation/menu.py:89 templates/dcim/device/base.html:46 +#: templates/dcim/device_list.html:64 templates/dcim/devicetype/base.html:43 +msgid "Module Bays" +msgstr "Modül Bölmeleri" + +#: dcim/tables/power.py:36 netbox/navigation/menu.py:282 +#: templates/core/configrevision.html:59 templates/dcim/powerpanel.html:53 +msgid "Power Feeds" +msgstr "Güç Beslemeleri" + +#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:106 +msgid "Max Utilization" +msgstr "Maksimum Kullanım" + +#: dcim/tables/power.py:84 +msgid "Available Power (VA)" +msgstr "Kullanılabilir Güç (VA)" + +#: dcim/tables/racks.py:29 dcim/tables/sites.py:138 +#: netbox/navigation/menu.py:25 netbox/navigation/menu.py:27 +msgid "Racks" +msgstr "Raflar" + +#: dcim/tables/racks.py:73 templates/dcim/device.html:323 +#: templates/dcim/rack.html:95 +msgid "Height" +msgstr "Yükseklik" + +#: dcim/tables/racks.py:85 +msgid "Space" +msgstr "Uzay" + +#: dcim/tables/racks.py:96 templates/dcim/rack.html:105 +msgid "Outer Width" +msgstr "Dış genişlik" + +#: dcim/tables/racks.py:100 templates/dcim/rack.html:115 +msgid "Outer Depth" +msgstr "Dış Derinlik" + +#: dcim/tables/racks.py:108 +msgid "Max Weight" +msgstr "Maksimum Ağırlık" + +#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 +#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:401 +#: ipam/forms/bulk_edit.py:128 ipam/forms/model_forms.py:152 +#: ipam/tables/asn.py:66 netbox/navigation/menu.py:16 +#: netbox/navigation/menu.py:18 +msgid "Sites" +msgstr "Siteler" + +#: dcim/views.py:131 +#, python-brace-format +msgid "Disconnected {count} {type}" +msgstr "Bağlantısı kesildi {count} {type}" + +#: dcim/views.py:692 netbox/navigation/menu.py:29 +msgid "Reservations" +msgstr "Rezervasyon" + +#: dcim/views.py:710 +msgid "Non-Racked Devices" +msgstr "Raf Olmayan Cihazlar" + +#: dcim/views.py:2032 extras/forms/model_forms.py:461 +#: templates/extras/configcontext.html:10 +#: virtualization/forms/model_forms.py:228 virtualization/views.py:408 +msgid "Config Context" +msgstr "Yapılandırma Bağlamı" + +#: dcim/views.py:2042 virtualization/views.py:418 +msgid "Render Config" +msgstr "Oluştur Yapılandırması" + +#: dcim/views.py:2970 ipam/tables/ip.py:233 +msgid "Children" +msgstr "Çocuklar" + +#: extras/choices.py:27 extras/forms/misc.py:14 +msgid "Text" +msgstr "Metin" + +#: extras/choices.py:28 +msgid "Text (long)" +msgstr "Metin (uzun)" + +#: extras/choices.py:29 +msgid "Integer" +msgstr "Tamsayı" + +#: extras/choices.py:30 +msgid "Decimal" +msgstr "Ondalık" + +#: extras/choices.py:31 +msgid "Boolean (true/false)" +msgstr "Boolean (doğru/yanlış)" + +#: extras/choices.py:32 +msgid "Date" +msgstr "TARİH" + +#: extras/choices.py:33 +msgid "Date & time" +msgstr "Tarih ve saat" + +#: extras/choices.py:35 +msgid "JSON" +msgstr "JSON" + +#: extras/choices.py:36 +msgid "Selection" +msgstr "Seçim" + +#: extras/choices.py:37 +msgid "Multiple selection" +msgstr "Çoklu seçim" + +#: extras/choices.py:39 +msgid "Multiple objects" +msgstr "Birden çok nesne" + +#: extras/choices.py:50 templates/extras/customfield.html:69 vpn/choices.py:20 +#: wireless/choices.py:27 +msgid "Disabled" +msgstr "Engelli" + +#: extras/choices.py:51 +msgid "Loose" +msgstr "Gevşek" + +#: extras/choices.py:52 +msgid "Exact" +msgstr "Kesin" + +#: extras/choices.py:63 +msgid "Always" +msgstr "Her zaman" + +#: extras/choices.py:64 +msgid "If set" +msgstr "Ayarlanmışsa" + +#: extras/choices.py:65 extras/choices.py:78 +msgid "Hidden" +msgstr "Gizli" + +#: extras/choices.py:76 +msgid "Yes" +msgstr "Evet" + +#: extras/choices.py:77 +msgid "No" +msgstr "Hayır" + +#: extras/choices.py:105 templates/tenancy/contact.html:58 +#: tenancy/forms/bulk_edit.py:117 wireless/forms/model_forms.py:159 +msgid "Link" +msgstr "Bağlantı" + +#: extras/choices.py:119 +msgid "Newest" +msgstr "En yeni" + +#: extras/choices.py:120 +msgid "Oldest" +msgstr "En eski" + +#: extras/choices.py:136 templates/generic/object.html:51 +msgid "Updated" +msgstr "Güncellendi" + +#: extras/choices.py:137 +msgid "Deleted" +msgstr "Silinmiş" + +#: extras/choices.py:154 extras/choices.py:176 +msgid "Info" +msgstr "Bilgi" + +#: extras/choices.py:155 extras/choices.py:175 +msgid "Success" +msgstr "Başarı" + +#: extras/choices.py:156 extras/choices.py:177 +msgid "Warning" +msgstr "Uyarı" + +#: extras/choices.py:157 +msgid "Danger" +msgstr "Tehlike" + +#: extras/choices.py:174 utilities/choices.py:190 +msgid "Default" +msgstr "Varsayılan" + +#: extras/choices.py:178 +msgid "Failure" +msgstr "Başarısızlık" + +#: extras/choices.py:185 +msgid "Hourly" +msgstr "Saatlik" + +#: extras/choices.py:186 +msgid "12 hours" +msgstr "12 saat" + +#: extras/choices.py:187 +msgid "Daily" +msgstr "Günlük" + +#: extras/choices.py:188 +msgid "Weekly" +msgstr "Haftalık" + +#: extras/choices.py:189 +msgid "30 days" +msgstr "30 gün" + +#: extras/choices.py:254 extras/tables/tables.py:291 +#: templates/dcim/virtualchassis_edit.html:108 +#: templates/extras/eventrule.html:51 +#: templates/generic/bulk_add_component.html:56 +#: templates/generic/object_edit.html:29 templates/generic/object_edit.html:70 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +msgid "Create" +msgstr "Oluştur" + +#: extras/choices.py:255 extras/tables/tables.py:294 +#: templates/extras/eventrule.html:55 +msgid "Update" +msgstr "Güncelleme" + +#: extras/choices.py:256 extras/tables/tables.py:297 +#: templates/circuits/inc/circuit_termination.html:22 +#: templates/dcim/devicetype/component_templates.html:24 +#: templates/dcim/inc/panels/inventory_items.html:29 +#: templates/dcim/moduletype/component_templates.html:24 +#: templates/dcim/powerpanel.html:71 templates/extras/eventrule.html:59 +#: templates/extras/report_list.html:34 templates/extras/script_list.html:33 +#: templates/generic/bulk_delete.html:18 templates/generic/bulk_delete.html:45 +#: templates/generic/object_delete.html:15 templates/htmx/delete_form.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:35 +#: templates/users/objectpermission.html:49 +#: utilities/templates/buttons/delete.html:9 +msgid "Delete" +msgstr "Sil" + +#: extras/choices.py:280 utilities/choices.py:143 utilities/choices.py:191 +msgid "Blue" +msgstr "Mavi" + +#: extras/choices.py:281 utilities/choices.py:142 utilities/choices.py:192 +msgid "Indigo" +msgstr "çivit mavisi" + +#: extras/choices.py:282 utilities/choices.py:140 utilities/choices.py:193 +msgid "Purple" +msgstr "Mor" + +#: extras/choices.py:283 utilities/choices.py:137 utilities/choices.py:194 +msgid "Pink" +msgstr "Pembe" + +#: extras/choices.py:284 utilities/choices.py:136 utilities/choices.py:195 +msgid "Red" +msgstr "Kırmızı" + +#: extras/choices.py:285 utilities/choices.py:154 utilities/choices.py:196 +msgid "Orange" +msgstr "Portakal" + +#: extras/choices.py:286 utilities/choices.py:152 utilities/choices.py:197 +msgid "Yellow" +msgstr "Sarı" + +#: extras/choices.py:287 utilities/choices.py:149 utilities/choices.py:198 +msgid "Green" +msgstr "Yeşil" + +#: extras/choices.py:288 utilities/choices.py:146 utilities/choices.py:199 +msgid "Teal" +msgstr "çamurcun" + +#: extras/choices.py:289 utilities/choices.py:145 utilities/choices.py:200 +msgid "Cyan" +msgstr "Mavi" + +#: extras/choices.py:290 utilities/choices.py:201 +msgid "Gray" +msgstr "Gri" + +#: extras/choices.py:291 utilities/choices.py:160 utilities/choices.py:202 +msgid "Black" +msgstr "Siyah" + +#: extras/choices.py:292 utilities/choices.py:161 utilities/choices.py:203 +msgid "White" +msgstr "Beyaz" + +#: extras/choices.py:306 extras/forms/model_forms.py:233 +#: extras/forms/model_forms.py:319 templates/extras/webhook.html:11 +msgid "Webhook" +msgstr "Web kancası" + +#: extras/choices.py:307 templates/extras/script/base.html:29 +msgid "Script" +msgstr "Senaryo" + +#: extras/dashboard/forms.py:38 +msgid "Widget type" +msgstr "Widget türü" + +#: extras/dashboard/widgets.py:148 +msgid "Note" +msgstr "Not" + +#: extras/dashboard/widgets.py:149 +msgid "Display some arbitrary custom content. Markdown is supported." +msgstr "Bazı rastgele özel içerikleri görüntüleyin. Markdown desteklenir." + +#: extras/dashboard/widgets.py:162 +msgid "Object Counts" +msgstr "Nesne Sayıları" + +#: extras/dashboard/widgets.py:163 +msgid "" +"Display a set of NetBox models and the number of objects created for each " +"type." +msgstr "" +"Bir dizi NetBox modeli ve her tür için oluşturulan nesne sayısını " +"görüntüleyin." + +#: extras/dashboard/widgets.py:173 +msgid "Filters to apply when counting the number of objects" +msgstr "Nesne sayısını sayarken uygulanacak filtreler" + +#: extras/dashboard/widgets.py:209 +msgid "Object List" +msgstr "Nesne Listesi" + +#: extras/dashboard/widgets.py:210 +msgid "Display an arbitrary list of objects." +msgstr "İsteğe bağlı bir nesne listesi görüntüleyin." + +#: extras/dashboard/widgets.py:223 +msgid "The default number of objects to display" +msgstr "Görüntülenecek nesnelerin varsayılan sayısı" + +#: extras/dashboard/widgets.py:270 +msgid "RSS Feed" +msgstr "RSS Beslemesi" + +#: extras/dashboard/widgets.py:275 +msgid "Embed an RSS feed from an external website." +msgstr "Harici bir web sitesinden bir RSS beslemesi ekleyin." + +#: extras/dashboard/widgets.py:282 +msgid "Feed URL" +msgstr "Akış URL'si" + +#: extras/dashboard/widgets.py:287 +msgid "The maximum number of objects to display" +msgstr "Görüntülenecek maksimum nesne sayısı" + +#: extras/dashboard/widgets.py:292 +msgid "How long to stored the cached content (in seconds)" +msgstr "" +"Önbelleğe alınan içeriğin ne kadar süre saklanacağı (saniye cinsinden)" + +#: extras/dashboard/widgets.py:344 templates/account/base.html:10 +#: templates/account/bookmarks.html:7 templates/inc/profile_button.html:29 +msgid "Bookmarks" +msgstr "Yer İşaretleri" + +#: extras/dashboard/widgets.py:348 +msgid "Show your personal bookmarks" +msgstr "Kişisel yer imlerinizi gösterin" + +#: extras/filtersets.py:207 extras/filtersets.py:542 extras/filtersets.py:570 +msgid "Data file (ID)" +msgstr "Veri dosyası (ID)" + +#: extras/filtersets.py:479 virtualization/forms/filtersets.py:114 +msgid "Cluster type" +msgstr "Küme türü" + +#: extras/filtersets.py:485 virtualization/filtersets.py:95 +#: virtualization/filtersets.py:147 +msgid "Cluster type (slug)" +msgstr "Küme tipi (sümüklü böcek)" + +#: extras/filtersets.py:490 ipam/forms/bulk_edit.py:475 +#: ipam/forms/model_forms.py:585 virtualization/forms/filtersets.py:108 +msgid "Cluster group" +msgstr "Küme grubu" + +#: extras/filtersets.py:496 virtualization/filtersets.py:136 +msgid "Cluster group (slug)" +msgstr "Küme grubu (sümüklü böcek)" + +#: extras/filtersets.py:506 tenancy/forms/forms.py:16 +#: tenancy/forms/forms.py:39 +msgid "Tenant group" +msgstr "Kiracı grubu" + +#: extras/filtersets.py:512 tenancy/filtersets.py:164 +#: tenancy/filtersets.py:184 +msgid "Tenant group (slug)" +msgstr "Kiracı grubu (sümüklü böcek)" + +#: extras/filtersets.py:528 templates/extras/tag.html:12 +msgid "Tag" +msgstr "etiket" + +#: extras/filtersets.py:534 +msgid "Tag (slug)" +msgstr "Etiket (slug)" + +#: extras/filtersets.py:594 extras/forms/filtersets.py:438 +msgid "Has local config context data" +msgstr "Yerel yapılandırma bağlam verilerine sahiptir" + +#: extras/filtersets.py:619 +msgid "User name" +msgstr "Kullanıcı adı" + +#: extras/forms/bulk_edit.py:32 extras/forms/filtersets.py:56 +msgid "Group name" +msgstr "Grup adı" + +#: extras/forms/bulk_edit.py:40 extras/forms/filtersets.py:64 +#: extras/tables/tables.py:47 templates/extras/customfield.html:39 +#: templates/generic/bulk_import.html:116 +msgid "Required" +msgstr "Gerekli" + +#: extras/forms/bulk_edit.py:53 extras/forms/bulk_import.py:57 +#: extras/forms/filtersets.py:78 extras/models/customfields.py:193 +msgid "UI visible" +msgstr "Kullanıcı arayüzü görünür" + +#: extras/forms/bulk_edit.py:58 extras/forms/bulk_import.py:63 +#: extras/forms/filtersets.py:83 extras/models/customfields.py:200 +msgid "UI editable" +msgstr "UI düzenlenebilir" + +#: extras/forms/bulk_edit.py:63 extras/forms/filtersets.py:86 +msgid "Is cloneable" +msgstr "Klonlanabilir mi" + +#: extras/forms/bulk_edit.py:102 extras/forms/filtersets.py:126 +msgid "New window" +msgstr "Yeni pencere" + +#: extras/forms/bulk_edit.py:111 +msgid "Button class" +msgstr "Düğme sınıfı" + +#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:164 +#: extras/models/models.py:439 +msgid "MIME type" +msgstr "MIME türü" + +#: extras/forms/bulk_edit.py:133 extras/forms/filtersets.py:167 +msgid "File extension" +msgstr "Dosya uzantısı" + +#: extras/forms/bulk_edit.py:138 extras/forms/filtersets.py:171 +msgid "As attachment" +msgstr "Ek olarak" + +#: extras/forms/bulk_edit.py:166 extras/forms/filtersets.py:213 +#: extras/tables/tables.py:214 templates/extras/savedfilter.html:30 +msgid "Shared" +msgstr "Paylaşılan" + +#: extras/forms/bulk_edit.py:189 extras/forms/filtersets.py:242 +#: extras/models/models.py:204 +msgid "HTTP method" +msgstr "HTTP yöntemi" + +#: extras/forms/bulk_edit.py:193 extras/forms/filtersets.py:236 +#: templates/extras/webhook.html:37 +msgid "Payload URL" +msgstr "Yük URL'si" + +#: extras/forms/bulk_edit.py:198 extras/models/models.py:244 +msgid "SSL verification" +msgstr "SSL doğrulama" + +#: extras/forms/bulk_edit.py:201 templates/extras/webhook.html:45 +msgid "Secret" +msgstr "Gizli" + +#: extras/forms/bulk_edit.py:206 +msgid "CA file path" +msgstr "CA dosya yolu" + +#: extras/forms/bulk_edit.py:225 +msgid "On create" +msgstr "Oluşturulurken" + +#: extras/forms/bulk_edit.py:230 +msgid "On update" +msgstr "Güncellemede" + +#: extras/forms/bulk_edit.py:235 +msgid "On delete" +msgstr "Silme üzerine" + +#: extras/forms/bulk_edit.py:240 +msgid "On job start" +msgstr "İşe başlarken" + +#: extras/forms/bulk_edit.py:245 +msgid "On job end" +msgstr "İş sonunda" + +#: extras/forms/bulk_edit.py:282 +msgid "Is active" +msgstr "Aktif" + +#: extras/forms/bulk_import.py:34 extras/forms/bulk_import.py:115 +#: extras/forms/bulk_import.py:130 extras/forms/bulk_import.py:153 +#: extras/forms/bulk_import.py:177 extras/forms/filtersets.py:114 +#: extras/forms/filtersets.py:160 extras/forms/filtersets.py:201 +#: extras/forms/model_forms.py:43 extras/forms/model_forms.py:127 +#: extras/forms/model_forms.py:154 extras/forms/model_forms.py:195 +#: extras/forms/model_forms.py:251 +msgid "Content types" +msgstr "İçerik türleri" + +#: extras/forms/bulk_import.py:36 extras/forms/bulk_import.py:117 +#: extras/forms/bulk_import.py:132 extras/forms/bulk_import.py:155 +#: extras/forms/bulk_import.py:179 tenancy/forms/bulk_import.py:96 +msgid "One or more assigned object types" +msgstr "Bir veya daha fazla atanmış nesne türü" + +#: extras/forms/bulk_import.py:41 +msgid "Field data type (e.g. text, integer, etc.)" +msgstr "Alan veri türü (örn. Metin, tamsayı vb.)" + +#: extras/forms/bulk_import.py:44 extras/forms/filtersets.py:48 +#: extras/forms/filtersets.py:259 extras/forms/model_forms.py:47 +#: extras/forms/model_forms.py:221 tenancy/forms/filtersets.py:91 +msgid "Object type" +msgstr "Nesne türü" + +#: extras/forms/bulk_import.py:47 +msgid "Object type (for object or multi-object fields)" +msgstr "Nesne türü (nesne veya çoklu nesne alanları için)" + +#: extras/forms/bulk_import.py:50 extras/forms/filtersets.py:73 +msgid "Choice set" +msgstr "Seçim seti" + +#: extras/forms/bulk_import.py:54 +msgid "Choice set (for selection fields)" +msgstr "Seçim kümesi (seçim alanları için)" + +#: extras/forms/bulk_import.py:60 +msgid "Whether the custom field is displayed in the UI" +msgstr "Özel alanın kullanıcı arayüzünde görüntülenip görüntülenmediği" + +#: extras/forms/bulk_import.py:66 +msgid "Whether the custom field is editable in the UI" +msgstr "Özel alanın kullanıcı arayüzünde düzenlenebilir olup olmadığı" + +#: extras/forms/bulk_import.py:82 +msgid "The base set of predefined choices to use (if any)" +msgstr "Kullanılacak önceden tanımlanmış seçeneklerin temel kümesi (varsa)" + +#: extras/forms/bulk_import.py:88 +msgid "" +"Quoted string of comma-separated field choices with optional labels " +"separated by colon: \"choice1:First Choice,choice2:Second Choice\"" +msgstr "" +"İki nokta ile ayrılmış isteğe bağlı etiketlerle virgülle ayrılmış alan " +"seçeneklerinin alıntılanmış dizesi: “Seçim1:First Choice, Choice2:Second " +"Choice”" + +#: extras/forms/bulk_import.py:182 +msgid "Action object" +msgstr "Eylem nesnesi" + +#: extras/forms/bulk_import.py:184 +msgid "Webhook name or script as dotted path module.Class" +msgstr "Noktalı yol olarak Webhook adı veya komut dosyası module.Class" + +#: extras/forms/bulk_import.py:236 +msgid "Assigned object type" +msgstr "Atanan nesne türü" + +#: extras/forms/bulk_import.py:241 +msgid "The classification of entry" +msgstr "Girişin sınıflandırılması" + +#: extras/forms/filtersets.py:53 +msgid "Field type" +msgstr "Alan tipi" + +#: extras/forms/filtersets.py:97 extras/tables/tables.py:65 +#: templates/generic/bulk_import.html:148 +msgid "Choices" +msgstr "Seçenekler" + +#: extras/forms/filtersets.py:141 extras/forms/filtersets.py:327 +#: extras/forms/filtersets.py:417 extras/forms/model_forms.py:456 +#: templates/core/job.html:86 templates/extras/configcontext.html:86 +#: templates/extras/eventrule.html:111 +msgid "Data" +msgstr "Veriler" + +#: extras/forms/filtersets.py:152 extras/forms/filtersets.py:341 +#: extras/forms/filtersets.py:427 utilities/choices.py:219 +#: utilities/forms/bulk_import.py:27 +msgid "Data file" +msgstr "Veri dosyası" + +#: extras/forms/filtersets.py:185 +msgid "Content type" +msgstr "İçerik türü" + +#: extras/forms/filtersets.py:232 extras/models/models.py:209 +msgid "HTTP content type" +msgstr "HTTP içerik türü" + +#: extras/forms/filtersets.py:254 extras/forms/model_forms.py:269 +#: templates/extras/eventrule.html:46 +msgid "Events" +msgstr "Olaylar" + +#: extras/forms/filtersets.py:264 +msgid "Action type" +msgstr "Eylem türü" + +#: extras/forms/filtersets.py:278 +msgid "Object creations" +msgstr "Nesne oluşturma" + +#: extras/forms/filtersets.py:285 +msgid "Object updates" +msgstr "Nesne güncellemeleri" + +#: extras/forms/filtersets.py:292 +msgid "Object deletions" +msgstr "Nesne silme" + +#: extras/forms/filtersets.py:299 +msgid "Job starts" +msgstr "İş başlıyor" + +#: extras/forms/filtersets.py:306 extras/forms/model_forms.py:288 +msgid "Job terminations" +msgstr "İş sonlandırmaları" + +#: extras/forms/filtersets.py:315 +msgid "Tagged object type" +msgstr "Etiketli nesne türü" + +#: extras/forms/filtersets.py:320 +msgid "Allowed object type" +msgstr "İzin verilen nesne türü" + +#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:391 +#: netbox/navigation/menu.py:19 +msgid "Regions" +msgstr "Bölgeler" + +#: extras/forms/filtersets.py:354 extras/forms/model_forms.py:396 +msgid "Site groups" +msgstr "Site grupları" + +#: extras/forms/filtersets.py:364 extras/forms/model_forms.py:406 +#: netbox/navigation/menu.py:21 +msgid "Locations" +msgstr "Konumlar" + +#: extras/forms/filtersets.py:369 extras/forms/model_forms.py:411 +msgid "Device types" +msgstr "Cihaz türleri" + +#: extras/forms/filtersets.py:374 extras/forms/model_forms.py:416 +msgid "Roles" +msgstr "Roller" + +#: extras/forms/filtersets.py:384 extras/forms/model_forms.py:426 +msgid "Cluster types" +msgstr "Küme türleri" + +#: extras/forms/filtersets.py:390 extras/forms/model_forms.py:431 +msgid "Cluster groups" +msgstr "Küme grupları" + +#: extras/forms/filtersets.py:395 extras/forms/model_forms.py:436 +#: netbox/navigation/menu.py:243 netbox/navigation/menu.py:245 +#: templates/virtualization/clustertype.html:33 +#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +msgid "Clusters" +msgstr "Kümeler" + +#: extras/forms/filtersets.py:400 extras/forms/model_forms.py:441 +msgid "Tenant groups" +msgstr "Kiracı grupları" + +#: extras/forms/filtersets.py:454 extras/forms/filtersets.py:495 +msgid "After" +msgstr "Sonra" + +#: extras/forms/filtersets.py:459 extras/forms/filtersets.py:500 +msgid "Before" +msgstr "Önce" + +#: extras/forms/filtersets.py:490 extras/tables/tables.py:431 +#: templates/extras/htmx/report_result.html:43 +#: templates/extras/objectchange.html:34 +msgid "Time" +msgstr "Zaman" + +#: extras/forms/filtersets.py:504 extras/forms/model_forms.py:271 +#: extras/tables/tables.py:445 templates/extras/eventrule.html:90 +#: templates/extras/objectchange.html:50 +msgid "Action" +msgstr "Eylem" + +#: extras/forms/model_forms.py:50 +msgid "Type of the related object (for object/multi-object fields only)" +msgstr "İlgili nesnenin türü (yalnızca nesne/çoklu nesne alanları için)" + +#: extras/forms/model_forms.py:58 templates/extras/customfield.html:11 +msgid "Custom Field" +msgstr "Özel Alan" + +#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +msgid "Behavior" +msgstr "Davranış" + +#: extras/forms/model_forms.py:62 +msgid "Values" +msgstr "Değerler" + +#: extras/forms/model_forms.py:71 +msgid "" +"The type of data stored in this field. For object/multi-object fields, " +"select the related object type below." +msgstr "" +"Bu alanda depolanan veri türü. Nesne/çoklu nesne alanları için aşağıda " +"ilgili nesne türünü seçin." + +#: extras/forms/model_forms.py:74 +msgid "" +"This will be displayed as help text for the form field. Markdown is " +"supported." +msgstr "" +"Bu, form alanı için yardım metni olarak görüntülenecektir. Markdown " +"desteklenir." + +#: extras/forms/model_forms.py:91 +msgid "" +"Enter one choice per line. An optional label may be specified for each " +"choice by appending it with a colon. Example:" +msgstr "" +"Satır başına bir seçenek girin. Her seçim için iki nokta üst üste eklenerek " +"isteğe bağlı bir etiket belirtilebilir. Örnek:" + +#: extras/forms/model_forms.py:132 templates/extras/customlink.html:10 +msgid "Custom Link" +msgstr "Özel Bağlantı" + +#: extras/forms/model_forms.py:133 +msgid "Templates" +msgstr "Şablonlar" + +#: extras/forms/model_forms.py:145 +msgid "" +"Jinja2 template code for the link text. Reference the object as {{ " +"object }}. Links which render as empty text will not be displayed." +msgstr "" + +#: extras/forms/model_forms.py:148 +msgid "" +"Jinja2 template code for the link URL. Reference the object as {{ " +"object }}." +msgstr "" + +#: extras/forms/model_forms.py:158 extras/forms/model_forms.py:507 +msgid "Template code" +msgstr "Şablon kodu" + +#: extras/forms/model_forms.py:164 templates/extras/exporttemplate.html:17 +msgid "Export Template" +msgstr "Dışa Aktar Şablonu" + +#: extras/forms/model_forms.py:166 +msgid "Rendering" +msgstr "Oluşturma" + +#: extras/forms/model_forms.py:180 extras/forms/model_forms.py:532 +msgid "Template content is populated from the remote source selected below." +msgstr "Şablon içeriği aşağıda seçilen uzak kaynaktan doldurulur." + +#: extras/forms/model_forms.py:187 extras/forms/model_forms.py:539 +msgid "Must specify either local content or a data file" +msgstr "Yerel içerik veya veri dosyası belirtmelidir" + +#: extras/forms/model_forms.py:201 netbox/forms/mixins.py:68 +#: templates/extras/savedfilter.html:10 +msgid "Saved Filter" +msgstr "Kaydedilen Filtre" + +#: extras/forms/model_forms.py:234 templates/extras/webhook.html:28 +msgid "HTTP Request" +msgstr "HTTP isteği" + +#: extras/forms/model_forms.py:237 templates/extras/webhook.html:53 +msgid "SSL" +msgstr "SSL" + +#: extras/forms/model_forms.py:255 +msgid "Action choice" +msgstr "Eylem seçimi" + +#: extras/forms/model_forms.py:260 +msgid "Enter conditions in JSON format." +msgstr "Koşulları girin JSON biçim." + +#: extras/forms/model_forms.py:264 +msgid "" +"Enter parameters to pass to the action in JSON format." +msgstr "" +"Eyleme iletilecek parametreleri girin JSON" +" biçim." + +#: extras/forms/model_forms.py:268 templates/extras/eventrule.html:11 +msgid "Event Rule" +msgstr "Etkinlik Kuralı" + +#: extras/forms/model_forms.py:270 templates/extras/eventrule.html:78 +msgid "Conditions" +msgstr "Koşullar" + +#: extras/forms/model_forms.py:284 +msgid "Creations" +msgstr "Kreasyonlar" + +#: extras/forms/model_forms.py:285 +msgid "Updates" +msgstr "Güncellemeler" + +#: extras/forms/model_forms.py:286 +msgid "Deletions" +msgstr "Silme" + +#: extras/forms/model_forms.py:287 +msgid "Job executions" +msgstr "İş yürütmeleri" + +#: extras/forms/model_forms.py:373 users/forms/model_forms.py:286 +msgid "Object types" +msgstr "Nesne türleri" + +#: extras/forms/model_forms.py:446 netbox/navigation/menu.py:40 +#: tenancy/tables/tenants.py:22 +msgid "Tenants" +msgstr "Kiracılar" + +#: extras/forms/model_forms.py:463 ipam/forms/filtersets.py:141 +#: ipam/forms/filtersets.py:527 templates/extras/configcontext.html:62 +#: templates/ipam/ipaddress.html:62 templates/ipam/vlan_edit.html:30 +#: tenancy/forms/filtersets.py:86 users/forms/model_forms.py:324 +msgid "Assignment" +msgstr "Ödev" + +#: extras/forms/model_forms.py:489 +msgid "Data is populated from the remote source selected below." +msgstr "Veriler aşağıda seçilen uzak kaynaktan doldurulur." + +#: extras/forms/model_forms.py:495 +msgid "Must specify either local data or a data file" +msgstr "Yerel veri veya veri dosyası belirtmelidir" + +#: extras/forms/model_forms.py:514 templates/core/datafile.html:65 +msgid "Content" +msgstr "İçerik" + +#: extras/forms/reports.py:18 extras/forms/scripts.py:24 +msgid "Schedule at" +msgstr "Şurada programlayın" + +#: extras/forms/reports.py:19 +msgid "Schedule execution of report to a set time" +msgstr "Raporun yürütülmesini belirli bir zamana planlayın" + +#: extras/forms/reports.py:24 extras/forms/scripts.py:30 +msgid "Recurs every" +msgstr "Her birini tekrarlar" + +#: extras/forms/reports.py:28 +msgid "Interval at which this report is re-run (in minutes)" +msgstr "Bu raporun yeniden çalıştırıldığı aralık (dakika cinsinden)" + +#: extras/forms/reports.py:36 extras/forms/scripts.py:42 +#, python-brace-format +msgid " (current time: {now})" +msgstr " (Geçerli saat: {now})" + +#: extras/forms/reports.py:46 extras/forms/scripts.py:52 +msgid "Scheduled time must be in the future." +msgstr "Planlanan zaman gelecekte olmalıdır." + +#: extras/forms/scripts.py:18 +msgid "Commit changes" +msgstr "Değişiklikleri gerçekleştirme" + +#: extras/forms/scripts.py:19 +msgid "Commit changes to the database (uncheck for a dry-run)" +msgstr "" +"Veritabanındaki değişiklikleri ilet (kuru çalıştırma için işaretini " +"kaldırın)" + +#: extras/forms/scripts.py:25 +msgid "Schedule execution of script to a set time" +msgstr "Komut dosyasının yürütülmesini belirli bir zamana planlayın" + +#: extras/forms/scripts.py:34 +msgid "Interval at which this script is re-run (in minutes)" +msgstr "Bu komut dosyasının yeniden çalıştırıldığı aralık (dakika cinsinden)" + +#: extras/models/change_logging.py:24 +msgid "time" +msgstr "zaman" + +#: extras/models/change_logging.py:37 +msgid "user name" +msgstr "kullanıcı adı" + +#: extras/models/change_logging.py:42 +msgid "request ID" +msgstr "istek kimliği" + +#: extras/models/change_logging.py:47 extras/models/staging.py:69 +msgid "action" +msgstr "aksiyon" + +#: extras/models/change_logging.py:81 +msgid "pre-change data" +msgstr "değişiklik öncesi veriler" + +#: extras/models/change_logging.py:87 +msgid "post-change data" +msgstr "değişim sonrası veriler" + +#: extras/models/change_logging.py:101 +msgid "object change" +msgstr "nesne değişikliği" + +#: extras/models/change_logging.py:102 +msgid "object changes" +msgstr "nesne değişiklikleri" + +#: extras/models/change_logging.py:118 +#, python-brace-format +msgid "Change logging is not supported for this object type ({type})." +msgstr "Değişiklik günlüğü bu nesne türü için desteklenmez ({type})." + +#: extras/models/configs.py:130 +msgid "config context" +msgstr "yapılandırma bağlamı" + +#: extras/models/configs.py:131 +msgid "config contexts" +msgstr "yapılandırma bağlamları" + +#: extras/models/configs.py:149 extras/models/configs.py:205 +msgid "JSON data must be in object form. Example:" +msgstr "JSON verileri nesne biçiminde olmalıdır. Örnek:" + +#: extras/models/configs.py:169 +msgid "" +"Local config context data takes precedence over source contexts in the final" +" rendered config context" +msgstr "" +"Yerel yapılandırma bağlamı verileri, nihai işlenmiş yapılandırma bağlamında " +"kaynak bağlamlara göre önceliklidir" + +#: extras/models/configs.py:224 +msgid "template code" +msgstr "şablon kodu" + +#: extras/models/configs.py:225 +msgid "Jinja2 template code." +msgstr "Jinja2 şablon kodu." + +#: extras/models/configs.py:228 +msgid "environment parameters" +msgstr "çevre parametreleri" + +#: extras/models/configs.py:233 +msgid "" +"Any additional" +" parameters to pass when constructing the Jinja2 environment." +msgstr "" +"Herhangi bir ek" +" parametreler Jinja2 ortamını inşa ederken geçmek." + +#: extras/models/configs.py:240 +msgid "config template" +msgstr "yapılandırma şablonu" + +#: extras/models/configs.py:241 +msgid "config templates" +msgstr "yapılandırma şablonları" + +#: extras/models/customfields.py:72 +msgid "The object(s) to which this field applies." +msgstr "Bu alanın geçerli olduğu nesne (ler) dir." + +#: extras/models/customfields.py:79 +msgid "The type of data this custom field holds" +msgstr "Bu özel alanın tuttuğu veri türü" + +#: extras/models/customfields.py:86 +msgid "The type of NetBox object this field maps to (for object fields)" +msgstr "Bu alanın eşlendiği NetBox nesnesinin türü (nesne alanları için)" + +#: extras/models/customfields.py:92 +msgid "Internal field name" +msgstr "İç alan adı" + +#: extras/models/customfields.py:96 +msgid "Only alphanumeric characters and underscores are allowed." +msgstr "Yalnızca alfasayısal karakterlere ve alt çizgilere izin verilir." + +#: extras/models/customfields.py:101 +msgid "Double underscores are not permitted in custom field names." +msgstr "Özel alan adlarında çift alt çizgilere izin verilmez." + +#: extras/models/customfields.py:112 +msgid "" +"Name of the field as displayed to users (if not provided, 'the field's name " +"will be used)" +msgstr "" +"Kullanıcılara görüntülenen alanın adı (belirtilmezse, 'alanın adı " +"kullanılacaktır)" + +#: extras/models/customfields.py:116 extras/models/models.py:347 +msgid "group name" +msgstr "grup adı" + +#: extras/models/customfields.py:119 +msgid "Custom fields within the same group will be displayed together" +msgstr "Aynı gruptaki özel alanlar birlikte görüntülenecektir" + +#: extras/models/customfields.py:127 +msgid "required" +msgstr "gereklidir" + +#: extras/models/customfields.py:129 +msgid "" +"If true, this field is required when creating new objects or editing an " +"existing object." +msgstr "" +"Eğer true ise, yeni nesneler oluştururken veya varolan bir nesneyi " +"düzenlerken bu alan gereklidir." + +#: extras/models/customfields.py:132 +msgid "search weight" +msgstr "arama ağırlığı" + +#: extras/models/customfields.py:135 +msgid "" +"Weighting for search. Lower values are considered more important. Fields " +"with a search weight of zero will be ignored." +msgstr "" +"Arama için ağırlıklandırma. Düşük değerler daha önemli kabul edilir. Arama " +"ağırlığı sıfır olan alanlar göz ardı edilecektir." + +#: extras/models/customfields.py:140 +msgid "filter logic" +msgstr "filtre mantığı" + +#: extras/models/customfields.py:144 +msgid "" +"Loose matches any instance of a given string; exact matches the entire " +"field." +msgstr "" +"Loose, belirli bir dizgenin herhangi bir örneğiyle eşleşir; tam olarak tüm " +"alanla eşleşir." + +#: extras/models/customfields.py:147 +msgid "default" +msgstr "varsayılan" + +#: extras/models/customfields.py:151 +msgid "" +"Default value for the field (must be a JSON value). Encapsulate strings with" +" double quotes (e.g. \"Foo\")." +msgstr "" +"Alan için varsayılan değer (JSON değeri olmalıdır). Dizeleri çift tırnak " +"işaretleriyle kapsülleyin (örn. “Foo”)." + +#: extras/models/customfields.py:156 +msgid "display weight" +msgstr "ekran ağırlığı" + +#: extras/models/customfields.py:157 +msgid "Fields with higher weights appear lower in a form." +msgstr "Daha yüksek ağırlığa sahip alanlar bir formda daha düşük görünür." + +#: extras/models/customfields.py:162 +msgid "minimum value" +msgstr "minimum değer" + +#: extras/models/customfields.py:163 +msgid "Minimum allowed value (for numeric fields)" +msgstr "İzin verilen minimum değer (sayısal alanlar için)" + +#: extras/models/customfields.py:168 +msgid "maximum value" +msgstr "maksimum değer" + +#: extras/models/customfields.py:169 +msgid "Maximum allowed value (for numeric fields)" +msgstr "İzin verilen maksimum değer (sayısal alanlar için)" + +#: extras/models/customfields.py:175 +msgid "validation regex" +msgstr "doğrulama regex" + +#: extras/models/customfields.py:177 +#, python-brace-format +msgid "" +"Regular expression to enforce on text field values. Use ^ and $ to force " +"matching of entire string. For example, ^[A-Z]{3}$ will limit " +"values to exactly three uppercase letters." +msgstr "" +"Metin alanı değerlerine uygulanacak normal ifade. Tüm dizgenin eşleşmesini " +"zorlamak için ^ ve $ kullanın. Örneğin, ^ [A-Z]{3}$ değerleri " +"tam olarak üç büyük harfle sınırlayacaktır." + +#: extras/models/customfields.py:185 +msgid "choice set" +msgstr "seçim seti" + +#: extras/models/customfields.py:194 +msgid "Specifies whether the custom field is displayed in the UI" +msgstr "" +"Özel alanın kullanıcı arayüzünde görüntülenip görüntülenmeyeceğini belirtir" + +#: extras/models/customfields.py:201 +msgid "Specifies whether the custom field value can be edited in the UI" +msgstr "" +"Özel alan değerinin kullanıcı arayüzünde düzenlenip düzenlenemeyeceğini " +"belirtir" + +#: extras/models/customfields.py:205 +msgid "is cloneable" +msgstr "klonlanabilir" + +#: extras/models/customfields.py:206 +msgid "Replicate this value when cloning objects" +msgstr "Nesneleri klonlarken bu değeri çoğaltın" + +#: extras/models/customfields.py:219 +msgid "custom field" +msgstr "özel alan" + +#: extras/models/customfields.py:220 +msgid "custom fields" +msgstr "özel alanlar" + +#: extras/models/customfields.py:309 +#, python-brace-format +msgid "Invalid default value \"{value}\": {error}" +msgstr "Geçersiz varsayılan değer”{value}“: {error}" + +#: extras/models/customfields.py:316 +msgid "A minimum value may be set only for numeric fields" +msgstr "Minimum değer yalnızca sayısal alanlar için ayarlanabilir" + +#: extras/models/customfields.py:318 +msgid "A maximum value may be set only for numeric fields" +msgstr "Maksimum değer yalnızca sayısal alanlar için ayarlanabilir" + +#: extras/models/customfields.py:328 +msgid "" +"Regular expression validation is supported only for text and URL fields" +msgstr "" +"Düzenli ifade doğrulaması yalnızca metin ve URL alanları için desteklenir" + +#: extras/models/customfields.py:338 +msgid "Selection fields must specify a set of choices." +msgstr "Seçim alanları bir dizi seçenek belirtmelidir." + +#: extras/models/customfields.py:342 +msgid "Choices may be set only on selection fields." +msgstr "Seçenekler yalnızca seçim alanlarında ayarlanabilir." + +#: extras/models/customfields.py:349 +msgid "Object fields must define an object type." +msgstr "Nesne alanları bir nesne türü tanımlamalıdır." + +#: extras/models/customfields.py:354 +#, python-brace-format +msgid "{type} fields may not define an object type." +msgstr "{type} alanlar bir nesne türü tanımlayamaz." + +#: extras/models/customfields.py:434 +msgid "True" +msgstr "Doğru" + +#: extras/models/customfields.py:435 +msgid "False" +msgstr "Yanlış" + +#: extras/models/customfields.py:517 +#, python-brace-format +msgid "Values must match this regex: {regex}" +msgstr "Değerler bu normal ifadeyle eşleşmelidir: {regex}" + +#: extras/models/customfields.py:611 +msgid "Value must be a string." +msgstr "Değer bir dize olmalıdır." + +#: extras/models/customfields.py:613 +#, python-brace-format +msgid "Value must match regex '{regex}'" +msgstr "Değer regex ile eşleşmelidir '{regex}'" + +#: extras/models/customfields.py:618 +msgid "Value must be an integer." +msgstr "Değer bir tamsayı olmalıdır." + +#: extras/models/customfields.py:621 extras/models/customfields.py:636 +#, python-brace-format +msgid "Value must be at least {minimum}" +msgstr "Değer en az olmalıdır {minimum}" + +#: extras/models/customfields.py:625 extras/models/customfields.py:640 +#, python-brace-format +msgid "Value must not exceed {maximum}" +msgstr "Değer geçmemelidir {maximum}" + +#: extras/models/customfields.py:633 +msgid "Value must be a decimal." +msgstr "Değer ondalık olmalıdır." + +#: extras/models/customfields.py:645 +msgid "Value must be true or false." +msgstr "Değer doğru veya yanlış olmalıdır." + +#: extras/models/customfields.py:653 +msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." +msgstr "Tarih değerleri ISO 8601 biçiminde olmalıdır (YYYY-AA-GG)." + +#: extras/models/customfields.py:662 +msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." +msgstr "" +"Tarih ve saat değerleri ISO 8601 biçiminde olmalıdır (YYYY-MM-DD HH:MM:SS)." + +#: extras/models/customfields.py:669 +#, python-brace-format +msgid "Invalid choice ({value}) for choice set {choiceset}." +msgstr "Geçersiz seçim ({value}) seçim seti için {choiceset}." + +#: extras/models/customfields.py:679 +#, python-brace-format +msgid "Invalid choice(s) ({value}) for choice set {choiceset}." +msgstr "Geçersiz seçim (ler) ({value}) seçim seti için {choiceset}." + +#: extras/models/customfields.py:688 +#, python-brace-format +msgid "Value must be an object ID, not {type}" +msgstr "Değer bir nesne kimliği olmalıdır, değil {type}" + +#: extras/models/customfields.py:694 +#, python-brace-format +msgid "Value must be a list of object IDs, not {type}" +msgstr "Değer, nesne kimliklerinin bir listesi olmalıdır, değil {type}" + +#: extras/models/customfields.py:698 +#, python-brace-format +msgid "Found invalid object ID: {id}" +msgstr "Geçersiz nesne kimliği bulundu: {id}" + +#: extras/models/customfields.py:701 +msgid "Required field cannot be empty." +msgstr "Zorunlu alan boş olamaz." + +#: extras/models/customfields.py:720 +msgid "Base set of predefined choices (optional)" +msgstr "Önceden tanımlanmış seçeneklerin temel kümesi (isteğe bağlı)" + +#: extras/models/customfields.py:732 +msgid "Choices are automatically ordered alphabetically" +msgstr "Seçenekler otomatik olarak alfabetik olarak sıralanır" + +#: extras/models/customfields.py:739 +msgid "custom field choice set" +msgstr "özel alan seçim kümesi" + +#: extras/models/customfields.py:740 +msgid "custom field choice sets" +msgstr "özel alan seçim kümeleri" + +#: extras/models/customfields.py:776 +msgid "Must define base or extra choices." +msgstr "Temel veya ekstra seçenekleri tanımlamalıdır." + +#: extras/models/dashboard.py:19 +msgid "layout" +msgstr "plan" + +#: extras/models/dashboard.py:23 +msgid "config" +msgstr "yapılandırma" + +#: extras/models/dashboard.py:28 +msgid "dashboard" +msgstr "gösterge paneli" + +#: extras/models/dashboard.py:29 +msgid "dashboards" +msgstr "gösterge tabloları" + +#: extras/models/models.py:49 +msgid "object types" +msgstr "nesne türleri" + +#: extras/models/models.py:50 +msgid "The object(s) to which this rule applies." +msgstr "Bu kuralın geçerli olduğu nesne (ler) dir." + +#: extras/models/models.py:63 +msgid "on create" +msgstr "yaratma üzerine" + +#: extras/models/models.py:65 +msgid "Triggers when a matching object is created." +msgstr "Eşleşen bir nesne oluşturulduğunda tetiklenir." + +#: extras/models/models.py:68 +msgid "on update" +msgstr "güncellemede" + +#: extras/models/models.py:70 +msgid "Triggers when a matching object is updated." +msgstr "Eşleşen bir nesne güncellendiğinde tetiklenir." + +#: extras/models/models.py:73 +msgid "on delete" +msgstr "silme üzerine" + +#: extras/models/models.py:75 +msgid "Triggers when a matching object is deleted." +msgstr "Eşleşen bir nesne silindiğinde tetiklenir." + +#: extras/models/models.py:78 +msgid "on job start" +msgstr "iş başında" + +#: extras/models/models.py:80 +msgid "Triggers when a job for a matching object is started." +msgstr "Eşleşen bir nesne için bir iş başlatıldığında tetiklenir." + +#: extras/models/models.py:83 +msgid "on job end" +msgstr "iş sonunda" + +#: extras/models/models.py:85 +msgid "Triggers when a job for a matching object terminates." +msgstr "Eşleşen bir nesne için bir iş sona erdiğinde tetiklenir." + +#: extras/models/models.py:92 +msgid "conditions" +msgstr "koşullar" + +#: extras/models/models.py:95 +msgid "" +"A set of conditions which determine whether the event will be generated." +msgstr "Olayın oluşturulup oluşturulmayacağını belirleyen bir dizi koşul." + +#: extras/models/models.py:103 +msgid "action type" +msgstr "eylem türü" + +#: extras/models/models.py:126 +msgid "Additional data to pass to the action object" +msgstr "Eylem nesnesine iletilecek ek veriler" + +#: extras/models/models.py:138 +msgid "event rule" +msgstr "olay kuralı" + +#: extras/models/models.py:139 +msgid "event rules" +msgstr "etkinlik kuralları" + +#: extras/models/models.py:155 +msgid "" +"At least one event type must be selected: create, update, delete, job start," +" and/or job end." +msgstr "" +"En az bir olay türü seçilmelidir: oluştur, güncelle, sil, iş başlama ve/veya" +" iş sonu." + +#: extras/models/models.py:196 +msgid "" +"This URL will be called using the HTTP method defined when the webhook is " +"called. Jinja2 template processing is supported with the same context as the" +" request body." +msgstr "" +"Bu URL, webhook çağrıldığında tanımlanan HTTP yöntemi kullanılarak " +"çağrılacaktır. Jinja2 şablon işleme, istek gövdesi ile aynı bağlamda " +"desteklenir." + +#: extras/models/models.py:211 +msgid "" +"The complete list of official content types is available here." +msgstr "" +"Resmi içerik türlerinin tam listesi mevcuttur burada." + +#: extras/models/models.py:216 +msgid "additional headers" +msgstr "ek başlıklar" + +#: extras/models/models.py:219 +msgid "" +"User-supplied HTTP headers to be sent with the request in addition to the " +"HTTP content type. Headers should be defined in the format Name: " +"Value. Jinja2 template processing is supported with the same context " +"as the request body (below)." +msgstr "" +"HTTP içerik türüne ek olarak istekle birlikte gönderilecek kullanıcı " +"tarafından sağlanan HTTP üstbilgileri. Başlıklar formatta tanımlanmalıdır " +"İsim: Değer. Jinja2 şablon işleme, istek gövdesi ile aynı " +"bağlamda desteklenir (aşağıda)." + +#: extras/models/models.py:225 +msgid "body template" +msgstr "vücut şablonu" + +#: extras/models/models.py:228 +msgid "" +"Jinja2 template for a custom request body. If blank, a JSON object " +"representing the change will be included. Available context data includes: " +"event, model, timestamp, " +"username, request_id, and data." +msgstr "" +"Özel bir istek gövdesi için Jinja2 şablonu. Boşsa, değişikliği temsil eden " +"bir JSON nesnesi dahil edilecektir. Kullanılabilir bağlam verileri şunları " +"içerir: olay, model, zaman damgası, " +"Kullanıcı adı, istek_kimliği, ve " +"veri." + +#: extras/models/models.py:234 +msgid "secret" +msgstr "gizli" + +#: extras/models/models.py:238 +msgid "" +"When provided, the request will include a X-Hook-Signature " +"header containing a HMAC hex digest of the payload body using the secret as " +"the key. The secret is not transmitted in the request." +msgstr "" +"Sağlandığında, istek şunları içerecektir: X-Hook-İmza Anahtar " +"olarak sırrı kullanan yük gövdesinin bir HMAC hex özetini içeren başlık. Sır" +" istekte iletilmez." + +#: extras/models/models.py:245 +msgid "Enable SSL certificate verification. Disable with caution!" +msgstr "" +"SSL sertifikası doğrulamasını etkinleştirin. Dikkatle devre dışı bırakın!" + +#: extras/models/models.py:251 templates/extras/webhook.html:62 +msgid "CA File Path" +msgstr "CA Dosya Yolu" + +#: extras/models/models.py:253 +msgid "" +"The specific CA certificate file to use for SSL verification. Leave blank to" +" use the system defaults." +msgstr "" +"SSL doğrulaması için kullanılacak belirli CA sertifika dosyası. Sistem " +"varsayılanlarını kullanmak için boş bırakın." + +#: extras/models/models.py:264 +msgid "webhook" +msgstr "web kancası" + +#: extras/models/models.py:265 +msgid "webhooks" +msgstr "web kancaları" + +#: extras/models/models.py:283 +msgid "Do not specify a CA certificate file if SSL verification is disabled." +msgstr "" +"SSL doğrulaması devre dışı bırakılmışsa bir CA sertifika dosyası " +"belirtmeyin." + +#: extras/models/models.py:323 +msgid "The object type(s) to which this link applies." +msgstr "Bu bağlantının geçerli olduğu nesne türü (ler) dir." + +#: extras/models/models.py:335 +msgid "link text" +msgstr "bağlantı metni" + +#: extras/models/models.py:336 +msgid "Jinja2 template code for link text" +msgstr "Bağlantı metni için Jinja2 şablon kodu" + +#: extras/models/models.py:339 +msgid "link URL" +msgstr "bağlantı URL'si" + +#: extras/models/models.py:340 +msgid "Jinja2 template code for link URL" +msgstr "Bağlantı URL'si için Jinja2 şablon kodu" + +#: extras/models/models.py:350 +msgid "Links with the same group will appear as a dropdown menu" +msgstr "Aynı gruba sahip bağlantılar açılır menü olarak görünecektir" + +#: extras/models/models.py:353 +msgid "button class" +msgstr "düğme sınıfı" + +#: extras/models/models.py:357 +msgid "" +"The class of the first link in a group will be used for the dropdown button" +msgstr "" +"Bir gruptaki ilk bağlantının sınıfı açılır düğme için kullanılacaktır." + +#: extras/models/models.py:360 +msgid "new window" +msgstr "yeni pencere" + +#: extras/models/models.py:362 +msgid "Force link to open in a new window" +msgstr "Bağlantıyı yeni bir pencerede açmaya zorla" + +#: extras/models/models.py:371 +msgid "custom link" +msgstr "özel bağlantı" + +#: extras/models/models.py:372 +msgid "custom links" +msgstr "özel bağlantılar" + +#: extras/models/models.py:419 +msgid "The object type(s) to which this template applies." +msgstr "Bu şablonun uygulandığı nesne türü (ler) dir." + +#: extras/models/models.py:432 +msgid "" +"Jinja2 template code. The list of objects being exported is passed as a " +"context variable named queryset." +msgstr "" +"Jinja2 şablon kodu. Dışa aktarılan nesnelerin listesi, adı verilen bir " +"bağlam değişkeni olarak iletilir sorgulama." + +#: extras/models/models.py:440 +msgid "Defaults to text/plain; charset=utf-8" +msgstr "Varsayılan olarak metin/düz; karakter kümesi = utf-8" + +#: extras/models/models.py:443 +msgid "file extension" +msgstr "dosya uzantısı" + +#: extras/models/models.py:446 +msgid "Extension to append to the rendered filename" +msgstr "Oluşturulan dosya adına eklenecek uzantı" + +#: extras/models/models.py:449 +msgid "as attachment" +msgstr "ek olarak" + +#: extras/models/models.py:451 +msgid "Download file as attachment" +msgstr "Dosya ek olarak indir" + +#: extras/models/models.py:460 +msgid "export template" +msgstr "dışa aktarma şablonu" + +#: extras/models/models.py:461 +msgid "export templates" +msgstr "dışa aktarma şablonları" + +#: extras/models/models.py:478 +#, python-brace-format +msgid "\"{name}\" is a reserved name. Please choose a different name." +msgstr "“{name}“ayrılmış bir isimdir. Lütfen farklı bir isim seçin." + +#: extras/models/models.py:528 +msgid "The object type(s) to which this filter applies." +msgstr "Bu filtrenin uygulandığı nesne türü (ler) dir." + +#: extras/models/models.py:560 +msgid "shared" +msgstr "paylaşılan" + +#: extras/models/models.py:573 +msgid "saved filter" +msgstr "kaydedilmiş filtre" + +#: extras/models/models.py:574 +msgid "saved filters" +msgstr "kaydedilmiş filtreler" + +#: extras/models/models.py:592 +msgid "Filter parameters must be stored as a dictionary of keyword arguments." +msgstr "" +"Filtre parametreleri, anahtar kelime argümanları sözlüğü olarak " +"saklanmalıdır." + +#: extras/models/models.py:620 +msgid "image height" +msgstr "görüntü yüksekliği" + +#: extras/models/models.py:623 +msgid "image width" +msgstr "görüntü genişliği" + +#: extras/models/models.py:640 +msgid "image attachment" +msgstr "görüntü eki" + +#: extras/models/models.py:641 +msgid "image attachments" +msgstr "görüntü ekleri" + +#: extras/models/models.py:655 +#, python-brace-format +msgid "Image attachments cannot be assigned to this object type ({type})." +msgstr "Görüntü ekleri bu nesne türüne atanamaz ({type})." + +#: extras/models/models.py:718 +msgid "kind" +msgstr "çeşit" + +#: extras/models/models.py:732 +msgid "journal entry" +msgstr "dergi girişi" + +#: extras/models/models.py:733 +msgid "journal entries" +msgstr "dergi girişleri" + +#: extras/models/models.py:748 +#, python-brace-format +msgid "Journaling is not supported for this object type ({type})." +msgstr "Günlüğe kaydetme bu nesne türü için desteklenmez ({type})." + +#: extras/models/models.py:790 +msgid "bookmark" +msgstr "yer imi" + +#: extras/models/models.py:791 +msgid "bookmarks" +msgstr "yer imleri" + +#: extras/models/models.py:804 +#, python-brace-format +msgid "Bookmarks cannot be assigned to this object type ({type})." +msgstr "Yer imleri bu nesne türüne atanamaz ({type})." + +#: extras/models/reports.py:46 +msgid "report module" +msgstr "rapor modülü" + +#: extras/models/reports.py:47 +msgid "report modules" +msgstr "rapor modülleri" + +#: extras/models/scripts.py:46 +msgid "script module" +msgstr "komut dosyası modülü" + +#: extras/models/scripts.py:47 +msgid "script modules" +msgstr "komut dosyası modülleri" + +#: extras/models/search.py:24 +msgid "timestamp" +msgstr "zaman damgası" + +#: extras/models/search.py:39 +msgid "field" +msgstr "tarla" + +#: extras/models/search.py:47 +msgid "value" +msgstr "değer" + +#: extras/models/search.py:58 +msgid "cached value" +msgstr "önbelleğe alınan değer" + +#: extras/models/search.py:59 +msgid "cached values" +msgstr "önbelleğe alınan değerler" + +#: extras/models/staging.py:44 +msgid "branch" +msgstr "şube" + +#: extras/models/staging.py:45 +msgid "branches" +msgstr "dallar" + +#: extras/models/staging.py:97 +msgid "staged change" +msgstr "aşamalı değişim" + +#: extras/models/staging.py:98 +msgid "staged changes" +msgstr "aşamalı değişiklikler" + +#: extras/models/tags.py:40 +msgid "The object type(s) to which this this tag can be applied." +msgstr "Bu etiketin uygulanabileceği nesne türü (ler) dir." + +#: extras/models/tags.py:49 +msgid "tag" +msgstr "etiket" + +#: extras/models/tags.py:50 +msgid "tags" +msgstr "etiketler" + +#: extras/models/tags.py:78 +msgid "tagged item" +msgstr "etiketli öğe" + +#: extras/models/tags.py:79 +msgid "tagged items" +msgstr "etiketli öğeler" + +#: extras/signals.py:220 +#, python-brace-format +msgid "Deletion is prevented by a protection rule: {message}" +msgstr "Silme işlemi bir koruma kuralı tarafından engellenir: {message}" + +#: extras/tables/tables.py:44 extras/tables/tables.py:119 +#: extras/tables/tables.py:143 extras/tables/tables.py:208 +#: extras/tables/tables.py:285 +msgid "Content Types" +msgstr "İçerik Türleri" + +#: extras/tables/tables.py:50 +msgid "Visible" +msgstr "Görünür" + +#: extras/tables/tables.py:53 +msgid "Editable" +msgstr "Düzenlenebilir" + +#: extras/tables/tables.py:60 templates/extras/customfield.html:48 +msgid "Choice Set" +msgstr "Seçim Seti" + +#: extras/tables/tables.py:68 +msgid "Is Cloneable" +msgstr "Klonlanabilir mi" + +#: extras/tables/tables.py:98 +msgid "Count" +msgstr "Saymak" + +#: extras/tables/tables.py:101 +msgid "Order Alphabetically" +msgstr "Alfabetik olarak sıralayın" + +#: extras/tables/tables.py:125 templates/extras/customlink.html:34 +msgid "New Window" +msgstr "Yeni Pencere" + +#: extras/tables/tables.py:146 +msgid "As Attachment" +msgstr "Ek Olarak" + +#: extras/tables/tables.py:153 extras/tables/tables.py:372 +#: extras/tables/tables.py:407 templates/core/datafile.html:32 +#: templates/dcim/device/render_config.html:23 +#: templates/extras/configcontext.html:40 +#: templates/extras/configtemplate.html:32 +#: templates/extras/exporttemplate.html:51 +#: templates/generic/bulk_import.html:30 +#: templates/virtualization/virtualmachine/render_config.html:23 +msgid "Data File" +msgstr "Veri Dosyası" + +#: extras/tables/tables.py:158 extras/tables/tables.py:384 +#: extras/tables/tables.py:412 +msgid "Synced" +msgstr "Senkronize" + +#: extras/tables/tables.py:178 +msgid "Content Type" +msgstr "İçerik Türü" + +#: extras/tables/tables.py:185 +msgid "Image" +msgstr "Görüntü" + +#: extras/tables/tables.py:190 +msgid "Size (Bytes)" +msgstr "Boyut (Bayt)" + +#: extras/tables/tables.py:233 extras/tables/tables.py:331 +#: templates/extras/customfield.html:96 templates/extras/eventrule.html:32 +#: templates/users/objectpermission.html:68 users/tables.py:83 +msgid "Object Types" +msgstr "Nesne Türleri" + +#: extras/tables/tables.py:255 +msgid "SSL Validation" +msgstr "SSL Doğrulama" + +#: extras/tables/tables.py:300 +msgid "Job Start" +msgstr "İş Başlangıcı" + +#: extras/tables/tables.py:303 +msgid "Job End" +msgstr "İş Sonu" + +#: extras/tables/tables.py:441 templates/account/profile.html:20 +#: templates/users/user.html:22 +msgid "Full Name" +msgstr "Ad Soyad" + +#: extras/tables/tables.py:458 templates/extras/objectchange.html:72 +msgid "Request ID" +msgstr "İstek Kimliği" + +#: extras/tables/tables.py:495 +msgid "Comments (Short)" +msgstr "Yorumlar (Kısa)" + +#: extras/validators.py:13 +#, python-format +msgid "Ensure this value is equal to %(limit_value)s." +msgstr "Bu değerin eşit olduğundan emin olun %(limit_value)s." + +#: extras/validators.py:24 +#, python-format +msgid "Ensure this value does not equal %(limit_value)s." +msgstr "Bu değerin eşit olmadığından emin olun %(limit_value)s." + +#: extras/validators.py:35 +msgid "This field must be empty." +msgstr "Bu alan boş olmalıdır." + +#: extras/validators.py:50 +msgid "This field must not be empty." +msgstr "Bu alan boş olmamalıdır." + +#: extras/validators.py:119 +#, python-brace-format +msgid "Invalid attribute \"{name}\" for {model}" +msgstr "" + +#: extras/views.py:880 +msgid "Your dashboard has been reset." +msgstr "Kontrol paneliniz sıfırlandı." + +#: ipam/api/field_serializers.py:17 +msgid "Enter a valid IPv4 or IPv6 address with optional mask." +msgstr "İsteğe bağlı maske ile geçerli bir IPv4 veya IPv6 adresi girin." + +#: ipam/api/field_serializers.py:24 +#, python-brace-format +msgid "Invalid IP address format: {data}" +msgstr "Geçersiz IP adresi biçimi: {data}" + +#: ipam/api/field_serializers.py:37 +msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." +msgstr "CIDR gösteriminde geçerli bir IPv4 veya IPv6 öneki ve maske girin." + +#: ipam/api/field_serializers.py:44 +#, python-brace-format +msgid "Invalid IP prefix format: {data}" +msgstr "Geçersiz IP önek biçimi: {data}" + +#: ipam/choices.py:30 +msgid "Container" +msgstr "Konteyner" + +#: ipam/choices.py:72 +msgid "DHCP" +msgstr "DHCP" + +#: ipam/choices.py:73 +msgid "SLAAC" +msgstr "ZÜMRÜT" + +#: ipam/choices.py:89 +msgid "Loopback" +msgstr "Geri döngü" + +#: ipam/choices.py:90 tenancy/choices.py:18 +msgid "Secondary" +msgstr "İkincil" + +#: ipam/choices.py:91 +msgid "Anycast" +msgstr "Anycast" + +#: ipam/choices.py:115 +msgid "Standard" +msgstr "Standart" + +#: ipam/choices.py:120 +msgid "CheckPoint" +msgstr "Kontrol Noktası" + +#: ipam/choices.py:123 +msgid "Cisco" +msgstr "Cisco" + +#: ipam/choices.py:137 +msgid "Plaintext" +msgstr "Düz metin" + +#: ipam/filtersets.py:47 vpn/filtersets.py:276 +msgid "Import target" +msgstr "Hedefi içe aktarma" + +#: ipam/filtersets.py:53 vpn/filtersets.py:282 +msgid "Import target (name)" +msgstr "Hedefi içe aktarma (isim)" + +#: ipam/filtersets.py:58 vpn/filtersets.py:287 +msgid "Export target" +msgstr "Dışa aktarma hedefi" + +#: ipam/filtersets.py:64 vpn/filtersets.py:293 +msgid "Export target (name)" +msgstr "Dışa aktarma hedefi (isim)" + +#: ipam/filtersets.py:85 +msgid "Importing VRF" +msgstr "VRF'yi içe aktarma" + +#: ipam/filtersets.py:91 +msgid "Import VRF (RD)" +msgstr "VRF'yi içe aktarın (RD)" + +#: ipam/filtersets.py:96 +msgid "Exporting VRF" +msgstr "VRF'yi dışa aktarma" + +#: ipam/filtersets.py:102 +msgid "Export VRF (RD)" +msgstr "VRF'yi (RD) dışa aktarma" + +#: ipam/filtersets.py:132 ipam/filtersets.py:247 ipam/forms/model_forms.py:229 +#: ipam/tables/ip.py:211 templates/ipam/prefix.html:12 +msgid "Prefix" +msgstr "Önek" + +#: ipam/filtersets.py:136 ipam/filtersets.py:175 ipam/filtersets.py:198 +msgid "RIR (ID)" +msgstr "RİR (İD)" + +#: ipam/filtersets.py:142 ipam/filtersets.py:181 ipam/filtersets.py:204 +msgid "RIR (slug)" +msgstr "RIR (sümüklü böcek)" + +#: ipam/filtersets.py:251 +msgid "Within prefix" +msgstr "Önek içinde" + +#: ipam/filtersets.py:255 +msgid "Within and including prefix" +msgstr "Önek içinde ve dahil olmak üzere" + +#: ipam/filtersets.py:259 +msgid "Prefixes which contain this prefix or IP" +msgstr "Bu önek veya IP'yi içeren önekler" + +#: ipam/filtersets.py:270 ipam/filtersets.py:538 ipam/forms/bulk_edit.py:326 +#: ipam/forms/filtersets.py:191 ipam/forms/filtersets.py:317 +msgid "Mask length" +msgstr "Maske uzunluğu" + +#: ipam/filtersets.py:339 vpn/filtersets.py:399 +msgid "VLAN (ID)" +msgstr "VLAN (KİMLİĞİ)" + +#: ipam/filtersets.py:343 vpn/filtersets.py:394 +msgid "VLAN number (1-4094)" +msgstr "VLAN numarası (1-4094)" + +#: ipam/filtersets.py:437 ipam/filtersets.py:441 ipam/filtersets.py:533 +#: ipam/forms/model_forms.py:444 templates/tenancy/contact.html:54 +#: tenancy/forms/bulk_edit.py:112 +msgid "Address" +msgstr "Adres" + +#: ipam/filtersets.py:445 +msgid "Ranges which contain this prefix or IP" +msgstr "Bu önek veya IP'yi içeren aralıklar" + +#: ipam/filtersets.py:473 ipam/filtersets.py:529 +msgid "Parent prefix" +msgstr "Ebeveyn öneki" + +#: ipam/filtersets.py:582 ipam/filtersets.py:812 ipam/filtersets.py:1042 +#: vpn/filtersets.py:357 +msgid "Virtual machine (name)" +msgstr "Sanal makine (isim)" + +#: ipam/filtersets.py:587 ipam/filtersets.py:817 ipam/filtersets.py:1036 +#: virtualization/filtersets.py:278 virtualization/filtersets.py:317 +#: vpn/filtersets.py:362 +msgid "Virtual machine (ID)" +msgstr "Sanal makine (ID)" + +#: ipam/filtersets.py:593 vpn/filtersets.py:97 vpn/filtersets.py:368 +msgid "Interface (name)" +msgstr "Arayüz (isim)" + +#: ipam/filtersets.py:598 vpn/filtersets.py:102 vpn/filtersets.py:373 +msgid "Interface (ID)" +msgstr "Arayüz (ID)" + +#: ipam/filtersets.py:604 vpn/filtersets.py:108 vpn/filtersets.py:379 +msgid "VM interface (name)" +msgstr "VM arabirimi (isim)" + +#: ipam/filtersets.py:609 vpn/filtersets.py:113 +msgid "VM interface (ID)" +msgstr "VM arabirimi (ID)" + +#: ipam/filtersets.py:614 +msgid "FHRP group (ID)" +msgstr "FHRP grubu (ID)" + +#: ipam/filtersets.py:618 +msgid "Is assigned to an interface" +msgstr "Bir arayüze atanır" + +#: ipam/filtersets.py:622 +msgid "Is assigned" +msgstr "Atanmıştır" + +#: ipam/filtersets.py:1047 +msgid "IP address (ID)" +msgstr "IP adresi (ID)" + +#: ipam/filtersets.py:1053 ipam/models/ip.py:787 +msgid "IP address" +msgstr "IP adresi" + +#: ipam/filtersets.py:1079 +msgid "Primary IPv4 (ID)" +msgstr "Birincil IPv4 (ID)" + +#: ipam/filtersets.py:1084 +msgid "Primary IPv6 (ID)" +msgstr "Birincil IPv6 (ID)" + +#: ipam/forms/bulk_create.py:14 +msgid "Address pattern" +msgstr "Adres deseni" + +#: ipam/forms/bulk_edit.py:85 +msgid "Is private" +msgstr "Özeldir" + +#: ipam/forms/bulk_edit.py:106 ipam/forms/bulk_edit.py:135 +#: ipam/forms/bulk_edit.py:160 ipam/forms/bulk_import.py:88 +#: ipam/forms/bulk_import.py:108 ipam/forms/bulk_import.py:128 +#: ipam/forms/filtersets.py:109 ipam/forms/filtersets.py:124 +#: ipam/forms/filtersets.py:147 ipam/forms/model_forms.py:93 +#: ipam/forms/model_forms.py:108 ipam/forms/model_forms.py:130 +#: ipam/forms/model_forms.py:148 ipam/models/asns.py:31 +#: ipam/models/asns.py:103 ipam/models/ip.py:70 ipam/models/ip.py:89 +#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 +#: templates/ipam/aggregate.html:19 templates/ipam/asn.html:28 +#: templates/ipam/asnrange.html:20 templates/ipam/rir.html:20 +msgid "RIR" +msgstr "ZIVIR" + +#: ipam/forms/bulk_edit.py:168 +msgid "Date added" +msgstr "Eklenen tarih" + +#: ipam/forms/bulk_edit.py:229 +msgid "Prefix length" +msgstr "Önek uzunluğu" + +#: ipam/forms/bulk_edit.py:252 ipam/forms/filtersets.py:236 +#: templates/ipam/prefix.html:86 +msgid "Is a pool" +msgstr "Havuz mu" + +#: ipam/forms/bulk_edit.py:349 ipam/models/ip.py:771 +msgid "DNS name" +msgstr "DNS adı" + +#: ipam/forms/bulk_edit.py:370 ipam/forms/bulk_edit.py:569 +#: ipam/forms/bulk_import.py:393 ipam/forms/bulk_import.py:477 +#: ipam/forms/bulk_import.py:503 ipam/forms/filtersets.py:376 +#: ipam/forms/filtersets.py:511 templates/ipam/fhrpgroup.html:23 +#: templates/ipam/inc/panels/fhrp_groups.html:11 +#: templates/ipam/service.html:35 templates/ipam/servicetemplate.html:20 +msgid "Protocol" +msgstr "Protokol" + +#: ipam/forms/bulk_edit.py:377 ipam/forms/filtersets.py:383 +#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:27 +msgid "Group ID" +msgstr "Grup Kimliği" + +#: ipam/forms/bulk_edit.py:382 ipam/forms/filtersets.py:388 +#: wireless/forms/bulk_edit.py:67 wireless/forms/bulk_edit.py:114 +#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 +#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 +#: wireless/forms/filtersets.py:53 wireless/forms/filtersets.py:87 +msgid "Authentication type" +msgstr "Kimlik doğrulama türü" + +#: ipam/forms/bulk_edit.py:387 ipam/forms/filtersets.py:392 +msgid "Authentication key" +msgstr "Kimlik doğrulama anahtarı" + +#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:369 +#: ipam/forms/model_forms.py:455 netbox/navigation/menu.py:376 +#: templates/ipam/fhrpgroup.html:51 +#: templates/wireless/inc/authentication_attrs.html:5 +#: wireless/forms/bulk_edit.py:90 wireless/forms/bulk_edit.py:137 +#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: wireless/forms/model_forms.py:56 wireless/forms/model_forms.py:161 +msgid "Authentication" +msgstr "Kimlik Doğrulama" + +#: ipam/forms/bulk_edit.py:414 +msgid "Minimum child VLAN VID" +msgstr "Minimum çocuk VLAN VID" + +#: ipam/forms/bulk_edit.py:420 +msgid "Maximum child VLAN VID" +msgstr "Maksimum çocuk VLAN VID" + +#: ipam/forms/bulk_edit.py:428 ipam/forms/model_forms.py:527 +msgid "Scope type" +msgstr "Kapsam türü" + +#: ipam/forms/bulk_edit.py:489 ipam/forms/model_forms.py:600 +#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:39 +msgid "Scope" +msgstr "Kapsam" + +#: ipam/forms/bulk_edit.py:560 +msgid "Site & Group" +msgstr "Site ve Grup" + +#: ipam/forms/bulk_edit.py:574 ipam/forms/model_forms.py:663 +#: ipam/forms/model_forms.py:697 ipam/tables/services.py:19 +#: ipam/tables/services.py:49 templates/ipam/service.html:39 +#: templates/ipam/servicetemplate.html:24 +msgid "Ports" +msgstr "Limanlar" + +#: ipam/forms/bulk_import.py:47 +msgid "Import route targets" +msgstr "Rota hedeflerini içe aktarma" + +#: ipam/forms/bulk_import.py:53 +msgid "Export route targets" +msgstr "Rota hedeflerini dışa aktarma" + +#: ipam/forms/bulk_import.py:91 ipam/forms/bulk_import.py:111 +#: ipam/forms/bulk_import.py:131 +msgid "Assigned RIR" +msgstr "Atanmış RIR" + +#: ipam/forms/bulk_import.py:181 +msgid "VLAN's group (if any)" +msgstr "VLAN grubu (varsa)" + +#: ipam/forms/bulk_import.py:184 ipam/forms/model_forms.py:219 +#: ipam/models/vlans.py:214 ipam/tables/ip.py:254 +#: templates/ipam/prefix.html:61 templates/ipam/vlan.html:13 +#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 +#: templates/vpn/l2vpntermination_edit.html:17 +#: templates/wireless/wirelesslan.html:31 vpn/forms/bulk_import.py:304 +#: vpn/forms/filtersets.py:280 vpn/forms/model_forms.py:427 +#: wireless/forms/bulk_edit.py:54 wireless/forms/bulk_import.py:48 +#: wireless/forms/model_forms.py:49 wireless/models.py:101 +msgid "VLAN" +msgstr "VLAN" + +#: ipam/forms/bulk_import.py:307 +msgid "Parent device of assigned interface (if any)" +msgstr "Atanan arayüzün ana cihazı (varsa)" + +#: ipam/forms/bulk_import.py:310 ipam/forms/bulk_import.py:496 +#: ipam/forms/model_forms.py:691 virtualization/filtersets.py:284 +#: virtualization/filtersets.py:323 virtualization/forms/bulk_edit.py:199 +#: virtualization/forms/bulk_edit.py:325 +#: virtualization/forms/bulk_import.py:146 +#: virtualization/forms/bulk_import.py:207 +#: virtualization/forms/filtersets.py:204 +#: virtualization/forms/filtersets.py:240 +#: virtualization/forms/model_forms.py:291 vpn/forms/bulk_import.py:93 +#: vpn/forms/bulk_import.py:290 +msgid "Virtual machine" +msgstr "Sanal makine" + +#: ipam/forms/bulk_import.py:314 +msgid "Parent VM of assigned interface (if any)" +msgstr "Atanan arabirimin üst VM'si (varsa)" + +#: ipam/forms/bulk_import.py:321 +msgid "Assigned interface" +msgstr "Atanmış arayüz" + +#: ipam/forms/bulk_import.py:324 +msgid "Is primary" +msgstr "Birincildir" + +#: ipam/forms/bulk_import.py:325 +msgid "Make this the primary IP for the assigned device" +msgstr "Bunu atanan cihaz için birincil IP yapın" + +#: ipam/forms/bulk_import.py:364 +msgid "No device or virtual machine specified; cannot set as primary IP" +msgstr "" +"Aygıt veya sanal makine belirtilmemiş; birincil IP olarak ayarlanamıyor" + +#: ipam/forms/bulk_import.py:368 +msgid "No interface specified; cannot set as primary IP" +msgstr "Arayüz belirtilmedi; birincil IP olarak ayarlanamıyor" + +#: ipam/forms/bulk_import.py:397 +msgid "Auth type" +msgstr "Kimlik doğrulama türü" + +#: ipam/forms/bulk_import.py:412 +msgid "Scope type (app & model)" +msgstr "Kapsam türü (uygulama ve model)" + +#: ipam/forms/bulk_import.py:418 +#, python-brace-format +msgid "Minimum child VLAN VID (default: {minimum})" +msgstr "Minimum çocuk VLAN VID (varsayılan: {minimum})" + +#: ipam/forms/bulk_import.py:424 +#, python-brace-format +msgid "Maximum child VLAN VID (default: {maximum})" +msgstr "Maksimum alt VLAN VID (varsayılan: {maximum})" + +#: ipam/forms/bulk_import.py:448 +msgid "Assigned VLAN group" +msgstr "Atanmış VLAN grubu" + +#: ipam/forms/bulk_import.py:479 ipam/forms/bulk_import.py:505 +msgid "IP protocol" +msgstr "IP protokolü" + +#: ipam/forms/bulk_import.py:493 +msgid "Required if not assigned to a VM" +msgstr "Bir VM'ye atanmadıysa gereklidir" + +#: ipam/forms/bulk_import.py:500 +msgid "Required if not assigned to a device" +msgstr "Bir cihaza atanmadıysa gereklidir" + +#: ipam/forms/bulk_import.py:525 +#, python-brace-format +msgid "{ip} is not assigned to this device/VM." +msgstr "{ip} bu cihaza/VM'ye atanmamıştır." + +#: ipam/forms/filtersets.py:46 ipam/forms/model_forms.py:60 +#: netbox/navigation/menu.py:177 vpn/forms/model_forms.py:403 +msgid "Route Targets" +msgstr "Rota Hedefleri" + +#: ipam/forms/filtersets.py:52 ipam/forms/model_forms.py:47 +#: vpn/forms/filtersets.py:221 vpn/forms/model_forms.py:390 +msgid "Import targets" +msgstr "Hedefleri içe aktarma" + +#: ipam/forms/filtersets.py:57 ipam/forms/model_forms.py:52 +#: vpn/forms/filtersets.py:226 vpn/forms/model_forms.py:395 +msgid "Export targets" +msgstr "İhracat hedefleri" + +#: ipam/forms/filtersets.py:72 +msgid "Imported by VRF" +msgstr "VRF tarafından ithal" + +#: ipam/forms/filtersets.py:77 +msgid "Exported by VRF" +msgstr "VRF tarafından ihraç edildi" + +#: ipam/forms/filtersets.py:86 ipam/tables/ip.py:89 templates/ipam/rir.html:33 +msgid "Private" +msgstr "Özel" + +#: ipam/forms/filtersets.py:104 ipam/forms/filtersets.py:186 +#: ipam/forms/filtersets.py:261 ipam/forms/filtersets.py:312 +msgid "Address family" +msgstr "Adres ailesi" + +#: ipam/forms/filtersets.py:118 templates/ipam/asnrange.html:26 +msgid "Range" +msgstr "Menzil" + +#: ipam/forms/filtersets.py:127 +msgid "Start" +msgstr "Başlat" + +#: ipam/forms/filtersets.py:131 +msgid "End" +msgstr "Bitiş" + +#: ipam/forms/filtersets.py:181 +msgid "Search within" +msgstr "İçinde ara" + +#: ipam/forms/filtersets.py:202 ipam/forms/filtersets.py:328 +msgid "Present in VRF" +msgstr "VRF'de mevcut" + +#: ipam/forms/filtersets.py:297 +msgid "Device/VM" +msgstr "Cihaz/VM" + +#: ipam/forms/filtersets.py:333 +msgid "Assigned Device" +msgstr "Atanan Aygıt" + +#: ipam/forms/filtersets.py:338 +msgid "Assigned VM" +msgstr "Atanmış VM" + +#: ipam/forms/filtersets.py:352 +msgid "Assigned to an interface" +msgstr "Bir arayüze atandı" + +#: ipam/forms/filtersets.py:359 templates/ipam/ipaddress.html:54 +msgid "DNS Name" +msgstr "DNS Adı" + +#: ipam/forms/filtersets.py:401 ipam/forms/filtersets.py:494 +#: ipam/models/vlans.py:156 templates/ipam/vlan.html:34 +msgid "VLAN ID" +msgstr "VLAN KİMLİĞİ" + +#: ipam/forms/filtersets.py:433 +msgid "Minimum VID" +msgstr "Minimum VID" + +#: ipam/forms/filtersets.py:439 +msgid "Maximum VID" +msgstr "Maksimum VID" + +#: ipam/forms/filtersets.py:516 +msgid "Port" +msgstr "Liman" + +#: ipam/forms/filtersets.py:537 ipam/tables/vlans.py:191 +#: templates/ipam/ipaddress_edit.html:47 templates/ipam/service_create.html:22 +#: templates/ipam/service_edit.html:21 +#: templates/virtualization/virtualdisk.html:22 +#: templates/virtualization/virtualmachine.html:13 +#: templates/virtualization/vminterface.html:24 +#: templates/vpn/l2vpntermination_edit.html:27 +#: templates/vpn/tunneltermination.html:26 +#: virtualization/forms/filtersets.py:189 +#: virtualization/forms/filtersets.py:234 +#: virtualization/forms/model_forms.py:223 +#: virtualization/tables/virtualmachines.py:115 +#: virtualization/tables/virtualmachines.py:168 vpn/choices.py:45 +#: vpn/forms/filtersets.py:289 vpn/forms/model_forms.py:161 +#: vpn/forms/model_forms.py:172 vpn/forms/model_forms.py:269 +msgid "Virtual Machine" +msgstr "Sanal Makine" + +#: ipam/forms/model_forms.py:113 ipam/tables/ip.py:116 +#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:39 +msgid "Aggregate" +msgstr "Agrega" + +#: ipam/forms/model_forms.py:134 templates/ipam/asnrange.html:12 +msgid "ASN Range" +msgstr "ASN Aralığı" + +#: ipam/forms/model_forms.py:230 +msgid "Site/VLAN Assignment" +msgstr "Site/VLAN Ataması" + +#: ipam/forms/model_forms.py:256 templates/ipam/iprange.html:11 +msgid "IP Range" +msgstr "IP Aralığı" + +#: ipam/forms/model_forms.py:285 ipam/forms/model_forms.py:454 +#: templates/ipam/fhrpgroup.html:19 templates/ipam/ipaddress_edit.html:52 +msgid "FHRP Group" +msgstr "FHRP Grubu" + +#: ipam/forms/model_forms.py:300 +msgid "Make this the primary IP for the device/VM" +msgstr "Bunu cihaz/VM için birincil IP yapın" + +#: ipam/forms/model_forms.py:351 +msgid "An IP address can only be assigned to a single object." +msgstr "IP adresi yalnızca tek bir nesneye atanabilir." + +#: ipam/forms/model_forms.py:357 ipam/models/ip.py:877 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Üst nesne için birincil IP olarak belirlenirken IP adresi yeniden atanamıyor" + +#: ipam/forms/model_forms.py:367 +msgid "" +"Only IP addresses assigned to an interface can be designated as primary IPs." +msgstr "" +"Yalnızca bir arayüze atanan IP adresleri birincil IP olarak belirlenebilir." + +#: ipam/forms/model_forms.py:373 +#, python-brace-format +msgid "{ip} is a network ID, which may not be assigned to an interface." +msgstr "{ip} bir arayüze atanamayacak bir ağ kimliğidir." + +#: ipam/forms/model_forms.py:379 +#, python-brace-format +msgid "" +"{ip} is a broadcast address, which may not be assigned to an interface." +msgstr "{ip} bir arayüze atanamayacak bir yayın adresidir." + +#: ipam/forms/model_forms.py:456 +msgid "Virtual IP Address" +msgstr "Sanal IP Adresi" + +#: ipam/forms/model_forms.py:598 ipam/forms/model_forms.py:637 +#: ipam/tables/ip.py:250 templates/ipam/vlan_edit.html:37 +#: templates/ipam/vlangroup.html:27 +msgid "VLAN Group" +msgstr "VLAN Grubu" + +#: ipam/forms/model_forms.py:599 +msgid "Child VLANs" +msgstr "Çocuk VLAN'ları" + +#: ipam/forms/model_forms.py:668 ipam/forms/model_forms.py:702 +msgid "" +"Comma-separated list of one or more port numbers. A range may be specified " +"using a hyphen." +msgstr "" +"Bir veya daha fazla bağlantı noktası numarasının virgülle ayrılmış listesi. " +"Bir aralık bir tire kullanılarak belirtilebilir." + +#: ipam/forms/model_forms.py:673 templates/ipam/servicetemplate.html:12 +msgid "Service Template" +msgstr "Hizmet Şablonu" + +#: ipam/forms/model_forms.py:724 +msgid "Service template" +msgstr "Hizmet şablonu" + +#: ipam/models/asns.py:34 +msgid "start" +msgstr "başlangıç" + +#: ipam/models/asns.py:51 +msgid "ASN range" +msgstr "ASN aralığı" + +#: ipam/models/asns.py:52 +msgid "ASN ranges" +msgstr "ASN aralıkları" + +#: ipam/models/asns.py:72 +#, python-brace-format +msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." +msgstr "ASN'yi başlatma ({start}) ASN sonundan daha düşük olmalıdır ({end})." + +#: ipam/models/asns.py:104 +msgid "Regional Internet Registry responsible for this AS number space" +msgstr "Bu AS numara alanından sorumlu Bölgesel İnternet Kaydı" + +#: ipam/models/asns.py:109 +msgid "16- or 32-bit autonomous system number" +msgstr "16 veya 32 bit otonom sistem numarası" + +#: ipam/models/fhrp.py:22 +msgid "group ID" +msgstr "grup kimliği" + +#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +msgid "protocol" +msgstr "protokol" + +#: ipam/models/fhrp.py:38 wireless/models.py:27 +msgid "authentication type" +msgstr "kimlik doğrulama türü" + +#: ipam/models/fhrp.py:43 +msgid "authentication key" +msgstr "kimlik doğrulama anahtarı" + +#: ipam/models/fhrp.py:56 +msgid "FHRP group" +msgstr "FHRP grubu" + +#: ipam/models/fhrp.py:57 +msgid "FHRP groups" +msgstr "FHRP grupları" + +#: ipam/models/fhrp.py:93 tenancy/models/contacts.py:134 +msgid "priority" +msgstr "öncelik" + +#: ipam/models/fhrp.py:113 +msgid "FHRP group assignment" +msgstr "FHRP grup ataması" + +#: ipam/models/fhrp.py:114 +msgid "FHRP group assignments" +msgstr "FHRP grup ödevleri" + +#: ipam/models/ip.py:64 +msgid "private" +msgstr "özel" + +#: ipam/models/ip.py:65 +msgid "IP space managed by this RIR is considered private" +msgstr "Bu RIR tarafından yönetilen IP alanı özel olarak kabul edilir" + +#: ipam/models/ip.py:71 netbox/navigation/menu.py:170 +msgid "RIRs" +msgstr "RIR'ler" + +#: ipam/models/ip.py:83 +msgid "IPv4 or IPv6 network" +msgstr "IPv4 veya IPv6 ağı" + +#: ipam/models/ip.py:90 +msgid "Regional Internet Registry responsible for this IP space" +msgstr "Bu IP alanından sorumlu Bölgesel İnternet Kaydı" + +#: ipam/models/ip.py:100 +msgid "date added" +msgstr "tarih eklendi" + +#: ipam/models/ip.py:114 +msgid "aggregate" +msgstr "toplamak" + +#: ipam/models/ip.py:115 +msgid "aggregates" +msgstr "toplar" + +#: ipam/models/ip.py:131 +msgid "Cannot create aggregate with /0 mask." +msgstr "/0 maskesi ile toplama oluşturulamıyor." + +#: ipam/models/ip.py:143 +#, python-brace-format +msgid "" +"Aggregates cannot overlap. {prefix} is already covered by an existing " +"aggregate ({aggregate})." +msgstr "" +"Agremalar üst üste gelemez. {prefix} zaten mevcut bir toplama tarafından " +"kapsanmıştır ({aggregate})." + +#: ipam/models/ip.py:157 +#, python-brace-format +msgid "" +"Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " +"({aggregate})." +msgstr "" +"Önekler toplamalarla örtüşemez. {prefix} mevcut bir toplamı kapsar " +"({aggregate})." + +#: ipam/models/ip.py:199 ipam/models/ip.py:736 vpn/models/tunnels.py:114 +msgid "role" +msgstr "rol" + +#: ipam/models/ip.py:200 +msgid "roles" +msgstr "rolleri" + +#: ipam/models/ip.py:216 ipam/models/ip.py:292 +msgid "prefix" +msgstr "önek" + +#: ipam/models/ip.py:217 +msgid "IPv4 or IPv6 network with mask" +msgstr "Maskeli IPv4 veya IPv6 ağı" + +#: ipam/models/ip.py:253 +msgid "Operational status of this prefix" +msgstr "Bu önekin operasyonel durumu" + +#: ipam/models/ip.py:261 +msgid "The primary function of this prefix" +msgstr "Bu önekin birincil işlevi" + +#: ipam/models/ip.py:264 +msgid "is a pool" +msgstr "bir havuz" + +#: ipam/models/ip.py:266 +msgid "All IP addresses within this prefix are considered usable" +msgstr "Bu önek içindeki tüm IP adresleri kullanılabilir kabul edilir" + +#: ipam/models/ip.py:269 ipam/models/ip.py:536 +msgid "mark utilized" +msgstr "kullanılan işaret" + +#: ipam/models/ip.py:293 +msgid "prefixes" +msgstr "önekleri" + +#: ipam/models/ip.py:316 +msgid "Cannot create prefix with /0 mask." +msgstr "/0 maskesi ile önek oluşturulamıyor." + +#: ipam/models/ip.py:323 ipam/models/ip.py:854 +#, python-brace-format +msgid "VRF {vrf}" +msgstr "VRF {vrf}" + +#: ipam/models/ip.py:323 ipam/models/ip.py:854 +msgid "global table" +msgstr "küresel tablo" + +#: ipam/models/ip.py:325 +#, python-brace-format +msgid "Duplicate prefix found in {table}: {prefix}" +msgstr "Yinelenen önek şurada bulundu {table}: {prefix}" + +#: ipam/models/ip.py:494 +msgid "start address" +msgstr "başlangıç adresi" + +#: ipam/models/ip.py:495 ipam/models/ip.py:499 ipam/models/ip.py:711 +msgid "IPv4 or IPv6 address (with mask)" +msgstr "IPv4 veya IPv6 adresi (maske ile)" + +#: ipam/models/ip.py:498 +msgid "end address" +msgstr "bitiş adresi" + +#: ipam/models/ip.py:525 +msgid "Operational status of this range" +msgstr "Bu aralığın çalışma durumu" + +#: ipam/models/ip.py:533 +msgid "The primary function of this range" +msgstr "Bu aralığın birincil işlevi" + +#: ipam/models/ip.py:547 +msgid "IP range" +msgstr "IP aralığı" + +#: ipam/models/ip.py:548 +msgid "IP ranges" +msgstr "IP aralıkları" + +#: ipam/models/ip.py:564 +msgid "Starting and ending IP address versions must match" +msgstr "Başlangıç ve bitiş IP adresi sürümleri eşleşmelidir" + +#: ipam/models/ip.py:570 +msgid "Starting and ending IP address masks must match" +msgstr "Başlangıç ve bitiş IP adresi maskeleri eşleşmelidir" + +#: ipam/models/ip.py:577 +#, python-brace-format +msgid "" +"Ending address must be lower than the starting address ({start_address})" +msgstr "" +"Bitiş adresi başlangıç adresinden daha düşük olmalıdır ({start_address})" + +#: ipam/models/ip.py:589 +#, python-brace-format +msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" +msgstr "" +"Tanımlanan adresler aralık ile örtüşüyor {overlapping_range} VRF'de {vrf}" + +#: ipam/models/ip.py:598 +#, python-brace-format +msgid "Defined range exceeds maximum supported size ({max_size})" +msgstr "Tanımlanan aralık maksimum desteklenen boyutu aşıyor ({max_size})" + +#: ipam/models/ip.py:710 tenancy/models/contacts.py:82 +msgid "address" +msgstr "adres" + +#: ipam/models/ip.py:733 +msgid "The operational status of this IP" +msgstr "Bu IP'nin operasyonel durumu" + +#: ipam/models/ip.py:740 +msgid "The functional role of this IP" +msgstr "Bu IP'nin işlevsel rolü" + +#: ipam/models/ip.py:764 templates/ipam/ipaddress.html:75 +msgid "NAT (inside)" +msgstr "NAT (iç)" + +#: ipam/models/ip.py:765 +msgid "The IP for which this address is the \"outside\" IP" +msgstr "Bu adresin “dış” IP olduğu IP" + +#: ipam/models/ip.py:772 +msgid "Hostname or FQDN (not case-sensitive)" +msgstr "Ana bilgisayar adı veya FQDN (büyük/küçük harfe duyarlı değil)" + +#: ipam/models/ip.py:788 ipam/models/services.py:94 +msgid "IP addresses" +msgstr "IP adresleri" + +#: ipam/models/ip.py:844 +msgid "Cannot create IP address with /0 mask." +msgstr "/0 maskesi ile IP adresi oluşturulamıyor." + +#: ipam/models/ip.py:856 +#, python-brace-format +msgid "Duplicate IP address found in {table}: {ipaddress}" +msgstr "Yinelenen IP adresi şurada bulundu {table}: {ipaddress}" + +#: ipam/models/ip.py:883 +msgid "Only IPv6 addresses can be assigned SLAAC status" +msgstr "Yalnızca IPv6 adreslerine SLAAC durumu atanabilir" + +#: ipam/models/services.py:33 +msgid "port numbers" +msgstr "port numaraları" + +#: ipam/models/services.py:59 +msgid "service template" +msgstr "hizmet şablonu" + +#: ipam/models/services.py:60 +msgid "service templates" +msgstr "servis şablonları" + +#: ipam/models/services.py:95 +msgid "The specific IP addresses (if any) to which this service is bound" +msgstr "Bu hizmetin bağlı olduğu belirli IP adresleri (varsa)" + +#: ipam/models/services.py:102 +msgid "service" +msgstr "hizmet" + +#: ipam/models/services.py:103 +msgid "services" +msgstr "servisler" + +#: ipam/models/services.py:117 +msgid "" +"A service cannot be associated with both a device and a virtual machine." +msgstr "Bir hizmet hem aygıt hem de sanal makine ile ilişkilendirilemez." + +#: ipam/models/services.py:119 +msgid "" +"A service must be associated with either a device or a virtual machine." +msgstr "Bir hizmet, bir aygıt veya sanal makine ile ilişkilendirilmelidir." + +#: ipam/models/vlans.py:49 +msgid "minimum VLAN ID" +msgstr "minimum VLAN kimliği" + +#: ipam/models/vlans.py:55 +msgid "Lowest permissible ID of a child VLAN" +msgstr "Çocuk VLAN'ın izin verilen en düşük kimliği" + +#: ipam/models/vlans.py:58 +msgid "maximum VLAN ID" +msgstr "maksimum VLAN kimliği" + +#: ipam/models/vlans.py:64 +msgid "Highest permissible ID of a child VLAN" +msgstr "Çocuk VLAN'ın izin verilen en yüksek kimliği" + +#: ipam/models/vlans.py:85 +msgid "VLAN groups" +msgstr "VLAN grupları" + +#: ipam/models/vlans.py:95 +msgid "Cannot set scope_type without scope_id." +msgstr "scope_id olmadan scope_type ayarlanamıyor." + +#: ipam/models/vlans.py:97 +msgid "Cannot set scope_id without scope_type." +msgstr "scope_type olmadan scope_id ayarlanamıyor." + +#: ipam/models/vlans.py:102 +msgid "Maximum child VID must be greater than or equal to minimum child VID" +msgstr "" +"Maksimum çocuk VID, minimum çocuk VID'den büyük veya ona eşit olmalıdır" + +#: ipam/models/vlans.py:145 +msgid "The specific site to which this VLAN is assigned (if any)" +msgstr "Bu VLAN'ın atandığı belirli site (varsa)" + +#: ipam/models/vlans.py:153 +msgid "VLAN group (optional)" +msgstr "VLAN grubu (isteğe bağlı)" + +#: ipam/models/vlans.py:161 +msgid "Numeric VLAN ID (1-4094)" +msgstr "Sayısal VLAN Kimliği (1-4094)" + +#: ipam/models/vlans.py:179 +msgid "Operational status of this VLAN" +msgstr "Bu VLAN'ın operasyonel durumu" + +#: ipam/models/vlans.py:187 +msgid "The primary function of this VLAN" +msgstr "Bu VLAN'ın birincil işlevi" + +#: ipam/models/vlans.py:215 ipam/tables/ip.py:175 ipam/tables/vlans.py:78 +#: ipam/views.py:960 netbox/navigation/menu.py:181 +#: netbox/navigation/menu.py:183 +msgid "VLANs" +msgstr "VLAN'lar" + +#: ipam/models/vlans.py:230 +#, python-brace-format +msgid "" +"VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " +"site {site}." +msgstr "" +"VLAN gruba atandı {group} (kapsam: {scope}); siteye de atanamaz {site}." + +#: ipam/models/vlans.py:238 +#, python-brace-format +msgid "VID must be between {minimum} and {maximum} for VLANs in group {group}" +msgstr "" +"VID arasında olmalı {minimum} ve {maximum} gruptaki VLAN'lar için {group}" + +#: ipam/models/vrfs.py:30 +msgid "route distinguisher" +msgstr "rota ayırt edici" + +#: ipam/models/vrfs.py:31 +msgid "Unique route distinguisher (as defined in RFC 4364)" +msgstr "Benzersiz rota ayırt edici (RFC 4364'te tanımlandığı gibi)" + +#: ipam/models/vrfs.py:42 +msgid "enforce unique space" +msgstr "benzersiz alanı zorunlu kılmak" + +#: ipam/models/vrfs.py:43 +msgid "Prevent duplicate prefixes/IP addresses within this VRF" +msgstr "Bu VRF içinde yinelenen önek/IP adreslerini önleyin" + +#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:174 +#: netbox/navigation/menu.py:176 +msgid "VRFs" +msgstr "VRF'ler" + +#: ipam/models/vrfs.py:82 +msgid "Route target value (formatted in accordance with RFC 4360)" +msgstr "Rota hedef değeri (RFC 4360'a göre biçimlendirilmiş)" + +#: ipam/models/vrfs.py:94 +msgid "route target" +msgstr "rota hedefi" + +#: ipam/models/vrfs.py:95 +msgid "route targets" +msgstr "rota hedefleri" + +#: ipam/tables/asn.py:52 +msgid "ASDOT" +msgstr "ASDOT" + +#: ipam/tables/asn.py:57 +msgid "Site Count" +msgstr "Site Sayısı" + +#: ipam/tables/asn.py:62 +msgid "Provider Count" +msgstr "Sağlayıcı Sayısı" + +#: ipam/tables/ip.py:94 netbox/navigation/menu.py:167 +#: netbox/navigation/menu.py:169 +msgid "Aggregates" +msgstr "Agregalar" + +#: ipam/tables/ip.py:124 +msgid "Added" +msgstr "Eklendi" + +#: ipam/tables/ip.py:127 ipam/tables/ip.py:165 ipam/tables/vlans.py:138 +#: ipam/views.py:349 netbox/navigation/menu.py:153 +#: netbox/navigation/menu.py:155 templates/ipam/vlan.html:87 +msgid "Prefixes" +msgstr "Önekler" + +#: ipam/tables/ip.py:130 ipam/tables/ip.py:267 ipam/tables/ip.py:320 +#: ipam/tables/vlans.py:82 templates/dcim/device.html:263 +#: templates/ipam/aggregate.html:25 templates/ipam/iprange.html:32 +#: templates/ipam/prefix.html:100 +msgid "Utilization" +msgstr "Kullanımı" + +#: ipam/tables/ip.py:170 netbox/navigation/menu.py:149 +msgid "IP Ranges" +msgstr "IP Aralıkları" + +#: ipam/tables/ip.py:220 +msgid "Prefix (Flat)" +msgstr "Önek (Düz)" + +#: ipam/tables/ip.py:224 templates/dcim/rack_edit.html:52 +msgid "Depth" +msgstr "Derinlik" + +#: ipam/tables/ip.py:261 +msgid "Pool" +msgstr "Havuz" + +#: ipam/tables/ip.py:264 ipam/tables/ip.py:317 +msgid "Marked Utilized" +msgstr "İşaretli Kullanıldı" + +#: ipam/tables/ip.py:301 +msgid "Start address" +msgstr "Başlangıç adresi" + +#: ipam/tables/ip.py:379 +msgid "NAT (Inside)" +msgstr "NAT (İç)" + +#: ipam/tables/ip.py:384 +msgid "NAT (Outside)" +msgstr "NAT (Dış)" + +#: ipam/tables/ip.py:389 +msgid "Assigned" +msgstr "Atanmış" + +#: ipam/tables/ip.py:424 templates/vpn/l2vpntermination.html:19 +#: vpn/forms/filtersets.py:235 +msgid "Assigned Object" +msgstr "Atanan Nesne" + +#: ipam/tables/vlans.py:68 +msgid "Scope Type" +msgstr "Kapsam Türü" + +#: ipam/tables/vlans.py:107 ipam/tables/vlans.py:210 +#: templates/dcim/inc/interface_vlans_table.html:4 +msgid "VID" +msgstr "VİDEO" + +#: ipam/tables/vrfs.py:30 +msgid "RD" +msgstr "RD" + +#: ipam/tables/vrfs.py:33 +msgid "Unique" +msgstr "Benzersiz" + +#: ipam/tables/vrfs.py:36 vpn/tables/l2vpn.py:27 +msgid "Import Targets" +msgstr "Hedefleri İçe Aktar" + +#: ipam/tables/vrfs.py:41 vpn/tables/l2vpn.py:32 +msgid "Export Targets" +msgstr "İhracat Hedefleri" + +#: ipam/views.py:536 +msgid "Child Prefixes" +msgstr "Çocuk Önekleri" + +#: ipam/views.py:571 +msgid "Child Ranges" +msgstr "Çocuk Aralıkları" + +#: ipam/views.py:888 +msgid "Related IPs" +msgstr "İlgili IP'ler" + +#: ipam/views.py:1111 +msgid "Device Interfaces" +msgstr "Cihaz Arayüzleri" + +#: ipam/views.py:1129 +msgid "VM Interfaces" +msgstr "VM Arayüzleri" + +#: netbox/config/parameters.py:22 templates/core/configrevision.html:111 +msgid "Login banner" +msgstr "Giriş başlığı" + +#: netbox/config/parameters.py:24 +msgid "Additional content to display on the login page" +msgstr "Giriş sayfasında görüntülenecek ek içerik" + +#: netbox/config/parameters.py:33 templates/core/configrevision.html:115 +msgid "Maintenance banner" +msgstr "Bakım afişi" + +#: netbox/config/parameters.py:35 +msgid "Additional content to display when in maintenance mode" +msgstr "Bakım modundayken görüntülenecek ek içerik" + +#: netbox/config/parameters.py:44 templates/core/configrevision.html:119 +msgid "Top banner" +msgstr "En iyi afiş" + +#: netbox/config/parameters.py:46 +msgid "Additional content to display at the top of every page" +msgstr "Her sayfanın üst kısmında görüntülenecek ek içerik" + +#: netbox/config/parameters.py:55 templates/core/configrevision.html:123 +msgid "Bottom banner" +msgstr "Alt afiş" + +#: netbox/config/parameters.py:57 +msgid "Additional content to display at the bottom of every page" +msgstr "Her sayfanın altında görüntülenecek ek içerik" + +#: netbox/config/parameters.py:68 +msgid "Globally unique IP space" +msgstr "Küresel olarak benzersiz IP alanı" + +#: netbox/config/parameters.py:70 +msgid "Enforce unique IP addressing within the global table" +msgstr "Genel tablo içinde benzersiz IP adreslemesini uygulayın" + +#: netbox/config/parameters.py:75 templates/core/configrevision.html:87 +msgid "Prefer IPv4" +msgstr "IPv4'ü tercih et" + +#: netbox/config/parameters.py:77 +msgid "Prefer IPv4 addresses over IPv6" +msgstr "IPv4 adreslerini IPv6 yerine tercih edin" + +#: netbox/config/parameters.py:84 +msgid "Rack unit height" +msgstr "Raf ünitesi yüksekliği" + +#: netbox/config/parameters.py:86 +msgid "Default unit height for rendered rack elevations" +msgstr "Oluşturulan raf yükseklikleri için varsayılan birim yüksekliği" + +#: netbox/config/parameters.py:91 +msgid "Rack unit width" +msgstr "Raf ünitesi genişliği" + +#: netbox/config/parameters.py:93 +msgid "Default unit width for rendered rack elevations" +msgstr "Oluşturulan raf yükseklikleri için varsayılan birim genişliği" + +#: netbox/config/parameters.py:100 +msgid "Powerfeed voltage" +msgstr "Güç besleme gerilimi" + +#: netbox/config/parameters.py:102 +msgid "Default voltage for powerfeeds" +msgstr "Güç beslemeleri için varsayılan voltaj" + +#: netbox/config/parameters.py:107 +msgid "Powerfeed amperage" +msgstr "Güç besleme amperi" + +#: netbox/config/parameters.py:109 +msgid "Default amperage for powerfeeds" +msgstr "Güç beslemeleri için varsayılan amper" + +#: netbox/config/parameters.py:114 +msgid "Powerfeed max utilization" +msgstr "Powerfeed maksimum kullanımı" + +#: netbox/config/parameters.py:116 +msgid "Default max utilization for powerfeeds" +msgstr "Güç beslemeleri için varsayılan maksimum kullanım" + +#: netbox/config/parameters.py:123 templates/core/configrevision.html:99 +msgid "Allowed URL schemes" +msgstr "İzin verilen URL şemaları" + +#: netbox/config/parameters.py:128 +msgid "Permitted schemes for URLs in user-provided content" +msgstr "" +"Kullanıcı tarafından sağlanan içerikteki URL'ler için izin verilen şemalar" + +#: netbox/config/parameters.py:136 +msgid "Default page size" +msgstr "Varsayılan sayfa boyutu" + +#: netbox/config/parameters.py:142 +msgid "Maximum page size" +msgstr "Maksimum sayfa boyutu" + +#: netbox/config/parameters.py:150 templates/core/configrevision.html:151 +msgid "Custom validators" +msgstr "Özel doğrulayıcılar" + +#: netbox/config/parameters.py:152 +msgid "Custom validation rules (JSON)" +msgstr "Özel doğrulama kuralları (JSON)" + +#: netbox/config/parameters.py:160 templates/core/configrevision.html:161 +msgid "Protection rules" +msgstr "Koruma kuralları" + +#: netbox/config/parameters.py:162 +msgid "Deletion protection rules (JSON)" +msgstr "Silme koruma kuralları (JSON)" + +#: netbox/config/parameters.py:172 +msgid "Default preferences" +msgstr "Varsayılan tercihler" + +#: netbox/config/parameters.py:174 +msgid "Default preferences for new users" +msgstr "Yeni kullanıcılar için varsayılan tercihler" + +#: netbox/config/parameters.py:181 templates/core/configrevision.html:197 +msgid "Maintenance mode" +msgstr "Bakım modu" + +#: netbox/config/parameters.py:183 +msgid "Enable maintenance mode" +msgstr "Bakım modunu etkinleştir" + +#: netbox/config/parameters.py:188 templates/core/configrevision.html:201 +msgid "GraphQL enabled" +msgstr "GraphQL etkin" + +#: netbox/config/parameters.py:190 +msgid "Enable the GraphQL API" +msgstr "GraphQL API'sini etkinleştirin" + +#: netbox/config/parameters.py:195 templates/core/configrevision.html:205 +msgid "Changelog retention" +msgstr "Değişiklik günlüğü tutma" + +#: netbox/config/parameters.py:197 +msgid "Days to retain changelog history (set to zero for unlimited)" +msgstr "" +"Değişiklik günlüğü geçmişini korumak için günler (sınırsız olarak sıfıra " +"ayarlayın)" + +#: netbox/config/parameters.py:202 +msgid "Job result retention" +msgstr "İş sonucunun korunması" + +#: netbox/config/parameters.py:204 +msgid "Days to retain job result history (set to zero for unlimited)" +msgstr "" +"İş sonucu geçmişini tutmak için günler (sınırsız olarak sıfıra ayarlayın)" + +#: netbox/config/parameters.py:209 templates/core/configrevision.html:213 +msgid "Maps URL" +msgstr "Haritalar URL'si" + +#: netbox/config/parameters.py:211 +msgid "Base URL for mapping geographic locations" +msgstr "Coğrafi konumları haritalamak için temel URL" + +#: netbox/forms/__init__.py:13 +msgid "Partial match" +msgstr "Kısmi eşleşme" + +#: netbox/forms/__init__.py:14 +msgid "Exact match" +msgstr "Tam eşleşme" + +#: netbox/forms/__init__.py:15 +msgid "Starts with" +msgstr "Şununla başlar" + +#: netbox/forms/__init__.py:16 +msgid "Ends with" +msgstr "İle bitiyor" + +#: netbox/forms/__init__.py:17 +msgid "Regex" +msgstr "Regeks" + +#: netbox/forms/__init__.py:35 +msgid "Object type(s)" +msgstr "Nesne türü (ler)" + +#: netbox/forms/base.py:77 +msgid "Id" +msgstr "Kimlik" + +#: netbox/forms/base.py:116 +msgid "Add tags" +msgstr "Etiket ekle" + +#: netbox/forms/base.py:121 +msgid "Remove tags" +msgstr "Etiketleri kaldır" + +#: netbox/models/features.py:434 +msgid "Remote data source" +msgstr "Uzak veri kaynağı" + +#: netbox/models/features.py:444 +msgid "data path" +msgstr "veri yolu" + +#: netbox/models/features.py:448 +msgid "Path to remote file (relative to data source root)" +msgstr "Uzak dosyanın yolu (veri kaynağı köküne göre)" + +#: netbox/models/features.py:451 +msgid "auto sync enabled" +msgstr "otomatik senkronizasyon etkin" + +#: netbox/models/features.py:453 +msgid "Enable automatic synchronization of data when the data file is updated" +msgstr "" +"Veri dosyası güncellendiğinde verilerin otomatik senkronizasyonunu " +"etkinleştir" + +#: netbox/models/features.py:456 +msgid "date synced" +msgstr "senkronize edilen tarih" + +#: netbox/navigation/menu.py:12 +msgid "Organization" +msgstr "Organizasyon" + +#: netbox/navigation/menu.py:20 +msgid "Site Groups" +msgstr "Site Grupları" + +#: netbox/navigation/menu.py:28 +msgid "Rack Roles" +msgstr "Raf Rolleri" + +#: netbox/navigation/menu.py:32 +msgid "Elevations" +msgstr "Yükselmeler" + +#: netbox/navigation/menu.py:41 +msgid "Tenant Groups" +msgstr "Kiracı Grupları" + +#: netbox/navigation/menu.py:48 +msgid "Contact Groups" +msgstr "İletişim Grupları" + +#: netbox/navigation/menu.py:49 templates/tenancy/contactrole.html:8 +msgid "Contact Roles" +msgstr "İletişim Rolleri" + +#: netbox/navigation/menu.py:50 +msgid "Contact Assignments" +msgstr "İletişim Atamaları" + +#: netbox/navigation/menu.py:64 +msgid "Modules" +msgstr "Modüller" + +#: netbox/navigation/menu.py:65 templates/dcim/devicerole.html:8 +msgid "Device Roles" +msgstr "Cihaz Rolleri" + +#: netbox/navigation/menu.py:68 templates/dcim/device.html:162 +#: templates/dcim/virtualdevicecontext.html:8 +msgid "Virtual Device Contexts" +msgstr "Sanal Cihaz Bağlamları" + +#: netbox/navigation/menu.py:76 +msgid "Manufacturers" +msgstr "İmalatçıları" + +#: netbox/navigation/menu.py:80 +msgid "Device Components" +msgstr "Cihaz Bileşenleri" + +#: netbox/navigation/menu.py:92 templates/dcim/inventoryitemrole.html:8 +msgid "Inventory Item Roles" +msgstr "Envanter Öğesi Rolleri" + +#: netbox/navigation/menu.py:99 netbox/navigation/menu.py:103 +msgid "Connections" +msgstr "Bağlantılar" + +#: netbox/navigation/menu.py:105 +msgid "Cables" +msgstr "Kablolar" + +#: netbox/navigation/menu.py:106 +msgid "Wireless Links" +msgstr "Kablosuz Bağlantılar" + +#: netbox/navigation/menu.py:109 +msgid "Interface Connections" +msgstr "Arayüz Bağlantıları" + +#: netbox/navigation/menu.py:114 +msgid "Console Connections" +msgstr "Konsol Bağlantıları" + +#: netbox/navigation/menu.py:119 +msgid "Power Connections" +msgstr "Güç Bağlantıları" + +#: netbox/navigation/menu.py:135 +msgid "Wireless LAN Groups" +msgstr "Kablosuz LAN Grupları" + +#: netbox/navigation/menu.py:156 +msgid "Prefix & VLAN Roles" +msgstr "Önek ve VLAN Rolleri" + +#: netbox/navigation/menu.py:162 +msgid "ASN Ranges" +msgstr "ASN Aralıkları" + +#: netbox/navigation/menu.py:184 +msgid "VLAN Groups" +msgstr "VLAN Grupları" + +#: netbox/navigation/menu.py:191 +msgid "Service Templates" +msgstr "Hizmet Şablonları" + +#: netbox/navigation/menu.py:192 templates/dcim/device.html:304 +#: templates/ipam/ipaddress.html:122 +#: templates/virtualization/virtualmachine.html:157 +msgid "Services" +msgstr "HİZMETLER" + +#: netbox/navigation/menu.py:199 +msgid "VPN" +msgstr "VPN" + +#: netbox/navigation/menu.py:203 netbox/navigation/menu.py:205 +#: vpn/tables/tunnels.py:24 +msgid "Tunnels" +msgstr "Tüneller" + +#: netbox/navigation/menu.py:206 templates/vpn/tunnelgroup.html:8 +msgid "Tunnel Groups" +msgstr "Tünel Grupları" + +#: netbox/navigation/menu.py:207 +msgid "Tunnel Terminations" +msgstr "Tünel Sonlandırmaları" + +#: netbox/navigation/menu.py:211 netbox/navigation/menu.py:213 +#: vpn/models/l2vpn.py:64 +msgid "L2VPNs" +msgstr "L2VPN'ler" + +#: netbox/navigation/menu.py:214 templates/vpn/l2vpn.html:57 +#: templates/vpn/tunnel.html:73 vpn/tables/tunnels.py:54 +msgid "Terminations" +msgstr "Fesih" + +#: netbox/navigation/menu.py:220 +msgid "IKE Proposals" +msgstr "IKE Teklifleri" + +#: netbox/navigation/menu.py:221 templates/vpn/ikeproposal.html:42 +msgid "IKE Policies" +msgstr "IKE Politikaları" + +#: netbox/navigation/menu.py:222 +msgid "IPSec Proposals" +msgstr "IPSec Önerileri" + +#: netbox/navigation/menu.py:223 templates/vpn/ipsecproposal.html:38 +msgid "IPSec Policies" +msgstr "IPsec İlkeleri" + +#: netbox/navigation/menu.py:224 templates/vpn/ikepolicy.html:39 +#: templates/vpn/ipsecpolicy.html:26 +msgid "IPSec Profiles" +msgstr "IPsec Profilleri" + +#: netbox/navigation/menu.py:231 templates/dcim/device_edit.html:78 +msgid "Virtualization" +msgstr "Sanallaştırma" + +#: netbox/navigation/menu.py:235 netbox/navigation/menu.py:237 +#: virtualization/views.py:186 +msgid "Virtual Machines" +msgstr "Sanal Makineler" + +#: netbox/navigation/menu.py:239 +#: templates/virtualization/virtualmachine.html:177 +#: templates/virtualization/virtualmachine/base.html:32 +#: templates/virtualization/virtualmachine_list.html:21 +#: virtualization/tables/virtualmachines.py:90 virtualization/views.py:389 +msgid "Virtual Disks" +msgstr "Sanal Diskler" + +#: netbox/navigation/menu.py:246 +msgid "Cluster Types" +msgstr "Küme Türleri" + +#: netbox/navigation/menu.py:247 +msgid "Cluster Groups" +msgstr "Küme Grupları" + +#: netbox/navigation/menu.py:261 +msgid "Circuit Types" +msgstr "Devre Türleri" + +#: netbox/navigation/menu.py:265 netbox/navigation/menu.py:267 +msgid "Providers" +msgstr "Sağlayıcılar" + +#: netbox/navigation/menu.py:268 templates/circuits/provider.html:53 +msgid "Provider Accounts" +msgstr "Sağlayıcı Hesapları" + +#: netbox/navigation/menu.py:269 +msgid "Provider Networks" +msgstr "Sağlayıcı Ağları" + +#: netbox/navigation/menu.py:283 +msgid "Power Panels" +msgstr "Güç Panelleri" + +#: netbox/navigation/menu.py:294 +msgid "Configurations" +msgstr "Yapılandırmalar" + +#: netbox/navigation/menu.py:296 +msgid "Config Contexts" +msgstr "Yapılandırma Bağlamları" + +#: netbox/navigation/menu.py:297 +msgid "Config Templates" +msgstr "Yapılandırma Şablonları" + +#: netbox/navigation/menu.py:304 netbox/navigation/menu.py:308 +msgid "Customization" +msgstr "Özelleştirme" + +#: netbox/navigation/menu.py:310 +#: templates/circuits/circuittermination_edit.html:53 +#: templates/dcim/cable_edit.html:77 templates/dcim/device_edit.html:103 +#: templates/dcim/inventoryitem_edit.html:102 templates/dcim/rack_edit.html:81 +#: templates/dcim/virtualchassis_add.html:31 +#: templates/dcim/virtualchassis_edit.html:41 +#: templates/generic/bulk_edit.html:92 templates/htmx/form.html:32 +#: templates/inc/panels/custom_fields.html:7 +#: templates/ipam/ipaddress_bulk_add.html:35 +#: templates/ipam/ipaddress_edit.html:88 templates/ipam/service_create.html:75 +#: templates/ipam/service_edit.html:62 templates/ipam/vlan_edit.html:63 +#: templates/tenancy/contactassignment_edit.html:31 +#: templates/vpn/l2vpntermination_edit.html:51 +msgid "Custom Fields" +msgstr "Özel Alanlar" + +#: netbox/navigation/menu.py:311 +msgid "Custom Field Choices" +msgstr "Özel Alan Seçenekleri" + +#: netbox/navigation/menu.py:312 +msgid "Custom Links" +msgstr "Özel Bağlantılar" + +#: netbox/navigation/menu.py:313 +msgid "Export Templates" +msgstr "Şablonları Dışa Aktar" + +#: netbox/navigation/menu.py:314 +msgid "Saved Filters" +msgstr "Kaydedilen Filtreler" + +#: netbox/navigation/menu.py:316 +msgid "Image Attachments" +msgstr "Görüntü Ekleri" + +#: netbox/navigation/menu.py:320 +msgid "Reports & Scripts" +msgstr "Raporlar ve Komut Dosyaları" + +#: netbox/navigation/menu.py:340 +msgid "Operations" +msgstr "Operasyonlar" + +#: netbox/navigation/menu.py:344 +msgid "Integrations" +msgstr "Entegrasyonlar" + +#: netbox/navigation/menu.py:346 +msgid "Data Sources" +msgstr "Veri Kaynakları" + +#: netbox/navigation/menu.py:347 +msgid "Event Rules" +msgstr "Etkinlik Kuralları" + +#: netbox/navigation/menu.py:348 +msgid "Webhooks" +msgstr "Web kancaları" + +#: netbox/navigation/menu.py:352 netbox/navigation/menu.py:356 +#: netbox/views/generic/feature_views.py:151 +#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +msgid "Jobs" +msgstr "Meslekler" + +#: netbox/navigation/menu.py:362 +msgid "Logging" +msgstr "Günlüğe kaydetme" + +#: netbox/navigation/menu.py:364 +msgid "Journal Entries" +msgstr "Dergi Girişleri" + +#: netbox/navigation/menu.py:365 templates/extras/objectchange.html:8 +#: templates/extras/objectchange_list.html:4 +msgid "Change Log" +msgstr "Değişim Günlüğü" + +#: netbox/navigation/menu.py:372 templates/inc/profile_button.html:18 +msgid "Admin" +msgstr "Yönetici" + +#: netbox/navigation/menu.py:381 templates/users/group.html:27 +#: users/forms/model_forms.py:243 users/forms/model_forms.py:256 +#: users/forms/model_forms.py:310 users/tables.py:105 +msgid "Users" +msgstr "Kullanıcılar" + +#: netbox/navigation/menu.py:404 users/forms/model_forms.py:183 +#: users/forms/model_forms.py:196 users/forms/model_forms.py:315 +#: users/tables.py:35 users/tables.py:109 +msgid "Groups" +msgstr "Gruplar" + +#: netbox/navigation/menu.py:426 templates/account/base.html:21 +#: templates/inc/profile_button.html:39 +msgid "API Tokens" +msgstr "API Belirteçleri" + +#: netbox/navigation/menu.py:433 users/forms/model_forms.py:189 +#: users/forms/model_forms.py:198 users/forms/model_forms.py:249 +#: users/forms/model_forms.py:257 +msgid "Permissions" +msgstr "İzinler" + +#: netbox/navigation/menu.py:445 +msgid "Current Config" +msgstr "Geçerli Yapılandırma" + +#: netbox/navigation/menu.py:451 +msgid "Config Revisions" +msgstr "Yapılandırma Revizyonları" + +#: netbox/navigation/menu.py:491 templates/500.html:35 +#: templates/account/preferences.html:29 +msgid "Plugins" +msgstr "Eklentiler" + +#: netbox/preferences.py:19 +msgid "Color mode" +msgstr "Renk modu" + +#: netbox/preferences.py:21 +msgid "Light" +msgstr "" + +#: netbox/preferences.py:22 +msgid "Dark" +msgstr "" + +#: netbox/preferences.py:27 +msgid "Language" +msgstr "" + +#: netbox/preferences.py:34 +msgid "Page length" +msgstr "Sayfa uzunluğu" + +#: netbox/preferences.py:36 +msgid "The default number of objects to display per page" +msgstr "Sayfa başına görüntülenecek varsayılan nesne sayısı" + +#: netbox/preferences.py:40 +msgid "Paginator placement" +msgstr "Paginator yerleşimi" + +#: netbox/preferences.py:42 +msgid "Bottom" +msgstr "" + +#: netbox/preferences.py:43 +msgid "Top" +msgstr "" + +#: netbox/preferences.py:44 +msgid "Both" +msgstr "" + +#: netbox/preferences.py:46 +msgid "Where the paginator controls will be displayed relative to a table" +msgstr "Paginator kontrollerinin bir tabloya göre görüntüleneceği yer" + +#: netbox/preferences.py:52 +msgid "Data format" +msgstr "Veri biçimi" + +#: netbox/settings.py:726 +msgid "English" +msgstr "" + +#: netbox/settings.py:727 +msgid "Spanish" +msgstr "" + +#: netbox/settings.py:728 +msgid "French" +msgstr "" + +#: netbox/settings.py:729 +msgid "Portuguese" +msgstr "" + +#: netbox/settings.py:730 +msgid "Russian" +msgstr "" + +#: netbox/tables/columns.py:175 +msgid "Toggle all" +msgstr "Tümünü değiştir" + +#: netbox/tables/columns.py:277 templates/inc/profile_button.html:56 +msgid "Toggle Dropdown" +msgstr "Açılır menüyü Aç/Kapat" + +#: netbox/tables/columns.py:542 templates/core/job.html:40 +msgid "Error" +msgstr "Hata" + +#: netbox/tables/tables.py:243 templates/generic/bulk_import.html:115 +msgid "Field" +msgstr "Tarla" + +#: netbox/tables/tables.py:246 +msgid "Value" +msgstr "Değer" + +#: netbox/tables/tables.py:259 +msgid "No results found" +msgstr "Hiçbir sonuç bulunamadı" + +#: netbox/tests/dummy_plugin/navigation.py:29 +msgid "Dummy Plugin" +msgstr "Sahte Eklenti" + +#: netbox/views/generic/feature_views.py:38 +msgid "Changelog" +msgstr "Değişiklik Günlüğü" + +#: netbox/views/generic/feature_views.py:91 +msgid "Journal" +msgstr "dergi" + +#: templates/403.html:4 +msgid "Access Denied" +msgstr "Erişim Reddedildi" + +#: templates/403.html:9 +msgid "You do not have permission to access this page" +msgstr "Bu sayfaya erişim izniniz yok" + +#: templates/404.html:4 +msgid "Page Not Found" +msgstr "Sayfa Bulunamadı" + +#: templates/404.html:9 +msgid "The requested page does not exist" +msgstr "İstenen sayfa mevcut değil" + +#: templates/500.html:7 templates/500.html:18 +msgid "Server Error" +msgstr "Sunucu Hatası" + +#: templates/500.html:23 +msgid "There was a problem with your request. Please contact an administrator" +msgstr "İsteğinizle ilgili bir sorun oluştu. Lütfen bir yöneticiye başvurun" + +#: templates/500.html:28 +msgid "The complete exception is provided below" +msgstr "Tam istisna aşağıda verilmiştir" + +#: templates/500.html:33 +msgid "Python version" +msgstr "Python sürümü" + +#: templates/500.html:34 +msgid "NetBox version" +msgstr "NetBox sürümü" + +#: templates/500.html:36 +msgid "None installed" +msgstr "Yüklü yok" + +#: templates/500.html:39 +msgid "If further assistance is required, please post to the" +msgstr "Daha fazla yardım gerekiyorsa, lütfen şu adrese gönderin" + +#: templates/500.html:39 +msgid "NetBox discussion forum" +msgstr "NetBox tartışma forumu" + +#: templates/500.html:39 +msgid "on GitHub" +msgstr "GitHub'da" + +#: templates/500.html:42 templates/base/40x.html:17 +msgid "Home Page" +msgstr "Ana Sayfa" + +#: templates/account/base.html:7 templates/inc/profile_button.html:24 +#: vpn/forms/bulk_edit.py:256 vpn/forms/filtersets.py:186 +#: vpn/forms/model_forms.py:372 +msgid "Profile" +msgstr "Profil" + +#: templates/account/base.html:13 templates/inc/profile_button.html:34 +msgid "Preferences" +msgstr "Tercihler" + +#: templates/account/password.html:5 +msgid "Change Password" +msgstr "Şifreyi Değiştir" + +#: templates/account/password.html:17 templates/account/preferences.html:82 +#: templates/core/configrevision_restore.html:80 +#: templates/dcim/devicebay_populate.html:34 +#: templates/dcim/virtualchassis_add_member.html:24 +#: templates/dcim/virtualchassis_edit.html:104 +#: templates/extras/object_journal.html:26 templates/extras/script.html:36 +#: templates/generic/bulk_add_component.html:55 +#: templates/generic/bulk_delete.html:46 templates/generic/bulk_edit.html:125 +#: templates/generic/bulk_import.html:53 templates/generic/bulk_import.html:75 +#: templates/generic/bulk_import.html:97 templates/generic/bulk_remove.html:42 +#: templates/generic/bulk_rename.html:44 +#: templates/generic/confirmation_form.html:20 +#: templates/generic/object_edit.html:76 templates/htmx/delete_form.html:53 +#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:31 +#: templates/virtualization/cluster_add_devices.html:30 +msgid "Cancel" +msgstr "İptal" + +#: templates/account/password.html:18 templates/account/preferences.html:83 +#: templates/dcim/devicebay_populate.html:35 +#: templates/dcim/virtualchassis_add_member.html:26 +#: templates/dcim/virtualchassis_edit.html:106 +#: templates/extras/dashboard/widget_add.html:26 +#: templates/extras/dashboard/widget_config.html:19 +#: templates/extras/object_journal.html:27 +#: templates/generic/object_edit.html:66 +#: utilities/templates/helpers/applied_filters.html:16 +#: utilities/templates/helpers/table_config_form.html:40 +msgid "Save" +msgstr "Kaydet" + +#: templates/account/preferences.html:41 +msgid "Table Configurations" +msgstr "Tablo Yapılandırmaları" + +#: templates/account/preferences.html:46 +msgid "Clear table preferences" +msgstr "Tablo tercihlerini temizle" + +#: templates/account/preferences.html:53 +msgid "Toggle All" +msgstr "Tümünü Değiştir" + +#: templates/account/preferences.html:55 +msgid "Table" +msgstr "Tablo" + +#: templates/account/preferences.html:56 +msgid "Ordering" +msgstr "Sipariş" + +#: templates/account/preferences.html:57 +msgid "Columns" +msgstr "Sütunlar" + +#: templates/account/preferences.html:76 templates/dcim/cable_trace.html:113 +#: templates/extras/object_configcontext.html:55 +msgid "None found" +msgstr "Hiçbiri bulunamadı" + +#: templates/account/profile.html:6 +msgid "User Profile" +msgstr "Kullanıcı Profili" + +#: templates/account/profile.html:12 +msgid "Account Details" +msgstr "Hesap Ayrıntıları" + +#: templates/account/profile.html:30 templates/tenancy/contact.html:44 +#: templates/users/user.html:26 tenancy/forms/bulk_edit.py:108 +msgid "Email" +msgstr "E-posta" + +#: templates/account/profile.html:34 templates/users/user.html:30 +msgid "Account Created" +msgstr "Hesap Oluşturuldu" + +#: templates/account/profile.html:38 templates/users/user.html:42 +msgid "Superuser" +msgstr "Süper kullanıcı" + +#: templates/account/profile.html:42 +msgid "Admin Access" +msgstr "Yönetici Erişimi" + +#: templates/account/profile.html:51 templates/users/objectpermission.html:86 +#: templates/users/user.html:51 +msgid "Assigned Groups" +msgstr "Atanan Gruplar" + +#: templates/account/profile.html:56 +#: templates/circuits/circuit_terminations_swap.html:18 +#: templates/circuits/circuit_terminations_swap.html:26 +#: templates/circuits/inc/circuit_termination.html:154 +#: templates/dcim/devicebay.html:66 +#: templates/dcim/inc/panels/inventory_items.html:37 +#: templates/dcim/interface.html:306 templates/dcim/modulebay.html:79 +#: templates/extras/configcontext.html:73 templates/extras/eventrule.html:84 +#: templates/extras/htmx/script_result.html:54 +#: templates/extras/object_configcontext.html:28 +#: templates/extras/objectchange.html:128 +#: templates/extras/objectchange.html:145 templates/extras/webhook.html:79 +#: templates/extras/webhook.html:91 templates/inc/panel_table.html:12 +#: templates/inc/panels/comments.html:12 +#: templates/ipam/inc/panels/fhrp_groups.html:43 templates/users/group.html:32 +#: templates/users/group.html:42 templates/users/objectpermission.html:81 +#: templates/users/objectpermission.html:91 templates/users/user.html:56 +#: templates/users/user.html:66 +msgid "None" +msgstr "Yok" + +#: templates/account/profile.html:66 templates/users/user.html:76 +msgid "Recent Activity" +msgstr "Son Etkinlik" + +#: templates/account/token.html:8 templates/account/token_list.html:6 +msgid "My API Tokens" +msgstr "API Belirteçlerim" + +#: templates/account/token.html:11 templates/account/token.html:19 +#: templates/users/token.html:6 templates/users/token.html:14 +#: users/forms/filtersets.py:121 +msgid "Token" +msgstr "Simge" + +#: templates/account/token.html:40 templates/users/token.html:32 +#: users/forms/bulk_edit.py:87 +msgid "Write enabled" +msgstr "Yazma etkin" + +#: templates/account/token.html:52 templates/users/token.html:44 +msgid "Last used" +msgstr "En son kullanılmış" + +#: templates/account/token_list.html:12 +msgid "Add a Token" +msgstr "Bir Jeton Ekle" + +#: templates/admin/index.html:10 +msgid "System" +msgstr "Sistem" + +#: templates/admin/index.html:14 +msgid "Background Tasks" +msgstr "Arka Plan Görevleri" + +#: templates/admin/index.html:19 +msgid "Installed plugins" +msgstr "Yüklü eklentiler" + +#: templates/base/base.html:28 templates/extras/admin/plugins_list.html:8 +#: templates/home.html:24 +msgid "Home" +msgstr "Ana Sayfa" + +#: templates/base/layout.html:27 templates/base/layout.html:37 +#: templates/login.html:34 +msgid "NetBox logo" +msgstr "NetBox logosu" + +#: templates/base/layout.html:76 +msgid "Debug mode is enabled" +msgstr "Hata ayıklama modu etkinleştirildi" + +#: templates/base/layout.html:77 +msgid "" +"Performance may be limited. Debugging should never be enabled on a " +"production system" +msgstr "" +"Performans sınırlı olabilir. Bir üretim sisteminde hata ayıklama asla " +"etkinleştirilmemelidir" + +#: templates/base/layout.html:83 +msgid "Maintenance Mode" +msgstr "Bakım Modu" + +#: templates/base/layout.html:134 +msgid "Docs" +msgstr "Dokümanlar" + +#: templates/base/layout.html:139 templates/rest_framework/api.html:10 +msgid "REST API" +msgstr "GERİ KALAN APİ" + +#: templates/base/layout.html:144 +msgid "REST API documentation" +msgstr "REST API belgeleri" + +#: templates/base/layout.html:150 +msgid "GraphQL API" +msgstr "GraphQL API'si" + +#: templates/base/layout.html:156 +msgid "Source Code" +msgstr "Kaynak Kodu" + +#: templates/base/layout.html:161 +msgid "Community" +msgstr "Topluluk" + +#: templates/base/sidenav.html:12 templates/base/sidenav.html:17 +msgid "NetBox Logo" +msgstr "NetBox Logosu" + +#: templates/circuits/circuit.html:48 +msgid "Install Date" +msgstr "Yükleme Tarihi" + +#: templates/circuits/circuit.html:52 +msgid "Termination Date" +msgstr "Fesih Tarihi" + +#: templates/circuits/circuit_terminations_swap.html:4 +msgid "Swap Circuit Terminations" +msgstr "Takas Devresi Sonlandırmaları" + +#: templates/circuits/circuit_terminations_swap.html:8 +#, python-format +msgid "Swap these terminations for circuit %(circuit)s?" +msgstr "Devre için bu sonlandırmaları değiştirin %(circuit)s?" + +#: templates/circuits/circuit_terminations_swap.html:14 +msgid "A side" +msgstr "Bir taraf" + +#: templates/circuits/circuit_terminations_swap.html:22 +msgid "Z side" +msgstr "Z tarafı" + +#: templates/circuits/circuittermination_edit.html:9 +#: templates/circuits/inc/circuit_termination.html:81 +#: templates/dcim/frontport.html:128 templates/dcim/interface.html:199 +#: templates/dcim/rearport.html:118 +msgid "Circuit Termination" +msgstr "Devre Sonlandırma" + +#: templates/circuits/circuittermination_edit.html:41 +msgid "Termination Details" +msgstr "Fesih Ayrıntıları" + +#: templates/circuits/circuittype.html:10 +msgid "Add Circuit" +msgstr "Devre Ekle" + +#: templates/circuits/inc/circuit_termination.html:9 +#: templates/dcim/devicetype/component_templates.html:30 +#: templates/dcim/manufacturer.html:11 +#: templates/dcim/moduletype/component_templates.html:30 +#: templates/generic/bulk_add_component.html:8 +#: templates/users/objectpermission.html:41 +#: utilities/templates/buttons/add.html:4 +#: utilities/templates/helpers/table_config_form.html:20 +msgid "Add" +msgstr "Ekle" + +#: templates/circuits/inc/circuit_termination.html:14 +#: templates/circuits/inc/circuit_termination.html:63 +#: templates/dcim/devicetype/component_templates.html:21 +#: templates/dcim/inc/panels/inventory_items.html:24 +#: templates/dcim/moduletype/component_templates.html:21 +#: templates/dcim/powerpanel.html:61 templates/generic/object_edit.html:29 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +#: templates/ipam/inc/panels/fhrp_groups.html:30 +#: utilities/templates/buttons/edit.html:3 +msgid "Edit" +msgstr "Düzenle" + +#: templates/circuits/inc/circuit_termination.html:17 +msgid "Swap" +msgstr "Takas" + +#: templates/circuits/inc/circuit_termination.html:26 +#, python-format +msgid "Termination %(side)s" +msgstr "Fesih %(side)s" + +#: templates/circuits/inc/circuit_termination.html:42 +#: templates/dcim/cable.html:70 templates/dcim/cable.html:76 +#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:76 +msgid "Termination" +msgstr "Fesih" + +#: templates/circuits/inc/circuit_termination.html:46 +#: templates/dcim/consoleport.html:62 templates/dcim/consoleserverport.html:62 +#: templates/dcim/powerfeed.html:122 +msgid "Marked as connected" +msgstr "Bağlı olarak işaretlendi" + +#: templates/circuits/inc/circuit_termination.html:48 +msgid "to" +msgstr "doğru" + +#: templates/circuits/inc/circuit_termination.html:58 +#: templates/circuits/inc/circuit_termination.html:59 +#: templates/dcim/frontport.html:87 +#: templates/dcim/inc/connection_endpoints.html:7 +#: templates/dcim/interface.html:160 templates/dcim/rearport.html:83 +msgid "Trace" +msgstr "İzleme" + +#: templates/circuits/inc/circuit_termination.html:62 +msgid "Edit cable" +msgstr "Kabloyu düzenle" + +#: templates/circuits/inc/circuit_termination.html:67 +msgid "Remove cable" +msgstr "Kabloyu çıkarın" + +#: templates/circuits/inc/circuit_termination.html:68 +#: templates/dcim/bulk_disconnect.html:5 +#: templates/dcim/device/consoleports.html:12 +#: templates/dcim/device/consoleserverports.html:12 +#: templates/dcim/device/frontports.html:12 +#: templates/dcim/device/interfaces.html:16 +#: templates/dcim/device/poweroutlets.html:12 +#: templates/dcim/device/powerports.html:12 +#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:66 +msgid "Disconnect" +msgstr "Bağlantıyı kes" + +#: templates/circuits/inc/circuit_termination.html:75 +#: templates/dcim/consoleport.html:71 templates/dcim/consoleserverport.html:71 +#: templates/dcim/frontport.html:109 templates/dcim/interface.html:186 +#: templates/dcim/interface.html:206 templates/dcim/powerfeed.html:136 +#: templates/dcim/poweroutlet.html:75 templates/dcim/poweroutlet.html:76 +#: templates/dcim/powerport.html:77 templates/dcim/rearport.html:105 +msgid "Connect" +msgstr "Bağlan" + +#: templates/circuits/inc/circuit_termination.html:79 +#: templates/dcim/consoleport.html:78 templates/dcim/consoleserverport.html:78 +#: templates/dcim/frontport.html:18 templates/dcim/frontport.html:122 +#: templates/dcim/interface.html:193 templates/dcim/inventoryitem_edit.html:49 +#: templates/dcim/rearport.html:112 +msgid "Front Port" +msgstr "Ön Bağlantı Noktası" + +#: templates/circuits/inc/circuit_termination.html:97 +msgid "Downstream" +msgstr "Aşağı doğru" + +#: templates/circuits/inc/circuit_termination.html:98 +msgid "Upstream" +msgstr "Yukarı akış" + +#: templates/circuits/inc/circuit_termination.html:107 +msgid "Cross-Connect" +msgstr "Çapraz Bağlantı" + +#: templates/circuits/inc/circuit_termination.html:111 +msgid "Patch Panel/Port" +msgstr "Yama Paneli/Bağlantı Noktası" + +#: templates/circuits/provider.html:11 +msgid "Add circuit" +msgstr "Devre ekle" + +#: templates/circuits/provideraccount.html:17 +msgid "Provider Account" +msgstr "Sağlayıcı Hesabı" + +#: templates/core/configrevision.html:47 +msgid "Default unit height" +msgstr "Varsayılan birim yüksekliği" + +#: templates/core/configrevision.html:51 +msgid "Default unit width" +msgstr "Varsayılan birim genişliği" + +#: templates/core/configrevision.html:63 +msgid "Default voltage" +msgstr "Varsayılan voltaj" + +#: templates/core/configrevision.html:67 +msgid "Default amperage" +msgstr "Varsayılan amper" + +#: templates/core/configrevision.html:71 +msgid "Default max utilization" +msgstr "Varsayılan maksimum kullanım" + +#: templates/core/configrevision.html:83 +msgid "Enforce global unique" +msgstr "Küresel benzersiz uygulamayı uygulayın" + +#: templates/core/configrevision.html:135 +msgid "Paginate count" +msgstr "Sayfalandırma sayısı" + +#: templates/core/configrevision.html:139 +msgid "Max page size" +msgstr "Maksimum sayfa boyutu" + +#: templates/core/configrevision.html:179 +msgid "Default user preferences" +msgstr "Varsayılan kullanıcı tercihleri" + +#: templates/core/configrevision.html:209 +msgid "Job retention" +msgstr "İş tutma" + +#: templates/core/configrevision.html:221 +msgid "Comment" +msgstr "Yorum" + +#: templates/core/configrevision_restore.html:8 +#: templates/core/configrevision_restore.html:43 +#: templates/core/configrevision_restore.html:79 +msgid "Restore" +msgstr "Geri Yükleme" + +#: templates/core/configrevision_restore.html:21 +msgid "Config revisions" +msgstr "Yapılandırma revizyonları" + +#: templates/core/configrevision_restore.html:54 +msgid "Parameter" +msgstr "Parametre" + +#: templates/core/configrevision_restore.html:55 +msgid "Current Value" +msgstr "Mevcut Değer" + +#: templates/core/configrevision_restore.html:56 +msgid "New Value" +msgstr "Yeni Değer" + +#: templates/core/configrevision_restore.html:66 +msgid "Changed" +msgstr "Değişti" + +#: templates/core/datafile.html:47 +msgid "Last Updated" +msgstr "Son Güncelleme" + +#: templates/core/datafile.html:51 templates/ipam/iprange.html:28 +#: templates/virtualization/virtualdisk.html:30 +msgid "Size" +msgstr "Boyut" + +#: templates/core/datafile.html:52 +msgid "bytes" +msgstr "bayt" + +#: templates/core/datafile.html:55 +msgid "SHA256 Hash" +msgstr "SHA256 Karması" + +#: templates/core/datasource.html:14 templates/core/datasource.html:20 +#: utilities/templates/buttons/sync.html:5 +msgid "Sync" +msgstr "Senkronizasyon" + +#: templates/core/datasource.html:51 +msgid "Last synced" +msgstr "Son senkronize edildi" + +#: templates/core/datasource.html:86 +msgid "Backend" +msgstr "Arka uç" + +#: templates/core/datasource.html:102 +msgid "No parameters defined" +msgstr "Parametre tanımlanmadı" + +#: templates/core/datasource.html:118 +msgid "Files" +msgstr "Dosyalar" + +#: templates/core/job.html:21 +msgid "Job" +msgstr "İş" + +#: templates/core/job.html:45 templates/extras/journalentry.html:29 +msgid "Created By" +msgstr "Tarafından Oluşturuldu" + +#: templates/core/job.html:54 +msgid "Scheduling" +msgstr "Çizelgeleme" + +#: templates/core/job.html:66 +#, python-format +msgid "every %(interval)s seconds" +msgstr "her bir %(interval)s saniyeler" + +#: templates/dcim/bulk_disconnect.html:9 +#, python-format +msgid "" +"Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" +msgstr "" +"Bunların bağlantısını kesmek istediğinizden emin misiniz %(count)s " +"%(obj_type_plural)s?" + +#: templates/dcim/cable_edit.html:12 +msgid "A Side" +msgstr "Bir Taraf" + +#: templates/dcim/cable_edit.html:29 +msgid "B Side" +msgstr "B Tarafı" + +#: templates/dcim/cable_trace.html:6 +#, python-format +msgid "Cable Trace for %(object_type)s %(object)s" +msgstr "Kablo İzleme için %(object_type)s %(object)s" + +#: templates/dcim/cable_trace.html:21 templates/dcim/inc/rack_elevation.html:7 +msgid "Download SVG" +msgstr "SVG indir" + +#: templates/dcim/cable_trace.html:27 +msgid "Asymmetric Path" +msgstr "Asimetrik Yol" + +#: templates/dcim/cable_trace.html:28 +msgid "The nodes below have no links and result in an asymmetric path" +msgstr "" +"Aşağıdaki düğümlerin bağlantısı yoktur ve asimetrik bir yol ile sonuçlanır" + +#: templates/dcim/cable_trace.html:35 +msgid "Path split" +msgstr "Yol bölünmesi" + +#: templates/dcim/cable_trace.html:36 +msgid "Select a node below to continue" +msgstr "Devamlamak için aşağıdan bir düğüm seçin" + +#: templates/dcim/cable_trace.html:52 +msgid "Trace Completed" +msgstr "İzleme Tamamlandı" + +#: templates/dcim/cable_trace.html:55 +msgid "Total segments" +msgstr "Toplam segmentler" + +#: templates/dcim/cable_trace.html:59 +msgid "Total length" +msgstr "Toplam uzunluk" + +#: templates/dcim/cable_trace.html:74 +msgid "No paths found" +msgstr "Yol bulunamadı" + +#: templates/dcim/cable_trace.html:83 +msgid "Related Paths" +msgstr "İlgili Yollar" + +#: templates/dcim/cable_trace.html:89 +msgid "Origin" +msgstr "Menşei" + +#: templates/dcim/cable_trace.html:90 +msgid "Destination" +msgstr "Hedef" + +#: templates/dcim/cable_trace.html:91 +msgid "Segments" +msgstr "Segmentler" + +#: templates/dcim/cable_trace.html:104 +msgid "Incomplete" +msgstr "Tamamlanmamış" + +#: templates/dcim/component_list.html:14 +msgid "Rename Selected" +msgstr "Seçili Yeniden Adlandır" + +#: templates/dcim/consoleport.html:67 templates/dcim/consoleserverport.html:67 +#: templates/dcim/frontport.html:105 templates/dcim/interface.html:182 +#: templates/dcim/poweroutlet.html:73 templates/dcim/powerport.html:73 +msgid "Not Connected" +msgstr "Bağlı Değil" + +#: templates/dcim/consoleport.html:75 templates/dcim/consoleserverport.html:18 +#: templates/dcim/frontport.html:116 templates/dcim/inventoryitem_edit.html:44 +msgid "Console Server Port" +msgstr "Konsol Sunucusu Bağlantı Noktası" + +#: templates/dcim/device.html:35 +msgid "Highlight device" +msgstr "Cihazı vurgulayın" + +#: templates/dcim/device.html:57 +msgid "Not racked" +msgstr "Rackli değil" + +#: templates/dcim/device.html:64 templates/dcim/site.html:96 +msgid "GPS Coordinates" +msgstr "GPS Koordinatları" + +#: templates/dcim/device.html:70 templates/dcim/site.html:102 +msgid "Map It" +msgstr "Haritalayın" + +#: templates/dcim/device.html:110 templates/dcim/inventoryitem.html:57 +#: templates/dcim/module.html:79 templates/dcim/modulebay.html:73 +#: templates/dcim/rack.html:62 +msgid "Asset Tag" +msgstr "Varlık Etiketi" + +#: templates/dcim/device.html:153 +msgid "View Virtual Chassis" +msgstr "Sanal Kasayı Görüntüle" + +#: templates/dcim/device.html:170 +msgid "Create VDC" +msgstr "VDC oluştur" + +#: templates/dcim/device.html:179 templates/dcim/device_edit.html:64 +#: virtualization/forms/model_forms.py:226 +msgid "Management" +msgstr "Yönetim" + +#: templates/dcim/device.html:200 templates/dcim/device.html:216 +#: templates/virtualization/virtualmachine.html:56 +#: templates/virtualization/virtualmachine.html:72 +msgid "NAT for" +msgstr "NAT için" + +#: templates/dcim/device.html:202 templates/dcim/device.html:218 +#: templates/virtualization/virtualmachine.html:58 +#: templates/virtualization/virtualmachine.html:74 +msgid "NAT" +msgstr "THE NİGHT" + +#: templates/dcim/device.html:254 templates/dcim/rack.html:70 +msgid "Power Utilization" +msgstr "Güç Kullanımı" + +#: templates/dcim/device.html:259 +msgid "Input" +msgstr "Giriş" + +#: templates/dcim/device.html:260 +msgid "Outlets" +msgstr "Satış noktaları" + +#: templates/dcim/device.html:261 +msgid "Allocated" +msgstr "Tahsis edilmiş" + +#: templates/dcim/device.html:270 templates/dcim/device.html:272 +#: templates/dcim/device.html:288 templates/dcim/powerfeed.html:70 +msgid "VA" +msgstr "İL" + +#: templates/dcim/device.html:282 +msgctxt "Leg of a power feed" +msgid "Leg" +msgstr "Bacak" + +#: templates/dcim/device.html:312 +#: templates/virtualization/virtualmachine.html:165 +msgid "Add a service" +msgstr "Hizmet ekle" + +#: templates/dcim/device.html:319 templates/dcim/rack.html:77 +#: templates/dcim/rack_edit.html:38 +msgid "Dimensions" +msgstr "Ölçüler" + +#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 +#: templates/dcim/devicetype/base.html:18 templates/dcim/module.html:18 +#: templates/dcim/moduletype/base.html:18 +#: templates/virtualization/virtualmachine/base.html:22 +#: templates/virtualization/virtualmachine_list.html:8 +msgid "Add Components" +msgstr "Bileşenler Ekle" + +#: templates/dcim/device/consoleports.html:24 +msgid "Add Console Ports" +msgstr "Konsol Bağlantı Noktaları Ekle" + +#: templates/dcim/device/consoleserverports.html:24 +msgid "Add Console Server Ports" +msgstr "Konsol Sunucusu Bağlantı Noktaları Ekle" + +#: templates/dcim/device/devicebays.html:10 +msgid "Add Device Bays" +msgstr "Aygıt Yuvaları Ekle" + +#: templates/dcim/device/frontports.html:24 +msgid "Add Front Ports" +msgstr "Ön Bağlantı Noktaları Ekle" + +#: templates/dcim/device/inc/interface_table_controls.html:9 +msgid "Hide Enabled" +msgstr "Gizle Etkin" + +#: templates/dcim/device/inc/interface_table_controls.html:10 +msgid "Hide Disabled" +msgstr "Gizle Devre Dışı" + +#: templates/dcim/device/inc/interface_table_controls.html:11 +msgid "Hide Virtual" +msgstr "Sanal Gizle" + +#: templates/dcim/device/inc/interface_table_controls.html:12 +msgid "Hide Disconnected" +msgstr "Bağlantısızlığı Gizle" + +#: templates/dcim/device/interfaces.html:28 +msgid "Add Interfaces" +msgstr "Arayüzler Ekle" + +#: templates/dcim/device/inventory.html:10 +#: templates/dcim/inc/panels/inventory_items.html:46 +msgid "Add Inventory Item" +msgstr "Envanter Öğesi Ekle" + +#: templates/dcim/device/modulebays.html:10 +msgid "Add Module Bays" +msgstr "Modül Yuvaları Ekle" + +#: templates/dcim/device/poweroutlets.html:24 +msgid "Add Power Outlets" +msgstr "Elektrik Prizleri Ekle" + +#: templates/dcim/device/powerports.html:24 +msgid "Add Power Port" +msgstr "Güç Bağlantı Noktası Ekle" + +#: templates/dcim/device/rearports.html:24 +msgid "Add Rear Ports" +msgstr "Arka Bağlantı Noktaları Ekle" + +#: templates/dcim/device/render_config.html:5 +#: templates/virtualization/virtualmachine/render_config.html:5 +msgid "Config" +msgstr "Yapılandırma" + +#: templates/dcim/device/render_config.html:37 +#: templates/virtualization/virtualmachine/render_config.html:37 +msgid "Context Data" +msgstr "Bağlam Verileri" + +#: templates/dcim/device/render_config.html:57 +#: templates/virtualization/virtualmachine/render_config.html:57 +msgid "Download" +msgstr "İndir" + +#: templates/dcim/device/render_config.html:60 +#: templates/virtualization/virtualmachine/render_config.html:60 +msgid "Rendered Config" +msgstr "Oluşturulan Yapılandırma" + +#: templates/dcim/device/render_config.html:65 +#: templates/virtualization/virtualmachine/render_config.html:65 +msgid "No configuration template found" +msgstr "Yapılandırma şablonu bulunamadı" + +#: templates/dcim/device_edit.html:44 +msgid "Parent Bay" +msgstr "Ebeveyn Körfezi" + +#: templates/dcim/device_edit.html:48 +#: utilities/templates/form_helpers/render_field.html:20 +msgid "Regenerate Slug" +msgstr "Sümüklü böcekleri yeniden oluştur" + +#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:7 +#: utilities/templates/helpers/table_config_form.html:23 +msgid "Remove" +msgstr "Kaldır" + +#: templates/dcim/device_edit.html:110 +msgid "Local Config Context Data" +msgstr "Yerel Yapılandırma Bağlam Verileri" + +#: templates/dcim/device_list.html:82 +#: templates/dcim/devicetype/component_templates.html:18 +#: templates/dcim/moduletype/component_templates.html:18 +#: templates/generic/bulk_rename.html:34 +#: templates/virtualization/virtualmachine/interfaces.html:11 +#: templates/virtualization/virtualmachine/virtual_disks.html:11 +msgid "Rename" +msgstr "Yeniden Adlandır" + +#: templates/dcim/devicebay.html:18 +msgid "Device Bay" +msgstr "Cihaz Yuvası" + +#: templates/dcim/devicebay.html:48 +msgid "Installed Device" +msgstr "Yüklü Aygıt" + +#: templates/dcim/devicebay_delete.html:6 +#, python-format +msgid "Delete device bay %(devicebay)s?" +msgstr "Aygıt yuvasını sil %(devicebay)s?" + +#: templates/dcim/devicebay_delete.html:11 +#, python-format +msgid "" +"Are you sure you want to delete this device bay from " +"%(device)s?" +msgstr "" +"Bu cihaz yuvasını silmek istediğinizden emin misiniz " +"%(device)s?" + +#: templates/dcim/devicebay_depopulate.html:6 +#, python-format +msgid "Remove %(device)s from %(device_bay)s?" +msgstr "Kaldır %(device)s beri %(device_bay)s?" + +#: templates/dcim/devicebay_depopulate.html:13 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from " +"%(device_bay)s?" +msgstr "" +"Kaldırmak istediğinizden emin misiniz? %(device)s beri " +"%(device_bay)s?" + +#: templates/dcim/devicebay_populate.html:13 +msgid "Populate" +msgstr "Doldurmak" + +#: templates/dcim/devicebay_populate.html:22 +msgid "Bay" +msgstr "Körfez" + +#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +msgid "Add Device" +msgstr "Cihaz Ekle" + +#: templates/dcim/devicerole.html:43 +msgid "VM Role" +msgstr "VM Rolü" + +#: templates/dcim/devicetype.html:21 templates/dcim/moduletype.html:19 +msgid "Model Name" +msgstr "Model Adı" + +#: templates/dcim/devicetype.html:28 templates/dcim/moduletype.html:23 +msgid "Part Number" +msgstr "Parça Numarası" + +#: templates/dcim/devicetype.html:40 +msgid "Height (U" +msgstr "Yükseklik (U" + +#: templates/dcim/devicetype.html:44 +msgid "Exclude From Utilization" +msgstr "Kullanımdan Hariç Tutma" + +#: templates/dcim/devicetype.html:62 +msgid "Parent/Child" +msgstr "Ebeveyn/Çocuk" + +#: templates/dcim/devicetype.html:74 +msgid "Front Image" +msgstr "Ön Görüntü" + +#: templates/dcim/devicetype.html:86 +msgid "Rear Image" +msgstr "Arka Görüntü" + +#: templates/dcim/frontport.html:57 +msgid "Rear Port Position" +msgstr "Arka Bağlantı Noktası Konumu" + +#: templates/dcim/frontport.html:79 templates/dcim/interface.html:150 +#: templates/dcim/poweroutlet.html:67 templates/dcim/powerport.html:67 +#: templates/dcim/rearport.html:75 +msgid "Marked as Connected" +msgstr "Bağlı olarak işaretlendi" + +#: templates/dcim/frontport.html:93 templates/dcim/rearport.html:89 +msgid "Connection Status" +msgstr "Bağlantı Durumu" + +#: templates/dcim/inc/cable_termination.html:65 +msgid "No termination" +msgstr "Fesih yok" + +#: templates/dcim/inc/cable_toggle_buttons.html:4 +msgid "Mark Planned" +msgstr "Planlanan İşaretle" + +#: templates/dcim/inc/cable_toggle_buttons.html:8 +msgid "Mark Installed" +msgstr "Mark Yüklü" + +#: templates/dcim/inc/connection_endpoints.html:13 +msgid "Path Status" +msgstr "Yol Durumu" + +#: templates/dcim/inc/connection_endpoints.html:18 +msgid "Not Reachable" +msgstr "Ulaşılamıyor" + +#: templates/dcim/inc/connection_endpoints.html:23 +msgid "Path Endpoints" +msgstr "Yol Bitiş Noktaları" + +#: templates/dcim/inc/endpoint_connection.html:8 +#: templates/dcim/powerfeed.html:128 templates/dcim/rearport.html:101 +msgid "Not connected" +msgstr "Bağlı değil" + +#: templates/dcim/inc/interface_vlans_table.html:6 +msgid "Untagged" +msgstr "Etiketsiz" + +#: templates/dcim/inc/interface_vlans_table.html:37 +msgid "No VLANs Assigned" +msgstr "Atanmamış VLAN" + +#: templates/dcim/inc/interface_vlans_table.html:44 +#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +msgid "Clear" +msgstr "Temiz" + +#: templates/dcim/inc/interface_vlans_table.html:47 +msgid "Clear All" +msgstr "Tümünü Temizle" + +#: templates/dcim/interface.html:17 +msgid "Add Child Interface" +msgstr "Çocuk Arayüzü Ekle" + +#: templates/dcim/interface.html:51 +msgid "Speed/Duplex" +msgstr "Hız/Dubleks" + +#: templates/dcim/interface.html:74 +msgid "PoE Mode" +msgstr "PoE Modu" + +#: templates/dcim/interface.html:78 +msgid "PoE Type" +msgstr "PoE Tipi" + +#: templates/dcim/interface.html:82 +#: templates/virtualization/vminterface.html:66 +msgid "802.1Q Mode" +msgstr "802.1Q Modu" + +#: templates/dcim/interface.html:130 +#: templates/virtualization/vminterface.html:62 +msgid "MAC Address" +msgstr "MAC Adresi" + +#: templates/dcim/interface.html:157 +msgid "Wireless Link" +msgstr "Kablosuz Bağlantı" + +#: templates/dcim/interface.html:226 vpn/choices.py:55 +msgid "Peer" +msgstr "Akran" + +#: templates/dcim/interface.html:238 +#: templates/wireless/inc/wirelesslink_interface.html:26 +msgid "Channel" +msgstr "Kanal" + +#: templates/dcim/interface.html:247 +#: templates/wireless/inc/wirelesslink_interface.html:32 +msgid "Channel Frequency" +msgstr "Kanal Frekansı" + +#: templates/dcim/interface.html:250 templates/dcim/interface.html:258 +#: templates/dcim/interface.html:269 templates/dcim/interface.html:277 +msgid "MHz" +msgstr "MHz" + +#: templates/dcim/interface.html:266 +#: templates/wireless/inc/wirelesslink_interface.html:42 +msgid "Channel Width" +msgstr "Kanal Genişliği" + +#: templates/dcim/interface.html:295 templates/wireless/wirelesslan.html:15 +#: templates/wireless/wirelesslink.html:24 wireless/forms/bulk_edit.py:59 +#: wireless/forms/bulk_edit.py:101 wireless/forms/filtersets.py:39 +#: wireless/forms/filtersets.py:79 wireless/models.py:81 +#: wireless/models.py:155 wireless/tables/wirelesslan.py:44 +msgid "SSID" +msgstr "SSİD" + +#: templates/dcim/interface.html:316 +msgid "LAG Members" +msgstr "LAG Üyeleri" + +#: templates/dcim/interface.html:335 +msgid "No member interfaces" +msgstr "Üye arabirimi yok" + +#: templates/dcim/interface.html:359 templates/ipam/fhrpgroup.html:80 +#: templates/ipam/iprange/ip_addresses.html:7 +#: templates/ipam/prefix/ip_addresses.html:7 +#: templates/virtualization/vminterface.html:96 +msgid "Add IP Address" +msgstr "IP Adresi Ekle" + +#: templates/dcim/inventoryitem.html:25 +msgid "Parent Item" +msgstr "Ana Öğe" + +#: templates/dcim/inventoryitem.html:49 +msgid "Part ID" +msgstr "Parça Kimliği" + +#: templates/dcim/inventoryitem_bulk_delete.html:5 +msgid "This will also delete all child inventory items of those listed" +msgstr "" +"Bu aynı zamanda listelenenlerin tüm alt envanter öğelerini de silecektir." + +#: templates/dcim/inventoryitem_edit.html:33 +msgid "Component Assignment" +msgstr "Bileşen Ataması" + +#: templates/dcim/inventoryitem_edit.html:59 +#: templates/dcim/poweroutlet.html:18 templates/dcim/powerport.html:81 +msgid "Power Outlet" +msgstr "Güç Çıkışı" + +#: templates/dcim/location.html:17 +msgid "Add Child Location" +msgstr "Çocuk Konumu Ekle" + +#: templates/dcim/location.html:76 +msgid "Child Locations" +msgstr "Çocuk Yerleri" + +#: templates/dcim/location.html:84 templates/dcim/site.html:137 +msgid "Add a Location" +msgstr "Konum Ekle" + +#: templates/dcim/location.html:98 templates/dcim/site.html:151 +msgid "Add a Device" +msgstr "Aygıt Ekle" + +#: templates/dcim/manufacturer.html:16 +msgid "Add Device Type" +msgstr "Cihaz Türü Ekle" + +#: templates/dcim/manufacturer.html:21 +msgid "Add Module Type" +msgstr "Modül Türü Ekle" + +#: templates/dcim/powerfeed.html:56 +msgid "Connected Device" +msgstr "Bağlı Cihaz" + +#: templates/dcim/powerfeed.html:66 +msgid "Utilization (Allocated" +msgstr "Kullanım (Tahsis Edildi" + +#: templates/dcim/powerfeed.html:85 +msgid "Electrical Characteristics" +msgstr "Elektriksel Özellikler" + +#: templates/dcim/powerfeed.html:95 +msgctxt "Abbreviation for volts" +msgid "V" +msgstr "V" + +#: templates/dcim/powerfeed.html:99 +msgctxt "Abbreviation for amperes" +msgid "A" +msgstr "BİR" + +#: templates/dcim/poweroutlet.html:51 +msgid "Feed Leg" +msgstr "Besleme ayağı" + +#: templates/dcim/powerpanel.html:77 +msgid "Add Power Feeds" +msgstr "Güç Beslemeleri Ekle" + +#: templates/dcim/powerport.html:47 +msgid "Maximum Draw" +msgstr "Maksimum Çekiliş" + +#: templates/dcim/powerport.html:51 +msgid "Allocated Draw" +msgstr "Tahsis Edilen Çekiliş" + +#: templates/dcim/rack.html:66 +msgid "Space Utilization" +msgstr "Alan Kullanımı" + +#: templates/dcim/rack.html:96 +msgid "descending" +msgstr "azalan" + +#: templates/dcim/rack.html:96 +msgid "ascending" +msgstr "yükselen" + +#: templates/dcim/rack.html:99 +msgid "Starting Unit" +msgstr "Başlangıç Ünitesi" + +#: templates/dcim/rack.html:125 +msgid "Mounting Depth" +msgstr "Montaj Derinliği" + +#: templates/dcim/rack.html:135 +msgid "Rack Weight" +msgstr "Raf Ağırlığı" + +#: templates/dcim/rack.html:145 templates/dcim/rack_edit.html:67 +msgid "Maximum Weight" +msgstr "Maksimum Ağırlık" + +#: templates/dcim/rack.html:155 +msgid "Total Weight" +msgstr "Toplam Ağırlık" + +#: templates/dcim/rack.html:173 templates/dcim/rack_elevation_list.html:16 +msgid "Images and Labels" +msgstr "Resimler ve Etiketler" + +#: templates/dcim/rack.html:174 templates/dcim/rack_elevation_list.html:17 +msgid "Images only" +msgstr "Yalnızca resimler" + +#: templates/dcim/rack.html:175 templates/dcim/rack_elevation_list.html:18 +msgid "Labels only" +msgstr "Yalnızca etiketler" + +#: templates/dcim/rack/reservations.html:9 +msgid "Add reservation" +msgstr "Rezervasyon ekle" + +#: templates/dcim/rack_edit.html:21 +msgid "Inventory Control" +msgstr "Envanter Kontrolü" + +#: templates/dcim/rack_edit.html:45 +msgid "Outer Dimensions" +msgstr "Dış Ölçüler" + +#: templates/dcim/rack_edit.html:56 templates/dcim/rack_edit.html:71 +msgid "Unit" +msgstr "Birim" + +#: templates/dcim/rack_elevation_list.html:12 +msgid "View List" +msgstr "Listeyi Görüntüle" + +#: templates/dcim/rack_elevation_list.html:27 +msgid "Sort By" +msgstr "Sıralamaya Göre" + +#: templates/dcim/rack_elevation_list.html:77 +msgid "No Racks Found" +msgstr "Raf Bulunamadı" + +#: templates/dcim/rack_list.html:8 +msgid "View Elevations" +msgstr "Yükseklikleri Görüntüle" + +#: templates/dcim/rackreservation.html:47 +msgid "Reservation Details" +msgstr "Rezervasyon Detayları" + +#: templates/dcim/rackrole.html:10 +msgid "Add Rack" +msgstr "Raf Ekle" + +#: templates/dcim/rearport.html:53 +msgid "Positions" +msgstr "Pozisyonlar" + +#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +msgid "Add Site" +msgstr "Site Ekle" + +#: templates/dcim/region.html:56 +msgid "Child Regions" +msgstr "Çocuk Bölgeleri" + +#: templates/dcim/region.html:64 +msgid "Add Region" +msgstr "Bölge Ekle" + +#: templates/dcim/site.html:56 +msgid "Facility" +msgstr "Tesis" + +#: templates/dcim/site.html:64 +msgid "Time Zone" +msgstr "Saat dilimi" + +#: templates/dcim/site.html:67 +msgid "UTC" +msgstr "UTC" + +#: templates/dcim/site.html:68 +msgid "Site time" +msgstr "Site zamanı" + +#: templates/dcim/site.html:75 +msgid "Physical Address" +msgstr "Fiziksel Adres" + +#: templates/dcim/site.html:81 +msgid "Map" +msgstr "Harita" + +#: templates/dcim/site.html:92 +msgid "Shipping Address" +msgstr "Kargo Adresi" + +#: templates/dcim/sitegroup.html:56 templates/tenancy/contactgroup.html:49 +#: templates/tenancy/tenantgroup.html:58 +#: templates/wireless/wirelesslangroup.html:56 +msgid "Child Groups" +msgstr "Çocuk Grupları" + +#: templates/dcim/sitegroup.html:64 +msgid "Add Site Group" +msgstr "Site Grubu Ekle" + +#: templates/dcim/trace/attachment.html:5 +#: templates/extras/exporttemplate.html:37 +msgid "Attachment" +msgstr "Ataşman" + +#: templates/dcim/virtualchassis.html:86 +msgid "Add Member" +msgstr "Üye Ekle" + +#: templates/dcim/virtualchassis_add.html:18 +msgid "Member Devices" +msgstr "Üye Cihazları" + +#: templates/dcim/virtualchassis_add_member.html:6 +#, python-format +msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" +msgstr "Sanal Şasiye Yeni Üye Ekle %(virtual_chassis)s" + +#: templates/dcim/virtualchassis_add_member.html:17 +msgid "Add New Member" +msgstr "Yeni Üye Ekle" + +#: templates/dcim/virtualchassis_add_member.html:25 +msgid "Add Another" +msgstr "Başka Ekle" + +#: templates/dcim/virtualchassis_edit.html:7 +#, python-format +msgid "Editing Virtual Chassis %(name)s" +msgstr "Sanal Kasayı Düzenleme %(name)s" + +#: templates/dcim/virtualchassis_edit.html:54 +msgid "Rack/Unit" +msgstr "Raf/Birim" + +#: templates/dcim/virtualchassis_remove_member.html:5 +msgid "Remove Virtual Chassis Member" +msgstr "Sanal Kasa Üyesini Kaldır" + +#: templates/dcim/virtualchassis_remove_member.html:9 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from virtual " +"chassis %(name)s?" +msgstr "" +"Kaldırmak istediğinizden emin misiniz? %(device)s sanal " +"kasadan %(name)s?" + +#: templates/dcim/virtualdevicecontext.html:29 templates/vpn/l2vpn.html:19 +msgid "Identifier" +msgstr "Tanımlayıcı" + +#: templates/exceptions/import_error.html:6 +msgid "" +"A module import error occurred during this request. Common causes include " +"the following:" +msgstr "" +"Bu istek sırasında bir modül içe aktarma hatası oluştu. Yaygın nedenler " +"aşağıdakileri içerir:" + +#: templates/exceptions/import_error.html:10 +msgid "Missing required packages" +msgstr "Gerekli paketler eksik" + +#: templates/exceptions/import_error.html:11 +msgid "" +"This installation of NetBox might be missing one or more required Python " +"packages. These packages are listed in requirements.txt and " +"local_requirements.txt, and are normally installed as part of " +"the installation or upgrade process. To verify installed packages, run " +"pip freeze from the console and compare the output to the list " +"of required packages." +msgstr "" +"NetBox'ın bu kurulumunda bir veya daha fazla gerekli Python paketi eksik " +"olabilir. Bu paketler şurada listelenmiştir requirements.txt ve" +" local_requirements.txt, ve normalde yükleme veya yükseltme " +"işleminin bir parçası olarak yüklenir. Yüklü paketleri doğrulamak için " +"çalıştırın pip dondurma konsoldan ve çıktıyı gerekli paketlerin" +" listesiyle karşılaştırın." + +#: templates/exceptions/import_error.html:20 +msgid "WSGI service not restarted after upgrade" +msgstr "WSGI hizmeti yükseltmeden sonra yeniden başlatılmadı" + +#: templates/exceptions/import_error.html:21 +msgid "" +"If this installation has recently been upgraded, check that the WSGI service" +" (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" +" is running." +msgstr "" +"Bu yükleme yakın zamanda yükseltildiyse, WSGI hizmetinin (örneğin gunicorn " +"veya uWSGi) yeniden başlatıldığını kontrol edin. Bu, yeni kodun çalışmasını " +"sağlar." + +#: templates/exceptions/permission_error.html:6 +msgid "" +"A file permission error was detected while processing this request. Common " +"causes include the following:" +msgstr "" +"Bu istek işlenirken bir dosya izni hatası tespit edildi. Yaygın nedenler " +"aşağıdakileri içerir:" + +#: templates/exceptions/permission_error.html:10 +msgid "Insufficient write permission to the media root" +msgstr "Medya köküne yetersiz yazma izni" + +#: templates/exceptions/permission_error.html:11 +#, python-format +msgid "" +"The configured media root is %(media_root)s. Ensure that the " +"user NetBox runs as has access to write files to all locations within this " +"path." +msgstr "" +"Yapılandırılan medya kökü %(media_root)s. NetBox " +"kullanıcısının, bu yoldaki tüm konumlara dosya yazmak için erişimi olduğu " +"gibi çalıştığından emin olun." + +#: templates/exceptions/programming_error.html:6 +msgid "" +"A database programming error was detected while processing this request. " +"Common causes include the following:" +msgstr "" +"Bu istek işlenirken bir veritabanı programlama hatası tespit edildi. Yaygın " +"nedenler aşağıdakileri içerir:" + +#: templates/exceptions/programming_error.html:10 +msgid "Database migrations missing" +msgstr "Veritabanı geçişleri eksik" + +#: templates/exceptions/programming_error.html:11 +msgid "" +"When upgrading to a new NetBox release, the upgrade script must be run to " +"apply any new database migrations. You can run migrations manually by " +"executing python3 manage.py migrate from the command line." +msgstr "" +"Yeni bir NetBox sürümüne yükseltirken, yeni veritabanı geçişlerini uygulamak" +" için yükseltme komut dosyasının çalıştırılması gerekir. Yürüterek geçişleri" +" manuel olarak çalıştırabilirsiniz python3 manage.py geçişi " +"komut satırından." + +#: templates/exceptions/programming_error.html:18 +msgid "Unsupported PostgreSQL version" +msgstr "Desteklenmeyen PostgreSQL sürümü" + +#: templates/exceptions/programming_error.html:19 +msgid "" +"Ensure that PostgreSQL version 12 or later is in use. You can check this by " +"connecting to the database using NetBox's credentials and issuing a query " +"for SELECT VERSION()." +msgstr "" +"PostgreSQL sürüm 12 veya sonraki sürümünün kullanımda olduğundan emin olun. " +"NetBox'ın kimlik bilgilerini kullanarak veritabanına bağlanarak ve bir sorgu" +" düzenleyerek bunu kontrol edebilirsiniz. SÜRÜMÜ SEÇİN ()." + +#: templates/extras/admin/plugins_list.html:4 +#: templates/extras/admin/plugins_list.html:9 +#: templates/extras/admin/plugins_list.html:13 +msgid "Installed Plugins" +msgstr "Yüklü Eklentiler" + +#: templates/extras/admin/plugins_list.html:23 +msgid "Package Name" +msgstr "Paket Adı" + +#: templates/extras/admin/plugins_list.html:24 +msgid "Author" +msgstr "Yazar" + +#: templates/extras/admin/plugins_list.html:25 +msgid "Author Email" +msgstr "Yazar E-postası" + +#: templates/extras/admin/plugins_list.html:27 +#: templates/vpn/ipsecprofile.html:47 vpn/forms/bulk_edit.py:140 +#: vpn/forms/bulk_import.py:172 vpn/tables/crypto.py:61 +msgid "Version" +msgstr "Versiyon" + +#: templates/extras/configcontext.html:46 +#: templates/extras/configtemplate.html:38 +#: templates/extras/exporttemplate.html:57 +msgid "The data file associated with this object has been deleted" +msgstr "Bu nesneyle ilişkili veri dosyası silindi" + +#: templates/extras/configcontext.html:55 +#: templates/extras/configtemplate.html:47 +#: templates/extras/exporttemplate.html:66 +msgid "Data Synced" +msgstr "Veriler Senkronize Edildi" + +#: templates/extras/configcontext_list.html:7 +#: templates/extras/configtemplate_list.html:7 +#: templates/extras/exporttemplate_list.html:7 +msgid "Sync Data" +msgstr "Verileri Senkronize Et" + +#: templates/extras/configtemplate.html:58 +msgid "Environment Parameters" +msgstr "Çevre Parametreleri" + +#: templates/extras/configtemplate.html:69 +#: templates/extras/exporttemplate.html:88 +msgid "Template" +msgstr "Şablon" + +#: templates/extras/customfield.html:31 templates/extras/customlink.html:22 +msgid "Group Name" +msgstr "Grup Adı" + +#: templates/extras/customfield.html:43 +msgid "Cloneable" +msgstr "Klonlanabilir" + +#: templates/extras/customfield.html:53 +msgid "Default Value" +msgstr "Varsayılan Değer" + +#: templates/extras/customfield.html:64 +msgid "Search Weight" +msgstr "Arama Ağırlığı" + +#: templates/extras/customfield.html:74 +msgid "Filter Logic" +msgstr "Filtre Mantığı" + +#: templates/extras/customfield.html:78 +msgid "Display Weight" +msgstr "Ekran Ağırlığı" + +#: templates/extras/customfield.html:82 +msgid "UI Visible" +msgstr "Kullanıcı Arayüzü Görünür" + +#: templates/extras/customfield.html:86 +msgid "UI Editable" +msgstr "UI Düzenlenebilir" + +#: templates/extras/customfield.html:108 +msgid "Validation Rules" +msgstr "Doğrulama Kuralları" + +#: templates/extras/customfield.html:112 +msgid "Minimum Value" +msgstr "Minimum Değer" + +#: templates/extras/customfield.html:116 +msgid "Maximum Value" +msgstr "Maksimum Değer" + +#: templates/extras/customfield.html:120 +msgid "Regular Expression" +msgstr "Düzenli İfade" + +#: templates/extras/customlink.html:30 +msgid "Button Class" +msgstr "Düğme Sınıfı" + +#: templates/extras/customlink.html:41 templates/extras/exporttemplate.html:73 +#: templates/extras/savedfilter.html:41 +msgid "Assigned Models" +msgstr "Atanan Modeller" + +#: templates/extras/customlink.html:57 +msgid "Link Text" +msgstr "Bağlantı Metni" + +#: templates/extras/customlink.html:65 +msgid "Link URL" +msgstr "Bağlantı URL'si" + +#: templates/extras/dashboard/reset.html:4 templates/home.html:63 +msgid "Reset Dashboard" +msgstr "Kontrol Panelini Sıfırla" + +#: templates/extras/dashboard/reset.html:8 +msgid "" +"This will remove all configured widgets and restore the " +"default dashboard configuration." +msgstr "" +"Bu kaldıracak bütün widget'ları yapılandırın ve varsayılan " +"gösterge paneli yapılandırmasını geri yükleyin." + +#: templates/extras/dashboard/reset.html:13 +msgid "" +"This change affects only your dashboard, and will not impact other " +"users." +msgstr "" +"Bu değişiklik sadece etkiliyor sizin kontrol paneli, ve diğer " +"kullanıcıları etkilemeyecektir." + +#: templates/extras/dashboard/widget_add.html:7 +msgid "Add a Widget" +msgstr "Widget Ekle" + +#: templates/extras/dashboard/widgets/bookmarks.html:14 +msgid "No bookmarks have been added yet." +msgstr "Henüz yer imi eklenmedi." + +#: templates/extras/dashboard/widgets/objectcounts.html:15 +msgid "No permission" +msgstr "İzin yok" + +#: templates/extras/dashboard/widgets/objectlist.html:6 +msgid "No permission to view this content" +msgstr "Bu içeriği görüntüleme izni yok" + +#: templates/extras/dashboard/widgets/objectlist.html:10 +msgid "Unable to load content. Invalid view name" +msgstr "İçerik yüklenemiyor. Geçersiz görünüm adı" + +#: templates/extras/dashboard/widgets/rssfeed.html:12 +msgid "No content found" +msgstr "İçerik bulunamadı" + +#: templates/extras/dashboard/widgets/rssfeed.html:18 +msgid "There was a problem fetching the RSS feed" +msgstr "RSS beslemesini getirirken bir sorun oluştu" + +#: templates/extras/dashboard/widgets/rssfeed.html:21 +msgid "HTTP" +msgstr "HTTP" + +#: templates/extras/eventrule.html:63 +msgid "Job start" +msgstr "İş başlangıcı" + +#: templates/extras/eventrule.html:67 +msgid "Job end" +msgstr "İş sonu" + +#: templates/extras/exporttemplate.html:29 +msgid "MIME Type" +msgstr "MIME Türü" + +#: templates/extras/exporttemplate.html:33 +msgid "File Extension" +msgstr "Dosya uzantısı" + +#: templates/extras/htmx/report_result.html:9 +#: templates/extras/htmx/script_result.html:10 +msgid "Scheduled for" +msgstr "İçin planlanmış" + +#: templates/extras/htmx/report_result.html:14 +#: templates/extras/htmx/script_result.html:15 +msgid "Duration" +msgstr "Süre" + +#: templates/extras/htmx/report_result.html:20 +msgid "Report Methods" +msgstr "Rapor Yöntemleri" + +#: templates/extras/htmx/report_result.html:38 +msgid "Report Results" +msgstr "Rapor Sonuçları" + +#: templates/extras/htmx/report_result.html:44 +#: templates/extras/htmx/script_result.html:26 +msgid "Level" +msgstr "Seviye" + +#: templates/extras/htmx/report_result.html:46 +#: templates/extras/htmx/script_result.html:27 +msgid "Message" +msgstr "Mesaj" + +#: templates/extras/htmx/script_result.html:21 +msgid "Script Log" +msgstr "Komut Dosyası Günlüğü" + +#: templates/extras/htmx/script_result.html:25 +msgid "Line" +msgstr "Çizgi" + +#: templates/extras/htmx/script_result.html:38 +msgid "No log output" +msgstr "Günlük çıkışı yok" + +#: templates/extras/htmx/script_result.html:46 +msgid "Exec Time" +msgstr "Yürütme Saati" + +#: templates/extras/htmx/script_result.html:46 +msgctxt "Unit of time" +msgid "seconds" +msgstr "saniyeler" + +#: templates/extras/htmx/script_result.html:50 +msgid "Output" +msgstr "Çıktı" + +#: templates/extras/inc/result_pending.html:4 +msgid "Loading" +msgstr "Yükleniyor" + +#: templates/extras/inc/result_pending.html:6 +msgid "Results pending" +msgstr "Sonuçlar beklemede" + +#: templates/extras/journalentry.html:16 +msgid "Journal Entry" +msgstr "Dergi Girişi" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Change log retention" +msgstr "Günlük tutma işlemini değiştir" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "days" +msgstr "günler" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Indefinite" +msgstr "belirsiz" + +#: templates/extras/object_configcontext.html:11 +msgid "Rendered Context" +msgstr "Oluşturulan Bağlam" + +#: templates/extras/object_configcontext.html:22 +msgid "Local Context" +msgstr "Yerel Bağlam" + +#: templates/extras/object_configcontext.html:34 +msgid "The local config context overwrites all source contexts" +msgstr "Yerel yapılandırma bağlamı tüm kaynak bağlamların üzerine yazar" + +#: templates/extras/object_configcontext.html:40 +msgid "Source Contexts" +msgstr "Kaynak Bağlamları" + +#: templates/extras/object_journal.html:18 +msgid "New Journal Entry" +msgstr "Yeni Dergi Girişi" + +#: templates/extras/objectchange.html:29 +#: templates/users/objectpermission.html:45 +msgid "Change" +msgstr "Değişim" + +#: templates/extras/objectchange.html:84 +msgid "Difference" +msgstr "Farkı" + +#: templates/extras/objectchange.html:87 +msgid "Previous" +msgstr "Önceki" + +#: templates/extras/objectchange.html:90 +msgid "Next" +msgstr "Sonraki" + +#: templates/extras/objectchange.html:98 +msgid "Object Created" +msgstr "Nesne Oluşturuldu" + +#: templates/extras/objectchange.html:100 +msgid "Object Deleted" +msgstr "Nesne Silindi" + +#: templates/extras/objectchange.html:102 +msgid "No Changes" +msgstr "Değişiklik Yok" + +#: templates/extras/objectchange.html:117 +msgid "Pre-Change Data" +msgstr "Ön Değişim Verileri" + +#: templates/extras/objectchange.html:126 +msgid "Warning: Comparing non-atomic change to previous change record" +msgstr "" +"Uyarı: Atomik olmayan değişimin önceki değişiklik kaydıyla karşılaştırılması" + +#: templates/extras/objectchange.html:136 +msgid "Post-Change Data" +msgstr "Değişim Sonrası Veriler" + +#: templates/extras/objectchange.html:157 +#, python-format +msgid "See All %(count)s Changes" +msgstr "Tümünü Gör %(count)s Değişiklikler" + +#: templates/extras/report.html:14 +msgid "This report is invalid and cannot be run." +msgstr "Bu rapor geçersiz ve çalıştırılamıyor." + +#: templates/extras/report.html:23 templates/extras/report_list.html:88 +msgid "Run Again" +msgstr "Tekrar koş" + +#: templates/extras/report.html:25 templates/extras/report_list.html:90 +msgid "Run Report" +msgstr "Raporu Çalıştır" + +#: templates/extras/report.html:36 +msgid "Last run" +msgstr "Son koşu" + +#: templates/extras/report/base.html:30 +msgid "Report" +msgstr "Rapor" + +#: templates/extras/report_list.html:48 templates/extras/script_list.html:54 +msgid "Last Run" +msgstr "Son Koşu" + +#: templates/extras/report_list.html:70 templates/extras/script_list.html:77 +msgid "Never" +msgstr "Asla" + +#: templates/extras/report_list.html:75 +msgid "Report has no test methods" +msgstr "Raporda test yöntemi yok" + +#: templates/extras/report_list.html:76 +msgid "Invalid" +msgstr "Geçersiz" + +#: templates/extras/report_list.html:125 +msgid "No Reports Found" +msgstr "Rapor Bulunamadı" + +#: templates/extras/report_list.html:128 +#, python-format +msgid "" +"Get started by creating a report from " +"an uploaded file or data source." +msgstr "" +"Şuradan başlayın rapor oluşturma " +"yüklenen bir dosyadan veya veri kaynağından." + +#: templates/extras/script.html:13 +msgid "You do not have permission to run scripts" +msgstr "Komut dosyalarını çalıştırma izniniz yok" + +#: templates/extras/script.html:37 +msgid "Run Script" +msgstr "Komut Dosyasını Çalıştır" + +#: templates/extras/script_list.html:44 +#, python-format +msgid "" +"Script file at %(file_path)s could not be " +"loaded." +msgstr "" +"Komut dosyası şu adreste %(file_path)s " +"yüklenemedi." + +#: templates/extras/script_list.html:91 +msgid "No Scripts Found" +msgstr "Komut Dosyası Bulunamadı" + +#: templates/extras/script_list.html:94 +#, python-format +msgid "" +"Get started by creating a script from " +"an uploaded file or data source." +msgstr "" +"Şuradan başlayın bir komut dosyası " +"oluşturma yüklenen bir dosyadan veya veri kaynağından." + +#: templates/extras/script_result.html:42 +msgid "Log" +msgstr "Günlüğe" + +#: templates/extras/tag.html:35 +msgid "Tagged Items" +msgstr "Etiketli Öğeler" + +#: templates/extras/tag.html:47 +msgid "Allowed Object Types" +msgstr "İzin Verilen Nesne Türleri" + +#: templates/extras/tag.html:56 +msgid "Any" +msgstr "Herhangi bir" + +#: templates/extras/tag.html:63 +msgid "Tagged Item Types" +msgstr "Etiketli Öğe Türleri" + +#: templates/extras/tag.html:89 +msgid "Tagged Objects" +msgstr "Etiketli Nesneler" + +#: templates/extras/webhook.html:33 +msgid "HTTP Method" +msgstr "HTTP Yöntemi" + +#: templates/extras/webhook.html:41 +msgid "HTTP Content Type" +msgstr "HTTP İçerik Türü" + +#: templates/extras/webhook.html:58 +msgid "SSL Verification" +msgstr "SSL Doğrulama" + +#: templates/extras/webhook.html:73 +msgid "Additional Headers" +msgstr "Ek Başlıklar" + +#: templates/extras/webhook.html:85 +msgid "Body Template" +msgstr "Vücut Şablonu" + +#: templates/generic/bulk_add_component.html:15 +msgid "Bulk Creation" +msgstr "Toplu Oluşturma" + +#: templates/generic/bulk_add_component.html:20 +#: templates/generic/bulk_edit.html:28 +msgid "Selected Objects" +msgstr "Seçili Nesneler" + +#: templates/generic/bulk_add_component.html:46 +msgid "to Add" +msgstr "Eklemek için" + +#: templates/generic/bulk_delete.html:24 +msgid "Confirm Bulk Deletion" +msgstr "Toplu Silmeyi Onayla" + +#: templates/generic/bulk_delete.html:26 +msgctxt "Noun" +msgid "Warning" +msgstr "Uyarı" + +#: templates/generic/bulk_delete.html:27 +#, python-format +msgid "" +"The following operation will delete %(count)s " +"%(type_plural)s. Please carefully review the objects to be deleted and " +"confirm below." +msgstr "" +"Aşağıdaki işlem silinecek %(count)s %(type_plural)s. Lütfen" +" silinecek nesneleri dikkatlice inceleyin ve aşağıda onaylayın." + +#: templates/generic/bulk_edit.html:16 templates/generic/object_edit.html:17 +msgid "Editing" +msgstr "Düzenleme" + +#: templates/generic/bulk_edit.html:23 +msgid "Bulk Edit" +msgstr "Toplu Düzenleme" + +#: templates/generic/bulk_edit.html:124 templates/generic/bulk_rename.html:42 +msgid "Apply" +msgstr "Uygula" + +#: templates/generic/bulk_import.html:14 +msgid "Bulk Import" +msgstr "Toplu İthalat" + +#: templates/generic/bulk_import.html:20 +msgid "Direct Import" +msgstr "Doğrudan İthalat" + +#: templates/generic/bulk_import.html:25 +msgid "Upload File" +msgstr "Dosya Yükle" + +#: templates/generic/bulk_import.html:51 templates/generic/bulk_import.html:73 +#: templates/generic/bulk_import.html:95 +msgid "Submit" +msgstr "Gönder" + +#: templates/generic/bulk_import.html:110 +msgid "Field Options" +msgstr "Alan Seçenekleri" + +#: templates/generic/bulk_import.html:117 +msgid "Accessor" +msgstr "Aksesuar" + +#: templates/generic/bulk_import.html:154 +msgid "Import Value" +msgstr "İthalat Değeri" + +#: templates/generic/bulk_import.html:181 +msgid "Format: YYYY-MM-DD" +msgstr "Biçim: YYYY-MM-DD" + +#: templates/generic/bulk_import.html:183 +msgid "Specify true or false" +msgstr "Doğru veya yanlış belirtin" + +#: templates/generic/bulk_import.html:195 +msgid "Required fields must be specified for all objects." +msgstr "Zorunlu alanlar şart tüm nesneler için belirtilir." + +#: templates/generic/bulk_import.html:201 +#, python-format +msgid "" +"Related objects may be referenced by any unique attribute. For example, " +"%(example)s would identify a VRF by its route distinguisher." +msgstr "" +"İlgili nesnelere herhangi bir benzersiz öznitelik tarafından başvurulabilir." +" Örneğin, %(example)s bir VRF'yi rota ayırt edicisi ile " +"tanımlar." + +#: templates/generic/bulk_remove.html:13 +msgid "Confirm Bulk Removal" +msgstr "Toplu Kaldırmayı Onayla" + +#: templates/generic/bulk_remove.html:15 +#, python-format +msgid "" +"Warning: The following operation will remove %(count)s " +"%(obj_type_plural)s from %(parent_obj)s." +msgstr "" +"Uyarı: Aşağıdaki işlem kaldırılacak %(count)s " +"%(obj_type_plural)s beri %(parent_obj)s." + +#: templates/generic/bulk_remove.html:21 +#, python-format +msgid "" +"Please carefully review the %(obj_type_plural)s to be removed and confirm " +"below." +msgstr "" +"Lütfen dikkatlice inceleyin %(obj_type_plural)s kaldırılacak ve aşağıda " +"onaylanacak." + +#: templates/generic/bulk_remove.html:38 +#, python-format +msgid "Delete these %(count)s %(obj_type_plural)s" +msgstr "Bunları sil %(count)s %(obj_type_plural)s" + +#: templates/generic/bulk_rename.html:7 +msgid "Renaming" +msgstr "Yeniden Adlandırma" + +#: templates/generic/bulk_rename.html:16 +msgid "Current Name" +msgstr "Geçerli İsim" + +#: templates/generic/bulk_rename.html:17 +msgid "New Name" +msgstr "Yeni İsim" + +#: templates/generic/bulk_rename.html:40 +#: utilities/templates/widgets/markdown_input.html:11 +msgid "Preview" +msgstr "Önizleme" + +#: templates/generic/confirmation_form.html:16 +msgid "Are you sure" +msgstr "Emin misin" + +#: templates/generic/confirmation_form.html:19 +msgid "Confirm" +msgstr "Onayla" + +#: templates/generic/object.html:51 +msgid "ago" +msgstr "önce" + +#: templates/generic/object_children.html:27 +#: utilities/templates/buttons/bulk_edit.html:4 +msgid "Edit Selected" +msgstr "Seçili Düzenle" + +#: templates/generic/object_children.html:41 +#: utilities/templates/buttons/bulk_delete.html:4 +msgid "Delete Selected" +msgstr "Seçili Sil" + +#: templates/generic/object_edit.html:19 +#, python-format +msgid "Add a new %(object_type)s" +msgstr "Yeni ekle %(object_type)s" + +#: templates/generic/object_edit.html:47 +msgid "View model documentation" +msgstr "Model belgelerini görüntüleyin" + +#: templates/generic/object_edit.html:48 +msgid "Help" +msgstr "Yardım" + +#: templates/generic/object_edit.html:73 +msgid "Create & Add Another" +msgstr "Başka Oluştur ve Ekle" + +#: templates/generic/object_list.html:48 templates/search.html:13 +msgid "Results" +msgstr "Sonuçlar" + +#: templates/generic/object_list.html:54 +msgid "Filters" +msgstr "Filtreler" + +#: templates/generic/object_list.html:94 +#, python-format +msgid "" +"Select all %(count)s %(object_type_plural)s matching query" +msgstr "" +"Seçiniz bütün %(count)s %(object_type_plural)s eşleşen " +"sorgu" + +#: templates/home.html:12 +msgid "New Release Available" +msgstr "Yeni Sürüm Mevcut" + +#: templates/home.html:14 +msgid "is available" +msgstr "mevcuttur" + +#: templates/home.html:17 +msgctxt "Document title" +msgid "Upgrade Instructions" +msgstr "Yükseltme Talimatları" + +#: templates/home.html:37 +msgid "Unlock Dashboard" +msgstr "Panelin Kilidini Açın" + +#: templates/home.html:46 +msgid "Lock Dashboard" +msgstr "Kontrol Panelini Kilitle" + +#: templates/home.html:57 +msgid "Add Widget" +msgstr "Widget Ekle" + +#: templates/home.html:60 +msgid "Save Layout" +msgstr "Düzeni Kaydet" + +#: templates/htmx/delete_form.html:7 +msgid "Confirm Deletion" +msgstr "Silmeyi Onayla" + +#: templates/htmx/delete_form.html:11 +#, python-format +msgid "" +"Are you sure you want to delete " +"%(object_type)s %(object)s?" +msgstr "" +"İstediğinizden emin misiniz silmek " +"%(object_type)s %(object)s?" + +#: templates/htmx/delete_form.html:17 +msgid "The following objects will be deleted as a result of this action." +msgstr "Bu işlem sonucunda aşağıdaki nesneler silinecektir." + +#: templates/htmx/object_selector.html:5 +msgid "Select" +msgstr "Seçiniz" + +#: templates/inc/filter_list.html:50 +#: utilities/templates/helpers/table_config_form.html:39 +msgid "Reset" +msgstr "Sıfırla" + +#: templates/inc/missing_prerequisites.html:7 +#, python-format +msgid "" +"Before you can add a %(model)s you must first create a " +"%(prerequisite_model)s." +msgstr "" +"Eklemeden önce %(model)s Önce bir yaratmalısın " +"%(prerequisite_model)s." + +#: templates/inc/paginator.html:38 templates/inc/paginator_htmx.html:53 +msgid "Per Page" +msgstr "Sayfa Başına" + +#: templates/inc/paginator.html:49 templates/inc/paginator_htmx.html:69 +#, python-format +msgid "Showing %(start)s-%(end)s of %(total)s" +msgstr "Gösterme %(start)s-%(end)s dan %(total)s" + +#: templates/inc/panels/image_attachments.html:10 +msgid "Attach an image" +msgstr "Bir resim ekle" + +#: templates/inc/panels/related_objects.html:5 +msgid "Related Objects" +msgstr "İlgili Nesneler" + +#: templates/inc/panels/tags.html:11 +msgid "No tags assigned" +msgstr "Hiçbir etiket atanmadı" + +#: templates/inc/profile_button.html:12 templates/inc/profile_button.html:62 +msgid "Dark Mode" +msgstr "Karanlık Mod" + +#: templates/inc/profile_button.html:45 +msgid "Log Out" +msgstr "Oturumu Kapat" + +#: templates/inc/profile_button.html:53 +msgid "Log In" +msgstr "Oturum aç" + +#: templates/inc/sync_warning.html:7 +msgid "Data is out of sync with upstream file" +msgstr "Veriler yukarı akış dosyasıyla senkronize değil" + +#: templates/inc/table_controls_htmx.html:16 +#: templates/inc/table_controls_htmx.html:18 +msgid "Configure Table" +msgstr "Tabloyu Yapılandır" + +#: templates/ipam/aggregate.html:15 templates/ipam/ipaddress.html:17 +#: templates/ipam/iprange.html:16 templates/ipam/prefix.html:16 +msgid "Family" +msgstr "Aile" + +#: templates/ipam/aggregate.html:40 +msgid "Date Added" +msgstr "Ekleme Tarihi" + +#: templates/ipam/aggregate/prefixes.html:8 +#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +msgid "Add Prefix" +msgstr "Önek Ekle" + +#: templates/ipam/asn.html:24 +msgid "AS Number" +msgstr "AS Numarası" + +#: templates/ipam/fhrpgroup.html:55 +msgid "Authentication Type" +msgstr "Kimlik Doğrulama Türü" + +#: templates/ipam/fhrpgroup.html:59 +msgid "Authentication Key" +msgstr "Kimlik Doğrulama Anahtarı" + +#: templates/ipam/fhrpgroup.html:72 +msgid "Virtual IP Addresses" +msgstr "Sanal IP Adresleri" + +#: templates/ipam/fhrpgroupassignment_edit.html:8 +msgid "FHRP Group Assignment" +msgstr "FHRP Grup Ataması" + +#: templates/ipam/inc/ipaddress_edit_header.html:19 +msgid "Assign IP" +msgstr "IP atayın" + +#: templates/ipam/inc/ipaddress_edit_header.html:28 +msgid "Bulk Create" +msgstr "Toplu Oluşturma" + +#: templates/ipam/inc/panels/fhrp_groups.html:12 +msgid "Virtual IPs" +msgstr "Sanal IP'ler" + +#: templates/ipam/inc/panels/fhrp_groups.html:52 +msgid "Create Group" +msgstr "Grup Oluştur" + +#: templates/ipam/inc/panels/fhrp_groups.html:57 +msgid "Assign Group" +msgstr "Grup Atama" + +#: templates/ipam/inc/toggle_available.html:7 +msgid "Show Assigned" +msgstr "Atananları Göster" + +#: templates/ipam/inc/toggle_available.html:10 +msgid "Show Available" +msgstr "Mevcut Göster" + +#: templates/ipam/inc/toggle_available.html:13 +msgid "Show All" +msgstr "Tümünü Göster" + +#: templates/ipam/ipaddress.html:26 templates/ipam/iprange.html:48 +#: templates/ipam/prefix.html:25 +msgid "Global" +msgstr "Küresel" + +#: templates/ipam/ipaddress.html:88 +msgid "NAT (outside)" +msgstr "NAT (dış)" + +#: templates/ipam/ipaddress_assign.html:8 +msgid "Assign an IP Address" +msgstr "IP Adresi Atama" + +#: templates/ipam/ipaddress_assign.html:23 +msgid "Select IP Address" +msgstr "IP Adresini Seçin" + +#: templates/ipam/ipaddress_assign.html:39 +msgid "Search Results" +msgstr "Arama Sonuçları" + +#: templates/ipam/ipaddress_bulk_add.html:6 +msgid "Bulk Add IP Addresses" +msgstr "Toplu IP Adresleri Ekleme" + +#: templates/ipam/ipaddress_edit.html:35 +msgid "Interface Assignment" +msgstr "Arayüz Ataması" + +#: templates/ipam/ipaddress_edit.html:74 +msgid "NAT IP (Inside" +msgstr "NAT IP (İçinde" + +#: templates/ipam/iprange.html:20 +msgid "Starting Address" +msgstr "Başlangıç Adresi" + +#: templates/ipam/iprange.html:24 +msgid "Ending Address" +msgstr "Bitiş Adresi" + +#: templates/ipam/iprange.html:36 templates/ipam/prefix.html:104 +msgid "Marked fully utilized" +msgstr "Tamamen kullanılmış olarak işaretlenmiş" + +#: templates/ipam/prefix.html:112 +msgid "Child IPs" +msgstr "Çocuk IP'leri" + +#: templates/ipam/prefix.html:120 +msgid "Available IPs" +msgstr "Kullanılabilir IP'ler" + +#: templates/ipam/prefix.html:132 +msgid "First available IP" +msgstr "İlk kullanılabilir IP" + +#: templates/ipam/prefix.html:151 +msgid "Addressing Details" +msgstr "Adresleme Ayrıntıları" + +#: templates/ipam/prefix.html:181 +msgid "Prefix Details" +msgstr "Önek Ayrıntıları" + +#: templates/ipam/prefix.html:187 +msgid "Network Address" +msgstr "Ağ Adresi" + +#: templates/ipam/prefix.html:191 +msgid "Network Mask" +msgstr "Ağ Maskesi" + +#: templates/ipam/prefix.html:195 +msgid "Wildcard Mask" +msgstr "Joker Karakter Maskesi" + +#: templates/ipam/prefix.html:199 +msgid "Broadcast Address" +msgstr "Yayın Adresi" + +#: templates/ipam/prefix/ip_ranges.html:7 +msgid "Add IP Range" +msgstr "IP Aralığı Ekle" + +#: templates/ipam/prefix_list.html:7 +msgid "Hide Depth Indicators" +msgstr "Derinlik Göstergelerini Gizle" + +#: templates/ipam/prefix_list.html:11 +msgid "Max Depth" +msgstr "Maksimum Derinlik" + +#: templates/ipam/prefix_list.html:28 +msgid "Max Length" +msgstr "Maksimum Uzunluk" + +#: templates/ipam/rir.html:10 +msgid "Add Aggregate" +msgstr "Toplama Ekle" + +#: templates/ipam/routetarget.html:10 +msgid "Route Target" +msgstr "Rota Hedefi" + +#: templates/ipam/routetarget.html:40 +msgid "Importing VRFs" +msgstr "VRF'leri içe aktarma" + +#: templates/ipam/routetarget.html:49 +msgid "Exporting VRFs" +msgstr "VRF'leri Dışa Aktarma" + +#: templates/ipam/routetarget.html:60 +msgid "Importing L2VPNs" +msgstr "L2VPN'leri içe aktarma" + +#: templates/ipam/routetarget.html:69 +msgid "Exporting L2VPNs" +msgstr "L2VPN'leri Dışa Aktarma" + +#: templates/ipam/service.html:22 templates/ipam/service_create.html:8 +#: templates/ipam/service_edit.html:8 +msgid "Service" +msgstr "Hizmet" + +#: templates/ipam/service_create.html:43 +msgid "From Template" +msgstr "Şablondan" + +#: templates/ipam/service_create.html:48 +msgid "Custom" +msgstr "Özel" + +#: templates/ipam/service_edit.html:37 +msgid "Port(s)" +msgstr "Liman (lar)" + +#: templates/ipam/vlan.html:95 +msgid "Add a Prefix" +msgstr "Önek Ekle" + +#: templates/ipam/vlangroup.html:18 +msgid "Add VLAN" +msgstr "VLAN ekle" + +#: templates/ipam/vlangroup.html:43 +msgid "Permitted VIDs" +msgstr "İzin Verilen Videolar" + +#: templates/ipam/vrf.html:19 +msgid "Route Distinguisher" +msgstr "Rota Ayırt Edici" + +#: templates/ipam/vrf.html:32 +msgid "Unique IP Space" +msgstr "Benzersiz IP Alanı" + +#: templates/login.html:20 +#: utilities/templates/form_helpers/render_errors.html:7 +msgid "Errors" +msgstr "Hatalar" + +#: templates/login.html:48 +msgid "Sign In" +msgstr "Oturum aç" + +#: templates/login.html:54 +msgid "Or use a single sign-on (SSO) provider" +msgstr "Veya tek oturum açma (SSO) sağlayıcısı kullanın" + +#: templates/login.html:68 +msgid "Toggle Color Mode" +msgstr "Renk Modunu Aç/Kapat" + +#: templates/media_failure.html:7 +msgid "Static Media Failure - NetBox" +msgstr "Statik Ortam Hatası - NetBox" + +#: templates/media_failure.html:21 +msgid "Static Media Failure" +msgstr "Statik Ortam Arızası" + +#: templates/media_failure.html:23 +msgid "The following static media file failed to load" +msgstr "Aşağıdaki statik medya dosyası yüklenemedi" + +#: templates/media_failure.html:26 +msgid "Check the following" +msgstr "Aşağıdakileri kontrol edin" + +#: templates/media_failure.html:29 +msgid "" +"manage.py collectstatic was run during the most recent upgrade." +" This installs the most recent iteration of each static file into the static" +" root path." +msgstr "" +"manage.py collectstatik en son yükseltme sırasında " +"çalıştırıldı. Bu, her statik dosyanın en son yinelemesini statik kök yoluna " +"yükler." + +#: templates/media_failure.html:35 +#, python-format +msgid "" +"The HTTP service (e.g. nginx or Apache) is configured to serve files from " +"the STATIC_ROOT path. Refer to the " +"installation documentation for further guidance." +msgstr "" +"HTTP hizmeti (örn. nginx veya Apache) dosyalara hizmet verecek şekilde " +"yapılandırılmıştır. STATİC_ROOT yol. Bakınız kurulum belgeleri Daha fazla rehberlik için." + +#: templates/media_failure.html:47 +#, python-format +msgid "" +"The file %(filename)s exists in the static root directory and " +"is readable by the HTTP server." +msgstr "" +"Dosya %(filename)s statik kök dizinde bulunur ve HTTP sunucusu " +"tarafından okunabilir." + +#: templates/media_failure.html:55 +#, python-format +msgid "Click here to attempt loading NetBox again." +msgstr "" +"Tıklayın burada NetBox'ı tekrar yüklemeyi " +"denemek için." + +#: templates/tenancy/contact.html:18 tenancy/filtersets.py:136 +#: tenancy/forms/bulk_edit.py:136 tenancy/forms/filtersets.py:101 +#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:109 +#: tenancy/forms/model_forms.py:132 tenancy/tables/contacts.py:98 +msgid "Contact" +msgstr "İletişim" + +#: templates/tenancy/contact.html:30 tenancy/forms/bulk_edit.py:98 +msgid "Title" +msgstr "Başlık" + +#: templates/tenancy/contact.html:34 tenancy/forms/bulk_edit.py:103 +#: tenancy/tables/contacts.py:64 +msgid "Phone" +msgstr "Telefon" + +#: templates/tenancy/contact.html:86 tenancy/tables/contacts.py:73 +msgid "Assignments" +msgstr "Ödevler" + +#: templates/tenancy/contactassignment_edit.html:12 +msgid "Contact Assignment" +msgstr "İletişim Ataması" + +#: templates/tenancy/contactgroup.html:19 tenancy/forms/forms.py:66 +#: tenancy/forms/model_forms.py:76 +msgid "Contact Group" +msgstr "İletişim Grubu" + +#: templates/tenancy/contactgroup.html:57 +msgid "Add Contact Group" +msgstr "Kişi Grubu Ekle" + +#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:141 +#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:90 +msgid "Contact Role" +msgstr "İletişim Rolü" + +#: templates/tenancy/object_contacts.html:9 +msgid "Add a contact" +msgstr "Kişi ekle" + +#: templates/tenancy/tenantgroup.html:17 +msgid "Add Tenant" +msgstr "Kiracı Ekle" + +#: templates/tenancy/tenantgroup.html:27 tenancy/forms/model_forms.py:31 +#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +msgid "Tenant Group" +msgstr "Kiracı Grubu" + +#: templates/tenancy/tenantgroup.html:66 +msgid "Add Tenant Group" +msgstr "Kiracı Grubu Ekle" + +#: templates/users/group.html:37 templates/users/user.html:61 +msgid "Assigned Permissions" +msgstr "Atanan İzinler" + +#: templates/users/objectpermission.html:6 +#: templates/users/objectpermission.html:14 users/forms/filtersets.py:67 +msgid "Permission" +msgstr "İzin" + +#: templates/users/objectpermission.html:33 users/forms/filtersets.py:68 +#: users/forms/model_forms.py:322 +msgid "Actions" +msgstr "Eylemler" + +#: templates/users/objectpermission.html:37 +msgid "View" +msgstr "Görünüm" + +#: templates/users/objectpermission.html:56 users/forms/model_forms.py:325 +msgid "Constraints" +msgstr "Kısıtlamalar" + +#: templates/users/objectpermission.html:76 +msgid "Assigned Users" +msgstr "Atanan Kullanıcılar" + +#: templates/users/user.html:38 +msgid "Staff" +msgstr "Personel" + +#: templates/virtualization/cluster.html:56 +msgid "Allocated Resources" +msgstr "Tahsis Edilen Kaynaklar" + +#: templates/virtualization/cluster.html:60 +#: templates/virtualization/virtualmachine.html:128 +msgid "Virtual CPUs" +msgstr "Sanal CPU'lar" + +#: templates/virtualization/cluster.html:64 +#: templates/virtualization/virtualmachine.html:132 +msgid "Memory" +msgstr "Bellek" + +#: templates/virtualization/cluster.html:74 +#: templates/virtualization/virtualmachine.html:143 +msgid "Disk Space" +msgstr "Disk Alanı" + +#: templates/virtualization/cluster.html:77 +#: templates/virtualization/virtualdisk.html:33 +#: templates/virtualization/virtualmachine.html:147 +msgctxt "Abbreviation for gigabyte" +msgid "GB" +msgstr "BÜYÜK BRİTANYA" + +#: templates/virtualization/cluster/base.html:18 +msgid "Add Virtual Machine" +msgstr "Sanal Makine Ekle" + +#: templates/virtualization/cluster/base.html:24 +msgid "Assign Device" +msgstr "Aygıt Atama" + +#: templates/virtualization/cluster/devices.html:10 +msgid "Remove Selected" +msgstr "Seçili Kaldır" + +#: templates/virtualization/cluster_add_devices.html:9 +#, python-format +msgid "Add Device to Cluster %(cluster)s" +msgstr "Kümeye Aygıt Ekle %(cluster)s" + +#: templates/virtualization/cluster_add_devices.html:23 +msgid "Device Selection" +msgstr "Cihaz Seçimi" + +#: templates/virtualization/cluster_add_devices.html:31 +msgid "Add Devices" +msgstr "Aygıt Ekle" + +#: templates/virtualization/clustergroup.html:10 +#: templates/virtualization/clustertype.html:10 +msgid "Add Cluster" +msgstr "Küme Ekle" + +#: templates/virtualization/clustergroup.html:20 +#: virtualization/forms/model_forms.py:51 +msgid "Cluster Group" +msgstr "Küme Grubu" + +#: templates/virtualization/clustertype.html:20 +#: templates/virtualization/virtualmachine.html:111 +#: virtualization/forms/model_forms.py:35 +msgid "Cluster Type" +msgstr "Küme Türü" + +#: templates/virtualization/virtualdisk.html:18 +msgid "Virtual Disk" +msgstr "Sanal Disk" + +#: templates/virtualization/virtualmachine.html:124 +#: virtualization/forms/bulk_edit.py:189 +#: virtualization/forms/model_forms.py:227 +msgid "Resources" +msgstr "Kaynaklar" + +#: templates/virtualization/virtualmachine.html:185 +msgid "Add Virtual Disk" +msgstr "Sanal Disk Ekle" + +#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:35 +#: vpn/tables/crypto.py:166 +msgid "IKE Policy" +msgstr "IKE Politikası" + +#: templates/vpn/ikepolicy.html:22 +msgid "IKE Version" +msgstr "IKE Versiyonu" + +#: templates/vpn/ikepolicy.html:30 +msgid "Pre-Shared Key" +msgstr "Önceden Paylaşılan Anahtar" + +#: templates/vpn/ikepolicy.html:34 +#: templates/wireless/inc/authentication_attrs.html:21 +msgid "Show Secret" +msgstr "Sırrı Göster" + +#: templates/vpn/ikepolicy.html:59 templates/vpn/ipsecpolicy.html:47 +#: templates/vpn/ipsecprofile.html:55 templates/vpn/ipsecprofile.html:82 +#: vpn/forms/model_forms.py:310 vpn/forms/model_forms.py:345 +#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +msgid "Proposals" +msgstr "Teklifler" + +#: templates/vpn/ikeproposal.html:10 +msgid "IKE Proposal" +msgstr "IKE Teklifi" + +#: templates/vpn/ikeproposal.html:22 vpn/forms/bulk_edit.py:96 +#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:98 +msgid "Authentication method" +msgstr "Kimlik doğrulama yöntemi" + +#: templates/vpn/ikeproposal.html:26 templates/vpn/ipsecproposal.html:22 +#: vpn/forms/bulk_edit.py:101 vpn/forms/bulk_edit.py:173 +#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 +#: vpn/forms/filtersets.py:103 vpn/forms/filtersets.py:151 +msgid "Encryption algorithm" +msgstr "Şifreleme algoritması" + +#: templates/vpn/ikeproposal.html:30 templates/vpn/ipsecproposal.html:26 +#: vpn/forms/bulk_edit.py:106 vpn/forms/bulk_edit.py:178 +#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 +#: vpn/forms/filtersets.py:108 vpn/forms/filtersets.py:156 +msgid "Authentication algorithm" +msgstr "Kimlik doğrulama algoritması" + +#: templates/vpn/ikeproposal.html:34 +msgid "DH group" +msgstr "DH grubu" + +#: templates/vpn/ikeproposal.html:38 templates/vpn/ipsecproposal.html:30 +#: vpn/forms/bulk_edit.py:183 vpn/models/crypto.py:146 +msgid "SA lifetime (seconds)" +msgstr "SA ömrü (saniye)" + +#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:70 +#: vpn/tables/crypto.py:170 +msgid "IPSec Policy" +msgstr "IPSec Politikası" + +#: templates/vpn/ipsecpolicy.html:22 vpn/forms/bulk_edit.py:211 +#: vpn/models/crypto.py:193 +msgid "PFS group" +msgstr "PFS grubu" + +#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:53 +msgid "IPSec Profile" +msgstr "IPsec Profili" + +#: templates/vpn/ipsecprofile.html:94 vpn/tables/crypto.py:137 +msgid "PFS Group" +msgstr "PFS Grubu" + +#: templates/vpn/ipsecproposal.html:10 +msgid "IPSec Proposal" +msgstr "IPsec Teklifi" + +#: templates/vpn/ipsecproposal.html:34 vpn/forms/bulk_edit.py:187 +#: vpn/models/crypto.py:152 +msgid "SA lifetime (KB)" +msgstr "SA ömrü (KB)" + +#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:10 +msgid "L2VPN Attributes" +msgstr "L2VPN Öznitellikler" + +#: templates/vpn/l2vpn.html:65 templates/vpn/tunnel.html:81 +msgid "Add a Termination" +msgstr "Sonlandırma Ekle" + +#: templates/vpn/l2vpntermination_edit.html:9 +msgid "L2VPN Termination" +msgstr "L2VPN Sonlandırma" + +#: templates/vpn/tunnel.html:9 +msgid "Add Termination" +msgstr "Sonlandırma Ekle" + +#: templates/vpn/tunnel.html:38 vpn/forms/bulk_edit.py:48 +#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:56 +msgid "Encapsulation" +msgstr "Kapsülleme" + +#: templates/vpn/tunnel.html:42 vpn/forms/bulk_edit.py:54 +#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:63 +#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:47 +msgid "IPSec profile" +msgstr "IPsec profili" + +#: templates/vpn/tunnel.html:46 vpn/forms/bulk_edit.py:68 +#: vpn/forms/filtersets.py:67 +msgid "Tunnel ID" +msgstr "Tünel Kimliği" + +#: templates/vpn/tunnelgroup.html:14 +msgid "Add Tunnel" +msgstr "Tünel Ekle" + +#: templates/vpn/tunnelgroup.html:24 vpn/forms/model_forms.py:35 +#: vpn/forms/model_forms.py:48 +msgid "Tunnel Group" +msgstr "Tünel Grubu" + +#: templates/vpn/tunneltermination.html:10 +msgid "Tunnel Termination" +msgstr "Tünel Sonlandırma" + +#: templates/vpn/tunneltermination.html:36 vpn/forms/bulk_import.py:107 +#: vpn/forms/model_forms.py:101 vpn/forms/model_forms.py:137 +#: vpn/forms/model_forms.py:248 vpn/tables/tunnels.py:97 +msgid "Outside IP" +msgstr "Dış IP" + +#: templates/vpn/tunneltermination.html:53 +msgid "Peer Terminations" +msgstr "Akran Sonlandırmaları" + +#: templates/wireless/inc/authentication_attrs.html:13 +msgid "Cipher" +msgstr "Şifre" + +#: templates/wireless/inc/authentication_attrs.html:17 +msgid "PSK" +msgstr "PSK" + +#: templates/wireless/inc/wirelesslink_interface.html:35 +#: templates/wireless/inc/wirelesslink_interface.html:45 +msgctxt "Abbreviation for megahertz" +msgid "MHz" +msgstr "MHz" + +#: templates/wireless/wirelesslan.html:11 wireless/forms/model_forms.py:54 +msgid "Wireless LAN" +msgstr "Kablosuz LAN" + +#: templates/wireless/wirelesslan.html:59 +msgid "Attached Interfaces" +msgstr "Ekli Arayüzler" + +#: templates/wireless/wirelesslangroup.html:17 +msgid "Add Wireless LAN" +msgstr "Kablosuz LAN Ekle" + +#: templates/wireless/wirelesslangroup.html:26 +#: wireless/forms/model_forms.py:27 +msgid "Wireless LAN Group" +msgstr "Kablosuz LAN Grubu" + +#: templates/wireless/wirelesslangroup.html:64 +msgid "Add Wireless LAN Group" +msgstr "Kablosuz LAN Grubu Ekle" + +#: templates/wireless/wirelesslink.html:16 +msgid "Link Properties" +msgstr "Bağlantı Özellikleri" + +#: tenancy/choices.py:19 +msgid "Tertiary" +msgstr "Üçüncül" + +#: tenancy/choices.py:20 +msgid "Inactive" +msgstr "Etkin Olmayan" + +#: tenancy/filtersets.py:29 tenancy/filtersets.py:55 tenancy/filtersets.py:98 +msgid "Contact group (ID)" +msgstr "İletişim grubu (ID)" + +#: tenancy/filtersets.py:35 tenancy/filtersets.py:62 tenancy/filtersets.py:105 +msgid "Contact group (slug)" +msgstr "İletişim grubu (sümüklü böcek)" + +#: tenancy/filtersets.py:92 +msgid "Contact (ID)" +msgstr "İletişim (ID)" + +#: tenancy/filtersets.py:109 +msgid "Contact role (ID)" +msgstr "Kişi rolü (ID)" + +#: tenancy/filtersets.py:115 +msgid "Contact role (slug)" +msgstr "İletişim rolü (sümüklü böcek)" + +#: tenancy/filtersets.py:147 +msgid "Contact group" +msgstr "İletişim grubu" + +#: tenancy/filtersets.py:158 tenancy/filtersets.py:177 +msgid "Tenant group (ID)" +msgstr "Kiracı grubu (ID)" + +#: tenancy/filtersets.py:210 +msgid "Tenant Group (ID)" +msgstr "Kiracı Grubu (ID)" + +#: tenancy/filtersets.py:217 +msgid "Tenant Group (slug)" +msgstr "Kiracı Grubu (sümüklü böcek)" + +#: tenancy/forms/bulk_edit.py:65 +msgid "Desciption" +msgstr "Tanımlama" + +#: tenancy/forms/bulk_import.py:101 +msgid "Assigned contact" +msgstr "Atanan kişi" + +#: tenancy/models/contacts.py:32 +msgid "contact group" +msgstr "iletişim grubu" + +#: tenancy/models/contacts.py:33 +msgid "contact groups" +msgstr "iletişim grupları" + +#: tenancy/models/contacts.py:48 +msgid "contact role" +msgstr "iletişim rolü" + +#: tenancy/models/contacts.py:49 +msgid "contact roles" +msgstr "iletişim rolleri" + +#: tenancy/models/contacts.py:68 +msgid "title" +msgstr "başlık" + +#: tenancy/models/contacts.py:73 +msgid "phone" +msgstr "telefon" + +#: tenancy/models/contacts.py:78 +msgid "email" +msgstr "E-posta" + +#: tenancy/models/contacts.py:87 +msgid "link" +msgstr "bağlantı" + +#: tenancy/models/contacts.py:103 +msgid "contact" +msgstr "temas" + +#: tenancy/models/contacts.py:104 +msgid "contacts" +msgstr "kişileri" + +#: tenancy/models/contacts.py:153 +msgid "contact assignment" +msgstr "iletişim ataması" + +#: tenancy/models/contacts.py:154 +msgid "contact assignments" +msgstr "iletişim atamaları" + +#: tenancy/models/contacts.py:170 +#, python-brace-format +msgid "Contacts cannot be assigned to this object type ({type})." +msgstr "Kişiler bu nesne türüne atanamaz ({type})." + +#: tenancy/models/tenants.py:32 +msgid "tenant group" +msgstr "kiracı grubu" + +#: tenancy/models/tenants.py:33 +msgid "tenant groups" +msgstr "kiracı grupları" + +#: tenancy/models/tenants.py:70 +msgid "Tenant name must be unique per group." +msgstr "Kiracı adı grup başına benzersiz olmalıdır." + +#: tenancy/models/tenants.py:80 +msgid "Tenant slug must be unique per group." +msgstr "Kiracı sümüklü böcek grup başına benzersiz olmalıdır." + +#: tenancy/models/tenants.py:88 +msgid "tenant" +msgstr "kiracı" + +#: tenancy/models/tenants.py:89 +msgid "tenants" +msgstr "kiracılar" + +#: tenancy/tables/contacts.py:112 +msgid "Contact Title" +msgstr "İletişim Başlığı" + +#: tenancy/tables/contacts.py:116 +msgid "Contact Phone" +msgstr "İletişim Telefonu" + +#: tenancy/tables/contacts.py:120 +msgid "Contact Email" +msgstr "İletişim E-posta" + +#: tenancy/tables/contacts.py:124 +msgid "Contact Address" +msgstr "İletişim Adresi" + +#: tenancy/tables/contacts.py:128 +msgid "Contact Link" +msgstr "İletişim Bağlantısı" + +#: tenancy/tables/contacts.py:132 +msgid "Contact Description" +msgstr "İletişim Açıklaması" + +#: users/filtersets.py:48 users/filtersets.py:151 +msgid "Group (name)" +msgstr "Grup (isim)" + +#: users/forms/bulk_edit.py:24 +msgid "First name" +msgstr "İlk isim" + +#: users/forms/bulk_edit.py:29 +msgid "Last name" +msgstr "Soyadı" + +#: users/forms/bulk_edit.py:41 +msgid "Staff status" +msgstr "Personel durumu" + +#: users/forms/bulk_edit.py:46 +msgid "Superuser status" +msgstr "Süper kullanıcı durumu" + +#: users/forms/bulk_import.py:43 +msgid "If no key is provided, one will be generated automatically." +msgstr "Anahtar sağlanmazsa, bir anahtar otomatik olarak oluşturulur." + +#: users/forms/filtersets.py:52 users/tables.py:42 +msgid "Is Staff" +msgstr "Personel mi" + +#: users/forms/filtersets.py:59 users/tables.py:45 +msgid "Is Superuser" +msgstr "Süper kullanıcı mı" + +#: users/forms/filtersets.py:92 users/tables.py:89 +msgid "Can View" +msgstr "Görebilir" + +#: users/forms/filtersets.py:99 users/tables.py:92 +msgid "Can Add" +msgstr "Ekleyebilir" + +#: users/forms/filtersets.py:106 users/tables.py:95 +msgid "Can Change" +msgstr "Değişebilir" + +#: users/forms/filtersets.py:113 users/tables.py:98 +msgid "Can Delete" +msgstr "Silebilir" + +#: users/forms/model_forms.py:58 +msgid "User Interface" +msgstr "Kullanıcı Arayüzü" + +#: users/forms/model_forms.py:116 +msgid "" +"Keys must be at least 40 characters in length. Be sure to record " +"your key prior to submitting this form, as it may no longer be " +"accessible once the token has been created." +msgstr "" +"Anahtarların uzunluğu en az 40 karakter olmalıdır. Anahtarınızı " +"kaydettiğinizden emin olun belirteç oluşturulduktan sonra artık " +"erişilemeyebileceğinden, bu formu göndermeden önce." + +#: users/forms/model_forms.py:128 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" +" no restrictions. Example: " +"10.1.1.0/24,192.168.10.16/32,2001:db8:1::/64" +msgstr "" +"Belirtecin kullanılabileceği izin verilen IPv4/IPv6 ağları. Kısıtlama " +"olmadan boş bırakın. Örnek: 10.1.1.0/24.192.168.10.16/32,2001: db 8:1:" +" :/64" + +#: users/forms/model_forms.py:177 +msgid "Confirm password" +msgstr "Şifreyi onayla" + +#: users/forms/model_forms.py:180 +msgid "Enter the same password as before, for verification." +msgstr "Doğrulama için öncekiyle aynı şifreyi girin." + +#: users/forms/model_forms.py:238 +msgid "Passwords do not match! Please check your input and try again." +msgstr "" +"Şifreler eşleşmiyor! Lütfen girdilerinizi kontrol edin ve tekrar deneyin." + +#: users/forms/model_forms.py:304 +msgid "Additional actions" +msgstr "Ek eylemler" + +#: users/forms/model_forms.py:307 +msgid "Actions granted in addition to those listed above" +msgstr "Yukarıda listelenenlere ek olarak verilen eylemler" + +#: users/forms/model_forms.py:323 +msgid "Objects" +msgstr "Nesneler" + +#: users/forms/model_forms.py:335 +msgid "" +"JSON expression of a queryset filter that will return only permitted " +"objects. Leave null to match all objects of this type. A list of multiple " +"objects will result in a logical OR operation." +msgstr "" +"Yalnızca izin verilen nesneleri döndürecek bir queryset filtresinin JSON " +"ifadesi. Bu türdeki tüm nesneleri eşleştirmek için null bırakın. Birden çok " +"nesnenin listesi mantıksal bir OR işlemi ile sonuçlanır." + +#: users/forms/model_forms.py:373 +msgid "At least one action must be selected." +msgstr "En az bir eylem seçilmelidir." + +#: users/forms/model_forms.py:390 +#, python-brace-format +msgid "Invalid filter for {model}: {error}" +msgstr "Geçersiz filtre {model}: {error}" + +#: users/models.py:54 +msgid "user" +msgstr "kullanıcı" + +#: users/models.py:55 +msgid "users" +msgstr "kullanıcıları" + +#: users/models.py:66 +msgid "A user with this username already exists." +msgstr "Bu kullanıcı adına sahip bir kullanıcı zaten var." + +#: users/models.py:78 vpn/models/crypto.py:42 +msgid "group" +msgstr "grup" + +#: users/models.py:79 +msgid "groups" +msgstr "gruplar" + +#: users/models.py:106 users/models.py:107 +msgid "user preferences" +msgstr "kullanıcı tercihleri" + +#: users/models.py:174 +#, python-brace-format +msgid "Key '{path}' is a leaf node; cannot assign new keys" +msgstr "Anahtar '{path}'bir yaprak düğümüdür; yeni anahtarlar atanamıyor" + +#: users/models.py:186 +#, python-brace-format +msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" +msgstr "Anahtar '{path}'bir sözlüktür; sözlük dışı bir değer atayamaz" + +#: users/models.py:252 +msgid "expires" +msgstr "süresi dolmak" + +#: users/models.py:257 +msgid "last used" +msgstr "son kullanılan" + +#: users/models.py:262 +msgid "key" +msgstr "anahtar" + +#: users/models.py:268 +msgid "write enabled" +msgstr "yazma etkin" + +#: users/models.py:270 +msgid "Permit create/update/delete operations using this key" +msgstr "" +"Bu anahtarı kullanarak oluşturma/güncelleme/silme işlemlerine izin verin" + +#: users/models.py:281 +msgid "allowed IPs" +msgstr "izin verilen IP'ler" + +#: users/models.py:283 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" +" no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" +msgstr "" +"Belirtecin kullanılabileceği izin verilen IPv4/IPv6 ağları. Kısıtlama " +"olmadan boş bırakın. Örn: “10.1.1.0/24, 192.168.10.16/32, 2001: DB 8:1: " +":/64\"" + +#: users/models.py:291 +msgid "token" +msgstr "jeton" + +#: users/models.py:292 +msgid "tokens" +msgstr "jetonlar" + +#: users/models.py:373 +msgid "The list of actions granted by this permission" +msgstr "Bu izin tarafından verilen eylemlerin listesi" + +#: users/models.py:378 +msgid "constraints" +msgstr "kısıtlamaları" + +#: users/models.py:379 +msgid "" +"Queryset filter matching the applicable objects of the selected type(s)" +msgstr "Seçili türlerin uygulanabilir nesneleriyle eşleşen Queryset filtresi" + +#: users/models.py:386 +msgid "permission" +msgstr "izin" + +#: users/models.py:387 +msgid "permissions" +msgstr "izinler" + +#: users/tables.py:101 +msgid "Custom Actions" +msgstr "Özel Eylemler" + +#: utilities/choices.py:16 +#, python-brace-format +msgid "{name} has a key defined but CHOICES is not a list" +msgstr "{name} tanımlanmış bir anahtarı var ama SEÇENEKLER bir liste değil" + +#: utilities/choices.py:135 +msgid "Dark Red" +msgstr "Koyu Kırmızı" + +#: utilities/choices.py:138 +msgid "Rose" +msgstr "Gül" + +#: utilities/choices.py:139 +msgid "Fuchsia" +msgstr "Fuşya" + +#: utilities/choices.py:141 +msgid "Dark Purple" +msgstr "Koyu Mor" + +#: utilities/choices.py:144 +msgid "Light Blue" +msgstr "Açık Mavi" + +#: utilities/choices.py:147 +msgid "Aqua" +msgstr "su" + +#: utilities/choices.py:148 +msgid "Dark Green" +msgstr "Koyu Yeşil" + +#: utilities/choices.py:150 +msgid "Light Green" +msgstr "Açık Yeşil" + +#: utilities/choices.py:151 +msgid "Lime" +msgstr "Kireç" + +#: utilities/choices.py:153 +msgid "Amber" +msgstr "Kehribar" + +#: utilities/choices.py:155 +msgid "Dark Orange" +msgstr "Koyu Turuncu" + +#: utilities/choices.py:156 +msgid "Brown" +msgstr "Kahverengi" + +#: utilities/choices.py:157 +msgid "Light Grey" +msgstr "Açık gri" + +#: utilities/choices.py:158 +msgid "Grey" +msgstr "Gri" + +#: utilities/choices.py:159 +msgid "Dark Grey" +msgstr "Koyu gri" + +#: utilities/choices.py:217 +msgid "Direct" +msgstr "Doğrudan" + +#: utilities/choices.py:218 +msgid "Upload" +msgstr "Yükleme" + +#: utilities/choices.py:230 utilities/choices.py:244 +msgid "Auto-detect" +msgstr "Otomatik algılama" + +#: utilities/choices.py:245 +msgid "Comma" +msgstr "Virgül" + +#: utilities/choices.py:246 +msgid "Semicolon" +msgstr "Noktalı virgül" + +#: utilities/choices.py:247 +msgid "Tab" +msgstr "Sekme" + +#: utilities/error_handlers.py:20 +#, python-brace-format +msgid "" +"Unable to delete {objects}. {count} dependent objects were " +"found: " +msgstr "" +"Silinemiyor {objects}. {count} bağımlı nesneler bulundu: " + +#: utilities/error_handlers.py:22 +msgid "More than 50" +msgstr "50'den fazla" + +#: utilities/fields.py:162 +#, python-format +msgid "" +"%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " +"in the format 'app.model'" +msgstr "" +"%s(%r) geçersiz. counterCacheField için to_model parametresi 'app.model' " +"biçiminde bir dize olmalıdır" + +#: utilities/fields.py:172 +#, python-format +msgid "" +"%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " +"in the format 'field'" +msgstr "" +"%s(%r) geçersiz. counterCacheField için to_field parametresi 'field' " +"biçiminde bir dize olmalıdır" + +#: utilities/forms/bulk_import.py:24 +msgid "Enter object data in CSV, JSON or YAML format." +msgstr "Nesne verilerini CSV, JSON veya YAML biçiminde girin." + +#: utilities/forms/bulk_import.py:37 +msgid "CSV delimiter" +msgstr "CSV sınırlayıcı" + +#: utilities/forms/bulk_import.py:38 +msgid "The character which delimits CSV fields. Applies only to CSV format." +msgstr "" +"CSV alanlarını sınırlayan karakter. Yalnızca CSV formatı için geçerlidir." + +#: utilities/forms/bulk_import.py:101 +msgid "Unable to detect data format. Please specify." +msgstr "Veri biçimi tespit edilemiyor. Lütfen belirtin." + +#: utilities/forms/bulk_import.py:124 +msgid "Invalid CSV delimiter" +msgstr "Geçersiz CSV sınırlayıcı" + +#: utilities/forms/bulk_import.py:168 +msgid "" +"Invalid YAML data. Data must be in the form of multiple documents, or a " +"single document comprising a list of dictionaries." +msgstr "" +"Geçersiz YAML verileri. Veriler birden fazla belge veya bir sözlük listesi " +"içeren tek bir belge şeklinde olmalıdır." + +#: utilities/forms/fields/array.py:17 +#, python-brace-format +msgid "" +"Invalid list ({value}). Must be numeric and ranges must be in ascending " +"order." +msgstr "" +"Geçersiz liste ({value}). Sayısal olmalı ve aralıklar artan sırada " +"olmalıdır." + +#: utilities/forms/fields/csv.py:44 +#, python-brace-format +msgid "Invalid value for a multiple choice field: {value}" +msgstr "Çoktan seçmeli alan için geçersiz değer: {value}" + +#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:74 +#, python-format +msgid "Object not found: %(value)s" +msgstr "Nesne bulunamadı: %(value)s" + +#: utilities/forms/fields/csv.py:65 +#, python-brace-format +msgid "" +"\"{value}\" is not a unique value for this field; multiple objects were " +"found" +msgstr "" +"“{value}“bu alan için benzersiz bir değer değil; birden fazla nesne bulundu" + +#: utilities/forms/fields/csv.py:97 +msgid "Object type must be specified as \".\"" +msgstr "Nesne türü şu şekilde belirtilmelidir”.“" + +#: utilities/forms/fields/csv.py:101 +msgid "Invalid object type" +msgstr "Geçersiz nesne türü" + +#: utilities/forms/fields/expandable.py:25 +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9])." +msgstr "" +"Toplu oluşturma için alfanümerik aralıklar desteklenir. Tek bir aralıktaki " +"karışık durumlar ve türler desteklenmez (örnek: [ge, xe] -0/0/ " +"[0-9])." + +#: utilities/forms/fields/expandable.py:46 +msgid "" +"Specify a numeric range to create multiple IPs.
    Example: " +"192.0.2.[1,5,100-254]/24" +msgstr "" +"Birden çok IP oluşturmak için sayısal bir aralık belirtin.
    Örnek: " +"192.0.2. [1.5,100-254] /24" + +#: utilities/forms/fields/fields.py:31 +#, python-brace-format +msgid "" +" Markdown syntax is supported" +msgstr "" +" İndirim sözdizimi desteklenir" + +#: utilities/forms/fields/fields.py:48 +msgid "URL-friendly unique shorthand" +msgstr "URL dostu benzersiz stenografi" + +#: utilities/forms/fields/fields.py:99 +msgid "Enter context data in JSON format." +msgstr "" +"İçeriğe bağlam verilerini girin JSON " +"biçim." + +#: utilities/forms/fields/fields.py:117 +msgid "MAC address must be in EUI-48 format" +msgstr "MAC adresi EUI-48 formatında olmalıdır" + +#: utilities/forms/forms.py:53 +msgid "Use regular expressions" +msgstr "Düzenli ifadeler kullan" + +#: utilities/forms/forms.py:87 +#, python-brace-format +msgid "Unrecognized header: {name}" +msgstr "Tanınmayan başlık: {name}" + +#: utilities/forms/forms.py:113 +msgid "Available Columns" +msgstr "Kullanılabilir Sütunlar" + +#: utilities/forms/forms.py:121 +msgid "Selected Columns" +msgstr "Seçili Sütunlar" + +#: utilities/forms/mixins.py:101 +msgid "" +"This object has been modified since the form was rendered. Please consult " +"the object's change log for details." +msgstr "" +"Bu nesne, form oluşturulduğundan beri değiştirildi. Ayrıntılar için lütfen " +"nesnenin değişiklik günlüğüne bakın." + +#: utilities/templates/builtins/customfield_value.html:30 +msgid "Not defined" +msgstr "Tanımlanmamış" + +#: utilities/templates/buttons/bookmark.html:9 +msgid "Unbookmark" +msgstr "Yer İşaretini Kaldır" + +#: utilities/templates/buttons/bookmark.html:13 +msgid "Bookmark" +msgstr "Yer işareti" + +#: utilities/templates/buttons/clone.html:4 +msgid "Clone" +msgstr "Klon" + +#: utilities/templates/buttons/export.html:4 +msgid "Export" +msgstr "İhracat" + +#: utilities/templates/buttons/export.html:7 +msgid "Current View" +msgstr "Geçerli Görünüm" + +#: utilities/templates/buttons/export.html:8 +msgid "All Data" +msgstr "Tüm Veriler" + +#: utilities/templates/buttons/export.html:28 +msgid "Add export template" +msgstr "Dışa aktarma şablonu ekle" + +#: utilities/templates/buttons/import.html:4 +msgid "Import" +msgstr "İthalat" + +#: utilities/templates/form_helpers/render_field.html:36 +msgid "Copy to clipboard" +msgstr "Panoya kopyala" + +#: utilities/templates/form_helpers/render_field.html:52 +msgid "This field is required" +msgstr "Bu alan zorunludur" + +#: utilities/templates/form_helpers/render_field.html:65 +msgid "Set Null" +msgstr "Sıfır Ayarla" + +#: utilities/templates/helpers/applied_filters.html:11 +msgid "Clear all" +msgstr "Hepsini temizle" + +#: utilities/templates/helpers/table_config_form.html:8 +msgid "Table Configuration" +msgstr "Tablo Yapılandırması" + +#: utilities/templates/helpers/table_config_form.html:31 +msgid "Move Up" +msgstr "Yukarı hareket et" + +#: utilities/templates/helpers/table_config_form.html:34 +msgid "Move Down" +msgstr "Aşağı hareket et" + +#: utilities/templates/widgets/apiselect.html:7 +msgid "Open selector" +msgstr "Seçiciyi aç" + +#: utilities/templates/widgets/clearable_file_input.html:12 +msgid "None assigned" +msgstr "Atanmadı" + +#: utilities/templates/widgets/markdown_input.html:6 +msgid "Write" +msgstr "Yazmak" + +#: utilities/templates/widgets/markdown_input.html:20 +msgid "Testing" +msgstr "Test" + +#: virtualization/filtersets.py:79 +msgid "Parent group (ID)" +msgstr "Ana grup (ID)" + +#: virtualization/filtersets.py:85 +msgid "Parent group (slug)" +msgstr "Ebeveyn grubu (sümüklü böcek)" + +#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +msgid "Cluster type (ID)" +msgstr "Küme türü (ID)" + +#: virtualization/filtersets.py:130 +msgid "Cluster group (ID)" +msgstr "Küme grubu (ID)" + +#: virtualization/filtersets.py:151 virtualization/filtersets.py:267 +msgid "Cluster (ID)" +msgstr "Küme (ID)" + +#: virtualization/forms/bulk_edit.py:165 +#: virtualization/models/virtualmachines.py:113 +msgid "vCPUs" +msgstr "vCPU'lar" + +#: virtualization/forms/bulk_edit.py:169 +msgid "Memory (MB)" +msgstr "Bellek (MB)" + +#: virtualization/forms/bulk_edit.py:173 +msgid "Disk (GB)" +msgstr "Disk (GB)" + +#: virtualization/forms/bulk_edit.py:333 +#: virtualization/forms/filtersets.py:243 +msgid "Size (GB)" +msgstr "Boyut (GB)" + +#: virtualization/forms/bulk_import.py:44 +msgid "Type of cluster" +msgstr "Küme türü" + +#: virtualization/forms/bulk_import.py:51 +msgid "Assigned cluster group" +msgstr "Atanmış küme grubu" + +#: virtualization/forms/bulk_import.py:96 +msgid "Assigned cluster" +msgstr "Atanmış küme" + +#: virtualization/forms/bulk_import.py:103 +msgid "Assigned device within cluster" +msgstr "Küme içinde atanan aygıt" + +#: virtualization/forms/model_forms.py:156 +#, python-brace-format +msgid "" +"{device} belongs to a different site ({device_site}) than the cluster " +"({cluster_site})" +msgstr "" +"{device} farklı bir siteye aittir ({device_site}) kümeden ({cluster_site})" + +#: virtualization/forms/model_forms.py:195 +msgid "Optionally pin this VM to a specific host device within the cluster" +msgstr "" +"İsteğe bağlı olarak bu sanal makineyi küme içindeki belirli bir ana aygıta " +"sabitleyin" + +#: virtualization/forms/model_forms.py:224 +msgid "Site/Cluster" +msgstr "Site/Küme" + +#: virtualization/forms/model_forms.py:247 +msgid "Disk size is managed via the attachment of virtual disks." +msgstr "Disk boyutu sanal disklerin eklenmesiyle yönetilir." + +#: virtualization/forms/model_forms.py:375 +msgid "Disk" +msgstr "Disk" + +#: virtualization/models/clusters.py:25 +msgid "cluster type" +msgstr "küme türü" + +#: virtualization/models/clusters.py:26 +msgid "cluster types" +msgstr "küme türleri" + +#: virtualization/models/clusters.py:45 +msgid "cluster group" +msgstr "küme grubu" + +#: virtualization/models/clusters.py:46 +msgid "cluster groups" +msgstr "küme grupları" + +#: virtualization/models/clusters.py:121 +msgid "cluster" +msgstr "küme" + +#: virtualization/models/clusters.py:122 +msgid "clusters" +msgstr "kümeleri" + +#: virtualization/models/clusters.py:141 +#, python-brace-format +msgid "" +"{count} devices are assigned as hosts for this cluster but are not in site " +"{site}" +msgstr "" +"{count} aygıtlar bu küme için ana bilgisayar olarak atanır ancak sitede " +"değildir {site}" + +#: virtualization/models/virtualmachines.py:121 +msgid "memory (MB)" +msgstr "bellek (MB)" + +#: virtualization/models/virtualmachines.py:126 +msgid "disk (GB)" +msgstr "disk (GB)" + +#: virtualization/models/virtualmachines.py:159 +msgid "Virtual machine name must be unique per cluster." +msgstr "Sanal makine adı küme başına benzersiz olmalıdır." + +#: virtualization/models/virtualmachines.py:162 +msgid "virtual machine" +msgstr "sanal makine" + +#: virtualization/models/virtualmachines.py:163 +msgid "virtual machines" +msgstr "sanal makineler" + +#: virtualization/models/virtualmachines.py:177 +msgid "A virtual machine must be assigned to a site and/or cluster." +msgstr "Bir sanal makine bir siteye ve/veya kümeye atanmalıdır." + +#: virtualization/models/virtualmachines.py:184 +#, python-brace-format +msgid "" +"The selected cluster ({cluster}) is not assigned to this site ({site})." +msgstr "Seçilen küme ({cluster}) bu siteye atanmamıştır ({site})." + +#: virtualization/models/virtualmachines.py:191 +msgid "Must specify a cluster when assigning a host device." +msgstr "Bir ana aygıt atarken bir küme belirtmeniz gerekir." + +#: virtualization/models/virtualmachines.py:196 +#, python-brace-format +msgid "" +"The selected device ({device}) is not assigned to this cluster ({cluster})." +msgstr "Seçilen cihaz ({device}) bu kümeye atanmadı ({cluster})." + +#: virtualization/models/virtualmachines.py:208 +#, python-brace-format +msgid "" +"The specified disk size ({size}) must match the aggregate size of assigned " +"virtual disks ({total_size})." +msgstr "" +"Belirtilen disk boyutu ({size}) atanmış sanal disklerin toplam boyutuyla " +"eşleşmelidir ({total_size})." + +#: virtualization/models/virtualmachines.py:222 +#, python-brace-format +msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" +msgstr "IPV olmalı{family} adres. ({ip} bir IPV{version} adres.)" + +#: virtualization/models/virtualmachines.py:231 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this VM." +msgstr "Belirtilen IP adresi ({ip}) bu VM'ye atanmadı." + +#: virtualization/models/virtualmachines.py:389 +#, python-brace-format +msgid "" +"The selected parent interface ({parent}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "" +"Seçilen üst arabirim ({parent}) farklı bir sanal makineye aittir " +"({virtual_machine})." + +#: virtualization/models/virtualmachines.py:404 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "" +"Seçilen köprü arayüzü ({bridge}) farklı bir sanal makineye aittir " +"({virtual_machine})." + +#: virtualization/models/virtualmachines.py:415 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent virtual machine, or it must be global." +msgstr "" +"Etiketlenmemiş VLAN ({untagged_vlan}) arabirimin ana sanal makinesiyle aynı " +"siteye ait olmalı veya global olmalıdır." + +#: virtualization/models/virtualmachines.py:427 +msgid "size (GB)" +msgstr "boyut (GB)" + +#: virtualization/models/virtualmachines.py:431 +msgid "virtual disk" +msgstr "sanal disk" + +#: virtualization/models/virtualmachines.py:432 +msgid "virtual disks" +msgstr "sanal diskler" + +#: vpn/choices.py:31 +msgid "IPsec - Transport" +msgstr "IPsec - Taşıma" + +#: vpn/choices.py:32 +msgid "IPsec - Tunnel" +msgstr "IPsec - Tünel" + +#: vpn/choices.py:33 +msgid "IP-in-IP" +msgstr "IP içinde IP" + +#: vpn/choices.py:34 +msgid "GRE" +msgstr "GREC" + +#: vpn/choices.py:56 +msgid "Hub" +msgstr "göbek" + +#: vpn/choices.py:57 +msgid "Spoke" +msgstr "konuştu" + +#: vpn/choices.py:80 +msgid "Aggressive" +msgstr "Agresif" + +#: vpn/choices.py:81 +msgid "Main" +msgstr "Ana" + +#: vpn/choices.py:92 +msgid "Pre-shared keys" +msgstr "Önceden paylaşılan anahtarlar" + +#: vpn/choices.py:93 +msgid "Certificates" +msgstr "Sertifikalar" + +#: vpn/choices.py:94 +msgid "RSA signatures" +msgstr "RSA imzaları" + +#: vpn/choices.py:95 +msgid "DSA signatures" +msgstr "DSA imzaları" + +#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 +#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 +#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 +#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 +#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 +#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#, python-brace-format +msgid "Group {n}" +msgstr "Grup {n}" + +#: vpn/choices.py:241 +msgid "Ethernet Private LAN" +msgstr "Ethernet Özel LAN" + +#: vpn/choices.py:242 +msgid "Ethernet Virtual Private LAN" +msgstr "Ethernet Sanal Özel LAN" + +#: vpn/choices.py:245 +msgid "Ethernet Private Tree" +msgstr "Ethernet Özel Ağacı" + +#: vpn/choices.py:246 +msgid "Ethernet Virtual Private Tree" +msgstr "Ethernet Sanal Özel Ağacı" + +#: vpn/filtersets.py:41 +msgid "Tunnel group (ID)" +msgstr "Tünel grubu (ID)" + +#: vpn/filtersets.py:47 +msgid "Tunnel group (slug)" +msgstr "Tünel grubu (sümüklü böcek)" + +#: vpn/filtersets.py:54 +msgid "IPSec profile (ID)" +msgstr "IPsec profili (ID)" + +#: vpn/filtersets.py:60 +msgid "IPSec profile (name)" +msgstr "IPsec profili (ad)" + +#: vpn/filtersets.py:81 +msgid "Tunnel (ID)" +msgstr "Tünel (ID)" + +#: vpn/filtersets.py:87 +msgid "Tunnel (name)" +msgstr "Tünel (isim)" + +#: vpn/filtersets.py:118 +msgid "Outside IP (ID)" +msgstr "Dış IP (ID)" + +#: vpn/filtersets.py:235 +msgid "IKE policy (ID)" +msgstr "IKE politikası (ID)" + +#: vpn/filtersets.py:241 +msgid "IKE policy (name)" +msgstr "IKE politikası (isim)" + +#: vpn/filtersets.py:245 +msgid "IPSec policy (ID)" +msgstr "IPsec ilkesi (ID)" + +#: vpn/filtersets.py:251 +msgid "IPSec policy (name)" +msgstr "IPsec ilkesi (ad)" + +#: vpn/filtersets.py:320 +msgid "L2VPN (slug)" +msgstr "L2VPN (sümüklü böcek)" + +#: vpn/filtersets.py:384 +msgid "VM Interface (ID)" +msgstr "VM Arabirimi (ID)" + +#: vpn/filtersets.py:390 +msgid "VLAN (name)" +msgstr "VLAN (isim)" + +#: vpn/forms/bulk_edit.py:44 vpn/forms/bulk_import.py:42 +#: vpn/forms/filtersets.py:53 +msgid "Tunnel group" +msgstr "Tünel grubu" + +#: vpn/forms/bulk_edit.py:116 vpn/models/crypto.py:47 +msgid "SA lifetime" +msgstr "SA ömrü" + +#: vpn/forms/bulk_edit.py:150 wireless/forms/bulk_edit.py:78 +#: wireless/forms/bulk_edit.py:125 wireless/forms/filtersets.py:63 +#: wireless/forms/filtersets.py:97 +msgid "Pre-shared key" +msgstr "Önceden paylaşılan anahtar" + +#: vpn/forms/bulk_edit.py:238 vpn/forms/bulk_import.py:239 +#: vpn/forms/filtersets.py:196 vpn/forms/model_forms.py:363 +#: vpn/models/crypto.py:104 +msgid "IKE policy" +msgstr "IKE politikası" + +#: vpn/forms/bulk_edit.py:243 vpn/forms/bulk_import.py:244 +#: vpn/forms/filtersets.py:201 vpn/forms/model_forms.py:367 +#: vpn/models/crypto.py:209 +msgid "IPSec policy" +msgstr "IPsec politikası" + +#: vpn/forms/bulk_import.py:50 +msgid "Tunnel encapsulation" +msgstr "Tünel kapsülleme" + +#: vpn/forms/bulk_import.py:83 +msgid "Operational role" +msgstr "Operasyonel rol" + +#: vpn/forms/bulk_import.py:90 +msgid "Parent device of assigned interface" +msgstr "Atanan arayüzün ana aygıtı" + +#: vpn/forms/bulk_import.py:97 +msgid "Parent VM of assigned interface" +msgstr "Atanan arabirimin üst VM'si" + +#: vpn/forms/bulk_import.py:104 +msgid "Device or virtual machine interface" +msgstr "Cihaz veya sanal makine arayüzü" + +#: vpn/forms/bulk_import.py:183 +msgid "IKE proposal(s)" +msgstr "IKE teklifi (lar)" + +#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +msgid "Diffie-Hellman group for Perfect Forward Secrecy" +msgstr "Perfect Forward Secrecy için Diffie-Hellman grubu" + +#: vpn/forms/bulk_import.py:222 +msgid "IPSec proposal(s)" +msgstr "IPsec teklifleri" + +#: vpn/forms/bulk_import.py:236 +msgid "IPSec protocol" +msgstr "IPsec protokolü" + +#: vpn/forms/bulk_import.py:266 +msgid "L2VPN type" +msgstr "L2VPN türü" + +#: vpn/forms/bulk_import.py:287 +msgid "Parent device (for interface)" +msgstr "Ana cihaz (arayüz için)" + +#: vpn/forms/bulk_import.py:294 +msgid "Parent virtual machine (for interface)" +msgstr "Ana sanal makine (arayüz için)" + +#: vpn/forms/bulk_import.py:301 +msgid "Assigned interface (device or VM)" +msgstr "Atanmış arayüz (cihaz veya VM)" + +#: vpn/forms/bulk_import.py:334 +msgid "Cannot import device and VM interface terminations simultaneously." +msgstr "Aygıt ve VM arabirimi sonlandırmaları aynı anda içe aktarılamıyor." + +#: vpn/forms/bulk_import.py:336 +msgid "Each termination must specify either an interface or a VLAN." +msgstr "Her sonlandırma bir arabirim veya bir VLAN belirtmelidir." + +#: vpn/forms/bulk_import.py:338 +msgid "Cannot assign both an interface and a VLAN." +msgstr "Hem arabirim hem de VLAN atanamıyor." + +#: vpn/forms/filtersets.py:127 +msgid "IKE version" +msgstr "IKE versiyonu" + +#: vpn/forms/filtersets.py:139 vpn/forms/filtersets.py:172 +#: vpn/forms/model_forms.py:293 vpn/forms/model_forms.py:328 +msgid "Proposal" +msgstr "Teklif" + +#: vpn/forms/filtersets.py:247 +msgid "Assigned Object Type" +msgstr "Atanan Nesne Türü" + +#: vpn/forms/model_forms.py:147 +msgid "First Termination" +msgstr "İlk Fesih" + +#: vpn/forms/model_forms.py:151 +msgid "Second Termination" +msgstr "İkinci Sonlandırma" + +#: vpn/forms/model_forms.py:198 +msgid "This parameter is required when defining a termination." +msgstr "Bir sonlandırma tanımlarken bu parametre gereklidir." + +#: vpn/forms/model_forms.py:314 vpn/forms/model_forms.py:349 +msgid "Policy" +msgstr "Politika" + +#: vpn/forms/model_forms.py:469 +msgid "A termination must specify an interface or VLAN." +msgstr "Bir sonlandırma bir arayüz veya VLAN belirtmelidir." + +#: vpn/forms/model_forms.py:471 +msgid "" +"A termination can only have one terminating object (an interface or VLAN)." +msgstr "" +"Bir sonlandırma yalnızca bir sonlandırma nesnesine (bir arayüz veya VLAN) " +"sahip olabilir." + +#: vpn/models/crypto.py:33 +msgid "encryption algorithm" +msgstr "şifreleme algoritması" + +#: vpn/models/crypto.py:37 +msgid "authentication algorithm" +msgstr "kimlik doğrulama algoritması" + +#: vpn/models/crypto.py:44 +msgid "Diffie-Hellman group ID" +msgstr "Diffie-Hellman grup kimliği" + +#: vpn/models/crypto.py:50 +msgid "Security association lifetime (in seconds)" +msgstr "Güvenlik ilişkilendirmesi ömrü (saniye cinsinden)" + +#: vpn/models/crypto.py:59 +msgid "IKE proposal" +msgstr "IKE teklifi" + +#: vpn/models/crypto.py:60 +msgid "IKE proposals" +msgstr "IKE teklifleri" + +#: vpn/models/crypto.py:76 +msgid "version" +msgstr "versiyon" + +#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +msgid "proposals" +msgstr "öneriler" + +#: vpn/models/crypto.py:91 wireless/models.py:38 +msgid "pre-shared key" +msgstr "önceden paylaşılan anahtar" + +#: vpn/models/crypto.py:105 +msgid "IKE policies" +msgstr "IKE politikaları" + +#: vpn/models/crypto.py:118 +msgid "Mode is required for selected IKE version" +msgstr "" + +#: vpn/models/crypto.py:122 +msgid "Mode cannot be used for selected IKE version" +msgstr "" + +#: vpn/models/crypto.py:136 +msgid "encryption" +msgstr "şifreleme" + +#: vpn/models/crypto.py:141 +msgid "authentication" +msgstr "onaylama" + +#: vpn/models/crypto.py:149 +msgid "Security association lifetime (seconds)" +msgstr "Güvenlik ilişkilendirmesi ömrü (saniye)" + +#: vpn/models/crypto.py:155 +msgid "Security association lifetime (in kilobytes)" +msgstr "Güvenlik ilişkilendirmesi ömrü (kilobayt cinsinden)" + +#: vpn/models/crypto.py:164 +msgid "IPSec proposal" +msgstr "IPsec teklifi" + +#: vpn/models/crypto.py:165 +msgid "IPSec proposals" +msgstr "IPsec önerileri" + +#: vpn/models/crypto.py:178 +msgid "Encryption and/or authentication algorithm must be defined" +msgstr "Şifreleme ve/veya kimlik doğrulama algoritması tanımlanmalıdır" + +#: vpn/models/crypto.py:210 +msgid "IPSec policies" +msgstr "IPsec ilkeleri" + +#: vpn/models/crypto.py:251 +msgid "IPSec profiles" +msgstr "IPsec profilleri" + +#: vpn/models/l2vpn.py:116 +msgid "L2VPN termination" +msgstr "L2VPN sonlandırma" + +#: vpn/models/l2vpn.py:117 +msgid "L2VPN terminations" +msgstr "L2VPN sonlandırmaları" + +#: vpn/models/l2vpn.py:135 +#, python-brace-format +msgid "L2VPN Termination already assigned ({assigned_object})" +msgstr "L2VPN Sonlandırma zaten atanmış ({assigned_object})" + +#: vpn/models/l2vpn.py:147 +#, python-brace-format +msgid "" +"{l2vpn_type} L2VPNs cannot have more than two terminations; found " +"{terminations_count} already defined." +msgstr "" +"{l2vpn_type} L2VPN'ler ikiden fazla sonlandırmaya sahip olamaz; bulundu " +"{terminations_count} zaten tanımlanmış." + +#: vpn/models/tunnels.py:26 +msgid "tunnel group" +msgstr "tünel grubu" + +#: vpn/models/tunnels.py:27 +msgid "tunnel groups" +msgstr "tünel grupları" + +#: vpn/models/tunnels.py:53 +msgid "encapsulation" +msgstr "kapsülleme" + +#: vpn/models/tunnels.py:72 +msgid "tunnel ID" +msgstr "tünel kimliği" + +#: vpn/models/tunnels.py:94 +msgid "tunnel" +msgstr "tünel" + +#: vpn/models/tunnels.py:95 +msgid "tunnels" +msgstr "tüneller" + +#: vpn/models/tunnels.py:153 +msgid "An object may be terminated to only one tunnel at a time." +msgstr "Bir nesne aynı anda yalnızca bir tünele sonlandırılabilir." + +#: vpn/models/tunnels.py:156 +msgid "tunnel termination" +msgstr "tünel sonlandırma" + +#: vpn/models/tunnels.py:157 +msgid "tunnel terminations" +msgstr "tünel sonlandırmaları" + +#: vpn/models/tunnels.py:174 +#, python-brace-format +msgid "{name} is already attached to a tunnel ({tunnel})." +msgstr "{name} zaten bir tünele bağlı ({tunnel})." + +#: vpn/tables/crypto.py:22 +msgid "Authentication Method" +msgstr "Kimlik Doğrulama Yöntemi" + +#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +msgid "Encryption Algorithm" +msgstr "Şifreleme Algoritması" + +#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +msgid "Authentication Algorithm" +msgstr "Kimlik Doğrulama Algoritması" + +#: vpn/tables/crypto.py:34 +msgid "SA Lifetime" +msgstr "SA Ömrü" + +#: vpn/tables/crypto.py:71 +msgid "Pre-shared Key" +msgstr "Önceden Paylaşılan Anahtar" + +#: vpn/tables/crypto.py:103 +msgid "SA Lifetime (Seconds)" +msgstr "SA Ömrü (Saniye)" + +#: vpn/tables/crypto.py:106 +msgid "SA Lifetime (KB)" +msgstr "SA Ömrü (KB)" + +#: vpn/tables/l2vpn.py:69 +msgid "Object Parent" +msgstr "Nesne Ebeveyni" + +#: vpn/tables/l2vpn.py:74 +msgid "Object Site" +msgstr "Nesne Sitesi" + +#: vpn/tables/tunnels.py:84 +msgid "Host" +msgstr "Ev Sahibi" + +#: wireless/choices.py:11 +msgid "Access point" +msgstr "Erişim noktası" + +#: wireless/choices.py:12 +msgid "Station" +msgstr "İstasyon" + +#: wireless/choices.py:467 +msgid "Open" +msgstr "Açık" + +#: wireless/choices.py:469 +msgid "WPA Personal (PSK)" +msgstr "WPA Kişisel (PSK)" + +#: wireless/choices.py:470 +msgid "WPA Enterprise" +msgstr "WPA Kurumsal" + +#: wireless/forms/bulk_edit.py:72 wireless/forms/bulk_edit.py:119 +#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 +#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 +#: wireless/forms/filtersets.py:58 wireless/forms/filtersets.py:92 +msgid "Authentication cipher" +msgstr "Kimlik doğrulama şifresi" + +#: wireless/forms/bulk_import.py:52 +msgid "Bridged VLAN" +msgstr "Köprülü VLAN" + +#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:27 +msgid "Interface A" +msgstr "Arayüz A" + +#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:36 +msgid "Interface B" +msgstr "Arayüz B" + +#: wireless/forms/model_forms.py:158 +msgid "Side B" +msgstr "B Tarafı" + +#: wireless/models.py:30 +msgid "authentication cipher" +msgstr "kimlik doğrulama şifresi" + +#: wireless/models.py:68 +msgid "wireless LAN group" +msgstr "kablosuz LAN grubu" + +#: wireless/models.py:69 +msgid "wireless LAN groups" +msgstr "kablosuz LAN grupları" + +#: wireless/models.py:115 +msgid "wireless LAN" +msgstr "kablosuz LAN" + +#: wireless/models.py:143 +msgid "interface A" +msgstr "arayüz A" + +#: wireless/models.py:150 +msgid "interface B" +msgstr "arayüz B" + +#: wireless/models.py:198 +msgid "wireless link" +msgstr "kablosuz bağlantı" + +#: wireless/models.py:199 +msgid "wireless links" +msgstr "kablosuz bağlantılar" + +#: wireless/models.py:216 wireless/models.py:222 +#, python-brace-format +msgid "{type} is not a wireless interface." +msgstr "{type} kablosuz bir arayüz değildir."
    - {% if path.is_split %} + {% if path.is_split and path.get_asymmetric_nodes %} +

    {% trans "Asymmetric Path" %}!

    +

    {% trans "The nodes below have no links and result in an asymmetric path" %}:

    +
      + {% for next_node in path.get_asymmetric_nodes %} +
    • {{ next_node|linkify }}
    • + {% endfor %} +
    + {% elif path.is_split %}

    {% trans "Path split" %}!

    {% trans "Select a node below to continue" %}:

      From db40119faabcd50a8b7aee07f3b58f25b00be7a3 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 26 Sep 2023 12:16:02 -0700 Subject: [PATCH 016/271] 13130 dont allow reassigning ipaddress assigned object if primary ip (#13893) * 13130 dont allow reassigning ipaddress assigned object if primary ip * 13130 add tests fix parent check * Misc cleanup --------- Co-authored-by: Jeremy Stretch --- netbox/ipam/models/ip.py | 27 +++++++++++++++++ netbox/ipam/tests/test_api.py | 56 +++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index 00c08b3bc..d176d3bff 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -782,6 +782,13 @@ class IPAddress(PrimaryModel): def __str__(self): return str(self.address) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Denote the original assigned object (if any) for validation in clean() + self._original_assigned_object_id = self.__dict__.get('assigned_object_id') + self._original_assigned_object_type_id = self.__dict__.get('assigned_object_type_id') + def get_absolute_url(self): return reverse('ipam:ipaddress', args=[self.pk]) @@ -843,6 +850,26 @@ class IPAddress(PrimaryModel): ) }) + if self._original_assigned_object_id and self._original_assigned_object_type_id: + parent = getattr(self.assigned_object, 'parent_object', None) + ct = ContentType.objects.get_for_id(self._original_assigned_object_type_id) + original_assigned_object = ct.get_object_for_this_type(pk=self._original_assigned_object_id) + original_parent = getattr(original_assigned_object, 'parent_object', None) + + # can't use is_primary_ip as self.assigned_object might be changed + is_primary = False + if self.family == 4 and hasattr(original_parent, 'primary_ip4') and original_parent.primary_ip4_id == self.pk: + is_primary = True + if self.family == 6 and hasattr(original_parent, 'primary_ip6') and original_parent.primary_ip6_id == self.pk: + is_primary = True + + if is_primary and (parent != original_parent): + raise ValidationError({ + 'assigned_object': _( + "Cannot reassign IP address while it is designated as the primary IP for the parent object" + ) + }) + # Validate IP status selection if self.status == IPAddressStatusChoices.STATUS_SLAAC and self.family != 6: raise ValidationError({ diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index 24d219ca0..d696c8dae 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -659,6 +659,62 @@ class IPAddressTest(APIViewTestCases.APIViewTestCase): ) IPAddress.objects.bulk_create(ip_addresses) + def test_assign_object(self): + """ + Test the creation of available IP addresses within a parent IP range. + """ + site = Site.objects.create(name='Site 1') + manufacturer = Manufacturer.objects.create(name='Manufacturer 1') + device_type = DeviceType.objects.create(model='Device Type 1', manufacturer=manufacturer) + role = DeviceRole.objects.create(name='Switch') + device1 = Device.objects.create( + name='Device 1', + site=site, + device_type=device_type, + role=role, + status='active' + ) + interface1 = Interface.objects.create(name='Interface 1', device=device1, type='1000baset') + interface2 = Interface.objects.create(name='Interface 2', device=device1, type='1000baset') + device2 = Device.objects.create( + name='Device 2', + site=site, + device_type=device_type, + role=role, + status='active' + ) + interface3 = Interface.objects.create(name='Interface 3', device=device2, type='1000baset') + + ip_addresses = ( + IPAddress(address=IPNetwork('192.168.0.4/24'), assigned_object=interface1), + IPAddress(address=IPNetwork('192.168.1.4/24')), + ) + IPAddress.objects.bulk_create(ip_addresses) + + ip1 = ip_addresses[0] + ip1.assigned_object = interface1 + device1.primary_ip4 = ip_addresses[0] + device1.save() + + ip2 = ip_addresses[1] + + url = reverse('ipam-api:ipaddress-detail', kwargs={'pk': ip1.pk}) + self.add_permissions('ipam.change_ipaddress') + + # assign to same parent + data = { + 'assigned_object_id': interface2.pk + } + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + + # assign to same different parent - should error + data = { + 'assigned_object_id': interface3.pk + } + response = self.client.patch(url, data, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + class FHRPGroupTest(APIViewTestCases.APIViewTestCase): model = FHRPGroup From 4dd229e73ae245e4e60706fbcae47f502d26293c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 22 Sep 2023 08:46:42 -0400 Subject: [PATCH 017/271] Fixes #13864: Remove 'default' choice for dashboard widget color --- netbox/extras/choices.py | 36 ++++++++++++++++++++++++++++++++ netbox/extras/dashboard/forms.py | 4 ++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index 1061bf871..0572a33a1 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -244,3 +244,39 @@ class ChangeActionChoices(ChoiceSet): (ACTION_UPDATE, _('Update'), 'blue'), (ACTION_DELETE, _('Delete'), 'red'), ) + + +# +# Dashboard widgets +# + +class DashboardWidgetColorChoices(ChoiceSet): + BLUE = 'blue' + INDIGO = 'indigo' + PURPLE = 'purple' + PINK = 'pink' + RED = 'red' + ORANGE = 'orange' + YELLOW = 'yellow' + GREEN = 'green' + TEAL = 'teal' + CYAN = 'cyan' + GRAY = 'gray' + BLACK = 'black' + WHITE = 'white' + + CHOICES = ( + (BLUE, _('Blue')), + (INDIGO, _('Indigo')), + (PURPLE, _('Purple')), + (PINK, _('Pink')), + (RED, _('Red')), + (ORANGE, _('Orange')), + (YELLOW, _('Yellow')), + (GREEN, _('Green')), + (TEAL, _('Teal')), + (CYAN, _('Cyan')), + (GRAY, _('Gray')), + (BLACK, _('Black')), + (WHITE, _('White')), + ) diff --git a/netbox/extras/dashboard/forms.py b/netbox/extras/dashboard/forms.py index 1e9f15408..ab708228c 100644 --- a/netbox/extras/dashboard/forms.py +++ b/netbox/extras/dashboard/forms.py @@ -2,9 +2,9 @@ from django import forms from django.urls import reverse_lazy from django.utils.translation import gettext as _ +from extras.choices import DashboardWidgetColorChoices from netbox.registry import registry from utilities.forms import BootstrapMixin, add_blank_choice -from utilities.choices import ButtonColorChoices __all__ = ( 'DashboardWidgetAddForm', @@ -21,7 +21,7 @@ class DashboardWidgetForm(BootstrapMixin, forms.Form): required=False ) color = forms.ChoiceField( - choices=add_blank_choice(ButtonColorChoices), + choices=add_blank_choice(DashboardWidgetColorChoices), required=False, ) From 1a00765b72d61ec404088544bbaa78b5c9a617ec Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Sep 2023 15:27:44 -0400 Subject: [PATCH 018/271] Changelog for #11079, #11901, #13843, #13849, #13859, #13864 --- docs/release-notes/version-3.6.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index c2b25dd84..ba783413c 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -8,10 +8,16 @@ ### Bug Fixes +* [#11079](https://github.com/netbox-community/netbox/issues/11079) - Enable tracing cable paths across multiple cables in parallel +* [#11901](https://github.com/netbox-community/netbox/issues/11901) - Fix `IndexError` exception when manipulating terminations for existing cables via REST API * [#13506](https://github.com/netbox-community/netbox/issues/13506) - Enable creating a config template which references a data file via the REST API * [#13666](https://github.com/netbox-community/netbox/issues/13666) - Cleanly handle reports without any test methods defined * [#13839](https://github.com/netbox-community/netbox/issues/13839) - Restore original text color for HTML code elements +* [#13843](https://github.com/netbox-community/netbox/issues/13843) - Fix assignment of VLAN group scope during bulk edit * [#13845](https://github.com/netbox-community/netbox/issues/13845) - Fix `AttributeError` exception when attaching front/rear images to a device type +* [#13849](https://github.com/netbox-community/netbox/issues/13849) - Fix `KeyError` exception when deleting an object which references a configured choice value that has been removed +* [#13859](https://github.com/netbox-community/netbox/issues/13859) - Fix invalid response when searching for custom choice field values returns no matches +* [#13864](https://github.com/netbox-community/netbox/issues/13864) - Correct default background color for dashboard widget headers * [#13871](https://github.com/netbox-community/netbox/issues/13871) - Fix rack filtering for empty location during device bulk import * [#13891](https://github.com/netbox-community/netbox/issues/13891) - Allow designating an IP address as primary for device/VM while assigning it to an interface From 9e35cefaf26b84875264293832d2d93241f5af0b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Sep 2023 15:48:03 -0400 Subject: [PATCH 019/271] Release v3.6.3 --- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- docs/release-notes/version-3.6.md | 2 +- netbox/netbox/settings.py | 2 +- requirements.txt | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 8664768ee..a587b36e2 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.6.2 + placeholder: v3.6.3 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 8e3af527a..71f1f2d97 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.6.2 + placeholder: v3.6.3 validations: required: true - type: dropdown diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index ba783413c..db0e3d3ea 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -1,6 +1,6 @@ # NetBox v3.6 -## v3.6.3 (FUTURE) +## v3.6.3 (2023-09-26) ### Enhancements diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 53700073e..e483488fc 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -25,7 +25,7 @@ from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW # Environment setup # -VERSION = '3.6.3-dev' +VERSION = '3.6.3' # Hostname HOSTNAME = platform.node() diff --git a/requirements.txt b/requirements.txt index 931fc2c24..8c676df81 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,11 +21,11 @@ graphene-django==3.0.0 gunicorn==21.2.0 Jinja2==3.1.2 Markdown==3.3.7 -mkdocs-material==9.3.2 +mkdocs-material==9.4.2 mkdocstrings[python-legacy]==0.23.0 netaddr==0.9.0 Pillow==10.0.1 -psycopg[binary,pool]==3.1.10 +psycopg[binary,pool]==3.1.11 PyYAML==6.0.1 sentry-sdk==1.31.0 social-auth-app-django==5.3.0 From 786f0cc7f355101241cebe034ff06d8fbf20b0d2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Sep 2023 16:31:33 -0400 Subject: [PATCH 020/271] PRVB --- docs/release-notes/version-3.6.md | 4 ++++ netbox/netbox/settings.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index db0e3d3ea..0a7787e43 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -1,5 +1,9 @@ # NetBox v3.6 +## v3.6.4 (FUTURE) + +--- + ## v3.6.3 (2023-09-26) ### Enhancements diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index e483488fc..8be2800fb 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -25,7 +25,7 @@ from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW # Environment setup # -VERSION = '3.6.3' +VERSION = '3.6.4-dev' # Hostname HOSTNAME = platform.node() From ef460a38edd2c02d2fd887eb00f8599345550ea2 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 3 Oct 2023 10:22:17 -0700 Subject: [PATCH 021/271] 13944 fix report detail api --- netbox/extras/reports.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index 9b12065ca..cc279a49a 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -23,7 +23,7 @@ logger = logging.getLogger(__name__) def get_module_and_report(module_name, report_name): module = ReportModule.objects.get(file_path=f'{module_name}.py') - report = module.reports.get(report_name) + report = module.reports.get(report_name)() return module, report From 5cb1a6b79050afc0ec8fbd5b05d19aa0851d12fb Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 2 Oct 2023 12:07:28 -0700 Subject: [PATCH 022/271] 13872 fix bulk import --- netbox/templates/generic/bulk_import.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/netbox/templates/generic/bulk_import.html b/netbox/templates/generic/bulk_import.html index b9cb0d4cb..f78cb0bf5 100644 --- a/netbox/templates/generic/bulk_import.html +++ b/netbox/templates/generic/bulk_import.html @@ -67,6 +67,7 @@ Context: {% render_field form.upload_file %} {% render_field form.format %} + {% render_field form.csv_delimiter %}
      @@ -88,6 +89,7 @@ Context: {% render_field form.data_source %} {% render_field form.data_file %} {% render_field form.format %} + {% render_field form.csv_delimiter %}
      From 6dc560596d54274a0450fc771ecf544c1cb6b518 Mon Sep 17 00:00:00 2001 From: yash-pal1 Date: Wed, 27 Sep 2023 15:45:46 +0530 Subject: [PATCH 023/271] added device button under platform view pre-populated role field instead of platform field --- netbox/templates/dcim/platform.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/templates/dcim/platform.html b/netbox/templates/dcim/platform.html index 29f405b6e..9448ad3e5 100644 --- a/netbox/templates/dcim/platform.html +++ b/netbox/templates/dcim/platform.html @@ -13,7 +13,7 @@ {% block extra_controls %} {% if perms.dcim.add_device %} - + {% trans "Add Device" %} {% endif %} From 6093debb7192c76c5a395eb21c278168aefe88c9 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 3 Oct 2023 12:41:40 -0700 Subject: [PATCH 024/271] 12328 update GFK object in clean (#13946) * 12328 update GFK object in clean * Add missing import statement --------- Co-authored-by: Jeremy Stretch --- netbox/netbox/models/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/models/__init__.py b/netbox/netbox/models/__init__.py index 596357ea4..9d7696696 100644 --- a/netbox/netbox/models/__init__.py +++ b/netbox/netbox/models/__init__.py @@ -1,5 +1,6 @@ from django.conf import settings from django.contrib.contenttypes.fields import GenericForeignKey +from django.core.exceptions import ObjectDoesNotExist from django.core.validators import ValidationError from django.db import models from django.utils.translation import gettext_lazy as _ @@ -85,11 +86,16 @@ class NetBoxModel(NetBoxFeatureSet, models.Model): if ct_value and fk_value: klass = getattr(self, field.ct_field).model_class() - if not klass.objects.filter(pk=fk_value).exists(): + try: + obj = klass.objects.get(pk=fk_value) + except ObjectDoesNotExist: raise ValidationError({ field.fk_field: f"Related object not found using the provided value: {fk_value}." }) + # update the GFK field value + setattr(self, field.name, obj) + # # NetBox internal base models From a46255ddda73e1e29c610d40aeb7054214014935 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 3 Oct 2023 16:29:55 -0400 Subject: [PATCH 025/271] Fixes #13064: Ensure unchecked checkboxes do not revert to original values upon HTMX form refresh --- netbox/netbox/settings.py | 4 ++++ netbox/templates/django/forms/widgets/checkbox.html | 6 ++++++ 2 files changed, 10 insertions(+) create mode 100644 netbox/templates/django/forms/widgets/checkbox.html diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 8be2800fb..975e86858 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -355,6 +355,7 @@ INSTALLED_APPS = [ 'django.contrib.messages', 'django.contrib.staticfiles', 'django.contrib.humanize', + 'django.forms', 'corsheaders', 'debug_toolbar', 'graphiql_debug_toolbar', @@ -430,6 +431,9 @@ TEMPLATES = [ }, ] +# This allows us to override Django's stock form widget templates +FORM_RENDERER = 'django.forms.renderers.TemplatesSetting' + # Set up authentication backends if type(REMOTE_AUTH_BACKEND) not in (list, tuple): REMOTE_AUTH_BACKEND = [REMOTE_AUTH_BACKEND] diff --git a/netbox/templates/django/forms/widgets/checkbox.html b/netbox/templates/django/forms/widgets/checkbox.html new file mode 100644 index 000000000..bbe201a29 --- /dev/null +++ b/netbox/templates/django/forms/widgets/checkbox.html @@ -0,0 +1,6 @@ +{% comment %} + Include a hidden field of the same name to ensure that unchecked checkboxes + are always included in the submitted form data. +{% endcomment %} + +{% include "django/forms/widgets/input.html" %} From b93b331d8614a40c8c4d9095b7e5f684122a8d28 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 4 Oct 2023 14:09:29 -0400 Subject: [PATCH 026/271] Fixes #13966: Restore 'last login' column on users table --- docs/release-notes/version-3.6.md | 4 ++++ netbox/users/tables.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 0a7787e43..137825b89 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -2,6 +2,10 @@ ## v3.6.4 (FUTURE) +### Bug Fixes + +* [#13966](https://github.com/netbox-community/netbox/issues/13966) - Restore "last login" column on users table + --- ## v3.6.3 (2023-09-26) diff --git a/netbox/users/tables.py b/netbox/users/tables.py index 3b418715a..afb270568 100644 --- a/netbox/users/tables.py +++ b/netbox/users/tables.py @@ -52,7 +52,7 @@ class UserTable(NetBoxTable): model = NetBoxUser fields = ( 'pk', 'id', 'username', 'first_name', 'last_name', 'email', 'groups', 'is_active', 'is_staff', - 'is_superuser', + 'is_superuser', 'last_login', ) default_columns = ('pk', 'username', 'first_name', 'last_name', 'email', 'is_active') From e4a9cad75644d0489b9f87271d9f7baeac1e28ae Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 4 Oct 2023 14:11:28 -0400 Subject: [PATCH 027/271] Changelog for #12328, #13064, #13872, #13910, #13944 --- docs/release-notes/version-3.6.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 137825b89..69a8ee62e 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -4,6 +4,11 @@ ### Bug Fixes +* [#12328](https://github.com/netbox-community/netbox/issues/12328) - Ensure generic foreign key relationships are populated in REST API serializations of objects +* [#13064](https://github.com/netbox-community/netbox/issues/13064) - Fix resetting of checkbox fields triggered by HTMX form re-rendering +* [#13872](https://github.com/netbox-community/netbox/issues/13872) - Add CSV delimiter field to file upload tab under bulk object upload views +* [#13910](https://github.com/netbox-community/netbox/issues/13910) - Correct "add device" button link under platform view +* [#13944](https://github.com/netbox-community/netbox/issues/13944) - Correct serialization of several report attributes in the REST API * [#13966](https://github.com/netbox-community/netbox/issues/13966) - Restore "last login" column on users table --- From 4d13f4d25294e53bc7691b7f0399d5d10c6fc96c Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 5 Oct 2023 08:37:26 -0700 Subject: [PATCH 028/271] 13850 add requests to requirements --- base_requirements.txt | 4 ++++ requirements.txt | 1 + 2 files changed, 5 insertions(+) diff --git a/base_requirements.txt b/base_requirements.txt index 4b75b1313..423a9754b 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -120,6 +120,10 @@ psycopg[binary,pool] # https://github.com/yaml/pyyaml/blob/master/CHANGES PyYAML +# Requests +# https://github.com/psf/requests/blob/main/HISTORY.md +requests + # Sentry SDK # https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md sentry-sdk diff --git a/requirements.txt b/requirements.txt index 8c676df81..b81042acd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -27,6 +27,7 @@ netaddr==0.9.0 Pillow==10.0.1 psycopg[binary,pool]==3.1.11 PyYAML==6.0.1 +requests==2.28.1 sentry-sdk==1.31.0 social-auth-app-django==5.3.0 social-auth-core[openidconnect]==4.4.2 From 285187542d31fa4f722e564b7a8e0840e6687704 Mon Sep 17 00:00:00 2001 From: sleepinggenius2 Date: Wed, 4 Oct 2023 11:52:21 -0400 Subject: [PATCH 029/271] Adds selection custom field labels to UI --- netbox/extras/models/customfields.py | 5 +++++ netbox/netbox/tables/columns.py | 4 +++- netbox/utilities/templatetags/builtins/tags.py | 6 ++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index e6f339e5a..2bed464bb 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -232,6 +232,11 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): return self.choice_set.choices return [] + def get_choice_label(self, value): + if not hasattr(self, '_choice_map'): + self._choice_map = dict(self.choices) + return self._choice_map.get(value, value) + def populate_initial_data(self, content_types): """ Populate initial custom field data upon either a) the creation of a new CustomField, or diff --git a/netbox/netbox/tables/columns.py b/netbox/netbox/tables/columns.py index 9e348fb23..d2cd0a0d4 100644 --- a/netbox/netbox/tables/columns.py +++ b/netbox/netbox/tables/columns.py @@ -483,8 +483,10 @@ class CustomFieldColumn(tables.Column): return mark_safe('') if self.customfield.type == CustomFieldTypeChoices.TYPE_URL: return mark_safe(f'{escape(value)}') + if self.customfield.type == CustomFieldTypeChoices.TYPE_SELECT: + return self.customfield.get_choice_label(value) if self.customfield.type == CustomFieldTypeChoices.TYPE_MULTISELECT: - return ', '.join(v for v in value) + return ', '.join(self.customfield.get_choice_label(v) for v in value) if self.customfield.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT: return mark_safe(', '.join( self._linkify_item(obj) for obj in self.customfield.deserialize(value) diff --git a/netbox/utilities/templatetags/builtins/tags.py b/netbox/utilities/templatetags/builtins/tags.py index 35aec1000..68541ae5a 100644 --- a/netbox/utilities/templatetags/builtins/tags.py +++ b/netbox/utilities/templatetags/builtins/tags.py @@ -1,6 +1,7 @@ from django import template from django.http import QueryDict +from extras.choices import CustomFieldTypeChoices from utilities.utils import dict_to_querydict __all__ = ( @@ -38,6 +39,11 @@ def customfield_value(customfield, value): customfield: A CustomField instance value: The custom field value applied to an object """ + if value: + if customfield.type == CustomFieldTypeChoices.TYPE_SELECT: + value = customfield.get_choice_label(value) + elif customfield.type == CustomFieldTypeChoices.TYPE_MULTISELECT: + value = [customfield.get_choice_label(v) for v in value] return { 'customfield': customfield, 'value': value, From bbb133019d708abd93efe790e338bb07e2155f4e Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Thu, 5 Oct 2023 12:15:50 -0700 Subject: [PATCH 030/271] 13815 document view permissions for scripts (#13943) * 13815 document view permissions for scripts * Replicate permissions note for reports * Remove duplicated text --------- Co-authored-by: Jeremy Stretch --- docs/customization/custom-scripts.md | 2 +- docs/customization/reports.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/customization/custom-scripts.md b/docs/customization/custom-scripts.md index 3811474d2..0b1ed11df 100644 --- a/docs/customization/custom-scripts.md +++ b/docs/customization/custom-scripts.md @@ -288,7 +288,7 @@ An IPv4 or IPv6 network with a mask. Returns a `netaddr.IPNetwork` object. Two a ## Running Custom Scripts !!! note - To run a custom script, a user must be assigned the `extras.run_script` permission. This is achieved by assigning the user (or group) a permission on the Script object and specifying the `run` action in the admin UI as shown below. + To run a custom script, a user must be assigned via permissions for `Extras > Script`, `Extras > ScriptModule`, and `Core > ManagedFile` objects. They must also be assigned the `extras.run_script` permission. This is achieved by assigning the user (or group) a permission on the Script object and specifying the `run` action in the admin UI as shown below. ![Adding the run action to a permission](../media/admin_ui_run_permission.png) diff --git a/docs/customization/reports.md b/docs/customization/reports.md index 7e3681304..a821c5da7 100644 --- a/docs/customization/reports.md +++ b/docs/customization/reports.md @@ -132,7 +132,7 @@ Once you have created a report, it will appear in the reports list. Initially, r ## Running Reports !!! note - To run a report, a user must be assigned the `extras.run_report` permission. This is achieved by assigning the user (or group) a permission on the Report object and specifying the `run` action in the admin UI as shown below. + To run a report, a user must be assigned via permissions for `Extras > Report`, `Extras > ReportModule`, and `Core > ManagedFile` objects. They must also be assigned the `extras.run_report` permission. This is achieved by assigning the user (or group) a permission on the Report object and specifying the `run` action in the admin UI as shown below. ![Adding the run action to a permission](../media/admin_ui_run_permission.png) From d03859b27b9bbc264f138d93d17773726949a1ab Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Thu, 5 Oct 2023 12:53:57 -0700 Subject: [PATCH 031/271] 13746 fix available ips API for posting custom-fields (#13889) --- netbox/ipam/api/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index da6463e23..643e6a8e0 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -289,7 +289,7 @@ class AvailableObjectsView(ObjectValidationMixin, APIView): ) # Prepare object data for deserialization - requested_objects = self.prep_object_data(serializer.validated_data, available_objects, parent) + requested_objects = self.prep_object_data(requested_objects, available_objects, parent) # Initialize the serializer with a list or a single object depending on what was requested serializer_class = get_serializer_for_model(self.queryset.model) From a543bd469ad7dfee989f4edab6604134271095b2 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 5 Oct 2023 13:17:18 -0700 Subject: [PATCH 032/271] 11987 change cable bulk import to check if same cable --- netbox/dcim/forms/bulk_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 70aceaa49..e41e875e4 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -1192,7 +1192,7 @@ class CableImportForm(NetBoxModelImportForm): termination_object = model.objects.get(device__in=device.virtual_chassis.members.all(), name=name) else: termination_object = model.objects.get(device=device, name=name) - if termination_object.cable is not None: + if termination_object.cable is not None and termination_object.cable != self.instance: raise forms.ValidationError(f"Side {side.upper()}: {device} {termination_object} is already connected") except ObjectDoesNotExist: raise forms.ValidationError(f"{side.upper()} side termination not found: {device} {name}") From e23b246d46c348d7af8f67735f8e3414105219da Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 5 Oct 2023 16:55:15 -0400 Subject: [PATCH 033/271] Changelog for #11987, #13440, #13746, #13876, #13950 --- docs/release-notes/version-3.6.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 69a8ee62e..cb09ee463 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -2,11 +2,19 @@ ## v3.6.4 (FUTURE) +### Enhancements + +* [#13950](https://github.com/netbox-community/netbox/issues/13950) - Display custom choice field labels rather than values in UI + ### Bug Fixes +* [#11987](https://github.com/netbox-community/netbox/issues/11987) - Fix validation of bulk cable updates via bulk import form * [#12328](https://github.com/netbox-community/netbox/issues/12328) - Ensure generic foreign key relationships are populated in REST API serializations of objects * [#13064](https://github.com/netbox-community/netbox/issues/13064) - Fix resetting of checkbox fields triggered by HTMX form re-rendering +* [#13440](https://github.com/netbox-community/netbox/issues/13440) - Fix support for assigning a tenant when creating "next available" VLANs via the REST API +* [#13746](https://github.com/netbox-community/netbox/issues/13746) - Fix support for setting custom field values when creating "next available" IP addresses via the REST API * [#13872](https://github.com/netbox-community/netbox/issues/13872) - Add CSV delimiter field to file upload tab under bulk object upload views +* [#13876](https://github.com/netbox-community/netbox/issues/13876) - Fix support for assigning an interface when creating "next available" IP addresses via the REST API * [#13910](https://github.com/netbox-community/netbox/issues/13910) - Correct "add device" button link under platform view * [#13944](https://github.com/netbox-community/netbox/issues/13944) - Correct serialization of several report attributes in the REST API * [#13966](https://github.com/netbox-community/netbox/issues/13966) - Restore "last login" column on users table From 383285fb943bf3e511a04e11510c6a04ed966ff7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 6 Oct 2023 13:34:25 -0400 Subject: [PATCH 034/271] Closes #13997: Update runner versions (#13998) * Update runner versions * Update stale & lock runners --- .github/workflows/ci.yml | 8 ++++---- .github/workflows/lock.yml | 2 +- .github/workflows/stale.yml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1d9692194..9d580baa4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,15 +31,15 @@ jobs: steps: - name: Check out repo - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v4 with: python-version: ${{ matrix.python-version }} - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} @@ -47,7 +47,7 @@ jobs: run: npm install -g yarn - name: Setup Node.js with Yarn Caching - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} cache: yarn diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index 6019cef5d..a3e66a429 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -14,7 +14,7 @@ jobs: lock: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v3 + - uses: dessant/lock-threads@v4 with: issue-inactive-days: 90 pr-inactive-days: 30 diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 3b37aae56..22de146a2 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/stale@v6 + - uses: actions/stale@v8 with: close-issue-message: > This issue has been automatically closed due to lack of activity. In an From 4286c1cde255a9bf146b3b192e1ac17566af0094 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 6 Oct 2023 15:14:33 -0400 Subject: [PATCH 035/271] Closes #12831: Include circuit description in cable trace SVG image --- docs/release-notes/version-3.6.md | 1 + netbox/dcim/svg/cables.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index cb09ee463..6cbcf3e19 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -4,6 +4,7 @@ ### Enhancements +* [#12831](https://github.com/netbox-community/netbox/issues/12831) - Include circuit description in cable trace SVG image * [#13950](https://github.com/netbox-community/netbox/issues/13950) - Display custom choice field labels rather than values in UI ### Bug Fixes diff --git a/netbox/dcim/svg/cables.py b/netbox/dcim/svg/cables.py index c01e656fd..acc4fcad9 100644 --- a/netbox/dcim/svg/cables.py +++ b/netbox/dcim/svg/cables.py @@ -160,6 +160,8 @@ class CableTraceSVG: elif instance._meta.model_name == 'circuit': labels[0] = f'Circuit {instance}' labels.append(instance.provider) + if instance.description: + labels.append(instance.description) elif instance._meta.model_name == 'circuittermination': if instance.xconnect_id: labels.append(f'{instance.xconnect_id}') From 01c894e6257b9a4c746bab4d0ca9d0b888730a23 Mon Sep 17 00:00:00 2001 From: Arthur Date: Thu, 12 Oct 2023 09:45:16 -0700 Subject: [PATCH 036/271] 14013 fix device role filter --- netbox/dcim/forms/filtersets.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 43e5f4481..7f99d1ca4 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -109,7 +109,7 @@ class DeviceComponentFilterForm(NetBoxModelFilterSetForm): required=False, label=_('Device type') ) - role_id = DynamicModelMultipleChoiceField( + device_role_id = DynamicModelMultipleChoiceField( queryset=DeviceRole.objects.all(), required=False, label=_('Device role') @@ -1136,7 +1136,7 @@ class ConsolePortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): (None, ('q', 'filter_id', 'tag')), (_('Attributes'), ('name', 'label', 'type', 'speed')), (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), (_('Connection'), ('cabled', 'connected', 'occupied')), ) type = forms.MultipleChoiceField( @@ -1158,7 +1158,7 @@ class ConsoleServerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterF (None, ('q', 'filter_id', 'tag')), (_('Attributes'), ('name', 'label', 'type', 'speed')), (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), (_('Connection'), ('cabled', 'connected', 'occupied')), ) type = forms.MultipleChoiceField( @@ -1180,7 +1180,7 @@ class PowerPortFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): (None, ('q', 'filter_id', 'tag')), (_('Attributes'), ('name', 'label', 'type')), (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), (_('Connection'), ('cabled', 'connected', 'occupied')), ) type = forms.MultipleChoiceField( @@ -1197,7 +1197,7 @@ class PowerOutletFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): (None, ('q', 'filter_id', 'tag')), (_('Attributes'), ('name', 'label', 'type')), (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), (_('Connection'), ('cabled', 'connected', 'occupied')), ) type = forms.MultipleChoiceField( @@ -1217,7 +1217,7 @@ class InterfaceFilterForm(PathEndpointFilterForm, DeviceComponentFilterForm): (_('PoE'), ('poe_mode', 'poe_type')), (_('Wireless'), ('rf_role', 'rf_channel', 'rf_channel_width', 'tx_power')), (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id', 'vdc_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id', 'vdc_id')), (_('Connection'), ('cabled', 'connected', 'occupied')), ) vdc_id = DynamicModelMultipleChoiceField( @@ -1324,7 +1324,7 @@ class FrontPortFilterForm(CabledFilterForm, DeviceComponentFilterForm): (None, ('q', 'filter_id', 'tag')), (_('Attributes'), ('name', 'label', 'type', 'color')), (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), (_('Cable'), ('cabled', 'occupied')), ) model = FrontPort @@ -1346,7 +1346,7 @@ class RearPortFilterForm(CabledFilterForm, DeviceComponentFilterForm): (None, ('q', 'filter_id', 'tag')), (_('Attributes'), ('name', 'label', 'type', 'color')), (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), (_('Cable'), ('cabled', 'occupied')), ) type = forms.MultipleChoiceField( @@ -1367,7 +1367,7 @@ class ModuleBayFilterForm(DeviceComponentFilterForm): (None, ('q', 'filter_id', 'tag')), (_('Attributes'), ('name', 'label', 'position')), (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), ) tag = TagFilterField(model) position = forms.CharField( @@ -1382,7 +1382,7 @@ class DeviceBayFilterForm(DeviceComponentFilterForm): (None, ('q', 'filter_id', 'tag')), (_('Attributes'), ('name', 'label')), (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), ) tag = TagFilterField(model) @@ -1393,7 +1393,7 @@ class InventoryItemFilterForm(DeviceComponentFilterForm): (None, ('q', 'filter_id', 'tag')), (_('Attributes'), ('name', 'label', 'role_id', 'manufacturer_id', 'serial', 'asset_tag', 'discovered')), (_('Location'), ('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id')), - (_('Device'), ('device_type_id', 'role_id', 'device_id', 'virtual_chassis_id')), + (_('Device'), ('device_type_id', 'device_role_id', 'device_id', 'virtual_chassis_id')), ) role_id = DynamicModelMultipleChoiceField( queryset=InventoryItemRole.objects.all(), From 2522056bd1a3d4c403ea4d9406c1c093a5b62cb1 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 6 Oct 2023 15:25:47 -0400 Subject: [PATCH 037/271] Closes #12872: Introduce DATA_UPLOAD_MAX_MEMORY_SIZE config parameter --- docs/configuration/miscellaneous.md | 12 ++++++++++-- netbox/netbox/settings.py | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/docs/configuration/miscellaneous.md b/docs/configuration/miscellaneous.md index fd410a9d4..f143be139 100644 --- a/docs/configuration/miscellaneous.md +++ b/docs/configuration/miscellaneous.md @@ -80,6 +80,14 @@ changes in the database indefinitely. --- +## DATA_UPLOAD_MAX_MEMORY_SIZE + +Default: `2621440` (2.5 MB) + +The maximum size (in bytes) of an incoming HTTP request (i.e. `GET` or `POST` data). Requests which exceed this size will raise a `RequestDataTooBig` exception. + +--- + ## ENFORCE_GLOBAL_UNIQUE !!! tip "Dynamic Configuration Parameter" @@ -90,9 +98,9 @@ By default, NetBox will permit users to create duplicate prefixes and IP address --- -## `FILE_UPLOAD_MAX_MEMORY_SIZE` +## FILE_UPLOAD_MAX_MEMORY_SIZE -Default: `2621440` (2.5 MB). +Default: `2621440` (2.5 MB) The maximum amount (in bytes) of uploaded data that will be held in memory before being written to the filesystem. Changing this setting can be useful for example to be able to upload files bigger than 2.5MB to custom scripts for processing. diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 975e86858..15c456584 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -95,6 +95,7 @@ CORS_ORIGIN_WHITELIST = getattr(configuration, 'CORS_ORIGIN_WHITELIST', []) CSRF_COOKIE_NAME = getattr(configuration, 'CSRF_COOKIE_NAME', 'csrftoken') CSRF_COOKIE_SECURE = getattr(configuration, 'CSRF_COOKIE_SECURE', False) CSRF_TRUSTED_ORIGINS = getattr(configuration, 'CSRF_TRUSTED_ORIGINS', []) +DATA_UPLOAD_MAX_MEMORY_SIZE = getattr(configuration, 'DATA_UPLOAD_MAX_MEMORY_SIZE', 2621440) DATE_FORMAT = getattr(configuration, 'DATE_FORMAT', 'N j, Y') DATETIME_FORMAT = getattr(configuration, 'DATETIME_FORMAT', 'N j, Y g:i a') DEBUG = getattr(configuration, 'DEBUG', False) From 72f01b3e8931386a37a1225f7b3c28e54d88fc53 Mon Sep 17 00:00:00 2001 From: Tobias Genannt Date: Thu, 12 Oct 2023 16:50:20 +0200 Subject: [PATCH 038/271] Fix #14026: Only get the needed amount of objects --- netbox/ipam/api/views.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index 643e6a8e0..662b393de 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -266,6 +266,7 @@ class AvailableObjectsView(ObjectValidationMixin, APIView): # Normalize request data to a list of objects requested_objects = request.data if isinstance(request.data, list) else [request.data] + limit = len(requested_objects) # Serialize and validate the request data serializer = self.write_serializer_class(data=requested_objects, many=True, context={ @@ -279,7 +280,7 @@ class AvailableObjectsView(ObjectValidationMixin, APIView): ) with advisory_lock(ADVISORY_LOCK_KEYS[self.advisory_lock_key]): - available_objects = self.get_available_objects(parent) + available_objects = self.get_available_objects(parent, limit) # Determine if the requested number of objects is available if not self.check_sufficient_available(serializer.validated_data, available_objects): From 06ed7ac8a5b827c137f25627377200d738eeffe5 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Fri, 13 Oct 2023 12:57:58 -0500 Subject: [PATCH 039/271] Fixes: #14023 - Fixes bulk disconnecting with multiple components attached to the same cable (#14029) * Fixes: #14023 - Fixes bulk disconnecting with multiple components attached to the same cable * Update netbox/dcim/views.py Co-authored-by: Jeremy Stretch * Update netbox/dcim/views.py Co-authored-by: Jeremy Stretch * Update netbox/dcim/views.py Co-authored-by: Daniel Sheppard * Code cleanup & i18n fix * Restore original termination count logic --------- Co-authored-by: Jeremy Stretch --- netbox/dcim/views.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 2f661e613..7c75dd26e 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -122,16 +122,18 @@ class BulkDisconnectView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View) if form.is_valid(): with transaction.atomic(): - count = 0 + cable_ids = set() for obj in self.queryset.filter(pk__in=form.cleaned_data['pk']): - if obj.cable is None: - continue - obj.cable.delete() - count += 1 + if obj.cable: + cable_ids.add(obj.cable.pk) + count += 1 + for cable in Cable.objects.filter(pk__in=cable_ids): + cable.delete() - messages.success(request, "Disconnected {} {}".format( - count, self.queryset.model._meta.verbose_name_plural + messages.success(request, _("Disconnected {count} {type}").format( + count=count, + type=self.queryset.model._meta.verbose_name_plural )) return redirect(return_url) From 14447befb9dd2479ef265ef1a52b9430ffa10ed5 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 13 Oct 2023 14:01:08 -0400 Subject: [PATCH 040/271] Changelog for #12872, #14013, #14023, #14026 --- docs/release-notes/version-3.6.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 6cbcf3e19..762302ddc 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -5,6 +5,7 @@ ### Enhancements * [#12831](https://github.com/netbox-community/netbox/issues/12831) - Include circuit description in cable trace SVG image +* [#12872](https://github.com/netbox-community/netbox/issues/12872) - Introduce the `DATA_UPLOAD_MAX_MEMORY_SIZE` configuration parameter * [#13950](https://github.com/netbox-community/netbox/issues/13950) - Display custom choice field labels rather than values in UI ### Bug Fixes @@ -19,6 +20,9 @@ * [#13910](https://github.com/netbox-community/netbox/issues/13910) - Correct "add device" button link under platform view * [#13944](https://github.com/netbox-community/netbox/issues/13944) - Correct serialization of several report attributes in the REST API * [#13966](https://github.com/netbox-community/netbox/issues/13966) - Restore "last login" column on users table +* [#14013](https://github.com/netbox-community/netbox/issues/14013) - Fix device role filter choices under inventory items list filters +* [#14023](https://github.com/netbox-community/netbox/issues/14023) - Fix exception when bulk disconnecting interfaces connected to the same cable +* [#14026](https://github.com/netbox-community/netbox/issues/14026) - Optimize the automatic creation of available IP addresses for large prefixes --- From 18a813aa39760636d80ad486a237bf2ec35713ad Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 17 Oct 2023 06:32:42 -0700 Subject: [PATCH 041/271] 13972 allow filtering of cables if have terminations (#13949) * 10769 allow filtering of cables if have terminations * 10769 change to termianted * 10769 add test case * 10769 review cleanup --- netbox/dcim/filtersets.py | 17 +++++++++++++++++ netbox/dcim/forms/filtersets.py | 9 ++++++++- netbox/dcim/tests/test_filtersets.py | 10 ++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 0261998db..d600667d7 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1745,6 +1745,10 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet): method='filter_by_cable_end_b', field_name='terminations__termination_id' ) + unterminated = django_filters.BooleanFilter( + method='_unterminated', + label=_('Unterminated'), + ) type = django_filters.MultipleChoiceFilter( choices=CableTypeChoices ) @@ -1812,6 +1816,19 @@ class CableFilterSet(TenancyFilterSet, NetBoxModelFilterSet): # Filter by termination id and cable_end type return self.filter_by_cable_end(queryset, name, value, CableEndChoices.SIDE_B) + def _unterminated(self, queryset, name, value): + if value: + terminated_ids = ( + queryset.filter(terminations__cable_end=CableEndChoices.SIDE_A) + .filter(terminations__cable_end=CableEndChoices.SIDE_B) + .values("id") + ) + return queryset.exclude(id__in=terminated_ids) + else: + return queryset.filter(terminations__cable_end=CableEndChoices.SIDE_A).filter( + terminations__cable_end=CableEndChoices.SIDE_B + ) + class CableTerminationFilterSet(BaseFilterSet): termination_type = ContentTypeFilter() diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 7f99d1ca4..d0d321187 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -910,7 +910,7 @@ class CableFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): fieldsets = ( (None, ('q', 'filter_id', 'tag')), (_('Location'), ('site_id', 'location_id', 'rack_id', 'device_id')), - (_('Attributes'), ('type', 'status', 'color', 'length', 'length_unit')), + (_('Attributes'), ('type', 'status', 'color', 'length', 'length_unit', 'unterminated')), (_('Tenant'), ('tenant_group_id', 'tenant_id')), ) region_id = DynamicModelMultipleChoiceField( @@ -979,6 +979,13 @@ class CableFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): choices=add_blank_choice(CableLengthUnitChoices), required=False ) + unterminated = forms.NullBooleanField( + label=_('Unterminated'), + required=False, + widget=forms.Select( + choices=BOOLEAN_WITH_BLANK_CHOICES + ) + ) tag = TagFilterField(model) diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index dd5ff7bc2..1f3b557b5 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -4275,6 +4275,7 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): Interface(device=devices[4], name='Interface 10', type=InterfaceTypeChoices.TYPE_1GE_FIXED), Interface(device=devices[5], name='Interface 11', type=InterfaceTypeChoices.TYPE_1GE_FIXED), Interface(device=devices[5], name='Interface 12', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(device=devices[5], name='Interface 13', type=InterfaceTypeChoices.TYPE_1GE_FIXED), ) Interface.objects.bulk_create(interfaces) @@ -4290,6 +4291,9 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): Cable(a_terminations=[interfaces[11]], b_terminations=[interfaces[0]], label='Cable 6', type=CableTypeChoices.TYPE_CAT6, tenant=tenants[2], status=LinkStatusChoices.STATUS_PLANNED, color='e91e63', length=20, length_unit=CableLengthUnitChoices.UNIT_METER).save() Cable(a_terminations=[console_port], b_terminations=[console_server_port], label='Cable 7').save() + # Cable for unterminated test + Cable(a_terminations=[interfaces[12]], label='Cable 8', type=CableTypeChoices.TYPE_CAT6, status=LinkStatusChoices.STATUS_DECOMMISSIONING).save() + def test_label(self): params = {'label': ['Cable 1', 'Cable 2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -4368,6 +4372,12 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): } self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + def test_unterminated(self): + params = {'unterminated': True} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + params = {'unterminated': False} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 7) + class PowerPanelTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = PowerPanel.objects.all() From c671ac2f28daad8a4761929b86a7d91e56ca3da1 Mon Sep 17 00:00:00 2001 From: Prince Kumar Date: Tue, 17 Oct 2023 19:36:33 +0530 Subject: [PATCH 042/271] Add dns_name filter on the IP Address page (#14046) * Add dns_name filter on the IP Address page #13957 * add dns_name field in the filterset field and remove extra method --- netbox/ipam/forms/filtersets.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index e4e967f81..aae62ca75 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -295,7 +295,7 @@ class IPAddressFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): model = IPAddress fieldsets = ( (None, ('q', 'filter_id', 'tag')), - (_('Attributes'), ('parent', 'family', 'status', 'role', 'mask_length', 'assigned_to_interface')), + (_('Attributes'), ('parent', 'family', 'status', 'role', 'mask_length', 'assigned_to_interface', 'dns_name')), (_('VRF'), ('vrf_id', 'present_in_vrf_id')), (_('Tenant'), ('tenant_group_id', 'tenant_id')), (_('Device/VM'), ('device_id', 'virtual_machine_id')), @@ -357,6 +357,10 @@ class IPAddressFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): choices=BOOLEAN_WITH_BLANK_CHOICES ) ) + dns_name = forms.CharField( + required=False, + label=_('DNS Name') + ) tag = TagFilterField(model) From a24864bc6dffc070bfcaeb43158c42dbccefa57f Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 17 Oct 2023 07:31:58 -0700 Subject: [PATCH 043/271] 14042 mptt cache count (#14048) * 14042 fix cache count for mptt child delete * 14042 add test * Misc cleanup --------- Co-authored-by: Jeremy Stretch --- netbox/utilities/counters.py | 6 +++-- netbox/utilities/tests/test_counters.py | 31 ++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/netbox/utilities/counters.py b/netbox/utilities/counters.py index 6c597b943..0ee2606db 100644 --- a/netbox/utilities/counters.py +++ b/netbox/utilities/counters.py @@ -62,7 +62,7 @@ def post_save_receiver(sender, instance, created, **kwargs): update_counter(parent_model, new_pk, counter_name, 1) -def post_delete_receiver(sender, instance, **kwargs): +def post_delete_receiver(sender, instance, origin, **kwargs): """ Update counter fields on related objects when a TrackingModelMixin subclass is deleted. """ @@ -72,7 +72,9 @@ def post_delete_receiver(sender, instance, **kwargs): # Decrement the parent's counter by one if parent_pk is not None: - update_counter(parent_model, parent_pk, counter_name, -1) + # MPTT sends two delete signals for child elements so guard against multiple decrements + if not origin or origin == instance: + update_counter(parent_model, parent_pk, counter_name, -1) # diff --git a/netbox/utilities/tests/test_counters.py b/netbox/utilities/tests/test_counters.py index cf8850c52..014c758e9 100644 --- a/netbox/utilities/tests/test_counters.py +++ b/netbox/utilities/tests/test_counters.py @@ -1,7 +1,11 @@ -from django.test import TestCase +from django.contrib.contenttypes.models import ContentType +from django.test import override_settings +from django.urls import reverse from dcim.models import * -from utilities.testing.utils import create_test_device +from users.models import ObjectPermission +from utilities.testing.base import TestCase +from utilities.testing.utils import create_test_device, create_test_user class CountersTest(TestCase): @@ -10,7 +14,6 @@ class CountersTest(TestCase): """ @classmethod def setUpTestData(cls): - # Create devices device1 = create_test_device('Device 1') device2 = create_test_device('Device 2') @@ -79,3 +82,25 @@ class CountersTest(TestCase): device2.refresh_from_db() self.assertEqual(device1.interface_count, 1) self.assertEqual(device2.interface_count, 3) + + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) + def test_mptt_child_delete(self): + device1, device2 = Device.objects.all() + inventory_item1 = InventoryItem.objects.create(device=device1, name='Inventory Item 1') + inventory_item2 = InventoryItem.objects.create(device=device1, name='Inventory Item 2', parent=inventory_item1) + device1.refresh_from_db() + self.assertEqual(device1.inventory_item_count, 2) + + # Setup bulk_delete for the inventory items + self.add_permissions('dcim.delete_inventoryitem') + pk_list = device1.inventoryitems.values_list('pk', flat=True) + data = { + 'pk': pk_list, + 'confirm': True, + '_confirm': True, # Form button + } + + # Try POST with model-level permission + self.client.post(reverse("dcim:inventoryitem_bulk_delete"), data) + device1.refresh_from_db() + self.assertEqual(device1.inventory_item_count, 0) From d77d45e795e8341ea95fbb1897daee10f170e429 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 17 Oct 2023 07:35:01 -0700 Subject: [PATCH 044/271] 12336 make region API calls atomic (#13942) * 12336 make region API calls atomic * 12336 switch to pg locks * 12336 add locks to all views using mptt models * 12336 fix ADVISORY_LOCK_KEYS reference * 12336 review changes * Tweak advisory lock numbering --------- Co-authored-by: Jeremy Stretch --- netbox/dcim/api/views.py | 12 ++++++------ netbox/netbox/api/viewsets/__init__.py | 21 +++++++++++++++++++++ netbox/netbox/constants.py | 11 +++++++++++ netbox/tenancy/api/views.py | 6 +++--- netbox/wireless/api/views.py | 4 ++-- netbox/wireless/models.py | 1 - 6 files changed, 43 insertions(+), 12 deletions(-) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index f045f1bb4..80a991736 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -20,7 +20,7 @@ from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired from netbox.api.metadata import ContentTypeMetadata from netbox.api.pagination import StripCountAnnotationsPaginator from netbox.api.renderers import TextRenderer -from netbox.api.viewsets import NetBoxModelViewSet +from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin from netbox.constants import NESTED_SERIALIZER_PREFIX from utilities.api import get_serializer_for_model @@ -98,7 +98,7 @@ class PassThroughPortMixin(object): # Regions # -class RegionViewSet(NetBoxModelViewSet): +class RegionViewSet(MPTTLockedMixin, NetBoxModelViewSet): queryset = Region.objects.add_related_count( Region.objects.all(), Site, @@ -114,7 +114,7 @@ class RegionViewSet(NetBoxModelViewSet): # Site groups # -class SiteGroupViewSet(NetBoxModelViewSet): +class SiteGroupViewSet(MPTTLockedMixin, NetBoxModelViewSet): queryset = SiteGroup.objects.add_related_count( SiteGroup.objects.all(), Site, @@ -149,7 +149,7 @@ class SiteViewSet(NetBoxModelViewSet): # Locations # -class LocationViewSet(NetBoxModelViewSet): +class LocationViewSet(MPTTLockedMixin, NetBoxModelViewSet): queryset = Location.objects.add_related_count( Location.objects.add_related_count( Location.objects.all(), @@ -350,7 +350,7 @@ class DeviceBayTemplateViewSet(NetBoxModelViewSet): filterset_class = filtersets.DeviceBayTemplateFilterSet -class InventoryItemTemplateViewSet(NetBoxModelViewSet): +class InventoryItemTemplateViewSet(MPTTLockedMixin, NetBoxModelViewSet): queryset = InventoryItemTemplate.objects.prefetch_related('device_type__manufacturer', 'role') serializer_class = serializers.InventoryItemTemplateSerializer filterset_class = filtersets.InventoryItemTemplateFilterSet @@ -538,7 +538,7 @@ class DeviceBayViewSet(NetBoxModelViewSet): brief_prefetch_fields = ['device'] -class InventoryItemViewSet(NetBoxModelViewSet): +class InventoryItemViewSet(MPTTLockedMixin, NetBoxModelViewSet): queryset = InventoryItem.objects.prefetch_related('device', 'manufacturer', 'tags') serializer_class = serializers.InventoryItemSerializer filterset_class = filtersets.InventoryItemFilterSet diff --git a/netbox/netbox/api/viewsets/__init__.py b/netbox/netbox/api/viewsets/__init__.py index 5fe81b1f5..c6794bb61 100644 --- a/netbox/netbox/api/viewsets/__init__.py +++ b/netbox/netbox/api/viewsets/__init__.py @@ -3,6 +3,8 @@ import logging from django.core.exceptions import ObjectDoesNotExist, PermissionDenied from django.db import transaction from django.db.models import ProtectedError +from django_pglocks import advisory_lock +from netbox.constants import ADVISORY_LOCK_KEYS from rest_framework import mixins as drf_mixins from rest_framework.response import Response from rest_framework.viewsets import GenericViewSet @@ -157,3 +159,22 @@ class NetBoxModelViewSet( logger.info(f"Deleting {model._meta.verbose_name} {instance} (PK: {instance.pk})") return super().perform_destroy(instance) + + +class MPTTLockedMixin: + """ + Puts pglock on objects that derive from MPTTModel for parallel API calling. + Note: If adding this to a view, must add the model name to ADVISORY_LOCK_KEYS + """ + + def create(self, request, *args, **kwargs): + with advisory_lock(ADVISORY_LOCK_KEYS[self.queryset.model._meta.model_name]): + return super().create(request, *args, **kwargs) + + def update(self, request, *args, **kwargs): + with advisory_lock(ADVISORY_LOCK_KEYS[self.queryset.model._meta.model_name]): + return super().update(request, *args, **kwargs) + + def destroy(self, request, *args, **kwargs): + with advisory_lock(ADVISORY_LOCK_KEYS[self.queryset.model._meta.model_name]): + return super().destroy(request, *args, **kwargs) diff --git a/netbox/netbox/constants.py b/netbox/netbox/constants.py index d69edc69c..2f4ee8e6b 100644 --- a/netbox/netbox/constants.py +++ b/netbox/netbox/constants.py @@ -11,8 +11,19 @@ RQ_QUEUE_LOW = 'low' # When adding a new key, pick something arbitrary and unique so that it is easily searchable in # query logs. ADVISORY_LOCK_KEYS = { + # Available object locks 'available-prefixes': 100100, 'available-ips': 100200, 'available-vlans': 100300, 'available-asns': 100400, + + # MPTT locks + 'region': 105100, + 'sitegroup': 105200, + 'location': 105300, + 'tenantgroup': 105400, + 'contactgroup': 105500, + 'wirelesslangroup': 105600, + 'inventoryitem': 105700, + 'inventoryitemtemplate': 105800, } diff --git a/netbox/tenancy/api/views.py b/netbox/tenancy/api/views.py index 39c86d80e..71a4961c3 100644 --- a/netbox/tenancy/api/views.py +++ b/netbox/tenancy/api/views.py @@ -3,7 +3,7 @@ from rest_framework.routers import APIRootView from circuits.models import Circuit from dcim.models import Device, Rack, Site from ipam.models import IPAddress, Prefix, VLAN, VRF -from netbox.api.viewsets import NetBoxModelViewSet +from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin from tenancy import filtersets from tenancy.models import * from utilities.utils import count_related @@ -23,7 +23,7 @@ class TenancyRootView(APIRootView): # Tenants # -class TenantGroupViewSet(NetBoxModelViewSet): +class TenantGroupViewSet(MPTTLockedMixin, NetBoxModelViewSet): queryset = TenantGroup.objects.add_related_count( TenantGroup.objects.all(), Tenant, @@ -58,7 +58,7 @@ class TenantViewSet(NetBoxModelViewSet): # Contacts # -class ContactGroupViewSet(NetBoxModelViewSet): +class ContactGroupViewSet(MPTTLockedMixin, NetBoxModelViewSet): queryset = ContactGroup.objects.add_related_count( ContactGroup.objects.all(), Contact, diff --git a/netbox/wireless/api/views.py b/netbox/wireless/api/views.py index 1103cec37..a6cc9f535 100644 --- a/netbox/wireless/api/views.py +++ b/netbox/wireless/api/views.py @@ -1,6 +1,6 @@ from rest_framework.routers import APIRootView -from netbox.api.viewsets import NetBoxModelViewSet +from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin from wireless import filtersets from wireless.models import * from . import serializers @@ -14,7 +14,7 @@ class WirelessRootView(APIRootView): return 'Wireless' -class WirelessLANGroupViewSet(NetBoxModelViewSet): +class WirelessLANGroupViewSet(MPTTLockedMixin, NetBoxModelViewSet): queryset = WirelessLANGroup.objects.add_related_count( WirelessLANGroup.objects.all(), WirelessLAN, diff --git a/netbox/wireless/models.py b/netbox/wireless/models.py index 046918535..e8e48eef8 100644 --- a/netbox/wireless/models.py +++ b/netbox/wireless/models.py @@ -2,7 +2,6 @@ from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from mptt.models import MPTTModel from dcim.choices import LinkStatusChoices from dcim.constants import WIRELESS_IFACE_TYPES From 7983c2590e74b36682c4b76e8a543c709fad0891 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 17 Oct 2023 07:57:50 -0700 Subject: [PATCH 045/271] 14025 fix script name checking (#14030) * 14025 fix script name checking * 14025 fix script name checking * 14025 add file extension validation and simplify get logic * 14025 match start of string with regex * 14025 backout changes to model_forms * 14025 add filepatch checking to reports --- netbox/extras/views.py | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 9efcc02dc..55b73d29d 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -978,6 +978,10 @@ class ReportListView(ContentTypePermissionRequiredMixin, View): }) +def get_report_module(module, request): + return get_object_or_404(ReportModule.objects.restrict(request.user), file_path__regex=f"^{module}\\.") + + class ReportView(ContentTypePermissionRequiredMixin, View): """ Display a single Report and its associated Job (if any). @@ -986,7 +990,7 @@ class ReportView(ContentTypePermissionRequiredMixin, View): return 'extras.view_report' def get(self, request, module, name): - module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path__startswith=module) + module = get_report_module(module, request) report = module.reports[name]() object_type = ContentType.objects.get(app_label='extras', model='reportmodule') @@ -1007,7 +1011,7 @@ class ReportView(ContentTypePermissionRequiredMixin, View): if not request.user.has_perm('extras.run_report'): return HttpResponseForbidden() - module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path__startswith=module) + module = get_report_module(module, request) report = module.reports[name]() form = ReportForm(request.POST, scheduling_enabled=report.scheduling_enabled) @@ -1046,7 +1050,7 @@ class ReportSourceView(ContentTypePermissionRequiredMixin, View): return 'extras.view_report' def get(self, request, module, name): - module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path__startswith=module) + module = get_report_module(module, request) report = module.reports[name]() return render(request, 'extras/report/source.html', { @@ -1062,7 +1066,7 @@ class ReportJobsView(ContentTypePermissionRequiredMixin, View): return 'extras.view_report' def get(self, request, module, name): - module = get_object_or_404(ReportModule.objects.restrict(request.user), file_path__startswith=module) + module = get_report_module(module, request) report = module.reports[name]() object_type = ContentType.objects.get(app_label='extras', model='reportmodule') @@ -1151,13 +1155,17 @@ class ScriptListView(ContentTypePermissionRequiredMixin, View): }) +def get_script_module(module, request): + return get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__regex=f"^{module}\\.") + + class ScriptView(ContentTypePermissionRequiredMixin, View): def get_required_permission(self): return 'extras.view_script' def get(self, request, module, name): - module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module) + module = get_script_module(module, request) script = module.scripts[name]() form = script.as_form(initial=normalize_querydict(request.GET)) @@ -1181,7 +1189,7 @@ class ScriptView(ContentTypePermissionRequiredMixin, View): if not request.user.has_perm('extras.run_script'): return HttpResponseForbidden() - module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module) + module = get_script_module(module, request) script = module.scripts[name]() form = script.as_form(request.POST, request.FILES) @@ -1218,7 +1226,7 @@ class ScriptSourceView(ContentTypePermissionRequiredMixin, View): return 'extras.view_script' def get(self, request, module, name): - module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module) + module = get_script_module(module, request) script = module.scripts[name]() return render(request, 'extras/script/source.html', { @@ -1234,7 +1242,7 @@ class ScriptJobsView(ContentTypePermissionRequiredMixin, View): return 'extras.view_script' def get(self, request, module, name): - module = get_object_or_404(ScriptModule.objects.restrict(request.user), file_path__startswith=module) + module = get_script_module(module, request) script = module.scripts[name]() object_type = ContentType.objects.get(app_label='extras', model='scriptmodule') From 51ef4fb920acd689755af6ea9f7765b341ebfcec Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 13 Oct 2023 16:39:19 -0400 Subject: [PATCH 046/271] Closes #13962: Add a copy-to-clipboard button to the key field of the API token creation form --- netbox/project-static/dist/netbox.js | Bin 529868 -> 529867 bytes netbox/project-static/dist/netbox.js.map | Bin 450255 -> 450255 bytes netbox/project-static/src/clipboard.ts | 2 +- netbox/templates/account/token.html | 5 ----- netbox/users/forms/model_forms.py | 3 +++ .../templates/form_helpers/render_field.html | 8 ++++++++ 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 7d16f9916551ad8f5deea05dcc5db33d79d507df..426302ea83c97ad0ae968919b4ede00f323f214e 100644 GIT binary patch delta 33 ocmX@JTH*9+g@zW!7N!>F7M2#)7Pc+yPQvZZ!tC3fg*iHz0MF(MZvX%Q delta 35 qcmX@TTH(xUg@zW!7N!>F7M2#)7Pc+yPQr|d?M}k%+nt0tI++0D;tJ0I diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 1797f57ceb117de051fd4be372f96b16e715f26f..077c4bcc0b0e1e6c7dbb1eb1722ea94132e260b2 100644 GIT binary patch delta 29 lcmX@VSNi;3>4p}@7N!>F7M2#)Eo@1gjG5b$IoWcq0syPU3TprW delta 29 lcmX@VSNi;3>4p}@7N!>F7M2#)Eo@1gjM>|hIoWcq0syPi3T*%Y diff --git a/netbox/project-static/src/clipboard.ts b/netbox/project-static/src/clipboard.ts index 46ca5e36c..ddcb7b96e 100644 --- a/netbox/project-static/src/clipboard.ts +++ b/netbox/project-static/src/clipboard.ts @@ -2,7 +2,7 @@ import Clipboard from 'clipboard'; import { getElements } from './util'; export function initClipboard(): void { - for (const element of getElements('a.copy-content')) { + for (const element of getElements('.copy-content')) { new Clipboard(element); } } diff --git a/netbox/templates/account/token.html b/netbox/templates/account/token.html index d83e13ff5..57d1de3f4 100644 --- a/netbox/templates/account/token.html +++ b/netbox/templates/account/token.html @@ -15,11 +15,6 @@ {% block content %}
      - {% if key and not settings.ALLOW_TOKEN_RETRIEVAL %} - - {% endif %}
      {% trans "Token" %}
      diff --git a/netbox/users/forms/model_forms.py b/netbox/users/forms/model_forms.py index 5fe84ad5f..1c3233f87 100644 --- a/netbox/users/forms/model_forms.py +++ b/netbox/users/forms/model_forms.py @@ -114,6 +114,9 @@ class UserTokenForm(BootstrapMixin, forms.ModelForm): help_text=_( 'Keys must be at least 40 characters in length. Be sure to record your key prior to ' 'submitting this form, as it may no longer be accessible once the token has been created.' + ), + widget=forms.TextInput( + attrs={'data-clipboard': 'true'} ) ) allowed_ips = SimpleArrayField( diff --git a/netbox/utilities/templates/form_helpers/render_field.html b/netbox/utilities/templates/form_helpers/render_field.html index 379dcc021..e5a564a3d 100644 --- a/netbox/utilities/templates/form_helpers/render_field.html +++ b/netbox/utilities/templates/form_helpers/render_field.html @@ -29,6 +29,14 @@ {{ label }}
      + {# Include a copy-to-clipboard button #} + {% elif 'data-clipboard' in field.field.widget.attrs %} +
      + {{ field }} + +
      {# Default field rendering #} {% else %} {{ field }} From ab9de4344785f39a34dfd79ecc1721f22ee69e74 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 17 Oct 2023 12:25:49 -0400 Subject: [PATCH 047/271] Changelog for #12336, #13957, #13962, #13972, #14025, #14042 --- docs/release-notes/version-3.6.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 762302ddc..230c7a652 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -7,11 +7,15 @@ * [#12831](https://github.com/netbox-community/netbox/issues/12831) - Include circuit description in cable trace SVG image * [#12872](https://github.com/netbox-community/netbox/issues/12872) - Introduce the `DATA_UPLOAD_MAX_MEMORY_SIZE` configuration parameter * [#13950](https://github.com/netbox-community/netbox/issues/13950) - Display custom choice field labels rather than values in UI +* [#13957](https://github.com/netbox-community/netbox/issues/13957) - Add DNS name filter on IP addresses list +* [#13962](https://github.com/netbox-community/netbox/issues/13962) - Add a copy-to-clipboard button for API tokens +* [#13972](https://github.com/netbox-community/netbox/issues/13972) - Introduce a filter to find unterminated cables ### Bug Fixes * [#11987](https://github.com/netbox-community/netbox/issues/11987) - Fix validation of bulk cable updates via bulk import form * [#12328](https://github.com/netbox-community/netbox/issues/12328) - Ensure generic foreign key relationships are populated in REST API serializations of objects +* [#12336](https://github.com/netbox-community/netbox/issues/12336) - Employ PostgreSQL advisory locks to avoid duplicate MPTT tree IDs when bulk creating objects * [#13064](https://github.com/netbox-community/netbox/issues/13064) - Fix resetting of checkbox fields triggered by HTMX form re-rendering * [#13440](https://github.com/netbox-community/netbox/issues/13440) - Fix support for assigning a tenant when creating "next available" VLANs via the REST API * [#13746](https://github.com/netbox-community/netbox/issues/13746) - Fix support for setting custom field values when creating "next available" IP addresses via the REST API @@ -22,7 +26,9 @@ * [#13966](https://github.com/netbox-community/netbox/issues/13966) - Restore "last login" column on users table * [#14013](https://github.com/netbox-community/netbox/issues/14013) - Fix device role filter choices under inventory items list filters * [#14023](https://github.com/netbox-community/netbox/issues/14023) - Fix exception when bulk disconnecting interfaces connected to the same cable +* [#14025](https://github.com/netbox-community/netbox/issues/14025) - Fix exception when viewing a script that begins with the same name as another * [#14026](https://github.com/netbox-community/netbox/issues/14026) - Optimize the automatic creation of available IP addresses for large prefixes +* [#14042](https://github.com/netbox-community/netbox/issues/14042) - Fix duplicated child object count decrements when removing objects in bulk --- From 3fd8e48fac47d22e3202c101921d6c57cddd0428 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 17 Oct 2023 12:37:14 -0400 Subject: [PATCH 048/271] Release v3.6.4 --- .github/ISSUE_TEMPLATE/bug_report.yaml | 2 +- .github/ISSUE_TEMPLATE/feature_request.yaml | 2 +- docs/release-notes/version-3.6.md | 2 +- netbox/netbox/settings.py | 2 +- requirements.txt | 28 ++++++++++----------- 5 files changed, 18 insertions(+), 18 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index a587b36e2..f4afe3f98 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.6.3 + placeholder: v3.6.4 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml index 71f1f2d97..9bf991e6e 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v3.6.3 + placeholder: v3.6.4 validations: required: true - type: dropdown diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index 230c7a652..a03dc548f 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -1,6 +1,6 @@ # NetBox v3.6 -## v3.6.4 (FUTURE) +## v3.6.4 (2023-10-17) ### Enhancements diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 15c456584..a5bbad85e 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -25,7 +25,7 @@ from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW # Environment setup # -VERSION = '3.6.4-dev' +VERSION = '3.6.4' # Hostname HOSTNAME = platform.node() diff --git a/requirements.txt b/requirements.txt index b81042acd..38585c433 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,35 +1,35 @@ -bleach==6.0.0 -Django==4.2.5 -django-cors-headers==4.2.0 +bleach==6.1.0 +Django==4.2.6 +django-cors-headers==4.3.0 django-debug-toolbar==4.2.0 django-filter==23.3 django-graphiql-debug-toolbar==0.2.0 -django-mptt==0.14 +django-mptt==0.15 django-pglocks==1.0.4 django-prometheus==2.3.1 -django-redis==5.3.0 -django-rich==1.7.0 +django-redis==5.4.0 +django-rich==1.8.0 django-rq==2.8.1 django-tables2==2.6.0 django-taggit==4.0.0 django-timezone-field==6.0.1 djangorestframework==3.14.0 -drf-spectacular==0.26.4 -drf-spectacular-sidecar==2023.9.1 +drf-spectacular==0.26.5 +drf-spectacular-sidecar==2023.10.1 feedparser==6.0.10 graphene-django==3.0.0 gunicorn==21.2.0 Jinja2==3.1.2 Markdown==3.3.7 -mkdocs-material==9.4.2 +mkdocs-material==9.4.6 mkdocstrings[python-legacy]==0.23.0 netaddr==0.9.0 -Pillow==10.0.1 -psycopg[binary,pool]==3.1.11 +Pillow==10.1.0 +psycopg[binary,pool]==3.1.12 PyYAML==6.0.1 -requests==2.28.1 -sentry-sdk==1.31.0 -social-auth-app-django==5.3.0 +requests==2.31.0 +sentry-sdk==1.32.0 +social-auth-app-django==5.4.0 social-auth-core[openidconnect]==4.4.2 svgwrite==1.4.3 tablib==3.5.0 From de298224f13df3a2f9871a27d451a33abd6fbee2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 17 Oct 2023 12:48:42 -0400 Subject: [PATCH 049/271] Pin django-mptt to v0.14.0, for Python 3.8 --- base_requirements.txt | 3 ++- requirements.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/base_requirements.txt b/base_requirements.txt index 423a9754b..9863984ca 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -23,8 +23,9 @@ django-filter django-graphiql-debug-toolbar # Modified Preorder Tree Traversal (recursive nesting of objects) +# Pinned to 0.14.0; 0.15.0 requires Python 3.9+ # https://github.com/django-mptt/django-mptt/blob/main/CHANGELOG.rst -django-mptt +django-mptt==0.14.0 # Context managers for PostgreSQL advisory locks # https://github.com/Xof/django-pglocks/blob/master/CHANGES.txt diff --git a/requirements.txt b/requirements.txt index 38585c433..9f9176ea2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ django-cors-headers==4.3.0 django-debug-toolbar==4.2.0 django-filter==23.3 django-graphiql-debug-toolbar==0.2.0 -django-mptt==0.15 +django-mptt==0.14.0 django-pglocks==1.0.4 django-prometheus==2.3.1 django-redis==5.4.0 From 7efbfabc0bd7e8a5c5878ec60d4d14aefb6c38a0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 17 Oct 2023 13:07:29 -0400 Subject: [PATCH 050/271] PRVB --- docs/release-notes/version-3.6.md | 4 ++++ netbox/netbox/settings.py | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/version-3.6.md b/docs/release-notes/version-3.6.md index a03dc548f..8f827b50e 100644 --- a/docs/release-notes/version-3.6.md +++ b/docs/release-notes/version-3.6.md @@ -1,5 +1,9 @@ # NetBox v3.6 +## v3.6.5 (FUTURE) + +--- + ## v3.6.4 (2023-10-17) ### Enhancements diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index a5bbad85e..111781b8a 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -25,7 +25,7 @@ from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW # Environment setup # -VERSION = '3.6.4' +VERSION = '3.6.5-dev' # Hostname HOSTNAME = platform.node() From 2a0a7d45aaf9e0fbd2f3c3980c96a2396fbab032 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 18 Oct 2023 11:24:14 -0400 Subject: [PATCH 051/271] Add GitHub issue template for translations --- .github/ISSUE_TEMPLATE/translation.yaml | 37 +++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/translation.yaml diff --git a/.github/ISSUE_TEMPLATE/translation.yaml b/.github/ISSUE_TEMPLATE/translation.yaml new file mode 100644 index 000000000..001b6ac53 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/translation.yaml @@ -0,0 +1,37 @@ +--- +name: 🌍 Translation +description: Request support for a new language in the user interface +labels: ["type: translation"] +body: + - type: markdown + attributes: + value: > + **NOTE:** This template is used only for proposing the addition of *new* languages. Please do + not use it to request changes to existing translations. + - type: input + attributes: + label: Language + description: What is the name of the language in English? + validations: + required: true + - type: input + attributes: + label: ISO 639-1 code + description: > + What is the two-letter [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) + assigned to the language? + validations: + required: true + - type: dropdown + attributes: + label: Volunteer + description: Are you a native speaker of this language and willing to contribute a translation map? + options: + - Yes + - No + validations: + required: true + - type: textarea + attributes: + label: Comments + description: Any other notes you would like to share From 809b04959085c8d6cdb757c0a0255e17a73e7723 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 18 Oct 2023 11:29:31 -0400 Subject: [PATCH 052/271] YAML fix --- .github/ISSUE_TEMPLATE/translation.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/translation.yaml b/.github/ISSUE_TEMPLATE/translation.yaml index 001b6ac53..d53db04fd 100644 --- a/.github/ISSUE_TEMPLATE/translation.yaml +++ b/.github/ISSUE_TEMPLATE/translation.yaml @@ -27,8 +27,8 @@ body: label: Volunteer description: Are you a native speaker of this language and willing to contribute a translation map? options: - - Yes - - No + - "Yes" + - "No" validations: required: true - type: textarea From 5b2f29480a42e9c815ca1f50403c115cc89b6538 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 18 Oct 2023 11:57:21 -0400 Subject: [PATCH 053/271] Tweak translation issue form --- .github/ISSUE_TEMPLATE/translation.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/translation.yaml b/.github/ISSUE_TEMPLATE/translation.yaml index d53db04fd..d07bc399d 100644 --- a/.github/ISSUE_TEMPLATE/translation.yaml +++ b/.github/ISSUE_TEMPLATE/translation.yaml @@ -25,7 +25,7 @@ body: - type: dropdown attributes: label: Volunteer - description: Are you a native speaker of this language and willing to contribute a translation map? + description: Are you a fluent speaker of this language **and** willing to contribute a translation map? options: - "Yes" - "No" From 3f40ee5501badc9ed342ef58563fa36f04212ec3 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 20 Oct 2023 11:24:08 -0400 Subject: [PATCH 054/271] Closes #14036: Move extras.plugins to netbox.plugins (#14086) * Move extras.plugins to netbox.plugins & add deprecation warnings * Move plugin template tags from extras to utilities * Move plugins tests from extras to netbox * Add TODO reminders for v4.0 --- netbox/extras/plugins/__init__.py | 145 +---------------- netbox/extras/plugins/navigation.py | 73 +-------- netbox/extras/plugins/registration.py | 65 +------- netbox/extras/plugins/templates.py | 74 +-------- netbox/extras/plugins/urls.py | 42 +---- netbox/extras/plugins/utils.py | 38 +---- netbox/extras/plugins/views.py | 90 +---------- netbox/netbox/api/views.py | 2 +- netbox/netbox/configuration_testing.py | 2 +- netbox/netbox/plugins/__init__.py | 148 ++++++++++++++++++ netbox/netbox/plugins/navigation.py | 72 +++++++++ netbox/netbox/plugins/registration.py | 64 ++++++++ netbox/netbox/plugins/templates.py | 73 +++++++++ netbox/netbox/plugins/urls.py | 41 +++++ netbox/netbox/plugins/utils.py | 37 +++++ netbox/netbox/plugins/views.py | 89 +++++++++++ netbox/netbox/settings.py | 2 +- .../tests/dummy_plugin/__init__.py | 6 +- .../tests/dummy_plugin/admin.py | 0 .../tests/dummy_plugin/api/serializers.py | 2 +- .../tests/dummy_plugin/api/urls.py | 0 .../tests/dummy_plugin/api/views.py | 2 +- .../tests/dummy_plugin/graphql.py | 0 .../tests/dummy_plugin/middleware.py | 0 .../dummy_plugin/migrations/0001_initial.py | 0 .../tests/dummy_plugin/migrations/__init__.py | 0 .../tests/dummy_plugin/models.py | 0 .../tests/dummy_plugin/navigation.py | 2 +- .../tests/dummy_plugin/preferences.py | 0 .../tests/dummy_plugin/search.py | 0 .../tests/dummy_plugin/template_content.py | 2 +- .../tests/dummy_plugin/urls.py | 0 .../tests/dummy_plugin/views.py | 0 .../{extras => netbox}/tests/test_plugins.py | 28 ++-- netbox/netbox/urls.py | 2 +- netbox/netbox/views/errors.py | 2 +- .../templatetags/plugins.py | 2 +- netbox/utilities/utils.py | 2 +- 38 files changed, 579 insertions(+), 528 deletions(-) create mode 100644 netbox/netbox/plugins/__init__.py create mode 100644 netbox/netbox/plugins/navigation.py create mode 100644 netbox/netbox/plugins/registration.py create mode 100644 netbox/netbox/plugins/templates.py create mode 100644 netbox/netbox/plugins/urls.py create mode 100644 netbox/netbox/plugins/utils.py create mode 100644 netbox/netbox/plugins/views.py rename netbox/{extras => netbox}/tests/dummy_plugin/__init__.py (72%) rename netbox/{extras => netbox}/tests/dummy_plugin/admin.py (100%) rename netbox/{extras => netbox}/tests/dummy_plugin/api/serializers.py (76%) rename netbox/{extras => netbox}/tests/dummy_plugin/api/urls.py (100%) rename netbox/{extras => netbox}/tests/dummy_plugin/api/views.py (78%) rename netbox/{extras => netbox}/tests/dummy_plugin/graphql.py (100%) rename netbox/{extras => netbox}/tests/dummy_plugin/middleware.py (100%) rename netbox/{extras => netbox}/tests/dummy_plugin/migrations/0001_initial.py (100%) rename netbox/{extras => netbox}/tests/dummy_plugin/migrations/__init__.py (100%) rename netbox/{extras => netbox}/tests/dummy_plugin/models.py (100%) rename netbox/{extras => netbox}/tests/dummy_plugin/navigation.py (90%) rename netbox/{extras => netbox}/tests/dummy_plugin/preferences.py (100%) rename netbox/{extras => netbox}/tests/dummy_plugin/search.py (100%) rename netbox/{extras => netbox}/tests/dummy_plugin/template_content.py (88%) rename netbox/{extras => netbox}/tests/dummy_plugin/urls.py (100%) rename netbox/{extras => netbox}/tests/dummy_plugin/views.py (100%) rename netbox/{extras => netbox}/tests/test_plugins.py (87%) rename netbox/{extras => utilities}/templatetags/plugins.py (98%) diff --git a/netbox/extras/plugins/__init__.py b/netbox/extras/plugins/__init__.py index f60462f3d..31ea1ce09 100644 --- a/netbox/extras/plugins/__init__.py +++ b/netbox/extras/plugins/__init__.py @@ -1,148 +1,9 @@ -import collections -from importlib import import_module - -from django.apps import AppConfig -from django.core.exceptions import ImproperlyConfigured -from django.utils.module_loading import import_string -from packaging import version - -from netbox.registry import registry -from netbox.search import register_search from .navigation import * from .registration import * from .templates import * from .utils import * - -# Initialize plugin registry -registry['plugins'].update({ - 'graphql_schemas': [], - 'menus': [], - 'menu_items': {}, - 'preferences': {}, - 'template_extensions': collections.defaultdict(list), -}) - -DEFAULT_RESOURCE_PATHS = { - 'search_indexes': 'search.indexes', - 'graphql_schema': 'graphql.schema', - 'menu': 'navigation.menu', - 'menu_items': 'navigation.menu_items', - 'template_extensions': 'template_content.template_extensions', - 'user_preferences': 'preferences.preferences', -} +from netbox.plugins import PluginConfig -# -# Plugin AppConfig class -# - -class PluginConfig(AppConfig): - """ - Subclass of Django's built-in AppConfig class, to be used for NetBox plugins. - """ - # Plugin metadata - author = '' - author_email = '' - description = '' - version = '' - - # Root URL path under /plugins. If not set, the plugin's label will be used. - base_url = None - - # Minimum/maximum compatible versions of NetBox - min_version = None - max_version = None - - # Default configuration parameters - default_settings = {} - - # Mandatory configuration parameters - required_settings = [] - - # Middleware classes provided by the plugin - middleware = [] - - # Django-rq queues dedicated to the plugin - queues = [] - - # Django apps to append to INSTALLED_APPS when plugin requires them. - django_apps = [] - - # Optional plugin resources - search_indexes = None - graphql_schema = None - menu = None - menu_items = None - template_extensions = None - user_preferences = None - - def _load_resource(self, name): - # Import from the configured path, if defined. - if path := getattr(self, name, None): - return import_string(f"{self.__module__}.{path}") - - # Fall back to the resource's default path. Return None if the module has not been provided. - default_path = f'{self.__module__}.{DEFAULT_RESOURCE_PATHS[name]}' - default_module, resource_name = default_path.rsplit('.', 1) - try: - module = import_module(default_module) - return getattr(module, resource_name, None) - except ModuleNotFoundError: - pass - - def ready(self): - plugin_name = self.name.rsplit('.', 1)[-1] - - # Register search extensions (if defined) - search_indexes = self._load_resource('search_indexes') or [] - for idx in search_indexes: - register_search(idx) - - # Register template content (if defined) - if template_extensions := self._load_resource('template_extensions'): - register_template_extensions(template_extensions) - - # Register navigation menu and/or menu items (if defined) - if menu := self._load_resource('menu'): - register_menu(menu) - if menu_items := self._load_resource('menu_items'): - register_menu_items(self.verbose_name, menu_items) - - # Register GraphQL schema (if defined) - if graphql_schema := self._load_resource('graphql_schema'): - register_graphql_schema(graphql_schema) - - # Register user preferences (if defined) - if user_preferences := self._load_resource('user_preferences'): - register_user_preferences(plugin_name, user_preferences) - - @classmethod - def validate(cls, user_config, netbox_version): - - # Enforce version constraints - current_version = version.parse(netbox_version) - if cls.min_version is not None: - min_version = version.parse(cls.min_version) - if current_version < min_version: - raise ImproperlyConfigured( - f"Plugin {cls.__module__} requires NetBox minimum version {cls.min_version}." - ) - if cls.max_version is not None: - max_version = version.parse(cls.max_version) - if current_version > max_version: - raise ImproperlyConfigured( - f"Plugin {cls.__module__} requires NetBox maximum version {cls.max_version}." - ) - - # Verify required configuration settings - for setting in cls.required_settings: - if setting not in user_config: - raise ImproperlyConfigured( - f"Plugin {cls.__module__} requires '{setting}' to be present in the PLUGINS_CONFIG section of " - f"configuration.py." - ) - - # Apply default configuration values - for setting, value in cls.default_settings.items(): - if setting not in user_config: - user_config[setting] = value +# TODO: Remove in v4.0 +warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning) diff --git a/netbox/extras/plugins/navigation.py b/netbox/extras/plugins/navigation.py index 2075c97b6..08d1baa54 100644 --- a/netbox/extras/plugins/navigation.py +++ b/netbox/extras/plugins/navigation.py @@ -1,72 +1,7 @@ -from netbox.navigation import MenuGroup -from utilities.choices import ButtonColorChoices -from django.utils.text import slugify +import warnings -__all__ = ( - 'PluginMenu', - 'PluginMenuButton', - 'PluginMenuItem', -) +from netbox.plugins.navigation import * -class PluginMenu: - icon_class = 'mdi mdi-puzzle' - - def __init__(self, label, groups, icon_class=None): - self.label = label - self.groups = [ - MenuGroup(label, items) for label, items in groups - ] - if icon_class is not None: - self.icon_class = icon_class - - @property - def name(self): - return slugify(self.label) - - -class PluginMenuItem: - """ - This class represents a navigation menu item. This constitutes primary link and its text, but also allows for - specifying additional link buttons that appear to the right of the item in the van menu. - - Links are specified as Django reverse URL strings. - Buttons are each specified as a list of PluginMenuButton instances. - """ - permissions = [] - buttons = [] - - def __init__(self, link, link_text, staff_only=False, permissions=None, buttons=None): - self.link = link - self.link_text = link_text - self.staff_only = staff_only - if permissions is not None: - if type(permissions) not in (list, tuple): - raise TypeError("Permissions must be passed as a tuple or list.") - self.permissions = permissions - if buttons is not None: - if type(buttons) not in (list, tuple): - raise TypeError("Buttons must be passed as a tuple or list.") - self.buttons = buttons - - -class PluginMenuButton: - """ - This class represents a button within a PluginMenuItem. Note that button colors should come from - ButtonColorChoices. - """ - color = ButtonColorChoices.DEFAULT - permissions = [] - - def __init__(self, link, title, icon_class, color=None, permissions=None): - self.link = link - self.title = title - self.icon_class = icon_class - if permissions is not None: - if type(permissions) not in (list, tuple): - raise TypeError("Permissions must be passed as a tuple or list.") - self.permissions = permissions - if color is not None: - if color not in ButtonColorChoices.values(): - raise ValueError("Button color must be a choice within ButtonColorChoices.") - self.color = color +# TODO: Remove in v4.0 +warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning) diff --git a/netbox/extras/plugins/registration.py b/netbox/extras/plugins/registration.py index 5b7e58172..8d2d85573 100644 --- a/netbox/extras/plugins/registration.py +++ b/netbox/extras/plugins/registration.py @@ -1,64 +1,7 @@ -import inspect +import warnings -from netbox.registry import registry -from .navigation import PluginMenu, PluginMenuButton, PluginMenuItem -from .templates import PluginTemplateExtension - -__all__ = ( - 'register_graphql_schema', - 'register_menu', - 'register_menu_items', - 'register_template_extensions', - 'register_user_preferences', -) +from netbox.plugins.registration import * -def register_template_extensions(class_list): - """ - Register a list of PluginTemplateExtension classes - """ - # Validation - for template_extension in class_list: - if not inspect.isclass(template_extension): - raise TypeError(f"PluginTemplateExtension class {template_extension} was passed as an instance!") - if not issubclass(template_extension, PluginTemplateExtension): - raise TypeError(f"{template_extension} is not a subclass of extras.plugins.PluginTemplateExtension!") - if template_extension.model is None: - raise TypeError(f"PluginTemplateExtension class {template_extension} does not define a valid model!") - - registry['plugins']['template_extensions'][template_extension.model].append(template_extension) - - -def register_menu(menu): - if not isinstance(menu, PluginMenu): - raise TypeError(f"{menu} must be an instance of extras.plugins.PluginMenu") - registry['plugins']['menus'].append(menu) - - -def register_menu_items(section_name, class_list): - """ - Register a list of PluginMenuItem instances for a given menu section (e.g. plugin name) - """ - # Validation - for menu_link in class_list: - if not isinstance(menu_link, PluginMenuItem): - raise TypeError(f"{menu_link} must be an instance of extras.plugins.PluginMenuItem") - for button in menu_link.buttons: - if not isinstance(button, PluginMenuButton): - raise TypeError(f"{button} must be an instance of extras.plugins.PluginMenuButton") - - registry['plugins']['menu_items'][section_name] = class_list - - -def register_graphql_schema(graphql_schema): - """ - Register a GraphQL schema class for inclusion in NetBox's GraphQL API. - """ - registry['plugins']['graphql_schemas'].append(graphql_schema) - - -def register_user_preferences(plugin_name, preferences): - """ - Register a list of user preferences defined by a plugin. - """ - registry['plugins']['preferences'][plugin_name] = preferences +# TODO: Remove in v4.0 +warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning) diff --git a/netbox/extras/plugins/templates.py b/netbox/extras/plugins/templates.py index e9b9a9dca..0e09f33d2 100644 --- a/netbox/extras/plugins/templates.py +++ b/netbox/extras/plugins/templates.py @@ -1,73 +1,7 @@ -from django.template.loader import get_template +import warnings -__all__ = ( - 'PluginTemplateExtension', -) +from netbox.plugins.templates import * -class PluginTemplateExtension: - """ - This class is used to register plugin content to be injected into core NetBox templates. It contains methods - that are overridden by plugin authors to return template content. - - The `model` attribute on the class defines the which model detail page this class renders content for. It - should be set as a string in the form '.'. render() provides the following context data: - - * object - The object being viewed - * request - The current request - * settings - Global NetBox settings - * config - Plugin-specific configuration parameters - """ - model = None - - def __init__(self, context): - self.context = context - - def render(self, template_name, extra_context=None): - """ - Convenience method for rendering the specified Django template using the default context data. An additional - context dictionary may be passed as `extra_context`. - """ - if extra_context is None: - extra_context = {} - elif not isinstance(extra_context, dict): - raise TypeError("extra_context must be a dictionary") - - return get_template(template_name).render({**self.context, **extra_context}) - - def left_page(self): - """ - Content that will be rendered on the left of the detail page view. Content should be returned as an - HTML string. Note that content does not need to be marked as safe because this is automatically handled. - """ - raise NotImplementedError - - def right_page(self): - """ - Content that will be rendered on the right of the detail page view. Content should be returned as an - HTML string. Note that content does not need to be marked as safe because this is automatically handled. - """ - raise NotImplementedError - - def full_width_page(self): - """ - Content that will be rendered within the full width of the detail page view. Content should be returned as an - HTML string. Note that content does not need to be marked as safe because this is automatically handled. - """ - raise NotImplementedError - - def buttons(self): - """ - Buttons that will be rendered and added to the existing list of buttons on the detail page view. Content - should be returned as an HTML string. Note that content does not need to be marked as safe because this is - automatically handled. - """ - raise NotImplementedError - - def list_buttons(self): - """ - Buttons that will be rendered and added to the existing list of buttons on the list view. Content - should be returned as an HTML string. Note that content does not need to be marked as safe because this is - automatically handled. - """ - raise NotImplementedError +# TODO: Remove in v4.0 +warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning) diff --git a/netbox/extras/plugins/urls.py b/netbox/extras/plugins/urls.py index 2f237f56a..8b24e8fd2 100644 --- a/netbox/extras/plugins/urls.py +++ b/netbox/extras/plugins/urls.py @@ -1,41 +1,7 @@ -from importlib import import_module +import warnings -from django.apps import apps -from django.conf import settings -from django.conf.urls import include -from django.contrib.admin.views.decorators import staff_member_required -from django.urls import path -from django.utils.module_loading import import_string, module_has_submodule +from netbox.plugins.urls import * -from . import views -# Initialize URL base, API, and admin URL patterns for plugins -plugin_patterns = [] -plugin_api_patterns = [ - path('', views.PluginsAPIRootView.as_view(), name='api-root'), - path('installed-plugins/', views.InstalledPluginsAPIView.as_view(), name='plugins-list') -] -plugin_admin_patterns = [ - path('installed-plugins/', staff_member_required(views.InstalledPluginsAdminView.as_view()), name='plugins_list') -] - -# Register base/API URL patterns for each plugin -for plugin_path in settings.PLUGINS: - plugin = import_module(plugin_path) - plugin_name = plugin_path.split('.')[-1] - app = apps.get_app_config(plugin_name) - base_url = getattr(app, 'base_url') or app.label - - # Check if the plugin specifies any base URLs - if module_has_submodule(plugin, 'urls'): - urlpatterns = import_string(f"{plugin_path}.urls.urlpatterns") - plugin_patterns.append( - path(f"{base_url}/", include((urlpatterns, app.label))) - ) - - # Check if the plugin specifies any API URLs - if module_has_submodule(plugin, 'api.urls'): - urlpatterns = import_string(f"{plugin_path}.api.urls.urlpatterns") - plugin_api_patterns.append( - path(f"{base_url}/", include((urlpatterns, f"{app.label}-api"))) - ) +# TODO: Remove in v4.0 +warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning) diff --git a/netbox/extras/plugins/utils.py b/netbox/extras/plugins/utils.py index c260f156d..15ae018d1 100644 --- a/netbox/extras/plugins/utils.py +++ b/netbox/extras/plugins/utils.py @@ -1,37 +1,7 @@ -from django.apps import apps -from django.conf import settings -from django.core.exceptions import ImproperlyConfigured +import warnings -__all__ = ( - 'get_installed_plugins', - 'get_plugin_config', -) +from netbox.plugins.utils import * -def get_installed_plugins(): - """ - Return a dictionary mapping the names of installed plugins to their versions. - """ - plugins = {} - for plugin_name in settings.PLUGINS: - plugin_name = plugin_name.rsplit('.', 1)[-1] - plugin_config = apps.get_app_config(plugin_name) - plugins[plugin_name] = getattr(plugin_config, 'version', None) - - return dict(sorted(plugins.items())) - - -def get_plugin_config(plugin_name, parameter, default=None): - """ - Return the value of the specified plugin configuration parameter. - - Args: - plugin_name: The name of the plugin - parameter: The name of the configuration parameter - default: The value to return if the parameter is not defined (default: None) - """ - try: - plugin_config = settings.PLUGINS_CONFIG[plugin_name] - return plugin_config.get(parameter, default) - except KeyError: - raise ImproperlyConfigured(f"Plugin {plugin_name} is not registered.") +# TODO: Remove in v4.0 +warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning) diff --git a/netbox/extras/plugins/views.py b/netbox/extras/plugins/views.py index 5971f78ef..505742e6b 100644 --- a/netbox/extras/plugins/views.py +++ b/netbox/extras/plugins/views.py @@ -1,89 +1,7 @@ -from collections import OrderedDict +import warnings -from django.apps import apps -from django.conf import settings -from django.shortcuts import render -from django.urls.exceptions import NoReverseMatch -from django.views.generic import View -from drf_spectacular.utils import extend_schema -from rest_framework import permissions -from rest_framework.response import Response -from rest_framework.reverse import reverse -from rest_framework.views import APIView +from netbox.plugins.views import * -class InstalledPluginsAdminView(View): - """ - Admin view for listing all installed plugins - """ - def get(self, request): - plugins = [apps.get_app_config(plugin) for plugin in settings.PLUGINS] - return render(request, 'extras/admin/plugins_list.html', { - 'plugins': plugins, - }) - - -@extend_schema(exclude=True) -class InstalledPluginsAPIView(APIView): - """ - API view for listing all installed plugins - """ - permission_classes = [permissions.IsAdminUser] - _ignore_model_permissions = True - schema = None - - def get_view_name(self): - return "Installed Plugins" - - @staticmethod - def _get_plugin_data(plugin_app_config): - return { - 'name': plugin_app_config.verbose_name, - 'package': plugin_app_config.name, - 'author': plugin_app_config.author, - 'author_email': plugin_app_config.author_email, - 'description': plugin_app_config.description, - 'version': plugin_app_config.version - } - - def get(self, request, format=None): - return Response([self._get_plugin_data(apps.get_app_config(plugin)) for plugin in settings.PLUGINS]) - - -@extend_schema(exclude=True) -class PluginsAPIRootView(APIView): - _ignore_model_permissions = True - schema = None - - def get_view_name(self): - return "Plugins" - - @staticmethod - def _get_plugin_entry(plugin, app_config, request, format): - # Check if the plugin specifies any API URLs - api_app_name = f'{app_config.name}-api' - try: - entry = (getattr(app_config, 'base_url', app_config.label), reverse( - f"plugins-api:{api_app_name}:api-root", - request=request, - format=format - )) - except NoReverseMatch: - # The plugin does not include an api-root url - entry = None - - return entry - - def get(self, request, format=None): - - entries = [] - for plugin in settings.PLUGINS: - app_config = apps.get_app_config(plugin) - entry = self._get_plugin_entry(plugin, app_config, request, format) - if entry is not None: - entries.append(entry) - - return Response(OrderedDict(( - ('installed-plugins', reverse('plugins-api:plugins-list', request=request, format=format)), - *entries - ))) +# TODO: Remove in v4.0 +warnings.warn(f"{__name__} is deprecated. Import from netbox.plugins instead.", DeprecationWarning) diff --git a/netbox/netbox/api/views.py b/netbox/netbox/api/views.py index 97f690762..4e71ca193 100644 --- a/netbox/netbox/api/views.py +++ b/netbox/netbox/api/views.py @@ -11,7 +11,7 @@ from rest_framework.reverse import reverse from rest_framework.views import APIView from rq.worker import Worker -from extras.plugins.utils import get_installed_plugins +from netbox.plugins.utils import get_installed_plugins from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired diff --git a/netbox/netbox/configuration_testing.py b/netbox/netbox/configuration_testing.py index 18a3c2afa..cec05cabb 100644 --- a/netbox/netbox/configuration_testing.py +++ b/netbox/netbox/configuration_testing.py @@ -15,7 +15,7 @@ DATABASE = { } PLUGINS = [ - 'extras.tests.dummy_plugin', + 'netbox.tests.dummy_plugin', ] REDIS = { diff --git a/netbox/netbox/plugins/__init__.py b/netbox/netbox/plugins/__init__.py new file mode 100644 index 000000000..f60462f3d --- /dev/null +++ b/netbox/netbox/plugins/__init__.py @@ -0,0 +1,148 @@ +import collections +from importlib import import_module + +from django.apps import AppConfig +from django.core.exceptions import ImproperlyConfigured +from django.utils.module_loading import import_string +from packaging import version + +from netbox.registry import registry +from netbox.search import register_search +from .navigation import * +from .registration import * +from .templates import * +from .utils import * + +# Initialize plugin registry +registry['plugins'].update({ + 'graphql_schemas': [], + 'menus': [], + 'menu_items': {}, + 'preferences': {}, + 'template_extensions': collections.defaultdict(list), +}) + +DEFAULT_RESOURCE_PATHS = { + 'search_indexes': 'search.indexes', + 'graphql_schema': 'graphql.schema', + 'menu': 'navigation.menu', + 'menu_items': 'navigation.menu_items', + 'template_extensions': 'template_content.template_extensions', + 'user_preferences': 'preferences.preferences', +} + + +# +# Plugin AppConfig class +# + +class PluginConfig(AppConfig): + """ + Subclass of Django's built-in AppConfig class, to be used for NetBox plugins. + """ + # Plugin metadata + author = '' + author_email = '' + description = '' + version = '' + + # Root URL path under /plugins. If not set, the plugin's label will be used. + base_url = None + + # Minimum/maximum compatible versions of NetBox + min_version = None + max_version = None + + # Default configuration parameters + default_settings = {} + + # Mandatory configuration parameters + required_settings = [] + + # Middleware classes provided by the plugin + middleware = [] + + # Django-rq queues dedicated to the plugin + queues = [] + + # Django apps to append to INSTALLED_APPS when plugin requires them. + django_apps = [] + + # Optional plugin resources + search_indexes = None + graphql_schema = None + menu = None + menu_items = None + template_extensions = None + user_preferences = None + + def _load_resource(self, name): + # Import from the configured path, if defined. + if path := getattr(self, name, None): + return import_string(f"{self.__module__}.{path}") + + # Fall back to the resource's default path. Return None if the module has not been provided. + default_path = f'{self.__module__}.{DEFAULT_RESOURCE_PATHS[name]}' + default_module, resource_name = default_path.rsplit('.', 1) + try: + module = import_module(default_module) + return getattr(module, resource_name, None) + except ModuleNotFoundError: + pass + + def ready(self): + plugin_name = self.name.rsplit('.', 1)[-1] + + # Register search extensions (if defined) + search_indexes = self._load_resource('search_indexes') or [] + for idx in search_indexes: + register_search(idx) + + # Register template content (if defined) + if template_extensions := self._load_resource('template_extensions'): + register_template_extensions(template_extensions) + + # Register navigation menu and/or menu items (if defined) + if menu := self._load_resource('menu'): + register_menu(menu) + if menu_items := self._load_resource('menu_items'): + register_menu_items(self.verbose_name, menu_items) + + # Register GraphQL schema (if defined) + if graphql_schema := self._load_resource('graphql_schema'): + register_graphql_schema(graphql_schema) + + # Register user preferences (if defined) + if user_preferences := self._load_resource('user_preferences'): + register_user_preferences(plugin_name, user_preferences) + + @classmethod + def validate(cls, user_config, netbox_version): + + # Enforce version constraints + current_version = version.parse(netbox_version) + if cls.min_version is not None: + min_version = version.parse(cls.min_version) + if current_version < min_version: + raise ImproperlyConfigured( + f"Plugin {cls.__module__} requires NetBox minimum version {cls.min_version}." + ) + if cls.max_version is not None: + max_version = version.parse(cls.max_version) + if current_version > max_version: + raise ImproperlyConfigured( + f"Plugin {cls.__module__} requires NetBox maximum version {cls.max_version}." + ) + + # Verify required configuration settings + for setting in cls.required_settings: + if setting not in user_config: + raise ImproperlyConfigured( + f"Plugin {cls.__module__} requires '{setting}' to be present in the PLUGINS_CONFIG section of " + f"configuration.py." + ) + + # Apply default configuration values + for setting, value in cls.default_settings.items(): + if setting not in user_config: + user_config[setting] = value diff --git a/netbox/netbox/plugins/navigation.py b/netbox/netbox/plugins/navigation.py new file mode 100644 index 000000000..2075c97b6 --- /dev/null +++ b/netbox/netbox/plugins/navigation.py @@ -0,0 +1,72 @@ +from netbox.navigation import MenuGroup +from utilities.choices import ButtonColorChoices +from django.utils.text import slugify + +__all__ = ( + 'PluginMenu', + 'PluginMenuButton', + 'PluginMenuItem', +) + + +class PluginMenu: + icon_class = 'mdi mdi-puzzle' + + def __init__(self, label, groups, icon_class=None): + self.label = label + self.groups = [ + MenuGroup(label, items) for label, items in groups + ] + if icon_class is not None: + self.icon_class = icon_class + + @property + def name(self): + return slugify(self.label) + + +class PluginMenuItem: + """ + This class represents a navigation menu item. This constitutes primary link and its text, but also allows for + specifying additional link buttons that appear to the right of the item in the van menu. + + Links are specified as Django reverse URL strings. + Buttons are each specified as a list of PluginMenuButton instances. + """ + permissions = [] + buttons = [] + + def __init__(self, link, link_text, staff_only=False, permissions=None, buttons=None): + self.link = link + self.link_text = link_text + self.staff_only = staff_only + if permissions is not None: + if type(permissions) not in (list, tuple): + raise TypeError("Permissions must be passed as a tuple or list.") + self.permissions = permissions + if buttons is not None: + if type(buttons) not in (list, tuple): + raise TypeError("Buttons must be passed as a tuple or list.") + self.buttons = buttons + + +class PluginMenuButton: + """ + This class represents a button within a PluginMenuItem. Note that button colors should come from + ButtonColorChoices. + """ + color = ButtonColorChoices.DEFAULT + permissions = [] + + def __init__(self, link, title, icon_class, color=None, permissions=None): + self.link = link + self.title = title + self.icon_class = icon_class + if permissions is not None: + if type(permissions) not in (list, tuple): + raise TypeError("Permissions must be passed as a tuple or list.") + self.permissions = permissions + if color is not None: + if color not in ButtonColorChoices.values(): + raise ValueError("Button color must be a choice within ButtonColorChoices.") + self.color = color diff --git a/netbox/netbox/plugins/registration.py b/netbox/netbox/plugins/registration.py new file mode 100644 index 000000000..3be538441 --- /dev/null +++ b/netbox/netbox/plugins/registration.py @@ -0,0 +1,64 @@ +import inspect + +from netbox.registry import registry +from .navigation import PluginMenu, PluginMenuButton, PluginMenuItem +from .templates import PluginTemplateExtension + +__all__ = ( + 'register_graphql_schema', + 'register_menu', + 'register_menu_items', + 'register_template_extensions', + 'register_user_preferences', +) + + +def register_template_extensions(class_list): + """ + Register a list of PluginTemplateExtension classes + """ + # Validation + for template_extension in class_list: + if not inspect.isclass(template_extension): + raise TypeError(f"PluginTemplateExtension class {template_extension} was passed as an instance!") + if not issubclass(template_extension, PluginTemplateExtension): + raise TypeError(f"{template_extension} is not a subclass of netbox.plugins.PluginTemplateExtension!") + if template_extension.model is None: + raise TypeError(f"PluginTemplateExtension class {template_extension} does not define a valid model!") + + registry['plugins']['template_extensions'][template_extension.model].append(template_extension) + + +def register_menu(menu): + if not isinstance(menu, PluginMenu): + raise TypeError(f"{menu} must be an instance of netbox.plugins.PluginMenu") + registry['plugins']['menus'].append(menu) + + +def register_menu_items(section_name, class_list): + """ + Register a list of PluginMenuItem instances for a given menu section (e.g. plugin name) + """ + # Validation + for menu_link in class_list: + if not isinstance(menu_link, PluginMenuItem): + raise TypeError(f"{menu_link} must be an instance of netbox.plugins.PluginMenuItem") + for button in menu_link.buttons: + if not isinstance(button, PluginMenuButton): + raise TypeError(f"{button} must be an instance of netbox.plugins.PluginMenuButton") + + registry['plugins']['menu_items'][section_name] = class_list + + +def register_graphql_schema(graphql_schema): + """ + Register a GraphQL schema class for inclusion in NetBox's GraphQL API. + """ + registry['plugins']['graphql_schemas'].append(graphql_schema) + + +def register_user_preferences(plugin_name, preferences): + """ + Register a list of user preferences defined by a plugin. + """ + registry['plugins']['preferences'][plugin_name] = preferences diff --git a/netbox/netbox/plugins/templates.py b/netbox/netbox/plugins/templates.py new file mode 100644 index 000000000..e9b9a9dca --- /dev/null +++ b/netbox/netbox/plugins/templates.py @@ -0,0 +1,73 @@ +from django.template.loader import get_template + +__all__ = ( + 'PluginTemplateExtension', +) + + +class PluginTemplateExtension: + """ + This class is used to register plugin content to be injected into core NetBox templates. It contains methods + that are overridden by plugin authors to return template content. + + The `model` attribute on the class defines the which model detail page this class renders content for. It + should be set as a string in the form '.'. render() provides the following context data: + + * object - The object being viewed + * request - The current request + * settings - Global NetBox settings + * config - Plugin-specific configuration parameters + """ + model = None + + def __init__(self, context): + self.context = context + + def render(self, template_name, extra_context=None): + """ + Convenience method for rendering the specified Django template using the default context data. An additional + context dictionary may be passed as `extra_context`. + """ + if extra_context is None: + extra_context = {} + elif not isinstance(extra_context, dict): + raise TypeError("extra_context must be a dictionary") + + return get_template(template_name).render({**self.context, **extra_context}) + + def left_page(self): + """ + Content that will be rendered on the left of the detail page view. Content should be returned as an + HTML string. Note that content does not need to be marked as safe because this is automatically handled. + """ + raise NotImplementedError + + def right_page(self): + """ + Content that will be rendered on the right of the detail page view. Content should be returned as an + HTML string. Note that content does not need to be marked as safe because this is automatically handled. + """ + raise NotImplementedError + + def full_width_page(self): + """ + Content that will be rendered within the full width of the detail page view. Content should be returned as an + HTML string. Note that content does not need to be marked as safe because this is automatically handled. + """ + raise NotImplementedError + + def buttons(self): + """ + Buttons that will be rendered and added to the existing list of buttons on the detail page view. Content + should be returned as an HTML string. Note that content does not need to be marked as safe because this is + automatically handled. + """ + raise NotImplementedError + + def list_buttons(self): + """ + Buttons that will be rendered and added to the existing list of buttons on the list view. Content + should be returned as an HTML string. Note that content does not need to be marked as safe because this is + automatically handled. + """ + raise NotImplementedError diff --git a/netbox/netbox/plugins/urls.py b/netbox/netbox/plugins/urls.py new file mode 100644 index 000000000..2f237f56a --- /dev/null +++ b/netbox/netbox/plugins/urls.py @@ -0,0 +1,41 @@ +from importlib import import_module + +from django.apps import apps +from django.conf import settings +from django.conf.urls import include +from django.contrib.admin.views.decorators import staff_member_required +from django.urls import path +from django.utils.module_loading import import_string, module_has_submodule + +from . import views + +# Initialize URL base, API, and admin URL patterns for plugins +plugin_patterns = [] +plugin_api_patterns = [ + path('', views.PluginsAPIRootView.as_view(), name='api-root'), + path('installed-plugins/', views.InstalledPluginsAPIView.as_view(), name='plugins-list') +] +plugin_admin_patterns = [ + path('installed-plugins/', staff_member_required(views.InstalledPluginsAdminView.as_view()), name='plugins_list') +] + +# Register base/API URL patterns for each plugin +for plugin_path in settings.PLUGINS: + plugin = import_module(plugin_path) + plugin_name = plugin_path.split('.')[-1] + app = apps.get_app_config(plugin_name) + base_url = getattr(app, 'base_url') or app.label + + # Check if the plugin specifies any base URLs + if module_has_submodule(plugin, 'urls'): + urlpatterns = import_string(f"{plugin_path}.urls.urlpatterns") + plugin_patterns.append( + path(f"{base_url}/", include((urlpatterns, app.label))) + ) + + # Check if the plugin specifies any API URLs + if module_has_submodule(plugin, 'api.urls'): + urlpatterns = import_string(f"{plugin_path}.api.urls.urlpatterns") + plugin_api_patterns.append( + path(f"{base_url}/", include((urlpatterns, f"{app.label}-api"))) + ) diff --git a/netbox/netbox/plugins/utils.py b/netbox/netbox/plugins/utils.py new file mode 100644 index 000000000..c260f156d --- /dev/null +++ b/netbox/netbox/plugins/utils.py @@ -0,0 +1,37 @@ +from django.apps import apps +from django.conf import settings +from django.core.exceptions import ImproperlyConfigured + +__all__ = ( + 'get_installed_plugins', + 'get_plugin_config', +) + + +def get_installed_plugins(): + """ + Return a dictionary mapping the names of installed plugins to their versions. + """ + plugins = {} + for plugin_name in settings.PLUGINS: + plugin_name = plugin_name.rsplit('.', 1)[-1] + plugin_config = apps.get_app_config(plugin_name) + plugins[plugin_name] = getattr(plugin_config, 'version', None) + + return dict(sorted(plugins.items())) + + +def get_plugin_config(plugin_name, parameter, default=None): + """ + Return the value of the specified plugin configuration parameter. + + Args: + plugin_name: The name of the plugin + parameter: The name of the configuration parameter + default: The value to return if the parameter is not defined (default: None) + """ + try: + plugin_config = settings.PLUGINS_CONFIG[plugin_name] + return plugin_config.get(parameter, default) + except KeyError: + raise ImproperlyConfigured(f"Plugin {plugin_name} is not registered.") diff --git a/netbox/netbox/plugins/views.py b/netbox/netbox/plugins/views.py new file mode 100644 index 000000000..5971f78ef --- /dev/null +++ b/netbox/netbox/plugins/views.py @@ -0,0 +1,89 @@ +from collections import OrderedDict + +from django.apps import apps +from django.conf import settings +from django.shortcuts import render +from django.urls.exceptions import NoReverseMatch +from django.views.generic import View +from drf_spectacular.utils import extend_schema +from rest_framework import permissions +from rest_framework.response import Response +from rest_framework.reverse import reverse +from rest_framework.views import APIView + + +class InstalledPluginsAdminView(View): + """ + Admin view for listing all installed plugins + """ + def get(self, request): + plugins = [apps.get_app_config(plugin) for plugin in settings.PLUGINS] + return render(request, 'extras/admin/plugins_list.html', { + 'plugins': plugins, + }) + + +@extend_schema(exclude=True) +class InstalledPluginsAPIView(APIView): + """ + API view for listing all installed plugins + """ + permission_classes = [permissions.IsAdminUser] + _ignore_model_permissions = True + schema = None + + def get_view_name(self): + return "Installed Plugins" + + @staticmethod + def _get_plugin_data(plugin_app_config): + return { + 'name': plugin_app_config.verbose_name, + 'package': plugin_app_config.name, + 'author': plugin_app_config.author, + 'author_email': plugin_app_config.author_email, + 'description': plugin_app_config.description, + 'version': plugin_app_config.version + } + + def get(self, request, format=None): + return Response([self._get_plugin_data(apps.get_app_config(plugin)) for plugin in settings.PLUGINS]) + + +@extend_schema(exclude=True) +class PluginsAPIRootView(APIView): + _ignore_model_permissions = True + schema = None + + def get_view_name(self): + return "Plugins" + + @staticmethod + def _get_plugin_entry(plugin, app_config, request, format): + # Check if the plugin specifies any API URLs + api_app_name = f'{app_config.name}-api' + try: + entry = (getattr(app_config, 'base_url', app_config.label), reverse( + f"plugins-api:{api_app_name}:api-root", + request=request, + format=format + )) + except NoReverseMatch: + # The plugin does not include an api-root url + entry = None + + return entry + + def get(self, request, format=None): + + entries = [] + for plugin in settings.PLUGINS: + app_config = apps.get_app_config(plugin) + entry = self._get_plugin_entry(plugin, app_config, request, format) + if entry is not None: + entries.append(entry) + + return Response(OrderedDict(( + ('installed-plugins', reverse('plugins-api:plugins-list', request=request, format=format)), + *entries + ))) diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 111781b8a..4c8b3f960 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -14,11 +14,11 @@ from django.contrib.messages import constants as messages from django.core.exceptions import ImproperlyConfigured, ValidationError from django.core.validators import URLValidator from django.utils.encoding import force_str -from extras.plugins import PluginConfig from sentry_sdk.integrations.django import DjangoIntegration from netbox.config import PARAMS from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW +from netbox.plugins import PluginConfig # diff --git a/netbox/extras/tests/dummy_plugin/__init__.py b/netbox/netbox/tests/dummy_plugin/__init__.py similarity index 72% rename from netbox/extras/tests/dummy_plugin/__init__.py rename to netbox/netbox/tests/dummy_plugin/__init__.py index 83baf064f..3ade8f9df 100644 --- a/netbox/extras/tests/dummy_plugin/__init__.py +++ b/netbox/netbox/tests/dummy_plugin/__init__.py @@ -1,8 +1,8 @@ -from extras.plugins import PluginConfig +from netbox.plugins import PluginConfig class DummyPluginConfig(PluginConfig): - name = 'extras.tests.dummy_plugin' + name = 'netbox.tests.dummy_plugin' verbose_name = 'Dummy plugin' version = '0.0' description = 'For testing purposes only' @@ -10,7 +10,7 @@ class DummyPluginConfig(PluginConfig): min_version = '1.0' max_version = '9.0' middleware = [ - 'extras.tests.dummy_plugin.middleware.DummyMiddleware' + 'netbox.tests.dummy_plugin.middleware.DummyMiddleware' ] queues = [ 'testing-low', diff --git a/netbox/extras/tests/dummy_plugin/admin.py b/netbox/netbox/tests/dummy_plugin/admin.py similarity index 100% rename from netbox/extras/tests/dummy_plugin/admin.py rename to netbox/netbox/tests/dummy_plugin/admin.py diff --git a/netbox/extras/tests/dummy_plugin/api/serializers.py b/netbox/netbox/tests/dummy_plugin/api/serializers.py similarity index 76% rename from netbox/extras/tests/dummy_plugin/api/serializers.py rename to netbox/netbox/tests/dummy_plugin/api/serializers.py index 101786168..239d7d998 100644 --- a/netbox/extras/tests/dummy_plugin/api/serializers.py +++ b/netbox/netbox/tests/dummy_plugin/api/serializers.py @@ -1,5 +1,5 @@ from rest_framework.serializers import ModelSerializer -from extras.tests.dummy_plugin.models import DummyModel +from netbox.tests.dummy_plugin.models import DummyModel class DummySerializer(ModelSerializer): diff --git a/netbox/extras/tests/dummy_plugin/api/urls.py b/netbox/netbox/tests/dummy_plugin/api/urls.py similarity index 100% rename from netbox/extras/tests/dummy_plugin/api/urls.py rename to netbox/netbox/tests/dummy_plugin/api/urls.py diff --git a/netbox/extras/tests/dummy_plugin/api/views.py b/netbox/netbox/tests/dummy_plugin/api/views.py similarity index 78% rename from netbox/extras/tests/dummy_plugin/api/views.py rename to netbox/netbox/tests/dummy_plugin/api/views.py index 1977ec2af..58f221285 100644 --- a/netbox/extras/tests/dummy_plugin/api/views.py +++ b/netbox/netbox/tests/dummy_plugin/api/views.py @@ -1,5 +1,5 @@ from rest_framework.viewsets import ModelViewSet -from extras.tests.dummy_plugin.models import DummyModel +from netbox.tests.dummy_plugin.models import DummyModel from .serializers import DummySerializer diff --git a/netbox/extras/tests/dummy_plugin/graphql.py b/netbox/netbox/tests/dummy_plugin/graphql.py similarity index 100% rename from netbox/extras/tests/dummy_plugin/graphql.py rename to netbox/netbox/tests/dummy_plugin/graphql.py diff --git a/netbox/extras/tests/dummy_plugin/middleware.py b/netbox/netbox/tests/dummy_plugin/middleware.py similarity index 100% rename from netbox/extras/tests/dummy_plugin/middleware.py rename to netbox/netbox/tests/dummy_plugin/middleware.py diff --git a/netbox/extras/tests/dummy_plugin/migrations/0001_initial.py b/netbox/netbox/tests/dummy_plugin/migrations/0001_initial.py similarity index 100% rename from netbox/extras/tests/dummy_plugin/migrations/0001_initial.py rename to netbox/netbox/tests/dummy_plugin/migrations/0001_initial.py diff --git a/netbox/extras/tests/dummy_plugin/migrations/__init__.py b/netbox/netbox/tests/dummy_plugin/migrations/__init__.py similarity index 100% rename from netbox/extras/tests/dummy_plugin/migrations/__init__.py rename to netbox/netbox/tests/dummy_plugin/migrations/__init__.py diff --git a/netbox/extras/tests/dummy_plugin/models.py b/netbox/netbox/tests/dummy_plugin/models.py similarity index 100% rename from netbox/extras/tests/dummy_plugin/models.py rename to netbox/netbox/tests/dummy_plugin/models.py diff --git a/netbox/extras/tests/dummy_plugin/navigation.py b/netbox/netbox/tests/dummy_plugin/navigation.py similarity index 90% rename from netbox/extras/tests/dummy_plugin/navigation.py rename to netbox/netbox/tests/dummy_plugin/navigation.py index a9157b368..4e7bb4be8 100644 --- a/netbox/extras/tests/dummy_plugin/navigation.py +++ b/netbox/netbox/tests/dummy_plugin/navigation.py @@ -1,5 +1,5 @@ from django.utils.translation import gettext as _ -from extras.plugins import PluginMenu, PluginMenuButton, PluginMenuItem +from netbox.plugins.navigation import PluginMenu, PluginMenuButton, PluginMenuItem items = ( diff --git a/netbox/extras/tests/dummy_plugin/preferences.py b/netbox/netbox/tests/dummy_plugin/preferences.py similarity index 100% rename from netbox/extras/tests/dummy_plugin/preferences.py rename to netbox/netbox/tests/dummy_plugin/preferences.py diff --git a/netbox/extras/tests/dummy_plugin/search.py b/netbox/netbox/tests/dummy_plugin/search.py similarity index 100% rename from netbox/extras/tests/dummy_plugin/search.py rename to netbox/netbox/tests/dummy_plugin/search.py diff --git a/netbox/extras/tests/dummy_plugin/template_content.py b/netbox/netbox/tests/dummy_plugin/template_content.py similarity index 88% rename from netbox/extras/tests/dummy_plugin/template_content.py rename to netbox/netbox/tests/dummy_plugin/template_content.py index 364768a22..b63338f2f 100644 --- a/netbox/extras/tests/dummy_plugin/template_content.py +++ b/netbox/netbox/tests/dummy_plugin/template_content.py @@ -1,4 +1,4 @@ -from extras.plugins import PluginTemplateExtension +from netbox.plugins.templates import PluginTemplateExtension class SiteContent(PluginTemplateExtension): diff --git a/netbox/extras/tests/dummy_plugin/urls.py b/netbox/netbox/tests/dummy_plugin/urls.py similarity index 100% rename from netbox/extras/tests/dummy_plugin/urls.py rename to netbox/netbox/tests/dummy_plugin/urls.py diff --git a/netbox/extras/tests/dummy_plugin/views.py b/netbox/netbox/tests/dummy_plugin/views.py similarity index 100% rename from netbox/extras/tests/dummy_plugin/views.py rename to netbox/netbox/tests/dummy_plugin/views.py diff --git a/netbox/extras/tests/test_plugins.py b/netbox/netbox/tests/test_plugins.py similarity index 87% rename from netbox/extras/tests/test_plugins.py rename to netbox/netbox/tests/test_plugins.py index 42dde43fd..f5f97013e 100644 --- a/netbox/extras/tests/test_plugins.py +++ b/netbox/netbox/tests/test_plugins.py @@ -5,22 +5,22 @@ from django.core.exceptions import ImproperlyConfigured from django.test import Client, TestCase, override_settings from django.urls import reverse -from extras.plugins import PluginMenu -from extras.tests.dummy_plugin import config as dummy_config -from extras.plugins.utils import get_plugin_config +from netbox.tests.dummy_plugin import config as dummy_config +from netbox.plugins.navigation import PluginMenu +from netbox.plugins.utils import get_plugin_config from netbox.graphql.schema import Query from netbox.registry import registry -@skipIf('extras.tests.dummy_plugin' not in settings.PLUGINS, "dummy_plugin not in settings.PLUGINS") +@skipIf('netbox.tests.dummy_plugin' not in settings.PLUGINS, "dummy_plugin not in settings.PLUGINS") class PluginTest(TestCase): def test_config(self): - self.assertIn('extras.tests.dummy_plugin.DummyPluginConfig', settings.INSTALLED_APPS) + self.assertIn('netbox.tests.dummy_plugin.DummyPluginConfig', settings.INSTALLED_APPS) def test_models(self): - from extras.tests.dummy_plugin.models import DummyModel + from netbox.tests.dummy_plugin.models import DummyModel # Test saving an instance instance = DummyModel(name='Instance 1', number=100) @@ -92,7 +92,7 @@ class PluginTest(TestCase): """ Check that plugin TemplateExtensions are registered. """ - from extras.tests.dummy_plugin.template_content import SiteContent + from netbox.tests.dummy_plugin.template_content import SiteContent self.assertIn(SiteContent, registry['plugins']['template_extensions']['dcim.site']) @@ -109,15 +109,15 @@ class PluginTest(TestCase): """ Check that plugin middleware is registered. """ - self.assertIn('extras.tests.dummy_plugin.middleware.DummyMiddleware', settings.MIDDLEWARE) + self.assertIn('netbox.tests.dummy_plugin.middleware.DummyMiddleware', settings.MIDDLEWARE) def test_queues(self): """ Check that plugin queues are registered with the accurate name. """ - self.assertIn('extras.tests.dummy_plugin.testing-low', settings.RQ_QUEUES) - self.assertIn('extras.tests.dummy_plugin.testing-medium', settings.RQ_QUEUES) - self.assertIn('extras.tests.dummy_plugin.testing-high', settings.RQ_QUEUES) + self.assertIn('netbox.tests.dummy_plugin.testing-low', settings.RQ_QUEUES) + self.assertIn('netbox.tests.dummy_plugin.testing-medium', settings.RQ_QUEUES) + self.assertIn('netbox.tests.dummy_plugin.testing-high', settings.RQ_QUEUES) def test_min_version(self): """ @@ -170,17 +170,17 @@ class PluginTest(TestCase): """ Validate the registration and operation of plugin-provided GraphQL schemas. """ - from extras.tests.dummy_plugin.graphql import DummyQuery + from netbox.tests.dummy_plugin.graphql import DummyQuery self.assertIn(DummyQuery, registry['plugins']['graphql_schemas']) self.assertTrue(issubclass(Query, DummyQuery)) - @override_settings(PLUGINS_CONFIG={'extras.tests.dummy_plugin': {'foo': 123}}) + @override_settings(PLUGINS_CONFIG={'netbox.tests.dummy_plugin': {'foo': 123}}) def test_get_plugin_config(self): """ Validate that get_plugin_config() returns config parameters correctly. """ - plugin = 'extras.tests.dummy_plugin' + plugin = 'netbox.tests.dummy_plugin' self.assertEqual(get_plugin_config(plugin, 'foo'), 123) self.assertEqual(get_plugin_config(plugin, 'bar'), None) self.assertEqual(get_plugin_config(plugin, 'bar', default=456), 456) diff --git a/netbox/netbox/urls.py b/netbox/netbox/urls.py index 595a9001f..6955426a8 100644 --- a/netbox/netbox/urls.py +++ b/netbox/netbox/urls.py @@ -6,10 +6,10 @@ from django.views.static import serve from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView from account.views import LoginView, LogoutView -from extras.plugins.urls import plugin_admin_patterns, plugin_patterns, plugin_api_patterns from netbox.api.views import APIRootView, StatusView from netbox.graphql.schema import schema from netbox.graphql.views import GraphQLView +from netbox.plugins.urls import plugin_admin_patterns, plugin_patterns, plugin_api_patterns from netbox.views import HomeView, StaticMediaFailureView, SearchView, htmx from .admin import admin_site diff --git a/netbox/netbox/views/errors.py b/netbox/netbox/views/errors.py index a81d45cb5..d1a8ccd36 100644 --- a/netbox/netbox/views/errors.py +++ b/netbox/netbox/views/errors.py @@ -11,7 +11,7 @@ from django.views.defaults import ERROR_500_TEMPLATE_NAME, page_not_found from django.views.generic import View from sentry_sdk import capture_message -from extras.plugins.utils import get_installed_plugins +from netbox.plugins.utils import get_installed_plugins __all__ = ( 'handler_404', diff --git a/netbox/extras/templatetags/plugins.py b/netbox/utilities/templatetags/plugins.py similarity index 98% rename from netbox/extras/templatetags/plugins.py rename to netbox/utilities/templatetags/plugins.py index 560d15e01..c429bed5f 100644 --- a/netbox/extras/templatetags/plugins.py +++ b/netbox/utilities/templatetags/plugins.py @@ -2,7 +2,7 @@ from django import template as template_ from django.conf import settings from django.utils.safestring import mark_safe -from extras.plugins import PluginTemplateExtension +from netbox.plugins import PluginTemplateExtension from netbox.registry import registry register = template_.Library() diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index 9524e242c..feb28c2d8 100644 --- a/netbox/utilities/utils.py +++ b/netbox/utilities/utils.py @@ -19,9 +19,9 @@ from jinja2.sandbox import SandboxedEnvironment from mptt.models import MPTTModel from dcim.choices import CableLengthUnitChoices, WeightUnitChoices -from extras.plugins import PluginConfig from extras.utils import is_taggable from netbox.config import get_config +from netbox.plugins import PluginConfig from urllib.parse import urlencode from utilities.constants import HTTP_REQUEST_META_SAFE_COPY From 450790ab4a84d5813bcc88a41a359a64fcfbcfb8 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 20 Oct 2023 15:08:09 -0400 Subject: [PATCH 055/271] Closes #13550: Refactor view action mappings (#14062) * Merge actions and action_perms into a single mapping * Update obsolete permission maps * Update obsolete action lists * Normalize empty permission mappings * Cleanup * Add deprecation warnings * Introduce DEFAULT_ACTION_PERMISSIONS constant --- netbox/core/views.py | 9 +- netbox/dcim/views.py | 145 +++++++++++--------------- netbox/extras/views.py | 33 ++++-- netbox/netbox/constants.py | 9 ++ netbox/netbox/views/generic/mixins.py | 61 ++++++++--- netbox/tenancy/views.py | 6 +- netbox/virtualization/views.py | 19 ++-- 7 files changed, 165 insertions(+), 117 deletions(-) diff --git a/netbox/core/views.py b/netbox/core/views.py index e3c1a67aa..d16fa4ece 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -100,7 +100,9 @@ class DataFileListView(generic.ObjectListView): filterset = filtersets.DataFileFilterSet filterset_form = forms.DataFileFilterForm table = tables.DataFileTable - actions = ('bulk_delete',) + actions = { + 'bulk_delete': {'delete'}, + } @register_model_view(DataFile) @@ -128,7 +130,10 @@ class JobListView(generic.ObjectListView): filterset = filtersets.JobFilterSet filterset_form = forms.JobFilterForm table = tables.JobTable - actions = ('export', 'delete', 'bulk_delete') + actions = { + 'export': {'view'}, + 'bulk_delete': {'delete'}, + } class JobView(generic.ObjectView): diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 7c75dd26e..0f5768173 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -20,6 +20,7 @@ from circuits.models import Circuit, CircuitTermination from extras.views import ObjectConfigContextView from ipam.models import ASN, IPAddress, Prefix, VLAN, VLANGroup from ipam.tables import InterfaceVLANTable +from netbox.constants import DEFAULT_ACTION_PERMISSIONS from netbox.views import generic from tenancy.views import ObjectContactsView from utilities.forms import ConfirmationForm @@ -46,15 +47,11 @@ CABLE_TERMINATION_TYPES = { class DeviceComponentsView(generic.ObjectChildrenView): - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename', 'bulk_disconnect') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, + actions = { + **DEFAULT_ACTION_PERMISSIONS, 'bulk_rename': {'change'}, 'bulk_disconnect': {'change'}, - }) + } queryset = Device.objects.all() def get_children(self, request, parent): @@ -1977,7 +1974,10 @@ class DeviceModuleBaysView(DeviceComponentsView): table = tables.DeviceModuleBayTable filterset = filtersets.ModuleBayFilterSet template_name = 'dcim/device/modulebays.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') + actions = { + **DEFAULT_ACTION_PERMISSIONS, + 'bulk_rename': {'change'}, + } tab = ViewTab( label=_('Module Bays'), badge=lambda obj: obj.module_bay_count, @@ -1993,7 +1993,10 @@ class DeviceDeviceBaysView(DeviceComponentsView): table = tables.DeviceDeviceBayTable filterset = filtersets.DeviceBayFilterSet template_name = 'dcim/device/devicebays.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') + actions = { + **DEFAULT_ACTION_PERMISSIONS, + 'bulk_rename': {'change'}, + } tab = ViewTab( label=_('Device Bays'), badge=lambda obj: obj.device_bay_count, @@ -2005,11 +2008,14 @@ class DeviceDeviceBaysView(DeviceComponentsView): @register_model_view(Device, 'inventory') class DeviceInventoryView(DeviceComponentsView): - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') child_model = InventoryItem table = tables.DeviceInventoryItemTable filterset = filtersets.InventoryItemFilterSet template_name = 'dcim/device/inventory.html' + actions = { + **DEFAULT_ACTION_PERMISSIONS, + 'bulk_rename': {'change'}, + } tab = ViewTab( label=_('Inventory Items'), badge=lambda obj: obj.inventory_item_count, @@ -2187,14 +2193,10 @@ class ConsolePortListView(generic.ObjectListView): filterset_form = forms.ConsolePortFilterForm table = tables.ConsolePortTable template_name = 'dcim/component_list.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, + actions = { + **DEFAULT_ACTION_PERMISSIONS, 'bulk_rename': {'change'}, - }) + } @register_model_view(ConsolePort) @@ -2259,14 +2261,10 @@ class ConsoleServerPortListView(generic.ObjectListView): filterset_form = forms.ConsoleServerPortFilterForm table = tables.ConsoleServerPortTable template_name = 'dcim/component_list.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, + actions = { + **DEFAULT_ACTION_PERMISSIONS, 'bulk_rename': {'change'}, - }) + } @register_model_view(ConsoleServerPort) @@ -2331,14 +2329,10 @@ class PowerPortListView(generic.ObjectListView): filterset_form = forms.PowerPortFilterForm table = tables.PowerPortTable template_name = 'dcim/component_list.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, + actions = { + **DEFAULT_ACTION_PERMISSIONS, 'bulk_rename': {'change'}, - }) + } @register_model_view(PowerPort) @@ -2403,14 +2397,10 @@ class PowerOutletListView(generic.ObjectListView): filterset_form = forms.PowerOutletFilterForm table = tables.PowerOutletTable template_name = 'dcim/component_list.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, + actions = { + **DEFAULT_ACTION_PERMISSIONS, 'bulk_rename': {'change'}, - }) + } @register_model_view(PowerOutlet) @@ -2475,14 +2465,10 @@ class InterfaceListView(generic.ObjectListView): filterset_form = forms.InterfaceFilterForm table = tables.InterfaceTable template_name = 'dcim/component_list.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, + actions = { + **DEFAULT_ACTION_PERMISSIONS, 'bulk_rename': {'change'}, - }) + } @register_model_view(Interface) @@ -2595,14 +2581,10 @@ class FrontPortListView(generic.ObjectListView): filterset_form = forms.FrontPortFilterForm table = tables.FrontPortTable template_name = 'dcim/component_list.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, + actions = { + **DEFAULT_ACTION_PERMISSIONS, 'bulk_rename': {'change'}, - }) + } @register_model_view(FrontPort) @@ -2667,14 +2649,10 @@ class RearPortListView(generic.ObjectListView): filterset_form = forms.RearPortFilterForm table = tables.RearPortTable template_name = 'dcim/component_list.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, + actions = { + **DEFAULT_ACTION_PERMISSIONS, 'bulk_rename': {'change'}, - }) + } @register_model_view(RearPort) @@ -2739,14 +2717,10 @@ class ModuleBayListView(generic.ObjectListView): filterset_form = forms.ModuleBayFilterForm table = tables.ModuleBayTable template_name = 'dcim/component_list.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, + actions = { + **DEFAULT_ACTION_PERMISSIONS, 'bulk_rename': {'change'}, - }) + } @register_model_view(ModuleBay) @@ -2803,14 +2777,10 @@ class DeviceBayListView(generic.ObjectListView): filterset_form = forms.DeviceBayFilterForm table = tables.DeviceBayTable template_name = 'dcim/component_list.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, + actions = { + **DEFAULT_ACTION_PERMISSIONS, 'bulk_rename': {'change'}, - }) + } @register_model_view(DeviceBay) @@ -2936,14 +2906,10 @@ class InventoryItemListView(generic.ObjectListView): filterset_form = forms.InventoryItemFilterForm table = tables.InventoryItemTable template_name = 'dcim/component_list.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, + actions = { + **DEFAULT_ACTION_PERMISSIONS, 'bulk_rename': {'change'}, - }) + } @register_model_view(InventoryItem) @@ -3175,7 +3141,12 @@ class CableListView(generic.ObjectListView): filterset = filtersets.CableFilterSet filterset_form = forms.CableFilterForm table = tables.CableTable - actions = ('import', 'export', 'bulk_edit', 'bulk_delete') + actions = { + 'import': {'add'}, + 'export': {'view'}, + 'bulk_edit': {'change'}, + 'bulk_delete': {'delete'}, + } @register_model_view(Cable) @@ -3269,7 +3240,9 @@ class ConsoleConnectionsListView(generic.ObjectListView): filterset_form = forms.ConsoleConnectionFilterForm table = tables.ConsoleConnectionTable template_name = 'dcim/connections_list.html' - actions = ('export',) + actions = { + 'export': {'view'}, + } def get_extra_context(self, request): return { @@ -3283,7 +3256,9 @@ class PowerConnectionsListView(generic.ObjectListView): filterset_form = forms.PowerConnectionFilterForm table = tables.PowerConnectionTable template_name = 'dcim/connections_list.html' - actions = ('export',) + actions = { + 'export': {'view'}, + } def get_extra_context(self, request): return { @@ -3297,7 +3272,9 @@ class InterfaceConnectionsListView(generic.ObjectListView): filterset_form = forms.InterfaceConnectionFilterForm table = tables.InterfaceConnectionTable template_name = 'dcim/connections_list.html' - actions = ('export',) + actions = { + 'export': {'view'}, + } def get_extra_context(self, request): return { diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 55b73d29d..0e8e3b0ea 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -16,6 +16,7 @@ from core.tables import JobTable from extras.dashboard.forms import DashboardWidgetAddForm, DashboardWidgetForm from extras.dashboard.utils import get_widget_class from netbox.config import get_config, PARAMS +from netbox.constants import DEFAULT_ACTION_PERMISSIONS from netbox.views import generic from utilities.forms import ConfirmationForm, get_field_value from utilities.htmx import is_htmx @@ -210,7 +211,10 @@ class ExportTemplateListView(generic.ObjectListView): filterset_form = forms.ExportTemplateFilterForm table = tables.ExportTemplateTable template_name = 'extras/exporttemplate_list.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_sync') + actions = { + **DEFAULT_ACTION_PERMISSIONS, + 'bulk_sync': {'sync'}, + } @register_model_view(ExportTemplate) @@ -472,7 +476,12 @@ class ConfigContextListView(generic.ObjectListView): filterset_form = forms.ConfigContextFilterForm table = tables.ConfigContextTable template_name = 'extras/configcontext_list.html' - actions = ('add', 'bulk_edit', 'bulk_delete', 'bulk_sync') + actions = { + 'add': {'add'}, + 'bulk_edit': {'change'}, + 'bulk_delete': {'delete'}, + 'bulk_sync': {'sync'}, + } @register_model_view(ConfigContext) @@ -576,7 +585,10 @@ class ConfigTemplateListView(generic.ObjectListView): filterset_form = forms.ConfigTemplateFilterForm table = tables.ConfigTemplateTable template_name = 'extras/configtemplate_list.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_sync') + actions = { + **DEFAULT_ACTION_PERMISSIONS, + 'bulk_sync': {'sync'}, + } @register_model_view(ConfigTemplate) @@ -627,7 +639,9 @@ class ObjectChangeListView(generic.ObjectListView): filterset_form = forms.ObjectChangeFilterForm table = tables.ObjectChangeTable template_name = 'extras/objectchange_list.html' - actions = ('export',) + actions = { + 'export': {'view'}, + } @register_model_view(ObjectChange) @@ -693,7 +707,9 @@ class ImageAttachmentListView(generic.ObjectListView): filterset = filtersets.ImageAttachmentFilterSet filterset_form = forms.ImageAttachmentFilterForm table = tables.ImageAttachmentTable - actions = ('export',) + actions = { + 'export': {'view'}, + } @register_model_view(ImageAttachment, 'edit') @@ -736,7 +752,12 @@ class JournalEntryListView(generic.ObjectListView): filterset = filtersets.JournalEntryFilterSet filterset_form = forms.JournalEntryFilterForm table = tables.JournalEntryTable - actions = ('import', 'export', 'bulk_edit', 'bulk_delete') + actions = { + 'import': {'add'}, + 'export': {'view'}, + 'bulk_edit': {'change'}, + 'bulk_delete': {'delete'}, + } @register_model_view(JournalEntry) diff --git a/netbox/netbox/constants.py b/netbox/netbox/constants.py index 2f4ee8e6b..faddf8c21 100644 --- a/netbox/netbox/constants.py +++ b/netbox/netbox/constants.py @@ -27,3 +27,12 @@ ADVISORY_LOCK_KEYS = { 'inventoryitem': 105700, 'inventoryitemtemplate': 105800, } + +# Default view action permission mapping +DEFAULT_ACTION_PERMISSIONS = { + 'add': {'add'}, + 'import': {'add'}, + 'export': {'view'}, + 'bulk_edit': {'change'}, + 'bulk_delete': {'delete'}, +} diff --git a/netbox/netbox/views/generic/mixins.py b/netbox/netbox/views/generic/mixins.py index a55f01509..d01c534bb 100644 --- a/netbox/netbox/views/generic/mixins.py +++ b/netbox/netbox/views/generic/mixins.py @@ -1,5 +1,6 @@ -from collections import defaultdict +import warnings +from netbox.constants import DEFAULT_ACTION_PERMISSIONS from utilities.permissions import get_permission_for_model __all__ = ( @@ -9,13 +10,15 @@ __all__ = ( class ActionsMixin: - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, - }) + """ + Maps action names to the set of required permissions for each. Object list views reference this mapping to + determine whether to render the applicable button for each action: The button will be rendered only if the user + possesses the specified permission(s). + + Standard actions include: add, import, export, bulk_edit, and bulk_delete. Some views extend this default map + with custom actions, such as bulk_sync. + """ + actions = DEFAULT_ACTION_PERMISSIONS def get_permitted_actions(self, user, model=None): """ @@ -23,11 +26,43 @@ class ActionsMixin: """ model = model or self.queryset.model - return [ - action for action in self.actions if user.has_perms([ - get_permission_for_model(model, name) for name in self.action_perms[action] - ]) - ] + # TODO: Remove backward compatibility in Netbox v4.0 + # Determine how permissions are being mapped to actions for the view + if hasattr(self, 'action_perms'): + # Backward compatibility for <3.7 + permissions_map = self.action_perms + warnings.warn( + "Setting action_perms on views is deprecated and will be removed in NetBox v4.0. Use actions instead.", + DeprecationWarning + ) + elif type(self.actions) is dict: + # New actions format (3.7+) + permissions_map = self.actions + else: + # actions is still defined as a list or tuple (<3.7) but no custom mapping is defined; use the old + # default mapping + permissions_map = { + 'add': {'add'}, + 'import': {'add'}, + 'bulk_edit': {'change'}, + 'bulk_delete': {'delete'}, + } + warnings.warn( + "View actions should be defined as a dictionary mapping. Support for the legacy list format will be " + "removed in NetBox v4.0.", + DeprecationWarning + ) + + # Resolve required permissions for each action + permitted_actions = [] + for action in self.actions: + required_permissions = [ + get_permission_for_model(model, name) for name in permissions_map.get(action, set()) + ] + if not required_permissions or user.has_perms(required_permissions): + permitted_actions.append(action) + + return permitted_actions class TableMixin: diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 76a86146c..55193a9a7 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -386,7 +386,11 @@ class ContactAssignmentListView(generic.ObjectListView): filterset = filtersets.ContactAssignmentFilterSet filterset_form = forms.ContactAssignmentFilterForm table = tables.ContactAssignmentTable - actions = ('export', 'bulk_edit', 'bulk_delete') + actions = { + 'export': {'view'}, + 'bulk_edit': {'change'}, + 'bulk_delete': {'delete'}, + } @register_model_view(ContactAssignment, 'edit') diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 173d7047b..798d1fc4d 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -16,6 +16,7 @@ from dcim.tables import DeviceTable from extras.views import ObjectConfigContextView from ipam.models import IPAddress from ipam.tables import InterfaceVLANTable +from netbox.constants import DEFAULT_ACTION_PERMISSIONS from netbox.views import generic from tenancy.views import ObjectContactsView from utilities.utils import count_related @@ -199,13 +200,13 @@ class ClusterDevicesView(generic.ObjectChildrenView): table = DeviceTable filterset = DeviceFilterSet template_name = 'virtualization/cluster/devices.html' - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_remove_devices') - action_perms = defaultdict(set, **{ + actions = { 'add': {'add'}, 'import': {'add'}, + 'export': {'view'}, 'bulk_edit': {'change'}, 'bulk_remove_devices': {'change'}, - }) + } tab = ViewTab( label=_('Devices'), badge=lambda obj: obj.devices.count(), @@ -359,20 +360,16 @@ class VirtualMachineInterfacesView(generic.ObjectChildrenView): table = tables.VirtualMachineVMInterfaceTable filterset = filtersets.VMInterfaceFilterSet template_name = 'virtualization/virtualmachine/interfaces.html' + actions = { + **DEFAULT_ACTION_PERMISSIONS, + 'bulk_rename': {'change'}, + } tab = ViewTab( label=_('Interfaces'), badge=lambda obj: obj.interface_count, permission='virtualization.view_vminterface', weight=500 ) - actions = ('add', 'import', 'export', 'bulk_edit', 'bulk_delete', 'bulk_rename') - action_perms = defaultdict(set, **{ - 'add': {'add'}, - 'import': {'add'}, - 'bulk_edit': {'change'}, - 'bulk_delete': {'delete'}, - 'bulk_rename': {'change'}, - }) def get_children(self, request, parent): return parent.interfaces.restrict(request.user, 'view').prefetch_related( From ae447bd18749f1d768f184b2dc6e928b1f958c41 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 24 Oct 2023 05:19:04 -0700 Subject: [PATCH 056/271] 12216 Add color to circuit-type and add to SVG rendering (#14098) * 12216 add color to model * 12216 add forms, serializers for color * 12216 color to detail view, add type to svg * 12216 add color to svg * 12216 review changes --- netbox/circuits/api/serializers.py | 2 +- netbox/circuits/filtersets.py | 2 +- netbox/circuits/forms/bulk_edit.py | 10 +++++++--- netbox/circuits/forms/bulk_import.py | 6 +++++- netbox/circuits/forms/filtersets.py | 11 ++++++++++- netbox/circuits/forms/model_forms.py | 4 ++-- .../migrations/0043_circuittype_color.py | 18 ++++++++++++++++++ netbox/circuits/models/circuits.py | 6 ++++++ netbox/circuits/tables/circuits.py | 3 ++- netbox/dcim/svg/cables.py | 3 +++ netbox/templates/circuits/circuittype.html | 10 ++++++++++ 11 files changed, 65 insertions(+), 10 deletions(-) create mode 100644 netbox/circuits/migrations/0043_circuittype_color.py diff --git a/netbox/circuits/api/serializers.py b/netbox/circuits/api/serializers.py index f4abda645..5223de339 100644 --- a/netbox/circuits/api/serializers.py +++ b/netbox/circuits/api/serializers.py @@ -85,7 +85,7 @@ class CircuitTypeSerializer(NetBoxModelSerializer): class Meta: model = CircuitType fields = [ - 'id', 'url', 'display', 'name', 'slug', 'description', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', 'created', 'last_updated', 'circuit_count', ] diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index e28238fea..5c7168318 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -137,7 +137,7 @@ class CircuitTypeFilterSet(OrganizationalModelFilterSet): class Meta: model = CircuitType - fields = ['id', 'name', 'slug', 'description'] + fields = ['id', 'name', 'slug', 'color', 'description'] class CircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet): diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index 1a9366583..5c416bff9 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -7,7 +7,7 @@ from ipam.models import ASN from netbox.forms import NetBoxModelBulkEditForm from tenancy.models import Tenant from utilities.forms import add_blank_choice -from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField +from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms.widgets import DatePicker, NumberWithOptions __all__ = ( @@ -91,6 +91,10 @@ class ProviderNetworkBulkEditForm(NetBoxModelBulkEditForm): class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): + color = ColorField( + label=_('Color'), + required=False + ) description = forms.CharField( label=_('Description'), max_length=200, @@ -99,9 +103,9 @@ class CircuitTypeBulkEditForm(NetBoxModelBulkEditForm): model = CircuitType fieldsets = ( - (None, ('description',)), + (None, ('color', 'description')), ) - nullable_fields = ('description',) + nullable_fields = ('color', 'description') class CircuitBulkEditForm(NetBoxModelBulkEditForm): diff --git a/netbox/circuits/forms/bulk_import.py b/netbox/circuits/forms/bulk_import.py index d2217b45b..0c30e3cda 100644 --- a/netbox/circuits/forms/bulk_import.py +++ b/netbox/circuits/forms/bulk_import.py @@ -3,6 +3,7 @@ from django import forms from circuits.choices import CircuitStatusChoices from circuits.models import * from dcim.models import Site +from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ from netbox.forms import NetBoxModelImportForm from tenancy.models import Tenant @@ -64,7 +65,10 @@ class CircuitTypeImportForm(NetBoxModelImportForm): class Meta: model = CircuitType - fields = ('name', 'slug', 'description', 'tags') + fields = ('name', 'slug', 'color', 'description', 'tags') + help_texts = { + 'color': mark_safe(_('RGB color in hexadecimal. Example:') + ' 00ff00'), + } class CircuitImportForm(NetBoxModelImportForm): diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 1fb239023..830c10d8b 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -7,7 +7,7 @@ from dcim.models import Region, Site, SiteGroup from ipam.models import ASN from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import TenancyFilterForm, ContactModelFilterForm -from utilities.forms.fields import DynamicModelMultipleChoiceField, TagFilterField +from utilities.forms.fields import ColorField, DynamicModelMultipleChoiceField, TagFilterField from utilities.forms.widgets import DatePicker, NumberWithOptions __all__ = ( @@ -97,8 +97,17 @@ class ProviderNetworkFilterForm(NetBoxModelFilterSetForm): class CircuitTypeFilterForm(NetBoxModelFilterSetForm): model = CircuitType + fieldsets = ( + (None, ('q', 'filter_id', 'tag')), + (_('Attributes'), ('color',)), + ) tag = TagFilterField(model) + color = ColorField( + label=_('Color'), + required=False + ) + class CircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilterSetForm): model = Circuit diff --git a/netbox/circuits/forms/model_forms.py b/netbox/circuits/forms/model_forms.py index 8a540032e..0809cb2f4 100644 --- a/netbox/circuits/forms/model_forms.py +++ b/netbox/circuits/forms/model_forms.py @@ -76,14 +76,14 @@ class CircuitTypeForm(NetBoxModelForm): fieldsets = ( (_('Circuit Type'), ( - 'name', 'slug', 'description', 'tags', + 'name', 'slug', 'color', 'description', 'tags', )), ) class Meta: model = CircuitType fields = [ - 'name', 'slug', 'description', 'tags', + 'name', 'slug', 'color', 'description', 'tags', ] diff --git a/netbox/circuits/migrations/0043_circuittype_color.py b/netbox/circuits/migrations/0043_circuittype_color.py new file mode 100644 index 000000000..6c4dffeb6 --- /dev/null +++ b/netbox/circuits/migrations/0043_circuittype_color.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.5 on 2023-10-20 21:25 + +from django.db import migrations +import utilities.fields + + +class Migration(migrations.Migration): + dependencies = [ + ('circuits', '0042_provideraccount'), + ] + + operations = [ + migrations.AddField( + model_name='circuittype', + name='color', + field=utilities.fields.ColorField(blank=True, max_length=6), + ), + ] diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 0322b67c6..4dc775364 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -7,6 +7,7 @@ from circuits.choices import * from dcim.models import CabledObjectModel from netbox.models import ChangeLoggedModel, OrganizationalModel, PrimaryModel from netbox.models.features import ContactsMixin, CustomFieldsMixin, CustomLinksMixin, ImageAttachmentsMixin, TagsMixin +from utilities.fields import ColorField __all__ = ( 'Circuit', @@ -20,6 +21,11 @@ class CircuitType(OrganizationalModel): Circuits can be organized by their functional role. For example, a user might wish to define CircuitTypes named "Long Haul," "Metro," or "Out-of-Band". """ + color = ColorField( + verbose_name=_('color'), + blank=True + ) + def get_absolute_url(self): return reverse('circuits:circuittype', args=[self.pk]) diff --git a/netbox/circuits/tables/circuits.py b/netbox/circuits/tables/circuits.py index 6a05983e6..6ae727eca 100644 --- a/netbox/circuits/tables/circuits.py +++ b/netbox/circuits/tables/circuits.py @@ -28,6 +28,7 @@ class CircuitTypeTable(NetBoxTable): linkify=True, verbose_name=_('Name'), ) + color = columns.ColorColumn() tags = columns.TagColumn( url_name='circuits:circuittype_list' ) @@ -40,7 +41,7 @@ class CircuitTypeTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = CircuitType fields = ( - 'pk', 'id', 'name', 'circuit_count', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', + 'pk', 'id', 'name', 'circuit_count', 'color', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', ) default_columns = ('pk', 'name', 'circuit_count', 'description', 'slug') diff --git a/netbox/dcim/svg/cables.py b/netbox/dcim/svg/cables.py index acc4fcad9..31e090078 100644 --- a/netbox/dcim/svg/cables.py +++ b/netbox/dcim/svg/cables.py @@ -159,6 +159,7 @@ class CableTraceSVG: labels.append(location_label) elif instance._meta.model_name == 'circuit': labels[0] = f'Circuit {instance}' + labels.append(instance.type) labels.append(instance.provider) if instance.description: labels.append(instance.description) @@ -181,6 +182,8 @@ class CableTraceSVG: if hasattr(instance, 'role'): # Device return instance.role.color + elif instance._meta.model_name == 'circuit' and instance.type.color: + return instance.type.color else: # Other parent object return 'e0e0e0' diff --git a/netbox/templates/circuits/circuittype.html b/netbox/templates/circuits/circuittype.html index b8b08baf0..407ee4042 100644 --- a/netbox/templates/circuits/circuittype.html +++ b/netbox/templates/circuits/circuittype.html @@ -29,6 +29,16 @@ {% trans "Description" %} {{ object.description|placeholder }} + + {% trans "Color" %} + + {% if object.color %} +   + {% else %} + {{ ''|placeholder }} + {% endif %} + +
      From 7274e75b26b6153a3a22c74f214de52bba53c1a8 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 24 Oct 2023 08:29:24 -0700 Subject: [PATCH 057/271] 13230 Allow Devices to be excluded from Rack utilization (#14099) * 13230 add exclusion flag to device type * 13230 forms, detail views * 13230 add tests * 13230 extraneous model field * 13230 extraneous form field * Update netbox/dcim/forms/bulk_edit.py Co-authored-by: Jeremy Stretch * 13230 review feedback --------- Co-authored-by: Jeremy Stretch --- netbox/dcim/api/serializers.py | 6 ++-- netbox/dcim/filtersets.py | 3 +- netbox/dcim/forms/bulk_edit.py | 10 +++++- netbox/dcim/forms/bulk_import.py | 4 +-- netbox/dcim/forms/model_forms.py | 9 ++--- ...182_devicetype_exclude_from_utilization.py | 17 ++++++++++ netbox/dcim/models/devices.py | 5 +++ netbox/dcim/models/racks.py | 8 +++-- netbox/dcim/tables/devicetypes.py | 7 ++-- netbox/dcim/tests/test_models.py | 34 +++++++++++++++++++ netbox/templates/dcim/devicetype.html | 4 +++ 11 files changed, 91 insertions(+), 16 deletions(-) create mode 100644 netbox/dcim/migrations/0182_devicetype_exclude_from_utilization.py diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index b43611dad..32dcdc5bb 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -343,9 +343,9 @@ class DeviceTypeSerializer(NetBoxModelSerializer): model = DeviceType fields = [ 'id', 'url', 'display', 'manufacturer', 'default_platform', 'model', 'slug', 'part_number', 'u_height', - 'is_full_depth', 'subdevice_role', 'airflow', 'weight', 'weight_unit', 'front_image', 'rear_image', - 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', - 'console_port_template_count', 'console_server_port_template_count', 'power_port_template_count', + 'exclude_from_utilization', 'is_full_depth', 'subdevice_role', 'airflow', 'weight', 'weight_unit', + 'front_image', 'rear_image', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'device_count', 'console_port_template_count', 'console_server_port_template_count', 'power_port_template_count', 'power_outlet_template_count', 'interface_template_count', 'front_port_template_count', 'rear_port_template_count', 'device_bay_template_count', 'module_bay_template_count', 'inventory_item_template_count', diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index d600667d7..c65110d9a 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -496,7 +496,8 @@ class DeviceTypeFilterSet(NetBoxModelFilterSet): class Meta: model = DeviceType fields = [ - 'id', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', 'airflow', 'weight', 'weight_unit', + 'id', 'model', 'slug', 'part_number', 'u_height', 'exclude_from_utilization', 'is_full_depth', 'subdevice_role', + 'airflow', 'weight', 'weight_unit', ] def search(self, queryset, name, value): diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index cacf1f72b..9c64d8a19 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -420,6 +420,11 @@ class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): widget=BulkEditNullBooleanSelect(), label=_('Is full depth') ) + exclude_from_utilization = forms.NullBooleanField( + required=False, + widget=BulkEditNullBooleanSelect(), + label=_('Exclude from utilization') + ) airflow = forms.ChoiceField( label=_('Airflow'), choices=add_blank_choice(DeviceAirflowChoices), @@ -445,7 +450,10 @@ class DeviceTypeBulkEditForm(NetBoxModelBulkEditForm): model = DeviceType fieldsets = ( - (_('Device Type'), ('manufacturer', 'default_platform', 'part_number', 'u_height', 'is_full_depth', 'airflow', 'description')), + (_('Device Type'), ( + 'manufacturer', 'default_platform', 'part_number', 'u_height', 'exclude_from_utilization', 'is_full_depth', + 'airflow', 'description', + )), (_('Weight'), ('weight', 'weight_unit')), ) nullable_fields = ('part_number', 'airflow', 'weight', 'weight_unit', 'description', 'comments') diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index e41e875e4..d63873b59 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -335,8 +335,8 @@ class DeviceTypeImportForm(NetBoxModelImportForm): class Meta: model = DeviceType fields = [ - 'manufacturer', 'default_platform', 'model', 'slug', 'part_number', 'u_height', 'is_full_depth', - 'subdevice_role', 'airflow', 'description', 'weight', 'weight_unit', 'comments', 'tags', + 'manufacturer', 'default_platform', 'model', 'slug', 'part_number', 'u_height', 'exclude_from_utilization', + 'is_full_depth', 'subdevice_role', 'airflow', 'description', 'weight', 'weight_unit', 'comments', 'tags', ] diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 93e214598..3d626d201 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -302,7 +302,8 @@ class DeviceTypeForm(NetBoxModelForm): fieldsets = ( (_('Device Type'), ('manufacturer', 'model', 'slug', 'default_platform', 'description', 'tags')), (_('Chassis'), ( - 'u_height', 'is_full_depth', 'part_number', 'subdevice_role', 'airflow', 'weight', 'weight_unit', + 'u_height', 'exclude_from_utilization', 'is_full_depth', 'part_number', 'subdevice_role', 'airflow', + 'weight', 'weight_unit', )), (_('Images'), ('front_image', 'rear_image')), ) @@ -310,9 +311,9 @@ class DeviceTypeForm(NetBoxModelForm): class Meta: model = DeviceType fields = [ - 'manufacturer', 'model', 'slug', 'default_platform', 'part_number', 'u_height', 'is_full_depth', - 'subdevice_role', 'airflow', 'weight', 'weight_unit', 'front_image', 'rear_image', 'description', - 'comments', 'tags', + 'manufacturer', 'model', 'slug', 'default_platform', 'part_number', 'u_height', 'exclude_from_utilization', + 'is_full_depth', 'subdevice_role', 'airflow', 'weight', 'weight_unit', 'front_image', 'rear_image', + 'description', 'comments', 'tags', ] widgets = { 'front_image': ClearableFileInput(attrs={ diff --git a/netbox/dcim/migrations/0182_devicetype_exclude_from_utilization.py b/netbox/dcim/migrations/0182_devicetype_exclude_from_utilization.py new file mode 100644 index 000000000..6943387c5 --- /dev/null +++ b/netbox/dcim/migrations/0182_devicetype_exclude_from_utilization.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.5 on 2023-10-20 22:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ('dcim', '0181_rename_device_role_device_role'), + ] + + operations = [ + migrations.AddField( + model_name='devicetype', + name='exclude_from_utilization', + field=models.BooleanField(default=False), + ), + ] diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index c9ebf898d..943bf318c 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -106,6 +106,11 @@ class DeviceType(ImageAttachmentsMixin, PrimaryModel, WeightMixin): default=1.0, verbose_name=_('height (U)') ) + exclude_from_utilization = models.BooleanField( + default=False, + verbose_name=_('exclude from utilization'), + help_text=_('Exclude from rack utilization calculations.') + ) is_full_depth = models.BooleanField( default=True, verbose_name=_('is full depth'), diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index ef0dde4da..ab1027d1b 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -357,7 +357,7 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, PrimaryModel, WeightMixin): return [u for u in elevation.values()] - def get_available_units(self, u_height=1, rack_face=None, exclude=None): + def get_available_units(self, u_height=1, rack_face=None, exclude=None, ignore_excluded_devices=False): """ Return a list of units within the rack available to accommodate a device of a given U height (default 1). Optionally exclude one or more devices when calculating empty units (needed when moving a device from one @@ -366,9 +366,13 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, PrimaryModel, WeightMixin): :param u_height: Minimum number of contiguous free units required :param rack_face: The face of the rack (front or rear) required; 'None' if device is full depth :param exclude: List of devices IDs to exclude (useful when moving a device within a rack) + :param ignore_excluded_devices: Ignore devices that are marked to exclude from utilization calculations """ # Gather all devices which consume U space within the rack devices = self.devices.prefetch_related('device_type').filter(position__gte=1) + if ignore_excluded_devices: + devices = devices.exclude(device_type__exclude_from_utilization=True) + if exclude is not None: devices = devices.exclude(pk__in=exclude) @@ -453,7 +457,7 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, PrimaryModel, WeightMixin): """ # Determine unoccupied units total_units = len(list(self.units)) - available_units = self.get_available_units(u_height=0.5) + available_units = self.get_available_units(u_height=0.5, ignore_excluded_devices=True) # Remove reserved units for ru in self.get_reserved_units(): diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index 7d8884fc1..fad238c6e 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -98,6 +98,7 @@ class DeviceTypeTable(NetBoxTable): verbose_name=_('U Height'), template_code='{{ value|floatformat }}' ) + exclude_from_utilization = columns.BooleanColumn() weight = columns.TemplateColumn( verbose_name=_('Weight'), template_code=WEIGHT, @@ -142,9 +143,9 @@ class DeviceTypeTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = models.DeviceType fields = ( - 'pk', 'id', 'model', 'manufacturer', 'default_platform', 'slug', 'part_number', 'u_height', 'is_full_depth', - 'subdevice_role', 'airflow', 'weight', 'description', 'comments', 'instance_count', 'tags', 'created', - 'last_updated', + 'pk', 'id', 'model', 'manufacturer', 'default_platform', 'slug', 'part_number', 'u_height', + 'exclude_from_utilization', 'is_full_depth', 'subdevice_role', 'airflow', 'weight', + 'description', 'comments', 'instance_count', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'instance_count', diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index 2e5ae0d5c..741a615d4 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -238,6 +238,40 @@ class RackTestCase(TestCase): # Check that Device1 is now assigned to Site B self.assertEqual(Device.objects.get(pk=device1.pk).site, site_b) + def test_utilization(self): + site = Site.objects.first() + rack = Rack.objects.first() + + Device( + name='Device 1', + role=DeviceRole.objects.first(), + device_type=DeviceType.objects.first(), + site=site, + rack=rack, + position=1 + ).save() + rack.refresh_from_db() + self.assertEqual(rack.get_utilization(), 1 / 42 * 100) + + # create device excluded from utilization calculations + dt = DeviceType.objects.create( + manufacturer=Manufacturer.objects.first(), + model='Device Type 4', + slug='device-type-4', + u_height=1, + exclude_from_utilization=True + ) + Device( + name='Device 2', + role=DeviceRole.objects.first(), + device_type=dt, + site=site, + rack=rack, + position=5 + ).save() + rack.refresh_from_db() + self.assertEqual(rack.get_utilization(), 1 / 42 * 100) + class DeviceTestCase(TestCase): diff --git a/netbox/templates/dcim/devicetype.html b/netbox/templates/dcim/devicetype.html index 419ab7f00..35b089664 100644 --- a/netbox/templates/dcim/devicetype.html +++ b/netbox/templates/dcim/devicetype.html @@ -40,6 +40,10 @@ {% trans "Height (U" %}) {{ object.u_height|floatformat }} + + {% trans "Exclude From Utilization" %}) + {% checkmark object.exclude_from_utilization %} + {% trans "Full Depth" %} {% checkmark object.is_full_depth %} From 30ce9edf1c44ae181b376461bcd4c29f115fc80b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 24 Oct 2023 11:35:53 -0400 Subject: [PATCH 058/271] Closes #13381: Enable plugins to register custom data backends (#14095) * Initial work on #13381 * Fix backend type display in table column * Fix data source type choices during bulk edit * Misc cleanup * Move backend utils from core app to netbox * Move backend type validation from serializer to model --- docs/plugins/development/data-backends.md | 23 ++++++++ docs/plugins/development/index.md | 1 + mkdocs.yml | 1 + netbox/core/api/serializers.py | 3 +- netbox/core/choices.py | 12 ---- netbox/core/data_backends.py | 59 ++++--------------- netbox/core/filtersets.py | 3 +- netbox/core/forms/bulk_edit.py | 8 +-- netbox/core/forms/filtersets.py | 3 +- netbox/core/forms/model_forms.py | 19 +++--- .../0006_datasource_type_remove_choices.py | 18 ++++++ netbox/core/models/data.py | 21 +++---- netbox/core/tables/columns.py | 20 +++++++ netbox/core/tables/data.py | 9 +-- netbox/core/tests/test_api.py | 15 +++-- netbox/core/tests/test_filtersets.py | 14 ++--- netbox/core/tests/test_views.py | 19 +++--- netbox/netbox/data_backends.py | 53 +++++++++++++++++ netbox/netbox/plugins/__init__.py | 8 +++ .../tests/dummy_plugin/data_backends.py | 18 ++++++ netbox/netbox/tests/test_plugins.py | 8 +++ netbox/netbox/utils.py | 26 ++++++++ netbox/templates/core/datasource.html | 2 +- 23 files changed, 250 insertions(+), 113 deletions(-) create mode 100644 docs/plugins/development/data-backends.md create mode 100644 netbox/core/migrations/0006_datasource_type_remove_choices.py create mode 100644 netbox/core/tables/columns.py create mode 100644 netbox/netbox/data_backends.py create mode 100644 netbox/netbox/tests/dummy_plugin/data_backends.py create mode 100644 netbox/netbox/utils.py diff --git a/docs/plugins/development/data-backends.md b/docs/plugins/development/data-backends.md new file mode 100644 index 000000000..feffa5bed --- /dev/null +++ b/docs/plugins/development/data-backends.md @@ -0,0 +1,23 @@ +# Data Backends + +[Data sources](../../models/core/datasource.md) can be defined to reference data which exists on systems of record outside NetBox, such as a git repository or Amazon S3 bucket. Plugins can register their own backend classes to introduce support for additional resource types. This is done by subclassing NetBox's `DataBackend` class. + +```python title="data_backends.py" +from netbox.data_backends import DataBackend + +class MyDataBackend(DataBackend): + name = 'mybackend' + label = 'My Backend' + ... +``` + +To register one or more data backends with NetBox, define a list named `backends` at the end of this file: + +```python title="data_backends.py" +backends = [MyDataBackend] +``` + +!!! tip + The path to the list of search indexes can be modified by setting `data_backends` in the PluginConfig instance. + +::: core.data_backends.DataBackend diff --git a/docs/plugins/development/index.md b/docs/plugins/development/index.md index dcbad9d8d..d3f50a0fb 100644 --- a/docs/plugins/development/index.md +++ b/docs/plugins/development/index.md @@ -109,6 +109,7 @@ NetBox looks for the `config` variable within a plugin's `__init__.py` to load i | `middleware` | A list of middleware classes to append after NetBox's build-in middleware | | `queues` | A list of custom background task queues to create | | `search_extensions` | The dotted path to the list of search index classes (default: `search.indexes`) | +| `data_backends` | The dotted path to the list of data source backend classes (default: `data_backends.backends`) | | `template_extensions` | The dotted path to the list of template extension classes (default: `template_content.template_extensions`) | | `menu_items` | The dotted path to the list of menu items provided by the plugin (default: `navigation.menu_items`) | | `graphql_schema` | The dotted path to the plugin's GraphQL schema class, if any (default: `graphql.schema`) | diff --git a/mkdocs.yml b/mkdocs.yml index cc16434de..3e61f922a 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -136,6 +136,7 @@ nav: - Forms: 'plugins/development/forms.md' - Filters & Filter Sets: 'plugins/development/filtersets.md' - Search: 'plugins/development/search.md' + - Data Backends: 'plugins/development/data-backends.md' - REST API: 'plugins/development/rest-api.md' - GraphQL API: 'plugins/development/graphql-api.md' - Background Tasks: 'plugins/development/background-tasks.md' diff --git a/netbox/core/api/serializers.py b/netbox/core/api/serializers.py index 4117a609c..0d743d952 100644 --- a/netbox/core/api/serializers.py +++ b/netbox/core/api/serializers.py @@ -4,6 +4,7 @@ from core.choices import * from core.models import * from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.serializers import BaseModelSerializer, NetBoxModelSerializer +from netbox.utils import get_data_backend_choices from users.api.nested_serializers import NestedUserSerializer from .nested_serializers import * @@ -19,7 +20,7 @@ class DataSourceSerializer(NetBoxModelSerializer): view_name='core-api:datasource-detail' ) type = ChoiceField( - choices=DataSourceTypeChoices + choices=get_data_backend_choices() ) status = ChoiceField( choices=DataSourceStatusChoices, diff --git a/netbox/core/choices.py b/netbox/core/choices.py index b5d9d0d90..8d7050414 100644 --- a/netbox/core/choices.py +++ b/netbox/core/choices.py @@ -7,18 +7,6 @@ from utilities.choices import ChoiceSet # Data sources # -class DataSourceTypeChoices(ChoiceSet): - LOCAL = 'local' - GIT = 'git' - AMAZON_S3 = 'amazon-s3' - - CHOICES = ( - (LOCAL, _('Local'), 'gray'), - (GIT, 'Git', 'blue'), - (AMAZON_S3, 'Amazon S3', 'blue'), - ) - - class DataSourceStatusChoices(ChoiceSet): NEW = 'new' QUEUED = 'queued' diff --git a/netbox/core/data_backends.py b/netbox/core/data_backends.py index 82b3962dd..9ff0b4d63 100644 --- a/netbox/core/data_backends.py +++ b/netbox/core/data_backends.py @@ -10,61 +10,24 @@ from django import forms from django.conf import settings from django.utils.translation import gettext as _ -from netbox.registry import registry -from .choices import DataSourceTypeChoices +from netbox.data_backends import DataBackend +from netbox.utils import register_data_backend from .exceptions import SyncError __all__ = ( - 'LocalBackend', 'GitBackend', + 'LocalBackend', 'S3Backend', ) logger = logging.getLogger('netbox.data_backends') -def register_backend(name): - """ - Decorator for registering a DataBackend class. - """ - - def _wrapper(cls): - registry['data_backends'][name] = cls - return cls - - return _wrapper - - -class DataBackend: - parameters = {} - sensitive_parameters = [] - - # Prevent Django's template engine from calling the backend - # class when referenced via DataSource.backend_class - do_not_call_in_templates = True - - def __init__(self, url, **kwargs): - self.url = url - self.params = kwargs - self.config = self.init_config() - - def init_config(self): - """ - Hook to initialize the instance's configuration. - """ - return - - @property - def url_scheme(self): - return urlparse(self.url).scheme.lower() - - @contextmanager - def fetch(self): - raise NotImplemented() - - -@register_backend(DataSourceTypeChoices.LOCAL) +@register_data_backend() class LocalBackend(DataBackend): + name = 'local' + label = _('Local') + is_local = True @contextmanager def fetch(self): @@ -74,8 +37,10 @@ class LocalBackend(DataBackend): yield local_path -@register_backend(DataSourceTypeChoices.GIT) +@register_data_backend() class GitBackend(DataBackend): + name = 'git' + label = 'Git' parameters = { 'username': forms.CharField( required=False, @@ -144,8 +109,10 @@ class GitBackend(DataBackend): local_path.cleanup() -@register_backend(DataSourceTypeChoices.AMAZON_S3) +@register_data_backend() class S3Backend(DataBackend): + name = 'amazon-s3' + label = 'Amazon S3' parameters = { 'aws_access_key_id': forms.CharField( label=_('AWS access key ID'), diff --git a/netbox/core/filtersets.py b/netbox/core/filtersets.py index 62a58086a..410e2e80c 100644 --- a/netbox/core/filtersets.py +++ b/netbox/core/filtersets.py @@ -4,6 +4,7 @@ from django.utils.translation import gettext as _ import django_filters from netbox.filtersets import BaseFilterSet, ChangeLoggedModelFilterSet, NetBoxModelFilterSet +from netbox.utils import get_data_backend_choices from .choices import * from .models import * @@ -16,7 +17,7 @@ __all__ = ( class DataSourceFilterSet(NetBoxModelFilterSet): type = django_filters.MultipleChoiceFilter( - choices=DataSourceTypeChoices, + choices=get_data_backend_choices, null_value=None ) status = django_filters.MultipleChoiceFilter( diff --git a/netbox/core/forms/bulk_edit.py b/netbox/core/forms/bulk_edit.py index a4ecd646f..dcc92c6f0 100644 --- a/netbox/core/forms/bulk_edit.py +++ b/netbox/core/forms/bulk_edit.py @@ -1,10 +1,9 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from core.choices import DataSourceTypeChoices from core.models import * from netbox.forms import NetBoxModelBulkEditForm -from utilities.forms import add_blank_choice +from netbox.utils import get_data_backend_choices from utilities.forms.fields import CommentField from utilities.forms.widgets import BulkEditNullBooleanSelect @@ -16,9 +15,8 @@ __all__ = ( class DataSourceBulkEditForm(NetBoxModelBulkEditForm): type = forms.ChoiceField( label=_('Type'), - choices=add_blank_choice(DataSourceTypeChoices), - required=False, - initial='' + choices=get_data_backend_choices, + required=False ) enabled = forms.NullBooleanField( required=False, diff --git a/netbox/core/forms/filtersets.py b/netbox/core/forms/filtersets.py index f7a6f3595..4d0acbb77 100644 --- a/netbox/core/forms/filtersets.py +++ b/netbox/core/forms/filtersets.py @@ -8,6 +8,7 @@ from core.models import * from extras.forms.mixins import SavedFiltersMixin from extras.utils import FeatureQuery from netbox.forms import NetBoxModelFilterSetForm +from netbox.utils import get_data_backend_choices from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm from utilities.forms.fields import ContentTypeChoiceField, DynamicModelMultipleChoiceField from utilities.forms.widgets import APISelectMultiple, DateTimePicker @@ -27,7 +28,7 @@ class DataSourceFilterForm(NetBoxModelFilterSetForm): ) type = forms.MultipleChoiceField( label=_('Type'), - choices=DataSourceTypeChoices, + choices=get_data_backend_choices, required=False ) status = forms.MultipleChoiceField( diff --git a/netbox/core/forms/model_forms.py b/netbox/core/forms/model_forms.py index 01d5474c6..e3184acf6 100644 --- a/netbox/core/forms/model_forms.py +++ b/netbox/core/forms/model_forms.py @@ -7,6 +7,7 @@ from core.forms.mixins import SyncedDataMixin from core.models import * from netbox.forms import NetBoxModelForm from netbox.registry import registry +from netbox.utils import get_data_backend_choices from utilities.forms import get_field_value from utilities.forms.fields import CommentField from utilities.forms.widgets import HTMXSelect @@ -18,6 +19,10 @@ __all__ = ( class DataSourceForm(NetBoxModelForm): + type = forms.ChoiceField( + choices=get_data_backend_choices, + widget=HTMXSelect() + ) comments = CommentField() class Meta: @@ -26,7 +31,6 @@ class DataSourceForm(NetBoxModelForm): 'name', 'type', 'source_url', 'enabled', 'description', 'comments', 'ignore_rules', 'tags', ] widgets = { - 'type': HTMXSelect(), 'ignore_rules': forms.Textarea( attrs={ 'rows': 5, @@ -56,12 +60,13 @@ class DataSourceForm(NetBoxModelForm): # Add backend-specific form fields self.backend_fields = [] - for name, form_field in backend.parameters.items(): - field_name = f'backend_{name}' - self.backend_fields.append(field_name) - self.fields[field_name] = copy.copy(form_field) - if self.instance and self.instance.parameters: - self.fields[field_name].initial = self.instance.parameters.get(name) + if backend: + for name, form_field in backend.parameters.items(): + field_name = f'backend_{name}' + self.backend_fields.append(field_name) + self.fields[field_name] = copy.copy(form_field) + if self.instance and self.instance.parameters: + self.fields[field_name].initial = self.instance.parameters.get(name) def save(self, *args, **kwargs): diff --git a/netbox/core/migrations/0006_datasource_type_remove_choices.py b/netbox/core/migrations/0006_datasource_type_remove_choices.py new file mode 100644 index 000000000..0ad8d8854 --- /dev/null +++ b/netbox/core/migrations/0006_datasource_type_remove_choices.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.6 on 2023-10-20 17:47 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0005_job_created_auto_now'), + ] + + operations = [ + migrations.AlterField( + model_name='datasource', + name='type', + field=models.CharField(max_length=50), + ), + ] diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index 54a43c7ef..fb764134a 100644 --- a/netbox/core/models/data.py +++ b/netbox/core/models/data.py @@ -45,9 +45,7 @@ class DataSource(JobsMixin, PrimaryModel): ) type = models.CharField( verbose_name=_('type'), - max_length=50, - choices=DataSourceTypeChoices, - default=DataSourceTypeChoices.LOCAL + max_length=50 ) source_url = models.CharField( max_length=200, @@ -96,8 +94,9 @@ class DataSource(JobsMixin, PrimaryModel): def docs_url(self): return f'{settings.STATIC_URL}docs/models/{self._meta.app_label}/{self._meta.model_name}/' - def get_type_color(self): - return DataSourceTypeChoices.colors.get(self.type) + def get_type_display(self): + if backend := registry['data_backends'].get(self.type): + return backend.label def get_status_color(self): return DataSourceStatusChoices.colors.get(self.status) @@ -110,10 +109,6 @@ class DataSource(JobsMixin, PrimaryModel): def backend_class(self): return registry['data_backends'].get(self.type) - @property - def is_local(self): - return self.type == DataSourceTypeChoices.LOCAL - @property def ready_for_sync(self): return self.enabled and self.status not in ( @@ -123,8 +118,14 @@ class DataSource(JobsMixin, PrimaryModel): def clean(self): + # Validate data backend type + if self.type and self.type not in registry['data_backends']: + raise ValidationError({ + 'type': _("Unknown backend type: {type}".format(type=self.type)) + }) + # Ensure URL scheme matches selected type - if self.type == DataSourceTypeChoices.LOCAL and self.url_scheme not in ('file', ''): + if self.backend_class.is_local and self.url_scheme not in ('file', ''): raise ValidationError({ 'source_url': f"URLs for local sources must start with file:// (or specify no scheme)" }) diff --git a/netbox/core/tables/columns.py b/netbox/core/tables/columns.py new file mode 100644 index 000000000..93f1e3901 --- /dev/null +++ b/netbox/core/tables/columns.py @@ -0,0 +1,20 @@ +import django_tables2 as tables + +from netbox.registry import registry + +__all__ = ( + 'BackendTypeColumn', +) + + +class BackendTypeColumn(tables.Column): + """ + Display a data backend type. + """ + def render(self, value): + if backend := registry['data_backends'].get(value): + return backend.label + return value + + def value(self, value): + return value diff --git a/netbox/core/tables/data.py b/netbox/core/tables/data.py index 1ecc42369..4059ea9bc 100644 --- a/netbox/core/tables/data.py +++ b/netbox/core/tables/data.py @@ -3,6 +3,7 @@ import django_tables2 as tables from core.models import * from netbox.tables import NetBoxTable, columns +from .columns import BackendTypeColumn __all__ = ( 'DataFileTable', @@ -15,8 +16,8 @@ class DataSourceTable(NetBoxTable): verbose_name=_('Name'), linkify=True ) - type = columns.ChoiceFieldColumn( - verbose_name=_('Type'), + type = BackendTypeColumn( + verbose_name=_('Type') ) status = columns.ChoiceFieldColumn( verbose_name=_('Status'), @@ -34,8 +35,8 @@ class DataSourceTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = DataSource fields = ( - 'pk', 'id', 'name', 'type', 'status', 'enabled', 'source_url', 'description', 'comments', 'parameters', 'created', - 'last_updated', 'file_count', + 'pk', 'id', 'name', 'type', 'status', 'enabled', 'source_url', 'description', 'comments', 'parameters', + 'created', 'last_updated', 'file_count', ) default_columns = ('pk', 'name', 'type', 'status', 'enabled', 'description', 'file_count') diff --git a/netbox/core/tests/test_api.py b/netbox/core/tests/test_api.py index dc6d6a5ce..cd25761f0 100644 --- a/netbox/core/tests/test_api.py +++ b/netbox/core/tests/test_api.py @@ -2,7 +2,6 @@ from django.urls import reverse from django.utils import timezone from utilities.testing import APITestCase, APIViewTestCases -from ..choices import * from ..models import * @@ -26,26 +25,26 @@ class DataSourceTest(APIViewTestCases.APIViewTestCase): @classmethod def setUpTestData(cls): data_sources = ( - DataSource(name='Data Source 1', type=DataSourceTypeChoices.LOCAL, source_url='file:///var/tmp/source1/'), - DataSource(name='Data Source 2', type=DataSourceTypeChoices.LOCAL, source_url='file:///var/tmp/source2/'), - DataSource(name='Data Source 3', type=DataSourceTypeChoices.LOCAL, source_url='file:///var/tmp/source3/'), + DataSource(name='Data Source 1', type='local', source_url='file:///var/tmp/source1/'), + DataSource(name='Data Source 2', type='local', source_url='file:///var/tmp/source2/'), + DataSource(name='Data Source 3', type='local', source_url='file:///var/tmp/source3/'), ) DataSource.objects.bulk_create(data_sources) cls.create_data = [ { 'name': 'Data Source 4', - 'type': DataSourceTypeChoices.GIT, + 'type': 'git', 'source_url': 'https://example.com/git/source4' }, { 'name': 'Data Source 5', - 'type': DataSourceTypeChoices.GIT, + 'type': 'git', 'source_url': 'https://example.com/git/source5' }, { 'name': 'Data Source 6', - 'type': DataSourceTypeChoices.GIT, + 'type': 'git', 'source_url': 'https://example.com/git/source6' }, ] @@ -63,7 +62,7 @@ class DataFileTest( def setUpTestData(cls): datasource = DataSource.objects.create( name='Data Source 1', - type=DataSourceTypeChoices.LOCAL, + type='local', source_url='file:///var/tmp/source1/' ) diff --git a/netbox/core/tests/test_filtersets.py b/netbox/core/tests/test_filtersets.py index e1e916f70..2f60c7522 100644 --- a/netbox/core/tests/test_filtersets.py +++ b/netbox/core/tests/test_filtersets.py @@ -18,21 +18,21 @@ class DataSourceTestCase(TestCase, ChangeLoggedFilterSetTests): data_sources = ( DataSource( name='Data Source 1', - type=DataSourceTypeChoices.LOCAL, + type='local', source_url='file:///var/tmp/source1/', status=DataSourceStatusChoices.NEW, enabled=True ), DataSource( name='Data Source 2', - type=DataSourceTypeChoices.LOCAL, + type='local', source_url='file:///var/tmp/source2/', status=DataSourceStatusChoices.SYNCING, enabled=True ), DataSource( name='Data Source 3', - type=DataSourceTypeChoices.GIT, + type='git', source_url='https://example.com/git/source3', status=DataSourceStatusChoices.COMPLETED, enabled=False @@ -45,7 +45,7 @@ class DataSourceTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_type(self): - params = {'type': [DataSourceTypeChoices.LOCAL]} + params = {'type': ['local']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_enabled(self): @@ -66,9 +66,9 @@ class DataFileTestCase(TestCase, ChangeLoggedFilterSetTests): @classmethod def setUpTestData(cls): data_sources = ( - DataSource(name='Data Source 1', type=DataSourceTypeChoices.LOCAL, source_url='file:///var/tmp/source1/'), - DataSource(name='Data Source 2', type=DataSourceTypeChoices.LOCAL, source_url='file:///var/tmp/source2/'), - DataSource(name='Data Source 3', type=DataSourceTypeChoices.LOCAL, source_url='file:///var/tmp/source3/'), + DataSource(name='Data Source 1', type='local', source_url='file:///var/tmp/source1/'), + DataSource(name='Data Source 2', type='local', source_url='file:///var/tmp/source2/'), + DataSource(name='Data Source 3', type='local', source_url='file:///var/tmp/source3/'), ) DataSource.objects.bulk_create(data_sources) diff --git a/netbox/core/tests/test_views.py b/netbox/core/tests/test_views.py index 4a50a8d05..16d07f376 100644 --- a/netbox/core/tests/test_views.py +++ b/netbox/core/tests/test_views.py @@ -1,7 +1,6 @@ from django.utils import timezone from utilities.testing import ViewTestCases, create_tags -from ..choices import * from ..models import * @@ -11,9 +10,9 @@ class DataSourceTestCase(ViewTestCases.PrimaryObjectViewTestCase): @classmethod def setUpTestData(cls): data_sources = ( - DataSource(name='Data Source 1', type=DataSourceTypeChoices.LOCAL, source_url='file:///var/tmp/source1/'), - DataSource(name='Data Source 2', type=DataSourceTypeChoices.LOCAL, source_url='file:///var/tmp/source2/'), - DataSource(name='Data Source 3', type=DataSourceTypeChoices.LOCAL, source_url='file:///var/tmp/source3/'), + DataSource(name='Data Source 1', type='local', source_url='file:///var/tmp/source1/'), + DataSource(name='Data Source 2', type='local', source_url='file:///var/tmp/source2/'), + DataSource(name='Data Source 3', type='local', source_url='file:///var/tmp/source3/'), ) DataSource.objects.bulk_create(data_sources) @@ -21,7 +20,7 @@ class DataSourceTestCase(ViewTestCases.PrimaryObjectViewTestCase): cls.form_data = { 'name': 'Data Source X', - 'type': DataSourceTypeChoices.GIT, + 'type': 'git', 'source_url': 'http:///exmaple/com/foo/bar/', 'description': 'Something', 'comments': 'Foo bar baz', @@ -29,10 +28,10 @@ class DataSourceTestCase(ViewTestCases.PrimaryObjectViewTestCase): } cls.csv_data = ( - f"name,type,source_url,enabled", - f"Data Source 4,{DataSourceTypeChoices.LOCAL},file:///var/tmp/source4/,true", - f"Data Source 5,{DataSourceTypeChoices.LOCAL},file:///var/tmp/source4/,true", - f"Data Source 6,{DataSourceTypeChoices.GIT},http:///exmaple/com/foo/bar/,false", + "name,type,source_url,enabled", + "Data Source 4,local,file:///var/tmp/source4/,true", + "Data Source 5,local,file:///var/tmp/source4/,true", + "Data Source 6,git,http:///exmaple/com/foo/bar/,false", ) cls.csv_update_data = ( @@ -60,7 +59,7 @@ class DataFileTestCase( def setUpTestData(cls): datasource = DataSource.objects.create( name='Data Source 1', - type=DataSourceTypeChoices.LOCAL, + type='local', source_url='file:///var/tmp/source1/' ) diff --git a/netbox/netbox/data_backends.py b/netbox/netbox/data_backends.py new file mode 100644 index 000000000..d5bab75c1 --- /dev/null +++ b/netbox/netbox/data_backends.py @@ -0,0 +1,53 @@ +from contextlib import contextmanager +from urllib.parse import urlparse + +__all__ = ( + 'DataBackend', +) + + +class DataBackend: + """ + A data backend represents a specific system of record for data, such as a git repository or Amazon S3 bucket. + + Attributes: + name: The identifier under which this backend will be registered in NetBox + label: The human-friendly name for this backend + is_local: A boolean indicating whether this backend accesses local data + parameters: A dictionary mapping configuration form field names to their classes + sensitive_parameters: An iterable of field names for which the values should not be displayed to the user + """ + is_local = False + parameters = {} + sensitive_parameters = [] + + # Prevent Django's template engine from calling the backend + # class when referenced via DataSource.backend_class + do_not_call_in_templates = True + + def __init__(self, url, **kwargs): + self.url = url + self.params = kwargs + self.config = self.init_config() + + def init_config(self): + """ + A hook to initialize the instance's configuration. The data returned by this method is assigned to the + instance's `config` attribute upon initialization, which can be referenced by the `fetch()` method. + """ + return + + @property + def url_scheme(self): + return urlparse(self.url).scheme.lower() + + @contextmanager + def fetch(self): + """ + A context manager which performs the following: + + 1. Handles all setup and synchronization + 2. Yields the local path at which data has been replicated + 3. Performs any necessary cleanup + """ + raise NotImplemented() diff --git a/netbox/netbox/plugins/__init__.py b/netbox/netbox/plugins/__init__.py index f60462f3d..8b6901b7a 100644 --- a/netbox/netbox/plugins/__init__.py +++ b/netbox/netbox/plugins/__init__.py @@ -8,6 +8,7 @@ from packaging import version from netbox.registry import registry from netbox.search import register_search +from netbox.utils import register_data_backend from .navigation import * from .registration import * from .templates import * @@ -24,6 +25,7 @@ registry['plugins'].update({ DEFAULT_RESOURCE_PATHS = { 'search_indexes': 'search.indexes', + 'data_backends': 'data_backends.backends', 'graphql_schema': 'graphql.schema', 'menu': 'navigation.menu', 'menu_items': 'navigation.menu_items', @@ -70,6 +72,7 @@ class PluginConfig(AppConfig): # Optional plugin resources search_indexes = None + data_backends = None graphql_schema = None menu = None menu_items = None @@ -98,6 +101,11 @@ class PluginConfig(AppConfig): for idx in search_indexes: register_search(idx) + # Register data backends (if defined) + data_backends = self._load_resource('data_backends') or [] + for backend in data_backends: + register_data_backend()(backend) + # Register template content (if defined) if template_extensions := self._load_resource('template_extensions'): register_template_extensions(template_extensions) diff --git a/netbox/netbox/tests/dummy_plugin/data_backends.py b/netbox/netbox/tests/dummy_plugin/data_backends.py new file mode 100644 index 000000000..9b63e51c6 --- /dev/null +++ b/netbox/netbox/tests/dummy_plugin/data_backends.py @@ -0,0 +1,18 @@ +from contextlib import contextmanager + +from netbox.data_backends import DataBackend + + +class DummyBackend(DataBackend): + name = 'dummy' + label = 'Dummy' + is_local = True + + @contextmanager + def fetch(self): + yield '/tmp' + + +backends = ( + DummyBackend, +) diff --git a/netbox/netbox/tests/test_plugins.py b/netbox/netbox/tests/test_plugins.py index f5f97013e..046436a86 100644 --- a/netbox/netbox/tests/test_plugins.py +++ b/netbox/netbox/tests/test_plugins.py @@ -6,6 +6,7 @@ from django.test import Client, TestCase, override_settings from django.urls import reverse from netbox.tests.dummy_plugin import config as dummy_config +from netbox.tests.dummy_plugin.data_backends import DummyBackend from netbox.plugins.navigation import PluginMenu from netbox.plugins.utils import get_plugin_config from netbox.graphql.schema import Query @@ -111,6 +112,13 @@ class PluginTest(TestCase): """ self.assertIn('netbox.tests.dummy_plugin.middleware.DummyMiddleware', settings.MIDDLEWARE) + def test_data_backends(self): + """ + Check registered data backends. + """ + self.assertIn('dummy', registry['data_backends']) + self.assertIs(registry['data_backends']['dummy'], DummyBackend) + def test_queues(self): """ Check that plugin queues are registered with the accurate name. diff --git a/netbox/netbox/utils.py b/netbox/netbox/utils.py new file mode 100644 index 000000000..f27d1b5f7 --- /dev/null +++ b/netbox/netbox/utils.py @@ -0,0 +1,26 @@ +from netbox.registry import registry + +__all__ = ( + 'get_data_backend_choices', + 'register_data_backend', +) + + +def get_data_backend_choices(): + return [ + (None, '---------'), + *[ + (name, cls.label) for name, cls in registry['data_backends'].items() + ] + ] + + +def register_data_backend(): + """ + Decorator for registering a DataBackend class. + """ + def _wrapper(cls): + registry['data_backends'][cls.name] = cls + return cls + + return _wrapper diff --git a/netbox/templates/core/datasource.html b/netbox/templates/core/datasource.html index 369c395f8..51090b0c9 100644 --- a/netbox/templates/core/datasource.html +++ b/netbox/templates/core/datasource.html @@ -58,7 +58,7 @@ {% trans "URL" %} - {% if not object.is_local %} + {% if not object.type.is_local %} {{ object.source_url }} {% else %} {{ object.source_url }} From c4e765c4a8a5fa4ab653181e8e3e34597b6e1556 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 30 Oct 2023 13:38:03 -0400 Subject: [PATCH 059/271] Closes #14141: translation cleanup (#14143) * Translations cleanup * Tweak variable names; misc string cleanup * Misc cleanup --- netbox/circuits/filtersets.py | 4 +- netbox/circuits/forms/filtersets.py | 2 +- netbox/dcim/choices.py | 8 +- netbox/dcim/forms/common.py | 12 +- .../dcim/models/device_component_templates.py | 8 +- netbox/dcim/models/devices.py | 30 +- netbox/dcim/models/racks.py | 10 +- netbox/extras/models/customfields.py | 8 +- netbox/ipam/forms/model_forms.py | 6 +- netbox/ipam/models/ip.py | 28 +- netbox/ipam/models/vlans.py | 4 +- netbox/netbox/navigation/menu.py | 2 +- netbox/templates/dcim/devicebay_delete.html | 4 +- netbox/translations/en/LC_MESSAGES/django.po | 12322 ++++++++++++++++ netbox/users/forms/model_forms.py | 2 +- netbox/users/models.py | 2 +- netbox/virtualization/forms/model_forms.py | 8 +- netbox/virtualization/models/clusters.py | 9 +- netbox/wireless/models.py | 8 +- 19 files changed, 12408 insertions(+), 69 deletions(-) create mode 100644 netbox/translations/en/LC_MESSAGES/django.po diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index 5c7168318..4dd726803 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -154,12 +154,12 @@ class CircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilte provider_account_id = django_filters.ModelMultipleChoiceFilter( field_name='provider_account', queryset=ProviderAccount.objects.all(), - label=_('ProviderAccount (ID)'), + label=_('Provider account (ID)'), ) provider_network_id = django_filters.ModelMultipleChoiceFilter( field_name='terminations__provider_network', queryset=ProviderNetwork.objects.all(), - label=_('ProviderNetwork (ID)'), + label=_('Provider network (ID)'), ) type_id = django_filters.ModelMultipleChoiceFilter( queryset=CircuitType.objects.all(), diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 830c10d8b..a82ec1726 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -88,7 +88,7 @@ class ProviderNetworkFilterForm(NetBoxModelFilterSetForm): label=_('Provider') ) service_id = forms.CharField( - label=_('Service id'), + label=_('Service ID'), max_length=100, required=False ) diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index e1d4a330a..2ba24e0aa 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -80,10 +80,10 @@ class RackWidthChoices(ChoiceSet): WIDTH_23IN = 23 CHOICES = ( - (WIDTH_10IN, _('10 inches')), - (WIDTH_19IN, _('19 inches')), - (WIDTH_21IN, _('21 inches')), - (WIDTH_23IN, _('23 inches')), + (WIDTH_10IN, _('{n} inches').format(n=10)), + (WIDTH_19IN, _('{n} inches').format(n=19)), + (WIDTH_21IN, _('{n} inches').format(n=21)), + (WIDTH_23IN, _('{n} inches').format(n=23)), ) diff --git a/netbox/dcim/forms/common.py b/netbox/dcim/forms/common.py index 77543af12..3be4d08e8 100644 --- a/netbox/dcim/forms/common.py +++ b/netbox/dcim/forms/common.py @@ -116,17 +116,17 @@ class ModuleCommonForm(forms.Form): # It is not possible to adopt components already belonging to a module if adopt_components and existing_item and existing_item.module: raise forms.ValidationError( - _("Cannot adopt {name} '{resolved_name}' as it already belongs to a module").format( - name=template.component_model.__name__, - resolved_name=resolved_name + _("Cannot adopt {model} {name} as it already belongs to a module").format( + model=template.component_model.__name__, + name=resolved_name ) ) # If we are not adopting components we error if the component exists if not adopt_components and resolved_name in installed_components: raise forms.ValidationError( - _("{name} - {resolved_name} already exists").format( - name=template.component_model.__name__, - resolved_name=resolved_name + _("A {model} named {name} already exists").format( + model=template.component_model.__name__, + name=resolved_name ) ) diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index 86b6d85fe..5110835f4 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -534,14 +534,16 @@ class FrontPortTemplate(ModularComponentTemplateModel): # Validate rear port assignment if self.rear_port.device_type != self.device_type: raise ValidationError( - _("Rear port ({}) must belong to the same device type").format(self.rear_port) + _("Rear port ({name}) must belong to the same device type").format(name=self.rear_port) ) # Validate rear port position assignment if self.rear_port_position > self.rear_port.positions: raise ValidationError( - _("Invalid rear port position ({}); rear port {} has only {} positions").format( - self.rear_port_position, self.rear_port.name, self.rear_port.positions + _("Invalid rear port position ({position}); rear port {name} has only {count} positions").format( + position=self.rear_port_position, + name=self.rear_port.name, + count=self.rear_port.positions ) ) diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 943bf318c..07c1c70f6 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -302,8 +302,10 @@ class DeviceType(ImageAttachmentsMixin, PrimaryModel, WeightMixin): ) if d.position not in u_available: raise ValidationError({ - 'u_height': _("Device {} in rack {} does not have sufficient space to accommodate a height of " - "{}U").format(d, d.rack, self.u_height) + 'u_height': _( + "Device {device} in rack {rack} does not have sufficient space to accommodate a " + "height of {height}U" + ).format(device=d, rack=d.rack, height=self.u_height) }) # If modifying the height of an existing DeviceType to 0U, check for any instances assigned to a rack position. @@ -920,7 +922,7 @@ class Device( if self.primary_ip4: if self.primary_ip4.family != 4: raise ValidationError({ - 'primary_ip4': _("{primary_ip4} is not an IPv4 address.").format(primary_ip4=self.primary_ip4) + 'primary_ip4': _("{ip} is not an IPv4 address.").format(ip=self.primary_ip4) }) if self.primary_ip4.assigned_object in vc_interfaces: pass @@ -929,13 +931,13 @@ class Device( else: raise ValidationError({ 'primary_ip4': _( - "The specified IP address ({primary_ip4}) is not assigned to this device." - ).format(primary_ip4=self.primary_ip4) + "The specified IP address ({ip}) is not assigned to this device." + ).format(ip=self.primary_ip4) }) if self.primary_ip6: if self.primary_ip6.family != 6: raise ValidationError({ - 'primary_ip6': _("{primary_ip6} is not an IPv6 address.").format(primary_ip6=self.primary_ip6m) + 'primary_ip6': _("{ip} is not an IPv6 address.").format(ip=self.primary_ip6) }) if self.primary_ip6.assigned_object in vc_interfaces: pass @@ -944,8 +946,8 @@ class Device( else: raise ValidationError({ 'primary_ip6': _( - "The specified IP address ({primary_ip6}) is not assigned to this device." - ).format(primary_ip6=self.primary_ip6) + "The specified IP address ({ip}) is not assigned to this device." + ).format(ip=self.primary_ip6) }) if self.oob_ip: if self.oob_ip.assigned_object in vc_interfaces: @@ -963,17 +965,19 @@ class Device( raise ValidationError({ 'platform': _( "The assigned platform is limited to {platform_manufacturer} device types, but this device's " - "type belongs to {device_type_manufacturer}." + "type belongs to {devicetype_manufacturer}." ).format( platform_manufacturer=self.platform.manufacturer, - device_type_manufacturer=self.device_type.manufacturer + devicetype_manufacturer=self.device_type.manufacturer ) }) # A Device can only be assigned to a Cluster in the same Site (or no Site) if self.cluster and self.cluster.site is not None and self.cluster.site != self.site: raise ValidationError({ - 'cluster': _("The assigned cluster belongs to a different site ({})").format(self.cluster.site) + 'cluster': _("The assigned cluster belongs to a different site ({site})").format( + site=self.cluster.site + ) }) # Validate virtual chassis assignment @@ -1445,8 +1449,8 @@ class VirtualDeviceContext(PrimaryModel): if primary_ip.family != family: raise ValidationError({ f'primary_ip{family}': _( - "{primary_ip} is not an IPv{family} address." - ).format(family=family, primary_ip=primary_ip) + "{ip} is not an IPv{family} address." + ).format(family=family, ip=primary_ip) }) device_interfaces = self.device.vc_interfaces(if_master=False) if primary_ip.assigned_object not in device_interfaces: diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index ab1027d1b..0d4b844f9 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -562,9 +562,9 @@ class RackReservation(PrimaryModel): invalid_units = [u for u in self.units if u not in self.rack.units] if invalid_units: raise ValidationError({ - 'units': _("Invalid unit(s) for {}U rack: {}").format( - self.rack.u_height, - ', '.join([str(u) for u in invalid_units]), + 'units': _("Invalid unit(s) for {height}U rack: {unit_list}").format( + height=self.rack.u_height, + unit_list=', '.join([str(u) for u in invalid_units]) ), }) @@ -575,8 +575,8 @@ class RackReservation(PrimaryModel): conflicting_units = [u for u in self.units if u in reserved_units] if conflicting_units: raise ValidationError({ - 'units': _('The following units have already been reserved: {}').format( - ', '.join([str(u) for u in conflicting_units]), + 'units': _('The following units have already been reserved: {unit_list}').format( + unit_list=', '.join([str(u) for u in conflicting_units]) ) }) diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index 2bed464bb..2cb12ed5b 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -287,8 +287,8 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): except ValidationError as err: raise ValidationError({ 'default': _( - 'Invalid default value "{default}": {message}' - ).format(default=self.default, message=err.message) + 'Invalid default value "{value}": {error}' + ).format(value=self.default, error=err.message) }) # Minimum/maximum values can be set only for numeric fields @@ -332,8 +332,8 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): elif self.object_type: raise ValidationError({ 'object_type': _( - "{type_display} fields may not define an object type.") - .format(type_display=self.get_type_display()) + "{type} fields may not define an object type.") + .format(type=self.get_type_display()) }) def serialize(self, value): diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index bfd4f952d..dd9e6b3e4 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -372,14 +372,14 @@ class IPAddressForm(TenancyForm, NetBoxModelForm): # Do not allow assigning a network ID or broadcast address to an interface. if interface and (address := self.cleaned_data.get('address')): if address.ip == address.network: - msg = _("{address} is a network ID, which may not be assigned to an interface.").format(address=address) + msg = _("{ip} is a network ID, which may not be assigned to an interface.").format(ip=address.ip) if address.version == 4 and address.prefixlen not in (31, 32): raise ValidationError(msg) if address.version == 6 and address.prefixlen not in (127, 128): raise ValidationError(msg) if address.version == 4 and address.ip == address.broadcast and address.prefixlen not in (31, 32): - msg = _("{address} is a broadcast address, which may not be assigned to an interface.").format( - address=address + msg = _("{ip} is a broadcast address, which may not be assigned to an interface.").format( + ip=address.ip ) raise ValidationError(msg) diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index d176d3bff..934cb98c7 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -140,8 +140,11 @@ class Aggregate(GetAvailablePrefixesMixin, PrimaryModel): if covering_aggregates: raise ValidationError({ 'prefix': _( - "Aggregates cannot overlap. {} is already covered by an existing aggregate ({})." - ).format(self.prefix, covering_aggregates[0]) + "Aggregates cannot overlap. {prefix} is already covered by an existing aggregate ({aggregate})." + ).format( + prefix=self.prefix, + aggregate=covering_aggregates[0] + ) }) # Ensure that the aggregate being added does not cover an existing aggregate @@ -150,8 +153,11 @@ class Aggregate(GetAvailablePrefixesMixin, PrimaryModel): covered_aggregates = covered_aggregates.exclude(pk=self.pk) if covered_aggregates: raise ValidationError({ - 'prefix': _("Aggregates cannot overlap. {} covers an existing aggregate ({}).").format( - self.prefix, covered_aggregates[0] + 'prefix': _( + "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate ({aggregate})." + ).format( + prefix=self.prefix, + aggregate=covered_aggregates[0] ) }) @@ -314,10 +320,11 @@ class Prefix(GetAvailablePrefixesMixin, PrimaryModel): if (self.vrf is None and get_config().ENFORCE_GLOBAL_UNIQUE) or (self.vrf and self.vrf.enforce_unique): duplicate_prefixes = self.get_duplicates() if duplicate_prefixes: + table = _("VRF {vrf}").format(vrf=self.vrf) if self.vrf else _("global table") raise ValidationError({ - 'prefix': _("Duplicate prefix found in {}: {}").format( - _("VRF {}").format(self.vrf) if self.vrf else _("global table"), - duplicate_prefixes.first(), + 'prefix': _("Duplicate prefix found in {table}: {prefix}").format( + table=table, + prefix=duplicate_prefixes.first(), ) }) @@ -843,10 +850,11 @@ class IPAddress(PrimaryModel): self.role not in IPADDRESS_ROLES_NONUNIQUE or any(dip.role not in IPADDRESS_ROLES_NONUNIQUE for dip in duplicate_ips) ): + table = _("VRF {vrf}").format(vrf=self.vrf) if self.vrf else _("global table") raise ValidationError({ - 'address': _("Duplicate IP address found in {}: {}").format( - _("VRF {}").format(self.vrf) if self.vrf else _("global table"), - duplicate_ips.first(), + 'address': _("Duplicate IP address found in {table}: {ipaddress}").format( + table=table, + ipaddress=duplicate_ips.first(), ) }) diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index aa5b36a57..675d03ee5 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -234,8 +234,8 @@ class VLAN(PrimaryModel): if self.group and not self.group.min_vid <= self.vid <= self.group.max_vid: raise ValidationError({ 'vid': _( - "VID must be between {min_vid} and {max_vid} for VLANs in group {group}" - ).format(min_vid=self.group.min_vid, max_vid=self.group.max_vid, group=self.group) + "VID must be between {minimum} and {maximum} for VLANs in group {group}" + ).format(minimum=self.group.min_vid, maximum=self.group.max_vid, group=self.group) }) def get_status_color(self): diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 5b64cfc1e..961fd2035 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -1,4 +1,4 @@ -from django.utils.translation import gettext as _ +from django.utils.translation import gettext_lazy as _ from netbox.registry import registry from utilities.choices import ButtonColorChoices diff --git a/netbox/templates/dcim/devicebay_delete.html b/netbox/templates/dcim/devicebay_delete.html index 18f4f6576..9e54baa86 100644 --- a/netbox/templates/dcim/devicebay_delete.html +++ b/netbox/templates/dcim/devicebay_delete.html @@ -8,8 +8,8 @@ {% block message %}

      - {% blocktrans trimmed %} - Are you sure you want to delete this device bay from {{ devicebay.device }}? + {% blocktrans trimmed with device=devicebay.device %} + Are you sure you want to delete this device bay from {{ device }}? {% endblocktrans %}

      {% endblock %} diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po new file mode 100644 index 000000000..b04e843f2 --- /dev/null +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -0,0 +1,12322 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2023-10-30 17:19+0000\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"Language: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: account/tables.py:27 templates/account/token.html:23 +#: templates/users/token.html:18 users/forms/bulk_import.py:41 +#: users/forms/model_forms.py:113 +msgid "Key" +msgstr "" + +#: account/tables.py:31 users/forms/filtersets.py:135 +msgid "Write Enabled" +msgstr "" + +#: account/tables.py:34 core/tables/jobs.py:28 extras/choices.py:124 +#: extras/tables/tables.py:469 templates/account/token.html:44 +#: templates/core/job.html:52 templates/extras/configrevision.html:34 +#: templates/extras/configrevision_restore.html:12 +#: templates/extras/htmx/report_result.html:11 +#: templates/extras/htmx/script_result.html:12 +#: templates/extras/journalentry.html:25 templates/generic/object.html:48 +#: templates/users/token.html:36 +msgid "Created" +msgstr "" + +#: account/tables.py:37 templates/account/token.html:48 +#: templates/users/token.html:40 users/forms/bulk_edit.py:97 +#: users/forms/filtersets.py:139 +msgid "Expires" +msgstr "" + +#: account/tables.py:40 users/forms/filtersets.py:144 +msgid "Last Used" +msgstr "" + +#: account/tables.py:43 templates/account/token.html:56 +#: templates/users/token.html:48 users/forms/bulk_edit.py:102 +#: users/forms/model_forms.py:125 +msgid "Allowed IPs" +msgstr "" + +#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 +#: dcim/choices.py:174 dcim/choices.py:220 dcim/choices.py:1419 +#: dcim/choices.py:1495 dcim/choices.py:1545 virtualization/choices.py:20 +#: virtualization/choices.py:45 +msgid "Planned" +msgstr "" + +#: circuits/choices.py:22 netbox/navigation/menu.py:271 +msgid "Provisioning" +msgstr "" + +#: circuits/choices.py:23 dcim/choices.py:22 dcim/choices.py:103 +#: dcim/choices.py:173 dcim/choices.py:219 dcim/choices.py:1494 +#: dcim/choices.py:1544 extras/tables/tables.py:375 ipam/choices.py:31 +#: ipam/choices.py:49 ipam/choices.py:69 ipam/choices.py:154 +#: templates/extras/configcontext.html:26 templates/users/user.html:34 +#: users/forms/bulk_edit.py:36 virtualization/choices.py:22 +#: virtualization/choices.py:44 wireless/choices.py:25 +msgid "Active" +msgstr "" + +#: circuits/choices.py:24 dcim/choices.py:172 dcim/choices.py:218 +#: dcim/choices.py:1493 dcim/choices.py:1546 virtualization/choices.py:24 +#: virtualization/choices.py:43 +msgid "Offline" +msgstr "" + +#: circuits/choices.py:25 +msgid "Deprovisioning" +msgstr "" + +#: circuits/choices.py:26 +msgid "Decommissioned" +msgstr "" + +#: circuits/filtersets.py:29 circuits/filtersets.py:182 dcim/filtersets.py:118 +#: dcim/filtersets.py:179 dcim/filtersets.py:254 dcim/filtersets.py:362 +#: dcim/filtersets.py:873 dcim/filtersets.py:1179 dcim/filtersets.py:1674 +#: dcim/filtersets.py:1847 dcim/filtersets.py:1904 ipam/filtersets.py:304 +#: ipam/filtersets.py:891 ipam/filtersets.py:1122 +#: virtualization/filtersets.py:43 virtualization/filtersets.py:169 +msgid "Region (ID)" +msgstr "" + +#: circuits/filtersets.py:36 circuits/filtersets.py:189 dcim/filtersets.py:124 +#: dcim/filtersets.py:186 dcim/filtersets.py:261 dcim/filtersets.py:369 +#: dcim/filtersets.py:880 dcim/filtersets.py:1186 dcim/filtersets.py:1681 +#: dcim/filtersets.py:1854 dcim/filtersets.py:1911 extras/filtersets.py:383 +#: ipam/filtersets.py:311 ipam/filtersets.py:898 ipam/filtersets.py:1117 +#: virtualization/filtersets.py:50 virtualization/filtersets.py:176 +msgid "Region (slug)" +msgstr "" + +#: circuits/filtersets.py:42 circuits/filtersets.py:195 dcim/filtersets.py:192 +#: dcim/filtersets.py:267 dcim/filtersets.py:375 dcim/filtersets.py:886 +#: dcim/filtersets.py:1192 dcim/filtersets.py:1687 dcim/filtersets.py:1860 +#: dcim/filtersets.py:1917 ipam/filtersets.py:317 ipam/filtersets.py:904 +#: virtualization/filtersets.py:56 virtualization/filtersets.py:182 +msgid "Site group (ID)" +msgstr "" + +#: circuits/filtersets.py:49 circuits/filtersets.py:202 dcim/filtersets.py:199 +#: dcim/filtersets.py:274 dcim/filtersets.py:382 dcim/filtersets.py:893 +#: dcim/filtersets.py:1199 dcim/filtersets.py:1694 dcim/filtersets.py:1867 +#: dcim/filtersets.py:1924 extras/filtersets.py:389 ipam/filtersets.py:324 +#: ipam/filtersets.py:911 virtualization/filtersets.py:63 +#: virtualization/filtersets.py:189 +msgid "Site group (slug)" +msgstr "" + +#: circuits/filtersets.py:54 circuits/forms/bulk_import.py:117 +#: circuits/forms/filtersets.py:47 circuits/forms/filtersets.py:170 +#: circuits/forms/model_forms.py:137 dcim/forms/bulk_edit.py:166 +#: dcim/forms/bulk_edit.py:238 dcim/forms/bulk_edit.py:570 +#: dcim/forms/bulk_edit.py:763 dcim/forms/bulk_import.py:130 +#: dcim/forms/bulk_import.py:176 dcim/forms/bulk_import.py:249 +#: dcim/forms/bulk_import.py:477 dcim/forms/bulk_import.py:1239 +#: dcim/forms/bulk_import.py:1267 dcim/forms/filtersets.py:83 +#: dcim/forms/filtersets.py:215 dcim/forms/filtersets.py:261 +#: dcim/forms/filtersets.py:370 dcim/forms/filtersets.py:673 +#: dcim/forms/filtersets.py:903 dcim/forms/filtersets.py:927 +#: dcim/forms/filtersets.py:1016 dcim/forms/filtersets.py:1054 +#: dcim/forms/filtersets.py:1459 dcim/forms/filtersets.py:1483 +#: dcim/forms/filtersets.py:1507 dcim/forms/model_forms.py:138 +#: dcim/forms/model_forms.py:167 dcim/forms/model_forms.py:211 +#: dcim/forms/model_forms.py:397 dcim/forms/model_forms.py:629 +#: dcim/forms/object_create.py:357 dcim/tables/devices.py:186 +#: dcim/tables/power.py:26 dcim/tables/racks.py:62 dcim/tables/racks.py:138 +#: dcim/tables/sites.py:129 extras/filtersets.py:399 +#: ipam/forms/bulk_edit.py:217 ipam/forms/bulk_edit.py:271 +#: ipam/forms/bulk_edit.py:449 ipam/forms/bulk_edit.py:521 +#: ipam/forms/bulk_import.py:173 ipam/forms/bulk_import.py:440 +#: ipam/forms/filtersets.py:156 ipam/forms/filtersets.py:230 +#: ipam/forms/filtersets.py:420 ipam/forms/filtersets.py:472 +#: ipam/forms/filtersets.py:585 ipam/forms/model_forms.py:208 +#: ipam/forms/model_forms.py:550 ipam/forms/model_forms.py:642 +#: ipam/tables/ip.py:244 ipam/tables/vlans.py:114 ipam/tables/vlans.py:216 +#: templates/circuits/circuittermination_edit.html:20 +#: templates/circuits/inc/circuit_termination.html:33 +#: templates/dcim/device.html:30 templates/dcim/inc/cable_termination.html:8 +#: templates/dcim/inc/cable_termination.html:33 templates/dcim/location.html:40 +#: templates/dcim/powerpanel.html:23 templates/dcim/rack.html:18 +#: templates/dcim/rackreservation.html:25 templates/dcim/site.html:26 +#: templates/ipam/prefix.html:48 templates/ipam/vlan.html:17 +#: templates/ipam/vlan_edit.html:40 templates/virtualization/cluster.html:45 +#: templates/virtualization/virtualmachine.html:96 +#: virtualization/forms/bulk_edit.py:88 virtualization/forms/bulk_edit.py:97 +#: virtualization/forms/bulk_edit.py:106 virtualization/forms/bulk_edit.py:121 +#: virtualization/forms/bulk_import.py:58 +#: virtualization/forms/bulk_import.py:84 virtualization/forms/filtersets.py:75 +#: virtualization/forms/filtersets.py:141 +#: virtualization/forms/model_forms.py:73 +#: virtualization/forms/model_forms.py:106 +#: virtualization/forms/model_forms.py:173 virtualization/tables/clusters.py:77 +#: virtualization/tables/virtualmachines.py:51 wireless/forms/model_forms.py:77 +#: wireless/forms/model_forms.py:117 +msgid "Site" +msgstr "" + +#: circuits/filtersets.py:60 circuits/filtersets.py:213 +#: circuits/filtersets.py:250 dcim/filtersets.py:209 dcim/filtersets.py:284 +#: dcim/filtersets.py:356 extras/filtersets.py:405 ipam/filtersets.py:215 +#: ipam/filtersets.py:334 ipam/filtersets.py:921 ipam/filtersets.py:1127 +#: virtualization/filtersets.py:73 virtualization/filtersets.py:199 +msgid "Site (slug)" +msgstr "" + +#: circuits/filtersets.py:65 +msgid "ASN (ID)" +msgstr "" + +#: circuits/filtersets.py:86 circuits/filtersets.py:112 +#: circuits/filtersets.py:146 +msgid "Provider (ID)" +msgstr "" + +#: circuits/filtersets.py:92 circuits/filtersets.py:118 +#: circuits/filtersets.py:152 +msgid "Provider (slug)" +msgstr "" + +#: circuits/filtersets.py:157 +msgid "Provider account (ID)" +msgstr "" + +#: circuits/filtersets.py:162 +msgid "Provider network (ID)" +msgstr "" + +#: circuits/filtersets.py:166 +msgid "Circuit type (ID)" +msgstr "" + +#: circuits/filtersets.py:172 +msgid "Circuit type (slug)" +msgstr "" + +#: circuits/filtersets.py:207 circuits/filtersets.py:244 dcim/filtersets.py:203 +#: dcim/filtersets.py:278 dcim/filtersets.py:350 dcim/filtersets.py:897 +#: dcim/filtersets.py:1204 dcim/filtersets.py:1699 dcim/filtersets.py:1871 +#: dcim/filtersets.py:1929 ipam/filtersets.py:209 ipam/filtersets.py:328 +#: ipam/filtersets.py:915 ipam/filtersets.py:1132 +#: virtualization/filtersets.py:67 virtualization/filtersets.py:193 +msgid "Site (ID)" +msgstr "" + +#: circuits/filtersets.py:236 core/filtersets.py:72 dcim/filtersets.py:631 +#: dcim/filtersets.py:1173 dcim/filtersets.py:1975 extras/filtersets.py:40 +#: extras/filtersets.py:69 extras/filtersets.py:108 extras/filtersets.py:137 +#: extras/filtersets.py:164 extras/filtersets.py:195 extras/filtersets.py:264 +#: extras/filtersets.py:312 extras/filtersets.py:372 extras/filtersets.py:531 +#: extras/filtersets.py:573 extras/filtersets.py:614 extras/filtersets.py:637 +#: ipam/forms/model_forms.py:432 netbox/filtersets.py:275 +#: netbox/forms/__init__.py:23 netbox/forms/base.py:151 +#: templates/htmx/object_selector.html:28 templates/inc/filter_list.html:53 +#: templates/ipam/ipaddress_assign.html:32 templates/search.html:7 +#: templates/search.html:26 tenancy/filtersets.py:87 users/filtersets.py:21 +#: users/filtersets.py:37 users/filtersets.py:69 users/filtersets.py:117 +#: utilities/forms/forms.py:99 +msgid "Search" +msgstr "" + +#: circuits/filtersets.py:240 circuits/forms/bulk_edit.py:167 +#: circuits/forms/model_forms.py:110 circuits/forms/model_forms.py:132 +#: dcim/forms/connections.py:66 templates/circuits/circuit.html:15 +#: templates/dcim/inc/cable_termination.html:55 +#: templates/dcim/trace/circuit.html:4 +msgid "Circuit" +msgstr "" + +#: circuits/filtersets.py:254 +msgid "ProviderNetwork (ID)" +msgstr "" + +#: circuits/forms/bulk_edit.py:25 circuits/forms/filtersets.py:56 +#: circuits/forms/model_forms.py:26 circuits/tables/providers.py:33 +#: dcim/forms/bulk_edit.py:126 dcim/forms/filtersets.py:185 +#: dcim/forms/model_forms.py:126 dcim/tables/sites.py:94 +#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:221 +#: netbox/navigation/menu.py:160 netbox/navigation/menu.py:163 +#: templates/circuits/provider.html:24 +msgid "ASNs" +msgstr "" + +#: circuits/forms/bulk_edit.py:29 circuits/forms/bulk_edit.py:51 +#: circuits/forms/bulk_edit.py:78 circuits/forms/bulk_edit.py:99 +#: circuits/forms/bulk_edit.py:159 core/forms/bulk_edit.py:27 +#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:71 +#: dcim/forms/bulk_edit.py:90 dcim/forms/bulk_edit.py:149 +#: dcim/forms/bulk_edit.py:190 dcim/forms/bulk_edit.py:208 +#: dcim/forms/bulk_edit.py:336 dcim/forms/bulk_edit.py:371 +#: dcim/forms/bulk_edit.py:386 dcim/forms/bulk_edit.py:445 +#: dcim/forms/bulk_edit.py:484 dcim/forms/bulk_edit.py:514 +#: dcim/forms/bulk_edit.py:538 dcim/forms/bulk_edit.py:608 +#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:709 +#: dcim/forms/bulk_edit.py:732 dcim/forms/bulk_edit.py:780 +#: dcim/forms/bulk_edit.py:850 dcim/forms/bulk_edit.py:903 +#: dcim/forms/bulk_edit.py:938 dcim/forms/bulk_edit.py:978 +#: dcim/forms/bulk_edit.py:1022 dcim/forms/bulk_edit.py:1067 +#: dcim/forms/bulk_edit.py:1094 dcim/forms/bulk_edit.py:1112 +#: dcim/forms/bulk_edit.py:1130 dcim/forms/bulk_edit.py:1148 +#: dcim/forms/bulk_edit.py:1566 extras/forms/bulk_edit.py:35 +#: extras/forms/bulk_edit.py:118 extras/forms/bulk_edit.py:147 +#: extras/forms/bulk_edit.py:242 extras/forms/bulk_edit.py:266 +#: extras/forms/bulk_edit.py:280 extras/tables/tables.py:78 +#: ipam/forms/bulk_edit.py:52 ipam/forms/bulk_edit.py:72 +#: ipam/forms/bulk_edit.py:92 ipam/forms/bulk_edit.py:116 +#: ipam/forms/bulk_edit.py:145 ipam/forms/bulk_edit.py:174 +#: ipam/forms/bulk_edit.py:193 ipam/forms/bulk_edit.py:262 +#: ipam/forms/bulk_edit.py:306 ipam/forms/bulk_edit.py:354 +#: ipam/forms/bulk_edit.py:397 ipam/forms/bulk_edit.py:425 +#: ipam/forms/bulk_edit.py:553 ipam/forms/bulk_edit.py:584 +#: ipam/forms/bulk_edit.py:613 templates/account/token.html:36 +#: templates/circuits/circuit.html:60 templates/circuits/circuittype.html:29 +#: templates/circuits/inc/circuit_termination.html:115 +#: templates/circuits/provider.html:34 +#: templates/circuits/providernetwork.html:35 templates/core/datasource.html:55 +#: templates/dcim/cable.html:37 templates/dcim/consoleport.html:47 +#: templates/dcim/consoleserverport.html:47 templates/dcim/device.html:113 +#: templates/dcim/devicebay.html:35 templates/dcim/devicerole.html:33 +#: templates/dcim/devicetype.html:36 templates/dcim/frontport.html:61 +#: templates/dcim/interface.html:70 templates/dcim/inventoryitem.html:61 +#: templates/dcim/inventoryitemrole.html:23 templates/dcim/location.html:36 +#: templates/dcim/manufacturer.html:43 templates/dcim/module.html:71 +#: templates/dcim/modulebay.html:39 templates/dcim/moduletype.html:27 +#: templates/dcim/platform.html:36 templates/dcim/powerfeed.html:43 +#: templates/dcim/poweroutlet.html:43 templates/dcim/powerpanel.html:31 +#: templates/dcim/powerport.html:43 templates/dcim/rack.html:61 +#: templates/dcim/rackreservation.html:69 templates/dcim/rackrole.html:29 +#: templates/dcim/rearport.html:57 templates/dcim/region.html:34 +#: templates/dcim/site.html:73 templates/dcim/sitegroup.html:34 +#: templates/dcim/virtualchassis.html:32 +#: templates/extras/admin/plugins_list.html:26 +#: templates/extras/configcontext.html:22 +#: templates/extras/configtemplate.html:18 templates/extras/customfield.html:35 +#: templates/extras/dashboard/widget_add.html:14 +#: templates/extras/exporttemplate.html:25 templates/extras/report_list.html:47 +#: templates/extras/savedfilter.html:18 templates/extras/script_list.html:53 +#: templates/extras/tag.html:23 templates/generic/bulk_import.html:118 +#: templates/ipam/aggregate.html:44 templates/ipam/asn.html:43 +#: templates/ipam/asnrange.html:39 templates/ipam/fhrpgroup.html:35 +#: templates/ipam/ipaddress.html:58 templates/ipam/iprange.html:70 +#: templates/ipam/l2vpn.html:27 templates/ipam/prefix.html:82 +#: templates/ipam/rir.html:29 templates/ipam/role.html:29 +#: templates/ipam/routetarget.html:22 templates/ipam/service.html:53 +#: templates/ipam/servicetemplate.html:28 templates/ipam/vlan.html:65 +#: templates/ipam/vlangroup.html:35 templates/ipam/vrf.html:36 +#: templates/tenancy/contact.html:68 templates/tenancy/contactgroup.html:28 +#: templates/tenancy/contactrole.html:23 templates/tenancy/tenant.html:25 +#: templates/tenancy/tenantgroup.html:36 +#: templates/users/objectpermission.html:22 templates/users/token.html:28 +#: templates/virtualization/cluster.html:28 +#: templates/virtualization/clustergroup.html:29 +#: templates/virtualization/clustertype.html:29 +#: templates/virtualization/virtualmachine.html:34 +#: templates/virtualization/vminterface.html:54 +#: templates/wireless/wirelesslan.html:27 +#: templates/wireless/wirelesslangroup.html:34 +#: templates/wireless/wirelesslink.html:37 tenancy/forms/bulk_edit.py:31 +#: tenancy/forms/bulk_edit.py:79 tenancy/forms/bulk_edit.py:121 +#: users/forms/bulk_edit.py:62 users/forms/bulk_edit.py:92 +#: virtualization/forms/bulk_edit.py:29 virtualization/forms/bulk_edit.py:43 +#: virtualization/forms/bulk_edit.py:174 virtualization/forms/bulk_edit.py:225 +#: wireless/forms/bulk_edit.py:28 wireless/forms/bulk_edit.py:81 +#: wireless/forms/bulk_edit.py:128 +msgid "Description" +msgstr "" + +#: circuits/forms/bulk_edit.py:46 circuits/forms/bulk_edit.py:68 +#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:35 +#: circuits/forms/bulk_import.py:50 circuits/forms/bulk_import.py:76 +#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 +#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:130 +#: circuits/forms/model_forms.py:32 circuits/forms/model_forms.py:44 +#: circuits/forms/model_forms.py:58 circuits/forms/model_forms.py:92 +#: circuits/tables/circuits.py:55 circuits/tables/providers.py:72 +#: circuits/tables/providers.py:103 templates/circuits/circuit.html:19 +#: templates/circuits/provider.html:20 +#: templates/circuits/provideraccount.html:21 +#: templates/circuits/providernetwork.html:23 +#: templates/dcim/inc/cable_termination.html:51 +msgid "Provider" +msgstr "" + +#: circuits/forms/bulk_edit.py:75 circuits/forms/filtersets.py:91 +#: templates/circuits/providernetwork.html:31 +msgid "Service ID" +msgstr "" + +#: circuits/forms/bulk_edit.py:95 circuits/forms/filtersets.py:107 +#: dcim/forms/bulk_edit.py:204 dcim/forms/bulk_edit.py:500 +#: dcim/forms/bulk_edit.py:694 dcim/forms/bulk_edit.py:1063 +#: dcim/forms/bulk_edit.py:1090 dcim/forms/bulk_edit.py:1562 +#: dcim/forms/filtersets.py:970 dcim/forms/filtersets.py:1344 +#: dcim/forms/filtersets.py:1365 dcim/tables/devices.py:700 +#: dcim/tables/devices.py:760 dcim/tables/devices.py:983 +#: dcim/tables/devicetypes.py:245 dcim/tables/devicetypes.py:260 +#: dcim/tables/racks.py:32 extras/forms/bulk_edit.py:238 +#: extras/tables/tables.py:323 templates/circuits/circuittype.html:33 +#: templates/dcim/cable.html:41 templates/dcim/devicerole.html:37 +#: templates/dcim/frontport.html:43 templates/dcim/inventoryitemrole.html:27 +#: templates/dcim/rackrole.html:33 templates/dcim/rearport.html:43 +#: templates/extras/tag.html:29 +msgid "Color" +msgstr "" + +#: circuits/forms/bulk_edit.py:113 circuits/forms/bulk_import.py:89 +#: circuits/forms/filtersets.py:125 core/forms/bulk_edit.py:17 +#: core/forms/filtersets.py:30 core/tables/data.py:20 core/tables/jobs.py:18 +#: dcim/forms/bulk_edit.py:281 dcim/forms/bulk_edit.py:672 +#: dcim/forms/bulk_edit.py:811 dcim/forms/bulk_edit.py:879 +#: dcim/forms/bulk_edit.py:898 dcim/forms/bulk_edit.py:921 +#: dcim/forms/bulk_edit.py:963 dcim/forms/bulk_edit.py:1007 +#: dcim/forms/bulk_edit.py:1058 dcim/forms/bulk_edit.py:1085 +#: dcim/forms/bulk_import.py:206 dcim/forms/bulk_import.py:645 +#: dcim/forms/bulk_import.py:671 dcim/forms/bulk_import.py:697 +#: dcim/forms/bulk_import.py:717 dcim/forms/bulk_import.py:800 +#: dcim/forms/bulk_import.py:890 dcim/forms/bulk_import.py:932 +#: dcim/forms/bulk_import.py:1145 dcim/forms/bulk_import.py:1304 +#: dcim/forms/filtersets.py:283 dcim/forms/filtersets.py:860 +#: dcim/forms/filtersets.py:960 dcim/forms/filtersets.py:1080 +#: dcim/forms/filtersets.py:1150 dcim/forms/filtersets.py:1172 +#: dcim/forms/filtersets.py:1194 dcim/forms/filtersets.py:1211 +#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1339 +#: dcim/forms/filtersets.py:1360 dcim/forms/object_import.py:89 +#: dcim/forms/object_import.py:118 dcim/forms/object_import.py:150 +#: dcim/tables/devices.py:211 dcim/tables/devices.py:816 +#: dcim/tables/power.py:77 extras/forms/bulk_import.py:37 +#: extras/tables/tables.py:345 extras/tables/tables.py:443 +#: ipam/forms/bulk_edit.py:603 ipam/forms/bulk_import.py:524 +#: ipam/forms/filtersets.py:537 netbox/tables/tables.py:225 +#: templates/circuits/circuit.html:31 templates/core/datasource.html:39 +#: templates/dcim/cable.html:16 templates/dcim/consoleport.html:39 +#: templates/dcim/consoleserverport.html:39 templates/dcim/frontport.html:39 +#: templates/dcim/interface.html:47 templates/dcim/interface.html:171 +#: templates/dcim/interface.html:319 templates/dcim/powerfeed.html:35 +#: templates/dcim/poweroutlet.html:39 templates/dcim/powerport.html:39 +#: templates/dcim/rack.html:88 templates/dcim/rearport.html:39 +#: templates/ipam/l2vpn.html:23 templates/virtualization/cluster.html:20 +#: templates/wireless/inc/authentication_attrs.html:9 +#: templates/wireless/inc/wirelesslink_interface.html:14 +#: virtualization/forms/bulk_edit.py:57 virtualization/forms/bulk_import.py:40 +#: virtualization/forms/filtersets.py:50 virtualization/forms/model_forms.py:64 +#: virtualization/tables/clusters.py:66 +msgid "Type" +msgstr "" + +#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:82 +#: circuits/forms/filtersets.py:138 circuits/forms/model_forms.py:97 +msgid "Provider account" +msgstr "" + +#: circuits/forms/bulk_edit.py:131 circuits/forms/bulk_import.py:95 +#: circuits/forms/filtersets.py:149 core/forms/filtersets.py:35 +#: core/forms/filtersets.py:76 core/tables/data.py:23 core/tables/jobs.py:25 +#: dcim/forms/bulk_edit.py:104 dcim/forms/bulk_edit.py:179 +#: dcim/forms/bulk_edit.py:260 dcim/forms/bulk_edit.py:593 +#: dcim/forms/bulk_edit.py:646 dcim/forms/bulk_edit.py:678 +#: dcim/forms/bulk_edit.py:805 dcim/forms/bulk_edit.py:1585 +#: dcim/forms/bulk_import.py:87 dcim/forms/bulk_import.py:146 +#: dcim/forms/bulk_import.py:194 dcim/forms/bulk_import.py:442 +#: dcim/forms/bulk_import.py:596 dcim/forms/bulk_import.py:1139 +#: dcim/forms/bulk_import.py:1299 dcim/forms/filtersets.py:168 +#: dcim/forms/filtersets.py:227 dcim/forms/filtersets.py:278 +#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:828 +#: dcim/forms/filtersets.py:864 dcim/forms/filtersets.py:965 +#: dcim/forms/filtersets.py:1075 dcim/tables/devices.py:173 +#: dcim/tables/devices.py:819 dcim/tables/devices.py:1043 +#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:66 +#: dcim/tables/sites.py:82 dcim/tables/sites.py:133 ipam/forms/bulk_edit.py:242 +#: ipam/forms/bulk_edit.py:291 ipam/forms/bulk_edit.py:339 +#: ipam/forms/bulk_edit.py:543 ipam/forms/bulk_import.py:194 +#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 +#: ipam/forms/bulk_import.py:461 ipam/forms/filtersets.py:209 +#: ipam/forms/filtersets.py:274 ipam/forms/filtersets.py:344 +#: ipam/forms/filtersets.py:484 ipam/forms/model_forms.py:451 +#: ipam/tables/ip.py:236 ipam/tables/ip.py:309 ipam/tables/ip.py:359 +#: ipam/tables/ip.py:421 ipam/tables/ip.py:448 ipam/tables/vlans.py:122 +#: ipam/tables/vlans.py:227 templates/circuits/circuit.html:35 +#: templates/core/datasource.html:47 templates/core/job.html:35 +#: templates/dcim/cable.html:20 templates/dcim/device.html:200 +#: templates/dcim/location.html:48 templates/dcim/module.html:67 +#: templates/dcim/powerfeed.html:39 templates/dcim/rack.html:53 +#: templates/dcim/site.html:56 templates/extras/report_list.html:49 +#: templates/extras/script_list.html:55 templates/ipam/ipaddress.html:40 +#: templates/ipam/iprange.html:57 templates/ipam/prefix.html:74 +#: templates/ipam/vlan.html:51 templates/virtualization/cluster.html:24 +#: templates/virtualization/virtualmachine.html:22 +#: templates/wireless/wirelesslan.html:23 +#: templates/wireless/wirelesslink.html:20 users/forms/filtersets.py:35 +#: users/forms/model_forms.py:196 virtualization/forms/bulk_edit.py:67 +#: virtualization/forms/bulk_edit.py:115 virtualization/forms/bulk_import.py:53 +#: virtualization/forms/bulk_import.py:79 virtualization/forms/filtersets.py:58 +#: virtualization/forms/filtersets.py:153 virtualization/tables/clusters.py:74 +#: virtualization/tables/virtualmachines.py:48 wireless/forms/bulk_edit.py:42 +#: wireless/forms/bulk_edit.py:104 wireless/forms/bulk_import.py:43 +#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:48 +#: wireless/forms/filtersets.py:82 wireless/tables/wirelesslan.py:52 +#: wireless/tables/wirelesslink.py:19 +msgid "Status" +msgstr "" + +#: circuits/forms/bulk_edit.py:137 circuits/forms/bulk_import.py:100 +#: circuits/forms/filtersets.py:119 dcim/forms/bulk_edit.py:120 +#: dcim/forms/bulk_edit.py:185 dcim/forms/bulk_edit.py:255 +#: dcim/forms/bulk_edit.py:366 dcim/forms/bulk_edit.py:583 +#: dcim/forms/bulk_edit.py:684 dcim/forms/bulk_edit.py:1590 +#: dcim/forms/bulk_import.py:106 dcim/forms/bulk_import.py:151 +#: dcim/forms/bulk_import.py:187 dcim/forms/bulk_import.py:274 +#: dcim/forms/bulk_import.py:416 dcim/forms/bulk_import.py:1151 +#: dcim/forms/bulk_import.py:1356 dcim/forms/filtersets.py:164 +#: dcim/forms/filtersets.py:195 dcim/forms/filtersets.py:246 +#: dcim/forms/filtersets.py:330 dcim/forms/filtersets.py:351 +#: dcim/forms/filtersets.py:647 dcim/forms/filtersets.py:819 +#: dcim/forms/filtersets.py:884 dcim/forms/filtersets.py:914 +#: dcim/forms/filtersets.py:1035 dcim/tables/power.py:88 +#: extras/filtersets.py:486 extras/forms/filtersets.py:306 +#: extras/forms/filtersets.py:380 ipam/forms/bulk_edit.py:42 +#: ipam/forms/bulk_edit.py:67 ipam/forms/bulk_edit.py:111 +#: ipam/forms/bulk_edit.py:140 ipam/forms/bulk_edit.py:165 +#: ipam/forms/bulk_edit.py:237 ipam/forms/bulk_edit.py:286 +#: ipam/forms/bulk_edit.py:334 ipam/forms/bulk_edit.py:538 +#: ipam/forms/bulk_edit.py:608 ipam/forms/bulk_import.py:40 +#: ipam/forms/bulk_import.py:69 ipam/forms/bulk_import.py:97 +#: ipam/forms/bulk_import.py:117 ipam/forms/bulk_import.py:137 +#: ipam/forms/bulk_import.py:166 ipam/forms/bulk_import.py:252 +#: ipam/forms/bulk_import.py:288 ipam/forms/bulk_import.py:454 +#: ipam/forms/bulk_import.py:518 ipam/forms/filtersets.py:51 +#: ipam/forms/filtersets.py:71 ipam/forms/filtersets.py:103 +#: ipam/forms/filtersets.py:123 ipam/forms/filtersets.py:146 +#: ipam/forms/filtersets.py:173 ipam/forms/filtersets.py:260 +#: ipam/forms/filtersets.py:300 ipam/forms/filtersets.py:453 +#: ipam/forms/filtersets.py:534 ipam/tables/ip.py:451 ipam/tables/vlans.py:224 +#: templates/circuits/circuit.html:39 templates/dcim/cable.html:24 +#: templates/dcim/device.html:98 templates/dcim/location.html:52 +#: templates/dcim/powerfeed.html:47 templates/dcim/rack.html:44 +#: templates/dcim/rackreservation.html:56 templates/dcim/site.html:60 +#: templates/dcim/virtualdevicecontext.html:55 templates/ipam/aggregate.html:31 +#: templates/ipam/asn.html:34 templates/ipam/asnrange.html:30 +#: templates/ipam/ipaddress.html:31 templates/ipam/iprange.html:61 +#: templates/ipam/l2vpn.html:31 templates/ipam/prefix.html:29 +#: templates/ipam/routetarget.html:18 templates/ipam/vlan.html:42 +#: templates/ipam/vrf.html:23 templates/tenancy/tenant.html:17 +#: templates/virtualization/cluster.html:36 +#: templates/virtualization/virtualmachine.html:38 +#: templates/wireless/wirelesslan.html:35 +#: templates/wireless/wirelesslink.html:28 tenancy/forms/forms.py:25 +#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:56 +#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:73 +#: virtualization/forms/bulk_edit.py:152 virtualization/forms/bulk_import.py:65 +#: virtualization/forms/bulk_import.py:114 +#: virtualization/forms/filtersets.py:44 virtualization/forms/filtersets.py:98 +#: wireless/forms/bulk_edit.py:62 wireless/forms/bulk_edit.py:109 +#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 +#: wireless/forms/filtersets.py:34 wireless/forms/filtersets.py:74 +msgid "Tenant" +msgstr "" + +#: circuits/forms/bulk_edit.py:142 circuits/forms/filtersets.py:173 +msgid "Install date" +msgstr "" + +#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:178 +msgid "Termination date" +msgstr "" + +#: circuits/forms/bulk_edit.py:153 circuits/forms/filtersets.py:185 +msgid "Commit rate (Kbps)" +msgstr "" + +#: circuits/forms/bulk_edit.py:168 circuits/forms/model_forms.py:111 +msgid "Service Parameters" +msgstr "" + +#: circuits/forms/bulk_edit.py:169 circuits/forms/model_forms.py:112 +#: dcim/forms/model_forms.py:141 dcim/forms/model_forms.py:183 +#: dcim/forms/model_forms.py:260 dcim/forms/model_forms.py:671 +#: dcim/forms/model_forms.py:1477 ipam/forms/model_forms.py:63 +#: ipam/forms/model_forms.py:116 ipam/forms/model_forms.py:137 +#: ipam/forms/model_forms.py:161 ipam/forms/model_forms.py:233 +#: ipam/forms/model_forms.py:259 ipam/forms/model_forms.py:781 +#: netbox/navigation/menu.py:38 templates/dcim/cable_edit.html:68 +#: templates/dcim/device_edit.html:85 templates/dcim/rack_edit.html:30 +#: templates/ipam/ipaddress_bulk_add.html:27 +#: templates/ipam/ipaddress_edit.html:27 templates/ipam/vlan_edit.html:22 +#: virtualization/forms/model_forms.py:82 +#: virtualization/forms/model_forms.py:223 wireless/forms/model_forms.py:55 +#: wireless/forms/model_forms.py:160 +msgid "Tenancy" +msgstr "" + +#: circuits/forms/bulk_import.py:38 circuits/forms/bulk_import.py:53 +#: circuits/forms/bulk_import.py:79 +msgid "Assigned provider" +msgstr "" + +#: circuits/forms/bulk_import.py:70 dcim/forms/bulk_import.py:170 +#: dcim/forms/bulk_import.py:380 dcim/forms/bulk_import.py:1092 +#: dcim/forms/bulk_import.py:1171 extras/forms/bulk_import.py:167 +msgid "RGB color in hexadecimal. Example:" +msgstr "" + +#: circuits/forms/bulk_import.py:85 +msgid "Assigned provider account" +msgstr "" + +#: circuits/forms/bulk_import.py:92 +msgid "Type of circuit" +msgstr "" + +#: circuits/forms/bulk_import.py:97 dcim/forms/bulk_import.py:89 +#: dcim/forms/bulk_import.py:148 dcim/forms/bulk_import.py:196 +#: dcim/forms/bulk_import.py:444 dcim/forms/bulk_import.py:598 +#: dcim/forms/bulk_import.py:1301 ipam/forms/bulk_import.py:196 +#: ipam/forms/bulk_import.py:261 ipam/forms/bulk_import.py:297 +#: ipam/forms/bulk_import.py:463 virtualization/forms/bulk_import.py:55 +#: virtualization/forms/bulk_import.py:81 +msgid "Operational status" +msgstr "" + +#: circuits/forms/bulk_import.py:104 dcim/forms/bulk_import.py:110 +#: dcim/forms/bulk_import.py:155 dcim/forms/bulk_import.py:278 +#: dcim/forms/bulk_import.py:420 dcim/forms/bulk_import.py:1155 +#: dcim/forms/bulk_import.py:1296 ipam/forms/bulk_import.py:44 +#: ipam/forms/bulk_import.py:73 ipam/forms/bulk_import.py:101 +#: ipam/forms/bulk_import.py:121 ipam/forms/bulk_import.py:141 +#: ipam/forms/bulk_import.py:170 ipam/forms/bulk_import.py:256 +#: ipam/forms/bulk_import.py:292 ipam/forms/bulk_import.py:458 +#: virtualization/forms/bulk_import.py:69 +#: virtualization/forms/bulk_import.py:118 wireless/forms/bulk_import.py:59 +#: wireless/forms/bulk_import.py:101 +msgid "Assigned tenant" +msgstr "" + +#: circuits/forms/bulk_import.py:123 circuits/forms/filtersets.py:146 +#: circuits/forms/model_forms.py:143 +msgid "Provider network" +msgstr "" + +#: circuits/forms/filtersets.py:26 circuits/forms/filtersets.py:118 +#: dcim/forms/bulk_edit.py:247 dcim/forms/bulk_edit.py:345 +#: dcim/forms/bulk_edit.py:575 dcim/forms/bulk_edit.py:622 +#: dcim/forms/bulk_edit.py:772 dcim/forms/bulk_import.py:181 +#: dcim/forms/bulk_import.py:255 dcim/forms/bulk_import.py:483 +#: dcim/forms/bulk_import.py:1245 dcim/forms/bulk_import.py:1279 +#: dcim/forms/filtersets.py:91 dcim/forms/filtersets.py:243 +#: dcim/forms/filtersets.py:275 dcim/forms/filtersets.py:327 +#: dcim/forms/filtersets.py:378 dcim/forms/filtersets.py:644 +#: dcim/forms/filtersets.py:682 dcim/forms/filtersets.py:883 +#: dcim/forms/filtersets.py:912 dcim/forms/filtersets.py:932 +#: dcim/forms/filtersets.py:996 dcim/forms/filtersets.py:1025 +#: dcim/forms/filtersets.py:1034 dcim/forms/filtersets.py:1145 +#: dcim/forms/filtersets.py:1167 dcim/forms/filtersets.py:1189 +#: dcim/forms/filtersets.py:1206 dcim/forms/filtersets.py:1226 +#: dcim/forms/filtersets.py:1333 dcim/forms/filtersets.py:1355 +#: dcim/forms/filtersets.py:1376 dcim/forms/filtersets.py:1391 +#: dcim/forms/filtersets.py:1402 dcim/forms/model_forms.py:182 +#: dcim/forms/model_forms.py:216 dcim/forms/model_forms.py:402 +#: dcim/forms/model_forms.py:634 dcim/tables/devices.py:190 +#: dcim/tables/power.py:30 dcim/tables/racks.py:58 dcim/tables/racks.py:143 +#: extras/filtersets.py:410 extras/forms/filtersets.py:303 +#: ipam/forms/bulk_edit.py:458 ipam/forms/filtersets.py:172 +#: ipam/forms/filtersets.py:403 ipam/forms/filtersets.py:425 +#: ipam/forms/filtersets.py:451 ipam/forms/model_forms.py:562 +#: templates/dcim/device.html:34 templates/dcim/device_edit.html:30 +#: templates/dcim/inc/cable_termination.html:12 templates/dcim/location.html:27 +#: templates/dcim/powerpanel.html:27 templates/dcim/rack.html:27 +#: templates/dcim/rackreservation.html:34 virtualization/forms/filtersets.py:43 +#: virtualization/forms/filtersets.py:96 wireless/forms/model_forms.py:88 +#: wireless/forms/model_forms.py:128 +msgid "Location" +msgstr "" + +#: circuits/forms/filtersets.py:27 ipam/forms/model_forms.py:160 +#: ipam/models/asns.py:108 ipam/models/asns.py:125 ipam/tables/asn.py:41 +#: templates/ipam/asn.html:20 +msgid "ASN" +msgstr "" + +#: circuits/forms/filtersets.py:28 circuits/forms/filtersets.py:120 +#: dcim/forms/filtersets.py:135 dcim/forms/filtersets.py:149 +#: dcim/forms/filtersets.py:165 dcim/forms/filtersets.py:196 +#: dcim/forms/filtersets.py:247 dcim/forms/filtersets.py:331 +#: dcim/forms/filtersets.py:405 dcim/forms/filtersets.py:648 +#: dcim/forms/filtersets.py:997 netbox/navigation/menu.py:45 +#: netbox/navigation/menu.py:47 tenancy/tables/columns.py:70 +#: tenancy/tables/contacts.py:25 tenancy/views.py:23 +#: virtualization/forms/filtersets.py:34 virtualization/forms/filtersets.py:45 +#: virtualization/forms/filtersets.py:99 +msgid "Contacts" +msgstr "" + +#: circuits/forms/filtersets.py:33 circuits/forms/filtersets.py:156 +#: dcim/forms/bulk_edit.py:110 dcim/forms/bulk_edit.py:222 +#: dcim/forms/bulk_edit.py:747 dcim/forms/bulk_import.py:92 +#: dcim/forms/filtersets.py:69 dcim/forms/filtersets.py:175 +#: dcim/forms/filtersets.py:201 dcim/forms/filtersets.py:253 +#: dcim/forms/filtersets.py:356 dcim/forms/filtersets.py:659 +#: dcim/forms/filtersets.py:889 dcim/forms/filtersets.py:919 +#: dcim/forms/filtersets.py:1002 dcim/forms/filtersets.py:1041 +#: dcim/forms/filtersets.py:1451 dcim/forms/filtersets.py:1475 +#: dcim/forms/filtersets.py:1499 dcim/forms/model_forms.py:80 +#: dcim/forms/model_forms.py:115 dcim/forms/object_create.py:341 +#: dcim/tables/devices.py:176 dcim/tables/sites.py:85 extras/filtersets.py:377 +#: ipam/forms/bulk_edit.py:207 ipam/forms/bulk_edit.py:439 +#: ipam/forms/bulk_edit.py:511 ipam/forms/filtersets.py:216 +#: ipam/forms/filtersets.py:410 ipam/forms/filtersets.py:458 +#: ipam/forms/filtersets.py:576 ipam/forms/model_forms.py:534 +#: templates/dcim/device.html:17 templates/dcim/region.html:26 +#: templates/dcim/site.html:30 virtualization/forms/bulk_edit.py:78 +#: virtualization/forms/filtersets.py:55 virtualization/forms/filtersets.py:126 +#: virtualization/forms/model_forms.py:94 +msgid "Region" +msgstr "" + +#: circuits/forms/filtersets.py:38 circuits/forms/filtersets.py:161 +#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:755 +#: dcim/forms/filtersets.py:74 dcim/forms/filtersets.py:180 +#: dcim/forms/filtersets.py:206 dcim/forms/filtersets.py:266 +#: dcim/forms/filtersets.py:361 dcim/forms/filtersets.py:664 +#: dcim/forms/filtersets.py:894 dcim/forms/filtersets.py:1007 +#: dcim/forms/filtersets.py:1046 dcim/forms/object_create.py:349 +#: extras/filtersets.py:394 ipam/forms/bulk_edit.py:212 +#: ipam/forms/bulk_edit.py:446 ipam/forms/bulk_edit.py:516 +#: ipam/forms/filtersets.py:221 ipam/forms/filtersets.py:415 +#: ipam/forms/filtersets.py:463 ipam/forms/model_forms.py:547 +#: virtualization/forms/bulk_edit.py:83 virtualization/forms/filtersets.py:65 +#: virtualization/forms/filtersets.py:131 +#: virtualization/forms/model_forms.py:100 +msgid "Site group" +msgstr "" + +#: circuits/forms/filtersets.py:51 +msgid "ASN (legacy)" +msgstr "" + +#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 +#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 +#: core/forms/filtersets.py:64 dcim/forms/bulk_edit.py:718 +#: dcim/forms/filtersets.py:163 dcim/forms/filtersets.py:194 +#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:913 +#: dcim/forms/filtersets.py:1036 dcim/forms/filtersets.py:1144 +#: dcim/forms/filtersets.py:1166 dcim/forms/filtersets.py:1188 +#: dcim/forms/filtersets.py:1205 dcim/forms/filtersets.py:1222 +#: dcim/forms/filtersets.py:1332 dcim/forms/filtersets.py:1354 +#: dcim/forms/filtersets.py:1375 dcim/forms/filtersets.py:1390 +#: dcim/forms/filtersets.py:1401 extras/forms/filtersets.py:42 +#: extras/forms/filtersets.py:108 extras/forms/filtersets.py:139 +#: extras/forms/filtersets.py:179 extras/forms/filtersets.py:195 +#: extras/forms/filtersets.py:228 extras/forms/filtersets.py:425 +#: extras/forms/filtersets.py:466 ipam/forms/filtersets.py:102 +#: ipam/forms/filtersets.py:259 ipam/forms/filtersets.py:298 +#: ipam/forms/filtersets.py:371 ipam/forms/filtersets.py:452 +#: ipam/forms/filtersets.py:510 ipam/forms/filtersets.py:533 +#: virtualization/forms/filtersets.py:42 virtualization/forms/filtersets.py:97 +#: virtualization/forms/filtersets.py:187 wireless/forms/filtersets.py:33 +#: wireless/forms/filtersets.py:73 +msgid "Attributes" +msgstr "" + +#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:60 +#: circuits/tables/providers.py:66 templates/circuits/circuit.html:23 +#: templates/circuits/provideraccount.html:25 +msgid "Account" +msgstr "" + +#: circuits/forms/model_forms.py:64 +#: templates/circuits/circuittermination_edit.html:23 +#: templates/circuits/inc/circuit_termination.html:89 +#: templates/circuits/providernetwork.html:18 +msgid "Provider Network" +msgstr "" + +#: circuits/forms/model_forms.py:78 templates/circuits/circuittype.html:20 +msgid "Circuit Type" +msgstr "" + +#: circuits/models/circuits.py:25 dcim/models/cables.py:68 +#: dcim/models/device_component_templates.py:492 +#: dcim/models/device_component_templates.py:592 +#: dcim/models/device_components.py:967 dcim/models/device_components.py:1041 +#: dcim/models/device_components.py:1157 dcim/models/devices.py:467 +#: dcim/models/racks.py:43 extras/models/tags.py:31 +msgid "color" +msgstr "" + +#: circuits/models/circuits.py:34 +msgid "circuit type" +msgstr "" + +#: circuits/models/circuits.py:35 +msgid "circuit types" +msgstr "" + +#: circuits/models/circuits.py:46 +msgid "circuit ID" +msgstr "" + +#: circuits/models/circuits.py:47 +msgid "Unique circuit ID" +msgstr "" + +#: circuits/models/circuits.py:67 core/models/data.py:55 core/models/jobs.py:85 +#: dcim/models/cables.py:50 dcim/models/devices.py:641 +#: dcim/models/devices.py:1160 dcim/models/devices.py:1369 +#: dcim/models/power.py:95 dcim/models/racks.py:97 dcim/models/sites.py:154 +#: dcim/models/sites.py:266 ipam/models/ip.py:252 ipam/models/ip.py:521 +#: ipam/models/ip.py:729 ipam/models/vlans.py:173 +#: virtualization/models/clusters.py:74 +#: virtualization/models/virtualmachines.py:81 wireless/models.py:94 +#: wireless/models.py:158 +msgid "status" +msgstr "" + +#: circuits/models/circuits.py:82 +msgid "installed" +msgstr "" + +#: circuits/models/circuits.py:87 +msgid "terminates" +msgstr "" + +#: circuits/models/circuits.py:92 +msgid "commit rate (Kbps)" +msgstr "" + +#: circuits/models/circuits.py:93 +msgid "Committed rate" +msgstr "" + +#: circuits/models/circuits.py:135 +msgid "circuit" +msgstr "" + +#: circuits/models/circuits.py:136 +msgid "circuits" +msgstr "" + +#: circuits/models/circuits.py:169 +msgid "termination" +msgstr "" + +#: circuits/models/circuits.py:186 +msgid "port speed (Kbps)" +msgstr "" + +#: circuits/models/circuits.py:189 +msgid "Physical circuit speed" +msgstr "" + +#: circuits/models/circuits.py:194 +msgid "upstream speed (Kbps)" +msgstr "" + +#: circuits/models/circuits.py:195 +msgid "Upstream speed, if different from port speed" +msgstr "" + +#: circuits/models/circuits.py:200 +msgid "cross-connect ID" +msgstr "" + +#: circuits/models/circuits.py:201 +msgid "ID of the local cross-connect" +msgstr "" + +#: circuits/models/circuits.py:206 +msgid "patch panel/port(s)" +msgstr "" + +#: circuits/models/circuits.py:207 +msgid "Patch panel ID and port number(s)" +msgstr "" + +#: circuits/models/circuits.py:210 dcim/models/device_component_templates.py:62 +#: dcim/models/device_components.py:70 dcim/models/racks.py:536 +#: extras/models/configs.py:45 extras/models/configs.py:219 +#: extras/models/customfields.py:116 extras/models/models.py:343 +#: extras/models/models.py:458 extras/models/staging.py:31 +#: extras/models/tags.py:35 netbox/models/__init__.py:109 +#: netbox/models/__init__.py:144 netbox/models/__init__.py:190 +#: users/models.py:270 users/models.py:345 +#: virtualization/models/virtualmachines.py:256 +msgid "description" +msgstr "" + +#: circuits/models/circuits.py:223 +msgid "circuit termination" +msgstr "" + +#: circuits/models/circuits.py:224 +msgid "circuit terminations" +msgstr "" + +#: circuits/models/providers.py:22 circuits/models/providers.py:66 +#: circuits/models/providers.py:104 core/models/data.py:42 +#: core/models/jobs.py:46 dcim/models/device_component_templates.py:44 +#: dcim/models/device_components.py:55 dcim/models/devices.py:581 +#: dcim/models/devices.py:1300 dcim/models/devices.py:1365 +#: dcim/models/power.py:39 dcim/models/power.py:91 dcim/models/racks.py:62 +#: dcim/models/sites.py:138 extras/models/configs.py:36 +#: extras/models/configs.py:215 extras/models/customfields.py:83 +#: extras/models/models.py:55 extras/models/models.py:243 +#: extras/models/models.py:339 extras/models/models.py:448 +#: extras/models/models.py:543 extras/models/staging.py:26 +#: ipam/models/asns.py:18 ipam/models/fhrp.py:26 ipam/models/l2vpn.py:22 +#: ipam/models/services.py:52 ipam/models/services.py:88 +#: ipam/models/vlans.py:27 ipam/models/vlans.py:162 ipam/models/vrfs.py:22 +#: ipam/models/vrfs.py:79 netbox/models/__init__.py:136 +#: netbox/models/__init__.py:180 tenancy/models/contacts.py:63 +#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 +#: users/models.py:341 virtualization/models/clusters.py:57 +#: virtualization/models/virtualmachines.py:69 +#: virtualization/models/virtualmachines.py:246 wireless/models.py:50 +msgid "name" +msgstr "" + +#: circuits/models/providers.py:25 +msgid "Full name of the provider" +msgstr "" + +#: circuits/models/providers.py:28 dcim/models/devices.py:86 +#: dcim/models/sites.py:149 extras/models/models.py:453 ipam/models/asns.py:23 +#: ipam/models/l2vpn.py:27 ipam/models/vlans.py:31 +#: netbox/models/__init__.py:140 netbox/models/__init__.py:185 +#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 +#: wireless/models.py:55 +msgid "slug" +msgstr "" + +#: circuits/models/providers.py:42 +msgid "provider" +msgstr "" + +#: circuits/models/providers.py:43 +msgid "providers" +msgstr "" + +#: circuits/models/providers.py:63 +msgid "account ID" +msgstr "" + +#: circuits/models/providers.py:86 +msgid "provider account" +msgstr "" + +#: circuits/models/providers.py:87 +msgid "provider accounts" +msgstr "" + +#: circuits/models/providers.py:115 +msgid "service ID" +msgstr "" + +#: circuits/models/providers.py:126 +msgid "provider network" +msgstr "" + +#: circuits/models/providers.py:127 +msgid "provider networks" +msgstr "" + +#: circuits/tables/circuits.py:29 circuits/tables/providers.py:18 +#: circuits/tables/providers.py:69 circuits/tables/providers.py:99 +#: core/tables/data.py:16 core/tables/jobs.py:14 dcim/forms/filtersets.py:59 +#: dcim/forms/object_create.py:42 dcim/tables/devices.py:88 +#: dcim/tables/devices.py:125 dcim/tables/devices.py:167 +#: dcim/tables/devices.py:318 dcim/tables/devices.py:395 +#: dcim/tables/devices.py:439 dcim/tables/devices.py:485 +#: dcim/tables/devices.py:537 dcim/tables/devices.py:646 +#: dcim/tables/devices.py:727 dcim/tables/devices.py:777 +#: dcim/tables/devices.py:843 dcim/tables/devices.py:954 +#: dcim/tables/devices.py:974 dcim/tables/devices.py:1003 +#: dcim/tables/devices.py:1033 dcim/tables/devicetypes.py:32 +#: dcim/tables/power.py:22 dcim/tables/power.py:62 dcim/tables/racks.py:23 +#: dcim/tables/racks.py:53 dcim/tables/sites.py:24 dcim/tables/sites.py:51 +#: dcim/tables/sites.py:78 dcim/tables/sites.py:125 +#: extras/forms/filtersets.py:187 extras/tables/tables.py:65 +#: extras/tables/tables.py:105 extras/tables/tables.py:137 +#: extras/tables/tables.py:161 extras/tables/tables.py:226 +#: extras/tables/tables.py:273 extras/tables/tables.py:319 +#: extras/tables/tables.py:371 extras/tables/tables.py:394 +#: ipam/forms/bulk_edit.py:392 ipam/forms/filtersets.py:375 +#: ipam/tables/asn.py:16 ipam/tables/ip.py:85 ipam/tables/ip.py:159 +#: ipam/tables/l2vpn.py:23 ipam/tables/services.py:15 +#: ipam/tables/services.py:40 ipam/tables/vlans.py:64 ipam/tables/vlans.py:110 +#: ipam/tables/vrfs.py:26 ipam/tables/vrfs.py:67 +#: templates/circuits/circuittype.html:25 +#: templates/circuits/provideraccount.html:29 +#: templates/circuits/providernetwork.html:27 templates/core/datasource.html:35 +#: templates/core/job.html:31 templates/dcim/consoleport.html:31 +#: templates/dcim/consoleserverport.html:31 templates/dcim/devicebay.html:27 +#: templates/dcim/devicerole.html:29 templates/dcim/frontport.html:31 +#: templates/dcim/inc/interface_vlans_table.html:5 +#: templates/dcim/inc/panels/inventory_items.html:10 +#: templates/dcim/interface.html:39 templates/dcim/interface.html:167 +#: templates/dcim/inventoryitem.html:29 +#: templates/dcim/inventoryitemrole.html:19 templates/dcim/location.html:32 +#: templates/dcim/manufacturer.html:39 templates/dcim/modulebay.html:27 +#: templates/dcim/platform.html:32 templates/dcim/poweroutlet.html:31 +#: templates/dcim/powerport.html:31 templates/dcim/rackrole.html:25 +#: templates/dcim/rearport.html:31 templates/dcim/region.html:30 +#: templates/dcim/sitegroup.html:30 templates/dcim/virtualdevicecontext.html:21 +#: templates/extras/admin/plugins_list.html:22 +#: templates/extras/configcontext.html:14 +#: templates/extras/configtemplate.html:14 templates/extras/customfield.html:16 +#: templates/extras/customlink.html:14 templates/extras/exporttemplate.html:21 +#: templates/extras/report_list.html:46 templates/extras/savedfilter.html:14 +#: templates/extras/script_list.html:52 templates/extras/tag.html:17 +#: templates/extras/webhook.html:16 templates/ipam/asnrange.html:16 +#: templates/ipam/fhrpgroup.html:31 templates/ipam/l2vpn.html:15 +#: templates/ipam/rir.html:25 templates/ipam/role.html:25 +#: templates/ipam/routetarget.html:14 templates/ipam/service.html:27 +#: templates/ipam/servicetemplate.html:16 templates/ipam/vlan.html:38 +#: templates/ipam/vlangroup.html:31 templates/tenancy/contact.html:26 +#: templates/tenancy/contactgroup.html:24 templates/tenancy/contactrole.html:19 +#: templates/tenancy/tenantgroup.html:32 templates/users/group.html:18 +#: templates/users/objectpermission.html:18 +#: templates/virtualization/cluster.html:16 +#: templates/virtualization/clustergroup.html:25 +#: templates/virtualization/clustertype.html:25 +#: templates/virtualization/virtualmachine.html:18 +#: templates/virtualization/vminterface.html:28 +#: templates/wireless/wirelesslangroup.html:30 tenancy/tables/contacts.py:19 +#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 +#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 users/tables.py:62 +#: users/tables.py:79 virtualization/forms/bulk_create.py:19 +#: virtualization/forms/object_create.py:12 +#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 +#: virtualization/tables/clusters.py:62 +#: virtualization/tables/virtualmachines.py:43 +#: virtualization/tables/virtualmachines.py:114 +#: wireless/tables/wirelesslan.py:18 wireless/tables/wirelesslan.py:79 +msgid "Name" +msgstr "" + +#: circuits/tables/circuits.py:38 circuits/tables/providers.py:45 +#: circuits/tables/providers.py:79 netbox/navigation/menu.py:235 +#: netbox/navigation/menu.py:239 netbox/navigation/menu.py:241 +#: templates/circuits/provider.html:61 +#: templates/circuits/provideraccount.html:46 +#: templates/circuits/providernetwork.html:54 +msgid "Circuits" +msgstr "" + +#: circuits/tables/circuits.py:52 templates/circuits/circuit.html:27 +msgid "Circuit ID" +msgstr "" + +#: circuits/tables/circuits.py:65 wireless/forms/model_forms.py:157 +msgid "Side A" +msgstr "" + +#: circuits/tables/circuits.py:69 +msgid "Side Z" +msgstr "" + +#: circuits/tables/circuits.py:72 templates/circuits/circuit.html:56 +msgid "Commit Rate" +msgstr "" + +#: circuits/tables/circuits.py:75 circuits/tables/providers.py:48 +#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 +#: dcim/tables/devices.py:1016 dcim/tables/devicetypes.py:92 +#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 +#: dcim/tables/power.py:91 dcim/tables/racks.py:76 dcim/tables/racks.py:156 +#: dcim/tables/sites.py:103 extras/forms/bulk_edit.py:299 +#: extras/tables/tables.py:485 ipam/tables/asn.py:68 ipam/tables/fhrp.py:34 +#: ipam/tables/ip.py:135 ipam/tables/ip.py:272 ipam/tables/ip.py:325 +#: ipam/tables/ip.py:392 ipam/tables/l2vpn.py:37 ipam/tables/services.py:24 +#: ipam/tables/services.py:54 ipam/tables/vlans.py:141 ipam/tables/vrfs.py:46 +#: ipam/tables/vrfs.py:71 templates/dcim/cable_edit.html:85 +#: templates/generic/bulk_edit.html:102 templates/inc/panels/comments.html:6 +#: tenancy/tables/contacts.py:68 tenancy/tables/tenants.py:46 +#: utilities/forms/fields/fields.py:29 virtualization/tables/clusters.py:91 +#: virtualization/tables/virtualmachines.py:66 +#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +msgid "Comments" +msgstr "" + +#: circuits/tables/providers.py:23 +msgid "Accounts" +msgstr "" + +#: circuits/tables/providers.py:29 +msgid "Account Count" +msgstr "" + +#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +msgid "ASN Count" +msgstr "" + +#: core/choices.py:18 +msgid "New" +msgstr "" + +#: core/choices.py:19 +msgid "Queued" +msgstr "" + +#: core/choices.py:20 +msgid "Syncing" +msgstr "" + +#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:40 +#: extras/choices.py:199 templates/core/job.html:69 +msgid "Completed" +msgstr "" + +#: core/choices.py:22 core/choices.py:59 dcim/choices.py:176 +#: dcim/choices.py:222 dcim/choices.py:1496 extras/choices.py:201 +#: virtualization/choices.py:47 +msgid "Failed" +msgstr "" + +#: core/choices.py:35 netbox/navigation/menu.py:311 +#: templates/extras/script/base.html:14 templates/extras/script_list.html:6 +#: templates/extras/script_list.html:20 templates/extras/script_result.html:18 +msgid "Scripts" +msgstr "" + +#: core/choices.py:36 netbox/navigation/menu.py:305 +#: templates/extras/report/base.html:13 templates/extras/report_list.html:7 +#: templates/extras/report_list.html:12 +msgid "Reports" +msgstr "" + +#: core/choices.py:54 extras/choices.py:196 +msgid "Pending" +msgstr "" + +#: core/choices.py:55 core/tables/jobs.py:31 extras/choices.py:197 +#: templates/core/job.html:56 +msgid "Scheduled" +msgstr "" + +#: core/choices.py:56 extras/choices.py:198 +msgid "Running" +msgstr "" + +#: core/choices.py:58 extras/choices.py:200 +msgid "Errored" +msgstr "" + +#: core/data_backends.py:29 templates/dcim/interface.html:220 +msgid "Local" +msgstr "" + +#: core/data_backends.py:47 extras/tables/tables.py:431 +#: templates/account/profile.html:16 templates/users/user.html:18 +#: users/tables.py:31 +msgid "Username" +msgstr "" + +#: core/data_backends.py:49 core/data_backends.py:55 +msgid "Only used for cloning with HTTP(S)" +msgstr "" + +#: core/data_backends.py:53 templates/account/base.html:17 +#: templates/account/password.html:11 users/forms/model_forms.py:171 +msgid "Password" +msgstr "" + +#: core/data_backends.py:59 +msgid "Branch" +msgstr "" + +#: core/data_backends.py:118 +msgid "AWS access key ID" +msgstr "" + +#: core/data_backends.py:122 +msgid "AWS secret access key" +msgstr "" + +#: core/filtersets.py:48 extras/filtersets.py:172 extras/filtersets.py:507 +#: extras/filtersets.py:535 +msgid "Data source (ID)" +msgstr "" + +#: core/filtersets.py:54 +msgid "Data source (name)" +msgstr "" + +#: core/forms/bulk_edit.py:24 ipam/forms/bulk_edit.py:49 +msgid "Enforce unique space" +msgstr "" + +#: core/forms/bulk_edit.py:33 extras/forms/model_forms.py:196 +#: templates/extras/savedfilter.html:57 +msgid "Parameters" +msgstr "" + +#: core/forms/bulk_edit.py:37 templates/core/datasource.html:69 +msgid "Ignore rules" +msgstr "" + +#: core/forms/filtersets.py:27 core/forms/model_forms.py:89 +#: extras/forms/model_forms.py:159 extras/forms/model_forms.py:352 +#: extras/forms/model_forms.py:405 extras/tables/tables.py:171 +#: extras/tables/tables.py:363 extras/tables/tables.py:398 +#: templates/core/datasource.html:31 +#: templates/dcim/device/render_config.html:19 +#: templates/extras/configcontext.html:30 +#: templates/extras/configtemplate.html:22 +#: templates/extras/exporttemplate.html:41 +#: templates/virtualization/virtualmachine/render_config.html:19 +msgid "Data Source" +msgstr "" + +#: core/forms/filtersets.py:40 core/tables/data.py:26 +#: dcim/forms/bulk_edit.py:1012 dcim/forms/bulk_edit.py:1285 +#: dcim/forms/filtersets.py:1261 dcim/tables/devices.py:562 +#: dcim/tables/devicetypes.py:221 extras/forms/bulk_edit.py:92 +#: extras/forms/bulk_edit.py:156 extras/forms/bulk_edit.py:177 +#: extras/forms/filtersets.py:116 extras/forms/filtersets.py:203 +#: extras/forms/filtersets.py:242 extras/tables/tables.py:144 +#: extras/tables/tables.py:233 extras/tables/tables.py:280 +#: templates/core/datasource.html:43 templates/dcim/interface.html:62 +#: templates/extras/customlink.html:18 templates/extras/savedfilter.html:26 +#: templates/extras/webhook.html:20 templates/users/objectpermission.html:26 +#: templates/virtualization/vminterface.html:32 users/forms/bulk_edit.py:69 +#: users/forms/filtersets.py:73 users/tables.py:86 +#: virtualization/forms/bulk_edit.py:214 virtualization/forms/filtersets.py:203 +msgid "Enabled" +msgstr "" + +#: core/forms/filtersets.py:52 core/forms/mixins.py:21 +msgid "File" +msgstr "" + +#: core/forms/filtersets.py:57 core/forms/mixins.py:16 +#: extras/forms/filtersets.py:144 extras/forms/filtersets.py:311 +#: extras/forms/filtersets.py:397 +msgid "Data source" +msgstr "" + +#: core/forms/filtersets.py:65 extras/forms/filtersets.py:424 +msgid "Creation" +msgstr "" + +#: core/forms/filtersets.py:71 extras/forms/filtersets.py:448 +#: extras/forms/filtersets.py:494 extras/tables/tables.py:474 +#: ipam/tables/l2vpn.py:59 templates/core/job.html:25 +#: templates/extras/objectchange.html:56 tenancy/tables/contacts.py:90 +msgid "Object Type" +msgstr "" + +#: core/forms/filtersets.py:81 +msgid "Created after" +msgstr "" + +#: core/forms/filtersets.py:86 +msgid "Created before" +msgstr "" + +#: core/forms/filtersets.py:91 +msgid "Scheduled after" +msgstr "" + +#: core/forms/filtersets.py:96 +msgid "Scheduled before" +msgstr "" + +#: core/forms/filtersets.py:101 +msgid "Started after" +msgstr "" + +#: core/forms/filtersets.py:106 +msgid "Started before" +msgstr "" + +#: core/forms/filtersets.py:111 +msgid "Completed after" +msgstr "" + +#: core/forms/filtersets.py:116 +msgid "Completed before" +msgstr "" + +#: core/forms/filtersets.py:123 dcim/forms/bulk_edit.py:359 +#: dcim/forms/filtersets.py:349 dcim/forms/filtersets.py:393 +#: dcim/forms/model_forms.py:251 extras/forms/filtersets.py:440 +#: extras/forms/filtersets.py:486 templates/dcim/rackreservation.html:65 +#: templates/extras/objectchange.html:40 templates/extras/savedfilter.html:22 +#: templates/users/token.html:22 templates/users/user.html:6 +#: templates/users/user.html:14 users/filtersets.py:74 users/filtersets.py:134 +#: users/forms/filtersets.py:87 users/forms/filtersets.py:128 +#: users/forms/model_forms.py:156 users/forms/model_forms.py:194 +#: users/tables.py:19 +msgid "User" +msgstr "" + +#: core/forms/model_forms.py:46 core/tables/data.py:46 +#: templates/core/datafile.html:36 templates/extras/report/base.html:33 +#: templates/extras/script/base.html:32 templates/extras/script_result.html:45 +msgid "Source" +msgstr "" + +#: core/forms/model_forms.py:50 +msgid "Backend Parameters" +msgstr "" + +#: core/forms/model_forms.py:88 +msgid "File Upload" +msgstr "" + +#: core/models/data.py:47 dcim/models/cables.py:44 +#: dcim/models/device_component_templates.py:178 +#: dcim/models/device_component_templates.py:212 +#: dcim/models/device_component_templates.py:247 +#: dcim/models/device_component_templates.py:309 +#: dcim/models/device_component_templates.py:388 +#: dcim/models/device_component_templates.py:487 +#: dcim/models/device_component_templates.py:587 +#: dcim/models/device_components.py:285 dcim/models/device_components.py:314 +#: dcim/models/device_components.py:347 dcim/models/device_components.py:465 +#: dcim/models/device_components.py:603 dcim/models/device_components.py:962 +#: dcim/models/device_components.py:1036 dcim/models/power.py:101 +#: dcim/models/racks.py:127 extras/models/customfields.py:69 +#: extras/models/search.py:41 ipam/models/l2vpn.py:32 +#: virtualization/models/clusters.py:61 +msgid "type" +msgstr "" + +#: core/models/data.py:52 extras/choices.py:34 extras/models/models.py:86 +#: templates/core/datasource.html:59 +msgid "URL" +msgstr "" + +#: core/models/data.py:62 dcim/models/device_component_templates.py:393 +#: dcim/models/device_components.py:514 extras/models/models.py:93 +#: extras/models/models.py:248 extras/models/models.py:473 users/models.py:350 +msgid "enabled" +msgstr "" + +#: core/models/data.py:66 +msgid "ignore rules" +msgstr "" + +#: core/models/data.py:68 +msgid "Patterns (one per line) matching files to ignore when syncing" +msgstr "" + +#: core/models/data.py:71 extras/models/models.py:481 +msgid "parameters" +msgstr "" + +#: core/models/data.py:76 +msgid "last synced" +msgstr "" + +#: core/models/data.py:84 +msgid "data source" +msgstr "" + +#: core/models/data.py:85 +msgid "data sources" +msgstr "" + +#: core/models/data.py:124 +#, python-brace-format +msgid "Unknown backend type: {type}" +msgstr "" + +#: core/models/data.py:259 core/models/files.py:26 core/models/jobs.py:50 +#: extras/models/models.py:663 extras/models/models.py:704 +#: netbox/models/features.py:51 users/models.py:245 +msgid "created" +msgstr "" + +#: core/models/data.py:263 core/models/files.py:30 netbox/models/features.py:57 +msgid "last updated" +msgstr "" + +#: core/models/data.py:273 dcim/models/cables.py:417 +msgid "path" +msgstr "" + +#: core/models/data.py:276 +msgid "File path relative to the data source's root" +msgstr "" + +#: core/models/data.py:280 ipam/models/ip.py:502 +msgid "size" +msgstr "" + +#: core/models/data.py:283 +msgid "hash" +msgstr "" + +#: core/models/data.py:287 +msgid "Length must be 64 hexadecimal characters." +msgstr "" + +#: core/models/data.py:289 +msgid "SHA256 hash of the file data" +msgstr "" + +#: core/models/data.py:306 +msgid "data file" +msgstr "" + +#: core/models/data.py:307 +msgid "data files" +msgstr "" + +#: core/models/data.py:391 +msgid "auto sync record" +msgstr "" + +#: core/models/data.py:392 +msgid "auto sync records" +msgstr "" + +#: core/models/files.py:36 +msgid "file root" +msgstr "" + +#: core/models/files.py:41 +msgid "file path" +msgstr "" + +#: core/models/files.py:43 +msgid "File path relative to the designated root path" +msgstr "" + +#: core/models/files.py:59 +msgid "managed file" +msgstr "" + +#: core/models/files.py:60 +msgid "managed files" +msgstr "" + +#: core/models/jobs.py:54 +msgid "scheduled" +msgstr "" + +#: core/models/jobs.py:59 +msgid "interval" +msgstr "" + +#: core/models/jobs.py:65 +msgid "Recurrence interval (in minutes)" +msgstr "" + +#: core/models/jobs.py:68 +msgid "started" +msgstr "" + +#: core/models/jobs.py:73 +msgid "completed" +msgstr "" + +#: core/models/jobs.py:91 extras/models/staging.py:87 +msgid "data" +msgstr "" + +#: core/models/jobs.py:96 +msgid "job ID" +msgstr "" + +#: core/models/jobs.py:104 +msgid "job" +msgstr "" + +#: core/models/jobs.py:105 +msgid "jobs" +msgstr "" + +#: core/tables/data.py:50 templates/core/datafile.html:40 +msgid "Path" +msgstr "" + +#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +msgid "Last updated" +msgstr "" + +#: core/tables/jobs.py:10 dcim/tables/devicetypes.py:161 +#: extras/tables/tables.py:196 extras/tables/tables.py:340 +#: netbox/tables/tables.py:180 templates/dcim/virtualchassis_edit.html:53 +#: wireless/tables/wirelesslink.py:16 +msgid "ID" +msgstr "" + +#: core/tables/jobs.py:21 extras/choices.py:38 extras/tables/tables.py:258 +#: extras/tables/tables.py:350 extras/tables/tables.py:448 +#: extras/tables/tables.py:479 ipam/tables/l2vpn.py:64 +#: netbox/tables/tables.py:229 templates/extras/htmx/report_result.html:45 +#: templates/extras/journalentry.html:21 templates/extras/objectchange.html:62 +#: tenancy/tables/contacts.py:93 +msgid "Object" +msgstr "" + +#: core/tables/jobs.py:34 +msgid "Interval" +msgstr "" + +#: core/tables/jobs.py:37 templates/core/job.html:65 +#: templates/extras/htmx/report_result.html:7 +#: templates/extras/htmx/script_result.html:8 +msgid "Started" +msgstr "" + +#: dcim/api/serializers.py:205 templates/dcim/rack.html:40 +msgid "Facility ID" +msgstr "" + +#: dcim/api/serializers.py:321 dcim/api/serializers.py:680 +msgid "Position (U)" +msgstr "" + +#: dcim/choices.py:21 virtualization/choices.py:21 +msgid "Staging" +msgstr "" + +#: dcim/choices.py:23 dcim/choices.py:178 dcim/choices.py:223 +#: dcim/choices.py:1420 virtualization/choices.py:23 +#: virtualization/choices.py:48 +msgid "Decommissioning" +msgstr "" + +#: dcim/choices.py:24 +msgid "Retired" +msgstr "" + +#: dcim/choices.py:65 +msgid "2-post frame" +msgstr "" + +#: dcim/choices.py:66 +msgid "4-post frame" +msgstr "" + +#: dcim/choices.py:67 +msgid "4-post cabinet" +msgstr "" + +#: dcim/choices.py:68 +msgid "Wall-mounted frame" +msgstr "" + +#: dcim/choices.py:69 +msgid "Wall-mounted frame (vertical)" +msgstr "" + +#: dcim/choices.py:70 +msgid "Wall-mounted cabinet" +msgstr "" + +#: dcim/choices.py:71 +msgid "Wall-mounted cabinet (vertical)" +msgstr "" + +#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#, python-brace-format +msgid "{n} inches" +msgstr "" + +#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 ipam/choices.py:70 +#: ipam/choices.py:155 wireless/choices.py:26 +msgid "Reserved" +msgstr "" + +#: dcim/choices.py:101 templates/dcim/device.html:279 +msgid "Available" +msgstr "" + +#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 ipam/choices.py:71 +#: ipam/choices.py:156 wireless/choices.py:28 +msgid "Deprecated" +msgstr "" + +#: dcim/choices.py:114 templates/dcim/rack.html:135 +msgid "Millimeters" +msgstr "" + +#: dcim/choices.py:115 dcim/choices.py:1442 +msgid "Inches" +msgstr "" + +#: dcim/choices.py:140 dcim/forms/bulk_edit.py:66 dcim/forms/bulk_edit.py:85 +#: dcim/forms/bulk_edit.py:171 dcim/forms/bulk_edit.py:1290 +#: dcim/forms/bulk_import.py:59 dcim/forms/bulk_import.py:73 +#: dcim/forms/bulk_import.py:136 dcim/forms/bulk_import.py:503 +#: dcim/forms/bulk_import.py:770 dcim/forms/bulk_import.py:1021 +#: dcim/forms/filtersets.py:224 dcim/forms/model_forms.py:73 +#: dcim/forms/model_forms.py:94 dcim/forms/model_forms.py:172 +#: dcim/forms/model_forms.py:954 dcim/forms/model_forms.py:1295 +#: dcim/forms/object_import.py:181 dcim/tables/devices.py:654 +#: extras/tables/tables.py:203 ipam/tables/fhrp.py:59 ipam/tables/ip.py:374 +#: ipam/tables/services.py:44 templates/dcim/interface.html:97 +#: templates/dcim/interface.html:317 templates/dcim/location.html:44 +#: templates/dcim/region.html:38 templates/dcim/sitegroup.html:38 +#: templates/ipam/service.html:31 templates/tenancy/contactgroup.html:32 +#: templates/tenancy/tenantgroup.html:40 +#: templates/virtualization/vminterface.html:42 +#: templates/wireless/wirelesslangroup.html:38 tenancy/forms/bulk_edit.py:26 +#: tenancy/forms/bulk_edit.py:60 tenancy/forms/bulk_import.py:24 +#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:27 +#: tenancy/forms/model_forms.py:72 virtualization/forms/bulk_edit.py:204 +#: virtualization/forms/bulk_import.py:150 +#: virtualization/tables/virtualmachines.py:136 wireless/forms/bulk_edit.py:23 +#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:20 +msgid "Parent" +msgstr "" + +#: dcim/choices.py:141 +msgid "Child" +msgstr "" + +#: dcim/choices.py:155 templates/dcim/device.html:362 +#: templates/dcim/rack.html:188 templates/dcim/rack_elevation_list.html:22 +#: templates/dcim/rackreservation.html:84 +msgid "Front" +msgstr "" + +#: dcim/choices.py:156 templates/dcim/device.html:368 +#: templates/dcim/rack.html:194 templates/dcim/rack_elevation_list.html:23 +#: templates/dcim/rackreservation.html:90 +msgid "Rear" +msgstr "" + +#: dcim/choices.py:175 dcim/choices.py:221 virtualization/choices.py:46 +msgid "Staged" +msgstr "" + +#: dcim/choices.py:177 +msgid "Inventory" +msgstr "" + +#: dcim/choices.py:193 +msgid "Front to rear" +msgstr "" + +#: dcim/choices.py:194 +msgid "Rear to front" +msgstr "" + +#: dcim/choices.py:195 +msgid "Left to right" +msgstr "" + +#: dcim/choices.py:196 +msgid "Right to left" +msgstr "" + +#: dcim/choices.py:197 +msgid "Side to rear" +msgstr "" + +#: dcim/choices.py:198 dcim/choices.py:1215 +msgid "Passive" +msgstr "" + +#: dcim/choices.py:199 +msgid "Mixed" +msgstr "" + +#: dcim/choices.py:443 dcim/choices.py:680 +msgid "NEMA (Non-locking)" +msgstr "" + +#: dcim/choices.py:465 dcim/choices.py:702 +msgid "NEMA (Locking)" +msgstr "" + +#: dcim/choices.py:488 dcim/choices.py:725 +msgid "California Style" +msgstr "" + +#: dcim/choices.py:496 +msgid "International/ITA" +msgstr "" + +#: dcim/choices.py:526 dcim/choices.py:755 +msgid "Proprietary" +msgstr "" + +#: dcim/choices.py:534 dcim/choices.py:764 dcim/choices.py:1131 +#: dcim/choices.py:1133 dcim/choices.py:1338 dcim/choices.py:1340 +#: netbox/navigation/menu.py:188 +msgid "Other" +msgstr "" + +#: dcim/choices.py:733 +msgid "ITA/International" +msgstr "" + +#: dcim/choices.py:794 +msgid "Physical" +msgstr "" + +#: dcim/choices.py:795 dcim/choices.py:949 +msgid "Virtual" +msgstr "" + +#: dcim/choices.py:796 dcim/choices.py:1019 dcim/forms/bulk_edit.py:1398 +#: dcim/forms/filtersets.py:1225 dcim/forms/model_forms.py:880 +#: dcim/forms/model_forms.py:1189 netbox/navigation/menu.py:128 +#: netbox/navigation/menu.py:132 templates/dcim/interface.html:213 +msgid "Wireless" +msgstr "" + +#: dcim/choices.py:947 +msgid "Virtual interfaces" +msgstr "" + +#: dcim/choices.py:950 dcim/forms/bulk_edit.py:1295 +#: dcim/forms/bulk_import.py:777 dcim/forms/model_forms.py:868 +#: dcim/tables/devices.py:658 templates/dcim/interface.html:101 +#: templates/virtualization/vminterface.html:46 +#: virtualization/forms/bulk_edit.py:209 +#: virtualization/forms/bulk_import.py:157 +#: virtualization/tables/virtualmachines.py:140 +msgid "Bridge" +msgstr "" + +#: dcim/choices.py:951 +msgid "Link Aggregation Group (LAG)" +msgstr "" + +#: dcim/choices.py:955 +msgid "Ethernet (fixed)" +msgstr "" + +#: dcim/choices.py:969 +msgid "Ethernet (modular)" +msgstr "" + +#: dcim/choices.py:1005 +msgid "Ethernet (backplane)" +msgstr "" + +#: dcim/choices.py:1033 +msgid "Cellular" +msgstr "" + +#: dcim/choices.py:1080 dcim/forms/filtersets.py:299 +#: dcim/forms/filtersets.py:729 dcim/forms/filtersets.py:869 +#: dcim/forms/filtersets.py:1417 templates/dcim/inventoryitem.html:53 +#: templates/dcim/virtualchassis_edit.html:55 +msgid "Serial" +msgstr "" + +#: dcim/choices.py:1095 +msgid "Coaxial" +msgstr "" + +#: dcim/choices.py:1112 +msgid "Stacking" +msgstr "" + +#: dcim/choices.py:1162 +msgid "Half" +msgstr "" + +#: dcim/choices.py:1163 +msgid "Full" +msgstr "" + +#: dcim/choices.py:1164 wireless/choices.py:480 +msgid "Auto" +msgstr "" + +#: dcim/choices.py:1175 +msgid "Access" +msgstr "" + +#: dcim/choices.py:1176 ipam/tables/vlans.py:168 ipam/tables/vlans.py:213 +#: templates/dcim/inc/interface_vlans_table.html:7 +msgid "Tagged" +msgstr "" + +#: dcim/choices.py:1177 +msgid "Tagged (All)" +msgstr "" + +#: dcim/choices.py:1206 +msgid "IEEE Standard" +msgstr "" + +#: dcim/choices.py:1217 +msgid "Passive 24V (2-pair)" +msgstr "" + +#: dcim/choices.py:1218 +msgid "Passive 24V (4-pair)" +msgstr "" + +#: dcim/choices.py:1219 +msgid "Passive 48V (2-pair)" +msgstr "" + +#: dcim/choices.py:1220 +msgid "Passive 48V (4-pair)" +msgstr "" + +#: dcim/choices.py:1282 dcim/choices.py:1378 +msgid "Copper" +msgstr "" + +#: dcim/choices.py:1305 +msgid "Fiber Optic" +msgstr "" + +#: dcim/choices.py:1394 +msgid "Fiber" +msgstr "" + +#: dcim/choices.py:1407 dcim/forms/bulk_edit.py:859 +#: dcim/forms/bulk_edit.py:1242 dcim/forms/bulk_edit.py:1260 +#: dcim/tables/racks.py:89 extras/forms/model_forms.py:489 +#: netbox/navigation/menu.py:257 netbox/navigation/menu.py:261 +msgid "Power" +msgstr "" + +#: dcim/choices.py:1418 dcim/forms/filtersets.py:1132 +msgid "Connected" +msgstr "" + +#: dcim/choices.py:1437 +msgid "Kilometers" +msgstr "" + +#: dcim/choices.py:1438 templates/dcim/cable_trace.html:62 +msgid "Meters" +msgstr "" + +#: dcim/choices.py:1439 +msgid "Centimeters" +msgstr "" + +#: dcim/choices.py:1440 +msgid "Miles" +msgstr "" + +#: dcim/choices.py:1441 templates/dcim/cable_trace.html:63 +msgid "Feet" +msgstr "" + +#: dcim/choices.py:1457 templates/dcim/device.html:349 +#: templates/dcim/rack.html:164 +msgid "Kilograms" +msgstr "" + +#: dcim/choices.py:1458 +msgid "Grams" +msgstr "" + +#: dcim/choices.py:1459 templates/dcim/rack.html:165 +msgid "Pounds" +msgstr "" + +#: dcim/choices.py:1460 +msgid "Ounces" +msgstr "" + +#: dcim/choices.py:1506 tenancy/choices.py:17 +msgid "Primary" +msgstr "" + +#: dcim/choices.py:1507 +msgid "Redundant" +msgstr "" + +#: dcim/choices.py:1528 +msgid "Single phase" +msgstr "" + +#: dcim/choices.py:1529 +msgid "Three-phase" +msgstr "" + +#: dcim/filtersets.py:78 +msgid "Parent region (ID)" +msgstr "" + +#: dcim/filtersets.py:84 +msgid "Parent region (slug)" +msgstr "" + +#: dcim/filtersets.py:95 +msgid "Parent site group (ID)" +msgstr "" + +#: dcim/filtersets.py:101 +msgid "Parent site group (slug)" +msgstr "" + +#: dcim/filtersets.py:130 ipam/filtersets.py:792 ipam/filtersets.py:925 +msgid "Group (ID)" +msgstr "" + +#: dcim/filtersets.py:136 +msgid "Group (slug)" +msgstr "" + +#: dcim/filtersets.py:142 dcim/filtersets.py:147 +msgid "AS (ID)" +msgstr "" + +#: dcim/filtersets.py:215 dcim/filtersets.py:290 dcim/filtersets.py:388 +#: dcim/filtersets.py:909 dcim/filtersets.py:1215 dcim/filtersets.py:1883 +msgid "Location (ID)" +msgstr "" + +#: dcim/filtersets.py:222 dcim/filtersets.py:297 dcim/filtersets.py:395 +#: dcim/filtersets.py:1221 extras/filtersets.py:416 +msgid "Location (slug)" +msgstr "" + +#: dcim/filtersets.py:311 dcim/filtersets.py:762 dcim/filtersets.py:846 +#: dcim/filtersets.py:1621 ipam/filtersets.py:346 ipam/filtersets.py:458 +#: ipam/filtersets.py:935 virtualization/filtersets.py:206 +msgid "Role (ID)" +msgstr "" + +#: dcim/filtersets.py:317 dcim/filtersets.py:768 dcim/filtersets.py:852 +#: dcim/filtersets.py:1627 extras/filtersets.py:432 ipam/filtersets.py:352 +#: ipam/filtersets.py:464 ipam/filtersets.py:941 +#: virtualization/filtersets.py:212 +msgid "Role (slug)" +msgstr "" + +#: dcim/filtersets.py:345 dcim/filtersets.py:914 dcim/filtersets.py:1226 +#: dcim/filtersets.py:1944 +msgid "Rack (ID)" +msgstr "" + +#: dcim/filtersets.py:399 extras/filtersets.py:203 extras/filtersets.py:247 +#: extras/filtersets.py:287 extras/filtersets.py:582 +msgid "User (ID)" +msgstr "" + +#: dcim/filtersets.py:405 extras/filtersets.py:209 extras/filtersets.py:253 +#: extras/filtersets.py:293 users/filtersets.py:80 users/filtersets.py:140 +msgid "User (name)" +msgstr "" + +#: dcim/filtersets.py:433 dcim/filtersets.py:559 dcim/filtersets.py:752 +#: dcim/filtersets.py:803 dcim/filtersets.py:825 dcim/filtersets.py:1118 +#: dcim/filtersets.py:1611 +msgid "Manufacturer (ID)" +msgstr "" + +#: dcim/filtersets.py:439 dcim/filtersets.py:565 dcim/filtersets.py:758 +#: dcim/filtersets.py:809 dcim/filtersets.py:831 dcim/filtersets.py:1124 +#: dcim/filtersets.py:1617 +msgid "Manufacturer (slug)" +msgstr "" + +#: dcim/filtersets.py:443 +msgid "Default platform (ID)" +msgstr "" + +#: dcim/filtersets.py:449 +msgid "Default platform (slug)" +msgstr "" + +#: dcim/filtersets.py:452 dcim/forms/filtersets.py:448 +msgid "Has a front image" +msgstr "" + +#: dcim/filtersets.py:456 dcim/forms/filtersets.py:455 +msgid "Has a rear image" +msgstr "" + +#: dcim/filtersets.py:461 dcim/filtersets.py:569 dcim/filtersets.py:967 +#: dcim/forms/filtersets.py:462 dcim/forms/filtersets.py:558 +#: dcim/forms/filtersets.py:768 +msgid "Has console ports" +msgstr "" + +#: dcim/filtersets.py:465 dcim/filtersets.py:573 dcim/filtersets.py:971 +#: dcim/forms/filtersets.py:469 dcim/forms/filtersets.py:565 +#: dcim/forms/filtersets.py:775 +msgid "Has console server ports" +msgstr "" + +#: dcim/filtersets.py:469 dcim/filtersets.py:577 dcim/filtersets.py:975 +#: dcim/forms/filtersets.py:476 dcim/forms/filtersets.py:572 +#: dcim/forms/filtersets.py:782 +msgid "Has power ports" +msgstr "" + +#: dcim/filtersets.py:473 dcim/filtersets.py:581 dcim/filtersets.py:979 +#: dcim/forms/filtersets.py:483 dcim/forms/filtersets.py:579 +#: dcim/forms/filtersets.py:789 +msgid "Has power outlets" +msgstr "" + +#: dcim/filtersets.py:477 dcim/filtersets.py:585 dcim/filtersets.py:983 +#: dcim/forms/filtersets.py:490 dcim/forms/filtersets.py:586 +#: dcim/forms/filtersets.py:796 +msgid "Has interfaces" +msgstr "" + +#: dcim/filtersets.py:481 dcim/filtersets.py:589 dcim/filtersets.py:987 +#: dcim/forms/filtersets.py:497 dcim/forms/filtersets.py:593 +#: dcim/forms/filtersets.py:803 +msgid "Has pass-through ports" +msgstr "" + +#: dcim/filtersets.py:485 dcim/filtersets.py:991 dcim/forms/filtersets.py:511 +msgid "Has module bays" +msgstr "" + +#: dcim/filtersets.py:489 dcim/filtersets.py:995 dcim/forms/filtersets.py:504 +msgid "Has device bays" +msgstr "" + +#: dcim/filtersets.py:493 dcim/forms/filtersets.py:518 +msgid "Has inventory items" +msgstr "" + +#: dcim/filtersets.py:636 dcim/filtersets.py:841 dcim/filtersets.py:1247 +msgid "Device type (ID)" +msgstr "" + +#: dcim/filtersets.py:649 dcim/filtersets.py:1129 +msgid "Module type (ID)" +msgstr "" + +#: dcim/filtersets.py:748 dcim/filtersets.py:1607 +msgid "Parent inventory item (ID)" +msgstr "" + +#: dcim/filtersets.py:791 dcim/filtersets.py:813 dcim/filtersets.py:963 +#: virtualization/filtersets.py:234 +msgid "Config template (ID)" +msgstr "" + +#: dcim/filtersets.py:837 +msgid "Device type (slug)" +msgstr "" + +#: dcim/filtersets.py:857 +msgid "Parent Device (ID)" +msgstr "" + +#: dcim/filtersets.py:861 virtualization/filtersets.py:216 +msgid "Platform (ID)" +msgstr "" + +#: dcim/filtersets.py:867 extras/filtersets.py:443 +#: virtualization/filtersets.py:222 +msgid "Platform (slug)" +msgstr "" + +#: dcim/filtersets.py:903 dcim/filtersets.py:1210 dcim/filtersets.py:1705 +#: dcim/filtersets.py:1877 dcim/filtersets.py:1935 +msgid "Site name (slug)" +msgstr "" + +#: dcim/filtersets.py:918 +msgid "VM cluster (ID)" +msgstr "" + +#: dcim/filtersets.py:924 +msgid "Device model (slug)" +msgstr "" + +#: dcim/filtersets.py:935 dcim/forms/bulk_edit.py:421 +msgid "Is full depth" +msgstr "" + +#: dcim/filtersets.py:939 dcim/forms/common.py:18 dcim/forms/filtersets.py:738 +#: dcim/forms/filtersets.py:1276 dcim/models/device_components.py:520 +#: virtualization/filtersets.py:226 virtualization/filtersets.py:292 +#: virtualization/forms/filtersets.py:165 +#: virtualization/forms/filtersets.py:211 +msgid "MAC address" +msgstr "" + +#: dcim/filtersets.py:946 dcim/forms/filtersets.py:747 +#: dcim/forms/filtersets.py:834 virtualization/filtersets.py:230 +#: virtualization/forms/filtersets.py:169 +msgid "Has a primary IP" +msgstr "" + +#: dcim/filtersets.py:950 +msgid "Has an out-of-band IP" +msgstr "" + +#: dcim/filtersets.py:955 +msgid "Virtual chassis (ID)" +msgstr "" + +#: dcim/filtersets.py:959 +msgid "Is a virtual chassis member" +msgstr "" + +#: dcim/filtersets.py:1000 +msgid "Primary IPv4 (ID)" +msgstr "" + +#: dcim/filtersets.py:1005 +msgid "Primary IPv6 (ID)" +msgstr "" + +#: dcim/filtersets.py:1010 +msgid "OOB IP (ID)" +msgstr "" + +#: dcim/filtersets.py:1135 +msgid "Module type (model)" +msgstr "" + +#: dcim/filtersets.py:1141 +msgid "Module Bay (ID)" +msgstr "" + +#: dcim/filtersets.py:1145 dcim/filtersets.py:1236 ipam/filtersets.py:567 +#: ipam/filtersets.py:802 ipam/filtersets.py:1010 ipam/filtersets.py:1143 +#: virtualization/filtersets.py:157 +msgid "Device (ID)" +msgstr "" + +#: dcim/filtersets.py:1232 +msgid "Rack (name)" +msgstr "" + +#: dcim/filtersets.py:1242 ipam/filtersets.py:562 ipam/filtersets.py:797 +#: ipam/filtersets.py:1016 ipam/filtersets.py:1138 +msgid "Device (name)" +msgstr "" + +#: dcim/filtersets.py:1253 +msgid "Device type (model)" +msgstr "" + +#: dcim/filtersets.py:1258 dcim/filtersets.py:1281 +msgid "Device role (ID)" +msgstr "" + +#: dcim/filtersets.py:1264 dcim/filtersets.py:1287 +msgid "Device role (slug)" +msgstr "" + +#: dcim/filtersets.py:1269 +msgid "Virtual Chassis (ID)" +msgstr "" + +#: dcim/filtersets.py:1275 dcim/forms/filtersets.py:105 +#: dcim/tables/devices.py:235 netbox/navigation/menu.py:67 +#: templates/dcim/device.html:140 templates/dcim/device_edit.html:93 +#: templates/dcim/virtualchassis.html:20 +#: templates/dcim/virtualchassis_add.html:8 +#: templates/dcim/virtualchassis_edit.html:25 +msgid "Virtual Chassis" +msgstr "" + +#: dcim/filtersets.py:1307 +msgid "Module (ID)" +msgstr "" + +#: dcim/filtersets.py:1411 ipam/forms/bulk_import.py:191 +#: ipam/forms/bulk_import.py:568 +msgid "Assigned VLAN" +msgstr "" + +#: dcim/filtersets.py:1415 +msgid "Assigned VID" +msgstr "" + +#: dcim/filtersets.py:1420 dcim/forms/bulk_edit.py:1374 +#: dcim/forms/bulk_import.py:828 dcim/forms/filtersets.py:1319 +#: dcim/forms/model_forms.py:1174 dcim/models/device_components.py:709 +#: dcim/tables/devices.py:625 ipam/filtersets.py:281 ipam/filtersets.py:292 +#: ipam/filtersets.py:448 ipam/filtersets.py:540 ipam/filtersets.py:551 +#: ipam/forms/bulk_edit.py:228 ipam/forms/bulk_edit.py:283 +#: ipam/forms/bulk_edit.py:325 ipam/forms/bulk_import.py:159 +#: ipam/forms/bulk_import.py:245 ipam/forms/bulk_import.py:281 +#: ipam/forms/filtersets.py:70 ipam/forms/filtersets.py:171 +#: ipam/forms/filtersets.py:299 ipam/forms/model_forms.py:61 +#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:248 +#: ipam/forms/model_forms.py:292 ipam/forms/model_forms.py:414 +#: ipam/forms/model_forms.py:428 ipam/forms/model_forms.py:442 +#: ipam/models/ip.py:232 ipam/models/ip.py:511 ipam/models/ip.py:719 +#: ipam/models/vrfs.py:62 ipam/tables/ip.py:241 ipam/tables/ip.py:306 +#: ipam/tables/ip.py:356 ipam/tables/ip.py:445 +#: templates/dcim/interface.html:134 templates/ipam/ipaddress.html:21 +#: templates/ipam/iprange.html:43 templates/ipam/prefix.html:19 +#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:14 +#: templates/virtualization/vminterface.html:50 +#: virtualization/forms/bulk_edit.py:258 +#: virtualization/forms/bulk_import.py:170 +#: virtualization/forms/filtersets.py:216 +#: virtualization/forms/model_forms.py:326 +#: virtualization/models/virtualmachines.py:286 +#: virtualization/tables/virtualmachines.py:118 +msgid "VRF" +msgstr "" + +#: dcim/filtersets.py:1426 ipam/filtersets.py:287 ipam/filtersets.py:298 +#: ipam/filtersets.py:454 ipam/filtersets.py:546 ipam/filtersets.py:557 +msgid "VRF (RD)" +msgstr "" + +#: dcim/filtersets.py:1431 ipam/filtersets.py:958 ipam/filtersets.py:1106 +msgid "L2VPN (ID)" +msgstr "" + +#: dcim/filtersets.py:1437 dcim/forms/filtersets.py:1324 +#: dcim/tables/devices.py:579 ipam/filtersets.py:964 +#: ipam/forms/bulk_import.py:540 ipam/forms/filtersets.py:501 +#: ipam/forms/filtersets.py:565 ipam/forms/model_forms.py:779 +#: ipam/forms/model_forms.py:797 ipam/models/l2vpn.py:63 +#: ipam/tables/l2vpn.py:55 ipam/tables/vlans.py:133 +#: templates/dcim/interface.html:109 templates/ipam/l2vpntermination.html:15 +#: templates/ipam/vlan.html:69 virtualization/forms/filtersets.py:221 +msgid "L2VPN" +msgstr "" + +#: dcim/filtersets.py:1469 +msgid "Virtual Chassis Interfaces for Device" +msgstr "" + +#: dcim/filtersets.py:1474 +msgid "Virtual Chassis Interfaces for Device (ID)" +msgstr "" + +#: dcim/filtersets.py:1478 +msgid "Kind of interface" +msgstr "" + +#: dcim/filtersets.py:1483 virtualization/filtersets.py:284 +msgid "Parent interface (ID)" +msgstr "" + +#: dcim/filtersets.py:1488 virtualization/filtersets.py:289 +msgid "Bridged interface (ID)" +msgstr "" + +#: dcim/filtersets.py:1493 +msgid "LAG interface (ID)" +msgstr "" + +#: dcim/filtersets.py:1662 +msgid "Master (ID)" +msgstr "" + +#: dcim/filtersets.py:1668 +msgid "Master (name)" +msgstr "" + +#: dcim/filtersets.py:1710 tenancy/filtersets.py:208 +msgid "Tenant (ID)" +msgstr "" + +#: dcim/filtersets.py:1716 extras/filtersets.py:492 tenancy/filtersets.py:214 +msgid "Tenant (slug)" +msgstr "" + +#: dcim/filtersets.py:1751 dcim/forms/filtersets.py:983 +msgid "Unterminated" +msgstr "" + +#: dcim/filtersets.py:1939 +msgid "Power panel (ID)" +msgstr "" + +#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:385 +#: extras/forms/mixins.py:82 extras/forms/model_forms.py:341 +#: extras/forms/model_forms.py:392 netbox/forms/base.py:71 +#: netbox/tables/columns.py:448 +#: templates/circuits/inc/circuit_termination.html:119 +#: templates/generic/bulk_edit.html:81 templates/inc/panels/tags.html:5 +#: utilities/forms/fields/fields.py:81 +msgid "Tags" +msgstr "" + +#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1381 +#: dcim/forms/model_forms.py:422 dcim/forms/model_forms.py:467 +#: dcim/forms/object_create.py:179 dcim/forms/object_create.py:319 +#: dcim/tables/devices.py:198 dcim/tables/devices.py:703 +#: dcim/tables/devicetypes.py:242 templates/dcim/device.html:62 +#: templates/dcim/device.html:146 templates/dcim/modulebay.html:35 +#: templates/dcim/virtualchassis.html:59 +#: templates/dcim/virtualchassis_edit.html:56 +msgid "Position" +msgstr "" + +#: dcim/forms/bulk_create.py:114 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of names being " +"created.)" +msgstr "" + +#: dcim/forms/bulk_edit.py:115 dcim/forms/bulk_import.py:99 +#: dcim/forms/model_forms.py:120 dcim/tables/sites.py:89 ipam/filtersets.py:931 +#: ipam/forms/bulk_edit.py:530 ipam/forms/bulk_import.py:447 +#: ipam/forms/model_forms.py:511 ipam/tables/fhrp.py:67 +#: ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 +#: templates/dcim/interface.html:290 templates/dcim/site.html:43 +#: templates/ipam/inc/panels/fhrp_groups.html:10 templates/ipam/vlan.html:30 +#: templates/tenancy/contact.html:22 templates/tenancy/tenant.html:21 +#: templates/users/group.html:6 templates/users/group.html:14 +#: templates/virtualization/cluster.html:32 +#: templates/wireless/wirelesslan.html:19 tenancy/forms/bulk_edit.py:42 +#: tenancy/forms/bulk_edit.py:93 tenancy/forms/bulk_import.py:40 +#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 +#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:98 +#: tenancy/forms/model_forms.py:49 tenancy/forms/model_forms.py:105 +#: tenancy/forms/model_forms.py:127 tenancy/tables/contacts.py:60 +#: tenancy/tables/tenants.py:42 users/filtersets.py:42 users/filtersets.py:145 +#: users/forms/filtersets.py:34 users/forms/filtersets.py:40 +#: users/forms/filtersets.py:82 virtualization/forms/bulk_edit.py:62 +#: virtualization/forms/bulk_import.py:46 virtualization/forms/filtersets.py:81 +#: virtualization/forms/model_forms.py:68 virtualization/tables/clusters.py:70 +#: wireless/forms/bulk_edit.py:47 wireless/forms/bulk_import.py:36 +#: wireless/forms/filtersets.py:45 wireless/forms/model_forms.py:41 +#: wireless/tables/wirelesslan.py:48 +msgid "Group" +msgstr "" + +#: dcim/forms/bulk_edit.py:130 +msgid "Contact name" +msgstr "" + +#: dcim/forms/bulk_edit.py:135 +msgid "Contact phone" +msgstr "" + +#: dcim/forms/bulk_edit.py:141 +msgid "Contact E-mail" +msgstr "" + +#: dcim/forms/bulk_edit.py:144 dcim/forms/bulk_import.py:122 +#: dcim/forms/model_forms.py:131 +msgid "Time zone" +msgstr "" + +#: dcim/forms/bulk_edit.py:266 dcim/forms/bulk_edit.py:1152 +#: dcim/forms/bulk_edit.py:1539 dcim/forms/bulk_import.py:199 +#: dcim/forms/bulk_import.py:1009 dcim/forms/filtersets.py:296 +#: dcim/forms/filtersets.py:697 dcim/forms/filtersets.py:1408 +#: dcim/forms/model_forms.py:224 dcim/forms/model_forms.py:962 +#: dcim/forms/model_forms.py:1303 dcim/forms/object_import.py:186 +#: dcim/tables/devices.py:202 dcim/tables/devices.py:811 +#: dcim/tables/devices.py:922 dcim/tables/devicetypes.py:300 +#: dcim/tables/racks.py:69 extras/filtersets.py:426 ipam/forms/bulk_edit.py:247 +#: ipam/forms/bulk_edit.py:296 ipam/forms/bulk_edit.py:344 +#: ipam/forms/bulk_edit.py:548 ipam/forms/bulk_import.py:199 +#: ipam/forms/bulk_import.py:264 ipam/forms/bulk_import.py:300 +#: ipam/forms/bulk_import.py:466 ipam/forms/filtersets.py:236 +#: ipam/forms/filtersets.py:282 ipam/forms/filtersets.py:349 +#: ipam/forms/filtersets.py:492 ipam/forms/model_forms.py:189 +#: ipam/forms/model_forms.py:224 ipam/forms/model_forms.py:251 +#: ipam/forms/model_forms.py:649 ipam/tables/ip.py:257 ipam/tables/ip.py:313 +#: ipam/tables/ip.py:363 ipam/tables/vlans.py:126 ipam/tables/vlans.py:230 +#: templates/dcim/device.html:204 +#: templates/dcim/inc/panels/inventory_items.html:12 +#: templates/dcim/interface.html:227 templates/dcim/inventoryitem.html:37 +#: templates/dcim/rack.html:57 templates/ipam/ipaddress.html:44 +#: templates/ipam/iprange.html:53 templates/ipam/prefix.html:78 +#: templates/ipam/role.html:20 templates/ipam/vlan.html:55 +#: templates/virtualization/virtualmachine.html:26 +#: templates/wireless/inc/wirelesslink_interface.html:20 +#: tenancy/forms/bulk_edit.py:141 tenancy/forms/filtersets.py:108 +#: tenancy/forms/model_forms.py:142 tenancy/tables/contacts.py:102 +#: virtualization/forms/bulk_edit.py:142 +#: virtualization/forms/bulk_import.py:105 +#: virtualization/forms/filtersets.py:150 +#: virtualization/forms/model_forms.py:197 +#: virtualization/tables/virtualmachines.py:63 +msgid "Role" +msgstr "" + +#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:605 +#: dcim/forms/bulk_edit.py:654 templates/dcim/device.html:123 +#: templates/dcim/module.html:75 templates/dcim/modulebay.html:69 +#: templates/dcim/rack.html:65 +msgid "Serial Number" +msgstr "" + +#: dcim/forms/bulk_edit.py:276 dcim/forms/filtersets.py:303 +#: dcim/forms/filtersets.py:733 dcim/forms/filtersets.py:873 +#: dcim/forms/filtersets.py:1421 +msgid "Asset tag" +msgstr "" + +#: dcim/forms/bulk_edit.py:286 dcim/forms/bulk_import.py:212 +#: dcim/forms/filtersets.py:288 templates/dcim/rack.html:98 +#: templates/dcim/rack_edit.html:48 +msgid "Width" +msgstr "" + +#: dcim/forms/bulk_edit.py:292 +msgid "Height (U)" +msgstr "" + +#: dcim/forms/bulk_edit.py:297 +msgid "Descending units" +msgstr "" + +#: dcim/forms/bulk_edit.py:300 +msgid "Outer width" +msgstr "" + +#: dcim/forms/bulk_edit.py:305 +msgid "Outer depth" +msgstr "" + +#: dcim/forms/bulk_edit.py:310 dcim/forms/bulk_import.py:217 +msgid "Outer unit" +msgstr "" + +#: dcim/forms/bulk_edit.py:315 +msgid "Mounting depth" +msgstr "" + +#: dcim/forms/bulk_edit.py:320 dcim/forms/bulk_edit.py:349 +#: dcim/forms/bulk_edit.py:434 dcim/forms/bulk_edit.py:457 +#: dcim/forms/bulk_edit.py:473 dcim/forms/bulk_edit.py:493 +#: dcim/forms/bulk_import.py:324 dcim/forms/bulk_import.py:350 +#: dcim/forms/filtersets.py:248 dcim/forms/filtersets.py:308 +#: dcim/forms/filtersets.py:332 dcim/forms/filtersets.py:420 +#: dcim/forms/filtersets.py:525 dcim/forms/filtersets.py:544 +#: dcim/forms/filtersets.py:600 dcim/forms/model_forms.py:337 +#: dcim/tables/devicetypes.py:103 dcim/tables/modules.py:35 +#: dcim/tables/racks.py:103 extras/forms/bulk_edit.py:44 +#: extras/forms/bulk_edit.py:102 extras/forms/bulk_edit.py:152 +#: extras/forms/bulk_edit.py:256 extras/forms/filtersets.py:62 +#: extras/forms/filtersets.py:130 extras/forms/filtersets.py:217 +#: ipam/forms/bulk_edit.py:189 templates/dcim/device.html:346 +#: templates/dcim/devicetype.html:52 templates/dcim/moduletype.html:31 +#: templates/dcim/rack_edit.html:60 templates/dcim/rack_edit.html:63 +#: templates/extras/configcontext.html:18 templates/extras/customlink.html:26 +#: templates/extras/savedfilter.html:34 templates/ipam/role.html:33 +msgid "Weight" +msgstr "" + +#: dcim/forms/bulk_edit.py:325 dcim/forms/filtersets.py:313 +msgid "Max weight" +msgstr "" + +#: dcim/forms/bulk_edit.py:330 dcim/forms/bulk_edit.py:439 +#: dcim/forms/bulk_edit.py:478 dcim/forms/bulk_import.py:223 +#: dcim/forms/bulk_import.py:329 dcim/forms/bulk_import.py:355 +#: dcim/forms/filtersets.py:318 dcim/forms/filtersets.py:529 +#: dcim/forms/filtersets.py:604 +msgid "Weight unit" +msgstr "" + +#: dcim/forms/bulk_edit.py:344 dcim/forms/bulk_edit.py:800 +#: dcim/forms/bulk_import.py:262 dcim/forms/bulk_import.py:265 +#: dcim/forms/bulk_import.py:490 dcim/forms/bulk_import.py:1286 +#: dcim/forms/bulk_import.py:1290 dcim/forms/filtersets.py:100 +#: dcim/forms/filtersets.py:336 dcim/forms/filtersets.py:350 +#: dcim/forms/filtersets.py:388 dcim/forms/filtersets.py:692 +#: dcim/forms/filtersets.py:941 dcim/forms/filtersets.py:1072 +#: dcim/forms/model_forms.py:241 dcim/forms/model_forms.py:413 +#: dcim/forms/model_forms.py:661 dcim/forms/object_create.py:366 +#: dcim/tables/devices.py:194 dcim/tables/power.py:70 dcim/tables/racks.py:148 +#: ipam/forms/bulk_edit.py:466 ipam/forms/filtersets.py:430 +#: ipam/forms/model_forms.py:573 templates/dcim/device.html:47 +#: templates/dcim/inc/cable_termination.html:16 +#: templates/dcim/powerfeed.html:31 templates/dcim/rack.html:13 +#: templates/dcim/rack/base.html:4 templates/dcim/rack_edit.html:8 +#: templates/dcim/rackreservation.html:19 +#: templates/dcim/rackreservation.html:38 +#: virtualization/forms/model_forms.py:115 +msgid "Rack" +msgstr "" + +#: dcim/forms/bulk_edit.py:346 dcim/forms/bulk_edit.py:623 +#: dcim/forms/filtersets.py:245 dcim/forms/filtersets.py:329 +#: dcim/forms/filtersets.py:414 dcim/forms/filtersets.py:539 +#: dcim/forms/filtersets.py:646 dcim/forms/filtersets.py:846 +#: dcim/forms/model_forms.py:588 dcim/forms/model_forms.py:1373 +#: templates/dcim/device_edit.html:20 templates/dcim/inventoryitem_edit.html:23 +msgid "Hardware" +msgstr "" + +#: dcim/forms/bulk_edit.py:400 dcim/forms/bulk_edit.py:464 +#: dcim/forms/bulk_edit.py:528 dcim/forms/bulk_edit.py:552 +#: dcim/forms/bulk_edit.py:633 dcim/forms/bulk_edit.py:1157 +#: dcim/forms/bulk_edit.py:1544 dcim/forms/bulk_import.py:311 +#: dcim/forms/bulk_import.py:345 dcim/forms/bulk_import.py:387 +#: dcim/forms/bulk_import.py:423 dcim/forms/bulk_import.py:1015 +#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:549 +#: dcim/forms/filtersets.py:625 dcim/forms/filtersets.py:702 +#: dcim/forms/filtersets.py:851 dcim/forms/filtersets.py:1414 +#: dcim/forms/model_forms.py:274 dcim/forms/model_forms.py:288 +#: dcim/forms/model_forms.py:330 dcim/forms/model_forms.py:370 +#: dcim/forms/model_forms.py:967 dcim/forms/model_forms.py:1308 +#: dcim/forms/object_import.py:192 dcim/tables/devices.py:129 +#: dcim/tables/devices.py:205 dcim/tables/devices.py:925 +#: dcim/tables/devicetypes.py:81 dcim/tables/devicetypes.py:304 +#: dcim/tables/modules.py:20 dcim/tables/modules.py:60 +#: templates/dcim/devicetype.html:17 templates/dcim/inventoryitem.html:45 +#: templates/dcim/manufacturer.html:34 templates/dcim/modulebay.html:61 +#: templates/dcim/moduletype.html:15 templates/dcim/platform.html:40 +msgid "Manufacturer" +msgstr "" + +#: dcim/forms/bulk_edit.py:405 dcim/forms/bulk_import.py:317 +#: dcim/forms/filtersets.py:430 dcim/forms/model_forms.py:292 +msgid "Default platform" +msgstr "" + +#: dcim/forms/bulk_edit.py:410 dcim/forms/bulk_edit.py:469 +#: dcim/forms/filtersets.py:433 dcim/forms/filtersets.py:553 +msgid "Part number" +msgstr "" + +#: dcim/forms/bulk_edit.py:414 +msgid "U height" +msgstr "" + +#: dcim/forms/bulk_edit.py:426 +msgid "Exclude from utilization" +msgstr "" + +#: dcim/forms/bulk_edit.py:429 dcim/forms/bulk_edit.py:598 +#: dcim/forms/bulk_import.py:517 dcim/forms/filtersets.py:442 +#: dcim/forms/filtersets.py:724 templates/dcim/device.html:117 +#: templates/dcim/devicetype.html:68 +msgid "Airflow" +msgstr "" + +#: dcim/forms/bulk_edit.py:453 dcim/forms/model_forms.py:303 +#: dcim/tables/devicetypes.py:78 templates/dcim/device.html:107 +#: templates/dcim/devicebay.html:59 templates/dcim/module.html:59 +msgid "Device Type" +msgstr "" + +#: dcim/forms/bulk_edit.py:492 dcim/forms/model_forms.py:336 +#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 +#: templates/dcim/module.html:63 templates/dcim/modulebay.html:65 +#: templates/dcim/moduletype.html:11 +msgid "Module Type" +msgstr "" + +#: dcim/forms/bulk_edit.py:506 dcim/models/devices.py:472 +msgid "VM role" +msgstr "" + +#: dcim/forms/bulk_edit.py:509 dcim/forms/bulk_edit.py:533 +#: dcim/forms/bulk_edit.py:613 dcim/forms/bulk_import.py:368 +#: dcim/forms/bulk_import.py:372 dcim/forms/bulk_import.py:394 +#: dcim/forms/bulk_import.py:398 dcim/forms/bulk_import.py:523 +#: dcim/forms/bulk_import.py:527 dcim/forms/filtersets.py:615 +#: dcim/forms/filtersets.py:630 dcim/forms/filtersets.py:743 +#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:375 +#: dcim/forms/model_forms.py:476 virtualization/forms/bulk_import.py:131 +#: virtualization/forms/bulk_import.py:132 +#: virtualization/forms/filtersets.py:177 +#: virtualization/forms/model_forms.py:216 +msgid "Config template" +msgstr "" + +#: dcim/forms/bulk_edit.py:557 dcim/forms/bulk_edit.py:951 +#: dcim/forms/bulk_import.py:429 dcim/forms/filtersets.py:110 +#: dcim/forms/model_forms.py:435 dcim/forms/model_forms.py:775 +#: dcim/forms/model_forms.py:789 extras/filtersets.py:421 +msgid "Device type" +msgstr "" + +#: dcim/forms/bulk_edit.py:565 dcim/forms/bulk_import.py:410 +#: dcim/forms/filtersets.py:115 dcim/forms/model_forms.py:440 +msgid "Device role" +msgstr "" + +#: dcim/forms/bulk_edit.py:588 dcim/forms/bulk_import.py:435 +#: dcim/forms/filtersets.py:716 dcim/forms/model_forms.py:385 +#: dcim/forms/model_forms.py:444 extras/filtersets.py:437 +#: templates/dcim/device.html:208 templates/dcim/platform.html:27 +#: templates/virtualization/virtualmachine.html:30 +#: virtualization/forms/bulk_edit.py:157 +#: virtualization/forms/bulk_import.py:121 +#: virtualization/forms/filtersets.py:161 +#: virtualization/forms/model_forms.py:205 +msgid "Platform" +msgstr "" + +#: dcim/forms/bulk_edit.py:621 dcim/forms/bulk_edit.py:1171 +#: dcim/forms/bulk_edit.py:1534 dcim/forms/bulk_edit.py:1580 +#: dcim/forms/bulk_import.py:578 dcim/forms/bulk_import.py:640 +#: dcim/forms/bulk_import.py:666 dcim/forms/bulk_import.py:692 +#: dcim/forms/bulk_import.py:712 dcim/forms/bulk_import.py:765 +#: dcim/forms/bulk_import.py:879 dcim/forms/bulk_import.py:927 +#: dcim/forms/bulk_import.py:944 dcim/forms/bulk_import.py:956 +#: dcim/forms/bulk_import.py:1004 dcim/forms/bulk_import.py:1350 +#: dcim/forms/connections.py:23 dcim/forms/filtersets.py:127 +#: dcim/forms/filtersets.py:824 dcim/forms/filtersets.py:957 +#: dcim/forms/filtersets.py:1146 dcim/forms/filtersets.py:1168 +#: dcim/forms/filtersets.py:1190 dcim/forms/filtersets.py:1207 +#: dcim/forms/filtersets.py:1227 dcim/forms/filtersets.py:1334 +#: dcim/forms/filtersets.py:1356 dcim/forms/filtersets.py:1377 +#: dcim/forms/filtersets.py:1392 dcim/forms/filtersets.py:1403 +#: dcim/forms/filtersets.py:1467 dcim/forms/filtersets.py:1491 +#: dcim/forms/filtersets.py:1515 dcim/forms/model_forms.py:554 +#: dcim/forms/model_forms.py:752 dcim/forms/model_forms.py:1003 +#: dcim/forms/model_forms.py:1452 dcim/forms/object_create.py:239 +#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 +#: dcim/tables/connections.py:60 dcim/tables/devices.py:314 +#: dcim/tables/devices.py:374 dcim/tables/devices.py:418 +#: dcim/tables/devices.py:463 dcim/tables/devices.py:511 +#: dcim/tables/devices.py:597 dcim/tables/devices.py:693 +#: dcim/tables/devices.py:753 dcim/tables/devices.py:803 +#: dcim/tables/devices.py:863 dcim/tables/devices.py:915 +#: dcim/tables/devices.py:1037 dcim/tables/modules.py:52 +#: extras/forms/filtersets.py:304 ipam/forms/bulk_import.py:306 +#: ipam/forms/bulk_import.py:492 ipam/forms/bulk_import.py:543 +#: ipam/forms/filtersets.py:594 ipam/forms/model_forms.py:687 +#: ipam/tables/vlans.py:176 templates/dcim/consoleport.html:23 +#: templates/dcim/consoleserverport.html:23 templates/dcim/device.html:13 +#: templates/dcim/device.html:145 templates/dcim/device_edit.html:10 +#: templates/dcim/devicebay.html:23 templates/dcim/devicebay.html:55 +#: templates/dcim/frontport.html:23 templates/dcim/interface.html:31 +#: templates/dcim/interface.html:163 templates/dcim/inventoryitem.html:21 +#: templates/dcim/module.html:55 templates/dcim/modulebay.html:21 +#: templates/dcim/poweroutlet.html:23 templates/dcim/powerport.html:23 +#: templates/dcim/rearport.html:23 templates/dcim/virtualchassis.html:58 +#: templates/dcim/virtualchassis_edit.html:52 +#: templates/dcim/virtualdevicecontext.html:25 +#: templates/ipam/ipaddress_edit.html:42 +#: templates/ipam/l2vpntermination_edit.html:22 +#: templates/ipam/service_create.html:17 templates/ipam/service_edit.html:16 +#: templates/virtualization/virtualmachine.html:115 +#: templates/wireless/inc/wirelesslink_interface.html:6 +#: virtualization/filtersets.py:163 virtualization/forms/bulk_edit.py:134 +#: virtualization/forms/bulk_import.py:98 +#: virtualization/forms/filtersets.py:121 +#: virtualization/forms/model_forms.py:187 +#: virtualization/tables/virtualmachines.py:59 +#: wireless/forms/model_forms.py:100 wireless/forms/model_forms.py:140 +#: wireless/tables/wirelesslan.py:75 +msgid "Device" +msgstr "" + +#: dcim/forms/bulk_edit.py:624 netbox/navigation/menu.py:421 +#: templates/extras/dashboard/widget_config.html:7 +msgid "Configuration" +msgstr "" + +#: dcim/forms/bulk_edit.py:638 dcim/forms/bulk_import.py:590 +#: dcim/forms/model_forms.py:568 dcim/forms/model_forms.py:794 +msgid "Module type" +msgstr "" + +#: dcim/forms/bulk_edit.py:689 dcim/forms/bulk_edit.py:874 +#: dcim/forms/bulk_edit.py:893 dcim/forms/bulk_edit.py:916 +#: dcim/forms/bulk_edit.py:958 dcim/forms/bulk_edit.py:1002 +#: dcim/forms/bulk_edit.py:1053 dcim/forms/bulk_edit.py:1080 +#: dcim/forms/bulk_edit.py:1107 dcim/forms/bulk_edit.py:1125 +#: dcim/forms/bulk_edit.py:1143 dcim/forms/filtersets.py:63 +#: dcim/forms/object_create.py:45 templates/dcim/cable.html:33 +#: templates/dcim/consoleport.html:35 templates/dcim/consoleserverport.html:35 +#: templates/dcim/devicebay.html:31 templates/dcim/frontport.html:35 +#: templates/dcim/inc/panels/inventory_items.html:11 +#: templates/dcim/interface.html:43 templates/dcim/inventoryitem.html:33 +#: templates/dcim/modulebay.html:31 templates/dcim/poweroutlet.html:35 +#: templates/dcim/powerport.html:35 templates/dcim/rearport.html:35 +#: templates/extras/customfield.html:27 templates/generic/bulk_import.html:155 +msgid "Label" +msgstr "" + +#: dcim/forms/bulk_edit.py:698 dcim/forms/filtersets.py:974 +#: templates/dcim/cable.html:51 +msgid "Length" +msgstr "" + +#: dcim/forms/bulk_edit.py:703 dcim/forms/bulk_import.py:1158 +#: dcim/forms/bulk_import.py:1161 dcim/forms/filtersets.py:978 +msgid "Length unit" +msgstr "" + +#: dcim/forms/bulk_edit.py:727 templates/dcim/virtualchassis.html:24 +msgid "Domain" +msgstr "" + +#: dcim/forms/bulk_edit.py:795 dcim/forms/bulk_import.py:1273 +#: dcim/forms/filtersets.py:1063 dcim/forms/model_forms.py:656 +msgid "Power panel" +msgstr "" + +#: dcim/forms/bulk_edit.py:817 dcim/forms/bulk_import.py:1309 +#: dcim/forms/filtersets.py:1085 templates/dcim/powerfeed.html:90 +msgid "Supply" +msgstr "" + +#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1314 +#: dcim/forms/filtersets.py:1090 templates/dcim/powerfeed.html:102 +msgid "Phase" +msgstr "" + +#: dcim/forms/bulk_edit.py:829 dcim/forms/filtersets.py:1095 +#: templates/dcim/powerfeed.html:94 +msgid "Voltage" +msgstr "" + +#: dcim/forms/bulk_edit.py:833 dcim/forms/filtersets.py:1099 +#: templates/dcim/powerfeed.html:98 +msgid "Amperage" +msgstr "" + +#: dcim/forms/bulk_edit.py:837 dcim/forms/filtersets.py:1103 +msgid "Max utilization" +msgstr "" + +#: dcim/forms/bulk_edit.py:841 dcim/forms/bulk_edit.py:1200 +#: dcim/forms/bulk_edit.py:1217 dcim/forms/bulk_edit.py:1234 +#: dcim/forms/bulk_edit.py:1252 dcim/forms/bulk_edit.py:1340 +#: dcim/forms/bulk_edit.py:1478 dcim/forms/bulk_edit.py:1495 +msgid "Mark connected" +msgstr "" + +#: dcim/forms/bulk_edit.py:926 +msgid "Maximum draw" +msgstr "" + +#: dcim/forms/bulk_edit.py:929 dcim/models/device_component_templates.py:257 +#: dcim/models/device_components.py:358 +msgid "Maximum power draw (watts)" +msgstr "" + +#: dcim/forms/bulk_edit.py:932 +msgid "Allocated draw" +msgstr "" + +#: dcim/forms/bulk_edit.py:935 dcim/models/device_component_templates.py:264 +#: dcim/models/device_components.py:365 +msgid "Allocated power draw (watts)" +msgstr "" + +#: dcim/forms/bulk_edit.py:968 dcim/forms/bulk_import.py:723 +#: dcim/forms/model_forms.py:847 dcim/forms/model_forms.py:1075 +#: dcim/forms/model_forms.py:1360 dcim/forms/object_import.py:60 +msgid "Power port" +msgstr "" + +#: dcim/forms/bulk_edit.py:973 +msgid "Feed leg" +msgstr "" + +#: dcim/forms/bulk_edit.py:1019 dcim/forms/bulk_edit.py:1325 +msgid "Management only" +msgstr "" + +#: dcim/forms/bulk_edit.py:1029 dcim/forms/bulk_edit.py:1331 +#: dcim/forms/bulk_import.py:813 dcim/forms/filtersets.py:1285 +#: dcim/forms/object_import.py:95 dcim/models/device_component_templates.py:412 +#: dcim/models/device_components.py:668 +msgid "PoE mode" +msgstr "" + +#: dcim/forms/bulk_edit.py:1035 dcim/forms/bulk_edit.py:1337 +#: dcim/forms/bulk_import.py:819 dcim/forms/filtersets.py:1290 +#: dcim/forms/object_import.py:100 +#: dcim/models/device_component_templates.py:418 +#: dcim/models/device_components.py:674 +msgid "PoE type" +msgstr "" + +#: dcim/forms/bulk_edit.py:1041 dcim/forms/filtersets.py:1295 +#: dcim/forms/object_import.py:105 +msgid "Wireless role" +msgstr "" + +#: dcim/forms/bulk_edit.py:1178 dcim/forms/model_forms.py:587 +#: dcim/forms/model_forms.py:1018 dcim/tables/devices.py:337 +#: templates/dcim/consoleport.html:27 templates/dcim/consoleserverport.html:27 +#: templates/dcim/frontport.html:27 templates/dcim/interface.html:35 +#: templates/dcim/module.html:51 templates/dcim/modulebay.html:57 +#: templates/dcim/poweroutlet.html:27 templates/dcim/powerport.html:27 +#: templates/dcim/rearport.html:27 +msgid "Module" +msgstr "" + +#: dcim/forms/bulk_edit.py:1305 dcim/tables/devices.py:663 +#: templates/dcim/interface.html:105 +msgid "LAG" +msgstr "" + +#: dcim/forms/bulk_edit.py:1310 dcim/forms/model_forms.py:1102 +msgid "Virtual device contexts" +msgstr "" + +#: dcim/forms/bulk_edit.py:1316 dcim/forms/bulk_import.py:651 +#: dcim/forms/bulk_import.py:677 dcim/forms/filtersets.py:1155 +#: dcim/forms/filtersets.py:1177 dcim/forms/filtersets.py:1249 +#: dcim/tables/devices.py:609 +#: templates/circuits/inc/circuit_termination.html:94 +#: templates/dcim/consoleport.html:43 templates/dcim/consoleserverport.html:43 +msgid "Speed" +msgstr "" + +#: dcim/forms/bulk_edit.py:1345 dcim/forms/bulk_import.py:822 +#: virtualization/forms/bulk_edit.py:230 +#: virtualization/forms/bulk_import.py:164 +msgid "Mode" +msgstr "" + +#: dcim/forms/bulk_edit.py:1353 dcim/forms/model_forms.py:1151 +#: ipam/forms/bulk_import.py:180 ipam/forms/filtersets.py:481 +#: ipam/models/vlans.py:82 virtualization/forms/bulk_edit.py:237 +#: virtualization/forms/model_forms.py:303 +msgid "VLAN group" +msgstr "" + +#: dcim/forms/bulk_edit.py:1361 dcim/forms/model_forms.py:1156 +#: dcim/tables/devices.py:582 virtualization/forms/bulk_edit.py:245 +#: virtualization/forms/model_forms.py:308 +msgid "Untagged VLAN" +msgstr "" + +#: dcim/forms/bulk_edit.py:1369 dcim/forms/model_forms.py:1165 +#: dcim/tables/devices.py:588 virtualization/forms/bulk_edit.py:253 +#: virtualization/forms/model_forms.py:317 +msgid "Tagged VLANs" +msgstr "" + +#: dcim/forms/bulk_edit.py:1379 dcim/forms/model_forms.py:1138 +msgid "Wireless LAN group" +msgstr "" + +#: dcim/forms/bulk_edit.py:1384 dcim/forms/model_forms.py:1143 +#: dcim/tables/devices.py:618 netbox/navigation/menu.py:134 +#: templates/dcim/interface.html:285 wireless/tables/wirelesslan.py:24 +msgid "Wireless LANs" +msgstr "" + +#: dcim/forms/bulk_edit.py:1393 dcim/forms/filtersets.py:1223 +#: dcim/forms/model_forms.py:1184 ipam/forms/bulk_edit.py:272 +#: ipam/forms/bulk_edit.py:363 ipam/forms/filtersets.py:170 +#: templates/dcim/interface.html:122 templates/ipam/prefix.html:96 +#: virtualization/forms/model_forms.py:331 +msgid "Addressing" +msgstr "" + +#: dcim/forms/bulk_edit.py:1394 dcim/forms/filtersets.py:645 +#: dcim/forms/model_forms.py:1185 virtualization/forms/model_forms.py:332 +msgid "Operation" +msgstr "" + +#: dcim/forms/bulk_edit.py:1395 dcim/forms/filtersets.py:1224 +#: dcim/forms/model_forms.py:879 dcim/forms/model_forms.py:1187 +msgid "PoE" +msgstr "" + +#: dcim/forms/bulk_edit.py:1396 dcim/forms/model_forms.py:1186 +#: templates/dcim/interface.html:93 virtualization/forms/bulk_edit.py:264 +#: virtualization/forms/model_forms.py:333 +msgid "Related Interfaces" +msgstr "" + +#: dcim/forms/bulk_edit.py:1397 dcim/forms/model_forms.py:1188 +#: virtualization/forms/bulk_edit.py:265 +#: virtualization/forms/model_forms.py:334 +msgid "802.1Q Switching" +msgstr "" + +#: dcim/forms/bulk_edit.py:1458 dcim/forms/bulk_edit.py:1460 +msgid "Interface mode must be specified to assign VLANs" +msgstr "" + +#: dcim/forms/bulk_edit.py:1465 dcim/forms/common.py:50 +msgid "An access interface cannot have tagged VLANs assigned." +msgstr "" + +#: dcim/forms/bulk_import.py:63 +msgid "Name of parent region" +msgstr "" + +#: dcim/forms/bulk_import.py:77 +msgid "Name of parent site group" +msgstr "" + +#: dcim/forms/bulk_import.py:96 +msgid "Assigned region" +msgstr "" + +#: dcim/forms/bulk_import.py:103 tenancy/forms/bulk_import.py:44 +#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +msgid "Assigned group" +msgstr "" + +#: dcim/forms/bulk_import.py:122 +msgid "available options" +msgstr "" + +#: dcim/forms/bulk_import.py:133 dcim/forms/bulk_import.py:480 +#: dcim/forms/bulk_import.py:1270 ipam/forms/bulk_import.py:177 +#: ipam/forms/bulk_import.py:444 virtualization/forms/bulk_import.py:62 +#: virtualization/forms/bulk_import.py:88 +msgid "Assigned site" +msgstr "" + +#: dcim/forms/bulk_import.py:140 +msgid "Parent location" +msgstr "" + +#: dcim/forms/bulk_import.py:142 +msgid "Location not found." +msgstr "" + +#: dcim/forms/bulk_import.py:191 +msgid "Name of assigned tenant" +msgstr "" + +#: dcim/forms/bulk_import.py:203 +msgid "Name of assigned role" +msgstr "" + +#: dcim/forms/bulk_import.py:209 +msgid "Rack type" +msgstr "" + +#: dcim/forms/bulk_import.py:214 +msgid "Rail-to-rail width (in inches)" +msgstr "" + +#: dcim/forms/bulk_import.py:220 +msgid "Unit for outer dimensions" +msgstr "" + +#: dcim/forms/bulk_import.py:226 +msgid "Unit for rack weights" +msgstr "" + +#: dcim/forms/bulk_import.py:252 +msgid "Parent site" +msgstr "" + +#: dcim/forms/bulk_import.py:259 dcim/forms/bulk_import.py:1283 +msgid "Rack's location (if any)" +msgstr "" + +#: dcim/forms/bulk_import.py:268 dcim/forms/model_forms.py:246 +#: dcim/tables/racks.py:153 templates/dcim/rackreservation.html:11 +#: templates/dcim/rackreservation.html:52 +msgid "Units" +msgstr "" + +#: dcim/forms/bulk_import.py:271 +msgid "Comma-separated list of individual unit numbers" +msgstr "" + +#: dcim/forms/bulk_import.py:314 +msgid "The manufacturer which produces this device type" +msgstr "" + +#: dcim/forms/bulk_import.py:321 +msgid "The default platform for devices of this type (optional)" +msgstr "" + +#: dcim/forms/bulk_import.py:326 +msgid "Device weight" +msgstr "" + +#: dcim/forms/bulk_import.py:332 +msgid "Unit for device weight" +msgstr "" + +#: dcim/forms/bulk_import.py:352 +msgid "Module weight" +msgstr "" + +#: dcim/forms/bulk_import.py:358 +msgid "Unit for module weight" +msgstr "" + +#: dcim/forms/bulk_import.py:391 +msgid "Limit platform assignments to this manufacturer" +msgstr "" + +#: dcim/forms/bulk_import.py:413 tenancy/forms/bulk_import.py:106 +msgid "Assigned role" +msgstr "" + +#: dcim/forms/bulk_import.py:426 +msgid "Device type manufacturer" +msgstr "" + +#: dcim/forms/bulk_import.py:432 +msgid "Device type model" +msgstr "" + +#: dcim/forms/bulk_import.py:439 virtualization/forms/bulk_import.py:125 +msgid "Assigned platform" +msgstr "" + +#: dcim/forms/bulk_import.py:447 dcim/forms/bulk_import.py:451 +#: dcim/forms/model_forms.py:460 +msgid "Virtual chassis" +msgstr "" + +#: dcim/forms/bulk_import.py:454 dcim/forms/model_forms.py:449 +#: dcim/tables/devices.py:231 extras/filtersets.py:470 +#: extras/forms/filtersets.py:305 ipam/forms/bulk_edit.py:480 +#: ipam/forms/model_forms.py:590 templates/dcim/device.html:256 +#: templates/virtualization/cluster.html:11 +#: templates/virtualization/virtualmachine.html:92 +#: templates/virtualization/virtualmachine.html:102 +#: virtualization/filtersets.py:153 virtualization/filtersets.py:268 +#: virtualization/forms/bulk_edit.py:126 virtualization/forms/bulk_import.py:91 +#: virtualization/forms/filtersets.py:95 virtualization/forms/filtersets.py:116 +#: virtualization/forms/filtersets.py:192 +#: virtualization/forms/model_forms.py:81 +#: virtualization/forms/model_forms.py:178 +#: virtualization/tables/virtualmachines.py:55 +msgid "Cluster" +msgstr "" + +#: dcim/forms/bulk_import.py:458 +msgid "Virtualization cluster" +msgstr "" + +#: dcim/forms/bulk_import.py:487 +msgid "Assigned location (if any)" +msgstr "" + +#: dcim/forms/bulk_import.py:494 +msgid "Assigned rack (if any)" +msgstr "" + +#: dcim/forms/bulk_import.py:497 +msgid "Face" +msgstr "" + +#: dcim/forms/bulk_import.py:500 +msgid "Mounted rack face" +msgstr "" + +#: dcim/forms/bulk_import.py:507 +msgid "Parent device (for child devices)" +msgstr "" + +#: dcim/forms/bulk_import.py:510 +msgid "Device bay" +msgstr "" + +#: dcim/forms/bulk_import.py:514 +msgid "Device bay in which this device is installed (for child devices)" +msgstr "" + +#: dcim/forms/bulk_import.py:520 +msgid "Airflow direction" +msgstr "" + +#: dcim/forms/bulk_import.py:581 +msgid "The device in which this module is installed" +msgstr "" + +#: dcim/forms/bulk_import.py:584 dcim/forms/model_forms.py:561 +msgid "Module bay" +msgstr "" + +#: dcim/forms/bulk_import.py:587 +msgid "The module bay in which this module is installed" +msgstr "" + +#: dcim/forms/bulk_import.py:593 +msgid "The type of module" +msgstr "" + +#: dcim/forms/bulk_import.py:601 dcim/forms/model_forms.py:574 +msgid "Replicate components" +msgstr "" + +#: dcim/forms/bulk_import.py:603 +msgid "" +"Automatically populate components associated with this module type (enabled " +"by default)" +msgstr "" + +#: dcim/forms/bulk_import.py:606 dcim/forms/model_forms.py:580 +msgid "Adopt components" +msgstr "" + +#: dcim/forms/bulk_import.py:608 dcim/forms/model_forms.py:583 +msgid "Adopt already existing components" +msgstr "" + +#: dcim/forms/bulk_import.py:648 dcim/forms/bulk_import.py:674 +#: dcim/forms/bulk_import.py:700 +msgid "Port type" +msgstr "" + +#: dcim/forms/bulk_import.py:656 dcim/forms/bulk_import.py:682 +msgid "Port speed in bps" +msgstr "" + +#: dcim/forms/bulk_import.py:720 +msgid "Outlet type" +msgstr "" + +#: dcim/forms/bulk_import.py:727 +msgid "Local power port which feeds this outlet" +msgstr "" + +#: dcim/forms/bulk_import.py:730 +msgid "Feed lag" +msgstr "" + +#: dcim/forms/bulk_import.py:733 +msgid "Electrical phase (for three-phase circuits)" +msgstr "" + +#: dcim/forms/bulk_import.py:774 dcim/forms/model_forms.py:1113 +#: virtualization/forms/bulk_import.py:154 +#: virtualization/forms/model_forms.py:287 +msgid "Parent interface" +msgstr "" + +#: dcim/forms/bulk_import.py:781 dcim/forms/model_forms.py:1121 +#: virtualization/forms/bulk_import.py:161 +#: virtualization/forms/model_forms.py:295 +msgid "Bridged interface" +msgstr "" + +#: dcim/forms/bulk_import.py:784 +msgid "Lag" +msgstr "" + +#: dcim/forms/bulk_import.py:788 +msgid "Parent LAG interface" +msgstr "" + +#: dcim/forms/bulk_import.py:791 +msgid "Vdcs" +msgstr "" + +#: dcim/forms/bulk_import.py:796 +msgid "VDC names separated by commas, encased with double quotes. Example:" +msgstr "" + +#: dcim/forms/bulk_import.py:802 +msgid "Physical medium" +msgstr "" + +#: dcim/forms/bulk_import.py:805 dcim/forms/filtersets.py:1256 +msgid "Duplex" +msgstr "" + +#: dcim/forms/bulk_import.py:810 +msgid "Poe mode" +msgstr "" + +#: dcim/forms/bulk_import.py:816 +msgid "Poe type" +msgstr "" + +#: dcim/forms/bulk_import.py:825 virtualization/forms/bulk_import.py:167 +msgid "IEEE 802.1Q operational mode (for L2 interfaces)" +msgstr "" + +#: dcim/forms/bulk_import.py:832 ipam/forms/bulk_import.py:163 +#: ipam/forms/bulk_import.py:249 ipam/forms/bulk_import.py:285 +#: ipam/forms/filtersets.py:200 ipam/forms/filtersets.py:270 +#: ipam/forms/filtersets.py:325 virtualization/forms/bulk_import.py:174 +msgid "Assigned VRF" +msgstr "" + +#: dcim/forms/bulk_import.py:835 +msgid "Rf role" +msgstr "" + +#: dcim/forms/bulk_import.py:838 +msgid "Wireless role (AP/station)" +msgstr "" + +#: dcim/forms/bulk_import.py:884 dcim/forms/model_forms.py:892 +#: dcim/forms/model_forms.py:1368 dcim/forms/object_import.py:122 +msgid "Rear port" +msgstr "" + +#: dcim/forms/bulk_import.py:887 +msgid "Corresponding rear port" +msgstr "" + +#: dcim/forms/bulk_import.py:892 dcim/forms/bulk_import.py:933 +#: dcim/forms/bulk_import.py:1148 +msgid "Physical medium classification" +msgstr "" + +#: dcim/forms/bulk_import.py:961 dcim/tables/devices.py:824 +msgid "Installed device" +msgstr "" + +#: dcim/forms/bulk_import.py:965 +msgid "Child device installed within this bay" +msgstr "" + +#: dcim/forms/bulk_import.py:967 +msgid "Child device not found." +msgstr "" + +#: dcim/forms/bulk_import.py:1025 +msgid "Parent inventory item" +msgstr "" + +#: dcim/forms/bulk_import.py:1028 +msgid "Component type" +msgstr "" + +#: dcim/forms/bulk_import.py:1032 +msgid "Component Type" +msgstr "" + +#: dcim/forms/bulk_import.py:1035 +msgid "Compnent name" +msgstr "" + +#: dcim/forms/bulk_import.py:1037 +msgid "Component Name" +msgstr "" + +#: dcim/forms/bulk_import.py:1103 +msgid "Side A device" +msgstr "" + +#: dcim/forms/bulk_import.py:1106 dcim/forms/bulk_import.py:1124 +msgid "Device name" +msgstr "" + +#: dcim/forms/bulk_import.py:1109 +msgid "Side A type" +msgstr "" + +#: dcim/forms/bulk_import.py:1112 dcim/forms/bulk_import.py:1130 +msgid "Termination type" +msgstr "" + +#: dcim/forms/bulk_import.py:1115 +msgid "Side A name" +msgstr "" + +#: dcim/forms/bulk_import.py:1116 dcim/forms/bulk_import.py:1134 +msgid "Termination name" +msgstr "" + +#: dcim/forms/bulk_import.py:1121 +msgid "Side B device" +msgstr "" + +#: dcim/forms/bulk_import.py:1127 +msgid "Side B type" +msgstr "" + +#: dcim/forms/bulk_import.py:1133 +msgid "Side B name" +msgstr "" + +#: dcim/forms/bulk_import.py:1142 wireless/forms/bulk_import.py:86 +msgid "Connection status" +msgstr "" + +#: dcim/forms/bulk_import.py:1221 dcim/forms/model_forms.py:688 +#: dcim/tables/devices.py:1007 templates/dcim/device.html:147 +#: templates/dcim/virtualchassis.html:28 templates/dcim/virtualchassis.html:60 +msgid "Master" +msgstr "" + +#: dcim/forms/bulk_import.py:1225 +msgid "Master device" +msgstr "" + +#: dcim/forms/bulk_import.py:1242 +msgid "Name of parent site" +msgstr "" + +#: dcim/forms/bulk_import.py:1276 +msgid "Upstream power panel" +msgstr "" + +#: dcim/forms/bulk_import.py:1306 +msgid "Primary or redundant" +msgstr "" + +#: dcim/forms/bulk_import.py:1311 +msgid "Supply type (AC/DC)" +msgstr "" + +#: dcim/forms/bulk_import.py:1316 +msgid "Single or three-phase" +msgstr "" + +#: dcim/forms/common.py:24 dcim/models/device_components.py:529 +#: templates/dcim/interface.html:58 +#: templates/virtualization/vminterface.html:58 +#: virtualization/forms/bulk_edit.py:222 +msgid "MTU" +msgstr "" + +#: dcim/forms/common.py:65 +#, python-brace-format +msgid "" +"The tagged VLANs ({vlans}) must belong to the same site as the interface's " +"parent device/VM, or they must be global" +msgstr "" + +#: dcim/forms/common.py:110 +msgid "" +"Cannot install module with placeholder values in a module bay with no " +"position defined." +msgstr "" + +#: dcim/forms/common.py:119 +#, python-brace-format +msgid "Cannot adopt {model} {name} as it already belongs to a module" +msgstr "" + +#: dcim/forms/common.py:128 +#, python-brace-format +msgid "A {model} named {name} already exists" +msgstr "" + +#: dcim/forms/connections.py:45 dcim/tables/power.py:66 +#: templates/dcim/inc/cable_termination.html:37 +#: templates/dcim/powerfeed.html:27 templates/dcim/powerpanel.html:19 +#: templates/dcim/trace/powerpanel.html:4 +msgid "Power Panel" +msgstr "" + +#: dcim/forms/connections.py:54 dcim/forms/model_forms.py:669 +#: templates/dcim/powerfeed.html:22 templates/dcim/powerport.html:84 +msgid "Power Feed" +msgstr "" + +#: dcim/forms/connections.py:74 +msgid "Side" +msgstr "" + +#: dcim/forms/filtersets.py:140 +msgid "Parent region" +msgstr "" + +#: dcim/forms/filtersets.py:154 tenancy/forms/bulk_import.py:28 +#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 +#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 +#: wireless/forms/filtersets.py:24 +msgid "Parent group" +msgstr "" + +#: dcim/forms/filtersets.py:244 dcim/forms/filtersets.py:328 +msgid "Function" +msgstr "" + +#: dcim/forms/filtersets.py:415 dcim/forms/model_forms.py:308 +#: templates/inc/panels/image_attachments.html:5 +msgid "Images" +msgstr "" + +#: dcim/forms/filtersets.py:416 dcim/forms/filtersets.py:540 +#: dcim/forms/filtersets.py:649 +msgid "Components" +msgstr "" + +#: dcim/forms/filtersets.py:437 +msgid "Subdevice role" +msgstr "" + +#: dcim/forms/filtersets.py:652 extras/forms/model_forms.py:496 +#: templates/extras/configrevision.html:171 users/forms/model_forms.py:63 +msgid "Miscellaneous" +msgstr "" + +#: dcim/forms/filtersets.py:710 +msgid "Model" +msgstr "" + +#: dcim/forms/filtersets.py:761 +msgid "Virtual chassis member" +msgstr "" + +#: dcim/forms/filtersets.py:1115 +msgid "Cabled" +msgstr "" + +#: dcim/forms/filtersets.py:1122 +msgid "Occupied" +msgstr "" + +#: dcim/forms/filtersets.py:1147 dcim/forms/filtersets.py:1169 +#: dcim/forms/filtersets.py:1191 dcim/forms/filtersets.py:1208 +#: dcim/forms/filtersets.py:1228 dcim/tables/devices.py:367 +#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:59 +#: templates/dcim/frontport.html:74 templates/dcim/interface.html:142 +#: templates/dcim/powerfeed.html:118 templates/dcim/poweroutlet.html:63 +#: templates/dcim/powerport.html:63 templates/dcim/rearport.html:70 +msgid "Connection" +msgstr "" + +#: dcim/forms/filtersets.py:1236 dcim/forms/model_forms.py:1476 +#: templates/dcim/virtualdevicecontext.html:16 +msgid "Virtual Device Context" +msgstr "" + +#: dcim/forms/filtersets.py:1239 extras/forms/bulk_edit.py:294 +#: extras/forms/bulk_import.py:177 extras/forms/filtersets.py:454 +#: extras/forms/model_forms.py:445 extras/tables/tables.py:482 +#: templates/extras/journalentry.html:33 +msgid "Kind" +msgstr "" + +#: dcim/forms/filtersets.py:1268 +msgid "Mgmt only" +msgstr "" + +#: dcim/forms/filtersets.py:1280 dcim/forms/model_forms.py:1179 +#: dcim/models/device_components.py:627 templates/dcim/interface.html:130 +msgid "WWN" +msgstr "" + +#: dcim/forms/filtersets.py:1300 +msgid "Wireless channel" +msgstr "" + +#: dcim/forms/filtersets.py:1304 +msgid "Channel frequency (MHz)" +msgstr "" + +#: dcim/forms/filtersets.py:1308 +msgid "Channel width (MHz)" +msgstr "" + +#: dcim/forms/filtersets.py:1312 templates/dcim/interface.html:86 +msgid "Transmit power (dBm)" +msgstr "" + +#: dcim/forms/filtersets.py:1335 dcim/forms/filtersets.py:1357 +#: dcim/tables/devices.py:344 templates/dcim/cable.html:12 +#: templates/dcim/cable_edit.html:46 templates/dcim/cable_trace.html:43 +#: templates/dcim/frontport.html:84 +#: templates/dcim/inc/connection_endpoints.html:4 +#: templates/dcim/rearport.html:80 templates/dcim/trace/cable.html:7 +msgid "Cable" +msgstr "" + +#: dcim/forms/filtersets.py:1425 dcim/tables/devices.py:934 +msgid "Discovered" +msgstr "" + +#: dcim/forms/formsets.py:20 +#, python-brace-format +msgid "A virtual chassis member already exists in position {vc_position}." +msgstr "" + +#: dcim/forms/model_forms.py:101 dcim/tables/devices.py:183 +#: templates/dcim/sitegroup.html:26 +msgid "Site Group" +msgstr "" + +#: dcim/forms/model_forms.py:142 +msgid "Contact Info" +msgstr "" + +#: dcim/forms/model_forms.py:197 templates/dcim/rackrole.html:20 +msgid "Rack Role" +msgstr "" + +#: dcim/forms/model_forms.py:248 +msgid "" +"Comma-separated list of numeric unit IDs. A range may be specified using a " +"hyphen." +msgstr "" + +#: dcim/forms/model_forms.py:259 dcim/tables/racks.py:133 +msgid "Reservation" +msgstr "" + +#: dcim/forms/model_forms.py:297 dcim/forms/model_forms.py:380 +#: utilities/forms/fields/fields.py:47 +msgid "Slug" +msgstr "" + +#: dcim/forms/model_forms.py:304 templates/dcim/devicetype.html:12 +msgid "Chassis" +msgstr "" + +#: dcim/forms/model_forms.py:356 templates/dcim/devicerole.html:24 +msgid "Device Role" +msgstr "" + +#: dcim/forms/model_forms.py:424 dcim/models/devices.py:632 +msgid "The lowest-numbered unit occupied by the device" +msgstr "" + +#: dcim/forms/model_forms.py:468 +msgid "The position in the virtual chassis this device is identified by" +msgstr "" + +#: dcim/forms/model_forms.py:472 templates/dcim/device.html:148 +#: templates/dcim/virtualchassis.html:61 +#: templates/dcim/virtualchassis_edit.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:13 tenancy/forms/bulk_edit.py:146 +#: tenancy/forms/filtersets.py:111 +msgid "Priority" +msgstr "" + +#: dcim/forms/model_forms.py:473 +msgid "The priority of the device in the virtual chassis" +msgstr "" + +#: dcim/forms/model_forms.py:577 +msgid "Automatically populate components associated with this module type" +msgstr "" + +#: dcim/forms/model_forms.py:622 +msgid "Maximum length is 32767 (any unit)" +msgstr "" + +#: dcim/forms/model_forms.py:670 +msgid "Characteristics" +msgstr "" + +#: dcim/forms/model_forms.py:1129 +msgid "LAG interface" +msgstr "" + +#: dcim/forms/model_forms.py:1183 dcim/forms/model_forms.py:1344 +#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:320 +#: ipam/forms/bulk_import.py:557 ipam/forms/model_forms.py:272 +#: ipam/forms/model_forms.py:281 ipam/forms/model_forms.py:807 +#: ipam/forms/model_forms.py:816 ipam/tables/fhrp.py:64 ipam/tables/ip.py:368 +#: ipam/tables/vlans.py:165 templates/circuits/inc/circuit_termination.html:78 +#: templates/dcim/frontport.html:113 templates/dcim/interface.html:27 +#: templates/dcim/interface.html:186 templates/dcim/interface.html:318 +#: templates/dcim/inventoryitem_edit.html:54 templates/dcim/rearport.html:109 +#: templates/ipam/fhrpgroupassignment_edit.html:11 +#: templates/virtualization/vminterface.html:19 +#: templates/wireless/inc/wirelesslink_interface.html:10 +#: templates/wireless/wirelesslink.html:10 +#: templates/wireless/wirelesslink.html:49 +#: virtualization/forms/model_forms.py:330 wireless/forms/model_forms.py:112 +#: wireless/forms/model_forms.py:152 +msgid "Interface" +msgstr "" + +#: dcim/forms/model_forms.py:1277 +msgid "Child Device" +msgstr "" + +#: dcim/forms/model_forms.py:1278 +msgid "" +"Child devices must first be created and assigned to the site and rack of the " +"parent device." +msgstr "" + +#: dcim/forms/model_forms.py:1320 +msgid "Console port" +msgstr "" + +#: dcim/forms/model_forms.py:1328 +msgid "Console server port" +msgstr "" + +#: dcim/forms/model_forms.py:1336 +msgid "Front port" +msgstr "" + +#: dcim/forms/model_forms.py:1352 +msgid "Power outlet" +msgstr "" + +#: dcim/forms/model_forms.py:1372 templates/dcim/inventoryitem.html:17 +#: templates/dcim/inventoryitem_edit.html:10 +msgid "Inventory Item" +msgstr "" + +#: dcim/forms/model_forms.py:1424 +msgid "An InventoryItem can only be assigned to a single component." +msgstr "" + +#: dcim/forms/model_forms.py:1438 templates/dcim/inventoryitemrole.html:15 +msgid "Inventory Item Role" +msgstr "" + +#: dcim/forms/model_forms.py:1458 templates/dcim/device.html:212 +#: templates/dcim/virtualdevicecontext.html:33 +#: templates/virtualization/virtualmachine.html:51 +msgid "Primary IPv4" +msgstr "" + +#: dcim/forms/model_forms.py:1467 templates/dcim/device.html:228 +#: templates/dcim/virtualdevicecontext.html:44 +#: templates/virtualization/virtualmachine.html:67 +msgid "Primary IPv6" +msgstr "" + +#: dcim/forms/object_create.py:47 dcim/forms/object_create.py:181 +#: dcim/forms/object_create.py:321 +msgid "" +"Alphanumeric ranges are supported. (Must match the number of objects being " +"created.)" +msgstr "" + +#: dcim/forms/object_create.py:67 +#, python-brace-format +msgid "" +"The provided pattern specifies {value_count} values, but {pattern_count} are " +"expected." +msgstr "" + +#: dcim/forms/object_create.py:109 dcim/forms/object_create.py:253 +#: dcim/tables/devices.py:281 +msgid "Rear ports" +msgstr "" + +#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:254 +msgid "Select one rear port assignment for each front port being created." +msgstr "" + +#: dcim/forms/object_create.py:233 +#, python-brace-format +msgid "" +"The string {module} will be replaced with the position of the " +"assigned module, if any." +msgstr "" + +#: dcim/forms/object_create.py:375 dcim/tables/devices.py:1013 +#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:54 +#: templates/dcim/virtualchassis_edit.html:48 templates/ipam/fhrpgroup.html:39 +msgid "Members" +msgstr "" + +#: dcim/forms/object_create.py:384 +msgid "Initial position" +msgstr "" + +#: dcim/forms/object_create.py:387 +msgid "" +"Position of the first member device. Increases by one for each additional " +"member." +msgstr "" + +#: dcim/forms/object_create.py:401 +msgid "A position must be specified for the first VC member." +msgstr "" + +#: dcim/models/cables.py:63 dcim/models/device_component_templates.py:56 +#: dcim/models/device_components.py:64 extras/models/customfields.py:102 +msgid "label" +msgstr "" + +#: dcim/models/cables.py:72 +msgid "length" +msgstr "" + +#: dcim/models/cables.py:79 +msgid "length unit" +msgstr "" + +#: dcim/models/cables.py:94 +msgid "cable" +msgstr "" + +#: dcim/models/cables.py:95 +msgid "cables" +msgstr "" + +#: dcim/models/cables.py:247 ipam/models/asns.py:37 +msgid "end" +msgstr "" + +#: dcim/models/cables.py:297 +msgid "cable termination" +msgstr "" + +#: dcim/models/cables.py:298 +msgid "cable terminations" +msgstr "" + +#: dcim/models/cables.py:421 extras/models/configs.py:50 +msgid "is active" +msgstr "" + +#: dcim/models/cables.py:425 +msgid "is complete" +msgstr "" + +#: dcim/models/cables.py:429 +msgid "is split" +msgstr "" + +#: dcim/models/cables.py:435 +msgid "cable path" +msgstr "" + +#: dcim/models/cables.py:436 +msgid "cable paths" +msgstr "" + +#: dcim/models/device_component_templates.py:47 +#, python-brace-format +msgid "" +"{module} is accepted as a substitution for the module bay position when " +"attached to a module type." +msgstr "" + +#: dcim/models/device_component_templates.py:59 +#: dcim/models/device_components.py:67 +msgid "Physical label" +msgstr "" + +#: dcim/models/device_component_templates.py:104 +msgid "Component templates cannot be moved to a different device type." +msgstr "" + +#: dcim/models/device_component_templates.py:155 +msgid "" +"A component template cannot be associated with both a device type and a " +"module type." +msgstr "" + +#: dcim/models/device_component_templates.py:159 +msgid "" +"A component template must be associated with either a device type or a " +"module type." +msgstr "" + +#: dcim/models/device_component_templates.py:187 +msgid "console port template" +msgstr "" + +#: dcim/models/device_component_templates.py:188 +msgid "console port templates" +msgstr "" + +#: dcim/models/device_component_templates.py:221 +msgid "console server port template" +msgstr "" + +#: dcim/models/device_component_templates.py:222 +msgid "console server port templates" +msgstr "" + +#: dcim/models/device_component_templates.py:253 +#: dcim/models/device_components.py:354 +msgid "maximum draw" +msgstr "" + +#: dcim/models/device_component_templates.py:260 +#: dcim/models/device_components.py:361 +msgid "allocated draw" +msgstr "" + +#: dcim/models/device_component_templates.py:270 +msgid "power port template" +msgstr "" + +#: dcim/models/device_component_templates.py:271 +msgid "power port templates" +msgstr "" + +#: dcim/models/device_component_templates.py:290 +#: dcim/models/device_components.py:384 +#, python-brace-format +msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." +msgstr "" + +#: dcim/models/device_component_templates.py:322 +#: dcim/models/device_components.py:479 +msgid "feed leg" +msgstr "" + +#: dcim/models/device_component_templates.py:326 +#: dcim/models/device_components.py:483 +msgid "Phase (for three-phase feeds)" +msgstr "" + +#: dcim/models/device_component_templates.py:332 +msgid "power outlet template" +msgstr "" + +#: dcim/models/device_component_templates.py:333 +msgid "power outlet templates" +msgstr "" + +#: dcim/models/device_component_templates.py:342 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device type" +msgstr "" + +#: dcim/models/device_component_templates.py:346 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same module type" +msgstr "" + +#: dcim/models/device_component_templates.py:398 +#: dcim/models/device_components.py:609 +msgid "management only" +msgstr "" + +#: dcim/models/device_component_templates.py:406 +#: dcim/models/device_components.py:552 +msgid "bridge interface" +msgstr "" + +#: dcim/models/device_component_templates.py:424 +#: dcim/models/device_components.py:634 +msgid "wireless role" +msgstr "" + +#: dcim/models/device_component_templates.py:430 +msgid "interface template" +msgstr "" + +#: dcim/models/device_component_templates.py:431 +msgid "interface templates" +msgstr "" + +#: dcim/models/device_component_templates.py:438 +#: dcim/models/device_components.py:796 +#: virtualization/models/virtualmachines.py:340 +msgid "An interface cannot be bridged to itself." +msgstr "" + +#: dcim/models/device_component_templates.py:441 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same device type" +msgstr "" + +#: dcim/models/device_component_templates.py:445 +#, python-brace-format +msgid "Bridge interface ({bridge}) must belong to the same module type" +msgstr "" + +#: dcim/models/device_component_templates.py:501 +#: dcim/models/device_components.py:976 +msgid "rear port position" +msgstr "" + +#: dcim/models/device_component_templates.py:526 +msgid "front port template" +msgstr "" + +#: dcim/models/device_component_templates.py:527 +msgid "front port templates" +msgstr "" + +#: dcim/models/device_component_templates.py:537 +#, python-brace-format +msgid "Rear port ({name}) must belong to the same device type" +msgstr "" + +#: dcim/models/device_component_templates.py:543 +#, python-brace-format +msgid "" +"Invalid rear port position ({position}); rear port {name} has only {count} " +"positions" +msgstr "" + +#: dcim/models/device_component_templates.py:596 +#: dcim/models/device_components.py:1045 +msgid "positions" +msgstr "" + +#: dcim/models/device_component_templates.py:607 +msgid "rear port template" +msgstr "" + +#: dcim/models/device_component_templates.py:608 +msgid "rear port templates" +msgstr "" + +#: dcim/models/device_component_templates.py:637 +#: dcim/models/device_components.py:1086 +msgid "position" +msgstr "" + +#: dcim/models/device_component_templates.py:640 +#: dcim/models/device_components.py:1089 +msgid "Identifier to reference when renaming installed components" +msgstr "" + +#: dcim/models/device_component_templates.py:646 +msgid "module bay template" +msgstr "" + +#: dcim/models/device_component_templates.py:647 +msgid "module bay templates" +msgstr "" + +#: dcim/models/device_component_templates.py:674 +msgid "device bay template" +msgstr "" + +#: dcim/models/device_component_templates.py:675 +msgid "device bay templates" +msgstr "" + +#: dcim/models/device_component_templates.py:688 +#, python-brace-format +msgid "" +"Subdevice role of device type ({device_type}) must be set to \"parent\" to " +"allow device bays." +msgstr "" + +#: dcim/models/device_component_templates.py:743 +#: dcim/models/device_components.py:1215 +msgid "part ID" +msgstr "" + +#: dcim/models/device_component_templates.py:745 +#: dcim/models/device_components.py:1217 +msgid "Manufacturer-assigned part identifier" +msgstr "" + +#: dcim/models/device_component_templates.py:759 +msgid "inventory item template" +msgstr "" + +#: dcim/models/device_component_templates.py:760 +msgid "inventory item templates" +msgstr "" + +#: dcim/models/device_components.py:107 +msgid "Components cannot be moved to a different device." +msgstr "" + +#: dcim/models/device_components.py:146 +msgid "cable end" +msgstr "" + +#: dcim/models/device_components.py:152 +msgid "mark connected" +msgstr "" + +#: dcim/models/device_components.py:154 +msgid "Treat as if a cable is connected" +msgstr "" + +#: dcim/models/device_components.py:172 +msgid "Must specify cable end (A or B) when attaching a cable." +msgstr "" + +#: dcim/models/device_components.py:176 +msgid "Cable end must not be set without a cable." +msgstr "" + +#: dcim/models/device_components.py:180 +msgid "Cannot mark as connected with a cable attached." +msgstr "" + +#: dcim/models/device_components.py:204 +#, python-brace-format +msgid "{class_name} models must declare a parent_object property" +msgstr "" + +#: dcim/models/device_components.py:289 dcim/models/device_components.py:318 +#: dcim/models/device_components.py:351 dcim/models/device_components.py:469 +msgid "Physical port type" +msgstr "" + +#: dcim/models/device_components.py:292 dcim/models/device_components.py:321 +msgid "speed" +msgstr "" + +#: dcim/models/device_components.py:296 dcim/models/device_components.py:325 +msgid "Port speed in bits per second" +msgstr "" + +#: dcim/models/device_components.py:302 +msgid "console port" +msgstr "" + +#: dcim/models/device_components.py:303 +msgid "console ports" +msgstr "" + +#: dcim/models/device_components.py:331 +msgid "console server port" +msgstr "" + +#: dcim/models/device_components.py:332 +msgid "console server ports" +msgstr "" + +#: dcim/models/device_components.py:371 +msgid "power port" +msgstr "" + +#: dcim/models/device_components.py:372 +msgid "power ports" +msgstr "" + +#: dcim/models/device_components.py:489 +msgid "power outlet" +msgstr "" + +#: dcim/models/device_components.py:490 +msgid "power outlets" +msgstr "" + +#: dcim/models/device_components.py:501 +#, python-brace-format +msgid "Parent power port ({power_port}) must belong to the same device" +msgstr "" + +#: dcim/models/device_components.py:532 +msgid "mode" +msgstr "" + +#: dcim/models/device_components.py:536 +msgid "IEEE 802.1Q tagging strategy" +msgstr "" + +#: dcim/models/device_components.py:544 +msgid "parent interface" +msgstr "" + +#: dcim/models/device_components.py:600 +msgid "parent LAG" +msgstr "" + +#: dcim/models/device_components.py:610 +msgid "This interface is used only for out-of-band management" +msgstr "" + +#: dcim/models/device_components.py:615 +msgid "speed (Kbps)" +msgstr "" + +#: dcim/models/device_components.py:618 +msgid "duplex" +msgstr "" + +#: dcim/models/device_components.py:628 +msgid "64-bit World Wide Name" +msgstr "" + +#: dcim/models/device_components.py:640 +msgid "wireless channel" +msgstr "" + +#: dcim/models/device_components.py:647 +msgid "channel frequency (MHz)" +msgstr "" + +#: dcim/models/device_components.py:648 dcim/models/device_components.py:656 +msgid "Populated by selected channel (if set)" +msgstr "" + +#: dcim/models/device_components.py:662 +msgid "transmit power (dBm)" +msgstr "" + +#: dcim/models/device_components.py:687 wireless/models.py:116 +msgid "wireless LANs" +msgstr "" + +#: dcim/models/device_components.py:695 +#: virtualization/models/virtualmachines.py:266 +msgid "untagged VLAN" +msgstr "" + +#: dcim/models/device_components.py:701 +#: virtualization/models/virtualmachines.py:272 +msgid "tagged VLANs" +msgstr "" + +#: dcim/models/device_components.py:737 +#: virtualization/models/virtualmachines.py:309 +msgid "interface" +msgstr "" + +#: dcim/models/device_components.py:738 +#: virtualization/models/virtualmachines.py:310 +msgid "interfaces" +msgstr "" + +#: dcim/models/device_components.py:749 +#, python-brace-format +msgid "{display_type} interfaces cannot have a cable attached." +msgstr "" + +#: dcim/models/device_components.py:757 +#, python-brace-format +msgid "{display_type} interfaces cannot be marked as connected." +msgstr "" + +#: dcim/models/device_components.py:766 +#: virtualization/models/virtualmachines.py:325 +msgid "An interface cannot be its own parent." +msgstr "" + +#: dcim/models/device_components.py:770 +msgid "Only virtual interfaces may be assigned to a parent interface." +msgstr "" + +#: dcim/models/device_components.py:777 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to a different device " +"({device})" +msgstr "" + +#: dcim/models/device_components.py:783 +#, python-brace-format +msgid "" +"The selected parent interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" + +#: dcim/models/device_components.py:803 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different device " +"({device})." +msgstr "" + +#: dcim/models/device_components.py:809 +#, python-brace-format +msgid "" +"The selected bridge interface ({interface}) belongs to {device}, which is " +"not part of virtual chassis {virtual_chassis}." +msgstr "" + +#: dcim/models/device_components.py:820 +msgid "Virtual interfaces cannot have a parent LAG interface." +msgstr "" + +#: dcim/models/device_components.py:824 +msgid "A LAG interface cannot be its own parent." +msgstr "" + +#: dcim/models/device_components.py:831 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to a different device ({device})." +msgstr "" + +#: dcim/models/device_components.py:837 +#, python-brace-format +msgid "" +"The selected LAG interface ({lag}) belongs to {device}, which is not part of " +"virtual chassis {virtual_chassis}." +msgstr "" + +#: dcim/models/device_components.py:848 +msgid "Virtual interfaces cannot have a PoE mode." +msgstr "" + +#: dcim/models/device_components.py:852 +msgid "Virtual interfaces cannot have a PoE type." +msgstr "" + +#: dcim/models/device_components.py:858 +msgid "Must specify PoE mode when designating a PoE type." +msgstr "" + +#: dcim/models/device_components.py:865 +msgid "Wireless role may be set only on wireless interfaces." +msgstr "" + +#: dcim/models/device_components.py:867 +msgid "Channel may be set only on wireless interfaces." +msgstr "" + +#: dcim/models/device_components.py:873 +msgid "Channel frequency may be set only on wireless interfaces." +msgstr "" + +#: dcim/models/device_components.py:877 +msgid "Cannot specify custom frequency with channel selected." +msgstr "" + +#: dcim/models/device_components.py:883 +msgid "Channel width may be set only on wireless interfaces." +msgstr "" + +#: dcim/models/device_components.py:885 +msgid "Cannot specify custom width with channel selected." +msgstr "" + +#: dcim/models/device_components.py:893 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent device, or it must be global." +msgstr "" + +#: dcim/models/device_components.py:982 +msgid "Mapped position on corresponding rear port" +msgstr "" + +#: dcim/models/device_components.py:998 +msgid "front port" +msgstr "" + +#: dcim/models/device_components.py:999 +msgid "front ports" +msgstr "" + +#: dcim/models/device_components.py:1013 +#, python-brace-format +msgid "Rear port ({rear_port}) must belong to the same device" +msgstr "" + +#: dcim/models/device_components.py:1021 +#, python-brace-format +msgid "" +"Invalid rear port position ({rear_port_position}): Rear port {name} has only " +"{positions} positions." +msgstr "" + +#: dcim/models/device_components.py:1051 +msgid "Number of front ports which may be mapped" +msgstr "" + +#: dcim/models/device_components.py:1056 +msgid "rear port" +msgstr "" + +#: dcim/models/device_components.py:1057 +msgid "rear ports" +msgstr "" + +#: dcim/models/device_components.py:1071 +#, python-brace-format +msgid "" +"The number of positions cannot be less than the number of mapped front ports " +"({frontport_count})" +msgstr "" + +#: dcim/models/device_components.py:1095 +msgid "module bay" +msgstr "" + +#: dcim/models/device_components.py:1096 +msgid "module bays" +msgstr "" + +#: dcim/models/device_components.py:1109 +msgid "parent_bay" +msgstr "" + +#: dcim/models/device_components.py:1117 +msgid "device bay" +msgstr "" + +#: dcim/models/device_components.py:1118 +msgid "device bays" +msgstr "" + +#: dcim/models/device_components.py:1128 +#, python-brace-format +msgid "This type of device ({device_type}) does not support device bays." +msgstr "" + +#: dcim/models/device_components.py:1134 +msgid "Cannot install a device into itself." +msgstr "" + +#: dcim/models/device_components.py:1142 +#, python-brace-format +msgid "" +"Cannot install the specified device; device is already installed in {bay}." +msgstr "" + +#: dcim/models/device_components.py:1163 +msgid "inventory item role" +msgstr "" + +#: dcim/models/device_components.py:1164 +msgid "inventory item roles" +msgstr "" + +#: dcim/models/device_components.py:1221 dcim/models/devices.py:595 +#: dcim/models/devices.py:1168 dcim/models/racks.py:113 +msgid "serial number" +msgstr "" + +#: dcim/models/device_components.py:1229 dcim/models/devices.py:603 +#: dcim/models/devices.py:1175 dcim/models/racks.py:120 +msgid "asset tag" +msgstr "" + +#: dcim/models/device_components.py:1230 +msgid "A unique tag used to identify this item" +msgstr "" + +#: dcim/models/device_components.py:1233 +msgid "discovered" +msgstr "" + +#: dcim/models/device_components.py:1235 +msgid "This item was automatically discovered" +msgstr "" + +#: dcim/models/device_components.py:1250 +msgid "inventory item" +msgstr "" + +#: dcim/models/device_components.py:1251 +msgid "inventory items" +msgstr "" + +#: dcim/models/device_components.py:1262 +msgid "Cannot assign self as parent." +msgstr "" + +#: dcim/models/device_components.py:1270 +msgid "Parent inventory item does not belong to the same device." +msgstr "" + +#: dcim/models/device_components.py:1276 +msgid "Cannot move an inventory item with dependent children" +msgstr "" + +#: dcim/models/device_components.py:1284 +msgid "Cannot assign inventory item to component on another device" +msgstr "" + +#: dcim/models/devices.py:54 +msgid "manufacturer" +msgstr "" + +#: dcim/models/devices.py:55 +msgid "manufacturers" +msgstr "" + +#: dcim/models/devices.py:82 dcim/models/devices.py:381 +msgid "model" +msgstr "" + +#: dcim/models/devices.py:95 +msgid "default platform" +msgstr "" + +#: dcim/models/devices.py:98 dcim/models/devices.py:385 +msgid "part number" +msgstr "" + +#: dcim/models/devices.py:101 dcim/models/devices.py:388 +msgid "Discrete part number (optional)" +msgstr "" + +#: dcim/models/devices.py:107 dcim/models/racks.py:137 +msgid "height (U)" +msgstr "" + +#: dcim/models/devices.py:111 +msgid "exclude from utilization" +msgstr "" + +#: dcim/models/devices.py:112 +msgid "Exclude from rack utilization calculations." +msgstr "" + +#: dcim/models/devices.py:116 +msgid "is full depth" +msgstr "" + +#: dcim/models/devices.py:117 +msgid "Device consumes both front and rear rack faces" +msgstr "" + +#: dcim/models/devices.py:123 +msgid "parent/child status" +msgstr "" + +#: dcim/models/devices.py:124 +msgid "" +"Parent devices house child devices in device bays. Leave blank if this " +"device type is neither a parent nor a child." +msgstr "" + +#: dcim/models/devices.py:128 dcim/models/devices.py:647 +msgid "airflow" +msgstr "" + +#: dcim/models/devices.py:204 +msgid "device type" +msgstr "" + +#: dcim/models/devices.py:205 +msgid "device types" +msgstr "" + +#: dcim/models/devices.py:289 +msgid "U height must be in increments of 0.5 rack units." +msgstr "" + +#: dcim/models/devices.py:306 +#, python-brace-format +msgid "" +"Device {device} in rack {rack} does not have sufficient space to accommodate " +"a height of {height}U" +msgstr "" + +#: dcim/models/devices.py:321 +#, python-brace-format +msgid "" +"Unable to set 0U height: Found {racked_instance_count} " +"instances already mounted within racks." +msgstr "" + +#: dcim/models/devices.py:330 +msgid "" +"Must delete all device bay templates associated with this device before " +"declassifying it as a parent device." +msgstr "" + +#: dcim/models/devices.py:336 +msgid "Child device types must be 0U." +msgstr "" + +#: dcim/models/devices.py:404 +msgid "module type" +msgstr "" + +#: dcim/models/devices.py:405 +msgid "module types" +msgstr "" + +#: dcim/models/devices.py:473 +msgid "Virtual machines may be assigned to this role" +msgstr "" + +#: dcim/models/devices.py:485 +msgid "device role" +msgstr "" + +#: dcim/models/devices.py:486 +msgid "device roles" +msgstr "" + +#: dcim/models/devices.py:503 +msgid "Optionally limit this platform to devices of a certain manufacturer" +msgstr "" + +#: dcim/models/devices.py:515 +msgid "platform" +msgstr "" + +#: dcim/models/devices.py:516 +msgid "platforms" +msgstr "" + +#: dcim/models/devices.py:564 +msgid "The function this device serves" +msgstr "" + +#: dcim/models/devices.py:596 +msgid "Chassis serial number, assigned by the manufacturer" +msgstr "" + +#: dcim/models/devices.py:604 dcim/models/devices.py:1176 +msgid "A unique tag used to identify this device" +msgstr "" + +#: dcim/models/devices.py:631 +msgid "position (U)" +msgstr "" + +#: dcim/models/devices.py:638 +msgid "rack face" +msgstr "" + +#: dcim/models/devices.py:658 dcim/models/devices.py:1385 +#: virtualization/models/virtualmachines.py:97 +msgid "primary IPv4" +msgstr "" + +#: dcim/models/devices.py:666 dcim/models/devices.py:1393 +#: virtualization/models/virtualmachines.py:105 +msgid "primary IPv6" +msgstr "" + +#: dcim/models/devices.py:674 +msgid "out-of-band IP" +msgstr "" + +#: dcim/models/devices.py:691 +msgid "VC position" +msgstr "" + +#: dcim/models/devices.py:695 +msgid "Virtual chassis position" +msgstr "" + +#: dcim/models/devices.py:698 +msgid "VC priority" +msgstr "" + +#: dcim/models/devices.py:702 +msgid "Virtual chassis master election priority" +msgstr "" + +#: dcim/models/devices.py:705 dcim/models/sites.py:207 +msgid "latitude" +msgstr "" + +#: dcim/models/devices.py:710 dcim/models/devices.py:718 +#: dcim/models/sites.py:212 dcim/models/sites.py:220 +msgid "GPS coordinate in decimal format (xx.yyyyyy)" +msgstr "" + +#: dcim/models/devices.py:713 dcim/models/sites.py:215 +msgid "longitude" +msgstr "" + +#: dcim/models/devices.py:786 +msgid "Device name must be unique per site." +msgstr "" + +#: dcim/models/devices.py:797 ipam/models/services.py:75 +msgid "device" +msgstr "" + +#: dcim/models/devices.py:798 +msgid "devices" +msgstr "" + +#: dcim/models/devices.py:838 +#, python-brace-format +msgid "Rack {rack} does not belong to site {site}." +msgstr "" + +#: dcim/models/devices.py:843 +#, python-brace-format +msgid "Location {location} does not belong to site {site}." +msgstr "" + +#: dcim/models/devices.py:849 +#, python-brace-format +msgid "Rack {rack} does not belong to location {location}." +msgstr "" + +#: dcim/models/devices.py:856 +msgid "Cannot select a rack face without assigning a rack." +msgstr "" + +#: dcim/models/devices.py:860 +msgid "Cannot select a rack position without assigning a rack." +msgstr "" + +#: dcim/models/devices.py:866 +msgid "Position must be in increments of 0.5 rack units." +msgstr "" + +#: dcim/models/devices.py:870 +msgid "Must specify rack face when defining rack position." +msgstr "" + +#: dcim/models/devices.py:878 +#, python-brace-format +msgid "A U0 device type ({device_type}) cannot be assigned to a rack position." +msgstr "" + +#: dcim/models/devices.py:889 +msgid "" +"Child device types cannot be assigned to a rack face. This is an attribute " +"of the parent device." +msgstr "" + +#: dcim/models/devices.py:896 +msgid "" +"Child device types cannot be assigned to a rack position. This is an " +"attribute of the parent device." +msgstr "" + +#: dcim/models/devices.py:910 +#, python-brace-format +msgid "" +"U{position} is already occupied or does not have sufficient space to " +"accommodate this device type: {device_type} ({u_height}U)" +msgstr "" + +#: dcim/models/devices.py:925 +#, python-brace-format +msgid "{ip} is not an IPv4 address." +msgstr "" + +#: dcim/models/devices.py:934 dcim/models/devices.py:949 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this device." +msgstr "" + +#: dcim/models/devices.py:940 +#, python-brace-format +msgid "{ip} is not an IPv6 address." +msgstr "" + +#: dcim/models/devices.py:967 +#, python-brace-format +msgid "" +"The assigned platform is limited to {platform_manufacturer} device types, " +"but this device's type belongs to {devicetype_manufacturer}." +msgstr "" + +#: dcim/models/devices.py:978 +#, python-brace-format +msgid "The assigned cluster belongs to a different site ({site})" +msgstr "" + +#: dcim/models/devices.py:986 +msgid "A device assigned to a virtual chassis must have its position defined." +msgstr "" + +#: dcim/models/devices.py:1183 +msgid "module" +msgstr "" + +#: dcim/models/devices.py:1184 +msgid "modules" +msgstr "" + +#: dcim/models/devices.py:1200 +#, python-brace-format +msgid "" +"Module must be installed within a module bay belonging to the assigned " +"device ({device})." +msgstr "" + +#: dcim/models/devices.py:1304 +msgid "domain" +msgstr "" + +#: dcim/models/devices.py:1317 dcim/models/devices.py:1318 +msgid "virtual chassis" +msgstr "" + +#: dcim/models/devices.py:1333 +#, python-brace-format +msgid "The selected master ({master}) is not assigned to this virtual chassis." +msgstr "" + +#: dcim/models/devices.py:1349 +#, python-brace-format +msgid "" +"Unable to delete virtual chassis {self}. There are member interfaces which " +"form a cross-chassis LAG interfaces." +msgstr "" + +#: dcim/models/devices.py:1374 ipam/models/l2vpn.py:37 +msgid "identifier" +msgstr "" + +#: dcim/models/devices.py:1375 +msgid "Numeric identifier unique to the parent device" +msgstr "" + +#: dcim/models/devices.py:1403 extras/models/models.py:629 +#: netbox/models/__init__.py:114 +msgid "comments" +msgstr "" + +#: dcim/models/devices.py:1419 +msgid "virtual device context" +msgstr "" + +#: dcim/models/devices.py:1420 +msgid "virtual device contexts" +msgstr "" + +#: dcim/models/devices.py:1452 +#, python-brace-format +msgid "{ip} is not an IPv{family} address." +msgstr "" + +#: dcim/models/devices.py:1458 +msgid "Primary IP address must belong to an interface on the assigned device." +msgstr "" + +#: dcim/models/mixins.py:15 extras/models/configs.py:41 +#: extras/models/models.py:260 extras/models/models.py:469 +#: extras/models/search.py:48 ipam/models/ip.py:193 +msgid "weight" +msgstr "" + +#: dcim/models/mixins.py:22 +msgid "weight unit" +msgstr "" + +#: dcim/models/mixins.py:51 +msgid "Must specify a unit when setting a weight" +msgstr "" + +#: dcim/models/power.py:55 +msgid "power panel" +msgstr "" + +#: dcim/models/power.py:56 +msgid "power panels" +msgstr "" + +#: dcim/models/power.py:70 +#, python-brace-format +msgid "" +"Location {location} ({location_site}) is in a different site than {site}" +msgstr "" + +#: dcim/models/power.py:107 +msgid "supply" +msgstr "" + +#: dcim/models/power.py:113 +msgid "phase" +msgstr "" + +#: dcim/models/power.py:119 +msgid "voltage" +msgstr "" + +#: dcim/models/power.py:124 +msgid "amperage" +msgstr "" + +#: dcim/models/power.py:129 +msgid "max utilization" +msgstr "" + +#: dcim/models/power.py:132 +msgid "Maximum permissible draw (percentage)" +msgstr "" + +#: dcim/models/power.py:135 +msgid "available power" +msgstr "" + +#: dcim/models/power.py:163 +msgid "power feed" +msgstr "" + +#: dcim/models/power.py:164 +msgid "power feeds" +msgstr "" + +#: dcim/models/power.py:178 +#, python-brace-format +msgid "" +"Rack {rack} ({site}) and power panel {powerpanel} ({powerpanel_site}) are in " +"different sites" +msgstr "" + +#: dcim/models/power.py:189 +msgid "Voltage cannot be negative for AC supply" +msgstr "" + +#: dcim/models/racks.py:49 +msgid "rack role" +msgstr "" + +#: dcim/models/racks.py:50 +msgid "rack roles" +msgstr "" + +#: dcim/models/racks.py:74 +msgid "facility ID" +msgstr "" + +#: dcim/models/racks.py:75 +msgid "Locally-assigned identifier" +msgstr "" + +#: dcim/models/racks.py:108 ipam/forms/bulk_import.py:203 +#: ipam/forms/bulk_import.py:268 ipam/forms/bulk_import.py:303 +#: ipam/forms/bulk_import.py:470 virtualization/forms/bulk_import.py:111 +msgid "Functional role" +msgstr "" + +#: dcim/models/racks.py:121 +msgid "A unique tag used to identify this rack" +msgstr "" + +#: dcim/models/racks.py:132 +msgid "width" +msgstr "" + +#: dcim/models/racks.py:133 +msgid "Rail-to-rail width" +msgstr "" + +#: dcim/models/racks.py:139 +msgid "Height in rack units" +msgstr "" + +#: dcim/models/racks.py:143 +msgid "starting unit" +msgstr "" + +#: dcim/models/racks.py:144 +msgid "Starting unit for rack" +msgstr "" + +#: dcim/models/racks.py:148 +msgid "descending units" +msgstr "" + +#: dcim/models/racks.py:149 +msgid "Units are numbered top-to-bottom" +msgstr "" + +#: dcim/models/racks.py:152 +msgid "outer width" +msgstr "" + +#: dcim/models/racks.py:155 +msgid "Outer dimension of rack (width)" +msgstr "" + +#: dcim/models/racks.py:158 +msgid "outer depth" +msgstr "" + +#: dcim/models/racks.py:161 +msgid "Outer dimension of rack (depth)" +msgstr "" + +#: dcim/models/racks.py:164 +msgid "outer unit" +msgstr "" + +#: dcim/models/racks.py:170 +msgid "max weight" +msgstr "" + +#: dcim/models/racks.py:173 +msgid "Maximum load capacity for the rack" +msgstr "" + +#: dcim/models/racks.py:181 +msgid "mounting depth" +msgstr "" + +#: dcim/models/racks.py:185 +msgid "" +"Maximum depth of a mounted device, in millimeters. For four-post racks, this " +"is the distance between the front and rear rails." +msgstr "" + +#: dcim/models/racks.py:219 +msgid "rack" +msgstr "" + +#: dcim/models/racks.py:220 +msgid "racks" +msgstr "" + +#: dcim/models/racks.py:235 +#, python-brace-format +msgid "Assigned location must belong to parent site ({site})." +msgstr "" + +#: dcim/models/racks.py:239 +msgid "Must specify a unit when setting an outer width/depth" +msgstr "" + +#: dcim/models/racks.py:243 +msgid "Must specify a unit when setting a maximum weight" +msgstr "" + +#: dcim/models/racks.py:253 +#, python-brace-format +msgid "" +"Rack must be at least {min_height}U tall to house currently installed " +"devices." +msgstr "" + +#: dcim/models/racks.py:260 +#, python-brace-format +msgid "" +"Rack unit numbering must begin at {position} or less to house currently " +"installed devices." +msgstr "" + +#: dcim/models/racks.py:268 +#, python-brace-format +msgid "Location must be from the same site, {site}." +msgstr "" + +#: dcim/models/racks.py:521 +msgid "units" +msgstr "" + +#: dcim/models/racks.py:547 +msgid "rack reservation" +msgstr "" + +#: dcim/models/racks.py:548 +msgid "rack reservations" +msgstr "" + +#: dcim/models/racks.py:565 +#, python-brace-format +msgid "Invalid unit(s) for {height}U rack: {unit_list}" +msgstr "" + +#: dcim/models/racks.py:578 +#, python-brace-format +msgid "The following units have already been reserved: {unit_list}" +msgstr "" + +#: dcim/models/sites.py:49 +msgid "A top-level region with this name already exists." +msgstr "" + +#: dcim/models/sites.py:59 +msgid "A top-level region with this slug already exists." +msgstr "" + +#: dcim/models/sites.py:62 +msgid "region" +msgstr "" + +#: dcim/models/sites.py:63 +msgid "regions" +msgstr "" + +#: dcim/models/sites.py:102 +msgid "A top-level site group with this name already exists." +msgstr "" + +#: dcim/models/sites.py:112 +msgid "A top-level site group with this slug already exists." +msgstr "" + +#: dcim/models/sites.py:115 +msgid "site group" +msgstr "" + +#: dcim/models/sites.py:116 +msgid "site groups" +msgstr "" + +#: dcim/models/sites.py:141 +msgid "Full name of the site" +msgstr "" + +#: dcim/models/sites.py:181 +msgid "facility" +msgstr "" + +#: dcim/models/sites.py:184 +msgid "Local facility ID or description" +msgstr "" + +#: dcim/models/sites.py:195 +msgid "physical address" +msgstr "" + +#: dcim/models/sites.py:198 +msgid "Physical location of the building" +msgstr "" + +#: dcim/models/sites.py:201 +msgid "shipping address" +msgstr "" + +#: dcim/models/sites.py:204 +msgid "If different from the physical address" +msgstr "" + +#: dcim/models/sites.py:238 +msgid "site" +msgstr "" + +#: dcim/models/sites.py:239 +msgid "sites" +msgstr "" + +#: dcim/models/sites.py:303 +msgid "A location with this name already exists within the specified site." +msgstr "" + +#: dcim/models/sites.py:313 +msgid "A location with this slug already exists within the specified site." +msgstr "" + +#: dcim/models/sites.py:316 +msgid "location" +msgstr "" + +#: dcim/models/sites.py:317 +msgid "locations" +msgstr "" + +#: dcim/models/sites.py:331 +#, python-brace-format +msgid "Parent location ({parent}) must belong to the same site ({site})." +msgstr "" + +#: dcim/tables/cables.py:54 +msgid "Termination A" +msgstr "" + +#: dcim/tables/cables.py:59 +msgid "Termination B" +msgstr "" + +#: dcim/tables/cables.py:65 wireless/tables/wirelesslink.py:22 +msgid "Device A" +msgstr "" + +#: dcim/tables/cables.py:71 wireless/tables/wirelesslink.py:31 +msgid "Device B" +msgstr "" + +#: dcim/tables/cables.py:77 +msgid "Location A" +msgstr "" + +#: dcim/tables/cables.py:83 +msgid "Location B" +msgstr "" + +#: dcim/tables/cables.py:89 +msgid "Rack A" +msgstr "" + +#: dcim/tables/cables.py:95 +msgid "Rack B" +msgstr "" + +#: dcim/tables/cables.py:101 +msgid "Site A" +msgstr "" + +#: dcim/tables/cables.py:107 +msgid "Site B" +msgstr "" + +#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:18 +#: templates/dcim/consoleserverport.html:75 templates/dcim/frontport.html:119 +#: templates/dcim/inventoryitem_edit.html:39 +msgid "Console Port" +msgstr "" + +#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 +#: dcim/tables/connections.py:71 +#: templates/dcim/inc/connection_endpoints.html:16 +msgid "Reachable" +msgstr "" + +#: dcim/tables/connections.py:46 dcim/tables/devices.py:518 +#: templates/dcim/inventoryitem_edit.html:64 templates/dcim/poweroutlet.html:47 +#: templates/dcim/powerport.html:18 +msgid "Power Port" +msgstr "" + +#: dcim/tables/devices.py:94 dcim/tables/devices.py:139 dcim/tables/racks.py:81 +#: dcim/tables/sites.py:143 netbox/navigation/menu.py:57 +#: netbox/navigation/menu.py:61 netbox/navigation/menu.py:63 +#: virtualization/forms/model_forms.py:124 virtualization/tables/clusters.py:83 +#: virtualization/views.py:211 +msgid "Devices" +msgstr "" + +#: dcim/tables/devices.py:99 dcim/tables/devices.py:144 +#: virtualization/tables/clusters.py:88 +msgid "VMs" +msgstr "" + +#: dcim/tables/devices.py:133 dcim/tables/devices.py:245 +#: extras/forms/model_forms.py:403 templates/dcim/device.html:131 +#: templates/dcim/device/render_config.html:11 +#: templates/dcim/device/render_config.html:15 +#: templates/dcim/devicerole.html:47 templates/dcim/platform.html:44 +#: templates/extras/configtemplate.html:10 +#: templates/virtualization/virtualmachine.html:47 +#: templates/virtualization/virtualmachine/render_config.html:11 +#: templates/virtualization/virtualmachine/render_config.html:15 +#: virtualization/tables/virtualmachines.py:88 +msgid "Config Template" +msgstr "" + +#: dcim/tables/devices.py:216 dcim/tables/devices.py:1048 +#: ipam/forms/model_forms.py:298 ipam/tables/ip.py:352 ipam/tables/ip.py:418 +#: ipam/tables/ip.py:441 templates/ipam/ipaddress.html:12 +#: templates/ipam/ipaddress_edit.html:14 +#: virtualization/tables/virtualmachines.py:79 +msgid "IP Address" +msgstr "" + +#: dcim/tables/devices.py:220 dcim/tables/devices.py:1052 +#: virtualization/tables/virtualmachines.py:70 +msgid "IPv4 Address" +msgstr "" + +#: dcim/tables/devices.py:224 dcim/tables/devices.py:1056 +#: virtualization/tables/virtualmachines.py:74 +msgid "IPv6 Address" +msgstr "" + +#: dcim/tables/devices.py:239 +msgid "VC Position" +msgstr "" + +#: dcim/tables/devices.py:242 +msgid "VC Priority" +msgstr "" + +#: dcim/tables/devices.py:249 templates/dcim/device_edit.html:38 +#: templates/dcim/devicebay_populate.html:16 +msgid "Parent Device" +msgstr "" + +#: dcim/tables/devices.py:254 +msgid "Position (Device Bay)" +msgstr "" + +#: dcim/tables/devices.py:263 +msgid "Console ports" +msgstr "" + +#: dcim/tables/devices.py:266 +msgid "Console server ports" +msgstr "" + +#: dcim/tables/devices.py:269 +msgid "Power ports" +msgstr "" + +#: dcim/tables/devices.py:272 +msgid "Power outlets" +msgstr "" + +#: dcim/tables/devices.py:275 dcim/tables/devices.py:1061 +#: dcim/tables/devicetypes.py:125 dcim/views.py:1002 dcim/views.py:1241 +#: dcim/views.py:1927 netbox/navigation/menu.py:82 +#: netbox/navigation/menu.py:220 templates/dcim/device/base.html:37 +#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 +#: templates/dcim/module.html:34 templates/dcim/moduletype/base.html:34 +#: templates/dcim/virtualdevicecontext.html:64 +#: templates/dcim/virtualdevicecontext.html:85 +#: templates/virtualization/virtualmachine_list.html:14 +#: virtualization/tables/virtualmachines.py:85 virtualization/views.py:368 +#: wireless/tables/wirelesslan.py:55 +msgid "Interfaces" +msgstr "" + +#: dcim/tables/devices.py:278 +msgid "Front ports" +msgstr "" + +#: dcim/tables/devices.py:284 +msgid "Device bays" +msgstr "" + +#: dcim/tables/devices.py:287 +msgid "Module bays" +msgstr "" + +#: dcim/tables/devices.py:290 +msgid "Inventory items" +msgstr "" + +#: dcim/tables/devices.py:329 dcim/tables/modules.py:56 +#: templates/dcim/modulebay.html:17 +msgid "Module Bay" +msgstr "" + +#: dcim/tables/devices.py:350 +msgid "Cable Color" +msgstr "" + +#: dcim/tables/devices.py:356 +msgid "Link Peers" +msgstr "" + +#: dcim/tables/devices.py:359 +msgid "Mark Connected" +msgstr "" + +#: dcim/tables/devices.py:567 ipam/forms/model_forms.py:709 +#: ipam/tables/fhrp.py:28 ipam/views.py:599 ipam/views.py:673 +#: netbox/navigation/menu.py:146 netbox/navigation/menu.py:148 +#: templates/dcim/interface.html:347 templates/ipam/ipaddress_bulk_add.html:15 +#: templates/ipam/service.html:43 templates/virtualization/vminterface.html:84 +msgid "IP Addresses" +msgstr "" + +#: dcim/tables/devices.py:573 netbox/navigation/menu.py:190 +#: templates/ipam/inc/panels/fhrp_groups.html:5 +msgid "FHRP Groups" +msgstr "" + +#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:224 +#: templates/dcim/interface.html:66 +msgid "Management Only" +msgstr "" + +#: dcim/tables/devices.py:612 +msgid "Wireless link" +msgstr "" + +#: dcim/tables/devices.py:622 +msgid "VDCs" +msgstr "" + +#: dcim/tables/devices.py:706 +#: templates/circuits/inc/circuit_termination.html:80 +#: templates/dcim/consoleport.html:81 templates/dcim/consoleserverport.html:81 +#: templates/dcim/frontport.html:53 templates/dcim/frontport.html:125 +#: templates/dcim/interface.html:192 templates/dcim/inventoryitem_edit.html:69 +#: templates/dcim/rearport.html:18 templates/dcim/rearport.html:115 +msgid "Rear Port" +msgstr "" + +#: dcim/tables/devices.py:871 templates/dcim/modulebay.html:51 +msgid "Installed Module" +msgstr "" + +#: dcim/tables/devices.py:874 +msgid "Module Serial" +msgstr "" + +#: dcim/tables/devices.py:878 +msgid "Module Asset Tag" +msgstr "" + +#: dcim/tables/devices.py:887 +msgid "Module Status" +msgstr "" + +#: dcim/tables/devices.py:929 dcim/tables/devicetypes.py:308 +#: templates/dcim/inventoryitem.html:41 +msgid "Component" +msgstr "" + +#: dcim/tables/devices.py:980 +msgid "Items" +msgstr "" + +#: dcim/tables/devicetypes.py:38 netbox/navigation/menu.py:72 +#: netbox/navigation/menu.py:74 +msgid "Device Types" +msgstr "" + +#: dcim/tables/devicetypes.py:43 netbox/navigation/menu.py:75 +msgid "Module Types" +msgstr "" + +#: dcim/tables/devicetypes.py:48 dcim/tables/devicetypes.py:140 +#: dcim/views.py:1077 dcim/views.py:2020 netbox/navigation/menu.py:91 +#: templates/dcim/device/base.html:52 templates/dcim/device_list.html:71 +#: templates/dcim/devicetype/base.html:49 +#: templates/dcim/inc/panels/inventory_items.html:5 +#: templates/dcim/inventoryitemrole.html:33 +msgid "Inventory Items" +msgstr "" + +#: dcim/tables/devicetypes.py:53 extras/forms/filtersets.py:354 +#: extras/forms/model_forms.py:311 netbox/navigation/menu.py:66 +msgid "Platforms" +msgstr "" + +#: dcim/tables/devicetypes.py:85 templates/dcim/devicetype.html:32 +msgid "Default Platform" +msgstr "" + +#: dcim/tables/devicetypes.py:89 templates/dcim/devicetype.html:48 +msgid "Full Depth" +msgstr "" + +#: dcim/tables/devicetypes.py:98 +msgid "U Height" +msgstr "" + +#: dcim/tables/devicetypes.py:110 dcim/tables/modules.py:26 +msgid "Instances" +msgstr "" + +#: dcim/tables/devicetypes.py:113 dcim/views.py:942 dcim/views.py:1181 +#: dcim/views.py:1867 netbox/navigation/menu.py:85 +#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 +#: templates/dcim/devicetype/base.html:22 templates/dcim/module.html:22 +#: templates/dcim/moduletype/base.html:22 +msgid "Console Ports" +msgstr "" + +#: dcim/tables/devicetypes.py:116 dcim/views.py:957 dcim/views.py:1196 +#: dcim/views.py:1882 netbox/navigation/menu.py:86 +#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 +#: templates/dcim/devicetype/base.html:25 templates/dcim/module.html:25 +#: templates/dcim/moduletype/base.html:25 +msgid "Console Server Ports" +msgstr "" + +#: dcim/tables/devicetypes.py:119 dcim/views.py:972 dcim/views.py:1211 +#: dcim/views.py:1897 netbox/navigation/menu.py:87 +#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 +#: templates/dcim/devicetype/base.html:28 templates/dcim/module.html:28 +#: templates/dcim/moduletype/base.html:28 +msgid "Power Ports" +msgstr "" + +#: dcim/tables/devicetypes.py:122 dcim/views.py:987 dcim/views.py:1226 +#: dcim/views.py:1912 netbox/navigation/menu.py:88 +#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 +#: templates/dcim/devicetype/base.html:31 templates/dcim/module.html:31 +#: templates/dcim/moduletype/base.html:31 +msgid "Power Outlets" +msgstr "" + +#: dcim/tables/devicetypes.py:128 dcim/views.py:1017 dcim/views.py:1256 +#: dcim/views.py:1948 netbox/navigation/menu.py:83 +#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 +#: templates/dcim/module.html:37 templates/dcim/moduletype/base.html:37 +msgid "Front Ports" +msgstr "" + +#: dcim/tables/devicetypes.py:131 dcim/views.py:1032 dcim/views.py:1271 +#: dcim/views.py:1963 netbox/navigation/menu.py:84 +#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 +#: templates/dcim/devicetype/base.html:40 templates/dcim/module.html:40 +#: templates/dcim/moduletype/base.html:40 +msgid "Rear Ports" +msgstr "" + +#: dcim/tables/devicetypes.py:134 dcim/views.py:1062 dcim/views.py:2001 +#: netbox/navigation/menu.py:90 templates/dcim/device/base.html:49 +#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +msgid "Device Bays" +msgstr "" + +#: dcim/tables/devicetypes.py:137 dcim/views.py:1047 dcim/views.py:1982 +#: netbox/navigation/menu.py:89 templates/dcim/device/base.html:46 +#: templates/dcim/device_list.html:64 templates/dcim/devicetype/base.html:43 +msgid "Module Bays" +msgstr "" + +#: dcim/tables/power.py:36 netbox/navigation/menu.py:263 +#: templates/dcim/powerpanel.html:53 templates/extras/configrevision.html:59 +msgid "Power Feeds" +msgstr "" + +#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:106 +msgid "Max Utilization" +msgstr "" + +#: dcim/tables/power.py:84 +msgid "Available Power (VA)" +msgstr "" + +#: dcim/tables/racks.py:29 dcim/tables/sites.py:138 +#: netbox/navigation/menu.py:25 netbox/navigation/menu.py:27 +msgid "Racks" +msgstr "" + +#: dcim/tables/racks.py:73 templates/dcim/device.html:340 +#: templates/dcim/rack.html:102 +msgid "Height" +msgstr "" + +#: dcim/tables/racks.py:85 +msgid "Space" +msgstr "" + +#: dcim/tables/racks.py:96 templates/dcim/rack.html:112 +msgid "Outer Width" +msgstr "" + +#: dcim/tables/racks.py:100 templates/dcim/rack.html:122 +msgid "Outer Depth" +msgstr "" + +#: dcim/tables/racks.py:108 +msgid "Max Weight" +msgstr "" + +#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 +#: extras/forms/filtersets.py:334 extras/forms/model_forms.py:291 +#: ipam/forms/bulk_edit.py:130 ipam/forms/model_forms.py:154 +#: ipam/tables/asn.py:65 netbox/navigation/menu.py:16 +#: netbox/navigation/menu.py:18 +msgid "Sites" +msgstr "" + +#: dcim/views.py:131 +#, python-brace-format +msgid "Disconnected {count} {type}" +msgstr "" + +#: dcim/views.py:692 netbox/navigation/menu.py:29 +msgid "Reservations" +msgstr "" + +#: dcim/views.py:711 +msgid "Non-Racked Devices" +msgstr "" + +#: dcim/views.py:2033 extras/forms/model_forms.py:351 +#: templates/extras/configcontext.html:10 +#: virtualization/forms/model_forms.py:226 virtualization/views.py:386 +msgid "Config Context" +msgstr "" + +#: dcim/views.py:2043 virtualization/views.py:396 +msgid "Render Config" +msgstr "" + +#: extras/choices.py:27 extras/forms/misc.py:14 +msgid "Text" +msgstr "" + +#: extras/choices.py:28 +msgid "Text (long)" +msgstr "" + +#: extras/choices.py:29 +msgid "Integer" +msgstr "" + +#: extras/choices.py:30 +msgid "Decimal" +msgstr "" + +#: extras/choices.py:31 +msgid "Boolean (true/false)" +msgstr "" + +#: extras/choices.py:32 +msgid "Date" +msgstr "" + +#: extras/choices.py:33 +msgid "Date & time" +msgstr "" + +#: extras/choices.py:35 +msgid "JSON" +msgstr "" + +#: extras/choices.py:36 +msgid "Selection" +msgstr "" + +#: extras/choices.py:37 +msgid "Multiple selection" +msgstr "" + +#: extras/choices.py:39 +msgid "Multiple objects" +msgstr "" + +#: extras/choices.py:50 templates/extras/customfield.html:69 +#: wireless/choices.py:27 +msgid "Disabled" +msgstr "" + +#: extras/choices.py:51 +msgid "Loose" +msgstr "" + +#: extras/choices.py:52 +msgid "Exact" +msgstr "" + +#: extras/choices.py:64 +msgid "Read/write" +msgstr "" + +#: extras/choices.py:65 +msgid "Read-only" +msgstr "" + +#: extras/choices.py:66 +msgid "Hidden" +msgstr "" + +#: extras/choices.py:67 +msgid "Hidden (if unset)" +msgstr "" + +#: extras/choices.py:94 templates/tenancy/contact.html:58 +#: tenancy/forms/bulk_edit.py:117 wireless/forms/model_forms.py:159 +msgid "Link" +msgstr "" + +#: extras/choices.py:108 +msgid "Newest" +msgstr "" + +#: extras/choices.py:109 +msgid "Oldest" +msgstr "" + +#: extras/choices.py:125 templates/generic/object.html:51 +msgid "Updated" +msgstr "" + +#: extras/choices.py:126 +msgid "Deleted" +msgstr "" + +#: extras/choices.py:143 extras/choices.py:165 +msgid "Info" +msgstr "" + +#: extras/choices.py:144 extras/choices.py:164 +msgid "Success" +msgstr "" + +#: extras/choices.py:145 extras/choices.py:166 +msgid "Warning" +msgstr "" + +#: extras/choices.py:146 +msgid "Danger" +msgstr "" + +#: extras/choices.py:163 utilities/choices.py:190 +msgid "Default" +msgstr "" + +#: extras/choices.py:167 +msgid "Failure" +msgstr "" + +#: extras/choices.py:174 +msgid "Hourly" +msgstr "" + +#: extras/choices.py:175 +msgid "12 hours" +msgstr "" + +#: extras/choices.py:176 +msgid "Daily" +msgstr "" + +#: extras/choices.py:177 +msgid "Weekly" +msgstr "" + +#: extras/choices.py:178 +msgid "30 days" +msgstr "" + +#: extras/choices.py:243 extras/tables/tables.py:283 +#: templates/dcim/virtualchassis_edit.html:108 templates/extras/webhook.html:33 +#: templates/generic/bulk_add_component.html:56 +#: templates/generic/object_edit.html:29 templates/generic/object_edit.html:70 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +msgid "Create" +msgstr "" + +#: extras/choices.py:244 extras/tables/tables.py:286 +#: templates/extras/webhook.html:37 +msgid "Update" +msgstr "" + +#: extras/choices.py:245 extras/tables/tables.py:289 +#: templates/circuits/inc/circuit_termination.html:22 +#: templates/dcim/devicetype/component_templates.html:24 +#: templates/dcim/inc/panels/inventory_items.html:29 +#: templates/dcim/moduletype/component_templates.html:24 +#: templates/dcim/powerpanel.html:71 templates/extras/report_list.html:34 +#: templates/extras/script_list.html:33 templates/extras/webhook.html:41 +#: templates/generic/bulk_delete.html:18 templates/generic/bulk_delete.html:45 +#: templates/generic/object_delete.html:15 templates/htmx/delete_form.html:23 +#: templates/ipam/inc/panels/fhrp_groups.html:35 +#: templates/users/objectpermission.html:49 +#: utilities/templates/buttons/delete.html:9 +msgid "Delete" +msgstr "" + +#: extras/choices.py:269 utilities/choices.py:143 utilities/choices.py:191 +msgid "Blue" +msgstr "" + +#: extras/choices.py:270 utilities/choices.py:142 utilities/choices.py:192 +msgid "Indigo" +msgstr "" + +#: extras/choices.py:271 utilities/choices.py:140 utilities/choices.py:193 +msgid "Purple" +msgstr "" + +#: extras/choices.py:272 utilities/choices.py:137 utilities/choices.py:194 +msgid "Pink" +msgstr "" + +#: extras/choices.py:273 utilities/choices.py:136 utilities/choices.py:195 +msgid "Red" +msgstr "" + +#: extras/choices.py:274 utilities/choices.py:154 utilities/choices.py:196 +msgid "Orange" +msgstr "" + +#: extras/choices.py:275 utilities/choices.py:152 utilities/choices.py:197 +msgid "Yellow" +msgstr "" + +#: extras/choices.py:276 utilities/choices.py:149 utilities/choices.py:198 +msgid "Green" +msgstr "" + +#: extras/choices.py:277 utilities/choices.py:146 utilities/choices.py:199 +msgid "Teal" +msgstr "" + +#: extras/choices.py:278 utilities/choices.py:145 utilities/choices.py:200 +msgid "Cyan" +msgstr "" + +#: extras/choices.py:279 utilities/choices.py:201 +msgid "Gray" +msgstr "" + +#: extras/choices.py:280 utilities/choices.py:160 utilities/choices.py:202 +msgid "Black" +msgstr "" + +#: extras/choices.py:281 utilities/choices.py:161 utilities/choices.py:203 +msgid "White" +msgstr "" + +#: extras/dashboard/forms.py:38 +msgid "Widget type" +msgstr "" + +#: extras/dashboard/widgets.py:146 +msgid "Note" +msgstr "" + +#: extras/dashboard/widgets.py:147 +msgid "Display some arbitrary custom content. Markdown is supported." +msgstr "" + +#: extras/dashboard/widgets.py:160 +msgid "Object Counts" +msgstr "" + +#: extras/dashboard/widgets.py:161 +msgid "" +"Display a set of NetBox models and the number of objects created for each " +"type." +msgstr "" + +#: extras/dashboard/widgets.py:171 +msgid "Filters to apply when counting the number of objects" +msgstr "" + +#: extras/dashboard/widgets.py:207 +msgid "Object List" +msgstr "" + +#: extras/dashboard/widgets.py:208 +msgid "Display an arbitrary list of objects." +msgstr "" + +#: extras/dashboard/widgets.py:221 +msgid "The default number of objects to display" +msgstr "" + +#: extras/dashboard/widgets.py:268 +msgid "RSS Feed" +msgstr "" + +#: extras/dashboard/widgets.py:273 +msgid "Embed an RSS feed from an external website." +msgstr "" + +#: extras/dashboard/widgets.py:280 +msgid "Feed URL" +msgstr "" + +#: extras/dashboard/widgets.py:285 +msgid "The maximum number of objects to display" +msgstr "" + +#: extras/dashboard/widgets.py:290 +msgid "How long to stored the cached content (in seconds)" +msgstr "" + +#: extras/dashboard/widgets.py:342 templates/account/base.html:10 +#: templates/account/bookmarks.html:7 templates/inc/profile_button.html:29 +msgid "Bookmarks" +msgstr "" + +#: extras/dashboard/widgets.py:346 +msgid "Show your personal bookmarks" +msgstr "" + +#: extras/filtersets.py:176 extras/filtersets.py:511 extras/filtersets.py:539 +msgid "Data file (ID)" +msgstr "" + +#: extras/filtersets.py:448 virtualization/forms/filtersets.py:111 +msgid "Cluster type" +msgstr "" + +#: extras/filtersets.py:454 virtualization/filtersets.py:93 +#: virtualization/filtersets.py:143 +msgid "Cluster type (slug)" +msgstr "" + +#: extras/filtersets.py:459 ipam/forms/bulk_edit.py:477 +#: ipam/forms/model_forms.py:587 virtualization/forms/filtersets.py:105 +msgid "Cluster group" +msgstr "" + +#: extras/filtersets.py:465 virtualization/filtersets.py:132 +msgid "Cluster group (slug)" +msgstr "" + +#: extras/filtersets.py:475 tenancy/forms/forms.py:16 tenancy/forms/forms.py:39 +msgid "Tenant group" +msgstr "" + +#: extras/filtersets.py:481 tenancy/filtersets.py:151 tenancy/filtersets.py:171 +msgid "Tenant group (slug)" +msgstr "" + +#: extras/filtersets.py:497 templates/extras/tag.html:12 +msgid "Tag" +msgstr "" + +#: extras/filtersets.py:503 +msgid "Tag (slug)" +msgstr "" + +#: extras/filtersets.py:563 extras/forms/filtersets.py:413 +msgid "Has local config context data" +msgstr "" + +#: extras/filtersets.py:588 +msgid "User name" +msgstr "" + +#: extras/forms/bulk_edit.py:31 extras/forms/filtersets.py:58 +msgid "Group name" +msgstr "" + +#: extras/forms/bulk_edit.py:39 extras/forms/filtersets.py:66 +#: extras/tables/tables.py:72 templates/extras/customfield.html:39 +#: templates/generic/bulk_import.html:116 +msgid "Required" +msgstr "" + +#: extras/forms/bulk_edit.py:52 extras/forms/bulk_import.py:56 +#: extras/forms/filtersets.py:80 extras/models/customfields.py:187 +msgid "UI visibility" +msgstr "" + +#: extras/forms/bulk_edit.py:58 extras/forms/filtersets.py:83 +msgid "Is cloneable" +msgstr "" + +#: extras/forms/bulk_edit.py:97 extras/forms/filtersets.py:123 +msgid "New window" +msgstr "" + +#: extras/forms/bulk_edit.py:106 +msgid "Button class" +msgstr "" + +#: extras/forms/bulk_edit.py:123 extras/forms/filtersets.py:161 +#: extras/models/models.py:356 +msgid "MIME type" +msgstr "" + +#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:164 +msgid "File extension" +msgstr "" + +#: extras/forms/bulk_edit.py:133 extras/forms/filtersets.py:168 +msgid "As attachment" +msgstr "" + +#: extras/forms/bulk_edit.py:161 extras/forms/filtersets.py:210 +#: extras/tables/tables.py:236 templates/extras/savedfilter.html:30 +msgid "Shared" +msgstr "" + +#: extras/forms/bulk_edit.py:182 +msgid "On create" +msgstr "" + +#: extras/forms/bulk_edit.py:187 +msgid "On update" +msgstr "" + +#: extras/forms/bulk_edit.py:192 +msgid "On delete" +msgstr "" + +#: extras/forms/bulk_edit.py:197 +msgid "On job start" +msgstr "" + +#: extras/forms/bulk_edit.py:202 +msgid "On job end" +msgstr "" + +#: extras/forms/bulk_edit.py:209 extras/forms/filtersets.py:239 +#: extras/models/models.py:100 +msgid "HTTP method" +msgstr "" + +#: extras/forms/bulk_edit.py:213 templates/extras/webhook.html:66 +msgid "Payload URL" +msgstr "" + +#: extras/forms/bulk_edit.py:218 extras/models/models.py:146 +msgid "SSL verification" +msgstr "" + +#: extras/forms/bulk_edit.py:221 templates/extras/webhook.html:74 +msgid "Secret" +msgstr "" + +#: extras/forms/bulk_edit.py:226 +msgid "CA file path" +msgstr "" + +#: extras/forms/bulk_edit.py:261 +msgid "Is active" +msgstr "" + +#: extras/forms/bulk_import.py:31 extras/forms/bulk_import.py:91 +#: extras/forms/bulk_import.py:107 extras/forms/bulk_import.py:131 +#: extras/forms/bulk_import.py:145 extras/forms/filtersets.py:111 +#: extras/forms/filtersets.py:157 extras/forms/filtersets.py:198 +#: extras/forms/model_forms.py:46 extras/forms/model_forms.py:119 +#: extras/forms/model_forms.py:147 extras/forms/model_forms.py:189 +#: extras/forms/model_forms.py:227 +msgid "Content types" +msgstr "" + +#: extras/forms/bulk_import.py:34 extras/forms/bulk_import.py:94 +#: extras/forms/bulk_import.py:110 extras/forms/bulk_import.py:133 +#: extras/forms/bulk_import.py:148 tenancy/forms/bulk_import.py:96 +msgid "One or more assigned object types" +msgstr "" + +#: extras/forms/bulk_import.py:39 +msgid "Field data type (e.g. text, integer, etc.)" +msgstr "" + +#: extras/forms/bulk_import.py:42 extras/forms/filtersets.py:50 +#: extras/forms/filtersets.py:234 extras/forms/model_forms.py:51 +#: extras/forms/model_forms.py:215 tenancy/forms/filtersets.py:93 +msgid "Object type" +msgstr "" + +#: extras/forms/bulk_import.py:46 +msgid "Object type (for object or multi-object fields)" +msgstr "" + +#: extras/forms/bulk_import.py:49 extras/forms/filtersets.py:75 +msgid "Choice set" +msgstr "" + +#: extras/forms/bulk_import.py:53 +msgid "Choice set (for selection fields)" +msgstr "" + +#: extras/forms/bulk_import.py:58 +msgid "How the custom field is displayed in the user interface" +msgstr "" + +#: extras/forms/bulk_import.py:74 +msgid "The base set of predefined choices to use (if any)" +msgstr "" + +#: extras/forms/bulk_import.py:79 +msgid "Comma-separated list of field choices" +msgstr "" + +#: extras/forms/bulk_import.py:174 +msgid "Assigned object type" +msgstr "" + +#: extras/forms/bulk_import.py:179 +msgid "The classification of entry" +msgstr "" + +#: extras/forms/filtersets.py:55 +msgid "Field type" +msgstr "" + +#: extras/forms/filtersets.py:94 extras/tables/tables.py:87 +#: templates/generic/bulk_import.html:148 +msgid "Choices" +msgstr "" + +#: extras/forms/filtersets.py:138 extras/forms/filtersets.py:302 +#: extras/forms/filtersets.py:392 extras/forms/model_forms.py:346 +#: templates/core/job.html:80 templates/extras/configcontext.html:86 +msgid "Data" +msgstr "" + +#: extras/forms/filtersets.py:149 extras/forms/filtersets.py:316 +#: extras/forms/filtersets.py:402 utilities/choices.py:219 +#: utilities/forms/bulk_import.py:27 +msgid "Data file" +msgstr "" + +#: extras/forms/filtersets.py:182 +msgid "Content type" +msgstr "" + +#: extras/forms/filtersets.py:229 extras/forms/model_forms.py:234 +#: templates/extras/webhook.html:28 +msgid "Events" +msgstr "" + +#: extras/forms/filtersets.py:253 +msgid "Object creations" +msgstr "" + +#: extras/forms/filtersets.py:260 +msgid "Object updates" +msgstr "" + +#: extras/forms/filtersets.py:267 +msgid "Object deletions" +msgstr "" + +#: extras/forms/filtersets.py:274 +msgid "Job starts" +msgstr "" + +#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:250 +msgid "Job terminations" +msgstr "" + +#: extras/forms/filtersets.py:290 +msgid "Tagged object type" +msgstr "" + +#: extras/forms/filtersets.py:295 +msgid "Allowed object type" +msgstr "" + +#: extras/forms/filtersets.py:324 extras/forms/model_forms.py:281 +#: netbox/navigation/menu.py:19 +msgid "Regions" +msgstr "" + +#: extras/forms/filtersets.py:329 extras/forms/model_forms.py:286 +msgid "Site groups" +msgstr "" + +#: extras/forms/filtersets.py:339 extras/forms/model_forms.py:296 +#: netbox/navigation/menu.py:21 +msgid "Locations" +msgstr "" + +#: extras/forms/filtersets.py:344 extras/forms/model_forms.py:301 +msgid "Device types" +msgstr "" + +#: extras/forms/filtersets.py:349 extras/forms/model_forms.py:306 +msgid "Roles" +msgstr "" + +#: extras/forms/filtersets.py:359 extras/forms/model_forms.py:316 +msgid "Cluster types" +msgstr "" + +#: extras/forms/filtersets.py:365 extras/forms/model_forms.py:321 +msgid "Cluster groups" +msgstr "" + +#: extras/forms/filtersets.py:370 extras/forms/model_forms.py:326 +#: netbox/navigation/menu.py:224 netbox/navigation/menu.py:226 +#: templates/virtualization/clustertype.html:33 +#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +msgid "Clusters" +msgstr "" + +#: extras/forms/filtersets.py:375 extras/forms/model_forms.py:331 +msgid "Tenant groups" +msgstr "" + +#: extras/forms/filtersets.py:429 extras/forms/filtersets.py:470 +msgid "After" +msgstr "" + +#: extras/forms/filtersets.py:434 extras/forms/filtersets.py:475 +msgid "Before" +msgstr "" + +#: extras/forms/filtersets.py:465 extras/tables/tables.py:426 +#: templates/extras/htmx/report_result.html:43 +#: templates/extras/objectchange.html:34 +msgid "Time" +msgstr "" + +#: extras/forms/filtersets.py:479 extras/tables/tables.py:440 +#: templates/extras/objectchange.html:50 +msgid "Action" +msgstr "" + +#: extras/forms/mixins.py:71 extras/forms/model_forms.py:195 +#: templates/extras/savedfilter.html:10 +msgid "Saved Filter" +msgstr "" + +#: extras/forms/model_forms.py:56 +msgid "Type of the related object (for object/multi-object fields only)" +msgstr "" + +#: extras/forms/model_forms.py:64 templates/extras/customfield.html:11 +msgid "Custom Field" +msgstr "" + +#: extras/forms/model_forms.py:67 templates/extras/customfield.html:60 +msgid "Behavior" +msgstr "" + +#: extras/forms/model_forms.py:68 +msgid "Values" +msgstr "" + +#: extras/forms/model_forms.py:69 extras/forms/model_forms.py:494 +#: templates/extras/configrevision.html:147 +msgid "Validation" +msgstr "" + +#: extras/forms/model_forms.py:77 +msgid "" +"The type of data stored in this field. For object/multi-object fields, " +"select the related object type below." +msgstr "" + +#: extras/forms/model_forms.py:80 +msgid "" +"This will be displayed as help text for the form field. Markdown is " +"supported." +msgstr "" + +#: extras/forms/model_forms.py:97 +msgid "" +"Enter one choice per line. An optional label may be specified for each " +"choice by appending it with a comma. Example:" +msgstr "" + +#: extras/forms/model_forms.py:125 templates/extras/customlink.html:10 +msgid "Custom Link" +msgstr "" + +#: extras/forms/model_forms.py:126 +msgid "Templates" +msgstr "" + +#: extras/forms/model_forms.py:138 +msgid "" +"Jinja2 template code for the link text. Reference the object as " +"{{ object }}. Links which render as empty text will not be " +"displayed." +msgstr "" + +#: extras/forms/model_forms.py:141 +msgid "" +"Jinja2 template code for the link URL. Reference the object as " +"{{ object }}." +msgstr "" + +#: extras/forms/model_forms.py:152 extras/forms/model_forms.py:397 +msgid "Template code" +msgstr "" + +#: extras/forms/model_forms.py:158 templates/extras/exporttemplate.html:17 +msgid "Export Template" +msgstr "" + +#: extras/forms/model_forms.py:160 +msgid "Rendering" +msgstr "" + +#: extras/forms/model_forms.py:174 extras/forms/model_forms.py:422 +msgid "Template content is populated from the remote source selected below." +msgstr "" + +#: extras/forms/model_forms.py:181 extras/forms/model_forms.py:429 +msgid "Must specify either local content or a data file" +msgstr "" + +#: extras/forms/model_forms.py:233 templates/extras/webhook.html:11 +msgid "Webhook" +msgstr "" + +#: extras/forms/model_forms.py:235 templates/extras/webhook.html:57 +msgid "HTTP Request" +msgstr "" + +#: extras/forms/model_forms.py:238 templates/extras/webhook.html:116 +msgid "Conditions" +msgstr "" + +#: extras/forms/model_forms.py:239 templates/extras/webhook.html:82 +msgid "SSL" +msgstr "" + +#: extras/forms/model_forms.py:246 +msgid "Creations" +msgstr "" + +#: extras/forms/model_forms.py:247 +msgid "Updates" +msgstr "" + +#: extras/forms/model_forms.py:248 +msgid "Deletions" +msgstr "" + +#: extras/forms/model_forms.py:249 +msgid "Job executions" +msgstr "" + +#: extras/forms/model_forms.py:262 users/forms/model_forms.py:285 +msgid "Object types" +msgstr "" + +#: extras/forms/model_forms.py:336 netbox/navigation/menu.py:40 +#: tenancy/tables/tenants.py:22 +msgid "Tenants" +msgstr "" + +#: extras/forms/model_forms.py:353 ipam/forms/filtersets.py:145 +#: templates/extras/configcontext.html:62 templates/ipam/ipaddress.html:62 +#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 +#: users/forms/model_forms.py:323 +msgid "Assignment" +msgstr "" + +#: extras/forms/model_forms.py:379 +msgid "Data is populated from the remote source selected below." +msgstr "" + +#: extras/forms/model_forms.py:385 +msgid "Must specify either local data or a data file" +msgstr "" + +#: extras/forms/model_forms.py:404 templates/core/datafile.html:65 +msgid "Content" +msgstr "" + +#: extras/forms/model_forms.py:488 templates/dcim/rack_elevation_list.html:6 +#: templates/extras/configrevision.html:43 +msgid "Rack Elevations" +msgstr "" + +#: extras/forms/model_forms.py:490 netbox/navigation/menu.py:142 +#: templates/extras/configrevision.html:79 +msgid "IPAM" +msgstr "" + +#: extras/forms/model_forms.py:491 templates/extras/configrevision.html:95 +msgid "Security" +msgstr "" + +#: extras/forms/model_forms.py:492 templates/extras/configrevision.html:107 +msgid "Banners" +msgstr "" + +#: extras/forms/model_forms.py:493 templates/extras/configrevision.html:131 +msgid "Pagination" +msgstr "" + +#: extras/forms/model_forms.py:495 templates/account/preferences.html:6 +#: templates/extras/configrevision.html:159 +msgid "User Preferences" +msgstr "" + +#: extras/forms/model_forms.py:499 +msgid "Config Revision" +msgstr "" + +#: extras/forms/model_forms.py:537 +msgid "This parameter has been defined statically and cannot be modified." +msgstr "" + +#: extras/forms/model_forms.py:545 +#, python-brace-format +msgid "Current value: {value}" +msgstr "" + +#: extras/forms/model_forms.py:547 +msgid " (default)" +msgstr "" + +#: extras/forms/reports.py:18 extras/forms/scripts.py:24 +msgid "Schedule at" +msgstr "" + +#: extras/forms/reports.py:19 +msgid "Schedule execution of report to a set time" +msgstr "" + +#: extras/forms/reports.py:24 extras/forms/scripts.py:30 +msgid "Recurs every" +msgstr "" + +#: extras/forms/reports.py:28 +msgid "Interval at which this report is re-run (in minutes)" +msgstr "" + +#: extras/forms/reports.py:36 extras/forms/scripts.py:42 +#, python-brace-format +msgid " (current time: {now})" +msgstr "" + +#: extras/forms/reports.py:46 extras/forms/scripts.py:52 +msgid "Scheduled time must be in the future." +msgstr "" + +#: extras/forms/scripts.py:18 +msgid "Commit changes" +msgstr "" + +#: extras/forms/scripts.py:19 +msgid "Commit changes to the database (uncheck for a dry-run)" +msgstr "" + +#: extras/forms/scripts.py:25 +msgid "Schedule execution of script to a set time" +msgstr "" + +#: extras/forms/scripts.py:34 +msgid "Interval at which this script is re-run (in minutes)" +msgstr "" + +#: extras/models/change_logging.py:23 +msgid "time" +msgstr "" + +#: extras/models/change_logging.py:36 +msgid "user name" +msgstr "" + +#: extras/models/change_logging.py:41 +msgid "request ID" +msgstr "" + +#: extras/models/change_logging.py:46 extras/models/staging.py:69 +msgid "action" +msgstr "" + +#: extras/models/change_logging.py:80 +msgid "pre-change data" +msgstr "" + +#: extras/models/change_logging.py:86 +msgid "post-change data" +msgstr "" + +#: extras/models/change_logging.py:96 +msgid "object change" +msgstr "" + +#: extras/models/change_logging.py:97 +msgid "object changes" +msgstr "" + +#: extras/models/configs.py:130 +msgid "config context" +msgstr "" + +#: extras/models/configs.py:131 +msgid "config contexts" +msgstr "" + +#: extras/models/configs.py:149 extras/models/configs.py:205 +msgid "JSON data must be in object form. Example:" +msgstr "" + +#: extras/models/configs.py:169 +msgid "" +"Local config context data takes precedence over source contexts in the final " +"rendered config context" +msgstr "" + +#: extras/models/configs.py:224 +msgid "template code" +msgstr "" + +#: extras/models/configs.py:225 +msgid "Jinja2 template code." +msgstr "" + +#: extras/models/configs.py:228 +msgid "environment parameters" +msgstr "" + +#: extras/models/configs.py:233 +msgid "" +"Any additional parameters to pass when constructing the Jinja2 " +"environment." +msgstr "" + +#: extras/models/configs.py:240 +msgid "config template" +msgstr "" + +#: extras/models/configs.py:241 +msgid "config templates" +msgstr "" + +#: extras/models/customfields.py:66 +msgid "The object(s) to which this field applies." +msgstr "" + +#: extras/models/customfields.py:73 +msgid "The type of data this custom field holds" +msgstr "" + +#: extras/models/customfields.py:80 +msgid "The type of NetBox object this field maps to (for object fields)" +msgstr "" + +#: extras/models/customfields.py:86 +msgid "Internal field name" +msgstr "" + +#: extras/models/customfields.py:90 +msgid "Only alphanumeric characters and underscores are allowed." +msgstr "" + +#: extras/models/customfields.py:95 +msgid "Double underscores are not permitted in custom field names." +msgstr "" + +#: extras/models/customfields.py:106 +msgid "" +"Name of the field as displayed to users (if not provided, 'the field's name " +"will be used)" +msgstr "" + +#: extras/models/customfields.py:110 extras/models/models.py:264 +msgid "group name" +msgstr "" + +#: extras/models/customfields.py:113 +msgid "Custom fields within the same group will be displayed together" +msgstr "" + +#: extras/models/customfields.py:121 +msgid "required" +msgstr "" + +#: extras/models/customfields.py:123 +msgid "" +"If true, this field is required when creating new objects or editing an " +"existing object." +msgstr "" + +#: extras/models/customfields.py:126 +msgid "search weight" +msgstr "" + +#: extras/models/customfields.py:129 +msgid "" +"Weighting for search. Lower values are considered more important. Fields " +"with a search weight of zero will be ignored." +msgstr "" + +#: extras/models/customfields.py:134 +msgid "filter logic" +msgstr "" + +#: extras/models/customfields.py:138 +msgid "" +"Loose matches any instance of a given string; exact matches the entire field." +msgstr "" + +#: extras/models/customfields.py:141 +msgid "default" +msgstr "" + +#: extras/models/customfields.py:145 +msgid "" +"Default value for the field (must be a JSON value). Encapsulate strings with " +"double quotes (e.g. \"Foo\")." +msgstr "" + +#: extras/models/customfields.py:150 +msgid "display weight" +msgstr "" + +#: extras/models/customfields.py:151 +msgid "Fields with higher weights appear lower in a form." +msgstr "" + +#: extras/models/customfields.py:156 +msgid "minimum value" +msgstr "" + +#: extras/models/customfields.py:157 +msgid "Minimum allowed value (for numeric fields)" +msgstr "" + +#: extras/models/customfields.py:162 +msgid "maximum value" +msgstr "" + +#: extras/models/customfields.py:163 +msgid "Maximum allowed value (for numeric fields)" +msgstr "" + +#: extras/models/customfields.py:169 +msgid "validation regex" +msgstr "" + +#: extras/models/customfields.py:171 +#, python-brace-format +msgid "" +"Regular expression to enforce on text field values. Use ^ and $ to force " +"matching of entire string. For example, ^[A-Z]{3}$ will limit " +"values to exactly three uppercase letters." +msgstr "" + +#: extras/models/customfields.py:179 +msgid "choice set" +msgstr "" + +#: extras/models/customfields.py:188 +msgid "Specifies the visibility of custom field in the UI" +msgstr "" + +#: extras/models/customfields.py:192 +msgid "is cloneable" +msgstr "" + +#: extras/models/customfields.py:193 +msgid "Replicate this value when cloning objects" +msgstr "" + +#: extras/models/customfields.py:206 +msgid "custom field" +msgstr "" + +#: extras/models/customfields.py:207 +msgid "custom fields" +msgstr "" + +#: extras/models/customfields.py:290 +#, python-brace-format +msgid "Invalid default value \"{value}\": {error}" +msgstr "" + +#: extras/models/customfields.py:297 +msgid "A minimum value may be set only for numeric fields" +msgstr "" + +#: extras/models/customfields.py:299 +msgid "A maximum value may be set only for numeric fields" +msgstr "" + +#: extras/models/customfields.py:309 +msgid "Regular expression validation is supported only for text and URL fields" +msgstr "" + +#: extras/models/customfields.py:319 +msgid "Selection fields must specify a set of choices." +msgstr "" + +#: extras/models/customfields.py:323 +msgid "Choices may be set only on selection fields." +msgstr "" + +#: extras/models/customfields.py:330 +msgid "Object fields must define an object type." +msgstr "" + +#: extras/models/customfields.py:335 +#, python-brace-format +msgid "{type} fields may not define an object type." +msgstr "" + +#: extras/models/customfields.py:415 +msgid "True" +msgstr "" + +#: extras/models/customfields.py:416 +msgid "False" +msgstr "" + +#: extras/models/customfields.py:498 +#, python-brace-format +msgid "Values must match this regex: {regex}" +msgstr "" + +#: extras/models/customfields.py:513 +msgid "Field is set to read-only." +msgstr "" + +#: extras/models/customfields.py:595 +msgid "Value must be a string." +msgstr "" + +#: extras/models/customfields.py:597 +#, python-brace-format +msgid "Value must match regex '{regex}'" +msgstr "" + +#: extras/models/customfields.py:602 +msgid "Value must be an integer." +msgstr "" + +#: extras/models/customfields.py:605 extras/models/customfields.py:620 +#, python-brace-format +msgid "Value must be at least {minimum}" +msgstr "" + +#: extras/models/customfields.py:609 extras/models/customfields.py:624 +#, python-brace-format +msgid "Value must not exceed {maximum}" +msgstr "" + +#: extras/models/customfields.py:617 +msgid "Value must be a decimal." +msgstr "" + +#: extras/models/customfields.py:629 +msgid "Value must be true or false." +msgstr "" + +#: extras/models/customfields.py:637 +msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." +msgstr "" + +#: extras/models/customfields.py:646 +msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." +msgstr "" + +#: extras/models/customfields.py:653 +#, python-brace-format +msgid "Invalid choice ({value}) for choice set {choiceset}." +msgstr "" + +#: extras/models/customfields.py:663 +#, python-brace-format +msgid "Invalid choice(s) ({value}) for choice set {choiceset}." +msgstr "" + +#: extras/models/customfields.py:672 +#, python-brace-format +msgid "Value must be an object ID, not {type}" +msgstr "" + +#: extras/models/customfields.py:678 +#, python-brace-format +msgid "Value must be a list of object IDs, not {type}" +msgstr "" + +#: extras/models/customfields.py:682 +#, python-brace-format +msgid "Found invalid object ID: {id}" +msgstr "" + +#: extras/models/customfields.py:685 +msgid "Required field cannot be empty." +msgstr "" + +#: extras/models/customfields.py:704 +msgid "Base set of predefined choices (optional)" +msgstr "" + +#: extras/models/customfields.py:716 +msgid "Choices are automatically ordered alphabetically" +msgstr "" + +#: extras/models/customfields.py:723 +msgid "custom field choice set" +msgstr "" + +#: extras/models/customfields.py:724 +msgid "custom field choice sets" +msgstr "" + +#: extras/models/customfields.py:760 +msgid "Must define base or extra choices." +msgstr "" + +#: extras/models/dashboard.py:19 +msgid "layout" +msgstr "" + +#: extras/models/dashboard.py:23 +msgid "config" +msgstr "" + +#: extras/models/dashboard.py:28 +msgid "dashboard" +msgstr "" + +#: extras/models/dashboard.py:29 +msgid "dashboards" +msgstr "" + +#: extras/models/models.py:50 +msgid "object types" +msgstr "" + +#: extras/models/models.py:52 +msgid "The object(s) to which this Webhook applies." +msgstr "" + +#: extras/models/models.py:60 +msgid "on create" +msgstr "" + +#: extras/models/models.py:62 +msgid "Triggers when a matching object is created." +msgstr "" + +#: extras/models/models.py:65 +msgid "on update" +msgstr "" + +#: extras/models/models.py:67 +msgid "Triggers when a matching object is updated." +msgstr "" + +#: extras/models/models.py:70 +msgid "on delete" +msgstr "" + +#: extras/models/models.py:72 +msgid "Triggers when a matching object is deleted." +msgstr "" + +#: extras/models/models.py:75 +msgid "on job start" +msgstr "" + +#: extras/models/models.py:77 +msgid "Triggers when a job for a matching object is started." +msgstr "" + +#: extras/models/models.py:80 +msgid "on job end" +msgstr "" + +#: extras/models/models.py:82 +msgid "Triggers when a job for a matching object terminates." +msgstr "" + +#: extras/models/models.py:88 +msgid "" +"This URL will be called using the HTTP method defined when the webhook is " +"called. Jinja2 template processing is supported with the same context as the " +"request body." +msgstr "" + +#: extras/models/models.py:105 +msgid "HTTP content type" +msgstr "" + +#: extras/models/models.py:107 +msgid "" +"The complete list of official content types is available here." +msgstr "" + +#: extras/models/models.py:112 +msgid "additional headers" +msgstr "" + +#: extras/models/models.py:115 +msgid "" +"User-supplied HTTP headers to be sent with the request in addition to the " +"HTTP content type. Headers should be defined in the format Name: " +"Value. Jinja2 template processing is supported with the same context " +"as the request body (below)." +msgstr "" + +#: extras/models/models.py:121 +msgid "body template" +msgstr "" + +#: extras/models/models.py:124 +msgid "" +"Jinja2 template for a custom request body. If blank, a JSON object " +"representing the change will be included. Available context data includes: " +"event, model, timestamp, " +"username, request_id, and data." +msgstr "" + +#: extras/models/models.py:130 +msgid "secret" +msgstr "" + +#: extras/models/models.py:134 +msgid "" +"When provided, the request will include a X-Hook-Signature " +"header containing a HMAC hex digest of the payload body using the secret as " +"the key. The secret is not transmitted in the request." +msgstr "" + +#: extras/models/models.py:139 +msgid "conditions" +msgstr "" + +#: extras/models/models.py:142 +msgid "" +"A set of conditions which determine whether the webhook will be generated." +msgstr "" + +#: extras/models/models.py:147 +msgid "Enable SSL certificate verification. Disable with caution!" +msgstr "" + +#: extras/models/models.py:153 templates/extras/webhook.html:91 +msgid "CA File Path" +msgstr "" + +#: extras/models/models.py:155 +msgid "" +"The specific CA certificate file to use for SSL verification. Leave blank to " +"use the system defaults." +msgstr "" + +#: extras/models/models.py:167 +msgid "webhook" +msgstr "" + +#: extras/models/models.py:168 +msgid "webhooks" +msgstr "" + +#: extras/models/models.py:188 +msgid "" +"At least one event type must be selected: create, update, delete, job_start, " +"and/or job_end." +msgstr "" + +#: extras/models/models.py:200 +msgid "Do not specify a CA certificate file if SSL verification is disabled." +msgstr "" + +#: extras/models/models.py:240 +msgid "The object type(s) to which this link applies." +msgstr "" + +#: extras/models/models.py:252 +msgid "link text" +msgstr "" + +#: extras/models/models.py:253 +msgid "Jinja2 template code for link text" +msgstr "" + +#: extras/models/models.py:256 +msgid "link URL" +msgstr "" + +#: extras/models/models.py:257 +msgid "Jinja2 template code for link URL" +msgstr "" + +#: extras/models/models.py:267 +msgid "Links with the same group will appear as a dropdown menu" +msgstr "" + +#: extras/models/models.py:270 +msgid "button class" +msgstr "" + +#: extras/models/models.py:274 +msgid "" +"The class of the first link in a group will be used for the dropdown button" +msgstr "" + +#: extras/models/models.py:277 +msgid "new window" +msgstr "" + +#: extras/models/models.py:279 +msgid "Force link to open in a new window" +msgstr "" + +#: extras/models/models.py:288 +msgid "custom link" +msgstr "" + +#: extras/models/models.py:289 +msgid "custom links" +msgstr "" + +#: extras/models/models.py:336 +msgid "The object type(s) to which this template applies." +msgstr "" + +#: extras/models/models.py:349 +msgid "" +"Jinja2 template code. The list of objects being exported is passed as a " +"context variable named queryset." +msgstr "" + +#: extras/models/models.py:357 +msgid "Defaults to text/plain; charset=utf-8" +msgstr "" + +#: extras/models/models.py:360 +msgid "file extension" +msgstr "" + +#: extras/models/models.py:363 +msgid "Extension to append to the rendered filename" +msgstr "" + +#: extras/models/models.py:366 +msgid "as attachment" +msgstr "" + +#: extras/models/models.py:368 +msgid "Download file as attachment" +msgstr "" + +#: extras/models/models.py:377 +msgid "export template" +msgstr "" + +#: extras/models/models.py:378 +msgid "export templates" +msgstr "" + +#: extras/models/models.py:395 +#, python-brace-format +msgid "\"{name}\" is a reserved name. Please choose a different name." +msgstr "" + +#: extras/models/models.py:445 +msgid "The object type(s) to which this filter applies." +msgstr "" + +#: extras/models/models.py:477 +msgid "shared" +msgstr "" + +#: extras/models/models.py:490 +msgid "saved filter" +msgstr "" + +#: extras/models/models.py:491 +msgid "saved filters" +msgstr "" + +#: extras/models/models.py:509 +msgid "Filter parameters must be stored as a dictionary of keyword arguments." +msgstr "" + +#: extras/models/models.py:537 +msgid "image height" +msgstr "" + +#: extras/models/models.py:540 +msgid "image width" +msgstr "" + +#: extras/models/models.py:554 +msgid "image attachment" +msgstr "" + +#: extras/models/models.py:555 +msgid "image attachments" +msgstr "" + +#: extras/models/models.py:623 +msgid "kind" +msgstr "" + +#: extras/models/models.py:634 +msgid "journal entry" +msgstr "" + +#: extras/models/models.py:635 +msgid "journal entries" +msgstr "" + +#: extras/models/models.py:651 +#, python-brace-format +msgid "Journaling is not supported for this object type ({type})." +msgstr "" + +#: extras/models/models.py:690 +msgid "bookmark" +msgstr "" + +#: extras/models/models.py:691 +msgid "bookmarks" +msgstr "" + +#: extras/models/models.py:708 +msgid "comment" +msgstr "" + +#: extras/models/models.py:715 +msgid "configuration data" +msgstr "" + +#: extras/models/models.py:722 +msgid "config revision" +msgstr "" + +#: extras/models/models.py:723 +msgid "config revisions" +msgstr "" + +#: extras/models/models.py:727 +msgid "Default configuration" +msgstr "" + +#: extras/models/models.py:729 +msgid "Current configuration" +msgstr "" + +#: extras/models/models.py:730 +#, python-brace-format +msgid "Config revision #{id}" +msgstr "" + +#: extras/models/reports.py:46 +msgid "report module" +msgstr "" + +#: extras/models/reports.py:47 +msgid "report modules" +msgstr "" + +#: extras/models/scripts.py:46 +msgid "script module" +msgstr "" + +#: extras/models/scripts.py:47 +msgid "script modules" +msgstr "" + +#: extras/models/search.py:22 +msgid "timestamp" +msgstr "" + +#: extras/models/search.py:37 +msgid "field" +msgstr "" + +#: extras/models/search.py:45 +msgid "value" +msgstr "" + +#: extras/models/search.py:54 +msgid "cached value" +msgstr "" + +#: extras/models/search.py:55 +msgid "cached values" +msgstr "" + +#: extras/models/staging.py:44 +msgid "branch" +msgstr "" + +#: extras/models/staging.py:45 +msgid "branches" +msgstr "" + +#: extras/models/staging.py:94 +msgid "staged change" +msgstr "" + +#: extras/models/staging.py:95 +msgid "staged changes" +msgstr "" + +#: extras/models/tags.py:44 +msgid "The object type(s) to which this this tag can be applied." +msgstr "" + +#: extras/models/tags.py:53 +msgid "tag" +msgstr "" + +#: extras/models/tags.py:54 +msgid "tags" +msgstr "" + +#: extras/models/tags.py:80 +msgid "tagged item" +msgstr "" + +#: extras/models/tags.py:81 +msgid "tagged items" +msgstr "" + +#: extras/tables/tables.py:48 users/forms/filtersets.py:47 users/tables.py:39 +msgid "Is Active" +msgstr "" + +#: extras/tables/tables.py:69 extras/tables/tables.py:141 +#: extras/tables/tables.py:165 extras/tables/tables.py:230 +#: extras/tables/tables.py:277 +msgid "Content Types" +msgstr "" + +#: extras/tables/tables.py:75 templates/extras/customfield.html:82 +msgid "UI Visibility" +msgstr "" + +#: extras/tables/tables.py:82 templates/extras/customfield.html:48 +msgid "Choice Set" +msgstr "" + +#: extras/tables/tables.py:90 +msgid "Is Cloneable" +msgstr "" + +#: extras/tables/tables.py:120 +msgid "Count" +msgstr "" + +#: extras/tables/tables.py:123 +msgid "Order Alphabetically" +msgstr "" + +#: extras/tables/tables.py:147 templates/extras/customlink.html:34 +msgid "New Window" +msgstr "" + +#: extras/tables/tables.py:168 +msgid "As Attachment" +msgstr "" + +#: extras/tables/tables.py:175 extras/tables/tables.py:367 +#: extras/tables/tables.py:402 templates/core/datafile.html:32 +#: templates/dcim/device/render_config.html:23 +#: templates/extras/configcontext.html:40 +#: templates/extras/configtemplate.html:32 +#: templates/extras/exporttemplate.html:51 +#: templates/generic/bulk_import.html:30 +#: templates/virtualization/virtualmachine/render_config.html:23 +msgid "Data File" +msgstr "" + +#: extras/tables/tables.py:180 extras/tables/tables.py:379 +#: extras/tables/tables.py:407 +msgid "Synced" +msgstr "" + +#: extras/tables/tables.py:200 +msgid "Content Type" +msgstr "" + +#: extras/tables/tables.py:207 +msgid "Image" +msgstr "" + +#: extras/tables/tables.py:212 +msgid "Size (Bytes)" +msgstr "" + +#: extras/tables/tables.py:255 extras/tables/tables.py:326 +#: templates/extras/customfield.html:92 +#: templates/users/objectpermission.html:68 users/tables.py:83 +msgid "Object Types" +msgstr "" + +#: extras/tables/tables.py:292 +msgid "Job Start" +msgstr "" + +#: extras/tables/tables.py:295 +msgid "Job End" +msgstr "" + +#: extras/tables/tables.py:298 +msgid "SSL Validation" +msgstr "" + +#: extras/tables/tables.py:436 templates/account/profile.html:20 +#: templates/users/user.html:22 +msgid "Full Name" +msgstr "" + +#: extras/tables/tables.py:453 templates/extras/objectchange.html:72 +msgid "Request ID" +msgstr "" + +#: extras/tables/tables.py:490 +msgid "Comments (Short)" +msgstr "" + +#: extras/views.py:836 +msgid "Your dashboard has been reset." +msgstr "" + +#: ipam/api/field_serializers.py:17 +msgid "Enter a valid IPv4 or IPv6 address with optional mask." +msgstr "" + +#: ipam/api/field_serializers.py:24 +#, python-brace-format +msgid "Invalid IP address format: {data}" +msgstr "" + +#: ipam/api/field_serializers.py:37 +msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." +msgstr "" + +#: ipam/api/field_serializers.py:44 +#, python-brace-format +msgid "Invalid IP prefix format: {data}" +msgstr "" + +#: ipam/choices.py:30 +msgid "Container" +msgstr "" + +#: ipam/choices.py:72 +msgid "DHCP" +msgstr "" + +#: ipam/choices.py:73 +msgid "SLAAC" +msgstr "" + +#: ipam/choices.py:89 +msgid "Loopback" +msgstr "" + +#: ipam/choices.py:90 tenancy/choices.py:18 +msgid "Secondary" +msgstr "" + +#: ipam/choices.py:91 +msgid "Anycast" +msgstr "" + +#: ipam/choices.py:115 +msgid "Standard" +msgstr "" + +#: ipam/choices.py:120 +msgid "CheckPoint" +msgstr "" + +#: ipam/choices.py:123 +msgid "Cisco" +msgstr "" + +#: ipam/choices.py:137 +msgid "Plaintext" +msgstr "" + +#: ipam/filtersets.py:47 ipam/filtersets.py:1068 +msgid "Import target" +msgstr "" + +#: ipam/filtersets.py:53 ipam/filtersets.py:1074 +msgid "Import target (name)" +msgstr "" + +#: ipam/filtersets.py:58 ipam/filtersets.py:1079 +msgid "Export target" +msgstr "" + +#: ipam/filtersets.py:64 ipam/filtersets.py:1085 +msgid "Export target (name)" +msgstr "" + +#: ipam/filtersets.py:85 +msgid "Importing VRF" +msgstr "" + +#: ipam/filtersets.py:91 +msgid "Import VRF (RD)" +msgstr "" + +#: ipam/filtersets.py:96 +msgid "Exporting VRF" +msgstr "" + +#: ipam/filtersets.py:102 +msgid "Export VRF (RD)" +msgstr "" + +#: ipam/filtersets.py:132 ipam/filtersets.py:247 ipam/forms/model_forms.py:231 +#: ipam/tables/ip.py:211 templates/ipam/prefix.html:11 +msgid "Prefix" +msgstr "" + +#: ipam/filtersets.py:136 ipam/filtersets.py:175 ipam/filtersets.py:198 +msgid "RIR (ID)" +msgstr "" + +#: ipam/filtersets.py:142 ipam/filtersets.py:181 ipam/filtersets.py:204 +msgid "RIR (slug)" +msgstr "" + +#: ipam/filtersets.py:251 +msgid "Within prefix" +msgstr "" + +#: ipam/filtersets.py:255 +msgid "Within and including prefix" +msgstr "" + +#: ipam/filtersets.py:259 +msgid "Prefixes which contain this prefix or IP" +msgstr "" + +#: ipam/filtersets.py:338 ipam/filtersets.py:1191 +msgid "VLAN (ID)" +msgstr "" + +#: ipam/filtersets.py:342 ipam/filtersets.py:1186 +msgid "VLAN number (1-4094)" +msgstr "" + +#: ipam/filtersets.py:436 ipam/filtersets.py:440 ipam/filtersets.py:532 +#: ipam/forms/model_forms.py:446 templates/tenancy/contact.html:54 +#: tenancy/forms/bulk_edit.py:112 +msgid "Address" +msgstr "" + +#: ipam/filtersets.py:444 +msgid "Ranges which contain this prefix or IP" +msgstr "" + +#: ipam/filtersets.py:472 ipam/filtersets.py:528 +msgid "Parent prefix" +msgstr "" + +#: ipam/filtersets.py:536 ipam/forms/bulk_edit.py:328 +#: ipam/forms/filtersets.py:195 ipam/forms/filtersets.py:320 +msgid "Mask length" +msgstr "" + +#: ipam/filtersets.py:572 ipam/filtersets.py:807 ipam/filtersets.py:1026 +#: ipam/filtersets.py:1149 +msgid "Virtual machine (name)" +msgstr "" + +#: ipam/filtersets.py:577 ipam/filtersets.py:812 ipam/filtersets.py:1020 +#: ipam/filtersets.py:1154 virtualization/filtersets.py:273 +msgid "Virtual machine (ID)" +msgstr "" + +#: ipam/filtersets.py:583 ipam/filtersets.py:1160 +msgid "Interface (name)" +msgstr "" + +#: ipam/filtersets.py:588 ipam/filtersets.py:1165 +msgid "Interface (ID)" +msgstr "" + +#: ipam/filtersets.py:594 ipam/filtersets.py:1171 +msgid "VM interface (name)" +msgstr "" + +#: ipam/filtersets.py:599 +msgid "VM interface (ID)" +msgstr "" + +#: ipam/filtersets.py:604 +msgid "FHRP group (ID)" +msgstr "" + +#: ipam/filtersets.py:608 +msgid "Is assigned to an interface" +msgstr "" + +#: ipam/filtersets.py:612 +msgid "Is assigned" +msgstr "" + +#: ipam/filtersets.py:1031 +msgid "IP address (ID)" +msgstr "" + +#: ipam/filtersets.py:1037 ipam/models/ip.py:786 +msgid "IP address" +msgstr "" + +#: ipam/filtersets.py:1112 +msgid "L2VPN (slug)" +msgstr "" + +#: ipam/filtersets.py:1176 +msgid "VM Interface (ID)" +msgstr "" + +#: ipam/filtersets.py:1182 +msgid "VLAN (name)" +msgstr "" + +#: ipam/forms/bulk_create.py:14 +msgid "Address pattern" +msgstr "" + +#: ipam/forms/bulk_edit.py:87 +msgid "Is private" +msgstr "" + +#: ipam/forms/bulk_edit.py:108 ipam/forms/bulk_edit.py:137 +#: ipam/forms/bulk_edit.py:162 ipam/forms/bulk_import.py:91 +#: ipam/forms/bulk_import.py:111 ipam/forms/bulk_import.py:131 +#: ipam/forms/filtersets.py:113 ipam/forms/filtersets.py:128 +#: ipam/forms/filtersets.py:151 ipam/forms/model_forms.py:95 +#: ipam/forms/model_forms.py:110 ipam/forms/model_forms.py:132 +#: ipam/forms/model_forms.py:150 ipam/models/asns.py:31 ipam/models/asns.py:103 +#: ipam/models/ip.py:70 ipam/models/ip.py:89 ipam/tables/asn.py:20 +#: ipam/tables/asn.py:45 templates/ipam/aggregate.html:19 +#: templates/ipam/asn.html:28 templates/ipam/asnrange.html:20 +#: templates/ipam/rir.html:20 +msgid "RIR" +msgstr "" + +#: ipam/forms/bulk_edit.py:170 +msgid "Date added" +msgstr "" + +#: ipam/forms/bulk_edit.py:231 +msgid "Prefix length" +msgstr "" + +#: ipam/forms/bulk_edit.py:254 ipam/forms/filtersets.py:240 +#: templates/ipam/prefix.html:86 +msgid "Is a pool" +msgstr "" + +#: ipam/forms/bulk_edit.py:259 ipam/forms/bulk_edit.py:303 +#: ipam/models/ip.py:271 ipam/models/ip.py:538 +#, python-format +msgid "Treat as 100% utilized" +msgstr "" + +#: ipam/forms/bulk_edit.py:351 ipam/models/ip.py:771 +msgid "DNS name" +msgstr "" + +#: ipam/forms/bulk_edit.py:372 ipam/forms/bulk_edit.py:571 +#: ipam/forms/bulk_import.py:396 ipam/forms/bulk_import.py:480 +#: ipam/forms/bulk_import.py:506 ipam/forms/filtersets.py:379 +#: ipam/forms/filtersets.py:513 templates/ipam/fhrpgroup.html:23 +#: templates/ipam/inc/panels/fhrp_groups.html:11 templates/ipam/service.html:35 +#: templates/ipam/servicetemplate.html:20 +msgid "Protocol" +msgstr "" + +#: ipam/forms/bulk_edit.py:379 ipam/forms/filtersets.py:386 +#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:27 +msgid "Group ID" +msgstr "" + +#: ipam/forms/bulk_edit.py:384 ipam/forms/filtersets.py:391 +#: wireless/forms/bulk_edit.py:67 wireless/forms/bulk_edit.py:114 +#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 +#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 +#: wireless/forms/filtersets.py:53 wireless/forms/filtersets.py:87 +msgid "Authentication type" +msgstr "" + +#: ipam/forms/bulk_edit.py:389 ipam/forms/filtersets.py:395 +msgid "Authentication key" +msgstr "" + +#: ipam/forms/bulk_edit.py:406 ipam/forms/filtersets.py:372 +#: ipam/forms/model_forms.py:457 netbox/navigation/menu.py:356 +#: templates/ipam/fhrpgroup.html:51 +#: templates/wireless/inc/authentication_attrs.html:5 +#: wireless/forms/bulk_edit.py:90 wireless/forms/bulk_edit.py:137 +#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: wireless/forms/model_forms.py:56 wireless/forms/model_forms.py:161 +msgid "Authentication" +msgstr "" + +#: ipam/forms/bulk_edit.py:416 +msgid "Minimum child VLAN VID" +msgstr "" + +#: ipam/forms/bulk_edit.py:422 +msgid "Maximum child VLAN VID" +msgstr "" + +#: ipam/forms/bulk_edit.py:430 ipam/forms/model_forms.py:529 +msgid "Scope type" +msgstr "" + +#: ipam/forms/bulk_edit.py:491 ipam/forms/model_forms.py:602 +#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:39 +msgid "Scope" +msgstr "" + +#: ipam/forms/bulk_edit.py:562 +msgid "Site & Group" +msgstr "" + +#: ipam/forms/bulk_edit.py:576 ipam/forms/model_forms.py:665 +#: ipam/forms/model_forms.py:699 ipam/tables/services.py:19 +#: ipam/tables/services.py:49 templates/ipam/service.html:39 +#: templates/ipam/servicetemplate.html:24 +msgid "Ports" +msgstr "" + +#: ipam/forms/bulk_import.py:50 +msgid "Import route targets" +msgstr "" + +#: ipam/forms/bulk_import.py:56 +msgid "Export route targets" +msgstr "" + +#: ipam/forms/bulk_import.py:94 ipam/forms/bulk_import.py:114 +#: ipam/forms/bulk_import.py:134 +msgid "Assigned RIR" +msgstr "" + +#: ipam/forms/bulk_import.py:184 +msgid "VLAN's group (if any)" +msgstr "" + +#: ipam/forms/bulk_import.py:187 ipam/forms/bulk_import.py:564 +#: ipam/forms/filtersets.py:603 ipam/forms/model_forms.py:221 +#: ipam/forms/model_forms.py:804 ipam/models/vlans.py:213 ipam/tables/ip.py:254 +#: templates/ipam/l2vpntermination_edit.html:17 templates/ipam/prefix.html:61 +#: templates/ipam/vlan.html:12 templates/ipam/vlan/base.html:6 +#: templates/ipam/vlan_edit.html:10 templates/wireless/wirelesslan.html:31 +#: wireless/forms/bulk_edit.py:54 wireless/forms/bulk_import.py:48 +#: wireless/forms/model_forms.py:49 wireless/models.py:101 +msgid "VLAN" +msgstr "" + +#: ipam/forms/bulk_import.py:310 +msgid "Parent device of assigned interface (if any)" +msgstr "" + +#: ipam/forms/bulk_import.py:313 ipam/forms/bulk_import.py:499 +#: ipam/forms/bulk_import.py:550 ipam/forms/model_forms.py:693 +#: virtualization/filtersets.py:279 virtualization/forms/bulk_edit.py:197 +#: virtualization/forms/bulk_import.py:145 +#: virtualization/forms/filtersets.py:200 +#: virtualization/forms/model_forms.py:280 +msgid "Virtual machine" +msgstr "" + +#: ipam/forms/bulk_import.py:317 +msgid "Parent VM of assigned interface (if any)" +msgstr "" + +#: ipam/forms/bulk_import.py:324 +msgid "Assigned interface" +msgstr "" + +#: ipam/forms/bulk_import.py:327 +msgid "Is primary" +msgstr "" + +#: ipam/forms/bulk_import.py:328 +msgid "Make this the primary IP for the assigned device" +msgstr "" + +#: ipam/forms/bulk_import.py:367 +msgid "No device or virtual machine specified; cannot set as primary IP" +msgstr "" + +#: ipam/forms/bulk_import.py:371 +msgid "No interface specified; cannot set as primary IP" +msgstr "" + +#: ipam/forms/bulk_import.py:400 +msgid "Auth type" +msgstr "" + +#: ipam/forms/bulk_import.py:415 +msgid "Scope type (app & model)" +msgstr "" + +#: ipam/forms/bulk_import.py:421 +#, python-brace-format +msgid "Minimum child VLAN VID (default: {minimum})" +msgstr "" + +#: ipam/forms/bulk_import.py:427 +#, python-brace-format +msgid "Maximum child VLAN VID (default: {maximum})" +msgstr "" + +#: ipam/forms/bulk_import.py:451 +msgid "Assigned VLAN group" +msgstr "" + +#: ipam/forms/bulk_import.py:482 ipam/forms/bulk_import.py:508 +msgid "IP protocol" +msgstr "" + +#: ipam/forms/bulk_import.py:496 +msgid "Required if not assigned to a VM" +msgstr "" + +#: ipam/forms/bulk_import.py:503 +msgid "Required if not assigned to a device" +msgstr "" + +#: ipam/forms/bulk_import.py:526 +msgid "L2VPN type" +msgstr "" + +#: ipam/forms/bulk_import.py:547 +msgid "Parent device (for interface)" +msgstr "" + +#: ipam/forms/bulk_import.py:554 +msgid "Parent virtual machine (for interface)" +msgstr "" + +#: ipam/forms/bulk_import.py:561 +msgid "Assigned interface (device or VM)" +msgstr "" + +#: ipam/forms/bulk_import.py:594 +msgid "Cannot import device and VM interface terminations simultaneously." +msgstr "" + +#: ipam/forms/bulk_import.py:596 +msgid "Each termination must specify either an interface or a VLAN." +msgstr "" + +#: ipam/forms/bulk_import.py:598 +msgid "Cannot assign both an interface and a VLAN." +msgstr "" + +#: ipam/forms/filtersets.py:50 ipam/forms/model_forms.py:62 +#: ipam/forms/model_forms.py:780 netbox/navigation/menu.py:177 +msgid "Route Targets" +msgstr "" + +#: ipam/forms/filtersets.py:56 ipam/forms/filtersets.py:544 +#: ipam/forms/model_forms.py:49 ipam/forms/model_forms.py:767 +msgid "Import targets" +msgstr "" + +#: ipam/forms/filtersets.py:61 ipam/forms/filtersets.py:549 +#: ipam/forms/model_forms.py:54 ipam/forms/model_forms.py:772 +msgid "Export targets" +msgstr "" + +#: ipam/forms/filtersets.py:76 +msgid "Imported by VRF" +msgstr "" + +#: ipam/forms/filtersets.py:81 +msgid "Exported by VRF" +msgstr "" + +#: ipam/forms/filtersets.py:90 ipam/tables/ip.py:89 templates/ipam/rir.html:33 +msgid "Private" +msgstr "" + +#: ipam/forms/filtersets.py:108 ipam/forms/filtersets.py:190 +#: ipam/forms/filtersets.py:265 ipam/forms/filtersets.py:315 +msgid "Address family" +msgstr "" + +#: ipam/forms/filtersets.py:122 templates/ipam/asnrange.html:26 +msgid "Range" +msgstr "" + +#: ipam/forms/filtersets.py:131 +msgid "Start" +msgstr "" + +#: ipam/forms/filtersets.py:135 +msgid "End" +msgstr "" + +#: ipam/forms/filtersets.py:185 +msgid "Search within" +msgstr "" + +#: ipam/forms/filtersets.py:206 ipam/forms/filtersets.py:331 +msgid "Present in VRF" +msgstr "" + +#: ipam/forms/filtersets.py:247 ipam/forms/filtersets.py:286 +#, python-format +msgid "Marked as 100% utilized" +msgstr "" + +#: ipam/forms/filtersets.py:301 +msgid "Device/VM" +msgstr "" + +#: ipam/forms/filtersets.py:336 +msgid "Assigned Device" +msgstr "" + +#: ipam/forms/filtersets.py:341 +msgid "Assigned VM" +msgstr "" + +#: ipam/forms/filtersets.py:355 +msgid "Assigned to an interface" +msgstr "" + +#: ipam/forms/filtersets.py:362 templates/ipam/ipaddress.html:54 +msgid "DNS Name" +msgstr "" + +#: ipam/forms/filtersets.py:404 ipam/forms/filtersets.py:496 +#: ipam/models/vlans.py:154 templates/ipam/vlan.html:34 +msgid "VLAN ID" +msgstr "" + +#: ipam/forms/filtersets.py:436 +msgid "Minimum VID" +msgstr "" + +#: ipam/forms/filtersets.py:442 +msgid "Maximum VID" +msgstr "" + +#: ipam/forms/filtersets.py:518 +msgid "Port" +msgstr "" + +#: ipam/forms/filtersets.py:558 ipam/tables/ip.py:424 +#: templates/ipam/l2vpntermination.html:19 +msgid "Assigned Object" +msgstr "" + +#: ipam/forms/filtersets.py:570 +msgid "Assigned Object Type" +msgstr "" + +#: ipam/forms/filtersets.py:612 ipam/tables/vlans.py:191 +#: templates/ipam/ipaddress_edit.html:47 +#: templates/ipam/l2vpntermination_edit.html:27 +#: templates/ipam/service_create.html:22 templates/ipam/service_edit.html:21 +#: templates/virtualization/virtualmachine.html:13 +#: templates/virtualization/vminterface.html:24 +#: virtualization/forms/filtersets.py:186 +#: virtualization/forms/model_forms.py:221 +#: virtualization/tables/virtualmachines.py:110 +msgid "Virtual Machine" +msgstr "" + +#: ipam/forms/model_forms.py:115 ipam/tables/ip.py:116 +#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +msgid "Aggregate" +msgstr "" + +#: ipam/forms/model_forms.py:136 templates/ipam/asnrange.html:12 +msgid "ASN Range" +msgstr "" + +#: ipam/forms/model_forms.py:232 +msgid "Site/VLAN Assignment" +msgstr "" + +#: ipam/forms/model_forms.py:258 templates/ipam/iprange.html:11 +msgid "IP Range" +msgstr "" + +#: ipam/forms/model_forms.py:287 ipam/forms/model_forms.py:456 +#: templates/ipam/fhrpgroup.html:19 templates/ipam/ipaddress_edit.html:52 +msgid "FHRP Group" +msgstr "" + +#: ipam/forms/model_forms.py:302 +msgid "Make this the primary IP for the device/VM" +msgstr "" + +#: ipam/forms/model_forms.py:353 +msgid "An IP address can only be assigned to a single object." +msgstr "" + +#: ipam/forms/model_forms.py:359 ipam/models/ip.py:877 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" + +#: ipam/forms/model_forms.py:369 +msgid "" +"Only IP addresses assigned to an interface can be designated as primary IPs." +msgstr "" + +#: ipam/forms/model_forms.py:375 +#, python-brace-format +msgid "{ip} is a network ID, which may not be assigned to an interface." +msgstr "" + +#: ipam/forms/model_forms.py:381 +#, python-brace-format +msgid "{ip} is a broadcast address, which may not be assigned to an interface." +msgstr "" + +#: ipam/forms/model_forms.py:458 +msgid "Virtual IP Address" +msgstr "" + +#: ipam/forms/model_forms.py:600 ipam/forms/model_forms.py:639 +#: ipam/tables/ip.py:250 templates/ipam/vlan_edit.html:37 +#: templates/ipam/vlangroup.html:27 +msgid "VLAN Group" +msgstr "" + +#: ipam/forms/model_forms.py:601 +msgid "Child VLANs" +msgstr "" + +#: ipam/forms/model_forms.py:670 ipam/forms/model_forms.py:704 +msgid "" +"Comma-separated list of one or more port numbers. A range may be specified " +"using a hyphen." +msgstr "" + +#: ipam/forms/model_forms.py:675 templates/ipam/servicetemplate.html:12 +msgid "Service Template" +msgstr "" + +#: ipam/forms/model_forms.py:726 +msgid "Service template" +msgstr "" + +#: ipam/forms/model_forms.py:846 +msgid "A termination must specify an interface or VLAN." +msgstr "" + +#: ipam/forms/model_forms.py:848 +msgid "" +"A termination can only have one terminating object (an interface or VLAN)." +msgstr "" + +#: ipam/models/asns.py:34 +msgid "start" +msgstr "" + +#: ipam/models/asns.py:51 +msgid "ASN range" +msgstr "" + +#: ipam/models/asns.py:52 +msgid "ASN ranges" +msgstr "" + +#: ipam/models/asns.py:72 +#, python-brace-format +msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." +msgstr "" + +#: ipam/models/asns.py:104 +msgid "Regional Internet Registry responsible for this AS number space" +msgstr "" + +#: ipam/models/asns.py:109 +msgid "16- or 32-bit autonomous system number" +msgstr "" + +#: ipam/models/fhrp.py:23 +msgid "group ID" +msgstr "" + +#: ipam/models/fhrp.py:31 ipam/models/services.py:22 +msgid "protocol" +msgstr "" + +#: ipam/models/fhrp.py:39 wireless/models.py:27 +msgid "authentication type" +msgstr "" + +#: ipam/models/fhrp.py:44 +msgid "authentication key" +msgstr "" + +#: ipam/models/fhrp.py:57 +msgid "FHRP group" +msgstr "" + +#: ipam/models/fhrp.py:58 +msgid "FHRP groups" +msgstr "" + +#: ipam/models/fhrp.py:94 tenancy/models/contacts.py:133 +msgid "priority" +msgstr "" + +#: ipam/models/fhrp.py:111 +msgid "FHRP group assignment" +msgstr "" + +#: ipam/models/fhrp.py:112 +msgid "FHRP group assignments" +msgstr "" + +#: ipam/models/ip.py:64 +msgid "private" +msgstr "" + +#: ipam/models/ip.py:65 +msgid "IP space managed by this RIR is considered private" +msgstr "" + +#: ipam/models/ip.py:71 netbox/navigation/menu.py:170 +msgid "RIRs" +msgstr "" + +#: ipam/models/ip.py:83 +msgid "IPv4 or IPv6 network" +msgstr "" + +#: ipam/models/ip.py:90 +msgid "Regional Internet Registry responsible for this IP space" +msgstr "" + +#: ipam/models/ip.py:100 +msgid "date added" +msgstr "" + +#: ipam/models/ip.py:114 +msgid "aggregate" +msgstr "" + +#: ipam/models/ip.py:115 +msgid "aggregates" +msgstr "" + +#: ipam/models/ip.py:131 +msgid "Cannot create aggregate with /0 mask." +msgstr "" + +#: ipam/models/ip.py:143 +#, python-brace-format +msgid "" +"Aggregates cannot overlap. {prefix} is already covered by an existing " +"aggregate ({aggregate})." +msgstr "" + +#: ipam/models/ip.py:157 +#, python-brace-format +msgid "" +"Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " +"({aggregate})." +msgstr "" + +#: ipam/models/ip.py:199 ipam/models/ip.py:736 +msgid "role" +msgstr "" + +#: ipam/models/ip.py:200 +msgid "roles" +msgstr "" + +#: ipam/models/ip.py:216 ipam/models/ip.py:292 +msgid "prefix" +msgstr "" + +#: ipam/models/ip.py:217 +msgid "IPv4 or IPv6 network with mask" +msgstr "" + +#: ipam/models/ip.py:253 +msgid "Operational status of this prefix" +msgstr "" + +#: ipam/models/ip.py:261 +msgid "The primary function of this prefix" +msgstr "" + +#: ipam/models/ip.py:264 +msgid "is a pool" +msgstr "" + +#: ipam/models/ip.py:266 +msgid "All IP addresses within this prefix are considered usable" +msgstr "" + +#: ipam/models/ip.py:269 ipam/models/ip.py:536 +msgid "mark utilized" +msgstr "" + +#: ipam/models/ip.py:293 +msgid "prefixes" +msgstr "" + +#: ipam/models/ip.py:316 +msgid "Cannot create prefix with /0 mask." +msgstr "" + +#: ipam/models/ip.py:323 ipam/models/ip.py:853 +#, python-brace-format +msgid "VRF {vrf}" +msgstr "" + +#: ipam/models/ip.py:323 ipam/models/ip.py:853 +msgid "global table" +msgstr "" + +#: ipam/models/ip.py:325 +#, python-brace-format +msgid "Duplicate prefix found in {table}: {prefix}" +msgstr "" + +#: ipam/models/ip.py:494 +msgid "start address" +msgstr "" + +#: ipam/models/ip.py:495 ipam/models/ip.py:499 ipam/models/ip.py:711 +msgid "IPv4 or IPv6 address (with mask)" +msgstr "" + +#: ipam/models/ip.py:498 +msgid "end address" +msgstr "" + +#: ipam/models/ip.py:525 +msgid "Operational status of this range" +msgstr "" + +#: ipam/models/ip.py:533 +msgid "The primary function of this range" +msgstr "" + +#: ipam/models/ip.py:547 +msgid "IP range" +msgstr "" + +#: ipam/models/ip.py:548 +msgid "IP ranges" +msgstr "" + +#: ipam/models/ip.py:564 +msgid "Starting and ending IP address versions must match" +msgstr "" + +#: ipam/models/ip.py:570 +msgid "Starting and ending IP address masks must match" +msgstr "" + +#: ipam/models/ip.py:577 +#, python-brace-format +msgid "" +"Ending address must be lower than the starting address ({start_address})" +msgstr "" + +#: ipam/models/ip.py:589 +#, python-brace-format +msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" +msgstr "" + +#: ipam/models/ip.py:598 +#, python-brace-format +msgid "Defined range exceeds maximum supported size ({max_size})" +msgstr "" + +#: ipam/models/ip.py:710 tenancy/models/contacts.py:81 +msgid "address" +msgstr "" + +#: ipam/models/ip.py:733 +msgid "The operational status of this IP" +msgstr "" + +#: ipam/models/ip.py:740 +msgid "The functional role of this IP" +msgstr "" + +#: ipam/models/ip.py:764 templates/ipam/ipaddress.html:75 +msgid "NAT (inside)" +msgstr "" + +#: ipam/models/ip.py:765 +msgid "The IP for which this address is the \"outside\" IP" +msgstr "" + +#: ipam/models/ip.py:772 +msgid "Hostname or FQDN (not case-sensitive)" +msgstr "" + +#: ipam/models/ip.py:787 ipam/models/services.py:94 +msgid "IP addresses" +msgstr "" + +#: ipam/models/ip.py:843 +msgid "Cannot create IP address with /0 mask." +msgstr "" + +#: ipam/models/ip.py:855 +#, python-brace-format +msgid "Duplicate IP address found in {table}: {ipaddress}" +msgstr "" + +#: ipam/models/ip.py:884 +msgid "Only IPv6 addresses can be assigned SLAAC status" +msgstr "" + +#: ipam/models/l2vpn.py:64 netbox/navigation/menu.py:205 +msgid "L2VPNs" +msgstr "" + +#: ipam/models/l2vpn.py:113 +msgid "L2VPN termination" +msgstr "" + +#: ipam/models/l2vpn.py:114 +msgid "L2VPN terminations" +msgstr "" + +#: ipam/models/l2vpn.py:132 +#, python-brace-format +msgid "L2VPN Termination already assigned ({assigned_object})" +msgstr "" + +#: ipam/models/l2vpn.py:144 +#, python-brace-format +msgid "" +"{l2vpn_type} L2VPNs cannot have more than two terminations; found " +"{terminations_count} already defined." +msgstr "" + +#: ipam/models/services.py:33 +msgid "port numbers" +msgstr "" + +#: ipam/models/services.py:59 +msgid "service template" +msgstr "" + +#: ipam/models/services.py:60 +msgid "service templates" +msgstr "" + +#: ipam/models/services.py:95 +msgid "The specific IP addresses (if any) to which this service is bound" +msgstr "" + +#: ipam/models/services.py:102 +msgid "service" +msgstr "" + +#: ipam/models/services.py:103 +msgid "services" +msgstr "" + +#: ipam/models/services.py:117 +msgid "" +"A service cannot be associated with both a device and a virtual machine." +msgstr "" + +#: ipam/models/services.py:119 +msgid "A service must be associated with either a device or a virtual machine." +msgstr "" + +#: ipam/models/vlans.py:50 +msgid "minimum VLAN ID" +msgstr "" + +#: ipam/models/vlans.py:56 +msgid "Lowest permissible ID of a child VLAN" +msgstr "" + +#: ipam/models/vlans.py:59 +msgid "maximum VLAN ID" +msgstr "" + +#: ipam/models/vlans.py:65 +msgid "Highest permissible ID of a child VLAN" +msgstr "" + +#: ipam/models/vlans.py:83 +msgid "VLAN groups" +msgstr "" + +#: ipam/models/vlans.py:93 +msgid "Cannot set scope_type without scope_id." +msgstr "" + +#: ipam/models/vlans.py:95 +msgid "Cannot set scope_id without scope_type." +msgstr "" + +#: ipam/models/vlans.py:100 +msgid "Maximum child VID must be greater than or equal to minimum child VID" +msgstr "" + +#: ipam/models/vlans.py:143 +msgid "The specific site to which this VLAN is assigned (if any)" +msgstr "" + +#: ipam/models/vlans.py:151 +msgid "VLAN group (optional)" +msgstr "" + +#: ipam/models/vlans.py:159 +msgid "Numeric VLAN ID (1-4094)" +msgstr "" + +#: ipam/models/vlans.py:177 +msgid "Operational status of this VLAN" +msgstr "" + +#: ipam/models/vlans.py:185 +msgid "The primary function of this VLAN" +msgstr "" + +#: ipam/models/vlans.py:214 ipam/tables/ip.py:175 ipam/tables/vlans.py:78 +#: ipam/views.py:942 netbox/navigation/menu.py:181 +#: netbox/navigation/menu.py:183 +msgid "VLANs" +msgstr "" + +#: ipam/models/vlans.py:229 +#, python-brace-format +msgid "" +"VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " +"site {site}." +msgstr "" + +#: ipam/models/vlans.py:237 +#, python-brace-format +msgid "VID must be between {minimum} and {maximum} for VLANs in group {group}" +msgstr "" + +#: ipam/models/vrfs.py:30 +msgid "route distinguisher" +msgstr "" + +#: ipam/models/vrfs.py:31 +msgid "Unique route distinguisher (as defined in RFC 4364)" +msgstr "" + +#: ipam/models/vrfs.py:42 +msgid "enforce unique space" +msgstr "" + +#: ipam/models/vrfs.py:43 +msgid "Prevent duplicate prefixes/IP addresses within this VRF" +msgstr "" + +#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:174 +#: netbox/navigation/menu.py:176 +msgid "VRFs" +msgstr "" + +#: ipam/models/vrfs.py:82 +msgid "Route target value (formatted in accordance with RFC 4360)" +msgstr "" + +#: ipam/models/vrfs.py:94 +msgid "route target" +msgstr "" + +#: ipam/models/vrfs.py:95 +msgid "route targets" +msgstr "" + +#: ipam/tables/asn.py:51 +msgid "ASDOT" +msgstr "" + +#: ipam/tables/asn.py:56 +msgid "Site Count" +msgstr "" + +#: ipam/tables/asn.py:61 +msgid "Provider Count" +msgstr "" + +#: ipam/tables/ip.py:94 netbox/navigation/menu.py:167 +#: netbox/navigation/menu.py:169 +msgid "Aggregates" +msgstr "" + +#: ipam/tables/ip.py:124 +msgid "Added" +msgstr "" + +#: ipam/tables/ip.py:127 ipam/tables/ip.py:165 ipam/tables/vlans.py:138 +#: ipam/views.py:351 netbox/navigation/menu.py:153 +#: netbox/navigation/menu.py:155 templates/ipam/vlan.html:87 +msgid "Prefixes" +msgstr "" + +#: ipam/tables/ip.py:130 ipam/tables/ip.py:267 ipam/tables/ip.py:320 +#: ipam/tables/vlans.py:82 templates/dcim/device.html:280 +#: templates/ipam/aggregate.html:25 templates/ipam/iprange.html:32 +#: templates/ipam/prefix.html:100 +msgid "Utilization" +msgstr "" + +#: ipam/tables/ip.py:170 netbox/navigation/menu.py:149 +msgid "IP Ranges" +msgstr "" + +#: ipam/tables/ip.py:220 +msgid "Prefix (Flat)" +msgstr "" + +#: ipam/tables/ip.py:224 templates/dcim/rack_edit.html:52 +msgid "Depth" +msgstr "" + +#: ipam/tables/ip.py:233 +msgid "Children" +msgstr "" + +#: ipam/tables/ip.py:261 +msgid "Pool" +msgstr "" + +#: ipam/tables/ip.py:264 ipam/tables/ip.py:317 +msgid "Marked Utilized" +msgstr "" + +#: ipam/tables/ip.py:301 +msgid "Start address" +msgstr "" + +#: ipam/tables/ip.py:379 +msgid "NAT (Inside)" +msgstr "" + +#: ipam/tables/ip.py:384 +msgid "NAT (Outside)" +msgstr "" + +#: ipam/tables/ip.py:389 +msgid "Assigned" +msgstr "" + +#: ipam/tables/l2vpn.py:27 ipam/tables/vrfs.py:36 +msgid "Import Targets" +msgstr "" + +#: ipam/tables/l2vpn.py:32 ipam/tables/vrfs.py:41 +msgid "Export Targets" +msgstr "" + +#: ipam/tables/l2vpn.py:69 +msgid "Object Parent" +msgstr "" + +#: ipam/tables/l2vpn.py:74 +msgid "Object Site" +msgstr "" + +#: ipam/tables/vlans.py:68 +msgid "Scope Type" +msgstr "" + +#: ipam/tables/vlans.py:107 ipam/tables/vlans.py:210 +#: templates/dcim/inc/interface_vlans_table.html:4 +msgid "VID" +msgstr "" + +#: ipam/tables/vrfs.py:30 +msgid "RD" +msgstr "" + +#: ipam/tables/vrfs.py:33 +msgid "Unique" +msgstr "" + +#: ipam/views.py:538 +msgid "Child Prefixes" +msgstr "" + +#: ipam/views.py:573 +msgid "Child Ranges" +msgstr "" + +#: ipam/views.py:870 +msgid "Related IPs" +msgstr "" + +#: ipam/views.py:1093 +msgid "Device Interfaces" +msgstr "" + +#: ipam/views.py:1111 +msgid "VM Interfaces" +msgstr "" + +#: netbox/config/parameters.py:22 templates/extras/configrevision.html:111 +msgid "Login banner" +msgstr "" + +#: netbox/config/parameters.py:24 +msgid "Additional content to display on the login page" +msgstr "" + +#: netbox/config/parameters.py:33 templates/extras/configrevision.html:115 +msgid "Maintenance banner" +msgstr "" + +#: netbox/config/parameters.py:35 +msgid "Additional content to display when in maintenance mode" +msgstr "" + +#: netbox/config/parameters.py:44 templates/extras/configrevision.html:119 +msgid "Top banner" +msgstr "" + +#: netbox/config/parameters.py:46 +msgid "Additional content to display at the top of every page" +msgstr "" + +#: netbox/config/parameters.py:55 templates/extras/configrevision.html:123 +msgid "Bottom banner" +msgstr "" + +#: netbox/config/parameters.py:57 +msgid "Additional content to display at the bottom of every page" +msgstr "" + +#: netbox/config/parameters.py:68 +msgid "Globally unique IP space" +msgstr "" + +#: netbox/config/parameters.py:70 +msgid "Enforce unique IP addressing within the global table" +msgstr "" + +#: netbox/config/parameters.py:75 templates/extras/configrevision.html:87 +msgid "Prefer IPv4" +msgstr "" + +#: netbox/config/parameters.py:77 +msgid "Prefer IPv4 addresses over IPv6" +msgstr "" + +#: netbox/config/parameters.py:84 +msgid "Rack unit height" +msgstr "" + +#: netbox/config/parameters.py:86 +msgid "Default unit height for rendered rack elevations" +msgstr "" + +#: netbox/config/parameters.py:91 +msgid "Rack unit width" +msgstr "" + +#: netbox/config/parameters.py:93 +msgid "Default unit width for rendered rack elevations" +msgstr "" + +#: netbox/config/parameters.py:100 +msgid "Powerfeed voltage" +msgstr "" + +#: netbox/config/parameters.py:102 +msgid "Default voltage for powerfeeds" +msgstr "" + +#: netbox/config/parameters.py:107 +msgid "Powerfeed amperage" +msgstr "" + +#: netbox/config/parameters.py:109 +msgid "Default amperage for powerfeeds" +msgstr "" + +#: netbox/config/parameters.py:114 +msgid "Powerfeed max utilization" +msgstr "" + +#: netbox/config/parameters.py:116 +msgid "Default max utilization for powerfeeds" +msgstr "" + +#: netbox/config/parameters.py:123 templates/extras/configrevision.html:99 +msgid "Allowed URL schemes" +msgstr "" + +#: netbox/config/parameters.py:128 +msgid "Permitted schemes for URLs in user-provided content" +msgstr "" + +#: netbox/config/parameters.py:136 +msgid "Default page size" +msgstr "" + +#: netbox/config/parameters.py:142 +msgid "Maximum page size" +msgstr "" + +#: netbox/config/parameters.py:150 templates/extras/configrevision.html:151 +msgid "Custom validators" +msgstr "" + +#: netbox/config/parameters.py:152 +msgid "Custom validation rules (JSON)" +msgstr "" + +#: netbox/config/parameters.py:164 +msgid "Default preferences" +msgstr "" + +#: netbox/config/parameters.py:166 +msgid "Default preferences for new users" +msgstr "" + +#: netbox/config/parameters.py:173 templates/extras/configrevision.html:175 +msgid "Maintenance mode" +msgstr "" + +#: netbox/config/parameters.py:175 +msgid "Enable maintenance mode" +msgstr "" + +#: netbox/config/parameters.py:180 templates/extras/configrevision.html:179 +msgid "GraphQL enabled" +msgstr "" + +#: netbox/config/parameters.py:182 +msgid "Enable the GraphQL API" +msgstr "" + +#: netbox/config/parameters.py:187 templates/extras/configrevision.html:183 +msgid "Changelog retention" +msgstr "" + +#: netbox/config/parameters.py:189 +msgid "Days to retain changelog history (set to zero for unlimited)" +msgstr "" + +#: netbox/config/parameters.py:194 +msgid "Job result retention" +msgstr "" + +#: netbox/config/parameters.py:196 +msgid "Days to retain job result history (set to zero for unlimited)" +msgstr "" + +#: netbox/config/parameters.py:201 templates/extras/configrevision.html:191 +msgid "Maps URL" +msgstr "" + +#: netbox/config/parameters.py:203 +msgid "Base URL for mapping geographic locations" +msgstr "" + +#: netbox/forms/__init__.py:13 +msgid "Partial match" +msgstr "" + +#: netbox/forms/__init__.py:14 +msgid "Exact match" +msgstr "" + +#: netbox/forms/__init__.py:15 +msgid "Starts with" +msgstr "" + +#: netbox/forms/__init__.py:16 +msgid "Ends with" +msgstr "" + +#: netbox/forms/__init__.py:17 +msgid "Regex" +msgstr "" + +#: netbox/forms/__init__.py:35 +msgid "Object type(s)" +msgstr "" + +#: netbox/forms/base.py:66 +msgid "Id" +msgstr "" + +#: netbox/forms/base.py:107 +msgid "Add tags" +msgstr "" + +#: netbox/forms/base.py:112 +msgid "Remove tags" +msgstr "" + +#: netbox/models/features.py:422 +msgid "Remote data source" +msgstr "" + +#: netbox/models/features.py:432 +msgid "data path" +msgstr "" + +#: netbox/models/features.py:436 +msgid "Path to remote file (relative to data source root)" +msgstr "" + +#: netbox/models/features.py:439 +msgid "auto sync enabled" +msgstr "" + +#: netbox/models/features.py:441 +msgid "Enable automatic synchronization of data when the data file is updated" +msgstr "" + +#: netbox/models/features.py:444 +msgid "date synced" +msgstr "" + +#: netbox/navigation/menu.py:12 +msgid "Organization" +msgstr "" + +#: netbox/navigation/menu.py:20 +msgid "Site Groups" +msgstr "" + +#: netbox/navigation/menu.py:28 +msgid "Rack Roles" +msgstr "" + +#: netbox/navigation/menu.py:32 +msgid "Elevations" +msgstr "" + +#: netbox/navigation/menu.py:41 +msgid "Tenant Groups" +msgstr "" + +#: netbox/navigation/menu.py:48 +msgid "Contact Groups" +msgstr "" + +#: netbox/navigation/menu.py:49 templates/tenancy/contactrole.html:8 +msgid "Contact Roles" +msgstr "" + +#: netbox/navigation/menu.py:50 +msgid "Contact Assignments" +msgstr "" + +#: netbox/navigation/menu.py:64 +msgid "Modules" +msgstr "" + +#: netbox/navigation/menu.py:65 templates/dcim/devicerole.html:8 +msgid "Device Roles" +msgstr "" + +#: netbox/navigation/menu.py:68 templates/dcim/device.html:179 +#: templates/dcim/virtualdevicecontext.html:8 +msgid "Virtual Device Contexts" +msgstr "" + +#: netbox/navigation/menu.py:76 +msgid "Manufacturers" +msgstr "" + +#: netbox/navigation/menu.py:80 +msgid "Device Components" +msgstr "" + +#: netbox/navigation/menu.py:92 templates/dcim/inventoryitemrole.html:8 +msgid "Inventory Item Roles" +msgstr "" + +#: netbox/navigation/menu.py:99 netbox/navigation/menu.py:103 +msgid "Connections" +msgstr "" + +#: netbox/navigation/menu.py:105 +msgid "Cables" +msgstr "" + +#: netbox/navigation/menu.py:106 +msgid "Wireless Links" +msgstr "" + +#: netbox/navigation/menu.py:109 +msgid "Interface Connections" +msgstr "" + +#: netbox/navigation/menu.py:114 +msgid "Console Connections" +msgstr "" + +#: netbox/navigation/menu.py:119 +msgid "Power Connections" +msgstr "" + +#: netbox/navigation/menu.py:135 +msgid "Wireless LAN Groups" +msgstr "" + +#: netbox/navigation/menu.py:156 +msgid "Prefix & VLAN Roles" +msgstr "" + +#: netbox/navigation/menu.py:162 +msgid "ASN Ranges" +msgstr "" + +#: netbox/navigation/menu.py:184 +msgid "VLAN Groups" +msgstr "" + +#: netbox/navigation/menu.py:191 +msgid "Service Templates" +msgstr "" + +#: netbox/navigation/menu.py:192 templates/dcim/device.html:321 +#: templates/ipam/ipaddress.html:122 +#: templates/virtualization/virtualmachine.html:155 +msgid "Services" +msgstr "" + +#: netbox/navigation/menu.py:199 +msgid "Overlay" +msgstr "" + +#: netbox/navigation/menu.py:206 templates/ipam/l2vpn.html:57 +msgid "Terminations" +msgstr "" + +#: netbox/navigation/menu.py:213 templates/dcim/device_edit.html:78 +msgid "Virtualization" +msgstr "" + +#: netbox/navigation/menu.py:217 netbox/navigation/menu.py:219 +#: virtualization/views.py:186 +msgid "Virtual Machines" +msgstr "" + +#: netbox/navigation/menu.py:227 +msgid "Cluster Types" +msgstr "" + +#: netbox/navigation/menu.py:228 +msgid "Cluster Groups" +msgstr "" + +#: netbox/navigation/menu.py:242 +msgid "Circuit Types" +msgstr "" + +#: netbox/navigation/menu.py:246 netbox/navigation/menu.py:248 +msgid "Providers" +msgstr "" + +#: netbox/navigation/menu.py:249 templates/circuits/provider.html:53 +msgid "Provider Accounts" +msgstr "" + +#: netbox/navigation/menu.py:250 +msgid "Provider Networks" +msgstr "" + +#: netbox/navigation/menu.py:264 +msgid "Power Panels" +msgstr "" + +#: netbox/navigation/menu.py:275 +msgid "Configurations" +msgstr "" + +#: netbox/navigation/menu.py:277 +msgid "Config Contexts" +msgstr "" + +#: netbox/navigation/menu.py:278 +msgid "Config Templates" +msgstr "" + +#: netbox/navigation/menu.py:285 netbox/navigation/menu.py:289 +msgid "Customization" +msgstr "" + +#: netbox/navigation/menu.py:291 +#: templates/circuits/circuittermination_edit.html:53 +#: templates/dcim/cable_edit.html:77 templates/dcim/device_edit.html:103 +#: templates/dcim/inventoryitem_edit.html:102 templates/dcim/rack_edit.html:81 +#: templates/dcim/virtualchassis_add.html:31 +#: templates/dcim/virtualchassis_edit.html:41 +#: templates/generic/bulk_edit.html:92 templates/htmx/form.html:32 +#: templates/inc/panels/custom_fields.html:7 +#: templates/ipam/ipaddress_bulk_add.html:35 +#: templates/ipam/ipaddress_edit.html:88 +#: templates/ipam/l2vpntermination_edit.html:51 +#: templates/ipam/service_create.html:75 templates/ipam/service_edit.html:62 +#: templates/ipam/vlan_edit.html:63 +msgid "Custom Fields" +msgstr "" + +#: netbox/navigation/menu.py:292 +msgid "Custom Field Choices" +msgstr "" + +#: netbox/navigation/menu.py:293 +msgid "Custom Links" +msgstr "" + +#: netbox/navigation/menu.py:294 +msgid "Export Templates" +msgstr "" + +#: netbox/navigation/menu.py:295 +msgid "Saved Filters" +msgstr "" + +#: netbox/navigation/menu.py:297 +msgid "Image Attachments" +msgstr "" + +#: netbox/navigation/menu.py:301 +msgid "Reports & Scripts" +msgstr "" + +#: netbox/navigation/menu.py:321 +msgid "Operations" +msgstr "" + +#: netbox/navigation/menu.py:325 +msgid "Integrations" +msgstr "" + +#: netbox/navigation/menu.py:327 +msgid "Data Sources" +msgstr "" + +#: netbox/navigation/menu.py:328 +msgid "Webhooks" +msgstr "" + +#: netbox/navigation/menu.py:332 netbox/navigation/menu.py:336 +#: netbox/views/generic/feature_views.py:151 +#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +msgid "Jobs" +msgstr "" + +#: netbox/navigation/menu.py:342 +msgid "Logging" +msgstr "" + +#: netbox/navigation/menu.py:344 +msgid "Journal Entries" +msgstr "" + +#: netbox/navigation/menu.py:345 templates/extras/objectchange.html:8 +#: templates/extras/objectchange_list.html:4 +msgid "Change Log" +msgstr "" + +#: netbox/navigation/menu.py:352 templates/inc/profile_button.html:18 +msgid "Admin" +msgstr "" + +#: netbox/navigation/menu.py:361 templates/users/group.html:27 +#: users/forms/model_forms.py:242 users/forms/model_forms.py:255 +#: users/forms/model_forms.py:309 users/tables.py:105 +msgid "Users" +msgstr "" + +#: netbox/navigation/menu.py:384 users/forms/model_forms.py:182 +#: users/forms/model_forms.py:195 users/forms/model_forms.py:314 +#: users/tables.py:35 users/tables.py:109 +msgid "Groups" +msgstr "" + +#: netbox/navigation/menu.py:406 templates/account/base.html:21 +#: templates/inc/profile_button.html:39 +msgid "API Tokens" +msgstr "" + +#: netbox/navigation/menu.py:413 users/forms/model_forms.py:188 +#: users/forms/model_forms.py:197 users/forms/model_forms.py:248 +#: users/forms/model_forms.py:256 +msgid "Permissions" +msgstr "" + +#: netbox/navigation/menu.py:425 +msgid "Current Config" +msgstr "" + +#: netbox/navigation/menu.py:431 +msgid "Config Revisions" +msgstr "" + +#: netbox/navigation/menu.py:471 templates/500.html:35 +#: templates/account/preferences.html:29 +msgid "Plugins" +msgstr "" + +#: netbox/preferences.py:17 +msgid "Color mode" +msgstr "" + +#: netbox/preferences.py:25 +msgid "Page length" +msgstr "" + +#: netbox/preferences.py:27 +msgid "The default number of objects to display per page" +msgstr "" + +#: netbox/preferences.py:31 +msgid "Paginator placement" +msgstr "" + +#: netbox/preferences.py:37 +msgid "Where the paginator controls will be displayed relative to a table" +msgstr "" + +#: netbox/preferences.py:43 +msgid "Data format" +msgstr "" + +#: netbox/tables/columns.py:175 +msgid "Toggle all" +msgstr "" + +#: netbox/tables/columns.py:277 templates/inc/profile_button.html:56 +msgid "Toggle Dropdown" +msgstr "" + +#: netbox/tables/columns.py:542 +msgid "Error" +msgstr "" + +#: netbox/tables/tables.py:234 templates/generic/bulk_import.html:115 +msgid "Field" +msgstr "" + +#: netbox/tables/tables.py:237 +msgid "Value" +msgstr "" + +#: netbox/tables/tables.py:246 +msgid "No results found" +msgstr "" + +#: netbox/tests/dummy_plugin/navigation.py:29 +msgid "Dummy Plugin" +msgstr "" + +#: netbox/views/generic/feature_views.py:38 +msgid "Changelog" +msgstr "" + +#: netbox/views/generic/feature_views.py:91 +msgid "Journal" +msgstr "" + +#: templates/403.html:4 +msgid "Access Denied" +msgstr "" + +#: templates/403.html:9 +msgid "You do not have permission to access this page" +msgstr "" + +#: templates/404.html:4 +msgid "Page Not Found" +msgstr "" + +#: templates/404.html:9 +msgid "The requested page does not exist" +msgstr "" + +#: templates/500.html:7 templates/500.html:18 +msgid "Server Error" +msgstr "" + +#: templates/500.html:23 +msgid "There was a problem with your request. Please contact an administrator" +msgstr "" + +#: templates/500.html:28 +msgid "The complete exception is provided below" +msgstr "" + +#: templates/500.html:33 +msgid "Python version" +msgstr "" + +#: templates/500.html:34 +msgid "NetBox version" +msgstr "" + +#: templates/500.html:36 +msgid "None installed" +msgstr "" + +#: templates/500.html:39 +msgid "If further assistance is required, please post to the" +msgstr "" + +#: templates/500.html:39 +msgid "NetBox discussion forum" +msgstr "" + +#: templates/500.html:39 +msgid "on GitHub" +msgstr "" + +#: templates/500.html:42 templates/base/40x.html:17 +msgid "Home Page" +msgstr "" + +#: templates/account/base.html:7 templates/inc/profile_button.html:24 +msgid "Profile" +msgstr "" + +#: templates/account/base.html:13 templates/inc/profile_button.html:34 +msgid "Preferences" +msgstr "" + +#: templates/account/password.html:5 +msgid "Change Password" +msgstr "" + +#: templates/account/password.html:17 templates/account/preferences.html:82 +#: templates/dcim/devicebay_populate.html:34 +#: templates/dcim/virtualchassis_add_member.html:24 +#: templates/dcim/virtualchassis_edit.html:104 +#: templates/extras/configrevision_restore.html:80 +#: templates/extras/object_journal.html:26 templates/extras/script.html:36 +#: templates/generic/bulk_add_component.html:55 +#: templates/generic/bulk_delete.html:46 templates/generic/bulk_edit.html:125 +#: templates/generic/bulk_import.html:53 templates/generic/bulk_import.html:75 +#: templates/generic/bulk_import.html:97 templates/generic/bulk_remove.html:42 +#: templates/generic/bulk_rename.html:44 +#: templates/generic/confirmation_form.html:20 +#: templates/generic/object_edit.html:76 templates/htmx/delete_form.html:19 +#: templates/htmx/delete_form.html:21 templates/ipam/ipaddress_assign.html:31 +#: templates/virtualization/cluster_add_devices.html:30 +msgid "Cancel" +msgstr "" + +#: templates/account/password.html:18 templates/account/preferences.html:83 +#: templates/dcim/devicebay_populate.html:35 +#: templates/dcim/virtualchassis_add_member.html:26 +#: templates/dcim/virtualchassis_edit.html:106 +#: templates/extras/dashboard/widget_add.html:26 +#: templates/extras/dashboard/widget_config.html:19 +#: templates/extras/object_journal.html:27 +#: templates/generic/object_edit.html:66 +#: utilities/templates/helpers/applied_filters.html:16 +#: utilities/templates/helpers/table_config_form.html:40 +msgid "Save" +msgstr "" + +#: templates/account/preferences.html:41 +msgid "Table Configurations" +msgstr "" + +#: templates/account/preferences.html:46 +msgid "Clear table preferences" +msgstr "" + +#: templates/account/preferences.html:53 +msgid "Toggle All" +msgstr "" + +#: templates/account/preferences.html:55 +msgid "Table" +msgstr "" + +#: templates/account/preferences.html:56 +msgid "Ordering" +msgstr "" + +#: templates/account/preferences.html:57 +msgid "Columns" +msgstr "" + +#: templates/account/preferences.html:76 templates/dcim/cable_trace.html:113 +#: templates/extras/object_configcontext.html:55 +msgid "None found" +msgstr "" + +#: templates/account/profile.html:6 +msgid "User Profile" +msgstr "" + +#: templates/account/profile.html:12 +msgid "Account Details" +msgstr "" + +#: templates/account/profile.html:30 templates/tenancy/contact.html:44 +#: templates/users/user.html:26 tenancy/forms/bulk_edit.py:108 +msgid "Email" +msgstr "" + +#: templates/account/profile.html:34 templates/users/user.html:30 +msgid "Account Created" +msgstr "" + +#: templates/account/profile.html:38 templates/users/user.html:42 +msgid "Superuser" +msgstr "" + +#: templates/account/profile.html:42 +msgid "Admin Access" +msgstr "" + +#: templates/account/profile.html:51 templates/users/objectpermission.html:86 +#: templates/users/user.html:51 +msgid "Assigned Groups" +msgstr "" + +#: templates/account/profile.html:56 +#: templates/circuits/circuit_terminations_swap.html:18 +#: templates/circuits/circuit_terminations_swap.html:26 +#: templates/circuits/inc/circuit_termination.html:154 +#: templates/dcim/devicebay.html:66 +#: templates/dcim/inc/panels/inventory_items.html:37 +#: templates/dcim/interface.html:302 templates/dcim/modulebay.html:79 +#: templates/extras/configcontext.html:73 +#: templates/extras/htmx/script_result.html:54 +#: templates/extras/object_configcontext.html:28 +#: templates/extras/objectchange.html:128 +#: templates/extras/objectchange.html:145 templates/extras/webhook.html:122 +#: templates/extras/webhook.html:134 templates/extras/webhook.html:146 +#: templates/inc/panel_table.html:12 templates/inc/panels/comments.html:12 +#: templates/ipam/inc/panels/fhrp_groups.html:43 templates/users/group.html:32 +#: templates/users/group.html:42 templates/users/objectpermission.html:81 +#: templates/users/objectpermission.html:91 templates/users/user.html:56 +#: templates/users/user.html:66 +msgid "None" +msgstr "" + +#: templates/account/profile.html:66 templates/users/user.html:76 +msgid "Recent Activity" +msgstr "" + +#: templates/account/token.html:8 templates/account/token_list.html:6 +msgid "My API Tokens" +msgstr "" + +#: templates/account/token.html:11 templates/account/token.html:19 +#: templates/users/token.html:6 templates/users/token.html:14 +#: users/forms/filtersets.py:123 +msgid "Token" +msgstr "" + +#: templates/account/token.html:40 templates/users/token.html:32 +#: users/forms/bulk_edit.py:87 +msgid "Write enabled" +msgstr "" + +#: templates/account/token.html:52 templates/users/token.html:44 +msgid "Last used" +msgstr "" + +#: templates/account/token_list.html:12 +msgid "Add a Token" +msgstr "" + +#: templates/admin/index.html:10 +msgid "System" +msgstr "" + +#: templates/admin/index.html:14 +msgid "Background Tasks" +msgstr "" + +#: templates/admin/index.html:19 +msgid "Installed plugins" +msgstr "" + +#: templates/base/base.html:28 templates/extras/admin/plugins_list.html:8 +#: templates/home.html:24 +msgid "Home" +msgstr "" + +#: templates/base/layout.html:27 templates/base/layout.html:37 +#: templates/login.html:34 +msgid "NetBox logo" +msgstr "" + +#: templates/base/layout.html:76 +msgid "Debug mode is enabled" +msgstr "" + +#: templates/base/layout.html:77 +msgid "" +"Performance may be limited. Debugging should never be enabled on a " +"production system" +msgstr "" + +#: templates/base/layout.html:83 +msgid "Maintenance Mode" +msgstr "" + +#: templates/base/layout.html:134 +msgid "Docs" +msgstr "" + +#: templates/base/layout.html:139 templates/rest_framework/api.html:10 +msgid "REST API" +msgstr "" + +#: templates/base/layout.html:144 +msgid "REST API documentation" +msgstr "" + +#: templates/base/layout.html:150 +msgid "GraphQL API" +msgstr "" + +#: templates/base/layout.html:156 +msgid "Source Code" +msgstr "" + +#: templates/base/layout.html:161 +msgid "Community" +msgstr "" + +#: templates/base/sidenav.html:12 templates/base/sidenav.html:17 +msgid "NetBox Logo" +msgstr "" + +#: templates/circuits/circuit.html:48 +msgid "Install Date" +msgstr "" + +#: templates/circuits/circuit.html:52 +msgid "Termination Date" +msgstr "" + +#: templates/circuits/circuit_terminations_swap.html:4 +msgid "Swap Circuit Terminations" +msgstr "" + +#: templates/circuits/circuit_terminations_swap.html:8 +#, python-format +msgid "Swap these terminations for circuit %(circuit)s?" +msgstr "" + +#: templates/circuits/circuit_terminations_swap.html:14 +msgid "A side" +msgstr "" + +#: templates/circuits/circuit_terminations_swap.html:22 +msgid "Z side" +msgstr "" + +#: templates/circuits/circuittermination_edit.html:9 +#: templates/circuits/inc/circuit_termination.html:81 +#: templates/dcim/frontport.html:128 templates/dcim/interface.html:195 +#: templates/dcim/rearport.html:118 +msgid "Circuit Termination" +msgstr "" + +#: templates/circuits/circuittermination_edit.html:41 +msgid "Termination Details" +msgstr "" + +#: templates/circuits/circuittype.html:10 +msgid "Add Circuit" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:9 +#: templates/dcim/devicetype/component_templates.html:30 +#: templates/dcim/manufacturer.html:11 +#: templates/dcim/moduletype/component_templates.html:30 +#: templates/generic/bulk_add_component.html:8 +#: templates/users/objectpermission.html:41 +#: utilities/templates/buttons/add.html:4 +#: utilities/templates/helpers/table_config_form.html:20 +msgid "Add" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:14 +#: templates/circuits/inc/circuit_termination.html:63 +#: templates/dcim/devicetype/component_templates.html:21 +#: templates/dcim/inc/panels/inventory_items.html:24 +#: templates/dcim/moduletype/component_templates.html:21 +#: templates/dcim/powerpanel.html:61 templates/generic/object_edit.html:29 +#: templates/ipam/inc/ipaddress_edit_header.html:10 +#: templates/ipam/inc/panels/fhrp_groups.html:30 +#: utilities/templates/buttons/edit.html:3 +msgid "Edit" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:17 +msgid "Swap" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:26 +#, python-format +msgid "Termination %(side)s" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:42 +#: templates/dcim/cable.html:70 templates/dcim/cable.html:76 +msgid "Termination" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:46 +#: templates/dcim/consoleport.html:62 templates/dcim/consoleserverport.html:62 +#: templates/dcim/powerfeed.html:122 +msgid "Marked as connected" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:48 +msgid "to" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:58 +#: templates/circuits/inc/circuit_termination.html:59 +#: templates/dcim/frontport.html:87 +#: templates/dcim/inc/connection_endpoints.html:7 +#: templates/dcim/interface.html:156 templates/dcim/rearport.html:83 +msgid "Trace" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:62 +msgid "Edit cable" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:67 +msgid "Remove cable" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:68 +#: templates/dcim/bulk_disconnect.html:5 +#: templates/dcim/device/consoleports.html:12 +#: templates/dcim/device/consoleserverports.html:12 +#: templates/dcim/device/frontports.html:12 +#: templates/dcim/device/interfaces.html:16 +#: templates/dcim/device/poweroutlets.html:12 +#: templates/dcim/device/powerports.html:12 +#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:66 +msgid "Disconnect" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:75 +#: templates/dcim/consoleport.html:71 templates/dcim/consoleserverport.html:71 +#: templates/dcim/frontport.html:109 templates/dcim/interface.html:182 +#: templates/dcim/interface.html:202 templates/dcim/powerfeed.html:136 +#: templates/dcim/poweroutlet.html:75 templates/dcim/poweroutlet.html:76 +#: templates/dcim/powerport.html:77 templates/dcim/rearport.html:105 +msgid "Connect" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:79 +#: templates/dcim/consoleport.html:78 templates/dcim/consoleserverport.html:78 +#: templates/dcim/frontport.html:18 templates/dcim/frontport.html:122 +#: templates/dcim/interface.html:189 templates/dcim/inventoryitem_edit.html:49 +#: templates/dcim/rearport.html:112 +msgid "Front Port" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:97 +msgid "Downstream" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:98 +msgid "Upstream" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:107 +msgid "Cross-Connect" +msgstr "" + +#: templates/circuits/inc/circuit_termination.html:111 +msgid "Patch Panel/Port" +msgstr "" + +#: templates/circuits/provider.html:11 +msgid "Add circuit" +msgstr "" + +#: templates/circuits/provideraccount.html:17 +msgid "Provider Account" +msgstr "" + +#: templates/core/datafile.html:47 +msgid "Last Updated" +msgstr "" + +#: templates/core/datafile.html:51 templates/ipam/iprange.html:28 +msgid "Size" +msgstr "" + +#: templates/core/datafile.html:52 +msgid "bytes" +msgstr "" + +#: templates/core/datafile.html:55 +msgid "SHA256 Hash" +msgstr "" + +#: templates/core/datasource.html:14 templates/core/datasource.html:20 +#: utilities/templates/buttons/sync.html:5 +msgid "Sync" +msgstr "" + +#: templates/core/datasource.html:51 +msgid "Last synced" +msgstr "" + +#: templates/core/datasource.html:86 +msgid "Backend" +msgstr "" + +#: templates/core/datasource.html:102 +msgid "No parameters defined" +msgstr "" + +#: templates/core/datasource.html:118 +msgid "Files" +msgstr "" + +#: templates/core/job.html:21 +msgid "Job" +msgstr "" + +#: templates/core/job.html:39 templates/extras/journalentry.html:29 +msgid "Created By" +msgstr "" + +#: templates/core/job.html:48 +msgid "Scheduling" +msgstr "" + +#: templates/core/job.html:60 +#, python-format +msgid "every %(interval)s seconds" +msgstr "" + +#: templates/dcim/bulk_disconnect.html:9 +#, python-format +msgid "" +"Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" +msgstr "" + +#: templates/dcim/cable_edit.html:12 +msgid "A Side" +msgstr "" + +#: templates/dcim/cable_edit.html:29 +msgid "B Side" +msgstr "" + +#: templates/dcim/cable_trace.html:6 +#, python-format +msgid "Cable Trace for %(object_type)s %(object)s" +msgstr "" + +#: templates/dcim/cable_trace.html:21 templates/dcim/inc/rack_elevation.html:7 +msgid "Download SVG" +msgstr "" + +#: templates/dcim/cable_trace.html:27 +msgid "Asymmetric Path" +msgstr "" + +#: templates/dcim/cable_trace.html:28 +msgid "The nodes below have no links and result in an asymmetric path" +msgstr "" + +#: templates/dcim/cable_trace.html:35 +msgid "Path split" +msgstr "" + +#: templates/dcim/cable_trace.html:36 +msgid "Select a node below to continue" +msgstr "" + +#: templates/dcim/cable_trace.html:52 +msgid "Trace Completed" +msgstr "" + +#: templates/dcim/cable_trace.html:55 +msgid "Total segments" +msgstr "" + +#: templates/dcim/cable_trace.html:59 +msgid "Total length" +msgstr "" + +#: templates/dcim/cable_trace.html:74 +msgid "No paths found" +msgstr "" + +#: templates/dcim/cable_trace.html:83 +msgid "Related Paths" +msgstr "" + +#: templates/dcim/cable_trace.html:89 +msgid "Origin" +msgstr "" + +#: templates/dcim/cable_trace.html:90 +msgid "Destination" +msgstr "" + +#: templates/dcim/cable_trace.html:91 +msgid "Segments" +msgstr "" + +#: templates/dcim/cable_trace.html:104 +msgid "Incomplete" +msgstr "" + +#: templates/dcim/component_list.html:14 +msgid "Rename Selected" +msgstr "" + +#: templates/dcim/consoleport.html:67 templates/dcim/consoleserverport.html:67 +#: templates/dcim/frontport.html:105 templates/dcim/interface.html:178 +#: templates/dcim/poweroutlet.html:73 templates/dcim/powerport.html:73 +msgid "Not Connected" +msgstr "" + +#: templates/dcim/consoleport.html:75 templates/dcim/consoleserverport.html:18 +#: templates/dcim/frontport.html:116 templates/dcim/inventoryitem_edit.html:44 +msgid "Console Server Port" +msgstr "" + +#: templates/dcim/device.html:52 +msgid "Highlight device" +msgstr "" + +#: templates/dcim/device.html:74 +msgid "Not racked" +msgstr "" + +#: templates/dcim/device.html:81 templates/dcim/site.html:109 +msgid "GPS Coordinates" +msgstr "" + +#: templates/dcim/device.html:87 templates/dcim/site.html:115 +msgid "Map It" +msgstr "" + +#: templates/dcim/device.html:127 templates/dcim/inventoryitem.html:57 +#: templates/dcim/module.html:79 templates/dcim/modulebay.html:73 +#: templates/dcim/rack.html:69 +msgid "Asset Tag" +msgstr "" + +#: templates/dcim/device.html:170 +msgid "View Virtual Chassis" +msgstr "" + +#: templates/dcim/device.html:187 +msgid "Create VDC" +msgstr "" + +#: templates/dcim/device.html:196 templates/dcim/device_edit.html:64 +#: virtualization/forms/model_forms.py:224 +msgid "Management" +msgstr "" + +#: templates/dcim/device.html:217 templates/dcim/device.html:233 +#: templates/virtualization/virtualmachine.html:56 +#: templates/virtualization/virtualmachine.html:72 +msgid "NAT for" +msgstr "" + +#: templates/dcim/device.html:219 templates/dcim/device.html:235 +#: templates/virtualization/virtualmachine.html:58 +#: templates/virtualization/virtualmachine.html:74 +msgid "NAT" +msgstr "" + +#: templates/dcim/device.html:271 templates/dcim/rack.html:77 +msgid "Power Utilization" +msgstr "" + +#: templates/dcim/device.html:276 +msgid "Input" +msgstr "" + +#: templates/dcim/device.html:277 +msgid "Outlets" +msgstr "" + +#: templates/dcim/device.html:278 +msgid "Allocated" +msgstr "" + +#: templates/dcim/device.html:287 templates/dcim/device.html:289 +#: templates/dcim/device.html:305 templates/dcim/powerfeed.html:70 +msgid "VA" +msgstr "" + +#: templates/dcim/device.html:299 +msgctxt "Leg of a power feed" +msgid "Leg" +msgstr "" + +#: templates/dcim/device.html:329 +#: templates/virtualization/virtualmachine.html:163 +msgid "Add a service" +msgstr "" + +#: templates/dcim/device.html:336 templates/dcim/rack.html:84 +#: templates/dcim/rack_edit.html:38 +msgid "Dimensions" +msgstr "" + +#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 +#: templates/dcim/devicetype/base.html:18 templates/dcim/module.html:18 +#: templates/dcim/moduletype/base.html:18 +#: templates/virtualization/virtualmachine_list.html:8 +msgid "Add Components" +msgstr "" + +#: templates/dcim/device/consoleports.html:24 +msgid "Add Console Ports" +msgstr "" + +#: templates/dcim/device/consoleserverports.html:24 +msgid "Add Console Server Ports" +msgstr "" + +#: templates/dcim/device/devicebays.html:10 +msgid "Add Device Bays" +msgstr "" + +#: templates/dcim/device/frontports.html:24 +msgid "Add Front Ports" +msgstr "" + +#: templates/dcim/device/inc/interface_table_controls.html:9 +msgid "Hide Enabled" +msgstr "" + +#: templates/dcim/device/inc/interface_table_controls.html:10 +msgid "Hide Disabled" +msgstr "" + +#: templates/dcim/device/inc/interface_table_controls.html:11 +msgid "Hide Virtual" +msgstr "" + +#: templates/dcim/device/inc/interface_table_controls.html:12 +msgid "Hide Disconnected" +msgstr "" + +#: templates/dcim/device/interfaces.html:28 +#: templates/virtualization/virtualmachine/base.html:21 +msgid "Add Interfaces" +msgstr "" + +#: templates/dcim/device/inventory.html:10 +#: templates/dcim/inc/panels/inventory_items.html:46 +msgid "Add Inventory Item" +msgstr "" + +#: templates/dcim/device/modulebays.html:10 +msgid "Add Module Bays" +msgstr "" + +#: templates/dcim/device/poweroutlets.html:24 +msgid "Add Power Outlets" +msgstr "" + +#: templates/dcim/device/powerports.html:24 +msgid "Add Power Port" +msgstr "" + +#: templates/dcim/device/rearports.html:24 +msgid "Add Rear Ports" +msgstr "" + +#: templates/dcim/device/render_config.html:5 +#: templates/virtualization/virtualmachine/render_config.html:5 +msgid "Config" +msgstr "" + +#: templates/dcim/device/render_config.html:37 +#: templates/virtualization/virtualmachine/render_config.html:37 +msgid "Context Data" +msgstr "" + +#: templates/dcim/device/render_config.html:57 +#: templates/virtualization/virtualmachine/render_config.html:57 +msgid "Download" +msgstr "" + +#: templates/dcim/device/render_config.html:60 +#: templates/virtualization/virtualmachine/render_config.html:60 +msgid "Rendered Config" +msgstr "" + +#: templates/dcim/device/render_config.html:65 +#: templates/virtualization/virtualmachine/render_config.html:65 +msgid "No configuration template found" +msgstr "" + +#: templates/dcim/device_edit.html:44 +msgid "Parent Bay" +msgstr "" + +#: templates/dcim/device_edit.html:48 +#: utilities/templates/form_helpers/render_field.html:20 +msgid "Regenerate Slug" +msgstr "" + +#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:7 +#: utilities/templates/helpers/table_config_form.html:23 +msgid "Remove" +msgstr "" + +#: templates/dcim/device_edit.html:110 +msgid "Local Config Context Data" +msgstr "" + +#: templates/dcim/device_list.html:82 +#: templates/dcim/devicetype/component_templates.html:18 +#: templates/dcim/moduletype/component_templates.html:18 +#: templates/generic/bulk_rename.html:34 +#: templates/virtualization/virtualmachine/interfaces.html:11 +msgid "Rename" +msgstr "" + +#: templates/dcim/devicebay.html:18 +msgid "Device Bay" +msgstr "" + +#: templates/dcim/devicebay.html:48 +msgid "Installed Device" +msgstr "" + +#: templates/dcim/devicebay_delete.html:6 +#, python-format +msgid "Delete device bay %(devicebay)s?" +msgstr "" + +#: templates/dcim/devicebay_delete.html:11 +#, python-format +msgid "" +"Are you sure you want to delete this device bay from %(device)s?" +msgstr "" + +#: templates/dcim/devicebay_depopulate.html:6 +#, python-format +msgid "Remove %(device)s from %(device_bay)s?" +msgstr "" + +#: templates/dcim/devicebay_depopulate.html:13 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from " +"%(device_bay)s?" +msgstr "" + +#: templates/dcim/devicebay_populate.html:13 +msgid "Populate" +msgstr "" + +#: templates/dcim/devicebay_populate.html:22 +msgid "Bay" +msgstr "" + +#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +msgid "Add Device" +msgstr "" + +#: templates/dcim/devicerole.html:43 +msgid "VM Role" +msgstr "" + +#: templates/dcim/devicetype.html:21 templates/dcim/moduletype.html:19 +msgid "Model Name" +msgstr "" + +#: templates/dcim/devicetype.html:28 templates/dcim/moduletype.html:23 +msgid "Part Number" +msgstr "" + +#: templates/dcim/devicetype.html:40 +msgid "Height (U" +msgstr "" + +#: templates/dcim/devicetype.html:44 +msgid "Exclude From Utilization" +msgstr "" + +#: templates/dcim/devicetype.html:62 +msgid "Parent/Child" +msgstr "" + +#: templates/dcim/devicetype.html:74 +msgid "Front Image" +msgstr "" + +#: templates/dcim/devicetype.html:86 +msgid "Rear Image" +msgstr "" + +#: templates/dcim/frontport.html:57 +msgid "Rear Port Position" +msgstr "" + +#: templates/dcim/frontport.html:79 templates/dcim/interface.html:146 +#: templates/dcim/poweroutlet.html:67 templates/dcim/powerport.html:67 +#: templates/dcim/rearport.html:75 +msgid "Marked as Connected" +msgstr "" + +#: templates/dcim/frontport.html:93 templates/dcim/rearport.html:89 +msgid "Connection Status" +msgstr "" + +#: templates/dcim/inc/cable_termination.html:65 +msgid "No termination" +msgstr "" + +#: templates/dcim/inc/cable_toggle_buttons.html:4 +msgid "Mark Planned" +msgstr "" + +#: templates/dcim/inc/cable_toggle_buttons.html:8 +msgid "Mark Installed" +msgstr "" + +#: templates/dcim/inc/connection_endpoints.html:13 +msgid "Path Status" +msgstr "" + +#: templates/dcim/inc/connection_endpoints.html:18 +msgid "Not Reachable" +msgstr "" + +#: templates/dcim/inc/connection_endpoints.html:23 +msgid "Path Endpoints" +msgstr "" + +#: templates/dcim/inc/endpoint_connection.html:8 +#: templates/dcim/powerfeed.html:128 templates/dcim/rearport.html:101 +msgid "Not connected" +msgstr "" + +#: templates/dcim/inc/interface_vlans_table.html:6 +msgid "Untagged" +msgstr "" + +#: templates/dcim/inc/interface_vlans_table.html:37 +msgid "No VLANs Assigned" +msgstr "" + +#: templates/dcim/inc/interface_vlans_table.html:44 +#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +msgid "Clear" +msgstr "" + +#: templates/dcim/inc/interface_vlans_table.html:47 +msgid "Clear All" +msgstr "" + +#: templates/dcim/interface.html:17 +msgid "Add Child Interface" +msgstr "" + +#: templates/dcim/interface.html:51 +msgid "Speed/Duplex" +msgstr "" + +#: templates/dcim/interface.html:74 +msgid "PoE Mode" +msgstr "" + +#: templates/dcim/interface.html:78 +msgid "PoE Type" +msgstr "" + +#: templates/dcim/interface.html:82 +#: templates/virtualization/vminterface.html:66 +msgid "802.1Q Mode" +msgstr "" + +#: templates/dcim/interface.html:126 +#: templates/virtualization/vminterface.html:62 +msgid "MAC Address" +msgstr "" + +#: templates/dcim/interface.html:153 +msgid "Wireless Link" +msgstr "" + +#: templates/dcim/interface.html:222 +msgid "Peer" +msgstr "" + +#: templates/dcim/interface.html:234 +#: templates/wireless/inc/wirelesslink_interface.html:26 +msgid "Channel" +msgstr "" + +#: templates/dcim/interface.html:243 +#: templates/wireless/inc/wirelesslink_interface.html:32 +msgid "Channel Frequency" +msgstr "" + +#: templates/dcim/interface.html:246 templates/dcim/interface.html:254 +#: templates/dcim/interface.html:265 templates/dcim/interface.html:273 +msgid "MHz" +msgstr "" + +#: templates/dcim/interface.html:262 +#: templates/wireless/inc/wirelesslink_interface.html:42 +msgid "Channel Width" +msgstr "" + +#: templates/dcim/interface.html:291 templates/wireless/wirelesslan.html:15 +#: templates/wireless/wirelesslink.html:24 wireless/forms/bulk_edit.py:59 +#: wireless/forms/bulk_edit.py:101 wireless/forms/filtersets.py:39 +#: wireless/forms/filtersets.py:79 wireless/models.py:81 wireless/models.py:155 +#: wireless/tables/wirelesslan.py:44 +msgid "SSID" +msgstr "" + +#: templates/dcim/interface.html:312 +msgid "LAG Members" +msgstr "" + +#: templates/dcim/interface.html:331 +msgid "No member interfaces" +msgstr "" + +#: templates/dcim/interface.html:355 templates/ipam/fhrpgroup.html:80 +#: templates/ipam/iprange/ip_addresses.html:7 +#: templates/ipam/prefix/ip_addresses.html:7 +#: templates/virtualization/vminterface.html:92 +msgid "Add IP Address" +msgstr "" + +#: templates/dcim/inventoryitem.html:25 +msgid "Parent Item" +msgstr "" + +#: templates/dcim/inventoryitem.html:49 +msgid "Part ID" +msgstr "" + +#: templates/dcim/inventoryitem_bulk_delete.html:5 +msgid "This will also delete all child inventory items of those listed" +msgstr "" + +#: templates/dcim/inventoryitem_edit.html:33 +msgid "Component Assignment" +msgstr "" + +#: templates/dcim/inventoryitem_edit.html:59 templates/dcim/poweroutlet.html:18 +#: templates/dcim/powerport.html:81 +msgid "Power Outlet" +msgstr "" + +#: templates/dcim/location.html:17 +msgid "Add Child Location" +msgstr "" + +#: templates/dcim/location.html:76 +msgid "Child Locations" +msgstr "" + +#: templates/dcim/location.html:84 templates/dcim/site.html:150 +msgid "Add a Location" +msgstr "" + +#: templates/dcim/location.html:98 templates/dcim/site.html:164 +msgid "Add a Device" +msgstr "" + +#: templates/dcim/manufacturer.html:16 +msgid "Add Device Type" +msgstr "" + +#: templates/dcim/manufacturer.html:21 +msgid "Add Module Type" +msgstr "" + +#: templates/dcim/powerfeed.html:56 +msgid "Connected Device" +msgstr "" + +#: templates/dcim/powerfeed.html:66 +msgid "Utilization (Allocated" +msgstr "" + +#: templates/dcim/powerfeed.html:85 +msgid "Electrical Characteristics" +msgstr "" + +#: templates/dcim/powerfeed.html:95 +msgctxt "Abbreviation for volts" +msgid "V" +msgstr "" + +#: templates/dcim/powerfeed.html:99 +msgctxt "Abbreviation for amperes" +msgid "A" +msgstr "" + +#: templates/dcim/poweroutlet.html:51 +msgid "Feed Leg" +msgstr "" + +#: templates/dcim/powerpanel.html:77 +msgid "Add Power Feeds" +msgstr "" + +#: templates/dcim/powerport.html:47 +msgid "Maximum Draw" +msgstr "" + +#: templates/dcim/powerport.html:51 +msgid "Allocated Draw" +msgstr "" + +#: templates/dcim/rack.html:73 +msgid "Space Utilization" +msgstr "" + +#: templates/dcim/rack.html:103 +msgid "descending" +msgstr "" + +#: templates/dcim/rack.html:103 +msgid "ascending" +msgstr "" + +#: templates/dcim/rack.html:106 +msgid "Starting Unit" +msgstr "" + +#: templates/dcim/rack.html:132 +msgid "Mounting Depth" +msgstr "" + +#: templates/dcim/rack.html:142 +msgid "Rack Weight" +msgstr "" + +#: templates/dcim/rack.html:152 templates/dcim/rack_edit.html:67 +msgid "Maximum Weight" +msgstr "" + +#: templates/dcim/rack.html:162 +msgid "Total Weight" +msgstr "" + +#: templates/dcim/rack.html:180 templates/dcim/rack_elevation_list.html:16 +msgid "Images and Labels" +msgstr "" + +#: templates/dcim/rack.html:181 templates/dcim/rack_elevation_list.html:17 +msgid "Images only" +msgstr "" + +#: templates/dcim/rack.html:182 templates/dcim/rack_elevation_list.html:18 +msgid "Labels only" +msgstr "" + +#: templates/dcim/rack/reservations.html:9 +msgid "Add reservation" +msgstr "" + +#: templates/dcim/rack_edit.html:21 +msgid "Inventory Control" +msgstr "" + +#: templates/dcim/rack_edit.html:45 +msgid "Outer Dimensions" +msgstr "" + +#: templates/dcim/rack_edit.html:56 templates/dcim/rack_edit.html:71 +msgid "Unit" +msgstr "" + +#: templates/dcim/rack_elevation_list.html:12 +msgid "View List" +msgstr "" + +#: templates/dcim/rack_elevation_list.html:27 +msgid "Sort By" +msgstr "" + +#: templates/dcim/rack_elevation_list.html:77 +msgid "No Racks Found" +msgstr "" + +#: templates/dcim/rack_list.html:8 +msgid "View Elevations" +msgstr "" + +#: templates/dcim/rackreservation.html:47 +msgid "Reservation Details" +msgstr "" + +#: templates/dcim/rackrole.html:10 +msgid "Add Rack" +msgstr "" + +#: templates/dcim/rearport.html:53 +msgid "Positions" +msgstr "" + +#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +msgid "Add Site" +msgstr "" + +#: templates/dcim/region.html:56 +msgid "Child Regions" +msgstr "" + +#: templates/dcim/region.html:64 +msgid "Add Region" +msgstr "" + +#: templates/dcim/site.html:69 +msgid "Facility" +msgstr "" + +#: templates/dcim/site.html:77 +msgid "Time Zone" +msgstr "" + +#: templates/dcim/site.html:80 +msgid "UTC" +msgstr "" + +#: templates/dcim/site.html:81 +msgid "Site time" +msgstr "" + +#: templates/dcim/site.html:88 +msgid "Physical Address" +msgstr "" + +#: templates/dcim/site.html:94 +msgid "Map" +msgstr "" + +#: templates/dcim/site.html:105 +msgid "Shipping Address" +msgstr "" + +#: templates/dcim/sitegroup.html:56 templates/tenancy/contactgroup.html:49 +#: templates/tenancy/tenantgroup.html:58 +#: templates/wireless/wirelesslangroup.html:56 +msgid "Child Groups" +msgstr "" + +#: templates/dcim/sitegroup.html:64 +msgid "Add Site Group" +msgstr "" + +#: templates/dcim/trace/attachment.html:5 +#: templates/extras/exporttemplate.html:37 +msgid "Attachment" +msgstr "" + +#: templates/dcim/virtualchassis.html:86 +msgid "Add Member" +msgstr "" + +#: templates/dcim/virtualchassis_add.html:18 +msgid "Member Devices" +msgstr "" + +#: templates/dcim/virtualchassis_add_member.html:6 +#, python-format +msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" +msgstr "" + +#: templates/dcim/virtualchassis_add_member.html:17 +msgid "Add New Member" +msgstr "" + +#: templates/dcim/virtualchassis_add_member.html:25 +msgid "Add Another" +msgstr "" + +#: templates/dcim/virtualchassis_edit.html:7 +#, python-format +msgid "Editing Virtual Chassis %(name)s" +msgstr "" + +#: templates/dcim/virtualchassis_edit.html:54 +msgid "Rack/Unit" +msgstr "" + +#: templates/dcim/virtualchassis_remove_member.html:5 +msgid "Remove Virtual Chassis Member" +msgstr "" + +#: templates/dcim/virtualchassis_remove_member.html:9 +#, python-format +msgid "" +"Are you sure you want to remove %(device)s from virtual " +"chassis %(name)s?" +msgstr "" + +#: templates/dcim/virtualdevicecontext.html:29 templates/ipam/l2vpn.html:19 +msgid "Identifier" +msgstr "" + +#: templates/exceptions/import_error.html:6 +msgid "" +"A module import error occurred during this request. Common causes include " +"the following:" +msgstr "" + +#: templates/exceptions/import_error.html:10 +msgid "Missing required packages" +msgstr "" + +#: templates/exceptions/import_error.html:11 +msgid "" +"This installation of NetBox might be missing one or more required Python " +"packages. These packages are listed in requirements.txt and " +"local_requirements.txt, and are normally installed as part of " +"the installation or upgrade process. To verify installed packages, run " +"pip freeze from the console and compare the output to the list " +"of required packages." +msgstr "" + +#: templates/exceptions/import_error.html:20 +msgid "WSGI service not restarted after upgrade" +msgstr "" + +#: templates/exceptions/import_error.html:21 +msgid "" +"If this installation has recently been upgraded, check that the WSGI service " +"(e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code " +"is running." +msgstr "" + +#: templates/exceptions/permission_error.html:6 +msgid "" +"A file permission error was detected while processing this request. Common " +"causes include the following:" +msgstr "" + +#: templates/exceptions/permission_error.html:10 +msgid "Insufficient write permission to the media root" +msgstr "" + +#: templates/exceptions/permission_error.html:11 +#, python-format +msgid "" +"The configured media root is %(media_root)s. Ensure that the " +"user NetBox runs as has access to write files to all locations within this " +"path." +msgstr "" + +#: templates/exceptions/programming_error.html:6 +msgid "" +"A database programming error was detected while processing this request. " +"Common causes include the following:" +msgstr "" + +#: templates/exceptions/programming_error.html:10 +msgid "Database migrations missing" +msgstr "" + +#: templates/exceptions/programming_error.html:11 +msgid "" +"When upgrading to a new NetBox release, the upgrade script must be run to " +"apply any new database migrations. You can run migrations manually by " +"executing python3 manage.py migrate from the command line." +msgstr "" + +#: templates/exceptions/programming_error.html:18 +msgid "Unsupported PostgreSQL version" +msgstr "" + +#: templates/exceptions/programming_error.html:19 +msgid "" +"Ensure that PostgreSQL version 12 or later is in use. You can check this by " +"connecting to the database using NetBox's credentials and issuing a query " +"for SELECT VERSION()." +msgstr "" + +#: templates/extras/admin/plugins_list.html:4 +#: templates/extras/admin/plugins_list.html:9 +#: templates/extras/admin/plugins_list.html:13 +msgid "Installed Plugins" +msgstr "" + +#: templates/extras/admin/plugins_list.html:23 +msgid "Package Name" +msgstr "" + +#: templates/extras/admin/plugins_list.html:24 +msgid "Author" +msgstr "" + +#: templates/extras/admin/plugins_list.html:25 +msgid "Author Email" +msgstr "" + +#: templates/extras/admin/plugins_list.html:27 +msgid "Version" +msgstr "" + +#: templates/extras/configcontext.html:46 +#: templates/extras/configtemplate.html:38 +#: templates/extras/exporttemplate.html:57 +msgid "The data file associated with this object has been deleted" +msgstr "" + +#: templates/extras/configcontext.html:55 +#: templates/extras/configtemplate.html:47 +#: templates/extras/exporttemplate.html:66 +msgid "Data Synced" +msgstr "" + +#: templates/extras/configcontext_list.html:7 +#: templates/extras/configtemplate_list.html:7 +#: templates/extras/exporttemplate_list.html:7 +msgid "Sync Data" +msgstr "" + +#: templates/extras/configrevision.html:47 +msgid "Default unit height" +msgstr "" + +#: templates/extras/configrevision.html:51 +msgid "Default unit width" +msgstr "" + +#: templates/extras/configrevision.html:63 +msgid "Default voltage" +msgstr "" + +#: templates/extras/configrevision.html:67 +msgid "Default amperage" +msgstr "" + +#: templates/extras/configrevision.html:71 +msgid "Default max utilization" +msgstr "" + +#: templates/extras/configrevision.html:83 +msgid "Enforce global unique" +msgstr "" + +#: templates/extras/configrevision.html:135 +msgid "Paginate count" +msgstr "" + +#: templates/extras/configrevision.html:139 +msgid "Max page size" +msgstr "" + +#: templates/extras/configrevision.html:163 +msgid "Default user preferences" +msgstr "" + +#: templates/extras/configrevision.html:187 +msgid "Job retention" +msgstr "" + +#: templates/extras/configrevision.html:199 +msgid "Comment" +msgstr "" + +#: templates/extras/configrevision_restore.html:8 +#: templates/extras/configrevision_restore.html:43 +#: templates/extras/configrevision_restore.html:79 +msgid "Restore" +msgstr "" + +#: templates/extras/configrevision_restore.html:21 +msgid "Config revisions" +msgstr "" + +#: templates/extras/configrevision_restore.html:54 +msgid "Parameter" +msgstr "" + +#: templates/extras/configrevision_restore.html:55 +msgid "Current Value" +msgstr "" + +#: templates/extras/configrevision_restore.html:56 +msgid "New Value" +msgstr "" + +#: templates/extras/configrevision_restore.html:66 +msgid "Changed" +msgstr "" + +#: templates/extras/configtemplate.html:58 +msgid "Environment Parameters" +msgstr "" + +#: templates/extras/configtemplate.html:69 +#: templates/extras/exporttemplate.html:88 +msgid "Template" +msgstr "" + +#: templates/extras/customfield.html:31 templates/extras/customlink.html:22 +msgid "Group Name" +msgstr "" + +#: templates/extras/customfield.html:43 +msgid "Cloneable" +msgstr "" + +#: templates/extras/customfield.html:53 +msgid "Default Value" +msgstr "" + +#: templates/extras/customfield.html:64 +msgid "Search Weight" +msgstr "" + +#: templates/extras/customfield.html:74 +msgid "Filter Logic" +msgstr "" + +#: templates/extras/customfield.html:78 +msgid "Display Weight" +msgstr "" + +#: templates/extras/customfield.html:104 +msgid "Validation Rules" +msgstr "" + +#: templates/extras/customfield.html:108 +msgid "Minimum Value" +msgstr "" + +#: templates/extras/customfield.html:112 +msgid "Maximum Value" +msgstr "" + +#: templates/extras/customfield.html:116 +msgid "Regular Expression" +msgstr "" + +#: templates/extras/customlink.html:30 +msgid "Button Class" +msgstr "" + +#: templates/extras/customlink.html:41 templates/extras/exporttemplate.html:73 +#: templates/extras/savedfilter.html:41 templates/extras/webhook.html:102 +msgid "Assigned Models" +msgstr "" + +#: templates/extras/customlink.html:57 +msgid "Link Text" +msgstr "" + +#: templates/extras/customlink.html:65 +msgid "Link URL" +msgstr "" + +#: templates/extras/dashboard/reset.html:4 templates/home.html:63 +msgid "Reset Dashboard" +msgstr "" + +#: templates/extras/dashboard/reset.html:8 +msgid "" +"This will remove all configured widgets and restore the " +"default dashboard configuration." +msgstr "" + +#: templates/extras/dashboard/reset.html:13 +msgid "" +"This change affects only your dashboard, and will not impact other " +"users." +msgstr "" + +#: templates/extras/dashboard/widget_add.html:7 +msgid "Add a Widget" +msgstr "" + +#: templates/extras/dashboard/widgets/bookmarks.html:14 +msgid "No bookmarks have been added yet." +msgstr "" + +#: templates/extras/dashboard/widgets/objectcounts.html:15 +msgid "No permission" +msgstr "" + +#: templates/extras/dashboard/widgets/objectlist.html:6 +msgid "No permission to view this content" +msgstr "" + +#: templates/extras/dashboard/widgets/objectlist.html:10 +msgid "Unable to load content. Invalid view name" +msgstr "" + +#: templates/extras/dashboard/widgets/rssfeed.html:12 +msgid "No content found" +msgstr "" + +#: templates/extras/dashboard/widgets/rssfeed.html:18 +msgid "There was a problem fetching the RSS feed" +msgstr "" + +#: templates/extras/dashboard/widgets/rssfeed.html:21 +msgid "HTTP" +msgstr "" + +#: templates/extras/exporttemplate.html:29 +msgid "MIME Type" +msgstr "" + +#: templates/extras/exporttemplate.html:33 +msgid "File Extension" +msgstr "" + +#: templates/extras/htmx/report_result.html:9 +#: templates/extras/htmx/script_result.html:10 +msgid "Scheduled for" +msgstr "" + +#: templates/extras/htmx/report_result.html:14 +#: templates/extras/htmx/script_result.html:15 +msgid "Duration" +msgstr "" + +#: templates/extras/htmx/report_result.html:20 +msgid "Report Methods" +msgstr "" + +#: templates/extras/htmx/report_result.html:38 +msgid "Report Results" +msgstr "" + +#: templates/extras/htmx/report_result.html:44 +#: templates/extras/htmx/script_result.html:26 +msgid "Level" +msgstr "" + +#: templates/extras/htmx/report_result.html:46 +#: templates/extras/htmx/script_result.html:27 +msgid "Message" +msgstr "" + +#: templates/extras/htmx/script_result.html:21 +msgid "Script Log" +msgstr "" + +#: templates/extras/htmx/script_result.html:25 +msgid "Line" +msgstr "" + +#: templates/extras/htmx/script_result.html:38 +msgid "No log output" +msgstr "" + +#: templates/extras/htmx/script_result.html:46 +msgid "Exec Time" +msgstr "" + +#: templates/extras/htmx/script_result.html:46 +msgctxt "Unit of time" +msgid "seconds" +msgstr "" + +#: templates/extras/htmx/script_result.html:50 +msgid "Output" +msgstr "" + +#: templates/extras/inc/result_pending.html:4 +msgid "Loading" +msgstr "" + +#: templates/extras/inc/result_pending.html:6 +msgid "Results pending" +msgstr "" + +#: templates/extras/journalentry.html:16 +msgid "Journal Entry" +msgstr "" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Change log retention" +msgstr "" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "days" +msgstr "" + +#: templates/extras/object_changelog.html:15 +#: templates/extras/objectchange_list.html:9 +msgid "Indefinite" +msgstr "" + +#: templates/extras/object_configcontext.html:11 +msgid "Rendered Context" +msgstr "" + +#: templates/extras/object_configcontext.html:22 +msgid "Local Context" +msgstr "" + +#: templates/extras/object_configcontext.html:34 +msgid "The local config context overwrites all source contexts" +msgstr "" + +#: templates/extras/object_configcontext.html:40 +msgid "Source Contexts" +msgstr "" + +#: templates/extras/object_journal.html:18 +msgid "New Journal Entry" +msgstr "" + +#: templates/extras/objectchange.html:29 +#: templates/users/objectpermission.html:45 +msgid "Change" +msgstr "" + +#: templates/extras/objectchange.html:84 +msgid "Difference" +msgstr "" + +#: templates/extras/objectchange.html:87 +msgid "Previous" +msgstr "" + +#: templates/extras/objectchange.html:90 +msgid "Next" +msgstr "" + +#: templates/extras/objectchange.html:98 +msgid "Object Created" +msgstr "" + +#: templates/extras/objectchange.html:100 +msgid "Object Deleted" +msgstr "" + +#: templates/extras/objectchange.html:102 +msgid "No Changes" +msgstr "" + +#: templates/extras/objectchange.html:117 +msgid "Pre-Change Data" +msgstr "" + +#: templates/extras/objectchange.html:126 +msgid "Warning: Comparing non-atomic change to previous change record" +msgstr "" + +#: templates/extras/objectchange.html:136 +msgid "Post-Change Data" +msgstr "" + +#: templates/extras/objectchange.html:157 +#, python-format +msgid "See All %(count)s Changes" +msgstr "" + +#: templates/extras/report.html:14 +msgid "This report is invalid and cannot be run." +msgstr "" + +#: templates/extras/report.html:23 templates/extras/report_list.html:88 +msgid "Run Again" +msgstr "" + +#: templates/extras/report.html:25 templates/extras/report_list.html:90 +msgid "Run Report" +msgstr "" + +#: templates/extras/report.html:36 +msgid "Last run" +msgstr "" + +#: templates/extras/report/base.html:30 +msgid "Report" +msgstr "" + +#: templates/extras/report_list.html:48 templates/extras/script_list.html:54 +msgid "Last Run" +msgstr "" + +#: templates/extras/report_list.html:70 templates/extras/script_list.html:77 +msgid "Never" +msgstr "" + +#: templates/extras/report_list.html:75 +msgid "Report has no test methods" +msgstr "" + +#: templates/extras/report_list.html:76 +msgid "Invalid" +msgstr "" + +#: templates/extras/report_list.html:125 +msgid "No Reports Found" +msgstr "" + +#: templates/extras/report_list.html:128 +#, python-format +msgid "" +"Get started by creating a report from " +"an uploaded file or data source." +msgstr "" + +#: templates/extras/script.html:13 +msgid "You do not have permission to run scripts" +msgstr "" + +#: templates/extras/script.html:37 +msgid "Run Script" +msgstr "" + +#: templates/extras/script/base.html:29 +msgid "Script" +msgstr "" + +#: templates/extras/script_list.html:44 +#, python-format +msgid "" +"Script file at %(file_path)s could not be loaded." +msgstr "" + +#: templates/extras/script_list.html:91 +msgid "No Scripts Found" +msgstr "" + +#: templates/extras/script_list.html:94 +#, python-format +msgid "" +"Get started by creating a script from " +"an uploaded file or data source." +msgstr "" + +#: templates/extras/script_result.html:42 +msgid "Log" +msgstr "" + +#: templates/extras/tag.html:35 +msgid "Tagged Items" +msgstr "" + +#: templates/extras/tag.html:47 +msgid "Allowed Object Types" +msgstr "" + +#: templates/extras/tag.html:56 +msgid "Any" +msgstr "" + +#: templates/extras/tag.html:63 +msgid "Tagged Item Types" +msgstr "" + +#: templates/extras/tag.html:89 +msgid "Tagged Objects" +msgstr "" + +#: templates/extras/webhook.html:45 +msgid "Job start" +msgstr "" + +#: templates/extras/webhook.html:49 +msgid "Job end" +msgstr "" + +#: templates/extras/webhook.html:62 +msgid "HTTP Method" +msgstr "" + +#: templates/extras/webhook.html:70 +msgid "HTTP Content Type" +msgstr "" + +#: templates/extras/webhook.html:87 +msgid "SSL Verification" +msgstr "" + +#: templates/extras/webhook.html:128 +msgid "Additional Headers" +msgstr "" + +#: templates/extras/webhook.html:140 +msgid "Body Template" +msgstr "" + +#: templates/generic/bulk_add_component.html:15 +msgid "Bulk Creation" +msgstr "" + +#: templates/generic/bulk_add_component.html:20 +#: templates/generic/bulk_edit.html:28 +msgid "Selected Objects" +msgstr "" + +#: templates/generic/bulk_add_component.html:46 +msgid "to Add" +msgstr "" + +#: templates/generic/bulk_delete.html:24 +msgid "Confirm Bulk Deletion" +msgstr "" + +#: templates/generic/bulk_delete.html:26 +msgctxt "Noun" +msgid "Warning" +msgstr "" + +#: templates/generic/bulk_delete.html:27 +#, python-format +msgid "" +"The following operation will delete %(count)s " +"%(type_plural)s. Please carefully review the objects to be deleted and " +"confirm below." +msgstr "" + +#: templates/generic/bulk_edit.html:16 templates/generic/object_edit.html:17 +msgid "Editing" +msgstr "" + +#: templates/generic/bulk_edit.html:23 +msgid "Bulk Edit" +msgstr "" + +#: templates/generic/bulk_edit.html:124 templates/generic/bulk_rename.html:42 +msgid "Apply" +msgstr "" + +#: templates/generic/bulk_import.html:14 +msgid "Bulk Import" +msgstr "" + +#: templates/generic/bulk_import.html:20 +msgid "Direct Import" +msgstr "" + +#: templates/generic/bulk_import.html:25 +msgid "Upload File" +msgstr "" + +#: templates/generic/bulk_import.html:51 templates/generic/bulk_import.html:73 +#: templates/generic/bulk_import.html:95 +msgid "Submit" +msgstr "" + +#: templates/generic/bulk_import.html:110 +msgid "Field Options" +msgstr "" + +#: templates/generic/bulk_import.html:117 +msgid "Accessor" +msgstr "" + +#: templates/generic/bulk_import.html:154 +msgid "Import Value" +msgstr "" + +#: templates/generic/bulk_import.html:181 +msgid "Format: YYYY-MM-DD" +msgstr "" + +#: templates/generic/bulk_import.html:183 +msgid "Specify true or false" +msgstr "" + +#: templates/generic/bulk_import.html:195 +msgid "Required fields must be specified for all objects." +msgstr "" + +#: templates/generic/bulk_import.html:201 +#, python-format +msgid "" +"Related objects may be referenced by any unique attribute. For example, " +"%(example)s would identify a VRF by its route distinguisher." +msgstr "" + +#: templates/generic/bulk_remove.html:13 +msgid "Confirm Bulk Removal" +msgstr "" + +#: templates/generic/bulk_remove.html:15 +#, python-format +msgid "" +"Warning: The following operation will remove %(count)s " +"%(obj_type_plural)s from %(parent_obj)s." +msgstr "" + +#: templates/generic/bulk_remove.html:21 +#, python-format +msgid "" +"Please carefully review the %(obj_type_plural)s to be removed and confirm " +"below." +msgstr "" + +#: templates/generic/bulk_remove.html:38 +#, python-format +msgid "Delete these %(count)s %(obj_type_plural)s" +msgstr "" + +#: templates/generic/bulk_rename.html:7 +msgid "Renaming" +msgstr "" + +#: templates/generic/bulk_rename.html:16 +msgid "Current Name" +msgstr "" + +#: templates/generic/bulk_rename.html:17 +msgid "New Name" +msgstr "" + +#: templates/generic/bulk_rename.html:40 +#: utilities/templates/widgets/markdown_input.html:11 +msgid "Preview" +msgstr "" + +#: templates/generic/confirmation_form.html:16 +msgid "Are you sure" +msgstr "" + +#: templates/generic/confirmation_form.html:19 +msgid "Confirm" +msgstr "" + +#: templates/generic/object.html:51 +msgid "ago" +msgstr "" + +#: templates/generic/object_children.html:27 +#: utilities/templates/buttons/bulk_edit.html:4 +msgid "Edit Selected" +msgstr "" + +#: templates/generic/object_children.html:41 +#: utilities/templates/buttons/bulk_delete.html:4 +msgid "Delete Selected" +msgstr "" + +#: templates/generic/object_edit.html:19 +#, python-format +msgid "Add a new %(object_type)s" +msgstr "" + +#: templates/generic/object_edit.html:47 +msgid "View model documentation" +msgstr "" + +#: templates/generic/object_edit.html:48 +msgid "Help" +msgstr "" + +#: templates/generic/object_edit.html:73 +msgid "Create & Add Another" +msgstr "" + +#: templates/generic/object_list.html:48 templates/search.html:13 +msgid "Results" +msgstr "" + +#: templates/generic/object_list.html:54 +msgid "Filters" +msgstr "" + +#: templates/generic/object_list.html:94 +#, python-format +msgid "" +"Select all %(count)s %(object_type_plural)s matching query" +msgstr "" + +#: templates/home.html:12 +msgid "New Release Available" +msgstr "" + +#: templates/home.html:14 +msgid "is available" +msgstr "" + +#: templates/home.html:17 +msgctxt "Document title" +msgid "Upgrade Instructions" +msgstr "" + +#: templates/home.html:37 +msgid "Unlock Dashboard" +msgstr "" + +#: templates/home.html:46 +msgid "Lock Dashboard" +msgstr "" + +#: templates/home.html:57 +msgid "Add Widget" +msgstr "" + +#: templates/home.html:60 +msgid "Save Layout" +msgstr "" + +#: templates/htmx/delete_form.html:7 +msgid "Confirm Deletion" +msgstr "" + +#: templates/htmx/delete_form.html:11 +#, python-format +msgid "" +"Are you sure you want to delete " +"%(object_type)s %(object)s?" +msgstr "" + +#: templates/htmx/object_selector.html:5 +msgid "Select" +msgstr "" + +#: templates/inc/filter_list.html:50 +#: utilities/templates/helpers/table_config_form.html:39 +msgid "Reset" +msgstr "" + +#: templates/inc/missing_prerequisites.html:7 +#, python-format +msgid "" +"Before you can add a %(model)s you must first create a " +"%(prerequisite_model)s." +msgstr "" + +#: templates/inc/paginator.html:38 templates/inc/paginator_htmx.html:53 +msgid "Per Page" +msgstr "" + +#: templates/inc/paginator.html:49 templates/inc/paginator_htmx.html:69 +#, python-format +msgid "Showing %(start)s-%(end)s of %(total)s" +msgstr "" + +#: templates/inc/panels/image_attachments.html:10 +msgid "Attach an image" +msgstr "" + +#: templates/inc/panels/related_objects.html:5 +msgid "Related Objects" +msgstr "" + +#: templates/inc/panels/tags.html:11 +msgid "No tags assigned" +msgstr "" + +#: templates/inc/profile_button.html:12 templates/inc/profile_button.html:62 +msgid "Dark Mode" +msgstr "" + +#: templates/inc/profile_button.html:45 +msgid "Log Out" +msgstr "" + +#: templates/inc/profile_button.html:53 +msgid "Log In" +msgstr "" + +#: templates/inc/sync_warning.html:7 +msgid "Data is out of sync with upstream file" +msgstr "" + +#: templates/inc/table_controls_htmx.html:16 +#: templates/inc/table_controls_htmx.html:18 +msgid "Configure Table" +msgstr "" + +#: templates/ipam/aggregate.html:15 templates/ipam/ipaddress.html:17 +#: templates/ipam/iprange.html:16 templates/ipam/prefix.html:15 +msgid "Family" +msgstr "" + +#: templates/ipam/aggregate.html:40 +msgid "Date Added" +msgstr "" + +#: templates/ipam/aggregate/prefixes.html:8 +#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +msgid "Add Prefix" +msgstr "" + +#: templates/ipam/asn.html:24 +msgid "AS Number" +msgstr "" + +#: templates/ipam/fhrpgroup.html:55 +msgid "Authentication Type" +msgstr "" + +#: templates/ipam/fhrpgroup.html:59 +msgid "Authentication Key" +msgstr "" + +#: templates/ipam/fhrpgroup.html:72 +msgid "Virtual IP Addresses" +msgstr "" + +#: templates/ipam/fhrpgroupassignment_edit.html:8 +msgid "FHRP Group Assignment" +msgstr "" + +#: templates/ipam/inc/ipaddress_edit_header.html:19 +msgid "Assign IP" +msgstr "" + +#: templates/ipam/inc/ipaddress_edit_header.html:28 +msgid "Bulk Create" +msgstr "" + +#: templates/ipam/inc/panels/fhrp_groups.html:12 +msgid "Virtual IPs" +msgstr "" + +#: templates/ipam/inc/panels/fhrp_groups.html:52 +msgid "Create Group" +msgstr "" + +#: templates/ipam/inc/panels/fhrp_groups.html:57 +msgid "Assign Group" +msgstr "" + +#: templates/ipam/inc/toggle_available.html:7 +msgid "Show Assigned" +msgstr "" + +#: templates/ipam/inc/toggle_available.html:10 +msgid "Show Available" +msgstr "" + +#: templates/ipam/inc/toggle_available.html:13 +msgid "Show All" +msgstr "" + +#: templates/ipam/ipaddress.html:26 templates/ipam/iprange.html:48 +#: templates/ipam/prefix.html:24 +msgid "Global" +msgstr "" + +#: templates/ipam/ipaddress.html:88 +msgid "NAT (outside)" +msgstr "" + +#: templates/ipam/ipaddress_assign.html:8 +msgid "Assign an IP Address" +msgstr "" + +#: templates/ipam/ipaddress_assign.html:23 +msgid "Select IP Address" +msgstr "" + +#: templates/ipam/ipaddress_assign.html:39 +msgid "Search Results" +msgstr "" + +#: templates/ipam/ipaddress_bulk_add.html:6 +msgid "Bulk Add IP Addresses" +msgstr "" + +#: templates/ipam/ipaddress_edit.html:35 +msgid "Interface Assignment" +msgstr "" + +#: templates/ipam/ipaddress_edit.html:74 +msgid "NAT IP (Inside" +msgstr "" + +#: templates/ipam/iprange.html:20 +msgid "Starting Address" +msgstr "" + +#: templates/ipam/iprange.html:24 +msgid "Ending Address" +msgstr "" + +#: templates/ipam/iprange.html:36 templates/ipam/prefix.html:104 +msgid "Marked fully utilized" +msgstr "" + +#: templates/ipam/l2vpn.html:11 templates/ipam/l2vpntermination.html:10 +msgid "L2VPN Attributes" +msgstr "" + +#: templates/ipam/l2vpn.html:65 +msgid "Add a Termination" +msgstr "" + +#: templates/ipam/l2vpntermination_edit.html:9 +msgid "L2VPN Termination" +msgstr "" + +#: templates/ipam/prefix.html:112 +msgid "Child IPs" +msgstr "" + +#: templates/ipam/prefix.html:120 +msgid "Available IPs" +msgstr "" + +#: templates/ipam/prefix.html:132 +msgid "First available IP" +msgstr "" + +#: templates/ipam/prefix.html:151 +msgid "Addressing Details" +msgstr "" + +#: templates/ipam/prefix.html:181 +msgid "Prefix Details" +msgstr "" + +#: templates/ipam/prefix.html:187 +msgid "Network Address" +msgstr "" + +#: templates/ipam/prefix.html:191 +msgid "Network Mask" +msgstr "" + +#: templates/ipam/prefix.html:195 +msgid "Wildcard Mask" +msgstr "" + +#: templates/ipam/prefix.html:199 +msgid "Broadcast Address" +msgstr "" + +#: templates/ipam/prefix/ip_ranges.html:7 +msgid "Add IP Range" +msgstr "" + +#: templates/ipam/prefix_list.html:7 +msgid "Hide Depth Indicators" +msgstr "" + +#: templates/ipam/prefix_list.html:11 +msgid "Max Depth" +msgstr "" + +#: templates/ipam/prefix_list.html:28 +msgid "Max Length" +msgstr "" + +#: templates/ipam/rir.html:10 +msgid "Add Aggregate" +msgstr "" + +#: templates/ipam/routetarget.html:10 +msgid "Route Target" +msgstr "" + +#: templates/ipam/routetarget.html:40 +msgid "Importing VRFs" +msgstr "" + +#: templates/ipam/routetarget.html:49 +msgid "Exporting VRFs" +msgstr "" + +#: templates/ipam/routetarget.html:60 +msgid "Importing L2VPNs" +msgstr "" + +#: templates/ipam/routetarget.html:69 +msgid "Exporting L2VPNs" +msgstr "" + +#: templates/ipam/service.html:22 templates/ipam/service_create.html:8 +#: templates/ipam/service_edit.html:8 +msgid "Service" +msgstr "" + +#: templates/ipam/service_create.html:43 +msgid "From Template" +msgstr "" + +#: templates/ipam/service_create.html:48 +msgid "Custom" +msgstr "" + +#: templates/ipam/service_edit.html:37 +msgid "Port(s)" +msgstr "" + +#: templates/ipam/vlan.html:95 +msgid "Add a Prefix" +msgstr "" + +#: templates/ipam/vlangroup.html:18 +msgid "Add VLAN" +msgstr "" + +#: templates/ipam/vlangroup.html:43 +msgid "Permitted VIDs" +msgstr "" + +#: templates/ipam/vrf.html:19 +msgid "Route Distinguisher" +msgstr "" + +#: templates/ipam/vrf.html:32 +msgid "Unique IP Space" +msgstr "" + +#: templates/login.html:20 +#: utilities/templates/form_helpers/render_errors.html:7 +msgid "Errors" +msgstr "" + +#: templates/login.html:48 +msgid "Sign In" +msgstr "" + +#: templates/login.html:54 +msgid "Or use a single sign-on (SSO) provider" +msgstr "" + +#: templates/login.html:68 +msgid "Toggle Color Mode" +msgstr "" + +#: templates/media_failure.html:7 +msgid "Static Media Failure - NetBox" +msgstr "" + +#: templates/media_failure.html:21 +msgid "Static Media Failure" +msgstr "" + +#: templates/media_failure.html:23 +msgid "The following static media file failed to load" +msgstr "" + +#: templates/media_failure.html:26 +msgid "Check the following" +msgstr "" + +#: templates/media_failure.html:29 +msgid "" +"manage.py collectstatic was run during the most recent upgrade. " +"This installs the most recent iteration of each static file into the static " +"root path." +msgstr "" + +#: templates/media_failure.html:35 +#, python-format +msgid "" +"The HTTP service (e.g. nginx or Apache) is configured to serve files from " +"the STATIC_ROOT path. Refer to the " +"installation documentation for further guidance." +msgstr "" + +#: templates/media_failure.html:47 +#, python-format +msgid "" +"The file %(filename)s exists in the static root directory and " +"is readable by the HTTP server." +msgstr "" + +#: templates/media_failure.html:55 +#, python-format +msgid "" +"Click here to attempt loading NetBox again." +msgstr "" + +#: templates/tenancy/contact.html:18 tenancy/filtersets.py:123 +#: tenancy/forms/bulk_edit.py:136 tenancy/forms/filtersets.py:103 +#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:112 +#: tenancy/forms/model_forms.py:135 tenancy/tables/contacts.py:98 +msgid "Contact" +msgstr "" + +#: templates/tenancy/contact.html:30 tenancy/forms/bulk_edit.py:98 +msgid "Title" +msgstr "" + +#: templates/tenancy/contact.html:34 tenancy/forms/bulk_edit.py:103 +#: tenancy/tables/contacts.py:64 +msgid "Phone" +msgstr "" + +#: templates/tenancy/contact.html:86 tenancy/tables/contacts.py:73 +msgid "Assignments" +msgstr "" + +#: templates/tenancy/contactassignment_edit.html:12 +msgid "Contact Assignment" +msgstr "" + +#: templates/tenancy/contactgroup.html:19 tenancy/forms/forms.py:66 +#: tenancy/forms/model_forms.py:79 +msgid "Contact Group" +msgstr "" + +#: templates/tenancy/contactgroup.html:57 +msgid "Add Contact Group" +msgstr "" + +#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:128 +#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:93 +msgid "Contact Role" +msgstr "" + +#: templates/tenancy/object_contacts.html:9 +msgid "Add a contact" +msgstr "" + +#: templates/tenancy/tenantgroup.html:17 +msgid "Add Tenant" +msgstr "" + +#: templates/tenancy/tenantgroup.html:27 tenancy/forms/model_forms.py:34 +#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +msgid "Tenant Group" +msgstr "" + +#: templates/tenancy/tenantgroup.html:66 +msgid "Add Tenant Group" +msgstr "" + +#: templates/users/group.html:37 templates/users/user.html:61 +msgid "Assigned Permissions" +msgstr "" + +#: templates/users/objectpermission.html:6 +#: templates/users/objectpermission.html:14 users/forms/filtersets.py:69 +msgid "Permission" +msgstr "" + +#: templates/users/objectpermission.html:33 users/forms/filtersets.py:70 +#: users/forms/model_forms.py:321 +msgid "Actions" +msgstr "" + +#: templates/users/objectpermission.html:37 +msgid "View" +msgstr "" + +#: templates/users/objectpermission.html:56 users/forms/model_forms.py:324 +msgid "Constraints" +msgstr "" + +#: templates/users/objectpermission.html:76 +msgid "Assigned Users" +msgstr "" + +#: templates/users/user.html:38 +msgid "Staff" +msgstr "" + +#: templates/virtualization/cluster.html:56 +msgid "Allocated Resources" +msgstr "" + +#: templates/virtualization/cluster.html:60 +#: templates/virtualization/virtualmachine.html:128 +msgid "Virtual CPUs" +msgstr "" + +#: templates/virtualization/cluster.html:64 +#: templates/virtualization/virtualmachine.html:132 +msgid "Memory" +msgstr "" + +#: templates/virtualization/cluster.html:74 +#: templates/virtualization/virtualmachine.html:142 +msgid "Disk Space" +msgstr "" + +#: templates/virtualization/cluster.html:77 +#: templates/virtualization/virtualmachine.html:145 +msgctxt "Abbreviation for gigabyte" +msgid "GB" +msgstr "" + +#: templates/virtualization/cluster/base.html:18 +msgid "Add Virtual Machine" +msgstr "" + +#: templates/virtualization/cluster/base.html:24 +msgid "Assign Device" +msgstr "" + +#: templates/virtualization/cluster/devices.html:10 +msgid "Remove Selected" +msgstr "" + +#: templates/virtualization/cluster_add_devices.html:9 +#, python-format +msgid "Add Device to Cluster %(cluster)s" +msgstr "" + +#: templates/virtualization/cluster_add_devices.html:23 +msgid "Device Selection" +msgstr "" + +#: templates/virtualization/cluster_add_devices.html:31 +msgid "Add Devices" +msgstr "" + +#: templates/virtualization/clustergroup.html:10 +#: templates/virtualization/clustertype.html:10 +msgid "Add Cluster" +msgstr "" + +#: templates/virtualization/clustergroup.html:20 +#: virtualization/forms/model_forms.py:50 +msgid "Cluster Group" +msgstr "" + +#: templates/virtualization/clustertype.html:20 +#: templates/virtualization/virtualmachine.html:111 +#: virtualization/forms/model_forms.py:34 +msgid "Cluster Type" +msgstr "" + +#: templates/virtualization/virtualmachine.html:124 +#: virtualization/forms/bulk_edit.py:187 +#: virtualization/forms/model_forms.py:225 +msgid "Resources" +msgstr "" + +#: templates/wireless/inc/authentication_attrs.html:13 +msgid "Cipher" +msgstr "" + +#: templates/wireless/inc/authentication_attrs.html:17 +msgid "PSK" +msgstr "" + +#: templates/wireless/inc/authentication_attrs.html:21 +msgid "Show Secret" +msgstr "" + +#: templates/wireless/inc/wirelesslink_interface.html:35 +#: templates/wireless/inc/wirelesslink_interface.html:45 +msgctxt "Abbreviation for megahertz" +msgid "MHz" +msgstr "" + +#: templates/wireless/wirelesslan.html:11 wireless/forms/model_forms.py:54 +msgid "Wireless LAN" +msgstr "" + +#: templates/wireless/wirelesslan.html:59 +msgid "Attached Interfaces" +msgstr "" + +#: templates/wireless/wirelesslangroup.html:17 +msgid "Add Wireless LAN" +msgstr "" + +#: templates/wireless/wirelesslangroup.html:26 wireless/forms/model_forms.py:27 +msgid "Wireless LAN Group" +msgstr "" + +#: templates/wireless/wirelesslangroup.html:64 +msgid "Add Wireless LAN Group" +msgstr "" + +#: templates/wireless/wirelesslink.html:16 +msgid "Link Properties" +msgstr "" + +#: tenancy/choices.py:19 +msgid "Tertiary" +msgstr "" + +#: tenancy/choices.py:20 +msgid "Inactive" +msgstr "" + +#: tenancy/filtersets.py:30 tenancy/filtersets.py:56 +msgid "Contact group (ID)" +msgstr "" + +#: tenancy/filtersets.py:36 tenancy/filtersets.py:63 +msgid "Contact group (slug)" +msgstr "" + +#: tenancy/filtersets.py:92 +msgid "Contact (ID)" +msgstr "" + +#: tenancy/filtersets.py:96 +msgid "Contact role (ID)" +msgstr "" + +#: tenancy/filtersets.py:102 +msgid "Contact role (slug)" +msgstr "" + +#: tenancy/filtersets.py:134 +msgid "Contact group" +msgstr "" + +#: tenancy/filtersets.py:145 tenancy/filtersets.py:164 +msgid "Tenant group (ID)" +msgstr "" + +#: tenancy/filtersets.py:197 +msgid "Tenant Group (ID)" +msgstr "" + +#: tenancy/filtersets.py:204 +msgid "Tenant Group (slug)" +msgstr "" + +#: tenancy/forms/bulk_edit.py:65 +msgid "Desciption" +msgstr "" + +#: tenancy/forms/bulk_import.py:101 +msgid "Assigned contact" +msgstr "" + +#: tenancy/models/contacts.py:31 +msgid "contact group" +msgstr "" + +#: tenancy/models/contacts.py:32 +msgid "contact groups" +msgstr "" + +#: tenancy/models/contacts.py:47 +msgid "contact role" +msgstr "" + +#: tenancy/models/contacts.py:48 +msgid "contact roles" +msgstr "" + +#: tenancy/models/contacts.py:67 +msgid "title" +msgstr "" + +#: tenancy/models/contacts.py:72 +msgid "phone" +msgstr "" + +#: tenancy/models/contacts.py:77 +msgid "email" +msgstr "" + +#: tenancy/models/contacts.py:86 +msgid "link" +msgstr "" + +#: tenancy/models/contacts.py:102 +msgid "contact" +msgstr "" + +#: tenancy/models/contacts.py:103 +msgid "contacts" +msgstr "" + +#: tenancy/models/contacts.py:149 +msgid "contact assignment" +msgstr "" + +#: tenancy/models/contacts.py:150 +msgid "contact assignments" +msgstr "" + +#: tenancy/models/tenants.py:32 +msgid "tenant group" +msgstr "" + +#: tenancy/models/tenants.py:33 +msgid "tenant groups" +msgstr "" + +#: tenancy/models/tenants.py:70 +msgid "Tenant name must be unique per group." +msgstr "" + +#: tenancy/models/tenants.py:80 +msgid "Tenant slug must be unique per group." +msgstr "" + +#: tenancy/models/tenants.py:88 +msgid "tenant" +msgstr "" + +#: tenancy/models/tenants.py:89 +msgid "tenants" +msgstr "" + +#: tenancy/tables/contacts.py:107 +msgid "Contact Title" +msgstr "" + +#: tenancy/tables/contacts.py:111 +msgid "Contact Phone" +msgstr "" + +#: tenancy/tables/contacts.py:115 +msgid "Contact Email" +msgstr "" + +#: tenancy/tables/contacts.py:119 +msgid "Contact Address" +msgstr "" + +#: tenancy/tables/contacts.py:123 +msgid "Contact Link" +msgstr "" + +#: tenancy/tables/contacts.py:127 +msgid "Contact Description" +msgstr "" + +#: users/filtersets.py:48 users/filtersets.py:151 +msgid "Group (name)" +msgstr "" + +#: users/forms/bulk_edit.py:24 +msgid "First name" +msgstr "" + +#: users/forms/bulk_edit.py:29 +msgid "Last name" +msgstr "" + +#: users/forms/bulk_edit.py:41 +msgid "Staff status" +msgstr "" + +#: users/forms/bulk_edit.py:46 +msgid "Superuser status" +msgstr "" + +#: users/forms/bulk_import.py:43 +msgid "If no key is provided, one will be generated automatically." +msgstr "" + +#: users/forms/filtersets.py:54 users/tables.py:42 +msgid "Is Staff" +msgstr "" + +#: users/forms/filtersets.py:61 users/tables.py:45 +msgid "Is Superuser" +msgstr "" + +#: users/forms/filtersets.py:94 users/tables.py:89 +msgid "Can View" +msgstr "" + +#: users/forms/filtersets.py:101 users/tables.py:92 +msgid "Can Add" +msgstr "" + +#: users/forms/filtersets.py:108 users/tables.py:95 +msgid "Can Change" +msgstr "" + +#: users/forms/filtersets.py:115 users/tables.py:98 +msgid "Can Delete" +msgstr "" + +#: users/forms/model_forms.py:58 +msgid "User Interface" +msgstr "" + +#: users/forms/model_forms.py:115 +msgid "" +"Keys must be at least 40 characters in length. Be sure to record " +"your key prior to submitting this form, as it may no longer be " +"accessible once the token has been created." +msgstr "" + +#: users/forms/model_forms.py:127 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for " +"no restrictions. Example: 10.1.1.0/24,192.168.10.16/32,2001:" +"db8:1::/64" +msgstr "" + +#: users/forms/model_forms.py:176 +msgid "Confirm password" +msgstr "" + +#: users/forms/model_forms.py:179 +msgid "Enter the same password as before, for verification." +msgstr "" + +#: users/forms/model_forms.py:237 +msgid "Passwords do not match! Please check your input and try again." +msgstr "" + +#: users/forms/model_forms.py:303 +msgid "Additional actions" +msgstr "" + +#: users/forms/model_forms.py:306 +msgid "Actions granted in addition to those listed above" +msgstr "" + +#: users/forms/model_forms.py:322 +msgid "Objects" +msgstr "" + +#: users/forms/model_forms.py:334 +msgid "" +"JSON expression of a queryset filter that will return only permitted " +"objects. Leave null to match all objects of this type. A list of multiple " +"objects will result in a logical OR operation." +msgstr "" + +#: users/forms/model_forms.py:372 +msgid "At least one action must be selected." +msgstr "" + +#: users/forms/model_forms.py:389 +#, python-brace-format +msgid "Invalid filter for {model}: {error}" +msgstr "" + +#: users/models.py:54 +msgid "user" +msgstr "" + +#: users/models.py:55 +msgid "users" +msgstr "" + +#: users/models.py:66 +msgid "A user with this username already exists." +msgstr "" + +#: users/models.py:78 +msgid "group" +msgstr "" + +#: users/models.py:79 +msgid "groups" +msgstr "" + +#: users/models.py:104 users/models.py:105 +msgid "user preferences" +msgstr "" + +#: users/models.py:172 +#, python-brace-format +msgid "Key '{path}' is a leaf node; cannot assign new keys" +msgstr "" + +#: users/models.py:184 +#, python-brace-format +msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" +msgstr "" + +#: users/models.py:249 +msgid "expires" +msgstr "" + +#: users/models.py:254 +msgid "last used" +msgstr "" + +#: users/models.py:259 +msgid "key" +msgstr "" + +#: users/models.py:265 +msgid "write enabled" +msgstr "" + +#: users/models.py:267 +msgid "Permit create/update/delete operations using this key" +msgstr "" + +#: users/models.py:278 +msgid "allowed IPs" +msgstr "" + +#: users/models.py:280 +msgid "" +"Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for " +"no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" +msgstr "" + +#: users/models.py:288 +msgid "token" +msgstr "" + +#: users/models.py:289 +msgid "tokens" +msgstr "" + +#: users/models.py:370 +msgid "The list of actions granted by this permission" +msgstr "" + +#: users/models.py:375 +msgid "constraints" +msgstr "" + +#: users/models.py:376 +msgid "Queryset filter matching the applicable objects of the selected type(s)" +msgstr "" + +#: users/models.py:383 +msgid "permission" +msgstr "" + +#: users/models.py:384 +msgid "permissions" +msgstr "" + +#: users/tables.py:101 +msgid "Custom Actions" +msgstr "" + +#: utilities/choices.py:16 +#, python-brace-format +msgid "{name} has a key defined but CHOICES is not a list" +msgstr "" + +#: utilities/choices.py:135 +msgid "Dark Red" +msgstr "" + +#: utilities/choices.py:138 +msgid "Rose" +msgstr "" + +#: utilities/choices.py:139 +msgid "Fuchsia" +msgstr "" + +#: utilities/choices.py:141 +msgid "Dark Purple" +msgstr "" + +#: utilities/choices.py:144 +msgid "Light Blue" +msgstr "" + +#: utilities/choices.py:147 +msgid "Aqua" +msgstr "" + +#: utilities/choices.py:148 +msgid "Dark Green" +msgstr "" + +#: utilities/choices.py:150 +msgid "Light Green" +msgstr "" + +#: utilities/choices.py:151 +msgid "Lime" +msgstr "" + +#: utilities/choices.py:153 +msgid "Amber" +msgstr "" + +#: utilities/choices.py:155 +msgid "Dark Orange" +msgstr "" + +#: utilities/choices.py:156 +msgid "Brown" +msgstr "" + +#: utilities/choices.py:157 +msgid "Light Grey" +msgstr "" + +#: utilities/choices.py:158 +msgid "Grey" +msgstr "" + +#: utilities/choices.py:159 +msgid "Dark Grey" +msgstr "" + +#: utilities/choices.py:217 +msgid "Direct" +msgstr "" + +#: utilities/choices.py:218 +msgid "Upload" +msgstr "" + +#: utilities/choices.py:230 utilities/choices.py:244 +msgid "Auto-detect" +msgstr "" + +#: utilities/choices.py:245 +msgid "Comma" +msgstr "" + +#: utilities/choices.py:246 +msgid "Semicolon" +msgstr "" + +#: utilities/choices.py:247 +msgid "Tab" +msgstr "" + +#: utilities/fields.py:162 +#, python-format +msgid "" +"%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " +"in the format 'app.model'" +msgstr "" + +#: utilities/fields.py:172 +#, python-format +msgid "" +"%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " +"in the format 'field'" +msgstr "" + +#: utilities/forms/bulk_import.py:24 +msgid "Enter object data in CSV, JSON or YAML format." +msgstr "" + +#: utilities/forms/bulk_import.py:37 +msgid "CSV delimiter" +msgstr "" + +#: utilities/forms/bulk_import.py:38 +msgid "The character which delimits CSV fields. Applies only to CSV format." +msgstr "" + +#: utilities/forms/bulk_import.py:101 +msgid "Unable to detect data format. Please specify." +msgstr "" + +#: utilities/forms/bulk_import.py:124 +msgid "Invalid CSV delimiter" +msgstr "" + +#: utilities/forms/bulk_import.py:168 +msgid "" +"Invalid YAML data. Data must be in the form of multiple documents, or a " +"single document comprising a list of dictionaries." +msgstr "" + +#: utilities/forms/fields/array.py:17 +#, python-brace-format +msgid "" +"Invalid list ({value}). Must be numeric and ranges must be in ascending " +"order." +msgstr "" + +#: utilities/forms/fields/csv.py:44 +#, python-brace-format +msgid "Invalid value for a multiple choice field: {value}" +msgstr "" + +#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:74 +#, python-format +msgid "Object not found: %(value)s" +msgstr "" + +#: utilities/forms/fields/csv.py:65 +#, python-brace-format +msgid "" +"\"{value}\" is not a unique value for this field; multiple objects were found" +msgstr "" + +#: utilities/forms/fields/csv.py:97 +msgid "Object type must be specified as \".\"" +msgstr "" + +#: utilities/forms/fields/csv.py:101 +msgid "Invalid object type" +msgstr "" + +#: utilities/forms/fields/expandable.py:25 +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: [ge,xe]-0/0/[0-9])." +msgstr "" + +#: utilities/forms/fields/expandable.py:46 +msgid "" +"Specify a numeric range to create multiple IPs.
      Example: 192.0.2." +"[1,5,100-254]/24" +msgstr "" + +#: utilities/forms/fields/fields.py:31 +#, python-brace-format +msgid "" +" Markdown syntax is supported" +msgstr "" + +#: utilities/forms/fields/fields.py:48 +msgid "URL-friendly unique shorthand" +msgstr "" + +#: utilities/forms/fields/fields.py:99 +msgid "Enter context data in JSON format." +msgstr "" + +#: utilities/forms/fields/fields.py:117 +msgid "MAC address must be in EUI-48 format" +msgstr "" + +#: utilities/forms/forms.py:53 +msgid "Use regular expressions" +msgstr "" + +#: utilities/forms/forms.py:87 +#, python-brace-format +msgid "Unrecognized header: {name}" +msgstr "" + +#: utilities/forms/forms.py:113 +msgid "Available Columns" +msgstr "" + +#: utilities/forms/forms.py:121 +msgid "Selected Columns" +msgstr "" + +#: utilities/forms/mixins.py:101 +msgid "" +"This object has been modified since the form was rendered. Please consult " +"the object's change log for details." +msgstr "" + +#: utilities/templates/builtins/customfield_value.html:30 +msgid "Not defined" +msgstr "" + +#: utilities/templates/buttons/bookmark.html:9 +msgid "Unbookmark" +msgstr "" + +#: utilities/templates/buttons/bookmark.html:13 +msgid "Bookmark" +msgstr "" + +#: utilities/templates/buttons/clone.html:4 +msgid "Clone" +msgstr "" + +#: utilities/templates/buttons/export.html:4 +msgid "Export" +msgstr "" + +#: utilities/templates/buttons/export.html:7 +msgid "Current View" +msgstr "" + +#: utilities/templates/buttons/export.html:8 +msgid "All Data" +msgstr "" + +#: utilities/templates/buttons/export.html:28 +msgid "Add export template" +msgstr "" + +#: utilities/templates/buttons/import.html:4 +msgid "Import" +msgstr "" + +#: utilities/templates/form_helpers/render_field.html:36 +msgid "Copy to clipboard" +msgstr "" + +#: utilities/templates/form_helpers/render_field.html:52 +msgid "This field is required" +msgstr "" + +#: utilities/templates/form_helpers/render_field.html:65 +msgid "Set Null" +msgstr "" + +#: utilities/templates/helpers/applied_filters.html:11 +msgid "Clear all" +msgstr "" + +#: utilities/templates/helpers/table_config_form.html:8 +msgid "Table Configuration" +msgstr "" + +#: utilities/templates/helpers/table_config_form.html:31 +msgid "Move Up" +msgstr "" + +#: utilities/templates/helpers/table_config_form.html:34 +msgid "Move Down" +msgstr "" + +#: utilities/templates/widgets/apiselect.html:7 +msgid "Open selector" +msgstr "" + +#: utilities/templates/widgets/clearable_file_input.html:12 +msgid "None assigned" +msgstr "" + +#: utilities/templates/widgets/markdown_input.html:6 +msgid "Write" +msgstr "" + +#: utilities/templates/widgets/markdown_input.html:20 +msgid "Testing" +msgstr "" + +#: virtualization/filtersets.py:77 +msgid "Parent group (ID)" +msgstr "" + +#: virtualization/filtersets.py:83 +msgid "Parent group (slug)" +msgstr "" + +#: virtualization/filtersets.py:87 virtualization/filtersets.py:137 +msgid "Cluster type (ID)" +msgstr "" + +#: virtualization/filtersets.py:126 +msgid "Cluster group (ID)" +msgstr "" + +#: virtualization/filtersets.py:147 virtualization/filtersets.py:262 +msgid "Cluster (ID)" +msgstr "" + +#: virtualization/forms/bulk_edit.py:163 +#: virtualization/models/virtualmachines.py:112 +msgid "vCPUs" +msgstr "" + +#: virtualization/forms/bulk_edit.py:167 +msgid "Memory (MB)" +msgstr "" + +#: virtualization/forms/bulk_edit.py:171 +msgid "Disk (GB)" +msgstr "" + +#: virtualization/forms/bulk_import.py:43 +msgid "Type of cluster" +msgstr "" + +#: virtualization/forms/bulk_import.py:50 +msgid "Assigned cluster group" +msgstr "" + +#: virtualization/forms/bulk_import.py:95 +msgid "Assigned cluster" +msgstr "" + +#: virtualization/forms/bulk_import.py:102 +msgid "Assigned device within cluster" +msgstr "" + +#: virtualization/forms/model_forms.py:155 +#, python-brace-format +msgid "" +"{device} belongs to a different site ({device_site}) than the cluster " +"({cluster_site})" +msgstr "" + +#: virtualization/forms/model_forms.py:194 +msgid "Optionally pin this VM to a specific host device within the cluster" +msgstr "" + +#: virtualization/forms/model_forms.py:222 +msgid "Site/Cluster" +msgstr "" + +#: virtualization/models/clusters.py:25 +msgid "cluster type" +msgstr "" + +#: virtualization/models/clusters.py:26 +msgid "cluster types" +msgstr "" + +#: virtualization/models/clusters.py:45 +msgid "cluster group" +msgstr "" + +#: virtualization/models/clusters.py:46 +msgid "cluster groups" +msgstr "" + +#: virtualization/models/clusters.py:121 +msgid "cluster" +msgstr "" + +#: virtualization/models/clusters.py:122 +msgid "clusters" +msgstr "" + +#: virtualization/models/clusters.py:141 +#, python-brace-format +msgid "" +"{count} devices are assigned as hosts for this cluster but are not in site " +"{site}" +msgstr "" + +#: virtualization/models/virtualmachines.py:120 +msgid "memory (MB)" +msgstr "" + +#: virtualization/models/virtualmachines.py:125 +msgid "disk (GB)" +msgstr "" + +#: virtualization/models/virtualmachines.py:154 +msgid "Virtual machine name must be unique per cluster." +msgstr "" + +#: virtualization/models/virtualmachines.py:157 +msgid "virtual machine" +msgstr "" + +#: virtualization/models/virtualmachines.py:158 +msgid "virtual machines" +msgstr "" + +#: virtualization/models/virtualmachines.py:172 +msgid "A virtual machine must be assigned to a site and/or cluster." +msgstr "" + +#: virtualization/models/virtualmachines.py:179 +#, python-brace-format +msgid "The selected cluster ({cluster}) is not assigned to this site ({site})." +msgstr "" + +#: virtualization/models/virtualmachines.py:186 +msgid "Must specify a cluster when assigning a host device." +msgstr "" + +#: virtualization/models/virtualmachines.py:191 +#, python-brace-format +msgid "" +"The selected device ({device}) is not assigned to this cluster ({cluster})." +msgstr "" + +#: virtualization/models/virtualmachines.py:204 +#, python-brace-format +msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" +msgstr "" + +#: virtualization/models/virtualmachines.py:213 +#, python-brace-format +msgid "The specified IP address ({ip}) is not assigned to this VM." +msgstr "" + +#: virtualization/models/virtualmachines.py:331 +#, python-brace-format +msgid "" +"The selected parent interface ({parent}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "" + +#: virtualization/models/virtualmachines.py:346 +#, python-brace-format +msgid "" +"The selected bridge interface ({bridge}) belongs to a different virtual " +"machine ({virtual_machine})." +msgstr "" + +#: virtualization/models/virtualmachines.py:357 +#, python-brace-format +msgid "" +"The untagged VLAN ({untagged_vlan}) must belong to the same site as the " +"interface's parent virtual machine, or it must be global." +msgstr "" + +#: wireless/choices.py:11 +msgid "Access point" +msgstr "" + +#: wireless/choices.py:12 +msgid "Station" +msgstr "" + +#: wireless/choices.py:467 +msgid "Open" +msgstr "" + +#: wireless/choices.py:469 +msgid "WPA Personal (PSK)" +msgstr "" + +#: wireless/choices.py:470 +msgid "WPA Enterprise" +msgstr "" + +#: wireless/forms/bulk_edit.py:72 wireless/forms/bulk_edit.py:119 +#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 +#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 +#: wireless/forms/filtersets.py:58 wireless/forms/filtersets.py:92 +msgid "Authentication cipher" +msgstr "" + +#: wireless/forms/bulk_edit.py:78 wireless/forms/bulk_edit.py:125 +#: wireless/forms/filtersets.py:63 wireless/forms/filtersets.py:97 +msgid "Pre-shared key" +msgstr "" + +#: wireless/forms/bulk_import.py:52 +msgid "Bridged VLAN" +msgstr "" + +#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:27 +msgid "Interface A" +msgstr "" + +#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:36 +msgid "Interface B" +msgstr "" + +#: wireless/forms/model_forms.py:158 +msgid "Side B" +msgstr "" + +#: wireless/models.py:30 +msgid "authentication cipher" +msgstr "" + +#: wireless/models.py:38 +msgid "pre-shared key" +msgstr "" + +#: wireless/models.py:68 +msgid "wireless LAN group" +msgstr "" + +#: wireless/models.py:69 +msgid "wireless LAN groups" +msgstr "" + +#: wireless/models.py:115 +msgid "wireless LAN" +msgstr "" + +#: wireless/models.py:143 +msgid "interface A" +msgstr "" + +#: wireless/models.py:150 +msgid "interface B" +msgstr "" + +#: wireless/models.py:198 +msgid "wireless link" +msgstr "" + +#: wireless/models.py:199 +msgid "wireless links" +msgstr "" + +#: wireless/models.py:216 wireless/models.py:222 +#, python-brace-format +msgid "{type} is not a wireless interface." +msgstr "" diff --git a/netbox/users/forms/model_forms.py b/netbox/users/forms/model_forms.py index 1c3233f87..b0a43ef22 100644 --- a/netbox/users/forms/model_forms.py +++ b/netbox/users/forms/model_forms.py @@ -386,5 +386,5 @@ class ObjectPermissionForm(BootstrapMixin, forms.ModelForm): model.objects.filter(qs_filter_from_constraints(constraints, tokens)).exists() except FieldError as e: raise forms.ValidationError({ - 'constraints': _('Invalid filter for {model}: {e}').format(model=model, e=e) + 'constraints': _('Invalid filter for {model}: {error}').format(model=model, error=e) }) diff --git a/netbox/users/models.py b/netbox/users/models.py index 80fd0dd09..1f8772704 100644 --- a/netbox/users/models.py +++ b/netbox/users/models.py @@ -169,7 +169,7 @@ class UserConfig(models.Model): elif key in d: err_path = '.'.join(path.split('.')[:i + 1]) raise TypeError( - _("Key '{err_path}' is a leaf node; cannot assign new keys").format(err_path=err_path) + _("Key '{path}' is a leaf node; cannot assign new keys").format(path=err_path) ) else: d = d.setdefault(key, {}) diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 21dbc895a..73d4ca841 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -151,8 +151,12 @@ class ClusterAddDevicesForm(BootstrapMixin, forms.Form): for device in self.cleaned_data.get('devices', []): if device.site != self.cluster.site: raise ValidationError({ - 'devices': _("{} belongs to a different site ({}) than the cluster ({})").format( - device, device.site, self.cluster.site + 'devices': _( + "{device} belongs to a different site ({device_site}) than the cluster ({cluster_site})" + ).format( + device=device, + device_site=device.site, + cluster_site=self.cluster.site ) }) diff --git a/netbox/virtualization/models/clusters.py b/netbox/virtualization/models/clusters.py index 6c8fd0c4b..f8acc4c36 100644 --- a/netbox/virtualization/models/clusters.py +++ b/netbox/virtualization/models/clusters.py @@ -135,10 +135,9 @@ class Cluster(ContactsMixin, PrimaryModel): # If the Cluster is assigned to a Site, verify that all host Devices belong to that Site. if self.pk and self.site: - nonsite_devices = Device.objects.filter(cluster=self).exclude(site=self.site).count() - if nonsite_devices: + if nonsite_devices := Device.objects.filter(cluster=self).exclude(site=self.site).count(): raise ValidationError({ - 'site': _("{} devices are assigned as hosts for this cluster but are not in site {}").format( - nonsite_devices, self.site - ) + 'site': _( + "{count} devices are assigned as hosts for this cluster but are not in site {site}" + ).format(count=nonsite_devices, site=self.site) }) diff --git a/netbox/wireless/models.py b/netbox/wireless/models.py index e8e48eef8..0b114f85f 100644 --- a/netbox/wireless/models.py +++ b/netbox/wireless/models.py @@ -213,14 +213,14 @@ class WirelessLink(WirelessAuthenticationBase, PrimaryModel): if self.interface_a.type not in WIRELESS_IFACE_TYPES: raise ValidationError({ 'interface_a': _( - "{type_display} is not a wireless interface." - ).format(type_display=self.interface_a.get_type_display()) + "{type} is not a wireless interface." + ).format(type=self.interface_a.get_type_display()) }) if self.interface_b.type not in WIRELESS_IFACE_TYPES: raise ValidationError({ 'interface_a': _( - "{type_display} is not a wireless interface." - ).format(type_display=self.interface_b.get_type_display()) + "{type} is not a wireless interface." + ).format(type=self.interface_b.get_type_display()) }) def save(self, *args, **kwargs): From edc4a35296b80d11851be49fbe3abaae8004e841 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 30 Oct 2023 14:36:56 -0400 Subject: [PATCH 060/271] Initial work on #10244: Protection rules (#14097) --- docs/configuration/data-validation.md | 21 +++++ docs/customization/custom-validation.md | 2 + netbox/extras/forms/model_forms.py | 3 +- netbox/extras/signals.py | 31 +++++-- ...mvalidator.py => test_customvalidation.py} | 90 ++++++++++++++++++- netbox/extras/validators.py | 31 ++++++- netbox/netbox/config/parameters.py | 14 ++- netbox/templates/extras/configrevision.html | 4 + 8 files changed, 183 insertions(+), 13 deletions(-) rename netbox/extras/tests/{test_customvalidator.py => test_customvalidation.py} (64%) diff --git a/docs/configuration/data-validation.md b/docs/configuration/data-validation.md index 9ff71758f..1b8263de3 100644 --- a/docs/configuration/data-validation.md +++ b/docs/configuration/data-validation.md @@ -87,3 +87,24 @@ The following colors are supported: * `gray` * `black` * `white` + +--- + +## PROTECTION_RULES + +!!! tip "Dynamic Configuration Parameter" + +This is a mapping of models to [custom validators](../customization/custom-validation.md) against which an object is evaluated immediately prior to its deletion. If validation fails, the object is not deleted. An example is provided below: + +```python +PROTECTION_RULES = { + "dcim.site": [ + { + "status": { + "eq": "decommissioning" + } + }, + "my_plugin.validators.Validator1", + ] +} +``` diff --git a/docs/customization/custom-validation.md b/docs/customization/custom-validation.md index 30198117f..79aa82bc9 100644 --- a/docs/customization/custom-validation.md +++ b/docs/customization/custom-validation.md @@ -26,6 +26,8 @@ The `CustomValidator` class supports several validation types: * `regex`: Application of a [regular expression](https://en.wikipedia.org/wiki/Regular_expression) * `required`: A value must be specified * `prohibited`: A value must _not_ be specified +* `eq`: A value must be equal to the specified value +* `neq`: A value must _not_ be equal to the specified value The `min` and `max` types should be defined for numeric values, whereas `min_length`, `max_length`, and `regex` are suitable for character strings (text values). The `required` and `prohibited` validators may be used for any field, and should be passed a value of `True`. diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 83a346420..fd2ce8f2d 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -491,7 +491,7 @@ class ConfigRevisionForm(BootstrapMixin, forms.ModelForm, metaclass=ConfigFormMe (_('Security'), ('ALLOWED_URL_SCHEMES',)), (_('Banners'), ('BANNER_LOGIN', 'BANNER_MAINTENANCE', 'BANNER_TOP', 'BANNER_BOTTOM')), (_('Pagination'), ('PAGINATE_COUNT', 'MAX_PAGE_SIZE')), - (_('Validation'), ('CUSTOM_VALIDATORS',)), + (_('Validation'), ('CUSTOM_VALIDATORS', 'PROTECTION_RULES')), (_('User Preferences'), ('DEFAULT_USER_PREFERENCES',)), (_('Miscellaneous'), ( 'MAINTENANCE_MODE', 'GRAPHQL_ENABLED', 'CHANGELOG_RETENTION', 'JOB_RETENTION', 'MAPS_URL', @@ -508,6 +508,7 @@ class ConfigRevisionForm(BootstrapMixin, forms.ModelForm, metaclass=ConfigFormMe 'BANNER_TOP': forms.Textarea(attrs={'class': 'font-monospace'}), 'BANNER_BOTTOM': forms.Textarea(attrs={'class': 'font-monospace'}), 'CUSTOM_VALIDATORS': forms.Textarea(attrs={'class': 'font-monospace'}), + 'PROTECTION_RULES': forms.Textarea(attrs={'class': 'font-monospace'}), 'comment': forms.Textarea(), } diff --git a/netbox/extras/signals.py b/netbox/extras/signals.py index d6550309f..8bdaf523c 100644 --- a/netbox/extras/signals.py +++ b/netbox/extras/signals.py @@ -2,8 +2,10 @@ import importlib import logging from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError from django.db.models.signals import m2m_changed, post_save, pre_delete from django.dispatch import receiver, Signal +from django.utils.translation import gettext_lazy as _ from django_prometheus.models import model_deletes, model_inserts, model_updates from extras.validators import CustomValidator @@ -178,11 +180,7 @@ m2m_changed.connect(handle_cf_removed_obj_types, sender=CustomField.content_type # Custom validation # -@receiver(post_clean) -def run_custom_validators(sender, instance, **kwargs): - config = get_config() - model_name = f'{sender._meta.app_label}.{sender._meta.model_name}' - validators = config.CUSTOM_VALIDATORS.get(model_name, []) +def run_validators(instance, validators): for validator in validators: @@ -198,6 +196,29 @@ def run_custom_validators(sender, instance, **kwargs): validator(instance) +@receiver(post_clean) +def run_save_validators(sender, instance, **kwargs): + model_name = f'{sender._meta.app_label}.{sender._meta.model_name}' + validators = get_config().CUSTOM_VALIDATORS.get(model_name, []) + + run_validators(instance, validators) + + +@receiver(pre_delete) +def run_delete_validators(sender, instance, **kwargs): + model_name = f'{sender._meta.app_label}.{sender._meta.model_name}' + validators = get_config().PROTECTION_RULES.get(model_name, []) + + try: + run_validators(instance, validators) + except ValidationError as e: + raise AbortRequest( + _("Deletion is prevented by a protection rule: {message}").format( + message=e + ) + ) + + # # Dynamic configuration # diff --git a/netbox/extras/tests/test_customvalidator.py b/netbox/extras/tests/test_customvalidation.py similarity index 64% rename from netbox/extras/tests/test_customvalidator.py rename to netbox/extras/tests/test_customvalidation.py index 0fe507b67..d74ad599b 100644 --- a/netbox/extras/tests/test_customvalidator.py +++ b/netbox/extras/tests/test_customvalidation.py @@ -1,10 +1,13 @@ from django.conf import settings from django.core.exceptions import ValidationError +from django.db import transaction from django.test import TestCase, override_settings from ipam.models import ASN, RIR +from dcim.choices import SiteStatusChoices from dcim.models import Site from extras.validators import CustomValidator +from utilities.exceptions import AbortRequest class MyValidator(CustomValidator): @@ -14,6 +17,20 @@ class MyValidator(CustomValidator): self.fail("Name must be foo!") +eq_validator = CustomValidator({ + 'asn': { + 'eq': 100 + } +}) + + +neq_validator = CustomValidator({ + 'asn': { + 'neq': 100 + } +}) + + min_validator = CustomValidator({ 'asn': { 'min': 65000 @@ -77,6 +94,18 @@ class CustomValidatorTest(TestCase): validator = settings.CUSTOM_VALIDATORS['ipam.asn'][0] self.assertIsInstance(validator, CustomValidator) + @override_settings(CUSTOM_VALIDATORS={'ipam.asn': [eq_validator]}) + def test_eq(self): + ASN(asn=100, rir=RIR.objects.first()).clean() + with self.assertRaises(ValidationError): + ASN(asn=99, rir=RIR.objects.first()).clean() + + @override_settings(CUSTOM_VALIDATORS={'ipam.asn': [neq_validator]}) + def test_neq(self): + ASN(asn=99, rir=RIR.objects.first()).clean() + with self.assertRaises(ValidationError): + ASN(asn=100, rir=RIR.objects.first()).clean() + @override_settings(CUSTOM_VALIDATORS={'ipam.asn': [min_validator]}) def test_min(self): with self.assertRaises(ValidationError): @@ -147,7 +176,7 @@ class CustomValidatorConfigTest(TestCase): @override_settings( CUSTOM_VALIDATORS={ 'dcim.site': ( - 'extras.tests.test_customvalidator.MyValidator', + 'extras.tests.test_customvalidation.MyValidator', ) } ) @@ -159,3 +188,62 @@ class CustomValidatorConfigTest(TestCase): Site(name='foo', slug='foo').clean() with self.assertRaises(ValidationError): Site(name='bar', slug='bar').clean() + + +class ProtectionRulesConfigTest(TestCase): + + @override_settings( + PROTECTION_RULES={ + 'dcim.site': [ + {'status': {'eq': SiteStatusChoices.STATUS_DECOMMISSIONING}} + ] + } + ) + def test_plain_data(self): + """ + Test custom validator configuration using plain data (as opposed to a CustomValidator + class) + """ + # Create a site with a protected status + site = Site(name='Site 1', slug='site-1', status=SiteStatusChoices.STATUS_ACTIVE) + site.save() + + # Try to delete it + with self.assertRaises(AbortRequest): + with transaction.atomic(): + site.delete() + + # Change its status to an allowed value + site.status = SiteStatusChoices.STATUS_DECOMMISSIONING + site.save() + + # Deletion should now succeed + site.delete() + + @override_settings( + PROTECTION_RULES={ + 'dcim.site': ( + 'extras.tests.test_customvalidation.MyValidator', + ) + } + ) + def test_dotted_path(self): + """ + Test custom validator configuration using a dotted path (string) reference to a + CustomValidator class. + """ + # Create a site with a protected name + site = Site(name='bar', slug='bar') + site.save() + + # Try to delete it + with self.assertRaises(AbortRequest): + with transaction.atomic(): + site.delete() + + # Change the name to an allowed value + site.name = site.slug = 'foo' + site.save() + + # Deletion should now succeed + site.delete() diff --git a/netbox/extras/validators.py b/netbox/extras/validators.py index 686c9b032..98b4fd88d 100644 --- a/netbox/extras/validators.py +++ b/netbox/extras/validators.py @@ -1,15 +1,38 @@ -from django.core.exceptions import ValidationError from django.core import validators +from django.core.exceptions import ValidationError +from django.utils.translation import gettext_lazy as _ # NOTE: As this module may be imported by configuration.py, we cannot import # anything from NetBox itself. +class IsEqualValidator(validators.BaseValidator): + """ + Employed by CustomValidator to require a specific value. + """ + message = _("Ensure this value is equal to %(limit_value)s.") + code = "is_equal" + + def compare(self, a, b): + return a != b + + +class IsNotEqualValidator(validators.BaseValidator): + """ + Employed by CustomValidator to exclude a specific value. + """ + message = _("Ensure this value does not equal %(limit_value)s.") + code = "is_not_equal" + + def compare(self, a, b): + return a == b + + class IsEmptyValidator: """ Employed by CustomValidator to enforce required fields. """ - message = "This field must be empty." + message = _("This field must be empty.") code = 'is_empty' def __init__(self, enforce=True): @@ -24,7 +47,7 @@ class IsNotEmptyValidator: """ Employed by CustomValidator to enforce prohibited fields. """ - message = "This field must not be empty." + message = _("This field must not be empty.") code = 'not_empty' def __init__(self, enforce=True): @@ -50,6 +73,8 @@ class CustomValidator: :param validation_rules: A dictionary mapping object attributes to validation rules """ VALIDATORS = { + 'eq': IsEqualValidator, + 'neq': IsNotEqualValidator, 'min': validators.MinValueValidator, 'max': validators.MaxValueValidator, 'min_length': validators.MinLengthValidator, diff --git a/netbox/netbox/config/parameters.py b/netbox/netbox/config/parameters.py index 31c4f693a..0cdf8a8d2 100644 --- a/netbox/netbox/config/parameters.py +++ b/netbox/netbox/config/parameters.py @@ -152,9 +152,17 @@ PARAMS = ( description=_("Custom validation rules (JSON)"), field=forms.JSONField, field_kwargs={ - 'widget': forms.Textarea( - attrs={'class': 'vLargeTextField'} - ), + 'widget': forms.Textarea(), + }, + ), + ConfigParam( + name='PROTECTION_RULES', + label=_('Protection rules'), + default={}, + description=_("Deletion protection rules (JSON)"), + field=forms.JSONField, + field_kwargs={ + 'widget': forms.Textarea(), }, ), diff --git a/netbox/templates/extras/configrevision.html b/netbox/templates/extras/configrevision.html index 4f2abf30b..a880865c3 100644 --- a/netbox/templates/extras/configrevision.html +++ b/netbox/templates/extras/configrevision.html @@ -151,6 +151,10 @@ {% trans "Custom validators" %} {{ object.data.CUSTOM_VALIDATORS|placeholder }} + + {% trans "Protection rules" %} + {{ object.data.PROTECTION_RULES|placeholder }} +
      From 7323668dd0a5a1452a7e94c2f43c9bce60383755 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 31 Oct 2023 08:34:57 -0400 Subject: [PATCH 061/271] Closes #13334: Record error message on failed jobs (#14106) --- netbox/core/api/serializers.py | 2 +- netbox/core/jobs.py | 2 +- .../migrations/0006_job_add_error_field.py | 18 ++++++++++++++++++ netbox/core/models/jobs.py | 9 ++++++++- netbox/core/tables/jobs.py | 2 +- netbox/extras/management/commands/runscript.py | 2 +- netbox/extras/reports.py | 6 +++--- netbox/extras/scripts.py | 2 +- netbox/templates/core/job.html | 6 ++++++ 9 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 netbox/core/migrations/0006_job_add_error_field.py diff --git a/netbox/core/api/serializers.py b/netbox/core/api/serializers.py index 0d743d952..4ae426df5 100644 --- a/netbox/core/api/serializers.py +++ b/netbox/core/api/serializers.py @@ -69,5 +69,5 @@ class JobSerializer(BaseModelSerializer): model = Job fields = [ 'id', 'url', 'display', 'object_type', 'object_id', 'name', 'status', 'created', 'scheduled', 'interval', - 'started', 'completed', 'user', 'data', 'job_id', + 'started', 'completed', 'user', 'data', 'error', 'job_id', ] diff --git a/netbox/core/jobs.py b/netbox/core/jobs.py index d25981920..32b546b20 100644 --- a/netbox/core/jobs.py +++ b/netbox/core/jobs.py @@ -25,7 +25,7 @@ def sync_datasource(job, *args, **kwargs): job.terminate() except Exception as e: - job.terminate(status=JobStatusChoices.STATUS_ERRORED) + job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=str(e)) DataSource.objects.filter(pk=datasource.pk).update(status=DataSourceStatusChoices.FAILED) if type(e) in (SyncError, JobTimeoutException): logging.error(e) diff --git a/netbox/core/migrations/0006_job_add_error_field.py b/netbox/core/migrations/0006_job_add_error_field.py new file mode 100644 index 000000000..2927db4c4 --- /dev/null +++ b/netbox/core/migrations/0006_job_add_error_field.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.6 on 2023-10-23 20:28 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0005_job_created_auto_now'), + ] + + operations = [ + migrations.AddField( + model_name='job', + name='error', + field=models.TextField(blank=True, editable=False), + ), + ] diff --git a/netbox/core/models/jobs.py b/netbox/core/models/jobs.py index 61b0e64fa..4e9a93bfb 100644 --- a/netbox/core/models/jobs.py +++ b/netbox/core/models/jobs.py @@ -92,6 +92,11 @@ class Job(models.Model): null=True, blank=True ) + error = models.TextField( + verbose_name=_('error'), + editable=False, + blank=True + ) job_id = models.UUIDField( verbose_name=_('job ID'), unique=True @@ -158,7 +163,7 @@ class Job(models.Model): # Handle webhooks self.trigger_webhooks(event=EVENT_JOB_START) - def terminate(self, status=JobStatusChoices.STATUS_COMPLETED): + def terminate(self, status=JobStatusChoices.STATUS_COMPLETED, error=None): """ Mark the job as completed, optionally specifying a particular termination status. """ @@ -168,6 +173,8 @@ class Job(models.Model): # Mark the job as completed self.status = status + if error: + self.error = error self.completed = timezone.now() self.save() diff --git a/netbox/core/tables/jobs.py b/netbox/core/tables/jobs.py index 32ca67f7f..3388aee19 100644 --- a/netbox/core/tables/jobs.py +++ b/netbox/core/tables/jobs.py @@ -47,7 +47,7 @@ class JobTable(NetBoxTable): model = Job fields = ( 'pk', 'id', 'object_type', 'object', 'name', 'status', 'created', 'scheduled', 'interval', 'started', - 'completed', 'user', 'job_id', + 'completed', 'user', 'error', 'job_id', ) default_columns = ( 'pk', 'id', 'object_type', 'object', 'name', 'status', 'created', 'started', 'completed', 'user', diff --git a/netbox/extras/management/commands/runscript.py b/netbox/extras/management/commands/runscript.py index d9a9f41ae..3cf70281c 100644 --- a/netbox/extras/management/commands/runscript.py +++ b/netbox/extras/management/commands/runscript.py @@ -59,7 +59,7 @@ class Command(BaseCommand): logger.error(f"Exception raised during script execution: {e}") clear_webhooks.send(request) job.data = ScriptOutputSerializer(script).data - job.terminate(status=JobStatusChoices.STATUS_ERRORED) + job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=str(e)) logger.info(f"Script completed in {job.duration}") diff --git a/netbox/extras/reports.py b/netbox/extras/reports.py index cc279a49a..c8a13fe15 100644 --- a/netbox/extras/reports.py +++ b/netbox/extras/reports.py @@ -40,8 +40,8 @@ def run_report(job, *args, **kwargs): try: report.run(job) - except Exception: - job.terminate(status=JobStatusChoices.STATUS_ERRORED) + except Exception as e: + job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=str(e)) logging.error(f"Error during execution of report {job.name}") finally: # Schedule the next job if an interval has been set @@ -230,7 +230,7 @@ class Report(object): stacktrace = traceback.format_exc() self.log_failure(None, f"An exception occurred: {type(e).__name__}: {e}
      {stacktrace}
      ") logger.error(f"Exception raised during report execution: {e}") - job.terminate(status=JobStatusChoices.STATUS_ERRORED) + job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=str(e)) # Perform any post-run tasks self.post_run() diff --git a/netbox/extras/scripts.py b/netbox/extras/scripts.py index e93326ddc..df75200e6 100644 --- a/netbox/extras/scripts.py +++ b/netbox/extras/scripts.py @@ -519,7 +519,7 @@ def run_script(data, request, job, commit=True, **kwargs): logger.error(f"Exception raised during script execution: {e}") script.log_info("Database changes have been reverted due to error.") job.data = ScriptOutputSerializer(script).data - job.terminate(status=JobStatusChoices.STATUS_ERRORED) + job.terminate(status=JobStatusChoices.STATUS_ERRORED, error=str(e)) clear_webhooks.send(request) logger.info(f"Script completed in {job.duration}") diff --git a/netbox/templates/core/job.html b/netbox/templates/core/job.html index 1fe3862cd..deb651739 100644 --- a/netbox/templates/core/job.html +++ b/netbox/templates/core/job.html @@ -35,6 +35,12 @@ {% trans "Status" %} {% badge object.get_status_display object.get_status_color %} + {% if object.error %} + + {% trans "Error" %} + {{ object.error }} + + {% endif %} {% trans "Created By" %} {{ object.user|placeholder }} From 77208bf5f3af6e7f2500baf676a127f07fea319a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 31 Oct 2023 08:41:24 -0400 Subject: [PATCH 062/271] Fix migrations --- ...{0006_job_add_error_field.py => 0007_job_add_error_field.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename netbox/core/migrations/{0006_job_add_error_field.py => 0007_job_add_error_field.py} (85%) diff --git a/netbox/core/migrations/0006_job_add_error_field.py b/netbox/core/migrations/0007_job_add_error_field.py similarity index 85% rename from netbox/core/migrations/0006_job_add_error_field.py rename to netbox/core/migrations/0007_job_add_error_field.py index 2927db4c4..e2e173bfd 100644 --- a/netbox/core/migrations/0006_job_add_error_field.py +++ b/netbox/core/migrations/0007_job_add_error_field.py @@ -6,7 +6,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('core', '0005_job_created_auto_now'), + ('core', '0006_datasource_type_remove_choices'), ] operations = [ From c2d1988cb3f74f8a4f7c6005d32caadc69164610 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 1 Nov 2023 11:56:14 -0400 Subject: [PATCH 063/271] Closes #14035: Order global search results of equivalent weight by value (#14140) --- .../migrations/0099_cachedvalue_ordering.py | 17 +++++++++++++++++ netbox/extras/models/search.py | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 netbox/extras/migrations/0099_cachedvalue_ordering.py diff --git a/netbox/extras/migrations/0099_cachedvalue_ordering.py b/netbox/extras/migrations/0099_cachedvalue_ordering.py new file mode 100644 index 000000000..242ffd983 --- /dev/null +++ b/netbox/extras/migrations/0099_cachedvalue_ordering.py @@ -0,0 +1,17 @@ +# Generated by Django 4.2.6 on 2023-10-30 14:04 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('extras', '0098_webhook_custom_field_data_webhook_tags'), + ] + + operations = [ + migrations.AlterModelOptions( + name='cachedvalue', + options={'ordering': ('weight', 'object_type', 'value', 'object_id')}, + ), + ] diff --git a/netbox/extras/models/search.py b/netbox/extras/models/search.py index debe4c648..39ff80215 100644 --- a/netbox/extras/models/search.py +++ b/netbox/extras/models/search.py @@ -50,7 +50,7 @@ class CachedValue(models.Model): ) class Meta: - ordering = ('weight', 'object_type', 'object_id') + ordering = ('weight', 'object_type', 'value', 'object_id') verbose_name = _('cached value') verbose_name_plural = _('cached values') From 944008d4753194276908b54dc7f3e0952ec7a4f6 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 1 Nov 2023 13:47:14 -0400 Subject: [PATCH 064/271] Closes #12135: Prevent the deletion of interfaces with children (#14091) * Closes #12135: Prevent the deletion of interfaces with children * Change PROTECT to RESTRICT * Extend handle_protectederror() to also handle RestrictedError * Fix string translation * Update migrations * Support bulk removal of parent interfaces via UI if all children are included * Add support for the bulk deletion of restricted objects via REST API --- docs/models/dcim/interface.md | 3 ++ docs/models/virtualization/vminterface.md | 3 ++ netbox/dcim/api/views.py | 5 ++++ .../0183_protect_child_interfaces.py | 19 ++++++++++++ netbox/dcim/models/device_components.py | 2 +- netbox/dcim/tests/test_api.py | 27 +++++++++++++++++ netbox/dcim/tests/test_views.py | 30 +++++++++++++++++++ netbox/dcim/views.py | 5 ++-- netbox/netbox/api/viewsets/__init__.py | 9 ++++-- netbox/netbox/api/viewsets/mixins.py | 10 +++++-- netbox/netbox/views/generic/bulk_views.py | 17 ++++++----- netbox/netbox/views/generic/object_views.py | 6 ++-- netbox/utilities/error_handlers.py | 20 +++++++++---- netbox/virtualization/api/views.py | 5 ++++ .../0037_protect_child_interfaces.py | 19 ++++++++++++ netbox/virtualization/tests/test_api.py | 26 ++++++++++++++++ netbox/virtualization/tests/test_views.py | 29 ++++++++++++++++++ netbox/virtualization/views.py | 5 ++-- 18 files changed, 214 insertions(+), 26 deletions(-) create mode 100644 netbox/dcim/migrations/0183_protect_child_interfaces.py create mode 100644 netbox/virtualization/migrations/0037_protect_child_interfaces.py diff --git a/docs/models/dcim/interface.md b/docs/models/dcim/interface.md index 42b570964..3667dabd5 100644 --- a/docs/models/dcim/interface.md +++ b/docs/models/dcim/interface.md @@ -77,6 +77,9 @@ If selected, this component will be treated as if a cable has been connected. Virtual interfaces can be bound to a physical parent interface. This is helpful for modeling virtual interfaces which employ encapsulation on a physical interface, such as an 802.1Q VLAN-tagged subinterface. +!!! note + An interface with one or more child interfaces assigned cannot be deleted until all its child interfaces have been deleted or reassigned. + ### Bridged Interface Interfaces can be bridged to other interfaces on a device in two manners: symmetric or grouped. diff --git a/docs/models/virtualization/vminterface.md b/docs/models/virtualization/vminterface.md index 264fb95ba..d923bdd5d 100644 --- a/docs/models/virtualization/vminterface.md +++ b/docs/models/virtualization/vminterface.md @@ -16,6 +16,9 @@ The interface's name. Must be unique to the assigned VM. Identifies the parent interface of a subinterface (e.g. used to employ encapsulation). +!!! note + An interface with one or more child interfaces assigned cannot be deleted until all its child interfaces have been deleted or reassigned. + ### Bridged Interface An interface on the same VM with which this interface is bridged. diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index 80a991736..a3e532f0b 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -24,6 +24,7 @@ from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin from netbox.constants import NESTED_SERIALIZER_PREFIX from utilities.api import get_serializer_for_model +from utilities.query_functions import CollateAsChar from utilities.utils import count_related from virtualization.models import VirtualMachine from . import serializers @@ -505,6 +506,10 @@ class InterfaceViewSet(PathEndpointMixin, NetBoxModelViewSet): filterset_class = filtersets.InterfaceFilterSet brief_prefetch_fields = ['device'] + def get_bulk_destroy_queryset(self): + # Ensure child interfaces are deleted prior to their parents + return self.get_queryset().order_by('device', 'parent', CollateAsChar('_name')) + class FrontPortViewSet(PassThroughPortMixin, NetBoxModelViewSet): queryset = FrontPort.objects.prefetch_related( diff --git a/netbox/dcim/migrations/0183_protect_child_interfaces.py b/netbox/dcim/migrations/0183_protect_child_interfaces.py new file mode 100644 index 000000000..ca695f4bd --- /dev/null +++ b/netbox/dcim/migrations/0183_protect_child_interfaces.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.6 on 2023-10-20 11:48 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0182_devicetype_exclude_from_utilization'), + ] + + operations = [ + migrations.AlterField( + model_name='interface', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT, related_name='child_interfaces', to='dcim.interface'), + ), + ] diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 639f8aadb..94568459e 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -537,7 +537,7 @@ class BaseInterface(models.Model): ) parent = models.ForeignKey( to='self', - on_delete=models.SET_NULL, + on_delete=models.RESTRICT, related_name='child_interfaces', null=True, blank=True, diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 1ce362963..d3211a75f 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -1607,6 +1607,33 @@ class InterfaceTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase }, ] + def test_bulk_delete_child_interfaces(self): + interface1 = Interface.objects.get(name='Interface 1') + device = interface1.device + self.add_permissions('dcim.delete_interface') + + # Create a child interface + child = Interface.objects.create( + device=device, + name='Interface 1A', + type=InterfaceTypeChoices.TYPE_VIRTUAL, + parent=interface1 + ) + self.assertEqual(device.interfaces.count(), 4) + + # Attempt to delete only the parent interface + url = self._get_detail_url(interface1) + self.client.delete(url, **self.header) + self.assertEqual(device.interfaces.count(), 4) # Parent was not deleted + + # Attempt to bulk delete parent & child together + data = [ + {"id": interface1.pk}, + {"id": child.pk}, + ] + self.client.delete(self._get_list_url(), data, format='json', **self.header) + self.assertEqual(device.interfaces.count(), 2) # Child & parent were both deleted + class FrontPortTest(APIViewTestCases.APIViewTestCase): model = FrontPort diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index a6981451f..88e0d44f2 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -2531,6 +2531,36 @@ class InterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): response = self.client.get(reverse('dcim:interface_trace', kwargs={'pk': interface1.pk})) self.assertHttpStatus(response, 200) + def test_bulk_delete_child_interfaces(self): + interface1 = Interface.objects.get(name='Interface 1') + device = interface1.device + self.add_permissions('dcim.delete_interface') + + # Create a child interface + child = Interface.objects.create( + device=device, + name='Interface 1A', + type=InterfaceTypeChoices.TYPE_VIRTUAL, + parent=interface1 + ) + self.assertEqual(device.interfaces.count(), 6) + + # Attempt to delete only the parent interface + data = { + 'confirm': True, + } + self.client.post(self._get_url('delete', interface1), data) + self.assertEqual(device.interfaces.count(), 6) # Parent was not deleted + + # Attempt to bulk delete parent & child together + data = { + 'pk': [interface1.pk, child.pk], + 'confirm': True, + '_confirm': True, # Form button + } + self.client.post(self._get_url('bulk_delete'), data) + self.assertEqual(device.interfaces.count(), 4) # Child & parent were both deleted + class FrontPortTestCase(ViewTestCases.DeviceComponentViewTestCase): model = FrontPort diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 0f5768173..be0d6bcbb 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1,5 +1,4 @@ import traceback -from collections import defaultdict from django.contrib import messages from django.contrib.contenttypes.models import ContentType @@ -26,6 +25,7 @@ from tenancy.views import ObjectContactsView from utilities.forms import ConfirmationForm from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.permissions import get_permission_for_model +from utilities.query_functions import CollateAsChar from utilities.utils import count_related from utilities.views import GetReturnURLMixin, ObjectPermissionRequiredMixin, ViewTab, register_model_view from virtualization.models import VirtualMachine @@ -2562,7 +2562,8 @@ class InterfaceBulkDisconnectView(BulkDisconnectView): class InterfaceBulkDeleteView(generic.BulkDeleteView): - queryset = Interface.objects.all() + # Ensure child interfaces are deleted prior to their parents + queryset = Interface.objects.order_by('device', 'parent', CollateAsChar('_name')) filterset = filtersets.InterfaceFilterSet table = tables.InterfaceTable diff --git a/netbox/netbox/api/viewsets/__init__.py b/netbox/netbox/api/viewsets/__init__.py index c6794bb61..522bcf77b 100644 --- a/netbox/netbox/api/viewsets/__init__.py +++ b/netbox/netbox/api/viewsets/__init__.py @@ -2,7 +2,7 @@ import logging from django.core.exceptions import ObjectDoesNotExist, PermissionDenied from django.db import transaction -from django.db.models import ProtectedError +from django.db.models import ProtectedError, RestrictedError from django_pglocks import advisory_lock from netbox.constants import ADVISORY_LOCK_KEYS from rest_framework import mixins as drf_mixins @@ -91,8 +91,11 @@ class NetBoxModelViewSet( try: return super().dispatch(request, *args, **kwargs) - except ProtectedError as e: - protected_objects = list(e.protected_objects) + except (ProtectedError, RestrictedError) as e: + if type(e) is ProtectedError: + protected_objects = list(e.protected_objects) + else: + protected_objects = list(e.restricted_objects) msg = f'Unable to delete object. {len(protected_objects)} dependent objects were found: ' msg += ', '.join([f'{obj} ({obj.pk})' for obj in protected_objects]) logger.warning(msg) diff --git a/netbox/netbox/api/viewsets/mixins.py b/netbox/netbox/api/viewsets/mixins.py index fde486fe9..7b6c00843 100644 --- a/netbox/netbox/api/viewsets/mixins.py +++ b/netbox/netbox/api/viewsets/mixins.py @@ -137,11 +137,14 @@ class BulkUpdateModelMixin: } ] """ + def get_bulk_update_queryset(self): + return self.get_queryset() + def bulk_update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) serializer = BulkOperationSerializer(data=request.data, many=True) serializer.is_valid(raise_exception=True) - qs = self.get_queryset().filter( + qs = self.get_bulk_update_queryset().filter( pk__in=[o['id'] for o in serializer.data] ) @@ -184,10 +187,13 @@ class BulkDestroyModelMixin: {"id": 456} ] """ + def get_bulk_destroy_queryset(self): + return self.get_queryset() + def bulk_destroy(self, request, *args, **kwargs): serializer = BulkOperationSerializer(data=request.data, many=True) serializer.is_valid(raise_exception=True) - qs = self.get_queryset().filter( + qs = self.get_bulk_destroy_queryset().filter( pk__in=[o['id'] for o in serializer.data] ) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 676e3f5af..fbe3aa2ba 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -7,7 +7,7 @@ from django.contrib.contenttypes.fields import GenericRel from django.contrib.contenttypes.models import ContentType from django.core.exceptions import FieldDoesNotExist, ObjectDoesNotExist, ValidationError from django.db import transaction, IntegrityError -from django.db.models import ManyToManyField, ProtectedError +from django.db.models import ManyToManyField, ProtectedError, RestrictedError from django.db.models.fields.reverse_related import ManyToManyRel from django.forms import HiddenInput, ModelMultipleChoiceField, MultipleHiddenInput from django.http import HttpResponse @@ -798,14 +798,15 @@ class BulkDeleteView(GetReturnURLMixin, BaseMultiObjectView): queryset = self.queryset.filter(pk__in=pk_list) deleted_count = queryset.count() try: - for obj in queryset: - # Take a snapshot of change-logged models - if hasattr(obj, 'snapshot'): - obj.snapshot() - obj.delete() + with transaction.atomic(): + for obj in queryset: + # Take a snapshot of change-logged models + if hasattr(obj, 'snapshot'): + obj.snapshot() + obj.delete() - except ProtectedError as e: - logger.info("Caught ProtectedError while attempting to delete objects") + except (ProtectedError, RestrictedError) as e: + logger.info(f"Caught {type(e)} while attempting to delete objects") handle_protectederror(queryset, request, e) return redirect(self.get_return_url(request)) diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 99d8ff540..7c737aaf0 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -3,7 +3,7 @@ from copy import deepcopy from django.contrib import messages from django.db import transaction -from django.db.models import ProtectedError +from django.db.models import ProtectedError, RestrictedError from django.shortcuts import redirect, render from django.urls import reverse from django.utils.html import escape @@ -374,8 +374,8 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): try: obj.delete() - except ProtectedError as e: - logger.info("Caught ProtectedError while attempting to delete object") + except (ProtectedError, RestrictedError) as e: + logger.info(f"Caught {type(e)} while attempting to delete objects") handle_protectederror([obj], request, e) return redirect(obj.get_absolute_url()) diff --git a/netbox/utilities/error_handlers.py b/netbox/utilities/error_handlers.py index 1d3bdbafd..9af12ac2e 100644 --- a/netbox/utilities/error_handlers.py +++ b/netbox/utilities/error_handlers.py @@ -1,16 +1,26 @@ from django.contrib import messages +from django.db.models import ProtectedError, RestrictedError from django.utils.html import escape from django.utils.safestring import mark_safe +from django.utils.translation import gettext_lazy as _ def handle_protectederror(obj_list, request, e): """ - Generate a user-friendly error message in response to a ProtectedError exception. + Generate a user-friendly error message in response to a ProtectedError or RestrictedError exception. """ - protected_objects = list(e.protected_objects) - protected_count = len(protected_objects) if len(protected_objects) <= 50 else 'More than 50' - err_message = f"Unable to delete {', '.join(str(obj) for obj in obj_list)}. " \ - f"{protected_count} dependent objects were found: " + if type(e) is ProtectedError: + protected_objects = list(e.protected_objects) + elif type(e) is RestrictedError: + protected_objects = list(e.restricted_objects) + else: + raise e + + # Formulate the error message + err_message = _("Unable to delete {objects}. {count} dependent objects were found: ").format( + objects=', '.join(str(obj) for obj in obj_list), + count=len(protected_objects) if len(protected_objects) <= 50 else _('More than 50') + ) # Append dependent objects to error message dependent_objects = [] diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index 5b9cf4117..04e8f2167 100644 --- a/netbox/virtualization/api/views.py +++ b/netbox/virtualization/api/views.py @@ -3,6 +3,7 @@ from rest_framework.routers import APIRootView from dcim.models import Device from extras.api.mixins import ConfigContextQuerySetMixin from netbox.api.viewsets import NetBoxModelViewSet +from utilities.query_functions import CollateAsChar from utilities.utils import count_related from virtualization import filtersets from virtualization.models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface @@ -87,3 +88,7 @@ class VMInterfaceViewSet(NetBoxModelViewSet): serializer_class = serializers.VMInterfaceSerializer filterset_class = filtersets.VMInterfaceFilterSet brief_prefetch_fields = ['virtual_machine'] + + def get_bulk_destroy_queryset(self): + # Ensure child interfaces are deleted prior to their parents + return self.get_queryset().order_by('virtual_machine', 'parent', CollateAsChar('_name')) diff --git a/netbox/virtualization/migrations/0037_protect_child_interfaces.py b/netbox/virtualization/migrations/0037_protect_child_interfaces.py new file mode 100644 index 000000000..ab6cf0cb3 --- /dev/null +++ b/netbox/virtualization/migrations/0037_protect_child_interfaces.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.6 on 2023-10-20 11:48 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('virtualization', '0036_virtualmachine_config_template'), + ] + + operations = [ + migrations.AlterField( + model_name='vminterface', + name='parent', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.RESTRICT, related_name='child_interfaces', to='virtualization.vminterface'), + ), + ] diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index b2ae68860..3fb46fbb9 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -293,3 +293,29 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase): 'vrf': vrfs[2].pk, }, ] + + def test_bulk_delete_child_interfaces(self): + interface1 = VMInterface.objects.get(name='Interface 1') + virtual_machine = interface1.virtual_machine + self.add_permissions('virtualization.delete_vminterface') + + # Create a child interface + child = VMInterface.objects.create( + virtual_machine=virtual_machine, + name='Interface 1A', + parent=interface1 + ) + self.assertEqual(virtual_machine.interfaces.count(), 4) + + # Attempt to delete only the parent interface + url = self._get_detail_url(interface1) + self.client.delete(url, **self.header) + self.assertEqual(virtual_machine.interfaces.count(), 4) # Parent was not deleted + + # Attempt to bulk delete parent & child together + data = [ + {"id": interface1.pk}, + {"id": child.pk}, + ] + self.client.delete(self._get_list_url(), data, format='json', **self.header) + self.assertEqual(virtual_machine.interfaces.count(), 2) # Child & parent were both deleted diff --git a/netbox/virtualization/tests/test_views.py b/netbox/virtualization/tests/test_views.py index a5d831d7e..f47c386e9 100644 --- a/netbox/virtualization/tests/test_views.py +++ b/netbox/virtualization/tests/test_views.py @@ -374,3 +374,32 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): 'untagged_vlan': vlans[0].pk, 'tagged_vlans': [v.pk for v in vlans[1:4]], } + + def test_bulk_delete_child_interfaces(self): + interface1 = VMInterface.objects.get(name='Interface 1') + virtual_machine = interface1.virtual_machine + self.add_permissions('virtualization.delete_vminterface') + + # Create a child interface + child = VMInterface.objects.create( + virtual_machine=virtual_machine, + name='Interface 1A', + parent=interface1 + ) + self.assertEqual(virtual_machine.interfaces.count(), 4) + + # Attempt to delete only the parent interface + data = { + 'confirm': True, + } + self.client.post(self._get_url('delete', interface1), data) + self.assertEqual(virtual_machine.interfaces.count(), 4) # Parent was not deleted + + # Attempt to bulk delete parent & child together + data = { + 'pk': [interface1.pk, child.pk], + 'confirm': True, + '_confirm': True, # Form button + } + self.client.post(self._get_url('bulk_delete'), data) + self.assertEqual(virtual_machine.interfaces.count(), 2) # Child & parent were both deleted diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 798d1fc4d..e8782243f 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -1,5 +1,4 @@ import traceback -from collections import defaultdict from django.contrib import messages from django.db import transaction @@ -19,6 +18,7 @@ from ipam.tables import InterfaceVLANTable from netbox.constants import DEFAULT_ACTION_PERMISSIONS from netbox.views import generic from tenancy.views import ObjectContactsView +from utilities.query_functions import CollateAsChar from utilities.utils import count_related from utilities.views import ViewTab, register_model_view from . import filtersets, forms, tables @@ -550,7 +550,8 @@ class VMInterfaceBulkRenameView(generic.BulkRenameView): class VMInterfaceBulkDeleteView(generic.BulkDeleteView): - queryset = VMInterface.objects.all() + # Ensure child interfaces are deleted prior to their parents + queryset = VMInterface.objects.order_by('virtual_machine', 'parent', CollateAsChar('_name')) filterset = filtersets.VMInterfaceFilterSet table = tables.VMInterfaceTable From f6338abf14ae1e43e213b13df0293931cb2543c0 Mon Sep 17 00:00:00 2001 From: "Jamie (Bear) Murphy" <1613241+ITJamie@users.noreply.github.com> Date: Wed, 1 Nov 2023 19:13:45 +0000 Subject: [PATCH 065/271] Closes #13690: List all objects to be deleted (#14089) * show objects that would be deleted by cascade * some items were not showing (eg ips on devices) * dont include the item being deleted in the list of related items * Revert "dont include the item being deleted in the list of related items" This reverts commit 298a7860b20c2fd90e887c66c4f196460097e71e. * cleanup - migrate code to use collector directly instead of the NestedObjects wrapper from admin.utils - adjust object names and text output * requested adjustments * remove comma from end of list * linting * refactor, add accordion * migrate to defaultdict, use title for capitalisation of accordian titles * Misc cleanup --------- Co-authored-by: Jeremy Stretch --- netbox/netbox/views/generic/object_views.py | 28 ++++++++++++++++- netbox/templates/htmx/delete_form.html | 34 +++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 7c737aaf0..99508c9e3 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -1,9 +1,11 @@ import logging +from collections import defaultdict from copy import deepcopy from django.contrib import messages -from django.db import transaction +from django.db import router, transaction from django.db.models import ProtectedError, RestrictedError +from django.db.models.deletion import Collector from django.shortcuts import redirect, render from django.urls import reverse from django.utils.html import escape @@ -320,6 +322,27 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): def get_required_permission(self): return get_permission_for_model(self.queryset.model, 'delete') + def _get_dependent_objects(self, obj): + """ + Returns a dictionary mapping of dependent objects (organized by model) which will be deleted as a result of + deleting the requested object. + + Args: + obj: The object to return dependent objects for + """ + using = router.db_for_write(obj._meta.model) + collector = Collector(using=using) + collector.collect([obj]) + + # Compile a mapping of models to instances + dependent_objects = defaultdict(list) + for model, instance in collector.instances_with_model(): + # Omit the root object + if instance != obj: + dependent_objects[model].append(instance) + + return dict(dependent_objects) + # # Request handlers # @@ -333,6 +356,7 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): """ obj = self.get_object(**kwargs) form = ConfirmationForm(initial=request.GET) + dependent_objects = self._get_dependent_objects(obj) # If this is an HTMX request, return only the rendered deletion form as modal content if is_htmx(request): @@ -343,6 +367,7 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): 'object_type': self.queryset.model._meta.verbose_name, 'form': form, 'form_url': form_url, + 'dependent_objects': dependent_objects, **self.get_extra_context(request, obj), }) @@ -350,6 +375,7 @@ class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): 'object': obj, 'form': form, 'return_url': self.get_return_url(request, obj), + 'dependent_objects': dependent_objects, **self.get_extra_context(request, obj), }) diff --git a/netbox/templates/htmx/delete_form.html b/netbox/templates/htmx/delete_form.html index 15f08ebfd..80aec2c82 100644 --- a/netbox/templates/htmx/delete_form.html +++ b/netbox/templates/htmx/delete_form.html @@ -12,6 +12,40 @@ Are you sure you want to delete {{ object_type }} {{ object }}? {% endblocktrans %}

      + {% if dependent_objects %} +

      + {% trans "The following objects will be deleted as a result of this action." %} +

      +
      + {% for model, instances in dependent_objects.items %} +
      +

      + +

      +
      +
      +
      + {% for instance in instances %} + {% with url=instance.get_absolute_url %} + {{ instance }} + {% endwith %} + {% endfor %} +
      +
      +
      +
      + {% endfor %} +
      + {% endif %} {% render_form form %}
      + +
      +
      +
      {% trans "Custom Fields" %}
      +
      + {% render_custom_fields form %} +
      {% endblock %} diff --git a/netbox/tenancy/api/serializers.py b/netbox/tenancy/api/serializers.py index da0ad04bd..118cafd81 100644 --- a/netbox/tenancy/api/serializers.py +++ b/netbox/tenancy/api/serializers.py @@ -105,7 +105,7 @@ class ContactAssignmentSerializer(NetBoxModelSerializer): model = ContactAssignment fields = [ 'id', 'url', 'display', 'content_type', 'object_id', 'object', 'contact', 'role', 'priority', 'tags', - 'created', 'last_updated', + 'custom_fields', 'created', 'last_updated', ] @extend_schema_field(OpenApiTypes.OBJECT) diff --git a/netbox/tenancy/filtersets.py b/netbox/tenancy/filtersets.py index 0f4900f54..72f03e98a 100644 --- a/netbox/tenancy/filtersets.py +++ b/netbox/tenancy/filtersets.py @@ -3,11 +3,10 @@ from django.db.models import Q from django.utils.translation import gettext as _ from extras.filters import TagFilter -from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet +from netbox.filtersets import NetBoxModelFilterSet, OrganizationalModelFilterSet from utilities.filters import ContentTypeFilter, TreeNodeMultipleChoiceFilter from .models import * - __all__ = ( 'ContactAssignmentFilterSet', 'ContactFilterSet', @@ -81,7 +80,7 @@ class ContactFilterSet(NetBoxModelFilterSet): ) -class ContactAssignmentFilterSet(ChangeLoggedModelFilterSet): +class ContactAssignmentFilterSet(NetBoxModelFilterSet): q = django_filters.CharFilter( method='search', label=_('Search'), diff --git a/netbox/tenancy/forms/model_forms.py b/netbox/tenancy/forms/model_forms.py index 5b1051c68..9a53eba17 100644 --- a/netbox/tenancy/forms/model_forms.py +++ b/netbox/tenancy/forms/model_forms.py @@ -1,12 +1,9 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from extras.forms.mixins import TagsMixin -from extras.models import Tag from netbox.forms import NetBoxModelForm from tenancy.models import * -from utilities.forms.mixins import BootstrapMixin -from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField +from utilities.forms.fields import CommentField, DynamicModelChoiceField, SlugField __all__ = ( 'ContactAssignmentForm', @@ -122,7 +119,7 @@ class ContactForm(NetBoxModelForm): } -class ContactAssignmentForm(BootstrapMixin, TagsMixin, forms.ModelForm): +class ContactAssignmentForm(NetBoxModelForm): group = DynamicModelChoiceField( label=_('Group'), queryset=ContactGroup.objects.all(), diff --git a/netbox/tenancy/graphql/types.py b/netbox/tenancy/graphql/types.py index 727aa2eac..aab02b121 100644 --- a/netbox/tenancy/graphql/types.py +++ b/netbox/tenancy/graphql/types.py @@ -1,6 +1,6 @@ import graphene -from extras.graphql.mixins import TagsMixin +from extras.graphql.mixins import CustomFieldsMixin, TagsMixin from tenancy import filtersets, models from netbox.graphql.types import BaseObjectType, OrganizationalObjectType, NetBoxObjectType @@ -69,7 +69,7 @@ class ContactGroupType(OrganizationalObjectType): filterset_class = filtersets.ContactGroupFilterSet -class ContactAssignmentType(TagsMixin, BaseObjectType): +class ContactAssignmentType(CustomFieldsMixin, TagsMixin, BaseObjectType): class Meta: model = models.ContactAssignment diff --git a/netbox/tenancy/migrations/0012_contactassignment_custom_fields.py b/netbox/tenancy/migrations/0012_contactassignment_custom_fields.py new file mode 100644 index 000000000..ee6726822 --- /dev/null +++ b/netbox/tenancy/migrations/0012_contactassignment_custom_fields.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.6 on 2023-11-06 20:23 + +from django.db import migrations, models +import utilities.json + + +class Migration(migrations.Migration): + + dependencies = [ + ('tenancy', '0011_contactassignment_tags'), + ] + + operations = [ + migrations.AddField( + model_name='contactassignment', + name='custom_field_data', + field=models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder), + ), + ] diff --git a/netbox/tenancy/models/contacts.py b/netbox/tenancy/models/contacts.py index e8327248d..6cc26fa83 100644 --- a/netbox/tenancy/models/contacts.py +++ b/netbox/tenancy/models/contacts.py @@ -5,7 +5,7 @@ from django.urls import reverse from django.utils.translation import gettext_lazy as _ from netbox.models import ChangeLoggedModel, NestedGroupModel, OrganizationalModel, PrimaryModel -from netbox.models.features import TagsMixin +from netbox.models.features import CustomFieldsMixin, TagsMixin from tenancy.choices import * __all__ = ( @@ -109,7 +109,7 @@ class Contact(PrimaryModel): return reverse('tenancy:contact', args=[self.pk]) -class ContactAssignment(ChangeLoggedModel, TagsMixin): +class ContactAssignment(CustomFieldsMixin, TagsMixin, ChangeLoggedModel): content_type = models.ForeignKey( to=ContentType, on_delete=models.CASCADE From 3d20276f558a493433136a7aa496e0f79a5c4db4 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 9 Nov 2023 16:21:09 -0500 Subject: [PATCH 095/271] Closes #14134: Display additional object attributes in global search results (#14154) * WIP * Add display_attrs for all indexers * Linkify object attributes * Clean up prefetch logic * Use tooltips for display attributes * Simplify template code * Introduce get_indexer() utility function * Add to examples in docs * Use tooltips to display long strings --- docs/development/search.md | 1 + docs/plugins/development/search.md | 3 ++ netbox/circuits/search.py | 6 ++++ netbox/core/search.py | 1 + netbox/dcim/search.py | 31 +++++++++++++++++++ netbox/extras/models/search.py | 19 ++++++++++++ netbox/ipam/search.py | 16 ++++++++++ netbox/netbox/search/__init__.py | 2 ++ netbox/netbox/search/backends.py | 43 ++++++++++++++++++++++----- netbox/netbox/search/utils.py | 14 +++++++++ netbox/netbox/tables/tables.py | 5 ++++ netbox/netbox/tables/template_code.py | 18 +++++++++++ netbox/tenancy/search.py | 5 ++++ netbox/virtualization/search.py | 5 ++++ netbox/wireless/search.py | 3 ++ 15 files changed, 165 insertions(+), 7 deletions(-) create mode 100644 netbox/netbox/search/utils.py create mode 100644 netbox/netbox/tables/template_code.py diff --git a/docs/development/search.md b/docs/development/search.md index 6ccffa7af..1c4eec169 100644 --- a/docs/development/search.md +++ b/docs/development/search.md @@ -17,6 +17,7 @@ class MyModelIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('site', 'device', 'status', 'description') ``` A SearchIndex subclass defines both its model and a list of two-tuples specifying which model fields to be indexed and the weight (precedence) associated with each. Guidance on weight assignment for fields is provided below. diff --git a/docs/plugins/development/search.md b/docs/plugins/development/search.md index e3b861f00..e54844cf0 100644 --- a/docs/plugins/development/search.md +++ b/docs/plugins/development/search.md @@ -14,8 +14,11 @@ class MyModelIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('site', 'device', 'status', 'description') ``` +Fields listed in `display_attrs` will not be cached for search, but will be displayed alongside the object when it appears in global search results. This is helpful for conveying to the user additional information about an object. + To register one or more indexes with NetBox, define a list named `indexes` at the end of this file: ```python diff --git a/netbox/circuits/search.py b/netbox/circuits/search.py index b80f92d4d..c22b400eb 100644 --- a/netbox/circuits/search.py +++ b/netbox/circuits/search.py @@ -10,6 +10,7 @@ class CircuitIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('provider', 'provider_account', 'type', 'status', 'tenant', 'description') @register_search @@ -22,6 +23,7 @@ class CircuitTerminationIndex(SearchIndex): ('port_speed', 2000), ('upstream_speed', 2000), ) + display_attrs = ('circuit', 'site', 'provider_network', 'description') @register_search @@ -32,6 +34,7 @@ class CircuitTypeIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('description',) @register_search @@ -42,6 +45,7 @@ class ProviderIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('description',) class ProviderAccountIndex(SearchIndex): @@ -51,6 +55,7 @@ class ProviderAccountIndex(SearchIndex): ('account', 200), ('comments', 5000), ) + display_attrs = ('provider', 'account', 'description') @register_search @@ -62,3 +67,4 @@ class ProviderNetworkIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('provider', 'service_id', 'description') diff --git a/netbox/core/search.py b/netbox/core/search.py index e6d3005e6..5ea9db761 100644 --- a/netbox/core/search.py +++ b/netbox/core/search.py @@ -11,6 +11,7 @@ class DataSourceIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('type', 'status', 'description') @register_search diff --git a/netbox/dcim/search.py b/netbox/dcim/search.py index f70c729f4..0784cfaf8 100644 --- a/netbox/dcim/search.py +++ b/netbox/dcim/search.py @@ -10,6 +10,7 @@ class CableIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('type', 'status', 'tenant', 'label', 'description') @register_search @@ -21,6 +22,7 @@ class ConsolePortIndex(SearchIndex): ('description', 500), ('speed', 2000), ) + display_attrs = ('device', 'label', 'description') @register_search @@ -32,6 +34,7 @@ class ConsoleServerPortIndex(SearchIndex): ('description', 500), ('speed', 2000), ) + display_attrs = ('device', 'label', 'description') @register_search @@ -44,6 +47,9 @@ class DeviceIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ( + 'site', 'location', 'rack', 'device_type', 'role', 'tenant', 'platform', 'serial', 'asset_tag', 'description', + ) @register_search @@ -54,6 +60,7 @@ class DeviceBayIndex(SearchIndex): ('label', 200), ('description', 500), ) + display_attrs = ('device', 'label', 'description') @register_search @@ -64,6 +71,7 @@ class DeviceRoleIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('description',) @register_search @@ -75,6 +83,7 @@ class DeviceTypeIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('manufacturer', 'part_number', 'description') @register_search @@ -85,6 +94,7 @@ class FrontPortIndex(SearchIndex): ('label', 200), ('description', 500), ) + display_attrs = ('device', 'label', 'description') @register_search @@ -99,6 +109,7 @@ class InterfaceIndex(SearchIndex): ('mtu', 2000), ('speed', 2000), ) + display_attrs = ('device', 'label', 'description') @register_search @@ -112,6 +123,7 @@ class InventoryItemIndex(SearchIndex): ('description', 500), ('part_id', 2000), ) + display_attrs = ('device', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description') @register_search @@ -122,6 +134,7 @@ class LocationIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('site', 'status', 'tenant', 'description') @register_search @@ -132,6 +145,7 @@ class ManufacturerIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('description',) @register_search @@ -143,6 +157,7 @@ class ModuleIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('device', 'module_bay', 'module_type', 'status', 'serial', 'asset_tag', 'description') @register_search @@ -153,6 +168,7 @@ class ModuleBayIndex(SearchIndex): ('label', 200), ('description', 500), ) + display_attrs = ('device', 'label', 'position', 'description') @register_search @@ -164,6 +180,7 @@ class ModuleTypeIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('manufacturer', 'model', 'part_number', 'description') @register_search @@ -174,6 +191,7 @@ class PlatformIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('manufacturer', 'description') @register_search @@ -184,6 +202,7 @@ class PowerFeedIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('power_panel', 'rack', 'status', 'description') @register_search @@ -194,6 +213,7 @@ class PowerOutletIndex(SearchIndex): ('label', 200), ('description', 500), ) + display_attrs = ('device', 'label', 'description') @register_search @@ -204,6 +224,7 @@ class PowerPanelIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('site', 'location', 'description') @register_search @@ -216,6 +237,7 @@ class PowerPortIndex(SearchIndex): ('maximum_draw', 2000), ('allocated_draw', 2000), ) + display_attrs = ('device', 'label', 'description') @register_search @@ -229,6 +251,7 @@ class RackIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('site', 'location', 'facility_id', 'tenant', 'status', 'role', 'description') @register_search @@ -238,6 +261,7 @@ class RackReservationIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('rack', 'tenant', 'user', 'description') @register_search @@ -248,6 +272,7 @@ class RackRoleIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('device', 'label', 'description',) @register_search @@ -258,6 +283,7 @@ class RearPortIndex(SearchIndex): ('label', 200), ('description', 500), ) + display_attrs = ('device', 'label', 'description') @register_search @@ -268,6 +294,7 @@ class RegionIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('parent', 'description') @register_search @@ -282,6 +309,7 @@ class SiteIndex(SearchIndex): ('shipping_address', 2000), ('comments', 5000), ) + display_attrs = ('region', 'group', 'status', 'description') @register_search @@ -292,6 +320,7 @@ class SiteGroupIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('parent', 'description') @register_search @@ -303,6 +332,7 @@ class VirtualChassisIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('master', 'domain', 'description') @register_search @@ -314,3 +344,4 @@ class VirtualDeviceContextIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('device', 'status', 'identifier', 'description') diff --git a/netbox/extras/models/search.py b/netbox/extras/models/search.py index b3327d510..bebcabd31 100644 --- a/netbox/extras/models/search.py +++ b/netbox/extras/models/search.py @@ -4,7 +4,10 @@ from django.contrib.contenttypes.models import ContentType from django.db import models from django.utils.translation import gettext_lazy as _ +from netbox.search.utils import get_indexer +from netbox.registry import registry from utilities.fields import RestrictedGenericForeignKey +from utilities.utils import content_type_identifier from ..fields import CachedValueField __all__ = ( @@ -58,3 +61,19 @@ class CachedValue(models.Model): def __str__(self): return f'{self.object_type} {self.object_id}: {self.field}={self.value}' + + @property + def display_attrs(self): + """ + Render any display attributes associated with this search result. + """ + indexer = get_indexer(self.object_type) + attrs = {} + for attr in indexer.display_attrs: + name = self.object._meta.get_field(attr).verbose_name + if value := getattr(self.object, attr): + if display_func := getattr(self.object, f'get_{attr}_display', None): + attrs[name] = display_func() + else: + attrs[name] = value + return attrs diff --git a/netbox/ipam/search.py b/netbox/ipam/search.py index 4d97bf5f0..c08acce1b 100644 --- a/netbox/ipam/search.py +++ b/netbox/ipam/search.py @@ -11,6 +11,7 @@ class AggregateIndex(SearchIndex): ('date_added', 2000), ('comments', 5000), ) + display_attrs = ('rir', 'tenant', 'description') @register_search @@ -20,6 +21,7 @@ class ASNIndex(SearchIndex): ('asn', 100), ('description', 500), ) + display_attrs = ('rir', 'tenant', 'description') @register_search @@ -28,6 +30,7 @@ class ASNRangeIndex(SearchIndex): fields = ( ('description', 500), ) + display_attrs = ('rir', 'tenant', 'description') @register_search @@ -39,6 +42,7 @@ class FHRPGroupIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('protocol', 'auth_type', 'description') @register_search @@ -50,6 +54,7 @@ class IPAddressIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('vrf', 'tenant', 'status', 'role', 'description') @register_search @@ -61,6 +66,7 @@ class IPRangeIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('vrf', 'tenant', 'status', 'role', 'description') @register_search @@ -72,6 +78,7 @@ class L2VPNIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('type', 'identifier', 'tenant', 'description') @register_search @@ -82,6 +89,7 @@ class PrefixIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'description') @register_search @@ -92,6 +100,7 @@ class RIRIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('description',) @register_search @@ -102,6 +111,7 @@ class RoleIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('description',) @register_search @@ -112,6 +122,7 @@ class RouteTargetIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('tenant', 'description') @register_search @@ -122,6 +133,7 @@ class ServiceIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('device', 'virtual_machine', 'description') @register_search @@ -132,6 +144,7 @@ class ServiceTemplateIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('description',) @register_search @@ -143,6 +156,7 @@ class VLANIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('site', 'group', 'tenant', 'status', 'role', 'description') @register_search @@ -154,6 +168,7 @@ class VLANGroupIndex(SearchIndex): ('description', 500), ('max_vid', 2000), ) + display_attrs = ('scope_type', 'min_vid', 'max_vid', 'description') @register_search @@ -165,3 +180,4 @@ class VRFIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('rd', 'tenant', 'description') diff --git a/netbox/netbox/search/__init__.py b/netbox/netbox/search/__init__.py index 6d53e9a97..590188f21 100644 --- a/netbox/netbox/search/__init__.py +++ b/netbox/netbox/search/__init__.py @@ -33,10 +33,12 @@ class SearchIndex: category: The label of the group under which this indexer is categorized (for form field display). If none, the name of the model's app will be used. fields: An iterable of two-tuples defining the model fields to be indexed and the weight associated with each. + display_attrs: An iterable of additional object attributes to include when displaying search results. """ model = None category = None fields = () + display_attrs = () @staticmethod def get_field_type(instance, field_name): diff --git a/netbox/netbox/search/backends.py b/netbox/netbox/search/backends.py index 4487b6bb8..1fb23a37c 100644 --- a/netbox/netbox/search/backends.py +++ b/netbox/netbox/search/backends.py @@ -3,7 +3,8 @@ from collections import defaultdict from django.conf import settings from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ImproperlyConfigured -from django.db.models import F, Window, Q +from django.db.models import F, Window, Q, prefetch_related_objects +from django.db.models.fields.related import ForeignKey from django.db.models.functions import window from django.db.models.signals import post_delete, post_save from django.utils.module_loading import import_string @@ -13,7 +14,7 @@ from netaddr.core import AddrFormatError from extras.models import CachedValue, CustomField from netbox.registry import registry from utilities.querysets import RestrictedPrefetch -from utilities.utils import title +from utilities.utils import content_type_identifier, title from . import FieldTypes, LookupTypes, get_indexer DEFAULT_LOOKUP_TYPE = LookupTypes.PARTIAL @@ -103,17 +104,17 @@ class CachedValueSearchBackend(SearchBackend): def search(self, value, user=None, object_types=None, lookup=DEFAULT_LOOKUP_TYPE): + # Build the filter used to find relevant CachedValue records query_filter = Q(**{f'value__{lookup}': value}) - if object_types: + # Limit results by object type query_filter &= Q(object_type__in=object_types) - if lookup in (LookupTypes.STARTSWITH, LookupTypes.ENDSWITH): - # Partial string matches are valid only on string values + # "Starts/ends with" matches are valid only on string values query_filter &= Q(type=FieldTypes.STRING) - - if lookup == LookupTypes.PARTIAL: + elif lookup == LookupTypes.PARTIAL: try: + # If the value looks like an IP address, add an extra match for CIDR values address = str(netaddr.IPNetwork(value.strip()).cidr) query_filter |= Q(type=FieldTypes.CIDR) & Q(value__net_contains_or_equals=address) except (AddrFormatError, ValueError): @@ -129,6 +130,12 @@ class CachedValueSearchBackend(SearchBackend): ) )[:MAX_RESULTS] + # Gather all ContentTypes present in the search results (used for prefetching related + # objects). This must be done before generating the final results list, which returns + # a RawQuerySet. + content_type_ids = set(queryset.values_list('object_type', flat=True)) + content_types = ContentType.objects.filter(pk__in=content_type_ids) + # Construct a Prefetch to pre-fetch only those related objects for which the # user has permission to view. if user: @@ -144,12 +151,34 @@ class CachedValueSearchBackend(SearchBackend): params ) + # Iterate through each ContentType represented in the search results and prefetch any + # related objects necessary to render the prescribed display attributes (display_attrs). + for ct in content_types: + model = ct.model_class() + indexer = registry['search'].get(content_type_identifier(ct)) + if not (display_attrs := getattr(indexer, 'display_attrs', None)): + continue + + # Add ForeignKey fields to prefetch list + prefetch_fields = [] + for attr in display_attrs: + field = model._meta.get_field(attr) + if type(field) is ForeignKey: + prefetch_fields.append(f'object__{attr}') + + # Compile a list of all CachedValues referencing this object type, and prefetch + # any related objects + if prefetch_fields: + objects = [r for r in results if r.object_type == ct] + prefetch_related_objects(objects, *prefetch_fields) + # Omit any results pertaining to an object the user does not have permission to view ret = [] for r in results: if r.object is not None: r.name = str(r.object) ret.append(r) + return ret def cache(self, instances, indexer=None, remove_existing=True): diff --git a/netbox/netbox/search/utils.py b/netbox/netbox/search/utils.py new file mode 100644 index 000000000..824fbfb3d --- /dev/null +++ b/netbox/netbox/search/utils.py @@ -0,0 +1,14 @@ +from netbox.registry import registry +from utilities.utils import content_type_identifier + +__all__ = ( + 'get_indexer', +) + + +def get_indexer(content_type): + """ + Return the registered search indexer for the given ContentType. + """ + ct_identifier = content_type_identifier(content_type) + return registry['search'].get(ct_identifier) diff --git a/netbox/netbox/tables/tables.py b/netbox/netbox/tables/tables.py index 97ab44362..cb53310cc 100644 --- a/netbox/netbox/tables/tables.py +++ b/netbox/netbox/tables/tables.py @@ -15,6 +15,7 @@ from extras.choices import CustomFieldVisibilityChoices from netbox.tables import columns from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.utils import get_viewname, highlight_string, title +from .template_code import * __all__ = ( 'BaseTable', @@ -236,6 +237,10 @@ class SearchTable(tables.Table): value = tables.Column( verbose_name=_('Value'), ) + attrs = columns.TemplateColumn( + template_code=SEARCH_RESULT_ATTRS, + verbose_name=_('Attributes') + ) trim_length = 30 diff --git a/netbox/netbox/tables/template_code.py b/netbox/netbox/tables/template_code.py new file mode 100644 index 000000000..24439eeb6 --- /dev/null +++ b/netbox/netbox/tables/template_code.py @@ -0,0 +1,18 @@ +SEARCH_RESULT_ATTRS = """ +{% for name, value in record.display_attrs.items %} + 40 %} data-bs-toggle="tooltip" data-bs-placement="bottom" title="{{ value }}"{% endif %} + > + {{ name|bettertitle }}: + {% with url=value.get_absolute_url %} + {% if url %}{% endif %} + {% if value|length > 40 %} + {{ value|truncatechars:"40" }} + {% else %} + {{ value }} + {% endif %} + {% if url %}{% endif %} + {% endwith %} + +{% endfor %} +""" diff --git a/netbox/tenancy/search.py b/netbox/tenancy/search.py index bee497608..56903d6b1 100644 --- a/netbox/tenancy/search.py +++ b/netbox/tenancy/search.py @@ -15,6 +15,7 @@ class ContactIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('group', 'title', 'phone', 'email', 'description') @register_search @@ -25,6 +26,7 @@ class ContactGroupIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('description',) @register_search @@ -35,6 +37,7 @@ class ContactRoleIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('description',) @register_search @@ -46,6 +49,7 @@ class TenantIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('group', 'description') @register_search @@ -56,3 +60,4 @@ class TenantGroupIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('description',) diff --git a/netbox/virtualization/search.py b/netbox/virtualization/search.py index 643a9f6de..12174dda4 100644 --- a/netbox/virtualization/search.py +++ b/netbox/virtualization/search.py @@ -10,6 +10,7 @@ class ClusterIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('type', 'group', 'status', 'tenant', 'site', 'description') @register_search @@ -20,6 +21,7 @@ class ClusterGroupIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('description',) @register_search @@ -30,6 +32,7 @@ class ClusterTypeIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('description',) @register_search @@ -40,6 +43,7 @@ class VirtualMachineIndex(SearchIndex): ('description', 500), ('comments', 5000), ) + display_attrs = ('site', 'cluster', 'device', 'tenant', 'platform', 'status', 'role', 'description') @register_search @@ -51,3 +55,4 @@ class VMInterfaceIndex(SearchIndex): ('description', 500), ('mtu', 2000), ) + display_attrs = ('virtual_machine', 'description') diff --git a/netbox/wireless/search.py b/netbox/wireless/search.py index 1f8097cd7..c8ac023cc 100644 --- a/netbox/wireless/search.py +++ b/netbox/wireless/search.py @@ -11,6 +11,7 @@ class WirelessLANIndex(SearchIndex): ('auth_psk', 2000), ('comments', 5000), ) + display_attrs = ('group', 'status', 'vlan', 'tenant', 'description') @register_search @@ -21,6 +22,7 @@ class WirelessLANGroupIndex(SearchIndex): ('slug', 110), ('description', 500), ) + display_attrs = ('description',) @register_search @@ -32,3 +34,4 @@ class WirelessLinkIndex(SearchIndex): ('auth_psk', 2000), ('comments', 5000), ) + display_attrs = ('status', 'tenant', 'description') From 840b7d804c974bc3c1e3c2884610dd1300a37b4a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 9 Nov 2023 16:33:35 -0500 Subject: [PATCH 096/271] Closes #13645: Make Sentry integration optional (#14197) --- base_requirements.txt | 4 ---- docs/administration/error-reporting.md | 18 +++--------------- docs/configuration/error-reporting.md | 3 +++ docs/installation/3-netbox.md | 11 +++++++++++ netbox/netbox/settings.py | 21 +++++++++------------ netbox/netbox/views/errors.py | 5 +++-- requirements.txt | 1 - 7 files changed, 29 insertions(+), 34 deletions(-) diff --git a/base_requirements.txt b/base_requirements.txt index 6e3c5ba19..b659c9e8d 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -126,10 +126,6 @@ PyYAML # https://github.com/psf/requests/blob/main/HISTORY.md requests -# Sentry SDK -# https://github.com/getsentry/sentry-python/blob/master/CHANGELOG.md -sentry-sdk - # Social authentication framework # https://github.com/python-social-auth/social-core/blob/master/CHANGELOG.md social-auth-core diff --git a/docs/administration/error-reporting.md b/docs/administration/error-reporting.md index 162998774..ccc0a84a5 100644 --- a/docs/administration/error-reporting.md +++ b/docs/administration/error-reporting.md @@ -4,27 +4,15 @@ ### Enabling Error Reporting -NetBox supports native integration with [Sentry](https://sentry.io/) for automatic error reporting. To enable this functionality, simply set `SENTRY_ENABLED` to True in `configuration.py`. Errors will be sent to a Sentry ingestor maintained by the NetBox team for analysis. - -```python -SENTRY_ENABLED = True -``` - -### Using a Custom DSN - -If you prefer instead to use your own Sentry ingestor, you'll need to first create a new project under your Sentry account to represent your NetBox deployment and obtain its corresponding data source name (DSN). This looks like a URL similar to the example below: - -``` -https://examplePublicKey@o0.ingest.sentry.io/0 -``` - -Once you have obtained a DSN, configure Sentry in NetBox's `configuration.py` file with the following parameters: +NetBox supports native integration with [Sentry](https://sentry.io/) for automatic error reporting. To enable this functionality, set `SENTRY_ENABLED` to True and define your unique [data source name (DSN)](https://docs.sentry.io/product/sentry-basics/concepts/dsn-explainer/) in `configuration.py`. ```python SENTRY_ENABLED = True SENTRY_DSN = "https://examplePublicKey@o0.ingest.sentry.io/0" ``` +Setting `SENTRY_ENABLED` to False will disable the Sentry integration. + ### Assigning Tags You can optionally attach one or more arbitrary tags to the outgoing error reports if desired by setting the `SENTRY_TAGS` parameter: diff --git a/docs/configuration/error-reporting.md b/docs/configuration/error-reporting.md index d1c47e2fb..8c3526dec 100644 --- a/docs/configuration/error-reporting.md +++ b/docs/configuration/error-reporting.md @@ -18,6 +18,9 @@ Default: False Set to True to enable automatic error reporting via [Sentry](https://sentry.io/). +!!! note + The `sentry-sdk` Python package is required to enable Sentry integration. + --- ## SENTRY_SAMPLE_RATE diff --git a/docs/installation/3-netbox.md b/docs/installation/3-netbox.md index 0713d12e3..4043416a3 100644 --- a/docs/installation/3-netbox.md +++ b/docs/installation/3-netbox.md @@ -227,6 +227,17 @@ sudo sh -c "echo 'boto3' >> /opt/netbox/local_requirements.txt" !!! info These packages were previously required in NetBox v3.5 but now are optional. +### Sentry Integration + +NetBox may be configured to send error reports to [Sentry](../administration/error-reporting.md) for analysis. This integration requires installation of the `sentry-sdk` Python library. + +```no-highlight +sudo sh -c "echo 'sentry-sdk' >> /opt/netbox/local_requirements.txt" +``` + +!!! info + Sentry integration was previously included by default in NetBox v3.6 but is now optional. + ## Run the Upgrade Script Once NetBox has been configured, we're ready to proceed with the actual installation. We'll run the packaged upgrade script (`upgrade.sh`) to perform the following actions: diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 09ee38d6a..465389a11 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -9,12 +9,14 @@ import warnings from urllib.parse import urlencode, urlsplit import django -import sentry_sdk from django.contrib.messages import constants as messages from django.core.exceptions import ImproperlyConfigured, ValidationError from django.core.validators import URLValidator from django.utils.encoding import force_str -from sentry_sdk.integrations.django import DjangoIntegration +try: + import sentry_sdk +except ModuleNotFoundError: + pass from netbox.config import PARAMS from netbox.constants import RQ_QUEUE_DEFAULT, RQ_QUEUE_HIGH, RQ_QUEUE_LOW @@ -39,8 +41,6 @@ if sys.version_info < (3, 8): f"NetBox requires Python 3.8 or later. (Currently installed: Python {platform.python_version()})" ) -DEFAULT_SENTRY_DSN = 'https://198cf560b29d4054ab8e583a1d10ea58@o1242133.ingest.sentry.io/6396485' - # # Configuration import # @@ -158,7 +158,7 @@ RQ_RETRY_MAX = getattr(configuration, 'RQ_RETRY_MAX', 0) SCRIPTS_ROOT = getattr(configuration, 'SCRIPTS_ROOT', os.path.join(BASE_DIR, 'scripts')).rstrip('/') SEARCH_BACKEND = getattr(configuration, 'SEARCH_BACKEND', 'netbox.search.backends.CachedValueSearchBackend') SECURE_SSL_REDIRECT = getattr(configuration, 'SECURE_SSL_REDIRECT', False) -SENTRY_DSN = getattr(configuration, 'SENTRY_DSN', DEFAULT_SENTRY_DSN) +SENTRY_DSN = getattr(configuration, 'SENTRY_DSN', None) SENTRY_ENABLED = getattr(configuration, 'SENTRY_ENABLED', False) SENTRY_SAMPLE_RATE = getattr(configuration, 'SENTRY_SAMPLE_RATE', 1.0) SENTRY_TRACES_SAMPLE_RATE = getattr(configuration, 'SENTRY_TRACES_SAMPLE_RATE', 0) @@ -517,12 +517,12 @@ SERIALIZATION_MODULES = { # if SENTRY_ENABLED: + try: + from sentry_sdk.integrations.django import DjangoIntegration + except ModuleNotFoundError: + raise ImproperlyConfigured("SENTRY_ENABLED is True but the sentry-sdk package is not installed.") if not SENTRY_DSN: raise ImproperlyConfigured("SENTRY_ENABLED is True but SENTRY_DSN has not been defined.") - # If using the default DSN, force sampling rates - if SENTRY_DSN == DEFAULT_SENTRY_DSN: - SENTRY_SAMPLE_RATE = 1.0 - SENTRY_TRACES_SAMPLE_RATE = 0 # Initialize the SDK sentry_sdk.init( dsn=SENTRY_DSN, @@ -537,9 +537,6 @@ if SENTRY_ENABLED: # Assign any configured tags for k, v in SENTRY_TAGS.items(): sentry_sdk.set_tag(k, v) - # If using the default DSN, append a unique deployment ID tag for error correlation - if SENTRY_DSN == DEFAULT_SENTRY_DSN: - sentry_sdk.set_tag('netbox.deployment_id', DEPLOYMENT_ID) # diff --git a/netbox/netbox/views/errors.py b/netbox/netbox/views/errors.py index d1a8ccd36..a0f783ed6 100644 --- a/netbox/netbox/views/errors.py +++ b/netbox/netbox/views/errors.py @@ -9,7 +9,6 @@ from django.template.exceptions import TemplateDoesNotExist from django.views.decorators.csrf import requires_csrf_token from django.views.defaults import ERROR_500_TEMPLATE_NAME, page_not_found from django.views.generic import View -from sentry_sdk import capture_message from netbox.plugins.utils import get_installed_plugins @@ -34,7 +33,9 @@ def handler_404(request, exception): """ Wrap Django's default 404 handler to enable Sentry reporting. """ - capture_message("Page not found", level="error") + if settings.SENTRY_ENABLED: + from sentry_sdk import capture_message + capture_message("Page not found", level="error") return page_not_found(request, exception) diff --git a/requirements.txt b/requirements.txt index 16bafe62f..45fb12f80 100644 --- a/requirements.txt +++ b/requirements.txt @@ -28,7 +28,6 @@ Pillow==10.1.0 psycopg[binary,pool]==3.1.12 PyYAML==6.0.1 requests==2.31.0 -sentry-sdk==1.34.0 social-auth-app-django==5.4.0 social-auth-core[openidconnect]==4.5.0 svgwrite==1.4.3 From 69a4c310729a799ed3df05fa1c6684cc9a7ca588 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 16 Nov 2023 12:02:32 -0500 Subject: [PATCH 097/271] Closes #13794: Dynamically populate related objects list under tenant view (#14196) * Closes #13794: Dynamically populate related objects list under tenant view * get_related_models() should sort models alphabetically by default * Reference Meta.related_objects instead of calling get_fields() --- netbox/tenancy/views.py | 35 +++-------------------------------- netbox/utilities/utils.py | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 33 deletions(-) diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 4217f8d15..27d5750ac 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -2,14 +2,9 @@ from django.contrib.contenttypes.models import ContentType from django.shortcuts import get_object_or_404 from django.utils.translation import gettext as _ -from circuits.models import Circuit -from dcim.models import Cable, Device, Location, PowerFeed, Rack, RackReservation, Site, VirtualDeviceContext -from ipam.models import Aggregate, ASN, IPAddress, IPRange, L2VPN, Prefix, VLAN, VRF from netbox.views import generic -from utilities.utils import count_related +from utilities.utils import count_related, get_related_models from utilities.views import register_model_view, ViewTab -from virtualization.models import VirtualMachine, Cluster -from wireless.models import WirelessLAN, WirelessLink from . import filtersets, forms, tables from .models import * @@ -132,32 +127,8 @@ class TenantView(generic.ObjectView): def get_extra_context(self, request, instance): related_models = [ - # DCIM - (Site.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (Rack.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (RackReservation.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (Location.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (Device.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (VirtualDeviceContext.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (Cable.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (PowerFeed.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - # IPAM - (VRF.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (Aggregate.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (Prefix.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (IPRange.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (IPAddress.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (ASN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (VLAN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (L2VPN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - # Circuits - (Circuit.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - # Virtualization - (VirtualMachine.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (Cluster.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - # Wireless - (WirelessLAN.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), - (WirelessLink.objects.restrict(request.user, 'view').filter(tenant=instance), 'tenant_id'), + (model.objects.restrict(request.user, 'view').filter(tenant=instance), f'{field}_id') + for model, field in get_related_models(Tenant) ] return { diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index feb28c2d8..d7232d41b 100644 --- a/netbox/utilities/utils.py +++ b/netbox/utilities/utils.py @@ -8,7 +8,7 @@ from itertools import count, groupby import bleach from django.contrib.contenttypes.models import ContentType from django.core import serializers -from django.db.models import Count, OuterRef, Subquery +from django.db.models import Count, ManyToOneRel, OuterRef, Subquery from django.db.models.functions import Coalesce from django.http import QueryDict from django.utils import timezone @@ -567,3 +567,20 @@ def local_now(): Return the current date & time in the system timezone. """ return localtime(timezone.now()) + + +def get_related_models(model, ordered=True): + """ + Return a list of all models which have a ForeignKey to the given model and the name of the field. For example, + `get_related_models(Tenant)` will return all models which have a ForeignKey relationship to Tenant. + """ + related_models = [ + (field.related_model, field.remote_field.name) + for field in model._meta.related_objects + if type(field) is ManyToOneRel + ] + + if ordered: + return sorted(related_models, key=lambda x: x[0]._meta.verbose_name) + + return related_models From e15647a2ce968866cadc165e68aaad9dbf37ac53 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 16 Nov 2023 12:12:51 -0500 Subject: [PATCH 098/271] Closes #14153: Filter ContentTypes by supported feature (#14191) * WIP * Remove FeatureQuery * Standardize use of proxy ContentType for models * Remove TODO * Correctly filter BookmarksWidget object_types choices * Add feature-specific object type validation --- netbox/core/forms/filtersets.py | 4 +- netbox/core/migrations/0003_job.py | 3 +- netbox/core/models/contenttypes.py | 18 ++++++++ netbox/core/models/data.py | 3 +- netbox/core/models/jobs.py | 16 +++++-- netbox/dcim/models/cables.py | 5 +-- .../dcim/models/device_component_templates.py | 3 +- netbox/dcim/models/device_components.py | 3 +- netbox/extras/api/serializers.py | 15 ++++--- netbox/extras/dashboard/widgets.py | 16 ++++--- netbox/extras/forms/bulk_import.py | 13 ++---- netbox/extras/forms/filtersets.py | 15 ++++--- netbox/extras/forms/model_forms.py | 19 +++------ netbox/extras/migrations/0001_squashed.py | 10 ++--- .../migrations/0094_tag_object_types.py | 3 +- netbox/extras/models/change_logging.py | 18 ++++++-- netbox/extras/models/customfields.py | 9 ++-- netbox/extras/models/models.py | 42 +++++++++++++------ netbox/extras/models/search.py | 3 +- netbox/extras/models/staging.py | 3 +- netbox/extras/models/tags.py | 6 +-- netbox/extras/utils.py | 25 ----------- netbox/ipam/models/fhrp.py | 5 +-- netbox/ipam/models/ip.py | 4 +- netbox/ipam/models/l2vpn.py | 4 +- netbox/ipam/models/vlans.py | 3 +- netbox/netbox/models/features.py | 2 +- netbox/tenancy/forms/filtersets.py | 6 +-- netbox/tenancy/models/contacts.py | 14 ++++++- netbox/users/models.py | 4 +- 30 files changed, 152 insertions(+), 142 deletions(-) diff --git a/netbox/core/forms/filtersets.py b/netbox/core/forms/filtersets.py index 4d0acbb77..a567a9fed 100644 --- a/netbox/core/forms/filtersets.py +++ b/netbox/core/forms/filtersets.py @@ -1,12 +1,10 @@ from django import forms from django.contrib.auth import get_user_model -from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext_lazy as _ from core.choices import * from core.models import * from extras.forms.mixins import SavedFiltersMixin -from extras.utils import FeatureQuery from netbox.forms import NetBoxModelFilterSetForm from netbox.utils import get_data_backend_choices from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm @@ -69,7 +67,7 @@ class JobFilterForm(SavedFiltersMixin, FilterForm): ) object_type = ContentTypeChoiceField( label=_('Object Type'), - queryset=ContentType.objects.filter(FeatureQuery('jobs').get_query()), + queryset=ContentType.objects.with_feature('jobs'), required=False, ) status = forms.MultipleChoiceField( diff --git a/netbox/core/migrations/0003_job.py b/netbox/core/migrations/0003_job.py index ab6f058ff..f2fe41afb 100644 --- a/netbox/core/migrations/0003_job.py +++ b/netbox/core/migrations/0003_job.py @@ -4,7 +4,6 @@ from django.conf import settings import django.core.validators from django.db import migrations, models import django.db.models.deletion -import extras.utils class Migration(migrations.Migration): @@ -30,7 +29,7 @@ class Migration(migrations.Migration): ('status', models.CharField(default='pending', max_length=30)), ('data', models.JSONField(blank=True, null=True)), ('job_id', models.UUIDField(unique=True)), - ('object_type', models.ForeignKey(limit_choices_to=extras.utils.FeatureQuery('jobs'), on_delete=django.db.models.deletion.CASCADE, related_name='jobs', to='contenttypes.contenttype')), + ('object_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='jobs', to='contenttypes.contenttype')), ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), ], options={ diff --git a/netbox/core/models/contenttypes.py b/netbox/core/models/contenttypes.py index 18c16a1c2..0731871ec 100644 --- a/netbox/core/models/contenttypes.py +++ b/netbox/core/models/contenttypes.py @@ -21,6 +21,24 @@ class ContentTypeManager(ContentTypeManager_): q |= Q(app_label=app_label, model__in=models) return self.get_queryset().filter(q) + def with_feature(self, feature): + """ + Return the ContentTypes only for models which are registered as supporting the specified feature. For example, + we can find all ContentTypes for models which support webhooks with + + ContentType.objects.with_feature('webhooks') + """ + if feature not in registry['model_features']: + raise KeyError( + f"{feature} is not a registered model feature! Valid features are: {registry['model_features'].keys()}" + ) + + q = Q() + for app_label, models in registry['model_features'][feature].items(): + q |= Q(app_label=app_label, model__in=models) + + return self.get_queryset().filter(q) + class ContentType(ContentType_): """ diff --git a/netbox/core/models/data.py b/netbox/core/models/data.py index 78f05e462..cf40c0bd5 100644 --- a/netbox/core/models/data.py +++ b/netbox/core/models/data.py @@ -6,7 +6,6 @@ from urllib.parse import urlparse from django.conf import settings from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.core.validators import RegexValidator from django.db import models @@ -368,7 +367,7 @@ class AutoSyncRecord(models.Model): related_name='+' ) object_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', on_delete=models.CASCADE, related_name='+' ) diff --git a/netbox/core/models/jobs.py b/netbox/core/models/jobs.py index 4e9a93bfb..5b9b41e53 100644 --- a/netbox/core/models/jobs.py +++ b/netbox/core/models/jobs.py @@ -3,7 +3,7 @@ import uuid import django_rq from django.conf import settings from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError from django.core.validators import MinValueValidator from django.db import models from django.urls import reverse @@ -11,8 +11,8 @@ from django.utils import timezone from django.utils.translation import gettext as _ from core.choices import JobStatusChoices +from core.models import ContentType from extras.constants import EVENT_JOB_END, EVENT_JOB_START -from extras.utils import FeatureQuery from netbox.config import get_config from netbox.constants import RQ_QUEUE_DEFAULT from utilities.querysets import RestrictedQuerySet @@ -28,9 +28,8 @@ class Job(models.Model): Tracks the lifecycle of a job which represents a background task (e.g. the execution of a custom script). """ object_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', related_name='jobs', - limit_choices_to=FeatureQuery('jobs'), on_delete=models.CASCADE, ) object_id = models.PositiveBigIntegerField( @@ -123,6 +122,15 @@ class Job(models.Model): def get_status_color(self): return JobStatusChoices.colors.get(self.status) + def clean(self): + super().clean() + + # Validate the assigned object type + if self.object_type not in ContentType.objects.with_feature('jobs'): + raise ValidationError( + _("Jobs cannot be assigned to this object type ({type}).").format(type=self.object_type) + ) + @property def duration(self): if not self.completed: diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 9bcd824e6..e276ae3e5 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -2,7 +2,6 @@ import itertools from collections import defaultdict from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.db import models from django.db.models import Sum @@ -10,12 +9,12 @@ from django.dispatch import Signal from django.urls import reverse from django.utils.translation import gettext_lazy as _ +from core.models import ContentType from dcim.choices import * from dcim.constants import * from dcim.fields import PathField from dcim.utils import decompile_path_node, object_to_path_node from netbox.models import ChangeLoggedModel, PrimaryModel - from utilities.fields import ColorField from utilities.querysets import RestrictedQuerySet from utilities.utils import to_meters @@ -258,7 +257,7 @@ class CableTermination(ChangeLoggedModel): verbose_name=_('end') ) termination_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', limit_choices_to=CABLE_TERMINATION_MODELS, on_delete=models.PROTECT, related_name='+' diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index 5110835f4..fb3d6333e 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -1,5 +1,4 @@ from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models @@ -709,7 +708,7 @@ class InventoryItemTemplate(MPTTModel, ComponentTemplateModel): db_index=True ) component_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', limit_choices_to=MODULAR_COMPONENT_TEMPLATE_MODELS, on_delete=models.PROTECT, related_name='+', diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 94568459e..c24ed4d86 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -1,7 +1,6 @@ from functools import cached_property from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models @@ -1181,7 +1180,7 @@ class InventoryItem(MPTTModel, ComponentModel, TrackingModelMixin): db_index=True ) component_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', limit_choices_to=MODULAR_COMPONENT_MODELS, on_delete=models.PROTECT, related_name='+', diff --git a/netbox/extras/api/serializers.py b/netbox/extras/api/serializers.py index c1fad99ee..4864253ab 100644 --- a/netbox/extras/api/serializers.py +++ b/netbox/extras/api/serializers.py @@ -1,10 +1,10 @@ from django.contrib.auth import get_user_model -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from rest_framework import serializers from core.api.serializers import JobSerializer from core.api.nested_serializers import NestedDataSourceSerializer, NestedDataFileSerializer, NestedJobSerializer +from core.models import ContentType from dcim.api.nested_serializers import ( NestedDeviceRoleSerializer, NestedDeviceTypeSerializer, NestedLocationSerializer, NestedPlatformSerializer, NestedRegionSerializer, NestedSiteSerializer, NestedSiteGroupSerializer, @@ -14,7 +14,6 @@ from drf_spectacular.utils import extend_schema_field from drf_spectacular.types import OpenApiTypes from extras.choices import * from extras.models import * -from extras.utils import FeatureQuery from netbox.api.exceptions import SerializerNotFound from netbox.api.fields import ChoiceField, ContentTypeField, SerializedPKRelatedField from netbox.api.serializers import BaseModelSerializer, NetBoxModelSerializer, ValidatedModelSerializer @@ -64,7 +63,7 @@ __all__ = ( class WebhookSerializer(NetBoxModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:webhook-detail') content_types = ContentTypeField( - queryset=ContentType.objects.filter(FeatureQuery('webhooks').get_query()), + queryset=ContentType.objects.with_feature('webhooks'), many=True ) @@ -85,7 +84,7 @@ class WebhookSerializer(NetBoxModelSerializer): class CustomFieldSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customfield-detail') content_types = ContentTypeField( - queryset=ContentType.objects.filter(FeatureQuery('custom_fields').get_query()), + queryset=ContentType.objects.with_feature('custom_fields'), many=True ) type = ChoiceField(choices=CustomFieldTypeChoices) @@ -151,7 +150,7 @@ class CustomFieldChoiceSetSerializer(ValidatedModelSerializer): class CustomLinkSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:customlink-detail') content_types = ContentTypeField( - queryset=ContentType.objects.filter(FeatureQuery('custom_links').get_query()), + queryset=ContentType.objects.with_feature('custom_links'), many=True ) @@ -170,7 +169,7 @@ class CustomLinkSerializer(ValidatedModelSerializer): class ExportTemplateSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:exporttemplate-detail') content_types = ContentTypeField( - queryset=ContentType.objects.filter(FeatureQuery('export_templates').get_query()), + queryset=ContentType.objects.with_feature('export_templates'), many=True ) data_source = NestedDataSourceSerializer( @@ -215,7 +214,7 @@ class SavedFilterSerializer(ValidatedModelSerializer): class BookmarkSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:bookmark-detail') object_type = ContentTypeField( - queryset=ContentType.objects.filter(FeatureQuery('bookmarks').get_query()), + queryset=ContentType.objects.with_feature('bookmarks'), ) object = serializers.SerializerMethodField(read_only=True) user = NestedUserSerializer() @@ -239,7 +238,7 @@ class BookmarkSerializer(ValidatedModelSerializer): class TagSerializer(ValidatedModelSerializer): url = serializers.HyperlinkedIdentityField(view_name='extras-api:tag-detail') object_types = ContentTypeField( - queryset=ContentType.objects.filter(FeatureQuery('tags').get_query()), + queryset=ContentType.objects.with_feature('tags'), many=True, required=False ) diff --git a/netbox/extras/dashboard/widgets.py b/netbox/extras/dashboard/widgets.py index 7f0229f88..8cfbb4c61 100644 --- a/netbox/extras/dashboard/widgets.py +++ b/netbox/extras/dashboard/widgets.py @@ -32,13 +32,20 @@ __all__ = ( ) -def get_content_type_labels(): +def get_object_type_choices(): return [ (content_type_identifier(ct), content_type_name(ct)) for ct in ContentType.objects.public().order_by('app_label', 'model') ] +def get_bookmarks_object_type_choices(): + return [ + (content_type_identifier(ct), content_type_name(ct)) + for ct in ContentType.objects.with_feature('bookmarks').order_by('app_label', 'model') + ] + + def get_models_from_content_types(content_types): """ Return a list of models corresponding to the given content types, identified by natural key. @@ -158,7 +165,7 @@ class ObjectCountsWidget(DashboardWidget): class ConfigForm(WidgetConfigForm): models = forms.MultipleChoiceField( - choices=get_content_type_labels + choices=get_object_type_choices ) filters = forms.JSONField( required=False, @@ -207,7 +214,7 @@ class ObjectListWidget(DashboardWidget): class ConfigForm(WidgetConfigForm): model = forms.ChoiceField( - choices=get_content_type_labels + choices=get_object_type_choices ) page_size = forms.IntegerField( required=False, @@ -343,8 +350,7 @@ class BookmarksWidget(DashboardWidget): class ConfigForm(WidgetConfigForm): object_types = forms.MultipleChoiceField( - # TODO: Restrict the choices by FeatureQuery('bookmarks') - choices=get_content_type_labels, + choices=get_bookmarks_object_type_choices, required=False ) order_by = forms.ChoiceField( diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index 03a6d118b..9b3f59af0 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -6,7 +6,6 @@ from django.utils.translation import gettext_lazy as _ from core.models import ContentType from extras.choices import * from extras.models import * -from extras.utils import FeatureQuery from netbox.forms import NetBoxModelImportForm from utilities.forms import CSVModelForm from utilities.forms.fields import ( @@ -29,8 +28,7 @@ __all__ = ( class CustomFieldImportForm(CSVModelForm): content_types = CSVMultipleContentTypeField( label=_('Content types'), - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_fields'), + queryset=ContentType.objects.with_feature('custom_fields'), help_text=_("One or more assigned object types") ) type = CSVChoiceField( @@ -88,8 +86,7 @@ class CustomFieldChoiceSetImportForm(CSVModelForm): class CustomLinkImportForm(CSVModelForm): content_types = CSVMultipleContentTypeField( label=_('Content types'), - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_links'), + queryset=ContentType.objects.with_feature('custom_links'), help_text=_("One or more assigned object types") ) @@ -104,8 +101,7 @@ class CustomLinkImportForm(CSVModelForm): class ExportTemplateImportForm(CSVModelForm): content_types = CSVMultipleContentTypeField( label=_('Content types'), - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('export_templates'), + queryset=ContentType.objects.with_feature('export_templates'), help_text=_("One or more assigned object types") ) @@ -142,8 +138,7 @@ class SavedFilterImportForm(CSVModelForm): class WebhookImportForm(NetBoxModelImportForm): content_types = CSVMultipleContentTypeField( label=_('Content types'), - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('webhooks'), + queryset=ContentType.objects.with_feature('webhooks'), help_text=_("One or more assigned object types") ) diff --git a/netbox/extras/forms/filtersets.py b/netbox/extras/forms/filtersets.py index c0c8835b4..2d438377b 100644 --- a/netbox/extras/forms/filtersets.py +++ b/netbox/extras/forms/filtersets.py @@ -6,7 +6,6 @@ from core.models import ContentType, DataFile, DataSource from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup from extras.choices import * from extras.models import * -from extras.utils import FeatureQuery from netbox.forms.base import NetBoxModelFilterSetForm from tenancy.models import Tenant, TenantGroup from utilities.forms import BOOLEAN_WITH_BLANK_CHOICES, FilterForm, add_blank_choice @@ -44,7 +43,7 @@ class CustomFieldFilterForm(SavedFiltersMixin, FilterForm): )), ) content_type_id = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.filter(FeatureQuery('custom_fields').get_query()), + queryset=ContentType.objects.with_feature('custom_fields'), required=False, label=_('Object type') ) @@ -108,7 +107,7 @@ class CustomLinkFilterForm(SavedFiltersMixin, FilterForm): ) content_types = ContentTypeMultipleChoiceField( label=_('Content types'), - queryset=ContentType.objects.filter(FeatureQuery('custom_links').get_query()), + queryset=ContentType.objects.with_feature('custom_links'), required=False ) enabled = forms.NullBooleanField( @@ -151,7 +150,7 @@ class ExportTemplateFilterForm(SavedFiltersMixin, FilterForm): } ) content_type_id = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.filter(FeatureQuery('export_templates').get_query()), + queryset=ContentType.objects.with_feature('export_templates'), required=False, label=_('Content types') ) @@ -179,7 +178,7 @@ class ImageAttachmentFilterForm(SavedFiltersMixin, FilterForm): ) content_type_id = ContentTypeChoiceField( label=_('Content type'), - queryset=ContentType.objects.filter(FeatureQuery('image_attachments').get_query()), + queryset=ContentType.objects.with_feature('image_attachments'), required=False ) name = forms.CharField( @@ -228,7 +227,7 @@ class WebhookFilterForm(NetBoxModelFilterSetForm): (_('Events'), ('type_create', 'type_update', 'type_delete', 'type_job_start', 'type_job_end')), ) content_type_id = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.filter(FeatureQuery('webhooks').get_query()), + queryset=ContentType.objects.with_feature('webhooks'), required=False, label=_('Object type') ) @@ -284,12 +283,12 @@ class WebhookFilterForm(NetBoxModelFilterSetForm): class TagFilterForm(SavedFiltersMixin, FilterForm): model = Tag content_type_id = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.filter(FeatureQuery('tags').get_query()), + queryset=ContentType.objects.with_feature('tags'), required=False, label=_('Tagged object type') ) for_object_type_id = ContentTypeChoiceField( - queryset=ContentType.objects.filter(FeatureQuery('tags').get_query()), + queryset=ContentType.objects.with_feature('tags'), required=False, label=_('Allowed object type') ) diff --git a/netbox/extras/forms/model_forms.py b/netbox/extras/forms/model_forms.py index 7ab568ae0..755f7e836 100644 --- a/netbox/extras/forms/model_forms.py +++ b/netbox/extras/forms/model_forms.py @@ -10,7 +10,6 @@ from core.models import ContentType from dcim.models import DeviceRole, DeviceType, Location, Platform, Region, Site, SiteGroup from extras.choices import * from extras.models import * -from extras.utils import FeatureQuery from netbox.config import get_config, PARAMS from netbox.forms import NetBoxModelForm from tenancy.models import Tenant, TenantGroup @@ -43,8 +42,7 @@ __all__ = ( class CustomFieldForm(BootstrapMixin, forms.ModelForm): content_types = ContentTypeMultipleChoiceField( label=_('Content types'), - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_fields'), + queryset=ContentType.objects.with_feature('custom_fields') ) object_type = ContentTypeChoiceField( label=_('Object type'), @@ -114,8 +112,7 @@ class CustomFieldChoiceSetForm(BootstrapMixin, forms.ModelForm): class CustomLinkForm(BootstrapMixin, forms.ModelForm): content_types = ContentTypeMultipleChoiceField( label=_('Content types'), - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('custom_links') + queryset=ContentType.objects.with_feature('custom_links') ) fieldsets = ( @@ -142,8 +139,7 @@ class CustomLinkForm(BootstrapMixin, forms.ModelForm): class ExportTemplateForm(BootstrapMixin, SyncedDataMixin, forms.ModelForm): content_types = ContentTypeMultipleChoiceField( label=_('Content types'), - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('export_templates') + queryset=ContentType.objects.with_feature('export_templates') ) template_code = forms.CharField( label=_('Template code'), @@ -210,8 +206,7 @@ class SavedFilterForm(BootstrapMixin, forms.ModelForm): class BookmarkForm(BootstrapMixin, forms.ModelForm): object_type = ContentTypeChoiceField( label=_('Object type'), - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('bookmarks').get_query() + queryset=ContentType.objects.with_feature('bookmarks') ) class Meta: @@ -222,8 +217,7 @@ class BookmarkForm(BootstrapMixin, forms.ModelForm): class WebhookForm(NetBoxModelForm): content_types = ContentTypeMultipleChoiceField( label=_('Content types'), - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('webhooks') + queryset=ContentType.objects.with_feature('webhooks') ) fieldsets = ( @@ -257,8 +251,7 @@ class TagForm(BootstrapMixin, forms.ModelForm): slug = SlugField() object_types = ContentTypeMultipleChoiceField( label=_('Object types'), - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('tags'), + queryset=ContentType.objects.with_feature('tags'), required=False ) diff --git a/netbox/extras/migrations/0001_squashed.py b/netbox/extras/migrations/0001_squashed.py index 2fdcc07eb..6f1f77e53 100644 --- a/netbox/extras/migrations/0001_squashed.py +++ b/netbox/extras/migrations/0001_squashed.py @@ -88,7 +88,7 @@ class Migration(migrations.Migration): ('secret', models.CharField(blank=True, max_length=255)), ('ssl_verification', models.BooleanField(default=True)), ('ca_file_path', models.CharField(blank=True, max_length=4096, null=True)), - ('content_types', models.ManyToManyField(limit_choices_to=extras.utils.FeatureQuery('webhooks'), related_name='webhooks', to='contenttypes.ContentType')), + ('content_types', models.ManyToManyField(related_name='webhooks', to='contenttypes.ContentType')), ], options={ 'ordering': ('name',), @@ -151,7 +151,7 @@ class Migration(migrations.Migration): ('status', models.CharField(default='pending', max_length=30)), ('data', models.JSONField(blank=True, null=True)), ('job_id', models.UUIDField(unique=True)), - ('obj_type', models.ForeignKey(limit_choices_to=extras.utils.FeatureQuery('jobs'), on_delete=django.db.models.deletion.CASCADE, related_name='job_results', to='contenttypes.contenttype')), + ('obj_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='job_results', to='contenttypes.contenttype')), ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)), ], options={ @@ -184,7 +184,7 @@ class Migration(migrations.Migration): ('mime_type', models.CharField(blank=True, max_length=50)), ('file_extension', models.CharField(blank=True, max_length=15)), ('as_attachment', models.BooleanField(default=True)), - ('content_type', models.ForeignKey(limit_choices_to=extras.utils.FeatureQuery('export_templates'), on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), ], options={ 'ordering': ['content_type', 'name'], @@ -201,7 +201,7 @@ class Migration(migrations.Migration): ('group_name', models.CharField(blank=True, max_length=50)), ('button_class', models.CharField(default='default', max_length=30)), ('new_window', models.BooleanField(default=False)), - ('content_type', models.ForeignKey(limit_choices_to=extras.utils.FeatureQuery('custom_links'), on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), + ('content_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='contenttypes.contenttype')), ], options={ 'ordering': ['group_name', 'weight', 'name'], @@ -223,7 +223,7 @@ class Migration(migrations.Migration): ('validation_maximum', models.PositiveIntegerField(blank=True, null=True)), ('validation_regex', models.CharField(blank=True, max_length=500, validators=[utilities.validators.validate_regex])), ('choices', django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=100), blank=True, null=True, size=None)), - ('content_types', models.ManyToManyField(limit_choices_to=extras.utils.FeatureQuery('custom_fields'), related_name='custom_fields', to='contenttypes.ContentType')), + ('content_types', models.ManyToManyField(related_name='custom_fields', to='contenttypes.ContentType')), ], options={ 'ordering': ['weight', 'name'], diff --git a/netbox/extras/migrations/0094_tag_object_types.py b/netbox/extras/migrations/0094_tag_object_types.py index 944ef64b2..8bb760980 100644 --- a/netbox/extras/migrations/0094_tag_object_types.py +++ b/netbox/extras/migrations/0094_tag_object_types.py @@ -1,5 +1,4 @@ from django.db import migrations, models -import extras.utils class Migration(migrations.Migration): @@ -13,7 +12,7 @@ class Migration(migrations.Migration): migrations.AddField( model_name='tag', name='object_types', - field=models.ManyToManyField(blank=True, limit_choices_to=extras.utils.FeatureQuery('tags'), related_name='+', to='contenttypes.contenttype'), + field=models.ManyToManyField(blank=True, related_name='+', to='contenttypes.contenttype'), ), migrations.RenameIndex( model_name='taggeditem', diff --git a/netbox/extras/models/change_logging.py b/netbox/extras/models/change_logging.py index ac9c60998..5db0bba57 100644 --- a/netbox/extras/models/change_logging.py +++ b/netbox/extras/models/change_logging.py @@ -1,10 +1,11 @@ from django.conf import settings from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ +from core.models import ContentType from extras.choices import * from ..querysets import ObjectChangeQuerySet @@ -48,7 +49,7 @@ class ObjectChange(models.Model): choices=ObjectChangeActionChoices ) changed_object_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', on_delete=models.PROTECT, related_name='+' ) @@ -58,7 +59,7 @@ class ObjectChange(models.Model): fk_field='changed_object_id' ) related_object_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', on_delete=models.PROTECT, related_name='+', blank=True, @@ -104,6 +105,17 @@ class ObjectChange(models.Model): self.user_name ) + def clean(self): + super().clean() + + # Validate the assigned object type + if self.changed_object_type not in ContentType.objects.with_feature('change_logging'): + raise ValidationError( + _("Change logging is not supported for this object type ({type}).").format( + type=self.changed_object_type + ) + ) + def save(self, *args, **kwargs): # Record the user's name and the object's representation as static strings diff --git a/netbox/extras/models/customfields.py b/netbox/extras/models/customfields.py index 2cb12ed5b..939e8b73b 100644 --- a/netbox/extras/models/customfields.py +++ b/netbox/extras/models/customfields.py @@ -5,18 +5,16 @@ from datetime import datetime, date import django_filters from django import forms from django.conf import settings -from django.contrib.contenttypes.models import ContentType from django.contrib.postgres.fields import ArrayField from django.core.validators import RegexValidator, ValidationError from django.db import models from django.urls import reverse -from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ +from core.models import ContentType from extras.choices import * from extras.data import CHOICE_SETS -from extras.utils import FeatureQuery from netbox.models import ChangeLoggedModel from netbox.models.features import CloningMixin, ExportTemplatesMixin from netbox.search import FieldTypes @@ -60,9 +58,8 @@ class CustomFieldManager(models.Manager.from_queryset(RestrictedQuerySet)): class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): content_types = models.ManyToManyField( - to=ContentType, + to='contenttypes.ContentType', related_name='custom_fields', - limit_choices_to=FeatureQuery('custom_fields'), help_text=_('The object(s) to which this field applies.') ) type = models.CharField( @@ -73,7 +70,7 @@ class CustomField(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): help_text=_('The type of data this custom field holds') ) object_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', on_delete=models.PROTECT, blank=True, null=True, diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 90e8027b4..67b455ab4 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -3,7 +3,6 @@ import urllib.parse from django.conf import settings from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType from django.core.cache import cache from django.core.validators import ValidationError from django.db import models @@ -14,10 +13,11 @@ from django.utils.formats import date_format from django.utils.translation import gettext, gettext_lazy as _ from rest_framework.utils.encoders import JSONEncoder +from core.models import ContentType from extras.choices import * from extras.conditions import ConditionSet from extras.constants import * -from extras.utils import FeatureQuery, image_upload +from extras.utils import image_upload from netbox.config import get_config from netbox.models import ChangeLoggedModel from netbox.models.features import ( @@ -45,10 +45,9 @@ class Webhook(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedMo Each Webhook can be limited to firing only on certain actions or certain object types. """ content_types = models.ManyToManyField( - to=ContentType, + to='contenttypes.ContentType', related_name='webhooks', verbose_name=_('object types'), - limit_choices_to=FeatureQuery('webhooks'), help_text=_("The object(s) to which this Webhook applies.") ) name = models.CharField( @@ -235,7 +234,7 @@ class CustomLink(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): code to be rendered with an object as context. """ content_types = models.ManyToManyField( - to=ContentType, + to='contenttypes.ContentType', related_name='custom_links', help_text=_('The object type(s) to which this link applies.') ) @@ -331,7 +330,7 @@ class CustomLink(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): class ExportTemplate(SyncedDataMixin, CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): content_types = models.ManyToManyField( - to=ContentType, + to='contenttypes.ContentType', related_name='export_templates', help_text=_('The object type(s) to which this template applies.') ) @@ -440,7 +439,7 @@ class SavedFilter(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel): A set of predefined keyword parameters that can be reused to filter for specific objects. """ content_types = models.ManyToManyField( - to=ContentType, + to='contenttypes.ContentType', related_name='saved_filters', help_text=_('The object type(s) to which this filter applies.') ) @@ -520,7 +519,7 @@ class ImageAttachment(ChangeLoggedModel): An uploaded image which is associated with an object. """ content_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', on_delete=models.CASCADE ) object_id = models.PositiveBigIntegerField() @@ -560,6 +559,15 @@ class ImageAttachment(ChangeLoggedModel): filename = self.image.name.rsplit('/', 1)[-1] return filename.split('_', 2)[2] + def clean(self): + super().clean() + + # Validate the assigned object type + if self.content_type not in ContentType.objects.with_feature('image_attachments'): + raise ValidationError( + _("Image attachments cannot be assigned to this object type ({type}).").format(type=self.content_type) + ) + def delete(self, *args, **kwargs): _name = self.image.name @@ -605,7 +613,7 @@ class JournalEntry(CustomFieldsMixin, CustomLinksMixin, TagsMixin, ExportTemplat might record a new journal entry when a device undergoes maintenance, or when a prefix is expanded. """ assigned_object_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', on_delete=models.CASCADE ) assigned_object_id = models.PositiveBigIntegerField() @@ -644,9 +652,8 @@ class JournalEntry(CustomFieldsMixin, CustomLinksMixin, TagsMixin, ExportTemplat def clean(self): super().clean() - # Prevent the creation of journal entries on unsupported models - permitted_types = ContentType.objects.filter(FeatureQuery('journaling').get_query()) - if self.assigned_object_type not in permitted_types: + # Validate the assigned object type + if self.assigned_object_type not in ContentType.objects.with_feature('journaling'): raise ValidationError( _("Journaling is not supported for this object type ({type}).").format(type=self.assigned_object_type) ) @@ -664,7 +671,7 @@ class Bookmark(models.Model): auto_now_add=True ) object_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', on_delete=models.PROTECT ) object_id = models.PositiveBigIntegerField() @@ -695,6 +702,15 @@ class Bookmark(models.Model): return str(self.object) return super().__str__() + def clean(self): + super().clean() + + # Validate the assigned object type + if self.object_type not in ContentType.objects.with_feature('bookmarks'): + raise ValidationError( + _("Bookmarks cannot be assigned to this object type ({type}).").format(type=self.object_type) + ) + class ConfigRevision(models.Model): """ diff --git a/netbox/extras/models/search.py b/netbox/extras/models/search.py index bebcabd31..9ba779642 100644 --- a/netbox/extras/models/search.py +++ b/netbox/extras/models/search.py @@ -1,6 +1,5 @@ import uuid -from django.contrib.contenttypes.models import ContentType from django.db import models from django.utils.translation import gettext_lazy as _ @@ -27,7 +26,7 @@ class CachedValue(models.Model): editable=False ) object_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', on_delete=models.CASCADE, related_name='+' ) diff --git a/netbox/extras/models/staging.py b/netbox/extras/models/staging.py index b0df9e26e..2e848a817 100644 --- a/netbox/extras/models/staging.py +++ b/netbox/extras/models/staging.py @@ -2,7 +2,6 @@ import logging from django.contrib.auth import get_user_model from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType from django.db import models, transaction from django.utils.translation import gettext_lazy as _ @@ -71,7 +70,7 @@ class StagedChange(ChangeLoggedModel): choices=ChangeActionChoices ) object_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', on_delete=models.CASCADE, related_name='+' ) diff --git a/netbox/extras/models/tags.py b/netbox/extras/models/tags.py index de4f15509..3aba6df60 100644 --- a/netbox/extras/models/tags.py +++ b/netbox/extras/models/tags.py @@ -1,13 +1,10 @@ from django.conf import settings -from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse from django.utils.text import slugify from django.utils.translation import gettext_lazy as _ from taggit.models import TagBase, GenericTaggedItemBase -from extras.utils import FeatureQuery from netbox.models import ChangeLoggedModel from netbox.models.features import CloningMixin, ExportTemplatesMixin from utilities.choices import ColorChoices @@ -37,9 +34,8 @@ class Tag(CloningMixin, ExportTemplatesMixin, ChangeLoggedModel, TagBase): blank=True, ) object_types = models.ManyToManyField( - to=ContentType, + to='contenttypes.ContentType', related_name='+', - limit_choices_to=FeatureQuery('tags'), blank=True, help_text=_("The object type(s) to which this this tag can be applied.") ) diff --git a/netbox/extras/utils.py b/netbox/extras/utils.py index 7b9356efb..c6b2de188 100644 --- a/netbox/extras/utils.py +++ b/netbox/extras/utils.py @@ -1,5 +1,3 @@ -from django.db.models import Q -from django.utils.deconstruct import deconstructible from taggit.managers import _TaggableManager from netbox.registry import registry @@ -31,29 +29,6 @@ def image_upload(instance, filename): return '{}{}_{}_{}'.format(path, instance.content_type.name, instance.object_id, filename) -@deconstructible -class FeatureQuery: - """ - Helper class that delays evaluation of the registry contents for the functionality store - until it has been populated. - """ - def __init__(self, feature): - self.feature = feature - - def __call__(self): - return self.get_query() - - def get_query(self): - """ - Given an extras feature, return a Q object for content type lookup - """ - query = Q() - for app_label, models in registry['model_features'][self.feature].items(): - query |= Q(app_label=app_label, model__in=models) - - return query - - def register_features(model, features): """ Register model features in the application registry. diff --git a/netbox/ipam/models/fhrp.py b/netbox/ipam/models/fhrp.py index 5d355102f..1e4e7dac3 100644 --- a/netbox/ipam/models/fhrp.py +++ b/netbox/ipam/models/fhrp.py @@ -1,13 +1,12 @@ from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation -from django.contrib.contenttypes.models import ContentType from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ -from netbox.models import ChangeLoggedModel, PrimaryModel from ipam.choices import * from ipam.constants import * +from netbox.models import ChangeLoggedModel, PrimaryModel __all__ = ( 'FHRPGroup', @@ -78,7 +77,7 @@ class FHRPGroup(PrimaryModel): class FHRPGroupAssignment(ChangeLoggedModel): interface_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', on_delete=models.CASCADE ) interface_id = models.PositiveBigIntegerField() diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index 934cb98c7..7dc0ac445 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -1,6 +1,5 @@ import netaddr from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.db import models from django.db.models import F @@ -9,6 +8,7 @@ from django.urls import reverse from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ +from core.models import ContentType from ipam.choices import * from ipam.constants import * from ipam.fields import IPNetworkField, IPAddressField @@ -740,7 +740,7 @@ class IPAddress(PrimaryModel): help_text=_('The functional role of this IP') ) assigned_object_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', limit_choices_to=IPADDRESS_ASSIGNMENT_MODELS, on_delete=models.PROTECT, related_name='+', diff --git a/netbox/ipam/models/l2vpn.py b/netbox/ipam/models/l2vpn.py index 3072fc6c3..a2742a8f3 100644 --- a/netbox/ipam/models/l2vpn.py +++ b/netbox/ipam/models/l2vpn.py @@ -1,11 +1,11 @@ from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ +from core.models import ContentType from ipam.choices import L2VPNTypeChoices from ipam.constants import L2VPN_ASSIGNMENT_MODELS from netbox.models import NetBoxModel, PrimaryModel @@ -86,7 +86,7 @@ class L2VPNTermination(NetBoxModel): related_name='terminations' ) assigned_object_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', limit_choices_to=L2VPN_ASSIGNMENT_MODELS, on_delete=models.PROTECT, related_name='+' diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index 675d03ee5..b6aed5398 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -1,5 +1,4 @@ from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation -from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models @@ -32,7 +31,7 @@ class VLANGroup(OrganizationalModel): max_length=100 ) scope_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', on_delete=models.CASCADE, limit_choices_to=Q(model__in=VLANGROUP_SCOPE_TYPES), blank=True, diff --git a/netbox/netbox/models/features.py b/netbox/netbox/models/features.py index cce265efc..11307b4f8 100644 --- a/netbox/netbox/models/features.py +++ b/netbox/netbox/models/features.py @@ -3,7 +3,6 @@ from collections import defaultdict from functools import cached_property from django.contrib.contenttypes.fields import GenericRelation -from django.contrib.contenttypes.models import ContentType from django.core.validators import ValidationError from django.db import models from django.db.models.signals import class_prepared @@ -13,6 +12,7 @@ from django.utils.translation import gettext_lazy as _ from taggit.managers import TaggableManager from core.choices import JobStatusChoices +from core.models import ContentType from extras.choices import CustomFieldVisibilityChoices, ObjectChangeActionChoices from extras.utils import is_taggable, register_features from netbox.registry import registry diff --git a/netbox/tenancy/forms/filtersets.py b/netbox/tenancy/forms/filtersets.py index 692b8963f..77e945542 100644 --- a/netbox/tenancy/forms/filtersets.py +++ b/netbox/tenancy/forms/filtersets.py @@ -1,8 +1,7 @@ from django import forms -from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext_lazy as _ -from extras.utils import FeatureQuery +from core.models import ContentType from netbox.forms import NetBoxModelFilterSetForm from tenancy.choices import * from tenancy.models import * @@ -87,8 +86,7 @@ class ContactAssignmentFilterForm(NetBoxModelFilterSetForm): (_('Assignment'), ('content_type_id', 'group_id', 'contact_id', 'role_id', 'priority')), ) content_type_id = ContentTypeMultipleChoiceField( - queryset=ContentType.objects.all(), - limit_choices_to=FeatureQuery('contacts'), + queryset=ContentType.objects.with_feature('contacts'), required=False, label=_('Object type') ) diff --git a/netbox/tenancy/models/contacts.py b/netbox/tenancy/models/contacts.py index 6cc26fa83..e7f319051 100644 --- a/netbox/tenancy/models/contacts.py +++ b/netbox/tenancy/models/contacts.py @@ -1,9 +1,10 @@ from django.contrib.contenttypes.fields import GenericForeignKey -from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse from django.utils.translation import gettext_lazy as _ +from core.models import ContentType from netbox.models import ChangeLoggedModel, NestedGroupModel, OrganizationalModel, PrimaryModel from netbox.models.features import CustomFieldsMixin, TagsMixin from tenancy.choices import * @@ -111,7 +112,7 @@ class Contact(PrimaryModel): class ContactAssignment(CustomFieldsMixin, TagsMixin, ChangeLoggedModel): content_type = models.ForeignKey( - to=ContentType, + to='contenttypes.ContentType', on_delete=models.CASCADE ) object_id = models.PositiveBigIntegerField() @@ -157,6 +158,15 @@ class ContactAssignment(CustomFieldsMixin, TagsMixin, ChangeLoggedModel): def get_absolute_url(self): return reverse('tenancy:contact', args=[self.contact.pk]) + def clean(self): + super().clean() + + # Validate the assigned object type + if self.content_type not in ContentType.objects.with_feature('contacts'): + raise ValidationError( + _("Contacts cannot be assigned to this object type ({type}).").format(type=self.content_type) + ) + def to_objectchange(self, action): objectchange = super().to_objectchange(action) objectchange.related_object = self.object diff --git a/netbox/users/models.py b/netbox/users/models.py index 2a345653d..d77d4932c 100644 --- a/netbox/users/models.py +++ b/netbox/users/models.py @@ -3,7 +3,6 @@ import os from django.conf import settings from django.contrib.auth.models import Group, GroupManager, User, UserManager -from django.contrib.contenttypes.models import ContentType from django.contrib.postgres.fields import ArrayField from django.core.exceptions import ValidationError from django.core.validators import MinLengthValidator @@ -15,6 +14,7 @@ from django.utils import timezone from django.utils.translation import gettext_lazy as _ from netaddr import IPNetwork +from core.models import ContentType from ipam.fields import IPNetworkField from netbox.config import get_config from utilities.querysets import RestrictedQuerySet @@ -353,7 +353,7 @@ class ObjectPermission(models.Model): default=True ) object_types = models.ManyToManyField( - to=ContentType, + to='contenttypes.ContentType', limit_choices_to=OBJECTPERMISSION_OBJECT_TYPES, related_name='object_permissions' ) From e767fec5cc33494cd1ca90bde801ed70e92b859d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 16 Nov 2023 12:16:35 -0500 Subject: [PATCH 099/271] Closes #14173: Enable plugins to register columns on core tables (#14265) * Closes #14173: Enable plugins to register columns on core tables * Support translation for column name * Document new registry store --- docs/development/application-registry.md | 4 ++++ docs/plugins/development/tables.md | 25 ++++++++++++++++++++++ netbox/netbox/registry.py | 1 + netbox/netbox/tables/tables.py | 10 ++++++++- netbox/netbox/tests/dummy_plugin/tables.py | 11 ++++++++++ netbox/netbox/tests/dummy_plugin/views.py | 2 ++ netbox/netbox/tests/test_plugins.py | 10 +++++++++ netbox/utilities/tables.py | 19 ++++++++++++++++ 8 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 netbox/netbox/tests/dummy_plugin/tables.py diff --git a/docs/development/application-registry.md b/docs/development/application-registry.md index c7ac6ca46..c845cd5a7 100644 --- a/docs/development/application-registry.md +++ b/docs/development/application-registry.md @@ -53,6 +53,10 @@ This store maintains all registered items for plugins, such as navigation menus, A dictionary mapping each model (identified by its app and label) to its search index class, if one has been registered for it. +### `tables` + +A dictionary mapping table classes to lists of extra columns that have been registered by plugins using the `register_table_column()` utility function. Each column is defined as a tuple of name and column instance. + ### `views` A hierarchical mapping of registered views for each model. Mappings are added using the `register_model_view()` decorator, and URLs paths can be generated from these using `get_model_urls()`. diff --git a/docs/plugins/development/tables.md b/docs/plugins/development/tables.md index f846139f0..9d57a9603 100644 --- a/docs/plugins/development/tables.md +++ b/docs/plugins/development/tables.md @@ -87,3 +87,28 @@ The table column classes listed below are supported for use in plugins. These cl options: members: - __init__ + +## Extending Core Tables + +!!! info "This feature was introduced in NetBox v3.7." + +Plugins can register their own custom columns on core tables using the `register_table_column()` utility function. This allows a plugin to attach additional information, such as relationships to its own models, to built-in object lists. + +```python +import django_tables2 +from django.utils.translation import gettext_lazy as _ + +from dcim.tables import SiteTable +from utilities.tables import register_table_column + +mycol = django_tables2.Column( + verbose_name=_('My Column'), + accessor=django_tables2.A('description') +) + +register_table_column(mycol, 'foo', SiteTable) +``` + +You'll typically want to define an accessor identifying the desired model field or relationship when defining a custom column. See the [django-tables2 documentation](https://django-tables2.readthedocs.io/) for more information on creating custom columns. + +::: utilities.tables.register_table_column diff --git a/netbox/netbox/registry.py b/netbox/netbox/registry.py index 151eb2f6b..ad8c18dcf 100644 --- a/netbox/netbox/registry.py +++ b/netbox/netbox/registry.py @@ -28,6 +28,7 @@ registry = Registry({ 'models': collections.defaultdict(set), 'plugins': dict(), 'search': dict(), + 'tables': collections.defaultdict(dict), 'views': collections.defaultdict(dict), 'widgets': dict(), }) diff --git a/netbox/netbox/tables/tables.py b/netbox/netbox/tables/tables.py index cb53310cc..83dc3ae3c 100644 --- a/netbox/netbox/tables/tables.py +++ b/netbox/netbox/tables/tables.py @@ -1,3 +1,5 @@ +from copy import deepcopy + import django_tables2 as tables from django.contrib.auth.models import AnonymousUser from django.contrib.contenttypes.fields import GenericForeignKey @@ -12,6 +14,7 @@ from django_tables2.data import TableQuerysetData from extras.models import CustomField, CustomLink from extras.choices import CustomFieldVisibilityChoices +from netbox.registry import registry from netbox.tables import columns from utilities.paginator import EnhancedPaginator, get_paginate_count from utilities.utils import get_viewname, highlight_string, title @@ -191,12 +194,17 @@ class NetBoxTable(BaseTable): if extra_columns is None: extra_columns = [] + if registered_columns := registry['tables'].get(self.__class__): + extra_columns.extend([ + # Create a copy to avoid modifying the original Column + (name, deepcopy(column)) for name, column in registered_columns.items() + ]) + # Add custom field & custom link columns content_type = ContentType.objects.get_for_model(self._meta.model) custom_fields = CustomField.objects.filter( content_types=content_type ).exclude(ui_visibility=CustomFieldVisibilityChoices.VISIBILITY_HIDDEN) - extra_columns.extend([ (f'cf_{cf.name}', columns.CustomFieldColumn(cf)) for cf in custom_fields ]) diff --git a/netbox/netbox/tests/dummy_plugin/tables.py b/netbox/netbox/tests/dummy_plugin/tables.py new file mode 100644 index 000000000..0f1e823d7 --- /dev/null +++ b/netbox/netbox/tests/dummy_plugin/tables.py @@ -0,0 +1,11 @@ +import django_tables2 as tables + +from dcim.tables import SiteTable +from utilities.tables import register_table_column + +mycol = tables.Column( + verbose_name='My column', + accessor=tables.A('description') +) + +register_table_column(mycol, 'foo', SiteTable) diff --git a/netbox/netbox/tests/dummy_plugin/views.py b/netbox/netbox/tests/dummy_plugin/views.py index 8713102c5..03a83b585 100644 --- a/netbox/netbox/tests/dummy_plugin/views.py +++ b/netbox/netbox/tests/dummy_plugin/views.py @@ -4,6 +4,8 @@ from django.views.generic import View from dcim.models import Site from utilities.views import register_model_view from .models import DummyModel +# Trigger registration of custom column +from .tables import mycol class DummyModelsView(View): diff --git a/netbox/netbox/tests/test_plugins.py b/netbox/netbox/tests/test_plugins.py index 046436a86..40bf8b0ea 100644 --- a/netbox/netbox/tests/test_plugins.py +++ b/netbox/netbox/tests/test_plugins.py @@ -97,6 +97,16 @@ class PluginTest(TestCase): self.assertIn(SiteContent, registry['plugins']['template_extensions']['dcim.site']) + def test_registered_columns(self): + """ + Check that a plugin can register a custom column on a core model table. + """ + from dcim.models import Site + from dcim.tables import SiteTable + + table = SiteTable(Site.objects.all()) + self.assertIn('foo', table.columns.names()) + def test_user_preferences(self): """ Check that plugin UserPreferences are registered. diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index 489b90f10..654eb02be 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -1,6 +1,9 @@ +from netbox.registry import registry + __all__ = ( 'get_table_ordering', 'linkify_phone', + 'register_table_column' ) @@ -26,3 +29,19 @@ def linkify_phone(value): if value is None: return None return f"tel:{value}" + + +def register_table_column(column, name, *tables): + """ + Register a custom column for use on one or more tables. + + Args: + column: The column instance to register + name: The name of the table column + tables: One or more table classes + """ + for table in tables: + reg = registry['tables'][table] + if name in reg: + raise ValueError(f"A column named {name} is already defined for table {table.__name__}") + reg[name] = column From e13bf48a35a2f979ef4c8460cd6f447977029e89 Mon Sep 17 00:00:00 2001 From: Pavel Korovin Date: Fri, 17 Nov 2023 16:32:58 +0300 Subject: [PATCH 100/271] Add /api/virtualization/virtual-machines/{id}/render-config/ endpoint (#14287) * Add /api/virtualization/virtual-machines/{id}/render-config/ endpoint * Update Docstring "Device" -> "Virtual Machine" Docstring should mention "..this Virtual Machine" instead of "...this Device", thanks @LuPo! * Move config rendering logic to new RenderConfigMixin * Add tests for render-config API endpoint --------- Co-authored-by: Jeremy Stretch --- netbox/dcim/api/views.py | 24 ++--------------- netbox/dcim/tests/test_api.py | 17 ++++++++++++ netbox/extras/api/mixins.py | 35 ++++++++++++++++++++++++- netbox/virtualization/api/views.py | 6 ++--- netbox/virtualization/tests/test_api.py | 17 ++++++++++++ 5 files changed, 73 insertions(+), 26 deletions(-) diff --git a/netbox/dcim/api/views.py b/netbox/dcim/api/views.py index a3e532f0b..cd5a297c9 100644 --- a/netbox/dcim/api/views.py +++ b/netbox/dcim/api/views.py @@ -3,10 +3,8 @@ from django.shortcuts import get_object_or_404 from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import extend_schema, OpenApiParameter from rest_framework.decorators import action -from rest_framework.renderers import JSONRenderer from rest_framework.response import Response from rest_framework.routers import APIRootView -from rest_framework.status import HTTP_400_BAD_REQUEST from rest_framework.viewsets import ViewSet from circuits.models import Circuit @@ -14,12 +12,11 @@ from dcim import filtersets from dcim.constants import CABLE_TRACE_SVG_DEFAULT_WIDTH from dcim.models import * from dcim.svg import CableTraceSVG -from extras.api.mixins import ConfigContextQuerySetMixin, ConfigTemplateRenderMixin +from extras.api.mixins import ConfigContextQuerySetMixin, RenderConfigMixin from ipam.models import Prefix, VLAN from netbox.api.authentication import IsAuthenticatedOrLoginNotRequired from netbox.api.metadata import ContentTypeMetadata from netbox.api.pagination import StripCountAnnotationsPaginator -from netbox.api.renderers import TextRenderer from netbox.api.viewsets import NetBoxModelViewSet, MPTTLockedMixin from netbox.api.viewsets.mixins import SequentialBulkCreatesMixin from netbox.constants import NESTED_SERIALIZER_PREFIX @@ -390,7 +387,7 @@ class PlatformViewSet(NetBoxModelViewSet): class DeviceViewSet( SequentialBulkCreatesMixin, ConfigContextQuerySetMixin, - ConfigTemplateRenderMixin, + RenderConfigMixin, NetBoxModelViewSet ): queryset = Device.objects.prefetch_related( @@ -420,23 +417,6 @@ class DeviceViewSet( return serializers.DeviceWithConfigContextSerializer - @action(detail=True, methods=['post'], url_path='render-config', renderer_classes=[JSONRenderer, TextRenderer]) - def render_config(self, request, pk): - """ - Resolve and render the preferred ConfigTemplate for this Device. - """ - device = self.get_object() - configtemplate = device.get_config_template() - if not configtemplate: - return Response({'error': 'No config template found for this device.'}, status=HTTP_400_BAD_REQUEST) - - # Compile context data - context_data = device.get_config_context() - context_data.update(request.data) - context_data.update({'device': device}) - - return self.render_configtemplate(request, configtemplate, context_data) - class VirtualDeviceContextViewSet(NetBoxModelViewSet): queryset = VirtualDeviceContext.objects.prefetch_related( diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index d3211a75f..f36b11033 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -6,6 +6,7 @@ from rest_framework import status from dcim.choices import * from dcim.constants import * from dcim.models import * +from extras.models import ConfigTemplate from ipam.models import ASN, RIR, VLAN, VRF from netbox.api.serializers import GenericObjectSerializer from utilities.testing import APITestCase, APIViewTestCases, create_test_device @@ -1265,6 +1266,22 @@ class DeviceTest(APIViewTestCases.APIViewTestCase): self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + def test_render_config(self): + configtemplate = ConfigTemplate.objects.create( + name='Config Template 1', + template_code='Config for device {{ device.name }}' + ) + + device = Device.objects.first() + device.config_template = configtemplate + device.save() + + self.add_permissions('dcim.add_device') + url = reverse('dcim-api:device-detail', kwargs={'pk': device.pk}) + 'render-config/' + response = self.client.post(url, {}, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + self.assertEqual(response.data['content'], f'Config for device {device.name}') + class ModuleTest(APIViewTestCases.APIViewTestCase): model = Module diff --git a/netbox/extras/api/mixins.py b/netbox/extras/api/mixins.py index b6be47bbb..1737ff9f8 100644 --- a/netbox/extras/api/mixins.py +++ b/netbox/extras/api/mixins.py @@ -1,10 +1,16 @@ from jinja2.exceptions import TemplateError +from rest_framework.decorators import action +from rest_framework.renderers import JSONRenderer from rest_framework.response import Response +from rest_framework.status import HTTP_400_BAD_REQUEST +from netbox.api.renderers import TextRenderer from .nested_serializers import NestedConfigTemplateSerializer __all__ = ( 'ConfigContextQuerySetMixin', + 'ConfigTemplateRenderMixin', + 'RenderConfigMixin', ) @@ -31,7 +37,9 @@ class ConfigContextQuerySetMixin: class ConfigTemplateRenderMixin: - + """ + Provides a method to return a rendered ConfigTemplate as REST API data. + """ def render_configtemplate(self, request, configtemplate, context): try: output = configtemplate.render(context=context) @@ -50,3 +58,28 @@ class ConfigTemplateRenderMixin: 'configtemplate': template_serializer.data, 'content': output }) + + +class RenderConfigMixin(ConfigTemplateRenderMixin): + """ + Provides a /render-config/ endpoint for REST API views whose model may have a ConfigTemplate assigned. + """ + @action(detail=True, methods=['post'], url_path='render-config', renderer_classes=[JSONRenderer, TextRenderer]) + def render_config(self, request, pk): + """ + Resolve and render the preferred ConfigTemplate for this Device. + """ + instance = self.get_object() + object_type = instance._meta.model_name + configtemplate = instance.get_config_template() + if not configtemplate: + return Response({ + 'error': f'No config template found for this {object_type}.' + }, status=HTTP_400_BAD_REQUEST) + + # Compile context data + context_data = instance.get_config_context() + context_data.update(request.data) + context_data.update({object_type: instance}) + + return self.render_configtemplate(request, configtemplate, context_data) diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index 04e8f2167..2b28505ab 100644 --- a/netbox/virtualization/api/views.py +++ b/netbox/virtualization/api/views.py @@ -1,7 +1,7 @@ from rest_framework.routers import APIRootView from dcim.models import Device -from extras.api.mixins import ConfigContextQuerySetMixin +from extras.api.mixins import ConfigContextQuerySetMixin, RenderConfigMixin from netbox.api.viewsets import NetBoxModelViewSet from utilities.query_functions import CollateAsChar from utilities.utils import count_related @@ -53,9 +53,9 @@ class ClusterViewSet(NetBoxModelViewSet): # Virtual machines # -class VirtualMachineViewSet(ConfigContextQuerySetMixin, NetBoxModelViewSet): +class VirtualMachineViewSet(ConfigContextQuerySetMixin, RenderConfigMixin, NetBoxModelViewSet): queryset = VirtualMachine.objects.prefetch_related( - 'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'tags' + 'site', 'cluster', 'device', 'role', 'tenant', 'platform', 'primary_ip4', 'primary_ip6', 'config_template', 'tags' ) filterset_class = filtersets.VirtualMachineFilterSet diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index 3fb46fbb9..b33f3afe9 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -3,6 +3,7 @@ from rest_framework import status from dcim.choices import InterfaceModeChoices from dcim.models import Site +from extras.models import ConfigTemplate from ipam.models import VLAN, VRF from utilities.testing import APITestCase, APIViewTestCases, create_test_device from virtualization.choices import * @@ -228,6 +229,22 @@ class VirtualMachineTest(APIViewTestCases.APIViewTestCase): response = self.client.post(url, data, format='json', **self.header) self.assertHttpStatus(response, status.HTTP_400_BAD_REQUEST) + def test_render_config(self): + configtemplate = ConfigTemplate.objects.create( + name='Config Template 1', + template_code='Config for virtual machine {{ virtualmachine.name }}' + ) + + vm = VirtualMachine.objects.first() + vm.config_template = configtemplate + vm.save() + + self.add_permissions('virtualization.add_virtualmachine') + url = reverse('virtualization-api:virtualmachine-detail', kwargs={'pk': vm.pk}) + 'render-config/' + response = self.client.post(url, {}, format='json', **self.header) + self.assertHttpStatus(response, status.HTTP_200_OK) + self.assertEqual(response.data['content'], f'Config for virtual machine {vm.name}') + class VMInterfaceTest(APIViewTestCases.APIViewTestCase): model = VMInterface From 549b0ea10718bfd74dd6e9c790ccb4133f832fc0 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 17 Nov 2023 12:02:56 -0800 Subject: [PATCH 101/271] Closes #8356: Add virtual disk to Virtual Machines (#14087) * 8356 add virtual disk model * 8356 add supplemental forms * 8356 add menu * 8356 cleanup views * 8356 virtual machine tab * 8356 migrations * 8356 vm disk tables * 8356 cleanup * 8356 graphql * 8356 graphql * 8356 add components button * 8356 bulk add on virtualmachine * 8356 bulk add fixes * 8356 api tests * 8356 news tests add rename * 8356 VirtualDiskCreateForm * 8356 fix test * 8356 add todo to remove disk from vm * 8356 review changes * 8356 fix test * 8356 deprecate disk field * 8356 review changes * 8356 fix test * 8356 fix test * Simplify view actions * 8356 review changes * 8356 split trans tag * 8356 add total virtual disk size to api * 8356 add virtual disk list to virtual machine detail view * 8356 move virtual disk size to property * 8356 revert property * Tweak display of deprecated disk field * 8356 render single disk field * 8356 update serializer * 8356 model property * 8356 fix test * 8356 review changes * Revert disk space annotation * Use existing disk field to store aggregate virtual disk size * Introduce abstract ComponentModel for VM components * Add search index for VirtualDisk * Misc cleanup --------- Co-authored-by: Jeremy Stretch --- netbox/netbox/navigation/menu.py | 1 + .../templates/virtualization/virtualdisk.html | 59 +++++++++++ .../virtualization/virtualmachine.html | 38 +++++-- .../virtualization/virtualmachine/base.html | 24 ++++- .../virtualmachine/virtual_disks.html | 14 +++ .../virtualization/virtualmachine_list.html | 7 ++ .../virtualization/api/nested_serializers.py | 12 ++- netbox/virtualization/api/serializers.py | 23 +++- netbox/virtualization/api/urls.py | 1 + netbox/virtualization/api/views.py | 14 ++- netbox/virtualization/apps.py | 2 +- netbox/virtualization/filtersets.py | 29 ++++- netbox/virtualization/forms/bulk_create.py | 10 +- netbox/virtualization/forms/bulk_edit.py | 34 ++++++ netbox/virtualization/forms/bulk_import.py | 15 +++ netbox/virtualization/forms/filtersets.py | 21 ++++ netbox/virtualization/forms/model_forms.py | 38 +++++-- netbox/virtualization/forms/object_create.py | 13 ++- netbox/virtualization/graphql/schema.py | 6 ++ netbox/virtualization/graphql/types.py | 12 +++ .../migrations/0038_virtualdisk.py | 50 +++++++++ .../virtualization/models/virtualmachines.py | 100 ++++++++++++++---- netbox/virtualization/search.py | 10 ++ netbox/virtualization/signals.py | 16 +++ .../virtualization/tables/virtualmachines.py | 43 +++++++- netbox/virtualization/tests/test_api.py | 47 ++++++-- .../virtualization/tests/test_filtersets.py | 45 +++++++- netbox/virtualization/tests/test_models.py | 25 +++++ netbox/virtualization/tests/test_views.py | 55 +++++++++- netbox/virtualization/urls.py | 9 ++ netbox/virtualization/views.py | 94 +++++++++++++++- 31 files changed, 804 insertions(+), 63 deletions(-) create mode 100644 netbox/templates/virtualization/virtualdisk.html create mode 100644 netbox/templates/virtualization/virtualmachine/virtual_disks.html create mode 100644 netbox/virtualization/migrations/0038_virtualdisk.py create mode 100644 netbox/virtualization/signals.py diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 961fd2035..43cf3f869 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -218,6 +218,7 @@ VIRTUALIZATION_MENU = Menu( items=( get_model_item('virtualization', 'virtualmachine', _('Virtual Machines')), get_model_item('virtualization', 'vminterface', _('Interfaces')), + get_model_item('virtualization', 'virtualdisk', _('Virtual Disks')), ), ), MenuGroup( diff --git a/netbox/templates/virtualization/virtualdisk.html b/netbox/templates/virtualization/virtualdisk.html new file mode 100644 index 000000000..821e58796 --- /dev/null +++ b/netbox/templates/virtualization/virtualdisk.html @@ -0,0 +1,59 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load render_table from django_tables2 %} +{% load i18n %} + +{% block breadcrumbs %} + {{ block.super }} + +{% endblock %} + +{% block content %} +
      +
      +
      +
      {% trans "Virtual Disk" %}
      +
      + + + + + + + + + + + + + + + + + +
      {% trans "Virtual Machine" %}{{ object.virtual_machine|linkify }}
      {% trans "Name" %}{{ object.name }}
      {% trans "Size" %} + {% if object.size %} + {{ object.size }} {% trans "GB" context "Abbreviation for gigabyte" %} + {% else %} + {{ ''|placeholder }} + {% endif %} +
      {% trans "Description" %}{{ object.description|placeholder }}
      +
      +
      + {% include 'inc/panels/tags.html' %} + {% plugin_left_page object %} +
      +
      + {% include 'inc/panels/custom_fields.html' %} + {% plugin_right_page object %} +
      +
      +
      +
      + {% plugin_full_width_page object %} +
      +
      +{% endblock %} diff --git a/netbox/templates/virtualization/virtualmachine.html b/netbox/templates/virtualization/virtualmachine.html index 27f5ea114..873f18158 100644 --- a/netbox/templates/virtualization/virtualmachine.html +++ b/netbox/templates/virtualization/virtualmachine.html @@ -139,14 +139,16 @@ - {% trans "Disk Space" %} - - {% if object.disk %} - {{ object.disk }} {% trans "GB" context "Abbreviation for gigabyte" %} - {% else %} - {{ ''|placeholder }} - {% endif %} - + + {% trans "Disk Space" %} + + + {% if object.disk %} + {{ object.disk }} {% trans "GB" context "Abbreviation for gigabyte" %} + {% else %} + {{ ''|placeholder }} + {% endif %} +
      @@ -168,6 +170,26 @@ {% plugin_right_page object %}

    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�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�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 RJKh)W_1|mN|DUb+{{em60^I-r diff --git a/netbox/project-static/dist/graphiql.js.map b/netbox/project-static/dist/graphiql.js.map index 23c20b9a45fc405535a28e82c13648d4d9215898..fd9688c34203e31546aaab27615350883183e890 100644 GIT binary patch delta 15182 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 delta 37128 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 From a8a4bd7c211e15d56fe315047534c08a0b1bfc2c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 25 Sep 2023 13:03:20 -0400 Subject: [PATCH 004/271] Revert "#13887: Rebuild static assets" This reverts commit a0e5e69283ef634ef6579e997814212c99c69c85. --- netbox/project-static/dist/graphiql.css | Bin 27375 -> 29136 bytes netbox/project-static/dist/graphiql.js | Bin 978737 -> 1037991 bytes netbox/project-static/dist/graphiql.js.map | Bin 929453 -> 975440 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/netbox/project-static/dist/graphiql.css b/netbox/project-static/dist/graphiql.css index a20e480d3e975f86c6e9932f5dc3f372cb9d185e..267856f34593aa2e252a73f63eca1604674b9986 100644 GIT binary patch delta 1456 zcma)6J#5oJ6joXiQ7DB_(S#O?+p3~z<8V&eG_?m97!XVhbO1y-JLmMk^||(?G(4eJgCL{(XSQtQ_SP%;v0}L=RfLIv#TM!cxXUA@n79?by<$Hd2?|naa-`^%)e@Z;r zNG5c+n>-@kkCV@n+7e!s;p^EEe=YSh*;g=@WKXWS*jc2@mS69El!6!8-SGTC3eFD> z!pVbu{$&5NeM2kQrC7I!OsbSKSLT$92`8((3F+aZX<4_Jaa}W*#avbF*MK)Y15^KA zRlo+PE2P<4FoqB$E@wtK*1hH;p|wS>P8Xe3O~=Odn#<~TRi;b0M&Lo$D4a5m1-l;- z*-eLelv8G_F0pX1BODmc!Wkob^;+HI)NIHGvpKQ3YKRwcH3wI#)UL^#IV#$mxnaq& zs2KmZh{;uDT129L6okeje4<@62WxvX=d55|09VtQTP1=Q=ExpzSVXm%P2#A|IA?O|TmXS)~H!gj>_` zL~(j1ACJOpF5e0&A{Y%Nmuo|01f(vA4q|Qovr4IyFGgdl3KCVK(NQIkSrav+f?+X_ zG^^BeEZk739YBa(RChgLBZtvYvKF;1Lg9BMb7Bd*HEPSDL~WX>C1+I%=8+Zw8Ffz$ zx!WIe7Zrw&nM`&QYTONTut9kPo~E+qR+FkuOy&k&Z8>T5a&cCf8P)#UyD5_78!ZdZ zBBX_LkKQDz5*T{Z@4`YzFKHn4NK=KjTH6IyL)B0|cnYWjx6RB{TY7YiwxsIFSBgRY zZjmnw+c(9@k;eXUF1C|wg?hx^Z-Y^6XBiJ=5l$-AH2Ap=-G_<4=>GirA5sS;4`qC>4!VD0sruocfEfADqZ?W delta 266 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 z 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